2.6.6-rc2
--- diff/CREDITS	2004-04-05 12:57:06.000000000 +0100
+++ source/CREDITS	2004-04-21 10:45:33.202655928 +0100
@@ -289,6 +289,15 @@ S: Via Delle Palme, 9
 S: Terni 05100
 S: Italy
 
+N: Krzysztof Benedyczak
+E: golbi@mat.uni.torun.pl
+W: http://www.mat.uni.torun.pl/~golbi
+D: POSIX message queues fs (with M. Wronski)
+S: ul. Podmiejska 52
+S: Radunica
+S: 83-000 Pruszcz Gdanski
+S: Poland
+
 N: Randolph Bentson
 E: bentson@grieg.seaslug.org
 W: http://www.aa.net/~bentson/
@@ -2258,7 +2267,7 @@ S: D-37083 Goettingen
 S: Germany
 
 N: Thomas Molina
-E: tmolina@cox.net
+E: tmolina@cablespeed.com
 D: bug fixes, documentation, minor hackery
 
 N: James Morris
@@ -3485,6 +3494,14 @@ S: 12725 SW Millikan Way, Suite 400
 S: Beaverton, OR 97005
 S: USA
 
+N: Michal Wronski
+E: wrona@mat.uni.torun.pl
+W: http://www.mat.uni.torun.pl/~wrona
+D: POSIX message queues fs (with K. Benedyczak)
+S: ul. Teczowa 23/12
+S: 80-680 Gdansk-Sobieszewo
+S: Poland
+
 N: Frank Xia
 E: qx@math.columbia.edu
 D: Xiafs filesystem [defunct]
--- diff/Documentation/Changes	2004-03-11 10:20:19.000000000 +0000
+++ source/Documentation/Changes	2004-04-21 10:45:33.203655776 +0100
@@ -112,8 +112,8 @@ System utilities
 Architectural changes
 ---------------------
 
-DevFS is now in the kernel.  See Documentation/filesystems/devfs/* in
-the kernel source tree for all the gory details.
+DevFS has been obsoleted in favour of udev
+(http://www.kernel.org/pub/linux/utils/kernel/hotplug/)
 
 32-bit UID support is now in place.  Have fun!
 
@@ -400,8 +400,3 @@ NFS-Utils
 o  <http://nfs.sourceforge.net/>
 
 
-Suggestions and corrections
-===========================
-
-Please feel free to submit changes, corrections, gripes, flames,
-money, etc. to me <chris.ricker@genetics.utah.edu>.  Happy Linuxing!
--- diff/Documentation/CodingStyle	2004-03-11 10:20:19.000000000 +0000
+++ source/Documentation/CodingStyle	2004-04-21 10:45:33.203655776 +0100
@@ -254,6 +254,8 @@ values.  To do the latter, you can stick
   (interactive)
   (c-mode)
   (c-set-style "K&R")
+  (setq tab-width 8)
+  (setq indent-tabs-mode t)
   (setq c-basic-offset 8))
 
 This will define the M-x linux-c-mode command.  When hacking on a
--- diff/Documentation/DMA-mapping.txt	2004-04-05 12:57:06.000000000 +0100
+++ source/Documentation/DMA-mapping.txt	2004-04-21 10:45:33.211654560 +0100
@@ -132,7 +132,7 @@ exactly why.
 The standard 32-bit addressing PCI device would do something like
 this:
 
-	if (pci_set_dma_mask(pdev, 0xffffffff)) {
+	if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
 		printk(KERN_WARNING
 		       "mydev: No suitable DMA available.\n");
 		goto ignore_this_device;
@@ -151,9 +151,9 @@ all 64-bits when accessing streaming DMA
 
 	int using_dac;
 
-	if (!pci_set_dma_mask(pdev, 0xffffffffffffffff)) {
+	if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
 		using_dac = 1;
-	} else if (!pci_set_dma_mask(pdev, 0xffffffff)) {
+	} else if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
 		using_dac = 0;
 	} else {
 		printk(KERN_WARNING
@@ -166,14 +166,14 @@ the case would look like this:
 
 	int using_dac, consistent_using_dac;
 
-	if (!pci_set_dma_mask(pdev, 0xffffffffffffffff)) {
+	if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
 		using_dac = 1;
 	   	consistent_using_dac = 1;
-		pci_set_consistent_dma_mask(pdev, 0xffffffffffffffff)
-	} else if (!pci_set_dma_mask(pdev, 0xffffffff)) {
+		pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
+	} else if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
 		using_dac = 0;
 		consistent_using_dac = 0;
-		pci_set_consistent_dma_mask(pdev, 0xffffffff)
+		pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
 	} else {
 		printk(KERN_WARNING
 		       "mydev: No suitable DMA available.\n");
@@ -215,7 +215,7 @@ most specific mask.
 
 Here is pseudo-code showing how this might be done:
 
-	#define PLAYBACK_ADDRESS_BITS	0xffffffff
+	#define PLAYBACK_ADDRESS_BITS	DMA_32BIT_MASK
 	#define RECORD_ADDRESS_BITS	0x00ffffff
 
 	struct my_sound_card *card;
--- diff/Documentation/DocBook/kernel-hacking.tmpl	2003-09-30 15:46:10.000000000 +0100
+++ source/Documentation/DocBook/kernel-hacking.tmpl	2004-04-21 10:45:33.222652888 +0100
@@ -204,11 +204,11 @@
    </para>
 
    <para>
-    <filename class=headerfile>include/linux/interrupt.h</filename> lists the 
+    <filename class="headerfile">include/linux/interrupt.h</filename> lists the
     different BH's.  No matter how many CPUs you have, no two BHs will run at 
     the same time. This made the transition to SMP simpler, but sucks hard for
     scalable performance.  A very important bottom half is the timer
-    BH (<filename class=headerfile>include/linux/timer.h</filename>): you 
+    BH (<filename class="headerfile">include/linux/timer.h</filename>): you
     can register to have it call functions for you in a given length of time.
    </para>
 
@@ -224,7 +224,7 @@
    </para>
 
    <para>
-    tasklets (<filename class=headerfile>include/linux/interrupt.h</filename>) 
+    tasklets (<filename class="headerfile">include/linux/interrupt.h</filename>)
     are like softirqs, except they are dynamically-registrable (meaning you 
     can have as many as you want), and they also guarantee that any tasklet 
     will only run on one CPU at any time, although different tasklets can 
@@ -241,7 +241,7 @@
    <para>
     You can tell you are in a softirq (or bottom half, or tasklet)
     using the <function>in_softirq()</function> macro 
-    (<filename class=headerfile>include/asm/hardirq.h</filename>).
+    (<filename class="headerfile">include/asm/hardirq.h</filename>).
    </para>
    <caution>
     <para>
@@ -330,7 +330,7 @@ asmlinkage long sys_mycall(int arg)
    You create a character device and implement an appropriate ioctl
    for it.  This is much more flexible than system calls, doesn't have
    to be entered in every architecture's
-   <filename class=headerfile>include/asm/unistd.h</filename> and
+   <filename class="headerfile">include/asm/unistd.h</filename> and
    <filename>arch/kernel/entry.S</filename> file, and is much more
    likely to be accepted by Linus.
   </para>
@@ -343,7 +343,7 @@ asmlinkage long sys_mycall(int arg)
   <para>
    Inside the ioctl you're in user context to a process.  When a
    error occurs you return a negated errno (see
-   <filename class=headerfile>include/linux/errno.h</filename>),
+   <filename class="headerfile">include/linux/errno.h</filename>),
    otherwise you return <returnvalue>0</returnvalue>.
   </para>
 
@@ -429,7 +429,7 @@ cond_resched(); /* Will sleep */ 
   <sect1 id="routines-printk">
    <title>
     <function>printk()</function>
-    <filename class=headerfile>include/linux/kernel.h</filename>
+    <filename class="headerfile">include/linux/kernel.h</filename>
    </title>
 
    <para>
@@ -447,7 +447,7 @@ printk(KERN_INFO "i = %u\n", i);
    </programlisting>
 
    <para>
-    See <filename class=headerfile>include/linux/kernel.h</filename>;
+    See <filename class="headerfile">include/linux/kernel.h</filename>;
     for other KERN_ values; these are interpreted by syslog as the
     level.  Special case: for printing an IP address use
    </para>
@@ -487,7 +487,7 @@ printk(KERN_INFO "my ip: %d.%d.%d.%d\n",
     <function>get_user()</function>
     /
     <function>put_user()</function>
-    <filename class=headerfile>include/asm/uaccess.h</filename>
+    <filename class="headerfile">include/asm/uaccess.h</filename>
    </title>  
 
    <para>
@@ -525,7 +525,7 @@ printk(KERN_INFO "my ip: %d.%d.%d.%d\n",
 
   <sect1 id="routines-kmalloc">
    <title><function>kmalloc()</function>/<function>kfree()</function>
-    <filename class=headerfile>include/linux/slab.h</filename></title>
+    <filename class="headerfile">include/linux/slab.h</filename></title>
 
    <para>
     <emphasis>[MAY SLEEP: SEE BELOW]</emphasis>
@@ -593,10 +593,10 @@ printk(KERN_INFO "my ip: %d.%d.%d.%d\n",
 
    <para>
     If you are allocating at least <constant>PAGE_SIZE</constant>
-    (<filename class=headerfile>include/asm/page.h</filename>) bytes,
+    (<filename class="headerfile">include/asm/page.h</filename>) bytes,
     consider using <function>__get_free_pages()</function>
 
-    (<filename class=headerfile>include/linux/mm.h</filename>).  It
+    (<filename class="headerfile">include/linux/mm.h</filename>).  It
     takes an order argument (0 for page sized, 1 for double page, 2
     for four pages etc.) and the same memory priority flag word as
     above.
@@ -619,13 +619,13 @@ printk(KERN_INFO "my ip: %d.%d.%d.%d\n",
    <para>
     Before inventing your own cache of often-used objects consider
     using a slab cache in
-    <filename class=headerfile>include/linux/slab.h</filename>
+    <filename class="headerfile">include/linux/slab.h</filename>
    </para>
   </sect1>
 
   <sect1 id="routines-current">
    <title><function>current</function>
-    <filename class=headerfile>include/asm/current.h</filename></title>
+    <filename class="headerfile">include/asm/current.h</filename></title>
 
    <para>
     This global variable (really a macro) contains a pointer to
@@ -638,8 +638,8 @@ printk(KERN_INFO "my ip: %d.%d.%d.%d\n",
 
   <sect1 id="routines-udelay">
    <title><function>udelay()</function>/<function>mdelay()</function>
-     <filename class=headerfile>include/asm/delay.h</filename> 
-     <filename class=headerfile>include/linux/delay.h</filename> 
+     <filename class="headerfile">include/asm/delay.h</filename>
+     <filename class="headerfile">include/linux/delay.h</filename>
    </title>
 
    <para>
@@ -652,7 +652,7 @@ printk(KERN_INFO "my ip: %d.%d.%d.%d\n",
  
   <sect1 id="routines-endian">
    <title><function>cpu_to_be32()</function>/<function>be32_to_cpu()</function>/<function>cpu_to_le32()</function>/<function>le32_to_cpu()</function>
-     <filename class=headerfile>include/asm/byteorder.h</filename> 
+     <filename class="headerfile">include/asm/byteorder.h</filename>
    </title>
 
    <para>
@@ -675,7 +675,7 @@ printk(KERN_INFO "my ip: %d.%d.%d.%d\n",
 
   <sect1 id="routines-local-irqs">
    <title><function>local_irq_save()</function>/<function>local_irq_restore()</function>
-    <filename class=headerfile>include/asm/system.h</filename>
+    <filename class="headerfile">include/asm/system.h</filename>
    </title>
 
    <para>
@@ -690,7 +690,7 @@ printk(KERN_INFO "my ip: %d.%d.%d.%d\n",
 
   <sect1 id="routines-softirqs">
    <title><function>local_bh_disable()</function>/<function>local_bh_enable()</function>
-    <filename class=headerfile>include/linux/interrupt.h</filename></title>
+    <filename class="headerfile">include/linux/interrupt.h</filename></title>
 
    <para>
     These routines disable soft interrupts on the local CPU, and
@@ -703,7 +703,7 @@ printk(KERN_INFO "my ip: %d.%d.%d.%d\n",
 
   <sect1 id="routines-processorids">
    <title><function>smp_processor_id</function>()
-    <filename class=headerfile>include/asm/smp.h</filename></title>
+    <filename class="headerfile">include/asm/smp.h</filename></title>
    
    <para>
     <function>smp_processor_id()</function> returns the current
@@ -715,7 +715,7 @@ printk(KERN_INFO "my ip: %d.%d.%d.%d\n",
 
   <sect1 id="routines-init">
    <title><type>__init</type>/<type>__exit</type>/<type>__initdata</type>
-    <filename class=headerfile>include/linux/init.h</filename></title>
+    <filename class="headerfile">include/linux/init.h</filename></title>
 
    <para>
     After boot, the kernel frees up a special section; functions
@@ -738,7 +738,7 @@ printk(KERN_INFO "my ip: %d.%d.%d.%d\n",
 
   <sect1 id="routines-init-again">
    <title><function>__initcall()</function>/<function>module_init()</function>
-    <filename class=headerfile>include/linux/init.h</filename></title>
+    <filename class="headerfile">include/linux/init.h</filename></title>
    <para>
     Many parts of the kernel are well served as a module
     (dynamically-loadable parts of the kernel).  Using the
@@ -768,7 +768,7 @@ printk(KERN_INFO "my ip: %d.%d.%d.%d\n",
   
   <sect1 id="routines-moduleexit">
    <title> <function>module_exit()</function>
-    <filename class=headerfile>include/linux/init.h</filename> </title>
+    <filename class="headerfile">include/linux/init.h</filename> </title>
 
    <para>
     This macro defines the function to be called at module removal
@@ -781,7 +781,7 @@ printk(KERN_INFO "my ip: %d.%d.%d.%d\n",
 
   <sect1 id="routines-module-use-counters">
    <title> <function>MOD_INC_USE_COUNT</function>/<function>MOD_DEC_USE_COUNT</function>
-    <filename class=headerfile>include/linux/module.h</filename></title>
+    <filename class="headerfile">include/linux/module.h</filename></title>
 
    <para>
     These manipulate the module usage count, to protect against
@@ -839,7 +839,7 @@ foo_open (...)
 
  <chapter id="queues">
   <title>Wait Queues
-   <filename class=headerfile>include/linux/wait.h</filename>
+   <filename class="headerfile">include/linux/wait.h</filename>
   </title>
   <para>
    <emphasis>[SLEEPS]</emphasis>
@@ -874,7 +874,7 @@ foo_open (...)
     There is a macro to do this:
     <function>wait_event_interruptible()</function>
 
-    <filename class=headerfile>include/linux/sched.h</filename> The
+    <filename class="headerfile">include/linux/sched.h</filename> The
     first argument is the wait queue head, and the second is an
     expression which is evaluated; the macro returns
     <returnvalue>0</returnvalue> when this expression is true, or
@@ -900,7 +900,7 @@ foo_open (...)
    <para>
     Call <function>wake_up()</function>
 
-    <filename class=headerfile>include/linux/sched.h</filename>;,
+    <filename class="headerfile">include/linux/sched.h</filename>;,
     which will wake up every process in the queue.  The exception is
     if one has <constant>TASK_EXCLUSIVE</constant> set, in which case
     the remainder of the queue will not be woken.
@@ -915,7 +915,7 @@ foo_open (...)
    Certain operations are guaranteed atomic on all platforms.  The
    first class of operations work on <type>atomic_t</type>
 
-   <filename class=headerfile>include/asm/atomic.h</filename>; this
+   <filename class="headerfile">include/asm/atomic.h</filename>; this
    contains a signed integer (at least 24 bits long), and you must use
    these functions to manipulate or read atomic_t variables.
    <function>atomic_read()</function> and
@@ -943,7 +943,7 @@ foo_open (...)
    The second class of atomic operations is atomic bit operations on a
    <type>long</type>, defined in
 
-   <filename class=headerfile>include/asm/bitops.h</filename>.  These
+   <filename class="headerfile">include/asm/bitops.h</filename>.  These
    operations generally take a pointer to the bit pattern, and a bit
    number: 0 is the least significant bit.
    <function>set_bit()</function>, <function>clear_bit()</function>
@@ -982,7 +982,7 @@ foo_open (...)
 
   <sect1 id="sym-exportsymbols">
    <title><function>EXPORT_SYMBOL()</function>
-    <filename class=headerfile>include/linux/module.h</filename></title>
+    <filename class="headerfile">include/linux/module.h</filename></title>
 
    <para>
     This is the classic method of exporting a symbol, and it works
@@ -995,7 +995,7 @@ foo_open (...)
 
   <sect1 id="sym-exportsymbols-gpl">
    <title><function>EXPORT_SYMBOL_GPL()</function>
-    <filename class=headerfile>include/linux/module.h</filename></title>
+    <filename class="headerfile">include/linux/module.h</filename></title>
 
    <para>
     Similar to <function>EXPORT_SYMBOL()</function> except that the
@@ -1012,7 +1012,7 @@ foo_open (...)
 
   <sect1 id="conventions-doublelinkedlist">
    <title>Double-linked lists
-    <filename class=headerfile>include/linux/list.h</filename></title>
+    <filename class="headerfile">include/linux/list.h</filename></title>
 
    <para>
     There are three sets of linked-list routines in the kernel
@@ -1039,7 +1039,7 @@ foo_open (...)
    <para>
     The filesystem code uses <function>ERR_PTR()</function>
 
-    <filename class=headerfile>include/linux/fs.h</filename>; to
+    <filename class="headerfile">include/linux/fs.h</filename>; to
     encode a negative error number into a pointer, and
     <function>IS_ERR()</function> and <function>PTR_ERR()</function>
     to get it back out again: avoids a separate pointer parameter for
--- diff/Documentation/DocBook/kernel-locking.tmpl	2004-02-18 08:54:06.000000000 +0000
+++ source/Documentation/DocBook/kernel-locking.tmpl	2004-04-21 10:45:33.232651368 +0100
@@ -87,7 +87,7 @@
     <table>
      <title>Expected Results</title>
 
-     <tgroup cols=2 align=left>
+     <tgroup cols="2" align="left">
 
       <thead>
        <row>
@@ -133,7 +133,7 @@
     <table>
      <title>Possible Results</title>
 
-     <tgroup cols=2 align=left>
+     <tgroup cols="2" align="left">
       <thead>
        <row>
         <entry>Instance 1</entry>
@@ -222,14 +222,14 @@
    <para>
      There are two main types of kernel locks.  The fundamental type
      is the spinlock 
-     (<filename class=headerfile>include/asm/spinlock.h</filename>), 
+     (<filename class="headerfile">include/asm/spinlock.h</filename>),
      which is a very simple single-holder lock: if you can't get the 
      spinlock, you keep trying (spinning) until you can.  Spinlocks are 
      very small and fast, and can be used anywhere.
    </para>
    <para>
      The second type is a semaphore
-     (<filename class=headerfile>include/asm/semaphore.h</filename>): it
+     (<filename class="headerfile">include/asm/semaphore.h</filename>): it
      can have more than one holder at any time (the number decided at
      initialization time), although it is most commonly used as a
      single-holder lock (a mutex).  If you can't get a semaphore,
@@ -315,7 +315,7 @@
       user context can be interrupted by a softirq, and secondly, the
       critical region could be entered from another CPU.  This is where
       <function>spin_lock_bh()</function> 
-      (<filename class=headerfile>include/linux/spinlock.h</filename>) is 
+      (<filename class="headerfile">include/linux/spinlock.h</filename>) is
       used.  It disables softirqs on that CPU, then grabs the lock.
       <function>spin_unlock_bh()</function> does the reverse.  (The
       '_bh' suffix is a historical reference to "Bottom Halves", the
@@ -333,7 +333,7 @@
       This works perfectly for <firstterm linkend="gloss-up"><acronym>UP
       </acronym></firstterm> as well: the spin lock vanishes, and this macro 
       simply becomes <function>local_bh_disable()</function>
-      (<filename class=headerfile>include/linux/interrupt.h</filename>), which
+      (<filename class="headerfile">include/linux/interrupt.h</filename>), which
       protects you from the softirq being run.
     </para>
    </sect1>
@@ -463,7 +463,7 @@
     <para>
       This works perfectly for UP as well: the spin lock vanishes,
       and this macro simply becomes <function>local_irq_disable()</function>
-      (<filename class=headerfile>include/asm/smp.h</filename>), which 
+      (<filename class="headerfile">include/asm/smp.h</filename>), which
       protects you from the softirq/tasklet/BH being run.
     </para>
 
@@ -545,7 +545,7 @@
    </para>
    <table>
 <title>Table of Locking Requirements</title>
-<TGROUP COLS=11>
+<TGROUP COLS="11">
 <TBODY>
 <ROW>
 <ENTRY></ENTRY>
@@ -1026,7 +1026,7 @@ In practice, <type>atomic_t</type> would
 <structfield>refcnt</structfield>.  There are a number of atomic
 operations defined in
 
-<filename class=headerfile>include/asm/atomic.h</filename>: these are
+<filename class="headerfile">include/asm/atomic.h</filename>: these are
 guaranteed to be seen atomically from all CPUs in the system, so no
 lock is required.  In this case, it is simpler than using spinlocks,
 although for anything non-trivial using spinlocks is clearer.  The
@@ -1296,7 +1296,7 @@ as Alan Cox says, <quote>Lock data, not 
     <table>
      <title>Consequences</title>
 
-     <tgroup cols=2 align=left>
+     <tgroup cols="2" align="left">
 
       <thead>
        <row>
@@ -1437,7 +1437,7 @@ as Alan Cox says, <quote>Lock data, not 
       themselves (by calling <function>add_timer()</function> at the end
       of their timer function).  Because this is a fairly common case
       which is prone to races, you should use <function>del_timer_sync()</function>
-      (<filename class=headerfile>include/linux/timer.h</filename>)
+      (<filename class="headerfile">include/linux/timer.h</filename>)
       to handle this case.  It returns the number of times the timer
       had to be deleted before we finally stopped it from adding itself back
       in.
@@ -1749,7 +1749,7 @@ machines due to caching.
       an exclusive lock.  See <function>DEFINE_PER_CPU()</function>,
       <function>get_cpu_var()</function> and
       <function>put_cpu_var()</function>
-      (<filename class=headerfile>include/linux/percpu.h</filename>).
+      (<filename class="headerfile">include/linux/percpu.h</filename>).
     </para>
 
     <para>
@@ -1757,7 +1757,7 @@ machines due to caching.
       <type>local_t</type> type, and the
       <function>cpu_local_inc()</function> and related functions,
       which are more efficient than simple code on some architectures
-      (<filename class=headerfile>include/asm/local.h</filename>).
+      (<filename class="headerfile">include/asm/local.h</filename>).
     </para>
 
     <para>
--- diff/Documentation/DocBook/lsm.tmpl	2002-11-28 11:30:38.000000000 +0000
+++ source/Documentation/DocBook/lsm.tmpl	2004-04-21 10:45:33.245649392 +0100
@@ -27,7 +27,7 @@
  <address><email>cvance@nai.com</email></address>
  </affiliation>
  </author>
- </authorgroup
+ </authorgroup>
  </artheader>
 
 <sect1><title>Introduction</title>
--- diff/Documentation/DocBook/mousedrivers.tmpl	2002-11-28 11:30:38.000000000 +0000
+++ source/Documentation/DocBook/mousedrivers.tmpl	2004-04-21 10:45:33.254648024 +0100
@@ -88,9 +88,9 @@
     Each read from a bus mouse interface device returns a block of data. 
     The first three bytes of each read are defined as follows: 
 
-   <table frame=all>
+   <table frame="all">
     <title>Mouse Data Encoding</title>
-    <tgroup cols=2 align=left>
+    <tgroup cols="2" align="left">
      <tbody>
       <row>
        <entry>Byte 0</entry>
--- diff/Documentation/DocBook/parportbook.tmpl	2004-04-05 12:57:06.000000000 +0100
+++ source/Documentation/DocBook/parportbook.tmpl	2004-04-21 10:45:33.264646504 +0100
@@ -969,7 +969,7 @@ port->ops->write_data (port, d);
   <para>
    To recap, then:</para>
 
-  <itemizedlist spacing=compact>
+  <itemizedlist spacing="compact">
 
    <listitem>
     <para>
@@ -1387,7 +1387,7 @@ struct parport_operations {
     <filename>/dev/parport0</filename>) allows you to:
    </para>
 
-   <itemizedlist spacing=compact>
+   <itemizedlist spacing="compact">
 
     <listitem>
      <para>
@@ -1614,7 +1614,7 @@ struct parport_operations {
 	<filename>incluce/linux/parport.h</filename> and include:
        </para>
 
-       <itemizedlist spacing=compact>
+       <itemizedlist spacing="compact">
 	<listitem><para>
 	  <constant>IEEE1284_MODE_COMPAT</constant></para></listitem>
 	<listitem><para>
@@ -1713,7 +1713,7 @@ struct parport_operations {
 	affect future I/O operations.  Available flags are:
        </para>
 
-       <itemizedlist spacing=compact>
+       <itemizedlist spacing="compact">
 	<listitem><para>
 	  <constant>PP_FASTWRITE</constant></para></listitem>
 	<listitem><para>
@@ -1759,7 +1759,7 @@ struct parport_operations {
 	<filename>include/linux/parport.h</filename>:
        </para>
 
-       <itemizedlist spacing=compact>
+       <itemizedlist spacing="compact">
 	<listitem><para>
 	  <constant>PARPORT_CONTROL_STROBE</constant></para></listitem>
 	  <listitem><para>
@@ -2729,9 +2729,6 @@ to permit their use in free software.
  </appendix>
 
 </book>
-<!-- Additional function to be documented:
---! Ddrivers/parport/init.c (this file doesn't exist any more)
--->
 <!-- Local Variables: -->
 <!-- sgml-indent-step: 1 -->
 <!-- sgml-indent-data: 1 -->
--- diff/Documentation/DocBook/sis900.tmpl	2003-08-20 14:16:23.000000000 +0100
+++ source/Documentation/DocBook/sis900.tmpl	2004-04-21 10:45:33.265646352 +0100
@@ -336,7 +336,7 @@ Those packages are listed in Document/Ch
 distribution. If you have to install the driver other than those bundled
 in kernel release, you should have your driver file 
 <filename>sis900.c</filename> and <filename>sis900.h</filename> 
-copied into <filename class=directory>/usr/src/linux/drivers/net/</filename> first.
+copied into <filename class="directory">/usr/src/linux/drivers/net/</filename> first.
 There are two alternative ways to install the driver
 </Para>
 
--- diff/Documentation/DocBook/via-audio.tmpl	2002-10-16 04:29:07.000000000 +0100
+++ source/Documentation/DocBook/via-audio.tmpl	2004-04-21 10:45:33.269645744 +0100
@@ -227,7 +227,7 @@
 <sect1 id="version191"><title>
 Version 1.9.1
 </title>
-  <itemizedlist spacing=compact>
+  <itemizedlist spacing="compact">
    <listitem>
     <para>
     DSP read/write bugfixes from Thomas Sailer.
@@ -252,7 +252,7 @@ Version 1.9.1
 <sect1 id="version1115"><title>
 Version 1.1.15
 </title>
-  <itemizedlist spacing=compact>
+  <itemizedlist spacing="compact">
    <listitem>
     <para>
     Support for variable fragment size and variable fragment number (Rui
@@ -325,7 +325,7 @@ Version 1.1.15
 <sect1 id="version1114"><title>
 Version 1.1.14
 </title>
-  <itemizedlist spacing=compact>
+  <itemizedlist spacing="compact">
    <listitem>
     <para>
     Use VM_RESERVE when available, to eliminate unnecessary page faults.
@@ -337,7 +337,7 @@ Version 1.1.14
 <sect1 id="version1112"><title>
 Version 1.1.12
 </title>
-  <itemizedlist spacing=compact>
+  <itemizedlist spacing="compact">
    <listitem>
     <para>
     mmap bug fixes from Linus.
@@ -349,7 +349,7 @@ Version 1.1.12
 <sect1 id="version1111"><title>
 Version 1.1.11
 </title>
-  <itemizedlist spacing=compact>
+  <itemizedlist spacing="compact">
    <listitem>
     <para>
     Many more bug fixes.  mmap enabled by default, but may still be buggy.
@@ -368,7 +368,7 @@ Version 1.1.11
 <sect1 id="version1110"><title>
 Version 1.1.10
 </title>
-  <itemizedlist spacing=compact>
+  <itemizedlist spacing="compact">
    <listitem>
     <para>
     Many bug fixes.  mmap enabled by default, but may still be buggy.
@@ -380,7 +380,7 @@ Version 1.1.10
 <sect1 id="version119"><title>
 Version 1.1.9
 </title>
-  <itemizedlist spacing=compact>
+  <itemizedlist spacing="compact">
    <listitem>
     <para>
     Redesign and rewrite audio playback implementation.  (faster and smaller, hopefully)
@@ -478,7 +478,7 @@ Version 1.1.9
 <sect1 id="version118"><title>
 Version 1.1.8
 </title>
-  <itemizedlist spacing=compact>
+  <itemizedlist spacing="compact">
    <listitem>
     <para>
     	Clean up interrupt handler output.  Fixes the following kernel error message:
@@ -501,7 +501,7 @@ Version 1.1.8
 <sect1 id="version117"><title>
 Version 1.1.7
 </title>
-  <itemizedlist spacing=compact>
+  <itemizedlist spacing="compact">
    <listitem>
     <para>
  Fix module unload bug where mixer device left registered
@@ -514,7 +514,7 @@ Version 1.1.7
 <sect1 id="version116"><title>
 Version 1.1.6
 </title>
-  <itemizedlist spacing=compact>
+  <itemizedlist spacing="compact">
    <listitem>
     <para>
  Rewrite via_set_rate to mimic ALSA basic AC97 rate setting
@@ -546,7 +546,7 @@ Version 1.1.6
 <sect1 id="version115"><title>
 Version 1.1.5
 </title>
-  <itemizedlist spacing=compact>
+  <itemizedlist spacing="compact">
    <listitem>
     <para>
  Disable some overly-verbose debugging code
@@ -573,7 +573,7 @@ Version 1.1.5
 <sect1 id="version114"><title>
 Version 1.1.4
 </title>
-  <itemizedlist spacing=compact>
+  <itemizedlist spacing="compact">
    <listitem>
     <para>
  Completed rewrite of driver.  Eliminated SoundBlaster compatibility
--- diff/Documentation/DocBook/videobook.tmpl	2003-02-26 16:01:06.000000000 +0000
+++ source/Documentation/DocBook/videobook.tmpl	2004-04-21 10:45:33.284643464 +0100
@@ -176,8 +176,8 @@ int __init myradio_init(struct video_ini
   <para>
         The types available are
   </para>
-   <table frame=all><title>Device Types</title>
-   <tgroup cols=3 align=left>
+   <table frame="all"><title>Device Types</title>
+   <tgroup cols="3" align="left">
    <tbody>
    <row>
         <entry>VFL_TYPE_RADIO</><entry>/dev/radio{n}</><entry>
@@ -299,8 +299,8 @@ static int radio_ioctl(struct video_devi
         allows the applications to find out what sort of a card they have found and
         to figure out what they want to do about it. The fields in the structure are
   </para>
-   <table frame=all><title>struct video_capability fields</title>
-   <tgroup cols=2 align=left>
+   <table frame="all"><title>struct video_capability fields</title>
+   <tgroup cols="2" align="left">
    <tbody>
    <row>
         <entry>name</><entry>The device text name. This is intended for the user.</>
@@ -373,8 +373,8 @@ static int radio_ioctl(struct video_devi
   <para>
         The video_tuner structure has the following fields
   </para>
-   <table frame=all><title>struct video_tuner fields</title>
-   <tgroup cols=2 align=left>
+   <table frame="all"><title>struct video_tuner fields</title>
+   <tgroup cols="2" align="left">
    <tbody>
    <row>
         <entry>int tuner</><entry>The number of the tuner in question</entry>
@@ -406,8 +406,8 @@ static int radio_ioctl(struct video_devi
     </tgroup>
     </table>
 
-   <table frame=all><title>struct video_tuner flags</title>
-   <tgroup cols=2 align=left>
+   <table frame="all"><title>struct video_tuner flags</title>
+   <tgroup cols="2" align="left">
    <tbody>
    <row>
 	<entry>VIDEO_TUNER_PAL</><entry>A PAL TV tuner</entry>
@@ -429,8 +429,8 @@ static int radio_ioctl(struct video_devi
     </tgroup>
     </table>
 
-   <table frame=all><title>struct video_tuner modes</title>
-   <tgroup cols=2 align=left>
+   <table frame="all"><title>struct video_tuner modes</title>
+   <tgroup cols="2" align="left">
    <tbody>
    <row>
                 <entry>VIDEO_MODE_PAL</><entry>PAL Format</entry>
@@ -580,8 +580,8 @@ static int current_volume=0;
   <para>
         Then we fill in the video_audio structure. This has the following format
   </para>
-   <table frame=all><title>struct video_audio fields</title>
-   <tgroup cols=2 align=left>
+   <table frame="all"><title>struct video_audio fields</title>
+   <tgroup cols="2" align="left">
    <tbody>
    <row>
    <entry>audio</><entry>The input the user wishes to query</>
@@ -615,8 +615,8 @@ static int current_volume=0;
    </tgroup>
    </table>
 
-   <table frame=all><title>struct video_audio flags</title>
-   <tgroup cols=2 align=left>
+   <table frame="all"><title>struct video_audio flags</title>
+   <tgroup cols="2" align="left">
    <tbody>
    <row>
                 <entry>VIDEO_AUDIO_MUTE</><entry>The audio is currently muted. We
@@ -633,8 +633,8 @@ static int current_volume=0;
    </tgroup>
    </table>
 
-   <table frame=all><title>struct video_audio modes</title>
-   <tgroup cols=2 align=left>
+   <table frame="all"><title>struct video_audio modes</title>
+   <tgroup cols="2" align="left">
    <tbody>
    <row>
                 <entry>VIDEO_SOUND_MONO</><entry>Mono sound</entry>
@@ -862,8 +862,8 @@ static struct video_device my_camera
         We use the extra video capability flags that did not apply to the
         radio interface. The video related flags are
   </para>
-   <table frame=all><title>Capture Capabilities</title>
-   <tgroup cols=2 align=left>
+   <table frame="all"><title>Capture Capabilities</title>
+   <tgroup cols="2" align="left">
    <tbody>
    <row>
 <entry>VID_TYPE_CAPTURE</><entry>We support image capture</>
@@ -1204,8 +1204,8 @@ static int camera_ioctl(struct video_dev
         inputs to the video card). Our example card has a single camera input. The
         fields in the structure are
   </para>
-   <table frame=all><title>struct video_channel fields</title>
-   <tgroup cols=2 align=left>
+   <table frame="all"><title>struct video_channel fields</title>
+   <tgroup cols="2" align="left">
    <tbody>
    <row>
 
@@ -1227,8 +1227,8 @@ static int camera_ioctl(struct video_dev
     </tbody>
     </tgroup>
     </table>
-    <table frame=all><title>struct video_channel flags</title>
-    <tgroup cols=2 align=left>
+    <table frame="all"><title>struct video_channel flags</title>
+    <tgroup cols="2" align="left">
     <tbody>
     <row>
         <entry>VIDEO_VC_TUNER</><entry>Channel has a tuner.</entry>
@@ -1238,8 +1238,8 @@ static int camera_ioctl(struct video_dev
     </tbody>
     </tgroup>
     </table>
-    <table frame=all><title>struct video_channel types</title>
-    <tgroup cols=2 align=left>
+    <table frame="all"><title>struct video_channel types</title>
+    <tgroup cols="2" align="left">
     <tbody>
     <row>
         <entry>VIDEO_TYPE_TV</><entry>Television input.</entry>
@@ -1251,8 +1251,8 @@ static int camera_ioctl(struct video_dev
     </tbody>
     </tgroup>
     </table>
-    <table frame=all><title>struct video_channel norms</title>
-    <tgroup cols=2 align=left>
+    <table frame="all"><title>struct video_channel norms</title>
+    <tgroup cols="2" align="left">
     <tbody>
     <row>
         <entry>VIDEO_MODE_PAL</><entry>PAL encoded Television</entry>
@@ -1337,8 +1337,8 @@ static int camera_ioctl(struct video_dev
         for every other pixel in the image. The other common formats the interface 
         defines are
   </para>
-   <table frame=all><title>Framebuffer Encodings</title>
-   <tgroup cols=2 align=left>
+   <table frame="all"><title>Framebuffer Encodings</title>
+   <tgroup cols="2" align="left">
    <tbody>
    <row>
    <entry>GREY</><entry>Linear greyscale. This is for simple cameras and the
@@ -1475,8 +1475,8 @@ static struct video_buffer capture_fb;
         display. The video_window structure is used to describe the way the image 
         should be displayed. 
    </para>
-   <table frame=all><title>struct video_window fields</title>
-   <tgroup cols=2 align=left>
+   <table frame="all"><title>struct video_window fields</title>
+   <tgroup cols="2" align="left">
    <tbody>
    <row>
         <entry>width</><entry>The width in pixels of the desired image. The card
@@ -1512,8 +1512,8 @@ static struct video_buffer capture_fb;
     <para>
         Each clip is a struct video_clip which has the following fields
    </para>
-   <table frame=all><title>video_clip fields</title>
-   <tgroup cols=2 align=left>
+   <table frame="all"><title>video_clip fields</title>
+   <tgroup cols="2" align="left">
    <tbody>
    <row>
         <entry>x, y</><entry>Co-ordinates relative to the display</>
--- diff/Documentation/IPMI.txt	2003-05-21 11:49:59.000000000 +0100
+++ source/Documentation/IPMI.txt	2004-04-21 10:45:33.295641792 +0100
@@ -22,6 +22,58 @@ are not familiar with IPMI itself, see t
 http://www.intel.com/design/servers/ipmi/index.htm.  IPMI is a big
 subject and I can't cover it all here!
 
+Configuration
+-------------
+
+The LinuxIPMI driver is modular, which means you have to pick several
+things to have it work right depending on your hardware.  Most of
+these are available in the 'Character Devices' menu.
+
+No matter what, you must pick 'IPMI top-level message handler' to use
+IPMI.  What you do beyond that depends on your needs and hardware.
+
+The message handler does not provide any user-level interfaces.
+Kernel code (like the watchdog) can still use it.  If you need access
+from userland, you need to select 'Device interface for IPMI' if you
+want access through a device driver.  Another interface is also
+available, you may select 'IPMI sockets' in the 'Networking Support'
+main menu.  This provides a socket interface to IPMI.  You may select
+both of these at the same time, they will both work together.
+
+The driver interface depends on your hardware.  If you have a board
+with a standard interface (These will generally be either "KCS",
+"SMIC", or "BT", consult your hardware manual), choose the 'IPMI SI
+handler' option.  A driver also exists for direct I2C access to the
+IPMI management controller.  Some boards support this, but it is
+unknown if it will work on every board.  For this, choose 'IPMI SMBus
+handler', but be ready to try to do some figuring to see if it will
+work.
+
+There is also a KCS-only driver interface supplied, but it is
+depracated in favor of the SI interface.
+
+You should generally enable ACPI on your system, as systems with IPMI
+should have ACPI tables describing them.
+
+If you have a standard interface and the board manufacturer has done
+their job correctly, the IPMI controller should be automatically
+detect (via ACPI or SMBIOS tables) and should just work.  Sadly, many
+boards do not have this information.  The driver attempts standard
+defaults, but they may not work.  If you fall into this situation, you
+need to read the section below named 'The SI Driver' on how to
+hand-configure your system.
+
+IPMI defines a standard watchdog timer.  You can enable this with the
+'IPMI Watchdog Timer' config option.  If you compile the driver into
+the kernel, then via a kernel command-line option you can have the
+watchdog timer start as soon as it intitializes.  It also have a lot
+of other options, see the 'Watchdog' section below for more details.
+Note that you can also have the watchdog continue to run if it is
+closed (by default it is disabled on close).  Go into the 'Watchdog
+Cards' menu, enable 'Watchdog Timer Support', and enable the option
+'Disable watchdog shutdown on close'.
+
+
 Basic Design
 ------------
 
@@ -41,18 +93,30 @@ ipmi_devintf - This provides a userland 
 driver, each open file for this device ties in to the message handler
 as an IPMI user.
 
-ipmi_kcs_drv - A driver for the KCS SMI.  Most system have a KCS
-interface for IPMI.
+ipmi_si - A driver for various system interfaces.  This supports
+KCS, SMIC, and may support BT in the future.  Unless you have your own
+custom interface, you probably need to use this.
+
+ipmi_smb - A driver for accessing BMCs on the SMBus. It uses the
+I2C kernel driver's SMBus interfaces to send and receive IPMI messages
+over the SMBus.
 
+af_ipmi - A network socket interface to IPMI.  This doesn't take up
+a character device in your system.
+
+Note that the KCS-only interface ahs been removed.
 
 Much documentation for the interface is in the include files.  The
 IPMI include files are:
 
-ipmi.h - Contains the user interface and IOCTL interface for IPMI.
+net/af_ipmi.h - Contains the socket interface.
+
+linux/ipmi.h - Contains the user interface and IOCTL interface for IPMI.
 
-ipmi_smi.h - Contains the interface for SMI drivers to use.
+linux/ipmi_smi.h - Contains the interface for system management interfaces
+(things that interface to IPMI controllers) to use.
 
-ipmi_msgdefs.h - General definitions for base IPMI messaging.
+linux/ipmi_msgdefs.h - General definitions for base IPMI messaging.
 
 
 Addressing
@@ -260,70 +324,131 @@ they register with the message handler. 
 in the order they register, although if an SMI unregisters and then
 another one registers, all bets are off.
 
-The ipmi_smi.h defines the interface for SMIs, see that for more
-details.
+The ipmi_smi.h defines the interface for management interfaces, see
+that for more details.
 
 
-The KCS Driver
---------------
+The SI Driver
+-------------
 
-The KCS driver allows up to 4 KCS interfaces to be configured in the
-system.  By default, the driver will register one KCS interface at the
-spec-specified I/O port 0xca2 without interrupts.  You can change this
-at module load time (for a module) with:
+The SI driver allows up to 4 KCS or SMIC interfaces to be configured
+in the system.  By default, scan the ACPI tables for interfaces, and
+if it doesn't find any the driver will attempt to register one KCS
+interface at the spec-specified I/O port 0xca2 without interrupts.
+You can change this at module load time (for a module) with:
 
-  insmod ipmi_kcs_drv.o kcs_ports=<port1>,<port2>... kcs_addrs=<addr1>,<addr2>
-       kcs_irqs=<irq1>,<irq2>... kcs_trydefaults=[0|1]
+  modprobe ipmi_si.o type=<type1>,<type2>....
+       ports=<port1>,<port2>... addrs=<addr1>,<addr2>...
+       irqs=<irq1>,<irq2>... trydefaults=[0|1]
 
-The KCS driver supports two types of interfaces, ports (for I/O port
-based KCS interfaces) and memory addresses (for KCS interfaces in
-memory).  The driver will support both of them simultaneously, setting
-the port to zero (or just not specifying it) will allow the memory
-address to be used.  The port will override the memory address if it
-is specified and non-zero.  kcs_trydefaults sets whether the standard
-IPMI interface at 0xca2 and any interfaces specified by ACPE are
-tried.  By default, the driver tries it, set this value to zero to
-turn this off.
+Each of these except si_trydefaults is a list, the first item for the
+first interface, second item for the second interface, etc.
+
+The si_type may be either "kcs", "smic", or "bt".  If you leave it blank, it
+defaults to "kcs".
+
+If you specify si_addrs as non-zero for an interface, the driver will
+use the memory address given as the address of the device.  This
+overrides si_ports.
+
+If you specify si_ports as non-zero for an interface, the driver will
+use the I/O port given as the device address.
+
+If you specify si_irqs as non-zero for an interface, the driver will
+attempt to use the given interrupt for the device.
+
+si_trydefaults sets whether the standard IPMI interface at 0xca2 and
+any interfaces specified by ACPE are tried.  By default, the driver
+tries it, set this value to zero to turn this off.
 
 When compiled into the kernel, the addresses can be specified on the
 kernel command line as:
 
-  ipmi_kcs=<bmc1>:<irq1>,<bmc2>:<irq2>....,[nodefault]
-
-The <bmcx> values is either "p<port>" or "m<addr>" for port or memory
-addresses.  So for instance, a KCS interface at port 0xca2 using
-interrupt 9 and a memory interface at address 0xf9827341 with no
-interrupt would be specified "ipmi_kcs=p0xca2:9,m0xf9827341".
-If you specify zero for in irq or don't specify it, the driver will
-run polled unless the software can detect the interrupt to use in the
-ACPI tables.
-
-By default, the driver will attempt to detect a KCS device at the
-spec-specified 0xca2 address and any address specified by ACPI.  If
-you want to turn this off, use the "nodefault" option.
+  ipmi_si.type=<type1>,<type2>...
+       ipmi_si.ports=<port1>,<port2>... ipmi_si.addrs=<addr1>,<addr2>...
+       ipmi_si.irqs=<irq1>,<irq2>... ipmi_si.trydefaults=[0|1]
+
+It works the same as the module parameters of the same names.
+
+By default, the driver will attempt to detect any device specified by
+ACPI, and if none of those then a KCS device at the spec-specified
+0xca2.  If you want to turn this off, set the "trydefaults" option to
+false.
 
 If you have high-res timers compiled into the kernel, the driver will
 use them to provide much better performance.  Note that if you do not
 have high-res timers enabled in the kernel and you don't have
 interrupts enabled, the driver will run VERY slowly.  Don't blame me,
-the KCS interface sucks.
+these interfaces suck.
+
+
+The SMBus Driver
+----------------
+
+The SMBus driver allows up to 4 SMBus devices to be configured in the
+system.  By default, the driver will register any SMBus interfaces it finds
+in the I2C address range of 0x20 to 0x4f on any adapter.  You can change this
+at module load time (for a module) with:
+
+  modprobe ipmi_smb.o
+	addr=<adapter1>,<i2caddr1>[,<adapter2>,<i2caddr2>[,...]]
+	dbg=<flags1>,<flags2>...
+	[defaultprobe=0] [dbg_probe=1]
+
+The addresses are specified in pairs, the first is the adapter ID and the
+second is the I2C address on that adapter.
+
+The debug flags are bit flags for each BMC found, they are:
+IPMI messages: 1, driver state: 2, timing: 4, I2C probe: 8
+
+Setting smb_defaultprobe to zero disabled the default probing of SMBus
+interfaces at address range 0x20 to 0x4f.  This means that only the
+BMCs specified on the smb_addr line will be detected.
+
+Setting smb_dbg_probe to 1 will enable debugging of the probing and
+detection process for BMCs on the SMBusses.
+
+Discovering the IPMI compilant BMC on the SMBus can cause devices
+on the I2C bus to fail. The SMBus driver writes a "Get Device ID" IPMI
+message as a block write to the I2C bus and waits for a response.
+This action can be detrimental to some I2C devices. It is highly recommended
+that the known I2c address be given to the SMBus driver in the smb_addr
+parameter. The default adrress range will not be used when a smb_addr
+parameter is provided.
+
+When compiled into the kernel, the addresses can be specified on the
+kernel command line as:
+
+  ipmb_smb.addr=<adapter1>,<i2caddr1>[,<adapter2>,<i2caddr2>[,...]]
+	ipmi_smb.dbg=<flags1>,<flags2>...
+	ipmi_smb.defaultprobe=0 ipmi_smb.dbg_probe=1
+
+These are the same options as on the module command line.
+
+Note that you might need some I2C changes if CONFIG_IPMI_PANIC_EVENT
+is enabled along with this, so the I2C driver knows to run to
+completion during sending a panic event.
 
 
 Other Pieces
 ------------
 
 Watchdog
+--------
 
 A watchdog timer is provided that implements the Linux-standard
 watchdog timer interface.  It has three module parameters that can be
 used to control it:
 
-  insmod ipmi_watchdog timeout=<t> pretimeout=<t> action=<action type>
-      preaction=<preaction type> preop=<preop type>
+  modprobe ipmi_watchdog timeout=<t> pretimeout=<t> action=<action type>
+      preaction=<preaction type> preop=<preop type> start_now=x
 
 The timeout is the number of seconds to the action, and the pretimeout
 is the amount of seconds before the reset that the pre-timeout panic will
-occur (if pretimeout is zero, then pretimeout will not be enabled).
+occur (if pretimeout is zero, then pretimeout will not be enabled).  Note
+that the pretimeout is the time before the final timeout.  So if the
+timeout is 50 seconds and the pretimeout is 10 seconds, then the pretimeout
+will occur in 40 second (10 seconds before the timeout).
 
 The action may be "reset", "power_cycle", or "power_off", and
 specifies what to do when the timer times out, and defaults to
@@ -344,16 +469,19 @@ When preop is set to "preop_give_data", 
 on the device when the pretimeout occurs.  Select and fasync work on
 the device, as well.
 
+If start_now is set to 1, the watchdog timer will start running as
+soon as the driver is loaded.
+
 When compiled into the kernel, the kernel command line is available
 for configuring the watchdog:
 
-  ipmi_wdog=<timeout>[,<pretimeout>[,<option>[,<options>....]]]
+  ipmi_watchdog.timeout=<t> ipmi_watchdog.pretimeout=<t>
+	ipmi_watchdog.action=<action type>
+	ipmi_watchdog.preaction=<preaction type>
+	ipmi_watchdog.preop=<preop type>
+	ipmi_watchdog.start_now=x
 
-The options are the actions and preaction above (if an option
-controlling the same thing is specified twice, the last is taken).  An
-options "start_now" is also there, if included, the watchdog will
-start running immediately when all the drivers are ready, it doesn't
-have to have a user hooked up to start it.
+The options are the same as the module parameter options.
 
 The watchdog will panic and start a 120 second reset timeout if it
 gets a pre-action.  During a panic or a reboot, the watchdog will
--- diff/Documentation/SubmittingPatches	2004-02-18 08:54:06.000000000 +0000
+++ source/Documentation/SubmittingPatches	2004-04-21 10:45:33.306640120 +0100
@@ -134,6 +134,21 @@ your change.
 Even if the maintainer did not respond in step #4, make sure to ALWAYS
 copy the maintainer when you change their code.
 
+For small patches you may want to CC the Trivial Patch Monkey
+trivial@rustcorp.com.au set up by Rusty Russell; which collects "trivial"
+patches. Trivial patches must qualify for one of the following rules:
+ Spelling fixes in documentation
+ Spelling fixes which could break grep(1).
+ Warning fixes (cluttering with useless warnings is bad)
+ Compilation fixes (only if they are actually correct)
+ Runtime fixes (only if they actually fix things)
+ Removing use of deprecated functions/macros (eg. check_region).
+ Contact detail and documentation fixes
+ Non-portable code replaced by portable code (even in arch-specific,
+ since people copy, as long as it's trivial)
+ Any fix by the author/maintainer of the file. (ie. patch monkey
+ in re-transmission mode)
+
 
 
 6) No MIME, no links, no compression, no attachments.  Just plain text.
--- diff/Documentation/early-userspace/README	2003-08-26 10:00:51.000000000 +0100
+++ source/Documentation/early-userspace/README	2004-04-21 10:45:33.306640120 +0100
@@ -71,5 +71,31 @@ custom initramfs images that meet your n
 For questions and help, you can sign up for the early userspace
 mailing list at http://www.zytor.com/mailman/listinfo/klibc
 
+How does it work?
+=================
+
+The kernel has currently 3 ways to mount the root filesystem:
+
+a) all required device and filesystem drivers compiled into the kernel, no
+   initrd.  init/main.c:init() will call prepare_namespace() to mount the
+   final root filesystem, based on the root= option and optional init= to run
+   some other init binary than listed at the end of init/main.c:init().
+
+b) some device and filesystem drivers built as modules and stored in an
+   initrd.  The initrd must contain a binary '/linuxrc' which is supposed to
+   load these driver modules.  It is also possible to mount the final root
+   filesystem via linuxrc and use the pivot_root syscall.  The initrd is
+   mounted and executed via prepare_namespace().
+
+c) using initramfs.  The call to prepare_namespace() must be skipped.
+   This means that a binary must do all the work.  Said binary can be stored
+   into initramfs either via modifying usr/gen_init_cpio.c or via the new
+   initrd format, an cpio archive.  It must be called "/init".  This binary
+   is responsible to do all the things prepare_namespace() would do.
+
+   To remain backwards compatibility, the /init binary will only run if it
+   comes via an initramfs cpio archive.  If this is not the case,
+   init/main.c:init() will run prepare_namespace() to mount the final root
+   and exec one of the predefined init binaries.
 
 Bryan O'Sullivan <bos@serpentine.com>
--- diff/Documentation/filesystems/proc.txt	2004-03-11 10:20:19.000000000 +0000
+++ source/Documentation/filesystems/proc.txt	2004-04-21 10:45:33.307639968 +0100
@@ -38,6 +38,7 @@ Table of Contents
   2.8	/proc/sys/net/ipv4 - IPV4 settings
   2.9	Appletalk
   2.10	IPX
+  2.11	/proc/sys/fs/mqueue - POSIX message queues filesystem
 
 ------------------------------------------------------------------------------
 Preface
@@ -1814,6 +1815,30 @@ The /proc/net/ipx_route  table  holds  a
 gives the  destination  network, the router node (or Directly) and the network
 address of the router (or Connected) for internal networks.
 
+2.11 /proc/sys/fs/mqueue - POSIX message queues filesystem
+----------------------------------------------------------
+
+The "mqueue"  filesystem provides  the necessary kernel features to enable the
+creation of a  user space  library that  implements  the  POSIX message queues
+API (as noted by the  MSG tag in the  POSIX 1003.1-2001 version  of the System
+Interfaces specification.)
+
+The "mqueue" filesystem contains values for determining/setting  the amount of
+resources used by the file system.
+
+/proc/sys/fs/mqueue/queues_max is a read/write  file for  setting/getting  the
+maximum number of message queues allowed on the system.
+
+/proc/sys/fs/mqueue/msg_max  is  a  read/write file  for  setting/getting  the
+maximum number of messages in a queue value.  In fact it is the limiting value
+for another (user) limit which is set in mq_open invocation. This attribute of
+a queue must be less or equal then msg_max.
+
+/proc/sys/fs/mqueue/msgsize_max is  a read/write  file for setting/getting the
+maximum  message size value (it is every  message queue's attribute set during
+its creation).
+
+
 ------------------------------------------------------------------------------
 Summary
 ------------------------------------------------------------------------------
--- diff/Documentation/firmware_class/README	2003-08-26 10:00:51.000000000 +0100
+++ source/Documentation/firmware_class/README	2004-04-21 10:45:33.308639816 +0100
@@ -60,9 +60,9 @@
 
 	HOTPLUG_FW_DIR=/usr/lib/hotplug/firmware/
 
-	echo 1 > /sysfs/$DEVPATH/loading
+	echo 1 > /sys/$DEVPATH/loading
 	cat $HOTPLUG_FW_DIR/$FIRMWARE > /sysfs/$DEVPATH/data
-	echo 0 > /sysfs/$DEVPATH/loading
+	echo 0 > /sys/$DEVPATH/loading
 
  Random notes:
  ============
--- diff/Documentation/firmware_class/hotplug-script	2003-06-30 10:07:32.000000000 +0100
+++ source/Documentation/firmware_class/hotplug-script	2004-04-21 10:45:33.308639816 +0100
@@ -6,9 +6,9 @@
 
 HOTPLUG_FW_DIR=/usr/lib/hotplug/firmware/
 
-echo 1 > /sysfs/$DEVPATH/loading
+echo 1 > /sys/$DEVPATH/loading
 cat $HOTPLUG_FW_DIR/$FIRMWARE > /sysfs/$DEVPATH/data
-echo 0 > /sysfs/$DEVPATH/loading
+echo 0 > /sys/$DEVPATH/loading
 
 # To cancel the load in case of error:
 #
--- diff/Documentation/i2c/porting-clients	2004-01-19 10:22:54.000000000 +0000
+++ source/Documentation/i2c/porting-clients	2004-04-21 10:45:33.309639664 +0100
@@ -1,4 +1,4 @@
-Revision 3, 2003-10-04
+Revision 4, 2004-03-30
 Jean Delvare <khali@linux-fr.org>
 Greg KH <greg@kroah.com>
 
@@ -24,9 +24,10 @@ Technical changes:
   #include <linux/slab.h>
   #include <linux/i2c.h>
   #include <linux/i2c-sensor.h>
-  #include <linux/i2c-vid.h>     /* if you need VRM support */
-  #include <asm/io.h>            /* if you have I/O operations */
-  Some extra headers may be required for a given driver.
+  #include <linux/i2c-vid.h>	/* if you need VRM support */
+  #include <asm/io.h>		/* if you have I/O operations */
+  Please respect this inclusion order. Some extra headers may be
+  required for a given driver (e.g. "lm75.h").
 
 * [Addresses] SENSORS_I2C_END becomes I2C_CLIENT_END, SENSORS_ISA_END
   becomes I2C_CLIENT_ISA_END.
@@ -37,9 +38,9 @@ Technical changes:
   names for sysfs files (see the Sysctl section below).
 
 * [Function prototypes] The detect functions loses its flags
-  parameter. Sysctl (e.g. lm75_temp) and miscellaneous (e.g.
-  swap_bytes) functions are off the list of prototypes. This
-  usually leaves five prototypes:
+  parameter. Sysctl (e.g. lm75_temp) and miscellaneous functions
+  are off the list of prototypes. This usually leaves five
+  prototypes:
   static int lm75_attach_adapter(struct i2c_adapter *adapter);
   static int lm75_detect(struct i2c_adapter *adapter, int address,
       int kind);
@@ -70,13 +71,14 @@ Technical changes:
 * [Detect] As mentioned earlier, the flags parameter is gone.
   The type_name and client_name strings are replaced by a single
   name string, which will be filled with a lowercase, short string
-  (typically the driver name, e.g. "lm75"). The errorN labels are
-  reduced to the number needed. If that number is 2 (i2c-only
-  drivers), it is advised that the labels are named exit and
-  exit_free. For i2c+isa drivers, labels should be named ERROR0,
-  ERROR1 and ERROR2. Don't forget to properly set err before
-  jumping to error labels. By the way, labels should be
-  left-aligned.
+  (typically the driver name, e.g. "lm75").
+  In i2c-only drivers, drop the i2c_is_isa_adapter check, it's
+  useless.
+  The errorN labels are reduced to the number needed. If that number
+  is 2 (i2c-only drivers), it is advised that the labels are named
+  exit and exit_free. For i2c+isa drivers, labels should be named
+  ERROR0, ERROR1 and ERROR2. Don't forget to properly set err before
+  jumping to error labels. By the way, labels should be left-aligned.
   Use memset to fill the client and data area with 0x00.
   Use i2c_set_clientdata to set the client data (as opposed to
   a direct access to client->data).
@@ -85,6 +87,11 @@ Technical changes:
   device_create_file. Move the driver initialization before any
   sysfs file creation.
 
+* [Init] Limits must not be set by the driver (can be done later in
+  user-space). Chip should not be reset default (although a module
+  parameter may be used to force is), and initialization should be
+  limited to the strictly necessary steps.
+
 * [Detach] Get rid of data, remove the call to
   i2c_deregister_entry.
 
@@ -92,7 +99,8 @@ Technical changes:
   i2c_get_clientdata(client) instead.
 
 * [Interface] Init function should not print anything. Make sure
-  there is a MODULE_LICENSE() line.
+  there is a MODULE_LICENSE() line, at the bottom of the file
+  (after MODULE_AUTHOR() and MODULE_DESCRIPTION(), in this order).
 
 Coding policy:
 
@@ -102,8 +110,7 @@ Coding policy:
   can. Calls to printk/pr_debug for debugging purposes are replaced
   by calls to dev_dbg. Here is an example on how to call it (taken
   from lm75_detect):
-  dev_dbg(&adapter->dev,
-          "lm75_detect called for an ISA bus adapter?!?\n");
+  dev_dbg(&client->dev, "Starting lm75 update\n");
   Replace other printk calls with the dev_info, dev_err or dev_warn
   function, as appropriate.
 
@@ -119,3 +126,8 @@ Coding policy:
 * [Layout] Avoid extra empty lines between comments and what they
   comment. Respect the coding style (see Documentation/CodingStyle),
   in particular when it comes to placing curly braces.
+
+* [Comments] Make sure that no comment refers to a file that isn't
+  part of the Linux source tree (typically doc/chips/<chip name>),
+  and that remaining comments still match the code. Merging comment
+  lines when possible is encouraged.
--- diff/Documentation/i2c/sysfs-interface	2004-04-05 12:57:06.000000000 +0100
+++ source/Documentation/i2c/sysfs-interface	2004-04-21 10:45:33.309639664 +0100
@@ -74,18 +74,15 @@ to cause an alarm) is chip-dependent.
 ************
 
 in[0-8]_min	Voltage min value.
-		Fixed point value in form XXXX.  Divide by 1000 to get
-		Volts.
+		Unit: millivolt
 		Read/Write
 		
 in[0-8]_max	Voltage max value.
-		Fixed point value in form XXXX.  Divide by 1000 to get
-		Volts.
+		Unit: millivolt
 		Read/Write
 		
 in[0-8]_input	Voltage input value.
-		Fixed point value in form XXXX.  Divide by 1000 to get
-		Volts.
+		Unit: millivolt
 		Read only
 		Actual voltage depends on the scaling resistors on the
 		motherboard, as recommended in the chip datasheet.
@@ -95,10 +92,10 @@ in[0-8]_input	Voltage input value.
 		However, some drivers (notably lm87 and via686a)
 		do scale, with various degrees of success.
 		These drivers will output the actual voltage.
-		First two values are read/write and third is read only.
+
 		Typical usage:
 			in0_*	CPU #1 voltage (not scaled)
-			in1_*	CPU #1 voltage (not scaled)
+			in1_*	CPU #2 voltage (not scaled)
 			in2_*	3.3V nominal (not scaled)
 			in3_*	5.0V nominal (scaled)
 			in4_*	12.0V nominal (scaled)
@@ -108,17 +105,16 @@ in[0-8]_input	Voltage input value.
 			in8_*	varies
 
 in0_ref		CPU core reference voltage.
+		Unit: millivolt
 		Read only.
-		Fixed point value in form XXXX corresponding to CPU core
-		voltage as told to the sensor chip.  Divide by 1000 to
-		get Volts.  Not always correct.
+		Not always correct.
 
 vrm		Voltage Regulator Module version number. 
 		Read only.
-		Two digit number (XX), first is major version, second is
+		Two digit number, first is major version, second is
 		minor version.
-		Affects the way the driver calculates the core voltage from
-		the vid pins. See doc/vid for details.
+		Affects the way the driver calculates the CPU core reference
+		voltage from the vid pins.
 
 
 ********
@@ -126,23 +122,23 @@ vrm		Voltage Regulator Module version nu
 ********
 
 fan[1-3]_min	Fan minimum value
-		Integer value indicating RPM
+		Unit: revolution/min (RPM)
 		Read/Write.
 
 fan[1-3]_input	Fan input value.
-		Integer value indicating RPM
+		Unit: revolution/min (RPM)
 		Read only.
 
 fan[1-3]_div	Fan divisor.
-		Integers in powers of two (1,2,4,8,16,32,64,128).
-		Some chips only support values 1,2,4,8.
-		See doc/fan-divisors for details.
+		Integer value in powers of two (1, 2, 4, 8, 16, 32, 64, 128).
+		Some chips only support values 1, 2, 4 and 8.
+		Note that this is actually an internal clock divisor, which
+		affects the measurable speed range, not the read value.
 
 fan[1-3]_pwm	Pulse width modulation fan control.
-		Integer 0 - 255
+		Integer value in the range 0 to 255
 		Read/Write
 		255 is max or 100%.
-		Corresponds to the fans 1-3.
 
 fan[1-3]_pwm_enable
 		Switch PWM on and off.
@@ -157,46 +153,46 @@ fan[1-3]_pwm_enable
 ****************
 
 temp[1-3]_type	Sensor type selection.
-		Integers 1,2,3, or thermistor Beta value (3435)
+		Integers 1, 2, 3 or thermistor Beta value (3435)
 		Read/Write.
+		1: PII/Celeron Diode
+		2: 3904 transistor
+		3: thermal diode
+		Not all types are supported by all chips
 
 temp[1-4]_max	Temperature max value.
-		Fixed point value in form XXXXX and should be divided by
-		1000 to get degrees Celsius.
+		Unit: millidegree Celcius
 		Read/Write value.
 
 temp[1-3]_min	Temperature min value.
-		Fixed point value in form XXXXX and should be divided by
-		1000 to get degrees Celsius.
+		Unit: millidegree Celcius
 		Read/Write value.
 
 temp[1-3]_max_hyst
 		Temperature hysteresis value for max limit.
-		Fixed point value in form XXXXX and should be divided by
-		1000 to get degrees Celsius.  Must be reported as an
-		absolute temperature, NOT a delta from the max value.
+		Unit: millidegree Celcius
+		Must be reported as an absolute temperature, NOT a delta
+		from the max value.
 		Read/Write value.
 
 temp[1-4]_input Temperature input value.
-		Fixed point value in form XXXXX and should be divided by
-		1000 to get degrees Celsius.
+		Unit: millidegree Celcius
 		Read only value.
 
 temp[1-4]_crit	Temperature critical value, typically greater than
 		corresponding temp_max values.
-		Fixed point value in form XXXXX and should be divided by
-		1000 to get degrees Celsius.
+		Unit: millidegree Celcius
 		Read/Write value.
 
 temp[1-2]_crit_hyst
 		Temperature hysteresis value for critical limit.
-		Fixed point value in form XXXXX and should be divided by
-		1000 to get degrees Celsius.  Must be reported as an
-		absolute temperature, NOT a delta from the critical value.
+		Unit: millidegree Celcius
+		Must be reported as an absolute temperature, NOT a delta
+		from the critical value.
 		Read/Write value.
 
 		If there are multiple temperature sensors, temp1_* is
-		generally the sensor inside the chip itself, generally
+		generally the sensor inside the chip itself,
 		reported as "motherboard temperature".  temp2_* to
 		temp4_* are generally sensors external to the chip
 		itself, for example the thermal diode inside the CPU or
@@ -211,15 +207,15 @@ Note that no known chip provides current
 so this part is theoretical, so to say.
 
 curr[1-n]_max	Current max value
-		Fixed point XXXXX, divide by 1000 to get Amps.
+		Unit: milliampere
 		Read/Write.
 
 curr[1-n]_min	Current min value.
-		Fixed point XXXXX, divide by 1000 to get Amps.
+		Unit: milliampere
 		Read/Write.
 
 curr[1-n]_input	Current input value
-		Fixed point XXXXX, divide by 1000 to get Amps.
+		Unit: milliampere
 		Read only.
 
 
@@ -246,7 +242,7 @@ beep_enable	Beep/interrupt enable
 
 beep_mask	Bitmask for beep.
 		Same format as 'alarms' with the same bit locations.
-		Read only.
+		Read/Write
 
 eeprom		Raw EEPROM data in binary form.
 		Read only.
--- diff/Documentation/ide.txt	2004-04-05 12:57:06.000000000 +0100
+++ source/Documentation/ide.txt	2004-04-21 10:45:33.313639056 +0100
@@ -65,9 +65,7 @@ sixth..     ide5, usually PCI, probed
 
 To access devices on interfaces > ide0, device entries please make sure that
 device files for them are present in /dev.  If not, please create such
-entries, by simply running the included shell script:
-
-	/usr/src/linux/scripts/MAKEDEV.ide
+entries, by using /dev/MAKEDEV.
 
 This driver automatically probes for most IDE interfaces (including all PCI
 ones), for the drives/geometries attached to those interfaces, and for the IRQ
@@ -344,7 +342,7 @@ The character device interface consists 
  nht1		major 37, minor 129	second IDE tape, no rewind on close.
  ...
 
-Run linux/scripts/MAKEDEV.ide to create the above entries.
+Run /dev/MAKEDEV to create the above entries.
 
 The general magnetic tape commands compatible interface, as defined by
 include/linux/mtio.h, is accessible through the character device.
--- diff/Documentation/input/ff.txt	2003-05-21 11:49:49.000000000 +0100
+++ source/Documentation/input/ff.txt	2004-04-21 10:45:33.313639056 +0100
@@ -20,7 +20,7 @@ devices. Please read joystick.txt before
 2. Instructions to the user
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Here are instructions on how to compile and use the driver. In fact, this
-driver is the normal iforce.o, input.o and evdev.o drivers written by Vojtech
+driver is the normal iforce, input and evdev drivers written by Vojtech
 Pavlik, plus additions to support force feedback.
 
 Before you start, let me WARN you that some devices shake violently during the
--- diff/Documentation/input/input.txt	2004-01-19 10:22:54.000000000 +0000
+++ source/Documentation/input/input.txt	2004-04-21 10:45:33.314638904 +0100
@@ -35,18 +35,18 @@ devices, future use (say 2.5/2.6) is exp
 most of the existing input system, which is why it lives in
 drivers/input/ instead of drivers/usb/.
 
-  The centre of the input drivers is the input.o module, which must be
+  The centre of the input drivers is the input module, which must be
 loaded before any other of the input modules - it serves as a way of
 communication between two groups of modules:
 
 1.1 Device drivers
 ~~~~~~~~~~~~~~~~~~
   These modules talk to the hardware (for example via USB), and provide
-events (keystrokes, mouse movements) to the input.o module.
+events (keystrokes, mouse movements) to the input module.
 
 1.2 Event handlers
 ~~~~~~~~~~~~~~~~~~
-  These modules get events from input.o and pass them where needed via
+  These modules get events from input and pass them where needed via
 various interfaces - keystrokes to the kernel, mouse movements via a
 simulated PS/2 interface to GPM and X and so on.
 
@@ -56,12 +56,12 @@ simulated PS/2 interface to GPM and X an
 you'll have to load the following modules (or have them built in to the
 kernel):
 
-	input.o
-	mousedev.o
-	keybdev.o
-	usbcore.o
-	usb-uhci.o or usb-ohci.o or uhci.o
-	hid.o
+	input
+	mousedev
+	keybdev
+	usbcore
+	uhci_hcd or ohci_hcd or ehci_hcd
+	usbhid
 
   After this, the USB keyboard will work straight away, and the USB mouse
 will be available as a character device on major 13, minor 63:
@@ -98,9 +98,9 @@ XFree to this device to use it - GPM sho
 however not useful without being handled, so you also will need to use some
 of the modules from section 3.2.
 
-3.1.1 hid.o
-~~~~~~~~~~~
-  hid.o is the largest and most complex driver of the whole suite. It
+3.1.1 usbhid
+~~~~~~~~~~~~
+  usbhid is the largest and most complex driver of the whole suite. It
 handles all HID devices, and because there is a very wide variety of them,
 and because the USB HID specification isn't simple, it needs to be this big.
 
@@ -115,7 +115,7 @@ interface, but for the UPSs and LCDs it 
 the hiddev interface was designed. See Documentation/usb/hiddev.txt
 for more information about it.
 
-  The usage of the hid.o module is very simple, it takes no parameters,
+  The usage of the usbhid module is very simple, it takes no parameters,
 detects everything automatically and when a HID device is inserted, it
 detects it appropriately.
 
@@ -123,30 +123,30 @@ detects it appropriately.
 device that doesn't work well. In that case #define DEBUG at the beginning
 of hid-core.c and send me the syslog traces.
 
-3.1.2 usbmouse.o
-~~~~~~~~~~~~~~~~
+3.1.2 usbmouse
+~~~~~~~~~~~~~~
   For embedded systems, for mice with broken HID descriptors and just any
-other use when the big hid.o wouldn't be a good choice, there is the
-usbmouse.c driver. It handles USB mice only. It uses a simpler HIDBP
+other use when the big usbhid wouldn't be a good choice, there is the
+usbmouse driver. It handles USB mice only. It uses a simpler HIDBP
 protocol. This also means the mice must support this simpler protocol. Not
-all do. If you don't have any strong reason to use this module, use hid.o
+all do. If you don't have any strong reason to use this module, use usbhid
 instead.
 
-3.1.3 usbkbd.o
-~~~~~~~~~~~~~~
-  Much like usbmouse.c, this module talks to keyboards with a simplified
+3.1.3 usbkbd
+~~~~~~~~~~~~
+  Much like usbmouse, this module talks to keyboards with a simplified
 HIDBP protocol. It's smaller, but doesn't support any extra special keys.
-Use hid.o instead if there isn't any special reason to use this.
+Use usbhid instead if there isn't any special reason to use this.
 
-3.1.4 wacom.o
-~~~~~~~~~~~~~
+3.1.4 wacom
+~~~~~~~~~~~
   This is a driver for Wacom Graphire and Intuos tablets. Not for Wacom
 PenPartner, that one is handled by the HID driver. Although the Intuos and
 Graphire tablets claim that they are HID tablets as well, they are not and
 thus need this specific driver.
 
-3.1.5 iforce.o
-~~~~~~~~~~~~~~~
+3.1.5 iforce
+~~~~~~~~~~~~
   A driver for I-Force joysticks and wheels, both over USB and RS232. 
 It includes ForceFeedback support now, even though Immersion
 Corp. considers the protocol a trade secret and won't disclose a word
@@ -157,8 +157,8 @@ about it. 
   Event handlers distrubite the events from the devices to userland and
 kernel, as needed.
 
-3.2.1 keybdev.o
-~~~~~~~~~~~~~~~
+3.2.1 keybdev
+~~~~~~~~~~~~~
   keybdev is currently a rather ugly hack that translates the input
 events into architecture-specific keyboard raw mode (Xlated AT Set2 on
 x86), and passes them into the handle_scancode function of the
@@ -170,13 +170,13 @@ it.
 best if keyboard.c would itself be an event handler. This is done in
 the input patch, available on the webpage mentioned below. 
 
-3.2.2 mousedev.o
-~~~~~~~~~~~~~~~~
+3.2.2 mousedev
+~~~~~~~~~~~~~~
   mousedev is also a hack to make programs that use mouse input
 work. It takes events from either mice or digitizers/tablets and makes
 a PS/2-style (a la /dev/psaux) mouse device available to the
 userland. Ideally, the programs could use a more reasonable interface,
-for example evdev.o
+for example evdev
 
   Mousedev devices in /dev/input (as shown above) are:
 
@@ -207,8 +207,8 @@ program reading the data wishes. You can
 these. You'll need ImPS/2 if you want to make use of a wheel on a USB
 mouse and ExplorerPS/2 if you want to use extra (up to 5) buttons. 
 
-3.2.3 joydev.o
-~~~~~~~~~~~~~~
+3.2.3 joydev
+~~~~~~~~~~~~
   Joydev implements v0.x and v1.x Linux joystick api, much like
 drivers/char/joystick/joystick.c used to in earlier versions. See
 joystick-api.txt in the Documentation subdirectory for details.  As
@@ -223,8 +223,8 @@ on: 
 
 And so on up to js31.
 
-3.2.4 evdev.o
-~~~~~~~~~~~~~
+3.2.4 evdev
+~~~~~~~~~~~
   evdev is the generic input event interface. It passes the events
 generated in the kernel straight to the program, with timestamps. The
 API is still evolving, but should be useable now. It's described in
--- diff/Documentation/input/joystick.txt	2004-04-05 12:57:06.000000000 +0100
+++ source/Documentation/input/joystick.txt	2004-04-21 10:45:33.314638904 +0100
@@ -182,7 +182,7 @@ they're basically souped up CHF sticks.
 
   For other joystick types (more/less axes, hats, and buttons) support
 you'll need to specify the types either on the kernel command line or on the
-module command line, when inserting analog.o into the kernel. The
+module command line, when inserting analog into the kernel. The
 parameters are:
 
 	analog.map=<type1>,<type2>,<type3>,....
@@ -503,7 +503,7 @@ and the /dev/input/jsX device should bec
 
 3.21 I-Force devices 
 ~~~~~~~~~~~~~~~~~~~~
-  All I-Force devices are supported by the iforce.o module. This includes:
+  All I-Force devices are supported by the iforce module. This includes:
 
 * AVB Mag Turbo Force
 * AVB Top Shot Pegasus
--- diff/Documentation/mips/pci/pci.README	2002-10-16 04:28:27.000000000 +0100
+++ source/Documentation/mips/pci/pci.README	2004-04-21 10:45:33.316638600 +0100
@@ -15,13 +15,6 @@ is doing its own pcibios thing and it ha
 mess.  This generic pci code is meant to clean up the mips
 pci mess and make it easier to add pci support to new boards.
 
-arch/mips/kernel/pci_auto.c has the pci bus enumeration code.
-This code scans the pci bus(es) and assigns all of the resources.
-Thus, you don't need the boot code to that, and many boot codes
-don't do it correctly anyway.  To enable the pci_auto code, add
-
-define_bool CONFIG_PCI_AUTO y 
-
 inside the define for your board in arch/mips/config.in. 
 For example, the Galileo EV96100 board  looks like this:
 
@@ -29,7 +22,6 @@ if [ "$CONFIG_MIPS_EV96100" = "y" ]; the
 	define_bool CONFIG_PCI y
 	define_bool CONFIG_MIPS_GT96100 y
 	define_bool CONFIG_NEW_PCI y
-	define_bool CONFIG_PCI_AUTO y
 	define_bool CONFIG_SWAP_IO_SPACE y
 fi 
 
@@ -42,11 +34,6 @@ define_bool CONFIG_NEW_PCI y
 inside the define for your board. Again, the EV96100 example above
 show NEW_PCI turned on.
 
-Note that you can enable CONFIG_NEW_PCI code without enabling 
-CONFIG_PCI_AUTO. But you can't do the opposite because the pci_auto
-routines are called from pcibios_init(), which is part of the 
-CONFIG_NEW_PCI code.
-
 
 Now you need to add your files to hook in your pci configuration
 cycles.  Usually you'll need only a couple of files named something
--- diff/Documentation/mips/time.README	2002-10-16 04:27:19.000000000 +0100
+++ source/Documentation/mips/time.README	2004-04-21 10:45:33.316638600 +0100
@@ -103,9 +103,9 @@ Step 1: decide how you like to implement
      Do you plan to use the CPU counter register as the timer interrupt
      or use an exnternal timer?
 
-     In order to CPU counter register as the timer interrupt source, you must
-     know the counter speed (mips_counter_frequency).  It is usually the
-     same as the CPU speed (Or it is ALWAYS the same?)
+     In order to use CPU counter register as the timer interrupt source, you
+     must know the counter speed (mips_counter_frequency).  It is usually the
+     same as the CPU speed or an integral divisor of it.
 
   d) decide on whether you want to use high-level or low-level timer
      interrupt routines.  The low-level one is presumably faster, but should
@@ -154,8 +154,45 @@ For some tricky cases, you may need to a
 for some of the functions in time.c.  
 
 For example, you may define your own timer interrupt routine, which does
-its own processing and in turn calls timer_interrupt().
+some of its own processing and then calls timer_interrupt().
 
 You can also over-ride any of the built-in functions (gettimeoffset,
 RTC routines and/or timer interrupt routine).
 
+
+PORTING NOTES FOR SMP
+----------------------
+
+If you have a SMP box, things are slightly more complicated.
+
+The time service running every jiffy is logically divided into two parts:
+
+  1) the one for the whole system  (defined in timer_interrupt())
+  2) the one that should run for each CPU (defined in local_timer_interrupt())
+
+You need to decide on your timer interrupt sources.
+
+  case 1) - whole system has only one timer interrupt delivered to one CPU
+
+	In this case, you set up timer interrupt as in UP systems.  In addtion,
+	you need to set emulate_local_timer_interrupt to 1 so that other
+	CPUs get to call local_timer_interrupt().
+
+	THIS IS CURRENTLY NOT IMPLEMNETED.  However, it is rather easy to write
+	one should such a need arise.  You simply make a IPI call.
+
+  case 2) - each CPU has a separate timer interrupt
+
+	In this case, you need to set up IRQ such that each of them will
+	call local_timer_interrupt().  In addition, you need to arrange
+	one and only one of them to call timer_interrupt().
+
+	You can also do the low-level version of those interrupt routines,
+	following similar dispatching routes described above.
+
+Note about do_gettimeoffset():
+
+  It is very likely the CPU counter registers are not sync'ed up in a SMP box.
+  Therefore you cannot really use the many of the existing routines that
+  are based on CPU counter.  You should wirte your own gettimeoffset rouinte
+  if you want intra-jiffy resolution.
--- diff/Documentation/networking/00-INDEX	2003-08-20 14:16:23.000000000 +0100
+++ source/Documentation/networking/00-INDEX	2004-04-21 10:45:33.317638448 +0100
@@ -111,8 +111,6 @@ tlan.txt
 	- ThunderLAN (Compaq Netelligent 10/100, Olicom OC-2xxx) driver info.
 tms380tr.txt
 	- SysKonnect Token Ring ISA/PCI adapter driver info.
-tulip.txt
-	- info on using DEC 21040/21041/21140 based PCI Ethernet cards.
 tuntap.txt
 	- TUN/TAP device driver, allowing user space Rx/Tx of packets.
 vortex.txt
--- diff/Documentation/s390/s390dbf.txt	2003-05-21 11:49:45.000000000 +0100
+++ source/Documentation/s390/s390dbf.txt	2004-04-21 10:45:33.318638296 +0100
@@ -66,9 +66,9 @@ a view can be inspected simply by readin
 All debug logs have an an actual debug level (range from 0 to 6).
 The default level is 3. Event and Exception functions have a 'level'
 parameter. Only debug entries with a level that is lower or equal
-than the actual level are written to the log. This means that high 
-priority log entries should have a low level value whereas low priority
-entries should have a high one. 
+than the actual level are written to the log. This means, when
+writing events, high priority log entries should have a low level
+value whereas low priority entries should have a high one.
 The actual debug level can be changed with the help of the proc-filesystem 
 through writing a number string "x" to the 'level' proc file which is
 provided for every debug log. Debugging can be switched off completely
--- diff/Documentation/sound/alsa/ALSA-Configuration.txt	2004-04-05 12:57:06.000000000 +0100
+++ source/Documentation/sound/alsa/ALSA-Configuration.txt	2004-04-21 10:45:33.318638296 +0100
@@ -30,8 +30,7 @@ isapnptools.
 Creating ALSA devices
 =====================
 
-Use the MAKEDEV.snd script located in the directory named scripts
-in the linux kernel tree.
+Use the /dev/MAKEDEV script to create the nessecary device nodes.
 
 
 Module parameters
--- diff/Documentation/video4linux/CARDLIST.bttv	2004-02-09 10:36:07.000000000 +0000
+++ source/Documentation/video4linux/CARDLIST.bttv	2004-04-21 10:45:33.325637232 +0100
@@ -113,3 +113,9 @@ card=111 - IVC-120G
 card=112 - pcHDTV HD-2000 TV
 card=113 - Twinhan DST + clones
 card=114 - Winfast VC100
+card=115 - Teppro TEV-560/InterVision IV-560
+card=116 - SIMUS GVC1100
+card=117 - NGS NGSTV+
+card=118 - LMLBT4
+card=119 - Tekram M205 PRO
+card=120 - Conceptronic CONTVFMi
--- diff/Documentation/video4linux/CARDLIST.saa7134	2004-02-09 10:36:07.000000000 +0000
+++ source/Documentation/video4linux/CARDLIST.saa7134	2004-04-21 10:45:33.326637080 +0100
@@ -1,23 +1,34 @@
   0 -> UNKNOWN/GENERIC                         
   1 -> Proteus Pro [philips reference design]   [1131:2001,1131:2001]
-  2 -> LifeView FlyVIDEO3000                    [5168:0138]
+  2 -> LifeView FlyVIDEO3000                    [5168:0138,4e42:0138]
   3 -> LifeView FlyVIDEO2000                    [5168:0138]
   4 -> EMPRESS                                  [1131:6752]
   5 -> SKNet Monster TV                         [1131:4e85]
   6 -> Tevion MD 9717                          
-  7 -> KNC One TV-Station RDS / Typhoon TV+Radio 90031 [1131:fe01]
-  8 -> Terratec Cinergy 400 TV                  [153B:1142]
-  9 -> Medion 5044                             
- 10 -> Kworld/KuroutoShikou SAA7130-TVPCI      
- 11 -> Terratec Cinergy 600 TV                  [153B:1143]
- 12 -> Medion 7134                              [16be:0003]
- 13 -> ELSA EX-VISION 300TV                     [1048:226b]
- 14 -> ELSA EX-VISION 500TV                     [1048:226b]
- 15 -> ASUS TV-FM 7134                          [PCI_VENDOR_ID_ASUSTEK:4842,PCI_VENDOR_ID_ASUSTEK:4830]
- 16 -> AOPEN VA1000 POWER                       [1131:7133]
- 17 -> 10MOONS PCI TV CAPTURE CARD              [1131:2001]
- 18 -> BMK MPEX No Tuner                       
- 19 -> Compro VideoMate TV                      [185b:c100]
- 20 -> Matrox CronosPlus                        [PCI_VENDOR_ID_MATROX:48d0]
- 21 -> Medion 2819                              [1461:a70b]
- 22 -> BMK MPEX Tuner                          
+  7 -> KNC One TV-Station RDS / Typhoon TV Tuner RDS [1131:fe01,1894:fe01]
+  8 -> KNC One TV-Station DVR                   [1894:a006]
+  9 -> Terratec Cinergy 400 TV                  [153B:1142]
+ 10 -> Medion 5044
+ 11 -> Kworld/KuroutoShikou SAA7130-TVPCI
+ 12 -> Terratec Cinergy 600 TV                  [153B:1143]
+ 13 -> Medion 7134                              [16be:0003]
+ 14 -> Typhoon TV+Radio 90031
+ 15 -> ELSA EX-VISION 300TV                     [1048:226b]
+ 16 -> ELSA EX-VISION 500TV                     [1048:226b]
+ 17 -> ASUS TV-FM 7134                          [1043:4842,1043:4830,1043:4840]
+ 18 -> AOPEN VA1000 POWER                       [1131:7133]
+ 19 -> 10MOONS PCI TV CAPTURE CARD              [1131:2001]
+ 20 -> BMK MPEX No Tuner
+ 21 -> Compro VideoMate TV                      [185b:c100]
+ 22 -> Matrox CronosPlus                        [102B:48d0]
+ 23 -> Medion 2819/ AverMedia M156              [1461:a70b,1461:2115]
+ 24 -> BMK MPEX Tuner
+ 25 -> ASUS TV-FM 7133                          [1043:4843]
+ 26 -> Pinnacle PCTV Stereo (saa7134)           [11bd:002b]
+ 27 -> Manli MuchTV M-TV002
+ 28 -> Manli MuchTV M-TV001
+ 29 -> Nagase Sangyo TransGear 3000TV           [1461:050c]
+ 30 -> Elitegroup ECS TVP3XP FM1216 Tuner Card(PAL-BG,FM)  [1019:4cb4]
+ 31 -> Elitegroup ECS TVP3XP FM1236 Tuner Card (NTSC,FM) [1019:4cb5]
+ 32 -> AVACS SmartTV
+ 33 -> AVerMedia DVD EZMaker                    [1461:10ff]
--- diff/Documentation/video4linux/CARDLIST.tuner	2004-02-09 10:36:07.000000000 +0000
+++ source/Documentation/video4linux/CARDLIST.tuner	2004-04-21 10:45:33.326637080 +0100
@@ -31,7 +31,7 @@ tuner=29 - LG PAL_BG (TPI8PSB11D)
 tuner=30 - Temic PAL* auto + FM (4009 FN5)
 tuner=31 - SHARP NTSC_JP (2U5JF5540)
 tuner=32 - Samsung PAL TCPM9091PD27
-tuner=33 - MT2032 universal
+tuner=33 - MT20xx universal
 tuner=34 - Temic PAL_BG (4106 FH5)
 tuner=35 - Temic PAL_DK/SECAM_L (4012 FY5)
 tuner=36 - Temic NTSC (4136 FY5)
@@ -41,3 +41,6 @@ tuner=39 - LG NTSC (newer TAPC series)
 tuner=40 - HITACHI V7-J180AT
 tuner=41 - Philips PAL_MK (FI1216 MK)
 tuner=42 - Philips 1236D ATSC/NTSC daul in
+tuner=43 - Philips NTSC MK3 (FM1236MK3 or FM1236/F)
+tuner=44 - Philips 4 in 1 (ATI TV Wonder Pro/Conexant)
+tuner=45 - Microtune 4049 FM5
--- diff/Documentation/video4linux/README.cx88	2004-02-09 10:36:07.000000000 +0000
+++ source/Documentation/video4linux/README.cx88	2004-04-21 10:45:33.326637080 +0100
@@ -9,20 +9,29 @@ current status
 ==============
 
 video
-	Basically works.  Some minor quality glitches.  For now
-	only capture, overlay support isn't completed yet.
+	- Basically works.
+	- Some minor image quality glitches.
+	- Red and blue are swapped sometimes for not-yet known
+	  reasons (seems to depend on the image size, try to resize
+	  your tv app window as workaround ...).
+	- For now only capture, overlay support isn't completed yet.
 
 audio
-	Doesn't work.  Also the chip specs for the on-chip TV sound
-	decoder are next to useless :-/
-	Most tuner chips do provide mono sound, which may or may not
-	be useable depending on the board design.  With the Hauppauge
-	cards it works, so there is at least mono sound.  Not nice,
-	but better than nothing.
+	- The chip specs for the on-chip TV sound decoder are next
+	  to useless :-/
+	- Neverless the builtin TV sound decoder starts working now,
+          at least for PAL-BG.  Other TV norms need other code ...
+          FOR ANY REPORTS ON THIS PLEASE MENTION THE TV NORM YOU ARE
+          USING.
+	- Most tuner chips do provide mono sound, which may or may not
+	  be useable depending on the board design.  With the Hauppauge
+	  cards it works, so there is mono sound available as fallback.
+	- audio data dma (i.e. recording without loopback cable to the
+	  sound card) should be possible, but there is no code yet ...
 
 vbi
-	not implemented yet (but I don't expect problems here, just
-	found no time for that yet).
+	- some code present.  Doesn't crash any more, but also doesn't
+	  work yet ...
 
 
 how to add support for new cards
@@ -38,18 +47,22 @@ like this one:
 		34xxx models [card=1,autodetected]
 
 If your card is listed as "board: UNKNOWN/GENERIC" it is unknown to
-the driver.
+the driver.  What to do then?
 
-You can try to create a new entry yourself, or you can mail me the
-config information.  I need at least the following informations to
-add the card:
-
- * the PCI Subsystem ID ("0070:3400" from the line above, "lspci -v"
-   output is fine too).
- * the tuner type used by the card.  You can try to find one by
-   trial-and-error using the tuner=<n> insmod option.  If you
-   know which one the card has you can also have a look at the
-   list in CARDLIST.tuner
+ (1) Try upgrading to the latest snapshot, maybe it has been added
+     meanwhile.
+ (2) You can try to create a new entry yourself, have a look at
+     cx88-cards.c.  If that worked, mail me your changes as unified
+     diff ("diff -u").
+ (3) Or you can mail me the config information.  I need at least the
+     following informations to add the card:
+
+     * the PCI Subsystem ID ("0070:3400" from the line above,
+       "lspci -v" output is fine too).
+     * the tuner type used by the card.  You can try to find one by
+       trial-and-error using the tuner=<n> insmod option.  If you
+       know which one the card has you can also have a look at the
+       list in CARDLIST.tuner
 
 Have fun,
 
--- diff/MAINTAINERS	2004-04-05 12:57:06.000000000 +0100
+++ source/MAINTAINERS	2004-04-21 10:45:33.327636928 +0100
@@ -113,6 +113,12 @@ M:	jgarzik@pobox.com
 W:	http://sourceforge.net/projects/gkernel/
 S:	Maintained
 
+8169 10/100/1000 GIGABIT ETHERNET DRIVER
+P:	Francois Romieu
+M:	romieu@fr.zoreil.com
+L:	netdev@oss.sgi.com
+S:	Maintained
+
 8250/16?50 (AND CLONE UARTS) SERIAL DRIVER
 P:	Russell King
 M:	rmk+serial@arm.linux.org.uk
@@ -1055,23 +1061,33 @@ M:	tigran@veritas.com
 S:	Maintained
 
 INTEL PRO/100 ETHERNET SUPPORT
+P:	John Ronciak
+M:	john.ronciak@intel.com
+P:	Ganesh Venkatesan
+M:	ganesh.venkatesan@intel.com
 P:	Scott Feldman
 M:	scott.feldman@intel.com
+W:	http://sourceforge.net/projects/e1000/
 S:	Supported
 
 INTEL PRO/1000 GIGABIT ETHERNET SUPPORT
 P:	Jeb Cramer
 M:	cramerj@intel.com
-P:	Scott Feldman
-M:	scott.feldman@intel.com
+P:	John Ronciak
+M:	john.ronciak@intel.com
+P:	Ganesh Venkatesan
+M:	ganesh.venkatesan@intel.com
 W:	http://sourceforge.net/projects/e1000/
 S:	Supported
 
 INTEL PRO/10GbE SUPPORT
+P:	Ayyappan Veeraiyan
+M:	ayyappan.veeraiyan@intel.com
 P:	Ganesh Venkatesan
-M:	Ganesh.Venkatesan@intel.com
-P:	Scott Feldman
-M:	scott.feldman@intel.com
+M:	ganesh.venkatesan@intel.com
+P:	John Ronciak
+M:	john.ronciak@intel.com
+W:	http://sourceforge.net/projects/e1000/
 S:	Supported
 
 INTERMEZZO FILE SYSTEM
@@ -2000,6 +2016,13 @@ M:	mulix@mulix.org
 L:	linux-kernel@vger.kernel.org
 S:	Maintained
 
+TRIVIAL PATCHES
+P:      Rusty Russell
+M:      trivial@rustcorp.com.au
+L:      linux-kernel@vger.kernel.org
+W:      http://www.kernel.org/pub/linux/kernel/people/rusty/trivial/
+S:      Maintained
+
 TMS380 TOKEN-RING NETWORK DRIVER
 P:	Adam Fritzler
 M:	mid@auk.cx
@@ -2253,9 +2276,8 @@ M:	hirofumi@mail.parknet.co.jp
 L:	linux-kernel@vger.kernel.org
 S:	Maintained
 
-VIA 82Cxxx AUDIO DRIVER
+VIA 82Cxxx AUDIO DRIVER (old OSS driver)
 P:	Jeff Garzik
-L:	linux-via@gtf.org
 S:	Odd fixes
 
 VIA RHINE NETWORK DRIVER
--- diff/Makefile	2004-04-05 12:57:06.000000000 +0100
+++ source/Makefile	2004-04-21 10:45:33.329636624 +0100
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 6
-SUBLEVEL = 5
-EXTRAVERSION =
+SUBLEVEL = 6
+EXTRAVERSION =-rc2
 NAME=Zonked Quokka
 
 # *DOCUMENTATION*
@@ -53,6 +53,19 @@ ifndef KBUILD_CHECKSRC
   KBUILD_CHECKSRC = 0
 endif
 
+# Use make M=dir to specify direcotry of external module to build
+# Old syntax make ... SUBDIRS=$PWD is still supported
+# Setting the environment variable KBUILD_EXTMOD take precedence
+ifdef SUBDIRS
+  KBUILD_EXTMOD ?= $(SUBDIRS)
+endif
+ifdef M
+  ifeq ("$(origin M)", "command line")
+    KBUILD_EXTMOD := $(M)
+  endif
+endif
+
+
 # kbuild supports saving output files in a separate directory.
 # To locate output files in a separate directory two syntax'es are supported.
 # In both cases the working directory must be the root of the kernel src.
@@ -81,9 +94,9 @@ ifdef O
 endif
 
 # That's our default target when none is given on the command line
-.PHONY: all
-all:
-  
+.PHONY: _all
+_all:
+
 ifneq ($(KBUILD_OUTPUT),)
 # Invoke a second make in the output directory, passing relevant variables
 # check that the output directory actually exists
@@ -94,10 +107,11 @@ $(if $(wildcard $(KBUILD_OUTPUT)),, \
 
 .PHONY: $(MAKECMDGOALS)
 
-$(filter-out all,$(MAKECMDGOALS)) all:
+$(filter-out _all,$(MAKECMDGOALS)) _all:
 	$(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT)		\
-	KBUILD_SRC=$(CURDIR)	KBUILD_VERBOSE=$(KBUILD_VERBOSE)	\
-	KBUILD_CHECK=$(KBUILD_CHECK) -f $(CURDIR)/Makefile $@
+	KBUILD_SRC=$(CURDIR)	     KBUILD_VERBOSE=$(KBUILD_VERBOSE)	\
+	KBUILD_CHECK=$(KBUILD_CHECK) KBUILD_EXTMOD=$(KBUILD_EXTMOD)     \
+        -f $(CURDIR)/Makefile $@
 
 # Leave processing to above invocation of make
 skip-makefile := 1
@@ -107,6 +121,15 @@ endif # ifeq ($(KBUILD_SRC),)
 # We process the rest of the Makefile if this is the final invocation of make
 ifeq ($(skip-makefile),)
 
+# If building an external module we do not care about the all: rule
+# but instead _all depend on modules
+.PHONY: all
+ifeq ($(KBUILD_EXTMOD),)
+_all: all
+else
+_all: modules
+endif
+
 # Make sure we're not wasting cpu-cycles doing locale handling, yet do make
 # sure error messages appear in the user-desired language
 ifdef LC_ALL
@@ -194,7 +217,7 @@ endif
 #	in addition to whatever we do anyway.
 #	Just "make" or "make all" shall build modules as well
 
-ifneq ($(filter all modules,$(MAKECMDGOALS)),)
+ifneq ($(filter all _all modules,$(MAKECMDGOALS)),)
   KBUILD_MODULES := 1
 endif
 
@@ -203,7 +226,7 @@ ifeq ($(MAKECMDGOALS),)
 endif
 
 export KBUILD_MODULES KBUILD_BUILTIN KBUILD_VERBOSE
-export KBUILD_CHECKSRC KBUILD_SRC
+export KBUILD_CHECKSRC KBUILD_SRC KBUILD_EXTMOD
 
 # Beautify output
 # ---------------------------------------------------------------------------
@@ -299,7 +322,10 @@ export CPPFLAGS NOSTDINC_FLAGS OBJCOPYFL
 export CFLAGS CFLAGS_KERNEL CFLAGS_MODULE 
 export AFLAGS AFLAGS_KERNEL AFLAGS_MODULE
 
-export MODVERDIR := .tmp_versions
+# When compiling out-of-tree modules, put MODVERDIR in the module
+# tree rather than in the kernel tree. The kernel tree might
+# even be read-only.
+export MODVERDIR := $(if $(KBUILD_EXTMOD),$(KBUILD_EXTMOD)/).tmp_versions
 
 # The temporary file to save gcc -MD generated dependencies must not
 # contain a comma
@@ -340,11 +366,13 @@ ifneq ($(filter $(no-dot-config-targets)
 	endif
 endif
 
-ifneq ($(filter config %config,$(MAKECMDGOALS)),)
-	config-targets := 1
-	ifneq ($(filter-out config %config,$(MAKECMDGOALS)),)
-		mixed-targets := 1
-	endif
+ifeq ($(KBUILD_EXTMOD),)
+        ifneq ($(filter config %config,$(MAKECMDGOALS)),)
+                config-targets := 1
+                ifneq ($(filter-out config %config,$(MAKECMDGOALS)),)
+                        mixed-targets := 1
+                endif
+        endif
 endif
 
 ifeq ($(mixed-targets),1)
@@ -371,6 +399,7 @@ else
 # Build targets only - this includes vmlinux, arch specific targets, clean
 # targets and others. In general all targets except *config targets.
 
+ifeq ($(KBUILD_EXTMOD),)
 # Additional helpers built in scripts/
 # Carefully list dependencies so we do not try to build scripts twice
 # in parrallel
@@ -393,7 +422,7 @@ drivers-y	:= drivers/ sound/
 net-y		:= net/
 libs-y		:= lib/
 core-y		:= usr/
-SUBDIRS		:=
+endif # KBUILD_EXTMOD
 
 ifeq ($(dot-config),1)
 # In this section, we need .config
@@ -420,33 +449,6 @@ endif
 
 include $(srctree)/arch/$(ARCH)/Makefile
 
-# Let architecture Makefiles change CPPFLAGS if needed
-CFLAGS := $(CPPFLAGS) $(CFLAGS)
-AFLAGS := $(CPPFLAGS) $(AFLAGS)
-
-core-y		+= kernel/ mm/ fs/ ipc/ security/ crypto/
-
-SUBDIRS		+= $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
-		     $(core-y) $(core-m) $(drivers-y) $(drivers-m) \
-		     $(net-y) $(net-m) $(libs-y) $(libs-m)))
-
-ALL_SUBDIRS     := $(sort $(SUBDIRS) $(patsubst %/,%,$(filter %/, \
-		     $(init-n) $(init-) \
-		     $(core-n) $(core-) $(drivers-n) $(drivers-) \
-		     $(net-n)  $(net-)  $(libs-n)    $(libs-))))
-
-init-y		:= $(patsubst %/, %/built-in.o, $(init-y))
-core-y		:= $(patsubst %/, %/built-in.o, $(core-y))
-drivers-y	:= $(patsubst %/, %/built-in.o, $(drivers-y))
-net-y		:= $(patsubst %/, %/built-in.o, $(net-y))
-libs-y1		:= $(patsubst %/, %/lib.a, $(libs-y))
-libs-y2		:= $(patsubst %/, %/built-in.o, $(libs-y))
-libs-y		:= $(libs-y1) $(libs-y2)
-
-# Here goes the main Makefile
-# ---------------------------------------------------------------------------
-
-
 ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
 CFLAGS		+= -Os
 else
@@ -480,6 +482,27 @@ CFLAGS += $(call check_gcc,-Wdeclaration
 MODLIB	:= $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)
 export MODLIB
 
+
+ifeq ($(KBUILD_EXTMOD),)
+core-y		+= kernel/ mm/ fs/ ipc/ security/ crypto/
+
+vmlinux-dirs	:= $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
+		     $(core-y) $(core-m) $(drivers-y) $(drivers-m) \
+		     $(net-y) $(net-m) $(libs-y) $(libs-m)))
+
+vmlinux-alldirs	:= $(sort $(vmlinux-dirs) $(patsubst %/,%,$(filter %/, \
+		     $(init-n) $(init-) \
+		     $(core-n) $(core-) $(drivers-n) $(drivers-) \
+		     $(net-n)  $(net-)  $(libs-n)    $(libs-))))
+
+init-y		:= $(patsubst %/, %/built-in.o, $(init-y))
+core-y		:= $(patsubst %/, %/built-in.o, $(core-y))
+drivers-y	:= $(patsubst %/, %/built-in.o, $(drivers-y))
+net-y		:= $(patsubst %/, %/built-in.o, $(net-y))
+libs-y1		:= $(patsubst %/, %/lib.a, $(libs-y))
+libs-y2		:= $(patsubst %/, %/built-in.o, $(libs-y))
+libs-y		:= $(libs-y1) $(libs-y2)
+
 # Build vmlinux
 # ---------------------------------------------------------------------------
 
@@ -568,12 +591,12 @@ vmlinux: $(vmlinux-objs) $(kallsyms.o) a
 #	The actual objects are generated when descending, 
 #	make sure no implicit rule kicks in
 
-$(sort $(vmlinux-objs)) arch/$(ARCH)/kernel/vmlinux.lds.s: $(SUBDIRS) ;
+$(sort $(vmlinux-objs)) arch/$(ARCH)/kernel/vmlinux.lds.s: $(vmlinux-dirs) ;
 
-# 	Handle descending into subdirectories listed in $(SUBDIRS)
+# 	Handle descending into subdirectories listed in $(vmlinux-dirs)
 
-.PHONY: $(SUBDIRS)
-$(SUBDIRS): prepare-all scripts
+.PHONY: $(vmlinux-dirs)
+$(vmlinux-dirs): prepare-all scripts
 	$(Q)$(MAKE) $(build)=$@
 
 # Things we need to do before we recursively start building the kernel
@@ -601,15 +624,10 @@ ifneq ($(KBUILD_SRC),)
 endif
 
 prepare0: prepare1 include/linux/version.h include/asm include/config/MARKER
-ifdef KBUILD_MODULES
-ifeq ($(origin SUBDIRS),file)
+ifneq ($(KBUILD_MODULES),)
 	$(Q)rm -rf $(MODVERDIR)
-else
-	@echo '*** Warning: Overriding SUBDIRS on the command line can cause'
-	@echo '***          inconsistencies'
-endif
+	$(Q)mkdir -p $(MODVERDIR)
 endif
-	$(if $(CONFIG_MODULES),$(Q)mkdir -p $(MODVERDIR))
 
 # All the preparing..
 prepare-all: prepare0 prepare
@@ -693,7 +711,7 @@ all: modules
 #	Build modules
 
 .PHONY: modules
-modules: $(SUBDIRS) $(if $(KBUILD_BUILTIN),vmlinux)
+modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)
 	@echo '  Building modules, stage 2.';
 	$(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost
 
@@ -766,39 +784,32 @@ endef
 
 ###
 # Cleaning is done on three levels.
-# make clean     Delete all automatically generated files, including
-#                tools and firmware.
-# make mrproper  Delete the current configuration, and related files
-#                Any core files spread around are deleted as well
+# make clean     Delete most generated files
+#                Leave enough to build external modules
+# make mrproper  Delete the current configuration, and all generated files
 # make distclean Remove editor backup files, patch leftover files and the like
 
 # Directories & files removed with 'make clean'
-CLEAN_DIRS  += $(MODVERDIR) include/config include2
-CLEAN_FILES +=	vmlinux System.map \
-		include/linux/autoconf.h include/linux/version.h \
-		include/asm include/linux/modversions.h \
-		kernel.spec .tmp*
-
-# Files removed with 'make mrproper'
-MRPROPER_FILES += .version .config .config.old tags TAGS cscope*
+CLEAN_DIRS  += $(MODVERDIR)
+CLEAN_FILES +=	vmlinux System.map kernel.spec \
+                .tmp_kallsyms* .tmp_version .tmp_vmlinux*
+
+# Directories & files removed with 'make mrproper'
+MRPROPER_DIRS  += include/config include2
+MRPROPER_FILES += .config .config.old include/asm .version \
+                  include/linux/autoconf.h include/linux/version.h \
+                  Module.symvers tags TAGS cscope*
 
-# clean - Delete all intermediate files
+# clean - Delete most, but leave enough to build external modules
 #
-clean-dirs += $(addprefix _clean_,$(ALL_SUBDIRS) Documentation/DocBook scripts)
-.PHONY: $(clean-dirs) clean archclean mrproper archmrproper distclean
+clean: rm-dirs  := $(CLEAN_DIRS)
+clean: rm-files := $(CLEAN_FILES)
+clean-dirs      := $(addprefix _clean_,$(vmlinux-alldirs))
+
+.PHONY: $(clean-dirs) clean archclean
 $(clean-dirs):
 	$(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)
 
-clean:		rm-dirs  := $(wildcard $(CLEAN_DIRS))
-mrproper:	rm-dirs  := $(wildcard $(MRPROPER_DIRS))
-quiet_cmd_rmdirs = $(if $(rm-dirs),CLEAN   $(rm-dirs))
-      cmd_rmdirs = rm -rf $(rm-dirs)
-
-clean:		rm-files := $(wildcard $(CLEAN_FILES))
-mrproper:	rm-files := $(wildcard $(MRPROPER_FILES))
-quiet_cmd_rmfiles = $(if $(rm-files),CLEAN   $(rm-files))
-      cmd_rmfiles = rm -rf $(rm-files)
-
 clean: archclean $(clean-dirs)
 	$(call cmd,rmdirs)
 	$(call cmd,rmfiles)
@@ -807,12 +818,25 @@ clean: archclean $(clean-dirs)
 		-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \) \
 		-type f -print | xargs rm -f
 
-# mrproper
+# mrproper - Delete all generated files, including .config
 #
-distclean: mrproper
-mrproper: clean archmrproper
+mrproper: rm-dirs  := $(wildcard $(MRPROPER_DIRS))
+mrproper: rm-files := $(wildcard $(MRPROPER_FILES))
+mrproper-dirs      := $(addprefix _mrproper_,Documentation/DocBook scripts)
+
+.PHONY: $(mrproper-dirs) mrproper archmrproper
+$(mrproper-dirs):
+	$(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@)
+
+mrproper: clean archmrproper $(mrproper-dirs)
 	$(call cmd,rmdirs)
 	$(call cmd,rmfiles)
+
+# distclean
+#
+.PHONY: distclean
+
+distclean: mrproper
 	@find . $(RCS_FIND_IGNORE) \
 	 	\( -name '*.orig' -o -name '*.rej' -o -name '*~' \
 		-o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
@@ -820,52 +844,6 @@ mrproper: clean archmrproper
 		-o -name '*%' -o -name '.*.cmd' -o -name 'core' \) \
 		-type f -print | xargs rm -f
 
-# Generate tags for editors
-# ---------------------------------------------------------------------------
-
-define all-sources
-	( find . $(RCS_FIND_IGNORE) \
-	       \( -name include -o -name arch \) -prune -o \
-	       -name '*.[chS]' -print; \
-	  find arch/$(ARCH) $(RCS_FIND_IGNORE) \
-	       -name '*.[chS]' -print; \
-	  find include $(RCS_FIND_IGNORE) \
-	       \( -name config -o -name 'asm-*' \) -prune \
-	       -o -name '*.[chS]' -print; \
-	  find include/asm-$(ARCH) $(RCS_FIND_IGNORE) \
-	       -name '*.[chS]' -print; \
-	  find include/asm-generic $(RCS_FIND_IGNORE) \
-	       -name '*.[chS]' -print )
-endef
-
-quiet_cmd_cscope-file = FILELST cscope.files
-      cmd_cscope-file = $(all-sources) > cscope.files
-
-quiet_cmd_cscope = MAKE    cscope.out
-      cmd_cscope = cscope -k -b -q
-
-cscope: FORCE
-	$(call cmd,cscope-file)
-	$(call cmd,cscope)
-
-quiet_cmd_TAGS = MAKE   $@
-cmd_TAGS = $(all-sources) | etags -
-
-# 	Exuberant ctags works better with -I
-
-quiet_cmd_tags = MAKE   $@
-define cmd_tags
-	rm -f $@; \
-	CTAGSF=`ctags --version | grep -i exuberant >/dev/null && echo "-I __initdata,__exitdata,EXPORT_SYMBOL,EXPORT_SYMBOL_NOVERS"`; \
-	$(all-sources) | xargs ctags $$CTAGSF -a
-endef
-
-TAGS: FORCE
-	$(call cmd,TAGS)
-
-tags: FORCE
-	$(call cmd,tags)
-
 # RPM target
 # ---------------------------------------------------------------------------
 
@@ -945,9 +923,118 @@ help:
 
 # Documentation targets
 # ---------------------------------------------------------------------------
-%docs: scripts FORCE
+%docs: scripts_basic FORCE
 	$(Q)$(MAKE) $(build)=Documentation/DocBook $@
 
+else # KBUILD_EXTMOD
+
+###
+# External module support.
+# When building external modules the kernel used as basis is considered
+# read-only, and no consistency checks are made and the make
+# system is not used on the basis kernel. If updates are required
+# in the basis kernel ordinary make commands (without M=...) must
+# be used.
+#
+# The following are the only valid targets when building external
+# modules.
+# make M=dir clean     Delete all automatically generated files
+# make M=dir modules   Make all modules in specified dir
+# make M=dir	       Same as 'make M=dir modules'
+# make M=dir modules_install
+#                      Install the modules build in the module directory
+#                      Assumes install directory is already created
+
+# We are always building modules
+KBUILD_MODULES := 1
+.PHONY: crmodverdir
+crmodverdir: FORCE
+	$(Q)mkdir -p $(MODVERDIR)
+
+.PHONY: $(KBUILD_EXTMOD)
+$(KBUILD_EXTMOD): crmodverdir FORCE
+	$(Q)$(MAKE) $(build)=$@
+
+.PHONY: modules
+modules: $(KBUILD_EXTMOD)
+	@echo '  Building modules, stage 2.';
+	$(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost
+
+.PHONY: modules_install
+modules_install:
+	$(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modinst
+
+clean-dirs := _clean_$(KBUILD_EXTMOD)
+
+.PHONY: $(clean-dirs) clean
+$(clean-dirs):
+	$(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)
+
+clean:	rm-dirs := $(MODVERDIR)
+clean: $(clean-dirs)
+	$(call cmd,rmdirs)
+	@find $(KBUILD_EXTMOD) $(RCS_FIND_IGNORE) \
+	 	\( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
+		-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \) \
+		-type f -print | xargs rm -f
+
+help:
+	@echo  '  Building external modules.'
+	@echo  '  Syntax: make -C path/to/kernel/src M=$$PWD target'
+	@echo  ''
+	@echo  '  modules         - default target, build the module(s)'
+	@echo  '  modules_install - install the module'
+	@echo  '  clean           - remove generated files in module directory only'
+	@echo  ''
+endif # KBUILD_EXTMOD
+
+# Generate tags for editors
+# ---------------------------------------------------------------------------
+
+define all-sources
+	( find . $(RCS_FIND_IGNORE) \
+	       \( -name include -o -name arch \) -prune -o \
+	       -name '*.[chS]' -print; \
+	  find arch/$(ARCH) $(RCS_FIND_IGNORE) \
+	       -name '*.[chS]' -print; \
+	  find include $(RCS_FIND_IGNORE) \
+	       \( -name config -o -name 'asm-*' \) -prune \
+	       -o -name '*.[chS]' -print; \
+	  find include/asm-$(ARCH) $(RCS_FIND_IGNORE) \
+	       -name '*.[chS]' -print; \
+	  find include/asm-generic $(RCS_FIND_IGNORE) \
+	       -name '*.[chS]' -print )
+endef
+
+quiet_cmd_cscope-file = FILELST cscope.files
+      cmd_cscope-file = $(all-sources) > cscope.files
+
+quiet_cmd_cscope = MAKE    cscope.out
+      cmd_cscope = cscope -k -b -q
+
+cscope: FORCE
+	$(call cmd,cscope-file)
+	$(call cmd,cscope)
+
+quiet_cmd_TAGS = MAKE   $@
+cmd_TAGS = $(all-sources) | etags -
+
+# 	Exuberant ctags works better with -I
+
+quiet_cmd_tags = MAKE   $@
+define cmd_tags
+	rm -f $@; \
+	CTAGSF=`ctags --version | grep -i exuberant >/dev/null && echo "-I __initdata,__exitdata,EXPORT_SYMBOL,EXPORT_SYMBOL_NOVERS"`; \
+	$(all-sources) | xargs ctags $$CTAGSF -a
+endef
+
+TAGS: FORCE
+	$(call cmd,TAGS)
+
+tags: FORCE
+	$(call cmd,tags)
+
+
 # Scripts to check various things for consistency
 # ---------------------------------------------------------------------------
 
@@ -972,6 +1059,13 @@ endif #ifeq ($(mixed-targets),1)
 # FIXME Should go into a make.lib or something 
 # ===========================================================================
 
+quiet_cmd_rmdirs = $(if $(wildcard $(rm-dirs)),CLEAN   $(wildcard $(rm-dirs)))
+      cmd_rmdirs = rm -rf $(rm-dirs)
+
+quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN   $(wildcard $(rm-files)))
+      cmd_rmfiles = rm -f $(rm-files)
+
+
 a_flags = -Wp,-MD,$(depfile) $(AFLAGS) $(AFLAGS_KERNEL) \
 	  $(NOSTDINC_FLAGS) $(CPPFLAGS) \
 	  $(modkern_aflags) $(EXTRA_AFLAGS) $(AFLAGS_$(*F).o)
--- diff/arch/alpha/kernel/osf_sys.c	2004-03-11 10:20:19.000000000 +0000
+++ source/arch/alpha/kernel/osf_sys.c	2004-04-21 10:45:33.329636624 +0100
@@ -1095,14 +1095,12 @@ osf_getrusage(int who, struct rusage32 *
 		jiffies_to_timeval32(current->stime, &r.ru_stime);
 		r.ru_minflt = current->min_flt;
 		r.ru_majflt = current->maj_flt;
-		r.ru_nswap = current->nswap;
 		break;
 	case RUSAGE_CHILDREN:
 		jiffies_to_timeval32(current->cutime, &r.ru_utime);
 		jiffies_to_timeval32(current->cstime, &r.ru_stime);
 		r.ru_minflt = current->cmin_flt;
 		r.ru_majflt = current->cmaj_flt;
-		r.ru_nswap = current->cnswap;
 		break;
 	default:
 		jiffies_to_timeval32(current->utime + current->cutime,
@@ -1111,7 +1109,6 @@ osf_getrusage(int who, struct rusage32 *
 				   &r.ru_stime);
 		r.ru_minflt = current->min_flt + current->cmin_flt;
 		r.ru_majflt = current->maj_flt + current->cmaj_flt;
-		r.ru_nswap = current->nswap + current->cnswap;
 		break;
 	}
 
--- diff/arch/alpha/kernel/process.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/alpha/kernel/process.c	2004-04-21 10:45:33.334635864 +0100
@@ -513,8 +513,6 @@ thread_saved_pc(task_t *t)
 /*
  * These bracket the sleeping functions..
  */
-extern void scheduling_functions_start_here(void);
-extern void scheduling_functions_end_here(void);
 #define first_sched	((unsigned long) scheduling_functions_start_here)
 #define last_sched	((unsigned long) scheduling_functions_end_here)
 
--- diff/arch/alpha/kernel/semaphore.c	2004-03-11 10:20:19.000000000 +0000
+++ source/arch/alpha/kernel/semaphore.c	2004-04-21 10:45:33.334635864 +0100
@@ -7,6 +7,7 @@
 
 #include <linux/errno.h>
 #include <linux/sched.h>
+#include <linux/init.h>
 
 /*
  * This is basically the PPC semaphore scheme ported to use
@@ -60,7 +61,7 @@ static inline int __sem_update_count(str
  * Either form may be used in conjunction with "up()".
  */
 
-void
+void __sched
 __down_failed(struct semaphore *sem)
 {
 	struct task_struct *tsk = current;
@@ -101,7 +102,7 @@ __down_failed(struct semaphore *sem)
 #endif
 }
 
-int
+int __sched
 __down_failed_interruptible(struct semaphore *sem)
 {
 	struct task_struct *tsk = current;
@@ -159,7 +160,7 @@ __up_wakeup(struct semaphore *sem)
 	wake_up(&sem->wait);
 }
 
-void
+void __sched
 down(struct semaphore *sem)
 {
 #if WAITQUEUE_DEBUG
@@ -173,7 +174,7 @@ down(struct semaphore *sem)
 	__down(sem);
 }
 
-int
+int __sched
 down_interruptible(struct semaphore *sem)
 {
 #if WAITQUEUE_DEBUG
--- diff/arch/alpha/kernel/vmlinux.lds.S	2003-08-26 10:00:51.000000000 +0100
+++ source/arch/alpha/kernel/vmlinux.lds.S	2004-04-21 10:45:33.335635712 +0100
@@ -17,6 +17,7 @@ SECTIONS
   _text = .;					/* Text and read-only data */
   .text : { 
 	*(.text) 
+	SCHED_TEXT
 	*(.fixup)
 	*(.gnu.warning)
   } :kernel
--- diff/arch/alpha/lib/ev6-stxncpy.S	2003-08-26 10:00:51.000000000 +0100
+++ source/arch/alpha/lib/ev6-stxncpy.S	2004-04-21 10:45:33.340634952 +0100
@@ -365,7 +365,7 @@ $unaligned:
 	andnot	t2, t6, t12	# E : dest mask for a single word copy
 	or	t8, t10, t5	# E : test for end-of-count too
 
-	cmpbge	zero, t2, t3	# E :
+	cmpbge	zero, t12, t3	# E :
 	cmoveq	a2, t5, t8	# E : Latency=2, extra map slot
 	nop			# E : keep with cmoveq
 	andnot	t8, t3, t8	# E : (stall)
--- diff/arch/alpha/lib/stxncpy.S	2003-08-26 10:00:51.000000000 +0100
+++ source/arch/alpha/lib/stxncpy.S	2004-04-21 10:45:33.341634800 +0100
@@ -317,7 +317,7 @@ $unaligned:
 	cmpbge	zero, t1, t8	# .. e1 : is there a zero?
 	andnot	t2, t6, t12	# e0    : dest mask for a single word copy
 	or	t8, t10, t5	# .. e1 : test for end-of-count too
-	cmpbge	zero, t2, t3	# e0    :
+	cmpbge	zero, t12, t3	# e0    :
 	cmoveq	a2, t5, t8	# .. e1 :
 	andnot	t8, t3, t8	# e0    :
 	beq	t8, $u_head	# .. e1 (zdb)
--- diff/arch/arm/Kconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/arm/Kconfig	2004-04-21 10:45:33.342634648 +0100
@@ -135,6 +135,16 @@ config ARCH_SA1100
 config ARCH_SHARK
 	bool "Shark"
 
+config ARCH_S3C2410
+	bool "Samsung S3C2410"
+	help
+	  Samsung S3C2410X CPU based systems, such as the Simtec Electronics
+	  BAST (http://www.simtec.co.uk/products/EB110ITX/), the IPAQ 1940 or
+	  the Samsung SMDK2410 development board (and derviatives).
+
+config ARCH_OMAP
+	bool "TI OMAP"
+
 endchoice
 
 source "arch/arm/mach-clps711x/Kconfig"
@@ -151,6 +161,10 @@ source "arch/arm/mach-pxa/Kconfig"
 
 source "arch/arm/mach-sa1100/Kconfig"
 
+source "arch/arm/mach-omap/Kconfig"
+
+source "arch/arm/mach-s3c2410/Kconfig"
+
 # Definitions to make life easier
 config ARCH_ACORN
 	bool
@@ -500,7 +514,7 @@ config CMDLINE
 
 config LEDS
 	bool "Timer and CPU usage LEDs"
-	depends on ARCH_NETWINDER || ARCH_EBSA110 || ARCH_EBSA285 || ARCH_FTVPCI || ARCH_SHARK || ARCH_CO285 || ARCH_SA1100 || ARCH_LUBBOCK || ARCH_PXA_IDP || ARCH_INTEGRATOR || ARCH_CDB89712 || ARCH_P720T
+	depends on ARCH_NETWINDER || ARCH_EBSA110 || ARCH_EBSA285 || ARCH_FTVPCI || ARCH_SHARK || ARCH_CO285 || ARCH_SA1100 || ARCH_LUBBOCK || ARCH_PXA_IDP || ARCH_INTEGRATOR || ARCH_CDB89712 || ARCH_P720T || ARCH_OMAP
 	help
 	  If you say Y here, the LEDs on your machine will be used
 	  to provide useful information about your current system status.
@@ -514,7 +528,7 @@ config LEDS
 
 config LEDS_TIMER
 	bool "Timer LED" if LEDS && (ARCH_NETWINDER || ARCH_EBSA285 || ARCH_SHARK || ARCH_CO285 || ARCH_SA1100 || ARCH_LUBBOCK || ARCH_PXA_IDP || ARCH_INTEGRATOR || ARCH_P720T)
-	depends on ARCH_NETWINDER || ARCH_EBSA110 || ARCH_EBSA285 || ARCH_FTVPCI || ARCH_SHARK || ARCH_CO285 || ARCH_SA1100 || ARCH_LUBBOCK || ARCH_PXA_IDP || ARCH_INTEGRATOR || ARCH_CDB89712 || ARCH_P720T
+	depends on ARCH_NETWINDER || ARCH_EBSA110 || ARCH_EBSA285 || ARCH_FTVPCI || ARCH_SHARK || ARCH_CO285 || ARCH_SA1100 || ARCH_LUBBOCK || ARCH_PXA_IDP || ARCH_INTEGRATOR || ARCH_CDB89712 || ARCH_P720T || ARCH_OMAP
 	default y if ARCH_EBSA110
 	help
 	  If you say Y here, one of the system LEDs (the green one on the
@@ -719,6 +733,18 @@ config DEBUG_LL
 	  in the kernel.  This is helpful if you are debugging code that
 	  executes before the console is initialized.
 
+config DEBUG_ICEDCC
+	bool "Kernel low-level debugging via EmbeddedICE DCC channel"
+	depends on DEBUG_LL
+	help
+	  Say Y here if you want the debug print routines to direct their
+	  output to the EmbeddedICE macrocell's DCC channel using
+	  co-processor 14. This is known to work on the ARM9 style ICE
+	  channel.
+
+	  It does include a timeout to ensure that the system does not
+	  totally freeze when there is nothing connected to read.
+
 config DEBUG_DC21285_PORT
 	bool "Kernel low-level debugging messages via footbridge serial port"
 	depends on DEBUG_LL && FOOTBRIDGE
@@ -736,6 +762,23 @@ config DEBUG_CLPS711X_UART2
 	  output to the second serial port on these devices.  Saying N will
 	  cause the debug messages to appear on the first serial port.
 
+config DEBUG_S3C2410_PORT
+	depends on DEBUG_LL && ARCH_S3C2410
+	bool "Kernel low-level debugging messages via S3C2410 UART"
+	help
+	  Say Y here if you want debug print routines to go to one of the
+	  S3C2410 internal UARTs. The chosen UART must have been configured
+	  before it is used.
+
+config DEBUG_S3C2410_UART
+	int
+	depends on DEBUG_LL && ARCH_S3C2410
+	default "0"
+	help
+	  Choice for UART for kernel low-level using S3C2410 UARTS,
+	  should be between zero and two. The port must have been
+	  initalised by the boot-loader before use.
+
 endmenu
 
 source "security/Kconfig"
--- diff/arch/arm/Makefile	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/arm/Makefile	2004-04-21 10:45:33.342634648 +0100
@@ -7,7 +7,7 @@
 #
 # Copyright (C) 1995-2001 by Russell King
 
-LDFLAGS_vmlinux	:=-p -X
+LDFLAGS_vmlinux	:=-p --no-undefined -X
 LDFLAGS_BLOB	:=--format binary
 AFLAGS_vmlinux.lds.o = -DTEXTADDR=$(TEXTADDR) -DDATAADDR=$(DATAADDR)
 OBJCOPYFLAGS	:=-O binary -R .note -R .comment -S
@@ -47,6 +47,7 @@ tune-$(CONFIG_CPU_ARM710)	:=-mtune=arm71
 tune-$(CONFIG_CPU_ARM720T)	:=-mtune=arm7tdmi
 tune-$(CONFIG_CPU_ARM920T)	:=-mtune=arm9tdmi
 tune-$(CONFIG_CPU_ARM922T)	:=-mtune=arm9tdmi
+tune-$(CONFIG_CPU_ARM925T)	:=-mtune=arm9tdmi
 tune-$(CONFIG_CPU_ARM926T)	:=-mtune=arm9tdmi
 tune-$(CONFIG_CPU_SA110)	:=-mtune=strongarm110
 tune-$(CONFIG_CPU_SA1100)	:=-mtune=strongarm1100
@@ -91,12 +92,14 @@ textaddr-$(CONFIG_ARCH_CLPS711X)   := 0x
 textaddr-$(CONFIG_ARCH_FORTUNET)   := 0xc0008000
  machine-$(CONFIG_ARCH_IOP3XX)	   := iop3xx
  machine-$(CONFIG_ARCH_ADIFCC)	   := adifcc
+ machine-$(CONFIG_ARCH_OMAP)	   := omap
+ machine-$(CONFIG_ARCH_S3C2410)	   := s3c2410
 
 TEXTADDR := $(textaddr-y)
 ifeq ($(incdir-y),)
 incdir-y := $(machine-y)
 endif
-INCDIR   := $(incdir-y)
+INCDIR   := arch-$(incdir-y)
   
 export	TEXTADDR GZFLAGS
 
@@ -130,8 +133,13 @@ boot := arch/arm/boot
 #	last, otherwise make uses the target directory mtime.
 
 include/asm-arm/.arch: $(wildcard include/config/arch/*.h) include/config/MARKER
-	@echo '  SYMLINK include/asm-arm/arch -> include/asm-arm/arch-$(INCDIR)'
-	@ln -fsn arch-$(INCDIR) include/asm-arm/arch
+	@echo '  SYMLINK include/asm-arm/arch -> include/asm-arm/$(INCDIR)'
+ifneq ($(KBUILD_SRC),)
+	$(Q)mkdir -p include/asm-arm
+	$(Q)ln -fsn $(srctree)/include/asm-arm/$(INCDIR) include/asm-arm/arch
+else
+	$(Q)ln -fsn $(INCDIR) include/asm-arm/arch
+endif
 	@touch $@
 
 prepare: maketools include/asm-arm/.arch
--- diff/arch/arm/boot/Makefile	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/arm/boot/Makefile	2004-04-21 10:45:33.343634496 +0100
@@ -51,6 +51,11 @@ initrd_phys-$(CONFIG_ARCH_SA1100)	:= 0xc
 params_phys-$(CONFIG_ARCH_IOP3XX)	:= 0xa0000100
    zreladdr-$(CONFIG_ARCH_ADIFCC)	:= 0xc0008000
 params_phys-$(CONFIG_ARCH_ADIFCC)	:= 0xc0000100
+   zreladdr-$(CONFIG_ARCH_OMAP)		:= 0x10008000
+params_phys-$(CONFIG_ARCH_OMAP)		:= 0x10000100
+initrd_phys-$(CONFIG_ARCH_OMAP)		:= 0x10800000
+   zreladdr-$(CONFIG_ARCH_S3C2410)	:= 0x30008000
+params_phys-$(CONFIG_ARCH_S3C2410)	:= 0x30000100
 
 ZRELADDR    := $(zreladdr-y)
 ZTEXTADDR   := $(ztextaddr-y)
--- diff/arch/arm/boot/compressed/Makefile	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/arm/boot/compressed/Makefile	2004-04-21 10:45:33.343634496 +0100
@@ -55,14 +55,18 @@ ifeq ($(CONFIG_CPU_XSCALE),y)
 OBJS		+= head-xscale.o
 endif
 
+ifeq ($(CONFIG_DEBUG_ICEDCC),y)
+OBJS            += ice-dcc.o
+endif
+
 SEDFLAGS	= s/TEXT_START/$(ZTEXTADDR)/;s/LOAD_ADDR/$(ZRELADDR)/;s/BSS_START/$(ZBSSADDR)/
 
 targets       := vmlinux vmlinux.lds piggy piggy.gz piggy.o \
                  font.o head.o $(OBJS)
 EXTRA_CFLAGS  := -fpic
-EXTRA_AFLAGS  := -traditional
+EXTRA_AFLAGS  :=
 
-LDFLAGS_vmlinux := -p -X \
+LDFLAGS_vmlinux := -p --no-undefined -X \
 	$(shell $(CC) $(CFLAGS) --print-libgcc-file-name) -T
 
 $(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.o \
--- diff/arch/arm/boot/compressed/head.S	2004-03-11 10:20:19.000000000 +0000
+++ source/arch/arm/boot/compressed/head.S	2004-04-21 10:45:33.343634496 +0100
@@ -25,6 +25,12 @@
 		.macro	writeb, rb
 		str	\rb, [r3, #0x160]
 		.endm
+#elif defined(CONFIG_DEBUG_ICEDCC)
+		.macro	loadsp, rb
+		.endm
+		.macro writeb, rb
+		mcr	p14, 0, \rb, c0, c1, 0
+		.endm
 #elif defined(CONFIG_FOOTBRIDGE)
 		.macro	loadsp,	rb
 		mov	\rb, #0x7c000000
--- diff/arch/arm/boot/compressed/misc.c	2003-09-30 15:46:10.000000000 +0100
+++ source/arch/arm/boot/compressed/misc.c	2004-04-21 10:45:33.344634344 +0100
@@ -18,15 +18,30 @@
 
 unsigned int __machine_arch_type;
 
-#include <linux/kernel.h>
+#include <linux/string.h>
 
-#include <asm/uaccess.h>
 #include <asm/arch/uncompress.h>
 
 #ifdef STANDALONE_DEBUG
 #define puts printf
 #endif
 
+#ifdef CONFIG_DEBUG_ICEDCC
+#define puts icedcc_puts
+#define putc icedcc_putc
+
+extern void idedcc_putc(int ch);
+
+static void
+icedcc_puts(const char *ptr)
+{
+	for (; *ptr != '\0'; ptr++) {
+		icedcc_putc(*ptr);
+	}
+}
+
+#endif
+
 #define __ptr_t void *
 
 /*
--- diff/arch/arm/configs/neponset_defconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/arm/configs/neponset_defconfig	2004-04-21 10:45:33.345634192 +0100
@@ -848,7 +848,6 @@ CONFIG_USB_MOUSE=m
 # CONFIG_USB_TIGL is not set
 # CONFIG_USB_AUERSWALD is not set
 # CONFIG_USB_RIO500 is not set
-# CONFIG_USB_BRLVGER is not set
 # CONFIG_USB_LCD is not set
 # CONFIG_USB_TEST is not set
 
--- diff/arch/arm/kernel/armksyms.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/arm/kernel/armksyms.c	2004-04-21 10:45:33.347633888 +0100
@@ -28,7 +28,6 @@
 #include <asm/elf.h>
 #include <asm/io.h>
 #include <asm/irq.h>
-#include <asm/pgalloc.h>
 #include <asm/proc-fns.h>
 #include <asm/processor.h>
 #include <asm/semaphore.h>
@@ -73,8 +72,6 @@ extern void fp_init(union fp_state *);
  * This has a special calling convention; it doesn't
  * modify any of the usual registers, except for LR.
  */
-extern void __do_softirq(void);
-
 #define EXPORT_SYMBOL_ALIAS(sym,orig)		\
  const struct kernel_symbol __ksymtab_##sym	\
   __attribute__((section("__ksymtab"))) =	\
@@ -88,7 +85,6 @@ EXPORT_SYMBOL_ALIAS(kern_fp_enter,fp_ent
 EXPORT_SYMBOL_ALIAS(fp_printk,printk);
 EXPORT_SYMBOL_ALIAS(fp_send_sig,send_sig);
 
-EXPORT_SYMBOL_NOVERS(__do_softirq);
 EXPORT_SYMBOL_NOVERS(__backtrace);
 
 	/* platform dependent support */
--- diff/arch/arm/kernel/bios32.c	2003-09-30 15:46:11.000000000 +0100
+++ source/arch/arm/kernel/bios32.c	2004-04-21 10:45:33.347633888 +0100
@@ -12,9 +12,7 @@
 #include <linux/slab.h>
 #include <linux/init.h>
 
-#include <asm/bug.h>
 #include <asm/io.h>
-#include <asm/irq.h>
 #include <asm/mach-types.h>
 #include <asm/mach/pci.h>
 
--- diff/arch/arm/kernel/debug.S	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/arm/kernel/debug.S	2004-04-21 10:45:33.348633736 +0100
@@ -44,6 +44,34 @@
 		beq	1001b
 		.endm
 
+#elif defined(CONFIG_DEBUG_ICEDCC)
+		@@ debug using ARM EmbeddedICE DCC channel
+		.macro	addruart, rx
+		.endm
+
+		.macro	senduart, rd, rx
+		mcr	p14, 0, \rd, c1, c0, 0
+		.endm
+
+		.macro	busyuart, rd, rx
+1001:
+		mrc	p14, 0, \rx, c0, c0, 0
+		tst	\rx, #2
+		beq	1001b
+
+		.endm
+
+		.macro	waituart, rd, rx
+		mov	\rd, #0x2000000
+1001:
+		subs	\rd, \rd, #1
+		bmi	1002f
+		mrc	p14, 0, \rx, c0, c0, 0
+		tst	\rx, #2
+		bne	1001b
+1002:
+		.endm
+
 #elif defined(CONFIG_ARCH_EBSA110)
 		.macro	addruart,rx
 		mov	\rx, #0xf0000000
@@ -287,7 +315,7 @@
 
 #elif defined(CONFIG_ARCH_INTEGRATOR)
 
-#include <asm/hardware/serial_amba.h>
+#include <asm/hardware/amba_serial.h>
 
 		.macro	addruart,rx
 		mrc	p15, 0, \rx, c1, c0
@@ -298,7 +326,7 @@
 		.endm
 
 		.macro	senduart,rd,rx
-		strb	\rd, [\rx, #AMBA_UARTDR]
+		strb	\rd, [\rx, #UART01x_DR]
 		.endm
 
 		.macro	waituart,rd,rx
@@ -436,6 +464,92 @@
 		tst	\rd, #0x10
 		beq	1001b
 		.endm
+
+#elif defined(CONFIG_ARCH_OMAP)
+
+#include <asm/arch/serial.h>
+
+		.macro	addruart,rx
+		mov	\rx, #0xff000000
+		orr	\rx, \rx, #0x00fb0000
+		.endm
+
+		.macro	senduart,rd,rx
+		strb	\rd, [\rx]
+		.endm
+
+		.macro	busyuart,rd,rx
+1002:		ldrb	\rd, [\rx, #(0x5 << OMAP_SERIAL_REG_SHIFT)]
+		and	\rd, \rd, #0x60
+		teq	\rd, #0x60
+		bne	1002b
+		.endm
+
+		.macro	waituart,rd,rx
+1001:		ldrb	\rd, [\rx, #(0x6 << OMAP_SERIAL_REG_SHIFT)]
+		tst	\rd, #0x10
+		beq	1001b
+		.endm
+
+#elif defined(CONFIG_ARCH_S3C2410)
+#include <asm/arch/map.h>
+#include <asm/arch/regs-serial.h>
+
+		.macro addruart, rx
+		mrc	p15, 0, \rx, c1, c0
+		tst	\rx, #1
+		ldreq	\rx, = S3C2410_PA_UART
+		ldrne	\rx, = S3C2410_VA_UART
+#if CONFIG_DEBUG_S3C2410_UART != 0
+		add	\rx, \rx, #(S3C2410_UART1_OFF * CONFIG_DEBUG_S3C2410_UART)
+#endif
+		.endm
+
+		.macro	senduart,rd,rx
+		str	\rd, [\rx, # S3C2410_UTXH ]
+		.endm
+
+		.macro	busyuart, rd, rx
+		ldr	\rd, [ \rx, # S3C2410_UFCON ]
+		tst	\rd, #S3C2410_UFCON_FIFOMODE	@ fifo enabled?
+		beq	1001f				@
+		@ FIFO enabled...
+1003:
+		ldr	\rd, [ \rx, # S3C2410_UFSTAT ]
+		tst	\rd, #S3C2410_UFSTAT_TXFULL
+		bne	1003b
+		b	1002f
+
+1001:
+		@ busy waiting for non fifo
+		ldr	\rd, [ \rx, # S3C2410_UTRSTAT ]
+		tst	\rd, #S3C2410_UTRSTAT_TXFE
+		beq	1001b
+
+1002:		@ exit busyuart
+		.endm
+
+		.macro	waituart,rd,rx
+
+		ldr	\rd, [ \rx, # S3C2410_UFCON ]
+		tst	\rd, #S3C2410_UFCON_FIFOMODE	@ fifo enabled?
+		beq	1001f				@
+		@ FIFO enabled...
+1003:
+		ldr	\rd, [ \rx, # S3C2410_UFSTAT ]
+		ands	\rd, \rd, #15<<S3C2410_UFSTAT_TXSHIFT
+		bne	1003b
+		b	1002f
+
+1001:
+		@ idle waiting for non fifo
+		ldr	\rd, [ \rx, # S3C2410_UTRSTAT ]
+		tst	\rd, #S3C2410_UTRSTAT_TXFE
+		beq	1001b
+
+1002:		@ exit busyuart
+		.endm
+
 #else
 #error Unknown architecture
 #endif
--- diff/arch/arm/kernel/ecard.c	2003-09-30 15:46:11.000000000 +0100
+++ source/arch/arm/kernel/ecard.c	2004-04-21 10:45:33.349633584 +0100
@@ -45,7 +45,6 @@
 #include <asm/hardware.h>
 #include <asm/io.h>
 #include <asm/irq.h>
-#include <asm/pgalloc.h>
 #include <asm/mmu_context.h>
 #include <asm/mach/irq.h>
 #include <asm/tlbflush.h>
@@ -908,6 +907,42 @@ static ssize_t ecard_show_device(struct 
 
 static DEVICE_ATTR(device, S_IRUGO, ecard_show_device, NULL);
 
+
+int ecard_request_resources(struct expansion_card *ec)
+{
+	int i, err = 0;
+
+	for (i = 0; i < ECARD_NUM_RESOURCES; i++) {
+		if (ecard_resource_end(ec, i) &&
+		    !request_mem_region(ecard_resource_start(ec, i),
+					ecard_resource_len(ec, i),
+					ec->dev.driver->name)) {
+			err = -EBUSY;
+			break;
+		}
+	}
+
+	if (err) {
+		while (i--)
+			if (ecard_resource_end(ec, i))
+				release_mem_region(ecard_resource_start(ec, i),
+						   ecard_resource_len(ec, i));
+	}
+	return err;
+}
+EXPORT_SYMBOL(ecard_request_resources);
+
+void ecard_release_resources(struct expansion_card *ec)
+{
+	int i;
+
+	for (i = 0; i < ECARD_NUM_RESOURCES; i++)
+		if (ecard_resource_end(ec, i))
+			release_mem_region(ecard_resource_start(ec, i),
+					   ecard_resource_len(ec, i));
+}
+EXPORT_SYMBOL(ecard_release_resources);
+
 /*
  * Probe for an expansion card.
  *
--- diff/arch/arm/kernel/entry-armv.S	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/arm/kernel/entry-armv.S	2004-04-21 10:45:33.349633584 +0100
@@ -608,6 +608,156 @@ ENTRY(soft_irq_mask)
 		.macro	irq_prio_table
 		.endm
 
+#elif defined(CONFIG_ARCH_OMAP)
+
+		.macro	disable_fiq
+		.endm
+
+		.macro	get_irqnr_and_base, irqnr, irqstat, base, tmp
+		ldr	\base, =IO_ADDRESS(OMAP_IH1_BASE)
+		ldr	\irqnr, [\base, #IRQ_ITR]
+		ldr	\tmp, [\base, #IRQ_MIR]
+		mov	\irqstat, #0xffffffff
+		bic	\tmp, \irqstat, \tmp
+		tst	\irqnr, \tmp
+		beq	1510f
+
+		ldr	\irqnr, [\base, #IRQ_SIR_FIQ]
+		cmp	\irqnr, #0
+		ldreq	\irqnr, [\base, #IRQ_SIR_IRQ]
+		cmpeq	\irqnr, #INT_IH2_IRQ
+		ldreq	\base, =IO_ADDRESS(OMAP_IH2_BASE)
+		ldreq	\irqnr, [\base, #IRQ_SIR_IRQ]
+		addeqs	\irqnr, \irqnr, #32
+1510:
+		.endm
+
+		.macro	irq_prio_table
+		.endm
+
+#elif defined(CONFIG_ARCH_S3C2410)
+		/* S3C2410X IRQ Handler, <ben@simtec.co.uk> */
+
+		.macro	get_irqnr_and_base, irqnr, irqstat, base, tmp
+
+30000:
+		mov	\tmp, #S3C2410_VA_IRQ
+		ldr	\irqnr, [ \tmp, #0x14 ]		@ get irq no
+		teq	\irqnr, #4
+		teqne	\irqnr, #5
+		beq	1002f				@ external irq reg
+		teq	\irqnr, #16
+		beq	1003f				@ lcd controller
+
+		@ debug check to see if interrupt reported is the same
+		@ as the offset....
+
+		teq	\irqnr, #0
+		beq	20002f
+		ldr	\irqstat, [ \tmp, #0x10 ]	@ INTPND
+		mov	\irqstat, \irqstat, lsr \irqnr
+		tst	\irqstat, #1
+		bne	20002f
+
+#if 1
+		stmfd	r13!, { r0 - r4 , r14 }
+		ldr	r1,	[ \tmp, #0x14 ]		@ intoffset
+		ldr	r2,	[ \tmp, #0x10 ]		@ INTPND
+		ldr	r3,	[ \tmp, #0x00 ]		@ SRCPND
+		adr	r0, 20003f
+		bl	printk
+		b	20004f
+#endif
+20003:
+		.ascii	"<7>irq: err - bad offset %d, intpnd=%08x, srcpnd=%08x\n"
+		.byte	0
+		.align	4
+20004:
+		mov	r1, #1
+		mov	\tmp, #S3C2410_VA_IRQ
+		ldmfd	r13!, { r0 - r4 , r14 }
+
+		@ try working out interript number for ourselves
+		mov	\irqnr, #0
+		ldr	\irqstat, [ \tmp, #0x10 ]	@ INTPND
+10021:
+		movs	\irqstat, \irqstat, lsr#1
+		bcs	30000b		@ try and re-start the proccess
+		add	\irqnr, \irqnr, #1
+		cmp	\irqnr, #32
+		ble	10021b
+
+		@ found no interrupt, set Z flag and leave
+		movs	\irqnr, #0
+		b	1001f
+
+20005:
+20002:		@ exit
+		@ we base the s3c2410x interrupts at 16 and above to allow
+		@ isa peripherals to have their standard interrupts, also
+		@ ensure that Z flag is un-set on exit
+
+		@ note, we cannot be sure if we get IRQ_EINT0 (0) that
+		@ there is simply no interrupt pending, so in all other
+		@ cases we jump to say we have found something, otherwise
+		@ we check to see if the interrupt really is assrted
+		adds	\irqnr, \irqnr, #IRQ_EINT0
+		teq	\irqnr, #IRQ_EINT0
+		bne	1001f				@ exit
+		ldr	\irqstat, [ \tmp, #0x10 ]	@ INTPND
+		teq	\irqstat, #0
+		moveq	\irqnr, #0
+		b	1001f
+
+		@ we get here from no main or external interrupts pending
+1002:
+		add	\tmp, \tmp, #S3C2410_VA_GPIO - S3C2410_VA_IRQ
+		ldr	\irqstat, [ \tmp, # 0xa8 ]	@ EXTINTPEND
+		ldr	\irqnr, [ \tmp, # 0xa4 ]	@ EXTINTMASK
+
+		bic	\irqstat, \irqstat, \irqnr	@ clear masked irqs
+
+		mov	\irqnr, #IRQ_EINT4		@ start extint nos
+		mov	\irqstat, \irqstat, lsr#4	@ ignore bottom 4 bits
+10021:
+		movs	\irqstat, \irqstat, lsr#1
+		bcs	1004f
+		add	\irqnr, \irqnr, #1
+		cmp	\irqnr, #IRQ_EINT23
+		ble	10021b
+
+		@ found no interrupt, set Z flag and leave
+		movs	\irqnr, #0
+		b	1001f
+
+1003:
+		@ lcd interrupt has been asserted...
+		add	\tmp, \tmp, #S3C2410_VA_LCD - S3C2410_VA_IRQ
+		ldr	\irqstat, [ \tmp, # 0x54 ]	@ lcd int pending
+
+		tst	\irqstat, #2
+		movne	\irqnr, #IRQ_LCD_FRAME
+		tst	\irqstat, #1
+		movne	\irqnr, #IRQ_LCD_FIFO
+
+		@ fall through to exit with flags updated
+
+1004:		@ ensure Z flag clear in case our MOVS shifted out the last bit
+		teq	\irqnr, #0
+1001:
+		@ exit irq routine
+		.endm
+
+
+		/* currently don't need an disable_fiq macro */
+
+		.macro	disable_fiq
+		.endm
+
+		/* we don't have an irq priority table */
+		.macro irq_prio_table
+		.endm
+
 #else
 #error Unknown architecture
 #endif
--- diff/arch/arm/kernel/entry-common.S	2003-09-30 15:46:11.000000000 +0100
+++ source/arch/arm/kernel/entry-common.S	2004-04-21 10:45:33.350633432 +0100
@@ -22,15 +22,6 @@
 #error "Please fix"
 #endif
 
-/*
- * Our do_softirq out of line code.  See include/asm-arm/hardirq.h for
- * the calling assembly.
- */
-ENTRY(__do_softirq)
-	stmfd	sp!, {r0 - r3, ip, lr}
-	bl	do_softirq
-	ldmfd	sp!, {r0 - r3, ip, pc}
-
 	.align	5
 /*
  * This is the fast syscall return path.  We do as little as
--- diff/arch/arm/kernel/fiq.c	2004-01-19 10:22:54.000000000 +0000
+++ source/arch/arm/kernel/fiq.c	2004-04-21 10:45:33.350633432 +0100
@@ -37,15 +37,12 @@
  */
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/mman.h>
 #include <linux/init.h>
 #include <linux/seq_file.h>
 
+#include <asm/cacheflush.h>
 #include <asm/fiq.h>
-#include <asm/io.h>
 #include <asm/irq.h>
-#include <asm/pgalloc.h>
 #include <asm/system.h>
 #include <asm/uaccess.h>
 
--- diff/arch/arm/kernel/process.c	2004-02-18 08:54:06.000000000 +0000
+++ source/arch/arm/kernel/process.c	2004-04-21 10:45:33.351633280 +0100
@@ -414,8 +414,6 @@ pid_t kernel_thread(int (*fn)(void *), v
 /*
  * These bracket the sleeping functions..
  */
-extern void scheduling_functions_start_here(void);
-extern void scheduling_functions_end_here(void);
 #define first_sched	((unsigned long) scheduling_functions_start_here)
 #define last_sched	((unsigned long) scheduling_functions_end_here)
 
--- diff/arch/arm/kernel/ptrace.c	2004-02-09 10:36:07.000000000 +0000
+++ source/arch/arm/kernel/ptrace.c	2004-04-21 10:45:33.351633280 +0100
@@ -526,7 +526,7 @@ core_initcall(ptrace_break_init);
  * actually access the pt_regs stored on the kernel stack.
  */
 static int ptrace_read_user(struct task_struct *tsk, unsigned long off,
-			    unsigned long *ret)
+			    unsigned long __user *ret)
 {
 	unsigned long tmp;
 
@@ -559,7 +559,7 @@ static int ptrace_write_user(struct task
 /*
  * Get all user integer registers.
  */
-static int ptrace_getregs(struct task_struct *tsk, void *uregs)
+static int ptrace_getregs(struct task_struct *tsk, void __user *uregs)
 {
 	struct pt_regs *regs = get_user_regs(tsk);
 
@@ -569,7 +569,7 @@ static int ptrace_getregs(struct task_st
 /*
  * Set all user integer registers.
  */
-static int ptrace_setregs(struct task_struct *tsk, void *uregs)
+static int ptrace_setregs(struct task_struct *tsk, void __user *uregs)
 {
 	struct pt_regs newregs;
 	int ret;
@@ -591,7 +591,7 @@ static int ptrace_setregs(struct task_st
 /*
  * Get the child FPU state.
  */
-static int ptrace_getfpregs(struct task_struct *tsk, void *ufp)
+static int ptrace_getfpregs(struct task_struct *tsk, void __user *ufp)
 {
 	return copy_to_user(ufp, &tsk->thread_info->fpstate,
 			    sizeof(struct user_fp)) ? -EFAULT : 0;
@@ -600,7 +600,7 @@ static int ptrace_getfpregs(struct task_
 /*
  * Set the child FPU state.
  */
-static int ptrace_setfpregs(struct task_struct *tsk, void *ufp)
+static int ptrace_setfpregs(struct task_struct *tsk, void __user *ufp)
 {
 	struct thread_info *thread = tsk->thread_info;
 	thread->used_cp[1] = thread->used_cp[2] = 1;
@@ -628,7 +628,7 @@ static int do_ptrace(int request, struct
 			break;
 
 		case PTRACE_PEEKUSR:
-			ret = ptrace_read_user(child, addr, (unsigned long *)data);
+			ret = ptrace_read_user(child, addr, (unsigned long __user *)data);
 			break;
 
 		/*
@@ -704,19 +704,19 @@ static int do_ptrace(int request, struct
 			break;
 
 		case PTRACE_GETREGS:
-			ret = ptrace_getregs(child, (void *)data);
+			ret = ptrace_getregs(child, (void __user *)data);
 			break;
 
 		case PTRACE_SETREGS:
-			ret = ptrace_setregs(child, (void *)data);
+			ret = ptrace_setregs(child, (void __user *)data);
 			break;
 
 		case PTRACE_GETFPREGS:
-			ret = ptrace_getfpregs(child, (void *)data);
+			ret = ptrace_getfpregs(child, (void __user *)data);
 			break;
 		
 		case PTRACE_SETFPREGS:
-			ret = ptrace_setfpregs(child, (void *)data);
+			ret = ptrace_setfpregs(child, (void __user *)data);
 			break;
 
 		default:
--- diff/arch/arm/kernel/semaphore.c	2003-09-30 15:46:11.000000000 +0100
+++ source/arch/arm/kernel/semaphore.c	2004-04-21 10:45:33.352633128 +0100
@@ -13,6 +13,7 @@
  */
 #include <linux/sched.h>
 #include <linux/errno.h>
+#include <linux/init.h>
 
 #include <asm/semaphore.h>
 
@@ -54,7 +55,7 @@ void __up(struct semaphore *sem)
 
 static spinlock_t semaphore_lock = SPIN_LOCK_UNLOCKED;
 
-void __down(struct semaphore * sem)
+void __sched __down(struct semaphore * sem)
 {
 	struct task_struct *tsk = current;
 	DECLARE_WAITQUEUE(wait, tsk);
@@ -87,7 +88,7 @@ void __down(struct semaphore * sem)
 	wake_up(&sem->wait);
 }
 
-int __down_interruptible(struct semaphore * sem)
+int __sched __down_interruptible(struct semaphore * sem)
 {
 	int retval = 0;
 	struct task_struct *tsk = current;
@@ -176,7 +177,8 @@ int __down_trylock(struct semaphore * se
  * registers (r0 to r3 and lr), but not ip, as we use it as a return
  * value in some cases..
  */
-asm("	.align	5				\n\
+asm("	.section .sched.text			\n\
+	.align	5				\n\
 	.globl	__down_failed			\n\
 __down_failed:					\n\
 	stmfd	sp!, {r0 - r3, lr}		\n\
--- diff/arch/arm/kernel/signal.c	2003-11-25 15:24:57.000000000 +0000
+++ source/arch/arm/kernel/signal.c	2004-04-21 10:45:33.352633128 +0100
@@ -8,22 +8,13 @@
  * published by the Free Software Foundation.
  */
 #include <linux/config.h>
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/signal.h>
-#include <linux/wait.h>
 #include <linux/ptrace.h>
 #include <linux/personality.h>
-#include <linux/tty.h>
-#include <linux/binfmts.h>
-#include <linux/elf.h>
 #include <linux/suspend.h>
 
-#include <asm/pgalloc.h>
+#include <asm/cacheflush.h>
 #include <asm/ucontext.h>
 #include <asm/uaccess.h>
 #include <asm/unistd.h>
@@ -76,7 +67,7 @@ asmlinkage int sys_sigsuspend(int restar
 }
 
 asmlinkage int
-sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, struct pt_regs *regs)
+sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize, struct pt_regs *regs)
 {
 	sigset_t saveset, newset;
 
@@ -104,8 +95,8 @@ sys_rt_sigsuspend(sigset_t *unewset, siz
 }
 
 asmlinkage int 
-sys_sigaction(int sig, const struct old_sigaction *act,
-	      struct old_sigaction *oact)
+sys_sigaction(int sig, const struct old_sigaction __user *act,
+	      struct old_sigaction __user *oact)
 {
 	struct k_sigaction new_ka, old_ka;
 	int ret;
@@ -147,15 +138,15 @@ struct sigframe
 
 struct rt_sigframe
 {
-	struct siginfo *pinfo;
-	void *puc;
+	struct siginfo __user *pinfo;
+	void __user *puc;
 	struct siginfo info;
 	struct ucontext uc;
 	unsigned long retcode;
 };
 
 static int
-restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc)
+restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
 {
 	int err = 0;
 
@@ -184,7 +175,7 @@ restore_sigcontext(struct pt_regs *regs,
 
 asmlinkage int sys_sigreturn(struct pt_regs *regs)
 {
-	struct sigframe *frame;
+	struct sigframe __user *frame;
 	sigset_t set;
 
 	/* Always make any pending restarted system calls return -EINTR */
@@ -198,7 +189,7 @@ asmlinkage int sys_sigreturn(struct pt_r
 	if (regs->ARM_sp & 7)
 		goto badframe;
 
-	frame = (struct sigframe *)regs->ARM_sp;
+	frame = (struct sigframe __user *)regs->ARM_sp;
 
 	if (verify_area(VERIFY_READ, frame, sizeof (*frame)))
 		goto badframe;
@@ -232,7 +223,7 @@ badframe:
 
 asmlinkage int sys_rt_sigreturn(struct pt_regs *regs)
 {
-	struct rt_sigframe *frame;
+	struct rt_sigframe __user *frame;
 	sigset_t set;
 
 	/* Always make any pending restarted system calls return -EINTR */
@@ -246,7 +237,7 @@ asmlinkage int sys_rt_sigreturn(struct p
 	if (regs->ARM_sp & 7)
 		goto badframe;
 
-	frame = (struct rt_sigframe *)regs->ARM_sp;
+	frame = (struct rt_sigframe __user *)regs->ARM_sp;
 
 	if (verify_area(VERIFY_READ, frame, sizeof (*frame)))
 		goto badframe;
@@ -276,7 +267,7 @@ badframe:
 }
 
 static int
-setup_sigcontext(struct sigcontext *sc, /*struct _fpstate *fpstate,*/
+setup_sigcontext(struct sigcontext __user *sc, /*struct _fpstate *fpstate,*/
 		 struct pt_regs *regs, unsigned long mask)
 {
 	int err = 0;
@@ -307,7 +298,7 @@ setup_sigcontext(struct sigcontext *sc, 
 	return err;
 }
 
-static inline void *
+static inline void __user *
 get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, int framesize)
 {
 	unsigned long sp = regs->ARM_sp;
@@ -321,12 +312,12 @@ get_sigframe(struct k_sigaction *ka, str
 	/*
 	 * ATPCS B01 mandates 8-byte alignment
 	 */
-	return (void *)((sp - framesize) & ~7);
+	return (void __user *)((sp - framesize) & ~7);
 }
 
 static int
 setup_return(struct pt_regs *regs, struct k_sigaction *ka,
-	     unsigned long *rc, void *frame, int usig)
+	     unsigned long __user *rc, void __user *frame, int usig)
 {
 	unsigned long handler = (unsigned long)ka->sa.sa_handler;
 	unsigned long retcode;
@@ -387,7 +378,7 @@ setup_return(struct pt_regs *regs, struc
 static int
 setup_frame(int usig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *regs)
 {
-	struct sigframe *frame = get_sigframe(ka, regs, sizeof(*frame));
+	struct sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame));
 	int err = 0;
 
 	if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
@@ -410,7 +401,7 @@ static int
 setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
 	       sigset_t *set, struct pt_regs *regs)
 {
-	struct rt_sigframe *frame = get_sigframe(ka, regs, sizeof(*frame));
+	struct rt_sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame));
 	int err = 0;
 
 	if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
--- diff/arch/arm/kernel/sys_arm.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/arm/kernel/sys_arm.c	2004-04-21 10:45:33.353632976 +0100
@@ -37,7 +37,7 @@ extern unsigned long do_mremap(unsigned 
  * sys_pipe() is the normal C calling standard for creating
  * a pipe. It's not the way unix traditionally does this, though.
  */
-asmlinkage int sys_pipe(unsigned long * fildes)
+asmlinkage int sys_pipe(unsigned long __user *fildes)
 {
 	int fd[2];
 	int error;
@@ -94,7 +94,7 @@ struct mmap_arg_struct {
 	unsigned long offset;
 };
 
-asmlinkage int old_mmap(struct mmap_arg_struct *arg)
+asmlinkage int old_mmap(struct mmap_arg_struct __user *arg)
 {
 	int error = -EFAULT;
 	struct mmap_arg_struct a;
@@ -141,11 +141,11 @@ out:
 
 struct sel_arg_struct {
 	unsigned long n;
-	fd_set *inp, *outp, *exp;
-	struct timeval *tvp;
+	fd_set __user *inp, *outp, *exp;
+	struct timeval __user *tvp;
 };
 
-asmlinkage int old_select(struct sel_arg_struct *arg)
+asmlinkage int old_select(struct sel_arg_struct __user *arg)
 {
 	struct sel_arg_struct a;
 
@@ -160,7 +160,8 @@ asmlinkage int old_select(struct sel_arg
  *
  * This is really horribly ugly.
  */
-asmlinkage int sys_ipc (uint call, int first, int second, int third, void *ptr, long fifth)
+asmlinkage int sys_ipc(uint call, int first, int second, int third,
+		       void __user *ptr, long fifth)
 {
 	int version, ret;
 
@@ -169,28 +170,28 @@ asmlinkage int sys_ipc (uint call, int f
 
 	switch (call) {
 	case SEMOP:
-		return sys_semop (first, (struct sembuf *)ptr, second);
+		return sys_semop(first, (struct sembuf __user *)ptr, second);
 	case SEMGET:
 		return sys_semget (first, second, third);
 	case SEMCTL: {
 		union semun fourth;
 		if (!ptr)
 			return -EINVAL;
-		if (get_user(fourth.__pad, (void **) ptr))
+		if (get_user(fourth.__pad, (void __user **) ptr))
 			return -EFAULT;
 		return sys_semctl (first, second, third, fourth);
 	}
 
 	case MSGSND:
-		return sys_msgsnd (first, (struct msgbuf *) ptr, 
-				   second, third);
+		return sys_msgsnd(first, (struct msgbuf __user *) ptr, 
+				  second, third);
 	case MSGRCV:
 		switch (version) {
 		case 0: {
 			struct ipc_kludge tmp;
 			if (!ptr)
 				return -EINVAL;
-			if (copy_from_user(&tmp,(struct ipc_kludge *) ptr,
+			if (copy_from_user(&tmp,(struct ipc_kludge __user *)ptr,
 					   sizeof (tmp)))
 				return -EFAULT;
 			return sys_msgrcv (first, tmp.msgp, second,
@@ -198,36 +199,36 @@ asmlinkage int sys_ipc (uint call, int f
 		}
 		default:
 			return sys_msgrcv (first,
-					   (struct msgbuf *) ptr,
+					   (struct msgbuf __user *) ptr,
 					   second, fifth, third);
 		}
 	case MSGGET:
 		return sys_msgget ((key_t) first, second);
 	case MSGCTL:
-		return sys_msgctl (first, second, (struct msqid_ds *) ptr);
+		return sys_msgctl(first, second, (struct msqid_ds __user *)ptr);
 
 	case SHMAT:
 		switch (version) {
 		default: {
 			ulong raddr;
-			ret = do_shmat (first, (char *) ptr, second, &raddr);
+			ret = do_shmat(first, (char __user *)ptr, second, &raddr);
 			if (ret)
 				return ret;
-			return put_user (raddr, (ulong *) third);
+			return put_user(raddr, (ulong __user *)third);
 		}
 		case 1:	/* iBCS2 emulator entry point */
 			if (!segment_eq(get_fs(), get_ds()))
 				return -EINVAL;
-			return do_shmat (first, (char *) ptr,
-					  second, (ulong *) third);
+			return do_shmat(first, (char __user *) ptr,
+					second, (ulong __user *) third);
 		}
 	case SHMDT: 
-		return sys_shmdt ((char *)ptr);
+		return sys_shmdt ((char __user *)ptr);
 	case SHMGET:
 		return sys_shmget (first, second, third);
 	case SHMCTL:
 		return sys_shmctl (first, second,
-				   (struct shmid_ds *) ptr);
+				   (struct shmid_ds __user *) ptr);
 	default:
 		return -ENOSYS;
 	}
@@ -266,7 +267,8 @@ asmlinkage int sys_vfork(struct pt_regs 
 /* sys_execve() executes a new program.
  * This is called indirectly via a small wrapper
  */
-asmlinkage int sys_execve(char *filenamei, char **argv, char **envp, struct pt_regs *regs)
+asmlinkage int sys_execve(char __user *filenamei, char __user * __user *argv,
+			  char __user * __user *envp, struct pt_regs *regs)
 {
 	int error;
 	char * filename;
--- diff/arch/arm/kernel/traps.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/arm/kernel/traps.c	2004-04-21 10:45:33.353632976 +0100
@@ -14,23 +14,16 @@
  */
 #include <linux/config.h>
 #include <linux/module.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
 #include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/mm.h>
 #include <linux/spinlock.h>
 #include <linux/personality.h>
 #include <linux/ptrace.h>
-#include <linux/elf.h>
-#include <linux/interrupt.h>
 #include <linux/kallsyms.h>
 #include <linux/init.h>
 
 #include <asm/atomic.h>
+#include <asm/cacheflush.h>
 #include <asm/io.h>
-#include <asm/pgalloc.h>
-#include <asm/pgtable.h>
 #include <asm/system.h>
 #include <asm/uaccess.h>
 #include <asm/unistd.h>
@@ -204,6 +197,7 @@ void show_stack(struct task_struct *tsk,
 		asm("mov%? %0, fp" : "=r" (fp));
 
 	c_backtrace(fp, 0x10);
+	barrier();
 }
 
 spinlock_t die_lock = SPIN_LOCK_UNLOCKED;
--- diff/arch/arm/kernel/vmlinux.lds.S	2004-02-18 08:54:06.000000000 +0000
+++ source/arch/arm/kernel/vmlinux.lds.S	2004-04-21 10:45:33.353632976 +0100
@@ -73,6 +73,7 @@ SECTIONS
 	.text : {			/* Real text segment		*/
 		_text = .;		/* Text and read-only data	*/
 			*(.text)
+			SCHED_TEXT
 			*(.fixup)
 			*(.gnu.warning)
 			*(.rodata)
--- diff/arch/arm/lib/getuser.S	2002-10-16 04:29:07.000000000 +0100
+++ source/arch/arm/lib/getuser.S	2004-04-21 10:45:33.354632824 +0100
@@ -28,6 +28,7 @@
  */
 #include <asm/constants.h>
 #include <asm/thread_info.h>
+#include <asm/errno.h>
 
 	.global	__get_user_1
 __get_user_1:
@@ -89,7 +90,7 @@ __get_user_bad_8:
 	mov	r2, #0
 __get_user_bad:
 	mov	r1, #0
-	mov	r0, #-14
+	mov	r0, #-EFAULT
 	mov	pc, lr
 
 .section __ex_table, "a"
--- diff/arch/arm/lib/putuser.S	2003-06-30 10:07:18.000000000 +0100
+++ source/arch/arm/lib/putuser.S	2004-04-21 10:45:33.354632824 +0100
@@ -28,6 +28,7 @@
  */
 #include <asm/constants.h>
 #include <asm/thread_info.h>
+#include <asm/errno.h>
 
 	.global	__put_user_1
 __put_user_1:
@@ -87,7 +88,7 @@ __put_user_8:
 	/* fall through */
 
 __put_user_bad:
-	mov	r0, #-14
+	mov	r0, #-EFAULT
 	mov	pc, lr
 
 .section __ex_table, "a"
--- diff/arch/arm/mach-footbridge/Kconfig	2002-11-11 11:09:35.000000000 +0000
+++ source/arch/arm/mach-footbridge/Kconfig	2004-04-21 10:45:33.354632824 +0100
@@ -22,7 +22,7 @@ config ARCH_PERSONAL_SERVER
 	  There are no product plans beyond the current research
 	  prototypes at this time.  Information is available at:
 
-	  <http://crl.research.compaq.com/projects/personalserver/>
+	  <http://www.crl.hpl.hp.com/projects/personalserver/>
 
 	  If you have any questions or comments about the  Compaq Personal
 	  Server, send e-mail to skiff@crl.dec.com.
--- diff/arch/arm/mach-sa1100/h3600.c	2003-09-30 15:46:11.000000000 +0100
+++ source/arch/arm/mach-sa1100/h3600.c	2004-04-21 10:45:33.368630696 +0100
@@ -481,7 +481,7 @@ static void h3800_control_egpio(enum ipa
 	case IPAQ_EGPIO_CODEC_NRESET:
 	case IPAQ_EGPIO_AUDIO_ON:
 	case IPAQ_EGPIO_QMUTE:
-		printk(__FUNCTION__ ": error - should not be called\n");
+		printk("%s: error - should not be called\n", __FUNCTION__);
 		break;
 	case IPAQ_EGPIO_OPT_NVRAM_ON:
 		SET_ASIC2(GPIO2_OPT_ON_NVRAM);
@@ -523,7 +523,7 @@ static int h3800_pm_callback(int req)
 	static u16 asic2_data;
 	int result = 0;
 
-	printk(__FUNCTION__ " %d\n", req);
+	printk("%s %d\n", __FUNCTION__, req);
 
 	switch (req) {
 	case PM_RESUME:
@@ -551,7 +551,7 @@ static int h3800_pm_callback(int req)
 		asic2_data = H3800_ASIC2_GPIOPIOD;
 		break;
 	default:
-		printk(__FUNCTION__ ": unrecognized PM callback\n");
+		printk("%s: unrecognized PM callback\n", __FUNCTION__);
 		break;
 	}
 	return result;
@@ -591,7 +591,7 @@ static void h3800_IRQ_demux(unsigned int
 {
 	int i;
 
-	if (0) printk(__FUNCTION__ ": interrupt received\n");
+	if (0) printk("%s: interrupt received\n", __FUNCTION__);
 
 	desc->chip->ack(irq);
 
@@ -601,21 +601,21 @@ static void h3800_IRQ_demux(unsigned int
 
 		/* KPIO */
 		irq = H3800_ASIC2_KPIINTFLAG;
-		if (0) printk(__FUNCTION__" KPIO 0x%08X\n", irq);
+		if (0) printk("%s KPIO 0x%08X\n", __FUNCTION__, irq);
 		for (j = 0; j < H3800_KPIO_IRQ_COUNT; j++)
 			if (irq & kpio_irq_mask[j])
 				do_edge_IRQ(H3800_KPIO_IRQ_COUNT + j, irq_desc + H3800_KPIO_IRQ_COUNT + j, regs);
 
 		/* GPIO2 */
 		irq = H3800_ASIC2_GPIINTFLAG;
-		if (0) printk(__FUNCTION__" GPIO 0x%08X\n", irq);
+		if (0) printk("%s GPIO 0x%08X\n", __FUNCTION__, irq);
 		for (j = 0; j < H3800_GPIO_IRQ_COUNT; j++)
 			if (irq & gpio_irq_mask[j])
 				do_edge_IRQ(H3800_GPIO_IRQ_COUNT + j, irq_desc + H3800_GPIO_IRQ_COUNT + j , regs);
 	}
 
 	if (i >= MAX_ASIC_ISR_LOOPS)
-		printk(__FUNCTION__ ": interrupt processing overrun\n");
+		printk("%s: interrupt processing overrun\n", __FUNCTION__);
 
 	/* For level-based interrupts */
 	desc->chip->unmask(irq);
--- diff/arch/arm/mm/Kconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/arm/mm/Kconfig	2004-04-21 10:45:33.369630544 +0100
@@ -58,8 +58,9 @@ config CPU_ARM720T
 
 # ARM920T
 config CPU_ARM920T
-	bool "Support ARM920T processor"
-	depends on ARCH_INTEGRATOR
+	bool "Support ARM920T processor" if !ARCH_S3C2410
+	depends on ARCH_INTEGRATOR || ARCH_S3C2410
+	default y if ARCH_S3C2410
 	select CPU_32v4
 	select CPU_ABRT_EV4T
 	select CPU_CACHE_V4WT
@@ -67,7 +68,9 @@ config CPU_ARM920T
 	select CPU_TLB_V4WBI
 	help
 	  The ARM920T is licensed to be produced by numerous vendors,
-	  and is used in the Maverick EP9312.  More information at
+	  and is used in the Maverick EP9312 and the Samsung S3C2410.
+
+	  More information on the Maverick EP9312 at
 	  <http://linuxdevices.com/products/PD2382866068.html>.
 
 	  Say Y if you want support for the ARM920T processor.
@@ -352,7 +355,7 @@ config CPU_BIG_ENDIAN
 
 config CPU_ICACHE_DISABLE
 	bool "Disable I-Cache"
-	depends on CPU_ARM920T || CPU_ARM922T ||  CPU_ARM925T || CPU_ARM926T || CPU_ARM1020
+	depends on CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM1020
 	help
 	  Say Y here to disable the processor instruction cache. Unless
 	  you have a reason not to or are unsure, say N.
@@ -366,7 +369,7 @@ config CPU_DCACHE_DISABLE
 
 config CPU_DCACHE_WRITETHROUGH
 	bool "Force write through D-cache"
-	depends on (CPU_ARM920T || CPU_ARM922T ||  CPU_ARM925T || CPU_ARM926T || CPU_ARM1020) && !CPU_DISABLE_DCACHE
+	depends on (CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM1020) && !CPU_DISABLE_DCACHE
 	help
 	  Say Y here to use the data cache in writethough mode. Unless you
 	  specifically require this or are unsure, say N.
--- diff/arch/arm/mm/alignment.c	2003-02-26 16:01:06.000000000 +0000
+++ source/arch/arm/mm/alignment.c	2004-04-21 10:45:33.369630544 +0100
@@ -10,22 +10,14 @@
  */
 #include <linux/config.h>
 #include <linux/compiler.h>
-#include <linux/signal.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/string.h>
-#include <linux/types.h>
 #include <linux/ptrace.h>
-#include <linux/mman.h>
-#include <linux/mm.h>
 #include <linux/proc_fs.h>
-#include <linux/bitops.h>
 #include <linux/init.h>
 
-#include <asm/system.h>
 #include <asm/uaccess.h>
-#include <asm/pgalloc.h>
-#include <asm/pgtable.h>
 #include <asm/unaligned.h>
 
 #include "fault.h"
@@ -112,10 +104,10 @@ proc_alignment_read(char *page, char **s
 	return len;
 }
 
-static int proc_alignment_write(struct file *file, const char *buffer,
+static int proc_alignment_write(struct file *file, const char __user *buffer,
 			       unsigned long count, void *data)
 {
-	int mode;
+	char mode;
 
 	if (count > 0) {
 		if (get_user(mode, buffer))
--- diff/arch/arm/mm/consistent.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/arm/mm/consistent.c	2004-04-21 10:45:33.370630392 +0100
@@ -12,17 +12,14 @@
 #include <linux/module.h>
 #include <linux/mm.h>
 #include <linux/slab.h>
-#include <linux/string.h>
-#include <linux/interrupt.h>
 #include <linux/errno.h>
 #include <linux/list.h>
 #include <linux/init.h>
 #include <linux/device.h>
 #include <linux/dma-mapping.h>
 
+#include <asm/cacheflush.h>
 #include <asm/io.h>
-#include <asm/pgtable.h>
-#include <asm/pgalloc.h>
 #include <asm/tlbflush.h>
 
 #define CONSISTENT_BASE	(0xffc00000)
@@ -162,6 +159,7 @@ __dma_alloc(struct device *dev, size_t s
 	if ((limit && size >= limit) || size >= (CONSISTENT_END - CONSISTENT_BASE)) {
 		printk(KERN_WARNING "coherent allocation too big (requested %#x mask %#Lx)\n",
 		       size, mask);
+		*handle = ~0;
 		return NULL;
 	}
 
--- diff/arch/arm/mm/copypage-v6.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/arm/mm/copypage-v6.c	2004-04-21 10:45:33.370630392 +0100
@@ -12,7 +12,6 @@
 #include <linux/mm.h>
 
 #include <asm/page.h>
-#include <asm/pgalloc.h>
 #include <asm/pgtable.h>
 #include <asm/shmparam.h>
 #include <asm/tlbflush.h>
--- diff/arch/arm/mm/fault-armv.c	2003-09-30 15:46:11.000000000 +0100
+++ source/arch/arm/mm/fault-armv.c	2004-04-21 10:45:33.370630392 +0100
@@ -19,7 +19,6 @@
 
 #include <asm/cacheflush.h>
 #include <asm/io.h>
-#include <asm/pgalloc.h>
 #include <asm/pgtable.h>
 #include <asm/tlbflush.h>
 
@@ -186,19 +185,20 @@ no_pmd:
 
 void __flush_dcache_page(struct page *page)
 {
+	struct address_space *mapping = page_mapping(page);
 	struct mm_struct *mm = current->active_mm;
 	struct list_head *l;
 
 	__cpuc_flush_dcache_page(page_address(page));
 
-	if (!page->mapping)
+	if (!mapping)
 		return;
 
 	/*
 	 * With a VIVT cache, we need to also write back
 	 * and invalidate any user data.
 	 */
-	list_for_each(l, &page->mapping->i_mmap_shared) {
+	list_for_each(l, &mapping->i_mmap_shared) {
 		struct vm_area_struct *mpnt;
 		unsigned long off;
 
@@ -224,17 +224,23 @@ void __flush_dcache_page(struct page *pa
 static void
 make_coherent(struct vm_area_struct *vma, unsigned long addr, struct page *page, int dirty)
 {
+	struct address_space *mapping = page_mapping(page);
 	struct list_head *l;
 	struct mm_struct *mm = vma->vm_mm;
-	unsigned long pgoff = (addr - vma->vm_start) >> PAGE_SHIFT;
+	unsigned long pgoff;
 	int aliases = 0;
 
+	if (!mapping)
+		return;
+
+	pgoff = vma->vm_pgoff + ((addr - vma->vm_start) >> PAGE_SHIFT);
+
 	/*
 	 * If we have any shared mappings that are in the same mm
 	 * space, then we need to handle them specially to maintain
 	 * cache coherency.
 	 */
-	list_for_each(l, &page->mapping->i_mmap_shared) {
+	list_for_each(l, &mapping->i_mmap_shared) {
 		struct vm_area_struct *mpnt;
 		unsigned long off;
 
@@ -242,7 +248,7 @@ make_coherent(struct vm_area_struct *vma
 
 		/*
 		 * If this VMA is not in our MM, we can ignore it.
-		 * Note that we intentionally don't mask out the VMA
+		 * Note that we intentionally mask out the VMA
 		 * that we are fixing up.
 		 */
 		if (mpnt->vm_mm != mm || mpnt == vma)
@@ -292,7 +298,7 @@ void update_mmu_cache(struct vm_area_str
 	if (!pfn_valid(pfn))
 		return;
 	page = pfn_to_page(pfn);
-	if (page->mapping) {
+	if (page_mapping(page)) {
 		int dirty = test_and_clear_bit(PG_dcache_dirty, &page->flags);
 
 		if (dirty)
--- diff/arch/arm/mm/fault-common.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/arm/mm/fault-common.c	2004-04-21 10:45:33.371630240 +0100
@@ -164,6 +164,9 @@ do_bad_area(struct task_struct *tsk, str
 		__do_kernel_fault(mm, addr, fsr, regs);
 }
 
+#define VM_FAULT_BADMAP		(-20)
+#define VM_FAULT_BADACCESS	(-21)
+
 static int
 __do_page_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr,
 		struct task_struct *tsk)
@@ -172,7 +175,7 @@ __do_page_fault(struct mm_struct *mm, un
 	int fault, mask;
 
 	vma = find_vma(mm, addr);
-	fault = -2; /* bad map area */
+	fault = VM_FAULT_BADMAP;
 	if (!vma)
 		goto out;
 	if (vma->vm_start > addr)
@@ -188,7 +191,7 @@ good_area:
 	else
 		mask = VM_WRITE;
 
-	fault = -1; /* bad access type */
+	fault = VM_FAULT_BADACCESS;
 	if (!(vma->vm_flags & mask))
 		goto out;
 
@@ -204,16 +207,15 @@ survive:
 	 * Handle the "normal" cases first - successful and sigbus
 	 */
 	switch (fault) {
-	case 2:
+	case VM_FAULT_MAJOR:
 		tsk->maj_flt++;
 		return fault;
-	case 1:
+	case VM_FAULT_MINOR:
 		tsk->min_flt++;
-	case 0:
+	case VM_FAULT_SIGBUS:
 		return fault;
 	}
 
-	fault = -3; /* out of memory */
 	if (tsk->pid != 1)
 		goto out;
 
@@ -271,7 +273,7 @@ int do_page_fault(unsigned long addr, un
 	if (!user_mode(regs))
 		goto no_context;
 
-	if (fault == -3) {
+	if (fault == VM_FAULT_OOM) {
 		/*
 		 * We ran out of memory, or some other thing happened to
 		 * us that made us unable to handle the page fault gracefully.
@@ -279,7 +281,7 @@ int do_page_fault(unsigned long addr, un
 		printk("VM: killing process %s\n", tsk->comm);
 		do_exit(SIGKILL);
 	} else
-		__do_user_fault(tsk, addr, fsr, fault == -1 ?
+		__do_user_fault(tsk, addr, fsr, fault == VM_FAULT_BADACCESS ?
 				SEGV_ACCERR : SEGV_MAPERR, regs);
 	return 0;
 
--- diff/arch/arm/mm/init.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/arm/mm/init.c	2004-04-21 10:45:33.371630240 +0100
@@ -8,24 +8,15 @@
  * published by the Free Software Foundation.
  */
 #include <linux/config.h>
-#include <linux/signal.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/types.h>
 #include <linux/ptrace.h>
-#include <linux/mman.h>
-#include <linux/mm.h>
 #include <linux/swap.h>
-#include <linux/smp.h>
 #include <linux/init.h>
 #include <linux/bootmem.h>
 #include <linux/initrd.h>
 
-#include <asm/segment.h>
 #include <asm/mach-types.h>
-#include <asm/pgalloc.h>
-#include <asm/dma.h>
 #include <asm/hardware.h>
 #include <asm/setup.h>
 #include <asm/tlb.h>
--- diff/arch/arm/mm/ioremap.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/arm/mm/ioremap.c	2004-04-21 10:45:33.372630088 +0100
@@ -24,8 +24,7 @@
 #include <linux/mm.h>
 #include <linux/vmalloc.h>
 
-#include <asm/page.h>
-#include <asm/pgalloc.h>
+#include <asm/cacheflush.h>
 #include <asm/io.h>
 #include <asm/tlbflush.h>
 
--- diff/arch/arm/mm/minicache.c	2003-09-30 15:46:11.000000000 +0100
+++ source/arch/arm/mm/minicache.c	2004-04-21 10:45:33.372630088 +0100
@@ -17,7 +17,6 @@
 #include <linux/mm.h>
 
 #include <asm/page.h>
-#include <asm/pgalloc.h>
 #include <asm/pgtable.h>
 #include <asm/tlbflush.h>
 
--- diff/arch/arm/mm/mm-armv.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/arm/mm/mm-armv.c	2004-04-21 10:45:33.372630088 +0100
@@ -16,7 +16,6 @@
 #include <linux/bootmem.h>
 #include <linux/highmem.h>
 
-#include <asm/pgtable.h>
 #include <asm/pgalloc.h>
 #include <asm/page.h>
 #include <asm/rmap.h>
--- diff/arch/arm/mm/mmu.c	2003-08-26 10:00:51.000000000 +0100
+++ source/arch/arm/mm/mmu.c	2004-04-21 10:45:33.373629936 +0100
@@ -12,7 +12,6 @@
 #include <linux/mm.h>
 
 #include <asm/mmu_context.h>
-#include <asm/pgalloc.h>
 #include <asm/tlbflush.h>
 
 unsigned int cpu_last_asid = { 1 << ASID_BITS };
--- diff/arch/arm/mm/tlb-v4wbi.S	2003-09-30 15:46:11.000000000 +0100
+++ source/arch/arm/mm/tlb-v4wbi.S	2004-04-21 10:45:33.373629936 +0100
@@ -10,7 +10,7 @@
  *  ARM architecture version 4 and version 5 TLB handling functions.
  *  These assume a split I/D TLBs, with a write buffer.
  *
- *  Processors: ARM920 ARM922 ARM926 XScale
+ *  Processors: ARM920 ARM922 ARM925 ARM926 XScale
  */
 #include <linux/linkage.h>
 #include <linux/init.h>
--- diff/arch/arm/oprofile/Makefile	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/arm/oprofile/Makefile	2004-04-21 10:45:33.373629936 +0100
@@ -7,3 +7,5 @@ DRIVER_OBJS = $(addprefix ../../../drive
 		timer_int.o )
 
 oprofile-y				:= $(DRIVER_OBJS) init.o
+oprofile-$(CONFIG_CPU_XSCALE)		+= common.o op_model_xscale.o
+
--- diff/arch/arm/oprofile/init.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/arm/oprofile/init.c	2004-04-21 10:45:33.374629784 +0100
@@ -2,6 +2,7 @@
  * @file init.c
  *
  * @remark Copyright 2004 Oprofile Authors
+ * @remark Read the file COPYING
  *
  * @author Zwane Mwaikambo
  */
@@ -9,14 +10,21 @@
 #include <linux/oprofile.h>
 #include <linux/init.h>
 #include <linux/errno.h>
+#include "op_arm_model.h"
 
-int oprofile_arch_init(struct oprofile_operations **ops)
+int __init oprofile_arch_init(struct oprofile_operations **ops)
 {
 	int ret = -ENODEV;
 
+#ifdef CONFIG_CPU_XSCALE
+	ret = pmu_init(ops, &op_xscale_spec);
+#endif
 	return ret;
 }
 
 void oprofile_arch_exit(void)
 {
+#ifdef CONFIG_CPU_XSCALE
+	pmu_exit();
+#endif
 }
--- diff/arch/arm/tools/Makefile	2002-11-18 10:11:54.000000000 +0000
+++ source/arch/arm/tools/Makefile	2004-04-21 10:45:33.375629632 +0100
@@ -4,6 +4,6 @@
 # Copyright (C) 2001 Russell King
 #
 
-include/asm-arm/mach-types.h: $(obj)/mach-types $(obj)/gen-mach-types
+include/asm-arm/mach-types.h: $(src)/gen-mach-types $(src)/mach-types
 	@echo '  Generating $@'
-	@$(AWK) -f $(obj)/gen-mach-types $(obj)/mach-types > $@
+	$(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; }
--- diff/arch/arm/tools/mach-types	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/arm/tools/mach-types	2004-04-21 10:45:33.376629480 +0100
@@ -6,7 +6,7 @@
 # To add an entry into this database, please see Documentation/arm/README,
 # or contact rmk@arm.linux.org.uk
 #
-# Last update: Sat Mar 13 14:36:30 2004
+# Last update: Thu Apr 15 10:14:37 2004
 #
 # machine_is_xxx	CONFIG_xxxx		MACH_TYPE_xxx		number
 #
@@ -390,9 +390,9 @@ espd_4510b		ARCH_ESPD_4510B		ESPD_4510B	
 mp1x			ARCH_MP1X		MP1X			379
 at91rm9200tb		ARCH_AT91RM9200TB	AT91RM9200TB		380
 adsvgx			ARCH_ADSVGX		ADSVGX			381
-omap1610		ARCH_OMAP1610		OMAP1610		382
+omap_h2			ARCH_OMAP_H2		OMAP_H2			382
 pelee			ARCH_PELEE		PELEE			383
-e7xx			ARCH_E7XX		E7XX			384
+e740			MACH_E740		E740			384
 iq80331			ARCH_IQ80331		IQ80331			385
 versatile_pb		ARCH_VERSATILE_PB	VERSATILE_PB		387
 kev7a400		MACH_KEV7A400		KEV7A400		388
@@ -485,3 +485,41 @@ phoenix			MACH_PHOENIX		PHOENIX			474
 vr1000			MACH_VR1000		VR1000			475
 deisterpxa		MACH_DEISTERPXA		DEISTERPXA		476
 bcm1160			MACH_BCM1160		BCM1160			477
+pcm022			MACH_PCM022		PCM022			478
+adsgcx			MACH_ADSGCX		ADSGCX			479
+dreadnaught		MACH_DREADNAUGHT	DREADNAUGHT		480
+dm320			MACH_DM320		DM320			481
+markov			MACH_MARKOV		MARKOV			482
+cos7a400		MACH_COS7A400		COS7A400		483
+milano			MACH_MILANO		MILANO			484
+ue9328			MACH_UE9328		UE9328			485
+uex255			MACH_UEX255		UEX255			486
+ue2410			MACH_UE2410		UE2410			487
+a620			MACH_A620		A620			488
+ocelot			MACH_OCELOT		OCELOT			489
+cheetah			MACH_CHEETAH		CHEETAH			490
+omap_perseus2		MACH_OMAP_PERSEUS2	OMAP_PERSEUS2		491
+zvue			MACH_ZVUE		ZVUE			492
+roverp1			MACH_ROVERP1		ROVERP1			493
+asidial2		MACH_ASIDIAL2		ASIDIAL2		494
+s3c24a0			MACH_S3C24A0		S3C24A0			495
+e800			MACH_E800		E800			496
+e750			MACH_E750		E750			497
+s3c5500			MACH_S3C5500		S3C5500			498
+smdk5500		MACH_SMDK5500		SMDK5500		499
+signalsync		MACH_SIGNALSYNC		SIGNALSYNC		500
+nbc			MACH_NBC		NBC			501
+er4525			MACH_ER4525		ER4525			502
+netbookpro		MACH_NETBOOKPRO		NETBOOKPRO		503
+hw90200			MACH_HW90200		HW90200			504
+condor			MACH_CONDOR		CONDOR			505
+cup			MACH_CUP		CUP			506
+kite			MACH_KITE		KITE			507
+scb9328			MACH_SCB9328		SCB9328			508
+omap_h3			MACH_OMAP_H3		OMAP_H3			509
+omap_h4			MACH_OMAP_H4		OMAP_H4			510
+n10			MACH_N10		N10			511
+montajade		MACH_MONTAJADE		MONTAJADE		512
+sg560			MACH_SG560		SG560			513
+dp1000			MACH_DP1000		DP1000			514
+omap_osk		MACH_OMAP_OSK		OMAP_OSK		515
--- diff/arch/arm26/kernel/process.c	2004-02-18 08:54:06.000000000 +0000
+++ source/arch/arm26/kernel/process.c	2004-04-21 10:45:33.379629024 +0100
@@ -400,8 +400,6 @@ pid_t kernel_thread(int (*fn)(void *), v
 /*
  * These bracket the sleeping functions..
  */
-extern void scheduling_functions_start_here(void);
-extern void scheduling_functions_end_here(void);
 #define first_sched	((unsigned long) scheduling_functions_start_here)
 #define last_sched	((unsigned long) scheduling_functions_end_here)
 
--- diff/arch/arm26/kernel/semaphore.c	2003-06-30 10:07:18.000000000 +0100
+++ source/arch/arm26/kernel/semaphore.c	2004-04-21 10:45:33.382628568 +0100
@@ -15,6 +15,7 @@
 #include <linux/config.h>
 #include <linux/sched.h>
 #include <linux/errno.h>
+#include <linux/init.h>
 
 #include <asm/semaphore.h>
 
@@ -56,7 +57,7 @@ void __up(struct semaphore *sem)
 
 static spinlock_t semaphore_lock = SPIN_LOCK_UNLOCKED;
 
-void __down(struct semaphore * sem)
+void __sched __down(struct semaphore * sem)
 {
 	struct task_struct *tsk = current;
 	DECLARE_WAITQUEUE(wait, tsk);
@@ -89,7 +90,7 @@ void __down(struct semaphore * sem)
 	wake_up(&sem->wait);
 }
 
-int __down_interruptible(struct semaphore * sem)
+int __sched __down_interruptible(struct semaphore * sem)
 {
 	int retval = 0;
 	struct task_struct *tsk = current;
@@ -178,7 +179,8 @@ int __down_trylock(struct semaphore * se
  * registers (r0 to r3 and lr), but not ip, as we use it as a return
  * value in some cases..
  */
-asm("	.align	5				\n\
+asm("	.section .sched.text			\n\
+	.align	5				\n\
 	.globl	__down_failed			\n\
 __down_failed:					\n\
 	stmfd	sp!, {r0 - r3, lr}		\n\
--- diff/arch/arm26/kernel/vmlinux-arm26-xip.lds.in	2003-09-17 12:28:01.000000000 +0100
+++ source/arch/arm26/kernel/vmlinux-arm26-xip.lds.in	2004-04-21 10:45:33.382628568 +0100
@@ -66,6 +66,7 @@ SECTIONS
 	.text : {			/* Real text segment		*/
 		_text = .;		/* Text and read-only data	*/
 			*(.text)
+			SCHED_TEXT
 			*(.fixup)
 			*(.gnu.warning)
 			*(.rodata)
--- diff/arch/arm26/kernel/vmlinux-arm26.lds.in	2003-09-17 12:28:01.000000000 +0100
+++ source/arch/arm26/kernel/vmlinux-arm26.lds.in	2004-04-21 10:45:33.383628416 +0100
@@ -67,6 +67,7 @@ SECTIONS
 	.text : {			/* Real text segment		*/
 		_text = .;		/* Text and read-only data	*/
 			*(.text)
+			SCHED_TEXT
 			*(.fixup)
 			*(.gnu.warning)
 			*(.rodata)
--- diff/arch/arm26/machine/small_page.c	2003-06-30 10:07:18.000000000 +0100
+++ source/arch/arm26/machine/small_page.c	2004-04-21 10:45:33.391627200 +0100
@@ -95,7 +95,7 @@ again:
 		offset = ffz(USED_MAP(page));
 		SET_USED(page, offset);
 		if (USED_MAP(page) == order->all_used)
-			list_del_init(&page->list);
+			list_del_init(&page->lru);
 		spin_unlock_irqrestore(&small_page_lock, flags);
 
 		return (unsigned long) page_address(page) + (offset << order->shift);
@@ -110,7 +110,7 @@ need_new_page:
 				goto no_page;
 			SetPageReserved(page);
 			USED_MAP(page) = 0;
-			list_add(&page->list, &order->queue);
+			list_add(&page->lru, &order->queue);
 			goto again;
 		}
 
@@ -151,7 +151,7 @@ static void __free_small_page(unsigned l
 		spin_lock_irqsave(&small_page_lock, flags);
 
 		if (USED_MAP(page) == order->all_used)
-			list_add(&page->list, &order->queue);
+			list_add(&page->lru, &order->queue);
 
 		if (!TEST_AND_CLEAR_USED(page, spage))
 			goto already_free;
@@ -167,7 +167,7 @@ free_page:
 	/*
 	 * unlink the page from the small page queue and free it
 	 */
-	list_del_init(&page->list);
+	list_del_init(&page->lru);
 	spin_unlock_irqrestore(&small_page_lock, flags);
 	ClearPageReserved(page);
 	__free_page(page);
--- diff/arch/cris/arch-v10/kernel/process.c	2003-07-11 09:39:49.000000000 +0100
+++ source/arch/cris/arch-v10/kernel/process.c	2004-04-21 10:45:33.391627200 +0100
@@ -16,6 +16,7 @@
 #include <linux/err.h>
 #include <linux/fs.h>
 #include <linux/slab.h>
+#include <linux/init.h>
 
 #ifdef CONFIG_ETRAX_GPIO
 void etrax_gpio_wake_up_check(void); /* drivers/gpio.c */
@@ -216,8 +217,6 @@ asmlinkage int sys_execve(const char *fn
  * These bracket the sleeping functions..
  */
 
-extern void scheduling_functions_start_here(void);
-extern void scheduling_functions_end_here(void);
 #define first_sched     ((unsigned long) scheduling_functions_start_here)
 #define last_sched      ((unsigned long) scheduling_functions_end_here)
 
--- diff/arch/cris/arch-v10/vmlinux.lds.S	2003-07-11 09:39:49.000000000 +0100
+++ source/arch/cris/arch-v10/vmlinux.lds.S	2004-04-21 10:45:33.391627200 +0100
@@ -25,6 +25,7 @@ SECTIONS
 	__stext = .;
 	.text : {
 		*(.text)
+		SCHED_TEXT
 		*(.fixup)
 		*(.text.__*)
 	}
--- diff/arch/cris/kernel/semaphore.c	2002-10-16 04:27:50.000000000 +0100
+++ source/arch/cris/kernel/semaphore.c	2004-04-21 10:45:33.392627048 +0100
@@ -4,6 +4,7 @@
  */
 
 #include <linux/sched.h>
+#include <linux/init.h>
 #include <asm/semaphore-helper.h>
 
 /*
@@ -94,7 +95,7 @@ void __up(struct semaphore *sem)
 	tsk->state = TASK_RUNNING;		\
 	remove_wait_queue(&sem->wait, &wait);
 
-void __down(struct semaphore * sem)
+void __sched __down(struct semaphore * sem)
 {
 	DOWN_VAR
 	DOWN_HEAD(TASK_UNINTERRUPTIBLE)
@@ -104,7 +105,7 @@ void __down(struct semaphore * sem)
 	DOWN_TAIL(TASK_UNINTERRUPTIBLE)
 }
 
-int __down_interruptible(struct semaphore * sem)
+int __sched __down_interruptible(struct semaphore * sem)
 {
 	int ret = 0;
 	DOWN_VAR
--- diff/arch/h8300/Kconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/h8300/Kconfig	2004-04-21 10:45:33.402625528 +0100
@@ -57,17 +57,17 @@ config H8300H_GENERIC
 config H8300H_AKI3068NET
 	bool "AE-3068/69"
 	help
-	  AKI-H8/3068F / AKI-H8/3069F Flashmicom LAN Board Suppot
+	  AKI-H8/3068F / AKI-H8/3069F Flashmicom LAN Board Support
 	  More Information. (Japanese Only)
 	  <http://akizukidensi.com/catalog/h8.html>
-	  AE-3068/69 Evalution Board Support
+	  AE-3068/69 Evaluation Board Support
 	  More Information.
 	  <http://www.microtronique.com/ae3069lan.htm>
 
 config H8300H_H8MAX
 	bool "H8MAX"
 	help
-	  H8MAX Evalution Board Suooprt
+	  H8MAX Evaluation Board Support
 	  More Information. (Japanese Only)
 	  <http://strawberry-linux.com/h8/index.html>
 
@@ -81,7 +81,7 @@ config H8300H_SIM
 config H8S_EDOSK2674
 	bool "EDOSK-2674"
 	help
-	  Renesas EDOSK-2674R Evalution Board Support
+	  Renesas EDOSK-2674 Evaluation Board Support
 	  More Information.
 	  <http://www.azpower.com/H8-uClinux/index.html>
  	  <http://www.eu.renesas.com/tools/edk/support/edosk2674.html>
@@ -240,70 +240,6 @@ config HW_CONSOLE
 	depends on VT && !S390 && !UM
 	default y
 
-config SERIAL
-	tristate "Serial (8250, 16450, 16550 or compatible) support"
-	---help---
-	  This selects whether you want to include the driver for the standard
-	  serial ports.  The standard answer is Y.  People who might say N
-	  here are those that are setting up dedicated Ethernet WWW/FTP
-	  servers, or users that have one of the various bus mice instead of a
-	  serial mouse and don't intend to use their machine's standard serial
-	  port for anything.  (Note that the Cyclades and Stallion multi
-	  serial port drivers do not need this driver built in for them to
-	  work.)
-
-	  To compile this driver as a module, choose M here: the
-	  module will be called serial.
-	  [WARNING: Do not compile this driver as a module if you are using
-	  non-standard serial ports, since the configuration information will
-	  be lost when the driver is unloaded.  This limitation may be lifted
-	  in the future.]
-
-	  BTW1: If you have a mouseman serial mouse which is not recognized by
-	  the X window system, try running gpm first.
-
-	  BTW2: If you intend to use a software modem (also called Winmodem)
-	  under Linux, forget it.  These modems are crippled and require
-	  proprietary drivers which are only available under Windows.
-
-	  Most people will say Y or M here, so that they can use serial mice,
-	  modems and similar devices connecting to the standard serial ports.
-
-config SH_SCI
-	tristate "Serial (SCI, SCIF) support"
-	help
-	  Selecting this option will allow the Linux kernel to transfer data
-	  over SCI (Serial Communication Interface) and/or SCIF (Serial
-	  Communication Interface with FIFO) which are built into the Hitachi
-	  SuperH processor.  The option provides 1 to 3 (depending
-	  on the CPU model) standard Linux tty devices, /dev/ttySC[012]; one
-	  of these is normally used as the system console.
-
-	  If in doubt, press "y".
-
-config SERIAL_CONSOLE
-	bool "Support for console on serial port"
-	depends on SERIAL=y || SH_SCI=y
-	---help---
-	  If you say Y here, it will be possible to use a serial port as the
-	  system console (the system console is the device which receives all
-	  kernel messages and warnings and which allows logins in single user
-	  mode). This could be useful if some terminal or printer is connected
-	  to that serial port.
-
-	  Even if you say Y here, the currently visible virtual console
-	  (/dev/tty0) will still be used as the system console by default, but
-	  you can alter that using a kernel command line option such as
-	  "console=ttyS1". (Try "man bootparam" or see the documentation of
-	  your boot loader (lilo or loadlin) about how to pass options to the
-	  kernel at boot time.)
-
-	  If you don't have a VGA card installed and you say Y here, the
-	  kernel will automatically use the first serial line, /dev/ttyS0, as
-	  system console.
-
-	  If unsure, say N.
-
 comment "Unix98 PTY support"
 
 config UNIX98_PTYS
@@ -396,7 +332,7 @@ config SYSCALL_PRINT
 
 config GDB_DEBUG
    	bool "Use gdb stub"
-	depends on (!H8300H_SIM && H8S_SIM)
+	depends on (!H8300H_SIM && !H8S_SIM)
 	help
 	  gdb stub exception support
 
--- diff/arch/h8300/Kconfig.ide	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/h8300/Kconfig.ide	2004-04-21 10:45:33.402625528 +0100
@@ -14,7 +14,7 @@ config H8300_IDE_ALT
 	help
 	  IDE alternate registers address
 
-config H8300_IDE_IRQNO
+config H8300_IDE_IRQ
 	int "IDE IRQ no"
 	depends on IDE
 	help
--- diff/arch/h8300/kernel/asm-offsets.c	2003-08-20 14:16:24.000000000 +0100
+++ source/arch/h8300/kernel/asm-offsets.c	2004-04-21 10:45:33.403625376 +0100
@@ -15,6 +15,7 @@
 #include <asm/bootinfo.h>
 #include <asm/irq.h>
 #include <asm/hardirq.h>
+#include <asm/ptrace.h>
 
 #define DEFINE(sym, val) \
         asm volatile("\n->" #sym " %0 " #val : : "i" (val))
@@ -41,6 +42,22 @@ int main(void)
 	DEFINE(THREAD_USP, offsetof(struct thread_struct, usp));
 	DEFINE(THREAD_CCR, offsetof(struct thread_struct, ccr));
 
+	/* offsets into the pt_regs struct */
+	DEFINE(LER0,  offsetof(struct pt_regs, er0)      - sizeof(long));
+	DEFINE(LER1,  offsetof(struct pt_regs, er1)      - sizeof(long));
+	DEFINE(LER2,  offsetof(struct pt_regs, er2)      - sizeof(long));
+	DEFINE(LER3,  offsetof(struct pt_regs, er3)      - sizeof(long));
+	DEFINE(LER4,  offsetof(struct pt_regs, er4)      - sizeof(long));
+	DEFINE(LER5,  offsetof(struct pt_regs, er5)      - sizeof(long));
+	DEFINE(LER6,  offsetof(struct pt_regs, er6)      - sizeof(long));
+	DEFINE(LORIG, offsetof(struct pt_regs, orig_er0) - sizeof(long));
+	DEFINE(LCCR,  offsetof(struct pt_regs, ccr)      - sizeof(long));
+	DEFINE(LVEC,  offsetof(struct pt_regs, vector)   - sizeof(long));
+#if defined(__H8300S__)
+	DEFINE(LEXR,  offsetof(struct pt_regs, exr)      - sizeof(long));
+#endif
+	DEFINE(LRET,  offsetof(struct pt_regs, pc)       - sizeof(long));
+
 	DEFINE(PT_PTRACED, PT_PTRACED);
 	DEFINE(PT_DTRACE, PT_DTRACE);
 
--- diff/arch/h8300/kernel/ints.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/h8300/kernel/ints.c	2004-04-21 10:45:33.408624616 +0100
@@ -93,7 +93,7 @@ void __init init_IRQ(void)
 	if (ramvec == NULL)
 		panic("interrupt vector serup failed.");
 	else
-		printk("virtual vector at 0x%08lx\n",(unsigned long)ramvec);
+		printk(KERN_INFO "virtual vector at 0x%08lx\n",(unsigned long)ramvec);
 
 	/* create redirect table */
 	ramvec_p = ramvec;
@@ -118,11 +118,11 @@ void __init init_IRQ(void)
 	ramvec_p = ramvec;
 	for (i = 0; i < NR_IRQS; i++) {
 		if ((i % 8) == 0)
-			printk("\n%p: ",ramvec_p);
-		printk("%p ",*ramvec_p);
+			printk(KERN_DEBUG "\n%p: ",ramvec_p);
+		printk(KERN_DEBUG "%p ",*ramvec_p);
 		ramvec_p++;
 	}
-	printk("\n");
+	printk(KERN_DEBUG "\n");
 #endif
 #endif
 }
@@ -133,9 +133,10 @@ int request_irq(unsigned int irq, 
 {
 	irq_handler_t *irq_handle;
 	if (irq < 0 || irq >= NR_IRQS) {
-		printk("Incorrect IRQ %d from %s\n", irq, devname);
+		printk(KERN_ERR "Incorrect IRQ %d from %s\n", irq, devname);
 		return -EINVAL;
 	}
+
 	if (irq_list[irq] || (h8300_enable_irq_pin(irq) == -EBUSY))
 		return -EBUSY;
 
@@ -156,6 +157,11 @@ int request_irq(unsigned int irq, 
 	irq_handle->dev_id  = dev_id;
 	irq_handle->devname = devname;
 	irq_list[irq] = irq_handle;
+
+	if (irq_handle->flags & SA_SAMPLE_RANDOM)
+		rand_initialize_irq(irq);
+
+	enable_irq(irq);
 	return 0;
 }
 
@@ -163,12 +169,13 @@ EXPORT_SYMBOL(request_irq);
 
 void free_irq(unsigned int irq, void *dev_id)
 {
-	if (irq >= NR_IRQS) {
+	if (irq >= NR_IRQS)
 		return;
-	}
+
 	if (!irq_list[irq] || irq_list[irq]->dev_id != dev_id)
-		printk("Removing probably wrong IRQ %d from %s\n",
+		printk(KERN_WARNING "Removing probably wrong IRQ %d from %s\n",
 		       irq, irq_list[irq]->devname);
+	disable_irq(irq);
 	h8300_disable_irq_pin(irq);
 	if (((unsigned long)irq_list[irq] & 0x80000000) == 0) {
 		kfree(irq_list[irq]);
--- diff/arch/h8300/kernel/process.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/h8300/kernel/process.c	2004-04-21 10:45:33.408624616 +0100
@@ -264,8 +264,6 @@ out:
 /*
  * These bracket the sleeping functions..
  */
-extern void scheduling_functions_start_here(void);
-extern void scheduling_functions_end_here(void);
 #define first_sched	((unsigned long) scheduling_functions_start_here)
 #define last_sched	((unsigned long) scheduling_functions_end_here)
 
@@ -285,11 +283,10 @@ unsigned long get_wchan(struct task_stru
 	stack_page = (unsigned long)p;
 	fp = ((struct pt_regs *)p->thread.ksp)->er6;
 	do {
-		if (fp < stack_page+sizeof(struct task_struct) ||
+		if (fp < stack_page+sizeof(struct thread_info) ||
 		    fp >= 8184+stack_page)
 			return 0;
 		pc = ((unsigned long *)fp)[1];
-		/* FIXME: This depends on the order of these functions. */
 		if (pc < first_sched || pc >= last_sched)
 			return pc;
 		fp = *(unsigned long *) fp;
--- diff/arch/h8300/kernel/ptrace.c	2003-09-30 15:46:11.000000000 +0100
+++ source/arch/h8300/kernel/ptrace.c	2004-04-21 10:45:33.409624464 +0100
@@ -1,7 +1,7 @@
 /*
  *  linux/arch/h8300/kernel/ptrace.c
  *
- *  Yoshinori Sato <qzb04471@nifty.ne.jp>
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
  *
  *  Based on:
  *  linux/arch/m68k/kernel/ptrace.c
@@ -32,194 +32,17 @@
 #include <asm/processor.h>
 #include <asm/signal.h>
 
+/* cpu depend functions */
+extern long h8300_get_reg(struct task_struct *task, int regno);
+extern int  h8300_put_reg(struct task_struct *task, int regno, unsigned long data);
+extern void h8300_disable_trace(struct task_struct *child);
+extern void h8300_enable_trace(struct task_struct *child);
+
 /*
  * does not yet catch signals sent when the child dies.
  * in exit.c or in signal.c.
  */
 
-/* determines which bits in the SR the user has access to. */
-/* 1 = access 0 = no access */
-#define SR_MASK 0x001f
-
-/* sets the trace bits. */
-#define TRACE_BITS 0x8000
-
-/* Find the stack offset for a register, relative to thread.esp0. */
-#define PT_REG(reg)	((long)&((struct pt_regs *)0)->reg)
-/* Mapping from PT_xxx to the stack offset at which the register is
-   saved.  Notice that usp has no stack-slot and needs to be treated
-   specially (see get_reg/put_reg below). */
-static const int regoff[] = {
-	PT_REG(er1), PT_REG(er2), PT_REG(er3), PT_REG(er4),
-	PT_REG(er5), PT_REG(er6), PT_REG(er0), PT_REG(orig_er0),
-	PT_REG(ccr), PT_REG(pc)
-};
-
-/*
- * Get contents of register REGNO in task TASK.
- */
-static inline long get_reg(struct task_struct *task, int regno)
-{
-	unsigned long *addr;
-
-	if (regno == PT_USP)
-		addr = &task->thread.usp;
-	else if (regno < sizeof(regoff)/sizeof(regoff[0]))
-		addr = (unsigned long *)(task->thread.esp0 + regoff[regno]);
-	else
-		return 0;
-	return *addr;
-}
-
-/*
- * Write contents of register REGNO in task TASK.
- */
-static inline int put_reg(struct task_struct *task, int regno,
-			  unsigned long data)
-{
-	unsigned long *addr;
-
-	if (regno == PT_USP)
-		addr = &task->thread.usp;
-	else if (regno < sizeof(regoff)/sizeof(regoff[0]))
-		addr = (unsigned long *) (task->thread.esp0 + regoff[regno]);
-	else
-		return -1;
-	*addr = data;
-	return 0;
-}
-
-/*
- * Called by kernel/ptrace.c when detaching..
- *
- * Make sure the single step bit is not set.
- */
-int ptrace_cancel_bpt(struct task_struct *child)
-{
-        int i,r=0;
-
-	for(i=0; i<4; i++) {
-	        if (child->thread.debugreg[i]) {
-		        if (child->thread.debugreg[i] != ~0)
-		                put_user(child->thread.debugreg[i+4],
-                                         (unsigned short *)child->thread.debugreg[i]);
-			r = 1;
-			child->thread.debugreg[i] = 0;
-		}
-	}
-	return r;
-}
-
-const static unsigned char opcode0[]={
-  0x04,0x02,0x04,0x02,0x04,0x02,0x04,0x02,  /* 0x58 */
-  0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,  /* 0x60 */
-  0x02,0x02,0x11,0x11,0x02,0x02,0x04,0x04,  /* 0x68 */
-  0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,  /* 0x70 */
-  0x08,0x04,0x06,0x04,0x04,0x04,0x04,0x04}; /* 0x78 */
-
-const static int table_parser01(unsigned char *pc);
-const static int table_parser02(unsigned char *pc);
-const static int table_parser100(unsigned char *pc);
-const static int table_parser101(unsigned char *pc);
-
-const static int (*parsers[])(unsigned char *pc)={table_parser01,table_parser02};
-
-static int insn_length(unsigned char *pc)
-{
-  if (*pc == 0x01)
-    return table_parser01(pc+1);
-  if (*pc < 0x58 || *pc>=0x80) 
-    return 2;
-  else
-    if (opcode0[*pc-0x58]<0x10)
-      return opcode0[*pc-0x58];
-    else
-      return (*parsers[opcode0[*pc-0x58]-0x10])(pc+1);
-}
-
-const static int table_parser01(unsigned char *pc)
-{
-  const unsigned char codelen[]={0x10,0x00,0x00,0x00,0x11,0x00,0x00,0x00,
-                                 0x02,0x00,0x00,0x00,0x04,0x04,0x00,0x04};
-  const static int (*parsers[])(unsigned char *)={table_parser100,table_parser101};
-  unsigned char second_index;
-  second_index = (*pc) >> 4;
-  if (codelen[second_index]<0x10)
-    return codelen[second_index];
-  else
-    return parsers[codelen[second_index]-0x10](pc);
-}
-
-const static int table_parser02(unsigned char *pc)
-{
-  return (*pc & 0x20)?0x06:0x04;
-}
-
-const static int table_parser100(unsigned char *pc)
-{
-  return (*(pc+2) & 0x02)?0x08:0x06;
-}
-
-const static int table_parser101(unsigned char *pc)
-{
-  return (*(pc+2) & 0x02)?0x08:0x06;
-}
-
-#define BREAK_INST 0x5730 /* TRAPA #3 */
-
-int ptrace_set_bpt(struct task_struct *child)
-{
-        unsigned long pc,next;
-	unsigned short insn;
-	pc = get_reg(child,PT_PC);
-	next = insn_length((unsigned char *)pc) + pc;
-	get_user(insn,(unsigned short *)pc);
-	if (insn == 0x5470) {
-	        /* rts */ 
-	        unsigned long sp;
-		sp = get_reg(child,PT_USP);
-		get_user(next,(unsigned long *)sp);
-	} else if ((insn & 0xfb00) != 0x5800) {
-	        /* jmp / jsr */
-	        int regs;
-		const short reg_tbl[]={PT_ER0,PT_ER1,PT_ER2,PT_ER3,
-                                       PT_ER4,PT_ER5,PT_ER6,PT_USP};
-	        switch(insn & 0xfb00) {
-		        case 0x5900:
-			       regs = (insn & 0x0070) >> 8;
-                               next = get_reg(child,reg_tbl[regs]);
-			       break;
-		        case 0x5a00:
-			       get_user(next,(unsigned long *)(pc+2));
-			       next &= 0x00ffffff;
-			       break;
-		        case 0x5b00:
-			       /* unneccessary? */
-			       next = *(unsigned long *)(insn & 0xff);
-                               break;
-		}
-	} else if (((insn & 0xf000) == 0x4000) || ((insn &0xff00) == 0x5500)) { 
-	        /* b**:8 */
-	        unsigned long dsp;
-		dsp = (long)(insn && 0xff)+pc+2;
-		child->thread.debugreg[1] = dsp;
-		get_user(child->thread.debugreg[5],(unsigned short *)dsp);
-		put_user(BREAK_INST,(unsigned short *)dsp);
-	} else if (((insn & 0xff00) == 0x5800) || ((insn &0xff00) == 0x5c00)) { 
-	        /* b**:16 */
-	        unsigned long dsp;
-		get_user(dsp,(unsigned short *)(pc+2));
-		dsp = (long)dsp+pc+4;
-		child->thread.debugreg[1] = dsp;
-		get_user(child->thread.debugreg[5],(unsigned short *)dsp);
-		put_user(BREAK_INST,(unsigned short *)dsp);
-	}
-	child->thread.debugreg[0] = next;
-	get_user(child->thread.debugreg[4],(unsigned short *)next);
-	put_user(BREAK_INST,(unsigned short *)next);
-	return 0;
-}
-
 inline
 static int read_long(struct task_struct * tsk, unsigned long addr,
 	unsigned long * result)
@@ -230,7 +53,7 @@ static int read_long(struct task_struct 
 
 void ptrace_disable(struct task_struct *child)
 {
-	ptrace_cancel_bpt(child);
+	h8300_disable_trace(child);
 }
 
 asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
@@ -298,8 +121,8 @@ asmlinkage int sys_ptrace(long request, 
 			
 			tmp = 0;  /* Default return condition */
 			addr = addr >> 2; /* temporary hack. */
-			if (addr < 10)
-				tmp = get_reg(child, addr);
+			if (addr < H8300_REGS_NO)
+				tmp = h8300_get_reg(child, addr);
 			else {
 				ret = -EIO;
 				break ;
@@ -328,14 +151,8 @@ asmlinkage int sys_ptrace(long request, 
 				ret = -EIO;
 				break ;
 			}
-			if (addr == PT_CCR) {
-				data &= SR_MASK;
-			}
-			if (addr < 10) {
-				if (put_reg(child, addr, data))
-					ret = -EIO;
-				else
-					ret = 0;
+			if (addr < H8300_REGS_NO) {
+				ret = h8300_put_reg(child, addr, data);
 				break ;
 			}
 			ret = -EIO;
@@ -352,7 +169,7 @@ asmlinkage int sys_ptrace(long request, 
 			child->exit_code = data;
 			wake_up_process(child);
 			/* make sure the single step bit is not set. */
-			ptrace_cancel_bpt(child);
+			h8300_disable_trace(child);
 			ret = 0;
 		}
 
@@ -367,7 +184,7 @@ asmlinkage int sys_ptrace(long request, 
 			if (child->state == TASK_ZOMBIE) /* already dead */
 				break;
 			child->exit_code = SIGKILL;
-			ptrace_cancel_bpt(child);
+			h8300_disable_trace(child);
 			wake_up_process(child);
 			break;
 		}
@@ -377,8 +194,8 @@ asmlinkage int sys_ptrace(long request, 
 			if ((unsigned long) data > _NSIG)
 				break;
 			clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-			child->thread.debugreg[0]=-1;
 			child->exit_code = data;
+			h8300_enable_trace(child);
 			wake_up_process(child);
 			ret = 0;
 			break;
@@ -391,8 +208,8 @@ asmlinkage int sys_ptrace(long request, 
 		case PTRACE_GETREGS: { /* Get all gp regs from the child. */
 		  	int i;
 			unsigned long tmp;
-			for (i = 0; i < 19; i++) {
-			    tmp = get_reg(child, i);
+			for (i = 0; i < H8300_REGS_NO; i++) {
+			    tmp = h8300_get_reg(child, i);
 			    if (put_user(tmp, (unsigned long *) data)) {
 				ret = -EFAULT;
 				break;
@@ -406,12 +223,12 @@ asmlinkage int sys_ptrace(long request, 
 		case PTRACE_SETREGS: { /* Set all gp regs in the child. */
 			int i;
 			unsigned long tmp;
-			for (i = 0; i < 10; i++) {
+			for (i = 0; i < H8300_REGS_NO; i++) {
 			    if (get_user(tmp, (unsigned long *) data)) {
 				ret = -EFAULT;
 				break;
 			    }
-			    put_reg(child, i, tmp);
+			    h8300_put_reg(child, i, tmp);
 			    data += sizeof(long);
 			}
 			ret = 0;
@@ -449,13 +266,3 @@ asmlinkage void syscall_trace(void)
 		current->exit_code = 0;
 	}
 }
-
-asmlinkage void trace_trap(unsigned long bp)
-{
-	if (current->thread.debugreg[0] == bp ||
-            current->thread.debugreg[1] == bp) {
-	        ptrace_cancel_bpt(current);
-		force_sig(SIGTRAP,current);
-	} else
-	        force_sig(SIGILL,current);
-}
--- diff/arch/h8300/kernel/semaphore.c	2003-05-21 11:50:08.000000000 +0100
+++ source/arch/h8300/kernel/semaphore.c	2004-04-21 10:45:33.409624464 +0100
@@ -5,6 +5,7 @@
 
 #include <linux/config.h>
 #include <linux/sched.h>
+#include <linux/init.h>
 #include <asm/semaphore-helper.h>
 
 #ifndef CONFIG_RMW_INSNS
@@ -95,7 +96,7 @@ void __up(struct semaphore *sem)
 	current->state = TASK_RUNNING;		\
 	remove_wait_queue(&sem->wait, &wait);
 
-void __down(struct semaphore * sem)
+void __sched __down(struct semaphore * sem)
 {
 	DECLARE_WAITQUEUE(wait, current);
 
@@ -106,7 +107,7 @@ void __down(struct semaphore * sem)
 	DOWN_TAIL(TASK_UNINTERRUPTIBLE)
 }
 
-int __down_interruptible(struct semaphore * sem)
+int __sched __down_interruptible(struct semaphore * sem)
 {
 	DECLARE_WAITQUEUE(wait, current);
 	int ret = 0;
--- diff/arch/h8300/kernel/setup.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/h8300/kernel/setup.c	2004-04-21 10:45:33.410624312 +0100
@@ -138,27 +138,23 @@ void __init setup_arch(char **cmdline_p)
 	register_console((struct console *)&gdb_console);
 #endif
 
-	printk("\r\n\nuClinux " CPU "\n");
-	printk("Target Hardware: %s\n",_target_name);
-	printk("Flat model support (C) 1998,1999 Kenneth Albanowski, D. Jeff Dionne\n");
-	printk("H8/300 series support by Yoshinori Sato <ysato@users.sourceforge.jp>\n");
+	printk(KERN_INFO "\r\n\nuClinux " CPU "\n");
+	printk(KERN_INFO "Target Hardware: %s\n",_target_name);
+	printk(KERN_INFO "Flat model support (C) 1998,1999 Kenneth Albanowski, D. Jeff Dionne\n");
+	printk(KERN_INFO "H8/300 series support by Yoshinori Sato <ysato@users.sourceforge.jp>\n");
 
 #ifdef DEBUG
-	printk("KERNEL -> TEXT=0x%06x-0x%06x DATA=0x%06x-0x%06x "
+	printk(KERN_DEBUG "KERNEL -> TEXT=0x%06x-0x%06x DATA=0x%06x-0x%06x "
 		"BSS=0x%06x-0x%06x\n", (int) &_stext, (int) &_etext,
 		(int) &_sdata, (int) &_edata,
 		(int) &_sbss, (int) &_ebss);
-	printk("KERNEL -> ROMFS=0x%06x-0x%06x MEM=0x%06x-0x%06x "
+	printk(KERN_DEBUG "KERNEL -> ROMFS=0x%06x-0x%06x MEM=0x%06x-0x%06x "
 		"STACK=0x%06x-0x%06x\n",
 	       (int) &_ebss, (int) memory_start,
 		(int) memory_start, (int) memory_end,
 		(int) memory_end, (int) &_ramend);
 #endif
 
-#ifdef CONFIG_BLK_DEV_BLKMEM
-	ROOT_DEV = MKDEV(BLKMEM_MAJOR,0);
-#endif
-
 #ifdef CONFIG_DEFAULT_CMDLINE
 	/* set from default command line */
 	if (*command_line == '\0')
@@ -171,7 +167,7 @@ void __init setup_arch(char **cmdline_p)
 
 #ifdef DEBUG
 	if (strlen(*cmdline_p)) 
-		printk("Command line: '%s'\n", *cmdline_p);
+		printk(KERN_DEBUG "Command line: '%s'\n", *cmdline_p);
 #endif
 
 	/*
@@ -195,30 +191,10 @@ void __init setup_arch(char **cmdline_p)
 	paging_init();
 	h8300_gpio_init();
 #ifdef DEBUG
-	printk("Done setup_arch\n");
+	printk(KERN_DEBUG "Done setup_arch\n");
 #endif
 }
 
-int get_cpuinfo(char * buffer)
-{
-    char *cpu;
-    u_long clockfreq;
-
-    cpu = CPU;
-
-    clockfreq = CONFIG_CPU_CLOCK;
-
-    return(sprintf(buffer, "CPU:\t\t%s\n"
-		   "Clock:\t%lu.%1luMHz\n"
-		   "BogoMips:\t%lu.%02lu\n"
-		   "Calibration:\t%lu loops\n",
-		   cpu,
-		   clockfreq/100,clockfreq%100,
-		   (loops_per_jiffy*HZ)/500000,((loops_per_jiffy*HZ)/5000)%100,
-		   (loops_per_jiffy*HZ)));
-
-}
-
 /*
  *	Get CPU information for use by the procfs.
  */
@@ -226,17 +202,19 @@ int get_cpuinfo(char * buffer)
 static int show_cpuinfo(struct seq_file *m, void *v)
 {
     char *cpu;
+    int mode;
     u_long clockfreq;
 
     cpu = CPU;
+    mode = *(volatile unsigned char *)MDCR & 0x07;
 
     clockfreq = CONFIG_CPU_CLOCK;
 
-    seq_printf(m,  "CPU:\t\t%s\n"
-		   "Clock:\t%lu.%1luMHz\n"
+    seq_printf(m,  "CPU:\t\t%s (mode:%d)\n"
+		   "Clock:\t\t%lu.%1luMHz\n"
 		   "BogoMips:\t%lu.%02lu\n"
 		   "Calibration:\t%lu loops\n",
-		   cpu,
+	           cpu,mode,
 		   clockfreq/100,clockfreq%100,
 		   (loops_per_jiffy*HZ)/500000,((loops_per_jiffy*HZ)/5000)%100,
 		   (loops_per_jiffy*HZ));
--- diff/arch/h8300/kernel/traps.c	2003-08-20 14:16:24.000000000 +0100
+++ source/arch/h8300/kernel/traps.c	2004-04-21 10:45:33.411624160 +0100
@@ -16,9 +16,10 @@
 
 #include <linux/types.h>
 #include <linux/sched.h>
-#include <linux/kernel_stat.h>
+#include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/init.h>
+#include <linux/module.h>
 
 #include <asm/system.h>
 #include <asm/irq.h>
@@ -41,7 +42,7 @@ void __init trap_init (void)
 
 asmlinkage void set_esp0 (unsigned long ssp)
 {
-  current->thread.esp0 = ssp;
+	current->thread.esp0 = ssp;
 }
 
 /*
@@ -55,14 +56,6 @@ static void dump(struct pt_regs *fp)
 	int		i;
 
 	printk("\nCURRENT PROCESS:\n\n");
-#if 0
-{
-	extern int	swt_lastjiffies, swt_reference;
-	printk("WATCHDOG: jiffies=%d lastjiffies=%d [%d] reference=%d\n",
-		jiffies, swt_lastjiffies, (swt_lastjiffies - jiffies),
-		swt_reference);
-}
-#endif
 	printk("COMM=%s PID=%d\n", current->comm, current->pid);
 	if (current->mm) {
 		printk("TEXT=%08x-%08x DATA=%08x-%08x BSS=%08x-%08x\n",
@@ -77,12 +70,7 @@ static void dump(struct pt_regs *fp)
 			(int) PAGE_SIZE+(unsigned long)current);
 	}
 
-	printk("PC: %08lx\n", (long)fp->pc);
-	printk("CCR: %02x   SP: %08lx\n", fp->ccr, (long) fp);
-	printk("ER0: %08lx  ER1: %08lx   ER2: %08lx   ER3: %08lx\n",
-		fp->er0, fp->er1, fp->er2, fp->er3);
-	printk("ER4: %08lx  ER5: %08lx   ER6: %08lx\n",
-		fp->er4, fp->er5, fp->er6);
+	show_regs(fp);
 	printk("\nCODE:");
 	tp = ((unsigned char *) fp->pc) - 0x20;
 	for (sp = (unsigned long *) tp, i = 0; (i < 0x40);  i += 4) {
@@ -106,12 +94,6 @@ static void dump(struct pt_regs *fp)
 	printk("\n\n");
 }
 
-void show_trace_task(struct task_struct *tsk)
-{
-	/* DAVIDM: we can do better, need a proper stack dump */
-	printk("STACK ksp=0x%lx, usp=0x%lx\n", tsk->thread.ksp, tsk->thread.usp);
-}
-
 void die_if_kernel (char *str, struct pt_regs *fp, int nr)
 {
 	extern int console_loglevel;
@@ -174,3 +156,14 @@ void show_stack(struct task_struct *task
 	printk("\n");
 }
 
+void show_trace_task(struct task_struct *tsk)
+{
+	show_stack(tsk,(unsigned long *)tsk->thread.esp0);
+}
+
+void dump_stack(void)
+{
+	show_stack(NULL,NULL);
+}
+
+EXPORT_SYMBOL(dump_stack);
--- diff/arch/h8300/kernel/vmlinux.lds.S	2003-08-26 10:00:51.000000000 +0100
+++ source/arch/h8300/kernel/vmlinux.lds.S	2004-04-21 10:45:33.411624160 +0100
@@ -82,6 +82,7 @@ SECTIONS
 #endif
 	__stext = . ;
         	*(.text)
+	SCHED_TEXT
 	. = ALIGN(0x4) ;
 		*(.exit.text)
 		*(.text.*)
--- diff/arch/h8300/platform/h8300h/Makefile	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/h8300/platform/h8300h/Makefile	2004-04-21 10:45:33.411624160 +0100
@@ -4,5 +4,4 @@
 # Reuse any files we can from the H8/300H
 #
 
-obj-y := entry.o ints_h8300h.o
-
+obj-y := entry.o ints_h8300h.o ptrace_h8300h.o
--- diff/arch/h8300/platform/h8300h/entry.S	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/h8300/platform/h8300h/entry.S	2004-04-21 10:45:33.412624008 +0100
@@ -21,26 +21,7 @@
 #include <asm/linkage.h>
 #include <asm/asm-offsets.h>
 #include <asm/thread_info.h>
-			
-ENOSYS = 38
-
-LSIGTRAP = 5
-
-SOFTIRQ_PENDING = 0
-		
-/* the following macro is used when enabling interrupts */
-
-LER4	=	0
-LER5	=	4
-LER6	=	8
-LER3	=	12
-LER2	=	16
-LER1	=	20
-LORIG	=	24
-LCCR	=	28
-LER0	=	30
-LVEC	=	34
-LRET	=	38
+#include <asm/errno.h>
 
 	.h8300h
 
@@ -188,7 +169,7 @@ SYMBOL_NAME_LABEL(interrupt_entry)
 	mov.l	sp,er1
 	subs	#4,er1				/* adjust ret_pc */
 	jsr	@SYMBOL_NAME(process_int)
-	mov.l	@SYMBOL_NAME(irq_stat)+SOFTIRQ_PENDING,er0
+	mov.l	@SYMBOL_NAME(irq_stat)+CPUSTAT_SOFTIRQ_PENDING,er0
 	beq	1f
 	jsr	@SYMBOL_NAME(do_softirq)
 1:
--- diff/arch/h8300/platform/h8s/Makefile	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/h8300/platform/h8s/Makefile	2004-04-21 10:45:33.413623856 +0100
@@ -4,4 +4,4 @@
 # Reuse any files we can from the H8S
 #
 
-obj-y := entry.o ints_h8s.o
+obj-y := entry.o ints_h8s.o ptrace_h8s.o
--- diff/arch/h8300/platform/h8s/entry.S	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/h8300/platform/h8s/entry.S	2004-04-21 10:45:33.414623704 +0100
@@ -22,27 +22,7 @@
 #include <asm/linkage.h>
 #include <asm/asm-offsets.h>
 #include <asm/thread_info.h>
-
-ENOSYS = 38
-
-LSIGTRAP = 5
-
-SOFTIRQ_PENDING = 0
-		
-/* the following macro is used when enabling interrupts */
-
-LER4	=	0
-LER5	=	4
-LER6	=	8
-LER3	=	12
-LER2	=	16
-LER1	=	20
-LORIG	=	24
-LCCR	=	28
-LER0	=	30
-LVEC	=	34
-LEXR	=	38
-LRET	=	40
+#include <asm/errno.h>
 
 	.h8300s
 
@@ -186,7 +166,7 @@ SYMBOL_NAME_LABEL(interrupt_entry)
 	mov.l	sp,er1
 	subs	#4,er1				/* adjust ret_pc */
 	jsr	@SYMBOL_NAME(process_int)
-	mov.l	@SYMBOL_NAME(irq_stat)+SOFTIRQ_PENDING,er0
+	mov.l	@SYMBOL_NAME(irq_stat)+CPUSTAT_SOFTIRQ_PENDING,er0
 	beq	1f
 	jsr	@SYMBOL_NAME(do_softirq)
 1:
--- diff/arch/h8300/platform/h8s/ints_h8s.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/h8300/platform/h8s/ints_h8s.c	2004-04-21 10:45:33.414623704 +0100
@@ -9,6 +9,7 @@
 #include <linux/config.h>
 #include <linux/init.h>
 #include <linux/errno.h>
+#include <linux/kernel.h>
 
 #include <asm/ptrace.h>
 #include <asm/traps.h>
@@ -63,7 +64,8 @@ const static struct irq_pins irq_assign_
 	{H8300_GPIO_P2,H8300_GPIO_B6},{H8300_GPIO_P2,H8300_GPIO_B7},
 };
 
-#define IRQ_GPIO_MAP(irqbit,port,bit)				  \
+/* IRQ to GPIO pinno transrate */
+#define IRQ_GPIO_MAP(irqbit,irq,port,bit)			  \
 do {								  \
 	if (*(volatile unsigned short *)ITSR & irqbit) {	  \
 		port = irq_assign_table1[irq - EXT_IRQ0].port_no; \
@@ -79,12 +81,13 @@ int h8300_enable_irq_pin(unsigned int ir
 	if (irq >= EXT_IRQ0 && irq <= EXT_IRQ15) {
 		unsigned short ptn = 1 << (irq - EXT_IRQ0);
 		unsigned int port_no,bit_no;
-		IRQ_GPIO_MAP(ptn,port_no,bit_no);
+		IRQ_GPIO_MAP(ptn, irq, port_no, bit_no);
 		if (H8300_GPIO_RESERVE(port_no, bit_no) == 0)
 			return -EBUSY;                   /* pin already use */
 		H8300_GPIO_DDR(port_no, bit_no, H8300_GPIO_INPUT);
 		*(volatile unsigned short *)ISR &= ~ptn; /* ISR clear */
-	}		
+	}
+
 	return 0;
 }
 
@@ -96,7 +99,7 @@ void h8300_disable_irq_pin(unsigned int 
 		unsigned short port_no,bit_no;
 		*(volatile unsigned short *)ISR &= ~ptn;
 		*(volatile unsigned short *)IER &= ~ptn;
-		IRQ_GPIO_MAP(ptn,port_no,bit_no);
+		IRQ_GPIO_MAP(ptn, irq, port_no, bit_no);
 		H8300_GPIO_FREE(port_no, bit_no);
 	}
 }
--- diff/arch/i386/Kconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/i386/Kconfig	2004-04-21 10:45:33.419622944 +0100
@@ -70,7 +70,7 @@ config X86_NUMAQ
 	  multiquad box. This changes the way that processors are bootstrapped,
 	  and uses Clustered Logical APIC addressing mode instead of Flat Logical.
 	  You will need a new lynxer.elf file to flash your firmware with - send
-	  email to Martin.Bligh@us.ibm.com
+	  email to <Martin.Bligh@us.ibm.com>.
 
 config X86_SUMMIT
 	bool "Summit/EXA (IBM x440)"
@@ -322,9 +322,13 @@ endchoice
 config X86_GENERIC
        bool "Generic x86 support" 
        help
-       	  Including some tuning for non selected x86 CPUs too.
-	  when it has moderate overhead. This is intended for generic 
-	  distributions kernels.
+	  Instead of just including optimizations for the selected
+	  x86 variant (e.g. PII, Crusoe or Athlon), include some more
+	  generic optimizations as well. This will make the kernel
+	  perform better on x86 CPUs other than that selected.
+
+	  This is really intended for distributors who need more
+	  generic optimizations.
 
 endif
 
@@ -598,7 +602,7 @@ config I8K
 
 	  For information on utilities to make use of this driver see the
 	  I8K Linux utilities web site at:
-	  <http://www.debian.org/~dz/i8k/>
+	  <http://people.debian.org/~dz/i8k/>
 
 	  Say Y if you intend to run this kernel on a Dell Inspiron 8000.
 	  Say N otherwise.
@@ -809,8 +813,8 @@ config EFI
 	This option is only useful on systems that have EFI firmware
 	and will result in a kernel image that is ~8k larger.  In addition,
 	you must use the latest ELILO loader available at
-	ftp.hpl.hp.com/pub/linux-ia64/ in order to take advantage of kernel
-	initialization using EFI information (neither GRUB nor LILO know
+	<ftp://ftp.hpl.hp.com/pub/linux-ia64/> in order to take advantage of
+	kernel initialization using EFI information (neither GRUB nor LILO know
 	anything about EFI).  However, even with this option, the resultant
 	kernel should continue to boot on existing non-EFI platforms.
 
@@ -1091,25 +1095,6 @@ config PCI_MMCONFIG
 	select ACPI_BOOT
 	default y
 
-config PCI_USE_VECTOR
-	bool "Vector-based interrupt indexing (MSI)"
-	depends on X86_LOCAL_APIC && X86_IO_APIC
-	default n
-	help
-	   This replaces the current existing IRQ-based index interrupt scheme
-	   with the vector-base index scheme. The advantages of vector base
-	   over IRQ base are listed below:
-	   1) Support MSI implementation.
-	   2) Support future IOxAPIC hotplug
-
-	   Note that this allows the device drivers to enable MSI, Message
-	   Signaled Interrupt, on all MSI capable device functions detected.
-	   Message Signal Interrupt enables an MSI-capable hardware device to
-	   send an inbound Memory Write on its PCI bus instead of asserting
-	   IRQ signal on device IRQ pin.
-
-	   If you don't know what to do here, say N.
-
 source "drivers/pci/Kconfig"
 
 config ISA
@@ -1290,6 +1275,15 @@ config FRAME_POINTER
 	  If you don't debug the kernel, you can say N, but we may not be able
 	  to solve problems without frame pointers.
 
+config 4KSTACKS
+	bool "Use 4Kb for kernel stacks instead of 8Kb"
+	help
+	  If you say Y here the kernel will use a 4Kb stacksize for the
+	  kernel stack attached to each process/thread. This facilitates
+	  running more threads on a system and also reduces the pressure
+	  on the VM subsystem for higher order allocations. This option
+	  will also use IRQ stacks to compensate for the reduced stackspace.
+
 config X86_FIND_SMP_CONFIG
 	bool
 	depends on X86_LOCAL_APIC || X86_VOYAGER
@@ -1328,6 +1322,12 @@ config X86_TRAMPOLINE
 	depends on X86_SMP || (X86_VOYAGER && SMP)
 	default y
 
+# std_resources is overridden for pc9800, but that's not
+# a currently selectable arch choice
+config X86_STD_RESOURCES
+	bool
+	default y
+
 config PC
 	bool
 	depends on X86 && !EMBEDDED
--- diff/arch/i386/Makefile	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/i386/Makefile	2004-04-21 10:45:33.429621424 +0100
@@ -56,9 +56,9 @@ cflags-$(CONFIG_X86_ELAN)	+= -march=i486
 GCC_VERSION			:= $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh $(CC))
 cflags-$(CONFIG_REGPARM) 	+= $(shell if [ $(GCC_VERSION) -ge 0300 ] ; then echo "-mregparm=3"; fi ;)
 
-# Enable unit-at-a-time mode when possible. It shrinks the
-# kernel considerably.
-CFLAGS += $(call check_gcc,-funit-at-a-time,)
+# Disable unit-at-a-time mode, it makes gcc use a lot more stack
+# due to the lack of sharing of stacklots.
+CFLAGS += $(call check_gcc,-fno-unit-at-a-time,)
 
 CFLAGS += $(cflags-y)
 
--- diff/arch/i386/kernel/Makefile	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/i386/kernel/Makefile	2004-04-21 10:45:33.429621424 +0100
@@ -31,6 +31,7 @@ obj-$(CONFIG_ACPI_SRAT) 	+= srat.o
 obj-$(CONFIG_HPET_TIMER) 	+= time_hpet.o
 obj-$(CONFIG_EFI) 		+= efi.o efi_stub.o
 obj-$(CONFIG_EARLY_PRINTK)	+= early_printk.o
+obj-$(CONFIG_X86_STD_RESOURCES)	+= std_resources.o
 
 EXTRA_AFLAGS   := -traditional
 
--- diff/arch/i386/kernel/apm.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/i386/kernel/apm.c	2004-04-21 10:45:33.437620208 +0100
@@ -1701,7 +1701,7 @@ static int apm(void *unused)
 
 	daemonize("kapmd");
 
-	current->flags |= PF_IOTHREAD;
+	current->flags |= PF_NOFREEZE;
 
 #ifdef CONFIG_SMP
 	/* 2002/08/01 - WT
--- diff/arch/i386/kernel/cpu/cpufreq/Kconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/i386/kernel/cpu/cpufreq/Kconfig	2004-04-21 10:45:33.437620208 +0100
@@ -11,8 +11,8 @@ config CPU_FREQ
 	  fly. This is a nice method to save battery power on notebooks,
 	  because the lower the clock speed, the less power the CPU consumes.
 
-	  For more information, take a look at linux/Documentation/cpu-freq or
-	  at <http://www.codemonkey.org.uk/projects/cpufreq/>
+	  For more information, take a look at <file:Documentation/cpu-freq/>
+	  or at <http://www.codemonkey.org.uk/projects/cpufreq/>
 
 	  If in doubt, say N.
 
@@ -38,7 +38,7 @@ config X86_ACPI_CPUFREQ
 	  This driver adds a CPUFreq driver which utilizes the ACPI
 	  Processor Performance States.
 
-	  For details, take a look at linux/Documentation/cpu-freq. 
+	  For details, take a look at <file:Documentation/cpu-freq/>.
 
 	  If in doubt, say N.
 
@@ -63,7 +63,7 @@ config ELAN_CPUFREQ
 	  parameter: elanfreq=maxspeed (in kHz) or as module
 	  parameter "max_freq".
 
-	  For details, take a look at linux/Documentation/cpu-freq. 
+	  For details, take a look at <file:Documentation/cpu-freq/>.
 
 	  If in doubt, say N.
 
@@ -74,7 +74,7 @@ config X86_POWERNOW_K6
 	  This adds the CPUFreq driver for mobile AMD K6-2+ and mobile
 	  AMD K6-3+ processors.
 
-	  For details, take a look at linux/Documentation/cpu-freq. 
+	  For details, take a look at <file:Documentation/cpu-freq/>.
 
 	  If in doubt, say N.
 
@@ -84,7 +84,7 @@ config X86_POWERNOW_K7
 	help
 	  This adds the CPUFreq driver for mobile AMD K7 mobile processors.
 
-	  For details, take a look at linux/Documentation/cpu-freq. 
+	  For details, take a look at <file:Documentation/cpu-freq/>.
 
 	  If in doubt, say N.
 
@@ -94,7 +94,7 @@ config X86_POWERNOW_K8
 	help
 	  This adds the CPUFreq driver for mobile AMD Opteron/Athlon64 processors.
 
-	  For details, take a look at linux/Documentation/cpu-freq. 
+	  For details, take a look at <file:Documentation/cpu-freq/>.
 
 	  If in doubt, say N.
 
@@ -105,7 +105,7 @@ config X86_GX_SUSPMOD
 	 This add the CPUFreq driver for NatSemi Geode processors which
 	 support suspend modulation.
 
-	 For details, take a look at linux/Documentation/cpu-freq.
+	 For details, take a look at <file:Documentation/cpu-freq/>.
 
 	 If in doubt, say N.
 
@@ -116,10 +116,25 @@ config X86_SPEEDSTEP_CENTRINO
 	  This adds the CPUFreq driver for Enhanced SpeedStep enabled
 	  mobile CPUs.  This means Intel Pentium M (Centrino) CPUs.
 	  
-	  For details, take a look at linux/Documentation/cpu-freq. 
+	  For details, take a look at <file:Documentation/cpu-freq/>.
 	  
 	  If in doubt, say N.
 
+config X86_SPEEDSTEP_CENTRINO_TABLE
+	bool
+	depends on X86_SPEEDSTEP_CENTRINO
+	default y
+
+config X86_SPEEDSTEP_CENTRINO_ACPI
+	bool "Use ACPI tables to decode valid frequency/voltage pairs (EXPERIMENTAL)"
+	depends on EXPERIMENTAL
+	depends on ((X86_SPEEDSTEP_CENTRINO = "m" && ACPI_PROCESSOR) || (X86_SPEEDSTEP_CENTRINO = "y" && ACPI_PROCESSOR = "y"))
+	help
+	  Use primarily the information provided in the BIOS ACPI tables
+	  to determine valid CPU frequency and voltage pairings.
+
+	  If in doubt, say Y.
+
 config X86_SPEEDSTEP_ICH
 	tristate "Intel Speedstep on ICH-M chipsets (ioport interface)"
 	depends on CPU_FREQ_TABLE
@@ -129,7 +144,7 @@ config X86_SPEEDSTEP_ICH
 	  mobile Intel Pentium 4 P4-M on systems which have an Intel ICH2, 
 	  ICH3 or ICH4 southbridge.
 
-	  For details, take a look at linux/Documentation/cpu-freq. 
+	  For details, take a look at <file:Documentation/cpu-freq/>.
 
 	  If in doubt, say N.
 
@@ -141,7 +156,7 @@ config X86_SPEEDSTEP_SMI
 	  (Coppermine), all mobile Intel Pentium III-M (Tualatin)  
 	  on systems which have an Intel 440BX/ZX/MX southbridge.
 
-	  For details, take a look at linux/Documentation/cpu-freq.
+	  For details, take a look at <file:Documentation/cpu-freq/>.
 
 	  If in doubt, say N.
 
@@ -152,7 +167,7 @@ config X86_P4_CLOCKMOD
 	  This adds the CPUFreq driver for Intel Pentium 4 / XEON
 	  processors.
 
-	  For details, take a look at linux/Documentation/cpu-freq. 
+	  For details, take a look at <file:Documentation/cpu-freq/>.
 
 	  If in doubt, say N.
 
@@ -161,6 +176,16 @@ config X86_SPEEDSTEP_LIB
 	depends on (X86_SPEEDSTEP_ICH || X86_SPEEDSTEP_SMI || X86_P4_CLOCKMOD)
 	default (X86_SPEEDSTEP_ICH || X86_SPEEDSTEP_SMI || X86_P4_CLOCKMOD)
 
+config X86_SPEEDSTEP_RELAXED_CAP_CHECK
+	bool "Relaxed speedstep capability checks"
+	depends on (X86_SPEEDSTEP_SMI || X86_SPEEDSTEP_ICH)
+	help
+	  Don't perform all checks for a speedstep capable system which would 
+	  normally be done. Some ancient or strange systems, though speedstep 
+	  capable, don't always indicate that they are speedstep capable. This 
+	  option let's the probing code bypass some of those checks if the
+	  parameter "relaxed_check=1" is passed to the module.
+
 config X86_LONGRUN
 	tristate "Transmeta LongRun"
 	depends on CPU_FREQ
@@ -168,7 +193,7 @@ config X86_LONGRUN
 	  This adds the CPUFreq driver for Transmeta Crusoe processors which
 	  support LongRun.
 
-	  For details, take a look at linux/Documentation/cpu-freq. 
+	  For details, take a look at <file:Documentation/cpu-freq/>.
 
 	  If in doubt, say N.
 
@@ -180,7 +205,7 @@ config X86_LONGHAUL
 	  VIA Cyrix Samuel/C3, VIA Cyrix Ezra and VIA Cyrix Ezra-T 
 	  processors.
 
-	  For details, take a look at linux/Documentation/cpu-freq. 
+	  For details, take a look at <file:Documentation/cpu-freq/>.
 
 	  If in doubt, say N.
 
--- diff/arch/i386/kernel/cpu/cpufreq/elanfreq.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/i386/kernel/cpu/cpufreq/elanfreq.c	2004-04-21 10:45:33.438620056 +0100
@@ -165,7 +165,8 @@ static void elanfreq_set_cpu_state (unsi
 
 
 /**
- *	elanfreq_validatespeed: test if frequency range is valid 
+ *	elanfreq_validatespeed: test if frequency range is valid
+ *      @policy: the policy to validate
  *
  *	This function checks if a given frequency range in kHz is valid 
  *      for the hardware supported by the driver. 
--- diff/arch/i386/kernel/cpu/cpufreq/longhaul.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/i386/kernel/cpu/cpufreq/longhaul.c	2004-04-21 10:45:33.438620056 +0100
@@ -458,7 +458,7 @@ static int __init longhaul_cpu_init (str
 	return 0;
 }
 
-static int longhaul_cpu_exit(struct cpufreq_policy *policy)
+static int __exit longhaul_cpu_exit(struct cpufreq_policy *policy)
 {
 	cpufreq_frequency_table_put_attr(policy->cpu);
 	return 0;
--- diff/arch/i386/kernel/cpu/cpufreq/longrun.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/i386/kernel/cpu/cpufreq/longrun.c	2004-04-21 10:45:33.438620056 +0100
@@ -33,7 +33,7 @@ static unsigned int longrun_low_freq, lo
  * Reads the current LongRun policy by access to MSR_TMTA_LONGRUN_FLAGS
  * and MSR_TMTA_LONGRUN_CTRL
  */
-static void longrun_get_policy(struct cpufreq_policy *policy)
+static void __init longrun_get_policy(struct cpufreq_policy *policy)
 {
 	u32 msr_lo, msr_hi;
 
@@ -57,7 +57,7 @@ static void longrun_get_policy(struct cp
 
 /**
  * longrun_set_policy - sets a new CPUFreq policy
- * @policy - new policy
+ * @policy: new policy
  *
  * Sets a new CPUFreq policy on LongRun-capable processors. This function
  * has to be called with cpufreq_driver locked.
@@ -106,6 +106,7 @@ static int longrun_set_policy(struct cpu
 
 /**
  * longrun_verify_poliy - verifies a new CPUFreq policy
+ * @policy: the policy to verify
  *
  * Validates a new CPUFreq policy. This function has to be called with 
  * cpufreq_driver locked.
@@ -130,6 +131,8 @@ static int longrun_verify_policy(struct 
 
 /**
  * longrun_determine_freqs - determines the lowest and highest possible core frequency
+ * @low_freq: an int to put the lowest frequency into
+ * @high_freq: an int to put the highest frequency into
  *
  * Determines the lowest and highest possible core frequencies on this CPU.
  * This is necessary to calculate the performance percentage according to
@@ -142,6 +145,7 @@ static unsigned int __init longrun_deter
 	u32 msr_lo, msr_hi;
 	u32 save_lo, save_hi;
 	u32 eax, ebx, ecx, edx;
+	u32 try_hi;
 	struct cpuinfo_x86 *c = cpu_data;
 
 	if (!low_freq || !high_freq)
@@ -184,12 +188,14 @@ static unsigned int __init longrun_deter
 	 * upper limit to make the calculation more accurate.
 	 */
 	cpuid(0x80860007, &eax, &ebx, &ecx, &edx);
-	if (ecx > 90) {
-		/* set to 0 to 80 perf_pctg */
+	/* try decreasing in 10% steps, some processors react only
+	 * on some barrier values */
+	for (try_hi = 80; try_hi > 0 && ecx > 90; try_hi -=10) {
+		/* set to 0 to try_hi perf_pctg */
 		msr_lo &= 0xFFFFFF80;
 		msr_hi &= 0xFFFFFF80;
 		msr_lo |= 0;
-		msr_hi |= 80;
+		msr_hi |= try_hi;
 		wrmsr(MSR_TMTA_LONGRUN_CTRL, msr_lo, msr_hi);
 
 		/* read out current core MHz and current perf_pctg */
--- diff/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c	2004-02-18 08:54:07.000000000 +0000
+++ source/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c	2004-04-21 10:45:33.439619904 +0100
@@ -181,21 +181,24 @@ static unsigned int cpufreq_p4_get_frequ
 {
 	if ((c->x86 == 0x06) && (c->x86_model == 0x09)) {
 		/* Pentium M */
-		printk(KERN_DEBUG PFX "Warning: Pentium M detected. The speedstep_centrino module\n");
-		printk(KERN_DEBUG PFX "offers voltage scaling in addition of frequency scaling. You\n");
-		printk(KERN_DEBUG PFX "should use that instead of p4-clockmod, if possible.\n");
+		printk(KERN_WARNING PFX "Warning: Pentium M detected. "
+		       "The speedstep_centrino module offers voltage scaling"
+		       " in addition of frequency scaling. You should use "
+		       "that instead of p4-clockmod, if possible.\n");
 		return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_PM);
 	}
 
 	if (c->x86 != 0xF) {
-		printk(KERN_DEBUG PFX "Unknown p4-clockmod-capable CPU. Please send an e-mail to <linux@brodo.de>\n");
+		printk(KERN_WARNING PFX "Unknown p4-clockmod-capable CPU. Please send an e-mail to <linux@brodo.de>\n");
 		return 0;
 	}
 
 	if (speedstep_detect_processor() == SPEEDSTEP_PROCESSOR_P4M) {
-		printk(KERN_DEBUG PFX "Warning: Pentium 4-M detected. The speedstep-ich or acpi cpufreq \n");
-		printk(KERN_DEBUG PFX "modules offers voltage scaling in addition of frequency scaling. You\n");
-		printk(KERN_DEBUG PFX "should use either one instead of p4-clockmod, if possible.\n");
+		printk(KERN_WARNING PFX "Warning: Pentium 4-M detected. "
+		       "The speedstep-ich or acpi cpufreq modules offer "
+		       "voltage scaling in addition of frequency scaling. "
+		       "You should use either one instead of p4-clockmod, "
+		       "if possible.\n");
 		return speedstep_get_processor_frequency(SPEEDSTEP_PROCESSOR_P4M);
 	}
 
--- diff/arch/i386/kernel/cpu/cpufreq/powernow-k6.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/i386/kernel/cpu/cpufreq/powernow-k6.c	2004-04-21 10:45:33.439619904 +0100
@@ -118,7 +118,9 @@ static int powernow_k6_verify(struct cpu
 
 /**
  * powernow_k6_setpolicy - sets a new CPUFreq policy
- * @policy - new policy
+ * @policy: new policy
+ * @target_freq: the target frequency
+ * @relation: how that frequency relates to achieved frequency (CPUFREQ_RELATION_L or CPUFREQ_RELATION_H)
  *
  * sets a new CPUFreq policy
  */
--- diff/arch/i386/kernel/cpu/cpufreq/powernow-k7.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/i386/kernel/cpu/cpufreq/powernow-k7.c	2004-04-21 10:45:33.440619752 +0100
@@ -98,18 +98,20 @@ static int check_powernow(void)
 		return 0;
 	}
 
-	if ((c->x86_model == 6) && (c->x86_mask == 0)) {
-		printk (KERN_INFO PFX "K7 660[A0] core detected, enabling errata workarounds\n");
-		have_a0 = 1;
-	}
-
 	/* Get maximum capabilities */
 	maxei = cpuid_eax (0x80000000);
 	if (maxei < 0x80000007) {	/* Any powernow info ? */
+#ifdef MODULE
 		printk (KERN_INFO PFX "No powernow capabilities detected\n");
+#endif
 		return 0;
 	}
 
+	if ((c->x86_model == 6) && (c->x86_mask == 0)) {
+		printk (KERN_INFO PFX "K7 660[A0] core detected, enabling errata workarounds\n");
+		have_a0 = 1;
+	}
+
 	cpuid(0x80000007, &eax, &ebx, &ecx, &edx);
 	printk (KERN_INFO PFX "PowerNOW! Technology present. Can scale: ");
 
--- diff/arch/i386/kernel/cpu/cpufreq/powernow-k8.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/i386/kernel/cpu/cpufreq/powernow-k8.c	2004-04-21 10:45:33.442619448 +0100
@@ -1,22 +1,23 @@
 /*
- *   (c) 2003 Advanced Micro Devices, Inc.
+ *   (c) 2003, 2004 Advanced Micro Devices, Inc.
  *  Your use of this code is subject to the terms and conditions of the
- *  GNU general public license version 2. See "../../../COPYING" or
+ *  GNU general public license version 2. See "COPYING" or
  *  http://www.gnu.org/licenses/gpl.html
  *
  *  Support : paul.devriendt@amd.com
  *
  *  Based on the powernow-k7.c module written by Dave Jones.
- *  (C) 2003 Dave Jones <davej@codemonkey.ork.uk> on behalf of SuSE Labs
+ *  (C) 2003 Dave Jones <davej@codemonkey.org.uk> on behalf of SuSE Labs
  *  (C) 2004 Dominik Brodowski <linux@brodo.de>
  *  (C) 2004 Pavel Machek <pavel@suse.cz>
  *  Licensed under the terms of the GNU GPL License version 2.
  *  Based upon datasheets & sample CPUs kindly provided by AMD.
  *
+ *  Valuable input gratefully received from Dave Jones, Pavel Machek,
+ *  Dominik Brodowski, and others.
  *  Processor information obtained from Chapter 9 (Power and Thermal Management)
  *  of the "BIOS and Kernel Developer's Guide for the AMD Athlon 64 and AMD
- *  Opteron Processors", revision 3.03, available for download from www.amd.com
- *
+ *  Opteron Processors" available for download from www.amd.com
  */
 
 #include <linux/kernel.h>
@@ -31,55 +32,41 @@
 #include <asm/io.h>
 #include <asm/delay.h>
 
+#ifdef CONFIG_X86_POWERNOW_K8_ACPI
+#include <linux/acpi.h>
+#include <acpi/processor.h>
+#endif
+
 #define PFX "powernow-k8: "
 #define BFX PFX "BIOS error: "
-#define VERSION "version 1.00.08a"
+#define VERSION "version 1.00.08b"
 #include "powernow-k8.h"
 
-static u32 vstable;	/* voltage stabalization time, from PSB, units 20 us */
-static u32 plllock;	/* pll lock time, from PSB, units 1 us */
-static u32 numps;	/* number of p-states, from PSB */
-static u32 rvo;		/* ramp voltage offset, from PSB */
-static u32 irt;		/* isochronous relief time, from PSB */
-static u32 vidmvs;	/* usable value calculated from mvs, from PSB */
-static u32 currvid;	/* keep track of the current fid / vid */
-static u32 currfid;
-
-static struct cpufreq_frequency_table *powernow_table;
-
-/*
-The PSB table supplied by BIOS allows for the definition of the number of
-p-states that can be used when running on a/c, and the number of p-states
-that can be used when running on battery. This allows laptop manufacturers
-to force the system to save power when running from battery. The relationship 
-is :
-   1 <= number_of_battery_p_states <= maximum_number_of_p_states
-
-This driver does NOT have the support in it to detect transitions from
-a/c power to battery power, and thus trigger the transition to a lower
-p-state if required. This is because I need ACPI and the 2.6 kernel to do 
-this, and this is a 2.4 kernel driver. Check back for a new improved driver
-for the 2.6 kernel soon.
-
-This code therefore assumes it is on battery at all times, and thus
-restricts performance to number_of_battery_p_states. For desktops, 
-  number_of_battery_p_states == maximum_number_of_pstates, 
-so this is not actually a restriction.
-*/
+/* serialize freq changes  */
+static DECLARE_MUTEX(fidvid_sem);
 
-static u32 batps;	/* limit on the number of p states when on battery */
-			/* - set by BIOS in the PSB/PST                    */
+static struct powernow_k8_data *powernow_data[NR_CPUS];
 
- /* Return a frequency in MHz, given an input fid */
+/* Return a frequency in MHz, given an input fid */
 static u32 find_freq_from_fid(u32 fid)
 {
- 	return 800 + (fid * 100);
+	return 800 + (fid * 100);
 }
 
+/* Return a frequency in KHz, given an input fid */
+static u32 find_khz_freq_from_fid(u32 fid)
+{
+	return 1000 * find_freq_from_fid(fid);
+}
+
+/* Return a voltage in miliVolts, given an input vid */
+static u32 find_millivolts_from_vid(struct powernow_k8_data *data, u32 vid)
+{
+	return 1550-vid*25;
+}
 
 /* Return the vco fid for an input fid */
-static u32
-convert_fid_to_vco_fid(u32 fid)
+static u32 convert_fid_to_vco_fid(u32 fid)
 {
 	if (fid < HI_FID_TABLE_BOTTOM) {
 		return 8 + (2 * fid);
@@ -89,11 +76,10 @@ convert_fid_to_vco_fid(u32 fid)
 }
 
 /*
- * Return 1 if the pending bit is set. Unless we are actually just told the
- * processor to transition a state, seeing this bit set is really bad news.
+ * Return 1 if the pending bit is set. Unless we just instructed the processor
+ * to transition to a new state, seeing this bit set is really bad news.
  */
-static inline int
-pending_bit_stuck(void)
+static int pending_bit_stuck(void)
 {
 	u32 lo, hi;
 
@@ -102,11 +88,10 @@ pending_bit_stuck(void)
 }
 
 /*
- * Update the global current fid / vid values from the status msr. Returns 1
- * on error.
+ * Update the global current fid / vid values from the status msr.
+ * Returns 1 on error.
  */
-static int
-query_current_values_with_pending_wait(void)
+static int query_current_values_with_pending_wait(struct powernow_k8_data *data)
 {
 	u32 lo, hi;
 	u32 i = 0;
@@ -120,63 +105,74 @@ query_current_values_with_pending_wait(v
 		rdmsr(MSR_FIDVID_STATUS, lo, hi);
 	}
 
-	currvid = hi & MSR_S_HI_CURRENT_VID;
-	currfid = lo & MSR_S_LO_CURRENT_FID;
+	data->currvid = hi & MSR_S_HI_CURRENT_VID;
+	data->currfid = lo & MSR_S_LO_CURRENT_FID;
 
 	return 0;
 }
 
 /* the isochronous relief time */
-static inline void
-count_off_irt(void)
+static void count_off_irt(struct powernow_k8_data *data)
 {
-	udelay((1 << irt) * 10);
+	udelay((1 << data->irt) * 10);
 	return;
 }
 
 /* the voltage stabalization time */
-static inline void
-count_off_vst(void)
+static void count_off_vst(struct powernow_k8_data *data)
 {
-	udelay(vstable * VST_UNITS_20US);
+	udelay(data->vstable * VST_UNITS_20US);
 	return;
 }
 
+/* need to init the control msr to a safe value (for each cpu) */
+static void fidvid_msr_init(void)
+{
+	u32 lo, hi;
+	u8 fid, vid;
+
+	rdmsr(MSR_FIDVID_STATUS, lo, hi);
+	vid = hi & MSR_S_HI_CURRENT_VID;
+	fid = lo & MSR_S_LO_CURRENT_FID;
+	lo = fid | (vid << MSR_C_LO_VID_SHIFT);
+	hi = MSR_C_HI_STP_GNT_BENIGN;
+	dprintk(PFX "cpu%d, init lo 0x%x, hi 0x%x\n", smp_processor_id(), lo, hi);
+	wrmsr(MSR_FIDVID_CTL, lo, hi);
+}
+
+
 /* write the new fid value along with the other control fields to the msr */
-static int
-write_new_fid(u32 fid)
+static int write_new_fid(struct powernow_k8_data *data, u32 fid)
 {
 	u32 lo;
-	u32 savevid = currvid;
+	u32 savevid = data->currvid;
 
-	if ((fid & INVALID_FID_MASK) || (currvid & INVALID_VID_MASK)) {
+	if ((fid & INVALID_FID_MASK) || (data->currvid & INVALID_VID_MASK)) {
 		printk(KERN_ERR PFX "internal error - overflow on fid write\n");
 		return 1;
 	}
 
-	lo = fid | (currvid << MSR_C_LO_VID_SHIFT) | MSR_C_LO_INIT_FID_VID;
+	lo = fid | (data->currvid << MSR_C_LO_VID_SHIFT) | MSR_C_LO_INIT_FID_VID;
 
-	dprintk(KERN_DEBUG PFX "writing fid %x, lo %x, hi %x\n",
-		fid, lo, plllock * PLL_LOCK_CONVERSION);
+	dprintk(KERN_DEBUG PFX "writing fid 0x%x, lo 0x%x, hi 0x%x\n",
+		fid, lo, data->plllock * PLL_LOCK_CONVERSION);
 
-	wrmsr(MSR_FIDVID_CTL, lo, plllock * PLL_LOCK_CONVERSION);
+	wrmsr(MSR_FIDVID_CTL, lo, data->plllock * PLL_LOCK_CONVERSION);
 
-	if (query_current_values_with_pending_wait())
+	if (query_current_values_with_pending_wait(data))
 		return 1;
 
-	count_off_irt();
+	count_off_irt(data);
 
-	if (savevid != currvid) {
-		printk(KERN_ERR PFX
-		       "vid changed on fid transition, save %x, currvid %x\n",
-		       savevid, currvid);
+	if (savevid != data->currvid) {
+		printk(KERN_ERR PFX "vid change on fid trans, old 0x%x, new 0x%x\n",
+		       savevid, data->currvid);
 		return 1;
 	}
 
-	if (fid != currfid) {
-		printk(KERN_ERR PFX
-		       "fid transition failed, fid %x, currfid %x\n",
-		        fid, currfid);
+	if (fid != data->currfid) {
+		printk(KERN_ERR PFX "fid trans failed, fid 0x%x, curr 0x%x\n", fid,
+		        data->currfid);
 		return 1;
 	}
 
@@ -184,39 +180,35 @@ write_new_fid(u32 fid)
 }
 
 /* Write a new vid to the hardware */
-static int
-write_new_vid(u32 vid)
+static int write_new_vid(struct powernow_k8_data *data, u32 vid)
 {
 	u32 lo;
-	u32 savefid = currfid;
+	u32 savefid = data->currfid;
 
-	if ((currfid & INVALID_FID_MASK) || (vid & INVALID_VID_MASK)) {
+	if ((data->currfid & INVALID_FID_MASK) || (vid & INVALID_VID_MASK)) {
 		printk(KERN_ERR PFX "internal error - overflow on vid write\n");
 		return 1;
 	}
 
-	lo = currfid | (vid << MSR_C_LO_VID_SHIFT) | MSR_C_LO_INIT_FID_VID;
+	lo = data->currfid | (vid << MSR_C_LO_VID_SHIFT) | MSR_C_LO_INIT_FID_VID;
 
-	dprintk(KERN_DEBUG PFX "writing vid %x, lo %x, hi %x\n",
+	dprintk(KERN_DEBUG PFX "writing vid 0x%x, lo 0x%x, hi 0x%x\n",
 		vid, lo, STOP_GRANT_5NS);
 
 	wrmsr(MSR_FIDVID_CTL, lo, STOP_GRANT_5NS);
 
-	if (query_current_values_with_pending_wait()) {
+	if (query_current_values_with_pending_wait(data))
 		return 1;
-	}
 
-	if (savefid != currfid) {
-		printk(KERN_ERR PFX
-		       "fid changed on vid transition, save %x currfid %x\n",
-		       savefid, currfid);
+	if (savefid != data->currfid) {
+		printk(KERN_ERR PFX "fid changed on vid trans, old 0x%x new 0x%x\n",
+		       savefid, data->currfid);
 		return 1;
 	}
 
-	if (vid != currvid) {
-		printk(KERN_ERR PFX
-		       "vid transition failed, vid %x, currvid %x\n",
-		       vid, currvid);
+	if (vid != data->currvid) {
+		printk(KERN_ERR PFX "vid trans failed, vid 0x%x, curr 0x%x\n", vid,
+				data->currvid);
 		return 1;
 	}
 
@@ -228,293 +220,284 @@ write_new_vid(u32 vid)
  * Decreasing vid codes represent increasing voltages:
  * vid of 0 is 1.550V, vid of 0x1e is 0.800V, vid of 0x1f is off.
  */
-static int
-decrease_vid_code_by_step(u32 reqvid, u32 step)
+static int decrease_vid_code_by_step(struct powernow_k8_data *data, u32 reqvid, u32 step)
 {
-	if ((currvid - reqvid) > step)
-		reqvid = currvid - step;
+	if ((data->currvid - reqvid) > step)
+		reqvid = data->currvid - step;
 
-	if (write_new_vid(reqvid))
+	if (write_new_vid(data, reqvid))
 		return 1;
 
-	count_off_vst();
+	count_off_vst(data);
 
 	return 0;
 }
 
 /* Change the fid and vid, by the 3 phases. */
-static inline int
-transition_fid_vid(u32 reqfid, u32 reqvid)
+static int transition_fid_vid(struct powernow_k8_data *data, u32 reqfid, u32 reqvid)
 {
-	if (core_voltage_pre_transition(reqvid))
+	if (core_voltage_pre_transition(data, reqvid))
 		return 1;
 
-	if (core_frequency_transition(reqfid))
+	if (core_frequency_transition(data, reqfid))
 		return 1;
 
-	if (core_voltage_post_transition(reqvid))
+	if (core_voltage_post_transition(data, reqvid))
 		return 1;
 
-	if (query_current_values_with_pending_wait())
+	if (query_current_values_with_pending_wait(data))
 		return 1;
 
-	if ((reqfid != currfid) || (reqvid != currvid)) {
-		printk(KERN_ERR PFX "failed: req 0x%x 0x%x, curr 0x%x 0x%x\n",
-		       reqfid, reqvid, currfid, currvid);
+	if ((reqfid != data->currfid) || (reqvid != data->currvid)) {
+		printk(KERN_ERR PFX "failed (cpu%d): req 0x%x 0x%x, curr 0x%x 0x%x\n",
+				smp_processor_id(),
+				reqfid, reqvid, data->currfid, data->currvid);
 		return 1;
 	}
 
-	dprintk(KERN_INFO PFX
-		"transitioned: new fid 0x%x, vid 0x%x\n", currfid, currvid);
+	dprintk(KERN_INFO PFX "transitioned (cpu%d): new fid 0x%x, vid 0x%x\n",
+		smp_processor_id(), data->currfid, data->currvid);
 
 	return 0;
 }
 
-/*
- * Phase 1 - core voltage transition ... setup appropriate voltage for the
- * fid transition.
- */
-static inline int
-core_voltage_pre_transition(u32 reqvid)
+/* Phase 1 - core voltage transition ... setup voltage */
+static int core_voltage_pre_transition(struct powernow_k8_data *data, u32 reqvid)
 {
-	u32 rvosteps = rvo;
-	u32 savefid = currfid;
+	u32 rvosteps = data->rvo;
+	u32 savefid = data->currfid;
 
 	dprintk(KERN_DEBUG PFX
-		"ph1: start, currfid 0x%x, currvid 0x%x, reqvid 0x%x, rvo %x\n",
-		currfid, currvid, reqvid, rvo);
-
-	while (currvid > reqvid) {
-		dprintk(KERN_DEBUG PFX "ph1: curr 0x%x, requesting vid 0x%x\n",
-			currvid, reqvid);
-		if (decrease_vid_code_by_step(reqvid, vidmvs))
+		"ph1 (cpu%d): start, currfid 0x%x, currvid 0x%x, reqvid 0x%x, rvo 0x%x\n",
+		smp_processor_id();
+		data->currfid, data->currvid, reqvid, data->rvo);
+
+	while (data->currvid > reqvid) {
+		dprintk(KERN_DEBUG PFX "ph1: curr 0x%x, req vid 0x%x\n",
+			data->currvid, reqvid);
+		if (decrease_vid_code_by_step(data, reqvid, data->vidmvs))
 			return 1;
 	}
 
 	while (rvosteps > 0) {
-		if (currvid == 0) {
+		if (data->currvid == 0) {
 			rvosteps = 0;
 		} else {
 			dprintk(KERN_DEBUG PFX
-				"ph1: changing vid for rvo, requesting 0x%x\n",
-				currvid - 1);
-			if (decrease_vid_code_by_step(currvid - 1, 1))
+				"ph1: changing vid for rvo, req 0x%x\n",
+				data->currvid - 1);
+			if (decrease_vid_code_by_step(data, data->currvid - 1, 1))
 				return 1;
 			rvosteps--;
 		}
 	}
 
-	if (query_current_values_with_pending_wait())
+	if (query_current_values_with_pending_wait(data))
 		return 1;
 
-	if (savefid != currfid) {
-		printk(KERN_ERR PFX "ph1 err, currfid changed 0x%x\n", currfid);
+	if (savefid != data->currfid) {
+		printk(KERN_ERR PFX "ph1 err, currfid changed 0x%x\n", data->currfid);
 		return 1;
 	}
 
 	dprintk(KERN_DEBUG PFX "ph1 complete, currfid 0x%x, currvid 0x%x\n",
-		currfid, currvid);
+		data->currfid, data->currvid);
 
 	return 0;
 }
 
 /* Phase 2 - core frequency transition */
-static inline int
-core_frequency_transition(u32 reqfid)
+static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid)
 {
 	u32 vcoreqfid;
 	u32 vcocurrfid;
 	u32 vcofiddiff;
-	u32 savevid = currvid;
+	u32 savevid = data->currvid;
 
-	if ((reqfid < HI_FID_TABLE_BOTTOM) && (currfid < HI_FID_TABLE_BOTTOM)) {
-		printk(KERN_ERR PFX "ph2 illegal lo-lo transition 0x%x 0x%x\n",
-		       reqfid, currfid);
+	if ((reqfid < HI_FID_TABLE_BOTTOM) && (data->currfid < HI_FID_TABLE_BOTTOM)) {
+		printk(KERN_ERR PFX "ph2: illegal lo-lo transition 0x%x 0x%x\n",
+			reqfid, data->currfid);
 		return 1;
 	}
 
-	if (currfid == reqfid) {
-		printk(KERN_ERR PFX "ph2 null fid transition 0x%x\n", currfid);
+	if (data->currfid == reqfid) {
+		printk(KERN_ERR PFX "ph2 null fid transition 0x%x\n", data->currfid);
 		return 0;
 	}
 
 	dprintk(KERN_DEBUG PFX
-		"ph2 starting, currfid 0x%x, currvid 0x%x, reqfid 0x%x\n",
-		currfid, currvid, reqfid);
+		"ph2 (cpu%d): starting, currfid 0x%x, currvid 0x%x, reqfid 0x%x\n",
+		smp_processor_id(),
+		data->currfid, data->currvid, reqfid);
 
 	vcoreqfid = convert_fid_to_vco_fid(reqfid);
-	vcocurrfid = convert_fid_to_vco_fid(currfid);
+	vcocurrfid = convert_fid_to_vco_fid(data->currfid);
 	vcofiddiff = vcocurrfid > vcoreqfid ? vcocurrfid - vcoreqfid
 	    : vcoreqfid - vcocurrfid;
 
 	while (vcofiddiff > 2) {
-		if (reqfid > currfid) {
-			if (currfid > LO_FID_TABLE_TOP) {
-				if (write_new_fid(currfid + 2)) {
+		if (reqfid > data->currfid) {
+			if (data->currfid > LO_FID_TABLE_TOP) {
+				if (write_new_fid(data, data->currfid + 2)) {
 					return 1;
 				}
 			} else {
 				if (write_new_fid
-				    (2 + convert_fid_to_vco_fid(currfid))) {
+				    (data, 2 + convert_fid_to_vco_fid(data->currfid))) {
 					return 1;
 				}
 			}
 		} else {
-			if (write_new_fid(currfid - 2))
+			if (write_new_fid(data, data->currfid - 2))
 				return 1;
 		}
 
-		vcocurrfid = convert_fid_to_vco_fid(currfid);
+		vcocurrfid = convert_fid_to_vco_fid(data->currfid);
 		vcofiddiff = vcocurrfid > vcoreqfid ? vcocurrfid - vcoreqfid
 		    : vcoreqfid - vcocurrfid;
 	}
 
-	if (write_new_fid(reqfid))
+	if (write_new_fid(data, reqfid))
 		return 1;
 
-	if (query_current_values_with_pending_wait())
+	if (query_current_values_with_pending_wait(data))
 		return 1;
 
-	if (currfid != reqfid) {
+	if (data->currfid != reqfid) {
 		printk(KERN_ERR PFX
-		       "ph2 mismatch, failed fid transition, curr %x, req %x\n",
-		       currfid, reqfid);
+			"ph2: mismatch, failed fid transition, curr 0x%x, req 0x%x\n",
+			data->currfid, reqfid);
 		return 1;
 	}
 
-	if (savevid != currvid) {
-		printk(KERN_ERR PFX
-		       "ph2 vid changed, save %x, curr %x\n", savevid,
-		       currvid);
+	if (savevid != data->currvid) {
+		printk(KERN_ERR PFX "ph2: vid changed, save 0x%x, curr 0x%x\n",
+			savevid, data->currvid);
 		return 1;
 	}
 
 	dprintk(KERN_DEBUG PFX "ph2 complete, currfid 0x%x, currvid 0x%x\n",
-		currfid, currvid);
+		data->currfid, data->currvid);
 
 	return 0;
 }
 
 /* Phase 3 - core voltage transition flow ... jump to the final vid. */
-static inline int
-core_voltage_post_transition(u32 reqvid)
+static int core_voltage_post_transition(struct powernow_k8_data *data, u32 reqvid)
 {
-	u32 savefid = currfid;
+	u32 savefid = data->currfid;
 	u32 savereqvid = reqvid;
 
-	dprintk(KERN_DEBUG PFX "ph3 starting, currfid 0x%x, currvid 0x%x\n",
-		currfid, currvid);
+	dprintk(KERN_DEBUG PFX "ph3 (cpu%d): starting, currfid 0x%x, currvid 0x%x\n",
+		smp_processor_id(),
+		data->currfid, data->currvid);
 
-	if (reqvid != currvid) {
-		if (write_new_vid(reqvid))
+	if (reqvid != data->currvid) {
+		if (write_new_vid(data, reqvid))
 			return 1;
 
-		if (savefid != currfid) {
+		if (savefid != data->currfid) {
 			printk(KERN_ERR PFX
-			       "ph3: bad fid change, save %x, curr %x\n",
-			       savefid, currfid);
+			       "ph3: bad fid change, save 0x%x, curr 0x%x\n",
+			       savefid, data->currfid);
 			return 1;
 		}
 
-		if (currvid != reqvid) {
+		if (data->currvid != reqvid) {
 			printk(KERN_ERR PFX
-			       "ph3: failed vid transition\n, req %x, curr %x",
-			       reqvid, currvid);
+			       "ph3: failed vid transition\n, req 0x%x, curr 0x%x",
+			       reqvid, data->currvid);
 			return 1;
 		}
 	}
 
-	if (query_current_values_with_pending_wait())
+	if (query_current_values_with_pending_wait(data))
 		return 1;
 
-	if (savereqvid != currvid) {
-		dprintk(KERN_ERR PFX "ph3 failed, currvid 0x%x\n", currvid);
+	if (savereqvid != data->currvid) {
+		dprintk(KERN_ERR PFX "ph3 failed, currvid 0x%x\n", data->currvid);
 		return 1;
 	}
 
-	if (savefid != currfid) {
+	if (savefid != data->currfid) {
 		dprintk(KERN_ERR PFX "ph3 failed, currfid changed 0x%x\n",
-			currfid);
+			data->currfid);
 		return 1;
 	}
 
 	dprintk(KERN_DEBUG PFX "ph3 complete, currfid 0x%x, currvid 0x%x\n",
-		currfid, currvid);
+		data->currfid, data->currvid);
 
 	return 0;
 }
 
-static inline int
-check_supported_cpu(void)
+static int check_supported_cpu(unsigned int cpu)
 {
-	struct cpuinfo_x86 *c = cpu_data;
+	cpumask_t oldmask = CPU_MASK_ALL;
 	u32 eax, ebx, ecx, edx;
+	unsigned int rc = 0;
 
-	if (num_online_cpus() != 1) {
-		printk(KERN_INFO PFX "multiprocessor systems not supported\n");
-		return 0;
-	}
+	oldmask = current->cpus_allowed;
+	set_cpus_allowed(current, cpumask_of_cpu(cpu));
+	schedule();
 
-	if (c->x86_vendor != X86_VENDOR_AMD) {
-#ifdef MODULE
-		printk(KERN_INFO PFX "Not an AMD processor\n");
-#endif
-		return 0;
+	if (smp_processor_id() != cpu) {
+		printk(KERN_ERR "limiting to cpu %u failed\n", cpu);
+		goto out;
 	}
 
+	if (current_cpu_data.x86_vendor != X86_VENDOR_AMD)
+		goto out;
+
 	eax = cpuid_eax(CPUID_PROCESSOR_SIGNATURE);
 	if ((eax & CPUID_XFAM_MOD) == ATHLON64_XFAM_MOD) {
 		dprintk(KERN_DEBUG PFX "AMD Althon 64 Processor found\n");
-		if ((eax & CPUID_F1_STEP) < ATHLON64_REV_C0) {
-			printk(KERN_INFO PFX "Revision C0 or better "
-			       "AMD Athlon 64 processor required\n");
-			return 0;
-		}
 	} else if ((eax & CPUID_XFAM_MOD) == OPTERON_XFAM_MOD) {
 		dprintk(KERN_DEBUG PFX "AMD Opteron Processor found\n");
 	} else {
 		printk(KERN_INFO PFX
 		       "AMD Athlon 64 or AMD Opteron processor required\n");
-		return 0;
+		goto out;
 	}
 
 	eax = cpuid_eax(CPUID_GET_MAX_CAPABILITIES);
 	if (eax < CPUID_FREQ_VOLT_CAPABILITIES) {
 		printk(KERN_INFO PFX
 		       "No frequency change capabilities detected\n");
-		return 0;
+		goto out;
 	}
 
 	cpuid(CPUID_FREQ_VOLT_CAPABILITIES, &eax, &ebx, &ecx, &edx);
 	if ((edx & P_STATE_TRANSITION_CAPABLE) != P_STATE_TRANSITION_CAPABLE) {
 		printk(KERN_INFO PFX "Power state transitions not supported\n");
-		return 0;
+		goto out;
 	}
 
-	printk(KERN_INFO PFX "Found AMD64 processor supporting PowerNow (" VERSION ")\n");
-	return 1;
+	rc = 1;
+
+out:
+	set_cpus_allowed(current, oldmask);
+	schedule();
+	return rc;
+
 }
 
-static int check_pst_table(struct pst_s *pst, u8 maxvid)
+static int check_pst_table(struct powernow_k8_data *data, struct pst_s *pst, u8 maxvid)
 {
 	unsigned int j;
-	u8 lastfid = 0xFF;
+	u8 lastfid = 0xff;
 
-	for (j = 0; j < numps; j++) {
+	for (j = 0; j < data->numps; j++) {
 		if (pst[j].vid > LEAST_VID) {
 			printk(KERN_ERR PFX "vid %d invalid : 0x%x\n", j, pst[j].vid);
 			return -EINVAL;
 		}
-		if (pst[j].vid < rvo) {	/* vid + rvo >= 0 */
-			printk(KERN_ERR PFX
-			       "BIOS error - 0 vid exceeded with pstate %d\n",
-			       j);
+		if (pst[j].vid < data->rvo) {	/* vid + rvo >= 0 */
+			printk(KERN_ERR BFX "0 vid exceeded with pstate %d\n", j);
 			return -ENODEV;
 		}
-		if (pst[j].vid < maxvid + rvo) {	/* vid + rvo >= maxvid */
-			printk(KERN_ERR PFX
-			       "BIOS error - maxvid exceeded with pstate %d\n",
-			       j);
+		if (pst[j].vid < maxvid + data->rvo) {	/* vid + rvo >= maxvid */
+			printk(KERN_ERR BFX "maxvid exceeded with pstate %d\n", j);
 			return -ENODEV;
 		}
 		if ((pst[j].fid > MAX_FID)
@@ -531,20 +514,88 @@ static int check_pst_table(struct pst_s 
 		printk(KERN_ERR PFX "lastfid invalid\n");
 		return -EINVAL;
 	}
-	if (lastfid > LO_FID_TABLE_TOP) {
+	if (lastfid > LO_FID_TABLE_TOP)
 		printk(KERN_INFO PFX  "first fid not from lo freq table\n");
+
+	return 0;
+}
+
+static void print_basics(struct powernow_k8_data *data)
+{
+	int j;
+	for (j = 0; j < data->numps; j++) {
+		printk(KERN_INFO PFX "   %d : fid 0x%x (%d MHz), vid 0x%x (%d mV)\n", j,
+			data->powernow_table[j].index & 0xff,
+			data->powernow_table[j].frequency/1000,
+			data->powernow_table[j].index >> 8,
+			find_millivolts_from_vid(data, data->powernow_table[j].index >> 8));
+	}
+	if (data->batps)
+		printk(KERN_INFO PFX "Only %d pstates on battery\n", data->batps);
+}
+
+static int fill_powernow_table(struct powernow_k8_data *data, struct pst_s *pst, u8 maxvid)
+{
+	struct cpufreq_frequency_table *powernow_table;
+	unsigned int j;
+
+	if (data->batps) {    /* use ACPI support to get full speed on mains power */
+		printk(KERN_WARNING PFX "Only %d pstates usable (use ACPI driver for full range\n", data->batps);
+		data->numps = data->batps;
+	}
+
+	for ( j=1; j<data->numps; j++ ) {
+		if (pst[j-1].fid >= pst[j].fid) {
+			printk(KERN_ERR PFX "PST out of sequence\n");
+			return -EINVAL;
+		}
+	}
+
+	if (data->numps < 2) {
+		printk(KERN_ERR PFX "no p states to transition\n");
+		return -ENODEV;
+	}
+                                                                                                    
+	if (check_pst_table(data, pst, maxvid))
+		return -EINVAL;
+
+	powernow_table = kmalloc((sizeof(struct cpufreq_frequency_table)
+		* (data->numps + 1)), GFP_KERNEL);
+	if (!powernow_table) {
+		printk(KERN_ERR PFX "powernow_table memory alloc failure\n");
+		return -ENOMEM;
+	}
+
+	for (j = 0; j < data->numps; j++) {
+		powernow_table[j].index = pst[j].fid; /* lower 8 bits */
+		powernow_table[j].index |= (pst[j].vid << 8); /* upper 8 bits */
+		powernow_table[j].frequency = find_khz_freq_from_fid(pst[j].fid);
+	}
+	powernow_table[data->numps].frequency = CPUFREQ_TABLE_END;
+	powernow_table[data->numps].index = 0;
+
+	if (query_current_values_with_pending_wait(data)) {
+		kfree(powernow_table);
+		return -EIO;
 	}
 
+	dprintk(KERN_INFO PFX "cfid 0x%x, cvid 0x%x\n", data->currfid, data->currvid);
+	data->powernow_table = powernow_table;
+	print_basics(data);
+
+	for (j = 0; j < data->numps; j++)
+		if ((pst[j].fid==data->currfid) && (pst[j].vid==data->currvid))
+			return 0;
+
+	dprintk(KERN_ERR PFX "currfid/vid do not match PST, ignoring\n");
 	return 0;
 }
 
 /* Find and validate the PSB/PST table in BIOS. */
-static inline int
-find_psb_table(void)
+static int find_psb_table(struct powernow_k8_data *data)
 {
 	struct psb_s *psb;
-	struct pst_s *pst;
-	unsigned int i, j;
+	unsigned int i;
 	u32 mvs;
 	u8 maxvid;
 
@@ -570,20 +621,19 @@ find_psb_table(void)
 			return -ENODEV;
 		}
 
-		vstable = psb->voltagestabilizationtime;
+		data->vstable = psb->voltagestabilizationtime;
+		dprintk(KERN_INFO PFX "voltage stabilization time: %d(*20us)\n", data->vstable);
+
 		dprintk(KERN_DEBUG PFX "flags2: 0x%x\n", psb->flags2);
-		rvo = psb->flags2 & 3;
-		irt = ((psb->flags2) >> 2) & 3;
+		data->rvo = psb->flags2 & 3;
+		data->irt = ((psb->flags2) >> 2) & 3;
 		mvs = ((psb->flags2) >> 4) & 3;
-		vidmvs = 1 << mvs;
-		batps = ((psb->flags2) >> 6) & 3;
+		data->vidmvs = 1 << mvs;
+		data->batps = ((psb->flags2) >> 6) & 3;
 
-		printk(KERN_INFO PFX "voltage stable in %d usec", vstable * 20);
-		if (batps)
-			printk(", only %d lowest states on battery", batps);
-		printk(", ramp voltage offset: %d", rvo);
-		printk(", isochronous relief time: %d", irt);
-		printk(", maximum voltage step: %d\n", mvs);
+		dprintk(KERN_INFO PFX "ramp voltage offset: %d\n", data->rvo);
+		dprintk(KERN_INFO PFX "isochronous relief time: %d\n", data->irt);
+		dprintk(KERN_INFO PFX "maximum voltage step: %d - 0x%x\n", mvs, data->vidmvs);
 
 		dprintk(KERN_DEBUG PFX "numpst: 0x%x\n", psb->numpst);
 		if (psb->numpst != 1) {
@@ -591,241 +641,386 @@ find_psb_table(void)
 			return -ENODEV;
 		}
 
-		dprintk(KERN_DEBUG PFX "cpuid: 0x%x\n", psb->cpuid);
-
-		plllock = psb->plllocktime;
-		printk(KERN_INFO PFX "pll lock time: 0x%x, ", plllock);
-
+		data->plllock = psb->plllocktime;
+		dprintk(KERN_INFO PFX "plllocktime: 0x%x (units 1us)\n", psb->plllocktime);
+		dprintk(KERN_INFO PFX "maxfid: 0x%x\n", psb->maxfid);
+		dprintk(KERN_INFO PFX "maxvid: 0x%x\n", psb->maxvid);
 		maxvid = psb->maxvid;
-		printk("maxfid 0x%x (%d MHz), maxvid 0x%x\n", 
-		       psb->maxfid, find_freq_from_fid(psb->maxfid), maxvid);
 
-		numps = psb->numpstates;
-		if (numps < 2) {
-			printk(KERN_ERR BFX "no p states to transition\n");
-			return -ENODEV;
-		}
+		data->numps = psb->numpstates;
+		dprintk(KERN_INFO PFX "numpstates: 0x%x\n", data->numps);
+		return fill_powernow_table(data, (struct pst_s *)(psb+1), maxvid);
+	}
+	/*
+	 * If you see this message, complain to BIOS manufacturer. If
+	 * he tells you "we do not support Linux" or some similar
+	 * nonsense, remember that Windows 2000 uses the same legacy
+	 * mechanism that the old Linux PSB driver uses. Tell them it
+	 * is broken with Windows 2000.
+	 *
+	 * The reference to the AMD documentation is chapter 9 in the
+	 * BIOS and Kernel Developer's Guide, which is available on
+	 * www.amd.com
+	 */
+	printk(KERN_ERR PFX "BIOS error - no PSB\n");
+	return -ENODEV;
+}
 
-		if (batps == 0) {
-			batps = numps;
-		} else if (batps > numps) {
-			printk(KERN_ERR BFX "batterypstates > numpstates\n");
-			batps = numps;
-		} else {
-			printk(KERN_ERR PFX
-			       "Restricting operation to %d p-states\n", batps);
-			printk(KERN_ERR PFX
-			       "Check for an updated driver to access all "
-			       "%d p-states\n", numps);
-		}
+#ifdef CONFIG_X86_POWERNOW_K8_ACPI
+static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index)
+{
+	if (!data->acpi_data.state_count)
+		return;
 
-		if (numps <= 1) {
-			printk(KERN_ERR PFX "only 1 p-state to transition\n");
-			return -ENODEV;
-		}
+	data->irt = (data->acpi_data.states[index].control >> IRT_SHIFT) & IRT_MASK;
+	data->rvo = (data->acpi_data.states[index].control >> RVO_SHIFT) & RVO_MASK;
+	data->plllock = (data->acpi_data.states[index].control >> PLL_L_SHIFT) & PLL_L_MASK;
+	data->vidmvs = 1 << ((data->acpi_data.states[index].control >> MVS_SHIFT) & MVS_MASK);
+	data->vstable = (data->acpi_data.states[index].control >> VST_SHIFT) & VST_MASK;
+}
 
-		pst = (struct pst_s *) (psb + 1);
-		if (check_pst_table(pst, maxvid))
-			return -EINVAL;
+static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
+{
+	int i;
+	int cntlofreq = 0;
+	struct cpufreq_frequency_table *powernow_table;
 
-		powernow_table = kmalloc((sizeof(struct cpufreq_frequency_table) * (numps + 1)), GFP_KERNEL);
-		if (!powernow_table) {
-			printk(KERN_ERR PFX "powernow_table memory alloc failure\n");
-			return -ENOMEM;
-		}
+	if (acpi_processor_register_performance(&data->acpi_data, data->cpu)) {
+		dprintk(KERN_DEBUG PFX "register performance failed\n");
+		return -EIO;
+	}
 
-		for (j = 0; j < psb->numpstates; j++) {
-			powernow_table[j].index = pst[j].fid; /* lower 8 bits */
-			powernow_table[j].index |= (pst[j].vid << 8); /* upper 8 bits */
-		}
+	/* verify the data contained in the ACPI structures */
+	if (data->acpi_data.state_count <= 1) {
+		dprintk(KERN_DEBUG PFX "No ACPI P-States\n");
+		goto err_out;
+	}
 
-		/* If you want to override your frequency tables, this
-		   is right place. */
+	if ((data->acpi_data.control_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) ||
+		(data->acpi_data.status_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) {
+		dprintk(KERN_DEBUG PFX "Invalid control/status registers\n");
+		goto err_out;
+	}
 
-		for (j = 0; j < numps; j++) {
-			powernow_table[j].frequency = find_freq_from_fid(powernow_table[j].index & 0xff)*1000;
-			printk(KERN_INFO PFX "   %d : fid 0x%x (%d MHz), vid 0x%x\n", j,
-			       powernow_table[j].index & 0xff,
-			       powernow_table[j].frequency/1000,
-			       powernow_table[j].index >> 8);
-		}
+	/* fill in data->powernow_table */
+	powernow_table = kmalloc((sizeof(struct cpufreq_frequency_table)
+		* (data->acpi_data.state_count + 1)), GFP_KERNEL);
+	if (!powernow_table) {
+		dprintk(KERN_ERR PFX "powernow_table memory alloc failure\n");
+		goto err_out;
+	}
 
-		powernow_table[numps].frequency = CPUFREQ_TABLE_END;
-		powernow_table[numps].index = 0;
+	for (i = 0; i < data->acpi_data.state_count; i++) {
+		u32 fid = data->acpi_data.states[i].control & FID_MASK;
+		u32 vid = (data->acpi_data.states[i].control >> VID_SHIFT) & VID_MASK;
 
-		if (query_current_values_with_pending_wait()) {
-			kfree(powernow_table);
-			return -EIO;
-		}
+		dprintk(KERN_INFO PFX "   %d : fid 0x%x, vid 0x%x\n", i, fid, vid);
 
-		printk(KERN_INFO PFX "currfid 0x%x (%d MHz), currvid 0x%x\n",
-		       currfid, find_freq_from_fid(currfid), currvid);
+		powernow_table[i].index = fid; /* lower 8 bits */
+		powernow_table[i].index |= (vid << 8); /* upper 8 bits */
+		powernow_table[i].frequency = find_khz_freq_from_fid(fid);
 
-		for (j = 0; j < numps; j++)
-			if ((pst[j].fid==currfid) && (pst[j].vid==currvid))
-				return 0;
+		/* verify frequency is OK */
+		if ((powernow_table[i].frequency > (MAX_FREQ * 1000)) ||
+			(powernow_table[i].frequency < (MIN_FREQ * 1000))) {
+			dprintk(KERN_INFO PFX "invalid freq %u kHz\n", powernow_table[i].frequency);
+			powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID;
+			continue;
+		}
 
-		printk(KERN_ERR BFX "currfid/vid do not match PST, ignoring\n");
-		return 0;
+		/* verify only 1 entry from the lo frequency table */
+		if ((fid < HI_FID_TABLE_BOTTOM) && (cntlofreq++)) {
+			printk(KERN_ERR PFX "Too many lo freq table entries\n");
+			goto err_out;
+		}
+                                                                                                            
+		if (powernow_table[i].frequency != (data->acpi_data.states[i].core_frequency * 1000)) {
+			printk(KERN_INFO PFX "invalid freq entries %u kHz vs. %u kHz\n",
+				powernow_table[i].frequency,
+				(unsigned int) (data->acpi_data.states[i].core_frequency * 1000));
+			powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID;
+			continue;
+		}
 	}
 
-	printk(KERN_ERR BFX "no PSB\n");
+	powernow_table[data->acpi_data.state_count].frequency = CPUFREQ_TABLE_END;
+	powernow_table[data->acpi_data.state_count].index = 0;
+	data->powernow_table = powernow_table;
+
+	/* fill in data */
+	data->numps = data->acpi_data.state_count;
+	print_basics(data);
+	powernow_k8_acpi_pst_values(data, 0);
+	return 0;
+err_out:
+	acpi_processor_unregister_performance(&data->acpi_data, data->cpu);
+
+	/* data->acpi_data.state_count informs us at ->exit() whether ACPI was used */
+	data->acpi_data.state_count = 0;
+                                                                                                            
 	return -ENODEV;
 }
 
+static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data)
+{
+	if (data->acpi_data.state_count)
+		acpi_processor_unregister_performance(&data->acpi_data, data->cpu);
+}
+
+#else
+static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) { return -ENODEV; }
+static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) { return; }
+static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index) { return; }
+#endif /* CONFIG_X86_POWERNOW_K8_ACPI */
+
 /* Take a frequency, and issue the fid/vid transition command */
-static inline int
-transition_frequency(unsigned int index)
+static int transition_frequency(struct powernow_k8_data *data, unsigned int index)
 {
 	u32 fid;
 	u32 vid;
 	int res;
 	struct cpufreq_freqs freqs;
 
+	dprintk(KERN_DEBUG PFX "cpu %d transition to index %u\n",
+		smp_processor_id(), index );
+
 	/* fid are the lower 8 bits of the index we stored into
 	 * the cpufreq frequency table in find_psb_table, vid are 
 	 * the upper 8 bits.
 	 */
 
-	fid = powernow_table[index].index & 0xFF;
-	vid = (powernow_table[index].index & 0xFF00) >> 8;
+	fid = data->powernow_table[index].index & 0xFF;
+	vid = (data->powernow_table[index].index & 0xFF00) >> 8;
 
 	dprintk(KERN_DEBUG PFX "table matched fid 0x%x, giving vid 0x%x\n",
 		fid, vid);
 
-	if (query_current_values_with_pending_wait())
+	if (query_current_values_with_pending_wait(data))
 		return 1;
 
-	if ((currvid == vid) && (currfid == fid)) {
+	if ((data->currvid == vid) && (data->currfid == fid)) {
 		dprintk(KERN_DEBUG PFX
 			"target matches current values (fid 0x%x, vid 0x%x)\n",
 			fid, vid);
 		return 0;
 	}
 
-	if ((fid < HI_FID_TABLE_BOTTOM) && (currfid < HI_FID_TABLE_BOTTOM)) {
+	if ((fid < HI_FID_TABLE_BOTTOM) && (data->currfid < HI_FID_TABLE_BOTTOM)) {
 		printk(KERN_ERR PFX
-		       "ignoring illegal change in lo freq table-%x to %x\n",
-		       currfid, fid);
+		       "ignoring illegal change in lo freq table-%x to 0x%x\n",
+		       data->currfid, fid);
 		return 1;
 	}
 
-	dprintk(KERN_DEBUG PFX "changing to fid 0x%x, vid 0x%x\n", fid, vid);
+	dprintk(KERN_DEBUG PFX "cpu %d, changing to fid 0x%x, vid 0x%x\n",
+				smp_processor_id(), fid, vid);
 
-	freqs.cpu = 0;	/* only true because SMP not supported */
+	freqs.cpu = data->cpu;
 
-	freqs.old = find_freq_from_fid(currfid);
-	freqs.new = find_freq_from_fid(fid);
+	freqs.old = find_khz_freq_from_fid(data->currfid);
+	freqs.new = find_khz_freq_from_fid(fid);
 	cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
 
-	res = transition_fid_vid(fid, vid);
+	down(&fidvid_sem);
+	res = transition_fid_vid(data, fid, vid);
+	up(&fidvid_sem);
 
-	freqs.new = find_freq_from_fid(currfid);
+	freqs.new = find_khz_freq_from_fid(data->currfid);
 	cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
 
 	return res;
 }
 
 /* Driver entry point to switch to the target frequency */
-static int
-powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsigned relation)
+static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsigned relation)
 {
-	u32 checkfid = currfid;
-	u32 checkvid = currvid;
+	cpumask_t oldmask = CPU_MASK_ALL;
+	struct powernow_k8_data *data = powernow_data[pol->cpu];
+	u32 checkfid = data->currfid;
+	u32 checkvid = data->currvid;
 	unsigned int newstate;
+	int ret = -EIO;
+
+	/* only run on specific CPU from here on */
+	oldmask = current->cpus_allowed;
+	set_cpus_allowed(current, cpumask_of_cpu(pol->cpu));
+	schedule();
+
+	if (smp_processor_id() != pol->cpu) {
+		printk(KERN_ERR "limiting to cpu %u failed\n", pol->cpu);
+		goto sched_out;
+	}
+
+	/* from this point, do not exit without restoring preempt and cpu */
+	preempt_disable();
 
 	if (pending_bit_stuck()) {
-		printk(KERN_ERR PFX "drv targ fail: change pending bit set\n");
-		return -EIO;
+		printk(KERN_ERR PFX "failing targ, change pending bit set\n");
+		goto err_out;
 	}
 
-	dprintk(KERN_DEBUG PFX "targ: %d kHz, min %d, max %d, relation %d\n",
-		targfreq, pol->min, pol->max, relation);
+	dprintk(KERN_DEBUG PFX "targ: cpu %d, %d kHz, min %d, max %d, relation %d\n",
+		pol->cpu, targfreq, pol->min, pol->max, relation);
 
-	if (query_current_values_with_pending_wait())
-		return -EIO;
+	if (query_current_values_with_pending_wait(data)) {
+		ret = -EIO;
+		goto err_out;
+	}
 
 	dprintk(KERN_DEBUG PFX "targ: curr fid 0x%x, vid 0x%x\n",
-		currfid, currvid);
+		data->currfid, data->currvid);
 
-	if ((checkvid != currvid) || (checkfid != currfid)) {
+	if ((checkvid != data->currvid) || (checkfid != data->currfid)) {
 		printk(KERN_ERR PFX
 		       "error - out of sync, fid 0x%x 0x%x, vid 0x%x 0x%x\n",
-		       checkfid, currfid, checkvid, currvid);
+		       checkfid, data->currfid, checkvid, data->currvid);
 	}
 
-	if (cpufreq_frequency_table_target(pol, powernow_table, targfreq, relation, &newstate))
-		return -EINVAL;
-	
-	if (transition_frequency(newstate))
-	{
+	if (cpufreq_frequency_table_target(pol, data->powernow_table, targfreq, relation, &newstate))
+		goto err_out;
+
+	powernow_k8_acpi_pst_values(data, newstate);
+
+	if (transition_frequency(data, newstate)) {
 		printk(KERN_ERR PFX "transition frequency failed\n");
-		return 1;
+		ret = 1;
+		goto err_out;
 	}
 
-	pol->cur = 1000 * find_freq_from_fid(currfid);
+	pol->cur = find_khz_freq_from_fid(data->currfid);
+	ret = 0;
 
-	return 0;
+err_out:
+	preempt_enable_no_resched();
+sched_out:
+	set_cpus_allowed(current, oldmask);
+	schedule();
+
+	return ret;
 }
 
 /* Driver entry point to verify the policy and range of frequencies */
-static int
-powernowk8_verify(struct cpufreq_policy *pol)
+static int powernowk8_verify(struct cpufreq_policy *pol)
 {
-	if (pending_bit_stuck()) {
-		printk(KERN_ERR PFX "failing verify, change pending bit set\n");
-		return -EIO;
-	}
+	struct powernow_k8_data *data = powernow_data[pol->cpu];
 
-	return cpufreq_frequency_table_verify(pol, powernow_table);
+	return cpufreq_frequency_table_verify(pol, data->powernow_table);
 }
 
 /* per CPU init entry point to the driver */
-static int __init
-powernowk8_cpu_init(struct cpufreq_policy *pol)
+static int __init powernowk8_cpu_init(struct cpufreq_policy *pol)
 {
-	if (pol->cpu != 0) {
-		printk(KERN_ERR PFX "init not cpu 0\n");
+	struct powernow_k8_data *data;
+	cpumask_t oldmask = CPU_MASK_ALL;
+	int rc;
+
+	if (!check_supported_cpu(pol->cpu))
 		return -ENODEV;
+
+	data = kmalloc(sizeof(struct powernow_k8_data), GFP_KERNEL);
+	if (!data) {
+		printk(KERN_ERR PFX "unable to alloc powernow_k8_data");
+		return -ENOMEM;
+	}
+	memset(data,0,sizeof(struct powernow_k8_data));
+
+	data->cpu = pol->cpu;
+
+	if (powernow_k8_cpu_init_acpi(data)) {
+		/*
+		 * Use the PSB BIOS structure. This is only availabe on
+		 * an UP version, and is deprecated by AMD.
+		 */
+
+		if (pol->cpu != 0) {
+			printk(KERN_ERR PFX "init not cpu 0\n");
+			kfree(data);
+			return -ENODEV;
+		}
+		if ((num_online_cpus() != 1) || (num_possible_cpus() != 1)) {
+			printk(KERN_INFO PFX "MP systems not supported by PSB BIOS structure\n");
+			kfree(data);
+			return 0;
+		}
+		rc = find_psb_table(data);
+		if (rc) {
+			kfree(data);
+			return -ENODEV;
+		}
+	}
+
+	/* only run on specific CPU from here on */
+	oldmask = current->cpus_allowed;
+	set_cpus_allowed(current, cpumask_of_cpu(pol->cpu));
+	schedule();
+
+	if (smp_processor_id() != pol->cpu) {
+		printk(KERN_ERR "limiting to cpu %u failed\n", pol->cpu);
+		goto err_out;
 	}
 
+	if (pending_bit_stuck()) {
+		printk(KERN_ERR PFX "failing init, change pending bit set\n");
+		goto err_out;
+	}
+
+	if (query_current_values_with_pending_wait(data))
+		goto err_out;
+
+	fidvid_msr_init();
+
+	/* run on any CPU again */
+	set_cpus_allowed(current, oldmask);
+	schedule();
+
 	pol->governor = CPUFREQ_DEFAULT_GOVERNOR;
 
 	/* Take a crude guess here. 
-	 * That guess was in microseconds, so multply with 1000 */
-	pol->cpuinfo.transition_latency = (((rvo + 8) * vstable * VST_UNITS_20US)
-	    + (3 * (1 << irt) * 10)) * 1000;
-
-	if (query_current_values_with_pending_wait())
-		return -EIO;
+	 * That guess was in microseconds, so multiply with 1000 */
+	pol->cpuinfo.transition_latency = (((data->rvo + 8) * data->vstable * VST_UNITS_20US)
+	    + (3 * (1 << data->irt) * 10)) * 1000;
 
-	pol->cur = 1000 * find_freq_from_fid(currfid);
+	pol->cur = find_khz_freq_from_fid(data->currfid);
 	dprintk(KERN_DEBUG PFX "policy current frequency %d kHz\n", pol->cur);
 
 	/* min/max the cpu is capable of */
-	if (cpufreq_frequency_table_cpuinfo(pol, powernow_table)) {
+	if (cpufreq_frequency_table_cpuinfo(pol, data->powernow_table)) {
 		printk(KERN_ERR PFX "invalid powernow_table\n");
-		kfree(powernow_table);
+		kfree(data->powernow_table);
+		kfree(data);
 		return -EINVAL;
 	}
 
-	cpufreq_frequency_table_get_attr(powernow_table, pol->cpu);
+	cpufreq_frequency_table_get_attr(data->powernow_table, pol->cpu);
 
 	printk(KERN_INFO PFX "cpu_init done, current fid 0x%x, vid 0x%x\n",
-	       currfid, currvid);
+	       data->currfid, data->currvid);
+
+	powernow_data[pol->cpu] = data;
 
 	return 0;
+
+err_out:
+	set_cpus_allowed(current, oldmask);
+	schedule();
+
+	kfree(data);
+	return -ENODEV;
 }
 
 static int __exit powernowk8_cpu_exit (struct cpufreq_policy *pol)
 {
-	if (pol->cpu != 0)
+	struct powernow_k8_data *data = powernow_data[pol->cpu];
+
+	if (!data)
 		return -EINVAL;
 
+	powernow_k8_cpu_exit_acpi(data);
+
 	cpufreq_frequency_table_put_attr(pol->cpu);
 
-	if (powernow_table)
-		kfree(powernow_table);
+	kfree(data->powernow_table);
+	kfree(data);
 
 	return 0;
 }
@@ -845,33 +1040,31 @@ static struct cpufreq_driver cpufreq_amd
 	.attr = powernow_k8_attr,
 };
 
-
 /* driver entry point for init */
-static int __init
-powernowk8_init(void)
+static int __init powernowk8_init(void)
 {
-	int rc;
-
-	if (check_supported_cpu() == 0)
-		return -ENODEV;
+	unsigned int i, supported_cpus = 0;
 
-	rc = find_psb_table();
-	if (rc)
-		return rc;
+	for (i=0; i<NR_CPUS; i++) {
+		if (!cpu_online(i))
+			continue;
+		if (check_supported_cpu(i))
+			supported_cpus++;
+	}
 
-	if (pending_bit_stuck()) {
-		printk(KERN_ERR PFX "powernowk8_init fail, change pending bit set\n");
-		return -EIO;
+	if (supported_cpus == num_online_cpus()) {
+		printk(KERN_INFO PFX "Found %d AMD Athlon 64 / Opteron processors (" VERSION ")\n",
+			supported_cpus);
+		return cpufreq_register_driver(&cpufreq_amd64_driver);
 	}
 
-	return cpufreq_register_driver(&cpufreq_amd64_driver);
+	return -ENODEV;
 }
 
 /* driver entry point for term */
-static void __exit
-powernowk8_exit(void)
+static void __exit powernowk8_exit(void)
 {
-	dprintk(KERN_INFO PFX "powernowk8_exit\n");
+	dprintk(KERN_INFO PFX "exit\n");
 
 	cpufreq_unregister_driver(&cpufreq_amd64_driver);
 }
@@ -880,5 +1073,5 @@ MODULE_AUTHOR("Paul Devriendt <paul.devr
 MODULE_DESCRIPTION("AMD Athlon 64 and Opteron processor frequency driver.");
 MODULE_LICENSE("GPL");
 
-module_init(powernowk8_init);
+late_initcall(powernowk8_init);
 module_exit(powernowk8_exit);
--- diff/arch/i386/kernel/cpu/cpufreq/powernow-k8.h	2004-02-18 08:54:07.000000000 +0000
+++ source/arch/i386/kernel/cpu/cpufreq/powernow-k8.h	2004-04-21 10:45:33.442619448 +0100
@@ -1,20 +1,47 @@
 /*
- *   (c) 2003 Advanced Micro Devices, Inc.
+ *  (c) 2003, 2004 Advanced Micro Devices, Inc.
  *  Your use of this code is subject to the terms and conditions of the
- *  GNU general public license version 2. See "../../../COPYING" or
+ *  GNU general public license version 2. See "COPYING" or
  *  http://www.gnu.org/licenses/gpl.html
  */
 
+struct powernow_k8_data {
+	unsigned int cpu;
+
+	u32 numps;  /* number of p-states */
+	u32 batps;  /* number of p-states supported on battery */
+
+	/* these values are constant when the PSB is used to determine
+	 * vid/fid pairings, but are modified during the ->target() call
+	 * when ACPI is used */
+	u32 rvo;     /* ramp voltage offset */
+	u32 irt;     /* isochronous relief time */
+	u32 vidmvs;  /* usable value calculated from mvs */
+	u32 vstable; /* voltage stabilization time, units 20 us */
+	u32 plllock; /* pll lock time, units 1 us */
+
+	/* keep track of the current fid / vid */
+	u32 currvid;
+	u32 currfid;
+
+	/* the powernow_table includes all frequency and vid/fid pairings:
+	 * fid are the lower 8 bits of the index, vid are the upper 8 bits.
+	 * frequency is in kHz */
+	struct cpufreq_frequency_table  *powernow_table;
+
+#ifdef CONFIG_X86_POWERNOW_K8_ACPI
+	/* the acpi table needs to be kept. it's only available if ACPI was
+	 * used to determine valid frequency/vid/fid states */
+	struct acpi_processor_performance acpi_data;
+#endif
+};
+
+
 /* processor's cpuid instruction support */
-#define CPUID_PROCESSOR_SIGNATURE             1	/* function 1               */
-#define CPUID_F1_FAM                 0x00000f00	/* family mask              */
-#define CPUID_F1_XFAM                0x0ff00000	/* extended family mask     */
-#define CPUID_F1_MOD                 0x000000f0	/* model mask               */
-#define CPUID_F1_STEP                0x0000000f	/* stepping level mask      */
-#define CPUID_XFAM_MOD               0x0ff00ff0	/* xtended fam, fam + model */
-#define ATHLON64_XFAM_MOD            0x00000f40	/* xtended fam, fam + model */
-#define OPTERON_XFAM_MOD             0x00000f50	/* xtended fam, fam + model */
-#define ATHLON64_REV_C0                       8
+#define CPUID_PROCESSOR_SIGNATURE             1	/* function 1 */
+#define CPUID_XFAM_MOD               0x0ff00ff0	/* extended fam, fam + model */
+#define ATHLON64_XFAM_MOD            0x00000f40	/* extended fam, fam + model */
+#define OPTERON_XFAM_MOD             0x00000f50	/* extended fam, fam + model */
 #define CPUID_GET_MAX_CAPABILITIES   0x80000000
 #define CPUID_FREQ_VOLT_CAPABILITIES 0x80000007
 #define P_STATE_TRANSITION_CAPABLE            6
@@ -47,10 +74,23 @@
 #define MSR_S_HI_MAX_WORKING_VID  0x001f0000
 #define MSR_S_HI_START_VID        0x00001f00
 #define MSR_S_HI_CURRENT_VID      0x0000001f
+#define MSR_C_HI_STP_GNT_BENIGN   0x00000001
+
+/*
+ * There are restrictions frequencies have to follow:
+ * - only 1 entry in the low fid table ( <=1.4GHz )
+ * - lowest entry in the high fid table must be >= 2 * the entry in the
+ *   low fid table
+ * - lowest entry in the high fid table must be a <= 200MHz + 2 * the entry
+ *   in the low fid table
+ * - the parts can only step at 200 MHz intervals, so 1.9 GHz is never valid
+ * - lowest frequency must be >= interprocessor hypertransport link speed
+ *   (only applies to MP systems obviously)
+ */
 
 /* fids (frequency identifiers) are arranged in 2 tables - lo and hi */
-#define LO_FID_TABLE_TOP     6
-#define HI_FID_TABLE_BOTTOM  8
+#define LO_FID_TABLE_TOP     6	/* fid values marking the boundary    */
+#define HI_FID_TABLE_BOTTOM  8	/* between the low and high tables    */
 
 #define LO_VCOFREQ_TABLE_TOP    1400	/* corresponding vco frequency values */
 #define HI_VCOFREQ_TABLE_BOTTOM 1600
@@ -58,14 +98,12 @@
 #define MIN_FREQ_RESOLUTION  200 /* fids jump by 2 matching freq jumps by 200 */
 
 #define MAX_FID 0x2a	/* Spec only gives FID values as far as 5 GHz */
-
 #define LEAST_VID 0x1e	/* Lowest (numerically highest) useful vid value */
 
 #define MIN_FREQ 800	/* Min and max freqs, per spec */
 #define MAX_FREQ 5000
 
 #define INVALID_FID_MASK 0xffffffc1  /* not a valid fid if these bits are set */
-
 #define INVALID_VID_MASK 0xffffffe0  /* not a valid vid if these bits are set */
 
 #define STOP_GRANT_5NS 1 /* min poss memory access latency for voltage change */
@@ -73,18 +111,35 @@
 #define PLL_LOCK_CONVERSION (1000/5) /* ms to ns, then divide by clock period */
 
 #define MAXIMUM_VID_STEPS 1  /* Current cpus only allow a single step of 25mV */
-
 #define VST_UNITS_20US 20   /* Voltage Stabalization Time is in units of 20us */
 
 /*
-Version 1.4 of the PSB table. This table is constructed by BIOS and is
-to tell the OS's power management driver which VIDs and FIDs are
-supported by this particular processor. This information is obtained from
-the data sheets for each processor model by the system vendor and
-incorporated into the BIOS.
-If the data in the PSB / PST is wrong, then this driver will program the
-wrong values into hardware, which is very likely to lead to a crash.
-*/
+ * Most values of interest are enocoded in a single field of the _PSS
+ * entries: the "control" value.
+ */
+                                                                                                    
+#define IRT_SHIFT      30
+#define RVO_SHIFT      28
+#define PLL_L_SHIFT    20
+#define MVS_SHIFT      18
+#define VST_SHIFT      11
+#define VID_SHIFT       6
+#define IRT_MASK        3
+#define RVO_MASK        3
+#define PLL_L_MASK   0x7f
+#define MVS_MASK        3
+#define VST_MASK     0x7f
+#define VID_MASK     0x1f
+#define FID_MASK     0x3f
+
+
+/*
+ * Version 1.4 of the PSB table. This table is constructed by BIOS and is
+ * to tell the OS's power management driver which VIDs and FIDs are
+ * supported by this particular processor.
+ * If the data in the PSB / PST is wrong, then this driver will program the
+ * wrong values into hardware, which is very likely to lead to a crash.
+ */
 
 #define PSB_ID_STRING      "AMDK7PNOW!"
 #define PSB_ID_STRING_LEN  10
@@ -117,6 +172,8 @@ struct pst_s {
 #define dprintk(msg...) do { } while(0)
 #endif
 
-static inline int core_voltage_pre_transition(u32 reqvid);
-static inline int core_voltage_post_transition(u32 reqvid);
-static inline int core_frequency_transition(u32 reqfid);
+static int core_voltage_pre_transition(struct powernow_k8_data *data, u32 reqvid);
+static int core_voltage_post_transition(struct powernow_k8_data *data, u32 reqvid);
+static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid);
+
+static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index);
--- diff/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c	2004-01-19 10:22:55.000000000 +0000
+++ source/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c	2004-04-21 10:45:33.443619296 +0100
@@ -21,6 +21,7 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/cpufreq.h>
+#include <linux/config.h>
 
 #include <asm/msr.h>
 #include <asm/processor.h>
@@ -46,7 +47,9 @@ struct cpu_model
 };
 
 /* Operating points for current CPU */
-static const struct cpu_model *centrino_model;
+static struct cpu_model *centrino_model;
+
+#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE
 
 /* Computes the correct form for IA32_PERF_CTL MSR for a particular
    frequency/voltage operating point; frequency in MHz, volts in mV.
@@ -172,7 +175,7 @@ static struct cpufreq_frequency_table op
 
 /* CPU models, their operating frequency range, and freq/voltage
    operating points */
-static const struct cpu_model models[] = 
+static struct cpu_model models[] = 
 {
        _CPU( 900, " 900"),
 	CPU(1000),
@@ -187,6 +190,48 @@ static const struct cpu_model models[] =
 };
 #undef CPU
 
+static int centrino_cpu_init_table(struct cpufreq_policy *policy)
+{
+	struct cpuinfo_x86 *cpu = &cpu_data[policy->cpu];
+	struct cpu_model *model;
+
+	if (!cpu_has(cpu, X86_FEATURE_EST))
+		return -ENODEV;
+
+	/* Only Intel Pentium M stepping 5 for now - add new CPUs as
+	   they appear after making sure they use PERF_CTL in the same
+	   way. */
+	if (cpu->x86_vendor != X86_VENDOR_INTEL ||
+	    cpu->x86        != 6 ||
+	    cpu->x86_model  != 9 ||
+	    cpu->x86_mask   != 5) {
+		printk(KERN_INFO PFX "found unsupported CPU with Enhanced SpeedStep: "
+		       "send /proc/cpuinfo to " MAINTAINER "\n");
+		return -ENODEV;
+	}
+
+	for(model = models; model->model_name != NULL; model++)
+		if (strcmp(cpu->x86_model_id, model->model_name) == 0)
+			break;
+	if (model->model_name == NULL) {
+		printk(KERN_INFO PFX "no support for CPU model \"%s\": "
+		       "send /proc/cpuinfo to " MAINTAINER "\n",
+		       cpu->x86_model_id);
+		return -ENOENT;
+	}
+
+	centrino_model = model;
+		
+	printk(KERN_INFO PFX "found \"%s\": max frequency: %dkHz\n",
+	       model->model_name, model->max_freq);
+
+	return 0;
+}
+
+#else
+static inline int centrino_cpu_init_table(struct cpufreq_policy *policy) { return -ENODEV; }
+#endif /* CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE */
+
 /* Extract clock in kHz from PERF_CTL value */
 static unsigned extract_clock(unsigned msr)
 {
@@ -203,13 +248,148 @@ static unsigned get_cur_freq(void)
 	return extract_clock(l);
 }
 
+
+#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
+
+static struct acpi_processor_performance p;
+
+#include <linux/acpi.h>
+#include <acpi/processor.h>
+
+#define ACPI_PDC_CAPABILITY_ENHANCED_SPEEDSTEP 0x1
+
+/*
+ * centrino_cpu_init_acpi - register with ACPI P-States library 
+ *
+ * Register with the ACPI P-States library (part of drivers/acpi/processor.c)
+ * in order to determine correct frequency and voltage pairings by reading
+ * the _PSS of the ACPI DSDT or SSDT tables.
+ */
+static int centrino_cpu_init_acpi(struct cpufreq_policy *policy)
+{
+	union acpi_object		arg0 = {ACPI_TYPE_BUFFER};
+	u32				arg0_buf[3];
+	struct acpi_object_list 	arg_list = {1, &arg0};
+	unsigned long			cur_freq;
+	int				result = 0, i;
+
+	/* _PDC settings */
+        arg0.buffer.length = 12;
+        arg0.buffer.pointer = (u8 *) arg0_buf;
+        arg0_buf[0] = ACPI_PDC_REVISION_ID;
+        arg0_buf[1] = 1;
+        arg0_buf[2] = ACPI_PDC_CAPABILITY_ENHANCED_SPEEDSTEP;
+
+	p.pdc = &arg_list;
+
+	/* register with ACPI core */
+        if (acpi_processor_register_performance(&p, 0))
+                return -EIO;
+
+	/* verify the acpi_data */
+	if (p.state_count <= 1) {
+                printk(KERN_DEBUG "No P-States\n");
+                result = -ENODEV;
+                goto err_unreg;
+ 	}
+
+	if ((p.control_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) ||
+	    (p.status_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) {
+		printk(KERN_DEBUG "Invalid control/status registers\n");
+		result = -EIO;
+		goto err_unreg;
+	}
+
+	for (i=0; i<p.state_count; i++) {
+		if (p.states[i].control != p.states[i].status) {
+			printk(KERN_DEBUG "Different control and status values\n");
+			result = -EINVAL;
+			goto err_unreg;
+		}
+
+		if (!p.states[i].core_frequency) {
+			printk(KERN_DEBUG "Zero core frequency\n");
+			result = -EINVAL;
+			goto err_unreg;
+		}
+
+		if (extract_clock(p.states[i].control) != 
+		    (p.states[i].core_frequency * 1000)) {
+			printk(KERN_DEBUG "Invalid encoded frequency\n");
+			result = -EINVAL;
+			goto err_unreg;
+		}
+	}
+
+	centrino_model = kmalloc(sizeof(struct cpu_model), GFP_KERNEL);
+	if (!centrino_model) {
+		result = -ENOMEM;
+		goto err_unreg;
+	}
+	memset(centrino_model, 0, sizeof(struct cpu_model));
+
+	centrino_model->model_name=NULL;
+	centrino_model->max_freq = p.states[0].core_frequency * 1000;
+	centrino_model->op_points =  kmalloc(sizeof(struct cpufreq_frequency_table) * 
+					     (p.state_count + 1), GFP_KERNEL);
+        if (!centrino_model->op_points) {
+                result = -ENOMEM;
+                goto err_kfree;
+        }
+
+	cur_freq = get_cur_freq();
+
+        for (i=0; i<p.state_count; i++) {
+		centrino_model->op_points[i].index = p.states[i].control;
+		centrino_model->op_points[i].frequency = p.states[i].core_frequency * 1000;
+		if (cur_freq == centrino_model->op_points[i].frequency)
+			p.state = i;
+	}
+	centrino_model->op_points[p.state_count].frequency = CPUFREQ_TABLE_END;
+
+	return 0;
+
+ err_kfree:
+	kfree(centrino_model);
+ err_unreg:
+	acpi_processor_unregister_performance(&p, 0);
+	return (result);
+}
+#else
+static inline int centrino_cpu_init_acpi(struct cpufreq_policy *policy) { return -ENODEV; }
+#endif
+
 static int centrino_cpu_init(struct cpufreq_policy *policy)
 {
 	unsigned freq;
+	unsigned l, h;
+	int ret;
 
-	if (policy->cpu != 0 || centrino_model == NULL)
+	if (policy->cpu != 0)
 		return -ENODEV;
 
+	if (centrino_cpu_init_acpi(policy)) {
+		if (centrino_cpu_init_table(policy)) {
+			return -ENODEV;
+		}
+	}
+
+	/* Check to see if Enhanced SpeedStep is enabled, and try to
+	   enable it if not. */
+	rdmsr(MSR_IA32_MISC_ENABLE, l, h);
+		
+	if (!(l & (1<<16))) {
+		l |= (1<<16);
+		wrmsr(MSR_IA32_MISC_ENABLE, l, h);
+		
+		/* check to see if it stuck */
+		rdmsr(MSR_IA32_MISC_ENABLE, l, h);
+		if (!(l & (1<<16))) {
+			printk(KERN_INFO PFX "couldn't enable Enhanced SpeedStep\n");
+			return -ENODEV;
+		}
+	}
+
 	freq = get_cur_freq();
 
 	policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
@@ -219,12 +399,38 @@ static int centrino_cpu_init(struct cpuf
 	dprintk(KERN_INFO PFX "centrino_cpu_init: policy=%d cur=%dkHz\n",
 		policy->policy, policy->cur);
 	
-	return cpufreq_frequency_table_cpuinfo(policy, centrino_model->op_points);
+	ret = cpufreq_frequency_table_cpuinfo(policy, centrino_model->op_points);
+	if (ret)
+		return (ret);
+
+	cpufreq_frequency_table_get_attr(centrino_model->op_points, policy->cpu);
+
+	return 0;
+}
+
+static int centrino_cpu_exit(struct cpufreq_policy *policy)
+{
+	if (!centrino_model)
+		return -ENODEV;
+
+	cpufreq_frequency_table_put_attr(policy->cpu);
+
+#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
+	if (!centrino_model->model_name) {
+		acpi_processor_unregister_performance(&p, 0);
+		kfree(centrino_model->op_points);
+		kfree(centrino_model);
+	}
+#endif
+
+	centrino_model = NULL;
+
+	return 0;
 }
 
 /**
  * centrino_verify - verifies a new CPUFreq policy
- * @freq: new policy
+ * @policy: new policy
  *
  * Limit must be within this model's frequency range at least one
  * border included.
@@ -237,6 +443,8 @@ static int centrino_verify (struct cpufr
 /**
  * centrino_setpolicy - set a new CPUFreq policy
  * @policy: new policy
+ * @target_freq: the target frequency
+ * @relation: how that frequency relates to achieved frequency (CPUFREQ_RELATION_L or CPUFREQ_RELATION_H)
  *
  * Sets a new CPUFreq policy.
  */
@@ -295,12 +503,19 @@ static int centrino_target (struct cpufr
 	return 0;
 }
 
+static struct freq_attr* centrino_attr[] = {
+	&cpufreq_freq_attr_scaling_available_freqs,
+	NULL,
+};
+
 static struct cpufreq_driver centrino_driver = {
 	.name		= "centrino", /* should be speedstep-centrino, 
 					 but there's a 16 char limit */
 	.init		= centrino_cpu_init,
+	.exit		= centrino_cpu_exit,
 	.verify 	= centrino_verify,
 	.target 	= centrino_target,
+	.attr           = centrino_attr,
 	.owner		= THIS_MODULE,
 };
 
@@ -322,55 +537,10 @@ static struct cpufreq_driver centrino_dr
 static int __init centrino_init(void)
 {
 	struct cpuinfo_x86 *cpu = cpu_data;
-	const struct cpu_model *model;
-	unsigned l, h;
 
 	if (!cpu_has(cpu, X86_FEATURE_EST))
 		return -ENODEV;
 
-	/* Only Intel Pentium M stepping 5 for now - add new CPUs as
-	   they appear after making sure they use PERF_CTL in the same
-	   way. */
-	if (cpu->x86_vendor != X86_VENDOR_INTEL ||
-	    cpu->x86        != 6 ||
-	    cpu->x86_model  != 9 ||
-	    cpu->x86_mask   != 5) {
-		printk(KERN_INFO PFX "found unsupported CPU with Enhanced SpeedStep: "
-		       "send /proc/cpuinfo to " MAINTAINER "\n");
-		return -ENODEV;
-	}
-
-	/* Check to see if Enhanced SpeedStep is enabled, and try to
-	   enable it if not. */
-	rdmsr(MSR_IA32_MISC_ENABLE, l, h);
-		
-	if (!(l & (1<<16))) {
-		l |= (1<<16);
-		wrmsr(MSR_IA32_MISC_ENABLE, l, h);
-		
-		/* check to see if it stuck */
-		rdmsr(MSR_IA32_MISC_ENABLE, l, h);
-		if (!(l & (1<<16))) {
-			printk(KERN_INFO PFX "couldn't enable Enhanced SpeedStep\n");
-			return -ENODEV;
-		}
-	}
-
-	for(model = models; model->model_name != NULL; model++)
-		if (strcmp(cpu->x86_model_id, model->model_name) == 0)
-			break;
-	if (model->model_name == NULL) {
-		printk(KERN_INFO PFX "no support for CPU model \"%s\": "
-		       "send /proc/cpuinfo to " MAINTAINER "\n",
-		       cpu->x86_model_id);
-		return -ENOENT;
-	}
-
-	centrino_model = model;
-		
-	printk(KERN_INFO PFX "found \"%s\": max frequency: %dkHz\n",
-	       model->model_name, model->max_freq);
-
 	return cpufreq_register_driver(&centrino_driver);
 }
 
@@ -383,5 +553,5 @@ MODULE_AUTHOR ("Jeremy Fitzhardinge <jer
 MODULE_DESCRIPTION ("Enhanced SpeedStep driver for Intel Pentium M processors.");
 MODULE_LICENSE ("GPL");
 
-module_init(centrino_init);
+late_initcall(centrino_init);
 module_exit(centrino_exit);
--- diff/arch/i386/kernel/cpu/cpufreq/speedstep-ich.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/i386/kernel/cpu/cpufreq/speedstep-ich.c	2004-04-21 10:45:33.444619144 +0100
@@ -67,6 +67,7 @@ static struct cpufreq_frequency_table sp
 /**
  * speedstep_set_state - set the SpeedStep state
  * @state: new processor frequency state (SPEEDSTEP_LOW or SPEEDSTEP_HIGH)
+ * @notify: whether to call cpufreq_notify_transition for CPU speed changes
  *
  *   Tries to change the SpeedStep state. 
  */
@@ -239,8 +240,10 @@ static unsigned int speedstep_detect_chi
 
 
 /**
- * speedstep_setpolicy - set a new CPUFreq policy
+ * speedstep_target - set a new CPUFreq policy
  * @policy: new policy
+ * @target_freq: the target frequency
+ * @relation: how that frequency relates to achieved frequency (CPUFREQ_RELATION_L or CPUFREQ_RELATION_H)
  *
  * Sets a new CPUFreq policy.
  */
@@ -261,7 +264,7 @@ static int speedstep_target (struct cpuf
 
 /**
  * speedstep_verify - verifies a new CPUFreq policy
- * @freq: new policy
+ * @policy: new policy
  *
  * Limit must be within speedstep_low_freq and speedstep_high_freq, with
  * at least one border included.
--- diff/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c	2004-02-18 08:54:07.000000000 +0000
+++ source/arch/i386/kernel/cpu/cpufreq/speedstep-lib.c	2004-04-21 10:45:33.444619144 +0100
@@ -10,6 +10,7 @@
 
 #include <linux/kernel.h>
 #include <linux/module.h> 
+#include <linux/moduleparam.h>
 #include <linux/init.h>
 #include <linux/cpufreq.h>
 #include <linux/pci.h>
@@ -30,6 +31,12 @@
 #define dprintk(msg...) do { } while(0)
 #endif
 
+#ifdef CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK
+static int relaxed_check = 0;
+#else
+#define relaxed_check 0
+#endif
+
 /*********************************************************************
  *                   GET PROCESSOR CORE SPEED IN KHZ                 *
  *********************************************************************/
@@ -120,7 +127,7 @@ static unsigned int pentiumM_get_frequen
 	msr_tmp = (msr_lo >> 22) & 0x1f;
 	dprintk(KERN_DEBUG "speedstep-lib: bits 22-26 are 0x%x\n", msr_tmp);
 
-	return (msr_tmp * 100 * 10000);
+	return (msr_tmp * 100 * 1000);
 }
 
 
@@ -210,7 +217,7 @@ unsigned int speedstep_detect_processor 
 		ebx = cpuid_ebx(0x00000001);
 		ebx &= 0x000000FF;
 
-		dprintk(KERN_INFO "ebx value is %x, x86_mask is %x\n", ebx, c->86_mask);
+		dprintk(KERN_INFO "ebx value is %x, x86_mask is %x\n", ebx, c->x86_mask);
 
 		switch (c->x86_mask) {
 		case 4: 
@@ -265,6 +272,7 @@ unsigned int speedstep_detect_processor 
 		ebx = cpuid_ebx(0x00000001);
 
 		ebx &= 0x000000FF;
+
 		if (ebx != 0x06)
 			return 0;
 
@@ -292,7 +300,7 @@ unsigned int speedstep_detect_processor 
 		 */
 		rdmsr(MSR_IA32_PLATFORM_ID, msr_lo, msr_hi);
 		dprintk(KERN_DEBUG "cpufreq: Coppermine: MSR_IA32_PLATFORM ID is 0x%x, 0x%x\n", msr_lo, msr_hi);
-		if ((msr_hi & (1<<18)) && (msr_hi & (3<<24))) {
+		if ((msr_hi & (1<<18)) && (relaxed_check ? 1 : (msr_hi & (3<<24)))) {
 			if (c->x86_mask == 0x01)
 				return SPEEDSTEP_PROCESSOR_PIII_C_EARLY;
 			else
@@ -362,6 +370,11 @@ unsigned int speedstep_get_freqs(unsigne
 }
 EXPORT_SYMBOL_GPL(speedstep_get_freqs);
 
+#ifdef CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK
+module_param(relaxed_check, int, 0444);
+MODULE_PARM_DESC(relaxed_check, "Don't do all checks for speedstep capability.");
+#endif
+
 MODULE_AUTHOR ("Dominik Brodowski <linux@brodo.de>");
 MODULE_DESCRIPTION ("Library for Intel SpeedStep 1 or 2 cpufreq drivers.");
 MODULE_LICENSE ("GPL");
--- diff/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c	2004-04-21 10:45:33.445618992 +0100
@@ -90,10 +90,12 @@ static int speedstep_smi_ownership (void
 
 /**
  * speedstep_smi_get_freqs - get SpeedStep preferred & current freq.
+ * @low: the low frequency value is placed here
+ * @high: the high frequency value is placed here
+ *
  * Only available on later SpeedStep-enabled systems, returns false results or
  * even hangs [cf. bugme.osdl.org # 1422] on earlier systems. Empirical testing
  * shows that the latter occurs if !(ist_info.event & 0xFFFF).
- *
  */
 static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high)
 {
@@ -141,6 +143,7 @@ static int speedstep_get_state (void)
 /**
  * speedstep_set_state - set the SpeedStep state
  * @state: new processor frequency state (SPEEDSTEP_LOW or SPEEDSTEP_HIGH)
+ * @notify: whether to call cpufreq_notify_transition
  *
  */
 static void speedstep_set_state (unsigned int state, unsigned int notify)
@@ -224,7 +227,7 @@ static int speedstep_target (struct cpuf
 
 /**
  * speedstep_verify - verifies a new CPUFreq policy
- * @freq: new policy
+ * @policy: new policy
  *
  * Limit must be within speedstep_low_freq and speedstep_high_freq, with
  * at least one border included.
--- diff/arch/i386/kernel/cpu/cyrix.c	2003-08-26 10:00:51.000000000 +0100
+++ source/arch/i386/kernel/cpu/cyrix.c	2004-04-21 10:45:33.455617472 +0100
@@ -167,7 +167,10 @@ static void __init geode_configure(void)
 	unsigned long flags;
 	u8 ccr3, ccr4;
 	local_irq_save(flags);
-	
+
+	/* Suspend on halt power saving and enable #SUSP pin */
+	setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x88);
+
 	ccr3 = getCx86(CX86_CCR3);
 	setCx86(CX86_CCR3, (ccr3 & 0x0f) | 0x10);	/* Enable */
 	
--- diff/arch/i386/kernel/dmi_scan.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/i386/kernel/dmi_scan.c	2004-04-21 10:45:33.460616712 +0100
@@ -778,12 +778,16 @@ static __initdata struct dmi_blacklist d
 			MATCH(DMI_BIOS_DATE, "10/26/01"), NO_MATCH
 			} },
 			
-	{ exploding_pnp_bios, "Higraded P14H", {	/* BIOSPnP problem */
+	{ exploding_pnp_bios, "Higraded P14H", {	/* PnPBIOS GPF on boot */
 			MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."),
 			MATCH(DMI_BIOS_VERSION, "07.00T"),
 			MATCH(DMI_SYS_VENDOR, "Higraded"),
 			MATCH(DMI_PRODUCT_NAME, "P14H")
 			} },
+	{ exploding_pnp_bios, "ASUS P4P800", {	/* PnPBIOS GPF on boot */
+			MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc."),
+			MATCH(DMI_BOARD_NAME, "P4P800"),
+			} },
 
 	/* Machines which have problems handling enabled local APICs */
 
--- diff/arch/i386/kernel/doublefault.c	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/kernel/doublefault.c	2004-04-21 10:45:33.461616560 +0100
@@ -6,6 +6,7 @@
 
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
+#include <asm/processor.h>
 #include <asm/desc.h>
 
 #define DOUBLEFAULT_STACKSIZE (1024)
@@ -53,7 +54,7 @@ struct tss_struct doublefault_tss __cach
 	.io_bitmap_base	= INVALID_IO_BITMAP_OFFSET,
 
 	.eip		= (unsigned long) doublefault_fn,
-	.eflags		= 0x00000082,
+	.eflags		= X86_EFLAGS_SF | 0x2,	/* 0x2 bit is always set */
 	.esp		= STACK_START,
 	.es		= __USER_DS,
 	.cs		= __KERNEL_CS,
--- diff/arch/i386/kernel/entry.S	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/i386/kernel/entry.S	2004-04-21 10:45:33.461616560 +0100
@@ -264,7 +264,7 @@ sysenter_past_esp:
 	cmpl $(nr_syscalls), %eax
 	jae syscall_badsys
 
-	testb $_TIF_SYSCALL_TRACE,TI_FLAGS(%ebp)
+	testb $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),TI_FLAGS(%ebp)
 	jnz syscall_trace_entry
 	call *sys_call_table(,%eax,4)
 	movl %eax,EAX(%esp)
@@ -287,7 +287,7 @@ ENTRY(system_call)
 	cmpl $(nr_syscalls), %eax
 	jae syscall_badsys
 					# system call tracing in operation
-	testb $_TIF_SYSCALL_TRACE,TI_FLAGS(%ebp)
+	testb $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),TI_FLAGS(%ebp)
 	jnz syscall_trace_entry
 syscall_call:
 	call *sys_call_table(,%eax,4)
@@ -354,7 +354,7 @@ syscall_trace_entry:
 	# perform syscall exit tracing
 	ALIGN
 syscall_exit_work:
-	testb $_TIF_SYSCALL_TRACE, %cl
+	testb $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT), %cl
 	jz work_pending
 	sti				# could let do_syscall_trace() call
 					# schedule() instead
@@ -882,5 +882,14 @@ ENTRY(sys_call_table)
 	.long sys_utimes
  	.long sys_fadvise64_64
 	.long sys_ni_syscall	/* sys_vserver */
+	.long sys_ni_syscall	/* sys_mbind */
+	.long sys_ni_syscall	/* 275 sys_get_mempolicy */
+	.long sys_ni_syscall	/* sys_set_mempolicy */
+	.long sys_mq_open
+	.long sys_mq_unlink
+	.long sys_mq_timedsend
+	.long sys_mq_timedreceive	/* 280 */
+	.long sys_mq_notify
+	.long sys_mq_getsetattr
 
 syscall_table_size=(.-sys_call_table)
--- diff/arch/i386/kernel/head.S	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/i386/kernel/head.S	2004-04-21 10:45:33.462616408 +0100
@@ -69,9 +69,22 @@ ENTRY(startup_32)
 	movl %eax,%gs
 
 /*
+ * Clear BSS first so that there are no surprises...
+ * No need to cld as DF is already clear from cld above...
+ */
+	xorl %eax,%eax
+	movl $__bss_start - __PAGE_OFFSET,%edi
+	movl $__bss_stop - __PAGE_OFFSET,%ecx
+	subl %edi,%ecx
+	shrl $2,%ecx
+	rep ; stosl
+
+/*
  * Initialize page tables.  This creates a PDE and a set of page
  * tables, which are located immediately beyond _end.  The variable
  * init_pg_tables_end is set up to point to the first "safe" location.
+ * Mappings are created both at virtual address 0 (identity mapping)
+ * and PAGE_OFFSET for up to _end+sizeof(page tables)+INIT_MAP_BEYOND_END.
  *
  * Warning: don't use %esi or the stack in this code.  However, %esp
  * can be used as a GPR if you really need it...
@@ -173,17 +186,6 @@ ENTRY(startup_32_smp)
 #endif /* CONFIG_SMP */
 
 /*
- * Clear BSS first so that there are no surprises...
- * No need to cld as DF is already clear from cld above...
- */
-	xorl %eax,%eax
-	movl $__bss_start,%edi
-	movl $__bss_stop,%ecx
-	subl %edi,%ecx
-	shrl $2,%ecx
-	rep ; stosl
-
-/*
  * start system 32-bit setup. We need to re-do some of the things done
  * in 16-bit mode for the "real" operations.
  */
@@ -304,8 +306,6 @@ L6:
 	jmp L6			# main should never return here, but
 				# just in case, we know what happens.
 
-ready:	.byte 0
-
 /*
  * We depend on ET to be correct. This checks for 287/387.
  */
@@ -353,13 +353,7 @@ rp_sidt:
 	jne rp_sidt
 	ret
 
-ENTRY(stack_start)
-	.long init_thread_union+THREAD_SIZE
-	.long __BOOT_DS
-
 /* This is the default interrupt "handler" :-) */
-int_msg:
-	.asciz "Unknown interrupt or fault at EIP %p %p %p\n"
 	ALIGN
 ignore_int:
 	cld
@@ -386,6 +380,35 @@ ignore_int:
 	iret
 
 /*
+ * Real beginning of normal "text" segment
+ */
+ENTRY(stext)
+ENTRY(_stext)
+
+/*
+ * BSS section
+ */
+.section ".bss.page_aligned","w"
+ENTRY(swapper_pg_dir)
+	.fill 1024,4,0
+ENTRY(empty_zero_page)
+	.fill 4096,1,0
+
+/*
+ * This starts the data section.
+ */
+.data
+
+ENTRY(stack_start)
+	.long init_thread_union+THREAD_SIZE
+	.long __BOOT_DS
+
+ready:	.byte 0
+
+int_msg:
+	.asciz "Unknown interrupt or fault at EIP %p %p %p\n"
+
+/*
  * The IDT and GDT 'descriptors' are a strange 48-bit object
  * only used by the lidt and lgdt instructions. They are not
  * like usual segment descriptors - they consist of a 16-bit
@@ -417,39 +440,6 @@ cpu_gdt_descr:
 	.fill NR_CPUS-1,8,0		# space for the other GDT descriptors
 
 /*
- * swapper_pg_dir is the main page directory, address 0x00101000
- *
- * This is initialized to create an identity-mapping at 0 (for bootup
- * purposes) and another mapping at virtual address PAGE_OFFSET.  The
- * values put here should be all invalid (zero); the valid
- * entries are created dynamically at boot time.
- *
- * The code creates enough page tables to map 0-_end, the page tables
- * themselves, plus INIT_MAP_BEYOND_END bytes; see comment at beginning.
- */
-.org 0x1000
-ENTRY(swapper_pg_dir)
-	.fill 1024,4,0
-
-.org 0x2000
-ENTRY(empty_zero_page)
-	.fill 4096,1,0
-
-.org 0x3000
-/*
- * Real beginning of normal "text" segment
- */
-ENTRY(stext)
-ENTRY(_stext)
-
-/*
- * This starts the data section. Note that the above is all
- * in the text section because it has alignment requirements
- * that we cannot fulfill any other way.
- */
-.data
-
-/*
  * The boot_gdt_table must mirror the equivalent in setup.S and is
  * used only for booting.
  */
--- diff/arch/i386/kernel/i8259.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/i386/kernel/i8259.c	2004-04-21 10:45:33.463616256 +0100
@@ -444,4 +444,6 @@ void __init init_IRQ(void)
 	 */
 	if (boot_cpu_data.hard_math && !cpu_has_fpu)
 		setup_irq(FPU_IRQ, &fpu_irq);
+
+	irq_ctx_init(current_thread_info()->cpu);
 }
--- diff/arch/i386/kernel/io_apic.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/i386/kernel/io_apic.c	2004-04-21 10:45:33.467615648 +0100
@@ -76,8 +76,8 @@ static struct irq_pin_list {
 	int apic, pin, next;
 } irq_2_pin[PIN_MAP_SIZE];
 
+int vector_irq[NR_VECTORS] = { [0 ... NR_VECTORS - 1] = -1};
 #ifdef CONFIG_PCI_USE_VECTOR
-int vector_irq[NR_IRQS] = { [0 ... NR_IRQS -1] = -1};
 #define vector_to_irq(vector) 	\
 	(platform_legacy_irq(vector) ? vector : vector_irq[vector])
 #else
@@ -1149,12 +1149,16 @@ static inline int IO_APIC_irq_trigger(in
 /* irq_vectors is indexed by the sum of all RTEs in all I/O APICs. */
 u8 irq_vector[NR_IRQ_VECTORS] = { FIRST_DEVICE_VECTOR , 0 };
 
-#ifndef CONFIG_PCI_USE_VECTOR
+#ifdef CONFIG_PCI_USE_VECTOR
+int assign_irq_vector(int irq)
+#else
 int __init assign_irq_vector(int irq)
+#endif
 {
 	static int current_vector = FIRST_DEVICE_VECTOR, offset = 0;
+
 	BUG_ON(irq >= NR_IRQ_VECTORS);
-	if (IO_APIC_VECTOR(irq) > 0)
+	if (irq != AUTO_ASSIGN && IO_APIC_VECTOR(irq) > 0)
 		return IO_APIC_VECTOR(irq);
 next:
 	current_vector += 8;
@@ -1162,15 +1166,18 @@ next:
 		goto next;
 
 	if (current_vector >= FIRST_SYSTEM_VECTOR) {
-		offset = (offset + 1) & 7;
+		offset++;
+		if (!(offset%8))
+			return -ENOSPC;
 		current_vector = FIRST_DEVICE_VECTOR + offset;
 	}
 
-	IO_APIC_VECTOR(irq) = current_vector;
+	vector_irq[current_vector] = irq;
+	if (irq != AUTO_ASSIGN)
+		IO_APIC_VECTOR(irq) = current_vector;
 
 	return current_vector;
 }
-#endif
 
 static struct hw_interrupt_type ioapic_level_type;
 static struct hw_interrupt_type ioapic_edge_type;
--- diff/arch/i386/kernel/irq.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/i386/kernel/irq.c	2004-04-21 10:45:33.467615648 +0100
@@ -75,6 +75,14 @@ irq_desc_t irq_desc[NR_IRQS] __cacheline
 static void register_irq_proc (unsigned int irq);
 
 /*
+ * per-CPU IRQ handling stacks
+ */
+#ifdef CONFIG_4KSTACKS
+union irq_ctx *hardirq_ctx[NR_CPUS];
+union irq_ctx *softirq_ctx[NR_CPUS];
+#endif
+
+/*
  * Special irq handlers.
  */
 
@@ -126,11 +134,9 @@ struct hw_interrupt_type no_irq_type = {
 };
 
 atomic_t irq_err_count;
-#ifdef CONFIG_X86_IO_APIC
-#ifdef APIC_MISMATCH_DEBUG
+#if defined(CONFIG_X86_IO_APIC) && defined(APIC_MISMATCH_DEBUG)
 atomic_t irq_mis_count;
 #endif
-#endif
 
 /*
  * Generic, controller-independent functions:
@@ -186,11 +192,9 @@ skip:
 		seq_putc(p, '\n');
 #endif
 		seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
-#ifdef CONFIG_X86_IO_APIC
-#ifdef APIC_MISMATCH_DEBUG
+#if defined(CONFIG_X86_IO_APIC) && defined(APIC_MISMATCH_DEBUG)
 		seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
 #endif
-#endif
 	}
 	return 0;
 }
@@ -213,7 +217,7 @@ inline void synchronize_irq(unsigned int
  * waste of time and is not what some drivers would
  * prefer.
  */
-int handle_IRQ_event(unsigned int irq,
+asmlinkage int handle_IRQ_event(unsigned int irq,
 		struct pt_regs *regs, struct irqaction *action)
 {
 	int status = 1;	/* Force the "do bottom halves" bit */
@@ -436,7 +440,7 @@ asmlinkage unsigned int do_IRQ(struct pt
 
 		__asm__ __volatile__("andl %%esp,%0" :
 					"=r" (esp) : "0" (THREAD_SIZE - 1));
-		if (unlikely(esp < (sizeof(struct thread_info) + 1024))) {
+		if (unlikely(esp < (sizeof(struct thread_info) + STACK_WARN))) {
 			printk("do_IRQ: stack overflow: %ld\n",
 				esp - sizeof(struct thread_info));
 			dump_stack();
@@ -484,11 +488,68 @@ asmlinkage unsigned int do_IRQ(struct pt
 	 * useful for irq hardware that does not mask cleanly in an
 	 * SMP environment.
 	 */
+#ifdef CONFIG_4KSTACKS
+
 	for (;;) {
 		irqreturn_t action_ret;
+		u32 *isp;
+		union irq_ctx * curctx;
+		union irq_ctx * irqctx;
+
+		curctx = (union irq_ctx *) current_thread_info();
+		irqctx = hardirq_ctx[smp_processor_id()];
 
 		spin_unlock(&desc->lock);
+
+		/*
+		 * this is where we switch to the IRQ stack. However, if we are already using
+		 * the IRQ stack (because we interrupted a hardirq handler) we can't do that
+		 * and just have to keep using the current stack (which is the irq stack already
+		 * after all)
+		 */
+
+		if (curctx == irqctx)
+			action_ret = handle_IRQ_event(irq, &regs, action);
+		else {
+			/* build the stack frame on the IRQ stack */
+			isp = (u32*) ((char*)irqctx + sizeof(*irqctx));
+			irqctx->tinfo.task = curctx->tinfo.task;
+			irqctx->tinfo.previous_esp = current_stack_pointer();
+
+			*--isp = (u32) action;
+			*--isp = (u32) &regs;
+			*--isp = (u32) irq;
+
+			asm volatile(
+				"       xchgl   %%ebx,%%esp     \n"
+				"       call    handle_IRQ_event \n"
+				"       xchgl   %%ebx,%%esp     \n"
+				: "=a"(action_ret)
+				: "b"(isp)
+				: "memory", "cc", "edx", "ecx"
+			);
+
+
+		}
+		spin_lock(&desc->lock);
+		if (!noirqdebug)
+			note_interrupt(irq, desc, action_ret);
+		if (curctx != irqctx)
+			irqctx->tinfo.task = NULL;
+		if (likely(!(desc->status & IRQ_PENDING)))
+			break;
+		desc->status &= ~IRQ_PENDING;
+	}
+
+#else
+
+	for (;;) {
+		irqreturn_t action_ret;
+
+		spin_unlock(&desc->lock);
+
 		action_ret = handle_IRQ_event(irq, &regs, action);
+
 		spin_lock(&desc->lock);
 		if (!noirqdebug)
 			note_interrupt(irq, desc, action_ret);
@@ -496,6 +557,7 @@ asmlinkage unsigned int do_IRQ(struct pt
 			break;
 		desc->status &= ~IRQ_PENDING;
 	}
+#endif
 	desc->status &= ~IRQ_INPROGRESS;
 
 out:
@@ -1053,3 +1115,79 @@ void init_irq_proc (void)
 		register_irq_proc(i);
 }
 
+
+#ifdef CONFIG_4KSTACKS
+static char softirq_stack[NR_CPUS * THREAD_SIZE]  __attribute__((__aligned__(THREAD_SIZE)));
+static char hardirq_stack[NR_CPUS * THREAD_SIZE]  __attribute__((__aligned__(THREAD_SIZE)));
+
+/*
+ * allocate per-cpu stacks for hardirq and for softirq processing
+ */
+void irq_ctx_init(int cpu)
+{
+	union irq_ctx *irqctx;
+
+	if (hardirq_ctx[cpu])
+		return;
+
+	irqctx = (union irq_ctx*) &hardirq_stack[cpu*THREAD_SIZE];
+	irqctx->tinfo.task              = NULL;
+	irqctx->tinfo.exec_domain       = NULL;
+	irqctx->tinfo.cpu               = cpu;
+	irqctx->tinfo.preempt_count     = HARDIRQ_OFFSET;
+	irqctx->tinfo.addr_limit        = MAKE_MM_SEG(0);
+
+	hardirq_ctx[cpu] = irqctx;
+
+	irqctx = (union irq_ctx*) &softirq_stack[cpu*THREAD_SIZE];
+	irqctx->tinfo.task              = NULL;
+	irqctx->tinfo.exec_domain       = NULL;
+	irqctx->tinfo.cpu               = cpu;
+	irqctx->tinfo.preempt_count     = SOFTIRQ_OFFSET;
+	irqctx->tinfo.addr_limit        = MAKE_MM_SEG(0);
+
+	softirq_ctx[cpu] = irqctx;
+
+	printk("CPU %u irqstacks, hard=%p soft=%p\n",
+		cpu,hardirq_ctx[cpu],softirq_ctx[cpu]);
+}
+
+extern asmlinkage void __do_softirq(void);
+
+asmlinkage void do_softirq(void)
+{
+	unsigned long flags;
+	struct thread_info *curctx;
+	union irq_ctx *irqctx;
+	u32 *isp;
+
+	if (in_interrupt())
+		return;
+
+	local_irq_save(flags);
+
+	if (local_softirq_pending()) {
+		curctx = current_thread_info();
+		irqctx = softirq_ctx[smp_processor_id()];
+		irqctx->tinfo.task = curctx->task;
+		irqctx->tinfo.previous_esp = current_stack_pointer();
+
+		/* build the stack frame on the softirq stack */
+		isp = (u32*) ((char*)irqctx + sizeof(*irqctx));
+
+
+		asm volatile(
+			"       xchgl   %%ebx,%%esp     \n"
+			"       call    __do_softirq    \n"
+			"       movl    %%ebx,%%esp     \n"
+			: "=b"(isp)
+			: "0"(isp)
+			: "memory", "cc", "edx", "ecx", "eax"
+		);
+	}
+
+	local_irq_restore(flags);
+}
+
+EXPORT_SYMBOL(do_softirq);
+#endif
--- diff/arch/i386/kernel/nmi.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/i386/kernel/nmi.c	2004-04-21 10:45:33.468615496 +0100
@@ -458,6 +458,13 @@ void nmi_watchdog_tick (struct pt_regs *
 			wrmsr(MSR_P4_IQ_CCCR0, P4_NMI_IQ_CCCR0, 0);
 			apic_write(APIC_LVTPC, APIC_DM_NMI);
 		}
+		else if (nmi_perfctr_msr == MSR_P6_PERFCTR0) {
+			/* Only P6 based Pentium M need to re-unmask
+			 * the apic vector but it doesn't hurt
+			 * other P6 variant */
+			apic_write(APIC_LVTPC,
+				   apic_read(APIC_LVTPC) & ~APIC_LVT_MASKED);
+		}
 		wrmsr(nmi_perfctr_msr, -(cpu_khz/nmi_hz*1000), -1);
 	}
 }
--- diff/arch/i386/kernel/process.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/i386/kernel/process.c	2004-04-21 10:45:33.473614736 +0100
@@ -278,7 +278,7 @@ int kernel_thread(int (*fn)(void *), voi
 	regs.orig_eax = -1;
 	regs.eip = (unsigned long) kernel_thread_helper;
 	regs.xcs = __KERNEL_CS;
-	regs.eflags = 0x286;
+	regs.eflags = X86_EFLAGS_IF | X86_EFLAGS_SF | X86_EFLAGS_PF | 0x2;
 
 	/* Ok, create the new process.. */
 	return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, &regs, 0, NULL, NULL);
@@ -632,8 +632,6 @@ out:
 /*
  * These bracket the sleeping functions..
  */
-extern void scheduling_functions_start_here(void);
-extern void scheduling_functions_end_here(void);
 #define first_sched	((unsigned long) scheduling_functions_start_here)
 #define last_sched	((unsigned long) scheduling_functions_end_here)
 #define top_esp                (THREAD_SIZE - sizeof(unsigned long))
--- diff/arch/i386/kernel/ptrace.c	2003-06-09 14:18:17.000000000 +0100
+++ source/arch/i386/kernel/ptrace.c	2004-04-21 10:45:33.482613368 +0100
@@ -14,6 +14,7 @@
 #include <linux/ptrace.h>
 #include <linux/user.h>
 #include <linux/security.h>
+#include <linux/audit.h>
 
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
@@ -524,6 +525,15 @@ out:
 __attribute__((regparm(3)))
 void do_syscall_trace(struct pt_regs *regs, int entryexit)
 {
+	if (unlikely(current->audit_context)) {
+		if (!entryexit)
+			audit_syscall_entry(current, regs->orig_eax,
+					    regs->ebx, regs->ecx,
+					    regs->edx, regs->esi);
+		else
+			audit_syscall_exit(current, regs->eax);
+	}
+
 	if (!test_thread_flag(TIF_SYSCALL_TRACE))
 		return;
 	if (!(current->ptrace & PT_PTRACED))
--- diff/arch/i386/kernel/semaphore.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/i386/kernel/semaphore.c	2004-04-21 10:45:33.482613368 +0100
@@ -15,6 +15,7 @@
 #include <linux/config.h>
 #include <linux/sched.h>
 #include <linux/err.h>
+#include <linux/init.h>
 #include <asm/semaphore.h>
 
 /*
@@ -53,7 +54,7 @@ asmlinkage void __up(struct semaphore *s
 	wake_up(&sem->wait);
 }
 
-asmlinkage void __down(struct semaphore * sem)
+asmlinkage void __sched __down(struct semaphore * sem)
 {
 	struct task_struct *tsk = current;
 	DECLARE_WAITQUEUE(wait, tsk);
@@ -90,7 +91,7 @@ asmlinkage void __down(struct semaphore 
 	tsk->state = TASK_RUNNING;
 }
 
-asmlinkage int __down_interruptible(struct semaphore * sem)
+asmlinkage int __sched __down_interruptible(struct semaphore * sem)
 {
 	int retval = 0;
 	struct task_struct *tsk = current;
@@ -187,7 +188,7 @@ asmlinkage int __down_trylock(struct sem
  * value..
  */
 asm(
-".text\n"
+".section .sched.text\n"
 ".align 4\n"
 ".globl __down_failed\n"
 "__down_failed:\n\t"
@@ -210,7 +211,7 @@ asm(
 );
 
 asm(
-".text\n"
+".section .sched.text\n"
 ".align 4\n"
 ".globl __down_failed_interruptible\n"
 "__down_failed_interruptible:\n\t"
@@ -231,7 +232,7 @@ asm(
 );
 
 asm(
-".text\n"
+".section .sched.text\n"
 ".align 4\n"
 ".globl __down_failed_trylock\n"
 "__down_failed_trylock:\n\t"
@@ -252,7 +253,7 @@ asm(
 );
 
 asm(
-".text\n"
+".section .sched.text\n"
 ".align 4\n"
 ".globl __up_wakeup\n"
 "__up_wakeup:\n\t"
@@ -271,7 +272,7 @@ asm(
  */
 #if defined(CONFIG_SMP)
 asm(
-".text\n"
+".section .sched.text\n"
 ".align	4\n"
 ".globl	__write_lock_failed\n"
 "__write_lock_failed:\n\t"
@@ -285,7 +286,7 @@ asm(
 );
 
 asm(
-".text\n"
+".section .sched.text\n"
 ".align	4\n"
 ".globl	__read_lock_failed\n"
 "__read_lock_failed:\n\t"
--- diff/arch/i386/kernel/setup.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/i386/kernel/setup.c	2004-04-21 10:45:33.483613216 +0100
@@ -47,8 +47,8 @@
 #include <asm/sections.h>
 #include <asm/io_apic.h>
 #include <asm/ist.h>
+#include <asm/std_resources.h>
 #include "setup_arch_pre.h"
-#include "mach_resources.h"
 
 /* This value is set up by the early boot code to point to the value
    immediately after the boot time page tables.  It contains a *physical*
@@ -135,19 +135,6 @@ unsigned char __initdata boot_params[PAR
 static struct resource code_resource = { "Kernel code", 0x100000, 0 };
 static struct resource data_resource = { "Kernel data", 0, 0 };
 
-static void __init probe_roms(void)
-{
-	int roms = 1;
-
-	request_resource(&iomem_resource, rom_resources+0);
-
-	/* Video ROM is standard at C000:0000 - C7FF:0000, check signature */
-	probe_video_rom(roms);
-
-	/* Extension roms */
-	probe_extension_roms(roms);
-}
-
 static void __init limit_regions(unsigned long long size)
 {
 	unsigned long long current_addr = 0;
@@ -951,19 +938,17 @@ legacy_init_iomem_resources(struct resou
 static void __init register_memory(unsigned long max_low_pfn)
 {
 	unsigned long low_mem_size;
-	int i;
 
 	if (efi_enabled)
 		efi_initialize_iomem_resources(&code_resource, &data_resource);
 	else
 		legacy_init_iomem_resources(&code_resource, &data_resource);
 
- 	 /* EFI systems may still have VGA */
+	/* EFI systems may still have VGA */
 	request_graphics_resource();
 
 	/* request I/O space for devices used on all i[345]86 PCs */
-	for (i = 0; i < STANDARD_IO_RESOURCES; i++)
-		request_resource(&ioport_resource, standard_io_resources+i);
+	request_standard_io_resources();
 
 	/* Tell the PCI layer not to allocate too close to the RAM area.. */
 	low_mem_size = ((max_low_pfn << PAGE_SHIFT) + 0xfffff) & ~0xfffff;
--- diff/arch/i386/kernel/signal.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/i386/kernel/signal.c	2004-04-21 10:45:33.484613064 +0100
@@ -20,6 +20,7 @@
 #include <linux/personality.h>
 #include <linux/suspend.h>
 #include <linux/elf.h>
+#include <asm/processor.h>
 #include <asm/ucontext.h>
 #include <asm/uaccess.h>
 #include <asm/i387.h>
@@ -152,6 +153,10 @@ restore_sigcontext(struct pt_regs *regs,
 	  err |= __get_user(tmp, &sc->seg);				\
 	  loadsegment(seg,tmp); }
 
+#define	FIX_EFLAGS	(X86_EFLAGS_AC | X86_EFLAGS_OF | X86_EFLAGS_DF | \
+			 X86_EFLAGS_TF | X86_EFLAGS_SF | X86_EFLAGS_ZF | \
+			 X86_EFLAGS_AF | X86_EFLAGS_PF | X86_EFLAGS_CF)
+
 	GET_SEG(gs);
 	GET_SEG(fs);
 	COPY_SEG(es);
@@ -170,7 +175,7 @@ restore_sigcontext(struct pt_regs *regs,
 	{
 		unsigned int tmpflags;
 		err |= __get_user(tmpflags, &sc->eflags);
-		regs->eflags = (regs->eflags & ~0x40DD5) | (tmpflags & 0x40DD5);
+		regs->eflags = (regs->eflags & ~FIX_EFLAGS) | (tmpflags & FIX_EFLAGS);
 		regs->orig_eax = -1;		/* disable syscall checks */
 	}
 
--- diff/arch/i386/kernel/smpboot.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/i386/kernel/smpboot.c	2004-04-21 10:45:33.484613064 +0100
@@ -522,7 +522,7 @@ static inline void unmap_cpu_to_node(int
 	printk("Unmapping cpu %d from all nodes\n", cpu);
 	for (node = 0; node < MAX_NUMNODES; node ++)
 		cpu_clear(cpu, node_2_cpu_mask[node]);
-	cpu_2_node[cpu] = -1;
+	cpu_2_node[cpu] = 0;
 }
 #else /* !CONFIG_NUMA */
 
@@ -815,6 +815,8 @@ static int __init do_boot_cpu(int apicid
 	/* Stack for startup_32 can be just as for start_secondary onwards */
 	stack_start.esp = (void *) idle->thread.esp;
 
+	irq_ctx_init(cpu);
+
 	/*
 	 * This grunge runs the startup process for
 	 * the targeted processor.
--- diff/arch/i386/kernel/timers/timer_tsc.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/i386/kernel/timers/timer_tsc.c	2004-04-21 10:45:33.486612760 +0100
@@ -232,7 +232,7 @@ static void mark_offset_tsc(void)
 		/* sanity check to ensure we're not always losing ticks */
 		if (lost_count++ > 100) {
 			printk(KERN_WARNING "Losing too many ticks!\n");
-			printk(KERN_WARNING "TSC cannot be used as a timesource.  ");
+			printk(KERN_WARNING "TSC cannot be used as a timesource.  \n");
 			printk(KERN_WARNING "Possible reasons for this are:\n");
 			printk(KERN_WARNING "  You're running with Speedstep,\n");
 			printk(KERN_WARNING "  You don't have DMA enabled for your hard disk (see hdparm),\n");
--- diff/arch/i386/kernel/traps.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/i386/kernel/traps.c	2004-04-21 10:45:33.487612608 +0100
@@ -105,12 +105,20 @@ void show_trace(struct task_struct *task
 #ifdef CONFIG_KALLSYMS
 	printk("\n");
 #endif
-	while (!kstack_end(stack)) {
-		addr = *stack++;
-		if (kernel_text_address(addr)) {
-			printk(" [<%08lx>] ", addr);
-			print_symbol("%s\n", addr);
+	while (1) {
+		struct thread_info *context;
+		context = (struct thread_info*) ((unsigned long)stack & (~(THREAD_SIZE - 1)));
+		while (!kstack_end(stack)) {
+			addr = *stack++;
+			if (kernel_text_address(addr)) {
+				printk(" [<%08lx>] ", addr);
+				print_symbol("%s\n", addr);
+			}
 		}
+		stack = (unsigned long*)context->previous_esp;
+		if (!stack)
+			break;
+		printk(" =======================\n");
 	}
 	printk("\n");
 }
--- diff/arch/i386/kernel/vmlinux.lds.S	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/i386/kernel/vmlinux.lds.S	2004-04-21 10:45:33.487612608 +0100
@@ -16,6 +16,7 @@ SECTIONS
   _text = .;			/* Text and read-only data */
   .text : {
 	*(.text)
+	SCHED_TEXT
 	*(.fixup)
 	*(.gnu.warning)
 	} = 0x9090
@@ -105,7 +106,10 @@ SECTIONS
   /* freed after init ends here */
 	
   __bss_start = .;		/* BSS */
-  .bss : { *(.bss) }
+  .bss : {
+	*(.bss.page_aligned)
+	*(.bss)
+  }
   . = ALIGN(4);
   __bss_stop = .; 
 
--- diff/arch/i386/lib/usercopy.c	2004-01-19 10:22:55.000000000 +0000
+++ source/arch/i386/lib/usercopy.c	2004-04-21 10:45:33.494611544 +0100
@@ -9,6 +9,7 @@
 #include <linux/mm.h>
 #include <linux/highmem.h>
 #include <linux/blkdev.h>
+#include <linux/module.h>
 #include <asm/uaccess.h>
 #include <asm/mmx.h>
 
@@ -567,7 +568,8 @@ survive:
 	return n;
 }
 
-unsigned long __copy_from_user_ll(void *to, const void __user *from, unsigned long n)
+unsigned long
+__copy_from_user_ll(void *to, const void __user *from, unsigned long n)
 {
 	if (movsl_is_ok(to, from, n))
 		__copy_user_zeroing(to, (const void *) from, n);
@@ -575,3 +577,54 @@ unsigned long __copy_from_user_ll(void *
 		n = __copy_user_zeroing_intel(to, (const void *) from, n);
 	return n;
 }
+
+/**
+ * copy_to_user: - Copy a block of data into user space.
+ * @to:   Destination address, in user space.
+ * @from: Source address, in kernel space.
+ * @n:    Number of bytes to copy.
+ *
+ * Context: User context only.  This function may sleep.
+ *
+ * Copy data from kernel space to user space.
+ *
+ * Returns number of bytes that could not be copied.
+ * On success, this will be zero.
+ */
+unsigned long
+copy_to_user(void __user *to, const void *from, unsigned long n)
+{
+	might_sleep();
+	if (access_ok(VERIFY_WRITE, to, n))
+		n = __copy_to_user(to, from, n);
+	return n;
+}
+EXPORT_SYMBOL(copy_to_user);
+
+/**
+ * copy_from_user: - Copy a block of data from user space.
+ * @to:   Destination address, in kernel space.
+ * @from: Source address, in user space.
+ * @n:    Number of bytes to copy.
+ *
+ * Context: User context only.  This function may sleep.
+ *
+ * Copy data from user space to kernel space.
+ *
+ * Returns number of bytes that could not be copied.
+ * On success, this will be zero.
+ *
+ * If some data could not be copied, this function will pad the copied
+ * data to the requested size using zero bytes.
+ */
+unsigned long
+copy_from_user(void *to, const void __user *from, unsigned long n)
+{
+	might_sleep();
+	if (access_ok(VERIFY_READ, from, n))
+		n = __copy_from_user(to, from, n);
+	else
+		memset(to, 0, n);
+	return n;
+}
+EXPORT_SYMBOL(copy_from_user);
--- diff/arch/i386/mach-pc9800/Makefile	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/i386/mach-pc9800/Makefile	2004-04-21 10:45:33.494611544 +0100
@@ -2,4 +2,4 @@
 # Makefile for the linux kernel.
 #
 
-obj-y				:= setup.o topology.o
+obj-y				:= setup.o topology.o std_resources.o
--- diff/arch/i386/mach-visws/mpparse.c	2003-09-17 12:28:01.000000000 +0100
+++ source/arch/i386/mach-visws/mpparse.c	2004-04-21 10:45:33.495611392 +0100
@@ -28,6 +28,7 @@ unsigned int boot_cpu_logical_apicid = -
 /* Bitmask of physically existing CPUs */
 physid_mask_t phys_cpu_present_map;
 
+unsigned int __initdata maxcpus = NR_CPUS;
 
 /*
  * The Visual Workstation is Intel MP compliant in the hardware
@@ -89,6 +90,9 @@ void __init find_smp_config(void)
 		ncpus = CO_CPU_MAX;
 	}
 
+	if (ncpus > maxcpus)
+		ncpus = maxcpus;
+
 	smp_found_config = 1;
 	while (ncpus--)
 		MP_processor_info(mp++);
--- diff/arch/i386/mach-voyager/voyager_smp.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/i386/mach-voyager/voyager_smp.c	2004-04-21 10:45:33.500610632 +0100
@@ -599,12 +599,10 @@ do_boot_cpu(__u8 cpu)
 	idle->thread.eip = (unsigned long) start_secondary;
 	unhash_process(idle);
 	/* init_tasks (in sched.c) is indexed logically */
-#if 0
-	// for AC kernels
-	stack_start.esp = (THREAD_SIZE + (__u8 *)TSK_TO_KSTACK(idle));
-#else
-	stack_start.esp = (void *) (1024 + PAGE_SIZE + (char *)idle->thread_info);
-#endif
+	stack_start.esp = (void *) idle->thread.esp;
+
+	irq_ctx_init(cpu);
+
 	/* Note: Don't modify initial ss override */
 	VDEBUG(("VOYAGER SMP: Booting CPU%d at 0x%lx[%x:%x], stack %p\n", cpu, 
 		(unsigned long)hijack_source.val, hijack_source.idt.Segment,
--- diff/arch/i386/mach-voyager/voyager_thread.c	2003-02-26 16:01:01.000000000 +0000
+++ source/arch/i386/mach-voyager/voyager_thread.c	2004-04-21 10:45:33.500610632 +0100
@@ -135,7 +135,7 @@ thread(void *unused)
 	init_timer(&wakeup_timer);
 
 	sigfillset(&current->blocked);
-	current->tty = NULL;	/* get rid of controlling tty */
+	current->signal->tty = NULL;
 
 	printk(KERN_NOTICE "Voyager starting monitor thread\n");
 
--- diff/arch/i386/mm/hugetlbpage.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/i386/mm/hugetlbpage.c	2004-04-21 10:45:33.510609112 +0100
@@ -20,67 +20,6 @@
 #include <asm/tlb.h>
 #include <asm/tlbflush.h>
 
-static long    htlbpagemem;
-int     htlbpage_max;
-static long    htlbzone_pages;
-
-static struct list_head hugepage_freelists[MAX_NUMNODES];
-static spinlock_t htlbpage_lock = SPIN_LOCK_UNLOCKED;
-
-static void enqueue_huge_page(struct page *page)
-{
-	list_add(&page->list,
-		&hugepage_freelists[page_zone(page)->zone_pgdat->node_id]);
-}
-
-static struct page *dequeue_huge_page(void)
-{
-	int nid = numa_node_id();
-	struct page *page = NULL;
-
-	if (list_empty(&hugepage_freelists[nid])) {
-		for (nid = 0; nid < MAX_NUMNODES; ++nid)
-			if (!list_empty(&hugepage_freelists[nid]))
-				break;
-	}
-	if (nid >= 0 && nid < MAX_NUMNODES && !list_empty(&hugepage_freelists[nid])) {
-		page = list_entry(hugepage_freelists[nid].next, struct page, list);
-		list_del(&page->list);
-	}
-	return page;
-}
-
-static struct page *alloc_fresh_huge_page(void)
-{
-	static int nid = 0;
-	struct page *page;
-	page = alloc_pages_node(nid, GFP_HIGHUSER, HUGETLB_PAGE_ORDER);
-	nid = (nid + 1) % numnodes;
-	return page;
-}
-
-static void free_huge_page(struct page *page);
-
-static struct page *alloc_hugetlb_page(void)
-{
-	int i;
-	struct page *page;
-
-	spin_lock(&htlbpage_lock);
-	page = dequeue_huge_page();
-	if (!page) {
-		spin_unlock(&htlbpage_lock);
-		return NULL;
-	}
-	htlbpagemem--;
-	spin_unlock(&htlbpage_lock);
-	set_page_count(page, 1);
-	page->lru.prev = (void *)free_huge_page;
-	for (i = 0; i < (HPAGE_SIZE/PAGE_SIZE); ++i)
-		clear_highpage(&page[i]);
-	return page;
-}
-
 static pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
 {
 	pgd_t *pgd;
@@ -201,32 +140,31 @@ follow_hugetlb_page(struct mm_struct *mm
 
 #if 0	/* This is just for testing */
 struct page *
-follow_huge_addr(struct mm_struct *mm,
-	struct vm_area_struct *vma, unsigned long address, int write)
+follow_huge_addr(struct mm_struct *mm, unsigned long address, int write)
 {
 	unsigned long start = address;
 	int length = 1;
 	int nr;
 	struct page *page;
+	struct vm_area_struct *vma;
 
-	nr = follow_hugetlb_page(mm, vma, &page, NULL, &start, &length, 0);
-	if (nr == 1)
-		return page;
-	return NULL;
-}
+	if (! mm->used_hugetlb)
+		return ERR_PTR(-EINVAL);
 
-/*
- * If virtual address `addr' lies within a huge page, return its controlling
- * VMA, else NULL.
- */
-struct vm_area_struct *hugepage_vma(struct mm_struct *mm, unsigned long addr)
-{
-	if (mm->used_hugetlb) {
-		struct vm_area_struct *vma = find_vma(mm, addr);
-		if (vma && is_vm_hugetlb_page(vma))
-			return vma;
-	}
-	return NULL;
+	vma = find_vma(mm, addr);
+	if (!vma || !is_vm_hugetlb_page(vma))
+		return ERR_PTR(-EINVAL);
+
+	pte = huge_pte_offset(mm, address);
+
+	/* hugetlb should be locked, and hence, prefaulted */
+	WARN_ON(!pte || pte_none(*pte));
+
+	page = &pte_page(*pte)[vpfn % (HPAGE_SIZE/PAGE_SIZE)];
+
+	WARN_ON(!PageCompound(page));
+
+	return page;
 }
 
 int pmd_huge(pmd_t pmd)
@@ -244,15 +182,9 @@ follow_huge_pmd(struct mm_struct *mm, un
 #else
 
 struct page *
-follow_huge_addr(struct mm_struct *mm,
-	struct vm_area_struct *vma, unsigned long address, int write)
-{
-	return NULL;
-}
-
-struct vm_area_struct *hugepage_vma(struct mm_struct *mm, unsigned long addr)
+follow_huge_addr(struct mm_struct *mm, unsigned long address, int write)
 {
-	return NULL;
+	return ERR_PTR(-EINVAL);
 }
 
 int pmd_huge(pmd_t pmd)
@@ -267,35 +199,12 @@ follow_huge_pmd(struct mm_struct *mm, un
 	struct page *page;
 
 	page = pte_page(*(pte_t *)pmd);
-	if (page) {
+	if (page)
 		page += ((address & ~HPAGE_MASK) >> PAGE_SHIFT);
-		get_page(page);
-	}
 	return page;
 }
 #endif
 
-static void free_huge_page(struct page *page)
-{
-	BUG_ON(page_count(page));
-	BUG_ON(page->mapping);
-
-	INIT_LIST_HEAD(&page->list);
-
-	spin_lock(&htlbpage_lock);
-	enqueue_huge_page(page);
-	htlbpagemem++;
-	spin_unlock(&htlbpage_lock);
-}
-
-void huge_page_release(struct page *page)
-{
-	if (!put_page_testzero(page))
-		return;
-
-	free_huge_page(page);
-}
-
 void unmap_hugepage_range(struct vm_area_struct *vma,
 		unsigned long start, unsigned long end)
 {
@@ -319,16 +228,6 @@ void unmap_hugepage_range(struct vm_area
 	flush_tlb_range(vma, start, end);
 }
 
-void
-zap_hugepage_range(struct vm_area_struct *vma,
-		unsigned long start, unsigned long length)
-{
-	struct mm_struct *mm = vma->vm_mm;
-	spin_lock(&mm->page_table_lock);
-	unmap_hugepage_range(vma, start, start + length);
-	spin_unlock(&mm->page_table_lock);
-}
-
 int hugetlb_prefault(struct address_space *mapping, struct vm_area_struct *vma)
 {
 	struct mm_struct *mm = current->mm;
@@ -360,7 +259,7 @@ int hugetlb_prefault(struct address_spac
 				ret = -ENOMEM;
 				goto out;
 			}
-			page = alloc_hugetlb_page();
+			page = alloc_huge_page();
 			if (!page) {
 				hugetlb_put_quota(mapping);
 				ret = -ENOMEM;
@@ -380,173 +279,3 @@ out:
 	spin_unlock(&mm->page_table_lock);
 	return ret;
 }
-
-static void update_and_free_page(struct page *page)
-{
-	int j;
-	struct page *map;
-
-	map = page;
-	htlbzone_pages--;
-	for (j = 0; j < (HPAGE_SIZE / PAGE_SIZE); j++) {
-		map->flags &= ~(1 << PG_locked | 1 << PG_error | 1 << PG_referenced |
-				1 << PG_dirty | 1 << PG_active | 1 << PG_reserved |
-				1 << PG_private | 1<< PG_writeback);
-		set_page_count(map, 0);
-		map++;
-	}
-	set_page_count(page, 1);
-	__free_pages(page, HUGETLB_PAGE_ORDER);
-}
-
-static int try_to_free_low(int count)
-{
-	struct list_head *p;
-	struct page *page, *map;
-
-	map = NULL;
-	spin_lock(&htlbpage_lock);
-	/* all lowmem is on node 0 */
-	list_for_each(p, &hugepage_freelists[0]) {
-		if (map) {
-			list_del(&map->list);
-			update_and_free_page(map);
-			htlbpagemem--;
-			map = NULL;
-			if (++count == 0)
-				break;
-		}
-		page = list_entry(p, struct page, list);
-		if (!PageHighMem(page))
-			map = page;
-	}
-	if (map) {
-		list_del(&map->list);
-		update_and_free_page(map);
-		htlbpagemem--;
-		count++;
-	}
-	spin_unlock(&htlbpage_lock);
-	return count;
-}
-
-static int set_hugetlb_mem_size(int count)
-{
-	int lcount;
-	struct page *page;
-
-	if (count < 0)
-		lcount = count;
-	else
-		lcount = count - htlbzone_pages;
-
-	if (lcount == 0)
-		return (int)htlbzone_pages;
-	if (lcount > 0) {	/* Increase the mem size. */
-		while (lcount--) {
-			page = alloc_fresh_huge_page();
-			if (page == NULL)
-				break;
-			spin_lock(&htlbpage_lock);
-			enqueue_huge_page(page);
-			htlbpagemem++;
-			htlbzone_pages++;
-			spin_unlock(&htlbpage_lock);
-		}
-		return (int) htlbzone_pages;
-	}
-	/* Shrink the memory size. */
-	lcount = try_to_free_low(lcount);
-	while (lcount++) {
-		page = alloc_hugetlb_page();
-		if (page == NULL)
-			break;
-		spin_lock(&htlbpage_lock);
-		update_and_free_page(page);
-		spin_unlock(&htlbpage_lock);
-	}
-	return (int) htlbzone_pages;
-}
-
-int hugetlb_sysctl_handler(ctl_table *table, int write,
-		struct file *file, void *buffer, size_t *length)
-{
-	if (!cpu_has_pse)
-		return -ENODEV;
-	proc_dointvec(table, write, file, buffer, length);
-	htlbpage_max = set_hugetlb_mem_size(htlbpage_max);
-	return 0;
-}
-
-static int __init hugetlb_setup(char *s)
-{
-	if (sscanf(s, "%d", &htlbpage_max) <= 0)
-		htlbpage_max = 0;
-	return 1;
-}
-__setup("hugepages=", hugetlb_setup);
-
-static int __init hugetlb_init(void)
-{
-	int i;
-	struct page *page;
-
-	if (!cpu_has_pse)
-		return -ENODEV;
-
-	for (i = 0; i < MAX_NUMNODES; ++i)
-		INIT_LIST_HEAD(&hugepage_freelists[i]);
-
-	for (i = 0; i < htlbpage_max; ++i) {
-		page = alloc_fresh_huge_page();
-		if (!page)
-			break;
-		spin_lock(&htlbpage_lock);
-		enqueue_huge_page(page);
-		spin_unlock(&htlbpage_lock);
-	}
-	htlbpage_max = htlbpagemem = htlbzone_pages = i;
-	printk("Total HugeTLB memory allocated, %ld\n", htlbpagemem);
-	return 0;
-}
-module_init(hugetlb_init);
-
-int hugetlb_report_meminfo(char *buf)
-{
-	return sprintf(buf,
-			"HugePages_Total: %5lu\n"
-			"HugePages_Free:  %5lu\n"
-			"Hugepagesize:    %5lu kB\n",
-			htlbzone_pages,
-			htlbpagemem,
-			HPAGE_SIZE/1024);
-}
-
-int is_hugepage_mem_enough(size_t size)
-{
-	return (size + ~HPAGE_MASK)/HPAGE_SIZE <= htlbpagemem;
-}
-
-/* Return the number pages of memory we physically have, in PAGE_SIZE units. */
-unsigned long hugetlb_total_pages(void)
-{
-	return htlbzone_pages * (HPAGE_SIZE / PAGE_SIZE);
-}
-EXPORT_SYMBOL(hugetlb_total_pages);
-
-/*
- * We cannot handle pagefaults against hugetlb pages at all.  They cause
- * handle_mm_fault() to try to instantiate regular-sized pages in the
- * hugegpage VMA.  do_page_fault() is supposed to trap this, so BUG is we get
- * this far.
- */
-static struct page *hugetlb_nopage(struct vm_area_struct *vma,
-				unsigned long address, int *unused)
-{
-	BUG();
-	return NULL;
-}
-
-struct vm_operations_struct hugetlb_vm_ops = {
-	.nopage = hugetlb_nopage,
-};
--- diff/arch/i386/mm/init.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/i386/mm/init.c	2004-04-21 10:45:33.516608200 +0100
@@ -531,8 +531,8 @@ void __init pgtable_cache_init(void)
 	if (PTRS_PER_PMD > 1) {
 		pmd_cache = kmem_cache_create("pmd",
 					PTRS_PER_PMD*sizeof(pmd_t),
+					PTRS_PER_PMD*sizeof(pmd_t),
 					0,
-					SLAB_HWCACHE_ALIGN | SLAB_MUST_HWCACHE_ALIGN,
 					pmd_ctor,
 					NULL);
 		if (!pmd_cache)
@@ -540,8 +540,8 @@ void __init pgtable_cache_init(void)
 	}
 	pgd_cache = kmem_cache_create("pgd",
 				PTRS_PER_PGD*sizeof(pgd_t),
+				PTRS_PER_PGD*sizeof(pgd_t),
 				0,
-				SLAB_HWCACHE_ALIGN | SLAB_MUST_HWCACHE_ALIGN,
 				pgd_ctor,
 				PTRS_PER_PMD == 1 ? pgd_dtor : NULL);
 	if (!pgd_cache)
--- diff/arch/i386/mm/pageattr.c	2003-08-20 14:16:24.000000000 +0100
+++ source/arch/i386/mm/pageattr.c	2004-04-21 10:45:33.521607440 +0100
@@ -75,7 +75,7 @@ static void set_pmd_pte(pte_t *kpte, uns
 		return;
 
 	spin_lock_irqsave(&pgd_lock, flags);
-	list_for_each_entry(page, &pgd_list, lru) {
+	for (page = pgd_list; page; page = (struct page *)page->index) {
 		pgd_t *pgd;
 		pmd_t *pmd;
 		pgd = (pgd_t *)page_address(page) + pgd_index(address);
@@ -135,7 +135,7 @@ __change_page_attr(struct page *page, pg
 	}
 
 	if (cpu_has_pse && (atomic_read(&kpte_page->count) == 1)) { 
-		list_add(&kpte_page->list, &df_list);
+		list_add(&kpte_page->lru, &df_list);
 		revert_page(kpte_page, address);
 	} 
 	return 0;
@@ -188,7 +188,7 @@ void global_flush_tlb(void)
 	flush_map();
 	n = l.next;
 	while (n != &l) {
-		struct page *pg = list_entry(n, struct page, list);
+		struct page *pg = list_entry(n, struct page, lru);
 		n = n->next;
 		__free_page(pg);
 	}
--- diff/arch/i386/mm/pgtable.c	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/i386/mm/pgtable.c	2004-04-21 10:45:33.526606680 +0100
@@ -172,7 +172,27 @@ void pmd_ctor(void *pmd, kmem_cache_t *c
  * -- wli
  */
 spinlock_t pgd_lock = SPIN_LOCK_UNLOCKED;
-LIST_HEAD(pgd_list);
+struct page *pgd_list;
+
+static inline void pgd_list_add(pgd_t *pgd)
+{
+	struct page *page = virt_to_page(pgd);
+	page->index = (unsigned long)pgd_list;
+	if (pgd_list)
+		pgd_list->private = (unsigned long)&page->index;
+	pgd_list = page;
+	page->private = (unsigned long)&pgd_list;
+}
+
+static inline void pgd_list_del(pgd_t *pgd)
+{
+	struct page *next, **pprev, *page = virt_to_page(pgd);
+	next = (struct page *)page->index;
+	pprev = (struct page **)page->private;
+	*pprev = next;
+	if (next)
+		next->private = (unsigned long)pprev;
+}
 
 void pgd_ctor(void *pgd, kmem_cache_t *cache, unsigned long unused)
 {
@@ -188,7 +208,7 @@ void pgd_ctor(void *pgd, kmem_cache_t *c
 	if (PTRS_PER_PMD > 1)
 		return;
 
-	list_add(&virt_to_page(pgd)->lru, &pgd_list);
+	pgd_list_add(pgd);
 	spin_unlock_irqrestore(&pgd_lock, flags);
 	memset(pgd, 0, USER_PTRS_PER_PGD*sizeof(pgd_t));
 }
@@ -199,7 +219,7 @@ void pgd_dtor(void *pgd, kmem_cache_t *c
 	unsigned long flags; /* can be called from interrupt context */
 
 	spin_lock_irqsave(&pgd_lock, flags);
-	list_del(&virt_to_page(pgd)->lru);
+	pgd_list_del(pgd);
 	spin_unlock_irqrestore(&pgd_lock, flags);
 }
 
--- diff/arch/i386/pci/irq.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/i386/pci/irq.c	2004-04-21 10:45:33.531605920 +0100
@@ -15,6 +15,7 @@
 #include <asm/io.h>
 #include <asm/smp.h>
 #include <asm/io_apic.h>
+#include <asm/hw_irq.h>
 
 #include "pci.h"
 
@@ -590,12 +591,13 @@ static __init int ali_router_probe(struc
 {
 	switch(device)
 	{
-		case PCI_DEVICE_ID_AL_M1533:
+	case PCI_DEVICE_ID_AL_M1533:
+	case PCI_DEVICE_ID_AL_M1563:
+		printk("PCI: Using ALI IRQ Router\n");
 			r->name = "ALI";
 			r->get = pirq_ali_get;
 			r->set = pirq_ali_set;
 			return 1;
-		/* Should add 156x some day */
 	}
 	return 0;
 }
@@ -1005,3 +1007,33 @@ int pirq_enable_irq(struct pci_dev *dev)
 		pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
 	return 0;
 }
+
+int pci_vector_resources(int last, int nr_released)
+{
+	int count = nr_released;
+
+	int next = last;
+	int offset = (last % 8);
+
+	while (next < FIRST_SYSTEM_VECTOR) {
+		next += 8;
+#ifdef CONFIG_X86_64
+		if (next == IA32_SYSCALL_VECTOR)
+			continue;
+#else
+		if (next == SYSCALL_VECTOR)
+			continue;
+#endif
+		count++;
+		if (next >= FIRST_SYSTEM_VECTOR) {
+			if (offset%8) {
+				next = FIRST_DEVICE_VECTOR + offset;
+				offset++;
+				continue;
+			}
+			count--;
+		}
+	}
+
+	return count;
+}
--- diff/arch/i386/power/swsusp.S	2003-09-30 15:46:11.000000000 +0100
+++ source/arch/i386/power/swsusp.S	2004-04-21 10:45:33.532605768 +0100
@@ -1,6 +1,13 @@
 .text
 
-/* Originally gcc generated, modified by hand */
+/* Originally gcc generated, modified by hand
+ *
+ * This may not use any stack, nor any variable that is not "NoSave":
+ *
+ * Its rewriting one kernel image with another. What is stack in "old"
+ * image could very well be data page in "new" image, and overwriting
+ * your own stack under you is bad idea.
+ */
 
 #include <linux/linkage.h>
 #include <asm/segment.h>
--- diff/arch/ia64/Kconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/ia64/Kconfig	2004-04-21 10:45:33.532605768 +0100
@@ -16,7 +16,7 @@ config IA64
 	  The Itanium Processor Family is Intel's 64-bit successor to
 	  the 32-bit X86 line.  The IA-64 Linux project has a home
 	  page at <http://www.linuxia64.org/> and a mailing list at
-	  linux-ia64@vger.kernel.org.
+	  <linux-ia64@vger.kernel.org>.
 
 config 64BIT
 	bool
@@ -57,7 +57,7 @@ config IA64_GENERIC
 	  DIG-compliant	 For DIG ("Developer's Interface Guide") compliant systems
 	  HP-zx1/sx1000	 For HP systems
 	  SGI-SN2	 For SGI Altix systems
-	  Ski-simulator  For the HP simulator (<http://www.hpl.hp.com/research/linux/ski/>)
+	  Ski-simulator  For the HP simulator <http://www.hpl.hp.com/research/linux/ski/>
 
 	  If you don't know what to do, choose "generic".
 
--- diff/arch/ia64/configs/generic_defconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/ia64/configs/generic_defconfig	2004-04-21 10:45:33.533605616 +0100
@@ -976,7 +976,6 @@ CONFIG_USB_HIDINPUT=y
 # CONFIG_USB_AUERSWALD is not set
 # CONFIG_USB_RIO500 is not set
 # CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_BRLVGER is not set
 # CONFIG_USB_LCD is not set
 # CONFIG_USB_TEST is not set
 # CONFIG_USB_GADGET is not set
--- diff/arch/ia64/configs/zx1_defconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/ia64/configs/zx1_defconfig	2004-04-21 10:45:33.533605616 +0100
@@ -1028,7 +1028,6 @@ CONFIG_USB_HIDDEV=y
 # CONFIG_USB_AUERSWALD is not set
 # CONFIG_USB_RIO500 is not set
 # CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_BRLVGER is not set
 # CONFIG_USB_LCD is not set
 # CONFIG_USB_LED is not set
 
--- diff/arch/ia64/defconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/ia64/defconfig	2004-04-21 10:45:33.534605464 +0100
@@ -906,7 +906,6 @@ CONFIG_USB_HIDDEV=y
 # CONFIG_USB_AUERSWALD is not set
 # CONFIG_USB_RIO500 is not set
 # CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_BRLVGER is not set
 # CONFIG_USB_LCD is not set
 # CONFIG_USB_LED is not set
 # CONFIG_USB_TEST is not set
--- diff/arch/ia64/hp/common/sba_iommu.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/ia64/hp/common/sba_iommu.c	2004-04-21 10:45:33.535605312 +0100
@@ -1732,7 +1732,6 @@ ioc_init(u64 hpa, void *handle)
 
 	if ((long) ~iovp_mask > (long) ia64_max_iommu_merge_mask)
 		ia64_max_iommu_merge_mask = ~iovp_mask;
-	MAX_DMA_ADDRESS = ~0UL;
 
 	printk(KERN_INFO PFX
 		"%s %d.%d HPA 0x%lx IOVA space %dMb at 0x%lx\n",
@@ -1966,6 +1965,18 @@ sba_init(void)
 
 subsys_initcall(sba_init); /* must be initialized after ACPI etc., but before any drivers... */
 
+extern void dig_setup(char**);
+/*
+ * MAX_DMA_ADDRESS needs to be setup prior to paging_init to do any good,
+ * so we use the platform_setup hook to fix it up.
+ */
+void __init
+sba_setup(char **cmdline_p)
+{
+	MAX_DMA_ADDRESS = ~0UL;
+	dig_setup(cmdline_p);
+}
+
 static int __init
 nosbagart(char *str)
 {
--- diff/arch/ia64/hp/sim/Kconfig	2003-06-30 10:07:32.000000000 +0100
+++ source/arch/ia64/hp/sim/Kconfig	2004-04-21 10:45:33.535605312 +0100
@@ -13,7 +13,7 @@ config HP_SIMSERIAL_CONSOLE
 	depends on HP_SIMSERIAL
 
 config HP_SIMSCSI
-	bool "Simulated SCSI disk"
+	tristate "Simulated SCSI disk"
 	depends on SCSI
 
 endmenu
--- diff/arch/ia64/hp/sim/simeth.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/ia64/hp/sim/simeth.c	2004-04-21 10:45:33.536605160 +0100
@@ -228,7 +228,7 @@ simeth_probe1(void)
 		return err;
 	}
 
-	dev->irq = ia64_alloc_vector();
+	dev->irq = assign_irq_vector(AUTO_ASSIGN);
 
 	/*
 	 * attach the interrupt in the simulator, this does enable interrupts
--- diff/arch/ia64/hp/sim/simserial.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/ia64/hp/sim/simserial.c	2004-04-21 10:45:33.536605160 +0100
@@ -1051,7 +1051,7 @@ simrs_init (void)
 		if (state->type == PORT_UNKNOWN) continue;
 
 		if (!state->irq) {
-			state->irq = ia64_alloc_vector();
+			state->irq = assign_irq_vector(AUTO_ASSIGN);
 			ia64_ssc_connect_irq(KEYBOARD_INTR, state->irq);
 		}
 
--- diff/arch/ia64/ia32/binfmt_elf32.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/ia64/ia32/binfmt_elf32.c	2004-04-21 10:45:33.537605008 +0100
@@ -35,7 +35,7 @@ extern void ia64_elf32_init (struct pt_r
 
 static void elf32_set_personality (void);
 
-#define setup_arg_pages(bprm)		ia32_setup_arg_pages(bprm)
+#define setup_arg_pages(bprm,exec)		ia32_setup_arg_pages(bprm,exec)
 #define elf_map				elf32_map
 
 #undef SET_PERSONALITY
@@ -149,7 +149,7 @@ ia64_elf32_init (struct pt_regs *regs)
 }
 
 int
-ia32_setup_arg_pages (struct linux_binprm *bprm)
+ia32_setup_arg_pages (struct linux_binprm *bprm, int executable_stack)
 {
 	unsigned long stack_base;
 	struct vm_area_struct *mpnt;
@@ -178,8 +178,14 @@ ia32_setup_arg_pages (struct linux_binpr
 		mpnt->vm_mm = current->mm;
 		mpnt->vm_start = PAGE_MASK & (unsigned long) bprm->p;
 		mpnt->vm_end = IA32_STACK_TOP;
-		mpnt->vm_page_prot = PAGE_COPY;
-		mpnt->vm_flags = VM_STACK_FLAGS;
+		if (executable_stack == EXSTACK_ENABLE_X)
+			mpnt->vm_flags = VM_STACK_FLAGS |  VM_EXEC;
+		else if (executable_stack == EXSTACK_DISABLE_X)
+			mpnt->vm_flags = VM_STACK_FLAGS & ~VM_EXEC;
+		else
+			mpnt->vm_flags = VM_STACK_FLAGS;
+		mpnt->vm_page_prot = (mpnt->vm_flags & VM_EXEC)?
+					PAGE_COPY_EXEC: PAGE_COPY;
 		mpnt->vm_ops = NULL;
 		mpnt->vm_pgoff = 0;
 		mpnt->vm_file = NULL;
@@ -192,7 +198,7 @@ ia32_setup_arg_pages (struct linux_binpr
 		struct page *page = bprm->page[i];
 		if (page) {
 			bprm->page[i] = NULL;
-			put_dirty_page(current, page, stack_base, PAGE_COPY);
+			put_dirty_page(current, page, stack_base, mpnt->vm_page_prot);
 		}
 		stack_base += PAGE_SIZE;
 	}
--- diff/arch/ia64/ia32/ia32_signal.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/ia64/ia32/ia32_signal.c	2004-04-21 10:45:33.538604856 +0100
@@ -114,7 +114,12 @@ copy_siginfo_from_user32 (siginfo_t *to,
 			err |= __get_user(to->si_band, &from->si_band);
 			err |= __get_user(to->si_fd, &from->si_fd);
 			break;
-			/* case __SI_RT: This is not generated by the kernel as of now.  */
+		      case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
+		      case __SI_MESGQ >> 16:
+			err |= __get_user(to->si_pid, &from->si_pid);
+			err |= __get_user(to->si_uid, &from->si_uid);
+			err |= __get_user(to->si_int, &from->si_int);
+			break;
 		}
 	}
 	return err;
--- diff/arch/ia64/ia32/ia32priv.h	2004-01-19 10:22:55.000000000 +0000
+++ source/arch/ia64/ia32/ia32priv.h	2004-04-21 10:45:33.538604856 +0100
@@ -494,7 +494,7 @@ struct ia32_user_desc {
 struct linux_binprm;
 
 extern void ia32_init_addr_space (struct pt_regs *regs);
-extern int ia32_setup_arg_pages (struct linux_binprm *bprm);
+extern int ia32_setup_arg_pages (struct linux_binprm *bprm, int exec_stack);
 extern unsigned long ia32_do_mmap (struct file *, unsigned long, unsigned long, int, int, loff_t);
 extern void ia32_load_segment_descriptors (struct task_struct *task);
 
--- diff/arch/ia64/ia32/sys_ia32.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/ia64/ia32/sys_ia32.c	2004-04-21 10:45:33.539604704 +0100
@@ -1090,10 +1090,11 @@ asmlinkage long
 sys32_time (int *tloc)
 {
 	int i;
+	struct timeval tv;
+
+	do_gettimeofday(&tv);
+	i = tv.tv_sec;
 
-	/* SMP: This is fairly trivial. We grab CURRENT_TIME and
-	   stuff it to user space. No side effects */
-	i = get_seconds();
 	if (tloc) {
 		if (put_user(i, tloc))
 			i = -EFAULT;
--- diff/arch/ia64/kernel/acpi.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/ia64/kernel/acpi.c	2004-04-21 10:45:33.540604552 +0100
@@ -455,6 +455,7 @@ acpi_numa_arch_fixup (void)
 	for (i = 0; i < MAX_PXM_DOMAINS; i++) {
 		if (pxm_bit_test(i)) {
 			pxm_to_nid_map[i] = numnodes;
+			node_set_online(numnodes);
 			nid_to_pxm_map[numnodes++] = i;
 		}
 	}
@@ -506,6 +507,13 @@ acpi_numa_arch_fixup (void)
 }
 #endif /* CONFIG_ACPI_NUMA */
 
+unsigned int
+acpi_register_gsi (u32 gsi, int polarity, int trigger)
+{
+	return acpi_register_irq(gsi, polarity, trigger);
+}
+EXPORT_SYMBOL(acpi_register_gsi);
+
 static int __init
 acpi_parse_fadt (unsigned long phys_addr, unsigned long size)
 {
@@ -527,7 +535,7 @@ acpi_parse_fadt (unsigned long phys_addr
 	if (fadt->iapc_boot_arch & BAF_LEGACY_DEVICES)
 		acpi_legacy_devices = 1;
 
-	acpi_register_irq(fadt->sci_int, ACPI_ACTIVE_LOW, ACPI_LEVEL_SENSITIVE);
+	acpi_register_gsi(fadt->sci_int, ACPI_ACTIVE_LOW, ACPI_LEVEL_SENSITIVE);
 	return 0;
 }
 
--- diff/arch/ia64/kernel/efi.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/ia64/kernel/efi.c	2004-04-21 10:45:33.540604552 +0100
@@ -674,8 +674,7 @@ efi_get_iobase (void)
 	for (p = efi_map_start; p < efi_map_end; p += efi_desc_size) {
 		md = p;
 		if (md->type == EFI_MEMORY_MAPPED_IO_PORT_SPACE) {
-			/* paranoia attribute checking */
-			if (md->attribute == (EFI_MEMORY_UC | EFI_MEMORY_RUNTIME))
+			if (md->attribute & EFI_MEMORY_UC)
 				return md->phys_addr;
 		}
 	}
--- diff/arch/ia64/kernel/iosapic.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/ia64/kernel/iosapic.c	2004-04-21 10:45:33.541604400 +0100
@@ -172,7 +172,7 @@ gsi_to_irq (unsigned int gsi)
 static void
 set_rte (unsigned int vector, unsigned int dest, int mask)
 {
-	unsigned long pol, trigger, dmode;
+	unsigned long pol, trigger, dmode, flags;
 	u32 low32, high32;
 	char *addr;
 	int rte_index;
@@ -211,11 +211,15 @@ set_rte (unsigned int vector, unsigned i
 	/* dest contains both id and eid */
 	high32 = (dest << IOSAPIC_DEST_SHIFT);
 
-	writel(IOSAPIC_RTE_HIGH(rte_index), addr + IOSAPIC_REG_SELECT);
-	writel(high32, addr + IOSAPIC_WINDOW);
-	writel(IOSAPIC_RTE_LOW(rte_index), addr + IOSAPIC_REG_SELECT);
-	writel(low32, addr + IOSAPIC_WINDOW);
-	iosapic_intr_info[vector].low32 = low32;
+	spin_lock_irqsave(&iosapic_lock, flags);
+	{
+		writel(IOSAPIC_RTE_HIGH(rte_index), addr + IOSAPIC_REG_SELECT);
+		writel(high32, addr + IOSAPIC_WINDOW);
+		writel(IOSAPIC_RTE_LOW(rte_index), addr + IOSAPIC_REG_SELECT);
+		writel(low32, addr + IOSAPIC_WINDOW);
+		iosapic_intr_info[vector].low32 = low32;
+	}
+	spin_unlock_irqrestore(&iosapic_lock, flags);
 }
 
 static void
@@ -435,7 +439,7 @@ iosapic_reassign_vector (int vector)
 	    || iosapic_intr_info[vector].gsi_base || iosapic_intr_info[vector].dmode
 	    || iosapic_intr_info[vector].polarity || iosapic_intr_info[vector].trigger)
 	{
-		new_vector = ia64_alloc_vector();
+		new_vector = assign_irq_vector(AUTO_ASSIGN);
 		printk(KERN_INFO "Reassigning vector %d to %d\n", vector, new_vector);
 		memcpy(&iosapic_intr_info[new_vector], &iosapic_intr_info[vector],
 		       sizeof(struct iosapic_intr_info));
@@ -500,7 +504,7 @@ iosapic_register_intr (unsigned int gsi,
 
 	vector = gsi_to_vector(gsi);
 	if (vector < 0)
-		vector = ia64_alloc_vector();
+		vector = assign_irq_vector(AUTO_ASSIGN);
 
 	register_intr(gsi, vector, IOSAPIC_LOWEST_PRIORITY,
 		      polarity, trigger);
@@ -538,7 +542,7 @@ iosapic_register_platform_intr (u32 int_
 		delivery = IOSAPIC_PMI;
 		break;
 	      case ACPI_INTERRUPT_INIT:
-		vector = ia64_alloc_vector();
+		vector = assign_irq_vector(AUTO_ASSIGN);
 		delivery = IOSAPIC_INIT;
 		break;
 	      case ACPI_INTERRUPT_CPEI:
@@ -708,7 +712,7 @@ iosapic_parse_prt (void)
 				vector = isa_irq_to_vector(gsi);
 			else
 				/* new GSI; allocate a vector for it */
-				vector = ia64_alloc_vector();
+				vector = assign_irq_vector(AUTO_ASSIGN);
 
 			register_intr(gsi, vector, IOSAPIC_LOWEST_PRIORITY, IOSAPIC_POL_LOW,
 				      IOSAPIC_LEVEL);
--- diff/arch/ia64/kernel/irq_ia64.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/ia64/kernel/irq_ia64.c	2004-04-21 10:45:33.541604400 +0100
@@ -73,13 +73,13 @@ irq_exit (void)
 }
 
 int
-ia64_alloc_vector (void)
+assign_irq_vector (int irq)
 {
 	static int next_vector = IA64_FIRST_DEVICE_VECTOR;
 
 	if (next_vector > IA64_LAST_DEVICE_VECTOR)
 		/* XXX could look for sharable vectors instead of panic'ing... */
-		panic("ia64_alloc_vector: out of interrupt vectors!");
+		panic("assign_irq_vector: out of interrupt vectors!");
 	return next_vector++;
 }
 
--- diff/arch/ia64/kernel/perfmon.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/ia64/kernel/perfmon.c	2004-04-21 10:45:33.546603640 +0100
@@ -57,7 +57,6 @@
 #define PFM_CTX_LOADED		2	/* context is loaded onto a task */
 #define PFM_CTX_MASKED		3	/* context is loaded but monitoring is masked due to overflow */
 #define PFM_CTX_ZOMBIE		4	/* owner of the context is closing it */
-#define PFM_CTX_TERMINATED	5	/* the task the context was loaded onto is gone */
 
 #define PFM_INVALID_ACTIVATION	(~0UL)
 
@@ -473,6 +472,7 @@ typedef struct {
 	int	debug;		/* turn on/off debugging via syslog */
 	int	debug_ovfl;	/* turn on/off debug printk in overflow handler */
 	int	fastctxsw;	/* turn on/off fast (unsecure) ctxsw */
+	int	expert_mode;	/* turn on/off value checking */
 	int 	debug_pfm_read;
 } pfm_sysctl_t;
 
@@ -508,6 +508,7 @@ static ctl_table pfm_ctl_table[]={
 	{1, "debug", &pfm_sysctl.debug, sizeof(int), 0666, NULL, &proc_dointvec, NULL,},
 	{2, "debug_ovfl", &pfm_sysctl.debug_ovfl, sizeof(int), 0666, NULL, &proc_dointvec, NULL,},
 	{3, "fastctxsw", &pfm_sysctl.fastctxsw, sizeof(int), 0600, NULL, &proc_dointvec, NULL,},
+	{4, "expert_mode", &pfm_sysctl.expert_mode, sizeof(int), 0600, NULL, &proc_dointvec, NULL,},
 	{ 0, },
 };
 static ctl_table pfm_sysctl_dir[] = {
@@ -520,11 +521,8 @@ static ctl_table pfm_sysctl_root[] = {
 };
 static struct ctl_table_header *pfm_sysctl_header;
 
-static void pfm_vm_close(struct vm_area_struct * area);
-
-static struct vm_operations_struct pfm_vm_ops={
-	close: pfm_vm_close
-};
+static int pfm_context_unload(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs);
+static int pfm_flush(struct file *filp);
 
 #define pfm_get_cpu_var(v)		__ia64_per_cpu_var(v)
 #define pfm_get_cpu_data(a,b)		per_cpu(a, b)
@@ -697,6 +695,28 @@ pfm_unfreeze_pmu(void)
 	ia64_srlz_d();
 }
 
+static inline void
+pfm_restore_ibrs(unsigned long *ibrs, unsigned int nibrs)
+{
+	int i;
+
+	for (i=0; i < nibrs; i++) {
+		ia64_set_ibr(i, ibrs[i]);
+	}
+	ia64_srlz_i();
+}
+
+static inline void
+pfm_restore_dbrs(unsigned long *dbrs, unsigned int ndbrs)
+{
+	int i;
+
+	for (i=0; i < ndbrs; i++) {
+		ia64_set_dbr(i, dbrs[i]);
+	}
+	ia64_srlz_d();
+}
+
 /*
  * PMD[i] must be a counter. no check is made
  */
@@ -827,7 +847,10 @@ pfm_context_alloc(void)
 {
 	pfm_context_t *ctx;
 
-	/* allocate context descriptor */
+	/* 
+	 * allocate context descriptor 
+	 * must be able to free with interrupts disabled
+	 */
 	ctx = kmalloc(sizeof(pfm_context_t), GFP_KERNEL);
 	if (ctx) {
 		memset(ctx, 0, sizeof(pfm_context_t));
@@ -853,7 +876,7 @@ pfm_mask_monitoring(struct task_struct *
 	unsigned long mask, val, ovfl_mask;
 	int i;
 
-	DPRINT_ovfl(("[%d] masking monitoring for [%d]\n", current->pid, task->pid));
+	DPRINT_ovfl(("masking monitoring for [%d]\n", task->pid));
 
 	ovfl_mask = pmu_conf.ovfl_val;
 	/*
@@ -997,6 +1020,15 @@ pfm_restore_monitoring(struct task_struc
 	ia64_srlz_d();
 
 	/*
+	 * must restore DBR/IBR because could be modified while masked
+	 * XXX: need to optimize 
+	 */
+	if (ctx->ctx_fl_using_dbreg) {
+		pfm_restore_ibrs(ctx->ctx_ibrs, pmu_conf.num_ibrs);
+		pfm_restore_dbrs(ctx->ctx_dbrs, pmu_conf.num_dbrs);
+	}
+
+	/*
 	 * now restore PSR
 	 */
 	if (is_system && (PFM_CPUINFO_GET() & PFM_CPUINFO_DCR_PP)) {
@@ -1106,28 +1138,6 @@ pfm_restore_pmcs(unsigned long *pmcs, un
 	ia64_srlz_d();
 }
 
-static inline void
-pfm_restore_ibrs(unsigned long *ibrs, unsigned int nibrs)
-{
-	int i;
-
-	for (i=0; i < nibrs; i++) {
-		ia64_set_ibr(i, ibrs[i]);
-	}
-	ia64_srlz_i();
-}
-
-static inline void
-pfm_restore_dbrs(unsigned long *dbrs, unsigned int ndbrs)
-{
-	int i;
-
-	for (i=0; i < ndbrs; i++) {
-		ia64_set_dbr(i, dbrs[i]);
-	}
-	ia64_srlz_d();
-}
-
 static inline int
 pfm_uuid_cmp(pfm_uuid_t a, pfm_uuid_t b)
 {
@@ -1684,8 +1694,7 @@ pfm_fasync(int fd, struct file *filp, in
 
 	ret = pfm_do_fasync(fd, filp, ctx, on);
 
-	DPRINT(("pfm_fasync called by [%d] on ctx_fd=%d on=%d async_queue=%p ret=%d\n",
-		current->pid,
+	DPRINT(("pfm_fasync called on ctx_fd=%d on=%d async_queue=%p ret=%d\n",
 		fd,
 		on,
 		ctx->ctx_async_queue, ret));
@@ -1707,6 +1716,8 @@ pfm_syswide_force_stop(void *info)
 	pfm_context_t   *ctx = (pfm_context_t *)info;
 	struct pt_regs *regs = ia64_task_regs(current);
 	struct task_struct *owner;
+	unsigned long flags;
+	int ret;
 
 	if (ctx->ctx_cpu != smp_processor_id()) {
 		printk(KERN_ERR "perfmon: pfm_syswide_force_stop for CPU%d  but on CPU%d\n",
@@ -1728,27 +1739,23 @@ pfm_syswide_force_stop(void *info)
 		return;
 	}
 
-	DPRINT(("[%d] on CPU%d forcing system wide stop for [%d]\n", current->pid, smp_processor_id(), ctx->ctx_task->pid));
+	DPRINT(("on CPU%d forcing system wide stop for [%d]\n", smp_processor_id(), ctx->ctx_task->pid));	
 	/*
-	 * Update local PMU
+	 * the context is already protected in pfm_close(), we simply
+	 * need to mask interrupts to avoid a PMU interrupt race on
+	 * this CPU
 	 */
-	ia64_setreg(_IA64_REG_CR_DCR, ia64_getreg(_IA64_REG_CR_DCR) & ~IA64_DCR_PP);
-	ia64_srlz_i();
-	/*
-	 * update local cpuinfo
-	 */
-	PFM_CPUINFO_CLEAR(PFM_CPUINFO_DCR_PP);
-	PFM_CPUINFO_CLEAR(PFM_CPUINFO_SYST_WIDE);
-	PFM_CPUINFO_CLEAR(PFM_CPUINFO_EXCL_IDLE);
+	local_irq_save(flags);
 
-	pfm_clear_psr_pp();
+	ret = pfm_context_unload(ctx, NULL, 0, regs);
+	if (ret) {
+		DPRINT(("context_unload returned %d\n", ret));
+	}
 
 	/*
-	 * also stop monitoring in the local interrupted task
+	 * unmask interrupts, PMU interrupts are now spurious here
 	 */
-	ia64_psr(regs)->pp = 0;
-
-	SET_PMU_OWNER(NULL, NULL);
+	local_irq_restore(flags);
 }
 
 static void
@@ -1756,59 +1763,38 @@ pfm_syswide_cleanup_other_cpu(pfm_contex
 {
 	int ret;
 
-	DPRINT(("[%d] calling CPU%d for cleanup\n", current->pid, ctx->ctx_cpu));
+	DPRINT(("calling CPU%d for cleanup\n", ctx->ctx_cpu));
 	ret = smp_call_function_single(ctx->ctx_cpu, pfm_syswide_force_stop, ctx, 0, 1);
-	DPRINT(("[%d] called CPU%d for cleanup ret=%d\n", current->pid, ctx->ctx_cpu, ret));
+	DPRINT(("called CPU%d for cleanup ret=%d\n", ctx->ctx_cpu, ret));
 }
 #endif /* CONFIG_SMP */
 
 /*
- * called either on explicit close() or from exit_files().
- *
- * IMPORTANT: we get called ONLY when the refcnt on the file gets to zero (fput()),i.e,
- * last task to access the file. Nobody else can access the file at this point.
- *
- * When called from exit_files(), the VMA has been freed because exit_mm()
- * is executed before exit_files().
- *
- * When called from exit_files(), the current task is not yet ZOMBIE but we will
- * flush the PMU state to the context. This means * that when we see the context
- * state as TERMINATED we are guranteed to have the latest PMU state available,
- * even if the task itself is in the middle of being ctxsw out.
+ * called for each close(). Partially free resources.
+ * When caller is self-monitoring, the context is unloaded.
  */
-static int pfm_context_unload(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs);
-
 static int
-pfm_close(struct inode *inode, struct file *filp)
+pfm_flush(struct file *filp)
 {
 	pfm_context_t *ctx;
 	struct task_struct *task;
 	struct pt_regs *regs;
-  	DECLARE_WAITQUEUE(wait, current);
 	unsigned long flags;
 	unsigned long smpl_buf_size = 0UL;
 	void *smpl_buf_vaddr = NULL;
-	void *smpl_buf_addr = NULL;
-	int free_possible = 1;
 	int state, is_system;
 
-	DPRINT(("pfm_close called private=%p\n", filp->private_data));
-
-	if (!inode) {
-		printk(KERN_ERR "pfm_close: NULL inode\n");
-		return 0;
-	}
-
 	if (PFM_IS_FILE(filp) == 0) {
-		DPRINT(("bad magic for [%d]\n", current->pid));
+		DPRINT(("bad magic for\n"));
 		return -EBADF;
 	}
 
 	ctx = (pfm_context_t *)filp->private_data;
 	if (ctx == NULL) {
-		printk(KERN_ERR "perfmon: pfm_close: NULL ctx [%d]\n", current->pid);
+		printk(KERN_ERR "perfmon: pfm_flush: NULL ctx [%d]\n", current->pid);
 		return -EBADF;
 	}
+
 	/*
 	 * remove our file from the async queue, if we use this mode.
 	 * This can be done without the context being protected. We come
@@ -1823,7 +1809,7 @@ pfm_close(struct inode *inode, struct fi
 	 * signal will be sent. In both case, we are safe
 	 */
 	if (filp->f_flags & FASYNC) {
-		DPRINT(("[%d] cleaning up async_queue=%p\n", current->pid, ctx->ctx_async_queue));
+		DPRINT(("cleaning up async_queue=%p\n", ctx->ctx_async_queue));
 		pfm_do_fasync (-1, filp, ctx, 0);
 	}
 
@@ -1833,23 +1819,18 @@ pfm_close(struct inode *inode, struct fi
 	is_system = ctx->ctx_fl_system;
 
 	task = PFM_CTX_TASK(ctx);
-
-
 	regs = ia64_task_regs(task);
 
-	DPRINT(("[%d] ctx_state=%d is_current=%d\n", 
-		current->pid, state,
+	DPRINT(("ctx_state=%d is_current=%d\n",
+		state,
 		task == current ? 1 : 0));
 
-	if (state == PFM_CTX_UNLOADED || state == PFM_CTX_TERMINATED) {
-		goto doit;
-	}
+	/*
+	 * if state == UNLOADED, then task is NULL
+	 */
 
 	/*
-	 * context still loaded/masked and self monitoring,
-	 * we stop/unload and we destroy right here
-	 *
-	 * We always go here for system-wide sessions
+	 * we must stop and unload because we are losing access to the context.
 	 */
 	if (task == current) {
 #ifdef CONFIG_SMP
@@ -1862,46 +1843,134 @@ pfm_close(struct inode *inode, struct fi
 		 */
 		if (is_system && ctx->ctx_cpu != smp_processor_id()) {
 
-			DPRINT(("[%d] should be running on CPU%d\n", current->pid, ctx->ctx_cpu));
-
-			UNPROTECT_CTX(ctx, flags);
+			DPRINT(("should be running on CPU%d\n", ctx->ctx_cpu));
+			/*
+			 * keep context protected but unmask interrupt for IPI
+			 */
+			local_irq_restore(flags);
 
 			pfm_syswide_cleanup_other_cpu(ctx);
 
-			PROTECT_CTX(ctx, flags);
-
 			/*
-			 * short circuit pfm_context_unload();
+			 * restore interrupt masking
 			 */
-			task->thread.pfm_context = NULL;
-			ctx->ctx_task            = NULL;
-
-			ctx->ctx_state = state = PFM_CTX_UNLOADED;
-
-			pfm_unreserve_session(ctx, 1 , ctx->ctx_cpu);
+			local_irq_save(flags);
 
+			/*
+			 * context is unloaded at this point
+			 */
 		} else
 #endif /* CONFIG_SMP */
 		{
 
-			DPRINT(("forcing unload on [%d]\n", current->pid));
+			DPRINT(("forcing unload\n"));
 			/*
 		 	* stop and unload, returning with state UNLOADED
 		 	* and session unreserved.
 		 	*/
 			pfm_context_unload(ctx, NULL, 0, regs);
 
-			ctx->ctx_state = PFM_CTX_TERMINATED;
-
-			DPRINT(("[%d] ctx_state=%d\n", current->pid, ctx->ctx_state));
+			DPRINT(("ctx_state=%d\n", ctx->ctx_state));
 		}
-		goto doit;
 	}
 
 	/*
+	 * remove virtual mapping, if any, for the calling task.
+	 * cannot reset ctx field until last user is calling close().
+	 *
+	 * ctx_smpl_vaddr must never be cleared because it is needed
+	 * by every task with access to the context
+	 *
+	 * When called from do_exit(), the mm context is gone already, therefore
+	 * mm is NULL, i.e., the VMA is already gone  and we do not have to
+	 * do anything here
+	 */
+	if (ctx->ctx_smpl_vaddr && current->mm) {
+		smpl_buf_vaddr = ctx->ctx_smpl_vaddr;
+		smpl_buf_size  = ctx->ctx_smpl_size;
+	}
+
+	UNPROTECT_CTX(ctx, flags);
+
+	/*
+	 * if there was a mapping, then we systematically remove it
+	 * at this point. Cannot be done inside critical section
+	 * because some VM function reenables interrupts.
+	 *
+	 */
+	if (smpl_buf_vaddr) pfm_remove_smpl_mapping(current, smpl_buf_vaddr, smpl_buf_size);
+
+	return 0;
+}
+/*
+ * called either on explicit close() or from exit_files(). 
+ * Only the LAST user of the file gets to this point, i.e., it is
+ * called only ONCE.
+ *
+ * IMPORTANT: we get called ONLY when the refcnt on the file gets to zero 
+ * (fput()),i.e, last task to access the file. Nobody else can access the 
+ * file at this point.
+ *
+ * When called from exit_files(), the VMA has been freed because exit_mm()
+ * is executed before exit_files().
+ *
+ * When called from exit_files(), the current task is not yet ZOMBIE but we
+ * flush the PMU state to the context. 
+ */
+static int
+pfm_close(struct inode *inode, struct file *filp)
+{
+	pfm_context_t *ctx;
+	struct task_struct *task;
+	struct pt_regs *regs;
+  	DECLARE_WAITQUEUE(wait, current);
+	unsigned long flags;
+	unsigned long smpl_buf_size = 0UL;
+	void *smpl_buf_addr = NULL;
+	int free_possible = 1;
+	int state, is_system;
+
+	DPRINT(("pfm_close called private=%p\n", filp->private_data));
+
+	if (PFM_IS_FILE(filp) == 0) {
+		DPRINT(("bad magic\n"));
+		return -EBADF;
+	}
+	
+	ctx = (pfm_context_t *)filp->private_data;
+	if (ctx == NULL) {
+		printk(KERN_ERR "perfmon: pfm_close: NULL ctx [%d]\n", current->pid);
+		return -EBADF;
+	}
+
+	PROTECT_CTX(ctx, flags);
+
+	state     = ctx->ctx_state;
+	is_system = ctx->ctx_fl_system;
+
+	task = PFM_CTX_TASK(ctx);
+	regs = ia64_task_regs(task);
+
+	DPRINT(("ctx_state=%d is_current=%d\n", 
+		state,
+		task == current ? 1 : 0));
+
+	/*
+	 * if task == current, then pfm_flush() unloaded the context
+	 */
+	if (state == PFM_CTX_UNLOADED) goto doit;
+
+	/*
+	 * context is loaded/masked and task != current, we need to
+	 * either force an unload or go zombie
+	 */
+
+	/*
 	 * The task is currently blocked or will block after an overflow.
 	 * we must force it to wakeup to get out of the
-	 * MASKED state and transition to the unloaded state by itself
+	 * MASKED state and transition to the unloaded state by itself.
+	 *
+	 * This situation is only possible for per-task mode
 	 */
 	if (state == PFM_CTX_MASKED && CTX_OVFL_NOBLOCK(ctx) == 0) {
 
@@ -1911,7 +1980,7 @@ pfm_close(struct inode *inode, struct fi
 		 *
 		 * We cannot use the ZOMBIE state, because it is checked
 		 * by pfm_load_regs() which is called upon wakeup from down().
-		 * In such cas, it would free the context and then we would
+		 * In such case, it would free the context and then we would
 		 * return to pfm_handle_work() which would access the
 		 * stale context. Instead, we set a flag invisible to pfm_load_regs()
 		 * but visible to pfm_handle_work().
@@ -1926,7 +1995,7 @@ pfm_close(struct inode *inode, struct fi
 		 */
 		up(&ctx->ctx_restart_sem);
 
-		DPRINT(("waking up ctx_state=%d for [%d]\n", state, current->pid));
+		DPRINT(("waking up ctx_state=%d\n", state));
 
 		/*
 		 * put ourself to sleep waiting for the other
@@ -1956,11 +2025,11 @@ pfm_close(struct inode *inode, struct fi
   		set_current_state(TASK_RUNNING);
 
 		/*
-		 * context is terminated at this point
+		 * context is unloaded at this point
 		 */
-		DPRINT(("after zombie wakeup ctx_state=%d for [%d]\n", state, current->pid));
+		DPRINT(("after zombie wakeup ctx_state=%d for\n", state));
 	}
-	else {
+	else if (task != current) {
 #ifdef CONFIG_SMP
 		/*
 	 	 * switch context to zombie state
@@ -1978,8 +2047,7 @@ pfm_close(struct inode *inode, struct fi
 #endif
 	}
 
-doit:	/* cannot assume task is defined from now on */
-
+doit:
 	/* reload state, may have changed during  opening of critical section */
 	state = ctx->ctx_state;
 
@@ -1987,18 +2055,9 @@ doit:	/* cannot assume task is defined f
 	 * the context is still attached to a task (possibly current)
 	 * we cannot destroy it right now
 	 */
-	/*
-	 * remove virtual mapping, if any. will be NULL when
-	 * called from exit_files().
-	 */
-	if (ctx->ctx_smpl_vaddr) {
-		smpl_buf_vaddr = ctx->ctx_smpl_vaddr;
-		smpl_buf_size  = ctx->ctx_smpl_size;
-		ctx->ctx_smpl_vaddr = NULL;
-	}
 
 	/*
-	 * we must fre the sampling buffer right here because
+	 * we must free the sampling buffer right here because
 	 * we cannot rely on it being cleaned up later by the
 	 * monitored task. It is not possible to free vmalloc'ed
 	 * memory in pfm_load_regs(). Instead, we remove the buffer
@@ -2011,21 +2070,19 @@ doit:	/* cannot assume task is defined f
 		smpl_buf_size = ctx->ctx_smpl_size;
 		/* no more sampling */
 		ctx->ctx_smpl_hdr = NULL;
+		ctx->ctx_fl_is_sampling = 0;
 	}
 
-	DPRINT(("[%d] ctx_state=%d free_possible=%d vaddr=%p addr=%p size=%lu\n",
-		current->pid,
+	DPRINT(("ctx_state=%d free_possible=%d addr=%p size=%lu\n",
 		state,
 		free_possible,
-		smpl_buf_vaddr,
 		smpl_buf_addr,
 		smpl_buf_size));
 
 	if (smpl_buf_addr) pfm_exit_smpl_buffer(ctx->ctx_buf_fmt);
 
 	/*
-	 * UNLOADED and TERMINATED mean that the session has already been
-	 * unreserved.
+	 * UNLOADED that the session has already been unreserved.
 	 */
 	if (state == PFM_CTX_ZOMBIE) {
 		pfm_unreserve_session(ctx, ctx->ctx_fl_system , ctx->ctx_cpu);
@@ -2047,14 +2104,9 @@ doit:	/* cannot assume task is defined f
 	UNPROTECT_CTX(ctx, flags);
 
 	/*
-	 * if there was a mapping, then we systematically remove it
-	 * at this point. Cannot be done inside critical section
-	 * because some VM function reenables interrupts.
-	 *
 	 * All memory free operations (especially for vmalloc'ed memory)
 	 * MUST be done with interrupts ENABLED.
 	 */
-	if (smpl_buf_vaddr) pfm_remove_smpl_mapping(current, smpl_buf_vaddr, smpl_buf_size);
 	if (smpl_buf_addr)  pfm_rvfree(smpl_buf_addr, smpl_buf_size);
 
 	/*
@@ -2072,6 +2124,8 @@ pfm_no_open(struct inode *irrelevant, st
 	return -ENXIO;
 }
 
+
+
 static struct file_operations pfm_file_ops = {
 	.llseek   = pfm_lseek,
 	.read     = pfm_read,
@@ -2080,7 +2134,8 @@ static struct file_operations pfm_file_o
 	.ioctl    = pfm_ioctl,
 	.open     = pfm_no_open,	/* special open code to disallow open via /proc */
 	.fasync   = pfm_fasync,
-	.release  = pfm_close
+	.release  = pfm_close,
+	.flush	  = pfm_flush
 };
 
 static int
@@ -2088,6 +2143,7 @@ pfmfs_delete_dentry(struct dentry *dentr
 {
 	return 1;
 }
+
 static struct dentry_operations pfmfs_dentry_operations = {
 	.d_delete = pfmfs_delete_dentry,
 };
@@ -2172,27 +2228,6 @@ pfm_free_fd(int fd, struct file *file)
 	put_unused_fd(fd);
 }
 
-/*
- * This function gets called from mm/mmap.c:exit_mmap() only when there is a sampling buffer
- * attached to the context AND the current task has a mapping for it, i.e., it is the original
- * creator of the context.
- *
- * This function is used to remember the fact that the vma describing the sampling buffer
- * has now been removed. It can only be called when no other tasks share the same mm context.
- *
- */
-static void
-pfm_vm_close(struct vm_area_struct *vma)
-{
-	pfm_context_t *ctx = (pfm_context_t *)vma->vm_private_data;
-	unsigned long flags;
-
-	PROTECT_CTX(ctx, flags);
-	ctx->ctx_smpl_vaddr = NULL;
-	UNPROTECT_CTX(ctx, flags);
-	DPRINT(("[%d] clearing vaddr for ctx %p\n", current->pid, ctx));
-}
-
 static int
 pfm_remap_buffer(struct vm_area_struct *vma, unsigned long buf, unsigned long addr, unsigned long size)
 {
@@ -2252,7 +2287,7 @@ pfm_smpl_buffer_alloc(struct task_struct
 		return -ENOMEM;
 	}
 
-	DPRINT(("[%d]  smpl_buf @%p\n", current->pid, smpl_buf));
+	DPRINT(("smpl_buf @%p\n", smpl_buf));
 
 	/* allocate vma */
 	vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
@@ -2268,12 +2303,12 @@ pfm_smpl_buffer_alloc(struct task_struct
 	 * what we want.
 	 */
 	vma->vm_mm	     = mm;
-	vma->vm_flags	     = VM_READ| VM_MAYREAD |VM_RESERVED|VM_DONTCOPY;
+	vma->vm_flags	     = VM_READ| VM_MAYREAD |VM_RESERVED;
 	vma->vm_page_prot    = PAGE_READONLY; /* XXX may need to change */
-	vma->vm_ops	     = &pfm_vm_ops;
+	vma->vm_ops	     = NULL;
 	vma->vm_pgoff	     = 0;
 	vma->vm_file	     = NULL;
-	vma->vm_private_data = ctx;	/* information needed by the pfm_vm_close() function */
+	vma->vm_private_data = NULL; 
 
 	/*
 	 * Now we have everything we need and we can initialize
@@ -2342,8 +2377,7 @@ static int
 pfm_bad_permissions(struct task_struct *task)
 {
 	/* inspired by ptrace_attach() */
-	DPRINT(("[%d] cur: uid=%d gid=%d task: euid=%d suid=%d uid=%d egid=%d sgid=%d\n",
-		current->pid,
+	DPRINT(("cur: uid=%d gid=%d task: euid=%d suid=%d uid=%d egid=%d sgid=%d\n",
 		current->uid,
 		current->gid,
 		task->euid,
@@ -2532,11 +2566,11 @@ pfm_task_incompatible(pfm_context_t *ctx
 	 * no kernel task or task not owner by caller
 	 */
 	if (task->mm == NULL) {
-		DPRINT(("[%d] task [%d] has not memory context (kernel thread)\n", current->pid, task->pid));
+		DPRINT(("task [%d] has not memory context (kernel thread)\n", task->pid));
 		return -EPERM;
 	}
 	if (pfm_bad_permissions(task)) {
-		DPRINT(("[%d] no permission to attach to  [%d]\n", current->pid, task->pid));
+		DPRINT(("no permission to attach to  [%d]\n", task->pid));
 		return -EPERM;
 	}
 	/*
@@ -2548,7 +2582,7 @@ pfm_task_incompatible(pfm_context_t *ctx
 	}
 
 	if (task->state == TASK_ZOMBIE) {
-		DPRINT(("[%d] cannot attach to  zombie task [%d]\n", current->pid, task->pid));
+		DPRINT(("cannot attach to  zombie task [%d]\n", task->pid));
 		return -EBUSY;
 	}
 
@@ -2558,7 +2592,7 @@ pfm_task_incompatible(pfm_context_t *ctx
 	if (task == current) return 0;
 
 	if (task->state != TASK_STOPPED) {
-		DPRINT(("[%d] cannot attach to non-stopped task [%d] state=%ld\n", current->pid, task->pid, task->state));
+		DPRINT(("cannot attach to non-stopped task [%d] state=%ld\n", task->pid, task->state));
 		return -EBUSY;
 	}
 	/*
@@ -2835,7 +2869,7 @@ pfm_write_pmcs(pfm_context_t *ctx, void 
 	task      = ctx->ctx_task;
 	impl_pmds = pmu_conf.impl_pmds[0];
 
-	if (state == PFM_CTX_TERMINATED || state == PFM_CTX_ZOMBIE) return -EINVAL;
+	if (state == PFM_CTX_ZOMBIE) return -EINVAL;
 
 	if (is_loaded) {
 		thread = &task->thread;
@@ -2845,7 +2879,7 @@ pfm_write_pmcs(pfm_context_t *ctx, void 
 		 * It does not have to be the owner (ctx_task) of the context per se.
 		 */
 		if (is_system && ctx->ctx_cpu != smp_processor_id()) {
-			DPRINT(("[%d] should be running on CPU%d\n", current->pid, ctx->ctx_cpu));
+			DPRINT(("should be running on CPU%d\n", ctx->ctx_cpu));
 			return -EBUSY;
 		}
 		can_access_pmu = GET_PMU_OWNER() == task || is_system ? 1 : 0;
@@ -2928,7 +2962,7 @@ pfm_write_pmcs(pfm_context_t *ctx, void 
 		/*
 		 * execute write checker, if any
 		 */
-		if (PMC_WR_FUNC(cnum)) {
+		if (pfm_sysctl.expert_mode == 0 && PMC_WR_FUNC(cnum)) {
 			ret = PMC_WR_FUNC(cnum)(task, ctx, cnum, &value, regs);
 			if (ret) goto error;
 			ret = -EINVAL;
@@ -3072,7 +3106,7 @@ pfm_write_pmds(pfm_context_t *ctx, void 
 	ovfl_mask = pmu_conf.ovfl_val;
 	task      = ctx->ctx_task;
 
-	if (unlikely(state == PFM_CTX_TERMINATED || state == PFM_CTX_ZOMBIE)) return -EINVAL;
+	if (unlikely(state == PFM_CTX_ZOMBIE)) return -EINVAL;
 
 	/*
 	 * on both UP and SMP, we can only write to the PMC when the task is
@@ -3086,7 +3120,7 @@ pfm_write_pmds(pfm_context_t *ctx, void 
 		 * It does not have to be the owner (ctx_task) of the context per se.
 		 */
 		if (unlikely(is_system && ctx->ctx_cpu != smp_processor_id())) {
-			DPRINT(("[%d] should be running on CPU%d\n", current->pid, ctx->ctx_cpu));
+			DPRINT(("should be running on CPU%d\n", ctx->ctx_cpu));
 			return -EBUSY;
 		}
 		can_access_pmu = GET_PMU_OWNER() == task || is_system ? 1 : 0;
@@ -3106,7 +3140,7 @@ pfm_write_pmds(pfm_context_t *ctx, void 
 		/*
 		 * execute write checker, if any
 		 */
-		if (PMD_WR_FUNC(cnum)) {
+		if (pfm_sysctl.expert_mode == 0 && PMD_WR_FUNC(cnum)) {
 			unsigned long v = value;
 
 			ret = PMD_WR_FUNC(cnum)(task, ctx, cnum, &v, regs);
@@ -3279,7 +3313,7 @@ pfm_read_pmds(pfm_context_t *ctx, void *
 		 * It does not have to be the owner (ctx_task) of the context per se.
 		 */
 		if (unlikely(is_system && ctx->ctx_cpu != smp_processor_id())) {
-			DPRINT(("[%d] should be running on CPU%d\n", current->pid, ctx->ctx_cpu));
+			DPRINT(("should be running on CPU%d\n", ctx->ctx_cpu));
 			return -EBUSY;
 		}
 		/*
@@ -3347,7 +3381,7 @@ pfm_read_pmds(pfm_context_t *ctx, void *
 		/*
 		 * execute read checker, if any
 		 */
-		if (unlikely(PMD_RD_FUNC(cnum))) {
+		if (unlikely(pfm_sysctl.expert_mode == 0 && PMD_RD_FUNC(cnum))) {
 			unsigned long v = val;
 			ret = PMD_RD_FUNC(cnum)(ctx->ctx_task, ctx, cnum, &v, regs);
 			if (ret) goto error;
@@ -3376,14 +3410,14 @@ error:
 	return ret;
 }
 
-long
-pfm_mod_write_pmcs(struct task_struct *task, pfarg_reg_t *req, unsigned int nreq, struct pt_regs *regs)
+int
+pfm_mod_write_pmcs(struct task_struct *task, void *req, unsigned int nreq, struct pt_regs *regs)
 {
 	pfm_context_t *ctx;
 
-	if (task == NULL || req == NULL) return -EINVAL;
+	if (req == NULL) return -EINVAL;
 
- 	ctx = task->thread.pfm_context;
+ 	ctx = GET_PMU_CTX();
 
 	if (ctx == NULL) return -EINVAL;
 
@@ -3391,20 +3425,19 @@ pfm_mod_write_pmcs(struct task_struct *t
 	 * for now limit to current task, which is enough when calling
 	 * from overflow handler
 	 */
-	if (task != current) return -EBUSY;
+	if (task != current && ctx->ctx_fl_system == 0) return -EBUSY;
 
 	return pfm_write_pmcs(ctx, req, nreq, regs);
 }
 EXPORT_SYMBOL(pfm_mod_write_pmcs);
 
-long
-pfm_mod_read_pmds(struct task_struct *task, pfarg_reg_t *req, unsigned int nreq, struct pt_regs *regs)
+int
+pfm_mod_read_pmds(struct task_struct *task, void *req, unsigned int nreq, struct pt_regs *regs)
 {
 	pfm_context_t *ctx;
 
-	if (task == NULL || req == NULL) return -EINVAL;
+	if (req == NULL) return -EINVAL;
 
- 	//ctx = task->thread.pfm_context;
  	ctx = GET_PMU_CTX();
 
 	if (ctx == NULL) return -EINVAL;
@@ -3419,48 +3452,6 @@ pfm_mod_read_pmds(struct task_struct *ta
 }
 EXPORT_SYMBOL(pfm_mod_read_pmds);
 
-long
-pfm_mod_fast_read_pmds(struct task_struct *task, unsigned long mask[4], unsigned long *addr, struct pt_regs *regs)
-{
-	pfm_context_t *ctx;
-	unsigned long m, val;
-	unsigned int j;
-
-	if (task == NULL || addr == NULL) return -EINVAL;
-
- 	//ctx = task->thread.pfm_context;
- 	ctx = GET_PMU_CTX();
-
-	if (ctx == NULL) return -EINVAL;
-
-	/*
-	 * for now limit to current task, which is enough when calling
-	 * from overflow handler
-	 */
-	if (task != current && ctx->ctx_fl_system == 0) return -EBUSY;
-
-	m = mask[0];
-	for (j=0; m; m >>=1, j++) {
-
-		if ((m & 0x1) == 0) continue;
-
-		if (!(PMD_IS_IMPL(j)  && CTX_IS_USED_PMD(ctx, j)) ) return -EINVAL;
-
-		if (PMD_IS_COUNTING(j)) {
-			val = pfm_read_soft_counter(ctx, j);
-		} else {
-			val = ia64_get_pmd(j);
-		}
-
-		*addr++ = val;
-
-		/* XXX: should call read checker routine? */
-		DPRINT(("single_read_pmd[%u]=0x%lx\n", j, val));
-	}
-	return 0;
-}
-EXPORT_SYMBOL(pfm_mod_fast_read_pmds);
-
 /*
  * Only call this function when a process it trying to
  * write the debug registers (reading is always allowed)
@@ -3565,9 +3556,6 @@ pfm_restart(pfm_context_t *ctx, void *ar
 		case PFM_CTX_ZOMBIE:
 			DPRINT(("invalid state=%d\n", state));
 			return -EBUSY;
-		case PFM_CTX_TERMINATED:
-			DPRINT(("context is terminated, nothing to do\n"));
-			return 0;
 		default:
 			DPRINT(("state=%d, cannot operate (no active_restart handler)\n", state));
 			return -EINVAL;
@@ -3579,7 +3567,7 @@ pfm_restart(pfm_context_t *ctx, void *ar
  	 * It does not have to be the owner (ctx_task) of the context per se.
  	 */
 	if (is_system && ctx->ctx_cpu != smp_processor_id()) {
-		DPRINT(("[%d] should be running on CPU%d\n", current->pid, ctx->ctx_cpu));
+		DPRINT(("should be running on CPU%d\n", ctx->ctx_cpu));
 		return -EBUSY;
 	}
 
@@ -3739,7 +3727,7 @@ pfm_write_ibr_dbr(int mode, pfm_context_
 	is_system = ctx->ctx_fl_system;
 	task      = ctx->ctx_task;
 
-	if (state == PFM_CTX_TERMINATED || state == PFM_CTX_ZOMBIE) return -EINVAL;
+	if (state == PFM_CTX_ZOMBIE) return -EINVAL;
 
 	/*
 	 * on both UP and SMP, we can only write to the PMC when the task is
@@ -3753,7 +3741,7 @@ pfm_write_ibr_dbr(int mode, pfm_context_
 		 * It does not have to be the owner (ctx_task) of the context per se.
 		 */
 		if (unlikely(is_system && ctx->ctx_cpu != smp_processor_id())) {
-			DPRINT(("[%d] should be running on CPU%d\n", current->pid, ctx->ctx_cpu));
+			DPRINT(("should be running on CPU%d\n", ctx->ctx_cpu));
 			return -EBUSY;
 		}
 		can_access_pmu = GET_PMU_OWNER() == task || is_system ? 1 : 0;
@@ -3920,6 +3908,49 @@ pfm_write_dbrs(pfm_context_t *ctx, void 
 	return pfm_write_ibr_dbr(PFM_DATA_RR, ctx, arg, count, regs);
 }
 
+int
+pfm_mod_write_ibrs(struct task_struct *task, void *req, unsigned int nreq, struct pt_regs *regs)
+{
+	pfm_context_t *ctx;
+
+	if (req == NULL) return -EINVAL;
+
+ 	ctx = GET_PMU_CTX();
+
+	if (ctx == NULL) return -EINVAL;
+
+	/*
+	 * for now limit to current task, which is enough when calling
+	 * from overflow handler
+	 */
+	if (task != current && ctx->ctx_fl_system == 0) return -EBUSY;
+
+	return pfm_write_ibrs(ctx, req, nreq, regs);
+}
+EXPORT_SYMBOL(pfm_mod_write_ibrs);
+
+int
+pfm_mod_write_dbrs(struct task_struct *task, void *req, unsigned int nreq, struct pt_regs *regs)
+{
+	pfm_context_t *ctx;
+
+	if (req == NULL) return -EINVAL;
+
+ 	ctx = GET_PMU_CTX();
+
+	if (ctx == NULL) return -EINVAL;
+
+	/*
+	 * for now limit to current task, which is enough when calling
+	 * from overflow handler
+	 */
+	if (task != current && ctx->ctx_fl_system == 0) return -EBUSY;
+
+	return pfm_write_dbrs(ctx, req, nreq, regs);
+}
+EXPORT_SYMBOL(pfm_mod_write_dbrs);
+
+
 static int
 pfm_get_features(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
 {
@@ -3947,11 +3978,10 @@ pfm_stop(pfm_context_t *ctx, void *arg, 
  	 * It does not have to be the owner (ctx_task) of the context per se.
  	 */
 	if (is_system && ctx->ctx_cpu != smp_processor_id()) {
-		DPRINT(("[%d] should be running on CPU%d\n", current->pid, ctx->ctx_cpu));
+		DPRINT(("should be running on CPU%d\n", ctx->ctx_cpu));
 		return -EBUSY;
 	}
-	DPRINT(("current [%d] task [%d] ctx_state=%d is_system=%d\n",
-		current->pid,
+	DPRINT(("task [%d] ctx_state=%d is_system=%d\n",
 		PFM_CTX_TASK(ctx)->pid,
 		state,
 		is_system));
@@ -4010,7 +4040,7 @@ pfm_stop(pfm_context_t *ctx, void *arg, 
 		 * monitoring disabled in kernel at next reschedule
 		 */
 		ctx->ctx_saved_psr_up = 0;
-		DPRINT(("pfm_stop: current [%d] task=[%d]\n", current->pid, task->pid));
+		DPRINT(("task=[%d]\n", task->pid));
 	}
 	return 0;
 }
@@ -4033,7 +4063,7 @@ pfm_start(pfm_context_t *ctx, void *arg,
  	 * It does not have to be the owner (ctx_task) of the context per se.
  	 */
 	if (is_system && ctx->ctx_cpu != smp_processor_id()) {
-		DPRINT(("[%d] should be running on CPU%d\n", current->pid, ctx->ctx_cpu));
+		DPRINT(("should be running on CPU%d\n", ctx->ctx_cpu));
 		return -EBUSY;
 	}
 
@@ -4167,9 +4197,8 @@ pfm_context_load(pfm_context_t *ctx, voi
 	/*
 	 * can only load from unloaded or terminated state
 	 */
-	if (state != PFM_CTX_UNLOADED && state != PFM_CTX_TERMINATED) {
-		DPRINT(("[%d] cannot load to [%d], invalid ctx_state=%d\n",
-			current->pid,
+	if (state != PFM_CTX_UNLOADED) {
+		DPRINT(("cannot load to [%d], invalid ctx_state=%d\n",
 			req->load_pid,
 			ctx->ctx_state));
 		return -EINVAL;
@@ -4178,7 +4207,7 @@ pfm_context_load(pfm_context_t *ctx, voi
 	DPRINT(("load_pid [%d] using_dbreg=%d\n", req->load_pid, ctx->ctx_fl_using_dbreg));
 
 	if (CTX_OVFL_NOBLOCK(ctx) == 0 && req->load_pid == current->pid) {
-		DPRINT(("cannot use blocking mode on self for [%d]\n", current->pid));
+		DPRINT(("cannot use blocking mode on self\n"));
 		return -EINVAL;
 	}
 
@@ -4194,8 +4223,7 @@ pfm_context_load(pfm_context_t *ctx, voi
 	 * system wide is self monitoring only
 	 */
 	if (is_system && task != current) {
-		DPRINT(("system wide is self monitoring only current=%d load_pid=%d\n",
-			current->pid,
+		DPRINT(("system wide is self monitoring only load_pid=%d\n",
 			req->load_pid));
 		goto error;
 	}
@@ -4264,8 +4292,7 @@ pfm_context_load(pfm_context_t *ctx, voi
 	 *
 	 * XXX: needs to be atomic
 	 */
-	DPRINT(("[%d] before cmpxchg() old_ctx=%p new_ctx=%p\n",
-		current->pid, 
+	DPRINT(("before cmpxchg() old_ctx=%p new_ctx=%p\n",
 		thread->pfm_context, ctx));
 
 	old = ia64_cmpxchg(acq, &thread->pfm_context, NULL, ctx, sizeof(pfm_context_t *));
@@ -4409,19 +4436,19 @@ pfm_context_unload(pfm_context_t *ctx, v
 {
 	struct task_struct *task = PFM_CTX_TASK(ctx);
 	struct pt_regs *tregs;
-	int state, is_system;
+	int prev_state, is_system;
 	int ret;
 
 	DPRINT(("ctx_state=%d task [%d]\n", ctx->ctx_state, task ? task->pid : -1));
 
-	state     = ctx->ctx_state;
-	is_system = ctx->ctx_fl_system;
+	prev_state = ctx->ctx_state;
+	is_system  = ctx->ctx_fl_system;
 
 	/*
 	 * unload only when necessary
 	 */
-	if (state == PFM_CTX_TERMINATED || state == PFM_CTX_UNLOADED) {
-		DPRINT(("[%d] ctx_state=%d, nothing to do\n", current->pid, ctx->ctx_state));
+	if (prev_state == PFM_CTX_UNLOADED) {
+		DPRINT(("ctx_state=%d, nothing to do\n", prev_state));
 		return 0;
 	}
 
@@ -4431,7 +4458,7 @@ pfm_context_unload(pfm_context_t *ctx, v
 	ret = pfm_stop(ctx, NULL, 0, regs);
 	if (ret) return ret;
 
-	ctx->ctx_state = state = PFM_CTX_UNLOADED;
+	ctx->ctx_state = PFM_CTX_UNLOADED;
 
 	/*
 	 * in system mode, we need to update the PMU directly
@@ -4458,7 +4485,8 @@ pfm_context_unload(pfm_context_t *ctx, v
 		 * at this point we are done with the PMU
 		 * so we can unreserve the resource.
 		 */
-		pfm_unreserve_session(ctx, 1 , ctx->ctx_cpu);
+		if (prev_state != PFM_CTX_ZOMBIE) 
+			pfm_unreserve_session(ctx, 1 , ctx->ctx_cpu);
 
 		/*
 		 * disconnect context from task
@@ -4497,8 +4525,11 @@ pfm_context_unload(pfm_context_t *ctx, v
 	/*
 	 * at this point we are done with the PMU
 	 * so we can unreserve the resource.
+	 *
+	 * when state was ZOMBIE, we have already unreserved.
 	 */
-	pfm_unreserve_session(ctx, 0 , ctx->ctx_cpu);
+	if (prev_state != PFM_CTX_ZOMBIE) 
+		pfm_unreserve_session(ctx, 0 , ctx->ctx_cpu);
 
 	/*
 	 * reset activation counter and psr
@@ -4549,12 +4580,14 @@ pfm_force_cleanup(pfm_context_t *ctx, st
 	task->thread.pfm_context  = NULL;
 	task->thread.flags       &= ~IA64_THREAD_PM_VALID;
 
-	DPRINT(("context <%d> force cleanup for [%d] by [%d]\n", ctx->ctx_fd, task->pid, current->pid));
+	DPRINT(("force cleanupf for [%d]\n",  task->pid));
 }
 
 
+
 /*
  * called only from exit_thread(): task == current
+ * we come here only if current has a context attached (loaded or masked)
  */
 void
 pfm_exit_thread(struct task_struct *task)
@@ -4575,7 +4608,8 @@ pfm_exit_thread(struct task_struct *task
 	switch(state) {
 		case PFM_CTX_UNLOADED:
 			/*
-	 		 * come here only if attached
+	 		 * only comes to thios function if pfm_context is not NULL, i.e., cannot
+			 * be in unloaded state
 	 		 */
 			printk(KERN_ERR "perfmon: pfm_exit_thread [%d] ctx unloaded\n", task->pid);
 			break;
@@ -4583,20 +4617,17 @@ pfm_exit_thread(struct task_struct *task
 		case PFM_CTX_MASKED:
 			ret = pfm_context_unload(ctx, NULL, 0, regs);
 			if (ret) {
-				printk(KERN_ERR "perfmon: pfm_exit_thread [%d] state=%d unload failed %d\n", task->pid, ctx->ctx_state, ret);
+				printk(KERN_ERR "perfmon: pfm_exit_thread [%d] state=%d unload failed %d\n", task->pid, state, ret);
 			}
-			ctx->ctx_state = PFM_CTX_TERMINATED;
-			DPRINT(("ctx terminated by [%d]\n", task->pid));
+			DPRINT(("ctx unloaded for current state was %d\n", state));
 
 			pfm_end_notify_user(ctx);
 			break;
 		case PFM_CTX_ZOMBIE:
-			pfm_clear_psr_up();
-
-			BUG_ON(ctx->ctx_smpl_hdr);
-
-			pfm_force_cleanup(ctx, regs);
-
+			ret = pfm_context_unload(ctx, NULL, 0, regs);
+			if (ret) {
+				printk(KERN_ERR "perfmon: pfm_exit_thread [%d] state=%d unload failed %d\n", task->pid, state, ret);
+			}
 			free_ok = 1;
 			break;
 		default:
@@ -4696,7 +4727,7 @@ pfm_check_task_state(pfm_context_t *ctx,
 	if (task == current || ctx->ctx_fl_system) return 0;
 
 	/*
-	 * context is UNLOADED, MASKED, TERMINATED we are safe to go
+	 * context is UNLOADED, MASKED we are safe to go
 	 */
 	if (state != PFM_CTX_LOADED) return 0;
 
@@ -4749,7 +4780,7 @@ sys_perfmonctl (int fd, int cmd, void *a
 	if (unlikely(PFM_IS_DISABLED())) return -ENOSYS;
 
 	if (unlikely(cmd < 0 || cmd >= PFM_CMD_COUNT)) {
-		DPRINT(("[%d] invalid cmd=%d\n", current->pid, cmd));
+		DPRINT(("invalid cmd=%d\n", cmd));
 		return -EINVAL;
 	}
 
@@ -4760,7 +4791,7 @@ sys_perfmonctl (int fd, int cmd, void *a
 	cmd_flags = pfm_cmd_tab[cmd].cmd_flags;
 
 	if (unlikely(func == NULL)) {
-		DPRINT(("[%d] invalid cmd=%d\n", current->pid, cmd));
+		DPRINT(("invalid cmd=%d\n", cmd));
 		return -EINVAL;
 	}
 
@@ -4803,7 +4834,7 @@ restart_args:
 	 * assume sz = 0 for command without parameters
 	 */
 	if (sz && copy_from_user(args_k, arg, sz)) {
-		DPRINT(("[%d] cannot copy_from_user %lu bytes @%p\n", current->pid, sz, arg));
+		DPRINT(("cannot copy_from_user %lu bytes @%p\n", sz, arg));
 		goto error_args;
 	}
 
@@ -4819,7 +4850,7 @@ restart_args:
 
 		completed_args = 1;
 
-		DPRINT(("[%d] restart_args sz=%lu xtra_sz=%lu\n", current->pid, sz, xtra_sz));
+		DPRINT(("restart_args sz=%lu xtra_sz=%lu\n", sz, xtra_sz));
 
 		/* retry if necessary */
 		if (likely(xtra_sz)) goto restart_args;
@@ -4831,17 +4862,17 @@ restart_args:
 
 	file = fget(fd);
 	if (unlikely(file == NULL)) {
-		DPRINT(("[%d] invalid fd %d\n", current->pid, fd));
+		DPRINT(("invalid fd %d\n", fd));
 		goto error_args;
 	}
 	if (unlikely(PFM_IS_FILE(file) == 0)) {
-		DPRINT(("[%d] fd %d not related to perfmon\n", current->pid, fd));
+		DPRINT(("fd %d not related to perfmon\n", fd));
 		goto error_args;
 	}
 
 	ctx = (pfm_context_t *)file->private_data;
 	if (unlikely(ctx == NULL)) {
-		DPRINT(("[%d] no context for fd %d\n", current->pid, fd));
+		DPRINT(("no context for fd %d\n", fd));
 		goto error_args;
 	}
 	prefetch(&ctx->ctx_state);
@@ -4861,7 +4892,7 @@ skip_fd:
 
 abort_locked:
 	if (likely(ctx)) {
-		DPRINT(("[%d] context unlocked\n", current->pid));
+		DPRINT(("context unlocked\n"));
 		UNPROTECT_CTX(ctx, flags);
 		fput(file);
 	}
@@ -4945,12 +4976,7 @@ pfm_context_force_terminate(pfm_context_
 	current->thread.flags       &= ~IA64_THREAD_PM_VALID;
 	ctx->ctx_task = NULL;
 
-	/*
-	 * switch to terminated state
-	 */
-	ctx->ctx_state = PFM_CTX_TERMINATED;
-
-	DPRINT(("context <%d> terminated for [%d]\n", ctx->ctx_fd, current->pid));
+	DPRINT(("context terminated\n"));
 
 	/*
 	 * and wakeup controlling task, indicating we are now disconnected
@@ -4995,15 +5021,15 @@ pfm_handle_work(void)
 	 */
 	reason = ctx->ctx_fl_trap_reason;
 	ctx->ctx_fl_trap_reason = PFM_TRAP_REASON_NONE;
+	ovfl_regs = ctx->ctx_ovfl_regs[0];
 
-	DPRINT(("[%d] reason=%d state=%d\n", current->pid, reason, ctx->ctx_state));
+	DPRINT(("reason=%d state=%d\n", reason, ctx->ctx_state));
 
 	/*
-	 * must be done before we check non-blocking mode
+	 * must be done before we check for simple-reset mode
 	 */
 	if (ctx->ctx_fl_going_zombie || ctx->ctx_state == PFM_CTX_ZOMBIE) goto do_zombie;
 
-	ovfl_regs = ctx->ctx_ovfl_regs[0];
 
 	//if (CTX_OVFL_NOBLOCK(ctx)) goto skip_blocking;
 	if (reason == PFM_TRAP_REASON_RESET) goto skip_blocking;
@@ -5022,6 +5048,14 @@ pfm_handle_work(void)
 
 	PROTECT_CTX(ctx, flags);
 
+	/*
+	 * we need to read the ovfl_regs only after wake-up
+	 * because we may have had pfm_write_pmds() in between
+	 * and that can changed PMD values and therefore 
+	 * ovfl_regs is reset for these new PMD values.
+	 */
+	ovfl_regs = ctx->ctx_ovfl_regs[0];
+
 	if (ctx->ctx_fl_going_zombie) {
 do_zombie:
 		DPRINT(("context is zombie, bailing out\n"));
@@ -5050,7 +5084,7 @@ pfm_notify_user(pfm_context_t *ctx, pfm_
 		return 0;
 	}
 
-	DPRINT(("[%d] waking up somebody\n", current->pid));
+	DPRINT(("waking up somebody\n"));
 
 	if (msg) wake_up_interruptible(&ctx->ctx_msgq_wait);
 
@@ -5085,11 +5119,10 @@ pfm_ovfl_notify_user(pfm_context_t *ctx,
 		msg->pfm_ovfl_msg.msg_tstamp       = 0UL;
 	}
 
-	DPRINT(("ovfl msg: msg=%p no_msg=%d fd=%d pid=%d ovfl_pmds=0x%lx\n",
+	DPRINT(("ovfl msg: msg=%p no_msg=%d fd=%d ovfl_pmds=0x%lx\n",
 		msg,
 		ctx->ctx_fl_no_msg,
 		ctx->ctx_fd,
-		current->pid,
 		ovfl_pmds));
 
 	return pfm_notify_user(ctx, msg);
@@ -5112,10 +5145,10 @@ pfm_end_notify_user(pfm_context_t *ctx)
 	msg->pfm_end_msg.msg_ctx_fd  = ctx->ctx_fd;
 	msg->pfm_ovfl_msg.msg_tstamp = 0UL;
 
-	DPRINT(("end msg: msg=%p no_msg=%d ctx_fd=%d pid=%d\n",
+	DPRINT(("end msg: msg=%p no_msg=%d ctx_fd=%d\n",
 		msg,
 		ctx->ctx_fl_no_msg,
-		ctx->ctx_fd, current->pid));
+		ctx->ctx_fd));
 
 	return pfm_notify_user(ctx, msg);
 }
@@ -5275,8 +5308,7 @@ pfm_overflow_handler(struct task_struct 
 		 * when the module cannot handle the rest of the overflows, we abort right here
 		 */
 		if (ret && pmd_mask) {
-			DPRINT(("current [%d] handler aborts leftover ovfl_pmds=0x%lx\n",
-				current->pid,
+			DPRINT(("handler aborts leftover ovfl_pmds=0x%lx\n",
 				pmd_mask<<PMU_FIRST_COUNTER));
 		}
 		/*
@@ -5298,8 +5330,7 @@ pfm_overflow_handler(struct task_struct 
 		if (ovfl_notify == 0) reset_pmds = ovfl_pmds;
 	}
 
-	DPRINT(("current [%d] ovfl_pmds=0x%lx reset_pmds=0x%lx\n",
-		current->pid,
+	DPRINT(("ovfl_pmds=0x%lx reset_pmds=0x%lx\n",
 		ovfl_pmds,
 		reset_pmds));
 	/*
@@ -5341,8 +5372,7 @@ pfm_overflow_handler(struct task_struct 
 		must_notify = 1;
 	}
 
-	DPRINT_ovfl(("current [%d] owner [%d] pending=%ld reason=%u ovfl_pmds=0x%lx ovfl_notify=0x%lx masked=%d\n",
-			current->pid,
+	DPRINT_ovfl(("owner [%d] pending=%ld reason=%u ovfl_pmds=0x%lx ovfl_notify=0x%lx masked=%d\n",
 			GET_PMU_OWNER() ? GET_PMU_OWNER()->pid : -1,
 			PFM_GET_WORK_PENDING(task),
 			ctx->ctx_fl_trap_reason,
@@ -5521,6 +5551,7 @@ pfm_proc_info(char *page)
 		p += sprintf(p, "perfmon version           : %u.%u\n", PFM_VERSION_MAJ, PFM_VERSION_MIN);
 		p += sprintf(p, "model                     : %s\n", pmu_conf.pmu_name);
 		p += sprintf(p, "fastctxsw                 : %s\n", pfm_sysctl.fastctxsw > 0 ? "Yes": "No");
+		p += sprintf(p, "expert mode               : %s\n", pfm_sysctl.expert_mode > 0 ? "Yes": "No");
 		p += sprintf(p, "ovfl_mask                 : 0x%lx\n", pmu_conf.ovfl_val);
 
 	for(i=0; i < NR_CPUS; i++) {
@@ -6490,7 +6521,7 @@ pfm_inherit(struct task_struct *task, st
 {
 	struct thread_struct *thread;
 
-	DPRINT(("perfmon: pfm_inherit clearing state for [%d] current [%d]\n", task->pid, current->pid));
+	DPRINT(("perfmon: pfm_inherit clearing state for [%d]\n", task->pid));
 
 	thread = &task->thread;
 
--- diff/arch/ia64/kernel/perfmon_mckinley.h	2003-11-25 15:24:57.000000000 +0000
+++ source/arch/ia64/kernel/perfmon_mckinley.h	2004-04-21 10:45:33.546603640 +0100
@@ -101,6 +101,7 @@ pfm_mck_pmc_check(struct task_struct *ta
 {
 	int ret = 0, check_case1 = 0;
 	unsigned long val8 = 0, val14 = 0, val13 = 0;
+	int is_loaded;
 
 	/* first preserve the reserved fields */
 	pfm_mck_reserved(cnum, val, regs);
@@ -108,6 +109,8 @@ pfm_mck_pmc_check(struct task_struct *ta
 	/* sanitfy check */
 	if (ctx == NULL) return -EINVAL;
 
+	is_loaded = ctx->ctx_state == PFM_CTX_LOADED || ctx->ctx_state == PFM_CTX_MASKED;
+
 	/*
 	 * we must clear the debug registers if pmc13 has a value which enable
 	 * memory pipeline event constraints. In this case we need to clear the
@@ -120,7 +123,9 @@ pfm_mck_pmc_check(struct task_struct *ta
 	 *
 	 * For now, we just check on cfg_dbrXX != 0x3.
 	 */
-	if (cnum == 13 && ((*val & 0x18181818UL) != 0x18181818UL) && ctx->ctx_fl_using_dbreg == 0) {
+	DPRINT(("cnum=%u val=0x%lx, using_dbreg=%d loaded=%d\n", cnum, *val, ctx->ctx_fl_using_dbreg, is_loaded));
+
+	if (cnum == 13 && is_loaded && ((*val & 0x18181818UL) != 0x18181818UL) && ctx->ctx_fl_using_dbreg == 0) {
 
 		DPRINT(("pmc[%d]=0x%lx has active pmc13 settings, clearing dbr\n", cnum, *val));
 
@@ -131,14 +136,14 @@ pfm_mck_pmc_check(struct task_struct *ta
 		 * a count of 0 will mark the debug registers as in use and also
 		 * ensure that they are properly cleared.
 		 */
-		ret = pfm_write_ibr_dbr(1, ctx, NULL, 0, regs);
+		ret = pfm_write_ibr_dbr(PFM_DATA_RR, ctx, NULL, 0, regs);
 		if (ret) return ret;
 	}
 	/*
 	 * we must clear the (instruction) debug registers if any pmc14.ibrpX bit is enabled
 	 * before they are (fl_using_dbreg==0) to avoid picking up stale information.
 	 */
-	if (cnum == 14 && ((*val & 0x2222UL) != 0x2222UL) && ctx->ctx_fl_using_dbreg == 0) {
+	if (cnum == 14 && is_loaded && ((*val & 0x2222UL) != 0x2222UL) && ctx->ctx_fl_using_dbreg == 0) {
 
 		DPRINT(("pmc[%d]=0x%lx has active pmc14 settings, clearing ibr\n", cnum, *val));
 
@@ -149,7 +154,7 @@ pfm_mck_pmc_check(struct task_struct *ta
 		 * a count of 0 will mark the debug registers as in use and also
 		 * ensure that they are properly cleared.
 		 */
-		ret = pfm_write_ibr_dbr(0, ctx, NULL, 0, regs);
+		ret = pfm_write_ibr_dbr(PFM_CODE_RR, ctx, NULL, 0, regs);
 		if (ret) return ret;
 
 	}
--- diff/arch/ia64/kernel/process.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/ia64/kernel/process.c	2004-04-21 10:45:33.547603488 +0100
@@ -660,8 +660,6 @@ get_wchan (struct task_struct *p)
 	/*
 	 * These bracket the sleeping functions..
 	 */
-	extern void scheduling_functions_start_here(void);
-	extern void scheduling_functions_end_here(void);
 #	define first_sched	((unsigned long) scheduling_functions_start_here)
 #	define last_sched	((unsigned long) scheduling_functions_end_here)
 
--- diff/arch/ia64/kernel/semaphore.c	2002-10-16 04:27:54.000000000 +0100
+++ source/arch/ia64/kernel/semaphore.c	2004-04-21 10:45:33.547603488 +0100
@@ -24,6 +24,7 @@
  * <asm/semaphore.h> where we want to avoid any extra jumps and calls.
  */
 #include <linux/sched.h>
+#include <linux/init.h>
 
 #include <asm/errno.h>
 #include <asm/semaphore.h>
@@ -44,8 +45,7 @@ __up (struct semaphore *sem)
 	wake_up(&sem->wait);
 }
 
-void
-__down (struct semaphore *sem)
+void __sched __down (struct semaphore *sem)
 {
 	struct task_struct *tsk = current;
 	DECLARE_WAITQUEUE(wait, tsk);
@@ -82,8 +82,7 @@ __down (struct semaphore *sem)
 	tsk->state = TASK_RUNNING;
 }
 
-int
-__down_interruptible (struct semaphore * sem)
+int __sched __down_interruptible (struct semaphore * sem)
 {
 	int retval = 0;
 	struct task_struct *tsk = current;
--- diff/arch/ia64/kernel/sys_ia64.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/ia64/kernel/sys_ia64.c	2004-04-21 10:45:33.547603488 +0100
@@ -201,10 +201,16 @@ do_mmap2 (unsigned long addr, unsigned l
 	 * A zero mmap always succeeds in Linux, independent of whether or not the
 	 * remaining arguments are valid.
 	 */
-	len = PAGE_ALIGN(len);
 	if (len == 0)
 		goto out;
 
+	/* Careful about overflows.. */
+	len = PAGE_ALIGN(len);
+	if (!len || len > TASK_SIZE) {
+		addr = -EINVAL;
+		goto out;
+	}
+
 	/*
 	 * Don't permit mappings into unmapped space, the virtual page table of a region,
 	 * or across a region boundary.  Note: RGN_MAP_LIMIT is equal to 2^n-PAGE_SIZE
--- diff/arch/ia64/kernel/unaligned.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/ia64/kernel/unaligned.c	2004-04-21 10:45:33.548603336 +0100
@@ -1337,7 +1337,7 @@ ia64_handle_unaligned (unsigned long ifa
 			 * be holding locks...
 			 */
 			if (user_mode(regs))
-				tty_write_message(current->tty, buf);
+				tty_write_message(current->signal->tty, buf);
 			buf[len-1] = '\0';	/* drop '\r' */
 			printk(KERN_WARNING "%s", buf);	/* watch for command names containing %s */
 		}
--- diff/arch/ia64/kernel/vmlinux.lds.S	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/ia64/kernel/vmlinux.lds.S	2004-04-21 10:45:33.549603184 +0100
@@ -41,6 +41,7 @@ SECTIONS
     {
 	*(.text.ivt)
 	*(.text)
+	SCHED_TEXT
 	*(.gnu.linkonce.t*)
     }
   .text2 : AT(ADDR(.text2) - LOAD_OFFSET)
--- diff/arch/ia64/mm/hugetlbpage.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/ia64/mm/hugetlbpage.c	2004-04-21 10:45:33.549603184 +0100
@@ -9,6 +9,7 @@
  */
 
 #include <linux/config.h>
+#include <linux/module.h>
 #include <linux/init.h>
 #include <linux/fs.h>
 #include <linux/mm.h>
@@ -22,68 +23,7 @@
 #include <asm/tlb.h>
 #include <asm/tlbflush.h>
 
-static long	htlbpagemem;
-int		htlbpage_max;
-static long	htlbzone_pages;
-unsigned int	hpage_shift=HPAGE_SHIFT_DEFAULT;
-
-static struct list_head hugepage_freelists[MAX_NUMNODES];
-static spinlock_t htlbpage_lock = SPIN_LOCK_UNLOCKED;
-
-static void enqueue_huge_page(struct page *page)
-{
-	list_add(&page->list,
-		&hugepage_freelists[page_zone(page)->zone_pgdat->node_id]);
-}
-
-static struct page *dequeue_huge_page(void)
-{
-	int nid = numa_node_id();
-	struct page *page = NULL;
-
-	if (list_empty(&hugepage_freelists[nid])) {
-		for (nid = 0; nid < MAX_NUMNODES; ++nid)
-			if (!list_empty(&hugepage_freelists[nid]))
-				break;
-	}
-	if (nid >= 0 && nid < MAX_NUMNODES &&
-	    !list_empty(&hugepage_freelists[nid])) {
-		page = list_entry(hugepage_freelists[nid].next, struct page, list);
-		list_del(&page->list);
-	}
-	return page;
-}
-
-static struct page *alloc_fresh_huge_page(void)
-{
-	static int nid = 0;
-	struct page *page;
-	page = alloc_pages_node(nid, GFP_HIGHUSER, HUGETLB_PAGE_ORDER);
-	nid = (nid + 1) % numnodes;
-	return page;
-}
-
-void free_huge_page(struct page *page);
-
-static struct page *alloc_hugetlb_page(void)
-{
-	int i;
-	struct page *page;
-
-	spin_lock(&htlbpage_lock);
-	page = dequeue_huge_page();
-	if (!page) {
-		spin_unlock(&htlbpage_lock);
-		return NULL;
-	}
-	htlbpagemem--;
-	spin_unlock(&htlbpage_lock);
-	set_page_count(page, 1);
-	page->lru.prev = (void *)free_huge_page;
-	for (i = 0; i < (HPAGE_SIZE/PAGE_SIZE); ++i)
-		clear_highpage(&page[i]);
-	return page;
-}
+unsigned int hpage_shift=HPAGE_SHIFT_DEFAULT;
 
 static pte_t *
 huge_pte_alloc (struct mm_struct *mm, unsigned long addr)
@@ -109,8 +49,12 @@ huge_pte_offset (struct mm_struct *mm, u
 	pte_t *pte = NULL;
 
 	pgd = pgd_offset(mm, taddr);
-	pmd = pmd_offset(pgd, taddr);
-	pte = pte_offset_map(pmd, taddr);
+	if (pgd_present(*pgd)) {
+		pmd = pmd_offset(pgd, taddr);
+		if (pmd_present(*pmd))
+			pte = pte_offset_map(pmd, taddr);
+	}
+
 	return pte;
 }
 
@@ -210,27 +154,21 @@ back1:
 	return i;
 }
 
-struct vm_area_struct *hugepage_vma(struct mm_struct *mm, unsigned long addr)
-{
-	if (mm->used_hugetlb) {
-		if (REGION_NUMBER(addr) == REGION_HPAGE) {
-			struct vm_area_struct *vma = find_vma(mm, addr);
-			if (vma && is_vm_hugetlb_page(vma))
-				return vma;
-		}
-	}
-	return NULL;
-}
-
-struct page *follow_huge_addr(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, int write)
+struct page *follow_huge_addr(struct mm_struct *mm, unsigned long addr, int write)
 {
 	struct page *page;
 	pte_t *ptep;
 
+	if (! mm->used_hugetlb)
+		return ERR_PTR(-EINVAL);
+	if (REGION_NUMBER(addr) != REGION_HPAGE)
+		return ERR_PTR(-EINVAL);
+
 	ptep = huge_pte_offset(mm, addr);
+	if (!ptep || pte_none(*ptep))
+		return NULL;
 	page = pte_page(*ptep);
 	page += ((addr & ~HPAGE_MASK) >> PAGE_SHIFT);
-	get_page(page);
 	return page;
 }
 int pmd_huge(pmd_t pmd)
@@ -243,27 +181,6 @@ follow_huge_pmd(struct mm_struct *mm, un
 	return NULL;
 }
 
-void free_huge_page(struct page *page)
-{
-	BUG_ON(page_count(page));
-	BUG_ON(page->mapping);
-
-	INIT_LIST_HEAD(&page->list);
-
-	spin_lock(&htlbpage_lock);
-	enqueue_huge_page(page);
-	htlbpagemem++;
-	spin_unlock(&htlbpage_lock);
-}
-
-void huge_page_release(struct page *page)
-{
-	if (!put_page_testzero(page))
-		return;
-
-	free_huge_page(page);
-}
-
 /*
  * Same as generic free_pgtables(), except constant PGDIR_* and pgd_offset
  * are hugetlb region specific.
@@ -339,14 +256,6 @@ void unmap_hugepage_range(struct vm_area
 	flush_tlb_range(vma, start, end);
 }
 
-void zap_hugepage_range(struct vm_area_struct *vma, unsigned long start, unsigned long length)
-{
-	struct mm_struct *mm = vma->vm_mm;
-	spin_lock(&mm->page_table_lock);
-	unmap_hugepage_range(vma, start, start + length);
-	spin_unlock(&mm->page_table_lock);
-}
-
 int hugetlb_prefault(struct address_space *mapping, struct vm_area_struct *vma)
 {
 	struct mm_struct *mm = current->mm;
@@ -378,7 +287,7 @@ int hugetlb_prefault(struct address_spac
 				ret = -ENOMEM;
 				goto out;
 			}
-			page = alloc_hugetlb_page();
+			page = alloc_huge_page();
 			if (!page) {
 				hugetlb_put_quota(mapping);
 				ret = -ENOMEM;
@@ -422,106 +331,6 @@ unsigned long hugetlb_get_unmapped_area(
 		addr = ALIGN(vmm->vm_end, HPAGE_SIZE);
 	}
 }
-void update_and_free_page(struct page *page)
-{
-	int j;
-	struct page *map;
-
-	map = page;
-	htlbzone_pages--;
-	for (j = 0; j < (HPAGE_SIZE / PAGE_SIZE); j++) {
-		map->flags &= ~(1 << PG_locked | 1 << PG_error | 1 << PG_referenced |
-				1 << PG_dirty | 1 << PG_active | 1 << PG_reserved |
-				1 << PG_private | 1<< PG_writeback);
-		set_page_count(map, 0);
-		map++;
-	}
-	set_page_count(page, 1);
-	__free_pages(page, HUGETLB_PAGE_ORDER);
-}
-
-int try_to_free_low(int count)
-{
-	struct list_head *p;
-	struct page *page, *map;
-
-	map = NULL;
-	spin_lock(&htlbpage_lock);
-	list_for_each(p, &hugepage_freelists[0]) {
-		if (map) {
-			list_del(&map->list);
-			update_and_free_page(map);
-			htlbpagemem--;
-			map = NULL;
-			if (++count == 0)
-				break;
-		}
-		page = list_entry(p, struct page, list);
-		if (!PageHighMem(page))
-			map = page;
-	}
-	if (map) {
-		list_del(&map->list);
-		update_and_free_page(map);
-		htlbpagemem--;
-		count++;
-	}
-	spin_unlock(&htlbpage_lock);
-	return count;
-}
-
-int set_hugetlb_mem_size(int count)
-{
-	int  lcount;
-	struct page *page ;
-
-	if (count < 0)
-		lcount = count;
-	else
-		lcount = count - htlbzone_pages;
-
-	if (lcount == 0)
-		return (int)htlbzone_pages;
-	if (lcount > 0) {	/* Increase the mem size. */
-		while (lcount--) {
-			page = alloc_fresh_huge_page();
-			if (page == NULL)
-				break;
-			spin_lock(&htlbpage_lock);
-			enqueue_huge_page(page);
-			htlbpagemem++;
-			htlbzone_pages++;
-			spin_unlock(&htlbpage_lock);
-		}
-		return (int) htlbzone_pages;
-	}
-	/* Shrink the memory size. */
-	lcount = try_to_free_low(lcount);
-	while (lcount++) {
-		page = alloc_hugetlb_page();
-		if (page == NULL)
-			break;
-		spin_lock(&htlbpage_lock);
-		update_and_free_page(page);
-		spin_unlock(&htlbpage_lock);
-	}
-	return (int) htlbzone_pages;
-}
-
-int hugetlb_sysctl_handler(ctl_table *table, int write, struct file *file, void *buffer, size_t *length)
-{
-	proc_dointvec(table, write, file, buffer, length);
-	htlbpage_max = set_hugetlb_mem_size(htlbpage_max);
-	return 0;
-}
-
-static int __init hugetlb_setup(char *s)
-{
-	if (sscanf(s, "%d", &htlbpage_max) <= 0)
-		htlbpage_max = 0;
-	return 1;
-}
-__setup("hugepages=", hugetlb_setup);
 
 static int __init hugetlb_setup_sz(char *str)
 {
@@ -551,60 +360,3 @@ static int __init hugetlb_setup_sz(char 
 	return 1;
 }
 __setup("hugepagesz=", hugetlb_setup_sz);
-
-static int __init hugetlb_init(void)
-{
-	int i;
-	struct page *page;
-
-	for (i = 0; i < MAX_NUMNODES; ++i)
-		INIT_LIST_HEAD(&hugepage_freelists[i]);
-
-	for (i = 0; i < htlbpage_max; ++i) {
-		page = alloc_fresh_huge_page();
-		if (!page)
-			break;
-		spin_lock(&htlbpage_lock);
-		enqueue_huge_page(page);
-		spin_unlock(&htlbpage_lock);
-	}
-	htlbpage_max = htlbpagemem = htlbzone_pages = i;
-	printk("Total HugeTLB memory allocated, %ld\n", htlbpagemem);
-	return 0;
-}
-__initcall(hugetlb_init);
-
-int hugetlb_report_meminfo(char *buf)
-{
-	return sprintf(buf,
-			"HugePages_Total: %5lu\n"
-			"HugePages_Free:  %5lu\n"
-			"Hugepagesize:    %5lu kB\n",
-			htlbzone_pages,
-			htlbpagemem,
-			HPAGE_SIZE/1024);
-}
-
-int is_hugepage_mem_enough(size_t size)
-{
-	if (size > (htlbpagemem << HPAGE_SHIFT))
-		return 0;
-	return 1;
-}
-
-/* Return the number pages of memory we physically have, in PAGE_SIZE units. */
-unsigned long hugetlb_total_pages(void)
-{
-	return htlbzone_pages * (HPAGE_SIZE / PAGE_SIZE);
-}
-EXPORT_SYMBOL(hugetlb_total_pages);
-
-static struct page *hugetlb_nopage(struct vm_area_struct * area, unsigned long address, int *unused)
-{
-	BUG();
-	return NULL;
-}
-
-struct vm_operations_struct hugetlb_vm_ops = {
-	.nopage =	hugetlb_nopage,
-};
--- diff/arch/ia64/pci/pci.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/ia64/pci/pci.c	2004-04-21 10:45:33.550603032 +0100
@@ -34,6 +34,7 @@
 # include <asm/smp.h>
 #endif
 #include <asm/irq.h>
+#include <asm/hw_irq.h>
 
 
 #undef DEBUG
@@ -441,7 +442,6 @@ pcibios_enable_device (struct pci_dev *d
 	if (ret < 0)
 		return ret;
 
-	printk(KERN_INFO "PCI: Found IRQ %d for device %s\n", dev->irq, pci_name(dev));
 	return acpi_pci_irq_enable(dev);
 }
 
@@ -567,3 +567,12 @@ pcibios_prep_mwi (struct pci_dev *dev)
 	}
 	return rc;
 }
+
+int pci_vector_resources(int last, int nr_released)
+{
+	int count = nr_released;
+
+ 	count += (IA64_LAST_DEVICE_VECTOR - last);
+
+	return count;
+}
--- diff/arch/ia64/sn/io/hwgfs/interface.c	2004-02-09 10:36:07.000000000 +0000
+++ source/arch/ia64/sn/io/hwgfs/interface.c	2004-04-21 10:45:33.550603032 +0100
@@ -36,7 +36,7 @@ walk_parents_mkdir(
 		memcpy(buf, *path, len);
 		buf[len] = '\0';
 
-		error = link_path_walk(buf, nd); 
+		error = path_walk(buf, nd);
 		if (unlikely(error))
 			return error;
 
@@ -83,7 +83,7 @@ hwgfs_decode(
 	if (unlikely(error))
 		return error;
 
-	error = link_path_walk(name, &nd);
+	error = path_walk(name, &nd);
 	if (unlikely(error))
 		return error;
 
@@ -274,7 +274,7 @@ hwgfs_find_handle(
 	nd.dentry = dget(base ? base : hwgfs_vfsmount->mnt_sb->s_root);
 	nd.flags = (traverse_symlinks ? LOOKUP_FOLLOW : 0);
 
-	error = link_path_walk(name, &nd);
+	error = path_walk(name, &nd);
 	if (likely(!error)) {
 		dentry = nd.dentry;
 		path_release(&nd);		/* stale data from here! */
--- diff/arch/ia64/sn/io/machvec/pci_bus_cvlink.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/ia64/sn/io/machvec/pci_bus_cvlink.c	2004-04-21 10:45:33.551602880 +0100
@@ -811,7 +811,6 @@ sn_pci_init (void)
 	/*
 	 * set pci_raw_ops, etc.
 	 */
-
 	sgi_master_io_infr_init();
 
 	for (cnode = 0; cnode < numnodes; cnode++) {
@@ -826,16 +825,16 @@ sn_pci_init (void)
 #endif
 
 	controller = kmalloc(sizeof(struct pci_controller), GFP_KERNEL);
-	if (controller) {
-		memset(controller, 0, sizeof(struct pci_controller));
-		/* just allocate some devices and fill in the pci_dev structs */
-		for (i = 0; i < PCI_BUSES_TO_SCAN; i++)
-			pci_scan_bus(i, &sn_pci_ops, controller);
+	if (!controller) {
+		printk(KERN_WARNING "cannot allocate PCI controller\n");
+		return 0;
 	}
 
-	/*
-	 * actually find devices and fill in hwgraph structs
-	 */
+	memset(controller, 0, sizeof(struct pci_controller));
+
+	for (i = 0; i < PCI_BUSES_TO_SCAN; i++)
+		if (pci_bus_to_vertex(i))
+			pci_scan_bus(i, &sn_pci_ops, controller);
 
 	done_probing = 1;
 
@@ -857,13 +856,8 @@ sn_pci_init (void)
 	 * set the root start and end so that drivers calling check_region()
 	 * won't see a conflict
 	 */
-
-#ifdef CONFIG_IA64_SGI_SN_SIM
-	if (! IS_RUNNING_ON_SIMULATOR()) {
-		ioport_resource.start  = 0xc000000000000000;
-		ioport_resource.end =    0xcfffffffffffffff;
-	}
-#endif
+	ioport_resource.start = 0xc000000000000000;
+	ioport_resource.end = 0xcfffffffffffffff;
 
 	/*
 	 * Set the root start and end for Mem Resource.
--- diff/arch/ia64/sn/io/machvec/pci_dma.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/ia64/sn/io/machvec/pci_dma.c	2004-04-21 10:45:33.551602880 +0100
@@ -391,11 +391,9 @@ sn_pci_map_single(struct pci_dev *hwdev,
 	dma_map = pcibr_dmamap_alloc(vhdl, NULL, size, PCIIO_DMA_DATA | 
 				     MINIMAL_ATE_FLAG(phys_addr, size));
 
-	if (!dma_map) {
-		printk(KERN_ERR "pci_map_single: Unable to allocate anymore "
-		       "32 bit page map entries.\n");
+	/* PMU out of entries */
+	if (!dma_map)
 		return 0;
-	}
 
 	dma_addr = (dma_addr_t) pcibr_dmamap_addr(dma_map, phys_addr, size);
 	dma_map->bd_dma_addr = dma_addr;
@@ -655,6 +653,12 @@ EXPORT_SYMBOL(sn_dma_sync_sg_for_device)
 int
 sn_dma_mapping_error(dma_addr_t dma_addr)
 {
+	/*
+	 * We can only run out of page mapping entries, so if there's
+	 * an error, tell the caller to try again later.
+	 */
+	if (!dma_addr)
+		return -EAGAIN;
 	return 0;
 }
 
--- diff/arch/ia64/sn/io/sn2/pcibr/pcibr_slot.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/ia64/sn/io/sn2/pcibr/pcibr_slot.c	2004-04-21 10:45:33.552602728 +0100
@@ -47,6 +47,7 @@ void pcibr_bus_addr_free(pciio_win_info_
 cfg_p pcibr_find_capability(cfg_p, unsigned);
 extern uint64_t  do_pcibr_config_get(cfg_p, unsigned, unsigned);
 void do_pcibr_config_set(cfg_p, unsigned, unsigned, uint64_t); 
+int pcibr_slot_pwr(vertex_hdl_t pcibr_vhdl, pciio_slot_t slot, int up, char *err_msg);
 
 
 /* 
@@ -351,7 +352,7 @@ pcibr_slot_enable(vertex_hdl_t pcibr_vhd
         goto enable_unlock;
     }
 
-    error = pcibr_slot_attach(pcibr_vhdl, slot, NULL,
+    error = pcibr_slot_attach(pcibr_vhdl, slot, 0,
                               req_p->req_resp.resp_l1_msg,
 			      &req_p->req_resp.resp_sub_errno);
 
--- diff/arch/ia64/sn/kernel/sn2/sn2_smp.c	2004-02-18 08:54:07.000000000 +0000
+++ source/arch/ia64/sn/kernel/sn2/sn2_smp.c	2004-04-21 10:45:33.553602576 +0100
@@ -91,7 +91,7 @@ sn2_global_tlb_purge (unsigned long star
 	short			nasids[NR_NODES], nix;
 	DECLARE_BITMAP(nodes_flushed, NR_NODES);
 
-	CLEAR_BITMAP(nodes_flushed, NR_NODES);
+	bitmap_zero(nodes_flushed, NR_NODES);
 
 	i = 0;
 
--- diff/arch/m68k/amiga/amiints.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/m68k/amiga/amiints.c	2004-04-21 10:45:33.553602576 +0100
@@ -61,11 +61,25 @@ extern int cia_get_irq_list(struct ciaba
 static irq_node_t *ami_irq_list[AMI_STD_IRQS];
 
 static unsigned short amiga_intena_vals[AMI_STD_IRQS] = {
-	IF_VERTB, IF_COPER, IF_AUD0, IF_AUD1, IF_AUD2, IF_AUD3, IF_BLIT,
-	IF_DSKSYN, IF_DSKBLK, IF_RBF, IF_TBE, IF_SOFT, IF_PORTS, IF_EXTER
+	[IRQ_AMIGA_VERTB]	= IF_VERTB,
+	[IRQ_AMIGA_COPPER]	= IF_COPER,
+	[IRQ_AMIGA_AUD0]	= IF_AUD0,
+	[IRQ_AMIGA_AUD1]	= IF_AUD1,
+	[IRQ_AMIGA_AUD2]	= IF_AUD2,
+	[IRQ_AMIGA_AUD3]	= IF_AUD3,
+	[IRQ_AMIGA_BLIT]	= IF_BLIT,
+	[IRQ_AMIGA_DSKSYN]	= IF_DSKSYN,
+	[IRQ_AMIGA_DSKBLK]	= IF_DSKBLK,
+	[IRQ_AMIGA_RBF]		= IF_RBF,
+	[IRQ_AMIGA_TBE]		= IF_TBE,
+	[IRQ_AMIGA_SOFT]	= IF_SOFT,
+	[IRQ_AMIGA_PORTS]	= IF_PORTS,
+	[IRQ_AMIGA_EXTER]	= IF_EXTER
 };
 static const unsigned char ami_servers[AMI_STD_IRQS] = {
-	1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1
+	[IRQ_AMIGA_VERTB]	= 1,
+	[IRQ_AMIGA_PORTS]	= 1,
+	[IRQ_AMIGA_EXTER]	= 1
 };
 
 static short ami_ablecount[AMI_IRQS];
@@ -469,8 +483,14 @@ static irqreturn_t ami_int7(int irq, voi
 }
 
 irqreturn_t (*amiga_default_handler[SYS_IRQS])(int, void *, struct pt_regs *) = {
-	ami_badint, ami_int1, ami_badint, ami_int3,
-	ami_int4, ami_int5, ami_badint, ami_int7
+	[0] = ami_badint,
+	[1] = ami_int1,
+	[2] = ami_badint,
+	[3] = ami_int3,
+	[4] = ami_int4,
+	[5] = ami_int5,
+	[6] = ami_badint,
+	[7] = ami_int7
 };
 
 int show_amiga_interrupts(struct seq_file *p, void *v)
--- diff/arch/m68k/amiga/amisound.c	2004-02-09 10:36:07.000000000 +0000
+++ source/arch/m68k/amiga/amisound.c	2004-04-21 10:45:33.554602424 +0100
@@ -17,7 +17,7 @@
 #include <asm/system.h>
 #include <asm/amigahw.h>
 
-static unsigned short *snd_data = NULL;
+static unsigned short *snd_data;
 static const signed char sine_data[] = {
 	0,  39,  75,  103,  121,  127,  121,  103,  75,  39,
 	0, -39, -75, -103, -121, -127, -121, -103, -75, -39
--- diff/arch/m68k/amiga/cia.c	2003-06-09 14:18:17.000000000 +0100
+++ source/arch/m68k/amiga/cia.c	2004-04-21 10:45:33.554602424 +0100
@@ -31,15 +31,19 @@ struct ciabase {
 	char *name;
 	irq_handler_t irq_list[CIA_IRQS];
 } ciaa_base = {
-	&ciaa, 0, 0, IF_PORTS,
-	IRQ_AMIGA_AUTO_2, IRQ_AMIGA_CIAA,
-	IRQ_AMIGA_PORTS,
-	"CIAA handler"
+	.cia		= &ciaa,
+	.int_mask	= IF_PORTS,
+	.handler_irq	= IRQ_AMIGA_AUTO_2,
+	.cia_irq	= IRQ_AMIGA_CIAA,
+	.server_irq	= IRQ_AMIGA_PORTS,
+	.name		= "CIAA handler"
 }, ciab_base = {
-	&ciab, 0, 0, IF_EXTER,
-	IRQ_AMIGA_AUTO_6, IRQ_AMIGA_CIAB,
-	IRQ_AMIGA_EXTER,
-	"CIAB handler"
+	.cia		= &ciab,
+	.int_mask	= IF_EXTER,
+	.handler_irq	= IRQ_AMIGA_AUTO_6,
+	.cia_irq	= IRQ_AMIGA_CIAB,
+	.server_irq	= IRQ_AMIGA_EXTER,
+	.name		= "CIAB handler"
 };
 
 /*
--- diff/arch/m68k/amiga/config.c	2004-02-09 10:36:07.000000000 +0000
+++ source/arch/m68k/amiga/config.c	2004-04-21 10:45:33.555602272 +0100
@@ -63,8 +63,21 @@ static char s_cdtv[] __initdata = "CDTV"
 static char s_cd32[] __initdata = "CD32";
 static char s_draco[] __initdata = "Draco";
 static char *amiga_models[] __initdata = {
-    s_a500, s_a500p, s_a600, s_a1000, s_a1200, s_a2000, s_a2500, s_a3000,
-    s_a3000t, s_a3000p, s_a4000, s_a4000t, s_cdtv, s_cd32, s_draco,
+    [AMI_500-AMI_500]		= s_a500,
+    [AMI_500PLUS-AMI_500]	= s_a500p,
+    [AMI_600-AMI_500]		= s_a600,
+    [AMI_1000-AMI_500]		= s_a1000,
+    [AMI_1200-AMI_500]		= s_a1200,
+    [AMI_2000-AMI_500]		= s_a2000,
+    [AMI_2500-AMI_500]		= s_a2500,
+    [AMI_3000-AMI_500]		= s_a3000,
+    [AMI_3000T-AMI_500]		= s_a3000t,
+    [AMI_3000PLUS-AMI_500]	= s_a3000p,
+    [AMI_4000-AMI_500]		= s_a4000,
+    [AMI_4000T-AMI_500]		= s_a4000t,
+    [AMI_CDTV-AMI_500]		= s_cdtv,
+    [AMI_CD32-AMI_500]		= s_cd32,
+    [AMI_DRACO-AMI_500]		= s_draco,
 };
 
 static char amiga_model_name[13] = "Amiga ";
@@ -793,7 +806,7 @@ struct savekmsg {
     char data[0];
 };
 
-static struct savekmsg *savekmsg = NULL;
+static struct savekmsg *savekmsg;
 
 static void amiga_mem_console_write(struct console *co, const char *s,
 				    unsigned int count)
--- diff/arch/m68k/apollo/config.c	2003-08-20 14:16:08.000000000 +0100
+++ source/arch/m68k/apollo/config.c	2004-04-21 10:45:33.555602272 +0100
@@ -49,11 +49,12 @@ static irqreturn_t dn_timer_int(int irq,
 static irqreturn_t (*sched_timer_handler)(int, void *, struct pt_regs *)=NULL;
 static void dn_get_model(char *model);
 static const char *apollo_models[] = {
-	"DN3000 (Otter)",
-	"DN3010 (Otter)",
-	"DN3500 (Cougar II)",
-	"DN4000 (Mink)",
-	"DN4500 (Roadrunner)" };
+	[APOLLO_DN3000-APOLLO_DN3000] = "DN3000 (Otter)",
+	[APOLLO_DN3010-APOLLO_DN3000] = "DN3010 (Otter)",
+	[APOLLO_DN3500-APOLLO_DN3000] = "DN3500 (Cougar II)",
+	[APOLLO_DN4000-APOLLO_DN3000] = "DN4000 (Mink)",
+	[APOLLO_DN4500-APOLLO_DN3000] = "DN4500 (Roadrunner)"
+};
 
 int apollo_parse_bootinfo(const struct bi_record *record) {
 
--- diff/arch/m68k/atari/ataints.c	2003-06-09 14:18:17.000000000 +0100
+++ source/arch/m68k/atari/ataints.c	2004-04-21 10:45:33.555602272 +0100
@@ -138,7 +138,7 @@ static struct irqparam irq_param[NUM_INT
  * (new vectors starting from 0x70 can be allocated by
  * atari_register_vme_int())
  */
-static int free_vme_vec_bitmap = 0;
+static int free_vme_vec_bitmap;
 
 /* check for valid int number (complex, sigh...) */
 #define	IS_VALID_INTNO(n)											\
@@ -233,38 +233,38 @@ BUILD_SLOW_IRQ(30);
 BUILD_SLOW_IRQ(31);
 
 asm_irq_handler slow_handlers[32] = {
-	atari_slow_irq_0_handler,
-	atari_slow_irq_1_handler,
-	atari_slow_irq_2_handler,
-	atari_slow_irq_3_handler,
-	atari_slow_irq_4_handler,
-	atari_slow_irq_5_handler,
-	atari_slow_irq_6_handler,
-	atari_slow_irq_7_handler,
-	atari_slow_irq_8_handler,
-	atari_slow_irq_9_handler,
-	atari_slow_irq_10_handler,
-	atari_slow_irq_11_handler,
-	atari_slow_irq_12_handler,
-	atari_slow_irq_13_handler,
-	atari_slow_irq_14_handler,
-	atari_slow_irq_15_handler,
-	atari_slow_irq_16_handler,
-	atari_slow_irq_17_handler,
-	atari_slow_irq_18_handler,
-	atari_slow_irq_19_handler,
-	atari_slow_irq_20_handler,
-	atari_slow_irq_21_handler,
-	atari_slow_irq_22_handler,
-	atari_slow_irq_23_handler,
-	atari_slow_irq_24_handler,
-	atari_slow_irq_25_handler,
-	atari_slow_irq_26_handler,
-	atari_slow_irq_27_handler,
-	atari_slow_irq_28_handler,
-	atari_slow_irq_29_handler,
-	atari_slow_irq_30_handler,
-	atari_slow_irq_31_handler
+	[0]	= atari_slow_irq_0_handler,
+	[1]	= atari_slow_irq_1_handler,
+	[2]	= atari_slow_irq_2_handler,
+	[3]	= atari_slow_irq_3_handler,
+	[4]	= atari_slow_irq_4_handler,
+	[5]	= atari_slow_irq_5_handler,
+	[6]	= atari_slow_irq_6_handler,
+	[7]	= atari_slow_irq_7_handler,
+	[8]	= atari_slow_irq_8_handler,
+	[9]	= atari_slow_irq_9_handler,
+	[10]	= atari_slow_irq_10_handler,
+	[11]	= atari_slow_irq_11_handler,
+	[12]	= atari_slow_irq_12_handler,
+	[13]	= atari_slow_irq_13_handler,
+	[14]	= atari_slow_irq_14_handler,
+	[15]	= atari_slow_irq_15_handler,
+	[16]	= atari_slow_irq_16_handler,
+	[17]	= atari_slow_irq_17_handler,
+	[18]	= atari_slow_irq_18_handler,
+	[19]	= atari_slow_irq_19_handler,
+	[20]	= atari_slow_irq_20_handler,
+	[21]	= atari_slow_irq_21_handler,
+	[22]	= atari_slow_irq_22_handler,
+	[23]	= atari_slow_irq_23_handler,
+	[24]	= atari_slow_irq_24_handler,
+	[25]	= atari_slow_irq_25_handler,
+	[26]	= atari_slow_irq_26_handler,
+	[27]	= atari_slow_irq_27_handler,
+	[28]	= atari_slow_irq_28_handler,
+	[29]	= atari_slow_irq_29_handler,
+	[30]	= atari_slow_irq_30_handler,
+	[31]	= atari_slow_irq_31_handler
 };
 
 asmlinkage void atari_fast_irq_handler( void );
--- diff/arch/m68k/atari/config.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/m68k/atari/config.c	2004-04-21 10:45:33.556602120 +0100
@@ -44,10 +44,10 @@
 #include <asm/io.h>
 
 u_long atari_mch_cookie;
-u_long atari_mch_type = 0;
+u_long atari_mch_type;
 struct atari_hw_present atari_hw_present;
-u_long atari_switches = 0;
-int atari_dont_touch_floppy_select = 0;
+u_long atari_switches;
+int atari_dont_touch_floppy_select;
 int atari_rtc_year_offset;
 
 /* local function prototypes */
@@ -99,7 +99,7 @@ hwreg_present_bywrite(volatile void *reg
 {
     int		ret;
     long	save_sp, save_vbr;
-    static long tmp_vectors[3] = { 0, 0, (long)&&after_test };
+    static long tmp_vectors[3] = { [2] = (long)&&after_test };
 	
     __asm__ __volatile__
 	(	"movec	%/vbr,%2\n\t"	/* save vbr value            */
--- diff/arch/m68k/atari/debug.c	2002-10-16 04:27:48.000000000 +0100
+++ source/arch/m68k/atari/debug.c	2004-04-21 10:45:33.557601968 +0100
@@ -23,12 +23,12 @@
 extern char m68k_debug_device[];
 
 /* Flag that Modem1 port is already initialized and used */
-int atari_MFP_init_done = 0;
+int atari_MFP_init_done;
 /* Flag that Modem1 port is already initialized and used */
-int atari_SCC_init_done = 0;
+int atari_SCC_init_done;
 /* Can be set somewhere, if a SCC master reset has already be done and should
  * not be repeated; used by kgdb */
-int atari_SCC_reset_done = 0;
+int atari_SCC_reset_done;
 
 static struct console atari_console_driver = {
 	.name =		"debug",
--- diff/arch/m68k/atari/hades-pci.c	2004-02-09 10:36:07.000000000 +0000
+++ source/arch/m68k/atari/hades-pci.c	2004-04-21 10:45:33.557601968 +0100
@@ -299,11 +299,11 @@ static int hades_write_config_dword(stru
 static void __init hades_fixup(int pci_modify)
 {
 	char irq_tab[4] = {
-			    IRQ_TT_MFP_IO0,	/* Slot 0. */
-			    IRQ_TT_MFP_IO1,	/* Slot 1. */
-			    IRQ_TT_MFP_SCC,	/* Slot 2. */
-			    IRQ_TT_MFP_SCSIDMA	/* Slot 3. */
-			  };
+		[0] = IRQ_TT_MFP_IO0,		/* Slot 0. */
+		[1] = IRQ_TT_MFP_IO1,		/* Slot 1. */
+		[2] = IRQ_TT_MFP_SCC,		/* Slot 2. */
+		[3] = IRQ_TT_MFP_SCSIDMA	/* Slot 3. */
+	};
 	struct pci_dev *dev = NULL;
 	unsigned char slot;
 
--- diff/arch/m68k/atari/stdma.c	2003-06-09 14:18:17.000000000 +0100
+++ source/arch/m68k/atari/stdma.c	2004-04-21 10:45:33.557601968 +0100
@@ -41,10 +41,10 @@
 #include <asm/io.h>
 #include <asm/irq.h>
 
-static int stdma_locked = 0;			/* the semaphore */
+static int stdma_locked;			/* the semaphore */
 						/* int func to be called */
-static irqreturn_t (*stdma_isr)(int, void *, struct pt_regs *) = NULL;
-static void *stdma_isr_data = NULL;		/* data passed to isr */
+static irqreturn_t (*stdma_isr)(int, void *, struct pt_regs *);
+static void *stdma_isr_data;			/* data passed to isr */
 static DECLARE_WAIT_QUEUE_HEAD(stdma_wait);	/* wait queue for ST-DMA */
 
 
--- diff/arch/m68k/atari/stram.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/m68k/atari/stram.c	2004-04-21 10:45:33.558601816 +0100
@@ -150,7 +150,7 @@ static void *stram_start, *stram_end;
 
 /* set after memory_init() executed and allocations via start_mem aren't
  * possible anymore */
-static int mem_init_done = 0;
+static int mem_init_done;
 
 /* set if kernel is in ST-RAM */
 static int kernel_in_stram;
@@ -170,7 +170,7 @@ typedef struct stram_block {
 #define BLOCK_INSWAP	0x10	/* block allocated in swap space */
 
 /* list of allocated blocks */
-static BLOCK *alloc_list = NULL;
+static BLOCK *alloc_list;
 
 /* We can't always use kmalloc() to allocate BLOCK structures, since
  * stram_alloc() can be called rather early. So we need some pool of
@@ -210,9 +210,9 @@ static DECLARE_MUTEX(stram_swap_sem);
 #define MAGIC_FILE_P	(struct file *)0xffffdead
 
 #ifdef DO_PROC
-static unsigned stat_swap_read = 0;
-static unsigned stat_swap_write = 0;
-static unsigned stat_swap_force = 0;
+static unsigned stat_swap_read;
+static unsigned stat_swap_write;
+static unsigned stat_swap_force;
 #endif /* DO_PROC */
 
 #endif /* CONFIG_STRAM_SWAP */
@@ -967,7 +967,7 @@ void __init stram_swap_setup(char *str, 
 /*								ST-RAM device								*/
 /* ------------------------------------------------------------------------ */
 
-static int refcnt = 0;
+static int refcnt;
 
 static void do_stram_request(request_queue_t *q)
 {
--- diff/arch/m68k/bvme6000/rtc.c	2004-02-09 10:36:07.000000000 +0000
+++ source/arch/m68k/bvme6000/rtc.c	2004-04-21 10:45:33.559601664 +0100
@@ -36,7 +36,7 @@
 static unsigned char days_in_mo[] =
 {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 
-static char rtc_status = 0;
+static char rtc_status;
 
 static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
 		     unsigned long arg)
--- diff/arch/m68k/hp300/ints.c	2003-06-09 14:18:17.000000000 +0100
+++ source/arch/m68k/hp300/ints.c	2004-04-21 10:45:33.559601664 +0100
@@ -37,7 +37,7 @@
  */
 
 /* we start with no entries in any list */
-static irq_node_t *hp300_irq_list[HP300_NUM_IRQS] = { [0 ... HP300_NUM_IRQS-1] = NULL };
+static irq_node_t *hp300_irq_list[HP300_NUM_IRQS];
 
 static spinlock_t irqlist_lock;
 
@@ -58,8 +58,13 @@ static irqreturn_t hp300_int_handler(int
 }
 
 irqreturn_t (*hp300_default_handler[SYS_IRQS])(int, void *, struct pt_regs *) = {
-	hp300_int_handler, hp300_int_handler, hp300_int_handler, hp300_int_handler,
-	hp300_int_handler, hp300_int_handler, hp300_int_handler, NULL
+	[0] = hp300_int_handler,
+	[1] = hp300_int_handler,
+	[2] = hp300_int_handler,
+	[3] = hp300_int_handler,
+	[4] = hp300_int_handler,
+	[5] = hp300_int_handler,
+	[6] = hp300_int_handler,
 };
 
 /* dev_id had better be unique to each handler because it's the only way we have
--- diff/arch/m68k/kernel/bios32.c	2002-11-11 11:09:42.000000000 +0000
+++ source/arch/m68k/kernel/bios32.c	2004-04-21 10:45:33.559601664 +0100
@@ -70,9 +70,9 @@ extern struct pci_bus_info *init_hades_p
 static struct pci_bus_info *bus_info;
 
 static int pci_modify = 1;		/* If set, layout the PCI bus ourself. */
-static int skip_vga = 0;		/* If set do not modify base addresses
+static int skip_vga;			/* If set do not modify base addresses
 					   of vga cards.*/
-static int disable_pci_burst = 0;	/* If set do not allow PCI bursts. */
+static int disable_pci_burst;		/* If set do not allow PCI bursts. */
 
 static unsigned int io_base;
 static unsigned int mem_base;
--- diff/arch/m68k/kernel/ints.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/m68k/kernel/ints.c	2004-04-21 10:45:33.560601512 +0100
@@ -48,8 +48,14 @@
 static irq_handler_t irq_list[SYS_IRQS];
 
 static const char *default_names[SYS_IRQS] = {
-	"spurious int", "int1 handler", "int2 handler", "int3 handler",
-	"int4 handler", "int5 handler", "int6 handler", "int7 handler"
+	[0] = "spurious int",
+	[1] = "int1 handler",
+	[2] = "int2 handler",
+	[3] = "int3 handler",
+	[4] = "int4 handler",
+	[5] = "int5 handler",
+	[6] = "int6 handler",
+	[7] = "int7 handler"
 };
 
 /* The number of spurious interrupts */
@@ -256,8 +262,8 @@ int show_interrupts(struct seq_file *p, 
 	int i = *(loff_t *) v;
 
 	/* autovector interrupts */
-	if (mach_default_handler) {
-		if (i < SYS_IRQS) {
+	if (i < SYS_IRQS) {
+		if (mach_default_handler) {
 			seq_printf(p, "auto %2d: %10u ", i,
 			               i ? kstat_cpu(0).irqs[i] : num_spurious);
 			seq_puts(p, "  ");
--- diff/arch/m68k/kernel/process.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/m68k/kernel/process.c	2004-04-21 10:45:33.560601512 +0100
@@ -65,8 +65,6 @@ asmlinkage void ret_from_fork(void);
  */
 unsigned long thread_saved_pc(struct task_struct *tsk)
 {
-	extern void scheduling_functions_start_here(void);
-	extern void scheduling_functions_end_here(void);
 	struct switch_stack *sw = (struct switch_stack *)tsk->thread.ksp;
 	/* Check whether the thread is blocked in resume() */
 	if (sw->retpc > (unsigned long)scheduling_functions_start_here &&
@@ -387,8 +385,6 @@ out:
 /*
  * These bracket the sleeping functions..
  */
-extern void scheduling_functions_start_here(void);
-extern void scheduling_functions_end_here(void);
 #define first_sched	((unsigned long) scheduling_functions_start_here)
 #define last_sched	((unsigned long) scheduling_functions_end_here)
 
@@ -403,11 +399,10 @@ unsigned long get_wchan(struct task_stru
 	stack_page = (unsigned long)(p->thread_info);
 	fp = ((struct switch_stack *)p->thread.ksp)->a6;
 	do {
-		if (fp < stack_page+sizeof(struct task_struct) ||
+		if (fp < stack_page+sizeof(struct thread_info) ||
 		    fp >= 8184+stack_page)
 			return 0;
 		pc = ((unsigned long *)fp)[1];
-		/* FIXME: This depends on the order of these functions. */
 		if (pc < first_sched || pc >= last_sched)
 			return pc;
 		fp = *(unsigned long *) fp;
--- diff/arch/m68k/kernel/ptrace.c	2003-06-09 14:18:17.000000000 +0100
+++ source/arch/m68k/kernel/ptrace.c	2004-04-21 10:45:33.561601360 +0100
@@ -46,11 +46,25 @@
    saved.  Notice that usp has no stack-slot and needs to be treated
    specially (see get_reg/put_reg below). */
 static int regoff[] = {
-	PT_REG(d1), PT_REG(d2), PT_REG(d3), PT_REG(d4),
-	PT_REG(d5), SW_REG(d6), SW_REG(d7), PT_REG(a0),
-	PT_REG(a1), PT_REG(a2), SW_REG(a3), SW_REG(a4),
-	SW_REG(a5), SW_REG(a6), PT_REG(d0), -1,
-	PT_REG(orig_d0), PT_REG(sr), PT_REG(pc),
+	[0]	= PT_REG(d1),
+	[1]	= PT_REG(d2),
+	[2]	= PT_REG(d3),
+	[3]	= PT_REG(d4),
+	[4]	= PT_REG(d5),
+	[5]	= SW_REG(d6),
+	[6]	= SW_REG(d7),
+	[7]	= PT_REG(a0),
+	[8]	= PT_REG(a1),
+	[9]	= PT_REG(a2),
+	[10]	= SW_REG(a3),
+	[11]	= SW_REG(a4),
+	[12]	= SW_REG(a5),
+	[13]	= SW_REG(a6),
+	[14]	= PT_REG(d0),
+	[15]	= -1,
+	[16]	= PT_REG(orig_d0),
+	[17]	= PT_REG(sr),
+	[18]	= PT_REG(pc),
 };
 
 /*
--- diff/arch/m68k/kernel/semaphore.c	2002-10-16 04:28:31.000000000 +0100
+++ source/arch/m68k/kernel/semaphore.c	2004-04-21 10:45:33.561601360 +0100
@@ -5,6 +5,7 @@
 
 #include <linux/config.h>
 #include <linux/sched.h>
+#include <linux/init.h>
 #include <asm/semaphore-helper.h>
 
 #ifndef CONFIG_RMW_INSNS
@@ -95,7 +96,7 @@ void __up(struct semaphore *sem)
 	current->state = TASK_RUNNING;		\
 	remove_wait_queue(&sem->wait, &wait);
 
-void __down(struct semaphore * sem)
+void __sched __down(struct semaphore * sem)
 {
 	DECLARE_WAITQUEUE(wait, current);
 
@@ -106,7 +107,7 @@ void __down(struct semaphore * sem)
 	DOWN_TAIL(TASK_UNINTERRUPTIBLE)
 }
 
-int __down_interruptible(struct semaphore * sem)
+int __sched __down_interruptible(struct semaphore * sem)
 {
 	DECLARE_WAITQUEUE(wait, current);
 	int ret = 0;
--- diff/arch/m68k/kernel/setup.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/m68k/kernel/setup.c	2004-04-21 10:45:33.561601360 +0100
@@ -49,17 +49,17 @@ unsigned long m68k_mmutype;
 unsigned long vme_brdtype;
 #endif
 
-int m68k_is040or060 = 0;
+int m68k_is040or060;
 
 extern int end;
 extern unsigned long availmem;
 
-int m68k_num_memory = 0;
-int m68k_realnum_memory = 0;
+int m68k_num_memory;
+int m68k_realnum_memory;
 unsigned long m68k_memoffset;
 struct mem_info m68k_memory[NUM_MEMINFO];
 
-static struct mem_info m68k_ramdisk = { 0, 0 };
+static struct mem_info m68k_ramdisk;
 
 static char m68k_command_line[CL_SIZE];
 char saved_command_line[CL_SIZE];
@@ -69,34 +69,34 @@ char m68k_debug_device[6] = "";
 void (*mach_sched_init) (irqreturn_t (*handler)(int, void *, struct pt_regs *)) __initdata = NULL;
 /* machine dependent irq functions */
 void (*mach_init_IRQ) (void) __initdata = NULL;
-irqreturn_t (*(*mach_default_handler)[]) (int, void *, struct pt_regs *) = NULL;
-void (*mach_get_model) (char *model) = NULL;
-int (*mach_get_hardware_list) (char *buffer) = NULL;
-int (*mach_get_irq_list) (struct seq_file *, void *) = NULL;
-irqreturn_t (*mach_process_int) (int, struct pt_regs *) = NULL;
+irqreturn_t (*(*mach_default_handler)[]) (int, void *, struct pt_regs *);
+void (*mach_get_model) (char *model);
+int (*mach_get_hardware_list) (char *buffer);
+int (*mach_get_irq_list) (struct seq_file *, void *);
+irqreturn_t (*mach_process_int) (int, struct pt_regs *);
 /* machine dependent timer functions */
 unsigned long (*mach_gettimeoffset) (void);
-int (*mach_hwclk) (int, struct rtc_time*) = NULL;
-int (*mach_set_clock_mmss) (unsigned long) = NULL;
-unsigned int (*mach_get_ss)(void) = NULL;
-int (*mach_get_rtc_pll)(struct rtc_pll_info *) = NULL;
-int (*mach_set_rtc_pll)(struct rtc_pll_info *) = NULL;
+int (*mach_hwclk) (int, struct rtc_time*);
+int (*mach_set_clock_mmss) (unsigned long);
+unsigned int (*mach_get_ss)(void);
+int (*mach_get_rtc_pll)(struct rtc_pll_info *);
+int (*mach_set_rtc_pll)(struct rtc_pll_info *);
 void (*mach_reset)( void );
-void (*mach_halt)( void ) = NULL;
-void (*mach_power_off)( void ) = NULL;
+void (*mach_halt)( void );
+void (*mach_power_off)( void );
 long mach_max_dma_address = 0x00ffffff; /* default set to the lower 16MB */
 #if defined(CONFIG_AMIGA_FLOPPY) || defined(CONFIG_ATARI_FLOPPY) 
 void (*mach_floppy_setup) (char *, int *) __initdata = NULL;
 #endif
 #ifdef CONFIG_HEARTBEAT
-void (*mach_heartbeat) (int) = NULL;
+void (*mach_heartbeat) (int);
 EXPORT_SYMBOL(mach_heartbeat);
 #endif
 #ifdef CONFIG_M68K_L2_CACHE
-void (*mach_l2_flush) (int) = NULL;
+void (*mach_l2_flush) (int);
 #endif
 #if defined(CONFIG_INPUT_M68K_BEEP) || defined(CONFIG_INPUT_M68K_BEEP_MODULE)
-void (*mach_beep)(unsigned int, unsigned int) = NULL;
+void (*mach_beep)(unsigned int, unsigned int);
 #endif
 #if defined(CONFIG_ISA) && defined(MULTI_ISA)
 int isa_type;
--- diff/arch/m68k/kernel/signal.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/m68k/kernel/signal.c	2004-04-21 10:45:33.562601208 +0100
@@ -54,22 +54,21 @@
 asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs);
 
 const int frame_extra_sizes[16] = {
-  0,
-  -1, /* sizeof(((struct frame *)0)->un.fmt1), */
-  sizeof(((struct frame *)0)->un.fmt2),
-  sizeof(((struct frame *)0)->un.fmt3),
-  sizeof(((struct frame *)0)->un.fmt4),
-  -1, /* sizeof(((struct frame *)0)->un.fmt5), */
-  -1, /* sizeof(((struct frame *)0)->un.fmt6), */
-  sizeof(((struct frame *)0)->un.fmt7),
-  -1, /* sizeof(((struct frame *)0)->un.fmt8), */
-  sizeof(((struct frame *)0)->un.fmt9),
-  sizeof(((struct frame *)0)->un.fmta),
-  sizeof(((struct frame *)0)->un.fmtb),
-  -1, /* sizeof(((struct frame *)0)->un.fmtc), */
-  -1, /* sizeof(((struct frame *)0)->un.fmtd), */
-  -1, /* sizeof(((struct frame *)0)->un.fmte), */
-  -1, /* sizeof(((struct frame *)0)->un.fmtf), */
+  [1]	= -1, /* sizeof(((struct frame *)0)->un.fmt1), */
+  [2]	= sizeof(((struct frame *)0)->un.fmt2),
+  [3]	= sizeof(((struct frame *)0)->un.fmt3),
+  [4]	= sizeof(((struct frame *)0)->un.fmt4),
+  [5]	= -1, /* sizeof(((struct frame *)0)->un.fmt5), */
+  [6]	= -1, /* sizeof(((struct frame *)0)->un.fmt6), */
+  [7]	= sizeof(((struct frame *)0)->un.fmt7),
+  [8]	= -1, /* sizeof(((struct frame *)0)->un.fmt8), */
+  [9]	= sizeof(((struct frame *)0)->un.fmt9),
+  [10]	= sizeof(((struct frame *)0)->un.fmta),
+  [11]	= sizeof(((struct frame *)0)->un.fmtb),
+  [12]	= -1, /* sizeof(((struct frame *)0)->un.fmtc), */
+  [13]	= -1, /* sizeof(((struct frame *)0)->un.fmtd), */
+  [14]	= -1, /* sizeof(((struct frame *)0)->un.fmte), */
+  [15]	= -1, /* sizeof(((struct frame *)0)->un.fmtf), */
 };
 
 /*
@@ -191,7 +190,7 @@ struct rt_sigframe
 };
 
 
-static unsigned char fpu_version = 0;	/* version number of fpu, set by setup_frame */
+static unsigned char fpu_version;	/* version number of fpu, set by setup_frame */
 
 static inline int restore_fpu_state(struct sigcontext *sc)
 {
--- diff/arch/m68k/kernel/time.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/m68k/kernel/time.c	2004-04-21 10:45:33.563601056 +0100
@@ -120,14 +120,28 @@ void do_gettimeofday(struct timeval *tv)
 	extern unsigned long wall_jiffies;
 	unsigned long seq;
 	unsigned long usec, sec, lost;
+	unsigned long max_ntp_tick = tick_usec - tickadj;
 
 	do {
 		seq = read_seqbegin_irqsave(&xtime_lock, flags);
 
 		usec = mach_gettimeoffset();
 		lost = jiffies - wall_jiffies;
-		if (lost)
-			usec += lost * (1000000/HZ);
+
+		/*
+		 * If time_adjust is negative then NTP is slowing the clock
+		 * so make sure not to go into next possible interval.
+		 * Better to lose some accuracy than have time go backwards..
+		 */
+		if (unlikely(time_adjust < 0)) {
+			usec = min(usec, max_ntp_tick);
+
+			if (lost)
+				usec += lost * max_ntp_tick;
+		}
+		else if (unlikely(lost))
+			usec += lost * tick_usec;
+
 		sec = xtime.tv_sec;
 		usec += xtime.tv_nsec/1000;
 	} while (read_seqretry_irqrestore(&xtime_lock, seq, flags));
--- diff/arch/m68k/kernel/traps.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/m68k/kernel/traps.c	2004-04-21 10:45:33.563601056 +0100
@@ -52,15 +52,52 @@ asmlinkage void fpu_emu(void);
 #endif
 
 e_vector vectors[256] = {
-	0, 0, buserr, trap, trap, trap, trap, trap,
-	trap, trap, trap, trap, trap, trap, trap, trap,
-	trap, trap, trap, trap, trap, trap, trap, trap,
-	inthandler, inthandler, inthandler, inthandler,
-	inthandler, inthandler, inthandler, inthandler,
-	/* TRAP #0-15 */
-	system_call, trap, trap, trap, trap, trap, trap, trap,
-	trap, trap, trap, trap, trap, trap, trap, trap,
-	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	[VEC_BUSERR]	= buserr,
+	[VEC_ADDRERR]	= trap,
+	[VEC_ILLEGAL]	= trap,
+	[VEC_ZERODIV]	= trap,
+	[VEC_CHK]	= trap,
+	[VEC_TRAP]	= trap,
+	[VEC_PRIV]	= trap,
+	[VEC_TRACE]	= trap,
+	[VEC_LINE10]	= trap,
+	[VEC_LINE11]	= trap,
+	[VEC_RESV12]	= trap,
+	[VEC_COPROC]	= trap,
+	[VEC_FORMAT]	= trap,
+	[VEC_UNINT]	= trap,
+	[VEC_RESV16]	= trap,
+	[VEC_RESV17]	= trap,
+	[VEC_RESV18]	= trap,
+	[VEC_RESV19]	= trap,
+	[VEC_RESV20]	= trap,
+	[VEC_RESV21]	= trap,
+	[VEC_RESV22]	= trap,
+	[VEC_RESV23]	= trap,
+	[VEC_SPUR]	= inthandler,
+	[VEC_INT1]	= inthandler,
+	[VEC_INT2]	= inthandler,
+	[VEC_INT3]	= inthandler,
+	[VEC_INT4]	= inthandler,
+	[VEC_INT5]	= inthandler,
+	[VEC_INT6]	= inthandler,
+	[VEC_INT7]	= inthandler,
+	[VEC_SYS]	= system_call,
+	[VEC_TRAP1]	= trap,
+	[VEC_TRAP2]	= trap,
+	[VEC_TRAP3]	= trap,
+	[VEC_TRAP4]	= trap,
+	[VEC_TRAP5]	= trap,
+	[VEC_TRAP6]	= trap,
+	[VEC_TRAP7]	= trap,
+	[VEC_TRAP8]	= trap,
+	[VEC_TRAP9]	= trap,
+	[VEC_TRAP10]	= trap,
+	[VEC_TRAP11]	= trap,
+	[VEC_TRAP12]	= trap,
+	[VEC_TRAP13]	= trap,
+	[VEC_TRAP14]	= trap,
+	[VEC_TRAP15]	= trap,
 };
 
 /* nmi handler for the Amiga */
@@ -160,39 +197,87 @@ void __init trap_init (void)
 }
 
 
-static char *vec_names[] = {
-	"RESET SP", "RESET PC", "BUS ERROR", "ADDRESS ERROR",
-	"ILLEGAL INSTRUCTION", "ZERO DIVIDE", "CHK", "TRAPcc",
-	"PRIVILEGE VIOLATION", "TRACE", "LINE 1010", "LINE 1111",
-	"UNASSIGNED RESERVED 12", "COPROCESSOR PROTOCOL VIOLATION",
-	"FORMAT ERROR", "UNINITIALIZED INTERRUPT",
-	"UNASSIGNED RESERVED 16", "UNASSIGNED RESERVED 17",
-	"UNASSIGNED RESERVED 18", "UNASSIGNED RESERVED 19",
-	"UNASSIGNED RESERVED 20", "UNASSIGNED RESERVED 21",
-	"UNASSIGNED RESERVED 22", "UNASSIGNED RESERVED 23",
-	"SPURIOUS INTERRUPT", "LEVEL 1 INT", "LEVEL 2 INT", "LEVEL 3 INT",
-	"LEVEL 4 INT", "LEVEL 5 INT", "LEVEL 6 INT", "LEVEL 7 INT",
-	"SYSCALL", "TRAP #1", "TRAP #2", "TRAP #3",
-	"TRAP #4", "TRAP #5", "TRAP #6", "TRAP #7",
-	"TRAP #8", "TRAP #9", "TRAP #10", "TRAP #11",
-	"TRAP #12", "TRAP #13", "TRAP #14", "TRAP #15",
-	"FPCP BSUN", "FPCP INEXACT", "FPCP DIV BY 0", "FPCP UNDERFLOW",
-	"FPCP OPERAND ERROR", "FPCP OVERFLOW", "FPCP SNAN",
-	"FPCP UNSUPPORTED OPERATION",
-	"MMU CONFIGURATION ERROR"
-	};
+static const char *vec_names[] = {
+	[VEC_RESETSP]	= "RESET SP",
+	[VEC_RESETPC]	= "RESET PC",
+	[VEC_BUSERR]	= "BUS ERROR",
+	[VEC_ADDRERR]	= "ADDRESS ERROR",
+	[VEC_ILLEGAL]	= "ILLEGAL INSTRUCTION",
+	[VEC_ZERODIV]	= "ZERO DIVIDE",
+	[VEC_CHK]	= "CHK",
+	[VEC_TRAP]	= "TRAPcc",
+	[VEC_PRIV]	= "PRIVILEGE VIOLATION",
+	[VEC_TRACE]	= "TRACE",
+	[VEC_LINE10]	= "LINE 1010",
+	[VEC_LINE11]	= "LINE 1111",
+	[VEC_RESV12]	= "UNASSIGNED RESERVED 12",
+	[VEC_COPROC]	= "COPROCESSOR PROTOCOL VIOLATION",
+	[VEC_FORMAT]	= "FORMAT ERROR",
+	[VEC_UNINT]	= "UNINITIALIZED INTERRUPT",
+	[VEC_RESV16]	= "UNASSIGNED RESERVED 16",
+	[VEC_RESV17]	= "UNASSIGNED RESERVED 17",
+	[VEC_RESV18]	= "UNASSIGNED RESERVED 18",
+	[VEC_RESV19]	= "UNASSIGNED RESERVED 19",
+	[VEC_RESV20]	= "UNASSIGNED RESERVED 20",
+	[VEC_RESV21]	= "UNASSIGNED RESERVED 21",
+	[VEC_RESV22]	= "UNASSIGNED RESERVED 22",
+	[VEC_RESV23]	= "UNASSIGNED RESERVED 23",
+	[VEC_SPUR]	= "SPURIOUS INTERRUPT",
+	[VEC_INT1]	= "LEVEL 1 INT",
+	[VEC_INT2]	= "LEVEL 2 INT",
+	[VEC_INT3]	= "LEVEL 3 INT",
+	[VEC_INT4]	= "LEVEL 4 INT",
+	[VEC_INT5]	= "LEVEL 5 INT",
+	[VEC_INT6]	= "LEVEL 6 INT",
+	[VEC_INT7]	= "LEVEL 7 INT",
+	[VEC_SYS]	= "SYSCALL",
+	[VEC_TRAP1]	= "TRAP #1",
+	[VEC_TRAP2]	= "TRAP #2",
+	[VEC_TRAP3]	= "TRAP #3",
+	[VEC_TRAP4]	= "TRAP #4",
+	[VEC_TRAP5]	= "TRAP #5",
+	[VEC_TRAP6]	= "TRAP #6",
+	[VEC_TRAP7]	= "TRAP #7",
+	[VEC_TRAP8]	= "TRAP #8",
+	[VEC_TRAP9]	= "TRAP #9",
+	[VEC_TRAP10]	= "TRAP #10",
+	[VEC_TRAP11]	= "TRAP #11",
+	[VEC_TRAP12]	= "TRAP #12",
+	[VEC_TRAP13]	= "TRAP #13",
+	[VEC_TRAP14]	= "TRAP #14",
+	[VEC_TRAP15]	= "TRAP #15",
+	[VEC_FPBRUC]	= "FPCP BSUN",
+	[VEC_FPIR]	= "FPCP INEXACT",
+	[VEC_FPDIVZ]	= "FPCP DIV BY 0",
+	[VEC_FPUNDER]	= "FPCP UNDERFLOW",
+	[VEC_FPOE]	= "FPCP OPERAND ERROR",
+	[VEC_FPOVER]	= "FPCP OVERFLOW",
+	[VEC_FPNAN]	= "FPCP SNAN",
+	[VEC_FPUNSUP]	= "FPCP UNSUPPORTED OPERATION",
+	[VEC_MMUCFG]	= "MMU CONFIGURATION ERROR",
+	[VEC_MMUILL]	= "MMU ILLEGAL OPERATION ERROR",
+	[VEC_MMUACC]	= "MMU ACCESS LEVEL VIOLATION ERROR",
+	[VEC_RESV59]	= "UNASSIGNED RESERVED 59",
+	[VEC_UNIMPEA]	= "UNASSIGNED RESERVED 60",
+	[VEC_UNIMPII]	= "UNASSIGNED RESERVED 61",
+	[VEC_RESV62]	= "UNASSIGNED RESERVED 62",
+	[VEC_RESV63]	= "UNASSIGNED RESERVED 63",
+};
 
+static const char *space_names[] = {
+	[0]		= "Space 0",
+	[USER_DATA]	= "User Data",
+	[USER_PROGRAM]	= "User Program",
 #ifndef CONFIG_SUN3
-static char *space_names[] = {
-	"Space 0", "User Data", "User Program", "Space 3",
-	"Space 4", "Super Data", "Super Program", "CPU"
-	};
+	[3]		= "Space 3",
 #else
-static char *space_names[] = {
-	"Space 0", "User Data", "User Program", "Control",
-	"Space 4", "Super Data", "Super Program", "CPU"
-	};
+	[FC_CONTROL]	= "Control",
 #endif
+	[4]		= "Space 4",
+	[SUPER_DATA]	= "Super Data",
+	[SUPER_PROGRAM]	= "Super Program",
+	[CPU_SPACE]	= "CPU"
+};
 
 void die_if_kernel(char *,struct pt_regs *,int);
 asmlinkage int do_page_fault(struct pt_regs *regs, unsigned long address,
--- diff/arch/m68k/kernel/vmlinux-std.lds	2003-09-17 12:28:02.000000000 +0100
+++ source/arch/m68k/kernel/vmlinux-std.lds	2004-04-21 10:45:33.564600904 +0100
@@ -12,6 +12,7 @@ SECTIONS
   _text = .;			/* Text and read-only data */
   .text : {
 	*(.text)
+	SCHED_TEXT
 	*(.fixup)
 	*(.gnu.warning)
 	} = 0x4e75
--- diff/arch/m68k/kernel/vmlinux-sun3.lds	2003-09-17 12:28:02.000000000 +0100
+++ source/arch/m68k/kernel/vmlinux-sun3.lds	2004-04-21 10:45:33.564600904 +0100
@@ -13,6 +13,7 @@ SECTIONS
   .text : {
 	*(.head)
 	*(.text)
+	SCHED_TEXT
 	*(.fixup)
 	*(.gnu.warning)
 	} = 0x4e75
--- diff/arch/m68k/mac/config.c	2004-02-09 10:36:07.000000000 +0000
+++ source/arch/m68k/mac/config.c	2004-04-21 10:45:33.565600752 +0100
@@ -46,7 +46,7 @@
 
 /* Mac bootinfo struct */
 
-struct mac_booter_data mac_bi_data = {0,};
+struct mac_booter_data mac_bi_data;
 int mac_bisize = sizeof mac_bi_data;
 
 struct mac_hw_present mac_hw_present;
@@ -276,17 +276,54 @@ static struct mac_model mac_data_table[]
 	 *	We'll pretend to be a Macintosh II, that's pretty safe.
 	 */
 
-	{	MAC_MODEL_II,	"Unknown",	MAC_ADB_II,	MAC_VIA_II,	MAC_SCSI_OLD,	MAC_IDE_NONE,	MAC_SCC_II,	MAC_ETHER_NONE,	MAC_NUBUS},
+	{
+		.ident		= MAC_MODEL_II,
+		.name		= "Unknown",
+		.adb_type	= MAC_ADB_II,
+		.via_type	= MAC_VIA_II,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_II,
+		.nubus_type	= MAC_NUBUS
+	},
 
 	/*
 	 *	Original MacII hardware
 	 *	
 	 */
 	 
-	{	MAC_MODEL_II,	"II",		MAC_ADB_II,	MAC_VIA_II,	MAC_SCSI_OLD,	MAC_IDE_NONE,	MAC_SCC_II,	MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_IIX,	"IIx",		MAC_ADB_II,	MAC_VIA_II,	MAC_SCSI_OLD,	MAC_IDE_NONE,	MAC_SCC_II,	MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_IICX,	"IIcx",		MAC_ADB_II,	MAC_VIA_II,	MAC_SCSI_OLD,	MAC_IDE_NONE,	MAC_SCC_II,	MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_SE30, "SE/30",	MAC_ADB_II,	MAC_VIA_II,	MAC_SCSI_OLD,	MAC_IDE_NONE,	MAC_SCC_II,	MAC_ETHER_NONE,	MAC_NUBUS},
+	{
+		.ident		= MAC_MODEL_II,
+		.name		= "II",
+		.adb_type	= MAC_ADB_II,
+		.via_type	= MAC_VIA_II,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_II,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_IIX,
+		.name		= "IIx",
+		.adb_type	= MAC_ADB_II,
+		.via_type	= MAC_VIA_II,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_II,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_IICX,
+		.name		= "IIcx",
+		.adb_type	= MAC_ADB_II,
+		.via_type	= MAC_VIA_II,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_II,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_SE30,
+		.name		= "SE/30",
+		.adb_type	= MAC_ADB_II,
+		.via_type	= MAC_VIA_II,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_II,
+		.nubus_type	= MAC_NUBUS
+	},
 	
 	/*
 	 *	Weirdified MacII hardware - all subtley different. Gee thanks
@@ -295,26 +332,98 @@ static struct mac_model mac_data_table[]
 	 * CSA: see http://developer.apple.com/technotes/hw/hw_09.html
 	 */
 
-	{	MAC_MODEL_IICI,	"IIci",	MAC_ADB_II,	MAC_VIA_IIci,	MAC_SCSI_OLD,	MAC_IDE_NONE,	MAC_SCC_II,	MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_IIFX,	"IIfx",	MAC_ADB_IOP,	MAC_VIA_IIci,	MAC_SCSI_OLD,	MAC_IDE_NONE,	MAC_SCC_IOP,	MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_IISI, "IIsi",	MAC_ADB_IISI,	MAC_VIA_IIci,	MAC_SCSI_OLD,	MAC_IDE_NONE,	MAC_SCC_II,	MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_IIVI,	"IIvi",	MAC_ADB_IISI,	MAC_VIA_IIci,	MAC_SCSI_OLD,	MAC_IDE_NONE,	MAC_SCC_II,	MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_IIVX,	"IIvx",	MAC_ADB_IISI,	MAC_VIA_IIci,	MAC_SCSI_OLD,	MAC_IDE_NONE,	MAC_SCC_II,	MAC_ETHER_NONE,	MAC_NUBUS},
+	{
+		.ident		= MAC_MODEL_IICI,
+		.name		= "IIci",
+		.adb_type	= MAC_ADB_II,
+		.via_type	= MAC_VIA_IIci,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_II,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_IIFX,
+		.name		= "IIfx",
+		.adb_type	= MAC_ADB_IOP,
+		.via_type	= MAC_VIA_IIci,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_IOP,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_IISI,
+		.name		= "IIsi",
+		.adb_type	= MAC_ADB_IISI,
+		.via_type	= MAC_VIA_IIci,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_II,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_IIVI,
+		.name		= "IIvi",
+		.adb_type	= MAC_ADB_IISI,
+		.via_type	= MAC_VIA_IIci,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_II,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_IIVX,
+		.name		= "IIvx",
+		.adb_type	= MAC_ADB_IISI,
+		.via_type	= MAC_VIA_IIci,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_II,
+		.nubus_type	= MAC_NUBUS
+	},
 	
 	/*
 	 *	Classic models (guessing: similar to SE/30 ?? Nope, similar to LC ...)
 	 */
 
-	{	MAC_MODEL_CLII, "Classic II",		MAC_ADB_IISI,	MAC_VIA_IIci,	MAC_SCSI_OLD,	MAC_IDE_NONE,	MAC_SCC_II,     MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_CCL,  "Color Classic",	MAC_ADB_CUDA,	MAC_VIA_IIci,	MAC_SCSI_OLD,	MAC_IDE_NONE,	MAC_SCC_II,     MAC_ETHER_NONE,	MAC_NUBUS},
+	{
+		.ident		= MAC_MODEL_CLII,
+		.name		= "Classic II",
+		.adb_type	= MAC_ADB_IISI,
+		.via_type	= MAC_VIA_IIci,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_II,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_CCL,
+		.name		= "Color Classic",
+		.adb_type	= MAC_ADB_CUDA,
+		.via_type	= MAC_VIA_IIci,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_II,
+		.nubus_type	= MAC_NUBUS},
 
 	/*
 	 *	Some Mac LC machines. Basically the same as the IIci, ADB like IIsi
 	 */
 	
-	{	MAC_MODEL_LC,	"LC",	  MAC_ADB_IISI,	MAC_VIA_IIci,	MAC_SCSI_OLD,	MAC_IDE_NONE,	MAC_SCC_II,	MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_LCII,	"LC II",  MAC_ADB_IISI,	MAC_VIA_IIci,	MAC_SCSI_OLD,	MAC_IDE_NONE,	MAC_SCC_II,	MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_LCIII,"LC III", MAC_ADB_IISI,	MAC_VIA_IIci,	MAC_SCSI_OLD,	MAC_IDE_NONE,	MAC_SCC_II,	MAC_ETHER_NONE,	MAC_NUBUS},
+	{
+		.ident		= MAC_MODEL_LC,
+		.name		= "LC",
+		.adb_type	= MAC_ADB_IISI,
+		.via_type	= MAC_VIA_IIci,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_II,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_LCII,
+		.name		= "LC II",
+		.adb_type	= MAC_ADB_IISI,
+		.via_type	= MAC_VIA_IIci,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_II,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_LCIII,
+		.name		= "LC III",
+		.adb_type	= MAC_ADB_IISI,
+		.via_type	= MAC_VIA_IIci,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_II,
+		.nubus_type	= MAC_NUBUS
+	},
 
 	/*
 	 *	Quadra. Video is at 0xF9000000, via is like a MacII. We label it differently 
@@ -326,41 +435,215 @@ static struct mac_model mac_data_table[]
 	 *	the 660AV).
 	 */	 
 	 
-	{	MAC_MODEL_Q605, "Quadra 605", MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_QUADRA,  MAC_IDE_NONE,   MAC_SCC_QUADRA,	MAC_ETHER_NONE,		MAC_NUBUS},
-	{	MAC_MODEL_Q605_ACC, "Quadra 605", MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_QUADRA,  MAC_IDE_NONE,   MAC_SCC_QUADRA,	MAC_ETHER_NONE,		MAC_NUBUS},
-	{	MAC_MODEL_Q610, "Quadra 610", MAC_ADB_II,   MAC_VIA_QUADRA, MAC_SCSI_QUADRA,  MAC_IDE_NONE,   MAC_SCC_QUADRA,	MAC_ETHER_SONIC,	MAC_NUBUS},
-	{	MAC_MODEL_Q630, "Quadra 630", MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_QUADRA,  MAC_IDE_QUADRA, MAC_SCC_QUADRA,	MAC_ETHER_SONIC,	MAC_NUBUS},
- 	{	MAC_MODEL_Q650, "Quadra 650", MAC_ADB_II,   MAC_VIA_QUADRA, MAC_SCSI_QUADRA,  MAC_IDE_NONE,   MAC_SCC_QUADRA,	MAC_ETHER_SONIC,	MAC_NUBUS},
+	{
+		.ident		= MAC_MODEL_Q605,
+		.name		= "Quadra 605",
+		.adb_type	= MAC_ADB_CUDA,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_QUADRA,
+		.scc_type	= MAC_SCC_QUADRA,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_Q605_ACC,
+		.name		= "Quadra 605",
+		.adb_type	= MAC_ADB_CUDA,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_QUADRA,
+		.scc_type	= MAC_SCC_QUADRA,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_Q610,
+		.name		= "Quadra 610",
+		.adb_type	= MAC_ADB_II,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_QUADRA,
+		.scc_type	= MAC_SCC_QUADRA,
+		.ether_type	= MAC_ETHER_SONIC,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_Q630,
+		.name		= "Quadra 630",
+		.adb_type	= MAC_ADB_CUDA,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_QUADRA,
+		.ide_type	= MAC_IDE_QUADRA,
+		.scc_type	= MAC_SCC_QUADRA,
+		.ether_type	= MAC_ETHER_SONIC,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_Q650,
+		.name		= "Quadra 650",
+		.adb_type	= MAC_ADB_II,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_QUADRA,
+		.scc_type	= MAC_SCC_QUADRA,
+		.ether_type	= MAC_ETHER_SONIC,
+		.nubus_type	= MAC_NUBUS
+	},
 	/*	The Q700 does have a NS Sonic */
-	{	MAC_MODEL_Q700, "Quadra 700", MAC_ADB_II,   MAC_VIA_QUADRA, MAC_SCSI_QUADRA2, MAC_IDE_NONE,   MAC_SCC_QUADRA,	MAC_ETHER_SONIC,	MAC_NUBUS},
-	{	MAC_MODEL_Q800, "Quadra 800", MAC_ADB_II,   MAC_VIA_QUADRA, MAC_SCSI_QUADRA,  MAC_IDE_NONE,   MAC_SCC_QUADRA,	MAC_ETHER_SONIC,	MAC_NUBUS},
-	{	MAC_MODEL_Q840, "Quadra 840AV", MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_QUADRA3, MAC_IDE_NONE, MAC_SCC_PSC,	MAC_ETHER_MACE,		MAC_NUBUS},
-	{	MAC_MODEL_Q900, "Quadra 900", MAC_ADB_IOP, MAC_VIA_QUADRA, MAC_SCSI_QUADRA2, MAC_IDE_NONE,   MAC_SCC_IOP,	MAC_ETHER_SONIC,	MAC_NUBUS},
-	{	MAC_MODEL_Q950, "Quadra 950", MAC_ADB_IOP, MAC_VIA_QUADRA, MAC_SCSI_QUADRA2, MAC_IDE_NONE,   MAC_SCC_IOP,	MAC_ETHER_SONIC,	MAC_NUBUS},
+	{
+		.ident		= MAC_MODEL_Q700,
+		.name		= "Quadra 700",
+		.adb_type	= MAC_ADB_II,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_QUADRA2,
+		.scc_type	= MAC_SCC_QUADRA,
+		.ether_type	= MAC_ETHER_SONIC,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_Q800,
+		.name		= "Quadra 800",
+		.adb_type	= MAC_ADB_II,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_QUADRA,
+		.scc_type	= MAC_SCC_QUADRA,
+		.ether_type	= MAC_ETHER_SONIC,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_Q840,
+		.name		= "Quadra 840AV",
+		.adb_type	= MAC_ADB_CUDA,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_QUADRA3,
+		.scc_type	= MAC_SCC_PSC,
+		.ether_type	= MAC_ETHER_MACE,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_Q900,
+		.name		= "Quadra 900",
+		.adb_type	= MAC_ADB_IOP,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_QUADRA2,
+		.scc_type	= MAC_SCC_IOP,
+		.ether_type	= MAC_ETHER_SONIC,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_Q950,
+		.name		= "Quadra 950",
+		.adb_type	= MAC_ADB_IOP,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_QUADRA2,
+		.scc_type	= MAC_SCC_IOP,
+		.ether_type	= MAC_ETHER_SONIC,
+		.nubus_type	= MAC_NUBUS
+	},
 
 	/* 
 	 *	Performa - more LC type machines
 	 */
 
-	{	MAC_MODEL_P460,  "Performa 460", MAC_ADB_IISI, MAC_VIA_IIci,   MAC_SCSI_OLD, 	MAC_IDE_NONE,   MAC_SCC_II,	MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_P475,  "Performa 475", MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_QUADRA, MAC_IDE_NONE,   MAC_SCC_II,	MAC_ETHER_NONE, MAC_NUBUS},
-	{	MAC_MODEL_P475F, "Performa 475", MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_QUADRA, MAC_IDE_NONE,   MAC_SCC_II,	MAC_ETHER_NONE, MAC_NUBUS},
-	{	MAC_MODEL_P520,  "Performa 520", MAC_ADB_CUDA, MAC_VIA_IIci,   MAC_SCSI_OLD,    MAC_IDE_NONE,   MAC_SCC_II,	MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_P550,  "Performa 550", MAC_ADB_CUDA, MAC_VIA_IIci,   MAC_SCSI_OLD,    MAC_IDE_NONE,   MAC_SCC_II,	MAC_ETHER_NONE,	MAC_NUBUS},
+	{
+		.ident		= MAC_MODEL_P460,
+		.name		=  "Performa 460",
+		.adb_type	= MAC_ADB_IISI,
+		.via_type	= MAC_VIA_IIci,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_II,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_P475,
+		.name		=  "Performa 475",
+		.adb_type	= MAC_ADB_CUDA,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_QUADRA,
+		.scc_type	= MAC_SCC_II,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_P475F,
+		.name		=  "Performa 475",
+		.adb_type	= MAC_ADB_CUDA,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_QUADRA,
+		.scc_type	= MAC_SCC_II,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_P520,
+		.name		=  "Performa 520",
+		.adb_type	= MAC_ADB_CUDA,
+		.via_type	= MAC_VIA_IIci,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_II,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_P550,
+		.name		=  "Performa 550",
+		.adb_type	= MAC_ADB_CUDA,
+		.via_type	= MAC_VIA_IIci,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_II,
+		.nubus_type	= MAC_NUBUS
+	},
 	/* These have the comm slot, and therefore the possibility of SONIC ethernet */
-	{	MAC_MODEL_P575,  "Performa 575", MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_QUADRA, MAC_IDE_NONE,   MAC_SCC_II,	MAC_ETHER_SONIC, MAC_NUBUS},
-	{	MAC_MODEL_P588,  "Performa 588", MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_QUADRA, MAC_IDE_QUADRA, MAC_SCC_II,	MAC_ETHER_SONIC, MAC_NUBUS},
-	{	MAC_MODEL_TV,    "TV",           MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_OLD,	MAC_IDE_NONE,   MAC_SCC_II,	MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_P600,  "Performa 600", MAC_ADB_IISI, MAC_VIA_IIci,   MAC_SCSI_OLD,	MAC_IDE_NONE,   MAC_SCC_II,	MAC_ETHER_NONE,	MAC_NUBUS},
+	{
+		.ident		= MAC_MODEL_P575,
+		.name		= "Performa 575",
+		.adb_type	= MAC_ADB_CUDA,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_QUADRA,
+		.scc_type	= MAC_SCC_II,
+		.ether_type	= MAC_ETHER_SONIC,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_P588,
+		.name		= "Performa 588",
+		.adb_type	= MAC_ADB_CUDA,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_QUADRA,
+		.ide_type	= MAC_IDE_QUADRA,
+		.scc_type	= MAC_SCC_II,
+		.ether_type	= MAC_ETHER_SONIC,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_TV,
+		.name		= "TV",
+		.adb_type	= MAC_ADB_CUDA,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_II,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_P600,
+		.name		= "Performa 600",
+		.adb_type	= MAC_ADB_IISI,
+		.via_type	= MAC_VIA_IIci,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_II,
+		.nubus_type	= MAC_NUBUS
+	},
 
 	/*
 	 *	Centris - just guessing again; maybe like Quadra
 	 */
 
 	/* The C610 may or may not have SONIC.  We probe to make sure */
-	{	MAC_MODEL_C610, "Centris 610",   MAC_ADB_II,   MAC_VIA_QUADRA, MAC_SCSI_QUADRA,  MAC_IDE_NONE, MAC_SCC_QUADRA,	MAC_ETHER_SONIC,	MAC_NUBUS},
-	{	MAC_MODEL_C650, "Centris 650",   MAC_ADB_II,   MAC_VIA_QUADRA, MAC_SCSI_QUADRA,  MAC_IDE_NONE, MAC_SCC_QUADRA,	MAC_ETHER_SONIC,	MAC_NUBUS},
-	{	MAC_MODEL_C660, "Centris 660AV", MAC_ADB_CUDA, MAC_VIA_QUADRA, MAC_SCSI_QUADRA3, MAC_IDE_NONE, MAC_SCC_PSC,	MAC_ETHER_MACE,		MAC_NUBUS},
+	{
+		.ident		= MAC_MODEL_C610,
+		.name		= "Centris 610",
+		.adb_type	= MAC_ADB_II,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_QUADRA,
+		.scc_type	= MAC_SCC_QUADRA,
+		.ether_type	= MAC_ETHER_SONIC,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_C650,
+		.name		= "Centris 650",
+		.adb_type	= MAC_ADB_II,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_QUADRA,
+		.scc_type	= MAC_SCC_QUADRA,
+		.ether_type	= MAC_ETHER_SONIC,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_C660,
+		.name		= "Centris 660AV",
+		.adb_type	= MAC_ADB_CUDA,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_QUADRA3,
+		.scc_type	= MAC_SCC_PSC,
+		.ether_type	= MAC_ETHER_MACE,
+		.nubus_type	= MAC_NUBUS
+	},
 
 	/*
 	 * The PowerBooks all the same "Combo" custom IC for SCSI and SCC
@@ -368,17 +651,98 @@ static struct mac_model mac_data_table[]
 	 * Quadra-style VIAs. A few models also have IDE from hell.
 	 */
 
-	{	MAC_MODEL_PB140,  "PowerBook 140",   MAC_ADB_PB1, MAC_VIA_QUADRA, MAC_SCSI_OLD,  MAC_IDE_NONE,	 MAC_SCC_QUADRA, MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_PB145,  "PowerBook 145",   MAC_ADB_PB1, MAC_VIA_QUADRA, MAC_SCSI_OLD,  MAC_IDE_NONE,	 MAC_SCC_QUADRA, MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_PB150,  "PowerBook 150",   MAC_ADB_PB1, MAC_VIA_IIci,   MAC_SCSI_OLD,  MAC_IDE_PB,	 MAC_SCC_QUADRA, MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_PB160,  "PowerBook 160",   MAC_ADB_PB1, MAC_VIA_QUADRA, MAC_SCSI_OLD,  MAC_IDE_NONE,	 MAC_SCC_QUADRA, MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_PB165,  "PowerBook 165",   MAC_ADB_PB1, MAC_VIA_QUADRA, MAC_SCSI_OLD,  MAC_IDE_NONE,	 MAC_SCC_QUADRA, MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_PB165C, "PowerBook 165c",  MAC_ADB_PB1, MAC_VIA_QUADRA, MAC_SCSI_OLD,  MAC_IDE_NONE,	 MAC_SCC_QUADRA, MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_PB170,  "PowerBook 170",   MAC_ADB_PB1, MAC_VIA_QUADRA, MAC_SCSI_OLD,  MAC_IDE_NONE,	 MAC_SCC_QUADRA, MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_PB180,  "PowerBook 180",   MAC_ADB_PB1, MAC_VIA_QUADRA, MAC_SCSI_OLD,  MAC_IDE_NONE,	 MAC_SCC_QUADRA, MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_PB180C, "PowerBook 180c",  MAC_ADB_PB1, MAC_VIA_QUADRA, MAC_SCSI_OLD,  MAC_IDE_NONE,	 MAC_SCC_QUADRA, MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_PB190,  "PowerBook 190",   MAC_ADB_PB2, MAC_VIA_QUADRA, MAC_SCSI_OLD,  MAC_IDE_BABOON, MAC_SCC_QUADRA, MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_PB520,  "PowerBook 520",   MAC_ADB_PB2, MAC_VIA_QUADRA, MAC_SCSI_OLD,  MAC_IDE_NONE,	 MAC_SCC_QUADRA, MAC_ETHER_SONIC, MAC_NUBUS},
+	{
+		.ident		= MAC_MODEL_PB140,
+		.name		= "PowerBook 140",
+		.adb_type	= MAC_ADB_PB1,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_QUADRA,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_PB145,
+		.name		= "PowerBook 145",
+		.adb_type	= MAC_ADB_PB1,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_QUADRA,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_PB150,
+		.name		= "PowerBook 150",
+		.adb_type	= MAC_ADB_PB1,
+		.via_type	= MAC_VIA_IIci,
+		.scsi_type	= MAC_SCSI_OLD,
+		.ide_type	= MAC_IDE_PB,
+		.scc_type	= MAC_SCC_QUADRA,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_PB160,
+		.name		= "PowerBook 160",
+		.adb_type	= MAC_ADB_PB1,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_QUADRA,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_PB165,
+		.name		= "PowerBook 165",
+		.adb_type	= MAC_ADB_PB1,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_QUADRA,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_PB165C,
+		.name		= "PowerBook 165c",
+		.adb_type	= MAC_ADB_PB1,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_QUADRA,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_PB170,
+		.name		= "PowerBook 170",
+		.adb_type	= MAC_ADB_PB1,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_QUADRA,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_PB180,
+		.name		= "PowerBook 180",
+		.adb_type	= MAC_ADB_PB1,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_QUADRA,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_PB180C,
+		.name		= "PowerBook 180c",
+		.adb_type	= MAC_ADB_PB1,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_QUADRA,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_PB190,
+		.name		= "PowerBook 190",
+		.adb_type	= MAC_ADB_PB2,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_OLD,
+		.ide_type	= MAC_IDE_BABOON,
+		.scc_type	= MAC_SCC_QUADRA,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_PB520,
+		.name		= "PowerBook 520",
+		.adb_type	= MAC_ADB_PB2,
+		.via_type	= MAC_VIA_QUADRA,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_QUADRA,
+		.ether_type	= MAC_ETHER_SONIC,
+		.nubus_type	= MAC_NUBUS
+	},
 
 	/*
 	 * PowerBook Duos are pretty much like normal PowerBooks
@@ -390,17 +754,62 @@ static struct mac_model mac_data_table[]
 	 * the other PowerBooks which would imply MAC_VIA_QUADRA.
 	 */
 
-	{	MAC_MODEL_PB210,  "PowerBook Duo 210",  MAC_ADB_PB2,  MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_QUADRA,	MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_PB230,  "PowerBook Duo 230",  MAC_ADB_PB2,  MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_QUADRA,	MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_PB250,  "PowerBook Duo 250",  MAC_ADB_PB2,  MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_QUADRA,	MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_PB270C, "PowerBook Duo 270c", MAC_ADB_PB2,  MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_QUADRA,	MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_PB280,  "PowerBook Duo 280",  MAC_ADB_PB2,  MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_QUADRA,	MAC_ETHER_NONE,	MAC_NUBUS},
-	{	MAC_MODEL_PB280C, "PowerBook Duo 280c", MAC_ADB_PB2,  MAC_VIA_IIci, MAC_SCSI_OLD, MAC_IDE_NONE, MAC_SCC_QUADRA,	MAC_ETHER_NONE,	MAC_NUBUS},
+	{
+		.ident		= MAC_MODEL_PB210,
+		.name		= "PowerBook Duo 210",
+		.adb_type	= MAC_ADB_PB2,
+		.via_type	= MAC_VIA_IIci,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_QUADRA,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_PB230,
+		.name		= "PowerBook Duo 230",
+		.adb_type	= MAC_ADB_PB2,
+		.via_type	= MAC_VIA_IIci,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_QUADRA,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_PB250,
+		.name		= "PowerBook Duo 250",
+		.adb_type	= MAC_ADB_PB2,
+		.via_type	= MAC_VIA_IIci,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_QUADRA,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_PB270C,
+		.name		= "PowerBook Duo 270c",
+		.adb_type	= MAC_ADB_PB2,
+		.via_type	= MAC_VIA_IIci,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_QUADRA,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_PB280,
+		.name		= "PowerBook Duo 280",
+		.adb_type	= MAC_ADB_PB2,
+		.via_type	= MAC_VIA_IIci,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_QUADRA,
+		.nubus_type	= MAC_NUBUS
+	}, {
+		.ident		= MAC_MODEL_PB280C,
+		.name		= "PowerBook Duo 280c",
+		.adb_type	= MAC_ADB_PB2,
+		.via_type	= MAC_VIA_IIci,
+		.scsi_type	= MAC_SCSI_OLD,
+		.scc_type	= MAC_SCC_QUADRA,
+		.nubus_type	= MAC_NUBUS
+	},
 
 	/*
 	 *	Other stuff ??
 	 */
-	{	-1, NULL, 0,0,0,}
+	{
+		.ident		= -1
+	}
 };
 
 void mac_identify(void)
--- diff/arch/m68k/mac/debug.c	2002-10-16 04:29:05.000000000 +0100
+++ source/arch/m68k/mac/debug.c	2004-04-21 10:45:33.566600600 +0100
@@ -151,10 +151,10 @@ struct mac_SCC
 # define scc (*((volatile struct mac_SCC*)mac_bi_data.sccbase))
 
 /* Flag that serial port is already initialized and used */
-int mac_SCC_init_done = 0;
+int mac_SCC_init_done;
 /* Can be set somewhere, if a SCC master reset has already be done and should
  * not be repeated; used by kgdb */
-int mac_SCC_reset_done = 0;
+int mac_SCC_reset_done;
 
 static int scc_port = -1;
 
--- diff/arch/m68k/mac/macboing.c	2003-01-02 10:43:02.000000000 +0000
+++ source/arch/m68k/mac/macboing.c	2004-04-21 10:45:33.566600600 +0100
@@ -15,7 +15,7 @@
 #include <asm/macintosh.h>
 #include <asm/mac_asc.h>
 
-static int mac_asc_inited = 0;
+static int mac_asc_inited;
 /*
  * dumb triangular wave table
  */
@@ -39,7 +39,7 @@ static volatile __u8* mac_asc_regs = ( v
  * sample rate; is this a good default value? 
  */
 static unsigned long mac_asc_samplespersec = 11050;  
-static int mac_bell_duration = 0;
+static int mac_bell_duration;
 static unsigned long mac_bell_phase; /* 0..2*Pi -> 0..0x800 (wavetable size) */
 static unsigned long mac_bell_phasepersample;
 
@@ -51,7 +51,7 @@ static void mac_nosound( unsigned long )
 static void mac_quadra_start_bell( unsigned int, unsigned int, unsigned int );
 static void mac_quadra_ring_bell( unsigned long );
 static void mac_av_start_bell( unsigned int, unsigned int, unsigned int );
-static void ( *mac_special_bell )( unsigned int, unsigned int, unsigned int ) = NULL;
+static void ( *mac_special_bell )( unsigned int, unsigned int, unsigned int );
 
 /*
  * our timer to start/continue/stop the bell
--- diff/arch/m68k/mac/macints.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/m68k/mac/macints.c	2004-04-21 10:45:33.567600448 +0100
@@ -644,7 +644,7 @@ void mac_default_handler(int irq, void *
 #endif
 }
 
-static int num_debug[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+static int num_debug[8];
 
 irqreturn_t mac_debug_handler(int irq, void *dev_id, struct pt_regs *regs)
 {
@@ -655,8 +655,8 @@ irqreturn_t mac_debug_handler(int irq, v
 	return IRQ_HANDLED;
 }
 
-static int in_nmi = 0;
-static volatile int nmi_hold = 0;
+static int in_nmi;
+static volatile int nmi_hold;
 
 irqreturn_t mac_nmi_handler(int irq, void *dev_id, struct pt_regs *fp)
 {
--- diff/arch/m68k/mac/via.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/m68k/mac/via.c	2004-04-21 10:45:33.567600448 +0100
@@ -61,7 +61,7 @@ static int gIER,gIFR,gBufA,gBufB;
 #define MAC_CLOCK_LOW		(MAC_CLOCK_TICK&0xFF)
 #define MAC_CLOCK_HIGH		(MAC_CLOCK_TICK>>8)
 
-static int  nubus_active = 0;
+static int  nubus_active;
 
 void via_debug_dump(void);
 irqreturn_t via1_irq(int, void *, struct pt_regs *);
--- diff/arch/m68k/mm/kmap.c	2002-10-16 04:27:56.000000000 +0100
+++ source/arch/m68k/mm/kmap.c	2004-04-21 10:45:33.567600448 +0100
@@ -52,7 +52,7 @@ static inline void free_io_area(void *ad
 
 #define IO_SIZE		(256*1024)
 
-static struct vm_struct *iolist = NULL;
+static struct vm_struct *iolist;
 
 static struct vm_struct *get_io_area(unsigned long size)
 {
--- diff/arch/m68k/mm/memory.c	2003-08-20 14:16:08.000000000 +0100
+++ source/arch/m68k/mm/memory.c	2004-04-21 10:45:33.568600296 +0100
@@ -29,8 +29,8 @@
 typedef struct list_head ptable_desc;
 static LIST_HEAD(ptable_list);
 
-#define PD_PTABLE(page) ((ptable_desc *)&(virt_to_page(page)->list))
-#define PD_PAGE(ptable) (list_entry(ptable, struct page, list))
+#define PD_PTABLE(page) ((ptable_desc *)&(virt_to_page(page)->lru))
+#define PD_PAGE(ptable) (list_entry(ptable, struct page, lru))
 #define PD_MARKBITS(dp) (*(unsigned char *)&PD_PAGE(dp)->index)
 
 #define PTABLE_SIZE (PTRS_PER_PMD * sizeof(pmd_t))
--- diff/arch/m68k/mm/motorola.c	2004-02-09 10:36:07.000000000 +0000
+++ source/arch/m68k/mm/motorola.c	2004-04-21 10:45:33.568600296 +0100
@@ -40,7 +40,7 @@
  * For 68020/030 this is 0.
  * For 68040, this is _PAGE_CACHE040 (cachable, copyback)
  */
-unsigned long mm_cachebits = 0;
+unsigned long mm_cachebits;
 EXPORT_SYMBOL(mm_cachebits);
 #endif
 
--- diff/arch/m68k/mvme16x/rtc.c	2004-02-09 10:36:07.000000000 +0000
+++ source/arch/m68k/mvme16x/rtc.c	2004-04-21 10:45:33.568600296 +0100
@@ -33,7 +33,7 @@
 #define BCD2BIN(val) (((val)&15) + ((val)>>4)*10)
 #define BIN2BCD(val) ((((val)/10)<<4) + (val)%10)
 
-static unsigned char days_in_mo[] =
+static const unsigned char days_in_mo[] =
 {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 
 static atomic_t rtc_ready = ATOMIC_INIT(1);
--- diff/arch/m68k/q40/q40ints.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/m68k/q40/q40ints.c	2004-04-21 10:45:33.569600144 +0100
@@ -423,8 +423,14 @@ static irqreturn_t default_handler(int l
 }
 
 irqreturn_t (*q40_default_handler[SYS_IRQS])(int, void *, struct pt_regs *) = {
-	 default_handler, default_handler, default_handler, default_handler,
-	 default_handler, default_handler, default_handler, default_handler
+	 [0] = default_handler,
+	 [1] = default_handler,
+	 [2] = default_handler,
+	 [3] = default_handler,
+	 [4] = default_handler,
+	 [5] = default_handler,
+	 [6] = default_handler,
+	 [7] = default_handler
 };
 
 
--- diff/arch/m68k/sun3/leds.c	2002-10-16 04:27:12.000000000 +0100
+++ source/arch/m68k/sun3/leds.c	2004-04-21 10:45:33.569600144 +0100
@@ -1,9 +1,6 @@
 #include <asm/contregs.h>
 #include <asm/sun3mmu.h>
 #include <asm/io.h>
-#include <asm/movs.h>
-
-#define FC_CONTROL 3    /* This should go somewhere else... */
 
 void sun3_leds(unsigned char byte)
 {
--- diff/arch/m68k/sun3/mmu_emu.c	2002-11-11 11:09:42.000000000 +0000
+++ source/arch/m68k/sun3/mmu_emu.c	2004-04-21 10:45:33.570599992 +0100
@@ -45,15 +45,17 @@ extern void prom_reboot (char *) __attri
 ** Globals
 */
 
-unsigned long vmalloc_end = 0;
+unsigned long vmalloc_end;
 unsigned long pmeg_vaddr[PMEGS_NUM];
 unsigned char pmeg_alloc[PMEGS_NUM];
 unsigned char pmeg_ctx[PMEGS_NUM];
 
 /* pointers to the mm structs for each task in each
    context. 0xffffffff is a marker for kernel context */
-struct mm_struct *ctx_alloc[CONTEXTS_NUM] = {(struct mm_struct *)0xffffffff, 
-					     0, 0, 0, 0, 0, 0, 0};
+struct mm_struct *ctx_alloc[CONTEXTS_NUM] = {
+    [0] = (struct mm_struct *)0xffffffff
+};
+
 /* has this context been mmdrop'd? */
 static unsigned char ctx_avail = CONTEXTS_NUM-1;
 
--- diff/arch/m68k/sun3/sun3dvma.c	2003-05-21 11:49:54.000000000 +0100
+++ source/arch/m68k/sun3/sun3dvma.c	2004-04-21 10:45:33.570599992 +0100
@@ -47,10 +47,10 @@ static struct hole initholes[64];
 
 #ifdef DVMA_DEBUG
 
-static unsigned long dvma_allocs = 0;
-static unsigned long dvma_frees = 0;
-static unsigned long long dvma_alloc_bytes = 0;
-static unsigned long long dvma_free_bytes = 0;
+static unsigned long dvma_allocs;
+static unsigned long dvma_frees;
+static unsigned long long dvma_alloc_bytes;
+static unsigned long long dvma_free_bytes;
 
 static void print_use(void) 
 {
--- diff/arch/m68k/sun3/sun3ints.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/m68k/sun3/sun3ints.c	2004-04-21 10:45:33.570599992 +0100
@@ -94,15 +94,24 @@ static irqreturn_t sun3_int5(int irq, vo
 /* handle requested ints, excepting 5 and 7, which always do the same
    thing */
 irqreturn_t (*sun3_default_handler[SYS_IRQS])(int, void *, struct pt_regs *) = {
-	sun3_inthandle, sun3_inthandle, sun3_inthandle, sun3_inthandle,
-	sun3_inthandle, sun3_int5, sun3_inthandle, sun3_int7
+	[0] = sun3_inthandle,
+	[1] = sun3_inthandle,
+	[2] = sun3_inthandle,
+	[3] = sun3_inthandle,
+	[4] = sun3_inthandle,
+	[5] = sun3_int5,
+	[6] = sun3_inthandle,
+	[7] = sun3_int7
 };
 
-static const char *dev_names[SYS_IRQS] = { NULL, NULL, NULL, NULL, 
-				     NULL, "timer", NULL, "int7 handler" };
+static const char *dev_names[SYS_IRQS] = {
+	[5] = "timer",
+	[7] = "int7 handler"
+};
 static void *dev_ids[SYS_IRQS];
 static irqreturn_t (*sun3_inthandler[SYS_IRQS])(int, void *, struct pt_regs *) = {
-	NULL, NULL, NULL, NULL, NULL, sun3_int5, NULL, sun3_int7
+	[5] = sun3_int5,
+	[7] = sun3_int7
 };
 static irqreturn_t (*sun3_vechandler[SUN3_INT_VECS])(int, void *, struct pt_regs *);
 static void *vec_ids[SUN3_INT_VECS];
--- diff/arch/m68k/sun3x/prom.c	2003-05-21 11:50:14.000000000 +0100
+++ source/arch/m68k/sun3x/prom.c	2004-04-21 10:45:33.571599840 +0100
@@ -31,8 +31,6 @@ struct linux_romvec *romvec;
 /* prom vector table */
 e_vector *sun3x_prom_vbr;
 
-extern e_vector vectors[256];  /* arch/m68k/kernel/traps.c */
-
 /* Handle returning to the prom */
 void sun3x_halt(void)
 {
--- diff/arch/m68knommu/Kconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/m68knommu/Kconfig	2004-04-21 10:45:33.571599840 +0100
@@ -171,6 +171,11 @@ config CLOCK_60MHz
 	help
 	  Select an 60MHz CPU clock frequency.
 
+config CLOCK_64MHz
+	bool "64MHz"
+	help
+	  Select an 64MHz CPU clock frequency.
+
 config CLOCK_66MHz
 	bool "66MHz"
 	help
@@ -282,12 +287,24 @@ config M5272C3
 	help
 	  Support for the Motorola M5272C3 board.
 
+config COBRA5272
+	bool "senTec COBRA5272 board support"
+	depends on M5272
+	help
+	  Support for the senTec COBRA5272 board.
+
 config M5282C3
 	bool "Motorola M5282C3 board support"
 	depends on M5282
 	help
 	  Support for the Motorola M5282C3 board.
 
+config COBRA5282
+	bool "senTec COBRA5282 board support"
+	depends on M5282
+	help
+	  Support for the senTec COBRA5282 board.
+
 config ARN5307
 	bool "Arnewsh 5307 board support"
 	depends on M5307
@@ -358,6 +375,11 @@ config MOTOROLA
 	default y
 	depends on (M5206eC3 || M5249C3 || M5272C3 || M5282C3 || M5307C3 || M5407C3)
 
+config senTec
+	bool
+	default y
+	depends on (COBRA5272 || COBRA5282)
+
 config LARGE_ALLOCS
 	bool "Allow allocating large blocks (> 1MB) of memory"
 	help
@@ -485,56 +507,10 @@ config PM
 
 endmenu
 
-
-source "drivers/base/Kconfig"
-
-source "drivers/mtd/Kconfig"
-
-source "drivers/parport/Kconfig"
-
-source "drivers/pnp/Kconfig"
-
-source "drivers/block/Kconfig"
-
-source "drivers/ide/Kconfig"
-
-source "drivers/scsi/Kconfig"
-
-source "drivers/cdrom/Kconfig"
-
-source "drivers/md/Kconfig"
-
-source "drivers/message/fusion/Kconfig"
-
-source "drivers/ieee1394/Kconfig"
-
-source "drivers/message/i2o/Kconfig"
-
-source "net/Kconfig"
-
-source "drivers/isdn/Kconfig"
-
-source "drivers/telephony/Kconfig"
-
-#
-# input before char - char/joystick depends on it. As does USB.
-#
-source "drivers/input/Kconfig"
-
-source "drivers/char/Kconfig"
-
-#source drivers/misc/Config.in
-source "drivers/media/Kconfig"
+source "drivers/Kconfig"
 
 source "fs/Kconfig"
 
-source "drivers/video/Kconfig"
-
-source "sound/Kconfig"
-
-source "drivers/usb/Kconfig"
-
-
 menu "Kernel hacking"
 
 config FULLDEBUG
@@ -542,6 +518,14 @@ config FULLDEBUG
 	help
 	  Enable debuging symbols on kernel build.
 
+config FRAME_POINTER
+	bool "Compile the kernel with frame pointers"
+	help
+	  If you say Y here the resulting kernel image will be slightly larger
+	  and slower, but it will give very useful debugging information.
+	  If you don't debug the kernel, you can say N, but we may not be able
+	  to solve problems without frame pointers.
+
 config MAGIC_SYSRQ
 	bool "Magic SysRq key"
 	help
--- diff/arch/m68knommu/Makefile	2003-08-20 14:16:08.000000000 +0100
+++ source/arch/m68knommu/Makefile	2004-04-21 10:45:33.572599688 +0100
@@ -33,6 +33,7 @@ board-$(CONFIG_eLIA)		:= eLIA
 board-$(CONFIG_NETtel)		:= NETtel
 board-$(CONFIG_SECUREEDGEMP3)	:= MP3
 board-$(CONFIG_CLEOPATRA)	:= CLEOPATRA
+board-$(CONFIG_senTec) 	:= senTec
 BOARD := $(board-y)
 
 model-$(CONFIG_RAMKERNEL)	:= ram
--- diff/arch/m68knommu/kernel/Makefile	2004-02-09 10:36:07.000000000 +0000
+++ source/arch/m68knommu/kernel/Makefile	2004-04-21 10:45:33.572599688 +0100
@@ -4,7 +4,7 @@
 
 extra-y := vmlinux.lds.s
 
-obj-y += entry.o init_task.o m68k_ksyms.o process.o ptrace.o semaphore.o \
+obj-y += dma.o entry.o init_task.o m68k_ksyms.o process.o ptrace.o semaphore.o \
 	 setup.o signal.o syscalltable.o sys_m68k.o time.o traps.o
 
 obj-$(CONFIG_MODULES)	+= module.o
--- diff/arch/m68knommu/kernel/comempci.c	2003-05-21 11:49:50.000000000 +0100
+++ source/arch/m68knommu/kernel/comempci.c	2004-04-21 10:45:33.573599536 +0100
@@ -89,7 +89,7 @@ void pci_resetbus(void)
 	int	i;
 
 #ifdef DEBUGPCI
-	printk("pci_resetbus()\n");
+	printk(KERN_DEBUG "pci_resetbus()\n");
 #endif
 
 	*((volatile unsigned short *) (MCF_MBAR+MCFSIM_PADDR)) |= eLIA_PCIRESET;
@@ -113,7 +113,7 @@ int pcibios_assign_resource_slot(int slo
 	int			bar;
 
 #ifdef DEBUGPCI
-	printk("pcibios_assign_resource_slot(slot=%x)\n", slot);
+	printk(KERN_INFO "pcibios_assign_resource_slot(slot=%x)\n", slot);
 #endif
 
 	rp = (volatile unsigned long *) COMEM_BASE;
@@ -125,9 +125,9 @@ int pcibios_assign_resource_slot(int slo
 		rp[LREG(COMEM_DAHBASE)] = COMEM_DA_CFGRD | idsel;
 		val = rp[LREG(addr)];
 #ifdef DEBUGRES
-		printk("-----------------------------------"
+		printk(KERN_DEBUG "-----------------------------------"
 			"-------------------------------------\n");
-		printk("BAR[%d]: read=%08x ", bar, val);
+		printk(KERN_DEBUG "BAR[%d]: read=%08x ", bar, val);
 #endif
 
 		rp[LREG(COMEM_DAHBASE)] = COMEM_DA_CFGWR | idsel;
@@ -136,11 +136,11 @@ int pcibios_assign_resource_slot(int slo
 		rp[LREG(COMEM_DAHBASE)] = COMEM_DA_CFGRD | idsel;
 		val = rp[LREG(addr)];
 #ifdef DEBUGRES
-		printk("write=%08x ", val);
+		printk(KERN_DEBUG "write=%08x ", val);
 #endif
 		if (val == 0) {
 #ifdef DEBUGRES
-			printk("\n");
+			printk(KERN_DEBUG "\n");
 #endif
 			continue;
 		}
@@ -153,7 +153,7 @@ int pcibios_assign_resource_slot(int slo
 		}
 
 #ifdef DEBUGRES
-		printk("size=%08x(%d)\n", (0x1 << i), i);
+		printk(KERN_DEBUG "size=%08x(%d)\n", (0x1 << i), i);
 #endif
 		i = 0x1 << i;
 
@@ -162,14 +162,14 @@ int pcibios_assign_resource_slot(int slo
 			if (i < PCI_MINIO)
 				i = PCI_MINIO;
 #ifdef DEBUGRES
-			printk("BAR[%d]: IO size=%08x iobase=%08x\n",
+			printk(KERN_DEBUG "BAR[%d]: IO size=%08x iobase=%08x\n",
 				bar, i, pci_iobase);
 #endif
 			if (i > 0xffff) {
 				/* Invalid size?? */
 				val = 0 | PCI_BASE_ADDRESS_SPACE_IO;
 #ifdef DEBUGRES
-				printk("BAR[%d]: too big for IO??\n", bar);
+				printk(KERN_DEBUG "BAR[%d]: too big for IO??\n", bar);
 #endif
 			} else {
 				/* Check for un-alignment */
@@ -182,7 +182,7 @@ int pcibios_assign_resource_slot(int slo
 			if (i < PCI_MINMEM)
 				i = PCI_MINMEM;
 #ifdef DEBUGRES
-			printk("BAR[%d]: MEMORY size=%08x membase=%08x\n",
+			printk(KERN_DEBUG "BAR[%d]: MEMORY size=%08x membase=%08x\n",
 				bar, i, pci_membase);
 #endif
 			/* Check for un-alignment */
@@ -196,12 +196,12 @@ int pcibios_assign_resource_slot(int slo
 		rp[LREG(COMEM_DAHBASE)] = COMEM_DA_CFGWR | idsel;
 		rp[LREG(addr)] = val;
 #ifdef DEBUGRES
-		printk("BAR[%d]: assigned bar=%08x\n", bar, val);
+		printk(KERN_DEBUG "BAR[%d]: assigned bar=%08x\n", bar, val);
 #endif
 	}
 
 #ifdef DEBUGRES
-	printk("-----------------------------------"
+	printk(KERN_DEBUG "-----------------------------------"
 			"-------------------------------------\n");
 #endif
 
@@ -215,7 +215,7 @@ int pcibios_assign_resource_slot(int slo
 		addr = (PCI_INTERRUPT_LINE & 0xfc)+(~PCI_INTERRUPT_LINE & 0x03);
 		ip[addr] = 25;
 #ifdef DEBUGRES
-		printk("IRQ LINE=25\n");
+		printk(KERN_DEBUG "IRQ LINE=25\n");
 #endif
 	}
 
@@ -232,7 +232,7 @@ int pcibios_enable_slot(int slot)
 	unsigned short		cmd;
 
 #ifdef DEBUGPCI
-	printk("pcibios_enbale_slot(slot=%x)\n", slot);
+	printk(KERN_DEBUG "pcibios_enbale_slot(slot=%x)\n", slot);
 #endif
 
 	rp = (volatile unsigned long *) COMEM_BASE;
@@ -273,7 +273,7 @@ void pcibios_assign_resources(void)
 		rp[LREG(COMEM_PCIBUS)] = 0; /* Clear bus */
 		id = rp[LREG(COMEM_PCIBUS)];
 		if ((id != 0) && ((id & 0xffff0000) != (sel & 0xffff0000))) {
-			printk("PCI: slot=%d id=%08x\n", slot, (int) id);
+			printk(KERN_INFO "PCI: slot=%d id=%08x\n", slot, (int) id);
 			pci_slotmask |= 0x1 << slot;
 			pcibios_assign_resource_slot(slot);
 			pcibios_enable_slot(slot);
@@ -290,7 +290,7 @@ int pcibios_init(void)
 	int			slot;
 
 #ifdef DEBUGPCI
-	printk("pcibios_init()\n");
+	printk(KERN_DEBUG "pcibios_init()\n");
 #endif
 
 	pci_resetbus();
@@ -302,7 +302,7 @@ int pcibios_init(void)
 	 */
 	rp = (volatile unsigned long *) COMEM_BASE;
 	if ((rp[LREG(COMEM_LBUSCFG)] & 0xff) != 0x50) {
-		printk("PCI: no PCI bus present\n");
+		printk(KERN_INFO "PCI: no PCI bus present\n");
 		return(0);
 	}
 
@@ -317,11 +317,11 @@ int pcibios_init(void)
 	rp[LREG(COMEM_PCIBUS)] = 0; /* Clear bus */
 	id = rp[LREG(COMEM_PCIBUS)];
 	if ((id == 0) || ((id & 0xffff0000) == (sel & 0xffff0000))) {
-		printk("PCI: no PCI bus bridge present\n");
+		printk(KERN_INFO "PCI: no PCI bus bridge present\n");
 		return(0);
 	}
 
-	printk("PCI: bridge device at slot=%d id=%08x\n", slot, (int) id);
+	printk(KERN_INFO "PCI: bridge device at slot=%d id=%08x\n", slot, (int) id);
 	pci_slotmask |= 0x1 << slot;
 	pci_shmemaddr = pci_membase;
 	pcibios_assign_resource_slot(slot);
@@ -332,7 +332,7 @@ int pcibios_init(void)
 
 	/* Get PCI irq for local vectoring */
 	if (request_irq(COMEM_IRQ, pci_interrupt, 0, "PCI bridge", NULL)) {
-		printk("PCI: failed to acquire interrupt %d\n", COMEM_IRQ);
+		printk(KERN_WARNING "PCI: failed to acquire interrupt %d\n", COMEM_IRQ);
 	} else {
 		mcf_autovector(COMEM_IRQ);
 	}
@@ -379,7 +379,7 @@ int pcibios_enable_device(struct pci_dev
 
 void pcibios_update_resource(struct pci_dev *dev, struct resource *root, struct resource *r, int resource)
 {
-	printk("%s(%d): no support for changing PCI resources...\n",
+	printk(KERN_WARNING "%s(%d): no support for changing PCI resources...\n",
 		__FILE__, __LINE__);
 }
 
@@ -401,7 +401,7 @@ void pci_outb(unsigned char val, unsigne
 	volatile unsigned char	*bp;
 
 #ifdef DEBUGIO
-	printk("pci_outb(val=%02x,addr=%x)\n", val, addr);
+	printk(KERN_DEBUG "pci_outb(val=%02x,addr=%x)\n", val, addr);
 #endif
 
 	rp = (volatile unsigned long *) COMEM_BASE;
@@ -419,7 +419,7 @@ void pci_outw(unsigned short val, unsign
 	volatile unsigned short	*sp;
 
 #ifdef DEBUGIO
-	printk("pci_outw(val=%04x,addr=%x)", val, addr);
+	printk(KERN_DEBUG "pci_outw(val=%04x,addr=%x)", val, addr);
 #endif
 
 	rp = (volatile unsigned long *) COMEM_BASE;
@@ -439,7 +439,7 @@ void pci_outl(unsigned int val, unsigned
 	volatile unsigned int	*lp;
 
 #ifdef DEBUGIO
-	printk("pci_outl(val=%08x,addr=%x)\n", val, addr);
+	printk(KERN_DEBUG "pci_outl(val=%08x,addr=%x)\n", val, addr);
 #endif
 
 	rp = (volatile unsigned long *) COMEM_BASE;
@@ -470,7 +470,7 @@ unsigned char pci_inb(unsigned int addr)
 	unsigned char		val;
 
 #ifdef DEBUGIO
-	printk("pci_inb(addr=%x)", addr);
+	printk(KERN_DEBUG "pci_inb(addr=%x)", addr);
 #endif
 
 	rp = (volatile unsigned long *) COMEM_BASE;
@@ -501,7 +501,7 @@ unsigned short pci_inw(unsigned int addr
 	unsigned short		val;
 
 #ifdef DEBUGIO
-	printk("pci_inw(addr=%x)", addr);
+	printk(KERN_DEBUG "pci_inw(addr=%x)", addr);
 #endif
 
 	rp = (volatile unsigned long *) COMEM_BASE;
@@ -514,7 +514,7 @@ unsigned short pci_inw(unsigned int addr
 	if (pci_byteswap)
 		val = ((val & 0xff) << 8) | ((val >> 8) & 0xff);
 #ifdef DEBUGIO
-	printk("=%04x\n", val);
+	printk(KERN_DEBUG "=%04x\n", val);
 #endif
 	return(val);
 }
@@ -528,7 +528,7 @@ unsigned int pci_inl(unsigned int addr)
 	unsigned int		val;
 
 #ifdef DEBUGIO
-	printk("pci_inl(addr=%x)", addr);
+	printk(KERN_DEBUG "pci_inl(addr=%x)", addr);
 #endif
 
 	rp = (volatile unsigned long *) COMEM_BASE;
@@ -541,7 +541,7 @@ unsigned int pci_inl(unsigned int addr)
 			((val & 0x00ff0000) >> 8) | (val >> 24);
 
 #ifdef DEBUGIO
-	printk("=%08x\n", val);
+	printk(KERN_DEBUG "=%08x\n", val);
 #endif
 	return(val);
 }
@@ -556,7 +556,7 @@ void pci_outsb(void *addr, void *buf, in
 	unsigned int		a = (unsigned int) addr;
 
 #ifdef DEBUGIO
-	printk("pci_outsb(addr=%x,buf=%x,len=%d)\n", (int)addr, (int)buf, len);
+	printk(KERN_DEBUG "pci_outsb(addr=%x,buf=%x,len=%d)\n", (int)addr, (int)buf, len);
 #endif
 
 	rp = (volatile unsigned long *) COMEM_BASE;
@@ -580,7 +580,7 @@ void pci_outsw(void *addr, void *buf, in
 	unsigned int		a = (unsigned int) addr;
 
 #ifdef DEBUGIO
-	printk("pci_outsw(addr=%x,buf=%x,len=%d)\n", (int)addr, (int)buf, len);
+	printk(KERN_DEBUG "pci_outsw(addr=%x,buf=%x,len=%d)\n", (int)addr, (int)buf, len);
 #endif
 
 	rp = (volatile unsigned long *) COMEM_BASE;
@@ -608,7 +608,7 @@ void pci_outsl(void *addr, void *buf, in
 	unsigned int		a = (unsigned int) addr;
 
 #ifdef DEBUGIO
-	printk("pci_outsl(addr=%x,buf=%x,len=%d)\n", (int)addr, (int)buf, len);
+	printk(KERN_DEBUG "pci_outsl(addr=%x,buf=%x,len=%d)\n", (int)addr, (int)buf, len);
 #endif
 
 	rp = (volatile unsigned long *) COMEM_BASE;
@@ -636,7 +636,7 @@ void pci_insb(void *addr, void *buf, int
 	unsigned int		a = (unsigned int) addr;
 
 #ifdef DEBUGIO
-	printk("pci_insb(addr=%x,buf=%x,len=%d)\n", (int)addr, (int)buf, len);
+	printk(KERN_DEBUG "pci_insb(addr=%x,buf=%x,len=%d)\n", (int)addr, (int)buf, len);
 #endif
 
 	rp = (volatile unsigned long *) COMEM_BASE;
@@ -660,7 +660,7 @@ void pci_insw(void *addr, void *buf, int
 	unsigned int		a = (unsigned int) addr;
 
 #ifdef DEBUGIO
-	printk("pci_insw(addr=%x,buf=%x,len=%d)\n", (int)addr, (int)buf, len);
+	printk(KERN_DEBUG "pci_insw(addr=%x,buf=%x,len=%d)\n", (int)addr, (int)buf, len);
 #endif
 
 	rp = (volatile unsigned long *) COMEM_BASE;
@@ -688,7 +688,7 @@ void pci_insl(void *addr, void *buf, int
 	unsigned int		a = (unsigned int) addr;
 
 #ifdef DEBUGIO
-	printk("pci_insl(addr=%x,buf=%x,len=%d)\n", (int)addr, (int)buf, len);
+	printk(KERN_DEBUG "pci_insl(addr=%x,buf=%x,len=%d)\n", (int)addr, (int)buf, len);
 #endif
 
 	rp = (volatile unsigned long *) COMEM_BASE;
@@ -725,7 +725,7 @@ int pci_request_irq(unsigned int irq,
 	int	i;
 
 #ifdef DEBUGIO
-	printk("pci_request_irq(irq=%d,handler=%x,flags=%x,device=%s,"
+	printk(KERN_DEBUG "pci_request_irq(irq=%d,handler=%x,flags=%x,device=%s,"
 		"dev_id=%x)\n", irq, (int) handler, (int) flags, device,
 		(int) dev_id);
 #endif
@@ -757,7 +757,7 @@ void pci_free_irq(unsigned int irq, void
 	int	i;
 
 #ifdef DEBUGIO
-	printk("pci_free_irq(irq=%d,dev_id=%x)\n", irq, (int) dev_id);
+	printk(KERN_DEBUG "pci_free_irq(irq=%d,dev_id=%x)\n", irq, (int) dev_id);
 #endif
 
 	if (dev_id == (void *) NULL)
@@ -781,7 +781,7 @@ void pci_interrupt(int irq, void *id, st
 	int	i;
 
 #ifdef DEBUGIO
-	printk("pci_interrupt(irq=%d,id=%x,fp=%x)\n", irq, (int) id, (int) fp);
+	printk(KERN_DEBUG "pci_interrupt(irq=%d,id=%x,fp=%x)\n", irq, (int) id, (int) fp);
 #endif
 
 	for (i = 0; (i < COMEM_MAXPCI); i++) {
@@ -809,7 +809,7 @@ void *pci_bmalloc(int size)
 	int	i, j, nrslots;
 
 #ifdef DEBUGIO
-	printk("pci_bmalloc(size=%d)\n", size);
+	printk(KERN_DEBUG "pci_bmalloc(size=%d)\n", size);
 #endif
 
 	if (size <= 0)
@@ -841,7 +841,7 @@ void pci_bmfree(void *mp, int size)
 	int	i, j, nrslots;
 
 #ifdef DEBUGIO
-	printk("pci_bmfree(mp=%x,size=%d)\n", (int) mp, size);
+	printk(KERN_DEBUG "pci_bmfree(mp=%x,size=%d)\n", (int) mp, size);
 #endif
 
 	nrslots = size / PCI_MEMSLOTSIZE;
@@ -859,12 +859,12 @@ unsigned long pci_virt_to_bus(volatile v
 	unsigned long	l;
 
 #ifdef DEBUGIO
-	printk("pci_virt_to_bus(address=%x)", (int) address);
+	printk(KERN_DEBUG "pci_virt_to_bus(address=%x)", (int) address);
 #endif
 
 	l = ((unsigned long) address) - COMEM_BASE;
 #ifdef DEBUGIO
-	printk("=%x\n", (int) (l+pci_shmemaddr));
+	printk(KERN_DEBUG "=%x\n", (int) (l+pci_shmemaddr));
 #endif
 	return(l + pci_shmemaddr);
 }
@@ -876,12 +876,12 @@ void *pci_bus_to_virt(unsigned long addr
 	unsigned long	l;
 
 #ifdef DEBUGIO
-	printk("pci_bus_to_virt(address=%x)", (int) address);
+	printk(KERN_DEBUG "pci_bus_to_virt(address=%x)", (int) address);
 #endif
 
 	l = address - pci_shmemaddr;
 #ifdef DEBUGIO
-	printk("=%x\n", (int) (address + COMEM_BASE));
+	printk(KERN_DEBUG "=%x\n", (int) (address + COMEM_BASE));
 #endif
 	return((void *) (address + COMEM_BASE));
 }
@@ -895,7 +895,7 @@ void pci_bmcpyto(void *dst, void *src, i
 	int		i, j;
 
 #ifdef DEBUGIO
-	printk("pci_bmcpyto(dst=%x,src=%x,len=%d)\n", (int)dst, (int)src, len);
+	printk(KERN_DEBUG "pci_bmcpyto(dst=%x,src=%x,len=%d)\n", (int)dst, (int)src, len);
 #endif
 
 	dp = (unsigned long *) dst;
@@ -903,13 +903,13 @@ void pci_bmcpyto(void *dst, void *src, i
 	i = len >> 2;
 
 #if 0
-	printk("DATA:");
+	printk(KERN_INFO "DATA:");
 	scp = (unsigned char *) sp;
 	for (i = 0; (i < len); i++) {
-		if ((i % 16) == 0) printk("\n%04x: ", i);
-		printk("%02x ", *scp++);
+		if ((i % 16) == 0) printk(KERN_INFO "\n%04x: ", i);
+		printk(KERN_INFO "%02x ", *scp++);
 	}
-	printk("\n");
+	printk(KERN_INFO "\n");
 #endif
 
 	for (j = 0; (i >= 0); i--, j++) {
@@ -936,7 +936,7 @@ void pci_bmcpyfrom(void *dst, void *src,
 	int		i;
 
 #ifdef DEBUGIO
-	printk("pci_bmcpyfrom(dst=%x,src=%x,len=%d)\n",(int)dst,(int)src,len);
+	printk(KERN_DEBUG "pci_bmcpyfrom(dst=%x,src=%x,len=%d)\n",(int)dst,(int)src,len);
 #endif
 
 	dp = (unsigned long *) dst;
@@ -958,13 +958,13 @@ void pci_bmcpyfrom(void *dst, void *src,
 	}
 
 #if 0
-	printk("DATA:");
+	printk(KERN_INFO "DATA:");
 	dcp = (unsigned char *) dst;
 	for (i = 0; (i < len); i++) {
-		if ((i % 16) == 0) printk("\n%04x: ", i);
-		printk("%02x ", *dcp++);
+		if ((i % 16) == 0) printk(KERN_INFO "\n%04x: ", i);
+		printk(KERN_INFO "%02x ", *dcp++);
 	}
-	printk("\n");
+	printk(KERN_INFO "\n");
 #endif
 }
 
--- diff/arch/m68knommu/kernel/process.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/m68knommu/kernel/process.c	2004-04-21 10:45:33.574599384 +0100
@@ -95,17 +95,17 @@ EXPORT_SYMBOL(machine_power_off);
 
 void show_regs(struct pt_regs * regs)
 {
-	printk("\n");
-	printk("Format %02x  Vector: %04x  PC: %08lx  Status: %04x    %s\n",
+	printk(KERN_NOTICE "\n");
+	printk(KERN_NOTICE "Format %02x  Vector: %04x  PC: %08lx  Status: %04x    %s\n",
 	       regs->format, regs->vector, regs->pc, regs->sr, print_tainted());
-	printk("ORIG_D0: %08lx  D0: %08lx  A2: %08lx  A1: %08lx\n",
+	printk(KERN_NOTICE "ORIG_D0: %08lx  D0: %08lx  A2: %08lx  A1: %08lx\n",
 	       regs->orig_d0, regs->d0, regs->a2, regs->a1);
-	printk("A0: %08lx  D5: %08lx  D4: %08lx\n",
+	printk(KERN_NOTICE "A0: %08lx  D5: %08lx  D4: %08lx\n",
 	       regs->a0, regs->d5, regs->d4);
-	printk("D3: %08lx  D2: %08lx  D1: %08lx\n",
+	printk(KERN_NOTICE "D3: %08lx  D2: %08lx  D1: %08lx\n",
 	       regs->d3, regs->d2, regs->d1);
 	if (!(regs->sr & PS_S))
-		printk("USP: %08lx\n", rdusp());
+		printk(KERN_NOTICE "USP: %08lx\n", rdusp());
 }
 
 /*
@@ -113,7 +113,7 @@ void show_regs(struct pt_regs * regs)
  */
 int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
 {
-	long retval;
+	int retval;
 	long clone_arg = flags | CLONE_VM;
 	mm_segment_t fs;
 
@@ -131,7 +131,8 @@ int kernel_thread(int (*fn)(void *), voi
 			"jsr	%4@\n\t"
 			"movel	%2, %%d0\n\t"
 			"trap	#0\n"
-			"1:"
+			"1:\n\t"
+			"movel	%%d0, %0\n"
 		: "=d" (retval)
 		: "i" (__NR_clone),
 		  "i" (__NR_exit),
@@ -328,58 +329,58 @@ void dump(struct pt_regs *fp)
 	unsigned char	*tp;
 	int		i;
 
-	printk("\nCURRENT PROCESS:\n\n");
-	printk("COMM=%s PID=%d\n", current->comm, current->pid);
+	printk(KERN_EMERG "\nCURRENT PROCESS:\n\n");
+	printk(KERN_EMERG "COMM=%s PID=%d\n", current->comm, current->pid);
 
 	if (current->mm) {
-		printk("TEXT=%08x-%08x DATA=%08x-%08x BSS=%08x-%08x\n",
+		printk(KERN_EMERG "TEXT=%08x-%08x DATA=%08x-%08x BSS=%08x-%08x\n",
 			(int) current->mm->start_code,
 			(int) current->mm->end_code,
 			(int) current->mm->start_data,
 			(int) current->mm->end_data,
 			(int) current->mm->end_data,
 			(int) current->mm->brk);
-		printk("USER-STACK=%08x  KERNEL-STACK=%08x\n\n",
+		printk(KERN_EMERG "USER-STACK=%08x  KERNEL-STACK=%08x\n\n",
 			(int) current->mm->start_stack,
 			(int)(((unsigned long) current) + KTHREAD_SIZE));
 	}
 
-	printk("PC: %08lx\n", fp->pc);
-	printk("SR: %08lx    SP: %08lx\n", (long) fp->sr, (long) fp);
-	printk("d0: %08lx    d1: %08lx    d2: %08lx    d3: %08lx\n",
+	printk(KERN_EMERG "PC: %08lx\n", fp->pc);
+	printk(KERN_EMERG "SR: %08lx    SP: %08lx\n", (long) fp->sr, (long) fp);
+	printk(KERN_EMERG "d0: %08lx    d1: %08lx    d2: %08lx    d3: %08lx\n",
 		fp->d0, fp->d1, fp->d2, fp->d3);
-	printk("d4: %08lx    d5: %08lx    a0: %08lx    a1: %08lx\n",
+	printk(KERN_EMERG "d4: %08lx    d5: %08lx    a0: %08lx    a1: %08lx\n",
 		fp->d4, fp->d5, fp->a0, fp->a1);
-	printk("\nUSP: %08x   TRAPFRAME: %08x\n", (unsigned int) rdusp(),
+	printk(KERN_EMERG "\nUSP: %08x   TRAPFRAME: %08x\n", (unsigned int) rdusp(),
 		(unsigned int) fp);
 
-	printk("\nCODE:");
+	printk(KERN_EMERG "\nCODE:");
 	tp = ((unsigned char *) fp->pc) - 0x20;
 	for (sp = (unsigned long *) tp, i = 0; (i < 0x40);  i += 4) {
 		if ((i % 0x10) == 0)
-			printk("\n%08x: ", (int) (tp + i));
-		printk("%08x ", (int) *sp++);
+			printk(KERN_EMERG "\n%08x: ", (int) (tp + i));
+		printk(KERN_EMERG "%08x ", (int) *sp++);
 	}
-	printk("\n");
+	printk(KERN_EMERG "\n");
 
-	printk("\nKERNEL STACK:");
+	printk(KERN_EMERG "\nKERNEL STACK:");
 	tp = ((unsigned char *) fp) - 0x40;
 	for (sp = (unsigned long *) tp, i = 0; (i < 0xc0); i += 4) {
 		if ((i % 0x10) == 0)
-			printk("\n%08x: ", (int) (tp + i));
-		printk("%08x ", (int) *sp++);
+			printk(KERN_EMERG "\n%08x: ", (int) (tp + i));
+		printk(KERN_EMERG "%08x ", (int) *sp++);
 	}
-	printk("\n");
-	printk("\n");
+	printk(KERN_EMERG "\n");
+	printk(KERN_EMERG "\n");
 
-	printk("\nUSER STACK:");
+	printk(KERN_EMERG "\nUSER STACK:");
 	tp = (unsigned char *) (rdusp() - 0x10);
 	for (sp = (unsigned long *) tp, i = 0; (i < 0x80); i += 4) {
 		if ((i % 0x10) == 0)
-			printk("\n%08x: ", (int) (tp + i));
-		printk("%08x ", (int) *sp++);
+			printk(KERN_EMERG "\n%08x: ", (int) (tp + i));
+		printk(KERN_EMERG "%08x ", (int) *sp++);
 	}
-	printk("\n\n");
+	printk(KERN_EMERG "\n\n");
 }
 
 /*
@@ -406,8 +407,6 @@ out:
 /*
  * These bracket the sleeping functions..
  */
-extern void scheduling_functions_start_here(void);
-extern void scheduling_functions_end_here(void);
 #define first_sched	((unsigned long) scheduling_functions_start_here)
 #define last_sched	((unsigned long) scheduling_functions_end_here)
 
@@ -422,11 +421,10 @@ unsigned long get_wchan(struct task_stru
 	stack_page = (unsigned long)p;
 	fp = ((struct switch_stack *)p->thread.ksp)->a6;
 	do {
-		if (fp < stack_page+sizeof(struct task_struct) ||
+		if (fp < stack_page+sizeof(struct thread_info) ||
 		    fp >= 8184+stack_page)
 			return 0;
 		pc = ((unsigned long *)fp)[1];
-		/* FIXME: This depends on the order of these functions. */
 		if (pc < first_sched || pc >= last_sched)
 			return pc;
 		fp = *(unsigned long *) fp;
@@ -439,8 +437,6 @@ unsigned long get_wchan(struct task_stru
  */
 unsigned long thread_saved_pc(struct task_struct *tsk)
 {
-	extern void scheduling_functions_start_here(void);
-	extern void scheduling_functions_end_here(void);
 	struct switch_stack *sw = (struct switch_stack *)tsk->thread.ksp;
 
 	/* Check whether the thread is blocked in resume() */
--- diff/arch/m68knommu/kernel/semaphore.c	2002-11-11 11:09:42.000000000 +0000
+++ source/arch/m68knommu/kernel/semaphore.c	2004-04-21 10:45:33.574599384 +0100
@@ -6,6 +6,7 @@
 #include <linux/config.h>
 #include <linux/sched.h>
 #include <linux/err.h>
+#include <linux/init.h>
 #include <asm/semaphore-helper.h>
 
 #ifndef CONFIG_RMW_INSNS
@@ -96,7 +97,7 @@ void __up(struct semaphore *sem)
 	current->state = TASK_RUNNING;		\
 	remove_wait_queue(&sem->wait, &wait);
 
-void __down(struct semaphore * sem)
+void __sched __down(struct semaphore * sem)
 {
 	DECLARE_WAITQUEUE(wait, current);
 
@@ -107,7 +108,7 @@ void __down(struct semaphore * sem)
 	DOWN_TAIL(TASK_UNINTERRUPTIBLE)
 }
 
-int __down_interruptible(struct semaphore * sem)
+int __sched __down_interruptible(struct semaphore * sem)
 {
 	DECLARE_WAITQUEUE(wait, current);
 	int ret = 0;
--- diff/arch/m68knommu/kernel/setup.c	2003-08-20 14:16:08.000000000 +0100
+++ source/arch/m68knommu/kernel/setup.c	2004-04-21 10:45:33.575599232 +0100
@@ -40,13 +40,6 @@
 #include <asm/pgtable.h>
 #endif
 
-#ifdef CONFIG_CONSOLE
-extern struct consw *conswitchp;
-#ifdef CONFIG_FRAMEBUFFER
-extern struct consw fb_con;
-#endif
-#endif
-
 unsigned long rom_length;
 unsigned long memory_start;
 unsigned long memory_end;
@@ -59,7 +52,7 @@ static void dummy_waitbut(void)
 {
 }
 
-void (*mach_sched_init) (void (*handler)(int, void *, struct pt_regs *)) = NULL;
+void (*mach_sched_init) (irqreturn_t (*handler)(int, void *, struct pt_regs *)) = NULL;
 void (*mach_tick)( void ) = NULL;
 /* machine dependent keyboard functions */
 int (*mach_keyb_init) (void) = NULL;
@@ -67,10 +60,7 @@ int (*mach_kbdrate) (struct kbd_repeat *
 void (*mach_kbd_leds) (unsigned int) = NULL;
 /* machine dependent irq functions */
 void (*mach_init_IRQ) (void) = NULL;
-void (*(*mach_default_handler)[]) (int, void *, struct pt_regs *) = NULL;
-int (*mach_request_irq) (unsigned int, void (*)(int, void *, struct pt_regs *),
-                         unsigned long, const char *, void *);
-void (*mach_free_irq) (unsigned int irq, void *dev_id) = NULL;
+irqreturn_t (*(*mach_default_handler)[]) (int, void *, struct pt_regs *) = NULL;
 void (*mach_enable_irq) (unsigned int) = NULL;
 void (*mach_disable_irq) (unsigned int) = NULL;
 int (*mach_get_irq_list) (struct seq_file *, void *) = NULL;
@@ -163,57 +153,57 @@ void setup_arch(char **cmdline_p)
 
 	config_BSP(&command_line[0], sizeof(command_line));
 
-	printk("\x0F\r\n\nuClinux/" CPU "\n");
+	printk(KERN_INFO "\x0F\r\n\nuClinux/" CPU "\n");
 
 #ifdef CONFIG_UCDIMM
-	printk("uCdimm by Lineo, Inc. <www.lineo.com>\n");
+	printk(KERN_INFO "uCdimm by Lineo, Inc. <www.lineo.com>\n");
 #endif
 #ifdef CONFIG_M68VZ328
-	printk("M68VZ328 support by Evan Stawnyczy <e@lineo.ca>\n");
+	printk(KERN_INFO "M68VZ328 support by Evan Stawnyczy <e@lineo.ca>\n");
 #endif
 #ifdef CONFIG_COLDFIRE
-	printk("COLDFIRE port done by Greg Ungerer, gerg@snapgear.com\n");
+	printk(KERN_INFO "COLDFIRE port done by Greg Ungerer, gerg@snapgear.com\n");
 #ifdef CONFIG_M5307
-	printk("Modified for M5307 by Dave Miller, dmiller@intellistor.com\n");
+	printk(KERN_INFO "Modified for M5307 by Dave Miller, dmiller@intellistor.com\n");
 #endif
 #ifdef CONFIG_ELITE
-	printk("Modified for M5206eLITE by Rob Scott, rscott@mtrob.fdns.net\n");
+	printk(KERN_INFO "Modified for M5206eLITE by Rob Scott, rscott@mtrob.fdns.net\n");
 #endif  
 #ifdef CONFIG_TELOS
-	printk("Modified for Omnia ToolVox by James D. Schettine, james@telos-systems.com\n");
+	printk(KERN_INFO "Modified for Omnia ToolVox by James D. Schettine, james@telos-systems.com\n");
 #endif
 #endif
-	printk("Flat model support (C) 1998,1999 Kenneth Albanowski, D. Jeff Dionne\n");
+	printk(KERN_INFO "Flat model support (C) 1998,1999 Kenneth Albanowski, D. Jeff Dionne\n");
 
 #if defined( CONFIG_PILOT ) && defined( CONFIG_M68328 )
-	printk("TRG SuperPilot FLASH card support <info@trgnet.com>\n");
+	printk(KERN_INFO "TRG SuperPilot FLASH card support <info@trgnet.com>\n");
 #endif
 
 #if defined( CONFIG_PILOT ) && defined( CONFIG_M68EZ328 )
-	printk("PalmV support by Lineo Inc. <jeff@uclinux.com>\n");
+	printk(KERN_INFO "PalmV support by Lineo Inc. <jeff@uclinux.com>\n");
 #endif
 
 #ifdef CONFIG_M68EZ328ADS
-	printk("M68EZ328ADS board support (C) 1999 Vladimir Gurevich <vgurevic@cisco.com>\n");
+	printk(KERN_INFO "M68EZ328ADS board support (C) 1999 Vladimir Gurevich <vgurevic@cisco.com>\n");
 #endif
 
 #ifdef CONFIG_ALMA_ANS
-	printk("Alma Electronics board support (C) 1999 Vladimir Gurevich <vgurevic@cisco.com>\n");
+	printk(KERN_INFO "Alma Electronics board support (C) 1999 Vladimir Gurevich <vgurevic@cisco.com>\n");
 #endif
 #if defined (CONFIG_M68360)
-	printk("QUICC port done by SED Systems <hamilton@sedsystems.ca>,\n");
-	printk("based on 2.0.38 port by Lineo Inc. <mleslie@lineo.com>.\n");
+	printk(KERN_INFO "QUICC port done by SED Systems <hamilton@sedsystems.ca>,\n");
+	printk(KERN_INFO "based on 2.0.38 port by Lineo Inc. <mleslie@lineo.com>.\n");
 #endif
 #ifdef CONFIG_DRAGEN2
-	printk("DragonEngine II board support by Georges Menie\n");
+	printk(KERN_INFO "DragonEngine II board support by Georges Menie\n");
 #endif
 
 #ifdef DEBUG
-	printk("KERNEL -> TEXT=0x%06x-0x%06x DATA=0x%06x-0x%06x "
+	printk(KERN_DEBUG "KERNEL -> TEXT=0x%06x-0x%06x DATA=0x%06x-0x%06x "
 		"BSS=0x%06x-0x%06x\n", (int) &_stext, (int) &_etext,
 		(int) &_sdata, (int) &_edata,
 		(int) &_sbss, (int) &_ebss);
-	printk("KERNEL -> ROMFS=0x%06x-0x%06x MEM=0x%06x-0x%06x "
+	printk(KERN_DEBUG "KERNEL -> ROMFS=0x%06x-0x%06x MEM=0x%06x-0x%06x "
 		"STACK=0x%06x-0x%06x\n",
 #ifdef CAT_ROMARRAY
 		(int) romarray, ((int) romarray) + romarray[2],
@@ -231,15 +221,11 @@ void setup_arch(char **cmdline_p)
 
 #ifdef DEBUG
 	if (strlen(*cmdline_p)) 
-		printk("Command line: '%s'\n", *cmdline_p);
+		printk(KERN_DEBUG "Command line: '%s'\n", *cmdline_p);
 #endif
 
-#ifdef CONFIG_CONSOLE
-#ifdef CONFIG_FRAMEBUFFER
-	conswitchp = &fb_con;
-#else
-	conswitchp = 0;
-#endif
+#if defined(CONFIG_FRAMEBUFFER_CONSOLE) && defined(CONFIG_DUMMY_CONSOLE)
+	conswitchp = &dummy_con;
 #endif
 
 	/*
--- diff/arch/m68knommu/kernel/traps.c	2003-07-08 09:55:17.000000000 +0100
+++ source/arch/m68knommu/kernel/traps.c	2004-04-21 10:45:33.576599080 +0100
@@ -72,15 +72,15 @@ void die_if_kernel(char *str, struct pt_
 		return;
 
 	console_verbose();
-	printk("%s: %08x\n",str,nr);
-	printk("PC: [<%08lx>]\nSR: %04x  SP: %p  a2: %08lx\n",
+	printk(KERN_EMERG "%s: %08x\n",str,nr);
+	printk(KERN_EMERG "PC: [<%08lx>]\nSR: %04x  SP: %p  a2: %08lx\n",
 	       fp->pc, fp->sr, fp, fp->a2);
-	printk("d0: %08lx    d1: %08lx    d2: %08lx    d3: %08lx\n",
+	printk(KERN_EMERG "d0: %08lx    d1: %08lx    d2: %08lx    d3: %08lx\n",
 	       fp->d0, fp->d1, fp->d2, fp->d3);
-	printk("d4: %08lx    d5: %08lx    a0: %08lx    a1: %08lx\n",
+	printk(KERN_EMERG "d4: %08lx    d5: %08lx    a0: %08lx    a1: %08lx\n",
 	       fp->d4, fp->d5, fp->a0, fp->a1);
 
-	printk("Process %s (pid: %d, stackpage=%08lx)\n",
+	printk(KERN_EMERG "Process %s (pid: %d, stackpage=%08lx)\n",
 		current->comm, current->pid, PAGE_SIZE+(unsigned long)current);
 	show_stack(NULL, (unsigned long *)fp);
 	do_exit(SIGSEGV);
@@ -93,12 +93,12 @@ asmlinkage void buserr_c(struct frame *f
 		current->thread.esp0 = (unsigned long) fp;
 
 #if DEBUG
-	printk ("*** Bus Error *** Format is %x\n", fp->ptregs.format);
+	printk (KERN_DEBUG "*** Bus Error *** Format is %x\n", fp->ptregs.format);
 #endif
 
 	die_if_kernel("bad frame format",&fp->ptregs,0);
 #if DEBUG
-	printk("Unknown SIGSEGV - 4\n");
+	printk(KERN_DEBUG "Unknown SIGSEGV - 4\n");
 #endif
 	force_sig(SIGSEGV, current);
 }
@@ -119,16 +119,16 @@ void show_stack(struct task_struct *task
 	addr = (unsigned long) esp;
 	endstack = (unsigned long *) PAGE_ALIGN(addr);
 
-	printk("Stack from %08lx:", (unsigned long)stack);
+	printk(KERN_EMERG "Stack from %08lx:", (unsigned long)stack);
 	for (i = 0; i < kstack_depth_to_print; i++) {
 		if (stack + 1 > endstack)
 			break;
 		if (i % 8 == 0)
-			printk("\n       ");
-		printk(" %08lx", *stack++);
+			printk(KERN_EMERG "\n       ");
+		printk(KERN_EMERG " %08lx", *stack++);
 	}
 
-	printk("\nCall Trace:");
+	printk(KERN_EMERG "\nCall Trace:");
 	i = 0;
 	while (stack + 1 <= endstack) {
 		addr = *stack++;
@@ -143,26 +143,26 @@ void show_stack(struct task_struct *task
 		if (((addr >= (unsigned long) &_start) &&
 		     (addr <= (unsigned long) &_etext))) {
 			if (i % 4 == 0)
-				printk("\n       ");
-			printk(" [<%08lx>]", addr);
+				printk(KERN_EMERG "\n       ");
+			printk(KERN_EMERG " [<%08lx>]", addr);
 			i++;
 		}
 	}
-	printk("\n");
+	printk(KERN_EMERG "\n");
 }
 
 void bad_super_trap(struct frame *fp)
 {
 	console_verbose();
 	if (fp->ptregs.vector < 4*sizeof(vec_names)/sizeof(vec_names[0]))
-		printk ("*** %s ***   FORMAT=%X\n",
+		printk (KERN_WARNING "*** %s ***   FORMAT=%X\n",
 			vec_names[(fp->ptregs.vector) >> 2],
 			fp->ptregs.format);
 	else
-		printk ("*** Exception %d ***   FORMAT=%X\n",
+		printk (KERN_WARNING "*** Exception %d ***   FORMAT=%X\n",
 			(fp->ptregs.vector) >> 2, 
 			fp->ptregs.format);
-	printk ("Current process id is %d\n", current->pid);
+	printk (KERN_WARNING "Current process id is %d\n", current->pid);
 	die_if_kernel("BAD KERNEL TRAP", &fp->ptregs, 0);
 }
 
@@ -295,9 +295,15 @@ asmlinkage void set_esp0(unsigned long s
 	current->thread.esp0 = ssp;
 }
 
-void show_trace_task(struct task_struct *tsk)
+
+/*
+ * The architecture-independent backtrace generator
+ */
+void dump_stack(void)
 {
-	printk("STACK ksp=0x%lx, usp=0x%lx\n", tsk->thread.ksp, tsk->thread.usp);
+	unsigned long stack;
+
+	show_stack(current, &stack);
 }
 
 #ifdef CONFIG_M68KFPU_EMU
--- diff/arch/m68knommu/kernel/vmlinux.lds.S	2003-08-26 10:00:52.000000000 +0100
+++ source/arch/m68knommu/kernel/vmlinux.lds.S	2004-04-21 10:45:33.576599080 +0100
@@ -122,12 +122,31 @@
 #define	RAM_LENGTH	0x3e0000
 #endif
 
+/*
+ *   The senTec COBRA5272 board has nearly the same
+ *   memory layout as the M5272C3.
+ *   We assume 16MB ram.
+ */
+#if defined(CONFIG_COBRA5272)
+#define RAM_START   0x20000
+#define RAM_LENGTH  0xfe0000
+#endif
+
 #if defined(CONFIG_M5282C3)
 #define	RAM_START	0x10000
 #define	RAM_LENGTH	0x3f0000
 #endif
 
 /*
+ *   The senTec COBRA5282 board has the same
+ *   memory layout as the M5282C3.
+ */
+#if defined(CONFIG_COBRA5282)
+#define  RAM_START   0x10000
+#define  RAM_LENGTH  0x3f0000
+#endif
+
+/*
  *	These flash boot boards use all of ram for operation. Again the
  *	actual memory size is not important here, assume at least 4MiB.
  *	They currently have no support for running in flash.
@@ -191,6 +210,7 @@ SECTIONS {
 	.text : {
 		_stext = . ;
         	*(.text)
+		SCHED_TEXT
         	*(.text.lock)
 
 		. = ALIGN(16);          /* Exception table              */
@@ -201,8 +221,10 @@ SECTIONS {
 		*(.rodata) *(.rodata.*)
 		*(__vermagic)		/* Kernel version magic */
 		*(.rodata1)
+		*(.rodata.str1.1)
 
 		/* Kernel symbol table: Normal symbols */
+		. = ALIGN(4);
 		__start___ksymtab = .;
 		*(__ksymtab)
 		__stop___ksymtab = .;
--- diff/arch/m68knommu/lib/divsi3.S	2002-11-11 11:09:42.000000000 +0000
+++ source/arch/m68knommu/lib/divsi3.S	2004-04-21 10:45:33.576599080 +0100
@@ -97,7 +97,7 @@ SYM (__divsi3):
 	movel	sp@(12), d1	/* d1 = divisor */
 	jpl	L1
 	negl	d1
-#ifndef __mcf5200__
+#if !(defined(__mcf5200__) || defined(__mcoldfire__))
 	negb	d2		/* change sign because divisor <0  */
 #else
 	negl	d2		/* change sign because divisor <0  */
@@ -105,7 +105,7 @@ SYM (__divsi3):
 L1:	movel	sp@(8), d0	/* d0 = dividend */
 	jpl	L2
 	negl	d0
-#ifndef __mcf5200__
+#if !(defined(__mcf5200__) || defined(__mcoldfire__))
 	negb	d2
 #else
 	negl	d2
--- diff/arch/m68knommu/lib/modsi3.S	2002-11-11 11:09:42.000000000 +0000
+++ source/arch/m68knommu/lib/modsi3.S	2004-04-21 10:45:33.577598928 +0100
@@ -98,7 +98,7 @@ SYM (__modsi3):
 	jbsr	SYM (__divsi3)
 	addql	IMM (8), sp
 	movel	sp@(8), d1	/* d1 = divisor */
-#ifndef __mcf5200__
+#if !(defined(__mcf5200__) || defined(__mcoldfire__))
 	movel	d1, sp@-
 	movel	d0, sp@-
 	jbsr	SYM (__mulsi3)	/* d0 = (a/b)*b */
--- diff/arch/m68knommu/lib/mulsi3.S	2002-11-11 11:09:42.000000000 +0000
+++ source/arch/m68knommu/lib/mulsi3.S	2004-04-21 10:45:33.577598928 +0100
@@ -95,7 +95,7 @@ SYM (__mulsi3):
 	muluw	sp@(10), d0	/* x0*y1 */
 	movew	sp@(6), d1	/* x1 -> d1 */
 	muluw	sp@(8), d1	/* x1*y0 */
-#ifndef __mcf5200__
+#if !(defined(__mcf5200__) || defined(__mcoldfire__))
 	addw	d1, d0
 #else
 	addl	d1, d0
--- diff/arch/m68knommu/lib/udivsi3.S	2002-11-11 11:09:42.000000000 +0000
+++ source/arch/m68knommu/lib/udivsi3.S	2004-04-21 10:45:33.577598928 +0100
@@ -91,7 +91,7 @@ Boston, MA 02111-1307, USA.  */
 	.proc
 	.globl	SYM (__udivsi3)
 SYM (__udivsi3):
-#ifndef __mcf5200__
+#if !(defined(__mcf5200__) || defined(__mcoldfire__))
 	movel	d2, sp@-
 	movel	sp@(12), d1	/* d1 = divisor */
 	movel	sp@(8), d0	/* d0 = dividend */
@@ -136,7 +136,7 @@ L5:	subql	IMM (1), d0	/* adjust quotient
 L6:	movel	sp@+, d2
 	rts
 
-#else /* __mcf5200__ */
+#else /* __mcf5200__ || __mcoldfire__ */
 
 /* Coldfire implementation of non-restoring division algorithm from
    Hennessy & Patterson, Appendix A. */
@@ -158,5 +158,5 @@ L2:	subql	IMM (1),d4
 	moveml	sp@,d2-d4	| restore data registers
 	unlk	a6		| and return
 	rts
-#endif /* __mcf5200__ */
+#endif /* __mcf5200__ || __mcoldfire__ */
 
--- diff/arch/m68knommu/lib/umodsi3.S	2002-11-11 11:09:42.000000000 +0000
+++ source/arch/m68knommu/lib/umodsi3.S	2004-04-21 10:45:33.578598776 +0100
@@ -98,7 +98,7 @@ SYM (__umodsi3):
 	jbsr	SYM (__udivsi3)
 	addql	IMM (8), sp
 	movel	sp@(8), d1	/* d1 = divisor */
-#ifndef __mcf5200__
+#if !(defined(__mcf5200__) || defined(__mcoldfire__))
 	movel	d1, sp@-
 	movel	d0, sp@-
 	jbsr	SYM (__mulsi3)	/* d0 = (a/b)*b */
--- diff/arch/m68knommu/mm/fault.c	2002-11-11 11:09:42.000000000 +0000
+++ source/arch/m68knommu/mm/fault.c	2004-04-21 10:45:33.578598776 +0100
@@ -36,7 +36,7 @@ asmlinkage int do_page_fault(struct pt_r
 			      unsigned long error_code)
 {
 #ifdef DEBUG
-	printk ("regs->sr=%#x, regs->pc=%#lx, address=%#lx, %ld\n",
+	printk (KERN_DEBUG "regs->sr=%#x, regs->pc=%#lx, address=%#lx, %ld\n",
 		regs->sr, regs->pc, address, error_code);
 #endif
 
@@ -48,7 +48,7 @@ asmlinkage int do_page_fault(struct pt_r
 		printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference");
 	} else
 		printk(KERN_ALERT "Unable to handle kernel access");
-	printk(" at virtual address %08lx\n",address);
+	printk(KERN_ALERT " at virtual address %08lx\n",address);
 	die_if_kernel("Oops", regs, error_code);
 	do_exit(SIGKILL);
 
--- diff/arch/m68knommu/mm/init.c	2003-08-20 14:16:08.000000000 +0100
+++ source/arch/m68knommu/mm/init.c	2004-04-21 10:45:33.578598776 +0100
@@ -72,7 +72,7 @@ void show_mem(void)
     int free = 0, total = 0, reserved = 0, shared = 0;
     int cached = 0;
 
-    printk("\nMem-info:\n");
+    printk(KERN_INFO "\nMem-info:\n");
     show_free_areas();
     i = max_mapnr;
     while (i-- > 0) {
@@ -86,11 +86,11 @@ void show_mem(void)
 	else
 	    shared += page_count(mem_map+i) - 1;
     }
-    printk("%d pages of RAM\n",total);
-    printk("%d free pages\n",free);
-    printk("%d reserved pages\n",reserved);
-    printk("%d pages shared\n",shared);
-    printk("%d pages swap cached\n",cached);
+    printk(KERN_INFO "%d pages of RAM\n",total);
+    printk(KERN_INFO "%d free pages\n",free);
+    printk(KERN_INFO "%d reserved pages\n",reserved);
+    printk(KERN_INFO "%d pages shared\n",shared);
+    printk(KERN_INFO "%d pages swap cached\n",cached);
 }
 
 extern unsigned long memory_start;
@@ -114,7 +114,7 @@ void paging_init(void)
 	unsigned long end_mem   = memory_end & PAGE_MASK;
 
 #ifdef DEBUG
-	printk ("start_mem is %#lx\nvirtual_end is %#lx\n",
+	printk (KERN_DEBUG "start_mem is %#lx\nvirtual_end is %#lx\n",
 		start_mem, end_mem);
 #endif
 
@@ -133,9 +133,9 @@ void paging_init(void)
 	set_fs (USER_DS);
 
 #ifdef DEBUG
-	printk ("before free_area_init\n");
+	printk (KERN_DEBUG "before free_area_init\n");
 
-	printk ("free_area_init -> start_mem is %#lx\nvirtual_end is %#lx\n",
+	printk (KERN_DEBUG "free_area_init -> start_mem is %#lx\nvirtual_end is %#lx\n",
 		start_mem, end_mem);
 #endif
 
@@ -162,7 +162,7 @@ void mem_init(void)
 	unsigned long end_mem   = memory_end; /* DAVIDM - this must not include kernel stack at top */
 
 #ifdef DEBUG
-	printk("Mem_init: start=%lx, end=%lx\n", start_mem, end_mem);
+	printk(KERN_DEBUG "Mem_init: start=%lx, end=%lx\n", start_mem, end_mem);
 #endif
 
 	end_mem &= PAGE_MASK;
@@ -179,7 +179,7 @@ void mem_init(void)
 	initk = (&__init_begin - &__init_end) >> 10;
 
 	tmp = nr_free_pages() << PAGE_SHIFT;
-	printk("Memory available: %luk/%luk RAM, %luk/%luk ROM (%dk kernel code, %dk data)\n",
+	printk(KERN_INFO "Memory available: %luk/%luk RAM, %luk/%luk ROM (%dk kernel code, %dk data)\n",
 	       tmp >> 10,
 	       len >> 10,
 	       (rom_length > 0) ? ((rom_length >> 10) - codek) : 0,
@@ -201,7 +201,7 @@ void free_initrd_mem(unsigned long start
 		totalram_pages++;
 		pages++;
 	}
-	printk ("Freeing initrd memory: %dk freed\n", pages);
+	printk (KERN_NOTICE "Freeing initrd memory: %dk freed\n", pages);
 }
 #endif
 
@@ -223,7 +223,7 @@ free_initmem()
 		free_page(addr);
 		totalram_pages++;
 	}
-	printk("Freeing unused kernel memory: %ldk freed (0x%x - 0x%x)\n",
+	printk(KERN_NOTICE "Freeing unused kernel memory: %ldk freed (0x%x - 0x%x)\n",
 			(addr - PAGE_ALIGN((long) &__init_begin)) >> 10,
 			(int)(PAGE_ALIGN((unsigned long)(&__init_begin))),
 			(int)(addr - PAGE_SIZE));
--- diff/arch/m68knommu/platform/5206/config.c	2003-09-17 12:28:02.000000000 +0100
+++ source/arch/m68knommu/platform/5206/config.c	2004-04-21 10:45:33.579598624 +0100
@@ -42,6 +42,8 @@ unsigned int   dma_base_addr[MAX_M68K_DM
         MCF_MBAR + MCFDMA_BASE1,
 };
 
+unsigned int dma_device_address[MAX_M68K_DMA_CHANNELS];
+
 /***************************************************************************/
 
 void mcf_autovector(unsigned int vec)
--- diff/arch/m68knommu/platform/5206e/config.c	2003-09-17 12:28:02.000000000 +0100
+++ source/arch/m68knommu/platform/5206e/config.c	2004-04-21 10:45:33.579598624 +0100
@@ -42,6 +42,8 @@ unsigned int   dma_base_addr[MAX_M68K_DM
         MCF_MBAR + MCFDMA_BASE1,
 };
 
+unsigned int dma_device_address[MAX_M68K_DMA_CHANNELS];
+
 /***************************************************************************/
 
 void mcf_autovector(unsigned int vec)
--- diff/arch/m68knommu/platform/5249/config.c	2003-09-17 12:28:02.000000000 +0100
+++ source/arch/m68knommu/platform/5249/config.c	2004-04-21 10:45:33.579598624 +0100
@@ -43,6 +43,8 @@ unsigned int   dma_base_addr[MAX_M68K_DM
         MCF_MBAR + MCFDMA_BASE3,
 };
 
+unsigned int dma_device_address[MAX_M68K_DMA_CHANNELS];
+
 /***************************************************************************/
 
 void mcf_autovector(unsigned int vec)
--- diff/arch/m68knommu/platform/5272/MOTOROLA/crt0_ram.S	2003-06-30 10:07:33.000000000 +0100
+++ source/arch/m68knommu/platform/5272/MOTOROLA/crt0_ram.S	2004-04-21 10:45:33.580598472 +0100
@@ -25,14 +25,6 @@
 #define	MEM_BASE	0x00000000	/* Memory base at address 0 */
 #define	VBR_BASE	MEM_BASE	/* Vector address */
 
-#if defined(CONFIG_RAM16MB)
-#define	MEM_SIZE	0x01000000	/* Memory size 16Mb */
-#elif defined(CONFIG_RAM8MB)
-#define	MEM_SIZE	0x00800000	/* Memory size 8Mb */
-#else
-#define	MEM_SIZE	0x00400000	/* Memory size 4Mb */
-#endif
-
 /*****************************************************************************/
 
 .global	_start
@@ -81,17 +73,31 @@ _start:
 	 * only, so the bus trap can't be changed. (RS)
 	 */
 	move.l	#VBR_BASE, %a7			/* Note VBR can't be read */
-	movec   %a7, %VBR
+	movec	%a7, %VBR
 	move.l	%a7, _ramvec			/* Set up vector addr */
 	move.l	%a7, _rambase			/* Set up base RAM addr */
 
-
+	/*
+	 *	Determine size of RAM, then set up initial stack.
+	 */
+#if defined(CONFIG_RAMAUTO)
+	move.l	MCF_MBAR+0x7c,%d0	/* get SDRAM address mask */
+	andi.l	#0xfffff000,%d0		/* mask out chip select options */
+	neg.l	%d0			/* negate bits */
+#else
+#if defined(CONFIG_RAM16MB)
+#define	MEM_SIZE	0x01000000	/* Memory size 16Mb */
+#elif defined(CONFIG_RAM8MB)
+#define	MEM_SIZE	0x00800000	/* Memory size 8Mb */
+#else
+#define	MEM_SIZE	0x00400000	/* Memory size 4Mb */
+#endif
 	/*
 	 *	Set memory size.
 	 */
-	move.l	#MEM_SIZE, %a0
+	move.l	#MEM_SIZE, %d0
+#endif
 
-	move.l	%a0, %d0			/* Mem end addr is in a0 */
 	move.l	%d0, %sp			/* Set up initial stack ptr */
 	move.l	%d0, _ramend			/* Set end ram addr */
 
--- diff/arch/m68knommu/platform/5272/config.c	2003-09-17 12:28:02.000000000 +0100
+++ source/arch/m68knommu/platform/5272/config.c	2004-04-21 10:45:33.580598472 +0100
@@ -46,6 +46,8 @@ unsigned int   dma_base_addr[MAX_M68K_DM
         MCF_MBAR + MCFDMA_BASE0,
 };
 
+unsigned int dma_device_address[MAX_M68K_DMA_CHANNELS];
+
 /***************************************************************************/
 
 void mcf_disableall(void)
--- diff/arch/m68knommu/platform/5282/config.c	2003-07-11 09:39:50.000000000 +0100
+++ source/arch/m68knommu/platform/5282/config.c	2004-04-21 10:45:33.581598320 +0100
@@ -17,6 +17,7 @@
 #include <linux/sched.h>
 #include <linux/param.h>
 #include <linux/init.h>
+#include <linux/interrupt.h>
 #include <asm/dma.h>
 #include <asm/traps.h>
 #include <asm/machdep.h>
@@ -27,7 +28,7 @@
 /***************************************************************************/
 
 void coldfire_pit_tick(void);
-void coldfire_pit_init(void (*handler)(int, void *, struct pt_regs *));
+void coldfire_pit_init(irqreturn_t (*handler)(int, void *, struct pt_regs *));
 unsigned long coldfire_pit_offset(void);
 void coldfire_trap_init(void);
 void coldfire_reset(void);
@@ -41,6 +42,8 @@ unsigned int   dma_base_addr[MAX_M68K_DM
         MCF_MBAR + MCFDMA_BASE0,
 };
 
+unsigned int dma_device_address[MAX_M68K_DMA_CHANNELS];
+
 /***************************************************************************/
 
 void mcf_disableall(void)
--- diff/arch/m68knommu/platform/5307/config.c	2003-07-08 09:55:17.000000000 +0100
+++ source/arch/m68knommu/platform/5307/config.c	2004-04-21 10:45:33.582598168 +0100
@@ -14,6 +14,7 @@
 #include <linux/sched.h>
 #include <linux/param.h>
 #include <linux/init.h>
+#include <linux/interrupt.h>
 #include <asm/irq.h>
 #include <asm/dma.h>
 #include <asm/traps.h>
@@ -28,7 +29,7 @@
 /***************************************************************************/
 
 void coldfire_tick(void);
-void coldfire_timer_init(void (*handler)(int, void *, struct pt_regs *));
+void coldfire_timer_init(irqreturn_t (*handler)(int, void *, struct pt_regs *));
 unsigned long coldfire_timer_offset(void);
 void coldfire_trap_init(void);
 void coldfire_reset(void);
@@ -49,6 +50,8 @@ unsigned int   dma_base_addr[MAX_M68K_DM
         MCF_MBAR + MCFDMA_BASE3,
 };
 
+unsigned int dma_device_address[MAX_M68K_DMA_CHANNELS];
+
 /***************************************************************************/
 
 void mcf_autovector(unsigned int vec)
--- diff/arch/m68knommu/platform/5307/ints.c	2004-01-19 10:22:55.000000000 +0000
+++ source/arch/m68knommu/platform/5307/ints.c	2004-04-21 10:45:33.582598168 +0100
@@ -47,7 +47,7 @@ unsigned int local_irq_count[NR_CPUS];
 static irqreturn_t default_irq_handler(int irq, void *ptr, struct pt_regs *regs)
 {
 #if 1
-	printk("%s(%d): default irq handler vec=%d [0x%x]\n",
+	printk(KERN_INFO "%s(%d): default irq handler vec=%d [0x%x]\n",
 		__FILE__, __LINE__, irq, irq);
 #endif
 	return(IRQ_HANDLED);
@@ -94,7 +94,7 @@ irq_node_t *new_irq_node(void)
 		if (!node->handler)
 			return node;
 
-	printk("new_irq_node: out of nodes\n");
+	printk(KERN_INFO "new_irq_node: out of nodes\n");
 	return NULL;
 }
 
@@ -106,19 +106,19 @@ int request_irq(
 	void *dev_id)
 {
 	if (irq < 0 || irq >= NR_IRQS) {
-		printk("%s: Incorrect IRQ %d from %s\n", __FUNCTION__,
+		printk(KERN_WARNING "%s: Incorrect IRQ %d from %s\n", __FUNCTION__,
 			irq, devname);
 		return -ENXIO;
 	}
 
 	if (!(irq_list[irq].flags & IRQ_FLG_STD)) {
 		if (irq_list[irq].flags & IRQ_FLG_LOCK) {
-			printk("%s: IRQ %d from %s is not replaceable\n",
+			printk(KERN_WARNING "%s: IRQ %d from %s is not replaceable\n",
 			       __FUNCTION__, irq, irq_list[irq].devname);
 			return -EBUSY;
 		}
 		if (flags & IRQ_FLG_REPLACE) {
-			printk("%s: %s can't replace IRQ %d from %s\n",
+			printk(KERN_WARNING "%s: %s can't replace IRQ %d from %s\n",
 			       __FUNCTION__, devname, irq, irq_list[irq].devname);
 			return -EBUSY;
 		}
@@ -142,12 +142,12 @@ EXPORT_SYMBOL(request_irq);
 void free_irq(unsigned int irq, void *dev_id)
 {
 	if (irq >= NR_IRQS) {
-		printk("%s: Incorrect IRQ %d\n", __FUNCTION__, irq);
+		printk(KERN_WARNING "%s: Incorrect IRQ %d\n", __FUNCTION__, irq);
 		return;
 	}
 
 	if (irq_list[irq].dev_id != dev_id)
-		printk("%s: Removing probably wrong IRQ %d from %s\n",
+		printk(KERN_WARNING "%s: Removing probably wrong IRQ %d from %s\n",
 		       __FUNCTION__, irq, irq_list[irq].devname);
 
 	if (irq_list[irq].flags & IRQ_FLG_FAST) {
@@ -173,7 +173,7 @@ int sys_request_irq(unsigned int irq, 
                     unsigned long flags, const char *devname, void *dev_id)
 {
 	if (irq > IRQ7) {
-		printk("%s: Incorrect IRQ %d from %s\n",
+		printk(KERN_WARNING "%s: Incorrect IRQ %d from %s\n",
 		       __FUNCTION__, irq, devname);
 		return -ENXIO;
 	}
@@ -181,12 +181,12 @@ int sys_request_irq(unsigned int irq, 
 #if 0
 	if (!(irq_list[irq].flags & IRQ_FLG_STD)) {
 		if (irq_list[irq].flags & IRQ_FLG_LOCK) {
-			printk("%s: IRQ %d from %s is not replaceable\n",
+			printk(KERN_WARNING "%s: IRQ %d from %s is not replaceable\n",
 			       __FUNCTION__, irq, irq_list[irq].devname);
 			return -EBUSY;
 		}
 		if (!(flags & IRQ_FLG_REPLACE)) {
-			printk("%s: %s can't replace IRQ %d from %s\n",
+			printk(KERN_WARNING "%s: %s can't replace IRQ %d from %s\n",
 			       __FUNCTION__, devname, irq, irq_list[irq].devname);
 			return -EBUSY;
 		}
@@ -203,12 +203,12 @@ int sys_request_irq(unsigned int irq, 
 void sys_free_irq(unsigned int irq, void *dev_id)
 {
 	if (irq > IRQ7) {
-		printk("%s: Incorrect IRQ %d\n", __FUNCTION__, irq);
+		printk(KERN_WARNING "%s: Incorrect IRQ %d\n", __FUNCTION__, irq);
 		return;
 	}
 
 	if (irq_list[irq].dev_id != dev_id)
-		printk("%s: Removing probably wrong IRQ %d from %s\n",
+		printk(KERN_WARNING "%s: Removing probably wrong IRQ %d from %s\n",
 		       __FUNCTION__, irq, irq_list[irq].devname);
 
 	irq_list[irq].handler = (*mach_default_handler)[irq];
@@ -257,21 +257,20 @@ int show_interrupts(struct seq_file *p, 
 	int i = *(loff_t *) v;
 
 	if (i < NR_IRQS) {
-		if (irq_list[i].flags & IRQ_FLG_STD)
-			continue;
-
-		seq_printf(p, "%3d: %10u ", i,
-			(i ? kstat_cpu(0).irqs[i] : num_spurious));
-		if (irq_list[i].flags & IRQ_FLG_LOCK)
-			seq_printf(p, "L ");
-		else
-			seq_printf(p, "  ");
-		seq_printf(p, "%s\n", irq_list[i].devname);
+		if (! (irq_list[i].flags & IRQ_FLG_STD)) {
+			seq_printf(p, "%3d: %10u ", i,
+				(i ? kstat_cpu(0).irqs[i] : num_spurious));
+			if (irq_list[i].flags & IRQ_FLG_LOCK)
+				seq_printf(p, "L ");
+			else
+				seq_printf(p, "  ");
+			seq_printf(p, "%s\n", irq_list[i].devname);
+		}
 	}
 
 	if (i == NR_IRQS && mach_get_irq_list)
 		mach_get_irq_list(p, v);
-	return(0);
+	return 0;
 }
 
 void init_irq_proc(void)
--- diff/arch/m68knommu/platform/5307/timers.c	2003-06-09 14:18:17.000000000 +0100
+++ source/arch/m68knommu/platform/5307/timers.c	2004-04-21 10:45:33.583598016 +0100
@@ -127,7 +127,7 @@ void coldfire_profile_tick(int irq, void
 
 void coldfire_profile_init(void)
 {
-	printk("PROFILE: lodging TIMER2 @ %dHz as profile timer\n", PROFILEHZ);
+	printk(KERN_INFO "PROFILE: lodging TIMER2 @ %dHz as profile timer\n", PROFILEHZ);
 
 	/* Set up TIMER 2 as high speed profile clock */
 	mcf_proftp = (volatile struct mcftimer *) (MCF_MBAR + MCFTIMER_BASE2);
--- diff/arch/m68knommu/platform/5307/vectors.c	2003-05-21 11:49:45.000000000 +0100
+++ source/arch/m68knommu/platform/5307/vectors.c	2004-04-21 10:45:33.583598016 +0100
@@ -32,7 +32,7 @@
 asmlinkage void dbginterrupt_c(struct frame *fp)
 {
 	extern void dump(struct pt_regs *fp);
-	printk("%s(%d): BUS ERROR TRAP\n", __FILE__, __LINE__);
+	printk(KERN_DEBUG "%s(%d): BUS ERROR TRAP\n", __FILE__, __LINE__);
 	dump((struct pt_regs *) fp);
 	asm("halt");
 }
--- diff/arch/m68knommu/platform/5407/CLEOPATRA/crt0_ram.S	2003-06-09 14:18:17.000000000 +0100
+++ source/arch/m68knommu/platform/5407/CLEOPATRA/crt0_ram.S	2004-04-21 10:45:33.583598016 +0100
@@ -124,6 +124,7 @@ _start:
 	nop
 
 
+#ifdef CONFIG_ROMFS_FS
 	/*
 	 *	Move ROM filesystem above bss :-)
 	 */
@@ -145,6 +146,12 @@ _copy_romfs:
 	cmp.l	%a0, %a2			/* Check if at end */
 	bne	_copy_romfs
 
+#else /* CONFIG_ROMFS_FS */
+	lea.l	_ebss, %a1
+	move.l	%a1, _ramstart
+#endif /* CONFIG_ROMFS_FS */
+
+
 	/*
 	 *	Zero out the bss region.
 	 */
--- diff/arch/m68knommu/platform/5407/config.c	2003-06-09 14:18:17.000000000 +0100
+++ source/arch/m68knommu/platform/5407/config.c	2004-04-21 10:45:33.584597864 +0100
@@ -14,6 +14,7 @@
 #include <linux/sched.h>
 #include <linux/param.h>
 #include <linux/init.h>
+#include <linux/interrupt.h>
 #include <asm/irq.h>
 #include <asm/dma.h>
 #include <asm/traps.h>
@@ -27,7 +28,7 @@
 /***************************************************************************/
 
 void coldfire_tick(void);
-void coldfire_timer_init(void (*handler)(int, void *, struct pt_regs *));
+void coldfire_timer_init(irqreturn_t (*handler)(int, void *, struct pt_regs *));
 unsigned long coldfire_timer_offset(void);
 void coldfire_trap_init(void);
 void coldfire_reset(void);
@@ -48,6 +49,8 @@ unsigned int   dma_base_addr[MAX_M68K_DM
         MCF_MBAR + MCFDMA_BASE3,
 };
 
+unsigned int dma_device_address[MAX_M68K_DMA_CHANNELS];
+
 /***************************************************************************/
 
 void mcf_autovector(unsigned int vec)
@@ -100,7 +103,13 @@ int mcf_timerirqpending(int timer)
 void config_BSP(char *commandp, int size)
 {
 	mcf_setimr(MCFSIM_IMR_MASKALL);
+
+#if defined(CONFIG_BOOTPARAM)
+	strncpy(commandp, CONFIG_BOOTPARAM_STRING, size);
+	commandp[size-1] = 0;
+#else
 	memset(commandp, 0, size);
+#endif
 
 #if defined(CONFIG_CLEOPATRA)
 	/* Different timer setup - to prevent device clash */
--- diff/arch/m68knommu/platform/68328/config.c	2003-06-30 10:07:28.000000000 +0100
+++ source/arch/m68knommu/platform/68328/config.c	2004-04-21 10:45:33.584597864 +0100
@@ -19,6 +19,7 @@
 #include <linux/mm.h>
 #include <linux/tty.h>
 #include <linux/console.h>
+#include <linux/interrupt.h>
 #include <asm/current.h>
 
 #include <asm/setup.h>
@@ -29,7 +30,7 @@
 #include <asm/MC68328.h>
 
 
-void BSP_sched_init(void (*timer_routine)(int, void *, struct pt_regs *))
+void BSP_sched_init(irqreturn_t (*timer_routine)(int, void *, struct pt_regs *))
 {
 
 #ifdef CONFIG_XCOPILOT_BUGS
@@ -100,20 +101,18 @@ int BSP_set_clock_mmss (unsigned long no
 void BSP_reset (void)
 {
   local_irq_disable();
-  asm volatile ("
-    moveal #0x10c00000, %a0;
-    moveb #0, 0xFFFFF300;
-    moveal 0(%a0), %sp;
-    moveal 4(%a0), %a0;
-    jmp (%a0);
-    ");
+  asm volatile ("moveal #0x10c00000, %a0;\n\t"
+		"moveb #0, 0xFFFFF300;\n\t"
+		"moveal 0(%a0), %sp;\n\t"
+		"moveal 4(%a0), %a0;\n\t"
+		"jmp (%a0);");
 }
 
 void config_BSP(char *command, int len)
 {
-  printk("\n68328 support D. Jeff Dionne <jeff@uclinux.org>\n");
-  printk("68328 support Kenneth Albanowski <kjahds@kjshds.com>\n");
-  printk("68328/Pilot support Bernhard Kuhn <kuhn@lpr.e-technik.tu-muenchen.de>\n");
+  printk(KERN_INFO "\n68328 support D. Jeff Dionne <jeff@uclinux.org>\n");
+  printk(KERN_INFO "68328 support Kenneth Albanowski <kjahds@kjshds.com>\n");
+  printk(KERN_INFO "68328/Pilot support Bernhard Kuhn <kuhn@lpr.e-technik.tu-muenchen.de>\n");
 
   mach_sched_init      = BSP_sched_init;
   mach_tick            = BSP_tick;
@@ -122,4 +121,5 @@ void config_BSP(char *command, int len)
   mach_hwclk           = NULL;
   mach_set_clock_mmss  = NULL;
   mach_reset           = BSP_reset;
+  *command = '\0';
 }
--- diff/arch/m68knommu/platform/68328/ints.c	2004-01-19 10:22:55.000000000 +0000
+++ source/arch/m68knommu/platform/68328/ints.c	2004-04-21 10:45:33.585597712 +0100
@@ -63,15 +63,15 @@ asmlinkage void trap44(void);
 asmlinkage void trap45(void);
 asmlinkage void trap46(void);
 asmlinkage void trap47(void);
-asmlinkage void bad_interrupt(int, void *, struct pt_regs *);
-asmlinkage void inthandler(void);
-asmlinkage void inthandler1(void);
-asmlinkage void inthandler2(void);
-asmlinkage void inthandler3(void);
-asmlinkage void inthandler4(void);
-asmlinkage void inthandler5(void);
-asmlinkage void inthandler6(void);
-asmlinkage void inthandler7(void);
+asmlinkage irqreturn_t bad_interrupt(int, void *, struct pt_regs *);
+asmlinkage irqreturn_t inthandler(void);
+asmlinkage irqreturn_t inthandler1(void);
+asmlinkage irqreturn_t inthandler2(void);
+asmlinkage irqreturn_t inthandler3(void);
+asmlinkage irqreturn_t inthandler4(void);
+asmlinkage irqreturn_t inthandler5(void);
+asmlinkage irqreturn_t inthandler6(void);
+asmlinkage irqreturn_t inthandler7(void);
 
 extern e_vector *_ramvec;
 
@@ -83,27 +83,22 @@ unsigned int local_irq_count[NR_CPUS];
 static irq_node_t int_irq_list[NR_IRQS];
 
 #if !defined(CONFIG_DRAGEN2)
-asm ("
-	.global _start, __ramend
-	.section .romvec
- 
-e_vectors:
-	.long __ramend-4, _start, buserr, trap, trap, trap, trap, trap
-	.long trap, trap, trap, trap, trap, trap, trap, trap
-	.long trap, trap, trap, trap, trap, trap, trap, trap
-	.long trap, trap, trap, trap
-	.long trap, trap, trap, trap
+asm (".global _start, __ramend/n/t"
+     ".section .romvec/n"
+     "e_vectors:\n\t"
+     ".long __ramend-4, _start, buserr, trap, trap, trap, trap, trap\n\t"
+     ".long trap, trap, trap, trap, trap, trap, trap, trap\n\t"
+     ".long trap, trap, trap, trap, trap, trap, trap, trap\n\t"
+     ".long trap, trap, trap, trap\n\t"
+     ".long trap, trap, trap, trap\n\t"
 	/*.long inthandler, inthandler, inthandler, inthandler
 	.long inthandler4, inthandler, inthandler, inthandler   */
 	/* TRAP #0-15 */
-	.long system_call, trap, trap, trap, trap, trap, trap, trap
-	.long trap, trap, trap, trap, trap, trap, trap, trap
-	.long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-	.text
-
-ignore: rte
-
-");
+     ".long system_call, trap, trap, trap, trap, trap, trap, trap\n\t"
+     ".long trap, trap, trap, trap, trap, trap, trap, trap\n\t"
+     ".long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n\t"
+     ".text\n"
+     "ignore: rte");
 #endif
 
 /*
@@ -116,17 +111,17 @@ void init_IRQ(void)
 
 	/* set up the vectors */
 	for (i = 72; i < 256; ++i)
-		_ramvec[i] = (e_vector)bad_interrupt;
+		_ramvec[i] = (e_vector) bad_interrupt;
 
 	_ramvec[32] = system_call;
 
-	_ramvec[65] = inthandler1;
-	_ramvec[66] = inthandler2;
-	_ramvec[67] = inthandler3;
-	_ramvec[68] = inthandler4;
-	_ramvec[69] = inthandler5;
-	_ramvec[70] = inthandler6;
-	_ramvec[71] = inthandler7;
+	_ramvec[65] = (e_vector) inthandler1;
+	_ramvec[66] = (e_vector) inthandler2;
+	_ramvec[67] = (e_vector) inthandler3;
+	_ramvec[68] = (e_vector) inthandler4;
+	_ramvec[69] = (e_vector) inthandler5;
+	_ramvec[70] = (e_vector) inthandler6;
+	_ramvec[71] = (e_vector) inthandler7;
  
 	IVR = 0x40; /* Set DragonBall IVR (interrupt base) to 64 */
 
@@ -142,22 +137,26 @@ void init_IRQ(void)
 	IMR = ~0;
 }
 
-int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *),
-                         unsigned long flags, const char *devname, void *dev_id)
+int request_irq(
+	unsigned int irq,
+	irqreturn_t (*handler)(int, void *, struct pt_regs *),
+	unsigned long flags,
+	const char *devname,
+	void *dev_id)
 {
 	if (irq >= NR_IRQS) {
-		printk ("%s: Unknown IRQ %d from %s\n", __FUNCTION__, irq, devname);
+		printk (KERN_ERR "%s: Unknown IRQ %d from %s\n", __FUNCTION__, irq, devname);
 		return -ENXIO;
 	}
 
 	if (!(int_irq_list[irq].flags & IRQ_FLG_STD)) {
 		if (int_irq_list[irq].flags & IRQ_FLG_LOCK) {
-			printk("%s: IRQ %d from %s is not replaceable\n",
+			printk(KERN_ERR "%s: IRQ %d from %s is not replaceable\n",
 			       __FUNCTION__, irq, int_irq_list[irq].devname);
 			return -EBUSY;
 		}
 		if (flags & IRQ_FLG_REPLACE) {
-			printk("%s: %s can't replace IRQ %d from %s\n",
+			printk(KERN_ERR "%s: %s can't replace IRQ %d from %s\n",
 			       __FUNCTION__, devname, irq, int_irq_list[irq].devname);
 			return -EBUSY;
 		}
@@ -178,12 +177,12 @@ EXPORT_SYMBOL(request_irq);
 void free_irq(unsigned int irq, void *dev_id)
 {
 	if (irq >= NR_IRQS) {
-		printk ("%s: Unknown IRQ %d\n", __FUNCTION__, irq);
+		printk (KERN_ERR "%s: Unknown IRQ %d\n", __FUNCTION__, irq);
 		return;
 	}
 
 	if (int_irq_list[irq].dev_id != dev_id)
-		printk("%s: removing probably wrong IRQ %d from %s\n",
+		printk(KERN_INFO "%s: removing probably wrong IRQ %d from %s\n",
 		       __FUNCTION__, irq, int_irq_list[irq].devname);
 
 	int_irq_list[irq].handler = bad_interrupt;
@@ -201,15 +200,14 @@ int show_interrupts(struct seq_file *p, 
 	int i = *(loff_t *) v;
 
 	if (i < NR_IRQS) {
-		if (int_irq_list[i].flags & IRQ_FLG_STD)
-			continue;
-
-		seq_printf(p, "%3d: %10u ", i, kstat_cpu(0).irqs[i]);
-		if (int_irq_list[i].flags & IRQ_FLG_LOCK)
-			seq_printf(p, "L ");
-		else
-			seq_printf(p, "  ");
-		seq_printf(p, "%s\n", int_irq_list[i].devname);
+		if (int_irq_list[i].devname) {
+			seq_printf(p, "%3d: %10u ", i, kstat_cpu(0).irqs[i]);
+			if (int_irq_list[i].flags & IRQ_FLG_LOCK)
+				seq_printf(p, "L ");
+			else
+				seq_printf(p, "  ");
+			seq_printf(p, "%s\n", int_irq_list[i].devname);
+		}
 	}
 	if (i == NR_IRQS)
 		seq_printf(p, "   : %10u   spurious\n", num_spurious);
@@ -279,7 +277,7 @@ void process_int(int vec, struct pt_regs
 		if (int_irq_list[irq].handler) {
 			int_irq_list[irq].handler(irq, int_irq_list[irq].dev_id, fp);
 		} else {
-			printk("unregistered interrupt %d!\nTurning it off in the IMR...\n", irq);
+			printk(KERN_ERR "unregistered interrupt %d!\nTurning it off in the IMR...\n", irq);
 			IMR |= mask;
 		}
 		pend &= ~mask;
--- diff/arch/m68knommu/platform/68360/commproc.c	2003-05-21 11:49:50.000000000 +0100
+++ source/arch/m68knommu/platform/68360/commproc.c	2004-04-21 10:45:33.585597712 +0100
@@ -213,7 +213,7 @@ cpm_install_handler(int vec, void (*hand
 	request_irq(vec, handler, IRQ_FLG_LOCK, "timer", dev_id);
 
 /* 	if (cpm_vecs[vec].handler != 0) */
-/* 		printk("CPM interrupt %x replacing %x\n", */
+/* 		printk(KERN_INFO "CPM interrupt %x replacing %x\n", */
 /* 			(uint)handler, (uint)cpm_vecs[vec].handler); */
 /* 	cpm_vecs[vec].handler = handler; */
 /* 	cpm_vecs[vec].dev_id = dev_id; */
--- diff/arch/m68knommu/platform/68360/config.c	2003-07-11 09:39:50.000000000 +0100
+++ source/arch/m68knommu/platform/68360/config.c	2004-04-21 10:45:33.585597712 +0100
@@ -181,12 +181,12 @@ void config_BSP(char *command, int len)
      }
   }
 
-  printk("\n68360 QUICC support (C) 2000 Lineo Inc.\n");
+  printk(KERN_INFO "\n68360 QUICC support (C) 2000 Lineo Inc.\n");
 
 #if defined(CONFIG_UCQUICC) && 0
-  printk("uCquicc serial string [%s]\n",getserialnum());
+  printk(KERN_INFO "uCquicc serial string [%s]\n",getserialnum());
   p = scc1_hwaddr = gethwaddr(0);
-  printk("uCquicc hwaddr %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
+  printk(KERN_INFO "uCquicc hwaddr %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
          p[0], p[1], p[2], p[3], p[4], p[5]);
 
   p = getbenv("APPEND");
--- diff/arch/m68knommu/platform/68360/ints.c	2004-01-19 10:22:55.000000000 +0000
+++ source/arch/m68knommu/platform/68360/ints.c	2004-04-21 10:45:33.586597560 +0100
@@ -36,8 +36,8 @@ extern void cpm_interrupt_init(void);
 asmlinkage void system_call(void);
 asmlinkage void buserr(void);
 asmlinkage void trap(void);
-asmlinkage void bad_interrupt(void);
-asmlinkage void inthandler(void);
+asmlinkage irqreturn_t bad_interrupt(void);
+asmlinkage irqreturn_t inthandler(void);
 
 extern void *_ramvec[];
 
@@ -141,7 +141,7 @@ void M68360_insert_irq(irq_node_t **list
 	irq_node_t *cur;
 
 	if (!node->dev_id)
-		printk("%s: Warning: dev_id of %s is zero\n",
+		printk(KERN_INFO "%s: Warning: dev_id of %s is zero\n",
 		       __FUNCTION__, node->devname);
 
 	local_irq_save(flags);
@@ -176,30 +176,34 @@ void M68360_delete_irq(irq_node_t **list
 		}
 	}
 	local_irq_restore(flags);
-	printk ("%s: tried to remove invalid irq\n", __FUNCTION__);
+	printk (KERN_INFO "%s: tried to remove invalid irq\n", __FUNCTION__);
 }
 #endif
 
-int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *),
-                unsigned long flags, const char *devname, void *dev_id)
+int request_irq(
+	unsigned int irq,
+	irqreturn_t (*handler)(int, void *, struct pt_regs *),
+	unsigned long flags,
+	const char *devname,
+	void *dev_id)
 {
 	int mask = (1<<irq);
 
 	irq += (CPM_VECTOR_BASE<<4);
 
 	if (irq >= INTERNAL_IRQS) {
-		printk ("%s: Unknown IRQ %d from %s\n", __FUNCTION__, irq, devname);
+		printk (KERN_ERR "%s: Unknown IRQ %d from %s\n", __FUNCTION__, irq, devname);
 		return -ENXIO;
 	}
 
 	if (!(int_irq_list[irq].flags & IRQ_FLG_STD)) {
 		if (int_irq_list[irq].flags & IRQ_FLG_LOCK) {
-			printk("%s: IRQ %d from %s is not replaceable\n",
+			printk(KERN_ERR "%s: IRQ %d from %s is not replaceable\n",
 			       __FUNCTION__, irq, int_irq_list[irq].devname);
 			return -EBUSY;
 		}
 		if (flags & IRQ_FLG_REPLACE) {
-			printk("%s: %s can't replace IRQ %d from %s\n",
+			printk(KERN_ERR "%s: %s can't replace IRQ %d from %s\n",
 			       __FUNCTION__, devname, irq, int_irq_list[irq].devname);
 			return -EBUSY;
 		}
@@ -222,12 +226,12 @@ EXPORT_SYMBOL(request_irq);
 void free_irq(unsigned int irq, void *dev_id)
 {
 	if (irq >= INTERNAL_IRQS) {
-		printk ("%s: Unknown IRQ %d\n", __FUNCTION__, irq);
+		printk (KERN_ERR "%s: Unknown IRQ %d\n", __FUNCTION__, irq);
 		return;
 	}
 
 	if (int_irq_list[irq].dev_id != dev_id)
-		printk("%s: removing probably wrong IRQ %d from %s\n",
+		printk(KERN_INFO "%s: removing probably wrong IRQ %d from %s\n",
 		       __FUNCTION__, irq, int_irq_list[irq].devname);
 	int_irq_list[irq].handler = NULL;
 	int_irq_list[irq].flags   = IRQ_FLG_STD;
@@ -250,7 +254,7 @@ EXPORT_SYMBOL(free_irq);
 void M68360_enable_irq(unsigned int irq)
 {
 	if (irq >= INTERNAL_IRQS) {
-		printk("%s: Unknown IRQ %d\n", __FUNCTION__, irq);
+		printk(KERN_ERR "%s: Unknown IRQ %d\n", __FUNCTION__, irq);
 		return;
 	}
 
@@ -264,7 +268,7 @@ void M68360_enable_irq(unsigned int irq)
 void M68360_disable_irq(unsigned int irq)
 {
 	if (irq >= INTERNAL_IRQS) {
-		printk("%s: Unknown IRQ %d\n", __FUNCTION__, irq);
+		printk(KERN_ERR "%s: Unknown IRQ %d\n", __FUNCTION__, irq);
 		return;
 	}
 
@@ -281,15 +285,14 @@ int show_interrupts(struct seq_file *p, 
 	int i = *(loff_t *) v;
 
 	if (i < NR_IRQS) {
-		if (int_irq_list[i].flags & IRQ_FLG_STD)
-			continue;
-
-		seq_printf(p, "%3d: %10u ", i, kstat_cpu(0).irqs[i]);
-		if (int_irq_list[i].flags & IRQ_FLG_LOCK)
-			seq_printf(p, "L ");
-		else
-			seq_printf(p, "  ");
-		seq_printf(p, "%s\n", int_irq_list[i].devname);
+		if (int_irq_list[i].devname) {
+			seq_printf(p, "%3d: %10u ", i, kstat_cpu(0).irqs[i]);
+			if (int_irq_list[i].flags & IRQ_FLG_LOCK)
+				seq_printf(p, "L ");
+			else
+				seq_printf(p, "  ");
+			seq_printf(p, "%s\n", int_irq_list[i].devname);
+		}
 	}
 	if (i == NR_IRQS)
 		seq_printf(p, "   : %10u   spurious\n", num_spurious);
@@ -323,9 +326,10 @@ void process_int(int vec, struct pt_regs
 		kstat_cpu(0).irqs[irq]++;
 		pquicc->intr_cisr = (1 << vec); /* indicate that irq has been serviced */
 	} else {
-		printk("unregistered interrupt %d!\nTurning it off in the CIMR...\n", irq);
+		printk(KERN_ERR "unregistered interrupt %d!\nTurning it off in the CIMR...\n", irq);
 		/* *(volatile unsigned long *)0xfffff304 |= mask; */
 		pquicc->intr_cimr &= ~(1 << vec);
 		num_spurious += 1;
 	}
+	return(IRQ_HANDLED);
 }
--- diff/arch/m68knommu/platform/68EZ328/config.c	2003-06-09 14:18:17.000000000 +0100
+++ source/arch/m68knommu/platform/68EZ328/config.c	2004-04-21 10:45:33.586597560 +0100
@@ -106,12 +106,12 @@ void config_BSP(char *command, int len)
 {
   unsigned char *p;
 
-  printk("\n68EZ328 DragonBallEZ support (C) 1999 Rt-Control, Inc\n");
+  printk(KERN_INFO "\n68EZ328 DragonBallEZ support (C) 1999 Rt-Control, Inc\n");
 
 #ifdef CONFIG_UCSIMM
-  printk("uCsimm serial string [%s]\n",getserialnum());
+  printk(KERN_INFO "uCsimm serial string [%s]\n",getserialnum());
   p = cs8900a_hwaddr = gethwaddr(0);
-  printk("uCsimm hwaddr %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
+  printk(KERN_INFO "uCsimm hwaddr %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
          p[0], p[1], p[2], p[3], p[4], p[5]);
 
   p = getbenv("APPEND");
--- diff/arch/m68knommu/platform/68VZ328/de2/config.c	2003-07-11 09:39:50.000000000 +0100
+++ source/arch/m68knommu/platform/68VZ328/de2/config.c	2004-04-21 10:45:33.587597408 +0100
@@ -103,19 +103,6 @@ static void dragen2_reset(void)
 	);
 }
 
-int dragen2_cs8900_setup(struct net_device *dev)
-{
-	static int nbdev = 0;
-
-	if (++nbdev == 1) {
-		/* Set the ETH hardware address from its flash monitor location */
-		memcpy(dev->dev_addr, (void *) 0x400fffa, 6);
-		dev->irq = INT1_IRQ_NUM;
-		return dev->base_addr = 0x08000041;
-	}
-	return 1;					/* no more interface */
-}
-
 static void init_hardware(void)
 {
 #ifdef CONFIG_DIRECT_IO_ACCESS
@@ -185,7 +172,7 @@ static void init_hardware(void)
 
 void config_BSP(char *command, int size)
 {
-	printk("68VZ328 DragonBallVZ support (c) 2001 Lineo, Inc.\n");
+	printk(KERN_INFO "68VZ328 DragonBallVZ support (c) 2001 Lineo, Inc.\n");
 
 #if defined(CONFIG_BOOTPARAM)
 	strncpy(command, CONFIG_BOOTPARAM_STRING, size);
--- diff/arch/m68knommu/platform/68VZ328/de2/crt0_ram.S	2003-06-09 14:18:17.000000000 +0100
+++ source/arch/m68knommu/platform/68VZ328/de2/crt0_ram.S	2004-04-21 10:45:33.587597408 +0100
@@ -8,17 +8,21 @@
 #define	MEM_END	0x00800000	/* Memory size 8Mb */
 #endif
 
+#undef CRT_DEBUG
+
+.macro	PUTC CHAR
+#ifdef CRT_DEBUG
+	moveq	#\CHAR, %d7
+	jsr	putc
+#endif
+.endm
+
 	.global	_start
 	.global _rambase
 	.global _ramvec
 	.global	_ramstart
 	.global	_ramend
 	
-.macro	PUTC CHAR
-	moveq	#\CHAR, %d7
-	jsr	putc
-.endm
-
 	.data
 
 /*
@@ -120,6 +124,7 @@ _start:
  * Local functions
  */
  
+#ifdef CRT_DEBUG
 putc:
 	moveb	%d7, 0xfffff907
 1:
@@ -127,3 +132,4 @@ putc:
 	andw	#0x2000, %d7
 	beq	1b
 	rts
+#endif
--- diff/arch/m68knommu/platform/68VZ328/ucdimm/config.c	2003-06-09 14:18:17.000000000 +0100
+++ source/arch/m68knommu/platform/68VZ328/ucdimm/config.c	2004-04-21 10:45:33.587597408 +0100
@@ -99,11 +99,11 @@ void config_BSP(char *command, int len)
 {
 	unsigned char *p;
 
-	printk("\n68VZ328 DragonBallVZ support (c) 2001 Lineo, Inc.\n");
+	printk(KERN_INFO "\n68VZ328 DragonBallVZ support (c) 2001 Lineo, Inc.\n");
 
-	printk("uCdimm serial string [%s]\n",getserialnum());
+	printk(KERN_INFO "uCdimm serial string [%s]\n",getserialnum());
 	p = cs8900a_hwaddr = gethwaddr(0);
-	printk("uCdimm hwaddr %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
+	printk(KERN_INFO "uCdimm hwaddr %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
 		p[0], p[1], p[2], p[3], p[4], p[5]);
 	p = getbenv("APPEND");
 	if (p) strcpy(p,command);
--- diff/arch/mips/Kconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/mips/Kconfig	2004-04-21 10:45:33.589597104 +0100
@@ -29,6 +29,7 @@ menu "Machine selection"
 
 config MACH_JAZZ
 	bool "Support for the Jazz family of machines"
+	select ISA
 	help
 	 This a family of machines based on the MIPS R4030 chipset which was
 	 used by several vendors to build RISC/os and Windows NT workstations.
@@ -76,18 +77,24 @@ config MACH_VR41XX
 config CASIO_E55
 	bool "Support for CASIO CASSIOPEIA E-10/15/55/65"
 	depends on MACH_VR41XX
+	select IRQ_CPU
+	select ISA
 
 config IBM_WORKPAD
 	bool "Support for IBM WorkPad z50"
 	depends on MACH_VR41XX
+	select IRQ_CPU
+	select ISA
 
 config NEC_EAGLE
 	bool "Support for NEC Eagle/Hawk board"
+	select IRQ_CPU
 	depends on MACH_VR41XX
 
 config TANBAC_TB0226
 	bool "Support for TANBAC TB0226 (Mbase)"
 	depends on MACH_VR41XX
+	select IRQ_CPU
 	help
 	  The TANBAC TB0226 (Mbase) is a MIPS-based platform manufactured by TANBAC.
 	  Please refer to <http://www.tanbac.co.jp/> about Mbase.
@@ -95,17 +102,20 @@ config TANBAC_TB0226
 config TANBAC_TB0229
 	bool "Support for TANBAC TB0229 (VR4131DIMM)"
 	depends on MACH_VR41XX
+	select IRQ_CPU
 	help
 	  The TANBAC TB0229 (VR4131DIMM) is a MIPS-based platform manufactured by TANBAC.
 	  Please refer to <http://www.tanbac.co.jp/> about VR4131DIMM.
 
 config VICTOR_MPC30X
 	bool "Support for Victor MP-C303/304"
+	select IRQ_CPU
 	depends on MACH_VR41XX
 
 config ZAO_CAPCELLA
 	bool "Support for ZAO Networks Capcella"
 	depends on MACH_VR41XX
+	select IRQ_CPU
 
 config TOSHIBA_JMR3927
 	bool "Support for Toshiba JMR-TX3927 board"
@@ -114,9 +124,11 @@ config TOSHIBA_JMR3927
 config MIPS_COBALT
 	bool "Support for Cobalt Server (EXPERIMENTAL)"
 	depends on EXPERIMENTAL
+	select IRQ_CPU
 
 config MACH_DECSTATION
 	bool "Support for DECstations"
+	select IRQ_CPU
 	depends on MIPS32 || EXPERIMENTAL
 	---help---
 	  This enables support for DEC's MIPS based workstations.  For details
@@ -150,7 +162,9 @@ config EVB_PCI1
 config MIPS_EV96100
 	bool "Support for Galileo EV96100 Evaluation board (EXPERIMENTAL)"
 	depends on EXPERIMENTAL
+	select IRQ_CPU
 	select MIPS_GT96100
+	select RM7000_CPU_SCACHE
 	help
 	  This is an evaluation board based on the Galileo GT-96100 LAN/WAN
 	  communications controllers containing a MIPS R5000 compatible core
@@ -168,6 +182,7 @@ config MIPS_IVR
 
 config LASAT
 	bool "Support for LASAT Networks platforms"
+	select R5000_CPU_SCACHE
 
 config PICVUE
 	tristate "PICVUE LCD display driver"
@@ -187,6 +202,8 @@ config LASAT_SYSCTL
 
 config HP_LASERJET
 	bool "Support for Hewlett Packard LaserJet board"
+	depends on BROKEN
+	select IRQ_CPU
 
 config MIPS_ITE8172
 	bool "Support for ITE 8172G board"
@@ -214,40 +231,61 @@ config MIPS_ATLAS
 
 config MIPS_MALTA
 	bool "Support for MIPS Malta board"
+	select HAVE_STD_PC_SERIAL_PORT
 	help
 	  This enables support for the VR5000-based MIPS Malta evaluation
 	  board.
 
 config MIPS_SEAD
 	bool "Support for MIPS SEAD board (EXPERIMENTAL)"
+	select IRQ_CPU
 	depends on EXPERIMENTAL
 
 config MOMENCO_OCELOT
 	bool "Support for Momentum Ocelot board"
+	select IRQ_CPU
+	select IRQ_CPU_RM7K
+	select RM7000_CPU_SCACHE
 	help
 	  The Ocelot is a MIPS-based Single Board Computer (SBC) made by
 	  Momentum Computer <http://www.momenco.com/>.
 
 config MOMENCO_OCELOT_G
 	bool "Support for Momentum Ocelot-G board"
+	select IRQ_CPU
+	select IRQ_CPU_RM7K
+	select RM7000_CPU_SCACHE
 	help
 	  The Ocelot is a MIPS-based Single Board Computer (SBC) made by
 	  Momentum Computer <http://www.momenco.com/>.
 
 config MOMENCO_OCELOT_C
 	bool "Support for Momentum Ocelot-C board"
+	select IRQ_CPU
+	select RM7000_CPU_SCACHE
 	help
 	  The Ocelot is a MIPS-based Single Board Computer (SBC) made by
 	  Momentum Computer <http://www.momenco.com/>.
 
 config MOMENCO_JAGUAR_ATX
 	bool "Support for Momentum Jaguar board"
+	select IRQ_CPU
+	select IRQ_CPU_RM7K
+	select LIMITED_DMA
+	select RM7000_CPU_SCACHE
 	help
 	  The Jaguar ATX is a MIPS-based Single Board Computer (SBC) made by
 	  Momentum Computer <http://www.momenco.com/>.
 
+config JAGUAR_DMALOW
+	bool "Low DMA Mode"
+	depends on MOMENCO_JAGUAR_ATX
+	help
+	  Select to Y if jump JP5 is set on your board, N otherwise.  Normally
+	  the jumper is set, so if you feel unsafe, just say Y.
+
 config PMC_YOSEMITE
-	bool "Support for PMC-Siera Yosemite eval board"
+	bool "Support for PMC-Sierra Yosemite eval board"
 	help
 	  Yosemite is an evaluation board for the RM9000x2 processor
 	  manufactured by PMC-Sierra
@@ -259,12 +297,18 @@ config HYPERTRANSPORT
 config DDB5074
 	bool "Support for NEC DDB Vrc-5074 (EXPERIMENTAL)"
 	depends on EXPERIMENTAL
+	select HAVE_STD_PC_SERIAL_PORT
+	select IRQ_CPU
+	select ISA
 	help
 	  This enables support for the VR5000-based NEC DDB Vrc-5074
 	  evaluation board.
 
 config DDB5476
 	bool "Support for NEC DDB Vrc-5476"
+	select HAVE_STD_PC_SERIAL_PORT
+	select IRQ_CPU
+	select ISA
 	help
 	  This enables support for the R5432-based NEC DDB Vrc-5476
 	  evaluation board.
@@ -275,6 +319,7 @@ config DDB5476
 
 config DDB5477
 	bool "Support for NEC DDB Vrc-5477"
+	select IRQ_CPU
 	help
 	  This enables support for the R5432-based NEC DDB Vrc-5477,
 	  or Rockhopper/SolutionGear boards with R5432/R5500 CPUs.
@@ -289,9 +334,12 @@ config DDB5477_BUS_FREQUENCY
 	
 config NEC_OSPREY
 	bool "Support for NEC Osprey board"
+	select IRQ_CPU
 
 config SGI_IP22
 	bool "Support for SGI IP22 (Indy/Indigo2)"
+	select IP22_CPU_SCACHE
+	select IRQ_CPU
 	help
 	  This are the SGI Indy, Challenge S and Indigo2, as well as certain
 	  OEM variants like the Tandem CMN B006S. To compile a Linux kernel
@@ -363,6 +411,8 @@ config REPLICATE_EXHANDLERS
 config SGI_IP32
 	bool "Support for SGI IP32 (O2) (EXPERIMENTAL)"
 	depends on EXPERIMENTAL
+	select R5000_CPU_SCACHE
+	select RM7000_CPU_SCACHE
 	help
 	  If you want this kernel to run on SGI O2 workstation, say Y here.
 
@@ -383,6 +433,8 @@ config SOC_AU1100
         bool "SOC_AU1100"
 config SOC_AU1500
         bool "SOC_AU1500"
+config SOC_AU1550
+        bool "SOC_AU1550"
 
 endchoice
 
@@ -409,6 +461,10 @@ config MIPS_PB1500
 	bool "PB1500 board"
 	depends on SOC_AU1500
 
+config MIPS_PB1550
+	bool "PB1550 board"
+	depends on SOC_AU1550
+
 config MIPS_DB1000
 	bool "DB1000 board"
 	depends on SOC_AU1000
@@ -421,6 +477,10 @@ config MIPS_DB1500
 	bool "DB1500 board"
 	depends on SOC_AU1500
 
+config MIPS_DB1550
+	bool "DB1550 board"
+	depends on SOC_AU1550
+
 config MIPS_BOSPORUS
 	bool "Bosporus board"
 	depends on SOC_AU1500
@@ -650,6 +710,8 @@ config SIBYTE_TBPROF
 
 config SNI_RM200_PCI
 	bool "Support for SNI RM200 PCI"
+	select HAVE_STD_PC_SERIAL_PORT
+	select ISA
 	help
 	  The SNI RM200 PCI was a MIPS-based platform manufactured by Siemens
 	  Nixdorf Informationssysteme (SNI), parent company of Pyramid
@@ -658,6 +720,7 @@ config SNI_RM200_PCI
 
 config TOSHIBA_RBTX4927
 	bool "Support for Toshiba TBTX49[23]7 board"
+	select ISA
 	depends on MIPS32
 
 config RWSEM_GENERIC_SPINLOCK
@@ -691,7 +754,7 @@ config	DMA_IP27
 
 config	DMA_NONCOHERENT
 	bool
-	depends on ZAO_CAPCELLA || VICTOR_MPC30X || TOSHIBA_JMR3927 || TOSHIBA_RBTX4927 || SNI_RM200_PCI || SGI_IP32 || SGI_IP22 || NEC_EAGLE || NEC_OSPREY || DDB5477 || DDB5476 || DDB5074 || MOMENCO_OCELOT || MOMENCO_OCELOT_C || MOMENCO_OCELOT_G || MOMENCO_JAGUAR_ATX || MIPS_BOSPORUS || MIPS_DB1000 || MIPS_DB1100 || MIPS_DB1500 || MIPS_SEAD || MIPS_MALTA || MIPS_MAGNUM_4000 || MIPS_MIRAGE || MIPS_MTX1 || MIPS_XXS1500 || OLIVETTI_M700 || MIPS_ATLAS || LASAT || MIPS_ITE8172 || IBM_WORKPAD || HP_LASERJET || MIPS_IVR || MIPS_EV96100 || MIPS_EV64120 || MACH_DECSTATION || MIPS_COBALT || MIPS_PB1500 || MIPS_PB1100 || MIPS_PB1000 || CASIO_E55 || ACER_PICA_61 || TANBAC_TB0226 || TANBAC_TB0229
+	depends on ZAO_CAPCELLA || VICTOR_MPC30X || TOSHIBA_JMR3927 || TOSHIBA_RBTX4927 || SNI_RM200_PCI || SGI_IP32 || SGI_IP22 || NEC_EAGLE || NEC_OSPREY || DDB5477 || DDB5476 || DDB5074 || MOMENCO_OCELOT || MOMENCO_OCELOT_C || MOMENCO_OCELOT_G || MOMENCO_JAGUAR_ATX || MIPS_BOSPORUS || MIPS_DB1000 || MIPS_DB1100 || MIPS_DB1500 || MIPS_SEAD || MIPS_MALTA || MIPS_MAGNUM_4000 || MIPS_MIRAGE || MIPS_MTX1 || MIPS_XXS1500 || OLIVETTI_M700 || MIPS_ATLAS || LASAT || MIPS_ITE8172 || IBM_WORKPAD || HP_LASERJET || MIPS_IVR || MIPS_EV96100 || MIPS_EV64120 || MACH_DECSTATION || MIPS_COBALT || MIPS_PB1500 || MIPS_PB1100 || MIPS_PB1000 || MIPS_PB1550 || CASIO_E55 || ACER_PICA_61 || TANBAC_TB0226 || TANBAC_TB0229
 	default y
 
 config EARLY_PRINTK
@@ -709,6 +772,10 @@ config I8259
 	depends on SNI_RM200_PCI || DDB5477 || DDB5476 || DDB5074 || MACH_JAZZ || MIPS_MALTA || MIPS_COBALT
 	default y
 
+config LIMITED_DMA
+	bool
+	select HIGHMEM
+
 config MIPS_BONITO64
 	bool
 	depends on MIPS_ATLAS || MIPS_MALTA
@@ -726,7 +793,7 @@ config MIPS_NILE4
 
 config CPU_LITTLE_ENDIAN
 	bool "Generate little endian code"
-	default y if ACER_PICA_61 || CASIO_E55 || DDB5074 || DDB5476 || DDB5477 || MACH_DECSTATION || HP_LASERJET || IBM_WORKPAD || LASAT || MIPS_COBALT || MIPS_ITE8172 || MIPS_IVR || MIPS_PB1000 || MIPS_PB1100 || MIPS_PB1500 || NEC_OSPREY || NEC_EAGLE || OLIVETTI_M700 || SNI_RM200_PCI || VICTOR_MPC30X || ZAO_CAPCELLA
+	default y if ACER_PICA_61 || CASIO_E55 || DDB5074 || DDB5476 || DDB5477 || MACH_DECSTATION || HP_LASERJET || IBM_WORKPAD || LASAT || MIPS_COBALT || MIPS_ITE8172 || MIPS_IVR || SOC_AU1X00 || NEC_OSPREY || NEC_EAGLE || OLIVETTI_M700 || SNI_RM200_PCI || VICTOR_MPC30X || ZAO_CAPCELLA
 	default n if BAGET_MIPS || MIPS_EV64120 || MIPS_EV96100 || MOMENCO_OCELOT || MOMENCO_OCELOT_G || SGI_IP22 || SGI_IP27 || SGI_IP32 || TOSHIBA_JMR3927
 	help
 	  Some MIPS machines can be configured for either little or big endian
@@ -735,13 +802,9 @@ config CPU_LITTLE_ENDIAN
 
 config IRQ_CPU
 	bool
-	depends on CASIO_E55 || DDB5074 || DDB5476 || DDB5477 || MACH_DECSTATION || HP_LASERJET || IBM_WORKPAD || MIPS_COBALT || MIPS_EV96100 || MOMENCO_OCELOT || MIPS_SEAD || MOMENCO_OCELOT_G || NEC_EAGLE || NEC_OSPREY || SGI_IP22 || VICTOR_MPC30X || TANBAC_TB0226 || TANBAC_TB0229 || ZAO_CAPCELLA
-	default y
 
 config IRQ_CPU_RM7K
 	bool
-	depends on MOMENCO_JAGUAR_ATX || MOMENCO_OCELOT || MOMENCO_OCELOT_G
-	default y
 
 config DUMMY_KEYB
 	bool
@@ -904,8 +967,6 @@ config FB_G364
 
 config HAVE_STD_PC_SERIAL_PORT
 	bool
-	depends on DDB5476 || DDB5074 || MIPS_MALTA
-	default y
 
 config VR4181
 	bool
@@ -926,11 +987,6 @@ config ARC_PROMLIB
 	depends on MACH_JAZZ || SNI_RM200_PCI || SGI_IP22 || SGI_IP32
 	default y
 
-config BOARD_SCACHE
-	bool
-	depends on CPU_RM9000 || MIPS_EV96100 || MOMENCO_OCELOT || SGI_IP22
-	default y
-
 config ARC64
 	bool
 	depends on SGI_IP27
@@ -1089,15 +1145,20 @@ config PAGE_SIZE_64KB
 
 endchoice
 
+config BOARD_SCACHE
+	bool
+
+config IP22_CPU_SCACHE
+	bool
+	select BOARD_SCACHE
+
 config R5000_CPU_SCACHE
 	bool
-	depends on CPU_NEVADA || CPU_R5000
-	default y if SGI_IP22 || SGI_IP32 || LASAT
+	select BOARD_SCACHE
 
-config BOARD_SCACHE
+config RM7000_CPU_SCACHE
 	bool
-	depends on CPU_NEVADA || CPU_R4X00 || CPU_R5000
-	default y if SGI_IP22 || (SGI_IP32 && CPU_R5000) || R5000_CPU_SCACHE
+	select BOARD_SCACHE
 
 config SIBYTE_DMA_PAGEOPS
 	bool "Use DMA to clear/copy pages"
@@ -1190,7 +1251,7 @@ config CPU_HAS_SYNC
 #
 config HIGHMEM
 	bool "High Memory Support"
-	depends on MIPS32 && (CPU_R3000 || CPU_SB1 || CPU_R7000 || CPU_R10000) && !(BAGET_MIPS || MACH_DECSTATION)
+	depends on MIPS32 && (CPU_R3000 || CPU_SB1 || CPU_R7000 || CPU_RM9000 || CPU_R10000) && !(BAGET_MIPS || MACH_DECSTATION || MOMENCO_JAGUAR_ATX)
 
 config SMP
 	bool "Multi-Processing support"
@@ -1277,7 +1338,7 @@ menu "Bus options (PCI, PCMCIA, EISA, IS
 
 config PCI
 	bool "Support for PCI controller"
-	depends on MIPS_DB1000 || DDB5074 || DDB5476 || DDB5477 || HP_LASERJET || LASAT || MIPS_IVR || MIPS_ATLAS || MIPS_COBALT || MIPS_EV64120 || MIPS_EV96100 || MIPS_ITE8172 || MIPS_MALTA || MOMENCO_OCELOT || MOMENCO_OCELOT_C || MOMENCO_OCELOT_G || MOMENCO_JAGUAR_ATX || MIPS_PB1000 || MIPS_PB1100 || SOC_AU1500 || NEC_EAGLE || SGI_IP27 || SGI_IP32 || SIBYTE_HAS_PCI || SNI_RM200_PCI || TANBAC_TB0226 || TANBAC_TB0229 || TOSHIBA_JMR3927 || TOSHIBA_RBTX4927 || VICTOR_MPC30X || ZAO_CAPCELLA
+	depends on MIPS_DB1000 || DDB5074 || DDB5476 || DDB5477 || HP_LASERJET || LASAT || MIPS_IVR || MIPS_ATLAS || MIPS_COBALT || MIPS_EV64120 || MIPS_EV96100 || MIPS_ITE8172 || MIPS_MALTA || MOMENCO_OCELOT || MOMENCO_OCELOT_C || MOMENCO_OCELOT_G || MOMENCO_JAGUAR_ATX || MIPS_PB1000 || MIPS_PB1100 || SOC_AU1500 || SOC_AU1550 || NEC_EAGLE || SGI_IP27 || SGI_IP32 || SIBYTE_HAS_PCI || SNI_RM200_PCI || TANBAC_TB0226 || TANBAC_TB0229 || TOSHIBA_JMR3927 || TOSHIBA_RBTX4927 || VICTOR_MPC30X || ZAO_CAPCELLA
 	help
 	  Find out whether you have a PCI motherboard. PCI is the name of a
 	  bus system, i.e. the way the CPU talks to the other stuff inside
@@ -1291,20 +1352,18 @@ config PCI
 
 source "drivers/pci/Kconfig"
 
+#
+# ISA support is now enabled via select.  Too many systems still have the one
+# or other ISA chip on the board that users don't know about so don't expect
+# users to choose the right thing ...
+#
 config ISA
-	bool "ISA bus support"
-	depends on ACER_PICA_61 || SGI_IP22 || MIPS_MAGNUM_4000 || OLIVETTI_M700 || SNI_RM200_PCI
-	default y if TOSHIBA_RBTX4927 || DDB5476 || DDB5074 || IBM_WORKPAD || CASIO_E55
-	help
-	  Find out whether you have ISA slots on your motherboard.  ISA is the
-	  name of a bus system, i.e. the way the CPU talks to the other stuff
-	  inside your box.  Other bus systems are PCI, EISA, or VESA.  ISA is
-	  an older system, now being displaced by PCI; newer boards don't
-	  support it.  If you have ISA, say Y, otherwise N.
+	bool
 
 config EISA
 	bool "EISA support"
-	depends on ISA && (SGI_IP22 || SNI_RM200_PCI)
+	depends on SGI_IP22 || SNI_RM200_PCI
+	select ISA
 	---help---
 	  The Extended Industry Standard Architecture (EISA) bus was
 	  developed as an open alternative to the IBM MicroChannel bus.
@@ -1448,7 +1507,7 @@ config CMDLINE
 config DEBUG_KERNEL
 	bool "Kernel debugging"
 
-	config DEBUG_STACK_USAGE
+config DEBUG_STACK_USAGE
 	bool "Enable stack utilization instrumentation"
 	depends on DEBUG_KERNEL
 	help
@@ -1457,6 +1516,14 @@ config DEBUG_KERNEL
 
 	  This option will slow down process creation somewhat.
 
+config DEBUG_SLAB
+	bool "Debug memory allocations"
+	depends on DEBUG_KERNEL && !CPU_HAS_LLDSCD
+	help
+	  Say Y here to have the kernel do limited verification on memory
+	  allocation as well as poisoning memory on free to catch use of freed
+	  memory.
+
 config KGDB
 	bool "Remote GDB kernel debugging"
 	depends on DEBUG_KERNEL
@@ -1478,8 +1545,7 @@ config GDB_CONSOLE
 
 config DEBUG_INFO
 	bool "Compile the kernel with debug info"
-	depends on DEBUG_KERNEL && !KGDB
-	default y if KGDB
+	depends on DEBUG_KERNEL
 	help
 	  If you say Y here the resulting kernel image will include
 	  debugging info resulting in a larger kernel image.
@@ -1488,7 +1554,8 @@ config DEBUG_INFO
 
 config SB1XXX_CORELIS
 	bool "Corelis Debugger"
-	depends on SIBYTE_SB1xxx_SOC && DEBUG_INFO
+	depends on SIBYTE_SB1xxx_SOC
+	select DEBUG_INFO
 	help
 	  Select compile flags that produce code that can be processed by the
 	  Corelis mksym utility and UDB Emulator.
--- diff/arch/mips/Makefile	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/Makefile	2004-04-21 10:45:33.590596952 +0100
@@ -57,7 +57,7 @@ endif
 cflags-y			:= -I $(TOPDIR)/include/asm/gcc
 cflags-y			+= -G 0 -mno-abicalls -fno-pic -pipe
 cflags-y			+= $(call check_gcc, -finline-limit=100000,)
-LDFLAGS_vmlinux			+= -G 0 -static # -N
+LDFLAGS_vmlinux			+= -G 0 -static -n
 MODFLAGS			+= -mlong-calls
 
 cflags-$(CONFIG_SB1XXX_CORELIS)	+= -mno-sched-prolog -fno-omit-frame-pointer
@@ -108,9 +108,14 @@ while :; do \
 	gas_abi=; gas_opt=; gas_cpu=; gas_isa=; \
 	break; \
 done; \
-if test x$(gcc-abi) != x$(gas-abi); then \
+if test "$(gcc-abi)" != "$(gas-abi)"; then \
 	gas_abi="-Wa,-$(gas-abi) -Wa,-mgp$(gcc-abi)"; \
 fi; \
+if test "$$gcc_opt" = -march= && test -n "$$gcc_abi"; then \
+	$(CC) $$gcc_abi $$gcc_opt$$gcc_cpu -S -o /dev/null \
+		-xc /dev/null > /dev/null 2>&1 && \
+		gcc_isa=; \
+fi; \
 echo $$gcc_abi $$gcc_opt$$gcc_cpu $$gcc_isa $$gas_abi $$gas_opt$$gas_cpu $$gas_isa)
 
 #
@@ -238,6 +243,13 @@ cflags-$(CONFIG_MIPS_PB1500)	+= -Iinclud
 load-$(CONFIG_MIPS_PB1500)	+= 0x80100000
 
 #
+# AMD Alchemy Pb1550 eval board
+#
+libs-$(CONFIG_MIPS_PB1550)	+= arch/mips/au1000/pb1550/
+cflags-$(CONFIG_MIPS_PB1550)	+= -Iinclude/asm-mips/mach-pb1x00
+load-$(CONFIG_MIPS_PB1550)	+= 0x80100000
+
+#
 # AMD Alchemy Db1000 eval board
 #
 libs-$(CONFIG_MIPS_DB1000)	+= arch/mips/au1000/db1x00/
@@ -397,11 +409,12 @@ load-$(CONFIG_MOMENCO_OCELOT_C)	+= 0x801
 # Momentum Jaguar ATX
 #
 core-$(CONFIG_MOMENCO_JAGUAR_ATX)	+= arch/mips/momentum/jaguar_atx/
-ifdef CONFIG_JAGUAR_DMALOW
-load-$(CONFIG_MOMENCO_JAGUAR_ATX)	+= 0x88000000
-else
+cflags-$(CONFIG_MOMENCO_JAGUAR_ATX)	+= -Iinclude/asm-mips/mach-ja
+#ifdef CONFIG_JAGUAR_DMALOW
+#load-$(CONFIG_MOMENCO_JAGUAR_ATX)	+= 0x88000000
+#else
 load-$(CONFIG_MOMENCO_JAGUAR_ATX)	+= 0x80100000
-endif
+#endif
 
 #
 # NEC DDB
@@ -523,7 +536,7 @@ endif
 #
 # SGI-IP32 (O2)
 #
-# Set the load address to >= 0x????????? if you want to leave space for symmon,
+# Set the load address to >= 80069000 if you want to leave space for symmon,
 # 0x80002000 for production kernels.  Note that the value must be aligned to
 # a multiple of the kernel stack size or the handling of the current variable
 # will break so for 64-bit kernels we have to raise the start address by 8kb.
--- diff/arch/mips/au1000/common/Makefile	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/common/Makefile	2004-04-21 10:45:33.590596952 +0100
@@ -6,10 +6,15 @@
 # Makefile for the Alchemy Au1000 CPU, generic files.
 #
 
-obj-y				+= prom.o int-handler.o dma.o irq.o puts.o \
-				   time.o reset.o clocks.o power.o setup.o \
-				   sleeper.o
+obj-y += prom.o int-handler.o irq.o puts.o time.o reset.o \
+	au1xxx_irqmap.o clocks.o power.o setup.o sleeper.o
 
 obj-$(CONFIG_AU1X00_USB_DEVICE)	+= usbdev.o
 obj-$(CONFIG_KGDB)		+= dbg_io.o
 obj-$(CONFIG_PCI)		+= pci.o
+
+ifdef CONFIG_SOC_AU1550
+obj-y += dbdma.o
+else
+obj-y += dma.o
+endif
--- diff/arch/mips/au1000/common/dma.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/common/dma.c	2004-04-21 10:45:33.592596648 +0100
@@ -73,7 +73,7 @@ struct dma_chan au1000_dma_table[NUM_AU1
 };
 
 // Device FIFO addresses and default DMA modes
-static const struct {
+static const struct dma_dev {
 	unsigned int fifo_addr;
 	unsigned int dma_mode;
 } dma_dev_table[DMA_NUM_DEV] = {
@@ -120,12 +120,19 @@ int au1000_dma_read_proc(char *buf, char
 	return len;
 }
 
+// Device FIFO addresses and default DMA modes - 2nd bank
+static const struct dma_dev dma_dev_table_bank2[DMA_NUM_DEV_BANK2] = {
+	{SD0_XMIT_FIFO, DMA_DS | DMA_DW8},		// coherent
+	{SD0_RECV_FIFO, DMA_DS | DMA_DR | DMA_DW8},	// coherent
+	{SD1_XMIT_FIFO, DMA_DS | DMA_DW8},		// coherent
+	{SD1_RECV_FIFO, DMA_DS | DMA_DR | DMA_DW8}	// coherent
+};
 
 void dump_au1000_dma_channel(unsigned int dmanr)
 {
 	struct dma_chan *chan;
 
-	if (dmanr > NUM_AU1000_DMA_CHANNELS)
+	if (dmanr >= NUM_AU1000_DMA_CHANNELS)
 		return;
 	chan = &au1000_dma_table[dmanr];
 
@@ -156,10 +163,16 @@ int request_au1000_dma(int dev_id, const
 		       void *irq_dev_id)
 {
 	struct dma_chan *chan;
+	const struct dma_dev *dev;
 	int i, ret;
 
-	if (dev_id < 0 || dev_id >= DMA_NUM_DEV)
+#if defined(CONFIG_SOC_AU1100)
+	if (dev_id < 0 || dev_id >= (DMA_NUM_DEV + DMA_NUM_DEV_BANK2))
 		return -EINVAL;
+#else
+ 	if (dev_id < 0 || dev_id >= DMA_NUM_DEV)
+ 		return -EINVAL;
+#endif
 
 	for (i = 0; i < NUM_AU1000_DMA_CHANNELS; i++) {
 		if (au1000_dma_table[i].dev_id < 0)
@@ -170,6 +183,13 @@ int request_au1000_dma(int dev_id, const
 
 	chan = &au1000_dma_table[i];
 
+	if (dev_id >= DMA_NUM_DEV) {
+		dev_id -= DMA_NUM_DEV;
+		dev = &dma_dev_table_bank2[dev_id];
+	} else {
+		dev = &dma_dev_table[dev_id];
+	}
+
 	if (irqhandler) {
 		chan->irq = AU1000_DMA_INT_BASE + i;
 		chan->irq_dev = irq_dev_id;
@@ -188,8 +208,8 @@ int request_au1000_dma(int dev_id, const
 	chan->io = DMA_CHANNEL_BASE + i * DMA_CHANNEL_LEN;
 	chan->dev_id = dev_id;
 	chan->dev_str = dev_str;
-	chan->fifo_addr = dma_dev_table[dev_id].fifo_addr;
-	chan->mode = dma_dev_table[dev_id].dma_mode;
+	chan->fifo_addr = dev->fifo_addr;
+	chan->mode = dev->dma_mode;
 
 	/* initialize the channel before returning */
 	init_dma(i);
--- diff/arch/mips/au1000/common/irq.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/common/irq.c	2004-04-21 10:45:33.593596496 +0100
@@ -93,107 +93,6 @@ extern void counter0_irq(int irq, void *
 
 static spinlock_t irq_lock = SPIN_LOCK_UNLOCKED;
 
-static void setup_local_irq(unsigned int irq_nr, int type, int int_req)
-{
-	if (irq_nr > AU1000_MAX_INTR) return;
-	/* Config2[n], Config1[n], Config0[n] */
-	if (irq_nr > AU1000_LAST_INTC0_INT) {
-		switch (type) {
-			case INTC_INT_RISE_EDGE: /* 0:0:1 */
-				au_writel(1<<(irq_nr-32), IC1_CFG2CLR);
-				au_writel(1<<(irq_nr-32), IC1_CFG1CLR);
-				au_writel(1<<(irq_nr-32), IC1_CFG0SET);
-				break;
-			case INTC_INT_FALL_EDGE: /* 0:1:0 */
-				au_writel(1<<(irq_nr-32), IC1_CFG2CLR);
-				au_writel(1<<(irq_nr-32), IC1_CFG1SET);
-				au_writel(1<<(irq_nr-32), IC1_CFG0CLR);
-				break;
-			case INTC_INT_RISE_AND_FALL_EDGE: /* 0:1:1 */
-				au_writel(1<<(irq_nr-32), IC1_CFG2CLR);
-				au_writel(1<<(irq_nr-32), IC1_CFG1SET);
-				au_writel(1<<(irq_nr-32), IC1_CFG0SET);
-				break;
-			case INTC_INT_HIGH_LEVEL: /* 1:0:1 */
-				au_writel(1<<(irq_nr-32), IC1_CFG2SET);
-				au_writel(1<<(irq_nr-32), IC1_CFG1CLR);
-				au_writel(1<<(irq_nr-32), IC1_CFG0SET);
-				break;
-			case INTC_INT_LOW_LEVEL: /* 1:1:0 */
-				au_writel(1<<(irq_nr-32), IC1_CFG2SET);
-				au_writel(1<<(irq_nr-32), IC1_CFG1SET);
-				au_writel(1<<(irq_nr-32), IC1_CFG0CLR);
-				break;
-			case INTC_INT_DISABLED: /* 0:0:0 */
-				au_writel(1<<(irq_nr-32), IC1_CFG0CLR);
-				au_writel(1<<(irq_nr-32), IC1_CFG1CLR);
-				au_writel(1<<(irq_nr-32), IC1_CFG2CLR);
-				break;
-			default: /* disable the interrupt */
-				printk("unexpected int type %d (irq %d)\n", type, irq_nr);
-				au_writel(1<<(irq_nr-32), IC1_CFG0CLR);
-				au_writel(1<<(irq_nr-32), IC1_CFG1CLR);
-				au_writel(1<<(irq_nr-32), IC1_CFG2CLR);
-				return;
-		}
-		if (int_req) /* assign to interrupt request 1 */
-			au_writel(1<<(irq_nr-32), IC1_ASSIGNCLR);
-		else	     /* assign to interrupt request 0 */
-			au_writel(1<<(irq_nr-32), IC1_ASSIGNSET);
-		au_writel(1<<(irq_nr-32), IC1_SRCSET);
-		au_writel(1<<(irq_nr-32), IC1_MASKCLR);
-		au_writel(1<<(irq_nr-32), IC1_WAKECLR);
-	}
-	else {
-		switch (type) {
-			case INTC_INT_RISE_EDGE: /* 0:0:1 */
-				au_writel(1<<irq_nr, IC0_CFG2CLR);
-				au_writel(1<<irq_nr, IC0_CFG1CLR);
-				au_writel(1<<irq_nr, IC0_CFG0SET);
-				break;
-			case INTC_INT_FALL_EDGE: /* 0:1:0 */
-				au_writel(1<<irq_nr, IC0_CFG2CLR);
-				au_writel(1<<irq_nr, IC0_CFG1SET);
-				au_writel(1<<irq_nr, IC0_CFG0CLR);
-				break;
-			case INTC_INT_RISE_AND_FALL_EDGE: /* 0:1:1 */
-				au_writel(1<<irq_nr, IC0_CFG2CLR);
-				au_writel(1<<irq_nr, IC0_CFG1SET);
-				au_writel(1<<irq_nr, IC0_CFG0SET);
-				break;
-			case INTC_INT_HIGH_LEVEL: /* 1:0:1 */
-				au_writel(1<<irq_nr, IC0_CFG2SET);
-				au_writel(1<<irq_nr, IC0_CFG1CLR);
-				au_writel(1<<irq_nr, IC0_CFG0SET);
-				break;
-			case INTC_INT_LOW_LEVEL: /* 1:1:0 */
-				au_writel(1<<irq_nr, IC0_CFG2SET);
-				au_writel(1<<irq_nr, IC0_CFG1SET);
-				au_writel(1<<irq_nr, IC0_CFG0CLR);
-				break;
-			case INTC_INT_DISABLED: /* 0:0:0 */
-				au_writel(1<<irq_nr, IC0_CFG0CLR);
-				au_writel(1<<irq_nr, IC0_CFG1CLR);
-				au_writel(1<<irq_nr, IC0_CFG2CLR);
-				break;
-			default: /* disable the interrupt */
-				printk("unexpected int type %d (irq %d)\n", type, irq_nr);
-				au_writel(1<<irq_nr, IC0_CFG0CLR);
-				au_writel(1<<irq_nr, IC0_CFG1CLR);
-				au_writel(1<<irq_nr, IC0_CFG2CLR);
-				return;
-		}
-		if (int_req) /* assign to interrupt request 1 */
-			au_writel(1<<irq_nr, IC0_ASSIGNCLR);
-		else	     /* assign to interrupt request 0 */
-			au_writel(1<<irq_nr, IC0_ASSIGNSET);
-		au_writel(1<<irq_nr, IC0_SRCSET);
-		au_writel(1<<irq_nr, IC0_MASKCLR);
-		au_writel(1<<irq_nr, IC0_WAKECLR);
-	}
-	au_sync();
-}
-
 
 static unsigned int startup_irq(unsigned int irq_nr)
 {
@@ -409,6 +308,117 @@ void startup_match20_interrupt(void)
 }
 #endif
 
+static void setup_local_irq(unsigned int irq_nr, int type, int int_req)
+{
+	if (irq_nr > AU1000_MAX_INTR) return;
+	/* Config2[n], Config1[n], Config0[n] */
+	if (irq_nr > AU1000_LAST_INTC0_INT) {
+		switch (type) {
+			case INTC_INT_RISE_EDGE: /* 0:0:1 */
+				au_writel(1<<(irq_nr-32), IC1_CFG2CLR);
+				au_writel(1<<(irq_nr-32), IC1_CFG1CLR);
+				au_writel(1<<(irq_nr-32), IC1_CFG0SET);
+				irq_desc[irq_nr].handler = &rise_edge_irq_type;
+				break;
+			case INTC_INT_FALL_EDGE: /* 0:1:0 */
+				au_writel(1<<(irq_nr-32), IC1_CFG2CLR);
+				au_writel(1<<(irq_nr-32), IC1_CFG1SET);
+				au_writel(1<<(irq_nr-32), IC1_CFG0CLR);
+				irq_desc[irq_nr].handler = &fall_edge_irq_type;
+				break;
+			case INTC_INT_RISE_AND_FALL_EDGE: /* 0:1:1 */
+				au_writel(1<<(irq_nr-32), IC1_CFG2CLR);
+				au_writel(1<<(irq_nr-32), IC1_CFG1SET);
+				au_writel(1<<(irq_nr-32), IC1_CFG0SET);
+				irq_desc[irq_nr].handler = &either_edge_irq_type;
+				break;
+			case INTC_INT_HIGH_LEVEL: /* 1:0:1 */
+				au_writel(1<<(irq_nr-32), IC1_CFG2SET);
+				au_writel(1<<(irq_nr-32), IC1_CFG1CLR);
+				au_writel(1<<(irq_nr-32), IC1_CFG0SET);
+				irq_desc[irq_nr].handler = &level_irq_type;
+				break;
+			case INTC_INT_LOW_LEVEL: /* 1:1:0 */
+				au_writel(1<<(irq_nr-32), IC1_CFG2SET);
+				au_writel(1<<(irq_nr-32), IC1_CFG1SET);
+				au_writel(1<<(irq_nr-32), IC1_CFG0CLR);
+				irq_desc[irq_nr].handler = &level_irq_type;
+				break;
+			case INTC_INT_DISABLED: /* 0:0:0 */
+				au_writel(1<<(irq_nr-32), IC1_CFG0CLR);
+				au_writel(1<<(irq_nr-32), IC1_CFG1CLR);
+				au_writel(1<<(irq_nr-32), IC1_CFG2CLR);
+				break;
+			default: /* disable the interrupt */
+				printk("unexpected int type %d (irq %d)\n", type, irq_nr);
+				au_writel(1<<(irq_nr-32), IC1_CFG0CLR);
+				au_writel(1<<(irq_nr-32), IC1_CFG1CLR);
+				au_writel(1<<(irq_nr-32), IC1_CFG2CLR);
+				return;
+		}
+		if (int_req) /* assign to interrupt request 1 */
+			au_writel(1<<(irq_nr-32), IC1_ASSIGNCLR);
+		else	     /* assign to interrupt request 0 */
+			au_writel(1<<(irq_nr-32), IC1_ASSIGNSET);
+		au_writel(1<<(irq_nr-32), IC1_SRCSET);
+		au_writel(1<<(irq_nr-32), IC1_MASKCLR);
+		au_writel(1<<(irq_nr-32), IC1_WAKECLR);
+	}
+	else {
+		switch (type) {
+			case INTC_INT_RISE_EDGE: /* 0:0:1 */
+				au_writel(1<<irq_nr, IC0_CFG2CLR);
+				au_writel(1<<irq_nr, IC0_CFG1CLR);
+				au_writel(1<<irq_nr, IC0_CFG0SET);
+				irq_desc[irq_nr].handler = &rise_edge_irq_type;
+				break;
+			case INTC_INT_FALL_EDGE: /* 0:1:0 */
+				au_writel(1<<irq_nr, IC0_CFG2CLR);
+				au_writel(1<<irq_nr, IC0_CFG1SET);
+				au_writel(1<<irq_nr, IC0_CFG0CLR);
+				irq_desc[irq_nr].handler = &fall_edge_irq_type;
+				break;
+			case INTC_INT_RISE_AND_FALL_EDGE: /* 0:1:1 */
+				au_writel(1<<irq_nr, IC0_CFG2CLR);
+				au_writel(1<<irq_nr, IC0_CFG1SET);
+				au_writel(1<<irq_nr, IC0_CFG0SET);
+				irq_desc[irq_nr].handler = &either_edge_irq_type;
+				break;
+			case INTC_INT_HIGH_LEVEL: /* 1:0:1 */
+				au_writel(1<<irq_nr, IC0_CFG2SET);
+				au_writel(1<<irq_nr, IC0_CFG1CLR);
+				au_writel(1<<irq_nr, IC0_CFG0SET);
+				irq_desc[irq_nr].handler = &level_irq_type;
+				break;
+			case INTC_INT_LOW_LEVEL: /* 1:1:0 */
+				au_writel(1<<irq_nr, IC0_CFG2SET);
+				au_writel(1<<irq_nr, IC0_CFG1SET);
+				au_writel(1<<irq_nr, IC0_CFG0CLR);
+				irq_desc[irq_nr].handler = &level_irq_type;
+				break;
+			case INTC_INT_DISABLED: /* 0:0:0 */
+				au_writel(1<<irq_nr, IC0_CFG0CLR);
+				au_writel(1<<irq_nr, IC0_CFG1CLR);
+				au_writel(1<<irq_nr, IC0_CFG2CLR);
+				break;
+			default: /* disable the interrupt */
+				printk("unexpected int type %d (irq %d)\n", type, irq_nr);
+				au_writel(1<<irq_nr, IC0_CFG0CLR);
+				au_writel(1<<irq_nr, IC0_CFG1CLR);
+				au_writel(1<<irq_nr, IC0_CFG2CLR);
+				return;
+		}
+		if (int_req) /* assign to interrupt request 1 */
+			au_writel(1<<irq_nr, IC0_ASSIGNCLR);
+		else	     /* assign to interrupt request 0 */
+			au_writel(1<<irq_nr, IC0_ASSIGNSET);
+		au_writel(1<<irq_nr, IC0_SRCSET);
+		au_writel(1<<irq_nr, IC0_MASKCLR);
+		au_writel(1<<irq_nr, IC0_WAKECLR);
+	}
+	au_sync();
+}
+
 
 void __init init_IRQ(void)
 {
@@ -416,7 +426,9 @@ void __init init_IRQ(void)
 	unsigned long cp0_status;
 	au1xxx_irq_map_t *imp;
 	extern au1xxx_irq_map_t au1xxx_irq_map[];
+	extern au1xxx_irq_map_t au1xxx_ic0_map[];
 	extern int au1xxx_nr_irqs;
+	extern int au1xxx_ic0_nr_irqs;
 
 	cp0_status = read_c0_status();
 	memset(irq_desc, 0, sizeof(irq_desc));
@@ -424,45 +436,43 @@ void __init init_IRQ(void)
 
 	init_generic_irq();
 
-	for (i = 0; i <= AU1000_MAX_INTR; i++) {
-		/* default is active high, level interrupt */
-		setup_local_irq(i, INTC_INT_HIGH_LEVEL, 0);
-		irq_desc[i].handler = &level_irq_type;
+	/* Initialize interrupt controllers to a safe state.
+	*/
+	au_writel(0xffffffff, IC0_CFG0CLR);
+	au_writel(0xffffffff, IC0_CFG1CLR);
+	au_writel(0xffffffff, IC0_CFG2CLR);
+	au_writel(0xffffffff, IC0_MASKCLR);
+	au_writel(0xffffffff, IC0_ASSIGNSET);
+	au_writel(0xffffffff, IC0_WAKECLR);
+	au_writel(0xffffffff, IC0_SRCSET);
+	au_writel(0xffffffff, IC0_FALLINGCLR);
+	au_writel(0xffffffff, IC0_RISINGCLR);
+	au_writel(0x00000000, IC0_TESTBIT);
+
+	au_writel(0xffffffff, IC1_CFG0CLR);
+	au_writel(0xffffffff, IC1_CFG1CLR);
+	au_writel(0xffffffff, IC1_CFG2CLR);
+	au_writel(0xffffffff, IC1_MASKCLR);
+	au_writel(0xffffffff, IC1_ASSIGNSET);
+	au_writel(0xffffffff, IC1_WAKECLR);
+	au_writel(0xffffffff, IC1_SRCSET);
+	au_writel(0xffffffff, IC1_FALLINGCLR);
+	au_writel(0xffffffff, IC1_RISINGCLR);
+	au_writel(0x00000000, IC1_TESTBIT);
+
+	/* Initialize IC0, which is fixed per processor.
+	*/
+	imp = au1xxx_ic0_map;
+	for (i=0; i<au1xxx_ic0_nr_irqs; i++) {
+		setup_local_irq(imp->im_irq, imp->im_type, imp->im_request);
+		imp++;
 	}
 
 	/* Now set up the irq mapping for the board.
 	*/
 	imp = au1xxx_irq_map;
 	for (i=0; i<au1xxx_nr_irqs; i++) {
-
 		setup_local_irq(imp->im_irq, imp->im_type, imp->im_request);
-
-		switch (imp->im_type) {
-
-		case INTC_INT_HIGH_LEVEL:
-			irq_desc[imp->im_irq].handler = &level_irq_type;
-			break;
-
-		case INTC_INT_LOW_LEVEL:
-			irq_desc[imp->im_irq].handler = &level_irq_type;
-			break;
-
-		case INTC_INT_RISE_EDGE:
-			irq_desc[imp->im_irq].handler = &rise_edge_irq_type;
-			break;
-
-		case INTC_INT_FALL_EDGE:
-			irq_desc[imp->im_irq].handler = &fall_edge_irq_type;
-			break;
-
-		case INTC_INT_RISE_AND_FALL_EDGE:
-			irq_desc[imp->im_irq].handler = &either_edge_irq_type;
-			break;
-
-		default:
-			panic("Unknown au1xxx irq map");
-			break;
-		}
 		imp++;
 	}
 
--- diff/arch/mips/au1000/common/pci.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/common/pci.c	2004-04-21 10:45:33.594596344 +0100
@@ -35,10 +35,6 @@
 #include <linux/init.h>
 
 #include <asm/mach-au1x00/au1000.h>
-//#include <asm/pb1500.h>
-#ifdef CONFIG_MIPS_PB1000
-#include <asm/mach-pb1x00/pb1000.h>
-#endif
 #include <asm/pci_channel.h>
 
 /* TBD */
@@ -64,13 +60,13 @@ static struct pci_controller au1x_contro
 	.mem_resource	= &pci_mem_resource,
 };
 
-#ifdef CONFIG_SOC_AU1500
+#if defined(CONFIG_SOC_AU1500) || defined(CONFIG_SOC_AU1550)
 static unsigned long virt_io_addr;
 #endif
 
 static int __init au1x_pci_setup(void)
 {
-#ifdef CONFIG_SOC_AU1500
+#if defined(CONFIG_SOC_AU1500) || defined(CONFIG_SOC_AU1550)
 	int i;
 	struct pci_dev *dev;
 	
@@ -93,20 +89,8 @@ static int __init au1x_pci_setup(void)
 	set_io_port_base(virt_io_addr);
 #endif
 
-#ifdef CONFIG_MIPS_PB1000 /* This is truly board specific */
-	unsigned long pci_mem_start = (unsigned long) PCI_MEM_START;
-
-	au_writel(0, PCI_BRIDGE_CONFIG); // set extend byte to 0
-	au_writel(0, SDRAM_MBAR);        // set mbar to 0
-	au_writel(0x2, SDRAM_CMD);       // enable memory accesses
-	au_sync_delay(1);
-
-	// set extend byte to mbar of ext slot
-	au_writel(((pci_mem_start >> 24) & 0xff) |
-	       (1 << 8 | 1 << 9 | 1 << 10 | 1 << 27), PCI_BRIDGE_CONFIG);
-#endif
-
 	register_pci_controller(&au1x_controller);
+	return 0;
 }
 
 arch_initcall(au1x_pci_setup);
--- diff/arch/mips/au1000/common/power.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/common/power.c	2004-04-21 10:45:33.594596344 +0100
@@ -358,7 +358,7 @@ static int pm_do_freq(ctl_table * ctl, i
 		old_cpu_freq = get_au1x00_speed();
 
 		new_cpu_freq = pll * 12 * 1000000;
-		new_baud_base = (new_cpu_freq / 4) / 16;
+	        new_baud_base =  (new_cpu_freq / (2 * ((int)(au_readl(SYS_POWERCTRL)&0x03) + 2) * 16));
 		set_au1x00_speed(new_cpu_freq);
 		set_au1x00_uart_baud_base(new_baud_base);
 
--- diff/arch/mips/au1000/common/reset.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/common/reset.c	2004-04-21 10:45:33.594596344 +0100
@@ -121,6 +121,29 @@ void au1000_restart(char *command)
 		au_writel(0x00, 0xb1900064); /* sys_auxpll */
 		au_writel(0x00, 0xb1900100); /* sys_pininputen */
 		break;
+	case 0x03000000: /* Au1550 */
+		au_writel(0x00, 0xb1a00004); /* psc 0 */
+		au_writel(0x00, 0xb1b00004); /* psc 1 */
+		au_writel(0x00, 0xb0a00004); /* psc 2 */
+		au_writel(0x00, 0xb0b00004); /* psc 3 */
+		au_writel(0x00, 0xb017fffc); /* usbh_enable */
+		au_writel(0x00, 0xb0200058); /* usbd_enable */
+		au_writel(0x00, 0xb4004104); /* mac dma */
+		au_writel(0x00, 0xb4004114); /* mac dma */
+		au_writel(0x00, 0xb4004124); /* mac dma */
+		au_writel(0x00, 0xb4004134); /* mac dma */
+		au_writel(0x00, 0xb1520000); /* macen0 */
+		au_writel(0x00, 0xb1520004); /* macen1 */
+		au_writel(0x00, 0xb1100100); /* uart0_enable */
+		au_writel(0x00, 0xb1200100); /* uart1_enable */
+		au_writel(0x00, 0xb1400100); /* uart3_enable */
+		au_writel(0x00, 0xb1900020); /* sys_freqctrl0 */
+		au_writel(0x00, 0xb1900024); /* sys_freqctrl1 */
+		au_writel(0x00, 0xb1900028); /* sys_clksrc */
+		au_writel(0x10, 0xb1900060); /* sys_cpupll */
+		au_writel(0x00, 0xb1900064); /* sys_auxpll */
+		au_writel(0x00, 0xb1900100); /* sys_pininputen */
+		break;
 
 	default:
 		break;
@@ -137,12 +160,28 @@ void au1000_restart(char *command)
 	au_writel(0x00000000, 0xAE00001C);
 #endif
 
+#if defined(CONFIG_MIPS_PB1550)
+	 /* reset entire system */
+	au_writew(au_readw(0xAF00001C) & ~(1<<15), 0xAF00001C);
+	au_sync();
+#endif
+
 	__asm__ __volatile__("jr\t%0"::"r"(0xbfc00000));
 }
 
 void au1000_halt(void)
 {
+#if defined(CONFIG_MIPS_PB1550)
+	/* power off system */
+	printk("\n** Powering off Pb1550\n");
+	au_writew(au_readw(0xAF00001C) | (3<<14), 0xAF00001C);
+	au_sync();
+	while(1); /* should not get here */
+#endif
 	printk(KERN_NOTICE "\n** You can safely turn off the power\n");
+#ifdef CONFIG_MIPS_MIRAGE
+	au_writel((1 << 26) | (1 << 10), GPIO2_OUTPUT);
+#endif
 #ifdef CONFIG_PM
 	au_sleep();
 
--- diff/arch/mips/au1000/common/setup.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/common/setup.c	2004-04-21 10:45:33.595596192 +0100
@@ -56,7 +56,7 @@ extern void (*board_time_init)(void);
 extern void au1x_time_init(void);
 extern void (*board_timer_setup)(struct irqaction *irq);
 extern void au1x_timer_setup(struct irqaction *irq);
-#if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_SOC_AU1500)
+#if defined(CONFIG_64BIT_PHYS_ADDR) && (defined(CONFIG_SOC_AU1500) || defined(CONFIG_SOC_AU1550))
 extern phys_t (*fixup_bigphys_addr)(phys_t phys_addr, phys_t size);
 static phys_t au1500_fixup_bigphys_addr(phys_t phys_addr, phys_t size);
 #endif
@@ -66,12 +66,47 @@ extern void au1xxx_timer_setup(struct ir
 static int __init au1x00_setup(void)
 {
 	char *argptr;
+	unsigned long prid, cpupll, bclk = 1;
 
 	/* Various early Au1000 Errata corrected by this */
 	set_c0_config(1<<19); /* Config[OD] */
 
 	board_setup();  /* board specific setup */
 
+	prid = read_c0_prid();
+	switch (prid)
+	{
+		case 0x00030100: printk("Au1000 DA "); bclk = 0; break;
+	 	case 0x00030201: printk("Au1000 HA "); bclk = 0; break;
+		case 0x00030202: printk("Au1000 HB "); bclk = 0; break;
+		case 0x00030203: printk("Au1000 HC "); break;
+		case 0x00030204: printk("Au1000 HD "); break;
+
+		case 0x01030200: printk("Au1500 AB "); break;
+		case 0x01030201: printk("Au1500 AC "); break;
+		case 0x01030202: printk("Au1500 AD "); break;
+
+		case 0x02030200: printk("Au1100 AB "); break;
+		case 0x02030201: printk("Au1100 BA "); break;
+		case 0x02030202: printk("Au1100 BC "); break;
+		case 0x02030203: printk("Au1100 BD "); break;
+		case 0x02030204: printk("Au1100 BE "); break;
+
+		case 0x03030200: printk("Au1550 AA "); break;
+
+		default: printk("Unknown Au1x00! "); bclk = 0; break;
+	}
+	cpupll = (au_readl(0xB1900060) & 0x3F) * 12;
+	printk("(PRId %08X) @ %dMHZ\n", prid, cpupll);
+
+	if (bclk)
+	{
+		/* Enable BCLK switching */
+		bclk = au_readl(0xB190003C);
+		au_writel(bclk | 0x60, 0xB190003C);
+		printk("BCLK switching enabled!\n");
+	}
+
 	argptr = prom_getcmdline();
 
 #ifdef CONFIG_SERIAL_AU1X00_CONSOLE
@@ -122,7 +157,7 @@ static int __init au1x00_setup(void)
 	_machine_power_off = au1000_power_off;
 	board_time_init = au1xxx_time_init;
 	board_timer_setup = au1xxx_timer_setup;
-#if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_SOC_AU1500)
+#if defined(CONFIG_64BIT_PHYS_ADDR) && (defined(CONFIG_SOC_AU1500) || defined(CONFIG_SOC_AU1550))
 	fixup_bigphys_addr = au1500_fixup_bigphys_addr;
 #endif
 
@@ -173,7 +208,7 @@ static int __init au1x00_setup(void)
 
 early_initcall(au1x00_setup);
 
-#if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_SOC_AU1500)
+#if defined(CONFIG_64BIT_PHYS_ADDR) && (defined(CONFIG_SOC_AU1500) || defined(CONFIG_SOC_AU1550))
 /* This routine should be valid for all Au1500 based boards */
 static phys_t au1500_fixup_bigphys_addr(phys_t phys_addr, phys_t size)
 {
--- diff/arch/mips/au1000/common/usbdev.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/common/usbdev.c	2004-04-21 10:45:33.596596040 +0100
@@ -199,12 +199,12 @@ get_std_req_name(int req)
 static void
 dump_setup(struct usb_ctrlrequest* s)
 {
-	dbg(__FUNCTION__ ": requesttype=%d", s->requesttype);
-	dbg(__FUNCTION__ ": request=%d %s", s->request,
+	dbg("%s: requesttype=%d", __FUNCTION__, s->requesttype);
+	dbg("%s: request=%d %s", __FUNCTION__, s->request,
 	    get_std_req_name(s->request));
-	dbg(__FUNCTION__ ": value=0x%04x", s->wValue);
-	dbg(__FUNCTION__ ": index=%d", s->index);
-	dbg(__FUNCTION__ ": length=%d", s->length);
+	dbg("%s: value=0x%04x", __FUNCTION__, s->wValue);
+	dbg("%s: index=%d", __FUNCTION__, s->index);
+	dbg("%s: length=%d", __FUNCTION__, s->length);
 }
 #endif
 
@@ -436,10 +436,10 @@ kickstart_send_packet(endpoint_t * ep)
 	u32 cs;
 	usbdev_pkt_t *pkt = ep->inlist.head;
 
-	vdbg(__FUNCTION__ ": ep%d, pkt=%p", ep->address, pkt);
+	vdbg("%s: ep%d, pkt=%p", __FUNCTION__, ep->address, pkt);
 
 	if (!pkt) {
-		err(__FUNCTION__ ": head=NULL! list->count=%d",
+		err("%s: head=NULL! list->count=%d", __FUNCTION__,
 		    ep->inlist.count);
 		return;
 	}
@@ -484,7 +484,7 @@ send_packet_complete(endpoint_t * ep)
 			(au_readl(ep->reg->ctrl_stat) & USBDEV_CS_NAK) ?
 			PKT_STATUS_NAK : PKT_STATUS_ACK;
 
-		vdbg(__FUNCTION__ ": ep%d, %s pkt=%p, list count=%d",
+		vdbg("%s: ep%d, %s pkt=%p, list count=%d", __FUNCTION__,
 		     ep->address, (pkt->status & PKT_STATUS_NAK) ?
 		     "NAK" : "ACK", pkt, ep->inlist.count);
 	}
@@ -529,7 +529,7 @@ send_packet(struct usb_dev* dev, usbdev_
 
 	link_tail(ep, list, pkt);
 
-	vdbg(__FUNCTION__ ": ep%d, pkt=%p, size=%d, list count=%d",
+	vdbg("%s: ep%d, pkt=%p, size=%d, list count=%d", __FUNCTION__,
 	     ep->address, pkt, pkt->size, list->count);
 
 	if (list->count == 1) {
@@ -555,7 +555,7 @@ kickstart_receive_packet(endpoint_t * ep
 
 	// get and link a new packet for next reception
 	if (!(pkt = add_packet(ep, &ep->outlist, ep->max_pkt_size))) {
-		err(__FUNCTION__ ": could not alloc new packet");
+		err("%s: could not alloc new packet", __FUNCTION__);
 		return;
 	}
 
@@ -615,7 +615,7 @@ receive_packet_complete(endpoint_t * ep)
 	if (ep->address == 0 && (cs & USBDEV_CS_SU))
 		pkt->status |= PKT_STATUS_SU;
 
-	vdbg(__FUNCTION__ ": ep%d, %s pkt=%p, size=%d",
+	vdbg("%s: ep%d, %s pkt=%p, size=%d", __FUNCTION__,
 	     ep->address, (pkt->status & PKT_STATUS_NAK) ?
 	     "NAK" : "ACK", pkt, pkt->size);
 
@@ -719,7 +719,7 @@ do_set_address(struct usb_dev* dev, stru
 	int new_state = dev->state;
 	int new_addr = le16_to_cpu(setup->wValue);
 
-	dbg(__FUNCTION__ ": our address=%d", new_addr);
+	dbg("%s: our address=%d", __FUNCTION__, new_addr);
 
 	if (new_addr > 127) {
 			// usb spec doesn't tell us what to do, so just go to
@@ -918,18 +918,18 @@ do_setup (struct usb_dev* dev, struct us
 {
 	req_method_t m;
 
-	dbg(__FUNCTION__ ": req %d %s", setup->bRequestType,
+	dbg("%s: req %d %s", __FUNCTION__, setup->bRequestType,
 	    get_std_req_name(setup->bRequestType));
 
 	if ((setup->bRequestType & USB_TYPE_MASK) != USB_TYPE_STANDARD ||
 	    (setup->bRequestType & USB_RECIP_MASK) != USB_RECIP_DEVICE) {
-		err(__FUNCTION__ ": invalid requesttype 0x%02x",
+		err("%s: invalid requesttype 0x%02x", __FUNCTION__,
 		    setup->bRequestType);
 		return;
 		}
 
 	if ((setup->bRequestType & 0x80) == USB_DIR_OUT && setup->wLength)
-		dbg(__FUNCTION__ ": OUT phase! length=%d", setup->wLength);
+		dbg("%s: OUT phase! length=%d", __FUNCTION__, setup->wLength);
 
 	if (setup->bRequestType < sizeof(req_method)/sizeof(req_method_t))
 		m = req_method[setup->bRequestType];
@@ -980,7 +980,7 @@ process_ep0_receive (struct usb_dev* dev
 #endif
 			do_setup(dev, (struct usb_ctrlrequest*)pkt->payload);
 		} else
-			err(__FUNCTION__ ": wrong size SETUP received");
+			err("%s: wrong size SETUP received", __FUNCTION__);
 		break;
 	case DATA_STAGE:
 		/*
--- diff/arch/mips/au1000/csb250/Makefile	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/csb250/Makefile	2004-04-21 10:45:33.596596040 +0100
@@ -5,10 +5,4 @@
 # Makefile for the Cogent CSB250 Au1500 board.  Copied from Pb1500.
 #
 
-USE_STANDARD_AS_RULE := true
-
-O_TARGET := csb250.o
-
 obj-y := init.o board_setup.o irqmap.o
-
-include $(TOPDIR)/Rules.make
--- diff/arch/mips/au1000/csb250/irqmap.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/csb250/irqmap.c	2004-04-21 10:45:33.596596040 +0100
@@ -48,53 +48,13 @@
 #include <asm/au1000.h>
 
 au1xxx_irq_map_t au1xxx_irq_map[] = {
-	{ AU1000_UART0_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_UART3_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+1, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+2, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+3, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+4, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+5, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+6, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+7, INTC_INT_HIGH_LEVEL, 0},
 
-	{ AU1000_IRDA_TX_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_IRDA_RX_INT, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_MAC0_DMA_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_MAC1_DMA_INT, INTC_INT_HIGH_LEVEL, 0},
 	{ AU1500_GPIO_204, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_USB_HOST_INT, INTC_INT_LOW_LEVEL, 0 },
-
-	{ AU1000_PCI_INTA, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1000_PCI_INTB, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1000_PCI_INTC, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1000_PCI_INTD, INTC_INT_LOW_LEVEL, 0 },
 	{ AU1500_GPIO_201, INTC_INT_LOW_LEVEL, 0 },
 	{ AU1500_GPIO_202, INTC_INT_LOW_LEVEL, 0 },
 	{ AU1500_GPIO_203, INTC_INT_LOW_LEVEL, 0 },
 	{ AU1500_GPIO_205, INTC_INT_LOW_LEVEL, 0 },
 	{ AU1500_GPIO_207, INTC_INT_LOW_LEVEL, 0 },
-
-	{ AU1000_ACSYNC_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_AC97C_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_USB_DEV_SUS_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_USB_DEV_REQ_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
-
-	/* Careful if you change match 2 request!
-	 * The interrupt handler is called directly
-	 * from the low level dispatch code.
-	 */
-	{ AU1000_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
 };
 
 int au1xxx_nr_irqs = sizeof(au1xxx_irq_map)/sizeof(au1xxx_irq_map_t);
--- diff/arch/mips/au1000/db1x00/Makefile	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/db1x00/Makefile	2004-04-21 10:45:33.597595888 +0100
@@ -6,3 +6,4 @@
 # Makefile for the Alchemy Semiconductor Db1x00 board.
 
 lib-y := init.o board_setup.o irqmap.o
+obj-$(CONFIG_WM97XX_COMODULE) += mirage_ts.o
--- diff/arch/mips/au1000/db1x00/board_setup.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/db1x00/board_setup.c	2004-04-21 10:45:33.597595888 +0100
@@ -45,6 +45,7 @@
 #include <asm/mach-au1x00/au1000.h>
 #include <asm/mach-db1x00/db1x00.h>
 
+/* not correct for db1550 */
 static BCSR * const bcsr = (BCSR *)0xAE000000;
 
 void __init board_setup(void)
@@ -52,6 +53,7 @@ void __init board_setup(void)
 	u32 pin_func;
 
 	pin_func = 0;
+	/* not valid for 1550 */
 #ifdef CONFIG_AU1X00_USB_DEVICE
 	// 2nd USB port is USB device
 	pin_func = au_readl(SYS_PINFUNC) & (u32)(~0x8000);
@@ -69,6 +71,35 @@ void __init board_setup(void)
 #endif
 	au_writel(0, 0xAE000010); /* turn off pcmcia power */
 
+#ifdef CONFIG_MIPS_MIRAGE
+	/* enable GPIO[31:0] inputs */
+	au_writel(0, SYS_PININPUTEN);
+
+	/* GPIO[20] is output, tristate the other input primary GPIO's */
+	au_writel((u32)(~(1<<20)), SYS_TRIOUTCLR);
+
+	/* set GPIO[210:208] instead of SSI_0 */
+	pin_func = au_readl(SYS_PINFUNC) | (u32)(1);
+
+	/* set GPIO[215:211] for LED's */
+	pin_func |= (u32)((5<<2));
+
+	/* set GPIO[214:213] for more LED's */
+	pin_func |= (u32)((5<<12));
+
+	/* set GPIO[207:200] instead of PCMCIA/LCD */
+	pin_func |= (u32)((3<<17));
+	au_writel(pin_func, SYS_PINFUNC);
+
+	/* Enable speaker amplifier.  This should
+	 * be part of the audio driver.
+	 */
+	au_writel(au_readl(GPIO2_DIR) | 0x200, GPIO2_DIR);
+	au_writel(0x02000200, GPIO2_OUTPUT);
+#endif
+
+	au_sync();
+
 #ifdef CONFIG_MIPS_DB1000
     printk("AMD Alchemy Au1000/Db1000 Board\n");
 #endif
@@ -84,4 +115,7 @@ void __init board_setup(void)
 #ifdef CONFIG_MIPS_MIRAGE
     printk("AMD Alchemy Mirage Board\n");
 #endif
+#ifdef CONFIG_MIPS_DB1550
+    printk("AMD Alchemy Au1550/Db1550 Board\n");
+#endif
 }
--- diff/arch/mips/au1000/db1x00/irqmap.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/db1x00/irqmap.c	2004-04-21 10:45:33.598595736 +0100
@@ -49,75 +49,24 @@
 #include <asm/mach-au1x00/au1000.h>
 
 au1xxx_irq_map_t au1xxx_irq_map[] = {
-	{ AU1000_UART0_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_UART3_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+1, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+2, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+3, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+4, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+5, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+6, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+7, INTC_INT_HIGH_LEVEL, 0},
 
-	{ AU1000_IRDA_TX_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_IRDA_RX_INT, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_MAC0_DMA_INT, INTC_INT_HIGH_LEVEL, 0},
-#if defined(CONFIG_MIPS_DB1000) || defined(CONFIG_MIPS_DB1500) || defined(CONFIG_MIPS_MIRAGE)
-	{ AU1000_MAC1_DMA_INT, INTC_INT_HIGH_LEVEL, 0},
-#endif
 #ifndef CONFIG_MIPS_MIRAGE
-	{ AU1500_GPIO_204, INTC_INT_HIGH_LEVEL, 0},
-#endif
-
-	{ AU1000_USB_HOST_INT, INTC_INT_LOW_LEVEL, 0 },
-
-#ifdef CONFIG_SOC_AU1500
-	{ AU1000_PCI_INTA, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1000_PCI_INTB, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1000_PCI_INTC, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1000_PCI_INTD, INTC_INT_LOW_LEVEL, 0 },
-#endif
-
-#ifdef CONFIG_MIPS_DB1500
-	{ AU1500_GPIO_201, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1500_GPIO_202, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1500_GPIO_203, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1500_GPIO_205, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1500_GPIO_207, INTC_INT_LOW_LEVEL, 0 },
+#ifdef CONFIG_MIPS_DB1550
+	{ AU1000_GPIO_3, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 0 IRQ# */
+	{ AU1000_GPIO_5, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 1 IRQ# */
+#else
+	{ AU1000_GPIO_0, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 0 Fully_Interted# */
+	{ AU1000_GPIO_1, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 0 STSCHG# */
+	{ AU1000_GPIO_2, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 0 IRQ# */
+
+	{ AU1000_GPIO_3, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 1 Fully_Interted# */
+	{ AU1000_GPIO_4, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 1 STSCHG# */
+	{ AU1000_GPIO_5, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 1 IRQ# */
 #endif
-
-#ifndef CONFIG_MIPS_MIRAGE
-	{ AU1000_GPIO_0, INTC_INT_LOW_LEVEL, 0 }, // PCMCIA Card 0 Fully_Interted#
-	{ AU1000_GPIO_1, INTC_INT_LOW_LEVEL, 0 }, // PCMCIA Card 0 STSCHG#
-	{ AU1000_GPIO_2, INTC_INT_LOW_LEVEL, 0 }, // PCMCIA Card 0 IRQ#
-
-	{ AU1000_GPIO_3, INTC_INT_LOW_LEVEL, 0 }, // PCMCIA Card 1 Fully_Interted#
-	{ AU1000_GPIO_4, INTC_INT_LOW_LEVEL, 0 }, // PCMCIA Card 1 STSCHG#
-	{ AU1000_GPIO_5, INTC_INT_LOW_LEVEL, 0 }, // PCMCIA Card 1 IRQ#
+#else
+	{ AU1000_GPIO_7, INTC_INT_RISE_EDGE, 0 }, /* touchscreen pen down */
 #endif
 
-	{ AU1000_GPIO_2, INTC_INT_LOW_LEVEL, 0 }, // PCMCIA Card 0 IRQ#
-	{ AU1000_GPIO_5, INTC_INT_LOW_LEVEL, 0 }, // PCMCIA Card 1 IRQ#
-
-	{ AU1000_ACSYNC_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_AC97C_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_USB_DEV_SUS_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_USB_DEV_REQ_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
-
-	/* Careful if you change match 2 request!
-	 * The interrupt handler is called directly
-	 * from the low level dispatch code.
-	 */
-	{ AU1000_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
 };
 
 int au1xxx_nr_irqs = sizeof(au1xxx_irq_map)/sizeof(au1xxx_irq_map_t);
--- diff/arch/mips/au1000/hydrogen3/Makefile	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/hydrogen3/Makefile	2004-04-21 10:45:33.599595584 +0100
@@ -6,13 +6,4 @@
 # Makefile for the Alchemy Semiconductor PB1000 board.
 #
 
-.S.s:
-	$(CPP) $(CFLAGS) $< -o $*.s
-.S.o:
-	$(CC) $(CFLAGS) -c $< -o $*.o
-
-O_TARGET := hydrogen3.o
-
 obj-y := init.o board_setup.o irqmap.o
-
-include $(TOPDIR)/Rules.make
--- diff/arch/mips/au1000/hydrogen3/board_setup.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/hydrogen3/board_setup.c	2004-04-21 10:45:33.599595584 +0100
@@ -44,7 +44,6 @@
 #include <asm/reboot.h>
 #include <asm/pgtable.h>
 #include <asm/au1000.h>
-#include <asm/db1x00.h>
 
 extern struct rtc_ops no_rtc_ops;
 
--- diff/arch/mips/au1000/hydrogen3/irqmap.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/hydrogen3/irqmap.c	2004-04-21 10:45:33.599595584 +0100
@@ -48,43 +48,9 @@
 #include <asm/au1000.h>
 
 au1xxx_irq_map_t au1xxx_irq_map[] = {
-	{ AU1000_UART0_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_UART3_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+1, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+2, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+3, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+4, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+5, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+6, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+7, INTC_INT_HIGH_LEVEL, 0},
 
-	{ AU1000_IRDA_TX_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_IRDA_RX_INT, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_MAC0_DMA_INT, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_USB_HOST_INT, INTC_INT_LOW_LEVEL, 0 },
-
-//	{ AU1500_GPIO_205, INTC_INT_LOW_LEVEL, 0 },
-
-	{ AU1000_ACSYNC_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_AC97C_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_USB_DEV_SUS_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_USB_DEV_REQ_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
-
-	/* Careful if you change match 2 request!
-	 * The interrupt handler is called directly
-	 * from the low level dispatch code.
-	 */
-	{ AU1000_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
+	/* { AU1500_GPIO_205, INTC_INT_LOW_LEVEL, 0 }, */
+	{ AU1000_GPIO_21, INTC_INT_LOW_LEVEL, 0 },
 };
 
 int au1xxx_nr_irqs = sizeof(au1xxx_irq_map)/sizeof(au1xxx_irq_map_t);
--- diff/arch/mips/au1000/mtx-1/irqmap.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/mtx-1/irqmap.c	2004-04-21 10:45:33.600595432 +0100
@@ -47,47 +47,10 @@
 #include <asm/system.h>
 #include <asm/au1000.h>
 
+/* Need to define this.
+*/
 au1xxx_irq_map_t au1xxx_irq_map[] = {
-	{ AU1000_UART0_INT, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_DMA_INT_BASE, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+1, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+2, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+3, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+4, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+5, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+6, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+7, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_MAC0_DMA_INT, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_USB_HOST_INT, INTC_INT_LOW_LEVEL, 0 },
-
-	{ AU1000_PCI_INTA, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1000_PCI_INTB, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1000_PCI_INTC, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1000_PCI_INTD, INTC_INT_LOW_LEVEL, 0 },
-
-	{ AU1000_ACSYNC_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_AC97C_INT, INTC_INT_RISE_EDGE, 0 },
-
-	{ AU1000_TOY_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-
-	{ AU1000_USB_DEV_SUS_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_USB_DEV_REQ_INT, INTC_INT_RISE_EDGE, 0 },
-
-	{ AU1000_RTC_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
-
-	/* Careful if you change match 2 request!
-	 * The interrupt handler is called directly
-	 * from the low level dispatch code.
-	 */
-	{ AU1000_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
+	{ 0. 0. 0}
 };
 
-int au1xxx_nr_irqs = sizeof(au1xxx_irq_map)/sizeof(au1xxx_irq_map_t);
+int au1xxx_nr_irqs = 0;
--- diff/arch/mips/au1000/pb1000/irqmap.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/pb1000/irqmap.c	2004-04-21 10:45:33.600595432 +0100
@@ -48,49 +48,7 @@
 #include <asm/au1000.h>
 
 au1xxx_irq_map_t au1xxx_irq_map[] = {
-	{ AU1000_UART0_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_UART1_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_UART2_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_UART3_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_SSI0_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_SSI1_INT, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_DMA_INT_BASE, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+1, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+2, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+3, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+4, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+5, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+6, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+7, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_IRDA_TX_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_IRDA_RX_INT, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_MAC0_DMA_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_MAC1_DMA_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1500_GPIO_204, INTC_INT_HIGH_LEVEL, 0},
-
 	{ AU1000_GPIO_15, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1000_USB_HOST_INT, INTC_INT_LOW_LEVEL, 0 },
-
-	{ AU1000_ACSYNC_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_AC97C_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_USB_DEV_SUS_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_USB_DEV_REQ_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
-
-	/* Careful if you change match 2 request!
-	 * The interrupt handler is called directly
-	 * from the low level dispatch code.
-	 */
-	{ AU1000_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
 };
 
 int au1xxx_nr_irqs = sizeof(au1xxx_irq_map)/sizeof(au1xxx_irq_map_t);
--- diff/arch/mips/au1000/pb1100/irqmap.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/pb1100/irqmap.c	2004-04-21 10:45:33.600595432 +0100
@@ -48,53 +48,10 @@
 #include <asm/au1000.h>
 
 au1xxx_irq_map_t au1xxx_irq_map[] = {
-	{ AU1000_UART0_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_UART1_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_UART3_INT, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_SSI0_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_SSI1_INT, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_DMA_INT_BASE, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+1, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+2, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+3, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+4, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+5, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+6, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+7, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_IRDA_TX_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_IRDA_RX_INT, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_MAC0_DMA_INT, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1500_GPIO_204, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_USB_HOST_INT, INTC_INT_LOW_LEVEL, 0 },
 	{ AU1000_GPIO_9, INTC_INT_LOW_LEVEL, 0 }, // PCMCIA Card Fully_Interted#
 	{ AU1000_GPIO_10, INTC_INT_LOW_LEVEL, 0 }, // PCMCIA Card STSCHG#
 	{ AU1000_GPIO_11, INTC_INT_LOW_LEVEL, 0 }, // PCMCIA Card IRQ#
 	{ AU1000_GPIO_13, INTC_INT_LOW_LEVEL, 0 }, // DC_IRQ#
-	{ AU1000_GPIO_23, INTC_INT_LOW_LEVEL, 0 }, // 2-wire SCL
-
-	{ AU1000_ACSYNC_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_AC97C_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_USB_DEV_SUS_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_USB_DEV_REQ_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
-
-	/* Careful if you change match 2 request!
-	 * The interrupt handler is called directly
-	 * from the low level dispatch code.
-	 */
-	{ AU1000_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
 };
 
 int au1xxx_nr_irqs = sizeof(au1xxx_irq_map)/sizeof(au1xxx_irq_map_t);
--- diff/arch/mips/au1000/pb1500/irqmap.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/pb1500/irqmap.c	2004-04-21 10:45:33.601595280 +0100
@@ -48,53 +48,11 @@
 #include <asm/mach-au1x00/au1000.h>
 
 au1xxx_irq_map_t au1xxx_irq_map[] = {
-	{ AU1000_UART0_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_UART3_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+1, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+2, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+3, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+4, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+5, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+6, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+7, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_IRDA_TX_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_IRDA_RX_INT, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_MAC0_DMA_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_MAC1_DMA_INT, INTC_INT_HIGH_LEVEL, 0},
 	{ AU1500_GPIO_204, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_USB_HOST_INT, INTC_INT_LOW_LEVEL, 0 },
-
-	{ AU1000_PCI_INTA, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1000_PCI_INTB, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1000_PCI_INTC, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1000_PCI_INTD, INTC_INT_LOW_LEVEL, 0 },
 	{ AU1500_GPIO_201, INTC_INT_LOW_LEVEL, 0 },
 	{ AU1500_GPIO_202, INTC_INT_LOW_LEVEL, 0 },
 	{ AU1500_GPIO_203, INTC_INT_LOW_LEVEL, 0 },
 	{ AU1500_GPIO_205, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1500_GPIO_207, INTC_INT_LOW_LEVEL, 0 },
-
-	{ AU1000_ACSYNC_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_AC97C_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_USB_DEV_SUS_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_USB_DEV_REQ_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
-
-	/* Careful if you change match 2 request!
-	 * The interrupt handler is called directly
-	 * from the low level dispatch code.
-	 */
-	{ AU1000_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
 };
 
 int au1xxx_nr_irqs = sizeof(au1xxx_irq_map)/sizeof(au1xxx_irq_map_t);
--- diff/arch/mips/au1000/pb1550/Makefile	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/pb1550/Makefile	2004-04-21 10:45:33.601595280 +0100
@@ -6,13 +6,4 @@
 # Makefile for the Alchemy Semiconductor PB1000 board.
 #
 
-.S.s:
-	$(CPP) $(CFLAGS) $< -o $*.s
-.S.o:
-	$(CC) $(CFLAGS) -c $< -o $*.o
-
-O_TARGET := pb1550.o
-
-obj-y := init.o board_setup.o irqmap.o
-
-include $(TOPDIR)/Rules.make
+lib-y := init.o board_setup.o irqmap.o
--- diff/arch/mips/au1000/pb1550/board_setup.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/pb1550/board_setup.c	2004-04-21 10:45:33.601595280 +0100
@@ -39,29 +39,26 @@
 #include <asm/cpu.h>
 #include <asm/bootinfo.h>
 #include <asm/irq.h>
-#include <asm/keyboard.h>
 #include <asm/mipsregs.h>
 #include <asm/reboot.h>
 #include <asm/pgtable.h>
-#include <asm/au1000.h>
-#include <asm/db1x00.h>
-
-extern struct rtc_ops no_rtc_ops;
-
-static BCSR * const bcsr = (BCSR *)0xB3000000;
+#include <asm/mach-au1x00/au1000.h>
+#include <asm/mach-pb1x00/pb1550.h>
 
 void __init board_setup(void)
 {
 	u32 pin_func;
-	rtc_ops = &no_rtc_ops;
 
-#ifdef CONFIG_AU1X00_USB_DEVICE
-	// 2nd USB port is USB device
-	pin_func = au_readl(SYS_PINFUNC) & (u32)(~0x8000);
+	/* Enable PSC1 SYNC for AC97.  Normaly done in audio driver,
+	 * but it is board specific code, so put it here.
+	 */
+	pin_func = au_readl(SYS_PINFUNC);
+	au_sync();
+	pin_func |= SYS_PF_MUST_BE_SET | SYS_PF_PSC1_S1;
 	au_writel(pin_func, SYS_PINFUNC);
-#endif
 
 	au_writel(0, (u32)bcsr|0x10); /* turn off pcmcia power */
+	au_sync();
 
-    printk("AMD Alchemy Pb1550 Board\n");
+	printk("AMD Alchemy Pb1550 Board\n");
 }
--- diff/arch/mips/au1000/pb1550/init.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/pb1550/init.c	2004-04-21 10:45:33.602595128 +0100
@@ -27,17 +27,14 @@
  *  with this program; if not, write  to the Free Software Foundation, Inc.,
  *  675 Mass Ave, Cambridge, MA 02139, USA.
  */
-
 #include <linux/init.h>
 #include <linux/mm.h>
 #include <linux/sched.h>
 #include <linux/bootmem.h>
 #include <asm/addrspace.h>
 #include <asm/bootinfo.h>
-#include <linux/config.h>
 #include <linux/string.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 
 int prom_argc;
 char **prom_argv, **prom_envp;
@@ -46,28 +43,27 @@ extern char *prom_getenv(char *envname);
 
 const char *get_system_type(void)
 {
-	return "AMD Alchemy PbAu1550";
+	return "Alchemy Pb1550";
 }
 
-int __init prom_init(int argc, char **argv, char **envp, int *prom_vec)
+void __init prom_init(void)
 {
 	unsigned char *memsize_str;
 	unsigned long memsize;
 
-	prom_argc = argc;
-	prom_argv = argv;
-	prom_envp = envp;
+	prom_argc = (int) fw_arg0;
+	prom_argv = (char **) fw_arg1;
+	prom_envp = (char **) fw_arg2;
 
 	mips_machgroup = MACH_GROUP_ALCHEMY;
-	mips_machtype = MACH_PB1000;	/* set the platform # */   
-	prom_init_cmdline();
+	mips_machtype = MACH_PB1550;
 
+	prom_init_cmdline();
 	memsize_str = prom_getenv("memsize");
 	if (!memsize_str) {
-		memsize = 0x04000000;
+		memsize = 0x08000000;
 	} else {
 		memsize = simple_strtol(memsize_str, NULL, 0);
 	}
 	add_memory_region(0, memsize, BOOT_MEM_RAM);
-	return 0;
 }
--- diff/arch/mips/au1000/pb1550/irqmap.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/pb1550/irqmap.c	2004-04-21 10:45:33.602595128 +0100
@@ -45,49 +45,11 @@
 #include <asm/io.h>
 #include <asm/mipsregs.h>
 #include <asm/system.h>
-#include <asm/au1000.h>
+#include <asm/mach-au1x00/au1000.h>
 
 au1xxx_irq_map_t au1xxx_irq_map[] = {
-	{ AU1550_UART0_INT, 	INTC_INT_HIGH_LEVEL, 0},
-	{ AU1550_PCI_INTA, 		INTC_INT_LOW_LEVEL, 0 },
-	{ AU1550_PCI_INTB, 		INTC_INT_LOW_LEVEL, 0 },
-	{ AU1550_DDMA_INT, 		INTC_INT_HIGH_LEVEL, 0},
-	{ AU1550_CRYPTO_INT, 	INTC_INT_HIGH_LEVEL, 0},
-	{ AU1550_PCI_INTC, 		INTC_INT_LOW_LEVEL, 0 },
-	{ AU1550_PCI_INTD, 		INTC_INT_LOW_LEVEL, 0 },
-	{ AU1550_PCI_RST_INT, 	INTC_INT_LOW_LEVEL, 0 },
-	{ AU1550_UART1_INT, 	INTC_INT_HIGH_LEVEL, 0},
-	{ AU1550_UART3_INT, 	INTC_INT_HIGH_LEVEL, 0},
-	{ AU1550_PSC0_INT, 		INTC_INT_HIGH_LEVEL, 0},
-	{ AU1550_PSC1_INT, 		INTC_INT_HIGH_LEVEL, 0},
-	{ AU1550_PSC2_INT, 		INTC_INT_HIGH_LEVEL, 0},
-	{ AU1550_PSC3_INT, 		INTC_INT_HIGH_LEVEL, 0},
-	{ AU1550_TOY_INT, 		INTC_INT_RISE_EDGE, 0 },
-	{ AU1550_TOY_MATCH0_INT,INTC_INT_RISE_EDGE, 0 },
-	{ AU1550_TOY_MATCH1_INT,INTC_INT_RISE_EDGE, 0 },
-	/* Careful if you change match 2 request!
-	 * The interrupt handler is called directly
-	 * from the low level dispatch code.
-	 */
-	{ AU1550_TOY_MATCH2_INT,INTC_INT_RISE_EDGE, 0 },
-	{ AU1550_RTC_INT, 		INTC_INT_RISE_EDGE, 0 },
-	{ AU1550_RTC_MATCH0_INT,INTC_INT_RISE_EDGE, 0 },
-	{ AU1550_RTC_MATCH1_INT,INTC_INT_RISE_EDGE, 0 },
-	{ AU1550_RTC_MATCH2_INT,INTC_INT_RISE_EDGE, 0 },
-	{ AU1550_RTC_MATCH2_INT,INTC_INT_RISE_EDGE, 0 },
-	{ AU1550_NAND_INT, 		INTC_INT_RISE_EDGE, 0 },
-	{ AU1550_USB_DEV_REQ_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1550_USB_DEV_SUS_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1550_USB_HOST_INT,  INTC_INT_LOW_LEVEL, 0 },
-	{ AU1550_MAC0_DMA_INT,  INTC_INT_HIGH_LEVEL, 0},
-	{ AU1550_MAC1_DMA_INT,  INTC_INT_HIGH_LEVEL, 0},
-
-
-	/*
-	 *  Need to define platform dependant GPIO ints here
-	 */
-	#warning PbAu1550 needs GPIO Interrupts defined
-
+	{ AU1000_GPIO_0, INTC_INT_LOW_LEVEL, 0 },
+	{ AU1000_GPIO_1, INTC_INT_LOW_LEVEL, 0 },
 };
 
 int au1xxx_nr_irqs = sizeof(au1xxx_irq_map)/sizeof(au1xxx_irq_map_t);
--- diff/arch/mips/au1000/xxs1500/irqmap.c	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/au1000/xxs1500/irqmap.c	2004-04-21 10:45:33.603594976 +0100
@@ -48,29 +48,7 @@
 #include <asm/au1000.h>
 
 au1xxx_irq_map_t au1xxx_irq_map[] = {
-	{ AU1000_UART0_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_UART3_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+1, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+2, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+3, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+4, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+5, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+6, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_DMA_INT_BASE+7, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_IRDA_TX_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_IRDA_RX_INT, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_MAC0_DMA_INT, INTC_INT_HIGH_LEVEL, 0},
-	{ AU1000_MAC1_DMA_INT, INTC_INT_HIGH_LEVEL, 0},
 	{ AU1500_GPIO_204, INTC_INT_HIGH_LEVEL, 0},
-
-	{ AU1000_USB_HOST_INT, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1000_PCI_INTA, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1000_PCI_INTB, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1000_PCI_INTC, INTC_INT_LOW_LEVEL, 0 },
-	{ AU1000_PCI_INTD, INTC_INT_LOW_LEVEL, 0 },
 	{ AU1500_GPIO_201, INTC_INT_LOW_LEVEL, 0 },
 	{ AU1500_GPIO_202, INTC_INT_LOW_LEVEL, 0 },
 	{ AU1500_GPIO_203, INTC_INT_LOW_LEVEL, 0 },
@@ -83,24 +61,6 @@ au1xxx_irq_map_t au1xxx_irq_map[] = {
 	{ AU1000_GPIO_3, INTC_INT_LOW_LEVEL, 0 },
 	{ AU1000_GPIO_4, INTC_INT_LOW_LEVEL, 0 }, /* CF interrupt */
 	{ AU1000_GPIO_5, INTC_INT_LOW_LEVEL, 0 },
-
-	{ AU1000_ACSYNC_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_AC97C_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_USB_DEV_SUS_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_USB_DEV_REQ_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-	{ AU1000_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
-
-	/* Careful if you change match 2 request!
-	 * The interrupt handler is called directly
-	 * from the low level dispatch code.
-	 */
-	{ AU1000_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
 };
 
 int au1xxx_nr_irqs = sizeof(au1xxx_irq_map)/sizeof(au1xxx_irq_map_t);
--- diff/arch/mips/baget/baget.c	2003-07-08 09:55:17.000000000 +0100
+++ source/arch/mips/baget/baget.c	2004-04-21 10:45:33.603594976 +0100
@@ -12,7 +12,6 @@
 #include <asm/bootinfo.h>
 #include <asm/mipsregs.h>
 #include <asm/pgtable.h>
-#include <asm/pgalloc.h>
 
 #include <asm/baget/baget.h>
 
--- diff/arch/mips/configs/atlas_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/atlas_defconfig	2004-04-21 10:45:33.604594824 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -50,7 +51,6 @@ CONFIG_IOSCHED_DEADLINE=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 CONFIG_MIPS_ATLAS=y
 # CONFIG_MIPS_MALTA is not set
@@ -122,7 +122,6 @@ CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -165,6 +164,7 @@ CONFIG_TRAD_SIGNALS=y
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_CARMEL is not set
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_SIZE=4096
 # CONFIG_BLK_DEV_INITRD is not set
@@ -199,6 +199,12 @@ CONFIG_BLK_DEV_SD=y
 # CONFIG_SCSI_LOGGING is not set
 
 #
+# SCSI Transport Attributes
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+
+#
 # SCSI low-level drivers
 #
 # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
@@ -246,7 +252,7 @@ CONFIG_SCSI_QLA2XXX=y
 # CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -256,10 +262,6 @@ CONFIG_SCSI_QLA2XXX=y
 # CONFIG_I2O is not set
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -282,7 +284,6 @@ CONFIG_IP_PNP=y
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -297,7 +298,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -384,6 +384,7 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_NET_FC is not set
 # CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -404,11 +405,13 @@ CONFIG_NET_ETHERNET=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -474,12 +477,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -491,7 +490,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -512,6 +510,10 @@ CONFIG_UNIX98_PTY_COUNT=256
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -581,7 +583,6 @@ CONFIG_EXT2_FS=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -594,6 +595,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -617,7 +619,7 @@ CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
 # CONFIG_EXPORTFS is not set
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
--- diff/arch/mips/configs/bosporus_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/bosporus_defconfig	2004-04-21 10:45:33.604594824 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+CONFIG_HOTPLUG=y
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -55,7 +56,6 @@ CONFIG_KMOD=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -117,12 +117,12 @@ CONFIG_CPU_HAS_SYNC=y
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
 CONFIG_MMU=y
-CONFIG_HOTPLUG=y
 
 #
 # PCMCIA/CardBus support
 #
 CONFIG_PCMCIA=m
+# CONFIG_PCMCIA_DEBUG is not set
 # CONFIG_TCIC is not set
 
 #
@@ -167,7 +167,6 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -190,7 +189,7 @@ CONFIG_BLK_DEV_LOOP=y
 #
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -199,10 +198,6 @@ CONFIG_BLK_DEV_LOOP=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -226,7 +221,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -257,7 +251,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -320,6 +313,7 @@ CONFIG_PPPOE=m
 # Token Ring devices
 #
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -353,11 +347,13 @@ CONFIG_PCMCIA_3C589=m
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -417,12 +413,8 @@ CONFIG_HW_CONSOLE=y
 # Non-8250 serial port support
 #
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -434,7 +426,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 CONFIG_RTC=y
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
@@ -459,6 +450,10 @@ CONFIG_RTC=y
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -537,7 +532,6 @@ CONFIG_AUTOFS4_FS=m
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 CONFIG_TMPFS=y
@@ -550,6 +544,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -574,7 +569,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_EXPORTFS=m
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 CONFIG_SMB_FS=m
 # CONFIG_SMB_NLS_DEFAULT is not set
 # CONFIG_CIFS is not set
@@ -662,7 +657,9 @@ CONFIG_CRYPTO_TWOFISH=y
 CONFIG_CRYPTO_AES=y
 # CONFIG_CRYPTO_CAST5 is not set
 # CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_ARC4 is not set
 CONFIG_CRYPTO_DEFLATE=y
+CONFIG_CRYPTO_MICHAEL_MIC=y
 # CONFIG_CRYPTO_TEST is not set
 
 #
--- diff/arch/mips/configs/capcella_defconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/mips/configs/capcella_defconfig	2004-04-21 10:45:33.605594672 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -62,7 +63,6 @@ CONFIG_ZAO_CAPCELLA=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -126,7 +126,6 @@ CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -167,8 +166,8 @@ CONFIG_TRAD_SIGNALS=y
 # CONFIG_BLK_DEV_UMEM is not set
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_CARMEL is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -211,9 +210,10 @@ CONFIG_IDE_GENERIC=y
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -223,10 +223,6 @@ CONFIG_IDE_GENERIC=y
 # CONFIG_I2O is not set
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -250,7 +246,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -265,7 +260,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -351,6 +345,7 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_TR is not set
 # CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -371,11 +366,13 @@ CONFIG_NET_ETHERNET=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -441,12 +438,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -470,7 +463,6 @@ CONFIG_WATCHDOG=y
 #
 # CONFIG_PCIPCWATCHDOG is not set
 # CONFIG_WDTPCI is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -491,6 +483,10 @@ CONFIG_WATCHDOG=y
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -560,7 +556,6 @@ CONFIG_AUTOFS4_FS=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -573,6 +568,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -597,7 +593,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_EXPORTFS=y
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
--- diff/arch/mips/configs/cobalt_defconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/mips/configs/cobalt_defconfig	2004-04-21 10:45:33.606594520 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -50,7 +51,6 @@ CONFIG_MIPS_COBALT=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -118,7 +118,6 @@ CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -160,8 +159,8 @@ CONFIG_TRAD_SIGNALS=y
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_CARMEL is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -204,9 +203,10 @@ CONFIG_IDE_GENERIC=y
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -216,10 +216,6 @@ CONFIG_IDE_GENERIC=y
 # CONFIG_I2O is not set
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -239,7 +235,6 @@ CONFIG_INET=y
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -254,7 +249,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -340,6 +334,7 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_TR is not set
 # CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -360,11 +355,13 @@ CONFIG_NET_ETHERNET=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -430,12 +427,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=16
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -447,7 +440,6 @@ CONFIG_UNIX98_PTY_COUNT=16
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 CONFIG_RTC=y
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
@@ -467,6 +459,10 @@ CONFIG_RTC=y
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -540,7 +536,6 @@ CONFIG_FS_POSIX_ACL=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -553,6 +548,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -574,7 +570,7 @@ CONFIG_NFS_FS=y
 CONFIG_LOCKD=y
 # CONFIG_EXPORTFS is not set
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
--- diff/arch/mips/configs/db1000_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/db1000_defconfig	2004-04-21 10:45:33.606594520 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+CONFIG_HOTPLUG=y
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -55,7 +56,6 @@ CONFIG_KMOD=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -75,12 +75,15 @@ CONFIG_SOC_AU1X00=y
 CONFIG_SOC_AU1000=y
 # CONFIG_SOC_AU1100 is not set
 # CONFIG_SOC_AU1500 is not set
+# CONFIG_SOC_AU1550 is not set
 # CONFIG_MIPS_PB1000 is not set
 # CONFIG_MIPS_PB1100 is not set
 # CONFIG_MIPS_PB1500 is not set
+# CONFIG_MIPS_PB1550 is not set
 CONFIG_MIPS_DB1000=y
 # CONFIG_MIPS_DB1100 is not set
 # CONFIG_MIPS_DB1500 is not set
+# CONFIG_MIPS_DB1550 is not set
 # CONFIG_MIPS_BOSPORUS is not set
 # CONFIG_MIPS_MIRAGE is not set
 # CONFIG_MIPS_XXS1500 is not set
@@ -132,12 +135,12 @@ CONFIG_CPU_HAS_SYNC=y
 #
 # CONFIG_PCI is not set
 CONFIG_MMU=y
-CONFIG_HOTPLUG=y
 
 #
 # PCMCIA/CardBus support
 #
 CONFIG_PCMCIA=m
+# CONFIG_PCMCIA_DEBUG is not set
 # CONFIG_TCIC is not set
 # CONFIG_PCMCIA_AU1X00 is not set
 
@@ -183,7 +186,6 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -206,7 +208,7 @@ CONFIG_BLK_DEV_LOOP=y
 #
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -215,10 +217,6 @@ CONFIG_BLK_DEV_LOOP=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -242,7 +240,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -273,7 +270,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -337,6 +333,7 @@ CONFIG_PPPOE=m
 # Token Ring devices
 #
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -370,11 +367,13 @@ CONFIG_PCMCIA_3C589=m
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -440,12 +439,8 @@ CONFIG_SERIAL_AU1X00_CONSOLE=y
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -457,7 +452,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 CONFIG_RTC=y
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
@@ -482,6 +476,10 @@ CONFIG_RTC=y
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -560,7 +558,6 @@ CONFIG_AUTOFS4_FS=m
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 CONFIG_TMPFS=y
@@ -573,6 +570,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -597,7 +595,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_EXPORTFS=m
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 CONFIG_SMB_FS=m
 # CONFIG_SMB_NLS_DEFAULT is not set
 # CONFIG_CIFS is not set
@@ -685,7 +683,9 @@ CONFIG_CRYPTO_TWOFISH=y
 CONFIG_CRYPTO_AES=y
 # CONFIG_CRYPTO_CAST5 is not set
 # CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_ARC4 is not set
 CONFIG_CRYPTO_DEFLATE=y
+CONFIG_CRYPTO_MICHAEL_MIC=y
 # CONFIG_CRYPTO_TEST is not set
 
 #
--- diff/arch/mips/configs/db1100_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/db1100_defconfig	2004-04-21 10:45:33.607594368 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+CONFIG_HOTPLUG=y
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -55,7 +56,6 @@ CONFIG_KMOD=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -75,12 +75,15 @@ CONFIG_SOC_AU1X00=y
 # CONFIG_SOC_AU1000 is not set
 CONFIG_SOC_AU1100=y
 # CONFIG_SOC_AU1500 is not set
+# CONFIG_SOC_AU1550 is not set
 # CONFIG_MIPS_PB1000 is not set
 # CONFIG_MIPS_PB1100 is not set
 # CONFIG_MIPS_PB1500 is not set
+# CONFIG_MIPS_PB1550 is not set
 # CONFIG_MIPS_DB1000 is not set
 CONFIG_MIPS_DB1100=y
 # CONFIG_MIPS_DB1500 is not set
+# CONFIG_MIPS_DB1550 is not set
 # CONFIG_MIPS_BOSPORUS is not set
 # CONFIG_MIPS_MIRAGE is not set
 # CONFIG_MIPS_XXS1500 is not set
@@ -131,12 +134,12 @@ CONFIG_CPU_HAS_SYNC=y
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
 CONFIG_MMU=y
-CONFIG_HOTPLUG=y
 
 #
 # PCMCIA/CardBus support
 #
 CONFIG_PCMCIA=m
+# CONFIG_PCMCIA_DEBUG is not set
 # CONFIG_TCIC is not set
 # CONFIG_PCMCIA_AU1X00 is not set
 
@@ -182,7 +185,6 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -205,7 +207,7 @@ CONFIG_BLK_DEV_LOOP=y
 #
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -214,10 +216,6 @@ CONFIG_BLK_DEV_LOOP=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -241,7 +239,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -272,7 +269,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -336,6 +332,7 @@ CONFIG_PPPOE=m
 # Token Ring devices
 #
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -369,11 +366,13 @@ CONFIG_PCMCIA_3C589=m
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -436,12 +435,8 @@ CONFIG_HW_CONSOLE=y
 #
 # CONFIG_SERIAL_AU1X00 is not set
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -453,7 +448,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 CONFIG_RTC=y
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
@@ -478,6 +472,10 @@ CONFIG_RTC=y
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -556,7 +554,6 @@ CONFIG_AUTOFS4_FS=m
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 CONFIG_TMPFS=y
@@ -569,6 +566,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -593,7 +591,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_EXPORTFS=m
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 CONFIG_SMB_FS=m
 # CONFIG_SMB_NLS_DEFAULT is not set
 # CONFIG_CIFS is not set
@@ -681,7 +679,9 @@ CONFIG_CRYPTO_TWOFISH=y
 CONFIG_CRYPTO_AES=y
 # CONFIG_CRYPTO_CAST5 is not set
 # CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_ARC4 is not set
 CONFIG_CRYPTO_DEFLATE=y
+CONFIG_CRYPTO_MICHAEL_MIC=y
 # CONFIG_CRYPTO_TEST is not set
 
 #
--- diff/arch/mips/configs/db1500_defconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/mips/configs/db1500_defconfig	2004-04-21 10:45:33.608594216 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+CONFIG_HOTPLUG=y
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -55,7 +56,6 @@ CONFIG_KMOD=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -75,12 +75,15 @@ CONFIG_SOC_AU1X00=y
 # CONFIG_SOC_AU1000 is not set
 # CONFIG_SOC_AU1100 is not set
 CONFIG_SOC_AU1500=y
+# CONFIG_SOC_AU1550 is not set
 # CONFIG_MIPS_PB1000 is not set
 # CONFIG_MIPS_PB1100 is not set
 # CONFIG_MIPS_PB1500 is not set
+# CONFIG_MIPS_PB1550 is not set
 # CONFIG_MIPS_DB1000 is not set
 # CONFIG_MIPS_DB1100 is not set
 CONFIG_MIPS_DB1500=y
+# CONFIG_MIPS_DB1550 is not set
 # CONFIG_MIPS_BOSPORUS is not set
 # CONFIG_MIPS_MIRAGE is not set
 # CONFIG_MIPS_XXS1500 is not set
@@ -132,12 +135,12 @@ CONFIG_CPU_HAS_SYNC=y
 #
 # CONFIG_PCI is not set
 CONFIG_MMU=y
-CONFIG_HOTPLUG=y
 
 #
 # PCMCIA/CardBus support
 #
 CONFIG_PCMCIA=m
+# CONFIG_PCMCIA_DEBUG is not set
 # CONFIG_TCIC is not set
 # CONFIG_PCMCIA_AU1X00 is not set
 
@@ -240,7 +243,6 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -285,7 +287,7 @@ CONFIG_IDE_GENERIC=y
 #
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -294,10 +296,6 @@ CONFIG_IDE_GENERIC=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -321,7 +319,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -352,7 +349,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -416,6 +412,7 @@ CONFIG_PPPOE=m
 # Token Ring devices
 #
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -449,11 +446,13 @@ CONFIG_PCMCIA_3C589=m
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -517,12 +516,8 @@ CONFIG_SERIAL_AU1X00_CONSOLE=y
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -534,7 +529,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 CONFIG_RTC=y
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
@@ -559,6 +553,10 @@ CONFIG_RTC=y
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -630,7 +628,6 @@ CONFIG_AUTOFS4_FS=m
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 CONFIG_TMPFS=y
@@ -643,6 +640,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -669,7 +667,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_EXPORTFS=m
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 CONFIG_SMB_FS=m
 # CONFIG_SMB_NLS_DEFAULT is not set
 # CONFIG_CIFS is not set
@@ -757,7 +755,9 @@ CONFIG_CRYPTO_TWOFISH=y
 CONFIG_CRYPTO_AES=y
 # CONFIG_CRYPTO_CAST5 is not set
 # CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_ARC4 is not set
 CONFIG_CRYPTO_DEFLATE=y
+CONFIG_CRYPTO_MICHAEL_MIC=y
 # CONFIG_CRYPTO_TEST is not set
 
 #
--- diff/arch/mips/configs/ddb5476_defconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/mips/configs/ddb5476_defconfig	2004-04-21 10:45:33.608594216 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -50,7 +51,6 @@ CONFIG_IOSCHED_DEADLINE=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -117,8 +117,8 @@ CONFIG_CPU_HAS_SYNC=y
 CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
+CONFIG_ISA=y
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -148,19 +148,21 @@ CONFIG_TRAD_SIGNALS=y
 #
 # Plug and Play support
 #
+# CONFIG_PNP is not set
 
 #
 # Block devices
 #
 # CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
 # CONFIG_BLK_CPQ_DA is not set
 # CONFIG_BLK_CPQ_CISS_DA is not set
 # CONFIG_BLK_DEV_DAC960 is not set
 # CONFIG_BLK_DEV_UMEM is not set
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_CARMEL is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -186,6 +188,7 @@ CONFIG_IDE_TASKFILE_IO=y
 #
 CONFIG_IDE_GENERIC=y
 # CONFIG_BLK_DEV_IDEPCI is not set
+# CONFIG_IDE_CHIPSETS is not set
 # CONFIG_BLK_DEV_IDEDMA is not set
 # CONFIG_IDEDMA_AUTO is not set
 # CONFIG_BLK_DEV_HD is not set
@@ -196,6 +199,11 @@ CONFIG_IDE_GENERIC=y
 # CONFIG_SCSI is not set
 
 #
+# Old CD-ROM drivers (not SCSI, not IDE)
+#
+# CONFIG_CD_NO_IDESCSI is not set
+
+#
 # Multi-device support (RAID and LVM)
 #
 # CONFIG_MD is not set
@@ -203,9 +211,10 @@ CONFIG_IDE_GENERIC=y
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -215,10 +224,6 @@ CONFIG_IDE_GENERIC=y
 # CONFIG_I2O is not set
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -241,7 +246,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -256,7 +260,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -300,13 +303,20 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
 # CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_LANCE is not set
+# CONFIG_NET_VENDOR_SMC is not set
+# CONFIG_NET_VENDOR_RACAL is not set
 
 #
 # Tulip family network device support
 #
 # CONFIG_NET_TULIP is not set
+# CONFIG_AT1700 is not set
+# CONFIG_DEPCA is not set
 # CONFIG_HP100 is not set
+# CONFIG_NET_ISA is not set
 # CONFIG_NET_PCI is not set
+# CONFIG_NET_POCKET is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -342,6 +352,7 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_TR is not set
 # CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -362,11 +373,13 @@ CONFIG_NET_ETHERNET=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -432,12 +445,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -449,7 +458,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -470,6 +478,10 @@ CONFIG_UNIX98_PTY_COUNT=256
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -482,6 +494,7 @@ CONFIG_UNIX98_PTY_COUNT=256
 #
 # Graphics support
 #
+# CONFIG_FB_PM2 is not set
 # CONFIG_FB_CYBER2000 is not set
 # CONFIG_FB_IMSTT is not set
 # CONFIG_FB_RIVA is not set
@@ -561,7 +574,6 @@ CONFIG_EXT2_FS=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -574,6 +586,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -596,7 +609,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 # CONFIG_EXPORTFS is not set
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
--- diff/arch/mips/configs/ddb5477_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/ddb5477_defconfig	2004-04-21 10:45:33.609594064 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -50,7 +51,6 @@ CONFIG_IOSCHED_DEADLINE=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -119,7 +119,6 @@ CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -160,8 +159,8 @@ CONFIG_TRAD_SIGNALS=y
 # CONFIG_BLK_DEV_UMEM is not set
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_CARMEL is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -182,9 +181,10 @@ CONFIG_TRAD_SIGNALS=y
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -194,10 +194,6 @@ CONFIG_TRAD_SIGNALS=y
 # CONFIG_I2O is not set
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -220,7 +216,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -235,7 +230,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -340,6 +334,7 @@ CONFIG_PCNET32=y
 # CONFIG_TR is not set
 # CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -360,11 +355,13 @@ CONFIG_PCNET32=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -430,12 +427,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -447,7 +440,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -468,6 +460,10 @@ CONFIG_UNIX98_PTY_COUNT=256
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -537,7 +533,6 @@ CONFIG_AUTOFS4_FS=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -550,6 +545,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -574,7 +570,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_EXPORTFS=y
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
--- diff/arch/mips/configs/decstation_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/decstation_defconfig	2004-04-21 10:45:33.610593912 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -55,7 +56,6 @@ CONFIG_MACH_DECSTATION=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -118,7 +118,6 @@ CONFIG_CPU_HAS_WB=y
 #
 CONFIG_TC=y
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -156,7 +155,6 @@ CONFIG_TRAD_SIGNALS=y
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -188,6 +186,12 @@ CONFIG_SCSI_CONSTANTS=y
 # CONFIG_SCSI_LOGGING is not set
 
 #
+# SCSI Transport Attributes
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+
+#
 # SCSI low-level drivers
 #
 CONFIG_SCSI_DECNCR=y
@@ -205,10 +209,9 @@ CONFIG_SCSI_DECNCR=y
 #
 # Fusion MPT device support
 #
-# CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -217,10 +220,6 @@ CONFIG_SCSI_DECNCR=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -243,7 +242,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -258,7 +256,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -315,6 +312,7 @@ CONFIG_DECLANCE=y
 # Token Ring devices
 #
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -335,11 +333,13 @@ CONFIG_DECLANCE=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -403,12 +403,8 @@ CONFIG_SERIAL_DZ_CONSOLE=y
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -420,7 +416,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -441,6 +436,10 @@ CONFIG_UNIX98_PTY_COUNT=256
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -513,7 +512,6 @@ CONFIG_FS_POSIX_ACL=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -526,6 +524,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
--- diff/arch/mips/configs/e55_defconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/mips/configs/e55_defconfig	2004-04-21 10:45:33.610593912 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -62,7 +63,6 @@ CONFIG_CASIO_E55=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -122,8 +122,8 @@ CONFIG_CPU_HAS_SYNC=y
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
+CONFIG_ISA=y
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -153,15 +153,16 @@ CONFIG_TRAD_SIGNALS=y
 #
 # Plug and Play support
 #
+# CONFIG_PNP is not set
 
 #
 # Block devices
 #
 # CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -186,6 +187,7 @@ CONFIG_IDE_TASKFILE_IO=y
 # IDE chipset support/bugfixes
 #
 CONFIG_IDE_GENERIC=y
+# CONFIG_IDE_CHIPSETS is not set
 # CONFIG_BLK_DEV_IDEDMA is not set
 # CONFIG_IDEDMA_AUTO is not set
 # CONFIG_BLK_DEV_HD is not set
@@ -196,6 +198,11 @@ CONFIG_IDE_GENERIC=y
 # CONFIG_SCSI is not set
 
 #
+# Old CD-ROM drivers (not SCSI, not IDE)
+#
+# CONFIG_CD_NO_IDESCSI is not set
+
+#
 # Multi-device support (RAID and LVM)
 #
 # CONFIG_MD is not set
@@ -205,7 +212,7 @@ CONFIG_IDE_GENERIC=y
 #
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -214,10 +221,6 @@ CONFIG_IDE_GENERIC=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -238,7 +241,6 @@ CONFIG_IP_MULTICAST=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -253,7 +255,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -278,6 +279,11 @@ CONFIG_IPV6_SCTP__=y
 #
 # CONFIG_NET_PKTGEN is not set
 CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
 # CONFIG_DUMMY is not set
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
@@ -289,6 +295,16 @@ CONFIG_NETDEVICES=y
 #
 CONFIG_NET_ETHERNET=y
 # CONFIG_MII is not set
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_LANCE is not set
+# CONFIG_NET_VENDOR_SMC is not set
+# CONFIG_NET_VENDOR_RACAL is not set
+# CONFIG_AT1700 is not set
+# CONFIG_DEPCA is not set
+# CONFIG_HP100 is not set
+# CONFIG_NET_ISA is not set
+# CONFIG_NET_PCI is not set
+# CONFIG_NET_POCKET is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -308,7 +324,9 @@ CONFIG_NET_ETHERNET=y
 #
 # Token Ring devices
 #
+# CONFIG_TR is not set
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -329,11 +347,13 @@ CONFIG_NET_ETHERNET=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -398,12 +418,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -421,7 +437,13 @@ CONFIG_WATCHDOG=y
 # Watchdog Device Drivers
 #
 # CONFIG_SOFT_WATCHDOG is not set
-# CONFIG_NVRAM is not set
+
+#
+# ISA-based Watchdog Cards
+#
+# CONFIG_PCWATCHDOG is not set
+# CONFIG_MIXCOMWD is not set
+# CONFIG_WDT is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -442,6 +464,10 @@ CONFIG_WATCHDOG=y
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -510,7 +536,6 @@ CONFIG_AUTOFS4_FS=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -523,6 +548,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -546,7 +572,7 @@ CONFIG_NFSD=y
 CONFIG_LOCKD=y
 CONFIG_EXPORTFS=y
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
--- diff/arch/mips/configs/eagle_defconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/mips/configs/eagle_defconfig	2004-04-21 10:45:33.611593760 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+CONFIG_HOTPLUG=y
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -62,7 +63,6 @@ CONFIG_NEC_EAGLE=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -127,12 +127,12 @@ CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
 CONFIG_MMU=y
-CONFIG_HOTPLUG=y
 
 #
 # PCMCIA/CardBus support
 #
 CONFIG_PCMCIA=y
+# CONFIG_PCMCIA_DEBUG is not set
 # CONFIG_YENTA is not set
 # CONFIG_I82092 is not set
 # CONFIG_TCIC is not set
@@ -243,8 +243,8 @@ CONFIG_MTD_PHYSMAP_BUSWIDTH=4
 # CONFIG_BLK_DEV_UMEM is not set
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_CARMEL is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -288,9 +288,10 @@ CONFIG_IDE_GENERIC=y
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -300,10 +301,6 @@ CONFIG_IDE_GENERIC=y
 # CONFIG_I2O is not set
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -327,7 +324,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -342,7 +338,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -428,6 +423,7 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_TR is not set
 # CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -461,11 +457,13 @@ CONFIG_PCMCIA_PCNET=m
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -532,12 +530,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -561,7 +555,6 @@ CONFIG_WATCHDOG=y
 #
 # CONFIG_PCIPCWATCHDOG is not set
 # CONFIG_WDTPCI is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -587,6 +580,10 @@ CONFIG_WATCHDOG=y
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -656,7 +653,6 @@ CONFIG_AUTOFS4_FS=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -669,6 +665,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -698,7 +695,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_EXPORTFS=y
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
@@ -747,7 +744,9 @@ CONFIG_CRYPTO_TWOFISH=y
 CONFIG_CRYPTO_AES=y
 # CONFIG_CRYPTO_CAST5 is not set
 # CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_ARC4 is not set
 CONFIG_CRYPTO_DEFLATE=y
+CONFIG_CRYPTO_MICHAEL_MIC=y
 # CONFIG_CRYPTO_TEST is not set
 
 #
--- diff/arch/mips/configs/ev64120_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/ev64120_defconfig	2004-04-21 10:45:33.612593608 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -56,7 +57,6 @@ CONFIG_MIPS_EV64120=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -125,7 +125,6 @@ CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -167,8 +166,8 @@ CONFIG_TRAD_SIGNALS=y
 # CONFIG_BLK_DEV_UMEM is not set
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_CARMEL is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -189,9 +188,10 @@ CONFIG_TRAD_SIGNALS=y
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -201,10 +201,6 @@ CONFIG_TRAD_SIGNALS=y
 # CONFIG_I2O is not set
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -226,7 +222,6 @@ CONFIG_IP_PNP=y
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -241,7 +236,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -334,6 +328,7 @@ CONFIG_PPP_ASYNC=y
 # CONFIG_TR is not set
 # CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -354,11 +349,13 @@ CONFIG_PPP_ASYNC=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -424,12 +421,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -441,7 +434,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -462,6 +454,10 @@ CONFIG_UNIX98_PTY_COUNT=256
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -531,7 +527,6 @@ CONFIG_EXT2_FS=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -544,6 +539,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -566,7 +562,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 # CONFIG_EXPORTFS is not set
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
--- diff/arch/mips/configs/ev96100_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/ev96100_defconfig	2004-04-21 10:45:33.612593608 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -55,7 +56,6 @@ CONFIG_MODVERSIONS=y
 CONFIG_MIPS_EV96100=y
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -85,7 +85,6 @@ CONFIG_SWAP_IO_SPACE=y
 CONFIG_MIPS_GT96100=y
 CONFIG_MIPS_L1_CACHE_SHIFT=5
 # CONFIG_FB is not set
-CONFIG_BOARD_SCACHE=y
 
 #
 # CPU selection
@@ -110,6 +109,8 @@ CONFIG_CPU_RM7000=y
 CONFIG_PAGE_SIZE_4KB=y
 # CONFIG_PAGE_SIZE_16KB is not set
 # CONFIG_PAGE_SIZE_64KB is not set
+CONFIG_BOARD_SCACHE=y
+CONFIG_RM7000_CPU_SCACHE=y
 CONFIG_CPU_HAS_PREFETCH=y
 # CONFIG_64BIT_PHYS_ADDR is not set
 # CONFIG_CPU_ADVANCED is not set
@@ -124,7 +125,6 @@ CONFIG_CPU_HAS_SYNC=y
 #
 # CONFIG_PCI is not set
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -163,7 +163,6 @@ CONFIG_TRAD_SIGNALS=y
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -186,7 +185,7 @@ CONFIG_TRAD_SIGNALS=y
 #
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -195,10 +194,6 @@ CONFIG_TRAD_SIGNALS=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -220,7 +215,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -235,7 +229,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -292,6 +285,7 @@ CONFIG_MIPS_GT96100ETH=y
 # Token Ring devices
 #
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -312,11 +306,13 @@ CONFIG_MIPS_GT96100ETH=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -381,12 +377,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -398,7 +390,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -419,6 +410,10 @@ CONFIG_UNIX98_PTY_COUNT=256
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -487,7 +482,6 @@ CONFIG_EXT2_FS=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -500,6 +494,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -522,7 +517,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 # CONFIG_EXPORTFS is not set
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
--- diff/arch/mips/configs/ip22_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/ip22_defconfig	2004-04-21 10:45:33.618592696 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
 CONFIG_EMBEDDED=y
@@ -56,7 +57,6 @@ CONFIG_KMOD=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -89,7 +89,6 @@ CONFIG_ARC32=y
 # CONFIG_FB is not set
 CONFIG_ARC_CONSOLE=y
 CONFIG_ARC_PROMLIB=y
-CONFIG_BOARD_SCACHE=y
 
 #
 # CPU selection
@@ -114,7 +113,8 @@ CONFIG_CPU_R5000=y
 CONFIG_PAGE_SIZE_4KB=y
 # CONFIG_PAGE_SIZE_16KB is not set
 # CONFIG_PAGE_SIZE_64KB is not set
-CONFIG_R5000_CPU_SCACHE=y
+CONFIG_BOARD_SCACHE=y
+CONFIG_IP22_CPU_SCACHE=y
 # CONFIG_64BIT_PHYS_ADDR is not set
 # CONFIG_CPU_ADVANCED is not set
 CONFIG_CPU_HAS_LLSC=y
@@ -126,9 +126,8 @@ CONFIG_CPU_HAS_SYNC=y
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
-# CONFIG_ISA is not set
+# CONFIG_EISA is not set
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -167,7 +166,6 @@ CONFIG_BINFMT_IRIX=y
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -200,6 +198,12 @@ CONFIG_SCSI_CONSTANTS=y
 # CONFIG_SCSI_LOGGING is not set
 
 #
+# SCSI Transport Attributes
+#
+CONFIG_SCSI_SPI_ATTRS=m
+# CONFIG_SCSI_FC_ATTRS is not set
+
+#
 # SCSI low-level drivers
 #
 CONFIG_SGIWD93_SCSI=y
@@ -216,10 +220,9 @@ CONFIG_SGIWD93_SCSI=y
 #
 # Fusion MPT device support
 #
-# CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -228,10 +231,6 @@ CONFIG_SGIWD93_SCSI=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -255,7 +254,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-CONFIG_INET_ECN=y
 # CONFIG_SYN_COOKIES is not set
 CONFIG_INET_AH=m
 CONFIG_INET_ESP=m
@@ -390,7 +388,6 @@ CONFIG_XFRM_USER=m
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=m
 CONFIG_IP_SCTP=m
 # CONFIG_SCTP_DBG_MSG is not set
 # CONFIG_SCTP_DBG_OBJCNT is not set
@@ -425,6 +422,7 @@ CONFIG_NET_SCH_TEQL=m
 CONFIG_NET_SCH_TBF=m
 CONFIG_NET_SCH_GRED=m
 CONFIG_NET_SCH_DSMARK=m
+CONFIG_NET_SCH_DELAY=m
 CONFIG_NET_SCH_INGRESS=m
 CONFIG_NET_QOS=y
 CONFIG_NET_ESTIMATOR=y
@@ -475,6 +473,7 @@ CONFIG_SGISEEQ=y
 # Token Ring devices
 #
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -495,11 +494,13 @@ CONFIG_SGISEEQ=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -539,6 +540,7 @@ CONFIG_SERIO_SERPORT=y
 CONFIG_INPUT_KEYBOARD=y
 CONFIG_KEYBOARD_ATKBD=y
 # CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
 # CONFIG_KEYBOARD_XTKBD is not set
 # CONFIG_KEYBOARD_NEWTON is not set
 # CONFIG_INPUT_MOUSE is not set
@@ -565,12 +567,8 @@ CONFIG_HW_CONSOLE=y
 CONFIG_SERIAL_IP22_ZILOG=m
 CONFIG_SERIAL_CORE=m
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -589,7 +587,6 @@ CONFIG_WATCHDOG=y
 #
 # CONFIG_SOFT_WATCHDOG is not set
 CONFIG_INDYDOG=m
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 CONFIG_SGI_DS1286=y
@@ -612,6 +609,10 @@ CONFIG_MAX_RAW_DEVS=256
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -709,7 +710,6 @@ CONFIG_VFAT_FS=m
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -722,6 +722,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 CONFIG_EFS_FS=m
@@ -748,7 +749,8 @@ CONFIG_LOCKD=m
 CONFIG_LOCKD_V4=y
 CONFIG_EXPORTFS=m
 CONFIG_SUNRPC=m
-# CONFIG_SUNRPC_GSS is not set
+CONFIG_SUNRPC_GSS=m
+CONFIG_RPCSEC_GSS_KRB5=m
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
@@ -850,7 +852,9 @@ CONFIG_CRYPTO_SERPENT=y
 CONFIG_CRYPTO_AES=y
 CONFIG_CRYPTO_CAST5=m
 CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_ARC4=m
 CONFIG_CRYPTO_DEFLATE=y
+CONFIG_CRYPTO_MICHAEL_MIC=m
 # CONFIG_CRYPTO_TEST is not set
 
 #
--- diff/arch/mips/configs/ip27_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/ip27_defconfig	2004-04-21 10:45:33.619592544 +0100
@@ -11,7 +11,6 @@ CONFIG_64BIT=y
 CONFIG_EXPERIMENTAL=y
 CONFIG_CLEAN_COMPILE=y
 CONFIG_STANDALONE=y
-CONFIG_BROKEN_ON_SMP=y
 
 #
 # General setup
@@ -20,7 +19,8 @@ CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
-CONFIG_LOG_BUF_SHIFT=14
+CONFIG_LOG_BUF_SHIFT=15
+# CONFIG_HOTPLUG is not set
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
 CONFIG_EMBEDDED=y
@@ -35,7 +35,13 @@ CONFIG_IOSCHED_DEADLINE=y
 #
 # Loadable module support
 #
-# CONFIG_MODULES is not set
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+CONFIG_OBSOLETE_MODPARM=y
+# CONFIG_MODVERSIONS is not set
+CONFIG_KMOD=y
+CONFIG_STOP_MACHINE=y
 
 #
 # Machine selection
@@ -48,7 +54,6 @@ CONFIG_IOSCHED_DEADLINE=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -110,7 +115,8 @@ CONFIG_PAGE_SIZE_4KB=y
 CONFIG_CPU_HAS_LLSC=y
 CONFIG_CPU_HAS_LLDSCD=y
 CONFIG_CPU_HAS_SYNC=y
-# CONFIG_SMP is not set
+CONFIG_SMP=y
+CONFIG_NR_CPUS=64
 # CONFIG_PREEMPT is not set
 # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
 # CONFIG_MIPS_INSANE_LARGE is not set
@@ -122,7 +128,6 @@ CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -167,8 +172,8 @@ CONFIG_BINFMT_ELF32=y
 # CONFIG_BLK_DEV_UMEM is not set
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_CARMEL is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 
 #
 # ATA/ATAPI/MFM/RLL support
@@ -199,6 +204,12 @@ CONFIG_SCSI_CONSTANTS=y
 CONFIG_SCSI_LOGGING=y
 
 #
+# SCSI Transport Attributes
+#
+CONFIG_SCSI_SPI_ATTRS=m
+# CONFIG_SCSI_FC_ATTRS is not set
+
+#
 # SCSI low-level drivers
 #
 # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
@@ -245,7 +256,7 @@ CONFIG_SCSI_QLA2XXX=y
 # CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -254,10 +265,6 @@ CONFIG_SCSI_QLA2XXX=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -281,7 +288,6 @@ CONFIG_IP_PNP=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -296,7 +302,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -314,7 +319,30 @@ CONFIG_IPV6_SCTP__=y
 #
 # QoS and/or fair queueing
 #
-# CONFIG_NET_SCHED is not set
+CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_CBQ=m
+CONFIG_NET_SCH_HTB=m
+CONFIG_NET_SCH_HFSC=m
+CONFIG_NET_SCH_CSZ=m
+CONFIG_NET_SCH_PRIO=m
+CONFIG_NET_SCH_RED=m
+CONFIG_NET_SCH_SFQ=m
+CONFIG_NET_SCH_TEQL=m
+CONFIG_NET_SCH_TBF=m
+CONFIG_NET_SCH_GRED=m
+CONFIG_NET_SCH_DSMARK=m
+CONFIG_NET_SCH_DELAY=m
+CONFIG_NET_QOS=y
+CONFIG_NET_ESTIMATOR=y
+CONFIG_NET_CLS=y
+CONFIG_NET_CLS_TCINDEX=m
+CONFIG_NET_CLS_ROUTE4=m
+CONFIG_NET_CLS_ROUTE=y
+CONFIG_NET_CLS_FW=m
+CONFIG_NET_CLS_U32=m
+CONFIG_NET_CLS_RSVP=m
+CONFIG_NET_CLS_RSVP6=m
+CONFIG_NET_CLS_POLICE=y
 
 #
 # Network testing
@@ -336,8 +364,10 @@ CONFIG_NETDEVICES=y
 # Ethernet (10 or 100Mbit)
 #
 CONFIG_NET_ETHERNET=y
-# CONFIG_MII is not set
+CONFIG_MII=y
 CONFIG_SGI_IOC3_ETH=y
+CONFIG_SGI_IOC3_ETH_HW_RX_CSUM=y
+CONFIG_SGI_IOC3_ETH_HW_TX_CSUM=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
 # CONFIG_NET_VENDOR_3COM is not set
@@ -383,6 +413,7 @@ CONFIG_SGI_IOC3_ETH=y
 # CONFIG_TR is not set
 # CONFIG_NET_FC is not set
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -403,11 +434,13 @@ CONFIG_SGI_IOC3_ETH=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -463,12 +496,8 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -480,7 +509,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 CONFIG_SGI_IP27_RTC=y
@@ -491,7 +519,6 @@ CONFIG_SGI_IP27_RTC=y
 #
 # Ftape, the floppy tape device driver
 #
-# CONFIG_FTAPE is not set
 # CONFIG_AGP is not set
 # CONFIG_DRM is not set
 # CONFIG_RAW_DRIVER is not set
@@ -502,6 +529,10 @@ CONFIG_SGI_IP27_RTC=y
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -572,7 +603,6 @@ CONFIG_AUTOFS_FS=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -585,6 +615,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -608,7 +639,8 @@ CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
 # CONFIG_EXPORTFS is not set
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+CONFIG_SUNRPC_GSS=y
+CONFIG_RPCSEC_GSS_KRB5=y
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
@@ -657,9 +689,29 @@ CONFIG_CMDLINE=""
 #
 # Cryptographic options
 #
-# CONFIG_CRYPTO is not set
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_MD4=m
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_SHA1=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_DES=y
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_TWOFISH=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_AES=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_ARC4=m
+CONFIG_CRYPTO_DEFLATE=m
+CONFIG_CRYPTO_MICHAEL_MIC=m
+# CONFIG_CRYPTO_TEST is not set
 
 #
 # Library routines
 #
 CONFIG_CRC32=y
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
--- diff/arch/mips/configs/ip32_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/ip32_defconfig	2004-04-21 10:45:33.620592392 +0100
@@ -21,6 +21,7 @@ CONFIG_SYSVIPC=y
 CONFIG_BSD_PROCESS_ACCT=y
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -47,7 +48,6 @@ CONFIG_IOSCHED_DEADLINE=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -77,7 +77,6 @@ CONFIG_ARC32=y
 # CONFIG_FB is not set
 CONFIG_ARC_MEMORY=y
 CONFIG_ARC_PROMLIB=y
-CONFIG_BOARD_SCACHE=y
 
 #
 # CPU selection
@@ -102,7 +101,9 @@ CONFIG_CPU_R5000=y
 CONFIG_PAGE_SIZE_4KB=y
 # CONFIG_PAGE_SIZE_16KB is not set
 # CONFIG_PAGE_SIZE_64KB is not set
+CONFIG_BOARD_SCACHE=y
 CONFIG_R5000_CPU_SCACHE=y
+CONFIG_RM7000_CPU_SCACHE=y
 CONFIG_CPU_HAS_LLSC=y
 CONFIG_CPU_HAS_LLDSCD=y
 CONFIG_CPU_HAS_SYNC=y
@@ -116,7 +117,6 @@ CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -162,8 +162,8 @@ CONFIG_BINFMT_ELF32=y
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_CARMEL is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 
 #
 # ATA/ATAPI/MFM/RLL support
@@ -195,6 +195,12 @@ CONFIG_SCSI_CONSTANTS=y
 CONFIG_SCSI_LOGGING=y
 
 #
+# SCSI Transport Attributes
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+
+#
 # SCSI low-level drivers
 #
 # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
@@ -247,7 +253,7 @@ CONFIG_SCSI_QLA2XXX=y
 # CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -256,10 +262,6 @@ CONFIG_SCSI_QLA2XXX=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -282,7 +284,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -297,7 +298,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -384,6 +384,7 @@ CONFIG_SGI_O2MACE_ETH=y
 # CONFIG_TR is not set
 # CONFIG_NET_FC is not set
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -404,11 +405,13 @@ CONFIG_SGI_O2MACE_ETH=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -475,12 +478,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -492,7 +491,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -513,6 +511,10 @@ CONFIG_UNIX98_PTY_COUNT=256
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -582,7 +584,6 @@ CONFIG_EXT2_FS=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 CONFIG_TMPFS=y
@@ -595,6 +596,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -618,7 +620,7 @@ CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
 # CONFIG_EXPORTFS is not set
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
--- diff/arch/mips/configs/it8172_defconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/mips/configs/it8172_defconfig	2004-04-21 10:45:33.620592392 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 CONFIG_BSD_PROCESS_ACCT=y
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -55,7 +56,6 @@ CONFIG_KMOD=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 CONFIG_MIPS_ITE8172=y
 # CONFIG_IT8172_REVC is not set
 # CONFIG_MIPS_ATLAS is not set
@@ -121,7 +121,6 @@ CONFIG_CPU_HAS_SYNC=y
 #
 # CONFIG_PCI is not set
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -216,7 +215,6 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -260,7 +258,7 @@ CONFIG_IDE_GENERIC=y
 #
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -269,10 +267,6 @@ CONFIG_IDE_GENERIC=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -295,7 +289,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -310,7 +303,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -366,6 +358,7 @@ CONFIG_NET_ETHERNET=y
 # Token Ring devices
 #
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -386,11 +379,13 @@ CONFIG_NET_ETHERNET=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -459,12 +454,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -476,7 +467,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -497,6 +487,10 @@ CONFIG_UNIX98_PTY_COUNT=256
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -587,7 +581,6 @@ CONFIG_EXT2_FS=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -600,6 +593,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -624,7 +618,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 # CONFIG_EXPORTFS is not set
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
--- diff/arch/mips/configs/ivr_defconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/mips/configs/ivr_defconfig	2004-04-21 10:45:33.621592240 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 CONFIG_BSD_PROCESS_ACCT=y
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -55,7 +56,6 @@ CONFIG_KMOD=y
 # CONFIG_MIPS_EV96100 is not set
 CONFIG_MIPS_IVR=y
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -121,7 +121,6 @@ CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -162,8 +161,8 @@ CONFIG_TRAD_SIGNALS=y
 # CONFIG_BLK_DEV_UMEM is not set
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_CARMEL is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -206,9 +205,10 @@ CONFIG_IDE_GENERIC=y
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -218,10 +218,6 @@ CONFIG_IDE_GENERIC=y
 # CONFIG_I2O is not set
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -244,7 +240,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -259,7 +254,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -345,6 +339,7 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_TR is not set
 # CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -365,11 +360,13 @@ CONFIG_NET_ETHERNET=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -437,12 +434,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -454,7 +447,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 CONFIG_RTC=y
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
@@ -474,6 +466,10 @@ CONFIG_RTC=y
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -543,7 +539,6 @@ CONFIG_EXT2_FS=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -556,6 +551,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -578,7 +574,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 # CONFIG_EXPORTFS is not set
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
--- diff/arch/mips/configs/jaguar-atx_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/jaguar-atx_defconfig	2004-04-21 10:45:33.622592088 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
 CONFIG_EMBEDDED=y
@@ -47,7 +48,6 @@ CONFIG_IOSCHED_DEADLINE=y
 # CONFIG_MACH_DECSTATION is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -55,6 +55,7 @@ CONFIG_IOSCHED_DEADLINE=y
 # CONFIG_MOMENCO_OCELOT_G is not set
 # CONFIG_MOMENCO_OCELOT_C is not set
 CONFIG_MOMENCO_JAGUAR_ATX=y
+CONFIG_JAGUAR_DMALOW=y
 # CONFIG_PMC_YOSEMITE is not set
 # CONFIG_DDB5476 is not set
 # CONFIG_DDB5477 is not set
@@ -66,14 +67,15 @@ CONFIG_MOMENCO_JAGUAR_ATX=y
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
 CONFIG_HAVE_DEC_LOCK=y
 CONFIG_DMA_NONCOHERENT=y
+CONFIG_LIMITED_DMA=y
 # CONFIG_CPU_LITTLE_ENDIAN is not set
+CONFIG_IRQ_CPU=y
 CONFIG_IRQ_CPU_RM7K=y
 CONFIG_MIPS_MV64340=y
 CONFIG_SWAP_IO_SPACE=y
 CONFIG_BOOT_ELF32=y
 CONFIG_MIPS_L1_CACHE_SHIFT=5
 # CONFIG_FB is not set
-CONFIG_BOARD_SCACHE=y
 
 #
 # CPU selection
@@ -98,12 +100,15 @@ CONFIG_CPU_RM9000=y
 CONFIG_PAGE_SIZE_4KB=y
 # CONFIG_PAGE_SIZE_16KB is not set
 # CONFIG_PAGE_SIZE_64KB is not set
+CONFIG_BOARD_SCACHE=y
+CONFIG_RM7000_CPU_SCACHE=y
 CONFIG_CPU_HAS_PREFETCH=y
 # CONFIG_64BIT_PHYS_ADDR is not set
 # CONFIG_CPU_ADVANCED is not set
 CONFIG_CPU_HAS_LLSC=y
 CONFIG_CPU_HAS_LLDSCD=y
 CONFIG_CPU_HAS_SYNC=y
+CONFIG_HIGHMEM=y
 # CONFIG_SMP is not set
 # CONFIG_PREEMPT is not set
 # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
@@ -115,7 +120,6 @@ CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -156,8 +160,8 @@ CONFIG_TRAD_SIGNALS=y
 # CONFIG_BLK_DEV_DAC960 is not set
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_CARMEL is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -178,15 +182,17 @@ CONFIG_TRAD_SIGNALS=y
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
-# I2O device support
+# IEEE 1394 (FireWire) support
 #
-# CONFIG_I2O is not set
+# CONFIG_IEEE1394 is not set
 
 #
-# Macintosh device drivers
+# I2O device support
 #
+# CONFIG_I2O is not set
 
 #
 # Networking support
@@ -209,7 +215,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_IP_PNP_RARP is not set
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -287,8 +292,8 @@ CONFIG_EEPRO100=y
 # CONFIG_TIGON3 is not set
 CONFIG_MV64340_ETH=y
 CONFIG_MV64340_ETH_0=y
-# CONFIG_MV64340_ETH_1 is not set
-# CONFIG_MV64340_ETH_2 is not set
+CONFIG_MV64340_ETH_1=y
+CONFIG_MV64340_ETH_2=y
 
 #
 # Ethernet (10000 Mbit)
@@ -327,11 +332,13 @@ CONFIG_MV64340_ETH_0=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -352,11 +359,8 @@ CONFIG_MV64340_ETH_0=y
 #
 # CONFIG_GAMEPORT is not set
 CONFIG_SOUND_GAMEPORT=y
-CONFIG_SERIO=y
-CONFIG_SERIO_I8042=y
-CONFIG_SERIO_SERPORT=y
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_PCIPS2 is not set
+# CONFIG_SERIO is not set
+# CONFIG_SERIO_I8042 is not set
 
 #
 # Input Device Drivers
@@ -371,18 +375,19 @@ CONFIG_SERIO_SERPORT=y
 #
 # Serial drivers
 #
-# CONFIG_SERIAL_8250 is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
 
 #
 # Non-8250 serial port support
 #
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -394,7 +399,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -415,6 +419,10 @@ CONFIG_UNIX98_PTY_COUNT=256
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -475,7 +483,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 #
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
-CONFIG_DEVPTS_FS=y
 # CONFIG_DEVPTS_FS_XATTR is not set
 # CONFIG_TMPFS is not set
 # CONFIG_HUGETLB_PAGE is not set
@@ -484,6 +491,7 @@ CONFIG_RAMFS=y
 #
 # Miscellaneous filesystems
 #
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_CRAMFS is not set
 # CONFIG_VXFS_FS is not set
 # CONFIG_HPFS_FS is not set
--- diff/arch/mips/configs/jmr3927_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/jmr3927_defconfig	2004-04-21 10:45:33.622592088 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -50,7 +51,6 @@ CONFIG_TOSHIBA_JMR3927=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -116,7 +116,6 @@ CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -158,8 +157,8 @@ CONFIG_TRAD_SIGNALS=y
 # CONFIG_BLK_DEV_UMEM is not set
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_CARMEL is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -180,9 +179,10 @@ CONFIG_TRAD_SIGNALS=y
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -192,10 +192,6 @@ CONFIG_TRAD_SIGNALS=y
 # CONFIG_I2O is not set
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -218,7 +214,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -233,7 +228,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -319,6 +313,7 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_TR is not set
 # CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -339,11 +334,13 @@ CONFIG_NET_ETHERNET=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -423,11 +420,8 @@ CONFIG_TXX927_SERIAL_CONSOLE=y
 # Non-8250 serial port support
 #
 # CONFIG_UNIX98_PTYS is not set
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -439,7 +433,6 @@ CONFIG_TXX927_SERIAL_CONSOLE=y
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -460,6 +453,10 @@ CONFIG_TXX927_SERIAL_CONSOLE=y
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -472,6 +469,7 @@ CONFIG_TXX927_SERIAL_CONSOLE=y
 #
 # Graphics support
 #
+# CONFIG_FB_PM2 is not set
 # CONFIG_FB_CYBER2000 is not set
 # CONFIG_FB_IMSTT is not set
 # CONFIG_FB_RIVA is not set
@@ -560,6 +558,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -582,7 +581,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 # CONFIG_EXPORTFS is not set
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
--- diff/arch/mips/configs/lasat200_defconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/mips/configs/lasat200_defconfig	2004-04-21 10:45:33.623591936 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -59,7 +60,6 @@ CONFIG_PICVUE=y
 CONFIG_PICVUE_PROC=y
 CONFIG_DS1603=y
 CONFIG_LASAT_SYSCTL=y
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -87,7 +87,6 @@ CONFIG_CPU_LITTLE_ENDIAN=y
 CONFIG_MIPS_GT64120=y
 CONFIG_MIPS_L1_CACHE_SHIFT=5
 # CONFIG_FB is not set
-CONFIG_BOARD_SCACHE=y
 
 #
 # CPU selection
@@ -112,6 +111,7 @@ CONFIG_CPU_R5000=y
 CONFIG_PAGE_SIZE_4KB=y
 # CONFIG_PAGE_SIZE_16KB is not set
 # CONFIG_PAGE_SIZE_64KB is not set
+CONFIG_BOARD_SCACHE=y
 CONFIG_R5000_CPU_SCACHE=y
 # CONFIG_64BIT_PHYS_ADDR is not set
 # CONFIG_CPU_ADVANCED is not set
@@ -128,7 +128,6 @@ CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
 # CONFIG_PCI_NAMES is not set
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -225,8 +224,8 @@ CONFIG_MTD_LASAT=y
 # CONFIG_BLK_DEV_UMEM is not set
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_CARMEL is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -299,9 +298,10 @@ CONFIG_IDEDMA_AUTO=y
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -311,10 +311,6 @@ CONFIG_IDEDMA_AUTO=y
 # CONFIG_I2O is not set
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -333,7 +329,6 @@ CONFIG_INET=y
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -348,7 +343,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -433,6 +427,7 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_TR is not set
 # CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -453,11 +448,13 @@ CONFIG_NET_ETHERNET=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -523,12 +520,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -540,7 +533,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -561,6 +553,10 @@ CONFIG_UNIX98_PTY_COUNT=256
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -635,7 +631,6 @@ CONFIG_FS_MBCACHE=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -648,6 +643,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -672,7 +668,7 @@ CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
 # CONFIG_EXPORTFS is not set
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
--- diff/arch/mips/configs/malta_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/malta_defconfig	2004-04-21 10:45:33.624591784 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -55,7 +56,6 @@ CONFIG_KMOD=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 CONFIG_MIPS_MALTA=y
@@ -130,7 +130,6 @@ CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -171,6 +170,7 @@ CONFIG_TRAD_SIGNALS=y
 # CONFIG_BLK_DEV_UMEM is not set
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_CARMEL is not set
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_SIZE=4096
 # CONFIG_BLK_DEV_INITRD is not set
@@ -194,9 +194,10 @@ CONFIG_BLK_DEV_RAM_SIZE=4096
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -206,10 +207,6 @@ CONFIG_BLK_DEV_RAM_SIZE=4096
 # CONFIG_I2O is not set
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -231,7 +228,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -246,7 +242,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -351,6 +346,7 @@ CONFIG_PCNET32=y
 # CONFIG_TR is not set
 # CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -371,11 +367,13 @@ CONFIG_PCNET32=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -441,12 +439,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -458,7 +452,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 CONFIG_RTC=y
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
@@ -478,6 +471,10 @@ CONFIG_RTC=y
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -547,7 +544,6 @@ CONFIG_AUTOFS_FS=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -560,6 +556,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 CONFIG_EFS_FS=y
@@ -586,7 +583,7 @@ CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
 CONFIG_EXPORTFS=y
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
--- diff/arch/mips/configs/mirage_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/mirage_defconfig	2004-04-21 10:45:33.625591632 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+CONFIG_HOTPLUG=y
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -55,7 +56,6 @@ CONFIG_KMOD=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -117,12 +117,12 @@ CONFIG_CPU_HAS_SYNC=y
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
 CONFIG_MMU=y
-CONFIG_HOTPLUG=y
 
 #
 # PCMCIA/CardBus support
 #
 CONFIG_PCMCIA=m
+# CONFIG_PCMCIA_DEBUG is not set
 # CONFIG_TCIC is not set
 
 #
@@ -167,7 +167,6 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -190,7 +189,7 @@ CONFIG_BLK_DEV_LOOP=y
 #
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -199,10 +198,6 @@ CONFIG_BLK_DEV_LOOP=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -226,7 +221,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -257,7 +251,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -320,6 +313,7 @@ CONFIG_PPPOE=m
 # Token Ring devices
 #
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -353,11 +347,13 @@ CONFIG_PCMCIA_3C589=m
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -417,12 +413,8 @@ CONFIG_HW_CONSOLE=y
 # Non-8250 serial port support
 #
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -434,7 +426,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 CONFIG_RTC=y
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
@@ -459,6 +450,10 @@ CONFIG_RTC=y
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -537,7 +532,6 @@ CONFIG_AUTOFS4_FS=m
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 CONFIG_TMPFS=y
@@ -550,6 +544,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -574,7 +569,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_EXPORTFS=m
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 CONFIG_SMB_FS=m
 # CONFIG_SMB_NLS_DEFAULT is not set
 # CONFIG_CIFS is not set
@@ -662,7 +657,9 @@ CONFIG_CRYPTO_TWOFISH=y
 CONFIG_CRYPTO_AES=y
 # CONFIG_CRYPTO_CAST5 is not set
 # CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_ARC4 is not set
 CONFIG_CRYPTO_DEFLATE=y
+CONFIG_CRYPTO_MICHAEL_MIC=y
 # CONFIG_CRYPTO_TEST is not set
 
 #
--- diff/arch/mips/configs/mpc30x_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/mpc30x_defconfig	2004-04-21 10:45:33.626591480 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -62,7 +63,6 @@ CONFIG_VICTOR_MPC30X=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -125,7 +125,6 @@ CONFIG_CPU_HAS_SYNC=y
 #
 # CONFIG_PCI is not set
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -163,7 +162,6 @@ CONFIG_TRAD_SIGNALS=y
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -186,7 +184,7 @@ CONFIG_TRAD_SIGNALS=y
 #
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -195,10 +193,6 @@ CONFIG_TRAD_SIGNALS=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -222,7 +216,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -237,7 +230,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -293,6 +285,7 @@ CONFIG_NET_ETHERNET=y
 # Token Ring devices
 #
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -313,11 +306,13 @@ CONFIG_NET_ETHERNET=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -382,12 +377,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -399,7 +390,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -420,6 +410,10 @@ CONFIG_UNIX98_PTY_COUNT=256
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -488,7 +482,6 @@ CONFIG_AUTOFS4_FS=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -501,6 +494,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -523,7 +517,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 # CONFIG_EXPORTFS is not set
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
@@ -572,7 +566,9 @@ CONFIG_CRYPTO_TWOFISH=y
 CONFIG_CRYPTO_AES=y
 # CONFIG_CRYPTO_CAST5 is not set
 # CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_ARC4 is not set
 CONFIG_CRYPTO_DEFLATE=y
+CONFIG_CRYPTO_MICHAEL_MIC=y
 # CONFIG_CRYPTO_TEST is not set
 
 #
--- diff/arch/mips/configs/mtx1_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/mtx1_defconfig	2004-04-21 10:45:33.627591328 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+CONFIG_HOTPLUG=y
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -55,7 +56,6 @@ CONFIG_KMOD=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -117,12 +117,12 @@ CONFIG_CPU_HAS_SYNC=y
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
 CONFIG_MMU=y
-CONFIG_HOTPLUG=y
 
 #
 # PCMCIA/CardBus support
 #
 CONFIG_PCMCIA=m
+# CONFIG_PCMCIA_DEBUG is not set
 # CONFIG_TCIC is not set
 
 #
@@ -167,7 +167,6 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -190,7 +189,7 @@ CONFIG_BLK_DEV_LOOP=y
 #
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -199,10 +198,6 @@ CONFIG_BLK_DEV_LOOP=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -226,7 +221,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -257,7 +251,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -320,6 +313,7 @@ CONFIG_PPPOE=m
 # Token Ring devices
 #
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -353,11 +347,13 @@ CONFIG_PCMCIA_3C589=m
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -417,12 +413,8 @@ CONFIG_HW_CONSOLE=y
 # Non-8250 serial port support
 #
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -434,7 +426,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 CONFIG_RTC=y
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
@@ -459,6 +450,10 @@ CONFIG_RTC=y
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -537,7 +532,6 @@ CONFIG_AUTOFS4_FS=m
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 CONFIG_TMPFS=y
@@ -550,6 +544,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -574,7 +569,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_EXPORTFS=m
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 CONFIG_SMB_FS=m
 # CONFIG_SMB_NLS_DEFAULT is not set
 # CONFIG_CIFS is not set
@@ -662,7 +657,9 @@ CONFIG_CRYPTO_TWOFISH=y
 CONFIG_CRYPTO_AES=y
 # CONFIG_CRYPTO_CAST5 is not set
 # CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_ARC4 is not set
 CONFIG_CRYPTO_DEFLATE=y
+CONFIG_CRYPTO_MICHAEL_MIC=y
 # CONFIG_CRYPTO_TEST is not set
 
 #
--- diff/arch/mips/configs/ocelot_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/ocelot_defconfig	2004-04-21 10:45:33.628591176 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -50,7 +51,6 @@ CONFIG_IOSCHED_DEADLINE=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -83,7 +83,6 @@ CONFIG_SWAP_IO_SPACE=y
 CONFIG_SYSCLK_100=y
 CONFIG_MIPS_L1_CACHE_SHIFT=5
 # CONFIG_FB is not set
-CONFIG_BOARD_SCACHE=y
 
 #
 # CPU selection
@@ -108,6 +107,8 @@ CONFIG_CPU_RM7000=y
 CONFIG_PAGE_SIZE_4KB=y
 # CONFIG_PAGE_SIZE_16KB is not set
 # CONFIG_PAGE_SIZE_64KB is not set
+CONFIG_BOARD_SCACHE=y
+CONFIG_RM7000_CPU_SCACHE=y
 CONFIG_CPU_HAS_PREFETCH=y
 # CONFIG_64BIT_PHYS_ADDR is not set
 # CONFIG_CPU_ADVANCED is not set
@@ -122,7 +123,6 @@ CONFIG_CPU_HAS_SYNC=y
 #
 # CONFIG_PCI is not set
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -161,7 +161,6 @@ CONFIG_TRAD_SIGNALS=y
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -184,7 +183,7 @@ CONFIG_TRAD_SIGNALS=y
 #
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -193,10 +192,6 @@ CONFIG_TRAD_SIGNALS=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -218,7 +213,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -233,7 +227,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -289,6 +282,7 @@ CONFIG_NET_ETHERNET=y
 # Token Ring devices
 #
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -309,11 +303,13 @@ CONFIG_NET_ETHERNET=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -378,12 +374,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -395,7 +387,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -416,6 +407,10 @@ CONFIG_UNIX98_PTY_COUNT=256
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -484,7 +479,6 @@ CONFIG_EXT2_FS=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -497,6 +491,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -521,7 +516,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_EXPORTFS=y
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
--- diff/arch/mips/configs/osprey_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/osprey_defconfig	2004-04-21 10:45:33.629591024 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -55,7 +56,6 @@ CONFIG_KMOD=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -117,7 +117,6 @@ CONFIG_CPU_HAS_SYNC=y
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -155,7 +154,6 @@ CONFIG_TRAD_SIGNALS=y
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -178,7 +176,7 @@ CONFIG_TRAD_SIGNALS=y
 #
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -187,10 +185,6 @@ CONFIG_TRAD_SIGNALS=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -213,7 +207,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -228,7 +221,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -284,6 +276,7 @@ CONFIG_NET_ETHERNET=y
 # Token Ring devices
 #
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -304,11 +297,13 @@ CONFIG_NET_ETHERNET=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -373,12 +368,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -390,7 +381,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -411,6 +401,10 @@ CONFIG_UNIX98_PTY_COUNT=256
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -479,7 +473,6 @@ CONFIG_EXT2_FS=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -492,6 +485,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -516,7 +510,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_EXPORTFS=y
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
--- diff/arch/mips/configs/pb1000_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/pb1000_defconfig	2004-04-21 10:45:33.630590872 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+CONFIG_HOTPLUG=y
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -55,7 +56,6 @@ CONFIG_KMOD=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -117,12 +117,12 @@ CONFIG_CPU_HAS_SYNC=y
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
 CONFIG_MMU=y
-CONFIG_HOTPLUG=y
 
 #
 # PCMCIA/CardBus support
 #
 CONFIG_PCMCIA=m
+# CONFIG_PCMCIA_DEBUG is not set
 # CONFIG_TCIC is not set
 
 #
@@ -167,7 +167,6 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -190,7 +189,7 @@ CONFIG_BLK_DEV_LOOP=y
 #
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -199,10 +198,6 @@ CONFIG_BLK_DEV_LOOP=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -226,7 +221,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -257,7 +251,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -320,6 +313,7 @@ CONFIG_PPPOE=m
 # Token Ring devices
 #
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -353,11 +347,13 @@ CONFIG_PCMCIA_3C589=m
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -417,12 +413,8 @@ CONFIG_HW_CONSOLE=y
 # Non-8250 serial port support
 #
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -434,7 +426,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 CONFIG_RTC=y
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
@@ -459,6 +450,10 @@ CONFIG_RTC=y
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -537,7 +532,6 @@ CONFIG_AUTOFS4_FS=m
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 CONFIG_TMPFS=y
@@ -550,6 +544,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -574,7 +569,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_EXPORTFS=m
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 CONFIG_SMB_FS=m
 # CONFIG_SMB_NLS_DEFAULT is not set
 # CONFIG_CIFS is not set
@@ -662,7 +657,9 @@ CONFIG_CRYPTO_TWOFISH=y
 CONFIG_CRYPTO_AES=y
 # CONFIG_CRYPTO_CAST5 is not set
 # CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_ARC4 is not set
 CONFIG_CRYPTO_DEFLATE=y
+CONFIG_CRYPTO_MICHAEL_MIC=y
 # CONFIG_CRYPTO_TEST is not set
 
 #
--- diff/arch/mips/configs/pb1100_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/pb1100_defconfig	2004-04-21 10:45:33.630590872 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+CONFIG_HOTPLUG=y
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -55,7 +56,6 @@ CONFIG_KMOD=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -117,12 +117,12 @@ CONFIG_CPU_HAS_SYNC=y
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
 CONFIG_MMU=y
-CONFIG_HOTPLUG=y
 
 #
 # PCMCIA/CardBus support
 #
 CONFIG_PCMCIA=m
+# CONFIG_PCMCIA_DEBUG is not set
 # CONFIG_TCIC is not set
 
 #
@@ -167,7 +167,6 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -190,7 +189,7 @@ CONFIG_BLK_DEV_LOOP=y
 #
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -199,10 +198,6 @@ CONFIG_BLK_DEV_LOOP=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -226,7 +221,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -257,7 +251,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -320,6 +313,7 @@ CONFIG_PPPOE=m
 # Token Ring devices
 #
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -353,11 +347,13 @@ CONFIG_PCMCIA_3C589=m
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -417,12 +413,8 @@ CONFIG_HW_CONSOLE=y
 # Non-8250 serial port support
 #
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -434,7 +426,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 CONFIG_RTC=y
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
@@ -459,6 +450,10 @@ CONFIG_RTC=y
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -537,7 +532,6 @@ CONFIG_AUTOFS4_FS=m
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 CONFIG_TMPFS=y
@@ -550,6 +544,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -574,7 +569,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_EXPORTFS=m
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 CONFIG_SMB_FS=m
 # CONFIG_SMB_NLS_DEFAULT is not set
 # CONFIG_CIFS is not set
@@ -662,7 +657,9 @@ CONFIG_CRYPTO_TWOFISH=y
 CONFIG_CRYPTO_AES=y
 # CONFIG_CRYPTO_CAST5 is not set
 # CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_ARC4 is not set
 CONFIG_CRYPTO_DEFLATE=y
+CONFIG_CRYPTO_MICHAEL_MIC=y
 # CONFIG_CRYPTO_TEST is not set
 
 #
--- diff/arch/mips/configs/pb1500_defconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/mips/configs/pb1500_defconfig	2004-04-21 10:45:33.631590720 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+CONFIG_HOTPLUG=y
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -55,7 +56,6 @@ CONFIG_KMOD=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -75,12 +75,15 @@ CONFIG_SOC_AU1X00=y
 # CONFIG_SOC_AU1000 is not set
 # CONFIG_SOC_AU1100 is not set
 CONFIG_SOC_AU1500=y
+# CONFIG_SOC_AU1550 is not set
 # CONFIG_MIPS_PB1000 is not set
 # CONFIG_MIPS_PB1100 is not set
 CONFIG_MIPS_PB1500=y
+# CONFIG_MIPS_PB1550 is not set
 # CONFIG_MIPS_DB1000 is not set
 # CONFIG_MIPS_DB1100 is not set
 # CONFIG_MIPS_DB1500 is not set
+# CONFIG_MIPS_DB1550 is not set
 # CONFIG_MIPS_BOSPORUS is not set
 # CONFIG_MIPS_MIRAGE is not set
 # CONFIG_MIPS_XXS1500 is not set
@@ -135,12 +138,12 @@ CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
 CONFIG_MMU=y
-CONFIG_HOTPLUG=y
 
 #
 # PCMCIA/CardBus support
 #
 CONFIG_PCMCIA=m
+# CONFIG_PCMCIA_DEBUG is not set
 # CONFIG_YENTA is not set
 # CONFIG_I82092 is not set
 # CONFIG_TCIC is not set
@@ -192,8 +195,8 @@ CONFIG_TRAD_SIGNALS=y
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_CARMEL is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -266,9 +269,10 @@ CONFIG_BLK_DEV_IDEDMA=y
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -278,10 +282,6 @@ CONFIG_BLK_DEV_IDEDMA=y
 # CONFIG_I2O is not set
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -305,7 +305,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -336,7 +335,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -430,6 +428,7 @@ CONFIG_PPPOE=m
 # CONFIG_TR is not set
 # CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -463,11 +462,13 @@ CONFIG_PCMCIA_3C589=m
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -532,12 +533,8 @@ CONFIG_SERIAL_AU1X00_CONSOLE=y
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -549,7 +546,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -575,6 +571,10 @@ CONFIG_UNIX98_PTY_COUNT=256
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -647,7 +647,6 @@ CONFIG_AUTOFS4_FS=m
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 CONFIG_TMPFS=y
@@ -660,6 +659,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -684,7 +684,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_EXPORTFS=m
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 CONFIG_SMB_FS=m
 # CONFIG_SMB_NLS_DEFAULT is not set
 # CONFIG_CIFS is not set
@@ -772,7 +772,9 @@ CONFIG_CRYPTO_TWOFISH=y
 CONFIG_CRYPTO_AES=y
 # CONFIG_CRYPTO_CAST5 is not set
 # CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_ARC4 is not set
 CONFIG_CRYPTO_DEFLATE=y
+CONFIG_CRYPTO_MICHAEL_MIC=y
 # CONFIG_CRYPTO_TEST is not set
 
 #
--- diff/arch/mips/configs/rm200_defconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/mips/configs/rm200_defconfig	2004-04-21 10:45:33.633590416 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 CONFIG_BSD_PROCESS_ACCT=y
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
 CONFIG_EMBEDDED=y
@@ -56,7 +57,6 @@ CONFIG_KMOD=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -87,6 +87,7 @@ CONFIG_BOOT_ELF32=y
 CONFIG_MIPS_L1_CACHE_SHIFT=5
 CONFIG_ARC32=y
 # CONFIG_FB is not set
+CONFIG_HAVE_STD_PC_SERIAL_PORT=y
 CONFIG_ARC_CONSOLE=y
 CONFIG_ARC_MEMORY=y
 CONFIG_ARC_PROMLIB=y
@@ -131,7 +132,6 @@ CONFIG_PCI_LEGACY_PROC=y
 CONFIG_ISA=y
 # CONFIG_EISA is not set
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -213,9 +213,9 @@ CONFIG_PARIDE_ON26=m
 CONFIG_BLK_DEV_LOOP=m
 CONFIG_BLK_DEV_CRYPTOLOOP=m
 CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_CARMEL is not set
 CONFIG_BLK_DEV_RAM=m
 CONFIG_BLK_DEV_RAM_SIZE=4096
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -248,6 +248,12 @@ CONFIG_SCSI_CONSTANTS=y
 # CONFIG_SCSI_LOGGING is not set
 
 #
+# SCSI Transport Attributes
+#
+CONFIG_SCSI_SPI_ATTRS=m
+# CONFIG_SCSI_FC_ATTRS is not set
+
+#
 # SCSI low-level drivers
 #
 # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
@@ -323,6 +329,7 @@ CONFIG_MD_RAID5=m
 # CONFIG_MD_RAID6 is not set
 CONFIG_MD_MULTIPATH=m
 CONFIG_BLK_DEV_DM=m
+# CONFIG_DM_CRYPT is not set
 
 #
 # Fusion MPT device support
@@ -330,7 +337,7 @@ CONFIG_BLK_DEV_DM=m
 # CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -340,10 +347,6 @@ CONFIG_BLK_DEV_DM=m
 # CONFIG_I2O is not set
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -367,7 +370,6 @@ CONFIG_IP_MROUTE=y
 CONFIG_IP_PIMSM_V1=y
 CONFIG_IP_PIMSM_V2=y
 # CONFIG_ARPD is not set
-CONFIG_INET_ECN=y
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -505,7 +507,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=m
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -535,6 +536,7 @@ CONFIG_NET_SCH_TEQL=m
 CONFIG_NET_SCH_TBF=m
 CONFIG_NET_SCH_GRED=m
 CONFIG_NET_SCH_DSMARK=m
+CONFIG_NET_SCH_DELAY=m
 CONFIG_NET_SCH_INGRESS=m
 CONFIG_NET_QOS=y
 CONFIG_NET_ESTIMATOR=y
@@ -657,6 +659,7 @@ CONFIG_PLIP=m
 # CONFIG_NET_FC is not set
 # CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -666,7 +669,29 @@ CONFIG_PLIP=m
 #
 # Amateur Radio support
 #
-# CONFIG_HAMRADIO is not set
+CONFIG_HAMRADIO=y
+
+#
+# Packet Radio protocols
+#
+CONFIG_AX25=m
+CONFIG_AX25_DAMA_SLAVE=y
+CONFIG_NETROM=m
+CONFIG_ROSE=m
+
+#
+# AX.25 network device drivers
+#
+# CONFIG_MKISS is not set
+# CONFIG_6PACK is not set
+CONFIG_BPQETHER=m
+# CONFIG_DMASCC is not set
+# CONFIG_SCC is not set
+# CONFIG_BAYCOM_SER_FDX is not set
+# CONFIG_BAYCOM_SER_HDX is not set
+# CONFIG_BAYCOM_PAR is not set
+# CONFIG_BAYCOM_EPP is not set
+# CONFIG_YAM is not set
 
 #
 # IrDA (infrared) support
@@ -677,11 +702,13 @@ CONFIG_PLIP=m
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -723,6 +750,7 @@ CONFIG_SERIO_PARKBD=m
 CONFIG_INPUT_KEYBOARD=y
 CONFIG_KEYBOARD_ATKBD=y
 # CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
 # CONFIG_KEYBOARD_XTKBD is not set
 # CONFIG_KEYBOARD_NEWTON is not set
 CONFIG_INPUT_MOUSE=y
@@ -731,6 +759,7 @@ CONFIG_MOUSE_PS2=y
 # CONFIG_MOUSE_INPORT is not set
 # CONFIG_MOUSE_LOGIBM is not set
 # CONFIG_MOUSE_PC110PAD is not set
+# CONFIG_MOUSE_VSXXXAA is not set
 # CONFIG_INPUT_JOYSTICK is not set
 # CONFIG_INPUT_TOUCHSCREEN is not set
 # CONFIG_INPUT_MISC is not set
@@ -760,16 +789,12 @@ CONFIG_SERIAL_8250_RSA=y
 #
 CONFIG_SERIAL_CORE=m
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 CONFIG_PRINTER=m
 # CONFIG_LP_CONSOLE is not set
 CONFIG_PPDEV=m
 CONFIG_TIPAR=m
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -781,7 +806,6 @@ CONFIG_TIPAR=m
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 CONFIG_RTC=m
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -802,6 +826,10 @@ CONFIG_RTC=m
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -844,6 +872,7 @@ CONFIG_USB_DEVICEFS=y
 # USB Host Controller Drivers
 #
 CONFIG_USB_EHCI_HCD=m
+# CONFIG_USB_EHCI_SPLIT_ISO is not set
 CONFIG_USB_OHCI_HCD=m
 CONFIG_USB_UHCI_HCD=m
 
@@ -883,7 +912,9 @@ CONFIG_USB_AIPTEK=m
 CONFIG_USB_WACOM=m
 CONFIG_USB_KBTAB=m
 CONFIG_USB_POWERMATE=m
+# CONFIG_USB_MTOUCH is not set
 CONFIG_USB_XPAD=m
+# CONFIG_USB_ATI_REMOTE is not set
 
 #
 # USB Imaging devices
@@ -913,6 +944,7 @@ CONFIG_USB_USBNET=m
 #
 # USB Host-to-Host Cables
 #
+CONFIG_USB_ALI_M5632=y
 CONFIG_USB_AN2720=y
 CONFIG_USB_BELKIN=y
 CONFIG_USB_GENESYS=y
@@ -986,7 +1018,6 @@ CONFIG_USB_TIGL=m
 CONFIG_USB_AUERSWALD=m
 CONFIG_USB_RIO500=m
 CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_BRLVGER=m
 CONFIG_USB_LCD=m
 # CONFIG_USB_LED is not set
 CONFIG_USB_TEST=m
@@ -1000,6 +1031,7 @@ CONFIG_USB_NET2280=m
 # CONFIG_USB_GADGET_PXA2XX is not set
 # CONFIG_USB_GADGET_GOKU is not set
 # CONFIG_USB_GADGET_SA1100 is not set
+CONFIG_USB_GADGET_DUALSPEED=y
 CONFIG_USB_ZERO=m
 CONFIG_USB_ETH=m
 CONFIG_USB_GADGETFS=m
@@ -1062,7 +1094,6 @@ CONFIG_NTFS_FS=m
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -1076,6 +1107,7 @@ CONFIG_ADFS_FS=m
 # CONFIG_ADFS_FS_RW is not set
 CONFIG_AFFS_FS=m
 CONFIG_HFS_FS=m
+# CONFIG_HFSPLUS_FS is not set
 CONFIG_BEFS_FS=m
 # CONFIG_BEFS_DEBUG is not set
 CONFIG_BFS_FS=m
@@ -1218,7 +1250,9 @@ CONFIG_CRYPTO_SERPENT=m
 CONFIG_CRYPTO_AES=m
 CONFIG_CRYPTO_CAST5=m
 CONFIG_CRYPTO_CAST6=m
+# CONFIG_CRYPTO_ARC4 is not set
 CONFIG_CRYPTO_DEFLATE=m
+CONFIG_CRYPTO_MICHAEL_MIC=y
 CONFIG_CRYPTO_TEST=m
 
 #
--- diff/arch/mips/configs/sb1250-swarm_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/sb1250-swarm_defconfig	2004-04-21 10:45:33.634590264 +0100
@@ -21,6 +21,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=15
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -40,6 +41,7 @@ CONFIG_MODULE_UNLOAD=y
 CONFIG_OBSOLETE_MODPARM=y
 CONFIG_MODVERSIONS=y
 CONFIG_KMOD=y
+CONFIG_STOP_MACHINE=y
 
 #
 # Machine selection
@@ -54,7 +56,6 @@ CONFIG_KMOD=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -154,7 +155,6 @@ CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -201,6 +201,7 @@ CONFIG_TRAD_SIGNALS=y
 # CONFIG_BLK_DEV_UMEM is not set
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_CARMEL is not set
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_SIZE=9220
 CONFIG_BLK_DEV_INITRD=y
@@ -224,9 +225,10 @@ CONFIG_BLK_DEV_INITRD=y
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -236,10 +238,6 @@ CONFIG_BLK_DEV_INITRD=y
 # CONFIG_I2O is not set
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -262,7 +260,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -277,7 +274,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -317,7 +313,7 @@ CONFIG_NETDEVICES=y
 # Ethernet (10 or 100Mbit)
 #
 CONFIG_NET_ETHERNET=y
-# CONFIG_MII is not set
+CONFIG_MII=y
 CONFIG_NET_SB1250_MAC=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
@@ -364,6 +360,7 @@ CONFIG_NET_SB1250_MAC=y
 # CONFIG_TR is not set
 # CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -384,11 +381,13 @@ CONFIG_NET_SB1250_MAC=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -410,7 +409,7 @@ CONFIG_NET_SB1250_MAC=y
 # CONFIG_GAMEPORT is not set
 CONFIG_SOUND_GAMEPORT=y
 CONFIG_SERIO=y
-CONFIG_SERIO_I8042=y
+# CONFIG_SERIO_I8042 is not set
 CONFIG_SERIO_SERPORT=y
 # CONFIG_SERIO_CT82C710 is not set
 # CONFIG_SERIO_PCIPS2 is not set
@@ -440,12 +439,9 @@ CONFIG_SIBYTE_SB1250_DUART_CONSOLE=y
 #
 # Non-8250 serial port support
 #
-# CONFIG_UNIX98_PTYS is not set
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -457,7 +453,6 @@ CONFIG_SIBYTE_SB1250_DUART_CONSOLE=y
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -477,6 +472,10 @@ CONFIG_SIBYTE_SB1250_DUART_CONSOLE=y
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -543,6 +542,7 @@ CONFIG_FS_POSIX_ACL=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
+# CONFIG_DEVPTS_FS_XATTR is not set
 # CONFIG_TMPFS is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
@@ -553,6 +553,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -576,7 +577,7 @@ CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
 # CONFIG_EXPORTFS is not set
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
@@ -601,6 +602,7 @@ CONFIG_MSDOS_PARTITION=y
 CONFIG_CROSSCOMPILE=y
 CONFIG_CMDLINE=""
 # CONFIG_DEBUG_KERNEL is not set
+# CONFIG_SB1XXX_CORELIS is not set
 
 #
 # Security options
@@ -625,12 +627,14 @@ CONFIG_CRYPTO_SERPENT=y
 CONFIG_CRYPTO_AES=y
 # CONFIG_CRYPTO_CAST5 is not set
 # CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_ARC4 is not set
 CONFIG_CRYPTO_DEFLATE=y
+CONFIG_CRYPTO_MICHAEL_MIC=y
 # CONFIG_CRYPTO_TEST is not set
 
 #
 # Library routines
 #
-# CONFIG_CRC32 is not set
+CONFIG_CRC32=y
 CONFIG_ZLIB_INFLATE=y
 CONFIG_ZLIB_DEFLATE=y
--- diff/arch/mips/configs/sead_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/sead_defconfig	2004-04-21 10:45:33.634590264 +0100
@@ -22,6 +22,7 @@ CONFIG_SWAP=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -50,7 +51,6 @@ CONFIG_IOSCHED_DEADLINE=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -115,7 +115,6 @@ CONFIG_CPU_HAS_SYNC=y
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -183,7 +182,7 @@ CONFIG_BLK_DEV_INITRD=y
 #
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -192,10 +191,6 @@ CONFIG_BLK_DEV_INITRD=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 # CONFIG_NET is not set
@@ -204,6 +199,8 @@ CONFIG_BLK_DEV_INITRD=y
 # Amateur Radio support
 #
 # CONFIG_HAMRADIO is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
@@ -272,11 +269,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 # CONFIG_UNIX98_PTYS is not set
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -288,7 +282,6 @@ CONFIG_SERIAL_CORE_CONSOLE=y
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -309,6 +302,10 @@ CONFIG_SERIAL_CORE_CONSOLE=y
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -390,6 +387,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
--- diff/arch/mips/configs/tb0226_defconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/mips/configs/tb0226_defconfig	2004-04-21 10:45:33.635590112 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -62,7 +63,6 @@ CONFIG_TANBAC_TB0226=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -124,7 +124,6 @@ CONFIG_CPU_HAS_SYNC=y
 #
 # CONFIG_PCI is not set
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -164,7 +163,6 @@ CONFIG_BLK_DEV_LOOP=m
 CONFIG_BLK_DEV_NBD=m
 CONFIG_BLK_DEV_RAM=m
 CONFIG_BLK_DEV_RAM_SIZE=4096
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -219,6 +217,12 @@ CONFIG_SCSI_CONSTANTS=y
 # CONFIG_SCSI_LOGGING is not set
 
 #
+# SCSI Transport Attributes
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+
+#
 # SCSI low-level drivers
 #
 # CONFIG_SCSI_AIC7XXX_OLD is not set
@@ -234,10 +238,9 @@ CONFIG_SCSI_CONSTANTS=y
 #
 # Fusion MPT device support
 #
-# CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -246,10 +249,6 @@ CONFIG_SCSI_CONSTANTS=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -278,7 +277,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 CONFIG_SYN_COOKIES=y
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -291,7 +289,6 @@ CONFIG_SYN_COOKIES=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -354,6 +351,7 @@ CONFIG_PPPOE=m
 # Token Ring devices
 #
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -374,11 +372,13 @@ CONFIG_PPPOE=m
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -443,12 +443,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -460,7 +456,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -481,6 +476,10 @@ CONFIG_UNIX98_PTY_COUNT=256
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -571,7 +570,6 @@ CONFIG_VFAT_FS=m
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 CONFIG_TMPFS=y
@@ -584,6 +582,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -610,7 +609,7 @@ CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
 CONFIG_EXPORTFS=m
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 CONFIG_SMB_FS=m
 CONFIG_SMB_NLS_DEFAULT=y
 CONFIG_SMB_NLS_REMOTE="cp932"
--- diff/arch/mips/configs/tb0229_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/tb0229_defconfig	2004-04-21 10:45:33.635590112 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -62,7 +63,6 @@ CONFIG_TANBAC_TB0229=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -127,7 +127,6 @@ CONFIG_PCI=y
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -169,6 +168,7 @@ CONFIG_TRAD_SIGNALS=y
 CONFIG_BLK_DEV_LOOP=m
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
 CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_CARMEL is not set
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_SIZE=4096
 # CONFIG_BLK_DEV_INITRD is not set
@@ -192,9 +192,10 @@ CONFIG_BLK_DEV_RAM_SIZE=4096
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -204,10 +205,6 @@ CONFIG_BLK_DEV_RAM_SIZE=4096
 # CONFIG_I2O is not set
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -237,7 +234,6 @@ CONFIG_NET_IPGRE=m
 # CONFIG_NET_IPGRE_BROADCAST is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 CONFIG_SYN_COOKIES=y
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -252,7 +248,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -348,6 +343,7 @@ CONFIG_SLIP_MODE_SLIP6=y
 # CONFIG_TR is not set
 # CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -368,11 +364,13 @@ CONFIG_SLIP_MODE_SLIP6=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -438,12 +436,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -455,7 +449,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -476,6 +469,10 @@ CONFIG_UNIX98_PTY_COUNT=256
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -563,7 +560,6 @@ CONFIG_VFAT_FS=m
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 CONFIG_TMPFS=y
@@ -576,6 +572,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -602,7 +599,7 @@ CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
 CONFIG_EXPORTFS=y
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 CONFIG_SMB_FS=m
 CONFIG_SMB_NLS_DEFAULT=y
 CONFIG_SMB_NLS_REMOTE="cp932"
--- diff/arch/mips/configs/workpad_defconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/mips/configs/workpad_defconfig	2004-04-21 10:45:33.636589960 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -62,7 +63,6 @@ CONFIG_IBM_WORKPAD=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -122,8 +122,8 @@ CONFIG_CPU_HAS_SYNC=y
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
+CONFIG_ISA=y
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -153,15 +153,16 @@ CONFIG_TRAD_SIGNALS=y
 #
 # Plug and Play support
 #
+# CONFIG_PNP is not set
 
 #
 # Block devices
 #
 # CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -186,6 +187,7 @@ CONFIG_IDE_TASKFILE_IO=y
 # IDE chipset support/bugfixes
 #
 CONFIG_IDE_GENERIC=y
+# CONFIG_IDE_CHIPSETS is not set
 # CONFIG_BLK_DEV_IDEDMA is not set
 # CONFIG_IDEDMA_AUTO is not set
 # CONFIG_BLK_DEV_HD is not set
@@ -196,6 +198,11 @@ CONFIG_IDE_GENERIC=y
 # CONFIG_SCSI is not set
 
 #
+# Old CD-ROM drivers (not SCSI, not IDE)
+#
+# CONFIG_CD_NO_IDESCSI is not set
+
+#
 # Multi-device support (RAID and LVM)
 #
 # CONFIG_MD is not set
@@ -205,7 +212,7 @@ CONFIG_IDE_GENERIC=y
 #
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -214,10 +221,6 @@ CONFIG_IDE_GENERIC=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -238,7 +241,6 @@ CONFIG_IP_MULTICAST=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -253,7 +255,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -278,6 +279,11 @@ CONFIG_IPV6_SCTP__=y
 #
 # CONFIG_NET_PKTGEN is not set
 CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
 # CONFIG_DUMMY is not set
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
@@ -289,6 +295,16 @@ CONFIG_NETDEVICES=y
 #
 CONFIG_NET_ETHERNET=y
 # CONFIG_MII is not set
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_LANCE is not set
+# CONFIG_NET_VENDOR_SMC is not set
+# CONFIG_NET_VENDOR_RACAL is not set
+# CONFIG_AT1700 is not set
+# CONFIG_DEPCA is not set
+# CONFIG_HP100 is not set
+# CONFIG_NET_ISA is not set
+# CONFIG_NET_PCI is not set
+# CONFIG_NET_POCKET is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -308,7 +324,9 @@ CONFIG_NET_ETHERNET=y
 #
 # Token Ring devices
 #
+# CONFIG_TR is not set
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -329,11 +347,13 @@ CONFIG_NET_ETHERNET=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -398,12 +418,8 @@ CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -421,7 +437,13 @@ CONFIG_WATCHDOG=y
 # Watchdog Device Drivers
 #
 # CONFIG_SOFT_WATCHDOG is not set
-# CONFIG_NVRAM is not set
+
+#
+# ISA-based Watchdog Cards
+#
+# CONFIG_PCWATCHDOG is not set
+# CONFIG_MIXCOMWD is not set
+# CONFIG_WDT is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -442,6 +464,10 @@ CONFIG_WATCHDOG=y
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -514,7 +540,6 @@ CONFIG_AUTOFS4_FS=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -527,6 +552,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -550,7 +576,7 @@ CONFIG_NFSD=y
 CONFIG_LOCKD=y
 CONFIG_EXPORTFS=y
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
--- diff/arch/mips/configs/xxs1500_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/xxs1500_defconfig	2004-04-21 10:45:33.637589808 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+CONFIG_HOTPLUG=y
 # CONFIG_IKCONFIG is not set
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
@@ -55,7 +56,6 @@ CONFIG_KMOD=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -117,12 +117,12 @@ CONFIG_CPU_HAS_SYNC=y
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
 CONFIG_MMU=y
-CONFIG_HOTPLUG=y
 
 #
 # PCMCIA/CardBus support
 #
 CONFIG_PCMCIA=m
+# CONFIG_PCMCIA_DEBUG is not set
 # CONFIG_TCIC is not set
 
 #
@@ -167,7 +167,6 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -190,7 +189,7 @@ CONFIG_BLK_DEV_LOOP=y
 #
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -199,10 +198,6 @@ CONFIG_BLK_DEV_LOOP=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -226,7 +221,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -257,7 +251,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -320,6 +313,7 @@ CONFIG_PPPOE=m
 # Token Ring devices
 #
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -353,11 +347,13 @@ CONFIG_PCMCIA_3C589=m
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -417,12 +413,8 @@ CONFIG_HW_CONSOLE=y
 # Non-8250 serial port support
 #
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -434,7 +426,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 CONFIG_RTC=y
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
@@ -459,6 +450,10 @@ CONFIG_RTC=y
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -537,7 +532,6 @@ CONFIG_AUTOFS4_FS=m
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 CONFIG_TMPFS=y
@@ -550,6 +544,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -574,7 +569,7 @@ CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_EXPORTFS=m
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 CONFIG_SMB_FS=m
 # CONFIG_SMB_NLS_DEFAULT is not set
 # CONFIG_CIFS is not set
@@ -662,7 +657,9 @@ CONFIG_CRYPTO_TWOFISH=y
 CONFIG_CRYPTO_AES=y
 # CONFIG_CRYPTO_CAST5 is not set
 # CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_ARC4 is not set
 CONFIG_CRYPTO_DEFLATE=y
+CONFIG_CRYPTO_MICHAEL_MIC=y
 # CONFIG_CRYPTO_TEST is not set
 
 #
--- diff/arch/mips/configs/yosemite_defconfig	2004-03-11 10:20:20.000000000 +0000
+++ source/arch/mips/configs/yosemite_defconfig	2004-04-21 10:45:33.638589656 +0100
@@ -21,6 +21,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=15
+# CONFIG_HOTPLUG is not set
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
 CONFIG_EMBEDDED=y
@@ -41,6 +42,7 @@ CONFIG_MODULE_UNLOAD=y
 CONFIG_OBSOLETE_MODPARM=y
 CONFIG_MODVERSIONS=y
 CONFIG_KMOD=y
+CONFIG_STOP_MACHINE=y
 
 #
 # Machine selection
@@ -55,7 +57,6 @@ CONFIG_KMOD=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -80,7 +81,6 @@ CONFIG_HAVE_DEC_LOCK=y
 # CONFIG_CPU_LITTLE_ENDIAN is not set
 CONFIG_MIPS_L1_CACHE_SHIFT=5
 # CONFIG_FB is not set
-CONFIG_BOARD_SCACHE=y
 
 #
 # CPU selection
@@ -111,6 +111,7 @@ CONFIG_CPU_HAS_PREFETCH=y
 CONFIG_CPU_HAS_LLSC=y
 CONFIG_CPU_HAS_LLDSCD=y
 CONFIG_CPU_HAS_SYNC=y
+# CONFIG_HIGHMEM is not set
 CONFIG_SMP=y
 CONFIG_NR_CPUS=2
 # CONFIG_PREEMPT is not set
@@ -120,7 +121,6 @@ CONFIG_NR_CPUS=2
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -160,7 +160,6 @@ CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 CONFIG_LBD=y
 
 #
@@ -193,6 +192,12 @@ CONFIG_SCSI_REPORT_LUNS=y
 # CONFIG_SCSI_LOGGING is not set
 
 #
+# SCSI Transport Attributes
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+
+#
 # SCSI low-level drivers
 #
 # CONFIG_SCSI_AIC7XXX_OLD is not set
@@ -208,10 +213,9 @@ CONFIG_SCSI_REPORT_LUNS=y
 #
 # Fusion MPT device support
 #
-# CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -220,10 +224,6 @@ CONFIG_SCSI_REPORT_LUNS=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -246,7 +246,6 @@ CONFIG_IP_PNP_DHCP=y
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -259,7 +258,6 @@ CONFIG_IP_PNP_DHCP=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -314,6 +312,7 @@ CONFIG_NET_ETHERNET=y
 # Token Ring devices
 #
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -334,11 +333,13 @@ CONFIG_NET_ETHERNET=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -388,12 +389,8 @@ CONFIG_SERIAL_NONSTANDARD=y
 # Non-8250 serial port support
 #
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -405,7 +402,6 @@ CONFIG_UNIX98_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
@@ -425,6 +421,10 @@ CONFIG_UNIX98_PTY_COUNT=256
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -490,7 +490,6 @@ CONFIG_FS_MBCACHE=y
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 # CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
 # CONFIG_HUGETLB_PAGE is not set
@@ -502,6 +501,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
@@ -525,7 +525,7 @@ CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
 # CONFIG_EXPORTFS is not set
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
--- diff/arch/mips/ddb5xxx/common/irq.c	2003-07-08 09:55:17.000000000 +0100
+++ source/arch/mips/ddb5xxx/common/irq.c	2004-04-21 10:45:33.638589656 +0100
@@ -17,15 +17,27 @@
 
 void (*irq_setup)(void);
 
+#ifdef CONFIG_KGDB
+static int kgdb_flag = 1;
+static int __init nokgdb(char *str)
+{
+	kgdb_flag = 0;
+	return 1;
+}
+__setup("nokgdb", nokgdb);
+#endif
+
 void __init init_IRQ(void)
 {
 #ifdef CONFIG_KGDB
 	extern void breakpoint(void);
 	extern void set_debug_traps(void);
 
-	printk("Wait for gdb client connection ...\n");
-	set_debug_traps();
-	breakpoint();
+	if (kgdb_flag) {
+		printk("Wait for gdb client connection ...\n");
+		set_debug_traps();
+		breakpoint();
+	}
 #endif
 	/* set up default irq controller */
 	init_generic_irq();
--- diff/arch/mips/defconfig	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/defconfig	2004-04-21 10:45:33.639589504 +0100
@@ -22,6 +22,7 @@ CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
 CONFIG_EMBEDDED=y
@@ -56,7 +57,6 @@ CONFIG_KMOD=y
 # CONFIG_MIPS_EV96100 is not set
 # CONFIG_MIPS_IVR is not set
 # CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
 # CONFIG_MIPS_ITE8172 is not set
 # CONFIG_MIPS_ATLAS is not set
 # CONFIG_MIPS_MALTA is not set
@@ -89,7 +89,6 @@ CONFIG_ARC32=y
 # CONFIG_FB is not set
 CONFIG_ARC_CONSOLE=y
 CONFIG_ARC_PROMLIB=y
-CONFIG_BOARD_SCACHE=y
 
 #
 # CPU selection
@@ -114,7 +113,8 @@ CONFIG_CPU_R5000=y
 CONFIG_PAGE_SIZE_4KB=y
 # CONFIG_PAGE_SIZE_16KB is not set
 # CONFIG_PAGE_SIZE_64KB is not set
-CONFIG_R5000_CPU_SCACHE=y
+CONFIG_BOARD_SCACHE=y
+CONFIG_IP22_CPU_SCACHE=y
 # CONFIG_64BIT_PHYS_ADDR is not set
 # CONFIG_CPU_ADVANCED is not set
 CONFIG_CPU_HAS_LLSC=y
@@ -126,9 +126,8 @@ CONFIG_CPU_HAS_SYNC=y
 #
 # Bus options (PCI, PCMCIA, EISA, ISA, TC)
 #
-# CONFIG_ISA is not set
+# CONFIG_EISA is not set
 CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
 
 #
 # Executable file formats
@@ -167,7 +166,6 @@ CONFIG_BINFMT_IRIX=y
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_LBD is not set
 
 #
@@ -200,6 +198,12 @@ CONFIG_SCSI_CONSTANTS=y
 # CONFIG_SCSI_LOGGING is not set
 
 #
+# SCSI Transport Attributes
+#
+CONFIG_SCSI_SPI_ATTRS=m
+# CONFIG_SCSI_FC_ATTRS is not set
+
+#
 # SCSI low-level drivers
 #
 CONFIG_SGIWD93_SCSI=y
@@ -216,10 +220,9 @@ CONFIG_SGIWD93_SCSI=y
 #
 # Fusion MPT device support
 #
-# CONFIG_FUSION is not set
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
@@ -228,10 +231,6 @@ CONFIG_SGIWD93_SCSI=y
 #
 
 #
-# Macintosh device drivers
-#
-
-#
 # Networking support
 #
 CONFIG_NET=y
@@ -255,7 +254,6 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-CONFIG_INET_ECN=y
 # CONFIG_SYN_COOKIES is not set
 CONFIG_INET_AH=m
 CONFIG_INET_ESP=m
@@ -390,7 +388,6 @@ CONFIG_XFRM_USER=m
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=m
 CONFIG_IP_SCTP=m
 # CONFIG_SCTP_DBG_MSG is not set
 # CONFIG_SCTP_DBG_OBJCNT is not set
@@ -425,6 +422,7 @@ CONFIG_NET_SCH_TEQL=m
 CONFIG_NET_SCH_TBF=m
 CONFIG_NET_SCH_GRED=m
 CONFIG_NET_SCH_DSMARK=m
+CONFIG_NET_SCH_DELAY=m
 CONFIG_NET_SCH_INGRESS=m
 CONFIG_NET_QOS=y
 CONFIG_NET_ESTIMATOR=y
@@ -475,6 +473,7 @@ CONFIG_SGISEEQ=y
 # Token Ring devices
 #
 # CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # Wan interfaces
@@ -495,11 +494,13 @@ CONFIG_SGISEEQ=y
 # Bluetooth support
 #
 # CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN_BOOL is not set
+# CONFIG_ISDN is not set
 
 #
 # Telephony Support
@@ -539,6 +540,7 @@ CONFIG_SERIO_SERPORT=y
 CONFIG_INPUT_KEYBOARD=y
 CONFIG_KEYBOARD_ATKBD=y
 # CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
 # CONFIG_KEYBOARD_XTKBD is not set
 # CONFIG_KEYBOARD_NEWTON is not set
 # CONFIG_INPUT_MOUSE is not set
@@ -565,12 +567,8 @@ CONFIG_HW_CONSOLE=y
 CONFIG_SERIAL_IP22_ZILOG=m
 CONFIG_SERIAL_CORE=m
 CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_QIC02_TAPE is not set
 
 #
@@ -589,7 +587,6 @@ CONFIG_WATCHDOG=y
 #
 # CONFIG_SOFT_WATCHDOG is not set
 CONFIG_INDYDOG=m
-# CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_GEN_RTC is not set
 CONFIG_SGI_DS1286=y
@@ -612,6 +609,10 @@ CONFIG_MAX_RAW_DEVS=256
 # CONFIG_I2C is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
@@ -709,7 +710,6 @@ CONFIG_VFAT_FS=m
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 # CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
@@ -722,6 +722,7 @@ CONFIG_RAMFS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 CONFIG_EFS_FS=m
@@ -748,7 +749,8 @@ CONFIG_LOCKD=m
 CONFIG_LOCKD_V4=y
 CONFIG_EXPORTFS=m
 CONFIG_SUNRPC=m
-# CONFIG_SUNRPC_GSS is not set
+CONFIG_SUNRPC_GSS=m
+CONFIG_RPCSEC_GSS_KRB5=m
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
@@ -850,7 +852,9 @@ CONFIG_CRYPTO_SERPENT=y
 CONFIG_CRYPTO_AES=y
 CONFIG_CRYPTO_CAST5=m
 CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_ARC4=m
 CONFIG_CRYPTO_DEFLATE=y
+CONFIG_CRYPTO_MICHAEL_MIC=m
 # CONFIG_CRYPTO_TEST is not set
 
 #
--- diff/arch/mips/kernel/Makefile	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/kernel/Makefile	2004-04-21 10:45:33.640589352 +0100
@@ -37,6 +37,7 @@ obj-$(CONFIG_SMP)		+= smp.o
 obj-$(CONFIG_I8259)		+= i8259.o
 obj-$(CONFIG_IRQ_CPU)		+= irq_cpu.o
 obj-$(CONFIG_IRQ_CPU_RM7K)	+= irq-rm7000.o
+obj-$(CONFIG_MIPS_MV64340)	+= irq-mv6434x.o
 
 obj-$(CONFIG_MIPS32)		+= scall32-o32.o
 obj-$(CONFIG_MIPS64)		+= scall64-64.o
@@ -54,5 +55,6 @@ obj-$(CONFIG_MIPS64)		+= cpu-bugs64.o
 obj-$(CONFIG_GEN_RTC)		+= genrtc.o
 
 CFLAGS_cpu-bugs64.o	= $(shell if $(CC) $(CFLAGS) -Wa,-mdaddi -c -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-DHAVE_AS_SET_DADDI"; fi)
+CFLAGS_ioctl32.o	+= -Ifs/
 
 EXTRA_AFLAGS := $(CFLAGS)
--- diff/arch/mips/kernel/cpu-probe.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/kernel/cpu-probe.c	2004-04-21 10:45:33.640589352 +0100
@@ -172,8 +172,7 @@ static inline void cpu_probe_legacy(stru
 	case PRID_IMP_R2000:
 		c->cputype = CPU_R2000;
 		c->isa_level = MIPS_CPU_ISA_I;
-		c->options = MIPS_CPU_TLB | MIPS_CPU_NOFPUEX |
-		             MIPS_CPU_LLSC;
+		c->options = MIPS_CPU_TLB | MIPS_CPU_NOFPUEX;
 		if (__cpu_has_fpu())
 			c->options |= MIPS_CPU_FPU;
 		c->tlbsize = 64;
@@ -187,8 +186,7 @@ static inline void cpu_probe_legacy(stru
 		else
 			c->cputype = CPU_R3000;
 		c->isa_level = MIPS_CPU_ISA_I;
-		c->options = MIPS_CPU_TLB | MIPS_CPU_NOFPUEX |
-		             MIPS_CPU_LLSC;
+		c->options = MIPS_CPU_TLB | MIPS_CPU_NOFPUEX;
 		if (__cpu_has_fpu())
 			c->options |= MIPS_CPU_FPU;
 		c->tlbsize = 64;
@@ -499,6 +497,9 @@ static inline void cpu_probe_alchemy(str
 		case 2:
 			c->cputype = CPU_AU1100;
 			break;
+		case 3:
+			c->cputype = CPU_AU1550;
+			break;
 		default:
 			panic("Unknown Au Core!");
 			break;
--- diff/arch/mips/kernel/entry.S	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/kernel/entry.S	2004-04-21 10:45:33.641589200 +0100
@@ -60,6 +60,7 @@ need_resched:
 	sw	t0, TI_PRE_COUNT($28)
 	local_irq_enable t0
 	jal	schedule
+	sw	zero, TI_PRE_COUNT($28)
 	local_irq_disable t0
 	b	need_resched
 #endif
--- diff/arch/mips/kernel/ioctl32.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/kernel/ioctl32.c	2004-04-21 10:45:33.643588896 +0100
@@ -3,928 +3,28 @@
  *
  * Copyright (C) 2000 Silicon Graphics, Inc.
  * Written by Ulf Carlsson (ulfc@engr.sgi.com)
- * Copyright (C) 2000 Ralf Baechle
+ * Copyright (C) 2000, 2004 Ralf Baechle
  * Copyright (C) 2002, 2003  Maciej W. Rozycki
- *
- * Mostly stolen from the sparc64 ioctl32 implementation.
  */
+#define INCLUDES
+#include "compat_ioctl.c"
+
 #include <linux/config.h>
 #include <linux/types.h>
 #include <linux/compat.h>
 #include <linux/ioctl32.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/if.h>
-#include <linux/mm.h>
-#include <linux/mtio.h>
-#include <linux/auto_fs.h>
-#include <linux/auto_fs4.h>
-#include <linux/devfs_fs.h>
-#include <linux/tty.h>
-#include <linux/init.h>
-#include <linux/fs.h>
-#include <linux/file.h>
-#include <linux/fd.h>
-#include <linux/ppp_defs.h>
-#include <linux/if_ppp.h>
-#include <linux/if_pppox.h>
-#include <linux/if_tun.h>
-#include <linux/cdrom.h>
-#include <linux/blkdev.h>
-#include <linux/loop.h>
-#include <linux/fb.h>
-#include <linux/i2c.h>
-#include <linux/vt.h>
-#include <linux/vt_kern.h>
-#include <linux/kd.h>
-#include <linux/ext2_fs.h>
-#include <linux/videodev.h>
-#include <linux/netdevice.h>
-#include <linux/raw.h>
-#include <linux/smb_fs.h>
-#include <linux/ncp_fs.h>
-#include <linux/route.h>
-#include <linux/hdreg.h>
-#include <linux/raid/md.h>
-#include <linux/blkpg.h>
-#include <linux/elevator.h>
-#include <linux/rtc.h>
-#include <linux/pci.h>
-#include <linux/dm-ioctl.h>
-
-#include <scsi/scsi.h>
-#undef __KERNEL__		/* This file was born to be ugly ...  */
-#include <scsi/scsi_ioctl.h>
-#define __KERNEL__
-#include <scsi/sg.h>
-
-#include <linux/ethtool.h>
-#include <linux/mii.h>
-#include <linux/if_bonding.h>
 #include <linux/syscalls.h>
-#include <linux/watchdog.h>
-
-#include <asm/ioctls.h>
-#include <asm/module.h>
-#include <linux/soundcard.h>
-#include <linux/lp.h>
-
-#include <linux/atm.h>
-#include <linux/atmarp.h>
-#include <linux/atmclip.h>
-#include <linux/atmdev.h>
-#include <linux/atmioc.h>
-#include <linux/atmlec.h>
-#include <linux/atmmpc.h>
-#include <linux/atmsvc.h>
-#include <linux/atm_tcp.h>
-#include <linux/sonet.h>
-#include <linux/atm_suni.h>
-#include <linux/mtd/mtd.h>
-
-#include <net/bluetooth/bluetooth.h>
-#include <net/bluetooth/hci.h>
-#include <net/bluetooth/rfcomm.h>
-
-#include <linux/usb.h>
-#include <linux/usbdevice_fs.h>
-#include <linux/nbd.h>
-#include <linux/random.h>
-#include <linux/filter.h>
-#include <linux/wireless.h>
 
 #ifdef CONFIG_SIBYTE_TBPROF
 #include <asm/sibyte/trace_prof.h>
 #endif
 
-static int w_long(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	int err;
-	unsigned long val;
-
-	set_fs (KERNEL_DS);
-	err = sys_ioctl(fd, cmd, (unsigned long)&val);
-	set_fs (old_fs);
-	if (!err && put_user((unsigned int) val, (u32 *)arg))
-		return -EFAULT;
-	return err;
-}
-
-static int rw_long(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	int err;
-	unsigned long val;
-
-	if (get_user(val, (u32 *)arg))
-		return -EFAULT;
-	set_fs(KERNEL_DS);
-	err = sys_ioctl(fd, cmd, (unsigned long)&val);
-	set_fs (old_fs);
-	if (!err && put_user(val, (u32 *)arg))
-		return -EFAULT;
-	return err;
-}
-
 #define A(__x) ((unsigned long)(__x))
 
+long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg);
 
-#ifdef CONFIG_FB
-
-struct fb_fix_screeninfo32 {
-	char id[16];			/* identification string eg "TT Builtin" */
-	__u32 smem_start;		/* Start of frame buffer mem */
-					/* (physical address) */
-	__u32 smem_len;			/* Length of frame buffer mem */
-	__u32 type;			/* see FB_TYPE_*		*/
-	__u32 type_aux;			/* Interleave for interleaved Planes */
-	__u32 visual;			/* see FB_VISUAL_*		*/ 
-	__u16 xpanstep;			/* zero if no hardware panning  */
-	__u16 ypanstep;			/* zero if no hardware panning  */
-	__u16 ywrapstep;		/* zero if no hardware ywrap    */
-	__u32 line_length;		/* length of a line in bytes    */
-	__u32 mmio_start;		/* Start of Memory Mapped I/O   */
-					/* (physical address) */
-	__u32 mmio_len;			/* Length of Memory Mapped I/O  */
-	__u32 accel;			/* Type of acceleration available */
-	__u16 reserved[3];		/* Reserved for future compatibility */
-};
-
-static int do_fbioget_fscreeninfo_ioctl(unsigned int fd, unsigned int cmd,
-					unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	struct fb_fix_screeninfo fix;
-	struct fb_fix_screeninfo32 *fix32 = (struct fb_fix_screeninfo32 *)arg;
-	int err;
-
-	set_fs(KERNEL_DS);
-	err = sys_ioctl(fd, cmd, (unsigned long)&fix);
-	set_fs(old_fs);
-
-	if (err == 0) {
-		err = __copy_to_user((char *)fix32->id, (char *)fix.id,
-				     sizeof(fix.id));
-		err |= __put_user((__u32)(unsigned long)fix.smem_start,
-				  &fix32->smem_start);
-		err |= __put_user(fix.smem_len, &fix32->smem_len);
-		err |= __put_user(fix.type, &fix32->type);
-		err |= __put_user(fix.type_aux, &fix32->type_aux);
-		err |= __put_user(fix.visual, &fix32->visual);
-		err |= __put_user(fix.xpanstep, &fix32->xpanstep);
-		err |= __put_user(fix.ypanstep, &fix32->ypanstep);
-		err |= __put_user(fix.ywrapstep, &fix32->ywrapstep);
-		err |= __put_user(fix.line_length, &fix32->line_length);
-		err |= __put_user((__u32)(unsigned long)fix.mmio_start,
-				  &fix32->mmio_start);
-		err |= __put_user(fix.mmio_len, &fix32->mmio_len);
-		err |= __put_user(fix.accel, &fix32->accel);
-		err |= __copy_to_user((char *)fix32->reserved,
-				      (char *)fix.reserved,
-				      sizeof(fix.reserved));
-		if (err)
-			err = -EFAULT;
-	}
-
-	return err;
-}
-
-struct fb_cmap32 {
-	__u32 start;			/* First entry  */
-	__u32 len;			/* Number of entries */
-	__u32 red;			/* Red values   */
-	__u32 green;
-	__u32 blue;
-	__u32 transp;			/* transparency, can be NULL */
-};
-
-static int do_fbiocmap_ioctl(unsigned int fd, unsigned int cmd,
-			     unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	u32 red = 0, green = 0, blue = 0, transp = 0;
-	struct fb_cmap cmap;
-	struct fb_cmap32 *cmap32 = (struct fb_cmap32 *)arg;
-	int err;
-
-	memset(&cmap, 0, sizeof(cmap));
-
-	err = __get_user(cmap.start, &cmap32->start);
-	err |= __get_user(cmap.len, &cmap32->len);
-	err |= __get_user(red, &cmap32->red);
-	err |= __get_user(green, &cmap32->green);
-	err |= __get_user(blue, &cmap32->blue);
-	err |= __get_user(transp, &cmap32->transp);
-	if (err)
-		return -EFAULT;
-
-	err = -ENOMEM;
-	cmap.red = kmalloc(cmap.len * sizeof(__u16), GFP_KERNEL);
-	if (!cmap.red)
-		goto out;
-	cmap.green = kmalloc(cmap.len * sizeof(__u16), GFP_KERNEL);
-	if (!cmap.green)
-		goto out;
-	cmap.blue = kmalloc(cmap.len * sizeof(__u16), GFP_KERNEL);
-	if (!cmap.blue)
-		goto out;
-	if (transp) {
-		cmap.transp = kmalloc(cmap.len * sizeof(__u16), GFP_KERNEL);
-		if (!cmap.transp)
-			goto out;
-	}
-			
-	if (cmd == FBIOPUTCMAP) {
-		err = __copy_from_user(cmap.red, (char *)A(red),
-				       cmap.len * sizeof(__u16));
-		err |= __copy_from_user(cmap.green, (char *)A(green),
-					cmap.len * sizeof(__u16));
-		err |= __copy_from_user(cmap.blue, (char *)A(blue),
-					cmap.len * sizeof(__u16));
-		if (cmap.transp)
-			err |= __copy_from_user(cmap.transp, (char *)A(transp),
-						cmap.len * sizeof(__u16));
-		if (err) {
-			err = -EFAULT;
-			goto out;
-		}
-	}
-
-	set_fs(KERNEL_DS);
-	err = sys_ioctl(fd, cmd, (unsigned long)&cmap);
-	set_fs(old_fs);
-	if (err)
-		goto out;
-
-	if (cmd == FBIOGETCMAP) {
-		err = __copy_to_user((char *)A(red), cmap.red,
-				     cmap.len * sizeof(__u16));
-		err |= __copy_to_user((char *)A(green), cmap.blue,
-				      cmap.len * sizeof(__u16));
-		err |= __copy_to_user((char *)A(blue), cmap.blue,
-				      cmap.len * sizeof(__u16));
-		if (cmap.transp)
-			err |= __copy_to_user((char *)A(transp), cmap.transp,
-					      cmap.len * sizeof(__u16));
-		if (err) {
-			err = -EFAULT;
-			goto out;
-		}
-	}
-
-out:
-	if (cmap.red)
-		kfree(cmap.red);
-	if (cmap.green)
-		kfree(cmap.green);
-	if (cmap.blue)
-		kfree(cmap.blue);
-	if (cmap.transp)
-		kfree(cmap.transp);
-
-	return err;
-}
-
-#endif /* CONFIG_FB */
-
-
-static int do_siocgstamp(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct compat_timeval *up = (struct compat_timeval *)arg;
-	struct timeval ktv;
-	mm_segment_t old_fs = get_fs();
-	int err;
-
-	set_fs(KERNEL_DS);
-	err = sys_ioctl(fd, cmd, (unsigned long)&ktv);
-	set_fs(old_fs);
-	if (!err) {
-		err = put_user(ktv.tv_sec, &up->tv_sec);
-		err |= __put_user(ktv.tv_usec, &up->tv_usec);
-	}
-
-	return err;
-}
-
-#define EXT2_IOC32_GETFLAGS               _IOR('f', 1, int)
-#define EXT2_IOC32_SETFLAGS               _IOW('f', 2, int)
-#define EXT2_IOC32_GETVERSION             _IOR('v', 1, int)
-#define EXT2_IOC32_SETVERSION             _IOW('v', 2, int)
-
-struct ifmap32 {
-	unsigned int mem_start;
-	unsigned int mem_end;
-	unsigned short base_addr;
-	unsigned char irq;
-	unsigned char dma;
-	unsigned char port;
-};
-
-struct ifreq32 {
-#define IFHWADDRLEN     6
-#define IFNAMSIZ        16
-        union {
-                char    ifrn_name[IFNAMSIZ];	/* if name, e.g. "en0" */
-        } ifr_ifrn;
-        union {
-                struct  sockaddr ifru_addr;
-                struct  sockaddr ifru_dstaddr;
-                struct  sockaddr ifru_broadaddr;
-                struct  sockaddr ifru_netmask;
-                struct  sockaddr ifru_hwaddr;
-                short   ifru_flags;
-                int     ifru_ivalue;
-                int     ifru_mtu;
-                struct  ifmap32 ifru_map;
-                char    ifru_slave[IFNAMSIZ];   /* Just fits the size */
-		char	ifru_newname[IFNAMSIZ];
-                compat_caddr_t ifru_data;
-        } ifr_ifru;
-};
-
-struct ifconf32 {
-        int     ifc_len;                        /* size of buffer       */
-        compat_caddr_t  ifcbuf;
-};
-
-#ifdef CONFIG_NET
-
-static int dev_ifname32(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct ireq32 *uir32 = (struct ireq32 *)arg;
-	struct net_device *dev;
-	struct ifreq32 ifr32;
-
-	if (copy_from_user(&ifr32, uir32, sizeof(struct ifreq32)))
-		return -EFAULT;
-
-	read_lock(&dev_base_lock);
-	dev = __dev_get_by_index(ifr32.ifr_ifindex);
-	if (!dev) {
-		read_unlock(&dev_base_lock);
-		return -ENODEV;
-	}
-
-	strcpy(ifr32.ifr_name, dev->name);
-	read_unlock(&dev_base_lock);
-
-	if (copy_to_user(uir32, &ifr32, sizeof(struct ifreq32)))
-	    return -EFAULT;
-
-	return 0;
-}
-
-static inline int dev_ifconf(unsigned int fd, unsigned int cmd,
-			     unsigned long arg)
-{
-	struct ioconf32 *uifc32 = (struct ioconf32 *)arg;
-	struct ifconf32 ifc32;
-	struct ifconf ifc;
-	struct ifreq32 *ifr32;
-	struct ifreq *ifr;
-	mm_segment_t old_fs;
-	unsigned int i, j;
-	int err;
-
-	if (copy_from_user(&ifc32, uifc32, sizeof(struct ifconf32)))
-		return -EFAULT;
-
-	if(ifc32.ifcbuf == 0) {
-		ifc32.ifc_len = 0;
-		ifc.ifc_len = 0;
-		ifc.ifc_buf = NULL;
-	} else {
-		ifc.ifc_len = ((ifc32.ifc_len / sizeof (struct ifreq32))) *
-			sizeof (struct ifreq);
-		ifc.ifc_buf = kmalloc (ifc.ifc_len, GFP_KERNEL);
-		if (!ifc.ifc_buf)
-			return -ENOMEM;
-	}
-	ifr = ifc.ifc_req;
-	ifr32 = (struct ifreq32 *)A(ifc32.ifcbuf);
-	for (i = 0; i < ifc32.ifc_len; i += sizeof (struct ifreq32)) {
-		if (copy_from_user(ifr++, ifr32++, sizeof (struct ifreq32))) {
-			kfree (ifc.ifc_buf);
-			return -EFAULT;
-		}
-	}
-
-	old_fs = get_fs(); set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, SIOCGIFCONF, (unsigned long)&ifc);
-	set_fs (old_fs);
-	if (err)
-		goto out;
-
-	ifr = ifc.ifc_req;
-	ifr32 = (struct ifreq32 *)A(ifc32.ifcbuf);
-	for (i = 0, j = 0; i < ifc32.ifc_len && j < ifc.ifc_len;
-	     i += sizeof (struct ifreq32), j += sizeof (struct ifreq)) {
-		if (copy_to_user(ifr32++, ifr++, sizeof (struct ifreq32))) {
-			err = -EFAULT;
-			goto out;
-		}
-	}
-	if (ifc32.ifcbuf == 0) {
-		/* Translate from 64-bit structure multiple to
-		 * a 32-bit one.
-		 */
-		i = ifc.ifc_len;
-		i = ((i / sizeof(struct ifreq)) * sizeof(struct ifreq32));
-		ifc32.ifc_len = i;
-	} else {
-		if (i <= ifc32.ifc_len)
-			ifc32.ifc_len = i;
-		else
-			ifc32.ifc_len = i - sizeof (struct ifreq32);
-	}
-	if (copy_to_user(uifc32, &ifc32, sizeof(struct ifconf32))) {
-		err = -EFAULT;
-		goto out;
-	}
-out:
-	if(ifc.ifc_buf != NULL)
-		kfree (ifc.ifc_buf);
-	return err;
-}
-
-int siocdevprivate_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct ifreq *u_ifreq64;
-	struct ifreq32 *u_ifreq32 = (struct ifreq32 *) arg;
-	char tmp_buf[IFNAMSIZ];
-	void *data64;
-	u32 data32;
-
-	if (copy_from_user(&tmp_buf[0], &(u_ifreq32->ifr_ifrn.ifrn_name[0]),
-			   IFNAMSIZ))
-		return -EFAULT;
-	if (__get_user(data32, &u_ifreq32->ifr_ifru.ifru_data))
-		return -EFAULT;
-	data64 = (void *) A(data32);
-
-	u_ifreq64 = compat_alloc_user_space(sizeof(*u_ifreq64));
-
-	/* Don't check these user accesses, just let that get trapped
-	 * in the ioctl handler instead.
-	 */
-	copy_to_user(&u_ifreq64->ifr_ifrn.ifrn_name[0], &tmp_buf[0], IFNAMSIZ);
-	__put_user(data64, &u_ifreq64->ifr_ifru.ifru_data);
-
-	return sys_ioctl(fd, cmd, (unsigned long) u_ifreq64);
-}
-
-static int dev_ifsioc(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct ifreq ifr;
-	mm_segment_t old_fs;
-	int err;
-	
-	switch (cmd) {
-	case SIOCSIFMAP:
-		err = copy_from_user(&ifr, (struct ifreq32 *)arg, sizeof(ifr.ifr_name));
-		err |= __get_user(ifr.ifr_map.mem_start, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.mem_start));
-		err |= __get_user(ifr.ifr_map.mem_end, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.mem_end));
-		err |= __get_user(ifr.ifr_map.base_addr, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.base_addr));
-		err |= __get_user(ifr.ifr_map.irq, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.irq));
-		err |= __get_user(ifr.ifr_map.dma, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.dma));
-		err |= __get_user(ifr.ifr_map.port, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.port));
-		if (err)
-			return -EFAULT;
-		break;
-	default:
-		if (copy_from_user(&ifr, (struct ifreq32 *)arg, sizeof(struct ifreq32)))
-			return -EFAULT;
-		break;
-	}
-	old_fs = get_fs();
-	set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, cmd, (unsigned long)&ifr);
-	set_fs (old_fs);
-	if (!err) {
-		switch (cmd) {
-		case SIOCGIFFLAGS:
-		case SIOCGIFMETRIC:
-		case SIOCGIFMTU:
-		case SIOCGIFMEM:
-		case SIOCGIFHWADDR:
-		case SIOCGIFINDEX:
-		case SIOCGIFADDR:
-		case SIOCGIFBRDADDR:
-		case SIOCGIFDSTADDR:
-		case SIOCGIFNETMASK:
-		case SIOCGIFTXQLEN:
-			if (copy_to_user((struct ifreq32 *)arg, &ifr, sizeof(struct ifreq32)))
-				return -EFAULT;
-			break;
-		case SIOCGIFMAP:
-			err = copy_to_user((struct ifreq32 *)arg, &ifr, sizeof(ifr.ifr_name));
-			err |= __put_user(ifr.ifr_map.mem_start, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.mem_start));
-			err |= __put_user(ifr.ifr_map.mem_end, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.mem_end));
-			err |= __put_user(ifr.ifr_map.base_addr, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.base_addr));
-			err |= __put_user(ifr.ifr_map.irq, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.irq));
-			err |= __put_user(ifr.ifr_map.dma, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.dma));
-			err |= __put_user(ifr.ifr_map.port, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_map.port));
-			if (err)
-				err = -EFAULT;
-			break;
-		}
-	}
-	return err;
-}
-
-struct rtentry32
-{
-	unsigned int	rt_pad1;
-	struct sockaddr	rt_dst;		/* target address		*/
-	struct sockaddr	rt_gateway;	/* gateway addr (RTF_GATEWAY)	*/
-	struct sockaddr	rt_genmask;	/* target network mask (IP)	*/
-	unsigned short	rt_flags;
-	short		rt_pad2;
-	unsigned int	rt_pad3;
-	unsigned int	rt_pad4;
-	short		rt_metric;	/* +1 for binary compatibility!	*/
-	unsigned int	rt_dev;		/* forcing the device at add	*/
-	unsigned int	rt_mtu;		/* per route MTU/Window 	*/
-#ifndef __KERNEL__
-#define rt_mss	rt_mtu			/* Compatibility :-(            */
-#endif
-	unsigned int	rt_window;	/* Window clamping 		*/
-	unsigned short	rt_irtt;	/* Initial RTT			*/
-};
-
-static inline int routing_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct rtentry32 *ur = (struct rtentry32 *)arg;
-	struct rtentry r;
-	char devname[16];
-	u32 rtdev;
-	int ret;
-	mm_segment_t old_fs = get_fs();
-
-	ret = copy_from_user (&r.rt_dst, &(ur->rt_dst), 3 * sizeof(struct sockaddr));
-	ret |= __get_user (r.rt_flags, &(ur->rt_flags));
-	ret |= __get_user (r.rt_metric, &(ur->rt_metric));
-	ret |= __get_user (r.rt_mtu, &(ur->rt_mtu));
-	ret |= __get_user (r.rt_window, &(ur->rt_window));
-	ret |= __get_user (r.rt_irtt, &(ur->rt_irtt));
-	ret |= __get_user (rtdev, &(ur->rt_dev));
-	if (rtdev) {
-		ret |= copy_from_user (devname, (char *)A(rtdev), 15);
-		r.rt_dev = devname; devname[15] = 0;
-	} else
-		r.rt_dev = 0;
-	if (ret)
-		return -EFAULT;
-	set_fs (KERNEL_DS);
-	ret = sys_ioctl (fd, cmd, (long)&r);
-	set_fs (old_fs);
-	return ret;
-}
-
-#endif /* CONFIG_NET */
-
-static int do_ext2_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	/* These are just misnamed, they actually get/put from/to user an int */
-	switch (cmd) {
-	case EXT2_IOC32_GETFLAGS: cmd = EXT2_IOC_GETFLAGS; break;
-	case EXT2_IOC32_SETFLAGS: cmd = EXT2_IOC_SETFLAGS; break;
-	case EXT2_IOC32_GETVERSION: cmd = EXT2_IOC_GETVERSION; break;
-	case EXT2_IOC32_SETVERSION: cmd = EXT2_IOC_SETVERSION; break;
-	}
-	return sys_ioctl(fd, cmd, arg);
-}
-
-struct hd_geometry32 {
-	unsigned char heads;
-	unsigned char sectors;
-	unsigned short cylinders;
-	u32 start;
-};
-
-static int hdio_getgeo(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	struct hd_geometry geo;
-	int err;
-
-	set_fs (KERNEL_DS);
-	err = sys_ioctl(fd, HDIO_GETGEO, (unsigned long)&geo);
-	set_fs (old_fs);
-	if (!err) {
-		err = copy_to_user ((struct hd_geometry32 *)arg, &geo, 4);
-		err |= __put_user (geo.start, &(((struct hd_geometry32 *)arg)->start));
-	}
-
-	return err ? -EFAULT : 0;
-}
-
-static int hdio_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	unsigned long kval;
-	unsigned int *uvp;
-	int error;
-
-	set_fs(KERNEL_DS);
-	error = sys_ioctl(fd, cmd, (long)&kval);
-	set_fs(old_fs);
-
-	if (error == 0) {
-		uvp = (unsigned int *)arg;
-		if (put_user(kval, uvp))
-			error = -EFAULT;
-	}
-
-	return error;
-}
-
-static int ret_einval(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	return -EINVAL;
-}
-
-struct blkpg_ioctl_arg32 {
-	int op;
-	int flags;
-	int datalen;
-	u32 data;
-};
-
-static int blkpg_ioctl_trans(unsigned int fd, unsigned int cmd,
-                             struct blkpg_ioctl_arg32 *arg)
-{
-	struct blkpg_ioctl_arg a;
-	struct blkpg_partition p;
-	int err;
-	mm_segment_t old_fs = get_fs();
-
-	err = get_user(a.op, &arg->op);
-	err |= __get_user(a.flags, &arg->flags);
-	err |= __get_user(a.datalen, &arg->datalen);
-	err |= __get_user((long)a.data, &arg->data);
-	if (err) return err;
-	switch (a.op) {
-	case BLKPG_ADD_PARTITION:
-	case BLKPG_DEL_PARTITION:
-		if (a.datalen < sizeof(struct blkpg_partition))
-			return -EINVAL;
-                if (copy_from_user(&p, a.data, sizeof(struct blkpg_partition)))
-			return -EFAULT;
-		a.data = &p;
-		set_fs (KERNEL_DS);
-		err = sys_ioctl(fd, cmd, (unsigned long)&a);
-		set_fs (old_fs);
-	default:
-		return -EINVAL;
-	}
-	return err;
-}
-
-struct mtget32 {
-	__u32	mt_type;
-	__u32	mt_resid;
-	__u32	mt_dsreg;
-	__u32	mt_gstat;
-	__u32	mt_erreg;
-	compat_daddr_t	mt_fileno;
-	compat_daddr_t	mt_blkno;
-};
-#define MTIOCGET32	_IOR('m', 2, struct mtget32)
-
-struct mtpos32 {
-	__u32	mt_blkno;
-};
-#define MTIOCPOS32	_IOR('m', 3, struct mtpos32)
-
-struct mtconfiginfo32 {
-	__u32	mt_type;
-	__u32	ifc_type;
-	__u16	irqnr;
-	__u16	dmanr;
-	__u16	port;
-	__u32	debug;
-	__u32	have_dens:1;
-	__u32	have_bsf:1;
-	__u32	have_fsr:1;
-	__u32	have_bsr:1;
-	__u32	have_eod:1;
-	__u32	have_seek:1;
-	__u32	have_tell:1;
-	__u32	have_ras1:1;
-	__u32	have_ras2:1;
-	__u32	have_ras3:1;
-	__u32	have_qfa:1;
-	__u32	pad1:5;
-	char	reserved[10];
-};
-#define	MTIOCGETCONFIG32	_IOR('m', 4, struct mtconfiginfo32)
-#define	MTIOCSETCONFIG32	_IOW('m', 5, struct mtconfiginfo32)
-
-static int mt_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	struct mtconfiginfo info;
-	struct mtget get;
-	struct mtpos pos;
-	unsigned long kcmd;
-	void *karg;
-	int err = 0;
-
-	switch(cmd) {
-	case MTIOCPOS32:
-		kcmd = MTIOCPOS;
-		karg = &pos;
-		break;
-	case MTIOCGET32:
-		kcmd = MTIOCGET;
-		karg = &get;
-		break;
-	case MTIOCGETCONFIG32:
-		kcmd = MTIOCGETCONFIG;
-		karg = &info;
-		break;
-	case MTIOCSETCONFIG32:
-		kcmd = MTIOCSETCONFIG;
-		karg = &info;
-		err = __get_user(info.mt_type, &((struct mtconfiginfo32 *)arg)->mt_type);
-		err |= __get_user(info.ifc_type, &((struct mtconfiginfo32 *)arg)->ifc_type);
-		err |= __get_user(info.irqnr, &((struct mtconfiginfo32 *)arg)->irqnr);
-		err |= __get_user(info.dmanr, &((struct mtconfiginfo32 *)arg)->dmanr);
-		err |= __get_user(info.port, &((struct mtconfiginfo32 *)arg)->port);
-		err |= __get_user(info.debug, &((struct mtconfiginfo32 *)arg)->debug);
-		err |= __copy_from_user((char *)&info.debug + sizeof(info.debug),
-				     (char *)&((struct mtconfiginfo32 *)arg)->debug
-				     + sizeof(((struct mtconfiginfo32 *)arg)->debug), sizeof(__u32));
-		if (err)
-			return -EFAULT;
-		break;
-	default:
-		do {
-			static int count = 0;
-			if (++count <= 20)
-				printk("mt_ioctl: Unknown cmd fd(%d) "
-				       "cmd(%08x) arg(%08x)\n",
-				       (int)fd, (unsigned int)cmd, (unsigned int)arg);
-		} while(0);
-		return -EINVAL;
-	}
-	set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, kcmd, (unsigned long)karg);
-	set_fs (old_fs);
-	if (err)
-		return err;
-	switch (cmd) {
-	case MTIOCPOS32:
-		err = __put_user(pos.mt_blkno, &((struct mtpos32 *)arg)->mt_blkno);
-		break;
-	case MTIOCGET32:
-		err = __put_user(get.mt_type, &((struct mtget32 *)arg)->mt_type);
-		err |= __put_user(get.mt_resid, &((struct mtget32 *)arg)->mt_resid);
-		err |= __put_user(get.mt_dsreg, &((struct mtget32 *)arg)->mt_dsreg);
-		err |= __put_user(get.mt_gstat, &((struct mtget32 *)arg)->mt_gstat);
-		err |= __put_user(get.mt_erreg, &((struct mtget32 *)arg)->mt_erreg);
-		err |= __put_user(get.mt_fileno, &((struct mtget32 *)arg)->mt_fileno);
-		err |= __put_user(get.mt_blkno, &((struct mtget32 *)arg)->mt_blkno);
-		break;
-	case MTIOCGETCONFIG32:
-		err = __put_user(info.mt_type, &((struct mtconfiginfo32 *)arg)->mt_type);
-		err |= __put_user(info.ifc_type, &((struct mtconfiginfo32 *)arg)->ifc_type);
-		err |= __put_user(info.irqnr, &((struct mtconfiginfo32 *)arg)->irqnr);
-		err |= __put_user(info.dmanr, &((struct mtconfiginfo32 *)arg)->dmanr);
-		err |= __put_user(info.port, &((struct mtconfiginfo32 *)arg)->port);
-		err |= __put_user(info.debug, &((struct mtconfiginfo32 *)arg)->debug);
-		err |= __copy_to_user((char *)&((struct mtconfiginfo32 *)arg)->debug
-			    		   + sizeof(((struct mtconfiginfo32 *)arg)->debug),
-					   (char *)&info.debug + sizeof(info.debug), sizeof(__u32));
-		break;
-	case MTIOCSETCONFIG32:
-		break;
-	}
-	return err ? -EFAULT: 0;
-}
-
-#define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,unsigned int)
-
-static int ioc_settimeout(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	return rw_long(fd, AUTOFS_IOC_SETTIMEOUT, arg);
-}
-
-#ifdef CONFIG_VT
-
-extern int tty_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned long arg);
-
-static int vt_check(struct file *file)
-{
-	struct tty_struct *tty;
-	struct inode *inode = file->f_dentry->d_inode;
-	
-	if (file->f_op->ioctl != tty_ioctl)
-		return -EINVAL;
-	                
-	tty = (struct tty_struct *)file->private_data;
-	if (tty_paranoia_check(tty, inode, "tty_ioctl"))
-		return -EINVAL;
-	                                                
-	if (tty->driver->ioctl != vt_ioctl)
-		return -EINVAL;
-	
-	/*
-	 * To have permissions to do most of the vt ioctls, we either have
-	 * to be the owner of the tty, or super-user.
-	 */
-	if (current->tty == tty || capable(CAP_SYS_TTY_CONFIG))
-		return 1;
-	return 0;
-}
-
-struct consolefontdesc32 {
-	unsigned short charcount;       /* characters in font (256 or 512) */
-	unsigned short charheight;      /* scan lines per character (1-32) */
-	u32 chardata;			/* font data in expanded form */
-};
-
-static int do_fontx_ioctl(unsigned int fd, int cmd, struct consolefontdesc32 *user_cfd, struct file *file)
-{
-	struct consolefontdesc cfdarg;
-	struct console_font_op op;
-	int i, perm;
-
-	perm = vt_check(file);
-	if (perm < 0) return perm;
-	
-	if (copy_from_user(&cfdarg, user_cfd, sizeof(struct consolefontdesc32)))
-		return -EFAULT;
-	
-	cfdarg.chardata = (unsigned char *)A(((struct consolefontdesc32 *)&cfdarg)->chardata);
- 	
-	switch (cmd) {
-	case PIO_FONTX:
-		if (!perm)
-			return -EPERM;
-		op.op = KD_FONT_OP_SET;
-		op.flags = 0;
-		op.width = 8;
-		op.height = cfdarg.charheight;
-		op.charcount = cfdarg.charcount;
-		op.data = cfdarg.chardata;
-		return con_font_op(fg_console, &op);
-	case GIO_FONTX:
-		if (!cfdarg.chardata)
-			return 0;
-		op.op = KD_FONT_OP_GET;
-		op.flags = 0;
-		op.width = 8;
-		op.height = cfdarg.charheight;
-		op.charcount = cfdarg.charcount;
-		op.data = cfdarg.chardata;
-		i = con_font_op(fg_console, &op);
-		if (i)
-			return i;
-		cfdarg.charheight = op.height;
-		cfdarg.charcount = op.charcount;
-		((struct consolefontdesc32 *)&cfdarg)->chardata	= (unsigned long)cfdarg.chardata;
-		if (copy_to_user(user_cfd, &cfdarg, sizeof(struct consolefontdesc32)))
-			return -EFAULT;
-		return 0;
-	}
-	return -EINVAL;
-}
-
-struct console_font_op32 {
-	unsigned int op;        /* operation code KD_FONT_OP_* */
-	unsigned int flags;     /* KD_FONT_FLAG_* */
-	unsigned int width, height;     /* font size */
-	unsigned int charcount;
-	u32 data;    /* font data with height fixed to 32 */
-};
-                                        
-static int do_kdfontop_ioctl(unsigned int fd, unsigned int cmd, struct console_font_op32 *fontop, struct file *file)
-{
-	struct console_font_op op;
-	int perm = vt_check(file), i;
-	struct vt_struct *vt;
-	
-	if (perm < 0) return perm;
-	
-	if (copy_from_user(&op, (void *) fontop, sizeof(struct console_font_op32)))
-		return -EFAULT;
-	if (!perm && op.op != KD_FONT_OP_GET)
-		return -EPERM;
-	op.data = (unsigned char *)A(((struct console_font_op32 *)&op)->data);
-	op.flags |= KD_FONT_FLAG_OLD;
-	vt = (struct vt_struct *)((struct tty_struct *)file->private_data)->driver_data;
-	i = con_font_op(vt->vc_num, &op);
-	if (i) return i;
-	((struct console_font_op32 *)&op)->data = (unsigned long)op.data;
-	if (copy_to_user((void *) fontop, &op, sizeof(struct console_font_op32)))
-		return -EFAULT;
-	return 0;
-}
-
-#endif
+#define CODE
+#include "compat_ioctl.c"
 
 typedef int (* ioctl32_handler_t)(unsigned int, unsigned int, unsigned long, struct file *);
                                                                                 
@@ -936,340 +36,10 @@ typedef int (* ioctl32_handler_t)(unsign
 	};
 
 IOCTL_TABLE_START
-#include <linux/compat_ioctl.h>
-COMPATIBLE_IOCTL(TCGETA)
-COMPATIBLE_IOCTL(TCSETA)
-COMPATIBLE_IOCTL(TCSETAW)
-COMPATIBLE_IOCTL(TCSETAF)
-COMPATIBLE_IOCTL(TCSBRK)
-COMPATIBLE_IOCTL(TCSBRKP)
-COMPATIBLE_IOCTL(TCXONC)
-COMPATIBLE_IOCTL(TCFLSH)
-COMPATIBLE_IOCTL(TCGETS)
-COMPATIBLE_IOCTL(TCSETS)
-COMPATIBLE_IOCTL(TCSETSW)
-COMPATIBLE_IOCTL(TCSETSF)
-COMPATIBLE_IOCTL(TIOCLINUX)
-
-COMPATIBLE_IOCTL(TIOCGETD)
-COMPATIBLE_IOCTL(TIOCSETD)
-COMPATIBLE_IOCTL(TIOCEXCL)
-COMPATIBLE_IOCTL(TIOCNXCL)
-COMPATIBLE_IOCTL(TIOCCONS)
-COMPATIBLE_IOCTL(TIOCGSOFTCAR)
-COMPATIBLE_IOCTL(TIOCSSOFTCAR)
-COMPATIBLE_IOCTL(TIOCSWINSZ)
-COMPATIBLE_IOCTL(TIOCGWINSZ)
-COMPATIBLE_IOCTL(TIOCMGET)
-COMPATIBLE_IOCTL(TIOCMBIC)
-COMPATIBLE_IOCTL(TIOCMBIS)
-COMPATIBLE_IOCTL(TIOCMSET)
-COMPATIBLE_IOCTL(TIOCPKT)
-COMPATIBLE_IOCTL(TIOCNOTTY)
-COMPATIBLE_IOCTL(TIOCSTI)
-COMPATIBLE_IOCTL(TIOCOUTQ)
-COMPATIBLE_IOCTL(TIOCSPGRP)
-COMPATIBLE_IOCTL(TIOCGPGRP)
-COMPATIBLE_IOCTL(TIOCSCTTY)
-COMPATIBLE_IOCTL(TIOCGPTN)
-COMPATIBLE_IOCTL(TIOCSPTLCK)
-COMPATIBLE_IOCTL(TIOCGSERIAL)
-COMPATIBLE_IOCTL(TIOCSSERIAL)
-COMPATIBLE_IOCTL(TIOCSERGETLSR)
-
-COMPATIBLE_IOCTL(FIOCLEX)
-COMPATIBLE_IOCTL(FIONCLEX)
-COMPATIBLE_IOCTL(FIOASYNC)
-COMPATIBLE_IOCTL(FIONBIO)
-COMPATIBLE_IOCTL(FIONREAD)
-
-#ifdef CONFIG_FB
-/* Big F */
-COMPATIBLE_IOCTL(FBIOGET_VSCREENINFO)
-COMPATIBLE_IOCTL(FBIOPUT_VSCREENINFO)
-HANDLE_IOCTL(FBIOGET_FSCREENINFO, do_fbioget_fscreeninfo_ioctl)
-HANDLE_IOCTL(FBIOGETCMAP, do_fbiocmap_ioctl)
-HANDLE_IOCTL(FBIOPUTCMAP, do_fbiocmap_ioctl)
-COMPATIBLE_IOCTL(FBIOPAN_DISPLAY)
-#endif /* CONFIG_FB */
-
-#ifdef CONFIG_VT
-/* Big K */
-COMPATIBLE_IOCTL(PIO_FONT)
-COMPATIBLE_IOCTL(GIO_FONT)
-COMPATIBLE_IOCTL(KDSIGACCEPT)
-COMPATIBLE_IOCTL(KDGETKEYCODE)
-COMPATIBLE_IOCTL(KDSETKEYCODE)
-COMPATIBLE_IOCTL(KIOCSOUND)
-COMPATIBLE_IOCTL(KDMKTONE)
-COMPATIBLE_IOCTL(KDGKBTYPE)
-COMPATIBLE_IOCTL(KDSETMODE)
-COMPATIBLE_IOCTL(KDGETMODE)
-COMPATIBLE_IOCTL(KDSKBMODE)
-COMPATIBLE_IOCTL(KDGKBMODE)
-COMPATIBLE_IOCTL(KDSKBMETA)
-COMPATIBLE_IOCTL(KDGKBMETA)
-COMPATIBLE_IOCTL(KDGKBENT)
-COMPATIBLE_IOCTL(KDSKBENT)
-COMPATIBLE_IOCTL(KDGKBSENT)
-COMPATIBLE_IOCTL(KDSKBSENT)
-COMPATIBLE_IOCTL(KDGKBDIACR)
-COMPATIBLE_IOCTL(KDSKBDIACR)
-COMPATIBLE_IOCTL(KDKBDREP)
-COMPATIBLE_IOCTL(KDGKBLED)
-COMPATIBLE_IOCTL(KDSKBLED)
-COMPATIBLE_IOCTL(KDGETLED)
-COMPATIBLE_IOCTL(KDSETLED)
-COMPATIBLE_IOCTL(GIO_SCRNMAP)
-COMPATIBLE_IOCTL(PIO_SCRNMAP)
-COMPATIBLE_IOCTL(GIO_UNISCRNMAP)
-COMPATIBLE_IOCTL(PIO_UNISCRNMAP)
-COMPATIBLE_IOCTL(PIO_FONTRESET)
-COMPATIBLE_IOCTL(PIO_UNIMAPCLR)
-HANDLE_IOCTL(PIO_FONTX, do_fontx_ioctl)
-HANDLE_IOCTL(KDFONTOP, do_kdfontop_ioctl)
-
-/* Big V */
-COMPATIBLE_IOCTL(VT_SETMODE)
-COMPATIBLE_IOCTL(VT_GETMODE)
-COMPATIBLE_IOCTL(VT_GETSTATE)
-COMPATIBLE_IOCTL(VT_OPENQRY)
-COMPATIBLE_IOCTL(VT_ACTIVATE)
-COMPATIBLE_IOCTL(VT_WAITACTIVE)
-COMPATIBLE_IOCTL(VT_RELDISP)
-COMPATIBLE_IOCTL(VT_DISALLOCATE)
-COMPATIBLE_IOCTL(VT_RESIZE)
-COMPATIBLE_IOCTL(VT_RESIZEX)
-COMPATIBLE_IOCTL(VT_LOCKSWITCH)
-COMPATIBLE_IOCTL(VT_UNLOCKSWITCH)
-#endif
-
-/* Big S */
-COMPATIBLE_IOCTL(SCSI_IOCTL_GET_IDLUN)
-COMPATIBLE_IOCTL(SCSI_IOCTL_DOORLOCK)
-COMPATIBLE_IOCTL(SCSI_IOCTL_DOORUNLOCK)
-COMPATIBLE_IOCTL(SCSI_IOCTL_TEST_UNIT_READY)
-COMPATIBLE_IOCTL(SCSI_IOCTL_GET_BUS_NUMBER)
-COMPATIBLE_IOCTL(SCSI_IOCTL_SEND_COMMAND)
 
-/* Socket level stuff */
-COMPATIBLE_IOCTL(FIOSETOWN)
-COMPATIBLE_IOCTL(SIOCSPGRP)
-COMPATIBLE_IOCTL(FIOGETOWN)
-COMPATIBLE_IOCTL(SIOCGPGRP)
-COMPATIBLE_IOCTL(SIOCATMARK)
-COMPATIBLE_IOCTL(SIOCSIFLINK)
-COMPATIBLE_IOCTL(SIOCSIFENCAP)
-COMPATIBLE_IOCTL(SIOCGIFENCAP)
-COMPATIBLE_IOCTL(SIOCSIFBR)
-COMPATIBLE_IOCTL(SIOCGIFBR)
-COMPATIBLE_IOCTL(SIOCSARP)
-COMPATIBLE_IOCTL(SIOCGARP)
-COMPATIBLE_IOCTL(SIOCDARP)
-COMPATIBLE_IOCTL(SIOCSRARP)
-COMPATIBLE_IOCTL(SIOCGRARP)
-COMPATIBLE_IOCTL(SIOCDRARP)
-COMPATIBLE_IOCTL(SIOCADDDLCI)
-COMPATIBLE_IOCTL(SIOCDELDLCI)
-/* SG stuff */
-COMPATIBLE_IOCTL(SG_SET_TIMEOUT)
-COMPATIBLE_IOCTL(SG_GET_TIMEOUT)
-COMPATIBLE_IOCTL(SG_EMULATED_HOST)
-COMPATIBLE_IOCTL(SG_SET_TRANSFORM)
-COMPATIBLE_IOCTL(SG_GET_TRANSFORM)
-COMPATIBLE_IOCTL(SG_SET_RESERVED_SIZE)
-COMPATIBLE_IOCTL(SG_GET_RESERVED_SIZE)
-COMPATIBLE_IOCTL(SG_GET_SCSI_ID)
-COMPATIBLE_IOCTL(SG_SET_FORCE_LOW_DMA)
-COMPATIBLE_IOCTL(SG_GET_LOW_DMA)
-COMPATIBLE_IOCTL(SG_SET_FORCE_PACK_ID)
-COMPATIBLE_IOCTL(SG_GET_PACK_ID)
-COMPATIBLE_IOCTL(SG_GET_NUM_WAITING)
-COMPATIBLE_IOCTL(SG_SET_DEBUG)
-COMPATIBLE_IOCTL(SG_GET_SG_TABLESIZE)
-COMPATIBLE_IOCTL(SG_GET_COMMAND_Q)
-COMPATIBLE_IOCTL(SG_SET_COMMAND_Q)
-COMPATIBLE_IOCTL(SG_GET_VERSION_NUM)
-COMPATIBLE_IOCTL(SG_NEXT_CMD_LEN)
-COMPATIBLE_IOCTL(SG_SCSI_RESET)
-COMPATIBLE_IOCTL(SG_IO)
-COMPATIBLE_IOCTL(SG_GET_REQUEST_TABLE)
-COMPATIBLE_IOCTL(SG_SET_KEEP_ORPHAN)
-COMPATIBLE_IOCTL(SG_GET_KEEP_ORPHAN)
-/* PPP stuff */
-COMPATIBLE_IOCTL(PPPIOCGFLAGS)
-COMPATIBLE_IOCTL(PPPIOCSFLAGS)
-COMPATIBLE_IOCTL(PPPIOCGASYNCMAP)
-COMPATIBLE_IOCTL(PPPIOCSASYNCMAP)
-COMPATIBLE_IOCTL(PPPIOCGUNIT)
-COMPATIBLE_IOCTL(PPPIOCGRASYNCMAP)
-COMPATIBLE_IOCTL(PPPIOCSRASYNCMAP)
-COMPATIBLE_IOCTL(PPPIOCGMRU)
-COMPATIBLE_IOCTL(PPPIOCSMRU)
-COMPATIBLE_IOCTL(PPPIOCSMAXCID)
-COMPATIBLE_IOCTL(PPPIOCGXASYNCMAP)
-COMPATIBLE_IOCTL(PPPIOCSXASYNCMAP)
-COMPATIBLE_IOCTL(PPPIOCXFERUNIT)
-COMPATIBLE_IOCTL(PPPIOCGNPMODE)
-COMPATIBLE_IOCTL(PPPIOCSNPMODE)
-COMPATIBLE_IOCTL(PPPIOCGDEBUG)
-COMPATIBLE_IOCTL(PPPIOCSDEBUG)
-COMPATIBLE_IOCTL(PPPIOCNEWUNIT)
-COMPATIBLE_IOCTL(PPPIOCATTACH)
-COMPATIBLE_IOCTL(PPPIOCGCHAN)
-/* PPPOX */
-COMPATIBLE_IOCTL(PPPOEIOCSFWD)
-COMPATIBLE_IOCTL(PPPOEIOCDFWD)
-/* CDROM stuff */
-COMPATIBLE_IOCTL(CDROMPAUSE)
-COMPATIBLE_IOCTL(CDROMRESUME)
-COMPATIBLE_IOCTL(CDROMPLAYMSF)
-COMPATIBLE_IOCTL(CDROMPLAYTRKIND)
-COMPATIBLE_IOCTL(CDROMREADTOCHDR)
-COMPATIBLE_IOCTL(CDROMREADTOCENTRY)
-COMPATIBLE_IOCTL(CDROMSTOP)
-COMPATIBLE_IOCTL(CDROMSTART)
-COMPATIBLE_IOCTL(CDROMEJECT)
-COMPATIBLE_IOCTL(CDROMVOLCTRL)
-COMPATIBLE_IOCTL(CDROMSUBCHNL)
-COMPATIBLE_IOCTL(CDROMEJECT_SW)
-COMPATIBLE_IOCTL(CDROMMULTISESSION)
-COMPATIBLE_IOCTL(CDROM_GET_MCN)
-COMPATIBLE_IOCTL(CDROMRESET)
-COMPATIBLE_IOCTL(CDROMVOLREAD)
-COMPATIBLE_IOCTL(CDROMSEEK)
-COMPATIBLE_IOCTL(CDROMPLAYBLK)
-COMPATIBLE_IOCTL(CDROMCLOSETRAY)
-COMPATIBLE_IOCTL(CDROM_SET_OPTIONS)
-COMPATIBLE_IOCTL(CDROM_CLEAR_OPTIONS)
-COMPATIBLE_IOCTL(CDROM_SELECT_SPEED)
-COMPATIBLE_IOCTL(CDROM_SELECT_DISC)
-COMPATIBLE_IOCTL(CDROM_MEDIA_CHANGED)
-COMPATIBLE_IOCTL(CDROM_DRIVE_STATUS)
-COMPATIBLE_IOCTL(CDROM_DISC_STATUS)
-COMPATIBLE_IOCTL(CDROM_CHANGER_NSLOTS)
-COMPATIBLE_IOCTL(CDROM_LOCKDOOR)
-COMPATIBLE_IOCTL(CDROM_DEBUG)
-COMPATIBLE_IOCTL(CDROM_GET_CAPABILITY)
-/* DVD ioctls */
-COMPATIBLE_IOCTL(DVD_READ_STRUCT)
-COMPATIBLE_IOCTL(DVD_WRITE_STRUCT)
-COMPATIBLE_IOCTL(DVD_AUTH)
-/* Big L */
-COMPATIBLE_IOCTL(LOOP_SET_FD)
-COMPATIBLE_IOCTL(LOOP_CLR_FD)
-
-#ifdef CONFIG_NET
-/* And these ioctls need translation */
-HANDLE_IOCTL(SIOCGIFNAME, dev_ifname32)
-HANDLE_IOCTL(SIOCGIFCONF, dev_ifconf)
-HANDLE_IOCTL(SIOCGIFFLAGS, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFFLAGS, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFMETRIC, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFMETRIC, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFMTU, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFMTU, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFMEM, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFMEM, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFHWADDR, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFHWADDR, dev_ifsioc)
-HANDLE_IOCTL(SIOCADDMULTI, dev_ifsioc)
-HANDLE_IOCTL(SIOCDELMULTI, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFINDEX, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFMAP, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFMAP, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFADDR, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFADDR, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFBRDADDR, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFBRDADDR, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFDSTADDR, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFDSTADDR, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFNETMASK, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFNETMASK, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFPFLAGS, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFPFLAGS, dev_ifsioc)
-HANDLE_IOCTL(SIOCGPPPSTATS, dev_ifsioc)
-HANDLE_IOCTL(SIOCGPPPCSTATS, dev_ifsioc)
-HANDLE_IOCTL(SIOCGPPPVER, dev_ifsioc)
-HANDLE_IOCTL(SIOCGIFTXQLEN, dev_ifsioc)
-HANDLE_IOCTL(SIOCSIFTXQLEN, dev_ifsioc)
-HANDLE_IOCTL(SIOCADDRT, routing_ioctl)
-HANDLE_IOCTL(SIOCDELRT, routing_ioctl)
-/*
- * Note SIOCRTMSG is no longer, so this is safe and * the user would
- * have seen just an -EINVAL anyways.
- */
-HANDLE_IOCTL(SIOCRTMSG, ret_einval)
-HANDLE_IOCTL(SIOCGSTAMP, do_siocgstamp)
-#endif /* CONFIG_NET */
-
-HANDLE_IOCTL(EXT2_IOC32_GETFLAGS, do_ext2_ioctl)
-HANDLE_IOCTL(EXT2_IOC32_SETFLAGS, do_ext2_ioctl)
-HANDLE_IOCTL(EXT2_IOC32_GETVERSION, do_ext2_ioctl)
-HANDLE_IOCTL(EXT2_IOC32_SETVERSION, do_ext2_ioctl)
-
-HANDLE_IOCTL(HDIO_GETGEO, hdio_getgeo)		/* hdreg.h ioctls  */
-HANDLE_IOCTL(HDIO_GET_UNMASKINTR, hdio_ioctl_trans)
-HANDLE_IOCTL(HDIO_GET_MULTCOUNT, hdio_ioctl_trans)
-// HDIO_OBSOLETE_IDENTITY
-//HANDLE_IOCTL(HDIO_GET_KEEPSETTINGS, hdio_ioctl_trans)
-HANDLE_IOCTL(HDIO_GET_32BIT, hdio_ioctl_trans)
-HANDLE_IOCTL(HDIO_GET_NOWERR, hdio_ioctl_trans)
-HANDLE_IOCTL(HDIO_GET_DMA, hdio_ioctl_trans)
-HANDLE_IOCTL(HDIO_GET_NICE, hdio_ioctl_trans)
-COMPATIBLE_IOCTL(HDIO_GET_IDENTITY)
-// HDIO_TRISTATE_HWIF				/* not implemented */
-// HDIO_DRIVE_TASK				/* To do, need specs */
-COMPATIBLE_IOCTL(HDIO_DRIVE_CMD)
-COMPATIBLE_IOCTL(HDIO_SET_MULTCOUNT)
-COMPATIBLE_IOCTL(HDIO_SET_UNMASKINTR)
-//COMPATIBLE_IOCTL(HDIO_SET_KEEPSETTINGS)
-COMPATIBLE_IOCTL(HDIO_SET_32BIT)
-COMPATIBLE_IOCTL(HDIO_SET_NOWERR)
-COMPATIBLE_IOCTL(HDIO_SET_DMA)
-COMPATIBLE_IOCTL(HDIO_SET_PIO_MODE)
-COMPATIBLE_IOCTL(HDIO_SET_NICE)
-
-COMPATIBLE_IOCTL(BLKROSET)			/* fs.h ioctls  */
-COMPATIBLE_IOCTL(BLKROGET)
-COMPATIBLE_IOCTL(BLKRRPART)
-HANDLE_IOCTL(BLKGETSIZE, w_long)
-
-COMPATIBLE_IOCTL(BLKFLSBUF)
-COMPATIBLE_IOCTL(BLKSECTSET)
-HANDLE_IOCTL(BLKSECTGET, w_long)
-COMPATIBLE_IOCTL(BLKSSZGET)
-HANDLE_IOCTL(BLKPG, blkpg_ioctl_trans)
-COMPATIBLE_IOCTL(BLKBSZGET)
-COMPATIBLE_IOCTL(BLKBSZSET)
-
-#ifdef CONFIG_MD
-/* status */
-COMPATIBLE_IOCTL(RAID_VERSION)
-COMPATIBLE_IOCTL(GET_ARRAY_INFO)
-COMPATIBLE_IOCTL(GET_DISK_INFO)
-COMPATIBLE_IOCTL(PRINT_RAID_DEBUG)
-COMPATIBLE_IOCTL(RAID_AUTORUN)
-
-/* configuration */
-COMPATIBLE_IOCTL(CLEAR_ARRAY)
-COMPATIBLE_IOCTL(ADD_NEW_DISK)
-COMPATIBLE_IOCTL(HOT_REMOVE_DISK)
-COMPATIBLE_IOCTL(SET_ARRAY_INFO)
-COMPATIBLE_IOCTL(SET_DISK_INFO)
-COMPATIBLE_IOCTL(WRITE_RAID_INFO)
-COMPATIBLE_IOCTL(UNPROTECT_ARRAY)
-COMPATIBLE_IOCTL(PROTECT_ARRAY)
-COMPATIBLE_IOCTL(HOT_ADD_DISK)
-COMPATIBLE_IOCTL(SET_DISK_FAULTY)
-
-/* usage */
-COMPATIBLE_IOCTL(RUN_ARRAY)
-COMPATIBLE_IOCTL(START_ARRAY)
-COMPATIBLE_IOCTL(STOP_ARRAY)
-COMPATIBLE_IOCTL(STOP_ARRAY_RO)
-COMPATIBLE_IOCTL(RESTART_ARRAY_RW)
-#endif /* CONFIG_MD */
+#include <linux/compat_ioctl.h>
+#define DECLARES
+#include "compat_ioctl.c"
 
 #ifdef CONFIG_SIBYTE_TBPROF
 COMPATIBLE_IOCTL(SBPROF_ZBSTART)
@@ -1277,46 +47,6 @@ COMPATIBLE_IOCTL(SBPROF_ZBSTOP)
 COMPATIBLE_IOCTL(SBPROF_ZBWAITFULL)
 #endif /* CONFIG_SIBYTE_TBPROF */
 
-COMPATIBLE_IOCTL(MTIOCTOP)			/* mtio.h ioctls  */
-HANDLE_IOCTL(MTIOCGET32, mt_ioctl_trans)
-HANDLE_IOCTL(MTIOCPOS32, mt_ioctl_trans)
-HANDLE_IOCTL(MTIOCGETCONFIG32, mt_ioctl_trans)
-HANDLE_IOCTL(MTIOCSETCONFIG32, mt_ioctl_trans)
-// MTIOCRDFTSEG
-// MTIOCWRFTSEG
-// MTIOCVOLINFO
-// MTIOCGETSIZE
-// MTIOCFTFORMAT
-// MTIOCFTCMD
-
-COMPATIBLE_IOCTL(AUTOFS_IOC_READY)		/* auto_fs.h ioctls */
-COMPATIBLE_IOCTL(AUTOFS_IOC_FAIL)
-COMPATIBLE_IOCTL(AUTOFS_IOC_CATATONIC)
-COMPATIBLE_IOCTL(AUTOFS_IOC_PROTOVER)
-HANDLE_IOCTL(AUTOFS_IOC_SETTIMEOUT32, ioc_settimeout)
-COMPATIBLE_IOCTL(AUTOFS_IOC_EXPIRE)
-COMPATIBLE_IOCTL(AUTOFS_IOC_EXPIRE_MULTI)
-
-/* Little p (/dev/rtc, /dev/envctrl, etc.) */
-COMPATIBLE_IOCTL(_IOR('p', 20, int[7]))		/* RTCGET */
-COMPATIBLE_IOCTL(_IOW('p', 21, int[7]))		/* RTCSET */
-COMPATIBLE_IOCTL(RTC_AIE_ON)
-COMPATIBLE_IOCTL(RTC_AIE_OFF)
-COMPATIBLE_IOCTL(RTC_UIE_ON)
-COMPATIBLE_IOCTL(RTC_UIE_OFF)
-COMPATIBLE_IOCTL(RTC_PIE_ON)
-COMPATIBLE_IOCTL(RTC_PIE_OFF)
-COMPATIBLE_IOCTL(RTC_WIE_ON)
-COMPATIBLE_IOCTL(RTC_WIE_OFF)
-COMPATIBLE_IOCTL(RTC_ALM_SET)
-COMPATIBLE_IOCTL(RTC_ALM_READ)
-COMPATIBLE_IOCTL(RTC_RD_TIME)
-COMPATIBLE_IOCTL(RTC_SET_TIME)
-COMPATIBLE_IOCTL(RTC_WKALM_SET)
-COMPATIBLE_IOCTL(RTC_WKALM_RD)
 IOCTL_TABLE_END
 
 int ioctl_table_size = ARRAY_SIZE(ioctl_start);
-
-#define NR_IOCTL_TRANS		(sizeof(ioctl_translations) /	\
-				 sizeof(ioctl_translations[0]))
--- diff/arch/mips/kernel/irixelf.c	2003-09-30 15:46:11.000000000 +0100
+++ source/arch/mips/kernel/irixelf.c	2004-04-21 10:45:33.643588896 +0100
@@ -31,7 +31,6 @@
 #include <linux/smp_lock.h>
 
 #include <asm/uaccess.h>
-#include <asm/pgalloc.h>
 #include <asm/mipsregs.h>
 #include <asm/prctl.h>
 
@@ -688,7 +687,7 @@ static int load_irix_binary(struct linux
 	 * change some of these later.
 	 */
 	current->mm->rss = 0;
-	setup_arg_pages(bprm);
+	setup_arg_pages(bprm, EXSTACK_DEFAULT);
 	current->mm->start_stack = bprm->p;
 
 	/* At this point, we assume that the image should be loaded at
--- diff/arch/mips/kernel/irq-rm7000.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/kernel/irq-rm7000.c	2004-04-21 10:45:33.644588744 +0100
@@ -21,12 +21,12 @@ static int irq_base;
 
 static inline void unmask_rm7k_irq(unsigned int irq)
 {
-	set_c0_intcontrol(1 << (irq - irq_base));
+	set_c0_intcontrol(0x100 << (irq - irq_base));
 }
 
 static inline void mask_rm7k_irq(unsigned int irq)
 {
-	clear_c0_intcontrol(1 << (irq - irq_base));
+	clear_c0_intcontrol(0x100 << (irq - irq_base));
 }
 
 static inline void rm7k_cpu_irq_enable(unsigned int irq)
@@ -85,6 +85,8 @@ void __init rm7k_cpu_irq_init(int base)
 {
 	int i;
 
+	clear_c0_intcontrol(0x00000f00);		/* Mask all */
+
 	for (i = base; i < base + 4; i++) {
 		irq_desc[i].status = IRQ_DISABLED;
 		irq_desc[i].action = NULL;
--- diff/arch/mips/kernel/linux32.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/kernel/linux32.c	2004-04-21 10:45:33.645588592 +0100
@@ -1650,6 +1650,19 @@ sys32_ipc (u32 call, int first, int seco
 	return err;
 }
 
+asmlinkage long sys32_shmat(int shmid, char __user *shmaddr,
+			  int shmflg, int32_t *addr)
+{
+	unsigned long raddr;
+	int err;
+
+	err = do_shmat(shmid, shmaddr, shmflg, &raddr);
+	if (err)
+		return err;
+
+	return put_user(raddr, addr);
+}
+
 struct sysctl_args32
 {
 	compat_caddr_t name;
--- diff/arch/mips/kernel/module-elf64.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/kernel/module-elf64.c	2004-04-21 10:45:33.646588440 +0100
@@ -1,149 +1,40 @@
-/*  Kernel module help for MIPS.
-    Copyright (C) 2001 Rusty Russell.
+/*
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ *  Copyright (C) 2001 Rusty Russell.
+ *  Copyright (C) 2003, 2004 Ralf Baechle (ralf@linux-mips.org)
+ */
+
+#undef DEBUG
 
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-*/
 #include <linux/moduleloader.h>
 #include <linux/elf.h>
 #include <linux/vmalloc.h>
 #include <linux/slab.h>
 #include <linux/fs.h>
 #include <linux/string.h>
-#include <linux/mm.h>
+#include <linux/kernel.h>
 
 struct mips_hi16 {
 	struct mips_hi16 *next;
 	Elf32_Addr *addr;
-	Elf32_Addr value;
+	Elf64_Addr value;
 };
 
 static struct mips_hi16 *mips_hi16_list;
 
-#if 0
-#define DEBUGP printk
-#else
-#define DEBUGP(fmt , ...)
-#endif
-
-static struct vm_struct * modvmlist = NULL;
-
-void module_unmap(void * addr)
-{
-	struct vm_struct **p, *tmp;
-	int i;
-
-	if (!addr)
-		return;
-	if ((PAGE_SIZE-1) & (unsigned long) addr) {
-		printk("Trying to unmap module with bad address (%p)\n", addr);
-		return;
-	}
-
-	for (p = &modvmlist ; (tmp = *p) ; p = &tmp->next) {
-		if (tmp->addr == addr) {
-			*p = tmp->next;
-			goto found;
-		}
-	}
-	printk("Trying to unmap nonexistent module vm area (%p)\n", addr);
-	return;
-
-found:
-	unmap_vm_area(tmp);
-	
-	for (i = 0; i < tmp->nr_pages; i++) {
-		if (unlikely(!tmp->pages[i]))
-			BUG();
-		__free_page(tmp->pages[i]);
-	}
-
-	kfree(tmp->pages);
-	kfree(tmp);
-}
-
-#define MODULES_LEN	(512*1024*1024)		/* Random silly large number */
-#define MODULES_END	(512*1024*1024)		/* Random silly large number */
-#define MODULES_VADDR	(512*1024*1024)		/* Random silly large number */
-
-void *module_map(unsigned long size)
-{
-	struct vm_struct **p, *tmp, *area;
-	struct page **pages;
-	void * addr;
-	unsigned int nr_pages, array_size, i;
-
-	size = PAGE_ALIGN(size);
-	if (!size || size > MODULES_LEN)
-		return NULL;
-		
-	addr = (void *) MODULES_VADDR;
-	for (p = &modvmlist; (tmp = *p) ; p = &tmp->next) {
-		if (size + (unsigned long) addr < (unsigned long) tmp->addr)
-			break;
-		addr = (void *) (tmp->size + (unsigned long) tmp->addr);
-	}
-	if ((unsigned long) addr + size >= MODULES_END)
-		return NULL;
-	
-	area = (struct vm_struct *) kmalloc(sizeof(*area), GFP_KERNEL);
-	if (!area)
-		return NULL;
-	area->size = size + PAGE_SIZE;
-	area->addr = addr;
-	area->next = *p;
-	area->pages = NULL;
-	area->nr_pages = 0;
-	area->phys_addr = 0;
-	*p = area;
-
-	nr_pages = size >> PAGE_SHIFT;
-	array_size = (nr_pages * sizeof(struct page *));
-
-	area->nr_pages = nr_pages;
-	area->pages = pages = kmalloc(array_size, GFP_KERNEL);
-	if (!area->pages)
-		goto fail;
-
-	memset(area->pages, 0, array_size);
-
-	for (i = 0; i < area->nr_pages; i++) {
-		area->pages[i] = alloc_page(GFP_KERNEL);
-		if (unlikely(!area->pages[i]))
-			goto fail;
-	}
-
-	if (map_vm_area(area, PAGE_KERNEL, &pages)) {
-		unmap_vm_area(area);
-		goto fail;
-	}
-
-	return area->addr;
-
-fail:
-	if (area->pages) {
-		for (i = 0; i < area->nr_pages; i++) {
-			if (area->pages[i])
-				__free_page(area->pages[i]);
-		}
-		kfree(area->pages);
-	}
-	kfree(area);
-
-	return NULL;
-}
-
 void *module_alloc(unsigned long size)
 {
 	if (size == 0)
@@ -168,156 +59,218 @@ int module_frob_arch_sections(Elf_Ehdr *
 	return 0;
 }
 
-int apply_relocate(Elf32_Shdr *sechdrs,
+int apply_relocate(Elf64_Shdr *sechdrs,
 		   const char *strtab,
 		   unsigned int symindex,
 		   unsigned int relsec,
 		   struct module *me)
 {
-	unsigned int i;
-	Elf32_Rel *rel = (void *)sechdrs[relsec].sh_offset;
-	Elf32_Sym *sym;
-	uint32_t *location;
-	Elf32_Addr v;
+	/*
+	 * We don't want to deal with REL relocations - RELA is so much saner.
+	 */
+	if (!sechdrs[relsec].sh_size)
+		return 0;
 
-	DEBUGP("Applying relocate section %u to %u\n", relsec,
-	       sechdrs[relsec].sh_info);
-	for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
-		/* This is where to make the change */
-		location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_offset
-			+ rel[i].r_offset;
-		/* This is the symbol it is referring to */
-		sym = (Elf32_Sym *)sechdrs[symindex].sh_offset
-			+ ELF32_R_SYM(rel[i].r_info);
-		if (!sym->st_value) {
-			printk(KERN_WARNING "%s: Unknown symbol %s\n",
-			       me->name, strtab + sym->st_name);
-			return -ENOENT;
-		}
+	printk(KERN_ERR "module %s: REL relocation unsupported\n",
+	       me->name);
+	return -ENOEXEC;
+}
 
-		v = sym->st_value;
+static int apply_r_mips_none(struct module *me, uint32_t *location,
+	Elf64_Addr v)
+{
+	return 0;
+}
 
-		switch (ELF32_R_TYPE(rel[i].r_info)) {
-		case R_MIPS_NONE:
-			break;
-
-		case R_MIPS_32:
-			*location += v;
-			break;
-
-		case R_MIPS_26:
-			if (v % 4)
-				printk(KERN_ERR
-				       "module %s: dangerous relocation\n",
-				       me->name);
-				return -ENOEXEC;
-			if ((v & 0xf0000000) !=
-			    (((unsigned long)location + 4) & 0xf0000000))
-				printk(KERN_ERR
-				       "module %s: relocation overflow\n",
-				       me->name);
-				return -ENOEXEC;
-			*location = (*location & ~0x03ffffff) |
-			            ((*location + (v >> 2)) & 0x03ffffff);
-			break;
+static int apply_r_mips_32(struct module *me, uint32_t *location,
+	Elf64_Addr v)
+{
+	*location = v;
+
+	return 0;
+}
+
+static int apply_r_mips_26(struct module *me, uint32_t *location,
+	Elf64_Addr v)
+{
+	if (v % 4) {
+		printk(KERN_ERR "module %s: dangerous relocation\n", me->name);
+		return -ENOEXEC;
+	}
+
+	if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) {
+		printk(KERN_ERR
+		       "module %s: relocation overflow\n",
+		       me->name);
+		return -ENOEXEC;
+	}
+
+	*location = (*location & ~0x03ffffff) | ((v >> 2) & 0x03ffffff);
+
+	return 0;
+}
+
+static int apply_r_mips_hi16(struct module *me, uint32_t *location,
+	Elf64_Addr v)
+{
+	struct mips_hi16 *n;
 
-		case R_MIPS_HI16: {
-			struct mips_hi16 *n;
+	/*
+	 * We cannot relocate this one now because we don't know the value of
+	 * the carry we need to add.  Save the information, and let LO16 do the
+	 * actual relocation.
+	 */
+	n = kmalloc(sizeof *n, GFP_KERNEL);
+	if (!n)
+		return -ENOMEM;
+
+	n->addr = location;
+	n->value = v;
+	n->next = mips_hi16_list;
+	mips_hi16_list = n;
+
+	return 0;
+}
+
+static int apply_r_mips_lo16(struct module *me, uint32_t *location,
+	Elf64_Addr v)
+{
+	unsigned long insnlo = *location;
+	Elf32_Addr val, vallo;
+
+	/* Sign extend the addend we extract from the lo insn.  */
+	vallo = ((insnlo & 0xffff) ^ 0x8000) - 0x8000;
+
+	if (mips_hi16_list != NULL) {
+		struct mips_hi16 *l;
+
+		l = mips_hi16_list;
+		while (l != NULL) {
+			struct mips_hi16 *next;
+			unsigned long insn;
 
 			/*
-			 * We cannot relocate this one now because we don't
-			 * know the value of the carry we need to add.  Save
-			 * the information, and let LO16 do the actual
-			 * relocation.
+			 * The value for the HI16 had best be the same.
 			 */
-			n = (struct mips_hi16 *) kmalloc(sizeof *n, GFP_KERNEL);
-			n->addr = location;
-			n->value = v;
-			n->next = mips_hi16_list;
-			mips_hi16_list = n;
-			break;
-		}
-
-		case R_MIPS_LO16: {
-			unsigned long insnlo = *location;
-			Elf32_Addr val, vallo;
-
-			/* Sign extend the addend we extract from the lo insn.  */
-			vallo = ((insnlo & 0xffff) ^ 0x8000) - 0x8000;
-
-			if (mips_hi16_list != NULL) {
-				struct mips_hi16 *l;
-
-				l = mips_hi16_list;
-				while (l != NULL) {
-					struct mips_hi16 *next;
-					unsigned long insn;
-
-					/*
-					 * The value for the HI16 had best be
-					 * the same.
-					 */
-					printk(KERN_ERR "module %s: dangerous "
-					       "relocation\n", me->name);
-					return -ENOEXEC;
-
-					/*
-					 * Do the HI16 relocation.  Note that
-					 * we actually don't need to know
-					 * anything about the LO16 itself,
-					 * except where to find the low 16 bits
-					 * of the addend needed by the LO16.
-					 */
-					insn = *l->addr;
-					val = ((insn & 0xffff) << 16) + vallo;
-					val += v;
-
-					/*
-					 * Account for the sign extension that
-					 * will happen in the low bits.
-					 */
-					val = ((val >> 16) + ((val & 0x8000) !=
-					      0)) & 0xffff;
-
-					insn = (insn & ~0xffff) | val;
-					*l->addr = insn;
-
-					next = l->next;
-					kfree(l);
-					l = next;
-				}
+			if (v != l->value)
+				goto out_danger;
 
-				mips_hi16_list = NULL;
-			}
+			/*
+			 * Do the HI16 relocation.  Note that we actually don't
+			 * need to know anything about the LO16 itself, except
+			 * where to find the low 16 bits of the addend needed
+			 * by the LO16.
+			 */
+			insn = *l->addr;
+			val = ((insn & 0xffff) << 16) + vallo;
+			val += v;
 
 			/*
-			 * Ok, we're done with the HI16 relocs.  Now deal with
-			 * the LO16.
+			 * Account for the sign extension that will happen in
+			 * the low bits.
 			 */
-			val = v + vallo;
-			insnlo = (insnlo & ~0xffff) | (val & 0xffff);
-			*location = insnlo;
-			break;
-		}
+			val = ((val >> 16) + ((val & 0x8000) != 0)) & 0xffff;
+
+			insn = (insn & ~0xffff) | val;
+			*l->addr = insn;
 
-		default:
-			printk(KERN_ERR "module %s: Unknown relocation: %u\n",
-			       me->name, ELF32_R_TYPE(rel[i].r_info));
-			return -ENOEXEC;
+			next = l->next;
+			kfree(l);
+			l = next;
 		}
+
+		mips_hi16_list = NULL;
 	}
+
+	/*
+	 * Ok, we're done with the HI16 relocs.  Now deal with the LO16.
+	 */
+	insnlo = (insnlo & ~0xffff) | (v & 0xffff);
+	*location = insnlo;
+
+	return 0;
+
+out_danger:
+	printk(KERN_ERR "module %s: dangerous " "relocation\n", me->name);
+
+	return -ENOEXEC;
+}
+
+static int apply_r_mips_64(struct module *me, uint32_t *location,
+	Elf64_Addr v)
+{
+	*(uint64_t *) location = v;
+
+	return 0;
+}
+
+
+static int apply_r_mips_higher(struct module *me, uint32_t *location,
+	Elf64_Addr v)
+{
+	*location = (*location & 0xffff0000) |
+	            ((((long long) v + 0x80008000LL) >> 32) & 0xffff);
+
+	return 0;
+}
+
+static int apply_r_mips_highest(struct module *me, uint32_t *location,
+	Elf64_Addr v)
+{
+	*location = (*location & 0xffff0000) |
+	            ((((long long) v + 0x800080008000LL) >> 48) & 0xffff);
+
 	return 0;
 }
 
-int apply_relocate_add(Elf32_Shdr *sechdrs,
+static int (*reloc_handlers[]) (struct module *me, uint32_t *location,
+	Elf64_Addr v) = {
+	[R_MIPS_NONE]		= apply_r_mips_none,
+	[R_MIPS_32]		= apply_r_mips_32,
+	[R_MIPS_26]		= apply_r_mips_26,
+	[R_MIPS_HI16]		= apply_r_mips_hi16,
+	[R_MIPS_LO16]		= apply_r_mips_lo16,
+	[R_MIPS_64]		= apply_r_mips_64,
+	[R_MIPS_HIGHER]		= apply_r_mips_higher,
+	[R_MIPS_HIGHEST]	= apply_r_mips_highest
+};
+
+int apply_relocate_add(Elf64_Shdr *sechdrs,
 		       const char *strtab,
 		       unsigned int symindex,
 		       unsigned int relsec,
 		       struct module *me)
 {
-	printk(KERN_ERR "module %s: ADD RELOCATION unsupported\n",
-	       me->name);
-	return -ENOEXEC;
+	Elf64_Mips_Rela *rel = (void *) sechdrs[relsec].sh_addr;
+	Elf64_Sym *sym;
+	uint32_t *location;
+	unsigned int i;
+	Elf64_Addr v;
+	int res;
+
+	pr_debug("Applying relocate section %u to %u\n", relsec,
+	       sechdrs[relsec].sh_info);
+
+	for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
+		/* This is where to make the change */
+		location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr
+			+ rel[i].r_offset;
+		/* This is the symbol it is referring to */
+		sym = (Elf64_Sym *)sechdrs[symindex].sh_addr + rel[i].r_sym;
+		if (!sym->st_value) {
+			printk(KERN_WARNING "%s: Unknown symbol %s\n",
+			       me->name, strtab + sym->st_name);
+			return -ENOENT;
+		}
+
+		v = sym->st_value;
+
+		res = reloc_handlers[rel[i].r_type](me, location, v);
+		if (res)
+			return res;
+	}
+
+	return 0;
 }
 
 int module_finalize(const Elf_Ehdr *hdr,
--- diff/arch/mips/kernel/proc.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/kernel/proc.c	2004-04-21 10:45:33.646588440 +0100
@@ -117,7 +117,7 @@ static int show_cpuinfo(struct seq_file 
 	              cpu_has_watch ? "yes" : "no");
 
 	sprintf(fmt, "VCE%%c exceptions\t\t: %s\n",
-	        cpu_has_vce ? "%d" : "not available");
+	        cpu_has_vce ? "%u" : "not available");
 	seq_printf(m, fmt, 'D', vced_count);
 	seq_printf(m, fmt, 'I', vcei_count);
 
--- diff/arch/mips/kernel/process.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/kernel/process.c	2004-04-21 10:45:33.647588288 +0100
@@ -283,8 +283,6 @@ unsigned long thread_saved_pc(struct tas
 /*
  * These bracket the sleeping functions..
  */
-extern void scheduling_functions_start_here(void);
-extern void scheduling_functions_end_here(void);
 #define first_sched	((unsigned long) scheduling_functions_start_here)
 #define last_sched	((unsigned long) scheduling_functions_end_here)
 
--- diff/arch/mips/kernel/r2300_switch.S	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/kernel/r2300_switch.S	2004-04-21 10:45:33.647588288 +0100
@@ -90,7 +90,7 @@ LEAF(resume)
 	sw	t1, kernelsp
 
 	mfc0	t1, CP0_STATUS		/* Do we really need this? */
-	li	a3, 0xff00
+	li	a3, 0xff01
 	and	t1, a3
 	lw	a2, THREAD_STATUS(a1)
 	nor	a3, $0, a3
--- diff/arch/mips/kernel/r4k_fpu.S	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/kernel/r4k_fpu.S	2004-04-21 10:45:33.648588136 +0100
@@ -81,7 +81,7 @@ LEAF(_save_fp_context)
 	 li	v0, 0					# success
 	END(_save_fp_context)
 
-#ifdef CONFIG_MIPS64
+#ifdef CONFIG_MIPS32_COMPAT
 	/* Save 32-bit process floating point context */
 LEAF(_save_fp_context32)
 	cfc1	t1, fcr31
@@ -157,7 +157,7 @@ LEAF(_restore_fp_context)
 	 li	v0, 0					# success
 	END(_restore_fp_context)
 
-#ifdef CONFIG_MIPS64
+#ifdef CONFIG_MIPS32_COMPAT
 LEAF(_restore_fp_context32)
 	/* Restore an o32 sigcontext.  */
 	EX	lw t0, SC32_FPC_CSR(a0)
--- diff/arch/mips/kernel/r4k_switch.S	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/kernel/r4k_switch.S	2004-04-21 10:45:33.648588136 +0100
@@ -99,7 +99,7 @@
 	set_saved_sp	t0, t1, t2
 
 	mfc0	t1, CP0_STATUS		/* Do we really need this? */
-	li	a3, 0xff00
+	li	a3, 0xff01
 	and	t1, a3
 	LONG_L	a2, THREAD_STATUS(a1)
 	nor	a3, $0, a3
--- diff/arch/mips/kernel/scall64-n32.S	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/kernel/scall64-n32.S	2004-04-21 10:45:33.648588136 +0100
@@ -139,7 +139,7 @@ EXPORT(sysn32_call_table)
 	PTR	sys_mincore
 	PTR	sys_madvise
 	PTR	sys_shmget
-	PTR	sys_shmat
+	PTR	sys32_shmat
 	PTR	sys_shmctl			/* 6030 */
 	PTR	sys_dup
 	PTR	sys_dup2
--- diff/arch/mips/kernel/semaphore.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/kernel/semaphore.c	2004-04-21 10:45:33.648588136 +0100
@@ -6,6 +6,7 @@
 #include <linux/config.h>
 #include <linux/errno.h>
 #include <linux/module.h>
+#include <linux/init.h>
 #include <linux/sched.h>
 
 #ifdef CONFIG_CPU_HAS_LLDSCD
@@ -104,7 +105,7 @@ static inline int waking_non_zero(struct
  * Either form may be used in conjunction with "up()".
  */
 
-void __down_failed(struct semaphore * sem)
+void __sched __down_failed(struct semaphore * sem)
 {
 	struct task_struct *tsk = current;
 	wait_queue_t wait;
@@ -227,7 +228,7 @@ static inline int waking_non_zero_interr
 
 #endif /* !CONFIG_CPU_HAS_LLDSCD */
 
-int __down_failed_interruptible(struct semaphore * sem)
+int __sched __down_failed_interruptible(struct semaphore * sem)
 {
 	struct task_struct *tsk = current;
 	wait_queue_t wait;
--- diff/arch/mips/kernel/signal.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/kernel/signal.c	2004-04-21 10:45:33.649587984 +0100
@@ -350,7 +350,7 @@ static inline void *get_sigframe(struct 
  	sp -= 32;
 
 	/* This is the X/Open sanctioned signal stack switching.  */
-	if ((ka->sa.sa_flags & SA_ONSTACK) && ! on_sig_stack(sp))
+	if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0))
 		sp = current->sas_ss_sp + current->sas_ss_size;
 
 	return (void *)((sp - frame_size) & ALMASK);
--- diff/arch/mips/kernel/signal32.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/kernel/signal32.c	2004-04-21 10:45:33.649587984 +0100
@@ -21,7 +21,6 @@
 
 #include <asm/asm.h>
 #include <asm/bitops.h>
-#include <asm/pgalloc.h>
 #include <asm/sim.h>
 #include <asm/uaccess.h>
 #include <asm/ucontext.h>
@@ -358,7 +357,12 @@ static int copy_siginfo_to_user32(siginf
 			err |= __put_user(from->si_band, &to->si_band);
 			err |= __put_user(from->si_fd, &to->si_fd);
 			break;
-		/* case __SI_RT: This is not generated by the kernel as of now.  */
+		case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
+		case __SI_MESGQ >> 16:
+			err |= __put_user(from->si_pid, &to->si_pid);
+			err |= __put_user(from->si_uid, &to->si_uid);
+			err |= __put_user(from->si_int, &to->si_int);
+			break;
 		}
 	}
 	return err;
@@ -514,7 +518,7 @@ static inline void *get_sigframe(struct 
  	sp -= 32;
 
 	/* This is the X/Open sanctioned signal stack switching.  */
-	if ((ka->sa.sa_flags & SA_ONSTACK) && ! on_sig_stack(sp))
+	if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0))
 		sp = current->sas_ss_sp + current->sas_ss_size;
 
 	return (void *)((sp - frame_size) & ALMASK);
--- diff/arch/mips/kernel/signal_n32.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/kernel/signal_n32.c	2004-04-21 10:45:33.650587832 +0100
@@ -29,7 +29,6 @@
 
 #include <asm/asm.h>
 #include <asm/bitops.h>
-#include <asm/pgalloc.h>
 #include <asm/sim.h>
 #include <asm/uaccess.h>
 #include <asm/ucontext.h>
@@ -137,7 +136,7 @@ static inline void *get_sigframe(struct 
  	sp -= 32;
 
 	/* This is the X/Open sanctioned signal stack switching.  */
-	if ((ka->sa.sa_flags & SA_ONSTACK) && ! on_sig_stack(sp))
+	if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0))
 		sp = current->sas_ss_sp + current->sas_ss_size;
 
 	return (void *)((sp - frame_size) & ALMASK);
--- diff/arch/mips/kernel/syscall.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/kernel/syscall.c	2004-04-21 10:45:33.650587832 +0100
@@ -63,6 +63,13 @@ unsigned long arch_get_unmapped_area(str
 {
 	struct vm_area_struct * vmm;
 	int do_color_align;
+	unsigned long task_size;
+
+#if CONFIG_MIPS32
+	task_size = TASK_SIZE;
+#else
+	task_size = (current->thread.mflags & MF_32BIT_ADDR) ? TASK_SIZE32 : TASK_SIZE;
+#endif
 
 	if (flags & MAP_FIXED) {
 		/*
@@ -74,7 +81,7 @@ unsigned long arch_get_unmapped_area(str
 		return addr;
 	}
 
-	if (len > TASK_SIZE)
+	if (len > task_size)
 		return -ENOMEM;
 	do_color_align = 0;
 	if (filp || (flags & MAP_SHARED))
@@ -85,7 +92,7 @@ unsigned long arch_get_unmapped_area(str
 		else
 			addr = PAGE_ALIGN(addr);
 		vmm = find_vma(current->mm, addr);
-		if (TASK_SIZE - len >= addr &&
+		if (task_size - len >= addr &&
 		    (!vmm || addr + len <= vmm->vm_start))
 			return addr;
 	}
@@ -97,7 +104,7 @@ unsigned long arch_get_unmapped_area(str
 
 	for (vmm = find_vma(current->mm, addr); ; vmm = vmm->vm_next) {
 		/* At this point:  (!vmm || addr < vmm->vm_end). */
-		if (TASK_SIZE - len < addr)
+		if (task_size - len < addr)
 			return -ENOMEM;
 		if (!vmm || addr + len <= vmm->vm_start)
 			return addr;
@@ -366,6 +373,22 @@ asmlinkage int sys_ipc (uint call, int f
 }
 
 /*
+ * Native ABI that is O32 or N64 version
+ */
+asmlinkage long sys_shmat(int shmid, char __user *shmaddr,
+                          int shmflg, unsigned long *addr)
+{
+	unsigned long raddr;
+	int err;
+
+	err = do_shmat(shmid, shmaddr, shmflg, &raddr);
+	if (err)
+		return err;
+
+	return put_user(raddr, addr);
+}
+
+/*
  * No implemented yet ...
  */
 asmlinkage int sys_cachectl(char *addr, int nbytes, int op)
--- diff/arch/mips/kernel/sysirix.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/mips/kernel/sysirix.c	2004-04-21 10:45:33.651587680 +0100
@@ -33,7 +33,6 @@
 
 #include <asm/ptrace.h>
 #include <asm/page.h>
-#include <asm/pgalloc.h>
 #include <asm/uaccess.h>
 #include <asm/inventory.h>
 
--- diff/arch/mips/kernel/traps.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/kernel/traps.c	2004-04-21 10:45:33.652587528 +0100
@@ -977,8 +977,7 @@ void __init trap_init(void)
 		memcpy((void *)(CAC_BASE + 0x300), &except_vec_ejtag_debug, 0x80);
 
 	/*
-	 * Only some CPUs have the watch exceptions or a dedicated
-	 * interrupt vector.
+	 * Only some CPUs have the watch exceptions.
 	 */
 	if (cpu_has_watch)
 		set_except_vector(23, handle_watch);
--- diff/arch/mips/kernel/vmlinux.lds.S	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/kernel/vmlinux.lds.S	2004-04-21 10:45:33.652587528 +0100
@@ -28,6 +28,7 @@ SECTIONS
   _text = .;			/* Text and read-only data */
   .text : {
     *(.text)
+    SCHED_TEXT
     *(.fixup)
     *(.gnu.warning)
   } =0
--- diff/arch/mips/lasat/Makefile	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/lasat/Makefile	2004-04-21 10:45:33.652587528 +0100
@@ -7,7 +7,6 @@ obj-y	 			+= reset.o setup.o prom.o lasa
 
 obj-$(CONFIG_LASAT_SYSCTL)	+= sysctl.o
 obj-$(CONFIG_DS1603)		+= ds1603.o
-obj-$(CONFIG_PCI)		+= pci.o
 obj-$(CONFIG_PICVUE)		+= picvue.o
 obj-$(CONFIG_PICVUE_PROC)	+= picvue_proc.o
 
--- diff/arch/mips/lasat/at93c.c	2003-07-08 09:55:17.000000000 +0100
+++ source/arch/mips/lasat/at93c.c	2004-04-21 10:45:33.653587376 +0100
@@ -41,9 +41,9 @@ static u32 at93c_datareg_read(void)
 static void at93c_cycle_clk(u32 data)
 {
 	at93c_reg_write(data | at93c->clk);
-	ndelay(250);
+	lasat_ndelay(250);
 	at93c_reg_write(data & ~at93c->clk);
-	ndelay(250);
+	lasat_ndelay(250);
 }
 
 static void at93c_write_databit(u8 bit)
@@ -55,7 +55,7 @@ static void at93c_write_databit(u8 bit)
 		data &= ~(1 << at93c->wdata_shift);
 
 	at93c_reg_write(data);
-	ndelay(100);
+	lasat_ndelay(100);
 	at93c_cycle_clk(data);
 }
 
@@ -95,13 +95,13 @@ static void at93c_write_bits(u32 data, i
 static void at93c_init_op(void)
 {
 	at93c_reg_write((at93c_reg_read() | at93c->cs) & ~at93c->clk & ~(1 << at93c->rdata_shift));
-	ndelay(50);
+	lasat_ndelay(50);
 }
 
 static void at93c_end_op(void)
 {
 	at93c_reg_write(at93c_reg_read() & ~at93c->cs);
-	ndelay(250);
+	lasat_ndelay(250);
 }
 
 static void at93c_wait(void) 
--- diff/arch/mips/lasat/ds1603.c	2003-07-08 09:55:17.000000000 +0100
+++ source/arch/mips/lasat/ds1603.c	2004-04-21 10:45:33.653587376 +0100
@@ -51,14 +51,14 @@ static void rtc_cycle_clock(unsigned lon
 {
 	data |= ds1603->clk;
 	rtc_reg_write(data);
-	ndelay(250);
+	lasat_ndelay(250);
 	if (ds1603->data_reversed)
 		data &= ~ds1603->data;
 	else
 		data |= ds1603->data;
 	data &= ~ds1603->clk;
 	rtc_reg_write(data);
-	ndelay(250 + ds1603->huge_delay);
+	lasat_ndelay(250 + ds1603->huge_delay);
 }
 
 static void rtc_write_databit(unsigned int bit)
@@ -72,7 +72,7 @@ static void rtc_write_databit(unsigned i
 		data &= ~ds1603->data;
 
 	rtc_reg_write(data);
-	ndelay(50 + ds1603->huge_delay);
+	lasat_ndelay(50 + ds1603->huge_delay);
 	rtc_cycle_clock(data);
 }
 
@@ -125,13 +125,13 @@ static void rtc_init_op(void)
 
 	rtc_reg_write(rtc_reg_read() & ~ds1603->clk);
 
-	ndelay(50);
+	lasat_ndelay(50);
 }
 
 static void rtc_end_op(void)
 {
 	rtc_nrst_low();
-	ndelay(1000);
+	lasat_ndelay(1000);
 }
 
 /* interface */
--- diff/arch/mips/lasat/image/Makefile	2003-07-08 09:55:17.000000000 +0100
+++ source/arch/mips/lasat/image/Makefile	2004-04-21 10:45:33.653587376 +0100
@@ -18,14 +18,15 @@ KERNEL_ENTRY = $(shell $(NM) $(KERNEL_IM
 
 LDSCRIPT= -L$(obj) -Tromscript.normal
 
-AFLAGS_head.o += -D_kernel_start=0x$(KERNEL_START) \
+HEAD_DEFINES := -D_kernel_start=0x$(KERNEL_START) \
 		-D_kernel_entry=0x$(KERNEL_ENTRY) \
 		-D VERSION="\"$(Version)\"" \
 		-D TIMESTAMP=$(shell date +%s) 
 
-head.o: $(KERNEL_IMAGE)
+$(obj)/head.o: $(obj)/head.S $(KERNEL_IMAGE)
+	$(CC) -fno-pic $(HEAD_DEFINES) -I$(TOPDIR)/include -c -o $@ $<
 
-obj-y = head.o kImage.o
+OBJECTS = head.o kImage.o
 
 rom.sw:	$(obj)/rom.sw
 
@@ -36,7 +37,7 @@ $(obj)/rom.bin: $(obj)/rom
 	$(OBJCOPY) -O binary -S $^ $@
 
 # Rule to make the bootloader
-$(obj)/rom: $(addprefix $(obj)/,$(obj-y))
+$(obj)/rom: $(addprefix $(obj)/,$(OBJECTS))
 	$(LD) $(LDFLAGS) $(LDSCRIPT) -o $@ $^
 
 $(obj)/%.o: $(obj)/%.gz
--- diff/arch/mips/lasat/interrupt.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/lasat/interrupt.c	2004-04-21 10:45:33.654587224 +0100
@@ -33,7 +33,7 @@ static volatile int *lasat_int_status = 
 static volatile int *lasat_int_mask = NULL;
 static volatile int lasat_int_mask_shift;
 
-extern asmlinkage void mipsIRQ(void);
+extern asmlinkage void lasatIRQ(void);
 
 void disable_lasat_irq(unsigned int irq_nr)
 {
@@ -112,7 +112,6 @@ static unsigned long get_int_status_200(
 
 void lasat_hw0_irqdispatch(struct pt_regs *regs)
 {
-	struct irqaction *action;
 	unsigned long int_status;
 	int irq;
 
@@ -141,7 +140,6 @@ void __init init_IRQ(void)
 		*lasat_int_mask = 0;
 		break;
 	case MACH_LASAT_200:
-		printk("**** MACH_LASAT_200 interrupt routines\n");
 		lasat_int_status = (void *)LASAT_INT_STATUS_REG_200;
 		lasat_int_mask = (void *)LASAT_INT_MASK_REG_200;
 		lasat_int_mask_shift = LASATINT_MASK_SHIFT_200;
@@ -153,7 +151,7 @@ void __init init_IRQ(void)
 	}
 
 	/* Now safe to set the exception vector. */
-	set_except_vector(0, mipsIRQ);
+	set_except_vector(0, lasatIRQ);
 
 	for (i = 0; i <= LASATINT_END; i++) {
 		irq_desc[i].status	= IRQ_DISABLED;
--- diff/arch/mips/lasat/lasatIRQ.S	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/lasat/lasatIRQ.S	2004-04-21 10:45:33.654587224 +0100
@@ -24,12 +24,13 @@
 
 	.text
 	.set	noreorder
-	.set	noat
 	.align	5
-	NESTED(mipsIRQ, PT_SIZE, sp)
+	NESTED(lasatIRQ, PT_SIZE, sp)
+	.set	noat
 	SAVE_ALL
 	CLI
 	.set	at
+	.set	noreorder
 
 	mfc0	s0, CP0_CAUSE		# get irq mask
 
@@ -39,9 +40,9 @@
 	 andi	a0, s0, CAUSEF_IP2	# delay slot, check hw0 interrupt
 
 	/* Wheee, a timer interrupt. */
-	move	a0, sp
-	jal	lasat_timer_interrupt
-	 nop
+	li	a0, 7
+	jal	ll_timer_interrupt
+	 move	a1, sp
 
 	j	ret_from_irq
 	 nop
@@ -65,4 +66,4 @@
 
 	j	ret_from_irq
 	 nop
-	END(mipsIRQ)
+	END(lasatIRQ)
--- diff/arch/mips/lasat/prom.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/lasat/prom.c	2004-04-21 10:45:33.655587072 +0100
@@ -46,6 +46,8 @@ void (* prom_display)(const char *string
 		null_prom_display;
 void (* prom_monitor)(void) = null_prom_monitor;
 
+unsigned int lasat_ndelay_divider;
+
 #define PROM_PRINTFBUF_SIZE 256
 static char prom_printfbuf[PROM_PRINTFBUF_SIZE];
 
@@ -98,10 +100,15 @@ void __init prom_init(void)
 
 	setup_prom_vectors();
 
-	if (current_cpu_data.cputype == CPU_R5000)
+	if (current_cpu_data.cputype == CPU_R5000) {
+	        prom_printf("LASAT 200 board\n");
 		mips_machtype = MACH_LASAT_200;
-	else
+                lasat_ndelay_divider = LASAT_200_DIVIDER;
+        } else {
+	        prom_printf("LASAT 100 board\n");
 		mips_machtype = MACH_LASAT_100;
+                lasat_ndelay_divider = LASAT_100_DIVIDER;
+        }
 
 	at93c = &at93c_defs[mips_machtype];
 
--- diff/arch/mips/lasat/setup.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/lasat/setup.c	2004-04-21 10:45:33.655587072 +0100
@@ -44,7 +44,6 @@
 #endif
 
 #include "ds1603.h"
-#include "at93c.h"
 #include <asm/lasat/ds1603.h>
 #include <asm/lasat/picvue.h>
 #include <asm/lasat/eeprom.h>
@@ -126,12 +125,6 @@ static void lasat_timer_setup(struct irq
 	change_c0_status(ST0_IM, IE_IRQ0 | IE_IRQ5);
 }
 
-#define MIPS_CPU_TIMER_IRQ 7
-asmlinkage void lasat_timer_interrupt(struct pt_regs *regs)
-{
-	ll_timer_interrupt(MIPS_CPU_TIMER_IRQ, regs);
-}
-
 #define DYNAMIC_SERIAL_INIT
 #ifdef DYNAMIC_SERIAL_INIT
 void __init serial_init(void)
@@ -162,7 +155,7 @@ void __init serial_init(void)
 }
 #endif
 
-static void __init lasat_setup(void)
+static int __init lasat_setup(void)
 {
 	int i;
 	lasat_misc  = &lasat_misc_info[mips_machtype];
@@ -192,6 +185,8 @@ static void __init lasat_setup(void)
 	change_c0_status(ST0_BEV,0);
 
 	prom_printf("Lasat specific initialization complete\n");
+
+        return 0;
 }
 
 early_initcall(lasat_setup);
--- diff/arch/mips/mm-32/tlbex-r4k.S	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/mm-32/tlbex-r4k.S	2004-04-21 10:45:33.664585704 +0100
@@ -177,12 +177,9 @@
 	P_MTC0	k0, CP0_ENTRYLO0		# load it
 	PTE_SRL	k1, k1, 6			# convert to entrylo1
 	P_MTC0	k1, CP0_ENTRYLO1		# load it
-	b	1f
-	rm9000_tlb_hazard
+	mtc0_tlbw_hazard
 	tlbwr					# write random tlb entry
-1:
-	nop
-	rm9000_tlb_hazard
+	tlbw_eret_hazard
 	eret					# return from trap
 	END(except_vec0_r4000)
 
@@ -461,13 +458,9 @@ invalid_tlbl:
 	PTE_PRESENT(k0, k1, nopage_tlbl)
 	PTE_MAKEVALID(k0, k1)
 	PTE_RELOAD(k1, k0)
-	rm9000_tlb_hazard
-	nop
-	b	1f
-	 tlbwi
-1:
-	nop
-	rm9000_tlb_hazard
+	mtc0_tlbw_hazard
+	tlbwi
+	tlbw_eret_hazard
 	.set	mips3
 	eret
 	.set	mips0
@@ -489,13 +482,9 @@ nopage_tlbl:
 	PTE_WRITABLE(k0, k1, nopage_tlbs)
 	PTE_MAKEWRITE(k0, k1)
 	PTE_RELOAD(k1, k0)
-	rm9000_tlb_hazard
-	nop
-	b	1f
-	 tlbwi
-1:
-	nop
-	rm9000_tlb_hazard
+	mtc0_tlbw_hazard
+	tlbwi
+	tlbw_eret_hazard
 	.set	mips3
 	eret
 	.set	mips0
@@ -522,13 +511,9 @@ nopage_tlbs:
 
 	/* Now reload the entry into the tlb. */
 	PTE_RELOAD(k1, k0)
-	rm9000_tlb_hazard
-	nop
-	b	1f
-	 tlbwi
-1:
-	rm9000_tlb_hazard
-	nop
+	mtc0_tlbw_hazard
+	tlbwi
+	tlbw_eret_hazard
 	.set	mips3
 	eret
 	.set	mips0
--- diff/arch/mips/mm-64/tlb-dbg-r4k.c	2003-08-20 14:16:36.000000000 +0100
+++ source/arch/mips/mm-64/tlb-dbg-r4k.c	2004-04-21 10:45:33.664585704 +0100
@@ -24,7 +24,7 @@ asmlinkage void do_page_fault(struct pt_
 asmlinkage void tlb_refill_debug(struct pt_regs regs)
 {
 	show_regs(&regs);
-	panic(__FUNCTION__ " called.  This Does Not Happen (TM).");
+	panic("%s called.  This Does Not Happen (TM).", __FUNCTION__);
 }
 
 asmlinkage void xtlb_refill_debug(struct pt_regs *regs)
--- diff/arch/mips/mm-64/tlbex-r4k.S	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/mm-64/tlbex-r4k.S	2004-04-21 10:45:33.664585704 +0100
@@ -135,11 +135,9 @@ LEAF(handle_vec1_r4k)
 	ld	k0, 0(k1)			# get even pte
 	ld	k1, 8(k1)			# get odd pte
 	PTE_RELOAD k0 k1
-	rm9000_tlb_hazard
-	b	1f
-	 tlbwr
-1:	nop
-	rm9000_tlb_hazard
+	mtc0_tlbw_hazard
+	tlbwr
+	tlbw_eret_hazard
 	eret
 
 9:						# handle the vmalloc range
@@ -147,11 +145,9 @@ LEAF(handle_vec1_r4k)
 	ld	k0, 0(k1)			# get even pte
 	ld	k1, 8(k1)			# get odd pte
 	PTE_RELOAD k0 k1
-	rm9000_tlb_hazard
-	b	1f
+	mtc0_tlbw_hazard
 	 tlbwr
-1:	nop
-	rm9000_tlb_hazard
+	tlbw_eret_hazard
 	eret
 END(handle_vec1_r4k)
 
@@ -179,10 +175,8 @@ LEAF(handle_vec1_r10k)
 	ld	k0, 0(k1)			# get even pte
 	ld	k1, 8(k1)			# get odd pte
 	PTE_RELOAD k0 k1
-	rm9000_tlb_hazard
 	nop
 	tlbwr
-	rm9000_tlb_hazard
 	eret
 
 9:						# handle the vmalloc range
@@ -190,10 +184,8 @@ LEAF(handle_vec1_r10k)
 	ld	k0, 0(k1)			# get even pte
 	ld	k1, 8(k1)			# get odd pte
 	PTE_RELOAD k0 k1
-	rm9000_tlb_hazard
 	nop
 	tlbwr
-	rm9000_tlb_hazard
 	eret
 END(handle_vec1_r10k)
 
--- diff/arch/mips/mm/Makefile	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/mm/Makefile	2004-04-21 10:45:33.655587072 +0100
@@ -25,9 +25,9 @@ obj-$(CONFIG_CPU_TX39XX)	+= c-tx39.o pg-
 obj-$(CONFIG_CPU_TX49XX)	+= c-r4k.o cex-gen.o pg-r4k.o tlb-r4k.o
 obj-$(CONFIG_CPU_VR41XX)	+= c-r4k.o cex-gen.o pg-r4k.o tlb-r4k.o
 
-obj-$(CONFIG_CPU_RM7000)	+= sc-rm7k.o
+obj-$(CONFIG_IP22_CPU_SCACHE)	+= sc-ip22.o
 obj-$(CONFIG_R5000_CPU_SCACHE)  += sc-r5k.o
-obj-$(CONFIG_SGI_IP22)		+= sc-ip22.o
+obj-$(CONFIG_RM7000_CPU_SCACHE)	+= sc-rm7k.o
 
 #
 # Choose one DMA coherency model
--- diff/arch/mips/mm/c-r3k.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/mm/c-r3k.c	2004-04-21 10:45:33.656586920 +0100
@@ -311,6 +311,9 @@ static void r3k_flush_cache_sigtramp(uns
 
 static void r3k_dma_cache_wback_inv(unsigned long start, unsigned long size)
 {
+	/* Catch bad driver code */
+	BUG_ON(size == 0);
+
 	iob();
 	r3k_flush_dcache_range(start, start + size);
 }
--- diff/arch/mips/mm/c-r4k.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/mm/c-r4k.c	2004-04-21 10:45:33.656586920 +0100
@@ -426,8 +426,7 @@ static void r4k_flush_icache_range(unsig
  * least know the kernel address of the page so we can flush it
  * selectivly.
  */
-static void r4k_flush_icache_page(struct vm_area_struct *vma,
-	struct page *page)
+static void r4k_flush_icache_page(struct vm_area_struct *vma, struct page *page)
 {
 	/*
 	 * If there's no context yet, or the page isn't executable, no icache
@@ -478,6 +477,9 @@ static void r4k_dma_cache_wback_inv(unsi
 {
 	unsigned long end, a;
 
+	/* Catch bad driver code */
+	BUG_ON(size == 0);
+
 	if (cpu_has_subset_pcaches) {
 		unsigned long sc_lsize = current_cpu_data.scache.linesz;
 
@@ -525,6 +527,9 @@ static void r4k_dma_cache_inv(unsigned l
 {
 	unsigned long end, a;
 
+	/* Catch bad driver code */
+	BUG_ON(size == 0);
+
 	if (cpu_has_subset_pcaches) {
 		unsigned long sc_lsize = current_cpu_data.scache.linesz;
 
@@ -787,7 +792,10 @@ static void __init probe_pcache(void)
 		c->dcache.ways = 4;
 		c->dcache.waybit = ffs(dcache_size / c->dcache.ways) - 1;
 
-		c->options |= MIPS_CPU_CACHE_CDEX_P | MIPS_CPU_PREFETCH;
+#if !defined(CONFIG_SMP) || !defined(RM9000_CDEX_SMP_WAR)
+		c->options |= MIPS_CPU_CACHE_CDEX_P;
+#endif
+		c->options |= MIPS_CPU_PREFETCH;
 		break;
 
 	default:
--- diff/arch/mips/mm/c-sb1.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/mm/c-sb1.c	2004-04-21 10:45:33.657586768 +0100
@@ -2,6 +2,7 @@
  * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com)
  * Copyright (C) 1997, 2001 Ralf Baechle (ralf@gnu.org)
  * Copyright (C) 2000, 2001, 2002, 2003 Broadcom Corporation
+ * Copyright (C) 2004  Maciej W. Rozycki
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -202,8 +203,8 @@ static void sb1_flush_cache_page(struct 
 	on_each_cpu(sb1_flush_cache_page_ipi, (void *) &args, 1, 1);
 }
 #else
-void sb1_flush_cache_page(struct vm_area_struct *vma, unsigned long addr);
-asm("sb1_flush_cache_page = local_sb1_flush_cache_page");
+void sb1_flush_cache_page(struct vm_area_struct *vma, unsigned long addr)
+	__attribute__((alias("local_sb1_flush_cache_page")));
 #endif
 
 /*
@@ -237,16 +238,16 @@ static void local_sb1___flush_cache_all(
 }
 
 #ifdef CONFIG_SMP
-extern void sb1___flush_cache_all_ipi(void *ignored);
-asm("sb1___flush_cache_all_ipi = local_sb1___flush_cache_all");
+void sb1___flush_cache_all_ipi(void *ignored)
+	__attribute__((alias("local_sb1___flush_cache_all")));
 
 static void sb1___flush_cache_all(void)
 {
 	on_each_cpu(sb1___flush_cache_all_ipi, 0, 1, 1);
 }
 #else
-extern void sb1___flush_cache_all(void);
-asm("sb1___flush_cache_all = local_sb1___flush_cache_all");
+void sb1___flush_cache_all(void)
+	__attribute__((alias("local_sb1___flush_cache_all")));
 #endif
 
 /*
@@ -295,8 +296,8 @@ void sb1_flush_icache_range(unsigned lon
 	on_each_cpu(sb1_flush_icache_range_ipi, &args, 1, 1);
 }
 #else
-void sb1_flush_icache_range(unsigned long start, unsigned long end);
-asm("sb1_flush_icache_range = local_sb1_flush_icache_range");
+void sb1_flush_icache_range(unsigned long start, unsigned long end)
+	__attribute__((alias("local_sb1_flush_icache_range")));
 #endif
 
 /*
@@ -352,8 +353,8 @@ static void sb1_flush_icache_page(struct
 	on_each_cpu(sb1_flush_icache_page_ipi, (void *) &args, 1, 1);
 }
 #else
-void sb1_flush_icache_page(struct vm_area_struct *vma, struct page *page);
-asm("sb1_flush_icache_page = local_sb1_flush_icache_page");
+void sb1_flush_icache_page(struct vm_area_struct *vma, struct page *page)
+	__attribute__((alias("local_sb1_flush_icache_page")));
 #endif
 
 /*
@@ -379,8 +380,8 @@ static void sb1_flush_cache_sigtramp(uns
 	on_each_cpu(sb1_flush_cache_sigtramp_ipi, (void *) addr, 1, 1);
 }
 #else
-void sb1_flush_cache_sigtramp(unsigned long addr);
-asm("sb1_flush_cache_sigtramp = local_sb1_flush_cache_sigtramp");
+void sb1_flush_cache_sigtramp(unsigned long addr)
+	__attribute__((alias("local_sb1_flush_cache_sigtramp")));
 #endif
 
 
--- diff/arch/mips/mm/c-tx39.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/mm/c-tx39.c	2004-04-21 10:45:33.657586768 +0100
@@ -69,6 +69,9 @@ static void tx39h_dma_cache_wback_inv(un
 	unsigned long end, a;
 	unsigned long dc_lsize = current_cpu_data.dcache.linesz;
 
+	/* Catch bad driver code */
+	BUG_ON(size == 0);
+
 	iob();
 	a = addr & ~(dc_lsize - 1);
 	end = (addr + size - 1) & ~(dc_lsize - 1);
--- diff/arch/mips/mm/cache.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/mm/cache.c	2004-04-21 10:45:33.658586616 +0100
@@ -53,20 +53,18 @@ asmlinkage int sys_cacheflush(void *addr
 	return 0;
 }
 
-void flush_dcache_page(struct page *page)
+void __flush_dcache_page(struct page *page)
 {
+	struct address_space *mapping = page_mapping(page);
 	unsigned long addr;
 
-	if (page->mapping &&
-	    list_empty(&page->mapping->i_mmap) &&
-	    list_empty(&page->mapping->i_mmap_shared)) {
+	if (mapping && !mapping_mapped(mapping)) {
 		SetPageDcacheDirty(page);
-
 		return;
 	}
 
 	/*
-	 * We could delay the flush for the !page->mapping case too.  But that
+	 * We could delay the flush for the !page_mapping case too.  But that
 	 * case is for exec env/arg pages and those are %99 certainly going to
 	 * get faulted into the tlb (and thus flushed) anyways.
 	 */
@@ -74,6 +72,8 @@ void flush_dcache_page(struct page *page
 	flush_data_cache_page(addr);
 }
 
+EXPORT_SYMBOL(__flush_dcache_page);
+
 void __update_cache(struct vm_area_struct *vma, unsigned long address,
 	pte_t pte)
 {
@@ -81,7 +81,7 @@ void __update_cache(struct vm_area_struc
 	unsigned long pfn, addr;
 
 	pfn = pte_pfn(pte);
-	if (pfn_valid(pfn) && (page = pfn_to_page(pfn), page->mapping) &&
+	if (pfn_valid(pfn) && (page = pfn_to_page(pfn), page_mapping(page)) &&
 	    Page_dcache_dirty(page)) {
 		if (pages_do_alias((unsigned long)page_address(page),
 		                   address & PAGE_MASK)) {
@@ -93,8 +93,6 @@ void __update_cache(struct vm_area_struc
 	}
 }
 
-EXPORT_SYMBOL(flush_dcache_page);
-
 extern void ld_mmu_r23000(void);
 extern void ld_mmu_r4xx0(void);
 extern void ld_mmu_tx39(void);
--- diff/arch/mips/mm/cex-sb1.S	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/mm/cex-sb1.S	2004-04-21 10:45:33.658586616 +0100
@@ -23,7 +23,6 @@
 #include <asm/mipsregs.h>
 #include <asm/stackframe.h>
 #include <asm/cacheops.h>
-#include <asm/processor.h>
 #include <asm/sibyte/board.h>
 
 #define C0_ERRCTL     $26             /* CP0: Error info */
--- diff/arch/mips/mm/dma-coherent.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/mips/mm/dma-coherent.c	2004-04-21 10:45:33.658586616 +0100
@@ -24,7 +24,7 @@ void *dma_alloc_noncoherent(struct devic
 	/* ignore region specifiers */
 	gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);
 
-	if (dev == NULL || (*dev->dma_mask < 0xffffffff))
+	if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff))
 		gfp |= GFP_DMA;
 	ret = (void *) __get_free_pages(gfp, get_order(size));
 
@@ -119,16 +119,16 @@ void dma_unmap_sg(struct device *dev, st
 
 EXPORT_SYMBOL(dma_unmap_sg);
 
-void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size,
-		enum dma_data_direction direction)
+void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle,
+	size_t size, enum dma_data_direction direction)
 {
 	BUG_ON(direction == DMA_NONE);
 }
 
 EXPORT_SYMBOL(dma_sync_single_for_cpu);
 
-void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t size,
-		enum dma_data_direction direction)
+void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle,
+	size_t size, enum dma_data_direction direction)
 {
 	BUG_ON(direction == DMA_NONE);
 }
@@ -169,6 +169,13 @@ void dma_sync_sg_for_device(struct devic
 
 EXPORT_SYMBOL(dma_sync_sg_for_device);
 
+int dma_mapping_error(dma_addr_t dma_addr)
+{
+	return 0;
+}
+
+EXPORT_SYMBOL(dma_mapping_error);
+
 int dma_supported(struct device *dev, u64 mask)
 {
 	/*
--- diff/arch/mips/mm/dma-ip27.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/mips/mm/dma-ip27.c	2004-04-21 10:45:33.659586464 +0100
@@ -29,7 +29,7 @@ void *dma_alloc_noncoherent(struct devic
 	/* ignore region specifiers */
 	gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);
 
-	if (dev == NULL || (*dev->dma_mask < 0xffffffff))
+	if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff))
 		gfp |= GFP_DMA;
 	ret = (void *) __get_free_pages(gfp, get_order(size));
 
@@ -175,6 +175,13 @@ void dma_sync_sg_for_device(struct devic
 
 EXPORT_SYMBOL(dma_sync_sg_for_device);
 
+int dma_mapping_error(dma_addr_t dma_addr)
+{
+	return 0;
+}
+
+EXPORT_SYMBOL(dma_mapping_error);
+
 int dma_supported(struct device *dev, u64 mask)
 {
 	/*
@@ -213,7 +220,7 @@ dma64_addr_t pci_dac_page_to_dma(struct 
 	return (dma64_addr_t) pdev_to_baddr(pdev, addr);
 }
 
-EXPORT_SYMBOL(dma_cache_sync);
+EXPORT_SYMBOL(pci_dac_page_to_dma);
 
 struct page *pci_dac_dma_to_page(struct pci_dev *pdev,
 	dma64_addr_t dma_addr)
--- diff/arch/mips/mm/dma-noncoherent.c	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/mips/mm/dma-noncoherent.c	2004-04-21 10:45:33.659586464 +0100
@@ -30,7 +30,7 @@ void *dma_alloc_noncoherent(struct devic
 	/* ignore region specifiers */
 	gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);
 
-	if (dev == NULL || (*dev->dma_mask < 0xffffffff))
+	if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff))
 		gfp |= GFP_DMA;
 	ret = (void *) __get_free_pages(gfp, get_order(size));
 
@@ -226,8 +226,8 @@ void dma_unmap_sg(struct device *dev, st
 
 EXPORT_SYMBOL(dma_unmap_sg);
 
-void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size,
-	enum dma_data_direction direction)
+void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle,
+	size_t size, enum dma_data_direction direction)
 {
 	unsigned long addr;
  
@@ -239,8 +239,8 @@ void dma_sync_single_for_cpu(struct devi
 
 EXPORT_SYMBOL(dma_sync_single_for_cpu);
 
-void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t size,
-	enum dma_data_direction direction)
+void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle,
+	size_t size, enum dma_data_direction direction)
 {
 	unsigned long addr;
 
@@ -308,6 +308,13 @@ void dma_sync_sg_for_device(struct devic
 
 EXPORT_SYMBOL(dma_sync_sg_for_device);
 
+int dma_mapping_error(dma_addr_t dma_addr)
+{
+	return 0;
+}
+
+EXPORT_SYMBOL(dma_mapping_error);
+
 int dma_supported(struct device *dev, u64 mask)
 {
 	/*
--- diff/arch/mips/mm/fault.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/mm/fault.c	2004-04-21 10:45:33.659586464 +0100
@@ -22,7 +22,6 @@
 
 #include <asm/branch.h>
 #include <asm/hardirq.h>
-#include <asm/pgalloc.h>
 #include <asm/mmu_context.h>
 #include <asm/system.h>
 #include <asm/uaccess.h>
--- diff/arch/mips/mm/highmem.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/mm/highmem.c	2004-04-21 10:45:33.660586312 +0100
@@ -3,13 +3,11 @@
 #include <linux/highmem.h>
 #include <asm/tlbflush.h>
 
-void *kmap(struct page *page)
+void *__kmap(struct page *page)
 {
 	void *addr;
 
-	if (in_interrupt())
-		BUG();
-
+	might_sleep();
 	if (page < highmem_start_page)
 		return page_address(page);
 	addr = kmap_high(page);
@@ -18,7 +16,7 @@ void *kmap(struct page *page)
 	return addr;
 }
 
-void kunmap(struct page *page)
+void __kunmap(struct page *page)
 {
 	if (in_interrupt())
 		BUG();
@@ -36,7 +34,7 @@ void kunmap(struct page *page)
  * kmaps are appropriate for short, tight code paths only.
  */
 
-void *kmap_atomic(struct page *page, enum km_type type)
+void *__kmap_atomic(struct page *page, enum km_type type)
 {
 	enum fixed_addresses idx;
 	unsigned long vaddr;
@@ -58,7 +56,7 @@ void *kmap_atomic(struct page *page, enu
 	return (void*) vaddr;
 }
 
-void kunmap_atomic(void *kvaddr, enum km_type type)
+void __kunmap_atomic(void *kvaddr, enum km_type type)
 {
 #ifdef CONFIG_DEBUG_HIGHMEM
 	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
@@ -85,7 +83,7 @@ void kunmap_atomic(void *kvaddr, enum km
 	preempt_check_resched();
 }
 
-struct page *kmap_atomic_to_page(void *ptr)
+struct page *__kmap_atomic_to_page(void *ptr)
 {
 	unsigned long idx, vaddr = (unsigned long)ptr;
 	pte_t *pte;
@@ -98,8 +96,8 @@ struct page *kmap_atomic_to_page(void *p
 	return pte_page(*pte);
 }
 
-EXPORT_SYMBOL(kmap);
-EXPORT_SYMBOL(kunmap);
-EXPORT_SYMBOL(kmap_atomic);
-EXPORT_SYMBOL(kunmap_atomic);
-EXPORT_SYMBOL(kmap_atomic_to_page);
+EXPORT_SYMBOL(__kmap);
+EXPORT_SYMBOL(__kunmap);
+EXPORT_SYMBOL(__kmap_atomic);
+EXPORT_SYMBOL(__kunmap_atomic);
+EXPORT_SYMBOL(__kmap_atomic_to_page);
--- diff/arch/mips/mm/init.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/mm/init.c	2004-04-21 10:45:33.660586312 +0100
@@ -29,9 +29,10 @@
 #include <asm/cachectl.h>
 #include <asm/cpu.h>
 #include <asm/dma.h>
-#include <asm/pgalloc.h>
 #include <asm/mmu_context.h>
 #include <asm/sections.h>
+#include <asm/pgtable.h>
+#include <asm/pgalloc.h>
 #include <asm/tlb.h>
 
 DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
@@ -163,7 +164,7 @@ void __init paging_init(void)
 	if (cpu_has_dc_aliases) {
 		printk(KERN_WARNING "This processor doesn't support highmem.");
 		if (high - low)
-			printk(" %dk highmem ignored", high - low);
+			printk(" %ldk highmem ignored", high - low);
 		printk("\n");
 	} else
 		zones_size[ZONE_HIGHMEM] = high - low;
@@ -203,7 +204,6 @@ void __init mem_init(void)
 	unsigned long tmp, ram;
 
 #ifdef CONFIG_HIGHMEM
-	highstart_pfn = (KSEG1 - KSEG0) >> PAGE_SHIFT;
 	highmem_start_page = mem_map + highstart_pfn;
 #ifdef CONFIG_DISCONTIGMEM
 #error "CONFIG_HIGHMEM and CONFIG_DISCONTIGMEM dont work together yet"
@@ -234,6 +234,9 @@ void __init mem_init(void)
 			continue;
 		}
 		ClearPageReserved(page);
+#ifdef CONFIG_LIMITED_DMA
+		set_page_address(page, lowmem_page_address(page));
+#endif
 		set_bit(PG_highmem, &page->flags);
 		atomic_set(&page->count, 1);
 		__free_page(page);
--- diff/arch/mips/mm/ioremap.c	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/mips/mm/ioremap.c	2004-04-21 10:45:33.660586312 +0100
@@ -13,7 +13,6 @@
 #include <linux/vmalloc.h>
 #include <asm/cacheflush.h>
 #include <asm/io.h>
-#include <asm/pgalloc.h>
 #include <asm/tlbflush.h>
 
 static inline void remap_area_pte(pte_t * pte, unsigned long address,
@@ -153,7 +152,7 @@ void * __ioremap(phys_t phys_addr, phys_
 	 */
 	offset = phys_addr & ~PAGE_MASK;
 	phys_addr &= PAGE_MASK;
-	size = PAGE_ALIGN(last_addr) - phys_addr;
+	size = PAGE_ALIGN(last_addr + 1) - phys_addr;
 
 	/*
 	 * Ok, go for it..
--- diff/arch/mips/mm/pg-r4k.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/mm/pg-r4k.c	2004-04-21 10:45:33.661586160 +0100
@@ -344,11 +344,21 @@ void __init build_clear_page(void)
 
 	if (cpu_has_prefetch) {
 		switch (current_cpu_data.cputype) {
+		case CPU_RM9000:
+			/*
+			 * As a workaround for erratum G105 which make the
+			 * PrepareForStore hint unusable we fall back to
+			 * StoreRetained on the RM9000.  Once it is known which
+			 * versions of the RM9000 we'll be able to condition-
+			 * alize this.
+			 */
+
 		case CPU_R10000:
 		case CPU_R12000:
 			pref_src_mode = Pref_LoadStreamed;
 			pref_dst_mode = Pref_StoreRetained;
 			break;
+
 		default:
 			pref_src_mode = Pref_LoadStreamed;
 			pref_dst_mode = Pref_PrepareForStore;
--- diff/arch/mips/mm/pgtable-64.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/mm/pgtable-64.c	2004-04-21 10:45:33.661586160 +0100
@@ -9,7 +9,6 @@
 #include <linux/init.h>
 #include <linux/mm.h>
 #include <asm/pgtable.h>
-#include <asm/pgalloc.h>
 
 void pgd_init(unsigned long page)
 {
--- diff/arch/mips/mm/sc-ip22.c	2003-08-20 14:16:25.000000000 +0100
+++ source/arch/mips/mm/sc-ip22.c	2004-04-21 10:45:33.661586160 +0100
@@ -65,8 +65,8 @@ static void indy_sc_wback_invalidate(uns
 	printk("indy_sc_wback_invalidate[%08lx,%08lx]", addr, size);
 #endif
 
-	if (!size)
-		return;
+	/* Catch bad driver code */
+	BUG_ON(size == 0);
 
 	/* Which lines to flush?  */
 	first_line = SC_INDEX(addr);
--- diff/arch/mips/mm/sc-r5k.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/mm/sc-r5k.c	2004-04-21 10:45:33.662586008 +0100
@@ -37,6 +37,9 @@ static void r5k_dma_cache_inv_sc(unsigne
 {
 	unsigned long end, a;
 
+	/* Catch bad driver code */
+	BUG_ON(size == 0);
+
 	if (size >= scache_size) {
 		blast_r5000_scache();
 		return;
--- diff/arch/mips/mm/sc-rm7k.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/mm/sc-rm7k.c	2004-04-21 10:45:33.662586008 +0100
@@ -1,8 +1,11 @@
 /*
  * sc-rm7k.c: RM7000 cache management functions.
  *
- * Copyright (C) 1997, 2001, 2003 Ralf Baechle (ralf@gnu.org),
+ * Copyright (C) 1997, 2001, 2003, 2004 Ralf Baechle (ralf@linux-mips.org)
  */
+
+#undef DEBUG
+
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include <linux/mm.h>
@@ -34,9 +37,10 @@ static void rm7k_sc_wback_inv(unsigned l
 {
 	unsigned long end, a;
 
-#ifdef DEBUG_CACHE
-	printk("rm7k_sc_wback_inv[%08lx,%08lx]", addr, size);
-#endif
+	pr_debug("rm7k_sc_wback_inv[%08lx,%08lx]", addr, size);
+
+	/* Catch bad driver code */
+	BUG_ON(size == 0);
 
 	a = addr & ~(sc_lsize - 1);
 	end = (addr + size - 1) & ~(sc_lsize - 1);
@@ -64,9 +68,10 @@ static void rm7k_sc_inv(unsigned long ad
 {
 	unsigned long end, a;
 
-#ifdef DEBUG_CACHE
-	printk("rm7k_sc_inv[%08lx,%08lx]", addr, size);
-#endif
+	pr_debug("rm7k_sc_inv[%08lx,%08lx]", addr, size);
+
+	/* Catch bad driver code */
+	BUG_ON(size == 0);
 
 	a = addr & ~(sc_lsize - 1);
 	end = (addr + size - 1) & ~(sc_lsize - 1);
@@ -105,16 +110,16 @@ static void rm7k_sc_inv(unsigned long ad
  *
  * It seems we get our kicks from relying on unguaranteed behaviour in GCC
  */
-static __init void rm7k_sc_enable(void)
+static __init void __rm7k_sc_enable(void)
 {
 	int i;
 
-	set_c0_config(1<<3);				/* CONF_SE */
+	set_c0_config(1 << 3);				/* CONF_SE */
 
 	write_c0_taglo(0);
 	write_c0_taghi(0);
 
-	for (i=0; i<scache_size; i+=sc_lsize) {
+	for (i = 0; i < scache_size; i += sc_lsize) {
 		__asm__ __volatile__ (
 		      ".set noreorder\n\t"
 		      ".set mips3\n\t"
@@ -122,11 +127,21 @@ static __init void rm7k_sc_enable(void)
 		      ".set mips0\n\t"
 		      ".set reorder"
 		      :
-		      : "r" (KSEG0ADDR(i)),
-		        "i" (Index_Store_Tag_SD));
+		      : "r" (KSEG0ADDR(i)), "i" (Index_Store_Tag_SD));
 	}
 }
 
+static __init void rm7k_sc_enable(void)
+{
+	void (*func)(void) = (void *) KSEG1ADDR(&__rm7k_sc_enable);
+
+	if (read_c0_config() & 0x08)			/* CONF_SE */
+		return;
+
+	printk(KERN_INFO "Enabling secondary cache...");
+	func();
+}
+
 static void rm7k_sc_disable(void)
 {
 	clear_c0_config(1<<3);				/* CONF_SE */
@@ -134,22 +149,17 @@ static void rm7k_sc_disable(void)
 
 static inline int __init rm7k_sc_probe(void)
 {
-	void (*func)(void) = KSEG1ADDR(&rm7k_sc_enable);
 	unsigned int config = read_c0_config();
 
 	if ((config >> 31) & 1)
 		return 0;
 
-	printk(KERN_INFO "Secondary cache size %ldK, linesize %ld bytes.\n",
+	printk(KERN_INFO "Secondary cache size %dK, linesize %d bytes.\n",
 	       (scache_size >> 10), sc_lsize);
 
 	if ((config >> 3) & 1)                          /* CONF_SE */
 		return 1;
 
-	printk(KERN_INFO "Enabling secondary cache...");
-	func();
-	printk("  done\n");
-
 	/*
 	 * While we're at it let's deal with the tertiary cache.
 	 */
--- diff/arch/mips/mm/tlb-andes.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/mm/tlb-andes.c	2004-04-21 10:45:33.662586008 +0100
@@ -229,7 +229,7 @@ void __update_tlb(struct vm_area_struct 
 	ptep = pte_offset_map(pmdp, address);
 	write_c0_entrylo0(pte_val(*ptep++) >> 6);
 	write_c0_entrylo1(pte_val(*ptep) >> 6);
-	write_c0_entryhi(address | (pid));
+	write_c0_entryhi(address | pid);
 	if (idx < 0) {
 		tlb_write_random();
 	} else {
--- diff/arch/mips/mm/tlb-r4k.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/mm/tlb-r4k.c	2004-04-21 10:45:33.663585856 +0100
@@ -39,10 +39,9 @@ void local_flush_tlb_all(void)
 
 	local_irq_save(flags);
 	/* Save old context and create impossible VPN2 value */
-	old_ctx = read_c0_entryhi() & ASID_MASK;
+	old_ctx = read_c0_entryhi();
 	write_c0_entrylo0(0);
 	write_c0_entrylo1(0);
-	BARRIER;
 
 	entry = read_c0_wired();
 
@@ -54,12 +53,11 @@ void local_flush_tlb_all(void)
 		 */
 		write_c0_entryhi(CKSEG0 + (entry << (PAGE_SHIFT + 1)));
 		write_c0_index(entry);
-		BARRIER;
+		mtc0_tlbw_hazard();
 		tlb_write_indexed();
-		BARRIER;
 		entry++;
 	}
-	BARRIER;
+	tlbw_use_hazard();
 	write_c0_entryhi(old_ctx);
 	local_irq_restore(flags);
 }
@@ -86,7 +84,7 @@ void local_flush_tlb_range(struct vm_are
 		size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
 		size = (size + 1) >> 1;
 		if (size <= current_cpu_data.tlbsize/2) {
-			int oldpid = read_c0_entryhi() & ASID_MASK;
+			int oldpid = read_c0_entryhi();
 			int newpid = cpu_asid(cpu, mm);
 
 			start &= (PAGE_MASK << 1);
@@ -97,7 +95,7 @@ void local_flush_tlb_range(struct vm_are
 
 				write_c0_entryhi(start | newpid);
 				start += (PAGE_SIZE << 1);
-				BARRIER;
+				mtc0_tlbw_hazard();
 				tlb_probe();
 				BARRIER;
 				idx = read_c0_index();
@@ -108,10 +106,10 @@ void local_flush_tlb_range(struct vm_are
 				/* Make sure all entries differ. */
 				write_c0_entryhi(CKSEG0 +
 				                 (idx << (PAGE_SHIFT + 1)));
-				BARRIER;
+				mtc0_tlbw_hazard();
 				tlb_write_indexed();
-				BARRIER;
 			}
+			tlbw_use_hazard();
 			write_c0_entryhi(oldpid);
 		} else {
 			drop_mmu_context(mm, cpu);
@@ -140,7 +138,7 @@ void local_flush_tlb_kernel_range(unsign
 
 			write_c0_entryhi(start);
 			start += (PAGE_SIZE << 1);
-			BARRIER;
+			mtc0_tlbw_hazard();
 			tlb_probe();
 			BARRIER;
 			idx = read_c0_index();
@@ -150,10 +148,10 @@ void local_flush_tlb_kernel_range(unsign
 				continue;
 			/* Make sure all entries differ. */
 			write_c0_entryhi(CKSEG0 + (idx << (PAGE_SHIFT + 1)));
-			BARRIER;
+			mtc0_tlbw_hazard();
 			tlb_write_indexed();
-			BARRIER;
 		}
+		tlbw_use_hazard();
 		write_c0_entryhi(pid);
 	} else {
 		local_flush_tlb_all();
@@ -172,9 +170,9 @@ void local_flush_tlb_page(struct vm_area
 		newpid = cpu_asid(cpu, vma->vm_mm);
 		page &= (PAGE_MASK << 1);
 		local_irq_save(flags);
-		oldpid = read_c0_entryhi() & ASID_MASK;
+		oldpid = read_c0_entryhi();
 		write_c0_entryhi(page | newpid);
-		BARRIER;
+		mtc0_tlbw_hazard();
 		tlb_probe();
 		BARRIER;
 		idx = read_c0_index();
@@ -184,11 +182,11 @@ void local_flush_tlb_page(struct vm_area
 			goto finish;
 		/* Make sure all entries differ. */
 		write_c0_entryhi(CKSEG0 + (idx << (PAGE_SHIFT + 1)));
-		BARRIER;
+		mtc0_tlbw_hazard();
 		tlb_write_indexed();
+		tlbw_use_hazard();
 
 	finish:
-		BARRIER;
 		write_c0_entryhi(oldpid);
 		local_irq_restore(flags);
 	}
@@ -205,9 +203,9 @@ void local_flush_tlb_one(unsigned long p
 
 	local_irq_save(flags);
 	page &= (PAGE_MASK << 1);
-	oldpid = read_c0_entryhi() & 0xff;
+	oldpid = read_c0_entryhi();
 	write_c0_entryhi(page);
-	BARRIER;
+	mtc0_tlbw_hazard();
 	tlb_probe();
 	BARRIER;
 	idx = read_c0_index();
@@ -216,10 +214,10 @@ void local_flush_tlb_one(unsigned long p
 	if (idx >= 0) {
 		/* Make sure all entries differ. */
 		write_c0_entryhi(CKSEG0 + (idx << (PAGE_SHIFT + 1)));
-		BARRIER;
+		mtc0_tlbw_hazard();
 		tlb_write_indexed();
+		tlbw_use_hazard();
 	}
-	BARRIER;
 	write_c0_entryhi(oldpid);
 
 	local_irq_restore(flags);
@@ -250,25 +248,23 @@ void __update_tlb(struct vm_area_struct 
 	address &= (PAGE_MASK << 1);
 	write_c0_entryhi(address | pid);
 	pgdp = pgd_offset(vma->vm_mm, address);
-	BARRIER;
+	mtc0_tlbw_hazard();
 	tlb_probe();
 	BARRIER;
 	pmdp = pmd_offset(pgdp, address);
 	idx = read_c0_index();
 	ptep = pte_offset_map(pmdp, address);
-	BARRIER;
+
 	write_c0_entrylo0(pte_val(*ptep++) >> 6);
 	write_c0_entrylo1(pte_val(*ptep) >> 6);
 	write_c0_entryhi(address | pid);
-	BARRIER;
-	if (idx < 0) {
+	mtc0_tlbw_hazard();
+	if (idx < 0)
 		tlb_write_random();
-	} else {
+	else
 		tlb_write_indexed();
-	}
-	BARRIER;
+	tlbw_use_hazard();
 	write_c0_entryhi(pid);
-	BARRIER;
 	local_irq_restore(flags);
 }
 
@@ -277,6 +273,7 @@ static void r4k_update_mmu_cache_hwbug(s
 				       unsigned long address, pte_t pte)
 {
 	unsigned long flags;
+	unsigned int asid;
 	pgd_t *pgdp;
 	pmd_t *pmdp;
 	pte_t *ptep;
@@ -284,20 +281,23 @@ static void r4k_update_mmu_cache_hwbug(s
 
 	local_irq_save(flags);
 	address &= (PAGE_MASK << 1);
-	write_c0_entryhi(address | (read_c0_entryhi() & ASID_MASK));
+	asid = read_c0_entryhi() & ASID_MASK;
+	write_c0_entryhi(address | asid);
 	pgdp = pgd_offset(vma->vm_mm, address);
+	mtc0_tlbw_hazard();
 	tlb_probe();
+	BARRIER;
 	pmdp = pmd_offset(pgdp, address);
 	idx = read_c0_index();
 	ptep = pte_offset_map(pmdp, address);
 	write_c0_entrylo0(pte_val(*ptep++) >> 6);
 	write_c0_entrylo1(pte_val(*ptep) >> 6);
-	BARRIER;
+	mtc0_tlbw_hazard();
 	if (idx < 0)
 		tlb_write_random();
 	else
 		tlb_write_indexed();
-	BARRIER;
+	tlbw_use_hazard();
 	local_irq_restore(flags);
 }
 #endif
@@ -312,7 +312,7 @@ void __init add_wired_entry(unsigned lon
 
 	local_irq_save(flags);
 	/* Save old context and create impossible VPN2 value */
-	old_ctx = read_c0_entryhi() & ASID_MASK;
+	old_ctx = read_c0_entryhi();
 	old_pagemask = read_c0_pagemask();
 	wired = read_c0_wired();
 	write_c0_wired(wired + 1);
@@ -322,9 +322,9 @@ void __init add_wired_entry(unsigned lon
 	write_c0_entryhi(entryhi);
 	write_c0_entrylo0(entrylo0);
 	write_c0_entrylo1(entrylo1);
-	BARRIER;
+	mtc0_tlbw_hazard();
 	tlb_write_indexed();
-	BARRIER;
+	tlbw_use_hazard();
 
 	write_c0_entryhi(old_ctx);
 	BARRIER;
@@ -352,7 +352,7 @@ __init int add_temporary_entry(unsigned 
 
 	local_irq_save(flags);
 	/* Save old context and create impossible VPN2 value */
-	old_ctx = read_c0_entryhi() & ASID_MASK;
+	old_ctx = read_c0_entryhi();
 	old_pagemask = read_c0_pagemask();
 	wired = read_c0_wired();
 	if (--temp_tlb_entry < wired) {
@@ -362,17 +362,15 @@ __init int add_temporary_entry(unsigned 
 	}
 
 	write_c0_index(temp_tlb_entry);
-	BARRIER;
 	write_c0_pagemask(pagemask);
 	write_c0_entryhi(entryhi);
 	write_c0_entrylo0(entrylo0);
 	write_c0_entrylo1(entrylo1);
-	BARRIER;
+	mtc0_tlbw_hazard();
 	tlb_write_indexed();
-	BARRIER;
+	tlbw_use_hazard();
 
 	write_c0_entryhi(old_ctx);
-	BARRIER;
 	write_c0_pagemask(old_pagemask);
 out:
 	local_irq_restore(flags);
--- diff/arch/mips/momentum/jaguar_atx/Makefile	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/momentum/jaguar_atx/Makefile	2004-04-21 10:45:33.665585552 +0100
@@ -1,8 +1,12 @@
 #
 # Makefile for Momentum Computer's Jaguar-ATX board.
 #
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
 
-obj-y	 		+= mv-irq.o int-handler.o irq.o pci-irq.o prom.o reset.o setup.o
-obj-$(CONFIG_PCI)	+= pci.o
+obj-y += int-handler.o irq.o prom.o reset.o setup.o
 
+obj-$(CONFIG_SERIAL_8250_CONSOLE) += ja-console.o
 obj-$(CONFIG_REMOTE_DEBUG) += dbg_io.o
--- diff/arch/mips/momentum/jaguar_atx/int-handler.S	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/momentum/jaguar_atx/int-handler.S	2004-04-21 10:45:33.665585552 +0100
@@ -18,7 +18,6 @@
 #include <asm/addrspace.h>
 #include <asm/regdef.h>
 #include <asm/stackframe.h>
-#include "jaguar_atx_fpga.h"
 
 /*
  * First level interrupt dispatcher for Ocelot-CS board
@@ -120,7 +119,7 @@ ll_uart_irq:
 ll_cputimer_irq:
 		li	a0, 7
 		move	a1, sp
-		jal	do_IRQ
+		jal	ll_timer_interrupt
 		j	ret_from_irq
 	
 ll_mv64340_decode_irq:
--- diff/arch/mips/momentum/jaguar_atx/irq.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/momentum/jaguar_atx/irq.c	2004-04-21 10:45:33.665585552 +0100
@@ -32,27 +32,17 @@
  *  with this program; if not, write  to the Free Software Foundation, Inc.,
  *  675 Mass Ave, Cambridge, MA 02139, USA.
  */
-#include <linux/config.h>
-#include <linux/errno.h>
 #include <linux/init.h>
-#include <linux/sched.h>
-#include <linux/types.h>
 #include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/timex.h>
-#include <linux/slab.h>
-#include <asm/bootinfo.h>
+#include <linux/signal.h>
+#include <linux/types.h>
+#include <asm/irq_cpu.h>
 #include <asm/mipsregs.h>
 
 extern asmlinkage void jaguar_handle_int(void);
-extern void mv64340_irq_init(void);
 
 static struct irqaction cascade_mv64340 = {
-	no_action, SA_INTERRUPT, 0, "cascade via MV64340", NULL, NULL
-};
-
-static struct irqaction unused_irq = {
-	no_action, SA_INTERRUPT, 0, "unused", NULL, NULL
+	no_action, SA_INTERRUPT, 0, "MV64340-Cascade", NULL, NULL
 };
 
 void __init init_IRQ(void)
@@ -72,19 +62,7 @@ void __init init_IRQ(void)
 	/* set up the cascading interrupts */
 	setup_irq(8, &cascade_mv64340);
 
-	/* mark unconnected IRQs as unconnected */
-	setup_irq(9, &unused_irq);
+	mv64340_irq_init(16);
 
-	/* mark un-used IRQ numbers as unconnected */
-	setup_irq(10, &unused_irq);
-	setup_irq(13, &unused_irq);
-	setup_irq(14, &unused_irq);
-
-	mv64340_irq_init();
-
-#ifdef CONFIG_REMOTE_DEBUG
-	printk("start kgdb ...\n");
-	set_debug_traps();
-	breakpoint();	/* you may move this line to whereever you want :-) */
-#endif
+	set_c0_status(ST0_IM);
 }
--- diff/arch/mips/momentum/jaguar_atx/jaguar_atx_fpga.h	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/momentum/jaguar_atx/jaguar_atx_fpga.h	2004-04-21 10:45:33.666585400 +0100
@@ -26,14 +26,6 @@
 #ifndef __JAGUAR_ATX_FPGA_H__
 #define __JAGUAR_ATX_FPGA_H__
 
-#include <linux/config.h>
-
-#ifdef CONFIG_MIPS64
-#define JAGUAR_ATX_CS0_ADDR (0xfffffffffc000000)
-#else
-#define JAGUAR_ATX_CS0_ADDR (0xfc000000)
-#endif
-
 #define JAGUAR_ATX_REG_BOARDREV		0x0
 #define JAGUAR_ATX_REG_FPGA_REV		0x1
 #define JAGUAR_ATX_REG_FPGA_TYPE	0x2
@@ -50,7 +42,11 @@
 #define JAGUAR_ATX_REG_RESERVED5	0xe
 #define JAGUAR_ATX_REG_RESERVED6	0xf
 
-#define JAGUAR_FPGA_WRITE(x,y) writeb(x,JAGUAR_ATX_CS0_ADDR+JAGUAR_ATX_REG_##y)
-#define JAGUAR_FPGA_READ(x) readb(JAGUAR_ATX_CS0_ADDR + JAGUAR_ATX_REG_##x)
+#define JAGUAR_ATX_CS0_ADDR		0xfc000000L
+
+extern unsigned long ja_fpga_base;
+
+#define JAGUAR_FPGA_WRITE(x,y) writeb(x, ja_fpga_base + JAGUAR_ATX_REG_##y)
+#define JAGUAR_FPGA_READ(x) readb(ja_fpga_base + JAGUAR_ATX_REG_##x)
 
 #endif
--- diff/arch/mips/momentum/jaguar_atx/prom.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/momentum/jaguar_atx/prom.c	2004-04-21 10:45:33.668585096 +0100
@@ -13,6 +13,8 @@
  * under  the terms of  the GNU General  Public License as published by the
  * Free Software Foundation;  either version 2 of the  License, or (at your
  * option) any later version.
+ *
+ * Added changes for SMP - Manish Lachwani (lachwani@pmc-sierra.com)
  */
 #include <linux/config.h>
 #include <linux/init.h>
@@ -26,33 +28,32 @@
 
 #include "jaguar_atx_fpga.h"
 
+extern void ja_setup_console(void);
 
 struct callvectors {
-	int	(*open) (char*, int, int);
-	int	(*close) (int);
-	int	(*read) (int, void*, int);
-	int	(*write) (int, void*, int);
-	off_t	(*lseek) (int, off_t, int);
-	int	(*printf) (const char*, ...);
-	void	(*cacheflush) (void);
-	char*	(*gets) (char*);
+	int	(*open) (char*, int, int);		/*	 0 */
+	int	(*close) (int);				/*	 4 */
+	int	(*read) (int, void*, int);		/*	 8 */
+	int	(*write) (int, void*, int);		/*	12 */
+	off_t	(*lseek) (int, off_t, int);		/*	16 */
+	int	(*printf) (const char*, ...);		/*	20 */
+	void	(*cacheflush) (void);			/*	24 */
+	char*	(*gets) (char*);			/*	28 */
 };
 
-struct callvectors* debug_vectors;
+struct callvectors *debug_vectors;
 
 extern unsigned long mv64340_base;
 extern unsigned long cpu_clock;
 
-#ifdef CONFIG_MV64340_ETH
-extern unsigned char prom_mac_addr_base[6];
-#endif
-
 const char *get_system_type(void)
 {
 	return "Momentum Jaguar-ATX";
 }
 
 #ifdef CONFIG_MV64340_ETH
+extern unsigned char prom_mac_addr_base[6];
+
 static void burn_clocks(void)
 {
 	int i;
@@ -100,56 +101,58 @@ void get_mac(char dest[6])
 }
 #endif
 
-
 #ifdef CONFIG_MIPS64
 
 unsigned long signext(unsigned long addr)
 {
-  addr &= 0xffffffff;
-  return (unsigned long)((int)addr);
+	addr &= 0xffffffff;
+	return (unsigned long)((int)addr);
 }
 
 void *get_arg(unsigned long args, int arc)
 {
-  unsigned long ul;
-  unsigned char *puc, uc;
+	unsigned long ul;
+	unsigned char *puc, uc;
 
-  args += (arc * 4);
-  ul = (unsigned long)signext(args);
-  puc = (unsigned char *)ul;
-  if (puc == 0)
-    return (void *)0;
+	args += (arc * 4);
+	ul = (unsigned long)signext(args);
+	puc = (unsigned char *)ul;
+	if (puc == 0)
+		return (void *)0;
 
 #ifdef CONFIG_CPU_LITTLE_ENDIAN
-  uc = *puc++;
-  ul = (unsigned long)uc;
-  uc = *puc++;
-  ul |= (((unsigned long)uc) << 8);
-  uc = *puc++;
-  ul |= (((unsigned long)uc) << 16);
-  uc = *puc++;
-  ul |= (((unsigned long)uc) << 24);
+	uc = *puc++;
+	l = (unsigned long)uc;
+	uc = *puc++;
+	ul |= (((unsigned long)uc) << 8);
+	uc = *puc++;
+	ul |= (((unsigned long)uc) << 16);
+	uc = *puc++;
+	ul |= (((unsigned long)uc) << 24);
 #else
-  uc = *puc++;
-  ul = ((unsigned long)uc) << 24;
-  uc = *puc++;
-  ul |= (((unsigned long)uc) << 16);
-  uc = *puc++;
-  ul |= (((unsigned long)uc) << 8);
-  uc = *puc++;
-  ul |= ((unsigned long)uc);
+	uc = *puc++;
+	ul = ((unsigned long)uc) << 24;
+	uc = *puc++;
+	ul |= (((unsigned long)uc) << 16);
+	uc = *puc++;
+	ul |= (((unsigned long)uc) << 8);
+	uc = *puc++;
+	ul |= ((unsigned long)uc);
 #endif
-  ul = signext(ul);
-  return (void *)ul;
+	ul = signext(ul);
+
+	return (void *)ul;
 }
 
 char *arg64(unsigned long addrin, int arg_index)
 {
-  unsigned long args;
-  char *p;
-  args = signext(addrin);
-  p = (char *)get_arg(args, arg_index);
-  return p;
+	unsigned long args;
+	char *p;
+
+	args = signext(addrin);
+	p = (char *)get_arg(args, arg_index);
+
+	return p;
 }
 #endif  /* CONFIG_MIPS64 */
 
@@ -159,7 +162,13 @@ void __init prom_init(void)
 	int argc = fw_arg0;
 	char **arg = (char **) fw_arg1;
 	char **env = (char **) fw_arg2;
+	struct callvectors *cv = (struct callvectors *) fw_arg3;
 	int i;
+
+#ifdef CONFIG_SERIAL_8250_CONSOLE
+//	ja_setup_console();	/* The very first thing.  */
+#endif
+
 #ifdef CONFIG_MIPS64
 	char *ptr;
 
@@ -236,13 +245,47 @@ void __init prom_init(void)
 	/* get the base MAC address for on-board ethernet ports */
 	get_mac(prom_mac_addr_base);
 #endif
+}
 
-#ifndef CONFIG_MIPS64
-	debug_vectors->printf("Booting Linux kernel...\n");
-#endif
+void __init prom_free_prom_memory(void)
+{
+}
+
+void __init prom_fixup_mem_map(unsigned long start, unsigned long end)
+{
+}
+
+/*
+ * SMP support
+ */
+int prom_setup_smp(void)
+{
+	int	num_cpus = 2;
+
+	/*
+	 * We know that the RM9000 on the Jaguar ATX board has 2 cores.
+	 * Hence, this can be hardcoded for now.
+	 */
+	return num_cpus;
+}
+
+int prom_boot_secondary(int cpu, unsigned long sp, unsigned long gp)
+{
+	/* Clear the semaphore */
+	*(volatile uint32_t *)(0xbb000a68) = 0x80000000;
+
+	return 1;
+}
+
+void prom_init_secondary(void)
+{
+        clear_c0_config(CONF_CM_CMASK);
+        set_c0_config(0x2);
+
+	clear_c0_status(ST0_IM);
+	set_c0_status(0x1ffff);
 }
 
-unsigned long __init prom_free_prom_memory(void)
+void prom_smp_finish(void)
 {
-	return 0;
 }
--- diff/arch/mips/momentum/jaguar_atx/setup.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/momentum/jaguar_atx/setup.c	2004-04-21 10:45:33.669584944 +0100
@@ -1,6 +1,4 @@
 /*
- * setup.c
- *
  * BRIEF MODULE DESCRIPTION
  * Momentum Computer Jaguar-ATX board dependent boot routines
  *
@@ -42,15 +40,16 @@
  *  675 Mass Ave, Cambridge, MA 02139, USA.
  */
 #include <linux/config.h>
+#include <linux/bcd.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
 #include <linux/mm.h>
+#include <linux/bootmem.h>
 #include <linux/swap.h>
 #include <linux/ioport.h>
 #include <linux/sched.h>
 #include <linux/interrupt.h>
-#include <linux/pci.h>
 #include <linux/timex.h>
 #include <linux/vmalloc.h>
 #include <asm/time.h>
@@ -59,16 +58,15 @@
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/pci.h>
+#include <asm/pci_channel.h>
 #include <asm/processor.h>
 #include <asm/ptrace.h>
 #include <asm/reboot.h>
-#include <linux/bootmem.h>
-#include <linux/blk.h>
+#include <asm/tlbflush.h>
 #include <asm/mv64340.h>
-#include "jaguar_atx_fpga.h"
 
+#include "jaguar_atx_fpga.h"
 
-unsigned long mv64340_base;
 extern unsigned long mv64340_sram_base;
 unsigned long cpu_clock;
 
@@ -81,78 +79,88 @@ void momenco_time_init(void);
 
 static char reset_reason;
 
-#define ENTRYLO(x) ((pte_val(mk_pte_phys((x), PAGE_KERNEL_UNCACHED)) >> 6)|1)
+static inline unsigned long ENTRYLO(unsigned long paddr)
+{
+	return ((paddr & PAGE_MASK) |
+	       (_PAGE_PRESENT | __READABLE | __WRITEABLE | _PAGE_GLOBAL |
+		_CACHE_UNCACHED)) >> 6;
+}
 
 void __init bus_error_init(void) { /* nothing */ }
 
-/* setup code for a handoff from a version 2 PMON 2000 PROM */
-void PMON_v2_setup(void)
-{
-	/* Some wired TLB entries for the MV64340 and perhiperals. The
-	   MV64340 is going to be hit on every IRQ anyway - there's
-	   absolutely no point in letting it be a random TLB entry, as
-	   it'll just cause needless churning of the TLB. And we use
-	   the other half for the serial port, which is just a PITA
-	   otherwise :)
-
-		Device			Physical	Virtual
-		MV64340 Internal Regs	0xf4000000	0xf4000000
-		Ocelot-C[S] PLD (CS0)	0xfc000000	0xfc000000
-		NVRAM (CS1)		0xfc800000	0xfc800000
-		UARTs (CS2)		0xfd000000	0xfd000000
-		Internal SRAM		0xfe000000	0xfe000000
-		M-Systems DOC (CS3)	0xff000000	0xff000000
-	*/
-  printk("PMON_v2_setup\n");
+/*
+ * Load a few TLB entries for the MV64340 and perhiperals. The MV64340 is going
+ * to be hit on every IRQ anyway - there's absolutely no point in letting it be
+ * a random TLB entry, as it'll just cause needless churning of the TLB. And we
+ * use the other half for the serial port, which is just a PITA otherwise :)
+ *
+ *	Device			Physical	Virtual
+ *	MV64340 Internal Regs	0xf4000000	0xf4000000
+ *	Ocelot-C[S] PLD (CS0)	0xfc000000	0xfc000000
+ *	NVRAM (CS1)		0xfc800000	0xfc800000
+ *	UARTs (CS2)		0xfd000000	0xfd000000
+ *	Internal SRAM		0xfe000000	0xfe000000
+ *	M-Systems DOC (CS3)	0xff000000	0xff000000
+ */
 
-#ifdef CONFIG_MIPS64
-	/* marvell and extra space */
-	add_wired_entry(ENTRYLO(0xf4000000), ENTRYLO(0xf4010000), 0xfffffffff4000000, PM_64K);
-	/* fpga, rtc, and uart */
-	add_wired_entry(ENTRYLO(0xfc000000), ENTRYLO(0xfd000000), 0xfffffffffc000000, PM_16M);
-	/* m-sys and internal SRAM */
-	add_wired_entry(ENTRYLO(0xfe000000), ENTRYLO(0xff000000), 0xfffffffffe000000, PM_16M);
+static __init void wire_stupidity_into_tlb(void)
+{
+#ifdef CONFIG_MIPS32
+	write_c0_wired(0);
+	local_flush_tlb_all();
 
-	mv64340_base = 0xfffffffff4000000;
-	mv64340_sram_base = 0xfffffffffe000000;
-#else
 	/* marvell and extra space */
-	add_wired_entry(ENTRYLO(0xf4000000), ENTRYLO(0xf4010000), 0xf4000000, PM_64K);
+	add_wired_entry(ENTRYLO(0xf4000000), ENTRYLO(0xf4010000),
+	                0xf4000000UL, PM_64K);
 	/* fpga, rtc, and uart */
-	add_wired_entry(ENTRYLO(0xfc000000), ENTRYLO(0xfd000000), 0xfc000000, PM_16M);
-	/* m-sys and internal SRAM */
-	add_wired_entry(ENTRYLO(0xfe000000), ENTRYLO(0xff000000), 0xfe000000, PM_16M);
+	add_wired_entry(ENTRYLO(0xfc000000), ENTRYLO(0xfd000000),
+	                0xfc000000UL, PM_16M);
+//	/* m-sys and internal SRAM */
+//	add_wired_entry(ENTRYLO(0xfe000000), ENTRYLO(0xff000000),
+//	                0xfe000000UL, PM_16M);
 
 	mv64340_base = 0xf4000000;
-	mv64340_sram_base = 0xfe000000;
+	//mv64340_sram_base = 0xfe000000;	/* Currently unused */
 #endif
 }
 
-#define CONV_BCD_TO_BIN(val)	(((val) & 0xf) + (((val) >> 4) * 10))
-#define CONV_BIN_TO_BCD(val)	(((val) % 10) + (((val) / 10) << 4))
+unsigned long mv64340_base	= 0xf4000000L;
+unsigned long ja_fpga_base	= JAGUAR_ATX_CS0_ADDR;
+unsigned long uart_base		= 0xfd000000L;
+static unsigned char *rtc_base	= (unsigned char*) 0xfc800000L;
+
+static __init int per_cpu_mappings(void)
+{
+	mv64340_base	= (unsigned long) ioremap(0xf4000000, 0x10000);
+	ja_fpga_base	= (unsigned long) ioremap(JAGUAR_ATX_CS0_ADDR,  0x1000);
+	uart_base	= (unsigned long) ioremap(0xfd000000UL, 0x1000);
+	rtc_base	= ioremap(0xfc000000UL, 0x8000);
+	// ioremap(0xfe000000,  32 << 20);
+	write_c0_wired(0);
+	local_flush_tlb_all();
+	ja_setup_console();
+
+	return 0;
+}
+arch_initcall(per_cpu_mappings);
 
 unsigned long m48t37y_get_time(void)
 {
-#ifdef CONFIG_MIPS64
-	unsigned char *rtc_base = (unsigned char*)0xfffffffffc800000;
-#else
-	unsigned char *rtc_base = (unsigned char*)0xfc800000;
-#endif
 	unsigned int year, month, day, hour, min, sec;
 
 	/* stop the update */
 	rtc_base[0x7ff8] = 0x40;
 
-	year = CONV_BCD_TO_BIN(rtc_base[0x7fff]);
-	year += CONV_BCD_TO_BIN(rtc_base[0x7ff1]) * 100;
+	year = BCD2BIN(rtc_base[0x7fff]);
+	year += BCD2BIN(rtc_base[0x7ff1]) * 100;
 
-	month = CONV_BCD_TO_BIN(rtc_base[0x7ffe]);
+	month = BCD2BIN(rtc_base[0x7ffe]);
 
-	day = CONV_BCD_TO_BIN(rtc_base[0x7ffd]);
+	day = BCD2BIN(rtc_base[0x7ffd]);
 
-	hour = CONV_BCD_TO_BIN(rtc_base[0x7ffb]);
-	min = CONV_BCD_TO_BIN(rtc_base[0x7ffa]);
-	sec = CONV_BCD_TO_BIN(rtc_base[0x7ff9]);
+	hour = BCD2BIN(rtc_base[0x7ffb]);
+	min = BCD2BIN(rtc_base[0x7ffa]);
+	sec = BCD2BIN(rtc_base[0x7ff9]);
 
 	/* start the update */
 	rtc_base[0x7ff8] = 0x00;
@@ -162,11 +170,6 @@ unsigned long m48t37y_get_time(void)
 
 int m48t37y_set_time(unsigned long sec)
 {
-#ifdef CONFIG_MIPS64
-	unsigned char *rtc_base = (unsigned char*)0xfffffffffc800000;
-#else
-	unsigned char *rtc_base = (unsigned char*)0xfc800000;
-#endif
 	struct rtc_time tm;
 
 	/* convert to a more useful format -- note months count from 0 */
@@ -177,22 +180,22 @@ int m48t37y_set_time(unsigned long sec)
 	rtc_base[0x7ff8] = 0x80;
 
 	/* year */
-	rtc_base[0x7fff] = CONV_BIN_TO_BCD(tm.tm_year % 100);
-	rtc_base[0x7ff1] = CONV_BIN_TO_BCD(tm.tm_year / 100);
+	rtc_base[0x7fff] = BIN2BCD(tm.tm_year % 100);
+	rtc_base[0x7ff1] = BIN2BCD(tm.tm_year / 100);
 
 	/* month */
-	rtc_base[0x7ffe] = CONV_BIN_TO_BCD(tm.tm_mon);
+	rtc_base[0x7ffe] = BIN2BCD(tm.tm_mon);
 
 	/* day */
-	rtc_base[0x7ffd] = CONV_BIN_TO_BCD(tm.tm_mday);
+	rtc_base[0x7ffd] = BIN2BCD(tm.tm_mday);
 
 	/* hour/min/sec */
-	rtc_base[0x7ffb] = CONV_BIN_TO_BCD(tm.tm_hour);
-	rtc_base[0x7ffa] = CONV_BIN_TO_BCD(tm.tm_min);
-	rtc_base[0x7ff9] = CONV_BIN_TO_BCD(tm.tm_sec);
+	rtc_base[0x7ffb] = BIN2BCD(tm.tm_hour);
+	rtc_base[0x7ffa] = BIN2BCD(tm.tm_min);
+	rtc_base[0x7ff9] = BIN2BCD(tm.tm_sec);
 
 	/* day of week -- not really used, but let's keep it up-to-date */
-	rtc_base[0x7ffc] = CONV_BIN_TO_BCD(tm.tm_wday + 1);
+	rtc_base[0x7ffc] = BIN2BCD(tm.tm_wday + 1);
 
 	/* disable writing */
 	rtc_base[0x7ff8] = 0x00;
@@ -205,8 +208,14 @@ void momenco_timer_setup(struct irqactio
 	setup_irq(8, irq);
 }
 
+/*
+ * Ugly but the least of all evils.  TLB initialization did flush the TLB so
+ * We need to setup mappings again before we can touch the RTC.
+ */
 void momenco_time_init(void)
 {
+	wire_stupidity_into_tlb();
+
 	mips_hpt_frequency = cpu_clock / 2;
 	board_timer_setup = momenco_timer_setup;
 
@@ -214,7 +223,129 @@ void momenco_time_init(void)
 	rtc_set_time = m48t37y_set_time;
 }
 
-static void __init momenco_jaguar_atx_setup(void)
+static struct resource mv_pci_io_mem0_resource = {
+	.name	= "MV64340 PCI0 IO MEM",
+	.flags	= IORESOURCE_IO
+};
+
+static struct resource mv_pci_mem0_resource = {
+	.name	= "MV64340 PCI0 MEM",
+	.flags	= IORESOURCE_MEM
+};
+
+extern struct pci_ops mv64340_bus0_pci_ops;
+
+static struct pci_controller mv_bus0_controller = {
+	.pci_ops	= &mv64340_bus0_pci_ops,
+	.mem_resource	= &mv_pci_mem0_resource,
+	.io_resource	= &mv_pci_io_mem0_resource,
+};
+
+static uint32_t mv_io_base, mv_io_size;
+
+static void ja_pci0_init(void)
+{
+	uint32_t mem0_base, mem0_size;
+	uint32_t io_base, io_size;
+
+	io_base = MV_READ(MV64340_PCI_0_IO_BASE_ADDR) << 16;
+	io_size = (MV_READ(MV64340_PCI_0_IO_SIZE) + 1) << 16;
+	mem0_base = MV_READ(MV64340_PCI_0_MEMORY0_BASE_ADDR) << 16;
+	mem0_size = (MV_READ(MV64340_PCI_0_MEMORY0_SIZE) + 1) << 16;
+
+	mv_pci_io_mem0_resource.start	= 0;
+	mv_pci_io_mem0_resource.end	= io_size - 1;
+	mv_pci_mem0_resource.start	= mem0_base;
+	mv_pci_mem0_resource.end	= mem0_base + mem0_size - 1;
+	mv_bus0_controller.mem_offset	= mem0_base;
+	mv_bus0_controller.io_offset	= 0;
+
+	ioport_resource.end		= io_size - 1;
+
+	register_pci_controller(&mv_bus0_controller);
+
+	mv_io_base = io_base;
+	mv_io_size = io_size;
+}
+
+static struct resource mv_pci_io_mem1_resource = {
+	.name	= "MV64340 PCI1 IO MEM",
+	.flags	= IORESOURCE_IO
+};
+
+static struct resource mv_pci_mem1_resource = {
+	.name	= "MV64340 PCI1 MEM",
+	.flags	= IORESOURCE_MEM
+};
+
+extern struct pci_ops mv64340_bus1_pci_ops;
+
+static struct pci_controller mv_bus1_controller = {
+	.pci_ops	= &mv64340_bus1_pci_ops,
+	.mem_resource	= &mv_pci_mem1_resource,
+	.io_resource	= &mv_pci_io_mem1_resource,
+};
+
+static __init void ja_pci1_init(void)
+{
+	uint32_t mem0_base, mem0_size;
+	uint32_t io_base, io_size;
+
+	io_base = MV_READ(MV64340_PCI_1_IO_BASE_ADDR) << 16;
+	io_size = (MV_READ(MV64340_PCI_1_IO_SIZE) + 1) << 16;
+	mem0_base = MV_READ(MV64340_PCI_1_MEMORY0_BASE_ADDR) << 16;
+	mem0_size = (MV_READ(MV64340_PCI_1_MEMORY0_SIZE) + 1) << 16;
+
+	/*
+	 * Here we assume the I/O window of second bus to be contiguous with
+	 * the first.  A gap is no problem but would waste address space for
+	 * remapping the port space.
+	 */
+	mv_pci_io_mem1_resource.start	= mv_io_size;
+	mv_pci_io_mem1_resource.end	= mv_io_size + io_size - 1;
+	mv_pci_mem1_resource.start	= mem0_base;
+	mv_pci_mem1_resource.end	= mem0_base + mem0_size - 1;
+	mv_bus1_controller.mem_offset	= mem0_base;
+	mv_bus1_controller.io_offset	= 0;
+
+	ioport_resource.end		= io_base + io_size -mv_io_base - 1;
+
+	register_pci_controller(&mv_bus1_controller);
+
+	mv_io_size = io_base + io_size - mv_io_base;
+}
+
+static __init int __init ja_pci_init(void)
+{
+	unsigned long io_v_base;
+	uint32_t enable;
+
+	enable = ~MV_READ(MV64340_BASE_ADDR_ENABLE);
+
+	/*
+	 * We require at least one enabled I/O or PCI memory window or we
+	 * will ignore this PCI bus.  We ignore PCI windows 1, 2 and 3.
+	 */
+	if (enable & (0x01 <<  9) || enable & (0x01 << 10))
+		ja_pci0_init();
+
+	if (enable & (0x01 << 14) || enable & (0x01 << 15))
+		ja_pci1_init();
+
+	if (mv_io_size) {
+		io_v_base = (unsigned long) ioremap(mv_io_base, mv_io_size);
+		if (!io_v_base)
+			panic("Could not ioremap I/O port range");
+
+		set_io_port_base(io_v_base);
+	}
+
+	return 0;
+}
+
+arch_initcall(ja_pci_init);
+
+static int  __init momenco_jaguar_atx_setup(void)
 {
 	unsigned int tmpword;
 
@@ -230,10 +361,10 @@ static void __init momenco_jaguar_atx_se
 	 * initrd_below_start_ok = 1;
 	 */
 
-	/* do handoff reconfiguration */
-	PMON_v2_setup();
+	wire_stupidity_into_tlb();
 
-	/* shut down ethernet ports, just to be sure our memory doesn't get
+	/*
+	 * shut down ethernet ports, just to be sure our memory doesn't get
 	 * corrupted by random ethernet traffic.
 	 */
 	MV_WRITE(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(0), 0xff << 8);
@@ -242,21 +373,18 @@ static void __init momenco_jaguar_atx_se
 	MV_WRITE(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(0), 0xff << 8);
 	MV_WRITE(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(1), 0xff << 8);
 	MV_WRITE(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(2), 0xff << 8);
-	do {}
-	  while (MV_READ_DATA(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(0)) & 0xff);
-	do {}
-	  while (MV_READ_DATA(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(1)) & 0xff);
-	do {}
-	  while (MV_READ_DATA(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(2)) & 0xff);
-	do {}
-	  while (MV_READ_DATA(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(0)) & 0xff);
-	do {}
-	  while (MV_READ_DATA(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(1)) & 0xff);
-	do {}
-	  while (MV_READ_DATA(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(2)) & 0xff);
-	MV_WRITE(MV64340_ETH_PORT_SERIAL_CONTROL_REG(0), MV_READ_DATA(MV64340_ETH_PORT_SERIAL_CONTROL_REG(0)) & ~1);
-	MV_WRITE(MV64340_ETH_PORT_SERIAL_CONTROL_REG(1), MV_READ_DATA(MV64340_ETH_PORT_SERIAL_CONTROL_REG(1)) & ~1);
-	MV_WRITE(MV64340_ETH_PORT_SERIAL_CONTROL_REG(2), MV_READ_DATA(MV64340_ETH_PORT_SERIAL_CONTROL_REG(2)) & ~1);
+	while (MV_READ(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(0)) & 0xff);
+	while (MV_READ(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(1)) & 0xff);
+	while (MV_READ(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(2)) & 0xff);
+	while (MV_READ(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(0)) & 0xff);
+	while (MV_READ(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(1)) & 0xff);
+	while (MV_READ(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(2)) & 0xff);
+	MV_WRITE(MV64340_ETH_PORT_SERIAL_CONTROL_REG(0),
+	         MV_READ(MV64340_ETH_PORT_SERIAL_CONTROL_REG(0)) & ~1);
+	MV_WRITE(MV64340_ETH_PORT_SERIAL_CONTROL_REG(1),
+	         MV_READ(MV64340_ETH_PORT_SERIAL_CONTROL_REG(1)) & ~1);
+	MV_WRITE(MV64340_ETH_PORT_SERIAL_CONTROL_REG(2),
+	         MV_READ(MV64340_ETH_PORT_SERIAL_CONTROL_REG(2)) & ~1);
 
 	/* Turn off the Bit-Error LED */
 	JAGUAR_FPGA_WRITE(0x80, CLR);
@@ -274,20 +402,20 @@ static void __init momenco_jaguar_atx_se
 	tmpword = JAGUAR_FPGA_READ(RESET_STATUS);
 	printk("Reset reason: 0x%x\n", tmpword);
 	switch (tmpword) {
-		case 0x1:
-			printk("  - Power-up reset\n");
-			break;
-		case 0x2:
-			printk("  - Push-button reset\n");
-			break;
-		case 0x8:
-			printk("  - Watchdog reset\n");
-			break;
-		case 0x10:
-			printk("  - JTAG reset\n");
-			break;
-		default:
-			printk("  - Unknown reset cause\n");
+	case 0x1:
+		printk("  - Power-up reset\n");
+		break;
+	case 0x2:
+		printk("  - Push-button reset\n");
+		break;
+	case 0x8:
+		printk("  - Watchdog reset\n");
+		break;
+	case 0x10:
+		printk("  - JTAG reset\n");
+		break;
+	default:
+		printk("  - Unknown reset cause\n");
 	}
 	reset_reason = tmpword;
 	JAGUAR_FPGA_WRITE(0xff, RESET_STATUS);
@@ -333,28 +461,8 @@ static void __init momenco_jaguar_atx_se
 
 	}
 #endif
-}
-
-early_initcall(momenco_jaguar_atx_setup);
-
-
-#ifndef CONFIG_MIPS64
-/* This needs to be one of the first initcalls, because no I/O port access
-   can work before this */
-static int io_base_ioremap(void)
-{
-	/* we're mapping PCI accesses from 0xc0000000 to 0xf0000000 */
-	void *io_remap_range = ioremap(0xc0000000, 0x30000000);
-
-	printk("*** io_base_ioremap\n");
-	if (!io_remap_range) {
-		panic("Could not ioremap I/O port range");
-	}
-	printk("io_remap_range set at 0x%08x\n", (uint32_t)io_remap_range);
-	set_io_port_base(io_remap_range - 0xc0000000);
 
 	return 0;
 }
 
-module_init(io_base_ioremap);
-#endif
+early_initcall(momenco_jaguar_atx_setup);
--- diff/arch/mips/momentum/ocelot_c/Makefile	2003-07-08 09:55:17.000000000 +0100
+++ source/arch/mips/momentum/ocelot_c/Makefile	2004-04-21 10:45:33.669584944 +0100
@@ -2,7 +2,7 @@
 # Makefile for Momentum Computer's Ocelot-C and -CS boards.
 #
 
-obj-y	 		+= mv-irq.o cpci-irq.o uart-irq.o int-handler.o irq.o \
-			   pci-irq.o prom.o reset.o setup.o 
+obj-y	 		+= cpci-irq.o uart-irq.o int-handler.o irq.o pci-irq.o \
+			   prom.o reset.o setup.o
 
 obj-$(CONFIG_KGDB)	+= dbg_io.o
--- diff/arch/mips/momentum/ocelot_c/irq.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/momentum/ocelot_c/irq.c	2004-04-21 10:45:33.669584944 +0100
@@ -49,7 +49,6 @@
 #include <asm/system.h>
 
 extern asmlinkage void ocelot_handle_int(void);
-extern void mv64340_irq_init(void);
 extern void uart_irq_init(void);
 extern void cpci_irq_init(void);
 
@@ -79,7 +78,7 @@ void __init init_IRQ(void)
 	setup_irq(5, &cascade_fpga);
 	setup_irq(6, &cascade_mv64340);
 
-	mv64340_irq_init();
+	mv64340_irq_init(16);
 	uart_irq_init();
 	cpci_irq_init();
 
--- diff/arch/mips/momentum/ocelot_c/setup.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/momentum/ocelot_c/setup.c	2004-04-21 10:45:33.670584792 +0100
@@ -81,7 +81,13 @@ void momenco_time_init(void);
 static char reset_reason;
 
 void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1, unsigned long entryhi, unsigned long pagemask);
-#define ENTRYLO(x) ((pte_val(mk_pte_phys((x), PAGE_KERNEL_UNCACHED)) >> 6)|1)
+
+static unsigned long ENTRYLO(unsigned long paddr)
+{
+	return ((paddr & PAGE_MASK) |
+	       (_PAGE_PRESENT | __READABLE | __WRITEABLE | _PAGE_GLOBAL |
+		_CACHE_UNCACHED)) >> 6;
+}
 
 /* setup code for a handoff from a version 2 PMON 2000 PROM */
 void PMON_v2_setup(void)
@@ -243,15 +249,17 @@ static void __init momenco_ocelot_c_setu
 	MV_WRITE(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(0), 0xff << 8);
 	MV_WRITE(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(1), 0xff << 8);
 	do {}
-	  while (MV_READ_DATA(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(0)) & 0xff);
+	  while (MV_READ(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(0)) & 0xff);
 	do {}
-	  while (MV_READ_DATA(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(1)) & 0xff);
+	  while (MV_READ(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(1)) & 0xff);
 	do {}
-	  while (MV_READ_DATA(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(0)) & 0xff);
+	  while (MV_READ(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(0)) & 0xff);
 	do {}
-	  while (MV_READ_DATA(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(1)) & 0xff);
-	MV_WRITE(MV64340_ETH_PORT_SERIAL_CONTROL_REG(0), MV_READ_DATA(MV64340_ETH_PORT_SERIAL_CONTROL_REG(0)) & ~1);
-	MV_WRITE(MV64340_ETH_PORT_SERIAL_CONTROL_REG(1), MV_READ_DATA(MV64340_ETH_PORT_SERIAL_CONTROL_REG(1)) & ~1);
+	  while (MV_READ(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(1)) & 0xff);
+	MV_WRITE(MV64340_ETH_PORT_SERIAL_CONTROL_REG(0),
+	         MV_READ(MV64340_ETH_PORT_SERIAL_CONTROL_REG(0)) & ~1);
+	MV_WRITE(MV64340_ETH_PORT_SERIAL_CONTROL_REG(1),
+	         MV_READ(MV64340_ETH_PORT_SERIAL_CONTROL_REG(1)) & ~1);
 
 	/* Turn off the Bit-Error LED */
 	OCELOT_FPGA_WRITE(0x80, CLR);
--- diff/arch/mips/momentum/ocelot_g/setup.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/momentum/ocelot_g/setup.c	2004-04-21 10:45:33.670584792 +0100
@@ -81,7 +81,12 @@ extern void momenco_ocelot_irq_setup(voi
 
 static char reset_reason;
 
-#define ENTRYLO(x) ((pte_val(pfn_pte((x) >> PAGE_SHIFT, PAGE_KERNEL_UNCACHED)) >> 6)|1)
+static unsigned long ENTRYLO(unsigned long paddr)
+{
+	return ((paddr & PAGE_MASK) |
+	       (_PAGE_PRESENT | __READABLE | __WRITEABLE | _PAGE_GLOBAL |
+		_CACHE_UNCACHED)) >> 6;
+}
 
 static void __init setup_l3cache(unsigned long size);
 
--- diff/arch/mips/pci/Makefile	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/pci/Makefile	2004-04-21 10:45:33.671584640 +0100
@@ -24,6 +24,7 @@ obj-$(CONFIG_DDB5074)		+= fixup-ddb5074.
 obj-$(CONFIG_DDB5476)		+= ops-ddb5476.o pci-ddb5476.o
 obj-$(CONFIG_DDB5477)		+= fixup-ddb5477.o pci-ddb5477.o ops-ddb5477.o
 obj-$(CONFIG_HP_LASERJET)	+= pci-hplj.o
+obj-$(CONFIG_LASAT)		+= pci-lasat.o fixup-lasat.o
 obj-$(CONFIG_MIPS_ATLAS)	+= fixup-atlas.o
 obj-$(CONFIG_MIPS_COBALT)	+= fixup-cobalt.o
 obj-$(CONFIG_MIPS_EV96100)	+= fixup-ev64120.o
@@ -31,7 +32,9 @@ obj-$(CONFIG_MIPS_EV96100)	+= fixup-ev96
 obj-$(CONFIG_MIPS_ITE8172)	+= fixup-ite8172g.o
 obj-$(CONFIG_MIPS_IVR)		+= fixup-ivr.o
 obj-$(CONFIG_SOC_AU1500)	+= fixup-au1000.o ops-au1000.o
+obj-$(CONFIG_SOC_AU1550)	+= fixup-au1000.o ops-au1000.o
 obj-$(CONFIG_MIPS_MALTA)	+= fixup-malta.o
+obj-$(CONFIG_MIPS_MV64340)	+= fixup-mv64340.o
 obj-$(CONFIG_MOMENCO_OCELOT)	+= fixup-ocelot.o pci-ocelot.o
 obj-$(CONFIG_MOMENCO_OCELOT_C)	+= pci-ocelot-c.o
 obj-$(CONFIG_MOMENCO_OCELOT_G)	+= pci-ocelot-g.o
--- diff/arch/mips/pci/fixup-au1000.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/pci/fixup-au1000.c	2004-04-21 10:45:33.671584640 +0100
@@ -33,10 +33,6 @@
 #include <linux/init.h>
 
 #include <asm/mach-au1x00/au1000.h>
-//#include <asm/pb1500.h>
-#ifdef CONFIG_MIPS_PB1000
-#include <asm/mach-pb1x00/pb1000.h>
-#endif
 
 /*
  * Shortcut
@@ -46,7 +42,7 @@
 
 static char irq_tab_alchemy[][5] __initdata = {
  [11] = { -1, INTA, INTA, INTA, INTA },
- [12] = { -1, INTA, INTA, INTA, INTA }
+ [12] = { -1, INTA, INTA, INTA, INTA },
 #if defined( CONFIG_SOC_AU1550 )
  [13] = { -1, INTB, INTB, INTB, INTB }
 #endif
--- diff/arch/mips/pci/ops-au1000.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/pci/ops-au1000.c	2004-04-21 10:45:33.672584488 +0100
@@ -35,55 +35,15 @@
 #include <linux/init.h>
 
 #include <asm/mach-au1x00/au1000.h>
-#ifdef CONFIG_MIPS_PB1000
-#include <asm/mac-pb1x00/pb1000.h>
-#endif
 
 #define PCI_ACCESS_READ  0
 #define PCI_ACCESS_WRITE 1
 
-#ifdef CONFIG_MIPS_PB1000
-/*
- * "Bus 2" is really the first and only external slot on the pb1000.
- * We'll call that bus 0, and limit the accesses to that single
- * external slot only. The SDRAM is already initialized in setup.c.
- */
-static int config_access(unsigned char access_type, struct pci_dev *dev,
-			 unsigned char where, u32 * data)
-{
-	unsigned char bus = dev->bus->number;
-	unsigned char dev_fn = dev->devfn;
-	unsigned long config;
-
-	if (((dev_fn >> 3) != 0) || (bus != 0)) {
-		*data = 0xffffffff;
-		return -1;
-	}
-
-	config = PCI_CONFIG_BASE | (where & ~0x3);
-
-	if (access_type == PCI_ACCESS_WRITE) {
-		au_writel(*data, config);
-	} else {
-		*data = au_readl(config);
-	}
-	au_sync_udelay(1);
-
-	if (au_readl(PCI_BRIDGE_CONFIG) & (1 << 16)) {
-		*data = 0xffffffff;
-		return -1;
-	} else {
-		return PCIBIOS_SUCCESSFUL;
-	}
-}
-
-#else
 
 static int config_access(unsigned char access_type, struct pci_bus *bus,
 			 unsigned int devfn, unsigned char where,
 			 u32 * data)
 {
-#ifdef CONFIG_SOC_AU1500
 	unsigned int device = PCI_SLOT(devfn);
 	unsigned int function = PCI_FUNC(devfn);
 	unsigned long config, status;
@@ -120,7 +80,7 @@ static int config_access(unsigned char a
 	/* setup the lower bits of the 36 bit address */
 	config = cfg_addr | (function << 8) | (where & ~0x3);
 
-#if 0
+#if 1
 	if (access_type == PCI_ACCESS_WRITE) {
 		printk("cfg write:  ");
 	} else {
@@ -145,6 +105,7 @@ static int config_access(unsigned char a
 	/* check master abort */
 	status = au_readl(Au1500_PCI_STATCMD);
 	if (status & (1 << 29)) {
+		printk("master abort\n");
 		*data = 0xffffffff;
 		return -1;
 	} else if ((status >> 28) & 0xf) {
@@ -152,11 +113,10 @@ static int config_access(unsigned char a
 		*data = 0xffffffff;
 		return -1;
 	} else {
+		printk("bios_successful: %x\n", *data);
 		return PCIBIOS_SUCCESSFUL;
 	}
-#endif
 }
-#endif
 
 static int read_config_byte(struct pci_bus *bus, unsigned int devfn,
 			    int where, u8 * val)
--- diff/arch/mips/pci/ops-mv64340.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/pci/ops-mv64340.c	2004-04-21 10:45:33.673584336 +0100
@@ -2,7 +2,7 @@
  * Copyright 2002 Momentum Computer
  * Author: Matthew Dharm <mdharm@momenco.com>
  *
- * Copyright (C) 2003 Ralf Baechle (ralf@linux-mips.org)
+ * Copyright (C) 2003, 2004 Ralf Baechle (ralf@linux-mips.org)
  *
  *  This program is free software; you can redistribute  it and/or modify it
  *  under  the terms of  the GNU General  Public License as published by the
@@ -60,23 +60,23 @@ static int mv64340_read_config(struct pc
 	if (PCI_SLOT(devfn) > 5)
 		return PCIBIOS_DEVICE_NOT_FOUND;
 
-	address = (bus->number << 16) | (dev << 11) | (func << 8) |
-		  (offset & 0xfc) | 0x80000000;
+	address = (bus->number << 16) | (devfn << 8) |
+		  (reg & 0xfc) | 0x80000000;
 
 	/* start the configuration cycle */
 	MV_WRITE(address_reg, address);
 
 	switch (size) {
 	case 1:
-		MV_READ_8(data_reg + (offset & 0x3), val);
+		*val = MV_READ_8(data_reg + (reg & 0x3));
 		break;
 
 	case 2:
-		MV_READ_16(data_reg + (offset & 0x3), val);
+		*val = MV_READ_16(data_reg + (reg & 0x3));
 		break;
 
 	case 4:
-		MV_READ(data_reg, val);
+		*val = MV_READ(data_reg);
 		break;
 	}
 
@@ -93,7 +93,7 @@ static int mv64340_write_config(struct p
 		return PCIBIOS_DEVICE_NOT_FOUND;
 
 	address = (bus->number << 16) | (devfn << 8) |
-		  (offset & 0xfc) | 0x80000000;
+		  (reg & 0xfc) | 0x80000000;
 
 	/* start the configuration cycle */
 	MV_WRITE(address_reg, address);
@@ -101,12 +101,12 @@ static int mv64340_write_config(struct p
 	switch (size) {
 	case 1:
 		/* write the data */
-		MV_WRITE_8(data_reg + (offset & 0x3), val);
+		MV_WRITE_8(data_reg + (reg & 0x3), val);
 		break;
 
 	case 2:
 		/* write the data */
-		MV_WRITE_16(data_reg + (offset & 0x3), val);
+		MV_WRITE_16(data_reg + (reg & 0x3), val);
 		break;
 
 	case 4:
@@ -124,7 +124,7 @@ static int mv64340_bus ## host ## _read_
 	unsigned int devfn, int reg, int size, u32 * val)		\
 {									\
 	return mv64340_read_config(bus, devfn, reg, size, val,		\
-	           MV64340_PCI_ ## host ## _CONFIG_ADDR;		\
+	           MV64340_PCI_ ## host ## _CONFIG_ADDR,		\
 	           MV64340_PCI_ ## host ## _CONFIG_DATA_VIRTUAL_REG);	\
 }									\
 									\
@@ -132,7 +132,7 @@ static int mv64340_bus ## host ## _write
 	unsigned int devfn, int reg, int size, u32 val)			\
 {									\
 	return mv64340_write_config(bus, devfn, reg, size, val,		\
-	           MV64340_PCI_ ## host ## _CONFIG_ADDR;		\
+	           MV64340_PCI_ ## host ## _CONFIG_ADDR,		\
 	           MV64340_PCI_ ## host ## _CONFIG_DATA_VIRTUAL_REG);	\
 }									\
 									\
--- diff/arch/mips/pci/pci-ip27.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/pci/pci-ip27.c	2004-04-21 10:45:33.673584336 +0100
@@ -34,12 +34,6 @@
 static struct bridge_controller bridges[MAX_PCI_BUSSES];
 
 /*
- * No locking needed until PCI initialization is done parallely.
- */
-int irqstore[MAX_PCI_BUSSES][MAX_DEVICES_PER_PCIBUS];
-int lastirq = BASE_PCI_IRQ;
-
-/*
  * Translate from irq to software PCI bus number and PCI slot.
  */
 struct bridge_controller *irq_to_bridge[MAX_PCI_BUSSES * MAX_DEVICES_PER_PCIBUS];
@@ -274,25 +268,23 @@ int __init bridge_probe(nasid_t nasid, i
 int __devinit pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
 {
 	struct bridge_controller *bc = BRIDGE_CONTROLLER(dev->bus);
-	int busno = dev->bus->number;
+	int irq;
 
-	if ((busno >= MAX_PCI_BUSSES)
-	    || (pin != 1)
-	    || (slot >= MAX_DEVICES_PER_PCIBUS))
-		panic("Increase supported PCI busses %d,%d,%d",
-		      dev->bus->number, slot, pin);
+	irq = allocate_irqno();
 
 	/*
-	 * Already assigned? Then return previously assigned value ...
+	 * Argh...  This API doesn't handle with errors at all ...
 	 */
-	if (irqstore[busno][slot])
-		return irqstore[busno][slot];
+	if (irq == -1) {
+		printk(KERN_ERR "Can't allocate interrupt for PCI device %s\n",
+		       pci_name(dev));
+		return -1;
+	}
 
-	irq_to_bridge[lastirq] = bc;
-	irq_to_slot[lastirq] = slot;
-	irqstore[busno][slot] = lastirq;
+	irq_to_bridge[irq] = bc;
+	irq_to_slot[irq] = slot;
 
-	return lastirq++;
+	return irq;
 }
 
 /*
--- diff/arch/mips/pci/pci-sb1250.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/pci/pci-sb1250.c	2004-04-21 10:45:33.674584184 +0100
@@ -84,6 +84,11 @@ static inline void WRITECFG32(u32 addr, 
 	*(u32 *) (cfg_space + (addr & ~3)) = data;
 }
 
+int pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
+{
+	return dev->irq;
+}
+
 /*
  * Some checks before doing config cycles:
  * In PCI Device Mode, hide everything on bus 0 except the LDT host
@@ -194,10 +199,18 @@ struct pci_controller sb1250_controller 
 	.io_resource	= &sb1250_io_resource
 };
 
-int __init pcibios_init(void)	xxx This needs to be called somehow ...
+static int __init sb1250_pcibios_init(void)
 {
 	uint32_t cmdreg;
 	uint64_t reg;
+	extern int pci_probe_only;
+
+	/* CFE will assign PCI resources */
+	pci_probe_only = 1;
+
+	/* set resource limit to avoid errors */
+	ioport_resource.end = 0x0000ffff;	/* 32MB reserved by sb1250 */
+	iomem_resource.end = 0xffffffff;	/* no HT support yet */
 
 	cfg_space =
 	    ioremap(A_PHYS_LDTPCI_CFG_MATCH_BITS, 16 * 1024 * 1024);
@@ -265,6 +278,7 @@ int __init pcibios_init(void)	xxx This n
 #endif
 	return 0;
 }
+arch_initcall(sb1250_pcibios_init);
 
 struct pci_fixup pcibios_fixups[] = {
 	{0}
--- diff/arch/mips/pci/pci-vr41xx.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/pci/pci-vr41xx.c	2004-04-21 10:45:33.674584184 +0100
@@ -159,7 +159,7 @@ void __init vr41xx_pciu_init(struct vr41
 	writew(0, MPCIINTREG);
 
 	/* Supply VTClock to PCIU */
-	vr41xx_clock_supply(PCIU_CLOCK);
+	vr41xx_supply_clock(PCIU_CLOCK);
 
 	/*
 	 * Sleep for 1us after setting MSKPPCIU bit in CMUCLKMSK
@@ -179,7 +179,7 @@ void __init vr41xx_pciu_init(struct vr41
 		printk(KERN_INFO "Warning: PCI Clock is over 33MHz.\n");
 
 	/* Supply PCI clock by PCI bus */
-	vr41xx_clock_supply(PCI_CLOCK);
+	vr41xx_supply_clock(PCI_CLOCK);
 
 	/*
 	 * Set PCI memory & I/O space address conversion registers
--- diff/arch/mips/pmc-sierra/yosemite/Makefile	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/pmc-sierra/yosemite/Makefile	2004-04-21 10:45:33.675584032 +0100
@@ -2,7 +2,7 @@
 # Makefile for the PMC-Sierra Titan 
 #
 
-obj-y    += irq-handler.o irq.o i2c-yosemite.o prom.o setup.o
+obj-y    += irq-handler.o irq.o prom.o setup.o
 
 obj-$(CONFIG_SMP)          	+= smp.o
 obj-$(CONFIG_HYPERTRANSPORT)	+= ht-irq.o ht.o
--- diff/arch/mips/pmc-sierra/yosemite/ht.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/pmc-sierra/yosemite/ht.c	2004-04-21 10:45:33.675584032 +0100
@@ -46,7 +46,7 @@ static __inline__ int check_titan_htlink
 {
         u32 val;
 
-        val = *(volatile u_int32_t *)(RM9000x2_HTLINK_REG);
+        val = *(volatile uint32_t *)(RM9000x2_HTLINK_REG);
         if (val & 0x00000020)
                 /* HT Link Initialization completed */
                 return 1;
--- diff/arch/mips/pmc-sierra/yosemite/irq.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/pmc-sierra/yosemite/irq.c	2004-04-21 10:45:33.676583880 +0100
@@ -169,15 +169,15 @@ extern void jaguar_mailbox_irq(struct pt
 asmlinkage void ll_ht_smp_irq_handler(int irq, struct pt_regs *regs)
 {
         u32 status;
-        status = *(volatile u_int32_t *)(IRQ_STATUS_REG_CPU0);
+        status = *(volatile uint32_t *)(IRQ_STATUS_REG_CPU0);
 
 	/* Ack all the bits that correspond to the interrupt sources */
 	if (status != 0)
-	        *(volatile u_int32_t *)(IRQ_STATUS_REG_CPU0) = IRQ_ACK_BITS;
+	        *(volatile uint32_t *)(IRQ_STATUS_REG_CPU0) = IRQ_ACK_BITS;
 
-	status = *(volatile u_int32_t *)(IRQ_STATUS_REG_CPU1);
+	status = *(volatile uint32_t *)(IRQ_STATUS_REG_CPU1);
 	if (status != 0)
-                *(volatile u_int32_t *)(IRQ_STATUS_REG_CPU1) = IRQ_ACK_BITS;
+                *(volatile uint32_t *)(IRQ_STATUS_REG_CPU1) = IRQ_ACK_BITS;
 
 #ifdef CONFIG_SMP
 	if (status == 0x2) {
@@ -193,27 +193,27 @@ asmlinkage void ll_ht_smp_irq_handler(in
          */
         switch (status) {
                 case 0x1000000:
-                        *(volatile u_int32_t *)(HYPERTRANSPORT_EOI) = HYPERTRANSPORT_INTA;
+                        *(volatile uint32_t *)(HYPERTRANSPORT_EOI) = HYPERTRANSPORT_INTA;
                         break;
                 case 0x2000000:
-                        *(volatile u_int32_t *)(HYPERTRANSPORT_EOI) = HYPERTRANSPORT_INTB;
+                        *(volatile uint32_t *)(HYPERTRANSPORT_EOI) = HYPERTRANSPORT_INTB;
                         break;
                 case 0x4000000:
-                        *(volatile u_int32_t *)(HYPERTRANSPORT_EOI) = HYPERTRANSPORT_INTC;
+                        *(volatile uint32_t *)(HYPERTRANSPORT_EOI) = HYPERTRANSPORT_INTC;
                         break;
                 case 0x8000000:
-                        *(volatile u_int32_t *)(HYPERTRANSPORT_EOI) = HYPERTRANSPORT_INTD;
+                        *(volatile uint32_t *)(HYPERTRANSPORT_EOI) = HYPERTRANSPORT_INTD;
                         break;
                 case 0x0000001:
                         /* PLX */
-                        *(volatile u_int32_t *)(HYPERTRANSPORT_EOI) = 0x20;
-                        *(volatile u_int32_t *)(IRQ_CLEAR_REG) = IRQ_ACK_BITS;
+                        *(volatile uint32_t *)(HYPERTRANSPORT_EOI) = 0x20;
+                        *(volatile uint32_t *)(IRQ_CLEAR_REG) = IRQ_ACK_BITS;
                         break;
                 case 0xf000000:
-                        *(volatile u_int32_t *)(HYPERTRANSPORT_EOI) = HYPERTRANSPORT_INTA;
-                        *(volatile u_int32_t *)(HYPERTRANSPORT_EOI) = HYPERTRANSPORT_INTB;
-                        *(volatile u_int32_t *)(HYPERTRANSPORT_EOI) = HYPERTRANSPORT_INTC;
-                        *(volatile u_int32_t *)(HYPERTRANSPORT_EOI) = HYPERTRANSPORT_INTD;
+                        *(volatile uint32_t *)(HYPERTRANSPORT_EOI) = HYPERTRANSPORT_INTA;
+                        *(volatile uint32_t *)(HYPERTRANSPORT_EOI) = HYPERTRANSPORT_INTB;
+                        *(volatile uint32_t *)(HYPERTRANSPORT_EOI) = HYPERTRANSPORT_INTC;
+                        *(volatile uint32_t *)(HYPERTRANSPORT_EOI) = HYPERTRANSPORT_INTD;
                         break;
         }
 #endif /* CONFIG_HT_LEVEL_TRIGGER */
--- diff/arch/mips/pmc-sierra/yosemite/prom.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/pmc-sierra/yosemite/prom.c	2004-04-21 10:45:33.676583880 +0100
@@ -169,7 +169,7 @@ int prom_setup_smp(void)
 int prom_boot_secondary(int cpu, unsigned long sp, unsigned long gp)
 {
         /* Clear the semaphore */
-        *(volatile u_int32_t *)(0xbb000a68) = 0x80000000;
+        *(volatile uint32_t *)(0xbb000a68) = 0x80000000;
 
         return 1;
 }
--- diff/arch/mips/pmc-sierra/yosemite/setup.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/pmc-sierra/yosemite/setup.c	2004-04-21 10:45:33.677583728 +0100
@@ -147,13 +147,13 @@ static int __init pmc_yosemite_setup(voi
 	add_memory_region(0x10000000, 0x10000000, BOOT_MEM_RAM);
 
 	/* Setup the HT controller */
-	val = *(volatile u_int32_t *)(HYPERTRANSPORT_CONFIG_REG);
+	val = *(volatile uint32_t *)(HYPERTRANSPORT_CONFIG_REG);
 	val |= HYPERTRANSPORT_ENABLE;
-        *(volatile u_int32_t *)(HYPERTRANSPORT_CONFIG_REG) = val;
+        *(volatile uint32_t *)(HYPERTRANSPORT_CONFIG_REG) = val;
 
         /* Set the BAR. Shifted mode */
-        *(volatile u_int32_t *)(HYPERTRANSPORT_BAR0_REG) = HYPERTRANSPORT_BAR0_ADDR;
-        *(volatile u_int32_t *)(HYPERTRANSPORT_SIZE0_REG) = HYPERTRANSPORT_SIZE0;
+        *(volatile uint32_t *)(HYPERTRANSPORT_BAR0_REG) = HYPERTRANSPORT_BAR0_ADDR;
+        *(volatile uint32_t *)(HYPERTRANSPORT_SIZE0_REG) = HYPERTRANSPORT_SIZE0;
 
 #ifdef CONFIG_PCI
 	ioport_resource.start = 0xe0000000;
--- diff/arch/mips/pmc-sierra/yosemite/smp.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/pmc-sierra/yosemite/smp.c	2004-04-21 10:45:33.677583728 +0100
@@ -25,7 +25,6 @@
 #include <asm/mmu_context.h>
 #include <asm/trace.h>
 
-extern void smp_call_function_interrupt(void);
 extern void asmlinkage smp_bootstrap(void);
 
 /*
@@ -43,9 +42,9 @@ void core_send_ipi(int cpu, unsigned int
                         break;
                 case SMP_CALL_FUNCTION:
                         if (cpu == 1)
-                                *(volatile u_int32_t *)(0xbb000a00) = 0x00610002;
+                                *(volatile uint32_t *)(0xbb000a00) = 0x00610002;
                         else
-                                *(volatile u_int32_t *)(0xbb000a00) = 0x00610001;
+                                *(volatile uint32_t *)(0xbb000a00) = 0x00610001;
                         break;
 
                 default:
@@ -96,10 +95,10 @@ void __init start_secondary(void)
         __flush_cache_all();
 
         printk("Slave cpu booted successfully  \n");
-        *(volatile u_int32_t *)(0xbb000a68) = 0x00000000;
-        *(volatile u_int32_t *)(0xbb000a68) = 0x80000000;
+        *(volatile uint32_t *)(0xbb000a68) = 0x00000000;
+        *(volatile uint32_t *)(0xbb000a68) = 0x80000000;
 
-        while (*(volatile u_int32_t *)(0xbb000a68) != 0x00000000);
+        while (*(volatile uint32_t *)(0xbb000a68) != 0x00000000);
 
         return cpu_idle();
 }
@@ -172,8 +171,8 @@ void __init smp_boot_cpus(void)
 
         /* Local semaphore to both the CPUs */
 
-        *(volatile u_int32_t *)(0xbb000a68) = 0x80000000;
-        while (*(volatile u_int32_t *)(0xbb000a68) != 0x00000000);
+        *(volatile uint32_t *)(0xbb000a68) = 0x80000000;
+        while (*(volatile uint32_t *)(0xbb000a68) != 0x00000000);
 
         smp_threads_ready = 1;
 }
--- diff/arch/mips/sgi-ip27/Makefile	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/sgi-ip27/Makefile	2004-04-21 10:45:33.677583728 +0100
@@ -4,7 +4,7 @@
 
 obj-y	:= ip27-berr.o ip27-console.o ip27-irq.o ip27-init.o ip27-irq-glue.o \
 	   ip27-klconfig.o ip27-klnuma.o ip27-memory.o ip27-nmi.o ip27-reset.o \
-	   ip27-setup.o ip27-timer.o
+	   ip27-timer.o ip27-hubio.o ip27-xtalk.o
 
 obj-$(CONFIG_SMP)	+= ip27-smp.o
 
--- diff/arch/mips/sgi-ip27/ip27-init.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/sgi-ip27/ip27-init.c	2004-04-21 10:45:33.678583576 +0100
@@ -14,8 +14,9 @@
 #include <linux/mm.h>
 #include <linux/cpumask.h>
 #include <asm/cpu.h>
-#include <asm/pgalloc.h>
+#include <asm/io.h>
 #include <asm/pgtable.h>
+#include <asm/time.h>
 #include <asm/sn/types.h>
 #include <asm/sn/sn0/addrs.h>
 #include <asm/sn/sn0/hubni.h>
@@ -24,6 +25,7 @@
 #include <asm/sn/ioc3.h>
 #include <asm/mipsregs.h>
 #include <asm/sn/gda.h>
+#include <asm/sn/hub.h>
 #include <asm/sn/intr.h>
 #include <asm/current.h>
 #include <asm/smp.h>
@@ -73,9 +75,54 @@ static int is_fine_dirmode(void)
 }
 
 extern void pcibr_setup(cnodeid_t);
-void per_hub_init(cnodeid_t cnode)
+
+static __init void per_slice_init(cnodeid_t cnode, int slice)
 {
-	nasid_t		nasid = COMPACT_TO_NASID_NODEID(cnode);
+	struct slice_data *si = hub_data[cnode]->slice + slice;
+	int cpu = smp_processor_id();
+	int i;
+
+	for (i = 0; i < LEVELS_PER_SLICE; i++)
+		si->level_to_irq[i] = -1;
+	/*
+	 * Some interrupts are reserved by hardware or by software convention.
+	 * Mark these as reserved right away so they won't be used accidently
+	 * later.
+	 */
+	for (i = 0; i <= BASE_PCI_IRQ; i++) {
+		__set_bit(i, si->irq_alloc_mask);
+		LOCAL_HUB_S(PI_INT_PEND_MOD, i);
+	}
+
+	__set_bit(IP_PEND0_6_63, si->irq_alloc_mask);
+	LOCAL_HUB_S(PI_INT_PEND_MOD, IP_PEND0_6_63);
+
+	for (i = NI_BRDCAST_ERR_A; i <= MSC_PANIC_INTR; i++) {
+		__set_bit(i, si->irq_alloc_mask + 1);
+		LOCAL_HUB_S(PI_INT_PEND_MOD, i);
+	}
+
+	LOCAL_HUB_L(PI_INT_PEND0);
+
+	/*
+	 * We use this so we can find the local hub's data as fast as only
+	 * possible.
+	 */
+	cpu_data[cpu].data = si;
+}
+
+extern void xtalk_probe_node(cnodeid_t nid);
+
+void __init per_hub_init(cnodeid_t cnode)
+{
+	struct hub_data *hub = HUB_DATA(cnode);
+	nasid_t nasid = COMPACT_TO_NASID_NODEID(cnode);
+	int slice = LOCAL_HUB_L(PI_CPU_NUM);
+
+	cpu_set(smp_processor_id(), hub->h_cpus);
+
+	if (!test_and_set_bit(slice, &hub->slice_map))
+		per_slice_init(cnode, slice);
 
 	if (test_and_set_bit(cnode, hub_init_mask))
 		return;
@@ -87,7 +134,7 @@ void per_hub_init(cnodeid_t cnode)
 	REMOTE_HUB_S(nasid, IIO_ICTO, 0xff);
 
 	hub_rtc_init(cnode);
-	pcibr_setup(cnode);
+	xtalk_probe_node(cnode);
 
 #ifdef CONFIG_REPLICATE_EXHANDLERS
 	/*
@@ -109,16 +156,22 @@ void per_hub_init(cnodeid_t cnode)
 #endif
 }
 
-cnodeid_t get_compact_nodeid(void)
+/*
+ * get_nasid() returns the physical node id number of the caller.
+ */
+nasid_t
+get_nasid(void)
 {
-	nasid_t nasid;
+	return (nasid_t)((LOCAL_HUB_L(NI_STATUS_REV_ID) & NSRI_NODEID_MASK)
+	                 >> NSRI_NODEID_SHFT);
+}
 
-	nasid = get_nasid();
-	/*
-	 * Map the physical node id to a virtual node id (virtual node ids
-	 * are contiguous).
-	 */
-	return NASID_TO_COMPACT_NODEID(nasid);
+/*
+ * Map the physical node id to a virtual node id (virtual node ids are contiguous).
+ */
+cnodeid_t get_compact_nodeid(void)
+{
+	return NASID_TO_COMPACT_NODEID(get_nasid());
 }
 
 #define	rou_rflag	rou_flags
@@ -159,7 +212,7 @@ static void router_recurse(klrou_t *rout
 	router_a->rou_rflag = 0;
 }
 
-static int node_distance(nasid_t nasid_a, nasid_t nasid_b)
+int node_distance(nasid_t nasid_a, nasid_t nasid_b)
 {
 	klrou_t *router, *router_a = NULL, *router_b = NULL;
 	lboard_t *brd, *dest_brd;
@@ -358,3 +411,106 @@ void mlreset(void)
 #endif
 	}
 }
+
+/* Extracted from the IOC3 meta driver.  FIXME.  */
+static inline void ioc3_sio_init(void)
+{
+	struct ioc3 *ioc3;
+	nasid_t nid;
+	long loops;
+
+	nid = get_nasid();
+	ioc3 = (struct ioc3 *) KL_CONFIG_CH_CONS_INFO(nid)->memory_base;
+
+	ioc3->sscr_a = 0;			/* PIO mode for uarta.  */
+	ioc3->sscr_b = 0;			/* PIO mode for uartb.  */
+	ioc3->sio_iec = ~0;
+	ioc3->sio_ies = (SIO_IR_SA_INT | SIO_IR_SB_INT);
+
+	loops=1000000; while(loops--);
+	ioc3->sregs.uarta.iu_fcr = 0;
+	ioc3->sregs.uartb.iu_fcr = 0;
+	loops=1000000; while(loops--);
+}
+
+static inline void ioc3_eth_init(void)
+{
+	struct ioc3 *ioc3;
+	nasid_t nid;
+
+	nid = get_nasid();
+	ioc3 = (struct ioc3 *) KL_CONFIG_CH_CONS_INFO(nid)->memory_base;
+
+	ioc3->eier = 0;
+}
+
+void __init per_cpu_init(void)
+{
+	cnodeid_t cnode = get_compact_nodeid();
+	int cpu = smp_processor_id();
+
+	clear_c0_status(ST0_IM);
+	per_hub_init(cnode);
+	cpu_time_init();
+	install_ipi();
+	/* Install our NMI handler if symmon hasn't installed one. */
+	install_cpu_nmi_handler(cputoslice(cpu));
+	set_c0_status(SRB_DEV0 | SRB_DEV1);
+}
+
+extern void ip27_setup_console(void);
+extern void ip27_time_init(void);
+extern void ip27_reboot_setup(void);
+
+static int __init ip27_setup(void)
+{
+	hubreg_t p, e, n_mode;
+	nasid_t nid;
+
+	ip27_setup_console();
+	ip27_reboot_setup();
+
+	/*
+	 * hub_rtc init and cpu clock intr enabled for later calibrate_delay.
+	 */
+	nid = get_nasid();
+	printk("IP27: Running on node %d.\n", nid);
+
+	p = LOCAL_HUB_L(PI_CPU_PRESENT_A) & 1;
+	e = LOCAL_HUB_L(PI_CPU_ENABLE_A) & 1;
+	printk("Node %d has %s primary CPU%s.\n", nid,
+	       p ? "a" : "no",
+	       e ? ", CPU is running" : "");
+
+	p = LOCAL_HUB_L(PI_CPU_PRESENT_B) & 1;
+	e = LOCAL_HUB_L(PI_CPU_ENABLE_B) & 1;
+	printk("Node %d has %s secondary CPU%s.\n", nid,
+	       p ? "a" : "no",
+	       e ? ", CPU is running" : "");
+
+	/*
+	 * Try to catch kernel missconfigurations and give user an
+	 * indication what option to select.
+	 */
+	n_mode = LOCAL_HUB_L(NI_STATUS_REV_ID) & NSRI_MORENODES_MASK;
+	printk("Machine is in %c mode.\n", n_mode ? 'N' : 'M');
+#ifdef CONFIG_SGI_SN0_N_MODE
+	if (!n_mode)
+		panic("Kernel compiled for M mode.");
+#else
+	if (n_mode)
+		panic("Kernel compiled for N mode.");
+#endif
+
+	ioc3_sio_init();
+	ioc3_eth_init();
+	per_cpu_init();
+
+	set_io_port_base(IO_BASE);
+
+	board_time_init = ip27_time_init;
+
+	return 0;
+}
+
+early_initcall(ip27_setup);
--- diff/arch/mips/sgi-ip27/ip27-irq.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/sgi-ip27/ip27-irq.c	2004-04-21 10:45:33.679583424 +0100
@@ -30,13 +30,11 @@
 #include <asm/ptrace.h>
 #include <asm/processor.h>
 #include <asm/pci/bridge.h>
-#include <asm/sn/sn0/hub.h>
-#include <asm/sn/sn0/ip27.h>
 #include <asm/sn/addrs.h>
 #include <asm/sn/agent.h>
 #include <asm/sn/arch.h>
+#include <asm/sn/hub.h>
 #include <asm/sn/intr.h>
-#include <asm/sn/intr_public.h>
 
 #undef DEBUG_IRQ
 #ifdef DEBUG_IRQ
@@ -46,19 +44,6 @@
 #endif
 
 /*
- * Number of levels in INT_PEND0. Can be set to 128 if we also
- * consider INT_PEND1.
- */
-#define PERNODE_LEVELS	64
-
-/*
- * we need to map irq's up to at least bit 7 of the INT_MASK0_A register
- * since bits 0-6 are pre-allocated for other purposes.
- */
-#define FAST_IRQ_TO_LEVEL(i)	(i)
-#define LEVEL_TO_IRQ(c, l) (node_level_to_irq[CPUID_TO_COMPACT_NODEID(c)][(l)])
-
-/*
  * Linux has a controller-independent x86 interrupt architecture.
  * every controller has a 'controller-template', that is used
  * by the main code to do the right thing. Each driver-visible
@@ -80,44 +65,42 @@ extern struct bridge_controller *irq_to_
 extern int irq_to_slot[];
 
 /*
- * There is a single intpend register per node, and we want to have
- * distinct levels for intercpu intrs for both cpus A and B on a node.
- */
-static int node_level_to_irq[MAX_COMPACT_NODES][PERNODE_LEVELS];
-
-/*
  * use these macros to get the encoded nasid and widget id
  * from the irq value
  */
 #define IRQ_TO_BRIDGE(i)		irq_to_bridge[(i)]
 #define	SLOT_FROM_PCI_IRQ(i)		irq_to_slot[i]
 
-static inline int alloc_level(cpuid_t cpunum, int irq)
+static inline int alloc_level(int cpu, int irq)
 {
-	cnodeid_t nodenum = CPUID_TO_COMPACT_NODEID(cpunum);
-	int j = BASE_PCI_IRQ;			/* pre-allocated entries */
+	struct slice_data *si = cpu_data[cpu].data;
+	int level;				/* pre-allocated entries */
 
-	while (++j < PERNODE_LEVELS) {
-		if (node_level_to_irq[nodenum][j] == -1) {
-			node_level_to_irq[nodenum][j] = irq;
-			return j;
-		}
-	}
+	level = find_first_zero_bit(si->irq_alloc_mask, LEVELS_PER_SLICE);
+	if (level >= LEVELS_PER_SLICE)
+		panic("Cpu %d flooded with devices\n", cpu);
 
-	panic("Cpu %ld flooded with devices\n", cpunum);
+	__set_bit(level, si->irq_alloc_mask);
+	si->level_to_irq[level] = irq;
+
+	return level;
 }
 
 static inline int find_level(cpuid_t *cpunum, int irq)
 {
-	int j;
-	cnodeid_t nodenum = INVALID_CNODEID;
+	int cpu, i;
+
+	for (cpu = 0; cpu <= NR_CPUS; cpu++) {
+		struct slice_data *si = cpu_data[cpu].data;
+
+		if (!cpu_online(cpu))
+			continue;
 
-	while (++nodenum < MAX_COMPACT_NODES) {
-		j = BASE_PCI_IRQ;		/* Pre-allocated entries */
-		while (++j < PERNODE_LEVELS)
-			if (node_level_to_irq[nodenum][j] == irq) {
-				*cpunum = 0;	/* XXX Fixme */
-				return(j);
+		for (i = BASE_PCI_IRQ; i < LEVELS_PER_SLICE; i++)
+			if (si->level_to_irq[i] == irq) {
+				*cpunum = cpu;
+
+				return i;
 			}
 	}
 
@@ -187,7 +170,9 @@ void ip27_do_irq_mask0(struct pt_regs *r
 #endif
 	{
 		/* "map" swlevel to irq */
-		irq = LEVEL_TO_IRQ(cpu, swlevel);
+		struct slice_data *si = cpu_data[cpu].data;
+
+		irq = si->level_to_irq[swlevel];
 		do_IRQ(irq, regs);
 	}
 
@@ -205,6 +190,7 @@ void ip27_do_irq_mask1(struct pt_regs *r
 	hubreg_t pend1, mask1;
 	cpuid_t cpu = smp_processor_id();
 	int pi_int_mask1 = (cputoslice(cpu) == 0) ?  PI_INT_MASK1_A : PI_INT_MASK1_B;
+	struct slice_data *si = cpu_data[cpu].data;
 
 	/* copied from Irix intpend0() */
 	pend1 = LOCAL_HUB_L(PI_INT_PEND1);
@@ -219,7 +205,7 @@ void ip27_do_irq_mask1(struct pt_regs *r
 
 	swlevel = ms1bit(pend1);
 	/* "map" swlevel to irq */
-	irq = LEVEL_TO_IRQ(cpu, swlevel);
+	irq = si->level_to_irq[swlevel];
 	LOCAL_HUB_CLR_INTR(swlevel);
 	do_IRQ(irq, regs);
 	/* clear bit in pend1 */
@@ -240,70 +226,41 @@ void ip27_hub_error(struct pt_regs *regs
 	panic("CPU %d got a hub error interrupt", smp_processor_id());
 }
 
-/*
- * Get values that vary depending on which CPU and bit we're operating on.
- */
-static void intr_get_ptrs(cpuid_t cpu, int bit, int *new_bit,
-                          hubreg_t **intpend_masks, int *ip)
-{
-	struct hub_intmasks_s *hub_intmasks = &cpu_data[cpu].p_intmasks;
-
-	if (bit < N_INTPEND_BITS) {
-		*intpend_masks = &hub_intmasks->intpend0_masks;
-		*ip = 0;
-		*new_bit = bit;
-	} else {
-		*intpend_masks = &hub_intmasks->intpend1_masks;
-		*ip = 1;
-		*new_bit = bit - N_INTPEND_BITS;
-	}
-}
-
 static int intr_connect_level(int cpu, int bit)
 {
-	int ip;
-	int slice = cputoslice(cpu);
-	volatile hubreg_t *mask_reg;
-	hubreg_t *intpend_masks;
-	nasid_t nasid = COMPACT_TO_NASID_NODEID(cputocnode(cpu));
+	nasid_t nasid = COMPACT_TO_NASID_NODEID(cpu_to_node(cpu));
+	struct slice_data *si = cpu_data[cpu].data;
 
-	intr_get_ptrs(cpu, bit, &bit, &intpend_masks, &ip);
+	__set_bit(bit, si->irq_enable_mask);
 
 	/* Make sure it's not already pending when we connect it. */
-	REMOTE_HUB_CLR_INTR(nasid, bit + ip * N_INTPEND_BITS);
-
-	*intpend_masks |= (1UL << bit);
+	REMOTE_HUB_CLR_INTR(nasid, bit);
 
-	if (ip == 0) {
-		mask_reg = REMOTE_HUB_ADDR(nasid, PI_INT_MASK0_A +
-		                PI_INT_MASK_OFFSET * slice);
+	if (!cputoslice(cpu)) {
+		REMOTE_HUB_S(nasid, PI_INT_MASK0_A, si->irq_enable_mask[0]);
+		REMOTE_HUB_S(nasid, PI_INT_MASK1_A, si->irq_enable_mask[1]);
 	} else {
-		mask_reg = REMOTE_HUB_ADDR(nasid, PI_INT_MASK1_A +
-				PI_INT_MASK_OFFSET * slice);
+		REMOTE_HUB_S(nasid, PI_INT_MASK0_B, si->irq_enable_mask[0]);
+		REMOTE_HUB_S(nasid, PI_INT_MASK1_B, si->irq_enable_mask[1]);
 	}
-	HUB_S(mask_reg, intpend_masks[0]);
 
 	return 0;
 }
 
 static int intr_disconnect_level(int cpu, int bit)
 {
-	int ip;
-	int slice = cputoslice(cpu);
-	volatile hubreg_t *mask_reg;
-	hubreg_t *intpend_masks;
-	nasid_t nasid = COMPACT_TO_NASID_NODEID(cputocnode(cpu));
-
-	intr_get_ptrs(cpu, bit, &bit, &intpend_masks, &ip);
-	intpend_masks[0] &= ~(1ULL << (u64)bit);
-	if (ip == 0) {
-		mask_reg = REMOTE_HUB_ADDR(nasid, PI_INT_MASK0_A +
-				PI_INT_MASK_OFFSET * slice);
+	nasid_t nasid = COMPACT_TO_NASID_NODEID(cpu_to_node(cpu));
+	struct slice_data *si = cpu_data[cpu].data;
+
+	__clear_bit(bit, si->irq_enable_mask);
+
+	if (!cputoslice(cpu)) {
+		REMOTE_HUB_S(nasid, PI_INT_MASK0_A, si->irq_enable_mask[0]);
+		REMOTE_HUB_S(nasid, PI_INT_MASK1_A, si->irq_enable_mask[1]);
 	} else {
-		mask_reg = REMOTE_HUB_ADDR(nasid, PI_INT_MASK1_A +
-				PI_INT_MASK_OFFSET * slice);
+		REMOTE_HUB_S(nasid, PI_INT_MASK0_B, si->irq_enable_mask[0]);
+		REMOTE_HUB_S(nasid, PI_INT_MASK1_B, si->irq_enable_mask[1]);
 	}
-	HUB_S(mask_reg, intpend_masks[0]);
 
 	return 0;
 }
@@ -316,9 +273,6 @@ static unsigned int startup_bridge_irq(u
 	bridge_t *bridge;
 	int pin, swlevel;
 
-	if (irq < BASE_PCI_IRQ)
-		return 0;
-
 	pin = SLOT_FROM_PCI_IRQ(irq);
 	bc = IRQ_TO_BRIDGE(irq);
 	bridge = bc->base;
@@ -364,11 +318,10 @@ static void shutdown_bridge_irq(unsigned
 {
 	struct bridge_controller *bc = IRQ_TO_BRIDGE(irq);
 	bridge_t *bridge = bc->base;
+	struct slice_data *si = cpu_data[bc->irq_cpu].data;
 	int pin, swlevel;
 	cpuid_t cpu;
 
-	BUG_ON(irq < BASE_PCI_IRQ);
-
 	DBG("bridge_shutdown: irq 0x%x\n", irq);
 	pin = SLOT_FROM_PCI_IRQ(irq);
 
@@ -378,7 +331,9 @@ static void shutdown_bridge_irq(unsigned
 	 */
 	swlevel = find_level(&cpu, irq);
 	intr_disconnect_level(cpu, swlevel);
-	LEVEL_TO_IRQ(cpu, swlevel) = -1;
+
+	__clear_bit(swlevel, si->irq_alloc_mask);
+	si->level_to_irq[swlevel] = -1;
 
 	bridge->b_int_enable &= ~(1 << pin);
 	bridge->b_widget.w_tflush;                      /* Flush */
@@ -413,23 +368,32 @@ static struct hw_interrupt_type bridge_i
 	.end		= end_bridge_irq,
 };
 
-void irq_debug(void)
+static unsigned long irq_map[NR_IRQS / BITS_PER_LONG];
+
+unsigned int allocate_irqno(void)
 {
-	bridge_t *bridge = (bridge_t *) 0x9200000008000000;
+	int irq;
+
+again:
+	irq = find_first_zero_bit(irq_map, LEVELS_PER_SLICE);
+
+	if (irq >= NR_IRQS)
+		return -1;
+
+	if (test_and_set_bit(irq, irq_map))
+		goto again;
 
-	printk("bridge->b_int_status = 0x%x\n", bridge->b_int_status);
-	printk("bridge->b_int_enable = 0x%x\n", bridge->b_int_enable);
-	printk("PI_INT_PEND0   = 0x%lx\n", LOCAL_HUB_L(PI_INT_PEND0));
-	printk("PI_INT_MASK0_A = 0x%lx\n", LOCAL_HUB_L(PI_INT_MASK0_A));
+	return irq;
 }
 
-void __init init_IRQ(void)
+void free_irqno(unsigned int irq)
 {
-	int i, j;
+	clear_bit(irq, irq_map);
+}
 
-	for (i = 0; i < MAX_COMPACT_NODES; i++)
-		for (j = 0; j < PERNODE_LEVELS; j++)
-			node_level_to_irq[i][j] = -1;
+void __init init_IRQ(void)
+{
+	int i;
 
 	set_except_vector(0, ip27_irq);
 
@@ -448,25 +412,26 @@ void install_ipi(void)
 {
 	int slice = LOCAL_HUB_L(PI_CPU_NUM);
 	int cpu = smp_processor_id();
+	struct slice_data *si = cpu_data[cpu].data;
 	hubreg_t mask, set;
 
 	if (slice == 0) {
 		LOCAL_HUB_CLR_INTR(CPU_RESCHED_A_IRQ);
 		LOCAL_HUB_CLR_INTR(CPU_CALL_A_IRQ);
 		mask = LOCAL_HUB_L(PI_INT_MASK0_A);	/* Slice A */
-		set = (1UL << FAST_IRQ_TO_LEVEL(CPU_RESCHED_A_IRQ)) |
-		      (1UL << FAST_IRQ_TO_LEVEL(CPU_CALL_A_IRQ));
+		set = (1UL << CPU_RESCHED_A_IRQ) | (1UL << CPU_CALL_A_IRQ);
 		mask |= set;
-		cpu_data[cpu].p_intmasks.intpend0_masks |= set;
+		si->irq_enable_mask[0] |= set;
+		si->irq_alloc_mask[0] |= set;
 		LOCAL_HUB_S(PI_INT_MASK0_A, mask);
 	} else {
 		LOCAL_HUB_CLR_INTR(CPU_RESCHED_B_IRQ);
 		LOCAL_HUB_CLR_INTR(CPU_CALL_B_IRQ);
 		mask = LOCAL_HUB_L(PI_INT_MASK0_B);	/* Slice B */
-		set = (1UL << FAST_IRQ_TO_LEVEL(CPU_RESCHED_B_IRQ)) |
-		      (1UL << FAST_IRQ_TO_LEVEL(CPU_CALL_B_IRQ));
+		set = (1UL << CPU_RESCHED_B_IRQ) | (1UL << CPU_CALL_B_IRQ);
 		mask |= set;
-		cpu_data[cpu].p_intmasks.intpend0_masks |= set;
+		si->irq_enable_mask[1] |= set;
+		si->irq_alloc_mask[1] |= set;
 		LOCAL_HUB_S(PI_INT_MASK0_B, mask);
 	}
 }
--- diff/arch/mips/sgi-ip27/ip27-memory.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/sgi-ip27/ip27-memory.c	2004-04-21 10:45:33.680583272 +0100
@@ -5,55 +5,52 @@
  *
  * Copyright (C) 2000 by Ralf Baechle
  * Copyright (C) 2000 by Silicon Graphics, Inc.
+ * Copyright (C) 2004 by Christoph Hellwig
  *
  * On SGI IP27 the ARC memory configuration data is completly bogus but
  * alternate easier to use mechanisms are available.
  */
 #include <linux/init.h>
-#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/mm.h>
-#include <linux/bootmem.h>
+#include <linux/mmzone.h>
 #include <linux/swap.h>
-
+#include <linux/bootmem.h>
 #include <asm/page.h>
-#include <asm/bootinfo.h>
-#include <asm/addrspace.h>
-#include <asm/pgtable.h>
-#include <asm/pgalloc.h>
-#include <asm/sn/types.h>
-#include <asm/sn/addrs.h>
+#include <asm/sections.h>
+
+#include <asm/sn/arch.h>
 #include <asm/sn/hub.h>
 #include <asm/sn/klconfig.h>
-#include <asm/sn/arch.h>
-#include <asm/mmzone.h>
-#include <asm/sections.h>
+#include <asm/sn/sn_private.h>
 
-/* ip27-klnuma.c   */
-extern pfn_t node_getfirstfree(cnodeid_t cnode);
 
-#define PFN_UP(x)	(((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
-#define SLOT_IGNORED	0xffff
+#define PFN_UP(x)		(((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
 
-short slot_lastfilled_cache[MAX_COMPACT_NODES];
-unsigned short slot_psize_cache[MAX_COMPACT_NODES][MAX_MEM_SLOTS];
+#define SLOT_PFNSHIFT           (SLOT_SHIFT - PAGE_SHIFT)
+#define PFN_NASIDSHFT           (NASID_SHFT - PAGE_SHIFT)
+
+#define SLOT_IGNORED		0xffff
+
+static short __initdata slot_lastfilled_cache[MAX_COMPACT_NODES];
+static unsigned short __initdata slot_psize_cache[MAX_COMPACT_NODES][MAX_MEM_SLOTS];
+static struct bootmem_data __initdata plat_node_bdata[MAX_COMPACT_NODES];
 
-struct bootmem_data plat_node_bdata[MAX_COMPACT_NODES];
 struct pglist_data *node_data[MAX_COMPACT_NODES];
 struct hub_data *hub_data[MAX_COMPACT_NODES];
 
-int numa_debug(void)
+static pfn_t __init slot_getbasepfn(cnodeid_t cnode, int slot)
 {
-	printk("NUMA debug\n");
-	*(int *)0 = 0;
-	return(0);
+	nasid_t nasid = COMPACT_TO_NASID_NODEID(cnode);
+
+	return ((pfn_t)nasid << PFN_NASIDSHFT) | (slot << SLOT_PFNSHIFT);
 }
 
 /*
  * Return the number of pages of memory provided by the given slot
  * on the specified node.
  */
-static pfn_t slot_getsize(cnodeid_t node, int slot)
+static pfn_t __init slot_getsize(cnodeid_t node, int slot)
 {
 	return (pfn_t) slot_psize_cache[node][slot];
 }
@@ -61,7 +58,7 @@ static pfn_t slot_getsize(cnodeid_t node
 /*
  * Return highest slot filled
  */
-static int node_getlastslot(cnodeid_t node)
+static int __init node_getlastslot(cnodeid_t node)
 {
 	return (int) slot_lastfilled_cache[node];
 }
@@ -69,7 +66,7 @@ static int node_getlastslot(cnodeid_t no
 /*
  * Return the pfn of the last free page of memory on a node.
  */
-static pfn_t node_getmaxclick(cnodeid_t node)
+static pfn_t __init node_getmaxclick(cnodeid_t node)
 {
 	pfn_t	slot_psize;
 	int	slot;
@@ -78,7 +75,7 @@ static pfn_t node_getmaxclick(cnodeid_t 
 	 * Start at the top slot. When we find a slot with memory in it,
 	 * that's the winner.
 	 */
-	for (slot = (node_getnumslots(node) - 1); slot >= 0; slot--) {
+	for (slot = (MAX_MEM_SLOTS - 1); slot >= 0; slot--) {
 		if ((slot_psize = slot_getsize(node, slot))) {
 			if (slot_psize == SLOT_IGNORED)
 				continue;
@@ -94,7 +91,7 @@ static pfn_t node_getmaxclick(cnodeid_t 
 	return 0;
 }
 
-static pfn_t slot_psize_compute(cnodeid_t node, int slot)
+static pfn_t __init slot_psize_compute(cnodeid_t node, int slot)
 {
 	nasid_t nasid;
 	lboard_t *brd;
@@ -129,25 +126,25 @@ static pfn_t slot_psize_compute(cnodeid_
 	}
 }
 
-static pfn_t szmem(void)
+static void __init szmem(void)
 {
+	pfn_t slot_psize, slot0sz = 0, nodebytes;	/* Hack to detect problem configs */
+	int slot, ignore;
 	cnodeid_t node;
-	int slot, numslots;
-	pfn_t num_pages = 0, slot_psize;
-	pfn_t slot0sz = 0, nodebytes;	/* Hack to detect problem configs */
-	int ignore;
+
+	num_physpages = 0;
 
 	for (node = 0; node < numnodes; node++) {
-		numslots = node_getnumslots(node);
 		ignore = nodebytes = 0;
-		for (slot = 0; slot < numslots; slot++) {
+		for (slot = 0; slot < MAX_MEM_SLOTS; slot++) {
 			slot_psize = slot_psize_compute(node, slot);
-			if (slot == 0) slot0sz = slot_psize;
+			if (slot == 0)
+				slot0sz = slot_psize;
 			/*
 			 * We need to refine the hack when we have replicated
 			 * kernel text.
 			 */
-			nodebytes += SLOT_SIZE;
+			nodebytes += (1LL << SLOT_SHIFT);
 			if ((nodebytes >> PAGE_SHIFT) * (sizeof(struct page)) >
 						(slot0sz << PAGE_SHIFT))
 				ignore = 1;
@@ -155,18 +152,16 @@ static pfn_t szmem(void)
 				printk("Ignoring slot %d onwards on node %d\n",
 								slot, node);
 				slot_psize_cache[node][slot] = SLOT_IGNORED;
-				slot = numslots;
+				slot = MAX_MEM_SLOTS;
 				continue;
 			}
-			num_pages += slot_psize;
+			num_physpages += slot_psize;
 			slot_psize_cache[node][slot] =
 					(unsigned short) slot_psize;
 			if (slot_psize)
 				slot_lastfilled_cache[node] = slot;
 		}
 	}
-
-	return num_pages;
 }
 
 /*
@@ -174,14 +169,12 @@ static pfn_t szmem(void)
  * contains at least 32 MBytes of memory. We assume all bootmem data
  * fits on the first slot.
  */
-extern void mlreset(void);
 void __init prom_meminit(void)
 {
 	cnodeid_t node;
 
 	mlreset();
-
-	num_physpages = szmem();
+	szmem();
 
 	for (node = 0; node < numnodes; node++) {
 		pfn_t slot_firstpfn = slot_getbasepfn(node, 0);
@@ -195,7 +188,9 @@ void __init prom_meminit(void)
 		node_data[node] = __va(slot_freepfn << PAGE_SHIFT);
 		node_data[node]->bdata = &plat_node_bdata[node];
 
-		hub_data[node] = node_data[node] + 1;
+		hub_data[node] = (struct hub_data *)(node_data[node] + 1);
+
+		cpus_clear(hub_data[node]->h_cpus);
 
 		slot_freepfn += PFN_UP(sizeof(struct pglist_data) +
 				       sizeof(struct hub_data));
--- diff/arch/mips/sgi-ip27/ip27-nmi.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/sgi-ip27/ip27-nmi.c	2004-04-21 10:45:33.680583272 +0100
@@ -222,7 +222,7 @@ cont_nmi_dump(void)
 		if (i == 1000) {
 			for (node=0; node < numnodes; node++)
 				if (NODEPDA(node)->dump_count == 0) {
-					cpu = CNODE_TO_CPU_BASE(node);
+					cpu = node_to_first_cpu(node);
 					for (n=0; n < CNODE_NUM_CPUS(node); cpu++, n++) {
 						CPUMASK_SETB(nmied_cpus, cpu);
 						/*
--- diff/arch/mips/sgi-ip27/ip27-smp.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/sgi-ip27/ip27-smp.c	2004-04-21 10:45:33.681583120 +0100
@@ -32,7 +32,7 @@ static void alloc_cpupda(cpuid_t cpu, in
 	nasid_t nasid = COMPACT_TO_NASID_NODEID(node);
 
 	cputonasid(cpunum) = nasid;
-	cputocnode(cpunum) = node;
+	cpu_data[cpunum].p_nodeid = node;
 	cputoslice(cpunum) = get_cpu_slice(cpu);
 }
 
@@ -223,5 +223,5 @@ void core_send_ipi(int destid, unsigned 
 	 * part of the address space.  Then set the interrupt bit associated
 	 * with the CPU we want to send the interrupt to.
 	 */
-	REMOTE_HUB_SEND_INTR(COMPACT_TO_NASID_NODEID(cputocnode(destid)), irq);
+	REMOTE_HUB_SEND_INTR(COMPACT_TO_NASID_NODEID(cpu_to_node(destid)), irq);
 }
--- diff/arch/mips/sgi-ip27/ip27-timer.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/sgi-ip27/ip27-timer.c	2004-04-21 10:45:33.682582968 +0100
@@ -45,7 +45,7 @@ static long last_rtc_update;		/* Last ti
 
 extern volatile unsigned long wall_jiffies;
 
-
+#if 0
 static int set_rtc_mmss(unsigned long nowtime)
 {
 	int retval = 0;
@@ -88,6 +88,7 @@ static int set_rtc_mmss(unsigned long no
 
 	return retval;
 }
+#endif
 
 void ip27_rt_timer_interrupt(struct pt_regs *regs)
 {
--- diff/arch/mips/sgi-ip32/Makefile	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/sgi-ip32/Makefile	2004-04-21 10:45:33.682582968 +0100
@@ -3,7 +3,7 @@
 # under Linux.
 #
 
-obj-y	+= ip32-berr.o ip32-irq.o ip32-irq-glue.o ip32-setup.o ip32-timer.o \
-	   crime.o ip32-reset.o
+obj-y	+= ip32-berr.o ip32-irq.o ip32-irq-glue.o ip32-setup.o ip32-reset.o \
+	   crime.o
 
 EXTRA_AFLAGS := $(CFLAGS)
--- diff/arch/mips/sgi-ip32/ip32-irq.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/sgi-ip32/ip32-irq.c	2004-04-21 10:45:33.683582816 +0100
@@ -24,6 +24,7 @@
 #include <asm/mipsregs.h>
 #include <asm/signal.h>
 #include <asm/system.h>
+#include <asm/time.h>
 #include <asm/ip32/crime.h>
 #include <asm/ip32/mace.h>
 #include <asm/ip32/ip32_ints.h>
@@ -548,7 +549,7 @@ void ip32_irq4(struct pt_regs *regs)
 
 void ip32_irq5(struct pt_regs *regs)
 {
-	do_IRQ(CLOCK_IRQ, regs);
+	ll_timer_interrupt(IP32_R4K_TIMER_IRQ, regs);
 }
 
 void __init init_IRQ(void)
@@ -568,7 +569,7 @@ void __init init_IRQ(void)
 	for (irq = 0; irq <= IP32_IRQ_MAX; irq++) {
 		hw_irq_controller *controller;
 
-		if (irq == CLOCK_IRQ)
+		if (irq == IP32_R4K_TIMER_IRQ)
 			controller = &ip32_cpu_interrupt;
 		else if (irq <= MACE_PCI_BRIDGE_IRQ && irq >= MACE_VID_IN1_IRQ)
 			controller = &ip32_mace_interrupt;
@@ -586,4 +587,7 @@ void __init init_IRQ(void)
 	}
 	setup_irq(CRIME_MEMERR_IRQ, &memerr_irq);
 	setup_irq(CRIME_CPUERR_IRQ, &cpuerr_irq);
+
+#define ALLINTS (IE_IRQ0 | IE_IRQ1 | IE_IRQ2 | IE_IRQ3 | IE_IRQ4 | IE_IRQ5)
+	change_c0_status(ST0_IM, ALLINTS);
 }
--- diff/arch/mips/sgi-ip32/ip32-setup.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/sgi-ip32/ip32-setup.c	2004-04-21 10:45:33.683582816 +0100
@@ -9,22 +9,28 @@
  * Copyright (C) 2002, 03 Ilya A. Volynets
  */
 #include <linux/config.h>
-#include <linux/sched.h>
+#include <linux/console.h>
+#include <linux/init.h>
 #include <linux/interrupt.h>
+#include <linux/mc146818rtc.h>
 #include <linux/param.h>
-#include <linux/init.h>
-#include <linux/console.h>
+#include <linux/sched.h>
 
-#include <asm/time.h>
-#include <asm/mipsregs.h>
 #include <asm/bootinfo.h>
+#include <asm/mc146818-time.h>
+#include <asm/mipsregs.h>
 #include <asm/mmu_context.h>
 #include <asm/sgialib.h>
+#include <asm/time.h>
 #include <asm/traps.h>
 #include <asm/io.h>
+#include <asm/ip32/crime.h>
 #include <asm/ip32/mace.h>
 #include <asm/ip32/ip32_ints.h>
 
+extern void ip32_be_init(void);
+extern void crime_init(void);
+
 #ifdef CONFIG_SGI_O2MACE_ETH
 /*
  * This is taken care of in here 'cause they say using Arc later on is
@@ -56,28 +62,50 @@ static inline void str2eaddr(unsigned ch
 }
 #endif
 
-extern void ip32_time_init(void);
-extern void ip32_be_init(void);
-extern void __init ip32_timer_setup (struct irqaction *irq);
-extern void __init crime_init (void);
-
 #ifdef CONFIG_SERIAL_8250
 #include <linux/tty.h>
 #include <linux/serial.h>
 #include <linux/serial_core.h>
-extern int __init early_serial_setup(struct uart_port *port);
+extern int early_serial_setup(struct uart_port *port);
 
 #define STD_COM_FLAGS (ASYNC_SKIP_TEST)
 #define BASE_BAUD (1843200 / 16)
 
 #endif /* CONFIG_SERIAL_8250 */
 
+/* An arbitrary time; this can be decreased if reliability looks good */
+#define WAIT_MS 10
+
+void __init ip32_time_init(void)
+{
+	printk(KERN_INFO "Calibrating system timer... ");
+	write_c0_count(0);
+	crime_write(0, CRIME_TIMER);
+	while (crime_read(CRIME_TIMER) < CRIME_MASTER_FREQ * WAIT_MS / 1000) ;
+	mips_hpt_frequency = read_c0_count() * 1000 / WAIT_MS;
+	printk("%d MHz CPU detected\n", mips_hpt_frequency * 2 / 1000000);
+}
+
+void __init ip32_timer_setup(struct irqaction *irq)
+{
+	irq->handler = no_action;
+	setup_irq(IP32_R4K_TIMER_IRQ, irq);
+}
+
 static int __init ip32_setup(void)
 {
 	set_io_port_base((unsigned long) ioremap(MACEPCI_LOW_IO, 0x2000000));
 
 	crime_init();
 
+	board_be_init = ip32_be_init;
+
+	rtc_get_time = mc146818_get_cmos_time;
+	rtc_set_mmss = mc146818_set_rtc_mmss;
+
+	board_time_init = ip32_time_init;
+	board_timer_setup = ip32_timer_setup;
+
 #ifdef CONFIG_SERIAL_8250
  	{
 		static struct uart_port o2_serial[2];
@@ -129,10 +157,6 @@ static int __init ip32_setup(void)
 	}
 #endif
 
-	board_be_init = ip32_be_init;
-	board_time_init = ip32_time_init;
-	board_timer_setup = ip32_timer_setup;
-
 	return 0;
 }
 
--- diff/arch/mips/sibyte/sb1250/smp.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/sibyte/sb1250/smp.c	2004-04-21 10:45:33.684582664 +0100
@@ -76,9 +76,6 @@ void core_send_ipi(int cpu, unsigned int
 	__raw_writeq((((u64)action)<< 48), mailbox_set_regs[cpu]);
 }
 
-extern irqreturn_t smp_call_function_interrupt(int irq, void *dev,
-	struct pt_regs *regs);
-
 void sb1250_mailbox_interrupt(struct pt_regs *regs)
 {
 	int cpu = smp_processor_id();
@@ -96,7 +93,6 @@ void sb1250_mailbox_interrupt(struct pt_
 	 * interrupt will do the reschedule for us
 	 */
 
-	if (action & SMP_CALL_FUNCTION) {
-		smp_call_function_interrupt(0, NULL, regs);
-	}
+	if (action & SMP_CALL_FUNCTION)
+		smp_call_function_interrupt();
 }
--- diff/arch/mips/sibyte/swarm/setup.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/sibyte/swarm/setup.c	2004-04-21 10:45:33.684582664 +0100
@@ -34,6 +34,7 @@
 #include <asm/reboot.h>
 #include <asm/time.h>
 #include <asm/traps.h>
+#include <asm/pci_channel.h>
 #include <asm/sibyte/sb1250.h>
 #include <asm/sibyte/sb1250_regs.h>
 #include <asm/sibyte/sb1250_genbus.h>
@@ -80,7 +81,7 @@ int swarm_be_handler(struct pt_regs *reg
 	return (is_fixup ? MIPS_BE_FIXUP : MIPS_BE_FATAL);
 }
 
-static void __init swarm_setup(void)
+static int __init swarm_setup(void)
 {
 	extern int panic_timeout;
 
@@ -131,6 +132,8 @@ static void __init swarm_setup(void)
        };
        /* XXXKW for CFE, get lines/cols from environment */
 #endif
+
+	return 0;
 }
 
 early_initcall(swarm_setup);
--- diff/arch/mips/tx4927/common/Makefile	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/tx4927/common/Makefile	2004-04-21 10:45:33.685582512 +0100
@@ -1,10 +1,11 @@
 #
 # Makefile for common code for Toshiba TX4927 based systems
 #
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
 
-obj-y	:= tx4927_prom.o
-obj-y	+= tx4927_setup.o
-obj-y	+= tx4927_irq.o
-obj-y	+= tx4927_irq_handler.o
+obj-y	+= tx4927_prom.o tx4927_setup.o tx4927_irq.o tx4927_irq_handler.o
 
 obj-$(CONFIG_KGDB)                 += tx4927_dbgio.o
--- diff/arch/mips/vr41xx/casio-e55/Makefile	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/casio-e55/Makefile	2004-04-21 10:45:33.685582512 +0100
@@ -2,4 +2,4 @@
 # Makefile for the CASIO CASSIOPEIA E-55/65 specific parts of the kernel
 #
 
-obj-y			+= init.o setup.o
+obj-y			+= setup.o
--- diff/arch/mips/vr41xx/casio-e55/setup.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/casio-e55/setup.c	2004-04-21 10:45:33.686582360 +0100
@@ -1,7 +1,7 @@
 /*
  *  setup.c, Setup for the CASIO CASSIOPEIA E-11/15/55/65.
  *
- *  Copyright (C) 2002-2003  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
+ *  Copyright (C) 2002-2004  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -18,46 +18,27 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 #include <linux/config.h>
-#include <linux/init.h>
 #include <linux/ioport.h>
-#include <linux/major.h>
-#include <linux/kdev_t.h>
-#include <linux/root_dev.h>
 
-#include <asm/time.h>
+#include <asm/io.h>
 #include <asm/vr41xx/e55.h>
 
-#ifdef CONFIG_BLK_DEV_INITRD
-extern unsigned long initrd_start, initrd_end;
-extern void * __rd_start, * __rd_end;
-#endif
+const char *get_system_type(void)
+{
+	return "CASIO CASSIOPEIA E-11/15/55/65";
+}
 
-static void __init casio_e55_setup(void)
+static int casio_e55_setup(void)
 {
 	set_io_port_base(IO_PORT_BASE);
 	ioport_resource.start = IO_PORT_RESOURCE_START;
 	ioport_resource.end = IO_PORT_RESOURCE_END;
-	iomem_resource.start = IO_MEM_RESOURCE_START;
-	iomem_resource.end = IO_MEM_RESOURCE_END;
-
-#ifdef CONFIG_BLK_DEV_INITRD
-	ROOT_DEV = Root_RAM0;
-	initrd_start = (unsigned long)&__rd_start;
-	initrd_end = (unsigned long)&__rd_end;
-#endif
-
-	board_time_init = vr41xx_time_init;
-	board_timer_setup = vr41xx_timer_setup;
-
-	vr41xx_bcu_init();
-
-	vr41xx_cmu_init();
-
-	vr41xx_pmu_init();
 
 #ifdef CONFIG_SERIAL_8250
 	vr41xx_siu_init(SIU_RS232C, 0);
 #endif
+
+	return 0;
 }
 
 early_initcall(casio_e55_setup);
--- diff/arch/mips/vr41xx/common/Makefile	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/common/Makefile	2004-04-21 10:45:33.686582360 +0100
@@ -2,7 +2,7 @@
 # Makefile for common code of the NEC VR4100 series.
 #
 
-obj-y				+= bcu.o cmu.o giu.o icu.o int-handler.o ksyms.o pmu.o rtc.o
+obj-y				+= bcu.o cmu.o giu.o icu.o init.o int-handler.o ksyms.o pmu.o rtc.o
 obj-$(CONFIG_SERIAL_8250)	+= serial.o
 obj-$(CONFIG_VRC4171)		+= vrc4171.o
 obj-$(CONFIG_VRC4173)		+= vrc4173.o
--- diff/arch/mips/vr41xx/common/cmu.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/common/cmu.c	2004-04-21 10:45:33.686582360 +0100
@@ -1,34 +1,23 @@
 /*
- * FILE NAME
- *	arch/mips/vr41xx/common/cmu.c
+ *  cmu.c, Clock Mask Unit routines for the NEC VR4100 series.
  *
- * BRIEF MODULE DESCRIPTION
- *	Clock Mask Unit routines for the NEC VR4100 series.
- *
- * Author: Yoichi Yuasa
- *         yyuasa@mvista.com or source@mvista.com
- *
- * Copyright 2001,2002 MontaVista Software Inc.
- *
- *  This program is free software; you can redistribute it and/or modify it
- *  under the terms of the GNU General Public License as published by the
- *  Free Software Foundation; either version 2 of the License, or (at your
- *  option) any later version.
- *
- *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
- *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
- *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
+ *  Copyright (C) 2001-2002  MontaVista Software Inc.
+ *    Author: Yoichi Yuasa <yyuasa@mvista.com or source@mvista.com>
+ *  Copuright (C) 2003-2004  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 /*
  * Changes:
@@ -41,6 +30,7 @@
  */
 #include <linux/init.h>
 #include <linux/smp.h>
+#include <linux/spinlock.h>
 #include <linux/types.h>
 
 #include <asm/cpu.h>
@@ -67,16 +57,19 @@
  #define MSKMAC0	0x0002
  #define MSKMAC1	0x0004
 
-static u32 vr41xx_cmu_base;
-static u16 cmuclkmsk, cmuclkmsk2;
+static uint32_t cmu_base;
+static uint16_t cmuclkmsk, cmuclkmsk2;
+static spinlock_t cmu_lock;
 
-#define read_cmuclkmsk()	readw(vr41xx_cmu_base)
+#define read_cmuclkmsk()	readw(cmu_base)
 #define read_cmuclkmsk2()	readw(CMUCLKMSK2)
-#define write_cmuclkmsk()	writew(cmuclkmsk, vr41xx_cmu_base)
+#define write_cmuclkmsk()	writew(cmuclkmsk, cmu_base)
 #define write_cmuclkmsk2()	writew(cmuclkmsk2, CMUCLKMSK2)
 
-void vr41xx_clock_supply(unsigned int clock)
+void vr41xx_supply_clock(vr41xx_clock_t clock)
 {
+	spin_lock_irq(&cmu_lock);
+
 	switch (clock) {
 	case PIU_CLOCK:
 		cmuclkmsk |= MSKPIU;
@@ -130,10 +123,14 @@ void vr41xx_clock_supply(unsigned int cl
 		write_cmuclkmsk2();
 	else
 		write_cmuclkmsk();
+
+	spin_unlock_irq(&cmu_lock);
 }
 
-void vr41xx_clock_mask(unsigned int clock)
+void vr41xx_mask_clock(vr41xx_clock_t clock)
 {
+	spin_lock_irq(&cmu_lock);
+
 	switch (clock) {
 	case PIU_CLOCK:
 		cmuclkmsk &= ~MSKPIU;
@@ -199,6 +196,8 @@ void vr41xx_clock_mask(unsigned int cloc
 		write_cmuclkmsk2();
 	else
 		write_cmuclkmsk();
+
+	spin_unlock_irq(&cmu_lock);
 }
 
 void __init vr41xx_cmu_init(void)
@@ -206,14 +205,14 @@ void __init vr41xx_cmu_init(void)
 	switch (current_cpu_data.cputype) {
         case CPU_VR4111:
         case CPU_VR4121:
-                vr41xx_cmu_base = CMUCLKMSK_TYPE1;
+                cmu_base = CMUCLKMSK_TYPE1;
                 break;
         case CPU_VR4122:
         case CPU_VR4131:
-                vr41xx_cmu_base = CMUCLKMSK_TYPE2;
+                cmu_base = CMUCLKMSK_TYPE2;
                 break;
         case CPU_VR4133:
-                vr41xx_cmu_base = CMUCLKMSK_TYPE2;
+                cmu_base = CMUCLKMSK_TYPE2;
 		cmuclkmsk2 = read_cmuclkmsk2();
                 break;
 	default:
@@ -222,4 +221,6 @@ void __init vr41xx_cmu_init(void)
         }
 
 	cmuclkmsk = read_cmuclkmsk();
+
+	spin_lock_init(&cmu_lock);
 }
--- diff/arch/mips/vr41xx/common/giu.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/common/giu.c	2004-04-21 10:45:33.687582208 +0100
@@ -1,34 +1,23 @@
 /*
- * FILE NAME
- *	arch/mips/vr41xx/common/giu.c
+ *  giu.c, General-purpose I/O Unit Interrupt routines for NEC VR4100 series.
  *
- * BRIEF MODULE DESCRIPTION
- *	General-purpose I/O Unit Interrupt routines for NEC VR4100 series.
+ *  Copyright (C) 2002 MontaVista Software Inc.
+ *    Author: Yoichi Yuasa <yyuasa@mvista.com or source@mvista.com>
+ *  Copyright (C) 2003-2004  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
  *
- * Author: Yoichi Yuasa
- *         yyuasa@mvista.com or source@mvista.com
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
  *
- * Copyright 2002 MontaVista Software Inc.
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
  *
- *  This program is free software; you can redistribute it and/or modify it
- *  under the terms of the GNU General Public License as published by the
- *  Free Software Foundation; either version 2 of the License, or (at your
- *  option) any later version.
- *
- *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
- *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
- *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 /*
  * Changes:
@@ -37,6 +26,7 @@
  *
  *  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
  *  - Added support for NEC VR4133.
+ *  - Removed board_irq_init.
  */
 #include <linux/errno.h>
 #include <linux/init.h>
@@ -272,8 +262,6 @@ unsigned int giuint_do_IRQ(int pin, stru
 	return retval;
 }
 
-void (*board_irq_init)(void) = NULL;
-
 void __init vr41xx_giuint_init(void)
 {
 	int i;
@@ -301,7 +289,4 @@ void __init vr41xx_giuint_init(void)
 
 	if (setup_irq(GIUINT_CASCADE_IRQ, &giu_cascade))
 		printk("GIUINT: Can not cascade IRQ %d.\n", GIUINT_CASCADE_IRQ);
-
-	if (board_irq_init)
-		board_irq_init();
 }
--- diff/arch/mips/vr41xx/common/rtc.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/common/rtc.c	2004-04-21 10:45:33.688582056 +0100
@@ -259,7 +259,7 @@ void vr41xx_set_epoch_time(unsigned long
 	epoch_time = time;
 }
 
-void __init vr41xx_time_init(void)
+static void __init vr41xx_time_init(void)
 {
 	switch (current_cpu_data.cputype) {
 	case CPU_VR4111:
@@ -291,7 +291,7 @@ void __init vr41xx_time_init(void)
 	rtc_set_time = vr41xx_set_time;
 }
 
-void __init vr41xx_timer_setup(struct irqaction *irq)
+static void __init vr41xx_timer_setup(struct irqaction *irq)
 {
 	do_gettimeoffset = vr41xx_gettimeoffset;
 
@@ -309,3 +309,9 @@ void __init vr41xx_timer_setup(struct ir
 
 	setup_irq(ELAPSEDTIME_IRQ, irq);
 }
+
+void __init vr41xx_rtc_init(void)
+{
+	board_time_init = vr41xx_time_init;
+	board_timer_setup = vr41xx_timer_setup;
+}
--- diff/arch/mips/vr41xx/common/serial.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/common/serial.c	2004-04-21 10:45:33.688582056 +0100
@@ -1,34 +1,23 @@
 /*
- * FILE NAME
- *	arch/mips/vr41xx/common/serial.c
+ *  serial.c, Serial Interface Unit routines for NEC VR4100 series.
  *
- * BRIEF MODULE DESCRIPTION
- *	Serial Interface Unit routines for NEC VR4100 series.
- *
- * Author: Yoichi Yuasa
- *         yyuasa@mvista.com or source@mvista.com
- *
- * Copyright 2002 MontaVista Software Inc.
- *
- *  This program is free software; you can redistribute it and/or modify it
- *  under the terms of the GNU General Public License as published by the
- *  Free Software Foundation; either version 2 of the License, or (at your
- *  option) any later version.
- *
- *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
- *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
- *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
+ *  Copyright (C) 2002  MontaVista Software Inc.
+ *    Author: Yoichi Yuasa <yyuasa@mvista.com or source@mvista.com>
+ *  Copyright (C) 2003-2004  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 /*
  * Changes:
@@ -41,7 +30,9 @@
  */
 #include <linux/init.h>
 #include <linux/types.h>
+#include <linux/tty.h>
 #include <linux/serial.h>
+#include <linux/serial_core.h>
 #include <linux/smp.h>
 
 #include <asm/addrspace.h>
@@ -117,62 +108,62 @@ void vr41xx_siu_ifselect(int interface, 
 
 void __init vr41xx_siu_init(int interface, int module)
 {
-	struct serial_struct s;
+	struct uart_port port;
 
 	vr41xx_siu_ifselect(interface, module);
 
-	memset(&s, 0, sizeof(s));
+	memset(&port, 0, sizeof(port));
 
-	s.line = vr41xx_serial_ports;
-	s.baud_base = SIU_BASE_BAUD;
-	s.irq = SIU_IRQ;
-	s.flags = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST;
+	port.line = vr41xx_serial_ports;
+	port.uartclk = SIU_BASE_BAUD;
+	port.irq = SIU_IRQ;
+	port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST;
 	switch (current_cpu_data.cputype) {
 	case CPU_VR4111:
 	case CPU_VR4121:
-		s.iomem_base = (unsigned char *)SIURB_TYPE1;
+		port.membase = (char *)SIURB_TYPE1;
 		break;
 	case CPU_VR4122:
 	case CPU_VR4131:
 	case CPU_VR4133:
-		s.iomem_base = (unsigned char *)SIURB_TYPE2;
+		port.membase = (char *)SIURB_TYPE2;
 		break;
 	default:
 		panic("Unexpected CPU of NEC VR4100 series");
 		break;
 	}
-	s.iomem_reg_shift = 0;
-	s.io_type = SERIAL_IO_MEM;
-	if (early_serial_setup(&s) != 0)
+	port.regshift = 0;
+	port.iotype = UPIO_MEM;
+	if (early_serial_setup(&port) != 0)
 		printk(KERN_ERR "SIU setup failed!\n");
 
-	vr41xx_clock_supply(SIU_CLOCK);
+	vr41xx_supply_clock(SIU_CLOCK);
 
 	vr41xx_serial_ports++;
 }
 
 void __init vr41xx_dsiu_init(void)
 {
-	struct serial_struct s;
+	struct uart_port port;
 
 	if (current_cpu_data.cputype != CPU_VR4122 &&
 	    current_cpu_data.cputype != CPU_VR4131 &&
 	    current_cpu_data.cputype != CPU_VR4133)
 		return;
 
-	memset(&s, 0, sizeof(s));
+	memset(&port, 0, sizeof(port));
 
-	s.line = vr41xx_serial_ports;
-	s.baud_base = DSIU_BASE_BAUD;
-	s.irq = DSIU_IRQ;
-	s.flags = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST;
-	s.iomem_base = (unsigned char *)DSIURB;
-	s.iomem_reg_shift = 0;
-	s.io_type = SERIAL_IO_MEM;
-	if (early_serial_setup(&s) != 0)
+	port.line = vr41xx_serial_ports;
+	port.uartclk = DSIU_BASE_BAUD;
+	port.irq = DSIU_IRQ;
+	port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST;
+	port.membase = (char *)DSIURB;
+	port.regshift = 0;
+	port.iotype = UPIO_MEM;
+	if (early_serial_setup(&port) != 0)
 		printk(KERN_ERR "DSIU setup failed!\n");
 
-	vr41xx_clock_supply(DSIU_CLOCK);
+	vr41xx_supply_clock(DSIU_CLOCK);
 
 	writew(INTDSIU, MDSIUINTREG);
 
--- diff/arch/mips/vr41xx/ibm-workpad/Makefile	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/ibm-workpad/Makefile	2004-04-21 10:45:33.689581904 +0100
@@ -2,4 +2,4 @@
 # Makefile for the IBM WorkPad z50 specific parts of the kernel
 #
 
-obj-y			+= init.o setup.o
+obj-y			+= setup.o
--- diff/arch/mips/vr41xx/ibm-workpad/setup.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/ibm-workpad/setup.c	2004-04-21 10:45:33.689581904 +0100
@@ -1,7 +1,7 @@
 /*
  *  setup.c, Setup for the IBM WorkPad z50.
  *
- *  Copyright (C) 2002-2003  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
+ *  Copyright (C) 2002-2004  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -18,46 +18,27 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 #include <linux/config.h>
-#include <linux/init.h>
 #include <linux/ioport.h>
-#include <linux/major.h>
-#include <linux/kdev_t.h>
-#include <linux/root_dev.h>
 
-#include <asm/time.h>
+#include <asm/io.h>
 #include <asm/vr41xx/workpad.h>
 
-#ifdef CONFIG_BLK_DEV_INITRD
-extern unsigned long initrd_start, initrd_end;
-extern void * __rd_start, * __rd_end;
-#endif
+const char *get_system_type(void)
+{
+	return "IBM WorkPad z50";
+}
 
-static void __init ibm_workpad_setup(void)
+static int ibm_workpad_setup(void)
 {
 	set_io_port_base(IO_PORT_BASE);
 	ioport_resource.start = IO_PORT_RESOURCE_START;
 	ioport_resource.end = IO_PORT_RESOURCE_END;
-	iomem_resource.start = IO_MEM_RESOURCE_START;
-	iomem_resource.end = IO_MEM_RESOURCE_END;
-
-#ifdef CONFIG_BLK_DEV_INITRD
-	ROOT_DEV = Root_RAM0;
-	initrd_start = (unsigned long)&__rd_start;
-	initrd_end = (unsigned long)&__rd_end;
-#endif
-
-	board_time_init = vr41xx_time_init;
-	board_timer_setup = vr41xx_timer_setup;
-
-	vr41xx_bcu_init();
-
-	vr41xx_cmu_init();
-
-	vr41xx_pmu_init();
 
 #ifdef CONFIG_SERIAL_8250
 	vr41xx_siu_init(SIU_RS232C, 0);
 #endif
+
+	return 0;
 }
 
 early_initcall(ibm_workpad_setup);
--- diff/arch/mips/vr41xx/nec-eagle/Makefile	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/nec-eagle/Makefile	2004-04-21 10:45:33.690581752 +0100
@@ -7,4 +7,4 @@
 # Copyright 2001,2002 MontaVista Software Inc.
 #
 
-obj-y			+= init.o irq.o setup.o
+obj-y			+= irq.o setup.o
--- diff/arch/mips/vr41xx/nec-eagle/irq.c	2003-07-08 09:55:17.000000000 +0100
+++ source/arch/mips/vr41xx/nec-eagle/irq.c	2004-04-21 10:45:33.690581752 +0100
@@ -1,64 +1,61 @@
 /*
- * FILE NAME
- *	arch/mips/vr41xx/nec-eagle/irq.c
+ *  irq.c,  Interrupt routines for the NEC Eagle/Hawk board.
  *
- * BRIEF MODULE DESCRIPTION
- *	Interrupt routines for the NEC Eagle/Hawk board.
- *
- * Author: Yoichi Yuasa
- *         yyuasa@mvista.com or source@mvista.com
- *
- * Copyright 2002 MontaVista Software Inc.
- *
- *  This program is free software; you can redistribute it and/or modify it
- *  under the terms of the GNU General Public License as published by the
- *  Free Software Foundation; either version 2 of the License, or (at your
- *  option) any later version.
- *
- *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
- *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
- *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
+ *  Copyright (C) 2002  MontaVista Software, Inc.
+ *    Author: Yoichi Yuasa <yyuasa@mvista.com, or source@mvista.com>
+ *  Copyright (C) 2004  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 /*
  * Changes:
  *  MontaVista Software Inc. <yyuasa@mvista.com> or <source@mvista.com>
+ *  - New creation, NEC Eagle is supported.
  *  - Added support for NEC Hawk.
  *
- *  MontaVista Software Inc. <yyuasa@mvista.com> or <source@mvista.com>
- *  - New creation, NEC Eagle is supported.
+ *  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
+ *  - Changed from board_irq_init to driver module.
  */
+#include <linux/config.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
+#include <linux/module.h>
+#include <linux/types.h>
 
 #include <asm/io.h>
 #include <asm/vr41xx/eagle.h>
 
+MODULE_DESCRIPTION("IRQ module driver for NEC Eagle/Hawk");
+MODULE_AUTHOR("Yoichi Yuasa <yyuasa@mvista.com>");
+MODULE_LICENSE("GPL");
+
 static void enable_pciint_irq(unsigned int irq)
 {
-	u8 val;
+	uint8_t val;
 
 	val = readb(NEC_EAGLE_PCIINTMSKREG);
-	val |= (u8)1 << (irq - PCIINT_IRQ_BASE);
+	val |= (uint8_t)1 << (irq - PCIINT_IRQ_BASE);
 	writeb(val, NEC_EAGLE_PCIINTMSKREG);
 }
 
 static void disable_pciint_irq(unsigned int irq)
 {
-	u8 val;
+	uint8_t val;
 
 	val = readb(NEC_EAGLE_PCIINTMSKREG);
-	val &= ~((u8)1 << (irq - PCIINT_IRQ_BASE));
+	val &= ~((uint8_t)1 << (irq - PCIINT_IRQ_BASE));
 	writeb(val, NEC_EAGLE_PCIINTMSKREG);
 }
 
@@ -78,31 +75,30 @@ static void end_pciint_irq(unsigned int 
 }
 
 static struct hw_interrupt_type pciint_irq_type = {
-	"PCIINT",
-	startup_pciint_irq,
-	shutdown_pciint_irq,
-       	enable_pciint_irq,
-	disable_pciint_irq,
-	ack_pciint_irq,
-	end_pciint_irq,
-	NULL
+	.typename	= "PCIINT",
+	.startup	= startup_pciint_irq,
+	.shutdown 	= shutdown_pciint_irq,
+	.enable       	= enable_pciint_irq,
+	.disable	= disable_pciint_irq,
+	.ack		= ack_pciint_irq,
+	.end		= end_pciint_irq,
 };
 
 static void enable_sdbint_irq(unsigned int irq)
 {
-	u8 val;
+	uint8_t val;
 
 	val = readb(NEC_EAGLE_SDBINTMSK);
-	val |= (u8)1 << (irq - SDBINT_IRQ_BASE);
+	val |= (uint8_t)1 << (irq - SDBINT_IRQ_BASE);
 	writeb(val, NEC_EAGLE_SDBINTMSK);
 }
 
 static void disable_sdbint_irq(unsigned int irq)
 {
-	u8 val;
+	uint8_t val;
 
 	val = readb(NEC_EAGLE_SDBINTMSK);
-	val &= ~((u8)1 << (irq - SDBINT_IRQ_BASE));
+	val &= ~((uint8_t)1 << (irq - SDBINT_IRQ_BASE));
 	writeb(val, NEC_EAGLE_SDBINTMSK);
 }
 
@@ -122,19 +118,18 @@ static void end_sdbint_irq(unsigned int 
 }
 
 static struct hw_interrupt_type sdbint_irq_type = {
-	"SDBINT",
-	startup_sdbint_irq,
-	shutdown_sdbint_irq,
-       	enable_sdbint_irq,
-	disable_sdbint_irq,
-	ack_sdbint_irq,
-	end_sdbint_irq,
-	NULL
+	.typename	= "SDBINT",
+	.startup	= startup_sdbint_irq,
+	.shutdown	= shutdown_sdbint_irq,
+	.enable		= enable_sdbint_irq,
+	.disable	= disable_sdbint_irq,
+	.ack		= ack_sdbint_irq,
+	.end		= end_sdbint_irq,
 };
 
 static int eagle_get_irq_number(int irq)
 {
-	u8 sdbint, pciint;
+	uint8_t sdbint, pciint;
 	int i;
 
 	sdbint = readb(NEC_EAGLE_SDBINT);
@@ -157,9 +152,9 @@ static int eagle_get_irq_number(int irq)
 	return -EINVAL;
 }
 
-void __init eagle_irq_init(void)
+static int __devinit eagle_irq_init(void)
 {
-	int i;
+	int i, retval;
 
 	writeb(0, NEC_EAGLE_SDBINTMSK);
 	writeb(0, NEC_EAGLE_PCIINTMSKREG);
@@ -179,5 +174,17 @@ void __init eagle_irq_init(void)
 	for (i = PCIINT_IRQ_BASE; i <= PCIINT_IRQ_LAST; i++)
 		irq_desc[i].handler = &pciint_irq_type;
 
-	vr41xx_cascade_irq(FPGA_CASCADE_IRQ, eagle_get_irq_number);
+	retval = vr41xx_cascade_irq(FPGA_CASCADE_IRQ, eagle_get_irq_number);
+	if (retval != 0)
+		printk(KERN_ERR "eagle: Cannot cascade IRQ %d\n", FPGA_CASCADE_IRQ);
+
+	return retval;
 }
+
+static void __devexit eagle_irq_exit(void)
+{
+	free_irq(FPGA_CASCADE_IRQ, NULL);
+}
+
+module_init(eagle_irq_init);
+module_exit(eagle_irq_exit);
--- diff/arch/mips/vr41xx/nec-eagle/setup.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/nec-eagle/setup.c	2004-04-21 10:45:33.691581600 +0100
@@ -11,23 +11,12 @@
  * or implied.
  */
 #include <linux/config.h>
-#include <linux/init.h>
 #include <linux/ioport.h>
-#include <linux/major.h>
-#include <linux/kdev_t.h>
-#include <linux/root_dev.h>
 
+#include <asm/io.h>
 #include <asm/pci_channel.h>
-#include <asm/time.h>
 #include <asm/vr41xx/eagle.h>
 
-#ifdef CONFIG_BLK_DEV_INITRD
-extern unsigned long initrd_start, initrd_end;
-extern void * __rd_start, * __rd_end;
-#endif
-
-extern void eagle_irq_init(void);
-
 #ifdef CONFIG_PCI
 
 extern void vrc4173_preinit(void);
@@ -79,30 +68,16 @@ static struct vr41xx_pci_address_map pci
 };
 #endif
 
+const char *get_system_type(void)
+{
+	return "NEC SDB-VR4122/VR4131(Eagle/Hawk)";
+}
+
 static int nec_eagle_setup(void)
 {
 	set_io_port_base(IO_PORT_BASE);
 	ioport_resource.start = IO_PORT_RESOURCE_START;
 	ioport_resource.end = IO_PORT_RESOURCE_END;
-	iomem_resource.start = IO_MEM1_RESOURCE_START;
-	iomem_resource.end = IO_MEM2_RESOURCE_END;
-
-#ifdef CONFIG_BLK_DEV_INITRD
-	ROOT_DEV = Root_RAM0;
-	initrd_start = (unsigned long)&__rd_start;
-	initrd_end = (unsigned long)&__rd_end;
-#endif
-
-	board_time_init = vr41xx_time_init;
-	board_timer_setup = vr41xx_timer_setup;
-
-	board_irq_init = eagle_irq_init;
-
-	vr41xx_bcu_init();
-
-	vr41xx_cmu_init();
-
-	vr41xx_pmu_init();
 
 #ifdef CONFIG_SERIAL_8250
 	vr41xx_dsiu_init();
--- diff/arch/mips/vr41xx/tanbac-tb0226/Makefile	2003-07-08 09:55:17.000000000 +0100
+++ source/arch/mips/vr41xx/tanbac-tb0226/Makefile	2004-04-21 10:45:33.691581600 +0100
@@ -2,4 +2,4 @@
 # Makefile for the TANBAC TB0226 specific parts of the kernel
 #
 
-obj-y			+= init.o setup.o
+obj-y			+= setup.o
--- diff/arch/mips/vr41xx/tanbac-tb0226/setup.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/tanbac-tb0226/setup.c	2004-04-21 10:45:33.692581448 +0100
@@ -1,7 +1,7 @@
 /*
  *  setup.c, Setup for the TANBAC TB0226.
  *
- *  Copyright (C) 2002-2003  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
+ *  Copyright (C) 2002-2004  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -18,18 +18,12 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 #include <linux/config.h>
-#include <linux/init.h>
 #include <linux/ioport.h>
 
+#include <asm/io.h>
 #include <asm/pci_channel.h>
-#include <asm/time.h>
 #include <asm/vr41xx/tb0226.h>
 
-#ifdef CONFIG_BLK_DEV_INITRD
-extern unsigned long initrd_start, initrd_end;
-extern void * __rd_start, * __rd_end;
-#endif
-
 #ifdef CONFIG_PCI
 static struct resource vr41xx_pci_io_resource = {
 	.name	= "PCI I/O space",
@@ -78,34 +72,24 @@ static struct vr41xx_pci_address_map pci
 };
 #endif
 
-void __init tanbac_tb0226_setup(void)
+const char *get_system_type(void)
+{
+	return "TANBAC TB0226";
+}
+
+static int tanbac_tb0226_setup(void)
 {
 	set_io_port_base(IO_PORT_BASE);
 	ioport_resource.start = IO_PORT_RESOURCE_START;
 	ioport_resource.end = IO_PORT_RESOURCE_END;
-	iomem_resource.start = IO_MEM1_RESOURCE_START;
-	iomem_resource.end = IO_MEM2_RESOURCE_END;
-
-#ifdef CONFIG_BLK_DEV_INITRD
-	ROOT_DEV = MKDEV(RAMDISK_MAJOR, 0);
-	initrd_start = (unsigned long)&__rd_start;
-	initrd_end = (unsigned long)&__rd_end;
-#endif
-
-	board_time_init = vr41xx_time_init;
-	board_timer_setup = vr41xx_timer_setup;
-
-	vr41xx_bcu_init();
-
-	vr41xx_cmu_init();
-
-	vr41xx_pmu_init();
 
 	vr41xx_siu_init(SIU_RS232C, 0);
 
 #ifdef CONFIG_PCI
 	vr41xx_pciu_init(&pci_address_map);
 #endif
+
+	return 0;
 }
 
 early_initcall(tanbac_tb0226_setup);
--- diff/arch/mips/vr41xx/tanbac-tb0229/Makefile	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/tanbac-tb0229/Makefile	2004-04-21 10:45:33.692581448 +0100
@@ -2,6 +2,6 @@
 # Makefile for the TANBAC TB0229(VR4131DIMM) specific parts of the kernel
 #
 
-obj-y				:= init.o setup.o
+obj-y				:= setup.o
 
 obj-$(CONFIG_TANBAC_TB0219)	+= reboot.o
--- diff/arch/mips/vr41xx/tanbac-tb0229/setup.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/tanbac-tb0229/setup.c	2004-04-21 10:45:33.693581296 +0100
@@ -1,7 +1,7 @@
 /*
  *  setup.c, Setup for the TANBAC TB0229 (VR4131DIMM)
  *
- *  Copyright (C) 2002-2003  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
+ *  Copyright (C) 2002-2004  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
  *
  *  Modified for TANBAC TB0229:
  *  Copyright (C) 2003  Megasolution Inc.  <matsu@megasolution.jp>
@@ -21,20 +21,13 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 #include <linux/config.h>
-#include <linux/blkdev.h>
-#include <linux/init.h>
 #include <linux/ioport.h>
-#include <linux/root_dev.h>
 
+#include <asm/io.h>
 #include <asm/pci_channel.h>
 #include <asm/reboot.h>
-#include <asm/time.h>
 #include <asm/vr41xx/tb0229.h>
 
-#ifdef CONFIG_BLK_DEV_INITRD
-extern void * __rd_start, * __rd_end;
-#endif
-
 #ifdef CONFIG_PCI
 static struct resource vr41xx_pci_io_resource = {
 	.name	= "PCI I/O space",
@@ -83,28 +76,16 @@ static struct vr41xx_pci_address_map pci
 };
 #endif
 
-static void __init tanbac_tb0229_setup(void)
+const char *get_system_type(void)
+{
+	return "TANBAC TB0229";
+}
+
+static int tanbac_tb0229_setup(void)
 {
 	set_io_port_base(IO_PORT_BASE);
 	ioport_resource.start = IO_PORT_RESOURCE_START;
 	ioport_resource.end = IO_PORT_RESOURCE_END;
-	iomem_resource.start = IO_MEM1_RESOURCE_START;
-	iomem_resource.end = IO_MEM2_RESOURCE_END;
-
-#ifdef CONFIG_BLK_DEV_INITRD
-	ROOT_DEV = MKDEV(RAMDISK_MAJOR, 0);
-	initrd_start = (unsigned long)&__rd_start;
-	initrd_end = (unsigned long)&__rd_end;
-#endif
-
-	board_time_init = vr41xx_time_init;
-	board_timer_setup = vr41xx_timer_setup;
-
-	vr41xx_bcu_init();
-
-	vr41xx_cmu_init();
-
-	vr41xx_pmu_init();
 
 	vr41xx_siu_init(SIU_RS232C, 0);
 	vr41xx_dsiu_init();
@@ -116,6 +97,8 @@ static void __init tanbac_tb0229_setup(v
 #ifdef CONFIG_TANBAC_TB0219
 	_machine_restart = tanbac_tb0229_restart;
 #endif
+
+	return 0;
 }
 
 early_initcall(tanbac_tb0229_setup);
--- diff/arch/mips/vr41xx/victor-mpc30x/Makefile	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/victor-mpc30x/Makefile	2004-04-21 10:45:33.693581296 +0100
@@ -2,4 +2,4 @@
 # Makefile for the Victor MP-C303/304 specific parts of the kernel
 #
 
-obj-y			+= init.o setup.o
+obj-y			+= setup.o
--- diff/arch/mips/vr41xx/victor-mpc30x/setup.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/victor-mpc30x/setup.c	2004-04-21 10:45:33.694581144 +0100
@@ -1,7 +1,7 @@
 /*
  *  setup.c, Setup for the Victor MP-C303/304.
  *
- *  Copyright (C) 2002-2003  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
+ *  Copyright (C) 2002-2004  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -18,21 +18,12 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 #include <linux/config.h>
-#include <linux/init.h>
 #include <linux/ioport.h>
-#include <linux/major.h>
-#include <linux/kdev_t.h>
-#include <linux/root_dev.h>
 
+#include <asm/io.h>
 #include <asm/pci_channel.h>
-#include <asm/time.h>
 #include <asm/vr41xx/mpc30x.h>
 
-#ifdef CONFIG_BLK_DEV_INITRD
-extern unsigned long initrd_start, initrd_end;
-extern void * __rd_start, * __rd_end;
-#endif
-
 #ifdef CONFIG_PCI
 static struct resource vr41xx_pci_io_resource = {
 	"PCI I/O space",
@@ -81,28 +72,16 @@ static struct vr41xx_pci_address_map pci
 };
 #endif
 
-static void __init victor_mpc30x_setup(void)
+const char *get_system_type(void)
+{
+	return "Victor MP-C303/304";
+}
+
+static int victor_mpc30x_setup(void)
 {
 	set_io_port_base(IO_PORT_BASE);
 	ioport_resource.start = IO_PORT_RESOURCE_START;
 	ioport_resource.end = IO_PORT_RESOURCE_END;
-	iomem_resource.start = IO_MEM1_RESOURCE_START;
-	iomem_resource.end = IO_MEM2_RESOURCE_END;
-
-#ifdef CONFIG_BLK_DEV_INITRD
-	ROOT_DEV = Root_RAM0;
-	initrd_start = (unsigned long)&__rd_start;
-	initrd_end = (unsigned long)&__rd_end;
-#endif
-
-	board_time_init = vr41xx_time_init;
-	board_timer_setup = vr41xx_timer_setup;
-
-	vr41xx_bcu_init();
-
-	vr41xx_cmu_init();
-
-	vr41xx_pmu_init();
 
 #ifdef CONFIG_SERIAL_8250
 	vr41xx_siu_init(SIU_RS232C, 0);
@@ -111,6 +90,8 @@ static void __init victor_mpc30x_setup(v
 #ifdef CONFIG_PCI
 	vr41xx_pciu_init(&pci_address_map);
 #endif
+
+	return 0;
 }
 
 early_initcall(victor_mpc30x_setup);
--- diff/arch/mips/vr41xx/zao-capcella/Makefile	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/zao-capcella/Makefile	2004-04-21 10:45:33.694581144 +0100
@@ -2,4 +2,4 @@
 # Makefile for the ZAO Networks Capcella  specific parts of the kernel
 #
 
-obj-y			+= init.o setup.o
+obj-y			+= setup.o
--- diff/arch/mips/vr41xx/zao-capcella/setup.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/zao-capcella/setup.c	2004-04-21 10:45:33.695580992 +0100
@@ -1,7 +1,7 @@
 /*
  *  setup.c, Setup for the ZAO Networks Capcella.
  *
- *  Copyright (C) 2002-2003  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
+ *  Copyright (C) 2002-2004  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -18,21 +18,12 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 #include <linux/config.h>
-#include <linux/init.h>
 #include <linux/ioport.h>
-#include <linux/major.h>
-#include <linux/kdev_t.h>
-#include <linux/root_dev.h>
 
+#include <asm/io.h>
 #include <asm/pci_channel.h>
-#include <asm/time.h>
 #include <asm/vr41xx/capcella.h>
 
-#ifdef CONFIG_BLK_DEV_INITRD
-extern unsigned long initrd_start, initrd_end;
-extern void * __rd_start, * __rd_end;
-#endif
-
 #ifdef CONFIG_PCI
 static struct resource vr41xx_pci_io_resource = {
 	"PCI I/O space",
@@ -81,28 +72,16 @@ static struct vr41xx_pci_address_map pci
 };
 #endif
 
-static void __init zao_capcella_setup(void)
+const char *get_system_type(void)
+{
+	return "ZAO Networks Capcella";
+}
+
+static int zao_capcella_setup(void)
 {
 	set_io_port_base(IO_PORT_BASE);
 	ioport_resource.start = IO_PORT_RESOURCE_START;
 	ioport_resource.end = IO_PORT_RESOURCE_END;
-	iomem_resource.start = IO_MEM1_RESOURCE_START;
-	iomem_resource.end = IO_MEM2_RESOURCE_END;
-
-#ifdef CONFIG_BLK_DEV_INITRD
-	ROOT_DEV = Root_RAM0;
-	initrd_start = (unsigned long)&__rd_start;
-	initrd_end = (unsigned long)&__rd_end;
-#endif
-
-	board_time_init = vr41xx_time_init;
-	board_timer_setup = vr41xx_timer_setup;
-
-	vr41xx_bcu_init();
-
-	vr41xx_cmu_init();
-
-	vr41xx_pmu_init();
 
 #ifdef CONFIG_SERIAL_8250
 	vr41xx_siu_init(SIU_RS232C, 0);
@@ -112,6 +91,8 @@ static void __init zao_capcella_setup(vo
 #ifdef CONFIG_PCI
 	vr41xx_pciu_init(&pci_address_map);
 #endif
+
+	return 0;
 }
 
 early_initcall(zao_capcella_setup);
--- diff/arch/parisc/configs/c3000_defconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/parisc/configs/c3000_defconfig	2004-04-21 10:45:33.696580840 +0100
@@ -876,7 +876,6 @@ CONFIG_USB_HPUSBSCSI=m
 # CONFIG_USB_AUERSWALD is not set
 # CONFIG_USB_RIO500 is not set
 CONFIG_USB_LEGOTOWER=m
-# CONFIG_USB_BRLVGER is not set
 # CONFIG_USB_LCD is not set
 # CONFIG_USB_LED is not set
 # CONFIG_USB_TEST is not set
--- diff/arch/parisc/defconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/parisc/defconfig	2004-04-21 10:45:33.696580840 +0100
@@ -737,7 +737,6 @@ CONFIG_USB_OHCI_HCD=y
 # CONFIG_USB_AUERSWALD is not set
 # CONFIG_USB_RIO500 is not set
 # CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_BRLVGER is not set
 # CONFIG_USB_LCD is not set
 # CONFIG_USB_LED is not set
 
--- diff/arch/parisc/kernel/cache.c	2004-01-19 10:22:55.000000000 +0000
+++ source/arch/parisc/kernel/cache.c	2004-04-21 10:45:33.696580840 +0100
@@ -68,7 +68,7 @@ update_mmu_cache(struct vm_area_struct *
 {
 	struct page *page = pte_page(pte);
 
-	if (VALID_PAGE(page) && page->mapping &&
+	if (VALID_PAGE(page) && page_mapping(page) &&
 	    test_bit(PG_dcache_dirty, &page->flags)) {
 
 		flush_kernel_dcache_page(page_address(page));
@@ -229,16 +229,17 @@ void disable_sr_hashing(void)
 
 void __flush_dcache_page(struct page *page)
 {
+	struct address_space *mapping = page_mapping(page);
 	struct mm_struct *mm = current->active_mm;
 	struct list_head *l;
 
 	flush_kernel_dcache_page(page_address(page));
 
-	if (!page->mapping)
+	if (!mapping)
 		return;
 	/* check shared list first if it's not empty...it's usually
 	 * the shortest */
-	list_for_each(l, &page->mapping->i_mmap_shared) {
+	list_for_each(l, &mapping->i_mmap_shared) {
 		struct vm_area_struct *mpnt;
 		unsigned long off;
 
@@ -267,7 +268,7 @@ void __flush_dcache_page(struct page *pa
 
 	/* then check private mapping list for read only shared mappings
 	 * which are flagged by VM_MAYSHARE */
-	list_for_each(l, &page->mapping->i_mmap) {
+	list_for_each(l, &mapping->i_mmap) {
 		struct vm_area_struct *mpnt;
 		unsigned long off;
 
--- diff/arch/parisc/kernel/semaphore.c	2002-11-11 11:09:36.000000000 +0000
+++ source/arch/parisc/kernel/semaphore.c	2004-04-21 10:45:33.697580688 +0100
@@ -5,6 +5,7 @@
 #include <linux/sched.h>
 #include <linux/spinlock.h>
 #include <linux/errno.h>
+#include <linux/init.h>
 
 /*
  * Semaphores are complex as we wish to avoid using two variables.
@@ -58,7 +59,7 @@ void __up(struct semaphore *sem)
 	sem->count += (sem->count < 0) ? 1 : - 1;
 	
 
-void __down(struct semaphore * sem)
+void __sched __down(struct semaphore * sem)
 {
 	DOWN_HEAD
 
@@ -74,7 +75,7 @@ void __down(struct semaphore * sem)
 	UPDATE_COUNT
 }
 
-int __down_interruptible(struct semaphore * sem)
+int __sched __down_interruptible(struct semaphore * sem)
 {
 	DOWN_HEAD
 
--- diff/arch/parisc/kernel/sys_parisc32.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/parisc/kernel/sys_parisc32.c	2004-04-21 10:45:33.697580688 +0100
@@ -388,14 +388,16 @@ static inline long get_ts32(struct times
 
 asmlinkage long sys32_time(compat_time_t *tloc)
 {
-    time_t now = get_seconds();
-    compat_time_t now32 = now;
+    struct timeval tv;
 
-    if (tloc)
-    	if (put_user(now32, tloc))
-		now32 = -EFAULT;
+	do_gettimeofday(&tv);
+	compat_time_t now32 = tv.tv_sec;
 
-    return now32;
+	if (tloc)
+		if (put_user(now32, tloc))
+			now32 = -EFAULT;
+
+	return now32;
 }
 
 asmlinkage int
--- diff/arch/parisc/kernel/vmlinux.lds.S	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/parisc/kernel/vmlinux.lds.S	2004-04-21 10:45:33.698580536 +0100
@@ -50,6 +50,7 @@ SECTIONS
   _text = .;			/* Text and read-only data */
   .text ALIGN(16) : {
 	*(.text*)
+	SCHED_TEXT
 	*(.PARISC.unwind)
 	*(.fixup)
 	*(.lock.text)		/* out-of-line lock text */
--- diff/arch/ppc/configs/adir_defconfig	2003-07-11 09:39:50.000000000 +0100
+++ source/arch/ppc/configs/adir_defconfig	2004-04-21 10:45:33.701580080 +0100
@@ -776,7 +776,6 @@ CONFIG_USB_EZUSB=y
 # CONFIG_USB_TIGL is not set
 # CONFIG_USB_AUERSWALD is not set
 # CONFIG_USB_RIO500 is not set
-# CONFIG_USB_BRLVGER is not set
 # CONFIG_USB_LCD is not set
 # CONFIG_USB_TEST is not set
 # CONFIG_USB_GADGET is not set
--- diff/arch/ppc/configs/common_defconfig	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc/configs/common_defconfig	2004-04-21 10:45:33.708579016 +0100
@@ -1209,7 +1209,6 @@ CONFIG_USB_EZUSB=y
 # CONFIG_USB_TIGL is not set
 # CONFIG_USB_AUERSWALD is not set
 # CONFIG_USB_RIO500 is not set
-# CONFIG_USB_BRLVGER is not set
 # CONFIG_USB_LCD is not set
 # CONFIG_USB_TEST is not set
 # CONFIG_USB_GADGET is not set
--- diff/arch/ppc/configs/lopec_defconfig	2003-07-11 09:39:50.000000000 +0100
+++ source/arch/ppc/configs/lopec_defconfig	2004-04-21 10:45:33.716577800 +0100
@@ -788,7 +788,6 @@ CONFIG_USB_SERIAL_VISOR=m
 # CONFIG_USB_TIGL is not set
 # CONFIG_USB_AUERSWALD is not set
 # CONFIG_USB_RIO500 is not set
-# CONFIG_USB_BRLVGER is not set
 # CONFIG_USB_LCD is not set
 # CONFIG_USB_TEST is not set
 # CONFIG_USB_GADGET is not set
--- diff/arch/ppc/configs/pmac_defconfig	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc/configs/pmac_defconfig	2004-04-21 10:45:33.718577496 +0100
@@ -1249,7 +1249,6 @@ CONFIG_USB_SERIAL_VISOR=m
 # CONFIG_USB_TIGL is not set
 # CONFIG_USB_AUERSWALD is not set
 # CONFIG_USB_RIO500 is not set
-# CONFIG_USB_BRLVGER is not set
 # CONFIG_USB_LCD is not set
 # CONFIG_USB_TEST is not set
 # CONFIG_USB_GADGET is not set
--- diff/arch/ppc/configs/sandpoint_defconfig	2003-07-11 09:39:50.000000000 +0100
+++ source/arch/ppc/configs/sandpoint_defconfig	2004-04-21 10:45:33.728575976 +0100
@@ -775,7 +775,6 @@ CONFIG_USB_SERIAL_VISOR=m
 # CONFIG_USB_TIGL is not set
 # CONFIG_USB_AUERSWALD is not set
 # CONFIG_USB_RIO500 is not set
-# CONFIG_USB_BRLVGER is not set
 # CONFIG_USB_LCD is not set
 # CONFIG_USB_TEST is not set
 # CONFIG_USB_GADGET is not set
--- diff/arch/ppc/defconfig	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc/defconfig	2004-04-21 10:45:33.733575216 +0100
@@ -1208,7 +1208,6 @@ CONFIG_USB_EZUSB=y
 # CONFIG_USB_TIGL is not set
 # CONFIG_USB_AUERSWALD is not set
 # CONFIG_USB_RIO500 is not set
-# CONFIG_USB_BRLVGER is not set
 # CONFIG_USB_LCD is not set
 # CONFIG_USB_TEST is not set
 # CONFIG_USB_GADGET is not set
--- diff/arch/ppc/kernel/head.S	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc/kernel/head.S	2004-04-21 10:45:33.743573696 +0100
@@ -493,13 +493,14 @@ SystemCall:
  * We effectively remap it to 0x3000.
  */
 	. = 0xf00
-
-#ifdef CONFIG_ALTIVEC
 	b	Trap_0f
+
 	. = 0xf20
+#ifdef CONFIG_ALTIVEC
 	b	AltiVecUnavailable
-Trap_0f:
 #endif
+
+Trap_0f:
 	EXCEPTION_PROLOG
 	addi	r3,r1,STACK_FRAME_OVERHEAD
 	EXC_XFER_EE(0xf00, UnknownException)
--- diff/arch/ppc/kernel/misc.S	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc/kernel/misc.S	2004-04-21 10:45:33.747573088 +0100
@@ -738,12 +738,15 @@ _GLOBAL(__flush_dcache_icache_phys)
 	blr
 
 /*
- * Clear a page using the dcbz instruction, which doesn't cause any
+ * Clear pages using the dcbz instruction, which doesn't cause any
  * memory traffic (except to write out any cache lines which get
  * displaced).  This only works on cacheable memory.
+ *
+ * void clear_pages(void *page, int order) ;
  */
-_GLOBAL(clear_page)
+_GLOBAL(clear_pages)
 	li	r0,4096/L1_CACHE_LINE_SIZE
+	slw	r0,r0,r4
 	mtctr	r0
 #ifdef CONFIG_8xx
 	li	r4, 0
@@ -1369,4 +1372,16 @@ _GLOBAL(sys_call_table)
 	.long sys_statfs64
 	.long sys_fstatfs64
 	.long ppc_fadvise64_64
-	.long sys_ni_syscall	/* 255 - rtas (used on ppc64) */
+	.long sys_ni_syscall		/* 255 - rtas (used on ppc64) */
+	.long sys_ni_syscall		/* 256 reserved for sys_debug_setcontext */
+	.long sys_ni_syscall		/* 257 reserved for vserver */
+	.long sys_ni_syscall		/* 258 reserved for new sys_remap_file_pages */
+	.long sys_ni_syscall		/* 259 reserved for new sys_mbind */
+	.long sys_ni_syscall		/* 260 reserved for new sys_get_mempolicy */
+	.long sys_ni_syscall		/* 261 reserved for new sys_set_mempolicy */
+	.long sys_mq_open
+	.long sys_mq_unlink
+	.long sys_mq_timedsend
+	.long sys_mq_timedreceive	/* 265 */
+	.long sys_mq_notify
+	.long sys_mq_getsetattr
--- diff/arch/ppc/kernel/process.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc/kernel/process.c	2004-04-21 10:45:33.752572328 +0100
@@ -83,7 +83,7 @@ kernel_stack_top(struct task_struct *tsk
 unsigned long
 task_top(struct task_struct *tsk)
 {
-	return ((unsigned long)tsk) + sizeof(struct task_struct);
+	return ((unsigned long)tsk) + sizeof(struct thread_info);
 }
 
 /* check to make sure the kernel stack is healthy */
@@ -661,8 +661,6 @@ void __init ll_puts(const char *s)
 /*
  * These bracket the sleeping functions..
  */
-extern void scheduling_functions_start_here(void);
-extern void scheduling_functions_end_here(void);
 #define first_sched    ((unsigned long) scheduling_functions_start_here)
 #define last_sched     ((unsigned long) scheduling_functions_end_here)
 
--- diff/arch/ppc/kernel/semaphore.c	2002-10-16 04:28:33.000000000 +0100
+++ source/arch/ppc/kernel/semaphore.c	2004-04-21 10:45:33.752572328 +0100
@@ -15,6 +15,7 @@
  */
 
 #include <linux/sched.h>
+#include <linux/init.h>
 #include <asm/atomic.h>
 #include <asm/semaphore.h>
 #include <asm/errno.h>
@@ -69,7 +70,7 @@ void __up(struct semaphore *sem)
  * Thus it is only when we decrement count from some value > 0
  * that we have actually got the semaphore.
  */
-void __down(struct semaphore *sem)
+void __sched __down(struct semaphore *sem)
 {
 	struct task_struct *tsk = current;
 	DECLARE_WAITQUEUE(wait, tsk);
@@ -99,7 +100,7 @@ void __down(struct semaphore *sem)
 	wake_up(&sem->wait);
 }
 
-int __down_interruptible(struct semaphore * sem)
+int __sched __down_interruptible(struct semaphore * sem)
 {
 	int retval = 0;
 	struct task_struct *tsk = current;
--- diff/arch/ppc/kernel/vmlinux.lds.S	2003-11-25 15:24:57.000000000 +0000
+++ source/arch/ppc/kernel/vmlinux.lds.S	2004-04-21 10:45:33.752572328 +0100
@@ -31,6 +31,7 @@ SECTIONS
   .text      :
   {
     *(.text)
+    SCHED_TEXT
     *(.fixup)
     *(.got1)
     __got2_start = .;
--- diff/arch/ppc/mm/pgtable.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc/mm/pgtable.c	2004-04-21 10:45:33.758571416 +0100
@@ -71,13 +71,13 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
 	pgd_t *ret;
 
 	if ((ret = (pgd_t *)__get_free_pages(GFP_KERNEL, PGDIR_ORDER)) != NULL)
-		clear_page(ret);
+		clear_pages(ret, PGDIR_ORDER);
 	return ret;
 }
 
 void pgd_free(pgd_t *pgd)
 {
-	free_page((unsigned long)pgd);
+	free_pages((unsigned long)pgd, PGDIR_ORDER);
 }
 
 pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
--- diff/arch/ppc/platforms/pmac_nvram.c	2004-02-18 08:54:08.000000000 +0000
+++ source/arch/ppc/platforms/pmac_nvram.c	2004-04-21 10:45:33.764570504 +0100
@@ -154,11 +154,11 @@ static unsigned char __pmac pmu_nvram_re
 	struct adb_request req;
 	DECLARE_COMPLETION(req_complete); 
 	
-	req.arg = system_running ? &req_complete : NULL;
+	req.arg = system_state == SYSTEM_RUNNING ? &req_complete : NULL;
 	if (pmu_request(&req, pmu_nvram_complete, 3, PMU_READ_NVRAM,
 			(addr >> 8) & 0xff, addr & 0xff))
 		return 0xff;
-	if (system_running)
+	if (system_state == SYSTEM_RUNNING)
 		wait_for_completion(&req_complete);
 	while (!req.complete)
 		pmu_poll();
@@ -170,11 +170,11 @@ static void __pmac pmu_nvram_write_byte(
 	struct adb_request req;
 	DECLARE_COMPLETION(req_complete); 
 	
-	req.arg = system_running ? &req_complete : NULL;
+	req.arg = system_state == SYSTEM_RUNNING ? &req_complete : NULL;
 	if (pmu_request(&req, pmu_nvram_complete, 4, PMU_WRITE_NVRAM,
 			(addr >> 8) & 0xff, addr & 0xff, val))
 		return;
-	if (system_running)
+	if (system_state == SYSTEM_RUNNING)
 		wait_for_completion(&req_complete);
 	while (!req.complete)
 		pmu_poll();
--- diff/arch/ppc64/Kconfig	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/Kconfig	2004-04-21 10:45:33.765570352 +0100
@@ -248,6 +248,14 @@ source "fs/Kconfig.binfmt"
 
 source "drivers/pci/Kconfig"
 
+config HOTPLUG_CPU
+	bool "Support for hot-pluggable CPUs"
+	depends on SMP && HOTPLUG && EXPERIMENTAL
+	---help---
+	  Say Y here to be able to turn CPUs off and on.
+
+	  Say N if you are unsure.
+
 source "drivers/pcmcia/Kconfig"
 
 source "drivers/pci/hotplug/Kconfig"
--- diff/arch/ppc64/configs/g5_defconfig	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/configs/g5_defconfig	2004-04-21 10:45:33.766570200 +0100
@@ -23,8 +23,10 @@ CONFIG_STANDALONE=y
 #
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
+# CONFIG_POSIX_MQUEUE is not set
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
 CONFIG_LOG_BUF_SHIFT=17
 CONFIG_HOTPLUG=y
 # CONFIG_IKCONFIG is not set
@@ -35,6 +37,7 @@ CONFIG_EPOLL=y
 CONFIG_IOSCHED_NOOP=y
 CONFIG_IOSCHED_AS=y
 CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 
 #
@@ -58,11 +61,11 @@ CONFIG_PPC64=y
 CONFIG_PPC_OF=y
 CONFIG_ALTIVEC=y
 CONFIG_PPC_PMAC=y
-# CONFIG_PMAC_DART is not set
+CONFIG_PMAC_DART=y
 CONFIG_PPC_PMAC64=y
 CONFIG_BOOTX_TEXT=y
 CONFIG_POWER4_ONLY=y
-# CONFIG_IOMMU_VMERGE is not set
+CONFIG_IOMMU_VMERGE=y
 CONFIG_SMP=y
 CONFIG_IRQ_ALL_CPUS=y
 CONFIG_NR_CPUS=2
@@ -80,6 +83,7 @@ CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
+# CONFIG_HOTPLUG_CPU is not set
 
 #
 # PCMCIA/CardBus support
@@ -224,7 +228,7 @@ CONFIG_SCSI_CONSTANTS=y
 #
 # SCSI Transport Attributes
 #
-# CONFIG_SCSI_SPI_ATTRS is not set
+CONFIG_SCSI_SPI_ATTRS=y
 # CONFIG_SCSI_FC_ATTRS is not set
 
 #
@@ -242,6 +246,8 @@ CONFIG_SCSI_SATA=y
 CONFIG_SCSI_SATA_SVW=y
 # CONFIG_SCSI_ATA_PIIX is not set
 # CONFIG_SCSI_SATA_PROMISE is not set
+# CONFIG_SCSI_SATA_SIL is not set
+# CONFIG_SCSI_SATA_SIS is not set
 # CONFIG_SCSI_SATA_VIA is not set
 # CONFIG_SCSI_SATA_VITESSE is not set
 # CONFIG_SCSI_BUSLOGIC is not set
@@ -359,7 +365,6 @@ CONFIG_NET_IPIP=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 CONFIG_SYN_COOKIES=y
 CONFIG_INET_AH=m
 CONFIG_INET_ESP=m
@@ -431,7 +436,6 @@ CONFIG_XFRM=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -498,7 +502,6 @@ CONFIG_E1000=y
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
 # CONFIG_R8169 is not set
-# CONFIG_SIS190 is not set
 # CONFIG_SK98LIN is not set
 CONFIG_TIGON3=m
 
@@ -506,6 +509,7 @@ CONFIG_TIGON3=m
 # Ethernet (10000 Mbit)
 #
 # CONFIG_IXGB is not set
+# CONFIG_S2IO is not set
 # CONFIG_FDDI is not set
 # CONFIG_HIPPI is not set
 # CONFIG_IBMVETH is not set
@@ -675,6 +679,7 @@ CONFIG_I2C_ALGOBIT=y
 # I2C Hardware Bus support
 #
 # CONFIG_I2C_ALI1535 is not set
+# CONFIG_I2C_ALI1563 is not set
 # CONFIG_I2C_ALI15X3 is not set
 # CONFIG_I2C_AMD756 is not set
 # CONFIG_I2C_AMD8111 is not set
@@ -719,6 +724,8 @@ CONFIG_I2C_KEYWEST=y
 # Other I2C Chip support
 #
 # CONFIG_SENSORS_EEPROM is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCF8591 is not set
 # CONFIG_I2C_DEBUG_CORE is not set
 # CONFIG_I2C_DEBUG_ALGO is not set
 # CONFIG_I2C_DEBUG_BUS is not set
@@ -811,6 +818,7 @@ CONFIG_USB_DEVICEFS=y
 #
 CONFIG_USB_EHCI_HCD=y
 # CONFIG_USB_EHCI_SPLIT_ISO is not set
+# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
 CONFIG_USB_OHCI_HCD=y
 # CONFIG_USB_UHCI_HCD is not set
 
@@ -951,6 +959,7 @@ CONFIG_USB_EZUSB=y
 # CONFIG_USB_LEGOTOWER is not set
 # CONFIG_USB_LCD is not set
 # CONFIG_USB_LED is not set
+# CONFIG_USB_CYTHERM is not set
 # CONFIG_USB_TEST is not set
 
 #
@@ -1003,6 +1012,7 @@ CONFIG_VFAT_FS=y
 #
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
+CONFIG_SYSFS=y
 # CONFIG_DEVFS_FS is not set
 CONFIG_DEVPTS_FS_XATTR=y
 # CONFIG_DEVPTS_FS_SECURITY is not set
@@ -1157,9 +1167,9 @@ CONFIG_CRYPTO_SERPENT=m
 CONFIG_CRYPTO_AES=m
 CONFIG_CRYPTO_CAST5=m
 CONFIG_CRYPTO_CAST6=m
-# CONFIG_CRYPTO_ARC4 is not set
+CONFIG_CRYPTO_ARC4=m
 CONFIG_CRYPTO_DEFLATE=m
-# CONFIG_CRYPTO_MICHAEL_MIC is not set
+CONFIG_CRYPTO_MICHAEL_MIC=m
 CONFIG_CRYPTO_TEST=m
 
 #
--- diff/arch/ppc64/configs/pSeries_defconfig	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/configs/pSeries_defconfig	2004-04-21 10:45:33.766570200 +0100
@@ -880,7 +880,6 @@ CONFIG_USB_HIDDEV=y
 # CONFIG_USB_AUERSWALD is not set
 # CONFIG_USB_RIO500 is not set
 # CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_BRLVGER is not set
 # CONFIG_USB_LCD is not set
 # CONFIG_USB_LED is not set
 # CONFIG_USB_TEST is not set
--- diff/arch/ppc64/defconfig	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/defconfig	2004-04-21 10:45:33.767570048 +0100
@@ -880,7 +880,6 @@ CONFIG_USB_HIDDEV=y
 # CONFIG_USB_AUERSWALD is not set
 # CONFIG_USB_RIO500 is not set
 # CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_BRLVGER is not set
 # CONFIG_USB_LCD is not set
 # CONFIG_USB_LED is not set
 # CONFIG_USB_TEST is not set
--- diff/arch/ppc64/kernel/Makefile	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/Makefile	2004-04-21 10:45:33.767570048 +0100
@@ -11,7 +11,7 @@ obj-y               :=	setup.o entry.o t
 			udbg.o binfmt_elf32.o sys_ppc32.o ioctl32.o \
 			ptrace32.o signal32.o rtc.o init_task.o \
 			lmb.o cputable.o cpu_setup_power4.o idle_power4.o \
-			iommu.o
+			iommu.o sysfs.o vio.o
 
 obj-$(CONFIG_PPC_OF) +=	of_device.o
 
@@ -34,7 +34,7 @@ obj-$(CONFIG_PPC_ISERIES) += iSeries_irq
 obj-$(CONFIG_PPC_PSERIES) += pSeries_pci.o pSeries_lpar.o pSeries_hvCall.o \
 			     eeh.o nvram.o pSeries_nvram.o rtasd.o ras.o \
 			     open_pic.o xics.o pSeries_htab.o rtas.o \
-			     chrp_setup.o i8259.o prom.o vio.o pSeries_iommu.o
+			     chrp_setup.o i8259.o prom.o pSeries_iommu.o
 
 obj-$(CONFIG_PROC_FS)		+= proc_ppc64.o
 obj-$(CONFIG_RTAS_FLASH)	+= rtas_flash.o
--- diff/arch/ppc64/kernel/chrp_setup.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/chrp_setup.c	2004-04-21 10:45:33.768569896 +0100
@@ -252,7 +252,7 @@ chrp_init(unsigned long r3, unsigned lon
 
 	ppc_md.setup_arch     = chrp_setup_arch;
 	ppc_md.get_cpuinfo    = chrp_get_cpuinfo;
-	if(naca->interrupt_controller == IC_OPEN_PIC) {
+	if (naca->interrupt_controller == IC_OPEN_PIC) {
 		ppc_md.init_IRQ       = pSeries_init_openpic; 
 		ppc_md.get_irq        = openpic_get_irq;
 	} else {
@@ -267,6 +267,7 @@ chrp_init(unsigned long r3, unsigned lon
 	ppc_md.restart        = rtas_restart;
 	ppc_md.power_off      = rtas_power_off;
 	ppc_md.halt           = rtas_halt;
+	ppc_md.panic          = rtas_os_term;
 
 	ppc_md.get_boot_time  = pSeries_get_boot_time;
 	ppc_md.get_rtc_time   = pSeries_get_rtc_time;
--- diff/arch/ppc64/kernel/cputable.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/ppc64/kernel/cputable.c	2004-04-21 10:45:33.768569896 +0100
@@ -48,7 +48,7 @@ struct cpu_spec	cpu_specs[] = {
     {	/* Power3 */
 	    0xffff0000, 0x00400000, "POWER3 (630)",
 	    CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
-		    CPU_FTR_DABR | CPU_FTR_IABR,
+		    CPU_FTR_IABR | CPU_FTR_PMC8,
 	    COMMON_USER_PPC64,
 	    128, 128,
 	    __setup_cpu_power3,
@@ -57,7 +57,7 @@ struct cpu_spec	cpu_specs[] = {
     {	/* Power3+ */
 	    0xffff0000, 0x00410000, "POWER3 (630+)",
 	    CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
-		    CPU_FTR_DABR | CPU_FTR_IABR,
+		    CPU_FTR_IABR | CPU_FTR_PMC8,
 	    COMMON_USER_PPC64,
 	    128, 128,
 	    __setup_cpu_power3,
@@ -66,7 +66,7 @@ struct cpu_spec	cpu_specs[] = {
     {	/* Northstar */
 	    0xffff0000, 0x00330000, "RS64-II (northstar)",
 	    CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
-		    CPU_FTR_DABR | CPU_FTR_IABR,
+		    CPU_FTR_IABR | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
 	    COMMON_USER_PPC64,
 	    128, 128,
 	    __setup_cpu_power3,
@@ -75,7 +75,7 @@ struct cpu_spec	cpu_specs[] = {
     {	/* Pulsar */
 	    0xffff0000, 0x00340000, "RS64-III (pulsar)",
 	    CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
-		    CPU_FTR_DABR | CPU_FTR_IABR,
+		    CPU_FTR_IABR | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
 	    COMMON_USER_PPC64,
 	    128, 128,
 	    __setup_cpu_power3,
@@ -84,7 +84,7 @@ struct cpu_spec	cpu_specs[] = {
     {	/* I-star */
 	    0xffff0000, 0x00360000, "RS64-III (icestar)",
 	    CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
-		    CPU_FTR_DABR | CPU_FTR_IABR,
+		    CPU_FTR_IABR | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
 	    COMMON_USER_PPC64,
 	    128, 128,
 	    __setup_cpu_power3,
@@ -93,7 +93,7 @@ struct cpu_spec	cpu_specs[] = {
     {	/* S-star */
 	    0xffff0000, 0x00370000, "RS64-IV (sstar)",
 	    CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
-		    CPU_FTR_DABR | CPU_FTR_IABR,
+		    CPU_FTR_IABR | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
 	    COMMON_USER_PPC64,
 	    128, 128,
 	    __setup_cpu_power3,
@@ -102,7 +102,7 @@ struct cpu_spec	cpu_specs[] = {
     {	/* Power4 */
 	    0xffff0000, 0x00350000, "POWER4 (gp)",
 	    CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
-	    CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_DABR,
+		    CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
 	    COMMON_USER_PPC64,
 	    128, 128,
 	    __setup_cpu_power4,
@@ -111,7 +111,7 @@ struct cpu_spec	cpu_specs[] = {
     {	/* Power4+ */
 	    0xffff0000, 0x00380000, "POWER4+ (gq)",
 	    CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
-	    CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_DABR,
+		    CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
 	    COMMON_USER_PPC64,
 	    128, 128,
 	    __setup_cpu_power4,
@@ -120,7 +120,8 @@ struct cpu_spec	cpu_specs[] = {
     {	/* PPC970 */
 	    0xffff0000, 0x00390000, "PPC970",
 	    CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
-	    CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_CAN_NAP,
+		    CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP |
+		    CPU_FTR_CAN_NAP | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
 	    COMMON_USER_PPC64 | PPC_FEATURE_HAS_ALTIVEC_COMP,
 	    128, 128,
 	    __setup_cpu_ppc970,
@@ -129,7 +130,8 @@ struct cpu_spec	cpu_specs[] = {
     {	/* PPC970FX */
 	    0xffff0000, 0x003c0000, "PPC970FX",
 	    CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
-	    CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_CAN_NAP,
+		    CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP |
+		    CPU_FTR_CAN_NAP | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
 	    COMMON_USER_PPC64 | PPC_FEATURE_HAS_ALTIVEC_COMP,
 	    128, 128,
 	    __setup_cpu_ppc970,
@@ -138,7 +140,18 @@ struct cpu_spec	cpu_specs[] = {
     {	/* Power5 */
 	    0xffff0000, 0x003a0000, "POWER5 (gr)",
 	    CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
-	    CPU_FTR_PPCAS_ARCH_V2,
+		    CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA | CPU_FTR_SMT |
+		    CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE,
+	    COMMON_USER_PPC64,
+	    128, 128,
+	    __setup_cpu_power4,
+	    COMMON_PPC64_FW
+    },
+    {	/* Power5 */
+	    0xffff0000, 0x003b0000, "POWER5 (gs)",
+	    CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
+		    CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA | CPU_FTR_SMT |
+		    CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE,
 	    COMMON_USER_PPC64,
 	    128, 128,
 	    __setup_cpu_power4,
@@ -147,7 +160,7 @@ struct cpu_spec	cpu_specs[] = {
     {	/* default match */
 	    0x00000000, 0x00000000, "POWER4 (compatible)",
   	    CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
-	    CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_DABR,
+		    CPU_FTR_PPCAS_ARCH_V2,
 	    COMMON_USER_PPC64,
 	    128, 128,
 	    __setup_cpu_power4,
--- diff/arch/ppc64/kernel/dma.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/dma.c	2004-04-21 10:45:33.769569744 +0100
@@ -5,14 +5,11 @@
  * the pci and vio busses
  */
 
-#include <linux/config.h>
 #include <linux/device.h>
 #include <linux/dma-mapping.h>
 /* Include the busses we support */
 #include <linux/pci.h>
-#ifdef CONFIG_PPC_PSERIES
 #include <asm/vio.h>
-#endif
 #include <asm/scatterlist.h>
 #include <asm/bug.h>
 
@@ -20,10 +17,8 @@ int dma_supported(struct device *dev, u6
 {
 	if (dev->bus == &pci_bus_type)
 		return pci_dma_supported(to_pci_dev(dev), mask);
-#ifdef CONFIG_PPC_PSERIES
 	if (dev->bus == &vio_bus_type)
 		return vio_dma_supported(to_vio_dev(dev), mask);
-#endif
 	BUG();
 	return 0;
 }
@@ -33,10 +28,8 @@ int dma_set_mask(struct device *dev, u64
 {
 	if (dev->bus == &pci_bus_type)
 		return pci_set_dma_mask(to_pci_dev(dev), dma_mask);
-#ifdef CONFIG_PPC_PSERIES
 	if (dev->bus == &vio_bus_type)
 		return vio_set_dma_mask(to_vio_dev(dev), dma_mask);
-#endif
 	BUG();
 	return 0;
 }
@@ -47,10 +40,8 @@ void *dma_alloc_coherent(struct device *
 {
 	if (dev->bus == &pci_bus_type)
 		return pci_alloc_consistent(to_pci_dev(dev), size, dma_handle);
-#ifdef CONFIG_PPC_PSERIES
 	if (dev->bus == &vio_bus_type)
 		return vio_alloc_consistent(to_vio_dev(dev), size, dma_handle);
-#endif
 	BUG();
 	return 0;
 }
@@ -61,10 +52,8 @@ void dma_free_coherent(struct device *de
 {
 	if (dev->bus == &pci_bus_type)
 		pci_free_consistent(to_pci_dev(dev), size, cpu_addr, dma_handle);
-#ifdef CONFIG_PPC_PSERIES
 	else if (dev->bus == &vio_bus_type)
 		vio_free_consistent(to_vio_dev(dev), size, cpu_addr, dma_handle);
-#endif
 	else
 		BUG();
 }
@@ -75,10 +64,8 @@ dma_addr_t dma_map_single(struct device 
 {
 	if (dev->bus == &pci_bus_type)
 		return pci_map_single(to_pci_dev(dev), cpu_addr, size, (int)direction);
-#ifdef CONFIG_PPC_PSERIES
 	if (dev->bus == &vio_bus_type)
-		return vio_map_single(to_vio_dev(dev), cpu_addr, size, (int)direction);
-#endif
+		return vio_map_single(to_vio_dev(dev), cpu_addr, size, direction);
 	BUG();
 	return (dma_addr_t)0;
 }
@@ -89,10 +76,8 @@ void dma_unmap_single(struct device *dev
 {
 	if (dev->bus == &pci_bus_type)
 		pci_unmap_single(to_pci_dev(dev), dma_addr, size, (int)direction);
-#ifdef CONFIG_PPC_PSERIES
 	else if (dev->bus == &vio_bus_type)
-		vio_unmap_single(to_vio_dev(dev), dma_addr, size, (int)direction);
-#endif
+		vio_unmap_single(to_vio_dev(dev), dma_addr, size, direction);
 	else
 		BUG();
 }
@@ -104,10 +89,8 @@ dma_addr_t dma_map_page(struct device *d
 {
 	if (dev->bus == &pci_bus_type)
 		return pci_map_page(to_pci_dev(dev), page, offset, size, (int)direction);
-#ifdef CONFIG_PPC_PSERIES
 	if (dev->bus == &vio_bus_type)
-		return vio_map_page(to_vio_dev(dev), page, offset, size, (int)direction);
-#endif
+		return vio_map_page(to_vio_dev(dev), page, offset, size, direction);
 	BUG();
 	return (dma_addr_t)0;
 }
@@ -118,10 +101,8 @@ void dma_unmap_page(struct device *dev, 
 {
 	if (dev->bus == &pci_bus_type)
 		pci_unmap_page(to_pci_dev(dev), dma_address, size, (int)direction);
-#ifdef CONFIG_PPC_PSERIES
 	else if (dev->bus == &vio_bus_type)
-		vio_unmap_page(to_vio_dev(dev), dma_address, size, (int)direction);
-#endif
+		vio_unmap_page(to_vio_dev(dev), dma_address, size, direction);
 	else
 		BUG();
 }
@@ -132,10 +113,8 @@ int dma_map_sg(struct device *dev, struc
 {
 	if (dev->bus == &pci_bus_type)
 		return pci_map_sg(to_pci_dev(dev), sg, nents, (int)direction);
-#ifdef CONFIG_PPC_PSERIES
 	if (dev->bus == &vio_bus_type)
-		return vio_map_sg(to_vio_dev(dev), sg, nents, (int)direction);
-#endif
+		return vio_map_sg(to_vio_dev(dev), sg, nents, direction);
 	BUG();
 	return 0;
 }
@@ -146,39 +125,9 @@ void dma_unmap_sg(struct device *dev, st
 {
 	if (dev->bus == &pci_bus_type)
 		pci_unmap_sg(to_pci_dev(dev), sg, nhwentries, (int)direction);
-#ifdef CONFIG_PPC_PSERIES
 	else if (dev->bus == &vio_bus_type)
-		vio_unmap_sg(to_vio_dev(dev), sg, nhwentries, (int)direction);
-#endif
+		vio_unmap_sg(to_vio_dev(dev), sg, nhwentries, direction);
 	else
 		BUG();
 }
 EXPORT_SYMBOL(dma_unmap_sg);
-
-void dma_sync_single(struct device *dev, dma_addr_t dma_handle, size_t size,
-		enum dma_data_direction direction)
-{
-	if (dev->bus == &pci_bus_type)
-		pci_dma_sync_single(to_pci_dev(dev), dma_handle, size, (int)direction);
-#ifdef CONFIG_PPC_PSERIES
-	else if (dev->bus == &vio_bus_type)
-		vio_dma_sync_single(to_vio_dev(dev), dma_handle, size, (int)direction);
-#endif
-	else
-		BUG();
-}
-EXPORT_SYMBOL(dma_sync_single);
-
-void dma_sync_sg(struct device *dev, struct scatterlist *sg, int nelems,
-		enum dma_data_direction direction)
-{
-	if (dev->bus == &pci_bus_type)
-		pci_dma_sync_sg(to_pci_dev(dev), sg, nelems, (int)direction);
-#ifdef CONFIG_PPC_PSERIES
-	else if (dev->bus == &vio_bus_type)
-		vio_dma_sync_sg(to_vio_dev(dev), sg, nelems, (int)direction);
-#endif
-	else
-		BUG();
-}
-EXPORT_SYMBOL(dma_sync_sg);
--- diff/arch/ppc64/kernel/eeh.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/eeh.c	2004-04-21 10:45:33.769569744 +0100
@@ -395,6 +395,12 @@ unsigned long eeh_check_failure(void *to
 		return val;
 	}
 
+        /* Make sure we aren't ISA */
+        if (!strcmp(dn->type, "isa")) {
+                pci_dev_put(dev);
+                return val;
+        }
+
 	if (!dn->eeh_config_addr) {
 		pci_dev_put(dev);
 		return val;
--- diff/arch/ppc64/kernel/entry.S	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/entry.S	2004-04-21 10:45:33.770569592 +0100
@@ -95,7 +95,7 @@ _GLOBAL(DoSyscall)
 #endif /* SHOW_SYSCALLS */
 	clrrdi	r10,r1,THREAD_SHIFT
 	ld	r10,TI_FLAGS(r10)
-	andi.	r11,r10,_TIF_SYSCALL_TRACE
+	andi.	r11,r10,_TIF_SYSCALL_T_OR_A
 	bne-	50f
 	cmpli	0,r0,NR_syscalls
 	bge-	66f
@@ -151,7 +151,8 @@ _GLOBAL(ret_from_syscall_1)
 	b	22b
         
 /* Traced system call support */
-50:	bl	.do_syscall_trace
+50:	addi	r3,r1,STACK_FRAME_OVERHEAD
+	bl	.do_syscall_trace_enter
 	ld	r0,GPR0(r1)	/* Restore original registers */
 	ld	r3,GPR3(r1)
 	ld	r4,GPR4(r1)
@@ -201,7 +202,7 @@ _GLOBAL(ret_from_syscall_2)
 	oris	r10,r10,0x1000
 	std	r10,_CCR(r1)
 60:	std	r3,GPR3(r1)	/* Update return value */
-	bl	.do_syscall_trace
+	bl	.do_syscall_trace_leave
 	b	.ret_from_except
 66:	li	r3,ENOSYS
 	b	57b
@@ -234,14 +235,14 @@ _GLOBAL(ppc64_rt_sigreturn)
 
 80:	clrrdi	r4,r1,THREAD_SHIFT
 	ld	r4,TI_FLAGS(r4)
-	andi.	r4,r4,_TIF_SYSCALL_TRACE
+	andi.	r4,r4,_TIF_SYSCALL_T_OR_A
 	bne-	81f
 	cmpi	0,r3,0
 	bge	.ret_from_except
 	b	.ret_from_syscall_1
 81:	cmpi	0,r3,0
 	blt	.ret_from_syscall_2
-	bl	.do_syscall_trace
+	bl	.do_syscall_trace_leave
 	b	.ret_from_except
 
 /*
@@ -352,9 +353,9 @@ _GLOBAL(ret_from_fork)
 	bl	.schedule_tail
 	clrrdi	r4,r1,THREAD_SHIFT
 	ld	r4,TI_FLAGS(r4)
-	andi.	r4,r4,_TIF_SYSCALL_TRACE
+	andi.	r4,r4,_TIF_SYSCALL_T_OR_A
 	beq+	.ret_from_except
-	bl	.do_syscall_trace
+	bl	.do_syscall_trace_leave
 	b	.ret_from_except
 
 _GLOBAL(ret_from_except)
@@ -468,6 +469,7 @@ do_work:
 	b	.ret_from_except
 
 unrecov_restore:
+	mfspr   r13,SPRG3
 	addi	r3,r1,STACK_FRAME_OVERHEAD
 	bl	.unrecoverable_exception
 	b	unrecov_restore
@@ -485,7 +487,7 @@ _GLOBAL(enter_rtas)
 	mflr	r0
 	std	r0,16(r1)
         stdu	r1,-RTAS_FRAME_SIZE(r1)	/* Save SP and create stack space. */
-
+	
 	/* Because RTAS is running in 32b mode, it clobbers the high order half
 	 * of all registers that it saves.  We therefore save those registers
 	 * RTAS might touch to the stack.  (r0, r3-r13 are caller saved)
@@ -510,12 +512,25 @@ _GLOBAL(enter_rtas)
 	mfsrr1	r10
 	std	r10,_SRR1(r1)
 
+	/* There is no way it is acceptable to get here with interrupts enabled,
+	 * check it with the asm equivalent of WARN_ON
+	 */
+	mfmsr	r6
+	andi.	r0,r6,MSR_EE
+1:	tdnei	r0,0
+.section __bug_table,"a"
+	.llong	1b,__LINE__ + 0x1000000, 1f, 2f
+.previous
+.section .rodata,"a"
+1:	.asciz	__FILE__
+2:	.asciz "enter_rtas"
+.previous
+	
 	/* Unfortunately, the stack pointer and the MSR are also clobbered,
 	 * so they are saved in the PACA which allows us to restore
 	 * our original state after RTAS returns.
          */
 	std	r1,PACAR1(r13)
-	mfmsr	r6
         std	r6,PACASAVEDMSR(r13)
 
 	/* Setup our real return addr */	
--- diff/arch/ppc64/kernel/head.S	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/head.S	2004-04-21 10:45:33.771569440 +0100
@@ -93,8 +93,13 @@
 _stext:
 #ifdef CONFIG_PPC_PSERIES
 _STATIC(__start)
+	/* NOP this out unconditionally */
+BEGIN_FTR_SECTION
 	b .__start_initialization_pSeries
+END_FTR_SECTION(0, 1)
 #endif
+	/* Catch branch to 0 in real mode */
+	trap
 #ifdef CONFIG_PPC_ISERIES
 	/*
 	 * At offset 0x20, there is a pointer to iSeries LPAR data.
@@ -767,6 +772,7 @@ DataAccessSLB_common:
 	beq     fast_exception_return   /* Return if we succeeded */
 	addi	r3,r1,STACK_FRAME_OVERHEAD
 	DO_COPY_EE()
+	ld      r4,_DAR(r1)
 	li	r6,0x380
 	li	r5,0
 	bl      .save_remaining_regs
@@ -810,6 +816,7 @@ InstructionAccessSLB_common:
 
 	addi	r3,r1,STACK_FRAME_OVERHEAD
 	DO_COPY_EE()
+	mr      r4,r22                  /* SRR0 = NIA        */
 	li	r6,0x480
 	li	r5,0
 	bl      .save_remaining_regs
--- diff/arch/ppc64/kernel/i8259.c	2003-02-26 16:01:01.000000000 +0000
+++ source/arch/ppc64/kernel/i8259.c	2004-04-21 10:45:33.771569440 +0100
@@ -124,8 +124,8 @@ static void i8259_unmask_irq(unsigned in
 
 static void i8259_end_irq(unsigned int irq)
 {
-	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)) &&
-	    irq_desc[irq].action)
+	if (!(get_irq_desc(irq)->status & (IRQ_DISABLED|IRQ_INPROGRESS)) &&
+	    get_irq_desc(irq)->action)
 		i8259_unmask_irq(irq);
 }
 
--- diff/arch/ppc64/kernel/iSeries_iommu.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/iSeries_iommu.c	2004-04-21 10:45:33.772569288 +0100
@@ -2,24 +2,24 @@
  * arch/ppc64/kernel/iSeries_iommu.c
  *
  * Copyright (C) 2001 Mike Corrigan & Dave Engebretsen, IBM Corporation
- * 
- * Rewrite, cleanup: 
+ *
+ * Rewrite, cleanup:
  *
  * Copyright (C) 2004 Olof Johansson <olof@austin.ibm.com>, IBM Corporation
  *
  * Dynamic DMA mapping support, iSeries-specific parts.
  *
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
@@ -33,6 +33,7 @@
 #include <linux/spinlock.h>
 #include <linux/string.h>
 #include <linux/pci.h>
+#include <linux/dma-mapping.h>
 #include <asm/io.h>
 #include <asm/prom.h>
 #include <asm/rtas.h>
@@ -43,37 +44,21 @@
 #include <asm/iommu.h>
 #include <asm/pci-bridge.h>
 #include <asm/iSeries/iSeries_pci.h>
-#include <asm/iSeries/vio.h>
 
 #include <asm/machdep.h>
 
 #include "pci.h"
 
 
-static struct iommu_table veth_iommu_table;	/* Tce table for virtual ethernet */
-static struct iommu_table vio_iommu_table;	/* Tce table for virtual I/O */
-
-static struct iSeries_Device_Node veth_dev_node = { .LogicalSlot = 0xFF, .iommu_table = &veth_iommu_table };
-static struct iSeries_Device_Node vio_dev_node  = { .LogicalSlot = 0xFF, .iommu_table = &vio_iommu_table };
-
-static struct pci_dev _veth_dev = { .sysdata = &veth_dev_node };
-static struct pci_dev _vio_dev  = { .sysdata = &vio_dev_node, .dev.bus = &pci_bus_type  };
-
-struct pci_dev *iSeries_veth_dev = &_veth_dev;
-struct device *iSeries_vio_dev = &_vio_dev.dev;
-
-EXPORT_SYMBOL(iSeries_veth_dev);
-EXPORT_SYMBOL(iSeries_vio_dev);
-
 extern struct list_head iSeries_Global_Device_List;
 
 
 static void tce_build_iSeries(struct iommu_table *tbl, long index, long npages,
-			      unsigned long uaddr, int direction)
+		unsigned long uaddr, enum dma_data_direction direction)
 {
 	u64 rc;
 	union tce_entry tce;
-	
+
 	while (npages--) {
 		tce.te_word = 0;
 		tce.te_bits.tb_rpn = virt_to_abs(uaddr) >> PAGE_SHIFT;
@@ -82,17 +67,17 @@ static void tce_build_iSeries(struct iom
 			/* Virtual Bus */
 			tce.te_bits.tb_valid = 1;
 			tce.te_bits.tb_allio = 1;
-			if (direction != PCI_DMA_TODEVICE)
+			if (direction != DMA_TO_DEVICE)
 				tce.te_bits.tb_rdwr = 1;
 		} else {
 			/* PCI Bus */
 			tce.te_bits.tb_rdwr = 1; /* Read allowed */
-			if (direction != PCI_DMA_TODEVICE)
+			if (direction != DMA_TO_DEVICE)
 				tce.te_bits.tb_pciwr = 1;
 		}
-		
-		rc = HvCallXm_setTce((u64)tbl->it_index, 
-				     (u64)index, 
+
+		rc = HvCallXm_setTce((u64)tbl->it_index,
+				     (u64)index,
 				     tce.te_word);
 		if (rc)
 			panic("PCI_DMA: HvCallXm_setTce failed, Rc: 0x%lx\n", rc);
@@ -113,7 +98,7 @@ static void tce_free_iSeries(struct iomm
 				     (u64)index,
 				     tce.te_word);
 
-		if (rc) 
+		if (rc)
 			panic("PCI_DMA: HvCallXm_setTce failed, Rc: 0x%lx\n", rc);
 
 		index++;
@@ -121,50 +106,10 @@ static void tce_free_iSeries(struct iomm
 
 }
 
-void __init iommu_vio_init(void)
-{
-	struct iommu_table *t;
-	struct iommu_table_cb cb;
-	unsigned long cbp;
-
-	cb.itc_busno = 255;    /* Bus 255 is the virtual bus */
-	cb.itc_virtbus = 0xff; /* Ask for virtual bus */
-	
-	cbp = virt_to_abs(&cb);
-	HvCallXm_getTceTableParms(cbp);
-	
-	veth_iommu_table.it_size        = cb.itc_size / 2;
-	veth_iommu_table.it_busno       = cb.itc_busno;
-	veth_iommu_table.it_offset      = cb.itc_offset;
-	veth_iommu_table.it_index       = cb.itc_index;
-	veth_iommu_table.it_type        = TCE_VB;
-	veth_iommu_table.it_entrysize	= sizeof(union tce_entry);
-	veth_iommu_table.it_blocksize	= 1;
-
-	t = iommu_init_table(&veth_iommu_table);
-
-	if (!t)
-		printk("Virtual Bus VETH TCE table failed.\n");
-
-	vio_iommu_table.it_size         = cb.itc_size - veth_iommu_table.it_size;
-	vio_iommu_table.it_busno        = cb.itc_busno;
-	vio_iommu_table.it_offset       = cb.itc_offset +
-		veth_iommu_table.it_size * (PAGE_SIZE/sizeof(union tce_entry));
-	vio_iommu_table.it_index        = cb.itc_index;
-	vio_iommu_table.it_type         = TCE_VB; 
-	vio_iommu_table.it_entrysize	= sizeof(union tce_entry);
-	vio_iommu_table.it_blocksize	= 1;
-
-	t = iommu_init_table(&vio_iommu_table);
-
-	if (!t) 
-		printk("Virtual Bus VIO TCE table failed.\n");
-}
-
 
 /*
  * This function compares the known tables to find an iommu_table
- * that has already been built for hardware TCEs.                          
+ * that has already been built for hardware TCEs.
  */
 static struct iommu_table *iommu_table_find(struct iommu_table * tbl)
 {
@@ -172,26 +117,26 @@ static struct iommu_table *iommu_table_f
 
 	for (dp =  (struct iSeries_Device_Node *)iSeries_Global_Device_List.next;
 	     dp != (struct iSeries_Device_Node *)&iSeries_Global_Device_List;
-	     dp =  (struct iSeries_Device_Node *)dp->Device_List.next) 
+	     dp =  (struct iSeries_Device_Node *)dp->Device_List.next)
 		if (dp->iommu_table                 != NULL &&
 		    dp->iommu_table->it_type        == TCE_PCI &&
 		    dp->iommu_table->it_offset      == tbl->it_offset &&
 		    dp->iommu_table->it_index       == tbl->it_index &&
-		    dp->iommu_table->it_size        == tbl->it_size) 
+		    dp->iommu_table->it_size        == tbl->it_size)
 			return dp->iommu_table;
-			
+
 
 	return NULL;
 }
 
 /*
  * Call Hv with the architected data structure to get TCE table info.
- * info. Put the returned data into the Linux representation of the   
- * TCE table data.                                                     
- * The Hardware Tce table comes in three flavors.                     
- * 1. TCE table shared between Buses.                                  
- * 2. TCE table per Bus.                                               
- * 3. TCE Table per IOA.                                               
+ * info. Put the returned data into the Linux representation of the
+ * TCE table data.
+ * The Hardware Tce table comes in three flavors.
+ * 1. TCE table shared between Buses.
+ * 2. TCE table per Bus.
+ * 3. TCE Table per IOA.
  */
 static void iommu_table_getparms(struct iSeries_Device_Node* dn,
 				 struct iommu_table* tbl)
@@ -200,7 +145,7 @@ static void iommu_table_getparms(struct 
 
 	parms = (struct iommu_table_cb*)kmalloc(sizeof(*parms), GFP_KERNEL);
 
-	if (parms == NULL) 
+	if (parms == NULL)
 		panic("PCI_DMA: TCE Table Allocation failed.");
 
 	memset(parms, 0, sizeof(*parms));
--- diff/arch/ppc64/kernel/iSeries_irq.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/ppc64/kernel/iSeries_irq.c	2004-04-21 10:45:33.772569288 +0100
@@ -122,8 +122,8 @@ void __init iSeries_activate_IRQs()
 	int irq;
 	unsigned long flags;
 
-	for (irq = 0; irq < NR_IRQS; irq++) {
-		irq_desc_t *desc = &irq_desc[irq];
+	for_each_irq (irq) {
+		irq_desc_t *desc = get_irq_desc(irq);
 
 		if (desc && desc->handler && desc->handler->startup) {
 			spin_lock_irqsave(&desc->lock, flags);
--- diff/arch/ppc64/kernel/iSeries_setup.h	2004-02-09 10:36:08.000000000 +0000
+++ source/arch/ppc64/kernel/iSeries_setup.h	2004-04-21 10:45:33.772569288 +0100
@@ -19,8 +19,6 @@
 #ifndef	__ISERIES_SETUP_H__
 #define	__ISERIES_SETUP_H__
 
-#include <linux/irq.h>		/* for irq_desc_t */
-
 extern void iSeries_init_early(void);
 extern void iSeries_init(unsigned long r3, unsigned long ird_start,
 		unsigned long ird_end, unsigned long cline_start,
@@ -29,7 +27,6 @@ extern void iSeries_setup_arch(void);
 extern void iSeries_setup_residual(struct seq_file *m, int cpu_id);
 extern void iSeries_get_cpuinfo(struct seq_file *m);
 extern void iSeries_init_IRQ(void);
-extern void iSeries_init_irq_desc(irq_desc_t *);
 extern int iSeries_get_irq(struct pt_regs *regs);
 extern void iSeries_restart(char *cmd);
 extern void iSeries_power_off(void);
--- diff/arch/ppc64/kernel/idle.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/idle.c	2004-04-21 10:45:33.773569136 +0100
@@ -26,6 +26,7 @@
 #include <linux/unistd.h>
 #include <linux/slab.h>
 #include <linux/interrupt.h>
+#include <linux/cpu.h>
 
 #include <asm/pgtable.h>
 #include <asm/uaccess.h>
@@ -150,17 +151,24 @@ int default_idle(void)
 		}
 
 		schedule();
+		if (cpu_is_offline(smp_processor_id()) &&
+				system_state == SYSTEM_RUNNING)
+			cpu_die();
 	}
 
 	return 0;
 }
 
 #ifdef CONFIG_PPC_PSERIES
+
+DECLARE_PER_CPU(unsigned long, smt_snooze_delay);
+
 int dedicated_idle(void)
 {
 	long oldval;
 	struct paca_struct *lpaca = get_paca(), *ppaca;
 	unsigned long start_snooze;
+	unsigned long *smt_snooze_delay = &__get_cpu_var(smt_snooze_delay);
 
 	ppaca = &paca[smp_processor_id() ^ 1];
 
@@ -173,14 +181,14 @@ int dedicated_idle(void)
 		if (!oldval) {
 			set_thread_flag(TIF_POLLING_NRFLAG);
 			start_snooze = __get_tb() +
-				naca->smt_snooze_delay*tb_ticks_per_usec;
+				*smt_snooze_delay * tb_ticks_per_usec;
 			while (!need_resched()) {
 				/* need_resched could be 1 or 0 at this 
 				 * point.  If it is 0, set it to 0, so
 				 * an IPI/Prod is sent.  If it is 1, keep
 				 * it that way & schedule work.
 				 */
-				if (naca->smt_snooze_delay == 0 ||
+				if (*smt_snooze_delay == 0 ||
 				    __get_tb() < start_snooze) {
 					HMT_low(); /* Low thread priority */
 					continue;
@@ -236,6 +244,9 @@ int dedicated_idle(void)
 		HMT_medium();
 		lpaca->xLpPaca.xIdle = 0;
 		schedule();
+		if (cpu_is_offline(smp_processor_id()) &&
+				system_state == SYSTEM_RUNNING)
+			cpu_die();
 	}
 	return 0;
 }
@@ -245,6 +256,10 @@ int shared_idle(void)
 	struct paca_struct *lpaca = get_paca();
 
 	while (1) {
+		if (cpu_is_offline(smp_processor_id()) &&
+				system_state == SYSTEM_RUNNING)
+			cpu_die();
+
 		/* Indicate to the HV that we are idle.  Now would be
 		 * a good time to find other work to dispatch. */
 		lpaca->xLpPaca.xIdle = 1;
--- diff/arch/ppc64/kernel/iommu.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/iommu.c	2004-04-21 10:45:33.773569136 +0100
@@ -31,7 +31,6 @@
 #include <linux/mm.h>
 #include <linux/spinlock.h>
 #include <linux/string.h>
-#include <linux/pci.h>
 #include <linux/dma-mapping.h>
 #include <linux/init.h>
 #include <asm/io.h>
@@ -141,8 +140,8 @@ static unsigned long iommu_range_alloc(s
 	return n;
 }
 
-dma_addr_t iommu_alloc(struct iommu_table *tbl, void *page,
-		       unsigned int npages, int direction)
+static dma_addr_t iommu_alloc(struct iommu_table *tbl, void *page,
+		       unsigned int npages, enum dma_data_direction direction)
 {
 	unsigned long entry, flags;
 	dma_addr_t ret = DMA_ERROR_CODE;
@@ -207,7 +206,7 @@ static void __iommu_free(struct iommu_ta
 		__clear_bit(free_entry+i, tbl->it_map);
 }
 
-void iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr, 
+static void iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr,
 		unsigned int npages)
 {
 	unsigned long flags;
@@ -226,8 +225,9 @@ void iommu_free(struct iommu_table *tbl,
 	spin_unlock_irqrestore(&(tbl->it_lock), flags);
 }
 
-int iommu_alloc_sg(struct iommu_table *tbl, struct device *dev,
-		   struct scatterlist *sglist, int nelems, int direction)
+int iommu_map_sg(struct device *dev, struct iommu_table *tbl,
+		struct scatterlist *sglist, int nelems,
+		enum dma_data_direction direction)
 {
 	dma_addr_t dma_next, dma_addr;
 	unsigned long flags;
@@ -235,6 +235,11 @@ int iommu_alloc_sg(struct iommu_table *t
 	int outcount;
 	unsigned long handle;
 
+	BUG_ON(direction == DMA_NONE);
+
+	if ((nelems == 0) || !tbl)
+		return 0;
+
 	outs = s = segstart = &sglist[0];
 	outcount = 1;
 	handle = 0;
@@ -349,11 +354,16 @@ int iommu_alloc_sg(struct iommu_table *t
 }
 
 
-void iommu_free_sg(struct iommu_table *tbl, struct scatterlist *sglist,
-		   int nelems)
+void iommu_unmap_sg(struct iommu_table *tbl, struct scatterlist *sglist,
+		int nelems, enum dma_data_direction direction)
 {
 	unsigned long flags;
 
+	BUG_ON(direction == DMA_NONE);
+
+	if (!tbl)
+		return;
+
 	spin_lock_irqsave(&(tbl->it_lock), flags);
 
 	while (nelems--) {
@@ -414,3 +424,104 @@ struct iommu_table *iommu_init_table(str
 
 	return tbl;
 }
+
+/* Creates TCEs for a user provided buffer.  The user buffer must be
+ * contiguous real kernel storage (not vmalloc).  The address of the buffer
+ * passed here is the kernel (virtual) address of the buffer.  The buffer
+ * need not be page aligned, the dma_addr_t returned will point to the same
+ * byte within the page as vaddr.
+ */
+dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr,
+		size_t size, enum dma_data_direction direction)
+{
+	dma_addr_t dma_handle = DMA_ERROR_CODE;
+	unsigned long uaddr;
+	unsigned int npages;
+
+	BUG_ON(direction == DMA_NONE);
+
+	uaddr = (unsigned long)vaddr;
+	npages = PAGE_ALIGN(uaddr + size) - (uaddr & PAGE_MASK);
+	npages >>= PAGE_SHIFT;
+
+	if (tbl) {
+		dma_handle = iommu_alloc(tbl, vaddr, npages, direction);
+		if (dma_handle == DMA_ERROR_CODE) {
+			if (printk_ratelimit())  {
+				printk(KERN_INFO "iommu_alloc failed, "
+						"tbl %p vaddr %p npages %d\n",
+						tbl, vaddr, npages);
+			}
+		} else
+			dma_handle |= (uaddr & ~PAGE_MASK);
+	}
+
+	return dma_handle;
+}
+
+void iommu_unmap_single(struct iommu_table *tbl, dma_addr_t dma_handle,
+		size_t size, enum dma_data_direction direction)
+{
+	BUG_ON(direction == DMA_NONE);
+
+	if (tbl)
+		iommu_free(tbl, dma_handle, (PAGE_ALIGN(dma_handle + size) -
+					(dma_handle & PAGE_MASK)) >> PAGE_SHIFT);
+}
+
+/* Allocates a contiguous real buffer and creates mappings over it.
+ * Returns the virtual address of the buffer and sets dma_handle
+ * to the dma address (mapping) of the first page.
+ */
+void *iommu_alloc_consistent(struct iommu_table *tbl, size_t size,
+		dma_addr_t *dma_handle)
+{
+	void *ret = NULL;
+	dma_addr_t mapping;
+	unsigned int npages, order;
+
+	size = PAGE_ALIGN(size);
+	npages = size >> PAGE_SHIFT;
+	order = get_order(size);
+
+ 	/*
+	 * Client asked for way too much space.  This is checked later
+	 * anyway.  It is easier to debug here for the drivers than in
+	 * the tce tables.
+	 */
+	if (order >= IOMAP_MAX_ORDER) {
+		printk("iommu_alloc_consistent size too large: 0x%lx\n", size);
+		return (void *)DMA_ERROR_CODE;
+	}
+
+	if (!tbl)
+		return NULL;
+
+	/* Alloc enough pages (and possibly more) */
+	ret = (void *)__get_free_pages(GFP_ATOMIC, order);
+	if (!ret)
+		return NULL;
+	memset(ret, 0, size);
+
+	/* Set up tces to cover the allocated range */
+	mapping = iommu_alloc(tbl, ret, npages, DMA_BIDIRECTIONAL);
+	if (mapping == DMA_ERROR_CODE) {
+		free_pages((unsigned long)ret, order);
+		ret = NULL;
+	} else
+		*dma_handle = mapping;
+	return ret;
+}
+
+void iommu_free_consistent(struct iommu_table *tbl, size_t size,
+			 void *vaddr, dma_addr_t dma_handle)
+{
+	unsigned int npages;
+
+	if (tbl) {
+		size = PAGE_ALIGN(size);
+		npages = size >> PAGE_SHIFT;
+		iommu_free(tbl, dma_handle, npages);
+		free_pages((unsigned long)vaddr, get_order(size));
+	}
+}
--- diff/arch/ppc64/kernel/irq.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/irq.c	2004-04-21 10:45:33.774568984 +0100
@@ -67,6 +67,7 @@ irq_desc_t irq_desc[NR_IRQS] __cacheline
 	}
 };
 
+int __irq_offset_value;
 int ppc_spurious_interrupts = 0;
 unsigned long lpEvent_count = 0;
 
@@ -76,7 +77,7 @@ setup_irq(unsigned int irq, struct irqac
 	int shared = 0;
 	unsigned long flags;
 	struct irqaction *old, **p;
-	irq_desc_t *desc = irq_desc + irq;
+	irq_desc_t *desc = get_irq_desc(irq);
 
 	/*
 	 * Some drivers like serial.c use request_irq() heavily,
@@ -134,7 +135,7 @@ setup_irq(unsigned int irq, struct irqac
 
 inline void synchronize_irq(unsigned int irq)
 {
-	while (irq_desc[irq].status & IRQ_INPROGRESS)
+	while (get_irq_desc(irq)->status & IRQ_INPROGRESS)
 		cpu_relax();
 }
 
@@ -148,11 +149,10 @@ EXPORT_SYMBOL(synchronize_irq);
 static int
 do_free_irq(int irq, void* dev_id)
 {
-	irq_desc_t *desc;
+	irq_desc_t *desc = get_irq_desc(irq);
 	struct irqaction **p;
 	unsigned long flags;
 
-	desc = irq_desc + irq;
 	spin_lock_irqsave(&desc->lock,flags);
 	p = &desc->action;
 	for (;;) {
@@ -247,7 +247,7 @@ EXPORT_SYMBOL(free_irq);
  
 inline void disable_irq_nosync(unsigned int irq)
 {
-	irq_desc_t *desc = irq_desc + irq;
+	irq_desc_t *desc = get_irq_desc(irq);
 	unsigned long flags;
 
 	spin_lock_irqsave(&desc->lock, flags);
@@ -276,7 +276,7 @@ EXPORT_SYMBOL(disable_irq_nosync);
  
 void disable_irq(unsigned int irq)
 {
-	irq_desc_t *desc = irq_desc + irq;
+	irq_desc_t *desc = get_irq_desc(irq);
 	disable_irq_nosync(irq);
 	if (desc->action)
 		synchronize_irq(irq);
@@ -296,7 +296,7 @@ EXPORT_SYMBOL(disable_irq);
  
 void enable_irq(unsigned int irq)
 {
-	irq_desc_t *desc = irq_desc + irq;
+	irq_desc_t *desc = get_irq_desc(irq);
 	unsigned long flags;
 
 	spin_lock_irqsave(&desc->lock, flags);
@@ -327,6 +327,7 @@ int show_interrupts(struct seq_file *p, 
 {
 	int i = *(loff_t *) v, j;
 	struct irqaction * action;
+	irq_desc_t *desc;
 	unsigned long flags;
 
 	if (i == 0) {
@@ -339,8 +340,9 @@ int show_interrupts(struct seq_file *p, 
 	}
 
 	if (i < NR_IRQS) {
-		spin_lock_irqsave(&irq_desc[i].lock, flags);
-		action = irq_desc[i].action;
+		desc = get_irq_desc(i);
+		spin_lock_irqsave(&desc->lock, flags);
+		action = desc->action;
 		if (!action || !action->handler)
 			goto skip;
 		seq_printf(p, "%3d: ", i);
@@ -352,17 +354,17 @@ int show_interrupts(struct seq_file *p, 
 #else
 		seq_printf(p, "%10u ", kstat_irqs(i));
 #endif /* CONFIG_SMP */
-		if (irq_desc[i].handler)		
-			seq_printf(p, " %s ", irq_desc[i].handler->typename );
+		if (desc->handler)
+			seq_printf(p, " %s ", desc->handler->typename );
 		else
 			seq_printf(p, "  None      ");
-		seq_printf(p, "%s", (irq_desc[i].status & IRQ_LEVEL) ? "Level " : "Edge  ");
+		seq_printf(p, "%s", (desc->status & IRQ_LEVEL) ? "Level " : "Edge  ");
 		seq_printf(p, "    %s",action->name);
 		for (action=action->next; action; action = action->next)
 			seq_printf(p, ", %s", action->name);
 		seq_putc(p, '\n');
 skip:
-		spin_unlock_irqrestore(&irq_desc[i].lock, flags);
+		spin_unlock_irqrestore(&desc->lock, flags);
 	} else if (i == NR_IRQS)
 		seq_printf(p, "BAD: %10u\n", ppc_spurious_interrupts);
 	return 0;
@@ -482,7 +484,7 @@ void ppc_irq_dispatch_handler(struct pt_
 	int status;
 	struct irqaction *action;
 	int cpu = smp_processor_id();
-	irq_desc_t *desc = irq_desc + irq;
+	irq_desc_t *desc = get_irq_desc(irq);
 	irqreturn_t action_ret;
 
 	kstat_cpu(cpu).irqs[irq]++;
@@ -564,11 +566,11 @@ out:
 	 * The ->end() handler has to deal with interrupts which got
 	 * disabled while the handler was running.
 	 */
-	if (irq_desc[irq].handler) {
-		if (irq_desc[irq].handler->end)
-			irq_desc[irq].handler->end(irq);
-		else if (irq_desc[irq].handler->enable)
-			irq_desc[irq].handler->enable(irq);
+	if (desc->handler) {
+		if (desc->handler->end)
+			desc->handler->end(irq);
+		else if (desc->handler->enable)
+			desc->handler->enable(irq);
 	}
 	spin_unlock(&desc->lock);
 }
@@ -683,6 +685,7 @@ static struct proc_dir_entry * root_irq_
 static struct proc_dir_entry * irq_dir [NR_IRQS];
 static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
 
+/* Protected by get_irq_desc(irq)->lock. */
 #ifdef CONFIG_IRQ_ALL_CPUS
 cpumask_t irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = CPU_MASK_ALL };
 #else  /* CONFIG_IRQ_ALL_CPUS */
@@ -702,16 +705,18 @@ static int irq_affinity_read_proc (char 
 static int irq_affinity_write_proc (struct file *file, const char *buffer,
 					unsigned long count, void *data)
 {
-	int irq = (long)data, full_count = count, err;
+	unsigned int irq = (long)data;
+	irq_desc_t *desc = get_irq_desc(irq);
+	int ret;
 	cpumask_t new_value, tmp;
 	cpumask_t allcpus = CPU_MASK_ALL;
 
-	if (!irq_desc[irq].handler->set_affinity)
+	if (!desc->handler->set_affinity)
 		return -EIO;
 
-	err = cpumask_parse(buffer, count, new_value);
-	if (err)
-		return err;
+	ret = cpumask_parse(buffer, count, new_value);
+	if (ret != 0)
+		return ret;
 
 	/*
 	 * We check for CPU_MASK_ALL in xics to send irqs to all cpus.
@@ -722,18 +727,29 @@ static int irq_affinity_write_proc (stru
 	cpus_and(new_value, new_value, allcpus);
 
 	/*
+	 * Grab lock here so cpu_online_map can't change, and also
+	 * protect irq_affinity[].
+	 */
+	spin_lock(&desc->lock);
+
+	/*
 	 * Do not allow disabling IRQs completely - it's a too easy
 	 * way to make the system unusable accidentally :-) At least
 	 * one online CPU still has to be targeted.
 	 */
 	cpus_and(tmp, new_value, cpu_online_map);
-	if (cpus_empty(tmp))
-		return -EINVAL;
+	if (cpus_empty(tmp)) {
+		ret = -EINVAL;
+		goto out;
+	}
 
 	irq_affinity[irq] = new_value;
-	irq_desc[irq].handler->set_affinity(irq, new_value);
+	desc->handler->set_affinity(irq, new_value);
+	ret = count;
 
-	return full_count;
+out:
+	spin_unlock(&desc->lock);
+	return ret;
 }
 
 static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
@@ -828,8 +844,8 @@ void init_irq_proc (void)
 	/*
 	 * Create entries for all existing IRQs.
 	 */
-	for (i = 0; i < NR_IRQS; i++) {
-		if (irq_desc[i].handler == NULL)
+	for_each_irq(i) {
+		if (get_irq_desc(i)->handler == NULL)
 			continue;
 		register_irq_proc(i);
 	}
@@ -857,7 +873,7 @@ unsigned int virt_irq_to_real_map[NR_IRQ
  * we don't end up with an interrupt number >= NR_IRQS.
  */
 #define MIN_VIRT_IRQ	3
-#define MAX_VIRT_IRQ	(NR_IRQS - NUM_8259_INTERRUPTS - 1)
+#define MAX_VIRT_IRQ	(NR_IRQS - NUM_ISA_INTERRUPTS - 1)
 #define NR_VIRT_IRQS	(MAX_VIRT_IRQ - MIN_VIRT_IRQ + 1)
 
 void
@@ -946,5 +962,4 @@ unsigned int real_irq_to_virt_slowpath(u
 
 }
 
-
 #endif
--- diff/arch/ppc64/kernel/misc.S	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/misc.S	2004-04-21 10:45:33.775568832 +0100
@@ -132,7 +132,7 @@ _GLOBAL(flush_instruction_cache)
  *   flush all bytes from start through stop-1 inclusive
  */
 
-_GLOBAL(flush_icache_range)
+_GLOBAL(__flush_icache_range)
 
 /*
  * Flush the data cache to memory 
@@ -828,6 +828,18 @@ _GLOBAL(sys_call_table32)
 	.llong .compat_fstatfs64
 	.llong .ppc32_fadvise64_64	/* 32bit only fadvise64_64 */
 	.llong .ppc_rtas		/* 255 */
+	.llong .sys_ni_syscall		/* 256 reserved for sys_debug_setcontext */
+	.llong .sys_ni_syscall		/* 257 reserved for vserver */
+	.llong .sys_ni_syscall		/* 258 reserved for new sys_remap_file_pages */
+	.llong .sys_ni_syscall		/* 259 reserved for new sys_mbind */
+	.llong .sys_ni_syscall		/* 260 reserved for new sys_get_mempolicy */
+	.llong .sys_ni_syscall		/* 261 reserved for new sys_set_mempolicy */
+	.llong .compat_sys_mq_open
+	.llong .sys_mq_unlink
+	.llong .compat_sys_mq_timedsend
+	.llong .compat_sys_mq_timedreceive /* 265 */
+	.llong .compat_sys_mq_notify
+	.llong .compat_sys_mq_getsetattr
 
 	.balign 8
 _GLOBAL(sys_call_table)
@@ -1087,3 +1099,15 @@ _GLOBAL(sys_call_table)
 	.llong .sys_fstatfs64
 	.llong .sys_ni_syscall		/* 32bit only fadvise64_64 */
 	.llong .ppc_rtas		/* 255 */
+	.llong .sys_ni_syscall		/* 256 reserved for sys_debug_setcontext */
+	.llong .sys_ni_syscall		/* 257 reserved for vserver */
+	.llong .sys_ni_syscall		/* 258 reserved for new sys_remap_file_pages */
+	.llong .sys_ni_syscall		/* 259 reserved for new sys_mbind */
+	.llong .sys_ni_syscall		/* 260 reserved for new sys_get_mempolicy */
+	.llong .sys_ni_syscall		/* 261 reserved for new sys_set_mempolicy */
+	.llong .sys_mq_open
+	.llong .sys_mq_unlink
+	.llong .sys_mq_timedsend
+	.llong .sys_mq_timedreceive	/* 265 */
+	.llong .sys_mq_notify
+	.llong .sys_mq_getsetattr
--- diff/arch/ppc64/kernel/nvram.c	2004-02-18 08:54:08.000000000 +0000
+++ source/arch/ppc64/kernel/nvram.c	2004-04-21 10:45:33.776568680 +0100
@@ -32,7 +32,7 @@
 #include <asm/prom.h>
 #include <asm/machdep.h>
 
-#define DEBUG_NVRAM
+#undef DEBUG_NVRAM
 
 static int nvram_scan_partitions(void);
 static int nvram_setup_partition(void);
@@ -199,7 +199,7 @@ static struct miscdevice nvram_dev = {
 };
 
 
-
+#ifdef DEBUG_NVRAM
 static void nvram_print_partitions(char * label)
 {
 	struct list_head * p;
@@ -215,6 +215,7 @@ static void nvram_print_partitions(char 
 		       tmp_part->header.name);
 	}
 }
+#endif
 
 
 static int nvram_write_header(struct nvram_partition * part)
--- diff/arch/ppc64/kernel/open_pic.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/ppc64/kernel/open_pic.c	2004-04-21 10:45:33.777568528 +0100
@@ -67,7 +67,6 @@ static void openpic_disable_irq(u_int ir
 static void openpic_initirq(u_int irq, u_int pri, u_int vector, int polarity,
 			    int is_level);
 static void openpic_mapirq(u_int irq, u_int cpumask);
-static void openpic_set_sense(u_int irq, int sense);
 
 static void find_ISUs(void);
 
@@ -170,7 +169,7 @@ void __init pSeries_init_openpic(void)
         int i;
         unsigned int *addrp;
         unsigned char* chrp_int_ack_special = 0;
-        unsigned char init_senses[NR_IRQS - NUM_8259_INTERRUPTS];
+        unsigned char init_senses[NR_IRQS - NUM_ISA_INTERRUPTS];
         int nmi_irq = -1;
 #if defined(CONFIG_VT) && defined(CONFIG_ADB_KEYBOARD) && defined(XMON)
         struct device_node *kbd;
@@ -185,12 +184,12 @@ void __init pSeries_init_openpic(void)
 			__ioremap(addrp[prom_n_addr_cells(np)-1], 1, _PAGE_NO_CACHE);
         /* hydra still sets OpenPIC_InitSenses to a static set of values */
         if (OpenPIC_InitSenses == NULL) {
-                prom_get_irq_senses(init_senses, NUM_8259_INTERRUPTS, NR_IRQS);
+                prom_get_irq_senses(init_senses, NUM_ISA_INTERRUPTS, NR_IRQS);
                 OpenPIC_InitSenses = init_senses;
-                OpenPIC_NumInitSenses = NR_IRQS - NUM_8259_INTERRUPTS;
+                OpenPIC_NumInitSenses = NR_IRQS - NUM_ISA_INTERRUPTS;
         }
-        openpic_init(1, NUM_8259_INTERRUPTS, chrp_int_ack_special, nmi_irq);
-        for ( i = 0 ; i < NUM_8259_INTERRUPTS  ; i++ )
+        openpic_init(1, NUM_ISA_INTERRUPTS, chrp_int_ack_special, nmi_irq);
+        for (i = 0; i < NUM_ISA_INTERRUPTS; i++)
                 irq_desc[i].handler = &i8259_pic;
 	of_node_put(np);
 }
@@ -441,7 +440,7 @@ static int __init openpic_setup_i8259(vo
 
 	if (naca->interrupt_controller == IC_OPEN_PIC) {
 		/* Initialize the cascade */
-		if (request_irq(NUM_8259_INTERRUPTS, no_action, SA_INTERRUPT,
+		if (request_irq(NUM_ISA_INTERRUPTS, no_action, SA_INTERRUPT,
 				"82c59 cascade", NULL))
 			printk(KERN_ERR "Unable to get OpenPIC IRQ 0 for cascade\n");
 		i8259_init();
@@ -820,13 +819,21 @@ static void openpic_mapirq(u_int irq, u_
  *
  *  sense: 1 for level, 0 for edge
  */
-static inline void openpic_set_sense(u_int irq, int sense)
+#if 0	/* not used */
+static void openpic_set_sense(u_int irq, int sense)
 {
 	openpic_safe_writefield(&GET_ISU(irq).Vector_Priority,
 				OPENPIC_SENSE_LEVEL,
 				(sense ? OPENPIC_SENSE_LEVEL : 0));
 }
 
+static int openpic_get_sense(u_int irq)
+{
+	return openpic_readfield(&GET_ISU(irq).Vector_Priority,
+				 OPENPIC_SENSE_LEVEL) != 0;
+}
+#endif
+
 static void openpic_end_irq(unsigned int irq_nr)
 {
 	openpic_eoi();
--- diff/arch/ppc64/kernel/open_pic.h	2004-02-18 08:54:08.000000000 +0000
+++ source/arch/ppc64/kernel/open_pic.h	2004-04-21 10:45:33.777568528 +0100
@@ -14,6 +14,7 @@
 
 #include <linux/config.h>
 #include <linux/cpumask.h>
+#include <linux/irq.h>
 
 #define OPENPIC_SIZE	0x40000
 
@@ -38,11 +39,4 @@ extern void openpic_init_processor(u_int
 extern void openpic_setup_ISU(int isu_num, unsigned long addr);
 extern void openpic_cause_IPI(u_int ipi, u_int cpumask);
 
-extern inline int openpic_to_irq(int irq)
-{
-	if (systemcfg->platform == PLATFORM_POWERMAC)
-		return irq;
-	return irq += NUM_8259_INTERRUPTS;
-}
-/*extern int open_pic_irq_offset;*/
 #endif /* _PPC64_KERNEL_OPEN_PIC_H */
--- diff/arch/ppc64/kernel/pSeries_htab.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/ppc64/kernel/pSeries_htab.c	2004-04-21 10:45:33.778568376 +0100
@@ -221,9 +221,11 @@ static long pSeries_hpte_updatepp(unsign
 	if ((cur_cpu_spec->cpu_features & CPU_FTR_TLBIEL) && !large && local) {
 		tlbiel(va);
 	} else {
-		spin_lock_irqsave(&pSeries_tlbie_lock, flags);
+		if (!(cur_cpu_spec->cpu_features & CPU_FTR_LOCKLESS_TLBIE))
+			spin_lock_irqsave(&pSeries_tlbie_lock, flags);
 		tlbie(va, large);
-		spin_unlock_irqrestore(&pSeries_tlbie_lock, flags);
+		if (!(cur_cpu_spec->cpu_features & CPU_FTR_LOCKLESS_TLBIE))
+			spin_unlock_irqrestore(&pSeries_tlbie_lock, flags);
 	}
 
 	return ret;
@@ -255,9 +257,11 @@ static void pSeries_hpte_updateboltedpp(
 	set_pp_bit(newpp, hptep);
 
 	/* Ensure it is out of the tlb too */
-	spin_lock_irqsave(&pSeries_tlbie_lock, flags);
+	if (!(cur_cpu_spec->cpu_features & CPU_FTR_LOCKLESS_TLBIE))
+		spin_lock_irqsave(&pSeries_tlbie_lock, flags);
 	tlbie(va, 0);
-	spin_unlock_irqrestore(&pSeries_tlbie_lock, flags);
+	if (!(cur_cpu_spec->cpu_features & CPU_FTR_LOCKLESS_TLBIE))
+		spin_unlock_irqrestore(&pSeries_tlbie_lock, flags);
 }
 
 static void pSeries_hpte_invalidate(unsigned long slot, unsigned long va,
@@ -287,9 +291,11 @@ static void pSeries_hpte_invalidate(unsi
 	if ((cur_cpu_spec->cpu_features & CPU_FTR_TLBIEL) && !large && local) {
 		tlbiel(va);
 	} else {
-		spin_lock_irqsave(&pSeries_tlbie_lock, flags);
+		if (!(cur_cpu_spec->cpu_features & CPU_FTR_LOCKLESS_TLBIE))
+			spin_lock_irqsave(&pSeries_tlbie_lock, flags);
 		tlbie(va, large);
-		spin_unlock_irqrestore(&pSeries_tlbie_lock, flags);
+		if (!(cur_cpu_spec->cpu_features & CPU_FTR_LOCKLESS_TLBIE))
+			spin_unlock_irqrestore(&pSeries_tlbie_lock, flags);
 	}
 }
 
@@ -356,7 +362,8 @@ static void pSeries_flush_hash_range(uns
 		asm volatile("ptesync":::"memory");
 	} else {
 		/* XXX double check that it is safe to take this late */
-		spin_lock_irqsave(&pSeries_tlbie_lock, flags);
+		if (!(cur_cpu_spec->cpu_features & CPU_FTR_LOCKLESS_TLBIE))
+			spin_lock_irqsave(&pSeries_tlbie_lock, flags);
 
 		asm volatile("ptesync":::"memory");
 
@@ -365,7 +372,8 @@ static void pSeries_flush_hash_range(uns
 
 		asm volatile("eieio; tlbsync; ptesync":::"memory");
 
-		spin_unlock_irqrestore(&pSeries_tlbie_lock, flags);
+		if (!(cur_cpu_spec->cpu_features & CPU_FTR_LOCKLESS_TLBIE))
+			spin_unlock_irqrestore(&pSeries_tlbie_lock, flags);
 	}
 }
 
@@ -384,8 +392,12 @@ void hpte_init_pSeries(void)
 	root = of_find_node_by_path("/");
 	if (root) {
 		model = get_property(root, "model", NULL);
-		if (strcmp(model, "CHRP IBM,9076-N81"))
-			ppc_md.flush_hash_range = pSeries_flush_hash_range;
+		if (!strcmp(model, "CHRP IBM,9076-N81")) {
+			of_node_put(root);
+			return;
+		}
 		of_node_put(root);
 	}
+
+	ppc_md.flush_hash_range = pSeries_flush_hash_range;
 }
--- diff/arch/ppc64/kernel/pSeries_iommu.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/pSeries_iommu.c	2004-04-21 10:45:33.778568376 +0100
@@ -33,6 +33,7 @@
 #include <linux/spinlock.h>
 #include <linux/string.h>
 #include <linux/pci.h>
+#include <linux/dma-mapping.h>
 #include <asm/io.h>
 #include <asm/prom.h>
 #include <asm/rtas.h>
@@ -46,7 +47,7 @@
 
 static void tce_build_pSeries(struct iommu_table *tbl, long index, 
 			      long npages, unsigned long uaddr, 
-			      int direction)
+			      enum dma_data_direction direction)
 {
 	union tce_entry t;
 	union tce_entry *tp;
@@ -54,7 +55,7 @@ static void tce_build_pSeries(struct iom
 	t.te_word = 0;
 	t.te_rdwr = 1; // Read allowed 
 
-	if (direction != PCI_DMA_TODEVICE)
+	if (direction != DMA_TO_DEVICE)
 		t.te_pciwr = 1;
 
 	tp = ((union tce_entry *)tbl->it_base) + index;
--- diff/arch/ppc64/kernel/pSeries_lpar.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/pSeries_lpar.c	2004-04-21 10:45:33.778568376 +0100
@@ -21,6 +21,7 @@
 
 #include <linux/config.h>
 #include <linux/kernel.h>
+#include <linux/dma-mapping.h>
 #include <asm/processor.h>
 #include <asm/mmu.h>
 #include <asm/page.h>
@@ -30,13 +31,13 @@
 #include <asm/mmu_context.h>
 #include <asm/ppcdebug.h>
 #include <asm/iommu.h>
-#include <linux/pci.h>
 #include <asm/naca.h>
 #include <asm/tlbflush.h>
 #include <asm/tlb.h>
 #include <asm/hvcall.h>
 #include <asm/prom.h>
 #include <asm/abs_addr.h>
+#include <asm/cputable.h>
 
 /* in pSeries_hvCall.S */
 EXPORT_SYMBOL(plpar_hcall);
@@ -129,8 +130,9 @@ long plpar_put_term_char(unsigned long t
 				  lbuf[1]);
 }
 
-static void tce_build_pSeriesLP(struct iommu_table *tbl, long tcenum, long npages,
-				unsigned long uaddr, int direction )
+static void tce_build_pSeriesLP(struct iommu_table *tbl, long tcenum,
+		long npages, unsigned long uaddr,
+		enum dma_data_direction direction)
 {
 	u64 rc;
 	union tce_entry tce;
@@ -138,7 +140,7 @@ static void tce_build_pSeriesLP(struct i
 	tce.te_word = 0;
 	tce.te_rpn = (virt_to_abs(uaddr)) >> PAGE_SHIFT;
 	tce.te_rdwr = 1;
-	if (direction != PCI_DMA_TODEVICE)
+	if (direction != DMA_TO_DEVICE)
 		tce.te_pciwr = 1;
 
 	while (npages--) {
@@ -146,7 +148,7 @@ static void tce_build_pSeriesLP(struct i
 				   (u64)tcenum << 12, 
 				   tce.te_word );
 		
-		if(rc && printk_ratelimit()) {
+		if (rc && printk_ratelimit()) {
 			printk("tce_build_pSeriesLP: plpar_tce_put failed. rc=%ld\n", rc);
 			printk("\tindex   = 0x%lx\n", (u64)tbl->it_index);
 			printk("\ttcenum  = 0x%lx\n", (u64)tcenum);
@@ -559,12 +561,14 @@ void pSeries_lpar_flush_hash_range(unsig
 	unsigned long flags;
 	struct ppc64_tlb_batch *batch = &__get_cpu_var(ppc64_tlb_batch);
 
-	spin_lock_irqsave(&pSeries_lpar_tlbie_lock, flags);
+	if (!(cur_cpu_spec->cpu_features & CPU_FTR_LOCKLESS_TLBIE))
+		spin_lock_irqsave(&pSeries_lpar_tlbie_lock, flags);
 
 	for (i = 0; i < number; i++)
 		flush_hash_page(context, batch->addr[i], batch->pte[i], local);
 
-	spin_unlock_irqrestore(&pSeries_lpar_tlbie_lock, flags);
+	if (!(cur_cpu_spec->cpu_features & CPU_FTR_LOCKLESS_TLBIE))
+		spin_unlock_irqrestore(&pSeries_lpar_tlbie_lock, flags);
 }
 
 void pSeries_lpar_mm_init(void)
--- diff/arch/ppc64/kernel/pSeries_pci.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/pSeries_pci.c	2004-04-21 10:45:33.779568224 +0100
@@ -44,6 +44,12 @@
 #include "open_pic.h"
 #include "pci.h"
 
+/* legal IO pages under MAX_ISA_PORT.  This is to ensure we don't touch
+   devices we don't have access to. */
+unsigned long io_page_mask;
+
+EXPORT_SYMBOL(io_page_mask);
+
 /* RTAS tokens */
 static int read_pci_config;
 static int write_pci_config;
@@ -280,6 +286,8 @@ static void __init pci_process_bridge_OF
 					pci_process_ISA_OF_ranges(isa_dn,
 						hose->io_base_phys,
 						hose->io_base_virt);
+                                        /* Allow all IO */
+                                        io_page_mask = -1;
 				}
 			}
 
@@ -523,8 +531,24 @@ void __devinit pcibios_fixup_device_reso
 	for (i = 0; i < PCI_NUM_RESOURCES; i++) {
 		if (dev->resource[i].flags & IORESOURCE_IO) {
 			unsigned long offset = (unsigned long)hose->io_base_virt - pci_io_base;
-			dev->resource[i].start += offset;
-			dev->resource[i].end += offset;
+                        unsigned long start, end, mask;
+
+                        start = dev->resource[i].start += offset;
+                        end = dev->resource[i].end += offset;
+
+                        /* Need to allow IO access to pages that are in the
+                           ISA range */
+                        if (start < MAX_ISA_PORT) {
+                                if (end > MAX_ISA_PORT)
+                                        end = MAX_ISA_PORT;
+
+                                start >>= PAGE_SHIFT;
+                                end >>= PAGE_SHIFT;
+
+                                /* get the range of pages for the map */
+                                mask = ((1 << (end+1))-1) ^ ((1 << start)-1);
+                                io_page_mask |= mask;
+                        }
 		}
                 else if (dev->resource[i].flags & IORESOURCE_MEM) {
 			dev->resource[i].start += hose->pci_mem_offset;
--- diff/arch/ppc64/kernel/pci_dma_direct.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/pci_dma_direct.c	2004-04-21 10:45:33.779568224 +0100
@@ -18,6 +18,7 @@
 #include <linux/init.h>
 #include <linux/bootmem.h>
 #include <linux/mm.h>
+#include <linux/dma-mapping.h>
 
 #include <asm/sections.h>
 #include <asm/io.h>
@@ -49,18 +50,18 @@ static void pci_direct_free_consistent(s
 }
 
 static dma_addr_t pci_direct_map_single(struct pci_dev *hwdev, void *ptr,
-				  size_t size, int direction)
+		size_t size, enum dma_data_direction direction)
 {
 	return virt_to_abs(ptr);
 }
 
 static void pci_direct_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr,
-			      size_t size, int direction)
+		size_t size, enum dma_data_direction direction)
 {
 }
 
 static int pci_direct_map_sg(struct pci_dev *hwdev, struct scatterlist *sg,
-		       int nents, int direction)
+		int nents, enum dma_data_direction direction)
 {
 	int i;
 
@@ -73,7 +74,7 @@ static int pci_direct_map_sg(struct pci_
 }
 
 static void pci_direct_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg,
-			  int nents, int direction)
+		int nents, enum dma_data_direction direction)
 {
 }
 
--- diff/arch/ppc64/kernel/pci_dn.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/ppc64/kernel/pci_dn.c	2004-04-21 10:45:33.780568072 +0100
@@ -50,13 +50,20 @@ update_dn_pci_info(struct device_node *d
 	struct pci_controller *phb = (struct pci_controller *)data;
 	u32 *regs;
 	char *device_type = get_property(dn, "device_type", 0);
+	char *model;
 
 	dn->phb = phb;
 	if (device_type && strcmp(device_type, "pci") == 0 && get_property(dn, "class-code", 0) == 0) {
 		/* special case for PHB's.  Sigh. */
 		regs = (u32 *)get_property(dn, "bus-range", 0);
 		dn->busno = regs[0];
-		dn->devfn = 0;	/* assumption */
+
+		model = (char *)get_property(dn, "model", NULL);
+
+		if (strstr(model, "U3"))
+			dn->devfn = -1;
+		else
+			dn->devfn = 0;	/* assumption */
 	} else {
 		regs = (u32 *)get_property(dn, "reg", 0);
 		if (regs) {
--- diff/arch/ppc64/kernel/pci_iommu.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/pci_iommu.c	2004-04-21 10:45:33.780568072 +0100
@@ -43,8 +43,6 @@
 #include <asm/iSeries/iSeries_pci.h>
 #endif /* CONFIG_PPC_ISERIES */
 
-#define DBG(...)
-
 static inline struct iommu_table *devnode_table(struct pci_dev *dev)
 {
 	if (!dev)
@@ -66,154 +64,49 @@ static inline struct iommu_table *devnod
  * Returns the virtual address of the buffer and sets dma_handle
  * to the dma address (mapping) of the first page.
  */
-void *pci_iommu_alloc_consistent(struct pci_dev *hwdev, size_t size,
+static void *pci_iommu_alloc_consistent(struct pci_dev *hwdev, size_t size,
 			   dma_addr_t *dma_handle)
 {
-	struct iommu_table *tbl;
-	void *ret = NULL;
-	dma_addr_t mapping;
-	unsigned int npages, order;
-
-	size = PAGE_ALIGN(size);
-	npages = size >> PAGE_SHIFT;
-	order = get_order(size);
-
- 	/* Client asked for way too much space.  This is checked later anyway */
-	/* It is easier to debug here for the drivers than in the tce tables.*/
-	if (order >= IOMAP_MAX_ORDER) {
-		printk("PCI_DMA: pci_alloc_consistent size too large: 0x%lx\n",
-			size);
-		return (void *)DMA_ERROR_CODE;
-	}
-
-	tbl = devnode_table(hwdev); 
-
-	if (!tbl)
-		return NULL;
-
-	/* Alloc enough pages (and possibly more) */
-	ret = (void *)__get_free_pages(GFP_ATOMIC, order);
-
-	if (!ret)
-		return NULL;
-
-	memset(ret, 0, size);
-
-	/* Set up tces to cover the allocated range */
-	mapping = iommu_alloc(tbl, ret, npages, PCI_DMA_BIDIRECTIONAL);
-
-	if (mapping == DMA_ERROR_CODE) {
-		free_pages((unsigned long)ret, order);
-		ret = NULL;
-	} else
-		*dma_handle = mapping;
-
-	return ret;
+	return iommu_alloc_consistent(devnode_table(hwdev), size, dma_handle);
 }
 
-
-void pci_iommu_free_consistent(struct pci_dev *hwdev, size_t size,
+static void pci_iommu_free_consistent(struct pci_dev *hwdev, size_t size,
 			 void *vaddr, dma_addr_t dma_handle)
 {
-	struct iommu_table *tbl;
-	unsigned int npages;
-	
-	size = PAGE_ALIGN(size);
-	npages = size >> PAGE_SHIFT;
-
-	tbl = devnode_table(hwdev); 
-
-	if (tbl) {
-		iommu_free(tbl, dma_handle, npages);
-		free_pages((unsigned long)vaddr, get_order(size));
-	}
+	iommu_free_consistent(devnode_table(hwdev), size, vaddr, dma_handle);
 }
 
-
 /* Creates TCEs for a user provided buffer.  The user buffer must be 
  * contiguous real kernel storage (not vmalloc).  The address of the buffer
  * passed here is the kernel (virtual) address of the buffer.  The buffer
  * need not be page aligned, the dma_addr_t returned will point to the same
  * byte within the page as vaddr.
  */
-dma_addr_t pci_iommu_map_single(struct pci_dev *hwdev, void *vaddr,
-				size_t size, int direction)
+static dma_addr_t pci_iommu_map_single(struct pci_dev *hwdev, void *vaddr,
+		size_t size, enum dma_data_direction direction)
 {
-	struct iommu_table * tbl;
-	dma_addr_t dma_handle = DMA_ERROR_CODE;
-	unsigned long uaddr;
-	unsigned int npages;
-
-	BUG_ON(direction == PCI_DMA_NONE);
-
-	uaddr = (unsigned long)vaddr;
-	npages = PAGE_ALIGN(uaddr + size) - (uaddr & PAGE_MASK);
-	npages >>= PAGE_SHIFT;
-
-	tbl = devnode_table(hwdev); 
-
-	if (tbl) {
-		dma_handle = iommu_alloc(tbl, vaddr, npages, direction);
-		if (dma_handle == DMA_ERROR_CODE) {
-			if (printk_ratelimit())  {
-				printk(KERN_INFO "iommu_alloc failed, tbl %p vaddr %p npages %d\n",
-				       tbl, vaddr, npages);
-			}
-		} else 
-			dma_handle |= (uaddr & ~PAGE_MASK);
-	}
-
-	return dma_handle;
+	return iommu_map_single(devnode_table(hwdev), vaddr, size, direction);
 }
 
 
-void pci_iommu_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_handle,
-		      size_t size, int direction)
+static void pci_iommu_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_handle,
+		size_t size, enum dma_data_direction direction)
 {
-	struct iommu_table *tbl;
-	unsigned int npages;
-	
-	BUG_ON(direction == PCI_DMA_NONE);
-
-	npages = (PAGE_ALIGN(dma_handle + size) - (dma_handle & PAGE_MASK))
-		>> PAGE_SHIFT;
-
-	tbl = devnode_table(hwdev); 
-
-	if (tbl) 
-		iommu_free(tbl, dma_handle, npages);
+	iommu_unmap_single(devnode_table(hwdev), dma_handle, size, direction);
 }
 
 
-int pci_iommu_map_sg(struct pci_dev *pdev, struct scatterlist *sglist, int nelems,
-	       int direction)
+static int pci_iommu_map_sg(struct pci_dev *pdev, struct scatterlist *sglist,
+		int nelems, enum dma_data_direction direction)
 {
-	struct iommu_table * tbl;
-
-	BUG_ON(direction == PCI_DMA_NONE);
-
-	if (nelems == 0)
-		return 0;
-
-	tbl = devnode_table(pdev); 
-	if (!tbl)
-		return 0;
-
-	return iommu_alloc_sg(tbl, &pdev->dev, sglist, nelems, direction);
+	return iommu_map_sg(&pdev->dev, devnode_table(pdev), sglist,
+			nelems, direction);
 }
 
-void pci_iommu_unmap_sg(struct pci_dev *pdev, struct scatterlist *sglist, int nelems,
-		  int direction)
+static void pci_iommu_unmap_sg(struct pci_dev *pdev, struct scatterlist *sglist,
+		int nelems, enum dma_data_direction direction)
 {
-	struct iommu_table *tbl;
-
-	BUG_ON(direction == PCI_DMA_NONE);
-
-	tbl = devnode_table(pdev); 
-	if (!tbl)
-		return;
-
-	iommu_free_sg(tbl, sglist, nelems);
+	iommu_unmap_sg(devnode_table(pdev), sglist, nelems, direction);
 }
 
 /* We support DMA to/from any memory page via the iommu */
--- diff/arch/ppc64/kernel/pmac_iommu.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/pmac_iommu.c	2004-04-21 10:45:33.781567920 +0100
@@ -33,6 +33,7 @@
 #include <linux/spinlock.h>
 #include <linux/string.h>
 #include <linux/pci.h>
+#include <linux/dma-mapping.h>
 #include <linux/vmalloc.h>
 #include <asm/io.h>
 #include <asm/prom.h>
@@ -141,7 +142,7 @@ static void dart_flush(struct iommu_tabl
 
 static void dart_build_pmac(struct iommu_table *tbl, long index, 
 			    long npages, unsigned long uaddr,
-			    int direction)
+			    enum dma_data_direction direction)
 {
 	unsigned int *dp;
 	unsigned int rpn;
--- diff/arch/ppc64/kernel/ppc_ksyms.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/ppc_ksyms.c	2004-04-21 10:45:33.781567920 +0100
@@ -42,6 +42,7 @@
 #include <asm/cacheflush.h>
 #ifdef CONFIG_PPC_ISERIES
 #include <asm/iSeries/HvCallSc.h>
+#include <asm/iSeries/LparData.h>
 #endif
 
 extern int do_signal(sigset_t *, struct pt_regs *);
@@ -71,6 +72,9 @@ EXPORT_SYMBOL(__down_interruptible);
 EXPORT_SYMBOL(__up);
 EXPORT_SYMBOL(naca);
 EXPORT_SYMBOL(__down);
+#ifdef CONFIG_PPC_ISERIES
+EXPORT_SYMBOL(itLpNaca);
+#endif
 
 EXPORT_SYMBOL(csum_partial);
 EXPORT_SYMBOL(csum_partial_copy_generic);
--- diff/arch/ppc64/kernel/process.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/process.c	2004-04-21 10:45:33.781567920 +0100
@@ -475,8 +475,6 @@ static inline int validate_sp(unsigned l
 /*
  * These bracket the sleeping functions..
  */
-extern void scheduling_functions_start_here(void);
-extern void scheduling_functions_end_here(void);
 #define first_sched    (*(unsigned long *)scheduling_functions_start_here)
 #define last_sched     (*(unsigned long *)scheduling_functions_end_here)
 
--- diff/arch/ppc64/kernel/prom.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/prom.c	2004-04-21 10:45:33.783567616 +0100
@@ -798,7 +798,7 @@ void prom_initialize_dart_table(void)
 	 * will blow up an entire large page anyway in the kernel mapping
 	 */
 	RELOC(dart_tablebase) =
-		absolute_to_virt(lmb_alloc_base(1UL<<24, 1UL<<24, 0x80000000L));
+		abs_to_virt(lmb_alloc_base(1UL<<24, 1UL<<24, 0x80000000L));
 
 	prom_print(RELOC("Dart at: "));
 	prom_print_hex(RELOC(dart_tablebase));
@@ -1254,7 +1254,6 @@ smt_setup(void)
 {
 	char *p, *q;
 	char my_smt_enabled = SMT_DYNAMIC;
-	unsigned long my_smt_snooze_delay; 
 	ihandle prom_options = NULL;
 	char option[9];
 	unsigned long offset = reloc_offset();
@@ -1301,51 +1300,6 @@ smt_setup(void)
 	if (!found )
 		my_smt_enabled = SMT_DYNAMIC; /* default to on */
 
-	found = 0;
-	if (my_smt_enabled) {
-		if (strstr(RELOC(cmd_line), RELOC("smt-snooze-delay="))) {
-			for (q = RELOC(cmd_line); (p = strstr(q, RELOC("smt-snooze-delay="))) != 0; ) {
-				q = p + 17;
-				if (p > RELOC(cmd_line) && p[-1] != ' ')
-					continue;
-				found = 1;
-				/* Don't use simple_strtoul() because _ctype & others aren't RELOC'd */
-				my_smt_snooze_delay = 0;
-				while (*q >= '0' && *q <= '9') {
-					my_smt_snooze_delay = my_smt_snooze_delay * 10 + *q - '0';
-					q++;
-				}
-			}
-		}
-
-		if (!found) {
-			prom_options = (ihandle)call_prom(RELOC("finddevice"), 1, 1, RELOC("/options"));
-			if (prom_options != (ihandle) -1) {
-				call_prom(RELOC("getprop"), 
-					4, 1, prom_options,
-					RELOC("ibm,smt-snooze-delay"), 
-					option, 
-					sizeof(option));
-				if (option[0] != 0) {
-					found = 1;
-					/* Don't use simple_strtoul() because _ctype & others aren't RELOC'd */
-					my_smt_snooze_delay = 0;
-					q = option;
-					while (*q >= '0' && *q <= '9') {
-						my_smt_snooze_delay = my_smt_snooze_delay * 10 + *q - '0';
-						q++;
-					}
-				}
-			}
-		}
-
-		if (!found) {
-			my_smt_snooze_delay = 30000; /* default value */
-		}
-	} else {
-		my_smt_snooze_delay = 0; /* default value */
-	}
-	_naca->smt_snooze_delay = my_smt_snooze_delay;
 	_naca->smt_state = my_smt_enabled;
 }
 
@@ -1972,6 +1926,11 @@ finish_node(struct device_node *np, unsi
 	np->name = get_property(np, "name", 0);
 	np->type = get_property(np, "device_type", 0);
 
+	if (!np->name)
+		np->name = "<NULL>";
+	if (!np->type)
+		np->type = "<NULL>";
+
 	/* get the device addresses and interrupts */
 	if (ifunc != NULL)
 		mem_start = ifunc(np, mem_start, naddrc, nsizec);
@@ -2191,7 +2150,7 @@ finish_node_interrupts(struct device_nod
 			printk(KERN_CRIT "Could not allocate interrupt "
 			       "number for %s\n", np->full_name);
 		} else
-			np->intrs[i].line = openpic_to_irq(virq);
+			np->intrs[i].line = irq_offset_up(virq);
 
 		/* We offset irq numbers for the u3 MPIC by 128 in PowerMac */
 		if (systemcfg->platform == PLATFORM_POWERMAC && ic && ic->parent) {
@@ -3019,7 +2978,7 @@ static int of_finish_dynamic_node_interr
 			       "number for %s\n", node->full_name);
 			return -ENOMEM;
 		}
-		node->intrs[i].line = openpic_to_irq(virq);
+		node->intrs[i].line = irq_offset_up(virq);
 		if (n > 1)
 			node->intrs[i].sense = irq[1];
 		if (n > 2) {
--- diff/arch/ppc64/kernel/ptrace.c	2003-02-26 16:01:01.000000000 +0000
+++ source/arch/ppc64/kernel/ptrace.c	2004-04-21 10:45:33.783567616 +0100
@@ -26,6 +26,7 @@
 #include <linux/ptrace.h>
 #include <linux/user.h>
 #include <linux/security.h>
+#include <linux/audit.h>
 
 #include <asm/uaccess.h>
 #include <asm/page.h>
@@ -286,12 +287,8 @@ out:
 	return ret;
 }
 
-void do_syscall_trace(void)
+static void do_syscall_trace(void)
 {
-	if (!test_thread_flag(TIF_SYSCALL_TRACE))
-		return;
-	if (!(current->ptrace & PT_PTRACED))
-		return;
 	/* the 0x80 provides a way for the tracing parent to distinguish
 	   between a syscall stop and SIGTRAP delivery */
 	ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
@@ -307,3 +304,25 @@ void do_syscall_trace(void)
 		current->exit_code = 0;
 	}
 }
+
+void do_syscall_trace_enter(struct pt_regs *regs)
+{
+	if (unlikely(current->audit_context))
+		audit_syscall_entry(current, regs->gpr[0],
+				    regs->gpr[3], regs->gpr[4],
+				    regs->gpr[5], regs->gpr[6]);
+
+	if (test_thread_flag(TIF_SYSCALL_TRACE)
+	    && (current->ptrace & PT_PTRACED))
+		do_syscall_trace();
+}
+
+void do_syscall_trace_leave(void)
+{
+	if (unlikely(current->audit_context))
+		audit_syscall_exit(current, 0);	/* FIXME: pass pt_regs */
+
+	if (test_thread_flag(TIF_SYSCALL_TRACE)
+	    && (current->ptrace & PT_PTRACED))
+		do_syscall_trace();
+}
--- diff/arch/ppc64/kernel/ras.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/ras.c	2004-04-21 10:45:33.784567464 +0100
@@ -1,4 +1,3 @@
-
 /*
  * ras.c
  * Copyright (C) 2001 Dave Engebretsen IBM Corporation
@@ -80,7 +79,7 @@ static int __init init_ras_IRQ(void)
 				       "number for %s\n", np->full_name);
 				break;
 			}
-			request_irq(virq + NUM_8259_INTERRUPTS, 
+			request_irq(irq_offset_up(virq),
 				    ras_error_interrupt, 0, 
 				    "RAS_ERROR", NULL);
 			ireg++;
@@ -98,7 +97,7 @@ static int __init init_ras_IRQ(void)
 				       " number for %s\n", np->full_name);
 				break;
 			}
-			request_irq(virq + NUM_8259_INTERRUPTS, 
+			request_irq(irq_offset_up(virq),
 				    ras_epow_interrupt, 0, 
 				    "RAS_EPOW", NULL);
 			ireg++;
@@ -110,6 +109,9 @@ static int __init init_ras_IRQ(void)
 }
 __initcall(init_ras_IRQ);
 
+static struct rtas_error_log log_buf;
+static spinlock_t log_lock = SPIN_LOCK_UNLOCKED;
+
 /*
  * Handle power subsystem events (EPOW).
  *
@@ -124,11 +126,17 @@ ras_epow_interrupt(int irq, void *dev_id
 	unsigned int size = sizeof(log_entry);
 	long status = 0xdeadbeef;
 
+	spin_lock(&log_lock);
+
 	status = rtas_call(rtas_token("check-exception"), 6, 1, NULL, 
 			   0x500, irq, 
 			   RTAS_EPOW_WARNING | RTAS_POWERMGM_EVENTS, 
 			   1,  /* Time Critical */
-			   __pa(&log_entry), size);
+			   __pa(&log_buf), size);
+
+	log_entry = log_buf;
+
+	spin_unlock(&log_lock);
 
 	udbg_printf("EPOW <0x%lx 0x%lx>\n", 
 		    *((unsigned long *)&log_entry), status); 
@@ -157,11 +165,17 @@ ras_error_interrupt(int irq, void *dev_i
 	long status = 0xdeadbeef;
 	int fatal;
 
+	spin_lock(&log_lock);
+
 	status = rtas_call(rtas_token("check-exception"), 6, 1, NULL, 
 			   0x500, irq, 
 			   RTAS_INTERNAL_ERROR, 
 			   1, /* Time Critical */
-			   __pa(&log_entry), size);
+			   __pa(&log_buf), size);
+
+	log_entry = log_buf;
+
+	spin_unlock(&log_lock);
 
 	if ((status == 0) && (log_entry.severity >= SEVERITY_ERROR_SYNC)) 
 		fatal = 1;
--- diff/arch/ppc64/kernel/rtas.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/rtas.c	2004-04-21 10:45:33.784567464 +0100
@@ -66,53 +66,22 @@ spinlock_t rtas_data_buf_lock = SPIN_LOC
 char rtas_data_buf[RTAS_DATA_BUF_SIZE]__page_aligned;
 
 void
-phys_call_rtas(int token, int nargs, int nret, ...)
-{
-	va_list list;
-	unsigned long offset = reloc_offset();
-	struct rtas_args *rtas = PTRRELOC(&(get_paca()->xRtas));
-	int i;
-
-	rtas->token = token;
-	rtas->nargs = nargs;
-	rtas->nret  = nret;
-	rtas->rets  = (rtas_arg_t *)PTRRELOC(&(rtas->args[nargs]));
-
-	va_start(list, nret);
-	for (i = 0; i < nargs; i++)
-	  rtas->args[i] = (rtas_arg_t)LONG_LSW(va_arg(list, ulong));
-	va_end(list);
-
-        enter_rtas(rtas);	
-}
-
-void
-phys_call_rtas_display_status(char c)
+call_rtas_display_status(char c)
 {
-	unsigned long offset = reloc_offset();
-	struct rtas_args *rtas = PTRRELOC(&(get_paca()->xRtas));
-
-	rtas->token = 10;
-	rtas->nargs = 1;
-	rtas->nret  = 1;
-	rtas->rets  = (rtas_arg_t *)PTRRELOC(&(rtas->args[1]));
-	rtas->args[0] = (int)c;
+	struct rtas_args *args = &(get_paca()->xRtas);
+	unsigned long s;
 
-	enter_rtas(rtas);	
-}
+	spin_lock_irqsave(&rtas.lock, s);
 
-void
-call_rtas_display_status(char c)
-{
-	struct rtas_args *rtas = &(get_paca()->xRtas);
+	args->token = 10;
+	args->nargs = 1;
+	args->nret  = 1;
+	args->rets  = (rtas_arg_t *)&(args->args[1]);
+	args->args[0] = (int)c;
 
-	rtas->token = 10;
-	rtas->nargs = 1;
-	rtas->nret  = 1;
-	rtas->rets  = (rtas_arg_t *)&(rtas->args[1]);
-	rtas->args[0] = (int)c;
+	enter_rtas((void *)__pa((unsigned long)args));	
 
-	enter_rtas((void *)__pa((unsigned long)rtas));	
+	spin_unlock_irqrestore(&rtas.lock, s);
 }
 
 int
@@ -127,8 +96,9 @@ rtas_token(const char *service)
 	return tokp ? *tokp : RTAS_UNKNOWN_SERVICE;
 }
 
-void
-log_rtas_error(struct rtas_args	*rtas_args)
+
+static int
+__log_rtas_error(struct rtas_args *rtas_args)
 {
 	struct rtas_args err_args, temp_args;
 
@@ -147,13 +117,24 @@ log_rtas_error(struct rtas_args	*rtas_ar
 	PPCDBG(PPCDBG_RTAS, "\tentering rtas with 0x%lx\n",
 	       (void *)__pa((unsigned long)&err_args));
 	enter_rtas((void *)__pa((unsigned long)&get_paca()->xRtas));
-	PPCDBG(PPCDBG_RTAS, "\treturned from rtas ...\n");
-
+	PPCDBG(PPCDBG_RTAS, "\treturned from rtas ...\n");	
 
 	err_args = get_paca()->xRtas;
 	get_paca()->xRtas = temp_args;
 
-	if (err_args.rets[0] == 0)
+	return err_args.rets[0];
+}
+
+void
+log_rtas_error(struct rtas_args	*rtas_args)
+{
+	unsigned long s;
+	int rc;
+
+	spin_lock_irqsave(&rtas.lock, s);
+	rc = __log_rtas_error(rtas_args);
+	spin_unlock_irqrestore(&rtas.lock, s);
+	if (rc == 0)
 		log_error(rtas_err_buf, ERR_TYPE_RTAS_LOG, 0);
 }
 
@@ -162,9 +143,10 @@ rtas_call(int token, int nargs, int nret
 	  unsigned long *outputs, ...)
 {
 	va_list list;
-	int i;
+	int i, logit = 0;
 	unsigned long s;
 	struct rtas_args *rtas_args = &(get_paca()->xRtas);
+	long ret;
 
 	PPCDBG(PPCDBG_RTAS, "Entering rtas_call\n");
 	PPCDBG(PPCDBG_RTAS, "\ttoken    = 0x%x\n", token);
@@ -174,6 +156,9 @@ rtas_call(int token, int nargs, int nret
 	if (token == RTAS_UNKNOWN_SERVICE)
 		return -1;
 
+	/* Gotta do something different here, use global lock for now... */
+	spin_lock_irqsave(&rtas.lock, s);
+
 	rtas_args->token = token;
 	rtas_args->nargs = nargs;
 	rtas_args->nret  = nret;
@@ -186,26 +171,16 @@ rtas_call(int token, int nargs, int nret
 	va_end(list);
 
 	for (i = 0; i < nret; ++i)
-	  rtas_args->rets[i] = 0;
+		rtas_args->rets[i] = 0;
 
-#if 0   /* Gotta do something different here, use global lock for now... */
-	spin_lock_irqsave(&rtas_args->lock, s);
-#else
-	spin_lock_irqsave(&rtas.lock, s);
-#endif
 	PPCDBG(PPCDBG_RTAS, "\tentering rtas with 0x%lx\n",
 		(void *)__pa((unsigned long)rtas_args));
 	enter_rtas((void *)__pa((unsigned long)rtas_args));
 	PPCDBG(PPCDBG_RTAS, "\treturned from rtas ...\n");
 
 	if (rtas_args->rets[0] == -1)
-		log_rtas_error(rtas_args);
+		logit = (__log_rtas_error(rtas_args) == 0);
 
-#if 0   /* Gotta do something different here, use global lock for now... */
-	spin_unlock_irqrestore(&rtas_args->lock, s);
-#else
-	spin_unlock_irqrestore(&rtas.lock, s);
-#endif
 	ifppcdebug(PPCDBG_RTAS) {
 		for(i=0; i < nret ;i++)
 			udbg_printf("\tnret[%d] = 0x%lx\n", i, (ulong)rtas_args->rets[i]);
@@ -214,7 +189,15 @@ rtas_call(int token, int nargs, int nret
 	if (nret > 1 && outputs != NULL)
 		for (i = 0; i < nret-1; ++i)
 			outputs[i] = rtas_args->rets[i+1];
-	return (ulong)((nret > 0) ? rtas_args->rets[0] : 0);
+	ret = (ulong)((nret > 0) ? rtas_args->rets[0] : 0);
+
+	/* Gotta do something different here, use global lock for now... */
+	spin_unlock_irqrestore(&rtas.lock, s);
+
+	if (logit)
+		log_error(rtas_err_buf, ERR_TYPE_RTAS_LOG, 0);
+
+	return ret;
 }
 
 /* Given an RTAS status code of 990n compute the hinted delay of 10^n
@@ -448,6 +431,27 @@ rtas_halt(void)
         rtas_power_off();
 }
 
+/* Must be in the RMO region, so we place it here */
+static char rtas_os_term_buf[2048];
+
+void rtas_os_term(char *str)
+{
+	long status;
+
+	snprintf(rtas_os_term_buf, 2048, "OS panic: %s", str);
+
+	do {
+		status = rtas_call(rtas_token("ibm,os-term"), 1, 1, NULL,
+				   __pa(rtas_os_term_buf));
+
+		if (status == RTAS_BUSY)
+			udelay(1);
+		else if (status != 0)
+			printk(KERN_EMERG "ibm,os-term call failed %ld\n",
+			       status);
+	} while (status == RTAS_BUSY);
+}
+
 unsigned long rtas_rmo_buf = 0;
 
 asmlinkage int ppc_rtas(struct rtas_args __user *uargs)
@@ -479,12 +483,12 @@ asmlinkage int ppc_rtas(struct rtas_args
 	enter_rtas((void *)__pa((unsigned long)&get_paca()->xRtas));
 	args = get_paca()->xRtas;
 
+	spin_unlock_irqrestore(&rtas.lock, flags);
+
 	args.rets  = (rtas_arg_t *)&(args.args[nargs]);
 	if (args.rets[0] == -1)
 		log_rtas_error(&args);
 
-	spin_unlock_irqrestore(&rtas.lock, flags);
-
 	/* Copy out args. */
 	if (copy_to_user(uargs->args + nargs,
 			 args.args + nargs,
@@ -494,6 +498,28 @@ asmlinkage int ppc_rtas(struct rtas_args
 	return 0;
 }
 
+#ifdef CONFIG_HOTPLUG_CPU
+/* This version can't take the spinlock. */
+
+void rtas_stop_self(void)
+{
+	struct rtas_args *rtas_args = &(get_paca()->xRtas);
+
+	local_irq_disable();
+
+	rtas_args->token = rtas_token("stop-self");
+	BUG_ON(rtas_args->token == RTAS_UNKNOWN_SERVICE);
+	rtas_args->nargs = 0;
+	rtas_args->nret  = 1;
+	rtas_args->rets  = &(rtas_args->args[0]);
+
+	printk("%u %u Ready to die...\n",
+	       smp_processor_id(), hard_smp_processor_id());
+	enter_rtas((void *)__pa(rtas_args));
+
+	panic("Alas, I survived.\n");
+}
+#endif /* CONFIG_HOTPLUG_CPU */
 
 EXPORT_SYMBOL(rtas_firmware_flash_list);
 EXPORT_SYMBOL(rtas_token);
--- diff/arch/ppc64/kernel/rtasd.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/rtasd.c	2004-04-21 10:45:33.785567312 +0100
@@ -78,7 +78,7 @@ static void printk_log_rtas(char *buf, i
 	char buffer[64];
 	char * str = "RTAS event";
 
-	printk(RTAS_ERR "%d -------- %s begin --------\n", error_log_cnt, str);
+	printk(RTAS_DEBUG "%d -------- %s begin --------\n", error_log_cnt, str);
 
 	/*
 	 * Print perline bytes on each line, each line will start
@@ -99,12 +99,12 @@ static void printk_log_rtas(char *buf, i
 		n += sprintf(buffer+n, "%02x", (unsigned char)buf[i]);
 
 		if (j == (perline-1))
-			printk(KERN_ERR "%s\n", buffer);
+			printk(KERN_DEBUG "%s\n", buffer);
 	}
 	if ((i % perline) != 0)
-		printk(KERN_ERR "%s\n", buffer);
+		printk(KERN_DEBUG "%s\n", buffer);
 
-	printk(RTAS_ERR "%d -------- %s end ----------\n", error_log_cnt, str);
+	printk(RTAS_DEBUG "%d -------- %s end ----------\n", error_log_cnt, str);
 }
 
 static int log_rtas_len(char * buf)
@@ -119,10 +119,11 @@ static int log_rtas_len(char * buf)
 
 		/* extended header */
 		len += err->extended_log_length;
-
-		if (len > RTAS_ERROR_LOG_MAX)
-			len = RTAS_ERROR_LOG_MAX;
 	}
+
+	if (len > rtas_error_log_max)
+		len = rtas_error_log_max;
+
 	return len;
 }
 
@@ -330,6 +331,10 @@ static int get_eventscan_parms(void)
 		printk(KERN_ERR "rtasd: truncated error log from %d to %d bytes\n", rtas_error_log_max, RTAS_ERROR_LOG_MAX);
 		rtas_error_log_max = RTAS_ERROR_LOG_MAX;
 	}
+
+	/* Make room for the sequence number */
+	rtas_error_log_buffer_max = rtas_error_log_max + sizeof(int);
+
 	of_node_put(node);
 
 	return 0;
@@ -405,8 +410,7 @@ static int rtasd(void *unused)
 
 	if (surveillance_timeout != -1) {
 		DEBUG("enabling surveillance\n");
-		if (enable_surveillance(surveillance_timeout))
-			goto error_vfree;
+		enable_surveillance(surveillance_timeout);
 		DEBUG("surveillance enabled\n");
 	}
 
@@ -430,10 +434,6 @@ static int rtasd(void *unused)
 			cpu = first_cpu_const(mk_cpumask_const(cpu_online_map));
 	}
 
-error_vfree:
-	if (rtas_log_buf)
-		vfree(rtas_log_buf);
-	rtas_log_buf = NULL;
 error:
 	/* Should delete proc entries */
 	return -EINVAL;
@@ -459,9 +459,6 @@ static int __init rtas_init(void)
 	if (kernel_thread(rtasd, 0, CLONE_FS) < 0)
 		printk(KERN_ERR "Failed to start RTAS daemon\n");
 
-	/* Make room for the sequence number */
-	rtas_error_log_buffer_max = rtas_error_log_max + sizeof(int);
-
 	return 0;
 }
 
--- diff/arch/ppc64/kernel/semaphore.c	2003-10-09 09:47:16.000000000 +0100
+++ source/arch/ppc64/kernel/semaphore.c	2004-04-21 10:45:33.785567312 +0100
@@ -17,6 +17,7 @@
  */
 
 #include <linux/sched.h>
+#include <linux/init.h>
 #include <asm/atomic.h>
 #include <asm/semaphore.h>
 #include <asm/errno.h>
@@ -70,7 +71,7 @@ void __up(struct semaphore *sem)
  * Thus it is only when we decrement count from some value > 0
  * that we have actually got the semaphore.
  */
-void __down(struct semaphore *sem)
+void __sched __down(struct semaphore *sem)
 {
 	struct task_struct *tsk = current;
 	DECLARE_WAITQUEUE(wait, tsk);
@@ -99,7 +100,7 @@ void __down(struct semaphore *sem)
 	wake_up(&sem->wait);
 }
 
-int __down_interruptible(struct semaphore * sem)
+int __sched __down_interruptible(struct semaphore * sem)
 {
 	int retval = 0;
 	struct task_struct *tsk = current;
--- diff/arch/ppc64/kernel/setup.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/setup.c	2004-04-21 10:45:33.786567160 +0100
@@ -25,6 +25,8 @@
 #include <linux/version.h>
 #include <linux/tty.h>
 #include <linux/root_dev.h>
+#include <linux/notifier.h>
+#include <linux/cpu.h>
 #include <asm/io.h>
 #include <asm/prom.h>
 #include <asm/processor.h>
@@ -93,6 +95,13 @@ unsigned long SYSRQ_KEY;
 
 struct machdep_calls ppc_md;
 
+static int ppc64_panic_event(struct notifier_block *, unsigned long, void *);
+
+static struct notifier_block ppc64_panic_block = {
+	notifier_call: ppc64_panic_event,
+	priority: INT_MIN /* may not return; must be done last */
+};
+
 /*
  * Perhaps we can put the pmac screen_info[] here
  * on pmac as well so we don't need the ifdef's.
@@ -215,6 +224,7 @@ void setup_system(unsigned long r3, unsi
 	if (systemcfg->platform & PLATFORM_PSERIES) {
 		early_console_initialized = 1;
 		register_console(&udbg_console);
+		__irq_offset_value = NUM_ISA_INTERRUPTS;
 		finish_device_tree();
 		chrp_init(r3, r4, r5, r6, r7);
 
@@ -318,6 +328,14 @@ EXPORT_SYMBOL(machine_halt);
 unsigned long ppc_proc_freq;
 unsigned long ppc_tb_freq;
 
+static int ppc64_panic_event(struct notifier_block *this,
+                             unsigned long event, void *ptr)
+{
+	ppc_md.panic((char *)ptr);  /* May not return */
+	return NOTIFY_DONE;
+}
+
+
 #ifdef CONFIG_SMP
 DEFINE_PER_CPU(unsigned int, pvr);
 #endif
@@ -338,8 +356,13 @@ static int show_cpuinfo(struct seq_file 
 		return 0;
 	}
 
-	if (!cpu_online(cpu_id))
+	/* We only show online cpus: disable preempt (overzealous, I
+	 * knew) to prevent cpu going down. */
+	preempt_disable();
+	if (!cpu_online(cpu_id)) {
+		preempt_enable();
 		return 0;
+	}
 
 #ifdef CONFIG_SMP
 	pvr = per_cpu(pvr, cpu_id);
@@ -372,7 +395,8 @@ static int show_cpuinfo(struct seq_file 
 		   ppc_proc_freq % 1000000);
 
 	seq_printf(m, "revision\t: %hd.%hd\n\n", maj, min);
-	
+
+	preempt_enable();
 	return 0;
 }
 
@@ -598,6 +622,9 @@ void __init setup_arch(char **cmdline_p)
 	/* reboot on panic */
 	panic_timeout = 180;
 
+	if (ppc_md.panic)
+		notifier_chain_register(&panic_notifier_list, &ppc64_panic_block);
+
 	init_mm.start_code = PAGE_OFFSET;
 	init_mm.end_code = (unsigned long) _etext;
 	init_mm.end_data = (unsigned long) _edata;
--- diff/arch/ppc64/kernel/signal.c	2004-02-09 10:36:09.000000000 +0000
+++ source/arch/ppc64/kernel/signal.c	2004-04-21 10:45:33.786567160 +0100
@@ -115,7 +115,7 @@ long sys_sigaltstack(const stack_t *uss,
  * Set up the sigcontext for the signal frame.
  */
 
-static int setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs,
+static long setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs,
 		 int signr, sigset_t *set, unsigned long handler)
 {
 	/* When CONFIG_ALTIVEC is set, we _always_ setup v_regs even if the
@@ -129,7 +129,7 @@ static int setup_sigcontext(struct sigco
 #ifdef CONFIG_ALTIVEC
 	elf_vrreg_t *v_regs = (elf_vrreg_t *)(((unsigned long)sc->vmx_reserve) & ~0xful);
 #endif
-	int err = 0;
+	long err = 0;
 
 	if (regs->msr & MSR_FP)
 		giveup_fpu(current);
@@ -173,18 +173,32 @@ static int setup_sigcontext(struct sigco
  * Restore the sigcontext from the signal frame.
  */
 
-static int restore_sigcontext(struct pt_regs *regs, sigset_t *set, int sig, struct sigcontext *sc)
+static long restore_sigcontext(struct pt_regs *regs, sigset_t *set, int sig,
+			      struct sigcontext *sc)
 {
 #ifdef CONFIG_ALTIVEC
 	elf_vrreg_t *v_regs;
 #endif
-	unsigned int err = 0;
+	unsigned long err = 0;
 	unsigned long save_r13;
+	elf_greg_t *gregs = (elf_greg_t *)regs;
+	int i;
 
 	/* If this is not a signal return, we preserve the TLS in r13 */
 	if (!sig)
 		save_r13 = regs->gpr[13];
-	err |= __copy_from_user(regs, &sc->gp_regs, GP_REGS_SIZE);
+
+	/* copy everything before MSR */
+	err |= __copy_from_user(regs, &sc->gp_regs,
+				PT_MSR*sizeof(unsigned long));
+
+	/* skip MSR and SOFTE */
+	for (i = PT_MSR+1; i <= PT_RESULT; i++) {
+		if (i == PT_SOFTE)
+			continue;
+		err |= __get_user(gregs[i], &sc->gp_regs[i]);
+	}
+
 	if (!sig)
 		regs->gpr[13] = save_r13;
 	err |= __copy_from_user(&current->thread.fpr, &sc->fp_regs, FP_REGS_SIZE);
@@ -235,9 +249,10 @@ static inline void * get_sigframe(struct
 /*
  * Setup the trampoline code on the stack
  */
-static int setup_trampoline(unsigned int syscall, unsigned int *tramp)
+static long setup_trampoline(unsigned int syscall, unsigned int *tramp)
 {
-	int i, err = 0;
+	int i;
+	long err = 0;
 
 	/* addi r1, r1, __SIGNAL_FRAMESIZE  # Pop the dummy stackframe */
 	err |= __put_user(0x38210000UL | (__SIGNAL_FRAMESIZE & 0xffff), &tramp[0]);
@@ -372,7 +387,7 @@ static void setup_rt_frame(int signr, st
 	func_descr_t *funct_desc_ptr;
 	struct rt_sigframe *frame;
 	unsigned long newsp = 0;
-	int err = 0;
+	long err = 0;
 
 	frame = get_sigframe(ka, regs, sizeof(*frame));
 
--- diff/arch/ppc64/kernel/signal32.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/ppc64/kernel/signal32.c	2004-04-21 10:45:33.787567008 +0100
@@ -185,25 +185,28 @@ static int save_user_regs(struct pt_regs
  * Restore the current user register values from the user stack,
  * (except for MSR).
  */
-static int restore_user_regs(struct pt_regs *regs, struct mcontext32 __user *sr, int sig)
+static long restore_user_regs(struct pt_regs *regs,
+			      struct mcontext32 __user *sr, int sig)
 {
 	elf_greg_t64 *gregs = (elf_greg_t64 *)regs;
-	int i, err = 0;
+	int i;
+	long err = 0;
 	unsigned int save_r2;
 #ifdef CONFIG_ALTIVEC
 	unsigned long msr;
 #endif
 
 	/*
-	 * restore general registers but not including MSR. Also take
-	 * care of keeping r2 (TLS) intact if not a signal
+	 * restore general registers but not including MSR or SOFTE. Also
+	 * take care of keeping r2 (TLS) intact if not a signal
 	 */
 	if (!sig)
 		save_r2 = (unsigned int)regs->gpr[2];
-	for (i = 0; i < PT_MSR; i ++)
-		err |= __get_user(gregs[i], &sr->mc_gregs[i]);
-	for (i ++; i <= PT_RESULT; i ++)
+	for (i = 0; i <= PT_RESULT; i++) {
+		if ((i == PT_MSR) || (i == PT_SOFTE))
+			continue;
 		err |= __get_user(gregs[i], &sr->mc_gregs[i]);
+	}
 	if (!sig)
 		regs->gpr[2] = (unsigned long) save_r2;
 	if (err)
@@ -427,44 +430,53 @@ long sys32_rt_sigpending(compat_sigset_t
 }
 
 
-static int copy_siginfo_to_user32(compat_siginfo_t *d, siginfo_t *s)
+static long copy_siginfo_to_user32(compat_siginfo_t *d, siginfo_t *s)
 {
-	int err;
+	long err;
 
 	if (!access_ok (VERIFY_WRITE, d, sizeof(*d)))
 		return -EFAULT;
 
+	/* If you change siginfo_t structure, please be sure
+	 * this code is fixed accordingly.
+	 * It should never copy any pad contained in the structure
+	 * to avoid security leaks, but must copy the generic
+	 * 3 ints plus the relevant union member.
+	 * This routine must convert siginfo from 64bit to 32bit as well
+	 * at the same time.
+	 */
 	err = __put_user(s->si_signo, &d->si_signo);
 	err |= __put_user(s->si_errno, &d->si_errno);
 	err |= __put_user((short)s->si_code, &d->si_code);
-	if (s->si_signo >= SIGRTMIN) {
+	if (s->si_code < 0)
+		err |= __copy_to_user(&d->_sifields._pad, &s->_sifields._pad,
+				      SI_PAD_SIZE32);
+	else switch(s->si_code >> 16) {
+	case __SI_CHLD >> 16:
 		err |= __put_user(s->si_pid, &d->si_pid);
 		err |= __put_user(s->si_uid, &d->si_uid);
+		err |= __put_user(s->si_utime, &d->si_utime);
+		err |= __put_user(s->si_stime, &d->si_stime);
+		err |= __put_user(s->si_status, &d->si_status);
+		break;
+	case __SI_FAULT >> 16:
+		err |= __put_user((unsigned int)(unsigned long)s->si_addr,
+				  &d->si_addr);
+		break;
+	case __SI_POLL >> 16:
+	case __SI_TIMER >> 16:
+		err |= __put_user(s->si_band, &d->si_band);
+		err |= __put_user(s->si_fd, &d->si_fd);
+		break;
+	case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
+	case __SI_MESGQ >> 16:
 		err |= __put_user(s->si_int, &d->si_int);
-	} else {
-		switch (s->si_signo) {
-		/* XXX: What about POSIX1.b timers */
-		case SIGCHLD:
-			err |= __put_user(s->si_pid, &d->si_pid);
-			err |= __put_user(s->si_status, &d->si_status);
-			err |= __put_user(s->si_utime, &d->si_utime);
-			err |= __put_user(s->si_stime, &d->si_stime);
-			break;
-		case SIGSEGV:
-		case SIGBUS:
-		case SIGFPE:
-		case SIGILL:
-			err |= __put_user((long)(s->si_addr), &d->si_addr);
-	        break;
-		case SIGPOLL:
-			err |= __put_user(s->si_band, &d->si_band);
-			err |= __put_user(s->si_fd, &d->si_fd);
-			break;
-		default:
-			err |= __put_user(s->si_pid, &d->si_pid);
-			err |= __put_user(s->si_uid, &d->si_uid);
-			break;
-		}
+		/* fallthrough */
+	case __SI_KILL >> 16:
+	default:
+		err |= __put_user(s->si_pid, &d->si_pid);
+		err |= __put_user(s->si_uid, &d->si_uid);
+		break;
 	}
 	return err;
 }
@@ -495,45 +507,6 @@ long sys32_rt_sigtimedwait(compat_sigset
 	return ret;
 }
 
-
-
-static siginfo_t * siginfo32to64(siginfo_t *d, compat_siginfo_t *s)
-{
-	d->si_signo = s->si_signo;
-	d->si_errno = s->si_errno;
-	d->si_code = s->si_code;
-	if (s->si_signo >= SIGRTMIN) {
-		d->si_pid = s->si_pid;
-		d->si_uid = s->si_uid;
-		d->si_int = s->si_int;
-	} else {
-		switch (s->si_signo) {
-		/* XXX: What about POSIX1.b timers */
-		case SIGCHLD:
-			d->si_pid = s->si_pid;
-			d->si_status = s->si_status;
-			d->si_utime = s->si_utime;
-			d->si_stime = s->si_stime;
-			break;
-		case SIGSEGV:
-		case SIGBUS:
-		case SIGFPE:
-		case SIGILL:
-			d->si_addr = (void *)A(s->si_addr);
-	  		break;
-		case SIGPOLL:
-			d->si_band = s->si_band;
-			d->si_fd = s->si_fd;
-			break;
-		default:
-			d->si_pid = s->si_pid;
-			d->si_uid = s->si_uid;
-			break;
-		}
-	}
-	return d;
-}
-
 /*
  * Note: it is necessary to treat pid and sig as unsigned ints, with the
  * corresponding cast to a signed int to insure that the proper conversion
@@ -544,15 +517,12 @@ static siginfo_t * siginfo32to64(siginfo
 long sys32_rt_sigqueueinfo(u32 pid, u32 sig, compat_siginfo_t *uinfo)
 {
 	siginfo_t info;
-	compat_siginfo_t info32;
 	int ret;
 	mm_segment_t old_fs = get_fs();
 	
-	if (copy_from_user (&info32, uinfo, sizeof(compat_siginfo_t)))
+	if (copy_from_user (&info, uinfo, 3*sizeof(int)) ||
+	    copy_from_user (info._sifields._pad, uinfo->_sifields._pad, SI_PAD_SIZE32))
 		return -EFAULT;
-    	/* XXX: Is this correct? */
-	siginfo32to64(&info, &info32);
-
 	set_fs (KERNEL_DS);
 	ret = sys_rt_sigqueueinfo((int)pid, (int)sig, &info);
 	set_fs (old_fs);
--- diff/arch/ppc64/kernel/smp.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/smp.c	2004-04-21 10:45:33.788566856 +0100
@@ -230,10 +230,237 @@ static void __devinit smp_openpic_setup_
 	do_openpic_setup_cpu();
 }
 
+#ifdef CONFIG_HOTPLUG_CPU
+/* Get state of physical CPU.
+ * Return codes:
+ *	0	- The processor is in the RTAS stopped state
+ *	1	- stop-self is in progress
+ *	2	- The processor is not in the RTAS stopped state
+ *	-1	- Hardware Error
+ *	-2	- Hardware Busy, Try again later.
+ */
+static int query_cpu_stopped(unsigned int pcpu)
+{
+	long cpu_status;
+	int status, qcss_tok;
+
+	qcss_tok = rtas_token("query-cpu-stopped-state");
+	BUG_ON(qcss_tok == RTAS_UNKNOWN_SERVICE);
+	status = rtas_call(qcss_tok, 1, 2, &cpu_status, pcpu);
+	if (status != 0) {
+		printk(KERN_ERR
+		       "RTAS query-cpu-stopped-state failed: %i\n", status);
+		return status;
+	}
+
+	return cpu_status;
+}
+
+int __cpu_disable(void)
+{
+	/* FIXME: go put this in a header somewhere */
+	extern void xics_migrate_irqs_away(void);
+
+	systemcfg->processorCount--;
+
+	/*fix boot_cpuid here*/
+	if (smp_processor_id() == boot_cpuid)
+		boot_cpuid = any_online_cpu(cpu_online_map);
+
+	/* FIXME: abstract this to not be platform specific later on */
+	xics_migrate_irqs_away();
+	return 0;
+}
+
+void __cpu_die(unsigned int cpu)
+{
+	int tries;
+	int cpu_status;
+	unsigned int pcpu = get_hard_smp_processor_id(cpu);
+
+	for (tries = 0; tries < 5; tries++) {
+		cpu_status = query_cpu_stopped(pcpu);
+
+		if (cpu_status == 0)
+			break;
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(HZ);
+	}
+	if (cpu_status != 0) {
+		printk("Querying DEAD? cpu %i (%i) shows %i\n",
+		       cpu, pcpu, cpu_status);
+	}
+
+	/* Isolation and deallocation are definatly done by
+	 * drslot_chrp_cpu.  If they were not they would be
+	 * done here.  Change isolate state to Isolate and
+	 * change allocation-state to Unusable.
+	 */
+	paca[cpu].xProcStart = 0;
+
+	/* So we can recognize if it fails to come up next time. */
+	cpu_callin_map[cpu] = 0;
+}
+
+/* Kill this cpu */
+void cpu_die(void)
+{
+	local_irq_disable();
+	rtas_stop_self();
+	/* Should never get here... */
+	BUG();
+	for(;;);
+}
+
+/* Search all cpu device nodes for an offline logical cpu.  If a
+ * device node has a "ibm,my-drc-index" property (meaning this is an
+ * LPAR), paranoid-check whether we own the cpu.  For each "thread"
+ * of a cpu, if it is offline and has the same hw index as before,
+ * grab that in preference.
+ */
+static unsigned int find_physical_cpu_to_start(unsigned int old_hwindex)
+{
+	struct device_node *np = NULL;
+	unsigned int best = -1U;
+
+	while ((np = of_find_node_by_type(np, "cpu"))) {
+		int nr_threads, len;
+		u32 *index = (u32 *)get_property(np, "ibm,my-drc-index", NULL);
+		u32 *tid = (u32 *)
+			get_property(np, "ibm,ppc-interrupt-server#s", &len);
+
+		if (!tid)
+			tid = (u32 *)get_property(np, "reg", &len);
+
+		if (!tid)
+			continue;
+
+		/* If there is a drc-index, make sure that we own
+		 * the cpu.
+		 */
+		if (index) {
+			int state;
+			int rc = rtas_get_sensor(9003, *index, &state);
+			if (rc != 0 || state != 1)
+				continue;
+		}
+
+		nr_threads = len / sizeof(u32);
+
+		while (nr_threads--) {
+			if (0 == query_cpu_stopped(tid[nr_threads])) {
+				best = tid[nr_threads];
+				if (best == old_hwindex)
+					goto out;
+			}
+		}
+	}
+out:
+	of_node_put(np);
+	return best;
+}
+
+/**
+ * smp_startup_cpu() - start the given cpu
+ *
+ * At boot time, there is nothing to do.  At run-time, call RTAS with
+ * the appropriate start location, if the cpu is in the RTAS stopped
+ * state.
+ *
+ * Returns:
+ *	0	- failure
+ *	1	- success
+ */
+static inline int __devinit smp_startup_cpu(unsigned int lcpu)
+{
+	int status;
+	extern void (*pseries_secondary_smp_init)(unsigned int cpu);
+	unsigned long start_here = __pa(pseries_secondary_smp_init);
+	unsigned int pcpu;
+
+	/* At boot time the cpus are already spinning in hold
+	 * loops, so nothing to do. */
+ 	if (system_state == SYSTEM_BOOTING)
+		return 1;
+
+	pcpu = find_physical_cpu_to_start(get_hard_smp_processor_id(lcpu));
+	if (pcpu == -1U) {
+		printk(KERN_INFO "No more cpus available, failing\n");
+		return 0;
+	}
+
+	/* Fixup atomic count: it exited inside IRQ handler. */
+	((struct task_struct *)paca[lcpu].xCurrent)->thread_info->preempt_count
+		= 0;
+	/* Fixup SLB round-robin so next segment (kernel) goes in segment 0 */
+	paca[lcpu].xStab_data.next_round_robin = 0;
+
+	/* At boot this is done in prom.c. */
+	paca[lcpu].xHwProcNum = pcpu;
+
+	status = rtas_call(rtas_token("start-cpu"), 3, 1, NULL,
+			   pcpu, start_here, lcpu);
+	if (status != 0) {
+		printk(KERN_ERR "start-cpu failed: %i\n", status);
+		return 0;
+	}
+	return 1;
+}
+
+static inline void look_for_more_cpus(void)
+{
+	int num_addr_cell, num_size_cell, len, i, maxcpus;
+	struct device_node *np;
+	unsigned int *ireg;
+
+	/* Find the property which will tell us about how many CPUs
+	 * we're allowed to have. */
+	if ((np = find_path_device("/rtas")) == NULL) {
+		printk(KERN_ERR "Could not find /rtas in device tree!");
+		return;
+	}
+	num_addr_cell = prom_n_addr_cells(np);
+	num_size_cell = prom_n_size_cells(np);
+
+	ireg = (unsigned int *)get_property(np, "ibm,lrdr-capacity", &len);
+	if (ireg == NULL) {
+		/* FIXME: make sure not marked as lrdr_capable() */
+		return;
+	}
+
+	maxcpus = ireg[num_addr_cell + num_size_cell];
+	/* DRENG need to account for threads here too */
+
+	if (maxcpus > NR_CPUS) {
+		printk(KERN_WARNING
+		       "Partition configured for %d cpus, "
+		       "operating system maximum is %d.\n", maxcpus, NR_CPUS);
+		maxcpus = NR_CPUS;
+	} else
+		printk(KERN_INFO "Partition configured for %d cpus.\n",
+		       maxcpus);
+
+	/* Make those cpus (which might appear later) possible too. */
+	for (i = 0; i < maxcpus; i++)
+		cpu_set(i, cpu_possible_map);
+}
+#else /* ... CONFIG_HOTPLUG_CPU */
+static inline int __devinit smp_startup_cpu(unsigned int lcpu)
+{
+	return 1;
+}
+static inline void look_for_more_cpus(void)
+{
+}
+#endif /* CONFIG_HOTPLUG_CPU */
+
 static void smp_pSeries_kick_cpu(int nr)
 {
 	BUG_ON(nr < 0 || nr >= NR_CPUS);
 
+	if (!smp_startup_cpu(nr))
+		return;
+
 	/* The processor is currently spinning, waiting
 	 * for the xProcStart field to become non-zero
 	 * After we set xProcStart, the processor will
@@ -241,7 +468,7 @@ static void smp_pSeries_kick_cpu(int nr)
 	 */
 	paca[nr].xProcStart = 1;
 }
-#endif
+#endif /* CONFIG_PPC_PSERIES */
 
 static void __init smp_space_timers(unsigned int max_cpus)
 {
@@ -462,12 +689,9 @@ int smp_call_function (void (*func) (voi
 		       int wait)
 { 
 	struct call_data_struct data;
-	int ret = -1, cpus = num_online_cpus()-1;
+	int ret = -1, cpus;
 	unsigned long timeout;
 
-	if (!cpus)
-		return 0;
-
 	data.func = func;
 	data.info = info;
 	atomic_set(&data.started, 0);
@@ -476,6 +700,14 @@ int smp_call_function (void (*func) (voi
 		atomic_set(&data.finished, 0);
 
 	spin_lock(&call_lock);
+	/* Must grab online cpu count with preempt disabled, otherwise
+	 * it can change. */
+	cpus = num_online_cpus() - 1;
+	if (!cpus) {
+		ret = 0;
+		goto out;
+	}
+
 	call_data = &data;
 	wmb();
 	/* Send a message to all other CPUs and wait for them to respond */
@@ -565,8 +797,31 @@ static void __devinit smp_store_cpu_info
 	per_cpu(pvr, id) = _get_PVR();
 }
 
+static void __init smp_create_idle(unsigned int cpu)
+{
+	struct pt_regs regs;
+	struct task_struct *p;
+
+	/* create a process for the processor */
+	/* only regs.msr is actually used, and 0 is OK for it */
+	memset(&regs, 0, sizeof(struct pt_regs));
+	p = copy_process(CLONE_VM | CLONE_IDLETASK,
+			 0, &regs, 0, NULL, NULL);
+	if (IS_ERR(p))
+		panic("failed fork for CPU %u: %li", cpu, PTR_ERR(p));
+
+	wake_up_forked_process(p);
+	init_idle(p, cpu);
+	unhash_process(p);
+
+	paca[cpu].xCurrent = (u64)p;
+	current_set[cpu] = p->thread_info;
+}
+
 void __init smp_prepare_cpus(unsigned int max_cpus)
 {
+	unsigned int cpu;
+
 	/* 
 	 * setup_cpu may need to be called on the boot cpu. We havent
 	 * spun any cpus up but lets be paranoid.
@@ -593,6 +848,8 @@ void __init smp_prepare_cpus(unsigned in
 	 * number of msecs off until someone does a settimeofday()
 	 */
 	do_gtod.tb_orig_stamp = tb_last_stamp;
+
+	look_for_more_cpus();
 #endif
 
 	max_cpus = smp_ops->probe();
@@ -601,20 +858,31 @@ void __init smp_prepare_cpus(unsigned in
 	__save_cpu_setup();
 
 	smp_space_timers(max_cpus);
+
+	for_each_cpu(cpu)
+		if (cpu != boot_cpuid)
+			smp_create_idle(cpu);
 }
 
 void __devinit smp_prepare_boot_cpu(void)
 {
-	cpu_set(smp_processor_id(), cpu_online_map);
-	/* FIXME: what about cpu_possible()? */
+	BUG_ON(smp_processor_id() != boot_cpuid);
+
+	/* cpu_possible is set up in prom.c */
+	cpu_set(boot_cpuid, cpu_online_map);
+
+	paca[boot_cpuid].xCurrent = (u64)current;
+	current_set[boot_cpuid] = current->thread_info;
 }
 
 int __devinit __cpu_up(unsigned int cpu)
 {
-	struct pt_regs regs;
-	struct task_struct *p;
 	int c;
 
+	/* At boot, don't bother with non-present cpus -JSCHOPP */
+	if (system_state == SYSTEM_BOOTING && !cpu_present_at_boot(cpu))
+		return -ENOENT;
+
 	paca[cpu].prof_counter = 1;
 	paca[cpu].prof_multiplier = 1;
 	paca[cpu].default_decr = tb_ticks_per_jiffy / decr_overclock;
@@ -632,19 +900,9 @@ int __devinit __cpu_up(unsigned int cpu)
 		paca[cpu].xStab_data.real = virt_to_abs(tmp);
 	}
 
-	/* create a process for the processor */
-	/* only regs.msr is actually used, and 0 is OK for it */
-	memset(&regs, 0, sizeof(struct pt_regs));
-	p = copy_process(CLONE_VM|CLONE_IDLETASK, 0, &regs, 0, NULL, NULL);
-	if (IS_ERR(p))
-		panic("failed fork for CPU %u: %li", cpu, PTR_ERR(p));
-
-	wake_up_forked_process(p);
-	init_idle(p, cpu);
-	unhash_process(p);
-
-	paca[cpu].xCurrent = (u64)p;
-	current_set[cpu] = p->thread_info;
+	/* The information for processor bringup must be written out
+	 * to main store before we release the processor. */
+	mb();
 
 	/* The information for processor bringup must
 	 * be written out to main store before we release
@@ -676,6 +934,7 @@ int __devinit __cpu_up(unsigned int cpu)
 	return 0;
 }
 
+extern unsigned int default_distrib_server;
 /* Activate a secondary processor. */
 int __devinit start_secondary(void *unused)
 {
@@ -698,6 +957,15 @@ int __devinit start_secondary(void *unus
 	if (cur_cpu_spec->firmware_features & FW_FEATURE_SPLPAR) {
 		vpa_init(cpu); 
 	}
+
+#ifdef CONFIG_IRQ_ALL_CPUS
+	/* Put the calling processor into the GIQ.  This is really only
+	 * necessary from a secondary thread as the OF start-cpu interface
+	 * performs this function for us on primary threads.
+	 */
+	/* TODO: 9005 is #defined in rtas-proc.c -- move to a header */
+	rtas_set_indicator(9005, default_distrib_server, 1);
+#endif
 #endif
 
 	local_irq_enable();
@@ -728,71 +996,3 @@ void __init smp_cpus_done(unsigned int m
 
 	set_cpus_allowed(current, old_mask);
 }
-
-#ifdef CONFIG_NUMA
-static struct node node_devices[MAX_NUMNODES];
-
-static void register_nodes(void)
-{
-	int i;
-	int ret;
-
-	for (i = 0; i < MAX_NUMNODES; i++) {
-		if (node_online(i)) {
-			int p_node = parent_node(i);
-			struct node *parent = NULL;
-
-			if (p_node != i)
-				parent = &node_devices[p_node];
-
-			ret = register_node(&node_devices[i], i, parent);
-			if (ret)
-				printk(KERN_WARNING "register_nodes: "
-				       "register_node %d failed (%d)", i, ret);
-		}
-	}
-}
-#else
-static void register_nodes(void)
-{
-	return;
-}
-#endif
-
-/* Only valid if CPU is online. */
-static ssize_t show_physical_id(struct sys_device *dev, char *buf)
-{
-	struct cpu *cpu = container_of(dev, struct cpu, sysdev);
-
-	return sprintf(buf, "%u\n", get_hard_smp_processor_id(cpu->sysdev.id));
-}
-static SYSDEV_ATTR(physical_id, 0444, show_physical_id, NULL);
-
-static DEFINE_PER_CPU(struct cpu, cpu_devices);
-
-static int __init topology_init(void)
-{
-	int cpu;
-	struct node *parent = NULL;
-	int ret;
-
-	register_nodes();
-
-	for_each_cpu(cpu) {
-#ifdef CONFIG_NUMA
-		parent = &node_devices[cpu_to_node(cpu)];
-#endif
-		ret = register_cpu(&per_cpu(cpu_devices, cpu), cpu, parent);
-		if (ret)
-			printk(KERN_WARNING "topology_init: register_cpu %d "
-			       "failed (%d)\n", cpu, ret);
-
-		ret = sysdev_create_file(&per_cpu(cpu_devices, cpu).sysdev,
-					 &attr_physical_id);
-		if (ret)
-			printk(KERN_WARNING "toplogy_init: sysdev_create_file "
-			       "%d failed (%d)\n", cpu, ret);
-	}
-	return 0;
-}
-__initcall(topology_init);
--- diff/arch/ppc64/kernel/traps.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/traps.c	2004-04-21 10:45:33.790566552 +0100
@@ -37,9 +37,6 @@
 #include <asm/processor.h>
 #include <asm/ppcdebug.h>
 
-extern int fix_alignment(struct pt_regs *);
-extern void bad_page_fault(struct pt_regs *, unsigned long, int);
-
 #ifdef CONFIG_PPC_PSERIES
 /* This is true if we are using the firmware NMI handler (typically LPAR) */
 extern int fwnmi_active;
@@ -67,11 +64,17 @@ EXPORT_SYMBOL(__debugger_fault_handler);
 
 static spinlock_t die_lock = SPIN_LOCK_UNLOCKED;
 
-void die(const char *str, struct pt_regs *regs, long err)
+int die(const char *str, struct pt_regs *regs, long err)
 {
 	static int die_counter;
 	int nl = 0;
 
+	if (debugger_fault_handler(regs))
+		return 1;
+
+	if (debugger(regs))
+		return 1;
+
 	console_verbose();
 	spin_lock_irq(&die_lock);
 	bust_spinlocks(1);
@@ -92,6 +95,24 @@ void die(const char *str, struct pt_regs
 	printk("NUMA ");
 	nl = 1;
 #endif
+	switch(systemcfg->platform) {
+		case PLATFORM_PSERIES:
+			printk("PSERIES ");
+			nl = 1;
+			break;
+		case PLATFORM_PSERIES_LPAR:
+			printk("PSERIES LPAR ");
+			nl = 1;
+			break;
+		case PLATFORM_ISERIES_LPAR:
+			printk("ISERIES LPAR ");
+			nl = 1;
+			break;
+		case PLATFORM_POWERMAC:
+			printk("POWERMAC ");
+			nl = 1;
+			break;
+	}
 	if (nl)
 		printk("\n");
 	show_regs(regs);
@@ -108,15 +129,16 @@ void die(const char *str, struct pt_regs
 		panic("Fatal exception");
 	}
 	do_exit(SIGSEGV);
+
+	return 0;
 }
 
 static void
 _exception(int signr, siginfo_t *info, struct pt_regs *regs)
 {
 	if (!user_mode(regs)) {
-		if (debugger(regs))
+		if (die("Exception in kernel mode", regs, signr))
 			return;
-		die("Exception in kernel mode", regs, signr);
 	}
 
 	force_sig_info(signr, info, current);
@@ -170,8 +192,7 @@ SystemResetException(struct pt_regs *reg
 	}
 #endif
 
-	if (!debugger(regs))
-		die("System Reset", regs, 0);
+	die("System Reset", regs, 0);
 
 	/* Must die if the interrupt is not recoverable */
 	if (!(regs->msr & MSR_RI))
@@ -228,9 +249,6 @@ static int recover_mce(struct pt_regs *r
  *
  * On hardware prior to Power 4 these exceptions were asynchronous which
  * means we can't tell exactly where it occurred and so we can't recover.
- *
- * Note that the debugger should test RI=0 and warn the user that system
- * state has been corrupted.
  */
 void
 MachineCheckException(struct pt_regs *regs)
@@ -248,12 +266,11 @@ MachineCheckException(struct pt_regs *re
 	}
 #endif
 
-	if (debugger_fault_handler(regs))
-		return;
-	if (debugger(regs))
-		return;
+	die("Machine check", regs, 0);
 
-	die("Machine check in kernel mode", regs, 0);
+	/* Must die if the interrupt is not recoverable */
+	if (!(regs->msr & MSR_RI))
+		panic("Unrecoverable Machine check");
 }
 
 void
@@ -379,9 +396,6 @@ ProgramCheckException(struct pt_regs *re
 {
 	siginfo_t info;
 
-	if (debugger_fault_handler(regs))
-		return;
-
 	if (regs->msr & 0x100000) {
 		/* IEEE FP exception */
 
@@ -420,16 +434,18 @@ ProgramCheckException(struct pt_regs *re
 	}
 }
 
-void
-KernelFPUnavailableException(struct pt_regs *regs)
+void KernelFPUnavailableException(struct pt_regs *regs)
 {
-	die("Unrecoverable FP Unavailable Exception in Kernel", regs, 0);
+	printk(KERN_EMERG "Unrecoverable FP Unavailable Exception "
+			  "%lx at %lx\n", regs->trap, regs->nip);
+	die("Unrecoverable FP Unavailable Exception", regs, SIGABRT);
 }
 
-void
-KernelAltivecUnavailableException(struct pt_regs *regs)
+void KernelAltivecUnavailableException(struct pt_regs *regs)
 {
-	die("Unrecoverable VMX/Altivec Unavailable Exception in Kernel", regs, 0);
+	printk(KERN_EMERG "Unrecoverable VMX/Altivec Unavailable Exception "
+			  "%lx at %lx\n", regs->trap, regs->nip);
+	die("Unrecoverable VMX/Altivec Unavailable Exception", regs, SIGABRT);
 }
 
 void
@@ -449,16 +465,16 @@ SingleStepException(struct pt_regs *regs
 	_exception(SIGTRAP, &info, regs);	
 }
 
+static void dummy_perf(struct pt_regs *regs)
+{
+}
+
+void (*perf_irq)(struct pt_regs *) = dummy_perf;
+
 void
 PerformanceMonitorException(struct pt_regs *regs)
 {
-	siginfo_t info;
-
-	info.si_signo = SIGTRAP;
-	info.si_errno = 0;
-	info.si_code = TRAP_BRKPT;
-	info.si_addr = 0;
-	_exception(SIGTRAP, &info, regs);
+	perf_irq(regs);
 }
 
 void
@@ -521,7 +537,6 @@ void unrecoverable_exception(struct pt_r
 {
 	printk(KERN_EMERG "Unrecoverable exception %lx at %lx\n",
 	       regs->trap, regs->nip);
-	debugger(regs);
 	die("Unrecoverable exception", regs, SIGABRT);
 }
 
@@ -533,7 +548,6 @@ void kernel_bad_stack(struct pt_regs *re
 {
 	printk(KERN_EMERG "Bad kernel stack pointer %lx at %lx\n",
 	       regs->gpr[1], regs->nip);
-	debugger(regs);
 	die("Bad kernel stack pointer", regs, SIGABRT);
 }
 
--- diff/arch/ppc64/kernel/vio.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/vio.c	2004-04-21 10:45:33.790566552 +0100
@@ -14,7 +14,6 @@
 
 #include <linux/init.h>
 #include <linux/console.h>
-#include <linux/pci.h>
 #include <linux/version.h>
 #include <linux/module.h>
 #include <linux/kobject.h>
@@ -26,7 +25,8 @@
 #include <asm/ppcdebug.h>
 #include <asm/vio.h>
 #include <asm/hvcall.h>
-#include "open_pic.h"
+#include <asm/iSeries/vio.h>
+#include <asm/iSeries/HvCallXm.h>
 
 #define DBGENTER() pr_debug("%s entered\n", __FUNCTION__)
 
@@ -34,9 +34,31 @@ extern struct subsystem devices_subsys; 
 
 struct iommu_table *vio_build_iommu_table(struct vio_dev *dev);
 
+#ifdef CONFIG_PPC_PSERIES
 static int vio_num_address_cells;
+#endif
 static struct vio_dev *vio_bus_device; /* fake "parent" device */
 
+#ifdef CONFIG_PPC_ISERIES
+static struct iommu_table veth_iommu_table;
+static struct iommu_table vio_iommu_table;
+
+static struct vio_dev _veth_dev = {
+	.iommu_table = &veth_iommu_table,
+	.dev.bus = &vio_bus_type
+};
+static struct vio_dev _vio_dev  = {
+	.iommu_table = &vio_iommu_table,
+	.dev.bus = &vio_bus_type
+};
+
+struct vio_dev *iSeries_veth_dev = &_veth_dev;
+struct device *iSeries_vio_dev = &_vio_dev.dev;
+
+EXPORT_SYMBOL(iSeries_veth_dev);
+EXPORT_SYMBOL(iSeries_vio_dev);
+#endif
+
 /* convert from struct device to struct vio_dev and pass to driver.
  * dev->driver has already been set by generic code because vio_bus_match
  * succeeded. */
@@ -119,21 +141,67 @@ const struct vio_device_id * vio_match_d
 {
 	DBGENTER();
 
+#ifdef CONFIG_PPC_PSERIES
 	while (ids->type) {
 		if ((strncmp(dev->archdata->type, ids->type, strlen(ids->type)) == 0) &&
 			device_is_compatible((struct device_node*)dev->archdata, ids->compat))
 			return ids;
 		ids++;
 	}
+#endif
 	return NULL;
 }
 
+#ifdef CONFIG_PPC_ISERIES
+void __init iommu_vio_init(void)
+{
+	struct iommu_table *t;
+	struct iommu_table_cb cb;
+	unsigned long cbp;
+
+	cb.itc_busno = 255;    /* Bus 255 is the virtual bus */
+	cb.itc_virtbus = 0xff; /* Ask for virtual bus */
+
+	cbp = virt_to_abs(&cb);
+	HvCallXm_getTceTableParms(cbp);
+
+	veth_iommu_table.it_size        = cb.itc_size / 2;
+	veth_iommu_table.it_busno       = cb.itc_busno;
+	veth_iommu_table.it_offset      = cb.itc_offset;
+	veth_iommu_table.it_index       = cb.itc_index;
+	veth_iommu_table.it_type        = TCE_VB;
+	veth_iommu_table.it_entrysize	= sizeof(union tce_entry);
+	veth_iommu_table.it_blocksize	= 1;
+
+	t = iommu_init_table(&veth_iommu_table);
+
+	if (!t)
+		printk("Virtual Bus VETH TCE table failed.\n");
+
+	vio_iommu_table.it_size         = cb.itc_size - veth_iommu_table.it_size;
+	vio_iommu_table.it_busno        = cb.itc_busno;
+	vio_iommu_table.it_offset       = cb.itc_offset +
+		veth_iommu_table.it_size * (PAGE_SIZE/sizeof(union tce_entry));
+	vio_iommu_table.it_index        = cb.itc_index;
+	vio_iommu_table.it_type         = TCE_VB;
+	vio_iommu_table.it_entrysize	= sizeof(union tce_entry);
+	vio_iommu_table.it_blocksize	= 1;
+
+	t = iommu_init_table(&vio_iommu_table);
+
+	if (!t)
+		printk("Virtual Bus VIO TCE table failed.\n");
+}
+#endif
+
 /**
  * vio_bus_init: - Initialize the virtual IO bus
  */
 static int __init vio_bus_init(void)
 {
+#ifdef CONFIG_PPC_PSERIES
 	struct device_node *node_vroot, *of_node;
+#endif
 	int err;
 
 	err = bus_register(&vio_bus_type);
@@ -158,6 +226,7 @@ static int __init vio_bus_init(void)
 		return err;
 	}
 
+#ifdef CONFIG_PPC_PSERIES
 	node_vroot = find_devices("vdevice");
 	if ((node_vroot == NULL) || (node_vroot->child == NULL)) {
 		/* this machine doesn't do virtual IO, and that's ok */
@@ -177,6 +246,7 @@ static int __init vio_bus_init(void)
 
 		vio_register_device(of_node);
 	}
+#endif
 
 	return 0;
 }
@@ -184,6 +254,7 @@ static int __init vio_bus_init(void)
 __initcall(vio_bus_init);
 
 
+#ifdef CONFIG_PPC_PSERIES
 /* vio_dev refcount hit 0 */
 static void __devinit vio_dev_release(struct device *dev)
 {
@@ -256,7 +327,7 @@ struct vio_dev * __devinit vio_register_
 			printk(KERN_ERR "Unable to allocate interrupt "
 			       "number for %s\n", of_node->full_name);
 		} else
-			viodev->irq = openpic_to_irq(virq);
+			viodev->irq = irq_offset_up(virq);
 	}
 
 	/* init generic 'struct device' fields: */
@@ -414,146 +485,48 @@ int vio_disable_interrupts(struct vio_de
 	return rc;
 }
 EXPORT_SYMBOL(vio_disable_interrupts);
-
+#endif
 
 dma_addr_t vio_map_single(struct vio_dev *dev, void *vaddr,
-			  size_t size, int direction )
+			  size_t size, enum dma_data_direction direction)
 {
-	struct iommu_table *tbl;
-	dma_addr_t dma_handle = DMA_ERROR_CODE;
-	unsigned long uaddr;
-	unsigned int npages;
-
-	BUG_ON(direction == PCI_DMA_NONE);
-
-	uaddr = (unsigned long)vaddr;
-	npages = PAGE_ALIGN( uaddr + size ) - ( uaddr & PAGE_MASK );
-	npages >>= PAGE_SHIFT;
-
-	tbl = dev->iommu_table;
-
-	if (tbl) {
-		dma_handle = iommu_alloc(tbl, vaddr, npages, direction);
-		dma_handle |= (uaddr & ~PAGE_MASK);
-	}
-
-	return dma_handle;
+	return iommu_map_single(dev->iommu_table, vaddr, size, direction);
 }
 EXPORT_SYMBOL(vio_map_single);
 
 void vio_unmap_single(struct vio_dev *dev, dma_addr_t dma_handle,
-		      size_t size, int direction)
+		      size_t size, enum dma_data_direction direction)
 {
-	struct iommu_table * tbl;
-	unsigned int npages;
-
-	BUG_ON(direction == PCI_DMA_NONE);
-
-	npages = PAGE_ALIGN( dma_handle + size ) - ( dma_handle & PAGE_MASK );
-	npages >>= PAGE_SHIFT;
-
-	tbl = dev->iommu_table;
-	if(tbl)
-		iommu_free(tbl, dma_handle, npages);
+	iommu_unmap_single(dev->iommu_table, dma_handle, size, direction);
 }
 EXPORT_SYMBOL(vio_unmap_single);
 
 int vio_map_sg(struct vio_dev *vdev, struct scatterlist *sglist, int nelems,
-	       int direction)
+	       enum dma_data_direction direction)
 {
-	struct iommu_table *tbl;
-
-	BUG_ON(direction == PCI_DMA_NONE);
-
-	if (nelems == 0)
-		return 0;
-
-	tbl = vdev->iommu_table;
-	if (!tbl)
-		return 0;
-
-	return iommu_alloc_sg(tbl, &vdev->dev, sglist, nelems, direction);
+	return iommu_map_sg(&vdev->dev, vdev->iommu_table, sglist,
+			nelems, direction);
 }
 EXPORT_SYMBOL(vio_map_sg);
 
 void vio_unmap_sg(struct vio_dev *vdev, struct scatterlist *sglist, int nelems,
-		  int direction)
+		  enum dma_data_direction direction)
 {
-	struct iommu_table *tbl;
-
-	BUG_ON(direction == PCI_DMA_NONE);
-
-	tbl = vdev->iommu_table;
-	if (tbl)
-		iommu_free_sg(tbl, sglist, nelems);
+	iommu_unmap_sg(vdev->iommu_table, sglist, nelems, direction);
 }
 EXPORT_SYMBOL(vio_unmap_sg);
 
 void *vio_alloc_consistent(struct vio_dev *dev, size_t size,
 			   dma_addr_t *dma_handle)
 {
-	struct iommu_table * tbl;
-	void *ret = NULL;
-	unsigned int npages, order;
-	dma_addr_t tce;
-
-	size = PAGE_ALIGN(size);
-	npages = size >> PAGE_SHIFT;
-	order = get_order(size);
-
- 	/* Client asked for way to much space.  This is checked later anyway */
-	/* It is easier to debug here for the drivers than in the tce tables.*/
- 	if(order >= IOMAP_MAX_ORDER) {
- 		printk("VIO_DMA: vio_alloc_consistent size to large: 0x%lx \n", size);
- 		return (void *)DMA_ERROR_CODE;
- 	}
-
-	tbl = dev->iommu_table;
-
-	if (tbl) {
-		/* Alloc enough pages (and possibly more) */
-		ret = (void *)__get_free_pages(GFP_ATOMIC, order);
-		if (ret) {
-			/* Page allocation succeeded */
-			memset(ret, 0, npages << PAGE_SHIFT);
-			/* Set up tces to cover the allocated range */
-			tce = iommu_alloc(tbl, ret, npages, PCI_DMA_BIDIRECTIONAL);
-			if (tce == DMA_ERROR_CODE) {
-				PPCDBG(PPCDBG_TCE, "vio_alloc_consistent: iommu_alloc failed\n" );
-				free_pages((unsigned long)ret, order);
-				ret = NULL;
-			} else {
-				*dma_handle = tce;
-			}
-		}
-		else PPCDBG(PPCDBG_TCE, "vio_alloc_consistent: __get_free_pages failed for size = %d\n", size);
-	}
-	else PPCDBG(PPCDBG_TCE, "vio_alloc_consistent: get_iommu_table failed for 0x%016lx\n", dev);
-
-	PPCDBG(PPCDBG_TCE, "\tvio_alloc_consistent: dma_handle = 0x%16.16lx\n", *dma_handle);
-	PPCDBG(PPCDBG_TCE, "\tvio_alloc_consistent: return     = 0x%16.16lx\n", ret);
-	return ret;
+	return iommu_alloc_consistent(dev->iommu_table, size, dma_handle);
 }
 EXPORT_SYMBOL(vio_alloc_consistent);
 
 void vio_free_consistent(struct vio_dev *dev, size_t size,
 			 void *vaddr, dma_addr_t dma_handle)
 {
-	struct iommu_table *tbl;
-	unsigned int npages;
-
-	PPCDBG(PPCDBG_TCE, "vio_free_consistent:\n");
-	PPCDBG(PPCDBG_TCE, "\tdev = 0x%16.16lx, size = 0x%16.16lx, dma_handle = 0x%16.16lx, vaddr = 0x%16.16lx\n", dev, size, dma_handle, vaddr);
-
-	size = PAGE_ALIGN(size);
-	npages = size >> PAGE_SHIFT;
-
-	tbl = dev->iommu_table;
-
-	if ( tbl ) {
-		iommu_free(tbl, dma_handle, npages);
-		free_pages((unsigned long)vaddr, get_order(size));
-	}
+	iommu_free_consistent(dev->iommu_table, size, vaddr, dma_handle);
 }
 EXPORT_SYMBOL(vio_free_consistent);
 
--- diff/arch/ppc64/kernel/vmlinux.lds.S	2004-02-09 10:36:09.000000000 +0000
+++ source/arch/ppc64/kernel/vmlinux.lds.S	2004-04-21 10:45:33.791566400 +0100
@@ -13,6 +13,7 @@ SECTIONS
   /* Read-only sections, merged into text segment: */
   .text : {
 	*(.text .text.*)
+	SCHED_TEXT
 	*(.fixup)
 	. = ALIGN(4096);
 	_etext = .;
--- diff/arch/ppc64/kernel/xics.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/kernel/xics.c	2004-04-21 10:45:33.792566248 +0100
@@ -19,6 +19,7 @@
 #include <linux/init.h>
 #include <linux/gfp.h>
 #include <linux/radix-tree.h>
+#include <linux/cpu.h>
 #include <asm/prom.h>
 #include <asm/io.h>
 #include <asm/pgtable.h>
@@ -58,7 +59,6 @@ struct hw_interrupt_type xics_8259_pic =
 static struct radix_tree_root irq_map = RADIX_TREE_INIT(GFP_KERNEL);
 
 #define XICS_IPI		2
-#define XICS_IRQ_OFFSET		0x10
 #define XICS_IRQ_SPURIOUS	0
 
 /* Want a priority other than 0.  Various HW issues require this. */
@@ -91,7 +91,8 @@ static struct xics_ipl *xics_per_cpu[NR_
 static int xics_irq_8259_cascade = 0;
 static int xics_irq_8259_cascade_real = 0;
 static unsigned int default_server = 0xFF;
-static unsigned int default_distrib_server = 0;
+/* also referenced in smp.c... */
+unsigned int default_distrib_server = 0;
 
 /*
  * XICS only has a single IPI, so encode the messages per CPU
@@ -216,7 +217,7 @@ xics_ops pSeriesLP_ops = {
 
 static unsigned int xics_startup(unsigned int virq)
 {
-	virq -= XICS_IRQ_OFFSET;
+	virq = irq_offset_down(virq);
 	if (radix_tree_insert(&irq_map, virt_irq_to_real(virq),
 			      &virt_irq_to_real_map[virq]) == -ENOMEM)
 		printk(KERN_CRIT "Out of memory creating real -> virtual"
@@ -235,26 +236,54 @@ static unsigned int real_irq_to_virt(uns
 	return ptr - virt_irq_to_real_map;
 }
 
-static void xics_enable_irq(unsigned int virq)
+#ifdef CONFIG_SMP
+static int get_irq_server(unsigned int irq)
 {
-	unsigned int irq;
-	long call_status;
+	cpumask_t cpumask = irq_affinity[irq];
+	cpumask_t allcpus = CPU_MASK_ALL;
+	cpumask_t tmp = CPU_MASK_NONE;
 	unsigned int server;
 
-	virq -= XICS_IRQ_OFFSET;
-	irq = virt_irq_to_real(virq);
-	if (irq == XICS_IPI)
-		return;
-
 #ifdef CONFIG_IRQ_ALL_CPUS
-	if (smp_threads_ready)
-		server = default_distrib_server;
-	else
+	/* For the moment only implement delivery to all cpus or one cpu */
+	if (smp_threads_ready) {
+		if (cpus_equal(cpumask, allcpus)) {
+			server = default_distrib_server;
+		} else {
+			cpus_and(tmp, cpu_online_map, cpumask);
+
+			if (cpus_empty(tmp))
+				server = default_distrib_server;
+			else
+				server = get_hard_smp_processor_id(first_cpu(tmp));
+		}
+	} else {
 		server = default_server;
+	}
 #else
 	server = default_server;
 #endif
+	return server;
+
+}
+#else
+static int get_irq_server(unsigned int irq)
+{
+	return default_server;
+}
+#endif
 
+static void xics_enable_irq(unsigned int virq)
+{
+	unsigned int irq;
+	long call_status;
+	unsigned int server;
+
+	irq = virt_irq_to_real(irq_offset_down(virq));
+	if (irq == XICS_IPI)
+		return;
+
+	server = get_irq_server(virq);
 	call_status = rtas_call(ibm_set_xive, 3, 1, NULL, irq, server,
 				DEFAULT_PRIORITY);
 	if (call_status != 0) {
@@ -275,6 +304,7 @@ static void xics_enable_irq(unsigned int
 static void xics_disable_real_irq(unsigned int irq)
 {
 	long call_status;
+	unsigned int server;
 
 	if (irq == XICS_IPI)
 		return;
@@ -286,9 +316,9 @@ static void xics_disable_real_irq(unsign
 		return;
 	}
 
+	server = get_irq_server(irq);
 	/* Have to set XIVE to 0xff to be able to remove a slot */
-	call_status = rtas_call(ibm_set_xive, 3, 1, NULL, irq, default_server,
-				0xff);
+	call_status = rtas_call(ibm_set_xive, 3, 1, NULL, irq, server, 0xff);
 	if (call_status != 0) {
 		printk(KERN_ERR "xics_disable_irq: irq=%x: ibm_set_xive(0xff)"
 		       " returned %lx\n", irq, call_status);
@@ -300,25 +330,25 @@ static void xics_disable_irq(unsigned in
 {
 	unsigned int irq;
 
-	virq -= XICS_IRQ_OFFSET;
-	irq = virt_irq_to_real(virq);
+	irq = virt_irq_to_real(irq_offset_down(virq));
 	xics_disable_real_irq(irq);
 }
 
-static void xics_end_irq(unsigned int	irq)
+static void xics_end_irq(unsigned int irq)
 {
 	int cpu = smp_processor_id();
 
 	iosync();
-	ops->xirr_info_set(cpu, ((0xff<<24) |
-				 (virt_irq_to_real(irq-XICS_IRQ_OFFSET))));
+	ops->xirr_info_set(cpu, ((0xff << 24) |
+				 (virt_irq_to_real(irq_offset_down(irq)))));
+
 }
 
 static void xics_mask_and_ack_irq(unsigned int irq)
 {
 	int cpu = smp_processor_id();
 
-	if (irq < XICS_IRQ_OFFSET) {
+	if (irq < irq_offset_value()) {
 		i8259_pic.ack(irq);
 		iosync();
 		ops->xirr_info_set(cpu, ((0xff<<24) |
@@ -344,7 +374,8 @@ int xics_get_irq(struct pt_regs *regs)
 		irq = i8259_irq(cpu);
 		if (irq == -1) {
 			/* Spurious cascaded interrupt.  Still must ack xics */
-                        xics_end_irq(XICS_IRQ_OFFSET + xics_irq_8259_cascade);
+			xics_end_irq(irq_offset_up(xics_irq_8259_cascade));
+
 			irq = -1;
 		}
 	} else if (vec == XICS_IRQ_SPURIOUS) {
@@ -358,7 +389,7 @@ int xics_get_irq(struct pt_regs *regs)
 			       " disabling it.\n", vec);
 			xics_disable_real_irq(vec);
 		} else
-			irq += XICS_IRQ_OFFSET;
+			irq = irq_offset_up(irq);
 	}
 	return irq;
 }
@@ -372,6 +403,9 @@ irqreturn_t xics_ipi_action(int irq, voi
 	int cpu = smp_processor_id();
 
 	ops->qirr_info(cpu, 0xff);
+
+	WARN_ON(cpu_is_offline(cpu));
+
 	while (xics_ipi_message[cpu].value) {
 		if (test_and_clear_bit(PPC_MSG_CALL_FUNCTION,
 				       &xics_ipi_message[cpu].value)) {
@@ -514,6 +548,9 @@ nextnode:
 	if (systemcfg->platform == PLATFORM_PSERIES) {
 #ifdef CONFIG_SMP
 		for_each_cpu(i) {
+			/* FIXME: Do this dynamically! --RR */
+			if (!cpu_present_at_boot(i))
+				continue;
 			xics_per_cpu[i] = __ioremap((ulong)inodes[get_hard_smp_processor_id(i)].addr, 
 						    (ulong)inodes[get_hard_smp_processor_id(i)].size,
 						    _PAGE_NO_CACHE);
@@ -534,9 +571,9 @@ nextnode:
 	xics_8259_pic.enable = i8259_pic.enable;
 	xics_8259_pic.disable = i8259_pic.disable;
 	for (i = 0; i < 16; ++i)
-		irq_desc[i].handler = &xics_8259_pic;
+		get_irq_desc(i)->handler = &xics_8259_pic;
 	for (; i < NR_IRQS; ++i)
-		irq_desc[i].handler = &xics_pic;
+		get_irq_desc(i)->handler = &xics_pic;
 
 	ops->cppr_info(boot_cpuid, 0xff);
 	iosync();
@@ -552,7 +589,7 @@ static int __init xics_setup_i8259(void)
 {
 	if (naca->interrupt_controller == IC_PPC_XIC &&
 	    xics_irq_8259_cascade != -1) {
-		if (request_irq(xics_irq_8259_cascade + XICS_IRQ_OFFSET,
+		if (request_irq(irq_offset_up(xics_irq_8259_cascade),
 				no_action, 0, "8259 cascade", 0))
 			printk(KERN_ERR "xics_init_IRQ: couldn't get 8259 cascade\n");
 		i8259_init();
@@ -567,36 +604,31 @@ void xics_request_IPIs(void)
 	virt_irq_to_real_map[XICS_IPI] = XICS_IPI;
 
 	/* IPIs are marked SA_INTERRUPT as they must run with irqs disabled */
-	request_irq(XICS_IPI + XICS_IRQ_OFFSET, xics_ipi_action, SA_INTERRUPT,
+	request_irq(irq_offset_up(XICS_IPI), xics_ipi_action, SA_INTERRUPT,
 		    "IPI", 0);
-	irq_desc[XICS_IPI+XICS_IRQ_OFFSET].status |= IRQ_PER_CPU;
+	get_irq_desc(irq_offset_up(XICS_IPI))->status |= IRQ_PER_CPU;
 }
 #endif
 
 static void xics_set_affinity(unsigned int virq, cpumask_t cpumask)
 {
-        irq_desc_t *desc = irq_desc + virq;
 	unsigned int irq;
-	unsigned long flags;
 	long status;
 	unsigned long xics_status[2];
 	unsigned long newmask;
 	cpumask_t allcpus = CPU_MASK_ALL;
 	cpumask_t tmp = CPU_MASK_NONE;
 
-	virq -= XICS_IRQ_OFFSET;
-	irq = virt_irq_to_real(virq);
+	irq = virt_irq_to_real(irq_offset_down(virq));
 	if (irq == XICS_IPI)
 		return;
 
-        spin_lock_irqsave(&desc->lock, flags);
-
 	status = rtas_call(ibm_get_xive, 1, 3, (void *)&xics_status, irq);
 
 	if (status) {
 		printk(KERN_ERR "xics_set_affinity: irq=%d ibm,get-xive "
 		       "returns %ld\n", irq, status);
-		goto out;
+		return;
 	}
 
 	/* For the moment only implement delivery to all cpus or one cpu */
@@ -605,8 +637,8 @@ static void xics_set_affinity(unsigned i
 	} else {
 		cpus_and(tmp, cpu_online_map, cpumask);
 		if (cpus_empty(tmp))
-			goto out;
-		newmask = get_hard_smp_processor_id(first_cpu(cpumask));
+			return;
+		newmask = get_hard_smp_processor_id(first_cpu(tmp));
 	}
 
 	status = rtas_call(ibm_set_xive, 3, 1, NULL,
@@ -615,9 +647,86 @@ static void xics_set_affinity(unsigned i
 	if (status) {
 		printk(KERN_ERR "xics_set_affinity irq=%d ibm,set-xive "
 		       "returns %ld\n", irq, status);
-		goto out;
+		return;
+	}
+}
+
+#ifdef CONFIG_HOTPLUG_CPU
+
+/* Interrupts are disabled. */
+void xics_migrate_irqs_away(void)
+{
+	int set_indicator = rtas_token("set-indicator");
+	const unsigned long giqs = 9005UL; /* Global Interrupt Queue Server */
+	unsigned long status = 0;
+	unsigned int irq, cpu = smp_processor_id();
+	unsigned long xics_status[2];
+	unsigned long flags;
+
+	BUG_ON(set_indicator == RTAS_UNKNOWN_SERVICE);
+
+	/* Reject any interrupt that was queued to us... */
+	ops->cppr_info(cpu, 0);
+	iosync();
+
+	/* Refuse any new interrupts... */
+	rtas_call(set_indicator, 3, 1, &status, giqs,
+		  hard_smp_processor_id(), 0UL);
+	WARN_ON(status != 0);
+
+	/* Allow IPIs again... */
+	ops->cppr_info(cpu, DEFAULT_PRIORITY);
+	iosync();
+
+	printk(KERN_WARNING "HOTPLUG: Migrating IRQs away\n");
+	for_each_irq(irq) {
+		irq_desc_t *desc = get_irq_desc(irq);
+
+		/* We need to get IPIs still. */
+		if (irq_offset_down(irq) == XICS_IPI)
+			continue;
+
+		/* We only need to migrate enabled IRQS */
+		if (desc == NULL || desc->handler == NULL
+		    || desc->action == NULL
+		    || desc->handler->set_affinity == NULL)
+			continue;
+
+		spin_lock_irqsave(&desc->lock, flags);
+
+		status = rtas_call(ibm_get_xive, 1, 3, (void *)&xics_status,
+				   irq);
+		if (status) {
+			printk(KERN_ERR "migrate_irqs_away: irq=%d "
+					"ibm,get-xive returns %ld\n",
+					irq, status);
+			goto unlock;
+		}
+
+		/*
+		 * We only support delivery to all cpus or to one cpu.
+		 * The irq has to be migrated only in the single cpu
+		 * case.
+		 */
+		if (xics_status[0] != get_hard_smp_processor_id(cpu))
+			goto unlock;
+
+		printk(KERN_WARNING "IRQ %d affinity broken off cpu %u\n",
+		       irq, cpu);
+
+		/* Reset affinity to all cpus */
+		xics_status[0] = default_distrib_server;
+
+		status = rtas_call(ibm_set_xive, 3, 1, NULL,
+				irq, xics_status[0], xics_status[1]);
+		if (status)
+			printk(KERN_ERR "migrate_irqs_away irq=%d "
+					"ibm,set-xive returns %ld\n",
+					irq, status);
+
+unlock:
+		spin_unlock_irqrestore(&desc->lock, flags);
 	}
 
-out:
-        spin_unlock_irqrestore(&desc->lock, flags);
 }
+#endif
--- diff/arch/ppc64/mm/fault.c	2004-02-18 08:54:08.000000000 +0000
+++ source/arch/ppc64/mm/fault.c	2004-04-21 10:45:33.792566248 +0100
@@ -37,8 +37,6 @@
 #include <asm/system.h>
 #include <asm/uaccess.h>
 
-void bad_page_fault(struct pt_regs *, unsigned long, int);
-
 /*
  * The error_code parameter is
  *  - DSISR for a non-SLB data access fault,
@@ -177,10 +175,8 @@ do_sigbus:
  * It is called from do_page_fault above and from some of the procedures
  * in traps.c.
  */
-void
-bad_page_fault(struct pt_regs *regs, unsigned long address, int sig)
+void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig)
 {
-	extern void die(const char *, struct pt_regs *, long);
 	const struct exception_table_entry *entry;
 
 	/* Are we prepared to handle this fault?  */
@@ -190,7 +186,5 @@ bad_page_fault(struct pt_regs *regs, uns
 	}
 
 	/* kernel has accessed a bad area */
-	if (debugger(regs))
-		return;
 	die("Kernel access of bad area", regs, sig);
 }
--- diff/arch/ppc64/mm/hash_low.S	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/ppc64/mm/hash_low.S	2004-04-21 10:45:33.792566248 +0100
@@ -126,10 +126,12 @@ _GLOBAL(__hash_page)
 	 * code rather than call a C function...) 
 	 */
 BEGIN_FTR_SECTION
+BEGIN_FTR_SECTION
 	mr	r4,r30
 	mr	r5,r7
 	bl	.hash_page_do_lazy_icache
 END_FTR_SECTION_IFSET(CPU_FTR_NOEXECUTE)
+END_FTR_SECTION_IFCLR(CPU_FTR_COHERENT_ICACHE)
 
 	/* At this point, r3 contains new PP bits, save them in
 	 * place of "access" in the param area (sic)
--- diff/arch/ppc64/mm/hugetlbpage.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/mm/hugetlbpage.c	2004-04-21 10:45:33.794565944 +0100
@@ -29,64 +29,6 @@
 
 #include <linux/sysctl.h>
 
-int htlbpage_max;
-
-/* This lock protects the two counters and list below */
-static spinlock_t htlbpage_lock = SPIN_LOCK_UNLOCKED;
-
-static int htlbpage_free; /* = 0 */
-static int htlbpage_total; /* = 0 */
-static struct list_head hugepage_freelists[MAX_NUMNODES];
-
-static void enqueue_huge_page(struct page *page)
-{
-	list_add(&page->list,
-		&hugepage_freelists[page_zone(page)->zone_pgdat->node_id]);
-}
-
-/* XXX make this a sysctl */
-unsigned long largepage_roundrobin = 1;
-
-static struct page *dequeue_huge_page(void)
-{
-	static int nid = 0;
-	struct page *page = NULL;
-	int i;
-
-	if (!largepage_roundrobin)
-		nid = numa_node_id();
-
-	for (i = 0; i < numnodes; i++) {
-		if (!list_empty(&hugepage_freelists[nid]))
-			break;
-		nid = (nid + 1) % numnodes;
-	}
-
-	if (!list_empty(&hugepage_freelists[nid])) {
-		page = list_entry(hugepage_freelists[nid].next, struct page, list);
-		list_del(&page->list);
-	}
-
-	if (largepage_roundrobin)
-		nid = (nid + 1) % numnodes;
-
-	return page;
-}
-
-static struct page *alloc_fresh_huge_page(void)
-{
-	static int nid = 0;
-	struct page *page;
-
-	page = alloc_pages_node(nid, GFP_HIGHUSER, HUGETLB_PAGE_ORDER);
-	if (!page)
-		return NULL;
-
-	nid = page_zone(page)->zone_pgdat->node_id;
-	nid = (nid + 1) % numnodes;
-	return page;
-}
-
 /* HugePTE layout:
  *
  * 31 30 ... 15 14 13 12 10 9  8  7   6    5    4    3    2    1    0
@@ -118,7 +60,6 @@ typedef struct {unsigned int val;} hugep
 #define hugepte_none(x)	(!(hugepte_val(x) & _HUGEPAGE_PFN))
 
 
-static void free_huge_page(struct page *page);
 static void flush_hash_hugepage(mm_context_t context, unsigned long ea,
 				hugepte_t pte, int local);
 
@@ -145,27 +86,6 @@ static inline void set_hugepte(hugepte_t
 		       hugepte_val(pte) & ~_HUGEPAGE_HPTEFLAGS);
 }
 
-static struct page *alloc_hugetlb_page(void)
-{
-	int i;
-	struct page *page;
-
-	spin_lock(&htlbpage_lock);
-	page = dequeue_huge_page();
-	if (!page) {
-		spin_unlock(&htlbpage_lock);
-		return NULL;
-	}
-
-	htlbpage_free--;
-	spin_unlock(&htlbpage_lock);
-	set_page_count(page, 1);
-	page->lru.prev = (void *)free_huge_page;
-	for (i = 0; i < (HPAGE_SIZE/PAGE_SIZE); ++i)
-		clear_highpage(&page[i]);
-	return page;
-}
-
 static hugepte_t *hugepte_alloc(struct mm_struct *mm, unsigned long addr)
 {
 	pgd_t *pgd;
@@ -230,7 +150,8 @@ int is_aligned_hugepage_range(unsigned l
 		return -EINVAL;
 	if (addr & ~HPAGE_MASK)
 		return -EINVAL;
-	if (! is_hugepage_only_range(addr, len))
+	if (! (within_hugepage_low_range(addr, len)
+	       || within_hugepage_high_range(addr, len)) )
 		return -EINVAL;
 	return 0;
 }
@@ -240,59 +161,75 @@ static void do_slbia(void *unused)
 	asm volatile ("isync; slbia; isync":::"memory");
 }
 
-/* Activate the low hpage region for 32bit processes.  mmap_sem must
- * be held*/
-static int open_32bit_htlbpage_range(struct mm_struct *mm)
+static int prepare_low_seg_for_htlb(struct mm_struct *mm, unsigned long seg)
 {
+	unsigned long start = seg << SID_SHIFT;
+	unsigned long end = (seg+1) << SID_SHIFT;
 	struct vm_area_struct *vma;
 	unsigned long addr;
+	struct mmu_gather *tlb;
 
-	if (mm->context.low_hpages)
-		return 0; /* The window is already open */
-	
-	/* Check no VMAs are in the region */
-	vma = find_vma(mm, TASK_HPAGE_BASE_32);
+	BUG_ON(seg >= 16);
 
-	if (vma && (vma->vm_start < TASK_HPAGE_END_32)) {
-		printk(KERN_DEBUG "Low HTLB region busy: PID=%d  vma @ %lx-%lx\n",
-		       current->pid, vma->vm_start, vma->vm_end);
+	/* Check no VMAs are in the region */
+	vma = find_vma(mm, start);
+	if (vma && (vma->vm_start < end))
 		return -EBUSY;
-	}
 
 	/* Clean up any leftover PTE pages in the region */
 	spin_lock(&mm->page_table_lock);
-	for (addr = TASK_HPAGE_BASE_32; addr < TASK_HPAGE_END_32;
-	     addr += PMD_SIZE) {
+	tlb = tlb_gather_mmu(mm, 0);
+	for (addr = start; addr < end; addr += PMD_SIZE) {
 		pgd_t *pgd = pgd_offset(mm, addr);
-		pmd_t *pmd = pmd_offset(pgd, addr);
-
-		if (! pmd_none(*pmd)) {
-			struct page *page = pmd_page(*pmd);
-			pte_t *pte = (pte_t *)pmd_page_kernel(*pmd);
-			int i;
-
-			/* No VMAs, so there should be no PTEs, check
-			 * just in case. */
-			for (i = 0; i < PTRS_PER_PTE; i++) {
-				BUG_ON(! pte_none(*pte));
-				pte++;
-			}
+		pmd_t *pmd;
+		struct page *page;
+		pte_t *pte;
+		int i;
 
+		if (pgd_none(*pgd))
+			continue;
+		pmd = pmd_offset(pgd, addr);
+		if (!pmd || pmd_none(*pmd))
+			continue;
+		if (pmd_bad(*pmd)) {
+			pmd_ERROR(*pmd);
 			pmd_clear(pmd);
-			pgtable_remove_rmap(page);
-			pte_free(page);
+			continue;
 		}
+		pte = (pte_t *)pmd_page_kernel(*pmd);
+		/* No VMAs, so there should be no PTEs, check just in case. */
+		for (i = 0; i < PTRS_PER_PTE; i++) {
+			BUG_ON(!pte_none(*pte));
+			pte++;
+		}
+		page = pmd_page(*pmd);
+		pmd_clear(pmd);
+		pgtable_remove_rmap(page);
+		pte_free_tlb(tlb, page);
 	}
+	tlb_finish_mmu(tlb, start, end);
 	spin_unlock(&mm->page_table_lock);
 
-	/* FIXME: do we need to scan for PTEs too? */
+	return 0;
+}
 
-	mm->context.low_hpages = 1;
+static int open_low_hpage_segs(struct mm_struct *mm, u16 newsegs)
+{
+	unsigned long i;
+
+	newsegs &= ~(mm->context.htlb_segs);
+	if (! newsegs)
+		return 0; /* The segments we want are already open */
+
+	for (i = 0; i < 16; i++)
+		if ((1 << i) & newsegs)
+			if (prepare_low_seg_for_htlb(mm, i) != 0)
+				return -EBUSY;
 
+	mm->context.htlb_segs |= newsegs;
 	/* the context change must make it to memory before the slbia,
 	 * so that further SLB misses do the right thing. */
 	mb();
-
 	on_each_cpu(do_slbia, NULL, 0, 1);
 
 	return 0;
@@ -300,10 +237,20 @@ static int open_32bit_htlbpage_range(str
 
 int prepare_hugepage_range(unsigned long addr, unsigned long len)
 {
-	if (is_hugepage_high_range(addr, len))
+	if (within_hugepage_high_range(addr, len))
 		return 0;
-	else if (is_hugepage_low_range(addr, len))
-		return open_32bit_htlbpage_range(current->mm);
+	else if ((addr < 0x100000000) && ((addr+len) < 0x100000000)) {
+		int err;
+		/* Yes, we need both tests, in case addr+len overflows
+		 * 64-bit arithmetic */
+		err = open_low_hpage_segs(current->mm,
+					  LOW_ESID_MASK(addr, len));
+		if (err)
+			printk(KERN_DEBUG "prepare_hugepage_range(%lx, %lx)"
+			       " failed (segs: 0x%04hx)\n", addr, len,
+			       LOW_ESID_MASK(addr, len));
+		return err;
+	}
 
 	return -EINVAL;
 }
@@ -388,15 +335,9 @@ follow_hugetlb_page(struct mm_struct *mm
 }
 
 struct page *
-follow_huge_addr(struct mm_struct *mm,
-	struct vm_area_struct *vma, unsigned long address, int write)
-{
-	return NULL;
-}
-
-struct vm_area_struct *hugepage_vma(struct mm_struct *mm, unsigned long addr)
+follow_huge_addr(struct mm_struct *mm, unsigned long address, int write)
 {
-	return NULL;
+	return ERR_PTR(-EINVAL);
 }
 
 int pmd_huge(pmd_t pmd)
@@ -413,34 +354,11 @@ follow_huge_pmd(struct mm_struct *mm, un
 	BUG_ON(! pmd_hugepage(*pmd));
 
 	page = hugepte_page(*(hugepte_t *)pmd);
-	if (page) {
+	if (page)
 		page += ((address & ~HPAGE_MASK) >> PAGE_SHIFT);
-		get_page(page);
-	}
 	return page;
 }
 
-static void free_huge_page(struct page *page)
-{
-	BUG_ON(page_count(page));
-	BUG_ON(page->mapping);
-
-	INIT_LIST_HEAD(&page->list);
-
-	spin_lock(&htlbpage_lock);
-	enqueue_huge_page(page);
-	htlbpage_free++;
-	spin_unlock(&htlbpage_lock);
-}
-
-void huge_page_release(struct page *page)
-{
-	if (!put_page_testzero(page))
-		return;
-
-	free_huge_page(page);
-}
-
 void unmap_hugepage_range(struct vm_area_struct *vma,
 			  unsigned long start, unsigned long end)
 {
@@ -483,16 +401,6 @@ void unmap_hugepage_range(struct vm_area
 	mm->rss -= (end - start) >> PAGE_SHIFT;
 }
 
-void zap_hugepage_range(struct vm_area_struct *vma,
-			unsigned long start, unsigned long length)
-{
-	struct mm_struct *mm = vma->vm_mm;
-
-	spin_lock(&mm->page_table_lock);
-	unmap_hugepage_range(vma, start, start + length);
-	spin_unlock(&mm->page_table_lock);
-}
-
 int hugetlb_prefault(struct address_space *mapping, struct vm_area_struct *vma)
 {
 	struct mm_struct *mm = current->mm;
@@ -527,7 +435,7 @@ int hugetlb_prefault(struct address_spac
 				ret = -ENOMEM;
 				goto out;
 			}
-			page = alloc_hugetlb_page();
+			page = alloc_huge_page();
 			if (!page) {
 				hugetlb_put_quota(mapping);
 				ret = -ENOMEM;
@@ -550,7 +458,7 @@ out:
 
 /* Because we have an exclusive hugepage region which lies within the
  * normal user address space, we have to take special measures to make
- * non-huge mmap()s evade the hugepage reserved region. */
+ * non-huge mmap()s evade the hugepage reserved regions. */
 unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
 				     unsigned long len, unsigned long pgoff,
 				     unsigned long flags)
@@ -565,36 +473,29 @@ unsigned long arch_get_unmapped_area(str
 	if (addr) {
 		addr = PAGE_ALIGN(addr);
 		vma = find_vma(mm, addr);
-		if (TASK_SIZE - len >= addr &&
-		    (!vma || addr + len <= vma->vm_start) &&
-		    !is_hugepage_only_range(addr,len))
+		if (((TASK_SIZE - len) >= addr)
+		    && (!vma || (addr+len) <= vma->vm_start)
+		    && !is_hugepage_only_range(addr,len))
 			return addr;
 	}
 	start_addr = addr = mm->free_area_cache;
 
 full_search:
-	for (vma = find_vma(mm, addr); ; vma = vma->vm_next) {
-		/* At this point:  (!vma || addr < vma->vm_end). */
-		if (TASK_SIZE - len < addr) {
-			/*
-			 * Start a new search - just in case we missed
-			 * some holes.
-			 */
-			if (start_addr != TASK_UNMAPPED_BASE) {
-				start_addr = addr = TASK_UNMAPPED_BASE;
-				goto full_search;
-			}
-			return -ENOMEM;
+	vma = find_vma(mm, addr);
+	while (TASK_SIZE - len >= addr) {
+		BUG_ON(vma && (addr >= vma->vm_end));
+
+		if (touches_hugepage_low_range(addr, len)) {
+			addr = ALIGN(addr+1, 1<<SID_SHIFT);
+			vma = find_vma(mm, addr);
+			continue;
+		}
+		if (touches_hugepage_high_range(addr, len)) {
+			addr = TASK_HPAGE_END;
+			vma = find_vma(mm, addr);
+			continue;
 		}
 		if (!vma || addr + len <= vma->vm_start) {
-			if (is_hugepage_only_range(addr, len)) {
-				if (addr < TASK_HPAGE_END_32)
-					addr = TASK_HPAGE_END_32;
-				else
-					addr = TASK_HPAGE_END;
-
-				continue;
-			}
 			/*
 			 * Remember the place where we stopped the search:
 			 */
@@ -602,61 +503,102 @@ full_search:
 			return addr;
 		}
 		addr = vma->vm_end;
+		vma = vma->vm_next;
+	}
+
+	/* Make sure we didn't miss any holes */
+	if (start_addr != TASK_UNMAPPED_BASE) {
+		start_addr = addr = TASK_UNMAPPED_BASE;
+		goto full_search;
 	}
+	return -ENOMEM;
 }
 
-unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
-					unsigned long len, unsigned long pgoff,
-					unsigned long flags)
+static unsigned long htlb_get_low_area(unsigned long len, u16 segmask)
 {
+	unsigned long addr = 0;
 	struct vm_area_struct *vma;
-	unsigned long base, end;
 
-	if (len & ~HPAGE_MASK)
-		return -EINVAL;
+	vma = find_vma(current->mm, addr);
+	while (addr + len <= 0x100000000UL) {
+		BUG_ON(vma && (addr >= vma->vm_end)); /* invariant */
+
+		if (! __within_hugepage_low_range(addr, len, segmask)) {
+			addr = ALIGN(addr+1, 1<<SID_SHIFT);
+			vma = find_vma(current->mm, addr);
+			continue;
+		}
 
-	if (!(cur_cpu_spec->cpu_features & CPU_FTR_16M_PAGE))
-		return -EINVAL;
+		if (!vma || (addr + len) <= vma->vm_start)
+			return addr;
+		addr = ALIGN(vma->vm_end, HPAGE_SIZE);
+		/* Depending on segmask this might not be a confirmed
+		 * hugepage region, so the ALIGN could have skipped
+		 * some VMAs */
+		vma = find_vma(current->mm, addr);
+	}
 
-	if (test_thread_flag(TIF_32BIT)) {
-		int err;
+	return -ENOMEM;
+}
 
-		err = open_32bit_htlbpage_range(current->mm);
-		if (err)
-			return err; /* Should this just be EINVAL? */
+static unsigned long htlb_get_high_area(unsigned long len)
+{
+	unsigned long addr = TASK_HPAGE_BASE;
+	struct vm_area_struct *vma;
+
+	vma = find_vma(current->mm, addr);
+	for (vma = find_vma(current->mm, addr);
+	     addr + len <= TASK_HPAGE_END;
+	     vma = vma->vm_next) {
+		BUG_ON(vma && (addr >= vma->vm_end)); /* invariant */
+		BUG_ON(! within_hugepage_high_range(addr, len));
 
-		base = TASK_HPAGE_BASE_32;
-		end = TASK_HPAGE_END_32;
-	} else {
-		base = TASK_HPAGE_BASE;
-		end = TASK_HPAGE_END;
-	}
-	
-	if (!in_hugepage_area(current->mm->context, addr) 
-	    || (addr & (HPAGE_SIZE - 1)))
-		addr = base;
-
-	for (vma = find_vma(current->mm, addr); ; vma = vma->vm_next) {
-		/* At this point:  (!vma || addr < vma->vm_end). */
-		if (addr + len > end)
-			return -ENOMEM;
 		if (!vma || (addr + len) <= vma->vm_start)
 			return addr;
 		addr = ALIGN(vma->vm_end, HPAGE_SIZE);
-
-		/* Because we're in an exclusively hugepage region,
-		 * this alignment shouldn't have skipped over any
-		 * other vmas */
+		/* Because we're in a hugepage region, this alignment
+		 * should not skip us over any VMAs */
 	}
+
+	return -ENOMEM;
 }
 
-static inline unsigned long computeHugeHptePP(unsigned int hugepte)
+unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
+					unsigned long len, unsigned long pgoff,
+					unsigned long flags)
 {
-	unsigned long flags = 0x2;
+	if (len & ~HPAGE_MASK)
+		return -EINVAL;
+
+	if (!(cur_cpu_spec->cpu_features & CPU_FTR_16M_PAGE))
+		return -EINVAL;
+
+	if (test_thread_flag(TIF_32BIT)) {
+		int lastshift = 0;
+		u16 segmask, cursegs = current->mm->context.htlb_segs;
 
-	if (! (hugepte & _HUGEPAGE_RW))
-		flags |= 0x1;
-	return flags;
+		/* First see if we can do the mapping in the existing
+		 * low hpage segments */
+		addr = htlb_get_low_area(len, cursegs);
+		if (addr != -ENOMEM)
+			return addr;
+
+		for (segmask = LOW_ESID_MASK(0x100000000UL-len, len);
+		     ! lastshift; segmask >>=1) {
+			if (segmask & 1)
+				lastshift = 1;
+
+			addr = htlb_get_low_area(len, cursegs | segmask);
+			if ((addr != -ENOMEM)
+			    && open_low_hpage_segs(current->mm, segmask) == 0)
+				return addr;
+		}
+		printk(KERN_DEBUG "hugetlb_get_unmapped_area() unable to open"
+		       " enough segments\n");
+		return -ENOMEM;
+	} else {
+		return htlb_get_high_area(len);
+	}
 }
 
 int hash_huge_page(struct mm_struct *mm, unsigned long access,
@@ -712,7 +654,7 @@ int hash_huge_page(struct mm_struct *mm,
 	old_pte = *ptep;
 	new_pte = old_pte;
 
-	hpteflags = computeHugeHptePP(hugepte_val(new_pte));
+	hpteflags = 0x2 | (! (hugepte_val(new_pte) & _HUGEPAGE_RW));
 
 	/* Check if pte already has an hpte (case 2) */
 	if (unlikely(hugepte_val(old_pte) & _HUGEPAGE_HASHPTE)) {
@@ -788,7 +730,7 @@ repeat:
 static void flush_hash_hugepage(mm_context_t context, unsigned long ea,
 				hugepte_t pte, int local)
 {
-	unsigned long vsid, vpn, va, hash, secondary, slot;
+	unsigned long vsid, vpn, va, hash, slot;
 
 	BUG_ON(hugepte_bad(pte));
 	BUG_ON(!in_hugepage_area(context, ea));
@@ -798,156 +740,10 @@ static void flush_hash_hugepage(mm_conte
 	va = (vsid << 28) | (ea & 0x0fffffff);
 	vpn = va >> LARGE_PAGE_SHIFT;
 	hash = hpt_hash(vpn, 1);
-	secondary = !!(hugepte_val(pte) & _HUGEPAGE_SECONDARY);
-	if (secondary)
+	if (hugepte_val(pte) & _HUGEPAGE_SECONDARY)
 		hash = ~hash;
 	slot = (hash & htab_data.htab_hash_mask) * HPTES_PER_GROUP;
 	slot += (hugepte_val(pte) & _HUGEPAGE_GROUP_IX) >> 5;
 
 	ppc_md.hpte_invalidate(slot, va, 1, local);
 }
-
-static void split_and_free_hugepage(struct page *page)
-{
-	int j;
-	struct page *map;
-
-	map = page;
-	htlbpage_total--;
-	for (j = 0; j < (HPAGE_SIZE / PAGE_SIZE); j++) {
-		map->flags &= ~(1 << PG_locked | 1 << PG_error | 1 << PG_referenced |
-				1 << PG_dirty | 1 << PG_active | 1 << PG_reserved |
-				1 << PG_private | 1<< PG_writeback);
-		set_page_count(map, 0);
-		map++;
-	}
-	set_page_count(page, 1);
-	__free_pages(page, HUGETLB_PAGE_ORDER);
-}
-
-int set_hugetlb_mem_size(int count)
-{
-	int lcount;
-	struct page *page;
-
-	if (!(cur_cpu_spec->cpu_features & CPU_FTR_16M_PAGE))
-		return 0;
-	
-	if (count < 0)
-		lcount = count;
-	else
-		lcount = count - htlbpage_total;
-
-	if (lcount == 0)
-		return htlbpage_total;
-	if (lcount > 0) {	/* Increase the mem size. */
-		while (lcount--) {
-			page = alloc_fresh_huge_page();
-			if (page == NULL)
-				break;
-			spin_lock(&htlbpage_lock);
-			enqueue_huge_page(page);
-			htlbpage_free++;
-			htlbpage_total++;
-			spin_unlock(&htlbpage_lock);
-		}
-		return htlbpage_total;
-	}
-	/* Shrink the memory size. */
-	while (lcount++) {
-		page = alloc_hugetlb_page();
-		if (page == NULL)
-			break;
-		spin_lock(&htlbpage_lock);
-		split_and_free_hugepage(page);
-		spin_unlock(&htlbpage_lock);
-	}
-	return htlbpage_total;
-}
-
-int hugetlb_sysctl_handler(ctl_table *table, int write,
-		struct file *file, void *buffer, size_t *length)
-{
-	proc_dointvec(table, write, file, buffer, length);
-	htlbpage_max = set_hugetlb_mem_size(htlbpage_max);
-	return 0;
-}
-
-static int __init hugetlb_setup(char *s)
-{
-	if (sscanf(s, "%d", &htlbpage_max) <= 0)
-		htlbpage_max = 0;
-	return 1;
-}
-__setup("hugepages=", hugetlb_setup);
-
-static int __init hugetlb_init(void)
-{
-	int i;
-	struct page *page;
-
-	if (cur_cpu_spec->cpu_features & CPU_FTR_16M_PAGE) {
-		for (i = 0; i < MAX_NUMNODES; ++i)
-			INIT_LIST_HEAD(&hugepage_freelists[i]);
-
-		for (i = 0; i < htlbpage_max; ++i) {
-			page = alloc_fresh_huge_page();
-			if (!page)
-				break;
-			spin_lock(&htlbpage_lock);
-			enqueue_huge_page(page);
-			spin_unlock(&htlbpage_lock);
-		}
-		htlbpage_max = htlbpage_free = htlbpage_total = i;
-		printk(KERN_INFO "Total HugeTLB memory allocated, %d\n",
-		       htlbpage_free);
-	} else {
-		htlbpage_max = 0;
-		printk(KERN_INFO "CPU does not support HugeTLB\n");
-	}
-
-	return 0;
-}
-module_init(hugetlb_init);
-
-int hugetlb_report_meminfo(char *buf)
-{
-	return sprintf(buf,
-			"HugePages_Total: %5d\n"
-			"HugePages_Free:  %5d\n"
-			"Hugepagesize:    %5lu kB\n",
-			htlbpage_total,
-			htlbpage_free,
-			HPAGE_SIZE/1024);
-}
-
-/* This is advisory only, so we can get away with accesing
- * htlbpage_free without taking the lock. */
-int is_hugepage_mem_enough(size_t size)
-{
-	return (size + ~HPAGE_MASK)/HPAGE_SIZE <= htlbpage_free;
-}
-
-/* Return the number pages of memory we physically have, in PAGE_SIZE units. */
-unsigned long hugetlb_total_pages(void)
-{
-	return htlbpage_total * (HPAGE_SIZE / PAGE_SIZE);
-}
-EXPORT_SYMBOL(hugetlb_total_pages);
-
-/*
- * We cannot handle pagefaults against hugetlb pages at all.  They cause
- * handle_mm_fault() to try to instantiate regular-sized pages in the
- * hugegpage VMA.  do_page_fault() is supposed to trap this, so BUG is we get
- * this far.
- */
-static struct page *hugetlb_nopage(struct vm_area_struct *vma,
-				unsigned long address, int *unused)
-{
-	BUG();
-	return NULL;
-}
-
-struct vm_operations_struct hugetlb_vm_ops = {
-	.nopage = hugetlb_nopage,
-};
--- diff/arch/ppc64/mm/init.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/mm/init.c	2004-04-21 10:45:33.794565944 +0100
@@ -696,6 +696,8 @@ void __init mem_init(void)
  */
 void flush_dcache_page(struct page *page)
 {
+	if (cur_cpu_spec->cpu_features & CPU_FTR_COHERENT_ICACHE)
+		return;
 	/* avoid an atomic op if possible */
 	if (test_bit(PG_arch_1, &page->flags))
 		clear_bit(PG_arch_1, &page->flags);
@@ -705,6 +707,8 @@ void clear_user_page(void *page, unsigne
 {
 	clear_page(page);
 
+	if (cur_cpu_spec->cpu_features & CPU_FTR_COHERENT_ICACHE)
+		return;
 	/*
 	 * We shouldnt have to do this, but some versions of glibc
 	 * require it (ld.so assumes zero filled pages are icache clean)
@@ -736,6 +740,9 @@ void copy_user_page(void *vto, void *vfr
 		return;
 #endif
 
+	if (cur_cpu_spec->cpu_features & CPU_FTR_COHERENT_ICACHE)
+		return;
+
 	/* avoid an atomic op if possible */
 	if (test_bit(PG_arch_1, &pg->flags))
 		clear_bit(PG_arch_1, &pg->flags);
@@ -768,7 +775,8 @@ void update_mmu_cache(struct vm_area_str
 	cpumask_t tmp;
 
 	/* handle i-cache coherency */
-	if (!(cur_cpu_spec->cpu_features & CPU_FTR_NOEXECUTE)) {
+	if (!(cur_cpu_spec->cpu_features & CPU_FTR_COHERENT_ICACHE) &&
+	    !(cur_cpu_spec->cpu_features & CPU_FTR_NOEXECUTE)) {
 		unsigned long pfn = pte_pfn(pte);
 		if (pfn_valid(pfn)) {
 			struct page *page = pfn_to_page(pfn);
--- diff/arch/ppc64/mm/numa.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/mm/numa.c	2004-04-21 10:45:33.795565792 +0100
@@ -16,6 +16,7 @@
 #include <linux/module.h>
 #include <asm/lmb.h>
 #include <asm/machdep.h>
+#include <asm/abs_addr.h>
 
 #if 1
 #define dbg(args...) udbg_printf(args)
@@ -31,9 +32,7 @@
 
 int numa_cpu_lookup_table[NR_CPUS] = { [ 0 ... (NR_CPUS - 1)] =
 	ARRAY_INITIALISER};
-int numa_memory_lookup_table[MAX_MEMORY >> MEMORY_INCREMENT_SHIFT] =
-	{ [ 0 ... ((MAX_MEMORY >> MEMORY_INCREMENT_SHIFT) - 1)] =
-	ARRAY_INITIALISER};
+char *numa_memory_lookup_table;
 cpumask_t numa_cpumask_lookup_table[MAX_NUMNODES];
 int nr_cpus_in_node[MAX_NUMNODES] = { [0 ... (MAX_NUMNODES -1)] = 0};
 
@@ -65,12 +64,20 @@ static int __init parse_numa_properties(
 	int *memory_associativity;
 	int depth;
 	int max_domain = 0;
+	long entries = lmb_end_of_DRAM() >> MEMORY_INCREMENT_SHIFT;
+	long i;
 
 	if (strstr(saved_command_line, "numa=off")) {
 		printk(KERN_WARNING "NUMA disabled by user\n");
 		return -1;
 	}
 
+	numa_memory_lookup_table =
+		(char *)abs_to_virt(lmb_alloc(entries * sizeof(char), 1));
+
+	for (i = 0; i < entries ; i++)
+		numa_memory_lookup_table[i] = ARRAY_INITIALISER;
+
 	cpu = of_find_node_by_type(NULL, "cpu");
 	if (!cpu)
 		goto err;
@@ -124,6 +131,9 @@ static int __init parse_numa_properties(
 			max_domain = numa_domain;
 
 		map_cpu_to_node(cpu_nr, numa_domain);
+		/* register the second thread on an SMT machine */
+		if (cur_cpu_spec->cpu_features & CPU_FTR_SMT)
+			map_cpu_to_node(cpu_nr ^ 0x1, numa_domain);
 	}
 
 	for (; memory; memory = of_find_node_by_type(memory, "memory")) {
@@ -232,6 +242,14 @@ static void __init setup_nonnuma(void)
 	printk(KERN_INFO "Memory hole size: %ldMB\n",
 	       (top_of_ram - total_ram) >> 20);
 
+	if (!numa_memory_lookup_table) {
+		long entries = top_of_ram >> MEMORY_INCREMENT_SHIFT;
+		numa_memory_lookup_table =
+			(char *)abs_to_virt(lmb_alloc(entries * sizeof(char), 1));
+		for (i = 0; i < entries ; i++)
+			numa_memory_lookup_table[i] = ARRAY_INITIALISER;
+	}
+
 	for (i = 0; i < NR_CPUS; i++)
 		map_cpu_to_node(i, 0);
 
--- diff/arch/ppc64/oprofile/Makefile	2003-05-21 11:50:14.000000000 +0100
+++ source/arch/ppc64/oprofile/Makefile	2004-04-21 10:45:33.795565792 +0100
@@ -6,4 +6,4 @@ DRIVER_OBJS := $(addprefix ../../../driv
 		oprofilefs.o oprofile_stats.o \
 		timer_int.o )
 
-oprofile-y := $(DRIVER_OBJS) init.o
+oprofile-y := $(DRIVER_OBJS) common.o op_model_rs64.o op_model_power4.o
--- diff/arch/ppc64/xmon/start.c	2004-02-18 08:54:08.000000000 +0000
+++ source/arch/ppc64/xmon/start.c	2004-04-21 10:45:33.797565488 +0100
@@ -19,6 +19,7 @@
 #include <asm/processor.h>
 #include <asm/udbg.h>
 #include <asm/system.h>
+#include "nonstdio.h"
 
 #ifdef CONFIG_MAGIC_SYSRQ
 
@@ -63,9 +64,8 @@ xmon_read_poll(void)
 	return udbg_getc_poll();
 }
  
-void *xmon_stdin;
-void *xmon_stdout;
-void *xmon_stderr;
+FILE *xmon_stdin;
+FILE *xmon_stdout;
 
 int
 xmon_putc(int c, void *f)
--- diff/arch/ppc64/xmon/xmon.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/ppc64/xmon/xmon.c	2004-04-21 10:45:33.798565336 +0100
@@ -452,7 +452,7 @@ insert_bpts()
 		}
 	}
 
-	if ((cur_cpu_spec->cpu_features & CPU_FTR_DABR) && dabr.enabled)
+	if (dabr.enabled)
 		set_dabr(dabr.address);
 	if ((cur_cpu_spec->cpu_features & CPU_FTR_IABR) && iabr.enabled)
 		set_iabr(iabr.address);
@@ -465,8 +465,7 @@ remove_bpts()
 	struct bpt *bp;
 	unsigned instr;
 
-	if ((cur_cpu_spec->cpu_features & CPU_FTR_DABR))
-		set_dabr(0);
+	set_dabr(0);
 	if ((cur_cpu_spec->cpu_features & CPU_FTR_IABR))
 		set_iabr(0);
 
@@ -543,8 +542,7 @@ cmds(struct pt_regs *excp)
 			symbol_lookup();
 			break;
 		case 'r':
-			if (excp != NULL)
-				prregs(excp);	/* print regs */
+			prregs(excp);	/* print regs */
 			break;
 		case 'e':
 			if (excp == NULL)
@@ -751,10 +749,6 @@ bpt_cmds(void)
 	cmd = inchar();
 	switch (cmd) {
 	case 'd':	/* bd - hardware data breakpoint */
-		if (!(cur_cpu_spec->cpu_features & CPU_FTR_DABR)) {
-			printf("Not implemented on this cpu\n");
-			break;
-		}
 		mode = 7;
 		cmd = inchar();
 		if (cmd == 'r')
@@ -971,8 +965,7 @@ static void backtrace(struct pt_regs *ex
 
 spinlock_t exception_print_lock = SPIN_LOCK_UNLOCKED;
 
-void
-excprint(struct pt_regs *fp)
+void excprint(struct pt_regs *fp)
 {
 	unsigned long flags;
 
@@ -1007,21 +1000,31 @@ excprint(struct pt_regs *fp)
 	spin_unlock_irqrestore(&exception_print_lock, flags);
 }
 
-void
-prregs(struct pt_regs *fp)
+void prregs(struct pt_regs *fp)
 {
 	int n;
 	unsigned long base;
 
 	if (scanhex((void *)&base))
 		fp = (struct pt_regs *) base;
-	for (n = 0; n < 16; ++n)
-		printf("R%.2ld = %.16lx   R%.2ld = %.16lx\n", n, fp->gpr[n],
-		       n+16, fp->gpr[n+16]);
-	printf("pc  = %.16lx   msr = %.16lx\nlr  = %.16lx   cr  = %.16lx\n",
-	       fp->nip, fp->msr, fp->link, fp->ccr);
-	printf("ctr = %.16lx   xer = %.16lx   trap = %8lx\n",
-	       fp->ctr, fp->xer, fp->trap);
+
+	if (setjmp(bus_error_jmp) == 0) {
+		__debugger_fault_handler = handle_fault;
+		sync();
+		for (n = 0; n < 16; ++n)
+			printf("R%.2ld = %.16lx   R%.2ld = %.16lx\n", n,
+			       fp->gpr[n], n+16, fp->gpr[n+16]);
+		printf("pc  = %.16lx   msr = %.16lx\nlr  = %.16lx   "
+		       "cr  = %.16lx\n", fp->nip, fp->msr, fp->link, fp->ccr);
+		printf("ctr = %.16lx   xer = %.16lx   trap = %8lx\n",
+		       fp->ctr, fp->xer, fp->trap);
+
+		sync();
+		/* wait a little while to see if we get a machine check */
+		__delay(200);
+	} else {
+		printf("*** Error reading regs\n");
+	}
 }
 
 void
--- diff/arch/s390/defconfig	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/s390/defconfig	2004-04-21 10:45:33.799565184 +0100
@@ -196,6 +196,11 @@ CONFIG_S390_TAPE_BLOCK=y
 CONFIG_S390_TAPE_34XX=m
 
 #
+# Cryptographic devices
+#
+CONFIG_Z90CRYPT=m
+
+#
 # Networking support
 #
 CONFIG_NET=y
--- diff/arch/s390/kernel/binfmt_elf32.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/s390/kernel/binfmt_elf32.c	2004-04-21 10:45:33.799565184 +0100
@@ -115,7 +115,7 @@ static inline int dump_regs32(struct pt_
 #include <linux/binfmts.h>
 #include <linux/compat.h>
 
-int setup_arg_pages32(struct linux_binprm *bprm);
+int setup_arg_pages32(struct linux_binprm *bprm, int executable_stack);
 
 #define elf_prstatus elf_prstatus32
 struct elf_prstatus32
@@ -166,7 +166,7 @@ struct elf_prpsinfo32
 
 #undef start_thread
 #define start_thread                    start_thread31 
-#define setup_arg_pages(bprm)           setup_arg_pages32(bprm)
+#define setup_arg_pages(bprm, exec)     setup_arg_pages32(bprm, exec)
 #define elf_map				elf_map32
 
 MODULE_DESCRIPTION("Binary format loader for compatibility with 32bit Linux for S390 binaries,"
--- diff/arch/s390/kernel/compat_exec.c	2003-07-11 09:39:50.000000000 +0100
+++ source/arch/s390/kernel/compat_exec.c	2004-04-21 10:45:33.799565184 +0100
@@ -37,7 +37,7 @@
 #undef STACK_TOP
 #define STACK_TOP TASK31_SIZE
 
-int setup_arg_pages32(struct linux_binprm *bprm)
+int setup_arg_pages32(struct linux_binprm *bprm, int executable_stack)
 {
 	unsigned long stack_base;
 	struct vm_area_struct *mpnt;
@@ -66,6 +66,7 @@ int setup_arg_pages32(struct linux_binpr
 		mpnt->vm_mm = mm;
 		mpnt->vm_start = PAGE_MASK & (unsigned long) bprm->p;
 		mpnt->vm_end = STACK_TOP;
+		/* executable stack setting would be applied here */
 		mpnt->vm_page_prot = PAGE_COPY;
 		mpnt->vm_flags = VM_STACK_FLAGS;
 		mpnt->vm_ops = NULL;
--- diff/arch/s390/kernel/compat_signal.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/s390/kernel/compat_signal.c	2004-04-21 10:45:33.800565032 +0100
@@ -74,6 +74,10 @@ int copy_siginfo_to_user32(siginfo_t32 *
 		err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
 	else {
 		switch (from->si_code >> 16) {
+		case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
+		case __SI_MESGQ >> 16:
+			err |= __put_user(from->si_int, &to->si_int);
+			/* fallthrough */
 		case __SI_KILL >> 16:
 			err |= __put_user(from->si_pid, &to->si_pid);
 			err |= __put_user(from->si_uid, &to->si_uid);
@@ -96,7 +100,6 @@ int copy_siginfo_to_user32(siginfo_t32 *
 			break;
 		default:
 			break;
-		/* case __SI_RT: This is not generated by the kernel as of now.  */
 		}
 	}
 	return err;
--- diff/arch/s390/kernel/compat_wrapper.S	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/s390/kernel/compat_wrapper.S	2004-04-21 10:45:33.801564880 +0100
@@ -1352,3 +1352,47 @@ compat_sys_fstatfs64_wrapper:
 	llgfr	%r3,%r3			# compat_size_t
 	llgtr	%r4,%r4			# struct compat_statfs64 *
 	jg	compat_fstatfs64
+
+	.globl	compat_sys_mq_open_wrapper
+compat_sys_mq_open_wrapper:
+	llgtr	%r2,%r2			# const char *
+	lgfr	%r3,%r3			# int
+	llgfr	%r4,%r4			# mode_t
+	llgtr	%r5,%r5			# struct compat_mq_attr *
+	jg	compat_sys_mq_open
+
+	.globl	sys_mq_unlink_wrapper
+sys32_mq_unlink_wrapper:
+	llgtr	%r2,%r2			# const char *
+	jg	sys_mq_unlink
+
+	.globl	compat_sys_mq_timedsend_wrapper
+compat_sys_mq_timedsend_wrapper:
+	lgfr	%r2,%r2			# mqd_t
+	llgtr	%r3,%r3			# const char *
+	llgfr	%r4,%r4			# size_t
+	llgfr	%r5,%r5			# unsigned int
+	llgtr	%r6,%r6			# const struct compat_timespec *
+	jg	compat_sys_mq_timedsend
+
+	.globl	compat_sys_mq_timedreceive_wrapper
+compat_sys_mq_timedreceive_wrapper:
+	lgfr	%r2,%r2			# mqd_t
+	llgtr	%r3,%r3			# char *
+	llgfr	%r4,%r4			# size_t
+	llgtr	%r5,%r5			# unsigned int *
+	llgtr	%r6,%r6			# const struct compat_timespec *
+	jg	compat_sys_mq_timedreceive
+
+	.globl	compat_sys_mq_notify_wrapper
+compat_sys_mq_notify_wrapper:
+	lgfr	%r2,%r2			# mqd_t
+	llgtr	%r3,%r3			# struct compat_sigevent *
+	jg	compat_sys_mq_notify
+
+	.globl	compat_sys_mq_getsetattr_wrapper
+compat_sys_mq_getsetattr_wrapper:
+	lgfr	%r2,%r2			# mqd_t
+	llgtr	%r3,%r3			# struct compat_mq_attr *
+	llgtr	%r4,%r4			# struct compat_mq_attr *
+	jg	compat_sys_mq_getsetattr
--- diff/arch/s390/kernel/entry.S	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/s390/kernel/entry.S	2004-04-21 10:45:33.801564880 +0100
@@ -235,7 +235,7 @@ sysc_enter:
 	lr	%r7,%r1           # copy svc number to %r7
 	sla	%r7,2             # *4
 sysc_do_restart:
-	tm	__TI_flags+3(%r9),_TIF_SYSCALL_TRACE
+	tm	__TI_flags+3(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)
         l       %r8,sys_call_table-system_call(%r7,%r13) # get system call addr.
         bo      BASED(sysc_tracesys)
         basr    %r14,%r8          # call sys_xxxx
@@ -309,6 +309,8 @@ __critical_end:
 #
 sysc_tracesys:
         l       %r1,BASED(.Ltrace)
+	la	%r2,SP_PTREGS(%r15)    # load pt_regs
+	la	%r3,0
 	srl	%r7,2
 	st	%r7,SP_R2(%r15)
 	basr	%r14,%r1
@@ -323,9 +325,11 @@ sysc_tracego:
 	basr	%r14,%r8          # call sys_xxx
 	st	%r2,SP_R2(%r15)   # store return value
 sysc_tracenogo:
-	tm	__TI_flags+3(%r9),_TIF_SYSCALL_TRACE
+	tm	__TI_flags+3(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)
         bno     BASED(sysc_return)
 	l	%r1,BASED(.Ltrace)
+	la	%r2,SP_PTREGS(%r15)    # load pt_regs
+	la	%r3,1
 	la	%r14,BASED(sysc_return)
 	br	%r1
 
@@ -502,7 +506,7 @@ pgm_svcper:
 	lr	%r7,%r1           # copy svc number to %r7
 	sla	%r7,2             # *4
 pgm_svcstd:
-	tm	__TI_flags+3(%r9),_TIF_SYSCALL_TRACE
+	tm	__TI_flags+3(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)
         l       %r8,sys_call_table-system_call(%r7,%r13) # get system call addr.
         bo      BASED(pgm_tracesys)
         basr    %r14,%r8          # call sys_xxxx
@@ -529,6 +533,8 @@ pgm_svcper_nosig:
 #
 pgm_tracesys:
         l       %r1,BASED(.Ltrace)
+	la	%r2,SP_PTREGS(%r15)    # load pt_regs
+	la	%r3,0
 	srl	%r7,2
 	st	%r7,SP_R2(%r15)
         basr    %r14,%r1
@@ -543,9 +549,11 @@ pgm_svc_go:
         basr    %r14,%r8          # call sys_xxx
         st      %r2,SP_R2(%r15)   # store return value
 pgm_svc_nogo:
-	tm	__TI_flags+3(%r9),_TIF_SYSCALL_TRACE
+	tm	__TI_flags+3(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)
         bno     BASED(pgm_svcret)
         l       %r1,BASED(.Ltrace)
+	la	%r2,SP_PTREGS(%r15)    # load pt_regs
+	la	%r3,1
 	la	%r14,BASED(pgm_svcret)
         br      %r1
 
--- diff/arch/s390/kernel/entry64.S	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/s390/kernel/entry64.S	2004-04-21 10:45:33.802564728 +0100
@@ -227,7 +227,7 @@ sysc_do_restart:
 	larl    %r10,sys_call_table_emu  # use 31 bit emulation system calls
 sysc_noemu:
 #endif
-	tm	__TI_flags+7(%r9),_TIF_SYSCALL_TRACE
+	tm	__TI_flags+7(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)
         lgf     %r8,0(%r7,%r10)   # load address of system call routine
         jo      sysc_tracesys
         basr    %r14,%r8          # call sys_xxxx
@@ -299,6 +299,8 @@ __critical_end:
 # special linkage: %r12 contains the return address for trace_svc
 #
 sysc_tracesys:
+	la	%r2,SP_PTREGS(%r15)    # load pt_regs
+	la	%r3,0
 	srl	%r7,2
 	stg     %r7,SP_R2(%r15)
         brasl   %r14,syscall_trace
@@ -314,8 +316,10 @@ sysc_tracego:
         basr    %r14,%r8            # call sys_xxx
         stg     %r2,SP_R2(%r15)     # store return value
 sysc_tracenogo:
-	tm	__TI_flags+7(%r9),_TIF_SYSCALL_TRACE
+	tm	__TI_flags+7(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)
         jno     sysc_return
+	la	%r2,SP_PTREGS(%r15)    # load pt_regs
+	la	%r3,1
 	larl	%r14,sysc_return    # return point is sysc_return
 	jg	syscall_trace
 
@@ -541,7 +545,7 @@ pgm_svcstd:
 	larl    %r10,sys_call_table_emu # use 31 bit emulation system calls
 pgm_svcper_noemu:
 #endif
-	tm	__TI_flags+7(%r9),_TIF_SYSCALL_TRACE
+	tm	__TI_flags+7(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)
         lgf     %r8,0(%r7,%r10)   # load address of system call routine
         jo      pgm_tracesys
         basr    %r14,%r8          # call sys_xxxx
@@ -566,6 +570,8 @@ pgm_svcper_nosig:
 # call trace before and after sys_call
 #
 pgm_tracesys:
+	la	%r2,SP_PTREGS(%r15)    # load pt_regs
+	la	%r3,0
 	srlg	%r7,%r7,2
 	stg	%r7,SP_R2(%r15)
         brasl   %r14,syscall_trace
@@ -581,8 +587,10 @@ pgm_svc_go:
         basr    %r14,%r8            # call sys_xxx
         stg     %r2,SP_R2(%r15)     # store return value
 pgm_svc_nogo:
-	tm	__TI_flags+7(%r9),_TIF_SYSCALL_TRACE
+	tm	__TI_flags+7(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)
         jno     pgm_svcret
+	la	%r2,SP_PTREGS(%r15)    # load pt_regs
+	la	%r3,1
 	larl	%r14,pgm_svcret     # return point is sysc_return
 	jg	syscall_trace
 
--- diff/arch/s390/kernel/process.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/s390/kernel/process.c	2004-04-21 10:45:33.802564728 +0100
@@ -384,8 +384,6 @@ void dump_thread(struct pt_regs * regs, 
 /*
  * These bracket the sleeping functions..
  */
-extern void scheduling_functions_start_here(void);
-extern void scheduling_functions_end_here(void);
 #define first_sched	((unsigned long) scheduling_functions_start_here)
 #define last_sched	((unsigned long) scheduling_functions_end_here)
 
--- diff/arch/s390/kernel/ptrace.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/s390/kernel/ptrace.c	2004-04-21 10:45:33.803564576 +0100
@@ -690,8 +690,16 @@ out:
 }
 
 asmlinkage void
-syscall_trace(void)
+syscall_trace(struct pt_regs *regs, int entryexit)
 {
+	if (unlikely(current->audit_context)) {
+		if (!entryexit)
+			audit_syscall_entry(current, regs->gprs[2],
+					    regs->orig_gpr2, regs->gprs[3],
+					    regs->gprs[4], regs->gprs[5]);
+		else
+			audit_syscall_exit(current, regs->gprs[2]);
+	}
 	if (!test_thread_flag(TIF_SYSCALL_TRACE))
 		return;
 	if (!(current->ptrace & PT_PTRACED))
--- diff/arch/s390/kernel/semaphore.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/s390/kernel/semaphore.c	2004-04-21 10:45:33.803564576 +0100
@@ -11,6 +11,7 @@
  */
 #include <linux/sched.h>
 #include <linux/errno.h>
+#include <linux/init.h>
 
 #include <asm/semaphore.h>
 
@@ -60,7 +61,7 @@ void __up(struct semaphore *sem)
  *   count > 0: decrement count, wake up queue and exit.
  *   count <= 0: set count to -1, go to sleep.
  */
-void __down(struct semaphore * sem)
+void __sched __down(struct semaphore * sem)
 {
 	struct task_struct *tsk = current;
 	DECLARE_WAITQUEUE(wait, tsk);
@@ -82,7 +83,7 @@ void __down(struct semaphore * sem)
  *   count > 0: wake up queue and exit.
  *   count <= 0: set count to 0, wake up queue and exit.
  */
-int __down_interruptible(struct semaphore * sem)
+int __sched __down_interruptible(struct semaphore * sem)
 {
 	int retval = 0;
 	struct task_struct *tsk = current;
--- diff/arch/s390/kernel/syscalls.S	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/s390/kernel/syscalls.S	2004-04-21 10:45:33.804564424 +0100
@@ -275,3 +275,13 @@ NI_SYSCALL							/* reserved for vserver
 SYSCALL(s390_fadvise64_64,sys_ni_syscall,sys32_fadvise64_64_wrapper)
 SYSCALL(sys_statfs64,sys_statfs64,compat_sys_statfs64_wrapper)
 SYSCALL(sys_fstatfs64,sys_fstatfs64,compat_sys_fstatfs64_wrapper)
+NI_SYSCALL							/* 267 new sys_remap_file_pages */
+NI_SYSCALL							/* 268 sys_mbind */
+NI_SYSCALL							/* 269 sys_get_mempolicy */
+NI_SYSCALL							/* 270 sys_set_mempolicy */
+SYSCALL(sys_mq_open,sys_mq_open,compat_sys_mq_open_wrapper)
+SYSCALL(sys_mq_unlink,sys_mq_unlink,sys32_mq_unlink_wrapper)
+SYSCALL(sys_mq_timedsend,sys_mq_timedsend,compat_sys_mq_timedsend_wrapper)
+SYSCALL(sys_mq_timedreceive,sys_mq_timedreceive,compat_sys_mq_timedreceive_wrapper)
+SYSCALL(sys_mq_notify,sys_mq_notify,compat_sys_mq_notify_wrapper)
+SYSCALL(sys_mq_getsetattr,sys_mq_getsetattr,compat_sys_mq_getsetattr_wrapper)
--- diff/arch/s390/kernel/vmlinux.lds.S	2004-02-09 10:36:09.000000000 +0000
+++ source/arch/s390/kernel/vmlinux.lds.S	2004-04-21 10:45:33.804564424 +0100
@@ -23,6 +23,7 @@ SECTIONS
   _text = .;			/* Text and read-only data */
   .text : {
 	*(.text)
+	SCHED_TEXT
 	*(.fixup)
 	*(.gnu.warning)
 	} = 0x0700
--- diff/arch/sh/boards/dreamcast/rtc.c	2003-06-30 10:07:19.000000000 +0100
+++ source/arch/sh/boards/dreamcast/rtc.c	2004-04-21 10:45:33.804564424 +0100
@@ -28,7 +28,7 @@ extern int (*rtc_set_time)(const time_t)
 
 /**
  * aica_rtc_gettimeofday - Get the time from the AICA RTC
- * @tv: pointer to resulting timeval
+ * @ts: pointer to resulting timespec
  *
  * Grabs the current RTC seconds counter and adjusts it to the Unix Epoch.
  */
@@ -51,7 +51,7 @@ void aica_rtc_gettimeofday(struct timesp
 
 /**
  * aica_rtc_settimeofday - Set the AICA RTC to the current time
- * @tv: contains the timeval to set
+ * @secs: contains the time_t to set
  *
  * Adjusts the given @tv to the AICA Epoch and sets the RTC seconds counter.
  */
--- diff/arch/sh/kernel/process.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/sh/kernel/process.c	2004-04-21 10:45:33.805564272 +0100
@@ -464,8 +464,6 @@ out:
 /*
  * These bracket the sleeping functions..
  */
-extern void scheduling_functions_start_here(void);
-extern void scheduling_functions_end_here(void);
 #define first_sched	((unsigned long) scheduling_functions_start_here)
 #define last_sched	((unsigned long) scheduling_functions_end_here)
 
@@ -481,7 +479,7 @@ unsigned long get_wchan(struct task_stru
 	 * The same comment as on the Alpha applies here, too ...
 	 */
 	pc = thread_saved_pc(p);
-	if (pc >= (unsigned long) interruptible_sleep_on && pc < (unsigned long) add_timer) {
+	if (pc >= first_sched && pc < last_sched) {
 		schedule_frame = ((unsigned long *)(long)p->thread.sp)[1];
 		return (unsigned long)((unsigned long *)schedule_frame)[1];
 	}
--- diff/arch/sh/kernel/semaphore.c	2003-07-08 09:55:18.000000000 +0100
+++ source/arch/sh/kernel/semaphore.c	2004-04-21 10:45:33.805564272 +0100
@@ -10,6 +10,7 @@
 #include <linux/errno.h>
 #include <linux/sched.h>
 #include <linux/wait.h>
+#include <linux/init.h>
 #include <asm/semaphore.h>
 #include <asm/semaphore-helper.h>
 
@@ -103,7 +104,7 @@ void __up(struct semaphore *sem)
 	tsk->state = TASK_RUNNING;		\
 	remove_wait_queue(&sem->wait, &wait);
 
-void __down(struct semaphore * sem)
+void __sched __down(struct semaphore * sem)
 {
 	DOWN_VAR
 	DOWN_HEAD(TASK_UNINTERRUPTIBLE)
@@ -113,7 +114,7 @@ void __down(struct semaphore * sem)
 	DOWN_TAIL(TASK_UNINTERRUPTIBLE)
 }
 
-int __down_interruptible(struct semaphore * sem)
+int __sched __down_interruptible(struct semaphore * sem)
 {
 	int ret = 0;
 	DOWN_VAR
--- diff/arch/sh/kernel/vmlinux.lds.S	2003-08-26 10:00:52.000000000 +0100
+++ source/arch/sh/kernel/vmlinux.lds.S	2004-04-21 10:45:33.805564272 +0100
@@ -22,6 +22,7 @@ SECTIONS
 	} = 0
   .text : {
 	*(.text)
+	SCHED_TEXT
 	*(.fixup)
 	*(.gnu.warning)
 	} = 0x0009
--- diff/arch/sh/mm/hugetlbpage.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/sh/mm/hugetlbpage.c	2004-04-21 10:45:33.806564120 +0100
@@ -24,67 +24,6 @@
 #include <asm/tlbflush.h>
 #include <asm/cacheflush.h>
 
-static long	htlbpagemem;
-int		htlbpage_max;
-static long	htlbzone_pages;
-
-static struct list_head hugepage_freelists[MAX_NUMNODES];
-static spinlock_t htlbpage_lock = SPIN_LOCK_UNLOCKED;
-
-static void enqueue_huge_page(struct page *page)
-{
-	list_add(&page->list,
-		 &hugepage_freelists[page_zone(page)->zone_pgdat->node_id]);
-}
-
-static struct page *dequeue_huge_page(void)
-{
-	int nid = numa_node_id();
-	struct page *page = NULL;
-
-	if (list_empty(&hugepage_freelists[nid])) {
-		for (nid = 0; nid < MAX_NUMNODES; ++nid)
-			if (!list_empty(&hugepage_freelists[nid]))
-				break;
-	}
-	if (nid >= 0 && nid < MAX_NUMNODES &&
-	    !list_empty(&hugepage_freelists[nid])) {
-		page = list_entry(hugepage_freelists[nid].next,
-				  struct page, list);
-		list_del(&page->list);
-	}
-	return page;
-}
-
-static struct page *alloc_fresh_huge_page(void)
-{
-	static int nid = 0;
-	struct page *page;
-	page = alloc_pages_node(nid, GFP_HIGHUSER, HUGETLB_PAGE_ORDER);
-	nid = (nid + 1) % numnodes;
-	return page;
-}
-
-static void free_huge_page(struct page *page);
-
-static struct page *alloc_hugetlb_page(void)
-{
-	struct page *page;
-
-	spin_lock(&htlbpage_lock);
-	page = dequeue_huge_page();
-	if (!page) {
-		spin_unlock(&htlbpage_lock);
-		return NULL;
-	}
-	htlbpagemem--;
-	spin_unlock(&htlbpage_lock);
-	set_page_count(page, 1);
-	page->lru.prev = (void *)free_huge_page;
-	memset(page_address(page), 0, HPAGE_SIZE);
-	return page;
-}
-
 static pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
 {
 	pgd_t *pgd;
@@ -227,15 +166,9 @@ int follow_hugetlb_page(struct mm_struct
 }
 
 struct page *follow_huge_addr(struct mm_struct *mm,
-			      struct vm_area_struct *vma,
 			      unsigned long address, int write)
 {
-	return NULL;
-}
-
-struct vm_area_struct *hugepage_vma(struct mm_struct *mm, unsigned long addr)
-{
-	return NULL;
+	return ERR_PTR(-EINVAL);
 }
 
 int pmd_huge(pmd_t pmd)
@@ -249,27 +182,6 @@ struct page *follow_huge_pmd(struct mm_s
 	return NULL;
 }
 
-static void free_huge_page(struct page *page)
-{
-	BUG_ON(page_count(page));
-	BUG_ON(page->mapping);
-
-	INIT_LIST_HEAD(&page->list);
-
-	spin_lock(&htlbpage_lock);
-	enqueue_huge_page(page);
-	htlbpagemem++;
-	spin_unlock(&htlbpage_lock);
-}
-
-void huge_page_release(struct page *page)
-{
-	if (!put_page_testzero(page))
-		return;
-
-	free_huge_page(page);
-}
-
 void unmap_hugepage_range(struct vm_area_struct *vma,
 			  unsigned long start, unsigned long end)
 {
@@ -298,16 +210,6 @@ void unmap_hugepage_range(struct vm_area
 	flush_tlb_range(vma, start, end);
 }
 
-void zap_hugepage_range(struct vm_area_struct *vma,
-			unsigned long start, unsigned long length)
-{
-	struct mm_struct *mm = vma->vm_mm;
-
-	spin_lock(&mm->page_table_lock);
-	unmap_hugepage_range(vma, start, start + length);
-	spin_unlock(&mm->page_table_lock);
-}
-
 int hugetlb_prefault(struct address_space *mapping, struct vm_area_struct *vma)
 {
 	struct mm_struct *mm = current->mm;
@@ -339,7 +241,7 @@ int hugetlb_prefault(struct address_spac
 				ret = -ENOMEM;
 				goto out;
 			}
-			page = alloc_hugetlb_page();
+			page = alloc_huge_page();
 			if (!page) {
 				hugetlb_put_quota(mapping);
 				ret = -ENOMEM;
@@ -359,168 +261,3 @@ out:
 	spin_unlock(&mm->page_table_lock);
 	return ret;
 }
-
-static void update_and_free_page(struct page *page)
-{
-	int j;
-	struct page *map;
-
-	map = page;
-	htlbzone_pages--;
-	for (j = 0; j < (HPAGE_SIZE / PAGE_SIZE); j++) {
-		map->flags &= ~(1 << PG_locked | 1 << PG_error | 1 << PG_referenced |
-				1 << PG_dirty | 1 << PG_active | 1 << PG_reserved |
-				1 << PG_private | 1<< PG_writeback);
-		set_page_count(map, 0);
-		map++;
-	}
-	set_page_count(page, 1);
-	__free_pages(page, HUGETLB_PAGE_ORDER);
-}
-
-static int try_to_free_low(int count)
-{
-	struct list_head *p;
-	struct page *page, *map;
-
-	map = NULL;
-	spin_lock(&htlbpage_lock);
-	/* all lowmem is on node 0 */
-	list_for_each(p, &hugepage_freelists[0]) {
-		if (map) {
-			list_del(&map->list);
-			update_and_free_page(map);
-			htlbpagemem--;
-			map = NULL;
-			if (++count == 0)
-				break;
-		}
-		page = list_entry(p, struct page, list);
-		if (!PageHighMem(page))
-			map = page;
-	}
-	if (map) {
-		list_del(&map->list);
-		update_and_free_page(map);
-		htlbpagemem--;
-		count++;
-	}
-	spin_unlock(&htlbpage_lock);
-	return count;
-}
-
-static int set_hugetlb_mem_size(int count)
-{
-	int lcount;
-	struct page *page;
-
-	if (count < 0)
-		lcount = count;
-	else
-		lcount = count - htlbzone_pages;
-
-	if (lcount == 0)
-		return (int)htlbzone_pages;
-	if (lcount > 0) {	/* Increase the mem size. */
-		while (lcount--) {
-			page = alloc_fresh_huge_page();
-			if (page == NULL)
-				break;
-			spin_lock(&htlbpage_lock);
-			enqueue_huge_page(page);
-			htlbpagemem++;
-			htlbzone_pages++;
-			spin_unlock(&htlbpage_lock);
-		}
-		return (int) htlbzone_pages;
-	}
-	/* Shrink the memory size. */
-	lcount = try_to_free_low(lcount);
-	while (lcount++) {
-		page = alloc_hugetlb_page();
-		if (page == NULL)
-			break;
-		spin_lock(&htlbpage_lock);
-		update_and_free_page(page);
-		spin_unlock(&htlbpage_lock);
-	}
-	return (int) htlbzone_pages;
-}
-
-int hugetlb_sysctl_handler(struct ctl_table *table, int write,
-			   struct file *file, void *buffer, size_t *length)
-{
-	proc_dointvec(table, write, file, buffer, length);
-	htlbpage_max = set_hugetlb_mem_size(htlbpage_max);
-	return 0;
-}
-
-static int __init hugetlb_setup(char *s)
-{
-	if (sscanf(s, "%d", &htlbpage_max) <= 0)
-		htlbpage_max = 0;
-	return 1;
-}
-__setup("hugepages=", hugetlb_setup);
-
-static int __init hugetlb_init(void)
-{
-	int i;
-	struct page *page;
-
-	for (i = 0; i < MAX_NUMNODES; ++i)
-		INIT_LIST_HEAD(&hugepage_freelists[i]);
-
-	for (i = 0; i < htlbpage_max; ++i) {
-		page = alloc_fresh_huge_page();
-		if (!page)
-			break;
-		spin_lock(&htlbpage_lock);
-		enqueue_huge_page(page);
-		spin_unlock(&htlbpage_lock);
-	}
-	htlbpage_max = htlbpagemem = htlbzone_pages = i;
-	printk("Total HugeTLB memory allocated, %ld\n", htlbpagemem);
-	return 0;
-}
-module_init(hugetlb_init);
-
-int hugetlb_report_meminfo(char *buf)
-{
-	return sprintf(buf,
-			"HugePages_Total: %5lu\n"
-			"HugePages_Free:  %5lu\n"
-			"Hugepagesize:    %5lu kB\n",
-			htlbzone_pages,
-			htlbpagemem,
-			HPAGE_SIZE/1024);
-}
-
-int is_hugepage_mem_enough(size_t size)
-{
-	return (size + ~HPAGE_MASK)/HPAGE_SIZE <= htlbpagemem;
-}
-
-/* Return the number pages of memory we physically have, in PAGE_SIZE units. */
-unsigned long hugetlb_total_pages(void)
-{
-	return htlbzone_pages * (HPAGE_SIZE / PAGE_SIZE);
-}
-EXPORT_SYMBOL(hugetlb_total_pages);
-
-/*
- * We cannot handle pagefaults against hugetlb pages at all.  They cause
- * handle_mm_fault() to try to instantiate regular-sized pages in the
- * hugegpage VMA.  do_page_fault() is supposed to trap this, so BUG is we get
- * this far.
- */
-static struct page *hugetlb_nopage(struct vm_area_struct *vma,
-				   unsigned long address, int *unused)
-{
-	BUG();
-	return NULL;
-}
-
-struct vm_operations_struct hugetlb_vm_ops = {
-	.nopage = hugetlb_nopage,
-};
--- diff/arch/sparc/kernel/entry.S	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/sparc/kernel/entry.S	2004-04-21 10:45:33.822561688 +0100
@@ -38,7 +38,7 @@
 
 #define curptr      g6
 
-#define NR_SYSCALLS 273      /* Each OS is different... */
+#define NR_SYSCALLS 283      /* Each OS is different... */
 
 /* These are just handy. */
 #define _SV	save	%sp, -STACKFRAME_SZ, %sp
--- diff/arch/sparc/kernel/process.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/sparc/kernel/process.c	2004-04-21 10:45:33.830560472 +0100
@@ -28,6 +28,7 @@
 #include <linux/reboot.h>
 #include <linux/delay.h>
 #include <linux/pm.h>
+#include <linux/init.h>
 
 #include <asm/auxio.h>
 #include <asm/oplib.h>
@@ -55,6 +56,12 @@ void (*pm_idle)(void);
  */
 void (*pm_power_off)(void);
 
+/*
+ * sysctl - toggle power-off restriction for serial console 
+ * systems in machine_power_off()
+ */
+int scons_pwroff = 1;
+
 extern void fpsave(unsigned long *, unsigned long *, void *, unsigned long *);
 
 struct task_struct *last_task_used_math = NULL;
@@ -186,7 +193,7 @@ EXPORT_SYMBOL(machine_restart);
 void machine_power_off(void)
 {
 #ifdef CONFIG_SUN_AUXIO
-	if (auxio_power_register && !serial_console)
+	if (auxio_power_register && (!serial_console || scons_pwroff))
 		*auxio_power_register |= AUXIO_POWER_OFF;
 #endif
 	machine_halt();
@@ -317,7 +324,7 @@ void show_stack(struct task_struct *tsk,
 	fp = (unsigned long) _ksp;
 	do {
 		/* Bogus frame pointer? */
-		if (fp < (task_base + sizeof(struct task_struct)) ||
+		if (fp < (task_base + sizeof(struct thread_info)) ||
 		    fp >= (task_base + (PAGE_SIZE << 1)))
 			break;
 		rw = (struct reg_window *) fp;
@@ -694,9 +701,6 @@ pid_t kernel_thread(int (*fn)(void *), v
 	return retval;
 }
 
-extern void scheduling_functions_start_here(void);
-extern void scheduling_functions_end_here(void);
-
 unsigned long get_wchan(struct task_struct *task)
 {
 	unsigned long pc, fp, bias = 0;
@@ -712,7 +716,7 @@ unsigned long get_wchan(struct task_stru
 	fp = task->thread_info->ksp + bias;
 	do {
 		/* Bogus frame pointer? */
-		if (fp < (task_base + sizeof(struct task_struct)) ||
+		if (fp < (task_base + sizeof(struct thread_info)) ||
 		    fp >= (task_base + (2 * PAGE_SIZE)))
 			break;
 		rw = (struct reg_window *) fp;
--- diff/arch/sparc/kernel/semaphore.c	2004-02-18 08:54:08.000000000 +0000
+++ source/arch/sparc/kernel/semaphore.c	2004-04-21 10:45:33.839559104 +0100
@@ -4,6 +4,7 @@
 
 #include <linux/sched.h>
 #include <linux/errno.h>
+#include <linux/init.h>
 
 #include <asm/semaphore.h>
 
@@ -45,7 +46,7 @@ void __up(struct semaphore *sem)
 
 static spinlock_t semaphore_lock = SPIN_LOCK_UNLOCKED;
 
-void __down(struct semaphore * sem)
+void __sched __down(struct semaphore * sem)
 {
 	struct task_struct *tsk = current;
 	DECLARE_WAITQUEUE(wait, tsk);
@@ -78,7 +79,7 @@ void __down(struct semaphore * sem)
 	wake_up(&sem->wait);
 }
 
-int __down_interruptible(struct semaphore * sem)
+int __sched __down_interruptible(struct semaphore * sem)
 {
 	int retval = 0;
 	struct task_struct *tsk = current;
--- diff/arch/sparc/kernel/systbls.S	2003-11-25 15:24:57.000000000 +0000
+++ source/arch/sparc/kernel/systbls.S	2004-04-21 10:45:33.840558952 +0100
@@ -73,7 +73,9 @@ sys_call_table:
 /*255*/	.long sys_nis_syscall, sys_clock_settime, sys_clock_gettime, sys_clock_getres, sys_clock_nanosleep
 /*260*/	.long sys_sched_getaffinity, sys_sched_setaffinity, sys_timer_settime, sys_timer_gettime, sys_timer_getoverrun
 /*265*/	.long sys_timer_delete, sys_timer_create, sys_nis_syscall, sys_io_setup, sys_io_destroy
-/*270*/	.long sys_io_submit, sys_io_cancel, sys_io_getevents, sys_nis_syscall
+/*270*/	.long sys_io_submit, sys_io_cancel, sys_io_getevents, sys_mq_open, sys_mq_unlink
+/*275*/	.long sys_mq_timedsend, sys_mq_timedreceive, sys_mq_notify, sys_mq_getsetattr, sys_ni_syscall
+/*280*/	.long sys_ni_syscall, sys_ni_syscall, sys_ni_syscall
 
 #ifdef CONFIG_SUNOS_EMUL
 	/* Now the SunOS syscall table. */
@@ -175,6 +177,9 @@ sunos_sys_table:
 	.long sunos_nosys, sunos_nosys, sunos_nosys
 	.long sunos_nosys
 /*270*/	.long sunos_nosys, sunos_nosys, sunos_nosys
+	.long sunos_nosys, sunos_nosys, sunos_nosys
+	.long sunos_nosys, sunos_nosys, sunos_nosys
 	.long sunos_nosys
+/*280*/	.long sunos_nosys, sunos_nosys, sunos_nosys
 
 #endif
--- diff/arch/sparc/kernel/vmlinux.lds.S	2003-08-26 10:00:52.000000000 +0100
+++ source/arch/sparc/kernel/vmlinux.lds.S	2004-04-21 10:45:33.840558952 +0100
@@ -12,6 +12,7 @@ SECTIONS
   .text 0xf0004000 :
   {
     *(.text)
+    SCHED_TEXT
     *(.gnu.warning)
   } =0
   _etext = .;
--- diff/arch/sparc/lib/rwsem.S	2002-10-16 04:28:27.000000000 +0100
+++ source/arch/sparc/lib/rwsem.S	2004-04-21 10:45:33.840558952 +0100
@@ -8,7 +8,7 @@
 #include <asm/ptrace.h>
 #include <asm/psr.h>
 
-	.text
+	.section .sched.text
 	.align	4
 
 	.globl		___down_read
@@ -113,6 +113,7 @@ ___down_write:
 	ba		2b
 	 restore	%l5, %g0, %g5
 
+	.text
 	.globl		___up_read
 ___up_read:
 	rd		%psr, %g3
--- diff/arch/sparc64/Kconfig	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/sparc64/Kconfig	2004-04-21 10:45:33.852557128 +0100
@@ -700,6 +700,11 @@ config MCOUNT
 	depends on STACK_DEBUG
 	default y
 
+config FRAME_POINTER
+	bool
+	depends on MCOUNT
+	default y
+
 endmenu
 
 source "security/Kconfig"
--- diff/arch/sparc64/Makefile	2003-08-26 10:00:52.000000000 +0100
+++ source/arch/sparc64/Makefile	2004-04-21 10:45:33.852557128 +0100
@@ -52,7 +52,6 @@ ifeq ($(INLINE_LIMIT),y)
 endif
 
 ifeq ($(CONFIG_MCOUNT),y)
-  CFLAGS := $(subst -fomit-frame-pointer,,$(CFLAGS))
   CFLAGS := $(CFLAGS) -pg
 endif
 
--- diff/arch/sparc64/kernel/binfmt_aout32.c	2002-10-16 04:28:22.000000000 +0100
+++ source/arch/sparc64/kernel/binfmt_aout32.c	2004-04-21 10:45:33.860555912 +0100
@@ -310,7 +310,7 @@ beyond_if:
 	orig_thr_flags = current_thread_info()->flags;
 	current_thread_info()->flags |= _TIF_32BIT;
 
-	retval = setup_arg_pages(bprm);
+	retval = setup_arg_pages(bprm, EXSTACK_DEFAULT);
 	if (retval < 0) { 
 		current_thread_info()->flags = orig_thr_flags;
 
--- diff/arch/sparc64/kernel/binfmt_elf32.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/sparc64/kernel/binfmt_elf32.c	2004-04-21 10:45:33.870554392 +0100
@@ -151,4 +151,7 @@ MODULE_AUTHOR("Eric Youngdale, David S. 
 #undef MODULE_DESCRIPTION
 #undef MODULE_AUTHOR
 
+#undef TASK_SIZE
+#define TASK_SIZE 0xf0000000
+
 #include "../../../fs/binfmt_elf.c"
--- diff/arch/sparc64/kernel/entry.S	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/sparc64/kernel/entry.S	2004-04-21 10:45:33.878553176 +0100
@@ -26,7 +26,7 @@
 
 #define curptr      g6
 
-#define NR_SYSCALLS 273      /* Each OS is different... */
+#define NR_SYSCALLS 283      /* Each OS is different... */
 
 	.text
 	.align		32
--- diff/arch/sparc64/kernel/ioctl32.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/sparc64/kernel/ioctl32.c	2004-04-21 10:45:33.879553024 +0100
@@ -1106,17 +1106,6 @@ COMPATIBLE_IOCTL(DRM_IOCTL_FINISH)
 COMPATIBLE_IOCTL(WIOCSTART)
 COMPATIBLE_IOCTL(WIOCSTOP)
 COMPATIBLE_IOCTL(WIOCGSTAT)
-COMPATIBLE_IOCTL(HCIUARTSETPROTO)
-COMPATIBLE_IOCTL(HCIUARTGETPROTO)
-COMPATIBLE_IOCTL(RFCOMMCREATEDEV)
-COMPATIBLE_IOCTL(RFCOMMRELEASEDEV)
-COMPATIBLE_IOCTL(RFCOMMGETDEVLIST)
-COMPATIBLE_IOCTL(RFCOMMGETDEVINFO)
-COMPATIBLE_IOCTL(RFCOMMSTEALDLC)
-COMPATIBLE_IOCTL(BNEPCONNADD)
-COMPATIBLE_IOCTL(BNEPCONNDEL)
-COMPATIBLE_IOCTL(BNEPGETCONNLIST)
-COMPATIBLE_IOCTL(BNEPGETCONNINFO)
 /* And these ioctls need translation */
 /* NCPFS */
 HANDLE_IOCTL(NCP_IOC_NCPREQUEST_32, do_ncp_ncprequest)
--- diff/arch/sparc64/kernel/power.c	2004-02-09 10:36:09.000000000 +0000
+++ source/arch/sparc64/kernel/power.c	2004-04-21 10:45:33.879553024 +0100
@@ -20,6 +20,12 @@
 #define __KERNEL_SYSCALLS__
 #include <linux/unistd.h>
 
+/*
+ * sysctl - toggle power-off restriction for serial console 
+ * systems in machine_power_off()
+ */
+int scons_pwroff = 1; 
+
 #ifdef CONFIG_PCI
 static unsigned long power_reg = 0UL;
 
@@ -44,7 +50,7 @@ static void (*poweroff_method)(void) = m
 
 void machine_power_off(void)
 {
-	if (!serial_console) {
+	if (!serial_console || scons_pwroff) {
 #ifdef CONFIG_PCI
 		if (power_reg != 0UL) {
 			/* Both register bits seem to have the
--- diff/arch/sparc64/kernel/process.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/sparc64/kernel/process.c	2004-04-21 10:45:33.880552872 +0100
@@ -28,6 +28,7 @@
 #include <linux/config.h>
 #include <linux/reboot.h>
 #include <linux/delay.h>
+#include <linux/init.h>
 
 #include <asm/oplib.h>
 #include <asm/uaccess.h>
@@ -823,9 +824,6 @@ out:
 	return error;
 }
 
-extern void scheduling_functions_start_here(void);
-extern void scheduling_functions_end_here(void);
-
 unsigned long get_wchan(struct task_struct *task)
 {
 	unsigned long pc, fp, bias = 0;
--- diff/arch/sparc64/kernel/semaphore.c	2003-09-17 12:28:03.000000000 +0100
+++ source/arch/sparc64/kernel/semaphore.c	2004-04-21 10:45:33.892551048 +0100
@@ -8,6 +8,7 @@
 
 #include <linux/sched.h>
 #include <linux/errno.h>
+#include <linux/init.h>
 
 /*
  * Atomically update sem->count.
@@ -90,7 +91,7 @@ void up(struct semaphore *sem)
 	: "g5", "g7", "memory", "cc");
 }
 
-static void __down(struct semaphore * sem)
+static void __sched __down(struct semaphore * sem)
 {
 	struct task_struct *tsk = current;
 	DECLARE_WAITQUEUE(wait, tsk);
@@ -108,7 +109,7 @@ static void __down(struct semaphore * se
 	wake_up(&sem->wait);
 }
 
-void down(struct semaphore *sem)
+void __sched down(struct semaphore *sem)
 {
 	might_sleep();
 	/* This atomically does:
@@ -192,7 +193,7 @@ int down_trylock(struct semaphore *sem)
 	return ret;
 }
 
-static int __down_interruptible(struct semaphore * sem)
+static int __sched __down_interruptible(struct semaphore * sem)
 {
 	int retval = 0;
 	struct task_struct *tsk = current;
@@ -216,7 +217,7 @@ static int __down_interruptible(struct s
 	return retval;
 }
 
-int down_interruptible(struct semaphore *sem)
+int __sched down_interruptible(struct semaphore *sem)
 {
 	int ret = 0;
 	
--- diff/arch/sparc64/kernel/signal32.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/sparc64/kernel/signal32.c	2004-04-21 10:45:33.903549376 +0100
@@ -129,7 +129,12 @@ int copy_siginfo_to_user32(siginfo_t32 _
 			err |= __put_user(from->si_trapno, &to->si_trapno);
 			err |= __put_user((long)from->si_addr, &to->si_addr);
 			break;
-		/* case __SI_RT: This is not generated by the kernel as of now.  */
+		case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
+		case __SI_MESGQ >> 16:
+			err |= __put_user(from->si_pid, &to->si_pid);
+			err |= __put_user(from->si_uid, &to->si_uid);
+			err |= __put_user(from->si_int, &to->si_int);
+			break;
 		}
 	}
 	return err;
--- diff/arch/sparc64/kernel/smp.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/sparc64/kernel/smp.c	2004-04-21 10:45:33.915547552 +0100
@@ -671,9 +671,9 @@ static __inline__ void __local_flush_dca
 #if (L1DCACHE_SIZE > PAGE_SIZE)
 	__flush_dcache_page(page->virtual,
 			    ((tlb_type == spitfire) &&
-			     page->mapping != NULL));
+			     page_mapping(page) != NULL));
 #else
-	if (page->mapping != NULL &&
+	if (page_mapping(page) != NULL &&
 	    tlb_type == spitfire)
 		__flush_icache_page(__pa(page->virtual));
 #endif
@@ -694,7 +694,7 @@ void smp_flush_dcache_page_impl(struct p
 		if (tlb_type == spitfire) {
 			data0 =
 				((u64)&xcall_flush_dcache_page_spitfire);
-			if (page->mapping != NULL)
+			if (page_mapping(page) != NULL)
 				data0 |= ((u64)1 << 32);
 			spitfire_xcall_deliver(data0,
 					       __pa(page->virtual),
@@ -727,7 +727,7 @@ void flush_dcache_page_all(struct mm_str
 		goto flush_self;
 	if (tlb_type == spitfire) {
 		data0 = ((u64)&xcall_flush_dcache_page_spitfire);
-		if (page->mapping != NULL)
+		if (page_mapping(page) != NULL)
 			data0 |= ((u64)1 << 32);
 		spitfire_xcall_deliver(data0,
 				       __pa(page->virtual),
--- diff/arch/sparc64/kernel/sys32.S	2003-05-21 11:49:50.000000000 +0100
+++ source/arch/sparc64/kernel/sys32.S	2004-04-21 10:45:33.917547248 +0100
@@ -68,6 +68,17 @@ sys32_mmap2:
 	jmpl		%g1 + %lo(sys_mmap), %g0
 	 sllx		%o5, 12, %o5
 
+	.globl		sys32_mq_timedsend
+sys32_mq_timedsend:
+	sethi		%hi(compat_sys_mq_timedsend), %g1
+	jmpl		%g1 + %lo(compat_sys_mq_timedsend), %g0
+	 srl		%o4, 0, %o4
+	.globl		sys32_mq_timedreceive
+sys32_mq_timedreceive:
+	sethi		%hi(compat_sys_mq_timedreceive), %g1
+	jmpl		%g1 + %lo(compat_sys_mq_timedreceive), %g0
+	 srl		%o4, 0, %o4
+
 	.align		32
 	.globl		sys32_socketcall
 sys32_socketcall:	/* %o0=call, %o1=args */
--- diff/arch/sparc64/kernel/systbls.S	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/sparc64/kernel/systbls.S	2004-04-21 10:45:33.928545576 +0100
@@ -73,7 +73,9 @@ sys_call_table32:
 	.word sys_ni_syscall, compat_clock_settime, compat_clock_gettime, compat_clock_getres, compat_clock_nanosleep
 /*260*/	.word compat_sys_sched_getaffinity, compat_sys_sched_setaffinity, compat_timer_settime, compat_timer_gettime, sys_timer_getoverrun
 	.word sys_timer_delete, sys32_timer_create, sys_ni_syscall, compat_sys_io_setup, sys_io_destroy
-/*270*/	.word compat_sys_io_submit, sys_io_cancel, compat_sys_io_getevents, sys_ni_syscall
+/*270*/	.word compat_sys_io_submit, sys_io_cancel, compat_sys_io_getevents, compat_sys_mq_open, sys_mq_unlink
+	.word sys32_mq_timedsend, sys32_mq_timedreceive, compat_sys_mq_notify, compat_sys_mq_getsetattr, sys_ni_syscall
+/*280*/	.word sys_ni_syscall, sys_ni_syscall, sys_ni_syscall
 
 	/* Now the 64-bit native Linux syscall table. */
 
@@ -135,7 +137,9 @@ sys_call_table:
 	.word sys_ni_syscall, sys_clock_settime, sys_clock_gettime, sys_clock_getres, sys_clock_nanosleep
 /*260*/	.word sys_sched_getaffinity, sys_sched_setaffinity, sys_timer_settime, sys_timer_gettime, sys_timer_getoverrun
 	.word sys_timer_delete, sys_timer_create, sys_ni_syscall, sys_io_setup, sys_io_destroy
-/*270*/	.word sys_io_submit, sys_io_cancel, sys_io_getevents, sys_ni_syscall
+/*270*/	.word sys_io_submit, sys_io_cancel, sys_io_getevents, sys_mq_open, sys_mq_unlink
+	.word sys_mq_timedsend, sys_mq_timedreceive, sys_mq_notify, sys_mq_getsetattr, sys_ni_syscall
+/*280*/	.word sys_ni_syscall, sys_ni_syscall, sys_ni_syscall
 
 #if defined(CONFIG_SUNOS_EMUL) || defined(CONFIG_SOLARIS_EMUL) || \
     defined(CONFIG_SOLARIS_EMUL_MODULE)
@@ -237,5 +241,8 @@ sunos_sys_table:
 	.word sunos_nosys, sunos_nosys, sunos_nosys
 	.word sunos_nosys, sunos_nosys, sunos_nosys
 	.word sunos_nosys, sunos_nosys, sunos_nosys
+	.word sunos_nosys, sunos_nosys, sunos_nosys
+	.word sunos_nosys, sunos_nosys, sunos_nosys
+	.word sunos_nosys, sunos_nosys, sunos_nosys
 
 #endif
--- diff/arch/sparc64/kernel/vmlinux.lds.S	2003-08-26 10:00:52.000000000 +0100
+++ source/arch/sparc64/kernel/vmlinux.lds.S	2004-04-21 10:45:33.928545576 +0100
@@ -15,6 +15,7 @@ SECTIONS
   .text 0x0000000000404000 :
   {
     *(.text)
+    SCHED_TEXT
     *(.gnu.warning)
   } =0
   _etext = .;
--- diff/arch/sparc64/lib/mcount.S	2002-10-16 04:28:23.000000000 +0100
+++ source/arch/sparc64/lib/mcount.S	2004-04-21 10:45:33.928545576 +0100
@@ -30,8 +30,9 @@ ovstack:
 #endif
 	.text
 	.align 32
-	.globl mcount
+	.globl mcount, _mcount
 mcount:
+_mcount:
 #ifdef CONFIG_STACK_DEBUG
 	/*
 	 * Check whether %sp is dangerously low.
--- diff/arch/sparc64/lib/rwsem.c	2003-05-21 11:50:00.000000000 +0100
+++ source/arch/sparc64/lib/rwsem.c	2004-04-21 10:45:33.933544816 +0100
@@ -6,6 +6,7 @@
 
 #include <linux/kernel.h>
 #include <linux/rwsem.h>
+#include <linux/init.h>
 #include <linux/module.h>
 
 extern struct rw_semaphore *FASTCALL(rwsem_down_read_failed(struct rw_semaphore *sem));
@@ -13,7 +14,7 @@ extern struct rw_semaphore *FASTCALL(rws
 extern struct rw_semaphore *FASTCALL(rwsem_wake(struct rw_semaphore *));
 extern struct rw_semaphore *FASTCALL(rwsem_downgrade_wake(struct rw_semaphore *));
 
-void __down_read(struct rw_semaphore *sem)
+void __sched __down_read(struct rw_semaphore *sem)
 {
 	__asm__ __volatile__(
 		"! beginning __down_read\n"
@@ -72,7 +73,7 @@ int __down_read_trylock(struct rw_semaph
 }
 EXPORT_SYMBOL(__down_read_trylock);
 
-void __down_write(struct rw_semaphore *sem)
+void __sched __down_write(struct rw_semaphore *sem)
 {
 	__asm__ __volatile__(
 		"! beginning __down_write\n\t"
--- diff/arch/sparc64/mm/hugetlbpage.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/sparc64/mm/hugetlbpage.c	2004-04-21 10:45:33.942543448 +0100
@@ -5,6 +5,7 @@
  */
 
 #include <linux/config.h>
+#include <linux/module.h>
 #include <linux/init.h>
 #include <linux/fs.h>
 #include <linux/mm.h>
@@ -13,6 +14,7 @@
 #include <linux/smp_lock.h>
 #include <linux/slab.h>
 #include <linux/sysctl.h>
+#include <linux/module.h>
 
 #include <asm/mman.h>
 #include <asm/pgalloc.h>
@@ -20,67 +22,6 @@
 #include <asm/tlbflush.h>
 #include <asm/cacheflush.h>
 
-static long	htlbpagemem;
-int		htlbpage_max;
-static long	htlbzone_pages;
-
-static struct list_head hugepage_freelists[MAX_NUMNODES];
-static spinlock_t htlbpage_lock = SPIN_LOCK_UNLOCKED;
-
-static void enqueue_huge_page(struct page *page)
-{
-	list_add(&page->list,
-		 &hugepage_freelists[page_zone(page)->zone_pgdat->node_id]);
-}
-
-static struct page *dequeue_huge_page(void)
-{
-	int nid = numa_node_id();
-	struct page *page = NULL;
-
-	if (list_empty(&hugepage_freelists[nid])) {
-		for (nid = 0; nid < MAX_NUMNODES; ++nid)
-			if (!list_empty(&hugepage_freelists[nid]))
-				break;
-	}
-	if (nid >= 0 && nid < MAX_NUMNODES &&
-	    !list_empty(&hugepage_freelists[nid])) {
-		page = list_entry(hugepage_freelists[nid].next,
-				  struct page, list);
-		list_del(&page->list);
-	}
-	return page;
-}
-
-static struct page *alloc_fresh_huge_page(void)
-{
-	static int nid = 0;
-	struct page *page;
-	page = alloc_pages_node(nid, GFP_HIGHUSER, HUGETLB_PAGE_ORDER);
-	nid = (nid + 1) % numnodes;
-	return page;
-}
-
-static void free_huge_page(struct page *page);
-
-static struct page *alloc_hugetlb_page(void)
-{
-	struct page *page;
-
-	spin_lock(&htlbpage_lock);
-	page = dequeue_huge_page();
-	if (!page) {
-		spin_unlock(&htlbpage_lock);
-		return NULL;
-	}
-	htlbpagemem--;
-	spin_unlock(&htlbpage_lock);
-	set_page_count(page, 1);
-	page->lru.prev = (void *)free_huge_page;
-	memset(page_address(page), 0, HPAGE_SIZE);
-	return page;
-}
-
 static pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
 {
 	pgd_t *pgd;
@@ -223,15 +164,9 @@ int follow_hugetlb_page(struct mm_struct
 }
 
 struct page *follow_huge_addr(struct mm_struct *mm,
-			      struct vm_area_struct *vma,
 			      unsigned long address, int write)
 {
-	return NULL;
-}
-
-struct vm_area_struct *hugepage_vma(struct mm_struct *mm, unsigned long addr)
-{
-	return NULL;
+	return ERR_PTR(-EINVAL);
 }
 
 int pmd_huge(pmd_t pmd)
@@ -245,27 +180,6 @@ struct page *follow_huge_pmd(struct mm_s
 	return NULL;
 }
 
-static void free_huge_page(struct page *page)
-{
-	BUG_ON(page_count(page));
-	BUG_ON(page->mapping);
-
-	INIT_LIST_HEAD(&page->list);
-
-	spin_lock(&htlbpage_lock);
-	enqueue_huge_page(page);
-	htlbpagemem++;
-	spin_unlock(&htlbpage_lock);
-}
-
-void huge_page_release(struct page *page)
-{
-	if (!put_page_testzero(page))
-		return;
-
-	free_huge_page(page);
-}
-
 void unmap_hugepage_range(struct vm_area_struct *vma,
 			  unsigned long start, unsigned long end)
 {
@@ -294,16 +208,6 @@ void unmap_hugepage_range(struct vm_area
 	flush_tlb_range(vma, start, end);
 }
 
-void zap_hugepage_range(struct vm_area_struct *vma,
-			unsigned long start, unsigned long length)
-{
-	struct mm_struct *mm = vma->vm_mm;
-
-	spin_lock(&mm->page_table_lock);
-	unmap_hugepage_range(vma, start, start + length);
-	spin_unlock(&mm->page_table_lock);
-}
-
 int hugetlb_prefault(struct address_space *mapping, struct vm_area_struct *vma)
 {
 	struct mm_struct *mm = current->mm;
@@ -335,7 +239,7 @@ int hugetlb_prefault(struct address_spac
 				ret = -ENOMEM;
 				goto out;
 			}
-			page = alloc_hugetlb_page();
+			page = alloc_huge_page();
 			if (!page) {
 				hugetlb_put_quota(mapping);
 				ret = -ENOMEM;
@@ -355,168 +259,3 @@ out:
 	spin_unlock(&mm->page_table_lock);
 	return ret;
 }
-
-static void update_and_free_page(struct page *page)
-{
-	int j;
-	struct page *map;
-
-	map = page;
-	htlbzone_pages--;
-	for (j = 0; j < (HPAGE_SIZE / PAGE_SIZE); j++) {
-		map->flags &= ~(1 << PG_locked | 1 << PG_error | 1 << PG_referenced |
-				1 << PG_dirty | 1 << PG_active | 1 << PG_reserved |
-				1 << PG_private | 1<< PG_writeback);
-		set_page_count(map, 0);
-		map++;
-	}
-	set_page_count(page, 1);
-	__free_pages(page, HUGETLB_PAGE_ORDER);
-}
-
-static int try_to_free_low(int count)
-{
-	struct list_head *p;
-	struct page *page, *map;
-
-	map = NULL;
-	spin_lock(&htlbpage_lock);
-	/* all lowmem is on node 0 */
-	list_for_each(p, &hugepage_freelists[0]) {
-		if (map) {
-			list_del(&map->list);
-			update_and_free_page(map);
-			htlbpagemem--;
-			map = NULL;
-			if (++count == 0)
-				break;
-		}
-		page = list_entry(p, struct page, list);
-		if (!PageHighMem(page))
-			map = page;
-	}
-	if (map) {
-		list_del(&map->list);
-		update_and_free_page(map);
-		htlbpagemem--;
-		count++;
-	}
-	spin_unlock(&htlbpage_lock);
-	return count;
-}
-
-static int set_hugetlb_mem_size(int count)
-{
-	int lcount;
-	struct page *page;
-
-	if (count < 0)
-		lcount = count;
-	else
-		lcount = count - htlbzone_pages;
-
-	if (lcount == 0)
-		return (int)htlbzone_pages;
-	if (lcount > 0) {	/* Increase the mem size. */
-		while (lcount--) {
-			page = alloc_fresh_huge_page();
-			if (page == NULL)
-				break;
-			spin_lock(&htlbpage_lock);
-			enqueue_huge_page(page);
-			htlbpagemem++;
-			htlbzone_pages++;
-			spin_unlock(&htlbpage_lock);
-		}
-		return (int) htlbzone_pages;
-	}
-	/* Shrink the memory size. */
-	lcount = try_to_free_low(lcount);
-	while (lcount++) {
-		page = alloc_hugetlb_page();
-		if (page == NULL)
-			break;
-		spin_lock(&htlbpage_lock);
-		update_and_free_page(page);
-		spin_unlock(&htlbpage_lock);
-	}
-	return (int) htlbzone_pages;
-}
-
-int hugetlb_sysctl_handler(struct ctl_table *table, int write,
-			   struct file *file, void *buffer, size_t *length)
-{
-	proc_dointvec(table, write, file, buffer, length);
-	htlbpage_max = set_hugetlb_mem_size(htlbpage_max);
-	return 0;
-}
-
-static int __init hugetlb_setup(char *s)
-{
-	if (sscanf(s, "%d", &htlbpage_max) <= 0)
-		htlbpage_max = 0;
-	return 1;
-}
-__setup("hugepages=", hugetlb_setup);
-
-static int __init hugetlb_init(void)
-{
-	int i;
-	struct page *page;
-
-	for (i = 0; i < MAX_NUMNODES; ++i)
-		INIT_LIST_HEAD(&hugepage_freelists[i]);
-
-	for (i = 0; i < htlbpage_max; ++i) {
-		page = alloc_fresh_huge_page();
-		if (!page)
-			break;
-		spin_lock(&htlbpage_lock);
-		enqueue_huge_page(page);
-		spin_unlock(&htlbpage_lock);
-	}
-	htlbpage_max = htlbpagemem = htlbzone_pages = i;
-	printk("Total HugeTLB memory allocated, %ld\n", htlbpagemem);
-	return 0;
-}
-module_init(hugetlb_init);
-
-int hugetlb_report_meminfo(char *buf)
-{
-	return sprintf(buf,
-			"HugePages_Total: %5lu\n"
-			"HugePages_Free:  %5lu\n"
-			"Hugepagesize:    %5lu kB\n",
-			htlbzone_pages,
-			htlbpagemem,
-			HPAGE_SIZE/1024);
-}
-
-int is_hugepage_mem_enough(size_t size)
-{
-	return (size + ~HPAGE_MASK)/HPAGE_SIZE <= htlbpagemem;
-}
-
-/* Return the number pages of memory we physically have, in PAGE_SIZE units. */
-unsigned long hugetlb_total_pages(void)
-{
-	return htlbzone_pages * (HPAGE_SIZE / PAGE_SIZE);
-}
-EXPORT_SYMBOL(hugetlb_total_pages);
-
-/*
- * We cannot handle pagefaults against hugetlb pages at all.  They cause
- * handle_mm_fault() to try to instantiate regular-sized pages in the
- * hugegpage VMA.  do_page_fault() is supposed to trap this, so BUG is we get
- * this far.
- */
-static struct page *hugetlb_nopage(struct vm_area_struct *vma,
-				   unsigned long address, int *unused)
-{
-	BUG();
-	return NULL;
-}
-
-struct vm_operations_struct hugetlb_vm_ops = {
-	.nopage = hugetlb_nopage,
-};
--- diff/arch/sparc64/mm/init.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/sparc64/mm/init.c	2004-04-21 10:45:33.944543144 +0100
@@ -139,9 +139,9 @@ __inline__ void flush_dcache_page_impl(s
 #if (L1DCACHE_SIZE > PAGE_SIZE)
 	__flush_dcache_page(page->virtual,
 			    ((tlb_type == spitfire) &&
-			     page->mapping != NULL));
+			     page_mapping(page) != NULL));
 #else
-	if (page->mapping != NULL &&
+	if (page_mapping(page) != NULL &&
 	    tlb_type == spitfire)
 		__flush_icache_page(__pa(page->virtual));
 #endif
@@ -203,7 +203,7 @@ void update_mmu_cache(struct vm_area_str
 
 	pfn = pte_pfn(pte);
 	if (pfn_valid(pfn) &&
-	    (page = pfn_to_page(pfn), page->mapping) &&
+	    (page = pfn_to_page(pfn), page_mapping(page)) &&
 	    ((pg_flags = page->flags) & (1UL << PG_dcache_dirty))) {
 		int cpu = ((pg_flags >> 24) & (NR_CPUS - 1UL));
 
@@ -224,12 +224,11 @@ void update_mmu_cache(struct vm_area_str
 
 void flush_dcache_page(struct page *page)
 {
+	struct address_space *mapping = page_mapping(page);
 	int dirty = test_bit(PG_dcache_dirty, &page->flags);
 	int dirty_cpu = dcache_dirty_cpu(page);
 
-	if (page->mapping &&
-	    list_empty(&page->mapping->i_mmap) &&
-	    list_empty(&page->mapping->i_mmap_shared)) {
+	if (mapping && !mapping_mapped(mapping)) {
 		if (dirty) {
 			if (dirty_cpu == smp_processor_id())
 				return;
@@ -237,7 +236,7 @@ void flush_dcache_page(struct page *page
 		}
 		set_dcache_dirty(page);
 	} else {
-		/* We could delay the flush for the !page->mapping
+		/* We could delay the flush for the !page_mapping
 		 * case too.  But that case is for exec env/arg
 		 * pages and those are %99 certainly going to get
 		 * faulted into the tlb (and thus flushed) anyways.
@@ -279,7 +278,7 @@ static inline void flush_cache_pte_range
 			if (!pfn_valid(pfn))
 				continue;
 			page = pfn_to_page(pfn);
-			if (PageReserved(page) || !page->mapping)
+			if (PageReserved(page) || !page_mapping(page))
 				continue;
 			pgaddr = (unsigned long) page_address(page);
 			uaddr = address + offset;
--- diff/arch/sparc64/solaris/misc.c	2003-10-27 09:20:37.000000000 +0000
+++ source/arch/sparc64/solaris/misc.c	2004-04-21 10:45:33.951542080 +0100
@@ -402,7 +402,7 @@ asmlinkage int solaris_procids(int cmd, 
 			   Solaris setpgrp and setsid? */
 			ret = sys_setpgid(0, 0);
 			if (ret) return ret;
-			current->tty = NULL;
+			current->signal->tty = NULL;
 			return process_group(current);
 		}
 	case 2: /* getsid */
--- diff/arch/um/Kconfig	2004-02-09 10:36:09.000000000 +0000
+++ source/arch/um/Kconfig	2004-04-21 10:45:33.952541928 +0100
@@ -261,7 +261,7 @@ config GCOV
         This option allows developers to retrieve coverage data from a UML
         session.
 
-        See <http://user-mode-linux.sourceforge.net/gcov.html> for more
+        See <http://user-mode-linux.sourceforge.net/gprof.html> for more
         details.
 
         If you're involved in UML kernel development and want to use gcov,
--- diff/arch/v850/kernel/process.c	2003-08-20 14:16:08.000000000 +0100
+++ source/arch/v850/kernel/process.c	2004-04-21 10:45:33.952541928 +0100
@@ -203,8 +203,6 @@ int sys_execve (char *name, char **argv,
 /*
  * These bracket the sleeping functions..
  */
-extern void scheduling_functions_start_here (void);
-extern void scheduling_functions_end_here (void);
 #define first_sched	((unsigned long) scheduling_functions_start_here)
 #define last_sched	((unsigned long) scheduling_functions_end_here)
 
@@ -228,7 +226,6 @@ unsigned long get_wchan (struct task_str
 		    fp >= 8184+stack_page)
 			return 0;
 		pc = ((unsigned long *)fp)[1];
-		/* FIXME: This depends on the order of these functions. */
 		if (pc < first_sched || pc >= last_sched)
 			return pc;
 		fp = *(unsigned long *) fp;
--- diff/arch/v850/kernel/semaphore.c	2002-12-30 10:17:12.000000000 +0000
+++ source/arch/v850/kernel/semaphore.c	2004-04-21 10:45:33.952541928 +0100
@@ -15,6 +15,7 @@
 
 #include <linux/errno.h>
 #include <linux/sched.h>
+#include <linux/init.h>
 
 #include <asm/semaphore.h>
 
@@ -56,7 +57,7 @@ void __up(struct semaphore *sem)
 
 static spinlock_t semaphore_lock = SPIN_LOCK_UNLOCKED;
 
-void __down(struct semaphore * sem)
+void __sched __down(struct semaphore * sem)
 {
 	struct task_struct *tsk = current;
 	DECLARE_WAITQUEUE(wait, tsk);
@@ -89,7 +90,7 @@ void __down(struct semaphore * sem)
 	wake_up(&sem->wait);
 }
 
-int __down_interruptible(struct semaphore * sem)
+int __sched __down_interruptible(struct semaphore * sem)
 {
 	int retval = 0;
 	struct task_struct *tsk = current;
--- diff/arch/v850/kernel/vmlinux.lds.S	2003-10-09 09:47:33.000000000 +0100
+++ source/arch/v850/kernel/vmlinux.lds.S	2004-04-21 10:45:33.953541776 +0100
@@ -64,6 +64,7 @@
 #define TEXT_CONTENTS							      \
 		__stext = . ;						      \
         	*(.text)						      \
+		SCHED_TEXT
 			*(.exit.text)	/* 2.5 convention */		      \
 			*(.text.exit)	/* 2.4 convention */		      \
 			*(.text.lock)					      \
--- diff/arch/x86_64/Kconfig	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/x86_64/Kconfig	2004-04-21 10:45:33.953541776 +0100
@@ -290,9 +290,11 @@ config GART_IOMMU
 	  Normally the kernel will take the right choice by itself.
 	  If unsure say Y 
 
+# need this always enabled with GART_IOMMU for the VIA workaround
 config SWIOTLB
-       select GART_IOMMU
-       bool "Software IOTLB support"
+       bool
+       depends on GART_IOMMU
+       default y
 
 config DUMMY_IOMMU
 	bool
@@ -336,26 +338,6 @@ config PCI_MMCONFIG 
 	depends on PCI
 	select ACPI_BOOT
 
-# the drivers/pci/msi.c code needs to be fixed first before enabling
-config PCI_USE_VECTOR
-	bool "Vector-based interrupt indexing"
-	depends on X86_LOCAL_APIC && NOTWORKING
-	default n
-	help
-	   This replaces the current existing IRQ-based index interrupt scheme
-	   with the vector-base index scheme. The advantages of vector base
-	   over IRQ base are listed below:
-	   1) Support MSI implementation.
-	   2) Support future IOxAPIC hotplug
-
-	   Note that this enables MSI, Message Signaled Interrupt, on all
-	   MSI capable device functions detected if users also install the
-	   MSI patch. Message Signal Interrupt enables an MSI-capable
-	   hardware device to send an inbound Memory Write on its PCI bus
-	   instead of asserting IRQ signal on device IRQ pin.
-
-	   If you don't know what to do here, say N.
-
 source "drivers/pci/Kconfig"
 
 source "drivers/pcmcia/Kconfig"
@@ -401,6 +383,8 @@ endmenu
 
 source drivers/Kconfig
 
+source "drivers/firmware/Kconfig"
+
 source fs/Kconfig
 
 source "arch/x86_64/oprofile/Kconfig"
@@ -480,11 +464,18 @@ config FRAME_POINTER
 
 config IOMMU_DEBUG
        depends on GART_IOMMU && DEBUG_KERNEL
-       bool "Force IOMMU to on" 
+       bool "Enable IOMMU debugging"
        help
-         Force the IOMMU to on even when you have less than 4GB of memory and add 
-	 debugging code. 
-	 Can be disabled at boot time with iommu=noforce.
+         Force the IOMMU to on even when you have less than 4GB of
+	 memory and add debugging code. On overflow always panic. And
+	 allow to enable IOMMU leak tracing. Can be disabled at boot
+	 time with iommu=noforce. This will also enable scatter gather
+	 list merging.  Currently not recommended for production
+	 code. When you use it make sure you have a big enough
+	 IOMMU/AGP aperture.  Most of the options enabled by this can
+	 be set more finegrained using the iommu= command line
+	 options. See Documentation/x86_64/boot-options.txt for more
+	 details.
 
 config IOMMU_LEAK
        bool "IOMMU leak tracing"
--- diff/arch/x86_64/Makefile	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/x86_64/Makefile	2004-04-21 10:45:33.954541624 +0100
@@ -38,7 +38,7 @@ OBJCOPYFLAGS	:= -O binary -R .note -R .c
 LDFLAGS_vmlinux := -e stext
 
 cflags-$(CONFIG_MK8) += $(call check_gcc,-march=k8,)
-cflags-$(CONFIG_MPSC) += $(call check_gcc,-march=prescott,)
+cflags-$(CONFIG_MPSC) += $(call check_gcc,-march=nocona,)
 CFLAGS += $(cflags-y)
 
 CFLAGS += -mno-red-zone
--- diff/arch/x86_64/boot/setup.S	2004-03-11 10:20:23.000000000 +0000
+++ source/arch/x86_64/boot/setup.S	2004-04-21 10:45:33.955541472 +0100
@@ -533,6 +533,8 @@ is_disk1:
 	movw	$0xAA, (0x1ff)			# device present
 no_psmouse:
 
+#include "../../i386/boot/edd.S"
+
 # Now we want to move to protected mode ...
 	cmpw	$0, %cs:realmode_swtch
 	jz	rmodeswtch_normal
--- diff/arch/x86_64/defconfig	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/x86_64/defconfig	2004-04-21 10:45:33.955541472 +0100
@@ -24,8 +24,10 @@ CONFIG_STANDALONE=y
 #
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
 CONFIG_LOG_BUF_SHIFT=18
 # CONFIG_HOTPLUG is not set
 CONFIG_IKCONFIG=y
@@ -37,6 +39,7 @@ CONFIG_EPOLL=y
 CONFIG_IOSCHED_NOOP=y
 CONFIG_IOSCHED_AS=y
 CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 
 #
@@ -83,7 +86,6 @@ CONFIG_X86_MCE=y
 #
 CONFIG_PM=y
 CONFIG_SOFTWARE_SUSPEND=y
-# CONFIG_PM_DISK is not set
 
 #
 # ACPI (Advanced Configuration and Power Interface) Support
@@ -107,7 +109,6 @@ CONFIG_ACPI_EC=y
 CONFIG_ACPI_POWER=y
 CONFIG_ACPI_PCI=y
 CONFIG_ACPI_SYSTEM=y
-# CONFIG_X86_PM_TIMER is not set
 
 #
 # CPU Frequency scaling
@@ -281,6 +282,8 @@ CONFIG_SCSI_SATA=y
 # CONFIG_SCSI_SATA_SVW is not set
 CONFIG_SCSI_ATA_PIIX=y
 # CONFIG_SCSI_SATA_PROMISE is not set
+# CONFIG_SCSI_SATA_SIL is not set
+# CONFIG_SCSI_SATA_SIS is not set
 CONFIG_SCSI_SATA_VIA=y
 # CONFIG_SCSI_SATA_VITESSE is not set
 # CONFIG_SCSI_BUSLOGIC is not set
@@ -350,7 +353,6 @@ CONFIG_IP_MULTICAST=y
 # CONFIG_NET_IPGRE is not set
 # CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
@@ -368,7 +370,6 @@ CONFIG_IPV6=y
 #
 # SCTP Configuration (EXPERIMENTAL)
 #
-CONFIG_IPV6_SCTP__=y
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
 # CONFIG_VLAN_8021Q is not set
@@ -605,7 +606,7 @@ CONFIG_RTC=y
 #
 CONFIG_AGP=y
 CONFIG_AGP_AMD64=y
-CONFIG_AGP_INTEL=y
+# CONFIG_AGP_INTEL_MCH is not set
 # CONFIG_DRM is not set
 # CONFIG_MWAVE is not set
 CONFIG_RAW_DRIVER=y
@@ -692,6 +693,11 @@ CONFIG_SOUND_ICH=y
 # CONFIG_USB_GADGET is not set
 
 #
+# Firmware Drivers
+#
+# CONFIG_EDD is not set
+
+#
 # File systems
 #
 CONFIG_EXT2_FS=y
@@ -736,6 +742,7 @@ CONFIG_ISO9660_FS=y
 #
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
+CONFIG_SYSFS=y
 # CONFIG_DEVFS_FS is not set
 # CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
--- diff/arch/x86_64/ia32/ia32_aout.c	2004-02-09 10:36:09.000000000 +0000
+++ source/arch/x86_64/ia32/ia32_aout.c	2004-04-21 10:45:33.956541320 +0100
@@ -35,7 +35,7 @@
 #undef WARN_OLD
 #undef CORE_DUMP /* probably broken */
 
-extern int ia32_setup_arg_pages(struct linux_binprm *bprm);
+extern int ia32_setup_arg_pages(struct linux_binprm *bprm, int exec_stack);
 
 static int load_aout_binary(struct linux_binprm *, struct pt_regs * regs);
 static int load_aout_library(struct file*);
@@ -395,7 +395,7 @@ beyond_if:
 
 	set_brk(current->mm->start_brk, current->mm->brk);
 
-	retval = ia32_setup_arg_pages(bprm); 
+	retval = ia32_setup_arg_pages(bprm, EXSTACK_DEFAULT);
 	if (retval < 0) { 
 		/* Someone check-me: is this error path enough? */ 
 		send_sig(SIGKILL, current, 0); 
--- diff/arch/x86_64/ia32/ia32_binfmt.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/x86_64/ia32/ia32_binfmt.c	2004-04-21 10:45:33.956541320 +0100
@@ -272,8 +272,8 @@ do {							\
 #define load_elf_binary load_elf32_binary
 
 #define ELF_PLAT_INIT(r, load_addr)	elf32_init(r)
-#define setup_arg_pages(bprm)		ia32_setup_arg_pages(bprm)
-int ia32_setup_arg_pages(struct linux_binprm *bprm);
+#define setup_arg_pages(bprm, exec_stack)	ia32_setup_arg_pages(bprm, exec_stack)
+int ia32_setup_arg_pages(struct linux_binprm *bprm, int executable_stack);
 
 #undef start_thread
 #define start_thread(regs,new_rip,new_rsp) do { \
@@ -325,7 +325,7 @@ static void elf32_init(struct pt_regs *r
 	me->thread.es = __USER_DS;
 }
 
-int setup_arg_pages(struct linux_binprm *bprm)
+int setup_arg_pages(struct linux_binprm *bprm, int executable_stack)
 {
 	unsigned long stack_base;
 	struct vm_area_struct *mpnt;
@@ -354,7 +354,12 @@ int setup_arg_pages(struct linux_binprm 
 		mpnt->vm_mm = mm;
 		mpnt->vm_start = PAGE_MASK & (unsigned long) bprm->p;
 		mpnt->vm_end = IA32_STACK_TOP;
-		mpnt->vm_flags = vm_stack_flags32; 
+		if (executable_stack == EXSTACK_ENABLE_X)
+			mpnt->vm_flags = vm_stack_flags32 |  VM_EXEC;
+		else if (executable_stack == EXSTACK_DISABLE_X)
+			mpnt->vm_flags = vm_stack_flags32 & ~VM_EXEC;
+		else
+			mpnt->vm_flags = vm_stack_flags32;
  		mpnt->vm_page_prot = (mpnt->vm_flags & VM_EXEC) ? 
  			PAGE_COPY_EXEC : PAGE_COPY;
 		mpnt->vm_ops = NULL;
@@ -370,7 +375,7 @@ int setup_arg_pages(struct linux_binprm 
 		struct page *page = bprm->page[i];
 		if (page) {
 			bprm->page[i] = NULL;
-			put_dirty_page(current,page,stack_base,PAGE_COPY_EXEC);
+			put_dirty_page(current,page,stack_base,mpnt->vm_page_prot);
 		}
 		stack_base += PAGE_SIZE;
 	}
--- diff/arch/x86_64/ia32/ia32_ioctl.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/x86_64/ia32/ia32_ioctl.c	2004-04-21 10:45:33.956541320 +0100
@@ -188,17 +188,6 @@ COMPATIBLE_IOCTL(RTC_RD_TIME)
 COMPATIBLE_IOCTL(RTC_SET_TIME)
 COMPATIBLE_IOCTL(RTC_WKALM_SET)
 COMPATIBLE_IOCTL(RTC_WKALM_RD)
-COMPATIBLE_IOCTL(HCIUARTSETPROTO)
-COMPATIBLE_IOCTL(HCIUARTGETPROTO)
-COMPATIBLE_IOCTL(RFCOMMCREATEDEV)
-COMPATIBLE_IOCTL(RFCOMMRELEASEDEV)
-COMPATIBLE_IOCTL(RFCOMMGETDEVLIST)
-COMPATIBLE_IOCTL(RFCOMMGETDEVINFO)
-COMPATIBLE_IOCTL(RFCOMMSTEALDLC)
-COMPATIBLE_IOCTL(BNEPCONNADD)
-COMPATIBLE_IOCTL(BNEPCONNDEL)
-COMPATIBLE_IOCTL(BNEPGETCONNLIST)
-COMPATIBLE_IOCTL(BNEPGETCONNINFO)
 COMPATIBLE_IOCTL(FIOQSIZE)
 
 /* And these ioctls need translation */
--- diff/arch/x86_64/ia32/ia32_signal.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/x86_64/ia32/ia32_signal.c	2004-04-21 10:45:33.957541168 +0100
@@ -85,7 +85,11 @@ int ia32_copy_siginfo_to_user(siginfo_t3
 			err |= __put_user(from->si_overrun, &to->si_overrun); 
 			err |= __put_user((u32)(u64)from->si_ptr, &to->si_ptr);
 			break;
-		/* case __SI_RT: This is not generated by the kernel as of now.  */
+		case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
+		case __SI_MESGQ >> 16:
+			err |= __put_user(from->si_uid, &to->si_uid);
+			err |= __put_user(from->si_int, &to->si_int);
+			break;
 		}
 	}
 	return err;
--- diff/arch/x86_64/ia32/ia32entry.S	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/x86_64/ia32/ia32entry.S	2004-04-21 10:45:33.957541168 +0100
@@ -78,8 +78,8 @@ ENTRY(ia32_sysenter_target)
  	.quad 1b,ia32_badarg
  	.previous	
 	GET_THREAD_INFO(%r10)
-	bt  $TIF_SYSCALL_TRACE,threadinfo_flags(%r10)
-	jc  sysenter_tracesys
+	testl  $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),threadinfo_flags(%r10)
+	jnz  sysenter_tracesys
 sysenter_do_call:	
 	cmpl	$(IA32_NR_syscalls),%eax
 	jae	ia32_badsys
@@ -106,7 +106,7 @@ sysenter_tracesys:
 	CLEAR_RREGS
 	movq	$-ENOSYS,RAX(%rsp)	/* really needed? */
 	movq	%rsp,%rdi        /* &pt_regs -> arg1 */
-	call	syscall_trace
+	call	syscall_trace_enter
 	LOAD_ARGS ARGOFFSET  /* reload args from stack in case ptrace changed it */
 	RESTORE_REST
 	movl	%ebp, %ebp
@@ -163,8 +163,8 @@ ENTRY(ia32_cstar_target)
 	.quad 1b,ia32_badarg
 	.previous	
 	GET_THREAD_INFO(%r10)
-	bt  $TIF_SYSCALL_TRACE,threadinfo_flags(%r10)
-	jc  cstar_tracesys
+	testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),threadinfo_flags(%r10)
+	jnz   cstar_tracesys
 cstar_do_call:	
 	cmpl $IA32_NR_syscalls,%eax
 	jae  ia32_badsys
@@ -187,7 +187,7 @@ cstar_tracesys:	
 	CLEAR_RREGS
 	movq $-ENOSYS,RAX(%rsp)	/* really needed? */
 	movq %rsp,%rdi        /* &pt_regs -> arg1 */
-	call syscall_trace
+	call syscall_trace_enter
 	LOAD_ARGS ARGOFFSET  /* reload args from stack in case ptrace changed it */
 	RESTORE_REST
 	movl RSP-ARGOFFSET(%rsp), %r8d
@@ -236,8 +236,8 @@ ENTRY(ia32_syscall)
 	   this could be a problem. */
 	SAVE_ARGS 0,0,1
 	GET_THREAD_INFO(%r10)
-	bt $TIF_SYSCALL_TRACE,threadinfo_flags(%r10)
-	jc ia32_tracesys
+	testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),threadinfo_flags(%r10)
+	jnz ia32_tracesys
 ia32_do_syscall:	
 	cmpl $(IA32_NR_syscalls),%eax
 	jae  ia32_badsys
@@ -251,7 +251,7 @@ ia32_tracesys:			 
 	SAVE_REST
 	movq $-ENOSYS,RAX(%rsp)	/* really needed? */
 	movq %rsp,%rdi        /* &pt_regs -> arg1 */
-	call syscall_trace
+	call syscall_trace_enter
 	LOAD_ARGS ARGOFFSET  /* reload args from stack in case ptrace changed it */
 	RESTORE_REST
 	jmp ia32_do_syscall
@@ -578,6 +578,16 @@ ia32_sys_call_table:
 	.quad sys_tgkill
 	.quad compat_sys_utimes
 	.quad sys32_fadvise64_64
+	.quad sys_ni_syscall	/* sys_vserver */
+	.quad sys_ni_syscall	/* sys_mbind */
+	.quad sys_ni_syscall	/* 275 sys_get_mempolicy */
+	.quad sys_ni_syscall	/* sys_set_mempolicy */
+	.quad compat_sys_mq_open
+	.quad sys_mq_unlink
+	.quad compat_sys_mq_timedsend
+	.quad compat_sys_mq_timedreceive	/* 280 */
+	.quad compat_sys_mq_notify
+	.quad compat_sys_mq_getsetattr
 	/* don't forget to change IA32_NR_syscalls */
 ia32_syscall_end:		
 	.rept IA32_NR_syscalls-(ia32_syscall_end-ia32_sys_call_table)/8
--- diff/arch/x86_64/ia32/sys_ia32.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/x86_64/ia32/sys_ia32.c	2004-04-21 10:45:33.958541016 +0100
@@ -832,10 +832,11 @@ sys32_writev(int fd, struct compat_iovec
 asmlinkage long sys32_time(int * tloc)
 {
 	int i;
+	struct timeval tv;
+
+	do_gettimeofday(&tv);
+	i = tv.tv_sec;
 
-	/* SMP: This is fairly trivial. We grab CURRENT_TIME and 
-	   stuff it to user space. No side effects */
-	i = get_seconds();
 	if (tloc) {
 		if (put_user(i,tloc))
 			i = -EFAULT;
--- diff/arch/x86_64/kernel/aperture.c	2004-03-11 10:20:23.000000000 +0000
+++ source/arch/x86_64/kernel/aperture.c	2004-04-21 10:45:33.959540864 +0100
@@ -25,6 +25,8 @@
 #include <asm/pci-direct.h>
 
 int iommu_aperture;
+int iommu_aperture_disabled __initdata = 0;
+int iommu_aperture_allowed __initdata = 0;
 
 int fallback_aper_order __initdata = 1; /* 64MB */
 int fallback_aper_force __initdata = 0; 
@@ -200,6 +202,9 @@ void __init iommu_hole_init(void) 
 	u64 aper_base; 
 	int valid_agp = 0;
 
+	if (iommu_aperture_disabled)
+		return;
+
 	printk("Checking aperture...\n"); 
 
 	fix = 0;
--- diff/arch/x86_64/kernel/entry.S	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/x86_64/kernel/entry.S	2004-04-21 10:45:33.959540864 +0100
@@ -131,8 +131,8 @@ ENTRY(ret_from_fork)
 	CFI_DEFAULT_STACK
 	call schedule_tail
 	GET_THREAD_INFO(%rcx)
-	bt $TIF_SYSCALL_TRACE,threadinfo_flags(%rcx)
-	jc rff_trace
+	testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),threadinfo_flags(%rcx)
+	jnz rff_trace
 rff_action:	
 	RESTORE_REST
 	testl $3,CS-ARGOFFSET(%rsp)	# from kernel_thread?
@@ -143,7 +143,7 @@ rff_action:	
 	jmp ret_from_sys_call
 rff_trace:
 	movq %rsp,%rdi
-	call syscall_trace
+	call syscall_trace_leave
 	GET_THREAD_INFO(%rcx)	
 	jmp rff_action
 	CFI_ENDPROC
@@ -185,8 +185,8 @@ ENTRY(system_call)
 	movq  %rax,ORIG_RAX-ARGOFFSET(%rsp) 
 	movq  %rcx,RIP-ARGOFFSET(%rsp)  
 	GET_THREAD_INFO(%rcx)
-	bt    $TIF_SYSCALL_TRACE,threadinfo_flags(%rcx) 
-	jc    tracesys
+	testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),threadinfo_flags(%rcx)
+	jnz tracesys
 	cmpq $__NR_syscall_max,%rax
 	ja badsys
 	movq %r10,%rcx
@@ -244,7 +244,7 @@ tracesys:			 
 	movq $-ENOSYS,RAX(%rsp)
 	FIXUP_TOP_OF_STACK %rdi
 	movq %rsp,%rdi
-	call syscall_trace
+	call syscall_trace_enter
 	LOAD_ARGS ARGOFFSET  /* reload args from stack in case ptrace changed it */
 	RESTORE_REST
 	cmpq $__NR_syscall_max,%rax
@@ -254,7 +254,7 @@ tracesys:			 
 	movq %rax,RAX-ARGOFFSET(%rsp)
 1:	SAVE_REST
 	movq %rsp,%rdi
-	call syscall_trace
+	call syscall_trace_leave
 	RESTORE_TOP_OF_STACK %rbx
 	RESTORE_REST
 	jmp ret_from_sys_call
@@ -297,13 +297,14 @@ int_very_careful:
 	sti
 	SAVE_REST
 	/* Check for syscall exit trace */	
-	bt $TIF_SYSCALL_TRACE,%edx
-	jnc int_signal
+	testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),%edx
+	jz int_signal
 	pushq %rdi
 	leaq 8(%rsp),%rdi	# &ptregs -> arg1	
-	call syscall_trace
+	call syscall_trace_leave
 	popq %rdi
 	btr  $TIF_SYSCALL_TRACE,%edi
+	btr  $TIF_SYSCALL_AUDIT,%edi
 	jmp int_restore_rest
 	
 int_signal:
--- diff/arch/x86_64/kernel/io_apic.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/x86_64/kernel/io_apic.c	2004-04-21 10:45:33.960540712 +0100
@@ -34,6 +34,7 @@
 #include <asm/io.h>
 #include <asm/smp.h>
 #include <asm/desc.h>
+#include <asm/proto.h>
 
 int sis_apic_bug; /* not actually supported, dummy for compile */
 
@@ -211,7 +212,6 @@ static int __init enable_ioapic_setup(ch
 __setup("noapic", disable_ioapic_setup);
 __setup("apic", enable_ioapic_setup);
 
-#ifndef CONFIG_SMP
 #include <asm/pci-direct.h>
 #include <linux/pci_ids.h>
 #include <linux/pci.h>
@@ -220,7 +220,11 @@ __setup("apic", enable_ioapic_setup);
    off. Check for an Nvidia or VIA PCI bridge and turn it off.
    Use pci direct infrastructure because this runs before the PCI subsystem. 
 
-   Can be overwritten with "apic" */
+   Can be overwritten with "apic"
+
+   And another hack to disable the IOMMU on VIA chipsets.
+
+   Kludge-O-Rama. */
 void __init check_ioapic(void) 
 { 
 	int num,slot,func; 
@@ -245,12 +249,23 @@ void __init check_ioapic(void) 
 							 PCI_VENDOR_ID);
 				vendor &= 0xffff;
 				switch (vendor) { 
-				case PCI_VENDOR_ID_NVIDIA: 
 				case PCI_VENDOR_ID_VIA:
+#ifdef CONFIG_GART_IOMMU
+					if (end_pfn >= (0xffffffff>>PAGE_SHIFT) &&
+					    !iommu_aperture_allowed) {
+						printk(KERN_INFO
+    "Looks like a VIA chipset. Disabling IOMMU. Overwrite with \"iommu=allowed\"\n");
+						iommu_aperture_disabled = 1;
+					}
+#endif
+					/* FALL THROUGH */
+				case PCI_VENDOR_ID_NVIDIA:
+#ifndef CONFIG_SMP
 					printk(KERN_INFO 
      "PCI bridge %02x:%02x from %x found. Setting \"noapic\". Overwrite with \"apic\"\n",
 					       num,slot,vendor); 
 					skip_ioapic_setup = 1;
+#endif
 					return;
 				} 
 
@@ -263,7 +278,6 @@ void __init check_ioapic(void) 
 		}
 	}
 } 
-#endif
 
 static int __init ioapic_pirq_setup(char *str)
 {
@@ -1785,7 +1799,7 @@ int __init io_apic_get_unique_id (int io
 	 *      advantage of new APIC bus architecture.
 	 */
 
-	if (!physids_empty(apic_id_map))
+	if (physids_empty(apic_id_map))
 		apic_id_map = phys_cpu_present_map;
 
 	spin_lock_irqsave(&ioapic_lock, flags);
--- diff/arch/x86_64/kernel/mce.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/x86_64/kernel/mce.c	2004-04-21 10:45:33.961540560 +0100
@@ -85,7 +85,7 @@ static void print_mce(struct mce *m)
 	if (m->addr)
 		printk("ADDR %Lx ", m->addr);
 	if (m->misc)
-		printk("MISC %Lx ", m->addr); 	
+		printk("MISC %Lx ", m->misc); 	
 	printk("\n");
 }
 
@@ -160,7 +160,7 @@ void do_machine_check(struct pt_regs * r
 		if (m.status & MCI_STATUS_MISCV)
 			rdmsrl(MSR_IA32_MC0_MISC + i*4, m.misc);
 		if (m.status & MCI_STATUS_ADDRV)
-			rdmsrl(MSR_IA32_MC0_MISC + i*4, m.addr);
+			rdmsrl(MSR_IA32_MC0_ADDR + i*4, m.addr);
 
 		rdtscll(m.tsc);
 		wrmsrl(MSR_IA32_MC0_STATUS + i*4, 0);
--- diff/arch/x86_64/kernel/mpparse.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/x86_64/kernel/mpparse.c	2004-04-21 10:45:33.961540560 +0100
@@ -83,6 +83,9 @@ extern int acpi_parse_ioapic (acpi_table
 #endif /*CONFIG_X86_IO_APIC*/
 #endif /*CONFIG_ACPI_BOOT*/
 
+u8 bios_cpu_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };
+
+
 /*
  * Intel MP BIOS table parsing routines:
  */
@@ -147,6 +150,7 @@ static void __init MP_processor_info (st
 		ver = 0x10;
 	}
 	apic_version[m->mpc_apicid] = ver;
+	bios_cpu_apicid[num_processors - 1] = m->mpc_apicid;
 }
 
 static void __init MP_bus_info (struct mpc_config_bus *m)
--- diff/arch/x86_64/kernel/pci-gart.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/x86_64/kernel/pci-gart.c	2004-04-21 10:45:33.962540408 +0100
@@ -194,6 +194,7 @@ void *pci_alloc_consistent(struct pci_de
 
 	/* Kludge to make it bug-to-bug compatible with i386. i386
 	   uses the normal dma_mask for alloc_consistent. */
+	if (hwdev)
 	dma_mask &= hwdev->dma_mask;
 
  again:
@@ -606,9 +607,6 @@ int pci_dma_supported(struct pci_dev *de
 		return 0; 
 	}
 
-	if (no_iommu && (mask < (end_pfn << PAGE_SHIFT)) && !swiotlb)
-		return 0;
-
 	return 1;
 } 
 
@@ -849,6 +847,7 @@ fs_initcall(pci_iommu_init);
    forcesac For SAC mode for masks <40bits  (experimental)
    fullflush Flush IOMMU on each allocation (default) 
    nofullflush Don't use IOMMU fullflush
+   allowed  overwrite iommu off workarounds for specific chipsets.
    soft	 Use software bounce buffering (default for Intel machines)
 */
 __init int iommu_setup(char *opt) 
@@ -861,8 +860,12 @@ __init int iommu_setup(char *opt) 
 		    no_agp = 1;
 	    if (!memcmp(p,"off", 3))
 		    no_iommu = 1;
-	    if (!memcmp(p,"force", 5))
+	    if (!memcmp(p,"force", 5)) {
 		    force_iommu = 1;
+		    iommu_aperture_allowed = 1;
+	    }
+	    if (!memcmp(p,"allowed",7))
+		    iommu_aperture_allowed = 1;
 	    if (!memcmp(p,"noforce", 7)) { 
 		    iommu_merge = 0;
 		    force_iommu = 0;
--- diff/arch/x86_64/kernel/process.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/x86_64/kernel/process.c	2004-04-21 10:45:33.963540256 +0100
@@ -576,8 +576,6 @@ asmlinkage long sys_vfork(struct pt_regs
 /*
  * These bracket the sleeping functions..
  */
-extern void scheduling_functions_start_here(void);
-extern void scheduling_functions_end_here(void);
 #define first_sched	((unsigned long) scheduling_functions_start_here)
 #define last_sched	((unsigned long) scheduling_functions_end_here)
 
--- diff/arch/x86_64/kernel/ptrace.c	2003-06-09 14:18:18.000000000 +0100
+++ source/arch/x86_64/kernel/ptrace.c	2004-04-21 10:45:33.963540256 +0100
@@ -16,6 +16,7 @@
 #include <linux/ptrace.h>
 #include <linux/user.h>
 #include <linux/security.h>
+#include <linux/audit.h>
 
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
@@ -486,7 +487,7 @@ out:
 	return ret;
 }
 
-asmlinkage void syscall_trace(struct pt_regs *regs)
+static void syscall_trace(struct pt_regs *regs)
 {
 
 #if 0
@@ -496,11 +497,6 @@ asmlinkage void syscall_trace(struct pt_
 	       current_thread_info()->flags, current->ptrace); 
 #endif
 
-	if (!test_thread_flag(TIF_SYSCALL_TRACE))
-		return; 
-	if (!(current->ptrace & PT_PTRACED))
-		return;
-	
 	ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
 				? 0x80 : 0));
 	/*
@@ -513,3 +509,25 @@ asmlinkage void syscall_trace(struct pt_
 		current->exit_code = 0;
 	}
 }
+
+asmlinkage void syscall_trace_enter(struct pt_regs *regs)
+{
+	if (unlikely(current->audit_context))
+		audit_syscall_entry(current, regs->orig_rax,
+				    regs->rdi, regs->rsi,
+				    regs->rdx, regs->r10);
+
+	if (test_thread_flag(TIF_SYSCALL_TRACE)
+	    && (current->ptrace & PT_PTRACED))
+		syscall_trace(regs);
+}
+
+asmlinkage void syscall_trace_leave(struct pt_regs *regs)
+{
+	if (unlikely(current->audit_context))
+		audit_syscall_exit(current, regs->rax);
+
+	if (test_thread_flag(TIF_SYSCALL_TRACE)
+	    && (current->ptrace & PT_PTRACED))
+		syscall_trace(regs);
+}
--- diff/arch/x86_64/kernel/semaphore.c	2002-10-16 04:29:07.000000000 +0100
+++ source/arch/x86_64/kernel/semaphore.c	2004-04-21 10:45:33.963540256 +0100
@@ -14,6 +14,7 @@
  */
 #include <linux/config.h>
 #include <linux/sched.h>
+#include <linux/init.h>
 #include <asm/errno.h>
 
 #include <asm/semaphore.h>
@@ -54,7 +55,7 @@ void __up(struct semaphore *sem)
 	wake_up(&sem->wait);
 }
 
-void __down(struct semaphore * sem)
+void __sched __down(struct semaphore * sem)
 {
 	struct task_struct *tsk = current;
 	DECLARE_WAITQUEUE(wait, tsk);
@@ -91,7 +92,7 @@ void __down(struct semaphore * sem)
 	tsk->state = TASK_RUNNING;
 }
 
-int __down_interruptible(struct semaphore * sem)
+int __sched __down_interruptible(struct semaphore * sem)
 {
 	int retval = 0;
 	struct task_struct *tsk = current;
--- diff/arch/x86_64/kernel/setup.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/x86_64/kernel/setup.c	2004-04-21 10:45:33.964540104 +0100
@@ -39,6 +39,7 @@
 #include <linux/pci.h>
 #include <linux/acpi.h>
 #include <linux/kallsyms.h>
+#include <linux/edd.h>
 #include <asm/mtrr.h>
 #include <asm/uaccess.h>
 #include <asm/system.h>
@@ -102,91 +103,115 @@ char command_line[COMMAND_LINE_SIZE];
 char saved_command_line[COMMAND_LINE_SIZE];
 
 struct resource standard_io_resources[] = {
-	{ "dma1", 0x00, 0x1f, IORESOURCE_BUSY },
-	{ "pic1", 0x20, 0x21, IORESOURCE_BUSY },
-	{ "timer", 0x40, 0x5f, IORESOURCE_BUSY },
-	{ "keyboard", 0x60, 0x6f, IORESOURCE_BUSY },
-	{ "dma page reg", 0x80, 0x8f, IORESOURCE_BUSY },
-	{ "pic2", 0xa0, 0xa1, IORESOURCE_BUSY },
-	{ "dma2", 0xc0, 0xdf, IORESOURCE_BUSY },
-	{ "fpu", 0xf0, 0xff, IORESOURCE_BUSY }
+	{ "dma1", 0x00, 0x1f, IORESOURCE_BUSY | IORESOURCE_IO },
+	{ "pic1", 0x20, 0x21, IORESOURCE_BUSY | IORESOURCE_IO },
+	{ "timer", 0x40, 0x5f, IORESOURCE_BUSY | IORESOURCE_IO },
+	{ "keyboard", 0x60, 0x6f, IORESOURCE_BUSY | IORESOURCE_IO },
+	{ "dma page reg", 0x80, 0x8f, IORESOURCE_BUSY | IORESOURCE_IO },
+	{ "pic2", 0xa0, 0xa1, IORESOURCE_BUSY | IORESOURCE_IO },
+	{ "dma2", 0xc0, 0xdf, IORESOURCE_BUSY | IORESOURCE_IO },
+	{ "fpu", 0xf0, 0xff, IORESOURCE_BUSY | IORESOURCE_IO }
 };
 
-#define STANDARD_IO_RESOURCES (sizeof(standard_io_resources)/sizeof(struct resource))
+#define STANDARD_IO_RESOURCES \
+	(sizeof standard_io_resources / sizeof standard_io_resources[0])
 
-struct resource code_resource = { "Kernel code", 0x100000, 0 };
-struct resource data_resource = { "Kernel data", 0, 0 };
-struct resource vram_resource = { "Video RAM area", 0xa0000, 0xbffff, IORESOURCE_BUSY };
-
-/* System ROM resources */
-#define MAXROMS 6
-static struct resource rom_resources[MAXROMS] = {
-	{ "System ROM", 0xF0000, 0xFFFFF, IORESOURCE_BUSY },
-	{ "Video ROM", 0xc0000, 0xc7fff, IORESOURCE_BUSY }
+struct resource code_resource = { "Kernel code", 0x100000, 0, IORESOURCE_MEM };
+struct resource data_resource = { "Kernel data", 0, 0, IORESOURCE_MEM };
+struct resource vram_resource = { "Video RAM area", 0xa0000, 0xbffff, IORESOURCE_BUSY | IORESOURCE_MEM };
+
+#define IORESOURCE_ROM (IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM)
+
+static struct resource system_rom_resource = { "System ROM", 0xf0000, 0xfffff, IORESOURCE_ROM };
+static struct resource extension_rom_resource = { "Extension ROM", 0xe0000, 0xeffff, IORESOURCE_ROM };
+
+static struct resource adapter_rom_resources[] = {
+	{ "Adapter ROM", 0xc8000, 0, IORESOURCE_ROM },
+	{ "Adapter ROM", 0, 0, IORESOURCE_ROM },
+	{ "Adapter ROM", 0, 0, IORESOURCE_ROM },
+	{ "Adapter ROM", 0, 0, IORESOURCE_ROM },
+	{ "Adapter ROM", 0, 0, IORESOURCE_ROM },
+	{ "Adapter ROM", 0, 0, IORESOURCE_ROM }
 };
 
+#define ADAPTER_ROM_RESOURCES \
+	(sizeof adapter_rom_resources / sizeof adapter_rom_resources[0])
+
+static struct resource video_rom_resource = { "Video ROM", 0xc0000, 0xc7fff, IORESOURCE_ROM };
+
 #define romsignature(x) (*(unsigned short *)(x) == 0xaa55)
 
+static int __init checksum(unsigned char *rom, unsigned long length)
+{
+	unsigned char *p, sum = 0;
+
+	for (p = rom; p < rom + length; p++)
+		sum += *p;
+	return sum == 0;
+}
+
 static void __init probe_roms(void)
 {
-	int roms = 1;
-	unsigned long base;
-	unsigned char *romstart;
-
-	request_resource(&iomem_resource, rom_resources+0);
-
-	/* Video ROM is standard at C000:0000 - C7FF:0000, check signature */
-	for (base = 0xC0000; base < 0xE0000; base += 2048) {
-		romstart = isa_bus_to_virt(base);
-		if (!romsignature(romstart))
+	unsigned long start, length, upper;
+	unsigned char *rom;
+	int	      i;
+
+	/* video rom */
+	upper = adapter_rom_resources[0].start;
+	for (start = video_rom_resource.start; start < upper; start += 2048) {
+		rom = isa_bus_to_virt(start);
+		if (!romsignature(rom))
 			continue;
-		request_resource(&iomem_resource, rom_resources + roms);
-		roms++;
-		break;
-	}
 
-	/* Extension roms at C800:0000 - DFFF:0000 */
-	for (base = 0xC8000; base < 0xE0000; base += 2048) {
-		unsigned long length;
+		video_rom_resource.start = start;
 
-		romstart = isa_bus_to_virt(base);
-		if (!romsignature(romstart))
-			continue;
-		length = romstart[2] * 512;
-		if (length) {
-			unsigned int i;
-			unsigned char chksum;
-
-			chksum = 0;
-			for (i = 0; i < length; i++)
-				chksum += romstart[i];
-
-			/* Good checksum? */
-			if (!chksum) {
-				rom_resources[roms].start = base;
-				rom_resources[roms].end = base + length - 1;
-				rom_resources[roms].name = "Extension ROM";
-				rom_resources[roms].flags = IORESOURCE_BUSY;
-
-				request_resource(&iomem_resource, rom_resources + roms);
-				roms++;
-				if (roms >= MAXROMS)
-					return;
+		/* 0 < length <= 0x7f * 512, historically */
+		length = rom[2] * 512;
+
+		/* if checksum okay, trust length byte */
+		if (length && checksum(rom, length))
+			video_rom_resource.end = start + length - 1;
+
+		request_resource(&iomem_resource, &video_rom_resource);
+		break;
 			}
+
+	start = (video_rom_resource.end + 1 + 2047) & ~2047UL;
+	if (start < upper)
+		start = upper;
+
+	/* system rom */
+	request_resource(&iomem_resource, &system_rom_resource);
+	upper = system_rom_resource.start;
+
+	/* check for extension rom (ignore length byte!) */
+	rom = isa_bus_to_virt(extension_rom_resource.start);
+	if (romsignature(rom)) {
+		length = extension_rom_resource.end - extension_rom_resource.start + 1;
+		if (checksum(rom, length)) {
+			request_resource(&iomem_resource, &extension_rom_resource);
+			upper = extension_rom_resource.start;
 		}
 	}
 
-	/* Final check for motherboard extension rom at E000:0000 */
-	base = 0xE0000;
-	romstart = isa_bus_to_virt(base);
-
-	if (romsignature(romstart)) {
-		rom_resources[roms].start = base;
-		rom_resources[roms].end = base + 65535;
-		rom_resources[roms].name = "Extension ROM";
-		rom_resources[roms].flags = IORESOURCE_BUSY;
+	/* check for adapter roms on 2k boundaries */
+	for (i = 0; i < ADAPTER_ROM_RESOURCES && start < upper; start += 2048) {
+		rom = isa_bus_to_virt(start);
+		if (!romsignature(rom))
+			continue;
 
-		request_resource(&iomem_resource, rom_resources + roms);
+		/* 0 < length <= 0x7f * 512, historically */
+		length = rom[2] * 512;
+
+		/* but accept any length that fits if checksum okay */
+		if (!length || start + length > upper || !checksum(rom, length))
+			continue;
+
+		adapter_rom_resources[i].start = start;
+		adapter_rom_resources[i].end = start + length - 1;
+		request_resource(&iomem_resource, &adapter_rom_resources[i]);
+
+		start = adapter_rom_resources[i++].end & ~2047UL;
 	}
 }
 
@@ -369,6 +394,30 @@ static int __init noreplacement_setup(ch
 
 __setup("noreplacement", noreplacement_setup); 
 
+#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
+unsigned char eddnr;
+struct edd_info edd[EDDMAXNR];
+unsigned int edd_disk80_sig;
+#ifdef CONFIG_EDD_MODULE
+EXPORT_SYMBOL(eddnr);
+EXPORT_SYMBOL(edd);
+EXPORT_SYMBOL(edd_disk80_sig);
+#endif
+/**
+ * copy_edd() - Copy the BIOS EDD information
+ *              from empty_zero_page into a safe place.
+ *
+ */
+static inline void copy_edd(void)
+{
+     eddnr = EDD_NR;
+     memcpy(edd, EDD_BUF, sizeof(edd));
+     edd_disk80_sig = DISK80_SIGNATURE;
+}
+#else
+#define copy_edd() do {} while (0)
+#endif
+
 void __init setup_arch(char **cmdline_p)
 {
 	unsigned long low_mem_size;
@@ -387,6 +436,7 @@ void __init setup_arch(char **cmdline_p)
 	rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0);
 #endif
 	setup_memory_region();
+	copy_edd();
 
 	if (!MOUNT_ROOT_RDONLY)
 		root_mountflags &= ~MS_RDONLY;
@@ -475,10 +525,7 @@ void __init setup_arch(char **cmdline_p)
 #endif
 	paging_init();
 
-#ifndef CONFIG_SMP
-	/* Temporary hack: disable the IO-APIC for UP Nvidia and VIA. */
 		check_ioapic();
-#endif
 #ifdef CONFIG_ACPI_BOOT
        /*
         * Initialize the ACPI boot-time table parser (gets the RSDP and SDT).
@@ -797,6 +844,9 @@ static void __init init_intel(struct cpu
 		c->x86_virt_bits = (eax >> 8) & 0xff;
 		c->x86_phys_bits = eax & 0xff;
 	}
+
+	if (c->x86 == 15)
+		c->x86_cache_alignment = c->x86_clflush_size * 2;
 }
 
 void __init get_cpu_vendor(struct cpuinfo_x86 *c)
@@ -831,6 +881,7 @@ void __init early_identify_cpu(struct cp
 	c->x86_vendor_id[0] = '\0'; /* Unset */
 	c->x86_model_id[0] = '\0';  /* Unset */
 	c->x86_clflush_size = 64;
+	c->x86_cache_alignment = c->x86_clflush_size;
 	memset(&c->x86_capability, 0, sizeof c->x86_capability);
 
 	/* Get vendor name */
@@ -1058,6 +1109,7 @@ static int show_cpuinfo(struct seq_file 
 	if (c->x86_tlbsize > 0) 
 		seq_printf(m, "TLB size\t: %d 4K pages\n", c->x86_tlbsize);
 	seq_printf(m, "clflush size\t: %d\n", c->x86_clflush_size);
+	seq_printf(m, "cache_alignment\t: %d\n", c->x86_cache_alignment);
 
 	seq_printf(m, "address sizes\t: %u bits physical, %u bits virtual\n", 
 		   c->x86_phys_bits, c->x86_virt_bits);
--- diff/arch/x86_64/kernel/setup64.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/x86_64/kernel/setup64.c	2004-04-21 10:45:33.965539952 +0100
@@ -24,6 +24,7 @@
 #include <asm/mtrr.h>
 #include <asm/proto.h>
 #include <asm/mman.h>
+#include <asm/numa.h>
 
 char x86_boot_params[2048] __initdata = {0,};
 
@@ -329,4 +330,8 @@ void __init cpu_init (void)
 	set_debug(0UL, 7);
 
 	fpu_init(); 
+
+#ifdef CONFIG_NUMA
+	numa_add_cpu(cpu);
+#endif
 }
--- diff/arch/x86_64/kernel/smpboot.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/x86_64/kernel/smpboot.c	2004-04-21 10:45:33.965539952 +0100
@@ -60,8 +60,6 @@ char phys_proc_id[NR_CPUS]; /* Package I
 /* Bitmask of currently online CPUs */
 cpumask_t cpu_online_map;
 
-/* which CPU (physical APIC ID) maps to which logical CPU number */
-volatile char x86_apicid_to_cpu[NR_CPUS];
 /* which logical CPU number maps to which CPU (physical APIC ID) */
 volatile char x86_cpu_to_apicid[NR_CPUS];
 
@@ -580,8 +578,6 @@ static void __init do_boot_cpu (int apic
 		panic("failed fork for CPU %d", cpu);
 	wake_up_forked_process(idle);	
 	x86_cpu_to_apicid[cpu] = apicid;
-	x86_apicid_to_cpu[apicid] = cpu;
-
 
 	/*
 	 * We remove it from the pidhash and the runqueue
@@ -735,7 +731,7 @@ static void smp_tune_scheduling (void)
 
 static void __init smp_boot_cpus(unsigned int max_cpus)
 {
-	unsigned apicid, cpu;
+	unsigned apicid, cpu, bit, kicked;
 
 	nmi_watchdog_default();
 
@@ -815,16 +811,20 @@ static void __init smp_boot_cpus(unsigne
 	if (GET_APIC_ID(apic_read(APIC_ID)) != boot_cpu_id)
 		BUG();
 
+	x86_cpu_to_apicid[0] = boot_cpu_id;
+
 	/*
 	 * Now scan the CPU present map and fire up the other CPUs.
 	 */
 	Dprintk("CPU present map: %lx\n", physids_coerce(phys_cpu_present_map));
 
-	for (apicid = 0; apicid < NR_CPUS; apicid++) {
+	kicked = 1;
+	for (bit = 0; kicked < NR_CPUS && bit < MAX_APICS; bit++) {
+		apicid = cpu_present_to_apicid(bit);
 		/*
 		 * Don't even attempt to start the boot CPU!
 		 */
-		if (apicid == boot_cpu_id)
+		if (apicid == boot_cpu_id || (apicid == BAD_APICID))
 			continue;
 
 		if (!cpu_isset(apicid, phys_cpu_present_map))
@@ -833,6 +833,7 @@ static void __init smp_boot_cpus(unsigne
 			continue;
 
 		do_boot_cpu(apicid);
+		++kicked;
 	}
 
 	/*
--- diff/arch/x86_64/kernel/vmlinux.lds.S	2004-02-09 10:36:09.000000000 +0000
+++ source/arch/x86_64/kernel/vmlinux.lds.S	2004-04-21 10:45:33.966539800 +0100
@@ -15,6 +15,7 @@ SECTIONS
   _text = .;			/* Text and read-only data */
   .text : {
 	*(.text)
+	SCHED_TEXT
 	*(.fixup)
 	*(.gnu.warning)
 	} = 0x9090
--- diff/arch/x86_64/kernel/x8664_ksyms.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/x86_64/kernel/x8664_ksyms.c	2004-04-21 10:45:33.966539800 +0100
@@ -98,8 +98,10 @@ EXPORT_SYMBOL(copy_to_user);
 EXPORT_SYMBOL(copy_in_user);
 EXPORT_SYMBOL(strnlen_user);
 
+#ifdef CONFIG_PCI
 EXPORT_SYMBOL(pci_alloc_consistent);
 EXPORT_SYMBOL(pci_free_consistent);
+#endif
 
 #ifdef CONFIG_PCI
 EXPORT_SYMBOL(pcibios_penalize_isa_irq);
@@ -206,13 +208,6 @@ EXPORT_SYMBOL(init_level4_pgt);
 extern unsigned long __supported_pte_mask;
 EXPORT_SYMBOL(__supported_pte_mask);
 
-#ifdef CONFIG_DISCONTIGMEM
-EXPORT_SYMBOL(memnode_shift);
-EXPORT_SYMBOL(memnodemap);
-EXPORT_SYMBOL(node_data);
-EXPORT_SYMBOL(fake_node);
-#endif
-
 EXPORT_SYMBOL(clear_page);
 
 #ifdef CONFIG_SMP
--- diff/arch/x86_64/lib/thunk.S	2004-02-09 10:36:09.000000000 +0000
+++ source/arch/x86_64/lib/thunk.S	2004-04-21 10:45:33.966539800 +0100
@@ -35,6 +35,7 @@
 	.endm
 	
 
+	.section .sched.text
 #ifdef CONFIG_RWSEM_XCHGADD_ALGORITHM
 	thunk rwsem_down_read_failed_thunk,rwsem_down_read_failed
 	thunk rwsem_down_write_failed_thunk,rwsem_down_write_failed
@@ -65,7 +66,7 @@ restore_norax:	
 
 #ifdef CONFIG_SMP
 /* Support for read/write spinlocks. */
-	
+	.text
 /* rax:	pointer to rwlock_t */	
 ENTRY(__write_lock_failed)
 	lock
--- diff/arch/x86_64/mm/init.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/x86_64/mm/init.c	2004-04-21 10:45:33.967539648 +0100
@@ -603,8 +603,6 @@ struct vm_area_struct *get_gate_vma(stru
 
 int in_gate_area(struct task_struct *task, unsigned long addr)
 {
-	struct vm_area_struct *vma = &gate_vma;
-	if (test_tsk_thread_flag(task, TIF_IA32))
-		vma = &gate32_vma;
+	struct vm_area_struct *vma = get_gate_vma(task);
 	return (addr >= vma->vm_start) && (addr < vma->vm_end);
 }
--- diff/arch/x86_64/mm/k8topology.c	2004-03-11 10:20:23.000000000 +0000
+++ source/arch/x86_64/mm/k8topology.c	2004-04-21 10:45:33.967539648 +0100
@@ -48,7 +48,6 @@ int __init k8_scan_nodes(unsigned long s
 	int nodeid, i, nb; 
 	int found = 0;
 	u32 reg;
-	int rr;
 
 	nb = find_northbridge(); 
 	if (nb < 0) 
@@ -91,7 +90,7 @@ int __init k8_scan_nodes(unsigned long s
 			       nodeid, (base>>8)&3, (limit>>8) & 3); 
 			return -1; 
 		}	
-		if ((1UL << nodeid) & nodes_present) { 
+		if (node_online(nodeid)) { 
 			printk(KERN_INFO "Node %d already present. Skipping\n", 
 			       nodeid);
 			continue;
@@ -152,28 +151,13 @@ int __init k8_scan_nodes(unsigned long s
 	printk(KERN_INFO "Using node hash shift of %d\n", memnode_shift); 
 
 	for (i = 0; i < MAXNODE; i++) { 
-		if (nodes[i].start != nodes[i].end)
+		if (nodes[i].start != nodes[i].end) { 
+			/* assume 1:1 NODE:CPU */
+			cpu_to_node[i] = i; 
 		setup_node_bootmem(i, nodes[i].start, nodes[i].end); 
 	} 
-
-	/* There are unfortunately some poorly designed mainboards around
-	   that only connect memory to a single CPU. This breaks the 1:1 cpu->node
-	   mapping. To avoid this fill in the mapping for all possible
-	   CPUs, as the number of CPUs is not known yet. 
-	   We round robin the existing nodes. */
-	rr = 0;
-	for (i = 0; i < MAXNODE; i++) {
-		if (nodes_present & (1UL<<i))
-			continue;
-		if ((nodes_present >> rr) == 0) 
-			rr = 0; 
-		rr = ffz(~nodes_present >> rr); 
-		node_data[i] = node_data[rr];
-		rr++; 
 	}
 
-	if (found == 1) 
-		fake_node = 1;
-
+	numa_init_array();
 	return 0;
 } 
--- diff/arch/x86_64/mm/numa.c	2004-04-05 12:57:07.000000000 +0100
+++ source/arch/x86_64/mm/numa.c	2004-04-21 10:45:33.968539496 +0100
@@ -9,6 +9,7 @@
 #include <linux/bootmem.h>
 #include <linux/mmzone.h>
 #include <linux/ctype.h>
+#include <linux/module.h>
 #include <asm/e820.h>
 #include <asm/proto.h>
 #include <asm/dma.h>
@@ -24,6 +25,9 @@ bootmem_data_t plat_node_bdata[MAX_NUMNO
 int memnode_shift;
 u8  memnodemap[NODEMAPSIZE];
 
+unsigned char cpu_to_node[NR_CPUS];  
+cpumask_t     node_to_cpumask[MAXNODE]; 
+
 static int numa_off __initdata; 
 
 unsigned long nodes_present; 
@@ -105,7 +109,6 @@ void __init setup_node_bootmem(int nodei
 	reserve_bootmem_node(NODE_DATA(nodeid), bootmap_start, bootmap_pages<<PAGE_SHIFT);
 	if (nodeid + 1 > numnodes)
 		numnodes = nodeid + 1;
-	nodes_present |= (1UL << nodeid); 
 	node_set_online(nodeid);
 } 
 
@@ -136,13 +139,36 @@ void __init setup_node_zones(int nodeid)
 			    start_pfn, NULL); 
 } 
 
-int fake_node;
+void __init numa_init_array(void)
+{
+	int rr, i;
+	/* There are unfortunately some poorly designed mainboards around
+	   that only connect memory to a single CPU. This breaks the 1:1 cpu->node
+	   mapping. To avoid this fill in the mapping for all possible
+	   CPUs, as the number of CPUs is not known yet. 
+	   We round robin the existing nodes. */
+	rr = 0;
+	for (i = 0; i < MAXNODE; i++) {
+		if (node_online(i))
+			continue;
+		rr = find_next_bit(node_online_map, MAX_NUMNODES, rr);
+		if (rr == MAX_NUMNODES)
+			rr = find_first_bit(node_online_map, MAX_NUMNODES);
+		node_data[i] = node_data[rr];
+		cpu_to_node[i] = rr;
+		rr++; 
+	}
+
+	set_bit(0, &node_to_cpumask[cpu_to_node(0)]);
+}
 
-int __init numa_initmem_init(unsigned long start_pfn, unsigned long end_pfn)
+void __init numa_initmem_init(unsigned long start_pfn, unsigned long end_pfn)
 { 
+	int i;
+
 #ifdef CONFIG_K8_NUMA
 	if (!numa_off && !k8_scan_nodes(start_pfn<<PAGE_SHIFT, end_pfn<<PAGE_SHIFT))
-		return 0; 
+		return;
 #endif
 	printk(KERN_INFO "%s\n",
 	       numa_off ? "NUMA turned off" : "No NUMA configuration found");
@@ -151,12 +177,20 @@ int __init numa_initmem_init(unsigned lo
 	       start_pfn << PAGE_SHIFT,
 	       end_pfn << PAGE_SHIFT); 
 		/* setup dummy node covering all memory */ 
-	fake_node = 1; 	
 	memnode_shift = 63; 
 	memnodemap[0] = 0;
 	numnodes = 1;
+	for (i = 0; i < NR_CPUS; i++)
+		cpu_to_node[i] = 0;
+	node_to_cpumask[0] = 1;
 	setup_node_bootmem(0, start_pfn<<PAGE_SHIFT, end_pfn<<PAGE_SHIFT);
-	return -1; 
+}
+
+__init void numa_add_cpu(int cpu)
+{
+	/* BP is initialized elsewhere */
+	if (cpu) 
+		set_bit(cpu, &node_to_cpumask[cpu_to_node(cpu)]);
 } 
 
 unsigned long __init numa_free_all_bootmem(void) 
@@ -185,4 +219,8 @@ __init int numa_setup(char *opt) 
 	return 1;
 } 
 
-
+EXPORT_SYMBOL(cpu_to_node);
+EXPORT_SYMBOL(node_to_cpumask);
+EXPORT_SYMBOL(memnode_shift);
+EXPORT_SYMBOL(memnodemap);
+EXPORT_SYMBOL(node_data);
--- diff/crypto/Kconfig	2004-04-05 12:57:07.000000000 +0100
+++ source/crypto/Kconfig	2004-04-21 10:45:33.968539496 +0100
@@ -146,9 +146,10 @@ config CRYPTO_ARC4
 	help
 	  ARC4 cipher algorithm.
 
-	  This is a stream cipher using keys ranging from 8 bits to 2048
-	  bits in length.  ARC4 is commonly used in protocols such as WEP 
-	  and SSL.
+	  ARC4 is a stream cipher using keys ranging from 8 bits to 2048
+	  bits in length.  This algorithm is required for driver-based 
+	  WEP, but it should not be for other purposes because of the
+	  weakness of the algorithm.
 
 config CRYPTO_DEFLATE
 	tristate "Deflate compression algorithm"
--- diff/drivers/acpi/events/evmisc.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/acpi/events/evmisc.c	2004-04-21 10:45:33.968539496 +0100
@@ -139,7 +139,8 @@ acpi_ev_queue_notify_request (
 				acpi_notify_value_names[notify_value]));
 	}
 	else {
-		ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "notify value: 0x2.2_x **Device Specific**\n",
+		ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+				"notify value: 0x%2.2x **Device Specific**\n",
 				notify_value));
 	}
 
--- diff/drivers/atm/ambassador.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/atm/ambassador.c	2004-04-21 10:45:33.969539344 +0100
@@ -329,7 +329,7 @@ static const unsigned long onegigmask = 
 /********** access to adapter **********/
 
 static inline void wr_plain (const amb_dev * dev, size_t addr, u32 data) {
-  PRINTD (DBG_FLOW|DBG_REGS, "wr: %08x <- %08x", addr, data);
+  PRINTD (DBG_FLOW|DBG_REGS, "wr: %08zx <- %08x", addr, data);
 #ifdef AMB_MMIO
   dev->membase[addr / sizeof(u32)] = data;
 #else
@@ -343,13 +343,13 @@ static inline u32 rd_plain (const amb_de
 #else
   u32 data = inl (dev->iobase + addr);
 #endif
-  PRINTD (DBG_FLOW|DBG_REGS, "rd: %08x -> %08x", addr, data);
+  PRINTD (DBG_FLOW|DBG_REGS, "rd: %08zx -> %08x", addr, data);
   return data;
 }
 
 static inline void wr_mem (const amb_dev * dev, size_t addr, u32 data) {
   u32 be = cpu_to_be32 (data);
-  PRINTD (DBG_FLOW|DBG_REGS, "wr: %08x <- %08x b[%08x]", addr, data, be);
+  PRINTD (DBG_FLOW|DBG_REGS, "wr: %08zx <- %08x b[%08x]", addr, data, be);
 #ifdef AMB_MMIO
   dev->membase[addr / sizeof(u32)] = be;
 #else
@@ -364,7 +364,7 @@ static inline u32 rd_mem (const amb_dev 
   u32 be = inl (dev->iobase + addr);
 #endif
   u32 data = be32_to_cpu (be);
-  PRINTD (DBG_FLOW|DBG_REGS, "rd: %08x -> %08x b[%08x]", addr, data, be);
+  PRINTD (DBG_FLOW|DBG_REGS, "rd: %08zx -> %08x b[%08x]", addr, data, be);
   return data;
 }
 
--- diff/drivers/atm/lanai.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/atm/lanai.c	2004-04-21 10:45:33.971539040 +0100
@@ -1743,7 +1743,7 @@ static void run_service(struct lanai_dev
 		read_lock(&vcc_sklist_lock);
 		vci_bitfield_iterate(lanai, lanai->transmit_ready,
 		    iter_transmit);
-		CLEAR_BITMAP(&lanai->transmit_ready, NUM_VCI);
+		bitmap_zero(lanai->transmit_ready, NUM_VCI);
 		read_unlock(&vcc_sklist_lock);
 	}
 }
@@ -2158,8 +2158,8 @@ static int __init lanai_dev_open(struct 
 	/* Basic device fields */
 	lanai->number = atmdev->number;
 	lanai->num_vci = NUM_VCI;
-	CLEAR_BITMAP(&lanai->backlog_vccs, NUM_VCI);
-	CLEAR_BITMAP(&lanai->transmit_ready, NUM_VCI);
+	bitmap_zero(lanai->backlog_vccs, NUM_VCI);
+	bitmap_zero(lanai->transmit_ready, NUM_VCI);
 	lanai->naal0 = 0;
 #ifdef USE_POWERDOWN
 	lanai->nbound = 0;
--- diff/drivers/atm/nicstar.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/atm/nicstar.c	2004-04-21 10:45:33.973538736 +0100
@@ -757,7 +757,7 @@ static int __devinit ns_init_card(int i,
    for (j = 0; j < NUM_HB; j++)
    {
       struct sk_buff *hb;
-      hb = alloc_skb(NS_HBUFSIZE, GFP_KERNEL);
+      hb = __dev_alloc_skb(NS_HBUFSIZE, GFP_KERNEL);
       if (hb == NULL)
       {
          printk("nicstar%d: can't allocate %dth of %d huge buffers.\n",
@@ -777,7 +777,7 @@ static int __devinit ns_init_card(int i,
    for (j = 0; j < NUM_LB; j++)
    {
       struct sk_buff *lb;
-      lb = alloc_skb(NS_LGSKBSIZE, GFP_KERNEL);
+      lb = __dev_alloc_skb(NS_LGSKBSIZE, GFP_KERNEL);
       if (lb == NULL)
       {
          printk("nicstar%d: can't allocate %dth of %d large buffers.\n",
@@ -813,7 +813,7 @@ static int __devinit ns_init_card(int i,
    for (j = 0; j < NUM_SB; j++)
    {
       struct sk_buff *sb;
-      sb = alloc_skb(NS_SMSKBSIZE, GFP_KERNEL);
+      sb = __dev_alloc_skb(NS_SMSKBSIZE, GFP_KERNEL);
       if (sb == NULL)
       {
          printk("nicstar%d: can't allocate %dth of %d small buffers.\n",
@@ -1315,7 +1315,7 @@ static irqreturn_t ns_irq_handler(int ir
              card->index);
       for (i = 0; i < card->sbnr.min; i++)
       {
-         sb = alloc_skb(NS_SMSKBSIZE, GFP_ATOMIC);
+         sb = dev_alloc_skb(NS_SMSKBSIZE);
          if (sb == NULL)
          {
             writel(readl(card->membase + CFG) & ~NS_CFG_EFBIE, card->membase + CFG);
@@ -1341,7 +1341,7 @@ static irqreturn_t ns_irq_handler(int ir
              card->index);
       for (i = 0; i < card->lbnr.min; i++)
       {
-         lb = alloc_skb(NS_LGSKBSIZE, GFP_ATOMIC);
+         lb = dev_alloc_skb(NS_LGSKBSIZE);
          if (lb == NULL)
          {
             writel(readl(card->membase + CFG) & ~NS_CFG_EFBIE, card->membase + CFG);
@@ -2178,7 +2178,7 @@ static void dequeue_rx(ns_dev *card, ns_
       cell = skb->data;
       for (i = ns_rsqe_cellcount(rsqe); i; i--)
       {
-         if ((sb = alloc_skb(NS_SMSKBSIZE, GFP_ATOMIC)) == NULL)
+         if ((sb = dev_alloc_skb(NS_SMSKBSIZE)) == NULL)
          {
             printk("nicstar%d: Can't allocate buffers for aal0.\n",
                    card->index);
@@ -2410,7 +2410,7 @@ static void dequeue_rx(ns_dev *card, ns_
          if (hb == NULL)		/* No buffers in the queue */
          {
 
-            hb = alloc_skb(NS_HBUFSIZE, GFP_ATOMIC);
+            hb = dev_alloc_skb(NS_HBUFSIZE);
             if (hb == NULL)
             {
                printk("nicstar%d: Out of huge buffers.\n", card->index);
@@ -2424,7 +2424,7 @@ static void dequeue_rx(ns_dev *card, ns_
             else if (card->hbpool.count < card->hbnr.min)
 	    {
                struct sk_buff *new_hb;
-               if ((new_hb = alloc_skb(NS_HBUFSIZE, GFP_ATOMIC)) != NULL)
+               if ((new_hb = dev_alloc_skb(NS_HBUFSIZE)) != NULL)
                {
                   skb_queue_tail(&card->hbpool.queue, new_hb);
                   card->hbpool.count++;
@@ -2435,14 +2435,14 @@ static void dequeue_rx(ns_dev *card, ns_
          if (--card->hbpool.count < card->hbnr.min)
          {
             struct sk_buff *new_hb;
-            if ((new_hb = alloc_skb(NS_HBUFSIZE, GFP_ATOMIC)) != NULL)
+            if ((new_hb = dev_alloc_skb(NS_HBUFSIZE)) != NULL)
             {
                skb_queue_tail(&card->hbpool.queue, new_hb);
                card->hbpool.count++;
             }
             if (card->hbpool.count < card->hbnr.min)
 	    {
-               if ((new_hb = alloc_skb(NS_HBUFSIZE, GFP_ATOMIC)) != NULL)
+               if ((new_hb = dev_alloc_skb(NS_HBUFSIZE)) != NULL)
                {
                   skb_queue_tail(&card->hbpool.queue, new_hb);
                   card->hbpool.count++;
@@ -2524,7 +2524,7 @@ static void ns_sb_destructor(struct sk_b
 
    do
    {
-      sb = alloc_skb(NS_SMSKBSIZE, GFP_KERNEL);
+      sb = __dev_alloc_skb(NS_SMSKBSIZE, GFP_KERNEL);
       if (sb == NULL)
          break;
       skb_queue_tail(&card->sbpool.queue, sb);
@@ -2547,7 +2547,7 @@ static void ns_lb_destructor(struct sk_b
 
    do
    {
-      lb = alloc_skb(NS_LGSKBSIZE, GFP_KERNEL);
+      lb = __dev_alloc_skb(NS_LGSKBSIZE, GFP_KERNEL);
       if (lb == NULL)
          break;
       skb_queue_tail(&card->lbpool.queue, lb);
@@ -2566,7 +2566,7 @@ static void ns_hb_destructor(struct sk_b
 
    while (card->hbpool.count < card->hbnr.init)
    {
-      hb = alloc_skb(NS_HBUFSIZE, GFP_KERNEL);
+      hb = __dev_alloc_skb(NS_HBUFSIZE, GFP_KERNEL);
       if (hb == NULL)
          break;
       skb_queue_tail(&card->hbpool.queue, hb);
@@ -2638,7 +2638,7 @@ static void dequeue_sm_buf(ns_dev *card,
    if (card->sbfqc < card->sbnr.init)
    {
       struct sk_buff *new_sb;
-      if ((new_sb = alloc_skb(NS_SMSKBSIZE, GFP_ATOMIC)) != NULL)
+      if ((new_sb = dev_alloc_skb(NS_SMSKBSIZE)) != NULL)
       {
          skb_queue_tail(&card->sbpool.queue, new_sb);
          skb_reserve(new_sb, NS_AAL0_HEADER);
@@ -2650,7 +2650,7 @@ static void dequeue_sm_buf(ns_dev *card,
 #endif /* NS_USE_DESTRUCTORS */
    {
       struct sk_buff *new_sb;
-      if ((new_sb = alloc_skb(NS_SMSKBSIZE, GFP_ATOMIC)) != NULL)
+      if ((new_sb = dev_alloc_skb(NS_SMSKBSIZE)) != NULL)
       {
          skb_queue_tail(&card->sbpool.queue, new_sb);
          skb_reserve(new_sb, NS_AAL0_HEADER);
@@ -2671,7 +2671,7 @@ static void dequeue_lg_buf(ns_dev *card,
    if (card->lbfqc < card->lbnr.init)
    {
       struct sk_buff *new_lb;
-      if ((new_lb = alloc_skb(NS_LGSKBSIZE, GFP_ATOMIC)) != NULL)
+      if ((new_lb = dev_alloc_skb(NS_LGSKBSIZE)) != NULL)
       {
          skb_queue_tail(&card->lbpool.queue, new_lb);
          skb_reserve(new_lb, NS_SMBUFSIZE);
@@ -2683,7 +2683,7 @@ static void dequeue_lg_buf(ns_dev *card,
 #endif /* NS_USE_DESTRUCTORS */
    {
       struct sk_buff *new_lb;
-      if ((new_lb = alloc_skb(NS_LGSKBSIZE, GFP_ATOMIC)) != NULL)
+      if ((new_lb = dev_alloc_skb(NS_LGSKBSIZE)) != NULL)
       {
          skb_queue_tail(&card->lbpool.queue, new_lb);
          skb_reserve(new_lb, NS_SMBUFSIZE);
@@ -2877,7 +2877,7 @@ static int ns_ioctl(struct atm_dev *dev,
 	       {
                   struct sk_buff *sb;
 
-                  sb = alloc_skb(NS_SMSKBSIZE, GFP_KERNEL);
+                  sb = __dev_alloc_skb(NS_SMSKBSIZE, GFP_KERNEL);
                   if (sb == NULL)
                      return -ENOMEM;
                   skb_queue_tail(&card->sbpool.queue, sb);
@@ -2891,7 +2891,7 @@ static int ns_ioctl(struct atm_dev *dev,
 	       {
                   struct sk_buff *lb;
 
-                  lb = alloc_skb(NS_LGSKBSIZE, GFP_KERNEL);
+                  lb = __dev_alloc_skb(NS_LGSKBSIZE, GFP_KERNEL);
                   if (lb == NULL)
                      return -ENOMEM;
                   skb_queue_tail(&card->lbpool.queue, lb);
@@ -2920,7 +2920,7 @@ static int ns_ioctl(struct atm_dev *dev,
                {
                   struct sk_buff *hb;
 
-                  hb = alloc_skb(NS_HBUFSIZE, GFP_KERNEL);
+                  hb = __dev_alloc_skb(NS_HBUFSIZE, GFP_KERNEL);
                   if (hb == NULL)
                      return -ENOMEM;
                   ns_grab_int_lock(card, flags);
--- diff/drivers/base/Kconfig	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/base/Kconfig	2004-04-21 10:45:33.973538736 +0100
@@ -9,14 +9,14 @@ config FW_LOADER
 	  the kernel tree does.
 
 config DEBUG_DRIVER
-        bool "Driver Core verbose debug messages"
-        depends on DEBUG_KERNEL
-        help
-          Say Y here if you want the Driver core to produce a bunch of
-          debug messages to the system log. Select this if you are having a
-          problem with the driver core and want to see more of what is
-          going on.
+	 bool "Driver Core verbose debug messages"
+	depends on DEBUG_KERNEL
+	help
+	  Say Y here if you want the Driver core to produce a bunch of
+	  debug messages to the system log. Select this if you are having a
+	  problem with the driver core and want to see more of what is
+	  going on.
 
-          If you are unsure about this, say N here.
+	  If you are unsure about this, say N here.
 
 endmenu
--- diff/drivers/base/class.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/base/class.c	2004-04-21 10:45:33.973538736 +0100
@@ -155,8 +155,7 @@ static int class_device_dev_link(struct 
 
 static void class_device_dev_unlink(struct class_device * class_dev)
 {
-	if (class_dev->dev)
-		sysfs_remove_link(&class_dev->kobj, "device");
+	sysfs_remove_link(&class_dev->kobj, "device");
 }
 
 static int class_device_driver_link(struct class_device * class_dev)
@@ -169,8 +168,7 @@ static int class_device_driver_link(stru
 
 static void class_device_driver_unlink(struct class_device * class_dev)
 {
-	if ((class_dev->dev) && (class_dev->dev->driver))
-		sysfs_remove_link(&class_dev->kobj, "driver");
+	sysfs_remove_link(&class_dev->kobj, "driver");
 }
 
 
--- diff/drivers/base/platform.c	2004-01-19 10:22:55.000000000 +0000
+++ source/drivers/base/platform.c	2004-04-21 10:45:33.974538584 +0100
@@ -1,5 +1,5 @@
 /*
- * platform.c - platform 'psuedo' bus for legacy devices
+ * platform.c - platform 'pseudo' bus for legacy devices
  *
  * Copyright (c) 2002-3 Patrick Mochel
  * Copyright (c) 2002-3 Open Source Development Labs
--- diff/drivers/block/Kconfig.iosched	2003-10-09 09:47:16.000000000 +0100
+++ source/drivers/block/Kconfig.iosched	2004-04-21 10:45:33.974538584 +0100
@@ -27,3 +27,10 @@ config IOSCHED_DEADLINE
 	  a disk at any one time, its behaviour is almost identical to the
 	  anticipatory I/O scheduler and so is a good choice.
 
+config IOSCHED_CFQ
+	bool "CFQ I/O scheduler" if EMBEDDED
+	default y
+	---help---
+	  The CFQ I/O scheduler tries to distribute bandwidth equally
+	  among all processes in the system. It should provide a fair
+	  working environment, suitable for desktop systems.
--- diff/drivers/block/Makefile	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/block/Makefile	2004-04-21 10:45:33.974538584 +0100
@@ -18,6 +18,7 @@ obj-y	:= elevator.o ll_rw_blk.o ioctl.o 
 obj-$(CONFIG_IOSCHED_NOOP)	+= noop-iosched.o
 obj-$(CONFIG_IOSCHED_AS)	+= as-iosched.o
 obj-$(CONFIG_IOSCHED_DEADLINE)	+= deadline-iosched.o
+obj-$(CONFIG_IOSCHED_CFQ)	+= cfq-iosched.o
 obj-$(CONFIG_MAC_FLOPPY)	+= swim3.o
 obj-$(CONFIG_BLK_DEV_FD)	+= floppy.o
 obj-$(CONFIG_BLK_DEV_FD98)	+= floppy98.o
--- diff/drivers/block/cciss.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/block/cciss.c	2004-04-21 10:45:33.975538432 +0100
@@ -210,7 +210,7 @@ static int cciss_proc_get_info(char *buf
 
         pos += size; len += size;
 	cciss_proc_tape_report(ctlr, buffer, &pos, &len);
-	for(i=0; i<h->highest_lun; i++) {
+	for(i=0; i<=h->highest_lun; i++) {
 		sector_t tmp;
 
                 drv = &h->drv[i];
--- diff/drivers/block/cciss_scsi.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/block/cciss_scsi.c	2004-04-21 10:45:33.976538280 +0100
@@ -237,8 +237,7 @@ scsi_cmd_stack_free(int ctlr)
 		printk( "cciss: %d scsi commands are still outstanding.\n",
 			CMD_STACK_SIZE - stk->top);
 		// BUG();
-		printk("WE HAVE A BUG HERE!!! stk=0x%08x\n", 
-			(unsigned int) stk);
+		printk("WE HAVE A BUG HERE!!! stk=0x%p\n", stk);
 	}
 	size = sizeof(struct cciss_scsi_cmd_stack_elem_t) * CMD_STACK_SIZE;
 
--- diff/drivers/block/elevator.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/block/elevator.c	2004-04-21 10:45:33.978537976 +0100
@@ -150,6 +150,13 @@ void elv_merge_requests(request_queue_t 
 void elv_requeue_request(request_queue_t *q, struct request *rq)
 {
 	/*
+	 * it already went through dequeue, we need to decrement the
+	 * in_flight count again
+	 */
+	if (blk_account_rq(rq))
+		q->in_flight--;
+
+	/*
 	 * if iosched has an explicit requeue hook, then use that. otherwise
 	 * just put the request at the front of the queue
 	 */
@@ -233,6 +240,16 @@ void elv_remove_request(request_queue_t 
 	elevator_t *e = &q->elevator;
 
 	/*
+	 * the time frame between a request being removed from the lists
+	 * and to it is freed is accounted as io that is in progress at
+	 * the driver side. note that we only account requests that the
+	 * driver has seen (REQ_STARTED set), to avoid false accounting
+	 * for request-request merges
+	 */
+	if (blk_account_rq(rq))
+		q->in_flight++;
+
+	/*
 	 * the main clearing point for q->last_merge is on retrieval of
 	 * request by driver (it calls elv_next_request()), but it _can_
 	 * also happen here if a request is added to the queue but later
@@ -321,6 +338,12 @@ void elv_completed_request(request_queue
 {
 	elevator_t *e = &q->elevator;
 
+	/*
+	 * request is released from the driver, io must be done
+	 */
+	if (blk_account_rq(rq))
+		q->in_flight--;
+
 	if (e->elevator_completed_req_fn)
 		e->elevator_completed_req_fn(q, rq);
 }
--- diff/drivers/block/floppy.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/block/floppy.c	2004-04-21 10:45:33.985536912 +0100
@@ -102,7 +102,7 @@
  * interrupt and dma channel to asm/floppy.h. Cleaned up some formatting &
  * use of '0' for NULL.
  */
- 
+
 /*
  * 1998/06/07 -- Alan Cox -- Merged the 2.0.34 fixes for resource allocation
  * failures.
@@ -145,10 +145,10 @@
 #define REALLY_SLOW_IO
 
 #define DEBUGT 2
-#define DCL_DEBUG /* debug disk change line */
+#define DCL_DEBUG		/* debug disk change line */
 
 /* do print messages for unexpected interrupts */
-static int print_unex=1;
+static int print_unex = 1;
 #include <linux/module.h>
 #include <linux/sched.h>
 #include <linux/fs.h>
@@ -163,7 +163,6 @@ static int print_unex=1;
  * 1998/1/21 -- Richard Gooch <rgooch@atnf.csiro.au> -- devfs support
  */
 
-
 #include <linux/fd.h>
 #include <linux/hdreg.h>
 
@@ -174,13 +173,13 @@ static int print_unex=1;
 #include <linux/string.h>
 #include <linux/fcntl.h>
 #include <linux/delay.h>
-#include <linux/mc146818rtc.h> /* CMOS defines */
+#include <linux/mc146818rtc.h>	/* CMOS defines */
 #include <linux/ioport.h>
 #include <linux/interrupt.h>
 #include <linux/init.h>
 #include <linux/devfs_fs_kernel.h>
 #include <linux/device.h>
-#include <linux/buffer_head.h>		/* for invalidate_buffers() */
+#include <linux/buffer_head.h>	/* for invalidate_buffers() */
 
 /*
  * PS/2 floppies have much slower step rates than regular floppies.
@@ -195,9 +194,9 @@ static int slow_floppy;
 #include <asm/io.h>
 #include <asm/uaccess.h>
 
-static int FLOPPY_IRQ=6;
-static int FLOPPY_DMA=2;
-static int can_use_virtual_dma=2;
+static int FLOPPY_IRQ = 6;
+static int FLOPPY_DMA = 2;
+static int can_use_virtual_dma = 2;
 /* =======
  * can use virtual DMA:
  * 0 = use of virtual DMA disallowed by config
@@ -221,10 +220,10 @@ static int use_virtual_dma;
 static spinlock_t floppy_lock = SPIN_LOCK_UNLOCKED;
 static struct completion device_release;
 
-static unsigned short virtual_dma_port=0x3f0;
-irqreturn_t floppy_interrupt(int irq, void *dev_id, struct pt_regs * regs);
+static unsigned short virtual_dma_port = 0x3f0;
+irqreturn_t floppy_interrupt(int irq, void *dev_id, struct pt_regs *regs);
 static int set_dor(int fdc, char mask, char data);
-static void register_devfs_entries (int drive) __init;
+static void register_devfs_entries(int drive) __init;
 
 #define K_64	0x10000		/* 64KB */
 
@@ -249,7 +248,7 @@ static int irqdma_allocated;
 
 #include <linux/blkdev.h>
 #include <linux/blkpg.h>
-#include <linux/cdrom.h> /* for the compatibility eject ioctl */
+#include <linux/cdrom.h>	/* for the compatibility eject ioctl */
 #include <linux/completion.h>
 
 static struct request *current_req;
@@ -274,11 +273,12 @@ static inline void fallback_on_nodma_all
 {
 #ifdef FLOPPY_CAN_FALLBACK_ON_NODMA
 	if (*addr)
-		return; /* we have the memory */
+		return;		/* we have the memory */
 	if (can_use_virtual_dma != 2)
-		return; /* no fallback allowed */
-	printk("DMA memory shortage. Temporarily falling back on virtual DMA\n");
-	*addr = (char *) nodma_mem_alloc(l);
+		return;		/* no fallback allowed */
+	printk
+	    ("DMA memory shortage. Temporarily falling back on virtual DMA\n");
+	*addr = (char *)nodma_mem_alloc(l);
 #else
 	return;
 #endif
@@ -287,12 +287,12 @@ static inline void fallback_on_nodma_all
 /* End dma memory related stuff */
 
 static unsigned long fake_change;
-static int initialising=1;
+static int initialising = 1;
 
 #define ITYPE(x) (((x)>>2) & 0x1f)
 #define TOMINOR(x) ((x & 3) | ((x & 4) << 5))
-#define UNIT(x) ((x) & 0x03)		/* drive on fdc */
-#define FDC(x) (((x) & 0x04) >> 2)  /* fdc of drive */
+#define UNIT(x) ((x) & 0x03)	/* drive on fdc */
+#define FDC(x) (((x) & 0x04) >> 2)	/* fdc of drive */
 #define REVDRIVE(fdc, unit) ((unit) + ((fdc) << 2))
 				/* reverse mapping from unit and fdc to drive */
 #define DP (&drive_params[current_drive])
@@ -342,19 +342,18 @@ static int initialising=1;
  * current disk size is unknown.
  * [Now it is rather a minimum]
  */
-#define MAX_DISK_SIZE 4 /* 3984*/
-
+#define MAX_DISK_SIZE 4		/* 3984 */
 
 /*
  * globals used by 'result()'
  */
 #define MAX_REPLIES 16
 static unsigned char reply_buffer[MAX_REPLIES];
-static int inr; /* size of reply buffer, when called from interrupt */
+static int inr;			/* size of reply buffer, when called from interrupt */
 #define ST0 (reply_buffer[0])
 #define ST1 (reply_buffer[1])
 #define ST2 (reply_buffer[2])
-#define ST3 (reply_buffer[0]) /* result of GETSTATUS */
+#define ST3 (reply_buffer[0])	/* result of GETSTATUS */
 #define R_TRACK (reply_buffer[3])
 #define R_HEAD (reply_buffer[4])
 #define R_SECTOR (reply_buffer[5])
@@ -367,8 +366,8 @@ static int inr; /* size of reply buffer,
  */
 static struct {
 	struct floppy_drive_params params;
-	const char *name; /* name printed while booting */
-} default_drive_params[]= {
+	const char *name;	/* name printed while booting */
+} default_drive_params[] = {
 /* NOTE: the time values in jiffies should be in msec!
  CMOS drive type
   |     Maximum data rate supported by drive type
@@ -541,14 +540,14 @@ static char *floppy_track_buffer;
 static int max_buffer_sectors;
 
 static int *errors;
-typedef void (*done_f)(int);
+typedef void (*done_f) (int);
 static struct cont_t {
-	void (*interrupt)(void); /* this is called after the interrupt of the
-				  * main command */
-	void (*redo)(void); /* this is called to retry the operation */
-	void (*error)(void); /* this is called to tally an error */
-	done_f done; /* this is called to say if the operation has 
-		      * succeeded/failed */
+	void (*interrupt) (void);	/* this is called after the interrupt of the
+					 * main command */
+	void (*redo) (void);	/* this is called to retry the operation */
+	void (*error) (void);	/* this is called to tally an error */
+	done_f done;		/* this is called to say if the operation has
+				 * succeeded/failed */
 } *cont;
 
 static void floppy_ready(void);
@@ -589,12 +588,12 @@ static int buffer_max = -1;
 
 /* fdc related variables, should end up in a struct */
 static struct floppy_fdc_state fdc_state[N_FDC];
-static int fdc; /* current fdc */
+static int fdc;			/* current fdc */
 
 static struct floppy_struct *_floppy = floppy_type;
 static unsigned char current_drive;
 static long current_count_sectors;
-static unsigned char fsector_t; /* sector in track */
+static unsigned char fsector_t;	/* sector in track */
 static unsigned char in_sector_offset;	/* offset within physical sector,
 					 * expressed in units of 512 bytes */
 
@@ -624,11 +623,11 @@ static inline void debugt(const char *me
 {
 #ifdef DEBUGT
 	if (DP->flags & DEBUGT)
-		printk("%s dtime=%lu\n", message, jiffies-debugtimer);
+		printk("%s dtime=%lu\n", message, jiffies - debugtimer);
 #endif
 }
 
-typedef void (*timeout_fn)(unsigned long);
+typedef void (*timeout_fn) (unsigned long);
 static struct timer_list fd_timeout = TIMER_INITIALIZER(floppy_shutdown, 0, 0);
 
 static const char *timeout_message;
@@ -639,18 +638,18 @@ static void is_alive(const char *message
 	/* this routine checks whether the floppy driver is "alive" */
 	if (test_bit(0, &fdc_busy) && command_status < 2
 	    && !timer_pending(&fd_timeout)) {
-		DPRINT("timeout handler died: %s\n",message);
+		DPRINT("timeout handler died: %s\n", message);
 	}
 }
 #endif
 
-static void (*do_floppy)(void) = NULL;
+static void (*do_floppy) (void) = NULL;
 
 #ifdef FLOPPY_SANITY_CHECK
 
 #define OLOGSIZE 20
 
-static void (*lasthandler)(void);
+static void (*lasthandler) (void);
 static unsigned long interruptjiffies;
 static unsigned long resultjiffies;
 static int resultsize;
@@ -674,12 +673,12 @@ static void __reschedule_timeout(int dri
 		drive = current_drive;
 	del_timer(&fd_timeout);
 	if (drive < 0 || drive > N_DRIVE) {
-		fd_timeout.expires = jiffies + 20UL*HZ;
-		drive=0;
+		fd_timeout.expires = jiffies + 20UL * HZ;
+		drive = 0;
 	} else
 		fd_timeout.expires = jiffies + UDP->timeout;
 	add_timer(&fd_timeout);
-	if (UDP->flags & FD_DEBUG){
+	if (UDP->flags & FD_DEBUG) {
 		DPRINT("reschedule timeout ");
 		printk(message, marg);
 		printk("\n");
@@ -700,7 +699,6 @@ static void reschedule_timeout(int drive
 
 #define SUPBOUND(a,b) (a)=min_t(int, a, b)
 
-
 /*
  * Bottom half floppy driver.
  * ==========================
@@ -736,32 +734,31 @@ static void reschedule_timeout(int drive
 
 static int disk_change(int drive)
 {
-	int fdc=FDC(drive);
+	int fdc = FDC(drive);
 #ifdef FLOPPY_SANITY_CHECK
 	if (jiffies - UDRS->select_date < UDP->select_delay)
 		DPRINT("WARNING disk change called early\n");
 	if (!(FDCS->dor & (0x10 << UNIT(drive))) ||
-	    (FDCS->dor & 3) != UNIT(drive) ||
-	    fdc != FDC(drive)){
+	    (FDCS->dor & 3) != UNIT(drive) || fdc != FDC(drive)) {
 		DPRINT("probing disk change on unselected drive\n");
-		DPRINT("drive=%d fdc=%d dor=%x\n",drive, FDC(drive),
-			(unsigned int)FDCS->dor);
+		DPRINT("drive=%d fdc=%d dor=%x\n", drive, FDC(drive),
+		       (unsigned int)FDCS->dor);
 	}
 #endif
 
 #ifdef DCL_DEBUG
-	if (UDP->flags & FD_DEBUG){
-		DPRINT("checking disk change line for drive %d\n",drive);
+	if (UDP->flags & FD_DEBUG) {
+		DPRINT("checking disk change line for drive %d\n", drive);
 		DPRINT("jiffies=%lu\n", jiffies);
-		DPRINT("disk change line=%x\n",fd_inb(FD_DIR)&0x80);
-		DPRINT("flags=%lx\n",UDRS->flags);
+		DPRINT("disk change line=%x\n", fd_inb(FD_DIR) & 0x80);
+		DPRINT("flags=%lx\n", UDRS->flags);
 	}
 #endif
 	if (UDP->flags & FD_BROKEN_DCL)
 		return UTESTF(FD_DISK_CHANGED);
-	if ((fd_inb(FD_DIR) ^ UDP->flags) & 0x80){
-		USETF(FD_VERIFY); /* verify write protection */
-		if (UDRS->maxblock){
+	if ((fd_inb(FD_DIR) ^ UDP->flags) & 0x80) {
+		USETF(FD_VERIFY);	/* verify write protection */
+		if (UDRS->maxblock) {
 			/* mark it changed */
 			USETF(FD_DISK_CHANGED);
 		}
@@ -776,10 +773,10 @@ static int disk_change(int drive)
 			floppy_sizes[TOMINOR(drive)] = MAX_DISK_SIZE << 1;
 		}
 
-		/*USETF(FD_DISK_NEWCHANGE);*/
+		/*USETF(FD_DISK_NEWCHANGE); */
 		return 1;
 	} else {
-		UDRS->last_checked=jiffies;
+		UDRS->last_checked = jiffies;
 		UCLEARF(FD_DISK_NEWCHANGE);
 	}
 	return 0;
@@ -787,24 +784,24 @@ static int disk_change(int drive)
 
 static inline int is_selected(int dor, int unit)
 {
-	return ((dor  & (0x10 << unit)) && (dor &3) == unit);
+	return ((dor & (0x10 << unit)) && (dor & 3) == unit);
 }
 
 static int set_dor(int fdc, char mask, char data)
 {
-	register unsigned char drive, unit, newdor,olddor;
+	register unsigned char drive, unit, newdor, olddor;
 
 	if (FDCS->address == -1)
 		return -1;
 
 	olddor = FDCS->dor;
-	newdor =  (olddor & mask) | data;
-	if (newdor != olddor){
+	newdor = (olddor & mask) | data;
+	if (newdor != olddor) {
 		unit = olddor & 0x3;
-		if (is_selected(olddor, unit) && !is_selected(newdor,unit)){
-			drive = REVDRIVE(fdc,unit);
+		if (is_selected(olddor, unit) && !is_selected(newdor, unit)) {
+			drive = REVDRIVE(fdc, unit);
 #ifdef DCL_DEBUG
-			if (UDP->flags & FD_DEBUG){
+			if (UDP->flags & FD_DEBUG) {
 				DPRINT("calling disk change from set_dor\n");
 			}
 #endif
@@ -814,15 +811,15 @@ static int set_dor(int fdc, char mask, c
 		fd_outb(newdor, FD_DOR);
 
 		unit = newdor & 0x3;
-		if (!is_selected(olddor, unit) && is_selected(newdor,unit)){
-			drive = REVDRIVE(fdc,unit);
+		if (!is_selected(olddor, unit) && is_selected(newdor, unit)) {
+			drive = REVDRIVE(fdc, unit);
 			UDRS->select_date = jiffies;
 		}
 	}
 	/*
-	 *	We should propagate failures to grab the resources back
-	 *	nicely from here. Actually we ought to rewrite the fd
-	 *	driver some day too.
+	 *      We should propagate failures to grab the resources back
+	 *      nicely from here. Actually we ought to rewrite the fd
+	 *      driver some day too.
 	 */
 	if (newdor & FLOPPY_MOTOR_MASK)
 		floppy_grab_irq_and_dma();
@@ -835,7 +832,7 @@ static void twaddle(void)
 {
 	if (DP->select_delay)
 		return;
-	fd_outb(FDCS->dor & ~(0x10<<UNIT(current_drive)), FD_DOR);
+	fd_outb(FDCS->dor & ~(0x10 << UNIT(current_drive)), FD_DOR);
 	fd_outb(FDCS->dor, FD_DOR);
 	DRS->select_date = jiffies;
 }
@@ -851,15 +848,14 @@ static void reset_fdc_info(int mode)
 	FDCS->perp_mode = 1;
 	FDCS->rawcmd = 0;
 	for (drive = 0; drive < N_DRIVE; drive++)
-		if (FDC(drive) == fdc &&
-		    (mode || UDRS->track != NEED_1_RECAL))
+		if (FDC(drive) == fdc && (mode || UDRS->track != NEED_1_RECAL))
 			UDRS->track = NEED_2_RECAL;
 }
 
 /* selects the fdc and drive, and enables the fdc's input/dma. */
 static void set_fdc(int drive)
 {
-	if (drive >= 0 && drive < N_DRIVE){
+	if (drive >= 0 && drive < N_DRIVE) {
 		fdc = FDC(drive);
 		current_drive = drive;
 	}
@@ -867,9 +863,9 @@ static void set_fdc(int drive)
 		printk("bad fdc value\n");
 		return;
 	}
-	set_dor(fdc,~0,8);
+	set_dor(fdc, ~0, 8);
 #if N_FDC > 1
-	set_dor(1-fdc, ~8, 0);
+	set_dor(1 - fdc, ~8, 0);
 #endif
 	if (FDCS->rawcmd == 2)
 		reset_fdc_info(1);
@@ -880,11 +876,13 @@ static void set_fdc(int drive)
 /* locks the driver */
 static int _lock_fdc(int drive, int interruptible, int line)
 {
-	if (!usage_count){
-		printk(KERN_ERR "Trying to lock fdc while usage count=0 at line %d\n", line);
+	if (!usage_count) {
+		printk(KERN_ERR
+		       "Trying to lock fdc while usage count=0 at line %d\n",
+		       line);
 		return -1;
 	}
-	if(floppy_grab_irq_and_dma()==-1)
+	if (floppy_grab_irq_and_dma() == -1)
 		return -EBUSY;
 
 	if (test_and_set_bit(0, &fdc_busy)) {
@@ -920,7 +918,6 @@ static int _lock_fdc(int drive, int inte
 #define LOCK_FDC(drive,interruptible) \
 if (lock_fdc(drive,interruptible)) return -EINTR;
 
-
 /* unlocks the driver */
 static inline void unlock_fdc(void)
 {
@@ -932,7 +929,7 @@ static inline void unlock_fdc(void)
 
 	if (do_floppy)
 		DPRINT("device interrupt still active at FDC release: %p!\n",
-			do_floppy);
+		       do_floppy);
 	command_status = FD_COMMAND_NONE;
 	spin_lock_irqsave(&floppy_lock, flags);
 	del_timer(&fd_timeout);
@@ -957,22 +954,23 @@ static void motor_off_callback(unsigned 
 static void floppy_off(unsigned int drive)
 {
 	unsigned long volatile delta;
-	register int fdc=FDC(drive);
+	register int fdc = FDC(drive);
 
 	if (!(FDCS->dor & (0x10 << UNIT(drive))))
 		return;
 
-	del_timer(motor_off_timer+drive);
+	del_timer(motor_off_timer + drive);
 
 	/* make spindle stop in a position which minimizes spinup time
 	 * next time */
-	if (UDP->rps){
+	if (UDP->rps) {
 		delta = jiffies - UDRS->first_read_date + HZ -
-			UDP->spindown_offset;
+		    UDP->spindown_offset;
 		delta = ((delta * UDP->rps) % HZ) / UDP->rps;
-		motor_off_timer[drive].expires = jiffies + UDP->spindown - delta;
+		motor_off_timer[drive].expires =
+		    jiffies + UDP->spindown - delta;
 	}
-	add_timer(motor_off_timer+drive);
+	add_timer(motor_off_timer + drive);
 }
 
 /*
@@ -988,10 +986,10 @@ static void scandrives(void)
 		return;
 
 	saved_drive = current_drive;
-	for (i=0; i < N_DRIVE; i++){
+	for (i = 0; i < N_DRIVE; i++) {
 		drive = (saved_drive + i + 1) % N_DRIVE;
 		if (UDRS->fd_ref == 0 || UDP->select_delay != 0)
-			continue; /* skip closed drives */
+			continue;	/* skip closed drives */
 		set_fdc(drive);
 		if (!(set_dor(fdc, ~3, UNIT(drive) | (0x10 << UNIT(drive))) &
 		      (0x10 << UNIT(drive))))
@@ -1022,7 +1020,7 @@ static void cancel_activity(void)
 
 	spin_lock_irqsave(&floppy_lock, flags);
 	do_floppy = NULL;
-	PREPARE_WORK(&floppy_work, (void*)empty, NULL);
+	PREPARE_WORK(&floppy_work, (void *)empty, NULL);
 	del_timer(&fd_timer);
 	spin_unlock_irqrestore(&floppy_lock, flags);
 }
@@ -1032,12 +1030,12 @@ static void cancel_activity(void)
 static void fd_watchdog(void)
 {
 #ifdef DCL_DEBUG
-	if (DP->flags & FD_DEBUG){
+	if (DP->flags & FD_DEBUG) {
 		DPRINT("calling disk change from watchdog\n");
 	}
 #endif
 
-	if (disk_change(current_drive)){
+	if (disk_change(current_drive)) {
 		DPRINT("disk removed during i/o\n");
 		cancel_activity();
 		cont->done(0);
@@ -1059,14 +1057,14 @@ static void main_command_interrupt(void)
 /* waits for a delay (spinup or select) to pass */
 static int fd_wait_for_completion(unsigned long delay, timeout_fn function)
 {
-	if (FDCS->reset){
-		reset_fdc(); /* do the reset during sleep to win time
-			      * if we don't need to sleep, it's a good
-			      * occasion anyways */
+	if (FDCS->reset) {
+		reset_fdc();	/* do the reset during sleep to win time
+				 * if we don't need to sleep, it's a good
+				 * occasion anyways */
 		return 1;
 	}
 
-	if ((signed) (jiffies - delay) < 0){
+	if ((signed)(jiffies - delay) < 0) {
 		del_timer(&fd_timer);
 		fd_timer.function = function;
 		fd_timer.expires = delay;
@@ -1084,7 +1082,7 @@ static void floppy_disable_hlt(void)
 
 	spin_lock_irqsave(&floppy_hlt_lock, flags);
 	if (!hlt_disabled) {
-		hlt_disabled=1;
+		hlt_disabled = 1;
 #ifdef HAVE_DISABLE_HLT
 		disable_hlt();
 #endif
@@ -1097,8 +1095,8 @@ static void floppy_enable_hlt(void)
 	unsigned long flags;
 
 	spin_lock_irqsave(&floppy_hlt_lock, flags);
-	if (hlt_disabled){
-		hlt_disabled=0;
+	if (hlt_disabled) {
+		hlt_disabled = 0;
 #ifdef HAVE_DISABLE_HLT
 		enable_hlt();
 #endif
@@ -1106,47 +1104,45 @@ static void floppy_enable_hlt(void)
 	spin_unlock_irqrestore(&floppy_hlt_lock, flags);
 }
 
-
 static void setup_DMA(void)
 {
 	unsigned long f;
 
 #ifdef FLOPPY_SANITY_CHECK
-	if (raw_cmd->length == 0){
+	if (raw_cmd->length == 0) {
 		int i;
 
 		printk("zero dma transfer size:");
-		for (i=0; i < raw_cmd->cmd_count; i++)
+		for (i = 0; i < raw_cmd->cmd_count; i++)
 			printk("%x,", raw_cmd->cmd[i]);
 		printk("\n");
 		cont->done(0);
 		FDCS->reset = 1;
 		return;
 	}
-	if (((unsigned long) raw_cmd->kernel_data) % 512){
+	if (((unsigned long)raw_cmd->kernel_data) % 512) {
 		printk("non aligned address: %p\n", raw_cmd->kernel_data);
 		cont->done(0);
-		FDCS->reset=1;
+		FDCS->reset = 1;
 		return;
 	}
 #endif
-	f=claim_dma_lock();
+	f = claim_dma_lock();
 	fd_disable_dma();
 #ifdef fd_dma_setup
-	if (fd_dma_setup(raw_cmd->kernel_data, raw_cmd->length, 
-			(raw_cmd->flags & FD_RAW_READ)?
-			DMA_MODE_READ : DMA_MODE_WRITE,
-			FDCS->address) < 0) {
+	if (fd_dma_setup(raw_cmd->kernel_data, raw_cmd->length,
+			 (raw_cmd->flags & FD_RAW_READ) ?
+			 DMA_MODE_READ : DMA_MODE_WRITE, FDCS->address) < 0) {
 		release_dma_lock(f);
 		cont->done(0);
-		FDCS->reset=1;
+		FDCS->reset = 1;
 		return;
 	}
 	release_dma_lock(f);
-#else	
+#else
 	fd_clear_dma_ff();
 	fd_cacheflush(raw_cmd->kernel_data, raw_cmd->length);
-	fd_set_dma_mode((raw_cmd->flags & FD_RAW_READ)?
+	fd_set_dma_mode((raw_cmd->flags & FD_RAW_READ) ?
 			DMA_MODE_READ : DMA_MODE_WRITE);
 	fd_set_dma_addr(raw_cmd->kernel_data);
 	fd_set_dma_count(raw_cmd->length);
@@ -1166,13 +1162,12 @@ static int wait_til_ready(void)
 	if (FDCS->reset)
 		return -1;
 	for (counter = 0; counter < 10000; counter++) {
-		status = fd_inb(FD_STATUS);		
+		status = fd_inb(FD_STATUS);
 		if (status & STATUS_READY)
 			return status;
 	}
 	if (!initialising) {
-		DPRINT("Getstatus times out (%x) on fdc %d\n",
-			status, fdc);
+		DPRINT("Getstatus times out (%x) on fdc %d\n", status, fdc);
 		show_floppy();
 	}
 	FDCS->reset = 1;
@@ -1186,8 +1181,8 @@ static int output_byte(char byte)
 
 	if ((status = wait_til_ready()) < 0)
 		return -1;
-	if ((status & (STATUS_READY|STATUS_DIR|STATUS_DMA)) == STATUS_READY){
-		fd_outb(byte,FD_DATA);
+	if ((status & (STATUS_READY | STATUS_DIR | STATUS_DMA)) == STATUS_READY) {
+		fd_outb(byte, FD_DATA);
 #ifdef FLOPPY_SANITY_CHECK
 		output_log[output_log_pos].data = byte;
 		output_log[output_log_pos].status = status;
@@ -1204,32 +1199,34 @@ static int output_byte(char byte)
 	}
 	return -1;
 }
+
 #define LAST_OUT(x) if (output_byte(x)<0){ reset_fdc();return;}
 
 /* gets the response from the fdc */
 static int result(void)
 {
-	int i, status=0;
+	int i, status = 0;
 
-	for(i=0; i < MAX_REPLIES; i++) {
+	for (i = 0; i < MAX_REPLIES; i++) {
 		if ((status = wait_til_ready()) < 0)
 			break;
-		status &= STATUS_DIR|STATUS_READY|STATUS_BUSY|STATUS_DMA;
-		if ((status & ~STATUS_BUSY) == STATUS_READY){
+		status &= STATUS_DIR | STATUS_READY | STATUS_BUSY | STATUS_DMA;
+		if ((status & ~STATUS_BUSY) == STATUS_READY) {
 #ifdef FLOPPY_SANITY_CHECK
 			resultjiffies = jiffies;
 			resultsize = i;
 #endif
 			return i;
 		}
-		if (status == (STATUS_DIR|STATUS_READY|STATUS_BUSY))
+		if (status == (STATUS_DIR | STATUS_READY | STATUS_BUSY))
 			reply_buffer[i] = fd_inb(FD_DATA);
 		else
 			break;
 	}
 	if (!initialising) {
-		DPRINT("get result error. Fdc=%d Last status=%x Read bytes=%d\n",
-		       fdc, status, i);
+		DPRINT
+		    ("get result error. Fdc=%d Last status=%x Read bytes=%d\n",
+		     fdc, status, i);
 		show_floppy();
 	}
 	FDCS->reset = 1;
@@ -1243,7 +1240,7 @@ static int need_more_output(void)
 	int status;
 	if ((status = wait_til_ready()) < 0)
 		return -1;
-	if ((status & (STATUS_READY|STATUS_DIR|STATUS_DMA)) == STATUS_READY)
+	if ((status & (STATUS_READY | STATUS_DIR | STATUS_DMA)) == STATUS_READY)
 		return MORE_OUTPUT;
 	return result();
 }
@@ -1255,21 +1252,21 @@ static inline void perpendicular_mode(vo
 {
 	unsigned char perp_mode;
 
-	if (raw_cmd->rate & 0x40){
-		switch(raw_cmd->rate & 3){
-			case 0:
-				perp_mode=2;
-				break;
-			case 3:
-				perp_mode=3;
-				break;
-			default:
-				DPRINT("Invalid data rate for perpendicular mode!\n");
-				cont->done(0);
-				FDCS->reset = 1; /* convenient way to return to
-						  * redo without to much hassle (deep
-						  * stack et al. */
-				return;
+	if (raw_cmd->rate & 0x40) {
+		switch (raw_cmd->rate & 3) {
+		case 0:
+			perp_mode = 2;
+			break;
+		case 3:
+			perp_mode = 3;
+			break;
+		default:
+			DPRINT("Invalid data rate for perpendicular mode!\n");
+			cont->done(0);
+			FDCS->reset = 1;	/* convenient way to return to
+						 * redo without to much hassle (deep
+						 * stack et al. */
+			return;
 		}
 	} else
 		perp_mode = 0;
@@ -1283,7 +1280,7 @@ static inline void perpendicular_mode(vo
 	} else if (perp_mode) {
 		DPRINT("perpendicular mode not supported by this FDC.\n");
 	}
-} /* perpendicular_mode */
+}				/* perpendicular_mode */
 
 static int fifo_depth = 0xa;
 static int no_fifo;
@@ -1296,10 +1293,10 @@ static int fdc_configure(void)
 		return 0;
 	output_byte(0);
 	output_byte(0x10 | (no_fifo & 0x20) | (fifo_depth & 0xf));
-	output_byte(0);	/* pre-compensation from track 
-			   0 upwards */
+	output_byte(0);		/* pre-compensation from track
+				   0 upwards */
 	return 1;
-}	
+}
 
 #define NOMINAL_DTR 500
 
@@ -1334,51 +1331,51 @@ static void fdc_specify(void)
 	if (FDCS->need_configure && FDCS->version >= FDC_82072A) {
 		fdc_configure();
 		FDCS->need_configure = 0;
-		/*DPRINT("FIFO enabled\n");*/
+		/*DPRINT("FIFO enabled\n"); */
 	}
 
 	switch (raw_cmd->rate & 0x03) {
-		case 3:
-			dtr = 1000;
-			break;
-		case 1:
-			dtr = 300;
-			if (FDCS->version >= FDC_82078) {
-				/* chose the default rate table, not the one
-				 * where 1 = 2 Mbps */
-				output_byte(FD_DRIVESPEC);
-				if (need_more_output() == MORE_OUTPUT) {
-					output_byte(UNIT(current_drive));
-					output_byte(0xc0);
-				}
+	case 3:
+		dtr = 1000;
+		break;
+	case 1:
+		dtr = 300;
+		if (FDCS->version >= FDC_82078) {
+			/* chose the default rate table, not the one
+			 * where 1 = 2 Mbps */
+			output_byte(FD_DRIVESPEC);
+			if (need_more_output() == MORE_OUTPUT) {
+				output_byte(UNIT(current_drive));
+				output_byte(0xc0);
 			}
-			break;
-		case 2:
-			dtr = 250;
-			break;
+		}
+		break;
+	case 2:
+		dtr = 250;
+		break;
 	}
 
 	if (FDCS->version >= FDC_82072) {
 		scale_dtr = dtr;
-		hlt_max_code = 0x00; /* 0==256msec*dtr0/dtr (not linear!) */
-		hut_max_code = 0x0; /* 0==256msec*dtr0/dtr (not linear!) */
+		hlt_max_code = 0x00;	/* 0==256msec*dtr0/dtr (not linear!) */
+		hut_max_code = 0x0;	/* 0==256msec*dtr0/dtr (not linear!) */
 	}
 
 	/* Convert step rate from microseconds to milliseconds and 4 bits */
-	srt = 16 - (DP->srt*scale_dtr/1000 + NOMINAL_DTR - 1)/NOMINAL_DTR;
-	if( slow_floppy ) {
+	srt = 16 - (DP->srt * scale_dtr / 1000 + NOMINAL_DTR - 1) / NOMINAL_DTR;
+	if (slow_floppy) {
 		srt = srt / 4;
 	}
 	SUPBOUND(srt, 0xf);
 	INFBOUND(srt, 0);
 
-	hlt = (DP->hlt*scale_dtr/2 + NOMINAL_DTR - 1)/NOMINAL_DTR;
+	hlt = (DP->hlt * scale_dtr / 2 + NOMINAL_DTR - 1) / NOMINAL_DTR;
 	if (hlt < 0x01)
 		hlt = 0x01;
 	else if (hlt > 0x7f)
 		hlt = hlt_max_code;
 
-	hut = (DP->hut*scale_dtr/16 + NOMINAL_DTR - 1)/NOMINAL_DTR;
+	hut = (DP->hut * scale_dtr / 16 + NOMINAL_DTR - 1) / NOMINAL_DTR;
 	if (hut < 0x1)
 		hut = 0x1;
 	else if (hut > 0xf)
@@ -1394,7 +1391,7 @@ static void fdc_specify(void)
 		output_byte(FDCS->spec1 = spec1);
 		output_byte(FDCS->spec2 = spec2);
 	}
-} /* fdc_specify */
+}				/* fdc_specify */
 
 /* Set the FDC's data transfer rate on behalf of the specified drive.
  * NOTE: with 82072/82077 FDCs, changing the data rate requires a reissue
@@ -1415,16 +1412,15 @@ static int fdc_dtr(void)
 	 * Pause 5 msec to avoid trouble. (Needs to be 2 jiffies)
 	 */
 	FDCS->dtr = raw_cmd->rate & 3;
-	return(fd_wait_for_completion(jiffies+2UL*HZ/100,
-				   (timeout_fn) floppy_ready));
-} /* fdc_dtr */
+	return (fd_wait_for_completion(jiffies + 2UL * HZ / 100,
+				       (timeout_fn) floppy_ready));
+}				/* fdc_dtr */
 
 static void tell_sector(void)
 {
 	printk(": track %d, head %d, sector %d, size %d",
 	       R_TRACK, R_HEAD, R_SECTOR, R_SIZECODE);
-} /* tell_sector */
-
+}				/* tell_sector */
 
 /*
  * OK, this error interpreting routine is called after a
@@ -1437,7 +1433,7 @@ static int interpret_errors(void)
 {
 	char bad;
 
-	if (inr!=7) {
+	if (inr != 7) {
 		DPRINT("-- FDC reply error");
 		FDCS->reset = 1;
 		return 1;
@@ -1445,62 +1441,65 @@ static int interpret_errors(void)
 
 	/* check IC to find cause of interrupt */
 	switch (ST0 & ST0_INTR) {
-		case 0x40:	/* error occurred during command execution */
-			if (ST1 & ST1_EOC)
-				return 0; /* occurs with pseudo-DMA */
-			bad = 1;
-			if (ST1 & ST1_WP) {
-				DPRINT("Drive is write protected\n");
-				CLEARF(FD_DISK_WRITABLE);
-				cont->done(0);
-				bad = 2;
-			} else if (ST1 & ST1_ND) {
-				SETF(FD_NEED_TWADDLE);
-			} else if (ST1 & ST1_OR) {
-				if (DP->flags & FTD_MSG)
-					DPRINT("Over/Underrun - retrying\n");
-				bad = 0;
-			}else if (*errors >= DP->max_errors.reporting){
-				DPRINT("");
-				if (ST0 & ST0_ECE) {
-					printk("Recalibrate failed!");
-				} else if (ST2 & ST2_CRC) {
-					printk("data CRC error");
-					tell_sector();
-				} else if (ST1 & ST1_CRC) {
-					printk("CRC error");
-					tell_sector();
-				} else if ((ST1 & (ST1_MAM|ST1_ND)) || (ST2 & ST2_MAM)) {
-					if (!probing) {
-						printk("sector not found");
-						tell_sector();
-					} else
-						printk("probe failed...");
-				} else if (ST2 & ST2_WC) {	/* seek error */
-					printk("wrong cylinder");
-				} else if (ST2 & ST2_BC) {	/* cylinder marked as bad */
-					printk("bad cylinder");
-				} else {
-					printk("unknown error. ST[0..2] are: 0x%x 0x%x 0x%x", ST0, ST1, ST2);
+	case 0x40:		/* error occurred during command execution */
+		if (ST1 & ST1_EOC)
+			return 0;	/* occurs with pseudo-DMA */
+		bad = 1;
+		if (ST1 & ST1_WP) {
+			DPRINT("Drive is write protected\n");
+			CLEARF(FD_DISK_WRITABLE);
+			cont->done(0);
+			bad = 2;
+		} else if (ST1 & ST1_ND) {
+			SETF(FD_NEED_TWADDLE);
+		} else if (ST1 & ST1_OR) {
+			if (DP->flags & FTD_MSG)
+				DPRINT("Over/Underrun - retrying\n");
+			bad = 0;
+		} else if (*errors >= DP->max_errors.reporting) {
+			DPRINT("");
+			if (ST0 & ST0_ECE) {
+				printk("Recalibrate failed!");
+			} else if (ST2 & ST2_CRC) {
+				printk("data CRC error");
+				tell_sector();
+			} else if (ST1 & ST1_CRC) {
+				printk("CRC error");
+				tell_sector();
+			} else if ((ST1 & (ST1_MAM | ST1_ND))
+				   || (ST2 & ST2_MAM)) {
+				if (!probing) {
+					printk("sector not found");
 					tell_sector();
-				}
-				printk("\n");
-
+				} else
+					printk("probe failed...");
+			} else if (ST2 & ST2_WC) {	/* seek error */
+				printk("wrong cylinder");
+			} else if (ST2 & ST2_BC) {	/* cylinder marked as bad */
+				printk("bad cylinder");
+			} else {
+				printk
+				    ("unknown error. ST[0..2] are: 0x%x 0x%x 0x%x",
+				     ST0, ST1, ST2);
+				tell_sector();
 			}
-			if (ST2 & ST2_WC || ST2 & ST2_BC)
-				/* wrong cylinder => recal */
-				DRS->track = NEED_2_RECAL;
-			return bad;
-		case 0x80: /* invalid command given */
-			DPRINT("Invalid FDC command given!\n");
-			cont->done(0);
-			return 2;
-		case 0xc0:
-			DPRINT("Abnormal termination caused by polling\n");
-			cont->error();
-			return 2;
-		default: /* (0) Normal command termination */
-			return 0;
+			printk("\n");
+
+		}
+		if (ST2 & ST2_WC || ST2 & ST2_BC)
+			/* wrong cylinder => recal */
+			DRS->track = NEED_2_RECAL;
+		return bad;
+	case 0x80:		/* invalid command given */
+		DPRINT("Invalid FDC command given!\n");
+		cont->done(0);
+		return 2;
+	case 0xc0:
+		DPRINT("Abnormal termination caused by polling\n");
+		cont->error();
+		return 2;
+	default:		/* (0) Normal command termination */
+		return 0;
 	}
 }
 
@@ -1511,7 +1510,7 @@ static int interpret_errors(void)
  */
 static void setup_rw_floppy(void)
 {
-	int i,r, flags,dflags;
+	int i, r, flags, dflags;
 	unsigned long ready_date;
 	timeout_fn function;
 
@@ -1519,20 +1518,20 @@ static void setup_rw_floppy(void)
 	if (flags & (FD_RAW_READ | FD_RAW_WRITE))
 		flags |= FD_RAW_INTR;
 
-	if ((flags & FD_RAW_SPIN) && !(flags & FD_RAW_NO_MOTOR)){
+	if ((flags & FD_RAW_SPIN) && !(flags & FD_RAW_NO_MOTOR)) {
 		ready_date = DRS->spinup_date + DP->spinup;
 		/* If spinup will take a long time, rerun scandrives
 		 * again just before spinup completion. Beware that
 		 * after scandrives, we must again wait for selection.
 		 */
-		if ((signed) (ready_date - jiffies) > DP->select_delay){
+		if ((signed)(ready_date - jiffies) > DP->select_delay) {
 			ready_date -= DP->select_delay;
 			function = (timeout_fn) floppy_start;
 		} else
 			function = (timeout_fn) setup_rw_floppy;
 
 		/* wait until the floppy is spinning fast enough */
-		if (fd_wait_for_completion(ready_date,function))
+		if (fd_wait_for_completion(ready_date, function))
 			return;
 	}
 	dflags = DRS->flags;
@@ -1543,20 +1542,20 @@ static void setup_rw_floppy(void)
 	if (flags & FD_RAW_INTR)
 		do_floppy = main_command_interrupt;
 
-	r=0;
-	for (i=0; i< raw_cmd->cmd_count; i++)
-		r|=output_byte(raw_cmd->cmd[i]);
+	r = 0;
+	for (i = 0; i < raw_cmd->cmd_count; i++)
+		r |= output_byte(raw_cmd->cmd[i]);
 
 #ifdef DEBUGT
 	debugt("rw_command: ");
 #endif
-	if (r){
+	if (r) {
 		cont->error();
 		reset_fdc();
 		return;
 	}
 
-	if (!(flags & FD_RAW_INTR)){
+	if (!(flags & FD_RAW_INTR)) {
 		inr = result();
 		cont->interrupt();
 	} else if (flags & FD_RAW_NEED_DISK)
@@ -1581,14 +1580,15 @@ static void seek_interrupt(void)
 		cont->redo();
 		return;
 	}
-	if (DRS->track >= 0 && DRS->track != ST1 && !blind_seek){
+	if (DRS->track >= 0 && DRS->track != ST1 && !blind_seek) {
 #ifdef DCL_DEBUG
-		if (DP->flags & FD_DEBUG){
-			DPRINT("clearing NEWCHANGE flag because of effective seek\n");
+		if (DP->flags & FD_DEBUG) {
+			DPRINT
+			    ("clearing NEWCHANGE flag because of effective seek\n");
 			DPRINT("jiffies=%lu\n", jiffies);
 		}
 #endif
-		CLEARF(FD_DISK_NEWCHANGE); /* effective seek */
+		CLEARF(FD_DISK_NEWCHANGE);	/* effective seek */
 		DRS->select_date = jiffies;
 	}
 	DRS->track = ST1;
@@ -1601,19 +1601,19 @@ static void check_wp(void)
 		/* check write protection */
 		output_byte(FD_GETSTATUS);
 		output_byte(UNIT(current_drive));
-		if (result() != 1){
+		if (result() != 1) {
 			FDCS->reset = 1;
 			return;
 		}
 		CLEARF(FD_VERIFY);
 		CLEARF(FD_NEED_TWADDLE);
 #ifdef DCL_DEBUG
-		if (DP->flags & FD_DEBUG){
+		if (DP->flags & FD_DEBUG) {
 			DPRINT("checking whether disk is write protected\n");
-			DPRINT("wp=%x\n",ST3 & 0x40);
+			DPRINT("wp=%x\n", ST3 & 0x40);
 		}
 #endif
-		if (!(ST3  & 0x40))
+		if (!(ST3 & 0x40))
 			SETF(FD_DISK_WRITABLE);
 		else
 			CLEARF(FD_DISK_WRITABLE);
@@ -1624,17 +1624,16 @@ static void seek_floppy(void)
 {
 	int track;
 
-	blind_seek=0;
+	blind_seek = 0;
 
 #ifdef DCL_DEBUG
-	if (DP->flags & FD_DEBUG){
+	if (DP->flags & FD_DEBUG) {
 		DPRINT("calling disk change from seek\n");
 	}
 #endif
 
 	if (!TESTF(FD_DISK_NEWCHANGE) &&
-	    disk_change(current_drive) &&
-	    (raw_cmd->flags & FD_RAW_NEED_DISK)){
+	    disk_change(current_drive) && (raw_cmd->flags & FD_RAW_NEED_DISK)) {
 		/* the media changed flag should be cleared after the seek.
 		 * If it isn't, this means that there is really no disk in
 		 * the drive.
@@ -1644,7 +1643,7 @@ static void seek_floppy(void)
 		cont->redo();
 		return;
 	}
-	if (DRS->track <= NEED_1_RECAL){
+	if (DRS->track <= NEED_1_RECAL) {
 		recalibrate_floppy();
 		return;
 	} else if (TESTF(FD_DISK_NEWCHANGE) &&
@@ -1655,7 +1654,7 @@ static void seek_floppy(void)
 		if (raw_cmd->track)
 			track = raw_cmd->track - 1;
 		else {
-			if (DP->flags & FD_SILENT_DCL_CLEAR){
+			if (DP->flags & FD_SILENT_DCL_CLEAR) {
 				set_dor(fdc, ~(0x10 << UNIT(current_drive)), 0);
 				blind_seek = 1;
 				raw_cmd->flags |= FD_RAW_NEED_SEEK;
@@ -1687,52 +1686,53 @@ static void recal_interrupt(void)
 #ifdef DEBUGT
 	debugt("recal interrupt:");
 #endif
-	if (inr !=2)
+	if (inr != 2)
 		FDCS->reset = 1;
 	else if (ST0 & ST0_ECE) {
-	       	switch(DRS->track){
-			case NEED_1_RECAL:
+		switch (DRS->track) {
+		case NEED_1_RECAL:
 #ifdef DEBUGT
-				debugt("recal interrupt need 1 recal:");
+			debugt("recal interrupt need 1 recal:");
 #endif
-				/* after a second recalibrate, we still haven't
-				 * reached track 0. Probably no drive. Raise an
-				 * error, as failing immediately might upset
-				 * computers possessed by the Devil :-) */
-				cont->error();
-				cont->redo();
-				return;
-			case NEED_2_RECAL:
+			/* after a second recalibrate, we still haven't
+			 * reached track 0. Probably no drive. Raise an
+			 * error, as failing immediately might upset
+			 * computers possessed by the Devil :-) */
+			cont->error();
+			cont->redo();
+			return;
+		case NEED_2_RECAL:
 #ifdef DEBUGT
-				debugt("recal interrupt need 2 recal:");
+			debugt("recal interrupt need 2 recal:");
 #endif
-				/* If we already did a recalibrate,
-				 * and we are not at track 0, this
-				 * means we have moved. (The only way
-				 * not to move at recalibration is to
-				 * be already at track 0.) Clear the
-				 * new change flag */
+			/* If we already did a recalibrate,
+			 * and we are not at track 0, this
+			 * means we have moved. (The only way
+			 * not to move at recalibration is to
+			 * be already at track 0.) Clear the
+			 * new change flag */
 #ifdef DCL_DEBUG
-				if (DP->flags & FD_DEBUG){
-					DPRINT("clearing NEWCHANGE flag because of second recalibrate\n");
-				}
+			if (DP->flags & FD_DEBUG) {
+				DPRINT
+				    ("clearing NEWCHANGE flag because of second recalibrate\n");
+			}
 #endif
 
-				CLEARF(FD_DISK_NEWCHANGE);
-				DRS->select_date = jiffies;
-				/* fall through */
-			default:
+			CLEARF(FD_DISK_NEWCHANGE);
+			DRS->select_date = jiffies;
+			/* fall through */
+		default:
 #ifdef DEBUGT
-				debugt("recal interrupt default:");
+			debugt("recal interrupt default:");
 #endif
-				/* Recalibrate moves the head by at
-				 * most 80 steps. If after one
-				 * recalibrate we don't have reached
-				 * track 0, this might mean that we
-				 * started beyond track 80.  Try
-				 * again.  */
-				DRS->track = NEED_1_RECAL;
-				break;
+			/* Recalibrate moves the head by at
+			 * most 80 steps. If after one
+			 * recalibrate we don't have reached
+			 * track 0, this might mean that we
+			 * started beyond track 80.  Try
+			 * again.  */
+			DRS->track = NEED_1_RECAL;
+			break;
 		}
 	} else
 		DRS->track = ST1;
@@ -1745,31 +1745,31 @@ static void print_result(char *message, 
 
 	DPRINT("%s ", message);
 	if (inr >= 0)
-		for (i=0; i<inr; i++)
+		for (i = 0; i < inr; i++)
 			printk("repl[%d]=%x ", i, reply_buffer[i]);
 	printk("\n");
 }
 
 /* interrupt handler. Note that this can be called externally on the Sparc */
-irqreturn_t floppy_interrupt(int irq, void *dev_id, struct pt_regs * regs)
+irqreturn_t floppy_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
-	void (*handler)(void) = do_floppy;
+	void (*handler) (void) = do_floppy;
 	int do_print;
 	unsigned long f;
 
 	lasthandler = handler;
 	interruptjiffies = jiffies;
 
-	f=claim_dma_lock();
+	f = claim_dma_lock();
 	fd_disable_dma();
 	release_dma_lock(f);
 
 	floppy_enable_hlt();
 	do_floppy = NULL;
-	if (fdc >= N_FDC || FDCS->address == -1){
+	if (fdc >= N_FDC || FDCS->address == -1) {
 		/* we don't even know which FDC is the culprit */
 		printk("DOR0=%x\n", fdc_state[0].dor);
-		printk("floppy interrupt on bizarre fdc %d\n",fdc);
+		printk("floppy interrupt on bizarre fdc %d\n", fdc);
 		printk("handler=%p\n", handler);
 		is_alive("bizarre fdc");
 		return IRQ_NONE;
@@ -1790,7 +1790,7 @@ irqreturn_t floppy_interrupt(int irq, vo
 	inr = result();
 	if (do_print)
 		print_result("unexpected interrupt", inr);
-	if (inr == 0){
+	if (inr == 0) {
 		int max_sensei = 4;
 		do {
 			output_byte(FD_SENSEI);
@@ -1798,7 +1798,8 @@ irqreturn_t floppy_interrupt(int irq, vo
 			if (do_print)
 				print_result("sensei", inr);
 			max_sensei--;
-		} while ((ST0 & 0x83) != UNIT(current_drive) && inr == 2 && max_sensei);
+		} while ((ST0 & 0x83) != UNIT(current_drive) && inr == 2
+			 && max_sensei);
 	}
 	if (handler)
 		schedule_bh(handler);
@@ -1831,7 +1832,7 @@ static void reset_interrupt(void)
 	result();		/* get the status ready for set_fdc */
 	if (FDCS->reset) {
 		printk("reset set in interrupt, calling %p\n", cont->error);
-		cont->error(); /* a reset just after a reset. BAD! */
+		cont->error();	/* a reset just after a reset. BAD! */
 	}
 	cont->redo();
 }
@@ -1851,12 +1852,12 @@ static void reset_fdc(void)
 	/* Pseudo-DMA may intercept 'reset finished' interrupt.  */
 	/* Irrelevant for systems with true DMA (i386).          */
 
-	flags=claim_dma_lock();
+	flags = claim_dma_lock();
 	fd_disable_dma();
 	release_dma_lock(flags);
 
 	if (FDCS->version >= FDC_82072A)
-		fd_outb(0x80 | (FDCS->dtr &3), FD_STATUS);
+		fd_outb(0x80 | (FDCS->dtr & 3), FD_STATUS);
 	else {
 		fd_outb(FDCS->dor & ~0x04, FD_DOR);
 		udelay(FD_RESET_DELAY);
@@ -1872,20 +1873,20 @@ static void show_floppy(void)
 	printk("floppy driver state\n");
 	printk("-------------------\n");
 	printk("now=%lu last interrupt=%lu diff=%lu last called handler=%p\n",
-	       jiffies, interruptjiffies, jiffies-interruptjiffies, lasthandler);
-
+	       jiffies, interruptjiffies, jiffies - interruptjiffies,
+	       lasthandler);
 
 #ifdef FLOPPY_SANITY_CHECK
 	printk("timeout_message=%s\n", timeout_message);
 	printk("last output bytes:\n");
-	for (i=0; i < OLOGSIZE; i++)
+	for (i = 0; i < OLOGSIZE; i++)
 		printk("%2x %2x %lu\n",
-		       output_log[(i+output_log_pos) % OLOGSIZE].data,
-		       output_log[(i+output_log_pos) % OLOGSIZE].status,
-		       output_log[(i+output_log_pos) % OLOGSIZE].jiffies);
+		       output_log[(i + output_log_pos) % OLOGSIZE].data,
+		       output_log[(i + output_log_pos) % OLOGSIZE].status,
+		       output_log[(i + output_log_pos) % OLOGSIZE].jiffies);
 	printk("last result at %lu\n", resultjiffies);
 	printk("last redo_fd_request at %lu\n", lastredo);
-	for (i=0; i<resultsize; i++){
+	for (i = 0; i < resultsize; i++) {
 		printk("%2x ", reply_buffer[i]);
 	}
 	printk("\n");
@@ -1899,10 +1900,10 @@ static void show_floppy(void)
 		printk("floppy_work.func=%p\n", floppy_work.func);
 	if (timer_pending(&fd_timer))
 		printk("fd_timer.function=%p\n", fd_timer.function);
-	if (timer_pending(&fd_timeout)){
-		printk("timer_function=%p\n",fd_timeout.function);
-		printk("expires=%lu\n",fd_timeout.expires-jiffies);
-		printk("now=%lu\n",jiffies);
+	if (timer_pending(&fd_timeout)) {
+		printk("timer_function=%p\n", fd_timeout.function);
+		printk("expires=%lu\n", fd_timeout.expires - jiffies);
+		printk("now=%lu\n", jiffies);
 	}
 	printk("cont=%p\n", cont);
 	printk("current_req=%p\n", current_req);
@@ -1913,42 +1914,43 @@ static void show_floppy(void)
 static void floppy_shutdown(unsigned long data)
 {
 	unsigned long flags;
-	
+
 	if (!initialising)
 		show_floppy();
 	cancel_activity();
 
 	floppy_enable_hlt();
-	
-	flags=claim_dma_lock();
+
+	flags = claim_dma_lock();
 	fd_disable_dma();
 	release_dma_lock(flags);
-	
+
 	/* avoid dma going to a random drive after shutdown */
 
 	if (!initialising)
 		DPRINT("floppy timeout called\n");
 	FDCS->reset = 1;
-	if (cont){
+	if (cont) {
 		cont->done(0);
-		cont->redo(); /* this will recall reset when needed */
+		cont->redo();	/* this will recall reset when needed */
 	} else {
 		printk("no cont in shutdown!\n");
 		process_fd_request();
 	}
 	is_alive("floppy shutdown");
 }
+
 /*typedef void (*timeout_fn)(unsigned long);*/
 
 /* start motor, check media-changed condition and write protection */
-static int start_motor(void (*function)(void) )
+static int start_motor(void (*function) (void))
 {
 	int mask, data;
 
 	mask = 0xfc;
 	data = UNIT(current_drive);
-	if (!(raw_cmd->flags & FD_RAW_NO_MOTOR)){
-		if (!(FDCS->dor & (0x10 << UNIT(current_drive)))){
+	if (!(raw_cmd->flags & FD_RAW_NO_MOTOR)) {
+		if (!(FDCS->dor & (0x10 << UNIT(current_drive)))) {
 			set_debugt();
 			/* no read since this drive is running */
 			DRS->first_read_date = 0;
@@ -1956,53 +1958,50 @@ static int start_motor(void (*function)(
 			DRS->spinup_date = jiffies;
 			data |= (0x10 << UNIT(current_drive));
 		}
-	} else
-		if (FDCS->dor & (0x10 << UNIT(current_drive)))
-			mask &= ~(0x10 << UNIT(current_drive));
+	} else if (FDCS->dor & (0x10 << UNIT(current_drive)))
+		mask &= ~(0x10 << UNIT(current_drive));
 
 	/* starts motor and selects floppy */
 	del_timer(motor_off_timer + current_drive);
 	set_dor(fdc, mask, data);
 
 	/* wait_for_completion also schedules reset if needed. */
-	return(fd_wait_for_completion(DRS->select_date+DP->select_delay,
-				   (timeout_fn) function));
+	return (fd_wait_for_completion(DRS->select_date + DP->select_delay,
+				       (timeout_fn) function));
 }
 
 static void floppy_ready(void)
 {
 	CHECK_RESET;
-	if (start_motor(floppy_ready)) return;
-	if (fdc_dtr()) return;
+	if (start_motor(floppy_ready))
+		return;
+	if (fdc_dtr())
+		return;
 
 #ifdef DCL_DEBUG
-	if (DP->flags & FD_DEBUG){
+	if (DP->flags & FD_DEBUG) {
 		DPRINT("calling disk change from floppy_ready\n");
 	}
 #endif
 	if (!(raw_cmd->flags & FD_RAW_NO_MOTOR) &&
-	   disk_change(current_drive) &&
-	   !DP->select_delay)
-		twaddle(); /* this clears the dcl on certain drive/controller
-			    * combinations */
+	    disk_change(current_drive) && !DP->select_delay)
+		twaddle();	/* this clears the dcl on certain drive/controller
+				 * combinations */
 
 #ifdef fd_chose_dma_mode
-	if ((raw_cmd->flags & FD_RAW_READ) || 
-	    (raw_cmd->flags & FD_RAW_WRITE))
-	{
+	if ((raw_cmd->flags & FD_RAW_READ) || (raw_cmd->flags & FD_RAW_WRITE)) {
 		unsigned long flags = claim_dma_lock();
-		fd_chose_dma_mode(raw_cmd->kernel_data,
-				  raw_cmd->length);
+		fd_chose_dma_mode(raw_cmd->kernel_data, raw_cmd->length);
 		release_dma_lock(flags);
 	}
 #endif
 
-	if (raw_cmd->flags & (FD_RAW_NEED_SEEK | FD_RAW_NEED_DISK)){
+	if (raw_cmd->flags & (FD_RAW_NEED_SEEK | FD_RAW_NEED_DISK)) {
 		perpendicular_mode();
-		fdc_specify(); /* must be done here because of hut, hlt ... */
+		fdc_specify();	/* must be done here because of hut, hlt ... */
 		seek_floppy();
 	} else {
-		if ((raw_cmd->flags & FD_RAW_READ) || 
+		if ((raw_cmd->flags & FD_RAW_READ) ||
 		    (raw_cmd->flags & FD_RAW_WRITE))
 			fdc_specify();
 		setup_rw_floppy();
@@ -2015,7 +2014,7 @@ static void floppy_start(void)
 
 	scandrives();
 #ifdef DCL_DEBUG
-	if (DP->flags & FD_DEBUG){
+	if (DP->flags & FD_DEBUG) {
 		DPRINT("setting NEWCHANGE in floppy_start\n");
 	}
 #endif
@@ -2046,21 +2045,20 @@ static void do_wakeup(void)
 }
 
 static struct cont_t wakeup_cont = {
-	.interrupt = empty,
-	.redo = do_wakeup,
-	.error = empty,
-	.done = (done_f) empty
+	.interrupt	= empty,
+	.redo		= do_wakeup,
+	.error		= empty,
+	.done		= (done_f) empty
 };
 
-
 static struct cont_t intr_cont = {
-	.interrupt = empty,
-	.redo = process_fd_request,
-	.error = empty,
-	.done = (done_f) empty
+	.interrupt	= empty,
+	.redo		= process_fd_request,
+	.error		= empty,
+	.done		= (done_f) empty
 };
 
-static int wait_til_done(void (*handler)(void), int interruptible)
+static int wait_til_done(void (*handler) (void), int interruptible)
 {
 	int ret;
 
@@ -2071,8 +2069,8 @@ static int wait_til_done(void (*handler)
 
 		add_wait_queue(&command_done, &wait);
 		for (;;) {
-			set_current_state(interruptible?
-					  TASK_INTERRUPTIBLE:
+			set_current_state(interruptible ?
+					  TASK_INTERRUPTIBLE :
 					  TASK_UNINTERRUPTIBLE);
 
 			if (command_status >= 2 || !NO_SIGNAL)
@@ -2087,7 +2085,7 @@ static int wait_til_done(void (*handler)
 		remove_wait_queue(&command_done, &wait);
 	}
 
-	if (command_status < 2){
+	if (command_status < 2) {
 		cancel_activity();
 		cont = &intr_cont;
 		reset_fdc();
@@ -2097,9 +2095,9 @@ static int wait_til_done(void (*handler)
 	if (FDCS->reset)
 		command_status = FD_COMMAND_ERROR;
 	if (command_status == FD_COMMAND_OKAY)
-		ret=0;
+		ret = 0;
 	else
-		ret=-EIO;
+		ret = -EIO;
 	command_status = FD_COMMAND_NONE;
 	return ret;
 }
@@ -2126,7 +2124,6 @@ static void success_and_wakeup(void)
 	cont->redo();
 }
 
-
 /*
  * formatting and rw support.
  * ==========================
@@ -2137,13 +2134,12 @@ static int next_valid_format(void)
 	int probed_format;
 
 	probed_format = DRS->probed_format;
-	while(1){
-		if (probed_format >= 8 ||
-		     !DP->autodetect[probed_format]){
+	while (1) {
+		if (probed_format >= 8 || !DP->autodetect[probed_format]) {
 			DRS->probed_format = 0;
 			return 1;
 		}
-		if (floppy_type[DP->autodetect[probed_format]].sect){
+		if (floppy_type[DP->autodetect[probed_format]].sect) {
 			DRS->probed_format = probed_format;
 			return 0;
 		}
@@ -2155,7 +2151,7 @@ static void bad_flp_intr(void)
 {
 	int err_count;
 
-	if (probing){
+	if (probing) {
 		DRS->probed_format++;
 		if (!next_valid_format())
 			return;
@@ -2176,7 +2172,7 @@ static void set_floppy(int drive)
 	if (type)
 		_floppy = floppy_type + type;
 	else
-		_floppy = current_type[ drive ];
+		_floppy = current_type[drive];
 }
 
 /*
@@ -2185,13 +2181,13 @@ static void set_floppy(int drive)
  */
 static void format_interrupt(void)
 {
-	switch (interpret_errors()){
-		case 1:
-			cont->error();
-		case 2:
-			break;
-		case 0:
-			cont->done(1);
+	switch (interpret_errors()) {
+	case 1:
+		cont->error();
+	case 2:
+		break;
+	case 0:
+		cont->done(1);
 	}
 	cont->redo();
 }
@@ -2202,20 +2198,20 @@ static void format_interrupt(void)
 static void setup_format_params(int track)
 {
 	struct fparm {
-		unsigned char track,head,sect,size;
+		unsigned char track, head, sect, size;
 	} *here = (struct fparm *)floppy_track_buffer;
-	int il,n;
-	int count,head_shift,track_shift;
+	int il, n;
+	int count, head_shift, track_shift;
 
 	raw_cmd = &default_raw_cmd;
 	raw_cmd->track = track;
 
 	raw_cmd->flags = FD_RAW_WRITE | FD_RAW_INTR | FD_RAW_SPIN |
-		FD_RAW_NEED_DISK | FD_RAW_NEED_SEEK;
+	    FD_RAW_NEED_DISK | FD_RAW_NEED_SEEK;
 	raw_cmd->rate = _floppy->rate & 0x43;
 	raw_cmd->cmd_count = NR_F;
-	COMMAND = FM_MODE(_floppy,FD_FORMAT);
-	DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy,format_req.head);
+	COMMAND = FM_MODE(_floppy, FD_FORMAT);
+	DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, format_req.head);
 	F_SIZECODE = FD_SIZECODE(_floppy);
 	F_SECT_PER_TRACK = _floppy->sect << 2 >> F_SIZECODE;
 	F_GAP = _floppy->fmt_gap;
@@ -2225,14 +2221,14 @@ static void setup_format_params(int trac
 	raw_cmd->length = 4 * F_SECT_PER_TRACK;
 
 	/* allow for about 30ms for data transport per track */
-	head_shift  = (F_SECT_PER_TRACK + 5) / 6;
+	head_shift = (F_SECT_PER_TRACK + 5) / 6;
 
 	/* a ``cylinder'' is two tracks plus a little stepping time */
 	track_shift = 2 * head_shift + 3;
 
 	/* position of logical sector 1 on this track */
 	n = (track_shift * format_req.track + head_shift * format_req.head)
-		% F_SECT_PER_TRACK;
+	    % F_SECT_PER_TRACK;
 
 	/* determine interleave */
 	il = 1;
@@ -2249,15 +2245,20 @@ static void setup_format_params(int trac
 	/* place logical sectors */
 	for (count = 1; count <= F_SECT_PER_TRACK; ++count) {
 		here[n].sect = count;
-		n = (n+il) % F_SECT_PER_TRACK;
-		if (here[n].sect) { /* sector busy, find next free sector */
+		n = (n + il) % F_SECT_PER_TRACK;
+		if (here[n].sect) {	/* sector busy, find next free sector */
 			++n;
-			if (n>= F_SECT_PER_TRACK) {
-				n-=F_SECT_PER_TRACK;
-				while (here[n].sect) ++n;
+			if (n >= F_SECT_PER_TRACK) {
+				n -= F_SECT_PER_TRACK;
+				while (here[n].sect)
+					++n;
 			}
 		}
 	}
+	if (_floppy->stretch & FD_ZEROBASED) {
+		for (count = 0; count < F_SECT_PER_TRACK; count++)
+			here[count].sect--;
+	}
 }
 
 static void redo_format(void)
@@ -2271,23 +2272,23 @@ static void redo_format(void)
 }
 
 static struct cont_t format_cont = {
-	.interrupt = format_interrupt,
-	.redo = redo_format,
-	.error = bad_flp_intr,
-	.done = generic_done
+	.interrupt	= format_interrupt,
+	.redo		= redo_format,
+	.error		= bad_flp_intr,
+	.done		= generic_done
 };
 
 static int do_format(int drive, struct format_descr *tmp_format_req)
 {
 	int ret;
 
-	LOCK_FDC(drive,1);
+	LOCK_FDC(drive, 1);
 	set_floppy(drive);
 	if (!_floppy ||
 	    _floppy->track > DP->tracks ||
 	    tmp_format_req->track >= _floppy->track ||
 	    tmp_format_req->head >= _floppy->head ||
-	    (_floppy->sect << 2) % (1 <<  FD_SIZECODE(_floppy)) ||
+	    (_floppy->sect << 2) % (1 << FD_SIZECODE(_floppy)) ||
 	    !_floppy->fmt_gap) {
 		process_fd_request();
 		return -EINVAL;
@@ -2324,7 +2325,6 @@ static void floppy_end_request(struct re
 	current_req = NULL;
 }
 
-
 /* new request_done. Can handle physical sectors which are smaller than a
  * logical buffer */
 static void request_done(int uptodate)
@@ -2342,7 +2342,7 @@ static void request_done(int uptodate)
 		return;
 	}
 
-	if (uptodate){
+	if (uptodate) {
 		/* maintain values for invalidation on geometry
 		 * change */
 		block = current_count_sectors + req->sector;
@@ -2377,11 +2377,11 @@ static void rw_interrupt(void)
 	int nr_sectors, ssize, eoc, heads;
 
 	if (R_HEAD >= 2) {
-	    /* some Toshiba floppy controllers occasionnally seem to
-	     * return bogus interrupts after read/write operations, which
-	     * can be recognized by a bad head number (>= 2) */
-	     return;
-	}  
+		/* some Toshiba floppy controllers occasionnally seem to
+		 * return bogus interrupts after read/write operations, which
+		 * can be recognized by a bad head number (>= 2) */
+		return;
+	}
 
 	if (!DRS->first_read_date)
 		DRS->first_read_date = jiffies;
@@ -2399,15 +2399,15 @@ static void rw_interrupt(void)
 	else
 		heads = 1;
 
-	nr_sectors = (((R_TRACK-TRACK) * heads +
-				   R_HEAD-HEAD) * SECT_PER_TRACK +
-				   R_SECTOR-SECTOR + eoc) << SIZECODE >> 2;
+	nr_sectors = (((R_TRACK - TRACK) * heads +
+		       R_HEAD - HEAD) * SECT_PER_TRACK +
+		      R_SECTOR - SECTOR + eoc) << SIZECODE >> 2;
 
 #ifdef FLOPPY_SANITY_CHECK
-	if (nr_sectors / ssize > 
-		(in_sector_offset + current_count_sectors + ssize - 1) / ssize) {
+	if (nr_sectors / ssize >
+	    (in_sector_offset + current_count_sectors + ssize - 1) / ssize) {
 		DPRINT("long rw: %x instead of %lx\n",
-			nr_sectors, current_count_sectors);
+		       nr_sectors, current_count_sectors);
 		printk("rs=%d s=%d\n", R_SECTOR, SECTOR);
 		printk("rh=%d h=%d\n", R_HEAD, HEAD);
 		printk("rt=%d t=%d\n", R_TRACK, TRACK);
@@ -2419,44 +2419,44 @@ static void rw_interrupt(void)
 #endif
 
 	nr_sectors -= in_sector_offset;
-	INFBOUND(nr_sectors,0);
+	INFBOUND(nr_sectors, 0);
 	SUPBOUND(current_count_sectors, nr_sectors);
 
-	switch (interpret_errors()){
-		case 2:
+	switch (interpret_errors()) {
+	case 2:
+		cont->redo();
+		return;
+	case 1:
+		if (!current_count_sectors) {
+			cont->error();
 			cont->redo();
 			return;
-		case 1:
-			if (!current_count_sectors){
-				cont->error();
-				cont->redo();
-				return;
-			}
-			break;
-		case 0:
-			if (!current_count_sectors){
-				cont->redo();
-				return;
-			}
-			current_type[current_drive] = _floppy;
-			floppy_sizes[TOMINOR(current_drive) ]= _floppy->size;
-			break;
+		}
+		break;
+	case 0:
+		if (!current_count_sectors) {
+			cont->redo();
+			return;
+		}
+		current_type[current_drive] = _floppy;
+		floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
+		break;
 	}
 
 	if (probing) {
 		if (DP->flags & FTD_MSG)
 			DPRINT("Auto-detected floppy type %s in fd%d\n",
-				_floppy->name,current_drive);
+			       _floppy->name, current_drive);
 		current_type[current_drive] = _floppy;
 		floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
 		probing = 0;
 	}
 
-	if (CT(COMMAND) != FD_READ || 
-	     raw_cmd->kernel_data == current_req->buffer){
+	if (CT(COMMAND) != FD_READ ||
+	    raw_cmd->kernel_data == current_req->buffer) {
 		/* transfer directly from buffer */
 		cont->done(1);
-	} else if (CT(COMMAND) == FD_READ){
+	} else if (CT(COMMAND) == FD_READ) {
 		buffer_track = raw_cmd->track;
 		buffer_drive = current_drive;
 		INFBOUND(buffer_max, nr_sectors + fsector_t);
@@ -2477,7 +2477,8 @@ static int buffer_chain_size(void)
 
 	rq_for_each_bio(bio, current_req) {
 		bio_for_each_segment(bv, bio, i) {
-			if (page_address(bv->bv_page) + bv->bv_offset != base + size)
+			if (page_address(bv->bv_page) + bv->bv_offset !=
+			    base + size)
 				break;
 
 			size += bv->bv_len;
@@ -2496,7 +2497,7 @@ static int transfer_size(int ssize, int 
 	max_sector -= (max_sector % _floppy->sect) % ssize;
 
 	/* transfer size, beginning not aligned */
-	current_count_sectors = max_sector - fsector_t ;
+	current_count_sectors = max_sector - fsector_t;
 
 	return max_sector;
 }
@@ -2506,7 +2507,7 @@ static int transfer_size(int ssize, int 
  */
 static void copy_buffer(int ssize, int max_sector, int max_sector_2)
 {
-	int remaining; /* number of transferred 512-byte sectors */
+	int remaining;		/* number of transferred 512-byte sectors */
 	struct bio_vec *bv;
 	struct bio *bio;
 	char *buffer, *dma_buffer;
@@ -2519,16 +2520,17 @@ static void copy_buffer(int ssize, int m
 	if (current_count_sectors <= 0 && CT(COMMAND) == FD_WRITE &&
 	    buffer_max > fsector_t + current_req->nr_sectors)
 		current_count_sectors = min_t(int, buffer_max - fsector_t,
-						current_req->nr_sectors);
+					      current_req->nr_sectors);
 
 	remaining = current_count_sectors << 9;
 #ifdef FLOPPY_SANITY_CHECK
-	if ((remaining >> 9) > current_req->nr_sectors  &&
-	    CT(COMMAND) == FD_WRITE){
+	if ((remaining >> 9) > current_req->nr_sectors &&
+	    CT(COMMAND) == FD_WRITE) {
 		DPRINT("in copy buffer\n");
 		printk("current_count_sectors=%ld\n", current_count_sectors);
 		printk("remaining=%d\n", remaining >> 9);
-		printk("current_req->nr_sectors=%ld\n",current_req->nr_sectors);
+		printk("current_req->nr_sectors=%ld\n",
+		       current_req->nr_sectors);
 		printk("current_req->current_nr_sectors=%u\n",
 		       current_req->current_nr_sectors);
 		printk("max_sector=%d\n", max_sector);
@@ -2552,23 +2554,24 @@ static void copy_buffer(int ssize, int m
 
 			buffer = page_address(bv->bv_page) + bv->bv_offset;
 #ifdef FLOPPY_SANITY_CHECK
-		if (dma_buffer + size >
-		    floppy_track_buffer + (max_buffer_sectors << 10) ||
-		    dma_buffer < floppy_track_buffer){
-			DPRINT("buffer overrun in copy buffer %d\n",
-				(int) ((floppy_track_buffer - dma_buffer) >>9));
-			printk("fsector_t=%d buffer_min=%d\n",
-			       fsector_t, buffer_min);
-			printk("current_count_sectors=%ld\n",
-			       current_count_sectors);
-			if (CT(COMMAND) == FD_READ)
-				printk("read\n");
-			if (CT(COMMAND) == FD_WRITE)
-				printk("write\n");
-			break;
-		}
-		if (((unsigned long)buffer) % 512)
-			DPRINT("%p buffer not aligned\n", buffer);
+			if (dma_buffer + size >
+			    floppy_track_buffer + (max_buffer_sectors << 10) ||
+			    dma_buffer < floppy_track_buffer) {
+				DPRINT("buffer overrun in copy buffer %d\n",
+				       (int)((floppy_track_buffer -
+					      dma_buffer) >> 9));
+				printk("fsector_t=%d buffer_min=%d\n",
+				       fsector_t, buffer_min);
+				printk("current_count_sectors=%ld\n",
+				       current_count_sectors);
+				if (CT(COMMAND) == FD_READ)
+					printk("read\n");
+				if (CT(COMMAND) == FD_WRITE)
+					printk("write\n");
+				break;
+			}
+			if (((unsigned long)buffer) % 512)
+				DPRINT("%p buffer not aligned\n", buffer);
 #endif
 			if (CT(COMMAND) == FD_READ)
 				memcpy(buffer, dma_buffer, size);
@@ -2580,21 +2583,21 @@ static void copy_buffer(int ssize, int m
 		}
 	}
 #ifdef FLOPPY_SANITY_CHECK
-	if (remaining){
+	if (remaining) {
 		if (remaining > 0)
 			max_sector -= remaining >> 9;
-		DPRINT("weirdness: remaining %d\n", remaining>>9);
+		DPRINT("weirdness: remaining %d\n", remaining >> 9);
 	}
 #endif
 }
 
 #if 0
-static inline int check_dma_crossing(char *start, 
+static inline int check_dma_crossing(char *start,
 				     unsigned long length, char *message)
 {
 	if (CROSS_64KB(start, length)) {
-		printk("DMA xfer crosses 64KB boundary in %s %p-%p\n", 
-		       message, start, start+length);
+		printk("DMA xfer crosses 64KB boundary in %s %p-%p\n",
+		       message, start, start + length);
 		return 1;
 	} else
 		return 0;
@@ -2612,20 +2615,20 @@ static void virtualdmabug_workaround(voi
 {
 	int hard_sectors, end_sector;
 
-	if(CT(COMMAND) == FD_WRITE) {
-		COMMAND &= ~0x80; /* switch off multiple track mode */
+	if (CT(COMMAND) == FD_WRITE) {
+		COMMAND &= ~0x80;	/* switch off multiple track mode */
 
 		hard_sectors = raw_cmd->length >> (7 + SIZECODE);
 		end_sector = SECTOR + hard_sectors - 1;
 #ifdef FLOPPY_SANITY_CHECK
-		if(end_sector > SECT_PER_TRACK) {
+		if (end_sector > SECT_PER_TRACK) {
 			printk("too many sectors %d > %d\n",
 			       end_sector, SECT_PER_TRACK);
 			return;
 		}
 #endif
-		SECT_PER_TRACK = end_sector; /* make sure SECT_PER_TRACK points
-					      * to end of transfer */
+		SECT_PER_TRACK = end_sector;	/* make sure SECT_PER_TRACK points
+						 * to end of transfer */
 	}
 }
 
@@ -2644,7 +2647,7 @@ static int make_raw_rw_request(void)
 	int aligned_sector_t;
 	int max_sector, max_size, tracksize, ssize;
 
-	if(max_buffer_sectors == 0) {
+	if (max_buffer_sectors == 0) {
 		printk("VFS: Block I/O scheduled on unopened device\n");
 		return 0;
 	}
@@ -2653,14 +2656,14 @@ static int make_raw_rw_request(void)
 
 	raw_cmd = &default_raw_cmd;
 	raw_cmd->flags = FD_RAW_SPIN | FD_RAW_NEED_DISK | FD_RAW_NEED_DISK |
-		FD_RAW_NEED_SEEK;
+	    FD_RAW_NEED_SEEK;
 	raw_cmd->cmd_count = NR_RW;
 	if (rq_data_dir(current_req) == READ) {
 		raw_cmd->flags |= FD_RAW_READ;
-		COMMAND = FM_MODE(_floppy,FD_READ);
-	} else if (rq_data_dir(current_req) == WRITE){
+		COMMAND = FM_MODE(_floppy, FD_READ);
+	} else if (rq_data_dir(current_req) == WRITE) {
 		raw_cmd->flags |= FD_RAW_WRITE;
-		COMMAND = FM_MODE(_floppy,FD_WRITE);
+		COMMAND = FM_MODE(_floppy, FD_WRITE);
 	} else {
 		DPRINT("make_raw_rw_request: unknown command\n");
 		return 0;
@@ -2679,25 +2682,24 @@ static int make_raw_rw_request(void)
 	}
 	HEAD = fsector_t / _floppy->sect;
 
-	if (((_floppy->stretch & FD_SWAPSIDES) || TESTF(FD_NEED_TWADDLE)) &&
-	    fsector_t < _floppy->sect)
+	if (((_floppy->stretch & (FD_SWAPSIDES | FD_ZEROBASED)) ||
+	     TESTF(FD_NEED_TWADDLE)) && fsector_t < _floppy->sect)
 		max_sector = _floppy->sect;
 
 	/* 2M disks have phantom sectors on the first track */
-	if ((_floppy->rate & FD_2M) && (!TRACK) && (!HEAD)){
+	if ((_floppy->rate & FD_2M) && (!TRACK) && (!HEAD)) {
 		max_sector = 2 * _floppy->sect / 3;
-		if (fsector_t >= max_sector){
-			current_count_sectors = min_t(int, _floppy->sect - fsector_t,
-							current_req->nr_sectors);
+		if (fsector_t >= max_sector) {
+			current_count_sectors =
+			    min_t(int, _floppy->sect - fsector_t,
+				  current_req->nr_sectors);
 			return 1;
 		}
 		SIZECODE = 2;
 	} else
 		SIZECODE = FD_SIZECODE(_floppy);
 	raw_cmd->rate = _floppy->rate & 0x43;
-	if ((_floppy->rate & FD_2M) &&
-	    (TRACK || HEAD) &&
-	    raw_cmd->rate == 2)
+	if ((_floppy->rate & FD_2M) && (TRACK || HEAD) && raw_cmd->rate == 2)
 		raw_cmd->rate = 1;
 
 	if (SIZECODE)
@@ -2705,28 +2707,30 @@ static int make_raw_rw_request(void)
 	else
 		SIZECODE2 = 0x80;
 	raw_cmd->track = TRACK << STRETCH(_floppy);
-	DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy,HEAD);
+	DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, HEAD);
 	GAP = _floppy->gap;
 	CODE2SIZE;
 	SECT_PER_TRACK = _floppy->sect << 2 >> SIZECODE;
-	SECTOR = ((fsector_t % _floppy->sect) << 2 >> SIZECODE) + 1;
+	SECTOR = ((fsector_t % _floppy->sect) << 2 >> SIZECODE) +
+	    ((_floppy->stretch & FD_ZEROBASED) ? 0 : 1);
 
 	/* tracksize describes the size which can be filled up with sectors
 	 * of size ssize.
 	 */
 	tracksize = _floppy->sect - _floppy->sect % ssize;
-	if (tracksize < _floppy->sect){
-		SECT_PER_TRACK ++;
+	if (tracksize < _floppy->sect) {
+		SECT_PER_TRACK++;
 		if (tracksize <= fsector_t % _floppy->sect)
 			SECTOR--;
 
 		/* if we are beyond tracksize, fill up using smaller sectors */
-		while (tracksize <= fsector_t % _floppy->sect){
-			while(tracksize + ssize > _floppy->sect){
+		while (tracksize <= fsector_t % _floppy->sect) {
+			while (tracksize + ssize > _floppy->sect) {
 				SIZECODE--;
 				ssize >>= 1;
 			}
-			SECTOR++; SECT_PER_TRACK ++;
+			SECTOR++;
+			SECT_PER_TRACK++;
 			tracksize += ssize;
 		}
 		max_sector = HEAD * _floppy->sect + tracksize;
@@ -2740,7 +2744,7 @@ static int make_raw_rw_request(void)
 	in_sector_offset = (fsector_t % _floppy->sect) % ssize;
 	aligned_sector_t = fsector_t - in_sector_offset;
 	max_size = current_req->nr_sectors;
-	if ((raw_cmd->track == buffer_track) && 
+	if ((raw_cmd->track == buffer_track) &&
 	    (current_drive == buffer_drive) &&
 	    (fsector_t >= buffer_min) && (fsector_t < buffer_max)) {
 		/* data already in track buffer */
@@ -2748,8 +2752,8 @@ static int make_raw_rw_request(void)
 			copy_buffer(1, max_sector, buffer_max);
 			return 1;
 		}
-	} else if (in_sector_offset || current_req->nr_sectors < ssize){
-		if (CT(COMMAND) == FD_WRITE){
+	} else if (in_sector_offset || current_req->nr_sectors < ssize) {
+		if (CT(COMMAND) == FD_WRITE) {
 			if (fsector_t + current_req->nr_sectors > ssize &&
 			    fsector_t + current_req->nr_sectors < ssize + ssize)
 				max_size = ssize + ssize;
@@ -2758,28 +2762,32 @@ static int make_raw_rw_request(void)
 		}
 		raw_cmd->flags &= ~FD_RAW_WRITE;
 		raw_cmd->flags |= FD_RAW_READ;
-		COMMAND = FM_MODE(_floppy,FD_READ);
+		COMMAND = FM_MODE(_floppy, FD_READ);
 	} else if ((unsigned long)current_req->buffer < MAX_DMA_ADDRESS) {
 		unsigned long dma_limit;
 		int direct, indirect;
 
-		indirect= transfer_size(ssize,max_sector,max_buffer_sectors*2) -
-			fsector_t;
+		indirect =
+		    transfer_size(ssize, max_sector,
+				  max_buffer_sectors * 2) - fsector_t;
 
 		/*
 		 * Do NOT use minimum() here---MAX_DMA_ADDRESS is 64 bits wide
 		 * on a 64 bit machine!
 		 */
 		max_size = buffer_chain_size();
-		dma_limit = (MAX_DMA_ADDRESS - ((unsigned long) current_req->buffer)) >> 9;
-		if ((unsigned long) max_size > dma_limit) {
+		dma_limit =
+		    (MAX_DMA_ADDRESS -
+		     ((unsigned long)current_req->buffer)) >> 9;
+		if ((unsigned long)max_size > dma_limit) {
 			max_size = dma_limit;
 		}
 		/* 64 kb boundaries */
 		if (CROSS_64KB(current_req->buffer, max_size << 9))
-			max_size = (K_64 - 
-				    ((unsigned long)current_req->buffer) % K_64)>>9;
-		direct = transfer_size(ssize,max_sector,max_size) - fsector_t;
+			max_size = (K_64 -
+				    ((unsigned long)current_req->buffer) %
+				    K_64) >> 9;
+		direct = transfer_size(ssize, max_sector, max_size) - fsector_t;
 		/*
 		 * We try to read tracks, but if we get too many errors, we
 		 * go back to reading just one sector at a time.
@@ -2790,16 +2798,18 @@ static int make_raw_rw_request(void)
 		if (!direct ||
 		    (indirect * 2 > direct * 3 &&
 		     *errors < DP->max_errors.read_track &&
-		     /*!TESTF(FD_NEED_TWADDLE) &&*/
-		     ((!probing || (DP->read_track&(1<<DRS->probed_format)))))){
+		     /*!TESTF(FD_NEED_TWADDLE) && */
+		     ((!probing
+		       || (DP->read_track & (1 << DRS->probed_format)))))) {
 			max_size = current_req->nr_sectors;
 		} else {
 			raw_cmd->kernel_data = current_req->buffer;
 			raw_cmd->length = current_count_sectors << 9;
-			if (raw_cmd->length == 0){
-				DPRINT("zero dma transfer attempted from make_raw_request\n");
+			if (raw_cmd->length == 0) {
+				DPRINT
+				    ("zero dma transfer attempted from make_raw_request\n");
 				DPRINT("indirect=%d direct=%d fsector_t=%d",
-					indirect, direct, fsector_t);
+				       indirect, direct, fsector_t);
 				return 0;
 			}
 /*			check_dma_crossing(raw_cmd->kernel_data, 
@@ -2812,26 +2822,27 @@ static int make_raw_rw_request(void)
 	}
 
 	if (CT(COMMAND) == FD_READ)
-		max_size = max_sector; /* unbounded */
+		max_size = max_sector;	/* unbounded */
 
 	/* claim buffer track if needed */
-	if (buffer_track != raw_cmd->track ||  /* bad track */
-	    buffer_drive !=current_drive || /* bad drive */
+	if (buffer_track != raw_cmd->track ||	/* bad track */
+	    buffer_drive != current_drive ||	/* bad drive */
 	    fsector_t > buffer_max ||
 	    fsector_t < buffer_min ||
 	    ((CT(COMMAND) == FD_READ ||
-	      (!in_sector_offset && current_req->nr_sectors >= ssize))&&
+	      (!in_sector_offset && current_req->nr_sectors >= ssize)) &&
 	     max_sector > 2 * max_buffer_sectors + buffer_min &&
 	     max_size + fsector_t > 2 * max_buffer_sectors + buffer_min)
-	    /* not enough space */){
+	    /* not enough space */
+	    ) {
 		buffer_track = -1;
 		buffer_drive = current_drive;
 		buffer_max = buffer_min = aligned_sector_t;
 	}
-	raw_cmd->kernel_data = floppy_track_buffer + 
-		((aligned_sector_t-buffer_min)<<9);
+	raw_cmd->kernel_data = floppy_track_buffer +
+	    ((aligned_sector_t - buffer_min) << 9);
 
-	if (CT(COMMAND) == FD_WRITE){
+	if (CT(COMMAND) == FD_WRITE) {
 		/* copy write buffer to track buffer.
 		 * if we get here, we know that the write
 		 * is either aligned or the data already in the buffer
@@ -2842,31 +2853,33 @@ static int make_raw_rw_request(void)
 #endif
 		buffer_track = raw_cmd->track;
 		buffer_drive = current_drive;
-		copy_buffer(ssize, max_sector, 2*max_buffer_sectors+buffer_min);
+		copy_buffer(ssize, max_sector,
+			    2 * max_buffer_sectors + buffer_min);
 	} else
 		transfer_size(ssize, max_sector,
-			      2*max_buffer_sectors+buffer_min-aligned_sector_t);
+			      2 * max_buffer_sectors + buffer_min -
+			      aligned_sector_t);
 
 	/* round up current_count_sectors to get dma xfer size */
-	raw_cmd->length = in_sector_offset+current_count_sectors;
-	raw_cmd->length = ((raw_cmd->length -1)|(ssize-1))+1;
+	raw_cmd->length = in_sector_offset + current_count_sectors;
+	raw_cmd->length = ((raw_cmd->length - 1) | (ssize - 1)) + 1;
 	raw_cmd->length <<= 9;
 #ifdef FLOPPY_SANITY_CHECK
 	/*check_dma_crossing(raw_cmd->kernel_data, raw_cmd->length, 
-	  "end of make_raw_request");*/
+	   "end of make_raw_request"); */
 	if ((raw_cmd->length < current_count_sectors << 9) ||
 	    (raw_cmd->kernel_data != current_req->buffer &&
 	     CT(COMMAND) == FD_WRITE &&
 	     (aligned_sector_t + (raw_cmd->length >> 9) > buffer_max ||
 	      aligned_sector_t < buffer_min)) ||
 	    raw_cmd->length % (128 << SIZECODE) ||
-	    raw_cmd->length <= 0 || current_count_sectors <= 0){
+	    raw_cmd->length <= 0 || current_count_sectors <= 0) {
 		DPRINT("fractionary current count b=%lx s=%lx\n",
-			raw_cmd->length, current_count_sectors);
+		       raw_cmd->length, current_count_sectors);
 		if (raw_cmd->kernel_data != current_req->buffer)
 			printk("addr=%d, length=%ld\n",
-			       (int) ((raw_cmd->kernel_data - 
-				       floppy_track_buffer) >> 9),
+			       (int)((raw_cmd->kernel_data -
+				      floppy_track_buffer) >> 9),
 			       current_count_sectors);
 		printk("st=%d ast=%d mse=%d msi=%d\n",
 		       fsector_t, aligned_sector_t, max_sector, max_size);
@@ -2880,16 +2893,15 @@ static int make_raw_rw_request(void)
 		return 0;
 	}
 
-	if (raw_cmd->kernel_data != current_req->buffer){
+	if (raw_cmd->kernel_data != current_req->buffer) {
 		if (raw_cmd->kernel_data < floppy_track_buffer ||
 		    current_count_sectors < 0 ||
 		    raw_cmd->length < 0 ||
 		    raw_cmd->kernel_data + raw_cmd->length >
-		    floppy_track_buffer + (max_buffer_sectors  << 10)){
+		    floppy_track_buffer + (max_buffer_sectors << 10)) {
 			DPRINT("buffer overrun in schedule dma\n");
 			printk("fsector_t=%d buffer_min=%d current_count=%ld\n",
-			       fsector_t, buffer_min,
-			       raw_cmd->length >> 9);
+			       fsector_t, buffer_min, raw_cmd->length >> 9);
 			printk("current_count_sectors=%ld\n",
 			       current_count_sectors);
 			if (CT(COMMAND) == FD_READ)
@@ -2899,15 +2911,15 @@ static int make_raw_rw_request(void)
 			return 0;
 		}
 	} else if (raw_cmd->length > current_req->nr_sectors << 9 ||
-		   current_count_sectors > current_req->nr_sectors){
+		   current_count_sectors > current_req->nr_sectors) {
 		DPRINT("buffer overrun in direct transfer\n");
 		return 0;
-	} else if (raw_cmd->length < current_count_sectors << 9){
+	} else if (raw_cmd->length < current_count_sectors << 9) {
 		DPRINT("more sectors than bytes\n");
 		printk("bytes=%ld\n", raw_cmd->length >> 9);
 		printk("sectors=%ld\n", current_count_sectors);
 	}
-	if (raw_cmd->length == 0){
+	if (raw_cmd->length == 0) {
 		DPRINT("zero dma transfer attempted from make_raw_request\n");
 		return 0;
 	}
@@ -2946,31 +2958,33 @@ static void redo_fd_request(void)
 		reschedule_timeout(current_reqD, "redo fd request", 0);
 
 		set_floppy(drive);
-		raw_cmd = & default_raw_cmd;
+		raw_cmd = &default_raw_cmd;
 		raw_cmd->flags = 0;
-		if (start_motor(redo_fd_request)) return;
+		if (start_motor(redo_fd_request))
+			return;
 		disk_change(current_drive);
 		if (test_bit(current_drive, &fake_change) ||
-		   TESTF(FD_DISK_CHANGED)){
+		    TESTF(FD_DISK_CHANGED)) {
 			DPRINT("disk absent or changed during operation\n");
 			REPEAT;
 		}
-		if (!_floppy) { /* Autodetection */
-			if (!probing){
+		if (!_floppy) {	/* Autodetection */
+			if (!probing) {
 				DRS->probed_format = 0;
-				if (next_valid_format()){
+				if (next_valid_format()) {
 					DPRINT("no autodetectable formats\n");
 					_floppy = NULL;
 					REPEAT;
 				}
 			}
 			probing = 1;
-			_floppy = floppy_type+DP->autodetect[DRS->probed_format];
+			_floppy =
+			    floppy_type + DP->autodetect[DRS->probed_format];
 		} else
 			probing = 0;
-		errors = & (current_req->errors);
+		errors = &(current_req->errors);
 		tmp = make_raw_rw_request();
-		if (tmp < 2){
+		if (tmp < 2) {
 			request_done(tmp);
 			continue;
 		}
@@ -2987,10 +3001,10 @@ static void redo_fd_request(void)
 }
 
 static struct cont_t rw_cont = {
-	.interrupt = rw_interrupt,
-	.redo = redo_fd_request,
-	.error = bad_flp_intr,
-	.done = request_done
+	.interrupt	= rw_interrupt,
+	.redo		= redo_fd_request,
+	.error		= bad_flp_intr,
+	.done		= request_done
 };
 
 static void process_fd_request(void)
@@ -3001,14 +3015,16 @@ static void process_fd_request(void)
 
 static void do_fd_request(request_queue_t * q)
 {
-	if(max_buffer_sectors == 0) {
+	if (max_buffer_sectors == 0) {
 		printk("VFS: do_fd_request called on non-open device\n");
 		return;
 	}
 
 	if (usage_count == 0) {
-		printk("warning: usage count=0, current_req=%p exiting\n", current_req);
-		printk("sect=%ld flags=%lx\n", (long)current_req->sector, current_req->flags);
+		printk("warning: usage count=0, current_req=%p exiting\n",
+		       current_req);
+		printk("sect=%ld flags=%lx\n", (long)current_req->sector,
+		       current_req->flags);
 		return;
 	}
 	if (test_bit(0, &fdc_busy)) {
@@ -3017,16 +3033,16 @@ static void do_fd_request(request_queue_
 		is_alive("do fd request, old request running");
 		return;
 	}
-	lock_fdc(MAXTIMEOUT,0);
+	lock_fdc(MAXTIMEOUT, 0);
 	process_fd_request();
 	is_alive("do fd request");
 }
 
 static struct cont_t poll_cont = {
-	.interrupt = success_and_wakeup,
-	.redo = floppy_ready,
-	.error = generic_failure,
-	.done = generic_done
+	.interrupt	= success_and_wakeup,
+	.redo		= floppy_ready,
+	.error		= generic_failure,
+	.done		= generic_done
 };
 
 static int poll_drive(int interruptible, int flag)
@@ -3034,12 +3050,12 @@ static int poll_drive(int interruptible,
 	int ret;
 	/* no auto-sense, just clear dcl */
 	raw_cmd = &default_raw_cmd;
-	raw_cmd->flags= flag;
-	raw_cmd->track=0;
-	raw_cmd->cmd_count=0;
+	raw_cmd->flags = flag;
+	raw_cmd->track = 0;
+	raw_cmd->cmd_count = 0;
 	cont = &poll_cont;
 #ifdef DCL_DEBUG
-	if (DP->flags & FD_DEBUG){
+	if (DP->flags & FD_DEBUG) {
 		DPRINT("setting NEWCHANGE in poll_drive\n");
 	}
 #endif
@@ -3059,21 +3075,21 @@ static void reset_intr(void)
 }
 
 static struct cont_t reset_cont = {
-	.interrupt = reset_intr,
-	.redo = success_and_wakeup,
-	.error = generic_failure,
-	.done = generic_done
+	.interrupt	= reset_intr,
+	.redo		= success_and_wakeup,
+	.error		= generic_failure,
+	.done		= generic_done
 };
 
 static int user_reset_fdc(int drive, int arg, int interruptible)
 {
 	int ret;
 
-	ret=0;
-	LOCK_FDC(drive,interruptible);
+	ret = 0;
+	LOCK_FDC(drive, interruptible);
 	if (arg == FD_RESET_ALWAYS)
-		FDCS->reset=1;
-	if (FDCS->reset){
+		FDCS->reset = 1;
+	if (FDCS->reset) {
 		cont = &reset_cont;
 		WAIT(reset_fdc);
 	}
@@ -3085,9 +3101,10 @@ static int user_reset_fdc(int drive, int
  * Misc Ioctl's and support
  * ========================
  */
-static inline int fd_copyout(void *param, const void *address, unsigned long size)
+static inline int fd_copyout(void *param, const void *address,
+			     unsigned long size)
 {
-	return copy_to_user(param,address, size) ? -EFAULT : 0;
+	return copy_to_user(param, address, size) ? -EFAULT : 0;
 }
 
 static inline int fd_copyin(void *param, void *address, unsigned long size)
@@ -3119,7 +3136,6 @@ static inline const char *drive_name(int
 		return "(null)";
 }
 
-
 /* raw commands */
 static void raw_cmd_done(int flag)
 {
@@ -3131,18 +3147,17 @@ static void raw_cmd_done(int flag)
 	} else {
 		raw_cmd->reply_count = inr;
 		if (raw_cmd->reply_count > MAX_REPLIES)
-			raw_cmd->reply_count=0;
-		for (i=0; i< raw_cmd->reply_count; i++)
+			raw_cmd->reply_count = 0;
+		for (i = 0; i < raw_cmd->reply_count; i++)
 			raw_cmd->reply[i] = reply_buffer[i];
 
-		if (raw_cmd->flags & (FD_RAW_READ | FD_RAW_WRITE))
-		{
+		if (raw_cmd->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
 			unsigned long flags;
-			flags=claim_dma_lock();
+			flags = claim_dma_lock();
 			raw_cmd->length = fd_get_dma_residue();
 			release_dma_lock(flags);
 		}
-		
+
 		if ((raw_cmd->flags & FD_RAW_SOFTFAILURE) &&
 		    (!raw_cmd->reply_count || (raw_cmd->reply[0] & 0xc0)))
 			raw_cmd->flags |= FD_RAW_FAILURE;
@@ -3155,10 +3170,10 @@ static void raw_cmd_done(int flag)
 			motor_off_callback(current_drive);
 
 		if (raw_cmd->next &&
-		   (!(raw_cmd->flags & FD_RAW_FAILURE) ||
-		    !(raw_cmd->flags & FD_RAW_STOP_IF_FAILURE)) &&
-		   ((raw_cmd->flags & FD_RAW_FAILURE) ||
-		    !(raw_cmd->flags &FD_RAW_STOP_IF_SUCCESS))) {
+		    (!(raw_cmd->flags & FD_RAW_FAILURE) ||
+		     !(raw_cmd->flags & FD_RAW_STOP_IF_FAILURE)) &&
+		    ((raw_cmd->flags & FD_RAW_FAILURE) ||
+		     !(raw_cmd->flags & FD_RAW_STOP_IF_SUCCESS))) {
 			raw_cmd = raw_cmd->next;
 			return;
 		}
@@ -3166,12 +3181,11 @@ static void raw_cmd_done(int flag)
 	generic_done(flag);
 }
 
-
 static struct cont_t raw_cmd_cont = {
-	.interrupt = success_and_wakeup,
-	.redo = floppy_start,
-	.error = generic_failure,
-	.done = raw_cmd_done
+	.interrupt	= success_and_wakeup,
+	.redo		= floppy_start,
+	.error		= generic_failure,
+	.done		= raw_cmd_done
 };
 
 static inline int raw_cmd_copyout(int cmd, char *param,
@@ -3179,29 +3193,28 @@ static inline int raw_cmd_copyout(int cm
 {
 	int ret;
 
-	while(ptr) {
+	while (ptr) {
 		COPYOUT(*ptr);
 		param += sizeof(struct floppy_raw_cmd);
-		if ((ptr->flags & FD_RAW_READ) && ptr->buffer_length){
-			if (ptr->length>=0 && ptr->length<=ptr->buffer_length)
-				ECALL(fd_copyout(ptr->data, 
-						 ptr->kernel_data, 
-						 ptr->buffer_length - 
-						 ptr->length));
+		if ((ptr->flags & FD_RAW_READ) && ptr->buffer_length) {
+			if (ptr->length >= 0
+			    && ptr->length <= ptr->buffer_length)
+				ECALL(fd_copyout
+				      (ptr->data, ptr->kernel_data,
+				       ptr->buffer_length - ptr->length));
 		}
 		ptr = ptr->next;
 	}
 	return 0;
 }
 
-
 static void raw_cmd_free(struct floppy_raw_cmd **ptr)
 {
-	struct floppy_raw_cmd *next,*this;
+	struct floppy_raw_cmd *next, *this;
 
 	this = *ptr;
 	*ptr = 0;
-	while(this) {
+	while (this) {
 		if (this->buffer_length) {
 			fd_dma_mem_free((unsigned long)this->kernel_data,
 					this->buffer_length);
@@ -3213,18 +3226,17 @@ static void raw_cmd_free(struct floppy_r
 	}
 }
 
-
 static inline int raw_cmd_copyin(int cmd, char *param,
 				 struct floppy_raw_cmd **rcmd)
 {
 	struct floppy_raw_cmd *ptr;
 	int ret;
 	int i;
-	
+
 	*rcmd = 0;
-	while(1) {
-		ptr = (struct floppy_raw_cmd *) 
-			kmalloc(sizeof(struct floppy_raw_cmd), GFP_USER);
+	while (1) {
+		ptr = (struct floppy_raw_cmd *)
+		    kmalloc(sizeof(struct floppy_raw_cmd), GFP_USER);
 		if (!ptr)
 			return -ENOMEM;
 		*rcmd = ptr;
@@ -3243,7 +3255,7 @@ static inline int raw_cmd_copyin(int cmd
 			 */
 			return -EINVAL;
 
-		for (i=0; i< 16; i++)
+		for (i = 0; i < 16; i++)
 			ptr->reply[i] = 0;
 		ptr->resultcode = 0;
 		ptr->kernel_data = 0;
@@ -3251,24 +3263,23 @@ static inline int raw_cmd_copyin(int cmd
 		if (ptr->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
 			if (ptr->length <= 0)
 				return -EINVAL;
-			ptr->kernel_data =(char*)fd_dma_mem_alloc(ptr->length);
-			fallback_on_nodma_alloc(&ptr->kernel_data,
-						ptr->length);
+			ptr->kernel_data =
+			    (char *)fd_dma_mem_alloc(ptr->length);
+			fallback_on_nodma_alloc(&ptr->kernel_data, ptr->length);
 			if (!ptr->kernel_data)
 				return -ENOMEM;
 			ptr->buffer_length = ptr->length;
 		}
 		if (ptr->flags & FD_RAW_WRITE)
-			ECALL(fd_copyin(ptr->data, ptr->kernel_data, 
+			ECALL(fd_copyin(ptr->data, ptr->kernel_data,
 					ptr->length));
-		rcmd = & (ptr->next);
+		rcmd = &(ptr->next);
 		if (!(ptr->flags & FD_RAW_MORE))
 			return 0;
 		ptr->rate &= 0x43;
 	}
 }
 
-
 static int raw_cmd_ioctl(int cmd, void *param)
 {
 	int drive, ret, ret2;
@@ -3276,15 +3287,15 @@ static int raw_cmd_ioctl(int cmd, void *
 
 	if (FDCS->rawcmd <= 1)
 		FDCS->rawcmd = 1;
-	for (drive= 0; drive < N_DRIVE; drive++){
+	for (drive = 0; drive < N_DRIVE; drive++) {
 		if (FDC(drive) != fdc)
 			continue;
-		if (drive == current_drive){
-			if (UDRS->fd_ref > 1){
+		if (drive == current_drive) {
+			if (UDRS->fd_ref > 1) {
 				FDCS->rawcmd = 2;
 				break;
 			}
-		} else if (UDRS->fd_ref){
+		} else if (UDRS->fd_ref) {
 			FDCS->rawcmd = 2;
 			break;
 		}
@@ -3301,9 +3312,9 @@ static int raw_cmd_ioctl(int cmd, void *
 
 	raw_cmd = my_raw_cmd;
 	cont = &raw_cmd_cont;
-	ret=wait_til_done(floppy_start,1);
+	ret = wait_til_done(floppy_start, 1);
 #ifdef DCL_DEBUG
-	if (DP->flags & FD_DEBUG){
+	if (DP->flags & FD_DEBUG) {
 		DPRINT("calling disk change from raw_cmd ioctl\n");
 	}
 #endif
@@ -3329,7 +3340,6 @@ static int invalidate_drive(struct block
 	return 0;
 }
 
-
 static inline void clear_write_error(int drive)
 {
 	CLEARSTRUCT(UDRWE);
@@ -3340,24 +3350,23 @@ static inline int set_geometry(unsigned 
 {
 	int cnt;
 
-	/* sanity checking for parameters.*/
+	/* sanity checking for parameters. */
 	if (g->sect <= 0 ||
 	    g->head <= 0 ||
-	    g->track <= 0 ||
-	    g->track > UDP->tracks>>STRETCH(g) ||
+	    g->track <= 0 || g->track > UDP->tracks >> STRETCH(g) ||
 	    /* check if reserved bits are set */
-	    (g->stretch&~(FD_STRETCH|FD_SWAPSIDES)) != 0)
+	    (g->stretch & ~(FD_STRETCH | FD_SWAPSIDES | FD_ZEROBASED)) != 0)
 		return -EINVAL;
-	if (type){
+	if (type) {
 		if (!capable(CAP_SYS_ADMIN))
 			return -EPERM;
 		down(&open_lock);
-		LOCK_FDC(drive,1);
+		LOCK_FDC(drive, 1);
 		floppy_type[type] = *g;
-		floppy_type[type].name="user format";
+		floppy_type[type].name = "user format";
 		for (cnt = type << 2; cnt < (type << 2) + 4; cnt++)
-			floppy_sizes[cnt]= floppy_sizes[cnt+0x80]=
-				floppy_type[type].size+1;
+			floppy_sizes[cnt] = floppy_sizes[cnt + 0x80] =
+			    floppy_type[type].size + 1;
 		process_fd_request();
 		for (cnt = 0; cnt < N_DRIVE; cnt++) {
 			struct block_device *bdev = opened_bdev[cnt];
@@ -3367,11 +3376,13 @@ static inline int set_geometry(unsigned 
 		}
 		up(&open_lock);
 	} else {
-		LOCK_FDC(drive,1);
+		int oldStretch;
+		LOCK_FDC(drive, 1);
 		if (cmd != FDDEFPRM)
 			/* notice a disk change immediately, else
 			 * we lose our settings immediately*/
 			CALL(poll_drive(1, FD_RAW_NEED_DISK));
+		oldStretch = g->stretch;
 		user_params[drive] = *g;
 		if (buffer_drive == drive)
 			SUPBOUND(buffer_max, user_params[drive].sect);
@@ -3386,7 +3397,10 @@ static inline int set_geometry(unsigned 
 		 * whose number will change. This is useful, because
 		 * mtools often changes the geometry of the disk after
 		 * looking at the boot block */
-		if (DRS->maxblock > user_params[drive].sect || DRS->maxtrack)
+		if (DRS->maxblock > user_params[drive].sect ||
+		    DRS->maxtrack ||
+		    ((user_params[drive].sect ^ oldStretch) &
+		     (FD_SWAPSIDES | FD_ZEROBASED)))
 			invalidate_drive(bdev);
 		else
 			process_fd_request();
@@ -3395,7 +3409,7 @@ static inline int set_geometry(unsigned 
 }
 
 /* handle obsolete ioctl's */
-static int ioctl_table[]= {
+static int ioctl_table[] = {
 	FDCLRPRM,
 	FDSETPRM,
 	FDDEFPRM,
@@ -3427,8 +3441,8 @@ static inline int normalize_ioctl(int *c
 {
 	int i;
 
-	for (i=0; i < ARRAY_SIZE(ioctl_table); i++) {
-		if ((*cmd & 0xffff) == (ioctl_table[i] & 0xffff)){
+	for (i = 0; i < ARRAY_SIZE(ioctl_table); i++) {
+		if ((*cmd & 0xffff) == (ioctl_table[i] & 0xffff)) {
 			*size = _IOC_SIZE(*cmd);
 			*cmd = ioctl_table[i];
 			if (*size > _IOC_SIZE(*cmd)) {
@@ -3446,9 +3460,9 @@ static int get_floppy_geometry(int drive
 	if (type)
 		*g = &floppy_type[type];
 	else {
-		LOCK_FDC(drive,0);
-		CALL(poll_drive(0,0));
-		process_fd_request();		
+		LOCK_FDC(drive, 0);
+		CALL(poll_drive(0, 0));
+		process_fd_request();
 		*g = current_type[drive];
 	}
 	if (!*g)
@@ -3468,30 +3482,29 @@ static int fd_ioctl(struct inode *inode,
 	int ret;
 	int size;
 	union inparam {
-		struct floppy_struct g; /* geometry */
+		struct floppy_struct g;	/* geometry */
 		struct format_descr f;
 		struct floppy_max_errors max_errors;
 		struct floppy_drive_params dp;
-	} inparam; /* parameters coming from user space */
-	const char *outparam; /* parameters passed back to user space */
-
+	} inparam;		/* parameters coming from user space */
+	const char *outparam;	/* parameters passed back to user space */
 
 	/* convert compatibility eject ioctls into floppy eject ioctl.
 	 * We do this in order to provide a means to eject floppy disks before
 	 * installing the new fdutils package */
-	if (cmd == CDROMEJECT || /* CD-ROM eject */
-	    cmd == 0x6470 /* SunOS floppy eject */) {
+	if (cmd == CDROMEJECT ||	/* CD-ROM eject */
+	    cmd == 0x6470 /* SunOS floppy eject */ ) {
 		DPRINT("obsolete eject ioctl\n");
 		DPRINT("please use floppycontrol --eject\n");
 		cmd = FDEJECT;
 	}
 
 	/* generic block device ioctls */
-	switch(cmd) {
+	switch (cmd) {
 		/* the following have been inspired by the corresponding
 		 * code for other block devices. */
 		struct floppy_struct *g;
-		case HDIO_GETGEO:
+	case HDIO_GETGEO:
 		{
 			struct hd_geometry loc;
 			ECALL(get_floppy_geometry(drive, type, &g));
@@ -3517,36 +3530,36 @@ static int fd_ioctl(struct inode *inode,
 	/* copyin */
 	CLEARSTRUCT(&inparam);
 	if (_IOC_DIR(cmd) & _IOC_WRITE)
-		ECALL(fd_copyin((void *)param, &inparam, size))
+	    ECALL(fd_copyin((void *)param, &inparam, size))
 
-	switch (cmd) {
+		switch (cmd) {
 		case FDEJECT:
 			if (UDRS->fd_ref != 1)
 				/* somebody else has this drive open */
 				return -EBUSY;
-			LOCK_FDC(drive,1);
+			LOCK_FDC(drive, 1);
 
 			/* do the actual eject. Fails on
 			 * non-Sparc architectures */
-			ret=fd_eject(UNIT(drive));
+			ret = fd_eject(UNIT(drive));
 
 			USETF(FD_DISK_CHANGED);
 			USETF(FD_VERIFY);
 			process_fd_request();
-			return ret;			
+			return ret;
 		case FDCLRPRM:
-			LOCK_FDC(drive,1);
+			LOCK_FDC(drive, 1);
 			current_type[drive] = NULL;
 			floppy_sizes[drive] = MAX_DISK_SIZE << 1;
 			UDRS->keep_data = 0;
 			return invalidate_drive(inode->i_bdev);
 		case FDSETPRM:
 		case FDDEFPRM:
-			return set_geometry(cmd, & inparam.g,
+			return set_geometry(cmd, &inparam.g,
 					    drive, type, inode->i_bdev);
 		case FDGETPRM:
-			ECALL(get_floppy_geometry(drive, type, 
-						  (struct floppy_struct**)
+			ECALL(get_floppy_geometry(drive, type,
+						  (struct floppy_struct **)
 						  &outparam));
 			break;
 
@@ -3558,7 +3571,7 @@ static int fd_ioctl(struct inode *inode,
 			return 0;
 
 		case FDFMTBEG:
-			LOCK_FDC(drive,1);
+			LOCK_FDC(drive, 1);
 			CALL(poll_drive(1, FD_RAW_NEED_DISK));
 			ret = UDRS->flags;
 			process_fd_request();
@@ -3573,59 +3586,59 @@ static int fd_ioctl(struct inode *inode,
 			return do_format(drive, &inparam.f);
 		case FDFMTEND:
 		case FDFLUSH:
-			LOCK_FDC(drive,1);
+			LOCK_FDC(drive, 1);
 			return invalidate_drive(inode->i_bdev);
 
 		case FDSETEMSGTRESH:
 			UDP->max_errors.reporting =
-				(unsigned short) (param & 0x0f);
+			    (unsigned short)(param & 0x0f);
 			return 0;
-		OUT(FDGETMAXERRS, &UDP->max_errors);
-		IN(FDSETMAXERRS, &UDP->max_errors, max_errors);
+			OUT(FDGETMAXERRS, &UDP->max_errors);
+			IN(FDSETMAXERRS, &UDP->max_errors, max_errors);
 
 		case FDGETDRVTYP:
-			outparam = drive_name(type,drive);
-			SUPBOUND(size,strlen(outparam)+1);
+			outparam = drive_name(type, drive);
+			SUPBOUND(size, strlen(outparam) + 1);
 			break;
 
-		IN(FDSETDRVPRM, UDP, dp);
-		OUT(FDGETDRVPRM, UDP);
+			IN(FDSETDRVPRM, UDP, dp);
+			OUT(FDGETDRVPRM, UDP);
 
 		case FDPOLLDRVSTAT:
-			LOCK_FDC(drive,1);
+			LOCK_FDC(drive, 1);
 			CALL(poll_drive(1, FD_RAW_NEED_DISK));
 			process_fd_request();
 			/* fall through */
-	       	OUT(FDGETDRVSTAT, UDRS);
+			OUT(FDGETDRVSTAT, UDRS);
 
 		case FDRESET:
 			return user_reset_fdc(drive, (int)param, 1);
 
-		OUT(FDGETFDCSTAT,UFDCS);
+			OUT(FDGETFDCSTAT, UFDCS);
 
 		case FDWERRORCLR:
 			CLEARSTRUCT(UDRWE);
 			return 0;
-		OUT(FDWERRORGET,UDRWE);
+			OUT(FDWERRORGET, UDRWE);
 
 		case FDRAWCMD:
 			if (type)
 				return -EINVAL;
-			LOCK_FDC(drive,1);
+			LOCK_FDC(drive, 1);
 			set_floppy(drive);
-			CALL(i = raw_cmd_ioctl(cmd,(void *) param));
+			CALL(i = raw_cmd_ioctl(cmd, (void *)param));
 			process_fd_request();
 			return i;
 
 		case FDTWADDLE:
-			LOCK_FDC(drive,1);
+			LOCK_FDC(drive, 1);
 			twaddle();
 			process_fd_request();
 			return 0;
 
 		default:
 			return -EINVAL;
-	}
+		}
 
 	if (_IOC_DIR(cmd) & _IOC_READ)
 		return fd_copyout((void *)param, outparam, size);
@@ -3637,21 +3650,21 @@ static int fd_ioctl(struct inode *inode,
 
 static void __init config_types(void)
 {
-	int first=1;
+	int first = 1;
 	int drive;
 
 	/* read drive info out of physical CMOS */
-	drive=0;
+	drive = 0;
 	if (!UDP->cmos)
 		UDP->cmos = FLOPPY0_TYPE;
-	drive=1;
+	drive = 1;
 	if (!UDP->cmos && FLOPPY1_TYPE)
 		UDP->cmos = FLOPPY1_TYPE;
 
 	/* XXX */
 	/* additional physical CMOS drive detection should go here */
 
-	for (drive=0; drive < N_DRIVE; drive++){
+	for (drive = 0; drive < N_DRIVE; drive++) {
 		unsigned int type = UDP->cmos;
 		struct floppy_drive_params *params;
 		const char *name = NULL;
@@ -3662,8 +3675,7 @@ static void __init config_types(void)
 			if (type) {
 				name = default_drive_params[type].name;
 				allowed_drive_mask |= 1 << drive;
-			}
-			else
+			} else
 				allowed_drive_mask &= ~(1 << drive);
 		} else {
 			params = &default_drive_params[0].params;
@@ -3671,13 +3683,13 @@ static void __init config_types(void)
 			name = temparea;
 		}
 		if (name) {
-			const char * prepend = ",";
+			const char *prepend = ",";
 			if (first) {
 				prepend = KERN_INFO "Floppy drive(s):";
 				first = 0;
 			}
 			printk("%s fd%d is %s", prepend, drive, name);
-			register_devfs_entries (drive);
+			register_devfs_entries(drive);
 		}
 		*UDP = *params;
 	}
@@ -3685,13 +3697,13 @@ static void __init config_types(void)
 		printk("\n");
 }
 
-static int floppy_release(struct inode * inode, struct file * filp)
+static int floppy_release(struct inode *inode, struct file *filp)
 {
 	int drive = (long)inode->i_bdev->bd_disk->private_data;
 
 	down(&open_lock);
 	if (UDRS->fd_ref < 0)
-		UDRS->fd_ref=0;
+		UDRS->fd_ref = 0;
 	else if (!UDRS->fd_ref--) {
 		DPRINT("floppy_release with fd_ref == 0");
 		UDRS->fd_ref = 0;
@@ -3708,7 +3720,7 @@ static int floppy_release(struct inode *
  * /dev/PS0 etc), and disallows simultaneous access to the same
  * drive with different device numbers.
  */
-static int floppy_open(struct inode * inode, struct file * filp)
+static int floppy_open(struct inode *inode, struct file *filp)
 {
 	int drive = (long)inode->i_bdev->bd_disk->private_data;
 	int old_dev;
@@ -3716,19 +3728,18 @@ static int floppy_open(struct inode * in
 	int res = -EBUSY;
 	char *tmp;
 
-	filp->private_data = (void*) 0;
+	filp->private_data = (void *)0;
 	down(&open_lock);
 	old_dev = UDRS->fd_device;
 	if (opened_bdev[drive] && opened_bdev[drive] != inode->i_bdev)
 		goto out2;
 
-	if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)){
+	if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)) {
 		USETF(FD_DISK_CHANGED);
 		USETF(FD_VERIFY);
 	}
 
-	if (UDRS->fd_ref == -1 ||
-	   (UDRS->fd_ref && (filp->f_flags & O_EXCL)))
+	if (UDRS->fd_ref == -1 || (UDRS->fd_ref && (filp->f_flags & O_EXCL)))
 		goto out2;
 
 	if (floppy_grab_irq_and_dma())
@@ -3743,19 +3754,19 @@ static int floppy_open(struct inode * in
 
 	res = -ENXIO;
 
-	if (!floppy_track_buffer){
+	if (!floppy_track_buffer) {
 		/* if opening an ED drive, reserve a big buffer,
 		 * else reserve a small one */
 		if ((UDP->cmos == 6) || (UDP->cmos == 5))
-			try = 64; /* Only 48 actually useful */
+			try = 64;	/* Only 48 actually useful */
 		else
-			try = 32; /* Only 24 actually useful */
+			try = 32;	/* Only 24 actually useful */
 
-		tmp=(char *)fd_dma_mem_alloc(1024 * try);
+		tmp = (char *)fd_dma_mem_alloc(1024 * try);
 		if (!tmp && !floppy_track_buffer) {
-			try >>= 1; /* buffer only one side */
+			try >>= 1;	/* buffer only one side */
 			INFBOUND(try, 16);
-			tmp= (char *)fd_dma_mem_alloc(1024*try);
+			tmp = (char *)fd_dma_mem_alloc(1024 * try);
 		}
 		if (!tmp && !floppy_track_buffer) {
 			fallback_on_nodma_alloc(&tmp, 2048 * try);
@@ -3766,7 +3777,7 @@ static int floppy_open(struct inode * in
 		}
 		if (floppy_track_buffer) {
 			if (tmp)
-				fd_dma_mem_free((unsigned long)tmp,try*1024);
+				fd_dma_mem_free((unsigned long)tmp, try * 1024);
 		} else {
 			buffer_min = buffer_max = -1;
 			floppy_track_buffer = tmp;
@@ -3784,8 +3795,9 @@ static int floppy_open(struct inode * in
 	/* Allow ioctls if we have write-permissions even if read-only open.
 	 * Needed so that programs such as fdrawcmd still can work on write
 	 * protected disks */
-	if (filp->f_mode & 2 || permission(filp->f_dentry->d_inode,2,NULL) == 0)
-	    filp->private_data = (void*) 8;
+	if (filp->f_mode & 2
+	    || permission(filp->f_dentry->d_inode, 2, NULL) == 0)
+		filp->private_data = (void *)8;
 
 	if (UFDCS->rawcmd == 1)
 		UFDCS->rawcmd = 2;
@@ -3805,7 +3817,7 @@ static int floppy_open(struct inode * in
 	return 0;
 out:
 	if (UDRS->fd_ref < 0)
-		UDRS->fd_ref=0;
+		UDRS->fd_ref = 0;
 	else
 		UDRS->fd_ref--;
 	if (!UDRS->fd_ref)
@@ -3827,20 +3839,20 @@ static int check_floppy_change(struct ge
 		return 1;
 
 	if (UDP->checkfreq < (int)(jiffies - UDRS->last_checked)) {
-		if(floppy_grab_irq_and_dma()) {
+		if (floppy_grab_irq_and_dma()) {
 			return 1;
 		}
 
-		lock_fdc(drive,0);
-		poll_drive(0,0);
+		lock_fdc(drive, 0);
+		poll_drive(0, 0);
 		process_fd_request();
 		floppy_release_irq_and_dma();
 	}
 
 	if (UTESTF(FD_DISK_CHANGED) ||
-	   UTESTF(FD_VERIFY) ||
-	   test_bit(drive, &fake_change) ||
-	   (!ITYPE(UDRS->fd_device) && !current_type[drive]))
+	    UTESTF(FD_VERIFY) ||
+	    test_bit(drive, &fake_change) ||
+	    (!ITYPE(UDRS->fd_device) && !current_type[drive]))
 		return 1;
 	return 0;
 }
@@ -3851,12 +3863,13 @@ static int check_floppy_change(struct ge
  * a disk in the drive, and whether that disk is writable.
  */
 
-static int floppy_rb0_complete(struct bio *bio, unsigned int bytes_done, int err)
+static int floppy_rb0_complete(struct bio *bio, unsigned int bytes_done,
+			       int err)
 {
 	if (bio->bi_size)
 		return 1;
 
-	complete((struct completion*)bio->bi_private);
+	complete((struct completion *)bio->bi_private);
 	return 0;
 }
 
@@ -3908,23 +3921,21 @@ static int __floppy_read_block_0(struct 
  * geometry formats */
 static int floppy_revalidate(struct gendisk *disk)
 {
-	int drive=(long)disk->private_data;
+	int drive = (long)disk->private_data;
 #define NO_GEOM (!current_type[drive] && !ITYPE(UDRS->fd_device))
 	int cf;
 	int res = 0;
 
 	if (UTESTF(FD_DISK_CHANGED) ||
-	    UTESTF(FD_VERIFY) ||
-	    test_bit(drive, &fake_change) ||
-	    NO_GEOM){
-		if(usage_count == 0) {
+	    UTESTF(FD_VERIFY) || test_bit(drive, &fake_change) || NO_GEOM) {
+		if (usage_count == 0) {
 			printk("VFS: revalidate called on non-open device.\n");
 			return -EFAULT;
 		}
-		lock_fdc(drive,0);
+		lock_fdc(drive, 0);
 		cf = UTESTF(FD_DISK_CHANGED) || UTESTF(FD_VERIFY);
-		if (!(cf || test_bit(drive, &fake_change) || NO_GEOM)){
-			process_fd_request(); /*already done by another thread*/
+		if (!(cf || test_bit(drive, &fake_change) || NO_GEOM)) {
+			process_fd_request();	/*already done by another thread */
 			return 0;
 		}
 		UDRS->maxblock = 0;
@@ -3935,7 +3946,7 @@ static int floppy_revalidate(struct gend
 		UCLEARF(FD_DISK_CHANGED);
 		if (cf)
 			UDRS->generation++;
-		if (NO_GEOM){
+		if (NO_GEOM) {
 			/* auto-sensing */
 			res = __floppy_read_block_0(opened_bdev[drive]);
 		} else {
@@ -3954,22 +3965,24 @@ static struct block_device_operations fl
 	.release	= floppy_release,
 	.ioctl		= fd_ioctl,
 	.media_changed	= check_floppy_change,
-	.revalidate_disk= floppy_revalidate,
+	.revalidate_disk = floppy_revalidate,
 };
-static char *table[] =
-{"", "d360", "h1200", "u360", "u720", "h360", "h720",
-"u1440", "u2880", "CompaQ", "h1440", "u1680", "h410",
-"u820", "h1476", "u1722", "h420", "u830", "h1494", "u1743",
-"h880", "u1040", "u1120", "h1600", "u1760", "u1920",
-"u3200", "u3520", "u3840", "u1840", "u800", "u1600",
-NULL
+static char *table[] = {
+	"", "d360", "h1200", "u360", "u720", "h360", "h720",
+	"u1440", "u2880", "CompaQ", "h1440", "u1680", "h410",
+	"u820", "h1476", "u1722", "h420", "u830", "h1494", "u1743",
+	"h880", "u1040", "u1120", "h1600", "u1760", "u1920",
+	"u3200", "u3520", "u3840", "u1840", "u800", "u1600",
+	NULL
 };
-static int t360[] = {1,0}, t1200[] = {2,5,6,10,12,14,16,18,20,23,0},
-t3in[] = {8,9,26,27,28, 7,11,15,19,24,25,29,31, 3,4,13,17,21,22,30,0};
-static int *table_sup[] = 
-{NULL, t360, t1200, t3in+5+8, t3in+5, t3in, t3in};
+static int t360[] = { 1, 0 },
+	t1200[] = { 2, 5, 6, 10, 12, 14, 16, 18, 20, 23, 0 },
+	t3in[] = { 8, 9, 26, 27, 28, 7, 11, 15, 19, 24, 25, 29, 31, 3, 4, 13,
+			17, 21, 22, 30, 0 };
+static int *table_sup[] =
+    { NULL, t360, t1200, t3in + 5 + 8, t3in + 5, t3in, t3in };
 
-static void __init register_devfs_entries (int drive)
+static void __init register_devfs_entries(int drive)
 {
 	int base_minor = (drive < 4) ? drive : (124 + drive);
 
@@ -3978,10 +3991,10 @@ static void __init register_devfs_entrie
 		do {
 			int minor = base_minor + (table_sup[UDP->cmos][i] << 2);
 
-			devfs_mk_bdev(MKDEV(FLOPPY_MAJOR, minor), 
-					S_IFBLK|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP,
-					"floppy/%d%s",
-					drive, table[table_sup[UDP->cmos][i]]);
+			devfs_mk_bdev(MKDEV(FLOPPY_MAJOR, minor),
+				      S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP |
+				      S_IWGRP, "floppy/%d%s", drive,
+				      table[table_sup[UDP->cmos][i]]);
 		} while (table_sup[UDP->cmos][i++]);
 	}
 }
@@ -4002,19 +4015,20 @@ static char __init get_fdc_version(void)
 		return FDC_NONE;
 	if ((r = result()) <= 0x00)
 		return FDC_NONE;	/* No FDC present ??? */
-	if ((r==1) && (reply_buffer[0] == 0x80)){
-		printk(KERN_INFO "FDC %d is an 8272A\n",fdc);
+	if ((r == 1) && (reply_buffer[0] == 0x80)) {
+		printk(KERN_INFO "FDC %d is an 8272A\n", fdc);
 		return FDC_8272A;	/* 8272a/765 don't know DUMPREGS */
 	}
 	if (r != 10) {
-		printk("FDC %d init: DUMPREGS: unexpected return of %d bytes.\n",
-		       fdc, r);
+		printk
+		    ("FDC %d init: DUMPREGS: unexpected return of %d bytes.\n",
+		     fdc, r);
 		return FDC_UNKNOWN;
 	}
 
 	if (!fdc_configure()) {
-		printk(KERN_INFO "FDC %d is an 82072\n",fdc);
-		return FDC_82072;      	/* 82072 doesn't know CONFIGURE */
+		printk(KERN_INFO "FDC %d is an 82072\n", fdc);
+		return FDC_82072;	/* 82072 doesn't know CONFIGURE */
 	}
 
 	output_byte(FD_PERPENDICULAR);
@@ -4027,7 +4041,7 @@ static char __init get_fdc_version(void)
 
 	output_byte(FD_UNLOCK);
 	r = result();
-	if ((r == 1) && (reply_buffer[0] == 0x80)){
+	if ((r == 1) && (reply_buffer[0] == 0x80)) {
 		printk(KERN_INFO "FDC %d is a pre-1991 82077\n", fdc);
 		return FDC_82077_ORIG;	/* Pre-1991 82077, doesn't know 
 					 * LOCK/UNLOCK */
@@ -4045,37 +4059,39 @@ static char __init get_fdc_version(void)
 		return FDC_UNKNOWN;
 	}
 	if (reply_buffer[0] == 0x80) {
-		printk(KERN_INFO "FDC %d is a post-1991 82077\n",fdc);
+		printk(KERN_INFO "FDC %d is a post-1991 82077\n", fdc);
 		return FDC_82077;	/* Revised 82077AA passes all the tests */
 	}
 	switch (reply_buffer[0] >> 5) {
-		case 0x0:
-			/* Either a 82078-1 or a 82078SL running at 5Volt */
-			printk(KERN_INFO "FDC %d is an 82078.\n",fdc);
-			return FDC_82078;
-		case 0x1:
-			printk(KERN_INFO "FDC %d is a 44pin 82078\n",fdc);
-			return FDC_82078;
-		case 0x2:
-			printk(KERN_INFO "FDC %d is a S82078B\n", fdc);
-			return FDC_S82078B;
-		case 0x3:
-			printk(KERN_INFO "FDC %d is a National Semiconductor PC87306\n", fdc);
-			return FDC_87306;
-		default:
-			printk(KERN_INFO "FDC %d init: 82078 variant with unknown PARTID=%d.\n",
-			       fdc, reply_buffer[0] >> 5);
-			return FDC_82078_UNKN;
+	case 0x0:
+		/* Either a 82078-1 or a 82078SL running at 5Volt */
+		printk(KERN_INFO "FDC %d is an 82078.\n", fdc);
+		return FDC_82078;
+	case 0x1:
+		printk(KERN_INFO "FDC %d is a 44pin 82078\n", fdc);
+		return FDC_82078;
+	case 0x2:
+		printk(KERN_INFO "FDC %d is a S82078B\n", fdc);
+		return FDC_S82078B;
+	case 0x3:
+		printk(KERN_INFO "FDC %d is a National Semiconductor PC87306\n",
+		       fdc);
+		return FDC_87306;
+	default:
+		printk(KERN_INFO
+		       "FDC %d init: 82078 variant with unknown PARTID=%d.\n",
+		       fdc, reply_buffer[0] >> 5);
+		return FDC_82078_UNKN;
 	}
-} /* get_fdc_version */
+}				/* get_fdc_version */
 
 /* lilo configuration */
 
-static void __init floppy_set_flags(int *ints,int param, int param2)
+static void __init floppy_set_flags(int *ints, int param, int param2)
 {
 	int i;
 
-	for (i=0; i < ARRAY_SIZE(default_drive_params); i++){
+	for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
 		if (param)
 			default_drive_params[i].params.flags |= param2;
 		else
@@ -4084,17 +4100,20 @@ static void __init floppy_set_flags(int 
 	DPRINT("%s flag 0x%x\n", param2 ? "Setting" : "Clearing", param);
 }
 
-static void __init daring(int *ints,int param, int param2)
+static void __init daring(int *ints, int param, int param2)
 {
 	int i;
 
-	for (i=0; i < ARRAY_SIZE(default_drive_params); i++){
-		if (param){
+	for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
+		if (param) {
 			default_drive_params[i].params.select_delay = 0;
-			default_drive_params[i].params.flags |= FD_SILENT_DCL_CLEAR;
+			default_drive_params[i].params.flags |=
+			    FD_SILENT_DCL_CLEAR;
 		} else {
-			default_drive_params[i].params.select_delay = 2*HZ/100;
-			default_drive_params[i].params.flags &= ~FD_SILENT_DCL_CLEAR;
+			default_drive_params[i].params.select_delay =
+			    2 * HZ / 100;
+			default_drive_params[i].params.flags &=
+			    ~FD_SILENT_DCL_CLEAR;
 		}
 	}
 	DPRINT("Assuming %s floppy hardware\n", param ? "standard" : "broken");
@@ -4102,14 +4121,14 @@ static void __init daring(int *ints,int 
 
 static void __init set_cmos(int *ints, int dummy, int dummy2)
 {
-	int current_drive=0;
+	int current_drive = 0;
 
-	if (ints[0] != 2){
+	if (ints[0] != 2) {
 		DPRINT("wrong number of parameters for CMOS\n");
 		return;
 	}
 	current_drive = ints[1];
-	if (current_drive < 0 || current_drive >= 8){
+	if (current_drive < 0 || current_drive >= 8) {
 		DPRINT("bad drive for set_cmos\n");
 		return;
 	}
@@ -4123,43 +4142,37 @@ static void __init set_cmos(int *ints, i
 
 static struct param_table {
 	const char *name;
-	void (*fn)(int *ints, int param, int param2);
+	void (*fn) (int *ints, int param, int param2);
 	int *var;
 	int def_param;
 	int param2;
-} config_params[]={
-	{ "allowed_drive_mask", 0, &allowed_drive_mask, 0xff, 0}, /* obsolete */
-	{ "all_drives", 0, &allowed_drive_mask, 0xff, 0 }, /* obsolete */
-	{ "asus_pci", 0, &allowed_drive_mask, 0x33, 0},
-
-	{ "irq", 0, &FLOPPY_IRQ, 6, 0 },
-	{ "dma", 0, &FLOPPY_DMA, 2, 0 },
-
-	{ "daring", daring, 0, 1, 0},
+} config_params[] = {
+	{"allowed_drive_mask", 0, &allowed_drive_mask, 0xff, 0}, /* obsolete */
+	{"all_drives", 0, &allowed_drive_mask, 0xff, 0},	/* obsolete */
+	{"asus_pci", 0, &allowed_drive_mask, 0x33, 0},
+	{"irq", 0, &FLOPPY_IRQ, 6, 0},
+	{"dma", 0, &FLOPPY_DMA, 2, 0},
+	{"daring", daring, 0, 1, 0},
 #if N_FDC > 1
-	{ "two_fdc",  0, &FDC2, 0x370, 0 },
-	{ "one_fdc", 0, &FDC2, 0, 0 },
+	{"two_fdc", 0, &FDC2, 0x370, 0},
+	{"one_fdc", 0, &FDC2, 0, 0},
 #endif
-	{ "thinkpad", floppy_set_flags, 0, 1, FD_INVERTED_DCL },
-	{ "broken_dcl", floppy_set_flags, 0, 1, FD_BROKEN_DCL },
-	{ "messages", floppy_set_flags, 0, 1, FTD_MSG },
-	{ "silent_dcl_clear", floppy_set_flags, 0, 1, FD_SILENT_DCL_CLEAR },
-	{ "debug", floppy_set_flags, 0, 1, FD_DEBUG },
-
-	{ "nodma", 0, &can_use_virtual_dma, 1, 0 },
-	{ "omnibook", 0, &can_use_virtual_dma, 1, 0 },
-	{ "yesdma", 0, &can_use_virtual_dma, 0, 0 },
-
-	{ "fifo_depth", 0, &fifo_depth, 0xa, 0 },
-	{ "nofifo", 0, &no_fifo, 0x20, 0 },
-	{ "usefifo", 0, &no_fifo, 0, 0 },
-
-	{ "cmos", set_cmos, 0, 0, 0 },
-	{ "slow", 0, &slow_floppy, 1, 0 },
-
-	{ "unexpected_interrupts", 0, &print_unex, 1, 0 },
-	{ "no_unexpected_interrupts", 0, &print_unex, 0, 0 },
-	{ "L40SX", 0, &print_unex, 0, 0 }
+	{"thinkpad", floppy_set_flags, 0, 1, FD_INVERTED_DCL},
+	{"broken_dcl", floppy_set_flags, 0, 1, FD_BROKEN_DCL},
+	{"messages", floppy_set_flags, 0, 1, FTD_MSG},
+	{"silent_dcl_clear", floppy_set_flags, 0, 1, FD_SILENT_DCL_CLEAR},
+	{"debug", floppy_set_flags, 0, 1, FD_DEBUG},
+	{"nodma", 0, &can_use_virtual_dma, 1, 0},
+	{"omnibook", 0, &can_use_virtual_dma, 1, 0},
+	{"yesdma", 0, &can_use_virtual_dma, 0, 0},
+	{"fifo_depth", 0, &fifo_depth, 0xa, 0},
+	{"nofifo", 0, &no_fifo, 0x20, 0},
+	{"usefifo", 0, &no_fifo, 0, 0},
+	{"cmos", set_cmos, 0, 0, 0},
+	{"slow", 0, &slow_floppy, 1, 0},
+	{"unexpected_interrupts", 0, &print_unex, 1, 0},
+	{"no_unexpected_interrupts", 0, &print_unex, 0, 0},
+	{"L40SX", 0, &print_unex, 0, 0}
 
 	EXTRA_FLOPPY_PARAMS
 };
@@ -4170,18 +4183,18 @@ static int __init floppy_setup(char *str
 	int param;
 	int ints[11];
 
-	str = get_options(str,ARRAY_SIZE(ints),ints);
+	str = get_options(str, ARRAY_SIZE(ints), ints);
 	if (str) {
-		for (i=0; i< ARRAY_SIZE(config_params); i++){
-			if (strcmp(str,config_params[i].name) == 0){
+		for (i = 0; i < ARRAY_SIZE(config_params); i++) {
+			if (strcmp(str, config_params[i].name) == 0) {
 				if (ints[0])
 					param = ints[1];
 				else
 					param = config_params[i].def_param;
 				if (config_params[i].fn)
 					config_params[i].
-						fn(ints,param,
-						   config_params[i].param2);
+					    fn(ints, param,
+					       config_params[i].param2);
 				if (config_params[i].var) {
 					DPRINT("%s=%d\n", str, param);
 					*config_params[i].var = param;
@@ -4192,10 +4205,10 @@ static int __init floppy_setup(char *str
 	}
 	if (str) {
 		DPRINT("unknown floppy option [%s]\n", str);
-		
+
 		DPRINT("allowed options are:");
-		for (i=0; i< ARRAY_SIZE(config_params); i++)
-			printk(" %s",config_params[i].name);
+		for (i = 0; i < ARRAY_SIZE(config_params); i++)
+			printk(" %s", config_params[i].name);
 		printk("\n");
 	} else
 		DPRINT("botched floppy option\n");
@@ -4203,7 +4216,7 @@ static int __init floppy_setup(char *str
 	return 0;
 }
 
-static int have_no_fdc= -ENODEV;
+static int have_no_fdc = -ENODEV;
 
 static void floppy_device_release(struct device *dev)
 {
@@ -4215,12 +4228,12 @@ static struct platform_device floppy_dev
 	.id		= 0,
 	.dev		= {
 			.release = floppy_device_release,
-	}
+			}
 };
 
 static struct kobject *floppy_find(dev_t dev, int *part, void *data)
 {
-	int drive = (*part&3) | ((*part&0x80) >> 5);
+	int drive = (*part & 3) | ((*part & 0x80) >> 5);
 	if (drive >= N_DRIVE ||
 	    !(allowed_drive_mask & (1 << drive)) ||
 	    fdc_state[FDC(drive)].version == FDC_NONE)
@@ -4233,12 +4246,12 @@ static struct kobject *floppy_find(dev_t
 
 int __init floppy_init(void)
 {
-	int i,unit,drive;
+	int i, unit, drive;
 	int err;
 
 	raw_cmd = NULL;
 
-	for (i=0; i<N_DRIVE; i++) {
+	for (i = 0; i < N_DRIVE; i++) {
 		disks[i] = alloc_disk(1);
 		if (!disks[i])
 			goto Enomem;
@@ -4253,8 +4266,8 @@ int __init floppy_init(void)
 		motor_off_timer[i].function = motor_off_callback;
 	}
 
-	devfs_mk_dir ("floppy");
-	if ((err = register_blkdev(FLOPPY_MAJOR,"fd")))
+	devfs_mk_dir("floppy");
+	if ((err = register_blkdev(FLOPPY_MAJOR, "fd")))
 		goto out;
 
 	floppy_queue = blk_init_queue(do_fd_request, &floppy_lock);
@@ -4265,9 +4278,9 @@ int __init floppy_init(void)
 	}
 
 	blk_register_region(MKDEV(FLOPPY_MAJOR, 0), 256, THIS_MODULE,
-				floppy_find, NULL, NULL);
+			    floppy_find, NULL, NULL);
 
-	for (i=0; i<256; i++)
+	for (i = 0; i < 256; i++)
 		if (ITYPE(i))
 			floppy_sizes[i] = floppy_type[ITYPE(i)].size;
 		else
@@ -4282,11 +4295,11 @@ int __init floppy_init(void)
 		FDCS->dtr = -1;
 		FDCS->dor = 0x4;
 #if defined(__sparc__) || defined(__mc68000__)
-		/*sparcs/sun3x don't have a DOR reset which we can fall back on to*/
+		/*sparcs/sun3x don't have a DOR reset which we can fall back on to */
 #ifdef __mc68000__
 		if (MACH_IS_SUN3X)
 #endif
-			FDCS->version = FDC_82072A;		
+			FDCS->version = FDC_82072A;
 #endif
 	}
 
@@ -4300,8 +4313,8 @@ int __init floppy_init(void)
 	fdc_state[1].address = FDC2;
 #endif
 
-	fdc = 0; /* reset fdc in case of unexpected interrupt */
-	if (floppy_grab_irq_and_dma()){
+	fdc = 0;		/* reset fdc in case of unexpected interrupt */
+	if (floppy_grab_irq_and_dma()) {
 		err = -EBUSY;
 		goto out1;
 	}
@@ -4321,25 +4334,25 @@ int __init floppy_init(void)
 	for (i = 0; i < N_FDC; i++) {
 		fdc = i;
 		FDCS->driver_version = FD_DRIVER_VERSION;
-		for (unit=0; unit<4; unit++)
+		for (unit = 0; unit < 4; unit++)
 			FDCS->track[unit] = 0;
 		if (FDCS->address == -1)
 			continue;
 		FDCS->rawcmd = 2;
-		if (user_reset_fdc(-1,FD_RESET_ALWAYS,0)){
- 			/* free ioports reserved by floppy_grab_irq_and_dma() */
- 			release_region(FDCS->address+2, 4);
- 			release_region(FDCS->address+7, 1);
+		if (user_reset_fdc(-1, FD_RESET_ALWAYS, 0)) {
+			/* free ioports reserved by floppy_grab_irq_and_dma() */
+			release_region(FDCS->address + 2, 4);
+			release_region(FDCS->address + 7, 1);
 			FDCS->address = -1;
 			FDCS->version = FDC_NONE;
 			continue;
 		}
 		/* Try to determine the floppy controller type */
 		FDCS->version = get_fdc_version();
-		if (FDCS->version == FDC_NONE){
- 			/* free ioports reserved by floppy_grab_irq_and_dma() */
- 			release_region(FDCS->address+2, 4);
- 			release_region(FDCS->address+7, 1);
+		if (FDCS->version == FDC_NONE) {
+			/* free ioports reserved by floppy_grab_irq_and_dma() */
+			release_region(FDCS->address + 2, 4);
+			release_region(FDCS->address + 7, 1);
 			FDCS->address = -1;
 			continue;
 		}
@@ -4351,13 +4364,13 @@ int __init floppy_init(void)
 		 * properly, so force a reset for the standard FDC clones,
 		 * to avoid interrupt garbage.
 		 */
-		user_reset_fdc(-1,FD_RESET_ALWAYS,0);
+		user_reset_fdc(-1, FD_RESET_ALWAYS, 0);
 	}
-	fdc=0;
+	fdc = 0;
 	del_timer(&fd_timeout);
 	current_drive = 0;
 	floppy_release_irq_and_dma();
-	initialising=0;
+	initialising = 0;
 	if (have_no_fdc) {
 		DPRINT("no floppy controllers found\n");
 		flush_scheduled_work();
@@ -4366,14 +4379,14 @@ int __init floppy_init(void)
 		err = have_no_fdc;
 		goto out2;
 	}
-	
+
 	for (drive = 0; drive < N_DRIVE; drive++) {
 		if (!(allowed_drive_mask & (1 << drive)))
 			continue;
 		if (fdc_state[FDC(drive)].version == FDC_NONE)
 			continue;
 		/* to be cleaned up... */
-		disks[drive]->private_data = (void*)(long)drive;
+		disks[drive]->private_data = (void *)(long)drive;
 		disks[drive]->queue = floppy_queue;
 		disks[drive]->flags |= GENHD_FL_REMOVABLE;
 		add_disk(disks[drive]);
@@ -4388,9 +4401,9 @@ out2:
 	blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
 	blk_cleanup_queue(floppy_queue);
 fail_queue:
-	unregister_blkdev(FLOPPY_MAJOR,"fd");
+	unregister_blkdev(FLOPPY_MAJOR, "fd");
 out:
-	for (i=0; i<N_DRIVE; i++)
+	for (i = 0; i < N_DRIVE; i++)
 		put_disk(disks[i]);
 	devfs_remove("floppy");
 	return err;
@@ -4408,14 +4421,14 @@ static int floppy_grab_irq_and_dma(void)
 	unsigned long flags;
 
 	spin_lock_irqsave(&floppy_usage_lock, flags);
-	if (usage_count++){
+	if (usage_count++) {
 		spin_unlock_irqrestore(&floppy_usage_lock, flags);
 		return 0;
 	}
 	spin_unlock_irqrestore(&floppy_usage_lock, flags);
 	if (fd_request_irq()) {
 		DPRINT("Unable to grab IRQ%d for the floppy driver\n",
-			FLOPPY_IRQ);
+		       FLOPPY_IRQ);
 		spin_lock_irqsave(&floppy_usage_lock, flags);
 		usage_count--;
 		spin_unlock_irqrestore(&floppy_usage_lock, flags);
@@ -4423,7 +4436,7 @@ static int floppy_grab_irq_and_dma(void)
 	}
 	if (fd_request_dma()) {
 		DPRINT("Unable to grab DMA%d for the floppy driver\n",
-			FLOPPY_DMA);
+		       FLOPPY_DMA);
 		fd_free_irq();
 		spin_lock_irqsave(&floppy_usage_lock, flags);
 		usage_count--;
@@ -4431,35 +4444,37 @@ static int floppy_grab_irq_and_dma(void)
 		return -1;
 	}
 
-	for (fdc=0; fdc< N_FDC; fdc++){
-		if (FDCS->address != -1){
-			if (!request_region(FDCS->address+2, 4, "floppy")) {
-				DPRINT("Floppy io-port 0x%04lx in use\n", FDCS->address + 2);
+	for (fdc = 0; fdc < N_FDC; fdc++) {
+		if (FDCS->address != -1) {
+			if (!request_region(FDCS->address + 2, 4, "floppy")) {
+				DPRINT("Floppy io-port 0x%04lx in use\n",
+				       FDCS->address + 2);
 				goto cleanup1;
 			}
-			if (!request_region(FDCS->address+7, 1, "floppy DIR")) {
-				DPRINT("Floppy io-port 0x%04lx in use\n", FDCS->address + 7);
+			if (!request_region(FDCS->address + 7, 1, "floppy DIR")) {
+				DPRINT("Floppy io-port 0x%04lx in use\n",
+				       FDCS->address + 7);
 				goto cleanup2;
 			}
 			/* address + 6 is reserved, and may be taken by IDE.
 			 * Unfortunately, Adaptec doesn't know this :-(, */
 		}
 	}
-	for (fdc=0; fdc< N_FDC; fdc++){
-		if (FDCS->address != -1){
+	for (fdc = 0; fdc < N_FDC; fdc++) {
+		if (FDCS->address != -1) {
 			reset_fdc_info(1);
 			fd_outb(FDCS->dor, FD_DOR);
 		}
 	}
 	fdc = 0;
-	set_dor(0, ~0, 8);  /* avoid immediate interrupt */
+	set_dor(0, ~0, 8);	/* avoid immediate interrupt */
 
 	for (fdc = 0; fdc < N_FDC; fdc++)
 		if (FDCS->address != -1)
 			fd_outb(FDCS->dor, FD_DOR);
 	/*
-	 *	The driver will try and free resources and relies on us
-	 *	to know if they were allocated or not.
+	 *      The driver will try and free resources and relies on us
+	 *      to know if they were allocated or not.
 	 */
 	fdc = 0;
 	irqdma_allocated = 1;
@@ -4469,7 +4484,7 @@ cleanup2:
 cleanup1:
 	fd_free_irq();
 	fd_free_dma();
-	while(--fdc >= 0) {
+	while (--fdc >= 0) {
 		release_region(FDCS->address + 2, 4);
 		release_region(FDCS->address + 7, 1);
 	}
@@ -4492,17 +4507,16 @@ static void floppy_release_irq_and_dma(v
 	unsigned long flags;
 
 	spin_lock_irqsave(&floppy_usage_lock, flags);
-	if (--usage_count){
+	if (--usage_count) {
 		spin_unlock_irqrestore(&floppy_usage_lock, flags);
 		return;
 	}
 	spin_unlock_irqrestore(&floppy_usage_lock, flags);
-	if(irqdma_allocated)
-	{
+	if (irqdma_allocated) {
 		fd_disable_dma();
 		fd_free_dma();
 		fd_free_irq();
-		irqdma_allocated=0;
+		irqdma_allocated = 0;
 	}
 	set_dor(0, ~0, 8);
 #if N_FDC > 1
@@ -4511,17 +4525,16 @@ static void floppy_release_irq_and_dma(v
 	floppy_enable_hlt();
 
 	if (floppy_track_buffer && max_buffer_sectors) {
-		tmpsize = max_buffer_sectors*1024;
+		tmpsize = max_buffer_sectors * 1024;
 		tmpaddr = (unsigned long)floppy_track_buffer;
 		floppy_track_buffer = NULL;
 		max_buffer_sectors = 0;
 		buffer_min = buffer_max = -1;
 		fd_dma_mem_free(tmpaddr, tmpsize);
 	}
-
 #ifdef FLOPPY_SANITY_CHECK
 #ifndef __sparc__
-	for (drive=0; drive < N_FDC * 4; drive++)
+	for (drive = 0; drive < N_FDC * 4; drive++)
 		if (timer_pending(motor_off_timer + drive))
 			printk("motor off timer %d still active\n", drive);
 #endif
@@ -4536,35 +4549,35 @@ static void floppy_release_irq_and_dma(v
 	old_fdc = fdc;
 	for (fdc = 0; fdc < N_FDC; fdc++)
 		if (FDCS->address != -1) {
-			release_region(FDCS->address+2, 4);
-			release_region(FDCS->address+7, 1);
+			release_region(FDCS->address + 2, 4);
+			release_region(FDCS->address + 7, 1);
 		}
 	fdc = old_fdc;
 }
 
-
 #ifdef MODULE
 
 char *floppy;
 
-static void unregister_devfs_entries (int drive)
+static void unregister_devfs_entries(int drive)
 {
-    int i;
+	int i;
 
-    if (UDP->cmos < NUMBER(default_drive_params)) {
-	i = 0;
-	do {
-	    devfs_remove("floppy/%d%s", drive, table[table_sup[UDP->cmos][i]]);
-	} while (table_sup[UDP->cmos][i++]);
-    }
+	if (UDP->cmos < NUMBER(default_drive_params)) {
+		i = 0;
+		do {
+			devfs_remove("floppy/%d%s", drive,
+				     table[table_sup[UDP->cmos][i]]);
+		} while (table_sup[UDP->cmos][i++]);
+	}
 }
 
 static void __init parse_floppy_cfg_string(char *cfg)
 {
 	char *ptr;
 
-	while(*cfg) {
-		for(ptr = cfg;*cfg && *cfg != ' ' && *cfg != '\t'; cfg++);
+	while (*cfg) {
+		for (ptr = cfg; *cfg && *cfg != ' ' && *cfg != '\t'; cfg++) ;
 		if (*cfg) {
 			*cfg = '\0';
 			cfg++;
@@ -4577,7 +4590,7 @@ static void __init parse_floppy_cfg_stri
 int init_module(void)
 {
 	printk(KERN_INFO "inserting floppy driver for " UTS_RELEASE "\n");
-		
+
 	if (floppy)
 		parse_floppy_cfg_string(floppy);
 	return floppy_init();
@@ -4617,16 +4630,16 @@ void cleanup_module(void)
 	wait_for_completion(&device_release);
 }
 
-MODULE_PARM(floppy,"s");
-MODULE_PARM(FLOPPY_IRQ,"i");
-MODULE_PARM(FLOPPY_DMA,"i");
+MODULE_PARM(floppy, "s");
+MODULE_PARM(FLOPPY_IRQ, "i");
+MODULE_PARM(FLOPPY_DMA, "i");
 MODULE_AUTHOR("Alain L. Knaff");
 MODULE_SUPPORTED_DEVICE("fd");
 MODULE_LICENSE("GPL");
 
 #else
 
-__setup ("floppy=", floppy_setup);
+__setup("floppy=", floppy_setup);
 module_init(floppy_init)
 #endif
 
--- diff/drivers/block/floppy98.c	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/block/floppy98.c	2004-04-21 10:45:33.987536608 +0100
@@ -168,8 +168,11 @@ static int print_unex=1;
 #include <linux/timer.h>
 #include <linux/workqueue.h>
 #include <linux/version.h>
-#define FDPATCHES
 #include <linux/fdreg.h>
+#include <linux/blkdev.h>
+#include <linux/blkpg.h>
+#include <linux/cdrom.h>	/* for the compatibility eject ioctl */
+#include <linux/completion.h>
 
 /*
  * 1998/1/21 -- Richard Gooch <rgooch@atnf.csiro.au> -- devfs support
@@ -179,7 +182,6 @@ static int print_unex=1;
 #include <linux/fd.h>
 #define FLOPPY98_MOTOR_MASK 0x08
 
-#define FDPATCHES
 #include <linux/hdreg.h>
 #define FD98_STATUS	(0 + FD_IOPORT )
 #define FD98_DATA	(2 + FD_IOPORT )
@@ -250,9 +252,10 @@ static int use_virtual_dma;
  */
 
 static spinlock_t floppy_lock = SPIN_LOCK_UNLOCKED;
+static struct completion device_release;
 
 static unsigned short virtual_dma_port=0x3f0;
-void floppy_interrupt(int irq, void *dev_id, struct pt_regs * regs);
+irqreturn_t floppy_interrupt(int irq, void *dev_id, struct pt_regs * regs);
 static int set_mode(char mask, char data);
 static void register_devfs_entries (int drive) __init;
 
@@ -987,9 +990,9 @@ static void empty(void)
 
 static DECLARE_WORK(floppy_work, NULL, NULL);
 
-static void schedule_bh( void (*handler)(void*) )
+static void schedule_bh(void (*handler) (void))
 {
-	PREPARE_WORK(&floppy_work, handler, NULL);
+	PREPARE_WORK(&floppy_work, (void (*)(void *))handler, NULL);
 	schedule_work(&floppy_work);
 }
 
@@ -1627,7 +1630,7 @@ static void print_result(char *message, 
 }
 
 /* interrupt handler. Note that this can be called externally on the Sparc */
-void floppy_interrupt(int irq, void *dev_id, struct pt_regs * regs)
+irqreturn_t floppy_interrupt(int irq, void *dev_id, struct pt_regs * regs)
 {
 	void (*handler)(void) = do_floppy;
 	int do_print;
@@ -1648,7 +1651,7 @@ void floppy_interrupt(int irq, void *dev
 		printk("floppy interrupt on bizarre fdc %d\n",fdc);
 		printk("handler=%p\n", handler);
 		is_alive("bizarre fdc");
-		return;
+		return IRQ_NONE;
 	}
 
 	FDCS->reset = 0;
@@ -1661,7 +1664,7 @@ void floppy_interrupt(int irq, void *dev
 	 * activity.
 	 */
 
-	do_print = !handler && !initialising;
+	do_print = !handler && print_unex && !initialising;
 
 	inr = result();
 	if (inr && do_print)
@@ -1701,13 +1704,16 @@ void floppy_interrupt(int irq, void *dev
 		} while ((ST0 & 0x83) != UNIT(current_drive) && inr == 2);
 	}
 	if (handler) {
-		schedule_bh( (void *)(void *) handler);
+		schedule_bh(handler);
 	} else {
 #if 0
 		FDCS->reset = 1;
 #endif
 	}
 	is_alive("normal interrupt end");
+
+	/* FIXME! Was it really for us? */
+	return IRQ_HANDLED;
 }
 
 static void recalibrate_floppy(void)
@@ -4231,11 +4237,16 @@ static int __init floppy_setup(char *str
 
 static int have_no_fdc= -ENODEV;
 
+static void floppy_device_release(struct device *dev)
+{
+	complete(&device_release);
+}
+
 static struct platform_device floppy_device = {
 	.name		= "floppy",
 	.id		= 0,
 	.dev		= {
-		.name	= "Floppy Drive",
+			.release = floppy_device_release,
 	},
 };
 
@@ -4267,10 +4278,8 @@ int __init floppy_init(void)
 	}
 
 	devfs_mk_dir (NULL, "floppy", NULL);
-	if (register_blkdev(FLOPPY_MAJOR,"fd")) {
-		err = -EBUSY;
+	if ((err = register_blkdev(FLOPPY_MAJOR,"fd")))
 		goto out;
-	}
 
 	for (i=0; i<N_DRIVE; i++) {
 		disks[i]->major = FLOPPY_MAJOR;
@@ -4288,7 +4297,7 @@ int __init floppy_init(void)
 		else
 			floppy_sizes[i] = MAX_DISK_SIZE << 1;
 
-	floppy_queue = blk_init_queue(do_fd_request, &floppy_lock)
+	floppy_queue = blk_init_queue(do_fd_request, &floppy_lock);
 	if (!floppy_queue)
 		goto out_queue;
 
@@ -4628,10 +4637,14 @@ void cleanup_module(void)
 {
 	int drive;
 		
+	init_completion(&device_release);
 	platform_device_unregister(&floppy_device);
 	blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
 	unregister_blkdev(FLOPPY_MAJOR, "fd");
+
 	for (drive = 0; drive < N_DRIVE; drive++) {
+		del_timer_sync(&motor_off_timer[drive]);
+
 		if ((allowed_drive_mask & (1 << drive)) &&
 		    fdc_state[FDC(drive)].version != FDC_NONE) {
 			del_gendisk(disks[drive]);
@@ -4641,9 +4654,17 @@ void cleanup_module(void)
 	}
 	devfs_remove("floppy");
 
+	del_timer_sync(&fd_timeout);
+	del_timer_sync(&fd_timer);
 	blk_cleanup_queue(floppy_queue);
+
+	if (usage_count)
+		floppy_release_irq_and_dma();
+
 	/* eject disk, if any */
 	fd_eject(0);
+
+	wait_for_completion(&device_release);
 }
 
 MODULE_PARM(floppy,"s");
--- diff/drivers/block/ll_rw_blk.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/block/ll_rw_blk.c	2004-04-21 10:45:33.988536456 +0100
@@ -27,6 +27,7 @@
 #include <linux/completion.h>
 #include <linux/slab.h>
 #include <linux/swap.h>
+#include <linux/writeback.h>
 
 /*
  * for max sense size
@@ -41,12 +42,6 @@ static void blk_unplug_timeout(unsigned 
  */
 static kmem_cache_t *request_cachep;
 
-/*
- * plug management
- */
-static LIST_HEAD(blk_plug_list);
-static spinlock_t blk_plug_lock __cacheline_aligned_in_smp = SPIN_LOCK_UNLOCKED;
-
 static wait_queue_head_t congestion_wqh[2] = {
 		__WAIT_QUEUE_HEAD_INITIALIZER(congestion_wqh[0]),
 		__WAIT_QUEUE_HEAD_INITIALIZER(congestion_wqh[1])
@@ -250,8 +245,6 @@ void blk_queue_make_request(request_queu
 	 */
 	blk_queue_bounce_limit(q, BLK_BOUNCE_HIGH);
 
-	INIT_LIST_HEAD(&q->plug_list);
-
 	blk_queue_activity_fn(q, NULL, NULL);
 }
 
@@ -1103,13 +1096,11 @@ void blk_plug_device(request_queue_t *q)
 	 * don't plug a stopped queue, it must be paired with blk_start_queue()
 	 * which will restart the queueing
 	 */
-	if (!blk_queue_plugged(q)
-	    && !test_bit(QUEUE_FLAG_STOPPED, &q->queue_flags)) {
-		spin_lock(&blk_plug_lock);
-		list_add_tail(&q->plug_list, &blk_plug_list);
+	if (test_bit(QUEUE_FLAG_STOPPED, &q->queue_flags))
+		return;
+
+	if (!test_and_set_bit(QUEUE_FLAG_PLUGGED, &q->queue_flags))
 		mod_timer(&q->unplug_timer, jiffies + q->unplug_delay);
-		spin_unlock(&blk_plug_lock);
-	}
 }
 
 EXPORT_SYMBOL(blk_plug_device);
@@ -1121,15 +1112,12 @@ EXPORT_SYMBOL(blk_plug_device);
 int blk_remove_plug(request_queue_t *q)
 {
 	WARN_ON(!irqs_disabled());
-	if (blk_queue_plugged(q)) {
-		spin_lock(&blk_plug_lock);
-		list_del_init(&q->plug_list);
-		del_timer(&q->unplug_timer);
-		spin_unlock(&blk_plug_lock);
-		return 1;
-	}
 
-	return 0;
+	if (!test_and_clear_bit(QUEUE_FLAG_PLUGGED, &q->queue_flags))
+		return 0;
+
+	del_timer(&q->unplug_timer);
+	return 1;
 }
 
 EXPORT_SYMBOL(blk_remove_plug);
@@ -1160,24 +1148,32 @@ static inline void __generic_unplug_devi
  *   Linux uses plugging to build bigger requests queues before letting
  *   the device have at them. If a queue is plugged, the I/O scheduler
  *   is still adding and merging requests on the queue. Once the queue
- *   gets unplugged (either by manually calling this function, or by
- *   calling blk_run_queues()), the request_fn defined for the
- *   queue is invoked and transfers started.
+ *   gets unplugged, the request_fn defined for the queue is invoked and
+ *   transfers started.
  **/
-void generic_unplug_device(void *data)
+void generic_unplug_device(request_queue_t *q)
 {
-	request_queue_t *q = data;
-
 	spin_lock_irq(q->queue_lock);
 	__generic_unplug_device(q);
 	spin_unlock_irq(q->queue_lock);
 }
-
 EXPORT_SYMBOL(generic_unplug_device);
 
+static void blk_backing_dev_unplug(struct backing_dev_info *bdi)
+{
+	request_queue_t *q = bdi->unplug_io_data;
+
+	/*
+	 * devices don't necessarily have an ->unplug_fn defined
+	 */
+	if (q->unplug_fn)
+		q->unplug_fn(q);
+}
+
 static void blk_unplug_work(void *data)
 {
 	request_queue_t *q = data;
+
 	q->unplug_fn(q);
 }
 
@@ -1255,42 +1251,6 @@ void blk_run_queue(struct request_queue 
 EXPORT_SYMBOL(blk_run_queue);
 
 /**
- * blk_run_queues - fire all plugged queues
- *
- * Description:
- *   Start I/O on all plugged queues known to the block layer. Queues that
- *   are currently stopped are ignored. This is equivalent to the older
- *   tq_disk task queue run.
- **/
-#define blk_plug_entry(entry) list_entry((entry), request_queue_t, plug_list)
-void blk_run_queues(void)
-{
-	LIST_HEAD(local_plug_list);
-
-	spin_lock_irq(&blk_plug_lock);
-
-	/*
-	 * this will happen fairly often
-	 */
-	if (list_empty(&blk_plug_list))
-		goto out;
-
-	list_splice_init(&blk_plug_list, &local_plug_list);
-	
-	while (!list_empty(&local_plug_list)) {
-		request_queue_t *q = blk_plug_entry(local_plug_list.next);
-
-		spin_unlock_irq(&blk_plug_lock);
-		q->unplug_fn(q);
-		spin_lock_irq(&blk_plug_lock);
-	}
-out:
-	spin_unlock_irq(&blk_plug_lock);
-}
-
-EXPORT_SYMBOL(blk_run_queues);
-
-/**
  * blk_cleanup_queue: - release a &request_queue_t when it is no longer needed
  * @q:    the request queue to be released
  *
@@ -1351,6 +1311,8 @@ static elevator_t *chosen_elevator =
 	&iosched_as;
 #elif defined(CONFIG_IOSCHED_DEADLINE)
 	&iosched_deadline;
+#elif defined(CONFIG_IOSCHED_CFQ)
+	&iosched_cfq;
 #elif defined(CONFIG_IOSCHED_NOOP)
 	&elevator_noop;
 #else
@@ -1369,6 +1331,10 @@ static int __init elevator_setup(char *s
 	if (!strcmp(str, "as"))
 		chosen_elevator = &iosched_as;
 #endif
+#ifdef CONFIG_IOSCHED_CFQ
+	if (!strcmp(str, "cfq"))
+		chosen_elevator = &iosched_cfq;
+#endif
 #ifdef CONFIG_IOSCHED_NOOP
 	if (!strcmp(str, "noop"))
 		chosen_elevator = &elevator_noop;
@@ -1389,6 +1355,10 @@ request_queue_t *blk_alloc_queue(int gfp
 	memset(q, 0, sizeof(*q));
 	init_timer(&q->unplug_timer);
 	atomic_set(&q->refcnt, 1);
+
+	q->backing_dev_info.unplug_io_fn = blk_backing_dev_unplug;
+	q->backing_dev_info.unplug_io_data = q;
+
 	return q;
 }
 
@@ -2049,7 +2019,6 @@ long blk_congestion_wait(int rw, long ti
 	DEFINE_WAIT(wait);
 	wait_queue_head_t *wqh = &congestion_wqh[rw];
 
-	blk_run_queues();
 	prepare_to_wait(wqh, &wait, TASK_UNINTERRUPTIBLE);
 	ret = io_schedule_timeout(timeout);
 	finish_wait(wqh, &wait);
@@ -2312,9 +2281,9 @@ out:
 		__blk_put_request(q, freereq);
 
 	if (blk_queue_plugged(q)) {
-		int nr_queued = q->rq.count[READ] + q->rq.count[WRITE];
+		int nrq = q->rq.count[READ] + q->rq.count[WRITE] - q->in_flight;
 
-		if (nr_queued == q->unplug_thresh)
+		if (nrq == q->unplug_thresh || bio_sync(bio))
 			__generic_unplug_device(q);
 	}
 	spin_unlock_irq(q->queue_lock);
@@ -2460,7 +2429,7 @@ EXPORT_SYMBOL(generic_make_request);
  * interfaces, @bio must be presetup and ready for I/O.
  *
  */
-int submit_bio(int rw, struct bio *bio)
+void submit_bio(int rw, struct bio *bio)
 {
 	int count = bio_sectors(bio);
 
@@ -2471,8 +2440,17 @@ int submit_bio(int rw, struct bio *bio)
 		mod_page_state(pgpgout, count);
 	else
 		mod_page_state(pgpgin, count);
+
+	if (unlikely(block_dump)) {
+		char b[BDEVNAME_SIZE];
+		printk("%s(%d): %s block %Lu on %s\n",
+			current->comm, current->pid,
+			(rw & WRITE) ? "WRITE" : "READ",
+			(unsigned long long)bio->bi_sector,
+			bdevname(bio->bi_bdev,b));
+	}
+
 	generic_make_request(bio);
-	return 1;
 }
 
 EXPORT_SYMBOL(submit_bio);
@@ -2754,6 +2732,9 @@ void end_that_request_last(struct reques
 	struct gendisk *disk = req->rq_disk;
 	struct completion *waiting = req->waiting;
 
+	if (unlikely(laptop_mode) && blk_fs_request(req))
+		laptop_io_completion();
+
 	if (disk && blk_fs_request(req)) {
 		unsigned long duration = jiffies - req->start_time;
 		switch (rq_data_dir(req)) {
--- diff/drivers/block/loop.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/block/loop.c	2004-04-21 10:45:33.989536304 +0100
@@ -434,6 +434,17 @@ inactive:
 	goto out;
 }
 
+/*
+ * kick off io on the underlying address space
+ */
+static void loop_unplug(request_queue_t *q)
+{
+	struct loop_device *lo = q->queuedata;
+
+	clear_bit(QUEUE_FLAG_PLUGGED, &q->queue_flags);
+	blk_run_address_space(lo->lo_backing_file->f_mapping);
+}
+
 struct switch_request {
 	struct file *file;
 	struct completion wait;
@@ -472,7 +483,7 @@ static int loop_thread(void *data)
 	 * hence, it mustn't be stopped at all
 	 * because it could be indirectly used during suspension
 	 */
-	current->flags |= PF_IOTHREAD;
+	current->flags |= PF_NOFREEZE;
 
 	set_user_nice(current, -20);
 
@@ -614,7 +625,6 @@ static int loop_set_fd(struct loop_devic
 {
 	struct file	*file;
 	struct inode	*inode;
-	struct block_device *lo_device = NULL;
 	struct address_space *mapping;
 	unsigned lo_blocksize;
 	int		lo_flags = 0;
@@ -671,7 +681,7 @@ static int loop_set_fd(struct loop_devic
 	set_device_ro(bdev, (lo_flags & LO_FLAGS_READ_ONLY) != 0);
 
 	lo->lo_blocksize = lo_blocksize;
-	lo->lo_device = lo_device;
+	lo->lo_device = bdev;
 	lo->lo_flags = lo_flags;
 	lo->lo_backing_file = file;
 	lo->transfer = NULL;
@@ -688,6 +698,7 @@ static int loop_set_fd(struct loop_devic
 	 */
 	blk_queue_make_request(lo->lo_queue, loop_make_request);
 	lo->lo_queue->queuedata = lo;
+	lo->lo_queue->unplug_fn = loop_unplug;
 
 	set_capacity(disks[lo->lo_number], size);
 	bd_set_size(bdev, size << 9);
--- diff/drivers/block/paride/Kconfig	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/block/paride/Kconfig	2004-04-21 10:45:33.990536152 +0100
@@ -91,7 +91,7 @@ config PARIDE_PG
 	  driver. See <file:include/linux/pg.h>. for details.
 
 	  You can obtain the most recent version of cdrtools from
-	  <ftp://ftp.fokus.gmd.de/pub/unix/cdrecord/>. Versions 1.6.1a3 and
+	  <ftp://ftp.berlios.de/pub/cdrecord/>. Versions 1.6.1a3 and
 	  later fully support this driver.
 
 comment "Parallel IDE protocol modules"
--- diff/drivers/block/rd.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/block/rd.c	2004-04-21 10:45:33.990536152 +0100
@@ -271,6 +271,7 @@ static int rd_ioctl(struct inode *inode,
 static struct backing_dev_info rd_backing_dev_info = {
 	.ra_pages	= 0,	/* No readahead */
 	.memory_backed	= 1,	/* Does not contribute to dirty memory */
+	.unplug_io_fn = default_unplug_io_fn,
 };
 
 static int rd_open(struct inode *inode, struct file *filp)
--- diff/drivers/block/umem.c	2003-09-30 15:46:12.000000000 +0100
+++ source/drivers/block/umem.c	2004-04-21 10:45:33.991536000 +0100
@@ -368,9 +368,8 @@ static inline void reset_page(struct mm_
 	page->biotail = & page->bio;
 }
 
-static void mm_unplug_device(void *data)
+static void mm_unplug_device(request_queue_t *q)
 {
-	request_queue_t *q = data;
 	struct cardinfo *card = q->queuedata;
 	unsigned long flags;
 
--- diff/drivers/bluetooth/Kconfig	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/bluetooth/Kconfig	2004-04-21 10:45:33.991536000 +0100
@@ -104,6 +104,7 @@ config BT_HCIDTL1
 config BT_HCIBT3C
 	tristate "HCI BT3C (PC Card) driver"
 	depends on PCMCIA
+	select FW_LOADER
 	help
 	  Bluetooth HCI BT3C (PC Card) driver.
 	  This driver provides support for Bluetooth PCMCIA devices with
@@ -111,9 +112,6 @@ config BT_HCIBT3C
 	     3Com Bluetooth Card (3CRWB6096)
 	     HP Bluetooth Card
 
-	  The HCI BT3C driver uses external firmware loader program provided in
-	  the BlueFW package. For more information, see <http://bluez.sf.net>.
-
 	  Say Y here to compile support for HCI BT3C devices into the
 	  kernel or say M to compile it as module (bt3c_cs).
 
--- diff/drivers/bluetooth/bcm203x.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/bluetooth/bcm203x.c	2004-04-21 10:45:33.992535848 +0100
@@ -74,7 +74,7 @@ struct bcm203x_data {
 	struct timer_list	timer;
 
 	struct urb		*urb;
-	unsigned char		buffer[4096];
+	unsigned char		*buffer;
 
 	unsigned char		*fw_data;
 	unsigned int		fw_size;
@@ -99,8 +99,7 @@ static void bcm203x_complete(struct urb 
 	case BCM203X_LOAD_MINIDRV:
 		memcpy(data->buffer, "#", 1);
 
-		usb_fill_bulk_urb(urb, udev,
-				usb_sndbulkpipe(udev, BCM203X_OUT_EP),
+		usb_fill_bulk_urb(urb, udev, usb_sndbulkpipe(udev, BCM203X_OUT_EP),
 				data->buffer, 1, bcm203x_complete, data);
 
 		data->state = BCM203X_SELECT_MEMORY;
@@ -109,8 +108,7 @@ static void bcm203x_complete(struct urb 
 		break;
 
 	case BCM203X_SELECT_MEMORY:
-		usb_fill_int_urb(urb, udev,
-				usb_rcvintpipe(udev, BCM203X_IN_EP),
+		usb_fill_int_urb(urb, udev, usb_rcvintpipe(udev, BCM203X_IN_EP),
 				data->buffer, 32, bcm203x_complete, data, 1);
 
 		data->state = BCM203X_CHECK_MEMORY;
@@ -130,20 +128,15 @@ static void bcm203x_complete(struct urb 
 
 	case BCM203X_LOAD_FIRMWARE:
 		if (data->fw_sent == data->fw_size) {
-			usb_fill_int_urb(urb, udev,
-					usb_rcvintpipe(udev, BCM203X_IN_EP),
-					data->buffer, 32,
-					bcm203x_complete, data, 1);
+			usb_fill_int_urb(urb, udev, usb_rcvintpipe(udev, BCM203X_IN_EP),
+				data->buffer, 32, bcm203x_complete, data, 1);
 
 			data->state = BCM203X_CHECK_FIRMWARE;
 		} else {
-			len = min_t(uint, data->fw_size - data->fw_sent,
-							sizeof(data->buffer));
+			len = min_t(uint, data->fw_size - data->fw_sent, 4096);
 
-			usb_fill_bulk_urb(urb, udev,
-					usb_sndbulkpipe(udev, BCM203X_OUT_EP),
-					data->fw_data + data->fw_sent, len,
-					bcm203x_complete, data);
+			usb_fill_bulk_urb(urb, udev, usb_sndbulkpipe(udev, BCM203X_OUT_EP),
+				data->fw_data + data->fw_sent, len, bcm203x_complete, data);
 
 			data->fw_sent += len;
 		}
@@ -177,6 +170,7 @@ static int bcm203x_probe(struct usb_inte
 	const struct firmware *firmware;
 	struct usb_device *udev = interface_to_usbdev(intf);
 	struct bcm203x_data *data;
+	int size;
 
 	BT_DBG("intf %p id %p", intf, id);
 
@@ -210,18 +204,20 @@ static int bcm203x_probe(struct usb_inte
 
 	BT_DBG("minidrv data %p size %d", firmware->data, firmware->size);
 
-	if (firmware->size > sizeof(data->buffer)) {
-		BT_ERR("Mini driver exceeds size of buffer");
+	size = max_t(uint, firmware->size, 4096);
+
+	data->buffer = kmalloc(size, GFP_KERNEL);
+	if (!data->buffer) {
+		BT_ERR("Can't allocate memory for mini driver");
 		release_firmware(firmware);
 		usb_free_urb(data->urb);
 		kfree(data);
-		return -EIO;
+		return -ENOMEM;
 	}
 
 	memcpy(data->buffer, firmware->data, firmware->size);
 
-	usb_fill_bulk_urb(data->urb, udev,
-			usb_sndbulkpipe(udev, BCM203X_OUT_EP),
+	usb_fill_bulk_urb(data->urb, udev, usb_sndbulkpipe(udev, BCM203X_OUT_EP),
 			data->buffer, firmware->size, bcm203x_complete, data);
 
 	release_firmware(firmware);
@@ -229,6 +225,7 @@ static int bcm203x_probe(struct usb_inte
 	if (request_firmware(&firmware, "BCM2033-FW.bin", &udev->dev) < 0) {
 		BT_ERR("Firmware request failed");
 		usb_free_urb(data->urb);
+		kfree(data->buffer);
 		kfree(data);
 		return -EIO;
 	}
@@ -239,6 +236,7 @@ static int bcm203x_probe(struct usb_inte
 	if (!data->fw_data) {
 		BT_ERR("Can't allocate memory for firmware image");
 		usb_free_urb(data->urb);
+		kfree(data->buffer);
 		kfree(data);
 		return -ENOMEM;
 	}
@@ -272,6 +270,7 @@ static void bcm203x_disconnect(struct us
 
 	usb_free_urb(data->urb);
 	kfree(data->fw_data);
+	kfree(data->buffer);
 	kfree(data);
 }
 
--- diff/drivers/bluetooth/bfusb.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/bluetooth/bfusb.c	2004-04-21 10:45:33.992535848 +0100
@@ -98,6 +98,14 @@ struct bfusb_scb {
 static void bfusb_tx_complete(struct urb *urb, struct pt_regs *regs);
 static void bfusb_rx_complete(struct urb *urb, struct pt_regs *regs);
 
+static inline void bfusb_wait_for_urb(struct urb *urb)
+{
+	while (atomic_read(&urb->count) > 1) {
+		current->state = TASK_UNINTERRUPTIBLE;
+		schedule_timeout((5 * HZ + 999) / 1000);
+	}
+}
+
 static struct urb *bfusb_get_completed(struct bfusb *bfusb)
 {
 	struct sk_buff *skb;
@@ -114,7 +122,7 @@ static struct urb *bfusb_get_completed(s
 	return urb;
 }
 
-static inline void bfusb_unlink_urbs(struct bfusb *bfusb)
+static void bfusb_unlink_urbs(struct bfusb *bfusb)
 {
 	struct sk_buff *skb;
 	struct urb *urb;
@@ -124,6 +132,7 @@ static inline void bfusb_unlink_urbs(str
 	while ((skb = skb_dequeue(&bfusb->pending_q))) {
 		urb = ((struct bfusb_scb *) skb->cb)->urb;
 		usb_unlink_urb(urb);
+		bfusb_wait_for_urb(urb);
 		skb_queue_tail(&bfusb->completed_q, skb);
 	}
 
@@ -359,11 +368,11 @@ static void bfusb_rx_complete(struct urb
 
 	BT_DBG("bfusb %p urb %p skb %p len %d", bfusb, urb, skb, skb->len);
 
-	if (!test_bit(HCI_RUNNING, &bfusb->hdev->flags))
-		return;
-
 	read_lock(&bfusb->lock);
 
+	if (!test_bit(HCI_RUNNING, &bfusb->hdev->flags))
+		goto unlock;
+
 	if (urb->status || !count)
 		goto resubmit;
 
@@ -414,6 +423,7 @@ resubmit:
 					bfusb->hdev->name, urb, err);
 	}
 
+unlock:
 	read_unlock(&bfusb->lock);
 }
 
--- diff/drivers/bluetooth/bluecard_cs.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/bluetooth/bluecard_cs.c	2004-04-21 10:45:33.993535696 +0100
@@ -174,6 +174,9 @@ void bluecard_activity_led_timeout(u_lon
 	bluecard_info_t *info = (bluecard_info_t *)arg;
 	unsigned int iobase = info->link.io.BasePort1;
 
+	if (!test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state)))
+		return;
+
 	if (test_bit(CARD_HAS_ACTIVITY_LED, &(info->hw_state))) {
 		/* Disable activity LED */
 		outb(0x08 | 0x20, iobase + 0x30);
@@ -188,6 +191,9 @@ static void bluecard_enable_activity_led
 {
 	unsigned int iobase = info->link.io.BasePort1;
 
+	if (!test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state)))
+		return;
+
 	if (test_bit(CARD_HAS_ACTIVITY_LED, &(info->hw_state))) {
 		/* Enable activity LED */
 		outb(0x10 | 0x40, iobase + 0x30);
@@ -505,13 +511,13 @@ static irqreturn_t bluecard_interrupt(in
 	unsigned int iobase;
 	unsigned char reg;
 
-	if (!info) {
+	if (!info || !info->hdev) {
 		BT_ERR("Call of irq %d for unknown device", irq);
 		return IRQ_NONE;
 	}
 
 	if (!test_bit(CARD_READY, &(info->hw_state)))
-		return IRQ_NONE;
+		return IRQ_HANDLED;
 
 	iobase = info->link.io.BasePort1;
 
@@ -629,13 +635,16 @@ static int bluecard_hci_open(struct hci_
 	bluecard_info_t *info = (bluecard_info_t *)(hdev->driver_data);
 	unsigned int iobase = info->link.io.BasePort1;
 
-	bluecard_hci_set_baud_rate(hdev, DEFAULT_BAUD_RATE);
+	if (test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state)))
+		bluecard_hci_set_baud_rate(hdev, DEFAULT_BAUD_RATE);
 
 	if (test_and_set_bit(HCI_RUNNING, &(hdev->flags)))
 		return 0;
 
-	/* Enable LED */
-	outb(0x08 | 0x20, iobase + 0x30);
+	if (test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state))) {
+		/* Enable LED */
+		outb(0x08 | 0x20, iobase + 0x30);
+	}
 
 	return 0;
 }
@@ -651,8 +660,10 @@ static int bluecard_hci_close(struct hci
 
 	bluecard_hci_flush(hdev);
 
-	/* Disable LED */
-	outb(0x00, iobase + 0x30);
+	if (test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state))) {
+		/* Disable LED */
+		outb(0x00, iobase + 0x30);
+	}
 
 	return 0;
 }
@@ -725,6 +736,27 @@ int bluecard_open(bluecard_info_t *info)
 	info->rx_count = 0;
 	info->rx_skb = NULL;
 
+	/* Initialize HCI device */
+	hdev = hci_alloc_dev();
+	if (!hdev) {
+		BT_ERR("Can't allocate HCI device");
+		return -ENOMEM;
+	}
+
+	info->hdev = hdev;
+
+	hdev->type = HCI_PCCARD;
+	hdev->driver_data = info;
+
+	hdev->open     = bluecard_hci_open;
+	hdev->close    = bluecard_hci_close;
+	hdev->flush    = bluecard_hci_flush;
+	hdev->send     = bluecard_hci_send_frame;
+	hdev->destruct = bluecard_hci_destruct;
+	hdev->ioctl    = bluecard_hci_ioctl;
+
+	hdev->owner = THIS_MODULE;
+
 	id = inb(iobase + 0x30);
 
 	if ((id & 0x0f) == 0x02)
@@ -759,6 +791,24 @@ int bluecard_open(bluecard_info_t *info)
 	info->ctrl_reg |= REG_CONTROL_INTERRUPT;
 	outb(info->ctrl_reg, iobase + REG_CONTROL);
 
+	if ((id & 0x0f) == 0x03) {
+		/* Disable RTS */
+		info->ctrl_reg |= REG_CONTROL_RTS;
+		outb(info->ctrl_reg, iobase + REG_CONTROL);
+
+		/* Set baud rate */
+		info->ctrl_reg |= 0x03;
+		outb(info->ctrl_reg, iobase + REG_CONTROL);
+
+		/* Enable RTS */
+		info->ctrl_reg &= ~REG_CONTROL_RTS;
+		outb(info->ctrl_reg, iobase + REG_CONTROL);
+
+		set_bit(XMIT_BUF_ONE_READY, &(info->tx_state));
+		set_bit(XMIT_BUF_TWO_READY, &(info->tx_state));
+		set_bit(XMIT_SENDING_READY, &(info->tx_state));
+	}
+
 	/* Start the RX buffers */
 	outb(REG_COMMAND_RX_BUF_ONE, iobase + REG_COMMAND);
 	outb(REG_COMMAND_RX_BUF_TWO, iobase + REG_COMMAND);
@@ -776,30 +826,10 @@ int bluecard_open(bluecard_info_t *info)
 	set_current_state(TASK_INTERRUPTIBLE);
 	schedule_timeout((HZ * 5) / 4);		// or set it to 3/2
 
-
-	/* Initialize and register HCI device */
-	hdev = hci_alloc_dev();
-	if (!hdev) {
-		BT_ERR("Can't allocate HCI device");
-		return -ENOMEM;
-	}
-
-	info->hdev = hdev;
-
-	hdev->type = HCI_PCCARD;
-	hdev->driver_data = info;
-
-	hdev->open = bluecard_hci_open;
-	hdev->close = bluecard_hci_close;
-	hdev->flush = bluecard_hci_flush;
-	hdev->send = bluecard_hci_send_frame;
-	hdev->destruct = bluecard_hci_destruct;
-	hdev->ioctl = bluecard_hci_ioctl;
-
-	hdev->owner = THIS_MODULE;
-	
+	/* Register HCI device */
 	if (hci_register_dev(hdev) < 0) {
 		BT_ERR("Can't register HCI device");
+		info->hdev = NULL;
 		hci_free_dev(hdev);
 		return -ENODEV;
 	}
@@ -813,6 +843,9 @@ int bluecard_close(bluecard_info_t *info
 	unsigned int iobase = info->link.io.BasePort1;
 	struct hci_dev *hdev = info->hdev;
 
+	if (!hdev)
+		return -ENODEV;
+
 	bluecard_hci_close(hdev);
 
 	clear_bit(CARD_READY, &(info->hw_state));
@@ -1017,6 +1050,8 @@ void bluecard_release(dev_link_t *link)
 	if (link->state & DEV_PRESENT)
 		bluecard_close(info);
 
+	del_timer(&(info->timer));
+
 	link->dev = NULL;
 
 	pcmcia_release_configuration(link->handle);
--- diff/drivers/bluetooth/bt3c_cs.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/bluetooth/bt3c_cs.c	2004-04-21 10:45:33.994535544 +0100
@@ -28,6 +28,7 @@
 #include <linux/kmod.h>
 #include <linux/init.h>
 #include <linux/slab.h>
+#include <linux/delay.h>
 #include <linux/types.h>
 #include <linux/sched.h>
 #include <linux/errno.h>
@@ -43,6 +44,9 @@
 #include <asm/bitops.h>
 #include <asm/io.h>
 
+#include <linux/device.h>
+#include <linux/firmware.h>
+
 #include <pcmcia/version.h>
 #include <pcmcia/cs_types.h>
 #include <pcmcia/cs.h>
@@ -361,7 +365,7 @@ static irqreturn_t bt3c_interrupt(int ir
 	unsigned int iobase;
 	int iir;
 
-	if (!info) {
+	if (!info || !info->hdev) {
 		BT_ERR("Call of irq %d for unknown device", irq);
 		return IRQ_NONE;
 	}
@@ -379,7 +383,8 @@ static irqreturn_t bt3c_interrupt(int ir
 		} else if ((stat & 0xff) != 0xff) {
 			if (stat & 0x0020) {
 				int stat = bt3c_read(iobase, 0x7002) & 0x10;
-				BT_ERR("Antenna %s", stat ? "out" : "in");
+				BT_INFO("%s: Antenna %s", info->hdev->name,
+							stat ? "out" : "in");
 			}
 			if (stat & 0x0001)
 				bt3c_receive(info);
@@ -481,36 +486,101 @@ static int bt3c_hci_ioctl(struct hci_dev
 
 
 
-/* ======================== User mode firmware loader ======================== */
+/* ======================== Card services HCI interaction ======================== */
 
 
-#define FW_LOADER  "/sbin/bluefw"
+static struct device bt3c_device = {
+	.bus_id = "pcmcia",
+};
 
 
-static int bt3c_firmware_load(bt3c_info_t *info)
+static int bt3c_load_firmware(bt3c_info_t *info, unsigned char *firmware, int count)
 {
-	char dev[16];
-	int err;
+	char *ptr = (char *) firmware;
+	char b[9];
+	unsigned int iobase, size, addr, fcs, tmp;
+	int i, err = 0;
 
-	char *argv[] = { FW_LOADER, "pccard", dev, NULL };
-	char *envp[] = { "HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL };
+	iobase = info->link.io.BasePort1;
 
-	sprintf(dev, "%04x", info->link.io.BasePort1);
+	/* Reset */
+	bt3c_io_write(iobase, 0x8040, 0x0404);
+	bt3c_io_write(iobase, 0x8040, 0x0400);
+
+	udelay(1);
+
+	bt3c_io_write(iobase, 0x8040, 0x0404);
+
+	udelay(17);
+
+	/* Load */
+	while (count) {
+		if (ptr[0] != 'S') {
+			BT_ERR("Bad address in firmware");
+			err = -EFAULT;
+			goto error;
+		}
 
-	err = call_usermodehelper(FW_LOADER, argv, envp, 1);
-	if (err)
-		BT_ERR("Failed to run \"%s pccard %s\" (errno=%d)", FW_LOADER, dev, err);
+		memset(b, 0, sizeof(b));
+		memcpy(b, ptr + 2, 2);
+		size = simple_strtol(b, NULL, 16);
+
+		memset(b, 0, sizeof(b));
+		memcpy(b, ptr + 4, 8);
+		addr = simple_strtol(b, NULL, 16);
+
+		memset(b, 0, sizeof(b));
+		memcpy(b, ptr + (size * 2) + 2, 2);
+		fcs = simple_strtol(b, NULL, 16);
+
+		memset(b, 0, sizeof(b));
+		for (tmp = 0, i = 0; i < size; i++) {
+			memcpy(b, ptr + (i * 2) + 2, 2);
+			tmp += simple_strtol(b, NULL, 16);
+		}
 
-	return err;
-}
+		if (((tmp + fcs) & 0xff) != 0xff) {
+			BT_ERR("Checksum error in firmware");
+			err = -EILSEQ;
+			goto error;
+		}
 
+		if (ptr[1] == '3') {
+			bt3c_address(iobase, addr);
 
+			memset(b, 0, sizeof(b));
+			for (i = 0; i < (size - 4) / 2; i++) {
+				memcpy(b, ptr + (i * 4) + 12, 4);
+				tmp = simple_strtol(b, NULL, 16);
+				bt3c_put(iobase, tmp);
+			}
+		}
 
-/* ======================== Card services HCI interaction ======================== */
+		ptr   += (size * 2) + 6;
+		count -= (size * 2) + 6;
+	}
+
+	udelay(17);
+
+	/* Boot */
+	bt3c_address(iobase, 0x3000);
+	outb(inb(iobase + CONTROL) | 0x40, iobase + CONTROL);
+
+error:
+	udelay(17);
+
+	/* Clear */
+	bt3c_io_write(iobase, 0x7006, 0x0000);
+	bt3c_io_write(iobase, 0x7005, 0x0000);
+	bt3c_io_write(iobase, 0x7001, 0x0000);
+
+	return err;
+}
 
 
 int bt3c_open(bt3c_info_t *info)
 {
+	const struct firmware *firmware;
 	struct hci_dev *hdev;
 	int err;
 
@@ -522,18 +592,7 @@ int bt3c_open(bt3c_info_t *info)
 	info->rx_count = 0;
 	info->rx_skb = NULL;
 
-	/* Load firmware */
-
-	if ((err = bt3c_firmware_load(info)) < 0)
-		return err;
-
-	/* Timeout before it is safe to send the first HCI packet */
-
-	set_current_state(TASK_INTERRUPTIBLE);
-	schedule_timeout(HZ);
-
-
-	/* Initialize and register HCI device */
+	/* Initialize HCI device */
 	hdev = hci_alloc_dev();
 	if (!hdev) {
 		BT_ERR("Can't allocate HCI device");
@@ -545,22 +604,48 @@ int bt3c_open(bt3c_info_t *info)
 	hdev->type = HCI_PCCARD;
 	hdev->driver_data = info;
 
-	hdev->open = bt3c_hci_open;
-	hdev->close = bt3c_hci_close;
-	hdev->flush = bt3c_hci_flush;
-	hdev->send = bt3c_hci_send_frame;
+	hdev->open     = bt3c_hci_open;
+	hdev->close    = bt3c_hci_close;
+	hdev->flush    = bt3c_hci_flush;
+	hdev->send     = bt3c_hci_send_frame;
 	hdev->destruct = bt3c_hci_destruct;
-	hdev->ioctl = bt3c_hci_ioctl;
+	hdev->ioctl    = bt3c_hci_ioctl;
 
 	hdev->owner = THIS_MODULE;
-	
-	if (hci_register_dev(hdev) < 0) {
+
+	/* Load firmware */
+	err = request_firmware(&firmware, "BT3CPCC.bin", &bt3c_device);
+	if (err < 0) {
+		BT_ERR("Firmware request failed");
+		goto error;
+	}
+
+	err = bt3c_load_firmware(info, firmware->data, firmware->size);
+
+	release_firmware(firmware);
+
+	if (err < 0) {
+		BT_ERR("Firmware loading failed");
+		goto error;
+	}
+
+	/* Timeout before it is safe to send the first HCI packet */
+	set_current_state(TASK_INTERRUPTIBLE);
+	schedule_timeout(HZ);
+
+	/* Register HCI device */
+	err = hci_register_dev(hdev);
+	if (err < 0) {
 		BT_ERR("Can't register HCI device");
-		hci_free_dev(hdev);
-		return -ENODEV;
+		goto error;
 	}
 
 	return 0;
+
+error:
+	info->hdev = NULL;
+	hci_free_dev(hdev);
+	return err;
 }
 
 
@@ -568,6 +653,9 @@ int bt3c_close(bt3c_info_t *info)
 {
 	struct hci_dev *hdev = info->hdev;
 
+	if (!hdev)
+		return -ENODEV;
+
 	bt3c_hci_close(hdev);
 
 	if (hci_unregister_dev(hdev) < 0)
--- diff/drivers/bluetooth/btuart_cs.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/bluetooth/btuart_cs.c	2004-04-21 10:45:33.994535544 +0100
@@ -308,7 +308,7 @@ static irqreturn_t btuart_interrupt(int 
 	int boguscount = 0;
 	int iir, lsr;
 
-	if (!info) {
+	if (!info || !info->hdev) {
 		BT_ERR("Call of irq %d for unknown device", irq);
 		return IRQ_NONE;
 	}
@@ -504,6 +504,27 @@ int btuart_open(btuart_info_t *info)
 	info->rx_count = 0;
 	info->rx_skb = NULL;
 
+	/* Initialize HCI device */
+	hdev = hci_alloc_dev();
+	if (!hdev) {
+		BT_ERR("Can't allocate HCI device");
+		return -ENOMEM;
+	}
+
+	info->hdev = hdev;
+
+	hdev->type = HCI_PCCARD;
+	hdev->driver_data = info;
+
+	hdev->open     = btuart_hci_open;
+	hdev->close    = btuart_hci_close;
+	hdev->flush    = btuart_hci_flush;
+	hdev->send     = btuart_hci_send_frame;
+	hdev->destruct = btuart_hci_destruct;
+	hdev->ioctl    = btuart_hci_ioctl;
+
+	hdev->owner = THIS_MODULE;
+
 	spin_lock_irqsave(&(info->lock), flags);
 
 	/* Reset UART */
@@ -527,30 +548,10 @@ int btuart_open(btuart_info_t *info)
 	set_current_state(TASK_INTERRUPTIBLE);
 	schedule_timeout(HZ);
 
-
-	/* Initialize and register HCI device */
-	hdev = hci_alloc_dev();
-	if (!hdev) {
-		BT_ERR("Can't allocate HCI device");
-		return -ENOMEM;
-	}
-
-	info->hdev = hdev;
-
-	hdev->type = HCI_PCCARD;
-	hdev->driver_data = info;
-
-	hdev->open = btuart_hci_open;
-	hdev->close = btuart_hci_close;
-	hdev->flush = btuart_hci_flush;
-	hdev->send = btuart_hci_send_frame;
-	hdev->destruct = btuart_hci_destruct;
-	hdev->ioctl = btuart_hci_ioctl;
-
-	hdev->owner = THIS_MODULE;
-	
+	/* Register HCI device */
 	if (hci_register_dev(hdev) < 0) {
 		BT_ERR("Can't register HCI device");
+		info->hdev = NULL;
 		hci_free_dev(hdev);
 		return -ENODEV;
 	}
@@ -565,6 +566,9 @@ int btuart_close(btuart_info_t *info)
 	unsigned int iobase = info->link.io.BasePort1;
 	struct hci_dev *hdev = info->hdev;
 
+	if (!hdev)
+		return -ENODEV;
+
 	btuart_hci_close(hdev);
 
 	spin_lock_irqsave(&(info->lock), flags);
--- diff/drivers/bluetooth/dtl1_cs.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/bluetooth/dtl1_cs.c	2004-04-21 10:45:33.995535392 +0100
@@ -312,7 +312,7 @@ static irqreturn_t dtl1_interrupt(int ir
 	int boguscount = 0;
 	int iir, lsr;
 
-	if (!info) {
+	if (!info || !info->hdev) {
 		BT_ERR("Call of irq %d for unknown device", irq);
 		return IRQ_NONE;
 	}
@@ -483,6 +483,27 @@ int dtl1_open(dtl1_info_t *info)
 
 	set_bit(XMIT_WAITING, &(info->tx_state));
 
+	/* Initialize HCI device */
+	hdev = hci_alloc_dev();
+	if (!hdev) {
+		BT_ERR("Can't allocate HCI device");
+		return -ENOMEM;
+	}
+
+	info->hdev = hdev;
+
+	hdev->type = HCI_PCCARD;
+	hdev->driver_data = info;
+
+	hdev->open     = dtl1_hci_open;
+	hdev->close    = dtl1_hci_close;
+	hdev->flush    = dtl1_hci_flush;
+	hdev->send     = dtl1_hci_send_frame;
+	hdev->destruct = dtl1_hci_destruct;
+	hdev->ioctl    = dtl1_hci_ioctl;
+
+	hdev->owner = THIS_MODULE;
+
 	spin_lock_irqsave(&(info->lock), flags);
 
 	/* Reset UART */
@@ -506,30 +527,10 @@ int dtl1_open(dtl1_info_t *info)
 	set_current_state(TASK_INTERRUPTIBLE);
 	schedule_timeout(HZ * 2);
 
-
-	/* Initialize and register HCI device */
-	hdev = hci_alloc_dev();
-	if (!hdev) {
-		BT_ERR("Can't allocate HCI device");
-		return -ENOMEM;
-	}
-
-	info->hdev = hdev;
-
-	hdev->type = HCI_PCCARD;
-	hdev->driver_data = info;
-
-	hdev->open = dtl1_hci_open;
-	hdev->close = dtl1_hci_close;
-	hdev->flush = dtl1_hci_flush;
-	hdev->send = dtl1_hci_send_frame;
-	hdev->destruct = dtl1_hci_destruct;
-	hdev->ioctl = dtl1_hci_ioctl;
-
-	hdev->owner = THIS_MODULE;
-
+	/* Register HCI device */
 	if (hci_register_dev(hdev) < 0) {
 		BT_ERR("Can't register HCI device");
+		info->hdev = NULL;
 		hci_free_dev(hdev);
 		return -ENODEV;
 	}
@@ -544,6 +545,9 @@ int dtl1_close(dtl1_info_t *info)
 	unsigned int iobase = info->link.io.BasePort1;
 	struct hci_dev *hdev = info->hdev;
 
+	if (!hdev)
+		return -ENODEV;
+
 	dtl1_hci_close(hdev);
 
 	spin_lock_irqsave(&(info->lock), flags);
--- diff/drivers/bluetooth/hci_uart.h	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/bluetooth/hci_uart.h	2004-04-21 10:45:33.995535392 +0100
@@ -35,11 +35,12 @@
 #define HCIUARTGETPROTO	_IOR('U', 201, int)
 
 /* UART protocols */
-#define HCI_UART_MAX_PROTO	3
+#define HCI_UART_MAX_PROTO	4
 
 #define HCI_UART_H4	0
 #define HCI_UART_BCSP	1
-#define HCI_UART_NCSP	2
+#define HCI_UART_3WIRE	2
+#define HCI_UART_H4DS	3
 
 #ifdef __KERNEL__
 struct hci_uart;
--- diff/drivers/bluetooth/hci_usb.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/bluetooth/hci_usb.c	2004-04-21 10:45:33.996535240 +0100
@@ -109,8 +109,7 @@ struct _urb *_urb_alloc(int isoc, int gf
 				sizeof(struct usb_iso_packet_descriptor) * isoc, gfp);
 	if (_urb) {
 		memset(_urb, 0, sizeof(*_urb));
-		_urb->urb.count = (atomic_t)ATOMIC_INIT(1);
-		spin_lock_init(&_urb->urb.lock);
+		usb_init_urb(&_urb->urb);
 	}
 	return _urb;
 }
@@ -341,6 +340,14 @@ static int hci_usb_flush(struct hci_dev 
 	return 0;
 }
 
+static inline void hci_usb_wait_for_urb(struct urb *urb)
+{
+	while (atomic_read(&urb->count) > 1) {
+		current->state = TASK_UNINTERRUPTIBLE;
+		schedule_timeout((5 * HZ + 999) / 1000);
+	}
+}
+
 static void hci_usb_unlink_urbs(struct hci_usb *husb)
 {
 	int i;
@@ -357,6 +364,7 @@ static void hci_usb_unlink_urbs(struct h
 			BT_DBG("%s unlinking _urb %p type %d urb %p", 
 					husb->hdev->name, _urb, _urb->type, urb);
 			usb_unlink_urb(urb);
+			hci_usb_wait_for_urb(urb);
 			_urb_queue_tail(__completed_q(husb, _urb->type), _urb);
 		}
 
@@ -699,11 +707,11 @@ static void hci_usb_rx_complete(struct u
 	BT_DBG("%s urb %p type %d status %d count %d flags %x", hdev->name, urb,
 			_urb->type, urb->status, count, urb->transfer_flags);
 
-	if (!test_bit(HCI_RUNNING, &hdev->flags))
-		return;
-
 	read_lock(&husb->completion_lock);
 
+	if (!test_bit(HCI_RUNNING, &hdev->flags))
+		goto unlock;
+
 	if (urb->status || !count)
 		goto resubmit;
 
@@ -739,6 +747,7 @@ resubmit:
 	BT_DBG("%s urb %p type %d resubmit status %d", hdev->name, urb,
 			_urb->type, err);
 
+unlock:
 	read_unlock(&husb->completion_lock);
 }
 
--- diff/drivers/char/Kconfig	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/char/Kconfig	2004-04-21 10:45:34.005533872 +0100
@@ -7,7 +7,7 @@ menu "Character devices"
 config VT
 	bool "Virtual terminal" if EMBEDDED
 	select INPUT
-	default y
+	default y if !VIOCONS
 	---help---
 	  If you say Y here, you will get support for terminal devices with
 	  display and keyboard devices. These are called "virtual" because you
@@ -110,7 +110,7 @@ config ROCKETPORT
 
 config CYCLADES
 	tristate "Cyclades async mux support"
-	depends on SERIAL_NONSTANDARD && BROKEN_ON_SMP
+	depends on SERIAL_NONSTANDARD
 	---help---
 	  This is a driver for a card that gives you many serial ports. You
 	  would need something like this to connect more than two modems to
@@ -305,7 +305,7 @@ config RIO
 	help
 	  This is a driver for the Specialix RIO, a smart serial card which
 	  drives an outboard box that can support up to 128 ports.  Product
-	  information is at <http://www.sphinxcst.co.uk/perle/multi.htm>.
+	  information is at <http://www.perle.com/support/documentation.html#multiport>.
 	  There are both ISA and PCI versions.
 
 config RIO_OLDPCI
@@ -415,7 +415,7 @@ config IT8172_SCR0
 	  Say Y here to support smart-card reader 0 (SCR0) on the Integrated
 	  Technology Express, Inc. ITE8172 SBC.  Vendor page at
 	  <http://www.ite.com.tw/ia/brief_it8172bsp.htm>; picture of the
-	  board at <http://www.mvista.com/allies/semiconductor/ite.html>.
+	  board at <http://www.mvista.com/partners/semiconductor/ite.html>.
 
 config IT8172_SCR1
 	bool "Enable Smart Card Reader 1 Support "
@@ -424,7 +424,7 @@ config IT8172_SCR1
 	  Say Y here to support smart-card reader 1 (SCR1) on the Integrated
 	  Technology Express, Inc. ITE8172 SBC.  Vendor page at
 	  <http://www.ite.com.tw/ia/brief_it8172bsp.htm>; picture of the
-	  board at <http://www.mvista.com/allies/semiconductor/ite.html>.
+	  board at <http://www.mvista.com/partners/semiconductor/ite.html>.
 
 config A2232
 	tristate "Commodore A2232 serial support (EXPERIMENTAL)"
@@ -768,7 +768,7 @@ config RTC
 
 config GEN_RTC
 	tristate "Generic /dev/rtc emulation"
-	depends on RTC!=y
+	depends on RTC!=y && !IA64
 	---help---
 	  If you say Y here and create a character special file /dev/rtc with
 	  major number 10 and minor number 135 using mknod ("man mknod"), you
--- diff/drivers/char/agp/efficeon-agp.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/char/agp/efficeon-agp.c	2004-04-21 10:45:34.013532656 +0100
@@ -302,13 +302,6 @@ static int efficeon_remove_memory(struct
 	return 0;
 }
 
-/* GATT entry: (physical address | 1) */
-static unsigned long efficeon_mask_memory(unsigned long addr, int type)
-{
-	/* Memory type is ignored */
-
-	return addr | agp_bridge->driver->masks[0].mask;
-}
 
 struct agp_bridge_driver efficeon_driver = {
 	.owner			= THIS_MODULE,
@@ -319,7 +312,7 @@ struct agp_bridge_driver efficeon_driver
 	.fetch_size		= efficeon_fetch_size,
 	.cleanup		= efficeon_cleanup,
 	.tlb_flush		= efficeon_tlbflush,
-	.mask_memory		= efficeon_mask_memory,
+	.mask_memory		= agp_generic_mask_memory,
 	.masks			= efficeon_generic_masks,
 	.agp_enable		= agp_generic_enable,
 	.cache_flush		= global_cache_flush,
--- diff/drivers/char/agp/intel-mch-agp.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/char/agp/intel-mch-agp.c	2004-04-21 10:45:34.014532504 +0100
@@ -487,9 +487,12 @@ static int __devinit agp_intelmch_probe(
 				     const struct pci_device_id *ent)
 {
 	struct agp_bridge_data *bridge;
+	struct resource *r;
 	char *name = "(unknown)";
 	u8 cap_ptr = 0;
-	struct resource *r;
+
+	if (!boot_cpu_has(X86_FEATURE_LM))
+		return -ENODEV;
 
 	cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP);
 
--- diff/drivers/char/agp/sis-agp.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/char/agp/sis-agp.c	2004-04-21 10:45:34.023531136 +0100
@@ -93,10 +93,14 @@ static void sis_648_enable(u32 mode)
 
 		pci_write_config_dword(device, agp + PCI_AGP_COMMAND, command);
 
-		if(device->device == PCI_DEVICE_ID_SI_648) {
-			// weird: on 648 and 648fx chipsets any rate change in the target command register
-			// triggers a 5ms screwup during which the master cannot be configured
-			printk(KERN_INFO PFX "sis 648 agp fix - giving bridge time to recover\n");
+		/*
+		 * Weird: on 648(fx) and 746(fx) chipsets any rate change in the target
+		 * command register triggers a 5ms screwup during which the master
+		 * cannot be configured		 
+		 */
+		if (device->device == PCI_DEVICE_ID_SI_648 ||
+		    device->device == PCI_DEVICE_ID_SI_746) {
+			printk(KERN_INFO PFX "SiS chipset with AGP problems detected. Giving bridge time to recover.\n");
 			set_current_state(TASK_UNINTERRUPTIBLE);
 			schedule_timeout (1+(HZ*10)/1000);
 		}
@@ -221,20 +225,27 @@ static struct agp_device_ids sis_agp_dev
 
 static void __devinit sis_get_driver(struct agp_bridge_data *bridge)
 {
-	if (bridge->dev->device == PCI_DEVICE_ID_SI_648) {
-		if (agp_bridge->major_version == 3 && agp_bridge->minor_version < 5) {
-			sis_driver.agp_enable=sis_648_enable;
-		} else {
-			sis_driver.agp_enable			= sis_648_enable;
-			sis_driver.aperture_sizes		= agp3_generic_sizes;
-			sis_driver.size_type			= U16_APER_SIZE;
-			sis_driver.num_aperture_sizes	= AGP_GENERIC_SIZES_ENTRIES;
-			sis_driver.configure			= agp3_generic_configure;
-			sis_driver.fetch_size			= agp3_generic_fetch_size;
-			sis_driver.cleanup				= agp3_generic_cleanup;
-			sis_driver.tlb_flush			= agp3_generic_tlbflush;
+	if (bridge->dev->device == PCI_DEVICE_ID_SI_648) { 
+		sis_driver.agp_enable=sis_648_enable;
+		if (agp_bridge->major_version == 3) {
+			sis_driver.aperture_sizes = agp3_generic_sizes;
+			sis_driver.size_type = U16_APER_SIZE;
+			sis_driver.num_aperture_sizes = AGP_GENERIC_SIZES_ENTRIES;
+			sis_driver.configure = agp3_generic_configure;
+			sis_driver.fetch_size = agp3_generic_fetch_size;
+			sis_driver.cleanup = agp3_generic_cleanup;
+			sis_driver.tlb_flush = agp3_generic_tlbflush;
 		}
 	}
+
+	if (bridge->dev->device == PCI_DEVICE_ID_SI_746) {
+		/*
+		 * We don't know enough about the 746 to enable it properly.
+		 * Though we do know that it needs the 'delay' hack to settle
+		 * after changing modes.
+		 */
+		sis_driver.agp_enable=sis_648_enable;
+	}
 }
 
 
--- diff/drivers/char/agp/via-agp.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/char/agp/via-agp.c	2004-04-21 10:45:34.024530984 +0100
@@ -160,23 +160,9 @@ static void via_tlbflush_agp3(struct agp
 }
 
 
-static struct aper_size_info_16 via_generic_agp3_sizes[11] =
-{
-	{ 4,     1024,  0, 1<<11|1<<10|1<<9|1<<8|1<<5|1<<4|1<<3|1<<2|1<<1|1<<0 },
-	{ 8,     2048,  1, 1<<11|1<<10|1<<9|1<<8|1<<5|1<<4|1<<3|1<<2|1<<1},
-	{ 16,    4096,  2, 1<<11|1<<10|1<<9|1<<8|1<<5|1<<4|1<<3|1<<2},
-	{ 32,    8192,  3, 1<<11|1<<10|1<<9|1<<8|1<<5|1<<4|1<<3},
-	{ 64,   16384,  4, 1<<11|1<<10|1<<9|1<<8|1<<5|1<<4},
-	{ 128,  32768,  5, 1<<11|1<<10|1<<9|1<<8|1<<5},
-	{ 256,  65536,  6, 1<<11|1<<10|1<<9|1<<8},
-	{ 512,  131072, 7, 1<<11|1<<10|1<<9},
-	{ 1024, 262144, 8, 1<<11|1<<10},
-	{ 2048, 524288, 9, 1<<11}	/* 2GB <- Max supported */
-};
-
 struct agp_bridge_driver via_agp3_driver = {
 	.owner			= THIS_MODULE,
-	.aperture_sizes		= via_generic_agp3_sizes,
+	.aperture_sizes		= agp3_generic_sizes,
 	.size_type		= U8_APER_SIZE,
 	.num_aperture_sizes	= 10,
 	.configure		= via_configure_agp3,
--- diff/drivers/char/applicom.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/char/applicom.c	2004-04-21 10:45:34.025530832 +0100
@@ -359,7 +359,7 @@ static ssize_t ac_write(struct file *fil
 	if (count != sizeof(struct st_ram_io) + sizeof(struct mailbox)) {
 		static int warncount = 5;
 		if (warncount) {
-			printk(KERN_INFO "Hmmm. write() of Applicom card, length %d != expected %d\n",
+			printk(KERN_INFO "Hmmm. write() of Applicom card, length %zd != expected %zd\n",
 			       count, sizeof(struct st_ram_io) + sizeof(struct mailbox));
 			warncount--;
 		}
@@ -467,18 +467,17 @@ static ssize_t ac_write(struct file *fil
 	return 0;
 }
 
-static int do_ac_read(int IndexCard, char *buf)
+static int do_ac_read(int IndexCard, char *buf,
+		struct st_ram_io *st_loc, struct mailbox *mailbox)
 {
-	struct st_ram_io st_loc;
-	struct mailbox tmpmailbox;	/* bounce buffer - can't copy to user space with cli() */
 	unsigned long from = (unsigned long)apbs[IndexCard].RamIO + RAM_TO_PC;
-	unsigned char *to = (unsigned char *)&tmpmailbox;
+	unsigned char *to = (unsigned char *)&mailbox;
 #ifdef DEBUG
 	int c;
 #endif
 
-	st_loc.tic_owner_to_pc = readb(apbs[IndexCard].RamIO + TIC_OWNER_TO_PC);
-	st_loc.numcard_owner_to_pc = readb(apbs[IndexCard].RamIO + NUMCARD_OWNER_TO_PC);
+	st_loc->tic_owner_to_pc = readb(apbs[IndexCard].RamIO + TIC_OWNER_TO_PC);
+	st_loc->numcard_owner_to_pc = readb(apbs[IndexCard].RamIO + NUMCARD_OWNER_TO_PC);
 
 
 	{
@@ -501,32 +500,24 @@ static int do_ac_read(int IndexCard, cha
 		printk("Read from applicom card #%d. struct st_ram_io follows:", NumCard);
 
 		for (c = 0; c < sizeof(struct st_ram_io);) {
-			printk("\n%5.5X: %2.2X", c, ((unsigned char *) &st_loc)[c]);
+			printk("\n%5.5X: %2.2X", c, ((unsigned char *)st_loc)[c]);
 
 			for (c++; c % 8 && c < sizeof(struct st_ram_io); c++) {
-				printk(" %2.2X", ((unsigned char *) &st_loc)[c]);
+				printk(" %2.2X", ((unsigned char *)st_loc)[c]);
 			}
 		}
 
 		printk("\nstruct mailbox follows:");
 
 		for (c = 0; c < sizeof(struct mailbox);) {
-			printk("\n%5.5X: %2.2X", c, ((unsigned char *) &tmpmailbox)[c]);
+			printk("\n%5.5X: %2.2X", c, ((unsigned char *)mailbox)[c]);
 
 			for (c++; c % 8 && c < sizeof(struct mailbox); c++) {
-				printk(" %2.2X", ((unsigned char *) &tmpmailbox)[c]);
+				printk(" %2.2X", ((unsigned char *)mailbox)[c]);
 			}
 		}
 		printk("\n");
 #endif
-
-#warning "Je suis stupide. DW. - copy*user in cli"
-
-	if (copy_to_user(buf, &st_loc, sizeof(struct st_ram_io)))
-		return -EFAULT;
-	if (copy_to_user(&buf[sizeof(struct st_ram_io)], &tmpmailbox, sizeof(struct mailbox)))
-		return -EFAULT;
-
 	return (sizeof(struct st_ram_io) + sizeof(struct mailbox));
 }
 
@@ -542,7 +533,7 @@ static ssize_t ac_read (struct file *fil
 #endif
 	/* No need to ratelimit this. Only root can trigger it anyway */
 	if (count != sizeof(struct st_ram_io) + sizeof(struct mailbox)) {
-		printk( KERN_WARNING "Hmmm. read() of Applicom card, length %d != expected %d\n",
+		printk( KERN_WARNING "Hmmm. read() of Applicom card, length %zd != expected %zd\n",
 			count,sizeof(struct st_ram_io) + sizeof(struct mailbox));
 		return -EINVAL;
 	}
@@ -561,11 +552,19 @@ static ssize_t ac_read (struct file *fil
 			tmp = readb(apbs[i].RamIO + DATA_TO_PC_READY);
 			
 			if (tmp == 2) {
+				struct st_ram_io st_loc;
+				struct mailbox mailbox;
+
 				/* Got a packet for us */
-				ret = do_ac_read(i, buf);
+				ret = do_ac_read(i, buf, &st_loc, &mailbox);
 				spin_unlock_irqrestore(&apbs[i].mutex, flags);
 				set_current_state(TASK_RUNNING);
 				remove_wait_queue(&FlagSleepRec, &wait);
+
+				if (copy_to_user(buf, &st_loc, sizeof(st_loc)))
+					return -EFAULT;
+				if (copy_to_user(buf + sizeof(st_loc), &mailbox, sizeof(mailbox)))
+					return -EFAULT;
 				return tmp;
 			}
 			
--- diff/drivers/char/drm/i810_dma.c	2003-09-30 15:46:12.000000000 +0100
+++ source/drivers/char/drm/i810_dma.c	2004-04-21 10:45:34.033529616 +0100
@@ -844,11 +844,13 @@ static void i810_dma_dispatch_vertex(drm
 	if (buf_priv->currently_mapped == I810_BUF_MAPPED) {
 		unsigned int prim = (sarea_priv->vertex_prim & PR_MASK);
 
-		*(u32 *)buf_priv->virtual = (GFX_OP_PRIMITIVE | prim | 
-					     ((used/4)-2));
+		put_user((GFX_OP_PRIMITIVE | prim |
+					     ((used/4)-2)),
+		(u32 *)buf_priv->virtual);
 
 		if (used & 4) {
-			*(u32 *)((u32)buf_priv->virtual + used) = 0;
+			put_user(0,
+			(u32 *)((u32)buf_priv->virtual + used));
 			used += 4;
 		}
 
--- diff/drivers/char/drm/i830_dma.c	2003-06-09 14:18:18.000000000 +0100
+++ source/drivers/char/drm/i830_dma.c	2004-04-21 10:45:34.043528096 +0100
@@ -39,6 +39,7 @@
 #include <linux/interrupt.h>	/* For task queue support */
 #include <linux/pagemap.h>	/* For FASTCALL on unlock_page() */
 #include <linux/delay.h>
+#include <asm/uaccess.h>
 
 #define I830_BUF_FREE		2
 #define I830_BUF_CLIENT		1
@@ -160,7 +161,7 @@ static int i830_map_buffer(drm_buf_t *bu
 	old_fops = filp->f_op;
 	filp->f_op = &i830_buffer_fops;
 	dev_priv->mmap_buffer = buf;
-	buf_priv->virtual = (void *)do_mmap(filp, 0, buf->total, 
+	buf_priv->virtual = (void __user *)do_mmap(filp, 0, buf->total,
 					    PROT_READ|PROT_WRITE,
 					    MAP_SHARED, 
 					    buf->bus_address);
@@ -462,7 +463,7 @@ static int i830_dma_initialize(drm_devic
 }
 
 int i830_dma_init(struct inode *inode, struct file *filp,
-		  unsigned int cmd, unsigned long arg)
+		  unsigned int cmd, unsigned long __user arg)
 {
    	drm_file_t *priv = filp->private_data;
    	drm_device_t *dev = priv->dev;
@@ -470,7 +471,7 @@ int i830_dma_init(struct inode *inode, s
    	drm_i830_init_t init;
    	int retcode = 0;
 	
-  	if (copy_from_user(&init, (drm_i830_init_t *)arg, sizeof(init)))
+  	if (copy_from_user(&init, (void * __user) arg, sizeof(init)))
 		return -EFAULT;
 	
    	switch(init.func) {
@@ -1164,19 +1165,19 @@ static void i830_dma_dispatch_vertex(drm
    	DRM_DEBUG(  "start + used - 4 : %ld\n", start + used - 4);
 
 	if (buf_priv->currently_mapped == I830_BUF_MAPPED) {
-		u32 *vp = buf_priv->virtual;
+		u32  *vp = buf_priv->virtual;
 
-		vp[0] = (GFX_OP_PRIMITIVE |
+		put_user( (GFX_OP_PRIMITIVE |
 			 sarea_priv->vertex_prim |
-			 ((used/4)-2));
+			  ((used/4)-2)), &vp[0]);
 
 		if (dev_priv->use_mi_batchbuffer_start) {
-			vp[used/4] = MI_BATCH_BUFFER_END; 
+			put_user(MI_BATCH_BUFFER_END, &vp[used/4]);
 			used += 4; 
 		}
 		
 		if (used & 4) {
-			vp[used/4] = 0;
+			put_user(0, &vp[used/4]);
 			used += 4;
 		}
 
@@ -1314,7 +1315,7 @@ void i830_reclaim_buffers( struct file *
 }
 
 int i830_flush_ioctl(struct inode *inode, struct file *filp, 
-		     unsigned int cmd, unsigned long arg)
+		     unsigned int cmd, unsigned long __user arg)
 {
    	drm_file_t	  *priv	  = filp->private_data;
    	drm_device_t	  *dev	  = priv->dev;
@@ -1329,7 +1330,7 @@ int i830_flush_ioctl(struct inode *inode
 }
 
 int i830_dma_vertex(struct inode *inode, struct file *filp,
-	       unsigned int cmd, unsigned long arg)
+	       unsigned int cmd, unsigned long __user arg)
 {
 	drm_file_t *priv = filp->private_data;
 	drm_device_t *dev = priv->dev;
@@ -1340,7 +1341,7 @@ int i830_dma_vertex(struct inode *inode,
      					dev_priv->sarea_priv; 
 	drm_i830_vertex_t vertex;
 
-	if (copy_from_user(&vertex, (drm_i830_vertex_t *)arg, sizeof(vertex)))
+	if (copy_from_user(&vertex, (drm_i830_vertex_t __user *)arg, sizeof(vertex)))
 		return -EFAULT;
 
    	if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) {
@@ -1364,13 +1365,13 @@ int i830_dma_vertex(struct inode *inode,
 }
 
 int i830_clear_bufs(struct inode *inode, struct file *filp,
-		   unsigned int cmd, unsigned long arg)
+		   unsigned int cmd, unsigned long __user arg)
 {
 	drm_file_t *priv = filp->private_data;
 	drm_device_t *dev = priv->dev;
 	drm_i830_clear_t clear;
 
-   	if (copy_from_user(&clear, (drm_i830_clear_t *)arg, sizeof(clear)))
+   	if (copy_from_user(&clear, (drm_i830_clear_t __user *)arg, sizeof(clear)))
 		return -EFAULT;
    
    	if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) {
@@ -1391,7 +1392,7 @@ int i830_clear_bufs(struct inode *inode,
 }
 
 int i830_swap_bufs(struct inode *inode, struct file *filp,
-		  unsigned int cmd, unsigned long arg)
+		  unsigned int cmd, unsigned long __user arg)
 {
 	drm_file_t *priv = filp->private_data;
 	drm_device_t *dev = priv->dev;
@@ -1434,7 +1435,7 @@ int i830_do_cleanup_pageflip( drm_device
 }
 
 int i830_flip_bufs(struct inode *inode, struct file *filp,
-		   unsigned int cmd, unsigned long arg)
+		   unsigned int cmd, unsigned long __user arg)
 {
 	drm_file_t *priv = filp->private_data;
 	drm_device_t *dev = priv->dev;
@@ -1455,7 +1456,7 @@ int i830_flip_bufs(struct inode *inode, 
 }
 
 int i830_getage(struct inode *inode, struct file *filp, unsigned int cmd,
-		unsigned long arg)
+		unsigned long __user arg)
 {
    	drm_file_t	  *priv	    = filp->private_data;
 	drm_device_t	  *dev	    = priv->dev;
@@ -1469,7 +1470,7 @@ int i830_getage(struct inode *inode, str
 }
 
 int i830_getbuf(struct inode *inode, struct file *filp, unsigned int cmd,
-		unsigned long arg)
+		unsigned long __user arg)
 {
 	drm_file_t	  *priv	    = filp->private_data;
 	drm_device_t	  *dev	    = priv->dev;
@@ -1481,7 +1482,7 @@ int i830_getbuf(struct inode *inode, str
      					dev_priv->sarea_priv; 
 
 	DRM_DEBUG("getbuf\n");
-   	if (copy_from_user(&d, (drm_i830_dma_t *)arg, sizeof(d)))
+   	if (copy_from_user(&d, (drm_i830_dma_t __user *)arg, sizeof(d)))
 		return -EFAULT;
    
 	if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) {
@@ -1496,7 +1497,7 @@ int i830_getbuf(struct inode *inode, str
 	DRM_DEBUG("i830_dma: %d returning %d, granted = %d\n",
 		  current->pid, retcode, d.granted);
 
-	if (copy_to_user((drm_dma_t *)arg, &d, sizeof(d)))
+	if (copy_to_user((drm_dma_t __user *)arg, &d, sizeof(d)))
 		return -EFAULT;
    	sarea_priv->last_dispatch = (int) hw_status[5];
 
@@ -1506,7 +1507,7 @@ int i830_getbuf(struct inode *inode, str
 int i830_copybuf(struct inode *inode,
 		 struct file *filp, 
 		 unsigned int cmd,
-		 unsigned long arg)
+		 unsigned long __user arg)
 {
 	/* Never copy - 2.4.x doesn't need it */
 	return 0;
@@ -1521,7 +1522,7 @@ int i830_docopy(struct inode *inode, str
 
 
 int i830_getparam( struct inode *inode, struct file *filp, unsigned int cmd,
-		      unsigned long arg )
+		      unsigned long __user arg )
 {
 	drm_file_t	  *priv	    = filp->private_data;
 	drm_device_t	  *dev	    = priv->dev;
@@ -1534,7 +1535,7 @@ int i830_getparam( struct inode *inode, 
 		return -EINVAL;
 	}
 
-	if (copy_from_user(&param, (drm_i830_getparam_t *)arg, sizeof(param) ))
+	if (copy_from_user(&param, (drm_i830_getparam_t __user *)arg, sizeof(param) ))
 		return -EFAULT;
 
 	switch( param.param ) {
@@ -1555,7 +1556,7 @@ int i830_getparam( struct inode *inode, 
 
 
 int i830_setparam( struct inode *inode, struct file *filp, unsigned int cmd,
-		   unsigned long arg )
+		   unsigned long __user arg )
 {
 	drm_file_t	  *priv	    = filp->private_data;
 	drm_device_t	  *dev	    = priv->dev;
@@ -1567,7 +1568,7 @@ int i830_setparam( struct inode *inode, 
 		return -EINVAL;
 	}
 
-	if (copy_from_user(&param, (drm_i830_setparam_t *)arg, sizeof(param) ))
+	if (copy_from_user(&param, (drm_i830_setparam_t __user *)arg, sizeof(param) ))
 		return -EFAULT;
 
 	switch( param.param ) {
--- diff/drivers/char/drm/i830_drm.h	2003-05-21 11:50:00.000000000 +0100
+++ source/drivers/char/drm/i830_drm.h	2004-04-21 10:45:34.052526728 +0100
@@ -290,11 +290,11 @@ typedef struct _drm_i830_vertex {
 typedef struct _drm_i830_copy_t {
    	int idx;		/* buffer index */
 	int used;		/* nr bytes in use */
-	void *address;		/* Address to copy from */
+	void __user *address;		/* Address to copy from */
 } drm_i830_copy_t;
 
 typedef struct drm_i830_dma {
-	void *virtual;
+	void __user *virtual;
 	int request_idx;
 	int request_size;
 	int granted;
@@ -304,7 +304,7 @@ typedef struct drm_i830_dma {
 /* 1.3: Userspace can request & wait on irq's:
  */
 typedef struct drm_i830_irq_emit {
-	int *irq_seq;
+	int __user *irq_seq;
 } drm_i830_irq_emit_t;
 
 typedef struct drm_i830_irq_wait {
@@ -318,7 +318,7 @@ typedef struct drm_i830_irq_wait {
 
 typedef struct drm_i830_getparam {
 	int param;
-	int *value;
+	int __user *value;
 } drm_i830_getparam_t;
 
 
--- diff/drivers/char/drm/i830_drv.h	2003-05-21 11:50:14.000000000 +0100
+++ source/drivers/char/drm/i830_drv.h	2004-04-21 10:45:34.053526576 +0100
@@ -36,7 +36,7 @@ typedef struct drm_i830_buf_priv {
    	u32 *in_use;
    	int my_use_idx;
 	int currently_mapped;
-	void *virtual;
+	void __user *virtual;
 	void *kernel_virtual;
 } drm_i830_buf_priv_t;
 
--- diff/drivers/char/drm/i830_irq.c	2003-09-30 15:46:12.000000000 +0100
+++ source/drivers/char/drm/i830_irq.c	2004-04-21 10:45:34.053526576 +0100
@@ -121,7 +121,7 @@ int i830_wait_irq(drm_device_t *dev, int
 /* Needs the lock as it touches the ring.
  */
 int i830_irq_emit( struct inode *inode, struct file *filp, unsigned int cmd,
-		   unsigned long arg )
+		   unsigned long __user arg )
 {
 	drm_file_t	  *priv	    = filp->private_data;
 	drm_device_t	  *dev	    = priv->dev;
--- diff/drivers/char/dsp56k.c	2003-10-09 09:47:33.000000000 +0100
+++ source/drivers/char/dsp56k.c	2004-04-21 10:45:34.058525816 +0100
@@ -35,6 +35,7 @@
 #include <linux/init.h>
 #include <linux/devfs_fs_kernel.h>
 #include <linux/smp_lock.h>
+#include <linux/device.h>
 
 #include <asm/atarihw.h>
 #include <asm/traps.h>
@@ -149,6 +150,8 @@ static struct dsp56k_device {
 	int tx_wsize, rx_wsize;
 } dsp56k;
 
+static struct class_simple *dsp56k_class;
+
 static int dsp56k_reset(void)
 {
 	u_char status;
@@ -502,6 +505,8 @@ static char banner[] __initdata = KERN_I
 
 static int __init dsp56k_init_driver(void)
 {
+	int err = 0;
+
 	if(!MACH_IS_ATARI || !ATARIHW_PRESENT(DSP56K)) {
 		printk("DSP56k driver: Hardware not present\n");
 		return -ENODEV;
@@ -511,17 +516,35 @@ static int __init dsp56k_init_driver(voi
 		printk("DSP56k driver: Unable to register driver\n");
 		return -ENODEV;
 	}
+	dsp56k_class = class_simple_create(THIS_MODULE, "dsp56k");
+	if (IS_ERR(dsp56k_class)) {
+		err = PTR_ERR(dsp56k_class);
+		goto out_chrdev;
+	}
+	class_simple_device_add(dsp56k_class, MKDEV(DSP56K_MAJOR, 0), NULL, "dsp56k");
 
-	devfs_mk_cdev(MKDEV(DSP56K_MAJOR, 0),
+	err = devfs_mk_cdev(MKDEV(DSP56K_MAJOR, 0),
 		      S_IFCHR | S_IRUSR | S_IWUSR, "dsp56k");
+	if(err)
+		goto out_class;
 
 	printk(banner);
-	return 0;
+	goto out;
+
+out_class:
+	class_simple_device_remove(MKDEV(DSP56K_MAJOR, 0));
+	class_simple_destroy(dsp56k_class);
+out_chrdev:
+	unregister_chrdev(DSP56K_MAJOR, "dsp56k");
+out:
+	return err;
 }
 module_init(dsp56k_init_driver);
 
 static void __exit dsp56k_cleanup_driver(void)
 {
+	class_simple_device_remove(MKDEV(DSP56K_MAJOR, 0));
+	class_simple_destroy(dsp56k_class);
 	unregister_chrdev(DSP56K_MAJOR, "dsp56k");
 	devfs_remove("dsp56k");
 }
--- diff/drivers/char/ftape/lowlevel/ftape-tracing.h	2002-10-16 04:28:32.000000000 +0100
+++ source/drivers/char/ftape/lowlevel/ftape-tracing.h	2004-04-21 10:45:34.063525056 +0100
@@ -70,8 +70,8 @@ typedef enum {
 #define TRACE(l, m, i...)						\
 {									\
 	if ((ft_trace_t)(l) == FT_TRACE_TOP_LEVEL) {			\
-		printk(KERN_INFO"ftape"__FILE__"("__FUNCTION__"):\n"	\
-		       KERN_INFO m".\n" ,##i);				\
+		printk(KERN_INFO"ftape%s(%s):\n"	                \
+		       KERN_INFO m".\n" ,__FILE__, __FUNCTION__ , ##i);	\
 	}								\
 }
 #define SET_TRACE_LEVEL(l)      if ((l) == (l)) do {} while(0)
--- diff/drivers/char/ftape/zftape/zftape-init.c	2003-09-17 12:28:04.000000000 +0100
+++ source/drivers/char/ftape/zftape/zftape-init.c	2004-04-21 10:45:34.064524904 +0100
@@ -38,6 +38,7 @@
 
 #include <linux/zftape.h>
 #include <linux/init.h>
+#include <linux/device.h>
 
 #include "../zftape/zftape-init.h"
 #include "../zftape/zftape-read.h"
@@ -103,6 +104,8 @@ static struct file_operations zft_cdev =
 	.release	= zft_close,
 };
 
+static struct class_simple *zft_class;
+
 /*      Open floppy tape device
  */
 static int zft_open(struct inode *ino, struct file *filep)
@@ -341,22 +344,29 @@ KERN_INFO
 	      "installing zftape VFS interface for ftape driver ...");
 	TRACE_CATCH(register_chrdev(QIC117_TAPE_MAJOR, "zft", &zft_cdev),);
 
+	zft_class = class_simple_create(THIS_MODULE, "zft");
 	for (i = 0; i < 4; i++) {
+		class_simple_device_add(zft_class, MKDEV(QIC117_TAPE_MAJOR, i), NULL, "qft%i", i);
 		devfs_mk_cdev(MKDEV(QIC117_TAPE_MAJOR, i),
 				S_IFCHR | S_IRUSR | S_IWUSR,
 				"qft%i", i);
+		class_simple_device_add(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 4), NULL, "nqft%i", i);
 		devfs_mk_cdev(MKDEV(QIC117_TAPE_MAJOR, i + 4),
 				S_IFCHR | S_IRUSR | S_IWUSR,
 				"nqft%i", i);
+		class_simple_device_add(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 16), NULL, "zqft%i", i);
 		devfs_mk_cdev(MKDEV(QIC117_TAPE_MAJOR, i + 16),
 				S_IFCHR | S_IRUSR | S_IWUSR,
 				"zqft%i", i);
+		class_simple_device_add(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 20), NULL, "nzqft%i", i);
 		devfs_mk_cdev(MKDEV(QIC117_TAPE_MAJOR, i + 20),
 				S_IFCHR | S_IRUSR | S_IWUSR,
 				"nzqft%i", i);
+		class_simple_device_add(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 32), NULL, "rawqft%i", i);
 		devfs_mk_cdev(MKDEV(QIC117_TAPE_MAJOR, i + 32),
 				S_IFCHR | S_IRUSR | S_IWUSR,
 				"rawqft%i", i);
+		class_simple_device_add(zft_class, MKDEV(QIC117_TAPE_MAJOR, i + 36), NULL, "nrawrawqft%i", i);
 		devfs_mk_cdev(MKDEV(QIC117_TAPE_MAJOR, i + 36),
 				S_IFCHR | S_IRUSR | S_IWUSR,
 				"nrawqft%i", i);
@@ -386,12 +396,19 @@ static void zft_exit(void)
 	}
         for (i = 0; i < 4; i++) {
 		devfs_remove("qft%i", i);
+		class_simple_device_remove(MKDEV(QIC117_TAPE_MAJOR, i));
 		devfs_remove("nqft%i", i);
+		class_simple_device_remove(MKDEV(QIC117_TAPE_MAJOR, i + 4));
 		devfs_remove("zqft%i", i);
+		class_simple_device_remove(MKDEV(QIC117_TAPE_MAJOR, i + 16));
 		devfs_remove("nzqft%i", i);
+		class_simple_device_remove(MKDEV(QIC117_TAPE_MAJOR, i + 20));
 		devfs_remove("rawqft%i", i);
+		class_simple_device_remove(MKDEV(QIC117_TAPE_MAJOR, i + 32));
 		devfs_remove("nrawqft%i", i);
+		class_simple_device_remove(MKDEV(QIC117_TAPE_MAJOR, i + 36));
 	}
+	class_simple_destroy(zft_class);
 	zft_uninit_mem(); /* release remaining memory, if any */
         printk(KERN_INFO "zftape successfully unloaded.\n");
 	TRACE_EXIT;
--- diff/drivers/char/hw_random.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/char/hw_random.c	2004-04-21 10:45:34.070523992 +0100
@@ -92,10 +92,12 @@ static void amd_cleanup(void);
 static unsigned int amd_data_present (void);
 static u32 amd_data_read (void);
 
+#ifdef __i386__
 static int __init via_init(struct pci_dev *dev);
 static void via_cleanup(void);
 static unsigned int via_data_present (void);
 static u32 via_data_read (void);
+#endif
 
 struct rng_operations {
 	int (*init) (struct pci_dev *dev);
@@ -137,8 +139,10 @@ static struct rng_operations rng_vendor_
 	/* rng_hw_amd */
 	{ amd_init, amd_cleanup, amd_data_present, amd_data_read, 4 },
 
+#ifdef __i386__
 	/* rng_hw_via */
 	{ via_init, via_cleanup, via_data_present, via_data_read, 1 },
+#endif
 };
 
 /*
@@ -341,6 +345,7 @@ static void amd_cleanup(void)
 	/* FIXME: twiddle pmio, also? */
 }
 
+#ifdef __i386__
 /***********************************************************************
  *
  * VIA RNG operations
@@ -456,6 +461,7 @@ static void via_cleanup(void)
 {
 	/* do nothing */
 }
+#endif
 
 
 /***********************************************************************
--- diff/drivers/char/ipmi/Kconfig	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/char/ipmi/Kconfig	2004-04-21 10:45:34.071523840 +0100
@@ -43,11 +43,13 @@ config IPMI_DEVICE_INTERFACE
          This provides an IOCTL interface to the IPMI message handler so
 	 userland processes may use IPMI.  It supports poll() and select().
 
-config IPMI_KCS
-       tristate 'IPMI KCS handler'
+config IPMI_SI
+       tristate 'IPMI System Interface handler'
        depends on IPMI_HANDLER
        help
-         Provides a driver for a KCS-style interface to a BMC.
+         Provides a driver for System Interfaces (KCS, SMIC, BT).
+	 Currently, only KCS and SMIC are supported.  If
+	 you are using IPMI, you should probably say "y" here.
 
 config IPMI_WATCHDOG
        tristate 'IPMI Watchdog Timer'
--- diff/drivers/char/ipmi/Makefile	2003-02-13 11:46:51.000000000 +0000
+++ source/drivers/char/ipmi/Makefile	2004-04-21 10:45:34.071523840 +0100
@@ -2,12 +2,13 @@
 # Makefile for the ipmi drivers.
 #
 
-ipmi_kcs_drv-objs := ipmi_kcs_sm.o ipmi_kcs_intf.o
+ipmi_si-objs := ipmi_si_intf.o ipmi_kcs_sm.o ipmi_smic_sm.o ipmi_bt_sm.o
 
 obj-$(CONFIG_IPMI_HANDLER) += ipmi_msghandler.o
 obj-$(CONFIG_IPMI_DEVICE_INTERFACE) += ipmi_devintf.o
-obj-$(CONFIG_IPMI_KCS) += ipmi_kcs_drv.o
+obj-$(CONFIG_IPMI_SI) += ipmi_si.o
 obj-$(CONFIG_IPMI_WATCHDOG) += ipmi_watchdog.o
 
-ipmi_kcs_drv.o:	$(ipmi_kcs_drv-objs)
-	$(LD) -r -o $@ $(ipmi_kcs_drv-objs) 
+ipmi_si.o:	$(ipmi_si-objs)
+	$(LD) -r -o $@ $(ipmi_si-objs)
+
--- diff/drivers/char/ipmi/ipmi_devintf.c	2003-09-17 12:28:05.000000000 +0100
+++ source/drivers/char/ipmi/ipmi_devintf.c	2004-04-21 10:45:34.076523080 +0100
@@ -33,6 +33,7 @@
 
 #include <linux/config.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/errno.h>
 #include <asm/system.h>
 #include <linux/sched.h>
@@ -44,6 +45,8 @@
 #include <asm/semaphore.h>
 #include <linux/init.h>
 
+#define IPMI_DEVINTF_VERSION "v31"
+
 struct ipmi_file_private
 {
 	ipmi_user_t          user;
@@ -53,6 +56,8 @@ struct ipmi_file_private
 	struct fasync_struct *fasync_queue;
 	wait_queue_head_t    wait;
 	struct semaphore     recv_sem;
+	int                  default_retries;
+	unsigned int         default_retry_time_ms;
 };
 
 static void file_receive_handler(struct ipmi_recv_msg *msg,
@@ -138,6 +143,10 @@ static int ipmi_open(struct inode *inode
 	priv->fasync_queue = NULL;
 	sema_init(&(priv->recv_sem), 1);
 
+	/* Use the low-level defaults. */
+	priv->default_retries = -1;
+	priv->default_retry_time_ms = 0;
+
 	return 0;
 }
 
@@ -158,6 +167,63 @@ static int ipmi_release(struct inode *in
 	return 0;
 }
 
+static int handle_send_req(ipmi_user_t     user,
+			   struct ipmi_req *req,
+			   int             retries,
+			   unsigned int    retry_time_ms)
+{
+	int              rv;
+	struct ipmi_addr addr;
+	unsigned char    *msgdata;
+
+	if (req->addr_len > sizeof(struct ipmi_addr))
+		return -EINVAL;
+
+	if (copy_from_user(&addr, req->addr, req->addr_len))
+		return -EFAULT;
+
+	msgdata = kmalloc(IPMI_MAX_MSG_LENGTH, GFP_KERNEL);
+	if (!msgdata)
+		return -ENOMEM;
+
+	/* From here out we cannot return, we must jump to "out" for
+	   error exits to free msgdata. */
+
+	rv = ipmi_validate_addr(&addr, req->addr_len);
+	if (rv)
+		goto out;
+
+	if (req->msg.data != NULL) {
+		if (req->msg.data_len > IPMI_MAX_MSG_LENGTH) {
+			rv = -EMSGSIZE;
+			goto out;
+		}
+
+		if (copy_from_user(&msgdata,
+				   req->msg.data,
+				   req->msg.data_len))
+		{
+			rv = -EFAULT;
+			goto out;
+		}
+	} else {
+		req->msg.data_len = 0;
+	}
+	req->msg.data = msgdata;
+
+	rv = ipmi_request_settime(user,
+				  &addr,
+				  req->msgid,
+				  &(req->msg),
+				  NULL,
+				  0,
+				  retries,
+				  retry_time_ms);
+ out:
+	kfree(msgdata);
+	return rv;
+}
+
 static int ipmi_ioctl(struct inode  *inode,
 		      struct file   *file,
 		      unsigned int  cmd,
@@ -170,54 +236,33 @@ static int ipmi_ioctl(struct inode  *ino
 	{
 	case IPMICTL_SEND_COMMAND:
 	{
-		struct ipmi_req    req;
-		struct ipmi_addr   addr;
-		unsigned char msgdata[IPMI_MAX_MSG_LENGTH];
+		struct ipmi_req req;
 
 		if (copy_from_user(&req, (void *) data, sizeof(req))) {
 			rv = -EFAULT;
 			break;
 		}
 
-		if (req.addr_len > sizeof(struct ipmi_addr))
-		{
-			rv = -EINVAL;
-			break;
-		}
+		rv = handle_send_req(priv->user,
+				     &req,
+				     priv->default_retries,
+				     priv->default_retry_time_ms);
+		break;
+	}
 
-		if (copy_from_user(&addr, req.addr, req.addr_len)) {
-			rv = -EFAULT;
-			break;
-		}
+	case IPMICTL_SEND_COMMAND_SETTIME:
+	{
+		struct ipmi_req_settime req;
 
-		rv = ipmi_validate_addr(&addr, req.addr_len);
-		if (rv)
+		if (copy_from_user(&req, (void *) data, sizeof(req))) {
+			rv = -EFAULT;
 			break;
-
-		if (req.msg.data != NULL) {
-			if (req.msg.data_len > IPMI_MAX_MSG_LENGTH) {
-				rv = -EMSGSIZE;
-				break;
-			}
-
-			if (copy_from_user(&msgdata,
-					   req.msg.data,
-					   req.msg.data_len))
-			{
-				rv = -EFAULT;
-				break;
-			}
-		} else {
-			req.msg.data_len = 0;
 		}
 
-		req.msg.data = msgdata;
-
-		rv = ipmi_request(priv->user,
-				  &addr,
-				  req.msgid,
-				  &(req.msg),
-				  0);
+		rv = handle_send_req(priv->user,
+				     &req.req,
+				     req.retries,
+				     req.retry_time_ms);
 		break;
 	}
 
@@ -416,7 +461,36 @@ static int ipmi_ioctl(struct inode  *ino
 		rv = 0;
 		break;
 	}
+	case IPMICTL_SET_TIMING_PARMS_CMD:
+	{
+		struct ipmi_timing_parms parms;
+
+		if (copy_from_user(&parms, (void *) data, sizeof(parms))) {
+			rv = -EFAULT;
+			break;
+		}
+
+		priv->default_retries = parms.retries;
+		priv->default_retry_time_ms = parms.retry_time_ms;
+		rv = 0;
+		break;
+	}
+
+	case IPMICTL_GET_TIMING_PARMS_CMD:
+	{
+		struct ipmi_timing_parms parms;
+
+		parms.retries = priv->default_retries;
+		parms.retry_time_ms = priv->default_retry_time_ms;
 
+		if (copy_to_user((void *) data, &parms, sizeof(parms))) {
+			rv = -EFAULT;
+			break;
+		}
+
+		rv = 0;
+		break;
+	}
 	}
   
 	return rv;
@@ -435,29 +509,30 @@ static struct file_operations ipmi_fops 
 #define DEVICE_NAME     "ipmidev"
 
 static int ipmi_major = 0;
-MODULE_PARM(ipmi_major, "i");
-
-#define MAX_DEVICES 10
+module_param(ipmi_major, int, 0);
+MODULE_PARM_DESC(ipmi_major, "Sets the major number of the IPMI device.  By"
+		 " default, or if you set it to zero, it will choose the next"
+		 " available device.  Setting it to -1 will disable the"
+		 " interface.  Other values will set the major device number"
+		 " to that value.");
 
 static void ipmi_new_smi(int if_num)
 {
-	if (if_num <= MAX_DEVICES) {
-		devfs_mk_cdev(MKDEV(ipmi_major, if_num),
-				S_IFCHR | S_IRUSR | S_IWUSR,
-				"ipmidev/%d", if_num);
-	}
+	devfs_mk_cdev(MKDEV(ipmi_major, if_num),
+		      S_IFCHR | S_IRUSR | S_IWUSR,
+		      "ipmidev/%d", if_num);
 }
 
 static void ipmi_smi_gone(int if_num)
 {
-	if (if_num <= MAX_DEVICES)
-		devfs_remove("ipmidev/%d", if_num);
+	devfs_remove("ipmidev/%d", if_num);
 }
 
 static struct ipmi_smi_watcher smi_watcher =
 {
-	.new_smi	= ipmi_new_smi,
-	.smi_gone	= ipmi_smi_gone,
+	.owner    = THIS_MODULE,
+	.new_smi  = ipmi_new_smi,
+	.smi_gone = ipmi_smi_gone,
 };
 
 static __init int init_ipmi_devintf(void)
@@ -467,6 +542,9 @@ static __init int init_ipmi_devintf(void
 	if (ipmi_major < 0)
 		return -EINVAL;
 
+	printk(KERN_INFO "ipmi device interface version "
+	       IPMI_DEVINTF_VERSION "\n");
+
 	rv = register_chrdev(ipmi_major, DEVICE_NAME, &ipmi_fops);
 	if (rv < 0) {
 		printk(KERN_ERR "ipmi: can't get major %d\n", ipmi_major);
@@ -482,13 +560,10 @@ static __init int init_ipmi_devintf(void
 	rv = ipmi_smi_watcher_register(&smi_watcher);
 	if (rv) {
 		unregister_chrdev(ipmi_major, DEVICE_NAME);
-		printk(KERN_WARNING "ipmi: can't register smi watcher");
+		printk(KERN_WARNING "ipmi: can't register smi watcher\n");
 		return rv;
 	}
 
-	printk(KERN_INFO "ipmi: device interface at char major %d\n",
-	       ipmi_major);
-
 	return 0;
 }
 module_init(init_ipmi_devintf);
@@ -500,21 +575,5 @@ static __exit void cleanup_ipmi(void)
 	unregister_chrdev(ipmi_major, DEVICE_NAME);
 }
 module_exit(cleanup_ipmi);
-#ifndef MODULE
-static __init int ipmi_setup (char *str)
-{
-	int x;
-
-	if (get_option (&str, &x)) {
-		/* ipmi=x sets the major number to x. */
-		ipmi_major = x;
-	} else if (!strcmp(str, "off")) {
-		ipmi_major = -1;
-	}
-
-	return 1;
-}
-#endif
 
-__setup("ipmi=", ipmi_setup);
 MODULE_LICENSE("GPL");
--- diff/drivers/char/ipmi/ipmi_kcs_sm.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/char/ipmi/ipmi_kcs_sm.c	2004-04-21 10:45:34.084521864 +0100
@@ -37,13 +37,12 @@
  * that document.
  */
 
-#include <linux/types.h>
+#include <linux/kernel.h> /* For printk. */
+#include <linux/string.h>
+#include <linux/ipmi_msgdefs.h>		/* for completion codes */
+#include "ipmi_si_sm.h"
 
-#include <asm/io.h>
-#include <asm/string.h>		/* Gets rid of memcpy warning */
-#include <asm/system.h>
-
-#include "ipmi_kcs_sm.h"
+#define IPMI_KCS_VERSION "v31"
 
 /* Set this if you want a printout of why the state machine was hosed
    when it gets hosed. */
@@ -95,32 +94,28 @@ enum kcs_states {
 #define OBF_RETRY_TIMEOUT 1000000
 #define MAX_ERROR_RETRIES 10
 
-#define IPMI_ERR_MSG_TRUNCATED	0xc6
-#define IPMI_ERR_UNSPECIFIED	0xff
-
-struct kcs_data
+struct si_sm_data
 {
-	enum kcs_states state;
-	unsigned int    port;
-	unsigned char	*addr;
-	unsigned char   write_data[MAX_KCS_WRITE_SIZE];
-	int             write_pos;
-	int             write_count;
-	int             orig_write_count;
-	unsigned char   read_data[MAX_KCS_READ_SIZE];
-	int             read_pos;
-	int	        truncated;
+	enum kcs_states  state;
+	struct si_sm_io *io;
+	unsigned char    write_data[MAX_KCS_WRITE_SIZE];
+	int              write_pos;
+	int              write_count;
+	int              orig_write_count;
+	unsigned char    read_data[MAX_KCS_READ_SIZE];
+	int              read_pos;
+	int	         truncated;
 
 	unsigned int  error_retries;
 	long          ibf_timeout;
 	long          obf_timeout;
 };
 
-void init_kcs_data(struct kcs_data *kcs, unsigned int port, unsigned char *addr)
+static unsigned int init_kcs_data(struct si_sm_data *kcs,
+				  struct si_sm_io *io)
 {
 	kcs->state = KCS_IDLE;
-	kcs->port = port;
-	kcs->addr = addr;
+	kcs->io = io;
 	kcs->write_pos = 0;
 	kcs->write_count = 0;
 	kcs->orig_write_count = 0;
@@ -129,40 +124,29 @@ void init_kcs_data(struct kcs_data *kcs,
 	kcs->truncated = 0;
 	kcs->ibf_timeout = IBF_RETRY_TIMEOUT;
 	kcs->obf_timeout = OBF_RETRY_TIMEOUT;
-}
 
-/* Remember, init_one_kcs() insured port and addr can't both be set */
+	/* Reserve 2 I/O bytes. */
+	return 2;
+}
 
-static inline unsigned char read_status(struct kcs_data *kcs)
+static inline unsigned char read_status(struct si_sm_data *kcs)
 {
-        if (kcs->port)
-		return inb(kcs->port + 1);
-        else
-		return readb(kcs->addr + 1);
+	return kcs->io->inputb(kcs->io, 1);
 }
 
-static inline unsigned char read_data(struct kcs_data *kcs)
+static inline unsigned char read_data(struct si_sm_data *kcs)
 {
-        if (kcs->port)
-		return inb(kcs->port + 0);
-        else
-		return readb(kcs->addr + 0);
+	return kcs->io->inputb(kcs->io, 0);
 }
 
-static inline void write_cmd(struct kcs_data *kcs, unsigned char data)
+static inline void write_cmd(struct si_sm_data *kcs, unsigned char data)
 {
-        if (kcs->port)
-		outb(data, kcs->port + 1);
-        else
-		writeb(data, kcs->addr + 1);
+	kcs->io->outputb(kcs->io, 1, data);
 }
 
-static inline void write_data(struct kcs_data *kcs, unsigned char data)
+static inline void write_data(struct si_sm_data *kcs, unsigned char data)
 {
-        if (kcs->port)
-		outb(data, kcs->port + 0);
-        else
-		writeb(data, kcs->addr + 0);
+	kcs->io->outputb(kcs->io, 0, data);
 }
 
 /* Control codes. */
@@ -182,14 +166,14 @@ static inline void write_data(struct kcs
 #define GET_STATUS_OBF(status) ((status) & 0x01)
 
 
-static inline void write_next_byte(struct kcs_data *kcs)
+static inline void write_next_byte(struct si_sm_data *kcs)
 {
 	write_data(kcs, kcs->write_data[kcs->write_pos]);
 	(kcs->write_pos)++;
 	(kcs->write_count)--;
 }
 
-static inline void start_error_recovery(struct kcs_data *kcs, char *reason)
+static inline void start_error_recovery(struct si_sm_data *kcs, char *reason)
 {
 	(kcs->error_retries)++;
 	if (kcs->error_retries > MAX_ERROR_RETRIES) {
@@ -202,7 +186,7 @@ static inline void start_error_recovery(
 	}
 }
 
-static inline void read_next_byte(struct kcs_data *kcs)
+static inline void read_next_byte(struct si_sm_data *kcs)
 {
 	if (kcs->read_pos >= MAX_KCS_READ_SIZE) {
 		/* Throw the data away and mark it truncated. */
@@ -215,9 +199,8 @@ static inline void read_next_byte(struct
 	write_data(kcs, KCS_READ_BYTE);
 }
 
-static inline int check_ibf(struct kcs_data *kcs,
-			    unsigned char   status,
-			    long            time)
+static inline int check_ibf(struct si_sm_data *kcs, unsigned char status,
+			    long time)
 {
 	if (GET_STATUS_IBF(status)) {
 		kcs->ibf_timeout -= time;
@@ -232,9 +215,8 @@ static inline int check_ibf(struct kcs_d
 	return 1;
 }
 
-static inline int check_obf(struct kcs_data *kcs,
-			    unsigned char   status,
-			    long            time)
+static inline int check_obf(struct si_sm_data *kcs, unsigned char status,
+			    long time)
 {
 	if (! GET_STATUS_OBF(status)) {
 		kcs->obf_timeout -= time;
@@ -248,13 +230,13 @@ static inline int check_obf(struct kcs_d
 	return 1;
 }
 
-static void clear_obf(struct kcs_data *kcs, unsigned char status)
+static void clear_obf(struct si_sm_data *kcs, unsigned char status)
 {
 	if (GET_STATUS_OBF(status))
 		read_data(kcs);
 }
 
-static void restart_kcs_transaction(struct kcs_data *kcs)
+static void restart_kcs_transaction(struct si_sm_data *kcs)
 {
 	kcs->write_count = kcs->orig_write_count;
 	kcs->write_pos = 0;
@@ -265,7 +247,8 @@ static void restart_kcs_transaction(stru
 	write_cmd(kcs, KCS_WRITE_START);
 }
 
-int start_kcs_transaction(struct kcs_data *kcs, char *data, unsigned int size)
+static int start_kcs_transaction(struct si_sm_data *kcs, unsigned char *data,
+				 unsigned int size)
 {
 	if ((size < 2) || (size > MAX_KCS_WRITE_SIZE)) {
 		return -1;
@@ -287,7 +270,8 @@ int start_kcs_transaction(struct kcs_dat
 	return 0;
 }
 
-int kcs_get_result(struct kcs_data *kcs, unsigned char *data, int length)
+static int get_kcs_result(struct si_sm_data *kcs, unsigned char *data,
+			  unsigned int length)
 {
 	if (length < kcs->read_pos) {
 		kcs->read_pos = length;
@@ -316,7 +300,7 @@ int kcs_get_result(struct kcs_data *kcs,
 /* This implements the state machine defined in the IPMI manual, see
    that for details on how this works.  Divide that flowchart into
    sections delimited by "Wait for IBF" and this will become clear. */
-enum kcs_result kcs_event(struct kcs_data *kcs, long time)
+static enum si_sm_result kcs_event(struct si_sm_data *kcs, long time)
 {
 	unsigned char status;
 	unsigned char state;
@@ -328,7 +312,7 @@ enum kcs_result kcs_event(struct kcs_dat
 #endif
 	/* All states wait for ibf, so just do it here. */
 	if (!check_ibf(kcs, status, time))
-		return KCS_CALL_WITH_DELAY;
+		return SI_SM_CALL_WITH_DELAY;
 
 	/* Just about everything looks at the KCS state, so grab that, too. */
 	state = GET_STATUS_STATE(status);
@@ -339,9 +323,9 @@ enum kcs_result kcs_event(struct kcs_dat
 		clear_obf(kcs, status);
 
 		if (GET_STATUS_ATN(status))
-			return KCS_ATTN;
+			return SI_SM_ATTN;
 		else
-			return KCS_SM_IDLE;
+			return SI_SM_IDLE;
 
 	case KCS_START_OP:
 		if (state != KCS_IDLE) {
@@ -408,7 +392,7 @@ enum kcs_result kcs_event(struct kcs_dat
 
 		if (state == KCS_READ_STATE) {
 			if (! check_obf(kcs, status, time))
-				return KCS_CALL_WITH_DELAY;
+				return SI_SM_CALL_WITH_DELAY;
 			read_next_byte(kcs);
 		} else {
 			/* We don't implement this exactly like the state
@@ -421,7 +405,7 @@ enum kcs_result kcs_event(struct kcs_dat
 			clear_obf(kcs, status);
 			kcs->orig_write_count = 0;
 			kcs->state = KCS_IDLE;
-			return KCS_TRANSACTION_COMPLETE;
+			return SI_SM_TRANSACTION_COMPLETE;
 		}
 		break;
 
@@ -444,7 +428,7 @@ enum kcs_result kcs_event(struct kcs_dat
 			break;
 		}
 		if (! check_obf(kcs, status, time))
-			return KCS_CALL_WITH_DELAY;
+			return SI_SM_CALL_WITH_DELAY;
 
 		clear_obf(kcs, status);
 		write_data(kcs, KCS_READ_BYTE);
@@ -459,14 +443,14 @@ enum kcs_result kcs_event(struct kcs_dat
 		}
 
 		if (! check_obf(kcs, status, time))
-			return KCS_CALL_WITH_DELAY;
+			return SI_SM_CALL_WITH_DELAY;
 
 		clear_obf(kcs, status);
 		if (kcs->orig_write_count) {
 			restart_kcs_transaction(kcs);
 		} else {
 			kcs->state = KCS_IDLE;
-			return KCS_TRANSACTION_COMPLETE;
+			return SI_SM_TRANSACTION_COMPLETE;
 		}
 		break;
 			
@@ -475,14 +459,42 @@ enum kcs_result kcs_event(struct kcs_dat
 	}
 
 	if (kcs->state == KCS_HOSED) {
-		init_kcs_data(kcs, kcs->port, kcs->addr);
-		return KCS_SM_HOSED;
+		init_kcs_data(kcs, kcs->io);
+		return SI_SM_HOSED;
 	}
 
-	return KCS_CALL_WITHOUT_DELAY;
+	return SI_SM_CALL_WITHOUT_DELAY;
 }
 
-int kcs_size(void)
+static int kcs_size(void)
 {
-	return sizeof(struct kcs_data);
+	return sizeof(struct si_sm_data);
 }
+
+static int kcs_detect(struct si_sm_data *kcs)
+{
+	/* It's impossible for the KCS status register to be all 1's,
+	   (assuming a properly functioning, self-initialized BMC)
+	   but that's what you get from reading a bogus address, so we
+	   test that first. */
+	if (read_status(kcs) == 0xff)
+		return 1;
+
+	return 0;
+}
+
+static void kcs_cleanup(struct si_sm_data *kcs)
+{
+}
+
+struct si_sm_handlers kcs_smi_handlers =
+{
+	.version           = IPMI_KCS_VERSION,
+	.init_data         = init_kcs_data,
+	.start_transaction = start_kcs_transaction,
+	.get_result        = get_kcs_result,
+	.event             = kcs_event,
+	.detect            = kcs_detect,
+	.cleanup           = kcs_cleanup,
+	.size              = kcs_size,
+};
--- diff/drivers/char/ipmi/ipmi_msghandler.c	2003-10-27 09:20:37.000000000 +0000
+++ source/drivers/char/ipmi/ipmi_msghandler.c	2004-04-21 10:45:34.089521104 +0100
@@ -44,16 +44,21 @@
 #include <linux/ipmi_smi.h>
 #include <linux/notifier.h>
 #include <linux/init.h>
+#include <linux/proc_fs.h>
+
+#define IPMI_MSGHANDLER_VERSION "v31"
 
 struct ipmi_recv_msg *ipmi_alloc_recv_msg(void);
 static int ipmi_init_msghandler(void);
 
 static int initialized = 0;
 
+static struct proc_dir_entry *proc_ipmi_root = NULL;
+
 #define MAX_EVENTS_IN_QUEUE	25
 
 /* Don't let a message sit in a queue forever, always time it with at lest
-   the max message timer. */
+   the max message timer.  This is in milliseconds. */
 #define MAX_MSG_TIMEOUT		60000
 
 struct ipmi_user
@@ -82,7 +87,8 @@ struct cmd_rcvr
 
 struct seq_table
 {
-	int                  inuse : 1;
+	unsigned int         inuse : 1;
+	unsigned int         broadcast : 1;
 
 	unsigned long        timeout;
 	unsigned long        orig_timeout;
@@ -111,10 +117,19 @@ struct seq_table
 
 #define NEXT_SEQID(seqid) (((seqid) + 1) & 0x3fffff)
 
+struct ipmi_channel
+{
+	unsigned char medium;
+	unsigned char protocol;
+};
 
 #define IPMI_IPMB_NUM_SEQ	64
+#define IPMI_MAX_CHANNELS       8
 struct ipmi_smi
 {
+	/* What interface number are we? */
+	int intf_num;
+
 	/* The list of upper layers that are using me.  We read-lock
            this when delivering messages to the upper layer to keep
            the user from going away while we are processing the
@@ -123,6 +138,9 @@ struct ipmi_smi
 	rwlock_t                users_lock;
 	struct list_head        users;
 
+	/* Used for wake ups at startup. */
+	wait_queue_head_t waitq;
+
 	/* The IPMI version of the BMC on the other end. */
 	unsigned char       version_major;
 	unsigned char       version_minor;
@@ -182,6 +200,86 @@ struct ipmi_smi
 	   it.  Note that the message will still be freed by the
 	   caller.  This only works on the system interface. */
 	void (*null_user_handler)(ipmi_smi_t intf, struct ipmi_smi_msg *msg);
+
+	/* When we are scanning the channels for an SMI, this will
+	   tell which channel we are scanning. */
+	int curr_channel;
+
+	/* Channel information */
+	struct ipmi_channel channels[IPMI_MAX_CHANNELS];
+
+	/* Proc FS stuff. */
+	struct proc_dir_entry *proc_dir;
+	char                  proc_dir_name[10];
+
+	spinlock_t   counter_lock; /* For making counters atomic. */
+
+	/* Commands we got that were invalid. */
+	unsigned int sent_invalid_commands;
+
+	/* Commands we sent to the MC. */
+	unsigned int sent_local_commands;
+	/* Responses from the MC that were delivered to a user. */
+	unsigned int handled_local_responses;
+	/* Responses from the MC that were not delivered to a user. */
+	unsigned int unhandled_local_responses;
+
+	/* Commands we sent out to the IPMB bus. */
+	unsigned int sent_ipmb_commands;
+	/* Commands sent on the IPMB that had errors on the SEND CMD */
+	unsigned int sent_ipmb_command_errs;
+	/* Each retransmit increments this count. */
+	unsigned int retransmitted_ipmb_commands;
+	/* When a message times out (runs out of retransmits) this is
+           incremented. */
+	unsigned int timed_out_ipmb_commands;
+
+	/* This is like above, but for broadcasts.  Broadcasts are
+           *not* included in the above count (they are expected to
+           time out). */
+	unsigned int timed_out_ipmb_broadcasts;
+
+	/* Responses I have sent to the IPMB bus. */
+	unsigned int sent_ipmb_responses;
+
+	/* The response was delivered to the user. */
+	unsigned int handled_ipmb_responses;
+	/* The response had invalid data in it. */
+	unsigned int invalid_ipmb_responses;
+	/* The response didn't have anyone waiting for it. */
+	unsigned int unhandled_ipmb_responses;
+
+	/* Commands we sent out to the IPMB bus. */
+	unsigned int sent_lan_commands;
+	/* Commands sent on the IPMB that had errors on the SEND CMD */
+	unsigned int sent_lan_command_errs;
+	/* Each retransmit increments this count. */
+	unsigned int retransmitted_lan_commands;
+	/* When a message times out (runs out of retransmits) this is
+           incremented. */
+	unsigned int timed_out_lan_commands;
+
+	/* Responses I have sent to the IPMB bus. */
+	unsigned int sent_lan_responses;
+
+	/* The response was delivered to the user. */
+	unsigned int handled_lan_responses;
+	/* The response had invalid data in it. */
+	unsigned int invalid_lan_responses;
+	/* The response didn't have anyone waiting for it. */
+	unsigned int unhandled_lan_responses;
+
+	/* The command was delivered to the user. */
+	unsigned int handled_commands;
+	/* The command had invalid data in it. */
+	unsigned int invalid_commands;
+	/* The command didn't have anyone waiting for it. */
+	unsigned int unhandled_commands;
+
+	/* Invalid data in an event. */
+	unsigned int invalid_events;
+	/* Events that were received with the proper format. */
+	unsigned int events;
 };
 
 int
@@ -264,6 +362,21 @@ int ipmi_smi_watcher_unregister(struct i
 	return 0;
 }
 
+static void
+call_smi_watchers(int i)
+{
+	struct ipmi_smi_watcher *w;
+
+	down_read(&smi_watchers_sem);
+	list_for_each_entry(w, &smi_watchers, link) {
+		if (try_module_get(w->owner)) {
+			w->new_smi(i);
+			module_put(w->owner);
+		}
+	}
+	up_read(&smi_watchers_sem);
+}
+
 int
 ipmi_addr_equal(struct ipmi_addr *addr1, struct ipmi_addr *addr2)
 {
@@ -293,6 +406,19 @@ ipmi_addr_equal(struct ipmi_addr *addr1,
 			&& (ipmb_addr1->lun == ipmb_addr2->lun));
 	}
 
+	if (addr1->addr_type == IPMI_LAN_ADDR_TYPE) {
+		struct ipmi_lan_addr *lan_addr1
+			= (struct ipmi_lan_addr *) addr1;
+		struct ipmi_lan_addr *lan_addr2
+		    = (struct ipmi_lan_addr *) addr2;
+
+		return ((lan_addr1->remote_SWID == lan_addr2->remote_SWID)
+			&& (lan_addr1->local_SWID == lan_addr2->local_SWID)
+			&& (lan_addr1->session_handle
+			    == lan_addr2->session_handle)
+			&& (lan_addr1->lun == lan_addr2->lun));
+	}
+
 	return 1;
 }
 
@@ -322,6 +448,13 @@ int ipmi_validate_addr(struct ipmi_addr 
 		return 0;
 	}
 
+	if (addr->addr_type == IPMI_LAN_ADDR_TYPE) {
+		if (len < sizeof(struct ipmi_lan_addr)) {
+			return -EINVAL;
+		}
+		return 0;
+	}
+
 	return -EINVAL;
 }
 
@@ -341,7 +474,7 @@ unsigned int ipmi_addr_length(int addr_t
 
 static void deliver_response(struct ipmi_recv_msg *msg)
 {
-    msg->user->handler->ipmi_recv_hndl(msg, msg->user->handler_data);
+	msg->user->handler->ipmi_recv_hndl(msg, msg->user->handler_data);
 }
 
 /* Find the next sequence number not being used and add the given
@@ -351,6 +484,7 @@ static int intf_next_seq(ipmi_smi_t     
 			 struct ipmi_recv_msg *recv_msg,
 			 unsigned long        timeout,
 			 int                  retries,
+			 int                  broadcast,
 			 unsigned char        *seq,
 			 long                 *seqid)
 {
@@ -373,6 +507,7 @@ static int intf_next_seq(ipmi_smi_t     
 		intf->seq_table[i].timeout = MAX_MSG_TIMEOUT;
 		intf->seq_table[i].orig_timeout = timeout;
 		intf->seq_table[i].retries_left = retries;
+		intf->seq_table[i].broadcast = broadcast;
 		intf->seq_table[i].inuse = 1;
 		intf->seq_table[i].seqid = NEXT_SEQID(intf->seq_table[i].seqid);
 		*seq = i;
@@ -425,8 +560,8 @@ static int intf_find_seq(ipmi_smi_t     
 
 
 /* Start the timer for a specific sequence table entry. */
-static int intf_start_seq_timer(ipmi_smi_t           intf,
-				long                 msgid)
+static int intf_start_seq_timer(ipmi_smi_t intf,
+				long       msgid)
 {
 	int           rv = -ENODEV;
 	unsigned long flags;
@@ -451,6 +586,46 @@ static int intf_start_seq_timer(ipmi_smi
 	return rv;
 }
 
+/* Got an error for the send message for a specific sequence number. */
+static int intf_err_seq(ipmi_smi_t   intf,
+			long         msgid,
+			unsigned int err)
+{
+	int                  rv = -ENODEV;
+	unsigned long        flags;
+	unsigned char        seq;
+	unsigned long        seqid;
+	struct ipmi_recv_msg *msg = NULL;
+
+
+	GET_SEQ_FROM_MSGID(msgid, seq, seqid);
+
+	spin_lock_irqsave(&(intf->seq_lock), flags);
+	/* We do this verification because the user can be deleted
+           while a message is outstanding. */
+	if ((intf->seq_table[seq].inuse)
+	    && (intf->seq_table[seq].seqid == seqid))
+	{
+		struct seq_table *ent = &(intf->seq_table[seq]);
+
+		ent->inuse = 0;
+		msg = ent->recv_msg;
+		rv = 0;
+	}
+	spin_unlock_irqrestore(&(intf->seq_lock), flags);
+
+	if (msg) {
+		msg->recv_type = IPMI_RESPONSE_RECV_TYPE;
+		msg->msg_data[0] = err;
+		msg->msg.netfn |= 1; /* Convert to a response. */
+		msg->msg.data_len = 1;
+		msg->msg.data = msg->msg_data;
+		deliver_response(msg);
+	}
+
+	return rv;
+}
+
 
 int ipmi_create_user(unsigned int          if_num,
 		     struct ipmi_user_hndl *handler,
@@ -523,15 +698,14 @@ static int ipmi_destroy_user_nolock(ipmi
 {
 	int              rv = -ENODEV;
 	ipmi_user_t      t_user;
-	struct list_head *entry, *entry2;
+	struct cmd_rcvr  *rcvr, *rcvr2;
 	int              i;
 	unsigned long    flags;
 
 	/* Find the user and delete them from the list. */
-	list_for_each(entry, &(user->intf->users)) {
-		t_user = list_entry(entry, struct ipmi_user, link);
+	list_for_each_entry(t_user, &(user->intf->users), link) {
 		if (t_user == user) {
-			list_del(entry);
+			list_del(&t_user->link);
 			rv = 0;
 			break;
 		}
@@ -554,11 +728,9 @@ static int ipmi_destroy_user_nolock(ipmi
 
 	/* Remove the user from the command receiver's table. */
 	write_lock_irqsave(&(user->intf->cmd_rcvr_lock), flags);
-	list_for_each_safe(entry, entry2, &(user->intf->cmd_rcvrs)) {
-		struct cmd_rcvr *rcvr;
-		rcvr = list_entry(entry, struct cmd_rcvr, link);
+	list_for_each_entry_safe(rcvr, rcvr2, &(user->intf->cmd_rcvrs), link) {
 		if (rcvr->user == user) {
-			list_del(entry);
+			list_del(&rcvr->link);
 			kfree(rcvr);
 		}
 	}
@@ -621,8 +793,7 @@ unsigned char ipmi_get_my_LUN(ipmi_user_
 int ipmi_set_gets_events(ipmi_user_t user, int val)
 {
 	unsigned long         flags;
-	struct list_head      *e, *e2;
-	struct ipmi_recv_msg  *msg;
+	struct ipmi_recv_msg  *msg, *msg2;
 
 	read_lock(&(user->intf->users_lock));
 	spin_lock_irqsave(&(user->intf->events_lock), flags);
@@ -630,9 +801,8 @@ int ipmi_set_gets_events(ipmi_user_t use
 
 	if (val) {
 		/* Deliver any queued events. */
-		list_for_each_safe(e, e2, &(user->intf->waiting_events)) {
-			msg = list_entry(e, struct ipmi_recv_msg, link);
-			list_del(e);
+		list_for_each_entry_safe(msg, msg2, &(user->intf->waiting_events), link) {
+			list_del(&msg->link);
 			msg->user = user;
 			deliver_response(msg);
 		}
@@ -648,7 +818,7 @@ int ipmi_register_for_cmd(ipmi_user_t   
 			  unsigned char netfn,
 			  unsigned char cmd)
 {
-	struct list_head *entry;
+	struct cmd_rcvr  *cmp;
 	unsigned long    flags;
 	struct cmd_rcvr  *rcvr;
 	int              rv = 0;
@@ -666,9 +836,7 @@ int ipmi_register_for_cmd(ipmi_user_t   
 	}
 
 	/* Make sure the command/netfn is not already registered. */
-	list_for_each(entry, &(user->intf->cmd_rcvrs)) {
-		struct cmd_rcvr *cmp;
-		cmp = list_entry(entry, struct cmd_rcvr, link);
+	list_for_each_entry(cmp, &(user->intf->cmd_rcvrs), link) {
 		if ((cmp->netfn == netfn) && (cmp->cmd == cmd)) {
 			rv = -EBUSY;
 			break;
@@ -695,7 +863,6 @@ int ipmi_unregister_for_cmd(ipmi_user_t 
 			    unsigned char netfn,
 			    unsigned char cmd)
 {
-	struct list_head *entry;
 	unsigned long    flags;
 	struct cmd_rcvr  *rcvr;
 	int              rv = -ENOENT;
@@ -703,11 +870,10 @@ int ipmi_unregister_for_cmd(ipmi_user_t 
 	read_lock(&(user->intf->users_lock));
 	write_lock_irqsave(&(user->intf->cmd_rcvr_lock), flags);
 	/* Make sure the command/netfn is not already registered. */
-	list_for_each(entry, &(user->intf->cmd_rcvrs)) {
-		rcvr = list_entry(entry, struct cmd_rcvr, link);
+	list_for_each_entry(rcvr, &(user->intf->cmd_rcvrs), link) {
 		if ((rcvr->netfn == netfn) && (rcvr->cmd == cmd)) {
 			rv = 0;
-			list_del(entry);
+			list_del(&rcvr->link);
 			kfree(rcvr);
 			break;
 		}
@@ -771,6 +937,43 @@ static inline void format_ipmb_msg(struc
 	smi_msg->msgid = msgid;
 }
 
+static inline void format_lan_msg(struct ipmi_smi_msg   *smi_msg,
+				  struct ipmi_msg       *msg,
+				  struct ipmi_lan_addr  *lan_addr,
+				  long                  msgid,
+				  unsigned char         ipmb_seq,
+				  unsigned char         source_lun)
+{
+	/* Format the IPMB header data. */
+	smi_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2);
+	smi_msg->data[1] = IPMI_SEND_MSG_CMD;
+	smi_msg->data[2] = lan_addr->channel;
+	smi_msg->data[3] = lan_addr->session_handle;
+	smi_msg->data[4] = lan_addr->remote_SWID;
+	smi_msg->data[5] = (msg->netfn << 2) | (lan_addr->lun & 0x3);
+	smi_msg->data[6] = ipmb_checksum(&(smi_msg->data[4]), 2);
+	smi_msg->data[7] = lan_addr->local_SWID;
+	smi_msg->data[8] = (ipmb_seq << 2) | source_lun;
+	smi_msg->data[9] = msg->cmd;
+
+	/* Now tack on the data to the message. */
+	if (msg->data_len > 0)
+		memcpy(&(smi_msg->data[10]), msg->data,
+		       msg->data_len);
+	smi_msg->data_size = msg->data_len + 10;
+
+	/* Now calculate the checksum and tack it on. */
+	smi_msg->data[smi_msg->data_size]
+		= ipmb_checksum(&(smi_msg->data[7]),
+				smi_msg->data_size-7);
+
+	/* Add on the checksum size and the offset from the
+	   broadcast. */
+	smi_msg->data_size += 1;
+
+	smi_msg->msgid = msgid;
+}
+
 /* Separate from ipmi_request so that the user does not have to be
    supplied in certain circumstances (mainly at panic time).  If
    messages are supplied, they will be freed, even if an error
@@ -780,11 +983,14 @@ static inline int i_ipmi_request(ipmi_us
 				 struct ipmi_addr     *addr,
 				 long                 msgid,
 				 struct ipmi_msg      *msg,
+				 void                 *user_msg_data,
 				 void                 *supplied_smi,
 				 struct ipmi_recv_msg *supplied_recv,
 				 int                  priority,
 				 unsigned char        source_address,
-				 unsigned char        source_lun)
+				 unsigned char        source_lun,
+				 int                  retries,
+				 unsigned int         retry_time_ms)
 {
 	int                  rv = 0;
 	struct ipmi_smi_msg  *smi_msg;
@@ -800,6 +1006,7 @@ static inline int i_ipmi_request(ipmi_us
 			return -ENOMEM;
 		}
 	}
+	recv_msg->user_msg_data = user_msg_data;
 
 	if (supplied_smi) {
 		smi_msg = (struct ipmi_smi_msg *) supplied_smi;
@@ -811,11 +1018,6 @@ static inline int i_ipmi_request(ipmi_us
 		}
 	}
 
-	if (addr->channel > IPMI_NUM_CHANNELS) {
-	    rv = -EINVAL;
-	    goto out_err;
-	}
-
 	recv_msg->user = user;
 	recv_msg->msgid = msgid;
 	/* Store the message to send in the receive message so timeout
@@ -825,10 +1027,20 @@ static inline int i_ipmi_request(ipmi_us
 	if (addr->addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) {
 		struct ipmi_system_interface_addr *smi_addr;
 
+		if (msg->netfn & 1) {
+			/* Responses are not allowed to the SMI. */
+			rv = -EINVAL;
+			goto out_err;
+		}
 
 		smi_addr = (struct ipmi_system_interface_addr *) addr;
-		if (smi_addr->lun > 3)
-			return -EINVAL;
+		if (smi_addr->lun > 3) {
+			spin_lock_irqsave(&intf->counter_lock, flags);
+			intf->sent_invalid_commands++;
+			spin_unlock_irqrestore(&intf->counter_lock, flags);
+			rv = -EINVAL;
+			goto out_err;
+		}
 
 		memcpy(&recv_msg->addr, smi_addr, sizeof(*smi_addr));
 
@@ -839,11 +1051,17 @@ static inline int i_ipmi_request(ipmi_us
 		{
 			/* We don't let the user do these, since we manage
 			   the sequence numbers. */
+			spin_lock_irqsave(&intf->counter_lock, flags);
+			intf->sent_invalid_commands++;
+			spin_unlock_irqrestore(&intf->counter_lock, flags);
 			rv = -EINVAL;
 			goto out_err;
 		}
 
 		if ((msg->data_len + 2) > IPMI_MAX_MSG_LENGTH) {
+			spin_lock_irqsave(&intf->counter_lock, flags);
+			intf->sent_invalid_commands++;
+			spin_unlock_irqrestore(&intf->counter_lock, flags);
 			rv = -EMSGSIZE;
 			goto out_err;
 		}
@@ -855,41 +1073,69 @@ static inline int i_ipmi_request(ipmi_us
 		if (msg->data_len > 0)
 			memcpy(&(smi_msg->data[2]), msg->data, msg->data_len);
 		smi_msg->data_size = msg->data_len + 2;
+		spin_lock_irqsave(&intf->counter_lock, flags);
+		intf->sent_local_commands++;
+		spin_unlock_irqrestore(&intf->counter_lock, flags);
 	} else if ((addr->addr_type == IPMI_IPMB_ADDR_TYPE)
 		   || (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE))
 	{
 		struct ipmi_ipmb_addr *ipmb_addr;
 		unsigned char         ipmb_seq;
 		long                  seqid;
-		int                   broadcast;
-		int                   retries;
+		int                   broadcast = 0;
+
+		if (addr->channel > IPMI_NUM_CHANNELS) {
+			spin_lock_irqsave(&intf->counter_lock, flags);
+			intf->sent_invalid_commands++;
+			spin_unlock_irqrestore(&intf->counter_lock, flags);
+			rv = -EINVAL;
+			goto out_err;
+		}
 
-		if (addr == NULL) {
+		if (intf->channels[addr->channel].medium
+		    != IPMI_CHANNEL_MEDIUM_IPMB)
+		{
+			spin_lock_irqsave(&intf->counter_lock, flags);
+			intf->sent_invalid_commands++;
+			spin_unlock_irqrestore(&intf->counter_lock, flags);
 			rv = -EINVAL;
 			goto out_err;
 		}
 
+		if (retries < 0) {
+		    if (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE)
+			retries = 0; /* Don't retry broadcasts. */
+		    else
+			retries = 4;
+		}
 		if (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE) {
 		    /* Broadcasts add a zero at the beginning of the
 		       message, but otherwise is the same as an IPMB
 		       address. */
 		    addr->addr_type = IPMI_IPMB_ADDR_TYPE;
 		    broadcast = 1;
-		    retries = 0; /* Don't retry broadcasts. */
-		} else {
-		    broadcast = 0;
-		    retries = 4;
 		}
 
+
+		/* Default to 1 second retries. */
+		if (retry_time_ms == 0)
+		    retry_time_ms = 1000;
+
 		/* 9 for the header and 1 for the checksum, plus
                    possibly one for the broadcast. */
 		if ((msg->data_len + 10 + broadcast) > IPMI_MAX_MSG_LENGTH) {
+			spin_lock_irqsave(&intf->counter_lock, flags);
+			intf->sent_invalid_commands++;
+			spin_unlock_irqrestore(&intf->counter_lock, flags);
 			rv = -EMSGSIZE;
 			goto out_err;
 		}
 
 		ipmb_addr = (struct ipmi_ipmb_addr *) addr;
 		if (ipmb_addr->lun > 3) {
+			spin_lock_irqsave(&intf->counter_lock, flags);
+			intf->sent_invalid_commands++;
+			spin_unlock_irqrestore(&intf->counter_lock, flags);
 			rv = -EINVAL;
 			goto out_err;
 		}
@@ -899,21 +1145,32 @@ static inline int i_ipmi_request(ipmi_us
 		if (recv_msg->msg.netfn & 0x1) {
 			/* It's a response, so use the user's sequence
                            from msgid. */
+			spin_lock_irqsave(&intf->counter_lock, flags);
+			intf->sent_ipmb_responses++;
+			spin_unlock_irqrestore(&intf->counter_lock, flags);
 			format_ipmb_msg(smi_msg, msg, ipmb_addr, msgid,
 					msgid, broadcast,
 					source_address, source_lun);
+
+			/* Save the receive message so we can use it
+			   to deliver the response. */
+			smi_msg->user_data = recv_msg;
 		} else {
 			/* It's a command, so get a sequence for it. */
 
 			spin_lock_irqsave(&(intf->seq_lock), flags);
 
+			spin_lock(&intf->counter_lock);
+			intf->sent_ipmb_commands++;
+			spin_unlock(&intf->counter_lock);
+
 			/* Create a sequence number with a 1 second
                            timeout and 4 retries. */
-			/* FIXME - magic number for the timeout. */
 			rv = intf_next_seq(intf,
 					   recv_msg,
-					   1000,
+					   retry_time_ms,
 					   retries,
+					   broadcast,
 					   &ipmb_seq,
 					   &seqid);
 			if (rv) {
@@ -947,18 +1204,132 @@ static inline int i_ipmi_request(ipmi_us
                            to be correct. */
 			spin_unlock_irqrestore(&(intf->seq_lock), flags);
 		}
+	} else if (addr->addr_type == IPMI_LAN_ADDR_TYPE) {
+		struct ipmi_lan_addr  *lan_addr;
+		unsigned char         ipmb_seq;
+		long                  seqid;
+
+		if (addr->channel > IPMI_NUM_CHANNELS) {
+			spin_lock_irqsave(&intf->counter_lock, flags);
+			intf->sent_invalid_commands++;
+			spin_unlock_irqrestore(&intf->counter_lock, flags);
+			rv = -EINVAL;
+			goto out_err;
+		}
+
+		if ((intf->channels[addr->channel].medium
+		    != IPMI_CHANNEL_MEDIUM_8023LAN)
+		    && (intf->channels[addr->channel].medium
+			!= IPMI_CHANNEL_MEDIUM_ASYNC))
+		{
+			spin_lock_irqsave(&intf->counter_lock, flags);
+			intf->sent_invalid_commands++;
+			spin_unlock_irqrestore(&intf->counter_lock, flags);
+			rv = -EINVAL;
+			goto out_err;
+		}
+
+		retries = 4;
+
+		/* Default to 1 second retries. */
+		if (retry_time_ms == 0)
+		    retry_time_ms = 1000;
+
+		/* 11 for the header and 1 for the checksum. */
+		if ((msg->data_len + 12) > IPMI_MAX_MSG_LENGTH) {
+			spin_lock_irqsave(&intf->counter_lock, flags);
+			intf->sent_invalid_commands++;
+			spin_unlock_irqrestore(&intf->counter_lock, flags);
+			rv = -EMSGSIZE;
+			goto out_err;
+		}
+
+		lan_addr = (struct ipmi_lan_addr *) addr;
+		if (lan_addr->lun > 3) {
+			spin_lock_irqsave(&intf->counter_lock, flags);
+			intf->sent_invalid_commands++;
+			spin_unlock_irqrestore(&intf->counter_lock, flags);
+			rv = -EINVAL;
+			goto out_err;
+		}
+
+		memcpy(&recv_msg->addr, lan_addr, sizeof(*lan_addr));
+
+		if (recv_msg->msg.netfn & 0x1) {
+			/* It's a response, so use the user's sequence
+                           from msgid. */
+			spin_lock_irqsave(&intf->counter_lock, flags);
+			intf->sent_lan_responses++;
+			spin_unlock_irqrestore(&intf->counter_lock, flags);
+			format_lan_msg(smi_msg, msg, lan_addr, msgid,
+				       msgid, source_lun);
+
+			/* Save the receive message so we can use it
+			   to deliver the response. */
+			smi_msg->user_data = recv_msg;
+		} else {
+			/* It's a command, so get a sequence for it. */
+
+			spin_lock_irqsave(&(intf->seq_lock), flags);
+
+			spin_lock(&intf->counter_lock);
+			intf->sent_lan_commands++;
+			spin_unlock(&intf->counter_lock);
+
+			/* Create a sequence number with a 1 second
+                           timeout and 4 retries. */
+			rv = intf_next_seq(intf,
+					   recv_msg,
+					   retry_time_ms,
+					   retries,
+					   0,
+					   &ipmb_seq,
+					   &seqid);
+			if (rv) {
+				/* We have used up all the sequence numbers,
+				   probably, so abort. */
+				spin_unlock_irqrestore(&(intf->seq_lock),
+						       flags);
+				goto out_err;
+			}
+
+			/* Store the sequence number in the message,
+                           so that when the send message response
+                           comes back we can start the timer. */
+			format_lan_msg(smi_msg, msg, lan_addr,
+				       STORE_SEQ_IN_MSGID(ipmb_seq, seqid),
+				       ipmb_seq, source_lun);
+
+			/* Copy the message into the recv message data, so we
+			   can retransmit it later if necessary. */
+			memcpy(recv_msg->msg_data, smi_msg->data,
+			       smi_msg->data_size);
+			recv_msg->msg.data = recv_msg->msg_data;
+			recv_msg->msg.data_len = smi_msg->data_size;
+
+			/* We don't unlock until here, because we need
+                           to copy the completed message into the
+                           recv_msg before we release the lock.
+                           Otherwise, race conditions may bite us.  I
+                           know that's pretty paranoid, but I prefer
+                           to be correct. */
+			spin_unlock_irqrestore(&(intf->seq_lock), flags);
+		}
 	} else {
 	    /* Unknown address type. */
-	    rv = -EINVAL;
-	    goto out_err;
+		spin_lock_irqsave(&intf->counter_lock, flags);
+		intf->sent_invalid_commands++;
+		spin_unlock_irqrestore(&intf->counter_lock, flags);
+		rv = -EINVAL;
+		goto out_err;
 	}
 
 #if DEBUG_MSGING
 	{
-	    int m;
-	    for (m=0; m<smi_msg->data_size; m++)
-		printk(" %2.2x", smi_msg->data[m]);
-	    printk("\n");
+		int m;
+		for (m=0; m<smi_msg->data_size; m++)
+			printk(" %2.2x", smi_msg->data[m]);
+		printk("\n");
 	}
 #endif
 	intf->handlers->sender(intf->send_info, smi_msg, priority);
@@ -975,6 +1346,7 @@ int ipmi_request(ipmi_user_t      user,
 		 struct ipmi_addr *addr,
 		 long             msgid,
 		 struct ipmi_msg  *msg,
+		 void             *user_msg_data,
 		 int              priority)
 {
 	return i_ipmi_request(user,
@@ -982,16 +1354,42 @@ int ipmi_request(ipmi_user_t      user,
 			      addr,
 			      msgid,
 			      msg,
+			      user_msg_data,
 			      NULL, NULL,
 			      priority,
 			      user->intf->my_address,
-			      user->intf->my_lun);
+			      user->intf->my_lun,
+			      -1, 0);
+}
+
+int ipmi_request_settime(ipmi_user_t      user,
+			 struct ipmi_addr *addr,
+			 long             msgid,
+			 struct ipmi_msg  *msg,
+			 void             *user_msg_data,
+			 int              priority,
+			 int              retries,
+			 unsigned int     retry_time_ms)
+{
+	return i_ipmi_request(user,
+			      user->intf,
+			      addr,
+			      msgid,
+			      msg,
+			      user_msg_data,
+			      NULL, NULL,
+			      priority,
+			      user->intf->my_address,
+			      user->intf->my_lun,
+			      retries,
+			      retry_time_ms);
 }
 
 int ipmi_request_supply_msgs(ipmi_user_t          user,
 			     struct ipmi_addr     *addr,
 			     long                 msgid,
 			     struct ipmi_msg      *msg,
+			     void                 *user_msg_data,
 			     void                 *supplied_smi,
 			     struct ipmi_recv_msg *supplied_recv,
 			     int                  priority)
@@ -1001,17 +1399,20 @@ int ipmi_request_supply_msgs(ipmi_user_t
 			      addr,
 			      msgid,
 			      msg,
+			      user_msg_data,
 			      supplied_smi,
 			      supplied_recv,
 			      priority,
 			      user->intf->my_address,
-			      user->intf->my_lun);
+			      user->intf->my_lun,
+			      -1, 0);
 }
 
 int ipmi_request_with_source(ipmi_user_t      user,
 			     struct ipmi_addr *addr,
 			     long             msgid,
 			     struct ipmi_msg  *msg,
+			     void             *user_msg_data,
 			     int              priority,
 			     unsigned char    source_address,
 			     unsigned char    source_lun)
@@ -1021,10 +1422,215 @@ int ipmi_request_with_source(ipmi_user_t
 			      addr,
 			      msgid,
 			      msg,
+			      user_msg_data,
 			      NULL, NULL,
 			      priority,
 			      source_address,
-			      source_lun);
+			      source_lun,
+			      -1, 0);
+}
+
+static int ipmb_file_read_proc(char *page, char **start, off_t off,
+			       int count, int *eof, void *data)
+{
+	char       *out = (char *) page;
+	ipmi_smi_t intf = data;
+
+	return sprintf(out, "%x\n", intf->my_address);
+}
+
+static int version_file_read_proc(char *page, char **start, off_t off,
+				  int count, int *eof, void *data)
+{
+	char       *out = (char *) page;
+	ipmi_smi_t intf = data;
+
+	return sprintf(out, "%d.%d\n",
+		       intf->version_major, intf->version_minor);
+}
+
+static int stat_file_read_proc(char *page, char **start, off_t off,
+			       int count, int *eof, void *data)
+{
+	char       *out = (char *) page;
+	ipmi_smi_t intf = data;
+
+	out += sprintf(out, "sent_invalid_commands:       %d\n",
+		       intf->sent_invalid_commands);
+	out += sprintf(out, "sent_local_commands:         %d\n",
+		       intf->sent_local_commands);
+	out += sprintf(out, "handled_local_responses:     %d\n",
+		       intf->handled_local_responses);
+	out += sprintf(out, "unhandled_local_responses:   %d\n",
+		       intf->unhandled_local_responses);
+	out += sprintf(out, "sent_ipmb_commands:          %d\n",
+		       intf->sent_ipmb_commands);
+	out += sprintf(out, "sent_ipmb_command_errs:      %d\n",
+		       intf->sent_ipmb_command_errs);
+	out += sprintf(out, "retransmitted_ipmb_commands: %d\n",
+		       intf->retransmitted_ipmb_commands);
+	out += sprintf(out, "timed_out_ipmb_commands:     %d\n",
+		       intf->timed_out_ipmb_commands);
+	out += sprintf(out, "timed_out_ipmb_broadcasts:   %d\n",
+		       intf->timed_out_ipmb_broadcasts);
+	out += sprintf(out, "sent_ipmb_responses:         %d\n",
+		       intf->sent_ipmb_responses);
+	out += sprintf(out, "handled_ipmb_responses:      %d\n",
+		       intf->handled_ipmb_responses);
+	out += sprintf(out, "invalid_ipmb_responses:      %d\n",
+		       intf->invalid_ipmb_responses);
+	out += sprintf(out, "unhandled_ipmb_responses:    %d\n",
+		       intf->unhandled_ipmb_responses);
+	out += sprintf(out, "sent_lan_commands:           %d\n",
+		       intf->sent_lan_commands);
+	out += sprintf(out, "sent_lan_command_errs:       %d\n",
+		       intf->sent_lan_command_errs);
+	out += sprintf(out, "retransmitted_lan_commands:  %d\n",
+		       intf->retransmitted_lan_commands);
+	out += sprintf(out, "timed_out_lan_commands:      %d\n",
+		       intf->timed_out_lan_commands);
+	out += sprintf(out, "sent_lan_responses:          %d\n",
+		       intf->sent_lan_responses);
+	out += sprintf(out, "handled_lan_responses:       %d\n",
+		       intf->handled_lan_responses);
+	out += sprintf(out, "invalid_lan_responses:       %d\n",
+		       intf->invalid_lan_responses);
+	out += sprintf(out, "unhandled_lan_responses:     %d\n",
+		       intf->unhandled_lan_responses);
+	out += sprintf(out, "handled_commands:            %d\n",
+		       intf->handled_commands);
+	out += sprintf(out, "invalid_commands:            %d\n",
+		       intf->invalid_commands);
+	out += sprintf(out, "unhandled_commands:          %d\n",
+		       intf->unhandled_commands);
+	out += sprintf(out, "invalid_events:              %d\n",
+		       intf->invalid_events);
+	out += sprintf(out, "events:                      %d\n",
+		       intf->events);
+
+	return (out - ((char *) page));
+}
+
+int ipmi_smi_add_proc_entry(ipmi_smi_t smi, char *name,
+			    read_proc_t *read_proc, write_proc_t *write_proc,
+			    void *data, struct module *owner)
+{
+	struct proc_dir_entry *file;
+	int                   rv = 0;
+
+	file = create_proc_entry(name, 0, smi->proc_dir);
+	if (!file)
+		rv = -ENOMEM;
+	else {
+		file->nlink = 1;
+		file->data = data;
+		file->read_proc = read_proc;
+		file->write_proc = write_proc;
+		file->owner = owner;
+	}
+
+	return rv;
+}
+
+static int add_proc_entries(ipmi_smi_t smi, int num)
+{
+	int rv = 0;
+
+	sprintf(smi->proc_dir_name, "%d", num);
+	smi->proc_dir = proc_mkdir(smi->proc_dir_name, proc_ipmi_root);
+	if (!smi->proc_dir)
+		rv = -ENOMEM;
+	else {
+		smi->proc_dir->owner = THIS_MODULE;
+	}
+
+	if (rv == 0)
+		rv = ipmi_smi_add_proc_entry(smi, "stats",
+					     stat_file_read_proc, NULL,
+					     smi, THIS_MODULE);
+
+	if (rv == 0)
+		rv = ipmi_smi_add_proc_entry(smi, "ipmb",
+					     ipmb_file_read_proc, NULL,
+					     smi, THIS_MODULE);
+
+	if (rv == 0)
+		rv = ipmi_smi_add_proc_entry(smi, "version",
+					     version_file_read_proc, NULL,
+					     smi, THIS_MODULE);
+
+	return rv;
+}
+
+static int
+send_channel_info_cmd(ipmi_smi_t intf, int chan)
+{
+	struct ipmi_msg                   msg;
+	unsigned char                     data[1];
+	struct ipmi_system_interface_addr si;
+
+	si.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
+	si.channel = IPMI_BMC_CHANNEL;
+	si.lun = 0;
+
+	msg.netfn = IPMI_NETFN_APP_REQUEST;
+	msg.cmd = IPMI_GET_CHANNEL_INFO_CMD;
+	msg.data = data;
+	msg.data_len = 1;
+	data[0] = chan;
+	return i_ipmi_request(NULL,
+			      intf,
+			      (struct ipmi_addr *) &si,
+			      0,
+			      &msg,
+			      NULL,
+			      NULL,
+			      NULL,
+			      0,
+			      intf->my_address,
+			      intf->my_lun,
+			      -1, 0);
+}
+
+static void
+channel_handler(ipmi_smi_t intf, struct ipmi_smi_msg *msg)
+{
+	int rv = 0;
+	int chan;
+
+	if ((msg->rsp[0] == (IPMI_NETFN_APP_RESPONSE << 2))
+	    && (msg->rsp[1] == IPMI_GET_CHANNEL_INFO_CMD))
+	{
+		/* It's the one we want */
+		if (msg->rsp[2] != 0) {
+			/* Got an error from the channel, just go on. */
+			goto next_channel;
+		}
+		if (msg->rsp_size < 6) {
+			/* Message not big enough, just go on. */
+			goto next_channel;
+		}
+		chan = intf->curr_channel;
+		intf->channels[chan].medium = msg->rsp[4] & 0x7f;
+		intf->channels[chan].protocol = msg->rsp[5] & 0x1f;
+
+	next_channel:
+		intf->curr_channel++;
+		if (intf->curr_channel >= IPMI_MAX_CHANNELS)
+			wake_up(&intf->waitq);
+		else
+			rv = send_channel_info_cmd(intf, intf->curr_channel);
+
+		if (rv) {
+			/* Got an error somehow, just give up. */
+			intf->curr_channel = IPMI_MAX_CHANNELS;
+			wake_up(&intf->waitq);
+
+			printk(KERN_WARNING "ipmi_msghandler: Error sending"
+			       "channel information: 0x%x\n",
+			       rv);
+		}
+	}
 }
 
 int ipmi_register_smi(struct ipmi_smi_handlers *handlers,
@@ -1036,7 +1642,6 @@ int ipmi_register_smi(struct ipmi_smi_ha
 	int              i, j;
 	int              rv;
 	ipmi_smi_t       new_intf;
-	struct list_head *entry;
 	unsigned long    flags;
 
 
@@ -1055,12 +1660,16 @@ int ipmi_register_smi(struct ipmi_smi_ha
 	new_intf = kmalloc(sizeof(*new_intf), GFP_KERNEL);
 	if (!new_intf)
 		return -ENOMEM;
+	memset(new_intf, 0, sizeof(*new_intf));
+
+	new_intf->proc_dir = NULL;
 
 	rv = -ENOMEM;
 
 	down_write(&interfaces_sem);
 	for (i=0; i<MAX_IPMI_INTERFACES; i++) {
 		if (ipmi_interfaces[i] == NULL) {
+			new_intf->intf_num = i;
 			new_intf->version_major = version_major;
 			new_intf->version_minor = version_minor;
 			new_intf->my_address = IPMI_BMC_SLAVE_ADDR;
@@ -1081,9 +1690,12 @@ int ipmi_register_smi(struct ipmi_smi_ha
 			INIT_LIST_HEAD(&(new_intf->waiting_events));
 			new_intf->waiting_events_count = 0;
 			rwlock_init(&(new_intf->cmd_rcvr_lock));
+			init_waitqueue_head(&new_intf->waitq);
 			INIT_LIST_HEAD(&(new_intf->cmd_rcvrs));
 			new_intf->all_cmd_rcvr = NULL;
 
+			spin_lock_init(&(new_intf->counter_lock));
+
 			spin_lock_irqsave(&interfaces_lock, flags);
 			ipmi_interfaces[i] = new_intf;
 			spin_unlock_irqrestore(&interfaces_lock, flags);
@@ -1096,46 +1708,71 @@ int ipmi_register_smi(struct ipmi_smi_ha
 
 	downgrade_write(&interfaces_sem);
 
+	if (rv == 0)
+		rv = add_proc_entries(*intf, i);
+
 	if (rv == 0) {
-		/* Call all the watcher interfaces to tell them that a
-		   new interface is available. */
-		down_read(&smi_watchers_sem);
-		list_for_each(entry, &smi_watchers) {
-			struct ipmi_smi_watcher *w;
-			w = list_entry(entry, struct ipmi_smi_watcher, link);
-			w->new_smi(i);
-		}
-		up_read(&smi_watchers_sem);
+		if ((version_major > 1)
+		    || ((version_major == 1) && (version_minor >= 5)))
+		{
+			/* Start scanning the channels to see what is
+			   available. */
+			(*intf)->null_user_handler = channel_handler;
+			(*intf)->curr_channel = 0;
+			rv = send_channel_info_cmd(*intf, 0);
+			if (rv)
+				goto out;
+
+			/* Wait for the channel info to be read. */
+			up_read(&interfaces_sem);
+			wait_event((*intf)->waitq,
+				   ((*intf)->curr_channel>=IPMI_MAX_CHANNELS));
+			down_read(&interfaces_sem);
+
+			if (ipmi_interfaces[i] != new_intf)
+				/* Well, it went away.  Just return. */
+				goto out;
+		} else {
+			/* Assume a single IPMB channel at zero. */
+			(*intf)->channels[0].medium = IPMI_CHANNEL_MEDIUM_IPMB;
+			(*intf)->channels[0].protocol
+				= IPMI_CHANNEL_PROTOCOL_IPMB;
+  		}
+
+		/* Call all the watcher interfaces to tell
+		   them that a new interface is available. */
+		call_smi_watchers(i);
 	}
 
+ out:
 	up_read(&interfaces_sem);
 
-	if (rv)
+	if (rv) {
+		if (new_intf->proc_dir)
+			remove_proc_entry(new_intf->proc_dir_name,
+					  proc_ipmi_root);
 		kfree(new_intf);
+	}
 
 	return rv;
 }
 
 static void free_recv_msg_list(struct list_head *q)
 {
-	struct list_head     *entry, *entry2;
-	struct ipmi_recv_msg *msg;
+	struct ipmi_recv_msg *msg, *msg2;
 
-	list_for_each_safe(entry, entry2, q) {
-		msg = list_entry(entry, struct ipmi_recv_msg, link);
-		list_del(entry);
+	list_for_each_entry_safe(msg, msg2, q, link) {
+		list_del(&msg->link);
 		ipmi_free_recv_msg(msg);
 	}
 }
 
 static void free_cmd_rcvr_list(struct list_head *q)
 {
-	struct list_head *entry, *entry2;
-	struct cmd_rcvr  *rcvr;
+	struct cmd_rcvr  *rcvr, *rcvr2;
 
-	list_for_each_safe(entry, entry2, q) {
-		rcvr = list_entry(entry, struct cmd_rcvr, link);
-		list_del(entry);
+	list_for_each_entry_safe(rcvr, rcvr2, q, link) {
+		list_del(&rcvr->link);
 		kfree(rcvr);
 	}
 }
@@ -1159,16 +1796,18 @@ static void clean_up_interface_data(ipmi
 
 int ipmi_unregister_smi(ipmi_smi_t intf)
 {
-	int              rv = -ENODEV;
-	int              i;
-	struct list_head *entry;
-	unsigned long    flags;
+	int                     rv = -ENODEV;
+	int                     i;
+	struct ipmi_smi_watcher *w;
+	unsigned long           flags;
 
 	down_write(&interfaces_sem);
 	if (list_empty(&(intf->users)))
 	{
 		for (i=0; i<MAX_IPMI_INTERFACES; i++) {
 			if (ipmi_interfaces[i] == intf) {
+				remove_proc_entry(intf->proc_dir_name,
+						  proc_ipmi_root);
 				spin_lock_irqsave(&interfaces_lock, flags);
 				ipmi_interfaces[i] = NULL;
 				clean_up_interface_data(intf);
@@ -1191,11 +1830,7 @@ int ipmi_unregister_smi(ipmi_smi_t intf)
 	/* Call all the watcher interfaces to tell them that
 	   an interface is gone. */
 	down_read(&smi_watchers_sem);
-	list_for_each(entry, &smi_watchers) {
-		struct ipmi_smi_watcher *w;
-		w = list_entry(entry,
-			       struct ipmi_smi_watcher,
-			       link);
+	list_for_each_entry(w, &smi_watchers, link) {
 		w->smi_gone(i);
 	}
 	up_read(&smi_watchers_sem);
@@ -1203,20 +1838,28 @@ int ipmi_unregister_smi(ipmi_smi_t intf)
 	return 0;
 }
 
-static int handle_get_msg_rsp(ipmi_smi_t          intf,
-			      struct ipmi_smi_msg *msg)
+static int handle_ipmb_get_msg_rsp(ipmi_smi_t          intf,
+				   struct ipmi_smi_msg *msg)
 {
 	struct ipmi_ipmb_addr ipmb_addr;
 	struct ipmi_recv_msg  *recv_msg;
+	unsigned long         flags;
 
 	
-	if (msg->rsp_size < 11)
+	/* This is 11, not 10, because the response must contain a
+	 * completion code. */
+	if (msg->rsp_size < 11) {
 		/* Message not big enough, just ignore it. */
+		spin_lock_irqsave(&intf->counter_lock, flags);
+		intf->invalid_ipmb_responses++;
+		spin_unlock_irqrestore(&intf->counter_lock, flags);
 		return 0;
+	}
 
-	if (msg->rsp[2] != 0)
+	if (msg->rsp[2] != 0) {
 		/* An error getting the response, just ignore it. */
 		return 0;
+	}
 
 	ipmb_addr.addr_type = IPMI_IPMB_ADDR_TYPE;
 	ipmb_addr.slave_addr = msg->rsp[6];
@@ -1235,6 +1878,9 @@ static int handle_get_msg_rsp(ipmi_smi_t
 	{
 		/* We were unable to find the sequence number,
 		   so just nuke the message. */
+		spin_lock_irqsave(&intf->counter_lock, flags);
+		intf->unhandled_ipmb_responses++;
+		spin_unlock_irqrestore(&intf->counter_lock, flags);
 		return 0;
 	}
 
@@ -1248,26 +1894,33 @@ static int handle_get_msg_rsp(ipmi_smi_t
 	recv_msg->msg.data = recv_msg->msg_data;
 	recv_msg->msg.data_len = msg->rsp_size - 10;
 	recv_msg->recv_type = IPMI_RESPONSE_RECV_TYPE;
+	spin_lock_irqsave(&intf->counter_lock, flags);
+	intf->handled_ipmb_responses++;
+	spin_unlock_irqrestore(&intf->counter_lock, flags);
 	deliver_response(recv_msg);
 
 	return 0;
 }
 
-static int handle_get_msg_cmd(ipmi_smi_t          intf,
-			      struct ipmi_smi_msg *msg)
+static int handle_ipmb_get_msg_cmd(ipmi_smi_t          intf,
+				   struct ipmi_smi_msg *msg)
 {
-	struct list_head *entry;
 	struct cmd_rcvr       *rcvr;
-	int              rv = 0;
-	unsigned char    netfn;
-	unsigned char    cmd;
-	ipmi_user_t      user = NULL;
+	int                   rv = 0;
+	unsigned char         netfn;
+	unsigned char         cmd;
+	ipmi_user_t           user = NULL;
 	struct ipmi_ipmb_addr *ipmb_addr;
 	struct ipmi_recv_msg  *recv_msg;
+	unsigned long         flags;
 
-	if (msg->rsp_size < 10)
+	if (msg->rsp_size < 10) {
 		/* Message not big enough, just ignore it. */
+		spin_lock_irqsave(&intf->counter_lock, flags);
+		intf->invalid_commands++;
+		spin_unlock_irqrestore(&intf->counter_lock, flags);
 		return 0;
+	}
 
 	if (msg->rsp[2] != 0) {
 		/* An error getting the response, just ignore it. */
@@ -1283,8 +1936,7 @@ static int handle_get_msg_cmd(ipmi_smi_t
 		user = intf->all_cmd_rcvr;
 	} else {
 		/* Find the command/netfn. */
-		list_for_each(entry, &(intf->cmd_rcvrs)) {
-			rcvr = list_entry(entry, struct cmd_rcvr, link);
+		list_for_each_entry(rcvr, &(intf->cmd_rcvrs), link) {
 			if ((rcvr->netfn == netfn) && (rcvr->cmd == cmd)) {
 				user = rcvr->user;
 				break;
@@ -1295,6 +1947,10 @@ static int handle_get_msg_cmd(ipmi_smi_t
 
 	if (user == NULL) {
 		/* We didn't find a user, deliver an error response. */
+		spin_lock_irqsave(&intf->counter_lock, flags);
+		intf->unhandled_commands++;
+		spin_unlock_irqrestore(&intf->counter_lock, flags);
+
 		msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2);
 		msg->data[1] = IPMI_SEND_MSG_CMD;
 		msg->data[2] = msg->rsp[3];
@@ -1309,12 +1965,25 @@ static int handle_get_msg_cmd(ipmi_smi_t
 		msg->data[10] = ipmb_checksum(&(msg->data[6]), 4);
 		msg->data_size = 11;
 
+#if DEBUG_MSGING
+	{
+		int m;
+		printk("Invalid command:");
+		for (m=0; m<msg->data_size; m++)
+			printk(" %2.2x", msg->data[m]);
+		printk("\n");
+	}
+#endif
 		intf->handlers->sender(intf->send_info, msg, 0);
 
 		rv = -1; /* We used the message, so return the value that
 			    causes it to not be freed or queued. */
 	} else {
 		/* Deliver the message to the user. */
+		spin_lock_irqsave(&intf->counter_lock, flags);
+		intf->handled_commands++;
+		spin_unlock_irqrestore(&intf->counter_lock, flags);
+
 		recv_msg = ipmi_alloc_recv_msg();
 		if (! recv_msg) {
 			/* We couldn't allocate memory for the
@@ -1322,18 +1991,24 @@ static int handle_get_msg_cmd(ipmi_smi_t
                            later. */
 			rv = 1;
 		} else {
+			/* Extract the source address from the data. */
 			ipmb_addr = (struct ipmi_ipmb_addr *) &recv_msg->addr;
 			ipmb_addr->addr_type = IPMI_IPMB_ADDR_TYPE;
 			ipmb_addr->slave_addr = msg->rsp[6];
 			ipmb_addr->lun = msg->rsp[7] & 3;
-			ipmb_addr->channel = msg->rsp[3];
+			ipmb_addr->channel = msg->rsp[3] & 0xf;
 
+			/* Extract the rest of the message information
+			   from the IPMB header.*/
 			recv_msg->user = user;
 			recv_msg->recv_type = IPMI_CMD_RECV_TYPE;
 			recv_msg->msgid = msg->rsp[7] >> 2;
 			recv_msg->msg.netfn = msg->rsp[4] >> 2;
 			recv_msg->msg.cmd = msg->rsp[8];
 			recv_msg->msg.data = recv_msg->msg_data;
+
+			/* We chop off 10, not 9 bytes because the checksum
+			   at the end also needs to be removed. */
 			recv_msg->msg.data_len = msg->rsp_size - 10;
 			memcpy(recv_msg->msg_data,
 			       &(msg->rsp[9]),
@@ -1345,6 +2020,169 @@ static int handle_get_msg_cmd(ipmi_smi_t
 	return rv;
 }
 
+static int handle_lan_get_msg_rsp(ipmi_smi_t          intf,
+				  struct ipmi_smi_msg *msg)
+{
+	struct ipmi_lan_addr  lan_addr;
+	struct ipmi_recv_msg  *recv_msg;
+	unsigned long         flags;
+
+
+	/* This is 13, not 12, because the response must contain a
+	 * completion code. */
+	if (msg->rsp_size < 13) {
+		/* Message not big enough, just ignore it. */
+		spin_lock_irqsave(&intf->counter_lock, flags);
+		intf->invalid_lan_responses++;
+		spin_unlock_irqrestore(&intf->counter_lock, flags);
+		return 0;
+	}
+
+	if (msg->rsp[2] != 0) {
+		/* An error getting the response, just ignore it. */
+		return 0;
+	}
+
+	lan_addr.addr_type = IPMI_LAN_ADDR_TYPE;
+	lan_addr.session_handle = msg->rsp[4];
+	lan_addr.remote_SWID = msg->rsp[8];
+	lan_addr.local_SWID = msg->rsp[5];
+	lan_addr.channel = msg->rsp[3] & 0x0f;
+	lan_addr.privilege = msg->rsp[3] >> 4;
+	lan_addr.lun = msg->rsp[9] & 3;
+
+	/* It's a response from a remote entity.  Look up the sequence
+	   number and handle the response. */
+	if (intf_find_seq(intf,
+			  msg->rsp[9] >> 2,
+			  msg->rsp[3] & 0x0f,
+			  msg->rsp[10],
+			  (msg->rsp[6] >> 2) & (~1),
+			  (struct ipmi_addr *) &(lan_addr),
+			  &recv_msg))
+	{
+		/* We were unable to find the sequence number,
+		   so just nuke the message. */
+		spin_lock_irqsave(&intf->counter_lock, flags);
+		intf->unhandled_lan_responses++;
+		spin_unlock_irqrestore(&intf->counter_lock, flags);
+		return 0;
+	}
+
+	memcpy(recv_msg->msg_data,
+	       &(msg->rsp[11]),
+	       msg->rsp_size - 11);
+	/* The other fields matched, so no need to set them, except
+           for netfn, which needs to be the response that was
+           returned, not the request value. */
+	recv_msg->msg.netfn = msg->rsp[6] >> 2;
+	recv_msg->msg.data = recv_msg->msg_data;
+	recv_msg->msg.data_len = msg->rsp_size - 12;
+	recv_msg->recv_type = IPMI_RESPONSE_RECV_TYPE;
+	spin_lock_irqsave(&intf->counter_lock, flags);
+	intf->handled_lan_responses++;
+	spin_unlock_irqrestore(&intf->counter_lock, flags);
+	deliver_response(recv_msg);
+
+	return 0;
+}
+
+static int handle_lan_get_msg_cmd(ipmi_smi_t          intf,
+				  struct ipmi_smi_msg *msg)
+{
+	struct cmd_rcvr       *rcvr;
+	int                   rv = 0;
+	unsigned char         netfn;
+	unsigned char         cmd;
+	ipmi_user_t           user = NULL;
+	struct ipmi_lan_addr  *lan_addr;
+	struct ipmi_recv_msg  *recv_msg;
+	unsigned long         flags;
+
+	if (msg->rsp_size < 12) {
+		/* Message not big enough, just ignore it. */
+		spin_lock_irqsave(&intf->counter_lock, flags);
+		intf->invalid_commands++;
+		spin_unlock_irqrestore(&intf->counter_lock, flags);
+		return 0;
+	}
+
+	if (msg->rsp[2] != 0) {
+		/* An error getting the response, just ignore it. */
+		return 0;
+	}
+
+	netfn = msg->rsp[6] >> 2;
+	cmd = msg->rsp[10];
+
+	read_lock(&(intf->cmd_rcvr_lock));
+
+	if (intf->all_cmd_rcvr) {
+		user = intf->all_cmd_rcvr;
+	} else {
+		/* Find the command/netfn. */
+		list_for_each_entry(rcvr, &(intf->cmd_rcvrs), link) {
+			if ((rcvr->netfn == netfn) && (rcvr->cmd == cmd)) {
+				user = rcvr->user;
+				break;
+			}
+		}
+	}
+	read_unlock(&(intf->cmd_rcvr_lock));
+
+	if (user == NULL) {
+		/* We didn't find a user, deliver an error response. */
+		spin_lock_irqsave(&intf->counter_lock, flags);
+		intf->unhandled_commands++;
+		spin_unlock_irqrestore(&intf->counter_lock, flags);
+
+		rv = 0; /* Don't do anything with these messages, just
+			   allow them to be freed. */
+	} else {
+		/* Deliver the message to the user. */
+		spin_lock_irqsave(&intf->counter_lock, flags);
+		intf->handled_commands++;
+		spin_unlock_irqrestore(&intf->counter_lock, flags);
+
+		recv_msg = ipmi_alloc_recv_msg();
+		if (! recv_msg) {
+			/* We couldn't allocate memory for the
+                           message, so requeue it for handling
+                           later. */
+			rv = 1;
+		} else {
+			/* Extract the source address from the data. */
+			lan_addr = (struct ipmi_lan_addr *) &recv_msg->addr;
+			lan_addr->addr_type = IPMI_LAN_ADDR_TYPE;
+			lan_addr->session_handle = msg->rsp[4];
+			lan_addr->remote_SWID = msg->rsp[8];
+			lan_addr->local_SWID = msg->rsp[5];
+			lan_addr->lun = msg->rsp[9] & 3;
+			lan_addr->channel = msg->rsp[3] & 0xf;
+			lan_addr->privilege = msg->rsp[3] >> 4;
+
+			/* Extract the rest of the message information
+			   from the IPMB header.*/
+			recv_msg->user = user;
+			recv_msg->recv_type = IPMI_CMD_RECV_TYPE;
+			recv_msg->msgid = msg->rsp[9] >> 2;
+			recv_msg->msg.netfn = msg->rsp[6] >> 2;
+			recv_msg->msg.cmd = msg->rsp[10];
+			recv_msg->msg.data = recv_msg->msg_data;
+
+			/* We chop off 12, not 11 bytes because the checksum
+			   at the end also needs to be removed. */
+			recv_msg->msg.data_len = msg->rsp_size - 12;
+			memcpy(recv_msg->msg_data,
+			       &(msg->rsp[11]),
+			       msg->rsp_size - 12);
+			deliver_response(recv_msg);
+		}
+	}
+
+	return rv;
+}
+
 static void copy_event_into_recv_msg(struct ipmi_recv_msg *recv_msg,
 				     struct ipmi_smi_msg  *msg)
 {
@@ -1368,9 +2206,8 @@ static void copy_event_into_recv_msg(str
 static int handle_read_event_rsp(ipmi_smi_t          intf,
 				 struct ipmi_smi_msg *msg)
 {
-	struct ipmi_recv_msg *recv_msg;
+	struct ipmi_recv_msg *recv_msg, *recv_msg2;
 	struct list_head     msgs;
-	struct list_head     *entry, *entry2;
 	ipmi_user_t          user;
 	int                  rv = 0;
 	int                  deliver_count = 0;
@@ -1378,6 +2215,9 @@ static int handle_read_event_rsp(ipmi_sm
 
 	if (msg->rsp_size < 19) {
 		/* Message is too small to be an IPMB event. */
+		spin_lock_irqsave(&intf->counter_lock, flags);
+		intf->invalid_events++;
+		spin_unlock_irqrestore(&intf->counter_lock, flags);
 		return 0;
 	}
 
@@ -1390,21 +2230,20 @@ static int handle_read_event_rsp(ipmi_sm
 
 	spin_lock_irqsave(&(intf->events_lock), flags);
 
+	spin_lock(&intf->counter_lock);
+	intf->events++;
+	spin_unlock(&intf->counter_lock);
+
 	/* Allocate and fill in one message for every user that is getting
 	   events. */
-	list_for_each(entry, &(intf->users)) {
-		user = list_entry(entry, struct ipmi_user, link);
-
+	list_for_each_entry(user, &(intf->users), link) {
 		if (! user->gets_events)
 			continue;
 
 		recv_msg = ipmi_alloc_recv_msg();
 		if (! recv_msg) {
-			list_for_each_safe(entry, entry2, &msgs) {
-				recv_msg = list_entry(entry,
-						      struct ipmi_recv_msg,
-						      link);
-				list_del(entry);
+			list_for_each_entry_safe(recv_msg, recv_msg2, &msgs, link) {
+				list_del(&recv_msg->link);
 				ipmi_free_recv_msg(recv_msg);
 			}
 			/* We couldn't allocate memory for the
@@ -1423,11 +2262,8 @@ static int handle_read_event_rsp(ipmi_sm
 
 	if (deliver_count) {
 		/* Now deliver all the messages. */
-		list_for_each_safe(entry, entry2, &msgs) {
-			recv_msg = list_entry(entry,
-					      struct ipmi_recv_msg,
-					      link);
-			list_del(entry);
+		list_for_each_entry_safe(recv_msg, recv_msg2, &msgs, link) {
+			list_del(&recv_msg->link);
 			deliver_response(recv_msg);
 		}
 	} else if (intf->waiting_events_count < MAX_EVENTS_IN_QUEUE) {
@@ -1462,15 +2298,14 @@ static int handle_bmc_rsp(ipmi_smi_t    
 {
 	struct ipmi_recv_msg *recv_msg;
 	int                  found = 0;
-	struct list_head     *entry;
+	struct ipmi_user     *user;
+	unsigned long        flags;
 
 	recv_msg = (struct ipmi_recv_msg *) msg->user_data;
 
 	/* Make sure the user still exists. */
-	list_for_each(entry, &(intf->users)) {
-		if (list_entry(entry, struct ipmi_user, link)
-		    == recv_msg->user)
-		{
+	list_for_each_entry(user, &(intf->users), link) {
+		if (user == recv_msg->user) {
 			/* Found it, so we can deliver it */
 			found = 1;
 			break;
@@ -1482,10 +2317,16 @@ static int handle_bmc_rsp(ipmi_smi_t    
 		if (!recv_msg->user && intf->null_user_handler)
 			intf->null_user_handler(intf, msg);
 		/* The user for the message went away, so give up. */
+		spin_lock_irqsave(&intf->counter_lock, flags);
+		intf->unhandled_local_responses++;
+		spin_unlock_irqrestore(&intf->counter_lock, flags);
 		ipmi_free_recv_msg(recv_msg);
 	} else {
 		struct ipmi_system_interface_addr *smi_addr;
 
+		spin_lock_irqsave(&intf->counter_lock, flags);
+		intf->handled_local_responses++;
+		spin_unlock_irqrestore(&intf->counter_lock, flags);
 		recv_msg->recv_type = IPMI_RESPONSE_RECV_TYPE;
 		recv_msg->msgid = msg->msgid;
 		smi_addr = ((struct ipmi_system_interface_addr *)
@@ -1513,28 +2354,86 @@ static int handle_new_recv_msg(ipmi_smi_
 			       struct ipmi_smi_msg *msg)
 {
 	int requeue;
+	int chan;
 
+#if DEBUG_MSGING
+	int m;
+	printk("Recv:");
+	for (m=0; m<msg->rsp_size; m++)
+		printk(" %2.2x", msg->rsp[m]);
+	printk("\n");
+#endif
 	if (msg->rsp_size < 2) {
 		/* Message is too small to be correct. */
 		requeue = 0;
-	} else if (msg->rsp[1] == IPMI_GET_MSG_CMD) {
-#if DEBUG_MSGING
-		int m;
-		printk("Response:");
-		for (m=0; m<msg->rsp_size; m++)
-			printk(" %2.2x", msg->rsp[m]);
-		printk("\n");
-#endif
+	} else if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2))
+		   && (msg->rsp[1] == IPMI_SEND_MSG_CMD)
+		   && (msg->user_data != NULL))
+	{
+		/* It's a response to a response we sent.  For this we
+		   deliver a send message response to the user. */
+		struct ipmi_recv_msg *recv_msg = msg->user_data;
+
+		requeue = 0;
+		if (msg->rsp_size < 2)
+			/* Message is too small to be correct. */
+			goto out;
+
+		chan = msg->data[2] & 0x0f;
+		if (chan >= IPMI_MAX_CHANNELS)
+			/* Invalid channel number */
+			goto out;
+
+		if (recv_msg) {
+			recv_msg->recv_type = IPMI_RESPONSE_RESPONSE_TYPE;
+			recv_msg->msg.data = recv_msg->msg_data;
+			recv_msg->msg.data_len = 1;
+			recv_msg->msg_data[0] = msg->rsp[2];
+			deliver_response(recv_msg);
+		}
+	} else if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2))
+		   && (msg->rsp[1] == IPMI_GET_MSG_CMD))
+	{
 		/* It's from the receive queue. */
-		if (msg->rsp[4] & 0x04) {
-			/* It's a response, so find the
-			   requesting message and send it up. */
-			requeue = handle_get_msg_rsp(intf, msg);
-		} else {
-			/* It's a command to the SMS from some other
-			   entity.  Handle that. */
-			requeue = handle_get_msg_cmd(intf, msg);
+		chan = msg->rsp[3] & 0xf;
+		if (chan >= IPMI_MAX_CHANNELS) {
+			/* Invalid channel number */
+			requeue = 0;
+			goto out;
 		}
+
+		switch (intf->channels[chan].medium) {
+		case IPMI_CHANNEL_MEDIUM_IPMB:
+			if (msg->rsp[4] & 0x04) {
+				/* It's a response, so find the
+				   requesting message and send it up. */
+				requeue = handle_ipmb_get_msg_rsp(intf, msg);
+			} else {
+				/* It's a command to the SMS from some other
+				   entity.  Handle that. */
+				requeue = handle_ipmb_get_msg_cmd(intf, msg);
+			}
+			break;
+
+		case IPMI_CHANNEL_MEDIUM_8023LAN:
+		case IPMI_CHANNEL_MEDIUM_ASYNC:
+			if (msg->rsp[6] & 0x04) {
+				/* It's a response, so find the
+				   requesting message and send it up. */
+				requeue = handle_lan_get_msg_rsp(intf, msg);
+			} else {
+				/* It's a command to the SMS from some other
+				   entity.  Handle that. */
+				requeue = handle_lan_get_msg_cmd(intf, msg);
+			}
+			break;
+
+		default:
+			/* We don't handle the channel type, so just
+			 * free the message. */
+			requeue = 0;
+		}
+
 	} else if (msg->rsp[1] == IPMI_READ_EVENT_MSG_BUFFER_CMD) {
 		/* It's an asyncronous event. */
 		requeue = handle_read_event_rsp(intf, msg);
@@ -1543,6 +2442,7 @@ static int handle_new_recv_msg(ipmi_smi_
 		requeue = handle_bmc_rsp(intf, msg);
 	}
 
+ out:
 	return requeue;
 }
 
@@ -1558,10 +2458,43 @@ void ipmi_smi_msg_received(ipmi_smi_t   
 	   working on it. */
 	read_lock(&(intf->users_lock));
 
-	if ((msg->data_size >= 2) && (msg->data[1] == IPMI_SEND_MSG_CMD)) {
-		/* This is the local response to a send, start the
-                   timer for these. */
-		intf_start_seq_timer(intf, msg->msgid);
+	if ((msg->data_size >= 2)
+	    && (msg->data[0] == (IPMI_NETFN_APP_REQUEST << 2))
+	    && (msg->data[1] == IPMI_SEND_MSG_CMD)
+	    && (msg->user_data == NULL)) {
+		/* This is the local response to a command send, start
+                   the timer for these.  The user_data will not be
+                   NULL if this is a response send, and we will let
+                   response sends just go through. */
+
+		/* Check for errors, if we get certain errors (ones
+                   that mean basically we can try again later), we
+                   ignore them and start the timer.  Otherwise we
+                   report the error immediately. */
+		if ((msg->rsp_size >= 3) && (msg->rsp[2] != 0)
+		    && (msg->rsp[2] != IPMI_NODE_BUSY_ERR)
+		    && (msg->rsp[2] != IPMI_LOST_ARBITRATION_ERR))
+		{
+			int chan = msg->rsp[3] & 0xf;
+
+			/* Got an error sending the message, handle it. */
+			spin_lock_irqsave(&intf->counter_lock, flags);
+			if (chan >= IPMI_MAX_CHANNELS)
+				; /* This shouldn't happen */
+			else if ((intf->channels[chan].medium
+				  == IPMI_CHANNEL_MEDIUM_8023LAN)
+				 || (intf->channels[chan].medium
+				     == IPMI_CHANNEL_MEDIUM_ASYNC))
+				intf->sent_lan_command_errs++;
+			else
+				intf->sent_ipmb_command_errs++;
+			spin_unlock_irqrestore(&intf->counter_lock, flags);
+			intf_err_seq(intf, msg->msgid, msg->rsp[2]);
+		} else {
+			/* The message was sent, start the timer. */
+			intf_start_seq_timer(intf, msg->msgid);
+		}
+
 		ipmi_free_smi_msg(msg);
 		goto out_unlock;
 	}
@@ -1593,13 +2526,10 @@ void ipmi_smi_msg_received(ipmi_smi_t   
 
 void ipmi_smi_watchdog_pretimeout(ipmi_smi_t intf)
 {
-	struct list_head *entry;
-	ipmi_user_t      user;
+	ipmi_user_t user;
 
 	read_lock(&(intf->users_lock));
-	list_for_each(entry, &(intf->users)) {
-		user = list_entry(entry, struct ipmi_user, link);
-
+	list_for_each_entry(user, &(intf->users), link) {
 		if (! user->handler->ipmi_watchdog_pretimeout)
 			continue;
 
@@ -1657,10 +2587,9 @@ ipmi_timeout_handler(long timeout_period
 {
 	ipmi_smi_t           intf;
 	struct list_head     timeouts;
-	struct ipmi_recv_msg *msg;
-	struct ipmi_smi_msg  *smi_msg;
+	struct ipmi_recv_msg *msg, *msg2;
+	struct ipmi_smi_msg  *smi_msg, *smi_msg2;
 	unsigned long        flags;
-	struct list_head     *entry, *entry2;
 	int                  i, j;
 
 	INIT_LIST_HEAD(&timeouts);
@@ -1675,10 +2604,9 @@ ipmi_timeout_handler(long timeout_period
 
 		/* See if any waiting messages need to be processed. */
 		spin_lock_irqsave(&(intf->waiting_msgs_lock), flags);
-		list_for_each_safe(entry, entry2, &(intf->waiting_msgs)) {
-			smi_msg = list_entry(entry, struct ipmi_smi_msg, link);
+		list_for_each_entry_safe(smi_msg, smi_msg2, &(intf->waiting_msgs), link) {
 			if (! handle_new_recv_msg(intf, smi_msg)) {
-				list_del(entry);
+				list_del(&smi_msg->link);
 				ipmi_free_smi_msg(smi_msg);
 			} else {
 				/* To preserve message order, quit if we
@@ -1706,6 +2634,15 @@ ipmi_timeout_handler(long timeout_period
 				ent->inuse = 0;
 				msg = ent->recv_msg;
 				list_add_tail(&(msg->link), &timeouts);
+				spin_lock(&intf->counter_lock);
+				if (ent->broadcast)
+					intf->timed_out_ipmb_broadcasts++;
+				else if (ent->recv_msg->addr.addr_type
+					 == IPMI_LAN_ADDR_TYPE)
+					intf->timed_out_lan_commands++;
+				else
+					intf->timed_out_ipmb_commands++;
+				spin_unlock(&intf->counter_lock);
 			} else {
 				/* More retries, send again. */
 
@@ -1715,12 +2652,18 @@ ipmi_timeout_handler(long timeout_period
 				ent->retries_left--;
 				send_from_recv_msg(intf, ent->recv_msg, NULL,
 						   j, ent->seqid);
+				spin_lock(&intf->counter_lock);
+				if (ent->recv_msg->addr.addr_type
+				    == IPMI_LAN_ADDR_TYPE)
+					intf->retransmitted_lan_commands++;
+				else
+					intf->retransmitted_ipmb_commands++;
+				spin_unlock(&intf->counter_lock);
 			}
 		}
 		spin_unlock_irqrestore(&(intf->seq_lock), flags);
 
-		list_for_each_safe(entry, entry2, &timeouts) {
-			msg = list_entry(entry, struct ipmi_recv_msg, link);
+		list_for_each_entry_safe(msg, msg2, &timeouts, link) {
 			handle_msg_timeout(msg);
 		}
 
@@ -1747,13 +2690,16 @@ static void ipmi_request_event(void)
 
 static struct timer_list ipmi_timer;
 
-/* Call every 100 ms. */
+/* Call every ~100 ms. */
 #define IPMI_TIMEOUT_TIME	100
-#define IPMI_TIMEOUT_JIFFIES	((IPMI_TIMEOUT_TIME * HZ)/1000)
 
-/* Request events from the queue every second.  Hopefully, in the
-   future, IPMI will add a way to know immediately if an event is
-   in the queue. */
+/* How many jiffies does it take to get to the timeout time. */
+#define IPMI_TIMEOUT_JIFFIES	((IPMI_TIMEOUT_TIME * HZ) / 1000)
+
+/* Request events from the queue every second (this is the number of
+   IPMI_TIMEOUT_TIMES between event requests).  Hopefully, in the
+   future, IPMI will add a way to know immediately if an event is in
+   the queue and this silliness can go away. */
 #define IPMI_REQUEST_EV_TIME	(1000 / (IPMI_TIMEOUT_TIME))
 
 static volatile int stop_operation = 0;
@@ -1796,6 +2742,7 @@ struct ipmi_smi_msg *ipmi_alloc_smi_msg(
 	rv = kmalloc(sizeof(struct ipmi_smi_msg), GFP_ATOMIC);
 	if (rv) {
 		rv->done = free_smi_msg;
+		rv->user_data = NULL;
 		atomic_inc(&smi_msg_inuse_count);
 	}
 	return rv;
@@ -1907,11 +2854,13 @@ static void send_panic_events(char *str)
 			       &addr,
 			       0,
 			       &msg,
+			       NULL,
 			       &smi_msg,
 			       &recv_msg,
 			       0,
 			       intf->my_address,
-			       intf->my_lun);
+			       intf->my_lun,
+			       0, 1); /* Don't retry, and don't wait. */
 	}
 
 #ifdef CONFIG_IPMI_PANIC_STRING
@@ -1951,11 +2900,13 @@ static void send_panic_events(char *str)
 			       &addr,
 			       0,
 			       &msg,
+			       NULL,
 			       &smi_msg,
 			       &recv_msg,
 			       0,
 			       intf->my_address,
-			       intf->my_lun);
+			       intf->my_lun,
+			       0, 1); /* Don't retry, and don't wait. */
 
 		if (intf->local_event_generator) {
 			/* Request the event receiver from the local MC. */
@@ -1969,11 +2920,13 @@ static void send_panic_events(char *str)
 				       &addr,
 				       0,
 				       &msg,
+				       NULL,
 				       &smi_msg,
 				       &recv_msg,
 				       0,
 				       intf->my_address,
-				       intf->my_lun);
+				       intf->my_lun,
+				       0, 1); /* no retry, and no wait. */
 		}
 		intf->null_user_handler = NULL;
 
@@ -2029,11 +2982,13 @@ static void send_panic_events(char *str)
 				       &addr,
 				       0,
 				       &msg,
+				       NULL,
 				       &smi_msg,
 				       &recv_msg,
 				       0,
 				       intf->my_address,
-				       intf->my_lun);
+				       intf->my_lun,
+				       0, 1); /* no retry, and no wait. */
 		}
 	}	
 #endif /* CONFIG_IPMI_PANIC_STRING */
@@ -2075,7 +3030,6 @@ static struct notifier_block panic_block
 	200   /* priority: INT_MAX >= x >= 0 */
 };
 
-
 static __init int ipmi_init_msghandler(void)
 {
 	int i;
@@ -2083,10 +3037,21 @@ static __init int ipmi_init_msghandler(v
 	if (initialized)
 		return 0;
 
+	printk(KERN_INFO "ipmi message handler version "
+	       IPMI_MSGHANDLER_VERSION "\n");
+
 	for (i=0; i<MAX_IPMI_INTERFACES; i++) {
 		ipmi_interfaces[i] = NULL;
 	}
 
+	proc_ipmi_root = proc_mkdir("ipmi", 0);
+	if (!proc_ipmi_root) {
+	    printk("Unable to create IPMI proc dir");
+	    return -ENOMEM;
+	}
+
+	proc_ipmi_root->owner = THIS_MODULE;
+
 	init_timer(&ipmi_timer);
 	ipmi_timer.data = 0;
 	ipmi_timer.function = ipmi_timeout;
@@ -2097,8 +3062,6 @@ static __init int ipmi_init_msghandler(v
 
 	initialized = 1;
 
-	printk(KERN_INFO "ipmi: message handler initialized\n");
-
 	return 0;
 }
 
@@ -2118,9 +3081,12 @@ static __exit void cleanup_ipmi(void)
 	   problems with race conditions removing the timer here. */
 	stop_operation = 1;
 	while (!timer_stopped) {
+		set_current_state(TASK_UNINTERRUPTIBLE);
 		schedule_timeout(1);
 	}
 
+	remove_proc_entry(proc_ipmi_root->name, &proc_root);
+
 	initialized = 0;
 
 	/* Check for buffer leaks. */
@@ -2143,6 +3109,7 @@ EXPORT_SYMBOL(ipmi_create_user);
 EXPORT_SYMBOL(ipmi_destroy_user);
 EXPORT_SYMBOL(ipmi_get_version);
 EXPORT_SYMBOL(ipmi_request);
+EXPORT_SYMBOL(ipmi_request_settime);
 EXPORT_SYMBOL(ipmi_request_supply_msgs);
 EXPORT_SYMBOL(ipmi_request_with_source);
 EXPORT_SYMBOL(ipmi_register_smi);
@@ -2164,3 +3131,4 @@ EXPORT_SYMBOL(ipmi_set_my_address);
 EXPORT_SYMBOL(ipmi_get_my_address);
 EXPORT_SYMBOL(ipmi_set_my_LUN);
 EXPORT_SYMBOL(ipmi_get_my_LUN);
+EXPORT_SYMBOL(ipmi_smi_add_proc_entry);
--- diff/drivers/char/ipmi/ipmi_watchdog.c	2003-09-17 12:28:05.000000000 +0100
+++ source/drivers/char/ipmi/ipmi_watchdog.c	2004-04-21 10:45:34.095520192 +0100
@@ -33,6 +33,7 @@
 
 #include <linux/config.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/ipmi.h>
 #include <linux/ipmi_smi.h>
 #include <linux/watchdog.h>
@@ -50,6 +51,8 @@
 #include <asm/apic.h>
 #endif
 
+#define IPMI_WATCHDOG_VERSION "v31"
+
 /*
  * The IPMI command/response information for the watchdog timer.
  */
@@ -137,26 +140,41 @@ static int pretimeout = 0;
 /* Default action is to reset the board on a timeout. */
 static unsigned char action_val = WDOG_TIMEOUT_RESET;
 
-static char *action = "reset";
+static char action[16] = "reset";
 
 static unsigned char preaction_val = WDOG_PRETIMEOUT_NONE;
 
-static char *preaction = "pre_none";
+static char preaction[16] = "pre_none";
 
 static unsigned char preop_val = WDOG_PREOP_NONE;
 
-static char *preop = "preop_none";
+static char preop[16] = "preop_none";
 static spinlock_t ipmi_read_lock = SPIN_LOCK_UNLOCKED;
 static char data_to_read = 0;
 static DECLARE_WAIT_QUEUE_HEAD(read_q);
 static struct fasync_struct *fasync_q = NULL;
 static char pretimeout_since_last_heartbeat = 0;
 
-MODULE_PARM(timeout, "i");
-MODULE_PARM(pretimeout, "i");
-MODULE_PARM(action, "s");
-MODULE_PARM(preaction, "s");
-MODULE_PARM(preop, "s");
+/* If true, the driver will start running as soon as it is configured
+   and ready. */
+static int start_now = 0;
+
+module_param(timeout, int, 0);
+MODULE_PARM_DESC(timeout, "Timeout value in seconds.");
+module_param(pretimeout, int, 0);
+MODULE_PARM_DESC(pretimeout, "Pretimeout value in seconds.");
+module_param_string(action, action, sizeof(action), 0);
+MODULE_PARM_DESC(action, "Timeout action. One of: "
+		 "reset, none, power_cycle, power_off.");
+module_param_string(preaction, preaction, sizeof(preaction), 0);
+MODULE_PARM_DESC(preaction, "Pretimeout action.  One of: "
+		 "pre_none, pre_smi, pre_nmi, pre_int.");
+module_param_string(preop, preop, sizeof(preop), 0);
+MODULE_PARM_DESC(preop, "Pretimeout driver operation.  One of: "
+		 "preop_none, preop_panic, preop_give_data.");
+module_param(start_now, int, 0);
+MODULE_PARM_DESC(start_now, "Set to 1 to start the watchdog as"
+		 "soon as the driver is loaded.");
 
 /* Default state of the timer. */
 static unsigned char ipmi_watchdog_state = WDOG_TIMEOUT_NONE;
@@ -167,10 +185,6 @@ static int ipmi_ignore_heartbeat = 0;
 /* Is someone using the watchdog?  Only one user is allowed. */
 static int ipmi_wdog_open = 0;
 
-/* If true, the driver will start running as soon as it is configured
-   and ready. */
-static int start_now = 0;
-
 /* If set to 1, the heartbeat command will set the state to reset and
    start the timer.  The timer doesn't normally run when the driver is
    first opened until the heartbeat is set the first time, this
@@ -260,6 +274,7 @@ static int i_ipmi_set_timeout(struct ipm
 				      (struct ipmi_addr *) &addr,
 				      0,
 				      &msg,
+				      NULL,
 				      smi_msg,
 				      recv_msg,
 				      1);
@@ -435,6 +450,7 @@ static int ipmi_heartbeat(void)
 				      (struct ipmi_addr *) &addr,
 				      0,
 				      &msg,
+				      NULL,
 				      &heartbeat_smi_msg,
 				      &heartbeat_recv_msg,
 				      1);
@@ -483,6 +499,7 @@ static void panic_halt_ipmi_heartbeat(vo
 				 (struct ipmi_addr *) &addr,
 				 0,
 				 &msg,
+				 NULL,
 				 &panic_halt_heartbeat_smi_msg,
 				 &panic_halt_heartbeat_recv_msg,
 				 1);
@@ -903,6 +920,7 @@ static void ipmi_smi_gone(int if_num)
 
 static struct ipmi_smi_watcher smi_watcher =
 {
+	.owner    = THIS_MODULE,
 	.new_smi  = ipmi_new_smi,
 	.smi_gone = ipmi_smi_gone
 };
@@ -911,6 +929,9 @@ static int __init ipmi_wdog_init(void)
 {
 	int rv;
 
+	printk(KERN_INFO "IPMI watchdog driver version "
+	       IPMI_WATCHDOG_VERSION "\n");
+
 	if (strcmp(action, "reset") == 0) {
 		action_val = WDOG_TIMEOUT_RESET;
 	} else if (strcmp(action, "none") == 0) {
@@ -999,14 +1020,10 @@ static int __init ipmi_wdog_init(void)
 	register_reboot_notifier(&wdog_reboot_notifier);
 	notifier_chain_register(&panic_notifier_list, &wdog_panic_notifier);
 
-	printk(KERN_INFO "IPMI watchdog by "
-	       "Corey Minyard (minyard@mvista.com)\n");
-
 	return 0;
 }
 
-#ifdef MODULE
-static void ipmi_unregister_watchdog(void)
+static __exit void ipmi_unregister_watchdog(void)
 {
 	int rv;
 
@@ -1034,6 +1051,7 @@ static void ipmi_unregister_watchdog(voi
 	   pointers to our buffers, we want to make sure they are done before
 	   we release our memory. */
 	while (atomic_read(&set_timeout_tofree)) {
+		set_current_state(TASK_UNINTERRUPTIBLE);
 		schedule_timeout(1);
 	}
 
@@ -1056,76 +1074,6 @@ static void __exit ipmi_wdog_exit(void)
 	ipmi_unregister_watchdog();
 }
 module_exit(ipmi_wdog_exit);
-#else
-static int __init ipmi_wdog_setup(char *str)
-{
-	int  val;
-	int  rv;
-	char *option;
-
-	rv = get_option(&str, &val);
-	if (rv == 0)
-		return 1;
-	if (val > 0)
-		timeout = val;
-	if (rv == 1)
-		return 1;
-
-	rv = get_option(&str, &val);
-	if (rv == 0)
-		return 1;
-	if (val >= 0)
-		pretimeout = val;
-	if (rv == 1)
-		return 1;
-
-	while ((option = strsep(&str, ",")) != NULL) {
-		if (strcmp(option, "reset") == 0) {
-			action = "reset";
-		}
-		else if (strcmp(option, "none") == 0) {
-			action = "none";
-		}
-		else if (strcmp(option, "power_cycle") == 0) {
-			action = "power_cycle";
-		}
-		else if (strcmp(option, "power_off") == 0) {
-			action = "power_off";
-		}
-		else if (strcmp(option, "pre_none") == 0) {
-			preaction = "pre_none";
-		}
-		else if (strcmp(option, "pre_smi") == 0) {
-			preaction = "pre_smi";
-		}
-#ifdef HAVE_NMI_HANDLER
-		else if (strcmp(option, "pre_nmi") == 0) {
-			preaction = "pre_nmi";
-		}
-#endif
-		else if (strcmp(option, "pre_int") == 0) {
-			preaction = "pre_int";
-		}
-		else if (strcmp(option, "start_now") == 0) {
-			start_now = 1;
-		}
-		else if (strcmp(option, "preop_none") == 0) {
-			preop = "preop_none";
-		}
-		else if (strcmp(option, "preop_panic") == 0) {
-			preop = "preop_panic";
-		}
-		else if (strcmp(option, "preop_give_data") == 0) {
-			preop = "preop_give_data";
-		} else {
-		    printk("Unknown IPMI watchdog option: '%s'\n", option);
-		}
-	}
-
-	return 1;
-}
-__setup("ipmi_wdog=", ipmi_wdog_setup);
-#endif
 
 EXPORT_SYMBOL(ipmi_delayed_shutdown);
 
--- diff/drivers/char/isicom.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/char/isicom.c	2004-04-21 10:45:34.107518368 +0100
@@ -129,6 +129,7 @@ static int ISILoad_ioctl(struct inode *i
 		         unsigned int cmd, unsigned long arg)
 {
 	unsigned int card, i, j, signature, status, portcount = 0;
+	unsigned long t;
 	unsigned short word_count, base;
 	bin_frame frame;
 	/* exec_record exec_rec; */
@@ -152,12 +153,12 @@ static int ISILoad_ioctl(struct inode *i
 								
 			inw(base+0x8);
 			
-			for(i=jiffies+HZ/100;time_before(jiffies, i););
+			for(t=jiffies+HZ/100;time_before(jiffies, t););
 				
 			outw(0,base+0x8); /* Reset */
 			
 			for(j=1;j<=3;j++) {
-				for(i=jiffies+HZ;time_before(jiffies, i););
+				for(t=jiffies+HZ;time_before(jiffies, t););
 				printk(".");
 			}	
 			signature=(inw(base+0x4)) & 0xff;	
@@ -1312,7 +1313,6 @@ static int isicom_tiocmset(struct tty_st
 			   unsigned int set, unsigned int clear)
 {
 	struct isi_port * port = (struct isi_port *) tty->driver_data;
-	unsigned int arg;
 	unsigned long flags;
 	
 	if (isicom_paranoia_check(port, tty->name, "isicom_ioctl"))
@@ -1649,8 +1649,8 @@ static int register_drivers(void)
 
 static void unregister_drivers(void)
 {
-	int error;
-	if (tty_unregister_driver(isicom_normal))
+	int error = tty_unregister_driver(isicom_normal);
+	if (error)
 		printk(KERN_DEBUG "ISICOM: couldn't unregister normal driver error=%d.\n",error);
 	put_tty_driver(isicom_normal);
 }
--- diff/drivers/char/istallion.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/char/istallion.c	2004-04-21 10:45:34.120516392 +0100
@@ -40,6 +40,7 @@
 #include <linux/delay.h>
 #include <linux/init.h>
 #include <linux/devfs_fs_kernel.h>
+#include <linux/device.h>
 
 #include <asm/io.h>
 #include <asm/uaccess.h>
@@ -795,6 +796,8 @@ static int	stli_timeron;
 
 /*****************************************************************************/
 
+static struct class_simple *istallion_class;
+
 #ifdef MODULE
 
 /*
@@ -853,9 +856,12 @@ static void __exit istallion_module_exit
 		return;
 	}
 	put_tty_driver(stli_serial);
-	for (i = 0; i < 4; i++)
+	for (i = 0; i < 4; i++) {
 		devfs_remove("staliomem/%d", i);
+		class_simple_device_remove(MKDEV(STL_SIOMEMMAJOR, i));
+	}
 	devfs_remove("staliomem");
+	class_simple_destroy(istallion_class);
 	if ((i = unregister_chrdev(STL_SIOMEMMAJOR, "staliomem")))
 		printk("STALLION: failed to un-register serial memory device, "
 			"errno=%d\n", -i);
@@ -2050,7 +2056,6 @@ static int stli_ioctl(struct tty_struct 
 {
 	stliport_t	*portp;
 	stlibrd_t	*brdp;
-	unsigned long	lval;
 	unsigned int	ival;
 	int		rc;
 
@@ -5311,10 +5316,13 @@ int __init stli_init(void)
 				"device\n");
 
 	devfs_mk_dir("staliomem");
+	istallion_class = class_simple_create(THIS_MODULE, "staliomem");
 	for (i = 0; i < 4; i++) {
 		devfs_mk_cdev(MKDEV(STL_SIOMEMMAJOR, i),
 			       S_IFCHR | S_IRUSR | S_IWUSR,
 			       "staliomem/%d", i);
+		class_simple_device_add(istallion_class, MKDEV(STL_SIOMEMMAJOR, i), 
+				NULL, "staliomem%d", i);
 	}
 
 /*
--- diff/drivers/char/mem.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/char/mem.c	2004-04-21 10:45:34.131514720 +0100
@@ -410,7 +410,7 @@ static inline size_t read_zero_pagealign
 		if (count > size)
 			count = size;
 
-		zap_page_range(vma, addr, count);
+		zap_page_range(vma, addr, count, NULL);
         	zeromap_page_range(vma, addr, count, PAGE_COPY);
 
 		size -= count;
--- diff/drivers/char/moxa.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/char/moxa.c	2004-04-21 10:45:34.134514264 +0100
@@ -778,7 +778,7 @@ static int moxa_tiocmset(struct tty_stru
 {
 	struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
 	int port;
-	int flag = 0, dtr, rts;
+	int dtr, rts;
 
 	port = PORTNO(tty);
 	if ((port != MAX_PORTS) && (!ch))
@@ -802,8 +802,7 @@ static int moxa_ioctl(struct tty_struct 
 {
 	struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
 	register int port;
-	int retval, dtr, rts;
-	unsigned long flag;
+	int retval;
 
 	port = PORTNO(tty);
 	if ((port != MAX_PORTS) && (!ch))
--- diff/drivers/char/mxser.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/char/mxser.c	2004-04-21 10:45:34.138513656 +0100
@@ -2150,7 +2150,6 @@ static int mxser_tiocmget(struct tty_str
 {
 	struct mxser_struct *info = (struct mxser_struct *) tty->driver_data;
 	unsigned char control, status;
-	unsigned int result;
 	unsigned long flags;
 
 	if (PORTNO(tty) == MXSER_PORTS)
@@ -2177,7 +2176,6 @@ static int mxser_tiocmset(struct tty_str
 			  unsigned int set, unsigned int clear)
 {
 	struct mxser_struct *info = (struct mxser_struct *) tty->driver_data;
-	unsigned int arg;
 	unsigned long flags;
 
 	if (PORTNO(tty) == MXSER_PORTS)
--- diff/drivers/char/n_tty.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/char/n_tty.c	2004-04-21 10:45:34.140513352 +0100
@@ -999,7 +999,8 @@ do_it_again:
 	/* NOTE: not yet done after every sleep pending a thorough
 	   check of the logic of this change. -- jlc */
 	/* don't stop on /dev/console */
-	if (file->f_op->write != redirected_tty_write && current->tty == tty) {
+	if (file->f_op->write != redirected_tty_write &&
+	    current->signal->tty == tty) {
 		if (tty->pgrp <= 0)
 			printk("read_chan: tty->pgrp <= 0!\n");
 		else if (process_group(current) != tty->pgrp) {
--- diff/drivers/char/random.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/char/random.c	2004-04-21 10:45:34.142513048 +0100
@@ -490,12 +490,15 @@ static inline __u32 int_ln_12bits(__u32 
  **********************************************************************/
 
 struct entropy_store {
+	/* mostly-read data: */
+	struct poolinfo poolinfo;
+	__u32		*pool;
+
+	/* read-write data: */
+	spinlock_t lock ____cacheline_aligned_in_smp;
 	unsigned	add_ptr;
 	int		entropy_count;
 	int		input_rotate;
-	struct poolinfo poolinfo;
-	__u32		*pool;
-	spinlock_t lock;
 };
 
 /*
@@ -571,38 +574,54 @@ static void add_entropy_words(struct ent
 	static __u32 const twist_table[8] = {
 		         0, 0x3b6e20c8, 0x76dc4190, 0x4db26158,
 		0xedb88320, 0xd6d6a3e8, 0x9b64c2b0, 0xa00ae278 };
-	unsigned i;
-	int new_rotate;
+	unsigned long i, add_ptr, tap1, tap2, tap3, tap4, tap5;
+	int new_rotate, input_rotate;
 	int wordmask = r->poolinfo.poolwords - 1;
-	__u32 w;
+	__u32 w, next_w;
 	unsigned long flags;
 
+	/* Taps are constant, so we can load them without holding r->lock.  */
+	tap1 = r->poolinfo.tap1;
+	tap2 = r->poolinfo.tap2;
+	tap3 = r->poolinfo.tap3;
+	tap4 = r->poolinfo.tap4;
+	tap5 = r->poolinfo.tap5;
+	next_w = *in++;
+
 	spin_lock_irqsave(&r->lock, flags);
+	prefetch_range(r->pool, wordmask);
+	input_rotate = r->input_rotate;
+	add_ptr = r->add_ptr;
 
 	while (nwords--) {
-		w = rotate_left(r->input_rotate, *in++);
-		i = r->add_ptr = (r->add_ptr - 1) & wordmask;
+		w = rotate_left(input_rotate, next_w);
+		if (nwords > 0)
+			next_w = *in++;
+		i = add_ptr = (add_ptr - 1) & wordmask;
 		/*
 		 * Normally, we add 7 bits of rotation to the pool.
 		 * At the beginning of the pool, add an extra 7 bits
 		 * rotation, so that successive passes spread the
 		 * input bits across the pool evenly.
 		 */
-		new_rotate = r->input_rotate + 14;
+		new_rotate = input_rotate + 14;
 		if (i)
-			new_rotate = r->input_rotate + 7;
-		r->input_rotate = new_rotate & 31;
+			new_rotate = input_rotate + 7;
+		input_rotate = new_rotate & 31;
 
 		/* XOR in the various taps */
-		w ^= r->pool[(i + r->poolinfo.tap1) & wordmask];
-		w ^= r->pool[(i + r->poolinfo.tap2) & wordmask];
-		w ^= r->pool[(i + r->poolinfo.tap3) & wordmask];
-		w ^= r->pool[(i + r->poolinfo.tap4) & wordmask];
-		w ^= r->pool[(i + r->poolinfo.tap5) & wordmask];
+		w ^= r->pool[(i + tap1) & wordmask];
+		w ^= r->pool[(i + tap2) & wordmask];
+		w ^= r->pool[(i + tap3) & wordmask];
+		w ^= r->pool[(i + tap4) & wordmask];
+		w ^= r->pool[(i + tap5) & wordmask];
 		w ^= r->pool[i];
 		r->pool[i] = (w >> 3) ^ twist_table[w & 7];
 	}
 
+	r->input_rotate = input_rotate;
+	r->add_ptr = add_ptr;
+
 	spin_unlock_irqrestore(&r->lock, flags);
 }
 
--- diff/drivers/char/rocket.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/char/rocket.c	2004-04-21 10:45:34.145512592 +0100
@@ -953,7 +953,7 @@ static int rp_open(struct tty_struct *tt
 	/*
 	 * Info->count is now 1; so it's safe to sleep now.
 	 */
-	info->session = current->session;
+	info->session = current->signal->session;
 	info->pgrp = process_group(current);
 
 	if ((info->flags & ROCKET_INITIALIZED) == 0) {
--- diff/drivers/char/serial_tx3912.h	2002-10-16 04:28:33.000000000 +0100
+++ source/drivers/char/serial_tx3912.h	2004-04-21 10:45:34.145512592 +0100
@@ -59,9 +59,9 @@ int rs_debug = TX3912_UART_DEBUG_ALL & ~
 
 #define rs_dprintk(f, str...) if (rs_debug & f) printk (str)
 #define func_enter() rs_dprintk (TX3912_UART_DEBUG_FLOW,	\
-				"rs: enter " __FUNCTION__ "\n")
+				"rs: enter %s\n", __FUNCTION__)
 #define func_exit() rs_dprintk (TX3912_UART_DEBUG_FLOW,	\
-				"rs: exit " __FUNCTION__ "\n")
+				"rs: exit %s\n", __FUNCTION__)
 
 #else
 #define rs_dprintk(f, str...)
--- diff/drivers/char/sn_serial.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/char/sn_serial.c	2004-04-21 10:45:34.154511224 +0100
@@ -82,10 +82,10 @@ static DECLARE_TASKLET(sn_sal_tasklet, s
 static unsigned long sn_interrupt_timeout;
 
 extern u64 master_node_bedrock_address;
-static int sn_debug_printf(const char *fmt, ...);
 
 #undef DEBUG
 #ifdef DEBUG
+static int sn_debug_printf(const char *fmt, ...);
 #define DPRINTF(x...) sn_debug_printf(x)
 #else
 #define DPRINTF(x...) do { } while (0)
@@ -247,6 +247,7 @@ early_printk_sn_sal(const char *s, unsig
 	sn_func->sal_puts(s, count);
 }
 
+#ifdef DEBUG
 /* this is as "close to the metal" as we can get, used when the driver
  * itself may be broken */
 static int
@@ -262,6 +263,7 @@ sn_debug_printf(const char *fmt, ...)
 	va_end(args);
 	return printed_len;
 }
+#endif /* DEBUG */
 
 /*
  * Interrupt handling routines.
--- diff/drivers/char/specialix.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/char/specialix.c	2004-04-21 10:45:34.164509704 +0100
@@ -1696,8 +1696,6 @@ static int sx_tiocmset(struct tty_struct
 		       unsigned int set, unsigned int clear)
 {
 	struct specialix_port *port = (struct specialix_port *)tty->driver_data;
-	int error;
-	unsigned int arg;
 	unsigned long flags;
 	struct specialix_board *bp;
 
--- diff/drivers/char/stallion.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/char/stallion.c	2004-04-21 10:45:34.167509248 +0100
@@ -41,6 +41,7 @@
 #include <linux/init.h>
 #include <linux/smp_lock.h>
 #include <linux/devfs_fs_kernel.h>
+#include <linux/device.h>
 
 #include <asm/io.h>
 #include <asm/uaccess.h>
@@ -732,6 +733,8 @@ static struct file_operations	stl_fsiome
 
 /*****************************************************************************/
 
+static struct class_simple *stallion_class;
+
 #ifdef MODULE
 
 /*
@@ -788,12 +791,15 @@ static void __exit stallion_module_exit(
 		restore_flags(flags);
 		return;
 	}
-	for (i = 0; i < 4; i++)
+	for (i = 0; i < 4; i++) {
 		devfs_remove("staliomem/%d", i);
+		class_simple_device_remove(MKDEV(STL_SIOMEMMAJOR, i));
+	}
 	devfs_remove("staliomem");
 	if ((i = unregister_chrdev(STL_SIOMEMMAJOR, "staliomem")))
 		printk("STALLION: failed to un-register serial memory device, "
 			"errno=%d\n", -i);
+	class_simple_destroy(stallion_class);
 
 	if (stl_tmpwritebuf != (char *) NULL)
 		kfree(stl_tmpwritebuf);
@@ -3181,10 +3187,12 @@ int __init stl_init(void)
 		printk("STALLION: failed to register serial board device\n");
 	devfs_mk_dir("staliomem");
 
+	stallion_class = class_simple_create(THIS_MODULE, "staliomem");
 	for (i = 0; i < 4; i++) {
 		devfs_mk_cdev(MKDEV(STL_SIOMEMMAJOR, i),
 				S_IFCHR|S_IRUSR|S_IWUSR,
 				"staliomem/%d", i);
+		class_simple_device_add(stallion_class, MKDEV(STL_SIOMEMMAJOR, i), NULL, "staliomem%d", i);
 	}
 
 	stl_serial->owner = THIS_MODULE;
--- diff/drivers/char/sx.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/char/sx.c	2004-04-21 10:45:34.170508792 +0100
@@ -1420,7 +1420,7 @@ static int sx_open  (struct tty_struct *
 
 	line = tty->index;
 	sx_dprintk (SX_DEBUG_OPEN, "%d: opening line %d. tty=%p ctty=%p, np=%d)\n", 
-	            current->pid, line, tty, current->tty, sx_nports);
+	            current->pid, line, tty, current->signal->tty, sx_nports);
 
 	if ((line < 0) || (line >= SX_NPORTS) || (line >= sx_nports))
 		return -ENODEV;
--- diff/drivers/char/tipar.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/char/tipar.c	2004-04-21 10:45:34.171508640 +0100
@@ -67,7 +67,7 @@
 /*
  * Version Information
  */
-#define DRIVER_VERSION "1.17"
+#define DRIVER_VERSION "1.19"
 #define DRIVER_AUTHOR  "Romain Lievin <roms@lpg.ticalc.org>"
 #define DRIVER_DESC    "Device driver for TI/PC parallel link cables"
 #define DRIVER_LICENSE "GPL"
@@ -361,10 +361,13 @@ tipar_ioctl(struct inode *inode, struct 
 
 	switch (cmd) {
 	case IOCTL_TIPAR_DELAY:
-	  delay = (int)arg;    //get_user(delay, &arg);
-	  break;
+		delay = (int)arg;    //get_user(delay, &arg);
+		break;
 	case IOCTL_TIPAR_TIMEOUT:
-	  timeout = (int)arg;  //get_user(timeout, &arg);
+		if (arg != 0)
+                        timeout = (int)arg;
+                else
+                        retval = -EINVAL;
 	  break;
 	default:
 		retval = -ENOTTY;
@@ -399,7 +402,10 @@ tipar_setup(char *str)
 	str = get_options(str, ARRAY_SIZE(ints), ints);
 
 	if (ints[0] > 0) {
-		timeout = ints[1];
+		if (ints[1] != 0)
+                        timeout = ints[1];
+                else
+                        printk("tipar: wrong timeout value (0), using default value instead.");
 		if (ints[0] > 1) {
 			delay = ints[2];
 		}
--- diff/drivers/char/tpqic02.c	2003-09-17 12:28:05.000000000 +0100
+++ source/drivers/char/tpqic02.c	2004-04-21 10:45:34.178507576 +0100
@@ -94,6 +94,7 @@
 #include <linux/init.h>
 #include <linux/smp_lock.h>
 #include <linux/devfs_fs_kernel.h>
+#include <linux/device.h>
 
 #include <asm/dma.h>
 #include <asm/system.h>
@@ -229,6 +230,8 @@ static const char *format_names[] = {
 	"600"			/* untested. */
 };
 
+static struct class_simple *tpqic02_class;
+
 
 /* `exception_list' is needed for exception status reporting.
  * Exceptions 1..14 are defined by QIC-02 rev F.
@@ -694,7 +697,7 @@ static int rdstatus(char *stp, unsigned 
 		*q = inb_p(QIC02_DATA_PORT);	/* read status byte */
 
 		if (TP_DIAGS(current_type))
-			printk("[%1d]=0x%x  ", q - stp, (unsigned) (*q) & 0xff);
+			printk("[%1zd]=0x%x  ", q - stp, (unsigned) (*q) & 0xff);
 
 		outb_p(ctlbits | QIC02_CTL_REQUEST, QIC02_CTL_PORT);	/* set request */
 
@@ -2696,23 +2699,32 @@ int __init qic02_tape_init(void)
 		return -ENODEV;
 	}
 
+	tpqic02_class = class_simple_create(THIS_MODULE, TPQIC02_NAME);
+	class_simple_device_add(tpqic02_class, MKDEV(QIC02_TAPE_MAJOR, 2), NULL, "ntpqic11");
 	devfs_mk_cdev(MKDEV(QIC02_TAPE_MAJOR, 2),
 		       S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP, "ntpqic11");
+	class_simple_device_add(tpqic02_class, MKDEV(QIC02_TAPE_MAJOR, 3), NULL, "tpqic11");
 	devfs_mk_cdev(MKDEV(QIC02_TAPE_MAJOR, 3),
 		       S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP, "tpqic11");
 
+	class_simple_device_add(tpqic02_class, MKDEV(QIC02_TAPE_MAJOR, 4), NULL, "ntpqic24");
 	devfs_mk_cdev(MKDEV(QIC02_TAPE_MAJOR, 4),
 		       S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP, "ntpqic24");
+	class_simple_device_add(tpqic02_class, MKDEV(QIC02_TAPE_MAJOR, 5), NULL, "tpqic24");
 	devfs_mk_cdev(MKDEV(QIC02_TAPE_MAJOR, 5),
 		       S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP, "tpqic24");
 
+	class_simple_device_add(tpqic02_class, MKDEV(QIC02_TAPE_MAJOR, 6), NULL, "ntpqic20");
 	devfs_mk_cdev(MKDEV(QIC02_TAPE_MAJOR, 6),
 		       S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP, "ntpqic120");
+	class_simple_device_add(tpqic02_class, MKDEV(QIC02_TAPE_MAJOR, 7), NULL, "tpqic20");
 	devfs_mk_cdev(MKDEV(QIC02_TAPE_MAJOR, 7),
 		       S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP, "tpqic120");
 
+	class_simple_device_add(tpqic02_class, MKDEV(QIC02_TAPE_MAJOR, 8), NULL, "ntpqic50");
 	devfs_mk_cdev(MKDEV(QIC02_TAPE_MAJOR, 8),
 		       S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP, "ntpqic150");
+	class_simple_device_add(tpqic02_class, MKDEV(QIC02_TAPE_MAJOR, 9), NULL, "tpqic50");
 	devfs_mk_cdev(MKDEV(QIC02_TAPE_MAJOR, 9),
 		       S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP, "tpqic150");
 
@@ -2757,13 +2769,23 @@ static void qic02_module_exit(void)
 		qic02_release_resources();
 		
 	devfs_remove("ntpqic11");
+	class_simple_device_remove(MKDEV(QIC02_TAPE_MAJOR, 2));
 	devfs_remove("tpqic11");
+	class_simple_device_remove(MKDEV(QIC02_TAPE_MAJOR, 3));
 	devfs_remove("ntpqic24");
+	class_simple_device_remove(MKDEV(QIC02_TAPE_MAJOR, 4));
 	devfs_remove("tpqic24");
+	class_simple_device_remove(MKDEV(QIC02_TAPE_MAJOR, 5));
 	devfs_remove("ntpqic120");
+	class_simple_device_remove(MKDEV(QIC02_TAPE_MAJOR, 6));
 	devfs_remove("tpqic120");
+	class_simple_device_remove(MKDEV(QIC02_TAPE_MAJOR, 7));
 	devfs_remove("ntpqic150");
+	class_simple_device_remove(MKDEV(QIC02_TAPE_MAJOR, 8));
 	devfs_remove("tpqic150");
+	class_simple_device_remove(MKDEV(QIC02_TAPE_MAJOR, 9));
+
+	class_simple_destroy(tpqic02_class);
 }
 
 static int qic02_module_init(void)
--- diff/drivers/char/tty_io.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/char/tty_io.c	2004-04-21 10:45:34.187506208 +0100
@@ -122,6 +122,9 @@ EXPORT_SYMBOL(tty_std_termios);
 LIST_HEAD(tty_drivers);			/* linked list of tty drivers */
 struct tty_ldisc ldiscs[NR_LDISCS];	/* line disc dispatch table	*/
 
+/* Semaphore to protect creating and releasing a tty */
+DECLARE_MUTEX(tty_sem);
+
 #ifdef CONFIG_UNIX98_PTYS
 extern struct tty_driver *ptm_driver;	/* Unix98 pty masters; for /dev/ptmx */
 extern int pty_limit;		/* Config limit on Unix98 ptys */
@@ -141,6 +144,8 @@ int tty_ioctl(struct inode * inode, stru
 	      unsigned int cmd, unsigned long arg);
 static int tty_fasync(int fd, struct file * filp, int on);
 extern void rs_360_init(void);
+static void release_mem(struct tty_struct *tty, int idx);
+
 
 static struct tty_struct *alloc_tty_struct(void)
 {
@@ -316,7 +321,7 @@ struct tty_driver *get_tty_driver(dev_t 
  */
 int tty_check_change(struct tty_struct * tty)
 {
-	if (current->tty != tty)
+	if (current->signal->tty != tty)
 		return 0;
 	if (tty->pgrp <= 0) {
 		printk(KERN_WARNING "tty_check_change: tty->pgrp <= 0!\n");
@@ -481,17 +486,14 @@ void do_tty_hangup(void *data)
 	if (tty->session > 0) {
 		struct list_head *l;
 		for_each_task_pid(tty->session, PIDTYPE_SID, p, l, pid) {
-			task_t *task = p;
-			do {
-				if (task->tty == tty)
-					task->tty = NULL;
-				if (task->leader) {
-					send_group_sig_info(SIGHUP, SEND_SIG_PRIV, task);
-					send_group_sig_info(SIGCONT, SEND_SIG_PRIV, task);
-				}
-			} while_each_thread(p, task);
+			if (p->signal->tty == tty)
+				p->signal->tty = NULL;
+			if (!p->signal->leader)
+				continue;
+			send_group_sig_info(SIGHUP, SEND_SIG_PRIV, p);
+			send_group_sig_info(SIGCONT, SEND_SIG_PRIV, p);
 			if (tty->pgrp > 0)
-				p->tty_old_pgrp = tty->pgrp;
+				p->signal->tty_old_pgrp = tty->pgrp;
 		}
 	}
 	read_unlock(&tasklist_lock);
@@ -570,15 +572,15 @@ void disassociate_ctty(int on_exit)
 
 	lock_kernel();
 
-	tty = current->tty;
+	tty = current->signal->tty;
 	if (tty) {
 		tty_pgrp = tty->pgrp;
 		if (on_exit && tty->driver->type != TTY_DRIVER_TYPE_PTY)
 			tty_vhangup(tty);
 	} else {
-		if (current->tty_old_pgrp) {
-			kill_pg(current->tty_old_pgrp, SIGHUP, on_exit);
-			kill_pg(current->tty_old_pgrp, SIGCONT, on_exit);
+		if (current->signal->tty_old_pgrp) {
+			kill_pg(current->signal->tty_old_pgrp, SIGHUP, on_exit);
+			kill_pg(current->signal->tty_old_pgrp, SIGCONT, on_exit);
 		}
 		unlock_kernel();	
 		return;
@@ -589,17 +591,13 @@ void disassociate_ctty(int on_exit)
 			kill_pg(tty_pgrp, SIGCONT, on_exit);
 	}
 
-	current->tty_old_pgrp = 0;
+	current->signal->tty_old_pgrp = 0;
 	tty->session = 0;
 	tty->pgrp = -1;
 
 	read_lock(&tasklist_lock);
-	for_each_task_pid(current->session, PIDTYPE_SID, p, l, pid) {
-		task_t *task = p;
-		do {
-			task->tty = NULL;
-		} while_each_thread(p, task);
-	}
+	for_each_task_pid(current->signal->session, PIDTYPE_SID, p, l, pid)
+		p->signal->tty = NULL;
 	read_unlock(&tasklist_lock);
 	unlock_kernel();
 }
@@ -765,21 +763,6 @@ ssize_t redirected_tty_write(struct file
 	return tty_write(file, buf, count, ppos);
 }
 
-/* Semaphore to protect creating and releasing a tty */
-static DECLARE_MUTEX(tty_sem);
-
-static void down_tty_sem(int index)
-{
-	down(&tty_sem);
-}
-
-static void up_tty_sem(int index)
-{
-	up(&tty_sem);
-}
-
-static void release_mem(struct tty_struct *tty, int idx);
-
 static inline void tty_line_name(struct tty_driver *driver, int index, char *p)
 {
 	sprintf(p, "%s%d", driver->name, index + driver->name_base);
@@ -803,7 +786,7 @@ static int init_dev(struct tty_driver *d
 	 * Check whether we need to acquire the tty semaphore to avoid
 	 * race conditions.  For now, play it safe.
 	 */
-	down_tty_sem(idx);
+	down(&tty_sem);
 
 	/* check whether we're reopening an existing tty */
 	if (driver->flags & TTY_DRIVER_DEVPTS_MEM) {
@@ -987,7 +970,7 @@ success:
 	
 	/* All paths come through here to release the semaphore */
 end_init:
-	up_tty_sem(idx);
+	up(&tty_sem);
 	return retval;
 
 	/* Release locally allocated memory ... nothing placed in slots */
@@ -1267,20 +1250,11 @@ static void release_dev(struct file * fi
 		struct pid *pid;
 
 		read_lock(&tasklist_lock);
-		for_each_task_pid(tty->session, PIDTYPE_SID, p, l, pid) {
-			task_t *task = p;
-			do {
-				task->tty = NULL;
-			} while_each_thread(p, task);
-		}
-		if (o_tty) {
-			for_each_task_pid(o_tty->session, PIDTYPE_SID, p,l, pid) {
-				task_t *task = p;
-				do {
-					task->tty = NULL;
-				} while_each_thread(p, task);
-			}
-		}
+		for_each_task_pid(tty->session, PIDTYPE_SID, p, l, pid)
+			p->signal->tty = NULL;
+		if (o_tty)
+			for_each_task_pid(o_tty->session, PIDTYPE_SID, p,l, pid)
+				p->signal->tty = NULL;
 		read_unlock(&tasklist_lock);
 	}
 
@@ -1351,10 +1325,10 @@ static int tty_open(struct inode * inode
 retry_open:
 	noctty = filp->f_flags & O_NOCTTY;
 	if (device == MKDEV(TTYAUX_MAJOR,0)) {
-		if (!current->tty)
+		if (!current->signal->tty)
 			return -ENXIO;
-		driver = current->tty->driver;
-		index = current->tty->index;
+		driver = current->signal->tty->driver;
+		index = current->signal->tty->index;
 		filp->f_flags |= O_NONBLOCK; /* Don't let /dev/tty block */
 		/* noctty = 1; */
 		goto got_driver;
@@ -1455,14 +1429,14 @@ got_driver:
 		goto retry_open;
 	}
 	if (!noctty &&
-	    current->leader &&
-	    !current->tty &&
+	    current->signal->leader &&
+	    !current->signal->tty &&
 	    tty->session == 0) {
 	    	task_lock(current);
-		current->tty = tty;
+		current->signal->tty = tty;
 		task_unlock(current);
-		current->tty_old_pgrp = 0;
-		tty->session = current->session;
+		current->signal->tty_old_pgrp = 0;
+		tty->session = current->signal->session;
 		tty->pgrp = process_group(current);
 	}
 	return 0;
@@ -1520,7 +1494,7 @@ static int tiocsti(struct tty_struct *tt
 {
 	char ch, mbz = 0;
 
-	if ((current->tty != tty) && !capable(CAP_SYS_ADMIN))
+	if ((current->signal->tty != tty) && !capable(CAP_SYS_ADMIN))
 		return -EPERM;
 	if (get_user(ch, arg))
 		return -EFAULT;
@@ -1611,14 +1585,14 @@ static int tiocsctty(struct tty_struct *
 	struct pid *pid;
 	task_t *p;
 
-	if (current->leader &&
-	    (current->session == tty->session))
+	if (current->signal->leader &&
+	    (current->signal->session == tty->session))
 		return 0;
 	/*
 	 * The process must be a session leader and
 	 * not have a controlling tty already.
 	 */
-	if (!current->leader || current->tty)
+	if (!current->signal->leader || current->signal->tty)
 		return -EPERM;
 	if (tty->session > 0) {
 		/*
@@ -1631,21 +1605,17 @@ static int tiocsctty(struct tty_struct *
 			 */
 
 			read_lock(&tasklist_lock);
-			for_each_task_pid(tty->session, PIDTYPE_SID, p, l, pid) {
-				task_t *task = p;
-				do {
-					task->tty = NULL;
-				} while_each_thread(p, task);
-			}
+			for_each_task_pid(tty->session, PIDTYPE_SID, p, l, pid)
+				p->signal->tty = NULL;
 			read_unlock(&tasklist_lock);
 		} else
 			return -EPERM;
 	}
 	task_lock(current);
-	current->tty = tty;
+	current->signal->tty = tty;
 	task_unlock(current);
-	current->tty_old_pgrp = 0;
-	tty->session = current->session;
+	current->signal->tty_old_pgrp = 0;
+	tty->session = current->signal->session;
 	tty->pgrp = process_group(current);
 	return 0;
 }
@@ -1656,7 +1626,7 @@ static int tiocgpgrp(struct tty_struct *
 	 * (tty == real_tty) is a cheap way of
 	 * testing if the tty is NOT a master pty.
 	 */
-	if (tty == real_tty && current->tty != real_tty)
+	if (tty == real_tty && current->signal->tty != real_tty)
 		return -ENOTTY;
 	return put_user(real_tty->pgrp, arg);
 }
@@ -1670,15 +1640,15 @@ static int tiocspgrp(struct tty_struct *
 		return -ENOTTY;
 	if (retval)
 		return retval;
-	if (!current->tty ||
-	    (current->tty != real_tty) ||
-	    (real_tty->session != current->session))
+	if (!current->signal->tty ||
+	    (current->signal->tty != real_tty) ||
+	    (real_tty->session != current->signal->session))
 		return -ENOTTY;
 	if (get_user(pgrp, (pid_t *) arg))
 		return -EFAULT;
 	if (pgrp < 0)
 		return -EINVAL;
-	if (session_of_pgrp(pgrp) != current->session)
+	if (session_of_pgrp(pgrp) != current->signal->session)
 		return -EPERM;
 	real_tty->pgrp = pgrp;
 	return 0;
@@ -1690,7 +1660,7 @@ static int tiocgsid(struct tty_struct *t
 	 * (tty == real_tty) is a cheap way of
 	 * testing if the tty is NOT a master pty.
 	*/
-	if (tty == real_tty && current->tty != real_tty)
+	if (tty == real_tty && current->signal->tty != real_tty)
 		return -ENOTTY;
 	if (real_tty->session <= 0)
 		return -ENOTTY;
@@ -1848,12 +1818,12 @@ int tty_ioctl(struct inode * inode, stru
 			clear_bit(TTY_EXCLUSIVE, &tty->flags);
 			return 0;
 		case TIOCNOTTY:
-			if (current->tty != tty)
+			if (current->signal->tty != tty)
 				return -ENOTTY;
-			if (current->leader)
+			if (current->signal->leader)
 				disassociate_ctty(0);
 			task_lock(current);
-			current->tty = NULL;
+			current->signal->tty = NULL;
 			task_unlock(current);
 			return 0;
 		case TIOCSCTTY:
@@ -1957,9 +1927,9 @@ static void __do_SAK(void *arg)
 		tty->driver->flush_buffer(tty);
 	read_lock(&tasklist_lock);
 	for_each_task_pid(session, PIDTYPE_SID, p, l, pid) {
-		if (p->tty == tty || session > 0) {
+		if (p->signal->tty == tty || session > 0) {
 			printk(KERN_NOTICE "SAK: killed process %d"
-			    " (%s): p->session==tty->session\n",
+			    " (%s): p->signal->session==tty->session\n",
 			    p->pid, p->comm);
 			send_sig(SIGKILL, p, 1);
 			continue;
--- diff/drivers/char/vc_screen.c	2003-09-17 12:28:05.000000000 +0100
+++ source/drivers/char/vc_screen.c	2004-04-21 10:45:34.188506056 +0100
@@ -36,6 +36,7 @@
 #include <linux/kbd_kern.h>
 #include <linux/console.h>
 #include <linux/smp_lock.h>
+#include <linux/device.h>
 #include <asm/uaccess.h>
 #include <asm/byteorder.h>
 #include <asm/unaligned.h>
@@ -469,6 +470,8 @@ static struct file_operations vcs_fops =
 	.open		= vcs_open,
 };
 
+static struct class_simple *vc_class;
+
 void vcs_make_devfs(struct tty_struct *tty)
 {
 	devfs_mk_cdev(MKDEV(VCS_MAJOR, tty->index + 1),
@@ -477,19 +480,26 @@ void vcs_make_devfs(struct tty_struct *t
 	devfs_mk_cdev(MKDEV(VCS_MAJOR, tty->index + 129),
 			S_IFCHR|S_IRUSR|S_IWUSR,
 			"vcc/a%u", tty->index + 1);
+	class_simple_device_add(vc_class, MKDEV(VCS_MAJOR, tty->index + 1), NULL, "vcs%u", tty->index + 1);
+	class_simple_device_add(vc_class, MKDEV(VCS_MAJOR, tty->index + 129), NULL, "vcsa%u", tty->index + 1);
 }
 void vcs_remove_devfs(struct tty_struct *tty)
 {
 	devfs_remove("vcc/%u", tty->index + 1);
 	devfs_remove("vcc/a%u", tty->index + 1);
+	class_simple_device_remove(MKDEV(VCS_MAJOR, tty->index + 1));
+	class_simple_device_remove(MKDEV(VCS_MAJOR, tty->index + 129));
 }
 
 int __init vcs_init(void)
 {
 	if (register_chrdev(VCS_MAJOR, "vcs", &vcs_fops))
 		panic("unable to get major %d for vcs device", VCS_MAJOR);
+	vc_class = class_simple_create(THIS_MODULE, "vc");
 
 	devfs_mk_cdev(MKDEV(VCS_MAJOR, 0), S_IFCHR|S_IRUSR|S_IWUSR, "vcc/0");
 	devfs_mk_cdev(MKDEV(VCS_MAJOR, 128), S_IFCHR|S_IRUSR|S_IWUSR, "vcc/a0");
+	class_simple_device_add(vc_class, MKDEV(VCS_MAJOR, 0), NULL, "vcs");
+	class_simple_device_add(vc_class, MKDEV(VCS_MAJOR, 128), NULL, "vcsa");
 	return 0;
 }
--- diff/drivers/char/vt.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/char/vt.c	2004-04-21 10:45:34.190505752 +0100
@@ -1183,7 +1183,7 @@ static void csi_m(int currcons)
 	update_attr(currcons);
 }
 
-static void respond_string(const char * p, struct tty_struct * tty)
+static void respond_string(const char *p, struct tty_struct *tty)
 {
 	while (*p) {
 		tty_insert_flip_char(tty, *p, 0);
@@ -1192,7 +1192,7 @@ static void respond_string(const char * 
 	con_schedule_flip(tty);
 }
 
-static void cursor_report(int currcons, struct tty_struct * tty)
+static void cursor_report(int currcons, struct tty_struct *tty)
 {
 	char buf[40];
 
@@ -1200,7 +1200,7 @@ static void cursor_report(int currcons, 
 	respond_string(buf, tty);
 }
 
-static inline void status_report(struct tty_struct * tty)
+static inline void status_report(struct tty_struct *tty)
 {
 	respond_string("\033[0n", tty);	/* Terminal ok */
 }
@@ -1210,7 +1210,7 @@ static inline void respond_ID(struct tty
 	respond_string(VT102ID, tty);
 }
 
-void mouse_report(struct tty_struct * tty, int butt, int mrx, int mry)
+void mouse_report(struct tty_struct *tty, int butt, int mrx, int mry)
 {
 	char buf[8];
 
@@ -1868,7 +1868,7 @@ char con_buf[PAGE_SIZE];
 DECLARE_MUTEX(con_buf_sem);
 
 /* acquires console_sem */
-static int do_con_write(struct tty_struct * tty, int from_user,
+static int do_con_write(struct tty_struct *tty, int from_user,
 			const unsigned char *buf, int count)
 {
 #ifdef VT_BUF_VRAM_ONLY
@@ -1894,7 +1894,7 @@ static int do_con_write(struct tty_struc
 	might_sleep();
 
 	acquire_console_sem();
-	vt = (struct vt_struct *)tty->driver_data;
+	vt = tty->driver_data;
 	if (vt == NULL) {
 		printk(KERN_ERR "vt: argh, driver_data is NULL !\n");
 		release_console_sem();
@@ -1942,7 +1942,7 @@ again:
 
 	acquire_console_sem();
 
-	vt = (struct vt_struct *)tty->driver_data;
+	vt = tty->driver_data;
 	if (vt == NULL) {
 		printk(KERN_ERR "vt: argh, driver_data _became_ NULL !\n");
 		release_console_sem();
@@ -2103,7 +2103,8 @@ static void console_callback(void *ignor
 	acquire_console_sem();
 
 	if (want_console >= 0) {
-		if (want_console != fg_console && vc_cons_allocated(want_console)) {
+		if (want_console != fg_console &&
+		    vc_cons_allocated(want_console)) {
 			hide_cursor(fg_console);
 			change_console(want_console);
 			/* we only changed when the console had already
@@ -2147,7 +2148,7 @@ struct tty_driver *console_driver;
  * The console must be locked when we get here.
  */
 
-void vt_console_print(struct console *co, const char * b, unsigned count)
+void vt_console_print(struct console *co, const char *b, unsigned count)
 {
 	int currcons = fg_console;
 	unsigned char c;
@@ -2277,7 +2278,7 @@ int tioclinux(struct tty_struct *tty, un
 
 	if (tty->driver->type != TTY_DRIVER_TYPE_CONSOLE)
 		return -EINVAL;
-	if (current->tty != tty && !capable(CAP_SYS_ADMIN))
+	if (current->signal->tty != tty && !capable(CAP_SYS_ADMIN))
 		return -EPERM;
 	if (get_user(type, (char *)arg))
 		return -EFAULT;
@@ -2352,10 +2353,10 @@ int tioclinux(struct tty_struct *tty, un
 }
 
 /*
- *	/dev/ttyN handling
+ * /dev/ttyN handling
  */
 
-static int con_write(struct tty_struct * tty, int from_user,
+static int con_write(struct tty_struct *tty, int from_user,
 		     const unsigned char *buf, int count)
 {
 	int	retval;
@@ -2370,7 +2371,7 @@ static int con_write(struct tty_struct *
 static void con_put_char(struct tty_struct *tty, unsigned char ch)
 {
 	if (in_interrupt())
-		return;		/* n_r3964 calls put_char() from interrupt context */
+		return;	/* n_r3964 calls put_char() from interrupt context */
 	pm_access(pm_con);
 	do_con_write(tty, 0, &ch, 1);
 }
@@ -2398,7 +2399,7 @@ static void con_throttle(struct tty_stru
 
 static void con_unthrottle(struct tty_struct *tty)
 {
-	struct vt_struct *vt = (struct vt_struct *) tty->driver_data;
+	struct vt_struct *vt = tty->driver_data;
 
 	wake_up_interruptible(&vt->paste_wait);
 }
@@ -2444,7 +2445,7 @@ static void con_flush_chars(struct tty_s
 	
 	/* if we race with con_close(), vt may be null */
 	acquire_console_sem();
-	vt = (struct vt_struct *)tty->driver_data;
+	vt = tty->driver_data;
 	if (vt)
 		set_cursor(vt->vc_num);
 	release_console_sem();
@@ -2453,36 +2454,42 @@ static void con_flush_chars(struct tty_s
 /*
  * Allocate the console screen memory.
  */
-static int con_open(struct tty_struct *tty, struct file * filp)
+static int con_open(struct tty_struct *tty, struct file *filp)
 {
-	unsigned int	currcons;
-	int i;
-
-	currcons = tty->index;
+	unsigned int currcons = tty->index;
+	int ret = 0;
 
 	acquire_console_sem();
-	i = vc_allocate(currcons);
-	if (i) {
-		release_console_sem();
-		return i;
+	if (tty->count == 1) {
+		ret = vc_allocate(currcons);
+		if (ret == 0) {
+			vt_cons[currcons]->vc_num = currcons;
+			tty->driver_data = vt_cons[currcons];
+			vc_cons[currcons].d->vc_tty = tty;
+
+			if (!tty->winsize.ws_row && !tty->winsize.ws_col) {
+				tty->winsize.ws_row = video_num_lines;
+				tty->winsize.ws_col = video_num_columns;
+			}
+			release_console_sem();
+			vcs_make_devfs(tty);
+			return ret;
+		}
 	}
-	vt_cons[currcons]->vc_num = currcons;
-	tty->driver_data = vt_cons[currcons];
-	vc_cons[currcons].d->vc_tty = tty;
-
 	release_console_sem();
-
-	if (!tty->winsize.ws_row && !tty->winsize.ws_col) {
-		tty->winsize.ws_row = video_num_lines;
-		tty->winsize.ws_col = video_num_columns;
-	}
-	if (tty->count == 1)
-		vcs_make_devfs(tty);
-	return 0;
+	return ret;
 }
 
+/*
+ * We take tty_sem in here to prevent another thread from coming in via init_dev
+ * and taking a ref against the tty while we're in the process of forgetting
+ * about it and cleaning things up.
+ *
+ * This is because vcs_remove_devfs() can sleep and will drop the BKL.
+ */
 static void con_close(struct tty_struct *tty, struct file *filp)
 {
+	down(&tty_sem);
 	acquire_console_sem();
 	if (tty && tty->count == 1) {
 		struct vt_struct *vt;
@@ -2493,12 +2500,19 @@ static void con_close(struct tty_struct 
 		tty->driver_data = 0;
 		release_console_sem();
 		vcs_remove_devfs(tty);
+		up(&tty_sem);
+		/*
+		 * tty_sem is released, but we still hold BKL, so there is
+		 * still exclusion against init_dev()
+		 */
 		return;
 	}
 	release_console_sem();
+	up(&tty_sem);
 }
 
-static void vc_init(unsigned int currcons, unsigned int rows, unsigned int cols, int do_clear)
+static void vc_init(unsigned int currcons, unsigned int rows,
+			unsigned int cols, int do_clear)
 {
 	int j, k ;
 
@@ -2603,6 +2617,8 @@ static struct tty_operations con_ops = {
 
 int __init vty_init(void)
 {
+	vcs_init();
+
 	console_driver = alloc_tty_driver(MAX_NR_CONSOLES);
 	if (!console_driver)
 		panic("Couldn't allocate console driver\n");
@@ -2630,7 +2646,6 @@ int __init vty_init(void)
 #ifdef CONFIG_FRAMEBUFFER_CONSOLE
 	fb_console_init();
 #endif	
-	vcs_init();
 	return 0;
 }
 
--- diff/drivers/char/vt_ioctl.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/char/vt_ioctl.c	2004-04-21 10:45:34.192505448 +0100
@@ -382,7 +382,7 @@ int vt_ioctl(struct tty_struct *tty, str
 	 * to be the owner of the tty, or have CAP_SYS_TTY_CONFIG.
 	 */
 	perm = 0;
-	if (current->tty == tty || capable(CAP_SYS_TTY_CONFIG))
+	if (current->signal->tty == tty || capable(CAP_SYS_TTY_CONFIG))
 		perm = 1;
  
 	kbd = kbd_table + console;
@@ -1221,4 +1221,3 @@ void change_console(unsigned int new_con
 
 	complete_change_console(new_console);
 }
-
--- diff/drivers/char/watchdog/cpu5wdt.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/char/watchdog/cpu5wdt.c	2004-04-21 10:45:34.196504840 +0100
@@ -37,7 +37,7 @@
 
 static int verbose = 0;
 static int port = 0x91;
-static volatile int ticks = 10000;
+static int ticks = 10000;
 
 #define PFX			"cpu5wdt: "
 
@@ -61,7 +61,6 @@ static struct {
 	struct timer_list timer;
 	volatile int queue;
 	int default_ticks;
-	int min_ticks;
 	unsigned long inuse;
 } cpu5wdt_device;
 
@@ -92,9 +91,6 @@ static void cpu5wdt_trigger(unsigned lon
 
 static void cpu5wdt_reset(void)
 {
-	if ( ticks < cpu5wdt_device.min_ticks )
-		cpu5wdt_device.min_ticks = ticks;
-
 	ticks = cpu5wdt_device.default_ticks;
 
 	if ( verbose )
@@ -137,8 +133,8 @@ static int cpu5wdt_open(struct inode *in
 {
 	if ( test_and_set_bit(0, &cpu5wdt_device.inuse) )
 		return -EBUSY;
-	return 0;
 
+	return 0;
 }
 
 static int cpu5wdt_release(struct inode *inode, struct file *file)
@@ -195,8 +191,8 @@ static ssize_t cpu5wdt_write(struct file
 		return -EIO;
 
 	cpu5wdt_reset();
-	return count;
 
+	return count;
 }
 
 static struct file_operations cpu5wdt_fops = {
@@ -242,7 +238,6 @@ static int __devinit cpu5wdt_init(void)
 
 	init_MUTEX_LOCKED(&cpu5wdt_device.stop);
 	cpu5wdt_device.queue = 0;
-	cpu5wdt_device.min_ticks = ticks;
 
 	clear_bit(0, &cpu5wdt_device.inuse);
 
--- diff/drivers/char/watchdog/machzwd.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/char/watchdog/machzwd.c	2004-04-21 10:45:34.197504688 +0100
@@ -151,7 +151,7 @@ static unsigned long next_heartbeat = 0;
 #ifndef ZF_DEBUG
 #	define dprintk(format, args...)
 #else
-#	define dprintk(format, args...) printk(KERN_DEBUG PFX; ":" __FUNCTION__ ":%d: " format, __LINE__ , ## args)
+#	define dprintk(format, args...) printk(KERN_DEBUG PFX ":%s:%d: " format, __FUNCTION__, __LINE__ , ## args)
 #endif
 
 
--- diff/drivers/cpufreq/Kconfig	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/cpufreq/Kconfig	2004-04-21 10:45:34.197504688 +0100
@@ -6,7 +6,7 @@ config CPU_FREQ_PROC_INTF
 	  CPUFreq. Please note that it is recommended to use the sysfs
 	  interface instead (which is built automatically). 
 	  
-	  For details, take a look at linux/Documentation/cpu-freq. 
+	  For details, take a look at <file:Documentation/cpu-freq/>.
 	  
 	  If in doubt, say N.
 
@@ -65,7 +65,7 @@ config CPU_FREQ_GOV_USERSPACE
           be able to set the CPU dynamically, like on LART 
 	  <http://www.lart.tudelft.nl/>
 
-	  For details, take a look at linux/Documentation/cpu-freq. 
+	  For details, take a look at <file:Documentation/cpu-freq/>.
 
 	  If in doubt, say Y.
 
@@ -79,6 +79,6 @@ config CPU_FREQ_24_API
 	  the same functionality as long as "userspace" is the
 	  selected governor for the specified CPU.
 	
-	  For details, take a look at linux/Documentation/cpu-freq. 
+	  For details, take a look at <file:Documentation/cpu-freq/>.
 
 	  If in doubt, say N.
--- diff/drivers/cpufreq/cpufreq.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/cpufreq/cpufreq.c	2004-04-21 10:45:34.198504536 +0100
@@ -504,19 +504,16 @@ static int cpufreq_resume(struct sys_dev
 	if (cpufreq_driver->setpolicy)
 		ret = cpufreq_driver->setpolicy(cpu_policy);
 	else
-	/* CPUFREQ_RELATION_H or CPUFREQ_RELATION_L have the same effect here, as cpu_policy->cur is known
-	 * to be a valid and exact target frequency
-	 */
+		/* CPUFREQ_RELATION_H or CPUFREQ_RELATION_L have the same effect here, as cpu_policy->cur is known
+		 * to be a valid and exact target frequency
+		 */
 		ret = cpufreq_driver->target(cpu_policy, cpu_policy->cur, CPUFREQ_RELATION_H);
 
-	if (ret) {
+	if (ret)
 		printk(KERN_ERR "cpufreq: resume failed in ->setpolicy/target step on CPU %u\n", cpu_policy->cpu);
-		goto out;
-	}
 
- out:
+out:
 	cpufreq_cpu_put(cpu_policy);
-
 	return ret;
 }
 
@@ -963,6 +960,7 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transit
 int cpufreq_register_driver(struct cpufreq_driver *driver_data)
 {
 	unsigned long flags;
+	int ret;
 
 	if (!driver_data || !driver_data->verify || !driver_data->init ||
 	    ((!driver_data->setpolicy) && (!driver_data->target)))
@@ -976,7 +974,28 @@ int cpufreq_register_driver(struct cpufr
 	cpufreq_driver = driver_data;
 	spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
 
-	return sysdev_driver_register(&cpu_sysdev_class,&cpufreq_sysdev_driver);
+	ret = sysdev_driver_register(&cpu_sysdev_class,&cpufreq_sysdev_driver);
+
+	if ((!ret) && !(cpufreq_driver->flags & CPUFREQ_STICKY)) {
+		int i;
+		ret = -ENODEV;
+
+		/* check for at least one working CPU */
+		for (i=0; i<NR_CPUS; i++)
+			if (cpufreq_cpu_data[i])
+				ret = 0;
+
+		/* if all ->init() calls failed, unregister */
+		if (ret) {
+			sysdev_driver_unregister(&cpu_sysdev_class, &cpufreq_sysdev_driver);
+
+			spin_lock_irqsave(&cpufreq_driver_lock, flags);
+			cpufreq_driver = NULL;
+			spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
+		}
+	}
+
+	return (ret);
 }
 EXPORT_SYMBOL_GPL(cpufreq_register_driver);
 
--- diff/drivers/firmware/edd.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/firmware/edd.c	2004-04-21 10:45:34.199504384 +0100
@@ -125,13 +125,15 @@ static struct sysfs_ops edd_attr_ops = {
 static ssize_t
 edd_show_host_bus(struct edd_device *edev, char *buf)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
+	struct edd_info *info;
 	char *p = buf;
 	int i;
 
-	if (!edev || !info || !buf) {
+	if (!edev)
+		return -EINVAL;
+	info = edd_dev_get_info(edev);
+	if (!info || !buf)
 		return -EINVAL;
-	}
 
 	for (i = 0; i < 4; i++) {
 		if (isprint(info->params.host_bus_type[i])) {
@@ -169,13 +171,15 @@ edd_show_host_bus(struct edd_device *ede
 static ssize_t
 edd_show_interface(struct edd_device *edev, char *buf)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
+	struct edd_info *info;
 	char *p = buf;
 	int i;
 
-	if (!edev || !info || !buf) {
+	if (!edev)
+		return -EINVAL;
+	info = edd_dev_get_info(edev);
+	if (!info || !buf)
 		return -EINVAL;
-	}
 
 	for (i = 0; i < 8; i++) {
 		if (isprint(info->params.interface_type[i])) {
@@ -231,11 +235,13 @@ edd_show_interface(struct edd_device *ed
 static ssize_t
 edd_show_raw_data(struct edd_device *edev, char *buf)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
+	struct edd_info *info;
 	ssize_t len = sizeof (info->params);
-	if (!edev || !info || !buf) {
+	if (!edev)
+		return -EINVAL;
+	info = edd_dev_get_info(edev);
+	if (!info || !buf)
 		return -EINVAL;
-	}
 
 	if (!(info->params.key == 0xBEDD || info->params.key == 0xDDBE))
 		len = info->params.length;
@@ -251,11 +257,13 @@ edd_show_raw_data(struct edd_device *ede
 static ssize_t
 edd_show_version(struct edd_device *edev, char *buf)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
+	struct edd_info *info;
 	char *p = buf;
-	if (!edev || !info || !buf) {
+	if (!edev)
+		return -EINVAL;
+	info = edd_dev_get_info(edev);
+	if (!info || !buf)
 		return -EINVAL;
-	}
 
 	p += scnprintf(p, left, "0x%02x\n", info->version);
 	return (p - buf);
@@ -272,11 +280,13 @@ edd_show_disk80_sig(struct edd_device *e
 static ssize_t
 edd_show_extensions(struct edd_device *edev, char *buf)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
+	struct edd_info *info;
 	char *p = buf;
-	if (!edev || !info || !buf) {
+	if (!edev)
+		return -EINVAL;
+	info = edd_dev_get_info(edev);
+	if (!info || !buf)
 		return -EINVAL;
-	}
 
 	if (info->interface_support & EDD_EXT_FIXED_DISK_ACCESS) {
 		p += scnprintf(p, left, "Fixed disk access\n");
@@ -296,11 +306,13 @@ edd_show_extensions(struct edd_device *e
 static ssize_t
 edd_show_info_flags(struct edd_device *edev, char *buf)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
+	struct edd_info *info;
 	char *p = buf;
-	if (!edev || !info || !buf) {
+	if (!edev)
+		return -EINVAL;
+	info = edd_dev_get_info(edev);
+	if (!info || !buf)
 		return -EINVAL;
-	}
 
 	if (info->params.info_flags & EDD_INFO_DMA_BOUNDARY_ERROR_TRANSPARENT)
 		p += scnprintf(p, left, "DMA boundary error transparent\n");
@@ -324,11 +336,13 @@ edd_show_info_flags(struct edd_device *e
 static ssize_t
 edd_show_legacy_cylinders(struct edd_device *edev, char *buf)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
+	struct edd_info *info;
 	char *p = buf;
-	if (!edev || !info || !buf) {
+	if (!edev)
+		return -EINVAL;
+	info = edd_dev_get_info(edev);
+	if (!info || !buf)
 		return -EINVAL;
-	}
 
 	p += snprintf(p, left, "0x%x\n", info->legacy_cylinders);
 	return (p - buf);
@@ -337,11 +351,13 @@ edd_show_legacy_cylinders(struct edd_dev
 static ssize_t
 edd_show_legacy_heads(struct edd_device *edev, char *buf)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
+	struct edd_info *info;
 	char *p = buf;
-	if (!edev || !info || !buf) {
+	if (!edev)
+		return -EINVAL;
+	info = edd_dev_get_info(edev);
+	if (!info || !buf)
 		return -EINVAL;
-	}
 
 	p += snprintf(p, left, "0x%x\n", info->legacy_heads);
 	return (p - buf);
@@ -350,11 +366,13 @@ edd_show_legacy_heads(struct edd_device 
 static ssize_t
 edd_show_legacy_sectors(struct edd_device *edev, char *buf)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
+	struct edd_info *info;
 	char *p = buf;
-	if (!edev || !info || !buf) {
+	if (!edev)
+		return -EINVAL;
+	info = edd_dev_get_info(edev);
+	if (!info || !buf)
 		return -EINVAL;
-	}
 
 	p += snprintf(p, left, "0x%x\n", info->legacy_sectors);
 	return (p - buf);
@@ -363,11 +381,13 @@ edd_show_legacy_sectors(struct edd_devic
 static ssize_t
 edd_show_default_cylinders(struct edd_device *edev, char *buf)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
+	struct edd_info *info;
 	char *p = buf;
-	if (!edev || !info || !buf) {
+	if (!edev)
+		return -EINVAL;
+	info = edd_dev_get_info(edev);
+	if (!info || !buf)
 		return -EINVAL;
-	}
 
 	p += scnprintf(p, left, "0x%x\n", info->params.num_default_cylinders);
 	return (p - buf);
@@ -376,11 +396,13 @@ edd_show_default_cylinders(struct edd_de
 static ssize_t
 edd_show_default_heads(struct edd_device *edev, char *buf)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
+	struct edd_info *info;
 	char *p = buf;
-	if (!edev || !info || !buf) {
+	if (!edev)
+		return -EINVAL;
+	info = edd_dev_get_info(edev);
+	if (!info || !buf)
 		return -EINVAL;
-	}
 
 	p += scnprintf(p, left, "0x%x\n", info->params.num_default_heads);
 	return (p - buf);
@@ -389,11 +411,13 @@ edd_show_default_heads(struct edd_device
 static ssize_t
 edd_show_default_sectors_per_track(struct edd_device *edev, char *buf)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
+	struct edd_info *info;
 	char *p = buf;
-	if (!edev || !info || !buf) {
+	if (!edev)
+		return -EINVAL;
+	info = edd_dev_get_info(edev);
+	if (!info || !buf)
 		return -EINVAL;
-	}
 
 	p += scnprintf(p, left, "0x%x\n", info->params.sectors_per_track);
 	return (p - buf);
@@ -402,11 +426,13 @@ edd_show_default_sectors_per_track(struc
 static ssize_t
 edd_show_sectors(struct edd_device *edev, char *buf)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
+	struct edd_info *info;
 	char *p = buf;
-	if (!edev || !info || !buf) {
+	if (!edev)
+		return -EINVAL;
+	info = edd_dev_get_info(edev);
+	if (!info || !buf)
 		return -EINVAL;
-	}
 
 	p += scnprintf(p, left, "0x%llx\n", info->params.number_of_sectors);
 	return (p - buf);
@@ -426,8 +452,11 @@ edd_show_sectors(struct edd_device *edev
 static int
 edd_has_legacy_cylinders(struct edd_device *edev)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
-	if (!edev || !info)
+	struct edd_info *info;
+	if (!edev)
+		return -EINVAL;
+	info = edd_dev_get_info(edev);
+	if (!info)
 		return -EINVAL;
 	return info->legacy_cylinders > 0;
 }
@@ -435,8 +464,11 @@ edd_has_legacy_cylinders(struct edd_devi
 static int
 edd_has_legacy_heads(struct edd_device *edev)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
-	if (!edev || !info)
+	struct edd_info *info;
+	if (!edev)
+		return -EINVAL;
+	info = edd_dev_get_info(edev);
+	if (!info)
 		return -EINVAL;
 	return info->legacy_heads > 0;
 }
@@ -444,8 +476,11 @@ edd_has_legacy_heads(struct edd_device *
 static int
 edd_has_legacy_sectors(struct edd_device *edev)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
-	if (!edev || !info)
+	struct edd_info *info;
+	if (!edev)
+		return -EINVAL;
+	info = edd_dev_get_info(edev);
+	if (!info)
 		return -EINVAL;
 	return info->legacy_sectors > 0;
 }
@@ -453,8 +488,11 @@ edd_has_legacy_sectors(struct edd_device
 static int
 edd_has_default_cylinders(struct edd_device *edev)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
-	if (!edev || !info)
+	struct edd_info *info;
+	if (!edev)
+		return -EINVAL;
+	info = edd_dev_get_info(edev);
+	if (!info)
 		return -EINVAL;
 	return info->params.num_default_cylinders > 0;
 }
@@ -462,8 +500,11 @@ edd_has_default_cylinders(struct edd_dev
 static int
 edd_has_default_heads(struct edd_device *edev)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
-	if (!edev || !info)
+	struct edd_info *info;
+	if (!edev)
+		return -EINVAL;
+	info = edd_dev_get_info(edev);
+	if (!info)
 		return -EINVAL;
 	return info->params.num_default_heads > 0;
 }
@@ -471,8 +512,11 @@ edd_has_default_heads(struct edd_device 
 static int
 edd_has_default_sectors_per_track(struct edd_device *edev)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
-	if (!edev || !info)
+	struct edd_info *info;
+	if (!edev)
+		return -EINVAL;
+	info = edd_dev_get_info(edev);
+	if (!info)
 		return -EINVAL;
 	return info->params.sectors_per_track > 0;
 }
@@ -480,11 +524,14 @@ edd_has_default_sectors_per_track(struct
 static int
 edd_has_edd30(struct edd_device *edev)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
+	struct edd_info *info;
 	int i, nonzero_path = 0;
 	char c;
 
-	if (!edev || !info)
+	if (!edev)
+		return 0;
+	info = edd_dev_get_info(edev);
+	if (!info)
 		return 0;
 
 	if (!(info->params.key == 0xBEDD || info->params.key == 0xDDBE)) {
@@ -508,8 +555,11 @@ edd_has_edd30(struct edd_device *edev)
 static int
 edd_has_disk80_sig(struct edd_device *edev)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
-	if (!edev || !info)
+	struct edd_info *info;
+	if (!edev)
+		return 0;
+	info = edd_dev_get_info(edev);
+	if (!info)
 		return 0;
 	return info->device == 0x80;
 }
@@ -597,9 +647,12 @@ static decl_subsys(edd,&ktype_edd,NULL);
 static int
 edd_dev_is_type(struct edd_device *edev, const char *type)
 {
-	struct edd_info *info = edd_dev_get_info(edev);
+	struct edd_info *info;
+	if (!edev)
+		return 0;
+	info = edd_dev_get_info(edev);
 
-	if (edev && type && info) {
+	if (type && info) {
 		if (!strncmp(info->params.host_bus_type, type, strlen(type)) ||
 		    !strncmp(info->params.interface_type, type, strlen(type)))
 			return 1;
--- diff/drivers/i2c/busses/Kconfig	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/busses/Kconfig	2004-04-21 10:45:34.200504232 +0100
@@ -17,6 +17,18 @@ config I2C_ALI1535
 	  This driver can also be built as a module.  If so, the module
 	  will be called i2c-ali1535.
 
+config I2C_ALI1563
+	tristate "ALI 1563"
+	depends on I2C && PCI && EXPERIMENTAL
+	help
+	  If you say yes to this option, support will be included for the SMB
+	  Host controller on Acer Labs Inc. (ALI) M1563 South Bridges.  The SMB
+	  controller is part of the 7101 device, which is an ACPI-compliant
+	  Power Management Unit (PMU).
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called i2c-ali1563.
+
 config I2C_ALI15X3
 	tristate "ALI 15x3"
 	depends on I2C && PCI && EXPERIMENTAL
--- diff/drivers/i2c/busses/Makefile	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/busses/Makefile	2004-04-21 10:45:34.200504232 +0100
@@ -3,6 +3,7 @@
 #
 
 obj-$(CONFIG_I2C_ALI1535)	+= i2c-ali1535.o
+obj-$(CONFIG_I2C_ALI1563)	+= i2c-ali1563.o
 obj-$(CONFIG_I2C_ALI15X3)	+= i2c-ali15x3.o
 obj-$(CONFIG_I2C_AMD756)	+= i2c-amd756.o
 obj-$(CONFIG_I2C_AMD8111)	+= i2c-amd8111.o
--- diff/drivers/i2c/chips/Kconfig	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/chips/Kconfig	2004-04-21 10:45:34.201504080 +0100
@@ -209,4 +209,25 @@ config SENSORS_EEPROM
 	  This driver can also be built as a module.  If so, the module
 	  will be called eeprom.
 
+config SENSORS_PCF8574
+	tristate "Philips PCF8574 and PCF8574A"
+	depends on I2C && EXPERIMENTAL
+	select I2C_SENSOR
+	help
+	  If you say yes here you get support for Philips PCF8574 and 
+	  PCF8574A chips.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called pcf8574.
+
+config SENSORS_PCF8591
+	tristate "Philips PCF8591"
+	depends on I2C && EXPERIMENTAL
+	select I2C_SENSOR
+	help
+	  If you say yes here you get support for Philips PCF8591 chips.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called pcf8591.
+
 endmenu
--- diff/drivers/i2c/chips/Makefile	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/chips/Makefile	2004-04-21 10:45:34.201504080 +0100
@@ -19,6 +19,8 @@ obj-$(CONFIG_SENSORS_LM80)	+= lm80.o
 obj-$(CONFIG_SENSORS_LM83)	+= lm83.o
 obj-$(CONFIG_SENSORS_LM85)	+= lm85.o
 obj-$(CONFIG_SENSORS_LM90)	+= lm90.o
+obj-$(CONFIG_SENSORS_PCF8574)	+= pcf8574.o
+obj-$(CONFIG_SENSORS_PCF8591)	+= pcf8591.o
 obj-$(CONFIG_SENSORS_VIA686A)	+= via686a.o
 obj-$(CONFIG_SENSORS_W83L785TS)	+= w83l785ts.o
 
--- diff/drivers/i2c/chips/adm1021.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/chips/adm1021.c	2004-04-21 10:45:34.202503928 +0100
@@ -98,13 +98,10 @@ SENSORS_INSMOD_8(adm1021, adm1023, max16
 they don't quite work like a thermostat the way the LM75 does.  I.e., 
 a lower temp than THYST actually triggers an alarm instead of 
 clearing it.  Weird, ey?   --Phil  */
-#define adm1021_INIT_TOS		60
-#define adm1021_INIT_THYST		20
-#define adm1021_INIT_REMOTE_TOS		60
-#define adm1021_INIT_REMOTE_THYST	20
 
 /* Each client has this additional data */
 struct adm1021_data {
+	struct i2c_client client;
 	enum chips type;
 
 	struct semaphore update_lock;
@@ -151,9 +148,6 @@ static struct i2c_driver adm1021_driver 
 	.detach_client	= adm1021_detach_client,
 };
 
-/* I choose here for semi-static allocation. Complete dynamic
-   allocation could also be used; the code needed for this would probably
-   take more memory than the datastructure takes now. */
 static int adm1021_id = 0;
 
 #define show(value)	\
@@ -235,16 +229,13 @@ static int adm1021_detect(struct i2c_ada
 	   client structure, even though we cannot fill it completely yet.
 	   But it allows us to access adm1021_{read,write}_value. */
 
-	if (!(new_client = kmalloc(sizeof(struct i2c_client) +
-				   sizeof(struct adm1021_data),
-				   GFP_KERNEL))) {
+	if (!(data = kmalloc(sizeof(struct adm1021_data), GFP_KERNEL))) {
 		err = -ENOMEM;
 		goto error0;
 	}
-	memset(new_client, 0x00, sizeof(struct i2c_client) +
-				 sizeof(struct adm1021_data));
+	memset(data, 0, sizeof(struct adm1021_data));
 
-	data = (struct adm1021_data *) (new_client + 1);
+	new_client = &data->client;
 	i2c_set_clientdata(new_client, data);
 	new_client->addr = address;
 	new_client->adapter = adapter;
@@ -253,8 +244,12 @@ static int adm1021_detect(struct i2c_ada
 
 	/* Now, we do the remaining detection. */
 	if (kind < 0) {
-		if ((adm1021_read_value(new_client, ADM1021_REG_STATUS) & 0x03) != 0x00)
+		if ((adm1021_read_value(new_client, ADM1021_REG_STATUS) & 0x03) != 0x00
+		 || (adm1021_read_value(new_client, ADM1021_REG_CONFIG_R) & 0x3F) != 0x00
+		 || (adm1021_read_value(new_client, ADM1021_REG_CONV_RATE_R) & 0xF8) != 0x00) {
+			err = -ENODEV;
 			goto error1;
+		}
 	}
 
 	/* Determine the chip type. */
@@ -272,11 +267,14 @@ static int adm1021_detect(struct i2c_ada
 		else if ((i == 0x4d) &&
 			 (adm1021_read_value(new_client, ADM1021_REG_DEV_ID) == 0x01))
 			kind = max1617a;
-		/* LM84 Mfr ID in a different place */
-		else if (adm1021_read_value(new_client, ADM1021_REG_CONV_RATE_R) == 0x00)
-			kind = lm84;
 		else if (i == 0x54)
 			kind = mc1066;
+		/* LM84 Mfr ID in a different place, and it has more unused bits */
+		else if (adm1021_read_value(new_client, ADM1021_REG_CONV_RATE_R) == 0x00
+		      && (kind == 0 /* skip extra detection */
+		       || ((adm1021_read_value(new_client, ADM1021_REG_CONFIG_R) & 0x7F) == 0x00
+			&& (adm1021_read_value(new_client, ADM1021_REG_STATUS) & 0xAB) == 0x00)))
+			kind = lm84;
 		else
 			kind = max1617;
 	}
@@ -309,10 +307,11 @@ static int adm1021_detect(struct i2c_ada
 
 	/* Tell the I2C layer a new client has arrived */
 	if ((err = i2c_attach_client(new_client)))
-		goto error3;
+		goto error1;
 
 	/* Initialize the ADM1021 chip */
-	adm1021_init_client(new_client);
+	if (kind != lm84)
+		adm1021_init_client(new_client);
 
 	/* Register sysfs hooks */
 	device_create_file(&new_client->dev, &dev_attr_temp1_max);
@@ -327,26 +326,17 @@ static int adm1021_detect(struct i2c_ada
 
 	return 0;
 
-error3:
 error1:
-	kfree(new_client);
+	kfree(data);
 error0:
 	return err;
 }
 
 static void adm1021_init_client(struct i2c_client *client)
 {
-	/* Initialize the adm1021 chip */
-	adm1021_write_value(client, ADM1021_REG_TOS_W,
-			    adm1021_INIT_TOS);
-	adm1021_write_value(client, ADM1021_REG_THYST_W,
-			    adm1021_INIT_THYST);
-	adm1021_write_value(client, ADM1021_REG_REMOTE_TOS_W,
-			    adm1021_INIT_REMOTE_TOS);
-	adm1021_write_value(client, ADM1021_REG_REMOTE_THYST_W,
-			    adm1021_INIT_REMOTE_THYST);
 	/* Enable ADC and disable suspend mode */
-	adm1021_write_value(client, ADM1021_REG_CONFIG_W, 0);
+	adm1021_write_value(client, ADM1021_REG_CONFIG_W,
+		adm1021_read_value(client, ADM1021_REG_CONFIG_R) & 0xBF);
 	/* Set Conversion rate to 1/sec (this can be tinkered with) */
 	adm1021_write_value(client, ADM1021_REG_CONV_RATE_W, 0x04);
 }
@@ -360,7 +350,7 @@ static int adm1021_detach_client(struct 
 		return err;
 	}
 
-	kfree(client);
+	kfree(i2c_get_clientdata(client));
 	return 0;
 }
 
--- diff/drivers/i2c/chips/asb100.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/chips/asb100.c	2004-04-21 10:45:34.203503776 +0100
@@ -124,7 +124,7 @@ static const u16 asb100_reg_temp_hyst[]	
 static u8 IN_TO_REG(unsigned val)
 {
 	unsigned nval = SENSORS_LIMIT(val, ASB100_IN_MIN, ASB100_IN_MAX);
-	return nval / 16;
+	return (nval + 8) / 16;
 }
 
 static unsigned IN_FROM_REG(u8 reg)
@@ -193,6 +193,7 @@ static u8 DIV_TO_REG(long val)
    data is pointed to by client->data. The structure itself is
    dynamically allocated, at the same time the client itself is allocated. */
 struct asb100_data {
+	struct i2c_client client;
 	struct semaphore lock;
 	enum chips type;
 
@@ -467,7 +468,7 @@ static ssize_t set_##reg(struct device *
 		data->reg[nr] = TEMP_TO_REG(val); \
 		break; \
 	} \
-	asb100_write_value(client, ASB100_REG_TEMP_##REG(nr), \
+	asb100_write_value(client, ASB100_REG_TEMP_##REG(nr+1), \
 			data->reg[nr]); \
 	return count; \
 }
@@ -722,17 +723,14 @@ static int asb100_detect(struct i2c_adap
 	   client structure, even though we cannot fill it completely yet.
 	   But it allows us to access asb100_{read,write}_value. */
 
-	if (!(new_client = kmalloc(sizeof(struct i2c_client) +
-			sizeof(struct asb100_data), GFP_KERNEL))) {
+	if (!(data = kmalloc(sizeof(struct asb100_data), GFP_KERNEL))) {
 		pr_debug("asb100.o: detect failed, kmalloc failed!\n");
 		err = -ENOMEM;
 		goto ERROR0;
 	}
+	memset(data, 0, sizeof(struct asb100_data));
 
-	memset(new_client, 0,
-		sizeof(struct i2c_client) + sizeof(struct asb100_data));
-
-	data = (struct asb100_data *) (new_client + 1);
+	new_client = &data->client;
 	init_MUTEX(&data->lock);
 	i2c_set_clientdata(new_client, data);
 	new_client->addr = address;
@@ -807,6 +805,11 @@ static int asb100_detect(struct i2c_adap
 	/* Initialize the chip */
 	asb100_init_client(new_client);
 
+	/* A few vars need to be filled upon startup */
+	data->fan_min[0] = asb100_read_value(new_client, ASB100_REG_FAN_MIN(0));
+	data->fan_min[1] = asb100_read_value(new_client, ASB100_REG_FAN_MIN(1));
+	data->fan_min[2] = asb100_read_value(new_client, ASB100_REG_FAN_MIN(2));
+
 	/* Register sysfs hooks */
 	device_create_file_in(new_client, 0);
 	device_create_file_in(new_client, 1);
@@ -837,7 +840,7 @@ static int asb100_detect(struct i2c_adap
 ERROR2:
 	i2c_detach_client(new_client);
 ERROR1:
-	kfree(new_client);
+	kfree(data);
 ERROR0:
 	return err;
 }
@@ -852,16 +855,11 @@ static int asb100_detach_client(struct i
 		return err;
 	}
 
-	kfree(client);
+	kfree(i2c_get_clientdata(client));
 
 	return 0;
 }
 
-static u16 swap_bytes(u16 val)
-{
-	return (val >> 8) | (val << 8);
-}
-
 /* The SMBus locks itself, usually, but nothing may access the chip between
    bank switches. */
 static int asb100_read_value(struct i2c_client *client, u16 reg)
@@ -886,17 +884,17 @@ static int asb100_read_value(struct i2c_
 		/* convert from ISA to LM75 I2C addresses */
 		switch (reg & 0xff) {
 		case 0x50: /* TEMP */
-			res = swap_bytes(i2c_smbus_read_word_data (cl, 0));
+			res = swab16(i2c_smbus_read_word_data (cl, 0));
 			break;
 		case 0x52: /* CONFIG */
 			res = i2c_smbus_read_byte_data(cl, 1);
 			break;
 		case 0x53: /* HYST */
-			res = swap_bytes(i2c_smbus_read_word_data (cl, 2));
+			res = swab16(i2c_smbus_read_word_data (cl, 2));
 			break;
 		case 0x55: /* MAX */
 		default:
-			res = swap_bytes(i2c_smbus_read_word_data (cl, 3));
+			res = swab16(i2c_smbus_read_word_data (cl, 3));
 			break;
 		}
 	}
@@ -934,10 +932,10 @@ static void asb100_write_value(struct i2
 			i2c_smbus_write_byte_data(cl, 1, value & 0xff);
 			break;
 		case 0x53: /* HYST */
-			i2c_smbus_write_word_data(cl, 2, swap_bytes(value));
+			i2c_smbus_write_word_data(cl, 2, swab16(value));
 			break;
 		case 0x55: /* MAX */
-			i2c_smbus_write_word_data(cl, 3, swap_bytes(value));
+			i2c_smbus_write_word_data(cl, 3, swab16(value));
 			break;
 		}
 	}
--- diff/drivers/i2c/chips/ds1621.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/chips/ds1621.c	2004-04-21 10:45:34.203503776 +0100
@@ -70,6 +70,7 @@ MODULE_PARM_DESC(polarity, "Output's pol
 
 /* Each client has this additional data */
 struct ds1621_data {
+	struct i2c_client client;
 	struct semaphore update_lock;
 	char valid;			/* !=0 if following fields are valid */
 	unsigned long last_updated;	/* In jiffies */
@@ -97,11 +98,6 @@ static struct i2c_driver ds1621_driver =
 
 static int ds1621_id = 0;
 
-static u16 swap_bytes(u16 val)
-{
-	return (val >> 8) | (val << 8);
-}
-
 /* All registers are word-sized, except for the configuration register.
    DS1621 uses a high-byte first convention, which is exactly opposite to
    the usual practice. */
@@ -110,7 +106,7 @@ static int ds1621_read_value(struct i2c_
 	if (reg == DS1621_REG_CONF)
 		return i2c_smbus_read_byte_data(client, reg);
 	else
-		return swap_bytes(i2c_smbus_read_word_data(client, reg));
+		return swab16(i2c_smbus_read_word_data(client, reg));
 }
 
 /* All registers are word-sized, except for the configuration register.
@@ -121,8 +117,7 @@ static int ds1621_write_value(struct i2c
 	if (reg == DS1621_REG_CONF)
 		return i2c_smbus_write_byte_data(client, reg, value);
 	else
-		return i2c_smbus_write_word_data(client, reg,
-						 swap_bytes(value));
+		return i2c_smbus_write_word_data(client, reg, swab16(value));
 }
 
 static void ds1621_init_client(struct i2c_client *client)
@@ -202,16 +197,13 @@ int ds1621_detect(struct i2c_adapter *ad
 	/* OK. For now, we presume we have a valid client. We now create the
 	   client structure, even though we cannot fill it completely yet.
 	   But it allows us to access ds1621_{read,write}_value. */
-	if (!(new_client = kmalloc(sizeof(struct i2c_client) +
-				   sizeof(struct ds1621_data),
-				   GFP_KERNEL))) {
+	if (!(data = kmalloc(sizeof(struct ds1621_data), GFP_KERNEL))) {
 		err = -ENOMEM;
 		goto exit;
 	}
-	memset(new_client, 0, sizeof(struct i2c_client) +
-	       sizeof(struct ds1621_data));
+	memset(data, 0, sizeof(struct ds1621_data));
 	
-	data = (struct ds1621_data *) (new_client + 1);
+	new_client = &data->client;
 	i2c_set_clientdata(new_client, data);
 	new_client->addr = address;
 	new_client->adapter = adapter;
@@ -264,7 +256,7 @@ int ds1621_detect(struct i2c_adapter *ad
 /* OK, this is not exactly good programming practice, usually. But it is
    very code-efficient in this case. */
       exit_free:
-	kfree(new_client);
+	kfree(data);
       exit:
 	return err;
 }
@@ -274,12 +266,12 @@ static int ds1621_detach_client(struct i
 	int err;
 
 	if ((err = i2c_detach_client(client))) {
-		dev_err(&client->dev,
-		        "ds1621.o: Client deregistration failed, client not detached.\n");
+		dev_err(&client->dev, "Client deregistration failed, "
+			"client not detached.\n");
 		return err;
 	}
 
-	kfree(client);
+	kfree(i2c_get_clientdata(client));
 
 	return 0;
 }
--- diff/drivers/i2c/chips/eeprom.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/chips/eeprom.c	2004-04-21 10:45:34.204503624 +0100
@@ -63,6 +63,7 @@ enum eeprom_nature {
 
 /* Each client has this additional data */
 struct eeprom_data {
+	struct i2c_client client;
 	struct semaphore update_lock;
 	u8 valid;			/* bitfield, bit!=0 if slice is valid */
 	unsigned long last_updated[8];	/* In jiffies, 8 slices */
@@ -187,17 +188,14 @@ int eeprom_detect(struct i2c_adapter *ad
 	/* OK. For now, we presume we have a valid client. We now create the
 	   client structure, even though we cannot fill it completely yet.
 	   But it allows us to access eeprom_{read,write}_value. */
-	if (!(new_client = kmalloc(sizeof(struct i2c_client) +
-				   sizeof(struct eeprom_data),
-				   GFP_KERNEL))) {
+	if (!(data = kmalloc(sizeof(struct eeprom_data), GFP_KERNEL))) {
 		err = -ENOMEM;
 		goto exit;
 	}
-	memset(new_client, 0x00, sizeof(struct i2c_client) +
-				 sizeof(struct eeprom_data));
+	memset(data, 0, sizeof(struct eeprom_data));
 
-	data = (struct eeprom_data *) (new_client + 1);
-	memset(data, 0xff, EEPROM_SIZE);
+	new_client = &data->client;
+	memset(data->data, 0xff, EEPROM_SIZE);
 	i2c_set_clientdata(new_client, data);
 	new_client->addr = address;
 	new_client->adapter = adapter;
@@ -244,7 +242,7 @@ int eeprom_detect(struct i2c_adapter *ad
 	return 0;
 
 exit_kfree:
-	kfree(new_client);
+	kfree(data);
 exit:
 	return err;
 }
@@ -259,7 +257,7 @@ static int eeprom_detach_client(struct i
 		return err;
 	}
 
-	kfree(client);
+	kfree(i2c_get_clientdata(client));
 
 	return 0;
 }
--- diff/drivers/i2c/chips/fscher.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/chips/fscher.c	2004-04-21 10:45:34.204503624 +0100
@@ -133,6 +133,7 @@ static struct i2c_driver fscher_driver =
  */
 
 struct fscher_data {
+	struct i2c_client client;
 	struct semaphore update_lock;
 	char valid; /* zero until following fields are valid */
 	unsigned long last_updated; /* in jiffies */
@@ -309,17 +310,15 @@ static int fscher_detect(struct i2c_adap
 	/* OK. For now, we presume we have a valid client. We now create the
 	 * client structure, even though we cannot fill it completely yet.
 	 * But it allows us to access i2c_smbus_read_byte_data. */
-	if (!(new_client = kmalloc(sizeof(struct i2c_client) +
-	    sizeof(struct fscher_data), GFP_KERNEL))) {
+	if (!(data = kmalloc(sizeof(struct fscher_data), GFP_KERNEL))) {
 		err = -ENOMEM;
 		goto exit;
   	}
-	memset(new_client, 0x00, sizeof(struct i2c_client) +
-	       sizeof(struct fscher_data));
+	memset(data, 0, sizeof(struct fscher_data));
 
-	/* The Hermes-specific data is placed right after the common I2C
-	 * client data. */
-	data = (struct fscher_data *) (new_client + 1);
+	/* The common I2C client data is placed right before the
+	 * Hermes-specific data. */
+	new_client = &data->client;
 	i2c_set_clientdata(new_client, data);
 	new_client->addr = address;
 	new_client->adapter = adapter;
@@ -371,7 +370,7 @@ static int fscher_detect(struct i2c_adap
 	return 0;
 
 exit_free:
-	kfree(new_client);
+	kfree(data);
 exit:
 	return err;
 }
@@ -386,7 +385,7 @@ static int fscher_detach_client(struct i
 		return err;
 	}
 
-	kfree(client);
+	kfree(i2c_get_clientdata(client));
 	return 0;
 }
 
@@ -513,7 +512,7 @@ static ssize_t set_fan_div(struct i2c_cl
 	default:
 		dev_err(&client->dev, "fan_div value %ld not "
 			 "supported. Choose one of 2, 4 or 8!\n", v);
-		return -1;
+		return -EINVAL;
 	}
 
 	/* bits 2..7 reserved => mask with 0x03 */
--- diff/drivers/i2c/chips/gl518sm.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/chips/gl518sm.c	2004-04-21 10:45:34.205503472 +0100
@@ -118,6 +118,7 @@ static inline u8 FAN_TO_REG(long rpm, in
 
 /* Each client has this additional data */
 struct gl518_data {
+	struct i2c_client client;
 	enum chips type;
 
 	struct semaphore update_lock;
@@ -354,16 +355,13 @@ static int gl518_detect(struct i2c_adapt
 	   client structure, even though we cannot fill it completely yet.
 	   But it allows us to access gl518_{read,write}_value. */
 
-	if (!(new_client = kmalloc(sizeof(struct i2c_client) +
-				   sizeof(struct gl518_data),
-				   GFP_KERNEL))) {
+	if (!(data = kmalloc(sizeof(struct gl518_data), GFP_KERNEL))) {
 		err = -ENOMEM;
 		goto exit;
 	}
-	memset(new_client, 0x00, sizeof(struct i2c_client) +
-		sizeof(struct gl518_data));
+	memset(data, 0, sizeof(struct gl518_data));
 
-	data = (struct gl518_data *) (new_client + 1);
+	new_client = &data->client;
 	i2c_set_clientdata(new_client, data);
 
 	new_client->addr = address;
@@ -445,7 +443,7 @@ static int gl518_detect(struct i2c_adapt
    very code-efficient in this case. */
 
 exit_free:
-	kfree(new_client);
+	kfree(data);
 exit:
 	return err;
 }
@@ -479,23 +477,18 @@ static int gl518_detach_client(struct i2
 		return err;
 	}
 
-	kfree(client);
+	kfree(i2c_get_clientdata(client));
 
 	return 0;
 }
 
-static inline u16 swap_bytes(u16 val)
-{
-	return (val >> 8) | (val << 8);
-}
-
 /* Registers 0x07 to 0x0c are word-sized, others are byte-sized 
    GL518 uses a high-byte first convention, which is exactly opposite to
    the usual practice. */
 static int gl518_read_value(struct i2c_client *client, u8 reg)
 {
 	if ((reg >= 0x07) && (reg <= 0x0c))
-		return swap_bytes(i2c_smbus_read_word_data(client, reg));
+		return swab16(i2c_smbus_read_word_data(client, reg));
 	else
 		return i2c_smbus_read_byte_data(client, reg);
 }
@@ -506,8 +499,7 @@ static int gl518_read_value(struct i2c_c
 static int gl518_write_value(struct i2c_client *client, u8 reg, u16 value)
 {
 	if ((reg >= 0x07) && (reg <= 0x0c))
-		return i2c_smbus_write_word_data(client, reg,
-						 swap_bytes(value));
+		return i2c_smbus_write_word_data(client, reg, swab16(value));
 	else
 		return i2c_smbus_write_byte_data(client, reg, value);
 }
--- diff/drivers/i2c/chips/it87.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/chips/it87.c	2004-04-21 10:45:34.206503320 +0100
@@ -134,6 +134,7 @@ static int DIV_TO_REG(int val)
    dynamically allocated, at the same time when a new it87 client is
    allocated. */
 struct it87_data {
+	struct i2c_client client;
 	struct semaphore lock;
 	enum chips type;
 
@@ -366,7 +367,7 @@ static ssize_t set_sensor(struct device 
 	else if (val == 2)
 	    data->sensor |= 8 << nr;
 	else if (val != 0)
-		return -1;
+		return -EINVAL;
 	it87_write_value(client, IT87_REG_TEMP_ENABLE, data->sensor);
 	return count;
 }
@@ -508,7 +509,7 @@ static int it87_attach_adapter(struct i2
 int it87_detect(struct i2c_adapter *adapter, int address, int kind)
 {
 	int i;
-	struct i2c_client *new_client = NULL;
+	struct i2c_client *new_client;
 	struct it87_data *data;
 	int err = 0;
 	const char *name = "";
@@ -532,12 +533,12 @@ int it87_detect(struct i2c_adapter *adap
 			/* We need the timeouts for at least some IT87-like chips. But only
 			   if we read 'undefined' registers. */
 			i = inb_p(address + 1);
-			if (inb_p(address + 2) != i)
-				goto ERROR1;
-			if (inb_p(address + 3) != i)
-				goto ERROR1;
-			if (inb_p(address + 7) != i)
+			if (inb_p(address + 2) != i
+			 || inb_p(address + 3) != i
+			 || inb_p(address + 7) != i) {
+		 		err = -ENODEV;
 				goto ERROR1;
+			}
 #undef REALLY_SLOW_IO
 
 			/* Let's just hope nothing breaks here */
@@ -545,7 +546,8 @@ int it87_detect(struct i2c_adapter *adap
 			outb_p(~i & 0x7f, address + 5);
 			if ((inb_p(address + 5) & 0x7f) != (~i & 0x7f)) {
 				outb_p(i, address + 5);
-				return 0;
+				err = -ENODEV;
+				goto ERROR1;
 			}
 		}
 	}
@@ -554,16 +556,13 @@ int it87_detect(struct i2c_adapter *adap
 	   client structure, even though we cannot fill it completely yet.
 	   But it allows us to access it87_{read,write}_value. */
 
-	if (!(new_client = kmalloc((sizeof(struct i2c_client)) +
-					sizeof(struct it87_data),
-					GFP_KERNEL))) {
+	if (!(data = kmalloc(sizeof(struct it87_data), GFP_KERNEL))) {
 		err = -ENOMEM;
 		goto ERROR1;
 	}
-	memset(new_client, 0x00, sizeof(struct i2c_client) +
-				 sizeof(struct it87_data));
+	memset(data, 0, sizeof(struct it87_data));
 
-	data = (struct it87_data *) (new_client + 1);
+	new_client = &data->client;
 	if (is_isa)
 		init_MUTEX(&data->lock);
 	i2c_set_clientdata(new_client, data);
@@ -575,11 +574,12 @@ int it87_detect(struct i2c_adapter *adap
 	/* Now, we do the remaining detection. */
 
 	if (kind < 0) {
-		if (it87_read_value(new_client, IT87_REG_CONFIG) & 0x80)
-			goto ERROR1;
-		if (!is_isa
-			&& (it87_read_value(new_client, IT87_REG_I2C_ADDR) !=
-			address)) goto ERROR1;
+		if ((it87_read_value(new_client, IT87_REG_CONFIG) & 0x80)
+		  || (!is_isa
+		   && it87_read_value(new_client, IT87_REG_I2C_ADDR) != address)) {
+		   	err = -ENODEV;
+			goto ERROR2;
+		}
 	}
 
 	/* Determine the chip type. */
@@ -594,7 +594,8 @@ int it87_detect(struct i2c_adapter *adap
 					"Ignoring 'force' parameter for unknown chip at "
 					"adapter %d, address 0x%02x\n",
 					i2c_adapter_id(adapter), address);
-			goto ERROR1;
+			err = -ENODEV;
+			goto ERROR2;
 		}
 	}
 
@@ -613,7 +614,7 @@ int it87_detect(struct i2c_adapter *adap
 
 	/* Tell the I2C layer a new client has arrived */
 	if ((err = i2c_attach_client(new_client)))
-		goto ERROR1;
+		goto ERROR2;
 
 	/* Initialize the IT87 chip */
 	it87_init_client(new_client, data);
@@ -669,9 +670,9 @@ int it87_detect(struct i2c_adapter *adap
 
 	return 0;
 
+ERROR2:
+	kfree(data);
 ERROR1:
-	kfree(new_client);
-
 	if (is_isa)
 		release_region(address, IT87_EXTENT);
 ERROR0:
@@ -690,7 +691,7 @@ static int it87_detach_client(struct i2c
 
 	if(i2c_is_isa_client(client))
 		release_region(client->addr, IT87_EXTENT);
-	kfree(client);
+	kfree(i2c_get_clientdata(client));
 
 	return 0;
 }
--- diff/drivers/i2c/chips/lm75.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/chips/lm75.c	2004-04-21 10:45:34.206503320 +0100
@@ -46,6 +46,7 @@ SENSORS_INSMOD_1(lm75);
 
 /* Each client has this additional data */
 struct lm75_data {
+	struct i2c_client	client;
 	struct semaphore	update_lock;
 	char			valid;		/* !=0 if following fields are valid */
 	unsigned long		last_updated;	/* In jiffies */
@@ -135,16 +136,13 @@ static int lm75_detect(struct i2c_adapte
 	/* OK. For now, we presume we have a valid client. We now create the
 	   client structure, even though we cannot fill it completely yet.
 	   But it allows us to access lm75_{read,write}_value. */
-	if (!(new_client = kmalloc(sizeof(struct i2c_client) +
-				   sizeof(struct lm75_data),
-				   GFP_KERNEL))) {
+	if (!(data = kmalloc(sizeof(struct lm75_data), GFP_KERNEL))) {
 		err = -ENOMEM;
 		goto exit;
 	}
-	memset(new_client, 0x00, sizeof(struct i2c_client) +
-				 sizeof(struct lm75_data));
+	memset(data, 0, sizeof(struct lm75_data));
 
-	data = (struct lm75_data *) (new_client + 1);
+	new_client = &data->client;
 	i2c_set_clientdata(new_client, data);
 	new_client->addr = address;
 	new_client->adapter = adapter;
@@ -194,7 +192,7 @@ static int lm75_detect(struct i2c_adapte
 	return 0;
 
 exit_free:
-	kfree(new_client);
+	kfree(data);
 exit:
 	return err;
 }
@@ -202,15 +200,10 @@ exit:
 static int lm75_detach_client(struct i2c_client *client)
 {
 	i2c_detach_client(client);
-	kfree(client);
+	kfree(i2c_get_clientdata(client));
 	return 0;
 }
 
-static u16 swap_bytes(u16 val)
-{
-	return (val >> 8) | (val << 8);
-}
-
 /* All registers are word-sized, except for the configuration register.
    LM75 uses a high-byte first convention, which is exactly opposite to
    the usual practice. */
@@ -219,7 +212,7 @@ static int lm75_read_value(struct i2c_cl
 	if (reg == LM75_REG_CONF)
 		return i2c_smbus_read_byte_data(client, reg);
 	else
-		return swap_bytes(i2c_smbus_read_word_data(client, reg));
+		return swab16(i2c_smbus_read_word_data(client, reg));
 }
 
 /* All registers are word-sized, except for the configuration register.
@@ -230,8 +223,7 @@ static int lm75_write_value(struct i2c_c
 	if (reg == LM75_REG_CONF)
 		return i2c_smbus_write_byte_data(client, reg, value);
 	else
-		return i2c_smbus_write_word_data(client, reg,
-						 swap_bytes(value));
+		return i2c_smbus_write_word_data(client, reg, swab16(value));
 }
 
 static void lm75_init_client(struct i2c_client *client)
--- diff/drivers/i2c/chips/lm78.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/chips/lm78.c	2004-04-21 10:45:34.207503168 +0100
@@ -192,6 +192,7 @@ static inline u8 DIV_TO_REG(int val)
    dynamically allocated, at the same time when a new lm78 client is
    allocated. */
 struct lm78_data {
+	struct i2c_client client;
 	struct semaphore lock;
 	enum chips type;
 
@@ -552,16 +553,13 @@ int lm78_detect(struct i2c_adapter *adap
 	   client structure, even though we cannot fill it completely yet.
 	   But it allows us to access lm78_{read,write}_value. */
 
-	if (!(new_client = kmalloc((sizeof(struct i2c_client)) +
-				   sizeof(struct lm78_data),
-				   GFP_KERNEL))) {
+	if (!(data = kmalloc(sizeof(struct lm78_data), GFP_KERNEL))) {
 		err = -ENOMEM;
 		goto ERROR1;
 	}
-	memset(new_client, 0, sizeof(struct i2c_client) + 
-			      sizeof(struct lm78_data));
+	memset(data, 0, sizeof(struct lm78_data));
 
-	data = (struct lm78_data *) (new_client + 1);
+	new_client = &data->client;
 	if (is_isa)
 		init_MUTEX(&data->lock);
 	i2c_set_clientdata(new_client, data);
@@ -625,6 +623,12 @@ int lm78_detect(struct i2c_adapter *adap
 	/* Initialize the LM78 chip */
 	lm78_init_client(new_client);
 
+	/* A few vars need to be filled upon startup */
+	for (i = 0; i < 3; i++) {
+		data->fan_min[i] = lm78_read_value(new_client,
+					LM78_REG_FAN_MIN(i));
+	}
+
 	/* Register sysfs hooks */
 	device_create_file(&new_client->dev, &dev_attr_in0_input);
 	device_create_file(&new_client->dev, &dev_attr_in0_min);
@@ -665,7 +669,7 @@ int lm78_detect(struct i2c_adapter *adap
 	return 0;
 
 ERROR2:
-	kfree(new_client);
+	kfree(data);
 ERROR1:
 	if (is_isa)
 		release_region(address, LM78_EXTENT);
@@ -688,7 +692,7 @@ static int lm78_detach_client(struct i2c
 		return err;
 	}
 
-	kfree(client);
+	kfree(i2c_get_clientdata(client));
 
 	return 0;
 }
--- diff/drivers/i2c/chips/lm80.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/chips/lm80.c	2004-04-21 10:45:34.208503016 +0100
@@ -44,10 +44,9 @@ SENSORS_INSMOD_1(lm80);
 #define LM80_REG_IN_MIN(nr)		(0x2b + (nr) * 2)
 #define LM80_REG_IN(nr)			(0x20 + (nr))
 
-#define LM80_REG_FAN1_MIN		0x3c
-#define LM80_REG_FAN2_MIN		0x3d
 #define LM80_REG_FAN1			0x28
 #define LM80_REG_FAN2			0x29
+#define LM80_REG_FAN_MIN(nr)		(0x3b + (nr))
 
 #define LM80_REG_TEMP			0x27
 #define LM80_REG_TEMP_HOT_MAX		0x38
@@ -69,7 +68,7 @@ SENSORS_INSMOD_1(lm80);
    these macros are called: arguments may be evaluated more than once.
    Fixing this is just not worth it. */
 
-#define IN_TO_REG(val)		(SENSORS_LIMIT((val)/10,0,255))
+#define IN_TO_REG(val)		(SENSORS_LIMIT(((val)+5)/10,0,255))
 #define IN_FROM_REG(val)	((val)*10)
 
 static inline unsigned char FAN_TO_REG(unsigned rpm, unsigned div)
@@ -111,6 +110,7 @@ static inline long TEMP_FROM_REG(u16 tem
  */
 
 struct lm80_data {
+	struct i2c_client client;
 	struct semaphore update_lock;
 	char valid;		/* !=0 if following fields are valid */
 	unsigned long last_updated;	/* In jiffies */
@@ -250,8 +250,46 @@ static ssize_t set_fan_##suffix(struct d
 	lm80_write_value(client, reg, data->value); \
 	return count; \
 }
-set_fan(min1, fan_min[0], LM80_REG_FAN1_MIN, fan_div[0]);
-set_fan(min2, fan_min[1], LM80_REG_FAN2_MIN, fan_div[1]);
+set_fan(min1, fan_min[0], LM80_REG_FAN_MIN(1), fan_div[0]);
+set_fan(min2, fan_min[1], LM80_REG_FAN_MIN(2), fan_div[1]);
+
+/* Note: we save and restore the fan minimum here, because its value is
+   determined in part by the fan divisor.  This follows the principle of
+   least suprise; the user doesn't expect the fan minimum to change just
+   because the divisor changed. */
+static ssize_t set_fan_div(struct device *dev, const char *buf,
+	size_t count, int nr)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct lm80_data *data = i2c_get_clientdata(client);
+	unsigned long min;
+	u8 reg;
+
+	/* Save fan_min */
+	min = FAN_FROM_REG(data->fan_min[nr],
+			   DIV_FROM_REG(data->fan_div[nr]));
+
+	data->fan_div[nr] = DIV_TO_REG(simple_strtoul(buf, NULL, 10));
+
+	reg = (lm80_read_value(client, LM80_REG_FANDIV) & ~(3 << (2 * (nr + 1))))
+	    | (data->fan_div[nr] << (2 * (nr + 1)));
+	lm80_write_value(client, LM80_REG_FANDIV, reg);
+
+	/* Restore fan_min */
+	data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
+	lm80_write_value(client, LM80_REG_FAN_MIN(nr + 1), data->fan_min[nr]);
+
+	return count;
+}
+
+#define set_fan_div(number) \
+static ssize_t set_fan_div##number(struct device *dev, const char *buf, \
+	size_t count) \
+{ \
+	return set_fan_div(dev, buf, count, number - 1); \
+}
+set_fan_div(1);
+set_fan_div(2);
 
 static ssize_t show_temp_input1(struct device *dev, char *buf)
 {
@@ -319,8 +357,8 @@ static DEVICE_ATTR(fan2_min, S_IWUSR | S
     set_fan_min2);
 static DEVICE_ATTR(fan1_input, S_IRUGO, show_fan_input1, NULL);
 static DEVICE_ATTR(fan2_input, S_IRUGO, show_fan_input2, NULL);
-static DEVICE_ATTR(fan1_div, S_IRUGO, show_fan_div1, NULL);
-static DEVICE_ATTR(fan2_div, S_IRUGO, show_fan_div2, NULL);
+static DEVICE_ATTR(fan1_div, S_IWUSR | S_IRUGO, show_fan_div1, set_fan_div1);
+static DEVICE_ATTR(fan2_div, S_IWUSR | S_IRUGO, show_fan_div2, set_fan_div2);
 static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp_input1, NULL);
 static DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_hot_max,
     set_temp_hot_max);
@@ -357,15 +395,13 @@ int lm80_detect(struct i2c_adapter *adap
 	/* OK. For now, we presume we have a valid client. We now create the
 	   client structure, even though we cannot fill it completely yet.
 	   But it allows us to access lm80_{read,write}_value. */
-	if (!(new_client = kmalloc(sizeof(struct i2c_client) +
-	    sizeof(struct lm80_data), GFP_KERNEL))) {
+	if (!(data = kmalloc(sizeof(struct lm80_data), GFP_KERNEL))) {
 		err = -ENOMEM;
 		goto exit;
 	}
-	memset(new_client, 0x00, sizeof(struct i2c_client) +
-	       sizeof(struct lm80_data));
+	memset(data, 0, sizeof(struct lm80_data));
 
-	data = (struct lm80_data *) (new_client + 1);
+	new_client = &data->client;
 	i2c_set_clientdata(new_client, data);
 	new_client->addr = address;
 	new_client->adapter = adapter;
@@ -401,6 +437,10 @@ int lm80_detect(struct i2c_adapter *adap
 	/* Initialize the LM80 chip */
 	lm80_init_client(new_client);
 
+	/* A few vars need to be filled upon startup */
+	data->fan_min[0] = lm80_read_value(new_client, LM80_REG_FAN_MIN(1));
+	data->fan_min[1] = lm80_read_value(new_client, LM80_REG_FAN_MIN(2));
+
 	/* Register sysfs hooks */
 	device_create_file(&new_client->dev, &dev_attr_in0_min);
 	device_create_file(&new_client->dev, &dev_attr_in1_min);
@@ -439,7 +479,7 @@ int lm80_detect(struct i2c_adapter *adap
 	return 0;
 
 error_free:
-	kfree(new_client);
+	kfree(data);
 exit:
 	return err;
 }
@@ -454,7 +494,7 @@ static int lm80_detach_client(struct i2c
 		return err;
 	}
 
-	kfree(client);
+	kfree(i2c_get_clientdata(client));
 	return 0;
 }
 
@@ -504,10 +544,10 @@ static struct lm80_data *lm80_update_dev
 		}
 		data->fan[0] = lm80_read_value(client, LM80_REG_FAN1);
 		data->fan_min[0] =
-		    lm80_read_value(client, LM80_REG_FAN1_MIN);
+		    lm80_read_value(client, LM80_REG_FAN_MIN(1));
 		data->fan[1] = lm80_read_value(client, LM80_REG_FAN2);
 		data->fan_min[1] =
-		    lm80_read_value(client, LM80_REG_FAN2_MIN);
+		    lm80_read_value(client, LM80_REG_FAN_MIN(2));
 
 		data->temp =
 		    (lm80_read_value(client, LM80_REG_TEMP) << 8) |
--- diff/drivers/i2c/chips/lm83.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/chips/lm83.c	2004-04-21 10:45:34.208503016 +0100
@@ -134,6 +134,7 @@ static struct i2c_driver lm83_driver = {
  */
 
 struct lm83_data {
+	struct i2c_client client;
 	struct semaphore update_lock;
 	char valid; /* zero until following fields are valid */
 	unsigned long last_updated; /* in jiffies */
@@ -234,17 +235,15 @@ static int lm83_detect(struct i2c_adapte
 	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
 		goto exit;
 
-	if (!(new_client = kmalloc(sizeof(struct i2c_client) +
-	    sizeof(struct lm83_data), GFP_KERNEL))) {
+	if (!(data = kmalloc(sizeof(struct lm83_data), GFP_KERNEL))) {
 		err = -ENOMEM;
 		goto exit;
 	}
-	memset(new_client, 0x00, sizeof(struct i2c_client) +
-	    sizeof(struct lm83_data));
+	memset(data, 0, sizeof(struct lm83_data));
 
-	/* The LM83-specific data is placed right after the common I2C
-	 * client data. */
-	data = (struct lm83_data *) (new_client + 1);
+	/* The common I2C client data is placed right after the
+	 * LM83-specific data. */
+	new_client = &data->client;
 	i2c_set_clientdata(new_client, data);
 	new_client->addr = address;
 	new_client->adapter = adapter;
@@ -329,7 +328,7 @@ static int lm83_detect(struct i2c_adapte
 	return 0;
 
 exit_free:
-	kfree(new_client);
+	kfree(data);
 exit:
 	return err;
 }
@@ -344,7 +343,7 @@ static int lm83_detach_client(struct i2c
 		return err;
 	}
 
-	kfree(client);
+	kfree(i2c_get_clientdata(client));
 	return 0;
 }
 
--- diff/drivers/i2c/chips/lm85.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/chips/lm85.c	2004-04-21 10:45:34.209502864 +0100
@@ -351,6 +351,7 @@ struct lm85_autofan {
 };
 
 struct lm85_data {
+	struct i2c_client client;
 	struct semaphore lock;
 	enum chips type;
 
@@ -736,16 +737,13 @@ int lm85_detect(struct i2c_adapter *adap
 	   client structure, even though we cannot fill it completely yet.
 	   But it allows us to access lm85_{read,write}_value. */
 
-	if (!(new_client = kmalloc((sizeof(struct i2c_client)) +
-				    sizeof(struct lm85_data),
-				    GFP_KERNEL))) {
+	if (!(data = kmalloc(sizeof(struct lm85_data), GFP_KERNEL))) {
 		err = -ENOMEM;
 		goto ERROR0;
 	}
+	memset(data, 0, sizeof(struct lm85_data));
 
-	memset(new_client, 0, sizeof(struct i2c_client) +
-			      sizeof(struct lm85_data));
-	data = (struct lm85_data *) (new_client + 1);
+	new_client = &data->client;
 	i2c_set_clientdata(new_client, data);
 	new_client->addr = address;
 	new_client->adapter = adapter;
@@ -886,7 +884,7 @@ int lm85_detect(struct i2c_adapter *adap
 
 	/* Error out and cleanup code */
     ERROR1:
-	kfree(new_client);
+	kfree(data);
     ERROR0:
 	return err;
 }
@@ -894,7 +892,7 @@ int lm85_detect(struct i2c_adapter *adap
 int lm85_detach_client(struct i2c_client *client)
 {
 	i2c_detach_client(client);
-	kfree(client);
+	kfree(i2c_get_clientdata(client));
 	return 0;
 }
 
--- diff/drivers/i2c/chips/lm90.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/chips/lm90.c	2004-04-21 10:45:34.209502864 +0100
@@ -142,6 +142,7 @@ static struct i2c_driver lm90_driver = {
  */
 
 struct lm90_data {
+	struct i2c_client client;
 	struct semaphore update_lock;
 	char valid; /* zero until following fields are valid */
 	unsigned long last_updated; /* in jiffies */
@@ -280,17 +281,15 @@ static int lm90_detect(struct i2c_adapte
 	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
 		goto exit;
 
-	if (!(new_client = kmalloc(sizeof(struct i2c_client) +
-	    sizeof(struct lm90_data), GFP_KERNEL))) {
+	if (!(data = kmalloc(sizeof(struct lm90_data), GFP_KERNEL))) {
 		err = -ENOMEM;
 		goto exit;
 	}
-	memset(new_client, 0x00, sizeof(struct i2c_client) +
-	       sizeof(struct lm90_data));
+	memset(data, 0, sizeof(struct lm90_data));
 
-	/* The LM90-specific data is placed right after the common I2C
-	 * client data. */
-	data = (struct lm90_data *) (new_client + 1);
+	/* The common I2C client data is placed right before the
+	   LM90-specific data. */
+	new_client = &data->client;
 	i2c_set_clientdata(new_client, data);
 	new_client->addr = address;
 	new_client->adapter = adapter;
@@ -390,7 +389,7 @@ static int lm90_detect(struct i2c_adapte
 	return 0;
 
 exit_free:
-	kfree(new_client);
+	kfree(data);
 exit:
 	return err;
 }
@@ -420,7 +419,7 @@ static int lm90_detach_client(struct i2c
 		return err;
 	}
 
-	kfree(client);
+	kfree(i2c_get_clientdata(client));
 	return 0;
 }
 
--- diff/drivers/i2c/chips/via686a.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/chips/via686a.c	2004-04-21 10:45:34.211502560 +0100
@@ -27,7 +27,6 @@
 /*
     Supports the Via VT82C686A, VT82C686B south bridges.
     Reports all as a 686A.
-    See doc/chips/via686a for details.
     Warning - only supports a single device.
 */
 
@@ -330,48 +329,11 @@ static inline long TEMP_FROM_REG10(u16 v
 #define DIV_FROM_REG(val) (1 << (val))
 #define DIV_TO_REG(val) ((val)==8?3:(val)==4?2:(val)==1?0:1)
 
-/* Initial limits */
-#define VIA686A_INIT_IN_0 200
-#define VIA686A_INIT_IN_1 250
-#define VIA686A_INIT_IN_2 330
-#define VIA686A_INIT_IN_3 500
-#define VIA686A_INIT_IN_4 1200
-
-#define VIA686A_INIT_IN_PERCENTAGE 10
-
-#define VIA686A_INIT_IN_MIN_0 (VIA686A_INIT_IN_0 - VIA686A_INIT_IN_0 \
-        * VIA686A_INIT_IN_PERCENTAGE / 100)
-#define VIA686A_INIT_IN_MAX_0 (VIA686A_INIT_IN_0 + VIA686A_INIT_IN_0 \
-        * VIA686A_INIT_IN_PERCENTAGE / 100)
-#define VIA686A_INIT_IN_MIN_1 (VIA686A_INIT_IN_1 - VIA686A_INIT_IN_1 \
-        * VIA686A_INIT_IN_PERCENTAGE / 100)
-#define VIA686A_INIT_IN_MAX_1 (VIA686A_INIT_IN_1 + VIA686A_INIT_IN_1 \
-        * VIA686A_INIT_IN_PERCENTAGE / 100)
-#define VIA686A_INIT_IN_MIN_2 (VIA686A_INIT_IN_2 - VIA686A_INIT_IN_2 \
-        * VIA686A_INIT_IN_PERCENTAGE / 100)
-#define VIA686A_INIT_IN_MAX_2 (VIA686A_INIT_IN_2 + VIA686A_INIT_IN_2 \
-        * VIA686A_INIT_IN_PERCENTAGE / 100)
-#define VIA686A_INIT_IN_MIN_3 (VIA686A_INIT_IN_3 - VIA686A_INIT_IN_3 \
-        * VIA686A_INIT_IN_PERCENTAGE / 100)
-#define VIA686A_INIT_IN_MAX_3 (VIA686A_INIT_IN_3 + VIA686A_INIT_IN_3 \
-        * VIA686A_INIT_IN_PERCENTAGE / 100)
-#define VIA686A_INIT_IN_MIN_4 (VIA686A_INIT_IN_4 - VIA686A_INIT_IN_4 \
-        * VIA686A_INIT_IN_PERCENTAGE / 100)
-#define VIA686A_INIT_IN_MAX_4 (VIA686A_INIT_IN_4 + VIA686A_INIT_IN_4 \
-        * VIA686A_INIT_IN_PERCENTAGE / 100)
-
-#define VIA686A_INIT_FAN_MIN	3000
-
-#define VIA686A_INIT_TEMP_OVER 600
-#define VIA686A_INIT_TEMP_HYST 500
-
-/* For the VIA686A, we need to keep some data in memory. That
-   data is pointed to by via686a_list[NR]->data. The structure itself is
-   dynamically allocated, at the same time when a new via686a client is
-   allocated. */
+/* For the VIA686A, we need to keep some data in memory.
+   The structure is dynamically allocated, at the same time when a new
+   via686a client is allocated. */
 struct via686a_data {
-	int sysctl_id;
-
+	struct i2c_client client;
 	struct semaphore update_lock;
 	char valid;		/* !=0 if following fields are valid */
 	unsigned long last_updated;	/* In jiffies */
@@ -688,16 +650,13 @@ static int via686a_detect(struct i2c_ada
 		return -ENODEV;
 	}
 
-	if (!(new_client = kmalloc(sizeof(struct i2c_client) +
-				   sizeof(struct via686a_data),
-				   GFP_KERNEL))) {
+	if (!(data = kmalloc(sizeof(struct via686a_data), GFP_KERNEL))) {
 		err = -ENOMEM;
 		goto ERROR0;
 	}
+	memset(data, 0, sizeof(struct via686a_data));
 
-	memset(new_client,0x00, sizeof(struct i2c_client) +
-				sizeof(struct via686a_data));
-	data = (struct via686a_data *) (new_client + 1);
+	new_client = &data->client;
 	i2c_set_clientdata(new_client, data);
 	new_client->addr = address;
 	new_client->adapter = adapter;
@@ -753,9 +712,9 @@ static int via686a_detect(struct i2c_ada
 	return 0;
 
       ERROR3:
-	release_region(address, VIA686A_EXTENT);
-	kfree(new_client);
+	kfree(data);
       ERROR0:
+	release_region(address, VIA686A_EXTENT);
 	return err;
 }
 
@@ -770,7 +729,7 @@ static int via686a_detach_client(struct 
 	}
 
 	release_region(client->addr, VIA686A_EXTENT);
-	kfree(client);
+	kfree(i2c_get_clientdata(client));
 
 	return 0;
 }
@@ -778,53 +737,13 @@ static int via686a_detach_client(struct 
 /* Called when we have found a new VIA686A. Set limits, etc. */
 static void via686a_init_client(struct i2c_client *client)
 {
-	int i;
-
-	/* Reset the device */
-	via686a_write_value(client, VIA686A_REG_CONFIG, 0x80);
-
-	/* Have to wait for reset to complete or else the following
-	   initializations won't work reliably. The delay was arrived at
-	   empirically, the datasheet doesn't tell you.
-	   Waiting for the reset bit to clear doesn't work, it
-	   clears in about 2-4 udelays and that isn't nearly enough. */
-	udelay(50);
-
-	via686a_write_value(client, VIA686A_REG_IN_MIN(0),
-			    IN_TO_REG(VIA686A_INIT_IN_MIN_0, 0));
-	via686a_write_value(client, VIA686A_REG_IN_MAX(0),
-			    IN_TO_REG(VIA686A_INIT_IN_MAX_0, 0));
-	via686a_write_value(client, VIA686A_REG_IN_MIN(1),
-			    IN_TO_REG(VIA686A_INIT_IN_MIN_1, 1));
-	via686a_write_value(client, VIA686A_REG_IN_MAX(1),
-			    IN_TO_REG(VIA686A_INIT_IN_MAX_1, 1));
-	via686a_write_value(client, VIA686A_REG_IN_MIN(2),
-			    IN_TO_REG(VIA686A_INIT_IN_MIN_2, 2));
-	via686a_write_value(client, VIA686A_REG_IN_MAX(2),
-			    IN_TO_REG(VIA686A_INIT_IN_MAX_2, 2));
-	via686a_write_value(client, VIA686A_REG_IN_MIN(3),
-			    IN_TO_REG(VIA686A_INIT_IN_MIN_3, 3));
-	via686a_write_value(client, VIA686A_REG_IN_MAX(3),
-			    IN_TO_REG(VIA686A_INIT_IN_MAX_3, 3));
-	via686a_write_value(client, VIA686A_REG_IN_MIN(4),
-			    IN_TO_REG(VIA686A_INIT_IN_MIN_4, 4));
-	via686a_write_value(client, VIA686A_REG_IN_MAX(4),
-			    IN_TO_REG(VIA686A_INIT_IN_MAX_4, 4));
-	via686a_write_value(client, VIA686A_REG_FAN_MIN(1),
-			    FAN_TO_REG(VIA686A_INIT_FAN_MIN, 2));
-	via686a_write_value(client, VIA686A_REG_FAN_MIN(2),
-			    FAN_TO_REG(VIA686A_INIT_FAN_MIN, 2));
-	for (i = 0; i <= 2; i++) {
-		via686a_write_value(client, VIA686A_REG_TEMP_OVER(i),
-				    TEMP_TO_REG(VIA686A_INIT_TEMP_OVER));
-		via686a_write_value(client, VIA686A_REG_TEMP_HYST(i),
-				    TEMP_TO_REG(VIA686A_INIT_TEMP_HYST));
-	}
+	u8 reg;
 
 	/* Start monitoring */
-	via686a_write_value(client, VIA686A_REG_CONFIG, 0x01);
+	reg = via686a_read_value(client, VIA686A_REG_CONFIG);
+	via686a_write_value(client, VIA686A_REG_CONFIG, (reg|0x01)&0x7F);
 
-	/* Cofigure temp interrupt mode for continuous-interrupt operation */
+	/* Configure temp interrupt mode for continuous-interrupt operation */
 	via686a_write_value(client, VIA686A_REG_TEMP_MODE, 
 			    via686a_read_value(client, VIA686A_REG_TEMP_MODE) &
 			    !(VIA686A_TEMP_MODE_MASK | VIA686A_TEMP_MODE_CONTINUOUS));
--- diff/drivers/i2c/chips/w83627hf.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/chips/w83627hf.c	2004-04-21 10:45:34.212502408 +0100
@@ -277,6 +277,7 @@ static inline u8 DIV_TO_REG(long val)
    data is pointed to by w83627hf_list[NR]->data. The structure itself is
    dynamically allocated, at the same time when a new client is allocated. */
 struct w83627hf_data {
+	struct i2c_client client;
 	struct semaphore lock;
 	enum chips type;
 
@@ -659,34 +660,37 @@ show_fan_div_reg(struct device *dev, cha
 		       (long) DIV_FROM_REG(data->fan_div[nr - 1]));
 }
 
+/* Note: we save and restore the fan minimum here, because its value is
+   determined in part by the fan divisor.  This follows the principle of
+   least suprise; the user doesn't expect the fan minimum to change just
+   because the divisor changed. */
 static ssize_t
 store_fan_div_reg(struct device *dev, const char *buf, size_t count, int nr)
 {
 	struct i2c_client *client = to_i2c_client(dev);
 	struct w83627hf_data *data = i2c_get_clientdata(client);
-	u32 val, old, old2, old3 = 0;
+	unsigned long min;
+	u8 reg;
 
-	val = simple_strtoul(buf, NULL, 10);
-	old = w83627hf_read_value(client, W83781D_REG_VID_FANDIV);
-	old3 = w83627hf_read_value(client, W83781D_REG_VBAT);
-	data->fan_div[nr - 1] = DIV_TO_REG(val);
-
-	if (nr >= 3 && data->type != w83697hf) {
-		old2 = w83627hf_read_value(client, W83781D_REG_PIN);
-		old2 = (old2 & 0x3f) | ((data->fan_div[2] & 0x03) << 6);
-		w83627hf_write_value(client, W83781D_REG_PIN, old2);
-		old3 = (old3 & 0x7f) | ((data->fan_div[2] & 0x04) << 5);
-	}
-	if (nr >= 2) {
-		old = (old & 0x3f) | ((data->fan_div[1] & 0x03) << 6);
-		old3 = (old3 & 0xbf) | ((data->fan_div[1] & 0x04) << 4);
-	}
-	if (nr >= 1) {
-		old = (old & 0xcf) | ((data->fan_div[0] & 0x03) << 4);
-		w83627hf_write_value(client, W83781D_REG_VID_FANDIV, old);
-		old3 = (old3 & 0xdf) | ((data->fan_div[0] & 0x04) << 3);
-		w83627hf_write_value(client, W83781D_REG_VBAT, old3);
-	}
+	/* Save fan_min */
+	min = FAN_FROM_REG(data->fan_min[nr],
+			   DIV_FROM_REG(data->fan_div[nr]));
+
+	data->fan_div[nr] = DIV_TO_REG(simple_strtoul(buf, NULL, 10));
+
+	reg = (w83627hf_read_value(client, nr==2 ? W83781D_REG_PIN : W83781D_REG_VID_FANDIV)
+	       & (nr==0 ? 0xcf : 0x3f))
+	    | ((data->fan_div[nr] & 0x03) << (nr==0 ? 4 : 6));
+	w83627hf_write_value(client, nr==2 ? W83781D_REG_PIN : W83781D_REG_VID_FANDIV, reg);
+
+	reg = (w83627hf_read_value(client, W83781D_REG_VBAT)
+	       & ~(1 << (5 + nr)))
+	    | ((data->fan_div[nr] & 0x04) << (3 + nr));
+	w83627hf_write_value(client, W83781D_REG_VBAT, reg);
+
+	/* Restore fan_min */
+	data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
+	w83627hf_write_value(client, W83781D_REG_FAN_MIN(nr+1), data->fan_min[nr]);
 
 	return count;
 }
@@ -700,7 +704,7 @@ static ssize_t \
 store_regs_fan_div_##offset (struct device *dev, \
 			    const char *buf, size_t count) \
 { \
-	return store_fan_div_reg(dev, buf, count, offset); \
+	return store_fan_div_reg(dev, buf, count, offset - 1); \
 } \
 static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \
 		  show_regs_fan_div_##offset, store_regs_fan_div_##offset)
@@ -938,17 +942,13 @@ int w83627hf_detect(struct i2c_adapter *
 	   client structure, even though we cannot fill it completely yet.
 	   But it allows us to access w83627hf_{read,write}_value. */
 
-	if (!(new_client = kmalloc(sizeof(struct i2c_client) +
-				   sizeof(struct w83627hf_data),
-				   GFP_KERNEL))) {
+	if (!(data = kmalloc(sizeof(struct w83627hf_data), GFP_KERNEL))) {
 		err = -ENOMEM;
 		goto ERROR1;
 	}
+	memset(data, 0, sizeof(struct w83627hf_data));
 
-	memset(new_client, 0x00, sizeof (struct i2c_client) +
-	       sizeof (struct w83627hf_data));
-
-	data = (struct w83627hf_data *) (new_client + 1);
+	new_client = &data->client;
 	i2c_set_clientdata(new_client, data);
 	new_client->addr = address;
 	init_MUTEX(&data->lock);
@@ -982,6 +982,11 @@ int w83627hf_detect(struct i2c_adapter *
 	/* Initialize the chip */
 	w83627hf_init_client(new_client);
 
+	/* A few vars need to be filled upon startup */
+	data->fan_min[0] = w83627hf_read_value(new_client, W83781D_REG_FAN_MIN(1));
+	data->fan_min[1] = w83627hf_read_value(new_client, W83781D_REG_FAN_MIN(2));
+	data->fan_min[2] = w83627hf_read_value(new_client, W83781D_REG_FAN_MIN(3));
+
 	/* Register sysfs hooks */
 	device_create_file_in(new_client, 0);
 	if (kind != w83697hf)
@@ -1034,7 +1039,7 @@ int w83627hf_detect(struct i2c_adapter *
 	return 0;
 
       ERROR2:
-	kfree(new_client);
+	kfree(data);
       ERROR1:
 	release_region(address, WINB_EXTENT);
       ERROR0:
@@ -1052,7 +1057,7 @@ static int w83627hf_detach_client(struct
 	}
 
 	release_region(client->addr, WINB_EXTENT);
-	kfree(client);
+	kfree(i2c_get_clientdata(client));
 
 	return 0;
 }
--- diff/drivers/i2c/chips/w83781d.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/chips/w83781d.c	2004-04-21 10:45:34.214502104 +0100
@@ -24,7 +24,7 @@
     Supports following chips:
 
     Chip	#vin	#fanin	#pwm	#temp	wchipid	vendid	i2c	ISA
-    as99127f	7	3	1?	3	0x31	0x12c3	yes	no
+    as99127f	7	3	0	3	0x31	0x12c3	yes	no
     as99127f rev.2 (type_name = as99127f)	0x31	0x5ca3	yes	no
     w83781d	7	3	0	3	0x10-1	0x5ca3	yes	yes
     w83627hf	9	3	2	3	0x21	0x5ca3	yes	yes(LPC)
@@ -226,6 +226,7 @@ DIV_TO_REG(long val, enum chips type)
    dynamically allocated, at the same time when a new w83781d client is
    allocated. */
 struct w83781d_data {
+	struct i2c_client client;
 	struct semaphore lock;
 	enum chips type;
 
@@ -275,11 +276,6 @@ static int w83781d_write_value(struct i2
 static struct w83781d_data *w83781d_update_device(struct device *dev);
 static void w83781d_init_client(struct i2c_client *client);
 
-static inline u16 swap_bytes(u16 val)
-{
-	return (val >> 8) | (val << 8);
-}
-
 static struct i2c_driver w83781d_driver = {
 	.owner = THIS_MODULE,
 	.name = "w83781d",
@@ -620,73 +616,7 @@ show_fan_div_reg(struct device *dev, cha
    least suprise; the user doesn't expect the fan minimum to change just
    because the divisor changed. */
 static ssize_t
-store_regs_fan_div_1(struct device *dev, const char *buf, size_t count)
-{
-	struct i2c_client *client = to_i2c_client(dev);
-	struct w83781d_data *data = i2c_get_clientdata(client);
-	unsigned long min;
-	u8 reg;
-
-	/* Save fan_min */
-	min = FAN_FROM_REG(data->fan_min[0],
-			   DIV_FROM_REG(data->fan_div[0]));
-
-	data->fan_div[0] = DIV_TO_REG(simple_strtoul(buf, NULL, 10),
-				      data->type);
-
-	reg = w83781d_read_value(client, W83781D_REG_VID_FANDIV) & 0xcf;
-	reg |= (data->fan_div[0] & 0x03) << 4;
-	w83781d_write_value(client, W83781D_REG_VID_FANDIV, reg);
-
-	/* w83781d and as99127f don't have extended divisor bits */
-	if (data->type != w83781d && data->type != as99127f) {
-		reg = w83781d_read_value(client, W83781D_REG_VBAT) & 0xdf;
-		reg |= (data->fan_div[0] & 0x04) << 3;
-		w83781d_write_value(client, W83781D_REG_VBAT, reg);
-	}
-
-	/* Restore fan_min */
-	data->fan_min[0] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[0]));
-	w83781d_write_value(client, W83781D_REG_FAN_MIN(1), data->fan_min[0]);
-
-	return count;
-}
-
-static ssize_t
-store_regs_fan_div_2(struct device *dev, const char *buf, size_t count)
-{
-	struct i2c_client *client = to_i2c_client(dev);
-	struct w83781d_data *data = i2c_get_clientdata(client);
-	unsigned long min;
-	u8 reg;
-
-	/* Save fan_min */
-	min = FAN_FROM_REG(data->fan_min[1],
-			   DIV_FROM_REG(data->fan_div[1]));
-
-	data->fan_div[1] = DIV_TO_REG(simple_strtoul(buf, NULL, 10),
-				      data->type);
-
-	reg = w83781d_read_value(client, W83781D_REG_VID_FANDIV) & 0x3f;
-	reg |= (data->fan_div[1] & 0x03) << 6;
-	w83781d_write_value(client, W83781D_REG_VID_FANDIV, reg);
-
-	/* w83781d and as99127f don't have extended divisor bits */
-	if (data->type != w83781d && data->type != as99127f) {
-		reg = w83781d_read_value(client, W83781D_REG_VBAT) & 0xbf;
-		reg |= (data->fan_div[1] & 0x04) << 4;
-		w83781d_write_value(client, W83781D_REG_VBAT, reg);
-	}
-
-	/* Restore fan_min */
-	data->fan_min[1] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[1]));
-	w83781d_write_value(client, W83781D_REG_FAN_MIN(2), data->fan_min[1]);
-
-	return count;
-}
-
-static ssize_t
-store_regs_fan_div_3(struct device *dev, const char *buf, size_t count)
+store_fan_div_reg(struct device *dev, const char *buf, size_t count, int nr)
 {
 	struct i2c_client *client = to_i2c_client(dev);
 	struct w83781d_data *data = i2c_get_clientdata(client);
@@ -694,26 +624,28 @@ store_regs_fan_div_3(struct device *dev,
 	u8 reg;
 
 	/* Save fan_min */
-	min = FAN_FROM_REG(data->fan_min[2],
-			   DIV_FROM_REG(data->fan_div[2]));
+	min = FAN_FROM_REG(data->fan_min[nr],
+			   DIV_FROM_REG(data->fan_div[nr]));
 
-	data->fan_div[2] = DIV_TO_REG(simple_strtoul(buf, NULL, 10),
+	data->fan_div[nr] = DIV_TO_REG(simple_strtoul(buf, NULL, 10),
 				      data->type);
 
-	reg = w83781d_read_value(client, W83781D_REG_PIN) & 0x3f;
-	reg |= (data->fan_div[2] & 0x03) << 6;
-	w83781d_write_value(client, W83781D_REG_PIN, reg);
+	reg = (w83781d_read_value(client, nr==2 ? W83781D_REG_PIN : W83781D_REG_VID_FANDIV)
+	       & (nr==0 ? 0xcf : 0x3f))
+	    | ((data->fan_div[nr] & 0x03) << (nr==0 ? 4 : 6));
+	w83781d_write_value(client, nr==2 ? W83781D_REG_PIN : W83781D_REG_VID_FANDIV, reg);
 
 	/* w83781d and as99127f don't have extended divisor bits */
 	if (data->type != w83781d && data->type != as99127f) {
-		reg = w83781d_read_value(client, W83781D_REG_VBAT) & 0x7f;
-		reg |= (data->fan_div[2] & 0x04) << 5;
+		reg = (w83781d_read_value(client, W83781D_REG_VBAT)
+		       & ~(1 << (5 + nr)))
+		    | ((data->fan_div[nr] & 0x04) << (3 + nr));
 		w83781d_write_value(client, W83781D_REG_VBAT, reg);
 	}
 
 	/* Restore fan_min */
-	data->fan_min[2] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[2]));
-	w83781d_write_value(client, W83781D_REG_FAN_MIN(3), data->fan_min[2]);
+	data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
+	w83781d_write_value(client, W83781D_REG_FAN_MIN(nr+1), data->fan_min[nr]);
 
 	return count;
 }
@@ -723,6 +655,10 @@ static ssize_t show_regs_fan_div_##offse
 { \
 	return show_fan_div_reg(dev, buf, offset); \
 } \
+static ssize_t store_regs_fan_div_##offset (struct device *dev, const char *buf, size_t count) \
+{ \
+	return store_fan_div_reg(dev, buf, count, offset - 1); \
+} \
 static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, show_regs_fan_div_##offset, store_regs_fan_div_##offset)
 
 sysfs_fan_div(1);
@@ -734,7 +670,6 @@ do { \
 device_create_file(&client->dev, &dev_attr_fan##offset##_div); \
 } while (0)
 
-/* w83697hf only has two fans */
 static ssize_t
 show_pwm_reg(struct device *dev, char *buf, int nr)
 {
@@ -742,7 +677,6 @@ show_pwm_reg(struct device *dev, char *b
 	return sprintf(buf, "%ld\n", (long) PWM_FROM_REG(data->pwm[nr - 1]));
 }
 
-/* w83697hf only has two fans */
 static ssize_t
 show_pwmenable_reg(struct device *dev, char *buf, int nr)
 {
@@ -770,38 +704,26 @@ store_pwmenable_reg(struct device *dev, 
 {
 	struct i2c_client *client = to_i2c_client(dev);
 	struct w83781d_data *data = i2c_get_clientdata(client);
-	u32 val, j, k;
+	u32 val, reg;
 
 	val = simple_strtoul(buf, NULL, 10);
 
-	/* only PWM2 can be enabled/disabled */
-	if (nr == 2) {
-		j = w83781d_read_value(client, W83781D_REG_PWMCLK12);
-		k = w83781d_read_value(client, W83781D_REG_BEEP_CONFIG);
-
-		if (val > 0) {
-			if (!(j & 0x08))
-				w83781d_write_value(client,
-						    W83781D_REG_PWMCLK12,
-						    j | 0x08);
-			if (k & 0x10)
-				w83781d_write_value(client,
-						    W83781D_REG_BEEP_CONFIG,
-						    k & 0xef);
+	switch (val) {
+	case 0:
+	case 1:
+		reg = w83781d_read_value(client, W83781D_REG_PWMCLK12);
+		w83781d_write_value(client, W83781D_REG_PWMCLK12,
+				    (reg & 0xf7) | (val << 3));
+
+		reg = w83781d_read_value(client, W83781D_REG_BEEP_CONFIG);
+		w83781d_write_value(client, W83781D_REG_BEEP_CONFIG,
+				    (reg & 0xef) | (!val << 4));
 
-			data->pwmenable[1] = 1;
-		} else {
-			if (j & 0x08)
-				w83781d_write_value(client,
-						    W83781D_REG_PWMCLK12,
-						    j & 0xf7);
-			if (!(k & 0x10))
-				w83781d_write_value(client,
-						    W83781D_REG_BEEP_CONFIG,
-						    j | 0x10);
+		data->pwmenable[nr - 1] = val;
+		break;
 
-			data->pwmenable[1] = 0;
-		}
+	default:
+		return -EINVAL;
 	}
 
 	return count;
@@ -1177,16 +1099,13 @@ w83781d_detect(struct i2c_adapter *adapt
 	   client structure, even though we cannot fill it completely yet.
 	   But it allows us to access w83781d_{read,write}_value. */
 
-	if (!(new_client = kmalloc(sizeof (struct i2c_client) +
-				   sizeof (struct w83781d_data), GFP_KERNEL))) {
+	if (!(data = kmalloc(sizeof(struct w83781d_data), GFP_KERNEL))) {
 		err = -ENOMEM;
 		goto ERROR1;
 	}
+	memset(data, 0, sizeof(struct w83781d_data));
 
-	memset(new_client, 0x00, sizeof (struct i2c_client) +
-	       sizeof (struct w83781d_data));
-
-	data = (struct w83781d_data *) (new_client + 1);
+	new_client = &data->client;
 	i2c_set_clientdata(new_client, data);
 	new_client->addr = address;
 	init_MUTEX(&data->lock);
@@ -1312,6 +1231,15 @@ w83781d_detect(struct i2c_adapter *adapt
 	/* Initialize the chip */
 	w83781d_init_client(new_client);
 
+	/* A few vars need to be filled upon startup */
+	for (i = 1; i <= 3; i++) {
+		data->fan_min[i - 1] = w83781d_read_value(new_client,
+					W83781D_REG_FAN_MIN(i));
+	}
+	if (kind != w83781d && kind != as99127f)
+		for (i = 0; i < 4; i++)
+			data->pwmenable[i] = 1;
+
 	/* Register sysfs hooks */
 	device_create_file_in(new_client, 0);
 	if (kind != w83783s && kind != w83697hf)
@@ -1351,7 +1279,7 @@ w83781d_detect(struct i2c_adapter *adapt
 
 	device_create_file_beep(new_client);
 
-	if (kind != w83781d) {
+	if (kind != w83781d && kind != as99127f) {
 		device_create_file_pwm(new_client, 1);
 		device_create_file_pwm(new_client, 2);
 		device_create_file_pwmenable(new_client, 2);
@@ -1380,7 +1308,7 @@ w83781d_detect(struct i2c_adapter *adapt
 ERROR3:
 	i2c_detach_client(new_client);
 ERROR2:
-	kfree(new_client);
+	kfree(data);
 ERROR1:
 	if (is_isa)
 		release_region(address, W83781D_EXTENT);
@@ -1402,7 +1330,7 @@ w83781d_detach_client(struct i2c_client 
 		return err;
 	}
 
-	kfree(client);
+	kfree(i2c_get_clientdata(client));
 
 	return 0;
 }
@@ -1461,20 +1389,17 @@ w83781d_read_value(struct i2c_client *cl
 			/* convert from ISA to LM75 I2C addresses */
 			switch (reg & 0xff) {
 			case 0x50:	/* TEMP */
-				res =
-				    swap_bytes(i2c_smbus_read_word_data(cl, 0));
+				res = swab16(i2c_smbus_read_word_data(cl, 0));
 				break;
 			case 0x52:	/* CONFIG */
 				res = i2c_smbus_read_byte_data(cl, 1);
 				break;
 			case 0x53:	/* HYST */
-				res =
-				    swap_bytes(i2c_smbus_read_word_data(cl, 2));
+				res = swab16(i2c_smbus_read_word_data(cl, 2));
 				break;
 			case 0x55:	/* OVER */
 			default:
-				res =
-				    swap_bytes(i2c_smbus_read_word_data(cl, 3));
+				res = swab16(i2c_smbus_read_word_data(cl, 3));
 				break;
 			}
 		}
@@ -1535,12 +1460,10 @@ w83781d_write_value(struct i2c_client *c
 				i2c_smbus_write_byte_data(cl, 1, value & 0xff);
 				break;
 			case 0x53:	/* HYST */
-				i2c_smbus_write_word_data(cl, 2,
-							  swap_bytes(value));
+				i2c_smbus_write_word_data(cl, 2, swab16(value));
 				break;
 			case 0x55:	/* OVER */
-				i2c_smbus_write_word_data(cl, 3,
-							  swap_bytes(value));
+				i2c_smbus_write_word_data(cl, 3, swab16(value));
 				break;
 			}
 		}
@@ -1644,9 +1567,6 @@ w83781d_init_client(struct i2c_client *c
 			if (!(i & 0x40))
 				w83781d_write_value(client, W83781D_REG_IRQ,
 						    i | 0x40);
-
-			for (i = 0; i < 3; i++)
-				data->pwmenable[i] = 1;
 		}
 	}
 
@@ -1690,20 +1610,19 @@ static struct w83781d_data *w83781d_upda
 			data->fan_min[i - 1] =
 			    w83781d_read_value(client, W83781D_REG_FAN_MIN(i));
 		}
-		if (data->type != w83781d) {
+		if (data->type != w83781d && data->type != as99127f) {
 			for (i = 1; i <= 4; i++) {
 				data->pwm[i - 1] =
 				    w83781d_read_value(client,
 						       W83781D_REG_PWM(i));
-				if (((data->type == w83783s)
-				     || (data->type == w83627hf)
-				     || (data->type == as99127f)
-				     || (data->type == w83697hf)
-				     || ((data->type == w83782d)
-					 && i2c_is_isa_client(client)))
+				if ((data->type != w83782d
+				     || i2c_is_isa_client(client))
 				    && i == 2)
 					break;
 			}
+			/* Only PWM2 can be disabled */
+			data->pwmenable[1] = (w83781d_read_value(client,
+					      W83781D_REG_PWMCLK12) & 0x08) >> 3;
 		}
 
 		data->temp = w83781d_read_value(client, W83781D_REG_TEMP(1));
--- diff/drivers/i2c/chips/w83l785ts.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/chips/w83l785ts.c	2004-04-21 10:45:34.214502104 +0100
@@ -105,7 +105,7 @@ static struct i2c_driver w83l785ts_drive
  */
 
 struct w83l785ts_data {
-	
+	struct i2c_client client;
 	struct semaphore update_lock;
 	char valid; /* zero until following fields are valid */
 	unsigned long last_updated; /* in jiffies */
@@ -164,18 +164,16 @@ static int w83l785ts_detect(struct i2c_a
 	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
 		goto exit;
 
-	if (!(new_client = kmalloc(sizeof(struct i2c_client) +  
-		sizeof(struct w83l785ts_data), GFP_KERNEL))) {
+	if (!(data = kmalloc(sizeof(struct w83l785ts_data), GFP_KERNEL))) {
 		err = -ENOMEM;
 		goto exit;
 	}
-	memset(new_client, 0x00, sizeof(struct i2c_client) +
-	       sizeof(struct w83l785ts_data));
+	memset(data, 0, sizeof(struct w83l785ts_data));
 
 
-	/* The W83L785TS-specific data is placed right after the common I2C
-	 * client data. */
-	data = (struct w83l785ts_data *) (new_client + 1);
+	/* The common I2C client data is placed right before the
+	 * W83L785TS-specific data. */
+	new_client = &data->client;
 	i2c_set_clientdata(new_client, data);
 	new_client->addr = address;
 	new_client->adapter = adapter;
@@ -255,7 +253,7 @@ static int w83l785ts_detect(struct i2c_a
 	return 0;
 
 exit_free:
-	kfree(new_client);
+	kfree(data);
 exit:
 	return err;
 }
@@ -270,7 +268,7 @@ static int w83l785ts_detach_client(struc
 		return err;
 	}
 
-	kfree(client);
+	kfree(i2c_get_clientdata(client));
 	return 0;
 }
 
--- diff/drivers/i2c/i2c-dev.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/i2c/i2c-dev.c	2004-04-21 10:45:34.215501952 +0100
@@ -137,7 +137,7 @@ static ssize_t i2cdev_read (struct file 
 	if (tmp==NULL)
 		return -ENOMEM;
 
-	pr_debug("i2c-dev: i2c-%d reading %d bytes.\n",
+	pr_debug("i2c-dev: i2c-%d reading %zd bytes.\n",
 		iminor(file->f_dentry->d_inode), count);
 
 	ret = i2c_master_recv(client,tmp,count);
@@ -165,7 +165,7 @@ static ssize_t i2cdev_write (struct file
 		return -EFAULT;
 	}
 
-	pr_debug("i2c-dev: i2c-%d writing %d bytes.\n",
+	pr_debug("i2c-dev: i2c-%d writing %zd bytes.\n",
 		iminor(file->f_dentry->d_inode), count);
 
 	ret = i2c_master_send(client,tmp,count);
--- diff/drivers/ide/ide-cd.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/ide/ide-cd.c	2004-04-21 10:45:34.223500736 +0100
@@ -991,7 +991,7 @@ static void cdrom_buffer_sectors (ide_dr
 
 	/* Throw away any remaining data. */
 	while (sectors_to_transfer > 0) {
-		char dum[SECTOR_SIZE];
+		static char dum[SECTOR_SIZE];
 		HWIF(drive)->atapi_input_bytes(drive, dum, sizeof (dum));
 		--sectors_to_transfer;
 	}
@@ -1118,7 +1118,7 @@ static ide_startstop_t cdrom_read_intr (
 
 	while (nskip > 0) {
 		/* We need to throw away a sector. */
-		char dum[SECTOR_SIZE];
+		static char dum[SECTOR_SIZE];
 		HWIF(drive)->atapi_input_bytes(drive, dum, sizeof (dum));
 
 		--rq->current_nr_sectors;
--- diff/drivers/ide/ide-disk.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/ide/ide-disk.c	2004-04-21 10:45:34.225500432 +0100
@@ -1068,7 +1068,8 @@ static inline int idedisk_supports_hpa(c
  */
 static inline int idedisk_supports_lba48(const struct hd_driveid *id)
 {
-	return (id->command_set_2 & 0x0400) && (id->cfs_enable_2 & 0x0400);
+	return (id->command_set_2 & 0x0400) && (id->cfs_enable_2 & 0x0400)
+	       && id->lba_capacity_2;
 }
 
 static inline void idedisk_check_hpa(ide_drive_t *drive)
--- diff/drivers/ide/ide-probe.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/ide/ide-probe.c	2004-04-21 10:45:34.233499216 +0100
@@ -103,7 +103,8 @@ static inline int drive_is_flashcard (id
 		if (id->config == 0x848a) return 1;	/* CompactFlash */
 		if (!strncmp(id->model, "KODAK ATA_FLASH", 15)	/* Kodak */
 		 || !strncmp(id->model, "Hitachi CV", 10)	/* Hitachi */
-		 || !strncmp(id->model, "SunDisk SDCFB", 13)	/* SunDisk */
+		 || !strncmp(id->model, "SunDisk SDCFB", 13)	/* old SanDisk */
+		 || !strncmp(id->model, "SanDisk SDCFB", 13)	/* SanDisk */
 		 || !strncmp(id->model, "HAGIWARA HPC", 12)	/* Hagiwara */
 		 || !strncmp(id->model, "LEXAR ATA_FLASH", 15)	/* Lexar */
 		 || !strncmp(id->model, "ATA_FLASH", 9))	/* Simple Tech */
--- diff/drivers/ide/ide.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/ide/ide.c	2004-04-21 10:45:34.236498760 +0100
@@ -203,34 +203,23 @@ static void setup_driver_defaults(ide_dr
 /*
  * Do not even *think* about calling this!
  */
-static void init_hwif_data (unsigned int index)
+static void init_hwif_data(ide_hwif_t *hwif, unsigned int index)
 {
 	unsigned int unit;
-	hw_regs_t hw;
-	ide_hwif_t *hwif = &ide_hwifs[index];
 
 	/* bulk initialize hwif & drive info with zeros */
 	memset(hwif, 0, sizeof(ide_hwif_t));
-	memset(&hw, 0, sizeof(hw_regs_t));
 
 	/* fill in any non-zero initial values */
-	hwif->index     = index;
-	ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, &hwif->irq);
-	memcpy(&hwif->hw, &hw, sizeof(hw));
-	memcpy(hwif->io_ports, hw.io_ports, sizeof(hw.io_ports));
-	hwif->noprobe	= !hwif->io_ports[IDE_DATA_OFFSET];
-#ifdef CONFIG_BLK_DEV_HD
-	if (hwif->io_ports[IDE_DATA_OFFSET] == HD_DATA)
-		hwif->noprobe = 1; /* may be overridden by ide_setup() */
-#endif /* CONFIG_BLK_DEV_HD */
+	hwif->index	= index;
 	hwif->major	= ide_hwif_to_major[index];
+
 	hwif->name[0]	= 'i';
 	hwif->name[1]	= 'd';
 	hwif->name[2]	= 'e';
 	hwif->name[3]	= '0' + index;
-	hwif->bus_state = BUSSTATE_ON;
-	hwif->reset_poll= NULL;
-	hwif->pre_reset = NULL;
+
+	hwif->bus_state	= BUSSTATE_ON;
 
 	hwif->atapi_dma = 0;		/* disable all atapi dma */ 
 	hwif->ultra_mask = 0x80;	/* disable all ultra */
@@ -265,6 +254,24 @@ static void init_hwif_data (unsigned int
 	}
 }
 
+static void init_hwif_default(ide_hwif_t *hwif, unsigned int index)
+{
+	hw_regs_t hw;
+
+	memset(&hw, 0, sizeof(hw_regs_t));
+
+	ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, &hwif->irq);
+
+	memcpy(&hwif->hw, &hw, sizeof(hw));
+	memcpy(hwif->io_ports, hw.io_ports, sizeof(hw.io_ports));
+
+	hwif->noprobe = !hwif->io_ports[IDE_DATA_OFFSET];
+#ifdef CONFIG_BLK_DEV_HD
+	if (hwif->io_ports[IDE_DATA_OFFSET] == HD_DATA)
+		hwif->noprobe = 1;	/* may be overridden by ide_setup() */
+#endif
+}
+
 /*
  * init_ide_data() sets reasonable default values into all fields
  * of all instances of the hwifs and drives, but only on the first call.
@@ -285,6 +292,7 @@ static void init_hwif_data (unsigned int
 #define MAGIC_COOKIE 0x12345678
 static void __init init_ide_data (void)
 {
+	ide_hwif_t *hwif;
 	unsigned int index;
 	static unsigned long magic_cookie = MAGIC_COOKIE;
 
@@ -295,13 +303,21 @@ static void __init init_ide_data (void)
 	setup_driver_defaults(&idedefault_driver);
 
 	/* Initialise all interface structures */
-	for (index = 0; index < MAX_HWIFS; ++index)
-		init_hwif_data(index);
+	for (index = 0; index < MAX_HWIFS; ++index) {
+		hwif = &ide_hwifs[index];
+		init_hwif_data(hwif, index);
+		init_hwif_default(hwif, index);
+		hwif->irq = hwif->hw.irq =
+			ide_init_default_irq(hwif->io_ports[IDE_DATA_OFFSET]);
+	}
 
+/* OBSOLETE: still needed on arm26 and arm */
+#ifdef CONFIG_ARM
 	/* Add default hw interfaces */
 	initializing = 1;
 	ide_init_default_hwifs();
 	initializing = 0;
+#endif
 }
 
 /*
@@ -569,8 +585,6 @@ void ide_hwif_release_regions(ide_hwif_t
 
 EXPORT_SYMBOL(ide_hwif_release_regions);
 
-extern void init_hwif_data(unsigned int index);
-
 /**
  *	ide_unregister		-	free an ide interface
  *	@index: index of interface (will change soon to a pointer)
@@ -750,7 +764,10 @@ void ide_unregister (unsigned int index)
 	}
 
 	old_hwif			= *hwif;
-	init_hwif_data(index);	/* restore hwif data to pristine status */
+
+	init_hwif_data(hwif, index);	/* restore hwif data to pristine status */
+	init_hwif_default(hwif, index);
+
 	hwif->hwgroup			= old_hwif.hwgroup;
 
 	hwif->gendev.parent		= old_hwif.gendev.parent;
@@ -952,8 +969,10 @@ int ide_register_hw (hw_regs_t *hw, ide_
 found:
 	if (hwif->present)
 		ide_unregister(index);
-	else if (!hwif->hold)
-		init_hwif_data(index);
+	else if (!hwif->hold) {
+		init_hwif_data(hwif, index);
+		init_hwif_default(hwif, index);
+	}
 	if (hwif->present)
 		return -1;
 	memcpy(&hwif->hw, hw, sizeof(*hw));
@@ -1574,6 +1593,7 @@ int generic_ide_ioctl(struct block_devic
 			if (!capable(CAP_SYS_RAWIO)) return -EACCES;
 			if (copy_from_user(args, (void *)arg, 3 * sizeof(int)))
 				return -EFAULT;
+			memset(&hw, 0, sizeof(hw));
 			ide_init_hwif_ports(&hw, (unsigned long) args[0],
 					    (unsigned long) args[1], NULL);
 			hw.irq = args[2];
@@ -1889,7 +1909,7 @@ int __init ide_setup (char *s)
 		 * Be VERY CAREFUL changing this: note hardcoded indexes below
 		 * (-8, -9, -10) are reserved to ease the hardcoding.
 		 */
-		const char *ide_words[] = {
+		static const char *ide_words[] = {
 			"noprobe", "serialize", "autotune", "noautotune", 
 			"reset", "dma", "ata66", "minus8", "minus9",
 			"minus10", "four", "qd65xx", "ht6560b", "cmd640_vlb",
--- diff/drivers/ide/legacy/ide-cs.c	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/ide/legacy/ide-cs.c	2004-04-21 10:45:34.240498152 +0100
@@ -213,6 +213,7 @@ do { last_fn = (fn); if ((last_ret = (re
 static int idecs_register(unsigned long io, unsigned long ctl, unsigned long irq)
 {
     hw_regs_t hw;
+    memset(&hw, 0, sizeof(hw));
     ide_init_hwif_ports(&hw, io, ctl, NULL);
     hw.irq = irq;
     hw.chipset = ide_pci;
--- diff/drivers/ide/legacy/qd65xx.c	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/ide/legacy/qd65xx.c	2004-04-21 10:45:34.247497088 +0100
@@ -92,7 +92,7 @@
 
 static int timings[4]={-1,-1,-1,-1}; /* stores current timing for each timer */
 
-static void qd_write_reg (u8 content, u8 reg)
+static void qd_write_reg (u8 content, unsigned long reg)
 {
 	unsigned long flags;
 
@@ -101,7 +101,7 @@ static void qd_write_reg (u8 content, u8
 	spin_unlock_irqrestore(&ide_lock, flags);
 }
 
-u8 __init qd_read_reg (u8 reg)
+u8 __init qd_read_reg (unsigned long reg)
 {
 	unsigned long flags;
 	u8 read;
--- diff/drivers/ide/pci/hpt366.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/ide/pci/hpt366.c	2004-04-21 10:45:34.256495720 +0100
@@ -107,7 +107,7 @@ static int hpt366_get_info (char *buffer
 				"                             %s\n",
 			(c0 & 0x80) ? "no" : "yes",
 			(c1 & 0x80) ? "no" : "yes");
-
+#if 0
 		if (hpt_minimum_revision(dev, 3)) {
 			u8 cbl;
 			cbl = inb(iobase + 0x7b);
@@ -120,7 +120,7 @@ static int hpt366_get_info (char *buffer
 				(cbl & 0x01) ? 33 : 66);
 			p += sprintf(p, "\n");
 		}
-
+#endif
 		p += sprintf(p, "--------------- drive0 --------- drive1 "
 				"------- drive0 ---------- drive1 -------\n");
 		p += sprintf(p, "DMA capable:    %s              %s" 
--- diff/drivers/ieee1394/Kconfig	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/ieee1394/Kconfig	2004-04-21 10:45:34.256495720 +0100
@@ -124,7 +124,7 @@ config IEEE1394_SBP2_PHYS_DMA
 
 config IEEE1394_ETH1394
 	tristate "Ethernet over 1394"
-	depends on IEEE1394 && EXPERIMENTAL
+	depends on IEEE1394 && EXPERIMENTAL && INET
 	select IEEE1394_CONFIG_ROM_IP1394
 	select IEEE1394_EXTRA_CONFIG_ROMS
 	help
--- diff/drivers/ieee1394/amdtp.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/ieee1394/amdtp.c	2004-04-21 10:45:34.257495568 +0100
@@ -319,7 +319,7 @@ void ohci1394_stop_it_ctx(struct ti_ohci
 			control = reg_read(ohci, OHCI1394_IsoXmitContextControlSet + ctx * 16);
 			if ((control & OHCI1394_CONTEXT_ACTIVE) == 0)
 				break;
-			
+
 			set_current_state(TASK_INTERRUPTIBLE);
 			schedule_timeout(1);
 		}
@@ -408,7 +408,7 @@ static void stream_shift_packet_lists(un
 
 	/* Now that we know the list is non-empty, we can get the head
 	 * of the list without locking, because the process context
-	 * only adds to the tail.  
+	 * only adds to the tail.
 	 */
 	pl = list_entry(s->dma_packet_lists.next, struct packet_list, link);
 	last = &pl->packets[PACKET_LIST_SIZE - 1];
@@ -424,7 +424,7 @@ static void stream_shift_packet_lists(un
 	if (last->db->payload_desc.status == 0) {
 		HPSB_INFO("weird interrupt...");
 		return;
-	}		
+	}
 
 	/* If the last descriptor block does not specify a branch
 	 * address, we have a sample underflow.
@@ -469,7 +469,7 @@ static struct packet *stream_current_pac
 
 	return &s->current_packet_list->packets[s->current_packet];
 }
-	
+
 static void stream_queue_packet(struct stream *s)
 {
 	s->current_packet++;
@@ -543,13 +543,13 @@ void packet_initialize(struct packet *p,
 		DMA_CTL_OUTPUT_MORE | DMA_CTL_IMMEDIATE | 8;
 
 	if (next) {
-		p->db->payload_desc.control = 
+		p->db->payload_desc.control =
 			DMA_CTL_OUTPUT_LAST | DMA_CTL_BRANCH;
 		p->db->payload_desc.branch = next->db_bus | 3;
 		p->db->header_desc.skip = next->db_bus | 3;
 	}
 	else {
-		p->db->payload_desc.control = 
+		p->db->payload_desc.control =
 			DMA_CTL_OUTPUT_LAST | DMA_CTL_BRANCH |
 			DMA_CTL_UPDATE | DMA_CTL_IRQ;
 		p->db->payload_desc.branch = 0;
@@ -580,7 +580,7 @@ struct packet_list *packet_list_alloc(st
 	for (i = 0; i < PACKET_LIST_SIZE; i++) {
 		if (i < PACKET_LIST_SIZE - 1)
 			next = &pl->packets[i + 1];
-		else 
+		else
 			next = NULL;
 		packet_initialize(&pl->packets[i], next);
 	}
@@ -695,7 +695,7 @@ static u32 get_header_bits(struct stream
 	case AMDTP_FORMAT_IEC958_PCM:
 	case AMDTP_FORMAT_IEC958_AC3:
 		return get_iec958_header_bits(s, sub_frame, sample);
-		
+
 	case AMDTP_FORMAT_RAW:
 		return 0x40;
 
@@ -739,18 +739,18 @@ static void fill_packet(struct stream *s
 
 	/* Fill IEEE1394 headers */
 	packet->db->header_desc.header[0] =
-		(IEEE1394_SPEED_100 << 16) | (0x01 << 14) | 
+		(IEEE1394_SPEED_100 << 16) | (0x01 << 14) |
 		(s->iso_channel << 8) | (TCODE_ISO_DATA << 4);
 	packet->db->header_desc.header[1] = size << 16;
-	
+
 	/* Calculate synchronization timestamp (syt). First we
 	 * determine syt_index, that is, the index in the packet of
 	 * the sample for which the timestamp is valid. */
 	syt_index = (s->syt_interval - s->dbc) & (s->syt_interval - 1);
 	if (syt_index < nevents) {
-		syt = ((atomic_read(&s->cycle_count) << 12) | 
+		syt = ((atomic_read(&s->cycle_count) << 12) |
 		       s->cycle_offset.integer) & 0xffff;
-		fraction_add(&s->cycle_offset, 
+		fraction_add(&s->cycle_offset,
 			     &s->cycle_offset, &s->ticks_per_syt_offset);
 
 		/* This next addition should be modulo 8000 (0x1f40),
@@ -763,7 +763,7 @@ static void fill_packet(struct stream *s
 		syt = 0xffff;
 
 	atomic_inc(&s->cycle_count2);
-	
+
 	/* Fill cip header */
 	packet->payload->eoh0 = 0;
 	packet->payload->sid = s->host->host->node_id & 0x3f;
@@ -1072,7 +1072,7 @@ void stream_free(struct stream *s)
 	 * that sometimes generates an it transmit interrupt if we
 	 * later re-enable the context.
 	 */
-	wait_event_interruptible(s->packet_list_wait, 
+	wait_event_interruptible(s->packet_list_wait,
 				 list_empty(&s->dma_packet_lists));
 
 	ohci1394_stop_it_ctx(s->host->ohci, s->iso_tasklet.context, 1);
@@ -1102,7 +1102,7 @@ static ssize_t amdtp_write(struct file *
 	unsigned char *p;
 	int i;
 	size_t length;
-	
+
 	if (s->packet_pool == NULL)
 		return -EBADFD;
 
@@ -1123,16 +1123,16 @@ static ssize_t amdtp_write(struct file *
 			return -EFAULT;
 		if (s->input->length < s->input->size)
 			continue;
-		
+
 		stream_flush(s);
-		
+
 		if (s->current_packet_list != NULL)
 			continue;
 
 		if (file->f_flags & O_NONBLOCK)
 			return i + length > 0 ? i + length : -EAGAIN;
 
-		if (wait_event_interruptible(s->packet_list_wait, 
+		if (wait_event_interruptible(s->packet_list_wait,
 					     !list_empty(&s->free_packet_lists)))
 			return -EINTR;
 	}
@@ -1152,7 +1152,7 @@ static int amdtp_ioctl(struct inode *ino
 	case AMDTP_IOC_CHANNEL:
 		if (copy_from_user(&cfg, (struct amdtp_ioctl *) arg, sizeof cfg))
 			return -EFAULT;
-		else 
+		else
 			return stream_configure(s, cmd, &cfg);
 
 	default:
@@ -1266,6 +1266,7 @@ static int __init amdtp_init_module (voi
 {
 	cdev_init(&amdtp_cdev, &amdtp_fops);
 	amdtp_cdev.owner = THIS_MODULE;
+	kobject_set_name(&amdtp_cdev.kobj, "amdtp");
 	if (cdev_add(&amdtp_cdev, IEEE1394_AMDTP_DEV, 16)) {
 		HPSB_ERR("amdtp: unable to add char device");
  		return -EIO;
--- diff/drivers/ieee1394/amdtp.h	2003-02-26 16:01:01.000000000 +0000
+++ source/drivers/ieee1394/amdtp.h	2004-04-21 10:45:34.257495568 +0100
@@ -24,7 +24,7 @@
  *
  * The dimension field specifies the dimension of the signal, that is,
  * the number of audio channels.  Only AMDTP_FORMAT_RAW supports
- * settings greater than 2.  
+ * settings greater than 2.
  *
  * The mode field specifies which transmission mode to use. The AMDTP
  * specifies two different transmission modes: blocking and
--- diff/drivers/ieee1394/cmp.c	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/ieee1394/cmp.c	2004-04-21 10:45:34.258495416 +0100
@@ -187,14 +187,14 @@ static int pcr_read(struct hpsb_host *ho
 	int csraddr = addr - CSR_REGISTER_BASE;
 	int plug;
 	struct cmp_host *ch;
-	
+
 	if (length != 4)
 		return RCODE_TYPE_ERROR;
 
 	ch = hpsb_get_hostinfo(&cmp_highlevel, host);
 	if (csraddr == 0x900) {
 		*buf = cpu_to_be32(ch->u.ompr_quadlet);
-		return RCODE_COMPLETE;   
+		return RCODE_COMPLETE;
 	}
 	else if (csraddr < 0x904 + ch->u.ompr.nplugs * 4) {
 		plug = (csraddr - 0x904) / 4;
@@ -206,7 +206,7 @@ static int pcr_read(struct hpsb_host *ho
 	}
 	else if (csraddr == 0x980) {
 		*buf = cpu_to_be32(ch->v.impr_quadlet);
-		return RCODE_COMPLETE;   
+		return RCODE_COMPLETE;
 	}
 	else if (csraddr < 0x984 + ch->v.impr.nplugs * 4) {
 		plug = (csraddr - 0x984) / 4;
@@ -225,10 +225,10 @@ static int pcr_lock(struct hpsb_host *ho
 	struct cmp_host *ch;
 
 	ch = hpsb_get_hostinfo(&cmp_highlevel, host);
-	
-	if (extcode != EXTCODE_COMPARE_SWAP) 
+
+	if (extcode != EXTCODE_COMPARE_SWAP)
 		return RCODE_TYPE_ERROR;
-	
+
 	if (csraddr == 0x900) {
 		/* FIXME: Ignore writes to bits 30-31 and 0-7 */
 		*store = cpu_to_be32(ch->u.ompr_quadlet);
--- diff/drivers/ieee1394/csr.c	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/ieee1394/csr.c	2004-04-21 10:45:34.258495416 +0100
@@ -130,23 +130,23 @@ static void host_reset(struct hpsb_host 
                 host->csr.state &= ~0x100;
         }
 
-        host->csr.topology_map[1] = 
+        host->csr.topology_map[1] =
                 cpu_to_be32(be32_to_cpu(host->csr.topology_map[1]) + 1);
-        host->csr.topology_map[2] = cpu_to_be32(host->node_count << 16 
+        host->csr.topology_map[2] = cpu_to_be32(host->node_count << 16
                                                 | host->selfid_count);
-        host->csr.topology_map[0] = 
+        host->csr.topology_map[0] =
                 cpu_to_be32((host->selfid_count + 2) << 16
                             | csr_crc16(host->csr.topology_map + 1,
                                         host->selfid_count + 2));
 
-        host->csr.speed_map[1] = 
+        host->csr.speed_map[1] =
                 cpu_to_be32(be32_to_cpu(host->csr.speed_map[1]) + 1);
-        host->csr.speed_map[0] = cpu_to_be32(0x3f1 << 16 
+        host->csr.speed_map[0] = cpu_to_be32(0x3f1 << 16
                                              | csr_crc16(host->csr.speed_map+1,
                                                          0x3f1));
 }
 
-/* 
+/*
  * HI == seconds (bits 0:2)
  * LO == fraction units of 1/8000 of a second, as per 1394 (bits 19:31)
  *
@@ -161,7 +161,7 @@ static void host_reset(struct hpsb_host 
 static inline void calculate_expire(struct csr_control *csr)
 {
 	unsigned long units;
-	
+
 	/* Take the seconds, and convert to units */
 	units = (unsigned long)(csr->split_timeout_hi & 0x07) << 13;
 
@@ -288,7 +288,7 @@ static void remove_host(struct hpsb_host
 }
 
 
-int hpsb_update_config_rom(struct hpsb_host *host, const quadlet_t *new_rom, 
+int hpsb_update_config_rom(struct hpsb_host *host, const quadlet_t *new_rom,
 	size_t buffersize, unsigned char rom_version)
 {
 	unsigned long flags;
@@ -296,7 +296,7 @@ int hpsb_update_config_rom(struct hpsb_h
 
 	HPSB_NOTICE("hpsb_update_config_rom() is deprecated");
 
-        spin_lock_irqsave(&host->csr.lock, flags); 
+        spin_lock_irqsave(&host->csr.lock, flags);
 	if (rom_version != host->csr.generation)
                 ret = -1;
 	else if (buffersize > host->csr.rom->cache_head->size)
@@ -329,10 +329,10 @@ static int read_maps(struct hpsb_host *h
         int csraddr = addr - CSR_REGISTER_BASE;
         const char *src;
 
-        spin_lock_irqsave(&host->csr.lock, flags); 
+        spin_lock_irqsave(&host->csr.lock, flags);
 
 	if (csraddr < CSR_SPEED_MAP) {
-                src = ((char *)host->csr.topology_map) + csraddr 
+                src = ((char *)host->csr.topology_map) + csraddr
                         - CSR_TOPOLOGY_MAP;
         } else {
                 src = ((char *)host->csr.speed_map) + csraddr - CSR_SPEED_MAP;
@@ -352,7 +352,7 @@ static int read_regs(struct hpsb_host *h
         int csraddr = addr - CSR_REGISTER_BASE;
         int oldcycle;
         quadlet_t ret;
-        
+
         if ((csraddr | length) & 0x3)
                 return RCODE_TYPE_ERROR;
 
@@ -404,7 +404,7 @@ static int read_regs(struct hpsb_host *h
                         /* cycle time wrapped around */
                         host->csr.bus_time += (1 << 7);
                 }
-                *(buf++) = cpu_to_be32(host->csr.bus_time 
+                *(buf++) = cpu_to_be32(host->csr.bus_time
                                        | (host->csr.cycle_time >> 25));
                 out;
 
@@ -464,7 +464,7 @@ static int write_regs(struct hpsb_host *
 		      quadlet_t *data, u64 addr, size_t length, u16 flags)
 {
         int csraddr = addr - CSR_REGISTER_BASE;
-        
+
         if ((csraddr | length) & 0x3)
                 return RCODE_TYPE_ERROR;
 
@@ -494,12 +494,12 @@ static int write_regs(struct hpsb_host *
                 return RCODE_ADDRESS_ERROR;
 
         case CSR_SPLIT_TIMEOUT_HI:
-                host->csr.split_timeout_hi = 
+                host->csr.split_timeout_hi =
                         be32_to_cpu(*(data++)) & 0x00000007;
 		calculate_expire(&host->csr);
                 out;
         case CSR_SPLIT_TIMEOUT_LO:
-                host->csr.split_timeout_lo = 
+                host->csr.split_timeout_lo =
                         be32_to_cpu(*(data++)) & 0xfff80000;
 		calculate_expire(&host->csr);
                 out;
--- diff/drivers/ieee1394/csr1212.c	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/ieee1394/csr1212.c	2004-04-21 10:45:34.259495264 +0100
@@ -1,6 +1,6 @@
 /*
  * csr1212.c -- IEEE 1212 Control and Status Register support for Linux
- * 
+ *
  * Copyright (C) 2003 Francois Retief <fgretief@sun.ac.za>
  *                    Steve Kinneberg <kinnebergsteve@acmsystems.com>
  *
@@ -173,7 +173,7 @@ struct csr1212_csr *csr1212_create_csr(s
 	if (!csr)
 		return NULL;
 
-	csr->cache_head = 
+	csr->cache_head =
 		csr1212_rom_cache_malloc(CSR1212_CONFIG_ROM_SPACE_OFFSET,
 					 CSR1212_CONFIG_ROM_SPACE_SIZE);
 	if (!csr->cache_head) {
@@ -238,7 +238,7 @@ static struct csr1212_keyval *csr1212_ne
 struct csr1212_keyval *csr1212_new_immediate(u_int8_t key, u_int32_t value)
 {
 	struct csr1212_keyval *kv = csr1212_new_keyval(CSR1212_KV_TYPE_IMMEDIATE, key);
-	
+
 	if (!kv)
 		return NULL;
 
@@ -253,11 +253,10 @@ struct csr1212_keyval *csr1212_new_leaf(
 
 	if (!kv)
 		return NULL;
-	
+
 	if (data_len > 0) {
 		kv->value.leaf.data = CSR1212_MALLOC(data_len);
-		if (!kv->value.leaf.data)
-		{
+		if (!kv->value.leaf.data) {
 			CSR1212_FREE(kv);
 			return NULL;
 		}
@@ -572,7 +571,7 @@ struct csr1212_keyval *csr1212_new_modif
 	CSR1212_MODIFIABLE_DESCRIPTOR_SET_MAX_SIZE(kv, max_size);
 	CSR1212_MODIFIABLE_DESCRIPTOR_SET_ADDRESS_HI(kv, address);
 	CSR1212_MODIFIABLE_DESCRIPTOR_SET_ADDRESS_LO(kv, address);
-        
+
 	return kv;
 }
 
@@ -621,7 +620,7 @@ struct csr1212_keyval *csr1212_new_keywo
 
 	/* make sure last quadlet is zeroed out */
 	*((u_int32_t*)&(buffer[(data_len - 1) & ~0x3])) = 0;
-	
+
 	/* Copy keyword(s) into leaf data buffer */
 	for (i = 0; i < strc; i++) {
 		int len = strlen(strv[i]) + 1;
@@ -643,7 +642,7 @@ void csr1212_detach_keyval_from_director
 		return;
 
 	dentry = csr1212_find_keyval(dir, kv);
-	
+
 	if (!dentry)
 		return;
 
@@ -788,8 +787,7 @@ static int csr1212_append_new_cache(stru
 		return CSR1212_ENOMEM;
 	}
 
-	if (csr1212_attach_keyval_to_directory(csr->root_kv, cache->ext_rom) != CSR1212_SUCCESS)
-	{
+	if (csr1212_attach_keyval_to_directory(csr->root_kv, cache->ext_rom) != CSR1212_SUCCESS) {
 		csr1212_release_keyval(cache->ext_rom);
 		csr->ops->release_addr(csr_addr, csr->private);
 		CSR1212_FREE(cache);
@@ -1119,12 +1117,11 @@ int csr1212_generate_csr_image(struct cs
 	/* Remove unused, excess cache regions */
 	while (cache) {
 		struct csr1212_csr_rom_cache *oc = cache;
-		
+
 		cache = cache->next;
 		csr1212_remove_cache(csr, oc);
 	}
 
-
 	/* Go through the list backward so that when done, the correct CRC
 	 * will be calculated for the Extended ROM areas. */
 	for(cache = csr->cache_tail; cache; cache = cache->prev) {
@@ -1263,7 +1260,7 @@ static inline int csr1212_parse_dir_entr
 			ret = CSR1212_ENOMEM;
 			goto fail;
 		}
-		
+
 		k->refcnt = 0;	/* Don't keep local reference when parsing. */
 		break;
 
@@ -1450,7 +1447,7 @@ int _csr1212_read_keyval(struct csr1212_
 			newcr = CSR1212_MALLOC(sizeof(struct csr1212_cache_region));
 			if (!newcr)
 				return CSR1212_ENOMEM;
-			
+
 			newcr->offset_start = cache_index & ~(csr->max_rom - 1);
 			newcr->offset_end = newcr->offset_start;
 			newcr->next = cr;
@@ -1474,7 +1471,7 @@ int _csr1212_read_keyval(struct csr1212_
 		newcr = CSR1212_MALLOC(sizeof(struct csr1212_cache_region));
 		if (!newcr)
 			return CSR1212_ENOMEM;
-			
+
 		newcr->offset_start = cache_index & ~(csr->max_rom - 1);
 		newcr->offset_end = newcr->offset_start;
 		newcr->prev = cr;
--- diff/drivers/ieee1394/csr1212.h	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/ieee1394/csr1212.h	2004-04-21 10:45:34.260495112 +0100
@@ -1,6 +1,6 @@
 /*
  * csr1212.h -- IEEE 1212 Control and Status Register support for Linux
- * 
+ *
  * Copyright (C) 2003 Francois Retief <fgretief@sun.ac.za>
  *                    Steve Kinneberg <kinnebergsteve@acmsystems.com>
  *
@@ -37,6 +37,7 @@
 #include <linux/types.h>
 #include <linux/slab.h>
 #include <linux/interrupt.h>
+#include <linux/sched.h>
 
 #define CSR1212_MALLOC(size)		kmalloc((size), in_interrupt() ? GFP_ATOMIC : GFP_KERNEL)
 #define CSR1212_FREE(ptr)		kfree(ptr)
@@ -440,7 +441,7 @@ static inline u_int32_t *CSR1212_ICON_DE
 	static const int pd[4] = { 0, 4, 16, 256 };
 	static const int cs[16] = { 4, 2 };
 	int ps = pd[CSR1212_ICON_DESCRIPTOR_LEAF_PALETTE_DEPTH(kv)];
-	
+
 	return &kv->value.leaf.data[5 +
 				    (ps * cs[CSR1212_ICON_DESCRIPTOR_LEAF_COLOR_SPACE(kv)]) /
 			   sizeof(u_int32_t)];
@@ -705,7 +706,7 @@ static inline void csr1212_release_keyva
  * _kv is a struct csr1212_keyval * that'll point to the current keyval (loop index).
  * _dir is a struct csr1212_keyval * that points to the directory to be looped.
  * _pos is a struct csr1212_dentry * that is used internally for indexing.
- * 
+ *
  * kv will be NULL upon exit of the loop.
  */
 #define csr1212_for_each_dir_entry(_csr, _kv, _dir, _pos)			\
--- diff/drivers/ieee1394/dma.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/ieee1394/dma.c	2004-04-21 10:45:34.260495112 +0100
@@ -96,7 +96,7 @@ int dma_region_alloc(struct dma_region *
 	/* fill scatter/gather list with pages */
 	for (i = 0; i < dma->n_pages; i++) {
 		unsigned long va = (unsigned long) dma->kvirt + (i << PAGE_SHIFT);
-			
+
 		dma->sglist[i].page = vmalloc_to_page((void *)va);
 		dma->sglist[i].length = PAGE_SIZE;
 	}
@@ -196,6 +196,8 @@ void dma_region_sync_for_device(struct d
 	pci_dma_sync_sg_for_device(dma->dev, &dma->sglist[first], last - first + 1, dma->direction);
 }
 
+#ifdef CONFIG_MMU
+
 /* nopage() handler for mmap access */
 
 static struct page*
@@ -251,3 +253,12 @@ int dma_region_mmap(struct dma_region *d
 
 	return 0;
 }
+
+#else /* CONFIG_MMU */
+
+int dma_region_mmap(struct dma_region *dma, struct file *file, struct vm_area_struct *vma)
+{
+	return -EINVAL;
+}
+
+#endif /* CONFIG_MMU */
--- diff/drivers/ieee1394/dma.h	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/ieee1394/dma.h	2004-04-21 10:45:34.261494960 +0100
@@ -14,7 +14,7 @@
 #include <asm/scatterlist.h>
 
 /* struct dma_prog_region
-   
+
    a small, physically-contiguous DMA buffer with random-access,
    synchronous usage characteristics
 */
@@ -37,7 +37,7 @@ static inline dma_addr_t dma_prog_region
 }
 
 /* struct dma_region
-   
+
    a large, non-physically-contiguous DMA buffer with streaming,
    asynchronous usage characteristics
 */
--- diff/drivers/ieee1394/dv1394-private.h	2003-08-20 14:16:09.000000000 +0100
+++ source/drivers/ieee1394/dv1394-private.h	2004-04-21 10:45:34.262494808 +0100
@@ -34,11 +34,11 @@
 /* none of this is exposed to user-space */
 
 
-/* 
+/*
    the 8-byte CIP (Common Isochronous Packet) header that precedes
    each packet of DV data.
 
-   See the IEC 61883 standard. 
+   See the IEC 61883 standard.
 */
 
 struct CIP_header { unsigned char b[8]; };
@@ -71,10 +71,10 @@ static inline void fill_cip_header(struc
 
 
 
-/* 
+/*
    DMA commands used to program the OHCI's DMA engine
 
-   See the Texas Instruments OHCI 1394 chipset documentation. 
+   See the Texas Instruments OHCI 1394 chipset documentation.
 */
 
 struct output_more_immediate { u32 q[8]; };
@@ -95,17 +95,17 @@ static inline void fill_output_more_imme
 	omi->q[1] = 0;
 	omi->q[2] = 0;
 	omi->q[3] = 0;
-	
+
 	/* IT packet header */
 	omi->q[4] = cpu_to_le32(  (0x0 << 16)  /* IEEE1394_SPEED_100 */
 				  | (tag << 14)
 				  | (channel << 8)
-				  | (TCODE_ISO_DATA << 4) 
+				  | (TCODE_ISO_DATA << 4)
 				  | (sync_tag) );
 
 	/* reserved field; mimic behavior of my Sony DSR-40 */
 	omi->q[5] = cpu_to_le32((payload_size << 16) | (0x7F << 8) | 0xA0);
-	
+
 	omi->q[6] = 0;
 	omi->q[7] = 0;
 }
@@ -186,11 +186,11 @@ static inline void fill_input_last(struc
 
 
 
-/* 
+/*
    A "DMA descriptor block" consists of several contiguous DMA commands.
-   struct DMA_descriptor_block encapsulates all of the commands necessary 
-   to send one packet of DV data. 
-   
+   struct DMA_descriptor_block encapsulates all of the commands necessary
+   to send one packet of DV data.
+
    There are three different types of these blocks:
 
         1) command to send an empty packet (CIP header only, no DV data):
@@ -225,44 +225,44 @@ struct DMA_descriptor_block {
 	union {
 		struct {
 			/*  iso header, common to all output block types */
-			struct output_more_immediate omi; 
-			
+			struct output_more_immediate omi;
+
 			union {
 				/* empty packet */
 				struct {
 					struct output_last ol;  /* CIP header */
 				} empty;
-			
+
 				/* full packet */
 				struct {
 					struct output_more om;  /* CIP header */
-					
+
 					union {
 				               /* payload does not cross page boundary */
 						struct {
 							struct output_last ol;  /* data payload */
 						} nocross;
-						
+
 				               /* payload crosses page boundary */
 						struct {
 							struct output_more om;  /* data payload */
 							struct output_last ol;  /* data payload */
 						} cross;
 					} u;
-					
+
 				} full;
 			} u;
 		} out;
 
 		struct {
-			struct input_last il; 
+			struct input_last il;
 		} in;
 
 	} u;
 
-	/* ensure that PAGE_SIZE % sizeof(struct DMA_descriptor_block) == 0 
+	/* ensure that PAGE_SIZE % sizeof(struct DMA_descriptor_block) == 0
 	   by padding out to 128 bytes */
-	u32 __pad__[12]; 
+	u32 __pad__[12];
 };
 
 
@@ -281,7 +281,7 @@ struct frame {
 	/* index of this frame in video_card->frames[] */
 	unsigned int frame_num;
 
-	/* FRAME_CLEAR - DMA program not set up, waiting for data 
+	/* FRAME_CLEAR - DMA program not set up, waiting for data
 	   FRAME_READY - DMA program written, ready to transmit
 
 	   Changes to these should be locked against the interrupt
@@ -290,7 +290,7 @@ struct frame {
 		FRAME_CLEAR = 0,
 		FRAME_READY
 	} state;
-	
+
 	/* whether this frame has been DMA'ed already; used only from
 	   the IRQ handler to determine whether the frame can be reset */
 	int done;
@@ -299,7 +299,7 @@ struct frame {
 	/* kernel virtual pointer to the start of this frame's data in
 	   the user ringbuffer. Use only for CPU access; to get the DMA
 	   bus address you must go through the video->user_dma mapping */
-	unsigned long data; 
+	unsigned long data;
 
 	/* Max # of packets per frame */
 #define MAX_PACKETS 500
@@ -310,7 +310,7 @@ struct frame {
 	struct CIP_header *header_pool;
 	dma_addr_t         header_pool_dma;
 
-	
+
 	/* a physically contiguous memory pool for allocating DMA
 	   descriptor blocks; usually around 64KB in size
 	   !descriptor_pool must be aligned to PAGE_SIZE! */
@@ -338,7 +338,7 @@ struct frame {
 
 	/* pointer to the first packet's CIP header (where the timestamp goes) */
 	struct CIP_header *cip_syt1;
-	
+
 	/* pointer to the second packet's CIP header
 	   (only set if the first packet was empty) */
 	struct CIP_header *cip_syt2;
@@ -384,7 +384,7 @@ static void frame_delete(struct frame *f
 static void frame_reset(struct frame *f);
 
 /* struct video_card contains all data associated with one instance
-   of the dv1394 driver 
+   of the dv1394 driver
 */
 enum modes {
 	MODE_RECEIVE,
@@ -411,7 +411,7 @@ struct video_card {
 	u32 ohci_IsoXmitContextControlSet;
 	u32 ohci_IsoXmitContextControlClear;
 	u32 ohci_IsoXmitCommandPtr;
-	
+
 	/* OHCI card IR DMA context number, -1 if not in use */
 	struct ohci1394_iso_tasklet ir_tasklet;
 	int ohci_ir_ctx;
@@ -421,10 +421,10 @@ struct video_card {
 	u32 ohci_IsoRcvContextControlClear;
 	u32 ohci_IsoRcvCommandPtr;
 	u32 ohci_IsoRcvContextMatch;
-	
-	
+
+
 	/* CONCURRENCY CONTROL */
-	
+
 	/* there are THREE levels of locking associated with video_card. */
 
 	/*
@@ -435,7 +435,7 @@ struct video_card {
 	 */
 	unsigned long open;
 
-	/* 
+	/*
 	   2) the spinlock - this provides mutual exclusion between the interrupt
 	   handler and process-context operations. Generally you must take the
 	   spinlock under the following conditions:
@@ -458,7 +458,7 @@ struct video_card {
 	/* flag to prevent spurious interrupts (which OHCI seems to
 	   generate a lot :) from accessing the struct */
 	int dma_running;
-	
+
 	/*
 	  3) the sleeping semaphore 'sem' - this is used from process context only,
 	  to serialize various operations on the video_card. Even though only one
@@ -477,24 +477,24 @@ struct video_card {
 
 	/* support asynchronous I/O signals (SIGIO) */
 	struct fasync_struct *fasync;
-	
+
 	/* the large, non-contiguous (rvmalloc()) ringbuffer for DV
            data, exposed to user-space via mmap() */
 	unsigned long      dv_buf_size;
 	struct dma_region  dv_buf;
-	
+
 	/* next byte in the ringbuffer that a write() call will fill */
 	size_t write_off;
 
 	struct frame *frames[DV1394_MAX_FRAMES];
-	
+
 	/* n_frames also serves as an indicator that this struct video_card is
 	   initialized and ready to run DMA buffers */
 
 	int n_frames;
 
 	/* this is the frame that is currently "owned" by the OHCI DMA controller
-	   (set to -1 iff DMA is not running) 
+	   (set to -1 iff DMA is not running)
 
 	   ! must lock against the interrupt handler when accessing it !
 
@@ -511,7 +511,6 @@ struct video_card {
 
 	       The interrupt handler will NEVER advance active_frame to a
 	       frame that is not READY.
-	       
 	*/
 	int active_frame;
 	int first_run;
@@ -521,10 +520,10 @@ struct video_card {
 	/* altered ONLY from process context. Must check first_clear_frame->state;
 	   if it's READY, that means the ringbuffer is full with READY frames;
 	   if it's CLEAR, that means one or more ringbuffer frames are CLEAR */
-	unsigned int first_clear_frame; 
+	unsigned int first_clear_frame;
 
 	/* altered both by process and interrupt */
-	unsigned int n_clear_frames;   
+	unsigned int n_clear_frames;
 
 	/* only altered by the interrupt */
 	unsigned int dropped_frames;
@@ -548,17 +547,17 @@ struct video_card {
 	/* the isochronous channel to use, -1 if video card is inactive */
 	int channel;
 
-	
+
 	/* physically contiguous packet ringbuffer for receive */
 	struct dma_region packet_buf;
 	unsigned long  packet_buf_size;
-	
+
 	unsigned int current_packet;
 	int first_frame; 	/* received first start frame marker? */
 	enum modes mode;
 };
 
-/* 
+/*
    if the video_card is not initialized, then the ONLY fields that are valid are:
    ohci
    open
@@ -575,7 +574,7 @@ static int do_dv1394_init_default(struct
 static void do_dv1394_shutdown(struct video_card *video, int free_user_buf);
 
 
-/* NTSC empty packet rate accurate to within 0.01%, 
+/* NTSC empty packet rate accurate to within 0.01%,
    calibrated against a Sony DSR-40 DVCAM deck */
 
 #define CIP_N_NTSC   68000000
--- diff/drivers/ieee1394/dv1394.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/ieee1394/dv1394.c	2004-04-21 10:45:34.265494352 +0100
@@ -47,11 +47,11 @@
   TODO:
 
   - tunable frame-drop behavior: either loop last frame, or halt transmission
-  
+
   - use a scatter/gather buffer for DMA programs (f->descriptor_pool)
     so that we don't rely on allocating 64KB of contiguous kernel memory
     via pci_alloc_consistent()
-    
+
   DONE:
   - during reception, better handling of dropped frames and continuity errors
   - during reception, prevent DMA from bypassing the irq tasklets
@@ -82,7 +82,7 @@
   - expose NTSC and PAL as separate devices (can be overridden)
 
 */
-     
+
 #include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/list.h>
@@ -117,7 +117,7 @@
 #include "nodemgr.h"
 #include "hosts.h"
 #include "ieee1394_core.h"
-#include "highlevel.h"	
+#include "highlevel.h"
 #include "dv1394.h"
 #include "dv1394-private.h"
 
@@ -215,7 +215,7 @@ static struct frame* frame_new(unsigned 
 
 	debug_printk("dv1394: frame_new: allocated CIP header pool at virt 0x%08lx (contig) dma 0x%08lx size %ld\n",
 		     (unsigned long) f->header_pool, (unsigned long) f->header_pool_dma, PAGE_SIZE);
-	
+
 	f->descriptor_pool_size = MAX_PACKETS * sizeof(struct DMA_descriptor_block);
 	/* make it an even # of pages */
 	f->descriptor_pool_size += PAGE_SIZE - (f->descriptor_pool_size%PAGE_SIZE);
@@ -228,10 +228,10 @@ static struct frame* frame_new(unsigned 
 		kfree(f);
 		return NULL;
 	}
-	
+
 	debug_printk("dv1394: frame_new: allocated DMA program memory at virt 0x%08lx (contig) dma 0x%08lx size %ld\n",
 		     (unsigned long) f->descriptor_pool, (unsigned long) f->descriptor_pool_dma, f->descriptor_pool_size);
-	
+
 	f->data = 0;
 	frame_reset(f);
 
@@ -248,9 +248,9 @@ static void frame_delete(struct frame *f
 
 
 
-/* 
+/*
    frame_prepare() - build the DMA program for transmitting
-   
+
    Frame_prepare() must be called OUTSIDE the video->spinlock.
    However, frame_prepare() must still be serialized, so
    it should be called WITH the video->sem taken.
@@ -265,7 +265,7 @@ static void frame_prepare(struct video_c
 	dma_addr_t block_dma;
 	struct CIP_header *cip;
 	dma_addr_t cip_dma;
-	
+
 	unsigned int n_descriptors, full_packets, packets_per_frame, payload_size;
 
 	/* these flags denote packets that need special attention */
@@ -278,7 +278,7 @@ static void frame_prepare(struct video_c
 	unsigned long irq_flags;
 
 	irq_printk("frame_prepare( %d ) ---------------------\n", this_frame);
-	
+
 	full_packets = 0;
 
 
@@ -304,7 +304,7 @@ static void frame_prepare(struct video_c
 			return;
 		}
 
-		/* the block surely won't cross a page boundary, 
+		/* the block surely won't cross a page boundary,
 		   since an even number of descriptor_blocks fit on a page */
 		block = &(f->descriptor_pool[f->n_packets]);
 
@@ -312,22 +312,22 @@ static void frame_prepare(struct video_c
 		    to the kernel base address of the descriptor pool
 		    + DMA base address of the descriptor pool */
 		block_dma = ((unsigned long) block - (unsigned long) f->descriptor_pool) + f->descriptor_pool_dma;
-		
+
 
 		/* the whole CIP pool fits on one page, so no worries about boundaries */
-		if ( ((unsigned long) &(f->header_pool[f->n_packets]) - (unsigned long) f->header_pool) 
+		if ( ((unsigned long) &(f->header_pool[f->n_packets]) - (unsigned long) f->header_pool)
 		    > PAGE_SIZE) {
 			printk(KERN_ERR "dv1394: FATAL ERROR: no room to allocate CIP header\n");
 			return;
 		}
 
 		cip = &(f->header_pool[f->n_packets]);
-		
+
 		/* DMA address of the CIP header = offset of cip
 		   relative to kernel base address of the header pool
 		   + DMA base address of the header pool */
 		cip_dma = (unsigned long) cip % PAGE_SIZE + f->header_pool_dma;
-		
+
 		/* is this an empty packet? */
 
 		if (video->cip_accum > (video->cip_d - video->cip_n)) {
@@ -362,7 +362,7 @@ static void frame_prepare(struct video_c
 				   for this purpose, because that would leave very little time to set
 				   the timestamp before DMA starts on the next frame.
 		*/
-		
+
 		if (f->n_packets == 0) {
 			first_packet = 1;
 		} else if ( full_packets == (packets_per_frame-1) ) {
@@ -370,7 +370,7 @@ static void frame_prepare(struct video_c
 		} else if (f->n_packets == packets_per_frame) {
 			mid_packet = 1;
 		}
-		
+
 
 		/********************/
 		/* setup CIP header */
@@ -396,10 +396,10 @@ static void frame_prepare(struct video_c
 		fill_cip_header(cip,
 				/* the node ID number of the OHCI card */
 				reg_read(video->ohci, OHCI1394_NodeID) & 0x3F,
-				video->continuity_counter, 
+				video->continuity_counter,
 				video->pal_or_ntsc,
 				0xFFFF /* the timestamp is filled in later */);
-		
+
 		/* advance counter, only for full packets */
 		if ( ! empty_packet )
 			video->continuity_counter++;
@@ -423,7 +423,7 @@ static void frame_prepare(struct video_c
 
 					  sizeof(struct CIP_header), /* data size */
 					  cip_dma);
-			
+
 			if (first_packet)
 				f->frame_begin_timestamp = &(block->u.out.u.empty.ol.q[3]);
 			else if (mid_packet)
@@ -445,7 +445,7 @@ static void frame_prepare(struct video_c
 					  sizeof(struct CIP_header), /* data size */
 					  cip_dma);
 
-			
+
 			/* third (and possibly fourth) descriptor - for DV data */
 			/* the 480-byte payload can cross a page boundary; if so,
 			   we need to split it into two DMA descriptors */
@@ -464,9 +464,9 @@ static void frame_prepare(struct video_c
 									   data_p - (unsigned long) video->dv_buf.kvirt));
 
 				fill_output_last( &(block->u.out.u.full.u.cross.ol),
-					  
+
 						  /* want completion status on all interesting packets */
-						  (first_packet || mid_packet || last_packet) ? 1 : 0, 
+						  (first_packet || mid_packet || last_packet) ? 1 : 0,
 
 						  /* want interrupt on all interesting packets */
 						  (first_packet || mid_packet || last_packet) ? 1 : 0,
@@ -492,14 +492,14 @@ static void frame_prepare(struct video_c
 				n_descriptors = 5;
 				if (first_packet)
 					f->first_n_descriptors = n_descriptors;
-				
+
 				full_packets++;
 
 			} else {
 				/* fits on one page */
 
 				fill_output_last( &(block->u.out.u.full.u.nocross.ol),
-					  
+
 						  /* want completion status on all interesting packets */
 						  (first_packet || mid_packet || last_packet) ? 1 : 0,
 
@@ -508,11 +508,11 @@ static void frame_prepare(struct video_c
 
 						  480, /* data size (480 bytes of DV data) */
 
-						  
+
 						  /* DMA address of data_p */
 						  dma_region_offset_to_bus(&video->dv_buf,
 									   data_p - (unsigned long) video->dv_buf.kvirt));
-				
+
 				if (first_packet)
 					f->frame_begin_timestamp = &(block->u.out.u.full.u.nocross.ol.q[3]);
 				else if (mid_packet)
@@ -531,8 +531,8 @@ static void frame_prepare(struct video_c
 				full_packets++;
 			}
 		}
-		
-		/* link this descriptor block into the DMA program by filling in 
+
+		/* link this descriptor block into the DMA program by filling in
 		   the branch address of the previous block */
 
 		/* note: we are not linked into the active DMA chain yet */
@@ -545,10 +545,10 @@ static void frame_prepare(struct video_c
 
 
 		f->n_packets++;
-		
+
 	}
 
-	/* when we first assemble a new frame, set the final branch 
+	/* when we first assemble a new frame, set the final branch
 	   to loop back up to the top */
 	*(f->frame_end_branch) = cpu_to_le32(f->descriptor_pool_dma | f->first_n_descriptors);
 
@@ -572,11 +572,11 @@ static void frame_prepare(struct video_c
 		   this_frame, video->active_frame, video->n_clear_frames, video->first_clear_frame, last_frame);
 
 	irq_printk("   begin_ts %08lx mid_ts %08lx end_ts %08lx end_br %08lx\n",
-		   (unsigned long) f->frame_begin_timestamp, 
-		   (unsigned long) f->mid_frame_timestamp, 
-		   (unsigned long) f->frame_end_timestamp, 
+		   (unsigned long) f->frame_begin_timestamp,
+		   (unsigned long) f->mid_frame_timestamp,
+		   (unsigned long) f->frame_end_timestamp,
 		   (unsigned long) f->frame_end_branch);
-	
+
 	if (video->active_frame != -1) {
 
 		/* if DMA is already active, we are almost done */
@@ -589,7 +589,7 @@ static void frame_prepare(struct video_c
 
 			/* this write MUST precede the next one, or we could silently drop frames */
 			wmb();
-			
+
 			/* disable the want_status semaphore on the last packet */
 			temp = le32_to_cpu(*(video->frames[last_frame]->frame_end_branch - 2));
 			temp &= 0xF7CFFFFF;
@@ -605,7 +605,7 @@ static void frame_prepare(struct video_c
 			   dropped frame. Hopefully this window is too
 			   small to really matter, and the consequence
 			   is rather harmless. */
-			
+
 
 			irq_printk("     new frame %d linked onto DMA chain\n", this_frame);
 
@@ -614,13 +614,13 @@ static void frame_prepare(struct video_c
 		}
 
 	} else {
-		
+
 		u32 transmit_sec, transmit_cyc;
 		u32 ts_cyc, ts_off;
 
 		/* DMA is stopped, so this is the very first frame */
 		video->active_frame = this_frame;
-		
+
 	        /* set CommandPtr to address and size of first descriptor block */
 		reg_write(video->ohci, video->ohci_IsoXmitCommandPtr,
 			  video->frames[video->active_frame]->descriptor_pool_dma |
@@ -641,7 +641,7 @@ static void frame_prepare(struct video_c
 
 		transmit_sec += transmit_cyc/8000;
 		transmit_cyc %= 8000;
-		
+
 		ts_off = ct_off;
 		ts_cyc = transmit_cyc + 3;
 		ts_cyc %= 8000;
@@ -657,7 +657,7 @@ static void frame_prepare(struct video_c
 			f->cip_syt2->b[6] = f->assigned_timestamp >> 8;
 			f->cip_syt2->b[7] = f->assigned_timestamp & 0xFF;
 		}
-		
+
 		/* --- start DMA --- */
 
 		/* clear all bits in ContextControl register */
@@ -668,8 +668,8 @@ static void frame_prepare(struct video_c
 		/* the OHCI card has the ability to start ISO transmission on a
 		   particular cycle (start-on-cycle). This way we can ensure that
 		   the first DV frame will have an accurate timestamp.
-		   
-		   However, start-on-cycle only appears to work if the OHCI card 
+
+		   However, start-on-cycle only appears to work if the OHCI card
 		   is cycle master! Since the consequences of messing up the first
 		   timestamp are minimal*, just disable start-on-cycle for now.
 
@@ -690,7 +690,7 @@ static void frame_prepare(struct video_c
 		/* set the 'run' bit */
 		reg_write(video->ohci, video->ohci_IsoXmitContextControlSet, 0x8000);
 		flush_pci_write(video->ohci);
-		
+
 		/* --- DMA should be running now --- */
 
 		debug_printk("    Cycle = %4u ContextControl = %08x CmdPtr = %08x\n",
@@ -715,19 +715,19 @@ static void frame_prepare(struct video_c
 				i++;
 			}
 
-			printk("set = %08x, cmdPtr = %08x\n", 
+			printk("set = %08x, cmdPtr = %08x\n",
 			       reg_read(video->ohci, video->ohci_IsoXmitContextControlSet),
 			       reg_read(video->ohci, video->ohci_IsoXmitCommandPtr)
 			       );
-			
+
 			if ( ! (reg_read(video->ohci, video->ohci_IsoXmitContextControlSet) &  (1 << 10)) ) {
-				printk("DMA did NOT go active after 20ms, event = %x\n", 
+				printk("DMA did NOT go active after 20ms, event = %x\n",
 				       reg_read(video->ohci, video->ohci_IsoXmitContextControlSet) & 0x1F);
 			} else
 				printk("DMA is RUNNING!\n");
 		}
 #endif
-		
+
 	}
 
 
@@ -738,11 +738,11 @@ static void frame_prepare(struct video_c
 
 /*** RECEIVE FUNCTIONS *****************************************************/
 
-/* 
+/*
 	frame method put_packet
 
-	map and copy the packet data to its location in the frame 
-	based upon DIF section and sequence 
+	map and copy the packet data to its location in the frame
+	based upon DIF section and sequence
 */
 
 static void inline
@@ -754,28 +754,28 @@ frame_put_packet (struct frame *f, struc
 
 	/* sanity check */
 	if (dif_sequence > 11 || dif_block > 149) return;
-		
+
 	switch (section_type) {
 	case 0:           /* 1 Header block */
 	        memcpy( (void *) f->data + dif_sequence * 150 * 80, p->data, 480);
 	        break;
-	
+
 	case 1:           /* 2 Subcode blocks */
 	        memcpy( (void *) f->data + dif_sequence * 150 * 80 + (1 + dif_block) * 80, p->data, 480);
 	        break;
-	
+
 	case 2:           /* 3 VAUX blocks */
 	        memcpy( (void *) f->data + dif_sequence * 150 * 80 + (3 + dif_block) * 80, p->data, 480);
 	        break;
-	
+
 	case 3:           /* 9 Audio blocks interleaved with video */
 	        memcpy( (void *) f->data + dif_sequence * 150 * 80 + (6 + dif_block * 16) * 80, p->data, 480);
 	        break;
-	
+
 	case 4:           /* 135 Video blocks interleaved with audio */
 	        memcpy( (void *) f->data + dif_sequence * 150 * 80 + (7 + (dif_block / 15) + dif_block) * 80, p->data, 480);
 	        break;
-	
+
 	default:           /* we can not handle any other data */
 	        break;
 	}
@@ -786,25 +786,25 @@ static void start_dma_receive(struct vid
 {
 	if (video->first_run == 1) {
 		video->first_run = 0;
-		
+
 		/* start DMA once all of the frames are READY */
 		video->n_clear_frames = 0;
 		video->first_clear_frame = -1;
 		video->current_packet = 0;
 		video->active_frame = 0;
-		
+
 		/* reset iso recv control register */
 		reg_write(video->ohci, video->ohci_IsoRcvContextControlClear, 0xFFFFFFFF);
 		wmb();
-		
+
 		/* clear bufferFill, set isochHeader and speed (0=100) */
 		reg_write(video->ohci, video->ohci_IsoRcvContextControlSet, 0x40000000);
-	
+
 		/* match on all tags, listen on channel */
 		reg_write(video->ohci, video->ohci_IsoRcvContextMatch, 0xf0000000 | video->channel);
-		
+
 		/* address and first descriptor block + Z=1 */
-		reg_write(video->ohci, video->ohci_IsoRcvCommandPtr,             
+		reg_write(video->ohci, video->ohci_IsoRcvCommandPtr,
 			  video->frames[0]->descriptor_pool_dma | 1); /* Z=1 */
 		wmb();
 
@@ -813,13 +813,13 @@ static void start_dma_receive(struct vid
 		/* run */
 		reg_write(video->ohci, video->ohci_IsoRcvContextControlSet, 0x8000);
 		flush_pci_write(video->ohci);
-		
+
 		debug_printk("dv1394: DMA started\n");
-	
+
 #if DV1394_DEBUG_LEVEL >= 2
 		{
 			int i;
-		
+
 			for (i = 0; i < 1000; ++i) {
 				mdelay(1);
 				if (reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) & (1 << 10)) {
@@ -828,15 +828,14 @@ static void start_dma_receive(struct vid
 				}
 			}
 			if ( reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) &  (1 << 11) ) {
-				printk("DEAD, event = %x\n", 
+				printk("DEAD, event = %x\n",
 					   reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) & 0x1F);
 			} else
 				printk("RUNNING!\n");
 		}
 #endif
-	} 
-	else if ( reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) &  (1 << 11) ) {
-		debug_printk("DEAD, event = %x\n", 
+	} else if ( reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) &  (1 << 11) ) {
+		debug_printk("DEAD, event = %x\n",
 			     reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) & 0x1F);
 
 		/* wake */
@@ -845,7 +844,7 @@ static void start_dma_receive(struct vid
 }
 
 
-/* 
+/*
    receive_packets() - build the DMA program for receiving
 */
 
@@ -875,24 +874,24 @@ static void receive_packets(struct video
 			/* locate a descriptor block and packet from the buffer */
 			block = &(f->descriptor_pool[i]);
 			block_dma = ((unsigned long) block - (unsigned long) f->descriptor_pool) + f->descriptor_pool_dma;
-			
+
 			data = ((struct packet*)video->packet_buf.kvirt) + f->frame_num * MAX_PACKETS + i;
-			data_dma = dma_region_offset_to_bus( &video->packet_buf, 
+			data_dma = dma_region_offset_to_bus( &video->packet_buf,
 							     ((unsigned long) data - (unsigned long) video->packet_buf.kvirt) );
-			
+
 			/* setup DMA descriptor block */
 			want_interrupt = ((i % (MAX_PACKETS/2)) == 0 || i == (MAX_PACKETS-1));
 			fill_input_last( &(block->u.in.il), want_interrupt, 512, data_dma);
-	
+
 			/* link descriptors */
 			last_branch_address = f->frame_end_branch;
-	
+
 			if (last_branch_address != NULL)
 				*(last_branch_address) = cpu_to_le32(block_dma | 1); /* set Z=1 */
-	
+
 			f->frame_end_branch = &(block->u.in.il.q[2]);
 		}
-	
+
 	} /* next j */
 
 	spin_unlock_irqrestore(&video->spinlock, irq_flags);
@@ -913,7 +912,7 @@ static int do_dv1394_init(struct video_c
 	debug_printk("dv1394: initialising %d\n", video->id);
 	if (init->api_version != DV1394_API_VERSION)
 		return -EINVAL;
-	
+
 	/* first sanitize all the parameters */
 	if ( (init->n_frames < 2) || (init->n_frames > DV1394_MAX_FRAMES) )
 		return -EINVAL;
@@ -949,7 +948,7 @@ static int do_dv1394_init(struct video_c
 	/* (the card should not be reset if the parameters are screwy) */
 
 	do_dv1394_shutdown(video, 0);
-	
+
 	/* try to claim the ISO channel */
 	spin_lock_irqsave(&video->ohci->IR_channel_lock, flags);
 	if (video->ohci->ISO_channel_usage & chan_mask) {
@@ -991,19 +990,19 @@ static int do_dv1394_init(struct video_c
 	}
 
 	video->syt_offset = init->syt_offset;
-	
+
 	/* find and claim DMA contexts on the OHCI card */
 
 	if (video->ohci_it_ctx == -1) {
 		ohci1394_init_iso_tasklet(&video->it_tasklet, OHCI_ISO_TRANSMIT,
 					  it_tasklet_func, (unsigned long) video);
 
-		if (ohci1394_register_iso_tasklet(video->ohci, &video->it_tasklet) < 0) {	
+		if (ohci1394_register_iso_tasklet(video->ohci, &video->it_tasklet) < 0) {
 			printk(KERN_ERR "dv1394: could not find an available IT DMA context\n");
 			retval = -EBUSY;
 			goto err;
 		}
-		
+
 		video->ohci_it_ctx = video->it_tasklet.context;
 		debug_printk("dv1394: claimed IT DMA context %d\n", video->ohci_it_ctx);
 	}
@@ -1020,7 +1019,7 @@ static int do_dv1394_init(struct video_c
 		video->ohci_ir_ctx = video->ir_tasklet.context;
 		debug_printk("dv1394: claimed IR DMA context %d\n", video->ohci_ir_ctx);
 	}
-	
+
 	/* allocate struct frames */
 	for (i = 0; i < init->n_frames; i++) {
 		video->frames[i] = frame_new(i, video);
@@ -1037,14 +1036,14 @@ static int do_dv1394_init(struct video_c
 		retval = dma_region_alloc(&video->dv_buf, new_buf_size, video->ohci->dev, PCI_DMA_TODEVICE);
 		if (retval)
 			goto err;
-					  
+
 		video->dv_buf_size = new_buf_size;
 
 		debug_printk("dv1394: Allocated %d frame buffers, total %u pages (%u DMA pages), %lu bytes\n", 
 			     video->n_frames, video->dv_buf.n_pages,
 			     video->dv_buf.n_dma_pages, video->dv_buf_size);
 	}
-	
+
 	/* set up the frame->data pointers */
 	for (i = 0; i < video->n_frames; i++)
 		video->frames[i]->data = (unsigned long) video->dv_buf.kvirt + i * video->frame_size;
@@ -1054,17 +1053,17 @@ static int do_dv1394_init(struct video_c
 		video->packet_buf_size = sizeof(struct packet) * video->n_frames * MAX_PACKETS;
 		if (video->packet_buf_size % PAGE_SIZE)
 			video->packet_buf_size += PAGE_SIZE - (video->packet_buf_size % PAGE_SIZE);
-		
+
 		retval = dma_region_alloc(&video->packet_buf, video->packet_buf_size,
 					  video->ohci->dev, PCI_DMA_FROMDEVICE);
 		if (retval)
 			goto err;
-		
-		debug_printk("dv1394: Allocated %d packets in buffer, total %u pages (%u DMA pages), %lu bytes\n", 
+
+		debug_printk("dv1394: Allocated %d packets in buffer, total %u pages (%u DMA pages), %lu bytes\n",
 				 video->n_frames*MAX_PACKETS, video->packet_buf.n_pages,
 				 video->packet_buf.n_dma_pages, video->packet_buf_size);
 	}
-	
+
 	/* set up register offsets for IT context */
 	/* IT DMA context registers are spaced 16 bytes apart */
 	video->ohci_IsoXmitContextControlSet = OHCI1394_IsoXmitContextControlSet+16*video->ohci_it_ctx;
@@ -1085,7 +1084,7 @@ static int do_dv1394_init(struct video_c
 	/* enable interrupts for IR context */
 	reg_write(video->ohci, OHCI1394_IsoRecvIntMaskSet, (1 << video->ohci_ir_ctx) );
 	debug_printk("dv1394: interrupts enabled for IR context %d\n", video->ohci_ir_ctx);
-	
+
 	return 0;
 
 err:
@@ -1105,7 +1104,7 @@ static int do_dv1394_init_default(struct
 	/* the following are now set via devfs */
 	init.channel = video->channel;
 	init.format = video->pal_or_ntsc;
-	init.cip_n = video->cip_n; 
+	init.cip_n = video->cip_n;
 	init.cip_d = video->cip_d;
 	init.syt_offset = video->syt_offset;
 
@@ -1135,17 +1134,17 @@ static void stop_dma(struct video_card *
 		reg_write(video->ohci, video->ohci_IsoXmitContextControlClear, (1 << 15));
 		reg_write(video->ohci, video->ohci_IsoRcvContextControlClear, (1 << 15));
 		flush_pci_write(video->ohci);
-		
+
 		video->active_frame = -1;
 		video->first_run = 1;
-		
+
 		/* wait until DMA really stops */
 		i = 0;
 		while (i < 1000) {
-				
+
 			/* wait 0.1 millisecond */
-			udelay(100); 
-			
+			udelay(100);
+
 			if ( (reg_read(video->ohci, video->ohci_IsoXmitContextControlClear) & (1 << 10)) ||
 			    (reg_read(video->ohci, video->ohci_IsoRcvContextControlClear)  & (1 << 10)) ) {
 				/* still active */
@@ -1155,10 +1154,10 @@ static void stop_dma(struct video_card *
 				debug_printk("dv1394: stop_dma: DMA stopped safely after %d ms\n", i/10);
 				break;
 			}
-				
+
 			i++;
 		}
-			
+
 		if (i == 1000) {
 			printk(KERN_ERR "dv1394: stop_dma: DMA still going after %d ms!\n", i/10);
 		}
@@ -1175,12 +1174,12 @@ out:
 static void do_dv1394_shutdown(struct video_card *video, int free_dv_buf)
 {
 	int i;
-	
+
 	debug_printk("dv1394: shutdown...\n");
 
 	/* stop DMA if in progress */
 	stop_dma(video);
-	
+
 	/* release the DMA contexts */
 	if (video->ohci_it_ctx != -1) {
 		video->ohci_IsoXmitContextControlSet = 0;
@@ -1189,7 +1188,7 @@ static void do_dv1394_shutdown(struct vi
 
 		/* disable interrupts for IT context */
 		reg_write(video->ohci, OHCI1394_IsoXmitIntMaskClear, (1 << video->ohci_it_ctx));
-		
+
 		/* remove tasklet */
 		ohci1394_unregister_iso_tasklet(video->ohci, &video->it_tasklet);
 		debug_printk("dv1394: IT context %d released\n", video->ohci_it_ctx);
@@ -1215,16 +1214,16 @@ static void do_dv1394_shutdown(struct vi
 	if (video->channel != -1) {
 		u64 chan_mask;
 		unsigned long flags;
-		
+
 		chan_mask = (u64)1 << video->channel;
-		
+
 		spin_lock_irqsave(&video->ohci->IR_channel_lock, flags);
 		video->ohci->ISO_channel_usage &= ~(chan_mask);
 		spin_unlock_irqrestore(&video->ohci->IR_channel_lock, flags);
-		
+
 		video->channel = -1;
 	}
-	
+
 	/* free the frame structs */
 	for (i = 0; i < DV1394_MAX_FRAMES; i++) {
 		if (video->frames[i])
@@ -1233,10 +1232,10 @@ static void do_dv1394_shutdown(struct vi
 	}
 
 	video->n_frames = 0;
-		
+
 	/* we can't free the DMA buffer unless it is guaranteed that
 	   no more user-space mappings exist */
-	
+
 	if (free_dv_buf) {
 		dma_region_free(&video->dv_buf);
 		video->dv_buf_size = 0;
@@ -1324,11 +1323,11 @@ static int dv1394_fasync(int fd, struct 
 {
 	/* I just copied this code verbatim from Alan Cox's mouse driver example
 	   (linux/Documentation/DocBook/) */
-	
+
 	struct video_card *video = file_to_video_card(file);
-	
+
 	int retval = fasync_helper(fd, file, on, &video->fasync);
-	 
+
 	if (retval < 0)
 		return retval;
         return 0;
@@ -1362,19 +1361,19 @@ static ssize_t dv1394_write(struct file 
 
 	ret = 0;
 	add_wait_queue(&video->waitq, &wait);
-	
+
 	while (count > 0) {
 
 		/* must set TASK_INTERRUPTIBLE *before* checking for free
 		   buffers; otherwise we could miss a wakeup if the interrupt
 		   fires between the check and the schedule() */
-		
+
 		set_current_state(TASK_INTERRUPTIBLE);
-		
+
 		spin_lock_irqsave(&video->spinlock, flags);
-		
+
 		target_frame = video->first_clear_frame;
-		
+
 		spin_unlock_irqrestore(&video->spinlock, flags);
 
 		if (video->frames[target_frame]->state == FRAME_CLEAR) {
@@ -1390,7 +1389,7 @@ static ssize_t dv1394_write(struct file 
 		if (cnt > count)
 			cnt = count;
 
-		if (cnt <= 0) { 
+		if (cnt <= 0) {
 			/* no room left, gotta wait */
 			if (file->f_flags & O_NONBLOCK) {
 				if (!ret)
@@ -1404,7 +1403,7 @@ static ssize_t dv1394_write(struct file 
 			}
 
 			schedule();
-			
+
 			continue; /* start over from 'while(count > 0)...' */
 		}
 
@@ -1423,7 +1422,7 @@ static ssize_t dv1394_write(struct file 
 		if (video->write_off == video->frame_size * ((target_frame + 1) % video->n_frames))
 				frame_prepare(video, target_frame);
 	}
-	
+
 	remove_wait_queue(&video->waitq, &wait);
 	set_current_state(TASK_RUNNING);
 	up(&video->sem);
@@ -1456,9 +1455,9 @@ static ssize_t dv1394_read(struct file *
 			return ret;
 		}
 		video->continuity_counter = -1;
-		
+
 		receive_packets(video);
-		
+
 		start_dma_receive(video);
 	}
 
@@ -1470,7 +1469,7 @@ static ssize_t dv1394_read(struct file *
 		/* must set TASK_INTERRUPTIBLE *before* checking for free
 		   buffers; otherwise we could miss a wakeup if the interrupt
 		   fires between the check and the schedule() */
-		
+
 		set_current_state(TASK_INTERRUPTIBLE);
 
 		spin_lock_irqsave(&video->spinlock, flags);
@@ -1494,7 +1493,7 @@ static ssize_t dv1394_read(struct file *
 		if (cnt > count)
 			cnt = count;
 
-		if (cnt <= 0) { 
+		if (cnt <= 0) {
 			/* no room left, gotta wait */
 			if (file->f_flags & O_NONBLOCK) {
 				if (!ret)
@@ -1508,7 +1507,7 @@ static ssize_t dv1394_read(struct file *
 			}
 
 			schedule();
-			
+
 			continue; /* start over from 'while(count > 0)...' */
 		}
 
@@ -1531,7 +1530,7 @@ static ssize_t dv1394_read(struct file *
 			spin_unlock_irqrestore(&video->spinlock, flags);
 		}
 	}
-	
+
 	remove_wait_queue(&video->waitq, &wait);
 	set_current_state(TASK_RUNNING);
 	up(&video->sem);
@@ -1579,19 +1578,19 @@ static int dv1394_ioctl(struct inode *in
 			ret = -EINVAL;
 			goto out;
 		}
-			
+
 		while (n_submit > 0) {
 
 			add_wait_queue(&video->waitq, &wait);
 			set_current_state(TASK_INTERRUPTIBLE);
-				
+
 			spin_lock_irqsave(&video->spinlock, flags);
 
 			/* wait until video->first_clear_frame is really CLEAR */
 			while (video->frames[video->first_clear_frame]->state != FRAME_CLEAR) {
 
 				spin_unlock_irqrestore(&video->spinlock, flags);
-					
+
 				if (signal_pending(current)) {
 					remove_wait_queue(&video->waitq, &wait);
 					set_current_state(TASK_RUNNING);
@@ -1601,14 +1600,14 @@ static int dv1394_ioctl(struct inode *in
 
 				schedule();
 				set_current_state(TASK_INTERRUPTIBLE);
-				
+
 				spin_lock_irqsave(&video->spinlock, flags);
 			}
 			spin_unlock_irqrestore(&video->spinlock, flags);
 
 			remove_wait_queue(&video->waitq, &wait);
 			set_current_state(TASK_RUNNING);
-				
+
 			frame_prepare(video, video->first_clear_frame);
 
 			n_submit--;
@@ -1625,7 +1624,7 @@ static int dv1394_ioctl(struct inode *in
 			ret = -EINVAL;
 			goto out;
 		}
-		
+
 		n_wait = (unsigned int) arg;
 
 		/* since we re-run the last frame on underflow, we will
@@ -1636,16 +1635,16 @@ static int dv1394_ioctl(struct inode *in
 			ret = -EINVAL;
 			goto out;
 		}
-			
+
 		add_wait_queue(&video->waitq, &wait);
 		set_current_state(TASK_INTERRUPTIBLE);
-		
+
 		spin_lock_irqsave(&video->spinlock, flags);
 
 		while (video->n_clear_frames < n_wait) {
-			
+
 			spin_unlock_irqrestore(&video->spinlock, flags);
-					
+
 			if (signal_pending(current)) {
 				remove_wait_queue(&video->waitq, &wait);
 				set_current_state(TASK_RUNNING);
@@ -1655,7 +1654,7 @@ static int dv1394_ioctl(struct inode *in
 
 			schedule();
 			set_current_state(TASK_INTERRUPTIBLE);
-			
+
 			spin_lock_irqsave(&video->spinlock, flags);
 		}
 
@@ -1674,7 +1673,7 @@ static int dv1394_ioctl(struct inode *in
 			ret = -EINVAL;
 			goto out;
 		}
-		
+
 		n_recv = (unsigned int) arg;
 
 		/* at least one frame must be active */
@@ -1682,7 +1681,7 @@ static int dv1394_ioctl(struct inode *in
 			ret = -EINVAL;
 			goto out;
 		}
-			
+
 		spin_lock_irqsave(&video->spinlock, flags);
 
 		/* release the clear frames */
@@ -1693,7 +1692,7 @@ static int dv1394_ioctl(struct inode *in
 
 		/* reset dropped_frames */
 		video->dropped_frames = 0;
-			
+
 		spin_unlock_irqrestore(&video->spinlock, flags);
 
 		ret = 0;
@@ -1706,11 +1705,11 @@ static int dv1394_ioctl(struct inode *in
 			if (ret)
 				goto out;
 		}
-	
+
 		video->continuity_counter = -1;
-		
+
 		receive_packets(video);
-		
+
 		start_dma_receive(video);
 
 		ret = 0;
@@ -1765,7 +1764,7 @@ static int dv1394_ioctl(struct inode *in
 
 		/* reset dropped_frames */
 		video->dropped_frames = 0;
-			
+
 		spin_unlock_irqrestore(&video->spinlock, flags);
 
 		if (copy_to_user((void*)arg, &status, sizeof(status))) {
@@ -1798,11 +1797,11 @@ static int dv1394_open(struct inode *ino
 	   has already been set to video by devfs */
 	if (file->private_data) {
 		video = (struct video_card*) file->private_data;
-		
+
 	} else {
 		/* look up the card by ID */
 		unsigned long flags;
-		
+
 		spin_lock_irqsave(&dv1394_cards_lock, flags);
 		if (!list_empty(&dv1394_cards)) {
 			struct video_card *p;
@@ -1819,10 +1818,10 @@ static int dv1394_open(struct inode *ino
 			debug_printk("dv1394: OHCI card %d not found", ieee1394_file_to_instance(file));
 			return -ENODEV;
 		}
-		
+
 		file->private_data = (void*) video;
 	}
-	
+
 #ifndef DV1394_ALLOW_MORE_THAN_ONE_OPEN
 
 	if ( test_and_set_bit(0, &video->open) ) {
@@ -1845,7 +1844,7 @@ static int dv1394_release(struct inode *
 
 	/* clean up async I/O users */
 	dv1394_fasync(-1, file, 0);
-	
+
 	/* give someone else a turn */
 	clear_bit(0, &video->open);
 
@@ -1865,19 +1864,19 @@ static void it_tasklet_func(unsigned lon
 	if (!video->dma_running)
 		goto out;
 
-	irq_printk("ContextControl = %08x, CommandPtr = %08x\n", 
+	irq_printk("ContextControl = %08x, CommandPtr = %08x\n",
 	       reg_read(video->ohci, video->ohci_IsoXmitContextControlSet),
 	       reg_read(video->ohci, video->ohci_IsoXmitCommandPtr)
 	       );
 
-	
+
 	if ( (video->ohci_it_ctx != -1) &&
 	    (reg_read(video->ohci, video->ohci_IsoXmitContextControlSet) & (1 << 10)) ) {
 
 		struct frame *f;
 		unsigned int frame, i;
 
-		
+
 		if (video->active_frame == -1)
 			frame = 0;
 		else
@@ -1901,7 +1900,7 @@ static void it_tasklet_func(unsigned lon
 				int prev_frame;
 				struct frame *prev_f;
 
-				
+
 
 				/* don't reset, need this later *(f->frame_begin_timestamp) = 0; */
 				irq_printk("  BEGIN\n");
@@ -1910,11 +1909,11 @@ static void it_tasklet_func(unsigned lon
 				if (prev_frame == -1)
 					prev_frame += video->n_frames;
 				prev_f = video->frames[prev_frame];
-				
+
 				/* make sure we can actually garbage collect
 				   this frame */
 				if ( (prev_f->state == FRAME_READY) &&
-				    prev_f->done && (!f->done) ) 
+				    prev_f->done && (!f->done) )
 				{
 					frame_reset(prev_f);
 					video->n_clear_frames++;
@@ -1929,7 +1928,7 @@ static void it_tasklet_func(unsigned lon
 				f->done = 1;
 			}
 
-		     
+
 			/* see if we need to set the timestamp for the next frame */
 			if ( *(f->mid_frame_timestamp) ) {
 				struct frame *next_frame;
@@ -1957,9 +1956,9 @@ static void it_tasklet_func(unsigned lon
 				   plus the length of the last frame sent, plus the syt latency */
 				ts_cyc = begin_ts & 0xF;
 				/* advance one frame, plus syt latency (typically 2-3) */
-				ts_cyc += f->n_packets + video->syt_offset ; 
+				ts_cyc += f->n_packets + video->syt_offset ;
 
-				ts_off = 0; 
+				ts_off = 0;
 
 				ts_cyc += ts_off/3072;
 				ts_off %= 3072;
@@ -1986,14 +1985,12 @@ static void it_tasklet_func(unsigned lon
 				video->dropped_frames++;
 			}
 
-
-		
 		} /* for (each frame) */
 	}
 
 	if (wake) {
 		kill_fasync(&video->fasync, SIGIO, POLL_OUT);
-		
+
 		/* wake readers/writers/ioctl'ers */
 		wake_up_interruptible(&video->waitq);
 	}
@@ -2011,10 +2008,9 @@ static void ir_tasklet_func(unsigned lon
 
 	if (!video->dma_running)
 		goto out;
-	
+
 	if ( (video->ohci_ir_ctx != -1) &&
-	    (reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) & (1 << 10)) )
-	{ 
+	    (reg_read(video->ohci, video->ohci_IsoRcvContextControlSet) & (1 << 10)) ) {
 
 		int sof=0; /* start-of-frame flag */
 		struct frame *f;
@@ -2036,14 +2032,14 @@ static void ir_tasklet_func(unsigned lon
 			dma_region_sync_for_cpu(&video->packet_buf,
 						(unsigned long) p - (unsigned long) video->packet_buf.kvirt,
 						sizeof(struct packet));
-					
+
 			packet_length = le16_to_cpu(p->data_length);
 			packet_time   = le16_to_cpu(p->timestamp);
-	
+
 			irq_printk("received packet %02d, timestamp=%04x, length=%04x, sof=%02x%02x\n", video->current_packet,
-				   packet_time, packet_length, 
+				   packet_time, packet_length,
 				   p->data[0], p->data[1]);
-			
+
 			/* get the descriptor based on packet_buffer cursor */
 			f = video->frames[video->current_packet / MAX_PACKETS];
 			block = &(f->descriptor_pool[video->current_packet % MAX_PACKETS]);
@@ -2053,14 +2049,14 @@ static void ir_tasklet_func(unsigned lon
 
 			/* get the current frame */
 			f = video->frames[video->active_frame];
-		
+
 			/* exclude empty packet */
 			if (packet_length > 8 && xferstatus == 0x11) {
 				/* check for start of frame */
-				/* DRD> Changed to check section type ([0]>>5==0) 
+				/* DRD> Changed to check section type ([0]>>5==0)
 				   and dif sequence ([1]>>4==0) */
 				sof = ( (p->data[0] >> 5) == 0 && (p->data[1] >> 4) == 0);
-	
+
 				dbc = (int) (p->cip_h1 >> 24);
 				if ( video->continuity_counter != -1 && dbc > ((video->continuity_counter + 1) % 256) )
 				{
@@ -2071,12 +2067,12 @@ static void ir_tasklet_func(unsigned lon
 					video->first_clear_frame = -1;
 				}
 				video->continuity_counter = dbc;
-				
+
 				if (!video->first_frame) {
 					if (sof) {
 						video->first_frame = 1;
 					}
-	
+
 				} else if (sof) {
 					/* close current frame */
 					frame_reset(f);  /* f->state = STATE_CLEAR */
@@ -2089,7 +2085,7 @@ static void ir_tasklet_func(unsigned lon
 					}
 					if (video->first_clear_frame == -1)
 						video->first_clear_frame = video->active_frame;
-	
+
 					/* get the next frame */
 					video->active_frame = (video->active_frame + 1) % video->n_frames;
 					f = video->frames[video->active_frame];
@@ -2101,22 +2097,22 @@ static void ir_tasklet_func(unsigned lon
 						/* open next frame */
 						f->state = FRAME_READY;
 					}
-					
+
 					/* copy to buffer */
 					if (f->n_packets > (video->frame_size / 480)) {
 						printk(KERN_ERR "frame buffer overflow during receive\n");
 					}
-					
+
 					frame_put_packet(f, p);
-					
+
 				} /* first_frame */
 			}
-			
+
 			/* stop, end of ready packets */
 			else if (xferstatus == 0) {
 				break;
 			}
-	 
+
 			/* reset xferStatus & resCount */
 			block->u.in.il.q[3] = cpu_to_le32(512);
 
@@ -2127,7 +2123,7 @@ static void ir_tasklet_func(unsigned lon
 			next_dma = ((unsigned long) block - (unsigned long) f->descriptor_pool) + f->descriptor_pool_dma;
 			next->u.in.il.q[0] |= 3 << 20; /* enable interrupt */
 			next->u.in.il.q[2] = 0; /* disable branch */
-			
+
 			/* link previous to next */
 			prev_i = (next_i == 0) ? (MAX_PACKETS * video->n_frames - 1) : (next_i - 1);
 			f = video->frames[prev_i / MAX_PACKETS];
@@ -2145,20 +2141,20 @@ static void ir_tasklet_func(unsigned lon
 
 			/* advance packet_buffer cursor */
 			video->current_packet = (video->current_packet + 1) % (MAX_PACKETS * video->n_frames);
-			
+
 		} /* for all packets */
- 
+
 		wake = 1; /* why the hell not? */
-		
+
 	} /* receive interrupt */
-	
+
 	if (wake) {
 		kill_fasync(&video->fasync, SIGIO, POLL_IN);
 
 		/* wake readers/writers/ioctl'ers */
 		wake_up_interruptible(&video->waitq);
 	}
-	
+
 out:
 	spin_unlock(&video->spinlock);
 }
@@ -2216,13 +2212,13 @@ static int dv1394_init(struct ti_ohci *o
 		printk(KERN_ERR "dv1394: cannot allocate video_card\n");
 		goto err;
 	}
-	
+
 	memset(video, 0, sizeof(struct video_card));
-	
+
 	video->ohci = ohci;
 	/* lower 2 bits of id indicate which of four "plugs"
 	   per host */
-	video->id = ohci->host->id << 2; 
+	video->id = ohci->host->id << 2;
 	if (format == DV1394_NTSC)
 		video->id |= mode;
 	else
@@ -2234,16 +2230,16 @@ static int dv1394_init(struct ti_ohci *o
 	video->ohci_IsoXmitContextControlSet = 0;
 	video->ohci_IsoXmitContextControlClear = 0;
 	video->ohci_IsoXmitCommandPtr = 0;
-	
+
 	video->ohci_IsoRcvContextControlSet = 0;
 	video->ohci_IsoRcvContextControlClear = 0;
 	video->ohci_IsoRcvCommandPtr = 0;
 	video->ohci_IsoRcvContextMatch = 0;
-		
+
 	video->n_frames = 0; /* flag that video is not initialized */
 	video->channel = 63; /* default to broadcast channel */
 	video->active_frame = -1;
-	
+
 	/* initialize the following */
 	video->pal_or_ntsc = format;
 	video->cip_n = 0; /* 0 = use builtin default */
@@ -2270,7 +2266,7 @@ static int dv1394_init(struct ti_ohci *o
 	INIT_LIST_HEAD(&video->list);
 	list_add_tail(&video->list, &dv1394_cards);
 	spin_unlock_irqrestore(&dv1394_cards_lock, flags);
-	
+
 	if (devfs_mk_cdev(MKDEV(IEEE1394_MAJOR,
 				IEEE1394_MINOR_BLOCK_DV1394*16 + video->id),
 			S_IFCHR|S_IRUGO|S_IWUGO,
@@ -2281,7 +2277,7 @@ static int dv1394_init(struct ti_ohci *o
 			goto err_free;
 
 	debug_printk("dv1394: dv1394_init() OK on ID %d\n", video->id);
-	
+
 	return 0;
 
  err_free:
@@ -2293,7 +2289,7 @@ static int dv1394_init(struct ti_ohci *o
 static void dv1394_un_init(struct video_card *video)
 {
 	char buf[32];
-	
+
 	/* obviously nobody has the driver open at this point */
 	do_dv1394_shutdown(video, 1);
 	snprintf(buf, sizeof(buf), "dv/host%d/%s/%s", (video->id >> 2),
@@ -2305,13 +2301,13 @@ static void dv1394_un_init(struct video_
 	kfree(video);
 }
 
-	
+
 static void dv1394_remove_host (struct hpsb_host *host)
 {
 	struct video_card *video;
 	unsigned long flags;
 	int id = host->id;
-	
+
 	/* We only work with the OHCI-1394 driver */
 	if (strcmp(host->driver->name, OHCI1394_DRIVER_NAME))
 		return;
@@ -2355,7 +2351,7 @@ static void dv1394_add_host (struct hpsb
 	devfs_mk_dir("ieee1394/dv/host%d", id);
 	devfs_mk_dir("ieee1394/dv/host%d/NTSC", id);
 	devfs_mk_dir("ieee1394/dv/host%d/PAL", id);
-	
+
 	dv1394_init(ohci, DV1394_NTSC, MODE_RECEIVE);
 	dv1394_init(ohci, DV1394_NTSC, MODE_TRANSMIT);
 	dv1394_init(ohci, DV1394_PAL, MODE_RECEIVE);
@@ -2373,7 +2369,7 @@ static void dv1394_host_reset(struct hps
 	struct ti_ohci *ohci;
 	struct video_card *video = NULL, *tmp_vid;
 	unsigned long flags;
-	
+
 	/* We only work with the OHCI-1394 driver */
 	if (strcmp(host->driver->name, OHCI1394_DRIVER_NAME))
 		return;
@@ -2394,7 +2390,7 @@ static void dv1394_host_reset(struct hps
 	if (!video)
 		return;
 
-	
+
 	spin_lock_irqsave(&video->spinlock, flags);
 
 	if (!video->dma_running)
@@ -2403,7 +2399,7 @@ static void dv1394_host_reset(struct hps
 	/* check IT context */
 	if (video->ohci_it_ctx != -1) {
 		u32 ctx;
-		
+
 		ctx = reg_read(video->ohci, video->ohci_IsoXmitContextControlSet);
 
 		/* if (RUN but not ACTIVE) */
@@ -2415,17 +2411,17 @@ static void dv1394_host_reset(struct hps
 			/* to be safe, assume a frame has been dropped. User-space programs
 			   should handle this condition like an underflow. */
 			video->dropped_frames++;
-			
+
 			/* for some reason you must clear, then re-set the RUN bit to restart DMA */
-			
+
 			/* clear RUN */
 			reg_write(video->ohci, video->ohci_IsoXmitContextControlClear, (1 << 15));
 			flush_pci_write(video->ohci);
-			
+
 			/* set RUN */
 			reg_write(video->ohci, video->ohci_IsoXmitContextControlSet, (1 << 15));
 			flush_pci_write(video->ohci);
-			
+
 			/* set the WAKE bit (just in case; this isn't strictly necessary) */
 			reg_write(video->ohci, video->ohci_IsoXmitContextControlSet, (1 << 12));
 			flush_pci_write(video->ohci);
@@ -2435,11 +2431,11 @@ static void dv1394_host_reset(struct hps
 				   reg_read(video->ohci, video->ohci_IsoXmitCommandPtr));
 		}
 	}
-	
+
 	/* check IR context */
 	if (video->ohci_ir_ctx != -1) {
 		u32 ctx;
-		
+
 		ctx = reg_read(video->ohci, video->ohci_IsoRcvContextControlSet);
 
 		/* if (RUN but not ACTIVE) */
@@ -2454,15 +2450,15 @@ static void dv1394_host_reset(struct hps
 
 			/* for some reason you must clear, then re-set the RUN bit to restart DMA */
 			/* XXX this doesn't work for me, I can't get IR DMA to restart :[ */
-			
+
 			/* clear RUN */
 			reg_write(video->ohci, video->ohci_IsoRcvContextControlClear, (1 << 15));
 			flush_pci_write(video->ohci);
-			
+
 			/* set RUN */
 			reg_write(video->ohci, video->ohci_IsoRcvContextControlSet, (1 << 15));
 			flush_pci_write(video->ohci);
-			
+
 			/* set the WAKE bit (just in case; this isn't strictly necessary) */
 			reg_write(video->ohci, video->ohci_IsoRcvContextControlSet, (1 << 12));
 			flush_pci_write(video->ohci);
@@ -2475,7 +2471,7 @@ static void dv1394_host_reset(struct hps
 
 out:
 	spin_unlock_irqrestore(&video->spinlock, flags);
-	
+
 	/* wake readers/writers/ioctl'ers */
 	wake_up_interruptible(&video->waitq);
 }
@@ -2616,6 +2612,7 @@ static int __init dv1394_init_module(voi
 
 	cdev_init(&dv1394_cdev, &dv1394_fops);
 	dv1394_cdev.owner = THIS_MODULE;
+	kobject_set_name(&dv1394_cdev.kobj, "dv1394");
 	ret = cdev_add(&dv1394_cdev, IEEE1394_DV1394_DEV, 16);
 	if (ret) {
 		printk(KERN_ERR "dv1394: unable to register character device\n");
--- diff/drivers/ieee1394/dv1394.h	2003-08-20 14:16:09.000000000 +0100
+++ source/drivers/ieee1394/dv1394.h	2004-04-21 10:45:34.265494352 +0100
@@ -49,7 +49,7 @@
    To set the DV output parameters (e.g. whether you want NTSC or PAL
    video), use the DV1394_INIT ioctl, passing in the parameters you
    want in a struct dv1394_init.
- 
+
    Example 1:
          To play a raw .DV file:   cat foo.DV > /dev/dv1394
 	 (cat will use write() internally)
@@ -72,9 +72,9 @@
    2)
 
    For more control over buffering, and to avoid unnecessary copies
-   of the DV data, you can use the more sophisticated the mmap() interface. 
-   First, call the DV1394_INIT ioctl to specify your parameters, 
-   including the number of frames in the ringbuffer. Then, calling mmap() 
+   of the DV data, you can use the more sophisticated the mmap() interface.
+   First, call the DV1394_INIT ioctl to specify your parameters,
+   including the number of frames in the ringbuffer. Then, calling mmap()
    on the dv1394 device will give you direct access to the ringbuffer
    from which the DV card reads your frame data.
 
@@ -99,7 +99,7 @@
 	*--------------------------------------*
         | CLEAR   | DV data | DV data | CLEAR  |
         *--------------------------------------*
-                   <ACTIVE> 
+                   <ACTIVE>
 
 	transmission goes in this direction --->>>
 
@@ -110,10 +110,10 @@
    will continue to transmit frame 2, and will increase the dropped_frames
    counter each time it repeats the transmission).
 
- 
+
    If you called DV1394_GET_STATUS at this instant, you would
    receive the following values:
-   
+
                   n_frames          = 4
 		  active_frame      = 1
 		  first_clear_frame = 3
@@ -144,9 +144,9 @@
 
    (checks of system call return values omitted for brevity; always
    check return values in your code!)
-   
+
    while ( frames left ) {
-   
+
     struct pollfd *pfd = ...;
 
     pfd->fd = dv1394_fd;
@@ -154,12 +154,12 @@
     pfd->events = POLLOUT | POLLIN; (OUT for transmit, IN for receive)
 
     (add other sources of I/O here)
-    
+
     poll(pfd, 1, -1); (or select(); add a timeout if you want)
 
     if (pfd->revents) {
          struct dv1394_status status;
-	 
+
          ioctl(dv1394_fd, DV1394_GET_STATUS, &status);
 
 	 if (status.dropped_frames > 0) {
@@ -183,7 +183,7 @@
    should close the dv1394 file descriptor (and munmap() all
    ringbuffer mappings, if you are using them), then re-open the
    dv1394 device (and re-map the ringbuffer).
-   
+
 */
 
 
@@ -215,7 +215,7 @@ enum pal_or_ntsc {
 struct dv1394_init {
 	/* DV1394_API_VERSION */
 	unsigned int api_version;
-	
+
 	/* isochronous transmission channel to use */
 	unsigned int channel;
 
@@ -227,7 +227,7 @@ struct dv1394_init {
 	enum pal_or_ntsc format;
 
 	/* the following are used only for transmission */
- 
+
 	/* set these to zero unless you want a
 	   non-default empty packet rate (see below) */
 	unsigned long cip_n;
@@ -244,7 +244,7 @@ struct dv1394_init {
    would imply a different size for the ringbuffer). If you need a
    different buffer size, simply close and re-open the device, then
    initialize it with your new settings. */
-   
+
 /* Q: What are cip_n and cip_d? */
 
 /*
@@ -261,13 +261,13 @@ struct dv1394_init {
   The default empty packet insertion rate seems to work for many people; if
   your DV output is stable, you can simply ignore this discussion. However,
   we have exposed the empty packet rate as a parameter to support devices that
-  do not work with the default rate. 
+  do not work with the default rate.
 
   The decision to insert an empty packet is made with a numerator/denominator
   algorithm. Empty packets are produced at an average rate of CIP_N / CIP_D.
   You can alter the empty packet rate by passing non-zero values for cip_n
   and cip_d to the INIT ioctl.
-  
+
  */
 
 
--- diff/drivers/ieee1394/eth1394.c	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/ieee1394/eth1394.c	2004-04-21 10:45:34.267494048 +0100
@@ -1,6 +1,6 @@
 /*
  * eth1394.c -- Ethernet driver for Linux IEEE-1394 Subsystem
- * 
+ *
  * Copyright (C) 2001-2003 Ben Collins <bcollins@debian.org>
  *               2000 Bonin Franck <boninf@free.fr>
  *               2003 Steve Kinneberg <kinnebergsteve@acmsystems.com>
@@ -89,7 +89,7 @@
 #define TRACE() printk(KERN_ERR "%s:%s[%d] ---- TRACE\n", driver_name, __FUNCTION__, __LINE__)
 
 static char version[] __devinitdata =
-	"$Rev: 1175 $ Ben Collins <bcollins@debian.org>";
+	"$Rev: 1198 $ Ben Collins <bcollins@debian.org>";
 
 struct fragment_info {
 	struct list_head list;
@@ -216,7 +216,7 @@ static struct hpsb_highlevel eth1394_hig
 /* This is called after an "ifup" */
 static int ether1394_open (struct net_device *dev)
 {
-	struct eth1394_priv *priv = (struct eth1394_priv *)dev->priv;
+	struct eth1394_priv *priv = dev->priv;
 	int ret = 0;
 
 	/* Something bad happened, don't even try */
@@ -278,7 +278,7 @@ static void ether1394_tx_timeout (struct
 
 static int ether1394_change_mtu(struct net_device *dev, int new_mtu)
 {
-	struct eth1394_priv *priv = (struct eth1394_priv *)dev->priv;
+	struct eth1394_priv *priv = dev->priv;
 
 	if ((new_mtu < 68) ||
 	    (new_mtu > min(ETH1394_DATA_LEN,
@@ -479,7 +479,7 @@ static void ether1394_reset_priv (struct
 {
 	unsigned long flags;
 	int i;
-	struct eth1394_priv *priv = (struct eth1394_priv *)dev->priv;
+	struct eth1394_priv *priv = dev->priv;
 	struct hpsb_host *host = priv->host;
 	u64 guid = *((u64*)&(host->csr.rom->bus_info_data[3]));
 	u16 maxpayload = 1 << (host->csr.max_rec + 1);
@@ -652,7 +652,7 @@ out:
 static void ether1394_remove_host (struct hpsb_host *host)
 {
 	struct eth1394_host_info *hi;
-	
+
 	hi = hpsb_get_hostinfo(&eth1394_highlevel, host);
 	if (hi != NULL) {
 		struct eth1394_priv *priv = (struct eth1394_priv *)hi->dev->priv;
@@ -660,7 +660,7 @@ static void ether1394_remove_host (struc
 		hpsb_unregister_addrspace(&eth1394_highlevel, host,
 					  priv->local_fifo);
 
-		if (priv->iso != NULL) 
+		if (priv->iso != NULL)
 			hpsb_iso_shutdown(priv->iso);
 
 		if (hi->dev) {
@@ -731,18 +731,16 @@ static int ether1394_header(struct sk_bu
 
 	eth->h_proto = htons(type);
 
-	if (dev->flags & (IFF_LOOPBACK|IFF_NOARP)) 
-	{
+	if (dev->flags & (IFF_LOOPBACK|IFF_NOARP)) {
 		memset(eth->h_dest, 0, dev->addr_len);
 		return(dev->hard_header_len);
 	}
 
-	if (daddr)
-	{
+	if (daddr) {
 		memcpy(eth->h_dest,daddr,dev->addr_len);
 		return dev->hard_header_len;
 	}
-	
+
 	return -dev->hard_header_len;
 
 }
@@ -760,15 +758,15 @@ static int ether1394_rebuild_header(stru
 	struct eth1394hdr *eth = (struct eth1394hdr *)skb->data;
 	struct net_device *dev = skb->dev;
 
-	switch (eth->h_proto)
-	{
+	switch (eth->h_proto) {
+
 #ifdef CONFIG_INET
 	case __constant_htons(ETH_P_IP):
  		return arp_find((unsigned char*)&eth->h_dest, skb);
-#endif	
+#endif
 	default:
 		ETH1394_PRINT(KERN_DEBUG, dev->name,
-			      "unable to resolve type %04x addresses.\n", 
+			      "unable to resolve type %04x addresses.\n",
 			      eth->h_proto);
 		break;
 	}
@@ -797,7 +795,7 @@ static int ether1394_header_cache(struct
 
 	eth->h_proto = type;
 	memcpy(eth->h_dest, neigh->ha, dev->addr_len);
-	
+
 	hh->hh_len = ETH1394_HLEN;
 	return 0;
 }
@@ -867,7 +865,7 @@ static inline u16 ether1394_parse_encap(
 					nodeid_t srcid, nodeid_t destid,
 					u16 ether_type)
 {
-	struct eth1394_priv *priv = (struct eth1394_priv *)dev->priv;
+	struct eth1394_priv *priv = dev->priv;
 	u64 dest_hw;
 	unsigned short ret = 0;
 
@@ -1010,7 +1008,7 @@ static inline int new_fragment(struct li
 	}
 
 	new = kmalloc(sizeof(struct fragment_info), GFP_ATOMIC);
-	if (!new) 
+	if (!new)
 		return -ENOMEM;
 
 	new->offset = offset;
@@ -1192,7 +1190,7 @@ static int ether1394_data_handler(struct
 				purge_partial_datagram(pdgl->prev);
 				pdg->sz--;
 			}
-            
+
 			retval = new_partial_datagram(dev, pdgl, dgl, dg_size,
 						      buf + hdr_len, fg_off,
 						      fg_len);
@@ -1374,7 +1372,7 @@ static void ether1394_iso(struct hpsb_is
  * arphdr) is the same format as the ip1394 header, so they overlap.  The rest
  * needs to be munged a bit.  The remainder of the arphdr is formatted based
  * on hwaddr len and ipaddr len.  We know what they'll be, so it's easy to
- * judge.  
+ * judge.
  *
  * Now that the EUI is used for the hardware address all we need to do to make
  * this work for 1394 is to insert 2 quadlets that contain max_rec size,
@@ -1452,7 +1450,7 @@ static inline unsigned int ether1394_enc
 		hdr->common.lf = ETH1394_HDR_LF_IF;
 		hdr->sf.fg_off = 0;
 		break;
-		
+
 	default:
 		hdr->sf.fg_off += adj_max_payload;
 		bufhdr = (union eth1394_hdr *)skb_pull(skb, adj_max_payload);
@@ -1499,7 +1497,7 @@ static inline int ether1394_prep_write_p
 		ETH1394_PRINT_G(KERN_ERR, "No more tlabels left while sending "
 				"to node " NODE_BUS_FMT "\n", NODE_BUS_ARGS(host, node));
 		return -1;
-	}		
+	}
 	p->header[0] = (p->node_id << 16) | (p->tlabel << 10)
 		| (1 << 8) | (TCODE_WRITEB << 4);
 
@@ -1538,7 +1536,6 @@ static inline void ether1394_free_packet
 {
 	if (packet->tcode != TCODE_STREAM_DATA)
 		hpsb_free_tlabel(packet);
-	packet->data = NULL;
 	hpsb_free_packet(packet);
 }
 
@@ -1583,9 +1580,9 @@ static inline void ether1394_dg_complete
 {
 	struct sk_buff *skb = ptask->skb;
 	struct net_device *dev = skb->dev;
-	struct eth1394_priv *priv = (struct eth1394_priv *)dev->priv;
+	struct eth1394_priv *priv = dev->priv;
         unsigned long flags;
-		
+
 	/* Statistics */
 	spin_lock_irqsave(&priv->lock, flags);
 	if (fail) {
@@ -1616,8 +1613,7 @@ static void ether1394_complete_cb(void *
 	ether1394_free_packet(packet);
 
 	ptask->outstanding_pkts--;
-	if (ptask->outstanding_pkts > 0 && !fail)
-	{
+	if (ptask->outstanding_pkts > 0 && !fail) {
 		int tx_len;
 
 		/* Add the encapsulation header to the fragment */
@@ -1637,7 +1633,7 @@ static int ether1394_tx (struct sk_buff 
 {
 	int kmflags = in_interrupt() ? GFP_ATOMIC : GFP_KERNEL;
 	struct eth1394hdr *eth;
-	struct eth1394_priv *priv = (struct eth1394_priv *)dev->priv;
+	struct eth1394_priv *priv = dev->priv;
 	int proto;
 	unsigned long flags;
 	nodeid_t dest_node;
@@ -1797,7 +1793,7 @@ static int ether1394_ethtool_ioctl(struc
 		case ETHTOOL_GDRVINFO: {
 			struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO };
 			strcpy (info.driver, driver_name);
-			strcpy (info.version, "$Rev: 1175 $");
+			strcpy (info.version, "$Rev: 1198 $");
 			/* FIXME XXX provide sane businfo */
 			strcpy (info.bus_info, "ieee1394");
 			if (copy_to_user (useraddr, &info, sizeof (info)))
--- diff/drivers/ieee1394/highlevel.c	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/ieee1394/highlevel.c	2004-04-21 10:45:34.267494048 +0100
@@ -493,7 +493,7 @@ int hpsb_listen_channel(struct hpsb_high
 	return 0;
 }
 
-void hpsb_unlisten_channel(struct hpsb_highlevel *hl, struct hpsb_host *host, 
+void hpsb_unlisten_channel(struct hpsb_highlevel *hl, struct hpsb_host *host,
                            unsigned int channel)
 {
         if (channel > 63) {
--- diff/drivers/ieee1394/highlevel.h	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/ieee1394/highlevel.h	2004-04-21 10:45:34.268493896 +0100
@@ -5,7 +5,7 @@
 
 struct hpsb_address_serve {
         struct list_head host_list; /* per host list */
-        
+
         struct list_head hl_list; /* hpsb_highlevel list */
 
         struct hpsb_address_ops *op;
@@ -19,7 +19,7 @@ struct hpsb_address_serve {
 
 /*
  * The above structs are internal to highlevel driver handling.  Only the
- * following structures are of interest to actual highlevel drivers.  
+ * following structures are of interest to actual highlevel drivers.
  */
 
 struct hpsb_highlevel {
@@ -68,8 +68,8 @@ struct hpsb_highlevel {
 
 struct hpsb_address_ops {
         /*
-         * Null function pointers will make the respective operation complete 
-         * with RCODE_TYPE_ERROR.  Makes for easy to implement read-only 
+         * Null function pointers will make the respective operation complete
+         * with RCODE_TYPE_ERROR.  Makes for easy to implement read-only
          * registers (just leave everything but read NULL).
          *
          * All functions shall return appropriate IEEE 1394 rcodes.
@@ -77,7 +77,7 @@ struct hpsb_address_ops {
 
         /* These functions have to implement block reads for themselves. */
         /* These functions either return a response code
-           or a negative number. In the first case a response will be generated; in the 
+           or a negative number. In the first case a response will be generated; in the
            later case, no response will be sent and the driver, that handled the request
            will send the response itself
         */
@@ -104,7 +104,7 @@ void highlevel_host_reset(struct hpsb_ho
    a packet arrives. The flags argument contains the second word of the first header
    quadlet of the incoming packet (containing transaction label, retry code,
    transaction code and priority). These functions either return a response code
-   or a negative number. In the first case a response will be generated; in the 
+   or a negative number. In the first case a response will be generated; in the
    later case, no response will be sent and the driver, that handled the request
    will send the response itself.
 */
@@ -155,7 +155,7 @@ int hpsb_unregister_addrspace(struct hps
  * Enable or disable receving a certain isochronous channel through the
  * iso_receive op.
  */
-int hpsb_listen_channel(struct hpsb_highlevel *hl, struct hpsb_host *host, 
+int hpsb_listen_channel(struct hpsb_highlevel *hl, struct hpsb_host *host,
                          unsigned int channel);
 void hpsb_unlisten_channel(struct hpsb_highlevel *hl, struct hpsb_host *host,
                            unsigned int channel);
--- diff/drivers/ieee1394/hosts.c	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/ieee1394/hosts.c	2004-04-21 10:45:34.268493896 +0100
@@ -126,9 +126,7 @@ struct hpsb_host *hpsb_alloc_host(struct
 	h->hostdata = h + 1;
         h->driver = drv;
 
-        INIT_LIST_HEAD(&h->pending_packets);
-        spin_lock_init(&h->pending_pkt_lock);
-
+	skb_queue_head_init(&h->pending_packet_queue);
 	INIT_LIST_HEAD(&h->addr_space);
 
 	init_timer(&h->delayed_reset);
--- diff/drivers/ieee1394/hosts.h	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/ieee1394/hosts.h	2004-04-21 10:45:34.268493896 +0100
@@ -5,6 +5,8 @@
 #include <linux/wait.h>
 #include <linux/list.h>
 #include <linux/timer.h>
+#include <linux/skbuff.h>
+
 #include <asm/semaphore.h>
 
 #include "ieee1394_types.h"
@@ -21,8 +23,8 @@ struct hpsb_host {
 
         atomic_t generation;
 
-        struct list_head pending_packets;
-        spinlock_t pending_pkt_lock;
+	struct sk_buff_head pending_packet_queue;
+
 	struct timer_list timeout;
 	unsigned long timeout_interval;
 
@@ -164,7 +166,7 @@ struct hpsb_host_driver {
          * called.  Return 0 on success, negative errno on failure.
          * NOTE: The function must be callable in interrupt context.
          */
-        int (*transmit_packet) (struct hpsb_host *host, 
+        int (*transmit_packet) (struct hpsb_host *host,
                                 struct hpsb_packet *packet);
 
         /* This function requests miscellanous services from the driver, see
--- diff/drivers/ieee1394/ieee1394.h	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/ieee1394/ieee1394.h	2004-04-21 10:45:34.269493744 +0100
@@ -39,7 +39,7 @@
 #define ACK_TARDY                0xb
 #define ACK_CONFLICT_ERROR       0xc
 #define ACK_DATA_ERROR           0xd
-#define ACK_TYPE_ERROR           0xe 
+#define ACK_TYPE_ERROR           0xe
 #define ACK_ADDRESS_ERROR        0xf
 
 /* Non-standard "ACK codes" for internal use */
@@ -74,7 +74,7 @@ extern const char *hpsb_speedto_str[];
 #define SELFID_PORT_CHILD        0x3
 #define SELFID_PORT_PARENT       0x2
 #define SELFID_PORT_NCONN        0x1
-#define SELFID_PORT_NONE         0x0   
+#define SELFID_PORT_NONE         0x0
 
 
 #include <asm/byteorder.h>
--- diff/drivers/ieee1394/ieee1394_core.c	2004-04-05 12:57:07.000000000 +0100
+++ source/drivers/ieee1394/ieee1394_core.c	2004-04-21 10:45:34.270493592 +0100
@@ -31,6 +31,8 @@
 #include <linux/moduleparam.h>
 #include <linux/bitops.h>
 #include <linux/kdev_t.h>
+#include <linux/skbuff.h>
+
 #include <asm/byteorder.h>
 #include <asm/semaphore.h>
 
@@ -56,8 +58,6 @@ MODULE_PARM_DESC(disable_nodemgr, "Disab
 /* We are GPL, so treat us special */
 MODULE_LICENSE("GPL");
 
-static kmem_cache_t *hpsb_packet_cache;
-
 /* Some globals used */
 const char *hpsb_speedto_str[] = { "S100", "S200", "S400", "S800", "S1600", "S3200" };
 
@@ -122,30 +122,27 @@ void hpsb_set_packet_complete_task(struc
 struct hpsb_packet *hpsb_alloc_packet(size_t data_size)
 {
 	struct hpsb_packet *packet = NULL;
-	void *data = NULL;
-	int gfp_flags = (in_atomic() || irqs_disabled()) ? GFP_ATOMIC : GFP_KERNEL;
+	struct sk_buff *skb;
 
-	packet = kmem_cache_alloc(hpsb_packet_cache, gfp_flags);
-	if (packet == NULL)
+	data_size = ((data_size + 3) & ~3);
+
+	skb = alloc_skb(data_size + sizeof(*packet), GFP_ATOMIC);
+	if (skb == NULL)
 		return NULL;
 
-	memset(packet, 0, sizeof(*packet));
+	memset(skb->data, 0, data_size + sizeof(*packet));
+
+	packet = (struct hpsb_packet *)skb->data;
+	packet->skb = skb;
 
 	packet->header = packet->embedded_header;
-	INIT_LIST_HEAD(&packet->list);
 	packet->state = hpsb_unused;
 	packet->generation = -1;
+	INIT_LIST_HEAD(&packet->driver_list);
 	atomic_set(&packet->refcnt, 1);
 
 	if (data_size) {
-		data_size = (data_size + 3) & ~3;
-		data = kmalloc(data_size + 8, gfp_flags);
-		if (data == NULL) {
-			kmem_cache_free(hpsb_packet_cache, packet);
-			return NULL;
-		}
-
-		packet->data = data;
+		packet->data = (quadlet_t *)(skb->data + sizeof(*packet));
 		packet->data_size = data_size;
 	}
 
@@ -162,8 +159,8 @@ struct hpsb_packet *hpsb_alloc_packet(si
 void hpsb_free_packet(struct hpsb_packet *packet)
 {
 	if (packet && atomic_dec_and_test(&packet->refcnt)) {
-		kfree(packet->data);
-		kmem_cache_free(hpsb_packet_cache, packet);
+		BUG_ON(!list_empty(&packet->driver_list));
+		kfree_skb(packet->skb);
 	}
 }
 
@@ -219,13 +216,13 @@ static int check_selfids(struct hpsb_hos
                 if (!sid->extended) {
                         nodeid++;
                         esid_seq = 0;
-                        
+
                         if (sid->phy_id != nodeid) {
                                 HPSB_INFO("SelfIDs failed monotony check with "
                                           "%d", sid->phy_id);
                                 return 0;
                         }
-                        
+
 			if (sid->link_active) {
 				host->nodes_active++;
 				if (sid->contender)
@@ -234,7 +231,7 @@ static int check_selfids(struct hpsb_hos
                 } else {
                         esid = (struct ext_selfid *)sid;
 
-                        if ((esid->phy_id != nodeid) 
+                        if ((esid->phy_id != nodeid)
                             || (esid->seq_nr != esid_seq)) {
                                 HPSB_INFO("SelfIDs failed monotony check with "
                                           "%d/%d", esid->phy_id, esid->seq_nr);
@@ -244,24 +241,24 @@ static int check_selfids(struct hpsb_hos
                 }
                 sid++;
         }
-        
+
         esid = (struct ext_selfid *)(sid - 1);
         while (esid->extended) {
                 if ((esid->porta == 0x2) || (esid->portb == 0x2)
                     || (esid->portc == 0x2) || (esid->portd == 0x2)
                     || (esid->porte == 0x2) || (esid->portf == 0x2)
                     || (esid->portg == 0x2) || (esid->porth == 0x2)) {
-                                HPSB_INFO("SelfIDs failed root check on "
-                                          "extended SelfID");
-                                return 0;
+			HPSB_INFO("SelfIDs failed root check on "
+				  "extended SelfID");
+			return 0;
                 }
                 esid--;
         }
 
         sid = (struct selfid *)esid;
         if ((sid->port0 == 0x2) || (sid->port1 == 0x2) || (sid->port2 == 0x2)) {
-                        HPSB_INFO("SelfIDs failed root check");
-                        return 0;
+		HPSB_INFO("SelfIDs failed root check");
+		return 0;
         }
 
 	host->node_count = nodeid + 1;
@@ -400,7 +397,7 @@ void hpsb_selfid_complete(struct hpsb_ho
 }
 
 
-void hpsb_packet_sent(struct hpsb_host *host, struct hpsb_packet *packet, 
+void hpsb_packet_sent(struct hpsb_host *host, struct hpsb_packet *packet,
                       int ackcode)
 {
 	packet->ack_code = ackcode;
@@ -413,7 +410,7 @@ void hpsb_packet_sent(struct hpsb_host *
 
 	if (ackcode != ACK_PENDING || !packet->expect_response) {
 		atomic_dec(&packet->refcnt);
-		list_del(&packet->list);
+		skb_unlink(packet->skb);
 		packet->state = hpsb_complete;
 		queue_packet_complete(packet);
 		return;
@@ -505,17 +502,17 @@ int hpsb_send_packet(struct hpsb_packet 
 
         packet->state = hpsb_queued;
 
-	if (!packet->no_waiter || packet->expect_response) {
-		unsigned long flags;
+	/* This just seems silly to me */
+	WARN_ON(packet->no_waiter && packet->expect_response);
 
+	if (!packet->no_waiter || packet->expect_response) {
 		atomic_inc(&packet->refcnt);
-		spin_lock_irqsave(&host->pending_pkt_lock, flags);
-		list_add_tail(&packet->list, &host->pending_packets);
-		spin_unlock_irqrestore(&host->pending_pkt_lock, flags);
+		skb_queue_tail(&host->pending_packet_queue, packet->skb);
 	}
 
-        if (packet->node_id == host->node_id)
-        { /* it is a local request, so handle it locally */
+        if (packet->node_id == host->node_id) {
+		/* it is a local request, so handle it locally */
+
                 quadlet_t *data;
                 size_t size = packet->data_size + packet->header_size;
 
@@ -547,6 +544,7 @@ int hpsb_send_packet(struct hpsb_packet 
                                        + NODEID_TO_NODE(packet->node_id)];
         }
 
+#ifdef CONFIG_IEEE1394_VERBOSEDEBUG
         switch (packet->speed_code) {
         case 2:
                 dump_packet("send packet 400:", packet->header,
@@ -560,6 +558,7 @@ int hpsb_send_packet(struct hpsb_packet 
                 dump_packet("send packet 100:", packet->header,
                             packet->header_size);
         }
+#endif
 
         return host->driver->transmit_packet(host, packet);
 }
@@ -595,80 +594,78 @@ static void send_packet_nocare(struct hp
 }
 
 
-void handle_packet_response(struct hpsb_host *host, int tcode, quadlet_t *data,
-                            size_t size)
+static void handle_packet_response(struct hpsb_host *host, int tcode,
+				   quadlet_t *data, size_t size)
 {
         struct hpsb_packet *packet = NULL;
-        struct list_head *lh;
+	struct sk_buff *skb;
         int tcode_match = 0;
         int tlabel;
         unsigned long flags;
 
         tlabel = (data[0] >> 10) & 0x3f;
 
-        spin_lock_irqsave(&host->pending_pkt_lock, flags);
+	spin_lock_irqsave(&host->pending_packet_queue.lock, flags);
 
-        list_for_each(lh, &host->pending_packets) {
-                packet = list_entry(lh, struct hpsb_packet, list);
+	skb_queue_walk(&host->pending_packet_queue, skb) {
+		packet = (struct hpsb_packet *)skb->data;
                 if ((packet->tlabel == tlabel)
                     && (packet->node_id == (data[1] >> 16))){
                         break;
                 }
+
+		packet = NULL;
         }
 
-        if (lh == &host->pending_packets) {
+	if (packet == NULL) {
                 HPSB_DEBUG("unsolicited response packet received - no tlabel match");
                 dump_packet("contents:", data, 16);
-                spin_unlock_irqrestore(&host->pending_pkt_lock, flags);
+		spin_unlock_irqrestore(&host->pending_packet_queue.lock, flags);
                 return;
         }
 
         switch (packet->tcode) {
         case TCODE_WRITEQ:
         case TCODE_WRITEB:
-                if (tcode == TCODE_WRITE_RESPONSE) tcode_match = 1;
+                if (tcode != TCODE_WRITE_RESPONSE)
+			break;
+		tcode_match = 1;
+		memcpy(packet->header, data, 12);
                 break;
         case TCODE_READQ:
-                if (tcode == TCODE_READQ_RESPONSE) tcode_match = 1;
+                if (tcode != TCODE_READQ_RESPONSE)
+			break;
+		tcode_match = 1;
+		memcpy(packet->header, data, 16);
                 break;
         case TCODE_READB:
-                if (tcode == TCODE_READB_RESPONSE) tcode_match = 1;
+                if (tcode != TCODE_READB_RESPONSE)
+			break;
+		tcode_match = 1;
+		BUG_ON(packet->skb->len - sizeof(*packet) < size - 16);
+		memcpy(packet->header, data, 16);
+		memcpy(packet->data, data + 4, size - 16);
                 break;
         case TCODE_LOCK_REQUEST:
-                if (tcode == TCODE_LOCK_RESPONSE) tcode_match = 1;
+                if (tcode != TCODE_LOCK_RESPONSE)
+			break;
+		tcode_match = 1;
+		size = min((size - 16), (size_t)8);
+		BUG_ON(packet->skb->len - sizeof(*packet) < size);
+		memcpy(packet->header, data, 16);
+		memcpy(packet->data, data + 4, size);
                 break;
         }
 
-        if (!tcode_match || (packet->tlabel != tlabel)
-            || (packet->node_id != (data[1] >> 16))) {
+        if (!tcode_match) {
                 HPSB_INFO("unsolicited response packet received - tcode mismatch");
                 dump_packet("contents:", data, 16);
-
-                spin_unlock_irqrestore(&host->pending_pkt_lock, flags);
+		spin_unlock_irqrestore(&host->pending_packet_queue.lock, flags);
                 return;
         }
 
-        list_del(&packet->list);
-
-        spin_unlock_irqrestore(&host->pending_pkt_lock, flags);
-
-        /* FIXME - update size fields? */
-        switch (tcode) {
-        case TCODE_WRITE_RESPONSE:
-                memcpy(packet->header, data, 12);
-                break;
-        case TCODE_READQ_RESPONSE:
-                memcpy(packet->header, data, 16);
-                break;
-        case TCODE_READB_RESPONSE:
-                memcpy(packet->header, data, 16);
-                memcpy(packet->data, data + 4, size - 16);
-                break;
-        case TCODE_LOCK_RESPONSE:
-                memcpy(packet->header, data, 16);
-                memcpy(packet->data, data + 4, (size - 16) > 8 ? 8 : size - 16);
-                break;
-        }
+	__skb_unlink(skb, skb->list);
+	spin_unlock_irqrestore(&host->pending_packet_queue.lock, flags);
 
 	if (packet->state == hpsb_queued) {
 		packet->sendtime = jiffies;
@@ -685,10 +682,8 @@ static struct hpsb_packet *create_reply_
 {
         struct hpsb_packet *p;
 
-        dsize += (dsize % 4 ? 4 - (dsize % 4) : 0);
-
         p = hpsb_alloc_packet(dsize);
-        if (p == NULL) {
+        if (unlikely(p == NULL)) {
                 /* FIXME - send data_error response */
                 return NULL;
         }
@@ -702,9 +697,8 @@ static struct hpsb_packet *create_reply_
 
 	p->generation = get_hpsb_generation(host);
 
-        if (dsize % 4) {
-                p->data[dsize / 4] = 0;
-        }
+	if (dsize % 4)
+		p->data[dsize / 4] = 0;
 
         return p;
 }
@@ -851,11 +845,11 @@ static void handle_incoming_packet(struc
                         fill_async_lock_resp(packet, rcode, extcode, 4);
                         break;
                 case 8:
-                        if ((extcode != EXTCODE_FETCH_ADD) 
+                        if ((extcode != EXTCODE_FETCH_ADD)
                             && (extcode != EXTCODE_LITTLE_ADD)) {
                                 rcode = highlevel_lock(host, source,
                                                        packet->data, addr,
-                                                       data[5], data[4], 
+                                                       data[5], data[4],
                                                        extcode, flags);
                                 fill_async_lock_resp(packet, rcode, extcode, 4);
                         } else {
@@ -870,7 +864,7 @@ static void handle_incoming_packet(struc
                         rcode = highlevel_lock64(host, source,
                                                  (octlet_t *)packet->data, addr,
                                                  *(octlet_t *)(data + 6),
-                                                 *(octlet_t *)(data + 4), 
+                                                 *(octlet_t *)(data + 4),
                                                  extcode, flags);
                         fill_async_lock_resp(packet, rcode, extcode, 8);
                         break;
@@ -932,7 +926,7 @@ void hpsb_packet_received(struct hpsb_ho
                 break;
 
         default:
-                HPSB_NOTICE("received packet with bogus transaction code %d", 
+                HPSB_NOTICE("received packet with bogus transaction code %d",
                             tcode);
                 break;
         }
@@ -941,74 +935,75 @@ void hpsb_packet_received(struct hpsb_ho
 
 void abort_requests(struct hpsb_host *host)
 {
-        unsigned long flags;
-        struct hpsb_packet *packet, *packet_next;
-        LIST_HEAD(llist);
+	struct hpsb_packet *packet;
+	struct sk_buff *skb;
+
+	host->driver->devctl(host, CANCEL_REQUESTS, 0);
 
-        host->driver->devctl(host, CANCEL_REQUESTS, 0);
+	while ((skb = skb_dequeue(&host->pending_packet_queue)) != NULL) {
+		packet = (struct hpsb_packet *)skb->data;
 
-        spin_lock_irqsave(&host->pending_pkt_lock, flags);
-        list_splice(&host->pending_packets, &llist);
-        INIT_LIST_HEAD(&host->pending_packets);
-        spin_unlock_irqrestore(&host->pending_pkt_lock, flags);
-
-        list_for_each_entry_safe(packet, packet_next, &llist, list) {
-                list_del(&packet->list);
-                packet->state = hpsb_complete;
-                packet->ack_code = ACKX_ABORTED;
+		packet->state = hpsb_complete;
+		packet->ack_code = ACKX_ABORTED;
 		queue_packet_complete(packet);
-        }
+	}
 }
 
 void abort_timedouts(unsigned long __opaque)
 {
 	struct hpsb_host *host = (struct hpsb_host *)__opaque;
-        unsigned long flags;
-        struct hpsb_packet *packet, *packet_next;
-        unsigned long expire;
-        LIST_HEAD(expiredlist);
+	unsigned long flags;
+	struct hpsb_packet *packet;
+	struct sk_buff *skb;
+	unsigned long expire;
 
-        spin_lock_irqsave(&host->csr.lock, flags);
+	spin_lock_irqsave(&host->csr.lock, flags);
 	expire = host->csr.expire;
-        spin_unlock_irqrestore(&host->csr.lock, flags);
-
-        spin_lock_irqsave(&host->pending_pkt_lock, flags);
+	spin_unlock_irqrestore(&host->csr.lock, flags);
 
-	list_for_each_entry_safe(packet, packet_next, &host->pending_packets, list) {
-                if (time_before(packet->sendtime + expire, jiffies)) {
-                        list_del(&packet->list);
-                        list_add(&packet->list, &expiredlist);
-                }
-        }
+	/* Hold the lock around this, since we aren't dequeuing all
+	 * packets, just ones we need. */
+	spin_lock_irqsave(&host->pending_packet_queue.lock, flags);
+
+	while (!skb_queue_empty(&host->pending_packet_queue)) {
+		skb = skb_peek(&host->pending_packet_queue);
+
+		packet = (struct hpsb_packet *)skb->data;
+
+		if (time_before(packet->sendtime + expire, jiffies)) {
+			__skb_unlink(skb, skb->list);
+			packet->state = hpsb_complete;
+			packet->ack_code = ACKX_TIMEOUT;
+			queue_packet_complete(packet);
+		} else {
+			/* Since packets are added to the tail, the oldest
+			 * ones are first, always. When we get to one that
+			 * isn't timed out, the rest aren't either. */
+			break;
+		}
+	}
 
-        if (!list_empty(&host->pending_packets))
+	if (!skb_queue_empty(&host->pending_packet_queue))
 		mod_timer(&host->timeout, jiffies + host->timeout_interval);
 
-        spin_unlock_irqrestore(&host->pending_pkt_lock, flags);
-
-        list_for_each_entry_safe(packet, packet_next, &expiredlist, list) {
-                list_del(&packet->list);
-                packet->state = hpsb_complete;
-                packet->ack_code = ACKX_TIMEOUT;
-		queue_packet_complete(packet);
-        }
+	spin_unlock_irqrestore(&host->pending_packet_queue.lock, flags);
 }
 
+
+/* Kernel thread and vars, which handles packets that are completed. Only
+ * packets that have a "complete" function are sent here. This way, the
+ * completion is run out of kernel context, and doesn't block the rest of
+ * the stack. */
 static int khpsbpkt_pid = -1;
 static DECLARE_COMPLETION(khpsbpkt_complete);
-static LIST_HEAD(hpsbpkt_list);
+struct sk_buff_head hpsbpkt_queue;
 static DECLARE_MUTEX_LOCKED(khpsbpkt_sig);
-static spinlock_t khpsbpkt_lock = SPIN_LOCK_UNLOCKED;
 
 
 static void queue_packet_complete(struct hpsb_packet *packet)
 {
 	if (packet->complete_routine != NULL) {
-		unsigned long flags;
-
-		spin_lock_irqsave(&khpsbpkt_lock, flags);
-		list_add_tail(&packet->list, &hpsbpkt_list);
-		spin_unlock_irqrestore(&khpsbpkt_lock, flags);
+		skb_queue_tail(&hpsbpkt_queue, packet->skb);
 
 		/* Signal the kernel thread to handle this */
 		up(&khpsbpkt_sig);
@@ -1018,24 +1013,24 @@ static void queue_packet_complete(struct
 
 static int hpsbpkt_thread(void *__hi)
 {
-	struct hpsb_packet *packet, *next;
-	unsigned long flags;
+	struct sk_buff *skb;
+	struct hpsb_packet *packet;
+	void (*complete_routine)(void*);
+	void *complete_data;
 
 	daemonize("khpsbpkt");
-	allow_signal(SIGTERM);
 
 	while (!down_interruptible(&khpsbpkt_sig)) {
-		spin_lock_irqsave(&khpsbpkt_lock, flags);
-		list_for_each_entry_safe(packet, next, &hpsbpkt_list, list) {
-			void (*complete_routine)(void*) = packet->complete_routine;
-			void *complete_data = packet->complete_data;
+		while ((skb = skb_dequeue(&hpsbpkt_queue)) != NULL) {
+			packet = (struct hpsb_packet *)skb->data;
+
+			complete_routine = packet->complete_routine;
+			complete_data = packet->complete_data;
 
-			list_del(&packet->list);
 			packet->complete_routine = packet->complete_data = NULL;
 
 			complete_routine(complete_data);
 		}
-		spin_unlock_irqrestore(&khpsbpkt_lock, flags);
 	}
 
 	complete_and_exit(&khpsbpkt_complete, 0);
@@ -1046,6 +1041,8 @@ static int __init ieee1394_init(void)
 {
 	int i;
 
+	skb_queue_head_init(&hpsbpkt_queue);
+
 	if (hpsb_init_config_roms()) {
 		HPSB_ERR("Failed to initialize some config rom entries.\n");
 		HPSB_ERR("Some features may not be available\n");
@@ -1066,9 +1063,6 @@ static int __init ieee1394_init(void)
 
 	devfs_mk_dir("ieee1394");
 
-	hpsb_packet_cache = kmem_cache_create("hpsb_packet", sizeof(struct hpsb_packet),
-					      0, SLAB_HWCACHE_ALIGN, NULL, NULL);
-
 	bus_register(&ieee1394_bus_type);
 	for (i = 0; fw_bus_attrs[i]; i++)
 		bus_create_file(&ieee1394_bus_type, fw_bus_attrs[i]);
@@ -1104,8 +1098,6 @@ static void __exit ieee1394_cleanup(void
 		wait_for_completion(&khpsbpkt_complete);
 	}
 
-	kmem_cache_destroy(hpsb_packet_cache);
-
 	hpsb_cleanup_config_roms();
 
 	unregister_chrdev_region(IEEE1394_CORE_DEV, 256);
--- diff/drivers/ieee1394/ieee1394_core.h	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/ieee1394/ieee1394_core.h	2004-04-21 10:45:34.270493592 +0100
@@ -12,9 +12,13 @@
 struct hpsb_packet {
         /* This struct is basically read-only for hosts with the exception of
          * the data buffer contents and xnext - see below. */
-        struct list_head list;
 
-        /* This can be used for host driver internal linking. */
+	/* This can be used for host driver internal linking.
+	 *
+	 * NOTE: This must be left in init state when the driver is done
+	 * with it (e.g. by using list_del_init()), since the core does
+	 * some sanity checks to make sure the packet is not on a
+	 * driver_list when free'ing it. */
 	struct list_head driver_list;
 
         nodeid_t node_id;
@@ -27,10 +31,9 @@ struct hpsb_packet {
          * queued   = queued for sending
          * pending  = sent, waiting for response
          * complete = processing completed, successful or not
-         * incoming = incoming packet
          */
-        enum { 
-                hpsb_unused, hpsb_queued, hpsb_pending, hpsb_complete, hpsb_incoming 
+        enum {
+                hpsb_unused, hpsb_queued, hpsb_pending, hpsb_complete
         } __attribute__((packed)) state;
 
         /* These are core internal. */
@@ -67,6 +70,9 @@ struct hpsb_packet {
 	void (*complete_routine)(void *);
 	void *complete_data;
 
+	/* XXX This is just a hack at the moment */
+	struct sk_buff *skb;
+
         /* Store jiffies for implementing bus timeouts. */
         unsigned long sendtime;
 
@@ -141,7 +147,7 @@ int hpsb_bus_reset(struct hpsb_host *hos
  */
 void hpsb_selfid_received(struct hpsb_host *host, quadlet_t sid);
 
-/* 
+/*
  * Notify completion of SelfID stage to the core and report new physical ID
  * and whether host is root now.
  */
--- diff/drivers/ieee1394/ieee1394_transactions.c	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/ieee1394/ieee1394_transactions.c	2004-04-21 10:45:34.271493440 +0100
@@ -67,7 +67,7 @@ static void fill_async_writeblock(struct
         packet->data_size = length + (length % 4 ? 4 - (length % 4) : 0);
 }
 
-static void fill_async_lock(struct hpsb_packet *packet, u64 addr, int extcode, 
+static void fill_async_lock(struct hpsb_packet *packet, u64 addr, int extcode,
                      int length)
 {
         PREP_ASYNC_HEAD_ADDRESS(TCODE_LOCK_REQUEST);
@@ -89,10 +89,10 @@ static void fill_iso_packet(struct hpsb_
         packet->tcode = TCODE_ISO_DATA;
 }
 
-static void fill_phy_packet(struct hpsb_packet *packet, quadlet_t data) 
-{ 
+static void fill_phy_packet(struct hpsb_packet *packet, quadlet_t data)
+{
         packet->header[0] = data;
-        packet->header[1] = ~data; 
+        packet->header[1] = ~data;
         packet->header_size = 8;
         packet->data_size = 0;
         packet->expect_response = 0;
@@ -145,7 +145,7 @@ int hpsb_get_tlabel(struct hpsb_packet *
 	}
 
 	spin_lock_irqsave(&tp->lock, flags);
-	
+
 	packet->tlabel = find_next_zero_bit(tp->pool, 64, tp->next);
 	if (packet->tlabel > 63)
 		packet->tlabel = find_first_zero_bit(tp->pool, 64);
@@ -158,7 +158,7 @@ int hpsb_get_tlabel(struct hpsb_packet *
 	return 0;
 }
 
-/** 
+/**
  * hpsb_free_tlabel - free an allocated transaction label
  * @packet: packet whos tlabel/tpool needs to be cleared
  *
@@ -173,7 +173,7 @@ void hpsb_free_tlabel(struct hpsb_packet
 {
         unsigned long flags;
 	struct hpsb_tlabel_pool *tp;
-	
+
 	tp = &packet->host->tpool[packet->node_id & NODE_MASK];
 
 	BUG_ON(packet->tlabel > 63 || packet->tlabel < 0);
@@ -204,7 +204,7 @@ int hpsb_packet_success(struct hpsb_pack
                         return -EINVAL;
                 default:
                         HPSB_ERR("received reserved rcode %d from node %d",
-                                 (packet->header[1] >> 12) & 0xf, 
+                                 (packet->header[1] >> 12) & 0xf,
                                  packet->node_id);
                         return -EAGAIN;
                 }
@@ -268,7 +268,7 @@ struct hpsb_packet *hpsb_make_readpacket
 	if (length == 0)
 		return NULL;
 
-	packet = hpsb_alloc_packet((length + 3) & ~3);
+	packet = hpsb_alloc_packet(length);
 	if (!packet)
 		return NULL;
 
@@ -296,7 +296,7 @@ struct hpsb_packet *hpsb_make_writepacke
 	if (length == 0)
 		return NULL;
 
-	packet = hpsb_alloc_packet((length + 3) & ~3);
+	packet = hpsb_alloc_packet(length);
 	if (!packet)
 		return NULL;
 
@@ -330,7 +330,7 @@ struct hpsb_packet *hpsb_make_streampack
 	if (length == 0)
 		return NULL;
 
-	packet = hpsb_alloc_packet((length + 3) & ~3);
+	packet = hpsb_alloc_packet(length);
 	if (!packet)
 		return NULL;
 
@@ -338,7 +338,7 @@ struct hpsb_packet *hpsb_make_streampack
 		packet->data[length >> 2] = 0;
 	}
 	packet->host = host;
-    
+
 	if (hpsb_get_tlabel(packet)) {
 		hpsb_free_packet(packet);
 		return NULL;
@@ -430,17 +430,17 @@ struct hpsb_packet *hpsb_make_lock64pack
 }
 
 struct hpsb_packet *hpsb_make_phypacket(struct hpsb_host *host,
-                                        quadlet_t data) 
+                                        quadlet_t data)
 {
-        struct hpsb_packet *p; 
+        struct hpsb_packet *p;
 
-        p = hpsb_alloc_packet(0); 
-        if (!p) return NULL; 
+        p = hpsb_alloc_packet(0);
+        if (!p) return NULL;
 
-        p->host = host; 
-        fill_phy_packet(p, data); 
+        p->host = host;
+        fill_phy_packet(p, data);
 
-        return p; 
+        return p;
 }
 
 struct hpsb_packet *hpsb_make_isopacket(struct hpsb_host *host,
@@ -470,7 +470,7 @@ int hpsb_read(struct hpsb_host *host, no
 {
         struct hpsb_packet *packet;
         int retval = 0;
-        
+
         if (length == 0)
                 return -EINVAL;
 
@@ -544,7 +544,7 @@ int hpsb_lock(struct hpsb_host *host, no
 
 	BUG_ON(in_interrupt()); // We can't be called in an interrupt, yet
 
-	packet = hpsb_make_lockpacket(host, node, addr, extcode, data, arg);        
+	packet = hpsb_make_lockpacket(host, node, addr, extcode, data, arg);
         if (!packet)
                 return -ENOMEM;
 
@@ -607,7 +607,7 @@ int hpsb_send_gasp(struct hpsb_host *hos
 	HPSB_VERBOSE("Send GASP: channel = %d, length = %Zd", channel, length);
 
 	length += 8;
-    
+
 	packet = hpsb_make_streampacket(host, NULL, length, channel, 3, 0);
 	if (!packet)
 		return -ENOMEM;
--- diff/drivers/ieee1394/ieee1394_types.h	2003-12-19 09:51:02.000000000 +0000
+++ source/drivers/ieee1394/ieee1394_types.h	2004-04-21 10:45:34.271493440 +0100
@@ -24,7 +24,7 @@ struct hpsb_tlabel_pool {
 
 #define HPSB_TPOOL_INIT(_tp)			\
 do {						\
-	CLEAR_BITMAP((_tp)->pool, 64);		\
+	bitmap_zero((_tp)->pool, 64);		\
 	spin_lock_init(&(_tp)->lock);		\
 	(_tp)->next = 0;			\
 	(_tp)->allocations = 0;			\
--- diff/drivers/ieee1394/iso.c	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/ieee1394/iso.c	2004-04-21 10:45:34.272493288 +0100
@@ -274,7 +274,7 @@ int hpsb_iso_recv_start(struct hpsb_iso 
 		cycle %= 8000;
 
 	isoctl_args[0] = cycle;
-	
+
 	if (tag_mask < 0)
 		/* match all tags */
 		tag_mask = 0xF;
@@ -358,7 +358,7 @@ int hpsb_iso_xmit_queue_packet(struct hp
 		}
 	}
 
-out:	
+out:
 	spin_unlock_irqrestore(&iso->lock, flags);
 	return rv;
 }
--- diff/drivers/ieee1394/nodemgr.c	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/ieee1394/nodemgr.c	2004-04-21 10:45:34.273493136 +0100
@@ -88,7 +88,7 @@ static struct csr1212_bus_ops nodemgr_cs
 };
 
 
-/* 
+/*
  * Basically what we do here is start off retrieving the bus_info block.
  * From there will fill in some info about the node, verify it is of IEEE
  * 1394 type, and that the crc checks out ok. After that we start off with
@@ -102,7 +102,7 @@ static struct csr1212_bus_ops nodemgr_cs
  * that's easy to parse by the protocol interface.
  */
 
-/* 
+/*
  * The nodemgr relies heavily on the Driver Model for device callbacks and
  * driver/device mappings. The old nodemgr used to handle all this itself,
  * but now we are much simpler because of the LDM.
@@ -273,7 +273,7 @@ static ssize_t fw_show_ne_bus_options(st
 		       ne->busopt.irmc,
 		       ne->busopt.cmc, ne->busopt.isc, ne->busopt.bmc,
 		       ne->busopt.pmc, ne->busopt.generation, ne->busopt.lnkspd,
-		       ne->busopt.max_rec, 
+		       ne->busopt.max_rec,
 		       ne->busopt.max_rom,
 		       ne->busopt.cyc_clk_acc);
 }
@@ -328,7 +328,7 @@ static ssize_t fw_get_ignore_driver(stru
 	struct unit_directory *ud = container_of(dev, struct unit_directory, device);
 
 	return sprintf(buf, "%d\n", ud->ignore_driver);
-}	
+}
 static DEVICE_ATTR(ignore_driver, S_IWUSR | S_IRUGO, fw_get_ignore_driver, fw_set_ignore_driver);
 
 
@@ -356,7 +356,6 @@ static int nodemgr_rescan_bus_thread(voi
 {
 	/* No userlevel access needed */
 	daemonize("kfwrescan");
-	allow_signal(SIGTERM);
 
 	bus_rescan_devices(&ieee1394_bus_type);
 
@@ -726,7 +725,7 @@ static void nodemgr_update_bus_options(s
 	ne->busopt.max_rom	= (busoptions >> 8) & 0x3;
 	ne->busopt.generation   = (busoptions >> 4) & 0xf;
 	ne->busopt.lnkspd       = busoptions & 0x7;
-	
+
 	HPSB_VERBOSE("NodeMgr: raw=0x%08x irmc=%d cmc=%d isc=%d bmc=%d pmc=%d "
 		     "cyc_clk_acc=%d max_rec=%d max_rom=%d gen=%d lspd=%d",
 		     busoptions, ne->busopt.irmc, ne->busopt.cmc,
@@ -1012,7 +1011,7 @@ static void nodemgr_process_root_directo
 
 		case CSR1212_KV_ID_UNIT:
 			nodemgr_process_unit_directory(hi, ne, kv, &ud_id, NULL);
-			break;			
+			break;
 
 		case CSR1212_KV_ID_DESCRIPTOR:
 			if (last_key_id == CSR1212_KV_ID_VENDOR) {
@@ -1056,13 +1055,14 @@ static int nodemgr_hotplug(struct class_
 
 #define PUT_ENVP(fmt,val) 					\
 do {								\
+    	int printed;						\
 	envp[i++] = buffer;					\
-	length += snprintf(buffer, buffer_size - length,	\
+	printed = snprintf(buffer, buffer_size - length,	\
 			   fmt, val);				\
-	if ((buffer_size - length <= 0) || (i >= num_envp))	\
+	if ((buffer_size - (length+printed) <= 0) || (i >= num_envp))	\
 		return -ENOMEM;					\
-	++length;						\
-	buffer += length;					\
+	length += printed+1;					\
+	buffer += printed+1;					\
 } while (0)
 
 	PUT_ENVP("VENDOR_ID=%06x", ud->vendor_id);
@@ -1084,7 +1084,7 @@ static int nodemgr_hotplug(struct class_
 			   char *buffer, int buffer_size)
 {
 	return -ENODEV;
-} 
+}
 
 #endif /* CONFIG_HOTPLUG */
 
@@ -1150,7 +1150,6 @@ static void nodemgr_update_node(struct n
 	ne->generation = generation;
 }
 
-		
 
 
 static void nodemgr_node_scan_one(struct host_info *hi,
@@ -1381,8 +1380,9 @@ static void nodemgr_node_probe(struct ho
 static int nodemgr_do_irm_duties(struct hpsb_host *host, int cycles)
 {
 	quadlet_t bc;
-        
-	if (!host->is_irm)
+
+	/* if irm_id == -1 then there is no IRM on this bus */
+	if (!host->is_irm || host->irm_id == (nodeid_t)-1)
 		return 1;
 
 	host->csr.broadcast_channel |= 0x40000000;  /* set validity bit */
@@ -1467,7 +1467,6 @@ static int nodemgr_host_thread(void *__h
 
 	/* No userlevel access needed */
 	daemonize(hi->daemon_name);
-	allow_signal(SIGTERM);
 
 	/* Setup our device-model entries */
 	nodemgr_create_host_dev_files(host);
@@ -1611,7 +1610,7 @@ int hpsb_node_read(struct node_entry *ne
 			 addr, buffer, length);
 }
 
-int hpsb_node_write(struct node_entry *ne, u64 addr, 
+int hpsb_node_write(struct node_entry *ne, u64 addr,
 		    quadlet_t *buffer, size_t length)
 {
 	unsigned int generation = ne->generation;
@@ -1621,7 +1620,7 @@ int hpsb_node_write(struct node_entry *n
 			  addr, buffer, length);
 }
 
-int hpsb_node_lock(struct node_entry *ne, u64 addr, 
+int hpsb_node_lock(struct node_entry *ne, u64 addr,
 		   int extcode, quadlet_t *data, quadlet_t arg)
 {
 	unsigned int generation = ne->generation;
--- diff/drivers/ieee1394/nodemgr.h	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/ieee1394/nodemgr.h	2004-04-21 10:45:34.273493136 +0100
@@ -169,7 +169,7 @@ struct hpsb_host *hpsb_get_host_by_ne(st
 /*
  * This will fill in the given, pre-initialised hpsb_packet with the current
  * information from the node entry (host, node ID, generation number).  It will
- * return false if the node owning the GUID is not accessible (and not modify the 
+ * return false if the node owning the GUID is not accessible (and not modify the
  * hpsb_packet) and return true otherwise.
  *
  * Note that packet sending may still fail in hpsb_send_packet if a bus reset
@@ -181,9 +181,9 @@ void hpsb_node_fill_packet(struct node_e
 
 int hpsb_node_read(struct node_entry *ne, u64 addr,
 		   quadlet_t *buffer, size_t length);
-int hpsb_node_write(struct node_entry *ne, u64 addr, 
+int hpsb_node_write(struct node_entry *ne, u64 addr,
 		    quadlet_t *buffer, size_t length);
-int hpsb_node_lock(struct node_entry *ne, u64 addr, 
+int hpsb_node_lock(struct node_entry *ne, u64 addr,
 		   int extcode, quadlet_t *data, quadlet_t arg);
 
 
--- diff/drivers/ieee1394/ohci1394.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/ieee1394/ohci1394.c	2004-04-21 10:45:34.277492528 +0100
@@ -32,7 +32,7 @@
  * Things implemented, but still in test phase:
  * . Iso Transmit
  * . Async Stream Packets Transmit (Receive done via Iso interface)
- * 
+ *
  * Things not implemented:
  * . DMA error recovery
  *
@@ -41,7 +41,7 @@
  *   added LONG_RESET_ROOT and SHORT_RESET_ROOT for root holdoff --kk
  */
 
-/* 
+/*
  * Acknowledgments:
  *
  * Adam J Richter <adam@yggdrasil.com>
@@ -162,7 +162,7 @@ printk(level "%s: " fmt "\n" , OHCI1394_
 printk(level "%s: fw-host%d: " fmt "\n" , OHCI1394_DRIVER_NAME, ohci->host->id , ## args)
 
 static char version[] __devinitdata =
-	"$Rev: 1172 $ Ben Collins <bcollins@debian.org>";
+	"$Rev: 1203 $ Ben Collins <bcollins@debian.org>";
 
 /* Module Parameters */
 static int phys_dma = 1;
@@ -185,7 +185,7 @@ static int alloc_dma_trm_ctx(struct ti_o
 static void ohci1394_pci_remove(struct pci_dev *pdev);
 
 #ifndef __LITTLE_ENDIAN
-static unsigned hdr_sizes[] = 
+static unsigned hdr_sizes[] =
 {
 	3,	/* TCODE_WRITEQ */
 	4,	/* TCODE_WRITEB */
@@ -221,7 +221,7 @@ static inline void packet_swab(quadlet_t
  * IEEE-1394 functionality section *
  ***********************************/
 
-static u8 get_phy_reg(struct ti_ohci *ohci, u8 addr) 
+static u8 get_phy_reg(struct ti_ohci *ohci, u8 addr)
 {
 	int i;
 	unsigned long flags;
@@ -243,9 +243,9 @@ static u8 get_phy_reg(struct ti_ohci *oh
 	if (i >= OHCI_LOOP_COUNT)
 		PRINT (KERN_ERR, "Get PHY Reg timeout [0x%08x/0x%08x/%d]",
 		       r, r & 0x80000000, i);
-  
+
 	spin_unlock_irqrestore (&ohci->phy_reg_lock, flags);
-     
+
 	return (r & 0x00ff0000) >> 16;
 }
 
@@ -303,7 +303,7 @@ static void handle_selfid(struct ti_ohci
 	else
 		q0 = q[0];
 
-	if ((self_id_count & 0x80000000) || 
+	if ((self_id_count & 0x80000000) ||
 	    ((self_id_count & 0x00FF0000) != (q0 & 0x00FF0000))) {
 		PRINT(KERN_ERR,
 		      "Error in reception of SelfID packets [0x%08x/0x%08x] (count: %d)",
@@ -335,7 +335,7 @@ static void handle_selfid(struct ti_ohci
 			q0 = q[0];
 			q1 = q[1];
 		}
-		
+
 		if (q0 == ~q1) {
 			DBGMSG ("SelfID packet 0x%x received", q0);
 			hpsb_selfid_received(host, cpu_to_be32(q0));
@@ -358,7 +358,7 @@ static void ohci_soft_reset(struct ti_oh
 	int i;
 
 	reg_write(ohci, OHCI1394_HCControlSet, OHCI1394_HCControl_softReset);
-  
+
 	for (i = 0; i < OHCI_LOOP_COUNT; i++) {
 		if (!(reg_read(ohci, OHCI1394_HCControlSet) & OHCI1394_HCControl_softReset))
 			break;
@@ -367,32 +367,6 @@ static void ohci_soft_reset(struct ti_oh
 	DBGMSG ("Soft reset finished");
 }
 
-static int run_context(struct ti_ohci *ohci, int reg, char *msg)
-{
-	u32 nodeId;
-
-	/* check that the node id is valid */
-	nodeId = reg_read(ohci, OHCI1394_NodeID);
-	if (!(nodeId&0x80000000)) {
-		PRINT(KERN_ERR,
-		      "Running dma failed because Node ID is not valid");
-		return -1;
-	}
-
-	/* check that the node number != 63 */
-	if ((nodeId&0x3f)==63) {
-		PRINT(KERN_ERR,
-		      "Running dma failed because Node ID == 63");
-		return -1;
-	}
-
-	/* Run the dma context */
-	reg_write(ohci, reg, 0x8000);
-
-	if (msg) PRINT(KERN_DEBUG, "%s", msg);
-
-	return 0;
-}
 
 /* Generate the dma receive prgs and start the context */
 static void initialize_dma_rcv_ctx(struct dma_rcv_ctx *d, int generate_irq)
@@ -404,7 +378,7 @@ static void initialize_dma_rcv_ctx(struc
 
 	for (i=0; i<d->num_desc; i++) {
 		u32 c;
-		
+
 		c = DMA_CTL_INPUT_MORE | DMA_CTL_UPDATE | DMA_CTL_BRANCH;
 		if (generate_irq)
 			c |= DMA_CTL_IRQ;
@@ -433,7 +407,7 @@ static void initialize_dma_rcv_ctx(struc
 
 		/* Set bufferFill, isochHeader, multichannel for IR context */
 		reg_write(ohci, d->ctrlSet, 0xd0000000);
-			
+
 		/* Set the context match register to match on all tags */
 		reg_write(ohci, d->ctxtMatch, 0xf0000000);
 
@@ -505,7 +479,7 @@ static void ohci_initialize(struct ti_oh
 
 	spin_lock_init(&ohci->phy_reg_lock);
 	spin_lock_init(&ohci->event_lock);
-  
+
 	/* Put some defaults to these undefined bus options */
 	buf = reg_read(ohci, OHCI1394_BusOptions);
 	buf |=  0xE0000000; /* Enable IRMC, CMC and ISC */
@@ -521,7 +495,7 @@ static void ohci_initialize(struct ti_oh
 
 	/* Clear link control register */
 	reg_write(ohci, OHCI1394_LinkControlClear, 0xffffffff);
-  
+
 	/* Enable cycle timer and cycle master and set the IRM
 	 * contender bit in our self ID packets. */
 	reg_write(ohci, OHCI1394_LinkControlSet, OHCI1394_LinkControl_CycleTimerEnable |
@@ -539,10 +513,10 @@ static void ohci_initialize(struct ti_oh
 	reg_write(ohci, OHCI1394_ConfigROMmap, ohci->csr_config_rom_bus);
 
 	/* Now get our max packet size */
-	ohci->max_packet_size = 
+	ohci->max_packet_size =
 		1<<(((reg_read(ohci, OHCI1394_BusOptions)>>12)&0xf)+1);
 
-	/* Don't accept phy packets into AR request context */ 
+	/* Don't accept phy packets into AR request context */
 	reg_write(ohci, OHCI1394_LinkControlClear, 0x00000400);
 
 	/* Clear the interrupt mask */
@@ -561,15 +535,15 @@ static void ohci_initialize(struct ti_oh
 	initialize_dma_trm_ctx(&ohci->at_req_context);
 	initialize_dma_trm_ctx(&ohci->at_resp_context);
 
-	/* 
-	 * Accept AT requests from all nodes. This probably 
+	/*
+	 * Accept AT requests from all nodes. This probably
 	 * will have to be controlled from the subsystem
 	 * on a per node basis.
 	 */
 	reg_write(ohci,OHCI1394_AsReqFilterHiSet, 0x80000000);
 
 	/* Specify AT retries */
-	reg_write(ohci, OHCI1394_ATRetries, 
+	reg_write(ohci, OHCI1394_ATRetries,
 		  OHCI1394_MAX_AT_REQ_RETRIES |
 		  (OHCI1394_MAX_AT_RESP_RETRIES<<4) |
 		  (OHCI1394_MAX_PHYS_RESP_RETRIES<<8));
@@ -580,8 +554,8 @@ static void ohci_initialize(struct ti_oh
 	/* Enable interrupts */
 	reg_write(ohci, OHCI1394_IntMaskSet,
 		  OHCI1394_unrecoverableError |
-		  OHCI1394_masterIntEnable | 
-		  OHCI1394_busReset | 
+		  OHCI1394_masterIntEnable |
+		  OHCI1394_busReset |
 		  OHCI1394_selfIDComplete |
 		  OHCI1394_RSPkt |
 		  OHCI1394_RQPkt |
@@ -620,13 +594,46 @@ static void ohci_initialize(struct ti_oh
 		if (status & 0x20)
 			set_phy_reg(ohci, 8, status & ~1);
 	}
+
+        /* Serial EEPROM Sanity check. */
+        if ((ohci->max_packet_size < 512) ||
+	    (ohci->max_packet_size > 4096)) {
+		/* Serial EEPROM contents are suspect, set a sane max packet
+		 * size and print the raw contents for bug reports if verbose
+		 * debug is enabled. */
+#ifdef CONFIG_IEEE1394_VERBOSEDEBUG
+		int i;
+#endif
+
+		PRINT(KERN_DEBUG, "Serial EEPROM has suspicious values, "
+                      "attempting to setting max_packet_size to 512 bytes");
+		reg_write(ohci, OHCI1394_BusOptions,
+			  (reg_read(ohci, OHCI1394_BusOptions) & 0xf007) | 0x8002);
+		ohci->max_packet_size = 512;
+#ifdef CONFIG_IEEE1394_VERBOSEDEBUG
+		PRINT(KERN_DEBUG, "    EEPROM Present: %d",
+		      (reg_read(ohci, OHCI1394_Version) >> 24) & 0x1);
+		reg_write(ohci, OHCI1394_GUID_ROM, 0x80000000);
+
+		for (i = 0;
+		     ((i < 1000) &&
+		      (reg_read(ohci, OHCI1394_GUID_ROM) & 0x80000000)); i++)
+			udelay(10);
+
+		for (i = 0; i < 0x20; i++) {
+			reg_write(ohci, OHCI1394_GUID_ROM, 0x02000000);
+			PRINT(KERN_DEBUG, "    EEPROM %02x: %02x", i,
+			      (reg_read(ohci, OHCI1394_GUID_ROM) >> 16) & 0xff);
+		}
+#endif
+	}
 }
 
-/* 
+/*
  * Insert a packet in the DMA fifo and generate the DMA prg
  * FIXME: rewrite the program in order to accept packets crossing
  *        page boundaries.
- *        check also that a single dma descriptor doesn't cross a 
+ *        check also that a single dma descriptor doesn't cross a
  *        page boundary.
  */
 static void insert_packet(struct ti_ohci *ohci,
@@ -644,13 +651,13 @@ static void insert_packet(struct ti_ohci
 	d->prg_cpu[idx]->begin.branchAddress = 0;
 
 	if (d->type == DMA_CTX_ASYNC_RESP) {
-		/* 
+		/*
 		 * For response packets, we need to put a timeout value in
-		 * the 16 lower bits of the status... let's try 1 sec timeout 
-		 */ 
+		 * the 16 lower bits of the status... let's try 1 sec timeout
+		 */
 		cycleTimer = reg_read(ohci, OHCI1394_IsochronousCycleTimer);
 		d->prg_cpu[idx]->begin.status = cpu_to_le32(
-			(((((cycleTimer>>25)&0x7)+1)&0x7)<<13) | 
+			(((((cycleTimer>>25)&0x7)+1)&0x7)<<13) |
 			((cycleTimer&0x01fff000)>>12));
 
 		DBGMSG("cycleTimer: %08x timeStamp: %08x",
@@ -674,7 +681,7 @@ static void insert_packet(struct ti_ohci
 			} else {
 				/* Sending a normal async request or response */
 				d->prg_cpu[idx]->data[1] =
-					(packet->header[1] & 0xFFFF) | 
+					(packet->header[1] & 0xFFFF) |
 					(packet->header[0] & 0xFFFF0000);
 				d->prg_cpu[idx]->data[2] = packet->header[2];
 				d->prg_cpu[idx]->data[3] = packet->header[3];
@@ -694,10 +701,10 @@ static void insert_packet(struct ti_ohci
 			}
                         d->prg_cpu[idx]->end.control =
                                 cpu_to_le32(DMA_CTL_OUTPUT_LAST |
-					    DMA_CTL_IRQ | 
+					    DMA_CTL_IRQ |
 					    DMA_CTL_BRANCH |
 					    packet->data_size);
-                        /* 
+                        /*
                          * Check that the packet data buffer
                          * does not cross a page boundary.
 			 *
@@ -706,7 +713,7 @@ static void insert_packet(struct ti_ohci
 			 * problem.
                          */
 #if 0
-                        if (cross_bound((unsigned long)packet->data, 
+                        if (cross_bound((unsigned long)packet->data,
                                         packet->data_size)>0) {
                                 /* FIXME: do something about it */
                                 PRINT(KERN_ERR,
@@ -723,28 +730,28 @@ static void insert_packet(struct ti_ohci
 
                         d->prg_cpu[idx]->end.branchAddress = 0;
                         d->prg_cpu[idx]->end.status = 0;
-                        if (d->branchAddrPtr) 
+                        if (d->branchAddrPtr)
                                 *(d->branchAddrPtr) =
 					cpu_to_le32(d->prg_bus[idx] | 0x3);
                         d->branchAddrPtr =
                                 &(d->prg_cpu[idx]->end.branchAddress);
                 } else { /* quadlet transmit */
                         if (packet->type == hpsb_raw)
-                                d->prg_cpu[idx]->begin.control = 
+                                d->prg_cpu[idx]->begin.control =
 					cpu_to_le32(DMA_CTL_OUTPUT_LAST |
 						    DMA_CTL_IMMEDIATE |
-						    DMA_CTL_IRQ | 
+						    DMA_CTL_IRQ |
 						    DMA_CTL_BRANCH |
 						    (packet->header_size + 4));
                         else
                                 d->prg_cpu[idx]->begin.control =
 					cpu_to_le32(DMA_CTL_OUTPUT_LAST |
 						    DMA_CTL_IMMEDIATE |
-						    DMA_CTL_IRQ | 
+						    DMA_CTL_IRQ |
 						    DMA_CTL_BRANCH |
 						    packet->header_size);
 
-                        if (d->branchAddrPtr) 
+                        if (d->branchAddrPtr)
                                 *(d->branchAddrPtr) =
 					cpu_to_le32(d->prg_bus[idx] | 0x2);
                         d->branchAddrPtr =
@@ -756,11 +763,11 @@ static void insert_packet(struct ti_ohci
                         (packet->header[0] & 0xFFFF);
                 d->prg_cpu[idx]->data[1] = packet->header[0] & 0xFFFF0000;
 		packet_swab(d->prg_cpu[idx]->data, packet->tcode);
-  
-                d->prg_cpu[idx]->begin.control = 
-			cpu_to_le32(DMA_CTL_OUTPUT_MORE | 
+
+                d->prg_cpu[idx]->begin.control =
+			cpu_to_le32(DMA_CTL_OUTPUT_MORE |
 				    DMA_CTL_IMMEDIATE | 0x8);
-                d->prg_cpu[idx]->end.control = 
+                d->prg_cpu[idx]->end.control =
 			cpu_to_le32(DMA_CTL_OUTPUT_LAST |
 				    DMA_CTL_UPDATE |
 				    DMA_CTL_IRQ |
@@ -790,7 +797,7 @@ static void insert_packet(struct ti_ohci
                        d->prg_cpu[idx]->end.address,
                        d->prg_cpu[idx]->end.branchAddress,
                        d->prg_cpu[idx]->end.status);
-                if (d->branchAddrPtr) 
+                if (d->branchAddrPtr)
   		        *(d->branchAddrPtr) = cpu_to_le32(d->prg_bus[idx] | 0x3);
                 d->branchAddrPtr = &(d->prg_cpu[idx]->end.branchAddress);
         }
@@ -798,7 +805,7 @@ static void insert_packet(struct ti_ohci
 
 	/* queue the packet in the appropriate context queue */
 	list_add_tail(&packet->driver_list, &d->fifo_list);
-	d->prg_ind = (d->prg_ind+1)%d->num_desc;
+	d->prg_ind = (d->prg_ind + 1) % d->num_desc;
 }
 
 /*
@@ -806,46 +813,54 @@ static void insert_packet(struct ti_ohci
  * and runs or wakes up the DMA prg if necessary.
  *
  * The function MUST be called with the d->lock held.
- */ 
-static int dma_trm_flush(struct ti_ohci *ohci, struct dma_trm_ctx *d)
+ */
+static void dma_trm_flush(struct ti_ohci *ohci, struct dma_trm_ctx *d)
 {
-	struct hpsb_packet *p;
-	int idx,z;
+	struct hpsb_packet *packet, *ptmp;
+	int idx = d->prg_ind;
+	int z = 0;
 
-	if (list_empty(&d->pending_list) || d->free_prgs == 0)
-		return 0;
+	/* insert the packets into the dma fifo */
+	list_for_each_entry_safe(packet, ptmp, &d->pending_list, driver_list) {
+		if (!d->free_prgs)
+			break;
 
-	p = driver_packet(d->pending_list.next);
-	idx = d->prg_ind;
-	z = (p->data_size) ? 3 : 2;
+		/* For the first packet only */
+		if (!z)
+			z = (packet->data_size) ? 3 : 2;
 
-	/* insert the packets into the dma fifo */
-	while (d->free_prgs > 0 && !list_empty(&d->pending_list)) {
-		struct hpsb_packet *p = driver_packet(d->pending_list.next);
-		list_del(&p->driver_list);
-		insert_packet(ohci, d, p);
+		/* Insert the packet */
+		list_del_init(&packet->driver_list);
+		insert_packet(ohci, d, packet);
 	}
 
-	if (d->free_prgs == 0)
-		DBGMSG("Transmit DMA FIFO ctx=%d is full... waiting", d->ctx);
+	/* Nothing must have been done, either no free_prgs or no packets */
+	if (z == 0)
+		return;
 
-	/* Is the context running ? (should be unless it is 
+	/* Is the context running ? (should be unless it is
 	   the first packet to be sent in this context) */
 	if (!(reg_read(ohci, d->ctrlSet) & 0x8000)) {
+		u32 nodeId = reg_read(ohci, OHCI1394_NodeID);
+
 		DBGMSG("Starting transmit DMA ctx=%d",d->ctx);
-		reg_write(ohci, d->cmdPtr, d->prg_bus[idx]|z);
-		run_context(ohci, d->ctrlSet, NULL);
-	}
-	else {
+		reg_write(ohci, d->cmdPtr, d->prg_bus[idx] | z);
+
+		/* Check that the node id is valid, and not 63 */
+		if (!(nodeId & 0x80000000) || (nodeId & 0x3f) == 63)
+			PRINT(KERN_ERR, "Running dma failed because Node ID is not valid");
+		else
+			reg_write(ohci, d->ctrlSet, 0x8000);
+	} else {
 		/* Wake up the dma context if necessary */
-		if (!(reg_read(ohci, d->ctrlSet) & 0x400)) {
+		if (!(reg_read(ohci, d->ctrlSet) & 0x400))
 			DBGMSG("Waking transmit DMA ctx=%d",d->ctx);
-		}
 
 		/* do this always, to avoid race condition */
 		reg_write(ohci, d->ctrlSet, 0x1000);
 	}
-	return 1;
+
+	return;
 }
 
 /* Transmission of an async or iso packet */
@@ -871,7 +886,7 @@ static int ohci_transmit(struct hpsb_hos
 		 * interrupt context, so we bail out if that is the
 		 * case. I don't see anyone sending ISO packets from
 		 * interrupt context anyway... */
-		
+
 		if (ohci->it_legacy_context.ohci == NULL) {
 			if (in_interrupt()) {
 				PRINT(KERN_ERR,
@@ -889,11 +904,11 @@ static int ohci_transmit(struct hpsb_hos
 
 			initialize_dma_trm_ctx(&ohci->it_legacy_context);
 		}
-		
+
 		d = &ohci->it_legacy_context;
 	} else if ((packet->tcode & 0x02) && (packet->tcode != TCODE_ISO_DATA))
 		d = &ohci->at_resp_context;
-	else 
+	else
 		d = &ohci->at_req_context;
 
 	spin_lock_irqsave(&d->lock,flags);
@@ -986,7 +1001,7 @@ static int ohci_devctl(struct hpsb_host 
 				 * enable cycleTimer, cycleMaster
 				 */
 				DBGMSG("Cycle master enabled");
-				reg_write(ohci, OHCI1394_LinkControlSet, 
+				reg_write(ohci, OHCI1394_LinkControlSet,
 					  OHCI1394_LinkControl_CycleTimerEnable |
 					  OHCI1394_LinkControl_CycleMaster);
 			}
@@ -1011,7 +1026,7 @@ static int ohci_devctl(struct hpsb_host 
 
 		if (arg<0 || arg>63) {
 			PRINT(KERN_ERR,
-			      "%s: IS0 listen channel %d is out of range", 
+			      "%s: IS0 listen channel %d is out of range",
 			      __FUNCTION__, arg);
 			return -EFAULT;
 		}
@@ -1038,7 +1053,7 @@ static int ohci_devctl(struct hpsb_host 
 
 		if (ohci->ISO_channel_usage & mask) {
 			PRINT(KERN_ERR,
-			      "%s: IS0 listen channel %d is already used", 
+			      "%s: IS0 listen channel %d is already used",
 			      __FUNCTION__, arg);
 			spin_unlock_irqrestore(&ohci->IR_channel_lock, flags);
 			return -EFAULT;
@@ -1047,12 +1062,12 @@ static int ohci_devctl(struct hpsb_host 
 		ohci->ISO_channel_usage |= mask;
 		ohci->ir_legacy_channels |= mask;
 
-		if (arg>31) 
-			reg_write(ohci, OHCI1394_IRMultiChanMaskHiSet, 
-				  1<<(arg-32));			
+		if (arg>31)
+			reg_write(ohci, OHCI1394_IRMultiChanMaskHiSet,
+				  1<<(arg-32));
 		else
-			reg_write(ohci, OHCI1394_IRMultiChanMaskLoSet, 
-				  1<<arg);			
+			reg_write(ohci, OHCI1394_IRMultiChanMaskLoSet,
+				  1<<arg);
 
                 spin_unlock_irqrestore(&ohci->IR_channel_lock, flags);
                 DBGMSG("Listening enabled on channel %d", arg);
@@ -1064,32 +1079,32 @@ static int ohci_devctl(struct hpsb_host 
 
 		if (arg<0 || arg>63) {
 			PRINT(KERN_ERR,
-			      "%s: IS0 unlisten channel %d is out of range", 
+			      "%s: IS0 unlisten channel %d is out of range",
 			      __FUNCTION__, arg);
 			return -EFAULT;
 		}
 
 		mask = (u64)0x1<<arg;
-		
+
                 spin_lock_irqsave(&ohci->IR_channel_lock, flags);
 
 		if (!(ohci->ISO_channel_usage & mask)) {
 			PRINT(KERN_ERR,
-			      "%s: IS0 unlisten channel %d is not used", 
+			      "%s: IS0 unlisten channel %d is not used",
 			      __FUNCTION__, arg);
 			spin_unlock_irqrestore(&ohci->IR_channel_lock, flags);
 			return -EFAULT;
 		}
-		
+
 		ohci->ISO_channel_usage &= ~mask;
 		ohci->ir_legacy_channels &= ~mask;
 
-		if (arg>31) 
-			reg_write(ohci, OHCI1394_IRMultiChanMaskHiClear, 
-				  1<<(arg-32));			
+		if (arg>31)
+			reg_write(ohci, OHCI1394_IRMultiChanMaskHiClear,
+				  1<<(arg-32));
 		else
-			reg_write(ohci, OHCI1394_IRMultiChanMaskLoClear, 
-				  1<<arg);			
+			reg_write(ohci, OHCI1394_IRMultiChanMaskLoClear,
+				  1<<arg);
 
                 spin_unlock_irqrestore(&ohci->IR_channel_lock, flags);
                 DBGMSG("Listening disabled on channel %d", arg);
@@ -1215,7 +1230,7 @@ static int ohci_iso_recv_init(struct hps
 
 		/* iso->irq_interval is in packets - translate that to blocks */
 		if (iso->irq_interval == 1)
-			recv->block_irq_interval = 1;			
+			recv->block_irq_interval = 1;
 		else
 			recv->block_irq_interval = iso->irq_interval *
 							((recv->nblocks+1)/iso->buf_packets);
@@ -1241,7 +1256,7 @@ static int ohci_iso_recv_init(struct hps
 
 		for (recv->buf_stride = 8; recv->buf_stride < max_packet_size;
 		    recv->buf_stride *= 2);
-	
+
 		if (recv->buf_stride*iso->buf_packets > iso->buf_size ||
 		   recv->buf_stride > PAGE_SIZE) {
 			/* this shouldn't happen, but anyway... */
@@ -1285,7 +1300,7 @@ static int ohci_iso_recv_init(struct hps
 		reg_write(recv->ohci, OHCI1394_IRMultiChanMaskHiClear, 0xFFFFFFFF);
 		reg_write(recv->ohci, OHCI1394_IRMultiChanMaskLoClear, 0xFFFFFFFF);
 	}
-		
+
 	/* write the DMA program */
 	ohci_iso_recv_program(iso);
 
@@ -1293,7 +1308,7 @@ static int ohci_iso_recv_init(struct hps
 	       " (%u bytes), using %u blocks, buf_stride %u, block_irq_interval %d",
 	       recv->dma_mode == BUFFER_FILL_MODE ?
 	       "buffer-fill" : "packet-per-buffer",
-	       iso->buf_size/PAGE_SIZE, iso->buf_size, 
+	       iso->buf_size/PAGE_SIZE, iso->buf_size,
 	       recv->nblocks, recv->buf_stride, recv->block_irq_interval);
 
 	return 0;
@@ -1309,7 +1324,7 @@ static void ohci_iso_recv_stop(struct hp
 
 	/* disable interrupts */
 	reg_write(recv->ohci, OHCI1394_IsoRecvIntMaskClear, 1 << recv->task.context);
-		
+
 	/* halt DMA */
 	ohci1394_stop_context(recv->ohci, recv->ContextControlClear, NULL);
 }
@@ -1457,20 +1472,20 @@ static int ohci_iso_recv_start(struct hp
 
 	if (cycle != -1) {
 		u32 seconds;
-		
+
 		/* enable cycleMatch */
 		reg_write(recv->ohci, recv->ContextControlSet, (1 << 29));
 
 		/* set starting cycle */
 		cycle &= 0x1FFF;
-		
+
 		/* 'cycle' is only mod 8000, but we also need two 'seconds' bits -
 		   just snarf them from the current time */
 		seconds = reg_read(recv->ohci, OHCI1394_IsochronousCycleTimer) >> 25;
 
 		/* advance one second to give some extra time for DMA to start */
 		seconds += 1;
-		
+
 		cycle |= (seconds & 3) << 13;
 
 		contextMatch |= cycle << 12;
@@ -1535,7 +1550,7 @@ static void ohci_iso_recv_release_block(
 	next->control |= cpu_to_le32(3 << 20);
 	next->status = cpu_to_le32(recv->buf_stride);
 
-	/* link prev to next */	
+	/* link prev to next */
 	prev->branchAddress = cpu_to_le32(dma_prog_region_offset_to_bus(&recv->prog,
 									sizeof(struct dma_cmd) * next_i)
 					  | 1); /* Z=1 */
@@ -1593,15 +1608,15 @@ static void ohci_iso_recv_bufferfill_par
 	int wake = 0;
 	int runaway = 0;
 	struct ti_ohci *ohci = recv->ohci;
-		
+
 	while (1) {
 		/* we expect the next parsable packet to begin at recv->dma_offset */
 		/* note: packet layout is as shown in section 10.6.1.1 of the OHCI spec */
-		
+
 		unsigned int offset;
 		unsigned short len, cycle;
 		unsigned char channel, tag, sy;
-		
+
 		unsigned char *p = iso->data_buf.kvirt;
 
 		unsigned int this_block = recv->dma_offset/recv->buf_stride;
@@ -1619,26 +1634,26 @@ static void ohci_iso_recv_bufferfill_par
 			break;
 
 		wake = 1;
-		
+
 		/* parse data length, tag, channel, and sy */
-		
+
 		/* note: we keep our own local copies of 'len' and 'offset'
 		   so the user can't mess with them by poking in the mmap area */
-		
+
 		len = p[recv->dma_offset+2] | (p[recv->dma_offset+3] << 8);
 
 		if (len > 4096) {
 			PRINT(KERN_ERR,
 			      "IR DMA error - bogus 'len' value %u\n", len);
 		}
-		
+
 		channel = p[recv->dma_offset+1] & 0x3F;
 		tag = p[recv->dma_offset+1] >> 6;
 		sy = p[recv->dma_offset+0] & 0xF;
 
 		/* advance to data payload */
 		recv->dma_offset += 4;
-		
+
 		/* check for wrap-around */
 		if (recv->dma_offset >= recv->buf_stride*recv->nblocks) {
 			recv->dma_offset -= recv->buf_stride*recv->nblocks;
@@ -1651,7 +1666,7 @@ static void ohci_iso_recv_bufferfill_par
 		recv->dma_offset += len;
 
 		/* payload is padded to 4 bytes */
-		if (len % 4) { 
+		if (len % 4) {
 			recv->dma_offset += 4 - (len%4);
 		}
 
@@ -1700,13 +1715,13 @@ static void ohci_iso_recv_bufferfill_tas
 
 	/* loop over all blocks */
 	for (loop = 0; loop < recv->nblocks; loop++) {
-		
+
 		/* check block_dma to see if it's done */
 		struct dma_cmd *im = &recv->block[recv->block_dma];
-		
+
 		/* check the DMA descriptor for new writes to xferStatus */
 		u16 xferstatus = le32_to_cpu(im->status) >> 16;
-		
+
 		/* rescount is the number of bytes *remaining to be written* in the block */
 		u16 rescount = le32_to_cpu(im->status) & 0xFFFF;
 
@@ -1728,12 +1743,12 @@ static void ohci_iso_recv_bufferfill_tas
 			   we can't touch it until it's done */
 			break;
 		}
-		
+
 		/* OK, the block is finished... */
-		
+
 		/* sync our view of the block */
 		dma_region_sync_for_cpu(&iso->data_buf, recv->block_dma*recv->buf_stride, recv->buf_stride);
-		
+
 		/* reset the DMA descriptor */
 		im->status = recv->buf_stride;
 
@@ -1756,11 +1771,11 @@ static void ohci_iso_recv_packetperbuf_t
 	int count;
 	int wake = 0;
 	struct ti_ohci *ohci = recv->ohci;
-	
+
 	/* loop over the entire buffer */
 	for (count = 0; count < recv->nblocks; count++) {
 		u32 packet_len = 0;
-		
+
 		/* pointer to the DMA descriptor */
 		struct dma_cmd *il = ((struct dma_cmd*) recv->prog.kvirt) + iso->pkt_dma;
 
@@ -1774,10 +1789,10 @@ static void ohci_iso_recv_packetperbuf_t
 			/* this packet hasn't come in yet; we are done for now */
 			goto out;
 		}
-		
+
 		if (event == 0x11) {
 			/* packet received successfully! */
-			
+
 			/* rescount is the number of bytes *remaining* in the packet buffer,
 			   after the packet was written */
 			packet_len = recv->buf_stride - rescount;
@@ -1790,7 +1805,7 @@ static void ohci_iso_recv_packetperbuf_t
 
 		/* sync our view of the buffer */
 		dma_region_sync_for_cpu(&iso->data_buf, iso->pkt_dma * recv->buf_stride, recv->buf_stride);
-			
+
 		/* record the per-packet info */
 		{
 			/* iso header is 8 bytes ahead of the data payload */
@@ -1806,7 +1821,7 @@ static void ohci_iso_recv_packetperbuf_t
 			/* skip iso header */
 			offset += 8;
 			packet_len -= 8;
-			
+
 			cycle = (hdr[0] | (hdr[1] << 8)) & 0x1FFF;
 			channel = hdr[5] & 0x3F;
 			tag = hdr[5] >> 6;
@@ -1814,7 +1829,7 @@ static void ohci_iso_recv_packetperbuf_t
 
 			hpsb_iso_packet_received(iso, offset, packet_len, cycle, channel, tag, sy);
 		}
-		
+
 		/* reset the DMA descriptor */
 		il->status = recv->buf_stride;
 
@@ -1958,7 +1973,7 @@ static void ohci_iso_xmit_task(unsigned 
 
 		/* DMA descriptor */
 		struct iso_xmit_cmd *cmd = dma_region_i(&xmit->prog, struct iso_xmit_cmd, iso->pkt_dma);
-		
+
 		/* check for new writes to xferStatus */
 		u16 xferstatus = le32_to_cpu(cmd->output_last.status) >> 16;
 		u8  event = xferstatus & 0x1F;
@@ -1971,16 +1986,16 @@ static void ohci_iso_xmit_task(unsigned 
 		if (event != 0x11)
 			PRINT(KERN_ERR,
 			      "IT DMA error - OHCI error code 0x%02x\n", event);
-		
+
 		/* at least one packet went out, so wake up the writer */
 		wake = 1;
-		
+
 		/* parse cycle */
 		cycle = le32_to_cpu(cmd->output_last.status) & 0x1FFF;
 
 		/* tell the subsystem the packet has gone out */
 		hpsb_iso_packet_sent(iso, cycle, event != 0x11);
-		
+
 		/* reset the DMA descriptor for next time */
 		cmd->output_last.status = 0;
 	}
@@ -2101,14 +2116,14 @@ static int ohci_iso_xmit_start(struct hp
 	/* cycle match */
 	if (cycle != -1) {
 		u32 start = cycle & 0x1FFF;
-		
+
 		/* 'cycle' is only mod 8000, but we also need two 'seconds' bits -
 		   just snarf them from the current time */
 		u32 seconds = reg_read(xmit->ohci, OHCI1394_IsochronousCycleTimer) >> 25;
 
 		/* advance one second to give some extra time for DMA to start */
 		seconds += 1;
-		
+
 		start |= (seconds & 3) << 13;
 
 		reg_write(xmit->ohci, xmit->ContextControlSet, 0x80000000 | (start << 16));
@@ -2201,6 +2216,7 @@ static void dma_trm_reset(struct dma_trm
 	unsigned long flags;
 	LIST_HEAD(packet_list);
 	struct ti_ohci *ohci = d->ohci;
+	struct hpsb_packet *packet, *ptmp;
 
 	ohci1394_stop_context(ohci, d->ctrlClear, NULL);
 
@@ -2221,19 +2237,20 @@ static void dma_trm_reset(struct dma_trm
 
 	spin_unlock_irqrestore(&d->lock, flags);
 
-	/* Now process subsystem callbacks for the packets from the
-	 * context. */
+	if (list_empty(&packet_list))
+		return;
 
-	while (!list_empty(&packet_list)) {
-		struct hpsb_packet *p = driver_packet(packet_list.next);
-		PRINT(KERN_INFO,
-		      "AT dma reset ctx=%d, aborting transmission", d->ctx);
-		list_del(&p->driver_list);
-		hpsb_packet_sent(ohci->host, p, ACKX_ABORTED);
+	PRINT(KERN_INFO, "AT dma reset ctx=%d, aborting transmission", d->ctx);
+
+	/* Now process subsystem callbacks for the packets from this
+	 * context. */
+	list_for_each_entry_safe(packet, ptmp, &packet_list, driver_list) {
+		list_del_init(&packet->driver_list);
+		hpsb_packet_sent(ohci->host, packet, ACKX_ABORTED);
 	}
 }
 
-static void ohci_schedule_iso_tasklets(struct ti_ohci *ohci, 
+static void ohci_schedule_iso_tasklets(struct ti_ohci *ohci,
 				       quadlet_t rx_event,
 				       quadlet_t tx_event)
 {
@@ -2393,7 +2410,8 @@ static irqreturn_t ohci_irq_handler(int 
 			ohci1394_stop_context(ohci, d->ctrlClear,
 					      "reqTxComplete");
 		else
-			tasklet_schedule(&d->task);
+			dma_trm_tasklet((unsigned long)d);
+			//tasklet_schedule(&d->task);
 		event &= ~OHCI1394_reqTxComplete;
 	}
 	if (event & OHCI1394_respTxComplete) {
@@ -2436,7 +2454,7 @@ static irqreturn_t ohci_irq_handler(int 
 		event &= ~OHCI1394_isochRx;
 	}
 	if (event & OHCI1394_isochTx) {
-		quadlet_t tx_event;		
+		quadlet_t tx_event;
 
 		tx_event = reg_read(ohci, OHCI1394_IsoXmitIntEventSet);
 		reg_write(ohci, OHCI1394_IsoXmitIntEventClear, tx_event);
@@ -2459,7 +2477,7 @@ static irqreturn_t ohci_irq_handler(int 
 			isroot = (node_id & 0x40000000) != 0;
 
 			DBGMSG("SelfID interrupt received "
-			      "(phyid %d, %s)", phyid, 
+			      "(phyid %d, %s)", phyid,
 			      (isroot ? "root" : "not root"));
 
 			handle_selfid(ohci, host, phyid, isroot);
@@ -2535,10 +2553,10 @@ static void insert_dma_buffer(struct dma
 #define cond_le32_to_cpu(data, noswap) \
 	(noswap ? data : le32_to_cpu(data))
 
-static const int TCODE_SIZE[16] = {20, 0, 16, -1, 16, 20, 20, 0, 
+static const int TCODE_SIZE[16] = {20, 0, 16, -1, 16, 20, 20, 0,
 			    -1, 0, -1, 0, -1, -1, 16, -1};
 
-/* 
+/*
  * Determine the length of a packet in the buffer
  * Optimization suggested by Pascal Drolet <pascal.drolet@informission.ca>
  */
@@ -2669,7 +2687,7 @@ static void dma_rcv_tasklet (unsigned lo
 				offset=0;
 			}
 		}
-		
+
 		/* We get one phy packet to the async descriptor for each
 		 * bus reset. We always ignore it.  */
 		if (tcode != OHCI1394_TCODE_PHY) {
@@ -2687,7 +2705,7 @@ static void dma_rcv_tasklet (unsigned lo
 			ack = (((cond_le32_to_cpu(d->spb[length/4-1], ohci->no_swap_incoming)>>16)&0x1f)
 				== 0x11) ? 1 : 0;
 
-			hpsb_packet_received(ohci->host, d->spb, 
+			hpsb_packet_received(ohci->host, d->spb,
 					     length-4, ack);
 		}
 #ifdef OHCI1394_DEBUG
@@ -2713,24 +2731,23 @@ static void dma_trm_tasklet (unsigned lo
 {
 	struct dma_trm_ctx *d = (struct dma_trm_ctx*)data;
 	struct ti_ohci *ohci = (struct ti_ohci*)(d->ohci);
-	struct hpsb_packet *packet;
+	struct hpsb_packet *packet, *ptmp;
 	unsigned long flags;
 	u32 status, ack;
         size_t datasize;
 
 	spin_lock_irqsave(&d->lock, flags);
 
-	while (!list_empty(&d->fifo_list)) {
-		packet = driver_packet(d->fifo_list.next);
+	list_for_each_entry_safe(packet, ptmp, &d->fifo_list, driver_list) {
                 datasize = packet->data_size;
 		if (datasize && packet->type != hpsb_raw)
 			status = le32_to_cpu(
 				d->prg_cpu[d->sent_ind]->end.status) >> 16;
-		else 
+		else
 			status = le32_to_cpu(
 				d->prg_cpu[d->sent_ind]->begin.status) >> 16;
 
-		if (status == 0) 
+		if (status == 0)
 			/* this packet hasn't been sent yet*/
 			break;
 
@@ -2738,34 +2755,34 @@ static void dma_trm_tasklet (unsigned lo
 		if (datasize)
 			if (((le32_to_cpu(d->prg_cpu[d->sent_ind]->data[0])>>4)&0xf) == 0xa)
 				DBGMSG("Stream packet sent to channel %d tcode=0x%X "
-				       "ack=0x%X spd=%d dataLength=%d ctx=%d", 
+				       "ack=0x%X spd=%d dataLength=%d ctx=%d",
 				       (le32_to_cpu(d->prg_cpu[d->sent_ind]->data[0])>>8)&0x3f,
 				       (le32_to_cpu(d->prg_cpu[d->sent_ind]->data[0])>>4)&0xf,
-				       status&0x1f, (status>>5)&0x3, 
+				       status&0x1f, (status>>5)&0x3,
 				       le32_to_cpu(d->prg_cpu[d->sent_ind]->data[1])>>16,
 				       d->ctx);
 			else
 				DBGMSG("Packet sent to node %d tcode=0x%X tLabel="
-				       "0x%02X ack=0x%X spd=%d dataLength=%d ctx=%d", 
+				       "0x%02X ack=0x%X spd=%d dataLength=%d ctx=%d",
 				       (le32_to_cpu(d->prg_cpu[d->sent_ind]->data[1])>>16)&0x3f,
 				       (le32_to_cpu(d->prg_cpu[d->sent_ind]->data[0])>>4)&0xf,
 				       (le32_to_cpu(d->prg_cpu[d->sent_ind]->data[0])>>10)&0x3f,
 				       status&0x1f, (status>>5)&0x3,
 				       le32_to_cpu(d->prg_cpu[d->sent_ind]->data[3])>>16,
 				       d->ctx);
-		else 
+		else
 			DBGMSG("Packet sent to node %d tcode=0x%X tLabel="
-			       "0x%02X ack=0x%X spd=%d data=0x%08X ctx=%d", 
+			       "0x%02X ack=0x%X spd=%d data=0x%08X ctx=%d",
                                 (le32_to_cpu(d->prg_cpu[d->sent_ind]->data[1])
                                         >>16)&0x3f,
                                 (le32_to_cpu(d->prg_cpu[d->sent_ind]->data[0])
                                         >>4)&0xf,
                                 (le32_to_cpu(d->prg_cpu[d->sent_ind]->data[0])
                                         >>10)&0x3f,
-                                status&0x1f, (status>>5)&0x3, 
+                                status&0x1f, (status>>5)&0x3,
                                 le32_to_cpu(d->prg_cpu[d->sent_ind]->data[3]),
                                 d->ctx);
-#endif		
+#endif
 
 		if (status & 0x10) {
 			ack = status & 0xf;
@@ -2818,11 +2835,11 @@ static void dma_trm_tasklet (unsigned lo
 			}
 		}
 
-                list_del(&packet->driver_list);
+		list_del_init(&packet->driver_list);
 		hpsb_packet_sent(ohci->host, packet, ack);
 
 		if (datasize) {
-			pci_unmap_single(ohci->dev, 
+			pci_unmap_single(ohci->dev,
 					 cpu_to_le32(d->prg_cpu[d->sent_ind]->end.address),
 					 datasize, PCI_DMA_TODEVICE);
 			OHCI_DMA_FREE("single Xmit data packet");
@@ -2867,7 +2884,7 @@ static void free_dma_rcv_ctx(struct dma_
 		for (i=0; i<d->num_desc; i++)
 			if (d->buf_cpu[i] && d->buf_bus[i]) {
 				pci_free_consistent(
-					ohci->dev, d->buf_size, 
+					ohci->dev, d->buf_size,
 					d->buf_cpu[i], d->buf_bus[i]);
 				OHCI_DMA_FREE("consistent dma_rcv buf[%d]", i);
 			}
@@ -2875,7 +2892,7 @@ static void free_dma_rcv_ctx(struct dma_
 		kfree(d->buf_bus);
 	}
 	if (d->prg_cpu) {
-		for (i=0; i<d->num_desc; i++) 
+		for (i=0; i<d->num_desc; i++)
 			if (d->prg_cpu[i] && d->prg_bus[i]) {
 				pci_pool_free(d->prg_pool, d->prg_cpu[i], d->prg_bus[i]);
 				OHCI_DMA_FREE("consistent dma_rcv prg[%d]", i);
@@ -2921,7 +2938,7 @@ alloc_dma_rcv_ctx(struct ti_ohci *ohci, 
 	memset(d->buf_cpu, 0, d->num_desc * sizeof(quadlet_t*));
 	memset(d->buf_bus, 0, d->num_desc * sizeof(dma_addr_t));
 
-	d->prg_cpu = kmalloc(d->num_desc * sizeof(struct dma_cmd*), 
+	d->prg_cpu = kmalloc(d->num_desc * sizeof(struct dma_cmd*),
 			     GFP_KERNEL);
 	d->prg_bus = kmalloc(d->num_desc * sizeof(dma_addr_t), GFP_KERNEL);
 
@@ -2946,11 +2963,11 @@ alloc_dma_rcv_ctx(struct ti_ohci *ohci, 
 	OHCI_DMA_ALLOC("dma_rcv prg pool");
 
 	for (i=0; i<d->num_desc; i++) {
-		d->buf_cpu[i] = pci_alloc_consistent(ohci->dev, 
+		d->buf_cpu[i] = pci_alloc_consistent(ohci->dev,
 						     d->buf_size,
 						     d->buf_bus+i);
 		OHCI_DMA_ALLOC("consistent dma_rcv buf[%d]", i);
-		
+
 		if (d->buf_cpu[i] != NULL) {
 			memset(d->buf_cpu[i], 0, d->buf_size);
 		} else {
@@ -3015,7 +3032,7 @@ static void free_dma_trm_ctx(struct dma_
 	DBGMSG("Freeing dma_trm_ctx %d", d->ctx);
 
 	if (d->prg_cpu) {
-		for (i=0; i<d->num_desc; i++) 
+		for (i=0; i<d->num_desc; i++)
 			if (d->prg_cpu[i] && d->prg_bus[i]) {
 				pci_pool_free(d->prg_pool, d->prg_cpu[i], d->prg_bus[i]);
 				OHCI_DMA_FREE("pool dma_trm prg[%d]", i);
@@ -3045,7 +3062,7 @@ alloc_dma_trm_ctx(struct ti_ohci *ohci, 
 	d->ctrlClear = 0;
 	d->cmdPtr = 0;
 
-	d->prg_cpu = kmalloc(d->num_desc * sizeof(struct at_dma_prg*), 
+	d->prg_cpu = kmalloc(d->num_desc * sizeof(struct at_dma_prg*),
 			     GFP_KERNEL);
 	d->prg_bus = kmalloc(d->num_desc * sizeof(dma_addr_t), GFP_KERNEL);
 
@@ -3194,7 +3211,7 @@ static int __devinit ohci1394_pci_probe(
 	 * noByteSwapData registers to see if they were not cleared to
 	 * zero. Should this work? Obviously it's not defined what these
 	 * registers will read when they aren't supported. Bleh! */
-	if (dev->vendor == PCI_VENDOR_ID_APPLE && 
+	if (dev->vendor == PCI_VENDOR_ID_APPLE &&
 	    dev->device == PCI_DEVICE_ID_APPLE_UNI_N_FW) {
 		ohci->no_swap_incoming = 1;
 		ohci->selfid_swap = 0;
@@ -3217,7 +3234,7 @@ static int __devinit ohci1394_pci_probe(
 
 	/* We hardwire the MMIO length, since some CardBus adaptors
 	 * fail to report the right length.  Anyway, the ohci spec
-	 * clearly says it's 2kb, so this shouldn't be a problem. */ 
+	 * clearly says it's 2kb, so this shouldn't be a problem. */
 	ohci_base = pci_resource_start(dev, 0);
 	if (pci_resource_len(dev, 0) != OHCI1394_REGISTER_SIZE)
 		PRINT(KERN_WARNING, "Unexpected PCI resource length of %lx!",
@@ -3248,7 +3265,7 @@ static int __devinit ohci1394_pci_probe(
 	ohci->init_state = OHCI_INIT_HAVE_CONFIG_ROM_BUFFER;
 
 	/* self-id dma buffer allocation */
-	ohci->selfid_buf_cpu = 
+	ohci->selfid_buf_cpu =
 		pci_alloc_consistent(ohci->dev, OHCI1394_SI_DMA_BUF_SIZE,
                       &ohci->selfid_buf_bus);
 	OHCI_DMA_ALLOC("consistent selfid_buf");
@@ -3259,8 +3276,8 @@ static int __devinit ohci1394_pci_probe(
 
 	if ((unsigned long)ohci->selfid_buf_cpu & 0x1fff)
 		PRINT(KERN_INFO, "SelfID buffer %p is not aligned on "
-		      "8Kb boundary... may cause problems on some CXD3222 chip", 
-		      ohci->selfid_buf_cpu);  
+		      "8Kb boundary... may cause problems on some CXD3222 chip",
+		      ohci->selfid_buf_cpu);
 
 	/* No self-id errors at startup */
 	ohci->self_id_errors = 0;
@@ -3423,7 +3440,7 @@ static void ohci1394_pci_remove(struct p
 		free_dma_trm_ctx(&ohci->it_legacy_context);
 
 	case OHCI_INIT_HAVE_SELFID_BUFFER:
-		pci_free_consistent(ohci->dev, OHCI1394_SI_DMA_BUF_SIZE, 
+		pci_free_consistent(ohci->dev, OHCI1394_SI_DMA_BUF_SIZE,
 				    ohci->selfid_buf_cpu,
 				    ohci->selfid_buf_bus);
 		OHCI_DMA_FREE("consistent selfid_buf");
@@ -3544,7 +3561,7 @@ int ohci1394_stop_context(struct ti_ohci
 
 	/* stop the channel program if it's still running */
 	reg_write(ohci, reg, 0x8000);
-   
+
 	/* Wait until it effectively stops */
 	while (reg_read(ohci, reg) & 0x400) {
 		i++;
--- diff/drivers/ieee1394/ohci1394.h	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/ieee1394/ohci1394.h	2004-04-21 10:45:34.277492528 +0100
@@ -110,7 +110,7 @@ struct dma_rcv_ctx {
 	int ctxtMatch;
 };
 
-/* DMA transmit context */	
+/* DMA transmit context */
 struct dma_trm_ctx {
 	struct ti_ohci *ohci;
 	enum context_type type;
@@ -151,7 +151,7 @@ struct ohci1394_iso_tasklet {
 struct ti_ohci {
         struct pci_dev *dev;
 
-	enum { 
+	enum {
 		OHCI_INIT_ALLOC_HOST,
 		OHCI_INIT_HAVE_MEM_REGION,
 		OHCI_INIT_HAVE_IOMAPPING,
@@ -161,17 +161,17 @@ struct ti_ohci {
 		OHCI_INIT_HAVE_IRQ,
 		OHCI_INIT_DONE,
 	} init_state;
-        
+
         /* remapped memory spaces */
-        void *registers; 
+        void *registers;
 
 	/* dma buffer for self-id packets */
         quadlet_t *selfid_buf_cpu;
         dma_addr_t selfid_buf_bus;
 
 	/* buffer for csr config rom */
-        quadlet_t *csr_config_rom_cpu; 
-        dma_addr_t csr_config_rom_bus; 
+        quadlet_t *csr_config_rom_cpu;
+        dma_addr_t csr_config_rom_bus;
 	int csr_config_rom_length;
 
 	unsigned int max_packet_size;
@@ -198,7 +198,7 @@ struct ti_ohci {
 
 	struct dma_rcv_ctx ir_legacy_context;
 	struct ohci1394_iso_tasklet ir_legacy_tasklet;
-	
+
         /* iso transmit */
 	int nb_iso_xmit_ctx;
 	unsigned long it_ctx_usage; /* use test_and_set_bit() for atomicity */
@@ -260,7 +260,7 @@ static inline u32 reg_read(const struct 
 
 
 /* 2 KiloBytes of register space */
-#define OHCI1394_REGISTER_SIZE                0x800       
+#define OHCI1394_REGISTER_SIZE                0x800
 
 /* Offsets relative to context bases defined below */
 
@@ -440,9 +440,9 @@ static inline u32 reg_read(const struct 
 
 #define OHCI1394_TCODE_PHY               0xE
 
-void ohci1394_init_iso_tasklet(struct ohci1394_iso_tasklet *tasklet, 
+void ohci1394_init_iso_tasklet(struct ohci1394_iso_tasklet *tasklet,
 			       int type,
-			       void (*func)(unsigned long), 
+			       void (*func)(unsigned long),
 			       unsigned long data);
 int ohci1394_register_iso_tasklet(struct ti_ohci *ohci,
 				  struct ohci1394_iso_tasklet *tasklet);
--- diff/drivers/ieee1394/pcilynx.c	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/ieee1394/pcilynx.c	2004-04-21 10:45:34.279492224 +0100
@@ -23,7 +23,7 @@
  * Contributions:
  *
  * Manfred Weihs <weihs@ict.tuwien.ac.at>
- *        reading bus info block (containing GUID) from serial 
+ *        reading bus info block (containing GUID) from serial
  *            eeprom via i2c and storing it in config ROM
  *        Reworked code for initiating bus resets
  *            (long, short, with or without hold-off)
@@ -139,7 +139,7 @@ static struct i2c_algo_bit_data bit_data
 	.udelay			= 5,
 	.mdelay			= 5,
 	.timeout		= 100,
-}; 
+};
 
 static struct i2c_adapter bit_ops = {
 	.id 			= 0xAA, //FIXME: probably we should get an id in i2c-id.h
@@ -195,19 +195,19 @@ static void free_pcl(struct ti_lynx *lyn
         if (lynx->pcl_bmap[off] & 1<<bit) {
                 lynx->pcl_bmap[off] &= ~(1<<bit);
         } else {
-                PRINT(KERN_ERR, lynx->id, 
+                PRINT(KERN_ERR, lynx->id,
                       "attempted to free unallocated PCL %d", pclid);
         }
         spin_unlock(&lynx->lock);
 }
 
-/* functions useful for debugging */        
+/* functions useful for debugging */
 static void pretty_print_pcl(const struct ti_pcl *pcl)
 {
         int i;
 
         printk("PCL next %08x, userdata %08x, status %08x, remtrans %08x, nextbuf %08x\n",
-               pcl->next, pcl->user_data, pcl->pcl_status, 
+               pcl->next, pcl->user_data, pcl->pcl_status,
                pcl->remaining_transfer_count, pcl->next_data_buffer);
 
         printk("PCL");
@@ -218,7 +218,7 @@ static void pretty_print_pcl(const struc
         }
         printk("\n");
 }
-        
+
 static void print_pcl(const struct ti_lynx *lynx, pcl_t pclid)
 {
         struct ti_pcl pcl;
@@ -419,7 +419,7 @@ static void handle_selfid(struct ti_lynx
                 cpu_to_be32s(&q[i]);
                 i--;
         }
-        
+
         if (!lynx->phyic.reg_1394a) {
                 lsid = generate_own_selfid(lynx, host);
         }
@@ -437,7 +437,7 @@ static void handle_selfid(struct ti_lynx
         while (size > 0) {
                 struct selfid *sid = (struct selfid *)q;
 
-                if (!lynx->phyic.reg_1394a && !sid->extended 
+                if (!lynx->phyic.reg_1394a && !sid->extended
                     && (sid->phy_id == (phyid + 1))) {
                         hpsb_selfid_received(host, lsid);
                 }
@@ -484,8 +484,7 @@ static void send_next(struct ti_lynx *ly
         }
 
         packet = driver_packet(d->queue.next);
-        list_del(&packet->driver_list);
-        list_add_tail(&packet->driver_list, &d->pcl_queue);
+	list_move_tail(&packet->driver_list, &d->pcl_queue);
 
         d->header_dma = pci_map_single(lynx->dev, packet->header,
                                        packet->header_size, PCI_DMA_TODEVICE);
@@ -500,11 +499,9 @@ static void send_next(struct ti_lynx *ly
         pcl.next = PCL_NEXT_INVALID;
         pcl.async_error_next = PCL_NEXT_INVALID;
         pcl.pcl_status = 0;
-#ifdef __BIG_ENDIAN
         pcl.buffer[0].control = packet->speed_code << 14 | packet->header_size;
-#else
-        pcl.buffer[0].control = packet->speed_code << 14 | packet->header_size 
-                | PCL_BIGENDIAN;
+#ifdef __BIG_ENDIAN
+        pcl.buffer[0].control |= PCL_BIGENDIAN;
 #endif
         pcl.buffer[0].pointer = d->header_dma;
         pcl.buffer[1].control = PCL_LAST_BUFF | packet->data_size;
@@ -520,7 +517,7 @@ static void send_next(struct ti_lynx *ly
         case hpsb_raw:
                 pcl.buffer[0].control |= PCL_CMD_UNFXMT;
                 break;
-        }                
+        }
 
         put_pcl(lynx, d->pcl, &pcl);
         run_pcl(lynx, d->pcl_start, d->channel);
@@ -727,16 +724,16 @@ static int lynx_devctl(struct hpsb_host 
         case GET_CYCLE_COUNTER:
                 retval = reg_read(lynx, CYCLE_TIMER);
                 break;
-                
+
         case SET_CYCLE_COUNTER:
                 reg_write(lynx, CYCLE_TIMER, arg);
                 break;
 
         case SET_BUS_ID:
-                reg_write(lynx, LINK_ID, 
+                reg_write(lynx, LINK_ID,
                           (arg << 22) | (reg_read(lynx, LINK_ID) & 0x003f0000));
                 break;
-                
+
         case ACT_CYCLE_MASTER:
                 if (arg) {
                         reg_set_bits(lynx, LINK_CONTROL,
@@ -767,7 +764,7 @@ static int lynx_devctl(struct hpsb_host 
                         get_pcl(lynx, lynx->async.pcl, &pcl);
 
                         packet = driver_packet(lynx->async.pcl_queue.next);
-                        list_del(&packet->driver_list);
+			list_del_init(&packet->driver_list);
 
                         pci_unmap_single(lynx->dev, lynx->async.header_dma,
                                          packet->header_size, PCI_DMA_TODEVICE);
@@ -795,7 +792,7 @@ static int lynx_devctl(struct hpsb_host 
 
 		while (!list_empty(&packet_list)) {
 			packet = driver_packet(packet_list.next);
-			list_del(&packet->driver_list);
+			list_del_init(&packet->driver_list);
 			hpsb_packet_sent(host, packet, ACKX_ABORTED);
 		}
 
@@ -803,7 +800,7 @@ static int lynx_devctl(struct hpsb_host 
 
         case ISO_LISTEN_CHANNEL:
                 spin_lock_irqsave(&lynx->iso_rcv.lock, flags);
-                
+
                 if (lynx->iso_rcv.chan_count++ == 0) {
                         reg_write(lynx, DMA_WORD1_CMP_ENABLE(CHANNEL_ISO_RCV),
                                   DMA_WORD1_CMP_ENABLE_MASTER);
@@ -875,7 +872,7 @@ static int mem_open(struct inode *inode,
         int cid = iminor(inode);
         enum { t_rom, t_aux, t_ram } type;
         struct memdata *md;
-        
+
         if (cid < PCILYNX_MINOR_AUX_START) {
                 /* just for completeness */
                 return -ENXIO;
@@ -976,10 +973,10 @@ loff_t mem_llseek(struct file *file, lof
         return newoffs;
 }
 
-/* 
- * do not DMA if count is too small because this will have a serious impact 
+/*
+ * do not DMA if count is too small because this will have a serious impact
  * on performance - the value 2400 was found by experiment and may not work
- * everywhere as good as here - use mem_mindma option for modules to change 
+ * everywhere as good as here - use mem_mindma option for modules to change
  */
 static short mem_mindma = 2400;
 module_param(mem_mindma, short, 0444);
@@ -1123,7 +1120,7 @@ static ssize_t mem_read(struct file *fil
 }
 
 
-static ssize_t mem_write(struct file *file, const char *buffer, size_t count, 
+static ssize_t mem_write(struct file *file, const char *buffer, size_t count,
                          loff_t *offset)
 {
         struct memdata *md = (struct memdata *)file->private_data;
@@ -1292,7 +1289,7 @@ static irqreturn_t lynx_irq_handler(int 
                         get_pcl(lynx, lynx->async.pcl, &pcl);
 
                         packet = driver_packet(lynx->async.pcl_queue.next);
-                        list_del(&packet->driver_list);
+                        list_del_init(&packet->driver_list);
 
                         pci_unmap_single(lynx->dev, lynx->async.header_dma,
                                          packet->header_size, PCI_DMA_TODEVICE);
@@ -1338,7 +1335,7 @@ static irqreturn_t lynx_irq_handler(int 
                         get_pcl(lynx, lynx->iso_send.pcl, &pcl);
 
                         packet = driver_packet(lynx->iso_send.pcl_queue.next);
-                        list_del(&packet->driver_list);
+                        list_del_init(&packet->driver_list);
 
                         pci_unmap_single(lynx->dev, lynx->iso_send.header_dma,
                                          packet->header_size, PCI_DMA_TODEVICE);
@@ -1375,7 +1372,7 @@ static irqreturn_t lynx_irq_handler(int 
                 int stat = reg_read(lynx, DMA_CHAN_STAT(CHANNEL_ASYNC_RCV));
 
                 PRINTD(KERN_DEBUG, lynx->id, "received packet size %d",
-                       stat & 0x1fff); 
+                       stat & 0x1fff);
 
                 if (stat & DMA_CHAN_STAT_SELFID) {
                         lynx->selfid_size = stat & 0x1fff;
@@ -1417,7 +1414,7 @@ static void iso_rcv_bh(struct ti_lynx *l
                               lynx->iso_rcv.stat[idx]);
                 }
 
-                if (lynx->iso_rcv.stat[idx] 
+                if (lynx->iso_rcv.stat[idx]
                     & (DMA_CHAN_STAT_PCIERR | DMA_CHAN_STAT_PKTERR)) {
                         PRINT(KERN_INFO, lynx->id,
                               "iso receive error on %d to 0x%p", idx, data);
@@ -1460,7 +1457,7 @@ static void remove_card(struct pci_dev *
                 reg_write(lynx, PCI_INT_ENABLE, 0);
                 free_irq(lynx->dev->irq, lynx);
 
-		/* Disable IRM Contender */
+		/* Disable IRM Contender and LCtrl */
 		if (lynx->phyic.reg_1394a)
 			set_phy_reg(lynx, 4, ~0xc0 & get_phy_reg(lynx, 4));
 
@@ -1558,7 +1555,7 @@ static int __devinit add_card(struct pci
 
         if (lynx->pcl_mem != NULL) {
                 lynx->state = have_pcl_mem;
-                PRINT(KERN_INFO, lynx->id, 
+                PRINT(KERN_INFO, lynx->id,
                       "allocated PCL memory %d Bytes @ 0x%p", LOCALRAM_SIZE,
                       lynx->pcl_mem);
         } else {
@@ -1668,7 +1665,7 @@ static int __devinit add_card(struct pci
         lynx->async.channel = CHANNEL_ASYNC_SEND;
         lynx->iso_send.queue_lock = SPIN_LOCK_UNLOCKED;
         lynx->iso_send.channel = CHANNEL_ISO_SEND;
-        
+
         PRINT(KERN_INFO, lynx->id, "remapped memory spaces reg 0x%p, rom 0x%p, "
               "ram 0x%p, aux 0x%p", lynx->registers, lynx->local_rom,
               lynx->local_ram, lynx->aux_port);
@@ -1698,17 +1695,17 @@ static int __devinit add_card(struct pci
 
         pcl.next = PCL_NEXT_INVALID;
         pcl.async_error_next = PCL_NEXT_INVALID;
-#ifdef __BIG_ENDIAN
+
         pcl.buffer[0].control = PCL_CMD_RCV | 16;
-        pcl.buffer[1].control = PCL_LAST_BUFF | 4080;
-#else
-        pcl.buffer[0].control = PCL_CMD_RCV | PCL_BIGENDIAN | 16;
-        pcl.buffer[1].control = PCL_LAST_BUFF | 4080;
+#ifdef __BIG_ENDIAN
+	pcl.buffer[0].control |= PCL_BIGENDIAN;
 #endif
+	pcl.buffer[1].control = PCL_LAST_BUFF | 4080;
+
         pcl.buffer[0].pointer = lynx->rcv_page_dma;
         pcl.buffer[1].pointer = lynx->rcv_page_dma + 16;
         put_pcl(lynx, lynx->rcv_pcl, &pcl);
-        
+
         pcl.next = pcl_bus(lynx, lynx->async.pcl);
         pcl.async_error_next = pcl_bus(lynx, lynx->async.pcl);
         put_pcl(lynx, lynx->async.pcl_start, &pcl);
@@ -1729,7 +1726,7 @@ static int __devinit add_card(struct pci
                 int page = i / ISORCV_PER_PAGE;
                 int sec = i % ISORCV_PER_PAGE;
 
-                pcl.buffer[0].pointer = lynx->iso_rcv.page_dma[page] 
+                pcl.buffer[0].pointer = lynx->iso_rcv.page_dma[page]
                         + sec * MAX_ISORCV_SIZE;
                 pcl.buffer[1].pointer = pcl.buffer[0].pointer + 4;
                 put_pcl(lynx, lynx->iso_rcv.pcl[i], &pcl);
@@ -1755,11 +1752,11 @@ static int __devinit add_card(struct pci
 
         reg_write(lynx, LINK_INT_ENABLE, LINK_INT_PHY_TIMEOUT
                   | LINK_INT_PHY_REG_RCVD  | LINK_INT_PHY_BUSRESET
-                  | LINK_INT_ISO_STUCK     | LINK_INT_ASYNC_STUCK 
+                  | LINK_INT_ISO_STUCK     | LINK_INT_ASYNC_STUCK
                   | LINK_INT_SENT_REJECT   | LINK_INT_TX_INVALID_TC
                   | LINK_INT_GRF_OVERFLOW  | LINK_INT_ITF_UNDERFLOW
                   | LINK_INT_ATF_UNDERFLOW);
-        
+
         reg_write(lynx, DMA_WORD0_CMP_VALUE(CHANNEL_ASYNC_RCV), 0);
         reg_write(lynx, DMA_WORD0_CMP_ENABLE(CHANNEL_ASYNC_RCV), 0xa<<4);
         reg_write(lynx, DMA_WORD1_CMP_VALUE(CHANNEL_ASYNC_RCV), 0);
@@ -1786,14 +1783,14 @@ static int __devinit add_card(struct pci
                 /* attempt to enable contender bit -FIXME- would this work
                  * elsewhere? */
                 reg_set_bits(lynx, GPIO_CTRL_A, 0x1);
-                reg_write(lynx, GPIO_DATA_BASE + 0x3c, 0x1); 
+                reg_write(lynx, GPIO_DATA_BASE + 0x3c, 0x1);
         } else {
-                /* set the contender bit in the extended PHY register
+                /* set the contender and LCtrl bit in the extended PHY register
                  * set. (Should check that bis 0,1,2 (=0xE0) is set
                  * in register 2?)
                  */
                 i = get_phy_reg(lynx, 4);
-                if (i != -1) set_phy_reg(lynx, 4, i | 0x40);
+                if (i != -1) set_phy_reg(lynx, 4, i | 0xc0);
         }
 
 
@@ -1820,7 +1817,7 @@ static int __devinit add_card(struct pci
         	{
                         /* do i2c stuff */
                         unsigned char i2c_cmd = 0x10;
-                        struct i2c_msg msg[2] = { { 0x50, 0, 1, &i2c_cmd }, 
+                        struct i2c_msg msg[2] = { { 0x50, 0, 1, &i2c_cmd },
                                                   { 0x50, I2C_M_RD, 20, (unsigned char*) lynx->bus_info_block }
                                                 };
 
--- diff/drivers/ieee1394/pcilynx.h	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/ieee1394/pcilynx.h	2004-04-21 10:45:34.280492072 +0100
@@ -47,7 +47,7 @@ struct ti_lynx {
 
         enum { clear, have_intr, have_aux_buf, have_pcl_mem,
                have_1394_buffers, have_iomappings, is_host } state;
-        
+
         /* remapped memory spaces */
         void *registers;
         void *local_rom;
@@ -66,9 +66,9 @@ struct ti_lynx {
 #endif
 
         /*
-         * use local RAM of LOCALRAM_SIZE bytes for PCLs, which allows for 
+         * use local RAM of LOCALRAM_SIZE bytes for PCLs, which allows for
          * LOCALRAM_SIZE * 8 PCLs (each sized 128 bytes);
-         * the following is an allocation bitmap 
+         * the following is an allocation bitmap
          */
         u8 pcl_bmap[LOCALRAM_SIZE / 1024];
 
@@ -167,7 +167,7 @@ static inline void reg_clear_bits(const 
 #define SERIAL_EEPROM_CONTROL             0x44
 
 #define PCI_INT_STATUS                    0x48
-#define PCI_INT_ENABLE                    0x4c               
+#define PCI_INT_ENABLE                    0x4c
 /* status and enable have identical bit numbers */
 #define PCI_INT_INT_PEND                  (1<<31)
 #define PCI_INT_FORCED_INT                (1<<30)
@@ -199,7 +199,7 @@ static inline void reg_clear_bits(const 
 #define LBUS_ADDR_SEL_RAM                 (0x0<<16)
 #define LBUS_ADDR_SEL_ROM                 (0x1<<16)
 #define LBUS_ADDR_SEL_AUX                 (0x2<<16)
-#define LBUS_ADDR_SEL_ZV                  (0x3<<16)       
+#define LBUS_ADDR_SEL_ZV                  (0x3<<16)
 
 #define GPIO_CTRL_A                       0xb8
 #define GPIO_CTRL_B                       0xbc
@@ -208,14 +208,14 @@ static inline void reg_clear_bits(const 
 #define DMA_BREG(base, chan)              (base + chan * 0x20)
 #define DMA_SREG(base, chan)              (base + chan * 0x10)
 
-#define DMA0_PREV_PCL                     0x100               
+#define DMA0_PREV_PCL                     0x100
 #define DMA1_PREV_PCL                     0x120
 #define DMA2_PREV_PCL                     0x140
 #define DMA3_PREV_PCL                     0x160
 #define DMA4_PREV_PCL                     0x180
 #define DMA_PREV_PCL(chan)                (DMA_BREG(DMA0_PREV_PCL, chan))
 
-#define DMA0_CURRENT_PCL                  0x104            
+#define DMA0_CURRENT_PCL                  0x104
 #define DMA1_CURRENT_PCL                  0x124
 #define DMA2_CURRENT_PCL                  0x144
 #define DMA3_CURRENT_PCL                  0x164
@@ -237,14 +237,14 @@ static inline void reg_clear_bits(const 
 #define DMA_CHAN_STAT_SPECIALACK          (1<<14)
 
 
-#define DMA0_CHAN_CTRL                    0x110              
+#define DMA0_CHAN_CTRL                    0x110
 #define DMA1_CHAN_CTRL                    0x130
 #define DMA2_CHAN_CTRL                    0x150
 #define DMA3_CHAN_CTRL                    0x170
 #define DMA4_CHAN_CTRL                    0x190
 #define DMA_CHAN_CTRL(chan)               (DMA_BREG(DMA0_CHAN_CTRL, chan))
 /* CHAN_CTRL registers share bits */
-#define DMA_CHAN_CTRL_ENABLE              (1<<31)      
+#define DMA_CHAN_CTRL_ENABLE              (1<<31)
 #define DMA_CHAN_CTRL_BUSY                (1<<30)
 #define DMA_CHAN_CTRL_LINK                (1<<29)
 
@@ -353,7 +353,7 @@ static inline void reg_clear_bits(const 
 #define LINK_INT_GRF_OVERFLOW             (1<<5)
 #define LINK_INT_ITF_UNDERFLOW            (1<<4)
 #define LINK_INT_ATF_UNDERFLOW            (1<<3)
-#define LINK_INT_ISOARB_FAILED            (1<<0) 
+#define LINK_INT_ISOARB_FAILED            (1<<0)
 
 /* PHY specifics */
 #define PHY_VENDORID_TI                 0x800028
--- diff/drivers/ieee1394/raw1394-private.h	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/ieee1394/raw1394-private.h	2004-04-21 10:45:34.280492072 +0100
@@ -33,7 +33,7 @@ struct file_info {
         spinlock_t reqlists_lock;
         wait_queue_head_t poll_wait_complete;
 
-        struct list_head addr_list;           
+        struct list_head addr_list;
 
         u8 *fcp_buffer;
 
--- diff/drivers/ieee1394/raw1394.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/ieee1394/raw1394.c	2004-04-21 10:45:34.283491616 +0100
@@ -235,10 +235,10 @@ static void remove_host(struct hpsb_host
         if (hi != NULL) {
                 list_del(&hi->list);
                 host_count--;
-                /* 
-                   FIXME: address ranges should be removed 
+                /*
+                   FIXME: address ranges should be removed
                    and fileinfo states should be initialized
-                   (including setting generation to 
+                   (including setting generation to
                    internal-generation ...)
                 */
         }
@@ -339,7 +339,7 @@ static void iso_receive(struct hpsb_host
                         req->req.misc = 0;
                         req->req.recvb = ptr2int(fi->iso_buffer);
                         req->req.length = min(length, fi->iso_buffer_length);
-                        
+
                         list_add_tail(&req->list, &reqs);
                 }
         }
@@ -399,7 +399,7 @@ static void fcp_request(struct hpsb_host
                         req->req.misc = nodeid | (direction << 16);
                         req->req.recvb = ptr2int(fi->fcp_buffer);
                         req->req.length = length;
-                        
+
                         list_add_tail(&req->list, &reqs);
                 }
         }
@@ -502,7 +502,7 @@ static int state_initialized(struct file
                 if (khl != NULL) {
                         req->req.misc = host_count;
                         req->data = (quadlet_t *)khl;
-                        
+
                         list_for_each_entry(hi, &host_info_list, list) {
                                 khl->nodes = hi->host->node_count;
                                 strcpy(khl->name, hi->host->driver->name);
@@ -536,7 +536,7 @@ static int state_initialized(struct file
 
                         req->req.error = RAW1394_ERROR_NONE;
                         req->req.generation = get_hpsb_generation(fi->host);
-                        req->req.misc = (fi->host->node_id << 16) 
+                        req->req.misc = (fi->host->node_id << 16)
                                 | fi->host->node_count;
                         if (fi->protocol_version > 3) {
                                 req->req.misc |= NODEID_TO_NODE(fi->host->irm_id) << 8;
@@ -635,7 +635,7 @@ static int handle_async_request(struct f
 			req->data = &packet->header[3];
 		else
 			req->data = packet->data;
-  
+
                 break;
 
 	case RAW1394_REQ_ASYNC_WRITE:
@@ -655,7 +655,7 @@ static int handle_async_request(struct f
 					req->req.length))
 				req->req.error = RAW1394_ERROR_MEMFAULT;
 		}
-			
+
 		req->req.length = 0;
 	    break;
 
@@ -670,7 +670,7 @@ static int handle_async_request(struct f
 		if (copy_from_user(packet->data, int2ptr(req->req.sendb),
 		                   req->req.length))
 			req->req.error = RAW1394_ERROR_MEMFAULT;
-			
+
 		req->req.length = 0;
 		break;
 
@@ -807,13 +807,12 @@ static int handle_async_send(struct file
         int expect_response = req->req.misc >> 16;
 
         if ((header_length > req->req.length) ||
-            (header_length  < 12))
-        {
+            (header_length  < 12)) {
                 req->req.error = RAW1394_ERROR_INVALID_ARG;
                 req->req.length = 0;
                 queue_complete_req(req);
                 return sizeof(struct raw1394_request);
-        } 
+        }
 
         packet = hpsb_alloc_packet(req->req.length-header_length);
         req->packet = packet;
@@ -886,7 +885,7 @@ static int arm_read (struct hpsb_host *h
                         entry = fi->addr_list.next;
                         while (entry != &(fi->addr_list)) {
                                 arm_addr = list_entry(entry, struct arm_addr, addr_list);
-                                if (((arm_addr->start) <= (addr)) && 
+                                if (((arm_addr->start) <= (addr)) &&
                                         ((arm_addr->end) >= (addr+length))) {
                                         found = 1;
                                         break;
@@ -914,7 +913,7 @@ static int arm_read (struct hpsb_host *h
         if (rcode == -1) {
                 if (arm_addr->access_rights & ARM_READ) {
                         if (!(arm_addr->client_transactions & ARM_READ)) {
-                                memcpy(buffer,(arm_addr->addr_space_buffer)+(addr-(arm_addr->start)), 
+                                memcpy(buffer,(arm_addr->addr_space_buffer)+(addr-(arm_addr->start)),
                                        length);
                                 DBGMSG("arm_read -> (rcode_complete)");
                                 rcode = RCODE_COMPLETE;
@@ -930,7 +929,7 @@ static int arm_read (struct hpsb_host *h
                 if (!req) {
                         DBGMSG("arm_read -> rcode_conflict_error");
                         spin_unlock(&host_info_lock);
-                        return(RCODE_CONFLICT_ERROR); /* A resource conflict was detected. 
+                        return(RCODE_CONFLICT_ERROR); /* A resource conflict was detected.
                                                         The request may be retried */
                 }
                 if (rcode == RCODE_COMPLETE) {
@@ -946,7 +945,7 @@ static int arm_read (struct hpsb_host *h
                         free_pending_request(req);
                         DBGMSG("arm_read -> rcode_conflict_error");
                         spin_unlock(&host_info_lock);
-                        return(RCODE_CONFLICT_ERROR); /* A resource conflict was detected. 
+                        return(RCODE_CONFLICT_ERROR); /* A resource conflict was detected.
                                                         The request may be retried */
                 }
                 req->free_data=1;
@@ -958,19 +957,19 @@ static int arm_read (struct hpsb_host *h
                 req->req.recvb = arm_addr->recvb;
                 req->req.length = size;
                 arm_req_resp = (struct arm_request_response *) (req->data);
-                arm_req  = (struct arm_request *) ((byte_t *)(req->data) + 
+                arm_req  = (struct arm_request *) ((byte_t *)(req->data) +
                         (sizeof (struct arm_request_response)));
-                arm_resp = (struct arm_response *) ((byte_t *)(arm_req) + 
+                arm_resp = (struct arm_response *) ((byte_t *)(arm_req) +
                         (sizeof(struct arm_request)));
                 arm_req->buffer  = NULL;
                 arm_resp->buffer = NULL;
                 if (rcode == RCODE_COMPLETE) {
-                        arm_resp->buffer = ((byte_t *)(arm_resp) + 
+                        arm_resp->buffer = ((byte_t *)(arm_resp) +
                                 (sizeof(struct arm_response)));
                         memcpy (arm_resp->buffer,
-                                (arm_addr->addr_space_buffer)+(addr-(arm_addr->start)), 
+                                (arm_addr->addr_space_buffer)+(addr-(arm_addr->start)),
                                 length);
-                        arm_resp->buffer = int2ptr((arm_addr->recvb) + 
+                        arm_resp->buffer = int2ptr((arm_addr->recvb) +
                                 sizeof (struct arm_request_response) +
                                 sizeof (struct arm_request) +
                                 sizeof (struct arm_response));
@@ -985,9 +984,9 @@ static int arm_read (struct hpsb_host *h
                 arm_req->destination_nodeid = host->node_id;
                 arm_req->tlabel = (flags >> 10) & 0x3f;
                 arm_req->tcode = (flags >> 4) & 0x0f;
-                arm_req_resp->request  = int2ptr((arm_addr->recvb) + 
+                arm_req_resp->request  = int2ptr((arm_addr->recvb) +
                         sizeof (struct arm_request_response));
-                arm_req_resp->response = int2ptr((arm_addr->recvb) + 
+                arm_req_resp->response = int2ptr((arm_addr->recvb) +
                         sizeof (struct arm_request_response) +
                         sizeof (struct arm_request));
                 queue_complete_req(req);
@@ -1005,7 +1004,7 @@ static int arm_write (struct hpsb_host *
         struct list_head *entry;
         struct arm_addr  *arm_addr = NULL;
         struct arm_request  *arm_req = NULL;
-        struct arm_response *arm_resp = NULL;        
+        struct arm_response *arm_resp = NULL;
         int found=0, size=0, rcode=-1, length_conflict=0;
         struct arm_request_response *arm_req_resp = NULL;
 
@@ -1020,7 +1019,7 @@ static int arm_write (struct hpsb_host *
                         entry = fi->addr_list.next;
                         while (entry != &(fi->addr_list)) {
                                 arm_addr = list_entry(entry, struct arm_addr, addr_list);
-                                if (((arm_addr->start) <= (addr)) && 
+                                if (((arm_addr->start) <= (addr)) &&
                                         ((arm_addr->end) >= (addr+length))) {
                                         found = 1;
                                         break;
@@ -1065,7 +1064,7 @@ static int arm_write (struct hpsb_host *
                 if (!req) {
                         DBGMSG("arm_write -> rcode_conflict_error");
                         spin_unlock(&host_info_lock);
-                        return(RCODE_CONFLICT_ERROR); /* A resource conflict was detected. 
+                        return(RCODE_CONFLICT_ERROR); /* A resource conflict was detected.
                                                         The request my be retried */
                 }
                 size =  sizeof(struct arm_request)+sizeof(struct arm_response) +
@@ -1076,7 +1075,7 @@ static int arm_write (struct hpsb_host *
                         free_pending_request(req);
                         DBGMSG("arm_write -> rcode_conflict_error");
                         spin_unlock(&host_info_lock);
-                        return(RCODE_CONFLICT_ERROR); /* A resource conflict was detected. 
+                        return(RCODE_CONFLICT_ERROR); /* A resource conflict was detected.
                                                         The request may be retried */
                 }
                 req->free_data=1;
@@ -1088,15 +1087,15 @@ static int arm_write (struct hpsb_host *
                 req->req.recvb = arm_addr->recvb;
                 req->req.length = size;
                 arm_req_resp = (struct arm_request_response *) (req->data);
-                arm_req  = (struct arm_request *) ((byte_t *)(req->data) + 
+                arm_req  = (struct arm_request *) ((byte_t *)(req->data) +
                         (sizeof (struct arm_request_response)));
-                arm_resp = (struct arm_response *) ((byte_t *)(arm_req) + 
+                arm_resp = (struct arm_response *) ((byte_t *)(arm_req) +
                         (sizeof(struct arm_request)));
-                arm_req->buffer = ((byte_t *)(arm_resp) + 
+                arm_req->buffer = ((byte_t *)(arm_resp) +
                         (sizeof(struct arm_response)));
                 arm_resp->buffer = NULL;
                 memcpy (arm_req->buffer, data, length);
-                arm_req->buffer = int2ptr((arm_addr->recvb) + 
+                arm_req->buffer = int2ptr((arm_addr->recvb) +
                         sizeof (struct arm_request_response) +
                         sizeof (struct arm_request) +
                         sizeof (struct arm_response));
@@ -1110,9 +1109,9 @@ static int arm_write (struct hpsb_host *
                 arm_req->tcode = (flags >> 4) & 0x0f;
                 arm_resp->buffer_length = 0;
                 arm_resp->response_code = rcode;
-                arm_req_resp->request  = int2ptr((arm_addr->recvb) + 
+                arm_req_resp->request  = int2ptr((arm_addr->recvb) +
                         sizeof (struct arm_request_response));
-                arm_req_resp->response = int2ptr((arm_addr->recvb) + 
+                arm_req_resp->response = int2ptr((arm_addr->recvb) +
                         sizeof (struct arm_request_response) +
                         sizeof (struct arm_request));
                 queue_complete_req(req);
@@ -1130,7 +1129,7 @@ static int arm_lock (struct hpsb_host *h
         struct list_head *entry;
         struct arm_addr  *arm_addr = NULL;
         struct arm_request  *arm_req = NULL;
-        struct arm_response *arm_resp = NULL;        
+        struct arm_response *arm_resp = NULL;
         int found=0, size=0, rcode=-1;
         quadlet_t old, new;
         struct arm_request_response *arm_req_resp = NULL;
@@ -1138,12 +1137,12 @@ static int arm_lock (struct hpsb_host *h
         if (((ext_tcode & 0xFF) == EXTCODE_FETCH_ADD) ||
                 ((ext_tcode & 0xFF) == EXTCODE_LITTLE_ADD)) {
                 DBGMSG("arm_lock  called by node: %X "
-                      "addr: %4.4x %8.8x extcode: %2.2X data: %8.8X", 
+                      "addr: %4.4x %8.8x extcode: %2.2X data: %8.8X",
                       nodeid, (u16) ((addr >>32) & 0xFFFF), (u32) (addr & 0xFFFFFFFF),
                       ext_tcode & 0xFF , be32_to_cpu(data));
         } else {
                 DBGMSG("arm_lock  called by node: %X "
-                      "addr: %4.4x %8.8x extcode: %2.2X data: %8.8X arg: %8.8X", 
+                      "addr: %4.4x %8.8x extcode: %2.2X data: %8.8X arg: %8.8X",
                       nodeid, (u16) ((addr >>32) & 0xFFFF), (u32) (addr & 0xFFFFFFFF),
                       ext_tcode & 0xFF , be32_to_cpu(data), be32_to_cpu(arg));
         }
@@ -1154,7 +1153,7 @@ static int arm_lock (struct hpsb_host *h
                         entry = fi->addr_list.next;
                         while (entry != &(fi->addr_list)) {
                                 arm_addr = list_entry(entry, struct arm_addr, addr_list);
-                                if (((arm_addr->start) <= (addr)) && 
+                                if (((arm_addr->start) <= (addr)) &&
                                         ((arm_addr->end) >= (addr+sizeof(*store)))) {
                                         found = 1;
                                         break;
@@ -1199,7 +1198,7 @@ static int arm_lock (struct hpsb_host *h
                                                 break;
                                         case (EXTCODE_BOUNDED_ADD):
                                                 if (old != arg) {
-                                                        new = cpu_to_be32(be32_to_cpu(data) + 
+                                                        new = cpu_to_be32(be32_to_cpu(data) +
                                                                 be32_to_cpu(old));
                                                 } else {
                                                         new = old;
@@ -1207,7 +1206,7 @@ static int arm_lock (struct hpsb_host *h
                                                 break;
                                         case (EXTCODE_WRAP_ADD):
                                                 if (old != arg) {
-                                                        new = cpu_to_be32(be32_to_cpu(data) + 
+                                                        new = cpu_to_be32(be32_to_cpu(data) +
                                                                 be32_to_cpu(old));
                                                 } else {
                                                         new = data;
@@ -1224,7 +1223,7 @@ static int arm_lock (struct hpsb_host *h
                                         rcode = RCODE_COMPLETE;
                                         memcpy (store, &old, sizeof(*store));
                                         memcpy ((arm_addr->addr_space_buffer)+
-                                                (addr-(arm_addr->start)), 
+                                                (addr-(arm_addr->start)),
                                                 &new, sizeof(*store));
                                 }
                         }
@@ -1239,31 +1238,31 @@ static int arm_lock (struct hpsb_host *h
                 if (!req) {
                         DBGMSG("arm_lock -> rcode_conflict_error");
                         spin_unlock(&host_info_lock);
-                        return(RCODE_CONFLICT_ERROR); /* A resource conflict was detected. 
+                        return(RCODE_CONFLICT_ERROR); /* A resource conflict was detected.
                                                         The request may be retried */
                 }
                 size =  sizeof(struct arm_request)+sizeof(struct arm_response) +
-                        3 * sizeof(*store) + 
+                        3 * sizeof(*store) +
                         sizeof (struct arm_request_response);  /* maximum */
                 req->data = kmalloc(size, SLAB_ATOMIC);
                 if (!(req->data)) {
                         free_pending_request(req);
                         DBGMSG("arm_lock -> rcode_conflict_error");
                         spin_unlock(&host_info_lock);
-                        return(RCODE_CONFLICT_ERROR); /* A resource conflict was detected. 
+                        return(RCODE_CONFLICT_ERROR); /* A resource conflict was detected.
                                                         The request may be retried */
                 }
                 req->free_data=1;
                 arm_req_resp = (struct arm_request_response *) (req->data);
-                arm_req  = (struct arm_request *) ((byte_t *)(req->data) + 
+                arm_req  = (struct arm_request *) ((byte_t *)(req->data) +
                         (sizeof (struct arm_request_response)));
-                arm_resp = (struct arm_response *) ((byte_t *)(arm_req) + 
+                arm_resp = (struct arm_response *) ((byte_t *)(arm_req) +
                         (sizeof(struct arm_request)));
-                arm_req->buffer = ((byte_t *)(arm_resp) + 
+                arm_req->buffer = ((byte_t *)(arm_resp) +
                         (sizeof(struct arm_response)));
-                arm_resp->buffer = ((byte_t *)(arm_req->buffer) + 
+                arm_resp->buffer = ((byte_t *)(arm_req->buffer) +
                         (2* sizeof(*store)));
-                if ((ext_tcode == EXTCODE_FETCH_ADD) || 
+                if ((ext_tcode == EXTCODE_FETCH_ADD) ||
                         (ext_tcode == EXTCODE_LITTLE_ADD)) {
                         arm_req->buffer_length = sizeof(*store);
                         memcpy (arm_req->buffer, &data, sizeof(*store));
@@ -1271,7 +1270,7 @@ static int arm_lock (struct hpsb_host *h
                 } else {
                         arm_req->buffer_length = 2 * sizeof(*store);
                         memcpy (arm_req->buffer, &arg,  sizeof(*store));
-                        memcpy (((arm_req->buffer) + sizeof(*store)), 
+                        memcpy (((arm_req->buffer) + sizeof(*store)),
                                 &data, sizeof(*store));
                 }
                 if (rcode == RCODE_COMPLETE) {
@@ -1284,7 +1283,7 @@ static int arm_lock (struct hpsb_host *h
                 req->file_info = fi;
                 req->req.type = RAW1394_REQ_ARM;
                 req->req.generation = get_hpsb_generation(host);
-                req->req.misc = ( (((sizeof(*store)) << 16) & (0xFFFF0000)) | 
+                req->req.misc = ( (((sizeof(*store)) << 16) & (0xFFFF0000)) |
                         (ARM_LOCK & 0xFF));
                 req->req.tag  = arm_addr->arm_tag;
                 req->req.recvb = arm_addr->recvb;
@@ -1297,16 +1296,16 @@ static int arm_lock (struct hpsb_host *h
                 arm_req->tlabel = (flags >> 10) & 0x3f;
                 arm_req->tcode = (flags >> 4) & 0x0f;
                 arm_resp->response_code = rcode;
-                arm_req_resp->request  = int2ptr((arm_addr->recvb) + 
+                arm_req_resp->request  = int2ptr((arm_addr->recvb) +
                         sizeof (struct arm_request_response));
-                arm_req_resp->response = int2ptr((arm_addr->recvb) + 
+                arm_req_resp->response = int2ptr((arm_addr->recvb) +
                         sizeof (struct arm_request_response) +
                         sizeof (struct arm_request));
-                arm_req->buffer = int2ptr((arm_addr->recvb) + 
+                arm_req->buffer = int2ptr((arm_addr->recvb) +
                         sizeof (struct arm_request_response) +
                         sizeof (struct arm_request) +
                         sizeof (struct arm_response));
-                arm_resp->buffer = int2ptr((arm_addr->recvb) + 
+                arm_resp->buffer = int2ptr((arm_addr->recvb) +
                         sizeof (struct arm_request_response) +
                         sizeof (struct arm_request) +
                         sizeof (struct arm_response) +
@@ -1336,20 +1335,20 @@ static int arm_lock64 (struct hpsb_host 
                 DBGMSG("arm_lock64 called by node: %X "
                       "addr: %4.4x %8.8x extcode: %2.2X data: %8.8X %8.8X ",
                       nodeid, (u16) ((addr >>32) & 0xFFFF),
-                      (u32) (addr & 0xFFFFFFFF), 
-                      ext_tcode & 0xFF , 
-                      (u32) ((be64_to_cpu(data) >> 32) & 0xFFFFFFFF), 
+                      (u32) (addr & 0xFFFFFFFF),
+                      ext_tcode & 0xFF ,
+                      (u32) ((be64_to_cpu(data) >> 32) & 0xFFFFFFFF),
                       (u32) (be64_to_cpu(data) & 0xFFFFFFFF));
         } else {
                 DBGMSG("arm_lock64 called by node: %X "
                       "addr: %4.4x %8.8x extcode: %2.2X data: %8.8X %8.8X arg: "
                       "%8.8X %8.8X ",
                       nodeid, (u16) ((addr >>32) & 0xFFFF),
-                      (u32) (addr & 0xFFFFFFFF), 
-                      ext_tcode & 0xFF , 
-                      (u32) ((be64_to_cpu(data) >> 32) & 0xFFFFFFFF), 
+                      (u32) (addr & 0xFFFFFFFF),
+                      ext_tcode & 0xFF ,
+                      (u32) ((be64_to_cpu(data) >> 32) & 0xFFFFFFFF),
                       (u32) (be64_to_cpu(data) & 0xFFFFFFFF),
-                      (u32) ((be64_to_cpu(arg)  >> 32) & 0xFFFFFFFF), 
+                      (u32) ((be64_to_cpu(arg)  >> 32) & 0xFFFFFFFF),
                       (u32) (be64_to_cpu(arg)  & 0xFFFFFFFF));
         }
         spin_lock(&host_info_lock);
@@ -1359,7 +1358,7 @@ static int arm_lock64 (struct hpsb_host 
                         entry = fi->addr_list.next;
                         while (entry != &(fi->addr_list)) {
                                 arm_addr = list_entry(entry, struct arm_addr, addr_list);
-                                if (((arm_addr->start) <= (addr)) && 
+                                if (((arm_addr->start) <= (addr)) &&
                                         ((arm_addr->end) >= (addr+sizeof(*store)))) {
                                         found = 1;
                                         break;
@@ -1404,7 +1403,7 @@ static int arm_lock64 (struct hpsb_host 
                                                 break;
                                         case (EXTCODE_BOUNDED_ADD):
                                                 if (old != arg) {
-                                                        new = cpu_to_be64(be64_to_cpu(data) + 
+                                                        new = cpu_to_be64(be64_to_cpu(data) +
                                                                 be64_to_cpu(old));
                                                 } else {
                                                         new = old;
@@ -1412,7 +1411,7 @@ static int arm_lock64 (struct hpsb_host 
                                                 break;
                                         case (EXTCODE_WRAP_ADD):
                                                 if (old != arg) {
-                                                        new = cpu_to_be64(be64_to_cpu(data) + 
+                                                        new = cpu_to_be64(be64_to_cpu(data) +
                                                                 be64_to_cpu(old));
                                                 } else {
                                                         new = data;
@@ -1429,9 +1428,9 @@ static int arm_lock64 (struct hpsb_host 
                                         rcode = RCODE_COMPLETE;
                                         memcpy (store, &old, sizeof(*store));
                                         memcpy ((arm_addr->addr_space_buffer)+
-                                                (addr-(arm_addr->start)), 
+                                                (addr-(arm_addr->start)),
                                                 &new, sizeof(*store));
-                                } 
+                                }
                         }
                 } else {
                         rcode = RCODE_TYPE_ERROR; /* function not allowed */
@@ -1444,7 +1443,7 @@ static int arm_lock64 (struct hpsb_host 
                 if (!req) {
                         spin_unlock(&host_info_lock);
                         DBGMSG("arm_lock64 -> rcode_conflict_error");
-                        return(RCODE_CONFLICT_ERROR); /* A resource conflict was detected. 
+                        return(RCODE_CONFLICT_ERROR); /* A resource conflict was detected.
                                                         The request may be retried */
                 }
                 size =  sizeof(struct arm_request)+sizeof(struct arm_response) +
@@ -1455,20 +1454,20 @@ static int arm_lock64 (struct hpsb_host 
                         free_pending_request(req);
                         spin_unlock(&host_info_lock);
                         DBGMSG("arm_lock64 -> rcode_conflict_error");
-                        return(RCODE_CONFLICT_ERROR); /* A resource conflict was detected. 
+                        return(RCODE_CONFLICT_ERROR); /* A resource conflict was detected.
                                                         The request may be retried */
                 }
                 req->free_data=1;
                 arm_req_resp = (struct arm_request_response *) (req->data);
-                arm_req  = (struct arm_request *) ((byte_t *)(req->data) + 
+                arm_req  = (struct arm_request *) ((byte_t *)(req->data) +
                         (sizeof (struct arm_request_response)));
-                arm_resp = (struct arm_response *) ((byte_t *)(arm_req) + 
+                arm_resp = (struct arm_response *) ((byte_t *)(arm_req) +
                         (sizeof(struct arm_request)));
-                arm_req->buffer = ((byte_t *)(arm_resp) + 
+                arm_req->buffer = ((byte_t *)(arm_resp) +
                         (sizeof(struct arm_response)));
-                arm_resp->buffer = ((byte_t *)(arm_req->buffer) + 
+                arm_resp->buffer = ((byte_t *)(arm_req->buffer) +
                         (2* sizeof(*store)));
-                if ((ext_tcode == EXTCODE_FETCH_ADD) || 
+                if ((ext_tcode == EXTCODE_FETCH_ADD) ||
                         (ext_tcode == EXTCODE_LITTLE_ADD)) {
                         arm_req->buffer_length = sizeof(*store);
                         memcpy (arm_req->buffer, &data, sizeof(*store));
@@ -1476,7 +1475,7 @@ static int arm_lock64 (struct hpsb_host 
                 } else {
                         arm_req->buffer_length = 2 * sizeof(*store);
                         memcpy (arm_req->buffer, &arg,  sizeof(*store));
-                        memcpy (((arm_req->buffer) + sizeof(*store)), 
+                        memcpy (((arm_req->buffer) + sizeof(*store)),
                                 &data, sizeof(*store));
                 }
                 if (rcode == RCODE_COMPLETE) {
@@ -1489,7 +1488,7 @@ static int arm_lock64 (struct hpsb_host 
                 req->file_info = fi;
                 req->req.type = RAW1394_REQ_ARM;
                 req->req.generation = get_hpsb_generation(host);
-                req->req.misc = ( (((sizeof(*store)) << 16) & (0xFFFF0000)) | 
+                req->req.misc = ( (((sizeof(*store)) << 16) & (0xFFFF0000)) |
                         (ARM_LOCK & 0xFF));
                 req->req.tag  = arm_addr->arm_tag;
                 req->req.recvb = arm_addr->recvb;
@@ -1502,16 +1501,16 @@ static int arm_lock64 (struct hpsb_host 
                 arm_req->tlabel = (flags >> 10) & 0x3f;
                 arm_req->tcode = (flags >> 4) & 0x0f;
                 arm_resp->response_code = rcode;
-                arm_req_resp->request  = int2ptr((arm_addr->recvb) + 
+                arm_req_resp->request  = int2ptr((arm_addr->recvb) +
                         sizeof (struct arm_request_response));
-                arm_req_resp->response = int2ptr((arm_addr->recvb) + 
+                arm_req_resp->response = int2ptr((arm_addr->recvb) +
                         sizeof (struct arm_request_response) +
                         sizeof (struct arm_request));
-                arm_req->buffer = int2ptr((arm_addr->recvb) + 
+                arm_req->buffer = int2ptr((arm_addr->recvb) +
                         sizeof (struct arm_request_response) +
                         sizeof (struct arm_request) +
                         sizeof (struct arm_response));
-                arm_resp->buffer = int2ptr((arm_addr->recvb) + 
+                arm_resp->buffer = int2ptr((arm_addr->recvb) +
                         sizeof (struct arm_request_response) +
                         sizeof (struct arm_request) +
                         sizeof (struct arm_response) +
@@ -1548,11 +1547,11 @@ static int arm_register(struct file_info
                 return (-EINVAL);
         }
         /* addr-list-entry for fileinfo */
-        addr = (struct arm_addr *)kmalloc(sizeof(struct arm_addr), SLAB_KERNEL); 
+        addr = (struct arm_addr *)kmalloc(sizeof(struct arm_addr), SLAB_KERNEL);
         if (!addr) {
                 req->req.length = 0;
                 return (-ENOMEM);
-        } 
+        }
         /* allocation of addr_space_buffer */
         addr->addr_space_buffer = (u8 *)vmalloc(req->req.length);
         if (!(addr->addr_space_buffer)) {
@@ -1593,7 +1592,7 @@ static int arm_register(struct file_info
                 entry = fi_hlp->addr_list.next;
                 while (entry != &(fi_hlp->addr_list)) {
                         arm_addr = list_entry(entry, struct arm_addr, addr_list);
-                        if ( (arm_addr->start == addr->start) && 
+                        if ( (arm_addr->start == addr->start) &&
                                 (arm_addr->end == addr->end)) {
                                 DBGMSG("same host ownes same "
                                         "addressrange -> EALREADY");
@@ -1620,7 +1619,7 @@ static int arm_register(struct file_info
                                 entry = fi_hlp->addr_list.next;
                                 while (entry != &(fi_hlp->addr_list)) {
                                         arm_addr = list_entry(entry, struct arm_addr, addr_list);
-                                        if ( (arm_addr->start == addr->start) && 
+                                        if ( (arm_addr->start == addr->start) &&
                                                 (arm_addr->end == addr->end)) {
                                                 DBGMSG("another host ownes same "
                                                 "addressrange");
@@ -1662,7 +1661,7 @@ static int arm_register(struct file_info
                 vfree(addr->addr_space_buffer);
                 kfree(addr);
                 spin_unlock_irqrestore(&host_info_lock, flags);
-                return (-EALREADY); 
+                return (-EALREADY);
         }
         spin_unlock_irqrestore(&host_info_lock, flags);
         free_pending_request(req); /* immediate success or fail */
@@ -1703,16 +1702,16 @@ static int arm_unregister(struct file_in
         }
         DBGMSG("arm_Unregister addr found");
         another_host = 0;
-        /* another host with valid address-entry containing 
+        /* another host with valid address-entry containing
            same addressrange */
         list_for_each_entry(hi, &host_info_list, list) {
                 if (hi->host != fi->host) {
                         list_for_each_entry(fi_hlp, &hi->file_info_list, list) {
                                 entry = fi_hlp->addr_list.next;
                                 while (entry != &(fi_hlp->addr_list)) {
-                                        arm_addr = list_entry(entry, 
+                                        arm_addr = list_entry(entry,
                                                 struct arm_addr, addr_list);
-                                        if (arm_addr->start == 
+                                        if (arm_addr->start ==
                                                 addr->start) {
                                                 DBGMSG("another host ownes "
                                                 "same addressrange");
@@ -1735,7 +1734,7 @@ static int arm_unregister(struct file_in
                 free_pending_request(req); /* immediate success or fail */
                 spin_unlock_irqrestore(&host_info_lock, flags);
                 return sizeof(struct raw1394_request);
-        } 
+        }
         retval = hpsb_unregister_addrspace(&raw1394_highlevel, fi->host, addr->start);
         if (!retval) {
                 printk(KERN_ERR "raw1394: arm_Unregister failed -> EINVAL\n");
@@ -1863,7 +1862,7 @@ static int reset_notification(struct fil
                 fi->notification=(u8)req->req.misc;
                 free_pending_request(req); /* we have to free the request, because we queue no response, and therefore nobody will free it */
                 return sizeof(struct raw1394_request);
-        } 
+        }
         /* error EINVAL (22) invalid argument */
         return (-EINVAL);
 }
@@ -1905,7 +1904,7 @@ static int get_config_rom(struct file_in
 
 	status = csr1212_read(fi->host->csr.rom, CSR1212_CONFIG_ROM_SPACE_OFFSET,
 			      data, req->req.length);
-        if (copy_to_user(int2ptr(req->req.recvb), data, 
+        if (copy_to_user(int2ptr(req->req.recvb), data,
                 req->req.length))
                 ret = -EFAULT;
 	if (copy_to_user(int2ptr(req->req.tag), &fi->host->csr.rom->cache_head->len,
@@ -1914,7 +1913,7 @@ static int get_config_rom(struct file_in
 	if (copy_to_user(int2ptr(req->req.address), &fi->host->csr.generation,
 			 sizeof(fi->host->csr.generation)))
                 ret = -EFAULT;
-        if (copy_to_user(int2ptr(req->req.sendb), &status, 
+        if (copy_to_user(int2ptr(req->req.sendb), &status,
                 sizeof(status)))
                 ret = -EFAULT;
         kfree(data);
@@ -1929,14 +1928,14 @@ static int update_config_rom(struct file
         int ret=sizeof(struct raw1394_request);
         quadlet_t *data = kmalloc(req->req.length, SLAB_KERNEL);
         if (!data) return -ENOMEM;
-        if (copy_from_user(data,int2ptr(req->req.sendb), 
+        if (copy_from_user(data,int2ptr(req->req.sendb),
                 req->req.length)) {
                 ret= -EFAULT;
         } else {
-                int status = hpsb_update_config_rom(fi->host, 
-                        data, req->req.length, 
+                int status = hpsb_update_config_rom(fi->host,
+                        data, req->req.length,
                         (unsigned char) req->req.misc);
-                if (copy_to_user(int2ptr(req->req.recvb), 
+                if (copy_to_user(int2ptr(req->req.recvb),
                         &status, sizeof(status)))
                         ret = -ENOMEM;
         }
@@ -2033,7 +2032,7 @@ static int modify_config_rom(struct file
 		if (ret == CSR1212_SUCCESS) {
 			ret = hpsb_update_config_rom_image(fi->host);
 
-			if (ret >= 0 && copy_to_user(int2ptr(req->req.recvb), 
+			if (ret >= 0 && copy_to_user(int2ptr(req->req.recvb),
 						    &dr, sizeof(dr))) {
 				ret = -ENOMEM;
 			}
@@ -2044,7 +2043,7 @@ static int modify_config_rom(struct file
 
 	if (ret >= 0) {
 		/* we have to free the request, because we queue no response,
-		 * and therefore nobody will free it */		
+		 * and therefore nobody will free it */
 		free_pending_request(req);
 		return sizeof(struct raw1394_request);
 	} else {
@@ -2362,7 +2361,7 @@ static int raw1394_iso_recv_packets(stru
 				  &fi->iso_handle->infos[packet],
 				  sizeof(struct raw1394_iso_packet_info)))
 			return -EFAULT;
-		
+
 		packet = (packet + 1) % fi->iso_handle->buf_packets;
 	}
 
@@ -2534,7 +2533,7 @@ static int raw1394_open(struct inode *in
         fi = kmalloc(sizeof(struct file_info), SLAB_KERNEL);
         if (fi == NULL)
                 return -ENOMEM;
-        
+
         memset(fi, 0, sizeof(struct file_info));
         fi->notification = (u8) RAW1394_NOTIFY_ON; /* busreset notification */
 
@@ -2588,16 +2587,16 @@ static int raw1394_release(struct inode 
                 another_host = 0;
                 lh = fi->addr_list.next;
                 addr = list_entry(lh, struct arm_addr, addr_list);
-                /* another host with valid address-entry containing 
+                /* another host with valid address-entry containing
                    same addressrange? */
                 list_for_each_entry(hi, &host_info_list, list) {
                         if (hi->host != fi->host) {
                                 list_for_each_entry(fi_hlp, &hi->file_info_list, list) {
                                         entry = fi_hlp->addr_list.next;
                                         while (entry != &(fi_hlp->addr_list)) {
-                                                arm_addr = list_entry(entry, 
+                                                arm_addr = list_entry(entry,
                                                         struct arm_addr, addr_list);
-                                                if (arm_addr->start == 
+                                                if (arm_addr->start ==
                                                         addr->start) {
                                                         DBGMSG("raw1394_release: "
                                                         "another host ownes "
@@ -2726,13 +2725,13 @@ static struct hpsb_highlevel raw1394_hig
 static struct cdev raw1394_cdev;
 static struct file_operations raw1394_fops = {
 	.owner =	THIS_MODULE,
-        .read =		raw1394_read, 
+        .read =		raw1394_read,
         .write =	raw1394_write,
 	.mmap =         raw1394_mmap,
 	.ioctl =        raw1394_ioctl,
-        .poll =		raw1394_poll, 
-        .open =		raw1394_open, 
-        .release =	raw1394_release, 
+        .poll =		raw1394_poll,
+        .open =		raw1394_open,
+        .release =	raw1394_release,
 };
 
 static int __init init_raw1394(void)
@@ -2746,9 +2745,9 @@ static int __init init_raw1394(void)
 
 	cdev_init(&raw1394_cdev, &raw1394_fops);
 	raw1394_cdev.owner = THIS_MODULE;
+	kobject_set_name(&raw1394_cdev.kobj, RAW1394_DEVICE_NAME);
 	ret = cdev_add(&raw1394_cdev, IEEE1394_RAW1394_DEV, 1);
 	if (ret) {
-		/* jmc: leaves reference to (static) raw1394_cdev */
                 HPSB_ERR("raw1394 failed to register minor device block");
                 devfs_remove(RAW1394_DEVICE_NAME);
                 hpsb_unregister_highlevel(&raw1394_highlevel);
--- diff/drivers/ieee1394/sbp2.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/ieee1394/sbp2.c	2004-04-21 10:45:34.286491160 +0100
@@ -78,7 +78,7 @@
 #include "sbp2.h"
 
 static char version[] __devinitdata =
-	"$Rev: 1170 $ Ben Collins <bcollins@debian.org>";
+	"$Rev: 1205 $ Ben Collins <bcollins@debian.org>";
 
 /*
  * Module load parameter definitions
@@ -137,7 +137,7 @@ MODULE_PARM_DESC(exclusive_login, "Exclu
  * if your sbp2 device is not properly handling the SCSI inquiry command.
  * This hack makes the inquiry look more like a typical MS Windows
  * inquiry.
- * 
+ *
  * If force_inquiry_hack=1 is required for your device to work,
  * please submit the logged sbp2_firmware_revision value of this device to
  * the linux1394-devel mailing list.
@@ -206,7 +206,7 @@ static u32 global_outstanding_dmas = 0;
 #define SBP2_INFO(fmt, args...)		HPSB_INFO("sbp2: "fmt, ## args)
 #define SBP2_NOTICE(fmt, args...)	HPSB_NOTICE("sbp2: "fmt, ## args)
 #define SBP2_WARN(fmt, args...)		HPSB_WARN("sbp2: "fmt, ## args)
-#else 
+#else
 #define SBP2_DEBUG(fmt, args...)
 #define SBP2_INFO(fmt, args...)		HPSB_INFO("sbp2: "fmt, ## args)
 #define SBP2_NOTICE(fmt, args...)       HPSB_NOTICE("sbp2: "fmt, ## args)
@@ -226,7 +226,7 @@ static void sbp2scsi_complete_all_comman
 static void sbp2scsi_complete_command(struct scsi_id_instance_data *scsi_id,
 				      u32 scsi_status, Scsi_Cmnd *SCpnt,
 				      void (*done)(Scsi_Cmnd *));
-	
+
 static Scsi_Host_Template scsi_driver_template;
 
 const u8 sbp2_speedto_max_payload[] = { 0x7, 0x8, 0x9, 0xA, 0xB, 0xC };
@@ -409,7 +409,7 @@ static int sbp2util_create_command_orb_p
 	struct sbp2_command_info *command;
 
 	orbs = serialize_io ? 2 : SBP2_MAX_CMDS;
-        
+
 	spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags);
 	for (i = 0; i < orbs; i++) {
 		command = (struct sbp2_command_info *)
@@ -445,7 +445,7 @@ static void sbp2util_remove_command_orb_
 	struct list_head *lh, *next;
 	struct sbp2_command_info *command;
 	unsigned long flags;
-        
+
 	spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags);
 	if (!list_empty(&scsi_id->sbp2_command_orb_completed)) {
 		list_for_each_safe(lh, next, &scsi_id->sbp2_command_orb_completed) {
@@ -468,7 +468,7 @@ static void sbp2util_remove_command_orb_
 	return;
 }
 
-/* 
+/*
  * This function finds the sbp2_command for a given outstanding command
  * orb.Only looks at the inuse list.
  */
@@ -494,7 +494,7 @@ static struct sbp2_command_info *sbp2uti
 	return(NULL);
 }
 
-/* 
+/*
  * This function finds the sbp2_command for a given outstanding SCpnt.
  * Only looks at the inuse list.
  */
@@ -520,8 +520,8 @@ static struct sbp2_command_info *sbp2uti
  * This function allocates a command orb used to send a scsi command.
  */
 static struct sbp2_command_info *sbp2util_allocate_command_orb(
-		struct scsi_id_instance_data *scsi_id, 
-		Scsi_Cmnd *Current_SCpnt, 
+		struct scsi_id_instance_data *scsi_id,
+		Scsi_Cmnd *Current_SCpnt,
 		void (*Current_done)(Scsi_Cmnd *))
 {
 	struct list_head *lh;
@@ -647,8 +647,8 @@ static int sbp2_update(struct unit_direc
 	SBP2_DEBUG("sbp2_update");
 
 	if (sbp2_reconnect_device(scsi_id)) {
-		
-		/* 
+
+		/*
 		 * Ok, reconnect has failed. Perhaps we didn't
 		 * reconnect fast enough. Try doing a regular login, but
 		 * first do a logout just in case of any weirdness.
@@ -658,7 +658,7 @@ static int sbp2_update(struct unit_direc
 		if (sbp2_login_device(scsi_id)) {
 			/* Login failed too, just fail, and the backend
 			 * will call our sbp2_remove for us */
-			SBP2_INFO("sbp2_reconnect_device failed!");
+			SBP2_ERR("Failed to reconnect to sbp2 device!");
 			return -EBUSY;
 		}
 	}
@@ -851,7 +851,7 @@ alloc_fail:
 					    scsi_id->query_logins_orb_dma);
 			SBP2_DMA_FREE("query logins ORB DMA");
 		}
-	
+
 		if (scsi_id->logout_orb) {
 			pci_free_consistent(hi->host->pdev,
 					sizeof(struct sbp2_logout_orb),
@@ -905,7 +905,6 @@ alloc_fail:
 	 * allows someone else to login instead. One second makes sense. */
 	set_current_state(TASK_INTERRUPTIBLE);
 	schedule_timeout(HZ);
-						
 
 	/*
 	 * Login to the sbp-2 device
@@ -920,12 +919,12 @@ alloc_fail:
 	 * Set max retries to something large on the device
 	 */
 	sbp2_set_busy_timeout(scsi_id);
-	
+
 	/*
 	 * Do a SBP-2 fetch agent reset
 	 */
 	sbp2_agent_reset(scsi_id, 1);
-	
+
 	/*
 	 * Get the max speed and packet size that we can use
 	 */
@@ -1157,14 +1156,14 @@ static int sbp2_query_logins(struct scsi
 
 	max_logins = RESPONSE_GET_MAX_LOGINS(scsi_id->query_logins_response->length_max_logins);
 	SBP2_DEBUG("Maximum concurrent logins supported: %d", max_logins);
-                                                                                
+
 	active_logins = RESPONSE_GET_ACTIVE_LOGINS(scsi_id->query_logins_response->length_max_logins);
 	SBP2_DEBUG("Number of active logins: %d", active_logins);
-                                                                                
+
 	if (active_logins >= max_logins) {
 		return(-EIO);
 	}
-                                                                                
+
 	return 0;
 }
 
@@ -1172,7 +1171,7 @@ static int sbp2_query_logins(struct scsi
  * This function is called in order to login to a particular SBP-2 device,
  * after a bus reset.
  */
-static int sbp2_login_device(struct scsi_id_instance_data *scsi_id) 
+static int sbp2_login_device(struct scsi_id_instance_data *scsi_id)
 {
 	struct sbp2scsi_host_info *hi = scsi_id->hi;
 	quadlet_t data[2];
@@ -1192,7 +1191,7 @@ static int sbp2_login_device(struct scsi
 	}
 
 	/* Set-up login ORB, assume no password */
-	scsi_id->login_orb->password_hi = 0; 
+	scsi_id->login_orb->password_hi = 0;
 	scsi_id->login_orb->password_lo = 0;
 	SBP2_DEBUG("sbp2_login_device: password_hi/lo initialized");
 
@@ -1216,7 +1215,7 @@ static int sbp2_login_device(struct scsi
 		ORB_SET_LOGIN_RESP_LENGTH(sizeof(struct sbp2_login_response));
 	SBP2_DEBUG("sbp2_login_device: passwd_resp_lengths initialized");
 
-	scsi_id->login_orb->status_FIFO_lo = SBP2_STATUS_FIFO_ADDRESS_LO + 
+	scsi_id->login_orb->status_FIFO_lo = SBP2_STATUS_FIFO_ADDRESS_LO +
 					     SBP2_STATUS_FIFO_ENTRY_TO_OFFSET(scsi_id->ud->id);
 	scsi_id->login_orb->status_FIFO_hi = (ORB_SET_NODE_ID(hi->host->node_id) |
 					      SBP2_STATUS_FIFO_ADDRESS_HI);
@@ -1229,7 +1228,7 @@ static int sbp2_login_device(struct scsi
 
 	SBP2_DEBUG("sbp2_login_device: orb byte-swapped");
 
-	sbp2util_packet_dump(scsi_id->login_orb, sizeof(struct sbp2_login_orb), 
+	sbp2util_packet_dump(scsi_id->login_orb, sizeof(struct sbp2_login_orb),
 			     "sbp2 login orb", scsi_id->login_orb_dma);
 
 	/*
@@ -1255,7 +1254,7 @@ static int sbp2_login_device(struct scsi
 	SBP2_DEBUG("sbp2_login_device: written");
 
 	/*
-	 * Wait for login status (up to 20 seconds)... 
+	 * Wait for login status (up to 20 seconds)...
 	 */
 	if (sbp2util_down_timeout(&scsi_id->sbp2_login_complete, 20*HZ)) {
 		SBP2_ERR("Error logging into SBP-2 device - login timed-out");
@@ -1310,10 +1309,11 @@ static int sbp2_login_device(struct scsi
  * This function is called in order to logout from a particular SBP-2
  * device, usually called during driver unload.
  */
-static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id) 
+static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id)
 {
 	struct sbp2scsi_host_info *hi = scsi_id->hi;
 	quadlet_t data[2];
+	int error;
 
 	SBP2_DEBUG("sbp2_logout_device");
 
@@ -1332,7 +1332,7 @@ static int sbp2_logout_device(struct scs
 	scsi_id->logout_orb->login_ID_misc |= ORB_SET_NOTIFY(1);
 
 	scsi_id->logout_orb->reserved5 = 0x0;
-	scsi_id->logout_orb->status_FIFO_lo = SBP2_STATUS_FIFO_ADDRESS_LO + 
+	scsi_id->logout_orb->status_FIFO_lo = SBP2_STATUS_FIFO_ADDRESS_LO +
 					      SBP2_STATUS_FIFO_ENTRY_TO_OFFSET(scsi_id->ud->id);
 	scsi_id->logout_orb->status_FIFO_hi = (ORB_SET_NODE_ID(hi->host->node_id) |
 					       SBP2_STATUS_FIFO_ADDRESS_HI);
@@ -1342,7 +1342,7 @@ static int sbp2_logout_device(struct scs
 	 */
 	sbp2util_cpu_to_be32_buffer(scsi_id->logout_orb, sizeof(struct sbp2_logout_orb));
 
-	sbp2util_packet_dump(scsi_id->logout_orb, sizeof(struct sbp2_logout_orb), 
+	sbp2util_packet_dump(scsi_id->logout_orb, sizeof(struct sbp2_logout_orb),
 			     "sbp2 logout orb", scsi_id->logout_orb_dma);
 
 	/*
@@ -1354,10 +1354,15 @@ static int sbp2_logout_device(struct scs
 
 	atomic_set(&scsi_id->sbp2_login_complete, 0);
 
-	hpsb_node_write(scsi_id->ne, scsi_id->sbp2_management_agent_addr, data, 8);
+	error = hpsb_node_write(scsi_id->ne,
+	                            scsi_id->sbp2_management_agent_addr,
+	                            data, 8);
+	if (error)
+		return error;
 
 	/* Wait for device to logout...1 second. */
-	sbp2util_down_timeout(&scsi_id->sbp2_login_complete, HZ);
+	if (sbp2util_down_timeout(&scsi_id->sbp2_login_complete, HZ))
+		return -EIO;
 
 	SBP2_INFO("Logged out of SBP-2 device");
 
@@ -1369,10 +1374,11 @@ static int sbp2_logout_device(struct scs
  * This function is called in order to reconnect to a particular SBP-2
  * device, after a bus reset.
  */
-static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id) 
+static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id)
 {
 	struct sbp2scsi_host_info *hi = scsi_id->hi;
 	quadlet_t data[2];
+	int error;
 
 	SBP2_DEBUG("sbp2_reconnect_device");
 
@@ -1392,7 +1398,7 @@ static int sbp2_reconnect_device(struct 
 	scsi_id->reconnect_orb->login_ID_misc |= ORB_SET_NOTIFY(1);
 
 	scsi_id->reconnect_orb->reserved5 = 0x0;
-	scsi_id->reconnect_orb->status_FIFO_lo = SBP2_STATUS_FIFO_ADDRESS_LO + 
+	scsi_id->reconnect_orb->status_FIFO_lo = SBP2_STATUS_FIFO_ADDRESS_LO +
 						 SBP2_STATUS_FIFO_ENTRY_TO_OFFSET(scsi_id->ud->id);
 	scsi_id->reconnect_orb->status_FIFO_hi =
 		(ORB_SET_NODE_ID(hi->host->node_id) | SBP2_STATUS_FIFO_ADDRESS_HI);
@@ -1402,7 +1408,7 @@ static int sbp2_reconnect_device(struct 
 	 */
 	sbp2util_cpu_to_be32_buffer(scsi_id->reconnect_orb, sizeof(struct sbp2_reconnect_orb));
 
-	sbp2util_packet_dump(scsi_id->reconnect_orb, sizeof(struct sbp2_reconnect_orb), 
+	sbp2util_packet_dump(scsi_id->reconnect_orb, sizeof(struct sbp2_reconnect_orb),
 			     "sbp2 reconnect orb", scsi_id->reconnect_orb_dma);
 
 	/*
@@ -1419,7 +1425,11 @@ static int sbp2_reconnect_device(struct 
 
 	atomic_set(&scsi_id->sbp2_login_complete, 0);
 
-	hpsb_node_write(scsi_id->ne, scsi_id->sbp2_management_agent_addr, data, 8);
+	error = hpsb_node_write(scsi_id->ne,
+	                            scsi_id->sbp2_management_agent_addr,
+	                            data, 8);
+	if (error)
+		return error;
 
 	/*
 	 * Wait for reconnect status (up to 1 second)...
@@ -1448,7 +1458,7 @@ static int sbp2_reconnect_device(struct 
 		return(-EIO);
 	}
 
-	SBP2_INFO("Reconnected to SBP-2 device");
+	HPSB_DEBUG("Reconnected to SBP-2 device");
 
 	return(0);
 
@@ -1456,7 +1466,7 @@ static int sbp2_reconnect_device(struct 
 
 /*
  * This function is called in order to set the busy timeout (number of
- * retries to attempt) on the sbp2 device. 
+ * retries to attempt) on the sbp2 device.
  */
 static int sbp2_set_busy_timeout(struct scsi_id_instance_data *scsi_id)
 {
@@ -1480,7 +1490,7 @@ static int sbp2_set_busy_timeout(struct 
 /*
  * This function is called to parse sbp2 device's config rom unit
  * directory. Used to determine things like sbp2 management agent offset,
- * and command set used (SCSI or RBC). 
+ * and command set used (SCSI or RBC).
  */
 static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id,
 				      struct unit_directory *ud)
@@ -1638,18 +1648,18 @@ static int sbp2_max_speed_and_size(struc
 	scsi_id->max_payload_size = min(sbp2_speedto_max_payload[scsi_id->speed_code],
 					(u8)(hi->host->csr.max_rec - 1));
 
-	SBP2_ERR("Node " NODE_BUS_FMT ": Max speed [%s] - Max payload [%u]",
-		 NODE_BUS_ARGS(hi->host, scsi_id->ne->nodeid),
-		 hpsb_speedto_str[scsi_id->speed_code],
-		 1 << ((u32)scsi_id->max_payload_size + 2));
+	HPSB_DEBUG("Node " NODE_BUS_FMT ": Max speed [%s] - Max payload [%u]",
+		   NODE_BUS_ARGS(hi->host, scsi_id->ne->nodeid),
+		   hpsb_speedto_str[scsi_id->speed_code],
+		   1 << ((u32)scsi_id->max_payload_size + 2));
 
 	return(0);
 }
 
 /*
- * This function is called in order to perform a SBP-2 agent reset. 
+ * This function is called in order to perform a SBP-2 agent reset.
  */
-static int sbp2_agent_reset(struct scsi_id_instance_data *scsi_id, int wait) 
+static int sbp2_agent_reset(struct scsi_id_instance_data *scsi_id, int wait)
 {
 	quadlet_t data;
 	u64 addr;
@@ -1690,7 +1700,7 @@ static int sbp2_create_command_orb(struc
 				   unchar *scsi_cmd,
 				   unsigned int scsi_use_sg,
 				   unsigned int scsi_request_bufflen,
-				   void *scsi_request_buffer, 
+				   void *scsi_request_buffer,
 				   unsigned char scsi_dir)
 {
 	struct sbp2scsi_host_info *hi = scsi_id->hi;
@@ -1734,7 +1744,7 @@ static int sbp2_create_command_orb(struc
 		case SCSI_DATA_UNKNOWN:
 		default:
 			SBP2_ERR("SCSI data transfer direction not specified. "
-				 "Update the SBP2 direction table in sbp2.h if " 
+				 "Update the SBP2 direction table in sbp2.h if "
 				 "necessary for your application");
 			print_command (scsi_cmd);
 			orb_direction = sbp2scsi_direction_table[*scsi_cmd];
@@ -1805,12 +1815,12 @@ static int sbp2_create_command_orb(struc
 				while (sg_len) {
 					scatter_gather_element[sg_count].segment_base_lo = sg_addr;
 					if (sg_len > SBP2_MAX_SG_ELEMENT_LENGTH) {
-						scatter_gather_element[sg_count].length_segment_base_hi =  
+						scatter_gather_element[sg_count].length_segment_base_hi =
 							PAGE_TABLE_SET_SEGMENT_LENGTH(SBP2_MAX_SG_ELEMENT_LENGTH);
 						sg_addr += SBP2_MAX_SG_ELEMENT_LENGTH;
 						sg_len -= SBP2_MAX_SG_ELEMENT_LENGTH;
 					} else {
-						scatter_gather_element[sg_count].length_segment_base_hi = 
+						scatter_gather_element[sg_count].length_segment_base_hi =
 							PAGE_TABLE_SET_SEGMENT_LENGTH(sg_len);
 						sg_len = 0;
 					}
@@ -1821,14 +1831,14 @@ static int sbp2_create_command_orb(struc
 			/* Number of page table (s/g) elements */
 			command_orb->misc |= ORB_SET_DATA_SIZE(sg_count);
 
-			sbp2util_packet_dump(scatter_gather_element, 
-					     (sizeof(struct sbp2_unrestricted_page_table)) * sg_count, 
+			sbp2util_packet_dump(scatter_gather_element,
+					     (sizeof(struct sbp2_unrestricted_page_table)) * sg_count,
 					     "sbp2 s/g list", command->sge_dma);
 
 			/*
 			 * Byte swap page tables if necessary
 			 */
-			sbp2util_cpu_to_be32_buffer(scatter_gather_element, 
+			sbp2util_cpu_to_be32_buffer(scatter_gather_element,
 						    (sizeof(struct sbp2_unrestricted_page_table)) *
 						    sg_count);
 
@@ -1871,7 +1881,7 @@ static int sbp2_create_command_orb(struc
 			/*
 			 * Need to turn this into page tables, since the
 			 * buffer is too large.
-			 */                     
+			 */
 			command_orb->data_descriptor_hi = ORB_SET_NODE_ID(hi->host->node_id);
 			command_orb->data_descriptor_lo = command->sge_dma;
 
@@ -1889,12 +1899,12 @@ static int sbp2_create_command_orb(struc
 			while (sg_len) {
 				scatter_gather_element[sg_count].segment_base_lo = sg_addr;
 				if (sg_len > SBP2_MAX_SG_ELEMENT_LENGTH) {
-					scatter_gather_element[sg_count].length_segment_base_hi = 
+					scatter_gather_element[sg_count].length_segment_base_hi =
 						PAGE_TABLE_SET_SEGMENT_LENGTH(SBP2_MAX_SG_ELEMENT_LENGTH);
 					sg_addr += SBP2_MAX_SG_ELEMENT_LENGTH;
 					sg_len -= SBP2_MAX_SG_ELEMENT_LENGTH;
 				} else {
-					scatter_gather_element[sg_count].length_segment_base_hi = 
+					scatter_gather_element[sg_count].length_segment_base_hi =
 						PAGE_TABLE_SET_SEGMENT_LENGTH(sg_len);
 					sg_len = 0;
 				}
@@ -1904,14 +1914,14 @@ static int sbp2_create_command_orb(struc
 			/* Number of page table (s/g) elements */
 			command_orb->misc |= ORB_SET_DATA_SIZE(sg_count);
 
-			sbp2util_packet_dump(scatter_gather_element, 
-					     (sizeof(struct sbp2_unrestricted_page_table)) * sg_count, 
+			sbp2util_packet_dump(scatter_gather_element,
+					     (sizeof(struct sbp2_unrestricted_page_table)) * sg_count,
 					     "sbp2 s/g list", command->sge_dma);
 
 			/*
 			 * Byte swap page tables if necessary
 			 */
-			sbp2util_cpu_to_be32_buffer(scatter_gather_element, 
+			sbp2util_cpu_to_be32_buffer(scatter_gather_element,
 						    (sizeof(struct sbp2_unrestricted_page_table)) *
 						     sg_count);
 
@@ -1932,9 +1942,9 @@ static int sbp2_create_command_orb(struc
 
 	return(0);
 }
- 
+
 /*
- * This function is called in order to begin a regular SBP-2 command. 
+ * This function is called in order to begin a regular SBP-2 command.
  */
 static int sbp2_link_orb_command(struct scsi_id_instance_data *scsi_id,
 				 struct sbp2_command_info *command)
@@ -2019,7 +2029,7 @@ static int sbp2_link_orb_command(struct 
 }
 
 /*
- * This function is called in order to begin a regular SBP-2 command. 
+ * This function is called in order to begin a regular SBP-2 command.
  */
 static int sbp2_send_command(struct scsi_id_instance_data *scsi_id,
 			     Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
@@ -2046,8 +2056,8 @@ static int sbp2_send_command(struct scsi
 
 	/*
 	 * The scsi stack sends down a request_bufflen which does not match the
-	 * length field in the scsi cdb. This causes some sbp2 devices to 
-	 * reject this inquiry command. Fix the request_bufflen. 
+	 * length field in the scsi cdb. This causes some sbp2 devices to
+	 * reject this inquiry command. Fix the request_bufflen.
 	 */
 	if (*cmd == INQUIRY) {
 		if (force_inquiry_hack || scsi_id->workarounds & SBP2_BREAKAGE_INQUIRY_HACK)
@@ -2061,14 +2071,14 @@ static int sbp2_send_command(struct scsi
 	 */
 	sbp2_create_command_orb(scsi_id, command, cmd, SCpnt->use_sg,
 				request_bufflen, SCpnt->request_buffer,
-				SCpnt->sc_data_direction); 
+				SCpnt->sc_data_direction);
 	/*
 	 * Update our cdb if necessary (to handle sbp2 RBC command set
 	 * differences). This is where the command set hacks go!   =)
 	 */
 	sbp2_check_sbp2_command(scsi_id, command->command_orb.cdb);
 
-	sbp2util_packet_dump(&command->command_orb, sizeof(struct sbp2_command_orb), 
+	sbp2util_packet_dump(&command->command_orb, sizeof(struct sbp2_command_orb),
 			     "sbp2 command orb", command->command_orb_dma);
 
 	/*
@@ -2080,7 +2090,7 @@ static int sbp2_send_command(struct scsi
 	 * Link up the orb, and ring the doorbell if needed
 	 */
 	sbp2_link_orb_command(scsi_id, command);
-	
+
 	return(0);
 }
 
@@ -2097,13 +2107,13 @@ static void sbp2_check_sbp2_command(stru
 	SBP2_DEBUG("sbp2_check_sbp2_command");
 
 	switch (*cmd) {
-		
+
 		case READ_6:
 
 			if (sbp2_command_conversion_device_type(device_type)) {
 
 				SBP2_DEBUG("Convert READ_6 to READ_10");
-					    
+
 				/*
 				 * Need to turn read_6 into read_10
 				 */
@@ -2117,7 +2127,7 @@ static void sbp2_check_sbp2_command(stru
 				new_cmd[7] = 0x0;
 				new_cmd[8] = cmd[4];
 				new_cmd[9] = cmd[5];
-	
+
 				memcpy(cmd, new_cmd, 10);
 
 			}
@@ -2129,7 +2139,7 @@ static void sbp2_check_sbp2_command(stru
 			if (sbp2_command_conversion_device_type(device_type)) {
 
 				SBP2_DEBUG("Convert WRITE_6 to WRITE_10");
-	
+
 				/*
 				 * Need to turn write_6 into write_10
 				 */
@@ -2143,7 +2153,7 @@ static void sbp2_check_sbp2_command(stru
 				new_cmd[7] = 0x0;
 				new_cmd[8] = cmd[4];
 				new_cmd[9] = cmd[5];
-	
+
 				memcpy(cmd, new_cmd, 10);
 
 			}
@@ -2169,7 +2179,7 @@ static void sbp2_check_sbp2_command(stru
 				new_cmd[7] = 0x0;
 				new_cmd[8] = cmd[4];
 				new_cmd[9] = cmd[5];
-	
+
 				memcpy(cmd, new_cmd, 10);
 
 			}
@@ -2232,7 +2242,7 @@ static void sbp2_check_sbp2_response(str
 	SBP2_DEBUG("sbp2_check_sbp2_response");
 
 	switch (SCpnt->cmnd[0]) {
-		
+
 		case INQUIRY:
 
 			/*
@@ -2270,7 +2280,7 @@ static void sbp2_check_sbp2_response(str
 		case MODE_SENSE:
 
 			if (sbp2_command_conversion_device_type(device_type)) {
-			
+
 				SBP2_DEBUG("Modify mode sense response (10 byte version)");
 
 				scsi_buf[0] = scsi_buf[1];	/* Mode data length */
@@ -2278,7 +2288,6 @@ static void sbp2_check_sbp2_response(str
 				scsi_buf[2] = scsi_buf[3];	/* Device specific parameter */
 				scsi_buf[3] = scsi_buf[7];	/* Block descriptor length */
 				memcpy(scsi_buf + 4, scsi_buf + 8, scsi_buf[0]);
-	
 			}
 
 			break;
@@ -2342,7 +2351,7 @@ static int sbp2_handle_status_write(stru
 	}
 
 	/*
-	 * Put response into scsi_id status fifo... 
+	 * Put response into scsi_id status fifo...
 	 */
 	memcpy(&scsi_id->status_block, data, length);
 
@@ -2394,7 +2403,7 @@ static int sbp2_handle_status_write(stru
 			if (STATUS_GET_DEAD_BIT(scsi_id->status_block.ORB_offset_hi_misc)) {
 
 				/*
-				 * Initiate a fetch agent reset. 
+				 * Initiate a fetch agent reset.
 				 */
 				SBP2_DEBUG("Dead bit set - initiating fetch agent reset");
                                 sbp2_agent_reset(scsi_id, 0);
@@ -2405,7 +2414,7 @@ static int sbp2_handle_status_write(stru
 
 		/*
 		 * Check here to see if there are no commands in-use. If there are none, we can
-		 * null out last orb so that next time around we write directly to the orb pointer... 
+		 * null out last orb so that next time around we write directly to the orb pointer...
 		 * Quick start saves one 1394 bus transaction.
 		 */
 		if (list_empty(&scsi_id->sbp2_command_orb_inuse)) {
@@ -2413,8 +2422,8 @@ static int sbp2_handle_status_write(stru
 		}
 
 	} else {
-		
-		/* 
+
+		/*
 		 * It's probably a login/logout/reconnect status.
 		 */
 		if ((scsi_id->login_orb_dma == scsi_id->status_block.ORB_offset_lo) ||
@@ -2443,10 +2452,10 @@ static int sbp2_handle_status_write(stru
  **************************************/
 
 /*
- * This routine is the main request entry routine for doing I/O. It is 
+ * This routine is the main request entry routine for doing I/O. It is
  * called from the scsi stack directly.
  */
-static int sbp2scsi_queuecommand (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) 
+static int sbp2scsi_queuecommand (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
 {
 	struct scsi_id_instance_data *scsi_id =
 		(struct scsi_id_instance_data *)SCpnt->device->host->hostdata[0];
@@ -2521,7 +2530,7 @@ static int sbp2scsi_queuecommand (Scsi_C
  * This function is called in order to complete all outstanding SBP-2
  * commands (in case of resets, etc.).
  */
-static void sbp2scsi_complete_all_commands(struct scsi_id_instance_data *scsi_id, 
+static void sbp2scsi_complete_all_commands(struct scsi_id_instance_data *scsi_id,
 					   u32 status)
 {
 	struct sbp2scsi_host_info *hi = scsi_id->hi;
@@ -2581,7 +2590,7 @@ static void sbp2scsi_complete_command(st
 		SBP2_ERR("Bus reset in progress - retry command later");
 		return;
 	}
-        
+ 
 	/*
 	 * Switch on scsi status
 	 */
@@ -2650,7 +2659,7 @@ static void sbp2scsi_complete_command(st
 	 * or hot-plug...
 	 */
 #if 0
-	if ((scsi_status == SBP2_SCSI_STATUS_CHECK_CONDITION) && 
+	if ((scsi_status == SBP2_SCSI_STATUS_CHECK_CONDITION) &&
 	    (SCpnt->sense_buffer[2] == UNIT_ATTENTION)) {
 		SBP2_DEBUG("UNIT ATTENTION - return busy");
 		SCpnt->result = DID_BUS_BUSY << 16;
@@ -2680,7 +2689,7 @@ static int sbp2scsi_slave_configure (str
  * Called by scsi stack when something has really gone wrong.  Usually
  * called when a command has timed-out for some reason.
  */
-static int sbp2scsi_abort (Scsi_Cmnd *SCpnt) 
+static int sbp2scsi_abort (Scsi_Cmnd *SCpnt)
 {
 	struct scsi_id_instance_data *scsi_id =
 		(struct scsi_id_instance_data *)SCpnt->device->host->hostdata[0];
@@ -2689,7 +2698,7 @@ static int sbp2scsi_abort (Scsi_Cmnd *SC
 
 	SBP2_ERR("aborting sbp2 command");
 	print_command (SCpnt->cmnd);
-        
+
 	if (scsi_id) {
 
 		/*
@@ -2716,10 +2725,10 @@ static int sbp2scsi_abort (Scsi_Cmnd *SC
 		}
 
 		/*
-		 * Initiate a fetch agent reset. 
+		 * Initiate a fetch agent reset.
 		 */
 		sbp2_agent_reset(scsi_id, 0);
-		sbp2scsi_complete_all_commands(scsi_id, DID_BUS_BUSY);		
+		sbp2scsi_complete_all_commands(scsi_id, DID_BUS_BUSY);
 	}
 
 	return(SUCCESS);
@@ -2728,7 +2737,7 @@ static int sbp2scsi_abort (Scsi_Cmnd *SC
 /*
  * Called by scsi stack when something has really gone wrong.
  */
-static int sbp2scsi_reset (Scsi_Cmnd *SCpnt) 
+static int sbp2scsi_reset (Scsi_Cmnd *SCpnt)
 {
 	struct scsi_id_instance_data *scsi_id =
 		(struct scsi_id_instance_data *)SCpnt->device->host->hostdata[0];
--- diff/drivers/ieee1394/sbp2.h	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/ieee1394/sbp2.h	2004-04-21 10:45:34.286491160 +0100
@@ -271,7 +271,7 @@ struct sbp2_status_block {
 #endif
 
 /*
- * SCSI direction table... 
+ * SCSI direction table...
  * (now used as a back-up in case the direction passed down from above is "unknown")
  *
  * DIN = IN data direction
@@ -285,7 +285,7 @@ struct sbp2_status_block {
 #define DIN				ORB_DIRECTION_READ_FROM_MEDIA
 #define DOU				ORB_DIRECTION_WRITE_TO_MEDIA
 #define DNO				ORB_DIRECTION_NO_DATA_TRANSFER
-#define DUN				DIN 
+#define DUN				DIN
 
 static unchar sbp2scsi_direction_table[0x100] = {
 	DNO,DNO,DIN,DIN,DOU,DIN,DIN,DOU,DIN,DUN,DOU,DOU,DUN,DUN,DUN,DIN,
@@ -316,8 +316,8 @@ enum cmd_dma_types {
 	CMD_DMA_SINGLE
 };
 
-/* 
- * Encapsulates all the info necessary for an outstanding command. 
+/*
+ * Encapsulates all the info necessary for an outstanding command.
  */
 struct sbp2_command_info {
 
@@ -386,12 +386,12 @@ struct scsi_id_instance_data {
 	u32 sbp2_device_type_and_lun;
 	u32 sbp2_firmware_revision;
 
-	/* 
+	/*
 	 * Variable used for logins, reconnects, logouts, query logins
 	 */
 	atomic_t sbp2_login_complete;
 
-	/* 
+	/*
 	 * Pool of command orbs, so we can have more than overlapped command per id
 	 */
 	spinlock_t sbp2_command_orb_lock;
@@ -433,8 +433,8 @@ static int sbp2util_create_command_orb_p
 static void sbp2util_remove_command_orb_pool(struct scsi_id_instance_data *scsi_id);
 static struct sbp2_command_info *sbp2util_find_command_for_orb(struct scsi_id_instance_data *scsi_id, dma_addr_t orb);
 static struct sbp2_command_info *sbp2util_find_command_for_SCpnt(struct scsi_id_instance_data *scsi_id, void *SCpnt);
-static struct sbp2_command_info *sbp2util_allocate_command_orb(struct scsi_id_instance_data *scsi_id, 
-							  Scsi_Cmnd *Current_SCpnt, 
+static struct sbp2_command_info *sbp2util_allocate_command_orb(struct scsi_id_instance_data *scsi_id,
+							  Scsi_Cmnd *Current_SCpnt,
 							  void (*Current_done)(Scsi_Cmnd *));
 static void sbp2util_mark_command_completed(struct scsi_id_instance_data *scsi_id,
 		struct sbp2_command_info *command);
@@ -455,8 +455,8 @@ static int sbp2_handle_physdma_read(stru
  */
 static int sbp2_query_logins(struct scsi_id_instance_data *scsi_id);
 static int sbp2_login_device(struct scsi_id_instance_data *scsi_id);
-static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id); 
-static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id); 
+static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id);
+static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id);
 static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, int destid,
 				    quadlet_t *data, u64 addr, size_t length, u16 flags);
 static int sbp2_agent_reset(struct scsi_id_instance_data *scsi_id, int wait);
@@ -465,7 +465,7 @@ static int sbp2_create_command_orb(struc
 				   unchar *scsi_cmd,
 				   unsigned int scsi_use_sg,
 				   unsigned int scsi_request_bufflen,
-				   void *scsi_request_buffer, 
+				   void *scsi_request_buffer,
 				   unsigned char scsi_dir);
 static int sbp2_link_orb_command(struct scsi_id_instance_data *scsi_id,
 				 struct sbp2_command_info *command);
--- diff/drivers/ieee1394/video1394.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/ieee1394/video1394.c	2004-04-21 10:45:34.288490856 +0100
@@ -102,7 +102,7 @@ struct dma_iso_ctx {
 
 	unsigned int *buffer_status;
         struct timeval *buffer_time; /* time when the buffer was received */
-	unsigned int *last_used_cmd; /* For ISO Transmit with 
+	unsigned int *last_used_cmd; /* For ISO Transmit with
 					variable sized packets only ! */
 	int ctrlClear;
 	int ctrlSet;
@@ -154,7 +154,7 @@ static struct hpsb_highlevel video1394_h
 static int free_dma_iso_ctx(struct dma_iso_ctx *d)
 {
 	int i;
-	
+
 	DBGMSG(d->ohci->host->id, "Freeing dma_iso_ctx %d", d->ctx);
 
 	ohci1394_stop_context(d->ohci, d->ctrlClear, NULL);
@@ -260,7 +260,7 @@ alloc_dma_iso_ctx(struct ti_ohci *ohci, 
 		d->cmdPtr = OHCI1394_IsoRcvCommandPtr+32*d->ctx;
 		d->ctxMatch = OHCI1394_IsoRcvContextMatch+32*d->ctx;
 
-		d->ir_prg = kmalloc(d->num_desc * sizeof(struct dma_cmd *), 
+		d->ir_prg = kmalloc(d->num_desc * sizeof(struct dma_cmd *),
 				    GFP_KERNEL);
 
 		if (d->ir_prg == NULL) {
@@ -273,7 +273,7 @@ alloc_dma_iso_ctx(struct ti_ohci *ohci, 
 		d->nb_cmd = d->buf_size / PAGE_SIZE + 1;
 		d->left_size = (d->frame_size % PAGE_SIZE) ?
 			d->frame_size % PAGE_SIZE : PAGE_SIZE;
- 
+
 		for (i = 0;i < d->num_desc; i++) {
 			if (dma_prog_region_alloc(&d->prg_reg[i], d->nb_cmd *
 						  sizeof(struct dma_cmd), ohci->dev)) {
@@ -289,21 +289,21 @@ alloc_dma_iso_ctx(struct ti_ohci *ohci, 
 		d->ctrlClear = OHCI1394_IsoXmitContextControlClear+16*d->ctx;
 		d->cmdPtr = OHCI1394_IsoXmitCommandPtr+16*d->ctx;
 
-		d->it_prg = kmalloc(d->num_desc * sizeof(struct it_dma_prg *), 
+		d->it_prg = kmalloc(d->num_desc * sizeof(struct it_dma_prg *),
 				    GFP_KERNEL);
 
 		if (d->it_prg == NULL) {
-			PRINT(KERN_ERR, ohci->host->id, 
+			PRINT(KERN_ERR, ohci->host->id,
 			      "Failed to allocate dma it prg");
 			free_dma_iso_ctx(d);
 			return NULL;
 		}
 		memset(d->it_prg, 0, d->num_desc*sizeof(struct it_dma_prg *));
-		
+
 		d->packet_size = packet_size;
 
 		if (PAGE_SIZE % packet_size || packet_size>4096) {
-			PRINT(KERN_ERR, ohci->host->id, 
+			PRINT(KERN_ERR, ohci->host->id,
 			      "Packet size %d (page_size: %ld) "
 			      "not yet supported\n",
 			      packet_size, PAGE_SIZE);
@@ -362,7 +362,7 @@ alloc_dma_iso_ctx(struct ti_ohci *ohci, 
 	memset(d->buffer_time, 0, d->num_desc * sizeof(struct timeval));
 	memset(d->last_used_cmd, 0, d->num_desc * sizeof(unsigned int));
 	memset(d->next_buffer, -1, d->num_desc * sizeof(int));
-	
+
         spin_lock_init(&d->lock);
 
 	PRINT(KERN_INFO, ohci->host->id, "Iso %s DMA: %d buffers "
@@ -412,9 +412,9 @@ static void initialize_dma_ir_prg(struct
 						(unsigned long)d->dma.kvirt));
 		ir_prg[1].branchAddress = cpu_to_le32((dma_prog_region_offset_to_bus(ir_reg,
 						      2 * sizeof(struct dma_cmd)) & 0xfffffff0) | 0x1);
-	
+
 		for (i = 2; i < d->nb_cmd - 1; i++) {
-			ir_prg[i].control = cpu_to_le32(DMA_CTL_INPUT_MORE | DMA_CTL_UPDATE | 
+			ir_prg[i].control = cpu_to_le32(DMA_CTL_INPUT_MORE | DMA_CTL_UPDATE |
 							DMA_CTL_BRANCH | PAGE_SIZE);
 			ir_prg[i].address = cpu_to_le32(dma_region_offset_to_bus(&d->dma,
 							(buf+(i-1)*PAGE_SIZE) -
@@ -426,21 +426,21 @@ static void initialize_dma_ir_prg(struct
 		}
 
 		/* The last descriptor will generate an interrupt */
-		ir_prg[i].control = cpu_to_le32(DMA_CTL_INPUT_MORE | DMA_CTL_UPDATE | 
+		ir_prg[i].control = cpu_to_le32(DMA_CTL_INPUT_MORE | DMA_CTL_UPDATE |
 						DMA_CTL_IRQ | DMA_CTL_BRANCH | d->left_size);
 		ir_prg[i].address = cpu_to_le32(dma_region_offset_to_bus(&d->dma,
 						(buf+(i-1)*PAGE_SIZE) -
 						(unsigned long)d->dma.kvirt));
-	} else { 
+	} else {
 		/* Only one DMA page is used. Read d->left_size immediately and */
 		/* generate an interrupt as this is also the last page. */
-		ir_prg[1].control = cpu_to_le32(DMA_CTL_INPUT_MORE | DMA_CTL_UPDATE | 
+		ir_prg[1].control = cpu_to_le32(DMA_CTL_INPUT_MORE | DMA_CTL_UPDATE |
 						DMA_CTL_IRQ | DMA_CTL_BRANCH | (d->left_size-4));
 		ir_prg[1].address = cpu_to_le32(dma_region_offset_to_bus(&d->dma,
 						(buf + 4) - (unsigned long)d->dma.kvirt));
 	}
 }
-	
+
 static void initialize_dma_ir_ctx(struct dma_iso_ctx *d, int tag, int flags)
 {
 	struct ti_ohci *ohci = (struct ti_ohci *)d->ohci;
@@ -462,13 +462,13 @@ static void initialize_dma_ir_ctx(struct
 	reg_write(ohci, d->ctrlSet, 0x80000000);
 
 	/* Set isoch header */
-	if (flags & VIDEO1394_INCLUDE_ISO_HEADERS) 
+	if (flags & VIDEO1394_INCLUDE_ISO_HEADERS)
 		reg_write(ohci, d->ctrlSet, 0x40000000);
 
-	/* Set the context match register to match on all tags, 
+	/* Set the context match register to match on all tags,
 	   sync for sync tag, and listen to d->channel */
 	reg_write(ohci, d->ctxMatch, 0xf0000000|((tag&0xf)<<8)|d->channel);
-	
+
 	/* Set up isoRecvIntMask to generate interrupts */
 	reg_write(ohci, OHCI1394_IsoRecvIntMaskSet, 1<<d->ctx);
 }
@@ -524,9 +524,9 @@ static inline void put_timestamp(struct 
 	timeStamp = ((cycleTimer & 0x0fff) + d->syt_offset); /* 11059 = 450 us */
 	timeStamp = (timeStamp % 3072 + ((timeStamp / 3072) << 12)
 		+ (cycleTimer & 0xf000)) & 0xffff;
-	
-	buf[6] = timeStamp >> 8; 
-	buf[7] = timeStamp & 0xff; 
+
+	buf[6] = timeStamp >> 8;
+	buf[7] = timeStamp & 0xff;
 
     /* if first packet is empty packet, then put timestamp into the next full one too */
     if ( (le32_to_cpu(d->it_prg[n][0].data[1]) >>16) == 0x008) {
@@ -557,7 +557,7 @@ static inline void put_timestamp(struct 
 #if 0
 	printk("curr: %d, next: %d, cycleTimer: %08x timeStamp: %08x\n",
 	       curr, n, cycleTimer, timeStamp);
-#endif	
+#endif
 }
 
 void wakeup_dma_it_ctx(unsigned long l)
@@ -569,7 +569,7 @@ void wakeup_dma_it_ctx(unsigned long l)
 	spin_lock(&d->lock);
 
 	for (i = 0; i < d->num_desc; i++) {
-		if (d->it_prg[i][d->last_used_cmd[i]].end.status & 
+		if (d->it_prg[i][d->last_used_cmd[i]].end.status &
 		    cpu_to_le32(0xFFFF0000)) {
 			int next = d->next_buffer[i];
 			put_timestamp(ohci, d, next);
@@ -592,23 +592,23 @@ static void initialize_dma_it_prg(struct
 	int i;
 	d->last_used_cmd[n] = d->nb_cmd - 1;
 	for (i=0;i<d->nb_cmd;i++) {
-				 
+
 		it_prg[i].begin.control = cpu_to_le32(DMA_CTL_OUTPUT_MORE |
 			DMA_CTL_IMMEDIATE | 8) ;
 		it_prg[i].begin.address = 0;
-		
+
 		it_prg[i].begin.status = 0;
-		
+
 		it_prg[i].data[0] = cpu_to_le32(
-			(IEEE1394_SPEED_100 << 16) 
+			(IEEE1394_SPEED_100 << 16)
 			| (/* tag */ 1 << 14)
-			| (d->channel << 8) 
+			| (d->channel << 8)
 			| (TCODE_ISO_DATA << 4));
 		if (i==0) it_prg[i].data[0] |= cpu_to_le32(sync_tag);
 		it_prg[i].data[1] = cpu_to_le32(d->packet_size << 16);
 		it_prg[i].data[2] = 0;
 		it_prg[i].data[3] = 0;
-		
+
 		it_prg[i].end.control = cpu_to_le32(DMA_CTL_OUTPUT_LAST |
 			    	    	     DMA_CTL_BRANCH);
 		it_prg[i].end.address =
@@ -617,15 +617,15 @@ static void initialize_dma_it_prg(struct
 
 		if (i<d->nb_cmd-1) {
 			it_prg[i].end.control |= cpu_to_le32(d->packet_size);
-			it_prg[i].begin.branchAddress = 
+			it_prg[i].begin.branchAddress =
 				cpu_to_le32((dma_prog_region_offset_to_bus(it_reg, (i + 1) *
 					sizeof(struct it_dma_prg)) & 0xfffffff0) | 0x3);
-			it_prg[i].end.branchAddress = 
+			it_prg[i].end.branchAddress =
 				cpu_to_le32((dma_prog_region_offset_to_bus(it_reg, (i + 1) *
 					sizeof(struct it_dma_prg)) & 0xfffffff0) | 0x3);
 		} else {
 			/* the last prg generates an interrupt */
-			it_prg[i].end.control |= cpu_to_le32(DMA_CTL_UPDATE | 
+			it_prg[i].end.control |= cpu_to_le32(DMA_CTL_UPDATE |
 				DMA_CTL_IRQ | d->left_size);
 			/* the last prg doesn't branch */
 			it_prg[i].begin.branchAddress = 0;
@@ -657,7 +657,7 @@ static void initialize_dma_it_prg_var_pa
 		} else {
 			size = packet_sizes[i];
 		}
-		it_prg[i].data[1] = cpu_to_le32(size << 16); 
+		it_prg[i].data[1] = cpu_to_le32(size << 16);
 		it_prg[i].end.control = cpu_to_le32(DMA_CTL_OUTPUT_LAST | DMA_CTL_BRANCH);
 
 		if (i < d->nb_cmd-1 && packet_sizes[i+1] != 0) {
@@ -670,7 +670,7 @@ static void initialize_dma_it_prg_var_pa
 					sizeof(struct it_dma_prg)) & 0xfffffff0) | 0x3);
 		} else {
 			/* the last prg generates an interrupt */
-			it_prg[i].end.control |= cpu_to_le32(DMA_CTL_UPDATE | 
+			it_prg[i].end.control |= cpu_to_le32(DMA_CTL_UPDATE |
 				DMA_CTL_IRQ | size);
 			/* the last prg doesn't branch */
 			it_prg[i].begin.branchAddress = 0;
@@ -694,7 +694,7 @@ static void initialize_dma_it_ctx(struct
 
 	for (i=0;i<d->num_desc;i++)
 		initialize_dma_it_prg(d, i, sync_tag);
-	
+
 	/* Set up isoRecvIntMask to generate interrupts */
 	reg_write(ohci, OHCI1394_IsoXmitIntMaskSet, 1<<d->ctx);
 }
@@ -731,9 +731,9 @@ static int video1394_ioctl(struct inode 
 			mask = mask << 1;
 		    }
 		}
-		    
+
 		if (v.channel<0 || v.channel>(ISO_CHANNELS-1)) {
-			PRINT(KERN_ERR, ohci->host->id, 
+			PRINT(KERN_ERR, ohci->host->id,
 			      "Iso channel %d out of bounds", v.channel);
 			return -EFAULT;
 		}
@@ -743,7 +743,7 @@ static int video1394_ioctl(struct inode 
 		       (u32)(ohci->ISO_channel_usage>>32),
 		       (u32)(ohci->ISO_channel_usage&0xffffffff));
 		if (ohci->ISO_channel_usage & mask) {
-			PRINT(KERN_ERR, ohci->host->id, 
+			PRINT(KERN_ERR, ohci->host->id,
 			      "Channel %d is already taken", v.channel);
 			return -EFAULT;
 		}
@@ -762,19 +762,19 @@ static int video1394_ioctl(struct inode 
 		}
 
 		if (v.nb_buffers * v.buf_size > VIDEO1394_MAX_SIZE) {
-			PRINT(KERN_ERR, ohci->host->id, 
-			      "%d buffers of size %d bytes is too big", 
+			PRINT(KERN_ERR, ohci->host->id,
+			      "%d buffers of size %d bytes is too big",
 			      v.nb_buffers, v.buf_size);
 			return -EFAULT;
 		}
 
 		if (cmd == VIDEO1394_IOC_LISTEN_CHANNEL) {
 			d = alloc_dma_iso_ctx(ohci, OHCI_ISO_RECEIVE,
-					      v.nb_buffers, v.buf_size, 
+					      v.nb_buffers, v.buf_size,
 					      v.channel, 0);
 
 			if (d == NULL) {
-				PRINT(KERN_ERR, ohci->host->id, 
+				PRINT(KERN_ERR, ohci->host->id,
 				      "Couldn't allocate ir context");
 				return -EFAULT;
 			}
@@ -785,21 +785,21 @@ static int video1394_ioctl(struct inode 
 			v.buf_size = d->buf_size;
 			list_add_tail(&d->link, &ctx->context_list);
 
-			PRINT(KERN_INFO, ohci->host->id, 
+			PRINT(KERN_INFO, ohci->host->id,
 			      "iso context %d listen on channel %d",
 			      d->ctx, v.channel);
 		}
 		else {
 			d = alloc_dma_iso_ctx(ohci, OHCI_ISO_TRANSMIT,
-					      v.nb_buffers, v.buf_size, 
+					      v.nb_buffers, v.buf_size,
 					      v.channel, v.packet_size);
 
 			if (d == NULL) {
-				PRINT(KERN_ERR, ohci->host->id, 
+				PRINT(KERN_ERR, ohci->host->id,
 				      "Couldn't allocate it context");
 				return -EFAULT;
 			}
-			initialize_dma_it_ctx(d, v.sync_tag, 
+			initialize_dma_it_ctx(d, v.sync_tag,
 					      v.syt_offset, v.flags);
 
 			ctx->current_ctx = d;
@@ -808,7 +808,7 @@ static int video1394_ioctl(struct inode 
 
 			list_add_tail(&d->link, &ctx->context_list);
 
-			PRINT(KERN_INFO, ohci->host->id, 
+			PRINT(KERN_INFO, ohci->host->id,
 			      "Iso context %d talk on channel %d", d->ctx,
 			      v.channel);
 		}
@@ -818,7 +818,7 @@ static int video1394_ioctl(struct inode 
 
 		return 0;
 	}
-	case VIDEO1394_IOC_UNLISTEN_CHANNEL: 
+	case VIDEO1394_IOC_UNLISTEN_CHANNEL:
 	case VIDEO1394_IOC_UNTALK_CHANNEL:
 	{
 		int channel;
@@ -829,13 +829,13 @@ static int video1394_ioctl(struct inode 
 			return -EFAULT;
 
 		if (channel<0 || channel>(ISO_CHANNELS-1)) {
-			PRINT(KERN_ERR, ohci->host->id, 
+			PRINT(KERN_ERR, ohci->host->id,
 			      "Iso channel %d out of bound", channel);
 			return -EFAULT;
 		}
 		mask = (u64)0x1<<channel;
 		if (!(ohci->ISO_channel_usage & mask)) {
-			PRINT(KERN_ERR, ohci->host->id, 
+			PRINT(KERN_ERR, ohci->host->id,
 			      "Channel %d is not being used", channel);
 			return -EFAULT;
 		}
@@ -852,7 +852,7 @@ static int video1394_ioctl(struct inode 
 		PRINT(KERN_INFO, ohci->host->id, "Iso context %d "
 		      "stop talking on channel %d", d->ctx, channel);
 		free_dma_iso_ctx(d);
-		
+
 		return 0;
 	}
 	case VIDEO1394_IOC_LISTEN_QUEUE_BUFFER:
@@ -866,20 +866,20 @@ static int video1394_ioctl(struct inode 
 		d = find_ctx(&ctx->context_list, OHCI_ISO_RECEIVE, v.channel);
 
 		if ((v.buffer<0) || (v.buffer>d->num_desc)) {
-			PRINT(KERN_ERR, ohci->host->id, 
+			PRINT(KERN_ERR, ohci->host->id,
 			      "Buffer %d out of range",v.buffer);
 			return -EFAULT;
 		}
-		
+
 		spin_lock_irqsave(&d->lock,flags);
 
 		if (d->buffer_status[v.buffer]==VIDEO1394_BUFFER_QUEUED) {
-			PRINT(KERN_ERR, ohci->host->id, 
+			PRINT(KERN_ERR, ohci->host->id,
 			      "Buffer %d is already used",v.buffer);
 			spin_unlock_irqrestore(&d->lock,flags);
 			return -EFAULT;
 		}
-		
+
 		d->buffer_status[v.buffer]=VIDEO1394_BUFFER_QUEUED;
 
 		if (d->last_buffer>=0)
@@ -893,7 +893,7 @@ static int video1394_ioctl(struct inode 
 
 		spin_unlock_irqrestore(&d->lock,flags);
 
-		if (!(reg_read(ohci, d->ctrlSet) & 0x8000)) 
+		if (!(reg_read(ohci, d->ctrlSet) & 0x8000))
 		{
 			DBGMSG(ohci->host->id, "Starting iso DMA ctx=%d",d->ctx);
 
@@ -907,13 +907,13 @@ static int video1394_ioctl(struct inode 
 		else {
 			/* Wake up dma context if necessary */
 			if (!(reg_read(ohci, d->ctrlSet) & 0x400)) {
-				PRINT(KERN_INFO, ohci->host->id, 
+				PRINT(KERN_INFO, ohci->host->id,
 				      "Waking up iso dma ctx=%d", d->ctx);
 				reg_write(ohci, d->ctrlSet, 0x1000);
 			}
 		}
 		return 0;
-		
+
 	}
 	case VIDEO1394_IOC_LISTEN_WAIT_BUFFER:
 	case VIDEO1394_IOC_LISTEN_POLL_BUFFER:
@@ -928,13 +928,13 @@ static int video1394_ioctl(struct inode 
 		d = find_ctx(&ctx->context_list, OHCI_ISO_RECEIVE, v.channel);
 
 		if ((v.buffer<0) || (v.buffer>d->num_desc)) {
-			PRINT(KERN_ERR, ohci->host->id, 
+			PRINT(KERN_ERR, ohci->host->id,
 			      "Buffer %d out of range",v.buffer);
 			return -EFAULT;
 		}
 
 		/*
-		 * I change the way it works so that it returns 
+		 * I change the way it works so that it returns
 		 * the last received frame.
 		 */
 		spin_lock_irqsave(&d->lock, flags);
@@ -961,7 +961,7 @@ static int video1394_ioctl(struct inode 
 				}
 			}
 #else
-			if (wait_event_interruptible(d->waitq, 
+			if (wait_event_interruptible(d->waitq,
 						     d->buffer_status[v.buffer]
 						     == VIDEO1394_BUFFER_READY)
 			    == -ERESTARTSYS)
@@ -970,7 +970,7 @@ static int video1394_ioctl(struct inode 
 			d->buffer_status[v.buffer]=VIDEO1394_BUFFER_FREE;
 			break;
 		default:
-			PRINT(KERN_ERR, ohci->host->id, 
+			PRINT(KERN_ERR, ohci->host->id,
 			      "Buffer %d is not queued",v.buffer);
 			spin_unlock_irqrestore(&d->lock, flags);
 			return -EFAULT;
@@ -1011,16 +1011,16 @@ static int video1394_ioctl(struct inode 
 		d = find_ctx(&ctx->context_list, OHCI_ISO_TRANSMIT, v.channel);
 
 		if ((v.buffer<0) || (v.buffer>d->num_desc)) {
-			PRINT(KERN_ERR, ohci->host->id, 
+			PRINT(KERN_ERR, ohci->host->id,
 			      "Buffer %d out of range",v.buffer);
 			return -EFAULT;
 		}
-		
+
 		if (d->flags & VIDEO1394_VARIABLE_PACKET_SIZE) {
 			unsigned int *psizes;
 			int buf_size = d->nb_cmd * sizeof(unsigned int);
 
-			if (copy_from_user(&qv, (void *)arg, sizeof(qv))) 
+			if (copy_from_user(&qv, (void *)arg, sizeof(qv)))
 				return -EFAULT;
 
 			psizes = kmalloc(buf_size, GFP_KERNEL);
@@ -1038,14 +1038,14 @@ static int video1394_ioctl(struct inode 
 		spin_lock_irqsave(&d->lock,flags);
 
 		if (d->buffer_status[v.buffer]!=VIDEO1394_BUFFER_FREE) {
-			PRINT(KERN_ERR, ohci->host->id, 
+			PRINT(KERN_ERR, ohci->host->id,
 			      "Buffer %d is already used",v.buffer);
 			spin_unlock_irqrestore(&d->lock,flags);
 			if (qv.packet_sizes)
 				kfree(qv.packet_sizes);
 			return -EFAULT;
 		}
-		
+
 		if (d->flags & VIDEO1394_VARIABLE_PACKET_SIZE) {
 			initialize_dma_it_prg_var_packet_queue(
 				d, v.buffer, qv.packet_sizes,
@@ -1056,7 +1056,7 @@ static int video1394_ioctl(struct inode 
 
 		if (d->last_buffer >= 0) {
 			d->it_prg[d->last_buffer]
-				[ d->last_used_cmd[d->last_buffer] ].end.branchAddress = 
+				[ d->last_used_cmd[d->last_buffer] ].end.branchAddress =
 					cpu_to_le32((dma_prog_region_offset_to_bus(&d->prg_reg[v.buffer],
 						0) & 0xfffffff0) | 0x3);
 
@@ -1073,7 +1073,7 @@ static int video1394_ioctl(struct inode 
 
 		spin_unlock_irqrestore(&d->lock,flags);
 
-		if (!(reg_read(ohci, d->ctrlSet) & 0x8000)) 
+		if (!(reg_read(ohci, d->ctrlSet) & 0x8000))
 		{
 			DBGMSG(ohci->host->id, "Starting iso transmit DMA ctx=%d",
 			       d->ctx);
@@ -1089,8 +1089,8 @@ static int video1394_ioctl(struct inode 
 		else {
 			/* Wake up dma context if necessary */
 			if (!(reg_read(ohci, d->ctrlSet) & 0x400)) {
-				PRINT(KERN_INFO, ohci->host->id, 
-				      "Waking up iso transmit dma ctx=%d", 
+				PRINT(KERN_INFO, ohci->host->id,
+				      "Waking up iso transmit dma ctx=%d",
 				      d->ctx);
 				put_timestamp(ohci, d, d->last_buffer);
 				reg_write(ohci, d->ctrlSet, 0x1000);
@@ -1101,7 +1101,7 @@ static int video1394_ioctl(struct inode 
 			kfree(qv.packet_sizes);
 
 		return 0;
-		
+
 	}
 	case VIDEO1394_IOC_TALK_WAIT_BUFFER:
 	{
@@ -1114,7 +1114,7 @@ static int video1394_ioctl(struct inode 
 		d = find_ctx(&ctx->context_list, OHCI_ISO_TRANSMIT, v.channel);
 
 		if ((v.buffer<0) || (v.buffer>d->num_desc)) {
-			PRINT(KERN_ERR, ohci->host->id, 
+			PRINT(KERN_ERR, ohci->host->id,
 			      "Buffer %d out of range",v.buffer);
 			return -EFAULT;
 		}
@@ -1131,7 +1131,7 @@ static int video1394_ioctl(struct inode 
 				if (signal_pending(current)) return -EINTR;
 			}
 #else
-			if (wait_event_interruptible(d->waitq, 
+			if (wait_event_interruptible(d->waitq,
 						     d->buffer_status[v.buffer]
 						     == VIDEO1394_BUFFER_READY)
 			    == -ERESTARTSYS)
@@ -1140,7 +1140,7 @@ static int video1394_ioctl(struct inode 
 			d->buffer_status[v.buffer]=VIDEO1394_BUFFER_FREE;
 			return 0;
 		default:
-			PRINT(KERN_ERR, ohci->host->id, 
+			PRINT(KERN_ERR, ohci->host->id,
 			      "Buffer %d is not queued",v.buffer);
 			return -EFAULT;
 		}
@@ -1153,7 +1153,7 @@ static int video1394_ioctl(struct inode 
 /*
  *	This maps the vmalloced and reserved buffer to user space.
  *
- *  FIXME: 
+ *  FIXME:
  *  - PAGE_READONLY should suffice!?
  *  - remap_page_range is kind of inefficient for page by page remapping.
  *    But e.g. pte_alloc() does not work in modules ... :-(
@@ -1211,7 +1211,7 @@ static int video1394_release(struct inod
 		struct dma_iso_ctx *d;
 		d = list_entry(lh, struct dma_iso_ctx, link);
 		mask = (u64) 1 << d->channel;
-		
+
 		if (!(ohci->ISO_channel_usage & mask))
 			PRINT(KERN_ERR, ohci->host->id, "On release: Channel %d "
 			      "is not being used", d->channel);
@@ -1226,7 +1226,7 @@ static int video1394_release(struct inod
 
 	kfree(ctx);
 	file->private_data = NULL;
-	
+
 	unlock_kernel();
 	return 0;
 }
@@ -1285,7 +1285,7 @@ static void video1394_add_host (struct h
 	hpsb_set_hostinfo(&video1394_highlevel, host, ohci);
 	hpsb_set_hostinfo_key(&video1394_highlevel, host, ohci->host->id);
 
-	minor = IEEE1394_MINOR_BLOCK_VIDEO1394 * 16 + ohci->host->id; 
+	minor = IEEE1394_MINOR_BLOCK_VIDEO1394 * 16 + ohci->host->id;
 	devfs_mk_cdev(MKDEV(IEEE1394_MAJOR, minor),
 		       S_IFCHR | S_IRUSR | S_IWUSR,
 		       "%s/%d", VIDEO1394_DRIVER_NAME, ohci->host->id);
@@ -1438,7 +1438,7 @@ static void __exit video1394_exit_module
 	ret |= unregister_ioctl32_conversion(VIDEO1394_IOC32_TALK_WAIT_BUFFER);
 	ret |= unregister_ioctl32_conversion(VIDEO1394_IOC32_LISTEN_POLL_BUFFER);
 	if (ret)
-		PRINT_G(KERN_INFO, "Error unregistering ioctl32 translations");
+		PRINT_G(KERN_CRIT, "Error unregistering ioctl32 translations");
 #endif
 
 	hpsb_unregister_protocol(&video1394_driver);
@@ -1457,6 +1457,7 @@ static int __init video1394_init_module 
 
 	cdev_init(&video1394_cdev, &video1394_fops);
 	video1394_cdev.owner = THIS_MODULE;
+	kobject_set_name(&video1394_cdev.kobj, VIDEO1394_DRIVER_NAME);
 	ret = cdev_add(&video1394_cdev, IEEE1394_VIDEO1394_DEV, 16);
 	if (ret) {
 		PRINT_G(KERN_ERR, "video1394: unable to get minor device block");
--- diff/drivers/ieee1394/video1394.h	2003-02-26 16:01:01.000000000 +0000
+++ source/drivers/ieee1394/video1394.h	2004-04-21 10:45:34.288490856 +0100
@@ -42,7 +42,7 @@ struct video1394_mmap {
 	unsigned int sync_tag;
 	unsigned int nb_buffers;
 	unsigned int buf_size;
-	unsigned int packet_size; /* For VARIABLE_PACKET_SIZE: 
+	unsigned int packet_size; /* For VARIABLE_PACKET_SIZE:
 				     Maximum packet size */
 	unsigned int fps;
 	unsigned int syt_offset;
@@ -53,7 +53,7 @@ struct video1394_mmap {
 struct video1394_queue_variable {
 	unsigned int channel;
 	unsigned int buffer;
-	unsigned int* packet_sizes; /* Buffer of size:  
+	unsigned int* packet_sizes; /* Buffer of size:
 				       buf_size / packet_size  */
 };
 
--- diff/drivers/input/keyboard/amikbd.c	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/input/keyboard/amikbd.c	2004-04-21 10:45:34.289490704 +0100
@@ -46,24 +46,113 @@ MODULE_DESCRIPTION("Amiga keyboard drive
 MODULE_LICENSE("GPL");
 
 static unsigned char amikbd_keycode[0x78] = {
-	 41,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 43,  0, 82,
-	 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,  0, 79, 80, 81,
-	 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 43,  0, 75, 76, 77,
-	 86, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,  0, 83, 71, 72, 73,
-	 57, 14, 15, 96, 28,  1,111,  0,  0,  0, 74,  0,103,108,106,105,
-	 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,179,180, 98, 55, 78,138,
-	 42, 54, 58, 29, 56,100,125,126
+	[0]	 = KEY_GRAVE,
+	[1]	 = KEY_1,
+	[2]	 = KEY_2,
+	[3]	 = KEY_3,
+	[4]	 = KEY_4,
+	[5]	 = KEY_5,
+	[6]	 = KEY_6,
+	[7]	 = KEY_7,
+	[8]	 = KEY_8,
+	[9]	 = KEY_9,
+	[10]	 = KEY_0,
+	[11]	 = KEY_MINUS,
+	[12]	 = KEY_EQUAL,
+	[13]	 = KEY_BACKSLASH,
+	[15]	 = KEY_KP0,
+	[16]	 = KEY_Q,
+	[17]	 = KEY_W,
+	[18]	 = KEY_E,
+	[19]	 = KEY_R,
+	[20]	 = KEY_T,
+	[21]	 = KEY_Y,
+	[22]	 = KEY_U,
+	[23]	 = KEY_I,
+	[24]	 = KEY_O,
+	[25]	 = KEY_P,
+	[26]	 = KEY_LEFTBRACE,
+	[27]	 = KEY_RIGHTBRACE,
+	[29]	 = KEY_KP1,
+	[30]	 = KEY_KP2,
+	[31]	 = KEY_KP3,
+	[32]	 = KEY_A,
+	[33]	 = KEY_S,
+	[34]	 = KEY_D,
+	[35]	 = KEY_F,
+	[36]	 = KEY_G,
+	[37]	 = KEY_H,
+	[38]	 = KEY_J,
+	[39]	 = KEY_K,
+	[40]	 = KEY_L,
+	[41]	 = KEY_SEMICOLON,
+	[42]	 = KEY_APOSTROPHE,
+	[43]	 = KEY_BACKSLASH,
+	[45]	 = KEY_KP4,
+	[46]	 = KEY_KP5,
+	[47]	 = KEY_KP6,
+	[48]	 = KEY_102ND,
+	[49]	 = KEY_Z,
+	[50]	 = KEY_X,
+	[51]	 = KEY_C,
+	[52]	 = KEY_V,
+	[53]	 = KEY_B,
+	[54]	 = KEY_N,
+	[55]	 = KEY_M,
+	[56]	 = KEY_COMMA,
+	[57]	 = KEY_DOT,
+	[58]	 = KEY_SLASH,
+	[60]	 = KEY_KPDOT,
+	[61]	 = KEY_KP7,
+	[62]	 = KEY_KP8,
+	[63]	 = KEY_KP9,
+	[64]	 = KEY_SPACE,
+	[65]	 = KEY_BACKSPACE,
+	[66]	 = KEY_TAB,
+	[67]	 = KEY_KPENTER,
+	[68]	 = KEY_ENTER,
+	[69]	 = KEY_ESC,
+	[70]	 = KEY_DELETE,
+	[74]	 = KEY_KPMINUS,
+	[76]	 = KEY_UP,
+	[77]	 = KEY_DOWN,
+	[78]	 = KEY_RIGHT,
+	[79]	 = KEY_LEFT,
+	[80]	 = KEY_F1,
+	[81]	 = KEY_F2,
+	[82]	 = KEY_F3,
+	[83]	 = KEY_F4,
+	[84]	 = KEY_F5,
+	[85]	 = KEY_F6,
+	[86]	 = KEY_F7,
+	[87]	 = KEY_F8,
+	[88]	 = KEY_F9,
+	[89]	 = KEY_F10,
+	[90]	 = KEY_KPLEFTPAREN,
+	[91]	 = KEY_KPRIGHTPAREN,
+	[92]	 = KEY_KPSLASH,
+	[93]	 = KEY_KPASTERISK,
+	[94]	 = KEY_KPPLUS,
+	[95]	 = KEY_HELP,
+	[96]	 = KEY_LEFTSHIFT,
+	[97]	 = KEY_RIGHTSHIFT,
+	[98]	 = KEY_CAPSLOCK,
+	[99]	 = KEY_LEFTCTRL,
+	[100]	 = KEY_LEFTALT,
+	[101]	 = KEY_RIGHTALT,
+	[102]	 = KEY_LEFTMETA,
+	[103]	 = KEY_RIGHTMETA
 };
 
 static const char *amikbd_messages[8] = {
-	KERN_ALERT "amikbd: Ctrl-Amiga-Amiga reset warning!!\n",
-	KERN_WARNING "amikbd: keyboard lost sync\n",
-	KERN_WARNING "amikbd: keyboard buffer overflow\n",
-	KERN_WARNING "amikbd: keyboard controller failure\n",
-	KERN_ERR "amikbd: keyboard selftest failure\n",
-	KERN_INFO "amikbd: initiate power-up key stream\n",
-	KERN_INFO "amikbd: terminate power-up key stream\n",
-	KERN_WARNING "amikbd: keyboard interrupt\n"
+	[0] = KERN_ALERT "amikbd: Ctrl-Amiga-Amiga reset warning!!\n",
+	[1] = KERN_WARNING "amikbd: keyboard lost sync\n",
+	[2] = KERN_WARNING "amikbd: keyboard buffer overflow\n",
+	[3] = KERN_WARNING "amikbd: keyboard controller failure\n",
+	[4] = KERN_ERR "amikbd: keyboard selftest failure\n",
+	[5] = KERN_INFO "amikbd: initiate power-up key stream\n",
+	[6] = KERN_INFO "amikbd: terminate power-up key stream\n",
+	[7] = KERN_WARNING "amikbd: keyboard interrupt\n"
 };
 
 static struct input_dev amikbd_dev;
--- diff/drivers/input/serio/serio.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/input/serio/serio.c	2004-04-21 10:45:34.289490704 +0100
@@ -154,7 +154,7 @@ static int serio_thread(void *nothing)
 		serio_handle_events();
 		wait_event_interruptible(serio_wait, !list_empty(&serio_event_list)); 
 		if (current->flags & PF_FREEZE)
-			refrigerator(PF_IOTHREAD);
+			refrigerator(PF_FREEZE);
 	} while (!signal_pending(current));
 
 	printk(KERN_DEBUG "serio: kseriod exiting\n");
--- diff/drivers/isdn/capi/capi.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/isdn/capi/capi.c	2004-04-21 10:45:34.290490552 +0100
@@ -37,6 +37,7 @@
 #include <linux/capi.h>
 #include <linux/kernelcapi.h>
 #include <linux/init.h>
+#include <linux/device.h>
 #include <linux/devfs_fs_kernel.h>
 #include <linux/isdn/capiutil.h>
 #include <linux/isdn/capicmd.h>
@@ -56,6 +57,8 @@ MODULE_LICENSE("GPL");
 
 /* -------- driver information -------------------------------------- */
 
+static struct class_simple *capi_class;
+
 int capi_major = 68;		/* allocated */
 #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
 #define CAPINC_NR_PORTS	32
@@ -1313,7 +1316,8 @@ static int capinc_tty_init(void)
 
 	drv->owner = THIS_MODULE;
 	drv->driver_name = "capi_nc";
-	drv->name = "capi/";
+	drv->devfs_name = "capi/";
+	drv->name = "capi";
 	drv->major = capi_ttymajor;
 	drv->minor_start = 0;
 	drv->type = TTY_DRIVER_TYPE_SERIAL;
@@ -1483,11 +1487,20 @@ static int __init capi_init(void)
 		return -EIO;
 	}
 
+	capi_class = class_simple_create(THIS_MODULE, "capi");
+	if (IS_ERR(capi_class)) {
+		unregister_chrdev(capi_major, "capi20");
+		return PTR_ERR(capi_class);
+	}
+
+	class_simple_device_add(capi_class, MKDEV(capi_major, 0), NULL, "capi");
 	devfs_mk_cdev(MKDEV(capi_major, 0), S_IFCHR | S_IRUSR | S_IWUSR,
 			"isdn/capi20");
 
 #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
 	if (capinc_tty_init() < 0) {
+		class_simple_device_remove(MKDEV(capi_major, 0));
+		class_simple_destroy(capi_class);
 		unregister_chrdev(capi_major, "capi20");
 		return -ENOMEM;
 	}
@@ -1514,6 +1527,8 @@ static void __exit capi_exit(void)
 {
 	proc_exit();
 
+	class_simple_device_remove(MKDEV(capi_major, 0));
+	class_simple_destroy(capi_class);
 	unregister_chrdev(capi_major, "capi20");
 	devfs_remove("isdn/capi20");
 
--- diff/drivers/isdn/capi/kcapi.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/isdn/capi/kcapi.c	2004-04-21 10:45:34.291490400 +0100
@@ -1,4 +1,4 @@
-/* $Id: kcapi.c,v 1.1.2.7 2004/03/16 08:01:47 armin Exp $
+/* $Id: kcapi.c,v 1.1.2.8 2004/03/26 19:57:20 armin Exp $
  * 
  * Kernel CAPI 2.0 Module
  * 
@@ -31,7 +31,7 @@
 #include <linux/b1lli.h>
 #endif
 
-static char *revision = "$Revision: 1.1.2.7 $";
+static char *revision = "$Revision: 1.1.2.8 $";
 
 /* ------------------------------------------------------------- */
 
@@ -63,13 +63,13 @@ static char capi_manufakturer[64] = "AVM
 LIST_HEAD(capi_drivers);
 rwlock_t capi_drivers_list_lock = RW_LOCK_UNLOCKED;
 
+static rwlock_t application_lock = RW_LOCK_UNLOCKED;
+static DECLARE_MUTEX(controller_sem);
+
 struct capi20_appl *capi_applications[CAPI_MAXAPPL];
 struct capi_ctr *capi_cards[CAPI_MAXCONTR];
 
 static int ncards;
-static struct sk_buff_head recv_queue;
-
-static struct work_struct tq_recv_notify;
 
 /* -------- controller ref counting -------------------------------------- */
 
@@ -174,7 +174,7 @@ static void notify_up(u32 contr)
 
 	for (applid = 1; applid <= CAPI_MAXAPPL; applid++) {
 		ap = get_capi_appl_by_nr(applid);
-		if (ap && ap->callback)
+		if (ap && ap->callback && !ap->release_in_progress)
 			ap->callback(KCI_CONTRUP, contr, &card->profile);
 	}
 }
@@ -192,7 +192,7 @@ static void notify_down(u32 contr)
 
 	for (applid = 1; applid <= CAPI_MAXAPPL; applid++) {
 		ap = get_capi_appl_by_nr(applid);
-		if (ap && ap->callback)
+		if (ap && ap->callback && !ap->release_in_progress)
 			ap->callback(KCI_CONTRDOWN, contr, 0);
 	}
 }
@@ -237,38 +237,39 @@ static int notify_push(unsigned int cmd,
 	
 /* -------- Receiver ------------------------------------------ */
 
-static void recv_handler(void *dummy)
+static void recv_handler(void *_ap)
 {
 	struct sk_buff *skb;
-	struct capi20_appl *ap;
+	struct capi20_appl *ap = (struct capi20_appl *) _ap;
 
-	while ((skb = skb_dequeue(&recv_queue)) != 0) {
-		ap = get_capi_appl_by_nr(CAPIMSG_APPID(skb->data));
-		if (!ap) {
-			printk(KERN_ERR "kcapi: recv_handler: applid %d ? (%s)\n",
-				CAPIMSG_APPID(skb->data), capi_message2str(skb->data));
-			kfree_skb(skb);
-			continue;
-		}
+	if ((!ap) || (ap->release_in_progress))
+		return;
 
+	down(&ap->recv_sem);
+	while ((skb = skb_dequeue(&ap->recv_queue))) {
 		if (CAPIMSG_CMD(skb->data) == CAPI_DATA_B3_IND)
 			ap->nrecvdatapkt++;
 		else
 			ap->nrecvctlpkt++;
+
 		ap->recv_message(ap, skb);
 	}
+	up(&ap->recv_sem);
 }
 
 void capi_ctr_handle_message(struct capi_ctr * card, u16 appl, struct sk_buff *skb)
 {
+	struct capi20_appl *ap;
 	int showctl = 0;
 	u8 cmd, subcmd;
+	unsigned long flags;
 
 	if (card->cardstate != CARD_RUNNING) {
 		printk(KERN_INFO "kcapi: controller %d not active, got: %s",
 		       card->cnr, capi_message2str(skb->data));
 		goto error;
 	}
+
 	cmd = CAPIMSG_COMMAND(skb->data);
         subcmd = CAPIMSG_SUBCOMMAND(skb->data);
 	if (cmd == CAPI_DATA_B3 && subcmd == CAPI_IND) {
@@ -293,8 +294,19 @@ void capi_ctr_handle_message(struct capi
 		}
 
 	}
-	skb_queue_tail(&recv_queue, skb);
-	schedule_work(&tq_recv_notify);
+
+	read_lock_irqsave(&application_lock, flags);
+	ap = get_capi_appl_by_nr(CAPIMSG_APPID(skb->data));
+	if ((!ap) || (ap->release_in_progress)) {
+		read_unlock_irqrestore(&application_lock, flags);
+		printk(KERN_ERR "kcapi: handle_message: applid %d state released (%s)\n",
+			CAPIMSG_APPID(skb->data), capi_message2str(skb->data));
+		goto error;
+	}
+	skb_queue_tail(&ap->recv_queue, skb);
+	schedule_work(&ap->recv_work);
+	read_unlock_irqrestore(&application_lock, flags);
+
 	return;
 
 error:
@@ -310,11 +322,13 @@ void capi_ctr_ready(struct capi_ctr * ca
 
 	card->cardstate = CARD_RUNNING;
 
+	down(&controller_sem);
 	for (appl = 1; appl <= CAPI_MAXAPPL; appl++) {
 		ap = get_capi_appl_by_nr(appl);
-		if (!ap) continue;
+		if (!ap || ap->release_in_progress) continue;
 		register_appl(card, appl, &ap->rparam);
 	}
+	up(&controller_sem);
 
         printk(KERN_NOTICE "kcapi: card %d \"%s\" ready.\n",
 	       card->cnr, card->name);
@@ -342,7 +356,7 @@ void capi_ctr_reseted(struct capi_ctr * 
 
 	for (appl = 1; appl <= CAPI_MAXAPPL; appl++) {
 		struct capi20_appl *ap = get_capi_appl_by_nr(appl);
-		if (!ap)
+		if (!ap || ap->release_in_progress)
 			continue;
 
 		capi_ctr_put(card);
@@ -382,16 +396,21 @@ attach_capi_ctr(struct capi_ctr *card)
 {
 	int i;
 
+	down(&controller_sem);
+
 	for (i = 0; i < CAPI_MAXCONTR; i++) {
 		if (capi_cards[i] == NULL)
 			break;
 	}
 	if (i == CAPI_MAXCONTR) {
+		up(&controller_sem);
 		printk(KERN_ERR "kcapi: out of controller slots\n");
 	   	return -EBUSY;
 	}
 	capi_cards[i] = card;
 
+	up(&controller_sem);
+
 	card->nrecvctlpkt = 0;
 	card->nrecvdatapkt = 0;
 	card->nsentctlpkt = 0;
@@ -480,18 +499,23 @@ u16 capi20_register(struct capi20_appl *
 {
 	int i;
 	u16 applid;
+	unsigned long flags;
 
 	DBG("");
 
 	if (ap->rparam.datablklen < 128)
 		return CAPI_LOGBLKSIZETOSMALL;
 
+	write_lock_irqsave(&application_lock, flags);
+
 	for (applid = 1; applid <= CAPI_MAXAPPL; applid++) {
 		if (capi_applications[applid - 1] == NULL)
 			break;
 	}
-	if (applid > CAPI_MAXAPPL)
+	if (applid > CAPI_MAXAPPL) {
+		write_unlock_irqrestore(&application_lock, flags);
 		return CAPI_TOOMANYAPPLS;
+	}
 
 	ap->applid = applid;
 	capi_applications[applid - 1] = ap;
@@ -501,12 +525,21 @@ u16 capi20_register(struct capi20_appl *
 	ap->nsentctlpkt = 0;
 	ap->nsentdatapkt = 0;
 	ap->callback = 0;
+	init_MUTEX(&ap->recv_sem);
+	skb_queue_head_init(&ap->recv_queue);
+	INIT_WORK(&ap->recv_work, recv_handler, (void *)ap);
+	ap->release_in_progress = 0;
+
+	write_unlock_irqrestore(&application_lock, flags);
 	
+	down(&controller_sem);
 	for (i = 0; i < CAPI_MAXCONTR; i++) {
 		if (!capi_cards[i] || capi_cards[i]->cardstate != CARD_RUNNING)
 			continue;
 		register_appl(capi_cards[i], applid, &ap->rparam);
 	}
+	up(&controller_sem);
+
 	if (showcapimsgs & 1) {
 		printk(KERN_DEBUG "kcapi: appl %d up\n", applid);
 	}
@@ -519,15 +552,26 @@ EXPORT_SYMBOL(capi20_register);
 u16 capi20_release(struct capi20_appl *ap)
 {
 	int i;
+	unsigned long flags;
 
 	DBG("applid %#x", ap->applid);
 
+	write_lock_irqsave(&application_lock, flags);
+	ap->release_in_progress = 1;
+	capi_applications[ap->applid - 1] = NULL;
+	write_unlock_irqrestore(&application_lock, flags);
+
+	down(&controller_sem);
 	for (i = 0; i < CAPI_MAXCONTR; i++) {
 		if (!capi_cards[i] || capi_cards[i]->cardstate != CARD_RUNNING)
 			continue;
 		release_appl(capi_cards[i], ap->applid);
 	}
-	capi_applications[ap->applid - 1] = NULL;
+	up(&controller_sem);
+
+	flush_scheduled_work();
+	skb_queue_purge(&ap->recv_queue);
+
 	if (showcapimsgs & 1) {
 		printk(KERN_DEBUG "kcapi: appl %d down\n", ap->applid);
 	}
@@ -547,7 +591,7 @@ u16 capi20_put_message(struct capi20_app
  
 	if (ncards == 0)
 		return CAPI_REGNOTINSTALLED;
-	if (ap->applid == 0)
+	if ((ap->applid == 0) || ap->release_in_progress)
 		return CAPI_ILLAPPNR;
 	if (skb->len < 12
 	    || !capi_cmd_valid(CAPIMSG_COMMAND(skb->data))
@@ -925,10 +969,6 @@ static int __init kcapi_init(void)
 	char *p;
 	char rev[32];
 
-	skb_queue_head_init(&recv_queue);
-
-	INIT_WORK(&tq_recv_notify, recv_handler, NULL);
-
         kcapi_proc_init();
 
 	if ((p = strchr(revision, ':')) != 0 && p[1]) {
--- diff/drivers/isdn/hisax/hfc_usb.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/isdn/hisax/hfc_usb.c	2004-04-21 10:45:34.292490248 +0100
@@ -262,7 +262,7 @@ static void ctrl_start_transfer(hfcusb_d
 		hfc->ctrl_urb->transfer_buffer_length = 0;
 		hfc->ctrl_write.wIndex = hfc->ctrl_buff[hfc->ctrl_out_idx].hfc_reg;
 		hfc->ctrl_write.wValue = hfc->ctrl_buff[hfc->ctrl_out_idx].reg_val;
-		err = usb_submit_urb(hfc->ctrl_urb, GFP_KERNEL);	/* start transfer */
+		err = usb_submit_urb(hfc->ctrl_urb, GFP_ATOMIC);	/* start transfer */
 		printk(KERN_DEBUG "ctrl_start_transfer: submit %d\n", err);
 	}
 }				/* ctrl_start_transfer */
@@ -754,7 +754,7 @@ static void tx_iso_complete(struct urb *
 			}
         }
 
-		errcode = usb_submit_urb(urb, GFP_KERNEL);
+		errcode = usb_submit_urb(urb, GFP_ATOMIC);
 		if(errcode < 0)
 		{
 			printk(KERN_INFO "HFC-USB: error submitting ISO URB: %i \n",  errcode);
@@ -821,7 +821,7 @@ static void rx_iso_complete(struct urb *
 		fill_isoc_urb(urb, fifo->hfc->dev, fifo->pipe,context_iso_urb->buffer, num_isoc_packets,
 			fifo->usb_packet_maxlen, fifo->intervall, rx_iso_complete, urb->context);
 
-		errcode = usb_submit_urb(urb, GFP_KERNEL);
+		errcode = usb_submit_urb(urb, GFP_ATOMIC);
 		if(errcode < 0)
 		{
 			printk(KERN_INFO "HFC-USB: error submitting ISO URB: %i \n",  errcode);
@@ -1345,7 +1345,7 @@ char *conf_str[]=
 /*************************************************/
 /* function called to probe a new plugged device */
 /*************************************************/
-static int __devinit hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
+static int hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
 {
 	struct usb_device *dev= interface_to_usbdev(intf);
 	hfcusb_data *context;
--- diff/drivers/isdn/hisax/st5481_b.c	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/isdn/hisax/st5481_b.c	2004-04-21 10:45:34.292490248 +0100
@@ -119,7 +119,7 @@ static void usb_b_out(struct st5481_bcs 
 
 	DBG_ISO_PACKET(0x200,urb);
 
-	SUBMIT_URB(urb, GFP_KERNEL);
+	SUBMIT_URB(urb, GFP_NOIO);
 }
 
 /*
@@ -171,8 +171,8 @@ static void usb_b_out_complete(struct ur
 	buf_nr = get_buf_nr(b_out->urb, urb);
 	test_and_clear_bit(buf_nr, &b_out->busy);
 
-	if (urb->status < 0) {
-		if (urb->status != -ENOENT) {
+	if (unlikely(urb->status < 0)) {
+		if (urb->status != -ENOENT && urb->status != -ESHUTDOWN) {
 			WARN("urb status %d",urb->status);
 			if (b_out->busy == 0) {
 				st5481_usb_pipe_reset(adapter, (bcs->channel+1)*2 | USB_DIR_OUT, NULL, NULL);
--- diff/drivers/isdn/hisax/st5481_d.c	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/isdn/hisax/st5481_d.c	2004-04-21 10:45:34.293490096 +0100
@@ -381,8 +381,8 @@ static void usb_d_out_complete(struct ur
 	buf_nr = get_buf_nr(d_out->urb, urb);
 	test_and_clear_bit(buf_nr, &d_out->busy);
 
-	if (urb->status < 0) {
-		if (urb->status != -ENOENT) {
+	if (unlikely(urb->status < 0)) {
+		if (urb->status != -ENOENT && urb->status != -ESHUTDOWN) {
 			WARN("urb status %d",urb->status);
 			if (d_out->busy == 0) {
 				st5481_usb_pipe_reset(adapter, EP_D_OUT | USB_DIR_OUT, fifo_reseted, adapter);
@@ -649,7 +649,7 @@ static void ph_disconnect(struct st5481_
 	st5481_usb_device_ctrl_msg(adapter, GPIO_OUT, adapter->leds, NULL, NULL);
 }
 
-static int __devinit st5481_setup_d_out(struct st5481_adapter *adapter)
+static int st5481_setup_d_out(struct st5481_adapter *adapter)
 {
 	struct usb_device *dev = adapter->usb_dev;
 	struct usb_host_interface *altsetting;
@@ -682,7 +682,7 @@ static void st5481_release_d_out(struct 
 	st5481_release_isocpipes(d_out->urb);
 }
 
-int __devinit st5481_setup_d(struct st5481_adapter *adapter)
+int st5481_setup_d(struct st5481_adapter *adapter)
 {
 	int retval;
 
--- diff/drivers/isdn/hisax/st5481_init.c	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/isdn/hisax/st5481_init.c	2004-04-21 10:45:34.293490096 +0100
@@ -58,8 +58,8 @@ static LIST_HEAD(adapter_list);
  * This function will be called when the adapter is plugged
  * into the USB bus.
  */
-static int __devinit probe_st5481(struct usb_interface *intf,
-				     const struct usb_device_id *id)
+static int probe_st5481(struct usb_interface *intf,
+			const struct usb_device_id *id)
 {
 	struct usb_device *dev = interface_to_usbdev(intf);
 	struct st5481_adapter *adapter;
--- diff/drivers/isdn/hisax/st5481_usb.c	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/isdn/hisax/st5481_usb.c	2004-04-21 10:45:34.294489944 +0100
@@ -48,7 +48,7 @@ static void usb_next_ctrl_msg(struct urb
 	// Prepare the URB
 	urb->dev = adapter->usb_dev;
 
-	SUBMIT_URB(urb, GFP_KERNEL);
+	SUBMIT_URB(urb, GFP_ATOMIC);
 }
 
 /*
@@ -129,8 +129,8 @@ static void usb_ctrl_complete(struct urb
 	struct st5481_ctrl *ctrl = &adapter->ctrl;
 	struct ctrl_msg *ctrl_msg;
 	
-	if (urb->status < 0) {
-		if (urb->status != -ENOENT) {
+	if (unlikely(urb->status < 0)) {
+		if (urb->status != -ENOENT && urb->status != -ESHUTDOWN) {
 			WARN("urb status %d",urb->status);
 		} else {
 			DBG(1,"urb killed");
@@ -239,7 +239,7 @@ exit:
  * initialization
  */
 
-int __devinit st5481_setup_usb(struct st5481_adapter *adapter)
+int st5481_setup_usb(struct st5481_adapter *adapter)
 {
 	struct usb_device *dev = adapter->usb_dev;
 	struct st5481_ctrl *ctrl = &adapter->ctrl;
@@ -341,7 +341,7 @@ void st5481_release_usb(struct st5481_ad
 /*
  *  Initialize the adapter.
  */
-void __devinit st5481_start(struct st5481_adapter *adapter)
+void st5481_start(struct st5481_adapter *adapter)
 {
 	static const u8 init_cmd_table[]={
 		SET_DEFAULT,0,
@@ -381,7 +381,7 @@ void __devinit st5481_start(struct st548
 /*
  * Reset the adapter to default values.
  */
-void __devexit st5481_stop(struct st5481_adapter *adapter)
+void st5481_stop(struct st5481_adapter *adapter)
 {
 	DBG(8,"");
 
@@ -392,7 +392,7 @@ void __devexit st5481_stop(struct st5481
  * isochronous USB  helpers
  */
 
-static void __devinit
+static void
 fill_isoc_urb(struct urb *urb, struct usb_device *dev,
 	      unsigned int pipe, void *buf, int num_packets, 
 	      int packet_size, usb_complete_t complete,
@@ -417,7 +417,7 @@ fill_isoc_urb(struct urb *urb, struct us
 	}
 }
 
-int __devinit
+int
 st5481_setup_isocpipes(struct urb* urb[2], struct usb_device *dev, 
 			   unsigned int pipe, int num_packets,
 			   int packet_size, int buf_size,
@@ -481,8 +481,8 @@ static void usb_in_complete(struct urb *
 	struct sk_buff *skb;
 	int len, count, status;
 
-	if (urb->status < 0) {
-		if (urb->status != -ENOENT) {
+	if (unlikely(urb->status < 0)) {
+		if (urb->status != -ENOENT && urb->status != -ESHUTDOWN) {
 			WARN("urb status %d",urb->status);
 		} else {
 			DBG(1,"urb killed");
@@ -529,10 +529,10 @@ static void usb_in_complete(struct urb *
 	urb->dev = in->adapter->usb_dev;
 	urb->actual_length = 0;
 
-	SUBMIT_URB(urb, GFP_KERNEL);
+	SUBMIT_URB(urb, GFP_ATOMIC);
 }
 
-int __devinit st5481_setup_in(struct st5481_in *in)
+int st5481_setup_in(struct st5481_in *in)
 {
 	struct usb_device *dev = in->adapter->usb_dev;
 	int retval;
--- diff/drivers/isdn/hysdn/hysdn_net.c	2003-08-26 10:00:52.000000000 +0100
+++ source/drivers/isdn/hysdn/hysdn_net.c	2004-04-21 10:45:34.294489944 +0100
@@ -53,8 +53,6 @@ struct net_local {
 	struct sk_buff *skbs[MAX_SKB_BUFFERS];	/* pointers to tx-skbs */
 	int in_idx, out_idx;	/* indexes to buffer ring */
 	int sk_count;		/* number of buffers currently in ring */
-
-	int is_open;		/* flag controlling module locking */
 };				/* net_local */
 
 
@@ -82,10 +80,6 @@ net_open(struct net_device *dev)
 	hysdn_card *card = dev->priv;
 	int i;
 
-	if (!((struct net_local *) dev)->is_open)
-		MOD_INC_USE_COUNT;	/* increment only if interface is actually down */
-	((struct net_local *) dev)->is_open = 1;	/* device actually open */
-
 	netif_start_queue(dev);	/* start tx-queueing */
 
 	/* Fill in the MAC-level header (if not already set) */
@@ -130,9 +124,6 @@ net_close(struct net_device *dev)
 
 	netif_stop_queue(dev);	/* disable queueing */
 
-	if (((struct net_local *) dev)->is_open)
-		MOD_DEC_USE_COUNT;	/* adjust module counter */
-	((struct net_local *) dev)->is_open = 0;
 	flush_tx_buffers((struct net_local *) dev);
 
 	return (0);		/* success */
--- diff/drivers/isdn/i4l/Kconfig	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/isdn/i4l/Kconfig	2004-04-21 10:45:34.294489944 +0100
@@ -31,6 +31,17 @@ config ISDN_MPP
 	  by bundling several ISDN-connections, using this protocol. See
 	  <file:Documentation/isdn/README.syncppp> for more information.
 
+config IPPP_FILTER
+	bool "Filtering for synchronous PPP"
+	depends on ISDN_PPP
+	help
+	  Say Y here if you want to be able to filter the packets passing over
+	  IPPP interfaces.  This allows you to control which packets count as
+	  activity (i.e. which packets will reset the idle timer or bring up
+	  a demand-dialled link) and which packets are to be dropped entirely.
+	  You need to say Y here if you wish to use the pass-filter and
+	  active-filter options to ipppd.
+
 config ISDN_PPP_BSDCOMP
 	tristate "Support BSD compression"
 	depends on ISDN_PPP
--- diff/drivers/isdn/i4l/isdn_net.h	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/isdn/i4l/isdn_net.h	2004-04-21 10:45:34.295489792 +0100
@@ -106,8 +106,8 @@ static __inline__ void isdn_net_add_to_b
 	spin_lock_irqsave(&nd->queue_lock, flags);
 
 	lp = nd->queue;
-//	printk(KERN_DEBUG __FUNCTION__": lp:%s(%p) nlp:%s(%p) last(%p)\n",
-//		lp->name, lp, nlp->name, nlp, lp->last); 
+//	printk(KERN_DEBUG "%s: lp:%s(%p) nlp:%s(%p) last(%p)\n",
+//		__FUNCTION__, lp->name, lp, nlp->name, nlp, lp->last);
 	nlp->last = lp->last;
 	lp->last->next = nlp;
 	lp->last = nlp;
@@ -127,8 +127,8 @@ static __inline__ void isdn_net_rm_from_
 	if (lp->master)
 		master_lp = (isdn_net_local *) lp->master->priv;
 
-//	printk(KERN_DEBUG __FUNCTION__": lp:%s(%p) mlp:%s(%p) last(%p) next(%p) mndq(%p)\n",
-//		lp->name, lp, master_lp->name, master_lp, lp->last, lp->next, master_lp->netdev->queue); 
+//	printk(KERN_DEBUG "%s: lp:%s(%p) mlp:%s(%p) last(%p) next(%p) mndq(%p)\n",
+//		__FUNCTION__, lp->name, lp, master_lp->name, master_lp, lp->last, lp->next, master_lp->netdev->queue);
 	spin_lock_irqsave(&master_lp->netdev->queue_lock, flags);
 	lp->last->next = lp->next;
 	lp->next->last = lp->last;
@@ -139,8 +139,8 @@ static __inline__ void isdn_net_rm_from_
 		}
 	}
 	lp->next = lp->last = lp;	/* (re)set own pointers */
-//	printk(KERN_DEBUG __FUNCTION__": mndq(%p)\n",
-//		master_lp->netdev->queue); 
+//	printk(KERN_DEBUG "%s: mndq(%p)\n",
+//		__FUNCTION__, master_lp->netdev->queue);
 	spin_unlock_irqrestore(&master_lp->netdev->queue_lock, flags);
 }
 
--- diff/drivers/isdn/i4l/isdn_ppp.c	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/isdn/i4l/isdn_ppp.c	2004-04-21 10:45:34.296489640 +0100
@@ -606,7 +606,7 @@ isdn_ppp_ioctl(int min, struct file *fil
 
 				if (copy_from_user(&uprog, (void *) arg, sizeof(uprog)))
 					return -EFAULT;
-				if (uprog.len > 0 && uprog.len < 65536) {
+				if (uprog.len > 0) {
 					len = uprog.len * sizeof(struct sock_filter);
 					code = kmalloc(len, GFP_KERNEL);
 					if (code == NULL)
@@ -1121,7 +1121,12 @@ isdn_ppp_push_higher(isdn_net_dev * net_
 	 * the filter instructions are constructed assuming
 	 * a four-byte PPP header on each packet (which is still present) */
 	skb_push(skb, 4);
-	skb->data[0] = 0;	/* indicate inbound */
+
+	{
+		u_int16_t *p = (u_int16_t *) skb->data;
+
+		*p = 0;	/* indicate inbound in DLT_LINUX_SLL */
+	}
 
 	if (is->pass_filter.filter
 	    && sk_run_filter(skb, is->pass_filter.filter,
@@ -1263,8 +1268,13 @@ isdn_ppp_xmit(struct sk_buff *skb, struc
 	 * the filter instructions are constructed assuming
 	 * a four-byte PPP header on each packet */
 	skb_push(skb, 4);
-	skb->data[0] = 1;	/* indicate outbound */
-	*(u_int16_t *)(skb->data + 2) = htons(proto);
+
+	{
+		u_int16_t *p = (u_int16_t *) skb->data;
+
+		*p++ = htons(4); /* indicate outbound in DLT_LINUX_SLL */
+		*p   = htons(proto);
+	}
 
 	if (ipt->pass_filter.filter 
 	    && sk_run_filter(skb, ipt->pass_filter.filter,
@@ -1457,8 +1467,13 @@ int isdn_ppp_autodial_filter(struct sk_b
 	 * earlier.
 	 */
 	skb_pull(skb, IPPP_MAX_HEADER - 4);
-	skb->data[0] = 1;	/* indicate outbound */
-	*(u_int16_t *)(skb->data + 2) = htons(proto);
+
+	{
+		u_int16_t *p = (u_int16_t *) skb->data;
+
+		*p++ = htons(4);	/* indicate outbound in DLT_LINUX_SLL */
+		*p   = htons(proto);
+	}
 	
 	drop |= is->pass_filter.filter
 	        && sk_run_filter(skb, is->pass_filter.filter,
--- diff/drivers/isdn/sc/Kconfig	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/isdn/sc/Kconfig	2004-04-21 10:45:34.296489640 +0100
@@ -8,6 +8,5 @@ config ISDN_DRV_SC
 	  This enables support for the Spellcaster BRI ISDN boards.  This
 	  driver currently builds only in a modularized version.
 	  To build it, choose M here: the module will be called sc.
-	  See <file:Documentation/isdn/README.sc> and
-	  <http://www.spellcast.com/> for more information.
+	  See <file:Documentation/isdn/README.sc> for more information.
 
--- diff/drivers/isdn/sc/ioctl.c	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/isdn/sc/ioctl.c	2004-04-21 10:45:34.297489488 +0100
@@ -30,6 +30,17 @@ int GetStatus(int card, boardInfo *);
  */
 int sc_ioctl(int card, scs_ioctl *data)
 {
+	int		status;
+	RspMessage	*rcvmsg;
+	char		*spid;
+	char		*dn;
+	char		switchtype;
+	char		speed;
+
+	rcvmsg = kmalloc(sizeof(RspMessage), GFP_KERNEL);
+	if (!rcvmsg)
+		return -ENOMEM;
+
 	switch(data->command) {
 	case SCIOCRESET:	/* Perform a hard reset of the adapter */
 	{
@@ -41,26 +52,37 @@ int sc_ioctl(int card, scs_ioctl *data)
 
 	case SCIOCLOAD:
 	{
-		RspMessage	rcvmsg;
-		char		srec[SCIOC_SRECSIZE];
-		int		status;
+		char *srec;
 
+		srec = kmalloc(SCIOC_SRECSIZE, GFP_KERNEL);
+		if (!srec) {
+			kfree(rcvmsg);
+			return -ENOMEM;
+		}
 		pr_debug("%s: SCIOLOAD: ioctl received\n",
 				sc_adapter[card]->devicename);
 		if(sc_adapter[card]->EngineUp) {
 			pr_debug("%s: SCIOCLOAD: command failed, LoadProc while engine running.\n",
 				sc_adapter[card]->devicename);
+			kfree(rcvmsg);
+			kfree(srec);
 			return -1;
 		}
 
 		/*
 		 * Get the SRec from user space
 		 */
-		if (copy_from_user(srec, (char *) data->dataptr, sizeof(srec)))
+		if (copy_from_user(srec, (char *) data->dataptr, sizeof(srec))) {
+			kfree(rcvmsg);
+			kfree(srec);
 			return -EFAULT;
+		}
 
 		status = send_and_receive(card, CMPID, cmReqType2, cmReqClass0, cmReqLoadProc,
-				0, sizeof(srec), srec, &rcvmsg, SAR_TIMEOUT);
+				0, sizeof(srec), srec, rcvmsg, SAR_TIMEOUT);
+		kfree(rcvmsg);
+		kfree(srec);
+
 		if(status) {
 			pr_debug("%s: SCIOCLOAD: command failed, status = %d\n", 
 				sc_adapter[card]->devicename, status);
@@ -90,10 +112,6 @@ int sc_ioctl(int card, scs_ioctl *data)
 
 	case SCIOCSETSWITCH:
 	{
-		RspMessage	rcvmsg;
-		char		switchtype;
-		int 		status;
-
 		pr_debug("%s: SCIOSETSWITCH: ioctl received\n",
 				sc_adapter[card]->devicename);
 
@@ -101,32 +119,32 @@ int sc_ioctl(int card, scs_ioctl *data)
 		 * Get the switch type from user space
 		 */
 		if (copy_from_user(&switchtype, (char *)data->dataptr,
-				   sizeof(char)))
+				   sizeof(char))) {
+			kfree(rcvmsg);
 			return -EFAULT;
+		}
 
 		pr_debug("%s: SCIOCSETSWITCH: setting switch type to %d\n",
 			sc_adapter[card]->devicename,
 			switchtype);
 		status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, ceReqCallSetSwitchType,
-						0, sizeof(char),&switchtype,&rcvmsg, SAR_TIMEOUT);
-		if(!status && !rcvmsg.rsp_status) {
+						0, sizeof(char),&switchtype, rcvmsg, SAR_TIMEOUT);
+		if(!status && !(rcvmsg->rsp_status)) {
 			pr_debug("%s: SCIOCSETSWITCH: command successful\n",
 				sc_adapter[card]->devicename);
+			kfree(rcvmsg);
 			return 0;
 		}
 		else {
 			pr_debug("%s: SCIOCSETSWITCH: command failed (status = %d)\n",
 				sc_adapter[card]->devicename, status);
+			kfree(rcvmsg);
 			return status;
 		}
 	}
 		
 	case SCIOCGETSWITCH:
 	{
-		RspMessage 	rcvmsg;
-		char		switchtype;
-		int		status;
-
 		pr_debug("%s: SCIOGETSWITCH: ioctl received\n",
 				sc_adapter[card]->devicename);
 
@@ -134,43 +152,48 @@ int sc_ioctl(int card, scs_ioctl *data)
 		 * Get the switch type from the board
 		 */
 		status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, 
-			ceReqCallGetSwitchType, 0, 0, 0, &rcvmsg, SAR_TIMEOUT);
-		if (!status && !rcvmsg.rsp_status) {
+			ceReqCallGetSwitchType, 0, 0, 0, rcvmsg, SAR_TIMEOUT);
+		if (!status && !(rcvmsg->rsp_status)) {
 			pr_debug("%s: SCIOCGETSWITCH: command successful\n",
 					sc_adapter[card]->devicename);
 		}
 		else {
 			pr_debug("%s: SCIOCGETSWITCH: command failed (status = %d)\n",
 				sc_adapter[card]->devicename, status);
+			kfree(rcvmsg);
 			return status;
 		}
 
-		switchtype = rcvmsg.msg_data.byte_array[0];
+		switchtype = rcvmsg->msg_data.byte_array[0];
 
 		/*
 		 * Package the switch type and send to user space
 		 */
 		if (copy_to_user((char *)data->dataptr, &switchtype,
-				 sizeof(char)))
+				 sizeof(char))) {
+			kfree(rcvmsg);
 			return -EFAULT;
+		}
 
+		kfree(rcvmsg);
 		return 0;
 	}
 
 	case SCIOCGETSPID:
 	{
-		RspMessage	rcvmsg;
-		char		spid[SCIOC_SPIDSIZE];
-		int		status;
-
 		pr_debug("%s: SCIOGETSPID: ioctl received\n",
 				sc_adapter[card]->devicename);
 
+		spid = kmalloc(SCIOC_SPIDSIZE, GFP_KERNEL);
+		if(!spid) {
+			kfree(rcvmsg);
+			return -ENOMEM;
+		}
 		/*
 		 * Get the spid from the board
 		 */
 		status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, ceReqCallGetSPID,
-					data->channel, 0, 0, &rcvmsg, SAR_TIMEOUT);
+					data->channel, 0, 0, rcvmsg, SAR_TIMEOUT);
 		if (!status) {
 			pr_debug("%s: SCIOCGETSPID: command successful\n",
 					sc_adapter[card]->devicename);
@@ -178,57 +201,67 @@ int sc_ioctl(int card, scs_ioctl *data)
 		else {
 			pr_debug("%s: SCIOCGETSPID: command failed (status = %d)\n",
 				sc_adapter[card]->devicename, status);
+			kfree(rcvmsg);
 			return status;
 		}
-		strcpy(spid, rcvmsg.msg_data.byte_array);
+		strcpy(spid, rcvmsg->msg_data.byte_array);
 
 		/*
 		 * Package the switch type and send to user space
 		 */
-		if (copy_to_user((char *)data->dataptr, spid, sizeof(spid)))
+		if (copy_to_user((char *)data->dataptr, spid, SCIOC_SPIDSIZE)) {
+			kfree(spid);
+			kfree(rcvmsg);
 			return -EFAULT;
+		}
 
+		kfree(spid);
+		kfree(rcvmsg);
 		return 0;
 	}	
 
 	case SCIOCSETSPID:
 	{
-		RspMessage	rcvmsg;
-		char		spid[SCIOC_SPIDSIZE];
-		int 		status;
-
 		pr_debug("%s: DCBIOSETSPID: ioctl received\n",
 				sc_adapter[card]->devicename);
 
+		spid = kmalloc(SCIOC_SPIDSIZE, GFP_KERNEL);
+		if(!spid) {
+			kfree(rcvmsg);
+			return -ENOMEM;
+		}
+
 		/*
 		 * Get the spid from user space
 		 */
-		if (copy_from_user(spid, (char *) data->dataptr, sizeof(spid)))
+		if (copy_from_user(spid, (char *) data->dataptr, SCIOC_SPIDSIZE)) {
+			kfree(rcvmsg);
 			return -EFAULT;
+		}
 
 		pr_debug("%s: SCIOCSETSPID: setting channel %d spid to %s\n", 
 			sc_adapter[card]->devicename, data->channel, spid);
 		status = send_and_receive(card, CEPID, ceReqTypeCall, 
 			ceReqClass0, ceReqCallSetSPID, data->channel, 
-			strlen(spid), spid, &rcvmsg, SAR_TIMEOUT);
-		if(!status && !rcvmsg.rsp_status) {
+			strlen(spid), spid, rcvmsg, SAR_TIMEOUT);
+		if(!status && !(rcvmsg->rsp_status)) {
 			pr_debug("%s: SCIOCSETSPID: command successful\n", 
 				sc_adapter[card]->devicename);
+			kfree(rcvmsg);
+			kfree(spid);
 			return 0;
 		}
 		else {
 			pr_debug("%s: SCIOCSETSPID: command failed (status = %d)\n",
 				sc_adapter[card]->devicename, status);
+			kfree(rcvmsg);
+			kfree(spid);
 			return status;
 		}
 	}
 
 	case SCIOCGETDN:
 	{
-		RspMessage	rcvmsg;
-		char		dn[SCIOC_DNSIZE];
-		int		status;
-
 		pr_debug("%s: SCIOGETDN: ioctl received\n",
 				sc_adapter[card]->devicename);
 
@@ -236,7 +269,7 @@ int sc_ioctl(int card, scs_ioctl *data)
 		 * Get the dn from the board
 		 */
 		status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, ceReqCallGetMyNumber,
-					data->channel, 0, 0, &rcvmsg, SAR_TIMEOUT);
+					data->channel, 0, 0, rcvmsg, SAR_TIMEOUT);
 		if (!status) {
 			pr_debug("%s: SCIOCGETDN: command successful\n",
 					sc_adapter[card]->devicename);
@@ -244,48 +277,65 @@ int sc_ioctl(int card, scs_ioctl *data)
 		else {
 			pr_debug("%s: SCIOCGETDN: command failed (status = %d)\n",
 				sc_adapter[card]->devicename, status);
+			kfree(rcvmsg);
 			return status;
 		}
 
-		strcpy(dn, rcvmsg.msg_data.byte_array);
+		dn = kmalloc(SCIOC_DNSIZE, GFP_KERNEL);
+		if (!dn) {
+			kfree(rcvmsg);
+			return -ENOMEM;
+		}
+		strcpy(dn, rcvmsg->msg_data.byte_array);
+		kfree(rcvmsg);
 
 		/*
 		 * Package the dn and send to user space
 		 */
-		if (copy_to_user((char *)data->dataptr, dn, sizeof(dn)))
+		if (copy_to_user((char *)data->dataptr, dn, SCIOC_DNSIZE)) {
+			kfree(dn);
 			return -EFAULT;
-
+		}
+		kfree(dn);
 		return 0;
 	}	
 
 	case SCIOCSETDN:
 	{
-		RspMessage	rcvmsg;
-		char		dn[SCIOC_DNSIZE];
-		int 		status;
-
 		pr_debug("%s: SCIOSETDN: ioctl received\n",
 				sc_adapter[card]->devicename);
 
+		dn = kmalloc(SCIOC_DNSIZE, GFP_KERNEL);
+		if (!dn) {
+			kfree(rcvmsg);
+			return -ENOMEM;
+		}
 		/*
 		 * Get the spid from user space
 		 */
-		if (copy_from_user(dn, (char *)data->dataptr, sizeof(dn)))
+		if (copy_from_user(dn, (char *)data->dataptr, SCIOC_DNSIZE)) {
+			kfree(rcvmsg);
+			kfree(dn);
 			return -EFAULT;
+		}
 
 		pr_debug("%s: SCIOCSETDN: setting channel %d dn to %s\n", 
 			sc_adapter[card]->devicename, data->channel, dn);
 		status = send_and_receive(card, CEPID, ceReqTypeCall, 
 			ceReqClass0, ceReqCallSetMyNumber, data->channel, 
-			strlen(dn),dn,&rcvmsg, SAR_TIMEOUT);
-		if(!status && !rcvmsg.rsp_status) {
+			strlen(dn),dn,rcvmsg, SAR_TIMEOUT);
+		if(!status && !(rcvmsg->rsp_status)) {
 			pr_debug("%s: SCIOCSETDN: command successful\n", 
 				sc_adapter[card]->devicename);
+			kfree(rcvmsg);
+			kfree(dn);
 			return 0;
 		}
 		else {
 			pr_debug("%s: SCIOCSETDN: command failed (status = %d)\n",
 				sc_adapter[card]->devicename, status);
+			kfree(rcvmsg);
+			kfree(dn);
 			return status;
 		}
 	}
@@ -302,25 +352,32 @@ int sc_ioctl(int card, scs_ioctl *data)
 
 	case SCIOCSTAT:
 	{
-		boardInfo bi;
+		boardInfo *bi;
 
 		pr_debug("%s: SCIOSTAT: ioctl received\n",
 				sc_adapter[card]->devicename);
-		GetStatus(card, &bi);
-		
-		if (copy_to_user((boardInfo *)data->dataptr, &bi,
-				 sizeof(boardInfo)))
+
+		bi = kmalloc (sizeof(boardInfo), GFP_KERNEL);
+		if (!bi) {
+			kfree(rcvmsg);
+			return -ENOMEM;
+		}
+
+		kfree(rcvmsg);
+		GetStatus(card, bi);
+
+		if (copy_to_user((boardInfo *)data->dataptr, bi,
+				 sizeof(boardInfo))) {
+			kfree(bi);
 			return -EFAULT;
+		}
 
+		kfree(bi);
 		return 0;
 	}
 
 	case SCIOCGETSPEED:
 	{
-		RspMessage	rcvmsg;
-		char		speed;
-		int		status;
-
 		pr_debug("%s: SCIOGETSPEED: ioctl received\n",
 				sc_adapter[card]->devicename);
 
@@ -328,22 +385,26 @@ int sc_ioctl(int card, scs_ioctl *data)
 		 * Get the speed from the board
 		 */
 		status = send_and_receive(card, CEPID, ceReqTypeCall, ceReqClass0, 
-			ceReqCallGetCallType, data->channel, 0, 0, &rcvmsg, SAR_TIMEOUT);
-		if (!status && !rcvmsg.rsp_status) {
+			ceReqCallGetCallType, data->channel, 0, 0, rcvmsg, SAR_TIMEOUT);
+		if (!status && !(rcvmsg->rsp_status)) {
 			pr_debug("%s: SCIOCGETSPEED: command successful\n",
 				sc_adapter[card]->devicename);
 		}
 		else {
 			pr_debug("%s: SCIOCGETSPEED: command failed (status = %d)\n",
 				sc_adapter[card]->devicename, status);
+			kfree(rcvmsg);
 			return status;
 		}
 
-		speed = rcvmsg.msg_data.byte_array[0];
+		speed = rcvmsg->msg_data.byte_array[0];
+
+		kfree(rcvmsg);
 
 		/*
 		 * Package the switch type and send to user space
 		 */
+
 		if (copy_to_user((char *) data->dataptr, &speed, sizeof(char)))
 			return -EFAULT;
 
@@ -361,9 +422,11 @@ int sc_ioctl(int card, scs_ioctl *data)
 		break;
 
 	default:
+		kfree(rcvmsg);
 		return -1;
 	}
 
+	kfree(rcvmsg);
 	return 0;
 }
 
--- diff/drivers/macintosh/macserial.c	2004-03-11 10:20:24.000000000 +0000
+++ source/drivers/macintosh/macserial.c	2004-04-21 10:45:34.299489184 +0100
@@ -1790,11 +1790,8 @@ static int rs_tiocmget(struct tty_struct
 	if (serial_paranoia_check(info, tty->name, __FUNCTION__))
 		return -ENODEV;
 
-	if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&
-	    (cmd != TIOCSERCONFIG) && (cmd != TIOCSERGSTRUCT)) {
-		if (tty->flags & (1 << TTY_IO_ERROR))
-		    return -EIO;
-	}
+	if (tty->flags & (1 << TTY_IO_ERROR))
+		return -EIO;
 
 	spin_lock_irqsave(&info->lock, flags);
 	control = info->curregs[5];
@@ -1820,11 +1817,8 @@ static int rs_tiocmset(struct tty_struct
 	if (serial_paranoia_check(info, tty->name, __FUNCTION__))
 		return -ENODEV;
 
-	if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&
-	    (cmd != TIOCSERCONFIG) && (cmd != TIOCSERGSTRUCT)) {
-		if (tty->flags & (1 << TTY_IO_ERROR))
-		    return -EIO;
-	}
+	if (tty->flags & (1 << TTY_IO_ERROR))
+		return -EIO;
 
 	spin_lock_irqsave(&info->lock, flags);
 	if (set & TIOCM_RTS)
--- diff/drivers/md/dm-crypt.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/md/dm-crypt.c	2004-04-21 10:45:34.299489184 +0100
@@ -668,7 +668,7 @@ static int crypt_map(struct dm_target *t
 
 		/* out of memory -> run queues */
 		if (remaining)
-			blk_run_queues();
+			blk_congestion_wait(bio_data_dir(clone), HZ/100);
 	}
 
 	/* drop reference, clones could have returned before we reach this */
--- diff/drivers/md/dm-ioctl.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/md/dm-ioctl.c	2004-04-21 10:45:34.300489032 +0100
@@ -800,7 +800,7 @@ static void retrieve_status(struct dm_ta
 		struct dm_target *ti = dm_table_get_target(table, i);
 
 		remaining = len - (outptr - outbuf);
-		if (remaining < sizeof(struct dm_target_spec)) {
+		if (remaining <= sizeof(struct dm_target_spec)) {
 			param->flags |= DM_BUFFER_FULL_FLAG;
 			break;
 		}
@@ -815,6 +815,10 @@ static void retrieve_status(struct dm_ta
 
 		outptr += sizeof(struct dm_target_spec);
 		remaining = len - (outptr - outbuf);
+		if (remaining <= 0) {
+			param->flags |= DM_BUFFER_FULL_FLAG;
+			break;
+		}
 
 		/* Get the status/table string from the target driver */
 		if (ti->type->status) {
@@ -828,7 +832,7 @@ static void retrieve_status(struct dm_ta
 		outptr += strlen(outptr) + 1;
 		used = param->data_start + (outptr - outbuf);
 
-		align_ptr(outptr);
+		outptr = align_ptr(outptr);
 		spec->next = outptr - outbuf;
 	}
 
--- diff/drivers/md/dm-stripe.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/md/dm-stripe.c	2004-04-21 10:45:34.300489032 +0100
@@ -187,24 +187,24 @@ static int stripe_status(struct dm_targe
 			 status_type_t type, char *result, unsigned int maxlen)
 {
 	struct stripe_c *sc = (struct stripe_c *) ti->private;
-	int offset;
+	unsigned int sz = 0;
 	unsigned int i;
 	char buffer[32];
 
+#define EMIT(x...) sz += ((sz >= maxlen) ? \
+			  0 : scnprintf(result + sz, maxlen - sz, x))
+
 	switch (type) {
 	case STATUSTYPE_INFO:
 		result[0] = '\0';
 		break;
 
 	case STATUSTYPE_TABLE:
-		offset = scnprintf(result, maxlen, "%d " SECTOR_FORMAT,
-				  sc->stripes, sc->chunk_mask + 1);
+		EMIT("%d " SECTOR_FORMAT, sc->stripes, sc->chunk_mask + 1);
 		for (i = 0; i < sc->stripes; i++) {
 			format_dev_t(buffer, sc->stripe[i].dev->bdev->bd_dev);
-			offset +=
-			    scnprintf(result + offset, maxlen - offset,
-				     " %s " SECTOR_FORMAT, buffer,
-				     sc->stripe[i].physical_start);
+			EMIT(" %s " SECTOR_FORMAT, buffer,
+			     sc->stripe[i].physical_start);
 		}
 		break;
 	}
--- diff/drivers/md/dm-table.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/md/dm-table.c	2004-04-21 10:45:34.301488880 +0100
@@ -279,6 +279,9 @@ void dm_table_get(struct dm_table *t)
 
 void dm_table_put(struct dm_table *t)
 {
+	if (!t)
+		return;
+
 	if (atomic_dec_and_test(&t->holders))
 		table_destroy(t);
 }
@@ -660,12 +663,14 @@ int dm_table_add_target(struct dm_table 
 
 	if (!len) {
 		tgt->error = "zero-length target";
+		DMERR(": %s\n", tgt->error);
 		return -EINVAL;
 	}
 
 	tgt->type = dm_get_target_type(type);
 	if (!tgt->type) {
 		tgt->error = "unknown target type";
+		DMERR(": %s\n", tgt->error);
 		return -EINVAL;
 	}
 
@@ -702,7 +707,7 @@ int dm_table_add_target(struct dm_table 
 	return 0;
 
  bad:
-	printk(KERN_ERR DM_NAME ": %s\n", tgt->error);
+	DMERR(": %s\n", tgt->error);
 	dm_put_target_type(tgt->type);
 	return r;
 }
@@ -867,9 +872,39 @@ void dm_table_resume_targets(struct dm_t
 	}
 }
 
+int dm_table_any_congested(struct dm_table *t, int bdi_bits)
+{
+	struct list_head *d, *devices;
+	int r = 0;
+
+	devices = dm_table_get_devices(t);
+	for (d = devices->next; d != devices; d = d->next) {
+		struct dm_dev *dd = list_entry(d, struct dm_dev, list);
+		request_queue_t *q = bdev_get_queue(dd->bdev);
+		r |= bdi_congested(&q->backing_dev_info, bdi_bits);
+	}
+
+	return r;
+}
+
+void dm_table_unplug_all(struct dm_table *t)
+{
+	struct list_head *d, *devices = dm_table_get_devices(t);
+
+	for (d = devices->next; d != devices; d = d->next) {
+		struct dm_dev *dd = list_entry(d, struct dm_dev, list);
+		request_queue_t *q = bdev_get_queue(dd->bdev);
+
+		if (q->unplug_fn)
+			q->unplug_fn(q);
+	}
+}
 
 EXPORT_SYMBOL(dm_vcalloc);
 EXPORT_SYMBOL(dm_get_device);
 EXPORT_SYMBOL(dm_put_device);
 EXPORT_SYMBOL(dm_table_event);
 EXPORT_SYMBOL(dm_table_get_mode);
+EXPORT_SYMBOL(dm_table_put);
+EXPORT_SYMBOL(dm_table_get);
+EXPORT_SYMBOL(dm_table_unplug_all);
--- diff/drivers/md/dm.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/md/dm.c	2004-04-21 10:45:34.302488728 +0100
@@ -49,6 +49,7 @@ struct target_io {
 
 struct mapped_device {
 	struct rw_semaphore lock;
+	rwlock_t map_lock;
 	atomic_t holders;
 
 	unsigned long flags;
@@ -237,6 +238,24 @@ static int queue_io(struct mapped_device
 	return 0;		/* deferred successfully */
 }
 
+/*
+ * Everyone (including functions in this file), should use this
+ * function to access the md->map field, and make sure they call
+ * dm_table_put() when finished.
+ */
+struct dm_table *dm_get_table(struct mapped_device *md)
+{
+	struct dm_table *t;
+
+	read_lock(&md->map_lock);
+	t = md->map;
+	if (t)
+		dm_table_get(t);
+	read_unlock(&md->map_lock);
+
+	return t;
+}
+
 /*-----------------------------------------------------------------
  * CRUD START:
  *   A more elegant soln is in the works that uses the queue
@@ -275,6 +294,9 @@ static int clone_endio(struct bio *bio, 
 	if (bio->bi_size)
 		return 1;
 
+	if (!bio_flagged(bio, BIO_UPTODATE) && !error)
+		error = -EIO;
+
 	if (endio) {
 		r = endio(tio->ti, bio, error, &tio->info);
 		if (r < 0)
@@ -345,6 +367,7 @@ static void __map_bio(struct dm_target *
 
 struct clone_info {
 	struct mapped_device *md;
+	struct dm_table *map;
 	struct bio *bio;
 	struct dm_io *io;
 	sector_t sector;
@@ -398,7 +421,7 @@ static struct bio *clone_bio(struct bio 
 static void __clone_and_map(struct clone_info *ci)
 {
 	struct bio *clone, *bio = ci->bio;
-	struct dm_target *ti = dm_table_find_target(ci->md->map, ci->sector);
+	struct dm_target *ti = dm_table_find_target(ci->map, ci->sector);
 	sector_t len = 0, max = max_io_len(ci->md, ci->sector, ti);
 	struct target_io *tio;
 
@@ -459,7 +482,7 @@ static void __clone_and_map(struct clone
 
 		ci->sector += max;
 		ci->sector_count -= max;
-		ti = dm_table_find_target(ci->md->map, ci->sector);
+		ti = dm_table_find_target(ci->map, ci->sector);
 
 		len = to_sector(bv->bv_len) - max;
 		clone = split_bvec(bio, ci->sector, ci->idx,
@@ -483,6 +506,12 @@ static void __split_bio(struct mapped_de
 {
 	struct clone_info ci;
 
+	ci.map = dm_get_table(md);
+	if (!ci.map) {
+		bio_io_error(bio, bio->bi_size);
+		return;
+	}
+
 	ci.md = md;
 	ci.bio = bio;
 	ci.io = alloc_io(md);
@@ -500,22 +529,12 @@ static void __split_bio(struct mapped_de
 
 	/* drop the extra reference count */
 	dec_pending(ci.io, 0);
+	dm_table_put(ci.map);
 }
 /*-----------------------------------------------------------------
  * CRUD END
  *---------------------------------------------------------------*/
 
-
-static inline void __dm_request(struct mapped_device *md, struct bio *bio)
-{
-	if (!md->map) {
-		bio_io_error(bio, bio->bi_size);
-		return;
-	}
-
-	__split_bio(md, bio);
-}
-
 /*
  * The request function that just remaps the bio built up by
  * dm_merge_bvec.
@@ -554,11 +573,37 @@ static int dm_request(request_queue_t *q
 		down_read(&md->lock);
 	}
 
-	__dm_request(md, bio);
+	__split_bio(md, bio);
 	up_read(&md->lock);
 	return 0;
 }
 
+static void dm_unplug_all(request_queue_t *q)
+{
+	struct mapped_device *md = q->queuedata;
+	struct dm_table *map = dm_get_table(md);
+
+	if (map) {
+		dm_table_unplug_all(map);
+		dm_table_put(map);
+	}
+}
+
+static int dm_any_congested(void *congested_data, int bdi_bits)
+{
+	int r;
+	struct mapped_device *md = (struct mapped_device *) congested_data;
+	struct dm_table *map = dm_get_table(md);
+
+	if (!map || test_bit(DMF_BLOCK_IO, &md->flags))
+		r = bdi_bits;
+	else
+		r = dm_table_any_congested(map, bdi_bits);
+
+	dm_table_put(map);
+	return r;
+}
+
 /*-----------------------------------------------------------------
  * A bitset is used to keep track of allocated minor numbers.
  *---------------------------------------------------------------*/
@@ -630,6 +675,7 @@ static struct mapped_device *alloc_dev(u
 
 	memset(md, 0, sizeof(*md));
 	init_rwsem(&md->lock);
+	rwlock_init(&md->map_lock);
 	atomic_set(&md->holders, 1);
 
 	md->queue = blk_alloc_queue(GFP_KERNEL);
@@ -637,7 +683,10 @@ static struct mapped_device *alloc_dev(u
 		goto bad1;
 
 	md->queue->queuedata = md;
+	md->queue->backing_dev_info.congested_fn = dm_any_congested;
+	md->queue->backing_dev_info.congested_data = md;
 	blk_queue_make_request(md->queue, dm_request);
+	md->queue->unplug_fn = dm_unplug_all;
 
 	md->io_pool = mempool_create(MIN_IOS, mempool_alloc_slab,
 				     mempool_free_slab, _io_cache);
@@ -699,7 +748,7 @@ static void event_callback(void *context
 
 	down_write(&md->lock);
 	md->event_nr++;
-	wake_up_interruptible(&md->eventq);
+	wake_up(&md->eventq);
 	up_write(&md->lock);
 }
 
@@ -727,22 +776,28 @@ static int __bind(struct mapped_device *
 	if (size == 0)
 		return 0;
 
+	write_lock(&md->map_lock);
 	md->map = t;
-	dm_table_event_callback(md->map, event_callback, md);
+	write_unlock(&md->map_lock);
 
 	dm_table_get(t);
+	dm_table_event_callback(md->map, event_callback, md);
 	dm_table_set_restrictions(t, q);
 	return 0;
 }
 
 static void __unbind(struct mapped_device *md)
 {
-	if (!md->map)
+	struct dm_table *map = md->map;
+
+	if (!map)
 		return;
 
-	dm_table_event_callback(md->map, NULL, NULL);
-	dm_table_put(md->map);
+	dm_table_event_callback(map, NULL, NULL);
+	write_lock(&md->map_lock);
 	md->map = NULL;
+	write_unlock(&md->map_lock);
+	dm_table_put(map);
 }
 
 /*
@@ -778,12 +833,16 @@ void dm_get(struct mapped_device *md)
 
 void dm_put(struct mapped_device *md)
 {
+	struct dm_table *map = dm_get_table(md);
+
 	if (atomic_dec_and_test(&md->holders)) {
-		if (!test_bit(DMF_SUSPENDED, &md->flags) && md->map)
-			dm_table_suspend_targets(md->map);
+		if (!test_bit(DMF_SUSPENDED, &md->flags) && map)
+			dm_table_suspend_targets(map);
 		__unbind(md);
 		free_dev(md);
 	}
+
+	dm_table_put(map);
 }
 
 /*
@@ -796,7 +855,7 @@ static void __flush_deferred_io(struct m
 	while (c) {
 		n = c->bi_next;
 		c->bi_next = NULL;
-		__dm_request(md, c);
+		__split_bio(md, c);
 		c = n;
 	}
 }
@@ -834,6 +893,7 @@ int dm_swap_table(struct mapped_device *
  */
 int dm_suspend(struct mapped_device *md)
 {
+	struct dm_table *map;
 	DECLARE_WAITQUEUE(wait, current);
 
 	down_write(&md->lock);
@@ -851,15 +911,21 @@ int dm_suspend(struct mapped_device *md)
 	add_wait_queue(&md->wait, &wait);
 	up_write(&md->lock);
 
+	/* unplug */
+	map = dm_get_table(md);
+	if (map) {
+		dm_table_unplug_all(map);
+		dm_table_put(map);
+	}
+
 	/*
 	 * Then we wait for the already mapped ios to
 	 * complete.
 	 */
-	blk_run_queues();
 	while (1) {
 		set_current_state(TASK_INTERRUPTIBLE);
 
-		if (!atomic_read(&md->pending))
+		if (!atomic_read(&md->pending) || signal_pending(current))
 			break;
 
 		io_schedule();
@@ -868,9 +934,20 @@ int dm_suspend(struct mapped_device *md)
 
 	down_write(&md->lock);
 	remove_wait_queue(&md->wait, &wait);
+
+	/* were we interrupted ? */
+	if (atomic_read(&md->pending)) {
+		clear_bit(DMF_BLOCK_IO, &md->flags);
+		up_write(&md->lock);
+		return -EINTR;
+	}
+
 	set_bit(DMF_SUSPENDED, &md->flags);
-	if (md->map)
-		dm_table_suspend_targets(md->map);
+
+	map = dm_get_table(md);
+	if (map)
+		dm_table_suspend_targets(map);
+	dm_table_put(map);
 	up_write(&md->lock);
 
 	return 0;
@@ -879,24 +956,26 @@ int dm_suspend(struct mapped_device *md)
 int dm_resume(struct mapped_device *md)
 {
 	struct bio *def;
+	struct dm_table *map = dm_get_table(md);
 
 	down_write(&md->lock);
-	if (!md->map ||
+	if (!map ||
 	    !test_bit(DMF_SUSPENDED, &md->flags) ||
-	    !dm_table_get_size(md->map)) {
+	    !dm_table_get_size(map)) {
 		up_write(&md->lock);
+		dm_table_put(map);
 		return -EINVAL;
 	}
 
-	dm_table_resume_targets(md->map);
+	dm_table_resume_targets(map);
 	clear_bit(DMF_SUSPENDED, &md->flags);
 	clear_bit(DMF_BLOCK_IO, &md->flags);
 
 	def = bio_list_get(&md->deferred);
 	__flush_deferred_io(md, def);
 	up_write(&md->lock);
-
-	blk_run_queues();
+	dm_table_unplug_all(map);
+	dm_table_put(map);
 
 	return 0;
 }
@@ -946,19 +1025,6 @@ struct gendisk *dm_disk(struct mapped_de
 	return md->disk;
 }
 
-struct dm_table *dm_get_table(struct mapped_device *md)
-{
-	struct dm_table *t;
-
-	down_read(&md->lock);
-	t = md->map;
-	if (t)
-		dm_table_get(t);
-	up_read(&md->lock);
-
-	return t;
-}
-
 int dm_suspended(struct mapped_device *md)
 {
 	return test_bit(DMF_SUSPENDED, &md->flags);
--- diff/drivers/md/dm.h	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/md/dm.h	2004-04-21 10:45:34.302488728 +0100
@@ -115,6 +115,8 @@ struct list_head *dm_table_get_devices(s
 int dm_table_get_mode(struct dm_table *t);
 void dm_table_suspend_targets(struct dm_table *t);
 void dm_table_resume_targets(struct dm_table *t);
+int dm_table_any_congested(struct dm_table *t, int bdi_bits);
+void dm_table_unplug_all(struct dm_table *t);
 
 /*-----------------------------------------------------------------
  * A registry of target types.
--- diff/drivers/md/linear.c	2004-02-18 08:54:09.000000000 +0000
+++ source/drivers/md/linear.c	2004-04-21 10:45:34.302488728 +0100
@@ -61,9 +61,10 @@ static int linear_mergeable_bvec(request
 	mddev_t *mddev = q->queuedata;
 	dev_info_t *dev0;
 	unsigned long maxsectors, bio_sectors = bio->bi_size >> 9;
+	sector_t sector = bio->bi_sector + get_start_sect(bio->bi_bdev);
 
-	dev0 = which_dev(mddev, bio->bi_sector);
-	maxsectors = (dev0->size << 1) - (bio->bi_sector - (dev0->offset<<1));
+	dev0 = which_dev(mddev, sector);
+	maxsectors = (dev0->size << 1) - (sector - (dev0->offset<<1));
 
 	if (maxsectors < bio_sectors)
 		maxsectors = 0;
@@ -79,6 +80,20 @@ static int linear_mergeable_bvec(request
 	return maxsectors << 9;
 }
 
+static void linear_unplug(request_queue_t *q)
+{
+	mddev_t *mddev = q->queuedata;
+	linear_conf_t *conf = mddev_to_conf(mddev);
+	int i;
+
+	for (i=0; i < mddev->raid_disks; i++) {
+		request_queue_t *r_queue = bdev_get_queue(conf->disks[i].rdev->bdev);
+		if (r_queue->unplug_fn)
+			r_queue->unplug_fn(r_queue);
+	}
+}
+
+
 static int linear_run (mddev_t *mddev)
 {
 	linear_conf_t *conf;
@@ -184,6 +199,7 @@ static int linear_run (mddev_t *mddev)
 		BUG();
 
 	blk_queue_merge_bvec(mddev->queue, linear_mergeable_bvec);
+	mddev->queue->unplug_fn = linear_unplug;
 	return 0;
 
 out:
--- diff/drivers/md/md.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/md/md.c	2004-04-21 10:45:34.304488424 +0100
@@ -335,6 +335,8 @@ static int sync_page_io(struct block_dev
 	struct bio_vec vec;
 	struct completion event;
 
+	rw |= (1 << BIO_RW_SYNC);
+
 	bio_init(&bio);
 	bio.bi_io_vec = &vec;
 	vec.bv_page = page;
@@ -349,7 +351,6 @@ static int sync_page_io(struct block_dev
 	bio.bi_private = &event;
 	bio.bi_end_io = bi_complete;
 	submit_bio(rw, &bio);
-	blk_run_queues();
 	wait_for_completion(&event);
 
 	return test_bit(BIO_UPTODATE, &bio.bi_flags);
@@ -2711,15 +2712,14 @@ int md_thread(void * arg)
 		wait_event_interruptible(thread->wqueue,
 					 test_bit(THREAD_WAKEUP, &thread->flags));
 		if (current->flags & PF_FREEZE)
-			refrigerator(PF_IOTHREAD);
+			refrigerator(PF_FREEZE);
 
 		clear_bit(THREAD_WAKEUP, &thread->flags);
 
 		run = thread->run;
-		if (run) {
+		if (run)
 			run(thread->mddev);
-			blk_run_queues();
-		}
+
 		if (signal_pending(current))
 			flush_signals(current);
 	}
@@ -3287,8 +3287,6 @@ static void md_do_sync(mddev_t *mddev)
 		    test_bit(MD_RECOVERY_ERR, &mddev->recovery))
 			break;
 
-		blk_run_queues();
-
 	repeat:
 		if (jiffies >= mark[last_mark] + SYNC_MARK_STEP ) {
 			/* step marks */
@@ -3321,6 +3319,7 @@ static void md_do_sync(mddev_t *mddev)
 		 * about not overloading the IO subsystem. (things like an
 		 * e2fsck being done on the RAID array should execute fast)
 		 */
+		mddev->queue->unplug_fn(mddev->queue);
 		cond_resched();
 
 		currspeed = ((unsigned long)(j-mddev->resync_mark_cnt))/2/((jiffies-mddev->resync_mark)/HZ +1) +1;
@@ -3339,6 +3338,8 @@ static void md_do_sync(mddev_t *mddev)
 	 * this also signals 'finished resyncing' to md_stop
 	 */
  out:
+	mddev->queue->unplug_fn(mddev->queue);
+
 	wait_event(mddev->recovery_wait, !atomic_read(&mddev->recovery_active));
 
 	/* tell personality that we are finished */
--- diff/drivers/md/multipath.c	2004-02-18 08:54:09.000000000 +0000
+++ source/drivers/md/multipath.c	2004-04-21 10:45:34.305488272 +0100
@@ -155,6 +155,27 @@ static int multipath_read_balance (multi
 	return 0;
 }
 
+static void unplug_slaves(mddev_t *mddev)
+{
+	multipath_conf_t *conf = mddev_to_conf(mddev);
+	int i;
+
+	for (i=0; i<mddev->raid_disks; i++) {
+		mdk_rdev_t *rdev = conf->multipaths[i].rdev;
+		if (rdev && !rdev->faulty) {
+			request_queue_t *r_queue = bdev_get_queue(rdev->bdev);
+
+			if (r_queue->unplug_fn)
+				r_queue->unplug_fn(r_queue);
+		}
+	}
+}
+static void multipath_unplug(request_queue_t *q)
+{
+	unplug_slaves(q->queuedata);
+}
+
+
 static int multipath_make_request (request_queue_t *q, struct bio * bio)
 {
 	mddev_t *mddev = q->queuedata;
@@ -419,6 +440,8 @@ static int multipath_run (mddev_t *mddev
 	}
 	memset(conf->multipaths, 0, sizeof(struct multipath_info)*mddev->raid_disks);
 
+	mddev->queue->unplug_fn = multipath_unplug;
+
 	conf->working_disks = 0;
 	ITERATE_RDEV(mddev,rdev,tmp) {
 		disk_idx = rdev->raid_disk;
--- diff/drivers/md/raid0.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/md/raid0.c	2004-04-21 10:45:34.305488272 +0100
@@ -25,6 +25,21 @@
 #define MD_DRIVER
 #define MD_PERSONALITY
 
+static void raid0_unplug(request_queue_t *q)
+{
+	mddev_t *mddev = q->queuedata;
+	raid0_conf_t *conf = mddev_to_conf(mddev);
+	mdk_rdev_t **devlist = conf->strip_zone[0].dev;
+	int i;
+
+	for (i=0; i<mddev->raid_disks; i++) {
+		request_queue_t *r_queue = bdev_get_queue(devlist[i]->bdev);
+
+		if (r_queue->unplug_fn)
+			r_queue->unplug_fn(r_queue);
+	}
+}
+
 static int create_strip_zones (mddev_t *mddev)
 {
 	int i, c, j;
@@ -202,6 +217,8 @@ static int create_strip_zones (mddev_t *
 			conf->hash_spacing = sz;
 	}
 
+	mddev->queue->unplug_fn = raid0_unplug;
+
 	printk("raid0: done.\n");
 	return 0;
  abort:
@@ -219,7 +236,7 @@ static int create_strip_zones (mddev_t *
 static int raid0_mergeable_bvec(request_queue_t *q, struct bio *bio, struct bio_vec *biovec)
 {
 	mddev_t *mddev = q->queuedata;
-	sector_t sector = bio->bi_sector;
+	sector_t sector = bio->bi_sector + get_start_sect(bio->bi_bdev);
 	int max;
 	unsigned int chunk_sectors = mddev->chunk_size >> 9;
 	unsigned int bio_sectors = bio->bi_size >> 9;
--- diff/drivers/md/raid1.c	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/md/raid1.c	2004-04-21 10:45:34.306488120 +0100
@@ -37,6 +37,9 @@ static mdk_personality_t raid1_personali
 static spinlock_t retry_list_lock = SPIN_LOCK_UNLOCKED;
 static LIST_HEAD(retry_list_head);
 
+static void unplug_slaves(mddev_t *mddev);
+
+
 static void * r1bio_pool_alloc(int gfp_flags, void *data)
 {
 	mddev_t *mddev = data;
@@ -47,6 +50,8 @@ static void * r1bio_pool_alloc(int gfp_f
 			 gfp_flags);
 	if (r1_bio)
 		memset(r1_bio, 0, sizeof(*r1_bio) + sizeof(struct bio*)*mddev->raid_disks);
+	else
+		unplug_slaves(mddev);
 
 	return r1_bio;
 }
@@ -71,8 +76,10 @@ static void * r1buf_pool_alloc(int gfp_f
 	int i, j;
 
 	r1_bio = r1bio_pool_alloc(gfp_flags, conf->mddev);
-	if (!r1_bio)
+	if (!r1_bio) {
+		unplug_slaves(conf->mddev);
 		return NULL;
+	}
 
 	/*
 	 * Allocate bios : 1 for reading, n-1 for writing
@@ -443,6 +450,29 @@ rb_out:
 	return new_disk;
 }
 
+static void unplug_slaves(mddev_t *mddev)
+{
+	conf_t *conf = mddev_to_conf(mddev);
+	int i;
+	unsigned long flags;
+
+	spin_lock_irqsave(&conf->device_lock, flags);
+	for (i=0; i<mddev->raid_disks; i++) {
+		mdk_rdev_t *rdev = conf->mirrors[i].rdev;
+		if (rdev && !rdev->faulty) {
+			request_queue_t *r_queue = bdev_get_queue(rdev->bdev);
+
+			if (r_queue->unplug_fn)
+				r_queue->unplug_fn(r_queue);
+		}
+	}
+	spin_unlock_irqrestore(&conf->device_lock, flags);
+}
+static void raid1_unplug(request_queue_t *q)
+{
+	unplug_slaves(q->queuedata);
+}
+
 /*
  * Throttle resync depth, so that we can both get proper overlapping of
  * requests, but are still able to handle normal requests quickly.
@@ -452,14 +482,17 @@ rb_out:
 static void device_barrier(conf_t *conf, sector_t sect)
 {
 	spin_lock_irq(&conf->resync_lock);
-	wait_event_lock_irq(conf->wait_idle, !waitqueue_active(&conf->wait_resume), conf->resync_lock);
+	wait_event_lock_irq(conf->wait_idle, !waitqueue_active(&conf->wait_resume),
+			    conf->resync_lock, unplug_slaves(conf->mddev));
 	
 	if (!conf->barrier++) {
-		wait_event_lock_irq(conf->wait_idle, !conf->nr_pending, conf->resync_lock);
+		wait_event_lock_irq(conf->wait_idle, !conf->nr_pending,
+				    conf->resync_lock, unplug_slaves(conf->mddev));
 		if (conf->nr_pending)
 			BUG();
 	}
-	wait_event_lock_irq(conf->wait_resume, conf->barrier < RESYNC_DEPTH, conf->resync_lock);
+	wait_event_lock_irq(conf->wait_resume, conf->barrier < RESYNC_DEPTH,
+			    conf->resync_lock, unplug_slaves(conf->mddev));
 	conf->next_resync = sect;
 	spin_unlock_irq(&conf->resync_lock);
 }
@@ -479,7 +512,7 @@ static int make_request(request_queue_t 
 	 * Continue immediately if no resync is active currently.
 	 */
 	spin_lock_irq(&conf->resync_lock);
-	wait_event_lock_irq(conf->wait_resume, !conf->barrier, conf->resync_lock);
+	wait_event_lock_irq(conf->wait_resume, !conf->barrier, conf->resync_lock, );
 	conf->nr_pending++;
 	spin_unlock_irq(&conf->resync_lock);
 
@@ -645,7 +678,8 @@ static void print_conf(conf_t *conf)
 static void close_sync(conf_t *conf)
 {
 	spin_lock_irq(&conf->resync_lock);
-	wait_event_lock_irq(conf->wait_resume, !conf->barrier, conf->resync_lock);
+	wait_event_lock_irq(conf->wait_resume, !conf->barrier,
+			    conf->resync_lock, 	unplug_slaves(conf->mddev));
 	spin_unlock_irq(&conf->resync_lock);
 
 	if (conf->barrier) BUG();
@@ -859,6 +893,7 @@ static void raid1d(mddev_t *mddev)
 	struct bio *bio;
 	unsigned long flags;
 	conf_t *conf = mddev_to_conf(mddev);
+	int unplug=0;
 	mdk_rdev_t *rdev;
 
 	md_check_recovery(mddev);
@@ -878,6 +913,7 @@ static void raid1d(mddev_t *mddev)
 		bio = r1_bio->master_bio;
 		if (test_bit(R1BIO_IsSync, &r1_bio->state)) {
 			sync_request_write(mddev, r1_bio);
+			unplug = 1;
 		} else {
 			if (map(mddev, &rdev) == -1) {
 				printk(KERN_ALERT "raid1: %s: unrecoverable I/O"
@@ -893,12 +929,14 @@ static void raid1d(mddev_t *mddev)
 				bio->bi_bdev = rdev->bdev;
 				bio->bi_sector = r1_bio->sector + rdev->data_offset;
 				bio->bi_rw = READ;
-
+				unplug = 1;
 				generic_make_request(bio);
 			}
 		}
 	}
 	spin_unlock_irqrestore(&retry_list_lock, flags);
+	if (unplug)
+		unplug_slaves(mddev);
 }
 
 
@@ -1101,6 +1139,7 @@ static int run(mddev_t *mddev)
 			mdname(mddev));
 		goto out_free_conf;
 	}
+	mddev->queue->unplug_fn = raid1_unplug;
 
 
 	ITERATE_RDEV(mddev, rdev, tmp) {
--- diff/drivers/md/raid5.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/md/raid5.c	2004-04-21 10:45:34.307487968 +0100
@@ -231,6 +231,8 @@ static struct stripe_head *__find_stripe
 	return NULL;
 }
 
+static void unplug_slaves(mddev_t *mddev);
+
 static struct stripe_head *get_active_stripe(raid5_conf_t *conf, sector_t sector,
 					     int pd_idx, int noblock) 
 {
@@ -253,7 +255,9 @@ static struct stripe_head *get_active_st
 						    !list_empty(&conf->inactive_list) &&
 						    (atomic_read(&conf->active_stripes) < (NR_STRIPES *3/4)
 						     || !conf->inactive_blocked),
-						    conf->device_lock);
+						    conf->device_lock,
+						    unplug_slaves(conf->mddev);
+					);
 				conf->inactive_blocked = 0;
 			} else
 				init_stripe(sh, sector, pd_idx);
@@ -1292,9 +1296,27 @@ static inline void raid5_activate_delaye
 		}
 	}
 }
-static void raid5_unplug_device(void *data)
+
+static void unplug_slaves(mddev_t *mddev)
+{
+	raid5_conf_t *conf = mddev_to_conf(mddev);
+	int i;
+
+	for (i=0; i<mddev->raid_disks; i++) {
+		mdk_rdev_t *rdev = conf->disks[i].rdev;
+		if (rdev && !rdev->faulty) {
+			struct block_device *bdev = rdev->bdev;
+			if (bdev) {
+				request_queue_t *r_queue = bdev_get_queue(bdev);
+				if (r_queue && r_queue->unplug_fn)
+					r_queue->unplug_fn(r_queue);
+			}
+		}
+	}
+}
+
+static void raid5_unplug_device(request_queue_t *q)
 {
-	request_queue_t *q = data;
 	mddev_t *mddev = q->queuedata;
 	raid5_conf_t *conf = mddev_to_conf(mddev);
 	unsigned long flags;
@@ -1306,6 +1328,8 @@ static void raid5_unplug_device(void *da
 	md_wakeup_thread(mddev->thread);
 
 	spin_unlock_irqrestore(&conf->device_lock, flags);
+
+	unplug_slaves(mddev);
 }
 
 static inline void raid5_plug_device(raid5_conf_t *conf)
@@ -1334,9 +1358,8 @@ static int make_request (request_queue_t
 		disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bi));
 	}
 
-	logical_sector = bi->bi_sector & ~(STRIPE_SECTORS-1);
+	logical_sector = bi->bi_sector & ~((sector_t)STRIPE_SECTORS-1);
 	last_sector = bi->bi_sector + (bi->bi_size>>9);
-
 	bi->bi_next = NULL;
 	bi->bi_phys_segments = 1;	/* over-loaded to count active stripes */
 	if ( bio_data_dir(bi) == WRITE )
@@ -1392,9 +1415,11 @@ static int sync_request (mddev_t *mddev,
 	int raid_disks = conf->raid_disks;
 	int data_disks = raid_disks-1;
 
-	if (sector_nr >= mddev->size <<1)
-		/* just being told to finish up .. nothing to do */
+	if (sector_nr >= mddev->size <<1) {
+		/* just being told to finish up .. nothing much to do */
+		unplug_slaves(mddev);
 		return 0;
+	}
 
 	x = sector_nr;
 	chunk_offset = sector_div(x, sectors_per_chunk);
@@ -1474,6 +1499,8 @@ static void raid5d (mddev_t *mddev)
 
 	spin_unlock_irq(&conf->device_lock);
 
+	unplug_slaves(mddev);
+
 	PRINTK("--- raid5d inactive\n");
 }
 
--- diff/drivers/md/raid6main.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/md/raid6main.c	2004-04-21 10:45:34.308487816 +0100
@@ -250,6 +250,8 @@ static struct stripe_head *__find_stripe
 	return NULL;
 }
 
+static void unplug_slaves(mddev_t *mddev);
+
 static struct stripe_head *get_active_stripe(raid6_conf_t *conf, sector_t sector,
 					     int pd_idx, int noblock)
 {
@@ -272,7 +274,9 @@ static struct stripe_head *get_active_st
 						    !list_empty(&conf->inactive_list) &&
 						    (atomic_read(&conf->active_stripes) < (NR_STRIPES *3/4)
 						     || !conf->inactive_blocked),
-						    conf->device_lock);
+						    conf->device_lock,
+						    unplug_slaves(conf->mddev);
+					);
 				conf->inactive_blocked = 0;
 			} else
 				init_stripe(sh, sector, pd_idx);
@@ -1454,9 +1458,28 @@ static inline void raid6_activate_delaye
 		}
 	}
 }
-static void raid6_unplug_device(void *data)
+
+static void unplug_slaves(mddev_t *mddev)
+{
+	/* note: this is always called with device_lock held */
+	raid6_conf_t *conf = mddev_to_conf(mddev);
+	int i;
+
+	for (i=0; i<mddev->raid_disks; i++) {
+		mdk_rdev_t *rdev = conf->disks[i].rdev;
+		if (rdev && !rdev->faulty) {
+			struct block_device *bdev = rdev->bdev;
+			if (bdev) {
+				request_queue_t *r_queue = bdev_get_queue(bdev);
+				if (r_queue && r_queue->unplug_fn)
+					r_queue->unplug_fn(r_queue);
+			}
+		}
+	}
+}
+
+static void raid6_unplug_device(request_queue_t *q)
 {
-	request_queue_t *q = data;
 	mddev_t *mddev = q->queuedata;
 	raid6_conf_t *conf = mddev_to_conf(mddev);
 	unsigned long flags;
@@ -1468,6 +1491,8 @@ static void raid6_unplug_device(void *da
 	md_wakeup_thread(mddev->thread);
 
 	spin_unlock_irqrestore(&conf->device_lock, flags);
+
+	unplug_slaves(mddev);
 }
 
 static inline void raid6_plug_device(raid6_conf_t *conf)
@@ -1496,7 +1521,7 @@ static int make_request (request_queue_t
 		disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bi));
 	}
 
-	logical_sector = bi->bi_sector & ~(STRIPE_SECTORS-1);
+	logical_sector = bi->bi_sector & ~((sector_t)STRIPE_SECTORS-1);
 	last_sector = bi->bi_sector + (bi->bi_size>>9);
 
 	bi->bi_next = NULL;
@@ -1554,9 +1579,11 @@ static int sync_request (mddev_t *mddev,
 	int raid_disks = conf->raid_disks;
 	int data_disks = raid_disks - 2;
 
-	if (sector_nr >= mddev->size <<1)
-		/* just being told to finish up .. nothing to do */
+	if (sector_nr >= mddev->size <<1) {
+		/* just being told to finish up .. nothing much to do */
+		unplug_slaves(mddev);
 		return 0;
+	}
 
 	x = sector_nr;
 	chunk_offset = sector_div(x, sectors_per_chunk);
@@ -1636,6 +1663,8 @@ static void raid6d (mddev_t *mddev)
 
 	spin_unlock_irq(&conf->device_lock);
 
+	unplug_slaves(mddev);
+
 	PRINTK("--- raid6d inactive\n");
 }
 
--- diff/drivers/media/Kconfig	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/media/Kconfig	2004-04-21 10:45:34.320485992 +0100
@@ -18,7 +18,7 @@ config VIDEO_DEV
 	  and applications for most video capture functions already exist.
 
 	  Documentation for the original API is included in the file
-	  Documentation/video4linux/API.html.  Documentation for V4L2 is
+	  <file:Documentation/video4linux/API.html>.  Documentation for V4L2 is
 	  available on the web at <http://bytesex.org/v4l/>.
 
 	  To compile this driver as a module, choose M here: the
--- diff/drivers/media/dvb/frontends/Kconfig	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/media/dvb/frontends/Kconfig	2004-04-21 10:45:34.330484472 +0100
@@ -3,7 +3,7 @@ comment "Supported Frontend Modules"
 
 config DVB_TWINHAN_DST
 	tristate "TWINHAN DST based DVB-S frontend (QPSK)"
-	depends on DVB_CORE
+	depends on DVB_CORE && DVB_BT8XX
 	help
 	  Used in such cards as the VP-1020/1030, Twinhan DST,
 	  VVmer TV@SAT. Say Y when you want to support frontends 
--- diff/drivers/media/dvb/frontends/stv0299.c	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/media/dvb/frontends/stv0299.c	2004-04-21 10:45:34.332484168 +0100
@@ -353,7 +353,7 @@ static int tsa5059_set_tv_freq	(struct d
 	u8 addr;
 	u32 div;
 	u8 buf[4];
-        int i, divisor, regcode;
+	int divisor, regcode;
 
 	dprintk ("%s: freq %i, ftype %i\n", __FUNCTION__, freq, ftype);
 
--- diff/drivers/media/dvb/frontends/tda1004x.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/media/dvb/frontends/tda1004x.c	2004-04-21 10:45:34.341482800 +0100
@@ -188,7 +188,6 @@ static int tda10045h_fwinfo_count = size
 static struct fwinfo tda10046h_fwinfo[] = { {.file_size = 286720,.fw_offset = 0x3c4f9,.fw_size = 24479} };
 static int tda10046h_fwinfo_count = sizeof(tda10046h_fwinfo) / sizeof(struct fwinfo);
 
-static int errno;
 
 
 static int tda1004x_write_byte(struct dvb_i2c_bus *i2c, struct tda1004x_state *tda_state, int reg, int data)
--- diff/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c	2004-04-21 10:45:34.341482800 +0100
@@ -1008,7 +1008,7 @@ static int ttusb_stop_feed(struct dvb_de
 
 static int ttusb_setup_interfaces(struct ttusb *ttusb)
 {
-	usb_set_configuration(ttusb->dev, 1);
+	usb_reset_configuration(ttusb->dev);
 	usb_set_interface(ttusb->dev, 1, 1);
 
 	ttusb->bulk_out_pipe = usb_sndbulkpipe(ttusb->dev, 1);
@@ -1077,6 +1077,17 @@ static int ttusb_probe(struct usb_interf
 
 	udev = interface_to_usbdev(intf);
 
+	/* Device has already been reset; its configuration was chosen.
+	 * If this fault happens, use a hotplug script to choose the
+	 * right configuration (write bConfigurationValue in sysfs).
+	 */
+	if (udev->actconfig->desc.bConfigurationValue != 1) {
+		dev_err(&intf->dev, "device config is #%d, need #1\n",
+			udev->actconfig->desc.bConfigurationValue);
+		return -ENODEV;
+	}
+
+
 	if (!(ttusb = kmalloc(sizeof(struct ttusb), GFP_KERNEL)))
 		return -ENOMEM;
 
--- diff/drivers/media/dvb/ttusb-dec/Kconfig	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/media/dvb/ttusb-dec/Kconfig	2004-04-21 10:45:34.342482648 +0100
@@ -14,6 +14,6 @@ config DVB_TTUSB_DEC
 
 	  The DEC devices require firmware in order to boot into a mode in
 	  which they are slaves to the PC.  See
-	  linux/Documentation/dvb/ttusb-dec.txt for details.
+	  <file:Documentation/dvb/ttusb-dec.txt> for details.
 
 	  Say Y if you own such a device and want to use it.
--- diff/drivers/media/radio/Kconfig	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/media/radio/Kconfig	2004-04-21 10:45:34.342482648 +0100
@@ -14,11 +14,11 @@ config RADIO_CADET
 
 	  In order to control your radio card, you will need to use programs
 	  that are compatible with the Video For Linux API.  Information on
-	  this API and pointers to "v4l" programs may be found on the WWW at
-	  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+	  this API and pointers to "v4l" programs may be found at
+	  <file:Documentation/video4linux/API.html>.
 
 	  Further documentation on this driver can be found on the WWW at
-	  <http://linux.blackhawke.net/cadet.html>.
+	  <http://linux.blackhawke.net/cadet/>.
 
 	  To compile this driver as a module, choose M here: the
 	  module will be called radio-cadet.
@@ -41,9 +41,9 @@ config RADIO_RTRACK
 
 	  In order to control your radio card, you will need to use programs
 	  that are compatible with the Video For Linux API.  Information on
-	  this API and pointers to "v4l" programs may be found on the WWW at
-	  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.  More
-	  information is contained in the file
+	  this API and pointers to "v4l" programs may be found at
+	  <file:Documentation/video4linux/API.html>. More information is
+	  contained in the file
 	  <file:Documentation/video4linux/radiotrack.txt>.
 
 	  To compile this driver as a module, choose M here: the
@@ -66,8 +66,8 @@ config RADIO_RTRACK2
 
 	  In order to control your radio card, you will need to use programs
 	  that are compatible with the Video For Linux API.  Information on
-	  this API and pointers to "v4l" programs may be found on the WWW at
-	  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+	  this API and pointers to "v4l" programs may be found at
+	  <file:Documentation/video4linux/API.html>.
 
 	  To compile this driver as a module, choose M here: the
 	  module will be called radio-rtrack2.
@@ -89,8 +89,8 @@ config RADIO_AZTECH
 
 	  In order to control your radio card, you will need to use programs
 	  that are compatible with the Video For Linux API.  Information on
-	  this API and pointers to "v4l" programs may be found on the WWW at
-	  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+	  this API and pointers to "v4l" programs may be found at
+	  <file:Documentation/video4linux/API.html>.
 
 	  To compile this driver as a module, choose M here: the
 	  module will be called radio-aztech.
@@ -113,8 +113,8 @@ config RADIO_GEMTEK
 
 	  In order to control your radio card, you will need to use programs
 	  that are compatible with the Video For Linux API.  Information on
-	  this API and pointers to "v4l" programs may be found on the WWW at
-	  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+	  this API and pointers to "v4l" programs may be found at
+	  <file:Documentation/video4linux/API.html>.
 
 	  To compile this driver as a module, choose M here: the
 	  module will be called radio-gemtek.
@@ -137,8 +137,8 @@ config RADIO_GEMTEK_PCI
 
 	  In order to control your radio card, you will need to use programs
 	  that are compatible with the Video for Linux API.  Information on 
-	  this API and pointers to "v4l" programs may be found on the WWW at
-	  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+	  this API and pointers to "v4l" programs may be found at
+	  <file:Documentation/video4linux/API.html>.
 
 	  To compile this driver as a module, choose M here: the
 	  module will be called radio-gemtek-pci.
@@ -152,8 +152,8 @@ config RADIO_MAXIRADIO
 
 	  In order to control your radio card, you will need to use programs
 	  that are compatible with the Video For Linux API.  Information on
-	  this API and pointers to "v4l" programs may be found on the WWW at
-	  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+	  this API and pointers to "v4l" programs may be found at
+	  <file:Documentation/video4linux/API.html>.
 
 	  To compile this driver as a module, choose M here: the
 	  module will be called radio-maxiradio.
@@ -167,8 +167,8 @@ config RADIO_MAESTRO
 
 	  In order to control your radio card, you will need to use programs
 	  that are compatible with the Video For Linux API.  Information on
-	  this API and pointers to "v4l" programs may be found on the WWW at
-	  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+	  this API and pointers to "v4l" programs may be found at
+	  <file:Documentation/video4linux/API.html>.
 
 	  To compile this driver as a module, choose M here: the
 	  module will be called radio-maestro.
@@ -183,8 +183,8 @@ config RADIO_MIROPCM20
 
 	  In order to control your radio card, you will need to use programs
 	  that are compatible with the Video For Linux API.  Information on
-	  this API and pointers to "v4l" programs may be found on the WWW at
-	  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+	  this API and pointers to "v4l" programs may be found at
+	  <file:Documentation/video4linux/API.html>.
 
 	  To compile this driver as a module, choose M here: the
 	  module will be called miropcm20.
@@ -217,8 +217,8 @@ config RADIO_SF16FMI
 
 	  In order to control your radio card, you will need to use programs
 	  that are compatible with the Video For Linux API.  Information on
-	  this API and pointers to "v4l" programs may be found on the WWW at
-	  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+	  this API and pointers to "v4l" programs may be found at
+	  <file:Documentation/video4linux/API.html>.
 
 	  To compile this driver as a module, choose M here: the
 	  module will be called radio-sf16fmi.
@@ -248,12 +248,12 @@ config RADIO_TERRATEC
 	  frequency control and muting works at least for me, but
 	  unfortunately I have not found anybody who wants to use this card
 	  with Linux.  So if it is this what YOU are trying to do right now,
-	  PLEASE DROP ME A NOTE!!  Rolf Offermanns (rolf@offermanns.de)
+	  PLEASE DROP ME A NOTE!!  Rolf Offermanns <rolf@offermanns.de>.
 
 	  In order to control your radio card, you will need to use programs
 	  that are compatible with the Video For Linux API.  Information on
-	  this API and pointers to "v4l" programs may be found on the WWW at
-	  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+	  this API and pointers to "v4l" programs may be found at
+	  <file:Documentation/video4linux/API.html>.
 
 	  To compile this driver as a module, choose M here: the
 	  module will be called radio-terratec.
@@ -293,8 +293,8 @@ config RADIO_TYPHOON
 
 	  In order to control your radio card, you will need to use programs
 	  that are compatible with the Video For Linux API.  Information on
-	  this API and pointers to "v4l" programs may be found on the WWW at
-	  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+	  this API and pointers to "v4l" programs may be found at
+	  <file:Documentation/video4linux/API.html>.
 
 	  To compile this driver as a module, choose M here: the
 	  module will be called radio-typhoon.
@@ -337,8 +337,8 @@ config RADIO_ZOLTRIX
 
 	  In order to control your radio card, you will need to use programs
 	  that are compatible with the Video For Linux API.  Information on
-	  this API and pointers to "v4l" programs may be found on the WWW at
-	  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+	  this API and pointers to "v4l" programs may be found at
+	  <file:Documentation/video4linux/API.html>.
 
 	  To compile this driver as a module, choose M here: the
 	  module will be called radio-zoltrix.
--- diff/drivers/media/video/Kconfig	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/media/video/Kconfig	2004-04-21 10:45:34.343482496 +0100
@@ -14,7 +14,7 @@ config VIDEO_BT848
 	---help---
 	  Support for BT848 based frame grabber/overlay boards. This includes
 	  the Miro, Hauppauge and STB boards. Please read the material in
-	  <file:Documentation/video4linux/bttv> for more information.
+	  <file:Documentation/video4linux/bttv/> for more information.
 
 	  If you say Y or M here, you need to say Y or M to "I2C support" and
 	  "I2C bit-banging interfaces" in the character device section.
@@ -37,8 +37,8 @@ config VIDEO_PLANB
 	help
 	  PlanB is the V4L driver for the PowerMac 7x00/8x00 series video
 	  input hardware. If you want to experiment with this, say Y.
-	  Otherwise, or if you don't understand a word, say N.
-	  See <http://www.cpu.lu/~mlan/planb.html> for more info.
+	  Otherwise, or if you don't understand a word, say N. See
+	  <http://www.cpu.lu/~mlan/linux/dev/planb.html> for more info.
 
 	  Saying M will compile this driver as a module (planb).
 
--- diff/drivers/media/video/bttv-cards.c	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/media/video/bttv-cards.c	2004-04-21 10:45:34.345482192 +0100
@@ -57,6 +57,7 @@ static void avermedia_tv_stereo_audio(st
 				      int set);
 static void terratv_audio(struct bttv *btv, struct video_audio *v, int set);
 static void gvbctv3pci_audio(struct bttv *btv, struct video_audio *v, int set);
+static void gvbctv5pci_audio(struct bttv *btv, struct video_audio *v, int set);
 static void winfast2000_audio(struct bttv *btv, struct video_audio *v, int set);
 static void pvbt878p9b_audio(struct bttv *btv, struct video_audio *v, int set);
 static void fv2000s_audio(struct bttv *btv, struct video_audio *v, int set);
@@ -68,6 +69,8 @@ static void xguard_muxsel(struct bttv *b
 static void ivc120_muxsel(struct bttv *btv, unsigned int input);
 static void gvc1100_muxsel(struct bttv *btv, unsigned int input);
 
+static void PXC200_muxsel(struct bttv *btv, unsigned int input);
+
 static int terratec_active_radio_upgrade(struct bttv *btv);
 static int tea5757_read(struct bttv *btv);
 static int tea5757_write(struct bttv *btv, int value);
@@ -118,7 +121,7 @@ MODULE_PARM(remote,"1-" __stringify(BTTV
 
 MODULE_PARM(gpiomask,"i");
 MODULE_PARM(audioall,"i");
-MODULE_PARM(audiomux,"1-5i");
+MODULE_PARM(audiomux,"1-6i");
 
 /* kernel args */
 #ifndef MODULE
@@ -169,7 +172,7 @@ static struct CARD {
  	{ 0x402010fc, BTTV_GVBCTV3PCI,    "I-O Data Co. GV-BCTV3/PCI" },
 	{ 0x405010fc, BTTV_GVBCTV4PCI,    "I-O Data Co. GV-BCTV4/PCI" },
 	{ 0x407010fc, BTTV_GVBCTV5PCI,    "I-O Data Co. GV-BCTV5/PCI" },
- 	{ 0xd01810fc, BTTV_GVBCTV3PCI,    "I-O Data Co. GV-BCTV3/PCI" },
+ 	{ 0xd01810fc, BTTV_GVBCTV5PCI,    "I-O Data Co. GV-BCTV5/PCI" },
 
 	{ 0x001211bd, BTTV_PINNACLE,      "Pinnacle PCTV" },
 	{ 0x001c11bd, BTTV_PINNACLESAT,   "Pinnacle PCTV Sat" },
@@ -204,7 +207,8 @@ static struct CARD {
 	//{ 0x18521852, BTTV_TERRATV,     "Terratec TV+ (V1.10)"    },
 	{ 0x1134153b, BTTV_TERRATVALUE,   "Terratec TValue (LR102)" },
 	{ 0x1135153b, BTTV_TERRATVALUER,  "Terratec TValue Radio" }, // LR102
-	{ 0x5018153b, BTTV_TERRATVALUE,   "Terratec TValue" }, // ??
+	{ 0x5018153b, BTTV_TERRATVALUE,   "Terratec TValue" },       // ??
+	{ 0xff3b153b, BTTV_TERRATVALUER,  "Terratec TValue Radio" }, // ??
 
 	{ 0x400015b0, BTTV_ZOLTRIX_GENIE, "Zoltrix Genie TV" },
 	{ 0x400a15b0, BTTV_ZOLTRIX_GENIE, "Zoltrix Genie TV" },
@@ -270,6 +274,8 @@ static struct CARD {
 	{ 0xa0fca1a0, BTTV_ZOLTRIX,       "Face to Face Tvmax" },
 	{ 0x20007063, BTTV_PC_HDTV,       "pcHDTV HD-2000 TV"},
 	{ 0x82b2aa6a, BTTV_SIMUS_GVC1100, "SIMUS GVC1100" },
+	{ 0x146caa0c, BTTV_PV951,         "ituner spectra8" },
+ 	{ 0x200a1295, BTTV_PXC200,        "ImageNation PXC200A" },
 
 	{ 0x40111554, BTTV_PV_BT878P_9B,  "Prolink Pixelview PV-BT" },
 	{ 0x17de0a01, BTTV_KWORLD,        "Mecer TV/FM/Video Tuner" },
@@ -281,6 +287,7 @@ static struct CARD {
 	{ 0x01010071, BTTV_NEBULA_DIGITV, "Nebula Electronics DigiTV" },
 	{ 0x002611bd, BTTV_TWINHAN_DST,   "Pinnacle PCTV SAT CI" },
 	{ 0x00011822, BTTV_TWINHAN_DST,   "Twinhan VisionPlus DVB-T" },
+	{ 0xfc00270f, BTTV_TWINHAN_DST,   "ChainTech digitop DST-1000 DVB-S" },
 	
 	{ 0, -1, NULL }
 };
@@ -597,6 +604,7 @@ struct tvcard bttv_tvcards[] = {
 	.needs_tvaudio	= 1,
 	.pll		= PLL_28,
 	.tuner_type	= -1,
+	.has_remote     = 1,
 },{
 	.name           = "Terratec TerraTV+ Version 1.0 (Bt848)/ Terra TValue Version 1.0/ Vobis TV-Boostar",
 	.video_inputs	= 3,
@@ -688,6 +696,8 @@ struct tvcard bttv_tvcards[] = {
 	.audiomux	= { 0 },
 	.needs_tvaudio	= 1,
 	.tuner_type	= -1,
+	.muxsel_hook    = PXC200_muxsel,
+
 },{
 	.name		= "Lifeview FlyVideo 98 LR50",
 	.video_inputs	= 4,
@@ -741,9 +751,15 @@ struct tvcard bttv_tvcards[] = {
 	.audio_inputs	= 1,
 	.tuner		= 0,
 	.svhs		= 2,
-	.gpiomask	= 0xc33000,
 	.muxsel		= { 2, 3, 1, 1, 0}, // TV, CVid, SVid, CVid over SVid connector
-	.audiomux	= { 0x422000,0x1000,0x0000,0x620000,0x800000},
+#if 0
+	.gpiomask	= 0xc33000,
+	.audiomux	= { 0x422000,0x1000,0x0000,0x620000,0x800000 },
+#else
+	/* Alexander Varakin <avarakin@hotmail.com> [stereo version] */
+	.gpiomask	= 0xb33000,
+	.audiomux	= { 0x122000,0x1000,0x0000,0x620000,0x800000 },
+#endif
 	/* Audio Routing for "WinFast 2000 XP" (no tv stereo !)
 		gpio23 -- hef4052:nEnable (0x800000)
 		gpio12 -- hef4052:A1
@@ -810,6 +826,7 @@ struct tvcard bttv_tvcards[] = {
 	.needs_tvaudio	= 1,
 	.pll		= PLL_28,
 	.tuner_type	= 1,
+	.has_remote     = 1,
 },{
 	.name		= "Pinnacle PCTV Studio/Rave",
 	.video_inputs	= 3,
@@ -819,7 +836,7 @@ struct tvcard bttv_tvcards[] = {
 	.gpiomask	= 0x03000F,
 	.muxsel		= { 2, 3, 1, 1},
 	.audiomux	= { 2, 0, 0, 0, 1},
-	.needs_tvaudio	= 1,
+	.needs_tvaudio	= 0,
 	.pll		= PLL_28,
 	.tuner_type	= -1,
 },{
@@ -968,6 +985,7 @@ struct tvcard bttv_tvcards[] = {
 	.no_msp34xx	= 1,
 	.pll		= PLL_28,
 	.tuner_type	= TUNER_PHILIPS_PAL_I,
+	.has_remote	= 1,
 	/* GPIO wiring: (different from Rev.4C !)
 		GPIO17: U4.A0 (first hef4052bt)
 		GPIO19: U4.A1
@@ -1009,7 +1027,7 @@ struct tvcard bttv_tvcards[] = {
 			   MUX2 (mask 0x30000):
 				0,2,3= from MSP34xx
 				1= FM stereo Radio from Tuner */
-	.needs_tvaudio  = 1,
+	.needs_tvaudio  = 0,
 	.pll            = PLL_28,
 	.tuner_type     = -1,
 },{
@@ -1448,11 +1466,11 @@ struct tvcard bttv_tvcards[] = {
 	.svhs           = 2,
 	.gpiomask       = 0x0f0f80,
 	.muxsel         = {2, 3, 1, 0},
-	.audiomux       = {0x030000, 0x010000, 0x030000, 0, 0x020000, 0},
+	.audiomux       = {0x030000, 0x010000, 0, 0, 0x020000, 0},
 	.no_msp34xx     = 1,
 	.pll            = PLL_28,
 	.tuner_type     = TUNER_PHILIPS_NTSC_M,
-	.audio_hook     = gvbctv3pci_audio,
+	.audio_hook     = gvbctv5pci_audio,
 	.has_radio      = 1,
 },{
 	.name           = "Osprey 100/150 (878)", /* 0x1(2|3)-45C6-C1 */
@@ -1774,6 +1792,8 @@ struct tvcard bttv_tvcards[] = {
 
 	/* ---- card 0x68 ---------------------------------- */
 	.name           = "Nebula Electronics DigiTV",
+	.video_inputs   = 1,
+        .tuner          = -1,
 	.svhs           = -1,
 	.muxsel         = { 2, 3, 1, 0},
 	.no_msp34xx     = 1,
@@ -1961,6 +1981,37 @@ struct tvcard bttv_tvcards[] = {
         .no_tda9875     = 1,
         .no_tda7432     = 1,
         .needs_tvaudio  = 0,
+},{
+	/* Helmroos Harri <harri.helmroos@pp.inet.fi> */
+	.name           = "Tekram M205 PRO",
+	.video_inputs   = 3,
+	.audio_inputs   = 1,
+	.tuner          = 0,
+	.tuner_type     = TUNER_PHILIPS_PAL,
+	.svhs           = 2,
+	.needs_tvaudio  = 0,
+	.gpiomask       = 0x68,
+	.muxsel         = { 2, 3, 1},
+	.audiomux       = { 0x68, 0x68, 0x61, 0x61, 0x00 },
+	.pll            = PLL_28,
+},{
+
+	/* ---- card 0x78 ---------------------------------- */
+	/* Javier Cendan Ares <jcendan@lycos.es> */
+	/* bt878 TV + FM without subsystem ID */
+	.name           = "Conceptronic CONTVFMi",
+	.video_inputs   = 3,
+	.audio_inputs   = 1,
+	.tuner          = 0,
+	.svhs           = 2,
+	.gpiomask       = 0x008007,
+	.muxsel         = { 2, 3, 1, 1 },
+	.audiomux       = { 0, 1, 2, 2, 3 },
+	.needs_tvaudio  = 0,
+	.pll            = PLL_28,
+	.tuner_type     = TUNER_PHILIPS_PAL,
+	.has_remote     = 1,
+	.has_radio      = 1,
 }};
 
 const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards);
@@ -2329,6 +2380,9 @@ void __devinit bttv_init_card1(struct bt
 	case BTTV_HAUPPAUGEPVR:
 		pvr_boot(btv);
 		break;
+	case BTTV_TWINHAN_DST:
+		btv->use_i2c_hw = 1;
+		break;
 	}
 }
 
@@ -3032,7 +3086,7 @@ static void __devinit init_PXC200(struct
 	u32 val;
 	
 	/* Initialise GPIO-connevted stuff */
-	gpio_bits(0xffffff, (1<<13));
+	gpio_inout(0xffffff, (1<<13));
 	gpio_write(0);
 	udelay(3);
 	gpio_write(1<<13);
@@ -3340,6 +3394,61 @@ gvbctv3pci_audio(struct bttv *btv, struc
 	}
 }
 
+static void
+gvbctv5pci_audio(struct bttv *btv, struct video_audio *v, int set)
+{
+	unsigned int val, con;
+
+#if BTTV_VERSION_CODE > KERNEL_VERSION(0,8,0)
+	if (btv->radio_user)
+		return;
+#else
+	if (btv->radio)
+		return;
+#endif
+
+	val = gpio_read();
+	if (set) {
+		con = 0x000;
+		if (v->mode & VIDEO_SOUND_LANG2) {
+			if (v->mode & VIDEO_SOUND_LANG1) {
+				/* LANG1 + LANG2 */
+				con = 0x100;
+			}
+			else {
+				/* LANG2 */
+				con = 0x300;
+			}
+		}
+		if (con != (val & 0x300)) {
+			gpio_bits(0x300, con);
+			if (bttv_gpio)
+				bttv_gpio_tracking(btv,"gvbctv5pci");
+		}
+	} else {
+		switch (val & 0x70) {
+		  case 0x10:
+			v->mode = VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
+			break;
+		  case 0x30:
+			v->mode = VIDEO_SOUND_LANG2;
+			break;
+		  case 0x50:
+			v->mode = VIDEO_SOUND_LANG1;
+			break;
+		  case 0x60:
+			v->mode = VIDEO_SOUND_STEREO;
+			break;
+		  case 0x70:
+			v->mode = VIDEO_SOUND_MONO;
+			break;
+		  default:
+			v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
+				  VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
+		}
+	}
+}
+
 /*
  * Mario Medina Nussbaum <medisoft@alohabbs.org.mx>
  *  I discover that on BT848_GPIO_DATA address a byte 0xcce enable stereo,
@@ -3830,6 +3939,86 @@ int __devinit bttv_handle_chipset(struct
 }
 
 
+/* PXC200 muxsel helper
+ * luke@syseng.anu.edu.au
+ * another transplant
+ * from Alessandro Rubini (rubini@linux.it)
+ *
+ * There are 4 kinds of cards:
+ * PXC200L which is bt848
+ * PXC200F which is bt848 with PIC controlling mux
+ * PXC200AL which is bt878
+ * PXC200AF which is bt878 with PIC controlling mux
+ */
+#define PX_CFG_PXC200F 0x01
+#define PX_FLAG_PXC200A  0x00001000 /* a pxc200A is bt-878 based */
+#define PX_I2C_PIC       0x0f
+#define PX_PXC200A_CARDID 0x200a1295
+#define PX_I2C_CMD_CFG   0x00
+
+static void PXC200_muxsel(struct bttv *btv, unsigned int input)
+{
+        int rc;
+	long mux;
+	int bitmask;
+        unsigned char buf[2];
+
+	/* Read PIC config to determine if this is a PXC200F */
+	/* PX_I2C_CMD_CFG*/
+	buf[0]=0;
+	buf[1]=0;
+	rc=bttv_I2CWrite(btv,(PX_I2C_PIC<<1),buf[0],buf[1],1);
+	if (rc) {
+	  printk(KERN_DEBUG "bttv%d: PXC200_muxsel: pic cfg write failed:%d\n", btv->c.nr,rc);
+	  /* not PXC ? do nothing */
+	  return;
+	}
+
+	rc=bttv_I2CRead(btv,(PX_I2C_PIC<<1),0);
+	if (!(rc & PX_CFG_PXC200F)) {
+	  printk(KERN_DEBUG "bttv%d: PXC200_muxsel: not PXC200F rc:%d \n", btv->c.nr,rc);
+	  return;
+	}
+
+
+	/* The multiplexer in the 200F is handled by the GPIO port */
+	/* get correct mapping between inputs  */
+	/*  mux = bttv_tvcards[btv->type].muxsel[input] & 3; */
+	/* ** not needed!?   */
+	mux = input;
+
+	/* make sure output pins are enabled */
+	/* bitmask=0x30f; */
+	bitmask=0x302;
+	/* check whether we have a PXC200A */
+ 	if (btv->cardid == PX_PXC200A_CARDID)  {
+	   bitmask ^= 0x180; /* use 7 and 9, not 8 and 9 */
+	   bitmask |= 7<<4; /* the DAC */
+	}
+	btwrite(bitmask, BT848_GPIO_OUT_EN);
+
+	bitmask = btread(BT848_GPIO_DATA);
+ 	if (btv->cardid == PX_PXC200A_CARDID)
+	  bitmask = (bitmask & ~0x280) | ((mux & 2) << 8) | ((mux & 1) << 7);
+	else /* older device */
+	  bitmask = (bitmask & ~0x300) | ((mux & 3) << 8);
+	btwrite(bitmask,BT848_GPIO_DATA);
+
+	/*
+	 * Was "to be safe, set the bt848 to input 0"
+	 * Actually, since it's ok at load time, better not messing
+	 * with these bits (on PXC200AF you need to set mux 2 here)
+	 *
+	 * needed because bttv-driver sets mux before calling this function
+	 */
+ 	if (btv->cardid == PX_PXC200A_CARDID)
+	  btaor(2<<5, ~BT848_IFORM_MUXSEL, BT848_IFORM);
+	else /* older device */
+	  btand(~BT848_IFORM_MUXSEL,BT848_IFORM);
+
+	printk(KERN_DEBUG "bttv%d: setting input channel to:%d\n", btv->c.nr,(int)mux);
+}
+
 /*
  * Local variables:
  * c-basic-offset: 8
--- diff/drivers/media/video/bttv-driver.c	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/media/video/bttv-driver.c	2004-04-21 10:45:34.347481888 +0100
@@ -59,6 +59,7 @@ static unsigned int gbufsize = 0x208000;
 static int video_nr = -1;
 static int radio_nr = -1;
 static int vbi_nr = -1;
+static int debug_latency = 0;
 
 static unsigned int fdsr = 0;
 
@@ -98,6 +99,7 @@ MODULE_PARM_DESC(gbufsize,"size of the c
 MODULE_PARM(video_nr,"i");
 MODULE_PARM(radio_nr,"i");
 MODULE_PARM(vbi_nr,"i");
+MODULE_PARM(debug_latency,"i");
 
 MODULE_PARM(fdsr,"i");
 
@@ -795,6 +797,7 @@ static void bt848_bright(struct bttv *bt
 {
 	int value;
 
+	// printk("bttv: set bright: %d\n",bright); // DEBUG
 	btv->bright = bright;
 
 	/* We want -128 to 127 we get 0-65535 */
@@ -1048,6 +1051,11 @@ static void init_bt848(struct bttv *btv)
 	btwrite(whitecrush_upper, BT848_WC_UP);
 	btwrite(whitecrush_lower, BT848_WC_DOWN);
 
+	bt848_bright(btv,   btv->bright);
+	bt848_hue(btv,      btv->hue);
+	bt848_contrast(btv, btv->contrast);
+	bt848_sat(btv,      btv->saturation);
+
 	if (btv->opt_lumafilter) {
 		btwrite(0, BT848_E_CONTROL);
 		btwrite(0, BT848_O_CONTROL);
@@ -2170,13 +2178,13 @@ static int bttv_do_ioctl(struct inode *i
 				VID_TYPE_OVERLAY|
 				VID_TYPE_CLIPPING|
 				VID_TYPE_SCALES;
-			cap->channels  = bttv_tvcards[btv->c.type].video_inputs;
-			cap->audios    = bttv_tvcards[btv->c.type].audio_inputs;
 			cap->maxwidth  = bttv_tvnorms[btv->tvnorm].swidth;
 			cap->maxheight = bttv_tvnorms[btv->tvnorm].sheight;
 			cap->minwidth  = 48;
 			cap->minheight = 32;
 		}
+		cap->channels  = bttv_tvcards[btv->c.type].video_inputs;
+		cap->audios    = bttv_tvcards[btv->c.type].audio_inputs;
                 return 0;
 	}
 
@@ -3155,10 +3163,27 @@ static struct video_device radio_templat
 /* ----------------------------------------------------------------------- */
 /* irq handler                                                             */
 
-static char *irq_name[] = { "FMTCHG", "VSYNC", "HSYNC", "OFLOW", "HLOCK",
-			    "VPRES", "6", "7", "I2CDONE", "GPINT", "10",
-			    "RISCI", "FBUS", "FTRGT", "FDSR", "PPERR",
-			    "RIPERR", "PABORT", "OCERR", "SCERR" };
+static char *irq_name[] = {
+	"FMTCHG",  // format change detected (525 vs. 625)
+	"VSYNC",   // vertical sync (new field)
+	"HSYNC",   // horizontal sync
+	"OFLOW",   // chroma/luma AGC overflow
+	"HLOCK",   // horizontal lock changed
+	"VPRES",   // video presence changed
+	"6", "7",
+	"I2CDONE", // hw irc operation finished
+	"GPINT",   // gpio port triggered irq
+	"10",
+	"RISCI",   // risc instruction triggered irq
+	"FBUS",    // pixel data fifo dropped data (high pci bus latencies)
+	"FTRGT",   // pixel data fifo overrun
+	"FDSR",    // fifo data stream resyncronisation
+	"PPERR",   // parity error (data transfer)
+	"RIPERR",  // parity error (read risc instructions)
+	"PABORT",  // pci abort
+	"OCERR",   // risc instruction error
+	"SCERR",   // syncronisation error
+};
 
 static void bttv_print_irqbits(u32 print, u32 mark)
 {
@@ -3188,6 +3213,28 @@ static void bttv_print_riscaddr(struct b
 	       btv->screen ? (unsigned long long)btv->screen->bottom.dma : 0);
 }
 
+static void bttv_irq_debug_low_latency(struct bttv *btv, u32 rc)
+{
+	printk("bttv%d: irq: skipped frame [main=%lx,o_vbi=%lx,o_field=%lx,rc=%lx]\n",
+	       btv->c.nr,
+	       (unsigned long)btv->main.dma,
+	       (unsigned long)btv->main.cpu[RISC_SLOT_O_VBI+1],
+	       (unsigned long)btv->main.cpu[RISC_SLOT_O_FIELD+1],
+	       (unsigned long)rc);
+
+	if (0 == (btread(BT848_DSTATUS) & BT848_DSTATUS_HLOC)) {
+		printk("bttv%d: Oh, there (temporarely?) is no input signal. "
+		       "Ok, then this is harmless, don't worry ;)",
+		       btv->c.nr);
+		return;
+	}
+	printk("bttv%d: Uhm. Looks like we have unusual high IRQ latencies.\n",
+	       btv->c.nr);
+	printk("bttv%d: Lets try to catch the culpit red-handed ...\n",
+	       btv->c.nr);
+	dump_stack();
+}
+
 static int
 bttv_irq_next_set(struct bttv *btv, struct bttv_buffer_set *set)
 {
@@ -3306,8 +3353,8 @@ static void bttv_irq_timeout(unsigned lo
 	unsigned long flags;
 	
 	if (bttv_verbose) {
-		printk(KERN_INFO "bttv%d: timeout: irq=%d/%d, risc=%08x, ",
-		       btv->c.nr, btv->irq_me, btv->irq_total,
+		printk(KERN_INFO "bttv%d: timeout: drop=%d irq=%d/%d, risc=%08x, ",
+		       btv->c.nr, btv->framedrop, btv->irq_me, btv->irq_total,
 		       btread(BT848_RISC_COUNT));
 		bttv_print_irqbits(btread(BT848_INT_STAT),0);
 		printk("\n");
@@ -3376,14 +3423,9 @@ bttv_irq_switch_fields(struct bttv *btv)
 	bttv_irq_next_set(btv, &new);
 	rc = btread(BT848_RISC_COUNT);
 	if (rc < btv->main.dma || rc > btv->main.dma + 0x100) {
-		if (1 /* irq_debug */)
-			printk("bttv%d: skipped frame. no signal? high irq latency? "
-			       "[main=%lx,o_vbi=%lx,o_field=%lx,rc=%lx]\n",
-			       btv->c.nr,
-			       (unsigned long)btv->main.dma,
-			       (unsigned long)btv->main.cpu[RISC_SLOT_O_VBI+1],
-			       (unsigned long)btv->main.cpu[RISC_SLOT_O_FIELD+1],
-			       (unsigned long)rc);
+		btv->framedrop++;
+		if (debug_latency)
+			bttv_irq_debug_low_latency(btv, rc);
 		spin_unlock(&btv->s_lock);
 		return;
 	}
@@ -3870,11 +3912,6 @@ static int bttv_resume(struct pci_dev *p
 	gpio_inout(0xffffff, btv->state.gpio_enable);
 	gpio_write(btv->state.gpio_data);
 
-	bt848_bright(btv,   btv->bright);
-	bt848_hue(btv,      btv->hue);
-	bt848_contrast(btv, btv->contrast);
-	bt848_sat(btv,      btv->saturation);
-
 	/* restart dma */
 	spin_lock_irqsave(&btv->s_lock,flags);
 	btv->curr = btv->state.set;
--- diff/drivers/media/video/bttv-i2c.c	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/media/video/bttv-i2c.c	2004-04-21 10:45:34.347481888 +0100
@@ -414,12 +414,12 @@ void __devinit bttv_readee(struct bttv *
 /* init + register i2c algo-bit adapter */
 int __devinit init_bttv_i2c(struct bttv *btv)
 {
-	int use_hw = (btv->id == 878) && i2c_hw;
-
 	memcpy(&btv->i2c_client, &bttv_i2c_client_template,
 	       sizeof(bttv_i2c_client_template));
 
-	if (use_hw) {
+	if (i2c_hw)
+		btv->use_i2c_hw = 1;
+	if (btv->use_i2c_hw) {
 		/* bt878 */
 		memcpy(&btv->c.i2c_adap, &bttv_i2c_adap_hw_template,
 		       sizeof(bttv_i2c_adap_hw_template));
@@ -435,12 +435,13 @@ int __devinit init_bttv_i2c(struct bttv 
 
 	btv->c.i2c_adap.dev.parent = &btv->c.pci->dev;
 	snprintf(btv->c.i2c_adap.name, sizeof(btv->c.i2c_adap.name),
-		 "bt%d #%d [%s]", btv->id, btv->c.nr, use_hw ? "hw" : "sw");
+		 "bt%d #%d [%s]", btv->id, btv->c.nr,
+		 btv->use_i2c_hw ? "hw" : "sw");
 
         i2c_set_adapdata(&btv->c.i2c_adap, btv);
         btv->i2c_client.adapter = &btv->c.i2c_adap;
 
-	if (use_hw) {
+	if (btv->use_i2c_hw) {
 		btv->i2c_rc = i2c_add_adapter(&btv->c.i2c_adap);
 	} else {
 		bttv_bit_setscl(btv,1);
@@ -452,12 +453,10 @@ int __devinit init_bttv_i2c(struct bttv 
 
 int __devexit fini_bttv_i2c(struct bttv *btv)
 {
-	int use_hw = (btv->id == 878) && i2c_hw;
-
 	if (0 != btv->i2c_rc)
 		return 0;
 
-	if (use_hw) {
+	if (btv->use_i2c_hw) {
 		return i2c_del_adapter(&btv->c.i2c_adap);
 	} else {
 		return i2c_bit_del_bus(&btv->c.i2c_adap);
--- diff/drivers/media/video/bttvp.h	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/media/video/bttvp.h	2004-04-21 10:45:34.348481736 +0100
@@ -25,7 +25,7 @@
 #define _BTTVP_H_
 
 #include <linux/version.h>
-#define BTTV_VERSION_CODE KERNEL_VERSION(0,9,12)
+#define BTTV_VERSION_CODE KERNEL_VERSION(0,9,14)
 
 #include <linux/types.h>
 #include <linux/wait.h>
@@ -298,6 +298,7 @@ struct bttv {
 	struct bttv_pll_info pll;
 	int triton1;
 	int gpioirq;
+	int use_i2c_hw;
 
 	/* old gpio interface */
 	wait_queue_head_t gpioq;
@@ -384,9 +385,10 @@ struct bttv {
 	struct bttv_suspend_state state;
 
 	/* stats */
+	unsigned int errors;
+	unsigned int framedrop;
 	unsigned int irq_total;
 	unsigned int irq_me;
-	unsigned int errors;
 
 	unsigned int users;
 	struct bttv_fh init;
--- diff/drivers/media/video/cx88/Makefile	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/media/video/cx88/Makefile	2004-04-21 10:45:34.348481736 +0100
@@ -1,5 +1,5 @@
 cx88xx-objs	:= cx88-cards.o cx88-core.o
-cx8800-objs	:= cx88-video.o cx88-tvaudio.o cx88-i2c.o
+cx8800-objs	:= cx88-video.o cx88-tvaudio.o cx88-i2c.o cx88-vbi.o
 
 obj-$(CONFIG_VIDEO_CX88) += cx88xx.o cx8800.o
 
--- diff/drivers/media/video/cx88/cx88-cards.c	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/media/video/cx88/cx88-cards.c	2004-04-21 10:45:34.349481584 +0100
@@ -52,16 +52,19 @@ struct cx88_board cx88_boards[] = {
 		.input          = {{
 			.type   = CX88_VMUX_TELEVISION,
 			.vmux   = 0,
-			//.gpio0  = 0xff03,
-			.gpio0  = 0xff01,
+			.gpio0  = 0xff00,  // internal decoder
 		},{
 			.type   = CX88_VMUX_DEBUG,
 			.vmux   = 0,
-			.gpio0  = 0xff00,
+			.gpio0  = 0xff01,  // mono from tuner chip
 		},{
 			.type   = CX88_VMUX_COMPOSITE1,
 			.vmux   = 1,
 			.gpio0  = 0xff02,
+		},{
+			.type   = CX88_VMUX_SVIDEO,
+			.vmux   = 2,
+			.gpio0  = 0xff02,
 		}},
 		.radio = {
 			.type   = CX88_RADIO,
@@ -92,21 +95,50 @@ struct cx88_board cx88_boards[] = {
 	},
 	[CX88_BOARD_ATI_WONDER_PRO] = {
 		.name           = "ATI TV Wonder Pro",
-		.tuner_type     = UNSET,
+		.tuner_type     = 44,
 		.input          = {{
 			.type   = CX88_VMUX_TELEVISION,
 			.vmux   = 0,
+		},{
+			.type   = CX88_VMUX_COMPOSITE1,
+			.vmux   = 1,
+		},{
+			.type   = CX88_VMUX_SVIDEO,
+			.vmux   = 2,
+
 		}},
 	},
         [CX88_BOARD_WINFAST2000XP] = {
                 .name           = "Leadtek Winfast 2000XP Expert",
-                .tuner_type     = 38,
+                .tuner_type     = 44,
                 .input          = {{
                         .type   = CX88_VMUX_TELEVISION,
                         .vmux   = 0,
+			.gpio0	= 0x00F5e700,
+			.gpio1  = 0x00003004,
+			.gpio2  = 0x00F5e700,
+			.gpio3  = 0x02000000,
+		},{
+			.type   = CX88_VMUX_COMPOSITE1,
+			.vmux   = 1,
+			.gpio0	= 0x00F5c700,
+			.gpio1  = 0x00003004,
+			.gpio2  = 0x00F5c700,
+			.gpio3  = 0x02000000,
+		},{
+			.type   = CX88_VMUX_SVIDEO,
+			.vmux   = 2,
+			.gpio0	= 0x00F5c700,
+			.gpio1  = 0x00003004,
+			.gpio2  = 0x00F5c700,
+			.gpio3  = 0x02000000,
                 }},
                 .radio = {
                         .type   = CX88_RADIO,
+			.gpio0	= 0x00F5d700,
+			.gpio1  = 0x00003004,
+			.gpio2  = 0x00F5d700,
+			.gpio3  = 0x02000000,
                 },
         },
 	[CX88_BOARD_AVERTV_303] = {
@@ -127,6 +159,10 @@ struct cx88_board cx88_boards[] = {
                         .type   = CX88_VMUX_COMPOSITE1,
                         .vmux   = 1,
 		},{
+			 // temporarly for testing ...
+                        .type   = CX88_VMUX_COMPOSITE2,
+                        .vmux   = 2,
+		},{
                         .type   = CX88_VMUX_SVIDEO,
                         .vmux   = 2,
                 }},
@@ -137,6 +173,7 @@ struct cx88_board cx88_boards[] = {
 	[CX88_BOARD_WINFAST_DV2000] = {
                 .name           = "Leadtek Winfast DV2000",
                 .tuner_type     = 38,
+		.needs_tda9887  = 1,
                 .input          = {{
                         .type   = CX88_VMUX_TELEVISION,
                         .vmux   = 0,
@@ -145,6 +182,24 @@ struct cx88_board cx88_boards[] = {
                         .type   = CX88_RADIO,
                 },
         },
+        [CX88_BOARD_LEADTEK_PVR2000] = {
+                .name           = "Leadtek PVR 2000",
+                .tuner_type     = 38,
+                .input          = {{
+                        .type   = CX88_VMUX_TELEVISION,
+                        .vmux   = 0,
+                },{
+                        .type   = CX88_VMUX_COMPOSITE1,
+                        .vmux   = 1,
+                },{
+                        .type   = CX88_VMUX_SVIDEO,
+                        .vmux   = 2,
+                }},
+                .radio = {
+                        .type   = CX88_RADIO,
+                },
+        },
+
 
 };
 const unsigned int cx88_bcount = ARRAY_SIZE(cx88_boards);
@@ -178,10 +233,18 @@ struct cx88_subid cx88_subids[] = {
                 .subdevice = 0x6611,
                 .card      = CX88_BOARD_WINFAST2000XP,
 	},{
+                .subvendor = 0x107d,
+                .subdevice = 0x6613,	/* NTSC */
+                .card      = CX88_BOARD_WINFAST2000XP,
+	},{
 		.subvendor = 0x107d,
                 .subdevice = 0x6620,
                 .card      = CX88_BOARD_WINFAST_DV2000,
         },{
+                .subvendor = 0x107d,
+                .subdevice = 0x663C,
+                .card      = CX88_BOARD_LEADTEK_PVR2000,
+        },{
 		.subvendor = 0x1461,
 		.subdevice = 0x000b,
 		.card      = CX88_BOARD_AVERTV_303,
@@ -193,6 +256,34 @@ struct cx88_subid cx88_subids[] = {
 };
 const unsigned int cx88_idcount = ARRAY_SIZE(cx88_subids);
 
+
+/* ----------------------------------------------------------------------- */
+/* some leadtek specific stuff                                             */
+
+static void __devinit leadtek_eeprom(struct cx8800_dev *dev, u8 *eeprom_data)
+{
+	/* This is just for the Winfast 2000 XP board ATM; I don't have data on
+	 * any others.
+	 *
+	 * Byte 0 is 1 on the NTSC board.
+	 */
+
+	if (eeprom_data[4] != 0x7d ||
+	    eeprom_data[5] != 0x10 ||
+	    eeprom_data[7] != 0x66) {
+		printk(KERN_WARNING "%s Leadtek eeprom invalid.\n", dev->name);
+		return;
+	}
+
+	dev->has_radio  = 1;
+	dev->tuner_type = (eeprom_data[6] == 0x13) ? 43 : 38;
+
+	printk(KERN_INFO "%s: Leadtek Winfast 2000 XP config: "
+	       "tuner=%d, eeprom[0]=0x%02x\n",
+	       dev->name, dev->tuner_type, eeprom_data[0]);
+}
+
+
 /* ----------------------------------------------------------------------- */
 /* some hauppauge specific stuff                                           */
 
@@ -378,6 +469,11 @@ void __devinit cx88_card_setup(struct cx
 			i2c_eeprom(&dev->i2c_client,eeprom,sizeof(eeprom));
 		gdi_eeprom(dev,eeprom);
 		break;
+	case CX88_BOARD_WINFAST2000XP:
+		if (0 == dev->i2c_rc)
+			i2c_eeprom(&dev->i2c_client,eeprom,sizeof(eeprom));
+		leadtek_eeprom(dev,eeprom);
+		break;
 	}
 }
 
--- diff/drivers/media/video/cx88/cx88-core.c	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/media/video/cx88/cx88-core.c	2004-04-21 10:45:34.349481584 +0100
@@ -100,15 +100,6 @@ static const char *v4l2_ioctls[] = {
 };
 #define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
 
-static const char *osspcm_ioctls[] = {
-	"RESET", "SYNC", "SPEED", "STEREO", "GETBLKSIZE", "SETFMT",
-	"CHANNELS", "?", "POST", "SUBDIVIDE", "SETFRAGMENT", "GETFMTS",
-	"GETOSPACE", "GETISPACE", "NONBLOCK", "GETCAPS", "GET/SETTRIGGER",
-	"GETIPTR", "GETOPTR", "MAPINBUF", "MAPOUTBUF", "SETSYNCRO",
-	"SETDUPLEX", "GETODELAY"
-};
-#define OSSPCM_IOCTLS ARRAY_SIZE(v4l2_ioctls)
-
 void cx88_print_ioctl(char *name, unsigned int cmd)
 {
 	char *dir;
@@ -131,15 +122,6 @@ void cx88_print_ioctl(char *name, unsign
 		       name, cmd, dir, (_IOC_NR(cmd) < V4L2_IOCTLS) ?
 		       v4l2_ioctls[_IOC_NR(cmd)] : "???");
 		break;
-	case 'P':
-		printk(KERN_DEBUG "%s: ioctl 0x%08x (oss dsp, %s, SNDCTL_DSP_%s)\n",
-		       name, cmd, dir, (_IOC_NR(cmd) < OSSPCM_IOCTLS) ?
-		       osspcm_ioctls[_IOC_NR(cmd)] : "???");
-		break;
-	case 'M':
-		printk(KERN_DEBUG "%s: ioctl 0x%08x (oss mixer, %s, #%d)\n",
-		       name, cmd, dir, _IOC_NR(cmd));
-		break;
 	default:
 		printk(KERN_DEBUG "%s: ioctl 0x%08x (???, %s, #%d)\n",
 		       name, cmd, dir, _IOC_NR(cmd));
@@ -296,6 +278,7 @@ struct sram_channel cx88_sram_channels[]
 		.name       = "video y / packed",
 		.cmds_start = 0x180040,
 		.ctrl_start = 0x180400,
+	        .cdt        = 0x180400 + 64,
 		.fifo_start = 0x180c00,
 		.fifo_size  = 0x002800,
 		.ptr1_reg   = MO_DMA21_PTR1,
@@ -307,6 +290,7 @@ struct sram_channel cx88_sram_channels[]
 		.name       = "video u",
 		.cmds_start = 0x180080,
 		.ctrl_start = 0x1804a0,
+	        .cdt        = 0x1804a0 + 64,
 		.fifo_start = 0x183400,
 		.fifo_size  = 0x000800,
 		.ptr1_reg   = MO_DMA22_PTR1,
@@ -318,6 +302,7 @@ struct sram_channel cx88_sram_channels[]
 		.name       = "video v",
 		.cmds_start = 0x1800c0,
 		.ctrl_start = 0x180540,
+	        .cdt        = 0x180540 + 64,
 		.fifo_start = 0x183c00,
 		.fifo_size  = 0x000800,
 		.ptr1_reg   = MO_DMA23_PTR1,
@@ -329,6 +314,7 @@ struct sram_channel cx88_sram_channels[]
 		.name       = "vbi",
 		.cmds_start = 0x180100,
 		.ctrl_start = 0x1805e0,
+	        .cdt        = 0x1805e0 + 64,
 		.fifo_start = 0x184400,
 		.fifo_size  = 0x001000,
 		.ptr1_reg   = MO_DMA24_PTR1,
@@ -340,6 +326,7 @@ struct sram_channel cx88_sram_channels[]
 		.name       = "audio from",
 		.cmds_start = 0x180140,
 		.ctrl_start = 0x180680,
+	        .cdt        = 0x180680 + 64,
 		.fifo_start = 0x185400,
 		.fifo_size  = 0x000200,
 		.ptr1_reg   = MO_DMA25_PTR1,
@@ -351,8 +338,9 @@ struct sram_channel cx88_sram_channels[]
 		.name       = "audio to",
 		.cmds_start = 0x180180,
 		.ctrl_start = 0x180720,
-		.fifo_start = 0x185600,
-		.fifo_size  = 0x000200,
+	        .cdt        = 0x180680 + 64,  /* same as audio IN */
+		.fifo_start = 0x185400,       /* same as audio IN */
+		.fifo_size  = 0x000200,       /* same as audio IN */
 		.ptr1_reg   = MO_DMA26_PTR1,
 		.ptr2_reg   = MO_DMA26_PTR2,
 		.cnt1_reg   = MO_DMA26_CNT1,
@@ -368,7 +356,7 @@ int cx88_sram_channel_setup(struct cx880
 	u32 cdt;
 
 	bpl   = (bpl + 7) & ~7; /* alignment */
-	cdt   = ch->ctrl_start + 64;
+	cdt   = ch->cdt;
 	lines = ch->fifo_size / bpl;
 	if (lines > 6)
 		lines = 6;
@@ -429,13 +417,13 @@ int cx88_risc_decode(u32 risc)
 	};
 	int i;
 
-	printk("0x%08x [ %s", risc, instr[risc >> 28] ?
-				instr[risc >> 28] : "INVALID");
+	printk("0x%08x [ %s", risc,
+	       instr[risc >> 28] ? instr[risc >> 28] : "INVALID");
 	for (i = ARRAY_SIZE(bits)-1; i >= 0; i--)
 		if (risc & (1 << (i + 12)))
 			printk(" %s",bits[i]);
 	printk(" count=%d ]\n", risc & 0xfff);
-	return incr[risc >> 28] ? 1 : incr[risc >> 28];
+	return incr[risc >> 28] ? incr[risc >> 28] : 1;
 }
 
 void cx88_risc_disasm(struct cx8800_dev *dev,
--- diff/drivers/media/video/cx88/cx88-i2c.c	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/media/video/cx88/cx88-i2c.c	2004-04-21 10:45:34.350481432 +0100
@@ -152,7 +152,7 @@ int __devinit cx8800_i2c_init(struct cx8
 	       sizeof(dev->i2c_client));
 
 	dev->i2c_adap.dev.parent = &dev->pci->dev;
-	strcpy(dev->i2c_adap.name,dev->name);
+	strlcpy(dev->i2c_adap.name,dev->name,sizeof(dev->i2c_adap.name));
         dev->i2c_algo.data = dev;
         i2c_set_adapdata(&dev->i2c_adap,dev);
         dev->i2c_adap.algo_data = &dev->i2c_algo;
@@ -162,6 +162,8 @@ int __devinit cx8800_i2c_init(struct cx8
 	cx8800_bit_setsda(dev,1);
 
 	dev->i2c_rc = i2c_bit_add_bus(&dev->i2c_adap);
+	printk("%s: i2c register %s\n", dev->name,
+	       (0 == dev->i2c_rc) ? "ok" : "FAILED");
 	return dev->i2c_rc;
 }
 
--- diff/drivers/media/video/cx88/cx88-reg.h	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/media/video/cx88/cx88-reg.h	2004-04-21 10:45:34.350481432 +0100
@@ -146,6 +146,8 @@
 #define MO_INPUT_FORMAT     0x310104
 #define MO_AGC_BURST        0x31010c
 #define MO_CONTR_BRIGHT     0x310110
+#define MO_UV_SATURATION    0x310114
+#define MO_HUE              0x310118
 #define MO_HTOTAL           0x310120
 #define MO_HDELAY_EVEN      0x310124
 #define MO_HDELAY_ODD       0x310128
@@ -175,6 +177,7 @@
 #define MO_VBI_PACKET       0x310188 // vbi packet size / delay
 #define MO_FIELD_COUNT      0x310190 // field counter
 #define MO_VIP_CONFIG       0x310194
+#define MO_VBOS_CONTROL	    0x3101a8
 
 #define MO_AGC_BACK_VBI     0x310200
 #define MO_AGC_SYNC_TIP1    0x310208
@@ -406,7 +409,7 @@
 #define AUD_PDF_DDS_CNST_BYTE1   0x320d02
 #define AUD_PDF_DDS_CNST_BYTE0   0x320d03
 #define AUD_PHACC_FREQ_8MSB      0x320d2a
-#define AUD_PHACC_FREQ_8LSB      0x320d23
+#define AUD_PHACC_FREQ_8LSB      0x320d2b
 #define AUD_QAM_MODE             0x320d04
 
 
--- diff/drivers/media/video/cx88/cx88-tvaudio.c	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/media/video/cx88/cx88-tvaudio.c	2004-04-21 10:45:34.351481280 +0100
@@ -14,7 +14,7 @@
     Some of this comes from party done linux driver sources I got from
     [undocumented].
 
-    Some comes from the dscaler sources, the dscaler driver guy works
+    Some comes from the dscaler sources, one of the dscaler driver guy works
     for Conexant ...
     
     -----------------------------------------------------------------------
@@ -51,7 +51,7 @@
 
 #include "cx88.h"
 
-static unsigned int audio_debug = UNSET;
+static unsigned int audio_debug = 1;
 MODULE_PARM(audio_debug,"i");
 MODULE_PARM_DESC(audio_debug,"enable debug messages [audio]");
 
@@ -70,30 +70,81 @@ static void set_audio_registers(struct c
 {
 	int i;
 
-	for (i = 0; l[i].reg; i++)
-		cx_write(l[i].reg, l[i].val);
+	for (i = 0; l[i].reg; i++) {
+		switch (l[i].reg) {
+		case AUD_PDF_DDS_CNST_BYTE2:
+		case AUD_PDF_DDS_CNST_BYTE1:
+		case AUD_PDF_DDS_CNST_BYTE0:
+		case AUD_QAM_MODE:
+		case AUD_PHACC_FREQ_8MSB:
+		case AUD_PHACC_FREQ_8LSB:
+			cx_writeb(l[i].reg, l[i].val);
+			break;
+		default:
+			cx_write(l[i].reg, l[i].val);
+			break;
+		}
+	}
+}
+
+static void set_audio_start(struct cx8800_dev *dev,
+			    u32 mode, u32 ctl)
+{
+	// mute
+	cx_write(AUD_VOL_CTL,       (1 << 6));
+
+	//  increase level of input by 12dB
+	cx_write(AUD_AFE_12DB_EN,   0x0001);
+
+	// start programming
+	cx_write(AUD_CTL,           0x0000);
+	cx_write(AUD_INIT,          mode);
+	cx_write(AUD_INIT_LD,       0x0001);
+	cx_write(AUD_SOFT_RESET,    0x0001);
+
+	cx_write(AUD_CTL,           ctl);
+}
+
+static void set_audio_finish(struct cx8800_dev *dev)
+{
+	u32 volume;
+
+	// finish programming
+	cx_write(AUD_SOFT_RESET, 0x0000);
+
+	// start audio processing
+	cx_set(AUD_CTL, EN_DAC_ENABLE);
+
+	// unmute
+	volume = cx_sread(SHADOW_AUD_VOL_CTL);
+	cx_swrite(SHADOW_AUD_VOL_CTL, AUD_VOL_CTL, volume);
 }
 
+/* ----------------------------------------------------------- */
+
 static void set_audio_standard_BTSC(struct cx8800_dev *dev, unsigned int sap)
 {
-	dprintk("set_audio_standard_BTSC() [TODO]\n");
+	static const struct rlist btsc[] = {
+		/* Magic stuff from leadtek driver + datasheet.*/
+		{ AUD_DBX_IN_GAIN,   0x4734 },
+		{ AUD_DBX_WBE_GAIN,  0x4640 },
+		{ AUD_DBX_SE_GAIN,   0x8D31 },
+		{ AUD_DEEMPH0_G0,    0x1604 },
+		{ AUD_PHASE_FIX_CTL, 0x0020 },
+
+                { /* end of list */ },
+	};
+
+	dprintk("%s (status: unknown)\n",__FUNCTION__);
+	set_audio_start(dev, 0x0001,
+			EN_BTSC_AUTO_STEREO);
+        set_audio_registers(dev, btsc);
+	set_audio_finish(dev);
 }
 
 static void set_audio_standard_NICAM(struct cx8800_dev *dev)
 {
 	static const struct rlist nicam[] = {
-		//  increase level of input by 12dB
-		{ AUD_AFE_12DB_EN,         0x00000001 },
-
-    		// initialize NICAM                 
-    		{ AUD_INIT,                0x00000010 },
-    		{ AUD_INIT_LD,             0x00000001 },
-    		{ AUD_SOFT_RESET,          0x00000001 },
-    
-   		// WARNING!!!! Stereo mode is FORCED!!!!
-    		{ AUD_CTL,                 EN_DAC_ENABLE | EN_DMTRX_LR | EN_NICAM_FORCE_STEREO },
-    
-    		{ AUD_SOFT_RESET,          0x00000001 },
     		{ AUD_RATE_ADJ1,           0x00000010 },
     		{ AUD_RATE_ADJ2,           0x00000040 },
     		{ AUD_RATE_ADJ3,           0x00000100 },
@@ -101,43 +152,235 @@ static void set_audio_standard_NICAM(str
     		{ AUD_RATE_ADJ5,           0x00001000 },
     //		{ AUD_DMD_RA_DDS,          0x00c0d5ce },
 
+		// setup QAM registers
+		{ AUD_PDF_DDS_CNST_BYTE2,  0x06 },
+		{ AUD_PDF_DDS_CNST_BYTE1,  0x82 },
+		{ AUD_PDF_DDS_CNST_BYTE0,  0x16 },
+		{ AUD_QAM_MODE,            0x05 },
+		{ AUD_PHACC_FREQ_8MSB,     0x34 },
+		{ AUD_PHACC_FREQ_8LSB,     0x4c },
+
                 { /* end of list */ },
         };
 
-        printk("set_audio_standard_NICAM()\n");
+	dprintk("%s (status: unknown)\n",__FUNCTION__);
+        set_audio_start(dev, 0x0010,
+			EN_DMTRX_LR | EN_NICAM_FORCE_STEREO);
         set_audio_registers(dev, nicam);
+        set_audio_finish(dev);
+}
 
-    	// setup QAM registers
-    	cx_write(0x320d01,                0x06);
-    	cx_write(0x320d02,                0x82);
-    	cx_write(0x320d03,                0x16);
-    	cx_write(0x320d04,                0x05);
-    	cx_write(0x320d2a,                0x34);
-    	cx_write(0x320d2b,                0x4c);
-
-    	// setup Audio PLL
-    	//cx_write(AUD_PLL_PRESCALE,        0x0002);
-    	//cx_write(AUD_PLL_INT,             0x001f);
+static void set_audio_standard_NICAM_L(struct cx8800_dev *dev)
+{
+	/* This is officially wierd.. register dumps indicate windows
+	 * uses audio mode 4.. A2. Let's operate and find out. */
 
-    	// de-assert Audio soft reset
-    	cx_write(AUD_SOFT_RESET,          0x00000000);  // Causes a pop every time
+	static const struct rlist nicam_l[] = {
+		// setup QAM registers
+		{ AUD_PDF_DDS_CNST_BYTE2,	   0x48 },
+		{ AUD_PDF_DDS_CNST_BYTE1,          0x3d },
+		{ AUD_PDF_DDS_CNST_BYTE0,          0xf5 },
+		{ AUD_QAM_MODE,                    0x00 },
+		{ AUD_PHACC_FREQ_8MSB,             0x3a },
+		{ AUD_PHACC_FREQ_8LSB,             0x4a },
+
+		{ AUD_POLY0_DDS_CONSTANT,          0x000e4db2 },
+		{ AUD_IIR1_0_SEL,                  0x00000000 },
+		{ AUD_IIR1_1_SEL,                  0x00000002 },
+		{ AUD_IIR1_2_SEL,                  0x00000023 },
+		{ AUD_IIR1_3_SEL,                  0x00000004 },
+		{ AUD_IIR1_4_SEL,                  0x00000005 },
+		{ AUD_IIR1_5_SEL,                  0x00000007 },
+		{ AUD_IIR1_0_SHIFT,                0x00000007 },
+		{ AUD_IIR1_1_SHIFT,                0x00000000 },
+		{ AUD_IIR1_2_SHIFT,                0x00000000 },
+		{ AUD_IIR1_3_SHIFT,                0x00000007 },
+		{ AUD_IIR1_4_SHIFT,                0x00000007 },
+		{ AUD_IIR1_5_SHIFT,                0x00000007 },
+		{ AUD_IIR2_0_SEL,                  0x00000002 },
+		{ AUD_IIR2_1_SEL,                  0x00000003 },
+		{ AUD_IIR2_2_SEL,                  0x00000004 },
+		{ AUD_IIR2_3_SEL,                  0x00000005 },
+		{ AUD_IIR3_0_SEL,                  0x00000007 },
+		{ AUD_IIR3_1_SEL,                  0x00000023 },
+		{ AUD_IIR3_2_SEL,                  0x00000016 },
+		{ AUD_IIR4_0_SHIFT,                0x00000000 },
+		{ AUD_IIR4_1_SHIFT,                0x00000000 },
+		{ AUD_IIR3_2_SHIFT,                0x00000002 },
+		{ AUD_IIR4_0_SEL,                  0x0000001d },
+		{ AUD_IIR4_1_SEL,                  0x00000019 },
+		{ AUD_IIR4_2_SEL,                  0x00000008 },
+		{ AUD_IIR4_0_SHIFT,                0x00000000 },
+		{ AUD_IIR4_1_SHIFT,                0x00000007 },
+		{ AUD_IIR4_2_SHIFT,                0x00000007 },
+		{ AUD_IIR4_0_CA0,                  0x0003e57e },
+		{ AUD_IIR4_0_CA1,                  0x00005e11 },
+		{ AUD_IIR4_0_CA2,                  0x0003a7cf },
+		{ AUD_IIR4_0_CB0,                  0x00002368 },
+		{ AUD_IIR4_0_CB1,                  0x0003bf1b },
+		{ AUD_IIR4_1_CA0,                  0x00006349 },
+		{ AUD_IIR4_1_CA1,                  0x00006f27 },
+		{ AUD_IIR4_1_CA2,                  0x0000e7a3 },
+		{ AUD_IIR4_1_CB0,                  0x00005653 },
+		{ AUD_IIR4_1_CB1,                  0x0000cf97 },
+		{ AUD_IIR4_2_CA0,                  0x00006349 },
+		{ AUD_IIR4_2_CA1,                  0x00006f27 },
+		{ AUD_IIR4_2_CA2,                  0x0000e7a3 },
+		{ AUD_IIR4_2_CB0,                  0x00005653 },
+		{ AUD_IIR4_2_CB1,                  0x0000cf97 },
+		{ AUD_HP_MD_IIR4_1,                0x00000001 },
+		{ AUD_HP_PROG_IIR4_1,              0x0000001a },
+		{ AUD_DN0_FREQ,                    0x00000000 },
+		{ AUD_DN1_FREQ,                    0x00003318 },
+		{ AUD_DN1_SRC_SEL,                 0x00000017 },
+		{ AUD_DN1_SHFT,                    0x00000007 },
+		{ AUD_DN1_AFC,                     0x00000000 },
+		{ AUD_DN1_FREQ_SHIFT,              0x00000000 },
+		{ AUD_DN2_FREQ,                    0x00003551 },
+		{ AUD_DN2_SRC_SEL,                 0x00000001 },
+		{ AUD_DN2_SHFT,                    0x00000000 },
+		{ AUD_DN2_AFC,                     0x00000002 },
+		{ AUD_DN2_FREQ_SHIFT,              0x00000000 },
+		{ AUD_PDET_SRC,                    0x00000014 },
+		{ AUD_PDET_SHIFT,                  0x00000000 },
+		{ AUD_DEEMPH0_SRC_SEL,             0x00000011 },
+		{ AUD_DEEMPH1_SRC_SEL,             0x00000011 },
+		{ AUD_DEEMPH0_SHIFT,               0x00000000 },
+		{ AUD_DEEMPH1_SHIFT,               0x00000000 },
+		{ AUD_DEEMPH0_G0,                  0x00007000 },
+		{ AUD_DEEMPH0_A0,                  0x00000000 },
+		{ AUD_DEEMPH0_B0,                  0x00000000 },
+		{ AUD_DEEMPH0_A1,                  0x00000000 },
+		{ AUD_DEEMPH0_B1,                  0x00000000 },
+		{ AUD_DEEMPH1_G0,                  0x00007000 },
+		{ AUD_DEEMPH1_A0,                  0x00000000 },
+		{ AUD_DEEMPH1_B0,                  0x00000000 },
+		{ AUD_DEEMPH1_A1,                  0x00000000 },
+		{ AUD_DEEMPH1_B1,                  0x00000000 },
+		{ AUD_DMD_RA_DDS,                  0x00f5c285 },
+		{ AUD_RATE_ADJ1,                   0x00000100 },
+		{ AUD_RATE_ADJ2,                   0x00000200 },
+		{ AUD_RATE_ADJ3,                   0x00000300 },
+		{ AUD_RATE_ADJ4,                   0x00000400 },
+		{ AUD_RATE_ADJ5,                   0x00000500 },
+		{ AUD_C2_UP_THR,                   0x00005400 },
+		{ AUD_C2_LO_THR,                   0x00003000 },
+		{ AUD_C1_UP_THR,                   0x00007000 },
+		{ AUD_C2_LO_THR,                   0x00005400 },
+		{ AUD_CTL,                         0x0000100c },
+		{ AUD_DCOC_0_SRC,                  0x00000021 },
+		{ AUD_DCOC_1_SRC,                  0x00000003 },
+		{ AUD_DCOC1_SHIFT,                 0x00000000 },
+		{ AUD_DCOC_1_SHIFT_IN0,            0x0000000a },
+		{ AUD_DCOC_1_SHIFT_IN1,            0x00000008 },
+		{ AUD_DCOC_PASS_IN,                0x00000000 },
+		{ AUD_DCOC_2_SRC,                  0x0000001b },
+		{ AUD_IIR4_0_SEL,                  0x0000001d },
+		{ AUD_POLY0_DDS_CONSTANT,          0x000e4db2 },
+		{ AUD_PHASE_FIX_CTL,               0x00000000 },
+		{ AUD_CORDIC_SHIFT_1,              0x00000007 },
+		{ AUD_PLL_EN,                      0x00000000 },
+		{ AUD_PLL_PRESCALE,                0x00000002 },
+		{ AUD_PLL_INT,                     0x0000001e },
+		{ AUD_OUT1_SHIFT,                  0x00000000 },
+
+		{ /* end of list */ },
+	};
+
+	dprintk("%s (status: unknown)\n",__FUNCTION__);
+        set_audio_start(dev, 0x0004,
+			0 /* FIXME */);
+	set_audio_registers(dev, nicam_l);
+        set_audio_finish(dev);
 }
 
 static void set_audio_standard_A2(struct cx8800_dev *dev)
 {
+	/* from dscaler cvs */
 	static const struct rlist a2[] = {
-		//  increase level of input by 12dB
-		{ AUD_AFE_12DB_EN,         0x00000001 },
+		{ AUD_PDF_DDS_CNST_BYTE2,     0x06 },
+		{ AUD_PDF_DDS_CNST_BYTE1,     0x82 },
+		{ AUD_PDF_DDS_CNST_BYTE0,     0x12 },
+		{ AUD_QAM_MODE,		      0x05 },
+		{ AUD_PHACC_FREQ_8MSB,	      0x34 },
+		{ AUD_PHACC_FREQ_8LSB,	      0x4c },
+
+		{ AUD_RATE_ADJ1,	0x00001000 },
+		{ AUD_RATE_ADJ2,	0x00002000 },
+		{ AUD_RATE_ADJ3,	0x00003000 },
+		{ AUD_RATE_ADJ4,	0x00004000 },
+		{ AUD_RATE_ADJ5,	0x00005000 },
+		{ AUD_THR_FR,		0x00000000 },
+		{ AAGC_HYST,		0x0000001a },
+		{ AUD_PILOT_BQD_1_K0,	0x0000755b },
+		{ AUD_PILOT_BQD_1_K1,	0x00551340 },
+		{ AUD_PILOT_BQD_1_K2,	0x006d30be },
+		{ AUD_PILOT_BQD_1_K3,	0xffd394af },
+		{ AUD_PILOT_BQD_1_K4,	0x00400000 },
+		{ AUD_PILOT_BQD_2_K0,	0x00040000 },
+		{ AUD_PILOT_BQD_2_K1,	0x002a4841 },
+		{ AUD_PILOT_BQD_2_K2,	0x00400000 },
+		{ AUD_PILOT_BQD_2_K3,	0x00000000 },
+		{ AUD_PILOT_BQD_2_K4,	0x00000000 },
+		{ AUD_MODE_CHG_TIMER,	0x00000040 },
+		{ AUD_START_TIMER,	0x00000200 },
+		{ AUD_AFE_12DB_EN,	0x00000000 },
+		{ AUD_CORDIC_SHIFT_0,	0x00000007 },
+		{ AUD_CORDIC_SHIFT_1,	0x00000007 },
+		{ AUD_DEEMPH0_G0,	0x00000380 },
+		{ AUD_DEEMPH1_G0,	0x00000380 },
+		{ AUD_DCOC_0_SRC,	0x0000001a },
+		{ AUD_DCOC0_SHIFT,	0x00000000 },
+		{ AUD_DCOC_0_SHIFT_IN0,	0x0000000a },
+		{ AUD_DCOC_0_SHIFT_IN1,	0x00000008 },
+		{ AUD_DCOC_PASS_IN,	0x00000003 },
+		{ AUD_IIR3_0_SEL,	0x00000021 },
+		{ AUD_DN2_AFC,		0x00000002 },
+		{ AUD_DCOC_1_SRC,	0x0000001b },
+		{ AUD_DCOC1_SHIFT,	0x00000000 },
+		{ AUD_DCOC_1_SHIFT_IN0,	0x0000000a },
+		{ AUD_DCOC_1_SHIFT_IN1,	0x00000008 },
+		{ AUD_IIR3_1_SEL,	0x00000023 },
+		{ AUD_RDSI_SEL,		0x00000017 },
+		{ AUD_RDSI_SHIFT,	0x00000000 },
+		{ AUD_RDSQ_SEL,		0x00000017 },
+		{ AUD_RDSQ_SHIFT,	0x00000000 },
+		{ AUD_POLYPH80SCALEFAC,	0x00000001 },
+
+		// Table 1
+		{ AUD_DMD_RA_DDS,	0x002a73bd },
+		{ AUD_C1_UP_THR,	0x00007000 },
+		{ AUD_C1_LO_THR,	0x00005400 },
+		{ AUD_C2_UP_THR,	0x00005400 },
+		{ AUD_C2_LO_THR,	0x00003000 },
+
+#if 0
+		// found this in WDM-driver for A2, must country spec.
+		// Table 2
+		{ AUD_DMD_RA_DDS,	0x002a73bd },
+		{ AUD_C1_UP_THR,	0x00007000 },
+		{ AUD_C1_LO_THR,	0x00005400 },
+		{ AUD_C2_UP_THR,	0x00005400 },
+		{ AUD_C2_LO_THR,	0x00003000 },
+		{ AUD_DN0_FREQ,		0x00003a1c },
+		{ AUD_DN2_FREQ,		0x0000d2e0 },
+
+		// Table 3
+		{ AUD_DMD_RA_DDS,	0x002a2873 },
+		{ AUD_C1_UP_THR,	0x00003c00 },
+		{ AUD_C1_LO_THR,	0x00003000 },
+		{ AUD_C2_UP_THR,	0x00006000 },
+		{ AUD_C2_LO_THR,	0x00003c00 },
+		{ AUD_DN0_FREQ,		0x00002836 },
+		{ AUD_DN1_FREQ,		0x00003418 },
+		{ AUD_DN2_FREQ,		0x000029c7 },
+		{ AUD_POLY0_DDS_CONSTANT, 0x000a7540 },
+#endif
 
-		//  initialize A2
-		{ AUD_INIT,                0x00000004 },
-		{ AUD_INIT_LD,             0x00000001 },
-		{ AUD_SOFT_RESET,          0x00000001 },
-    
-		// ; WARNING!!! A2 STEREO DEMATRIX HAS TO BE
-		// ; SET MANUALLY!!!  Value sould be 0x100c
-		{ AUD_CTL, EN_DAC_ENABLE | EN_DMTRX_SUMR | EN_A2_AUTO_STEREO },
+		{ /* end of list */ },
+	};
 
+	static const struct rlist a2_old[] = {
 		{ AUD_DN0_FREQ,            0x0000312b },
 		{ AUD_POLY0_DDS_CONSTANT,  0x000a62b4 },
 		{ AUD_IIR1_0_SEL,          0x00000000 },
@@ -245,35 +488,45 @@ static void set_audio_standard_A2(struct
 		{ AUD_DN2_SRC_SEL,         0x00000001 },
 		{ AUD_DN2_FREQ,            0x00003551 },
 
-
 		//  setup Audio PLL
 		{ AUD_PLL_PRESCALE,        0x00000002 },
 		{ AUD_PLL_INT,             0x0000001f },
 
-		//  de-assert Audio soft reset
-		{ AUD_SOFT_RESET,          0x00000000 },
-
 		{ /* end of list */ },
 	};
 
-	dprintk("set_audio_standard_A2()\n");
-	set_audio_registers(dev, a2);
+
+	dprintk("%s (status: WorksForMe[tm])\n",__FUNCTION__);
+
+	if (0) {
+		/* old code */
+		set_audio_start(dev, 0x0004, EN_DMTRX_SUMR | EN_A2_AUTO_STEREO);
+		set_audio_registers(dev, a2_old);
+		set_audio_finish(dev);
+	} else {
+		/* new code */
+		set_audio_start(dev, 0x0004, EN_DMTRX_LR | EN_A2_AUTO_STEREO);
+		set_audio_registers(dev, a2);
+		set_audio_finish(dev);
+	}
 }
 
 static void set_audio_standard_EIAJ(struct cx8800_dev *dev)
 {
-	dprintk("set_audio_standard_EIAJ() [TODO]\n");
+	static const struct rlist eiaj[] = {
+		/* TODO: eiaj register settings are not there yet ... */
+
+		{ /* end of list */ },
+	};
+	dprintk("%s (status: unknown)\n",__FUNCTION__);
+
+	set_audio_start(dev, 0x0002, EN_EIAJ_AUTO_STEREO);
+	set_audio_registers(dev, eiaj);
+	set_audio_finish(dev);
 }
 
 static void set_audio_standard_FM(struct cx8800_dev *dev)
 {
-	dprintk("set_audio_standard_FM\n");
-
-	// initialize FM Radio
-	cx_write(AUD_INIT,0x0020);
-	cx_write(AUD_INIT_LD,0x0001);
-	cx_write(AUD_SOFT_RESET,0x0001);
-
 #if 0 /* FIXME */
 	switch (dev->audio_properties.FM_deemphasis)
 	{
@@ -311,19 +564,19 @@ static void set_audio_standard_FM(struct
 	}
 #endif
 
-	// de-assert Audio soft reset
-	cx_write(AUD_SOFT_RESET,0x0000);
+	dprintk("%s (status: unknown)\n",__FUNCTION__);
+	set_audio_start(dev, 0x0020, EN_FMRADIO_AUTO_STEREO);
 
 	// AB: 10/2/01: this register is not being reset appropriately on occasion.
 	cx_write(AUD_POLYPH80SCALEFAC,3);
+
+	set_audio_finish(dev);
 }
 
 /* ----------------------------------------------------------- */
 
 void cx88_set_tvaudio(struct cx8800_dev *dev)
 {
-	cx_write(AUD_CTL, 0x00);
-
 	switch (dev->tvaudio) {
 	case WW_BTSC:
 		set_audio_standard_BTSC(dev,0);
@@ -343,22 +596,21 @@ void cx88_set_tvaudio(struct cx8800_dev 
 	case WW_FM:
 		set_audio_standard_FM(dev);
 		break;
+	case WW_SYSTEM_L_AM:
+		set_audio_standard_NICAM_L(dev);
+		break;
 	case WW_NONE:
 	default:
 		printk("%s: unknown tv audio mode [%d]\n",
 		       dev->name, dev->tvaudio);
 		break;
 	}
-
-	// unmute
-	cx_set(AUD_CTL, EN_DAC_ENABLE);
-	cx_write(AUD_VOL_CTL, 0x00);
 	return;
 }
 
 void cx88_get_stereo(struct cx8800_dev *dev, struct v4l2_tuner *t)
 {
-	static char *m[] = {"mono", "dual mono", "stereo", "sap"};
+	static char *m[] = {"stereo", "dual mono", "mono", "sap"};
 	static char *p[] = {"no pilot", "pilot c1", "pilot c2", "?"};
 	u32 reg,mode,pilot;
 
@@ -367,7 +619,7 @@ void cx88_get_stereo(struct cx8800_dev *
 	pilot = (reg >> 2) & 0x03;
 	dprintk("AUD_STATUS: %s / %s [status=0x%x,ctl=0x%x,vol=0x%x]\n",
 		m[mode], p[pilot], reg,
-		cx_read(AUD_CTL), cx_read(AUD_VOL_CTL));
+		cx_read(AUD_CTL), cx_sread(SHADOW_AUD_VOL_CTL));
 
 	t->capability = V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_SAP |
 		V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2;
@@ -376,20 +628,20 @@ void cx88_get_stereo(struct cx8800_dev *
 
 	switch (dev->tvaudio) {
 	case WW_A2_BG:
- 		if (2 == pilot) {
+ 		if (1 == pilot) {
 			/* stereo */
 			t->rxsubchans = V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO;
-			if (2 == mode)
+			if (0 == mode)
 				t->audmode = V4L2_TUNER_MODE_STEREO;
 		}
- 		if (1 == pilot) {
+ 		if (2 == pilot) {
 			/* dual language -- FIXME */
 			t->rxsubchans = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
 			t->audmode = V4L2_TUNER_MODE_LANG1;
 		}
 		break;
 	case WW_NICAM_BGDKL:
-		if (2 == mode)
+		if (0 == mode)
 			t->audmode = V4L2_TUNER_MODE_STEREO;
 		break;
 	default:
@@ -455,12 +707,12 @@ void cx88_set_stereo(struct cx8800_dev *
 
 	if (UNSET != ctl) {
 		cx_write(AUD_SOFT_RESET, 0x0001);
-		cx_andor(AUD_CTL, mask, ctl);
+		cx_andor(AUD_CTL, mask,  ctl);
 		cx_write(AUD_SOFT_RESET, 0x0000);
 		dprintk("cx88_set_stereo: mask 0x%x, ctl 0x%x "
 			"[status=0x%x,ctl=0x%x,vol=0x%x]\n",
 			mask, ctl, cx_read(AUD_STATUS),
-			cx_read(AUD_CTL), cx_read(AUD_VOL_CTL));
+			cx_read(AUD_CTL), cx_sread(SHADOW_AUD_VOL_CTL));
 	}
 	return;
 }
--- diff/drivers/media/video/cx88/cx88-video.c	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/media/video/cx88/cx88-video.c	2004-04-21 10:45:34.354480824 +0100
@@ -42,6 +42,10 @@ static unsigned int video_nr[] = {[0 ...
 MODULE_PARM(video_nr,"1-" __stringify(CX88_MAXBOARDS) "i");
 MODULE_PARM_DESC(video_nr,"video device numbers");
 
+static unsigned int vbi_nr[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
+MODULE_PARM(vbi_nr,"1-" __stringify(CX88_MAXBOARDS) "i");
+MODULE_PARM_DESC(vbi_nr,"vbi device numbers");
+
 static unsigned int radio_nr[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
 MODULE_PARM(radio_nr,"1-" __stringify(CX88_MAXBOARDS) "i");
 MODULE_PARM_DESC(radio_nr,"radio device numbers");
@@ -131,45 +135,69 @@ static unsigned int inline norm_htotal(s
 	return (norm->id & V4L2_STD_625_50) ? 1135 : 910;
 }
 
+static unsigned int inline norm_vbipack(struct cx8800_tvnorm *norm)
+{
+	return (norm->id & V4L2_STD_625_50) ? 511 : 288;
+}
+
 static struct cx8800_tvnorm tvnorms[] = {
 	{
 		.name      = "NTSC-M",
 		.id        = V4L2_STD_NTSC_M,
 		.cxiformat = VideoFormatNTSC,
+		.cxoformat = 0x181f0008,
 	},{
 		.name      = "NTSC-JP",
 		.id        = V4L2_STD_NTSC_M_JP,
 		.cxiformat = VideoFormatNTSCJapan,
+		.cxoformat = 0x181f0008,
 #if 0
 	},{
 		.name      = "NTSC-4.43",
 		.id        = FIXME,
 		.cxiformat = VideoFormatNTSC443,
+		.cxoformat = 0x181f0008,
 #endif
 	},{
-		.name      = "PAL",
-		.id        = V4L2_STD_PAL,
+		.name      = "PAL-BG",
+		.id        = V4L2_STD_PAL_BG,
+		.cxiformat = VideoFormatPAL,
+		.cxoformat = 0x181f0008,
+	},{
+		.name      = "PAL-DK",
+		.id        = V4L2_STD_PAL_DK,
 		.cxiformat = VideoFormatPAL,
+		.cxoformat = 0x181f0008,
+	},{
+		.name      = "PAL-I",
+		.id        = V4L2_STD_PAL_I,
+		.cxiformat = VideoFormatPAL,
+		.cxoformat = 0x181f0008,
         },{
 		.name      = "PAL-M",
 		.id        = V4L2_STD_PAL_M,
 		.cxiformat = VideoFormatPALM,
+		.cxoformat = 0x1c1f0008,
 	},{
 		.name      = "PAL-N",
 		.id        = V4L2_STD_PAL_N,
 		.cxiformat = VideoFormatPALN,
+		.cxoformat = 0x1c1f0008,
 	},{
 		.name      = "PAL-Nc",
 		.id        = V4L2_STD_PAL_Nc,
 		.cxiformat = VideoFormatPALNC,
+		.cxoformat = 0x1c1f0008,
 	},{
 		.name      = "PAL-60",
 		.id        = V4L2_STD_PAL_60,
 		.cxiformat = VideoFormatPAL60,
+		.cxoformat = 0x181f0008,
 	},{
 		.name      = "SECAM",
 		.id        = V4L2_STD_SECAM,
 		.cxiformat = VideoFormatSECAM,
+		.cxoformat = 0x181f0008,
 	}
 };
 
@@ -266,10 +294,10 @@ static struct cx88_ctrl cx8800_ctls[] = 
 			.default_value = 0,
 			.type          = V4L2_CTRL_TYPE_INTEGER,
 		},
-		.off             = 128,
-		.reg             = MO_CONTR_BRIGHT,
-		.mask            = 0x00ff,
-		.shift           = 0,
+		.off                   = 128,
+		.reg                   = MO_CONTR_BRIGHT,
+		.mask                  = 0x00ff,
+		.shift                 = 0,
 	},{
 		.v = {
 			.id            = V4L2_CID_CONTRAST,
@@ -280,12 +308,42 @@ static struct cx88_ctrl cx8800_ctls[] = 
 			.default_value = 0,
 			.type          = V4L2_CTRL_TYPE_INTEGER,
 		},
-		.reg             = MO_CONTR_BRIGHT,
-		.mask            = 0xff00,
-		.shift           = 8,
+		.reg                   = MO_CONTR_BRIGHT,
+		.mask                  = 0xff00,
+		.shift                 = 8,
+	},{
+		.v = {
+			.id            = V4L2_CID_HUE,
+			.name          = "Hue",
+			.minimum       = 0,
+			.maximum       = 0xff,
+			.step          = 1,
+			.default_value = 0,
+			.type          = V4L2_CTRL_TYPE_INTEGER,
+		},
+		.off                   = 0,
+		.reg                   = MO_HUE,
+		.mask                  = 0x00ff,
+		.shift                 = 0,
+	},{
+		/* strictly, this only describes only U saturation.
+		 * V saturation is handled specially through code.
+		 */
+		.v = {
+			.id            = V4L2_CID_SATURATION,
+			.name          = "Saturation",
+			.minimum       = 0,
+			.maximum       = 0xff,
+			.step          = 1,
+			.default_value = 0,
+			.type          = V4L2_CTRL_TYPE_INTEGER,
+		},
+		.off                   = 0,
+		.reg                   = MO_UV_SATURATION,
+		.mask                  = 0x00ff,
+		.shift                 = 0,
 	},{
 	/* --- audio --- */
-#if 0
 		.v = {
 			.id            = V4L2_CID_AUDIO_MUTE,
 			.name          = "Mute",
@@ -293,11 +351,11 @@ static struct cx88_ctrl cx8800_ctls[] = 
 			.maximum       = 1,
 			.type          = V4L2_CTRL_TYPE_BOOLEAN,
 		},
-		.reg             = AUD_VOL_CTL,
-		.mask            = (1 << 6),
-		.shift           = 6,
+		.reg                   = AUD_VOL_CTL,
+		.sreg                  = SHADOW_AUD_VOL_CTL,
+		.mask                  = (1 << 6),
+		.shift                 = 6,
 	},{
-#endif
 		.v = {
 			.id            = V4L2_CID_AUDIO_VOLUME,
 			.name          = "Volume",
@@ -307,9 +365,24 @@ static struct cx88_ctrl cx8800_ctls[] = 
 			.default_value = 0,
 			.type          = V4L2_CTRL_TYPE_INTEGER,
 		},
-		.reg             = AUD_VOL_CTL,
-		.mask            = 0x3f,
-		.shift           = 0,
+		.reg                   = AUD_VOL_CTL,
+		.sreg                  = SHADOW_AUD_VOL_CTL,
+		.mask                  = 0x3f,
+		.shift                 = 0,
+	},{
+		.v = {
+			.id            = V4L2_CID_AUDIO_BALANCE,
+			.name          = "Balance",
+			.minimum       = 0,
+			.maximum       = 0x7f,
+			.step          = 1,
+			.default_value = 0x40,
+			.type          = V4L2_CTRL_TYPE_INTEGER,
+		},
+		.reg                   = AUD_BAL_CTL,
+		.sreg                  = SHADOW_AUD_BAL_CTL,
+		.mask                  = 0x7f,
+		.shift                 = 0,
 	}
 };
 const int CX8800_CTLS = ARRAY_SIZE(cx8800_ctls);
@@ -344,13 +417,11 @@ int res_check(struct cx8800_fh *fh, unsi
 	return (fh->resources & bit);
 }
 
-#if 0
 static
 int res_locked(struct cx8800_dev *dev, unsigned int bit)
 {
 	return (dev->resources & bit);
 }
-#endif
 
 static
 void res_free(struct cx8800_dev *dev, struct cx8800_fh *fh, unsigned int bits)
@@ -412,21 +483,39 @@ static int set_tvaudio(struct cx8800_dev
 	if (CX88_VMUX_TELEVISION != INPUT(dev->input)->type)
 		return 0;
 
-
-	dev->tvaudio = 0;
-	if (dev->tvnorm->id & V4L2_STD_PAL) {
-		if (nicam)
-			dev->tvaudio = WW_NICAM_BGDKL;
-		else
-			dev->tvaudio = WW_A2_BG;
-	}
-	if (0 == dev->tvaudio)
+	switch (dev->tvnorm->id) {
+	case V4L2_STD_PAL_BG:
+		dev->tvaudio = nicam ? WW_NICAM_BGDKL : WW_A2_BG;
+		break;
+	case V4L2_STD_PAL_DK:
+		dev->tvaudio = nicam ? WW_NICAM_BGDKL : WW_A2_DK;
+		break;
+	case V4L2_STD_PAL_I:
+		dev->tvaudio = WW_NICAM_I;
+		break;
+	case V4L2_STD_SECAM:
+		dev->tvaudio = WW_SYSTEM_L_AM;  /* FIXME: fr != ru */
+		break;
+	case V4L2_STD_NTSC_M:
+		dev->tvaudio = WW_BTSC;
+		break;
+	case V4L2_STD_NTSC_M_JP:
+		dev->tvaudio = WW_EIAJ;
+		break;
+	default:
+		dprintk(1,"tvaudio support needs work for this tv norm [%s], sorry\n",
+			dev->tvnorm->name);
+		dev->tvaudio = 0;
 		return 0;
+	}
 
-	cx_andor(MO_AFECFG_IO,    0x1f, 0x0);
+	cx_andor(MO_AFECFG_IO, 0x1f, 0x0);
 	cx88_set_tvaudio(dev);
-	//cx88_set_stereo(dev,norm->tvaudio, V4L2_TUNER_MODE_MONO);
-	//cx_write(MO_AUD_DMACNTRL, 0x03); /* need audio fifo */
+	cx88_set_stereo(dev,V4L2_TUNER_MODE_STEREO);
+
+	cx_write(MO_AUDD_LNGTH, 128/8);  /* fifo size */
+	cx_write(MO_AUDR_LNGTH, 128/8);  /* fifo size */
+	cx_write(MO_AUD_DMACNTRL, 0x03); /* need audio fifo */
 	return 0;
 }
 
@@ -455,8 +544,8 @@ static int set_tvnorm(struct cx8800_dev 
 #if 1
 	// FIXME: as-is from DScaler
 	dprintk(1,"set_tvnorm: MO_OUTPUT_FORMAT 0x%08x [old=0x%08x]\n",
-		0x1c1f0008, cx_read(MO_OUTPUT_FORMAT));
-	cx_write(MO_OUTPUT_FORMAT, 0x1c1f0008);
+		norm->cxoformat, cx_read(MO_OUTPUT_FORMAT));
+	cx_write(MO_OUTPUT_FORMAT, norm->cxoformat);
 #endif
 
 	// MO_SCONV_REG = adc clock / video dec clock * 2^17
@@ -494,6 +583,10 @@ static int set_tvnorm(struct cx8800_dev 
 	dprintk(1,"set_tvnorm: MO_HTOTAL        0x%08x [old=0x%08x,htotal=%d]\n",
 		htotal, cx_read(MO_HTOTAL), (u32)tmp64);
 	cx_write(MO_HTOTAL, htotal);
+
+	// vbi stuff
+	cx_write(MO_VBI_PACKET, ((1 << 11) | /* (norm_vdelay(norm)   << 11) | */
+				 norm_vbipack(norm)));
 	
 	// audio
 	set_tvaudio(dev);
@@ -552,9 +645,14 @@ static int set_scale(struct cx8800_dev *
 
 	// setup filters
 	value = 0;
-	value |= (1 << 19);  // CFILT (default)
+	value |= (1 << 19);        // CFILT (default)
 	if (interlaced)
 		value |= (1 << 3); // VINT (interlaced vertical scaling)
+	if (width < 385)
+		value |= (1 << 0); // 3-tap interpolation
+	if (width < 193)
+		value |= (1 << 1); // 5-tap interpolation
+
 	cx_write(MO_FILTER_EVEN,  value);
 	cx_write(MO_FILTER_ODD,   value);
 	dprintk(1,"set_scale: filter  0x%04x\n", value);
@@ -564,11 +662,25 @@ static int set_scale(struct cx8800_dev *
 
 static int video_mux(struct cx8800_dev *dev, unsigned int input)
 {
-	dprintk(1,"video_mux: %d [vmux=%d,gpio=0x%x]\n",
-		input, INPUT(input)->vmux, INPUT(input)->gpio0);
+	dprintk(1,"video_mux: %d [vmux=%d,gpio=0x%x,0x%x,0x%x,0x%x]\n",
+		input, INPUT(input)->vmux,
+		INPUT(input)->gpio0,INPUT(input)->gpio1,
+		INPUT(input)->gpio2,INPUT(input)->gpio3);
 	dev->input = input;
 	cx_andor(MO_INPUT_FORMAT, 0x03 << 14, INPUT(input)->vmux << 14);
 	cx_write(MO_GP0_IO, INPUT(input)->gpio0);
+	cx_write(MO_GP1_IO, INPUT(input)->gpio1);
+	cx_write(MO_GP2_IO, INPUT(input)->gpio2);
+	cx_write(MO_GP3_IO, INPUT(input)->gpio3);
+
+	switch (INPUT(input)->type) {
+	case CX88_VMUX_SVIDEO:
+		cx_andor(MO_AFECFG_IO, 0x01, 0x01);
+		break;
+	default:
+		cx_andor(MO_AFECFG_IO, 0x01, 0x00);
+		break;
+	}
 	return 0;
 }
 
@@ -721,6 +833,20 @@ buffer_prepare(struct file *file, struct
 					 buf->bpl, buf->bpl,
 					 buf->vb.height >> 1);
 			break;
+		case V4L2_FIELD_SEQ_TB:
+			cx88_risc_buffer(dev->pci, &buf->risc,
+					 buf->vb.dma.sglist,
+					 0, buf->bpl * (buf->vb.height >> 1),
+					 buf->bpl, 0,
+					 buf->vb.height >> 1);
+			break;
+		case V4L2_FIELD_SEQ_BT:
+			cx88_risc_buffer(dev->pci, &buf->risc,
+					 buf->vb.dma.sglist,
+					 buf->bpl * (buf->vb.height >> 1), 0,
+					 buf->bpl, 0,
+					 buf->vb.height >> 1);
+			break;
 		default:
 			BUG();
 		}
@@ -795,7 +921,7 @@ static void buffer_release(struct file *
 	cx88_free_buffer(fh->dev->pci,buf);
 }
 
-static struct videobuf_queue_ops cx8800_video_qops = {
+struct videobuf_queue_ops cx8800_video_qops = {
 	.buf_setup    = buffer_setup,
 	.buf_prepare  = buffer_prepare,
 	.buf_queue    = buffer_queue,
@@ -1032,19 +1158,51 @@ static int setup_window(struct cx8800_de
 
 /* ------------------------------------------------------------------ */
 
+static struct videobuf_queue* get_queue(struct cx8800_fh *fh)
+{
+	switch (fh->type) {
+	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+		return &fh->vidq;
+	case V4L2_BUF_TYPE_VBI_CAPTURE:
+		return &fh->vbiq;
+	default:
+		BUG();
+		return NULL;
+	}
+}
+
+static int get_ressource(struct cx8800_fh *fh)
+{
+	switch (fh->type) {
+	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+		return RESOURCE_VIDEO;
+	case V4L2_BUF_TYPE_VBI_CAPTURE:
+		return RESOURCE_VBI;
+	default:
+		BUG();
+		return 0;
+	}
+}
+
 static int video_open(struct inode *inode, struct file *file)
 {
 	int minor = iminor(inode);
 	struct cx8800_dev *h,*dev = NULL;
 	struct cx8800_fh *fh;
 	struct list_head *list;
-	enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+	enum v4l2_buf_type type = 0;
 	int radio = 0;
 	
 	list_for_each(list,&cx8800_devlist) {
 		h = list_entry(list, struct cx8800_dev, devlist);
-		if (h->video_dev->minor == minor)
-			dev = h;
+		if (h->video_dev->minor == minor) {
+			dev  = h;
+			type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+		}
+		if (h->vbi_dev->minor == minor) {
+			dev  = h;
+			type = V4L2_BUF_TYPE_VBI_CAPTURE;
+		}
 		if (h->radio_dev &&
 		    h->radio_dev->minor == minor) {
 			radio = 1;
@@ -1075,11 +1233,20 @@ static int video_open(struct inode *inod
 			    V4L2_BUF_TYPE_VIDEO_CAPTURE,
 			    V4L2_FIELD_INTERLACED,
 			    sizeof(struct cx88_buffer));
+	videobuf_queue_init(&fh->vbiq, &cx8800_vbi_qops,
+			    dev->pci, &dev->slock,
+			    V4L2_BUF_TYPE_VBI_CAPTURE,
+			    V4L2_FIELD_SEQ_TB,
+			    sizeof(struct cx88_buffer));
 	init_MUTEX(&fh->vidq.lock);
+	init_MUTEX(&fh->vbiq.lock);
 
 	if (fh->radio) {
 		dprintk(1,"video_open: setting radio device\n");
 		cx_write(MO_GP0_IO, cx88_boards[dev->board].radio.gpio0);
+		cx_write(MO_GP1_IO, cx88_boards[dev->board].radio.gpio1);
+		cx_write(MO_GP2_IO, cx88_boards[dev->board].radio.gpio2);
+		cx_write(MO_GP3_IO, cx88_boards[dev->board].radio.gpio3);
 		dev->tvaudio = WW_FM;
 		cx88_set_tvaudio(dev);
 		cx88_set_stereo(dev,V4L2_TUNER_MODE_STEREO);
@@ -1094,12 +1261,30 @@ video_read(struct file *file, char *data
 {
 	struct cx8800_fh *fh = file->private_data;
 
-	return videobuf_read_one(file, &fh->vidq, data, count, ppos);
+	switch (fh->type) {
+	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+		if (res_locked(fh->dev,RESOURCE_VIDEO))
+			return -EBUSY;
+		return videobuf_read_one(file, &fh->vidq, data, count, ppos);
+	case V4L2_BUF_TYPE_VBI_CAPTURE:
+		if (!res_get(fh->dev,fh,RESOURCE_VBI))
+			return -EBUSY;
+		return videobuf_read_stream(file, &fh->vbiq, data, count, ppos, 1);
+	default:
+		BUG();
+		return 0;
+	}
 }
 
 static unsigned int
 video_poll(struct file *file, struct poll_table_struct *wait)
 {
+	struct cx8800_fh *fh = file->private_data;
+
+	if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type)
+		return videobuf_poll_stream(file, &fh->vbiq, wait);
+
+	/* FIXME */
 	return POLLERR;
 }
 
@@ -1124,6 +1309,15 @@ static int video_release(struct inode *i
 		kfree(fh->vidq.read_buf);
 	}
 
+	/* stop vbi capture */
+	if (res_check(fh, RESOURCE_VBI)) {
+		if (fh->vbiq.streaming)
+			videobuf_streamoff(file,&fh->vbiq);
+		if (fh->vbiq.reading)
+			videobuf_read_stop(file,&fh->vbiq);
+		res_free(dev,fh,RESOURCE_VBI);
+	}
+
 	file->private_data = NULL;
 	kfree(fh);
 	return 0;
@@ -1134,7 +1328,7 @@ video_mmap(struct file *file, struct vm_
 {
 	struct cx8800_fh *fh = file->private_data;
 
-	return videobuf_mmap_mapper(vma,&fh->vidq);
+	return videobuf_mmap_mapper(vma, get_queue(fh));
 }
 
 /* ------------------------------------------------------------------ */
@@ -1151,14 +1345,22 @@ static int get_control(struct cx8800_dev
 	if (NULL == c)
 		return -EINVAL;
 
-	value = cx_read(c->reg);
-	ctl->value = ((value + (c->off << c->shift)) & c->mask) >> c->shift;
+	value = c->sreg ? cx_sread(c->sreg) : cx_read(c->reg);
+	switch (ctl->id) {
+	case V4L2_CID_AUDIO_BALANCE:
+		ctl->value = (value & 0x40) ? (value & 0x3f) : (0x40 - (value & 0x3f));
+		break;
+	default:
+		ctl->value = ((value + (c->off << c->shift)) & c->mask) >> c->shift;
+		break;
+	}
 	return 0;
 }
 
 static int set_control(struct cx8800_dev *dev, struct v4l2_control *ctl)
 {
 	struct cx88_ctrl *c = NULL;
+        u32 v_sat_value;
 	u32 value;
 	int i;
 
@@ -1172,11 +1374,48 @@ static int set_control(struct cx8800_dev
 		return -ERANGE;
 	if (ctl->value > c->v.maximum)
 		return -ERANGE;
-	value = ((ctl->value - c->off) << c->shift) & c->mask;
-	cx_andor(c->reg, c->mask, value);
+	switch (ctl->id) {
+	case V4L2_CID_AUDIO_BALANCE:
+		value = (ctl->value < 0x40) ? (0x40 - ctl->value) : ctl->value;
+		break;
+	case V4L2_CID_SATURATION:
+		/* special v_sat handling */
+		v_sat_value = ctl->value - (0x7f - 0x5a);
+		if (v_sat_value > 0xff)
+			v_sat_value = 0xff;
+		if (v_sat_value < 0x00)
+			v_sat_value = 0x00;
+		cx_andor(MO_UV_SATURATION, 0xff00, v_sat_value << 8);
+		/* fall through to default route for u_sat */
+	default:
+		value = ((ctl->value - c->off) << c->shift) & c->mask;
+		break;
+	}
+	dprintk(1,"set_control id=0x%X reg=0x%x val=0x%x%s\n",
+		ctl->id, c->reg, value, c->sreg ? " [shadowed]" : "");
+	if (c->sreg) {
+		cx_sandor(c->sreg, c->reg, c->mask, value);
+	} else {
+		cx_andor(c->reg, c->mask, value);
+	}
 	return 0;
 }
 
+static void init_controls(struct cx8800_dev *dev)
+{
+	static struct v4l2_control mute = {
+		.id    = V4L2_CID_AUDIO_MUTE,
+		.value = 1,
+	};
+	static struct v4l2_control volume = {
+		.id    = V4L2_CID_AUDIO_VOLUME,
+		.value = 0,
+	};
+
+	set_control(dev,&mute);
+	set_control(dev,&volume);
+}
+
 /* ------------------------------------------------------------------ */
 
 static int cx8800_g_fmt(struct cx8800_dev *dev, struct cx8800_fh *fh,
@@ -1194,6 +1433,9 @@ static int cx8800_g_fmt(struct cx8800_de
 		f->fmt.pix.sizeimage =
 			f->fmt.pix.height * f->fmt.pix.bytesperline;
 		return 0;
+	case V4L2_BUF_TYPE_VBI_CAPTURE:
+		cx8800_vbi_fmt(dev, f);
+		return 0;
 	default:
 		return -EINVAL;
 	}
@@ -1253,6 +1495,9 @@ static int cx8800_try_fmt(struct cx8800_
 
 		return 0;
 	}
+	case V4L2_BUF_TYPE_VBI_CAPTURE:
+		cx8800_vbi_fmt(dev, f);
+		return 0;
 	default:
 		return -EINVAL;
 	}
@@ -1274,6 +1519,9 @@ static int cx8800_s_fmt(struct cx8800_de
 		fh->height     = f->fmt.pix.height;
 		fh->vidq.field = f->fmt.pix.field;
 		return 0;
+	case V4L2_BUF_TYPE_VBI_CAPTURE:
+		cx8800_vbi_fmt(dev, f);
+		return 0;
 	default:
 		return -EINVAL;
 	}
@@ -1311,9 +1559,9 @@ static int video_do_ioctl(struct inode *
 			V4L2_CAP_VIDEO_CAPTURE |
 			V4L2_CAP_READWRITE     |
 			V4L2_CAP_STREAMING     |
+			V4L2_CAP_VBI_CAPTURE   |
 #if 0
 			V4L2_CAP_VIDEO_OVERLAY |
-			V4L2_CAP_VBI_CAPTURE   |
 #endif
 			0;
 		if (UNSET != dev->tuner_type)
@@ -1541,30 +1789,58 @@ static int video_do_ioctl(struct inode *
 	}
 
 	/* --- streaming capture ------------------------------------- */
+	case VIDIOCGMBUF:
+	{
+		struct video_mbuf *mbuf = arg;
+		struct videobuf_queue *q;
+		struct v4l2_requestbuffers req;
+		unsigned int i;
+
+		q = get_queue(fh);
+		memset(&req,0,sizeof(req));
+		req.type   = q->type;
+		req.count  = 8;
+		req.memory = V4L2_MEMORY_MMAP;
+		err = videobuf_reqbufs(file,q,&req);
+		if (err < 0)
+			return err;
+		memset(mbuf,0,sizeof(*mbuf));
+		mbuf->frames = req.count;
+		mbuf->size   = 0;
+		for (i = 0; i < mbuf->frames; i++) {
+			mbuf->offsets[i]  = q->bufs[i]->boff;
+			mbuf->size       += q->bufs[i]->bsize;
+		}
+		return 0;
+	}
 	case VIDIOC_REQBUFS:
-		return videobuf_reqbufs(file,&fh->vidq,arg);
+		return videobuf_reqbufs(file, get_queue(fh), arg);
 
 	case VIDIOC_QUERYBUF:
-		return videobuf_querybuf(&fh->vidq,arg);
+		return videobuf_querybuf(get_queue(fh), arg);
 
 	case VIDIOC_QBUF:
-		return videobuf_qbuf(file,&fh->vidq,arg);
+		return videobuf_qbuf(file, get_queue(fh), arg);
 
 	case VIDIOC_DQBUF:
-		return videobuf_dqbuf(file,&fh->vidq,arg);
+		return videobuf_dqbuf(file, get_queue(fh), arg);
 
 	case VIDIOC_STREAMON:
 	{
-                if (!res_get(dev,fh,RESOURCE_VIDEO))
+		int res = get_ressource(fh);
+
+                if (!res_get(dev,fh,res))
 			return -EBUSY;
-		return videobuf_streamon(file,&fh->vidq);
+		return videobuf_streamon(file, get_queue(fh));
 	}
 	case VIDIOC_STREAMOFF:
 	{
-		err = videobuf_streamoff(file,&fh->vidq);
+		int res = get_ressource(fh);
+
+		err = videobuf_streamoff(file, get_queue(fh));
 		if (err < 0)
 			return err;
-		res_free(dev,fh,RESOURCE_VIDEO);
+		res_free(dev,fh,res);
 		return 0;
 	}
 
@@ -1726,9 +2002,34 @@ static void cx8800_vid_timeout(unsigned 
 	spin_unlock_irqrestore(&dev->slock,flags);
 }
 
-static void cx8800_vid_irq(struct cx8800_dev *dev)
+static void cx8800_wakeup(struct cx8800_dev *dev,
+			  struct cx88_dmaqueue *q, u32 count)
 {
 	struct cx88_buffer *buf;
+
+	for (;;) {
+		if (list_empty(&q->active))
+			break;
+		buf = list_entry(q->active.next,
+				 struct cx88_buffer, vb.queue);
+		if (buf->count > count)
+			break;
+		do_gettimeofday(&buf->vb.ts);
+		dprintk(2,"[%p/%d] wakeup reg=%d buf=%d\n",buf,buf->vb.i,
+			count, buf->count);
+		buf->vb.state = STATE_DONE;
+		list_del(&buf->vb.queue);
+		wake_up(&buf->vb.done);
+	}
+	if (list_empty(&q->active)) {
+		del_timer(&q->timeout);
+	} else {
+		mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
+	}
+}
+
+static void cx8800_vid_irq(struct cx8800_dev *dev)
+{
 	u32 status, mask, count;
 
 	status = cx_read(MO_VID_INTSTAT);
@@ -1752,35 +2053,33 @@ static void cx8800_vid_irq(struct cx8800
 	if (status & 0x01) {
 		spin_lock(&dev->slock);
 		count = cx_read(MO_VIDY_GPCNT);
-		for (;;) {
-			if (list_empty(&dev->vidq.active))
-				break;
-			buf = list_entry(dev->vidq.active.next,
-					 struct cx88_buffer, vb.queue);
-			if (buf->count > count)
-				break;
-			do_gettimeofday(&buf->vb.ts);
-			dprintk(2,"[%p/%d] wakeup reg=%d buf=%d\n",buf,buf->vb.i,
-				count, buf->count);
-			buf->vb.state = STATE_DONE;
-			list_del(&buf->vb.queue);
-			wake_up(&buf->vb.done);
-		}
-		if (list_empty(&dev->vidq.active)) {
-			del_timer(&dev->vidq.timeout);
-		} else {
-			mod_timer(&dev->vidq.timeout, jiffies+BUFFER_TIMEOUT);
-		}
+		cx8800_wakeup(dev, &dev->vidq, count);
+		spin_unlock(&dev->slock);
+	}
+
+	/* risc1 vbi */
+	if (status & 0x08) {
+		spin_lock(&dev->slock);
+		count = cx_read(MO_VBI_GPCNT);
+		cx8800_wakeup(dev, &dev->vbiq, count);
 		spin_unlock(&dev->slock);
 	}
 
 	/* risc2 y */
 	if (status & 0x10) {
-		dprintk(2,"stopper\n");
+		dprintk(2,"stopper video\n");
 		spin_lock(&dev->slock);
 		restart_video_queue(dev,&dev->vidq);
 		spin_unlock(&dev->slock);
 	}
+
+	/* risc2 vbi */
+	if (status & 0x80) {
+		dprintk(2,"stopper vbi\n");
+		spin_lock(&dev->slock);
+		cx8800_restart_vbi_queue(dev,&dev->vbiq);
+		spin_unlock(&dev->slock);
+	}
 }
 
 static irqreturn_t cx8800_irq(int irq, void *dev_id, struct pt_regs *regs)
@@ -1831,8 +2130,16 @@ static struct file_operations video_fops
 struct video_device cx8800_video_template =
 {
 	.name          = "cx8800-video",
-	.type          = VID_TYPE_CAPTURE|VID_TYPE_TUNER|VID_TYPE_OVERLAY|
-	                 VID_TYPE_CLIPPING|VID_TYPE_SCALES,
+	.type          = VID_TYPE_CAPTURE|VID_TYPE_TUNER|VID_TYPE_SCALES,
+	.hardware      = 0,
+	.fops          = &video_fops,
+	.minor         = -1,
+};
+
+struct video_device cx8800_vbi_template =
+{
+	.name          = "cx8800-vbi",
+	.type          = VID_TYPE_TELETEXT|VID_TYPE_TUNER,
 	.hardware      = 0,
 	.fops          = &video_fops,
 	.minor         = -1,
@@ -1958,6 +2265,13 @@ static void cx8800_unregister_video(stru
 			video_device_release(dev->radio_dev);
 		dev->radio_dev = NULL;
 	}
+	if (dev->vbi_dev) {
+		if (-1 != dev->vbi_dev->minor)
+			video_unregister_device(dev->vbi_dev);
+		else
+			video_device_release(dev->vbi_dev);
+		dev->vbi_dev = NULL;
+	}
 	if (dev->video_dev) {
 		if (-1 != dev->video_dev->minor)
 			video_unregister_device(dev->video_dev);
@@ -1967,6 +2281,11 @@ static void cx8800_unregister_video(stru
 	}
 }
 
+/* debug that damn oops ... */
+static unsigned int oops = 0;
+MODULE_PARM(oops,"i");
+#define OOPS(msg) if (oops) printk("%s: %s\n",__FUNCTION__,msg);
+
 static int __devinit cx8800_initdev(struct pci_dev *pci_dev,
 				    const struct pci_device_id *pci_id)
 {
@@ -1980,6 +2299,7 @@ static int __devinit cx8800_initdev(stru
 	memset(dev,0,sizeof(*dev));
 
 	/* pci init */
+	OOPS("pci init");
 	dev->pci = pci_dev;
 	if (pci_enable_device(pci_dev)) {
 		err = -EIO;
@@ -1988,6 +2308,7 @@ static int __devinit cx8800_initdev(stru
 	sprintf(dev->name,"cx%x[%d]",pci_dev->device,cx8800_devcount);
 
 	/* pci quirks */
+	OOPS("pci quirks");
 	cx88_pci_quirks(dev->name, dev->pci, &latency);
 	if (UNSET != latency) {
 		printk(KERN_INFO "%s: setting pci latency timer to %d\n",
@@ -1996,6 +2317,7 @@ static int __devinit cx8800_initdev(stru
 	}
 
 	/* print pci info */
+	OOPS("pci info");
 	pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &dev->pci_rev);
         pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER,  &dev->pci_lat);
         printk(KERN_INFO "%s: found at %s, rev: %d, irq: %d, "
@@ -2011,6 +2333,7 @@ static int __devinit cx8800_initdev(stru
 	}
 
 	/* board config */
+	OOPS("board config");
 	dev->board = card[cx8800_devcount];
 	for (i = 0; UNSET == dev->board  &&  i < cx88_idcount; i++) 
 		if (pci_dev->subsystem_vendor == cx88_subids[i].subvendor &&
@@ -2029,6 +2352,7 @@ static int __devinit cx8800_initdev(stru
 		dev->tuner_type = cx88_boards[dev->board].tuner_type;
 
 	/* get mmio */
+	OOPS("get mmio");
 	if (!request_mem_region(pci_resource_start(pci_dev,0),
 				pci_resource_len(pci_dev,0),
 				dev->name)) {
@@ -2039,13 +2363,15 @@ static int __devinit cx8800_initdev(stru
 	}
 	dev->lmmio = ioremap(pci_resource_start(pci_dev,0),
 			     pci_resource_len(pci_dev,0));
+	dev->bmmio = (u8*)dev->lmmio;
 
 	/* initialize driver struct */
+	OOPS("init structs");
         init_MUTEX(&dev->lock);
 	dev->slock = SPIN_LOCK_UNLOCKED;
 	dev->tvnorm = tvnorms;
 
-	/* init dma queues */
+	/* init video dma queues */
 	INIT_LIST_HEAD(&dev->vidq.active);
 	INIT_LIST_HEAD(&dev->vidq.queued);
 	dev->vidq.timeout.function = cx8800_vid_timeout;
@@ -2053,11 +2379,22 @@ static int __devinit cx8800_initdev(stru
 	init_timer(&dev->vidq.timeout);
 	cx88_risc_stopper(dev->pci,&dev->vidq.stopper,
 			  MO_VID_DMACNTRL,0x11,0x00);
-	
+
+	/* init vbi dma queues */
+	INIT_LIST_HEAD(&dev->vbiq.active);
+	INIT_LIST_HEAD(&dev->vbiq.queued);
+	dev->vbiq.timeout.function = cx8800_vbi_timeout;
+	dev->vbiq.timeout.data     = (unsigned long)dev;
+	init_timer(&dev->vbiq.timeout);
+	cx88_risc_stopper(dev->pci,&dev->vbiq.stopper,
+			  MO_VID_DMACNTRL,0x88,0x00);
+
 	/* initialize hardware */
+	OOPS("reset hardware");
 	cx8800_reset(dev);
 
 	/* get irq */
+	OOPS("install irq handler");
 	err = request_irq(pci_dev->irq, cx8800_irq,
 			  SA_SHIRQ | SA_INTERRUPT, dev->name, dev);
 	if (err < 0) {
@@ -2067,16 +2404,22 @@ static int __devinit cx8800_initdev(stru
 	}
 
 	/* register i2c bus + load i2c helpers */
+	OOPS("i2c setup");
 	cx8800_i2c_init(dev);
+	OOPS("card setup");
 	cx88_card_setup(dev);
 
 	/* load and configure helper modules */
+	OOPS("configure i2c clients");
 	if (TUNER_ABSENT != dev->tuner_type)
 		request_module("tuner");
+	if (cx88_boards[dev->board].needs_tda9887)
+		request_module("tda9887");
 	if (dev->tuner_type != UNSET)
 		cx8800_call_i2c_clients(dev,TUNER_SET_TYPE,&dev->tuner_type);
 
 	/* register v4l devices */
+	OOPS("register video");
 	dev->video_dev = vdev_init(dev,&cx8800_video_template,"video");
 	err = video_register_device(dev->video_dev,VFL_TYPE_GRABBER,
 				    video_nr[cx8800_devcount]);
@@ -2088,7 +2431,20 @@ static int __devinit cx8800_initdev(stru
 	printk(KERN_INFO "%s: registered device video%d [v4l2]\n",
 	       dev->name,dev->video_dev->minor & 0x1f);
 
+	OOPS("register vbi");
+	dev->vbi_dev = vdev_init(dev,&cx8800_vbi_template,"vbi");
+	err = video_register_device(dev->vbi_dev,VFL_TYPE_VBI,
+				    vbi_nr[cx8800_devcount]);
+	if (err < 0) {
+		printk(KERN_INFO "%s: can't register vbi device\n",
+		       dev->name);
+		goto fail3;
+	}
+	printk(KERN_INFO "%s: registered device vbi%d\n",
+	       dev->name,dev->vbi_dev->minor & 0x1f);
+
 	if (dev->has_radio) {
+		OOPS("register radio");
 		dev->radio_dev = vdev_init(dev,&cx8800_radio_template,"radio");
 		err = video_register_device(dev->radio_dev,VFL_TYPE_RADIO,
 					    radio_nr[cx8800_devcount]);
@@ -2102,26 +2458,32 @@ static int __devinit cx8800_initdev(stru
 	}
 
 	/* everything worked */
+	OOPS("finalize");
 	list_add_tail(&dev->devlist,&cx8800_devlist);
 	pci_set_drvdata(pci_dev,dev);
 	cx8800_devcount++;
 
 	/* initial device configuration */
+	OOPS("init device");
 	down(&dev->lock);
+	init_controls(dev);
 	set_tvnorm(dev,tvnorms);
 	video_mux(dev,0);
 	up(&dev->lock);
 	return 0;
 
  fail3:
+	OOPS("fail3");
 	cx8800_unregister_video(dev);
 	if (0 == dev->i2c_rc)
 		i2c_bit_del_bus(&dev->i2c_adap);
 	free_irq(pci_dev->irq, dev);
  fail2:
+	OOPS("fail2");
 	release_mem_region(pci_resource_start(pci_dev,0),
 			   pci_resource_len(pci_dev,0));
  fail1:
+	OOPS("fail1");
 	kfree(dev);
 	return err;
 }
--- diff/drivers/media/video/cx88/cx88.h	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/media/video/cx88/cx88.h	2004-04-21 10:45:34.355480672 +0100
@@ -1,7 +1,7 @@
 /*
- * v4l2 device driver for philips saa7134 based TV cards
+ * v4l2 device driver for cx2388x based TV cards
  *
- * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org>
+ * (c) 2003,04 Gerd Knorr <kraxel@bytesex.org> [SUSE Labs]
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -32,7 +32,7 @@
 #include "cx88-reg.h"
 
 #include <linux/version.h>
-#define CX88_VERSION_CODE KERNEL_VERSION(0,0,1)
+#define CX88_VERSION_CODE KERNEL_VERSION(0,0,3)
 
 #ifndef TRUE
 # define TRUE (1==1)
@@ -50,6 +50,14 @@
 #define FORMAT_FLAGS_PACKED       0x01
 #define FORMAT_FLAGS_PLANAR       0x02
 
+#define VBI_LINE_COUNT              17
+#define VBI_LINE_LENGTH           2048
+
+/* need "shadow" registers for some write-only ones ... */
+#define SHADOW_AUD_VOL_CTL           1
+#define SHADOW_AUD_BAL_CTL           2
+#define SHADOW_MAX                   2
+
 /* ----------------------------------------------------------- */
 /* static data                                                 */
 
@@ -72,6 +80,7 @@ struct cx88_ctrl {
 	struct v4l2_queryctrl  v;
 	u32                    off;
 	u32                    reg;
+	u32                    sreg;
 	u32                    mask;
 	u32                    shift;
 };
@@ -91,6 +100,7 @@ struct sram_channel {
 	char *name;
 	u32  cmds_start;
 	u32  ctrl_start;
+	u32  cdt;
 	u32  fifo_start;
 	u32  fifo_size;
 	u32  ptr1_reg;
@@ -113,6 +123,7 @@ extern struct sram_channel cx88_sram_cha
 #define CX88_BOARD_AVERTV_303        6
 #define CX88_BOARD_MSI_TVANYWHERE    7
 #define CX88_BOARD_WINFAST_DV2000    8
+#define CX88_BOARD_LEADTEK_PVR2000   9
 
 
 enum cx88_itype {
@@ -129,12 +140,13 @@ enum cx88_itype {
 struct cx88_input {
 	enum cx88_itype type;
 	unsigned int    vmux;
-	u32             gpio0;
+	u32             gpio0, gpio1, gpio2, gpio3;
 };
 
 struct cx88_board {
 	char                    *name;
 	unsigned int            tuner_type;
+	int                     needs_tda9887:1;
 	struct cx88_input       input[8];
 	struct cx88_input       radio;
 };
@@ -195,6 +207,9 @@ struct cx8800_fh {
 	struct cx8800_fmt          *fmt;
 	unsigned int               width,height;
 	struct videobuf_queue      vidq;
+
+	/* vbi capture */
+	struct videobuf_queue      vbiq;
 };
 
 struct cx8800_suspend_state {
@@ -211,6 +226,7 @@ struct cx8800_dev {
 	/* various device info */
 	unsigned int               resources;
 	struct video_device        *video_dev;
+	struct video_device        *vbi_dev;
 	struct video_device        *radio_dev;
 
 	/* pci i/o */
@@ -218,6 +234,7 @@ struct cx8800_dev {
 	struct pci_dev             *pci;
 	unsigned char              pci_rev,pci_lat;
         u32                        *lmmio;
+        u8                         *bmmio;
 
 	/* config info */
 	unsigned int               board;
@@ -236,6 +253,7 @@ struct cx8800_dev {
 
 	/* capture queues */
 	struct cx88_dmaqueue       vidq;
+	struct cx88_dmaqueue       vbiq;
 
 	/* various v4l controls */
 	struct cx8800_tvnorm       *tvnorm;
@@ -244,6 +262,7 @@ struct cx8800_dev {
 	u32                        freq;
 
 	/* other global state info */
+	u32                         shadow[SHADOW_MAX];
 	struct cx8800_suspend_state state;
 };
 
@@ -251,6 +270,7 @@ struct cx8800_dev {
 
 #define cx_read(reg)             readl(dev->lmmio + ((reg)>>2))
 #define cx_write(reg,value)      writel((value), dev->lmmio + ((reg)>>2));
+#define cx_writeb(reg,value)     writeb((value), dev->bmmio + (reg));
 
 #define cx_andor(reg,mask,value) \
   writel((readl(dev->lmmio+((reg)>>2)) & ~(mask)) |\
@@ -258,8 +278,16 @@ struct cx8800_dev {
 #define cx_set(reg,bit)          cx_andor((reg),(bit),(bit))
 #define cx_clear(reg,bit)        cx_andor((reg),(bit),0)
 
-#define cx_wait(d) { if (need_resched()) schedule(); else udelay(d);}
+#define cx_wait(d) { if (need_resched()) schedule(); else udelay(d); }
 
+/* shadow registers */
+#define cx_sread(sreg)		    (dev->shadow[sreg])
+#define cx_swrite(sreg,reg,value) \
+  (dev->shadow[sreg] = value, \
+   writel(dev->shadow[sreg], dev->lmmio + ((reg)>>2)))
+#define cx_sandor(sreg,reg,mask,value) \
+  (dev->shadow[sreg] = (dev->shadow[sreg] & ~(mask)) | ((value) & (mask)), \
+   writel(dev->shadow[sreg], dev->lmmio + ((reg)>>2)))
 
 /* ----------------------------------------------------------- */
 /* cx88-core.c                                                 */
@@ -294,6 +322,19 @@ extern int cx88_pci_quirks(char *name, s
 			   unsigned int *latency);
 
 /* ----------------------------------------------------------- */
+/* cx88-vbi.c                                                  */
+
+void cx8800_vbi_fmt(struct cx8800_dev *dev, struct v4l2_format *f);
+int cx8800_start_vbi_dma(struct cx8800_dev    *dev,
+			 struct cx88_dmaqueue *q,
+			 struct cx88_buffer   *buf);
+int cx8800_restart_vbi_queue(struct cx8800_dev    *dev,
+			     struct cx88_dmaqueue *q);
+void cx8800_vbi_timeout(unsigned long data);
+
+extern struct videobuf_queue_ops cx8800_vbi_qops;
+
+/* ----------------------------------------------------------- */
 /* cx88-i2c.c                                                  */
 
 extern int cx8800_i2c_init(struct cx8800_dev *dev);
@@ -310,7 +351,7 @@ extern const unsigned int cx88_bcount;
 extern struct cx88_subid cx88_subids[];
 extern const unsigned int cx88_idcount;
 
-extern void cx88_card_setup(struct cx8800_dev *dev);
+extern void __devinit cx88_card_setup(struct cx8800_dev *dev);
 
 /* ----------------------------------------------------------- */
 /* cx88-tvaudio.c                                              */
--- diff/drivers/media/video/ir-kbd-i2c.c	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/media/video/ir-kbd-i2c.c	2004-04-21 10:45:34.355480672 +0100
@@ -41,6 +41,44 @@
 
 #include <media/ir-common.h>
 
+/* Mark Phalan <phalanm@o2.ie> */
+static IR_KEYTAB_TYPE ir_codes_pv951[IR_KEYTAB_SIZE] = {
+	[  0 ] = KEY_KP0,
+	[  1 ] = KEY_KP1,
+	[  2 ] = KEY_KP2,
+	[  3 ] = KEY_KP3,
+	[  4 ] = KEY_KP4,
+	[  5 ] = KEY_KP5,
+	[  6 ] = KEY_KP6,
+	[  7 ] = KEY_KP7,
+	[  8 ] = KEY_KP8,
+	[  9 ] = KEY_KP9,
+
+	[ 18 ] = KEY_POWER,
+	[ 16 ] = KEY_MUTE,
+	[ 31 ] = KEY_VOLUMEDOWN,
+	[ 27 ] = KEY_VOLUMEUP,
+	[ 26 ] = KEY_CHANNELUP,
+	[ 30 ] = KEY_CHANNELDOWN,
+	[ 14 ] = KEY_PAGEUP,
+	[ 29 ] = KEY_PAGEDOWN,
+	[ 19 ] = KEY_SOUND,
+
+	[ 24 ] = KEY_KPPLUSMINUS,	// CH +/-
+	[ 22 ] = KEY_SUBTITLE,		// CC
+	[ 13 ] = KEY_TEXT,		// TTX
+	[ 11 ] = KEY_TV,		// AIR/CBL
+	[ 17 ] = KEY_PC,		// PC/TV
+	[ 23 ] = KEY_OK,		// CH RTN
+	[ 25 ] = KEY_MODE, 		// FUNC
+	[ 12 ] = KEY_SEARCH, 		// AUTOSCAN
+
+	/* Not sure what to do with these ones! */
+	[ 15 ] = KEY_SELECT, 		// SOURCE
+	[ 10 ] = KEY_KPPLUS,		// +100
+	[ 20 ] = KEY_KPEQUAL,		// SYNC
+};
+
 struct IR;
 struct IR {
 	struct i2c_client      c;
@@ -247,7 +285,7 @@ static int ir_attach(struct i2c_adapter 
 		name        = "PV951";
 		ir->get_key = get_key_pv951;
 		ir_type     = IR_TYPE_OTHER;
-		ir_codes    = ir_codes_empty;
+		ir_codes    = ir_codes_pv951;
 		break;
 	case 0x18:
 	case 0x1a:
--- diff/drivers/media/video/msp3400.c	2004-02-18 08:54:09.000000000 +0000
+++ source/drivers/media/video/msp3400.c	2004-04-21 10:45:34.356480520 +0100
@@ -1384,34 +1384,30 @@ static int msp_command(struct i2c_client
 {
 	struct msp3400c *msp  = i2c_get_clientdata(client);
         __u16           *sarg = arg;
-#if 0
-	int             *iarg = (int*)arg;
-#endif
+	int scart = 0;
 
 	switch (cmd) {
 
 	case AUDC_SET_INPUT:
-		/* scart switching
-		     - IN1 is often used for external input
-		     - Hauppauge uses IN2 for the radio */
 		dprintk(KERN_DEBUG "msp34xx: AUDC_SET_INPUT(%d)\n",*sarg);
 		if (*sarg == msp->input)
 			break;
 		msp->input = *sarg;
 		switch (*sarg) {
 		case AUDIO_RADIO:
+			/* Hauppauge uses IN2 for the radio */
 			msp->mode   = MSP_MODE_FM_RADIO;
-			msp->stereo = VIDEO_SOUND_STEREO;
-			msp3400c_set_scart(client,SCART_IN2,0);
-			msp3400c_write(client,I2C_MSP3400C_DFP,0x000d,0x1900);
-			msp3400c_setstereo(client,msp->stereo);
+			scart       = SCART_IN2;
 			break;
-		case AUDIO_EXTERN:
+		case AUDIO_EXTERN_1:
+			/* IN1 is often used for external input ... */
 			msp->mode   = MSP_MODE_EXTERN;
-			msp->stereo = VIDEO_SOUND_STEREO;
-			msp3400c_set_scart(client,SCART_IN1,0);
-			msp3400c_write(client,I2C_MSP3400C_DFP,0x000d,0x1900);
-			msp3400c_setstereo(client,msp->stereo);
+			scart       = SCART_IN1;
+			break;
+		case AUDIO_EXTERN_2:
+			/* ... sometimes it is IN2 through ;) */
+			msp->mode   = MSP_MODE_EXTERN;
+			scart       = SCART_IN2;
 			break;
 		case AUDIO_TUNER:
 			msp->mode   = -1;
@@ -1422,6 +1418,12 @@ static int msp_command(struct i2c_client
 				msp3400c_set_scart(client,SCART_MUTE,0);
 			break;
 		}
+		if (scart) {
+			msp->stereo = VIDEO_SOUND_STEREO;
+			msp3400c_set_scart(client,scart,0);
+			msp3400c_write(client,I2C_MSP3400C_DFP,0x000d,0x1900);
+			msp3400c_setstereo(client,msp->stereo);
+		}
 		if (msp->active)
 			msp->restart = 1;
 		break;
@@ -1487,12 +1489,15 @@ static int msp_command(struct i2c_client
 		if (msp->muted)
 			va->flags |= VIDEO_AUDIO_MUTE;
 		va->volume=max(msp->left,msp->right);
-		va->balance=(32768*min(msp->left,msp->right))/
-			(va->volume ? va->volume : 1);
-		va->balance=(msp->left<msp->right)?
-			(65535-va->balance) : va->balance;
-		if (0 == va->volume)
+
+		if (0 == va->volume) {
 			va->balance = 32768;
+		} else {
+			va->balance = (32768 * min(msp->left,msp->right))
+				/ va->volume;
+			va->balance = (msp->left<msp->right) ?
+				(65535 - va->balance) : va->balance;
+		}
 		va->bass = msp->bass;
 		va->treble = msp->treble;
 
@@ -1530,7 +1535,7 @@ static int msp_command(struct i2c_client
 	{
 		struct video_channel *vc = arg;
 		
-		dprintk(KERN_DEBUG "msp34xx: VIDIOCSCHAN\n");
+		dprintk(KERN_DEBUG "msp34xx: VIDIOCSCHAN (norm=%d)\n",vc->norm);
 		msp->norm = vc->norm;
 		break;
 	}
--- diff/drivers/media/video/saa7134/Makefile	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/media/video/saa7134/Makefile	2004-04-21 10:45:34.357480368 +0100
@@ -3,6 +3,6 @@ saa7134-objs :=	saa7134-cards.o saa7134-
 		saa7134-oss.o saa7134-ts.o saa7134-tvaudio.o	\
 		saa7134-vbi.o saa7134-video.o saa7134-input.o
 
-obj-$(CONFIG_VIDEO_SAA7134) += saa7134.o
+obj-$(CONFIG_VIDEO_SAA7134) += saa7134.o saa6752hs.o
 
 EXTRA_CFLAGS = -I$(src)/..
--- diff/drivers/media/video/saa7134/saa7134-cards.c	2004-02-18 08:54:09.000000000 +0000
+++ source/drivers/media/video/saa7134/saa7134-cards.c	2004-04-21 10:45:34.357480368 +0100
@@ -2,7 +2,7 @@
  * device driver for philips saa7134 based TV cards
  * card-specific stuff.
  *
- * (c) 2001-03 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
+ * (c) 2001-04 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -732,13 +732,23 @@ struct saa7134_board saa7134_boards[] = 
         [SAA7134_BOARD_ASUSTEK_TVFM7133] = {
                 .name           = "ASUS TV-FM 7133",
                 .audio_clock    = 0x00187de7,
-                .tuner_type     = TUNER_PHILIPS_FM1236_MK3,
+		// probably wrong, the 7133 one is the NTSC version ...
+		// .tuner_type     = TUNER_PHILIPS_FM1236_MK3
+                .tuner_type     = TUNER_LG_NTSC_NEW_TAPC,
                 .need_tda9887   = 1,
                 .inputs         = {{
                         .name = name_tv,
                         .vmux = 1,
                         .amux = TV,
                         .tv   = 1,
+		},{
+                        .name = name_comp1,
+                        .vmux = 4,
+                        .amux = LINE2,
+                },{
+                        .name = name_svideo,
+                        .vmux = 6,
+                        .amux = LINE2,
                 }},
                 .radio = {
                         .name = name_radio,
--- diff/drivers/media/video/saa7134/saa7134-core.c	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/media/video/saa7134/saa7134-core.c	2004-04-21 10:45:34.358480216 +0100
@@ -101,7 +101,7 @@ unsigned int      saa7134_devcount;
 /* debug help functions                                               */
 
 static const char *v4l1_ioctls[] = {
-	"0", "CGAP", "GCHAN", "SCHAN", "GTUNER", "STUNER", "GPICT", "SPICT",
+	"0", "GCAP", "GCHAN", "SCHAN", "GTUNER", "STUNER", "GPICT", "SPICT",
 	"CCAPTURE", "GWIN", "SWIN", "GFBUF", "SFBUF", "KEY", "GFREQ",
 	"SFREQ", "GAUDIO", "SAUDIO", "SYNC", "MCAPTURE", "GMBUF", "GUNIT",
 	"GCAPTURE", "SCAPTURE", "SPLAYMODE", "SWRITEMODE", "GPLAYINFO",
@@ -466,7 +466,7 @@ int saa7134_set_dmabits(struct saa7134_d
 	}
 
 	/* audio capture -- dma 3 */
-	if (dev->oss.recording) {
+	if (dev->oss.dma_running) {
 		ctrl |= SAA7134_MAIN_CTRL_TE6;
 		irq  |= SAA7134_IRQ1_INTE_RA3_1 |
 			SAA7134_IRQ1_INTE_RA3_0;
--- diff/drivers/media/video/saa7134/saa7134-input.c	2004-02-18 08:54:09.000000000 +0000
+++ source/drivers/media/video/saa7134/saa7134-input.c	2004-04-21 10:45:34.358480216 +0100
@@ -100,42 +100,42 @@ static IR_KEYTAB_TYPE cinergy_codes[IR_K
 	[ 0x23 ] = KEY_STOP,
 };
 
-/* Alfons Geser <a.geser@cox.net> */
+/* Alfons Geser <a.geser@cox.net>
+ * updates from Job D. R. Borges <jobdrb@ig.com.br> */
 static IR_KEYTAB_TYPE eztv_codes[IR_KEYTAB_SIZE] = {
         [ 18 ] = KEY_POWER,
         [  1 ] = KEY_TV,             // DVR
-        [ 21 ] = KEY_VIDEO,          // DVD
+        [ 21 ] = KEY_DVD,            // DVD
         [ 23 ] = KEY_AUDIO,          // music
-
                                      // DVR mode / DVD mode / music mode
 
         [ 27 ] = KEY_MUTE,           // mute
-        [  2 ] = KEY_RESERVED,       // MTS/SAP / audio /autoseek
-        [ 30 ] = KEY_RESERVED,       // closed captioning / subtitle / seek
+        [  2 ] = KEY_LANGUAGE,       // MTS/SAP / audio / autoseek
+        [ 30 ] = KEY_SUBTITLE,       // closed captioning / subtitle / seek
         [ 22 ] = KEY_ZOOM,           // full screen
-        [ 28 ] = KEY_RESERVED,       // video source / eject /delall
-        [ 29 ] = KEY_RESERVED,       // playback / angle /del
+        [ 28 ] = KEY_VIDEO,          // video source / eject / delall
+        [ 29 ] = KEY_RESTART,        // playback / angle / del
         [ 47 ] = KEY_SEARCH,         // scan / menu / playlist
-        [ 48 ] = KEY_RESERVED,       // CH surfing / bookmark / memo
+        [ 48 ] = KEY_CHANNEL,        // CH surfing / bookmark / memo
 
         [ 49 ] = KEY_HELP,           // help
-        [ 50 ] = KEY_RESERVED,       // num/memo
+        [ 50 ] = KEY_MODE,           // num/memo
         [ 51 ] = KEY_ESC,            // cancel
 
 	[ 12 ] = KEY_UP,             // up
 	[ 16 ] = KEY_DOWN,           // down
 	[  8 ] = KEY_LEFT,           // left
 	[  4 ] = KEY_RIGHT,          // right
-	[  3 ] = KEY_ENTER,          // select
+	[  3 ] = KEY_SELECT,         // select
 
 	[ 31 ] = KEY_REWIND,         // rewind
 	[ 32 ] = KEY_PLAYPAUSE,      // play/pause
 	[ 41 ] = KEY_FORWARD,        // forward
-	[ 20 ] = KEY_RESERVED,       // repeat
+	[ 20 ] = KEY_AGAIN,          // repeat
 	[ 43 ] = KEY_RECORD,         // recording
 	[ 44 ] = KEY_STOP,           // stop
 	[ 45 ] = KEY_PLAY,           // play
-	[ 46 ] = KEY_RESERVED,       // snapshot
+	[ 46 ] = KEY_SHUFFLE,        // snapshot / shuffle
 
         [  0 ] = KEY_KP0,
         [  5 ] = KEY_KP1,
--- diff/drivers/media/video/saa7134/saa7134-oss.c	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/media/video/saa7134/saa7134-oss.c	2004-04-21 10:45:34.359480064 +0100
@@ -64,7 +64,7 @@ static int dsp_buffer_conf(struct saa713
 	dev->oss.bufsize = blksize * blocks;
 
 	dprintk("buffer config: %d blocks / %d bytes, %d kB total\n",
-		blocks,blksize,blksize * blocks / 1024);
+ 		blocks,blksize,blksize * blocks / 1024);
 	return 0;
 }
 
@@ -92,6 +92,20 @@ static int dsp_buffer_free(struct saa713
 	return 0;
 }
 
+static void dsp_dma_start(struct saa7134_dev *dev)
+{
+	dev->oss.dma_blk     = 0;
+	dev->oss.dma_running = 1;
+	saa7134_set_dmabits(dev);
+}
+
+static void dsp_dma_stop(struct saa7134_dev *dev)
+{
+	dev->oss.dma_blk     = -1;
+	dev->oss.dma_running = 0;
+	saa7134_set_dmabits(dev);
+}
+
 static int dsp_rec_start(struct saa7134_dev *dev)
 {
 	int err, bswap, sign;
@@ -178,10 +192,9 @@ static int dsp_rec_start(struct saa7134_
 	saa_writel(SAA7134_RS_CONTROL(6),control);
 	
 	/* start dma */
+	dev->oss.recording_on = 1;
 	spin_lock_irqsave(&dev->slock,flags);
-	dev->oss.recording = 1;
-	dev->oss.dma_blk   = 0;
-	saa7134_set_dmabits(dev);
+	dsp_dma_start(dev);
 	spin_unlock_irqrestore(&dev->slock,flags);
 	return 0;
 
@@ -199,10 +212,9 @@ static int dsp_rec_stop(struct saa7134_d
 	dprintk("rec_stop dma_blk=%d\n",dev->oss.dma_blk);
 
 	/* stop dma */
+	dev->oss.recording_on = 0;
 	spin_lock_irqsave(&dev->slock,flags);
-	dev->oss.dma_blk   = -1;
-	dev->oss.recording = 0;
-	saa7134_set_dmabits(dev);
+	dsp_dma_stop(dev);
 	spin_unlock_irqrestore(&dev->slock,flags);
 
 	/* unlock buffer */
@@ -259,7 +271,7 @@ static int dsp_release(struct inode *ino
 	struct saa7134_dev *dev = file->private_data;
 
 	down(&dev->oss.lock);
-	if (dev->oss.recording)
+	if (dev->oss.recording_on)
 		dsp_rec_stop(dev);
 	dsp_buffer_free(dev);
 	dev->oss.users_dsp--;
@@ -274,6 +286,7 @@ static ssize_t dsp_read(struct file *fil
 	struct saa7134_dev *dev = file->private_data;
 	DECLARE_WAITQUEUE(wait, current);
 	unsigned int bytes;
+	unsigned long flags;
 	int err,ret = 0;
 
 	add_wait_queue(&dev->oss.wq, &wait);
@@ -281,7 +294,7 @@ static ssize_t dsp_read(struct file *fil
 	while (count > 0) {
 		/* wait for data if needed */
 		if (0 == dev->oss.read_count) {
-			if (!dev->oss.recording) {
+			if (!dev->oss.recording_on) {
 				err = dsp_rec_start(dev);
 				if (err < 0) {
 					if (0 == ret)
@@ -289,6 +302,13 @@ static ssize_t dsp_read(struct file *fil
 					break;
 				}
 			}
+			if (dev->oss.recording_on &&
+			    !dev->oss.dma_running) {
+				/* recover from overruns */
+				spin_lock_irqsave(&dev->slock,flags);
+				dsp_dma_start(dev);
+				spin_unlock_irqrestore(&dev->slock,flags);
+			}
 			if (file->f_flags & O_NONBLOCK) {
 				if (0 == ret)
 					ret = -EAGAIN;
@@ -365,7 +385,7 @@ static int dsp_ioctl(struct inode *inode
 			return -EFAULT;
 		down(&dev->oss.lock);
 		dev->oss.channels = val ? 2 : 1;
-		if (dev->oss.recording) {
+		if (dev->oss.recording_on) {
 			dsp_rec_stop(dev);
 			dsp_rec_start(dev);
 		}
@@ -379,7 +399,7 @@ static int dsp_ioctl(struct inode *inode
 			return -EINVAL;
 		down(&dev->oss.lock);
 		dev->oss.channels = val;
-		if (dev->oss.recording) {
+		if (dev->oss.recording_on) {
 			dsp_rec_stop(dev);
 			dsp_rec_start(dev);
 		}
@@ -408,7 +428,7 @@ static int dsp_ioctl(struct inode *inode
 		case AFMT_S16_BE:
 			down(&dev->oss.lock);
 			dev->oss.afmt = val;
-			if (dev->oss.recording) {
+			if (dev->oss.recording_on) {
 				dsp_rec_stop(dev);
 				dsp_rec_start(dev);
 			}
@@ -438,7 +458,7 @@ static int dsp_ioctl(struct inode *inode
 
         case SNDCTL_DSP_RESET:
 		down(&dev->oss.lock);
-		if (dev->oss.recording)
+		if (dev->oss.recording_on)
 			dsp_rec_stop(dev);
 		up(&dev->oss.lock);
 		return 0;
@@ -448,7 +468,7 @@ static int dsp_ioctl(struct inode *inode
         case SNDCTL_DSP_SETFRAGMENT:
 		if (get_user(val, (int*)arg))
 			return -EFAULT;
-		if (dev->oss.recording)
+		if (dev->oss.recording_on)
 			return -EBUSY;
 		dsp_buffer_free(dev);
 		dsp_buffer_conf(dev,1 << (val & 0xffff), (arg >> 16) & 0xffff);
@@ -484,7 +504,7 @@ static unsigned int dsp_poll(struct file
 
 	if (0 == dev->oss.read_count) {
 		down(&dev->oss.lock);
-		if (!dev->oss.recording)
+		if (!dev->oss.recording_on)
 			dsp_rec_start(dev);
 		up(&dev->oss.lock);
 	} else
@@ -800,7 +820,7 @@ void saa7134_irq_oss_done(struct saa7134
 	if (dev->oss.read_count >= dev->oss.blksize * (dev->oss.blocks-2)) {
 		dprintk("irq: overrun [full=%d/%d]\n",dev->oss.read_count,
 			dev->oss.bufsize);
-		dsp_rec_stop(dev);
+		dsp_dma_stop(dev);
 		goto done;
 	}
 
--- diff/drivers/media/video/saa7134/saa7134-tvaudio.c	2004-02-18 08:54:09.000000000 +0000
+++ source/drivers/media/video/saa7134/saa7134-tvaudio.c	2004-04-21 10:45:34.360479912 +0100
@@ -60,8 +60,9 @@ MODULE_PARM_DESC(audio_clock_tweak, "Aud
 #define print_regb(reg) printk("%s:   reg 0x%03x [%-16s]: 0x%02x\n", \
 		dev->name,(SAA7134_##reg),(#reg),saa_readb((SAA7134_##reg)))
 
-#define SCAN_INITIAL_DELAY  (HZ)
-#define SCAN_SAMPLE_DELAY   (HZ/5)
+#define SCAN_INITIAL_DELAY     (HZ)
+#define SCAN_SAMPLE_DELAY      (HZ/5)
+#define SCAN_SUBCARRIER_DELAY  (HZ*2)
 
 /* ------------------------------------------------------------------ */
 /* saa7134 code                                                       */
@@ -557,7 +558,7 @@ static int tvaudio_thread(void *data)
 			if (UNSET == audio)
 				audio = i;
 			tvaudio_setmode(dev,&tvaudio[i],"trying");
-			if (tvaudio_sleep(dev,HZ*2))
+			if (tvaudio_sleep(dev,SCAN_SUBCARRIER_DELAY))
 				goto restart;
 			if (-1 != tvaudio_getstereo(dev,&tvaudio[i])) {
 				audio = i;
--- diff/drivers/media/video/saa7134/saa7134-video.c	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/media/video/saa7134/saa7134-video.c	2004-04-21 10:45:34.361479760 +0100
@@ -30,14 +30,17 @@
 
 /* ------------------------------------------------------------------ */
 
-static unsigned int video_debug  = 0;
-static unsigned int gbuffers     = 8;
-static unsigned int gbufsize     = 768*576*4;
-static unsigned int gbufsize_max = 768*576*4;
+static unsigned int video_debug   = 0;
+static unsigned int gbuffers      = 8;
+static unsigned int noninterlaced = 0;
+static unsigned int gbufsize      = 768*576*4;
+static unsigned int gbufsize_max  = 768*576*4;
 MODULE_PARM(video_debug,"i");
 MODULE_PARM_DESC(video_debug,"enable debug messages [video]");
 MODULE_PARM(gbuffers,"i");
 MODULE_PARM_DESC(gbuffers,"number of capture buffers, range 2-32");
+MODULE_PARM(noninterlaced,"i");
+MODULE_PARM_DESC(noninterlaced,"video input is noninterlaced");
 
 #define dprintk(fmt, arg...)	if (video_debug) \
 	printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg)
@@ -149,8 +152,6 @@ static struct saa7134_tvnorm tvnorms[] =
 	{
 		.name          = "PAL",
 		.id            = V4L2_STD_PAL,
-		.width         = 720,
-		.height        = 576,
 
 		.sync_control  = 0x18,
 		.luma_control  = 0x40,
@@ -169,8 +170,6 @@ static struct saa7134_tvnorm tvnorms[] =
 	},{
 		.name          = "NTSC",
 		.id            = V4L2_STD_NTSC,
-		.width         = 720,
-		.height        = 480,
 
 		.sync_control  = 0x59,
 		.luma_control  = 0x40,
@@ -189,8 +188,6 @@ static struct saa7134_tvnorm tvnorms[] =
 	},{
 		.name          = "SECAM",
 		.id            = V4L2_STD_SECAM,
-		.width         = 720,
-		.height        = 576,
 
 		.sync_control  = 0x18, /* old: 0x58, */
 		.luma_control  = 0x1b,
@@ -209,8 +206,6 @@ static struct saa7134_tvnorm tvnorms[] =
 	},{
 		.name          = "PAL-M",
 		.id            = V4L2_STD_PAL_M,
-		.width         = 720,
-		.height        = 480,
 
 		.sync_control  = 0x59,
 		.luma_control  = 0x40,
@@ -229,8 +224,6 @@ static struct saa7134_tvnorm tvnorms[] =
 	},{
 		.name          = "PAL-Nc",
 		.id            = V4L2_STD_PAL_Nc,
-		.width         = 720,
-		.height        = 576,
 
 		.sync_control  = 0x18,
 		.luma_control  = 0x40,
@@ -437,15 +430,33 @@ void res_free(struct saa7134_dev *dev, s
 static void set_tvnorm(struct saa7134_dev *dev, struct saa7134_tvnorm *norm)
 {
 	struct video_channel c;
-	int luma_control,mux;
+	int luma_control,sync_control,mux;
 
 	dprintk("set tv norm = %s\n",norm->name);
 	dev->tvnorm = norm;
 
 	mux = card_in(dev,dev->ctl_input).vmux;
 	luma_control = norm->luma_control;
+	sync_control = norm->sync_control;
+
 	if (mux > 5)
 		luma_control |= 0x80; /* svideo */
+	if (noninterlaced)
+		sync_control |= 0x20;
+
+	/* setup cropping */
+	dev->crop_bounds.left    = norm->h_start;
+	dev->crop_defrect.left   = norm->h_start;
+	dev->crop_bounds.width   = norm->h_stop - norm->h_start +1;
+	dev->crop_defrect.width  = norm->h_stop - norm->h_start +1;
+
+	dev->crop_bounds.top     = (norm->vbi_v_stop+1)*2;
+	dev->crop_defrect.top    = norm->video_v_start*2;
+	dev->crop_bounds.height  = ((norm->id & V4L2_STD_525_60) ? 524 : 624)
+		- dev->crop_bounds.top;
+	dev->crop_defrect.height = (norm->video_v_stop - norm->video_v_start +1)*2;
+
+	dev->crop_current = dev->crop_defrect;
 
 	/* setup video decoder */
 	saa_writeb(SAA7134_INCR_DELAY,            0x08);
@@ -458,7 +469,7 @@ static void set_tvnorm(struct saa7134_de
 	saa_writeb(SAA7134_HSYNC_STOP,            0xe0);
 	saa_writeb(SAA7134_SOURCE_TIMING1,        norm->src_timing);
 	
-	saa_writeb(SAA7134_SYNC_CTRL,             norm->sync_control);
+	saa_writeb(SAA7134_SYNC_CTRL,             sync_control);
 	saa_writeb(SAA7134_LUMA_CTRL,             luma_control);
 	saa_writeb(SAA7134_DEC_LUMA_BRIGHT,       dev->ctl_bright);
 	saa_writeb(SAA7134_DEC_LUMA_CONTRAST,     dev->ctl_contrast);
@@ -563,25 +574,30 @@ static void set_v_scale(struct saa7134_d
 static void set_size(struct saa7134_dev *dev, int task,
 		     int width, int height, int interlace)
 {
-	struct saa7134_tvnorm *norm = dev->tvnorm;
 	int prescale,xscale,yscale,y_even,y_odd;
+	int h_start, h_stop, v_start, v_stop;
 	int div = interlace ? 2 : 1;
 
 	/* setup video scaler */
-	saa_writeb(SAA7134_VIDEO_H_START1(task), norm->h_start       &  0xff);
-	saa_writeb(SAA7134_VIDEO_H_START2(task), norm->h_start       >> 8);
-	saa_writeb(SAA7134_VIDEO_H_STOP1(task),  norm->h_stop        &  0xff);
-	saa_writeb(SAA7134_VIDEO_H_STOP2(task),  norm->h_stop        >> 8);
-	saa_writeb(SAA7134_VIDEO_V_START1(task), norm->video_v_start &  0xff);
-	saa_writeb(SAA7134_VIDEO_V_START2(task), norm->video_v_start >> 8);
-	saa_writeb(SAA7134_VIDEO_V_STOP1(task),  norm->video_v_stop  &  0xff);
-	saa_writeb(SAA7134_VIDEO_V_STOP2(task),  norm->video_v_stop  >> 8);
+	h_start = dev->crop_current.left;
+	v_start = dev->crop_current.top/2;
+	h_stop  = (dev->crop_current.left + dev->crop_current.width -1);
+	v_stop  = (dev->crop_current.top + dev->crop_current.height -1)/2;
+
+	saa_writeb(SAA7134_VIDEO_H_START1(task), h_start &  0xff);
+	saa_writeb(SAA7134_VIDEO_H_START2(task), h_start >> 8);
+	saa_writeb(SAA7134_VIDEO_H_STOP1(task),  h_stop  &  0xff);
+	saa_writeb(SAA7134_VIDEO_H_STOP2(task),  h_stop  >> 8);
+	saa_writeb(SAA7134_VIDEO_V_START1(task), v_start &  0xff);
+	saa_writeb(SAA7134_VIDEO_V_START2(task), v_start >> 8);
+	saa_writeb(SAA7134_VIDEO_V_STOP1(task),  v_stop  &  0xff);
+	saa_writeb(SAA7134_VIDEO_V_STOP2(task),  v_stop  >> 8);
 
-	prescale = norm->width / width;
+	prescale = dev->crop_defrect.width / width;
 	if (0 == prescale)
 		prescale = 1;
-	xscale = 1024 * norm->width / prescale / width;
-	yscale = 512 * div * norm->height / height;
+	xscale = 1024 * dev->crop_defrect.width / prescale / width;
+	yscale = 512 * div * dev->crop_defrect.height / height;
        	dprintk("prescale=%d xscale=%d yscale=%d\n",prescale,xscale,yscale);
 	set_h_prescale(dev,task,prescale);
 	saa_writeb(SAA7134_H_SCALE_INC1(task),      xscale &  0xff);
@@ -708,8 +724,8 @@ static int verify_preview(struct saa7134
 		return -EINVAL;
 
 	field = win->field;
-	maxw  = dev->tvnorm->width;
-	maxh  = dev->tvnorm->height;
+	maxw  = dev->crop_current.width;
+	maxh  = dev->crop_current.height;
 
 	if (V4L2_FIELD_ANY == field) {
                 field = (win->w.height > maxh/2)
@@ -895,8 +911,8 @@ static int buffer_prepare(struct file *f
 		return -EINVAL;
 	if (fh->width  < 48 ||
 	    fh->height < 32 ||
-	    fh->width  > dev->tvnorm->width ||
-	    fh->height > dev->tvnorm->height)
+	    fh->width  > dev->crop_current.width ||
+	    fh->height > dev->crop_current.height)
 		return -EINVAL;
 	size = (fh->width * fh->height * fh->fmt->depth) >> 3;
 	if (0 != buf->vb.baddr  &&  buf->vb.bsize < size)
@@ -1393,8 +1409,8 @@ int saa7134_try_fmt(struct saa7134_dev *
 			return -EINVAL;
 
 		field = f->fmt.pix.field;
-		maxw  = dev->tvnorm->width;
-		maxh  = dev->tvnorm->height;
+		maxw  = dev->crop_current.width;
+		maxh  = dev->crop_current.height;
 		
 		if (V4L2_FIELD_ANY == field) {
 			field = (f->fmt.pix.height > maxh/2)
@@ -1482,7 +1498,6 @@ int saa7134_s_fmt(struct saa7134_dev *de
 		}
 		up(&dev->lock);
 		return 0;
-		break;
 	case V4L2_BUF_TYPE_VBI_CAPTURE:
 		saa7134_vbi_fmt(dev,f);
 		return 0;
@@ -1674,6 +1689,74 @@ static int video_do_ioctl(struct inode *
 		return 0;
 	}
 
+	case VIDIOC_CROPCAP:
+	{
+		struct v4l2_cropcap *cap = arg;
+
+		if (cap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
+		    cap->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
+			return -EINVAL;
+		cap->bounds  = dev->crop_bounds;
+		cap->defrect = dev->crop_defrect;
+		cap->pixelaspect.numerator   = 1;
+		cap->pixelaspect.denominator = 1;
+		if (dev->tvnorm->id & V4L2_STD_525_60) {
+			cap->pixelaspect.numerator   = 11;
+			cap->pixelaspect.denominator = 10;
+		}
+		if (dev->tvnorm->id & V4L2_STD_625_50) {
+			cap->pixelaspect.numerator   = 54;
+			cap->pixelaspect.denominator = 59;
+		}
+		return 0;
+	}
+
+	case VIDIOC_G_CROP:
+	{
+		struct v4l2_crop * crop = arg;
+
+		if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
+		    crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
+			return -EINVAL;
+		crop->c = dev->crop_current;
+		return 0;
+	}
+	case VIDIOC_S_CROP:
+	{
+		struct v4l2_crop *crop = arg;
+		struct v4l2_rect *b = &dev->crop_bounds;
+
+		if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
+		    crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
+			return -EINVAL;
+		if (crop->c.height < 0)
+			return -EINVAL;
+		if (crop->c.width < 0)
+			return -EINVAL;
+
+		if (res_locked(fh->dev,RESOURCE_OVERLAY))
+			return -EBUSY;
+		if (res_locked(fh->dev,RESOURCE_VIDEO))
+			return -EBUSY;
+
+		if (crop->c.top < b->top)
+			crop->c.top = b->top;
+		if (crop->c.top > b->top + b->height)
+			crop->c.top = b->top + b->height;
+		if (crop->c.height > b->top - crop->c.top + b->height)
+			crop->c.height = b->top - crop->c.top + b->height;
+
+		if (crop->c.left < b->left)
+			crop->c.top = b->left;
+		if (crop->c.left > b->left + b->width)
+			crop->c.top = b->left + b->width;
+		if (crop->c.width > b->left - crop->c.left + b->width)
+			crop->c.width = b->left - crop->c.left + b->width;
+
+		dev->crop_current = crop->c;
+		return 0;
+	}
+
 	/* --- tuner ioctls ------------------------------------------ */
 	case VIDIOC_G_TUNER:
 	{
--- diff/drivers/media/video/saa7134/saa7134.h	2004-02-18 08:54:10.000000000 +0000
+++ source/drivers/media/video/saa7134/saa7134.h	2004-04-21 10:45:34.362479608 +0100
@@ -19,7 +19,7 @@
  */
 
 #include <linux/version.h>
-#define SAA7134_VERSION_CODE KERNEL_VERSION(0,2,9)
+#define SAA7134_VERSION_CODE KERNEL_VERSION(0,2,11)
 
 #include <linux/pci.h>
 #include <linux/i2c.h>
@@ -73,8 +73,6 @@ enum saa7134_video_out {
 struct saa7134_tvnorm {
 	char          *name;
 	v4l2_std_id   id;
-	unsigned int  width;
-	unsigned int  height;
 
 	/* video decoder */
 	unsigned int  sync_control;
@@ -301,7 +299,8 @@ struct saa7134_oss {
 	unsigned int               afmt;
 	unsigned int               rate;
 	unsigned int               channels;
-	unsigned int               recording;
+	unsigned int               recording_on;
+	unsigned int               dma_running;
 	unsigned int               blocks;
 	unsigned int               blksize;
 	unsigned int               bufsize;
@@ -395,6 +394,11 @@ struct saa7134_dev {
 	int                        ctl_y_odd;
 	int                        ctl_y_even;
 
+	/* crop */
+	struct v4l2_rect           crop_bounds;
+	struct v4l2_rect           crop_defrect;
+	struct v4l2_rect           crop_current;
+
 	/* other global state info */
 	unsigned int               automute;
 	struct saa7134_thread      thread;
--- diff/drivers/media/video/tuner.c	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/media/video/tuner.c	2004-04-21 10:45:34.363479456 +0100
@@ -233,7 +233,7 @@ static struct tunertype tuners[] = {
 	{ "Philips 1236D ATSC/NTSC daul in",Philips,ATSC,
 	  16*157.25,16*454.00,0xa0,0x90,0x30,0x8e,732},
         { "Philips NTSC MK3 (FM1236MK3 or FM1236/F)", Philips, NTSC,
-          16*160.00,16*442.00,0x01,0x02,0x04,0x8,732},
+          16*160.00,16*442.00,0x01,0x02,0x04,0x8e,732},
 
         { "Philips 4 in 1 (ATI TV Wonder Pro/Conexant)", Philips, NTSC,
           16*160.00,16*442.00,0x01,0x02,0x04,0x8e,732},
@@ -1050,8 +1050,12 @@ static int tuner_attach(struct i2c_adapt
 	t->radio_if2  = 10700*1000; // 10.7MHz - FM radio
 
         i2c_attach_client(client);
-	if (type < TUNERS)
+	if (type < TUNERS) {
 		set_type(client, type, "insmod option");
+		printk("tuner: The type=<n> insmod option will go away soon.\n");
+		printk("tuner: Please use the tuner=<n> option provided by\n");
+		printk("tuner: tv card core driver (bttv, saa7134, ...) instead.\n");
+	}
 	return 0;
 }
 
--- diff/drivers/media/video/v4l1-compat.c	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/media/video/v4l1-compat.c	2004-04-21 10:45:34.363479456 +0100
@@ -289,6 +289,7 @@ v4l_compat_translate_ioctl(struct inode 
 {
 	struct v4l2_capability  *cap2 = NULL;
 	struct v4l2_format	*fmt2 = NULL;
+	enum v4l2_buf_type      captype = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
 	struct v4l2_framebuffer fbuf2;
 	struct v4l2_input	input2;
@@ -465,6 +466,7 @@ v4l_compat_translate_ioctl(struct inode 
 		fmt2 = kmalloc(sizeof(*fmt2),GFP_KERNEL);
 		memset(fmt2,0,sizeof(*fmt2));
 		fmt2->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+		drv(inode, file, VIDIOC_STREAMOFF, &fmt2->type);
 		err1 = drv(inode, file, VIDIOC_G_FMT, fmt2);
 		if (err1 < 0)
 			dprintk("VIDIOCSWIN / VIDIOC_G_FMT: %d\n",err);
@@ -503,11 +505,10 @@ v4l_compat_translate_ioctl(struct inode 
 		int *on = arg;
 
 		if (0 == *on) {
-			enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 			/* dirty hack time.  But v4l1 has no STREAMOFF
 			 * equivalent in the API, and this one at
 			 * least comes close ... */
-			drv(inode, file, VIDIOC_STREAMOFF, &type);
+			drv(inode, file, VIDIOC_STREAMOFF, &captype);
 		}
 		err = drv(inode, file, VIDIOC_OVERLAY, arg);
 		if (err < 0)
@@ -858,7 +859,6 @@ v4l_compat_translate_ioctl(struct inode 
 	case VIDIOCMCAPTURE: /*  capture a frame  */
 	{
 		struct video_mmap	*mm = arg;
-		enum v4l2_buf_type	type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 
 		fmt2 = kmalloc(sizeof(*fmt2),GFP_KERNEL);
 		memset(&buf2,0,sizeof(buf2));
@@ -899,7 +899,7 @@ v4l_compat_translate_ioctl(struct inode 
 			dprintk("VIDIOCMCAPTURE / VIDIOC_QBUF: %d\n",err);
 			break;
 		}
-		err = drv(inode, file, VIDIOC_STREAMON, &type);
+		err = drv(inode, file, VIDIOC_STREAMON, &captype);
 		if (err < 0)
 			dprintk("VIDIOCMCAPTURE / VIDIOC_STREAMON: %d\n",err);
 		break;
@@ -922,6 +922,13 @@ v4l_compat_translate_ioctl(struct inode 
 			break;
 		}
 
+		/* make sure capture actually runs so we don't block forever */
+		err = drv(inode, file, VIDIOC_STREAMON, &captype);
+		if (err < 0) {
+			dprintk("VIDIOCSYNC / VIDIOC_STREAMON: %d\n",err);
+			break;
+		}
+
 		/*  Loop as long as the buffer is queued, but not done  */
 		while ((buf2.flags &
 			(V4L2_BUF_FLAG_QUEUED | V4L2_BUF_FLAG_DONE))
--- diff/drivers/media/video/videodev.c	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/media/video/videodev.c	2004-04-21 10:45:34.364479304 +0100
@@ -160,6 +160,9 @@ video_fix_command(unsigned int cmd)
 	case VIDIOC_G_AUDOUT_OLD:
 		cmd = VIDIOC_G_AUDOUT;
 		break;
+	case VIDIOC_CROPCAP_OLD:
+		cmd = VIDIOC_CROPCAP;
+		break;
 	}
 	return cmd;
 }
--- diff/drivers/media/video/w9966.c	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/media/video/w9966.c	2004-04-21 10:45:34.364479304 +0100
@@ -63,7 +63,7 @@
 //#define DEBUG				// Undef me for production
 
 #ifdef DEBUG
-#define DPRINTF(x, a...) printk(KERN_DEBUG "W9966: "__FUNCTION__ "(): "x, ##a)
+#define DPRINTF(x, a...) printk(KERN_DEBUG "W9966: %s(): "x, __FUNCTION__ , ##a)
 #else
 #define DPRINTF(x...)
 #endif
--- diff/drivers/media/video/zoran_procfs.c	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/media/video/zoran_procfs.c	2004-04-21 10:45:34.365479152 +0100
@@ -204,6 +204,9 @@ zoran_write_proc (struct file   *file,
 	char *line, *ldelim, *varname, *svar, *tdelim;
 	struct zoran *zr;
 
+	if (count > 32768)	/* Stupidity filter */
+		return -EINVAL;
+
 	zr = (struct zoran *) data;
 
 	string = sp = vmalloc(count + 1);
--- diff/drivers/message/fusion/Makefile	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/message/fusion/Makefile	2004-04-21 10:45:34.365479152 +0100
@@ -22,11 +22,6 @@ EXTRA_CFLAGS += ${MPT_CFLAGS}
 #EXTRA_CFLAGS += -DMPT_DEBUG_MSG_FRAME
 #EXTRA_CFLAGS += -DMPT_DEBUG_SG
 
-# This is a temporary fix for the reply/request fifo
-# for some 64bit archs. Uncommenting this line
-# will place the fifo's in 32bit space
-#EXTRA_CFLAGS += -DMPTBASE_MEM_ALLOC_FIFO_FIX
-
 #
 # driver/module specifics...
 #
--- diff/drivers/message/fusion/mptbase.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/message/fusion/mptbase.c	2004-04-21 10:45:34.368478696 +0100
@@ -123,12 +123,6 @@ MODULE_LICENSE("GPL");
 /*
  *  cmd line parameters
  */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,59)
-MODULE_PARM(PortIo, "0-1i");
-MODULE_PARM_DESC(PortIo, "[0]=Use mmap, 1=Use port io");
-#endif
-static int PortIo = 0;
-
 #ifdef MFCNT
 static int mfcounter = 0;
 #define PRINT_MF_COUNT 20000
@@ -269,8 +263,6 @@ struct _mpt_ioc_proc_list {
  */
 
 static struct pci_device_id mptbase_pci_table[] = {
-	{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC909,
-		PCI_ANY_ID, PCI_ANY_ID },
 	{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC929,
 		PCI_ANY_ID, PCI_ANY_ID },
 	{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FC919,
@@ -287,39 +279,10 @@ static struct pci_device_id mptbase_pci_
 };
 MODULE_DEVICE_TABLE(pci, mptbase_pci_table);
 
-
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-/* 20000207 -sralston
- *  GRRRRR...  IOSpace (port i/o) register access (for the 909) is back!
- * 20000517 -sralston
- *  Let's trying going back to default mmap register access...
- */
-
-static inline u32 CHIPREG_READ32(volatile u32 *a)
-{
-	if (PortIo)
-		return inl((unsigned long)a);
-	else
-		return readl(a);
-}
-
-static inline void CHIPREG_WRITE32(volatile u32 *a, u32 v)
-{
-	if (PortIo)
-		outl(v, (unsigned long)a);
-	else
-		writel(v, a);
-}
-
-static inline void CHIPREG_PIO_WRITE32(volatile u32 *a, u32 v)
-{
-	outl(v, (unsigned long)a);
-}
-
-static inline u32 CHIPREG_PIO_READ32(volatile u32 *a)
-{
-	return inl((unsigned long)a);
-}
+#define CHIPREG_READ32(addr) 		readl(addr)
+#define CHIPREG_WRITE32(addr,val) 	writel(val, addr)
+#define CHIPREG_PIO_WRITE32(addr,val)	outl(val, (unsigned long)addr)
+#define CHIPREG_PIO_READ32(addr) 	inl((unsigned long)addr)
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
@@ -1280,17 +1243,12 @@ mptbase_probe(struct pci_dev *pdev, cons
 		return r;
 	}
 
-#if 0
-	/* broken because some code assumes that multiple calls
-	   to pci_alloc_consistent return data in the same 4GB segment. 
-	   This cannot work on machines with enough memory. */
 	if (!pci_set_consistent_dma_mask(pdev, mask))
 		dprintk((KERN_INFO MYNAM
 			": Using 64 bit consistent mask\n"));
 	else
 		dprintk((KERN_INFO MYNAM
 			": Not using 64 bit consistent mask\n"));
-#endif
 
 	ioc = kmalloc(sizeof(MPT_ADAPTER), GFP_ATOMIC);
 	if (ioc == NULL) {
@@ -1304,23 +1262,6 @@ mptbase_probe(struct pci_dev *pdev, cons
 
 	ioc->pcidev = pdev;
 
-#if defined(MPTBASE_MEM_ALLOC_FIFO_FIX)
-	memcpy(&ioc->pcidev32,ioc->pcidev,sizeof(struct pci_dev));
-	if (pci_set_dma_mask(&ioc->pcidev32, 0xFFFFFFFF)) {
-		dprintk((KERN_INFO MYNAM
-			": error setting 32bit mask\n"));
-		kfree(ioc);
-		return -ENODEV;
-	}
-
-	if (pci_set_consistent_dma_mask(&ioc->pcidev32, 0xFFFFFFFF)) {
-		dprintk((KERN_INFO MYNAM
-			": error setting 32bit mask\n"));
-		kfree(ioc);
-		return -ENODEV;
-	}
-#endif
-
 	ioc->diagPending = 0;
 	spin_lock_init(&ioc->diagLock);
 
@@ -1382,32 +1323,24 @@ mptbase_probe(struct pci_dev *pdev, cons
 
 	dprintk((KERN_INFO MYNAM ": MPT adapter @ %lx, msize=%dd bytes\n", mem_phys, msize));
 	dprintk((KERN_INFO MYNAM ": (port i/o @ %lx, psize=%dd bytes)\n", port, psize));
-	dprintk((KERN_INFO MYNAM ": Using %s register access method\n", PortIo ? "PortIo" : "MemMap"));
 
 	mem = NULL;
-	if (! PortIo) {
-		/* Get logical ptr for PciMem0 space */
-		/*mem = ioremap(mem_phys, msize);*/
-		mem = ioremap(mem_phys, 0x100);
-		if (mem == NULL) {
-			printk(KERN_ERR MYNAM ": ERROR - Unable to map adapter memory!\n");
-			kfree(ioc);
-			return -EINVAL;
-		}
-		ioc->memmap = mem;
+	/* Get logical ptr for PciMem0 space */
+	/*mem = ioremap(mem_phys, msize);*/
+	mem = ioremap(mem_phys, 0x100);
+	if (mem == NULL) {
+		printk(KERN_ERR MYNAM ": ERROR - Unable to map adapter memory!\n");
+		kfree(ioc);
+		return -EINVAL;
 	}
+	ioc->memmap = mem;
 	dprintk((KERN_INFO MYNAM ": mem = %p, mem_phys = %lx\n", mem, mem_phys));
 
 	dprintk((KERN_INFO MYNAM ": facts @ %p, pfacts[0] @ %p\n",
 			&ioc->facts, &ioc->pfacts[0]));
-	if (PortIo) {
-		u8 *pmem = (u8*)port;
-		ioc->mem_phys = port;
-		ioc->chip = (SYSIF_REGS*)pmem;
-	} else {
-		ioc->mem_phys = mem_phys;
-		ioc->chip = (SYSIF_REGS*)mem;
-	}
+
+	ioc->mem_phys = mem_phys;
+	ioc->chip = (SYSIF_REGS*)mem;
 
 	/* Save Port IO values incase we need to do downloadboot */
 	{
@@ -1417,11 +1350,7 @@ mptbase_probe(struct pci_dev *pdev, cons
 	}
 
 	ioc->chip_type = FCUNK;
-	if (pdev->device == MPI_MANUFACTPAGE_DEVICEID_FC909) {
-		ioc->chip_type = FC909;
-		ioc->prod_name = "LSIFC909";
-	}
-	else if (pdev->device == MPI_MANUFACTPAGE_DEVICEID_FC929) {
+	if (pdev->device == MPI_MANUFACTPAGE_DEVICEID_FC929) {
 		ioc->chip_type = FC929;
 		ioc->prod_name = "LSIFC929";
 	}
@@ -2075,7 +2004,7 @@ static void
 mpt_adapter_disable(MPT_ADAPTER *this, int freeup)
 {
 	if (this != NULL) {
-		int sz;
+		int sz=0;
 		u32 state;
 		int ret;
 
@@ -2100,28 +2029,18 @@ mpt_adapter_disable(MPT_ADAPTER *this, i
 		/* Clear any lingering interrupt */
 		CHIPREG_WRITE32(&this->chip->IntStatus, 0);
 
-		if (freeup && this->reply_alloc != NULL) {
-			sz = (this->reply_sz * this->reply_depth) + 128;
-			pci_free_consistent(this->pcidev, sz,
-					this->reply_alloc, this->reply_alloc_dma);
+		if (freeup && this->fifo_pool != NULL) {
+			pci_free_consistent(this->pcidev,
+				this->fifo_pool_sz,
+				this->fifo_pool, this->fifo_pool_dma);
 			this->reply_frames = NULL;
 			this->reply_alloc = NULL;
-			this->alloc_total -= sz;
-		}
-
-		if (freeup && this->req_alloc != NULL) {
-			sz = (this->req_sz * this->req_depth) + 128;
-			/*
-			 *  Rounding UP to nearest 4-kB boundary here...
-			 */
-			sz = ((sz + 0x1000UL - 1UL) / 0x1000) * 0x1000;
-			pci_free_consistent(this->pcidev, sz,
-					this->req_alloc, this->req_alloc_dma);
 			this->req_frames = NULL;
 			this->req_alloc = NULL;
-			this->alloc_total -= sz;
+			this->chain_alloc = NULL;
+			this->fifo_pool = NULL;
+			this->alloc_total -= this->fifo_pool_sz;
 		}
-
 		if (freeup && this->sense_buf_pool != NULL) {
 			sz = (this->req_depth * MPT_SENSE_BUFFER_ALLOC);
 			pci_free_consistent(this->pcidev, sz,
@@ -2572,10 +2491,10 @@ GetIocFacts(MPT_ADAPTER *ioc, int sleepF
 			 * Set values for this IOC's request & reply frame sizes,
 			 * and request & reply queue depths...
 			 */
-			ioc->req_sz = MIN(MPT_DEFAULT_FRAME_SIZE, facts->RequestFrameSize * 4);
-			ioc->req_depth = MIN(MPT_MAX_REQ_DEPTH, facts->GlobalCredits);
+			ioc->req_sz = min(MPT_DEFAULT_FRAME_SIZE, facts->RequestFrameSize * 4);
+			ioc->req_depth = min_t(int, MPT_MAX_REQ_DEPTH, facts->GlobalCredits);
 			ioc->reply_sz = MPT_REPLY_FRAME_SIZE;
-			ioc->reply_depth = MIN(MPT_DEFAULT_REPLY_DEPTH, facts->ReplyQueueDepth);
+			ioc->reply_depth = min_t(int, MPT_DEFAULT_REPLY_DEPTH, facts->ReplyQueueDepth);
 
 			dprintk((MYIOC_s_INFO_FMT "reply_sz=%3d, reply_depth=%4d\n",
 				ioc->name, ioc->reply_sz, ioc->reply_depth));
@@ -3799,105 +3718,126 @@ PrimeIocFifos(MPT_ADAPTER *ioc)
 	unsigned long b;
 	unsigned long flags;
 	dma_addr_t aligned_mem_dma;
-	u8 *mem, *aligned_mem;
+	u8 *aligned_mem;
 	int i, sz;
+	int chain_buffer_sz, reply_buffer_sz, request_buffer_sz;
+	int scale, num_sge, num_chain;
 
-	/*  Prime reply FIFO...  */
+	/* request buffer size,  rounding UP to nearest 4-kB boundary */
+	request_buffer_sz = (ioc->req_sz * ioc->req_depth) + 128;
+	request_buffer_sz = ((request_buffer_sz + 0x1000UL - 1UL) / 0x1000) * 0x1000;
 
-	if (ioc->reply_frames == NULL) {
-		sz = (ioc->reply_sz * ioc->reply_depth) + 128;
-#if defined(MPTBASE_MEM_ALLOC_FIFO_FIX)
-		mem = pci_alloc_consistent(&ioc->pcidev32, sz, &ioc->reply_alloc_dma);
-#else		
-		mem = pci_alloc_consistent(ioc->pcidev, sz, &ioc->reply_alloc_dma);
-#endif		
-		if (mem == NULL)
-			goto out_fail;
+	/* reply buffer size */
+	reply_buffer_sz = (ioc->reply_sz * ioc->reply_depth) + 128;
 
-		memset(mem, 0, sz);
-		ioc->alloc_total += sz;
-		ioc->reply_alloc = mem;
-		dprintk((KERN_INFO MYNAM ": %s.reply_alloc  @ %p[%p], sz=%d bytes\n",
-			 	ioc->name, mem, (void *)(ulong)ioc->reply_alloc_dma, sz));
+	/* chain buffer size, copied from from mptscsih_initChainBuffers()
+	 *
+	 * Calculate the number of chain buffers needed(plus 1) per I/O
+	 * then multiply the the maximum number of simultaneous cmds
+	 *
+	 * num_sge = num sge in request frame + last chain buffer
+	 * scale = num sge per chain buffer if no chain element
+	 */
 
-		b = (unsigned long) mem;
-		b = (b + (0x80UL - 1UL)) & ~(0x80UL - 1UL); /* round up to 128-byte boundary */
-		aligned_mem = (u8 *) b;
-		ioc->reply_frames = (MPT_FRAME_HDR *) aligned_mem;
-		ioc->reply_frames_dma =
-			(ioc->reply_alloc_dma + (aligned_mem - mem));
+	scale = ioc->req_sz/(sizeof(dma_addr_t) + sizeof(u32));
+	if (sizeof(dma_addr_t) == sizeof(u64))
+		num_sge =  scale + (ioc->req_sz - 60) / (sizeof(dma_addr_t) + sizeof(u32));
+	else
+		num_sge =  1 + scale + (ioc->req_sz - 64) / (sizeof(dma_addr_t) + sizeof(u32));
 
-		ioc->reply_frames_low_dma = (u32) (ioc->reply_frames_dma & 0xFFFFFFFF);
+	num_chain = 1;
+	while (MPT_SCSI_SG_DEPTH - num_sge > 0) {
+		num_chain++;
+		num_sge += (scale - 1);
 	}
+	num_chain++;
 
-	/* Post Reply frames to FIFO
-	 */
-	aligned_mem_dma = ioc->reply_frames_dma;
-	dprintk((KERN_INFO MYNAM ": %s.reply_frames @ %p[%p]\n",
-		 	ioc->name, ioc->reply_frames, (void *)(ulong)aligned_mem_dma));
+	if ((int)ioc->chip_type > (int) FC929)
+		num_chain *= MPT_SCSI_CAN_QUEUE;
+	else
+		num_chain *= MPT_FC_CAN_QUEUE;
 
-	for (i = 0; i < ioc->reply_depth; i++) {
-		/*  Write each address to the IOC!  */
-		CHIPREG_WRITE32(&ioc->chip->ReplyFifo, aligned_mem_dma);
-		aligned_mem_dma += ioc->reply_sz;
-	}
+	chain_buffer_sz = num_chain * ioc->req_sz;
 
+	if(ioc->fifo_pool == NULL) {
 
-	/*  Request FIFO - WE manage this!  */
+		ioc->fifo_pool_sz = request_buffer_sz +
+			reply_buffer_sz + chain_buffer_sz;
 
-	if (ioc->req_frames == NULL) {
-		sz = (ioc->req_sz * ioc->req_depth) + 128;
-		/*
-		 *  Rounding UP to nearest 4-kB boundary here...
-		 */
-		sz = ((sz + 0x1000UL - 1UL) / 0x1000) * 0x1000;
+		ioc->fifo_pool = pci_alloc_consistent(ioc->pcidev,
+		ioc->fifo_pool_sz, &ioc->fifo_pool_dma);
 
-#if defined(MPTBASE_MEM_ALLOC_FIFO_FIX)
-		mem = pci_alloc_consistent(&ioc->pcidev32, sz, &ioc->req_alloc_dma);
-#else
-		mem = pci_alloc_consistent(ioc->pcidev, sz, &ioc->req_alloc_dma);
-#endif		
-		if (mem == NULL)
+		if( ioc->fifo_pool == NULL)
 			goto out_fail;
 
-		memset(mem, 0, sz);
-		ioc->alloc_total += sz;
-		ioc->req_alloc = mem;
+		ioc->alloc_total += ioc->fifo_pool_sz;
+		memset(ioc->fifo_pool, 0, ioc->fifo_pool_sz);
+
+		/* reply fifo pointers */
+		ioc->reply_alloc = ioc->fifo_pool;
+		ioc->reply_alloc_dma = ioc->fifo_pool_dma;
+		/* request fifo pointers */
+		ioc->req_alloc = ioc->reply_alloc+reply_buffer_sz;
+		ioc->req_alloc_dma = ioc->reply_alloc_dma+reply_buffer_sz;
+		/* chain buffer pointers */
+		ioc->chain_alloc = ioc->req_alloc+request_buffer_sz;
+		ioc->chain_alloc_dma = ioc->req_alloc_dma+request_buffer_sz;
+		ioc->chain_alloc_sz = chain_buffer_sz;
+
+		/*  Prime reply FIFO...  */
+		dprintk((KERN_INFO MYNAM ": %s.reply_alloc  @ %p[%p], sz=%d bytes\n",
+			 	ioc->name, mem, (void *)(ulong)ioc->reply_alloc_dma, reply_buffer_sz));
+
+		b = (unsigned long) ioc->reply_alloc;
+		b = (b + (0x80UL - 1UL)) & ~(0x80UL - 1UL); /* round up to 128-byte boundary */
+		aligned_mem = (u8 *) b;
+		ioc->reply_frames = (MPT_FRAME_HDR *) aligned_mem;
+		ioc->reply_frames_dma =
+			(ioc->reply_alloc_dma + (aligned_mem - ioc->reply_alloc));
+
+		ioc->reply_frames_low_dma = (u32) (ioc->reply_frames_dma & 0xFFFFFFFF);
+	
+		/*  Request FIFO - WE manage this!  */
 		dprintk((KERN_INFO MYNAM ": %s.req_alloc    @ %p[%p], sz=%d bytes\n",
-			 	ioc->name, mem, (void *)(ulong)ioc->req_alloc_dma, sz));
+			 	ioc->name, mem, (void *)(ulong)ioc->req_alloc_dma, request_buffer_sz));
 
-		b = (unsigned long) mem;
+		b = (unsigned long) ioc->req_alloc;
 		b = (b + (0x80UL - 1UL)) & ~(0x80UL - 1UL); /* round up to 128-byte boundary */
 		aligned_mem = (u8 *) b;
 		ioc->req_frames = (MPT_FRAME_HDR *) aligned_mem;
 		ioc->req_frames_dma =
-			(ioc->req_alloc_dma + (aligned_mem - mem));
+			(ioc->req_alloc_dma + (aligned_mem - ioc->req_alloc));
 
 		ioc->req_frames_low_dma = (u32) (ioc->req_frames_dma & 0xFFFFFFFF);
 
-		if (sizeof(dma_addr_t) == sizeof(u64)) {
-			/* Check: upper 32-bits of the request and reply frame
-			 * physical addresses must be the same.
-			 */
-			if (((u64)ioc->req_frames_dma >> 32) != ((u64)ioc->reply_frames_dma >> 32)){
-				goto out_fail;
-			}
-		}
-
 #if defined(CONFIG_MTRR) && 0
 		/*
 		 *  Enable Write Combining MTRR for IOC's memory region.
 		 *  (at least as much as we can; "size and base must be
 		 *  multiples of 4 kiB"
 		 */
-		ioc->mtrr_reg = mtrr_add(ioc->req_alloc_dma,
-					 sz,
+		ioc->mtrr_reg = mtrr_add(ioc->fifo_pool,
+					 ioc->fifo_pool_sz,
 					 MTRR_TYPE_WRCOMB, 1);
 		dprintk((MYIOC_s_INFO_FMT "MTRR region registered (base:size=%08x:%x)\n",
-				ioc->name, ioc->req_alloc_dma, sz));
+				ioc->name, ioc->fifo_pool, ioc->fifo_pool_sz));
 #endif
+
+	} /* ioc->fifo_pool == NULL */
+	
+	/* Post Reply frames to FIFO
+	 */
+	aligned_mem_dma = ioc->reply_frames_dma;
+	dprintk((KERN_INFO MYNAM ": %s.reply_frames @ %p[%p]\n",
+		 	ioc->name, ioc->reply_frames, (void *)(ulong)aligned_mem_dma));
+
+	for (i = 0; i < ioc->reply_depth; i++) {
+		/*  Write each address to the IOC!  */
+		CHIPREG_WRITE32(&ioc->chip->ReplyFifo, aligned_mem_dma);
+		aligned_mem_dma += ioc->reply_sz;
 	}
 
+
 	/* Initialize Request frames linked list
 	 */
 	aligned_mem_dma = ioc->req_frames_dma;
@@ -3931,24 +3871,17 @@ PrimeIocFifos(MPT_ADAPTER *ioc)
 	return 0;
 
 out_fail:
-	if (ioc->reply_alloc != NULL) {
-		sz = (ioc->reply_sz * ioc->reply_depth) + 128;
+	if (ioc->fifo_pool != NULL) {
 		pci_free_consistent(ioc->pcidev,
-				sz,
-				ioc->reply_alloc, ioc->reply_alloc_dma);
+				ioc->fifo_pool_sz,
+				ioc->fifo_pool, ioc->fifo_pool_dma);
 		ioc->reply_frames = NULL;
 		ioc->reply_alloc = NULL;
-		ioc->alloc_total -= sz;
-	}
-	if (ioc->req_alloc != NULL) {
-		sz = (ioc->req_sz * ioc->req_depth) + 128;
-		/*
-		 *  Rounding UP to nearest 4-kB boundary here...
-		 */
-		sz = ((sz + 0x1000UL - 1UL) / 0x1000) * 0x1000;
-		pci_free_consistent(ioc->pcidev,
-				sz,
-				ioc->req_alloc, ioc->req_alloc_dma);
+		ioc->req_frames = NULL;
+		ioc->req_alloc = NULL;
+		ioc->chain_alloc = NULL;
+		ioc->fifo_pool = NULL;
+		ioc->alloc_total -= ioc->fifo_pool_sz;
 #if defined(CONFIG_MTRR) && 0
 		if (ioc->mtrr_reg > 0) {
 			mtrr_del(ioc->mtrr_reg, 0, 0);
@@ -3956,9 +3889,6 @@ out_fail:
 					ioc->name));
 		}
 #endif
-		ioc->req_frames = NULL;
-		ioc->req_alloc = NULL;
-		ioc->alloc_total -= sz;
 	}
 	if (ioc->sense_buf_pool != NULL) {
 		sz = (ioc->req_depth * MPT_SENSE_BUFFER_ALLOC);
@@ -4070,7 +4000,7 @@ mpt_handshake_req_reply_wait(MPT_ADAPTER
 		/*
 		 * Copy out the cached reply...
 		 */
-		for (ii=0; ii < MIN(replyBytes/2,mptReply->MsgLength*2); ii++)
+		for (ii=0; ii < min(replyBytes/2,mptReply->MsgLength*2); ii++)
 			u16reply[ii] = ioc->hs_reply[ii];
 	} else {
 		return -99;
@@ -4317,7 +4247,7 @@ GetLanConfigPages(MPT_ADAPTER *ioc)
 
 			if ((rc = mpt_config(ioc, &cfg)) == 0) {
 				/* save the data */
-				copy_sz = MIN(sizeof(LANPage0_t), data_sz);
+				copy_sz = min_t(int, sizeof(LANPage0_t), data_sz);
 				memcpy(&ioc->lan_cnfg_page0, ppage0_alloc, copy_sz);
 
 			}
@@ -4362,7 +4292,7 @@ GetLanConfigPages(MPT_ADAPTER *ioc)
 
 		if ((rc = mpt_config(ioc, &cfg)) == 0) {
 			/* save the data */
-			copy_sz = MIN(sizeof(LANPage1_t), data_sz);
+			copy_sz = min_t(int, sizeof(LANPage1_t), data_sz);
 			memcpy(&ioc->lan_cnfg_page1, ppage1_alloc, copy_sz);
 		}
 
@@ -4431,7 +4361,7 @@ GetFcPortPage0(MPT_ADAPTER *ioc, int por
 		if ((rc = mpt_config(ioc, &cfg)) == 0) {
 			/* save the data */
 			pp0dest = &ioc->fc_port_page0[portnum];
-			copy_sz = MIN(sizeof(FCPortPage0_t), data_sz);
+			copy_sz = min_t(int, sizeof(FCPortPage0_t), data_sz);
 			memcpy(pp0dest, ppage0_alloc, copy_sz);
 
 			/*
@@ -5517,9 +5447,7 @@ procmpt_destroy(void)
 			(void) sprintf(pname+namelen, "/%s", mpt_ioc_proc_list[ii].name);
 			remove_proc_entry(pname, NULL);
 		}
-
 		remove_proc_entry(ioc->name, mpt_proc_root_dir);
-
 		ioc = mpt_adapter_find_next(ioc);
 	}
 
@@ -6329,7 +6257,6 @@ fusion_exit(void)
 {
 
 	dprintk((KERN_INFO MYNAM ": fusion_exit() called!\n"));
-	pci_unregister_driver(&mptbase_driver);
 
 	/* Whups?  20010120 -sralston
 	 *  Moved this *above* removal of all MptAdapters!
@@ -6337,7 +6264,7 @@ fusion_exit(void)
 #ifdef CONFIG_PROC_FS
 	(void) procmpt_destroy();
 #endif
-
+	pci_unregister_driver(&mptbase_driver);
 	mpt_reset_deregister(mpt_base_index);
 }
 
--- diff/drivers/message/fusion/mptbase.h	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/message/fusion/mptbase.h	2004-04-21 10:45:34.369478544 +0100
@@ -81,8 +81,8 @@
 #define COPYRIGHT	"Copyright (c) 1999-2004 " MODULEAUTHOR
 #endif
 
-#define MPT_LINUX_VERSION_COMMON	"3.01.01"
-#define MPT_LINUX_PACKAGE_NAME		"@(#)mptlinux-3.01.01"
+#define MPT_LINUX_VERSION_COMMON	"3.01.03"
+#define MPT_LINUX_PACKAGE_NAME		"@(#)mptlinux-3.01.03"
 #define WHAT_MAGIC_STRING		"@" "(" "#" ")"
 
 #define show_mptmod_ver(s,ver)  \
@@ -156,6 +156,28 @@
 #define C0_1030				0x08
 #define XL_929				0x01
 
+
+/*
+ *	Try to keep these at 2^N-1
+ */
+#define MPT_FC_CAN_QUEUE	127
+#define MPT_SCSI_CAN_QUEUE	127
+
+/*
+ * Set the MAX_SGE value based on user input.
+ */
+#ifdef  CONFIG_FUSION_MAX_SGE
+#if     CONFIG_FUSION_MAX_SGE  < 16
+#define MPT_SCSI_SG_DEPTH	16
+#elif   CONFIG_FUSION_MAX_SGE  > 128
+#define MPT_SCSI_SG_DEPTH	128
+#else
+#define MPT_SCSI_SG_DEPTH	CONFIG_FUSION_MAX_SGE
+#endif
+#else
+#define MPT_SCSI_SG_DEPTH	40
+#endif
+
 #ifdef __KERNEL__	/* { */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 
@@ -581,6 +603,12 @@ typedef struct _MPT_ADAPTER
 	int			 alloc_total;
 	u32			 last_state;
 	int			 active;
+	u8			*fifo_pool;	/* dma pool for fifo's */
+	dma_addr_t		 fifo_pool_dma;
+	int			 fifo_pool_sz;	/* allocated size */
+	u8			*chain_alloc;	/* chain buffer alloc ptr */
+	dma_addr_t		chain_alloc_dma;
+	int			chain_alloc_sz;
 	u8			*reply_alloc;	/* Reply frames alloc ptr */
 	dma_addr_t		 reply_alloc_dma;
 	MPT_FRAME_HDR		*reply_frames;	/* Reply msg frames - rounded up! */
@@ -608,9 +636,6 @@ typedef struct _MPT_ADAPTER
 	u32			 sense_buf_low_dma;
 	int			 mtrr_reg;
 	struct pci_dev		*pcidev;	/* struct pci_dev pointer */
-#if defined(MPTBASE_MEM_ALLOC_FIFO_FIX)
-	struct pci_dev		pcidev32;	/* struct pci_dev pointer */
-#endif	
 	u8			*memmap;	/* mmap address */
 	struct Scsi_Host	*sh;		/* Scsi Host pointer */
 	ScsiCfgData		spi_data;	/* Scsi config. data */
@@ -1061,13 +1086,6 @@ extern int		  mpt_ASCQ_TableSz;
 /*
  *  More (public) macros...
  */
-#ifndef MIN
-#define MIN(a, b)   (((a) < (b)) ? (a) : (b))
-#endif
-#ifndef MAX
-#define MAX(a, b)   (((a) > (b)) ? (a) : (b))
-#endif
-
 #ifndef offsetof
 #define offsetof(t, m)	((size_t) (&((t *)0)->m))
 #endif
--- diff/drivers/message/fusion/mptctl.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/message/fusion/mptctl.c	2004-04-21 10:45:34.371478240 +0100
@@ -285,7 +285,7 @@ mptctl_reply(MPT_ADAPTER *ioc, MPT_FRAME
 				dctlprintk((MYIOC_s_INFO_FMT ": Copying Reply Frame @%p to IOC!\n",
 						ioc->name, reply));
 				memcpy(ioc->ioctl->ReplyFrame, reply,
-					MIN(ioc->reply_sz, 4*reply->u.reply.MsgLength));
+					min(ioc->reply_sz, 4*reply->u.reply.MsgLength));
 				ioc->ioctl->status |= MPT_IOCTL_STATUS_RF_VALID;
 
 				/* Set the command status to GOOD if IOC Status is GOOD
@@ -336,7 +336,7 @@ mptctl_reply(MPT_ADAPTER *ioc, MPT_FRAME
 			// NOTE: Expects/requires non-Turbo reply!
 			dctlprintk((MYIOC_s_INFO_FMT ":Caching MPI_FUNCTION_FW_DOWNLOAD reply!\n",
 				ioc->name));
-			memcpy(fwReplyBuffer, reply, MIN(sizeof(fwReplyBuffer), 4*reply->u.reply.MsgLength));
+			memcpy(fwReplyBuffer, reply, min_t(int, sizeof(fwReplyBuffer), 4*reply->u.reply.MsgLength));
 			ReplyMsg = (pMPIDefaultReply_t) fwReplyBuffer;
 		}
 	}
@@ -991,7 +991,7 @@ kbuf_alloc_2_sgl(int bytes, u32 sgdir, i
 	MptSge_t	*sgl;
 	int		 numfrags = 0;
 	int		 fragcnt = 0;
-	int		 alloc_sz = MIN(bytes,MAX_KMALLOC_SZ);	// avoid kernel warning msg!
+	int		 alloc_sz = min(bytes,MAX_KMALLOC_SZ);	// avoid kernel warning msg!
 	int		 bytes_allocd = 0;
 	int		 this_alloc;
 	dma_addr_t	 pa;					// phys addr
@@ -1036,7 +1036,7 @@ kbuf_alloc_2_sgl(int bytes, u32 sgdir, i
 	sgl = sglbuf;
 	sg_spill = ((ioc->req_sz - sge_offset)/(sizeof(dma_addr_t) + sizeof(u32))) - 1;
 	while (bytes_allocd < bytes) {
-		this_alloc = MIN(alloc_sz, bytes-bytes_allocd);
+		this_alloc = min(alloc_sz, bytes-bytes_allocd);
 		buflist[buflist_ent].len = this_alloc;
 		buflist[buflist_ent].kptr = pci_alloc_consistent(ioc->pcidev,
 								 this_alloc,
@@ -2293,9 +2293,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_
 		 */
 		if (ioc->ioctl->status & MPT_IOCTL_STATUS_RF_VALID) {
 			if (karg.maxReplyBytes < ioc->reply_sz) {
-				 sz = MIN(karg.maxReplyBytes, 4*ioc->ioctl->ReplyFrame[2]);
+				 sz = min(karg.maxReplyBytes, 4*ioc->ioctl->ReplyFrame[2]);
 			} else {
-				 sz = MIN(ioc->reply_sz, 4*ioc->ioctl->ReplyFrame[2]);
+				 sz = min(ioc->reply_sz, 4*ioc->ioctl->ReplyFrame[2]);
 			}
 
 			if (sz > 0) {
@@ -2314,7 +2314,7 @@ mptctl_do_mpt_command (struct mpt_ioctl_
 		/* If valid sense data, copy to user.
 		 */
 		if (ioc->ioctl->status & MPT_IOCTL_STATUS_SENSE_VALID) {
-			sz = MIN(karg.maxSenseBytes, MPT_SENSE_BUFFER_SIZE);
+			sz = min(karg.maxSenseBytes, MPT_SENSE_BUFFER_SIZE);
 			if (sz > 0) {
 				if (copy_to_user((char *)karg.senseDataPtr, ioc->ioctl->sense, sz)) {
 					printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - "
--- diff/drivers/message/fusion/mptscsih.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/message/fusion/mptscsih.c	2004-04-21 10:45:34.374477784 +0100
@@ -196,8 +196,9 @@ static int	mptscsih_doDv(MPT_SCSI_HOST *
 static void	mptscsih_dv_parms(MPT_SCSI_HOST *hd, DVPARAMETERS *dv,void *pPage);
 static void	mptscsih_fillbuf(char *buffer, int size, int index, int width);
 #endif
+#ifdef MODULE
 static int	mptscsih_setup(char *str);
-
+#endif
 /* module entry point */
 static int  __init   mptscsih_init  (void);
 static void __exit   mptscsih_exit  (void);
@@ -1061,26 +1062,6 @@ search_doneQ_for_cmd(MPT_SCSI_HOST *hd, 
 	return;
 }
 
-static void
-mptscsih_reset_timeouts (MPT_SCSI_HOST *hd)
-{
-	Scsi_Cmnd	*SCpnt;
-	int		 ii;
-	int		 max = hd->ioc->req_depth;
-		
-
-	for (ii= 0; ii < max; ii++) {
-		if ((SCpnt = hd->ScsiLookup[ii]) != NULL) {
-	/* calling mod_timer() panics in 2.6 kernel...
-	 * need to investigate
-	 */
-//			mod_timer(&SCpnt->eh_timeout, jiffies + (HZ * 60));
-			dtmprintk((MYIOC_s_WARN_FMT "resetting SCpnt=%p timeout + 60HZ",
-				(hd && hd->ioc) ? hd->ioc->name : "ioc?", SCpnt));
-		}
-	}
-}
-
 /*
  *	mptscsih_flush_running_cmds - For each command found, search
  *		Scsi_Host instance taskQ and reply to OS.
@@ -1239,6 +1220,16 @@ mptscsih_initChainBuffers (MPT_SCSI_HOST
 	int		sz, ii, num_chain;
 	int 		scale, num_sge;
 
+	/* chain buffer allocation done from PrimeIocFifos */	
+	if (hd->ioc->fifo_pool == NULL) 
+		return -1;
+	
+	hd->ChainBuffer = hd->ioc->chain_alloc;
+	hd->ChainBufferDMA = hd->ioc->chain_alloc_dma;
+	
+	dprintk((KERN_INFO "  ChainBuffer    @ %p(%p), sz=%d\n",
+		 hd->ChainBuffer, (void *)(ulong)hd->ChainBufferDMA, hd->ioc->chain_alloc_sz));
+		
 	/* ReqToChain size must equal the req_depth
 	 * index = req_idx
 	 */
@@ -1294,26 +1285,7 @@ mptscsih_initChainBuffers (MPT_SCSI_HOST
 		mem = (u8 *) hd->ChainToChain;
 	}
 	memset(mem, 0xFF, sz);
-	sz = num_chain * hd->ioc->req_sz;
-	if (hd->ChainBuffer == NULL) {
-		/* Allocate free chain buffer pool
-		 */
-#if defined(MPTBASE_MEM_ALLOC_FIFO_FIX)
-		mem = pci_alloc_consistent(&hd->ioc->pcidev32, sz, &hd->ChainBufferDMA);
-#else		
-		mem = pci_alloc_consistent(hd->ioc->pcidev, sz, &hd->ChainBufferDMA);
-#endif		
-		if (mem == NULL)
-			return -1;
 
-		hd->ChainBuffer = (u8*)mem;
-	} else {
-		mem = (u8 *) hd->ChainBuffer;
-	}
-	memset(mem, 0, sz);
-
-	dprintk((KERN_INFO "  ChainBuffer    @ %p(%p), sz=%d\n",
-		 hd->ChainBuffer, (void *)(ulong)hd->ChainBufferDMA, sz));
 
 	/* Initialize the free chain Q.
 	 */
@@ -1366,8 +1338,8 @@ mptscsih_report_queue_full(Scsi_Cmnd *sc
 
 		if (sc->device && sc->device->host != NULL && sc->device->host->hostdata != NULL)
 			ioc_str = ((MPT_SCSI_HOST *)sc->device->host->hostdata)->ioc->name;
-		printk(MYIOC_s_WARN_FMT "Device (%d:%d:%d) reported QUEUE_FULL!\n",
-				ioc_str, 0, sc->device->id, sc->device->lun);
+		dprintk((MYIOC_s_WARN_FMT "Device (%d:%d:%d) reported QUEUE_FULL!\n",
+				ioc_str, 0, sc->device->id, sc->device->lun));
 		last_queue_full = time;
 	}
 }
@@ -1761,7 +1733,6 @@ mptscsih_remove(struct pci_dev *pdev)
 		int sz1, sz2, sz3, sztarget=0;
 		int szr2chain = 0;
 		int szc2chain = 0;
-		int szchain = 0;
 		int szQ = 0;
 
 		mptscsih_shutdown(&pdev->dev);
@@ -1786,15 +1757,6 @@ mptscsih_remove(struct pci_dev *pdev)
 			hd->ChainToChain = NULL;
 		}
 
-		if (hd->ChainBuffer != NULL) {
-			sz2 = hd->num_chain * hd->ioc->req_sz;
-			szchain = szr2chain + szc2chain + sz2;
-
-			pci_free_consistent(hd->ioc->pcidev, sz2,
-				    hd->ChainBuffer, hd->ChainBufferDMA);
-			hd->ChainBuffer = NULL;
-		}
-
 		if (hd->memQ != NULL) {
 			szQ = host->can_queue * sizeof(MPT_DONE_Q);
 			kfree(hd->memQ);
@@ -3375,7 +3337,7 @@ mptscsih_slave_destroy(Scsi_Device *devi
 					raid_volume==0;i++)
 						
 					if(device->id == 
-					  hd->ioc->spi_data.pIocPg3->PhysDisk[i].PhysDiskNum) {
+					  hd->ioc->spi_data.pIocPg3->PhysDisk[i].PhysDiskID) {
 						raid_volume=1;
 						hd->ioc->spi_data.forceDv |=
 						  MPT_SCSICFG_RELOAD_IOC_PG3;
@@ -3706,8 +3668,6 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int
 		 */
 		hd->resetPending = 1;
 
-		mptscsih_reset_timeouts (hd);
-	
 	} else if (reset_phase == MPT_IOC_PRE_RESET) {
 		dtmprintk((MYIOC_s_WARN_FMT "Pre-Diag Reset\n", ioc->name));
 
@@ -4519,7 +4479,7 @@ void mptscsih_setTargetNegoParms(MPT_SCS
 					if (nfactor < pspi_data->minSyncFactor )
 						nfactor = pspi_data->minSyncFactor;
 
-					factor = MAX (factor, nfactor);
+					factor = max(factor, nfactor);
 					if (factor == MPT_ASYNC)
 						offset = 0;
 				} else {
@@ -4727,7 +4687,7 @@ mptscsih_writeSDP1(MPT_SCSI_HOST *hd, in
 		maxid = ioc->sh->max_id - 1;
 	} else if (ioc->sh) {
 		id = target_id;
-		maxid = MIN(id, ioc->sh->max_id - 1);
+		maxid = min_t(int, id, ioc->sh->max_id - 1);
 	}
 
 	for (; id <= maxid; id++) {
@@ -5134,7 +5094,7 @@ mptscsih_scandv_complete(MPT_ADAPTER *io
 				sense_data = ((u8 *)hd->ioc->sense_buf_pool +
 					(req_idx * MPT_SENSE_BUFFER_ALLOC));
 
-				sz = MIN (pReq->SenseBufferLength,
+				sz = min_t(int, pReq->SenseBufferLength,
 							SCSI_STD_SENSE_BYTES);
 				memcpy(hd->pLocal->sense, sense_data, sz);
 
@@ -5786,7 +5746,7 @@ mptscsih_domainValidation(void *arg)
 				ioc->spi_data.forceDv &= ~MPT_SCSICFG_RELOAD_IOC_PG3;
 			}
 
-			maxid = MIN (ioc->sh->max_id, MPT_MAX_SCSI_DEVICES);
+			maxid = min_t(int, ioc->sh->max_id, MPT_MAX_SCSI_DEVICES);
 
 			for (id = 0; id < maxid; id++) {
 				spin_lock_irqsave(&dvtaskQ_lock, flags);
@@ -6509,7 +6469,7 @@ mptscsih_doDv(MPT_SCSI_HOST *hd, int bus
 	if (echoBufSize > 0) {
 		iocmd.flags |= MPT_ICFLAG_ECHO;
 		if (dataBufSize > 0)
-			bufsize = MIN(echoBufSize, dataBufSize);
+			bufsize = min(echoBufSize, dataBufSize);
 		else
 			bufsize = echoBufSize;
 	} else if (dataBufSize == 0)
@@ -6520,7 +6480,7 @@ mptscsih_doDv(MPT_SCSI_HOST *hd, int bus
 
 	/* Data buffers for write-read-compare test max 1K.
 	 */
-	sz = MIN(bufsize, 1024);
+	sz = min(bufsize, 1024);
 
 	/* --- loop ----
 	 * On first pass, always issue a reserve.
@@ -6875,9 +6835,9 @@ mptscsih_dv_parms(MPT_SCSI_HOST *hd, DVP
 		}
 
 		/* limit by adapter capabilities */
-		width = MIN(width, hd->ioc->spi_data.maxBusWidth);
-		offset = MIN(offset, hd->ioc->spi_data.maxSyncOffset);
-		factor = MAX(factor, hd->ioc->spi_data.minSyncFactor);
+		width = min(width, hd->ioc->spi_data.maxBusWidth);
+		offset = min(offset, hd->ioc->spi_data.maxSyncOffset);
+		factor = max(factor, hd->ioc->spi_data.minSyncFactor);
 
 		/* Check Consistency */
 		if (offset && (factor < MPT_ULTRA2) && !width)
@@ -7217,19 +7177,22 @@ mptscsih_fillbuf(char *buffer, int size,
 #define	ARG_SEP	','
 #endif
 
+#ifdef MODULE
 static char setup_token[] __initdata =
 	"dv:"
 	"width:"
 	"factor:"
 	"saf-te:"
        ;	/* DO NOT REMOVE THIS ';' */
-
+#endif
+       
 #define OPT_DV			1
 #define OPT_MAX_WIDTH		2
 #define OPT_MIN_SYNC_FACTOR	3
 #define OPT_SAF_TE		4
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+#ifdef MODULE
 static int
 get_setup_token(char *p)
 {
@@ -7298,7 +7261,7 @@ mptscsih_setup(char *str)
 	}
 	return 1;
 }
-
+#endif
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 
 
--- diff/drivers/message/fusion/mptscsih.h	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/message/fusion/mptscsih.h	2004-04-21 10:45:34.375477632 +0100
@@ -66,12 +66,6 @@
  *	SCSI Public stuff...
  */
 
-/*
- *	Try to keep these at 2^N-1
- */
-#define MPT_FC_CAN_QUEUE	127
-#define MPT_SCSI_CAN_QUEUE	127
-
 #define MPT_SCSI_CMD_PER_DEV_HIGH	31
 #define MPT_SCSI_CMD_PER_DEV_LOW	7
 
@@ -79,21 +73,6 @@
 
 #define MPT_SCSI_MAX_SECTORS    8192
 
-/*
- * Set the MAX_SGE value based on user input.
- */
-#ifdef  CONFIG_FUSION_MAX_SGE
-#if     CONFIG_FUSION_MAX_SGE  < 16
-#define MPT_SCSI_SG_DEPTH	16
-#elif   CONFIG_FUSION_MAX_SGE  > 128
-#define MPT_SCSI_SG_DEPTH	128
-#else
-#define MPT_SCSI_SG_DEPTH	CONFIG_FUSION_MAX_SGE
-#endif
-#else
-#define MPT_SCSI_SG_DEPTH	40
-#endif
-
 /* To disable domain validation, uncomment the
  * following line. No effect for FC devices.
  * For SCSI devices, driver will negotiate to
--- diff/drivers/misc/Kconfig	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/misc/Kconfig	2004-04-21 10:45:34.375477632 +0100
@@ -16,7 +16,9 @@ config IBM_ASM
 	  processor. The driver is meant to be used in conjunction with
 	  a user space API.
 	  The ibmasm driver also enables the OS to use the UART on the
-          service processor board as a regular serial port.
+	  service processor board as a regular serial port. To make use of
+	  this feature serial driver support (CONFIG_SERIAL_8250) must be
+	  enabled.
 	  
 
 	  If unsure, say N.
--- diff/drivers/misc/ibmasm/Makefile	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/misc/ibmasm/Makefile	2004-04-21 10:45:34.375477632 +0100
@@ -1,7 +1,7 @@
 
 obj-$(CONFIG_IBM_ASM) := ibmasm.o
 
-ibmasm-objs :=	module.o      \
+ibmasm-y :=	module.o      \
 		ibmasmfs.o    \
 		event.o       \
 		command.o     \
@@ -9,5 +9,7 @@ ibmasm-objs :=	module.o      \
 		heartbeat.o   \
 		r_heartbeat.o \
 		dot_command.o \
-		lowlevel.o    \
-		uart.o
+		lowlevel.o
+
+ibmasm-$(CONFIG_SERIAL_8250) += uart.o
+
--- diff/drivers/misc/ibmasm/ibmasm.h	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/misc/ibmasm/ibmasm.h	2004-04-21 10:45:34.376477480 +0100
@@ -220,5 +220,10 @@ extern void ibmasmfs_unregister(void);
 extern void ibmasmfs_add_sp(struct service_processor *sp);
 
 /* uart */
+#ifdef CONFIG_SERIAL_8250
 extern void ibmasm_register_uart(struct service_processor *sp);
 extern void ibmasm_unregister_uart(struct service_processor *sp);
+#else
+#define ibmasm_register_uart(sp)	do { } while(0)
+#define ibmasm_unregister_uart(sp)	do { } while(0)
+#endif
--- diff/drivers/mtd/chips/cfi_cmdset_0001.c	2004-02-18 08:54:10.000000000 +0000
+++ source/drivers/mtd/chips/cfi_cmdset_0001.c	2004-04-21 10:45:34.376477480 +0100
@@ -1575,7 +1575,7 @@ static int cfi_intelext_lock(struct mtd_
 					ofs, len, DO_XXLOCK_ONEBLOCK_LOCK);
 	
 #ifdef DEBUG_LOCK_BITS
-	printk(KERN_DEBUG __FUNCTION__
+	printk(KERN_DEBUG
 	       "%s: lock status after, ret=%d\n", __FUNCTION__, ret);
 	cfi_intelext_varsize_frob(mtd, do_printlockstatus_oneblock,
 				  ofs, len, 0);
--- diff/drivers/mtd/devices/Kconfig	2003-09-17 12:28:07.000000000 +0100
+++ source/drivers/mtd/devices/Kconfig	2004-04-21 10:45:34.377477328 +0100
@@ -9,9 +9,9 @@ config MTD_PMC551
 	depends on MTD && PCI
 	---help---
 	  This provides a MTD device driver for the Ramix PMC551 RAM PCI card
-	  from Ramix Inc. <http://www.ramix.com/products/memory/pmc551.html>.
-	  These devices come in memory configurations from 32M - 1G.  If you
-	  have one, you probably want to enable this.
+	  from Ramix Inc. <http://www.ramix.com/products/>. These devices come
+	  in memory configurations from 32M - 1G.  If you have one, you
+	  probably want to enable this.
 
 	  If this driver is compiled as a module you get the ability to select
 	  the size of the aperture window pointing into the devices memory.
--- diff/drivers/mtd/devices/blkmtd.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/mtd/devices/blkmtd.c	2004-04-21 10:45:34.377477328 +0100
@@ -147,8 +147,7 @@ static int blkmtd_readpage(struct blkmtd
 		bio->bi_private = &event;
 		bio->bi_end_io = bi_read_complete;
 		if(bio_add_page(bio, page, PAGE_SIZE, 0) == PAGE_SIZE) {
-			submit_bio(READ, bio);
-			blk_run_queues();
+			submit_bio(READ_SYNC, bio);
 			wait_for_completion(&event);
 			err = test_bit(BIO_UPTODATE, &bio->bi_flags) ? 0 : -EIO;
 			bio_put(bio);
@@ -179,8 +178,7 @@ static int blkmtd_write_out(struct bio *
 	init_completion(&event);
 	bio->bi_private = &event;
 	bio->bi_end_io = bi_write_complete;
-	submit_bio(WRITE, bio);
-	blk_run_queues();
+	submit_bio(WRITE_SYNC, bio);
 	wait_for_completion(&event);
 	DEBUG(3, "submit_bio completed, bi_vcnt = %d\n", bio->bi_vcnt);
 	err = test_bit(BIO_UPTODATE, &bio->bi_flags) ? 0 : -EIO;
--- diff/drivers/mtd/maps/Kconfig	2003-08-26 10:00:52.000000000 +0100
+++ source/drivers/mtd/maps/Kconfig	2004-04-21 10:45:34.378477176 +0100
@@ -94,7 +94,7 @@ config MTD_SBC_GXX
 	  By default the flash is split into 3 partitions which are accessed
 	  as separate MTD devices. This board utilizes Intel StrataFlash.
 	  More info at
-	  <http://www.arcomcontrols.com/products/icp/pc104/processors/>.
+	  <http://www.arcomcontrols.com/products/icp/pc104/processors/SBC_GX1.htm>.
 
 config MTD_ELAN_104NC
 	tristate "CFI Flash device mapped on Arcom ELAN-104NC"
@@ -104,7 +104,7 @@ config MTD_ELAN_104NC
 	  System's ELAN-104NC development board. By default the flash
 	  is split into 3 partitions which are accessed as separate MTD
 	  devices. This board utilizes Intel StrataFlash. More info at
-	  <http://www.arcomcontrols.com/products/icp/pc104/processors/>.
+	  <http://www.arcomcontrols.com/products/icp/pc104/processors/ELAN104NC.htm>.
 
 config MTD_LUBBOCK
 	tristate "CFI Flash device mapped on Intel Lubbock XScale eval board"
@@ -120,7 +120,7 @@ config MTD_OCTAGON
 	  This provides a 'mapping' driver which supports the way in which
 	  the flash chips are connected in the Octagon-5066 Single Board
 	  Computer. More information on the board is available at
-	  <http://www.octagonsystems.com/Products/5066/5066.html>.
+	  <http://www.octagonsystems.com/CPUpages/5066.html>.
 
 config MTD_VMAX
 	tristate "JEDEC Flash device mapped on Tempustech VMAX SBC301"
@@ -129,7 +129,7 @@ config MTD_VMAX
 	  This provides a 'mapping' driver which supports the way in which
 	  the flash chips are connected in the Tempustech VMAX SBC301 Single
 	  Board Computer. More information on the board is available at
-	  <http://www.tempustech.com/tt301.htm>.
+	  <http://www.tempustech.com/>.
 
 config MTD_SCx200_DOCFLASH
 	tristate "Flash device mapped with DOCCS on NatSemi SCx200"
@@ -215,8 +215,8 @@ config MTD_DILNETPC
 	depends on X86 && MTD_CONCAT && MTD_PARTITIONS && MTD_CFI_INTELEXT
 	help
 	  MTD map driver for SSV DIL/Net PC Boards "DNP" and "ADNP".
-	  For details, see http://www.ssv-embedded.de/ssv/pc104/p169.htm
- 	  and http://www.ssv-embedded.de/ssv/pc104/p170.htm
+	  For details, see <http://www.ssv-embedded.de/ssv/pc104/p169.htm>
+ 	  and <http://www.ssv-embedded.de/ssv/pc104/p170.htm>
 
 config MTD_DILNETPC_BOOTSIZE
 	hex "Size of DIL/Net PC flash boot partition"
@@ -253,7 +253,7 @@ config MTD_RPXLITE
 	  a strange sparse mapping. This 'mapping' driver supports that
 	  arrangement, allowing the CFI probe and command set driver code
 	  to communicate with the chips on the RPXLite board. More at
-	  <http://www.embeddedplanet.com/rpx_lite_specification_sheet.htm>.
+	  <http://www.embeddedplanet.com/>.
 
 config MTD_MBX860
 	tristate "System flash on MBX860 board"
@@ -394,7 +394,7 @@ config MTD_DC21285
 	help
 	  This provides a driver for the flash accessed using Intel's
 	  21285 bridge used with Intel's StrongARM processors. More info at
-	  <http://developer.intel.com/design/bridge/quicklist/dsc-21285.htm>.
+	  <http://www.intel.com/design/bridge/docs/21285_documentation.htm>.
 
 config MTD_IQ80310
 	tristate "CFI Flash device mapped on the XScale IQ80310 board"
--- diff/drivers/mtd/nand/Kconfig	2003-06-30 10:07:21.000000000 +0100
+++ source/drivers/mtd/nand/Kconfig	2004-04-21 10:45:34.378477176 +0100
@@ -9,8 +9,8 @@ config MTD_NAND
 	depends on MTD
 	help
 	  This enables support for accessing all type of NAND flash
-	  devices with an 8-bit data bus interface. For further 
-	  information see www.linux-mtd.infradead.org/tech/nand.html.
+	  devices with an 8-bit data bus interface. For further information see
+	  <http://www.linux-mtd.infradead.org/tech/nand.html>.
 
 config MTD_NAND_VERIFY_WRITE
 	bool "Verify NAND page writes"
--- diff/drivers/net/3c509.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/3c509.c	2004-04-21 10:45:34.379477024 +0100
@@ -426,6 +426,7 @@ __again:
 			}
 
 			SET_MODULE_OWNER(dev);
+			SET_NETDEV_DEV(dev, &idev->dev);
 			pnp_cards++;
 
 			netdev_boot_setup_check(dev);
@@ -595,10 +596,8 @@ no_pnp:
 #endif
 
 	el3_cards++;
-#if !defined(__ISAPNP__) || defined(CONFIG_X86_PC9800)
 	lp->next_dev = el3_root_dev;
 	el3_root_dev = dev;
-#endif
 	return 0;
 
 out1:
--- diff/drivers/net/3c515.c	2004-02-18 08:54:10.000000000 +0000
+++ source/drivers/net/3c515.c	2004-04-21 10:45:34.380476872 +0100
@@ -538,6 +538,7 @@ static struct net_device *corkscrew_scan
 		     		inl(ioaddr + 0x2002), inw(ioaddr + 0x2000));
 			/* irq = inw(ioaddr + 0x2002) & 15; */ /* Use the irq from isapnp */
 			corkscrew_setup(dev, ioaddr, idev, cards_found++);
+			SET_NETDEV_DEV(dev, &idev->dev);
 			pnp_cards++;
 			err = register_netdev(dev);
 			if (!err)
--- diff/drivers/net/8139cp.c	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/net/8139cp.c	2004-04-21 10:45:34.382476568 +0100
@@ -1,6 +1,6 @@
 /* 8139cp.c: A Linux PCI Ethernet driver for the RealTek 8139C+ chips. */
 /*
-	Copyright 2001,2002 Jeff Garzik <jgarzik@pobox.com>
+	Copyright 2001-2004 Jeff Garzik <jgarzik@pobox.com>
 
 	Copyright (C) 2001, 2002 David S. Miller (davem@redhat.com) [tg3.c]
 	Copyright (C) 2000, 2001 David S. Miller (davem@redhat.com) [sungem.c]
@@ -48,8 +48,8 @@
  */
 
 #define DRV_NAME		"8139cp"
-#define DRV_VERSION		"1.1"
-#define DRV_RELDATE		"Aug 30, 2003"
+#define DRV_VERSION		"1.2"
+#define DRV_RELDATE		"Mar 22, 2004"
 
 
 #include <linux/config.h>
@@ -69,6 +69,7 @@
 #include <linux/ip.h>
 #include <linux/tcp.h>
 #include <linux/udp.h>
+#include <linux/cache.h>
 #include <asm/io.h>
 #include <asm/uaccess.h>
 
@@ -334,36 +335,36 @@ struct cp_extra_stats {
 };
 
 struct cp_private {
-	unsigned		tx_head;
-	unsigned		tx_tail;
-	unsigned		rx_tail;
-
 	void			*regs;
 	struct net_device	*dev;
 	spinlock_t		lock;
+	u32			msg_enable;
+
+	struct pci_dev		*pdev;
+	u32			rx_config;
+	u16			cpcmd;
+
+	struct net_device_stats net_stats;
+	struct cp_extra_stats	cp_stats;
+	struct cp_dma_stats	*nic_stats;
+	dma_addr_t		nic_stats_dma;
 
+	unsigned		rx_tail		____cacheline_aligned;
 	struct cp_desc		*rx_ring;
-	struct cp_desc		*tx_ring;
-	struct ring_info	tx_skb[CP_TX_RING_SIZE];
 	struct ring_info	rx_skb[CP_RX_RING_SIZE];
 	unsigned		rx_buf_sz;
+
+	unsigned		tx_head		____cacheline_aligned;
+	unsigned		tx_tail;
+
+	struct cp_desc		*tx_ring;
+	struct ring_info	tx_skb[CP_TX_RING_SIZE];
 	dma_addr_t		ring_dma;
 
 #if CP_VLAN_TAG_USED
 	struct vlan_group	*vlgrp;
 #endif
 
-	u32			msg_enable;
-
-	struct net_device_stats net_stats;
-	struct cp_extra_stats	cp_stats;
-	struct cp_dma_stats	*nic_stats;
-	dma_addr_t		nic_stats_dma;
-
-	struct pci_dev		*pdev;
-	u32			rx_config;
-	u16			cpcmd;
-
 	unsigned int		wol_enabled : 1; /* Is Wake-on-LAN enabled? */
 	u32			power_state[16];
 
@@ -424,25 +425,27 @@ static struct {
 #if CP_VLAN_TAG_USED
 static void cp_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
+	unsigned long flags;
 
-	spin_lock_irq(&cp->lock);
+	spin_lock_irqsave(&cp->lock, flags);
 	cp->vlgrp = grp;
 	cp->cpcmd |= RxVlanOn;
 	cpw16(CpCmd, cp->cpcmd);
-	spin_unlock_irq(&cp->lock);
+	spin_unlock_irqrestore(&cp->lock, flags);
 }
 
 static void cp_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
+	unsigned long flags;
 
-	spin_lock_irq(&cp->lock);
+	spin_lock_irqsave(&cp->lock, flags);
 	cp->cpcmd &= ~RxVlanOn;
 	cpw16(CpCmd, cp->cpcmd);
 	if (cp->vlgrp)
 		cp->vlgrp->vlan_devices[vid] = NULL;
-	spin_unlock_irq(&cp->lock);
+	spin_unlock_irqrestore(&cp->lock, flags);
 }
 #endif /* CP_VLAN_TAG_USED */
 
@@ -510,7 +513,7 @@ static inline unsigned int cp_rx_csum_ok
 
 static int cp_rx_poll (struct net_device *dev, int *budget)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
 	unsigned rx_tail = cp->rx_tail;
 	unsigned rx_work = dev->quota;
 	unsigned rx;
@@ -630,9 +633,13 @@ static irqreturn_t
 cp_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
 {
 	struct net_device *dev = dev_instance;
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp;
 	u16 status;
 
+	if (unlikely(dev == NULL))
+		return IRQ_NONE;
+	cp = netdev_priv(dev);
+
 	status = cpr16(IntrStatus);
 	if (!status || (status == 0xFFFF))
 		return IRQ_NONE;
@@ -648,20 +655,23 @@ cp_interrupt (int irq, void *dev_instanc
 	/* close possible race's with dev_close */
 	if (unlikely(!netif_running(dev))) {
 		cpw16(IntrMask, 0);
-		goto out;
+		spin_unlock(&cp->lock);
+		return IRQ_HANDLED;
 	}
 
-	if (status & (RxOK | RxErr | RxEmpty | RxFIFOOvr)) {
+	if (status & (RxOK | RxErr | RxEmpty | RxFIFOOvr))
 		if (netif_rx_schedule_prep(dev)) {
 			cpw16_f(IntrMask, cp_norx_intr_mask);
 			__netif_rx_schedule(dev);
 		}
-	}
+
 	if (status & (TxOK | TxErr | TxEmpty | SWInt))
 		cp_tx(cp);
 	if (status & LinkChg)
 		mii_check_media(&cp->mii_if, netif_msg_link(cp), FALSE);
 
+	spin_unlock(&cp->lock);
+
 	if (status & PciErr) {
 		u16 pci_status;
 
@@ -672,8 +682,7 @@ cp_interrupt (int irq, void *dev_instanc
 
 		/* TODO: reset hardware */
 	}
-out:
-	spin_unlock(&cp->lock);
+
 	return IRQ_HANDLED;
 }
 
@@ -736,7 +745,7 @@ static void cp_tx (struct cp_private *cp
 
 static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
 	unsigned entry;
 	u32 eor;
 #if CP_VLAN_TAG_USED
@@ -894,7 +903,7 @@ static int cp_start_xmit (struct sk_buff
 
 static void __cp_set_rx_mode (struct net_device *dev)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
 	u32 mc_filter[2];	/* Multicast hash filter */
 	int i, rx_mode;
 	u32 tmp;
@@ -939,7 +948,7 @@ static void __cp_set_rx_mode (struct net
 static void cp_set_rx_mode (struct net_device *dev)
 {
 	unsigned long flags;
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
 
 	spin_lock_irqsave (&cp->lock, flags);
 	__cp_set_rx_mode(dev);
@@ -955,35 +964,28 @@ static void __cp_get_stats(struct cp_pri
 
 static struct net_device_stats *cp_get_stats(struct net_device *dev)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
+	unsigned long flags;
 
 	/* The chip only need report frame silently dropped. */
-	spin_lock_irq(&cp->lock);
+	spin_lock_irqsave(&cp->lock, flags);
  	if (netif_running(dev) && netif_device_present(dev))
  		__cp_get_stats(cp);
-	spin_unlock_irq(&cp->lock);
+	spin_unlock_irqrestore(&cp->lock, flags);
 
 	return &cp->net_stats;
 }
 
 static void cp_stop_hw (struct cp_private *cp)
 {
-	struct net_device *dev = cp->dev;
-
 	cpw16(IntrStatus, ~(cpr16(IntrStatus)));
 	cpw16_f(IntrMask, 0);
 	cpw8(Cmd, 0);
 	cpw16_f(CpCmd, 0);
-	cpw16(IntrStatus, ~(cpr16(IntrStatus)));
-	synchronize_irq(dev->irq);
-	udelay(10);
+	cpw16_f(IntrStatus, ~(cpr16(IntrStatus)));
 
 	cp->rx_tail = 0;
 	cp->tx_head = cp->tx_tail = 0;
-
-	(void) dev; /* avoid compiler warning when synchronize_irq()
-		     * disappears during !CONFIG_SMP
-		     */
 }
 
 static void cp_reset_hw (struct cp_private *cp)
@@ -1012,6 +1014,7 @@ static inline void cp_start_hw (struct c
 static void cp_init_hw (struct cp_private *cp)
 {
 	struct net_device *dev = cp->dev;
+	dma_addr_t ring_dma;
 
 	cp_reset_hw(cp);
 
@@ -1037,10 +1040,13 @@ static void cp_init_hw (struct cp_privat
 	cpw32_f(HiTxRingAddr, 0);
 	cpw32_f(HiTxRingAddr + 4, 0);
 
-	cpw32_f(RxRingAddr, cp->ring_dma);
-	cpw32_f(RxRingAddr + 4, 0);		/* FIXME: 64-bit PCI */
-	cpw32_f(TxRingAddr, cp->ring_dma + (sizeof(struct cp_desc) * CP_RX_RING_SIZE));
-	cpw32_f(TxRingAddr + 4, 0);		/* FIXME: 64-bit PCI */
+	ring_dma = cp->ring_dma;
+	cpw32_f(RxRingAddr, ring_dma & 0xffffffff);
+	cpw32_f(RxRingAddr + 4, (ring_dma >> 16) >> 16);
+
+	ring_dma += sizeof(struct cp_desc) * CP_RX_RING_SIZE;
+	cpw32_f(TxRingAddr, ring_dma & 0xffffffff);
+	cpw32_f(TxRingAddr + 4, (ring_dma >> 16) >> 16);
 
 	cpw16(MultiIntr, 0);
 
@@ -1154,7 +1160,7 @@ static void cp_free_rings (struct cp_pri
 
 static int cp_open (struct net_device *dev)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
 	int rc;
 
 	if (netif_msg_ifup(cp))
@@ -1184,19 +1190,24 @@ err_out_hw:
 
 static int cp_close (struct net_device *dev)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
+	unsigned long flags;
 
 	if (netif_msg_ifdown(cp))
 		printk(KERN_DEBUG "%s: disabling interface\n", dev->name);
 
+	spin_lock_irqsave(&cp->lock, flags);
+
 	netif_stop_queue(dev);
 	netif_carrier_off(dev);
 
-	spin_lock_irq(&cp->lock);
 	cp_stop_hw(cp);
-	spin_unlock_irq(&cp->lock);
 
+	spin_unlock_irqrestore(&cp->lock, flags);
+
+	synchronize_irq(dev->irq);
 	free_irq(dev->irq, dev);
+
 	cp_free_rings(cp);
 	return 0;
 }
@@ -1204,8 +1215,9 @@ static int cp_close (struct net_device *
 #ifdef BROKEN
 static int cp_change_mtu(struct net_device *dev, int new_mtu)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
 	int rc;
+	unsigned long flags;
 
 	/* check for invalid MTU, according to hardware limits */
 	if (new_mtu < CP_MIN_MTU || new_mtu > CP_MAX_MTU)
@@ -1218,7 +1230,7 @@ static int cp_change_mtu(struct net_devi
 		return 0;
 	}
 
-	spin_lock_irq(&cp->lock);
+	spin_lock_irqsave(&cp->lock, flags);
 
 	cp_stop_hw(cp);			/* stop h/w and free rings */
 	cp_clean_rings(cp);
@@ -1229,7 +1241,7 @@ static int cp_change_mtu(struct net_devi
 	rc = cp_init_rings(cp);		/* realloc and restart h/w */
 	cp_start_hw(cp);
 
-	spin_unlock_irq(&cp->lock);
+	spin_unlock_irqrestore(&cp->lock, flags);
 
 	return rc;
 }
@@ -1248,7 +1260,7 @@ static char mii_2_8139_map[8] = {
 
 static int mdio_read(struct net_device *dev, int phy_id, int location)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
 
 	return location < 8 && mii_2_8139_map[location] ?
 	       readw(cp->regs + mii_2_8139_map[location]) : 0;
@@ -1258,7 +1270,7 @@ static int mdio_read(struct net_device *
 static void mdio_write(struct net_device *dev, int phy_id, int location,
 		       int value)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
 
 	if (location == 0) {
 		cpw8(Cfg9346, Cfg9346_Unlock);
@@ -1326,7 +1338,7 @@ static void netdev_get_wol (struct cp_pr
 
 static void cp_get_drvinfo (struct net_device *dev, struct ethtool_drvinfo *info)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
 
 	strcpy (info->driver, DRV_NAME);
 	strcpy (info->version, DRV_VERSION);
@@ -1345,55 +1357,57 @@ static int cp_get_stats_count (struct ne
 
 static int cp_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
 	int rc;
+	unsigned long flags;
 
-	spin_lock_irq(&cp->lock);
+	spin_lock_irqsave(&cp->lock, flags);
 	rc = mii_ethtool_gset(&cp->mii_if, cmd);
-	spin_unlock_irq(&cp->lock);
+	spin_unlock_irqrestore(&cp->lock, flags);
 
 	return rc;
 }
 
 static int cp_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
 	int rc;
+	unsigned long flags;
 
-	spin_lock_irq(&cp->lock);
+	spin_lock_irqsave(&cp->lock, flags);
 	rc = mii_ethtool_sset(&cp->mii_if, cmd);
-	spin_unlock_irq(&cp->lock);
+	spin_unlock_irqrestore(&cp->lock, flags);
 
 	return rc;
 }
 
 static int cp_nway_reset(struct net_device *dev)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
 	return mii_nway_restart(&cp->mii_if);
 }
 
 static u32 cp_get_msglevel(struct net_device *dev)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
 	return cp->msg_enable;
 }
 
 static void cp_set_msglevel(struct net_device *dev, u32 value)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
 	cp->msg_enable = value;
 }
 
 static u32 cp_get_rx_csum(struct net_device *dev)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
 	return (cpr16(CpCmd) & RxChkSum) ? 1 : 0;
 }
 
 static int cp_set_rx_csum(struct net_device *dev, u32 data)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
 	u16 cmd = cp->cpcmd, newcmd;
 
 	newcmd = cmd;
@@ -1404,10 +1418,12 @@ static int cp_set_rx_csum(struct net_dev
 		newcmd &= ~RxChkSum;
 
 	if (newcmd != cmd) {
-		spin_lock_irq(&cp->lock);
+		unsigned long flags;
+
+		spin_lock_irqsave(&cp->lock, flags);
 		cp->cpcmd = newcmd;
 		cpw16_f(CpCmd, newcmd);
-		spin_unlock_irq(&cp->lock);
+		spin_unlock_irqrestore(&cp->lock, flags);
 	}
 
 	return 0;
@@ -1416,35 +1432,38 @@ static int cp_set_rx_csum(struct net_dev
 static void cp_get_regs(struct net_device *dev, struct ethtool_regs *regs,
 		        void *p)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
+	unsigned long flags;
 
 	if (regs->len < CP_REGS_SIZE)
 		return /* -EINVAL */;
 
 	regs->version = CP_REGS_VER;
 
-	spin_lock_irq(&cp->lock);
+	spin_lock_irqsave(&cp->lock, flags);
 	memcpy_fromio(p, cp->regs, CP_REGS_SIZE);
-	spin_unlock_irq(&cp->lock);
+	spin_unlock_irqrestore(&cp->lock, flags);
 }
 
 static void cp_get_wol (struct net_device *dev, struct ethtool_wolinfo *wol)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
+	unsigned long flags;
 
-	spin_lock_irq (&cp->lock);
+	spin_lock_irqsave (&cp->lock, flags);
 	netdev_get_wol (cp, wol);
-	spin_unlock_irq (&cp->lock);
+	spin_unlock_irqrestore (&cp->lock, flags);
 }
 
 static int cp_set_wol (struct net_device *dev, struct ethtool_wolinfo *wol)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
+	unsigned long flags;
 	int rc;
 
-	spin_lock_irq (&cp->lock);
+	spin_lock_irqsave (&cp->lock, flags);
 	rc = netdev_set_wol (cp, wol);
-	spin_unlock_irq (&cp->lock);
+	spin_unlock_irqrestore (&cp->lock, flags);
 
 	return rc;
 }
@@ -1464,13 +1483,13 @@ static void cp_get_strings (struct net_d
 static void cp_get_ethtool_stats (struct net_device *dev,
 				  struct ethtool_stats *estats, u64 *tmp_stats)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
 	unsigned int work = 100;
 	int i;
 
 	/* begin NIC statistics dump */
-	cpw32(StatsAddr + 4, 0); /* FIXME: 64-bit PCI */
-	cpw32(StatsAddr, cp->nic_stats_dma | DumpStats);
+	cpw32(StatsAddr + 4, (cp->nic_stats_dma >> 16) >> 16);
+	cpw32(StatsAddr, (cp->nic_stats_dma & 0xffffffff) | DumpStats);
 	cpr32(StatsAddr);
 
 	while (work-- > 0) {
@@ -1526,16 +1545,17 @@ static struct ethtool_ops cp_ethtool_ops
 
 static int cp_ioctl (struct net_device *dev, struct ifreq *rq, int cmd)
 {
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
 	struct mii_ioctl_data *mii = (struct mii_ioctl_data *) &rq->ifr_data;
 	int rc;
+	unsigned long flags;
 
 	if (!netif_running(dev))
 		return -EINVAL;
 
-	spin_lock_irq(&cp->lock);
+	spin_lock_irqsave(&cp->lock, flags);
 	rc = generic_mii_ioctl(&cp->mii_if, mii, cmd, NULL);
-	spin_unlock_irq(&cp->lock);
+	spin_unlock_irqrestore(&cp->lock, flags);
 	return rc;
 }
 
@@ -1639,7 +1659,7 @@ static int cp_init_one (struct pci_dev *
 	SET_MODULE_OWNER(dev);
 	SET_NETDEV_DEV(dev, &pdev->dev);
 
-	cp = dev->priv;
+	cp = netdev_priv(dev);
 	cp->pdev = pdev;
 	cp->dev = dev;
 	cp->msg_enable = (debug < 0 ? CP_DEF_MSG_ENABLE : debug);
@@ -1664,12 +1684,6 @@ static int cp_init_one (struct pci_dev *
 	if (rc)
 		goto err_out_mwi;
 
-	if (pdev->irq < 2) {
-		rc = -EIO;
-		printk(KERN_ERR PFX "invalid irq (%d) for pci dev %s\n",
-		       pdev->irq, pci_name(pdev));
-		goto err_out_res;
-	}
 	pciaddr = pci_resource_start(pdev, 1);
 	if (!pciaddr) {
 		rc = -EIO;
@@ -1686,22 +1700,30 @@ static int cp_init_one (struct pci_dev *
 
 	/* Configure DMA attributes. */
 	if ((sizeof(dma_addr_t) > 32) &&
+	    !pci_set_consistent_dma_mask(pdev, 0xffffffffffffffffULL) &&
 	    !pci_set_dma_mask(pdev, 0xffffffffffffffffULL)) {
 		pci_using_dac = 1;
 	} else {
+		pci_using_dac = 0;
+
 		rc = pci_set_dma_mask(pdev, 0xffffffffULL);
 		if (rc) {
 			printk(KERN_ERR PFX "No usable DMA configuration, "
 			       "aborting.\n");
 			goto err_out_res;
 		}
-		pci_using_dac = 0;
+		rc = pci_set_consistent_dma_mask(pdev, 0xffffffffULL);
+		if (rc) {
+			printk(KERN_ERR PFX "No usable consistent DMA configuration, "
+			       "aborting.\n");
+			goto err_out_res;
+		}
 	}
 
 	cp->cpcmd = (pci_using_dac ? PCIDAC : 0) |
 		    PCIMulRW | RxChkSum | CpRxOn | CpTxOn;
 
-	regs = ioremap_nocache(pciaddr, CP_REGS_SIZE);
+	regs = ioremap(pciaddr, CP_REGS_SIZE);
 	if (!regs) {
 		rc = -EIO;
 		printk(KERN_ERR PFX "Cannot map PCI MMIO (%lx@%lx) on pci dev %s\n",
@@ -1742,6 +1764,9 @@ static int cp_init_one (struct pci_dev *
 	dev->vlan_rx_kill_vid = cp_vlan_rx_kill_vid;
 #endif
 
+	if (pci_using_dac)
+		dev->features |= NETIF_F_HIGHDMA;
+
 	dev->irq = pdev->irq;
 
 	rc = register_netdev(dev);
@@ -1783,7 +1808,7 @@ err_out_free:
 static void cp_remove_one (struct pci_dev *pdev)
 {
 	struct net_device *dev = pci_get_drvdata(pdev);
-	struct cp_private *cp = dev->priv;
+	struct cp_private *cp = netdev_priv(dev);
 
 	if (!dev)
 		BUG();
@@ -1805,7 +1830,7 @@ static int cp_suspend (struct pci_dev *p
 	unsigned long flags;
 
 	dev = pci_get_drvdata (pdev);
-	cp  = dev->priv;
+	cp  = netdev_priv(dev);
 
 	if (!dev || !netif_running (dev)) return 0;
 
@@ -1834,7 +1859,7 @@ static int cp_resume (struct pci_dev *pd
 	struct cp_private *cp;
 
 	dev = pci_get_drvdata (pdev);
-	cp  = dev->priv;
+	cp  = netdev_priv(dev);
 
 	netif_device_attach (dev);
 	
--- diff/drivers/net/8139too.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/8139too.c	2004-04-21 10:45:34.383476416 +0100
@@ -167,8 +167,12 @@ static int multicast_filter_limit = 32;
 /* bitmapped message enable number */
 static int debug = -1;
 
-/* Ring size is now a config option */
-#define RX_BUF_LEN	(8192 << CONFIG_8139_RXBUF_IDX)
+/*
+ * Receive ring size 
+ * Warning: 64K ring has hardware issues and may lock up.
+ */
+#define RX_BUF_IDX	2	/* 32K ring */
+#define RX_BUF_LEN	(8192 << RX_BUF_IDX)
 #define RX_BUF_PAD	16
 #define RX_BUF_WRAP_PAD 2048 /* spare padding to handle lack of packet wrap */
 
@@ -692,22 +696,22 @@ static const u16 rtl8139_norx_intr_mask 
 	PCIErr | PCSTimeout | RxUnderrun |
 	TxErr | TxOK | RxErr ;
 
-#if CONFIG_8139_RXBUF_IDX == 0
+#if RX_BUF_IDX == 0
 static const unsigned int rtl8139_rx_config =
 	RxCfgRcv8K | RxNoWrap |
 	(RX_FIFO_THRESH << RxCfgFIFOShift) |
 	(RX_DMA_BURST << RxCfgDMAShift);
-#elif CONFIG_8139_RXBUF_IDX == 1
+#elif RX_BUF_IDX == 1
 static const unsigned int rtl8139_rx_config =
 	RxCfgRcv16K | RxNoWrap |
 	(RX_FIFO_THRESH << RxCfgFIFOShift) |
 	(RX_DMA_BURST << RxCfgDMAShift);
-#elif CONFIG_8139_RXBUF_IDX == 2
+#elif RX_BUF_IDX == 2
 static const unsigned int rtl8139_rx_config =
 	RxCfgRcv32K | RxNoWrap |
 	(RX_FIFO_THRESH << RxCfgFIFOShift) |
 	(RX_DMA_BURST << RxCfgDMAShift);
-#elif CONFIG_8139_RXBUF_IDX == 3
+#elif RX_BUF_IDX == 3
 static const unsigned int rtl8139_rx_config =
 	RxCfgRcv64K |
 	(RX_FIFO_THRESH << RxCfgFIFOShift) |
@@ -1619,7 +1623,7 @@ static int rtl8139_thread (void *data)
 			timeout = interruptible_sleep_on_timeout (&tp->thr_wait, timeout);
 			/* make swsusp happy with our thread */
 			if (current->flags & PF_FREEZE)
-				refrigerator(PF_IOTHREAD);
+				refrigerator(PF_FREEZE);
 		} while (!signal_pending (current) && (timeout > 0));
 
 		if (signal_pending (current)) {
@@ -1911,7 +1915,7 @@ static void rtl8139_rx_err (u32 rx_statu
 #endif
 }
 
-#if CONFIG_8139_RXBUF_IDX == 3
+#if RX_BUF_IDX == 3
 static __inline__ void wrap_copy(struct sk_buff *skb, const unsigned char *ring,
 				 u32 offset, unsigned int size)
 {
@@ -1997,7 +2001,7 @@ static int rtl8139_rx(struct net_device 
 		if (likely(skb)) {
 			skb->dev = dev;
 			skb_reserve (skb, 2);	/* 16 byte align the IP fields. */
-#if CONFIG_8139_RXBUF_IDX == 3
+#if RX_BUF_IDX == 3
 			wrap_copy(skb, rx_ring, ring_offset+4, pkt_size);
 #else
 			eth_copy_and_sum (skb, &rx_ring[ring_offset + 4], pkt_size, 0);
--- diff/drivers/net/8390.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/8390.c	2004-04-21 10:45:34.384476264 +0100
@@ -1084,7 +1084,7 @@ void NS8390_init(struct net_device *dev,
 	for(i = 0; i < 6; i++) 
 	{
 		outb_p(dev->dev_addr[i], e8390_base + EN1_PHYS_SHIFT(i));
-		if(inb_p(e8390_base + EN1_PHYS_SHIFT(i))!=dev->dev_addr[i])
+		if (ei_debug > 1 && inb_p(e8390_base + EN1_PHYS_SHIFT(i))!=dev->dev_addr[i])
 			printk(KERN_ERR "Hw. address read/write mismap %d\n",i);
 	}
 
--- diff/drivers/net/8390.h	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/8390.h	2004-04-21 10:45:34.384476264 +0100
@@ -131,8 +131,19 @@ struct ei_device {
 #define inb_p(port)   in_8(port)
 #define outb_p(val,port)  out_8(port,val)
 
-#elif defined(CONFIG_ARM_ETHERH) || defined(CONFIG_ARM_ETHERH_MODULE) || \
-      defined(CONFIG_NET_CBUS)
+#elif defined(CONFIG_ARM_ETHERH) || defined(CONFIG_ARM_ETHERH_MODULE)
+#define EI_SHIFT(x)	(ei_local->reg_offset[x])
+#undef inb
+#undef inb_p
+#undef outb
+#undef outb_p
+
+#define inb(_p)		readb(_p)
+#define outb(_v,_p)	writeb(_v,_p)
+#define inb_p(_p)	inb(_p)
+#define outb_p(_v,_p)	outb(_v,_p)
+
+#elif defined(CONFIG_NET_CBUS)
 #define EI_SHIFT(x)	(ei_local->reg_offset[x])
 #else
 #define EI_SHIFT(x)	(x)
--- diff/drivers/net/Kconfig	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/Kconfig	2004-04-21 10:45:34.386475960 +0100
@@ -21,10 +21,6 @@ config NETDEVICES
 
 	  If unsure, say Y.
 
-if NETDEVICES
-	source "drivers/net/arcnet/Kconfig"
-endif
-
 config DUMMY
 	tristate "Dummy net driver support"
 	depends on NETDEVICES
@@ -155,6 +151,10 @@ config NET_SB1000
 
 	  If you don't have this card, of course say N.
 
+if NETDEVICES
+	source "drivers/net/arcnet/Kconfig"
+endif
+
 #
 #	Ethernet
 #
@@ -1164,7 +1164,7 @@ config NE2_MCA
 
 config IBMLANA
 	tristate "IBM LAN Adapter/A support"
-	depends on NET_ETHERNET && MCA
+	depends on NET_ETHERNET && MCA && MCA_LEGACY
 	---help---
 	  This is a Micro Channel Ethernet adapter.  You need to set
 	  CONFIG_MCA to use this driver.  It is both available as an in-kernel
@@ -1178,6 +1178,17 @@ config IBMLANA
 	  boards with this driver should be possible, but has not been tested
 	  up to now due to lack of hardware.
 
+config IBMVETH
+	tristate "IBM LAN Virtual Ethernet support"
+	depends on NETDEVICES && NET_ETHERNET && PPC_PSERIES
+	---help---
+	  This driver supports virtual ethernet adapters on newer IBM iSeries
+	  and pSeries systems.
+
+	  To compile this driver as a module, choose M here and read
+	  <file:Documentation/networking/net-modules.txt>. The module will
+	  be called ibmveth.
+
 config NET_PCI
 	bool "EISA, VLB, PCI and on board controllers"
 	depends on NET_ETHERNET && (ISA || EISA || PCI)
@@ -1219,6 +1230,9 @@ config AMD8111_ETH
 	  To compile this driver as a module, choose M here and read
 	  <file:Documentation/networking/net-modules.txt>. The module
 	  will be called amd8111e.
+config AMD8111E_NAPI
+	bool "Enable NAPI support"
+	depends on AMD8111_ETH
 
 config ADAPTEC_STARFIRE
 	tristate "Adaptec Starfire/DuraLAN support"
@@ -1583,24 +1597,6 @@ config 8139_OLD_RX_RESET
 	  experience problems, you can enable this option to restore the
 	  old RX-reset behavior.  If unsure, say N.
 
-config 8139_RXBUF_IDX
-	int "Receive ring size (0 => 8K, 1 => 16K, 2 => 32K, 3 => 64K)"
-	depends on 8139TOO
-	range 0 3
-	default 1 if EMBEDDED || SH_DREAMCAST
-	default 2
-	help
-	   The 8139too driver has a fixed area of memory for receiving data.
-	   The default value is adequate for most systems. The 64KB 
-	   ring size has hardware issues that may cause problems.
-	   Values:
-		0  => 8 KB 
-		1  => 16 KB embedded systems
-		2  => 32 KB default for most systems
-		3  => 64 KB 
-	   If unsure, use the default 2.
-
-
 config SIS900
 	tristate "SiS 900/7016 PCI Fast Ethernet Adapter support"
 	depends on NET_PCI && PCI
@@ -1962,16 +1958,6 @@ config R8169
 	  To compile this driver as a module, choose M here: the module
 	  will be called r8169.  This is recommended.
 
-config SIS190
-	tristate "SiS190 gigabit ethernet support (EXPERIMENTAL)"
-	depends on PCI && EXPERIMENTAL
-	select CRC32
-	---help---
-	  Say Y here if you have a SiS 190 PCI Gigabit Ethernet adapter.
-
-	  To compile this driver as a module, choose M here: the module
-	  will be called sis190.  This is recommended.
-
 config SK98LIN
 	tristate "Marvell Yukon Chipset / SysKonnect SK-98xx Support"
 	depends on PCI
@@ -2101,10 +2087,33 @@ config IXGB_NAPI
 	bool "Use Rx Polling (NAPI) (EXPERIMENTAL)"
 	depends on IXGB && EXPERIMENTAL
 
+config S2IO
+	tristate "S2IO 10Gbe XFrame NIC"
+	depends on PCI
+	---help---
+	  This driver supports the 10Gbe XFrame NIC of S2IO. 
+	  For help regarding driver compilation, installation and 
+	  tuning please look into ~/drivers/net/s2io/README.txt.
+
+config S2IO_NAPI
+	bool "Use Rx Polling (NAPI) (EXPERIMENTAL)"
+	depends on S2IO && EXPERIMENTAL
+
 endmenu
 
+source "drivers/net/tokenring/Kconfig"
+
+source "drivers/net/wireless/Kconfig"
+
+source "drivers/net/pcmcia/Kconfig"
+
+source "drivers/net/wan/Kconfig"
+
+source "drivers/atm/Kconfig"
 
-config VETH
+source "drivers/s390/net/Kconfig"
+
+config ISERIES_VETH
 	tristate "iSeries Virtual Ethernet driver support"
 	depends on NETDEVICES && PPC_ISERIES
 
@@ -2170,17 +2179,6 @@ config HIPPI
 	  under Linux, say Y here (you must also remember to enable the driver
 	  for your HIPPI card below). Most people will say N here.
 
-config IBMVETH
-	tristate "IBM LAN Virtual Ethernet support"
-	depends on NETDEVICES && NET_ETHERNET && PPC_PSERIES
-	---help---
-	  This driver supports virtual ethernet adapters on newer IBM iSeries
-	  and pSeries systems.
-
-	  To compile this driver as a module, choose M here and read
-	  <file:Documentation/networking/net-modules.txt>. The module will
-	  be called ibmveth.
-
 config ROADRUNNER
 	tristate "Essential RoadRunner HIPPI PCI adapter support (EXPERIMENTAL)"
 	depends on HIPPI && PCI
@@ -2438,10 +2436,6 @@ config SLIP_MODE_SLIP6
 	  end of the link as well. It's good enough, for example, to run IP
 	  over the async ports of a Camtec JNT Pad. If unsure, say N.
 
-source "drivers/net/wireless/Kconfig"
-
-source "drivers/net/tokenring/Kconfig"
-
 config NET_FC
 	bool "Fibre Channel driver support"
 	depends on NETDEVICES && SCSI && PCI
@@ -2501,11 +2495,3 @@ config NETCONSOLE
 	---help---
 	If you want to log kernel messages over the network, enable this.
 	See Documentation/networking/netconsole.txt for details.
-
-source "drivers/net/wan/Kconfig"
-
-source "drivers/net/pcmcia/Kconfig"
-
-source "drivers/atm/Kconfig"
-
-source "drivers/s390/net/Kconfig"
--- diff/drivers/net/Makefile	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/Makefile	2004-04-21 10:45:34.386475960 +0100
@@ -41,10 +41,10 @@ obj-$(CONFIG_EEPRO100) += eepro100.o
 obj-$(CONFIG_E100) += e100.o
 obj-$(CONFIG_TLAN) += tlan.o
 obj-$(CONFIG_EPIC100) += epic100.o
-obj-$(CONFIG_SIS190) += sis190.o
 obj-$(CONFIG_SIS900) += sis900.o
 obj-$(CONFIG_YELLOWFIN) += yellowfin.o
 obj-$(CONFIG_ACENIC) += acenic.o
+obj-$(CONFIG_ISERIES_VETH) += iseries_veth.o
 obj-$(CONFIG_NATSEMI) += natsemi.o
 obj-$(CONFIG_NS83820) += ns83820.o
 obj-$(CONFIG_STNIC) += stnic.o 8390.o
@@ -175,6 +175,7 @@ obj-$(CONFIG_DL2K) += dl2k.o
 obj-$(CONFIG_R8169) += r8169.o
 obj-$(CONFIG_AMD8111_ETH) += amd8111e.o
 obj-$(CONFIG_IBMVETH) += ibmveth.o
+obj-$(CONFIG_S2IO) += s2io.o
 
 obj-$(CONFIG_ARM) += arm/
 obj-$(CONFIG_NET_FC) += fc/
--- diff/drivers/net/a2065.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/a2065.c	2004-04-21 10:45:34.387475808 +0100
@@ -274,6 +274,7 @@ static int lance_rx (struct net_device *
 	struct sk_buff *skb = 0;	/* XXX shut up gcc warnings */
 
 #ifdef TEST_HITS
+	int i;
 	printk ("[");
 	for (i = 0; i < RX_RING_SIZE; i++) {
 		if (i == lp->rx_new)
@@ -764,11 +765,6 @@ static int __devinit a2065_init_one(stru
 	dev->dev_addr[3] = (z->rom.er_SerialNumber>>16) & 0xff;
 	dev->dev_addr[4] = (z->rom.er_SerialNumber>>8) & 0xff;
 	dev->dev_addr[5] = z->rom.er_SerialNumber & 0xff;
-	printk("%s: A2065 at 0x%08lx, Ethernet Address "
-	       "%02x:%02x:%02x:%02x:%02x:%02x\n", dev->name, board,
-	       dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
-	       dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
-
 	dev->base_addr = ZTWO_VADDR(base_addr);
 	dev->mem_start = ZTWO_VADDR(mem_start);
 	dev->mem_end = dev->mem_start+A2065_RAM_SIZE;
@@ -807,6 +803,11 @@ static int __devinit a2065_init_one(stru
 	}
 	zorro_set_drvdata(z, dev);
 
+	printk("%s: A2065 at 0x%08lx, Ethernet Address "
+	       "%02x:%02x:%02x:%02x:%02x:%02x\n", dev->name, board,
+	       dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
+	       dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
+
 	return 0;
 }
 
--- diff/drivers/net/amd8111e.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/amd8111e.c	2004-04-21 10:45:34.388475656 +0100
@@ -1,6 +1,6 @@
 
 /* Advanced  Micro Devices Inc. AMD8111E Linux Network Driver 
- * Copyright (C) 2003 Advanced Micro Devices 
+ * Copyright (C) 2004 Advanced Micro Devices 
  *
  * 
  * Copyright 2001,2002 Jeff Garzik <jgarzik@mandrakesoft.com> [ 8139cp.c,tg3.c ]
@@ -55,6 +55,16 @@ Revision History:
 	 4. Dynamic IPG support is disabled by default.
 	3.0.3 06/05/2003
 	 1. Bug fix: Fixed failure to close the interface if SMP is enabled.
+	3.0.4 12/09/2003
+	 1. Added set_mac_address routine for bonding driver support.
+	 2. Tested the driver for bonding support
+	 3. Bug fix: Fixed mismach in actual receive buffer lenth and lenth 
+	    indicated to the h/w.
+	 4. Modified amd8111e_rx() routine to receive all the received packets 
+	    in the first interrupt.
+	 5. Bug fix: Corrected  rx_errors  reported in get_stats() function.
+	3.0.5 03/22/2004
+	 1. Added NAPI support  
 
 */
 
@@ -91,7 +101,7 @@ Revision History:
 
 #include "amd8111e.h"
 #define MODULE_NAME	"amd8111e"
-#define MODULE_VERS	"3.0.3"
+#define MODULE_VERS	"3.0.5"
 MODULE_AUTHOR("Advanced Micro Devices, Inc.");
 MODULE_DESCRIPTION ("AMD8111 based 10/100 Ethernet Controller. Driver Version 3.0.3");
 MODULE_LICENSE("GPL");
@@ -276,8 +286,10 @@ static inline void amd8111e_set_rx_buff_
 	unsigned int mtu = dev->mtu;
 	
 	if (mtu > ETH_DATA_LEN){
-		/* MTU + ethernet header + FCS + optional VLAN tag */
-		lp->rx_buff_len = mtu + ETH_HLEN + 8;
+		/* MTU + ethernet header + FCS
+		+ optional VLAN tag + skb reserve space 2 */
+
+		lp->rx_buff_len = mtu + ETH_HLEN + 10;
 		lp->options |= OPTION_JUMBO_ENABLE;
 	} else{
 		lp->rx_buff_len = PKT_BUFF_SZ;
@@ -337,7 +349,7 @@ static int amd8111e_init_ring(struct net
 			lp->rx_skbuff[i]->data,lp->rx_buff_len-2, PCI_DMA_FROMDEVICE);
 
 		lp->rx_ring[i].buff_phy_addr = cpu_to_le32(lp->rx_dma_addr[i]);
-		lp->rx_ring[i].buff_count = cpu_to_le16(lp->rx_buff_len);
+		lp->rx_ring[i].buff_count = cpu_to_le16(lp->rx_buff_len-2);
 		lp->rx_ring[i].rx_flags = cpu_to_le16(OWN_BIT);
 	}
 
@@ -513,6 +525,9 @@ static void amd8111e_init_hw_default( st
 	void * mmio = lp->mmio;
 
 
+        /* stop the chip */
+	writel(RUN, mmio + CMD0);
+
 	/* AUTOPOLL0 Register *//*TBD default value is 8100 in FPS */
 	writew( 0x8101, mmio + AUTOPOLL0);
 
@@ -654,7 +669,11 @@ This is the receive indication function 
 */	
 static int amd8111e_vlan_rx(struct amd8111e_priv *lp, struct sk_buff *skb, u16 vlan_tag)
 {
+#ifdef CONFIG_AMD8111E_NAPI
+	return vlan_hwaccel_receive_skb(skb, lp->vlgrp,vlan_tag);
+#else
 	return vlan_hwaccel_rx(skb, lp->vlgrp, vlan_tag);
+#endif /* CONFIG_AMD8111E_NAPI */
 }
 #endif
 
@@ -700,6 +719,142 @@ static int amd8111e_tx(struct net_device
 	return 0;
 }
 
+#if CONFIG_AMD8111E_NAPI 
+/* This function handles the driver receive operation in polling mode */
+static int amd8111e_rx_poll(struct net_device *dev, int * budget)
+{
+	struct amd8111e_priv *lp = dev->priv;
+	int rx_index = lp->rx_idx & RX_RING_DR_MOD_MASK;
+	void * mmio = lp->mmio;
+	struct sk_buff *skb,*new_skb;
+	int min_pkt_len, status;
+	unsigned int intr0;
+	int num_rx_pkt = 0;
+	/*int max_rx_pkt = NUM_RX_BUFFERS;*/
+	short pkt_len;
+#if AMD8111E_VLAN_TAG_USED		
+	short vtag;
+#endif
+	int rx_pkt_limit = dev->quota;
+	
+	do{   
+		/* process receive packets until we use the quota*/
+		/* If we own the next entry, it's a new packet. Send it up. */
+		while(!(lp->rx_ring[rx_index].rx_flags & OWN_BIT)){
+	       
+			/* check if err summary bit is set */ 
+			if(le16_to_cpu(lp->rx_ring[rx_index].rx_flags) 
+								& ERR_BIT){
+			/* 
+			 * There is a tricky error noted by John Murphy,
+			 * <murf@perftech.com> to Russ Nelson: Even with
+			 * full-sized * buffers it's possible for a  
+			 * jabber packet to use two buffers, with only 
+			 * the last correctly noting the error.
+			 */
+
+			/* reseting flags */
+			lp->rx_ring[rx_index].rx_flags &=RESET_RX_FLAGS;
+			goto err_next_pkt;
+
+			}
+			/* check for STP and ENP */
+		status = le16_to_cpu(lp->rx_ring[rx_index].rx_flags);
+		if(!((status & STP_BIT) && (status & ENP_BIT))){
+			/* reseting flags */
+			lp->rx_ring[rx_index].rx_flags &=RESET_RX_FLAGS;
+			goto err_next_pkt;
+		}
+		pkt_len = le16_to_cpu(lp->rx_ring[rx_index].msg_count) - 4;
+
+#if AMD8111E_VLAN_TAG_USED		
+		vtag = le16_to_cpu(lp->rx_ring[rx_index].rx_flags) & TT_MASK;
+		/*MAC will strip vlan tag*/ 
+		if(lp->vlgrp != NULL && vtag !=0)
+			min_pkt_len =MIN_PKT_LEN - 4;
+		else
+#endif
+			min_pkt_len =MIN_PKT_LEN;
+
+		if (pkt_len < min_pkt_len) {
+			lp->rx_ring[rx_index].rx_flags &= RESET_RX_FLAGS;
+			lp->drv_rx_errors++;
+			goto err_next_pkt;
+		}
+		if(--rx_pkt_limit < 0)
+			goto rx_not_empty;
+		if(!(new_skb = dev_alloc_skb(lp->rx_buff_len))){
+			/* if allocation fail, 
+				ignore that pkt and go to next one */
+			lp->rx_ring[rx_index].rx_flags &= RESET_RX_FLAGS;
+			lp->drv_rx_errors++;
+			goto err_next_pkt;
+		}
+		
+		skb_reserve(new_skb, 2);
+		skb = lp->rx_skbuff[rx_index];
+		pci_unmap_single(lp->pci_dev,lp->rx_dma_addr[rx_index],
+			lp->rx_buff_len-2, PCI_DMA_FROMDEVICE);
+		skb_put(skb, pkt_len);
+		skb->dev = dev;
+		lp->rx_skbuff[rx_index] = new_skb;
+		new_skb->dev = dev;
+		lp->rx_dma_addr[rx_index] = pci_map_single(lp->pci_dev,
+			new_skb->data, lp->rx_buff_len-2,PCI_DMA_FROMDEVICE);
+	
+		skb->protocol = eth_type_trans(skb, dev);
+
+#if AMD8111E_VLAN_TAG_USED		
+		
+		vtag = lp->rx_ring[rx_index].rx_flags & TT_MASK;
+		if(lp->vlgrp != NULL && (vtag == TT_VLAN_TAGGED)){
+			amd8111e_vlan_rx(lp, skb,
+				    lp->rx_ring[rx_index].tag_ctrl_info);
+		} else
+#endif
+			
+			netif_receive_skb(skb);
+		/*COAL update rx coalescing parameters*/
+		lp->coal_conf.rx_packets++;
+		lp->coal_conf.rx_bytes += pkt_len;	
+		num_rx_pkt++;
+		dev->last_rx = jiffies;
+	
+err_next_pkt:	
+		lp->rx_ring[rx_index].buff_phy_addr
+			 = cpu_to_le32(lp->rx_dma_addr[rx_index]);
+		lp->rx_ring[rx_index].buff_count = 
+				cpu_to_le16(lp->rx_buff_len-2);
+		lp->rx_ring[rx_index].rx_flags |= cpu_to_le16(OWN_BIT);
+		rx_index = (++lp->rx_idx) & RX_RING_DR_MOD_MASK;
+	}
+	/* Check the interrupt status register for more packets in the 
+	mean time. Process them since we have not used up our quota.*/
+
+	intr0 = readl(mmio + INT0);
+	/*Ack receive packets */
+	writel(intr0 & RINT0,mmio + INT0);
+
+	}while(intr0 & RINT0);
+
+	/* Receive descriptor is empty now */
+	dev->quota -= num_rx_pkt;
+	*budget -= num_rx_pkt;
+	netif_rx_complete(dev);
+	/* enable receive interrupt */
+	writel(VAL0|RINTEN0, mmio + INTEN0);
+	writel(VAL2 | RDMD0, mmio + CMD0);
+	return 0;
+rx_not_empty:
+	/* Do not call a netif_rx_complete */
+	dev->quota -= num_rx_pkt;	
+	*budget -= num_rx_pkt;
+	return 1;
+
+	
+}
+
+#else
 /* 
 This function will check the ownership of receive buffers and descriptors. It will indicate to kernel up to half the number of maximum receive buffers in the descriptor ring, in a single receive interrupt. It will also replenish the descriptors with new skbs.
 */
@@ -710,7 +865,7 @@ static int amd8111e_rx(struct net_device
 	int rx_index = lp->rx_idx & RX_RING_DR_MOD_MASK;
 	int min_pkt_len, status;
 	int num_rx_pkt = 0;
-	int max_rx_pkt = NUM_RX_BUFFERS/2;
+	int max_rx_pkt = NUM_RX_BUFFERS;
 	short pkt_len;
 #if AMD8111E_VLAN_TAG_USED		
 	short vtag;
@@ -752,14 +907,14 @@ static int amd8111e_rx(struct net_device
 
 		if (pkt_len < min_pkt_len) {
 			lp->rx_ring[rx_index].rx_flags &= RESET_RX_FLAGS;
-			lp->stats.rx_errors++;
+			lp->drv_rx_errors++;
 			goto err_next_pkt;
 		}
 		if(!(new_skb = dev_alloc_skb(lp->rx_buff_len))){
 			/* if allocation fail, 
 				ignore that pkt and go to next one */
 			lp->rx_ring[rx_index].rx_flags &= RESET_RX_FLAGS;
-			lp->stats.rx_errors++;
+			lp->drv_rx_errors++;
 			goto err_next_pkt;
 		}
 		
@@ -803,7 +958,7 @@ err_next_pkt:
 
 	return 0;
 }
-
+#endif /* CONFIG_AMD8111E_NAPI */
 /* 
 This function will indicate the link status to the kernel.
 */
@@ -896,12 +1051,14 @@ static struct net_device_stats *amd8111e
 	new_stats->tx_bytes = amd8111e_read_mib(mmio, xmt_octets);
 
 	/* stats.rx_errors */
+	/* hw errors + errors driver reported */
 	new_stats->rx_errors = amd8111e_read_mib(mmio, rcv_undersize_pkts)+
 				amd8111e_read_mib(mmio, rcv_fragments)+
 				amd8111e_read_mib(mmio, rcv_jabbers)+
 				amd8111e_read_mib(mmio, rcv_alignment_errors)+
 				amd8111e_read_mib(mmio, rcv_fcs_errors)+
-				amd8111e_read_mib(mmio, rcv_miss_pkts);
+				amd8111e_read_mib(mmio, rcv_miss_pkts)+
+				lp->drv_rx_errors;
 
 	/* stats.tx_errors */
 	new_stats->tx_errors = amd8111e_read_mib(mmio, xmt_underrun_pkts);
@@ -1119,20 +1276,36 @@ static irqreturn_t amd8111e_interrupt(in
 
 	/* Process all the INT event until INTR bit is clear. */
 
-	if (!(intr0 & INTR)) {
+	if (!(intr0 & INTR)){
 		handled = 0;
 		goto err_no_interrupt;
 	}
 		 
-	/* Current driver processes 3 interrupts : RINT,TINT,LCINT */
+	/* Current driver processes 4 interrupts : RINT,TINT,LCINT,STINT */
 	writel(intr0, mmio + INT0);
 
 	/* Check if Receive Interrupt has occurred. */
+#if CONFIG_AMD8111E_NAPI
+	if(intr0 & RINT0){
+		if(netif_rx_schedule_prep(dev)){
+			/* Disable receive interupts */
+			writel(RINTEN0, mmio + INTEN0);
+			/* Schedule a polling routine */
+			__netif_rx_schedule(dev);
+		}
+		else {
+			printk("************Driver bug! \
+				interrupt while in poll\n");
+			/* Fix by disabling interrupts */
+			writel(RINT0, mmio + INT0);
+		}
+	}
+#else
 	if(intr0 & RINT0){
 		amd8111e_rx(dev);
 		writel(VAL2 | RDMD0, mmio + CMD0);
 	}
-
+#endif /* CONFIG_AMD8111E_NAPI */
 	/* Check if  Transmit Interrupt has occurred. */
 	if(intr0 & TINT0)
 		amd8111e_tx(dev);
@@ -1164,6 +1337,7 @@ static void amd8111e_poll(struct net_dev
 } 
 #endif
 
+
 /*
 This function closes the network interface and updates the statistics so that most recent statistics will be available after the interface is down.
 */
@@ -1186,7 +1360,7 @@ static int amd8111e_close(struct net_dev
 
 	spin_unlock_irq(&lp->lock);
 	free_irq(dev->irq, dev);
-
+	
 	/* Update the statistics before closing */
 	amd8111e_get_stats(dev);
 	lp->opened = 0;
@@ -1560,6 +1734,23 @@ static int amd8111e_ioctl(struct net_dev
 	}
 	return -EOPNOTSUPP;
 }
+static int amd8111e_set_mac_address(struct net_device *dev, void *p)
+{
+	struct amd8111e_priv *lp = dev->priv;
+	int i;
+	struct sockaddr *addr = p;
+
+	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
+	spin_lock_irq(&lp->lock);
+	/* Setting the MAC address to the device */
+	for(i = 0; i < ETH_ADDR_LEN; i++)
+		writeb( dev->dev_addr[i], lp->mmio + PADR + i ); 
+		
+	spin_unlock_irq(&lp->lock);
+
+	return 0;
+}
+
 /* 
 This function changes the mtu of the device. It restarts the device  to initialize the descriptor with new receive buffers.
 */  
@@ -1845,6 +2036,7 @@ static int __devinit amd8111e_probe_one(
 	}
 
 	SET_MODULE_OWNER(dev);
+	SET_NETDEV_DEV(dev, &pdev->dev);
 
 #if AMD8111E_VLAN_TAG_USED
 	dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX ;
@@ -1890,11 +2082,16 @@ static int __devinit amd8111e_probe_one(
 	dev->stop = amd8111e_close;
 	dev->get_stats = amd8111e_get_stats;
 	dev->set_multicast_list = amd8111e_set_multicast_list;
+	dev->set_mac_address = amd8111e_set_mac_address;
 	dev->do_ioctl = amd8111e_ioctl;
 	dev->change_mtu = amd8111e_change_mtu;
 	dev->irq =pdev->irq;
 	dev->tx_timeout = amd8111e_tx_timeout; 
 	dev->watchdog_timeo = AMD8111E_TX_TIMEOUT; 
+#ifdef CONFIG_AMD8111E_NAPI
+	dev->poll = amd8111e_rx_poll;
+	dev->weight = 32;
+#endif
 #ifdef CONFIG_NET_POLL_CONTROLLER
 	dev->poll_controller = amd8111e_poll; 
 #endif
@@ -1908,6 +2105,7 @@ static int __devinit amd8111e_probe_one(
 	/* Set receive buffer length and set jumbo option*/
 	amd8111e_set_rx_buff_len(dev);
 
+
 	err = register_netdev(dev);
 	if (err) {
 		printk(KERN_ERR "amd8111e: Cannot register net device, "
@@ -1954,7 +2152,7 @@ err_disable_pdev:
 }
 
 static struct pci_driver amd8111e_driver = {
-	.name		= MODULE_NAME,
+	.name   	= MODULE_NAME,
 	.id_table	= amd8111e_pci_tbl,
 	.probe		= amd8111e_probe_one,
 	.remove		= __devexit_p(amd8111e_remove_one),
--- diff/drivers/net/amd8111e.h	2003-10-27 09:20:38.000000000 +0000
+++ source/drivers/net/amd8111e.h	2004-04-21 10:45:34.389475504 +0100
@@ -606,7 +606,7 @@ typedef enum {
 /* ipg parameters */
 #define DEFAULT_IPG			0x60
 #define IFS1_DELTA			36
-#define	IPG_CONVERGE_JIFFIES	(HZ / 2)
+#define	IPG_CONVERGE_JIFFIES (HZ/2)
 #define	IPG_STABLE_TIME	5
 #define	MIN_IPG	96
 #define	MAX_IPG	255
@@ -790,6 +790,7 @@ struct amd8111e_priv{
 #endif	
 	char opened;
 	struct net_device_stats stats;
+	unsigned int drv_rx_errors;
 	struct dev_mc_list* mc_list;
 	struct amd8111e_coalesce_conf coal_conf;
 
--- diff/drivers/net/arcnet/com20020-isa.c	2004-02-18 08:54:10.000000000 +0000
+++ source/drivers/net/arcnet/com20020-isa.c	2004-04-21 10:45:34.389475504 +0100
@@ -185,8 +185,6 @@ static void __exit com20020_exit(void)
 #ifndef MODULE
 static int __init com20020isa_setup(char *s)
 {
-	struct net_device *dev;
-	struct arcnet_local *lp;
 	int ints[8];
 
 	s = get_options(s, 8, ints);
--- diff/drivers/net/ariadne.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/ariadne.c	2004-04-21 10:45:34.390475352 +0100
@@ -195,11 +195,6 @@ static int __devinit ariadne_init_one(st
     dev->dev_addr[3] = (z->rom.er_SerialNumber>>16) & 0xff;
     dev->dev_addr[4] = (z->rom.er_SerialNumber>>8) & 0xff;
     dev->dev_addr[5] = z->rom.er_SerialNumber & 0xff;
-    printk("%s: Ariadne at 0x%08lx, Ethernet Address "
-	   "%02x:%02x:%02x:%02x:%02x:%02x\n", dev->name, board,
-	   dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
-	   dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
-
     dev->base_addr = ZTWO_VADDR(base_addr);
     dev->mem_start = ZTWO_VADDR(mem_start);
     dev->mem_end = dev->mem_start+ARIADNE_RAM_SIZE;
@@ -221,6 +216,11 @@ static int __devinit ariadne_init_one(st
     }
     zorro_set_drvdata(z, dev);
 
+    printk(KERN_INFO "%s: Ariadne at 0x%08lx, Ethernet Address "
+	   "%02x:%02x:%02x:%02x:%02x:%02x\n", dev->name, board,
+	   dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
+	   dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
+
     return 0;
 }
 
@@ -245,16 +245,16 @@ static int ariadne_open(struct net_devic
     lance->RAP = CSR89;		/* Chip ID */
     version |= swapw(lance->RDP)<<16;
     if ((version & 0x00000fff) != 0x00000003) {
-	printk("ariadne_open: Couldn't find AMD Ethernet Chip\n");
+	printk(KERN_WARNING "ariadne_open: Couldn't find AMD Ethernet Chip\n");
 	return -EAGAIN;
     }
     if ((version & 0x0ffff000) != 0x00003000) {
-	printk("ariadne_open: Couldn't find Am79C960 (Wrong part number = %ld)\n",
-	       (version & 0x0ffff000)>>12);
+	printk(KERN_WARNING "ariadne_open: Couldn't find Am79C960 (Wrong part "
+	       "number = %ld)\n", (version & 0x0ffff000)>>12);
 	return -EAGAIN;
     }
 #if 0
-    printk("ariadne_open: Am79C960 (PCnet-ISA) Revision %ld\n",
+    printk(KERN_DEBUG "ariadne_open: Am79C960 (PCnet-ISA) Revision %ld\n",
 	   (version & 0xf0000000)>>28);
 #endif
 
@@ -354,8 +354,8 @@ static void ariadne_init_ring(struct net
 	priv->tx_ring[i] = &lancedata->tx_ring[i];
 	priv->tx_buff[i] = lancedata->tx_buff[i];
 #if 0
-	printk("TX Entry %2d at %p, Buf at %p\n", i, &lancedata->tx_ring[i],
-	       lancedata->tx_buff[i]);
+	printk(KERN_DEBUG "TX Entry %2d at %p, Buf at %p\n", i,
+	       &lancedata->tx_ring[i], lancedata->tx_buff[i]);
 #endif
     }
 
@@ -370,8 +370,8 @@ static void ariadne_init_ring(struct net
 	priv->rx_ring[i] = &lancedata->rx_ring[i];
 	priv->rx_buff[i] = lancedata->rx_buff[i];
 #if 0
-	printk("RX Entry %2d at %p, Buf at %p\n", i, &lancedata->rx_ring[i],
-	       lancedata->rx_buff[i]);
+	printk(KERN_DEBUG "RX Entry %2d at %p, Buf at %p\n", i,
+	       &lancedata->rx_ring[i], lancedata->rx_buff[i]);
 #endif
     }
 }
@@ -389,9 +389,9 @@ static int ariadne_close(struct net_devi
     lance->RAP = CSR0;		/* PCnet-ISA Controller Status */
 
     if (ariadne_debug > 1) {
-	printk("%s: Shutting down ethercard, status was %2.2x.\n", dev->name,
-	       lance->RDP);
-	printk("%s: %lu packets missed\n", dev->name,
+	printk(KERN_DEBUG "%s: Shutting down ethercard, status was %2.2x.\n",
+	       dev->name, lance->RDP);
+	printk(KERN_DEBUG "%s: %lu packets missed\n", dev->name,
 	       priv->stats.rx_missed_errors);
     }
 
@@ -425,7 +425,7 @@ static irqreturn_t ariadne_interrupt(int
     int handled = 0;
 
     if (dev == NULL) {
-	printk("ariadne_interrupt(): irq for unknown device.\n");
+	printk(KERN_WARNING "ariadne_interrupt(): irq for unknown device.\n");
 	return IRQ_NONE;
     }
 
@@ -443,8 +443,8 @@ static irqreturn_t ariadne_interrupt(int
 
 #if 0
 	if (ariadne_debug > 5) {
-	    printk("%s: interrupt  csr0=%#2.2x new csr=%#2.2x.", dev->name,
-		   csr0, lance->RDP);
+	    printk(KERN_DEBUG "%s: interrupt  csr0=%#2.2x new csr=%#2.2x.",
+		   dev->name, csr0, lance->RDP);
 	    printk("[");
 	    if (csr0 & INTR)
 		printk(" INTR");
@@ -514,8 +514,8 @@ static irqreturn_t ariadne_interrupt(int
 			/* Ackk!  On FIFO errors the Tx unit is turned off! */
 			priv->stats.tx_fifo_errors++;
 			/* Remove this verbosity later! */
-			printk("%s: Tx FIFO error! Status %4.4x.\n", dev->name,
-			       csr0);
+			printk(KERN_ERR "%s: Tx FIFO error! Status %4.4x.\n",
+			       dev->name, csr0);
 			/* Restart the chip. */
 			lance->RDP = STRT;
 		    }
@@ -529,8 +529,8 @@ static irqreturn_t ariadne_interrupt(int
 
 #ifndef final_version
 	    if (priv->cur_tx - dirty_tx >= TX_RING_SIZE) {
-		printk("out-of-sync dirty pointer, %d vs. %d, full=%d.\n",
-		       dirty_tx, priv->cur_tx, priv->tx_full);
+		printk(KERN_ERR "out-of-sync dirty pointer, %d vs. %d, "
+		       "full=%d.\n", dirty_tx, priv->cur_tx, priv->tx_full);
 		dirty_tx += TX_RING_SIZE;
 	    }
 #endif
@@ -556,8 +556,8 @@ static irqreturn_t ariadne_interrupt(int
 	}
 	if (csr0 & MERR) {
 	    handled = 1;
-	    printk("%s: Bus master arbitration failure, status %4.4x.\n",
-		   dev->name, csr0);
+	    printk(KERN_ERR "%s: Bus master arbitration failure, status "
+		   "%4.4x.\n", dev->name, csr0);
 	    /* Restart the chip. */
 	    lance->RDP = STRT;
 	}
@@ -569,8 +569,8 @@ static irqreturn_t ariadne_interrupt(int
 
 #if 0
     if (ariadne_debug > 4)
-	printk("%s: exiting interrupt, csr%d=%#4.4x.\n", dev->name, lance->RAP,
-	       lance->RDP);
+	printk(KERN_DEBUG "%s: exiting interrupt, csr%d=%#4.4x.\n", dev->name,
+	       lance->RAP, lance->RDP);
 #endif
     return IRQ_RETVAL(handled);
 }
@@ -598,8 +598,8 @@ static int ariadne_start_xmit(struct sk_
 #if 0
     if (ariadne_debug > 3) {
 	lance->RAP = CSR0;	/* PCnet-ISA Controller Status */
-	printk("%s: ariadne_start_xmit() called, csr0 %4.4x.\n", dev->name,
-	       lance->RDP);
+	printk(KERN_DEBUG "%s: ariadne_start_xmit() called, csr0 %4.4x.\n",
+	       dev->name, lance->RDP);
 	lance->RDP = 0x0000;
     }
 #endif
@@ -616,7 +616,7 @@ static int ariadne_start_xmit(struct sk_
     /* Fill in a Tx ring entry */
 
 #if 0
-    printk("TX pkt type 0x%04x from ", ((u_short *)skb->data)[6]);
+    printk(KERN_DEBUG "TX pkt type 0x%04x from ", ((u_short *)skb->data)[6]);
     {
 	int i;
 	u_char *ptr = &((u_char *)skb->data)[6];
@@ -652,7 +652,7 @@ static int ariadne_start_xmit(struct sk_
 	len >>= 1;
 	for (i = 0; i < len; i += 8) {
 	    int j;
-	    printk("%04x:", i);
+	    printk(KERN_DEBUG "%04x:", i);
 	    for (j = 0; (j < 8) && ((i+j) < len); j++) {
 		if (!(j & 1))
 		    printk(" ");
@@ -671,8 +671,8 @@ static int ariadne_start_xmit(struct sk_
     if ((priv->cur_tx >= TX_RING_SIZE) && (priv->dirty_tx >= TX_RING_SIZE)) {
 
 #if 0
-	printk("*** Subtracting TX_RING_SIZE from cur_tx (%d) and dirty_tx (%d)\n",
-	       priv->cur_tx, priv->dirty_tx);
+	printk(KERN_DEBUG "*** Subtracting TX_RING_SIZE from cur_tx (%d) and "
+	       "dirty_tx (%d)\n", priv->cur_tx, priv->dirty_tx);
 #endif
 
 	priv->cur_tx -= TX_RING_SIZE;
@@ -729,7 +729,8 @@ static int ariadne_rx(struct net_device 
 
 	    skb = dev_alloc_skb(pkt_len+2);
 	    if (skb == NULL) {
-		printk("%s: Memory squeeze, deferring packet.\n", dev->name);
+		printk(KERN_WARNING "%s: Memory squeeze, deferring packet.\n",
+		       dev->name);
 		for (i = 0; i < RX_RING_SIZE; i++)
 		    if (lowb(priv->rx_ring[(entry+i) % RX_RING_SIZE]->RMD1) & RF_OWN)
 			break;
@@ -749,7 +750,8 @@ static int ariadne_rx(struct net_device 
 	    eth_copy_and_sum(skb, (char *)priv->rx_buff[entry], pkt_len,0);
 	    skb->protocol=eth_type_trans(skb,dev);
 #if 0
-	    printk("RX pkt type 0x%04x from ", ((u_short *)skb->data)[6]);
+	    printk(KERN_DEBUG "RX pkt type 0x%04x from ",
+		   ((u_short *)skb->data)[6]);
 	    {
 		int i;
 		u_char *ptr = &((u_char *)skb->data)[6];
@@ -825,7 +827,7 @@ static void set_multicast_list(struct ne
 
     if (dev->flags & IFF_PROMISC) {
 	/* Log any net taps. */
-	printk("%s: Promiscuous mode enabled.\n", dev->name);
+	printk(KERN_INFO "%s: Promiscuous mode enabled.\n", dev->name);
 	lance->RAP = CSR15;		/* Mode Register */
 	lance->RDP = PROM;		/* Set promiscuous mode */
     } else {
--- diff/drivers/net/arm/etherh.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/arm/etherh.c	2004-04-21 10:45:34.391475200 +0100
@@ -59,10 +59,26 @@
 static unsigned int net_debug = NET_DEBUG;
 
 struct etherh_priv {
-	struct ei_device eidev;
+	void		*ioc_fast;
+	void		*memc;
 	unsigned int	id;
-	unsigned int	ctrl_port;
-	unsigned int	ctrl;
+	void		*ctrl_port;
+	unsigned char	ctrl;
+};
+
+struct etherh_data {
+	unsigned long	ns8390_offset;
+	unsigned long	dataport_offset;
+	unsigned long	ctrlport_offset;
+	int		ctrl_ioc;
+	const char	name[16];
+	/*
+	 * netdev flags and port
+	 */
+	unsigned short	flags;
+	unsigned char	if_port;
+	unsigned char	tx_start_page;
+	unsigned char	stop_page;
 };
 
 MODULE_AUTHOR("Russell King");
@@ -72,13 +88,13 @@ MODULE_LICENSE("GPL");
 static char version[] __initdata =
 	"EtherH/EtherM Driver (c) 2002 Russell King v1.09\n";
 
-#define ETHERH500_DATAPORT	0x200	/* MEMC */
+#define ETHERH500_DATAPORT	0x800	/* MEMC */
 #define ETHERH500_NS8390	0x000	/* MEMC */
-#define ETHERH500_CTRLPORT	0x200	/* IOC  */
+#define ETHERH500_CTRLPORT	0x800	/* IOC  */
 
-#define ETHERH600_DATAPORT	16	/* MEMC */
-#define ETHERH600_NS8390	0x200	/* MEMC */
-#define ETHERH600_CTRLPORT	0x080	/* MEMC */
+#define ETHERH600_DATAPORT	0x040	/* MEMC */
+#define ETHERH600_NS8390	0x800	/* MEMC */
+#define ETHERH600_CTRLPORT	0x200	/* MEMC */
 
 #define ETHERH_CP_IE		1
 #define ETHERH_CP_IF		2
@@ -90,30 +106,35 @@ static char version[] __initdata =
 /*
  * These came from CK/TEW
  */
-#define ETHERM_DATAPORT		0x080	/* MEMC */
-#define ETHERM_NS8390		0x200	/* MEMC */
-#define ETHERM_CTRLPORT		0x08f	/* MEMC */
+#define ETHERM_DATAPORT		0x200	/* MEMC */
+#define ETHERM_NS8390		0x800	/* MEMC */
+#define ETHERM_CTRLPORT		0x23c	/* MEMC */
 
 #define ETHERM_TX_START_PAGE	64
 #define ETHERM_STOP_PAGE	127
 
 /* ------------------------------------------------------------------------ */
 
-static inline void etherh_set_ctrl(struct etherh_priv *eh, unsigned int mask)
+#define etherh_priv(dev) \
+ ((struct etherh_priv *)(((char *)netdev_priv(dev)) + sizeof(struct ei_device)))
+
+static inline void etherh_set_ctrl(struct etherh_priv *eh, unsigned char mask)
 {
-	eh->ctrl |= mask;
-	outb(eh->ctrl, eh->ctrl_port);
+	unsigned char ctrl = eh->ctrl | mask;
+	eh->ctrl = ctrl;
+	writeb(ctrl, eh->ctrl_port);
 }
 
-static inline void etherh_clr_ctrl(struct etherh_priv *eh, unsigned int mask)
+static inline void etherh_clr_ctrl(struct etherh_priv *eh, unsigned char mask)
 {
-	eh->ctrl &= ~mask;
-	outb(eh->ctrl, eh->ctrl_port);
+	unsigned char ctrl = eh->ctrl & ~mask;
+	eh->ctrl = ctrl;
+	writeb(ctrl, eh->ctrl_port);
 }
 
 static inline unsigned int etherh_get_stat(struct etherh_priv *eh)
 {
-	return inb(eh->ctrl_port);
+	return readb(eh->ctrl_port);
 }
 
 
@@ -144,24 +165,23 @@ static expansioncard_ops_t etherh_ops = 
 static void
 etherh_setif(struct net_device *dev)
 {
-	struct etherh_priv *eh = netdev_priv(dev);
-	struct ei_device *ei_local = &eh->eidev;
+	struct ei_device *ei_local = netdev_priv(dev);
 	unsigned long addr, flags;
 
 	local_irq_save(flags);
 
 	/* set the interface type */
-	switch (eh->id) {
+	switch (etherh_priv(dev)->id) {
 	case PROD_I3_ETHERLAN600:
 	case PROD_I3_ETHERLAN600A:
 		addr = dev->base_addr + EN0_RCNTHI;
 
 		switch (dev->if_port) {
 		case IF_PORT_10BASE2:
-			outb((inb(addr) & 0xf8) | 1, addr);
+			writeb((readb(addr) & 0xf8) | 1, addr);
 			break;
 		case IF_PORT_10BASET:
-			outb((inb(addr) & 0xf8), addr);
+			writeb((readb(addr) & 0xf8), addr);
 			break;
 		}
 		break;
@@ -169,11 +189,11 @@ etherh_setif(struct net_device *dev)
 	case PROD_I3_ETHERLAN500:
 		switch (dev->if_port) {
 		case IF_PORT_10BASE2:
-			etherh_clr_ctrl(eh, ETHERH_CP_IF);
+			etherh_clr_ctrl(etherh_priv(dev), ETHERH_CP_IF);
 			break;
 
 		case IF_PORT_10BASET:
-			etherh_set_ctrl(eh, ETHERH_CP_IF);
+			etherh_set_ctrl(etherh_priv(dev), ETHERH_CP_IF);
 			break;
 		}
 		break;
@@ -188,11 +208,10 @@ etherh_setif(struct net_device *dev)
 static int
 etherh_getifstat(struct net_device *dev)
 {
-	struct etherh_priv *eh = netdev_priv(dev);
-	struct ei_device *ei_local = &eh->eidev;
+	struct ei_device *ei_local = netdev_priv(dev);
 	int stat = 0;
 
-	switch (eh->id) {
+	switch (etherh_priv(dev)->id) {
 	case PROD_I3_ETHERLAN600:
 	case PROD_I3_ETHERLAN600A:
 		switch (dev->if_port) {
@@ -200,7 +219,7 @@ etherh_getifstat(struct net_device *dev)
 			stat = 1;
 			break;
 		case IF_PORT_10BASET:
-			stat = inb(dev->base_addr+EN0_RCNTHI) & 4;
+			stat = readb(dev->base_addr+EN0_RCNTHI) & 4;
 			break;
 		}
 		break;
@@ -211,7 +230,7 @@ etherh_getifstat(struct net_device *dev)
 			stat = 1;
 			break;
 		case IF_PORT_10BASET:
-			stat = etherh_get_stat(eh) & ETHERH_CP_HEARTBEAT;
+			stat = etherh_get_stat(etherh_priv(dev)) & ETHERH_CP_HEARTBEAT;
 			break;
 		}
 		break;
@@ -258,7 +277,7 @@ etherh_reset(struct net_device *dev)
 {
 	struct ei_device *ei_local = netdev_priv(dev);
 
-	outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, dev->base_addr);
+	writeb(E8390_NODMA+E8390_PAGE0+E8390_STOP, dev->base_addr);
 
 	/*
 	 * See if we need to change the interface type.
@@ -306,31 +325,31 @@ etherh_block_output (struct net_device *
 	dma_addr = dev->mem_start;
 
 	count = (count + 1) & ~1;
-	outb (E8390_NODMA | E8390_PAGE0 | E8390_START, addr + E8390_CMD);
+	writeb (E8390_NODMA | E8390_PAGE0 | E8390_START, addr + E8390_CMD);
 
-	outb (0x42, addr + EN0_RCNTLO);
-	outb (0x00, addr + EN0_RCNTHI);
-	outb (0x42, addr + EN0_RSARLO);
-	outb (0x00, addr + EN0_RSARHI);
-	outb (E8390_RREAD | E8390_START, addr + E8390_CMD);
+	writeb (0x42, addr + EN0_RCNTLO);
+	writeb (0x00, addr + EN0_RCNTHI);
+	writeb (0x42, addr + EN0_RSARLO);
+	writeb (0x00, addr + EN0_RSARHI);
+	writeb (E8390_RREAD | E8390_START, addr + E8390_CMD);
 
 	udelay (1);
 
-	outb (ENISR_RDC, addr + EN0_ISR);
-	outb (count, addr + EN0_RCNTLO);
-	outb (count >> 8, addr + EN0_RCNTHI);
-	outb (0, addr + EN0_RSARLO);
-	outb (start_page, addr + EN0_RSARHI);
-	outb (E8390_RWRITE | E8390_START, addr + E8390_CMD);
+	writeb (ENISR_RDC, addr + EN0_ISR);
+	writeb (count, addr + EN0_RCNTLO);
+	writeb (count >> 8, addr + EN0_RCNTHI);
+	writeb (0, addr + EN0_RSARLO);
+	writeb (start_page, addr + EN0_RSARHI);
+	writeb (E8390_RWRITE | E8390_START, addr + E8390_CMD);
 
 	if (ei_local->word16)
-		outsw (dma_addr, buf, count >> 1);
+		writesw (dma_addr, buf, count >> 1);
 	else
-		outsb (dma_addr, buf, count);
+		writesb (dma_addr, buf, count);
 
 	dma_start = jiffies;
 
-	while ((inb (addr + EN0_ISR) & ENISR_RDC) == 0)
+	while ((readb (addr + EN0_ISR) & ENISR_RDC) == 0)
 		if (jiffies - dma_start > 2*HZ/100) { /* 20ms */
 			printk(KERN_ERR "%s: timeout waiting for TX RDC\n",
 				dev->name);
@@ -339,7 +358,7 @@ etherh_block_output (struct net_device *
 			break;
 		}
 
-	outb (ENISR_RDC, addr + EN0_ISR);
+	writeb (ENISR_RDC, addr + EN0_ISR);
 	ei_local->dmaing = 0;
 }
 
@@ -366,21 +385,21 @@ etherh_block_input (struct net_device *d
 	dma_addr = dev->mem_start;
 
 	buf = skb->data;
-	outb (E8390_NODMA | E8390_PAGE0 | E8390_START, addr + E8390_CMD);
-	outb (count, addr + EN0_RCNTLO);
-	outb (count >> 8, addr + EN0_RCNTHI);
-	outb (ring_offset, addr + EN0_RSARLO);
-	outb (ring_offset >> 8, addr + EN0_RSARHI);
-	outb (E8390_RREAD | E8390_START, addr + E8390_CMD);
+	writeb (E8390_NODMA | E8390_PAGE0 | E8390_START, addr + E8390_CMD);
+	writeb (count, addr + EN0_RCNTLO);
+	writeb (count >> 8, addr + EN0_RCNTHI);
+	writeb (ring_offset, addr + EN0_RSARLO);
+	writeb (ring_offset >> 8, addr + EN0_RSARHI);
+	writeb (E8390_RREAD | E8390_START, addr + E8390_CMD);
 
 	if (ei_local->word16) {
-		insw (dma_addr, buf, count >> 1);
+		readsw (dma_addr, buf, count >> 1);
 		if (count & 1)
-			buf[count - 1] = inb (dma_addr);
+			buf[count - 1] = readb (dma_addr);
 	} else
-		insb (dma_addr, buf, count);
+		readsb (dma_addr, buf, count);
 
-	outb (ENISR_RDC, addr + EN0_ISR);
+	writeb (ENISR_RDC, addr + EN0_ISR);
 	ei_local->dmaing = 0;
 }
 
@@ -405,19 +424,19 @@ etherh_get_header (struct net_device *de
 	addr = dev->base_addr;
 	dma_addr = dev->mem_start;
 
-	outb (E8390_NODMA | E8390_PAGE0 | E8390_START, addr + E8390_CMD);
-	outb (sizeof (*hdr), addr + EN0_RCNTLO);
-	outb (0, addr + EN0_RCNTHI);
-	outb (0, addr + EN0_RSARLO);
-	outb (ring_page, addr + EN0_RSARHI);
-	outb (E8390_RREAD | E8390_START, addr + E8390_CMD);
+	writeb (E8390_NODMA | E8390_PAGE0 | E8390_START, addr + E8390_CMD);
+	writeb (sizeof (*hdr), addr + EN0_RCNTLO);
+	writeb (0, addr + EN0_RCNTHI);
+	writeb (0, addr + EN0_RSARLO);
+	writeb (ring_page, addr + EN0_RSARHI);
+	writeb (E8390_RREAD | E8390_START, addr + E8390_CMD);
 
 	if (ei_local->word16)
-		insw (dma_addr, hdr, sizeof (*hdr) >> 1);
+		readsw (dma_addr, hdr, sizeof (*hdr) >> 1);
 	else
-		insb (dma_addr, hdr, sizeof (*hdr));
+		readsb (dma_addr, hdr, sizeof (*hdr));
 
-	outb (ENISR_RDC, addr + EN0_ISR);
+	writeb (ENISR_RDC, addr + EN0_ISR);
 	ei_local->dmaing = 0;
 }
 
@@ -543,130 +562,86 @@ static u32 etherm_regoffsets[16];
 static int __init
 etherh_probe(struct expansion_card *ec, const struct ecard_id *id)
 {
+	const struct etherh_data *data = id->data;
 	struct ei_device *ei_local;
 	struct net_device *dev;
 	struct etherh_priv *eh;
-	const char *dev_type;
-	int i, size, ret;
+	int i, ret;
 
 	etherh_banner();
 
+	ret = ecard_request_resources(ec);
+	if (ret)
+		goto out;
+
 	dev = alloc_ei_netdev();
 	if (!dev) {
 		ret = -ENOMEM;
-		goto out;
+		goto release;
 	}
 
-	eh = netdev_priv(dev);
-
-	spin_lock_init(&eh->eidev.page_lock);
-
 	SET_MODULE_OWNER(dev);
+	SET_NETDEV_DEV(dev, &ec->dev);
 
 	dev->open		= etherh_open;
 	dev->stop		= etherh_close;
 	dev->set_config		= etherh_set_config;
 	dev->irq		= ec->irq;
-	dev->base_addr		= ecard_address(ec, ECARD_MEMC, 0);
+	dev->if_port		= data->if_port;
+	dev->flags		|= data->flags;
 
-	/*
-	 * IRQ and control port handling
-	 */
-	if (ec->irq != 11) {
-		ec->ops		= &etherh_ops;
-		ec->irq_data	= eh;
-	}
+	eh = etherh_priv(dev);
 	eh->ctrl		= 0;
 	eh->id			= ec->cid.product;
-
-	switch (ec->cid.product) {
-	case PROD_ANT_ETHERM:
-		etherm_addr(dev->dev_addr);
-		dev->base_addr += ETHERM_NS8390;
-		dev->mem_start  = dev->base_addr + ETHERM_DATAPORT;
-		eh->ctrl_port   = dev->base_addr + ETHERM_CTRLPORT;
-		break;
-
-	case PROD_I3_ETHERLAN500:
-		etherh_addr(dev->dev_addr, ec);
-		dev->base_addr += ETHERH500_NS8390;
-		dev->mem_start  = dev->base_addr + ETHERH500_DATAPORT;
-		eh->ctrl_port   = ecard_address (ec, ECARD_IOC, ECARD_FAST)
-				  + ETHERH500_CTRLPORT;
-		break;
-
-	case PROD_I3_ETHERLAN600:
-	case PROD_I3_ETHERLAN600A:
-		etherh_addr(dev->dev_addr, ec);
-		dev->base_addr += ETHERH600_NS8390;
-		dev->mem_start  = dev->base_addr + ETHERH600_DATAPORT;
-		eh->ctrl_port   = dev->base_addr + ETHERH600_CTRLPORT;
-		break;
-
-	default:
-		printk(KERN_ERR "%s: unknown card type %x\n",
-		       dev->name, ec->cid.product);
-		ret = -ENODEV;
+	eh->memc		= ioremap(ecard_resource_start(ec, ECARD_RES_MEMC), PAGE_SIZE);
+	if (!eh->memc) {
+		ret = -ENOMEM;
 		goto free;
 	}
 
-	size = 16;
-	if (ec->cid.product == PROD_ANT_ETHERM)
-		size <<= 3;
-
-	if (!request_region(dev->base_addr, size, dev->name)) {
-		ret = -EBUSY;
-		goto free;
+	eh->ctrl_port = eh->memc;
+	if (data->ctrl_ioc) {
+		eh->ioc_fast = ioremap(ecard_resource_start(ec, ECARD_RES_IOCFAST), PAGE_SIZE);
+		if (!eh->ioc_fast) {
+			ret = -ENOMEM;
+			goto free;
+		}
+		eh->ctrl_port = eh->ioc_fast;
 	}
 
+	dev->base_addr = (unsigned long)eh->memc + data->ns8390_offset;
+	dev->mem_start = (unsigned long)eh->memc + data->dataport_offset;
+	eh->ctrl_port += data->ctrlport_offset;
+
 	/*
-	 * If we're in the NIC slot, make sure the IRQ is enabled
+	 * IRQ and control port handling - only for non-NIC slot cards.
 	 */
-	if (dev->irq == 11)
+	if (ec->slot_no != 8) {
+		ec->ops		= &etherh_ops;
+		ec->irq_data	= eh;
+	} else {
+		/*
+		 * If we're in the NIC slot, make sure the IRQ is enabled
+		 */
 		etherh_set_ctrl(eh, ETHERH_CP_IE);
-
-	switch (ec->cid.product) {
-	case PROD_ANT_ETHERM:
-		dev_type = "ANT EtherM";
-		dev->if_port = IF_PORT_UNKNOWN;
-		break;
-
-	case PROD_I3_ETHERLAN500:
-		dev_type = "i3 EtherH 500";
-		dev->if_port = IF_PORT_UNKNOWN;
-		break;
-
-	case PROD_I3_ETHERLAN600:
-		dev_type = "i3 EtherH 600";
-		dev->flags  |= IFF_PORTSEL | IFF_AUTOMEDIA;
-		dev->if_port = IF_PORT_10BASET;
-		break;
-
-	case PROD_I3_ETHERLAN600A:
-		dev_type = "i3 EtherH 600A";
-		dev->flags  |= IFF_PORTSEL | IFF_AUTOMEDIA;
-		dev->if_port = IF_PORT_10BASET;
-		break;
-
-	default:
-		dev_type = "unknown";
-		break;
 	}
 
 	ei_local = netdev_priv(dev);
+	spin_lock_init(&ei_local->page_lock);
+
 	if (ec->cid.product == PROD_ANT_ETHERM) {
-		ei_local->tx_start_page = ETHERM_TX_START_PAGE;
-		ei_local->stop_page     = ETHERM_STOP_PAGE;
-		ei_local->reg_offset    = etherm_regoffsets;
+		etherm_addr(dev->dev_addr);
+		ei_local->reg_offset = etherm_regoffsets;
 	} else {
-		ei_local->tx_start_page = ETHERH_TX_START_PAGE;
-		ei_local->stop_page     = ETHERH_STOP_PAGE;
-		ei_local->reg_offset    = etherh_regoffsets;
+		etherh_addr(dev->dev_addr, ec);
+		ei_local->reg_offset = etherh_regoffsets;
 	}
 
 	ei_local->name          = dev->name;
 	ei_local->word16        = 1;
+	ei_local->tx_start_page = data->tx_start_page;
 	ei_local->rx_start_page = ei_local->tx_start_page + TX_PAGES;
+	ei_local->stop_page     = data->stop_page;
 	ei_local->reset_8390    = etherh_reset;
 	ei_local->block_input   = etherh_block_input;
 	ei_local->block_output  = etherh_block_output;
@@ -678,10 +653,10 @@ etherh_probe(struct expansion_card *ec, 
 
 	ret = register_netdev(dev);
 	if (ret)
-		goto release;
+		goto free;
 
 	printk(KERN_INFO "%s: %s in slot %d, ",
-		dev->name, dev_type, ec->slot_no);
+		dev->name, data->name, ec->slot_no);
 
 	for (i = 0; i < 6; i++)
 		printk("%2.2x%c", dev->dev_addr[i], i == 5 ? '\n' : ':');
@@ -690,10 +665,14 @@ etherh_probe(struct expansion_card *ec, 
 
 	return 0;
 
- release:
-	release_region(dev->base_addr, 16);
  free:
+	if (eh->ioc_fast)
+		iounmap(eh->ioc_fast);
+	if (eh->memc)
+		iounmap(eh->memc);
 	free_netdev(dev);
+ release:
+	ecard_release_resources(ec);
  out:
 	return ret;
 }
@@ -701,25 +680,70 @@ etherh_probe(struct expansion_card *ec, 
 static void __devexit etherh_remove(struct expansion_card *ec)
 {
 	struct net_device *dev = ecard_get_drvdata(ec);
-	int size = 16;
+	struct etherh_priv *eh = etherh_priv(dev);
 
 	ecard_set_drvdata(ec, NULL);
 
 	unregister_netdev(dev);
-	if (ec->cid.product == PROD_ANT_ETHERM)
-		size <<= 3;
-	release_region(dev->base_addr, size);
+	ec->ops = NULL;
+
+	if (eh->ioc_fast)
+		iounmap(eh->ioc_fast);
+	iounmap(eh->memc);
+
 	free_netdev(dev);
 
-	ec->ops = NULL;
-	kfree(ec->irq_data);
+	ecard_release_resources(ec);
 }
 
+static struct etherh_data etherm_data = {
+	.ns8390_offset		= ETHERM_NS8390,
+	.dataport_offset	= ETHERM_NS8390 + ETHERM_DATAPORT,
+	.ctrlport_offset	= ETHERM_NS8390 + ETHERM_CTRLPORT,
+	.name			= "ANT EtherM",
+	.if_port		= IF_PORT_UNKNOWN,
+	.tx_start_page		= ETHERM_TX_START_PAGE,
+	.stop_page		= ETHERM_STOP_PAGE,
+};
+
+static struct etherh_data etherlan500_data = {
+	.ns8390_offset		= ETHERH500_NS8390,
+	.dataport_offset	= ETHERH500_NS8390 + ETHERH500_DATAPORT,
+	.ctrlport_offset	= ETHERH500_CTRLPORT,
+	.ctrl_ioc		= 1,
+	.name			= "i3 EtherH 500",
+	.if_port		= IF_PORT_UNKNOWN,
+	.tx_start_page		= ETHERH_TX_START_PAGE,
+	.stop_page		= ETHERH_STOP_PAGE,
+};
+
+static struct etherh_data etherlan600_data = {
+	.ns8390_offset		= ETHERH600_NS8390,
+	.dataport_offset	= ETHERH600_NS8390 + ETHERH600_DATAPORT,
+	.ctrlport_offset	= ETHERH600_NS8390 + ETHERH600_CTRLPORT,
+	.name			= "i3 EtherH 600",
+	.flags			= IFF_PORTSEL | IFF_AUTOMEDIA,
+	.if_port		= IF_PORT_10BASET,
+	.tx_start_page		= ETHERH_TX_START_PAGE,
+	.stop_page		= ETHERH_STOP_PAGE,
+};
+
+static struct etherh_data etherlan600a_data = {
+	.ns8390_offset		= ETHERH600_NS8390,
+	.dataport_offset	= ETHERH600_NS8390 + ETHERH600_DATAPORT,
+	.ctrlport_offset	= ETHERH600_NS8390 + ETHERH600_CTRLPORT,
+	.name			= "i3 EtherH 600A",
+	.flags			= IFF_PORTSEL | IFF_AUTOMEDIA,
+	.if_port		= IF_PORT_10BASET,
+	.tx_start_page		= ETHERH_TX_START_PAGE,
+	.stop_page		= ETHERH_STOP_PAGE,
+};
+
 static const struct ecard_id etherh_ids[] = {
-	{ MANU_ANT, PROD_ANT_ETHERM      },
-	{ MANU_I3,  PROD_I3_ETHERLAN500  },
-	{ MANU_I3,  PROD_I3_ETHERLAN600  },
-	{ MANU_I3,  PROD_I3_ETHERLAN600A },
+	{ MANU_ANT, PROD_ANT_ETHERM,      &etherm_data       },
+	{ MANU_I3,  PROD_I3_ETHERLAN500,  &etherlan500_data  },
+	{ MANU_I3,  PROD_I3_ETHERLAN600,  &etherlan600_data  },
+	{ MANU_I3,  PROD_I3_ETHERLAN600A, &etherlan600a_data },
 	{ 0xffff,   0xffff }
 };
 
@@ -737,8 +761,8 @@ static int __init etherh_init(void)
 	int i;
 
 	for (i = 0; i < 16; i++) {
-		etherh_regoffsets[i] = i;
-		etherm_regoffsets[i] = i << 3;
+		etherh_regoffsets[i] = i << 2;
+		etherm_regoffsets[i] = i << 5;
 	}
 
 	return ecard_register_driver(&etherh_driver);
--- diff/drivers/net/b44.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/b44.c	2004-04-21 10:45:34.392475048 +0100
@@ -2,6 +2,8 @@
  *
  * Copyright (C) 2002 David S. Miller (davem@redhat.com)
  * Fixed by Pekka Pietikainen (pp@ee.oulu.fi)
+ *
+ * Distribute under GPL.
  */
 
 #include <linux/kernel.h>
@@ -25,8 +27,8 @@
 
 #define DRV_MODULE_NAME		"b44"
 #define PFX DRV_MODULE_NAME	": "
-#define DRV_MODULE_VERSION	"0.92"
-#define DRV_MODULE_RELDATE	"Nov 4, 2003"
+#define DRV_MODULE_VERSION	"0.93"
+#define DRV_MODULE_RELDATE	"Mar, 2004"
 
 #define B44_DEF_MSG_ENABLE	  \
 	(NETIF_MSG_DRV		| \
@@ -83,6 +85,10 @@ static int b44_debug = -1;	/* -1 == use 
 static struct pci_device_id b44_pci_tbl[] = {
 	{ PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BCM4401,
 	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
+	{ PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BCM4401B0,
+	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
+	{ PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BCM4401B1,
+	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
 	{ }	/* terminate list with empty entry */
 };
 
@@ -1178,7 +1184,6 @@ static int b44_init_hw(struct b44 *bp)
 {
 	u32 val;
 
-	b44_disable_ints(bp);
 	b44_chip_reset(bp);
 	b44_phy_reset(bp);
 	b44_setup_phy(bp);
@@ -1377,7 +1382,7 @@ static void b44_set_rx_mode(struct net_d
 	spin_unlock_irq(&bp->lock);
 }
 
-static int b44_ethtool_ioctl (struct net_device *dev, void *useraddr)
+static int b44_ethtool_ioctl (struct net_device *dev, void __user *useraddr)
 {
 	struct b44 *bp = dev->priv;
 	struct pci_dev *pci_dev = bp->pdev;
@@ -1620,13 +1625,13 @@ static int b44_ethtool_ioctl (struct net
 
 static int b44_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 {
-	struct mii_ioctl_data *data = (struct mii_ioctl_data *)&ifr->ifr_data;
+	struct mii_ioctl_data __user *data = (struct mii_ioctl_data __user *)&ifr->ifr_data;
 	struct b44 *bp = dev->priv;
 	int err;
 
 	switch (cmd) {
 	case SIOCETHTOOL:
-		return b44_ethtool_ioctl(dev, (void *) ifr->ifr_data);
+		return b44_ethtool_ioctl(dev, (void __user*) ifr->ifr_data);
 
 	case SIOCGMIIPHY:
 		data->phy_id = bp->phy_addr;
--- diff/drivers/net/b44.h	2003-08-20 14:16:10.000000000 +0100
+++ source/drivers/net/b44.h	2004-04-21 10:45:34.393474896 +0100
@@ -1,8 +1,9 @@
 #ifndef _B44_H
 #define _B44_H
 
-/* Register layout. */
+/* Register layout. (These correspond to struct _bcmenettregs in bcm4400.) */
 #define	B44_DEVCTRL	0x0000UL /* Device Control */
+#define  DEVCTRL_MPM		0x00000040 /* Magic Packet PME Enable (B0 only) */
 #define  DEVCTRL_PFE		0x00000080 /* Pattern Filtering Enable */
 #define  DEVCTRL_IPP		0x00000400 /* Internal EPHY Present */
 #define  DEVCTRL_EPR		0x00008000 /* EPHY Reset */
@@ -24,6 +25,7 @@
 #define  WKUP_LEN_P3_SHIFT	24
 #define  WKUP_LEN_D3		0x80000000
 #define B44_ISTAT	0x0020UL /* Interrupt Status */
+#define  ISTAT_LS		0x00000020 /* Link Change (B0 only) */
 #define  ISTAT_PME		0x00000040 /* Power Management Event */
 #define  ISTAT_TO		0x00000080 /* General Purpose Timeout */
 #define  ISTAT_DSCE		0x00000400 /* Descriptor Error */
@@ -41,6 +43,8 @@
 #define B44_IMASK	0x0024UL /* Interrupt Mask */
 #define  IMASK_DEF		(ISTAT_ERRORS | ISTAT_TO | ISTAT_RX | ISTAT_TX)
 #define B44_GPTIMER	0x0028UL /* General Purpose Timer */
+#define B44_ADDR_LO	0x0088UL /* ENET Address Lo (B0 only) */
+#define B44_ADDR_HI	0x008CUL /* ENET Address Hi (B0 only) */
 #define B44_FILT_ADDR	0x0090UL /* ENET Filter Address */
 #define B44_FILT_DATA	0x0094UL /* ENET Filter Data */
 #define B44_TXBURST	0x00A0UL /* TX Max Burst Length */
--- diff/drivers/net/dgrs.c	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/net/dgrs.c	2004-04-21 10:45:34.394474744 +0100
@@ -327,8 +327,10 @@ check_board_dma(struct net_device *dev0)
 	 */
 	priv0->vplxdma[PLX_DMA0_MODE/4] = 0xFFFFFFFF;
 	x = priv0->vplxdma[PLX_DMA0_MODE/4];
-	if (x != 0x00001FFF)
+	if (x != 0x00001FFF) {
+		iounmap((void *)priv0->vplxdma);
 		return (0);
+	}
 
 	return (1);
 }
@@ -1020,6 +1022,8 @@ dgrs_download(struct net_device *dev0)
 		if (!is)
 		{
 			printk("%s: Illegal IRQ %d\n", dev0->name, dev0->irq);
+			iounmap(priv0->vmem);
+			priv0->vmem = NULL;
 			return -ENXIO;
 		}
 		OUTB(dev0->base_addr + ES4H_AS_31_24,
@@ -1101,6 +1105,8 @@ dgrs_download(struct net_device *dev0)
 	if (priv0->bcomm->bc_status < BC_RUN)
 	{
 		printk("%s: board not operating\n", dev0->name);
+		iounmap(priv0->vmem);
+		priv0->vmem = NULL;
 		return -ENXIO;
 	}
 
--- diff/drivers/net/dummy.c	2004-02-18 08:54:10.000000000 +0000
+++ source/drivers/net/dummy.c	2004-04-21 10:45:34.394474744 +0100
@@ -32,6 +32,7 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/netdevice.h>
+#include <linux/etherdevice.h>
 #include <linux/init.h>
 #include <linux/moduleparam.h>
 
@@ -40,6 +41,17 @@ static int numdummies = 1;
 static int dummy_xmit(struct sk_buff *skb, struct net_device *dev);
 static struct net_device_stats *dummy_get_stats(struct net_device *dev);
 
+static int dummy_set_address(struct net_device *dev, void *p)
+{
+	struct sockaddr *sa = p;
+
+	if (!is_valid_ether_addr(sa->sa_data)) 
+		return -EADDRNOTAVAIL;
+		
+	memcpy(dev->dev_addr, sa->sa_data, ETH_ALEN);
+	return 0;
+}
+
 /* fake multicast ability */
 static void set_multicast_list(struct net_device *dev)
 {
@@ -58,6 +70,7 @@ static void __init dummy_setup(struct ne
 	dev->get_stats = dummy_get_stats;
 	dev->hard_start_xmit = dummy_xmit;
 	dev->set_multicast_list = set_multicast_list;
+	dev->set_mac_address = dummy_set_address;
 #ifdef CONFIG_NET_FASTROUTE
 	dev->accept_fastpath = dummy_accept_fastpath;
 #endif
@@ -68,6 +81,7 @@ static void __init dummy_setup(struct ne
 	dev->flags |= IFF_NOARP;
 	dev->flags &= ~IFF_MULTICAST;
 	SET_MODULE_OWNER(dev);
+	random_ether_addr(dev->dev_addr);
 }
 
 static int dummy_xmit(struct sk_buff *skb, struct net_device *dev)
@@ -90,6 +104,7 @@ static struct net_device **dummies;
 
 /* Number of dummy devices to be set up by this module. */
 module_param(numdummies, int, 0);
+MODULE_PARM_DESC(numdimmies, "Number of dummy psuedo devices");
 
 static int __init dummy_init_one(int index)
 {
--- diff/drivers/net/e1000/e1000.h	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/net/e1000/e1000.h	2004-04-21 10:45:34.395474592 +0100
@@ -52,6 +52,7 @@
 #include <linux/interrupt.h>
 #include <linux/string.h>
 #include <linux/pagemap.h>
+#include <linux/dma-mapping.h>
 #include <asm/bitops.h>
 #include <asm/io.h>
 #include <asm/irq.h>
@@ -74,8 +75,6 @@
 #define BAR_0		0
 #define BAR_1		1
 #define BAR_5		5
-#define PCI_DMA_64BIT	0xffffffffffffffffULL
-#define PCI_DMA_32BIT	0x00000000ffffffffULL
 
 
 struct e1000_adapter;
--- diff/drivers/net/e1000/e1000_ethtool.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/e1000/e1000_ethtool.c	2004-04-21 10:45:34.396474440 +0100
@@ -353,6 +353,7 @@ e1000_ethtool_geeprom(struct e1000_adapt
 	struct e1000_hw *hw = &adapter->hw;
 	int first_word, last_word;
 	int ret_val = 0;
+	uint16_t i;
 
 	if(eeprom->len == 0) {
 		ret_val = -EINVAL;
@@ -377,12 +378,16 @@ e1000_ethtool_geeprom(struct e1000_adapt
 					    last_word - first_word + 1,
 					    eeprom_buff);
 	else {
-		uint16_t i;
 		for (i = 0; i < last_word - first_word + 1; i++)
 			if((ret_val = e1000_read_eeprom(hw, first_word + i, 1,
 							&eeprom_buff[i])))
 				break;
 	}
+
+	/* Device's eeprom is always little-endian, word addressable */
+	for (i = 0; i < last_word - first_word + 1; i++)
+		le16_to_cpus(&eeprom_buff[i]);
+
 geeprom_error:
 	return ret_val;
 }
@@ -395,6 +400,7 @@ e1000_ethtool_seeprom(struct e1000_adapt
 	uint16_t *eeprom_buff;
 	void *ptr;
 	int max_len, first_word, last_word, ret_val = 0;
+	uint16_t i;
 
 	if(eeprom->len == 0)
 		return -EOPNOTSUPP;
@@ -428,11 +434,19 @@ e1000_ethtool_seeprom(struct e1000_adapt
 		ret_val = e1000_read_eeprom(hw, last_word, 1,
 		                  &eeprom_buff[last_word - first_word]);
 	}
+
+	/* Device's eeprom is always little-endian, word addressable */
+	for (i = 0; i < last_word - first_word + 1; i++)
+		le16_to_cpus(&eeprom_buff[i]);
+
 	if((ret_val != 0) || copy_from_user(ptr, user_data, eeprom->len)) {
 		ret_val = -EFAULT;
 		goto seeprom_error;
 	}
 
+	for (i = 0; i < last_word - first_word + 1; i++)
+		eeprom_buff[i] = cpu_to_le16(eeprom_buff[i]);
+
 	ret_val = e1000_write_eeprom(hw, first_word,
 				     last_word - first_word + 1, eeprom_buff);
 
@@ -474,12 +488,14 @@ e1000_ethtool_sring(struct e1000_adapter
 	e1000_mac_type mac_type = adapter->hw.mac_type;
 	struct e1000_desc_ring *txdr = &adapter->tx_ring;
 	struct e1000_desc_ring *rxdr = &adapter->rx_ring;
+	struct e1000_desc_ring tx_old, tx_new;
+	struct e1000_desc_ring rx_old, rx_new;
 
-	if(netif_running(adapter->netdev)) {
+	tx_old = adapter->tx_ring;
+	rx_old = adapter->rx_ring;
+	
+	if(netif_running(adapter->netdev))
 		e1000_down(adapter);
-		e1000_free_rx_resources(adapter);
-		e1000_free_tx_resources(adapter);
-	}
 
 	rxdr->count = max(ring->rx_pending,(uint32_t)E1000_MIN_RXD);
 	rxdr->count = min(rxdr->count,(uint32_t)(mac_type < e1000_82544 ?
@@ -492,21 +508,33 @@ e1000_ethtool_sring(struct e1000_adapter
 	E1000_ROUNDUP(txdr->count, REQ_TX_DESCRIPTOR_MULTIPLE); 
 
 	if(netif_running(adapter->netdev)) {
+		/* try to get new resources before deleting old */
 		if((err = e1000_setup_rx_resources(adapter)))
 			goto err_setup_rx;
 		if((err = e1000_setup_tx_resources(adapter)))
 			goto err_setup_tx;
+
+		/* save the new, restore the old in order to free it,
+		 * then restore the new back again */	
+	
+		rx_new = adapter->rx_ring;
+		tx_new = adapter->tx_ring;
+		adapter->rx_ring = rx_old;
+		adapter->tx_ring = tx_old;
+		e1000_free_rx_resources(adapter);
+		e1000_free_tx_resources(adapter);
+		adapter->rx_ring = rx_new;
+		adapter->tx_ring = tx_new;
 		if((err = e1000_up(adapter)))
-			goto err_up;
+			return err;
 	}
-
 	return 0;
-err_up:
-	e1000_free_tx_resources(adapter);
 err_setup_tx:
 	e1000_free_rx_resources(adapter);
 err_setup_rx:
-	e1000_reset(adapter);
+	adapter->rx_ring = rx_old;
+	adapter->tx_ring = tx_old;
+	e1000_up(adapter);
 	return err;
 }
 
@@ -1486,6 +1514,9 @@ e1000_ethtool_ioctl(struct net_device *n
 
 		if(copy_from_user(&regs, addr, sizeof(regs)))
 			return -EFAULT;
+		memset(regs_buff, 0, sizeof(regs_buff));
+		if (regs.len > E1000_REGS_LEN)
+			regs.len = E1000_REGS_LEN;
 		e1000_ethtool_gregs(adapter, &regs, regs_buff);
 		if(copy_to_user(addr, &regs, sizeof(regs)))
 			return -EFAULT;
--- diff/drivers/net/e1000/e1000_hw.c	2004-02-18 08:54:10.000000000 +0000
+++ source/drivers/net/e1000/e1000_hw.c	2004-04-21 10:45:34.400473832 +0100
@@ -65,6 +65,7 @@ static void e1000_release_eeprom(struct 
 static void e1000_standby_eeprom(struct e1000_hw *hw);
 static int32_t e1000_id_led_init(struct e1000_hw * hw);
 static int32_t e1000_set_vco_speed(struct e1000_hw *hw);
+static int32_t e1000_set_phy_mode(struct e1000_hw *hw);
 
 /* IGP cable length table */
 static const
@@ -473,7 +474,8 @@ e1000_init_hw(struct e1000_hw *hw)
     DEBUGFUNC("e1000_init_hw");
 
     /* Initialize Identification LED */
-    if((ret_val = e1000_id_led_init(hw))) {
+    ret_val = e1000_id_led_init(hw);
+    if(ret_val) {
         DEBUGOUT("Error Initializing Identification LED\n");
         return ret_val;
     }
@@ -594,16 +596,16 @@ e1000_adjust_serdes_amplitude(struct e10
         return E1000_SUCCESS;
     }
 
-    if ((ret_val = e1000_read_eeprom(hw, EEPROM_SERDES_AMPLITUDE, 1,
-                                     &eeprom_data))) {
+    ret_val = e1000_read_eeprom(hw, EEPROM_SERDES_AMPLITUDE, 1, &eeprom_data);
+    if (ret_val) {
         return ret_val;
     }
 
     if(eeprom_data != EEPROM_RESERVED_WORD) {
         /* Adjust SERDES output amplitude only. */
         eeprom_data &= EEPROM_SERDES_AMPLITUDE_MASK; 
-        if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_EXT_CTRL,
-                                          eeprom_data)))
+        ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_EXT_CTRL, eeprom_data);
+        if(ret_val)
             return ret_val;
     }
 
@@ -752,14 +754,16 @@ e1000_setup_fiber_serdes_link(struct e10
     if(hw->media_type == e1000_media_type_fiber)
         signal = (hw->mac_type > e1000_82544) ? E1000_CTRL_SWDPIN1 : 0;
 
-    if((ret_val = e1000_adjust_serdes_amplitude(hw)))
+    ret_val = e1000_adjust_serdes_amplitude(hw);
+    if(ret_val)
         return ret_val;
 
     /* Take the link out of reset */
     ctrl &= ~(E1000_CTRL_LRST);
 
     /* Adjust VCO speed to improve BER performance */
-    if((ret_val = e1000_set_vco_speed(hw)))
+    ret_val = e1000_set_vco_speed(hw);
+    if(ret_val)
         return ret_val;
 
     e1000_config_collision_dist(hw);
@@ -846,7 +850,8 @@ e1000_setup_fiber_serdes_link(struct e10
              * we detect a signal. This will allow us to communicate with
              * non-autonegotiating link partners.
              */
-            if((ret_val = e1000_check_for_link(hw))) {
+            ret_val = e1000_check_for_link(hw);
+            if(ret_val) {
                 DEBUGOUT("Error while checking for link\n");
                 return ret_val;
             }
@@ -893,12 +898,18 @@ e1000_setup_copper_link(struct e1000_hw 
     }
 
     /* Make sure we have a valid PHY */
-    if((ret_val = e1000_detect_gig_phy(hw))) {
+    ret_val = e1000_detect_gig_phy(hw);
+    if(ret_val) {
         DEBUGOUT("Error, did not detect valid phy.\n");
         return ret_val;
     }
     DEBUGOUT1("Phy ID = %x \n", hw->phy_id);
 
+    /* Set PHY to class A mode (if necessary) */
+    ret_val = e1000_set_phy_mode(hw);
+    if(ret_val)
+        return ret_val;
+
     if(hw->mac_type <= e1000_82543 ||
        hw->mac_type == e1000_82541 || hw->mac_type == e1000_82547 ||
        hw->mac_type == e1000_82541_rev_2 || hw->mac_type == e1000_82547_rev_2)
@@ -907,7 +918,8 @@ e1000_setup_copper_link(struct e1000_hw 
     if(!hw->phy_reset_disable) {
         if (hw->phy_type == e1000_phy_igp) {
 
-            if((ret_val = e1000_phy_reset(hw))) {
+            ret_val = e1000_phy_reset(hw);
+            if(ret_val) {
                 DEBUGOUT("Error Resetting the PHY\n");
                 return ret_val;
             }
@@ -922,14 +934,16 @@ e1000_setup_copper_link(struct e1000_hw 
             E1000_WRITE_REG(hw, LEDCTL, led_ctrl);
 
             /* disable lplu d3 during driver init */
-            if((ret_val = e1000_set_d3_lplu_state(hw, FALSE))) {
+            ret_val = e1000_set_d3_lplu_state(hw, FALSE);
+            if(ret_val) {
                 DEBUGOUT("Error Disabling LPLU D3\n");
                 return ret_val;
             }
 
             /* Configure mdi-mdix settings */
-            if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL,
-                                             &phy_data)))
+            ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL,
+                                         &phy_data);
+            if(ret_val)
                 return ret_val;
 
             if((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) {
@@ -956,8 +970,9 @@ e1000_setup_copper_link(struct e1000_hw 
                     break;
                 }
             }
-            if((ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL,
-                                              phy_data)))
+            ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL,
+                                          phy_data);
+            if(ret_val)
                 return ret_val;
 
             /* set auto-master slave resolution settings */
@@ -975,27 +990,28 @@ e1000_setup_copper_link(struct e1000_hw 
                  * resolution as hardware default. */
                 if(hw->autoneg_advertised == ADVERTISE_1000_FULL) {
                     /* Disable SmartSpeed */
-                    if((ret_val = e1000_read_phy_reg(hw,
-                                                    IGP01E1000_PHY_PORT_CONFIG,
-                                                    &phy_data)))
+                    ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
+                                                 &phy_data);
+                    if(ret_val)
                         return ret_val;
                     phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;
-                    if((ret_val = e1000_write_phy_reg(hw,
-                                                     IGP01E1000_PHY_PORT_CONFIG,
-                                                     phy_data)))
+                    ret_val = e1000_write_phy_reg(hw,
+                                                  IGP01E1000_PHY_PORT_CONFIG,
+                                                  phy_data);
+                    if(ret_val)
                         return ret_val;
                     /* Set auto Master/Slave resolution process */
-                    if((ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL,
-                                                     &phy_data)))
+                    ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_data);
+                    if(ret_val)
                         return ret_val;
                     phy_data &= ~CR_1000T_MS_ENABLE;
-                    if((ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL,
-                                                      phy_data)))
+                    ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_data);
+                    if(ret_val)
                         return ret_val;
                 }
 
-                if((ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL,
-                                                 &phy_data)))
+                ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_data);
+                if(ret_val)
                     return ret_val;
 
                 /* load defaults for future use */
@@ -1018,14 +1034,15 @@ e1000_setup_copper_link(struct e1000_hw 
                 default:
                     break;
                 }
-                if((ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL,
-                                                  phy_data)))
+                ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_data);
+                if(ret_val)
                     return ret_val;
             }
         } else {
             /* Enable CRS on TX. This must be set for half-duplex operation. */
-            if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL,
-                                             &phy_data)))
+            ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL,
+                                         &phy_data);
+            if(ret_val)
                 return ret_val;
 
             phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX;
@@ -1064,15 +1081,17 @@ e1000_setup_copper_link(struct e1000_hw 
             phy_data &= ~M88E1000_PSCR_POLARITY_REVERSAL;
             if(hw->disable_polarity_correction == 1)
                 phy_data |= M88E1000_PSCR_POLARITY_REVERSAL;
-            if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL,
-                                              phy_data)))
+            ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL,
+                                          phy_data);
+            if(ret_val)
                 return ret_val;
 
             /* Force TX_CLK in the Extended PHY Specific Control Register
              * to 25MHz clock.
              */
-            if((ret_val = e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL,
-                                             &phy_data)))
+            ret_val = e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL,
+                                         &phy_data);
+            if(ret_val)
                 return ret_val;
 
             phy_data |= M88E1000_EPSCR_TX_CLK_25;
@@ -1083,14 +1102,15 @@ e1000_setup_copper_link(struct e1000_hw 
                               M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK);
                 phy_data |= (M88E1000_EPSCR_MASTER_DOWNSHIFT_1X |
                              M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X);
-                if((ret_val = e1000_write_phy_reg(hw,
-                                                  M88E1000_EXT_PHY_SPEC_CTRL,
-                                                  phy_data)))
+                ret_val = e1000_write_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL,
+                                              phy_data);
+                if(ret_val)
                     return ret_val;
             }
 
             /* SW Reset the PHY so all changes take effect */
-            if((ret_val = e1000_phy_reset(hw))) {
+            ret_val = e1000_phy_reset(hw);
+            if(ret_val) {
                 DEBUGOUT("Error Resetting the PHY\n");
                 return ret_val;
             }
@@ -1124,7 +1144,8 @@ e1000_setup_copper_link(struct e1000_hw 
                 hw->autoneg_advertised = AUTONEG_ADVERTISE_SPEED_DEFAULT;
 
             DEBUGOUT("Reconfiguring auto-neg advertisement params\n");
-            if((ret_val = e1000_phy_setup_autoneg(hw))) {
+            ret_val = e1000_phy_setup_autoneg(hw);
+            if(ret_val) {
                 DEBUGOUT("Error Setting up Auto-Negotiation\n");
                 return ret_val;
             }
@@ -1133,18 +1154,21 @@ e1000_setup_copper_link(struct e1000_hw 
             /* Restart auto-negotiation by setting the Auto Neg Enable bit and
              * the Auto Neg Restart bit in the PHY control register.
              */
-            if((ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data)))
+            ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data);
+            if(ret_val)
                 return ret_val;
 
             phy_data |= (MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG);
-            if((ret_val = e1000_write_phy_reg(hw, PHY_CTRL, phy_data)))
+            ret_val = e1000_write_phy_reg(hw, PHY_CTRL, phy_data);
+            if(ret_val)
                 return ret_val;
 
             /* Does the user want to wait for Auto-Neg to complete here, or
              * check at a later time (for example, callback routine).
              */
             if(hw->wait_autoneg_complete) {
-                if((ret_val = e1000_wait_autoneg(hw))) {
+                ret_val = e1000_wait_autoneg(hw);
+                if(ret_val) {
                     DEBUGOUT("Error while waiting for autoneg to complete\n");
                     return ret_val;
                 }
@@ -1152,7 +1176,8 @@ e1000_setup_copper_link(struct e1000_hw 
             hw->get_link_status = TRUE;
         } else {
             DEBUGOUT("Forcing speed and duplex\n");
-            if((ret_val = e1000_phy_force_speed_duplex(hw))) {
+            ret_val = e1000_phy_force_speed_duplex(hw);
+            if(ret_val) {
                 DEBUGOUT("Error Forcing Speed and Duplex\n");
                 return ret_val;
             }
@@ -1163,9 +1188,11 @@ e1000_setup_copper_link(struct e1000_hw 
      * valid.
      */
     for(i = 0; i < 10; i++) {
-        if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
+        if(ret_val)
             return ret_val;
-        if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
+        if(ret_val)
             return ret_val;
 
         if(phy_data & MII_SR_LINK_STATUS) {
@@ -1180,19 +1207,22 @@ e1000_setup_copper_link(struct e1000_hw 
             if(hw->mac_type >= e1000_82544) {
                 e1000_config_collision_dist(hw);
             } else {
-                if((ret_val = e1000_config_mac_to_phy(hw))) {
+                ret_val = e1000_config_mac_to_phy(hw);
+                if(ret_val) {
                     DEBUGOUT("Error configuring MAC to PHY settings\n");
                     return ret_val;
                 }
             }
-            if((ret_val = e1000_config_fc_after_link_up(hw))) {
+            ret_val = e1000_config_fc_after_link_up(hw);
+            if(ret_val) {
                 DEBUGOUT("Error Configuring Flow Control\n");
                 return ret_val;
             }
             DEBUGOUT("Valid link established!!!\n");
 
             if(hw->phy_type == e1000_phy_igp) {
-                if((ret_val = e1000_config_dsp_after_link_change(hw, TRUE))) {
+                ret_val = e1000_config_dsp_after_link_change(hw, TRUE);
+                if(ret_val) {
                     DEBUGOUT("Error Configuring DSP after link up\n");
                     return ret_val;
                 }
@@ -1222,12 +1252,13 @@ e1000_phy_setup_autoneg(struct e1000_hw 
     DEBUGFUNC("e1000_phy_setup_autoneg");
 
     /* Read the MII Auto-Neg Advertisement Register (Address 4). */
-    if((ret_val = e1000_read_phy_reg(hw, PHY_AUTONEG_ADV,
-                                     &mii_autoneg_adv_reg)))
+    ret_val = e1000_read_phy_reg(hw, PHY_AUTONEG_ADV, &mii_autoneg_adv_reg);
+    if(ret_val)
         return ret_val;
 
     /* Read the MII 1000Base-T Control Register (Address 9). */
-    if((ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &mii_1000t_ctrl_reg)))
+    ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &mii_1000t_ctrl_reg);
+    if(ret_val)
         return ret_val;
 
     /* Need to parse both autoneg_advertised and fc and set up
@@ -1334,13 +1365,14 @@ e1000_phy_setup_autoneg(struct e1000_hw 
         return -E1000_ERR_CONFIG;
     }
 
-    if((ret_val = e1000_write_phy_reg(hw, PHY_AUTONEG_ADV,
-                                      mii_autoneg_adv_reg)))
+    ret_val = e1000_write_phy_reg(hw, PHY_AUTONEG_ADV, mii_autoneg_adv_reg);
+    if(ret_val)
         return ret_val;
 
     DEBUGOUT1("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg);
 
-    if((ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, mii_1000t_ctrl_reg)))
+    ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, mii_1000t_ctrl_reg);
+    if(ret_val)
         return ret_val;
 
     return E1000_SUCCESS;
@@ -1379,7 +1411,8 @@ e1000_phy_force_speed_duplex(struct e100
     ctrl &= ~E1000_CTRL_ASDE;
 
     /* Read the MII Control Register. */
-    if((ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &mii_ctrl_reg)))
+    ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &mii_ctrl_reg);
+    if(ret_val)
         return ret_val;
 
     /* We need to disable autoneg in order to force link and duplex. */
@@ -1426,16 +1459,16 @@ e1000_phy_force_speed_duplex(struct e100
     E1000_WRITE_REG(hw, CTRL, ctrl);
 
     if (hw->phy_type == e1000_phy_m88) {
-        if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL,
-                                         &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
+        if(ret_val)
             return ret_val;
 
         /* Clear Auto-Crossover to force MDI manually. M88E1000 requires MDI
          * forced whenever speed are duplex are forced.
          */
         phy_data &= ~M88E1000_PSCR_AUTO_X_MODE;
-        if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL,
-                                          phy_data)))
+        ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data);
+        if(ret_val)
             return ret_val;
 
         DEBUGOUT1("M88E1000 PSCR: %x \n", phy_data);
@@ -1446,20 +1479,21 @@ e1000_phy_force_speed_duplex(struct e100
         /* Clear Auto-Crossover to force MDI manually.  IGP requires MDI
          * forced whenever speed or duplex are forced.
          */
-        if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL,
-                                         &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, &phy_data);
+        if(ret_val)
             return ret_val;
 
         phy_data &= ~IGP01E1000_PSCR_AUTO_MDIX;
         phy_data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX;
 
-        if((ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL,
-                                          phy_data)))
+        ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, phy_data);
+        if(ret_val)
             return ret_val;
     }
 
     /* Write back the modified PHY MII control register. */
-    if((ret_val = e1000_write_phy_reg(hw, PHY_CTRL, mii_ctrl_reg)))
+    ret_val = e1000_write_phy_reg(hw, PHY_CTRL, mii_ctrl_reg);
+    if(ret_val)
         return ret_val;
 
     udelay(1);
@@ -1481,10 +1515,12 @@ e1000_phy_force_speed_duplex(struct e100
             /* Read the MII Status Register and wait for Auto-Neg Complete bit
              * to be set.
              */
-            if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg)))
+            ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
+            if(ret_val)
                 return ret_val;
 
-            if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg)))
+            ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
+            if(ret_val)
                 return ret_val;
 
             if(mii_status_reg & MII_SR_LINK_STATUS) break;
@@ -1492,7 +1528,8 @@ e1000_phy_force_speed_duplex(struct e100
         }
         if((i == 0) && (hw->phy_type == e1000_phy_m88)) {
             /* We didn't get link.  Reset the DSP and wait again for link. */
-            if((ret_val = e1000_phy_reset_dsp(hw))) {
+            ret_val = e1000_phy_reset_dsp(hw);
+            if(ret_val) {
                 DEBUGOUT("Error Resetting PHY DSP\n");
                 return ret_val;
             }
@@ -1504,10 +1541,12 @@ e1000_phy_force_speed_duplex(struct e100
             /* Read the MII Status Register and wait for Auto-Neg Complete bit
              * to be set.
              */
-            if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg)))
+            ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
+            if(ret_val)
                 return ret_val;
 
-            if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg)))
+            ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
+            if(ret_val)
                 return ret_val;
         }
     }
@@ -1517,46 +1556,26 @@ e1000_phy_force_speed_duplex(struct e100
          * Extended PHY Specific Control Register to 25MHz clock.  This value
          * defaults back to a 2.5MHz clock when the PHY is reset.
          */
-        if((ret_val = e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL,
-                                         &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data);
+        if(ret_val)
             return ret_val;
 
         phy_data |= M88E1000_EPSCR_TX_CLK_25;
-        if((ret_val = e1000_write_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL,
-                                          phy_data)))
+        ret_val = e1000_write_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, phy_data);
+        if(ret_val)
             return ret_val;
 
         /* In addition, because of the s/w reset above, we need to enable CRS on
          * TX.  This must be set for both full and half duplex operation.
          */
-        if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL,
-                                         &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
+        if(ret_val)
             return ret_val;
 
         phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX;
-        if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL,
-                                          phy_data)))
+        ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data);
+        if(ret_val)
             return ret_val;
-
-        /* Polarity reversal workaround for forced 10F/10H links. */
-        if(hw->mac_type <= e1000_82544 &&
-           (hw->forced_speed_duplex == e1000_10_full ||
-            hw->forced_speed_duplex == e1000_10_half)) {
-            if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT,
-                                              0x0019)))
-                return ret_val;
-            if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL,
-                                              0x8F0F)))
-                return ret_val;
-            /* IEEE requirement is 150ms */
-            msec_delay(200);
-            if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT,
-                                              0x0019)))
-                return ret_val;
-            if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL,
-                                              0x8F00)))
-                return ret_val;
-        }
     }
     return E1000_SUCCESS;
 }
@@ -1614,8 +1633,9 @@ e1000_config_mac_to_phy(struct e1000_hw 
      * registers depending on negotiated values.
      */
     if (hw->phy_type == e1000_phy_igp) {
-        if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS,
-                                         &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS,
+                                     &phy_data);
+        if(ret_val)
             return ret_val;
 
         if(phy_data & IGP01E1000_PSSR_FULL_DUPLEX) ctrl |= E1000_CTRL_FD;
@@ -1633,8 +1653,9 @@ e1000_config_mac_to_phy(struct e1000_hw 
                 IGP01E1000_PSSR_SPEED_100MBPS)
             ctrl |= E1000_CTRL_SPD_100;
     } else {
-        if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,
-                                         &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,
+                                     &phy_data);
+        if(ret_val)
             return ret_val;
 
         if(phy_data & M88E1000_PSSR_DPLX) ctrl |= E1000_CTRL_FD;
@@ -1752,7 +1773,8 @@ e1000_config_fc_after_link_up(struct e10
     if(((hw->media_type == e1000_media_type_fiber) && (hw->autoneg_failed)) ||
        ((hw->media_type == e1000_media_type_internal_serdes) && (hw->autoneg_failed)) ||
        ((hw->media_type == e1000_media_type_copper) && (!hw->autoneg))) {
-        if((ret_val = e1000_force_mac_fc(hw))) {
+        ret_val = e1000_force_mac_fc(hw);
+        if(ret_val) {
             DEBUGOUT("Error forcing flow control settings\n");
             return ret_val;
         }
@@ -1768,9 +1790,11 @@ e1000_config_fc_after_link_up(struct e10
          * has completed.  We read this twice because this reg has
          * some "sticky" (latched) bits.
          */
-        if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg)))
+        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
+        if(ret_val)
             return ret_val;
-        if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg)))
+        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
+        if(ret_val)
             return ret_val;
 
         if(mii_status_reg & MII_SR_AUTONEG_COMPLETE) {
@@ -1780,11 +1804,13 @@ e1000_config_fc_after_link_up(struct e10
              * Register (Address 5) to determine how flow control was
              * negotiated.
              */
-            if((ret_val = e1000_read_phy_reg(hw, PHY_AUTONEG_ADV,
-                                             &mii_nway_adv_reg)))
+            ret_val = e1000_read_phy_reg(hw, PHY_AUTONEG_ADV,
+                                         &mii_nway_adv_reg);
+            if(ret_val)
                 return ret_val;
-            if((ret_val = e1000_read_phy_reg(hw, PHY_LP_ABILITY,
-                                             &mii_nway_lp_ability_reg)))
+            ret_val = e1000_read_phy_reg(hw, PHY_LP_ABILITY,
+                                         &mii_nway_lp_ability_reg);
+            if(ret_val)
                 return ret_val;
 
             /* Two bits in the Auto Negotiation Advertisement Register
@@ -1901,7 +1927,8 @@ e1000_config_fc_after_link_up(struct e10
              * negotiated to HALF DUPLEX, flow control should not be
              * enabled per IEEE 802.3 spec.
              */
-            if((ret_val = e1000_get_speed_and_duplex(hw, &speed, &duplex))) {
+            ret_val = e1000_get_speed_and_duplex(hw, &speed, &duplex);
+            if(ret_val) {
                 DEBUGOUT("Error getting link speed and duplex\n");
                 return ret_val;
             }
@@ -1912,7 +1939,8 @@ e1000_config_fc_after_link_up(struct e10
             /* Now we call a subroutine to actually force the MAC
              * controller to use the correct flow control settings.
              */
-            if((ret_val = e1000_force_mac_fc(hw))) {
+            ret_val = e1000_force_mac_fc(hw);
+            if(ret_val) {
                 DEBUGOUT("Error forcing flow control settings\n");
                 return ret_val;
             }
@@ -1966,9 +1994,11 @@ e1000_check_for_link(struct e1000_hw *hw
          * of the PHY.
          * Read the register twice since the link bit is sticky.
          */
-        if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
+        if(ret_val)
             return ret_val;
-        if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
+        if(ret_val)
             return ret_val;
 
         if(phy_data & MII_SR_LINK_STATUS) {
@@ -2002,7 +2032,8 @@ e1000_check_for_link(struct e1000_hw *hw
         if(hw->mac_type >= e1000_82544)
             e1000_config_collision_dist(hw);
         else {
-            if((ret_val = e1000_config_mac_to_phy(hw))) {
+            ret_val = e1000_config_mac_to_phy(hw);
+            if(ret_val) {
                 DEBUGOUT("Error configuring MAC to PHY settings\n");
                 return ret_val;
             }
@@ -2012,7 +2043,8 @@ e1000_check_for_link(struct e1000_hw *hw
          * need to restore the desired flow control settings because we may
          * have had to re-autoneg with a different link partner.
          */
-        if((ret_val = e1000_config_fc_after_link_up(hw))) {
+        ret_val = e1000_config_fc_after_link_up(hw);
+        if(ret_val) {
             DEBUGOUT("Error configuring flow control\n");
             return ret_val;
         }
@@ -2080,7 +2112,8 @@ e1000_check_for_link(struct e1000_hw *hw
         E1000_WRITE_REG(hw, CTRL, ctrl);
 
         /* Configure Flow Control after forcing link up. */
-        if((ret_val = e1000_config_fc_after_link_up(hw))) {
+        ret_val = e1000_config_fc_after_link_up(hw);
+        if(ret_val) {
             DEBUGOUT("Error configuring flow control\n");
             return ret_val;
         }
@@ -2173,13 +2206,15 @@ e1000_get_speed_and_duplex(struct e1000_
      * match the duplex in the link partner's capabilities.
      */
     if(hw->phy_type == e1000_phy_igp && hw->speed_downgraded) {
-        if((ret_val = e1000_read_phy_reg(hw, PHY_AUTONEG_EXP, &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, PHY_AUTONEG_EXP, &phy_data);
+        if(ret_val)
             return ret_val;
 
         if(!(phy_data & NWAY_ER_LP_NWAY_CAPS))
             *duplex = HALF_DUPLEX;
         else {
-            if((ret_val == e1000_read_phy_reg(hw, PHY_LP_ABILITY, &phy_data)))
+            ret_val = e1000_read_phy_reg(hw, PHY_LP_ABILITY, &phy_data);
+            if(ret_val)
                 return ret_val;
             if((*speed == SPEED_100 && !(phy_data & NWAY_LPAR_100TX_FD_CAPS)) ||
                (*speed == SPEED_10 && !(phy_data & NWAY_LPAR_10T_FD_CAPS)))
@@ -2210,9 +2245,11 @@ e1000_wait_autoneg(struct e1000_hw *hw)
         /* Read the MII Status Register and wait for Auto-Neg
          * Complete bit to be set.
          */
-        if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
+        if(ret_val)
             return ret_val;
-        if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
+        if(ret_val)
             return ret_val;
         if(phy_data & MII_SR_AUTONEG_COMPLETE) {
             return E1000_SUCCESS;
@@ -2377,8 +2414,9 @@ e1000_read_phy_reg(struct e1000_hw *hw,
 
     if(hw->phy_type == e1000_phy_igp &&
        (reg_addr > MAX_PHY_MULTI_PAGE_REG)) {
-        if((ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT,
-                                             (uint16_t)reg_addr)))
+        ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT,
+                                         (uint16_t)reg_addr);
+        if(ret_val)
             return ret_val;
     }
 
@@ -2480,8 +2518,9 @@ e1000_write_phy_reg(struct e1000_hw *hw,
 
     if(hw->phy_type == e1000_phy_igp &&
        (reg_addr > MAX_PHY_MULTI_PAGE_REG)) {
-        if((ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT,
-                                             (uint16_t)reg_addr)))
+        ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT,
+                                         (uint16_t)reg_addr);
+        if(ret_val)
             return ret_val;
     }
 
@@ -2620,11 +2659,13 @@ e1000_phy_reset(struct e1000_hw *hw)
     DEBUGFUNC("e1000_phy_reset");
 
     if(hw->mac_type != e1000_82541_rev_2) {
-        if((ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data);
+        if(ret_val)
             return ret_val;
 
         phy_data |= MII_CR_RESET;
-        if((ret_val = e1000_write_phy_reg(hw, PHY_CTRL, phy_data)))
+        ret_val = e1000_write_phy_reg(hw, PHY_CTRL, phy_data);
+        if(ret_val)
             return ret_val;
 
         udelay(1);
@@ -2651,12 +2692,14 @@ e1000_detect_gig_phy(struct e1000_hw *hw
     DEBUGFUNC("e1000_detect_gig_phy");
 
     /* Read the PHY ID Registers to identify which PHY is onboard. */
-    if((ret_val = e1000_read_phy_reg(hw, PHY_ID1, &phy_id_high)))
+    ret_val = e1000_read_phy_reg(hw, PHY_ID1, &phy_id_high);
+    if(ret_val)
         return ret_val;
 
     hw->phy_id = (uint32_t) (phy_id_high << 16);
     udelay(20);
-    if((ret_val = e1000_read_phy_reg(hw, PHY_ID2, &phy_id_low)))
+    ret_val = e1000_read_phy_reg(hw, PHY_ID2, &phy_id_low);
+    if(ret_val)
         return ret_val;
 
     hw->phy_id |= (uint32_t) (phy_id_low & PHY_REVISION_MASK);
@@ -2708,9 +2751,12 @@ e1000_phy_reset_dsp(struct e1000_hw *hw)
     DEBUGFUNC("e1000_phy_reset_dsp");
 
     do {
-        if((ret_val = e1000_write_phy_reg(hw, 29, 0x001d))) break;
-        if((ret_val = e1000_write_phy_reg(hw, 30, 0x00c1))) break;
-        if((ret_val = e1000_write_phy_reg(hw, 30, 0x0000))) break;
+        ret_val = e1000_write_phy_reg(hw, 29, 0x001d);
+        if(ret_val) break;
+        ret_val = e1000_write_phy_reg(hw, 30, 0x00c1);
+        if(ret_val) break;
+        ret_val = e1000_write_phy_reg(hw, 30, 0x0000);
+        if(ret_val) break;
         ret_val = E1000_SUCCESS;
     } while(0);
 
@@ -2743,13 +2789,14 @@ e1000_phy_igp_get_info(struct e1000_hw *
     phy_info->polarity_correction = e1000_polarity_reversal_enabled;
 
     /* Check polarity status */
-    if((ret_val = e1000_check_polarity(hw, &polarity)))
+    ret_val = e1000_check_polarity(hw, &polarity);
+    if(ret_val)
         return ret_val;
 
     phy_info->cable_polarity = polarity;
 
-    if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS,
-                                     &phy_data)))
+    ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS, &phy_data);
+    if(ret_val)
         return ret_val;
 
     phy_info->mdix_mode = (phy_data & IGP01E1000_PSSR_MDIX) >>
@@ -2758,7 +2805,8 @@ e1000_phy_igp_get_info(struct e1000_hw *
     if((phy_data & IGP01E1000_PSSR_SPEED_MASK) ==
        IGP01E1000_PSSR_SPEED_1000MBPS) {
         /* Local/Remote Receiver Information are only valid at 1000 Mbps */
-        if((ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_data);
+        if(ret_val)
             return ret_val;
 
         phy_info->local_rx = (phy_data & SR_1000T_LOCAL_RX_STATUS) >>
@@ -2767,7 +2815,8 @@ e1000_phy_igp_get_info(struct e1000_hw *
                               SR_1000T_REMOTE_RX_STATUS_SHIFT;
 
         /* Get cable length */
-        if((ret_val = e1000_get_cable_length(hw, &min_length, &max_length)))
+        ret_val = e1000_get_cable_length(hw, &min_length, &max_length);
+        if(ret_val)
             return ret_val;
 
         /* transalte to old method */
@@ -2807,7 +2856,8 @@ e1000_phy_m88_get_info(struct e1000_hw *
      * and it stored in the hw->speed_downgraded parameter. */
     phy_info->downshift = hw->speed_downgraded;
 
-    if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data)))
+    ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
+    if(ret_val)
         return ret_val;
 
     phy_info->extended_10bt_distance =
@@ -2818,12 +2868,14 @@ e1000_phy_m88_get_info(struct e1000_hw *
         M88E1000_PSCR_POLARITY_REVERSAL_SHIFT;
 
     /* Check polarity status */
-    if((ret_val = e1000_check_polarity(hw, &polarity)))
+    ret_val = e1000_check_polarity(hw, &polarity);
+    if(ret_val)
         return ret_val;
 
     phy_info->cable_polarity = polarity;
 
-    if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data)))
+    ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data);
+    if(ret_val)
         return ret_val;
 
     phy_info->mdix_mode = (phy_data & M88E1000_PSSR_MDIX) >>
@@ -2836,7 +2888,8 @@ e1000_phy_m88_get_info(struct e1000_hw *
         phy_info->cable_length = ((phy_data & M88E1000_PSSR_CABLE_LENGTH) >>
                                   M88E1000_PSSR_CABLE_LENGTH_SHIFT);
 
-        if((ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_data);
+        if(ret_val)
             return ret_val;
 
         phy_info->local_rx = (phy_data & SR_1000T_LOCAL_RX_STATUS) >>
@@ -2878,10 +2931,12 @@ e1000_phy_get_info(struct e1000_hw *hw,
         return -E1000_ERR_CONFIG;
     }
 
-    if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data)))
+    ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
+    if(ret_val)
         return ret_val;
 
-    if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data)))
+    ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data);
+    if(ret_val)
         return ret_val;
 
     if((phy_data & MII_SR_LINK_STATUS) != MII_SR_LINK_STATUS) {
@@ -3344,6 +3399,7 @@ e1000_spi_eeprom_ready(struct e1000_hw *
         udelay(5);
         retry_count += 5;
 
+        e1000_standby_eeprom(hw);
     } while(retry_count < EEPROM_MAX_RETRY_SPI);
 
     /* ATMEL SPI write time could vary from 0-20mSec on 3.3V devices (and
@@ -4112,12 +4168,14 @@ e1000_setup_led(struct e1000_hw *hw)
     case e1000_82541_rev_2:
     case e1000_82547_rev_2:
         /* Turn off PHY Smart Power Down (if enabled) */
-        if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_GMII_FIFO,
-                                         &hw->phy_spd_default)))
-            return ret_val;
-        if((ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO,
-                                          (uint16_t)(hw->phy_spd_default &
-                                          ~IGP01E1000_GMII_SPD))))
+        ret_val = e1000_read_phy_reg(hw, IGP01E1000_GMII_FIFO,
+                                     &hw->phy_spd_default);
+        if(ret_val)
+            return ret_val;
+        ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO,
+                                      (uint16_t)(hw->phy_spd_default &
+                                      ~IGP01E1000_GMII_SPD));
+        if(ret_val)
             return ret_val;
         /* Fall Through */
     default:
@@ -4164,8 +4222,9 @@ e1000_cleanup_led(struct e1000_hw *hw)
     case e1000_82541_rev_2:
     case e1000_82547_rev_2:
         /* Turn on PHY Smart Power Down (if previously enabled) */
-        if((ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO,
-                                          hw->phy_spd_default)))
+        ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO,
+                                      hw->phy_spd_default);
+        if(ret_val)
             return ret_val;
         /* Fall Through */
     default:
@@ -4612,8 +4671,9 @@ e1000_get_cable_length(struct e1000_hw *
 
     /* Use old method for Phy older than IGP */
     if(hw->phy_type == e1000_phy_m88) {
-        if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,
-                                         &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,
+                                     &phy_data);
+        if(ret_val)
             return ret_val;
 
         /* Convert the enum value to ranged values */
@@ -4652,7 +4712,8 @@ e1000_get_cable_length(struct e1000_hw *
         /* Read the AGC registers for all channels */
         for(i = 0; i < IGP01E1000_PHY_CHANNEL_NUM; i++) {
 
-            if((ret_val = e1000_read_phy_reg(hw, agc_reg_array[i], &phy_data)))
+            ret_val = e1000_read_phy_reg(hw, agc_reg_array[i], &phy_data);
+            if(ret_val)
                 return ret_val;
 
             cur_agc = phy_data >> IGP01E1000_AGC_LENGTH_SHIFT;
@@ -4719,15 +4780,17 @@ e1000_check_polarity(struct e1000_hw *hw
 
     if(hw->phy_type == e1000_phy_m88) {
         /* return the Polarity bit in the Status register. */
-        if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,
-                                         &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,
+                                     &phy_data);
+        if(ret_val)
             return ret_val;
         *polarity = (phy_data & M88E1000_PSSR_REV_POLARITY) >>
                     M88E1000_PSSR_REV_POLARITY_SHIFT;
     } else if(hw->phy_type == e1000_phy_igp) {
         /* Read the Status register to check the speed */
-        if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS,
-                                         &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS,
+                                     &phy_data);
+        if(ret_val)
             return ret_val;
 
         /* If speed is 1000 Mbps, must read the IGP01E1000_PHY_PCS_INIT_REG to
@@ -4736,8 +4799,9 @@ e1000_check_polarity(struct e1000_hw *hw
            IGP01E1000_PSSR_SPEED_1000MBPS) {
 
             /* Read the GIG initialization PCS register (0x00B4) */
-            if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PCS_INIT_REG,
-                                             &phy_data)))
+            ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PCS_INIT_REG,
+                                         &phy_data);
+            if(ret_val)
                 return ret_val;
 
             /* Check the polarity bits */
@@ -4775,15 +4839,17 @@ e1000_check_downshift(struct e1000_hw *h
     DEBUGFUNC("e1000_check_downshift");
 
     if(hw->phy_type == e1000_phy_igp) {
-        if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_LINK_HEALTH,
-                                         &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_LINK_HEALTH,
+                                     &phy_data);
+        if(ret_val)
             return ret_val;
 
         hw->speed_downgraded = (phy_data & IGP01E1000_PLHR_SS_DOWNGRADE) ? 1 : 0;
     }
     else if(hw->phy_type == e1000_phy_m88) {
-        if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,
-                                         &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,
+                                     &phy_data);
+        if(ret_val)
             return ret_val;
 
         hw->speed_downgraded = (phy_data & M88E1000_PSSR_DOWNSHIFT) >>
@@ -4823,7 +4889,8 @@ e1000_config_dsp_after_link_change(struc
         return E1000_SUCCESS;
 
     if(link_up) {
-        if((ret_val = e1000_get_speed_and_duplex(hw, &speed, &duplex))) {
+        ret_val = e1000_get_speed_and_duplex(hw, &speed, &duplex);
+        if(ret_val) {
             DEBUGOUT("Error getting link speed and duplex\n");
             return ret_val;
         }
@@ -4836,14 +4903,16 @@ e1000_config_dsp_after_link_change(struc
                 min_length >= e1000_igp_cable_length_50) {
 
                 for(i = 0; i < IGP01E1000_PHY_CHANNEL_NUM; i++) {
-                    if((ret_val = e1000_read_phy_reg(hw, dsp_reg_array[i],
-                                                     &phy_data)))
+                    ret_val = e1000_read_phy_reg(hw, dsp_reg_array[i],
+                                                 &phy_data);
+                    if(ret_val)
                         return ret_val;
 
                     phy_data &= ~IGP01E1000_PHY_EDAC_MU_INDEX;
 
-                    if((ret_val = e1000_write_phy_reg(hw, dsp_reg_array[i],
-                                                      phy_data)))
+                    ret_val = e1000_write_phy_reg(hw, dsp_reg_array[i],
+                                                  phy_data);
+                    if(ret_val)
                         return ret_val;
                 }
                 hw->dsp_config_state = e1000_dsp_config_activated;
@@ -4856,23 +4925,26 @@ e1000_config_dsp_after_link_change(struc
                 uint32_t idle_errs = 0;
 
                 /* clear previous idle error counts */
-                if((ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS,
-                                                 &phy_data)))
+                ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS,
+                                             &phy_data);
+                if(ret_val)
                     return ret_val;
 
                 for(i = 0; i < ffe_idle_err_timeout; i++) {
                     udelay(1000);
-                    if((ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS,
-                                                     &phy_data)))
+                    ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS,
+                                                 &phy_data);
+                    if(ret_val)
                         return ret_val;
 
                     idle_errs += (phy_data & SR_1000T_IDLE_ERROR_CNT);
                     if(idle_errs > SR_1000T_PHY_EXCESSIVE_IDLE_ERR_COUNT) {
                         hw->ffe_config_state = e1000_ffe_config_active;
 
-                        if((ret_val = e1000_write_phy_reg(hw,
+                        ret_val = e1000_write_phy_reg(hw,
                                     IGP01E1000_PHY_DSP_FFE,
-                                    IGP01E1000_PHY_DSP_FFE_CM_CP)))
+                                    IGP01E1000_PHY_DSP_FFE_CM_CP);
+                        if(ret_val)
                             return ret_val;
                         break;
                     }
@@ -4884,43 +4956,87 @@ e1000_config_dsp_after_link_change(struc
         }
     } else {
         if(hw->dsp_config_state == e1000_dsp_config_activated) {
-            if((ret_val = e1000_write_phy_reg(hw, 0x0000,
-                IGP01E1000_IEEE_FORCE_GIGA)))
+            ret_val = e1000_write_phy_reg(hw, 0x0000,
+                                          IGP01E1000_IEEE_FORCE_GIGA);
+            if(ret_val)
                 return ret_val;
             for(i = 0; i < IGP01E1000_PHY_CHANNEL_NUM; i++) {
-                if((ret_val = e1000_read_phy_reg(hw, dsp_reg_array[i],
-                                                 &phy_data)))
+                ret_val = e1000_read_phy_reg(hw, dsp_reg_array[i], &phy_data);
+                if(ret_val)
                     return ret_val;
 
                 phy_data &= ~IGP01E1000_PHY_EDAC_MU_INDEX;
                 phy_data |=  IGP01E1000_PHY_EDAC_SIGN_EXT_9_BITS;
 
-                if((ret_val = e1000_write_phy_reg(hw,dsp_reg_array[i],
-                                                  phy_data)))
+                ret_val = e1000_write_phy_reg(hw,dsp_reg_array[i], phy_data);
+                if(ret_val)
                     return ret_val;
             }
 
-            if((ret_val = e1000_write_phy_reg(hw, 0x0000,
-                                              IGP01E1000_IEEE_RESTART_AUTONEG)))
+            ret_val = e1000_write_phy_reg(hw, 0x0000,
+                                          IGP01E1000_IEEE_RESTART_AUTONEG);
+            if(ret_val)
                 return ret_val;
 
             hw->dsp_config_state = e1000_dsp_config_enabled;
         }
 
         if(hw->ffe_config_state == e1000_ffe_config_active) {
-            if((ret_val = e1000_write_phy_reg(hw, 0x0000,
-                                              IGP01E1000_IEEE_FORCE_GIGA)))
+            ret_val = e1000_write_phy_reg(hw, 0x0000,
+                                          IGP01E1000_IEEE_FORCE_GIGA);
+            if(ret_val)
                 return ret_val;
-            if((ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_DSP_FFE,
-                                              IGP01E1000_PHY_DSP_FFE_DEFAULT)))
+            ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_DSP_FFE,
+                                          IGP01E1000_PHY_DSP_FFE_DEFAULT);
+            if(ret_val)
+                return ret_val;
+
+            ret_val = e1000_write_phy_reg(hw, 0x0000,
+                                          IGP01E1000_IEEE_RESTART_AUTONEG);
+            if(ret_val)
                 return ret_val;
+            hw->ffe_config_state = e1000_ffe_config_enabled;
+        }
+    }
+    return E1000_SUCCESS;
+}
 
-            if((ret_val = e1000_write_phy_reg(hw, 0x0000,
-                                              IGP01E1000_IEEE_RESTART_AUTONEG)))
+/*****************************************************************************
+ * Set PHY to class A mode
+ * Assumes the following operations will follow to enable the new class mode.
+ *  1. Do a PHY soft reset
+ *  2. Restart auto-negotiation or force link.
+ *
+ * hw - Struct containing variables accessed by shared code
+ ****************************************************************************/
+static int32_t
+e1000_set_phy_mode(struct e1000_hw *hw)
+{
+    int32_t ret_val;
+    uint16_t eeprom_data;
+
+    DEBUGFUNC("e1000_set_phy_mode");
+
+    if((hw->mac_type == e1000_82545_rev_3) &&
+       (hw->media_type == e1000_media_type_copper)) {
+        ret_val = e1000_read_eeprom(hw, EEPROM_PHY_CLASS_WORD, 1, &eeprom_data);
+        if(ret_val) {
+            return ret_val;
+        }
+
+        if((eeprom_data != EEPROM_RESERVED_WORD) &&
+           (eeprom_data & EEPROM_PHY_CLASS_A)) {
+            ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x000B);
+            if(ret_val)
+                return ret_val;
+            ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, 0x8104);
+            if(ret_val)
                 return ret_val;
-        hw->ffe_config_state = e1000_ffe_config_enabled;
+
+            hw->phy_reset_disable = FALSE;
         }
     }
+
     return E1000_SUCCESS;
 }
 
@@ -4953,25 +5069,27 @@ e1000_set_d3_lplu_state(struct e1000_hw 
     /* During driver activity LPLU should not be used or it will attain link
      * from the lowest speeds starting from 10Mbps. The capability is used for
      * Dx transitions and states */
-    if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_GMII_FIFO, &phy_data)))
+    ret_val = e1000_read_phy_reg(hw, IGP01E1000_GMII_FIFO, &phy_data);
+    if(ret_val)
         return ret_val;
 
     if(!active) {
         phy_data &= ~IGP01E1000_GMII_FLEX_SPD;
-        if((ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, phy_data)))
+        ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, phy_data);
+        if(ret_val)
             return ret_val;
 
         /* LPLU and SmartSpeed are mutually exclusive.  LPLU is used during
          * Dx states where the power conservation is most important.  During
          * driver activity we should enable SmartSpeed, so performance is
          * maintained. */
-        if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
-                                         &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, &phy_data);
+        if(ret_val)
             return ret_val;
 
         phy_data |= IGP01E1000_PSCFR_SMART_SPEED;
-        if((ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
-                                          phy_data)))
+        ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, phy_data);
+        if(ret_val)
             return ret_val;
 
     } else if((hw->autoneg_advertised == AUTONEG_ADVERTISE_SPEED_DEFAULT) ||
@@ -4979,17 +5097,18 @@ e1000_set_d3_lplu_state(struct e1000_hw 
               (hw->autoneg_advertised == AUTONEG_ADVERTISE_10_100_ALL)) {
 
         phy_data |= IGP01E1000_GMII_FLEX_SPD;
-        if((ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, phy_data)))
+        ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, phy_data);
+        if(ret_val)
             return ret_val;
 
         /* When LPLU is enabled we should disable SmartSpeed */
-        if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
-                                         &phy_data)))
+        ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, &phy_data);
+        if(ret_val)
             return ret_val;
 
         phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;
-        if((ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
-                                          phy_data)))
+        ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, phy_data);
+        if(ret_val)
             return ret_val;
 
     }
@@ -5020,34 +5139,40 @@ e1000_set_vco_speed(struct e1000_hw *hw)
 
     /* Set PHY register 30, page 5, bit 8 to 0 */
 
-    if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_PAGE_SELECT,
-                                     &default_page)))
+    ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, &default_page);
+    if(ret_val)
         return ret_val;
 
-    if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0005)))
+    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0005);
+    if(ret_val)
         return ret_val;
 
-    if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, &phy_data)))
+    ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, &phy_data);
+    if(ret_val)
         return ret_val;
 
     phy_data &= ~M88E1000_PHY_VCO_REG_BIT8;
-    if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, phy_data)))
+    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, phy_data);
+    if(ret_val)
         return ret_val;
 
     /* Set PHY register 30, page 4, bit 11 to 1 */
 
-    if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0004)))
+    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0004);
+    if(ret_val)
         return ret_val;
 
-    if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, &phy_data)))
+    ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, &phy_data);
+    if(ret_val)
         return ret_val;
 
     phy_data |= M88E1000_PHY_VCO_REG_BIT11;
-    if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, phy_data)))
+    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, phy_data);
+    if(ret_val)
         return ret_val;
 
-    if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT,
-                                      default_page)))
+    ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, default_page);
+    if(ret_val)
         return ret_val;
 
     return E1000_SUCCESS;
--- diff/drivers/net/e1000/e1000_hw.h	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/net/e1000/e1000_hw.h	2004-04-21 10:45:34.402473528 +0100
@@ -369,6 +369,9 @@ int32_t e1000_set_d3_lplu_state(struct e
 
 #define E1000_82542_2_0_REV_ID 2
 #define E1000_82542_2_1_REV_ID 3
+#define E1000_REVISION_0       0
+#define E1000_REVISION_1       1
+#define E1000_REVISION_2       2
 
 #define SPEED_10    10
 #define SPEED_100   100
@@ -763,6 +766,7 @@ struct e1000_ffvt_entry {
 #define E1000_WUPL     0x05900  /* Wakeup Packet Length - RW */
 #define E1000_WUPM     0x05A00  /* Wakeup Packet Memory - RO A */
 #define E1000_FFLT     0x05F00  /* Flexible Filter Length Table - RW Array */
+#define E1000_HOST_IF  0x08800  /* Host Interface */
 #define E1000_FFMT     0x09000  /* Flexible Filter Mask Table - RW Array */
 #define E1000_FFVT     0x09800  /* Flexible Filter Value Table - RW Array */
 
@@ -899,6 +903,7 @@ struct e1000_ffvt_entry {
 #define E1000_82542_TDFT     0x08018
 #define E1000_82542_FFMT     E1000_FFMT
 #define E1000_82542_FFVT     E1000_FFVT
+#define E1000_82542_HOST_IF  E1000_HOST_IF
 
 /* Statistics counters collected by the MAC */
 struct e1000_hw_stats {
@@ -1434,6 +1439,10 @@ struct e1000_hw {
 #define E1000_MANC_TCO_RESET     0x00010000 /* TCO Reset Occurred */
 #define E1000_MANC_RCV_TCO_EN    0x00020000 /* Receive TCO Packets Enabled */
 #define E1000_MANC_REPORT_STATUS 0x00040000 /* Status Reporting Enabled */
+#define E1000_MANC_EN_MAC_ADDR_FILTER   0x00100000 /* Enable MAC address
+                                                    * filtering */
+#define E1000_MANC_EN_MNG2HOST   0x00200000 /* Enable MNG packets to host
+                                             * memory */
 #define E1000_MANC_SMB_REQ       0x01000000 /* SMBus Request */
 #define E1000_MANC_SMB_GNT       0x02000000 /* SMBus Grant */
 #define E1000_MANC_SMB_CLK_IN    0x04000000 /* SMBus Clock In */
@@ -1480,6 +1489,7 @@ struct e1000_hw {
 #define EEPROM_COMPAT                 0x0003
 #define EEPROM_ID_LED_SETTINGS        0x0004
 #define EEPROM_SERDES_AMPLITUDE       0x0006 /* For SERDES output amplitude adjustment. */
+#define EEPROM_PHY_CLASS_WORD         0x0007
 #define EEPROM_INIT_CONTROL1_REG      0x000A
 #define EEPROM_INIT_CONTROL2_REG      0x000F
 #define EEPROM_INIT_CONTROL3_PORT_B   0x0014
@@ -1513,6 +1523,9 @@ struct e1000_hw {
 /* Mask bits for SERDES amplitude adjustment in Word 6 of the EEPROM */
 #define EEPROM_SERDES_AMPLITUDE_MASK  0x000F
 
+/* Mask bit for PHY class in Word 7 of the EEPROM */
+#define EEPROM_PHY_CLASS_A   0x8000
+
 /* Mask bits for fields in Word 0x0a of the EEPROM */
 #define EEPROM_WORD0A_ILOS   0x0010
 #define EEPROM_WORD0A_SWDPIO 0x01E0
--- diff/drivers/net/e1000/e1000_main.c	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/net/e1000/e1000_main.c	2004-04-21 10:45:34.404473224 +0100
@@ -30,7 +30,33 @@
 
 /* Change Log
  *
- * 5.2.30.1	1/29/03
+ * 5.2.39	3/12/04
+ *   o Added support to read/write eeprom data in proper order.
+ *     By default device eeprom is always little-endian, word
+ *     addressable 
+ *   o Disable TSO as the default for the driver until hangs
+ *     reported against non-IA acrhs can be root-caused.
+ *   o Back out the CSA fix for 82547 as it continues to cause
+ *     systems lock-ups with production systems.
+ *   o Fixed FC high/low water mark values to actually be in the
+ *     range of the Rx FIFO area.  It was a math error.
+ *     [Dainis Jonitis (dainis_jonitis@exigengroup.lv)]
+ *   o Handle failure to get new resources when doing ethtool
+ *     ring paramater changes.  Previously, driver would free old,
+ *     but fails to allocate new, causing problems.  Now, driver 
+ *     allocates new, and if sucessful, frees old.
+ *   o Changed collision threshold from 16 to 15 to comply with IEEE
+ *     spec.
+ *   o Toggle chip-select when checking ready status on SPI eeproms.
+ *   o Put PHY into class A mode to pass IEEE tests on some designs.
+ *     Designs with EEPROM word 0x7, bit 15 set will have their PHYs
+ *     set to class A mode, rather than the default class AB.
+ *   o Handle failures of register_netdev.  Stephen Hemminger
+ *     [shemminger@osdl.org].
+ *   o updated README & MAN pages, number of Transmit/Receive
+ *     descriptors may be denied depending on system resources.
+ *
+ * 5.2.30	1/14/03
  *   o Set VLAN filtering to IEEE 802.1Q after reset so we don't break
  *     SoL connections that use VLANs.
  *   o Allow 1000/Full setting for AutoNeg param for Fiber connections
@@ -45,30 +71,11 @@
  *   o Added ethtool RINGPARAM support.
  *
  * 5.2.22	10/15/03
- *   o Bug fix: SERDES devices might be connected to a back-plane
- *     switch that doesn't support auto-neg, so add the capability
- *     to force 1000/Full.  Also, since forcing 1000/Full, sample
- *     RxSynchronize bit to detect link state.
- *   o Bug fix: Flow control settings for hi/lo watermark didn't
- *     consider changes in the Rx FIFO size, which could occur with
- *     Jumbo Frames or with the reduced FIFO in 82547.
- *   o Better propagation of error codes. [Janice Girouard 
- *     (janiceg@us.ibm.com)].
- *   o Bug fix: hang under heavy Tx stress when running out of Tx
- *     descriptors; wasn't clearing context descriptor when backing
- *     out of send because of no-resource condition.
- *   o Bug fix: check netif_running in dev->poll so we don't have to
- *     hang in dev->close until all polls are finished.  [Robert
- *     Ollson (robert.olsson@data.slu.se)].
- *   o Revert TxDescriptor ring size back to 256 since change to 1024
- *     wasn't accepted into the kernel.
- *
- * 5.2.16	8/8/03
  */
 
 char e1000_driver_name[] = "e1000";
 char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
-char e1000_driver_version[] = "5.2.30.1-k2";
+char e1000_driver_version[] = "5.2.39-k2";
 char e1000_copyright[] = "Copyright (c) 1999-2004 Intel Corporation.";
 
 /* e1000_pci_tbl - PCI Device ID Table
@@ -383,10 +390,10 @@ e1000_probe(struct pci_dev *pdev,
 	if((err = pci_enable_device(pdev)))
 		return err;
 
-	if(!(err = pci_set_dma_mask(pdev, PCI_DMA_64BIT))) {
+	if(!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK))) {
 		pci_using_dac = 1;
 	} else {
-		if((err = pci_set_dma_mask(pdev, PCI_DMA_32BIT))) {
+		if((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) {
 			E1000_ERR("No usable DMA configuration, aborting\n");
 			return err;
 		}
@@ -1661,7 +1668,7 @@ e1000_tx_map(struct e1000_adapter *adapt
 		 * we mapped the skb, but because of all the workarounds
 		 * (above), it's too difficult to predict how many we're
 		 * going to need.*/
-		i = adapter->tx_ring.next_to_use;
+		i = tx_ring->next_to_use;
 
 		if(i == first) {
 			/* Cleanup after e1000_tx_[csum|tso] scribbling
@@ -1686,7 +1693,7 @@ e1000_tx_map(struct e1000_adapter *adapt
 			if(++i == tx_ring->count) i = 0;
 		}
 
-		adapter->tx_ring.next_to_use = first;
+		tx_ring->next_to_use = first;
 
 		return 0;
 	}
@@ -1694,7 +1701,7 @@ e1000_tx_map(struct e1000_adapter *adapt
 	i = (i == 0) ? tx_ring->count - 1 : i - 1;
 	tx_ring->buffer_info[i].skb = skb;
 	tx_ring->buffer_info[first].next_to_watch = i;
-
+	
 	return count;
 }
 
--- diff/drivers/net/e1000/e1000_param.c	2004-02-18 08:54:10.000000000 +0000
+++ source/drivers/net/e1000/e1000_param.c	2004-04-21 10:45:34.404473224 +0100
@@ -107,7 +107,7 @@ E1000_PARAM(Duplex, "Duplex setting");
 
 /* Auto-negotiation Advertisement Override
  *
- * Valid Range: 0x01-0x0F, 0x20-0x2F
+ * Valid Range: 0x01-0x0F, 0x20-0x2F (copper); 0x20 (fiber)
  *
  * The AutoNeg value is a bit mask describing which speed and duplex
  * combinations should be advertised during auto-negotiation.
@@ -117,7 +117,7 @@ E1000_PARAM(Duplex, "Duplex setting");
  * Speed (Mbps)  N/A   N/A   1000   N/A    100   100   10     10
  * Duplex                    Full          Full  Half  Full   Half
  *
- * Default Value: 0x2F
+ * Default Value: 0x2F (copper); 0x20 (fiber)
  */
 
 E1000_PARAM(AutoNeg, "Advertised auto-negotiation setting");
--- diff/drivers/net/fc/iph5526.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/fc/iph5526.c	2004-04-21 10:45:34.406472920 +0100
@@ -2910,7 +2910,7 @@ static void iph5526_timeout(struct net_d
 {
 	struct fc_info *fi = dev->priv;
 	printk(KERN_WARNING "%s: timed out on send.\n", dev->name);
-	fi->fc_stats.rx_dropped++;
+	fi->fc_stats.tx_dropped++;
 	dev->trans_start = jiffies;
 	netif_wake_queue(dev);
 }
@@ -2953,7 +2953,7 @@ static int iph5526_send_packet(struct sk
 		fi->fc_stats.tx_packets++;
 	}
 	else
-		fi->fc_stats.rx_dropped++;
+		fi->fc_stats.tx_dropped++;
 	dev->trans_start = jiffies;
 	/* We free up the IP buffers in the OCI_interrupt handler.
 	 * status == 0 implies that the frame was not transmitted. So the
--- diff/drivers/net/gt96100eth.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/gt96100eth.c	2004-04-21 10:45:34.407472768 +0100
@@ -1212,7 +1212,7 @@ gt96100_rx(struct net_device *dev, u32 s
 		    cmdstat, nextOut);
 
 		if (cmdstat & (u32)rxOwn) {
-			//err(__FUNCTION__ ": device owns descriptor!\n");
+			//err("%s: device owns descriptor!\n", __FUNCTION__);
 			// DMA is not finished updating descriptor???
 			// Leave and come back later to pick-up where
 			// we left off.
--- diff/drivers/net/hamradio/baycom_par.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/hamradio/baycom_par.c	2004-04-21 10:45:34.408472616 +0100
@@ -274,9 +274,6 @@ static void par96_interrupt(int irq, voi
 	struct net_device *dev = (struct net_device *)dev_id;
 	struct baycom_state *bc = netdev_priv(dev);
 
-	if (!dev || !bc || bc->hdrv.magic != HDLCDRV_MAGIC)
-		return;
-
 	baycom_int_freq(bc);
 	/*
 	 * check if transmitter active
--- diff/drivers/net/hydra.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/hydra.c	2004-04-21 10:45:34.408472616 +0100
@@ -123,10 +123,6 @@ static int __devinit hydra_init(struct z
 	return -EAGAIN;
     }
 
-    printk("%s: hydra at 0x%08lx, address %02x:%02x:%02x:%02x:%02x:%02x (hydra.c " HYDRA_VERSION ")\n", dev->name, z->resource.start,
-	dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
-	dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
-
     ei_status.name = name;
     ei_status.tx_start_page = start_page;
     ei_status.stop_page = stop_page;
@@ -156,6 +152,13 @@ static int __devinit hydra_init(struct z
     }
 
     zorro_set_drvdata(z, dev);
+
+    printk(KERN_INFO "%s: Hydra at 0x%08lx, address "
+	   "%02x:%02x:%02x:%02x:%02x:%02x (hydra.c " HYDRA_VERSION ")\n",
+	   dev->name, z->resource.start, dev->dev_addr[0], dev->dev_addr[1],
+	   dev->dev_addr[2], dev->dev_addr[3], dev->dev_addr[4],
+	   dev->dev_addr[5]);
+
     return 0;
 }
 
@@ -168,14 +171,14 @@ static int hydra_open(struct net_device 
 static int hydra_close(struct net_device *dev)
 {
     if (ei_debug > 1)
-	printk("%s: Shutting down ethercard.\n", dev->name);
+	printk(KERN_DEBUG "%s: Shutting down ethercard.\n", dev->name);
     ei_close(dev);
     return 0;
 }
 
 static void hydra_reset_8390(struct net_device *dev)
 {
-    printk("Hydra hw reset not there\n");
+    printk(KERN_INFO "Hydra hw reset not there\n");
 }
 
 static void hydra_get_8390_hdr(struct net_device *dev,
--- diff/drivers/net/ibmveth.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/ibmveth.c	2004-04-21 10:45:34.409472464 +0100
@@ -39,7 +39,6 @@
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/ioport.h>
-#include <linux/pci.h>
 #include <linux/dma-mapping.h>
 #include <linux/kernel.h>
 #include <linux/netdevice.h>
@@ -218,7 +217,7 @@ static void ibmveth_replenish_buffer_poo
 		ibmveth_assert(index != 0xffff);
 		ibmveth_assert(pool->skbuff[index] == NULL);
 
-		dma_addr = vio_map_single(adapter->vdev, skb->data, pool->buff_size, PCI_DMA_FROMDEVICE);
+		dma_addr = vio_map_single(adapter->vdev, skb->data, pool->buff_size, DMA_FROM_DEVICE);
 
 		pool->dma_addr[index] = dma_addr;
 		pool->skbuff[index] = skb;
@@ -236,7 +235,7 @@ static void ibmveth_replenish_buffer_poo
 		if(lpar_rc != H_Success) {
 			pool->skbuff[index] = NULL;
 			pool->consumer_index--;
-			vio_unmap_single(adapter->vdev, pool->dma_addr[index], pool->buff_size, PCI_DMA_FROMDEVICE);
+			vio_unmap_single(adapter->vdev, pool->dma_addr[index], pool->buff_size, DMA_FROM_DEVICE);
 			dev_kfree_skb_any(skb);
 			adapter->replenish_add_buff_failure++;
 			break;
@@ -300,7 +299,7 @@ static void ibmveth_free_buffer_pool(str
 				vio_unmap_single(adapter->vdev,
 						 pool->dma_addr[i],
 						 pool->buff_size,
-						 PCI_DMA_FROMDEVICE);
+						 DMA_FROM_DEVICE);
 				dev_kfree_skb_any(skb);
 				pool->skbuff[i] = NULL;
 			}
@@ -338,7 +337,7 @@ static void ibmveth_remove_buffer_from_p
 	vio_unmap_single(adapter->vdev,
 			 adapter->rx_buff_pool[pool].dma_addr[index],
 			 adapter->rx_buff_pool[pool].buff_size,
-			 PCI_DMA_FROMDEVICE);
+			 DMA_FROM_DEVICE);
 
 	free_index = adapter->rx_buff_pool[pool].producer_index++ % adapter->rx_buff_pool[pool].size;
 	adapter->rx_buff_pool[pool].free_map[free_index] = index;
@@ -405,8 +404,8 @@ static inline void ibmveth_rxq_harvest_b
 static void ibmveth_cleanup(struct ibmveth_adapter *adapter)
 {
 	if(adapter->buffer_list_addr != NULL) {
-		if(!vio_dma_mapping_error(adapter->buffer_list_dma)) {
-			vio_unmap_single(adapter->vdev, adapter->buffer_list_dma, 4096, PCI_DMA_BIDIRECTIONAL);
+		if(!dma_mapping_error(adapter->buffer_list_dma)) {
+			vio_unmap_single(adapter->vdev, adapter->buffer_list_dma, 4096, DMA_BIDIRECTIONAL);
 			adapter->buffer_list_dma = DMA_ERROR_CODE;
 		}
 		free_page((unsigned long)adapter->buffer_list_addr);
@@ -414,8 +413,8 @@ static void ibmveth_cleanup(struct ibmve
 	} 
 
 	if(adapter->filter_list_addr != NULL) {
-		if(!vio_dma_mapping_error(adapter->filter_list_dma)) {
-			vio_unmap_single(adapter->vdev, adapter->filter_list_dma, 4096, PCI_DMA_BIDIRECTIONAL);
+		if(!dma_mapping_error(adapter->filter_list_dma)) {
+			vio_unmap_single(adapter->vdev, adapter->filter_list_dma, 4096, DMA_BIDIRECTIONAL);
 			adapter->filter_list_dma = DMA_ERROR_CODE;
 		}
 		free_page((unsigned long)adapter->filter_list_addr);
@@ -423,8 +422,8 @@ static void ibmveth_cleanup(struct ibmve
 	}
 
 	if(adapter->rx_queue.queue_addr != NULL) {
-		if(!vio_dma_mapping_error(adapter->rx_queue.queue_dma)) {
-			vio_unmap_single(adapter->vdev, adapter->rx_queue.queue_dma, adapter->rx_queue.queue_len, PCI_DMA_BIDIRECTIONAL);
+		if(!dma_mapping_error(adapter->rx_queue.queue_dma)) {
+			vio_unmap_single(adapter->vdev, adapter->rx_queue.queue_dma, adapter->rx_queue.queue_len, DMA_BIDIRECTIONAL);
 			adapter->rx_queue.queue_dma = DMA_ERROR_CODE;
 		}
 		kfree(adapter->rx_queue.queue_addr);
@@ -470,13 +469,13 @@ static int ibmveth_open(struct net_devic
 		return -ENOMEM;
 	}
 
-	adapter->buffer_list_dma = vio_map_single(adapter->vdev, adapter->buffer_list_addr, 4096, PCI_DMA_BIDIRECTIONAL);
-	adapter->filter_list_dma = vio_map_single(adapter->vdev, adapter->filter_list_addr, 4096, PCI_DMA_BIDIRECTIONAL);
-	adapter->rx_queue.queue_dma = vio_map_single(adapter->vdev, adapter->rx_queue.queue_addr, adapter->rx_queue.queue_len, PCI_DMA_BIDIRECTIONAL);
-
-	if((vio_dma_mapping_error(adapter->buffer_list_dma) ) ||
-	   (vio_dma_mapping_error(adapter->filter_list_dma)) ||
-	   (vio_dma_mapping_error(adapter->rx_queue.queue_dma))) {
+	adapter->buffer_list_dma = vio_map_single(adapter->vdev, adapter->buffer_list_addr, 4096, DMA_BIDIRECTIONAL);
+	adapter->filter_list_dma = vio_map_single(adapter->vdev, adapter->filter_list_addr, 4096, DMA_BIDIRECTIONAL);
+	adapter->rx_queue.queue_dma = vio_map_single(adapter->vdev, adapter->rx_queue.queue_addr, adapter->rx_queue.queue_len, DMA_BIDIRECTIONAL);
+
+	if((dma_mapping_error(adapter->buffer_list_dma) ) ||
+	   (dma_mapping_error(adapter->filter_list_dma)) ||
+	   (dma_mapping_error(adapter->rx_queue.queue_dma))) {
 		ibmveth_error_printk("unable to map filter or buffer list pages\n");
 		ibmveth_cleanup(adapter);
 		return -ENOMEM;
@@ -642,10 +641,11 @@ static int ibmveth_start_xmit(struct sk_
 
 	/* map the initial fragment */
 	desc[0].fields.length  = nfrags ? skb->len - skb->data_len : skb->len;
-	desc[0].fields.address = vio_map_single(adapter->vdev, skb->data, desc[0].fields.length, PCI_DMA_TODEVICE);
+	desc[0].fields.address = vio_map_single(adapter->vdev, skb->data,
+					desc[0].fields.length, DMA_TO_DEVICE);
 	desc[0].fields.valid   = 1;
 
-	if(vio_dma_mapping_error(desc[0].fields.address)) {
+	if(dma_mapping_error(desc[0].fields.address)) {
 		ibmveth_error_printk("tx: unable to map initial fragment\n");
 		adapter->tx_map_failed++;
 		adapter->stats.tx_dropped++;
@@ -658,13 +658,14 @@ static int ibmveth_start_xmit(struct sk_
 	/* map fragments past the initial portion if there are any */
 	while(curfrag--) {
 		skb_frag_t *frag = &skb_shinfo(skb)->frags[curfrag];
-		desc[curfrag+1].fields.address = vio_map_single(adapter->vdev,
-								page_address(frag->page) + frag->page_offset,
-								frag->size, PCI_DMA_TODEVICE);
+		desc[curfrag+1].fields.address
+			= vio_map_single(adapter->vdev,
+				page_address(frag->page) + frag->page_offset,
+				frag->size, DMA_TO_DEVICE);
 		desc[curfrag+1].fields.length = frag->size;
 		desc[curfrag+1].fields.valid  = 1;
 
-		if(vio_dma_mapping_error(desc[curfrag+1].fields.address)) {
+		if(dma_mapping_error(desc[curfrag+1].fields.address)) {
 			ibmveth_error_printk("tx: unable to map fragment %d\n", curfrag);
 			adapter->tx_map_failed++;
 			adapter->stats.tx_dropped++;
@@ -673,7 +674,7 @@ static int ibmveth_start_xmit(struct sk_
 				vio_unmap_single(adapter->vdev,
 						 desc[curfrag+1].fields.address,
 						 desc[curfrag+1].fields.length,
-						 PCI_DMA_TODEVICE);
+						 DMA_TO_DEVICE);
 				curfrag++;
 			}
 			dev_kfree_skb(skb);
@@ -710,7 +711,7 @@ static int ibmveth_start_xmit(struct sk_
 	}
 
 	do {
-		vio_unmap_single(adapter->vdev, desc[nfrags].fields.address, desc[nfrags].fields.length, PCI_DMA_TODEVICE);
+		vio_unmap_single(adapter->vdev, desc[nfrags].fields.address, desc[nfrags].fields.length, DMA_TO_DEVICE);
 	} while(--nfrags >= 0);
 
 	dev_kfree_skb(skb);
--- diff/drivers/net/irda/ali-ircc.c	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/net/irda/ali-ircc.c	2004-04-21 10:45:34.410472312 +0100
@@ -44,7 +44,7 @@
 #include <net/irda/irda.h>
 #include <net/irda/irda_device.h>
 
-#include <net/irda/ali-ircc.h>
+#include "ali-ircc.h"
 
 #define CHIP_IO_EXTENT 8
 #define BROKEN_DONGLE_ID
--- diff/drivers/net/irda/au1k_ir.c	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/net/irda/au1k_ir.c	2004-04-21 10:45:34.412472008 +0100
@@ -52,7 +52,7 @@
 #include <net/irda/irmod.h>
 #include <net/irda/wrapper.h>
 #include <net/irda/irda_device.h>
-#include "net/irda/au1000_ircc.h"
+#include "au1000_ircc.h"
 
 static int au1k_irda_net_init(struct net_device *);
 static int au1k_irda_start(struct net_device *);
--- diff/drivers/net/irda/donauboe.c	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/net/irda/donauboe.c	2004-04-21 10:45:34.413471856 +0100
@@ -55,10 +55,6 @@ static char *rcsid =
 
 /* See below for a description of the logic in this driver */
 
-/* Is irda_crc16_table[] exported? not yet */
-/* define this if you get errors about multiple defns of irda_crc16_table */
-#undef CRC_EXPORTED
-
 /* User servicable parts */
 /* USE_PROBE Create the code which probes the chip and does a few tests */
 /* do_probe module parameter Enable this code */
@@ -209,47 +205,6 @@ static int do_probe = 0;
 
 
 /**********************************************************************/
-/* Fcs code */
-
-#ifdef CRC_EXPORTED
-extern __u16 const irda_crc16_table[];
-#else
-static __u16 const irda_crc16_table[256] = {
-  0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
-  0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
-  0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
-  0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
-  0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
-  0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
-  0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
-  0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
-  0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
-  0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
-  0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
-  0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
-  0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
-  0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
-  0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
-  0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
-  0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
-  0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
-  0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
-  0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
-  0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
-  0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
-  0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
-  0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
-  0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
-  0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
-  0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
-  0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
-  0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
-  0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
-  0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
-  0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
-};
-#endif
-
 static int
 toshoboe_checkfcs (unsigned char *buf, int len)
 {
@@ -1669,7 +1624,7 @@ toshoboe_open (struct pci_dev *pci_dev, 
 
   /*We need to align the taskfile on a taskfile size boundary */
   {
-    __u32 addr;
+    unsigned long addr;
 
     addr = (__u32) self->ringbuf;
     addr &= ~(OBOE_RING_LEN - 1);
@@ -1713,6 +1668,7 @@ toshoboe_open (struct pci_dev *pci_dev, 
 #endif
 
   SET_MODULE_OWNER(dev);
+  SET_NETDEV_DEV(dev, &pci_dev->dev);
   dev->hard_start_xmit = toshoboe_hard_xmit;
   dev->open = toshoboe_net_open;
   dev->stop = toshoboe_net_close;
--- diff/drivers/net/irda/irda-usb.c	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/net/irda/irda-usb.c	2004-04-21 10:45:34.414471704 +0100
@@ -62,7 +62,7 @@
 #include <linux/rtnetlink.h>
 #include <linux/usb.h>
 
-#include <net/irda/irda-usb.h>
+#include "irda-usb.h"
 
 /*------------------------------------------------------------------*/
 
--- diff/drivers/net/irda/irport.c	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/net/irda/irport.c	2004-04-21 10:45:34.415471552 +0100
@@ -58,7 +58,7 @@
 
 #include <net/irda/irda.h>
 #include <net/irda/wrapper.h>
-#include <net/irda/irport.h>
+#include "irport.h"
 
 #define IO_EXTENT 8
 
--- diff/drivers/net/irda/nsc-ircc.c	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/net/irda/nsc-ircc.c	2004-04-21 10:45:34.416471400 +0100
@@ -63,7 +63,7 @@
 #include <net/irda/irda.h>
 #include <net/irda/irda_device.h>
 
-#include <net/irda/nsc-ircc.h>
+#include "nsc-ircc.h"
 
 #define CHIP_IO_EXTENT 8
 #define BROKEN_DONGLE_ID
--- diff/drivers/net/irda/sir_dev.c	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/net/irda/sir_dev.c	2004-04-21 10:45:34.417471248 +0100
@@ -240,7 +240,8 @@ int sirdev_receive(struct sir_dev *dev, 
 	}
 
 	if (!dev->irlap) {
-		WARNING("%s - too early: %p / %d!\n", __FUNCTION__, cp, count);
+		WARNING("%s - too early: %p / %zd!\n",
+			__FUNCTION__, cp, count);
 		return -1;
 	}
 
@@ -250,7 +251,7 @@ int sirdev_receive(struct sir_dev *dev, 
 		 */
 		irda_device_set_media_busy(dev->netdev, TRUE);
 		dev->stats.rx_dropped++;
-		IRDA_DEBUG(0, "%s; rx-drop: %d\n", __FUNCTION__, count);
+		IRDA_DEBUG(0, "%s; rx-drop: %zd\n", __FUNCTION__, count);
 		return 0;
 	}
 
--- diff/drivers/net/irda/sir_kthread.c	2004-02-09 10:36:10.000000000 +0000
+++ source/drivers/net/irda/sir_kthread.c	2004-04-21 10:45:34.418471096 +0100
@@ -137,7 +137,7 @@ static int irda_thread(void *startup)
 
 		/* make swsusp happy with our thread */
 		if (current->flags & PF_FREEZE)
-			refrigerator(PF_IOTHREAD);
+			refrigerator(PF_FREEZE);
 
 		run_irda_queue();
 	}
--- diff/drivers/net/irda/smsc-ircc2.c	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/net/irda/smsc-ircc2.c	2004-04-21 10:45:34.419470944 +0100
@@ -1429,7 +1429,7 @@ static irqreturn_t smsc_ircc_interrupt(i
 	}
 
 	if (iir & IRCC_IIR_ACTIVE_FRAME) {
-		/*printk(KERN_WARNING __FUNCTION__ "(): Active Frame\n");*/
+		/*printk(KERN_WARNING "%s(): Active Frame\n", __FUNCTION__);*/
 	}
 
 	/* Enable interrupts again */
@@ -1995,7 +1995,7 @@ static int __init smsc_ircc_look_for_chi
 	while(address->cfg_base){
 		cfg_base = address->cfg_base;
 		
-		/*printk(KERN_WARNING __FUNCTION__ "(): probing: 0x%02x for: 0x%02x\n", cfg_base, address->type);*/
+		/*printk(KERN_WARNING "%s(): probing: 0x%02x for: 0x%02x\n", __FUNCTION__, cfg_base, address->type);*/
 		
 		if( address->type & SMSCSIO_TYPE_FDC){
 			type = "FDC";
@@ -2040,7 +2040,7 @@ static int __init smsc_superio_flat(cons
 	outb(SMSCSIOFLAT_UARTMODE0C_REG, cfgbase);
 	mode = inb(cfgbase+1);
 	
-	/*printk(KERN_WARNING __FUNCTION__ "(): mode: 0x%02x\n", mode);*/
+	/*printk(KERN_WARNING "%s(): mode: 0x%02x\n", __FUNCTION__, mode);*/
 	
 	if(!(mode & SMSCSIOFLAT_UART2MODE_VAL_IRDA))
 		WARNING("%s(): IrDA not enabled\n", __FUNCTION__);
--- diff/drivers/net/irda/stir4200.c	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/net/irda/stir4200.c	2004-04-21 10:45:34.419470944 +0100
@@ -774,7 +774,7 @@ static int stir_transmit_thread(void *ar
 
 			write_reg(stir, REG_CTRL1, CTRL1_TXPWD|CTRL1_RXPWD);
 
-			refrigerator(PF_IOTHREAD);
+			refrigerator(PF_FREEZE);
 
 			if (change_speed(stir, stir->speed))
 				break;
--- diff/drivers/net/irda/via-ircc.c	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/net/irda/via-ircc.c	2004-04-21 10:45:34.420470792 +0100
@@ -360,7 +360,7 @@ static __devinit int via_ircc_open(int i
 
 	/* Reserve the ioports that we need */
 	if (!request_region(self->io.fir_base, self->io.fir_ext, driver_name)) {
-//              WARNING(__FUNCTION__ "(), can't get iobase of 0x%03x\n",self->io.fir_base);
+//              WARNING("%s(), can't get iobase of 0x%03x\n", __FUNCTION__, self->io.fir_base);
 		err = -ENODEV;
 		goto err_out1;
 	}
--- diff/drivers/net/irda/vlsi_ir.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/irda/vlsi_ir.c	2004-04-21 10:45:34.422470488 +0100
@@ -44,6 +44,7 @@ MODULE_LICENSE("GPL");
 #include <linux/delay.h>
 #include <linux/time.h>
 #include <linux/proc_fs.h>
+#include <linux/seq_file.h>
 #include <linux/smp_lock.h>
 #include <asm/uaccess.h>
 #include <asm/byteorder.h>
@@ -53,7 +54,7 @@ MODULE_LICENSE("GPL");
 #include <net/irda/wrapper.h>
 #include <net/irda/crc.h>
 
-#include <net/irda/vlsi_ir.h>
+#include "vlsi_ir.h"
 
 /********************************************************/
 
@@ -160,72 +161,64 @@ static struct proc_dir_entry *vlsi_proc_
 
 #ifdef CONFIG_PROC_FS
 
-static int vlsi_proc_pdev(struct pci_dev *pdev, char *buf, int len)
+static void vlsi_proc_pdev(struct seq_file *seq, struct pci_dev *pdev)
 {
 	unsigned iobase = pci_resource_start(pdev, 0);
 	unsigned i;
-	char *out = buf;
 
-	if (len < 500)
-		return 0;
-
-	out += sprintf(out, "\n%s (vid/did: %04x/%04x)\n",
-			PCIDEV_NAME(pdev), (int)pdev->vendor, (int)pdev->device);
-	out += sprintf(out, "pci-power-state: %u\n", (unsigned) pdev->current_state);
-	out += sprintf(out, "resources: irq=%u / io=0x%04x / dma_mask=0x%016Lx\n",
-			pdev->irq, (unsigned)pci_resource_start(pdev, 0), (unsigned long long)pdev->dma_mask);
-	out += sprintf(out, "hw registers: ");
+	seq_printf(seq, "\n%s (vid/did: %04x/%04x)\n",
+		   PCIDEV_NAME(pdev), (int)pdev->vendor, (int)pdev->device);
+	seq_printf(seq, "pci-power-state: %u\n", (unsigned) pdev->current_state);
+	seq_printf(seq, "resources: irq=%u / io=0x%04x / dma_mask=0x%016Lx\n",
+		   pdev->irq, (unsigned)pci_resource_start(pdev, 0), (unsigned long long)pdev->dma_mask);
+	seq_printf(seq, "hw registers: ");
 	for (i = 0; i < 0x20; i++)
-		out += sprintf(out, "%02x", (unsigned)inb((iobase+i)));
-	out += sprintf(out, "\n");
-	return out - buf;
+		seq_printf(seq, "%02x", (unsigned)inb((iobase+i)));
+	seq_printf(seq, "\n");
 }
 		
-static int vlsi_proc_ndev(struct net_device *ndev, char *buf, int len)
+static void vlsi_proc_ndev(struct seq_file *seq, struct net_device *ndev)
 {
 	vlsi_irda_dev_t *idev = ndev->priv;
-	char *out = buf;
 	u8 byte;
 	u16 word;
 	unsigned delta1, delta2;
 	struct timeval now;
 	unsigned iobase = ndev->base_addr;
 
-	if (len < 1000)
-		return 0;
-
-	out += sprintf(out, "\n%s link state: %s / %s / %s / %s\n", ndev->name,
+	seq_printf(seq, "\n%s link state: %s / %s / %s / %s\n", ndev->name,
 		netif_device_present(ndev) ? "attached" : "detached", 
 		netif_running(ndev) ? "running" : "not running",
 		netif_carrier_ok(ndev) ? "carrier ok" : "no carrier",
 		netif_queue_stopped(ndev) ? "queue stopped" : "queue running");
+
 	if (!netif_running(ndev))
-		return out - buf;
+		return;
 
-	out += sprintf(out, "\nhw-state:\n");
+	seq_printf(seq, "\nhw-state:\n");
 	pci_read_config_byte(idev->pdev, VLSI_PCI_IRMISC, &byte);
-	out += sprintf(out, "IRMISC:%s%s%s uart%s",
+	seq_printf(seq, "IRMISC:%s%s%s uart%s",
 		(byte&IRMISC_IRRAIL) ? " irrail" : "",
 		(byte&IRMISC_IRPD) ? " irpd" : "",
 		(byte&IRMISC_UARTTST) ? " uarttest" : "",
 		(byte&IRMISC_UARTEN) ? "@" : " disabled\n");
 	if (byte&IRMISC_UARTEN) {
-		out += sprintf(out, "0x%s\n",
+		seq_printf(seq, "0x%s\n",
 			(byte&2) ? ((byte&1) ? "3e8" : "2e8")
 				 : ((byte&1) ? "3f8" : "2f8"));
 	}
 	pci_read_config_byte(idev->pdev, VLSI_PCI_CLKCTL, &byte);
-	out += sprintf(out, "CLKCTL: PLL %s%s%s / clock %s / wakeup %s\n",
+	seq_printf(seq, "CLKCTL: PLL %s%s%s / clock %s / wakeup %s\n",
 		(byte&CLKCTL_PD_INV) ? "powered" : "down",
 		(byte&CLKCTL_LOCK) ? " locked" : "",
 		(byte&CLKCTL_EXTCLK) ? ((byte&CLKCTL_XCKSEL)?" / 40 MHz XCLK":" / 48 MHz XCLK") : "",
 		(byte&CLKCTL_CLKSTP) ? "stopped" : "running",
 		(byte&CLKCTL_WAKE) ? "enabled" : "disabled");
 	pci_read_config_byte(idev->pdev, VLSI_PCI_MSTRPAGE, &byte);
-	out += sprintf(out, "MSTRPAGE: 0x%02x\n", (unsigned)byte);
+	seq_printf(seq, "MSTRPAGE: 0x%02x\n", (unsigned)byte);
 
 	byte = inb(iobase+VLSI_PIO_IRINTR);
-	out += sprintf(out, "IRINTR:%s%s%s%s%s%s%s%s\n",
+	seq_printf(seq, "IRINTR:%s%s%s%s%s%s%s%s\n",
 		(byte&IRINTR_ACTEN) ? " ACTEN" : "",
 		(byte&IRINTR_RPKTEN) ? " RPKTEN" : "",
 		(byte&IRINTR_TPKTEN) ? " TPKTEN" : "",
@@ -235,16 +228,16 @@ static int vlsi_proc_ndev(struct net_dev
 		(byte&IRINTR_TPKTINT) ? " TPKTINT" : "",
 		(byte&IRINTR_OE_INT) ? " OE_INT" : "");
 	word = inw(iobase+VLSI_PIO_RINGPTR);
-	out += sprintf(out, "RINGPTR: rx=%u / tx=%u\n", RINGPTR_GET_RX(word), RINGPTR_GET_TX(word));
+	seq_printf(seq, "RINGPTR: rx=%u / tx=%u\n", RINGPTR_GET_RX(word), RINGPTR_GET_TX(word));
 	word = inw(iobase+VLSI_PIO_RINGBASE);
-	out += sprintf(out, "RINGBASE: busmap=0x%08x\n",
+	seq_printf(seq, "RINGBASE: busmap=0x%08x\n",
 		((unsigned)word << 10)|(MSTRPAGE_VALUE<<24));
 	word = inw(iobase+VLSI_PIO_RINGSIZE);
-	out += sprintf(out, "RINGSIZE: rx=%u / tx=%u\n", RINGSIZE_TO_RXSIZE(word),
+	seq_printf(seq, "RINGSIZE: rx=%u / tx=%u\n", RINGSIZE_TO_RXSIZE(word),
 		RINGSIZE_TO_TXSIZE(word));
 
 	word = inw(iobase+VLSI_PIO_IRCFG);
-	out += sprintf(out, "IRCFG:%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
+	seq_printf(seq, "IRCFG:%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
 		(word&IRCFG_LOOP) ? " LOOP" : "",
 		(word&IRCFG_ENTX) ? " ENTX" : "",
 		(word&IRCFG_ENRX) ? " ENRX" : "",
@@ -259,7 +252,7 @@ static int vlsi_proc_ndev(struct net_dev
 		(word&IRCFG_TXPOL) ? " TXPOL" : "",
 		(word&IRCFG_RXPOL) ? " RXPOL" : "");
 	word = inw(iobase+VLSI_PIO_IRENABLE);
-	out += sprintf(out, "IRENABLE:%s%s%s%s%s%s%s%s\n",
+	seq_printf(seq, "IRENABLE:%s%s%s%s%s%s%s%s\n",
 		(word&IRENABLE_PHYANDCLOCK) ? " PHYANDCLOCK" : "",
 		(word&IRENABLE_CFGER) ? " CFGERR" : "",
 		(word&IRENABLE_FIR_ON) ? " FIR_ON" : "",
@@ -269,22 +262,22 @@ static int vlsi_proc_ndev(struct net_dev
 		(word&IRENABLE_ENRXST) ? " ENRXST" : "",
 		(word&IRENABLE_CRC16_ON) ? " CRC16_ON" : "");
 	word = inw(iobase+VLSI_PIO_PHYCTL);
-	out += sprintf(out, "PHYCTL: baud-divisor=%u / pulsewidth=%u / preamble=%u\n",
+	seq_printf(seq, "PHYCTL: baud-divisor=%u / pulsewidth=%u / preamble=%u\n",
 		(unsigned)PHYCTL_TO_BAUD(word),
 		(unsigned)PHYCTL_TO_PLSWID(word),
 		(unsigned)PHYCTL_TO_PREAMB(word));
 	word = inw(iobase+VLSI_PIO_NPHYCTL);
-	out += sprintf(out, "NPHYCTL: baud-divisor=%u / pulsewidth=%u / preamble=%u\n",
+	seq_printf(seq, "NPHYCTL: baud-divisor=%u / pulsewidth=%u / preamble=%u\n",
 		(unsigned)PHYCTL_TO_BAUD(word),
 		(unsigned)PHYCTL_TO_PLSWID(word),
 		(unsigned)PHYCTL_TO_PREAMB(word));
 	word = inw(iobase+VLSI_PIO_MAXPKT);
-	out += sprintf(out, "MAXPKT: max. rx packet size = %u\n", word);
+	seq_printf(seq, "MAXPKT: max. rx packet size = %u\n", word);
 	word = inw(iobase+VLSI_PIO_RCVBCNT) & RCVBCNT_MASK;
-	out += sprintf(out, "RCVBCNT: rx-fifo filling level = %u\n", word);
+	seq_printf(seq, "RCVBCNT: rx-fifo filling level = %u\n", word);
 
-	out += sprintf(out, "\nsw-state:\n");
-	out += sprintf(out, "IrPHY setup: %d baud - %s encoding\n", idev->baud, 
+	seq_printf(seq, "\nsw-state:\n");
+	seq_printf(seq, "IrPHY setup: %d baud - %s encoding\n", idev->baud, 
 		(idev->mode==IFF_SIR)?"SIR":((idev->mode==IFF_MIR)?"MIR":"FIR"));
 	do_gettimeofday(&now);
 	if (now.tv_usec >= idev->last_rx.tv_usec) {
@@ -295,216 +288,110 @@ static int vlsi_proc_ndev(struct net_dev
 		delta2 = 1000000 + now.tv_usec - idev->last_rx.tv_usec;
 		delta1 = 1;
 	}
-	out += sprintf(out, "last rx: %lu.%06u sec\n",
+	seq_printf(seq, "last rx: %lu.%06u sec\n",
 		now.tv_sec - idev->last_rx.tv_sec - delta1, delta2);	
 
-	out += sprintf(out, "RX: packets=%lu / bytes=%lu / errors=%lu / dropped=%lu",
+	seq_printf(seq, "RX: packets=%lu / bytes=%lu / errors=%lu / dropped=%lu",
 		idev->stats.rx_packets, idev->stats.rx_bytes, idev->stats.rx_errors,
 		idev->stats.rx_dropped);
-	out += sprintf(out, " / overrun=%lu / length=%lu / frame=%lu / crc=%lu\n",
+	seq_printf(seq, " / overrun=%lu / length=%lu / frame=%lu / crc=%lu\n",
 		idev->stats.rx_over_errors, idev->stats.rx_length_errors,
 		idev->stats.rx_frame_errors, idev->stats.rx_crc_errors);
-	out += sprintf(out, "TX: packets=%lu / bytes=%lu / errors=%lu / dropped=%lu / fifo=%lu\n",
+	seq_printf(seq, "TX: packets=%lu / bytes=%lu / errors=%lu / dropped=%lu / fifo=%lu\n",
 		idev->stats.tx_packets, idev->stats.tx_bytes, idev->stats.tx_errors,
 		idev->stats.tx_dropped, idev->stats.tx_fifo_errors);
 
-	return out - buf;
 }
 		
-static int vlsi_proc_ring(struct vlsi_ring *r, char *buf, int len)
+static void vlsi_proc_ring(struct seq_file *seq, struct vlsi_ring *r)
 {
 	struct ring_descr *rd;
 	unsigned i, j;
 	int h, t;
-	char *out = buf;
-
-	if (len < 3000)
-		return 0;
 
-	out += sprintf(out, "size %u / mask 0x%04x / len %u / dir %d / hw %p\n",
+	seq_printf(seq, "size %u / mask 0x%04x / len %u / dir %d / hw %p\n",
 		r->size, r->mask, r->len, r->dir, r->rd[0].hw);
 	h = atomic_read(&r->head) & r->mask;
 	t = atomic_read(&r->tail) & r->mask;
-	out += sprintf(out, "head = %d / tail = %d ", h, t);
+	seq_printf(seq, "head = %d / tail = %d ", h, t);
 	if (h == t)
-		out += sprintf(out, "(empty)\n");
+		seq_printf(seq, "(empty)\n");
 	else {
 		if (((t+1)&r->mask) == h)
-			out += sprintf(out, "(full)\n");
+			seq_printf(seq, "(full)\n");
 		else
-			out += sprintf(out, "(level = %d)\n", ((unsigned)(t-h) & r->mask)); 
+			seq_printf(seq, "(level = %d)\n", ((unsigned)(t-h) & r->mask)); 
 		rd = &r->rd[h];
 		j = (unsigned) rd_get_count(rd);
-		out += sprintf(out, "current: rd = %d / status = %02x / len = %u\n",
+		seq_printf(seq, "current: rd = %d / status = %02x / len = %u\n",
 				h, (unsigned)rd_get_status(rd), j);
 		if (j > 0) {
-			out += sprintf(out, "   data:");
+			seq_printf(seq, "   data:");
 			if (j > 20)
 				j = 20;
 			for (i = 0; i < j; i++)
-				out += sprintf(out, " %02x", (unsigned)((unsigned char *)rd->buf)[i]);
-			out += sprintf(out, "\n");
+				seq_printf(seq, " %02x", (unsigned)((unsigned char *)rd->buf)[i]);
+			seq_printf(seq, "\n");
 		}
 	}
 	for (i = 0; i < r->size; i++) {
 		rd = &r->rd[i];
-		out += sprintf(out, "> ring descr %u: ", i);
-		out += sprintf(out, "skb=%p data=%p hw=%p\n", rd->skb, rd->buf, rd->hw);
-		out += sprintf(out, "  hw: status=%02x count=%u busaddr=0x%08x\n",
+		seq_printf(seq, "> ring descr %u: ", i);
+		seq_printf(seq, "skb=%p data=%p hw=%p\n", rd->skb, rd->buf, rd->hw);
+		seq_printf(seq, "  hw: status=%02x count=%u busaddr=0x%08x\n",
 			(unsigned) rd_get_status(rd),
 			(unsigned) rd_get_count(rd), (unsigned) rd_get_addr(rd));
 	}
-	return out - buf;
 }
 
-static int vlsi_proc_print(struct net_device *ndev, char *buf, int len)
+static int vlsi_seq_show(struct seq_file *seq, void *v)
 {
-	vlsi_irda_dev_t *idev;
+	struct net_device *ndev = seq->private;
+	vlsi_irda_dev_t *idev = ndev->priv;
 	unsigned long flags;
-	char *out = buf;
 
-	if (!ndev || !ndev->priv) {
-		ERROR("%s: invalid ptr!\n", __FUNCTION__);
-		return 0;
-	}
-
-	idev = ndev->priv;
-
-	if (len < 8000)
-		return 0;
-
-	out += sprintf(out, "\n%s %s\n\n", DRIVER_NAME, DRIVER_VERSION);
-	out += sprintf(out, "clksrc: %s\n", 
+	seq_printf(seq, "\n%s %s\n\n", DRIVER_NAME, DRIVER_VERSION);
+	seq_printf(seq, "clksrc: %s\n", 
 		(clksrc>=2) ? ((clksrc==3)?"40MHz XCLK":"48MHz XCLK")
 			    : ((clksrc==1)?"48MHz PLL":"autodetect"));
-	out += sprintf(out, "ringsize: tx=%d / rx=%d\n",
+	seq_printf(seq, "ringsize: tx=%d / rx=%d\n",
 		ringsize[0], ringsize[1]);
-	out += sprintf(out, "sirpulse: %s\n", (sirpulse)?"3/16 bittime":"short");
-	out += sprintf(out, "qos_mtt_bits: 0x%02x\n", (unsigned)qos_mtt_bits);
+	seq_printf(seq, "sirpulse: %s\n", (sirpulse)?"3/16 bittime":"short");
+	seq_printf(seq, "qos_mtt_bits: 0x%02x\n", (unsigned)qos_mtt_bits);
 
 	spin_lock_irqsave(&idev->lock, flags);
 	if (idev->pdev != NULL) {
-		out += vlsi_proc_pdev(idev->pdev, out, len - (out-buf));
+		vlsi_proc_pdev(seq, idev->pdev);
+
 		if (idev->pdev->current_state == 0)
-			out += vlsi_proc_ndev(ndev, out, len - (out-buf));
+			vlsi_proc_ndev(seq, ndev);
 		else
-			out += sprintf(out, "\nPCI controller down - resume_ok = %d\n",
+			seq_printf(seq, "\nPCI controller down - resume_ok = %d\n",
 				idev->resume_ok);
 		if (netif_running(ndev) && idev->rx_ring && idev->tx_ring) {
-			out += sprintf(out, "\n--------- RX ring -----------\n\n");
-			out += vlsi_proc_ring(idev->rx_ring, out, len - (out-buf));
-			out += sprintf(out, "\n--------- TX ring -----------\n\n");
-			out += vlsi_proc_ring(idev->tx_ring, out, len - (out-buf));
+			seq_printf(seq, "\n--------- RX ring -----------\n\n");
+			vlsi_proc_ring(seq, idev->rx_ring);
+			seq_printf(seq, "\n--------- TX ring -----------\n\n");
+			vlsi_proc_ring(seq, idev->tx_ring);
 		}
 	}
-	out += sprintf(out, "\n");
+	seq_printf(seq, "\n");
 	spin_unlock_irqrestore(&idev->lock, flags);
 
-	return out - buf;
-}
-
-struct vlsi_proc_data {
-	int size;
-	char *data;
-};
-
-/* most of the proc-fops code borrowed from usb/uhci */
-
-static int vlsi_proc_open(struct inode *inode, struct file *file)
-{
-	const struct proc_dir_entry *pde = PDE(inode);
-	struct net_device *ndev = pde->data;
-	vlsi_irda_dev_t *idev = ndev->priv;
-	struct vlsi_proc_data *procdata;
-	const int maxdata = 8000;
-
-	lock_kernel();
-	procdata = kmalloc(sizeof(*procdata), GFP_KERNEL);
-	if (!procdata) {
-		unlock_kernel();
-		return -ENOMEM;
-	}
-	procdata->data = kmalloc(maxdata, GFP_KERNEL);
-	if (!procdata->data) {
-		kfree(procdata);
-		unlock_kernel();
-		return -ENOMEM;
-	}
-
-	down(&idev->sem);
-	procdata->size = vlsi_proc_print(ndev, procdata->data, maxdata);
-	up(&idev->sem);
-
-	file->private_data = procdata;
-
 	return 0;
 }
 
-static loff_t vlsi_proc_lseek(struct file *file, loff_t off, int whence)
-{
-	struct vlsi_proc_data *procdata;
-	loff_t new = -1;
-
-	lock_kernel();
-	procdata = file->private_data;
-
-	switch (whence) {
-	case 0:
-		new = off;
-		break;
-	case 1:
-		new = file->f_pos + off;
-		break;
-	}
-	if (new < 0 || new > procdata->size) {
-		unlock_kernel();
-		return -EINVAL;
-	}
-	unlock_kernel();
-	return (file->f_pos = new);
-}
-
-static ssize_t vlsi_proc_read(struct file *file, char *buf, size_t nbytes,
-			loff_t *ppos)
-{
-	struct vlsi_proc_data *procdata = file->private_data;
-	unsigned int pos;
-	unsigned int size;
-
-	pos = *ppos;
-	size = procdata->size;
-	if (pos >= size)
-		return 0;
-	if (nbytes >= size)
-		nbytes = size;
-	if (pos + nbytes > size)
-		nbytes = size - pos;
-
-	if (copy_to_user(buf, procdata->data + pos, nbytes))
-		return -EFAULT;
-
-	*ppos += nbytes;
-
-	return nbytes;
-}
-
-static int vlsi_proc_release(struct inode *inode, struct file *file)
+static int vlsi_seq_open(struct inode *inode, struct file *file)
 {
-	struct vlsi_proc_data *procdata = file->private_data;
-
-	kfree(procdata->data);
-	kfree(procdata);
-
-	return 0;
+	return single_open(file, vlsi_seq_show, PDE(inode)->data);
 }
 
 static struct file_operations vlsi_proc_fops = {
-	/* protect individual procdir file entry against rmmod */
-	.owner		= THIS_MODULE,
-	.open		= vlsi_proc_open,
-	.llseek		= vlsi_proc_lseek,
-	.read		= vlsi_proc_read,
-	.release	= vlsi_proc_release,
+	.owner	 = THIS_MODULE,
+	.open    = vlsi_seq_open,
+	.read    = seq_read,
+	.llseek  = seq_lseek,
+	.release = single_release,
 };
 
 #define VLSI_PROC_FOPS		(&vlsi_proc_fops)
@@ -1735,6 +1622,8 @@ static int vlsi_irda_init(struct net_dev
 	ndev->tx_timeout      = vlsi_tx_timeout;
 	ndev->watchdog_timeo  = 500*HZ/1000;	/* max. allowed turn time for IrLAP */
 
+	SET_NETDEV_DEV(ndev, &pdev->dev);
+
 	return 0;
 }	
 
@@ -1787,13 +1676,12 @@ vlsi_irda_probe(struct pci_dev *pdev, co
 		ent = create_proc_entry(ndev->name, S_IFREG|S_IRUGO, vlsi_proc_root);
 		if (!ent) {
 			WARNING("%s: failed to create proc entry\n", __FUNCTION__);
-		}
-		else {
+		} else {
 			ent->data = ndev;
 			ent->proc_fops = VLSI_PROC_FOPS;
 			ent->size = 0;
-			idev->proc_entry = ent;
 		}
+		idev->proc_entry = ent;
 	}
 	MESSAGE("%s: registered device %s\n", drivername, ndev->name);
 
--- diff/drivers/net/irda/w83977af_ir.c	2004-03-11 10:20:25.000000000 +0000
+++ source/drivers/net/irda/w83977af_ir.c	2004-04-21 10:45:34.424470184 +0100
@@ -58,8 +58,8 @@
 #include <net/irda/irda.h>
 #include <net/irda/wrapper.h>
 #include <net/irda/irda_device.h>
-#include <net/irda/w83977af.h>
-#include <net/irda/w83977af_ir.h>
+#include "w83977af.h"
+#include "w83977af_ir.h"
 
 #ifdef  CONFIG_ARCH_NETWINDER            /* Adjust to NetWinder differences */
 #undef  CONFIG_NETWINDER_TX_DMA_PROBLEMS /* Not needed */
--- diff/drivers/net/ixgb/ixgb.h	2003-05-21 11:50:15.000000000 +0100
+++ source/drivers/net/ixgb/ixgb.h	2004-04-21 10:45:34.427469728 +0100
@@ -43,6 +43,7 @@
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/pagemap.h>
+#include <linux/dma-mapping.h>
 #include <linux/bitops.h>
 #include <linux/in.h>
 #include <linux/ip.h>
@@ -65,8 +66,6 @@ struct ixgb_adapter;
 #define BAR_0           0
 #define BAR_1           1
 #define BAR_5           5
-#define PCI_DMA_64BIT   0xffffffffffffffffULL
-#define PCI_DMA_32BIT   0x00000000ffffffffULL
 
 #include "ixgb_hw.h"
 #include "ixgb_ee.h"
--- diff/drivers/net/ixgb/ixgb_main.c	2004-02-18 08:54:10.000000000 +0000
+++ source/drivers/net/ixgb/ixgb_main.c	2004-04-21 10:45:34.428469576 +0100
@@ -308,10 +308,10 @@ ixgb_probe(struct pci_dev *pdev, const s
 		return i;
 	}
 
-	if (!(i = pci_set_dma_mask(pdev, PCI_DMA_64BIT))) {
+	if (!(i = pci_set_dma_mask(pdev, DMA_64BIT_MASK))) {
 		pci_using_dac = 1;
 	} else {
-		if ((i = pci_set_dma_mask(pdev, PCI_DMA_32BIT))) {
+		if ((i = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) {
 			IXGB_ERR("No usable DMA configuration, aborting\n");
 			return i;
 		}
--- diff/drivers/net/mace.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/mace.c	2004-04-21 10:45:34.429469424 +0100
@@ -172,15 +172,12 @@ static int __devinit mace_probe(struct m
 	}
 	dev->irq = macio_irq(mdev, 0);
 
-	printk(KERN_INFO "%s: MACE at", dev->name);
 	rev = addr[0] == 0 && addr[1] == 0xA0;
 	for (j = 0; j < 6; ++j) {
 		dev->dev_addr[j] = rev? bitrev(addr[j]): addr[j];
-		printk("%c%.2x", (j? ':': ' '), dev->dev_addr[j]);
 	}
 	mp->chipid = (in_8(&mp->mace->chipid_hi) << 8) |
 			in_8(&mp->mace->chipid_lo);
-	printk(", chip revision %d.%d\n", mp->chipid >> 8, mp->chipid & 0xff);
 		
 
 	mp = (struct mace_data *) dev->priv;
@@ -259,10 +256,16 @@ static int __devinit mace_probe(struct m
 
 	rc = register_netdev(dev);
 	if (rc) {
-		printk(KERN_ERR "Cannot register net device, aborting.\n");
+		printk(KERN_ERR "MACE: Cannot register net device, aborting.\n");
 		goto err_free_rx_irq;
 	}
 
+	printk(KERN_INFO "%s: MACE at", dev->name);
+	for (j = 0; j < 6; ++j) {
+		printk("%c%.2x", (j? ':': ' '), dev->dev_addr[j]);
+	}
+	printk(", chip revision %d.%d\n", mp->chipid >> 8, mp->chipid & 0xff);
+
 	return 0;
  
  err_free_rx_irq:
--- diff/drivers/net/natsemi.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/natsemi.c	2004-04-21 10:45:34.430469272 +0100
@@ -387,7 +387,7 @@ enum register_offsets {
 	IntrStatus		= 0x10,
 	IntrMask		= 0x14,
 	IntrEnable		= 0x18,
-	IntrHoldoff		= 0x16, /* DP83816 only */
+	IntrHoldoff		= 0x1C, /* DP83816 only */
 	TxRingPtr		= 0x20,
 	TxConfig		= 0x24,
 	RxRingPtr		= 0x30,
--- diff/drivers/net/ne2k-pci.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/ne2k-pci.c	2004-04-21 10:45:34.430469272 +0100
@@ -69,8 +69,6 @@ KERN_INFO "  http://www.scyld.com/networ
 #if defined(__powerpc__)
 #define inl_le(addr)  le32_to_cpu(inl(addr))
 #define inw_le(addr)  le16_to_cpu(inw(addr))
-#define insl insl_ns
-#define outsl outsl_ns
 #endif
 
 #define PFX DRV_NAME ": "
--- diff/drivers/net/net_init.c	2004-03-11 10:20:26.000000000 +0000
+++ source/drivers/net/net_init.c	2004-04-21 10:45:34.431469120 +0100
@@ -79,8 +79,9 @@ struct net_device *alloc_netdev(int size
 
 	/* ensure 32-byte alignment of both the device and private area */
 
-	alloc_size = (sizeof(struct net_device) + 31) & ~31;
-	alloc_size += sizeof_priv + 31;
+	alloc_size = (sizeof(struct net_device) + NETDEV_ALIGN_CONST)
+			& ~NETDEV_ALIGN_CONST;
+	alloc_size += sizeof_priv + NETDEV_ALIGN_CONST;
 
 	p = kmalloc (alloc_size, GFP_KERNEL);
 	if (!p) {
@@ -90,7 +91,8 @@ struct net_device *alloc_netdev(int size
 
 	memset(p, 0, alloc_size);
 
-	dev = (struct net_device *)(((long)p + 31) & ~31);
+	dev = (struct net_device *)(((long)p + NETDEV_ALIGN_CONST)
+				& ~NETDEV_ALIGN_CONST);
 	dev->padded = (char *)dev - (char *)p;
 
 	if (sizeof_priv)
--- diff/drivers/net/pcmcia/3c589_cs.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/pcmcia/3c589_cs.c	2004-04-21 10:45:34.432468968 +0100
@@ -711,12 +711,13 @@ static void pop_tx_status(struct net_dev
 static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
     ioaddr_t ioaddr = dev->base_addr;
+    struct el3_private *priv = netdev_priv(dev);
 
     DEBUG(3, "%s: el3_start_xmit(length = %ld) called, "
 	  "status %4.4x.\n", dev->name, (long)skb->len,
 	  inw(ioaddr + EL3_STATUS));
 
-    ((struct el3_private *)dev->priv)->stats.tx_bytes += skb->len;
+    priv->stats.tx_bytes += skb->len;
 
     /* Put out the doubleword header... */
     outw(skb->len, ioaddr + TX_FIFO);
--- diff/drivers/net/pcmcia/ibmtr_cs.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/pcmcia/ibmtr_cs.c	2004-04-21 10:45:34.432468968 +0100
@@ -444,7 +444,8 @@ static int ibmtr_event(event_t event, in
         link->state &= ~DEV_PRESENT;
         if (link->state & DEV_CONFIG) {
 	    /* set flag to bypass normal interrupt code */
-	    ((struct tok_info *)dev->priv)->sram_virt |= 1;
+	    struct tok_info *priv = netdev_priv(dev);
+	    priv->sram_virt |= 1;
 	    netif_device_detach(dev);
 	    ibmtr_release(link);
         }
--- diff/drivers/net/pcmcia/nmclan_cs.c	2004-02-18 08:54:10.000000000 +0000
+++ source/drivers/net/pcmcia/nmclan_cs.c	2004-04-21 10:45:34.434468664 +0100
@@ -470,7 +470,7 @@ static dev_link_t *nmclan_attach(void)
     dev = alloc_etherdev(sizeof(mace_private));
     if (!dev)
 	return NULL;
-    lp = dev->priv;
+    lp = netdev_priv(dev);
     link = &lp->link;
     link->priv = dev;
     
@@ -707,7 +707,7 @@ static void nmclan_config(dev_link_t *li
 {
   client_handle_t handle = link->handle;
   struct net_device *dev = link->priv;
-  mace_private *lp = dev->priv;
+  mace_private *lp = netdev_priv(dev);
   tuple_t tuple;
   cisparse_t parse;
   u_char buf[64];
@@ -875,7 +875,7 @@ nmclan_reset
 ---------------------------------------------------------------------------- */
 static void nmclan_reset(struct net_device *dev)
 {
-  mace_private *lp = dev->priv;
+  mace_private *lp = netdev_priv(dev);
 
 #if RESET_XILINX
   dev_link_t *link = &lp->link;
@@ -944,7 +944,7 @@ mace_open
 static int mace_open(struct net_device *dev)
 {
   ioaddr_t ioaddr = dev->base_addr;
-  mace_private *lp = dev->priv;
+  mace_private *lp = netdev_priv(dev);
   dev_link_t *link = &lp->link;
 
   if (!DEV_OK(link))
@@ -967,7 +967,7 @@ mace_close
 static int mace_close(struct net_device *dev)
 {
   ioaddr_t ioaddr = dev->base_addr;
-  mace_private *lp = dev->priv;
+  mace_private *lp = netdev_priv(dev);
   dev_link_t *link = &lp->link;
 
   DEBUG(2, "%s: shutting down ethercard.\n", dev->name);
@@ -1022,7 +1022,7 @@ mace_start_xmit
 
 static void mace_tx_timeout(struct net_device *dev)
 {
-  mace_private *lp = (mace_private *)dev->priv;
+  mace_private *lp = netdev_priv(dev);
   dev_link_t *link = &lp->link;
 
   printk(KERN_NOTICE "%s: transmit timed out -- ", dev->name);
@@ -1038,7 +1038,7 @@ static void mace_tx_timeout(struct net_d
 
 static int mace_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
-  mace_private *lp = (mace_private *)dev->priv;
+  mace_private *lp = netdev_priv(dev);
   ioaddr_t ioaddr = dev->base_addr;
 
   netif_stop_queue(dev);
@@ -1099,7 +1099,7 @@ mace_interrupt
 static irqreturn_t mace_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
   struct net_device *dev = (struct net_device *) dev_id;
-  mace_private *lp = dev->priv;
+  mace_private *lp = netdev_priv(dev);
   ioaddr_t ioaddr = dev->base_addr;
   int status;
   int IntrCnt = MACE_MAX_IR_ITERATIONS;
@@ -1241,7 +1241,7 @@ mace_rx
 ---------------------------------------------------------------------------- */
 static int mace_rx(struct net_device *dev, unsigned char RxCnt)
 {
-  mace_private *lp = (mace_private *)dev->priv;
+  mace_private *lp = netdev_priv(dev);
   ioaddr_t ioaddr = dev->base_addr;
   unsigned char rx_framecnt;
   unsigned short rx_status;
@@ -1408,7 +1408,7 @@ update_stats
 ---------------------------------------------------------------------------- */
 static void update_stats(ioaddr_t ioaddr, struct net_device *dev)
 {
-  mace_private *lp = (mace_private *)dev->priv;
+  mace_private *lp = netdev_priv(dev);
 
   lp->mace_stats.rcvcc += mace_read(lp, ioaddr, MACE_RCVCC);
   lp->mace_stats.rntpc += mace_read(lp, ioaddr, MACE_RNTPC);
@@ -1454,7 +1454,7 @@ mace_get_stats
 ---------------------------------------------------------------------------- */
 static struct net_device_stats *mace_get_stats(struct net_device *dev)
 {
-  mace_private *lp = (mace_private *)dev->priv;
+  mace_private *lp = netdev_priv(dev);
 
   update_stats(dev->base_addr, dev);
 
@@ -1549,7 +1549,7 @@ Input
 ---------------------------------------------------------------------------- */
 static void restore_multicast_list(struct net_device *dev)
 {
-  mace_private *lp = (mace_private *)dev->priv;
+  mace_private *lp = netdev_priv(dev);
   int num_addrs = lp->multicast_num_addrs;
   int *ladrf = lp->multicast_ladrf;
   ioaddr_t ioaddr = dev->base_addr;
@@ -1606,7 +1606,7 @@ Output
 
 static void set_multicast_list(struct net_device *dev)
 {
-  mace_private *lp = (mace_private *)dev->priv;
+  mace_private *lp = netdev_priv(dev);
   int adr[ETHER_ADDR_LEN] = {0}; /* Ethernet address */
   int i;
   struct dev_mc_list *dmi = dev->mc_list;
@@ -1645,10 +1645,10 @@ static void set_multicast_list(struct ne
 static void restore_multicast_list(struct net_device *dev)
 {
   ioaddr_t ioaddr = dev->base_addr;
-  mace_private *lp = (mace_private *)dev->priv;
+  mace_private *lp = netdev_priv(dev);
 
   DEBUG(2, "%s: restoring Rx mode to %d addresses.\n", dev->name,
-	((mace_private *)(dev->priv))->multicast_num_addrs);
+	lp->multicast_num_addrs);
 
   if (dev->flags & IFF_PROMISC) {
     /* Promiscuous mode: receive all packets */
@@ -1665,7 +1665,7 @@ static void restore_multicast_list(struc
 
 static void set_multicast_list(struct net_device *dev)
 {
-  mace_private *lp = (mace_private *)dev->priv;
+  mace_private *lp = netdev_priv(dev);
 
 #ifdef PCMCIA_DEBUG
   if (pc_debug > 1) {
--- diff/drivers/net/pcmcia/xirc2ps_cs.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/pcmcia/xirc2ps_cs.c	2004-04-21 10:45:34.435468512 +0100
@@ -595,7 +595,7 @@ xirc2ps_attach(void)
     dev = alloc_etherdev(sizeof(local_info_t));
     if (!dev)
 	    return NULL;
-    local = dev->priv;
+    local = netdev_priv(dev);
     link = &local->link;
     link->priv = dev;
 
@@ -710,7 +710,7 @@ static int
 set_card_type(dev_link_t *link, const void *s)
 {
     struct net_device *dev = link->priv;
-    local_info_t *local = dev->priv;
+    local_info_t *local = netdev_priv(dev);
   #ifdef PCMCIA_DEBUG
     unsigned cisrev = ((const unsigned char *)s)[2];
   #endif
@@ -805,7 +805,7 @@ xirc2ps_config(dev_link_t * link)
 {
     client_handle_t handle = link->handle;
     struct net_device *dev = link->priv;
-    local_info_t *local = dev->priv;
+    local_info_t *local = netdev_priv(dev);
     tuple_t tuple;
     cisparse_t parse;
     ioaddr_t ioaddr;
@@ -1159,7 +1159,7 @@ xirc2ps_release(dev_link_t *link)
 
     if (link->win) {
 	struct net_device *dev = link->priv;
-	local_info_t *local = dev->priv;
+	local_info_t *local = netdev_priv(dev);
 	if (local->dingo)
 	    iounmap(local->dingo_ccr - 0x0800);
 	pcmcia_release_window(link->win);
@@ -1246,7 +1246,7 @@ static irqreturn_t
 xirc2ps_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
     struct net_device *dev = (struct net_device *)dev_id;
-    local_info_t *lp = dev->priv;
+    local_info_t *lp = netdev_priv(dev);
     ioaddr_t ioaddr;
     u_char saved_page;
     unsigned bytes_rcvd;
@@ -1468,7 +1468,7 @@ xirc2ps_interrupt(int irq, void *dev_id,
 static void
 do_tx_timeout(struct net_device *dev)
 {
-    local_info_t *lp = dev->priv;
+    local_info_t *lp = netdev_priv(dev);
     printk(KERN_NOTICE "%s: transmit timed out\n", dev->name);
     lp->stats.tx_errors++;
     /* reset the card */
@@ -1480,7 +1480,7 @@ do_tx_timeout(struct net_device *dev)
 static int
 do_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
-    local_info_t *lp = dev->priv;
+    local_info_t *lp = netdev_priv(dev);
     ioaddr_t ioaddr = dev->base_addr;
     int okay;
     unsigned freespace;
@@ -1537,7 +1537,7 @@ do_start_xmit(struct sk_buff *skb, struc
 static struct net_device_stats *
 do_get_stats(struct net_device *dev)
 {
-    local_info_t *lp = dev->priv;
+    local_info_t *lp = netdev_priv(dev);
 
     /*	lp->stats.rx_missed_errors = GetByte(?) */
     return &lp->stats;
@@ -1552,7 +1552,7 @@ static void
 set_addresses(struct net_device *dev)
 {
     ioaddr_t ioaddr = dev->base_addr;
-    local_info_t *lp = dev->priv;
+    local_info_t *lp = netdev_priv(dev);
     struct dev_mc_list *dmi = dev->mc_list;
     char *addr;
     int i,j,k,n;
@@ -1617,7 +1617,7 @@ set_multicast_list(struct net_device *de
 static int
 do_config(struct net_device *dev, struct ifmap *map)
 {
-    local_info_t *local = dev->priv;
+    local_info_t *local = netdev_priv(dev);
 
     DEBUG(0, "do_config(%p)\n", dev);
     if (map->port != 255 && map->port != dev->if_port) {
@@ -1643,7 +1643,7 @@ do_config(struct net_device *dev, struct
 static int
 do_open(struct net_device *dev)
 {
-    local_info_t *lp = dev->priv;
+    local_info_t *lp = netdev_priv(dev);
     dev_link_t *link = &lp->link;
 
     DEBUG(0, "do_open(%p)\n", dev);
@@ -1676,7 +1676,7 @@ static struct ethtool_ops netdev_ethtool
 static int
 do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
 {
-    local_info_t *local = dev->priv;
+    local_info_t *local = netdev_priv(dev);
     ioaddr_t ioaddr = dev->base_addr;
     u16 *data = (u16 *)&rq->ifr_data;
 
@@ -1708,7 +1708,7 @@ do_ioctl(struct net_device *dev, struct 
 static void
 hardreset(struct net_device *dev)
 {
-    local_info_t *local = dev->priv;
+    local_info_t *local = netdev_priv(dev);
     ioaddr_t ioaddr = dev->base_addr;
 
     SelectPage(4);
@@ -1725,7 +1725,7 @@ hardreset(struct net_device *dev)
 static void
 do_reset(struct net_device *dev, int full)
 {
-    local_info_t *local = dev->priv;
+    local_info_t *local = netdev_priv(dev);
     ioaddr_t ioaddr = dev->base_addr;
     unsigned value;
 
@@ -1886,7 +1886,7 @@ do_reset(struct net_device *dev, int ful
 static int
 init_mii(struct net_device *dev)
 {
-    local_info_t *local = dev->priv;
+    local_info_t *local = netdev_priv(dev);
     ioaddr_t ioaddr = dev->base_addr;
     unsigned control, status, linkpartner;
     int i;
@@ -1973,7 +1973,7 @@ static int
 do_stop(struct net_device *dev)
 {
     ioaddr_t ioaddr = dev->base_addr;
-    local_info_t *lp = dev->priv;
+    local_info_t *lp = netdev_priv(dev);
     dev_link_t *link = &lp->link;
 
     DEBUG(0, "do_stop(%p)\n", dev);
--- diff/drivers/net/pcnet32.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/pcnet32.c	2004-04-21 10:45:34.437468208 +0100
@@ -22,8 +22,8 @@
  *************************************************************************/
 
 #define DRV_NAME	"pcnet32"
-#define DRV_VERSION	"1.28"
-#define DRV_RELDATE	"02.20.2004"
+#define DRV_VERSION	"1.29"
+#define DRV_RELDATE	"04.06.2004"
 #define PFX		DRV_NAME ": "
 
 static const char *version =
@@ -102,6 +102,7 @@ static int rx_copybreak = 200;
 #define PCNET32_DMA_MASK 0xffffffff
 
 #define PCNET32_WATCHDOG_TIMEOUT (jiffies + (2 * HZ))
+#define PCNET32_BLINK_TIMEOUT	(jiffies + (HZ/4))
 
 /*
  * table to translate option values from tulip
@@ -232,6 +233,8 @@ static int full_duplex[MAX_UNITS];
  *	   length errors, and transmit hangs.  Cleans up after errors in open.
  *	   Jim Lewis <jklewis@us.ibm.com> added ethernet loopback test.
  *	   Thomas Munck Steenholdt <tmus@tmus.dk> non-mii ioctl corrections.
+ * v1.29   6 Apr 2004 Jim Lewis <jklewis@us.ibm.com> added physical
+ *	   identification code (blink led's).
  */
 
 
@@ -342,6 +345,7 @@ struct pcnet32_private {
     struct net_device	*next;
     struct mii_if_info	mii_if;
     struct timer_list	watchdog_timer;
+    struct timer_list	blink_timer;
     u32			msg_enable;	/* debug message level */
 };
 
@@ -356,6 +360,7 @@ static void pcnet32_tx_timeout (struct n
 static irqreturn_t pcnet32_interrupt(int, void *, struct pt_regs *);
 static int  pcnet32_close(struct net_device *);
 static struct net_device_stats *pcnet32_get_stats(struct net_device *);
+static void pcnet32_load_multicast(struct net_device *dev);
 static void pcnet32_set_multicast_list(struct net_device *);
 static int  pcnet32_ioctl(struct net_device *, struct ifreq *, int);
 static void pcnet32_watchdog(struct net_device *);
@@ -365,6 +370,8 @@ static void pcnet32_restart(struct net_d
 static void pcnet32_ethtool_test(struct net_device *dev,
 	struct ethtool_test *eth_test, u64 *data);
 static int pcnet32_loopback_test(struct net_device *dev, uint64_t *data1);
+static int pcnet32_phys_id(struct net_device *dev, u32 data);
+static void pcnet32_led_blink_callback(struct net_device *dev);
 
 enum pci_flags_bit {
     PCI_USES_IO=1, PCI_USES_MEM=2, PCI_USES_MASTER=4,
@@ -484,11 +491,11 @@ static struct pcnet32_access pcnet32_dwi
 
 #ifdef CONFIG_NET_POLL_CONTROLLER
 static void pcnet32_poll_controller(struct net_device *dev)
-{ 
+{
 	disable_irq(dev->irq);
 	pcnet32_interrupt(0, dev, NULL);
 	enable_irq(dev->irq);
-} 
+}
 #endif
 
 
@@ -611,7 +618,7 @@ static void pcnet32_ethtool_test(struct 
 	    test->flags |= ETH_TEST_FL_FAILED;
 	} else if (netif_msg_hw(lp))
 	    printk(KERN_DEBUG "%s: Loopback test passed.\n", dev->name);
-    } else
+    } else if (netif_msg_hw(lp))
 	printk(KERN_DEBUG "%s: No tests to run (specify 'Offline' on ethtool).",	    dev->name);
 } /* end pcnet32_ethtool_test */
 
@@ -621,34 +628,40 @@ static int pcnet32_loopback_test(struct 
     struct pcnet32_access *a = &lp->a;	/* access to registers */
     ulong ioaddr = dev->base_addr;	/* card base I/O address */
     struct sk_buff *skb;		/* sk buff */
-    int x, y, i;			/* counters */
+    int x, i;				/* counters */
     int numbuffs = 4;			/* number of TX/RX buffers and descs */
     u16 status = 0x8300;		/* TX ring status */
+    u16 teststatus;			/* test of ring status */
     int rc;				/* return code */
     int size;				/* size of packets */
     unsigned char *packet;		/* source packet data */
     static int data_len = 60;		/* length of source packets */
     unsigned long flags;
+    unsigned long ticks;
 
     *data1 = 1;			/* status of test, default to fail */
     rc = 1;			/* default to fail */
 
+    if (netif_running(dev))
+	pcnet32_close(dev);
+
     spin_lock_irqsave(&lp->lock, flags);
-    lp->a.write_csr(ioaddr, 0, 0x7904);
 
-    del_timer_sync(&lp->watchdog_timer);
+    /* Reset the PCNET32 */
+    lp->a.reset (ioaddr);
 
-    netif_stop_queue(dev);
+    /* switch pcnet32 to 32bit mode */
+    lp->a.write_bcr (ioaddr, 20, 2);
+
+    lp->init_block.mode = le16_to_cpu((lp->options & PCNET32_PORT_PORTSEL) << 7);
+    lp->init_block.filter[0] = 0;
+    lp->init_block.filter[1] = 0;
 
     /* purge & init rings but don't actually restart */
     pcnet32_restart(dev, 0x0000);
 
     lp->a.write_csr(ioaddr, 0, 0x0004);	/* Set STOP bit */
 
-    x = a->read_bcr(ioaddr, 32);	/* set internal loopback in BSR32 */
-    x = x | 0x00000002;
-    a->write_bcr(ioaddr, 32, x);
-
     /* Initialize Transmit buffers. */
     size = data_len + 15;
     for (x=0; x<numbuffs; x++) {
@@ -662,19 +675,21 @@ static int pcnet32_loopback_test(struct 
 	    skb_put(skb, size);		/* create space for data */
 	    lp->tx_skbuff[x] = skb;
 	    lp->tx_ring[x].length = le16_to_cpu(-skb->len);
-	    lp->tx_ring[x].misc = 0x00000000;
+	    lp->tx_ring[x].misc = 0;
 
-	    /* put DA and SA into the skb */
-	    for (i=0; i<12; i++)
-		*packet++ = 0xff;
+            /* put DA and SA into the skb */
+	    for (i=0; i<6; i++)
+		*packet++ = dev->dev_addr[i];
+	    for (i=0; i<6; i++)
+		*packet++ = dev->dev_addr[i]; 
 	    /* type */
 	    *packet++ = 0x08;
 	    *packet++ = 0x06;
 	    /* packet number */
 	    *packet++ = x;
 	    /* fill packet with data */
-	    for (y=0; y<data_len; y++)
-		*packet++ = y;
+	    for (i=0; i<data_len; i++)
+		*packet++ = i;
 
 	    lp->tx_dma_addr[x] = pci_map_single(lp->pci_dev, skb->data,
 		    skb->len, PCI_DMA_TODEVICE);
@@ -684,20 +699,41 @@ static int pcnet32_loopback_test(struct 
 	}
     }
 
-    lp->a.write_csr(ioaddr, 0, 0x0002);	/* Set STRT bit */
-    spin_unlock_irqrestore(&lp->lock, flags);
+    x = a->read_bcr(ioaddr, 32);	/* set internal loopback in BSR32 */
+    x = x | 0x0002;
+    a->write_bcr(ioaddr, 32, x);
 
-    mdelay(50);				/* wait a bit */
+    lp->a.write_csr (ioaddr, 15, 0x0044);	/* set int loopback in CSR15 */
 
-    spin_lock_irqsave(&lp->lock, flags);
-    lp->a.write_csr(ioaddr, 0, 0x0004);	/* Set STOP bit */
+    teststatus = le16_to_cpu(0x8000);
+    lp->a.write_csr(ioaddr, 0, 0x0002);		/* Set STRT bit */
 
+    /* Check status of descriptors */
+    for (x=0; x<numbuffs; x++) {
+	ticks = 0;
+	rmb();
+	while ((lp->rx_ring[x].status & teststatus) && (ticks < 200)) {
+	    spin_unlock_irqrestore(&lp->lock, flags);
+	    mdelay(1);
+	    spin_lock_irqsave(&lp->lock, flags);
+	    rmb();
+	    ticks++;
+	}
+	if (ticks == 200) {
+	    if (netif_msg_hw(lp))
+		printk("%s: Desc %d failed to reset!\n",dev->name,x);
+	    break;
+	}
+    }
+
+    lp->a.write_csr(ioaddr, 0, 0x0004);		/* Set STOP bit */
+    wmb();
     if (netif_msg_hw(lp) && netif_msg_pktdata(lp)) {
 	printk(KERN_DEBUG "%s: RX loopback packets:\n", dev->name);
 
 	for (x=0; x<numbuffs; x++) {
 	    printk(KERN_DEBUG "%s: Packet %d:\n", dev->name, x);
-	    skb=lp->rx_skbuff[x];
+	    skb = lp->rx_skbuff[x];
 	    for (i=0; i<size; i++) {
 		printk("%02x ", *(skb->data+i));
 	    }
@@ -730,21 +766,76 @@ clean_up:
     a->write_csr(ioaddr, 15, (x & ~0x0044));	/* reset bits 6 and 2 */
 
     x = a->read_bcr(ioaddr, 32);		/* reset internal loopback */
-    x = x & ~0x00000002;
+    x = x & ~0x0002;
     a->write_bcr(ioaddr, 32, x);
 
-    pcnet32_restart(dev, 0x0042);		/* resume normal operation */
+    spin_unlock_irqrestore(&lp->lock, flags);
 
-    netif_wake_queue(dev);
+    if (netif_running(dev)) {
+	pcnet32_open(dev);
+    } else {
+	lp->a.write_bcr (ioaddr, 20, 4);	/* return to 16bit mode */
+    }
 
-    mod_timer(&(lp->watchdog_timer), PCNET32_WATCHDOG_TIMEOUT);
+    return(rc);
+} /* end pcnet32_loopback_test  */
 
-    /* Clear interrupts, and set interrupt enable. */
-    lp->a.write_csr(ioaddr, 0, 0x7940);
+static void pcnet32_led_blink_callback(struct net_device *dev)
+{
+    struct pcnet32_private *lp = dev->priv;
+    struct pcnet32_access *a = &lp->a;
+    ulong ioaddr = dev->base_addr;
+    unsigned long flags;
+    int i;
+
+    spin_lock_irqsave(&lp->lock, flags);
+    for (i=4; i<8; i++) {
+	a->write_bcr(ioaddr, i, a->read_bcr(ioaddr, i) ^ 0x4000);
+    }
     spin_unlock_irqrestore(&lp->lock, flags);
 
-    return(rc);
-} /* end pcnet32_loopback_test  */
+    mod_timer(&lp->blink_timer, PCNET32_BLINK_TIMEOUT);
+}
+
+static int pcnet32_phys_id(struct net_device *dev, u32 data)
+{
+    struct pcnet32_private *lp = dev->priv;
+    struct pcnet32_access *a = &lp->a;
+    ulong ioaddr = dev->base_addr;
+    unsigned long flags;
+    int i, regs[4];
+
+    if (!lp->blink_timer.function) {
+	init_timer(&lp->blink_timer);
+	lp->blink_timer.function = (void *) pcnet32_led_blink_callback;
+	lp->blink_timer.data = (unsigned long) dev;
+    }
+
+    /* Save the current value of the bcrs */
+    spin_lock_irqsave(&lp->lock, flags);
+    for (i=4; i<8; i++) {
+	regs[i-4] = a->read_bcr(ioaddr, i);
+    }
+    spin_unlock_irqrestore(&lp->lock, flags);
+
+    mod_timer(&lp->blink_timer, jiffies);
+    set_current_state(TASK_INTERRUPTIBLE);
+
+    if ((!data) || (data > (u32)(MAX_SCHEDULE_TIMEOUT / HZ)))
+    data = (u32)(MAX_SCHEDULE_TIMEOUT / HZ);
+
+    schedule_timeout(data * HZ);
+    del_timer_sync(&lp->blink_timer);
+
+    /* Restore the original value of the bcrs */
+    spin_lock_irqsave(&lp->lock, flags);
+    for (i=4; i<8; i++) {
+	a->write_bcr(ioaddr, i, regs[i-4]);
+    }
+    spin_unlock_irqrestore(&lp->lock, flags);
+
+    return 0;
+}
 
 static struct ethtool_ops pcnet32_ethtool_ops = {
     .get_settings	= pcnet32_get_settings,
@@ -761,6 +852,7 @@ static struct ethtool_ops pcnet32_ethtoo
     .get_strings	= pcnet32_get_strings,
     .self_test_count	= pcnet32_self_test_count,
     .self_test		= pcnet32_ethtool_test,
+    .phys_id		= pcnet32_phys_id,
 };
 
 /* only probes for non-PCI devices, the rest are handled by
@@ -793,23 +885,27 @@ pcnet32_probe_pci(struct pci_dev *pdev, 
 
     err = pci_enable_device(pdev);
     if (err < 0) {
-	printk(KERN_ERR PFX "failed to enable device -- err=%d\n", err);
+	if (pcnet32_debug & NETIF_MSG_PROBE)
+	    printk(KERN_ERR PFX "failed to enable device -- err=%d\n", err);
 	return err;
     }
     pci_set_master(pdev);
 
     ioaddr = pci_resource_start (pdev, 0);
     if (!ioaddr) {
-	printk (KERN_ERR PFX "card has no PCI IO resources, aborting\n");
+	if (pcnet32_debug & NETIF_MSG_PROBE)
+	    printk (KERN_ERR PFX "card has no PCI IO resources, aborting\n");
 	return -ENODEV;
     }
 
     if (!pci_dma_supported(pdev, PCNET32_DMA_MASK)) {
-	printk(KERN_ERR PFX "architecture does not support 32bit PCI busmaster DMA\n");
+	if (pcnet32_debug & NETIF_MSG_PROBE)
+	    printk(KERN_ERR PFX "architecture does not support 32bit PCI busmaster DMA\n");
 	return -ENODEV;
     }
     if (request_region(ioaddr, PCNET32_TOTAL_SIZE, "pcnet32_probe_pci") == NULL) {
-	printk(KERN_ERR PFX "io address range already allocated\n");
+	if (pcnet32_debug & NETIF_MSG_PROBE)
+	    printk(KERN_ERR PFX "io address range already allocated\n");
 	return -EBUSY;
     }
 
@@ -847,14 +943,15 @@ pcnet32_probe1(unsigned long ioaddr, uns
 	if (pcnet32_dwio_read_csr(ioaddr, 0) == 4 && pcnet32_dwio_check(ioaddr)) {
 	    a = &pcnet32_dwio;
 	} else
-		goto err_release_region;
+	    goto err_release_region;
     }
 
     chip_version = a->read_csr(ioaddr, 88) | (a->read_csr(ioaddr,89) << 16);
-    if (pcnet32_debug & NETIF_MSG_PROBE)
+    if ((pcnet32_debug & NETIF_MSG_PROBE) && (pcnet32_debug & NETIF_MSG_HW))
 	printk(KERN_INFO "  PCnet chip version is %#x.\n", chip_version);
     if ((chip_version & 0xfff) != 0x003) {
-	printk(KERN_INFO PFX "Unsupported chip version.\n");
+	if (pcnet32_debug & NETIF_MSG_PROBE)
+	    printk(KERN_INFO PFX "Unsupported chip version.\n");
 	goto err_release_region;
     }
 
@@ -909,9 +1006,14 @@ pcnet32_probe1(unsigned long ioaddr, uns
 	chipname = "PCnet/FAST III 79C975"; /* PCI */
 	fdx = 1; mii = 1;
 	break;
+    case 0x2628:
+	chipname = "PCnet/FAST III 79C976";
+	fdx = 1; mii = 1;
+	break;
     default:
-	printk(KERN_INFO PFX "PCnet version %#x, no PCnet32 chip.\n",
-		chip_version);
+	if (pcnet32_debug & NETIF_MSG_PROBE)
+	    printk(KERN_INFO PFX "PCnet version %#x, no PCnet32 chip.\n",
+		    chip_version);
 	goto err_release_region;
     }
 
@@ -920,10 +1022,11 @@ pcnet32_probe1(unsigned long ioaddr, uns
      *	starting until the packet is loaded. Strike one for reliability, lose
      *	one for latency - although on PCI this isnt a big loss. Older chips
      *	have FIFO's smaller than a packet, so you can't do this.
+     *	Turn on BCR18:BurstRdEn and BCR18:BurstWrEn.
      */
 
     if (fset) {
-	a->write_bcr(ioaddr, 18, (a->read_bcr(ioaddr, 18) | 0x0800));
+	a->write_bcr(ioaddr, 18, (a->read_bcr(ioaddr, 18) | 0x0860));
 	a->write_csr(ioaddr, 80, (a->read_csr(ioaddr, 80) & 0x0C00) | 0x0c00);
 	dxsuflo = 1;
 	ltint = 1;
@@ -931,13 +1034,15 @@ pcnet32_probe1(unsigned long ioaddr, uns
 
     dev = alloc_etherdev(0);
     if (!dev) {
-	printk(KERN_ERR PFX "Memory allocation failed.\n");
+	if (pcnet32_debug & NETIF_MSG_PROBE)
+	    printk(KERN_ERR PFX "Memory allocation failed.\n");
 	ret = -ENOMEM;
 	goto err_release_region;
     }
     SET_NETDEV_DEV(dev, &pdev->dev);
 
-    printk(KERN_INFO PFX "%s at %#3lx,", chipname, ioaddr);
+    if (pcnet32_debug & NETIF_MSG_PROBE)
+	printk(KERN_INFO PFX "%s at %#3lx,", chipname, ioaddr);
 
     /* In most chips, after a chip reset, the ethernet address is read from the
      * station address PROM at the base address and programmed into the
@@ -966,8 +1071,10 @@ pcnet32_probe1(unsigned long ioaddr, uns
 	if (!is_valid_ether_addr(dev->dev_addr)
 	    && is_valid_ether_addr(promaddr)) {
 #endif
-	    printk(" warning: CSR address invalid,\n");
-	    printk(KERN_INFO "    using instead PROM address of");
+	    if (pcnet32_debug & NETIF_MSG_PROBE) {
+		printk(" warning: CSR address invalid,\n");
+		printk(KERN_INFO "    using instead PROM address of");
+	    }
 	    memcpy(dev->dev_addr, promaddr, 6);
 	}
     }
@@ -976,36 +1083,40 @@ pcnet32_probe1(unsigned long ioaddr, uns
     if (!is_valid_ether_addr(dev->dev_addr))
 	memset(dev->dev_addr, 0, sizeof(dev->dev_addr));
 
-    for (i = 0; i < 6; i++)
-	printk(" %2.2x", dev->dev_addr[i] );
-
-    if (((chip_version + 1) & 0xfffe) == 0x2624) { /* Version 0x2623 - 0x2624 */
-	i = a->read_csr(ioaddr, 80) & 0x0C00;  /* Check tx_start_pt */
-	printk("\n" KERN_INFO "    tx_start_pt(0x%04x):",i);
-	switch(i>>10) {
-	    case 0: printk("  20 bytes,"); break;
-	    case 1: printk("  64 bytes,"); break;
-	    case 2: printk(" 128 bytes,"); break;
-	    case 3: printk("~220 bytes,"); break;
-	}
-	i = a->read_bcr(ioaddr, 18);  /* Check Burst/Bus control */
-	printk(" BCR18(%x):",i&0xffff);
-	if (i & (1<<5)) printk("BurstWrEn ");
-	if (i & (1<<6)) printk("BurstRdEn ");
-	if (i & (1<<7)) printk("DWordIO ");
-	if (i & (1<<11)) printk("NoUFlow ");
-	i = a->read_bcr(ioaddr, 25);
-	printk("\n" KERN_INFO "    SRAMSIZE=0x%04x,",i<<8);
-	i = a->read_bcr(ioaddr, 26);
-	printk(" SRAM_BND=0x%04x,",i<<8);
-	i = a->read_bcr(ioaddr, 27);
-	if (i & (1<<14)) printk("LowLatRx");
+    if (pcnet32_debug & NETIF_MSG_PROBE) {
+	for (i = 0; i < 6; i++)
+	    printk(" %2.2x", dev->dev_addr[i]);
+
+	/* Version 0x2623 and 0x2624 */
+	if (((chip_version + 1) & 0xfffe) == 0x2624) {
+	    i = a->read_csr(ioaddr, 80) & 0x0C00;  /* Check tx_start_pt */
+	    printk("\n" KERN_INFO "    tx_start_pt(0x%04x):",i);
+	    switch(i>>10) {
+		case 0: printk("  20 bytes,"); break;
+		case 1: printk("  64 bytes,"); break;
+		case 2: printk(" 128 bytes,"); break;
+		case 3: printk("~220 bytes,"); break;
+	    }
+	    i = a->read_bcr(ioaddr, 18);  /* Check Burst/Bus control */
+	    printk(" BCR18(%x):",i&0xffff);
+	    if (i & (1<<5)) printk("BurstWrEn ");
+	    if (i & (1<<6)) printk("BurstRdEn ");
+	    if (i & (1<<7)) printk("DWordIO ");
+	    if (i & (1<<11)) printk("NoUFlow ");
+	    i = a->read_bcr(ioaddr, 25);
+	    printk("\n" KERN_INFO "    SRAMSIZE=0x%04x,",i<<8);
+	    i = a->read_bcr(ioaddr, 26);
+	    printk(" SRAM_BND=0x%04x,",i<<8);
+	    i = a->read_bcr(ioaddr, 27);
+	    if (i & (1<<14)) printk("LowLatRx");
+	}
     }
 
     dev->base_addr = ioaddr;
     /* pci_alloc_consistent returns page-aligned memory, so we do not have to check the alignment */
     if ((lp = pci_alloc_consistent(pdev, sizeof(*lp), &lp_dma_addr)) == NULL) {
-	printk(KERN_ERR PFX "Consistent memory allocation failed.\n");
+	if (pcnet32_debug & NETIF_MSG_PROBE)
+	    printk(KERN_ERR PFX "Consistent memory allocation failed.\n");
 	ret = -ENOMEM;
 	goto err_free_netdev;
     }
@@ -1041,7 +1152,8 @@ pcnet32_probe1(unsigned long ioaddr, uns
 	lp->options |= PCNET32_PORT_FD;
 
     if (!a) {
-	printk(KERN_ERR PFX "No access methods\n");
+	if (pcnet32_debug & NETIF_MSG_PROBE)
+	    printk(KERN_ERR PFX "No access methods\n");
 	ret = -ENODEV;
 	goto err_free_consistent;
     }
@@ -1075,9 +1187,10 @@ pcnet32_probe1(unsigned long ioaddr, uns
 	dev->irq = irq_line;
     }
 
-    if (dev->irq >= 2)
-	printk(" assigned IRQ %d.\n", dev->irq);
-    else {
+    if (dev->irq >= 2) {
+	if (pcnet32_debug & NETIF_MSG_PROBE)
+	    printk(" assigned IRQ %d.\n", dev->irq);
+    } else {
 	unsigned long irq_mask = probe_irq_on();
 
 	/*
@@ -1091,11 +1204,13 @@ pcnet32_probe1(unsigned long ioaddr, uns
 
 	dev->irq = probe_irq_off (irq_mask);
 	if (!dev->irq) {
-	    printk(", failed to detect IRQ line.\n");
+	    if (pcnet32_debug & NETIF_MSG_PROBE)
+		printk(", failed to detect IRQ line.\n");
 	    ret = -ENODEV;
 	    goto err_free_consistent;
 	}
-	printk(", probed IRQ %d.\n", dev->irq);
+	if (pcnet32_debug & NETIF_MSG_PROBE)
+	    printk(", probed IRQ %d.\n", dev->irq);
     }
 
     /* Set the mii phy_id so that we can query the link state */
@@ -1119,7 +1234,7 @@ pcnet32_probe1(unsigned long ioaddr, uns
 
 #ifdef CONFIG_NET_POLL_CONTROLLER
     dev->poll_controller = pcnet32_poll_controller;
-#endif    
+#endif
 
     /* Fill in the generic fields of the device structure. */
     if (register_netdev(dev))
@@ -1132,8 +1247,12 @@ pcnet32_probe1(unsigned long ioaddr, uns
 	pcnet32_dev = dev;
     }
 
-    printk(KERN_INFO "%s: registered as %s\n",dev->name, lp->name);
+    if (pcnet32_debug & NETIF_MSG_PROBE)
+	printk(KERN_INFO "%s: registered as %s\n", dev->name, lp->name);
     cards_found++;
+
+    a->write_bcr(ioaddr, 2, 0x1002);	/* enable LED writes */
+
     return 0;
 
 err_free_consistent:
@@ -1154,13 +1273,15 @@ pcnet32_open(struct net_device *dev)
     u16 val;
     int i;
     int rc;
+    unsigned long flags;
 
     if (dev->irq == 0 ||
 	request_irq(dev->irq, &pcnet32_interrupt,
-		    lp->shared_irq ? SA_SHIRQ : 0, lp->name, (void *)dev)) {
+		    lp->shared_irq ? SA_SHIRQ : 0, dev->name, (void *)dev)) {
 	return -EAGAIN;
     }
 
+    spin_lock_irqsave(&lp->lock, flags);
     /* Check for a valid station address */
     if (!is_valid_ether_addr(dev->dev_addr)) {
 	rc = -EINVAL;
@@ -1241,8 +1362,8 @@ pcnet32_open(struct net_device *dev)
     }
 
     lp->init_block.mode = le16_to_cpu((lp->options & PCNET32_PORT_PORTSEL) << 7);
-    lp->init_block.filter[0] = 0x00000000;
-    lp->init_block.filter[1] = 0x00000000;
+    pcnet32_load_multicast(dev);
+
     if (pcnet32_init_ring(dev)) {
 	rc = -ENOMEM;
 	goto err_free_ring;
@@ -1261,7 +1382,7 @@ pcnet32_open(struct net_device *dev)
 
     /* If we have mii, print the link status and start the watchdog */
     if (lp->mii) {
-	mii_check_media (&lp->mii_if, 1, 1);
+	mii_check_media (&lp->mii_if, netif_msg_link(lp), 1);
 	mod_timer (&(lp->watchdog_timer), PCNET32_WATCHDOG_TIMEOUT);
     }
 
@@ -1281,6 +1402,7 @@ pcnet32_open(struct net_device *dev)
 		    offsetof(struct pcnet32_private, init_block)),
 		lp->a.read_csr(ioaddr, 0));
 
+    spin_unlock_irqrestore(&lp->lock, flags);
 
     return 0;	/* Always succeed */
 
@@ -1303,6 +1425,7 @@ err_free_ring:
     lp->a.write_bcr (ioaddr, 20, 4);
 
 err_free_irq:
+    spin_unlock_irqrestore(&lp->lock, flags);
     free_irq(dev->irq, dev);
     return rc;
 }
@@ -1354,8 +1477,9 @@ pcnet32_init_ring(struct net_device *dev
 	if (rx_skbuff == NULL) {
 	    if (!(rx_skbuff = lp->rx_skbuff[i] = dev_alloc_skb (PKT_BUF_SZ))) {
 		/* there is not much, we can do at this point */
-		printk(KERN_ERR "%s: pcnet32_init_ring dev_alloc_skb failed.\n",
-			dev->name);
+		if (pcnet32_debug & NETIF_MSG_DRV)
+		    printk(KERN_ERR "%s: pcnet32_init_ring dev_alloc_skb failed.\n",
+			    dev->name);
 		return -1;
 	    }
 	    skb_reserve (rx_skbuff, 2);
@@ -1417,8 +1541,9 @@ pcnet32_tx_timeout (struct net_device *d
 
     spin_lock_irqsave(&lp->lock, flags);
     /* Transmitter timeout, serious problems. */
-    printk(KERN_ERR "%s: transmit timed out, status %4.4x, resetting.\n",
-	   dev->name, lp->a.read_csr(ioaddr, 0));
+    if (pcnet32_debug & NETIF_MSG_DRV)
+	printk(KERN_ERR "%s: transmit timed out, status %4.4x, resetting.\n",
+		dev->name, lp->a.read_csr(ioaddr, 0));
     lp->a.write_csr (ioaddr, 0, 0x0004);
     lp->stats.tx_errors++;
     if (netif_msg_tx_err(lp)) {
@@ -1526,7 +1651,8 @@ pcnet32_interrupt(int irq, void *dev_id,
     int must_restart;
 
     if (!dev) {
-	printk (KERN_DEBUG "%s(): irq %d for unknown device\n",
+	if (pcnet32_debug & NETIF_MSG_INTR)
+	    printk (KERN_DEBUG "%s(): irq %d for unknown device\n",
 		__FUNCTION__, irq);
 	return IRQ_NONE;
     }
@@ -1578,8 +1704,9 @@ pcnet32_interrupt(int irq, void *dev_id,
 			lp->stats.tx_fifo_errors++;
 			/* Ackk!  On FIFO errors the Tx unit is turned off! */
 			/* Remove this verbosity later! */
-			printk(KERN_ERR "%s: Tx FIFO error! CSR0=%4.4x\n",
-			       dev->name, csr0);
+			if (netif_msg_tx_err(lp))
+			    printk(KERN_ERR "%s: Tx FIFO error! CSR0=%4.4x\n",
+				    dev->name, csr0);
 			must_restart = 1;
 		    }
 #else
@@ -1588,8 +1715,9 @@ pcnet32_interrupt(int irq, void *dev_id,
 			if (! lp->dxsuflo) {  /* If controller doesn't recover ... */
 			    /* Ackk!  On FIFO errors the Tx unit is turned off! */
 			    /* Remove this verbosity later! */
-			    printk(KERN_ERR "%s: Tx FIFO error! CSR0=%4.4x\n",
-				   dev->name, csr0);
+			    if (netif_msg_tx_err(lp))
+				printk(KERN_ERR "%s: Tx FIFO error! CSR0=%4.4x\n",
+					dev->name, csr0);
 			    must_restart = 1;
 			}
 		    }
@@ -1613,8 +1741,9 @@ pcnet32_interrupt(int irq, void *dev_id,
 
 	    delta = (lp->cur_tx - dirty_tx) & (TX_RING_MOD_MASK + TX_RING_SIZE);
 	    if (delta >= TX_RING_SIZE) {
-		printk(KERN_ERR "%s: out-of-sync dirty pointer, %d vs. %d, full=%d.\n",
-			dev->name, dirty_tx, lp->cur_tx, lp->tx_full);
+		if (netif_msg_drv(lp))
+		    printk(KERN_ERR "%s: out-of-sync dirty pointer, %d vs. %d, full=%d.\n",
+			    dev->name, dirty_tx, lp->cur_tx, lp->tx_full);
 		dirty_tx += TX_RING_SIZE;
 		delta -= TX_RING_SIZE;
 	    }
@@ -1646,8 +1775,9 @@ pcnet32_interrupt(int irq, void *dev_id,
 	    lp->stats.rx_errors++; /* Missed a Rx frame. */
 	}
 	if (csr0 & 0x0800) {
-	    printk(KERN_ERR "%s: Bus master arbitration failure, status %4.4x.\n",
-		   dev->name, csr0);
+	    if (netif_msg_drv(lp))
+		printk(KERN_ERR "%s: Bus master arbitration failure, status %4.4x.\n",
+			dev->name, csr0);
 	    /* unlike for the lance, there is no restart needed */
 	}
 
@@ -1664,7 +1794,7 @@ pcnet32_interrupt(int irq, void *dev_id,
 
     if (netif_msg_intr(lp))
 	printk(KERN_DEBUG "%s: exiting interrupt, csr0=%#4.4x.\n",
-	       dev->name, lp->a.read_csr (ioaddr, 0));
+		dev->name, lp->a.read_csr (ioaddr, 0));
 
     spin_unlock(&lp->lock);
 
@@ -1701,7 +1831,8 @@ pcnet32_rx(struct net_device *dev)
 	    struct sk_buff *skb;
 
 	    if (pkt_len < 60) {
-		printk(KERN_ERR "%s: Runt packet!\n",dev->name);
+		if (netif_msg_rx_err(lp))
+		    printk(KERN_ERR "%s: Runt packet!\n", dev->name);
 		lp->stats.rx_errors++;
 	    } else {
 		int rx_in_place = 0;
@@ -1730,8 +1861,9 @@ pcnet32_rx(struct net_device *dev)
 
 		if (skb == NULL) {
 		    int i;
-		    printk(KERN_ERR "%s: Memory squeeze, deferring packet.\n",
-			    dev->name);
+		    if (netif_msg_drv(lp))
+			printk(KERN_ERR "%s: Memory squeeze, deferring packet.\n",
+				dev->name);
 		    for (i = 0; i < RX_RING_SIZE; i++)
 			if ((short)le16_to_cpu(lp->rx_ring[(entry+i)
 				    & RX_RING_MOD_MASK].status) < 0)
@@ -1786,11 +1918,14 @@ pcnet32_close(struct net_device *dev)
     unsigned long ioaddr = dev->base_addr;
     struct pcnet32_private *lp = dev->priv;
     int i;
+    unsigned long flags;
 
     del_timer_sync(&lp->watchdog_timer);
 
     netif_stop_queue(dev);
 
+    spin_lock_irqsave(&lp->lock, flags);
+
     lp->stats.rx_missed_errors = lp->a.read_csr (ioaddr, 112);
 
     if (netif_msg_ifdown(lp))
@@ -1806,6 +1941,8 @@ pcnet32_close(struct net_device *dev)
      */
     lp->a.write_bcr (ioaddr, 20, 4);
 
+    spin_unlock_irqrestore(&lp->lock, flags);
+
     free_irq(dev->irq, dev);
 
     /* free all allocated skbuffs */
@@ -1900,7 +2037,8 @@ static void pcnet32_set_multicast_list(s
     spin_lock_irqsave(&lp->lock, flags);
     if (dev->flags&IFF_PROMISC) {
 	/* Log any net taps. */
-	printk(KERN_INFO "%s: Promiscuous mode enabled.\n", dev->name);
+	if (netif_msg_hw(lp))
+	    printk(KERN_INFO "%s: Promiscuous mode enabled.\n", dev->name);
 	lp->init_block.mode = le16_to_cpu(0x8000 | (lp->options & PCNET32_PORT_PORTSEL) << 7);
     } else {
 	lp->init_block.mode = le16_to_cpu((lp->options & PCNET32_PORT_PORTSEL) << 7);
@@ -1975,7 +2113,7 @@ static void pcnet32_watchdog(struct net_
     /* Print the link status if it has changed */
     if (lp->mii) {
 	spin_lock_irqsave(&lp->lock, flags);
-	mii_check_media (&lp->mii_if, 1, 0);
+	mii_check_media (&lp->mii_if, netif_msg_link(lp), 0);
 	spin_unlock_irqrestore(&lp->lock, flags);
     }
 
@@ -2023,6 +2161,8 @@ MODULE_AUTHOR("Thomas Bogendoerfer");
 MODULE_DESCRIPTION("Driver for PCnet32 and PCnetPCI based ethercards");
 MODULE_LICENSE("GPL");
 
+#define PCNET32_MSG_DEFAULT (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK)
+
 /* An additional parameter that may be passed in... */
 static int debug = -1;
 static int tx_start_pt = -1;
@@ -2032,8 +2172,7 @@ static int __init pcnet32_init_module(vo
 {
     printk(KERN_INFO "%s", version);
 
-    if (debug >= 0 && debug < (sizeof(int) - 1))
-	pcnet32_debug = 1 << debug;
+    pcnet32_debug = netif_msg_init(debug, PCNET32_MSG_DEFAULT);
 
     if ((tx_start_pt >= 0) && (tx_start_pt <= 3))
 	tx_start = tx_start_pt;
@@ -2046,7 +2185,7 @@ static int __init pcnet32_init_module(vo
     if (pcnet32vlb)
 	pcnet32_probe_vlbus();
 
-    if (cards_found)
+    if (cards_found && (pcnet32_debug & NETIF_MSG_PROBE))
 	printk(KERN_INFO PFX "%d cards_found.\n", cards_found);
 
     return (pcnet32_have_pci + cards_found) ? 0 : -ENODEV;
@@ -2075,7 +2214,6 @@ module_exit(pcnet32_cleanup_module);
 
 /*
  * Local variables:
- *  compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c pcnet32.c"
  *  c-indent-level: 4
  *  tab-width: 8
  * End:
--- diff/drivers/net/ppp_generic.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/ppp_generic.c	2004-04-21 10:45:34.438468056 +0100
@@ -994,7 +994,11 @@ ppp_send_frame(struct ppp *ppp, struct s
 		/* check if we should pass this packet */
 		/* the filter instructions are constructed assuming
 		   a four-byte PPP header on each packet */
-		*skb_push(skb, 2) = 1;
+		{
+			u_int16_t *p = (u_int16_t *) skb_push(skb, 2);
+
+			*p = htons(4); /* indicate outbound in DLT_LINUX_SLL */;
+		}
 		if (ppp->pass_filter.filter
 		    && sk_run_filter(skb, ppp->pass_filter.filter,
 				     ppp->pass_filter.len) == 0) {
@@ -1537,7 +1541,11 @@ ppp_receive_nonmp_frame(struct ppp *ppp,
 		/* check if the packet passes the pass and active filters */
 		/* the filter instructions are constructed assuming
 		   a four-byte PPP header on each packet */
-		*skb_push(skb, 2) = 0;
+		{
+			u_int16_t *p = (u_int16_t *) skb_push(skb, 2);
+
+			*p = 0; /* indicate inbound in DLT_LINUX_SLL */
+		}
 		if (ppp->pass_filter.filter
 		    && sk_run_filter(skb, ppp->pass_filter.filter,
 				     ppp->pass_filter.len) == 0) {
--- diff/drivers/net/r8169.c	2004-03-11 10:20:26.000000000 +0000
+++ source/drivers/net/r8169.c	2004-04-21 10:45:34.441467600 +0100
@@ -40,8 +40,10 @@ VERSION 1.2	<2002/11/30>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/delay.h>
+#include <linux/ethtool.h>
 #include <linux/crc32.h>
 #include <linux/init.h>
+#include <linux/dma-mapping.h>
 
 #include <asm/io.h>
 
@@ -56,9 +58,11 @@ VERSION 1.2	<2002/11/30>
 	        printk( "Assertion failed! %s,%s,%s,line=%d\n",	\
         	#expr,__FILE__,__FUNCTION__,__LINE__);		\
         }
+#define dprintk(fmt, args...)	do { printk(PFX fmt, ## args) } while (0)
 #else
 #define assert(expr) do {} while (0)
-#endif
+#define dprintk(fmt, args...)	do {} while (0)
+#endif /* RTL8169_DEBUG */
 
 /* media options */
 #define MAX_UNITS 8
@@ -89,9 +93,12 @@ static int multicast_filter_limit = 32;
 #define NUM_TX_DESC	64	/* Number of Tx descriptor registers */
 #define NUM_RX_DESC	64	/* Number of Rx descriptor registers */
 #define RX_BUF_SIZE	1536	/* Rx Buffer size */
+#define R8169_TX_RING_BYTES	(NUM_TX_DESC * sizeof(struct TxDesc))
+#define R8169_RX_RING_BYTES	(NUM_RX_DESC * sizeof(struct RxDesc))
 
 #define RTL_MIN_IO_SIZE 0x80
-#define TX_TIMEOUT  (6*HZ)
+#define RTL8169_TX_TIMEOUT	(6*HZ)
+#define RTL8169_PHY_TIMEOUT	(HZ) 
 
 /* write/read MMIO register */
 #define RTL_W8(reg, val8)	writeb ((val8), ioaddr + (reg))
@@ -101,11 +108,35 @@ static int multicast_filter_limit = 32;
 #define RTL_R16(reg)		readw (ioaddr + (reg))
 #define RTL_R32(reg)		((unsigned long) readl (ioaddr + (reg)))
 
-static struct {
+enum mac_version {
+	RTL_GIGA_MAC_VER_B = 0x00,
+	/* RTL_GIGA_MAC_VER_C = 0x03, */
+	RTL_GIGA_MAC_VER_D = 0x01,
+	RTL_GIGA_MAC_VER_E = 0x02
+};
+
+enum phy_version {
+	RTL_GIGA_PHY_VER_C = 0x03, /* PHY Reg 0x03 bit0-3 == 0x0000 */
+	RTL_GIGA_PHY_VER_D = 0x04, /* PHY Reg 0x03 bit0-3 == 0x0000 */
+	RTL_GIGA_PHY_VER_E = 0x05, /* PHY Reg 0x03 bit0-3 == 0x0000 */
+	RTL_GIGA_PHY_VER_F = 0x06, /* PHY Reg 0x03 bit0-3 == 0x0001 */
+	RTL_GIGA_PHY_VER_G = 0x07, /* PHY Reg 0x03 bit0-3 == 0x0002 */
+};
+
+
+#define _R(NAME,MAC,MASK) \
+	{ .name = NAME, .mac_version = MAC, .RxConfigMask = MASK }
+
+const static struct {
 	const char *name;
-} board_info[] __devinitdata = {
-	{
-"RealTek RTL8169 Gigabit Ethernet"},};
+	u8 mac_version;
+	u32 RxConfigMask;	/* Clears the bits supported by this chip */
+} rtl_chip_info[] = {
+	_R("RTL8169",		RTL_GIGA_MAC_VER_B, 0xff7e1880),
+	_R("RTL8169s/8110s",	RTL_GIGA_MAC_VER_D, 0xff7e1880),
+	_R("RTL8169s/8110s",	RTL_GIGA_MAC_VER_E, 0xff7e1880)
+};
+#undef _R
 
 static struct pci_device_id rtl8169_pci_tbl[] = {
 	{0x10ec, 0x8169, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
@@ -114,11 +145,15 @@ static struct pci_device_id rtl8169_pci_
 
 MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);
 
+static int rx_copybreak = 200;
+
 enum RTL8169_registers {
 	MAC0 = 0,		/* Ethernet hardware address. */
 	MAR0 = 8,		/* Multicast filter. */
-	TxDescStartAddr = 0x20,
-	TxHDescStartAddr = 0x28,
+	TxDescStartAddrLow = 0x20,
+	TxDescStartAddrHigh = 0x24,
+	TxHDescStartAddrLow = 0x28,
+	TxHDescStartAddrHigh = 0x2c,
 	FLASH = 0x30,
 	ERSR = 0x36,
 	ChipCmd = 0x37,
@@ -143,7 +178,8 @@ enum RTL8169_registers {
 	PHYstatus = 0x6C,
 	RxMaxSize = 0xDA,
 	CPlusCmd = 0xE0,
-	RxDescStartAddr = 0xE4,
+	RxDescAddrLow = 0xE4,
+	RxDescAddrHigh = 0xE8,
 	EarlyTxThres = 0xEC,
 	FuncEvent = 0xF0,
 	FuncEventMask = 0xF4,
@@ -195,7 +231,13 @@ enum RTL8169_register_content {
 
 	/*TxConfigBits */
 	TxInterFrameGapShift = 24,
-	TxDMAShift = 8,		/* DMA burst value (0-7) is shift this many bits */
+	TxDMAShift = 8,	/* DMA burst value (0-7) is shift this many bits */
+
+	/* CPlusCmd p.31 */
+	RxVlan		= (1 << 6),
+	RxChkSum	= (1 << 5),
+	PCIDAC		= (1 << 4),
+	PCIMulRW	= (1 << 3),
 
 	/*rtl8169_PHYstatus */
 	TBI_Enable = 0x80,
@@ -242,14 +284,6 @@ enum RTL8169_register_content {
 	TBILinkOK = 0x02000000,
 };
 
-const static struct {
-	const char *name;
-	u8 version;		/* depend on RTL8169 docs */
-	u32 RxConfigMask;	/* should clear the bits supported by this chip */
-} rtl_chip_info[] = {
-	{
-"RTL-8169", 0x00, 0xff7e1880,},};
-
 enum _DescStatusBit {
 	OWNbit = 0x80000000,
 	EORbit = 0x40000000,
@@ -257,18 +291,18 @@ enum _DescStatusBit {
 	LSbit = 0x10000000,
 };
 
+#define RsvdMask	0x3fffc000
+
 struct TxDesc {
 	u32 status;
 	u32 vlan_tag;
-	u32 buf_addr;
-	u32 buf_Haddr;
+	u64 addr;
 };
 
 struct RxDesc {
 	u32 status;
 	u32 vlan_tag;
-	u32 buf_addr;
-	u32 buf_Haddr;
+	u64 addr;
 };
 
 struct rtl8169_private {
@@ -277,28 +311,34 @@ struct rtl8169_private {
 	struct net_device_stats stats;	/* statistics of net device */
 	spinlock_t lock;	/* spin lock flag */
 	int chipset;
-	unsigned long cur_rx;	/* Index into the Rx descriptor buffer of next Rx pkt. */
-	unsigned long cur_tx;	/* Index into the Tx descriptor buffer of next Rx pkt. */
-	unsigned long dirty_tx;
-	unsigned char *TxDescArrays;	/* Index of Tx Descriptor buffer */
-	unsigned char *RxDescArrays;	/* Index of Rx Descriptor buffer */
+	int mac_version;
+	int phy_version;
+	u32 cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
+	u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
+	u32 dirty_rx;
+	u32 dirty_tx;
 	struct TxDesc *TxDescArray;	/* Index of 256-alignment Tx Descriptor buffer */
 	struct RxDesc *RxDescArray;	/* Index of 256-alignment Rx Descriptor buffer */
-	unsigned char *RxBufferRings;	/* Index of Rx Buffer  */
-	unsigned char *RxBufferRing[NUM_RX_DESC];	/* Index of Rx Buffer array */
+	dma_addr_t TxPhyAddr;
+	dma_addr_t RxPhyAddr;
+	struct sk_buff *Rx_skbuff[NUM_RX_DESC];	/* Rx data buffers */
 	struct sk_buff *Tx_skbuff[NUM_TX_DESC];	/* Index of Transmit data buffer */
+	struct timer_list timer;
+	unsigned long phy_link_down_cnt;
+	u16 cp_cmd;
 };
 
 MODULE_AUTHOR("Realtek");
 MODULE_DESCRIPTION("RealTek RTL-8169 Gigabit Ethernet driver");
 MODULE_PARM(media, "1-" __MODULE_STRING(MAX_UNITS) "i");
+MODULE_PARM(rx_copybreak, "i");
 MODULE_LICENSE("GPL");
 
 static int rtl8169_open(struct net_device *dev);
 static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev);
 static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance,
 			      struct pt_regs *regs);
-static void rtl8169_init_ring(struct net_device *dev);
+static int rtl8169_init_ring(struct net_device *dev);
 static void rtl8169_hw_start(struct net_device *dev);
 static int rtl8169_close(struct net_device *dev);
 static void rtl8169_set_rx_mode(struct net_device *dev);
@@ -306,13 +346,16 @@ static void rtl8169_tx_timeout(struct ne
 static struct net_device_stats *rtl8169_get_stats(struct net_device *netdev);
 
 static const u16 rtl8169_intr_mask =
-    SYSErr | PCSTimeout | RxUnderrun | RxOverflow | RxFIFOOver | TxErr | TxOK |
-    RxErr | RxOK;
+    RxUnderrun | RxOverflow | RxFIFOOver | TxErr | TxOK | RxErr | RxOK;
 static const unsigned int rtl8169_rx_config =
     (RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift);
 
-void
-mdio_write(void *ioaddr, int RegAddr, int value)
+#define PHY_Cap_10_Half_Or_Less PHY_Cap_10_Half
+#define PHY_Cap_10_Full_Or_Less PHY_Cap_10_Full | PHY_Cap_10_Half_Or_Less
+#define PHY_Cap_100_Half_Or_Less PHY_Cap_100_Half | PHY_Cap_10_Full_Or_Less
+#define PHY_Cap_100_Full_Or_Less PHY_Cap_100_Full | PHY_Cap_100_Half_Or_Less
+
+static void mdio_write(void *ioaddr, int RegAddr, int value)
 {
 	int i;
 
@@ -329,8 +372,7 @@ mdio_write(void *ioaddr, int RegAddr, in
 	}
 }
 
-int
-mdio_read(void *ioaddr, int RegAddr)
+static int mdio_read(void *ioaddr, int RegAddr)
 {
 	int i, value = -1;
 
@@ -342,13 +384,272 @@ mdio_read(void *ioaddr, int RegAddr)
 		if (RTL_R32(PHYAR) & 0x80000000) {
 			value = (int) (RTL_R32(PHYAR) & 0xFFFF);
 			break;
-		} else {
-			udelay(100);
 		}
+		udelay(100);
 	}
 	return value;
 }
 
+static void rtl8169_get_drvinfo(struct net_device *dev,
+				struct ethtool_drvinfo *info)
+{
+	struct rtl8169_private *tp = dev->priv;
+
+	strcpy(info->driver, RTL8169_DRIVER_NAME);
+	strcpy(info->version, RTL8169_VERSION );
+	strcpy(info->bus_info, pci_name(tp->pci_dev));
+}
+
+static struct ethtool_ops rtl8169_ethtool_ops = {
+	.get_drvinfo		= rtl8169_get_drvinfo,
+};
+
+static void rtl8169_write_gmii_reg_bit(void *ioaddr, int reg, int bitnum,
+				       int bitval)
+{
+	int val;
+
+	val = mdio_read(ioaddr, reg);
+	val = (bitval == 1) ?
+		val | (bitval << bitnum) :  val & ~(0x0001 << bitnum);
+	mdio_write(ioaddr, reg, val & 0xffff); 
+}
+
+static void rtl8169_get_mac_version(struct rtl8169_private *tp, void *ioaddr)
+{
+	const struct {
+		u32 mask;
+		int mac_version;
+	} mac_info[] = {
+		{ 0x1 << 26,	RTL_GIGA_MAC_VER_E },
+		{ 0x1 << 23,	RTL_GIGA_MAC_VER_D }, 
+		{ 0x00000000,	RTL_GIGA_MAC_VER_B } /* Catch-all */
+	}, *p = mac_info;
+	u32 reg;
+
+	reg = RTL_R32(TxConfig) & 0x7c800000;
+	while ((reg & p->mask) != p->mask)
+		p++;
+	tp->mac_version = p->mac_version;
+}
+
+static void rtl8169_print_mac_version(struct rtl8169_private *tp)
+{
+	struct {
+		int version;
+		char *msg;
+	} mac_print[] = {
+		{ RTL_GIGA_MAC_VER_E, "RTL_GIGA_MAC_VER_E" },
+		{ RTL_GIGA_MAC_VER_D, "RTL_GIGA_MAC_VER_D" },
+		{ RTL_GIGA_MAC_VER_B, "RTL_GIGA_MAC_VER_B" },
+		{ 0, NULL }
+	}, *p;
+
+	for (p = mac_print; p->msg; p++) {
+		if (tp->mac_version == p->version) {
+			dprintk("mac_version == %s (%04d)\n", p->msg,
+				  p->version);
+			return;
+		}
+	}
+	dprintk("mac_version == Unknown\n");
+}
+
+static void rtl8169_get_phy_version(struct rtl8169_private *tp, void *ioaddr)
+{
+	const struct {
+		u16 mask;
+		u16 set;
+		int phy_version;
+	} phy_info[] = {
+		{ 0x000f, 0x0002, RTL_GIGA_PHY_VER_G },
+		{ 0x000f, 0x0001, RTL_GIGA_PHY_VER_F },
+		{ 0x000f, 0x0000, RTL_GIGA_PHY_VER_E },
+		{ 0x0000, 0x0000, RTL_GIGA_PHY_VER_D } /* Catch-all */
+	}, *p = phy_info;
+	u16 reg;
+
+	reg = mdio_read(ioaddr, 3) & 0xffff;
+	while ((reg & p->mask) != p->set)
+		p++;
+	tp->phy_version = p->phy_version;
+}
+
+static void rtl8169_print_phy_version(struct rtl8169_private *tp)
+{
+	struct {
+		int version;
+		char *msg;
+		u32 reg;
+	} phy_print[] = {
+		{ RTL_GIGA_PHY_VER_G, "RTL_GIGA_PHY_VER_G", 0x0002 },
+		{ RTL_GIGA_PHY_VER_F, "RTL_GIGA_PHY_VER_F", 0x0001 },
+		{ RTL_GIGA_PHY_VER_E, "RTL_GIGA_PHY_VER_E", 0x0000 },
+		{ RTL_GIGA_PHY_VER_D, "RTL_GIGA_PHY_VER_D", 0x0000 },
+		{ 0, NULL, 0x0000 }
+	}, *p;
+
+	for (p = phy_print; p->msg; p++) {
+		if (tp->phy_version == p->version) {
+			dprintk("phy_version == %s (%04x)\n", p->msg, p->reg);
+			return;
+		}
+	}
+	dprintk("phy_version == Unknown\n");
+}
+
+static void rtl8169_hw_phy_config(struct net_device *dev)
+{
+	struct rtl8169_private *tp = dev->priv;
+	void *ioaddr = tp->mmio_addr;
+	struct {
+		u16 regs[5]; /* Beware of bit-sign propagation */
+	} phy_magic[5] = { {
+		{ 0x0000,	//w 4 15 12 0
+		  0x00a1,	//w 3 15 0 00a1
+		  0x0008,	//w 2 15 0 0008
+		  0x1020,	//w 1 15 0 1020
+		  0x1000 } },{	//w 0 15 0 1000
+		{ 0x7000,	//w 4 15 12 7
+		  0xff41,	//w 3 15 0 ff41
+		  0xde60,	//w 2 15 0 de60
+		  0x0140,	//w 1 15 0 0140
+		  0x0077 } },{	//w 0 15 0 0077
+		{ 0xa000,	//w 4 15 12 a
+		  0xdf01,	//w 3 15 0 df01
+		  0xdf20,	//w 2 15 0 df20
+		  0xff95,	//w 1 15 0 ff95
+		  0xfa00 } },{	//w 0 15 0 fa00
+		{ 0xb000,	//w 4 15 12 b
+		  0xff41,	//w 3 15 0 ff41
+		  0xde20,	//w 2 15 0 de20
+		  0x0140,	//w 1 15 0 0140
+		  0x00bb } },{	//w 0 15 0 00bb
+		{ 0xf000,	//w 4 15 12 f
+		  0xdf01,	//w 3 15 0 df01
+		  0xdf20,	//w 2 15 0 df20
+		  0xff95,	//w 1 15 0 ff95
+		  0xbf00 }	//w 0 15 0 bf00
+		}
+	}, *p = phy_magic;
+	int i;
+
+	rtl8169_print_mac_version(tp);
+	rtl8169_print_phy_version(tp);
+
+	if (tp->mac_version <= RTL_GIGA_MAC_VER_B)
+		return;
+	if (tp->phy_version >= RTL_GIGA_PHY_VER_F) 
+		return;
+
+	dprintk("MAC version != 0 && PHY version == 0 or 1\n");
+	dprintk("Do final_reg2.cfg\n");
+
+	/* Shazam ! */
+
+	// phy config for RTL8169s mac_version C chip
+	mdio_write(ioaddr, 31, 0x0001);			//w 31 2 0 1
+	mdio_write(ioaddr, 21, 0x1000);			//w 21 15 0 1000
+	mdio_write(ioaddr, 24, 0x65c7);			//w 24 15 0 65c7
+	rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 0);	//w 4 11 11 0
+
+	for (i = 0; i < ARRAY_SIZE(phy_magic); i++, p++) {
+		int val, pos = 4;
+
+		val = (mdio_read(ioaddr, pos) & 0x0fff) | (p->regs[0] & 0xffff);
+		mdio_write(ioaddr, pos, val);
+		while (--pos >= 0)
+			mdio_write(ioaddr, pos, p->regs[4 - pos] & 0xffff);
+		rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 1); //w 4 11 11 1
+		rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 0); //w 4 11 11 0
+	}
+	mdio_write(ioaddr, 31, 0x0000); //w 31 2 0 0
+}
+
+static void rtl8169_hw_phy_reset(struct net_device *dev)
+{
+	struct rtl8169_private *tp = dev->priv;
+	void *ioaddr = tp->mmio_addr;
+	int i, val;
+
+	printk(KERN_WARNING PFX "%s: Reset RTL8169s PHY\n", dev->name);
+
+	val = (mdio_read(ioaddr, 0) | 0x8000) & 0xffff;
+	mdio_write(ioaddr, 0, val);
+
+	for (i = 50; i >= 0; i--) {
+		if (!(mdio_read(ioaddr, 0) & 0x8000))
+			break;
+		udelay(100); /* Gross */
+	}
+
+	if (i < 0) {
+		printk(KERN_WARNING PFX "%s: no PHY Reset ack. Giving up.\n",
+		       dev->name);
+	}
+}
+
+static void rtl8169_phy_timer(unsigned long __opaque)
+{
+	struct net_device *dev = (struct net_device *)__opaque;
+	struct rtl8169_private *tp = dev->priv;
+	struct timer_list *timer = &tp->timer;
+	void *ioaddr = tp->mmio_addr;
+
+	assert(tp->mac_version > RTL_GIGA_MAC_VER_B);
+	assert(tp->phy_version < RTL_GIGA_PHY_VER_G);
+
+	if (RTL_R8(PHYstatus) & LinkStatus)
+		tp->phy_link_down_cnt = 0;
+	else {
+		tp->phy_link_down_cnt++;
+		if (tp->phy_link_down_cnt >= 12) {
+			int reg;
+
+			// If link on 1000, perform phy reset.
+			reg = mdio_read(ioaddr, PHY_1000_CTRL_REG);
+			if (reg & PHY_Cap_1000_Full) 
+				rtl8169_hw_phy_reset(dev);
+
+			tp->phy_link_down_cnt = 0;
+		}
+	}
+
+	mod_timer(timer, jiffies + RTL8169_PHY_TIMEOUT);
+}
+
+static inline void rtl8169_delete_timer(struct net_device *dev)
+{
+	struct rtl8169_private *tp = dev->priv;
+	struct timer_list *timer = &tp->timer;
+
+	if ((tp->mac_version <= RTL_GIGA_MAC_VER_B) ||
+	    (tp->phy_version >= RTL_GIGA_PHY_VER_G))
+		return;
+
+	del_timer_sync(timer);
+
+	tp->phy_link_down_cnt = 0;
+}
+
+static inline void rtl8169_request_timer(struct net_device *dev)
+{
+	struct rtl8169_private *tp = dev->priv;
+	struct timer_list *timer = &tp->timer;
+
+	if ((tp->mac_version <= RTL_GIGA_MAC_VER_B) ||
+	    (tp->phy_version >= RTL_GIGA_PHY_VER_G))
+		return;
+
+	tp->phy_link_down_cnt = 0;
+
+	init_timer(timer);
+	timer->expires = jiffies + RTL8169_PHY_TIMEOUT;
+	timer->data = (unsigned long)(dev);
+	timer->function = rtl8169_phy_timer;
+	add_timer(timer);
+}
+
 static int __devinit
 rtl8169_init_board(struct pci_dev *pdev, struct net_device **dev_out,
 		   void **ioaddr_out)
@@ -356,9 +657,9 @@ rtl8169_init_board(struct pci_dev *pdev,
 	void *ioaddr = NULL;
 	struct net_device *dev;
 	struct rtl8169_private *tp;
-	int rc, i;
 	unsigned long mmio_start, mmio_end, mmio_flags, mmio_len;
-	u32 tmp;
+	int rc, i, acpi_idle_state = 0, pm_cap;
+
 
 	assert(pdev != NULL);
 	assert(ioaddr_out != NULL);
@@ -379,8 +680,22 @@ rtl8169_init_board(struct pci_dev *pdev,
 
 	// enable device (incl. PCI PM wakeup and hotplug setup)
 	rc = pci_enable_device(pdev);
-	if (rc)
+	if (rc) {
+		printk(KERN_ERR PFX "%s: unable to enable device\n", pdev->slot_name);
 		goto err_out;
+	}
+
+	/* save power state before pci_enable_device overwrites it */
+	pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM);
+	if (pm_cap) {
+		u16 pwr_command;
+
+		pci_read_config_word(pdev, pm_cap + PCI_PM_CTRL, &pwr_command);
+		acpi_idle_state = pwr_command & PCI_PM_CTRL_STATE_MASK;
+	} else {
+		printk(KERN_ERR PFX "Cannot find PowerManagement capability, aborting.\n");
+		goto err_out_free_res;
+	}
 
 	mmio_start = pci_resource_start(pdev, 1);
 	mmio_end = pci_resource_end(pdev, 1);
@@ -402,8 +717,24 @@ rtl8169_init_board(struct pci_dev *pdev,
 	}
 
 	rc = pci_request_regions(pdev, dev->name);
-	if (rc)
+	if (rc) {
+		printk(KERN_ERR PFX "%s: Could not request regions.\n", pdev->slot_name);
 		goto err_out_disable;
+	}
+
+	tp->cp_cmd = PCIMulRW | RxChkSum;
+
+	if ((sizeof(dma_addr_t) > 32) &&
+	    !pci_set_dma_mask(pdev, DMA_64BIT_MASK))
+		tp->cp_cmd |= PCIDAC;
+	else {
+		rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+		if (rc < 0) {
+			printk(KERN_ERR PFX "DMA configuration failed.\n");
+			goto err_out_free_res;
+		}
+	}
+
 
 	// enable PCI bus-mastering
 	pci_set_master(pdev);
@@ -420,30 +751,32 @@ rtl8169_init_board(struct pci_dev *pdev,
 	RTL_W8(ChipCmd, CmdReset);
 
 	// Check that the chip has finished the reset.
-	for (i = 1000; i > 0; i--)
+	for (i = 1000; i > 0; i--) {
 		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
 			break;
-		else
-			udelay(10);
+		udelay(10);
+	}
 
-	// identify chip attached to board
-	tmp = RTL_R32(TxConfig);
-	tmp = ((tmp & 0x7c000000) + ((tmp & 0x00800000) << 2)) >> 24;
-
-	for (i = ARRAY_SIZE(rtl_chip_info) - 1; i >= 0; i--)
-		if (tmp == rtl_chip_info[i].version) {
-			tp->chipset = i;
-			goto match;
-		}
-	//if unknown chip, assume array element #0, original RTL-8169 in this case
-	printk(KERN_DEBUG PFX
-	       "PCI device %s: unknown chip version, assuming RTL-8169\n",
-	       pci_name(pdev));
-	printk(KERN_DEBUG PFX "PCI device %s: TxConfig = 0x%lx\n",
-	       pci_name(pdev), (unsigned long) RTL_R32(TxConfig));
-	tp->chipset = 0;
+	// Identify chip attached to board
+	rtl8169_get_mac_version(tp, ioaddr);
+	rtl8169_get_phy_version(tp, ioaddr);
+
+	rtl8169_print_mac_version(tp);
+	rtl8169_print_phy_version(tp);
+
+	for (i = ARRAY_SIZE(rtl_chip_info) - 1; i >= 0; i--) {
+		if (tp->mac_version == rtl_chip_info[i].mac_version)
+			break;
+	}
+	if (i < 0) {
+		/* Unknown chip: assume array element #0, original RTL-8169 */
+		printk(KERN_DEBUG PFX
+		       "PCI device %s: unknown chip version, assuming %s\n",
+		       pci_name(pdev), rtl_chip_info[0].name);
+		i++;
+	}
+	tp->chipset = i;
 
-match:
 	*ioaddr_out = ioaddr;
 	*dev_out = dev;
 	return 0;
@@ -496,10 +829,11 @@ rtl8169_init_one(struct pci_dev *pdev, c
 	dev->open = rtl8169_open;
 	dev->hard_start_xmit = rtl8169_start_xmit;
 	dev->get_stats = rtl8169_get_stats;
+	dev->ethtool_ops = &rtl8169_ethtool_ops;
 	dev->stop = rtl8169_close;
 	dev->tx_timeout = rtl8169_tx_timeout;
 	dev->set_multicast_list = rtl8169_set_rx_mode;
-	dev->watchdog_timeo = TX_TIMEOUT;
+	dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
 	dev->irq = pdev->irq;
 	dev->base_addr = (unsigned long) ioaddr;
 //      dev->do_ioctl           = mii_ioctl;
@@ -528,12 +862,29 @@ rtl8169_init_one(struct pci_dev *pdev, c
 	       "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x, "
 	       "IRQ %d\n",
 	       dev->name,
-	       board_info[ent->driver_data].name,
+	       rtl_chip_info[ent->driver_data].name,
 	       dev->base_addr,
 	       dev->dev_addr[0], dev->dev_addr[1],
 	       dev->dev_addr[2], dev->dev_addr[3],
 	       dev->dev_addr[4], dev->dev_addr[5], dev->irq);
 
+	rtl8169_hw_phy_config(dev);
+
+	dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
+	RTL_W8(0x82, 0x01);
+
+	if (tp->mac_version < RTL_GIGA_MAC_VER_E) {
+		dprintk("Set PCI Latency=0x40\n");
+		pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0x40);
+	}
+
+	if (tp->mac_version == RTL_GIGA_MAC_VER_D) {
+		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
+		RTL_W8(0x82, 0x01);
+		dprintk("Set PHY Reg 0x0bh = 0x00h\n");
+		mdio_write(ioaddr, 0x0b, 0x0000); //w 0x0b 15 0 0
+	}
+
 	// if TBI is not endbled
 	if (!(RTL_R8(PHYstatus) & TBI_Enable)) {
 		int val = mdio_read(ioaddr, PHY_AUTO_NEGO_REG);
@@ -546,23 +897,23 @@ rtl8169_init_one(struct pci_dev *pdev, c
 			Cap10_100 = 0, Cap1000 = 0;
 			switch (option) {
 			case _10_Half:
-				Cap10_100 = PHY_Cap_10_Half;
+				Cap10_100 = PHY_Cap_10_Half_Or_Less;
 				Cap1000 = PHY_Cap_Null;
 				break;
 			case _10_Full:
-				Cap10_100 = PHY_Cap_10_Full;
+				Cap10_100 = PHY_Cap_10_Full_Or_Less;
 				Cap1000 = PHY_Cap_Null;
 				break;
 			case _100_Half:
-				Cap10_100 = PHY_Cap_100_Half;
+				Cap10_100 = PHY_Cap_100_Half_Or_Less;
 				Cap1000 = PHY_Cap_Null;
 				break;
 			case _100_Full:
-				Cap10_100 = PHY_Cap_100_Full;
+				Cap10_100 = PHY_Cap_100_Full_Or_Less;
 				Cap1000 = PHY_Cap_Null;
 				break;
 			case _1000_Full:
-				Cap10_100 = PHY_Cap_Null;
+				Cap10_100 = PHY_Cap_100_Full_Or_Less;
 				Cap1000 = PHY_Cap_1000_Full;
 				break;
 			default:
@@ -576,9 +927,7 @@ rtl8169_init_one(struct pci_dev *pdev, c
 
 			// enable 10/100 Full/Half Mode, leave PHY_AUTO_NEGO_REG bit4:0 unchanged
 			mdio_write(ioaddr, PHY_AUTO_NEGO_REG,
-				   PHY_Cap_10_Half | PHY_Cap_10_Full |
-				   PHY_Cap_100_Half | PHY_Cap_100_Full | (val &
-									  0x1F));
+				   PHY_Cap_100_Full_Or_Less | (val & 0x1f));
 
 			// enable 1000 Full Mode
 			mdio_write(ioaddr, PHY_1000_CTRL_REG,
@@ -647,56 +996,96 @@ rtl8169_remove_one(struct pci_dev *pdev)
 	pci_set_drvdata(pdev, NULL);
 }
 
+#ifdef CONFIG_PM
+
+static int rtl8169_suspend(struct pci_dev *pdev, u32 state)
+{
+	struct net_device *dev = pci_get_drvdata(pdev);
+	struct rtl8169_private *tp = dev->priv;
+	void *ioaddr = tp->mmio_addr;
+	unsigned long flags;
+
+	if (!netif_running(dev))
+		return 0;
+	
+	netif_device_detach(dev);
+	netif_stop_queue(dev);
+	spin_lock_irqsave(&tp->lock, flags);
+
+	/* Disable interrupts, stop Rx and Tx */
+	RTL_W16(IntrMask, 0);
+	RTL_W8(ChipCmd, 0);
+		
+	/* Update the error counts. */
+	tp->stats.rx_missed_errors += RTL_R32(RxMissed);
+	RTL_W32(RxMissed, 0);
+	spin_unlock_irqrestore(&tp->lock, flags);
+	
+	return 0;
+}
+
+static int rtl8169_resume(struct pci_dev *pdev)
+{
+	struct net_device *dev = pci_get_drvdata(pdev);
+
+	if (!netif_running(dev))
+	    return 0;
+
+	netif_device_attach(dev);
+	rtl8169_hw_start(dev);
+
+	return 0;
+}
+                                                                                
+#endif /* CONFIG_PM */
+
 static int
 rtl8169_open(struct net_device *dev)
 {
 	struct rtl8169_private *tp = dev->priv;
+	struct pci_dev *pdev = tp->pci_dev;
 	int retval;
-	u8 diff;
-	u32 TxPhyAddr, RxPhyAddr;
 
 	retval =
 	    request_irq(dev->irq, rtl8169_interrupt, SA_SHIRQ, dev->name, dev);
-	if (retval) {
-		return retval;
-	}
+	if (retval < 0)
+		goto out;
 
-	tp->TxDescArrays =
-	    kmalloc(NUM_TX_DESC * sizeof (struct TxDesc) + 256, GFP_KERNEL);
-	// Tx Desscriptor needs 256 bytes alignment;
-	TxPhyAddr = virt_to_bus(tp->TxDescArrays);
-	diff = 256 - (TxPhyAddr - ((TxPhyAddr >> 8) << 8));
-	TxPhyAddr += diff;
-	tp->TxDescArray = (struct TxDesc *) (tp->TxDescArrays + diff);
-
-	tp->RxDescArrays =
-	    kmalloc(NUM_RX_DESC * sizeof (struct RxDesc) + 256, GFP_KERNEL);
-	// Rx Desscriptor needs 256 bytes alignment;
-	RxPhyAddr = virt_to_bus(tp->RxDescArrays);
-	diff = 256 - (RxPhyAddr - ((RxPhyAddr >> 8) << 8));
-	RxPhyAddr += diff;
-	tp->RxDescArray = (struct RxDesc *) (tp->RxDescArrays + diff);
+	retval = -ENOMEM;
 
-	if (tp->TxDescArrays == NULL || tp->RxDescArrays == NULL) {
-		printk(KERN_INFO
-		       "Allocate RxDescArray or TxDescArray failed\n");
-		free_irq(dev->irq, dev);
-		if (tp->TxDescArrays)
-			kfree(tp->TxDescArrays);
-		if (tp->RxDescArrays)
-			kfree(tp->RxDescArrays);
-		return -ENOMEM;
-	}
-	tp->RxBufferRings = kmalloc(RX_BUF_SIZE * NUM_RX_DESC, GFP_KERNEL);
-	if (tp->RxBufferRings == NULL) {
-		printk(KERN_INFO "Allocate RxBufferRing failed\n");
-	}
+	/*
+	 * Rx and Tx desscriptors needs 256 bytes alignment.
+	 * pci_alloc_consistent provides more.
+	 */
+	tp->TxDescArray = pci_alloc_consistent(pdev, R8169_TX_RING_BYTES,
+					       &tp->TxPhyAddr);
+	if (!tp->TxDescArray)
+		goto err_free_irq;
+
+	tp->RxDescArray = pci_alloc_consistent(pdev, R8169_RX_RING_BYTES,
+					       &tp->RxPhyAddr);
+	if (!tp->RxDescArray)
+		goto err_free_tx;
+
+	retval = rtl8169_init_ring(dev);
+	if (retval < 0)
+		goto err_free_rx;
 
-	rtl8169_init_ring(dev);
 	rtl8169_hw_start(dev);
 
-	return 0;
-
+	rtl8169_request_timer(dev);
+out:
+	return retval;
+
+err_free_rx:
+	pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
+			    tp->RxPhyAddr);
+err_free_tx:
+	pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
+			    tp->TxPhyAddr);
+err_free_irq:
+	free_irq(dev->irq, dev);
+	goto out;
 }
 
 static void
@@ -733,11 +1122,21 @@ rtl8169_hw_start(struct net_device *dev)
 	RTL_W32(TxConfig,
 		(TX_DMA_BURST << TxDMAShift) | (InterFrameGap <<
 						TxInterFrameGapShift));
+	tp->cp_cmd |= RTL_R16(CPlusCmd);
+	RTL_W16(CPlusCmd, tp->cp_cmd);
+
+	if (tp->mac_version == RTL_GIGA_MAC_VER_D) {
+		dprintk(KERN_INFO PFX "Set MAC Reg C+CR Offset 0xE0: bit-3 and bit-14 MUST be 1\n");
+		tp->cp_cmd |= (1 << 14) | PCIMulRW;
+		RTL_W16(CPlusCmd, tp->cp_cmd);
+	}
 
 	tp->cur_rx = 0;
 
-	RTL_W32(TxDescStartAddr, virt_to_bus(tp->TxDescArray));
-	RTL_W32(RxDescStartAddr, virt_to_bus(tp->RxDescArray));
+	RTL_W32(TxDescStartAddrLow, ((u64) tp->TxPhyAddr & DMA_32BIT_MASK));
+	RTL_W32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr >> 32));
+	RTL_W32(RxDescAddrLow, ((u64) tp->RxPhyAddr & DMA_32BIT_MASK));
+	RTL_W32(RxDescAddrHigh, ((u64) tp->RxPhyAddr >> 32));
 	RTL_W8(Cfg9346, Cfg9346_Lock);
 	udelay(10);
 
@@ -755,31 +1154,131 @@ rtl8169_hw_start(struct net_device *dev)
 
 }
 
-static void
-rtl8169_init_ring(struct net_device *dev)
+static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc)
+{
+	desc->addr = 0x0badbadbadbadbad;
+	desc->status &= ~cpu_to_le32(OWNbit | RsvdMask);
+}
+
+static void rtl8169_free_rx_skb(struct pci_dev *pdev, struct sk_buff **sk_buff,
+				struct RxDesc *desc)
+{
+	pci_unmap_single(pdev, le64_to_cpu(desc->addr), RX_BUF_SIZE,
+			 PCI_DMA_FROMDEVICE);
+	dev_kfree_skb(*sk_buff);
+	*sk_buff = NULL;
+	rtl8169_make_unusable_by_asic(desc);
+}
+
+static inline void rtl8169_return_to_asic(struct RxDesc *desc)
+{
+	desc->status |= cpu_to_le32(OWNbit + RX_BUF_SIZE);
+}
+
+static inline void rtl8169_give_to_asic(struct RxDesc *desc, dma_addr_t mapping)
+{
+	desc->addr = cpu_to_le64(mapping);
+	desc->status |= cpu_to_le32(OWNbit + RX_BUF_SIZE);
+}
+
+static int rtl8169_alloc_rx_skb(struct pci_dev *pdev, struct net_device *dev,
+				struct sk_buff **sk_buff, struct RxDesc *desc)
+{
+	struct sk_buff *skb;
+	dma_addr_t mapping;
+	int ret = 0;
+
+	skb = dev_alloc_skb(RX_BUF_SIZE);
+	if (!skb)
+		goto err_out;
+
+	skb->dev = dev;
+	skb_reserve(skb, 2);
+	*sk_buff = skb;
+
+	mapping = pci_map_single(pdev, skb->tail, RX_BUF_SIZE,
+				 PCI_DMA_FROMDEVICE);
+
+	rtl8169_give_to_asic(desc, mapping);
+
+out:
+	return ret;
+
+err_out:
+	ret = -ENOMEM;
+	rtl8169_make_unusable_by_asic(desc);
+	goto out;
+}
+
+static void rtl8169_rx_clear(struct rtl8169_private *tp)
 {
-	struct rtl8169_private *tp = dev->priv;
 	int i;
 
-	tp->cur_rx = 0;
-	tp->cur_tx = 0;
-	tp->dirty_tx = 0;
+	for (i = 0; i < NUM_RX_DESC; i++) {
+		if (tp->Rx_skbuff[i]) {
+			rtl8169_free_rx_skb(tp->pci_dev, tp->Rx_skbuff + i,
+					    tp->RxDescArray + i);
+		}
+	}
+}
+
+static u32 rtl8169_rx_fill(struct rtl8169_private *tp, struct net_device *dev,
+			   u32 start, u32 end)
+{
+	u32 cur;
+	
+	for (cur = start; end - cur > 0; cur++) {
+		int ret, i = cur % NUM_RX_DESC;
+
+		if (tp->Rx_skbuff[i])
+			continue;
+			
+		ret = rtl8169_alloc_rx_skb(tp->pci_dev, dev, tp->Rx_skbuff + i,
+					   tp->RxDescArray + i);
+		if (ret < 0)
+			break;
+	}
+	return cur - start;
+}
+
+static inline void rtl8169_mark_as_last_descriptor(struct RxDesc *desc)
+{
+	desc->status |= cpu_to_le32(EORbit);
+}
+
+static int rtl8169_init_ring(struct net_device *dev)
+{
+	struct rtl8169_private *tp = dev->priv;
+
+	tp->cur_rx = tp->dirty_rx = 0;
+	tp->cur_tx = tp->dirty_tx = 0;
 	memset(tp->TxDescArray, 0x0, NUM_TX_DESC * sizeof (struct TxDesc));
 	memset(tp->RxDescArray, 0x0, NUM_RX_DESC * sizeof (struct RxDesc));
 
-	for (i = 0; i < NUM_TX_DESC; i++) {
-		tp->Tx_skbuff[i] = NULL;
-	}
-	for (i = 0; i < NUM_RX_DESC; i++) {
-		if (i == (NUM_RX_DESC - 1))
-			tp->RxDescArray[i].status =
-			    (OWNbit | EORbit) + RX_BUF_SIZE;
-		else
-			tp->RxDescArray[i].status = OWNbit + RX_BUF_SIZE;
+	memset(tp->Tx_skbuff, 0x0, NUM_TX_DESC * sizeof(struct sk_buff *));
+	memset(tp->Rx_skbuff, 0x0, NUM_RX_DESC * sizeof(struct sk_buff *));
 
-		tp->RxBufferRing[i] = &(tp->RxBufferRings[i * RX_BUF_SIZE]);
-		tp->RxDescArray[i].buf_addr = virt_to_bus(tp->RxBufferRing[i]);
-	}
+	if (rtl8169_rx_fill(tp, dev, 0, NUM_RX_DESC) != NUM_RX_DESC)
+		goto err_out;
+
+	rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1);
+
+	return 0;
+
+err_out:
+	rtl8169_rx_clear(tp);
+	return -ENOMEM;
+}
+
+static void rtl8169_unmap_tx_skb(struct pci_dev *pdev, struct sk_buff **sk_buff,
+				 struct TxDesc *desc)
+{
+	u32 len = sk_buff[0]->len;
+
+	pci_unmap_single(pdev, le64_to_cpu(desc->addr),
+			 len < ETH_ZLEN ? ETH_ZLEN : len, PCI_DMA_TODEVICE);
+	desc->addr = 0x00;
+	*sk_buff = NULL;
 }
 
 static void
@@ -789,9 +1288,12 @@ rtl8169_tx_clear(struct rtl8169_private 
 
 	tp->cur_tx = 0;
 	for (i = 0; i < NUM_TX_DESC; i++) {
-		if (tp->Tx_skbuff[i] != NULL) {
-			dev_kfree_skb(tp->Tx_skbuff[i]);
-			tp->Tx_skbuff[i] = NULL;
+		struct sk_buff *skb = tp->Tx_skbuff[i];
+
+		if (skb) {
+			rtl8169_unmap_tx_skb(tp->pci_dev, tp->Tx_skbuff + i,
+					     tp->TxDescArray + i);
+			dev_kfree_skb(skb);
 			tp->stats.tx_dropped++;
 		}
 	}
@@ -829,48 +1331,58 @@ rtl8169_start_xmit(struct sk_buff *skb, 
 	struct rtl8169_private *tp = dev->priv;
 	void *ioaddr = tp->mmio_addr;
 	int entry = tp->cur_tx % NUM_TX_DESC;
+	u32 len = skb->len;
 
-	if (skb->len < ETH_ZLEN) {
+	if (unlikely(skb->len < ETH_ZLEN)) {
 		skb = skb_padto(skb, ETH_ZLEN);
-		if (skb == NULL)
-			return 0;
+		if (!skb)
+			goto err_update_stats;
+		len = ETH_ZLEN;
 	}
 	
 	spin_lock_irq(&tp->lock);
 
-	if ((tp->TxDescArray[entry].status & OWNbit) == 0) {
+	if (!(le32_to_cpu(tp->TxDescArray[entry].status) & OWNbit)) {
+		dma_addr_t mapping;
+
+		mapping = pci_map_single(tp->pci_dev, skb->data, len,
+					 PCI_DMA_TODEVICE);
+
 		tp->Tx_skbuff[entry] = skb;
-		tp->TxDescArray[entry].buf_addr = virt_to_bus(skb->data);
-		if (entry != (NUM_TX_DESC - 1))
-			tp->TxDescArray[entry].status =
-			    (OWNbit | FSbit | LSbit) | ((skb->len > ETH_ZLEN) ?
-							skb->len : ETH_ZLEN);
-		else
-			tp->TxDescArray[entry].status =
-			    (OWNbit | EORbit | FSbit | LSbit) |
-			    ((skb->len > ETH_ZLEN) ? skb->len : ETH_ZLEN);
+		tp->TxDescArray[entry].addr = cpu_to_le64(mapping);
 
+		tp->TxDescArray[entry].status = cpu_to_le32(OWNbit | FSbit |
+			LSbit | len | (EORbit * !((entry + 1) % NUM_TX_DESC)));
+			
 		RTL_W8(TxPoll, 0x40);	//set polling bit
 
 		dev->trans_start = jiffies;
 
 		tp->cur_tx++;
-	}
+	} else
+		goto err_drop;
 
-	spin_unlock_irq(&tp->lock);
 
 	if ((tp->cur_tx - NUM_TX_DESC) == tp->dirty_tx) {
 		netif_stop_queue(dev);
 	}
+out:
+	spin_unlock_irq(&tp->lock);
 
 	return 0;
+
+err_drop:
+	dev_kfree_skb(skb);
+err_update_stats:
+	tp->stats.tx_dropped++;
+	goto out;
 }
 
 static void
 rtl8169_tx_interrupt(struct net_device *dev, struct rtl8169_private *tp,
 		     void *ioaddr)
 {
-	unsigned long dirty_tx, tx_left = 0;
+	unsigned long dirty_tx, tx_left;
 
 	assert(dev != NULL);
 	assert(tp != NULL);
@@ -881,18 +1393,24 @@ rtl8169_tx_interrupt(struct net_device *
 
 	while (tx_left > 0) {
 		int entry = dirty_tx % NUM_TX_DESC;
+		struct sk_buff *skb = tp->Tx_skbuff[entry];
+		u32 status;
 
-		if ((tp->TxDescArray[entry].status & OWNbit) == 0) {
-			struct sk_buff *skb = tp->Tx_skbuff[entry];
+		rmb();
+		status = le32_to_cpu(tp->TxDescArray[entry].status);
+		if (status & OWNbit)
+			break;
 
-			tp->stats.tx_bytes += skb->len >= ETH_ZLEN ?
-					      skb->len : ETH_ZLEN;
-			tp->stats.tx_packets++;
-			dev_kfree_skb_irq(skb);
-			tp->Tx_skbuff[entry] = NULL;
-			dirty_tx++;
-			tx_left--;
-		}
+		/* FIXME: is it really accurate for TxErr ? */
+		tp->stats.tx_bytes += skb->len >= ETH_ZLEN ?
+				      skb->len : ETH_ZLEN;
+		tp->stats.tx_packets++;
+		rtl8169_unmap_tx_skb(tp->pci_dev, tp->Tx_skbuff + entry,
+				     tp->TxDescArray + entry);
+		dev_kfree_skb_irq(skb);
+		tp->Tx_skbuff[entry] = NULL;
+		dirty_tx++;
+		tx_left--;
 	}
 
 	if (tp->dirty_tx != dirty_tx) {
@@ -902,70 +1420,108 @@ rtl8169_tx_interrupt(struct net_device *
 	}
 }
 
+static inline int rtl8169_try_rx_copy(struct sk_buff **sk_buff, int pkt_size,
+				      struct RxDesc *desc,
+				      struct net_device *dev)
+{
+	int ret = -1;
+
+	if (pkt_size < rx_copybreak) {
+		struct sk_buff *skb;
+
+		skb = dev_alloc_skb(pkt_size + 2);
+		if (skb) {
+			skb->dev = dev;
+			skb_reserve(skb, 2);
+			eth_copy_and_sum(skb, sk_buff[0]->tail, pkt_size, 0);
+			*sk_buff = skb;
+			rtl8169_return_to_asic(desc);
+			ret = 0;
+		}
+	}
+	return ret;
+}
+
 static void
 rtl8169_rx_interrupt(struct net_device *dev, struct rtl8169_private *tp,
 		     void *ioaddr)
 {
-	int cur_rx;
-	struct sk_buff *skb;
-	int pkt_size = 0;
+	unsigned long cur_rx, rx_left;
+	int delta;
 
 	assert(dev != NULL);
 	assert(tp != NULL);
 	assert(ioaddr != NULL);
 
 	cur_rx = tp->cur_rx;
+	rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
 
-	while ((tp->RxDescArray[cur_rx].status & OWNbit) == 0) {
+	while (rx_left > 0) {
+		int entry = cur_rx % NUM_RX_DESC;
+		u32 status;
 
-		if (tp->RxDescArray[cur_rx].status & RxRES) {
+		rmb();
+		status = le32_to_cpu(tp->RxDescArray[entry].status);
+
+		if (status & OWNbit)
+			break;
+		if (status & RxRES) {
 			printk(KERN_INFO "%s: Rx ERROR!!!\n", dev->name);
 			tp->stats.rx_errors++;
-			if (tp->RxDescArray[cur_rx].status & (RxRWT | RxRUNT))
+			if (status & (RxRWT | RxRUNT))
 				tp->stats.rx_length_errors++;
-			if (tp->RxDescArray[cur_rx].status & RxCRC)
+			if (status & RxCRC)
 				tp->stats.rx_crc_errors++;
 		} else {
-			pkt_size =
-			    (int) (tp->RxDescArray[cur_rx].
-				   status & 0x00001FFF) - 4;
-			skb = dev_alloc_skb(pkt_size + 2);
-			if (skb != NULL) {
-				skb->dev = dev;
-				skb_reserve(skb, 2);	// 16 byte align the IP fields. //
-				eth_copy_and_sum(skb, tp->RxBufferRing[cur_rx],
-						 pkt_size, 0);
-				skb_put(skb, pkt_size);
-				skb->protocol = eth_type_trans(skb, dev);
-				netif_rx(skb);
-
-				if (cur_rx == (NUM_RX_DESC - 1))
-					tp->RxDescArray[cur_rx].status =
-					    (OWNbit | EORbit) + RX_BUF_SIZE;
-				else
-					tp->RxDescArray[cur_rx].status =
-					    OWNbit + RX_BUF_SIZE;
-
-				tp->RxDescArray[cur_rx].buf_addr =
-				    virt_to_bus(tp->RxBufferRing[cur_rx]);
-				dev->last_rx = jiffies;
-				tp->stats.rx_bytes += pkt_size;
-				tp->stats.rx_packets++;
-			} else {
-				printk(KERN_WARNING
-				       "%s: Memory squeeze, deferring packet.\n",
-				       dev->name);
-				/* We should check that some rx space is free.
-				   If not, free one and mark stats->rx_dropped++. */
-				tp->stats.rx_dropped++;
+			struct RxDesc *desc = tp->RxDescArray + entry;
+			struct sk_buff *skb = tp->Rx_skbuff[entry];
+			int pkt_size = (status & 0x00001FFF) - 4;
+			void (*pci_action)(struct pci_dev *, dma_addr_t,
+				size_t, int) = pci_dma_sync_single_for_device;
+
+
+			pci_dma_sync_single_for_cpu(tp->pci_dev,
+				le64_to_cpu(desc->addr), RX_BUF_SIZE,
+				PCI_DMA_FROMDEVICE);
+
+			if (rtl8169_try_rx_copy(&skb, pkt_size, desc, dev)) {
+				pci_action = pci_unmap_single;
+				tp->Rx_skbuff[entry] = NULL;
 			}
-		}
 
-		cur_rx = (cur_rx + 1) % NUM_RX_DESC;
+			pci_action(tp->pci_dev, le64_to_cpu(desc->addr),
+				   RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
 
+			skb_put(skb, pkt_size);
+			skb->protocol = eth_type_trans(skb, dev);
+			netif_rx(skb);
+
+			dev->last_rx = jiffies;
+			tp->stats.rx_bytes += pkt_size;
+			tp->stats.rx_packets++;
+		}
+		
+		cur_rx++; 
+		rx_left--;
 	}
 
 	tp->cur_rx = cur_rx;
+
+	delta = rtl8169_rx_fill(tp, dev, tp->dirty_rx, tp->cur_rx);
+	if (delta > 0)
+		tp->dirty_rx += delta;
+	else if (delta < 0)
+		printk(KERN_INFO "%s: no Rx buffer allocated\n", dev->name);
+
+	/*
+	 * FIXME: until there is periodic timer to try and refill the ring,
+	 * a temporary shortage may definitely kill the Rx process.
+	 * - disable the asic to try and avoid an overflow and kick it again
+	 *   after refill ?
+	 * - how do others driver handle this condition (Uh oh...).
+	 */
+	if (tp->dirty_rx + NUM_RX_DESC == tp->cur_rx)
+		printk(KERN_EMERG "%s: Rx buffers exhausted\n", dev->name);
 }
 
 /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */
@@ -982,8 +1538,8 @@ rtl8169_interrupt(int irq, void *dev_ins
 	do {
 		status = RTL_R16(IntrStatus);
 
-		/* h/w no longer present (hotplug?) or major error, bail */
-		if (status == 0xFFFF)
+		/* hotplug/major error/no more work/shared irq */
+		if ((status == 0xFFFF) || !status)
 			break;
 
 		handled = 1;
@@ -994,9 +1550,7 @@ rtl8169_interrupt(int irq, void *dev_ins
 		RTL_W16(IntrStatus,
 			(status & RxFIFOOver) ? (status | RxOverflow) : status);
 
-		if ((status &
-		     (SYSErr | PCSTimeout | RxUnderrun | RxOverflow | RxFIFOOver
-		      | TxErr | TxOK | RxErr | RxOK)) == 0)
+		if (!(status & rtl8169_intr_mask))
 			break;
 
 		// Rx interrupt 
@@ -1026,11 +1580,13 @@ static int
 rtl8169_close(struct net_device *dev)
 {
 	struct rtl8169_private *tp = dev->priv;
+	struct pci_dev *pdev = tp->pci_dev;
 	void *ioaddr = tp->mmio_addr;
-	int i;
 
 	netif_stop_queue(dev);
 
+	rtl8169_delete_timer(dev);
+
 	spin_lock_irq(&tp->lock);
 
 	/* Stop the chip's Tx and Rx DMA processes. */
@@ -1049,16 +1605,15 @@ rtl8169_close(struct net_device *dev)
 	free_irq(dev->irq, dev);
 
 	rtl8169_tx_clear(tp);
-	kfree(tp->TxDescArrays);
-	kfree(tp->RxDescArrays);
-	tp->TxDescArrays = NULL;
-	tp->RxDescArrays = NULL;
+
+	rtl8169_rx_clear(tp);
+
+	pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
+			    tp->RxPhyAddr);
+	pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
+			    tp->TxPhyAddr);
 	tp->TxDescArray = NULL;
 	tp->RxDescArray = NULL;
-	kfree(tp->RxBufferRings);
-	for (i = 0; i < NUM_RX_DESC; i++) {
-		tp->RxBufferRing[i] = NULL;
-	}
 
 	return 0;
 }
@@ -1112,11 +1667,25 @@ rtl8169_set_rx_mode(struct net_device *d
 	spin_unlock_irqrestore(&tp->lock, flags);
 }
 
-struct net_device_stats *
-rtl8169_get_stats(struct net_device *dev)
+/**
+ *  rtl8169_get_stats - Get rtl8169 read/write statistics
+ *  @dev: The Ethernet Device to get statistics for
+ *
+ *  Get TX/RX statistics for rtl8169
+ */
+static struct net_device_stats *rtl8169_get_stats(struct net_device *dev)
 {
 	struct rtl8169_private *tp = dev->priv;
+	void *ioaddr = tp->mmio_addr;
+	unsigned long flags;
 
+	if (netif_running(dev)) {
+		spin_lock_irqsave(&tp->lock, flags);
+		tp->stats.rx_missed_errors += RTL_R32(RxMissed);
+		RTL_W32(RxMissed, 0);
+		spin_unlock_irqrestore(&tp->lock, flags);
+	}
+		
 	return &tp->stats;
 }
 
@@ -1125,8 +1694,10 @@ static struct pci_driver rtl8169_pci_dri
 	.id_table	= rtl8169_pci_tbl,
 	.probe		= rtl8169_init_one,
 	.remove		= __devexit_p(rtl8169_remove_one),
-	.suspend	= NULL,
-	.resume		= NULL,
+#ifdef CONFIG_PM
+	.suspend	= rtl8169_suspend,
+	.resume		= rtl8169_resume,
+#endif
 };
 
 static int __init
--- diff/drivers/net/rcpci45.c	2003-09-30 15:46:15.000000000 +0100
+++ source/drivers/net/rcpci45.c	2004-04-21 10:45:34.441467600 +0100
@@ -131,12 +131,6 @@ rcpci45_remove_one (struct pci_dev *pdev
 	struct net_device *dev = pci_get_drvdata (pdev);
 	PDPA pDpa = dev->priv;
 
-	if (!dev) {
-		printk (KERN_ERR "%s: remove non-existent device\n",
-				dev->name);
-		return;
-	}
-
 	RCResetIOP (dev);
 	unregister_netdev (dev);
 	free_irq (dev->irq, dev);
--- diff/drivers/net/saa9730.c	2004-03-11 10:20:26.000000000 +0000
+++ source/drivers/net/saa9730.c	2004-04-21 10:45:34.451466080 +0100
@@ -1146,6 +1146,7 @@ static int __devinit saa9730_init_one(st
 	}
 
 	pci_set_drvdata(pdev, dev);
+	SET_NETDEV_DEV(dev, &pdev->dev);
 	return 0;
 	
 out2:
--- diff/drivers/net/sk98lin/skge.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/sk98lin/skge.c	2004-04-21 10:45:34.455465472 +0100
@@ -382,6 +382,7 @@ static int __init skge_probe (void)
 		dev->do_ioctl =		&SkGeIoctl;
 		dev->change_mtu =	&SkGeChangeMtu;
 		dev->flags &= 		~IFF_RUNNING;
+		SET_NETDEV_DEV(dev, &pdev->dev);
 
 #ifdef SK_ZEROCOPY
 #ifdef USE_SK_TX_CHECKSUM
--- diff/drivers/net/sk_mca.c	2004-02-18 08:54:10.000000000 +0000
+++ source/drivers/net/sk_mca.c	2004-04-21 10:45:34.456465320 +0100
@@ -997,13 +997,13 @@ static void skmca_set_multicast_list(str
 		block.Mode &= ~LANCE_INIT_PROM;
 
 	if (dev->flags & IFF_ALLMULTI) {	/* get all multicasts */
-		memset(block.LAdrF, 8, 0xff);
+		memset(block.LAdrF, 0xff, sizeof(block.LAdrF));
 	} else {		/* get selected/no multicasts */
 
 		struct dev_mc_list *mptr;
 		int code;
 
-		memset(block.LAdrF, 8, 0x00);
+		memset(block.LAdrF, 0, sizeof(block.LAdrF));
 		for (mptr = dev->mc_list; mptr != NULL; mptr = mptr->next) {
 			code = GetHash(mptr->dmi_addr);
 			block.LAdrF[(code >> 3) & 7] |= 1 << (code & 7);
--- diff/drivers/net/slip.c	2003-10-27 09:20:38.000000000 +0000
+++ source/drivers/net/slip.c	2004-04-21 10:45:34.457465168 +0100
@@ -1307,7 +1307,7 @@ static int sl_ioctl(struct net_device *d
 		/* Resolve race condition, when ioctl'ing hanged up 
 		   and opened by another process device.
 		 */
-		if (sl->tty != current->tty && sl->pid != current->pid) {
+		if (sl->tty != current->signal->tty && sl->pid != current->pid) {
 			spin_unlock_bh(&sl->lock);
 			return -EPERM;
 		}
--- diff/drivers/net/tc35815.c	2004-02-18 08:54:10.000000000 +0000
+++ source/drivers/net/tc35815.c	2004-04-21 10:45:34.458465016 +0100
@@ -597,6 +597,7 @@ static int __devinit tc35815_probe1(stru
 	dev->get_stats		= tc35815_get_stats;
 	dev->set_multicast_list = tc35815_set_multicast_list;
 	SET_MODULE_OWNER(dev);
+	SET_NETDEV_DEV(dev, &pdev->dev);
 
 	ret = register_netdev(dev);
 	if (ret)
@@ -1724,12 +1725,7 @@ static struct pci_driver tc35815_driver 
 
 static int __init tc35815_init_module(void)
 {
-	int err;
-
-	if ((err = pci_module_init(&tc35815_driver)) < 0 )
-		       return err;      
-	else
-		return 0;
+	return pci_module_init(&tc35815_driver);
 }
 
 static void __exit tc35815_cleanup_module(void)
--- diff/drivers/net/tg3.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/tg3.c	2004-04-21 10:45:34.462464408 +0100
@@ -56,8 +56,8 @@
 
 #define DRV_MODULE_NAME		"tg3"
 #define PFX DRV_MODULE_NAME	": "
-#define DRV_MODULE_VERSION	"2.9"
-#define DRV_MODULE_RELDATE	"March 8, 2004"
+#define DRV_MODULE_VERSION	"3.1"
+#define DRV_MODULE_RELDATE	"April 3, 2004"
 
 #define TG3_DEF_MAC_MODE	0
 #define TG3_DEF_RX_MODE		0
@@ -643,7 +643,14 @@ static int tg3_phy_reset_5703_4_5(struct
 	tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8200);
 	tg3_writephy(tp, 0x16, 0x0000);
 
-	tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400);
+	if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
+	    GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
+		/* Set Extended packet length bit for jumbo frames */
+		tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4400);
+	}
+	else {
+		tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400);
+	}
 
 	tg3_writephy(tp, MII_TG3_CTRL, phy9_orig);
 
@@ -657,7 +664,7 @@ static int tg3_phy_reset_5703_4_5(struct
 /* This will reset the tigon3 PHY if there is no valid
  * link unless the FORCE argument is non-zero.
  */
-static int tg3_phy_reset(struct tg3 *tp, int force)
+static int tg3_phy_reset(struct tg3 *tp)
 {
 	u32 phy_status;
 	int err;
@@ -667,12 +674,6 @@ static int tg3_phy_reset(struct tg3 *tp,
 	if (err != 0)
 		return -EBUSY;
 
-	/* If we have link, and not forcing a reset, then nothing
-	 * to do.
-	 */
-	if ((phy_status & BMSR_LSTATUS) != 0 && (force == 0))
-		return 0;
-
 	if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
 	    GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
 	    GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
@@ -699,6 +700,15 @@ out:
 		tg3_writephy(tp, 0x1c, 0x8d68);
 		tg3_writephy(tp, 0x1c, 0x8d68);
 	}
+	/* Set Extended packet length bit (bit 14) on all chips that */
+	/* support jumbo frames */
+	if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401 ||
+	    (tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5411) {
+		tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4c20);
+	}
+	else if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
+		tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4400);
+	}
 	tg3_phy_set_wirespeed(tp);
 	return 0;
 }
@@ -1050,6 +1060,8 @@ static int tg3_phy_copper_begin(struct t
 	u32 new_adv;
 	int i;
 
+	tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400);
+
 	if (tp->link_config.phy_is_low_power) {
 		/* Entering low power mode.  Disable gigabit and
 		 * 100baseT advertisements.
@@ -1190,7 +1202,8 @@ static int tg3_init_5401phy_dsp(struct t
 	int err;
 
 	/* Turn off tap power management. */
-	err  = tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c20);
+	/* Set Extended packet length bit */
+	err  = tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4c20);
 
 	err |= tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x0012);
 	err |= tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x1804);
@@ -1212,6 +1225,27 @@ static int tg3_init_5401phy_dsp(struct t
 	return err;
 }
 
+static int tg3_copper_is_advertising_all(struct tg3 *tp)
+{
+	u32 adv_reg, all_mask;
+
+	tg3_readphy(tp, MII_ADVERTISE, &adv_reg);
+	all_mask = (ADVERTISE_10HALF | ADVERTISE_10FULL |
+		    ADVERTISE_100HALF | ADVERTISE_100FULL);
+	if ((adv_reg & all_mask) != all_mask)
+		return 0;
+	if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY)) {
+		u32 tg3_ctrl;
+
+		tg3_readphy(tp, MII_TG3_CTRL, &tg3_ctrl);
+		all_mask = (MII_TG3_CTRL_ADV_1000_HALF |
+			    MII_TG3_CTRL_ADV_1000_FULL);
+		if ((tg3_ctrl & all_mask) != all_mask)
+			return 0;
+	}
+	return 1;
+}
+
 static int tg3_setup_copper_phy(struct tg3 *tp, int force_reset)
 {
 	int current_link_up;
@@ -1240,7 +1274,7 @@ static int tg3_setup_copper_phy(struct t
 	 */
 	if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
 	     GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
-	     tp->pci_chip_rev_id == CHIPREV_ID_5705_A0) &&
+	     GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) &&
 	    netif_carrier_ok(tp->dev)) {
 		tg3_readphy(tp, MII_BMSR, &bmsr);
 		tg3_readphy(tp, MII_BMSR, &bmsr);
@@ -1248,7 +1282,7 @@ static int tg3_setup_copper_phy(struct t
 			force_reset = 1;
 	}
 	if (force_reset)
-		tg3_phy_reset(tp, 1);
+		tg3_phy_reset(tp);
 
 	if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) {
 		tg3_readphy(tp, MII_BMSR, &bmsr);
@@ -1275,7 +1309,7 @@ static int tg3_setup_copper_phy(struct t
 			if ((tp->phy_id & PHY_ID_REV_MASK) == PHY_REV_BCM5401_B0 &&
 			    !(bmsr & BMSR_LSTATUS) &&
 			    tp->link_config.active_speed == SPEED_1000) {
-				err = tg3_phy_reset(tp, 1);
+				err = tg3_phy_reset(tp);
 				if (!err)
 					err = tg3_init_5401phy_dsp(tp);
 				if (err)
@@ -1310,8 +1344,14 @@ static int tg3_setup_copper_phy(struct t
 	current_speed = SPEED_INVALID;
 	current_duplex = DUPLEX_INVALID;
 
-	tg3_readphy(tp, MII_BMSR, &bmsr);
-	tg3_readphy(tp, MII_BMSR, &bmsr);
+	bmsr = 0;
+	for (i = 0; i < 100; i++) {
+		tg3_readphy(tp, MII_BMSR, &bmsr);
+		tg3_readphy(tp, MII_BMSR, &bmsr);
+		if (bmsr & BMSR_LSTATUS)
+			break;
+		udelay(40);
+	}
 
 	if (bmsr & BMSR_LSTATUS) {
 		u32 aux_stat, bmcr;
@@ -1327,22 +1367,25 @@ static int tg3_setup_copper_phy(struct t
 		tg3_aux_stat_to_speed_duplex(tp, aux_stat,
 					     &current_speed,
 					     &current_duplex);
-		tg3_readphy(tp, MII_BMCR, &bmcr);
-		tg3_readphy(tp, MII_BMCR, &bmcr);
+
+		bmcr = 0;
+		for (i = 0; i < 200; i++) {
+			tg3_readphy(tp, MII_BMCR, &bmcr);
+			tg3_readphy(tp, MII_BMCR, &bmcr);
+			if (bmcr && bmcr != 0x7fff)
+				break;
+			udelay(10);
+		}
+
 		if (tp->link_config.autoneg == AUTONEG_ENABLE) {
 			if (bmcr & BMCR_ANENABLE) {
-				u32 gig_ctrl;
-
 				current_link_up = 1;
 
 				/* Force autoneg restart if we are exiting
 				 * low power mode.
 				 */
-				tg3_readphy(tp, MII_TG3_CTRL, &gig_ctrl);
-				if (!(gig_ctrl & (MII_TG3_CTRL_ADV_1000_HALF |
-						  MII_TG3_CTRL_ADV_1000_FULL))) {
+				if (!tg3_copper_is_advertising_all(tp))
 					current_link_up = 0;
-				}
 			} else {
 				current_link_up = 0;
 			}
@@ -2004,6 +2047,13 @@ static int tg3_setup_phy(struct tg3 *tp,
 		      (6 << TX_LENGTHS_IPG_SHIFT) |
 		      (32 << TX_LENGTHS_SLOT_TIME_SHIFT)));
 
+	if (netif_carrier_ok(tp->dev)) {
+		tw32(HOSTCC_STAT_COAL_TICKS,
+		     DEFAULT_STAT_COAL_TICKS);
+	} else {
+		tw32(HOSTCC_STAT_COAL_TICKS, 0);
+	}
+
 	return err;
 }
 
@@ -3398,10 +3448,11 @@ out:
 }
 
 /* tp->lock is held. */
-static void tg3_chip_reset(struct tg3 *tp)
+static int tg3_chip_reset(struct tg3 *tp)
 {
 	u32 val;
 	u32 flags_save;
+	int i;
 
 	if (!(tp->tg3_flags2 & TG3_FLG2_SUN_5704)) {
 		/* Force NVRAM to settle.
@@ -3469,6 +3520,8 @@ static void tg3_chip_reset(struct tg3 *t
 
 	tw32(MEMARB_MODE, MEMARB_MODE_ENABLE);
 
+	tw32(GRC_MODE, tp->grc_mode);
+
 	if ((tp->nic_sram_data_cfg & NIC_SRAM_DATA_CFG_MINI_PCI) != 0 &&
 	    GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
 		tp->pci_clock_ctrl |=
@@ -3476,7 +3529,45 @@ static void tg3_chip_reset(struct tg3 *t
 		tw32(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl);
 	}
 
-	tw32(TG3PCI_MISC_HOST_CTRL, tp->misc_host_ctrl);
+	/* Prevent PXE from restarting.  */
+	tg3_write_mem(tp,
+		      NIC_SRAM_FIRMWARE_MBOX,
+		      NIC_SRAM_FIRMWARE_MBOX_MAGIC1);
+
+	if (tp->phy_id == PHY_ID_SERDES) {
+		tp->mac_mode = MAC_MODE_PORT_MODE_TBI;
+		tw32_f(MAC_MODE, tp->mac_mode);
+	} else
+		tw32_f(MAC_MODE, 0);
+	udelay(40);
+
+	/* Wait for firmware initialization to complete. */
+	for (i = 0; i < 100000; i++) {
+		tg3_read_mem(tp, NIC_SRAM_FIRMWARE_MBOX, &val);
+		if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1)
+			break;
+		udelay(10);
+	}
+	if (i >= 100000 &&
+	    !(tp->tg3_flags2 & TG3_FLG2_SUN_5704)) {
+		printk(KERN_ERR PFX "tg3_reset_hw timed out for %s, "
+		       "firmware will not restart magic=%08x\n",
+		       tp->dev->name, val);
+		return -ENODEV;
+	}
+
+	/* Reprobe ASF enable state.  */
+	tp->tg3_flags &= ~TG3_FLAG_ENABLE_ASF;
+	tg3_read_mem(tp, NIC_SRAM_DATA_SIG, &val);
+	if (val == NIC_SRAM_DATA_SIG_MAGIC) {
+		u32 nic_cfg;
+
+		tg3_read_mem(tp, NIC_SRAM_DATA_CFG, &nic_cfg);
+		if (nic_cfg & NIC_SRAM_DATA_CFG_ASF_ENABLE)
+			tp->tg3_flags |= TG3_FLAG_ENABLE_ASF;
+	}
+
+	return 0;
 }
 
 /* tp->lock is held. */
@@ -3503,40 +3594,17 @@ static void tg3_stop_fw(struct tg3 *tp)
 /* tp->lock is held. */
 static int tg3_halt(struct tg3 *tp)
 {
-	u32 val;
-	int i;
+	int err;
 
 	tg3_stop_fw(tp);
 	tg3_abort_hw(tp);
-	tg3_chip_reset(tp);
-	tg3_write_mem(tp,
-		      NIC_SRAM_FIRMWARE_MBOX,
-		      NIC_SRAM_FIRMWARE_MBOX_MAGIC1);
-	for (i = 0; i < 100000; i++) {
-		tg3_read_mem(tp, NIC_SRAM_FIRMWARE_MBOX, &val);
-		if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1)
-			break;
-		udelay(10);
-	}
-
-	if (i >= 100000 &&
-	    !(tp->tg3_flags2 & TG3_FLG2_SUN_5704)) {
-		printk(KERN_ERR PFX "tg3_halt timed out for %s, "
-		       "firmware will not restart magic=%08x\n",
-		       tp->dev->name, val);
-		return -ENODEV;
-	}
+	err = tg3_chip_reset(tp);
+	if (err)
+		return err;
 
-	if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) {
-		if (tp->tg3_flags & TG3_FLAG_WOL_ENABLE)
-			tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
-				      DRV_STATE_WOL);
-		else
-			tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
-				      DRV_STATE_UNLOAD);
-	} else
+	if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF)
 		tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
-			      DRV_STATE_SUSPEND);
+			      DRV_STATE_UNLOAD);
 
 	return 0;
 }
@@ -4500,36 +4568,9 @@ static int tg3_reset_hw(struct tg3 *tp)
 			return err;
 	}
 
-	tg3_chip_reset(tp);
-
-	val = tr32(GRC_MODE);
-	val &= GRC_MODE_HOST_STACKUP;
-	tw32(GRC_MODE, val | tp->grc_mode);
-
-	tg3_write_mem(tp,
-		      NIC_SRAM_FIRMWARE_MBOX,
-		      NIC_SRAM_FIRMWARE_MBOX_MAGIC1);
-	if (tp->phy_id == PHY_ID_SERDES) {
-		tp->mac_mode = MAC_MODE_PORT_MODE_TBI;
-		tw32_f(MAC_MODE, tp->mac_mode);
-	} else
-		tw32_f(MAC_MODE, 0);
-	udelay(40);
-
-	/* Wait for firmware initialization to complete. */
-	for (i = 0; i < 100000; i++) {
-		tg3_read_mem(tp, NIC_SRAM_FIRMWARE_MBOX, &val);
-		if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1)
-			break;
-		udelay(10);
-	}
-	if (i >= 100000 &&
-	    !(tp->tg3_flags2 & TG3_FLG2_SUN_5704)) {
-		printk(KERN_ERR PFX "tg3_reset_hw timed out for %s, "
-		       "firmware will not restart magic=%08x\n",
-		       tp->dev->name, val);
-		return -ENODEV;
-	}
+	err = tg3_chip_reset(tp);
+	if (err)
+		return err;
 
 	if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF)
 		tg3_write_mem(tp, NIC_SRAM_FW_DRV_STATE_MBOX,
@@ -4552,6 +4593,13 @@ static int tg3_reset_hw(struct tg3 *tp)
 		tw32(TG3PCI_PCISTATE, val);
 	}
 
+	if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5704_BX) {
+		/* Enable some hw fixes.  */
+		val = tr32(TG3PCI_MSI_DATA);
+		val |= (1 << 26) | (1 << 28) | (1 << 29);
+		tw32(TG3PCI_MSI_DATA, val);
+	}
+
 	/* Descriptor ring init may make accesses to the
 	 * NIC SRAM area to setup the TX descriptors, so we
 	 * can only do this after the hardware has been
@@ -4582,8 +4630,10 @@ static int tg3_reset_hw(struct tg3 *tp)
 	     (GRC_MODE_IRQ_ON_MAC_ATTN | GRC_MODE_HOST_STACKUP));
 
 	/* Setup the timer prescalar register.  Clock is always 66Mhz. */
-	tw32(GRC_MISC_CFG,
-	     (65 << GRC_MISC_CFG_PRESCALAR_SHIFT));
+	val = tr32(GRC_MISC_CFG);
+	val &= ~0xff;
+	val |= (65 << GRC_MISC_CFG_PRESCALAR_SHIFT);
+	tw32(GRC_MISC_CFG, val);
 
 	/* Initialize MBUF/DESC pool. */
 	if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
@@ -4644,19 +4694,6 @@ static int tg3_reset_hw(struct tg3 *tp)
 		return -ENODEV;
 	}
 
-	tw32(FTQ_RESET, 0xffffffff);
-	tw32(FTQ_RESET, 0x00000000);
-	for (i = 0; i < 2000; i++) {
-		if (tr32(FTQ_RESET) == 0x00000000)
-			break;
-		udelay(10);
-	}
-	if (i >= 2000) {
-		printk(KERN_ERR PFX "tg3_reset_hw cannot reset FTQ for %s.\n",
-		       tp->dev->name);
-		return -ENODEV;
-	}
-
 	/* Clear statistics/status block in chip, and status block in ram. */
 	if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
 		for (i = NIC_SRAM_STATS_BLK;
@@ -4988,8 +5025,17 @@ static int tg3_reset_hw(struct tg3 *tp)
 	tw32_f(MAC_RX_MODE, tp->rx_mode);
 	udelay(10);
 
-	if (tp->pci_chip_rev_id == CHIPREV_ID_5703_A1)
-		tw32(MAC_SERDES_CFG, 0x616000);
+	if (tp->phy_id == PHY_ID_SERDES) {
+		if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
+			/* Set drive transmission level to 1.2V  */
+			val = tr32(MAC_SERDES_CFG);
+			val &= 0xfffff000;
+			val |= 0x880;
+			tw32(MAC_SERDES_CFG, val);
+		}
+		if (tp->pci_chip_rev_id == CHIPREV_ID_5703_A1)
+			tw32(MAC_SERDES_CFG, 0x616000);
+	}
 
 	/* Prevent chip from dropping frames when flow control
 	 * is enabled.
@@ -5882,6 +5928,16 @@ static int tg3_set_settings(struct net_d
 	    tp->link_config.phy_is_low_power)
 		return -EAGAIN;
 
+	if (tp->phy_id == PHY_ID_SERDES) {
+		/* These are the only valid advertisement bits allowed.  */
+		if (cmd->autoneg == AUTONEG_ENABLE &&
+		    (cmd->advertising & ~(ADVERTISED_1000baseT_Half |
+					  ADVERTISED_1000baseT_Full |
+					  ADVERTISED_Autoneg |
+					  ADVERTISED_FIBRE)))
+			return -EINVAL;
+	}
+
 	spin_lock_irq(&tp->lock);
 	spin_lock(&tp->tx_lock);
 
@@ -5891,6 +5947,7 @@ static int tg3_set_settings(struct net_d
 		tp->link_config.speed = SPEED_INVALID;
 		tp->link_config.duplex = DUPLEX_INVALID;
 	} else {
+		tp->link_config.advertising = 0;
 		tp->link_config.speed = cmd->speed;
 		tp->link_config.duplex = cmd->duplex;
   	}
@@ -6357,8 +6414,8 @@ static struct subsys_tbl_ent subsys_id_t
 	{ PCI_VENDOR_ID_BROADCOM, 0x0007, PHY_ID_SERDES  }, /* BCM95701A7 */
 	{ PCI_VENDOR_ID_BROADCOM, 0x0008, PHY_ID_BCM5701 }, /* BCM95701A10 */
 	{ PCI_VENDOR_ID_BROADCOM, 0x8008, PHY_ID_BCM5701 }, /* BCM95701A12 */
-	{ PCI_VENDOR_ID_BROADCOM, 0x0009, PHY_ID_BCM5701 }, /* BCM95703Ax1 */
-	{ PCI_VENDOR_ID_BROADCOM, 0x8009, PHY_ID_BCM5701 }, /* BCM95703Ax2 */
+	{ PCI_VENDOR_ID_BROADCOM, 0x0009, PHY_ID_BCM5703 }, /* BCM95703Ax1 */
+	{ PCI_VENDOR_ID_BROADCOM, 0x8009, PHY_ID_BCM5703 }, /* BCM95703Ax2 */
 
 	/* 3com boards. */
 	{ PCI_VENDOR_ID_3COM, 0x1000, PHY_ID_BCM5401 }, /* 3C996T */
@@ -6458,19 +6515,27 @@ static int __devinit tg3_phy_probe(struc
 			tp->tg3_flags |= TG3_FLAG_SERDES_WOL_CAP;
 	}
 
-	/* Now read the physical PHY_ID from the chip and verify
-	 * that it is sane.  If it doesn't look good, we fall back
-	 * to either the hard-coded table based PHY_ID and failing
-	 * that the value found in the eeprom area.
-	 */
-	err  = tg3_readphy(tp, MII_PHYSID1, &hw_phy_id_1);
-	err |= tg3_readphy(tp, MII_PHYSID2, &hw_phy_id_2);
-
-	hw_phy_id  = (hw_phy_id_1 & 0xffff) << 10;
-	hw_phy_id |= (hw_phy_id_2 & 0xfc00) << 16;
-	hw_phy_id |= (hw_phy_id_2 & 0x03ff) <<  0;
+	/* Reading the PHY ID register can conflict with ASF
+	 * firwmare access to the PHY hardware.
+	 */
+	err = 0;
+	if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) {
+		hw_phy_id = hw_phy_id_masked = PHY_ID_INVALID;
+	} else {
+		/* Now read the physical PHY_ID from the chip and verify
+		 * that it is sane.  If it doesn't look good, we fall back
+		 * to either the hard-coded table based PHY_ID and failing
+		 * that the value found in the eeprom area.
+		 */
+		err |= tg3_readphy(tp, MII_PHYSID1, &hw_phy_id_1);
+		err |= tg3_readphy(tp, MII_PHYSID2, &hw_phy_id_2);
+
+		hw_phy_id  = (hw_phy_id_1 & 0xffff) << 10;
+		hw_phy_id |= (hw_phy_id_2 & 0xfc00) << 16;
+		hw_phy_id |= (hw_phy_id_2 & 0x03ff) <<  0;
 
-	hw_phy_id_masked = hw_phy_id & PHY_ID_MASK;
+		hw_phy_id_masked = hw_phy_id & PHY_ID_MASK;
+	}
 
 	if (!err && KNOWN_PHY_ID(hw_phy_id_masked)) {
 		tp->phy_id = hw_phy_id;
@@ -6487,38 +6552,61 @@ static int __devinit tg3_phy_probe(struc
 		}
 	}
 
-	err = tg3_phy_reset(tp, 1);
-	if (err)
-		return err;
+	if (tp->phy_id != PHY_ID_SERDES &&
+	    !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) {
+		u32 bmsr, adv_reg, tg3_ctrl;
 
-	if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
-	    tp->pci_chip_rev_id == CHIPREV_ID_5701_B0) {
-		u32 mii_tg3_ctrl;
-		
-		/* These chips, when reset, only advertise 10Mb
-		 * capabilities.  Fix that.
-		 */
-		err  = tg3_writephy(tp, MII_ADVERTISE,
-				    (ADVERTISE_CSMA |
-				     ADVERTISE_PAUSE_CAP |
-				     ADVERTISE_10HALF |
-				     ADVERTISE_10FULL |
-				     ADVERTISE_100HALF |
-				     ADVERTISE_100FULL));
-		mii_tg3_ctrl = (MII_TG3_CTRL_ADV_1000_HALF |
-				MII_TG3_CTRL_ADV_1000_FULL |
-				MII_TG3_CTRL_AS_MASTER |
-				MII_TG3_CTRL_ENABLE_AS_MASTER);
-		if (tp->tg3_flags & TG3_FLAG_10_100_ONLY)
-			mii_tg3_ctrl = 0;
+		tg3_readphy(tp, MII_BMSR, &bmsr);
+		tg3_readphy(tp, MII_BMSR, &bmsr);
+
+		if ((bmsr & BMSR_LSTATUS) &&
+		    !(GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
+		      GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
+		      GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705))
+			goto skip_phy_reset;
+		    
+		err = tg3_phy_reset(tp);
+		if (err)
+			return err;
+
+		adv_reg = (ADVERTISE_10HALF | ADVERTISE_10FULL |
+			   ADVERTISE_100HALF | ADVERTISE_100FULL |
+			   ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP);
+		tg3_ctrl = 0;
+		if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY)) {
+			tg3_ctrl = (MII_TG3_CTRL_ADV_1000_HALF |
+				    MII_TG3_CTRL_ADV_1000_FULL);
+			if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
+			    tp->pci_chip_rev_id == CHIPREV_ID_5701_B0)
+				tg3_ctrl |= (MII_TG3_CTRL_AS_MASTER |
+					     MII_TG3_CTRL_ENABLE_AS_MASTER);
+		}
+
+		if (!tg3_copper_is_advertising_all(tp)) {
+			tg3_writephy(tp, MII_ADVERTISE, adv_reg);
 
-		err |= tg3_writephy(tp, MII_TG3_CTRL, mii_tg3_ctrl);
-		err |= tg3_writephy(tp, MII_BMCR,
-				    (BMCR_ANRESTART | BMCR_ANENABLE));
+			if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY))
+				tg3_writephy(tp, MII_TG3_CTRL, tg3_ctrl);
+
+			tg3_writephy(tp, MII_BMCR,
+				     BMCR_ANENABLE | BMCR_ANRESTART);
+		}
+		tg3_phy_set_wirespeed(tp);
+
+		tg3_writephy(tp, MII_ADVERTISE, adv_reg);
+		if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY))
+			tg3_writephy(tp, MII_TG3_CTRL, tg3_ctrl);
+	}
+
+skip_phy_reset:
+	if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) {
+		err = tg3_init_5401phy_dsp(tp);
+		if (err)
+			return err;
 	}
 
 	if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703) {
-		tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00);
+		tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4c00);
 		tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x201f);
 		tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x2aaa);
 	}
@@ -7739,6 +7827,19 @@ static int __devinit tg3_init_one(struct
 		printk("%2.2x%c", dev->dev_addr[i],
 		       i == 5 ? '\n' : ':');
 
+	printk(KERN_INFO "%s: HostTXDS[%d] RXcsums[%d] LinkChgREG[%d] "
+	       "MIirq[%d] ASF[%d] Split[%d] WireSpeed[%d] "
+	       "TSOcap[%d] \n",
+	       dev->name,
+	       (tp->tg3_flags & TG3_FLAG_HOST_TXDS) != 0,
+	       (tp->tg3_flags & TG3_FLAG_RX_CHECKSUMS) != 0,
+	       (tp->tg3_flags & TG3_FLAG_USE_LINKCHG_REG) != 0,
+	       (tp->tg3_flags & TG3_FLAG_USE_MI_INTERRUPT) != 0,
+	       (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0,
+	       (tp->tg3_flags & TG3_FLAG_SPLIT_MODE) != 0,
+	       (tp->tg3_flags2 & TG3_FLG2_NO_ETH_WIRE_SPEED) == 0,
+	       (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) != 0);
+
 	return 0;
 
 err_out_iounmap:
--- diff/drivers/net/tokenring/3c359.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/tokenring/3c359.c	2004-04-21 10:45:34.463464256 +0100
@@ -345,6 +345,7 @@ int __devinit xl_probe(struct pci_dev *p
 	dev->get_stats=&xl_get_stats ;
 	dev->set_mac_address=&xl_set_mac_address ; 
 	SET_MODULE_OWNER(dev); 
+	SET_NETDEV_DEV(dev, &pdev->dev);
 
 	pci_set_drvdata(pdev,dev) ; 
 	if ((i = register_netdev(dev))) { 
--- diff/drivers/net/tokenring/abyss.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/tokenring/abyss.c	2004-04-21 10:45:34.464464104 +0100
@@ -167,6 +167,7 @@ static int __devinit abyss_attach(struct
 	dev->stop = abyss_close;
 
 	pci_set_drvdata(pdev, dev);
+	SET_NETDEV_DEV(dev, &pdev->dev);
 
 	ret = register_netdev(dev);
 	if (ret)
--- diff/drivers/net/tokenring/lanstreamer.c	2003-09-17 12:28:08.000000000 +0100
+++ source/drivers/net/tokenring/lanstreamer.c	2004-04-21 10:45:34.465463952 +0100
@@ -332,6 +332,7 @@ static int __devinit streamer_init_one(s
 	dev->set_mac_address = &streamer_set_mac_address;
 	dev->irq = pdev->irq;
 	dev->base_addr=pio_start;
+	SET_NETDEV_DEV(dev, &pdev->dev);
 
 	streamer_priv->streamer_card_name = (char *)pdev->resource[0].name;
 	streamer_priv->pci_dev = pdev;
--- diff/drivers/net/tokenring/olympic.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/tokenring/olympic.c	2004-04-21 10:45:34.466463800 +0100
@@ -259,6 +259,7 @@ static int __devinit olympic_probe(struc
 	dev->get_stats=&olympic_get_stats ;
 	dev->set_mac_address=&olympic_set_mac_address ;  
 	SET_MODULE_OWNER(dev) ; 
+	SET_NETDEV_DEV(dev, &pdev->dev);
 
 	pci_set_drvdata(pdev,dev) ; 
 	register_netdev(dev) ; 
--- diff/drivers/net/tokenring/tmspci.c	2004-03-11 10:20:26.000000000 +0000
+++ source/drivers/net/tokenring/tmspci.c	2004-04-21 10:45:34.466463800 +0100
@@ -164,6 +164,7 @@ static int __devinit tms_pci_attach(stru
 	dev->open = tms380tr_open;
 	dev->stop = tms380tr_close;
 	pci_set_drvdata(pdev, dev);
+	SET_NETDEV_DEV(dev, &pdev->dev);
 
 	ret = register_netdev(dev);
 	if (ret)
--- diff/drivers/net/tulip/de2104x.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/tulip/de2104x.c	2004-04-21 10:45:34.468463496 +0100
@@ -1676,8 +1676,6 @@ static void de_get_regs(struct net_devic
 {
 	struct de_private *de = dev->priv;
 
-	if (regs->len > DE_REGS_SIZE)
-		regs->len = DE_REGS_SIZE;
 	regs->version = (DE_REGS_VER << 2) | de->de21040;
 
 	spin_lock_irq(&de->lock);
--- diff/drivers/net/tulip/timer.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/tulip/timer.c	2004-04-21 10:45:34.469463344 +0100
@@ -153,16 +153,21 @@ void comet_timer(unsigned long data)
 {
 	struct net_device *dev = (struct net_device *)data;
 	struct tulip_private *tp = netdev_priv(dev);
-	long ioaddr = dev->base_addr;
 	int next_tick = 60*HZ;
 
 	if (tulip_debug > 1)
 		printk(KERN_DEBUG "%s: Comet link status %4.4x partner capability "
 			   "%4.4x.\n",
-			   dev->name, inl(ioaddr + 0xB8), inl(ioaddr + 0xC8));
+			   dev->name,
+			   tulip_mdio_read(dev, tp->phys[0], 1),
+			   tulip_mdio_read(dev, tp->phys[0], 5));
 	/* mod_timer synchronizes us with potential add_timer calls
 	 * from interrupts.
 	 */
+	if (tulip_check_duplex(dev) < 0)
+		{ netif_carrier_off(dev); }
+	else
+		{ netif_carrier_on(dev); }
 	mod_timer(&tp->timer, RUN_AT(next_tick));
 }
 
--- diff/drivers/net/tulip/tulip_core.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/tulip/tulip_core.c	2004-04-21 10:45:34.470463192 +0100
@@ -178,7 +178,7 @@ struct tulip_chip_table tulip_tbl[] = {
 
   /* COMET */
   { "ADMtek Comet", 256, 0x0001abef,
-	MC_HASH_ONLY | COMET_MAC_ADDR, comet_timer },
+	HAS_MII | MC_HASH_ONLY | COMET_MAC_ADDR, comet_timer },
 
   /* COMPEX9881 */
   { "Compex 9881 PMAC", 128, 0x0001ebef,
@@ -308,8 +308,8 @@ static void tulip_up(struct net_device *
 	tp->dirty_rx = tp->dirty_tx = 0;
 
 	if (tp->flags & MC_HASH_ONLY) {
-		u32 addr_low = cpu_to_le32(get_unaligned((u32 *)dev->dev_addr));
-		u32 addr_high = cpu_to_le32(get_unaligned((u16 *)(dev->dev_addr+4)));
+		u32 addr_low = le32_to_cpu(get_unaligned((u32 *)dev->dev_addr));
+		u32 addr_high = le16_to_cpu(get_unaligned((u16 *)(dev->dev_addr+4)));
 		if (tp->chip_id == AX88140) {
 			outl(0, ioaddr + CSR13);
 			outl(addr_low,  ioaddr + CSR14);
@@ -1434,8 +1434,8 @@ static int __devinit tulip_init_one (str
 		}
 	} else if (chip_idx == COMET) {
 		/* No need to read the EEPROM. */
-		put_unaligned(inl(ioaddr + 0xA4), (u32 *)dev->dev_addr);
-		put_unaligned(inl(ioaddr + 0xA8), (u16 *)(dev->dev_addr + 4));
+		put_unaligned(cpu_to_le32(inl(ioaddr + 0xA4)), (u32 *)dev->dev_addr);
+		put_unaligned(cpu_to_le16(inl(ioaddr + 0xA8)), (u16 *)(dev->dev_addr + 4));
 		for (i = 0; i < 6; i ++)
 			sum += dev->dev_addr[i];
 	} else {
--- diff/drivers/net/via-rhine.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/via-rhine.c	2004-04-21 10:45:34.471463040 +0100
@@ -28,10 +28,10 @@
 
 
 	Linux kernel version history:
-	
+
 	LK1.1.0:
 	- Jeff Garzik: softnet 'n stuff
-	
+
 	LK1.1.1:
 	- Justin Guyett: softnet and locking fixes
 	- Jeff Garzik: use PCI interface
@@ -58,7 +58,7 @@
 	LK1.1.6:
 	- Urban Widmark: merges from Beckers 1.08b version (VT6102 + mdio)
 	                 set netif_running_on/off on startup, del_timer_sync
-	
+
 	LK1.1.7:
 	- Manfred Spraul: added reset into tx_timeout
 
@@ -83,7 +83,7 @@
 	LK1.1.13 (jgarzik):
 	- Add ethtool support
 	- Replace some MII-related magic numbers with constants
-	
+
 	LK1.1.14 (Ivan G.):
  	- fixes comments for Rhine-III
 	- removes W_MAX_TIMEOUT (unused)
@@ -92,7 +92,7 @@
 	- sends chip_id as a parameter to wait_for_reset since np is not
 	  initialized on first call
 	- changes mmio "else if (chip_id==VT6102)" to "else" so it will work
-	  for Rhine-III's (documentation says same bit is correct)		
+	  for Rhine-III's (documentation says same bit is correct)
 	- transmit frame queue message is off by one - fixed
 	- adds IntrNormalSummary to "Something Wicked" exclusion list
 	  so normal interrupts will not trigger the message (src: Donald Becker)
@@ -316,10 +316,10 @@ IIId. Synchronization
 
 The driver runs as two independent, single-threaded flows of control.  One
 is the send-packet routine, which enforces single-threaded use by the
-dev->priv->lock spinlock. The other thread is the interrupt handler, which 
+dev->priv->lock spinlock. The other thread is the interrupt handler, which
 is single threaded by the hardware and interrupt handling software.
 
-The send packet thread has partial control over the Tx ring. It locks the 
+The send packet thread has partial control over the Tx ring. It locks the
 dev->priv->lock whenever it's queuing a Tx packet. If the next slot in the ring
 is not available it stops the transmit queue by calling netif_stop_queue.
 
@@ -639,7 +639,7 @@ static int __devinit via_rhine_init_one 
 #ifdef USE_MEM
 	long ioaddr0;
 #endif
-	
+
 /* when built into the kernel, we only print version if device is found */
 #ifndef MODULE
 	static int printed_version;
@@ -660,7 +660,7 @@ static int __devinit via_rhine_init_one 
 		printk(KERN_ERR "32-bit PCI DMA addresses not supported by the card!?\n");
 		goto err_out;
 	}
-	
+
 	/* sanity check */
 	if ((pci_resource_len (pdev, 0) < io_size) ||
 	    (pci_resource_len (pdev, 1) < io_size)) {
@@ -681,7 +681,7 @@ static int __devinit via_rhine_init_one 
 	}
 	SET_MODULE_OWNER(dev);
 	SET_NETDEV_DEV(dev, &pdev->dev);
-	
+
 	if (pci_request_regions(pdev, shortname))
 		goto err_out_free_netdev;
 
@@ -847,6 +847,8 @@ static int __devinit via_rhine_init_one 
 					netif_carrier_on(dev);
 				else
 					netif_carrier_off(dev);
+
+				break;
 			}
 		}
 		np->mii_cnt = phy_idx;
@@ -891,7 +893,7 @@ static int alloc_ring(struct net_device*
 	void *ring;
 	dma_addr_t ring_dma;
 
-	ring = pci_alloc_consistent(np->pdev, 
+	ring = pci_alloc_consistent(np->pdev,
 				    RX_RING_SIZE * sizeof(struct rx_desc) +
 				    TX_RING_SIZE * sizeof(struct tx_desc),
 				    &ring_dma);
@@ -903,7 +905,7 @@ static int alloc_ring(struct net_device*
 		np->tx_bufs = pci_alloc_consistent(np->pdev, PKT_BUF_SZ * TX_RING_SIZE,
 								   &np->tx_bufs_dma);
 		if (np->tx_bufs == NULL) {
-			pci_free_consistent(np->pdev, 
+			pci_free_consistent(np->pdev,
 				    RX_RING_SIZE * sizeof(struct rx_desc) +
 				    TX_RING_SIZE * sizeof(struct tx_desc),
 				    ring, ring_dma);
@@ -923,7 +925,7 @@ void free_ring(struct net_device* dev)
 {
 	struct netdev_private *np = dev->priv;
 
-	pci_free_consistent(np->pdev, 
+	pci_free_consistent(np->pdev,
 			    RX_RING_SIZE * sizeof(struct rx_desc) +
 			    TX_RING_SIZE * sizeof(struct tx_desc),
 			    np->rx_ring, np->rx_ring_dma);
@@ -948,7 +950,7 @@ static void alloc_rbufs(struct net_devic
 	np->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32);
 	np->rx_head_desc = &np->rx_ring[0];
 	next = np->rx_ring_dma;
-	
+
 	/* Init the ring entries */
 	for (i = 0; i < RX_RING_SIZE; i++) {
 		np->rx_ring[i].rx_status = 0;
@@ -1151,7 +1153,7 @@ static int via_rhine_open(struct net_dev
 	if (debug > 1)
 		printk(KERN_DEBUG "%s: via_rhine_open() irq %d.\n",
 			   dev->name, np->pdev->irq);
-	
+
 	i = alloc_ring(dev);
 	if (i)
 		return i;
@@ -1266,7 +1268,7 @@ static void via_rhine_tx_timeout (struct
 	/* Reinitialize the hardware. */
 	wait_for_reset(dev, np->chip_id, dev->name);
 	init_registers(dev);
-	
+
 	spin_unlock(&np->lock);
 	enable_irq(np->pdev->irq);
 
@@ -1316,7 +1318,7 @@ static int via_rhine_start_tx(struct sk_
 		np->tx_ring[entry].addr = cpu_to_le32(np->tx_skbuff_dma[entry]);
 	}
 
-	np->tx_ring[entry].desc_length = 
+	np->tx_ring[entry].desc_length =
 		cpu_to_le32(TXDESC | (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN));
 
 	/* lock eth irq */
@@ -1364,7 +1366,7 @@ static irqreturn_t via_rhine_interrupt(i
 	int handled = 0;
 
 	ioaddr = dev->base_addr;
-	
+
 	while ((intr_status = get_intr_status(dev))) {
 		handled = 1;
 
@@ -1584,7 +1586,7 @@ static void via_rhine_rx(struct net_devi
 				break;			/* Better luck next round. */
 			skb->dev = dev;			/* Mark as being used by this device. */
 			np->rx_skbuff_dma[entry] =
-				pci_map_single(np->pdev, skb->tail, np->rx_buf_sz, 
+				pci_map_single(np->pdev, skb->tail, np->rx_buf_sz,
 							   PCI_DMA_FROMDEVICE);
 			np->rx_ring[entry].addr = cpu_to_le32(np->rx_skbuff_dma[entry]);
 		}
@@ -1892,7 +1894,7 @@ static int via_rhine_close(struct net_de
 static void __devexit via_rhine_remove_one (struct pci_dev *pdev)
 {
 	struct net_device *dev = pci_get_drvdata(pdev);
-	
+
 	unregister_netdev(dev);
 
 	pci_release_regions(pdev);
--- diff/drivers/net/wan/cycx_drv.c	2004-01-19 10:22:58.000000000 +0000
+++ source/drivers/net/wan/cycx_drv.c	2004-04-21 10:45:34.471463040 +0100
@@ -425,7 +425,7 @@ static int load_cyc2x(struct cycx_hw *hw
 	if (cksum != cfm->checksum) {
 		printk(KERN_ERR "%s:%s: firmware corrupted!\n",
 				modname, __FUNCTION__);
-		printk(KERN_ERR " cdsize = 0x%x (expected 0x%x)\n",
+		printk(KERN_ERR " cdsize = 0x%x (expected 0x%lx)\n",
 				len - (int)sizeof(struct cycx_firmware) - 1,
 				cfm->info.codesize);
 		printk(KERN_ERR " chksum = 0x%x (expected 0x%x)\n",
--- diff/drivers/net/wan/lapbether.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/wan/lapbether.c	2004-04-21 10:45:34.472462888 +0100
@@ -392,6 +392,8 @@ static void lapbeth_free_device(struct l
 
 /*
  *	Handle device status changes.
+ *
+ * Called from notifier with RTNL held.
  */
 static int lapbeth_device_event(struct notifier_block *this,
 				unsigned long event, void *ptr)
@@ -402,7 +404,6 @@ static int lapbeth_device_event(struct n
 	if (!dev_is_ethdev(dev))
 		return NOTIFY_DONE;
 
-	rcu_read_lock();
 	switch (event) {
 	case NETDEV_UP:
 		/* New ethernet device -> new LAPB interface	 */
@@ -422,7 +423,6 @@ static int lapbeth_device_event(struct n
 			lapbeth_free_device(lapbeth);
 		break;
 	}
-	rcu_read_unlock();
 
 	return NOTIFY_DONE;
 }
--- diff/drivers/net/wan/lmc/lmc_proto.c	2003-08-20 14:16:10.000000000 +0100
+++ source/drivers/net/wan/lmc/lmc_proto.c	2004-04-21 10:45:34.472462888 +0100
@@ -50,7 +50,6 @@
 #include "lmc_debug.h"
 #include "lmc_ioctl.h"
 #include "lmc_proto.h"
-//#include "lmc_proto_raw.h"
 
 /*
  * The compile-time variable SPPPSTUP causes the module to be
--- diff/drivers/net/wan/pc300_drv.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/wan/pc300_drv.c	2004-04-21 10:45:34.474462584 +0100
@@ -370,7 +370,7 @@ static void tx_dma_buf_check(pc300_t * c
 	ucshort first_bd = card->chan[ch].tx_first_bd;
 	ucshort next_bd = card->chan[ch].tx_next_bd;
 
-	printk("#CH%d: f_bd = %d(0x%08x), n_bd = %d(0x%08x)\n", ch,
+	printk("#CH%d: f_bd = %d(0x%08zx), n_bd = %d(0x%08zx)\n", ch,
 	       first_bd, TX_BD_ADDR(ch, first_bd),
 	       next_bd, TX_BD_ADDR(ch, next_bd));
 	for (i = first_bd,
--- diff/drivers/net/wan/sbni.c	2004-03-11 10:20:26.000000000 +0000
+++ source/drivers/net/wan/sbni.c	2004-04-21 10:45:34.475462432 +0100
@@ -333,8 +333,10 @@ sbni_pci_probe( struct net_device  *dev 
 			release_region( pci_ioaddr, SBNI_IO_EXTENT );
 			return  -EIO;
 		}
-		if( sbni_probe1( dev, pci_ioaddr, pci_irq_line ) )
+		if( sbni_probe1( dev, pci_ioaddr, pci_irq_line ) ) {
+			SET_NETDEV_DEV(dev, &pdev->dev);
 			return  0;
+		}
 	}
 	return  -ENODEV;
 }
--- diff/drivers/net/wan/sdla.c	2004-03-11 10:20:26.000000000 +0000
+++ source/drivers/net/wan/sdla.c	2004-04-21 10:45:34.476462280 +0100
@@ -1206,6 +1206,7 @@ static int sdla_xfer(struct net_device *
 		temp = kmalloc(mem.len, GFP_KERNEL);
 		if (!temp)
 			return(-ENOMEM);
+		memset(temp, 0, mem.len);
 		sdla_read(dev, mem.addr, temp, mem.len);
 		if(copy_to_user(mem.data, temp, mem.len))
 		{
--- diff/drivers/net/wireless/airo.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/wireless/airo.c	2004-04-21 10:45:34.480461672 +0100
@@ -1071,7 +1071,7 @@ struct airo_info;
 static int get_dec_u16( char *buffer, int *start, int limit );
 static void OUT4500( struct airo_info *, u16 register, u16 value );
 static unsigned short IN4500( struct airo_info *, u16 register );
-static u16 setup_card(struct airo_info*, u8 *mac);
+static u16 setup_card(struct airo_info*, u8 *mac, int lock);
 static int enable_MAC( struct airo_info *ai, Resp *rsp, int lock );
 static void disable_MAC(struct airo_info *ai, int lock);
 static void enable_interrupts(struct airo_info*);
@@ -1709,9 +1709,9 @@ static int readBSSListRid(struct airo_in
 	return rc;
 }
 
-static int readWepKeyRid(struct airo_info*ai, WepKeyRid *wkr, int temp) {
+static int readWepKeyRid(struct airo_info*ai, WepKeyRid *wkr, int temp, int lock) {
 	int rc = PC4500_readrid(ai, temp ? RID_WEP_TEMP : RID_WEP_PERM,
-				wkr, sizeof(*wkr), 1);
+				wkr, sizeof(*wkr), lock);
 
 	wkr->len = le16_to_cpu(wkr->len);
 	wkr->kindex = le16_to_cpu(wkr->kindex);
@@ -1748,7 +1748,7 @@ static int readSsidRid(struct airo_info*
 	}
 	return rc;
 }
-static int writeSsidRid(struct airo_info*ai, SsidRid *pssidr) {
+static int writeSsidRid(struct airo_info*ai, SsidRid *pssidr, int lock) {
 	int rc;
 	int i;
 	SsidRid ssidr = *pssidr;
@@ -1757,7 +1757,7 @@ static int writeSsidRid(struct airo_info
 	for(i = 0; i < 3; i++) {
 		ssidr.ssids[i].len = cpu_to_le16(ssidr.ssids[i].len);
 	}
-	rc = PC4500_writerid(ai, RID_SSID, &ssidr, sizeof(ssidr), 1);
+	rc = PC4500_writerid(ai, RID_SSID, &ssidr, sizeof(ssidr), lock);
 	return rc;
 }
 static int readConfigRid(struct airo_info*ai, int lock) {
@@ -1850,14 +1850,14 @@ static int readAPListRid(struct airo_inf
 	aplr->len = le16_to_cpu(aplr->len);
 	return rc;
 }
-static int writeAPListRid(struct airo_info*ai, APListRid *aplr) {
+static int writeAPListRid(struct airo_info*ai, APListRid *aplr, int lock) {
 	int rc;
 	aplr->len = cpu_to_le16(aplr->len);
-	rc = PC4500_writerid(ai, RID_APLIST, aplr, sizeof(*aplr), 1);
+	rc = PC4500_writerid(ai, RID_APLIST, aplr, sizeof(*aplr), lock);
 	return rc;
 }
-static int readCapabilityRid(struct airo_info*ai, CapabilityRid *capr) {
-	int rc = PC4500_readrid(ai, RID_CAPABILITIES, capr, sizeof(*capr), 1);
+static int readCapabilityRid(struct airo_info*ai, CapabilityRid *capr, int lock) {
+	int rc = PC4500_readrid(ai, RID_CAPABILITIES, capr, sizeof(*capr), lock);
 	u16 *s;
 
 	capr->len = le16_to_cpu(capr->len);
@@ -2213,6 +2213,10 @@ static void airo_read_stats(struct airo_
 	u32 *vals = stats_rid.vals;
 
 	clear_bit(JOB_STATS, &ai->flags);
+	if (ai->power) {
+		up(&ai->sem);
+		return;
+	}
 	readStatsRid(ai, &stats_rid, RID_STATS, 0);
 	up(&ai->sem);
 
@@ -2649,10 +2653,10 @@ static struct net_device *init_wifidev(s
 	return dev;
 }
 
-int reset_mpi_card( struct net_device *dev ) {
+int reset_mpi_card( struct net_device *dev , int lock) {
 	struct airo_info *ai = dev->priv;
 
-	if (down_interruptible(&ai->sem))
+	if (lock && down_interruptible(&ai->sem))
 		return -1;
 	waitbusy (ai);
 	OUT4500(ai,COMMAND,CMD_SOFTRESET);
@@ -2661,7 +2665,8 @@ int reset_mpi_card( struct net_device *d
 	waitbusy (ai);
 	set_current_state (TASK_UNINTERRUPTIBLE);
 	schedule_timeout (HZ/5);
-	up(&ai->sem);
+	if (lock)
+		up(&ai->sem);
 	return 0;
 }
 
@@ -2727,8 +2732,13 @@ struct net_device *_init_airo_card( unsi
 	dev->irq = irq;
 	dev->base_addr = port;
 
+	/* what is with PCMCIA ??? */
+	if (pci) {
+		SET_NETDEV_DEV(dev, &pci->dev);
+	}
+
 	if (test_bit(FLAG_MPI,&ai->flags))
-		reset_mpi_card (dev);
+		reset_mpi_card (dev, 1);
 
 	rc = request_irq( dev->irq, airo_interrupt, SA_SHIRQ, dev->name, dev );
 	if (rc) {
@@ -2751,7 +2761,7 @@ struct net_device *_init_airo_card( unsi
 	}
 
 	if (probe) {
-		if ( setup_card( ai, dev->dev_addr ) != SUCCESS ) {
+		if ( setup_card( ai, dev->dev_addr, 1 ) != SUCCESS ) {
 			printk( KERN_ERR "airo: MAC could not be enabled\n" );
 			rc = -EIO;
 			goto err_out_map;
@@ -2830,10 +2840,10 @@ int reset_airo_card( struct net_device *
 	int i;
 	struct airo_info *ai = dev->priv;
 
-	if (reset_mpi_card (dev))
+	if (reset_mpi_card (dev, 1))
 		return -1;
 
-	if ( setup_card(ai, dev->dev_addr ) != SUCCESS ) {
+	if ( setup_card(ai, dev->dev_addr, 1 ) != SUCCESS ) {
 		printk( KERN_ERR "airo: MAC could not be enabled\n" );
 		return -1;
 	}
@@ -2883,7 +2893,7 @@ static int airo_thread(void *data) {
 
 		/* make swsusp happy with our thread */
 		if (current->flags & PF_FREEZE)
-			refrigerator(PF_IOTHREAD);
+			refrigerator(PF_FREEZE);
 
 		if (test_bit(JOB_DIE, &ai->flags))
 			break;
@@ -3473,7 +3483,7 @@ badrx:
 	}
 }
 
-static u16 setup_card(struct airo_info *ai, u8 *mac)
+static u16 setup_card(struct airo_info *ai, u8 *mac, int lock)
 {
 	Cmd cmd;
 	Resp rsp;
@@ -3493,10 +3503,11 @@ static u16 setup_card(struct airo_info *
 	/* The NOP is the first step in getting the card going */
 	cmd.cmd = NOP;
 	cmd.parm0 = cmd.parm1 = cmd.parm2 = 0;
-	if (down_interruptible(&ai->sem))
+	if (lock && down_interruptible(&ai->sem))
 		return ERROR;
 	if ( issuecommand( ai, &cmd, &rsp ) != SUCCESS ) {
-		up(&ai->sem);
+		if (lock)
+			up(&ai->sem);
 		return ERROR;
 	}
 	disable_MAC( ai, 0);
@@ -3505,7 +3516,8 @@ static u16 setup_card(struct airo_info *
 	if (!test_bit(FLAG_MPI,&ai->flags)) {
 		cmd.cmd = CMD_ENABLEAUX;
 		if (issuecommand(ai, &cmd, &rsp) != SUCCESS) {
-			up(&ai->sem);
+			if (lock)
+				up(&ai->sem);
 			printk(KERN_ERR "airo: Error checking for AUX port\n");
 			return ERROR;
 		}
@@ -3517,7 +3529,8 @@ static u16 setup_card(struct airo_info *
 			printk(KERN_DEBUG "airo: Doing AUX bap_reads\n");
 		}
 	}
-	up(&ai->sem);
+	if (lock)
+		up(&ai->sem);
 	if (ai->config.len == 0) {
 		tdsRssiRid rssi_rid;
 		CapabilityRid cap_rid;
@@ -3531,10 +3544,10 @@ static u16 setup_card(struct airo_info *
 			ai->SSID = NULL;
 		}
 		// general configuration (read/modify/write)
-		status = readConfigRid(ai, 1);
+		status = readConfigRid(ai, lock);
 		if ( status != SUCCESS ) return ERROR;
 
-		status = readCapabilityRid(ai, &cap_rid);
+		status = readCapabilityRid(ai, &cap_rid, lock);
 		if ( status != SUCCESS ) return ERROR;
 
 		if (test_bit(FLAG_MPI, &ai->flags) &&
@@ -3543,7 +3556,7 @@ static u16 setup_card(struct airo_info *
 		    strcmp (cap_rid.prodVer, "5b00.08"))
 			printk(KERN_ERR "airo: Firmware version %s is not supported. Use it at your own risk!\n", cap_rid.prodVer);
 
-		status = PC4500_readrid(ai,RID_RSSI,&rssi_rid,sizeof(rssi_rid),1);
+		status = PC4500_readrid(ai,RID_RSSI,&rssi_rid,sizeof(rssi_rid),lock);
 		if ( status == SUCCESS ) {
 			if (ai->rssi || (ai->rssi = kmalloc(512, GFP_KERNEL)) != NULL)
 				memcpy(ai->rssi, (u8*)&rssi_rid + 2, 512);
@@ -3610,29 +3623,29 @@ static u16 setup_card(struct airo_info *
 		mySsid.len = sizeof(mySsid);
 	}
 
-	status = writeConfigRid(ai, 1);
+	status = writeConfigRid(ai, lock);
 	if ( status != SUCCESS ) return ERROR;
 
 	/* Set up the SSID list */
 	if ( ssids[0] ) {
-		status = writeSsidRid(ai, &mySsid);
+		status = writeSsidRid(ai, &mySsid, lock);
 		if ( status != SUCCESS ) return ERROR;
 	}
 
-	status = enable_MAC(ai, &rsp, 1);
+	status = enable_MAC(ai, &rsp, lock);
 	if ( status != SUCCESS || (rsp.status & 0xFF00) != 0) {
 		printk( KERN_ERR "airo: Bad MAC enable reason = %x, rid = %x, offset = %d\n", rsp.rsp0, rsp.rsp1, rsp.rsp2 );
 		return ERROR;
 	}
 
 	/* Grab the initial wep key, we gotta save it for auto_wep */
-	rc = readWepKeyRid(ai, &wkr, 1);
+	rc = readWepKeyRid(ai, &wkr, 1, lock);
 	if (rc == SUCCESS) do {
 		lastindex = wkr.kindex;
 		if (wkr.kindex == 0xffff) {
 			ai->defindex = wkr.mac[0];
 		}
-		rc = readWepKeyRid(ai, &wkr, 0);
+		rc = readWepKeyRid(ai, &wkr, 0, lock);
 	} while(lastindex != wkr.kindex);
 
 	if (auto_wep) {
@@ -4417,7 +4430,7 @@ static int proc_status_open( struct inod
 	}
 
 	readStatusRid(apriv, &status_rid, 1);
-	readCapabilityRid(apriv, &cap_rid);
+	readCapabilityRid(apriv, &cap_rid, 1);
 
         i = sprintf(data->rbuffer, "Status: %s%s%s%s%s%s%s%s%s\n",
                     status_rid.mode & 1 ? "CFG ": "",
@@ -4865,7 +4878,7 @@ static void proc_SSID_on_close( struct i
 	if (i)
 		SSID_rid.len = sizeof(SSID_rid);
 	disable_MAC(ai, 1);
-	writeSsidRid(ai, &SSID_rid);
+	writeSsidRid(ai, &SSID_rid, 1);
 	enable_MAC(ai, &rsp, 1);
 }
 
@@ -4906,7 +4919,7 @@ static void proc_APList_on_close( struct
 		}
 	}
 	disable_MAC(ai, 1);
-	writeAPListRid(ai, &APList_rid);
+	writeAPListRid(ai, &APList_rid, 1);
 	enable_MAC(ai, &rsp, 1);
 }
 
@@ -4931,7 +4944,7 @@ static int get_wep_key(struct airo_info 
 	int rc;
 	u16 lastindex;
 
-	rc = readWepKeyRid(ai, &wkr, 1);
+	rc = readWepKeyRid(ai, &wkr, 1, 1);
 	if (rc == SUCCESS) do {
 		lastindex = wkr.kindex;
 		if (wkr.kindex == index) {
@@ -4940,7 +4953,7 @@ static int get_wep_key(struct airo_info 
 			}
 			return wkr.klen;
 		}
-		readWepKeyRid(ai, &wkr, 0);
+		readWepKeyRid(ai, &wkr, 0, 1);
 	} while(lastindex != wkr.kindex);
 	return -1;
 }
@@ -5049,7 +5062,7 @@ static int proc_wepkey_open( struct inod
 
 	ptr = data->rbuffer;
 	strcpy(ptr, "No wep keys\n");
-	rc = readWepKeyRid(ai, &wkr, 1);
+	rc = readWepKeyRid(ai, &wkr, 1, 1);
 	if (rc == SUCCESS) do {
 		lastindex = wkr.kindex;
 		if (wkr.kindex == 0xffff) {
@@ -5059,7 +5072,7 @@ static int proc_wepkey_open( struct inod
 			j += sprintf(ptr+j, "Key %d set with length = %d\n",
 				     (int)wkr.kindex, (int)wkr.klen);
 		}
-		readWepKeyRid(ai, &wkr, 0);
+		readWepKeyRid(ai, &wkr, 0, 1);
 	} while((lastindex != wkr.kindex) && (j < 180-30));
 
 	data->readlen = strlen( data->rbuffer );
@@ -5349,6 +5362,7 @@ static int airo_pci_suspend(struct pci_d
 	readAPListRid(ai, ai->APList);
 	readSsidRid(ai, ai->SSID);
 	memset(&cmd, 0, sizeof(cmd));
+	/* the lock will be released at the end of the resume callback */
 	if (down_interruptible(&ai->sem))
 		return -EAGAIN;
 	disable_MAC(ai, 0);
@@ -5356,7 +5370,6 @@ static int airo_pci_suspend(struct pci_d
 	ai->power = state;
 	cmd.cmd=HOSTSLEEP;
 	issuecommand(ai, &cmd, &rsp);
-	up(&ai->sem);
 	return 0;
 }
 
@@ -5372,8 +5385,8 @@ static int airo_pci_resume(struct pci_de
 	if (!ai->power)
 		return 0;
 
-	if (ai->power > 2) {
-		err = reset_mpi_card(dev);
+	if (ai->power > 1) {
+		err = reset_mpi_card(dev, 0);
 		if (err) {
 			printk(KERN_ERR "%s: Error %d resetting on %s()\n",
 			       dev->name, err, __FUNCTION__);
@@ -5381,7 +5394,7 @@ static int airo_pci_resume(struct pci_de
 		}
 		schedule_timeout (HZ/2);
 		mpi_init_descriptors(ai);
-		setup_card(ai, dev->dev_addr);
+		setup_card(ai, dev->dev_addr, 0);
 		clear_bit(FLAG_RADIO_OFF, &ai->flags);
 		clear_bit(FLAG_RADIO_DOWN, &ai->flags);
 		clear_bit(FLAG_PENDING_XMIT, &ai->flags);
@@ -5392,24 +5405,25 @@ static int airo_pci_resume(struct pci_de
 	}
 
 	set_bit (FLAG_COMMIT, &ai->flags);
-	disable_MAC(ai, 1);
+	disable_MAC(ai, 0);
         schedule_timeout (HZ/5);
 	if (ai->SSID) {
-		writeSsidRid(ai, ai->SSID);
+		writeSsidRid(ai, ai->SSID, 0);
 		kfree(ai->SSID);
 		ai->SSID = NULL;
 	}
 	if (ai->APList) {
-		writeAPListRid(ai, ai->APList);
+		writeAPListRid(ai, ai->APList, 0);
 		kfree(ai->APList);
 		ai->APList = NULL;
 	}
-	writeConfigRid(ai, 1);
-	enable_MAC(ai, &rsp, 1);
+	writeConfigRid(ai, 0);
+	enable_MAC(ai, &rsp, 0);
 	ai->power = 0;
 	netif_device_attach(dev);
 	netif_wake_queue(dev);
 	enable_interrupts(ai);
+	up(&ai->sem);
 	return 0;
 }
 #endif
@@ -5597,7 +5611,7 @@ static int airo_set_essid(struct net_dev
 	SSID_rid.len = sizeof(SSID_rid);
 	/* Write it to the card */
 	disable_MAC(local, 1);
-	writeSsidRid(local, &SSID_rid);
+	writeSsidRid(local, &SSID_rid, 1);
 	enable_MAC(local, &rsp, 1);
 
 	return 0;
@@ -5661,7 +5675,7 @@ static int airo_set_wap(struct net_devic
 		APList_rid.len = sizeof(APList_rid);
 		memcpy(APList_rid.ap[0], awrq->sa_data, ETH_ALEN);
 		disable_MAC(local, 1);
-		writeAPListRid(local, &APList_rid);
+		writeAPListRid(local, &APList_rid, 1);
 		enable_MAC(local, &rsp, 1);
 	}
 	return 0;
@@ -5745,7 +5759,7 @@ static int airo_set_rate(struct net_devi
 	int	i;
 
 	/* First : get a valid bit rate value */
-	readCapabilityRid(local, &cap_rid);
+	readCapabilityRid(local, &cap_rid, 1);
 
 	/* Which type of value ? */
 	if((vwrq->value < 8) && (vwrq->value >= 0)) {
@@ -6015,7 +6029,7 @@ static int airo_set_encode(struct net_de
 	CapabilityRid cap_rid;		/* Card capability info */
 
 	/* Is WEP supported ? */
-	readCapabilityRid(local, &cap_rid);
+	readCapabilityRid(local, &cap_rid, 1);
 	/* Older firmware doesn't support this...
 	if(!(cap_rid.softCap & 2)) {
 		return -EOPNOTSUPP;
@@ -6103,7 +6117,7 @@ static int airo_get_encode(struct net_de
 	CapabilityRid cap_rid;		/* Card capability info */
 
 	/* Is it supported ? */
-	readCapabilityRid(local, &cap_rid);
+	readCapabilityRid(local, &cap_rid, 1);
 	if(!(cap_rid.softCap & 2)) {
 		return -EOPNOTSUPP;
 	}
@@ -6151,7 +6165,7 @@ static int airo_set_txpow(struct net_dev
 	int i;
 	int rc = -EINVAL;
 
-	readCapabilityRid(local, &cap_rid);
+	readCapabilityRid(local, &cap_rid, 1);
 
 	if (vwrq->disabled) {
 		set_bit (FLAG_RADIO_OFF | FLAG_COMMIT, &local->flags);
@@ -6275,7 +6289,7 @@ static int airo_get_range(struct net_dev
 	int		i;
 	int		k;
 
-	readCapabilityRid(local, &cap_rid);
+	readCapabilityRid(local, &cap_rid, 1);
 
 	dwrq->length = sizeof(struct iw_range);
 	memset(range, 0, sizeof(*range));
@@ -6774,8 +6788,8 @@ static int airo_config_commit(struct net
 		readSsidRid(local, &SSID_rid);
 		reset_airo_card(dev);
 		disable_MAC(local, 1);
-		writeSsidRid(local, &SSID_rid);
-		writeAPListRid(local, &APList_rid);
+		writeSsidRid(local, &SSID_rid, 1);
+		writeAPListRid(local, &APList_rid, 1);
 	}
 	if (down_interruptible(&local->sem))
 		return -ERESTARTSYS;
@@ -7097,7 +7111,10 @@ static int readrids(struct net_device *d
 
 static int writerids(struct net_device *dev, aironet_ioctl *comp) {
 	struct airo_info *ai = dev->priv;
-	int  ridcode, enabled;
+	int  ridcode;
+#ifdef MICSUPPORT
+        int  enabled;
+#endif
 	Resp      rsp;
 	static int (* writer)(struct airo_info *, u16 rid, const void *, int, int);
 	unsigned char *iobuf;
@@ -7425,7 +7442,7 @@ int flashrestart(struct airo_info *ai,st
 	set_current_state (TASK_UNINTERRUPTIBLE);
 	schedule_timeout (HZ);          /* Added 12/7/00 */
 	clear_bit (FLAG_FLASHING, &ai->flags);
-	status = setup_card(ai, dev->dev_addr);
+	status = setup_card(ai, dev->dev_addr, 1);
 
 	if (!test_bit(FLAG_MPI,&ai->flags))
 		for( i = 0; i < MAX_FIDS; i++ ) {
--- diff/drivers/net/wireless/orinoco.h	2003-06-30 10:07:21.000000000 +0100
+++ source/drivers/net/wireless/orinoco.h	2004-04-21 10:45:34.480461672 +0100
@@ -125,8 +125,8 @@ extern int orinoco_debug;
 #define DEBUG(n, args...) do { } while (0)
 #endif	/* ORINOCO_DEBUG */
 
-#define TRACE_ENTER(devname) DEBUG(2, "%s: -> " __FUNCTION__ "()\n", devname);
-#define TRACE_EXIT(devname)  DEBUG(2, "%s: <- " __FUNCTION__ "()\n", devname);
+#define TRACE_ENTER(devname) DEBUG(2, "%s: -> %s()\n", devname, __FUNCTION__);
+#define TRACE_EXIT(devname)  DEBUG(2, "%s: <- %s()\n", devname, __FUNCTION__);
 
 extern struct net_device *alloc_orinocodev(int sizeof_card,
 					   int (*hard_reset)(struct orinoco_private *));
--- diff/drivers/net/wireless/orinoco_pci.c	2004-02-18 08:54:10.000000000 +0000
+++ source/drivers/net/wireless/orinoco_pci.c	2004-04-21 10:45:34.481461520 +0100
@@ -220,6 +220,7 @@ static int orinoco_pci_init_one(struct p
 	dev->mem_end = pci_iorange + pci_iolen - 1;
 
 	SET_MODULE_OWNER(dev);
+	SET_NETDEV_DEV(dev, &pdev->dev);
 
 	printk(KERN_DEBUG
 	       "Detected Orinoco/Prism2 PCI device at %s, mem:0x%lX to 0x%lX -> 0x%p, irq:%d\n",
@@ -277,9 +278,6 @@ static void __devexit orinoco_pci_remove
 	struct net_device *dev = pci_get_drvdata(pdev);
 	struct orinoco_private *priv = dev->priv;
 
-	if (! dev)
-		BUG();
-
 	unregister_netdev(dev);
 
         if (dev->irq)
--- diff/drivers/net/wireless/orinoco_plx.c	2004-02-18 08:54:10.000000000 +0000
+++ source/drivers/net/wireless/orinoco_plx.c	2004-04-21 10:45:34.481461520 +0100
@@ -233,6 +233,7 @@ static int orinoco_plx_init_one(struct p
 	priv = dev->priv;
 	dev->base_addr = pccard_ioaddr;
 	SET_MODULE_OWNER(dev);
+	SET_NETDEV_DEV(dev, &pdev->dev);
 
 	printk(KERN_DEBUG
 	       "Detected Orinoco/Prism2 PLX device at %s irq:%d, io addr:0x%lx\n",
--- diff/drivers/net/wireless/orinoco_tmd.c	2004-02-18 08:54:10.000000000 +0000
+++ source/drivers/net/wireless/orinoco_tmd.c	2004-04-21 10:45:34.482461368 +0100
@@ -125,6 +125,7 @@ static int orinoco_tmd_init_one(struct p
 	priv = dev->priv;
 	dev->base_addr = pccard_ioaddr;
 	SET_MODULE_OWNER(dev);
+	SET_NETDEV_DEV(dev, &pdev->dev);
 
 	printk(KERN_DEBUG
 	       "Detected Orinoco/Prism2 TMD device at %s irq:%d, io addr:0x%lx\n",
--- diff/drivers/net/wireless/strip.c	2004-03-11 10:20:26.000000000 +0000
+++ source/drivers/net/wireless/strip.c	2004-04-21 10:45:34.483461216 +0100
@@ -1727,7 +1727,7 @@ static void get_radio_version(struct str
 		sprintf(strip_info->serial_number.c, "%.*s", len, p);
 	} else {
 		printk(KERN_DEBUG
-		       "STRIP: radio serial number shorter (%d) than expected (%d)\n",
+		       "STRIP: radio serial number shorter (%zd) than expected (%d)\n",
 		       end - p, len);
 	}
 }
@@ -1745,7 +1745,7 @@ static void get_radio_voltage(struct str
 		sprintf(strip_info->battery_voltage.c, "%.*s", len, ptr);
 	} else {
 		printk(KERN_DEBUG
-		       "STRIP: radio voltage string shorter (%d) than expected (%d)\n",
+		       "STRIP: radio voltage string shorter (%zd) than expected (%d)\n",
 		       end - ptr, len);
 	}
 }
@@ -2330,7 +2330,7 @@ static void strip_receive_buf(struct tty
 			if (*cp == 0x0D) {	/* If end of packet, decide what to do with it */
 				if (strip_info->sx_count > 3000)
 					printk(KERN_INFO
-					       "%s: Cut a %d byte packet (%d bytes remaining)%s\n",
+					       "%s: Cut a %d byte packet (%zd bytes remaining)%s\n",
 					       strip_info->dev->name,
 					       strip_info->sx_count,
 					       end - cp - 1,
--- diff/drivers/net/zorro8390.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/zorro8390.c	2004-04-21 10:45:34.484461064 +0100
@@ -60,11 +60,11 @@
 #define WORDSWAP(a)	((((a)>>8)&0xff) | ((a)<<8))
 
 
-static const struct card_info {
+static struct card_info {
     zorro_id id;
     const char *name;
     unsigned int offset;
-} cards[] __initdata = {
+} cards[] __devinitdata = {
     { ZORRO_PROD_VILLAGE_TRONIC_ARIADNE2, "Ariadne II", 0x0600 },
     { ZORRO_PROD_INDIVIDUAL_COMPUTERS_X_SURF, "X-Surf", 0x8600 },
 };
@@ -150,7 +150,7 @@ static int __devinit zorro8390_init(stru
 
 	while ((z_readb(ioaddr + NE_EN0_ISR) & ENISR_RESET) == 0)
 	    if (jiffies - reset_start_time > 2*HZ/100) {
-		printk(" not found (no reset ack).\n");
+		printk(KERN_WARNING " not found (no reset ack).\n");
 		return -ENODEV;
 	    }
 
@@ -208,11 +208,6 @@ static int __devinit zorro8390_init(stru
 	dev->dev_addr[i] = SA_prom[i];
     }
 
-    printk("%s: %s at 0x%08lx, Ethernet Address "
-	   "%02x:%02x:%02x:%02x:%02x:%02x\n", dev->name, name, board,
-	   dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
-	   dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
-
     ei_status.name = name;
     ei_status.tx_start_page = start_page;
     ei_status.stop_page = stop_page;
@@ -233,9 +228,17 @@ static int __devinit zorro8390_init(stru
 
     NS8390_init(dev, 0);
     err = register_netdev(dev);
-    if (err)
+    if (err) {
 	free_irq(IRQ_AMIGA_PORTS, dev);
-    return err;
+	return err;
+    }
+
+    printk(KERN_INFO "%s: %s at 0x%08lx, Ethernet Address "
+	   "%02x:%02x:%02x:%02x:%02x:%02x\n", dev->name, name, board,
+	   dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
+	   dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
+
+    return 0;
 }
 
 static int zorro8390_open(struct net_device *dev)
@@ -247,7 +250,7 @@ static int zorro8390_open(struct net_dev
 static int zorro8390_close(struct net_device *dev)
 {
     if (ei_debug > 1)
-	printk("%s: Shutting down ethercard.\n", dev->name);
+	printk(KERN_DEBUG "%s: Shutting down ethercard.\n", dev->name);
     ei_close(dev);
     return 0;
 }
@@ -259,7 +262,7 @@ static void zorro8390_reset_8390(struct 
     unsigned long reset_start_time = jiffies;
 
     if (ei_debug > 1)
-	printk("resetting the 8390 t=%ld...", jiffies);
+	printk(KERN_DEBUG "resetting the 8390 t=%ld...\n", jiffies);
 
     z_writeb(z_readb(NE_BASE + NE_RESET), NE_BASE + NE_RESET);
 
@@ -269,7 +272,8 @@ static void zorro8390_reset_8390(struct 
     /* This check _should_not_ be necessary, omit eventually. */
     while ((z_readb(NE_BASE+NE_EN0_ISR) & ENISR_RESET) == 0)
 	if (jiffies - reset_start_time > 2*HZ/100) {
-	    printk("%s: ne_reset_8390() did not complete.\n", dev->name);
+	    printk(KERN_WARNING "%s: ne_reset_8390() did not complete.\n",
+		   dev->name);
 	    break;
 	}
     z_writeb(ENISR_RESET, NE_BASE + NE_EN0_ISR);	/* Ack intr. */
@@ -288,7 +292,7 @@ static void zorro8390_get_8390_hdr(struc
 
     /* This *shouldn't* happen. If it does, it's the last thing you'll see */
     if (ei_status.dmaing) {
-	printk("%s: DMAing conflict in ne_get_8390_hdr "
+	printk(KERN_ERR "%s: DMAing conflict in ne_get_8390_hdr "
 	   "[DMAstat:%d][irqlock:%d].\n", dev->name, ei_status.dmaing,
 	   ei_status.irqlock);
 	return;
@@ -329,7 +333,7 @@ static void zorro8390_block_input(struct
 
     /* This *shouldn't* happen. If it does, it's the last thing you'll see */
     if (ei_status.dmaing) {
-	printk("%s: DMAing conflict in ne_block_input "
+	printk(KERN_ERR "%s: DMAing conflict in ne_block_input "
 	   "[DMAstat:%d][irqlock:%d].\n",
 	   dev->name, ei_status.dmaing, ei_status.irqlock);
 	return;
@@ -369,7 +373,7 @@ static void zorro8390_block_output(struc
 
     /* This *shouldn't* happen. If it does, it's the last thing you'll see */
     if (ei_status.dmaing) {
-	printk("%s: DMAing conflict in ne_block_output."
+	printk(KERN_ERR "%s: DMAing conflict in ne_block_output."
 	   "[DMAstat:%d][irqlock:%d]\n", dev->name, ei_status.dmaing,
 	   ei_status.irqlock);
 	return;
@@ -395,7 +399,8 @@ static void zorro8390_block_output(struc
 
     while ((z_readb(NE_BASE + NE_EN0_ISR) & ENISR_RDC) == 0)
 	if (jiffies - dma_start > 2*HZ/100) {		/* 20ms */
-		printk("%s: timeout waiting for Tx RDC.\n", dev->name);
+		printk(KERN_ERR "%s: timeout waiting for Tx RDC.\n",
+		       dev->name);
 		zorro8390_reset_8390(dev);
 		NS8390_init(dev,1);
 		break;
--- diff/drivers/oprofile/oprofile_stats.c	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/oprofile/oprofile_stats.c	2004-04-21 10:45:34.484461064 +0100
@@ -55,7 +55,7 @@ void oprofile_create_stats_files(struct 
 			continue;
 
 		cpu_buf = &cpu_buffer[i]; 
-		snprintf(buf, 6, "cpu%d", i);
+		snprintf(buf, 10, "cpu%d", i);
 		cpudir = oprofilefs_mkdir(sb, dir, buf);
  
 		/* Strictly speaking access to these ulongs is racy,
--- diff/drivers/parport/Kconfig	2004-03-11 10:20:26.000000000 +0000
+++ source/drivers/parport/Kconfig	2004-04-21 10:45:34.484461064 +0100
@@ -54,7 +54,7 @@ config PARPORT_PC_CML1
 
 config PARPORT_SERIAL
 	tristate "Multi-IO cards (parallel and serial)"
-	depends on SERIAL_8250!=n && PARPORT_PC_CML1
+	depends on SERIAL_8250!=n && PARPORT_PC_CML1 && PCI
 	help
 	  This adds support for multi-IO PCI cards that have parallel and
 	  serial ports.  You should say Y or M here.  If you say M, the module
--- diff/drivers/parport/procfs.c	2004-03-11 10:20:26.000000000 +0000
+++ source/drivers/parport/procfs.c	2004-04-21 10:45:34.485460912 +0100
@@ -526,7 +526,6 @@ static int __init parport_default_proc_r
 
 static void __exit parport_default_proc_unregister (void)
 {
-	return 0;
 }
 #endif
 
--- diff/drivers/pci/Kconfig	2003-01-16 11:30:36.000000000 +0000
+++ source/drivers/pci/Kconfig	2004-04-21 10:45:34.485460912 +0100
@@ -1,6 +1,25 @@
 #
 # PCI configuration
 #
+config PCI_USE_VECTOR
+	bool "Vector-based interrupt indexing (MSI)"
+	depends on (X86_LOCAL_APIC && X86_IO_APIC && !X86_64) || IA64
+	default n
+	help
+	   This replaces the current existing IRQ-based index interrupt scheme
+	   with the vector-base index scheme. The advantages of vector base
+	   over IRQ base are listed below:
+	   1) Support MSI implementation.
+	   2) Support future IOxAPIC hotplug
+
+	   Note that this allows the device drivers to enable MSI, Message
+	   Signaled Interrupt, on all MSI capable device functions detected.
+	   Message Signal Interrupt enables an MSI-capable hardware device to
+	   send an inbound Memory Write on its PCI bus instead of asserting
+	   IRQ signal on device IRQ pin.
+
+	   If you don't know what to do here, say N.
+
 config PCI_LEGACY_PROC
 	bool "Legacy /proc/pci interface"
 	depends on PCI
--- diff/drivers/pci/bus.c	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/pci/bus.c	2004-04-21 10:45:34.485460912 +0100
@@ -135,5 +135,6 @@ void pci_enable_bridges(struct pci_bus *
 	}
 }
 
+EXPORT_SYMBOL(pci_bus_alloc_resource);
 EXPORT_SYMBOL(pci_bus_add_devices);
 EXPORT_SYMBOL(pci_enable_bridges);
--- diff/drivers/pci/hotplug/acpiphp_glue.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/pci/hotplug/acpiphp_glue.c	2004-04-21 10:45:34.486460760 +0100
@@ -1243,40 +1243,38 @@ int acpiphp_disable_slot(struct acpiphp_
 
 /**
  * acpiphp_check_bridge - re-enumerate devices
+ *
+ * Iterate over all slots under this bridge and make sure that if a
+ * card is present they are enabled, and if not they are disabled.
  */
 int acpiphp_check_bridge(struct acpiphp_bridge *bridge)
 {
 	struct acpiphp_slot *slot;
-	unsigned int sta;
 	int retval = 0;
 	int enabled, disabled;
 
 	enabled = disabled = 0;
 
 	for (slot = bridge->slots; slot; slot = slot->next) {
-		sta = get_slot_status(slot);
+		unsigned int status = get_slot_status(slot);
 		if (slot->flags & SLOT_ENABLED) {
-			/* if enabled but not present, disable */
-			if (sta != ACPI_STA_ALL) {
-				retval = acpiphp_disable_slot(slot);
-				if (retval) {
-					err("Error occurred in enabling\n");
-					up(&slot->crit_sect);
-					goto err_exit;
-				}
-				disabled++;
+			if (status == ACPI_STA_ALL)
+				continue;
+			retval = acpiphp_disable_slot(slot);
+			if (retval) {
+				err("Error occurred in disabling\n");
+				goto err_exit;
 			}
+			disabled++;
 		} else {
-			/* if disabled but present, enable */
-			if (sta == ACPI_STA_ALL) {
-				retval = acpiphp_enable_slot(slot);
-				if (retval) {
-					err("Error occurred in enabling\n");
-					up(&slot->crit_sect);
-					goto err_exit;
-				}
-				enabled++;
+			if (status != ACPI_STA_ALL)
+				continue;
+			retval = acpiphp_enable_slot(slot);
+			if (retval) {
+				err("Error occurred in enabling\n");
+				goto err_exit;
 			}
+			enabled++;
 		}
 	}
 
--- diff/drivers/pci/hotplug/acpiphp_pci.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/pci/hotplug/acpiphp_pci.c	2004-04-21 10:45:34.487460608 +0100
@@ -198,106 +198,42 @@ static int init_config_space (struct acp
 /* detect_used_resource - subtract resource under dev from bridge */
 static int detect_used_resource (struct acpiphp_bridge *bridge, struct pci_dev *dev)
 {
-	u32 bar, len;
-	u64 base;
-	u32 address[] = {
-		PCI_BASE_ADDRESS_0,
-		PCI_BASE_ADDRESS_1,
-		PCI_BASE_ADDRESS_2,
-		PCI_BASE_ADDRESS_3,
-		PCI_BASE_ADDRESS_4,
-		PCI_BASE_ADDRESS_5,
-		0
-	};
 	int count;
-	struct pci_resource *res;
 
 	dbg("Device %s\n", pci_name(dev));
 
-	for (count = 0; address[count]; count++) {	/* for 6 BARs */
-		pci_read_config_dword(dev, address[count], &bar);
+	for (count = 0; count < DEVICE_COUNT_RESOURCE; count++) {
+		struct pci_resource *res;
+		struct pci_resource **head;
+		unsigned long base = dev->resource[count].start;
+		unsigned long len = dev->resource[count].end - base + 1;
+		unsigned long flags = dev->resource[count].flags;
 
-		if (!bar)	/* This BAR is not implemented */
+		if (!flags)
 			continue;
 
-		pci_write_config_dword(dev, address[count], 0xFFFFFFFF);
-		pci_read_config_dword(dev, address[count], &len);
-
-		if (len & PCI_BASE_ADDRESS_SPACE_IO) {
-			/* This is IO */
-			base = bar & 0xFFFFFFFC;
-			len = len & (PCI_BASE_ADDRESS_IO_MASK & 0xFFFF);
-			len = len & ~(len - 1);
-
-			dbg("BAR[%d] %08x - %08x (IO)\n", count, (u32)base, (u32)base + len - 1);
+		dbg("BAR[%d] 0x%lx - 0x%lx (0x%lx)\n", count, base,
+				base + len - 1, flags);
 
-			spin_lock(&bridge->res_lock);
-			res = acpiphp_get_resource_with_base(&bridge->io_head, base, len);
-			spin_unlock(&bridge->res_lock);
-			if (res)
-				kfree(res);
+		if (flags & IORESOURCE_IO) {
+			head = &bridge->io_head;
+		} else if (flags & IORESOURCE_PREFETCH) {
+			head = &bridge->p_mem_head;
 		} else {
-			/* This is Memory */
-			base = bar & 0xFFFFFFF0;
-			if (len & PCI_BASE_ADDRESS_MEM_PREFETCH) {
-				/* pfmem */
-
-				len &= 0xFFFFFFF0;
-				len = ~len + 1;
-
-				if (len & PCI_BASE_ADDRESS_MEM_TYPE_64) {	/* takes up another dword */
-					dbg("prefetch mem 64\n");
-					count += 1;
-				}
-				dbg("BAR[%d] %08x - %08x (PMEM)\n", count, (u32)base, (u32)base + len - 1);
-				spin_lock(&bridge->res_lock);
-				res = acpiphp_get_resource_with_base(&bridge->p_mem_head, base, len);
-				spin_unlock(&bridge->res_lock);
-				if (res)
-					kfree(res);
-			} else {
-				/* regular memory */
-
-				len &= 0xFFFFFFF0;
-				len = ~len + 1;
-
-				if (len & PCI_BASE_ADDRESS_MEM_TYPE_64) {
-					/* takes up another dword */
-					dbg("mem 64\n");
-					count += 1;
-				}
-				dbg("BAR[%d] %08x - %08x (MEM)\n", count, (u32)base, (u32)base + len - 1);
-				spin_lock(&bridge->res_lock);
-				res = acpiphp_get_resource_with_base(&bridge->mem_head, base, len);
-				spin_unlock(&bridge->res_lock);
-				if (res)
-					kfree(res);
-			}
+			head = &bridge->mem_head;
 		}
 
-		pci_write_config_dword(dev, address[count], bar);
+		spin_lock(&bridge->res_lock);
+		res = acpiphp_get_resource_with_base(head, base, len);
+		spin_unlock(&bridge->res_lock);
+		if (res)
+			kfree(res);
 	}
 
 	return 0;
 }
 
 
-/* detect_pci_resource_bus - subtract resource under pci_bus */
-static void detect_used_resource_bus(struct acpiphp_bridge *bridge, struct pci_bus *bus)
-{
-	struct list_head *l;
-	struct pci_dev *dev;
-
-	list_for_each (l, &bus->devices) {
-		dev = pci_dev_b(l);
-		detect_used_resource(bridge, dev);
-		/* XXX recursive call */
-		if (dev->subordinate)
-			detect_used_resource_bus(bridge, dev->subordinate);
-	}
-}
-
-
 /**
  * acpiphp_detect_pci_resource - detect resources under bridge
  * @bridge: detect all resources already used under this bridge
@@ -306,7 +242,13 @@ static void detect_used_resource_bus(str
  */
 int acpiphp_detect_pci_resource (struct acpiphp_bridge *bridge)
 {
-	detect_used_resource_bus(bridge, bridge->pci_bus);
+	struct list_head *l;
+	struct pci_dev *dev;
+
+	list_for_each (l, &bridge->pci_bus->devices) {
+		dev = pci_dev_b(l);
+		detect_used_resource(bridge, dev);
+	}
 
 	return 0;
 }
--- diff/drivers/pci/hotplug/pci_hotplug.h	2004-03-11 10:20:26.000000000 +0000
+++ source/drivers/pci/hotplug/pci_hotplug.h	2004-04-21 10:45:34.487460608 +0100
@@ -43,7 +43,7 @@ enum pci_bus_speed {
 	PCI_SPEED_100MHz_PCIX_266	= 0x0a,
 	PCI_SPEED_133MHz_PCIX_266	= 0x0b,
 	PCI_SPEED_66MHz_PCIX_533	= 0x11,
-	PCI_SPEED_100MHz_PCIX_533	= 0X12,
+	PCI_SPEED_100MHz_PCIX_533	= 0x12,
 	PCI_SPEED_133MHz_PCIX_533	= 0x13,
 	PCI_SPEED_UNKNOWN		= 0xff,
 };
--- diff/drivers/pci/hotplug/pciehp_ctrl.c	2004-03-11 10:20:26.000000000 +0000
+++ source/drivers/pci/hotplug/pciehp_ctrl.c	2004-04-21 10:45:34.488460456 +0100
@@ -135,7 +135,7 @@ u8 pciehp_handle_switch_change(u8 hp_slo
 	p_slot->hpc_ops->get_adapter_status(p_slot, &(func->presence_save));
 	p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
 
-	if (!getstatus) {
+	if (getstatus) {
 		/*
 		 * Switch opened
 		 */
@@ -1705,7 +1705,7 @@ int pciehp_enable_slot (struct slot *p_s
 	}
 	
 	rc = p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
-	if (rc || !getstatus) {
+	if (rc || getstatus) {
 		info("%s: latch open on slot(%x)\n", __FUNCTION__, p_slot->number);
 		up(&p_slot->ctrl->crit_sect);
 		return (0);
@@ -1792,7 +1792,7 @@ int pciehp_disable_slot (struct slot *p_
 	}
 
 	ret = p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
-	if (ret || !getstatus) {
+	if (ret || getstatus) {
 		info("%s: latch open on slot(%x)\n", __FUNCTION__, p_slot->number);
 		up(&p_slot->ctrl->crit_sect);
 		return (0);
--- diff/drivers/pci/hotplug/pciehp_hpc.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/pci/hotplug/pciehp_hpc.c	2004-04-21 10:45:34.489460304 +0100
@@ -37,6 +37,7 @@
 #include <linux/spinlock.h>
 #include <linux/pci.h>
 #include <asm/system.h>
+#include "../pci.h"
 #include "pciehp.h"
 
 #ifdef DEBUG
@@ -315,12 +316,13 @@ static int pcie_write_cmd(struct slot *s
 		dbg("%s : CMD_COMPLETED not clear after 1 sec.\n", __FUNCTION__);
 	}
 
-	retval = hp_register_write_word(php_ctlr->pci_dev, SLOT_CTRL, cmd);
+	dbg("%s: Before hp_register_write_word SLOT_CTRL %x\n", __FUNCTION__, cmd);
+	retval = hp_register_write_word(php_ctlr->pci_dev, SLOT_CTRL, cmd | CMD_CMPL_INTR_ENABLE);
 	if (retval) {
 		err("%s : hp_register_write_word SLOT_CTRL failed\n", __FUNCTION__);
 		return retval;
 	}
-	dbg("%s : hp_register_write_word SLOT_CTRL %x\n", __FUNCTION__, cmd);
+	dbg("%s : hp_register_write_word SLOT_CTRL %x\n", __FUNCTION__, cmd | CMD_CMPL_INTR_ENABLE);
 	dbg("%s : Exit\n", __FUNCTION__);
 
 	DBG_LEAVE_ROUTINE 
@@ -918,13 +920,32 @@ static irqreturn_t pcie_isr(int IRQ, voi
 			return IRQ_NONE;
 		}
 
-		temp_word = (temp_word & ~HP_INTR_ENABLE) | 0x00;
+		dbg("%s: Set Mask Hot-plug Interrupt Enable\n", __FUNCTION__);
+		dbg("%s: hp_register_read_word SLOT_CTRL with value %x\n", __FUNCTION__, temp_word);
+		temp_word = (temp_word & ~HP_INTR_ENABLE & ~CMD_CMPL_INTR_ENABLE) | 0x00;
 
 		rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_CTRL, temp_word);
 		if (rc) {
 			err("%s : hp_register_write_word SLOT_CTRL failed\n", __FUNCTION__);
 			return IRQ_NONE;
 		}
+		dbg("%s: hp_register_write_word SLOT_CTRL with value %x\n", __FUNCTION__, temp_word);
+		
+		rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS, slot_status);
+		if (rc) {
+			err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__);
+			return IRQ_NONE;
+		}
+		dbg("%s: hp_register_read_word SLOT_STATUS with value %x\n", __FUNCTION__, slot_status); 
+		
+		/* Clear command complete interrupt caused by this write */
+		temp_word = 0x1f;
+		rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_STATUS, temp_word);
+		if (rc) {
+			err("%s : hp_register_write_word SLOT_STATUS failed\n", __FUNCTION__);
+			return IRQ_NONE;
+		}
+		dbg("%s: hp_register_write_word SLOT_STATUS with value %x\n", __FUNCTION__, temp_word);
 	}
 	
 	if (intr_loc & CMD_COMPLETED) {
@@ -949,7 +970,7 @@ static irqreturn_t pcie_isr(int IRQ, voi
 			hp_slot, php_ctlr->callback_instance_id);
 
 	/* Clear all events after serving them */
-	temp_word = slot_status | 0xff;
+	temp_word = 0x1F;
 	rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_STATUS, temp_word);
 	if (rc) {
 		err("%s : hp_register_write_word SLOT_STATUS failed\n", __FUNCTION__);
@@ -963,6 +984,8 @@ static irqreturn_t pcie_isr(int IRQ, voi
 			return IRQ_NONE;
 		}
 
+		dbg("%s: Unmask Hot-plug Interrupt Enable\n", __FUNCTION__);
+		dbg("%s: hp_register_read_word SLOT_CTRL with value %x\n", __FUNCTION__, temp_word);
 		temp_word = (temp_word & ~HP_INTR_ENABLE) | HP_INTR_ENABLE;
 
 		rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_CTRL, temp_word);
@@ -970,6 +993,23 @@ static irqreturn_t pcie_isr(int IRQ, voi
 			err("%s : hp_register_write_word SLOT_CTRL failed\n", __FUNCTION__);
 			return IRQ_NONE;
 		}
+		dbg("%s: hp_register_write_word SLOT_CTRL with value %x\n", __FUNCTION__, temp_word); 	
+	
+		rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS, slot_status);
+		if (rc) {
+			err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__);
+			return IRQ_NONE;
+		}
+		dbg("%s: hp_register_read_word SLOT_STATUS with value %x\n", __FUNCTION__, slot_status); 
+		
+		/* Clear command complete interrupt caused by this write */
+		temp_word = 0x1F;
+		rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_STATUS, temp_word);
+		if (rc) {
+			err("%s : hp_register_write_word SLOT_STATUS failed\n", __FUNCTION__);
+			return IRQ_NONE;
+		}
+		dbg("%s: hp_register_write_word SLOT_STATUS with value %x\n", __FUNCTION__, temp_word); 
 	}
 	
 	return IRQ_HANDLED;
@@ -1330,7 +1370,7 @@ int pcie_init(struct controller * ctrl,
 	}
 
 	dbg("%s: SLOT_CTRL %x value read %x\n", __FUNCTION__, SLOT_CTRL, temp_word);
-	temp_word = (temp_word & ~HP_INTR_ENABLE) | 0x00;
+	temp_word = (temp_word & ~HP_INTR_ENABLE & ~CMD_CMPL_INTR_ENABLE) | 0x00;
 
 	rc = hp_register_write_word(pdev, SLOT_CTRL, temp_word);
 	if (rc) {
@@ -1346,12 +1386,13 @@ int pcie_init(struct controller * ctrl,
 	}
 	dbg("%s: Mask HPIE SLOT_STATUS offset %x reads slot_status %x\n", __FUNCTION__, SLOT_STATUS, slot_status);
 
-	rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_STATUS, slot_status);
+	temp_word = 0x1F; /* Clear all events */
+	rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_STATUS, temp_word);
 	if (rc) {
 		err("%s : hp_register_write_word SLOT_STATUS failed\n", __FUNCTION__);
 		goto abort_free_ctlr;
 	}
-	dbg("%s: SLOT_STATUS offset %x writes slot_status %x\n", __FUNCTION__, SLOT_STATUS, slot_status);
+	dbg("%s: SLOT_STATUS offset %x writes slot_status %x\n", __FUNCTION__, SLOT_STATUS, temp_word);
 
 	if (pciehp_poll_mode)  {/* Install interrupt polling code */
 		/* Install and start the interrupt polling timer */
@@ -1359,15 +1400,16 @@ int pcie_init(struct controller * ctrl,
 		start_int_poll_timer( php_ctlr, 10 );   /* start with 10 second delay */
 	} else {
 		/* Installs the interrupt handler */
-#ifdef CONFIG_PCI_USE_VECTOR 
-		rc = pci_enable_msi(pdev);
-		if (rc) {
-			err("Can't get msi for the hotplug controller\n");
-			dbg("%s: rc = %x\n", __FUNCTION__, rc);
-			goto abort_free_ctlr;
+		dbg("%s: pciehp_msi_quirk = %x\n", __FUNCTION__, pciehp_msi_quirk);
+		if (!pciehp_msi_quirk) {
+			rc = pci_enable_msi(pdev);
+			if (rc) {
+				info("Can't get msi for the hotplug controller\n");
+				info("Use INTx for the hotplug controller\n");
+				dbg("%s: rc = %x\n", __FUNCTION__, rc);
+			} else 
+				php_ctlr->irq = pdev->irq;
 		}
-		php_ctlr->irq = pdev->irq;
-#endif		
 		rc = request_irq(php_ctlr->irq, pcie_isr, SA_SHIRQ, MY_NAME, (void *) ctrl);
 		dbg("%s: request_irq %d for hpc%d (returns %d)\n", __FUNCTION__, php_ctlr->irq, ctlr_seq_num, rc);
 		if (rc) {
@@ -1384,7 +1426,7 @@ int pcie_init(struct controller * ctrl,
 	dbg("%s: SLOT_CTRL %x value read %x\n", __FUNCTION__, SLOT_CTRL, temp_word);
 
 	intr_enable = ATTN_BUTTN_ENABLE | PWR_FAULT_DETECT_ENABLE | MRL_DETECT_ENABLE |
-					PRSN_DETECT_ENABLE | CMD_CMPL_INTR_ENABLE;
+					PRSN_DETECT_ENABLE;
 
 	temp_word = (temp_word & ~intr_enable) | intr_enable; 
 
@@ -1402,6 +1444,21 @@ int pcie_init(struct controller * ctrl,
 		goto abort_free_ctlr;
 	}
 	dbg("%s : Unmask HPIE hp_register_write_word SLOT_CTRL with %x\n", __FUNCTION__, temp_word);
+	rc = hp_register_read_word(php_ctlr->pci_dev, SLOT_STATUS, slot_status);
+	if (rc) {
+		err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__);
+		goto abort_free_ctlr;
+	}
+	dbg("%s: Unmask HPIE SLOT_STATUS offset %x reads slot_status %x\n", __FUNCTION__, 
+		SLOT_STATUS, slot_status);
+	
+	temp_word =  0x1F; /* Clear all events */
+	rc = hp_register_write_word(php_ctlr->pci_dev, SLOT_STATUS, temp_word);
+	if (rc) {
+		err("%s : hp_register_write_word SLOT_STATUS failed\n", __FUNCTION__);
+		goto abort_free_ctlr;
+	}
+	dbg("%s: SLOT_STATUS offset %x writes slot_status %x\n", __FUNCTION__, SLOT_STATUS, temp_word);
 	
 	/*  Add this HPC instance into the HPC list */
 	spin_lock(&list_lock);
--- diff/drivers/pci/hotplug/pciehp_pci.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/pci/hotplug/pciehp_pci.c	2004-04-21 10:45:34.490460152 +0100
@@ -192,7 +192,6 @@ int pciehp_save_config(struct controller
 	for (device = FirstSupported; device <= LastSupported; device++) {
 		ID = 0xFFFFFFFF;
 		rc = pci_bus_read_config_dword(pci_bus, PCI_DEVFN(device, 0), PCI_VENDOR_ID, &ID);
-		dbg("%s: ID = %x\n", __FUNCTION__, ID);
 
 		if (ID != 0xFFFFFFFF) {	  /*  device in slot */
 			dbg("%s: ID = %x\n", __FUNCTION__, ID);
@@ -325,7 +324,6 @@ int pciehp_save_config(struct controller
 			new_slot->presence_save = 0;
 			new_slot->switch_save = 0;
 		}
-		dbg("%s: End of For loop\n", __FUNCTION__);
 	} 			/* End of FOR loop */
 
 	dbg("%s: Exit\n", __FUNCTION__);
--- diff/drivers/pci/hotplug/pcihp_skeleton.c	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/pci/hotplug/pcihp_skeleton.c	2004-04-21 10:45:34.490460152 +0100
@@ -224,7 +224,7 @@ static int get_power_status (struct hotp
 	if (slot == NULL)
 		return -ENODEV;
 	
-	dbg(__FUNCTION__" - physical_slot = %s\n", hotplug_slot->name);
+	dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
 
 	/*
 	 * Fill in logic to get the current power status of the specific
@@ -242,7 +242,7 @@ static int get_attention_status (struct 
 	if (slot == NULL)
 		return -ENODEV;
 	
-	dbg(__FUNCTION__" - physical_slot = %s\n", hotplug_slot->name);
+	dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
 
 	/*
 	 * Fill in logic to get the current attention status of the specific
@@ -260,7 +260,7 @@ static int get_latch_status (struct hotp
 	if (slot == NULL)
 		return -ENODEV;
 	
-	dbg(__FUNCTION__" - physical_slot = %s\n", hotplug_slot->name);
+	dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
 
 	/*
 	 * Fill in logic to get the current latch status of the specific
@@ -278,7 +278,7 @@ static int get_adapter_status (struct ho
 	if (slot == NULL)
 		return -ENODEV;
 	
-	dbg(__FUNCTION__" - physical_slot = %s\n", hotplug_slot->name);
+	dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
 
 	/*
 	 * Fill in logic to get the current adapter status of the specific
@@ -296,7 +296,7 @@ static void release_slots(struct hotplug
 	if (slot == NULL)
 		return -ENODEV;
 
-	dbg(__FUNCTION__" - physical_slot = %s\n", hotplug_slot->name);
+	dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
 	kfree(slot->hotplug_slot->info);
 	kfree(slot->hotplug_slot->name);
 	kfree(slot->hotplug_slot);
--- diff/drivers/pci/hotplug/rpadlpar_core.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/pci/hotplug/rpadlpar_core.c	2004-04-21 10:45:34.491460000 +0100
@@ -79,25 +79,18 @@ static struct device_node *find_php_slot
 	return np;
 }
 
-static inline struct hotplug_slot *find_php_slot(char *drc_name)
-{
-	struct kobject *k;
-
-	k = kset_find_obj(&pci_hotplug_slots_subsys.kset, drc_name);
-	if (!k)
-		return NULL;
-
-	return to_hotplug_slot(k);
-}
-
 static struct slot *find_slot(char *drc_name)
 {
-	struct hotplug_slot *php_slot = find_php_slot(drc_name);
+	struct list_head *tmp, *n;
+	struct slot *slot;
 
-	if (!php_slot)
-		return NULL;
+        list_for_each_safe(tmp, n, &rpaphp_slot_head) {
+                slot = list_entry(tmp, struct slot, rpaphp_slot_list);
+                if (strcmp(slot->location, drc_name) == 0)
+                        return slot;
+        }
 
-	return (struct slot *) php_slot->private;
+        return NULL;
 }
 
 static void rpadlpar_claim_one_bus(struct pci_bus *b)
--- diff/drivers/pci/hotplug/rpaphp.h	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/pci/hotplug/rpaphp.h	2004-04-21 10:45:34.491460000 +0100
@@ -85,6 +85,7 @@ struct slot {
 	u32 type;
 	u32 power_domain;
 	char *name;
+	char *location;
 	struct device_node *dn;	/* slot's device_node in OFDT */
 	/* dn has phb info */
 	struct pci_dev *bridge;	/* slot's pci_dev in pci_devices */
@@ -129,5 +130,6 @@ extern struct slot *alloc_slot_struct(st
 extern int register_slot(struct slot *slot);
 extern int rpaphp_get_power_status(struct slot *slot, u8 * value);
 extern int rpaphp_set_attention_status(struct slot *slot, u8 status);
+extern void rpaphp_sysfs_remove_attr_location(struct hotplug_slot *slot);
 	
 #endif				/* _PPC64PHP_H */
--- diff/drivers/pci/hotplug/rpaphp_core.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/pci/hotplug/rpaphp_core.c	2004-04-21 10:45:34.491460000 +0100
@@ -246,17 +246,14 @@ static int get_cur_bus_speed(struct hotp
 int rpaphp_remove_slot(struct slot *slot)
 {
 	int retval = 0;
-	char *rm_link;
+	struct hotplug_slot *php_slot = slot->hotplug_slot;
 
-	dbg("%s - Entry: slot[%s]\n", __FUNCTION__, slot->name);
-	if (slot->dev_type == PCI_DEV)
-		rm_link = pci_name(slot->bridge);
-	else
-		rm_link = strstr(slot->dn->full_name, "@");
-
-	sysfs_remove_link(slot->hotplug_slot->kobj.parent, rm_link);
 	list_del(&slot->rpaphp_slot_list);
-	retval = pci_hp_deregister(slot->hotplug_slot);
+	
+	/* remove "php_location" file */
+	rpaphp_sysfs_remove_attr_location(php_slot);
+
+	retval = pci_hp_deregister(php_slot);
 	if (retval)
 		err("Problem unregistering a slot %s\n", slot->name);
 
@@ -380,14 +377,7 @@ static void cleanup_slots(void)
 	 */
 
 	list_for_each_safe(tmp, n, &rpaphp_slot_head) {
-		char *rm_link;
-
 		slot = list_entry(tmp, struct slot, rpaphp_slot_list);
-		if (slot->dev_type == PCI_DEV)
-			rm_link = pci_name(slot->bridge);
-		else
-			rm_link = strstr(slot->dn->full_name, "@");
-		sysfs_remove_link(slot->hotplug_slot->kobj.parent, rm_link);
 		list_del(&slot->rpaphp_slot_list);
 		pci_hp_deregister(slot->hotplug_slot);
 	}
@@ -478,3 +468,4 @@ module_exit(rpaphp_exit);
 
 EXPORT_SYMBOL_GPL(rpaphp_add_slot);
 EXPORT_SYMBOL_GPL(rpaphp_remove_slot);
+EXPORT_SYMBOL_GPL(rpaphp_slot_head);
--- diff/drivers/pci/hotplug/rpaphp_pci.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/pci/hotplug/rpaphp_pci.c	2004-04-21 10:45:34.492459848 +0100
@@ -304,7 +304,6 @@ static int setup_pci_hotplug_slot_info(s
 	if (slot->hotplug_slot->info->adapter_status == NOT_VALID) {
 		dbg("%s: NOT_VALID: skip dn->full_name=%s\n",
 		    __FUNCTION__, slot->dn->full_name);
-		dealloc_slot_struct(slot);
 		return (-1);
 	}
 	return (0);
--- diff/drivers/pci/hotplug/rpaphp_slot.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/pci/hotplug/rpaphp_slot.c	2004-04-21 10:45:34.492459848 +0100
@@ -29,8 +29,36 @@
 #include <linux/pci.h>
 #include "rpaphp.h"
 
-/* free up the memory user by a slot */
+static ssize_t location_read_file (struct hotplug_slot *php_slot, char *buf)
+{
+        char *value;
+        int retval = -ENOENT;
+	struct slot *slot = (struct slot *)php_slot->private;
+
+	if (!slot)
+		return retval;
+
+        value = slot->location;
+        retval = sprintf (buf, "%s\n", value);
+        return retval;
+}
 
+static struct hotplug_slot_attribute hotplug_slot_attr_location = {
+	.attr = {.name = "phy_location", .mode = S_IFREG | S_IRUGO},
+	.show = location_read_file,
+};
+
+static void rpaphp_sysfs_add_attr_location (struct hotplug_slot *slot)
+{
+	sysfs_create_file(&slot->kobj, &hotplug_slot_attr_location.attr);
+}
+
+void rpaphp_sysfs_remove_attr_location (struct hotplug_slot *slot)
+{
+	sysfs_remove_file(&slot->kobj, &hotplug_slot_attr_location.attr);
+}
+
+/* free up the memory user by a slot */
 static void rpaphp_release_slot(struct hotplug_slot *hotplug_slot)
 {
 	struct slot *slot = hotplug_slot? (struct slot *) hotplug_slot->private:NULL;
@@ -76,17 +104,25 @@ struct slot *alloc_slot_struct(struct de
 		return (NULL);
 	}
 	memset(slot->hotplug_slot->info, 0, sizeof (struct hotplug_slot_info));
-	slot->hotplug_slot->name = kmalloc(strlen(drc_name) + 1, GFP_KERNEL);
+	slot->hotplug_slot->name = kmalloc(BUS_ID_SIZE + 1, GFP_KERNEL);
 	if (!slot->hotplug_slot->name) {
 		kfree(slot->hotplug_slot->info);
 		kfree(slot->hotplug_slot);
 		kfree(slot);
 		return (NULL);
 	}
+	slot->location = kmalloc(strlen(drc_name) + 1, GFP_KERNEL);
+	if (!slot->location) {
+		kfree(slot->hotplug_slot->info);
+		kfree(slot->hotplug_slot->name);
+		kfree(slot->hotplug_slot);
+		kfree(slot);
+		return (NULL);
+	}
 	slot->name = slot->hotplug_slot->name;
 	slot->dn = dn;
 	slot->index = drc_index;
-	strcpy(slot->name, drc_name);
+	strcpy(slot->location, drc_name);
 	slot->power_domain = power_domain;
 	slot->magic = SLOT_MAGIC;
 	slot->hotplug_slot->private = slot;
@@ -110,41 +146,9 @@ int register_slot(struct slot *slot)
 		rpaphp_release_slot(slot->hotplug_slot);
 		return (retval);
 	}
-	switch (slot->dev_type) {
-	case PCI_DEV:
-		/* create symlink between slot->name and it's bus_id */
-
-		dbg("%s: sysfs_create_link: %s --> %s\n", __FUNCTION__,
-		    pci_name(slot->bridge), slot->name);
-
-		retval = sysfs_create_link(slot->hotplug_slot->kobj.parent,
-					   &slot->hotplug_slot->kobj,
-					   pci_name(slot->bridge));
-		if (retval) {
-			err("sysfs_create_link failed with error %d\n", retval);
-			rpaphp_release_slot(slot->hotplug_slot);
-			return (retval);
-		}
-		break;
-	case VIO_DEV:
-		/* create symlink between slot->name and it's uni-address */
-		vio_uni_addr = strchr(slot->dn->full_name, '@');
-		if (!vio_uni_addr)
-			return (1);
-		dbg("%s: sysfs_create_link: %s --> %s\n", __FUNCTION__,
-		    vio_uni_addr, slot->name);
-		retval = sysfs_create_link(slot->hotplug_slot->kobj.parent,
-					   &slot->hotplug_slot->kobj,
-					   vio_uni_addr);
-		if (retval) {
-			err("sysfs_create_link failed with error %d\n", retval);
-			rpaphp_release_slot(slot->hotplug_slot);
-			return (retval);
-		}
-		break;
-	default:
-		return (1);
-	}
+	
+	/* create "phy_locatoin" file */
+	rpaphp_sysfs_add_attr_location(slot->hotplug_slot);	
 
 	/* add slot to our internal list */
 	dbg("%s adding slot[%s] to rpaphp_slot_list\n",
--- diff/drivers/pci/hotplug/shpchp_ctrl.c	2004-03-11 10:20:26.000000000 +0000
+++ source/drivers/pci/hotplug/shpchp_ctrl.c	2004-04-21 10:45:34.494459544 +0100
@@ -138,7 +138,7 @@ u8 shpchp_handle_switch_change(u8 hp_slo
 	p_slot->hpc_ops->get_adapter_status(p_slot, &(func->presence_save));
 	p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
 
-	if (!getstatus) {
+	if (getstatus) {
 		/*
 		 * Switch opened
 		 */
@@ -1219,7 +1219,7 @@ static u32 board_added(struct pci_func *
 					up(&ctrl->crit_sect);
 				}
 			} else {
-				if ((bus_speed > 0x4) || (max_bus_speed > 0x4))  {
+				if (bus_speed > 0x4) {
 					err("%s: speed of bus %x and adapter %x mismatch\n", __FUNCTION__, bus_speed, adapter_speed);
 					return WRONG_BUS_FREQUENCY;
 				}
@@ -1302,7 +1302,7 @@ static u32 board_added(struct pci_func *
 					up(&ctrl->crit_sect);
 				}
 			} else {
-				if ((bus_speed > 0x2) || (max_bus_speed > 0x2))  {
+				if (bus_speed > 0x2) {
 					err("%s: speed of bus %x and adapter %x mismatch\n", __FUNCTION__, bus_speed, adapter_speed);
 					return WRONG_BUS_FREQUENCY;
 				}
@@ -2107,7 +2107,7 @@ int shpchp_enable_slot (struct slot *p_s
 		return (0);
 	}
 	rc = p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
-	if (rc || !getstatus) {
+	if (rc || getstatus) {
 		info("%s: latch open on slot(%x)\n", __FUNCTION__, p_slot->number);
 		up(&p_slot->ctrl->crit_sect);
 		return (0);
@@ -2192,7 +2192,7 @@ int shpchp_disable_slot (struct slot *p_
 		return (0);
 	}
 	ret = p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
-	if (ret || !getstatus) {
+	if (ret || getstatus) {
 		info("%s: latch open on slot(%x)\n", __FUNCTION__, p_slot->number);
 		up(&p_slot->ctrl->crit_sect);
 		return (0);
--- diff/drivers/pci/hotplug/shpchp_hpc.c	2004-03-11 10:20:26.000000000 +0000
+++ source/drivers/pci/hotplug/shpchp_hpc.c	2004-04-21 10:45:34.494459544 +0100
@@ -104,12 +104,12 @@
 #define PCIX_66MHZ_ECC		0x5
 #define PCIX_100MHZ_ECC		0x6
 #define PCIX_133MHZ_ECC		0x7
-#define PCIX_66MHZ_266		0x8
-#define PCIX_100MHZ_266		0x9
-#define PCIX_133MHZ_266		0x0a
-#define PCIX_66MHZ_533		0x0b
-#define PCIX_100MHZ_533		0x0c
-#define PCIX_133MHZ_533		0x0d
+#define PCIX_66MHZ_266		0x9
+#define PCIX_100MHZ_266		0xa
+#define PCIX_133MHZ_266		0xb
+#define PCIX_66MHZ_533		0x11
+#define PCIX_100MHZ_533		0x12
+#define PCIX_133MHZ_533		0x13
 
 /* Slot Configuration */
 #define SLOT_NUM		0x0000001F
@@ -464,7 +464,8 @@ static int hpc_get_latch_status(struct s
 	slot_reg = readl(php_ctlr->creg + SLOT1 + 4*(slot->hp_slot));
 	slot_status = (u16)slot_reg;
 
-	*status = ((slot_status & 0x0100) == 0) ? 1 : 0;
+	*status = ((slot_status & 0x0100) == 0) ? 0 : 1;   /* 0 -> close; 1 -> open */
+
 
 	DBG_LEAVE_ROUTINE 
 	return 0;
@@ -1441,6 +1442,7 @@ int shpc_init(struct controller * ctrl,
 			err("%s : shpc_cap_offset == 0\n", __FUNCTION__);
 			goto abort_free_ctlr;
 		}
+		dbg("%s: shpc_cap_offset = %x\n", __FUNCTION__, shpc_cap_offset);	
 	
 		rc = pci_write_config_byte(pdev, (u8)shpc_cap_offset + DWORD_SELECT , BASE_OFFSET);
 		if (rc) {
@@ -1547,15 +1549,13 @@ int shpc_init(struct controller * ctrl,
 		start_int_poll_timer( php_ctlr, 10 );   /* start with 10 second delay */
 	} else {
 		/* Installs the interrupt handler */
-#ifdef CONFIG_PCI_USE_VECTOR 
 		rc = pci_enable_msi(pdev);
 		if (rc) {
-			err("Can't get msi for the hotplug controller\n");
+			info("Can't get msi for the hotplug controller\n");
+			info("Use INTx for the hotplug controller\n");
 			dbg("%s: rc = %x\n", __FUNCTION__, rc);
-			goto abort_free_ctlr;
-		}
-		php_ctlr->irq = pdev->irq;
-#endif
+		} else
+			php_ctlr->irq = pdev->irq;
 		
 		rc = request_irq(php_ctlr->irq, shpc_isr, SA_SHIRQ, MY_NAME, (void *) ctrl);
 		dbg("%s: request_irq %d for hpc%d (returns %d)\n", __FUNCTION__, php_ctlr->irq, ctlr_seq_num, rc);
--- diff/drivers/pci/hotplug/shpchprm_acpi.c	2004-03-11 10:20:26.000000000 +0000
+++ source/drivers/pci/hotplug/shpchprm_acpi.c	2004-04-21 10:45:34.495459392 +0100
@@ -1267,7 +1267,8 @@ static int print_acpi_resources (struct 
 int shpchprm_print_pirt(void)
 {
 	dbg("SHPCHPRM ACPI Slots\n");
-	print_acpi_resources (acpi_bridges_head);
+	if (acpi_bridges_head)
+		print_acpi_resources (acpi_bridges_head);
 	return 0;
 }
 
--- diff/drivers/pci/hotplug/shpchprm_legacy.c	2004-03-11 10:20:26.000000000 +0000
+++ source/drivers/pci/hotplug/shpchprm_legacy.c	2004-04-21 10:45:34.496459240 +0100
@@ -96,23 +96,6 @@ static void *detect_HRT_floating_pointer
 	return fp;
 }
 
-#if link_available
-/*
- *  Links available memory, IO, and IRQ resources for programming
- *  devices which may be added to the system
- *
- *  Returns 0 if success
- */
-static int
-link_available_resources (
-	struct controller *ctrl,
-	struct pci_func *func,
-	int index )
-{
-	return shpchp_save_used_resources (ctrl, func, !DISABLE_CARD);
-}
-#endif
-
 /*
  * shpchprm_find_available_resources
  *
@@ -345,19 +328,6 @@ int shpchprm_find_available_resources(st
 			}
 		}
 
-#if link_available
-		++index;
-
-		while (index < 8) {
-			if (((func = shpchp_slot_find(primary_bus, dev_func >> 3, index)) != NULL) && populated_slot)
-				rc = link_available_resources(ctrl, func, index);
-			
-			if (rc)
-				break;
-
-			++index;
-		}
-#endif
 		i--;
 		one_slot += sizeof(struct slot_rt);
 	}
--- diff/drivers/pci/msi.c	2004-03-11 10:20:26.000000000 +0000
+++ source/drivers/pci/msi.c	2004-04-21 10:45:34.497459088 +0100
@@ -19,26 +19,22 @@
 #include <asm/errno.h>
 #include <asm/io.h>
 #include <asm/smp.h>
-#include <asm/desc.h>
-#include <asm/io_apic.h>
-#include <mach_apic.h>
 
 #include "msi.h"
 
-
 static spinlock_t msi_lock = SPIN_LOCK_UNLOCKED;
 static struct msi_desc* msi_desc[NR_IRQS] = { [0 ... NR_IRQS-1] = NULL };
 static kmem_cache_t* msi_cachep;
 
 static int pci_msi_enable = 1;
-static int nr_alloc_vectors = 0;
+static int last_alloc_vector = 0;
 static int nr_released_vectors = 0;
 static int nr_reserved_vectors = NR_HP_RESERVED_VECTORS;
 static int nr_msix_devices = 0;
 
 #ifndef CONFIG_X86_IO_APIC
-int vector_irq[NR_IRQS] = { [0 ... NR_IRQS -1] = -1};
-u8 irq_vector[NR_IRQS] = { FIRST_DEVICE_VECTOR , 0 };
+int vector_irq[NR_VECTORS] = { [0 ... NR_VECTORS - 1] = -1};
+u8 irq_vector[NR_IRQ_VECTORS] = { FIRST_DEVICE_VECTOR , 0 };
 #endif
 
 static void msi_cache_ctor(void *p, kmem_cache_t *cache, unsigned long flags)
@@ -96,7 +92,6 @@ static void set_msi_affinity(unsigned in
 {
 	struct msi_desc *entry;
 	struct msg_address address;
-	unsigned int dest_id;
 
 	entry = (struct msi_desc *)msi_desc[vector];
 	if (!entry || !entry->dev)
@@ -113,10 +108,9 @@ static void set_msi_affinity(unsigned in
 	        entry->dev->bus->ops->read(entry->dev->bus, entry->dev->devfn,
 			msi_lower_address_reg(pos), 4,
 			&address.lo_address.value);
-		dest_id = (address.lo_address.u.dest_id &
-			MSI_ADDRESS_HEADER_MASK) |
-			(cpu_mask_to_apicid(cpu_mask) << MSI_TARGET_CPU_SHIFT);
-		address.lo_address.u.dest_id = dest_id;
+		address.lo_address.value &= MSI_ADDRESS_DEST_ID_MASK;
+		address.lo_address.value |= (cpu_mask_to_apicid(cpu_mask) <<
+			MSI_TARGET_CPU_SHIFT);
 		entry->msi_attrib.current_cpu = cpu_mask_to_apicid(cpu_mask);
 		entry->dev->bus->ops->write(entry->dev->bus, entry->dev->devfn,
 			msi_lower_address_reg(pos), 4,
@@ -129,10 +123,9 @@ static void set_msi_affinity(unsigned in
 			PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET;
 
 		address.lo_address.value = readl(entry->mask_base + offset);
-		dest_id = (address.lo_address.u.dest_id &
-			MSI_ADDRESS_HEADER_MASK) |
-			(cpu_mask_to_apicid(cpu_mask) << MSI_TARGET_CPU_SHIFT);
-		address.lo_address.u.dest_id = dest_id;
+		address.lo_address.value &= MSI_ADDRESS_DEST_ID_MASK;
+		address.lo_address.value |= (cpu_mask_to_apicid(cpu_mask) <<
+			MSI_TARGET_CPU_SHIFT);
 		entry->msi_attrib.current_cpu = cpu_mask_to_apicid(cpu_mask);
 		writel(address.lo_address.value, entry->mask_base + offset);
 		break;
@@ -265,61 +258,11 @@ static void msi_address_init(struct msg_
 
 	memset(msi_address, 0, sizeof(struct msg_address));
 	msi_address->hi_address = (u32)0;
-	dest_id = (MSI_ADDRESS_HEADER << MSI_ADDRESS_HEADER_SHIFT) |
-		 (MSI_TARGET_CPU << MSI_TARGET_CPU_SHIFT);
-	msi_address->lo_address.u.dest_mode = MSI_LOGICAL_MODE;
+	dest_id = (MSI_ADDRESS_HEADER << MSI_ADDRESS_HEADER_SHIFT);
+	msi_address->lo_address.u.dest_mode = MSI_DEST_MODE;
 	msi_address->lo_address.u.redirection_hint = MSI_REDIRECTION_HINT_MODE;
 	msi_address->lo_address.u.dest_id = dest_id;
-}
-
-static int pci_vector_resources(void)
-{
-	static int res = -EINVAL;
-	int nr_free_vectors;
-
-	if (res == -EINVAL) {
-		int i, repeat;
-		for (i = NR_REPEATS; i > 0; i--) {
-			if ((FIRST_DEVICE_VECTOR + i * 8) > FIRST_SYSTEM_VECTOR)
-				continue;
-			break;
-		}
-		i++;
-		repeat = (FIRST_SYSTEM_VECTOR - FIRST_DEVICE_VECTOR)/i;
-		res = i * repeat - NR_RESERVED_VECTORS + 1;
-	}
-
-	nr_free_vectors = res + nr_released_vectors - nr_alloc_vectors;
-
-	return nr_free_vectors;
-}
-
-int assign_irq_vector(int irq)
-{
-	static int current_vector = FIRST_DEVICE_VECTOR, offset = 0;
-
-	if (irq != MSI_AUTO && IO_APIC_VECTOR(irq) > 0)
-		return IO_APIC_VECTOR(irq);
-next:
-	current_vector += 8;
-	if (current_vector == SYSCALL_VECTOR)
-		goto next;
-
-	if (current_vector > FIRST_SYSTEM_VECTOR) {
-		offset++;
-		current_vector = FIRST_DEVICE_VECTOR + offset;
-	}
-
-	if (current_vector == FIRST_SYSTEM_VECTOR)
-		return -ENOSPC;
-
-	vector_irq[current_vector] = irq;
-	if (irq != MSI_AUTO)
-		IO_APIC_VECTOR(irq) = current_vector;
-
-	nr_alloc_vectors++;
-
-	return current_vector;
+	msi_address->lo_address.value |= (MSI_TARGET_CPU << MSI_TARGET_CPU_SHIFT);
 }
 
 static int assign_msi_vector(void)
@@ -333,10 +276,6 @@ static int assign_msi_vector(void)
 	 * vector is assigned unique among drivers.
 	 */
 	spin_lock_irqsave(&msi_lock, flags);
-	if (!(pci_vector_resources() > 0)) {
-		spin_unlock_irqrestore(&msi_lock, flags);
-		return -EBUSY;
-	}
 
 	if (!new_vector_avail) {
 		/*
@@ -363,9 +302,9 @@ static int assign_msi_vector(void)
 		spin_unlock_irqrestore(&msi_lock, flags);
 		return -EBUSY;
 	}
-
-	vector = assign_irq_vector(MSI_AUTO);
-	if (vector  == (FIRST_SYSTEM_VECTOR - 8))
+	vector = assign_irq_vector(AUTO_ASSIGN);
+	last_alloc_vector = vector;
+	if (vector  == LAST_DEVICE_VECTOR)
 		new_vector_avail = 0;
 
 	spin_unlock_irqrestore(&msi_lock, flags);
@@ -924,7 +863,8 @@ int msi_alloc_vectors(struct pci_dev* de
 	 * msi_lock is provided to ensure that enough vectors resources are
 	 * available before granting.
 	 */
-	free_vectors = pci_vector_resources();
+	free_vectors = pci_vector_resources(last_alloc_vector,
+				nr_released_vectors);
 	/* Ensure that each MSI/MSI-X device has one vector reserved by
 	   default to avoid any MSI-X driver to take all available
  	   resources */
--- diff/drivers/pci/msi.h	2004-03-11 10:20:26.000000000 +0000
+++ source/drivers/pci/msi.h	2004-04-21 10:45:34.497459088 +0100
@@ -1,6 +1,4 @@
 /*
- * File:	msi.h
- *
  * Copyright (C) 2003-2004 Intel
  * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
  */
@@ -8,9 +6,7 @@
 #ifndef MSI_H
 #define MSI_H
 
-#define MSI_AUTO -1
-#define NR_REPEATS	23
-#define NR_RESERVED_VECTORS 3 /*FIRST_DEVICE_VECTOR,FIRST_SYSTEM_VECTOR,0x80 */
+#include <asm/msi.h>
 
 /*
  * Assume the maximum number of hot plug slots supported by the system is about
@@ -22,9 +18,10 @@
  */
 #define NR_HP_RESERVED_VECTORS 	20
 
-extern int vector_irq[NR_IRQS];
+extern int vector_irq[NR_VECTORS];
 extern cpumask_t pending_irq_balance_cpumask[NR_IRQS];
 extern void (*interrupt[NR_IRQS])(void);
+extern int pci_vector_resources(int last, int nr_released);
 
 #ifdef CONFIG_SMP
 #define set_msi_irq_affinity	set_msi_affinity
@@ -36,13 +33,6 @@ extern void (*interrupt[NR_IRQS])(void);
 static inline void move_msi(int vector) {}
 #endif
 
-#ifndef CONFIG_X86_IO_APIC
-static inline int get_ioapic_vector(struct pci_dev *dev) { return -1;}
-static inline void restore_ioapic_irq_handler(int irq) {}
-#else
-extern void restore_ioapic_irq_handler(int irq);
-#endif
-
 /*
  * MSI-X Address Register
  */
@@ -85,25 +75,20 @@ extern void restore_ioapic_irq_handler(i
 #define msix_mask(address)		(address | PCI_MSIX_FLAGS_BITMASK)
 #define msix_is_pending(address) 	(address & PCI_MSIX_FLAGS_PENDMASK)
 
-
 /*
  * MSI Defined Data Structures
  */
 #define MSI_ADDRESS_HEADER		0xfee
 #define MSI_ADDRESS_HEADER_SHIFT	12
 #define MSI_ADDRESS_HEADER_MASK		0xfff000
-#define MSI_TARGET_CPU_SHIFT		4
+#define MSI_ADDRESS_DEST_ID_MASK	0xfff0000f
 #define MSI_TARGET_CPU_MASK		0xff
 #define MSI_DELIVERY_MODE		0
 #define MSI_LEVEL_MODE			1	/* Edge always assert */
 #define MSI_TRIGGER_MODE		0	/* MSI is edge sensitive */
+#define MSI_PHYSICAL_MODE		0
 #define MSI_LOGICAL_MODE		1
 #define MSI_REDIRECTION_HINT_MODE	0
-#ifdef CONFIG_SMP
-#define MSI_TARGET_CPU			logical_smp_processor_id()
-#else
-#define MSI_TARGET_CPU			TARGET_CPUS
-#endif
 
 struct msg_data {
 #if defined(__LITTLE_ENDIAN_BITFIELD)
--- diff/drivers/pci/pci-sysfs.c	2004-02-18 08:54:10.000000000 +0000
+++ source/drivers/pci/pci-sysfs.c	2004-04-21 10:45:34.497459088 +0100
@@ -1,8 +1,8 @@
 /*
  * drivers/pci/pci-sysfs.c
  *
- * (C) Copyright 2002 Greg Kroah-Hartman
- * (C) Copyright 2002 IBM Corp.
+ * (C) Copyright 2002-2004 Greg Kroah-Hartman <greg@kroah.com>
+ * (C) Copyright 2002-2004 IBM Corp.
  * (C) Copyright 2003 Matthew Wilcox
  * (C) Copyright 2003 Hewlett-Packard
  *
@@ -71,7 +71,7 @@ pci_read_config(struct kobject *kobj, ch
 
 	/* Several chips lock up trying to read undefined config space */
 	if (capable(CAP_SYS_ADMIN)) {
-		size = 256;
+		size = dev->cfg_size;
 	} else if (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) {
 		size = 128;
 	}
@@ -123,10 +123,10 @@ pci_write_config(struct kobject *kobj, c
 	unsigned int size = count;
 	loff_t init_off = off;
 
-	if (off > 256)
+	if (off > dev->cfg_size)
 		return 0;
-	if (off + count > 256) {
-		size = 256 - off;
+	if (off + count > dev->cfg_size) {
+		size = dev->cfg_size - off;
 		count = size;
 	}
 
@@ -167,6 +167,17 @@ static struct bin_attribute pci_config_a
 	.write = pci_write_config,
 };
 
+static struct bin_attribute pcie_config_attr = {
+	.attr =	{
+		.name = "config",
+		.mode = S_IRUGO | S_IWUSR,
+		.owner = THIS_MODULE,
+	},
+	.size = 4096,
+	.read = pci_read_config,
+	.write = pci_write_config,
+};
+
 void pci_create_sysfs_dev_files (struct pci_dev *pdev)
 {
 	struct device *dev = &pdev->dev;
@@ -179,7 +190,11 @@ void pci_create_sysfs_dev_files (struct 
 	device_create_file (dev, &dev_attr_class);
 	device_create_file (dev, &dev_attr_irq);
 	device_create_file (dev, &dev_attr_resource);
-	sysfs_create_bin_file(&dev->kobj, &pci_config_attr);
+
+	if (pdev->cfg_size < 4096)
+		sysfs_create_bin_file(&dev->kobj, &pci_config_attr);
+	else
+		sysfs_create_bin_file(&dev->kobj, &pcie_config_attr);
 
 	/* add platform-specific attributes */
 	pcibios_add_platform_entries(pdev);
--- diff/drivers/pci/pci.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/pci/pci.c	2004-04-21 10:45:34.498458936 +0100
@@ -111,21 +111,15 @@ static int __pci_bus_find_cap(struct pci
  * support it.  Possible values for @cap:
  *
  *  %PCI_CAP_ID_PM           Power Management 
- *
  *  %PCI_CAP_ID_AGP          Accelerated Graphics Port 
- *
  *  %PCI_CAP_ID_VPD          Vital Product Data 
- *
  *  %PCI_CAP_ID_SLOTID       Slot Identification 
- *
  *  %PCI_CAP_ID_MSI          Message Signalled Interrupts
- *
  *  %PCI_CAP_ID_CHSWP        CompactPCI HotSwap 
- *
  *  %PCI_CAP_ID_PCIX         PCI-X
+ *  %PCI_CAP_ID_EXP          PCI Express
  */
-int
-pci_find_capability(struct pci_dev *dev, int cap)
+int pci_find_capability(struct pci_dev *dev, int cap)
 {
 	return __pci_bus_find_cap(dev->bus, dev->devfn, dev->hdr_type, cap);
 }
@@ -153,6 +147,54 @@ int pci_bus_find_capability(struct pci_b
 }
 
 /**
+ * pci_find_ext_capability - Find an extended capability
+ * @dev: PCI device to query
+ * @cap: capability code
+ *
+ * Returns the address of the requested extended capability structure
+ * within the device's PCI configuration space or 0 if the device does
+ * not support it.  Possible values for @cap:
+ *
+ *  %PCI_EXT_CAP_ID_ERR		Advanced Error Reporting
+ *  %PCI_EXT_CAP_ID_VC		Virtual Channel
+ *  %PCI_EXT_CAP_ID_DSN		Device Serial Number
+ *  %PCI_EXT_CAP_ID_PWR		Power Budgeting
+ */
+int pci_find_ext_capability(struct pci_dev *dev, int cap)
+{
+	u32 header;
+	int ttl = 480; /* 3840 bytes, minimum 8 bytes per capability */
+	int pos = 0x100;
+
+	if (dev->cfg_size <= 256)
+		return 0;
+
+	if (pci_read_config_dword(dev, pos, &header) != PCIBIOS_SUCCESSFUL)
+		return 0;
+
+	/*
+	 * If we have no capabilities, this is indicated by cap ID,
+	 * cap version and next pointer all being 0.
+	 */
+	if (header == 0)
+		return 0;
+
+	while (ttl-- > 0) {
+		if (PCI_EXT_CAP_ID(header) == cap)
+			return pos;
+
+		pos = PCI_EXT_CAP_NEXT(header);
+		if (pos < 0x100)
+			break;
+
+		if (pci_read_config_dword(dev, pos, &header) != PCIBIOS_SUCCESSFUL)
+			break;
+	}
+
+	return 0;
+}
+
+/**
  * pci_find_parent_resource - return resource region of parent bus of given region
  * @dev: PCI device structure contains resources to be searched
  * @res: child resource record for which parent is sought
@@ -658,6 +700,10 @@ pci_clear_mwi(struct pci_dev *dev)
 	}
 }
 
+#ifndef HAVE_ARCH_PCI_SET_DMA_MASK
+/*
+ * These can be overridden by arch-specific implementations
+ */
 int
 pci_set_dma_mask(struct pci_dev *dev, u64 mask)
 {
@@ -690,6 +736,7 @@ pci_set_consistent_dma_mask(struct pci_d
 
 	return 0;
 }
+#endif
      
 static int __devinit pci_init(void)
 {
--- diff/drivers/pci/pci.h	2003-07-11 09:39:50.000000000 +0100
+++ source/drivers/pci/pci.h	2004-04-21 10:45:34.498458936 +0100
@@ -60,3 +60,5 @@ extern int pci_visit_dev(struct pci_visi
 
 /* Lock for read/write access to pci device and bus lists */
 extern spinlock_t pci_bus_lock;
+
+extern int pciehp_msi_quirk;
--- diff/drivers/pci/probe.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/pci/probe.c	2004-04-21 10:45:34.499458784 +0100
@@ -18,6 +18,8 @@
 
 #define CARDBUS_LATENCY_TIMER	176	/* secondary latency timer */
 #define CARDBUS_RESERVE_BUSNR	3
+#define PCI_CFG_SPACE_SIZE	256
+#define PCI_CFG_SPACE_EXP_SIZE	4096
 
 /* Ugh.  Need to stop exporting this to modules. */
 LIST_HEAD(pci_root_buses);
@@ -530,6 +532,43 @@ static void pci_release_dev(struct devic
 	kfree(pci_dev);
 }
 
+/**
+ * pci_cfg_space_size - get the configuration space size of the PCI device.
+ *
+ * Regular PCI devices have 256 bytes, but PCI-X 2 and PCI Express devices
+ * have 4096 bytes.  Even if the device is capable, that doesn't mean we can
+ * access it.  Maybe we don't have a way to generate extended config space
+ * accesses, or the device is behind a reverse Express bridge.  So we try
+ * reading the dword at 0x100 which must either be 0 or a valid extended
+ * capability header.
+ */
+static int pci_cfg_space_size(struct pci_dev *dev)
+{
+	int pos;
+	u32 status;
+
+	pos = pci_find_capability(dev, PCI_CAP_ID_EXP);
+	if (!pos) {
+		pos = pci_find_capability(dev, PCI_CAP_ID_PCIX);
+		if (!pos)
+			goto fail;
+
+		pci_read_config_dword(dev, pos + PCI_X_STATUS, &status);
+		if (!(status & (PCI_X_STATUS_266MHZ | PCI_X_STATUS_533MHZ)))
+			goto fail;
+	}
+
+	if (pci_read_config_dword(dev, 256, &status) != PCIBIOS_SUCCESSFUL)
+		goto fail;
+	if (status == 0xffffffff)
+		goto fail;
+
+	return PCI_CFG_SPACE_EXP_SIZE;
+
+ fail:
+	return PCI_CFG_SPACE_SIZE;
+}
+
 /*
  * Read the config data for a PCI device, sanity-check it
  * and fill in the dev structure...
@@ -566,6 +605,7 @@ pci_scan_device(struct pci_bus *bus, int
 	dev->multifunction = !!(hdr_type & 0x80);
 	dev->vendor = l & 0xffff;
 	dev->device = (l >> 16) & 0xffff;
+	dev->cfg_size = pci_cfg_space_size(dev);
 
 	/* Assume 32-bit PCI; let 64-bit PCI cards (which are far rarer)
 	   set this higher, assuming the system even supports it.  */
--- diff/drivers/pci/proc.c	2004-01-19 10:22:58.000000000 +0000
+++ source/drivers/pci/proc.c	2004-04-21 10:45:34.499458784 +0100
@@ -16,16 +16,15 @@
 #include <asm/uaccess.h>
 #include <asm/byteorder.h>
 
-#define PCI_CFG_SPACE_SIZE 256
-
 static int proc_initialized;	/* = 0 */
 
 static loff_t
 proc_bus_pci_lseek(struct file *file, loff_t off, int whence)
 {
 	loff_t new = -1;
+	struct inode *inode = file->f_dentry->d_inode;
 
-	down(&file->f_dentry->d_inode->i_sem);
+	down(&inode->i_sem);
 	switch (whence) {
 	case 0:
 		new = off;
@@ -34,14 +33,14 @@ proc_bus_pci_lseek(struct file *file, lo
 		new = file->f_pos + off;
 		break;
 	case 2:
-		new = PCI_CFG_SPACE_SIZE + off;
+		new = inode->i_size + off;
 		break;
 	}
-	if (new < 0 || new > PCI_CFG_SPACE_SIZE)
+	if (new < 0 || new > inode->i_size)
 		new = -EINVAL;
 	else
 		file->f_pos = new;
-	up(&file->f_dentry->d_inode->i_sem);
+	up(&inode->i_sem);
 	return new;
 }
 
@@ -61,7 +60,7 @@ proc_bus_pci_read(struct file *file, cha
 	 */
 
 	if (capable(CAP_SYS_ADMIN))
-		size = PCI_CFG_SPACE_SIZE;
+		size = dev->cfg_size;
 	else if (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)
 		size = 128;
 	else
@@ -134,14 +133,15 @@ proc_bus_pci_write(struct file *file, co
 	const struct proc_dir_entry *dp = PDE(ino);
 	struct pci_dev *dev = dp->data;
 	int pos = *ppos;
+	int size = dev->cfg_size;
 	int cnt;
 
-	if (pos >= PCI_CFG_SPACE_SIZE)
+	if (pos >= size)
 		return 0;
-	if (nbytes >= PCI_CFG_SPACE_SIZE)
-		nbytes = PCI_CFG_SPACE_SIZE;
-	if (pos + nbytes > PCI_CFG_SPACE_SIZE)
-		nbytes = PCI_CFG_SPACE_SIZE - pos;
+	if (nbytes >= size)
+		nbytes = size;
+	if (pos + nbytes > size)
+		nbytes = size - pos;
 	cnt = nbytes;
 
 	if (!access_ok(VERIFY_READ, buf, cnt))
@@ -403,7 +403,7 @@ int pci_proc_attach_device(struct pci_de
 		return -ENOMEM;
 	e->proc_fops = &proc_bus_pci_operations;
 	e->data = dev;
-	e->size = PCI_CFG_SPACE_SIZE;
+	e->size = dev->cfg_size;
 
 	return 0;
 }
--- diff/drivers/pci/quirks.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/pci/quirks.c	2004-04-21 10:45:34.500458632 +0100
@@ -868,6 +868,13 @@ static void __init quirk_intel_ide_combi
 }
 #endif /* CONFIG_SCSI_SATA */
 
+int pciehp_msi_quirk;
+
+static void __devinit quirk_pciehp_msi(struct pci_dev *pdev)
+{
+	pciehp_msi_quirk = 1;
+}
+
 /*
  *  The main table of quirks.
  *
@@ -984,6 +991,8 @@ static struct pci_fixup pci_fixups[] __d
 	  quirk_intel_ide_combined },
 #endif /* CONFIG_SCSI_SATA */
 
+	{ PCI_FIXUP_FINAL,      PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_SMCH,	quirk_pciehp_msi },
+
 	{ 0 }
 };
 
@@ -1008,3 +1017,5 @@ void pci_fixup_device(int pass, struct p
 	pci_do_fixups(dev, pass, pcibios_fixups);
 	pci_do_fixups(dev, pass, pci_fixups);
 }
+
+EXPORT_SYMBOL(pciehp_msi_quirk);
--- diff/drivers/pcmcia/cistpl.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/pcmcia/cistpl.c	2004-04-21 10:45:34.501458480 +0100
@@ -33,6 +33,7 @@
 
 #include <linux/config.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <linux/major.h>
@@ -78,7 +79,7 @@ static const u_int exponent[] = {
 
 /* Parameters that can be set with 'insmod' */
 
-#define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i")
+#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0444)
 
 INT_MODULE_PARM(cis_width,	0);		/* 16-bit CIS? */
 
--- diff/drivers/pcmcia/cs.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/pcmcia/cs.c	2004-04-21 10:45:34.502458328 +0100
@@ -94,7 +94,7 @@ MODULE_AUTHOR("David Hinds <dahinds@user
 MODULE_DESCRIPTION("Linux Kernel Card Services\noptions:" OPTIONS);
 MODULE_LICENSE("Dual MPL/GPL");	  
 
-#define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i")
+#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0444)
 
 INT_MODULE_PARM(setup_delay,	10);		/* centiseconds */
 INT_MODULE_PARM(resume_delay,	20);		/* centiseconds */
@@ -720,7 +720,7 @@ static int pccardd(void *__skt)
 
 		schedule();
 		if (current->flags & PF_FREEZE)
-			refrigerator(PF_IOTHREAD);
+			refrigerator(PF_FREEZE);
 
 		if (!skt->thread)
 			break;
@@ -2151,9 +2151,8 @@ static int __init init_pcmcia_cs(void)
 {
     printk(KERN_INFO "%s\n", release);
     printk(KERN_INFO "  %s\n", options);
-    class_register(&pcmcia_socket_class);
 
-    return 0;
+    return class_register(&pcmcia_socket_class);
 }
 
 static void __exit exit_pcmcia_cs(void)
--- diff/drivers/pcmcia/cs_internal.h	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/pcmcia/cs_internal.h	2004-04-21 10:45:34.502458328 +0100
@@ -181,7 +181,7 @@ int copy_memory(memory_handle_t handle, 
 
 /* In rsrc_mgr */
 void validate_mem(struct pcmcia_socket *s);
-int find_io_region(ioaddr_t *base, ioaddr_t num, ioaddr_t align,
+int find_io_region(ioaddr_t *base, ioaddr_t num, unsigned long align,
 		   char *name, struct pcmcia_socket *s);
 int find_mem_region(u_long *base, u_long num, u_long align,
 		    int low, char *name, struct pcmcia_socket *s);
--- diff/drivers/pcmcia/i82365.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/pcmcia/i82365.c	2004-04-21 10:45:34.503458176 +0100
@@ -104,7 +104,8 @@ static int extra_sockets = 0;
 static int ignore = -1;
 /* Bit map or list of interrupts to choose from */
 static u_int irq_mask = 0xffff;
-static int irq_list[16] = { -1 };
+static int irq_list[16];
+static int irq_list_count;
 /* The card status change interrupt -- 0 means autoselect */
 static int cs_irq = 0;
 
@@ -130,27 +131,27 @@ static int async_clock = -1;
 static int cable_mode = -1;
 static int wakeup = 0;
 
-MODULE_PARM(i365_base, "i");
-MODULE_PARM(ignore, "i");
-MODULE_PARM(extra_sockets, "i");
-MODULE_PARM(irq_mask, "i");
-MODULE_PARM(irq_list, "1-16i");
-MODULE_PARM(cs_irq, "i");
-MODULE_PARM(async_clock, "i");
-MODULE_PARM(cable_mode, "i");
-MODULE_PARM(wakeup, "i");
-
-MODULE_PARM(do_scan, "i");
-MODULE_PARM(poll_interval, "i");
-MODULE_PARM(cycle_time, "i");
-MODULE_PARM(has_dma, "i");
-MODULE_PARM(has_led, "i");
-MODULE_PARM(has_ring, "i");
-MODULE_PARM(dynamic_mode, "i");
-MODULE_PARM(freq_bypass, "i");
-MODULE_PARM(setup_time, "i");
-MODULE_PARM(cmd_time, "i");
-MODULE_PARM(recov_time, "i");
+module_param(i365_base, int, 0444);
+module_param(ignore, int, 0444);
+module_param(extra_sockets, int, 0444);
+module_param(irq_mask, int, 0444);
+module_param_array(irq_list, int, irq_list_count, 0444);
+module_param(cs_irq, int, 0444);
+module_param(async_clock, int, 0444);
+module_param(cable_mode, int, 0444);
+module_param(wakeup, int, 0444);
+
+module_param(do_scan, int, 0444);
+module_param(poll_interval, int, 0444);
+module_param(cycle_time, int, 0444);
+module_param(has_dma, int, 0444);
+module_param(has_led, int, 0444);
+module_param(has_ring, int, 0444);
+module_param(dynamic_mode, int, 0444);
+module_param(freq_bypass, int, 0444);
+module_param(setup_time, int, 0444);
+module_param(cmd_time, int, 0444);
+module_param(recov_time, int, 0444);
 
 /*====================================================================*/
 
@@ -705,10 +706,10 @@ static void __init add_pcic(int ns, int 
     printk(", %d socket%s\n", ns, ((ns > 1) ? "s" : ""));
 
     /* Set host options, build basic interrupt mask */
-    if (irq_list[0] == -1)
+    if (irq_list_count == 0)
 	mask = irq_mask;
     else
-	for (i = mask = 0; i < 16; i++)
+	for (i = mask = 0; i < irq_list_count; i++)
 	    mask |= (1<<irq_list[i]);
     mask &= I365_MASK & set_bridge_opts(base, ns);
     /* Scan for ISA interrupts */
--- diff/drivers/pcmcia/rsrc_mgr.c	2003-09-30 15:46:16.000000000 +0100
+++ source/drivers/pcmcia/rsrc_mgr.c	2004-04-21 10:45:34.504458024 +0100
@@ -33,6 +33,7 @@
 
 #include <linux/config.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/kernel.h>
@@ -56,7 +57,7 @@
 
 /* Parameters that can be set with 'insmod' */
 
-#define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i")
+#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0444)
 
 INT_MODULE_PARM(probe_mem,	1);		/* memory probe? */
 #ifdef CONFIG_PCMCIA_PROBE
@@ -107,44 +108,8 @@ static irq_info_t irq_table[NR_IRQS];
 
 ======================================================================*/
 
-static struct resource *resource_parent(unsigned long b, unsigned long n,
-					int flags, struct pci_dev *dev)
-{
-#ifdef CONFIG_PCI
-	struct resource res, *pr;
-
-	if (dev != NULL) {
-		res.start = b;
-		res.end = b + n - 1;
-		res.flags = flags;
-		pr = pci_find_parent_resource(dev, &res);
-		if (pr)
-			return pr;
-	}
-#endif /* CONFIG_PCI */
-	if (flags & IORESOURCE_MEM)
-		return &iomem_resource;
-	return &ioport_resource;
-}
-
-/* FIXME: Fundamentally racy. */
-static inline int check_io_resource(unsigned long b, unsigned long n,
-				    struct pci_dev *dev)
-{
-	struct resource *region;
-
-	region = __request_region(resource_parent(b, n, IORESOURCE_IO, dev),
-				  b, n, "check_io_resource");
-	if (!region)
-		return -EBUSY;
-
-	release_resource(region);
-	kfree(region);
-	return 0;
-}
-
-static struct resource *make_resource(unsigned long b, unsigned long n,
-				      int flags, char *name)
+static struct resource *
+make_resource(unsigned long b, unsigned long n, int flags, char *name)
 {
 	struct resource *res = kmalloc(sizeof(*res), GFP_KERNEL);
 
@@ -158,34 +123,34 @@ static struct resource *make_resource(un
 	return res;
 }
 
-static int request_io_resource(unsigned long b, unsigned long n,
-			       char *name, struct pci_dev *dev)
+static struct resource *
+claim_region(struct pcmcia_socket *s, unsigned long base, unsigned long size,
+	     int type, char *name)
 {
-	struct resource *res = make_resource(b, n, IORESOURCE_IO, name);
-	struct resource *pr = resource_parent(b, n, IORESOURCE_IO, dev);
-	int err = -ENOMEM;
+	struct resource *res, *parent;
+
+	parent = type & IORESOURCE_MEM ? &iomem_resource : &ioport_resource;
+	res = make_resource(base, size, type | IORESOURCE_BUSY, name);
 
 	if (res) {
-		err = request_resource(pr, res);
-		if (err)
+#ifdef CONFIG_PCI
+		if (s && s->cb_dev)
+			parent = pci_find_parent_resource(s->cb_dev, res);
+#endif
+		if (!parent || request_resource(parent, res)) {
 			kfree(res);
+			res = NULL;
+		}
 	}
-	return err;
+	return res;
 }
 
-static int request_mem_resource(unsigned long b, unsigned long n,
-				char *name, struct pci_dev *dev)
+static void free_region(struct resource *res)
 {
-	struct resource *res = make_resource(b, n, IORESOURCE_MEM, name);
-	struct resource *pr = resource_parent(b, n, IORESOURCE_MEM, dev);
-	int err = -ENOMEM;
-
 	if (res) {
-		err = request_resource(pr, res);
-		if (err)
-			kfree(res);
+		release_resource(res);
+		kfree(res);
 	}
-	return err;
 }
 
 /*======================================================================
@@ -261,7 +226,7 @@ static int sub_interval(resource_map_t *
 #ifdef CONFIG_PCMCIA_PROBE
 static void do_io_probe(ioaddr_t base, ioaddr_t num)
 {
-    
+    struct resource *res;
     ioaddr_t i, j, bad, any;
     u_char *b, hole, most;
     
@@ -276,11 +241,13 @@ static void do_io_probe(ioaddr_t base, i
     }   
     memset(b, 0, 256);
     for (i = base, most = 0; i < base+num; i += 8) {
-	if (check_io_resource(i, 8, NULL))
+	res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA IO probe");
+	if (!res)
 	    continue;
 	hole = inb(i);
 	for (j = 1; j < 8; j++)
 	    if (inb(i+j) != hole) break;
+	free_region(res);
 	if ((j == 8) && (++b[hole] > b[most]))
 	    most = hole;
 	if (b[most] == 127) break;
@@ -289,10 +256,12 @@ static void do_io_probe(ioaddr_t base, i
 
     bad = any = 0;
     for (i = base; i < base+num; i += 8) {
-	if (check_io_resource(i, 8, NULL))
+	res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA IO probe");
+	if (!res)
 	    continue;
 	for (j = 0; j < 8; j++)
 	    if (inb(i+j) != most) break;
+	free_region(res);
 	if (j < 8) {
 	    if (!any)
 		printk(" excluding");
@@ -389,18 +358,16 @@ cis_readable(struct pcmcia_socket *s, un
 	cisinfo_t info1, info2;
 	int ret = 0;
 
-	res1 = request_mem_region(base, size/2, "cs memory probe");
-	res2 = request_mem_region(base + size/2, size/2, "cs memory probe");
+	res1 = claim_region(s, base, size/2, IORESOURCE_MEM, "cs memory probe");
+	res2 = claim_region(s, base + size/2, size/2, IORESOURCE_MEM, "cs memory probe");
 
 	if (res1 && res2) {
 		ret = readable(s, res1, &info1);
 		ret += readable(s, res2, &info2);
 	}
 
-	if (res2)
-		release_resource(res2);
-	if (res1)
-		release_resource(res1);
+	free_region(res2);
+	free_region(res1);
 
 	return (ret == 2) && (info1.Chains == info2.Chains);
 }
@@ -411,18 +378,16 @@ checksum_match(struct pcmcia_socket *s, 
 	struct resource *res1, *res2;
 	int a = -1, b = -1;
 
-	res1 = request_mem_region(base, size/2, "cs memory probe");
-	res2 = request_mem_region(base + size/2, size/2, "cs memory probe");
+	res1 = claim_region(s, base, size/2, IORESOURCE_MEM, "cs memory probe");
+	res2 = claim_region(s, base + size/2, size/2, IORESOURCE_MEM, "cs memory probe");
 
 	if (res1 && res2) {
 		a = checksum(s, res1);
 		b = checksum(s, res2);
 	}
 
-	if (res2)
-		release_resource(res2);
-	if (res1)
-		release_resource(res1);
+	free_region(res2);
+	free_region(res1);
 
 	return (a == b) && (a >= 0);
 }
@@ -553,6 +518,68 @@ void validate_mem(struct pcmcia_socket *
 
 #endif /* CONFIG_PCMCIA_PROBE */
 
+struct pcmcia_align_data {
+	unsigned long	mask;
+	unsigned long	offset;
+	resource_map_t	*map;
+};
+
+static void
+pcmcia_common_align(void *align_data, struct resource *res,
+		    unsigned long size, unsigned long align)
+{
+	struct pcmcia_align_data *data = align_data;
+	unsigned long start;
+	/*
+	 * Ensure that we have the correct start address
+	 */
+	start = (res->start & ~data->mask) + data->offset;
+	if (start < res->start)
+		start += data->mask + 1;
+	res->start = start;
+}
+
+static void
+pcmcia_align(void *align_data, struct resource *res,
+	     unsigned long size, unsigned long align)
+{
+	struct pcmcia_align_data *data = align_data;
+	resource_map_t *m;
+
+	pcmcia_common_align(data, res, size, align);
+
+	for (m = data->map->next; m != data->map; m = m->next) {
+		unsigned long start = m->base;
+		unsigned long end = m->base + m->num;
+
+		/*
+		 * If the lower resources are not available, try aligning
+		 * to this entry of the resource database to see if it'll
+		 * fit here.
+		 */
+		if (res->start < start) {
+			res->start = start;
+			pcmcia_common_align(data, res, size, align);
+		}
+
+		/*
+		 * If we're above the area which was passed in, there's
+		 * no point proceeding.
+		 */
+		if (res->start >= res->end)
+			break;
+
+		if ((res->start + size) <= end)
+			break;
+	}
+
+	/*
+	 * If we failed to find something suitable, ensure we fail.
+	 */
+	if (m == data->map)
+		res->start = res->end;
+}
+
 /*======================================================================
 
     These find ranges of I/O ports or memory addresses that are not
@@ -566,69 +593,89 @@ void validate_mem(struct pcmcia_socket *
     
 ======================================================================*/
 
-int find_io_region(ioaddr_t *base, ioaddr_t num, ioaddr_t align,
+int find_io_region(ioaddr_t *base, ioaddr_t num, unsigned long align,
 		   char *name, struct pcmcia_socket *s)
 {
-    ioaddr_t try;
-    resource_map_t *m;
-    int ret = -1;
+	struct resource *res = make_resource(0, num, IORESOURCE_IO, name);
+	struct pcmcia_align_data data;
+	unsigned long min = *base;
+	int ret;
+
+	if (align == 0)
+		align = 0x10000;
+
+	data.mask = align - 1;
+	data.offset = *base & data.mask;
+	data.map = &io_db;
 
-    down(&rsrc_sem);
-    for (m = io_db.next; m != &io_db; m = m->next) {
-	try = (m->base & ~(align-1)) + *base;
-	for (try = (try >= m->base) ? try : try+align;
-	     (try >= m->base) && (try+num <= m->base+m->num);
-	     try += align) {
-	    if (request_io_resource(try, num, name, s->cb_dev) == 0) {
-		*base = try;
-		ret = 0;
-		goto out;
-	    }
-	    if (!align)
-		break;
+#ifdef CONFIG_PCI
+	if (s->cb_dev) {
+		ret = pci_bus_alloc_resource(s->cb_dev->bus, res, num, 1,
+					     min, 0, pcmcia_align, &data);
+	} else
+#endif
+	{
+		down(&rsrc_sem);
+		ret = allocate_resource(&ioport_resource, res, num, min, ~0UL, 0,
+					pcmcia_align, &data);
+		up(&rsrc_sem);
 	}
-    }
- out:
-    up(&rsrc_sem);
-    return ret;
+
+	if (ret != 0) {
+		kfree(res);
+	} else {
+		*base = res->start;
+	}
+	return ret;
 }
 
 int find_mem_region(u_long *base, u_long num, u_long align,
 		    int low, char *name, struct pcmcia_socket *s)
 {
-    u_long try;
-    resource_map_t *m;
-    int ret = -1;
-
-    low = low || !(s->features & SS_CAP_PAGE_REGS);
+	struct resource *res = make_resource(0, num, IORESOURCE_MEM, name);
+	struct pcmcia_align_data data;
+	unsigned long min, max;
+	int ret, i;
+
+	low = low || !(s->features & SS_CAP_PAGE_REGS);
+
+	data.mask = align - 1;
+	data.offset = *base & data.mask;
+	data.map = &mem_db;
+
+	for (i = 0; i < 2; i++) {
+		if (low) {
+			max = 0x100000UL;
+			min = *base < max ? *base : 0;
+		} else {
+			max = ~0UL;
+			min = 0x100000UL + *base;
+		}
 
-    down(&rsrc_sem);
-    while (1) {
-	for (m = mem_db.next; m != &mem_db; m = m->next) {
-	    /* first pass >1MB, second pass <1MB */
-	    if ((low != 0) ^ (m->base < 0x100000))
-		continue;
-
-	    try = (m->base & ~(align-1)) + *base;
-	    for (try = (try >= m->base) ? try : try+align;
-		 (try >= m->base) && (try+num <= m->base+m->num);
-		 try += align) {
-		if (request_mem_resource(try, num, name, s->cb_dev) == 0) {
-		    *base = try;
-		    ret = 0;
-		    goto out;
+#ifdef CONFIG_PCI
+		if (s->cb_dev) {
+			ret = pci_bus_alloc_resource(s->cb_dev->bus, res, num,
+						     1, min, 0,
+						     pcmcia_align, &data);
+		} else
+#endif
+		{
+			down(&rsrc_sem);
+			ret = allocate_resource(&iomem_resource, res, num, min,
+						max, 0, pcmcia_align, &data);
+			up(&rsrc_sem);
 		}
-		if (!align)
-		    break;
-	    }
+		if (ret == 0 || low)
+			break;
+		low = 1;
 	}
-	if (low)
-	    break;
-	low++;
-    }
- out:
-    up(&rsrc_sem);
-    return ret;
+
+	if (ret != 0) {
+		kfree(res);
+	} else {
+		*base = res->start;
+	}
+	return ret;
 }
 
 /*======================================================================
--- diff/drivers/pcmcia/sa1100_pfs168.c	2003-05-21 11:50:00.000000000 +0100
+++ source/drivers/pcmcia/sa1100_pfs168.c	2004-04-21 10:45:34.504458024 +0100
@@ -101,7 +101,7 @@ pfs168_pcmcia_configure_socket(struct sa
     }
 
     if (state->Vpp != state->Vcc && state->Vpp != 0) {
-      printk(KERN_ERR "%s(): CompactFlash socket does not support VPP %uV\n"
+      printk(KERN_ERR "%s(): CompactFlash socket does not support VPP %uV\n",
 	     __FUNCTION__, state->Vpp / 10);
       return -1;
     }
--- diff/drivers/pcmcia/sa1100_shannon.c	2003-05-21 11:50:00.000000000 +0100
+++ source/drivers/pcmcia/sa1100_shannon.c	2004-04-21 10:45:34.505457872 +0100
@@ -74,19 +74,19 @@ shannon_pcmcia_configure_socket(struct s
 {
 	switch (state->Vcc) {
 	case 0:	/* power off */
-		printk(KERN_WARNING __FUNCTION__"(): CS asked for 0V, still applying 3.3V..\n");
+		printk(KERN_WARNING "%s(): CS asked for 0V, still applying 3.3V..\n", __FUNCTION__);
 		break;
 	case 50:
-		printk(KERN_WARNING __FUNCTION__"(): CS asked for 5V, applying 3.3V..\n");
+		printk(KERN_WARNING "%s(): CS asked for 5V, applying 3.3V..\n", __FUNCTION__);
 	case 33:
 		break;
 	default:
-		printk(KERN_ERR __FUNCTION__"(): unrecognized Vcc %u\n",
-		       state->Vcc);
+		printk(KERN_ERR "%s(): unrecognized Vcc %u\n",
+		       __FUNCTION__, state->Vcc);
 		return -1;
 	}
 
-	printk(KERN_WARNING __FUNCTION__"(): Warning, Can't perform reset\n");
+	printk(KERN_WARNING "%s(): Warning, Can't perform reset\n", __FUNCTION__);
 	
 	/* Silently ignore Vpp, output enable, speaker enable. */
 
--- diff/drivers/pcmcia/sa1100_stork.c	2004-01-19 10:22:58.000000000 +0000
+++ source/drivers/pcmcia/sa1100_stork.c	2004-04-21 10:45:34.505457872 +0100
@@ -50,7 +50,7 @@ static void stork_pcmcia_hw_shutdown(str
 {
 	int i;
 
-        printk(__FUNCTION__ "\n");
+        printk("%s\n", __FUNCTION__);
 
         /* disable IRQs */
         sa11xx_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
@@ -68,7 +68,7 @@ stork_pcmcia_socket_state(struct sa1100_
         unsigned long levels = GPLR;
 
 	if (debug > 1)
-		printk(__FUNCTION__ " GPLR=%x IRQ[1:0]=%x\n", levels,
+		printk("%s GPLR=%x IRQ[1:0]=%x\n", __FUNCTION__, levels,
 			(levels & (GPIO_STORK_PCMCIA_A_RDY|GPIO_STORK_PCMCIA_B_RDY)));
 
 	switch (skt->nr) {
--- diff/drivers/pcmcia/sa1100_yopy.c	2003-05-21 11:50:00.000000000 +0100
+++ source/drivers/pcmcia/sa1100_yopy.c	2004-04-21 10:45:34.505457872 +0100
@@ -76,13 +76,13 @@ yopy_pcmcia_configure_socket(struct sa11
 		pcmcia_power(0);
 		break;
 	case 50:
-		printk(KERN_WARNING __FUNCTION__"(): CS asked for 5V, applying 3.3V..\n");
+		printk(KERN_WARNING "%s(): CS asked for 5V, applying 3.3V..\n", __FUNCTION__);
 	case 33:
 		pcmcia_power(1);
 		break;
 	default:
-		printk(KERN_ERR __FUNCTION__"(): unrecognized Vcc %u\n",
-		       state->Vcc);
+		printk(KERN_ERR "%s(): unrecognized Vcc %u\n",
+		       __FUNCTION__, state->Vcc);
 		return -1;
 	}
 
--- diff/drivers/pcmcia/tcic.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/pcmcia/tcic.c	2004-04-21 10:45:34.506457720 +0100
@@ -60,7 +60,6 @@
 static int pc_debug;
 
 module_param(pc_debug, int, 0644);
-MODULE_PARM(pc_debug, "i");
 static const char *version =
 "tcic.c 1.111 2000/02/15 04:13:12 (David Hinds)";
 
@@ -91,7 +90,8 @@ static int do_scan = 1;
 
 /* Bit map of interrupts to choose from */
 static u_int irq_mask = 0xffff;
-static int irq_list[16] = { -1 };
+static int irq_list[16];
+static int irq_list_count;
 
 /* The card status change interrupt -- 0 means autoselect */
 static int cs_irq;
@@ -105,15 +105,15 @@ static int poll_quick = HZ/20;
 /* CCLK external clock time, in nanoseconds.  70 ns = 14.31818 MHz */
 static int cycle_time = 70;
 
-MODULE_PARM(tcic_base, "i");
-MODULE_PARM(ignore, "i");
-MODULE_PARM(do_scan, "i");
-MODULE_PARM(irq_mask, "i");
-MODULE_PARM(irq_list, "1-16i");
-MODULE_PARM(cs_irq, "i");
-MODULE_PARM(poll_interval, "i");
-MODULE_PARM(poll_quick, "i");
-MODULE_PARM(cycle_time, "i");
+module_param(tcic_base, int, 0444);
+module_param(ignore, int, 0444);
+module_param(do_scan, int, 0444);
+module_param(irq_mask, int, 0444);
+module_param_array(irq_list, int, irq_list_count, 0444);
+module_param(cs_irq, int, 0444);
+module_param(poll_interval, int, 0444);
+module_param(poll_quick, int, 0444);
+module_param(cycle_time, int, 0444);
 
 /*====================================================================*/
 
@@ -481,10 +481,10 @@ static int __init init_tcic(void)
 
     /* Build interrupt mask */
     printk(", %d sockets\n" KERN_INFO "  irq list (", sockets);
-    if (irq_list[0] == -1)
+    if (irq_list_count == 0)
 	mask = irq_mask;
     else
-	for (i = mask = 0; i < 16; i++)
+	for (i = mask = 0; i < irq_list_count; i++)
 	    mask |= (1<<irq_list[i]);
 
     /* irq 14, 11, 10, 7, 6, 5, 4, 3 */
--- diff/drivers/pcmcia/ti113x.h	2003-09-17 12:28:09.000000000 +0100
+++ source/drivers/pcmcia/ti113x.h	2004-04-21 10:45:34.507457568 +0100
@@ -76,7 +76,23 @@
 #define TI1250_GPIO1_CONTROL		0x0089	/* 8 bit */
 #define TI1250_GPIO2_CONTROL		0x008a	/* 8 bit */
 #define TI1250_GPIO3_CONTROL		0x008b	/* 8 bit */
-#define TI122X_IRQMUX			0x008c	/* 32 bit */
+#define TI1250_GPIO_MODE_MASK		0xc0
+
+/* IRQMUX/MFUNC Register */
+#define TI122X_MFUNC			0x008c	/* 32 bit */
+#define TI122X_MFUNC0_MASK		0x0000000f
+#define TI122X_MFUNC1_MASK		0x000000f0
+#define TI122X_MFUNC2_MASK		0x00000f00
+#define TI122X_MFUNC3_MASK		0x0000f000
+#define TI122X_MFUNC4_MASK		0x000f0000
+#define TI122X_MFUNC5_MASK		0x00f00000
+#define TI122X_MFUNC6_MASK		0x0f000000
+
+#define TI122X_MFUNC0_INTA		0x00000002
+#define TI125X_MFUNC0_INTB		0x00000001
+#define TI122X_MFUNC1_INTB		0x00000020
+#define TI122X_MFUNC3_IRQSER		0x00001000
+
 
 /* Retry Status Register */
 #define TI113X_RETRY_STATUS		0x0090	/* 8 bit */
@@ -143,7 +159,7 @@
 #define ti_cardctl(socket)	((socket)->private[1])
 #define ti_devctl(socket)	((socket)->private[2])
 #define ti_diag(socket)		((socket)->private[3])
-#define ti_irqmux(socket)	((socket)->private[4])
+#define ti_mfunc(socket)	((socket)->private[4])
 
 /*
  * These are the TI specific power management handlers.
@@ -151,7 +167,7 @@
 static void ti_save_state(struct yenta_socket *socket)
 {
 	ti_sysctl(socket) = config_readl(socket, TI113X_SYSTEM_CONTROL);
-	ti_irqmux(socket) = config_readl(socket, TI122X_IRQMUX);
+	ti_mfunc(socket) = config_readl(socket, TI122X_MFUNC);
 	ti_cardctl(socket) = config_readb(socket, TI113X_CARD_CONTROL);
 	ti_devctl(socket) = config_readb(socket, TI113X_DEVICE_CONTROL);
 	ti_diag(socket) = config_readb(socket, TI1250_DIAGNOSTIC);
@@ -160,7 +176,7 @@ static void ti_save_state(struct yenta_s
 static void ti_restore_state(struct yenta_socket *socket)
 {
 	config_writel(socket, TI113X_SYSTEM_CONTROL, ti_sysctl(socket));
-	config_writel(socket, TI122X_IRQMUX, ti_irqmux(socket));
+	config_writel(socket, TI122X_MFUNC, ti_mfunc(socket));
 	config_writeb(socket, TI113X_CARD_CONTROL, ti_cardctl(socket));
 	config_writeb(socket, TI113X_DEVICE_CONTROL, ti_devctl(socket));
 	config_writeb(socket, TI1250_DIAGNOSTIC, ti_diag(socket));
@@ -252,7 +268,7 @@ static void ti_set_zv(struct yenta_socke
  * INTCTL register that sets the PCI CSC interrupt.
  * Make sure we set it correctly at open and init
  * time
- * - open: disable the PCI CSC interrupt. This makes
+ * - override: disable the PCI CSC interrupt. This makes
  *   it possible to use the CSC interrupt to probe the
  *   ISA interrupts.
  * - init: set the interrupt to match our PCI state.
@@ -281,33 +297,6 @@ static int ti_override(struct yenta_sock
 
 	ti_set_zv(socket);
 
-#if 0
-	/*
-	 * If ISA interrupts don't work, then fall back to routing card
-	 * interrupts to the PCI interrupt of the socket.
-	 *
-	 * Tweaking this when we are using serial PCI IRQs causes hangs
-	 *   --rmk
-	 */
-	if (!socket->socket.irq_mask) {
-		u8 irqmux, devctl;
-
-		devctl = config_readb(socket, TI113X_DEVICE_CONTROL);
-		if ((devctl & TI113X_DCR_IMODE_MASK) != TI12XX_DCR_IMODE_ALL_SERIAL) {
-			printk (KERN_INFO "ti113x: Routing card interrupts to PCI\n");
-
-			devctl &= ~TI113X_DCR_IMODE_MASK;
-
-			irqmux = config_readl(socket, TI122X_IRQMUX);
-			irqmux = (irqmux & ~0x0f) | 0x02; /* route INTA */
-			irqmux = (irqmux & ~0xf0) | 0x20; /* route INTB */
-
-			config_writel(socket, TI122X_IRQMUX, irqmux);
-			config_writeb(socket, TI113X_DEVICE_CONTROL, devctl);
-		}
-	}
-#endif
-
 	return 0;
 }
 
@@ -325,6 +314,271 @@ static int ti113x_override(struct yenta_
 }
 
 
+/* irqrouting for func0, probes PCI interrupt and ISA interrupts */
+static void ti12xx_irqroute_func0(struct yenta_socket *socket)
+{
+	u32 mfunc, mfunc_old, devctl;
+	u8 gpio3, gpio3_old;
+	int pci_irq_status;
+
+	mfunc = mfunc_old = config_readl(socket, TI122X_MFUNC);
+	devctl = config_readb(socket, TI113X_DEVICE_CONTROL);
+	printk(KERN_INFO "Yenta TI: socket %s, mfunc 0x%08x, devctl 0x%02x\n",
+	       pci_name(socket->dev), mfunc, devctl);
+
+	/* make sure PCI interrupts are enabled before probing */
+	ti_init(socket);
+
+	/* test PCI interrupts first. only try fixing if return value is 0! */
+	pci_irq_status = yenta_probe_cb_irq(socket);
+	if (pci_irq_status)
+		goto out;
+
+	/*
+	 * We're here which means PCI interrupts are _not_ delivered. try to
+	 * find the right setting (all serial or parallel)
+	 */
+	printk(KERN_INFO "Yenta TI: socket %s probing PCI interrupt failed, trying to fix\n",
+	       pci_name(socket->dev));
+
+	/* for serial PCI make sure MFUNC3 is set to IRQSER */
+	if ((devctl & TI113X_DCR_IMODE_MASK) == TI12XX_DCR_IMODE_ALL_SERIAL) {
+		switch (socket->dev->device) {
+		case PCI_DEVICE_ID_TI_1250:
+		case PCI_DEVICE_ID_TI_1251A:
+		case PCI_DEVICE_ID_TI_1251B:
+		case PCI_DEVICE_ID_TI_1450:
+		case PCI_DEVICE_ID_TI_1451A:
+		case PCI_DEVICE_ID_TI_4450:
+		case PCI_DEVICE_ID_TI_4451:
+			/* these chips have no IRQSER setting in MFUNC3  */
+			break;
+
+		default:
+			mfunc = (mfunc & ~TI122X_MFUNC3_MASK) | TI122X_MFUNC3_IRQSER;
+
+			/* write down if changed, probe */
+			if (mfunc != mfunc_old) {
+				config_writel(socket, TI122X_MFUNC, mfunc);
+
+				pci_irq_status = yenta_probe_cb_irq(socket);
+				if (pci_irq_status == 1) {
+					printk(KERN_INFO "Yenta TI: socket %s all-serial interrupts ok\n",
+					       pci_name(socket->dev));
+					mfunc_old = mfunc;
+					goto out;
+				}
+
+				/* not working, back to old value */
+				mfunc = mfunc_old;
+				config_writel(socket, TI122X_MFUNC, mfunc);
+
+				if (pci_irq_status == -1)
+					goto out;
+			}
+		}
+
+		/* serial PCI interrupts not working fall back to parallel */
+		printk(KERN_INFO "Yenta TI: socket %s falling back to parallel PCI interrupts\n",
+		       pci_name(socket->dev));
+		devctl &= ~TI113X_DCR_IMODE_MASK;
+		devctl |= TI113X_DCR_IMODE_SERIAL; /* serial ISA could be right */
+		config_writeb(socket, TI113X_DEVICE_CONTROL, devctl);
+	}
+
+	/* parallel PCI interrupts: route INTA */
+	switch (socket->dev->device) {
+	case PCI_DEVICE_ID_TI_1250:
+	case PCI_DEVICE_ID_TI_1251A:
+	case PCI_DEVICE_ID_TI_1251B:
+	case PCI_DEVICE_ID_TI_1450:
+		/* make sure GPIO3 is set to INTA */
+		gpio3 = gpio3_old = config_readb(socket, TI1250_GPIO3_CONTROL);
+		gpio3 &= ~TI1250_GPIO_MODE_MASK;
+		if (gpio3 != gpio3_old)
+			config_writeb(socket, TI1250_GPIO3_CONTROL, gpio3);
+		break;
+
+	default:
+		gpio3 = gpio3_old = 0;
+
+		mfunc = (mfunc & ~TI122X_MFUNC0_MASK) | TI122X_MFUNC0_INTA;
+		if (mfunc != mfunc_old)
+			config_writel(socket, TI122X_MFUNC, mfunc);
+	}
+
+	/* time to probe again */
+	pci_irq_status = yenta_probe_cb_irq(socket);
+	if (pci_irq_status == 1) {
+		mfunc_old = mfunc;
+		printk(KERN_INFO "Yenta TI: socket %s parallel PCI interrupts ok\n",
+		       pci_name(socket->dev));
+	} else {
+		/* not working, back to old value */
+		mfunc = mfunc_old;
+		config_writel(socket, TI122X_MFUNC, mfunc);
+		if (gpio3 != gpio3_old)
+			config_writeb(socket, TI1250_GPIO3_CONTROL, gpio3_old);
+	}
+
+out:
+	if (pci_irq_status < 1) {
+		socket->cb_irq = 0;
+		printk(KERN_INFO "Yenta TI: socket %s no PCI interrupts. Fish. Please report.\n",
+		       pci_name(socket->dev));
+	}
+}
+
+
+/*
+ * ties INTA and INTB together. also changes the devices irq to that of
+ * the function 0 device. call from func1 only.
+ * returns 1 if INTRTIE changed, 0 otherwise.
+ */
+static int ti12xx_tie_interrupts(struct yenta_socket *socket, int *old_irq)
+{
+	struct pci_dev *func0;
+	u32 sysctl;
+
+	sysctl = config_readl(socket, TI113X_SYSTEM_CONTROL);
+	if (sysctl & TI122X_SCR_INTRTIE)
+		return 0;
+
+	/* find func0 device */
+	func0 = pci_get_slot(socket->dev->bus, socket->dev->devfn & ~0x07);
+	if (!func0)
+		return 0;
+
+	/* change the interrupt to match func0, tie 'em up */
+	*old_irq = socket->cb_irq;
+	socket->cb_irq = socket->dev->irq = func0->irq;
+	sysctl |= TI122X_SCR_INTRTIE;
+	config_writel(socket, TI113X_SYSTEM_CONTROL, sysctl);
+
+	pci_dev_put(func0);
+
+	return 1;
+}
+
+/* undo what ti12xx_tie_interrupts() did */
+static void ti12xx_untie_interrupts(struct yenta_socket *socket, int old_irq)
+{
+	u32 sysctl = config_readl(socket, TI113X_SYSTEM_CONTROL);
+	sysctl &= ~TI122X_SCR_INTRTIE;
+	config_writel(socket, TI113X_SYSTEM_CONTROL, sysctl);
+
+	socket->cb_irq = socket->dev->irq = old_irq;
+}
+
+/* 
+ * irqrouting for func1, plays with INTB routing
+ * only touches MFUNC for INTB routing. all other bits are taken
+ * care of in func0 already.
+ */
+static void ti12xx_irqroute_func1(struct yenta_socket *socket)
+{
+	u32 mfunc, mfunc_old, devctl;
+	int pci_irq_status;
+
+	mfunc = mfunc_old = config_readl(socket, TI122X_MFUNC);
+	devctl = config_readb(socket, TI113X_DEVICE_CONTROL);
+	printk(KERN_INFO "Yenta TI: socket %s, mfunc 0x%08x, devctl 0x%02x\n",
+	       pci_name(socket->dev), mfunc, devctl);
+
+	/* make sure PCI interrupts are enabled before probing */
+	ti_init(socket);
+
+	/* test PCI interrupts first. only try fixing if return value is 0! */
+	pci_irq_status = yenta_probe_cb_irq(socket);
+	if (pci_irq_status)
+		goto out;
+
+	/*
+	 * We're here which means PCI interrupts are _not_ delivered. try to
+	 * find the right setting
+	 */
+	printk(KERN_INFO "Yenta TI: socket %s probing PCI interrupt failed, trying to fix\n",
+	       pci_name(socket->dev));
+
+
+	/* if all serial: set INTRTIE, probe again */
+	if ((devctl & TI113X_DCR_IMODE_MASK) == TI12XX_DCR_IMODE_ALL_SERIAL) {
+		int old_irq;
+
+		if (ti12xx_tie_interrupts(socket, &old_irq)) {
+			pci_irq_status = yenta_probe_cb_irq(socket);
+			if (pci_irq_status == 1) {
+				printk(KERN_INFO "Yenta TI: socket %s all-serial interrupts, tied ok\n",
+				       pci_name(socket->dev));
+				goto out;
+			}
+
+			ti12xx_untie_interrupts(socket, old_irq);
+		}
+	}
+	/* parallel PCI: route INTB, probe again */
+	else {
+		int old_irq;
+
+		switch (socket->dev->device) {
+		case PCI_DEVICE_ID_TI_1250:
+			/* the 1250 has one pin for IRQSER/INTB depending on devctl */
+			break;
+
+		case PCI_DEVICE_ID_TI_1251A:
+		case PCI_DEVICE_ID_TI_1251B:
+		case PCI_DEVICE_ID_TI_1450:
+			/*
+			 *  those have a pin for IRQSER/INTB plus INTB in MFUNC0
+			 *  we alread probed the shared pin, now go for MFUNC0
+			 */
+			mfunc = (mfunc & ~TI122X_MFUNC0_MASK) | TI125X_MFUNC0_INTB;
+			break;
+
+		default:
+			mfunc = (mfunc & ~TI122X_MFUNC1_MASK) | TI122X_MFUNC1_INTB;
+			break;
+		}
+
+		/* write, probe */
+		if (mfunc != mfunc_old) {
+			config_writel(socket, TI122X_MFUNC, mfunc);
+
+			pci_irq_status = yenta_probe_cb_irq(socket);
+			if (pci_irq_status == 1) {
+				printk(KERN_INFO "Yenta TI: socket %s parallel PCI interrupts ok\n",
+				       pci_name(socket->dev));
+				goto out;
+			}
+
+			mfunc = mfunc_old;
+			config_writel(socket, TI122X_MFUNC, mfunc);
+
+			if (pci_irq_status == -1)
+				goto out;
+		}
+		
+		/* still nothing: set INTRTIE */
+		if (ti12xx_tie_interrupts(socket, &old_irq)) {
+			pci_irq_status = yenta_probe_cb_irq(socket);
+			if (pci_irq_status == 1) {
+				printk(KERN_INFO "Yenta TI: socket %s parallel PCI interrupts, tied ok\n",
+				       pci_name(socket->dev));
+				goto out;
+			}
+
+			ti12xx_untie_interrupts(socket, old_irq);
+		}
+	}
+
+out:
+	if (pci_irq_status < 1) {
+		socket->cb_irq = 0;
+		printk(KERN_INFO "Yenta TI: socket %s no PCI interrupts. Fish. Please report.\n",
+		       pci_name(socket->dev));
+	}
+}
+
 static int ti12xx_override(struct yenta_socket *socket)
 {
 	u32 val;
@@ -347,6 +601,12 @@ static int ti12xx_override(struct yenta_
 	printk(KERN_INFO "Yenta: Routing CardBus interrupts to %s\n",
 		(val & TI1250_DIAG_PCI_IREQ) ? "PCI" : "ISA");
 
+	/* do irqrouting, depending on function */
+	if (PCI_FUNC(socket->dev->devfn) == 0)
+		ti12xx_irqroute_func0(socket);
+	else
+		ti12xx_irqroute_func1(socket);
+
 	return ti_override(socket);
 }
 
@@ -366,26 +626,6 @@ static int ti1250_override(struct yenta_
 		config_writeb(socket, TI1250_DIAGNOSTIC, diag);
 	}
 
-#if 0
-	/*
-	 * This is highly machine specific, and we should NOT touch
-	 * this register - we have no knowledge how the hardware
-	 * is actually wired.
-	 *
-	 * If we're going to do this, we should probably look into
-	 * using the subsystem IDs.
-	 *
-	 * On ThinkPad 380XD, this changes MFUNC0 from the ISA IRQ3
-	 * output (which it is) to IRQ2.  We also change MFUNC1
-	 * from ISA IRQ4 to IRQ6.
-	 */
-	irqmux = config_readl(socket, TI122X_IRQMUX);
-	irqmux = (irqmux & ~0x0f) | 0x02; /* route INTA */
-	if (!(ti_sysctl(socket) & TI122X_SCR_INTRTIE))
-		irqmux = (irqmux & ~0xf0) | 0x20; /* route INTB */
-	config_writel(socket, TI122X_IRQMUX, irqmux);
-#endif
-
 	return ti12xx_override(socket);
 }
 
--- diff/drivers/pcmcia/yenta_socket.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/pcmcia/yenta_socket.c	2004-04-21 10:45:34.508457416 +0100
@@ -39,6 +39,9 @@
 #define to_cycles(ns)	((ns)/120)
 #define to_ns(cycles)	((cycles)*120)
 
+static int yenta_probe_cb_irq(struct yenta_socket *socket);
+
+
 /*
  * Generate easy-to-use ways of reading a cardbus sockets
  * regular memory space ("cb_xxx"), configuration space
@@ -768,6 +771,69 @@ static unsigned int yenta_probe_irq(stru
 	return mask;
 }
 
+
+/* interrupt handler, only used during probing */
+static irqreturn_t yenta_probe_handler(int irq, void *dev_id, struct pt_regs *regs)
+{
+	struct yenta_socket *socket = (struct yenta_socket *) dev_id;
+	u8 csc;
+        u32 cb_event;
+
+	/* Clear interrupt status for the event */
+	cb_event = cb_readl(socket, CB_SOCKET_EVENT);
+	cb_writel(socket, CB_SOCKET_EVENT, -1);
+	csc = exca_readb(socket, I365_CSC);
+
+	if (cb_event || csc) {
+		socket->probe_status = 1;
+		return IRQ_HANDLED;
+	}
+
+	return IRQ_NONE;
+}
+
+/* probes the PCI interrupt, use only on override functions */
+static int yenta_probe_cb_irq(struct yenta_socket *socket)
+{
+	u16 bridge_ctrl;
+
+	if (!socket->cb_irq)
+		return -1;
+
+	socket->probe_status = 0;
+
+	/* disable ISA interrupts */
+	bridge_ctrl = config_readw(socket, CB_BRIDGE_CONTROL);
+	bridge_ctrl &= ~CB_BRIDGE_INTR;
+	config_writew(socket, CB_BRIDGE_CONTROL, bridge_ctrl);
+
+	if (request_irq(socket->cb_irq, yenta_probe_handler, SA_SHIRQ, "yenta", socket)) {
+		printk(KERN_WARNING "Yenta: request_irq() in yenta_probe_cb_irq() failed!\n");
+		return -1;
+	}
+
+	/* generate interrupt, wait */
+	exca_writeb(socket, I365_CSCINT, I365_CSC_STSCHG);
+	cb_writel(socket, CB_SOCKET_EVENT, -1);
+	cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK);
+	cb_writel(socket, CB_SOCKET_FORCE, CB_FCARDSTS);
+	
+	set_current_state(TASK_UNINTERRUPTIBLE);
+	schedule_timeout(HZ/10);
+
+	/* disable interrupts */
+	cb_writel(socket, CB_SOCKET_MASK, 0);
+	exca_writeb(socket, I365_CSCINT, 0);
+	cb_writel(socket, CB_SOCKET_EVENT, -1);
+	exca_readb(socket, I365_CSC);
+
+	free_irq(socket->cb_irq, socket);
+
+	return (int) socket->probe_status;
+}
+
+
+
 /*
  * Set static data that doesn't need re-initializing..
  */
@@ -997,7 +1063,6 @@ static struct pci_device_id yenta_table 
 	 * data sheets for these devices. --rmk)
 	 */
 	CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1210, TI),
-	CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1251B, TI),
 
 	CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1130, TI113X),
 	CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1131, TI113X),
@@ -1007,11 +1072,14 @@ static struct pci_device_id yenta_table 
 	CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1221, TI12XX),
 	CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1225, TI12XX),
 	CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1251A, TI12XX),
+	CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1251B, TI12XX),
 	CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1420, TI12XX),
 	CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1450, TI12XX),
+	CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1451A, TI12XX),
+	CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1510, TI12XX),
 	CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1520, TI12XX),
 	CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_4410, TI12XX),
-//	CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_4450, TI12XX),
+	CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_4450, TI12XX),
 	CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_4451, TI12XX),
 
 	CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1250, TI1250),
--- diff/drivers/pcmcia/yenta_socket.h	2003-09-17 12:28:09.000000000 +0100
+++ source/drivers/pcmcia/yenta_socket.h	2004-04-21 10:45:34.508457416 +0100
@@ -113,6 +113,9 @@ struct yenta_socket {
 	struct pcmcia_socket socket;
 	struct cardbus_type *type;
 
+	/* for PCI interrupt probing */
+	unsigned int probe_status;
+
 	/* A few words of private data for special stuff of overrides... */
 	unsigned int private[8];
 
--- diff/drivers/pnp/interface.c	2003-07-11 09:39:50.000000000 +0100
+++ source/drivers/pnp/interface.c	2004-04-21 10:45:34.508457416 +0100
@@ -434,7 +434,7 @@ pnp_set_current_resources(struct device 
 		goto done;
 	}
  done:
-	if (retval)
+	if (retval < 0)
 		return retval;
 	return count;
 }
--- diff/drivers/pnp/isapnp/core.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/pnp/isapnp/core.c	2004-04-21 10:45:34.509457264 +0100
@@ -995,7 +995,7 @@ static int isapnp_read_resources(struct 
 			res->port_resource[tmp].flags = IORESOURCE_IO;
 		}
 		for (tmp = 0; tmp < PNP_MAX_MEM; tmp++) {
-			ret = isapnp_read_dword(ISAPNP_CFG_MEM + (tmp << 3));
+			ret = isapnp_read_word(ISAPNP_CFG_MEM + (tmp << 3)) << 8;
 			if (!ret)
 				continue;
 			res->mem_resource[tmp].start = ret;
--- diff/drivers/pnp/manager.c	2004-02-18 08:54:10.000000000 +0000
+++ source/drivers/pnp/manager.c	2004-04-21 10:45:34.510457112 +0100
@@ -452,23 +452,19 @@ int pnp_auto_config_dev(struct pnp_dev *
 
 	if (!dev->dependent) {
 		if (pnp_assign_resources(dev, 0))
-			return 1;
-		else
 			return 0;
+	} else {
+		dep = dev->dependent;
+		do {
+			if (pnp_assign_resources(dev, i))
+				return 0;
+			dep = dep->next;
+			i++;
+		} while (dep);
 	}
 
-	dep = dev->dependent;
-	do {
-		if (pnp_assign_resources(dev, i))
-			return 1;
-
-		/* if this dependent resource failed, try the next one */
-		dep = dep->next;
-		i++;
-	} while (dep);
-
 	pnp_err("Unable to assign resources to device %s.", dev->dev.bus_id);
-	return 0;
+	return -EBUSY;
 }
 
 /**
@@ -486,7 +482,7 @@ int pnp_activate_dev(struct pnp_dev *dev
 	}
 
 	/* ensure resources are allocated */
-	if (!pnp_auto_config_dev(dev))
+	if (pnp_auto_config_dev(dev))
 		return -EBUSY;
 
 	if (!pnp_can_write(dev)) {
--- diff/drivers/pnp/pnpbios/proc.c	2003-09-30 15:46:16.000000000 +0100
+++ source/drivers/pnp/pnpbios/proc.c	2004-04-21 10:45:34.510457112 +0100
@@ -139,7 +139,7 @@ static int proc_read_devices(char *buf, 
 		/* 26 = the number of characters per line sprintf'ed */
 		if ((p - buf + 26) > count)
 			break;
-		if (pnp_bios_get_dev_node(&nodenum, PNPMODE_STATIC, node))
+		if (pnp_bios_get_dev_node(&nodenum, PNPMODE_DYNAMIC, node))
 			break;
 		p += sprintf(p, "%02x\t%08x\t%02x:%02x:%02x\t%04x\n",
 			     node->handle, node->eisa_id,
--- diff/drivers/pnp/pnpbios/rsparser.c	2004-02-18 08:54:10.000000000 +0000
+++ source/drivers/pnp/pnpbios/rsparser.c	2004-04-21 10:45:34.510457112 +0100
@@ -505,6 +505,11 @@ pnpbios_parse_compatible_ids(unsigned ch
 
 		switch (tag) {
 
+		case LARGE_TAG_ANSISTR:
+			strncpy(dev->name, p + 3, len >= PNP_NAME_LEN ? PNP_NAME_LEN - 2 : len);
+			dev->name[len >= PNP_NAME_LEN ? PNP_NAME_LEN - 1 : len] = '\0';
+			break;
+
 		case SMALL_TAG_COMPATDEVID: /* compatible ID */
 			if (len != 4)
 				goto len_err;
--- diff/drivers/s390/Kconfig	2004-03-11 10:20:26.000000000 +0000
+++ source/drivers/s390/Kconfig	2004-04-21 10:45:34.515456352 +0100
@@ -164,3 +164,16 @@ config S390_TAPE_34XX
 	  It is safe to say "Y" here.
 
 endmenu
+
+menu "Cryptographic devices"
+
+config Z90CRYPT
+	tristate "Support for PCI-attached cryptographic adapters"
+        default "m"
+        help
+	  Select this option if you want to use a PCI-attached cryptographic
+	  adapter like the PCI Cryptographic Accelerator (PCICA) or the PCI
+	  Cryptographic Coprocessor (PCICC).  This option is also available
+	  as a module called z90crypt.ko.
+
+endmenu
--- diff/drivers/s390/Makefile	2003-10-09 09:47:34.000000000 +0100
+++ source/drivers/s390/Makefile	2004-04-21 10:45:34.515456352 +0100
@@ -3,6 +3,7 @@
 #
 
 obj-y += s390mach.o sysinfo.o
-obj-y += cio/ block/ char/ net/ scsi/
+obj-y += cio/ block/ char/ crypto/ net/ scsi/
 
 drivers-y += drivers/s390/built-in.o
+
--- diff/drivers/s390/block/dasd_fba.c	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/s390/block/dasd_fba.c	2004-04-21 10:45:34.525454832 +0100
@@ -4,7 +4,7 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
  *
- * $Revision: 1.32 $
+ * $Revision: 1.33 $
  */
 
 #include <linux/config.h>
@@ -205,7 +205,7 @@ dasd_fba_examine_error(struct dasd_ccw_r
 		return dasd_era_none;
 	
 	cdev = device->cdev;
-	switch (cdev->id.dev_model) {
+	switch (cdev->id.dev_type) {
 	case 0x3370:
 		return dasd_3370_erp_examine(cqr, irb);
 	case 0x9336:
--- diff/drivers/s390/block/dcssblk.c	2004-03-11 10:20:26.000000000 +0000
+++ source/drivers/s390/block/dcssblk.c	2004-04-21 10:45:34.534453464 +0100
@@ -548,10 +548,10 @@ dcssblk_remove_store(struct device *dev,
 	dev_info->gd->queue = NULL;
 	put_disk(dev_info->gd);
 	device_unregister(&dev_info->dev);
-	put_device(&dev_info->dev);
 	segment_unload(dev_info->segment_name);
 	PRINT_DEBUG("Segment %s unloaded successfully\n",
 			dev_info->segment_name);
+	put_device(&dev_info->dev);
 	rc = count;
 out_buf:
 	kfree(local_buf);
--- diff/drivers/s390/char/keyboard.c	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/s390/char/keyboard.c	2004-04-21 10:45:34.541452400 +0100
@@ -471,7 +471,7 @@ kbd_ioctl(struct kbd_data *kbd, struct f
 	 * To have permissions to do most of the vt ioctls, we either have
 	 * to be the owner of the tty, or have CAP_SYS_TTY_CONFIG.
 	 */
-	perm = current->tty == kbd->tty || capable(CAP_SYS_TTY_CONFIG);
+	perm = current->signal->tty == kbd->tty || capable(CAP_SYS_TTY_CONFIG);
 	switch (cmd) {
 	case KDGKBTYPE:
 		return put_user(KB_101, (char*) arg);
--- diff/drivers/s390/char/tape_34xx.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/s390/char/tape_34xx.c	2004-04-21 10:45:34.546451640 +0100
@@ -113,6 +113,7 @@ tape_34xx_work_handler(void *data)
 	switch(p->op) {
 		case TO_MSEN:
 			tape_34xx_medium_sense(p->device);
+			break;
 		default:
 			DBF_EVENT(3, "T34XX: internal error: unknown work\n");
 	}
@@ -1342,7 +1343,7 @@ tape_34xx_init (void)
 {
 	int rc;
 
-	DBF_EVENT(3, "34xx init: $Revision: 1.19 $\n");
+	DBF_EVENT(3, "34xx init: $Revision: 1.20 $\n");
 	/* Register driver for 3480/3490 tapes. */
 	rc = ccw_driver_register(&tape_34xx_driver);
 	if (rc)
@@ -1361,7 +1362,7 @@ tape_34xx_exit(void)
 MODULE_DEVICE_TABLE(ccw, tape_34xx_ids);
 MODULE_AUTHOR("(C) 2001-2002 IBM Deutschland Entwicklung GmbH");
 MODULE_DESCRIPTION("Linux on zSeries channel attached 3480 tape "
-		   "device driver ($Revision: 1.19 $)");
+		   "device driver ($Revision: 1.20 $)");
 MODULE_LICENSE("GPL");
 
 module_init(tape_34xx_init);
--- diff/drivers/s390/char/tape_class.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/s390/char/tape_class.c	2004-04-21 10:45:34.546451640 +0100
@@ -1,6 +1,6 @@
 /*
  * (C) Copyright IBM Corp. 2004
- * tape_class.c ($Revision: 1.6 $)
+ * tape_class.c ($Revision: 1.8 $)
  *
  * Tape class device support
  *
@@ -12,7 +12,7 @@
 MODULE_AUTHOR("Stefan Bader <shbader@de.ibm.com>");
 MODULE_DESCRIPTION(
 	"(C) Copyright IBM Corp. 2004   All Rights Reserved.\n"
-	"tape_class.c ($Revision: 1.6 $)"
+	"tape_class.c ($Revision: 1.8 $)"
 );
 MODULE_LICENSE("GPL");
 
@@ -85,7 +85,7 @@ struct tape_class_device *register_tape_
 	return tcd;
 
 fail_with_cdev:
-	cdev_del(&tcd->char_device);
+	cdev_del(tcd->char_device);
 
 fail_with_tcd:
 	kfree(tcd);
--- diff/drivers/s390/char/tape_core.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/s390/char/tape_core.c	2004-04-21 10:45:34.548451336 +0100
@@ -377,6 +377,16 @@ out:
 	return rc;
 }
 
+static inline void
+tape_cleanup_device(struct tape_device *device)
+{
+	tapeblock_cleanup_device(device);
+	tapechar_cleanup_device(device);
+	device->discipline->cleanup_device(device);
+	tape_remove_minor(device);
+	tape_med_state_set(device, MS_UNKNOWN);
+}
+
 /*
  * Set device offline.
  *
@@ -399,12 +409,13 @@ tape_generic_offline(struct tape_device 
 	switch (device->tape_state) {
 		case TS_INIT:
 		case TS_NOT_OPER:
+			spin_unlock_irq(get_ccwdev_lock(device->cdev));
 			break;
 		case TS_UNUSED:
-			tapeblock_cleanup_device(device);
-			tapechar_cleanup_device(device);
-			device->discipline->cleanup_device(device);
-			tape_remove_minor(device);
+			tape_state_set(device, TS_INIT);
+			spin_unlock_irq(get_ccwdev_lock(device->cdev));
+			tape_cleanup_device(device);
+			break;
 		default:
 			DBF_EVENT(3, "(%08x): Set offline failed "
 				"- drive in use.\n",
@@ -415,9 +426,6 @@ tape_generic_offline(struct tape_device 
 			spin_unlock_irq(get_ccwdev_lock(device->cdev));
 			return -EBUSY;
 	}
-	spin_unlock_irq(get_ccwdev_lock(device->cdev));
-
-	tape_med_state_set(device, MS_UNKNOWN);
 
 	DBF_LH(3, "(%08x): Drive set offline.\n", device->cdev_id);
 	return 0;
@@ -543,26 +551,12 @@ tape_generic_probe(struct ccw_device *cd
 	return 0;
 }
 
-/*
- * Driverfs tape remove function.
- *
- * This function is called whenever the common I/O layer detects the device
- * gone. This can happen at any time and we cannot refuse.
- */
-void
-tape_generic_remove(struct ccw_device *cdev)
+static inline void
+__tape_discard_requests(struct tape_device *device)
 {
-	struct tape_device *	device;
 	struct tape_request *	request;
 	struct list_head *	l, *n;
 
-	device = cdev->dev.driver_data;
-	DBF_LH(3, "(%08x): tape_generic_remove(%p)\n", device->cdev_id, cdev);
-
-	/*
-	 * No more requests may be processed. So just post them as i/o errors.
-	 */
-	spin_lock_irq(get_ccwdev_lock(device->cdev));
 	list_for_each_safe(l, n, &device->req_queue) {
 		request = list_entry(l, struct tape_request, list);
 		if (request->status == TAPE_REQUEST_IN_IO)
@@ -575,28 +569,66 @@ tape_generic_remove(struct ccw_device *c
 		if (request->callback != NULL)
 			request->callback(request, request->callback_data);
 	}
+}
 
-	if (device->tape_state != TS_UNUSED && device->tape_state != TS_INIT) {
-		DBF_EVENT(3, "(%08x): Drive in use vanished!\n",
-			device->cdev_id);
-		PRINT_WARN("(%s): Drive in use vanished - expect trouble!\n",
-			device->cdev->dev.bus_id);
-		PRINT_WARN("State was %i\n", device->tape_state);
-		device->tape_state = TS_NOT_OPER;
-		tapeblock_cleanup_device(device);
-		tapechar_cleanup_device(device);
-		device->discipline->cleanup_device(device);
-		tape_remove_minor(device);
+/*
+ * Driverfs tape remove function.
+ *
+ * This function is called whenever the common I/O layer detects the device
+ * gone. This can happen at any time and we cannot refuse.
+ */
+void
+tape_generic_remove(struct ccw_device *cdev)
+{
+	struct tape_device *	device;
+
+	device = cdev->dev.driver_data;
+	if (!device) {
+		PRINT_ERR("No device pointer in tape_generic_remove!\n");
+		return;
+	}
+	DBF_LH(3, "(%08x): tape_generic_remove(%p)\n", device->cdev_id, cdev);
+
+	spin_lock_irq(get_ccwdev_lock(device->cdev));
+	switch (device->tape_state) {
+		case TS_INIT:
+			tape_state_set(device, TS_NOT_OPER);
+		case TS_NOT_OPER:
+			/*
+			 * Nothing to do.
+			 */
+			spin_unlock_irq(get_ccwdev_lock(device->cdev));
+			break;
+		case TS_UNUSED:
+			/*
+			 * Need only to release the device.
+			 */
+			tape_state_set(device, TS_NOT_OPER);
+			spin_unlock_irq(get_ccwdev_lock(device->cdev));
+			tape_cleanup_device(device);
+			break;
+		default:
+			/*
+			 * There may be requests on the queue. We will not get
+			 * an interrupt for a request that was running. So we
+			 * just post them all as I/O errors.
+			 */
+			DBF_EVENT(3, "(%08x): Drive in use vanished!\n",
+				device->cdev_id);
+			PRINT_WARN("(%s): Drive in use vanished - "
+				"expect trouble!\n",
+				device->cdev->dev.bus_id);
+			PRINT_WARN("State was %i\n", device->tape_state);
+			tape_state_set(device, TS_NOT_OPER);
+			__tape_discard_requests(device);
+			spin_unlock_irq(get_ccwdev_lock(device->cdev));
+			tape_cleanup_device(device);
 	}
-	device->tape_state = TS_NOT_OPER;
-	tape_med_state_set(device, MS_UNKNOWN);
-	spin_unlock_irq(get_ccwdev_lock(device->cdev));
 
 	if (cdev->dev.driver_data != NULL) {
 		sysfs_remove_group(&cdev->dev.kobj, &tape_attr_group);
 		cdev->dev.driver_data = tape_put_device(cdev->dev.driver_data);
 	}
-
 }
 
 /*
@@ -1149,7 +1181,7 @@ tape_init (void)
 #ifdef DBF_LIKE_HELL
 	debug_set_level(tape_dbf_area, 6);
 #endif
-	DBF_EVENT(3, "tape init: ($Revision: 1.48 $)\n");
+	DBF_EVENT(3, "tape init: ($Revision: 1.49 $)\n");
 	tape_proc_init();
 	tapechar_init ();
 	tapeblock_init ();
@@ -1174,7 +1206,7 @@ tape_exit(void)
 MODULE_AUTHOR("(C) 2001 IBM Deutschland Entwicklung GmbH by Carsten Otte and "
 	      "Michael Holzheu (cotte@de.ibm.com,holzheu@de.ibm.com)");
 MODULE_DESCRIPTION("Linux on zSeries channel attached "
-		   "tape device driver ($Revision: 1.48 $)");
+		   "tape device driver ($Revision: 1.49 $)");
 MODULE_LICENSE("GPL");
 
 module_init(tape_init);
--- diff/drivers/s390/cio/ccwgroup.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/s390/cio/ccwgroup.c	2004-04-21 10:45:34.558449816 +0100
@@ -1,7 +1,7 @@
 /*
  *  drivers/s390/cio/ccwgroup.c
  *  bus driver for ccwgroup
- *   $Revision: 1.25 $
+ *   $Revision: 1.27 $
  *
  *    Copyright (C) 2002 IBM Deutschland Entwicklung GmbH,
  *                       IBM Corporation
@@ -397,9 +397,35 @@ ccwgroup_driver_register (struct ccwgrou
 	return driver_register(&cdriver->driver);
 }
 
+static inline struct device *
+__get_next_ccwgroup_device(struct device_driver *drv)
+{
+	struct device *dev, *d;
+
+	down_read(&drv->bus->subsys.rwsem);
+	dev = NULL;
+	list_for_each_entry(d, &drv->devices, driver_list) {
+		dev = get_device(d);
+		if (dev)
+			break;
+	}
+	up_read(&drv->bus->subsys.rwsem);
+	return dev;
+}
+
 void
 ccwgroup_driver_unregister (struct ccwgroup_driver *cdriver)
 {
+	struct device *dev;
+
+	/* We don't want ccwgroup devices to live longer than their driver. */
+	get_driver(&cdriver->driver);
+	while ((dev = __get_next_ccwgroup_device(&cdriver->driver))) {
+		__ccwgroup_remove_symlinks(to_ccwgroupdev(dev));
+		device_unregister(dev);
+		put_device(dev);
+	};
+	put_driver(&cdriver->driver);
 	driver_unregister(&cdriver->driver);
 }
 
@@ -416,8 +442,11 @@ __ccwgroup_get_gdev_by_cdev(struct ccw_d
 
 	if (cdev->dev.driver_data) {
 		gdev = (struct ccwgroup_device *)cdev->dev.driver_data;
-		if (get_device(&gdev->dev))
-			return gdev;
+		if (get_device(&gdev->dev)) {
+			if (!list_empty(&gdev->dev.node))
+				return gdev;
+			put_device(&gdev->dev);
+		}
 		return NULL;
 	}
 	return NULL;
--- diff/drivers/s390/cio/chsc.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/s390/cio/chsc.c	2004-04-21 10:45:34.559449664 +0100
@@ -1,7 +1,7 @@
 /*
  *  drivers/s390/cio/chsc.c
  *   S/390 common I/O routines -- channel subsystem call
- *   $Revision: 1.105 $
+ *   $Revision: 1.107 $
  *
  *    Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH,
  *			      IBM Corporation
@@ -819,8 +819,10 @@ s390_vary_chpid( __u8 chpid, int on)
 		struct schib schib;
 
 		sch = get_subchannel_by_schid(irq);
-		if (sch)
+		if (sch) {
+			put_device(&sch->dev);
 			continue;
+		}
 		if (stsch(irq, &schib))
 			/* We're through */
 			break;
--- diff/drivers/s390/cio/css.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/s390/cio/css.c	2004-04-21 10:45:34.560449512 +0100
@@ -1,7 +1,7 @@
 /*
  *  drivers/s390/cio/css.c
  *  driver for channel subsystem
- *   $Revision: 1.69 $
+ *   $Revision: 1.72 $
  *
  *    Copyright (C) 2002 IBM Deutschland Entwicklung GmbH,
  *			 IBM Corporation
@@ -163,11 +163,6 @@ get_subchannel_by_schid(int irq)
 					      struct device, bus_list));
 		if (!dev)
 			continue;
-		/* Skip channel paths. */
-		if (dev->release != &css_subchannel_release) {
-			put_device(dev);
-			continue;
-		}
 		sch = to_subchannel(dev);
 		if (sch->irq == irq)
 			break;
@@ -206,10 +201,16 @@ css_evaluate_subchannel(int irq, int slo
 
 	sch = get_subchannel_by_schid(irq);
 	disc = sch ? device_is_disconnected(sch) : 0;
-	if (disc && slow)
+	if (disc && slow) {
+		if (sch)
+			put_device(&sch->dev);
 		return 0; /* Already processed. */
-	if (!disc && !slow)
+	}
+	if (!disc && !slow) {
+		if (sch)
+			put_device(&sch->dev);
 		return -EAGAIN; /* Will be done on the slow path. */
+	}
 	event = css_get_subchannel_status(sch, irq);
 	switch (event) {
 	case CIO_GONE:
--- diff/drivers/s390/cio/device.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/s390/cio/device.c	2004-04-21 10:45:34.561449360 +0100
@@ -1,7 +1,7 @@
 /*
  *  drivers/s390/cio/device.c
  *  bus driver for ccw devices
- *   $Revision: 1.110 $
+ *   $Revision: 1.113 $
  *
  *    Copyright (C) 2002 IBM Deutschland Entwicklung GmbH,
  *			 IBM Corporation
@@ -120,6 +120,7 @@ void io_subchannel_irq (struct device *)
 static int io_subchannel_notify(struct device *, int);
 static void io_subchannel_verify(struct device *);
 static void io_subchannel_ioterm(struct device *);
+static void io_subchannel_shutdown(struct device *);
 
 struct css_driver io_subchannel_driver = {
 	.subchannel_type = SUBCHANNEL_TYPE_IO,
@@ -128,6 +129,7 @@ struct css_driver io_subchannel_driver =
 		.bus  = &css_bus_type,
 		.probe = &io_subchannel_probe,
 		.remove = &io_subchannel_remove,
+		.shutdown = &io_subchannel_shutdown,
 	},
 	.irq = io_subchannel_irq,
 	.notify = io_subchannel_notify,
@@ -766,6 +768,37 @@ io_subchannel_ioterm(struct device *dev)
 			      ERR_PTR(-EIO));
 }
 
+static void
+io_subchannel_shutdown(struct device *dev)
+{
+	struct subchannel *sch;
+	struct ccw_device *cdev;
+	int ret;
+
+	sch = to_subchannel(dev);
+	cdev = dev->driver_data;
+
+	if (cio_is_console(sch->irq))
+		return;
+	if (!sch->schib.pmcw.ena)
+		/* Nothing to do. */
+		return;
+	ret = cio_disable_subchannel(sch);
+	if (ret != -EBUSY)
+		/* Subchannel is disabled, we're done. */
+		return;
+	cdev->private->state = DEV_STATE_QUIESCE;
+	if (cdev->handler)
+		cdev->handler(cdev, cdev->private->intparm,
+			      ERR_PTR(-EIO));
+	ret = ccw_device_cancel_halt_clear(cdev);
+	if (ret == -EBUSY) {
+		ccw_device_set_timeout(cdev, HZ/10);
+		wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev));
+	}
+	cio_disable_subchannel(sch);
+}
+
 #ifdef CONFIG_CCW_CONSOLE
 static struct ccw_device console_cdev;
 static struct ccw_device_private console_private;
--- diff/drivers/s390/cio/device.h	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/s390/cio/device.h	2004-04-21 10:45:34.562449208 +0100
@@ -18,6 +18,7 @@ enum dev_state {
 	DEV_STATE_CLEAR_VERIFY,
 	DEV_STATE_TIMEOUT_KILL,
 	DEV_STATE_WAIT4IO,
+	DEV_STATE_QUIESCE,
 	/* special states for devices gone not operational */
 	DEV_STATE_DISCONNECTED,
 	DEV_STATE_DISCONNECTED_SENSE_ID,
@@ -68,6 +69,8 @@ extern struct workqueue_struct *ccw_devi
 
 void io_subchannel_recog_done(struct ccw_device *cdev);
 
+int ccw_device_cancel_halt_clear(struct ccw_device *);
+
 int ccw_device_register(struct ccw_device *);
 void ccw_device_do_unreg_rereg(void *);
 
--- diff/drivers/s390/cio/device_fsm.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/s390/cio/device_fsm.c	2004-04-21 10:45:34.566448600 +0100
@@ -101,7 +101,7 @@ ccw_device_set_timeout(struct ccw_device
  * -EBUSY if an interrupt is expected (either from halt/clear or from a
  * status pending).
  */
-static int
+int
 ccw_device_cancel_halt_clear(struct ccw_device *cdev)
 {
 	struct subchannel *sch;
@@ -438,10 +438,13 @@ ccw_device_nopath_notify(void *data)
 	ret = (sch->driver && sch->driver->notify) ?
 		sch->driver->notify(&sch->dev, CIO_NO_PATH) : 0;
 	if (!ret) {
-		/* Driver doesn't want to keep device. */
-		device_unregister(&sch->dev);
-		sch->schib.pmcw.intparm = 0;
-		cio_modify(sch);
+		if (get_device(&sch->dev)) {
+			/* Driver doesn't want to keep device. */
+			device_unregister(&sch->dev);
+			sch->schib.pmcw.intparm = 0;
+			cio_modify(sch);
+			put_device(&sch->dev);
+		}
 	} else {
 		ccw_device_set_timeout(cdev, 0);
 		cdev->private->state = DEV_STATE_DISCONNECTED;
@@ -710,9 +713,17 @@ ccw_device_online_timeout(struct ccw_dev
 		cdev->private->state = DEV_STATE_TIMEOUT_KILL;
 		return;
 	}
-	if (ret == -ENODEV)
-		dev_fsm_event(cdev, DEV_EVENT_NOTOPER);
-	else if (cdev->handler)
+	if (ret == -ENODEV) {
+		struct subchannel *sch;
+
+		sch = to_subchannel(cdev->dev.parent);
+		if (!sch->lpm) {
+			PREPARE_WORK(&cdev->private->kick_work,
+				     ccw_device_nopath_notify, (void *)cdev);
+			queue_work(ccw_device_work, &cdev->private->kick_work);
+		} else
+			dev_fsm_event(cdev, DEV_EVENT_NOTOPER);
+	} else if (cdev->handler)
 		cdev->handler(cdev, cdev->private->intparm,
 			      ERR_PTR(-ETIMEDOUT));
 }
@@ -808,8 +819,8 @@ ccw_device_killing_timeout(struct ccw_de
 			PREPARE_WORK(&cdev->private->kick_work,
 				     ccw_device_nopath_notify, (void *)cdev);
 			queue_work(ccw_device_work, &cdev->private->kick_work);
-		}
-		dev_fsm_event(cdev, DEV_EVENT_NOTOPER);
+		} else
+			dev_fsm_event(cdev, DEV_EVENT_NOTOPER);
 		return;
 	}
 	//FIXME: Can we get here?
@@ -868,6 +879,7 @@ ccw_device_wait4io_timeout(struct ccw_de
 	int ret;
 	struct subchannel *sch;
 
+	sch = to_subchannel(cdev->dev.parent);
 	ccw_device_set_timeout(cdev, 0);
 	ret = ccw_device_cancel_halt_clear(cdev);
 	if (ret == -EBUSY) {
@@ -876,16 +888,17 @@ ccw_device_wait4io_timeout(struct ccw_de
 		return;
 	}
 	if (ret == -ENODEV) {
-		PREPARE_WORK(&cdev->private->kick_work,
-			     ccw_device_nopath_notify, (void *)cdev);
-		queue_work(ccw_device_work, &cdev->private->kick_work);
-		dev_fsm_event(cdev, DEV_EVENT_NOTOPER);
+		if (!sch->lpm) {
+			PREPARE_WORK(&cdev->private->kick_work,
+				     ccw_device_nopath_notify, (void *)cdev);
+			queue_work(ccw_device_work, &cdev->private->kick_work);
+		} else
+			dev_fsm_event(cdev, DEV_EVENT_NOTOPER);
 		return;
 	}
 	if (cdev->handler)
 		cdev->handler(cdev, cdev->private->intparm,
 			      ERR_PTR(-ETIMEDOUT));
-	sch = to_subchannel(cdev->dev.parent);
 	if (!sch->lpm) {
 		PREPARE_WORK(&cdev->private->kick_work,
 			     ccw_device_nopath_notify, (void *)cdev);
@@ -1005,6 +1018,37 @@ ccw_device_change_cmfstate(struct ccw_de
 }
 
 
+static void
+ccw_device_quiesce_done(struct ccw_device *cdev, enum dev_event dev_event)
+{
+	ccw_device_set_timeout(cdev, 0);
+	if (dev_event == DEV_EVENT_NOTOPER)
+		cdev->private->state = DEV_STATE_NOT_OPER;
+	else
+		cdev->private->state = DEV_STATE_OFFLINE;
+	wake_up(&cdev->private->wait_q);
+}
+
+static void
+ccw_device_quiesce_timeout(struct ccw_device *cdev, enum dev_event dev_event)
+{
+	int ret;
+
+	ret = ccw_device_cancel_halt_clear(cdev);
+	switch (ret) {
+	case 0:
+		cdev->private->state = DEV_STATE_OFFLINE;
+		wake_up(&cdev->private->wait_q);
+		break;
+	case -ENODEV:
+		cdev->private->state = DEV_STATE_NOT_OPER;
+		wake_up(&cdev->private->wait_q);
+		break;
+	default:
+		ccw_device_set_timeout(cdev, HZ/10);
+	}
+}
+
 /*
  * No operation action. This is used e.g. to ignore a timeout event in
  * state offline.
@@ -1102,6 +1146,12 @@ fsm_func_t *dev_jumptable[NR_DEV_STATES]
 		[DEV_EVENT_TIMEOUT]	ccw_device_wait4io_timeout,
 		[DEV_EVENT_VERIFY]	ccw_device_wait4io_verify,
 	},
+	[DEV_STATE_QUIESCE] {
+		[DEV_EVENT_NOTOPER]	ccw_device_quiesce_done,
+		[DEV_EVENT_INTERRUPT]	ccw_device_quiesce_done,
+		[DEV_EVENT_TIMEOUT]	ccw_device_quiesce_timeout,
+		[DEV_EVENT_VERIFY]	ccw_device_nop,
+	},
 	/* special states for devices gone not operational */
 	[DEV_STATE_DISCONNECTED] {
 		[DEV_EVENT_NOTOPER]	ccw_device_nop,
--- diff/drivers/s390/cio/qdio.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/s390/cio/qdio.c	2004-04-21 10:45:34.572447688 +0100
@@ -56,7 +56,7 @@
 #include "ioasm.h"
 #include "chsc.h"
 
-#define VERSION_QDIO_C "$Revision: 1.78 $"
+#define VERSION_QDIO_C "$Revision: 1.79 $"
 
 /****************** MODULE PARAMETER VARIABLES ********************/
 MODULE_AUTHOR("Utz Bacher <utz.bacher@de.ibm.com>");
@@ -392,6 +392,11 @@ qdio_unmark_q(struct qdio_q *q)
 	if ((q->is_thinint_q)&&(q->is_input_q)) {
 		/* iQDIO */
 		spin_lock_irqsave(&ttiq_list_lock,flags);
+		/* in case cleanup has done this already and simultanously
+		 * qdio_unmark_q is called from the interrupt handler, we've
+		 * got to check this in this specific case again */
+		if ((!q->list_prev)||(!q->list_next))
+			goto out;
 		if (q->list_next==q) {
 			/* q was the only interesting q */
 			tiq_list=NULL;
@@ -404,6 +409,7 @@ qdio_unmark_q(struct qdio_q *q)
 			q->list_next=NULL;
 			q->list_prev=NULL;
 		}
+out:
 		spin_unlock_irqrestore(&ttiq_list_lock,flags);
 	}
 }
--- diff/drivers/s390/net/Kconfig	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/s390/net/Kconfig	2004-04-21 10:45:34.581446320 +0100
@@ -63,7 +63,7 @@ config QETH
 	  <http://www10.software.ibm.com/developerworks/opensource/linux390>
 
 	  To compile this driver as a module, choose M here: the
-	  module will be called qeth.
+	  module will be called qeth.ko.
 
 
 comment "Gigabit Ethernet default settings"
--- diff/drivers/s390/net/Makefile	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/s390/net/Makefile	2004-04-21 10:45:34.581446320 +0100
@@ -9,6 +9,6 @@ obj-$(CONFIG_NETIUCV) += netiucv.o fsm.o
 obj-$(CONFIG_SMSGIUCV) += smsgiucv.o
 obj-$(CONFIG_CTC) += ctc.o fsm.o cu3088.o
 obj-$(CONFIG_LCS) += lcs.o cu3088.o
-qeth_mod-objs := qeth.o qeth_mpc.o
-obj-$(CONFIG_QETH) += qeth_mod.o
-
+qeth-y := qeth_main.o qeth_mpc.o qeth_sys.o
+qeth-$(CONFIG_PROC_FS) += qeth_proc.o
+obj-$(CONFIG_QETH) += qeth.o
--- diff/drivers/s390/net/ctctty.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/s390/net/ctctty.c	2004-04-21 10:45:34.589445104 +0100
@@ -1,5 +1,5 @@
 /*
- * $Id: ctctty.c,v 1.16 2004/02/05 12:39:55 felfert Exp $
+ * $Id: ctctty.c,v 1.17 2004/03/31 17:06:34 ptiedem Exp $
  *
  * CTC / ESCON network driver, tty interface.
  *
@@ -1232,7 +1232,7 @@ ctc_tty_cleanup(void) {
 	ctc_tty_shuttingdown = 1;
 	spin_unlock_irqrestore(&ctc_tty_lock, saveflags);
 	tty_unregister_driver(driver->ctc_tty_device);
-	kfree(driver);
 	put_tty_driver(driver->ctc_tty_device);
+	kfree(driver);
 	driver = NULL;
 }
--- diff/drivers/s390/net/lcs.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/s390/net/lcs.c	2004-04-21 10:45:34.600443432 +0100
@@ -11,7 +11,7 @@
  *			  Frank Pavlic (pavlic@de.ibm.com) and
  *		 	  Martin Schwidefsky <schwidefsky@de.ibm.com>
  *
- *    $Revision: 1.72 $	 $Date: 2004/03/22 09:34:27 $
+ *    $Revision: 1.74 $	 $Date: 2004/04/05 00:01:04 $
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -58,7 +58,7 @@
 /**
  * initialization string for output
  */
-#define VERSION_LCS_C  "$Revision: 1.72 $"
+#define VERSION_LCS_C  "$Revision: 1.74 $"
 
 static char version[] __initdata = "LCS driver ("VERSION_LCS_C "/" VERSION_LCS_H ")";
 static char debug_buffer[255];
@@ -206,6 +206,9 @@ lcs_alloc_card(void)
 		return NULL;
 	}
 
+#ifdef CONFIG_IP_MULTICAST
+	INIT_LIST_HEAD(&card->ipm_list);
+#endif
 	LCS_DBF_HEX(2, setup, &card, sizeof(void*));
 	return card;
 }
@@ -1967,7 +1970,8 @@ lcs_remove_device(struct ccwgroup_device
 	if (ccwgdev->state == CCWGROUP_ONLINE) {
 		lcs_shutdown_device(ccwgdev);
 	}
-	unregister_netdev(card->dev);
+	if (card->dev)
+		unregister_netdev(card->dev);
 	sysfs_remove_group(&ccwgdev->dev.kobj, &lcs_attr_group);
 	lcs_cleanup_card(card);
 	lcs_free_card(card);
--- diff/drivers/s390/net/netiucv.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/s390/net/netiucv.c	2004-04-21 10:45:34.603442976 +0100
@@ -1,5 +1,5 @@
 /*
- * $Id: netiucv.c,v 1.47 2004/03/22 07:41:42 braunu Exp $
+ * $Id: netiucv.c,v 1.48 2004/04/01 13:42:09 braunu Exp $
  *
  * IUCV network driver
  *
@@ -30,7 +30,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * RELEASE-TAG: IUCV network driver $Revision: 1.47 $
+ * RELEASE-TAG: IUCV network driver $Revision: 1.48 $
  *
  */
 
@@ -100,7 +100,6 @@ struct iucv_connection {
 	int                       max_buffsize;
 	int                       flags;
 	fsm_timer                 timer;
-	int                       retry;
 	fsm_instance              *fsm;
 	struct net_device         *netdev;
 	struct connection_profile prof;
@@ -169,8 +168,6 @@ static __inline__ int netiucv_test_and_s
 	return test_and_set_bit(0, &((struct netiucv_priv *)dev->priv)->tbusy);
 }
 
-#define SET_DEVICE_START(device, value)
-
 static __u8 iucv_host[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
 static __u8 iucvMagic[16] = {
 	0xF0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
@@ -217,7 +214,6 @@ enum dev_states {
 	DEV_STATE_STARTWAIT,
 	DEV_STATE_STOPWAIT,
 	DEV_STATE_RUNNING,
-	DEV_STATE_STARTRETRY,
 	/**
 	 * MUST be always the last element!!
 	 */
@@ -229,7 +225,6 @@ static const char *dev_state_names[] = {
 	"StartWait",
 	"StopWait",
 	"Running",
-	"StartRetry",
 };
 
 /**
@@ -599,7 +594,6 @@ conn_action_txdone(fsm_instance *fi, int
 
 	pr_debug("%s() called\n", __FUNCTION__);
 
-	fsm_deltimer(&conn->timer);
 	if (conn && conn->netdev && conn->netdev->priv)
 		privptr = (struct netiucv_priv *)conn->netdev->priv;
 	conn->prof.tx_pending--;
@@ -639,8 +633,6 @@ conn_action_txdone(fsm_instance *fi, int
 		memcpy(skb_put(conn->tx_buff, NETIUCV_HDRLEN), &header,
 		       NETIUCV_HDRLEN);
 
-		fsm_addtimer(&conn->timer, NETIUCV_TIMEOUT_5SEC,
-			     CONN_EVENT_TIMER, conn);
 		conn->prof.send_stamp = xtime;
 		rc = iucv_send(conn->pathid, NULL, 0, 0, 0, 0,
 			       conn->tx_buff->data, conn->tx_buff->len);
@@ -650,7 +642,6 @@ conn_action_txdone(fsm_instance *fi, int
 		if (conn->prof.tx_pending > conn->prof.tx_max_pending)
 			conn->prof.tx_max_pending = conn->prof.tx_pending;
 		if (rc != 0) {
-			fsm_deltimer(&conn->timer);
 			conn->prof.tx_pending--;
 			fsm_newstate(fi, CONN_STATE_IDLE);
 			if (privptr)
@@ -721,6 +712,7 @@ conn_action_connack(fsm_instance *fi, in
 
 	pr_debug("%s() called\n", __FUNCTION__);
 
+	fsm_deltimer(&conn->timer);
 	fsm_newstate(fi, CONN_STATE_IDLE);
 	conn->pathid = eib->ippathid;
 	netdev->tx_queue_len = eib->ipmsglim;
@@ -728,35 +720,35 @@ conn_action_connack(fsm_instance *fi, in
 }
 
 static void
+conn_action_conntimsev(fsm_instance *fi, int event, void *arg)
+{
+	struct iucv_connection *conn = (struct iucv_connection *)arg;
+	__u8 udata[16];
+
+	pr_debug("%s() called\n", __FUNCTION__);
+
+	fsm_deltimer(&conn->timer);
+	iucv_sever(conn->pathid, udata);
+	fsm_newstate(fi, CONN_STATE_STARTWAIT);
+}
+
+static void
 conn_action_connsever(fsm_instance *fi, int event, void *arg)
 {
 	struct iucv_event *ev = (struct iucv_event *)arg;
 	struct iucv_connection *conn = ev->conn;
-	// iucv_ConnectionSevered *eib = (iucv_ConnectionSevered *)ev->data;
 	struct net_device *netdev = conn->netdev;
 	struct netiucv_priv *privptr = (struct netiucv_priv *)netdev->priv;
-	int state = fsm_getstate(fi);
+	__u8 udata[16];
 
 	pr_debug("%s() called\n", __FUNCTION__);
 
-	switch (state) {
-		case CONN_STATE_SETUPWAIT:
-			printk(KERN_INFO "%s: Remote dropped connection\n",
-			       netdev->name);
-			fsm_newstate(fi, CONN_STATE_STOPPED);
-			fsm_event(privptr->fsm, DEV_EVENT_CONDOWN, netdev);
-			break;
-		case CONN_STATE_IDLE:
-		case CONN_STATE_TX:
-			printk(KERN_INFO "%s: Remote dropped connection\n",
-			       netdev->name);
-			if (conn->handle)
-				iucv_unregister_program(conn->handle);
-			conn->handle = 0;
-			fsm_newstate(fi, CONN_STATE_STOPPED);
-			fsm_event(privptr->fsm, DEV_EVENT_CONDOWN, netdev);
-			break;
-	}
+	fsm_deltimer(&conn->timer);
+	iucv_sever(conn->pathid, udata);
+	printk(KERN_INFO "%s: Remote dropped connection\n",
+	       netdev->name);
+	fsm_newstate(fi, CONN_STATE_STARTWAIT);
+	fsm_event(privptr->fsm, DEV_EVENT_CONDOWN, netdev);
 }
 
 static void
@@ -798,6 +790,8 @@ conn_action_start(fsm_instance *fi, int 
 	switch (rc) {
 		case 0:
 			conn->netdev->tx_queue_len = msglimit;
+			fsm_addtimer(&conn->timer, NETIUCV_TIMEOUT_5SEC,
+				CONN_EVENT_TIMER, conn);
 			return;
 		case 11:
 			printk(KERN_NOTICE
@@ -864,6 +858,7 @@ conn_action_stop(fsm_instance *fi, int e
 
 	pr_debug("%s() called\n", __FUNCTION__);
 
+	fsm_deltimer(&conn->timer);
 	fsm_newstate(fi, CONN_STATE_STOPPED);
 	netiucv_purge_skb_queue(&conn->collect_queue);
 	if (conn->handle)
@@ -888,7 +883,6 @@ conn_action_inval(fsm_instance *fi, int 
 static const fsm_node conn_fsm[] = {
 	{ CONN_STATE_INVALID,   CONN_EVENT_START,    conn_action_inval      },
 	{ CONN_STATE_STOPPED,   CONN_EVENT_START,    conn_action_start      },
-	{ CONN_STATE_STARTWAIT, CONN_EVENT_START,    conn_action_start      },
 
 	{ CONN_STATE_STOPPED,   CONN_EVENT_STOP,     conn_action_stop       },
 	{ CONN_STATE_STARTWAIT, CONN_EVENT_STOP,     conn_action_stop       },
@@ -905,6 +899,7 @@ static const fsm_node conn_fsm[] = {
 	{ CONN_STATE_TX,        CONN_EVENT_CONN_REQ, conn_action_connreject },
 
 	{ CONN_STATE_SETUPWAIT, CONN_EVENT_CONN_ACK, conn_action_connack    },
+	{ CONN_STATE_SETUPWAIT, CONN_EVENT_TIMER,    conn_action_conntimsev },
 
 	{ CONN_STATE_SETUPWAIT, CONN_EVENT_CONN_REJ, conn_action_connsever  },
 	{ CONN_STATE_IDLE,      CONN_EVENT_CONN_REJ, conn_action_connsever  },
@@ -940,7 +935,6 @@ dev_action_start(fsm_instance *fi, int e
 
 	pr_debug("%s() called\n", __FUNCTION__);
 
-	fsm_deltimer(&privptr->timer);
 	ev.conn = privptr->conn;
 	fsm_newstate(fi, DEV_STATE_STARTWAIT);
 	fsm_event(privptr->conn->fsm, CONN_EVENT_START, &ev);
@@ -964,7 +958,6 @@ dev_action_stop(fsm_instance *fi, int ev
 
 	ev.conn = privptr->conn;
 
-	fsm_deltimer(&privptr->timer);
 	fsm_newstate(fi, DEV_STATE_STOPWAIT);
 	fsm_event(privptr->conn->fsm, CONN_EVENT_STOP, &ev);
 }
@@ -981,13 +974,10 @@ static void
 dev_action_connup(fsm_instance *fi, int event, void *arg)
 {
 	struct net_device   *dev = (struct net_device *)arg;
-	struct netiucv_priv *privptr = dev->priv;
 
 	pr_debug("%s() called\n", __FUNCTION__);
 
 	switch (fsm_getstate(fi)) {
-		case DEV_STATE_STARTRETRY:
-			fsm_deltimer(&privptr->timer);
 		case DEV_STATE_STARTWAIT:
 			fsm_newstate(fi, DEV_STATE_RUNNING);
 			printk(KERN_INFO
@@ -1013,22 +1003,11 @@ dev_action_connup(fsm_instance *fi, int 
 static void
 dev_action_conndown(fsm_instance *fi, int event, void *arg)
 {
-	struct net_device   *dev = (struct net_device *)arg;
-	struct netiucv_priv *privptr = dev->priv;
-	struct iucv_event   ev;
-
 	pr_debug("%s() called\n", __FUNCTION__);
 
 	switch (fsm_getstate(fi)) {
 		case DEV_STATE_RUNNING:
 			fsm_newstate(fi, DEV_STATE_STARTWAIT);
-			ev.conn = privptr->conn;
-			fsm_event(privptr->conn->fsm, CONN_EVENT_START, &ev);
-			break;
-		case DEV_STATE_STARTWAIT:
-			fsm_addtimer(&privptr->timer, NETIUCV_TIMEOUT_5SEC,
-				     DEV_EVENT_TIMER, dev);
-			fsm_newstate(fi, DEV_STATE_STARTRETRY);
 			break;
 		case DEV_STATE_STOPWAIT:
 			fsm_newstate(fi, DEV_STATE_STOPPED);
@@ -1044,11 +1023,6 @@ static const fsm_node dev_fsm[] = {
 
 	{ DEV_STATE_STARTWAIT,  DEV_EVENT_STOP,    dev_action_stop     },
 	{ DEV_STATE_STARTWAIT,  DEV_EVENT_CONUP,   dev_action_connup   },
-	{ DEV_STATE_STARTWAIT,  DEV_EVENT_CONDOWN, dev_action_conndown },
-
-	{ DEV_STATE_STARTRETRY, DEV_EVENT_TIMER,   dev_action_start    },
-	{ DEV_STATE_STARTRETRY, DEV_EVENT_CONUP,   dev_action_connup   },
-	{ DEV_STATE_STARTRETRY, DEV_EVENT_STOP,    dev_action_stop     },
 
 	{ DEV_STATE_RUNNING,    DEV_EVENT_STOP,    dev_action_stop     },
 	{ DEV_STATE_RUNNING,    DEV_EVENT_CONDOWN, dev_action_conndown },
@@ -1119,10 +1093,7 @@ netiucv_transmit_skb(struct iucv_connect
 		header.next = 0;
 		memcpy(skb_put(nskb, NETIUCV_HDRLEN), &header,  NETIUCV_HDRLEN);
 
-		conn->retry = 0;
 		fsm_newstate(conn->fsm, CONN_STATE_TX);
-		fsm_addtimer(&conn->timer, NETIUCV_TIMEOUT_5SEC,
-			     CONN_EVENT_TIMER, conn);
 		conn->prof.send_stamp = xtime;
 		
 		rc = iucv_send(conn->pathid, NULL, 0, 0, 1 /* single_flag */,
@@ -1135,7 +1106,6 @@ netiucv_transmit_skb(struct iucv_connect
 			conn->prof.tx_max_pending = conn->prof.tx_pending;
 		if (rc != 0) {
 			struct netiucv_priv *privptr;
-			fsm_deltimer(&conn->timer);
 			fsm_newstate(conn->fsm, CONN_STATE_IDLE);
 			conn->prof.tx_pending--;
 			privptr = (struct netiucv_priv *)conn->netdev->priv;
@@ -1178,7 +1148,6 @@ netiucv_transmit_skb(struct iucv_connect
  */
 static int
 netiucv_open(struct net_device *dev) {
-	SET_DEVICE_START(dev, 1);
 	fsm_event(((struct netiucv_priv *)dev->priv)->fsm, DEV_EVENT_START, dev);
 	return 0;
 }
@@ -1193,7 +1162,6 @@ netiucv_open(struct net_device *dev) {
  */
 static int
 netiucv_close(struct net_device *dev) {
-	SET_DEVICE_START(dev, 0);
 	fsm_event(((struct netiucv_priv *)dev->priv)->fsm, DEV_EVENT_STOP, dev);
 	return 0;
 }
@@ -1912,7 +1880,7 @@ static struct device_driver netiucv_driv
 static void
 netiucv_banner(void)
 {
-	char vbuf[] = "$Revision: 1.47 $";
+	char vbuf[] = "$Revision: 1.48 $";
 	char *version = vbuf;
 
 	if ((version = strchr(version, ':'))) {
--- diff/drivers/s390/net/qeth.h	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/s390/net/qeth.h	2004-04-21 10:45:34.638437656 +0100
@@ -1,1147 +1,789 @@
-/*
- * linux/drivers/s390/net/qeth.h
- *
- * Linux on zSeries OSA Express and HiperSockets support
- *
- * Copyright 2000,2003 IBM Corporation
- * Author(s): Utz Bacher <utz.bacher@de.ibm.com>
- *
- */
 #ifndef __QETH_H__
 #define __QETH_H__
 
-#include <asm/qdio.h>
+#include <linux/if.h>
+#include <linux/if_arp.h>
+
+#include <linux/if_tr.h>
+#include <linux/trdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/if_vlan.h>
+
+#include <net/ipv6.h>
+#include <linux/in6.h>
+#include <net/if_inet6.h>
+#include <net/addrconf.h>
 
-#define QETH_NAME " qeth"
 
-#define VERSION_QETH_H "$Revision: 1.60 $"
+#include <asm/bitops.h>
+#include <asm/debug.h>
+#include <asm/qdio.h>
+#include <asm/ccwdev.h>
+#include <asm/ccwgroup.h>
+
+#include "qeth_mpc.h"
 
-/******************** CONFIG STUFF ***********************/
-//#define QETH_DBF_LIKE_HELL
+#define VERSION_QETH_H 		"$Revision: 1.98 $"
 
 #ifdef CONFIG_QETH_IPV6
-#define QETH_IPV6
-#define QETH_VERSION_IPV6 ":IPv6"
+#define QETH_VERSION_IPV6 	":IPv6"
 #else
-#define QETH_VERSION_IPV6 ""
-#endif	/* CONFIG_QETH_IPV6 */
-
+#define QETH_VERSION_IPV6 	""
+#endif
 #ifdef CONFIG_QETH_VLAN
-#define QETH_VLAN
-#define QETH_VERSION_VLAN ":VLAN"
+#define QETH_VERSION_VLAN 	":VLAN"
 #else
-#define QETH_VERSION_VLAN ""
-#endif	/* CONFIG_QETH_VLAN */
-
-/* these values match CHECKSUM_* in include/linux/skbuff.h */
-#define SW_CHECKSUMMING 0
-#define HW_CHECKSUMMING 1
-#define NO_CHECKSUMMING 2
-
-#define QETH_CHECKSUM_DEFAULT NO_CHECKSUMMING
-
-#define QETH_PRIOQ_DEFAULT NO_PRIO_QUEUEING
-#define QETH_DEFAULT_QUEUE 2
-
-/******************** CONFIG STUFF END ***********************/
-/********************* TUNING STUFF **************************/
-#define HIGH_WATERMARK_PACK		5
-#define LOW_WATERMARK_PACK		2
-#define WATERMARK_FUZZ			2
-
-#define QETH_MAX_INPUT_THRESHOLD 500
-#define QETH_MAX_OUTPUT_THRESHOLD 300	/* ? */
-
-/* only the MAX values are used */
-#define QETH_MIN_INPUT_THRESHOLD 1
-#define QETH_MIN_OUTPUT_THRESHOLD 1
-
-#define QETH_REQUEUE_THRESHOLD (card->options.inbound_buffer_count/4)
-
-#ifdef CONFIG_QETH_PERF_STATS
-#define QETH_PERFORMANCE_STATS
-#endif	/* CONFIG_QETH_PERF_STATS */
-
-#ifdef QETH_DBF_LIKE_HELL
-#define QETH_VERBOSE_LEVEL 8
-#else /* QETH_DBF_LIKE_HELL */
-#define QETH_VERBOSE_LEVEL 5
-#endif /* QETH_DBF_LIKE_HELL */
-
-#define PCI_THRESHOLD_A (card->options.inbound_buffer_count+1)	
-/* buffers we have to be behind before we get a PCI */
-#define PCI_THRESHOLD_B 0	/* enqueued free buffers left before we get a PCI */
-#define PCI_TIMER_VALUE 3	/* not used, unless the microcode gets patched */
-
-#define DEFAULT_SPARE_BUFFERS 0
-#define MAX_SPARE_BUFFERS 1024
-#define SPAREBUF_MASK 65536
-#define MAX_PORTNO 15
-
-#define QETH_PROCFILE_NAME "qeth"
-#define QETH_PERF_PROCFILE_NAME "qeth_perf"
-#define QETH_IPA_PROCFILE_NAME "qeth_ipa_takeover"
-
-#define SEND_RETRIES_ALLOWED 5
-#define QETH_ROUTING_ATTEMPTS 2
-
-#define QETH_HARDSETUP_LAPS 5
-#define QETH_HARDSETUP_CLEAR_LAPS 3
-#define QETH_RECOVERY_HARDSETUP_RETRY 2
-
-/************************* DEBUG FACILITY STUFF *********************/
-
-#define QETH_DBF_HEX(ex,name,level,addr,len) \
-        do { \
-        if (ex) \
-                debug_exception(qeth_dbf_##name,level,(void*)addr,len); \
-        else \
-                debug_event(qeth_dbf_##name,level,(void*)addr,len); \
-        } while (0)
-#define QETH_DBF_TEXT(ex,name,level,text) \
-        do { \
-        if (ex) \
-                debug_text_exception(qeth_dbf_##name,level,text); \
-        else \
-                debug_text_event(qeth_dbf_##name,level,text); \
-        } while (0)
-
-#define QETH_DBF_CARD(ex,name,level,text,card) \
-	do { \
-		QETH_DBF_TEXT(ex,name,level,text); \
-		QETH_DBF_TEXT(ex,name,level,card->gdev->dev.bus_id); \
-	} while (0)
-
-#define QETH_DBF_HEX0(ex,name,addr,len) QETH_DBF_HEX(ex,name,0,addr,len)
-#define QETH_DBF_HEX1(ex,name,addr,len) QETH_DBF_HEX(ex,name,1,addr,len)
-#define QETH_DBF_HEX2(ex,name,addr,len) QETH_DBF_HEX(ex,name,2,addr,len)
-#ifdef QETH_DBF_LIKE_HELL
-#define QETH_DBF_HEX3(ex,name,addr,len) QETH_DBF_HEX(ex,name,3,addr,len)
-#define QETH_DBF_HEX4(ex,name,addr,len) QETH_DBF_HEX(ex,name,4,addr,len)
-#define QETH_DBF_HEX5(ex,name,addr,len) QETH_DBF_HEX(ex,name,5,addr,len)
-#define QETH_DBF_HEX6(ex,name,addr,len) QETH_DBF_HEX(ex,name,6,addr,len)
-#else /* QETH_DBF_LIKE_HELL */
-#define QETH_DBF_HEX3(ex,name,addr,len) do {} while (0)
-#define QETH_DBF_HEX4(ex,name,addr,len) do {} while (0)
-#define QETH_DBF_HEX5(ex,name,addr,len) do {} while (0)
-#define QETH_DBF_HEX6(ex,name,addr,len) do {} while (0)
-#endif /* QETH_DBF_LIKE_HELL */
-
-#define QETH_DBF_TEXT0(ex,name,text) QETH_DBF_TEXT(ex,name,0,text)
-#define QETH_DBF_TEXT1(ex,name,text) QETH_DBF_TEXT(ex,name,1,text)
-#define QETH_DBF_TEXT2(ex,name,text) QETH_DBF_TEXT(ex,name,2,text)
-#ifdef QETH_DBF_LIKE_HELL
-#define QETH_DBF_TEXT3(ex,name,text) QETH_DBF_TEXT(ex,name,3,text)
-#define QETH_DBF_TEXT4(ex,name,text) QETH_DBF_TEXT(ex,name,4,text)
-#define QETH_DBF_TEXT5(ex,name,text) QETH_DBF_TEXT(ex,name,5,text)
-#define QETH_DBF_TEXT6(ex,name,text) QETH_DBF_TEXT(ex,name,6,text)
-#else /* QETH_DBF_LIKE_HELL */
-#define QETH_DBF_TEXT3(ex,name,text) do {} while (0)
-#define QETH_DBF_TEXT4(ex,name,text) do {} while (0)
-#define QETH_DBF_TEXT5(ex,name,text) do {} while (0)
-#define QETH_DBF_TEXT6(ex,name,text) do {} while (0)
-#endif /* QETH_DBF_LIKE_HELL */
-
-#define QETH_DBF_CARD0(ex,name,text,card) QETH_DBF_CARD(ex,name,0,text,card)
-#define QETH_DBF_CARD1(ex,name,text,card) QETH_DBF_CARD(ex,name,1,text,card)
-#define QETH_DBF_CARD2(ex,name,text,card) QETH_DBF_CARD(ex,name,2,text,card)
-#ifdef QETH_DBF_LIKE_HELL
-#define QETH_DBF_CARD3(ex,name,text,card) QETH_DBF_CARD(ex,name,3,text,card)
-#define QETH_DBF_CARD4(ex,name,text,card) QETH_DBF_CARD(ex,name,4,text,card)
-#define QETH_DBF_CARD5(ex,name,text,card) QETH_DBF_CARD(ex,name,5,text,card)
-#define QETH_DBF_CARD6(ex,name,text,card) QETH_DBF_CARD(ex,name,6,text,card)
-#else /* QETH_DBF_LIKE_HELL */
-#define QETH_DBF_CARD3(ex,name,text,card) do {} while (0)
-#define QETH_DBF_CARD4(ex,name,text,card) do {} while (0)
-#define QETH_DBF_CARD5(ex,name,text,card) do {} while (0)
-#define QETH_DBF_CARD6(ex,name,text,card) do {} while (0)
-#endif /* QETH_DBF_LIKE_HELL */
+#define QETH_VERSION_VLAN 	""
+#endif
 
+/**
+ * Debug Facility stuff
+ */
 #define QETH_DBF_SETUP_NAME "qeth_setup"
 #define QETH_DBF_SETUP_LEN 8
 #define QETH_DBF_SETUP_INDEX 3
 #define QETH_DBF_SETUP_NR_AREAS 1
-#ifdef QETH_DBF_LIKE_HELL
-#define QETH_DBF_SETUP_LEVEL 6
-#else /* QETH_DBF_LIKE_HELL */
 #define QETH_DBF_SETUP_LEVEL 3
-#endif /* QETH_DBF_LIKE_HELL */
 
 #define QETH_DBF_MISC_NAME "qeth_misc"
 #define QETH_DBF_MISC_LEN 128
 #define QETH_DBF_MISC_INDEX 1
 #define QETH_DBF_MISC_NR_AREAS 1
-#ifdef QETH_DBF_LIKE_HELL
-#define QETH_DBF_MISC_LEVEL 6
-#else /* QETH_DBF_LIKE_HELL */
 #define QETH_DBF_MISC_LEVEL 2
-#endif /* QETH_DBF_LIKE_HELL */
 
 #define QETH_DBF_DATA_NAME "qeth_data"
 #define QETH_DBF_DATA_LEN 96
 #define QETH_DBF_DATA_INDEX 3
 #define QETH_DBF_DATA_NR_AREAS 1
-#ifdef QETH_DBF_LIKE_HELL
-#define QETH_DBF_DATA_LEVEL 6
-#else /* QETH_DBF_LIKE_HELL */
 #define QETH_DBF_DATA_LEVEL 2
-#endif /* QETH_DBF_LIKE_HELL */
 
 #define QETH_DBF_CONTROL_NAME "qeth_control"
-/* buffers are 255 bytes long, but no prob */
 #define QETH_DBF_CONTROL_LEN 256
 #define QETH_DBF_CONTROL_INDEX 3
 #define QETH_DBF_CONTROL_NR_AREAS 2
-#ifdef QETH_DBF_LIKE_HELL
-#define QETH_DBF_CONTROL_LEVEL 6
-#else /* QETH_DBF_LIKE_HELL */
 #define QETH_DBF_CONTROL_LEVEL 2
-#endif /* QETH_DBF_LIKE_HELL */
 
 #define QETH_DBF_TRACE_NAME "qeth_trace"
 #define QETH_DBF_TRACE_LEN 8
-#ifdef QETH_DBF_LIKE_HELL
-#define QETH_DBF_TRACE_INDEX 3
-#else /* QETH_DBF_LIKE_HELL */
 #define QETH_DBF_TRACE_INDEX 2
-#endif /* QETH_DBF_LIKE_HELL */
 #define QETH_DBF_TRACE_NR_AREAS 2
-#ifdef QETH_DBF_LIKE_HELL
-#define QETH_DBF_TRACE_LEVEL 6
-#else /* QETH_DBF_LIKE_HELL */
-#define QETH_DBF_TRACE_LEVEL 2
-#endif /* QETH_DBF_LIKE_HELL */
+#define QETH_DBF_TRACE_LEVEL 3
 
 #define QETH_DBF_SENSE_NAME "qeth_sense"
 #define QETH_DBF_SENSE_LEN 64
 #define QETH_DBF_SENSE_INDEX 1
 #define QETH_DBF_SENSE_NR_AREAS 1
-#ifdef QETH_DBF_LIKE_HELL
-#define QETH_DBF_SENSE_LEVEL 6
-#else /* QETH_DBF_LIKE_HELL */
 #define QETH_DBF_SENSE_LEVEL 2
-#endif /* QETH_DBF_LIKE_HELL */
 
 #define QETH_DBF_QERR_NAME "qeth_qerr"
 #define QETH_DBF_QERR_LEN 8
 #define QETH_DBF_QERR_INDEX 1
 #define QETH_DBF_QERR_NR_AREAS 2
-#ifdef QETH_DBF_LIKE_HELL
-#define QETH_DBF_QERR_LEVEL 6
-#else /* QETH_DBF_LIKE_HELL */
 #define QETH_DBF_QERR_LEVEL 2
-#endif /* QETH_DBF_LIKE_HELL */
-/****************** END OF DEBUG FACILITY STUFF *********************/
 
-/********************* CARD DATA STUFF **************************/
-
-#define QETH_MAX_PARAMS 150
-
-#define QETH_CARD_TYPE_UNKNOWN	0
-#define QETH_CARD_TYPE_OSAE	10
-#define QETH_CARD_TYPE_IQD	1234
+#define QETH_DBF_TEXT(name,level,text) \
+	do { \
+		debug_text_event(qeth_dbf_##name,level,text); \
+	} while (0)
 
-#define QETH_IDX_FUNC_LEVEL_OSAE_ENA_IPAT 0x0101
-#define QETH_IDX_FUNC_LEVEL_OSAE_DIS_IPAT 0x0101
-#define QETH_IDX_FUNC_LEVEL_IQD_ENA_IPAT 0x4108
-#define QETH_IDX_FUNC_LEVEL_IQD_DIS_IPAT 0x5108
+#define QETH_DBF_HEX(name,level,addr,len) \
+	do { \
+		debug_event(qeth_dbf_##name,level,(void*)(addr),len); \
+	} while (0)
 
-#define QETH_MAX_QUEUES 4
+#define QETH_DBF_TEXT_(name,level,text...)				  \
+	do {								  \
+		sprintf(qeth_dbf_text_buf, text);			  \
+		debug_text_event(qeth_dbf_##name,level,qeth_dbf_text_buf);\
+	} while (0)
 
-#define UNIQUE_ID_IF_CREATE_ADDR_FAILED 0xfffe
-#define UNIQUE_ID_NOT_BY_CARD 0x10000
+#define QETH_DBF_SPRINTF(name,level,text...) \
+	do { \
+		debug_sprintf_event(qeth_dbf_trace, level, ##text ); \
+		debug_sprintf_event(qeth_dbf_trace, level, text ); \
+	} while (0)
 
-/* 
- * CU type & model, Dev type & model, card_type, odd_even_restriction,
- * func level, no of queues, multicast is different (multicast-queue_no + 0x100)
+/**
+ * some more debug stuff
  */
-#define QETH_MODELLIST_ARRAY \
-	{{0x1731,0x01,0x1732,0x01,QETH_CARD_TYPE_OSAE,1, \
-	  QETH_IDX_FUNC_LEVEL_OSAE_ENA_IPAT, \
-	  QETH_IDX_FUNC_LEVEL_OSAE_DIS_IPAT, \
-	  QETH_MAX_QUEUES,0}, \
-	 {0x1731,0x05,0x1732,0x05,QETH_CARD_TYPE_IQD,0, \
-	  QETH_IDX_FUNC_LEVEL_IQD_ENA_IPAT, \
-	  QETH_IDX_FUNC_LEVEL_IQD_DIS_IPAT, \
-	  QETH_MAX_QUEUES,0x103}, \
-	 {0,0,0,0,0,0,0,0,0}}
-
-#define QETH_MPC_DIFINFO_LEN_INDICATES_LINK_TYPE 0x18
- /* only the first two bytes are looked at in qeth_get_cardname_short */
-#define QETH_MPC_LINK_TYPE_FAST_ETHERNET 0x01
-#define QETH_MPC_LINK_TYPE_HSTR 0x02
-#define QETH_MPC_LINK_TYPE_GIGABIT_ETHERNET 0x03
-#define QETH_MPC_LINK_TYPE_10GIGABIT_ETHERNET 0x10
-#define QETH_MPC_LINK_TYPE_LANE_ETH100 0x81
-#define QETH_MPC_LINK_TYPE_LANE_TR 0x82
-#define QETH_MPC_LINK_TYPE_LANE_ETH1000 0x83
-#define QETH_MPC_LINK_TYPE_LANE 0x88
-#define QETH_MPC_LINK_TYPE_ATM_NATIVE 0x90
-
-#define DEFAULT_ADD_HHLEN 0
-#define MAX_ADD_HHLEN 1024
-
-#define QETH_HEADER_SIZE	32
-#define QETH_IP_HEADER_SIZE	40
-#define QETH_HEADER_LEN_POS	8
-/* flags for the header: */
-#define QETH_HEADER_PASSTHRU	0x10
-#define QETH_HEADER_IPV6	0x80
-
-#define QETH_ETH_MAC_V4      0x0100 /* like v4 */
-#define QETH_ETH_MAC_V6      0x3333 /* like v6 */
-/* tr mc mac is longer, but that will be enough to detect mc frames */
-#define QETH_TR_MAC_NC       0xc000 /* non-canonical */
-#define QETH_TR_MAC_C        0x0300 /* canonical */
-
-#define QETH_CAST_FLAGS		0x07
-#define QETH_CAST_UNICAST	6
-#define QETH_CAST_MULTICAST	4
-#define QETH_CAST_BROADCAST	5
-#define QETH_CAST_ANYCAST	7
-#define QETH_CAST_NOCAST	0
-
-/* VLAN defines */
-#define QETH_EXT_HEADER_VLAN_FRAME	  0x01
-#define QETH_EXT_HEADER_TOKEN_ID	  0x02
-#define QETH_EXT_HEADER_INCLUDE_VLAN_TAG  0x04
-
-#define QETH_EXT_HEADER_SRC_MAC_ADDRESS   0x08
-#define QETH_EXT_HEADER_CSUM_HDR_REQ      0x10
-#define QETH_EXT_HEADER_CSUM_TRANSP_REQ   0x20
-#define QETH_EXT_HEADER_CSUM_TRANSP_FRAME_TYPE   0x40
-
-#define QETH_UDP_CSUM_OFFSET	6
-#define QETH_TCP_CSUM_OFFSET	16
+#define PRINTK_HEADER 	"qeth: "
 
-#define QETH_VERIFY_IS_REAL_DEV               1
-#define QETH_VERIFY_IS_VLAN_DEV               2
+#define HEXDUMP16(importance,header,ptr) \
+PRINT_##importance(header "%02x %02x %02x %02x  %02x %02x %02x %02x  " \
+		   "%02x %02x %02x %02x  %02x %02x %02x %02x\n", \
+		   *(((char*)ptr)),*(((char*)ptr)+1),*(((char*)ptr)+2), \
+		   *(((char*)ptr)+3),*(((char*)ptr)+4),*(((char*)ptr)+5), \
+		   *(((char*)ptr)+6),*(((char*)ptr)+7),*(((char*)ptr)+8), \
+		   *(((char*)ptr)+9),*(((char*)ptr)+10),*(((char*)ptr)+11), \
+		   *(((char*)ptr)+12),*(((char*)ptr)+13), \
+		   *(((char*)ptr)+14),*(((char*)ptr)+15)); \
+PRINT_##importance(header "%02x %02x %02x %02x  %02x %02x %02x %02x  " \
+		   "%02x %02x %02x %02x  %02x %02x %02x %02x\n", \
+		   *(((char*)ptr)+16),*(((char*)ptr)+17), \
+		   *(((char*)ptr)+18),*(((char*)ptr)+19), \
+		   *(((char*)ptr)+20),*(((char*)ptr)+21), \
+		   *(((char*)ptr)+22),*(((char*)ptr)+23), \
+		   *(((char*)ptr)+24),*(((char*)ptr)+25), \
+		   *(((char*)ptr)+26),*(((char*)ptr)+27), \
+		   *(((char*)ptr)+28),*(((char*)ptr)+29), \
+		   *(((char*)ptr)+30),*(((char*)ptr)+31));
 
-inline static unsigned int
-qeth_get_ipa_timeout(int cardtype)
+static inline void
+qeth_hex_dump(unsigned char *buf, size_t len)
 {
-	switch (cardtype) {
-	case QETH_CARD_TYPE_IQD:
-		return 2000;
-	default:
-		return 20000;
-	}
-}
+	size_t i;
 
-inline static unsigned short
-qeth_get_additional_dev_flags(int cardtype)
-{
-	switch (cardtype) {
-	case QETH_CARD_TYPE_IQD:
-		return IFF_NOARP;
-#ifdef QETH_IPV6
-	default:
-		return 0;
-#else /* QETH_IPV6 */
-	default:
-		return IFF_NOARP;
-#endif /* QETH_IPV6 */
+	for (i = 0; i < len; i++) {
+		if (i && !(i % 16))
+			printk("\n");
+		printk("%02x ", *(buf + i));
 	}
+	printk("\n");
 }
 
-inline static int
-qeth_get_hlen(__u8 link_type)
-{
-#ifdef QETH_IPV6
-	switch (link_type) {
-	case QETH_MPC_LINK_TYPE_HSTR:
-	case QETH_MPC_LINK_TYPE_LANE_TR:
-		return QETH_HEADER_SIZE + TR_HLEN;
-	default:
-#ifdef QETH_VLAN
-		return QETH_HEADER_SIZE + VLAN_ETH_HLEN;
-#else
-		return QETH_HEADER_SIZE + ETH_HLEN;
-#endif
-	}
-#else /* QETH_IPV6 */
-#ifdef QETH_VLAN
-	return QETH_HEADER_SIZE + VLAN_HLEN;
-#else
-	return QETH_HEADER_SIZE;
-#endif
+#define SENSE_COMMAND_REJECT_BYTE 0
+#define SENSE_COMMAND_REJECT_FLAG 0x80
+#define SENSE_RESETTING_EVENT_BYTE 1
+#define SENSE_RESETTING_EVENT_FLAG 0x80
 
-#endif /* QETH_IPV6 */
-}
+/*
+ * Common IO related definitions
+ */
+extern struct device *qeth_root_dev;
+extern struct ccw_driver qeth_ccw_driver;
+extern struct ccwgroup_driver qeth_ccwgroup_driver;
+
+#define CARD_RDEV(card) card->read.ccwdev
+#define CARD_WDEV(card) card->write.ccwdev
+#define CARD_DDEV(card) card->data.ccwdev
+#define CARD_BUS_ID(card) card->gdev->dev.bus_id
+#define CARD_RDEV_ID(card) card->read.ccwdev->dev.bus_id
+#define CARD_WDEV_ID(card) card->write.ccwdev->dev.bus_id
+#define CARD_DDEV_ID(card) card->data.ccwdev->dev.bus_id
+#define CHANNEL_ID(channel) channel->ccwdev->dev.bus_id
 
-static int (*qeth_my_eth_header) (struct sk_buff *, struct net_device *,
-				  unsigned short, void *, void *, unsigned);
-#ifdef CONFIG_TR
-static int (*qeth_my_tr_header) (struct sk_buff *, struct net_device *,
-				 unsigned short, void *, void *, unsigned);
-#endif /* CONFIG_TR */
-static int (*qeth_my_eth_rebuild_header) (struct sk_buff *);
-#ifdef CONFIG_TR
-static int (*qeth_my_tr_rebuild_header) (struct sk_buff *);
-#endif /* CONFIG_TR */
-static int (*qeth_my_eth_header_cache) (struct neighbour *, struct hh_cache *);
-static void (*qeth_my_eth_header_cache_update) (struct hh_cache *,
-						struct net_device *,
-						unsigned char *);
-
-#ifdef QETH_IPV6
-typedef int (*__qeth_temp1) (struct sk_buff *, struct net_device *,
-			     unsigned short, void *, void *, unsigned);
-inline static __qeth_temp1
-qeth_get_hard_header(__u8 link_type)
-{
-	switch (link_type) {
-#ifdef CONFIG_TR
-	case QETH_MPC_LINK_TYPE_HSTR:
-	case QETH_MPC_LINK_TYPE_LANE_TR:
-		return qeth_my_tr_header;
-#endif /* CONFIG_TR */
-	default:
-		return qeth_my_eth_header;
-	}
-}
+#define CARD_FROM_CDEV(cdev) (struct qeth_card *) \
+		((struct ccwgroup_device *)cdev->dev.driver_data)\
+		->dev.driver_data;
 
-typedef int (*__qeth_temp2) (struct sk_buff *);
-inline static __qeth_temp2
-qeth_get_rebuild_header(__u8 link_type)
-{
-	switch (link_type) {
-#ifdef CONFIG_TR
-	case QETH_MPC_LINK_TYPE_HSTR:
-	case QETH_MPC_LINK_TYPE_LANE_TR:
-		return qeth_my_tr_rebuild_header;
-#endif /* CONFIG_TR */
-	default:
-		return qeth_my_eth_rebuild_header;
-	}
-}
+/**
+ * card stuff
+ */
+#ifdef CONFIG_QETH_PERF_STATS
+struct qeth_perf_stats {
+	unsigned int bufs_rec;
+	unsigned int bufs_sent;
 
-typedef int (*__qeth_temp3) (struct neighbour *, struct hh_cache *);
-inline static __qeth_temp3
-qeth_get_hard_header_cache(__u8 link_type)
-{
-	switch (link_type) {
-	case QETH_MPC_LINK_TYPE_HSTR:
-	case QETH_MPC_LINK_TYPE_LANE_TR:
-		return NULL;
-	default:
-		return qeth_my_eth_header_cache;
-	}
-}
+	unsigned int skbs_sent_pack;
+	unsigned int bufs_sent_pack;
 
-typedef void (*__qeth_temp4) (struct hh_cache *, struct net_device *,
-			      unsigned char *);
-inline static __qeth_temp4
-qeth_get_header_cache_update(__u8 link_type)
-{
-	switch (link_type) {
-	case QETH_MPC_LINK_TYPE_HSTR:
-	case QETH_MPC_LINK_TYPE_LANE_TR:
-		return NULL;
-	default:
-		return qeth_my_eth_header_cache_update;
-	}
-}
+	unsigned int sc_dp_p;
+	unsigned int sc_p_dp;
 
-static unsigned short
-qeth_eth_type_trans(struct sk_buff *skb, struct net_device *dev)
-{
-	struct ethhdr *eth;
+	__u64 inbound_start_time;
+	unsigned int inbound_cnt;
+	unsigned int inbound_time;
+	__u64 outbound_start_time;
+	unsigned int outbound_cnt;
+	unsigned int outbound_time;
+};
+#endif /* CONFIG_QETH_PERF_STATS */
 
-	skb->mac.raw = skb->data;
-	skb_pull(skb, ETH_ALEN * 2 + sizeof (short));
-	eth = skb->mac.ethernet;
-
-	if (*eth->h_dest & 1) {
-		if (memcmp(eth->h_dest, dev->broadcast, ETH_ALEN) == 0)
-			skb->pkt_type = PACKET_BROADCAST;
-		else
-			skb->pkt_type = PACKET_MULTICAST;
-	} else {
-		skb->pkt_type = PACKET_OTHERHOST;
-	}
-	if (ntohs(eth->h_proto) >= 1536)
-		return eth->h_proto;
-	if (*(unsigned short *) (skb->data) == 0xFFFF)
-		return htons(ETH_P_802_3);
-	return htons(ETH_P_802_2);
-}
+/* Routing stuff */
+struct qeth_routing_info {
+	enum qeth_routing_types type;
+};
 
-typedef unsigned short (*__qeth_temp5) (struct sk_buff *, struct net_device *);
-inline static __qeth_temp5
-qeth_get_type_trans(__u8 link_type)
-{
-	switch (link_type) {
-#ifdef CONFIG_TR
-	case QETH_MPC_LINK_TYPE_HSTR:
-	case QETH_MPC_LINK_TYPE_LANE_TR:
-		return tr_type_trans;
-#endif
-	default:
-		return qeth_eth_type_trans;
-	}
-}
-#endif /* QETH_IPV6 */
+/* IPA stuff */
+struct qeth_ipa_info {
+	__u32 supported_funcs;
+	__u32 enabled_funcs;
+};
 
-inline static const char *
-qeth_get_link_type_name(int cardtype, __u8 linktype)
+static inline int
+qeth_is_ipa_supported(struct qeth_ipa_info *ipa, enum qeth_ipa_funcs func)
 {
-	switch (cardtype) {
-	case QETH_CARD_TYPE_UNKNOWN:
-		return "unknown";
-	case QETH_CARD_TYPE_OSAE:
-		switch (linktype) {
-		case QETH_MPC_LINK_TYPE_FAST_ETHERNET:
-			return "Fast Eth";
-		case QETH_MPC_LINK_TYPE_HSTR:
-			return "HSTR";
-		case QETH_MPC_LINK_TYPE_GIGABIT_ETHERNET:
-			return "Gigabit Eth";
-		case QETH_MPC_LINK_TYPE_LANE_ETH100:
-			return "LANE Eth100";
-		case QETH_MPC_LINK_TYPE_LANE_TR:
-			return "LANE TR";
-		case QETH_MPC_LINK_TYPE_LANE_ETH1000:
-			return "LANE Eth1000";
-		default:
-			return "unknown";
-		}
-	case QETH_CARD_TYPE_IQD:
-		return "magic";
-	default:
-		return "unknown";
-	}
+	return (ipa->supported_funcs & func);
 }
 
-inline static const char *
-qeth_get_dev_basename(int cardtype, __u8 link_type)
+static inline int
+qeth_is_ipa_enabled(struct qeth_ipa_info *ipa, enum qeth_ipa_funcs func)
 {
-	switch (cardtype) {
-	case QETH_CARD_TYPE_UNKNOWN:
-		return "eth";
-	case QETH_CARD_TYPE_OSAE:
-		switch (link_type) {
-		case QETH_MPC_LINK_TYPE_LANE_TR:
-			/* fallthrough */
-		case QETH_MPC_LINK_TYPE_HSTR:
-			return "tr";
-		default:
-			return "eth";
-		}
-	case QETH_CARD_TYPE_IQD:
-		return "hsi";
-	default:
-		return "eth";
-	}
+	return (ipa->supported_funcs & ipa->enabled_funcs & func);
 }
 
-/* inbound: */
-#define DEFAULT_BUFFER_SIZE 65536
-#define DEFAULT_BUFFER_COUNT 128
-#define BUFCNT_MIN 8
-#define BUFCNT_MAX 128
-#define BUFFER_SIZE (card->inbound_buffer_size)
-#define BUFFER_MAX_ELEMENTS (BUFFER_SIZE>>12)
-	/* 8k for each pair header-buffer: */
+#define qeth_adp_supported(c,f) \
+	qeth_is_ipa_supported(&c->options.adp, f)
+#define qeth_adp_enabled(c,f) \
+	qeth_is_ipa_enabled(&c->options.adp, f)
+#define qeth_is_supported(c,f) \
+	qeth_is_ipa_supported(&c->options.ipa4, f)
+#define qeth_is_enabled(c,f) \
+	qeth_is_ipa_enabled(&c->options.ipa4, f)
+#ifdef CONFIG_QETH_IPV6
+#define qeth_is_supported6(c,f) \
+	qeth_is_ipa_supported(&c->options.ipa6, f)
+#define qeth_is_enabled6(c,f) \
+	qeth_is_ipa_enabled(&c->options.ipa6, f)
+#else /* CONFIG_QETH_IPV6 */
+#define qeth_is_supported6(c,f) 0
+#define qeth_is_enabled6(c,f) 0
+#endif /* CONFIG_QETH_IPV6 */
+#define qeth_is_ipafunc_supported(c,prot,f) \
+	 (prot==QETH_PROT_IPV6)? qeth_is_supported6(c,f):qeth_is_supported(c,f)
+#define qeth_is_ipafunc_enabled(c,prot,f) \
+	 (prot==QETH_PROT_IPV6)? qeth_is_enabled6(c,f):qeth_is_enabled(c,f)
 
-inline static int
-qeth_sbal_packing_on_card(int cardtype)
-{
-	switch (cardtype) {
-	case QETH_CARD_TYPE_IQD:
-		return 0;
-	default:
-		return 1;
-	}
-}
 
-/* 
- * do it this way round -> __MODULE_STRING needs with
- * QETH_PRIO_NICE_LEVELS a single number
- */
-#define QETH_MAX_PRIO_QUEUES QETH_PRIO_NICE_LEVELS+1
+#define QETH_IDX_FUNC_LEVEL_OSAE_ENA_IPAT 0x0101
+#define QETH_IDX_FUNC_LEVEL_OSAE_DIS_IPAT 0x0101
+#define QETH_IDX_FUNC_LEVEL_IQD_ENA_IPAT 0x4108
+#define QETH_IDX_FUNC_LEVEL_IQD_DIS_IPAT 0x5108
 
-static inline int
-qeth_sbalf15_in_retrieable_range(int sbalf15)
-{
-	return ((sbalf15 >= 15) && (sbalf15 <= 31));
-}
+#define QETH_MODELLIST_ARRAY \
+	{{0x1731,0x01,0x1732,0x01,QETH_CARD_TYPE_OSAE,1, \
+	QETH_IDX_FUNC_LEVEL_OSAE_ENA_IPAT, \
+	QETH_IDX_FUNC_LEVEL_OSAE_DIS_IPAT, \
+	QETH_MAX_QUEUES,0}, \
+	{0x1731,0x05,0x1732,0x05,QETH_CARD_TYPE_IQD,0, \
+	QETH_IDX_FUNC_LEVEL_IQD_ENA_IPAT, \
+	QETH_IDX_FUNC_LEVEL_IQD_DIS_IPAT, \
+	QETH_MAX_QUEUES,0x103}, \
+	{0,0,0,0,0,0,0,0,0}}
+
+#define QETH_REAL_CARD		1
+#define QETH_VLAN_CARD		2
+#define QETH_BUFSIZE	 	4096
 
-#define INBOUND_BUFFER_POS(card,bufno,sbale) \
-	( (bufno&SPAREBUF_MASK)? \
-	  ( \
-	    (sparebufs[bufno&(~SPAREBUF_MASK)].buf+ \
-	     PAGE_SIZE*sbale) \
-	  ):( \
-	      (card->inbound_buffer_pool_entry[card-> \
-	       inbound_buffer_entry_no[bufno]][sbale]) \
-	    ) )
-
-#define SPAREBUF_UNAVAIL 0
-#define SPAREBUF_FREE 1
-#define SPAREBUF_USED 2
-
-struct sparebufs {
-	char *buf;
-	atomic_t status;
-};
-
-#define SEND_STATE_INACTIVE		0
-#define SEND_STATE_DONT_PACK		1
-#define SEND_STATE_PACK			2
-
-#define QETH_LOCK_UNLOCKED 0
-#define QETH_LOCK_NORMAL 1
-#define QETH_LOCK_FLUSH 2
-
-#define QETH_TX_TIMEOUT 100*HZ	/* 100 seconds */
-
-#define QETH_REMOVE_WAIT_TIME 200
-#define QETH_WAIT_FOR_THREAD_TIME 20
-#define QETH_IDLE_WAIT_TIME 10
-#define QETH_WAIT_BEFORE_2ND_DOIO 1000
-
-#define QETH_FAKE_LL_LEN ETH_HLEN	/* 14 */
-#define QETH_FAKE_LL_PROT_LEN 2
-#define QETH_FAKE_LL_ADDR_LEN ETH_ALEN	/* 6 */
-#define QETH_FAKE_LL_DEST_MAC_POS 0
-#define QETH_FAKE_LL_SRC_MAC_POS 6
-#define QETH_FAKE_LL_SRC_MAC_POS_IN_QDIO_HDR 6
-#define QETH_FAKE_LL_PROT_POS 12
-#define QETH_FAKE_LL_V4_ADDR_POS 16
+/**
+ * some more defs
+ */
+#define IF_NAME_LEN	 	16
+#define QETH_TX_TIMEOUT		100 * HZ
+#define QETH_HEADER_SIZE	32
+#define MAX_PORTNO 		15
+#define QETH_FAKE_LL_LEN 	ETH_HLEN
 #define QETH_FAKE_LL_V6_ADDR_POS 24
 
-#define DEV_NAME_LEN 16
-#define IOCTL_MAX_TRANSFER_SIZE 65535
+/*IPv6 address autoconfiguration stuff*/
+#define UNIQUE_ID_IF_CREATE_ADDR_FAILED 0xfffe
+#define UNIQUE_ID_NOT_BY_CARD 		0x10000
+
+/*****************************************************************************/
+/* QDIO queue and buffer handling                                            */
+/*****************************************************************************/
+#define QETH_MAX_QUEUES 4
+#define QETH_IN_BUF_SIZE_DEFAULT 65536
+#define QETH_IN_BUF_COUNT_DEFAULT 16
+#define QETH_IN_BUF_COUNT_MIN 8
+#define QETH_IN_BUF_COUNT_MAX 128
+#define QETH_MAX_BUFFER_ELEMENTS(card) ((card)->qdio.in_buf_size >> 12)
+#define QETH_IN_BUF_REQUEUE_THRESHOLD(card) \
+		((card)->qdio.in_buf_pool.buf_count / 4)
+
+/* buffers we have to be behind before we get a PCI */
+#define QETH_PCI_THRESHOLD_A(card) ((card)->qdio.in_buf_pool.buf_count+1)
+/*enqueued free buffers left before we get a PCI*/
+#define QETH_PCI_THRESHOLD_B(card) 0
+/*not used unless the microcode gets patched*/
+#define QETH_PCI_TIMER_VALUE(card) 3
+
+#define QETH_MIN_INPUT_THRESHOLD 1
+#define QETH_MAX_INPUT_THRESHOLD 500
+#define QETH_MIN_OUTPUT_THRESHOLD 1
+#define QETH_MAX_OUTPUT_THRESHOLD 300
 
+/* priority queing */
+#define QETH_PRIOQ_DEFAULT QETH_NO_PRIO_QUEUEING
+#define QETH_DEFAULT_QUEUE    2
+#define QETH_NO_PRIO_QUEUEING 0
+#define QETH_PRIO_Q_ING_PREC  1
+#define QETH_PRIO_Q_ING_TOS   2
 #define IP_TOS_LOWDELAY 0x10
 #define IP_TOS_HIGHTHROUGHPUT 0x08
 #define IP_TOS_HIGHRELIABILITY 0x04
 #define IP_TOS_NOTIMPORTANT 0x02
 
-#define QETH_RCD_LENGTH 128
-
-#define __max(a,b) ( ((a)>(b))?(a):(b) )
-#define __min(a,b) ( ((a)<(b))?(a):(b) )
-#define QETH_BUFSIZE __max(__max(IPA_PDU_HEADER_SIZE+sizeof(struct arp_cmd), \
-				 IPA_PDU_HEADER_SIZE+sizeof(struct ipa_cmd)), \
-			   QETH_RCD_LENGTH)
-
-#define QETH_NOP_TIMEOUT 1500
-#define QETH_QUIESCE_NETDEV_TIME 300
-#define QETH_QUIESCE_WAIT_BEFORE_CLEAR 4000
-#define QETH_QUIESCE_WAIT_AFTER_CLEAR 4000
-
-#define NOP_STATE 0x1001
-#define IDX_ACTIVATE_READ_STATE 0x1003
-#define IDX_ACTIVATE_WRITE_STATE 0x1004
-#define MPC_SETUP_STATE 0x1005
-#define CLEAR_STATE 0x1006
-#define IPA_CMD_STATE 0x1007
-#define IPA_IOCTL_STATE 0x1009
-#define IPA_SETIP_FLAG 0x100000
-
-#define QETH_REMOVE_CARD_PROPER 1
-#define QETH_REMOVE_CARD_QUICK 2
-
-#define NO_PRIO_QUEUEING 0
-#define PRIO_QUEUEING_PREC 1
-#define PRIO_QUEUEING_TOS 2
-#define NO_ROUTER 0
-#define PRIMARY_ROUTER 1
-#define SECONDARY_ROUTER 2
-#define MULTICAST_ROUTER 3
-#define PRIMARY_CONNECTOR 4
-#define SECONDARY_CONNECTOR 5
-#define ROUTER_MASK 0xf		/* used to remove SET_ROUTING_FLAG
-				   from routing_type */
-#define RESET_ROUTING_FLAG 0x10	/* used to indicate, that setting
-				   the routing type is desired */
-#define BROADCAST_ALLRINGS 0
-#define BROADCAST_LOCAL 1
-#define MACADDR_NONCANONICAL 0
-#define MACADDR_CANONICAL 1
-#define ENABLE_TAKEOVER 0
-#define DISABLE_TAKEOVER 1
-#define FAKE_BROADCAST 0
-#define DONT_FAKE_BROADCAST 1
-
-#define FAKE_LL 0
-#define DONT_FAKE_LL 1
-
-#define QETH_BREAKOUT_LEAVE 1
-#define QETH_BREAKOUT_AGAIN 2
-
-#define QETH_WAIT_FOR_LOCK 0
-#define QETH_DONT_WAIT_FOR_LOCK 1
-#define QETH_LOCK_ALREADY_HELD 2
-
-#define PROBLEM_CARD_HAS_STARTLANED 1
-#define PROBLEM_RECEIVED_IDX_TERMINATE 2
-#define PROBLEM_ACTIVATE_CHECK_CONDITION 3
-#define PROBLEM_RESETTING_EVENT_INDICATOR 4
-#define PROBLEM_COMMAND_REJECT 5
-#define PROBLEM_ZERO_SENSE_DATA 6
-#define PROBLEM_GENERAL_CHECK 7
-#define PROBLEM_BAD_SIGA_RESULT 8
-#define PROBLEM_USER_TRIGGERED_RECOVERY 9
-#define PROBLEM_AFFE 10
-#define PROBLEM_MACHINE_CHECK 11
-#define PROBLEM_TX_TIMEOUT 12
-
-#define CARD_RDEV(card) card->gdev->cdev[0]
-#define CARD_WDEV(card) card->gdev->cdev[1]
-#define CARD_DDEV(card) card->gdev->cdev[2]
-#define CARD_BUS_ID(card) card->gdev->dev.bus_id
-#define CARD_RDEV_ID(card) card->gdev->cdev[0]->dev.bus_id
-#define CARD_WDEV_ID(card) card->gdev->cdev[1]->dev.bus_id
-#define CARD_DDEV_ID(card) card->gdev->cdev[2]->dev.bus_id
-#define CARD_FROM_CDEV(cdev) (struct qeth_card *) \
-	((struct ccwgroup_device *) cdev->dev.driver_data)->dev.driver_data
-
-#define SENSE_COMMAND_REJECT_BYTE 0
-#define SENSE_COMMAND_REJECT_FLAG 0x80
-#define SENSE_RESETTING_EVENT_BYTE 1
-#define SENSE_RESETTING_EVENT_FLAG 0x80
-
-#define BUFFER_USED 1
-#define BUFFER_UNUSED -1
+/* Packing */
+#define QETH_LOW_WATERMARK_PACK  2
+#define QETH_HIGH_WATERMARK_PACK 5
+#define QETH_WATERMARK_PACK_FUZZ 1
 
-typedef int (*reg_notifier_t) (struct notifier_block *);
+#define QETH_IP_HEADER_SIZE 40
+/* VLAN defines */
+#define QETH_EXT_HDR_VLAN_FRAME        0x01
+#define QETH_EXT_HDR_TOKEN_ID          0x02
+#define QETH_EXT_HDR_INCLUDE_VLAN_TAG  0x04
 
-struct ipato_entry {
-	int version;
-	__u8 addr[16];
-	int mask_bits;
-	char dev_name[DEV_NAME_LEN];
-	struct ipato_entry *next;
-};
+struct qeth_hdr {
+	__u8  id;
+	__u8  flags;
+	__u16 inbound_checksum;
+	__u32 token;
+	__u16 length;
+	__u8  vlan_prio;
+	__u8  ext_flags;
+	__u16 vlan_id;
+	__u16 frame_offset;
+	__u8  dest_addr[16];
+} __attribute__ ((packed));
 
-struct qeth_vipa_entry {
-	int version;
-	__u8 ip[16];
-	int flag;
-	volatile int state;
-	struct qeth_vipa_entry *next;
-};
+/* flags for qeth_hdr.flags */
+#define QETH_HDR_PASSTHRU 0x10
+#define QETH_HDR_IPV6     0x80
+#define QETH_HDR_CAST_MASK 0x07
+enum qeth_cast_flags {
+	QETH_CAST_UNICAST   = 0x06,
+	QETH_CAST_MULTICAST = 0x04,
+	QETH_CAST_BROADCAST = 0x05,
+	QETH_CAST_ANYCAST   = 0x07,
+	QETH_CAST_NOCAST    = 0x00,
+};
+
+/* flags for qeth_hdr.ext_flags */
+#define QETH_HDR_EXT_VLAN_FRAME      0x01
+#define QETH_HDR_EXT_CSUM_HDR_REQ    0x10
+#define QETH_HDR_EXT_CSUM_TRANSP_REQ 0x20
+#define QETH_HDR_EXT_SRC_MAC_ADDR    0x08
 
-struct ip_state {
-	struct in_ifaddr *ip_ifa;	/* pointer to IPv4 adresses */
-	struct inet6_ifaddr *ip6_ifa;
-};
+static inline int
+qeth_is_last_sbale(struct qdio_buffer_element *sbale)
+{
+	return (sbale->flags & SBAL_FLAGS_LAST_ENTRY);
+}
 
-struct qeth_ipm_mac {
-	__u8 mac[ETH_ALEN];
-	__u8 ip[16];
-	struct qeth_ipm_mac *next;
+enum qeth_qdio_buffer_states {
+	/*
+	 * inbound: read out by driver; owned by hardware in order to be filled
+	 * outbound: owned by driver in order to be filled
+	 */
+	QETH_QDIO_BUF_EMPTY,
+	/*
+	 * inbound: filled by hardware; owned by driver in order to be read out
+	 * outbound: filled by driver; owned by hardware in order to be sent
+	 */
+	QETH_QDIO_BUF_PRIMED,
+	/*
+	 * inbound only: an error condition has been detected for a buffer
+	 *     the buffer will be discarded (not read out)
+	 */
+	QETH_QDIO_BUF_ERROR,
+};
+
+enum qeth_qdio_info_states {
+	QETH_QDIO_UNINITIALIZED,
+	QETH_QDIO_ALLOCATED,
+	QETH_QDIO_ESTABLISHED,
+};
+
+struct qeth_buffer_pool_entry {
+	struct list_head list;
+	struct list_head init_list;
+	void *elements[QDIO_MAX_ELEMENTS_PER_BUFFER];
+};
+
+struct qeth_qdio_buffer_pool {
+	struct list_head entry_list;
+	int buf_count;
+};
+
+struct qeth_qdio_buffer {
+	struct qdio_buffer *buffer;
+	volatile enum qeth_qdio_buffer_states state;
+	/* the buffer pool entry currently associated to this buffer */
+	struct qeth_buffer_pool_entry *pool_entry;
+};
+
+struct qeth_qdio_q {
+	struct qdio_buffer qdio_bufs[QDIO_MAX_BUFFERS_PER_Q];
+	struct qeth_qdio_buffer bufs[QDIO_MAX_BUFFERS_PER_Q];
+	/*
+	 * buf_to_process means "buffer primed by hardware,
+	 * has to be read in by driver"; current state PRIMED
+	 */
+	volatile int next_buf_to_process;
+	/*
+	 * buf_to_init means "buffer must be initialized by driver and must
+	 * be made available for hardware" -> state is set to EMPTY
+	 */
+	volatile int next_buf_to_init;
+} __attribute__ ((aligned(256)));
+
+struct qeth_qdio_out_buffer {
+	struct qdio_buffer *buffer;
+	volatile enum qeth_qdio_buffer_states state;
+	volatile int next_element_to_fill;
+	struct sk_buff_head skb_list;
 };
 
-struct ip_mc_state {
-	struct qeth_ipm_mac *ipm_ifa;
-	struct qeth_ipm_mac *ipm6_ifa;
-};
+struct qeth_card;
 
-struct addr_request {
-	struct addr_request *next;
-	int request_type;
-	__u8 mac[ETH_ALEN];
-	__u8 ip[16];
-};
+struct qeth_qdio_out_q {
+	struct qdio_buffer qdio_bufs[QDIO_MAX_BUFFERS_PER_Q];
+	struct qeth_qdio_out_buffer bufs[QDIO_MAX_BUFFERS_PER_Q];
+	int queue_no;
+	struct qeth_card *card;
+	struct tasklet_struct tasklet;
+	spinlock_t lock;
+	volatile int do_pack;
+	/*
+	 * index of buffer to be filled by driver; state EMPTY or PACKING
+	 */
+	volatile int next_buf_to_fill;
+	volatile int next_buf_to_flush;
+	/*
+	 * number of buffers that are currently filled (PRIMED)
+	 * -> these buffers are hardware-owned
+	 */
+	atomic_t used_buffers;
+	/* indicates whether PCI flag must be set (or if one is outstanding) */
+	atomic_t set_pci_flags_count;
+} __attribute__ ((aligned(256)));
+
+struct qeth_qdio_info {
+	volatile enum qeth_qdio_info_states state;
+	/* input */
+	struct qeth_qdio_q *in_q;
+	struct qeth_qdio_buffer_pool in_buf_pool;
+	struct qeth_qdio_buffer_pool init_pool;
+	int in_buf_size;
+	struct tasklet_struct in_tasklet;
+
+	/* output */
+	int no_out_queues;
+	struct qeth_qdio_out_q **out_qs;
 
-struct qeth_card_options {
-	char devname[DEV_NAME_LEN];
-	volatile int routing_type4;
-#ifdef QETH_IPV6
-	volatile int routing_type6;
-#endif /* QETH_IPV6 */
-	int checksum_type;
+	/* priority queueing */
 	int do_prio_queueing;
-	int default_queue;
-	int inbound_buffer_count;
-	int polltime;
-	char portname[9];
-	int portno;
-	int broadcast_mode;
-	int macaddr_mode;
-	int ena_ipat;
-	int fake_broadcast;
-	int add_hhlen;
-	int fake_ll;
+	int default_out_queue;
 };
 
-struct qeth_hdr {
-	__u8 id;
-	__u8 flags;
-	__u16 inbound_checksum;
-	__u32 token;
-	__u16 length;
-	__u8 vlan_prio;
-	__u8 ext_flags;
-	__u16 vlan_id;
-	__u16 frame_offset;
-	__u8 dest_addr[16];
+enum qeth_send_errors {
+	QETH_SEND_ERROR_NONE,
+	QETH_SEND_ERROR_LINK_FAILURE,
+	QETH_SEND_ERROR_RETRY,
+	QETH_SEND_ERROR_KICK_IT,
 };
 
-struct qeth_ringbuffer_element {
-	struct sk_buff_head skb_list;
-	int next_element_to_fill;
-} __attribute__ ((packed));
+#define QETH_ETH_MAC_V4      0x0100 /* like v4 */
+#define QETH_ETH_MAC_V6      0x3333 /* like v6 */
+/* tr mc mac is longer, but that will be enough to detect mc frames */
+#define QETH_TR_MAC_NC       0xc000 /* non-canonical */
+#define QETH_TR_MAC_C        0x0300 /* canonical */
 
-struct qeth_ringbuffer {
-	struct qdio_buffer buffer[QDIO_MAX_BUFFERS_PER_Q];
-	struct qeth_ringbuffer_element ringbuf_element[QDIO_MAX_BUFFERS_PER_Q];
-}__attribute__ ((packed, aligned(PAGE_SIZE)));
-
-struct qeth_dma_stuff {
-	unsigned char *sendbuf;
-	unsigned char *recbuf;
-	struct ccw1 read_ccw;
-	struct ccw1 write_ccw;
-}__attribute__ ((packed, aligned(PAGE_SIZE)));
+#define DEFAULT_ADD_HHLEN 0
+#define MAX_ADD_HHLEN 1024
 
-struct qeth_perf_stats {
-	unsigned int skbs_rec;
-	unsigned int bufs_rec;
+/**
+ * buffer stuff for read channel
+ */
+#define QETH_CMD_BUFFER_NO	8
 
-	unsigned int skbs_sent;
-	unsigned int bufs_sent;
+/**
+ *  channel state machine
+ */
+enum qeth_channel_states {
+	CH_STATE_UP,
+	CH_STATE_DOWN,
+	CH_STATE_ACTIVATING,
+	CH_STATE_HALTED,
+	CH_STATE_STOPPED,
+};
+/**
+ * card state machine
+ */
+enum qeth_card_states {
+	CARD_STATE_DOWN,
+	CARD_STATE_HARDSETUP,
+	CARD_STATE_SOFTSETUP,
+	CARD_STATE_UP_LAN_OFFLINE,
+	CARD_STATE_UP_LAN_ONLINE,
+	CARD_STATE_RECOVER,
+};
 
-	unsigned int skbs_sent_dont_pack;
-	unsigned int bufs_sent_dont_pack;
-	unsigned int skbs_sent_pack;
-	unsigned int bufs_sent_pack;
-	unsigned int skbs_sent_pack_better;
-	unsigned int bufs_sent_pack_better;
+/**
+ * Protocol versions
+ */
+enum qeth_prot_versions {
+	QETH_PROT_SNA  = 0x0001,
+	QETH_PROT_IPV4 = 0x0004,
+	QETH_PROT_IPV6 = 0x0006,
+};
 
-	unsigned int sc_dp_p;
-	unsigned int sc_p_dp;
+enum qeth_ip_types {
+	QETH_IP_TYPE_NORMAL,
+	QETH_IP_TYPE_VIPA,
+	QETH_IP_TYPE_RXIP,
+};
 
-	__u64 inbound_start_time;
-	unsigned int inbound_cnt;
-	unsigned int inbound_time;
-	__u64 outbound_start_time;
-	unsigned int outbound_cnt;
-	unsigned int outbound_time;
+enum qeth_cmd_buffer_state {
+	BUF_STATE_FREE,
+	BUF_STATE_LOCKED,
+	BUF_STATE_PROCESSED,
+};
+/**
+ * IP address and multicast list
+ */
+struct qeth_ipaddr {
+	struct list_head entry;
+	enum qeth_ip_types type;
+	enum qeth_ipa_setdelip_flags set_flags;
+	enum qeth_ipa_setdelip_flags del_flags;
+	int is_multicast;
+	volatile int users;
+	enum qeth_prot_versions proto;
+	unsigned char mac[OSA_ADDR_LEN];
+	union {
+		struct {
+			unsigned int addr;
+			unsigned int mask;
+		} a4;
+		struct {
+			struct in6_addr addr;
+			unsigned int pfxlen;
+		} a6;
+	} u;
+};
+
+struct qeth_ipato_entry {
+	struct list_head entry;
+	enum qeth_prot_versions proto;
+	char addr[16];
+	int mask_bits;
 };
 
-/* ugly. I know. */
-struct qeth_card {	/* pointed to by dev->priv */
+struct qeth_ipato {
+	int enabled;
+	int invert4;
+	int invert6;
+	struct list_head entries;
+};
 
-	/* pointer to options (defaults + parameters) */
-	struct qeth_card_options options;
+struct qeth_channel;
 
-	atomic_t is_startlaned;	/* card did not get a stoplan */
-	                        /* also 0 when card is gone after a
-	                         * machine check */
-
-	__u8 link_type;
-
-	int is_guest_lan;
-
-	/* inbound buffer management */
-	atomic_t inbound_buffer_refcnt[QDIO_MAX_BUFFERS_PER_Q];
-	struct qdio_buffer inbound_qdio_buffers[QDIO_MAX_BUFFERS_PER_Q];
-	/* inbound data area */
-	void *inbound_buffer_pool_entry[QDIO_MAX_BUFFERS_PER_Q]
-	    [QDIO_MAX_ELEMENTS_PER_BUFFER];
-	volatile int inbound_buffer_pool_entry_used[QDIO_MAX_BUFFERS_PER_Q];
-	int inbound_buffer_entry_no[QDIO_MAX_BUFFERS_PER_Q];
-
-	/* for requeueing of buffers */
-	spinlock_t requeue_input_lock;
-	atomic_t requeue_position;
-	atomic_t requeue_counter;
-
-	/* outbound QDIO stuff */
-	volatile int send_state[QETH_MAX_QUEUES];
-	volatile int outbound_first_free_buffer[QETH_MAX_QUEUES];
-	atomic_t outbound_used_buffers[QETH_MAX_QUEUES];
-	int outbound_buffer_send_state[QETH_MAX_QUEUES]
-	    [QDIO_MAX_BUFFERS_PER_Q];
-	int send_retries[QETH_MAX_QUEUES][QDIO_MAX_BUFFERS_PER_Q];
-	volatile int outbound_bytes_in_buffer[QETH_MAX_QUEUES];
-	struct qeth_ringbuffer *outbound_ringbuffer[QETH_MAX_QUEUES];
-	atomic_t outbound_ringbuffer_lock[QETH_MAX_QUEUES];
-	atomic_t last_pci_pos[QETH_MAX_QUEUES];
-
-#ifdef QETH_IPV6
-	int (*hard_header) (struct sk_buff *, struct net_device *,
-			    unsigned short, void *, void *, unsigned);
-	int (*rebuild_header) (struct sk_buff *);
-	int (*hard_header_cache) (struct neighbour *, struct hh_cache *);
-	void (*header_cache_update) (struct hh_cache *, struct net_device *,
-				     unsigned char *);
-	unsigned short (*type_trans) (struct sk_buff *, struct net_device *);
-#endif /* QETH_IPV6 */
+struct qeth_cmd_buffer {
+	enum qeth_cmd_buffer_state state;
+	struct qeth_channel *channel;
+	unsigned char *data;
+	int rc;
+	void (*callback) (struct qeth_channel *, struct qeth_cmd_buffer *);
+};
 
-#ifdef QETH_VLAN
-	struct vlan_group *vlangrp;
-	spinlock_t vlan_lock;
-#endif
 
-	char dev_name[DEV_NAME_LEN];	/* pointed to by dev->name */
-	struct net_device *dev;
-	struct net_device_stats *stats;
+/**
+ * definition of a qeth channel, used for read and write
+ */
+struct qeth_channel {
+	enum qeth_channel_states state;
+	struct ccw1 ccw;
+	spinlock_t iob_lock;
+	wait_queue_head_t wait_q;
+	struct tasklet_struct irq_tasklet;
+	struct ccw_device *ccwdev;
+/*command buffer for control data*/
+	struct qeth_cmd_buffer iob[QETH_CMD_BUFFER_NO];
+	atomic_t irq_pending;
+	volatile int io_buf_no;
+	volatile int buf_no;
+};
 
-	int no_queues;
+/**
+ *  OSA card related definitions
+ */
+struct qeth_token {
+	__u32 issuer_rm_w;
+	__u32 issuer_rm_r;
+	__u32 cm_filter_w;
+	__u32 cm_filter_r;
+	__u32 cm_connection_w;
+	__u32 cm_connection_r;
+	__u32 ulp_filter_w;
+	__u32 ulp_filter_r;
+	__u32 ulp_connection_w;
+	__u32 ulp_connection_r;
+};
+
+struct qeth_seqno {
+	__u32 trans_hdr;
+	__u32 pdu_hdr;
+	__u32 pdu_hdr_ack;
+	__u32 ipa;
+};
 
-#ifdef QETH_PERFORMANCE_STATS
-	struct qeth_perf_stats perf_stats;
-#endif /* QETH_PERFORMANCE_STATS */
+struct qeth_reply {
+	struct list_head list;
+	wait_queue_head_t wait_q;
+	int (*callback)(struct qeth_card *,struct qeth_reply *,unsigned long);
+ 	int seqno;
+	int received;
+	int rc;
+	void *param;
+	struct qeth_card *card;
+	atomic_t refcnt;
+};
 
-	/* our state */
-	atomic_t is_registered;	/* card registered as netdev? */
-	atomic_t is_hardsetup;	/* card has gone through hardsetup */
-	atomic_t is_softsetup;	/* card is setup by softsetup */
-	atomic_t is_open;	/* card is in use */
-
-	/* prevents deadlocks :-O */
-	struct semaphore softsetup_sema;
-	struct semaphore hardsetup_sema;
-	spinlock_t ioctl_lock;
-	atomic_t softsetup_thread_is_running;
-	struct semaphore softsetup_thread_sem;
-	struct work_struct tqueue_sst;
-
-	atomic_t escape_softsetup;	/* active, when recovery has to
-					   wait for softsetup */
-	struct semaphore reinit_thread_sem;
-	atomic_t in_recovery;
-	atomic_t reinit_counter;
-
-	/* problem management */
-	atomic_t break_out;
-	atomic_t problem;
-	struct work_struct tqueue;
-
-	struct {
-		__u32 trans_hdr;
-		__u32 pdu_hdr;
-		__u32 pdu_hdr_ack;
-		__u32 ipa;
-	} seqno;
-
-	struct {
-		__u32 issuer_rm_w;
-		__u32 issuer_rm_r;
-		__u32 cm_filter_w;
-		__u32 cm_filter_r;
-		__u32 cm_connection_w;
-		__u32 cm_connection_r;
-		__u32 ulp_filter_w;
-		__u32 ulp_filter_r;
-		__u32 ulp_connection_w;
-		__u32 ulp_connection_r;
-	} token;
+struct qeth_card_info {
 
-	/* this is card-related */
-	int type;
+	char if_name[IF_NAME_LEN];
+	unsigned short unit_addr2;
+	unsigned short cula;
+	unsigned short chpid;
 	__u16 func_level;
+	char mcl_level[QETH_MCL_LENGTH + 1];
+	int guestlan;
+	int portname_required;
+	int portno;
+	char portname[9];
+	enum qeth_card_types type;
+	enum qeth_link_types link_type;
+	int is_multicast_different;
 	int initial_mtu;
 	int max_mtu;
-	int inbound_buffer_size;
-
-	int is_multicast_different;	/* if multicast traffic is to be sent
-					   on a different queue, this is the
-					   queue+no_queues */
-	__u32 ipa_supported;
-	__u32 ipa_enabled;
-	__u32 ipa6_supported;
-	__u32 ipa6_enabled;
-	__u32 adp_supported;
-
-	__u32 csum_enable_mask;
-
-	atomic_t startlan_attempts;
-	atomic_t enable_routing_attempts4;
-	atomic_t rt4fld;
-#ifdef QETH_IPV6
-	atomic_t enable_routing_attempts6;
-	atomic_t rt6fld;
-#endif /* QETH_IPV6 */
+	int broadcast_capable;
 	int unique_id;
+	__u32 csum_mask;
+};
 
-	/* device and I/O data */
-	struct ccwgroup_device *gdev;
-	unsigned short unit_addr2;
-	unsigned short cula;
-	unsigned short chpid;
-
-	unsigned char ipa_buf[QETH_BUFSIZE];
-	unsigned char send_buf[QETH_BUFSIZE];
-
-/* IOCTL Stuff */
-	unsigned char *ioctl_data_buffer;
-	unsigned char *ioctl_buffer_pointer;
-	int ioctl_returncode;
-	int ioctl_buffersize;
-	int number_of_entries;
-
-	atomic_t ioctl_data_has_arrived;
-	wait_queue_head_t ioctl_wait_q;
+struct qeth_card_options {
+	struct qeth_routing_info route4;
+	struct qeth_ipa_info ipa4;
+	struct qeth_ipa_info adp; /*Adapter parameters*/
+#ifdef CONFIG_QETH_IPV6
+	struct qeth_routing_info route6;
+	struct qeth_ipa_info ipa6;
+#endif /* QETH_IPV6 */
+	enum qeth_checksum_types checksum_type;
+	int broadcast_mode;
+	int macaddr_mode;
+	int enable_takeover;
+	int fake_broadcast;
+	int add_hhlen;
+	int fake_ll;
+};
 
-/* stuff under 2 gb */
-	struct qeth_dma_stuff *dma_stuff;
+/*
+ * thread bits for qeth_card thread masks
+ */
+enum qeth_threads {
+	QETH_SET_IP_THREAD  = 1,
+	QETH_SET_MC_THREAD  = 2,
+	QETH_RECOVER_THREAD = 4,
+};
 
-	unsigned int ipa_timeout;
+struct qeth_card {
+	struct list_head list;
+	enum qeth_card_states state;
+	int lan_online;
+	spinlock_t lock;
+/*hardware and sysfs stuff*/
+	struct ccwgroup_device *gdev;
+	struct qeth_channel read;
+	struct qeth_channel write;
+	struct qeth_channel data;
 
-	atomic_t write_busy;
+	struct net_device *dev;
+	struct net_device_stats stats;
 
-	/* vipa stuff */
-	rwlock_t vipa_list_lock;
-	struct qeth_vipa_entry *vipa_list;
+	struct qeth_card_info info;
+	struct qeth_token token;
+	struct qeth_seqno seqno;
+	struct qeth_card_options options;
 
-	/* state information when doing I/O */
-	atomic_t shutdown_phase;
-	atomic_t data_has_arrived;
 	wait_queue_head_t wait_q;
+#ifdef CONFIG_QETH_VLAN
+	spinlock_t vlanlock;
+	struct vlan_group *vlangrp;
+#endif
+	struct work_struct kernel_thread_starter;
+	spinlock_t thread_mask_lock;
+	volatile unsigned long thread_start_mask;
+	volatile unsigned long thread_allowed_mask;
+	volatile unsigned long thread_running_mask;
+	spinlock_t ip_lock;
+	struct list_head ip_list;
+	struct list_head ip_tbd_list;
+	struct qeth_ipato ipato;
+	struct list_head cmd_waiter_list;
+	/* QDIO buffer handling */
+	struct qeth_qdio_info qdio;
+#ifdef CONFIG_QETH_PERF_STATS
+	struct qeth_perf_stats perf_stats;
+#endif /* CONFIG_QETH_PERF_STATS */
+	int use_hard_stop;
+};
 
-	atomic_t clear_succeeded0;
-	atomic_t clear_succeeded1;
-	atomic_t clear_succeeded2;
-
-	/* bookkeeping of IP and multicast addresses */
-	struct ip_state ip_current_state;
-	struct ip_state ip_new_state;
-
-	struct ip_mc_state ip_mc_current_state;
-	struct ip_mc_state ip_mc_new_state;
-
-	int broadcast_capable;
-	int portname_required;
-
-	int realloc_message;
-
-	char level[QETH_MCL_LENGTH + 1];
-
-	volatile int saved_dev_flags;
-
-	/* for our linked list */
-	struct qeth_card *next;
+struct qeth_card_list_struct {
+	struct list_head list;
+	rwlock_t rwlock;
 };
 
-inline static int
-qeth_get_arphrd_type(int cardtype, int linktype)
-{
-	switch (cardtype) {
-	case QETH_CARD_TYPE_OSAE:
-		switch (linktype) {
-		case QETH_MPC_LINK_TYPE_LANE_TR:
-			/* fallthrough */
-		case QETH_MPC_LINK_TYPE_HSTR:
-			return ARPHRD_IEEE802_TR;
-		default:
-			return ARPHRD_ETHER;
-		}
-	case QETH_CARD_TYPE_IQD:
-		return ARPHRD_ETHER;
-	default:
-		return ARPHRD_ETHER;
-	}
-}
+extern struct qeth_card_list_struct qeth_card_list;
+
+/*some helper functions*/
 
 inline static __u8
-qeth_get_adapter_type_for_ipa(int link_type)
+qeth_get_ipa_adp_type(enum qeth_link_types link_type)
 {
 	switch (link_type) {
-	case QETH_MPC_LINK_TYPE_HSTR:
+	case QETH_LINK_TYPE_HSTR:
 		return 2;
 	default:
 		return 1;
 	}
 }
 
-inline static const char *
-qeth_get_cardname(int cardtype, int is_guest_lan)
+inline static int
+qeth_get_hlen(__u8 link_type)
 {
-
- 	if (is_guest_lan) {
- 		switch (cardtype) {
- 		case QETH_CARD_TYPE_UNKNOWN:
-			return "n unknown";
- 		case QETH_CARD_TYPE_OSAE:
-			return " Guest LAN QDIO";
- 		case QETH_CARD_TYPE_IQD:
-			return " Guest LAN Hiper";
- 		default: return
-				 " strange";
- 		}
-	} else {
-		switch (cardtype) {
-		case QETH_CARD_TYPE_UNKNOWN:
-			return "n unknown";
-		case QETH_CARD_TYPE_OSAE:
-			return "n OSD Express";
-		case QETH_CARD_TYPE_IQD:
-			return " HiperSockets";
-		default:
-			return " strange";
-		}
+#ifdef CONFIG_QETH_IPV6
+	switch (link_type) {
+	case QETH_LINK_TYPE_HSTR:
+	case QETH_LINK_TYPE_LANE_TR:
+		return sizeof(struct qeth_hdr) + TR_HLEN;
+	default:
+#ifdef CONFIG_QETH_VLAN
+		return sizeof(struct qeth_hdr) + VLAN_ETH_HLEN;
+#else
+		return sizeof(struct qeth_hdr) + ETH_HLEN;
+#endif
 	}
+#else  /* CONFIG_QETH_IPV6 */
+#ifdef CONFIG_QETH_VLAN
+	return sizeof(struct qeth_hdr) + VLAN_HLEN;
+#else
+	return sizeof(struct qeth_hdr);
+#endif
+#endif /* CONFIG_QETH_IPV6 */
 }
 
-/* max length to be returned: 14 */
-inline static const char *
-qeth_get_cardname_short(int cardtype, __u8 link_type, int is_guest_lan)
+inline static unsigned short
+qeth_get_netdev_flags(int cardtype)
 {
 	switch (cardtype) {
-	case QETH_CARD_TYPE_UNKNOWN:
-		return "unknown";
-	case QETH_CARD_TYPE_OSAE:
-		if (is_guest_lan)
-			return "GuestLAN QDIO";
-		switch (link_type) {
-		case QETH_MPC_LINK_TYPE_FAST_ETHERNET:
-			return "OSD_100";
-		case QETH_MPC_LINK_TYPE_HSTR:
-			return "HSTR";
-		case QETH_MPC_LINK_TYPE_GIGABIT_ETHERNET:
-			return "OSD_1000";
-		case QETH_MPC_LINK_TYPE_LANE_ETH100:
-			return "OSD_FE_LANE";
-		case QETH_MPC_LINK_TYPE_LANE_TR:
-			return "OSD_TR_LANE";
-		case QETH_MPC_LINK_TYPE_LANE_ETH1000:
-			return "OSD_GbE_LANE";
-		case QETH_MPC_LINK_TYPE_LANE:
-			return "OSD_ATM_LANE";
-		default:
-			return "OSD_Express";
-		}
 	case QETH_CARD_TYPE_IQD:
-		return is_guest_lan ? "GuestLAN Hiper" : "HiperSockets";
+		return IFF_NOARP;
+#ifdef CONFIG_QETH_IPV6
 	default:
-		return " strange";
-	}
-}
-
-inline static int
-qeth_mtu_is_valid(struct qeth_card * card, int mtu)
-{
-	switch (card->type) {
-	case QETH_CARD_TYPE_UNKNOWN:
-		return 1;
-	case QETH_CARD_TYPE_OSAE:
-		return ((mtu >= 576) && (mtu <= 61440));
-	case QETH_CARD_TYPE_IQD:
-		return ((mtu >= 576) && (mtu <= card->max_mtu + 4096 - 32));
+		return 0;
+#else
 	default:
-		return 1;
+		return IFF_NOARP;
+#endif
 	}
 }
 
 inline static int
 qeth_get_initial_mtu_for_card(struct qeth_card * card)
 {
-	switch (card->type) {
+	switch (card->info.type) {
 	case QETH_CARD_TYPE_UNKNOWN:
 		return 1500;
 	case QETH_CARD_TYPE_IQD:
-		return card->max_mtu;
+		return card->info.max_mtu;
 	case QETH_CARD_TYPE_OSAE:
-		switch (card->link_type) {
-		case QETH_MPC_LINK_TYPE_HSTR:
-		case QETH_MPC_LINK_TYPE_LANE_TR:
+		switch (card->info.link_type) {
+		case QETH_LINK_TYPE_HSTR:
+		case QETH_LINK_TYPE_LANE_TR:
 			return 2000;
 		default:
 			return 1492;
@@ -1195,39 +837,50 @@ qeth_get_mtu_outof_framesize(int framesi
 }
 
 inline static int
-qeth_get_buffersize_for_card(int cardtype)
+qeth_mtu_is_valid(struct qeth_card * card, int mtu)
 {
-	switch (cardtype) {
-	case QETH_CARD_TYPE_UNKNOWN:
-		return 65536;
+	switch (card->info.type) {
 	case QETH_CARD_TYPE_OSAE:
-		return 65536;
+		return ((mtu >= 576) && (mtu <= 61440));
 	case QETH_CARD_TYPE_IQD:
-		return 16384;
+		return ((mtu >= 576) &&
+			(mtu <= card->info.max_mtu + 4096 - 32));
+	case QETH_CARD_TYPE_UNKNOWN:
 	default:
-		return 65536;
+		return 1;
 	}
 }
 
 inline static int
-qeth_get_min_number_of_buffers(int cardtype)
+qeth_get_arphdr_type(int cardtype, int linktype)
 {
 	switch (cardtype) {
-	case QETH_CARD_TYPE_UNKNOWN:
-		return 32;
 	case QETH_CARD_TYPE_OSAE:
-		return 32;
+		switch (linktype) {
+		case QETH_LINK_TYPE_LANE_TR:
+		case QETH_LINK_TYPE_HSTR:
+			return ARPHRD_IEEE802_TR;
+		default:
+			return ARPHRD_ETHER;
+		}
 	case QETH_CARD_TYPE_IQD:
-		return 64;
 	default:
-		return 64;
+		return ARPHRD_ETHER;
 	}
 }
 
+#ifdef CONFIG_QETH_PERF_STATS
 inline static int
-qeth_get_q_format(int cardtype)
+qeth_get_micros(void)
 {
-	switch (cardtype) {
+	return (int) (get_clock() >> 12);
+}
+#endif
+
+static inline int
+qeth_get_qdio_q_format(struct qeth_card *card)
+{
+	switch (card->info.type) {
 	case QETH_CARD_TYPE_IQD:
 		return 2;
 	default:
@@ -1235,100 +888,120 @@ qeth_get_q_format(int cardtype)
 	}
 }
 
-inline static int
-qeth_get_device_tx_q_len(int cardtype)
+static inline void
+qeth_ipaddr4_to_string(const __u8 *addr, char *buf)
 {
-	return 100;
+	sprintf(buf, "%i.%i.%i.%i", addr[0], addr[1], addr[2], addr[3]);
 }
 
-inline static int
-qeth_get_max_number_of_buffers(int cardtype)
+static inline int
+qeth_string_to_ipaddr4(const char *buf, __u8 *addr)
 {
-	return 127;
+	const char *start, *end;
+	char abuf[4];
+	char *tmp;
+	int len;
+	int i;
+
+	start = buf;
+	for (i = 0; i < 3; i++) {
+		if (!(end = strchr(start, '.')))
+			return -EINVAL;
+		len = end - start;
+		memset(abuf, 0, 4);
+		strncpy(abuf, start, len);
+		addr[i] = simple_strtoul(abuf, &tmp, 10);
+		start = end + 1;
+	}
+	memset(abuf, 0, 4);
+	strcpy(abuf, start);
+	addr[3] = simple_strtoul(abuf, &tmp, 10);
+	return 0;
+}
+
+static inline void
+qeth_ipaddr6_to_string(const __u8 *addr, char *buf)
+{
+	sprintf(buf, "%02x%02x:%02x%02x:%02x%02x:%02x%02x"
+		     ":%02x%02x:%02x%02x:%02x%02x:%02x%02x",
+		     addr[0], addr[1], addr[2], addr[3],
+		     addr[4], addr[5], addr[6], addr[7],
+		     addr[8], addr[9], addr[10], addr[11],
+		     addr[12], addr[13], addr[14], addr[15]);
 }
 
-/******************** OUTPUT FACILITIES **************************/
-
-#ifdef PRINT_INFO
-#undef PRINTK_HEADER
-#undef PRINT_STUPID
-#undef PRINT_ALL
-#undef PRINT_INFO
-#undef PRINT_WARN
-#undef PRINT_ERR
-#undef PRINT_CRIT
-#undef PRINT_ALERT
-#undef PRINT_EMERG
-#endif				/* PRINT_INFO */
-
-#define PRINTK_HEADER QETH_NAME ": "
-
-#if QETH_VERBOSE_LEVEL>8
-#define PRINT_STUPID(x...) printk( KERN_DEBUG PRINTK_HEADER x)
-#else
-#define PRINT_STUPID(x...)
-#endif
+static inline int
+qeth_string_to_ipaddr6(const char *buf, __u8 *addr)
+{
+	const char *start, *end;
+	u16 *tmp_addr;
+	char abuf[5];
+	char *tmp;
+	int len;
+	int i;
+
+	tmp_addr = (u16 *)addr;
+	start = buf;
+	for (i = 0; i < 7; i++) {
+		if (!(end = strchr(start, ':')))
+			return -EINVAL;
+		len = end - start;
+		memset(abuf, 0, 5);
+		strncpy(abuf, start, len);
+		tmp_addr[i] = simple_strtoul(abuf, &tmp, 16);
+		start = end + 1;
+	}
+	memset(abuf, 0, 5);
+	strcpy(abuf, start);
+	tmp_addr[7] = simple_strtoul(abuf, &tmp, 16);
+	return 0;
+}
+
+static inline void
+qeth_ipaddr_to_string(enum qeth_prot_versions proto, const __u8 *addr,
+		      char *buf)
+{
+	if (proto == QETH_PROT_IPV4)
+		return qeth_ipaddr4_to_string(addr, buf);
+	else if (proto == QETH_PROT_IPV6)
+		return qeth_ipaddr6_to_string(addr, buf);
+}
 
-#if QETH_VERBOSE_LEVEL>7
-#define PRINT_ALL(x...) printk( KERN_DEBUG PRINTK_HEADER x)
-#else
-#define PRINT_ALL(x...)
-#endif
+static inline int
+qeth_string_to_ipaddr(const char *buf, enum qeth_prot_versions proto,
+		      __u8 *addr)
+{
+	if (proto == QETH_PROT_IPV4)
+		return qeth_string_to_ipaddr4(buf, addr);
+	else if (proto == QETH_PROT_IPV6)
+		return qeth_string_to_ipaddr6(buf, addr);
+	else
+		return -EINVAL;
+}
 
-#if QETH_VERBOSE_LEVEL>6
-#define PRINT_INFO(x...) printk( KERN_INFO PRINTK_HEADER x)
-#else
-#define PRINT_INFO(x...)
-#endif
+extern int
+qeth_setrouting_v4(struct qeth_card *);
+extern int
+qeth_setrouting_v6(struct qeth_card *);
 
-#if QETH_VERBOSE_LEVEL>5
-#define PRINT_WARN(x...) printk( KERN_WARNING PRINTK_HEADER x)
-#else
-#define PRINT_WARN(x...)
-#endif
+int
+qeth_add_ipato_entry(struct qeth_card *, struct qeth_ipato_entry *);
 
-#if QETH_VERBOSE_LEVEL>4
-#define PRINT_ERR(x...) printk( KERN_ERR PRINTK_HEADER x)
-#else
-#define PRINT_ERR(x...)
-#endif
+void
+qeth_del_ipato_entry(struct qeth_card *, enum qeth_prot_versions, u8 *, int);
 
-#if QETH_VERBOSE_LEVEL>3
-#define PRINT_CRIT(x...) printk( KERN_CRIT PRINTK_HEADER x)
-#else
-#define PRINT_CRIT(x...)
-#endif
+int
+qeth_add_vipa(struct qeth_card *, enum qeth_prot_versions, const u8 *);
 
-#if QETH_VERBOSE_LEVEL>2
-#define PRINT_ALERT(x...) printk( KERN_ALERT PRINTK_HEADER x)
-#else
-#define PRINT_ALERT(x...)
-#endif
+void
+qeth_del_vipa(struct qeth_card *, enum qeth_prot_versions, const u8 *);
 
-#if QETH_VERBOSE_LEVEL>1
-#define PRINT_EMERG(x...) printk( KERN_EMERG PRINTK_HEADER x)
-#else
-#define PRINT_EMERG(x...)
-#endif
+int
+qeth_add_rxip(struct qeth_card *, enum qeth_prot_versions, const u8 *);
 
-#define HEXDUMP16(importance,header,ptr) \
-PRINT_##importance(header "%02x %02x %02x %02x  %02x %02x %02x %02x  " \
-		   "%02x %02x %02x %02x  %02x %02x %02x %02x\n", \
-		   *(((char*)ptr)),*(((char*)ptr)+1),*(((char*)ptr)+2), \
-		   *(((char*)ptr)+3),*(((char*)ptr)+4),*(((char*)ptr)+5), \
-		   *(((char*)ptr)+6),*(((char*)ptr)+7),*(((char*)ptr)+8), \
-		   *(((char*)ptr)+9),*(((char*)ptr)+10),*(((char*)ptr)+11), \
-		   *(((char*)ptr)+12),*(((char*)ptr)+13), \
-		   *(((char*)ptr)+14),*(((char*)ptr)+15)); \
-PRINT_##importance(header "%02x %02x %02x %02x  %02x %02x %02x %02x  " \
-		   "%02x %02x %02x %02x  %02x %02x %02x %02x\n", \
-		   *(((char*)ptr)+16),*(((char*)ptr)+17), \
-		   *(((char*)ptr)+18),*(((char*)ptr)+19), \
-		   *(((char*)ptr)+20),*(((char*)ptr)+21), \
-		   *(((char*)ptr)+22),*(((char*)ptr)+23), \
-		   *(((char*)ptr)+24),*(((char*)ptr)+25), \
-		   *(((char*)ptr)+26),*(((char*)ptr)+27), \
-		   *(((char*)ptr)+28),*(((char*)ptr)+29), \
-		   *(((char*)ptr)+30),*(((char*)ptr)+31));
+void
+qeth_del_rxip(struct qeth_card *, enum qeth_prot_versions, const u8 *);
 
+void
+qeth_schedule_recovery(struct qeth_card *);
 #endif /* __QETH_H__ */
--- diff/drivers/s390/net/qeth_mpc.c	2003-07-08 09:55:18.000000000 +0100
+++ source/drivers/s390/net/qeth_mpc.c	2004-04-21 10:45:34.655435072 +0100
@@ -4,7 +4,8 @@
  * Linux on zSeries OSA Express and HiperSockets support
  *
  * Copyright 2000,2003 IBM Corporation
- * Author(s): Utz Bacher <utz.bacher@de.ibm.com>
+ * Author(s): Frank Pavlic <pavlic@de.ibm.com>
+ * 	      Thomas Spatzier <tspat@de.ibm.com>
  *
  */
 #include <asm/cio.h>
@@ -126,16 +127,22 @@ unsigned char DM_ACT[]={
 unsigned char IPA_PDU_HEADER[]={
 	0x00,0xe0,0x00,0x00, 0x77,0x77,0x77,0x77,
 	0x00,0x00,0x00,0x14, 0x00,0x00,
-		(IPA_PDU_HEADER_SIZE+sizeof(struct ipa_cmd))/256,
-		(IPA_PDU_HEADER_SIZE+sizeof(struct ipa_cmd))%256,
+		(IPA_PDU_HEADER_SIZE+sizeof(struct qeth_ipa_cmd))/256,
+		(IPA_PDU_HEADER_SIZE+sizeof(struct qeth_ipa_cmd))%256,
 	0x10,0x00,0x00,0x01,
 	0x00,0x00,0x00,0x00,
 	0xc1,0x03,0x00,0x01, 0x00,0x00,0x00,0x00,
-	0x00,0x00,0x00,0x00, 0x00,0x24,0x00,sizeof(struct ipa_cmd),
-	0x00,0x00,sizeof(struct ipa_cmd),0x05, 0x77,0x77,0x77,0x77,
+	0x00,0x00,0x00,0x00, 0x00,0x24,
+		sizeof(struct qeth_ipa_cmd)/256,
+		sizeof(struct qeth_ipa_cmd)%256,
+	0x00,
+		sizeof(struct qeth_ipa_cmd)/256,
+		sizeof(struct qeth_ipa_cmd),0x05, 0x77,0x77,0x77,0x77,
 	0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
-	0x01,0x00,sizeof(struct ipa_cmd)/256,sizeof(struct ipa_cmd)%256,
-				0x00,0x00,0x00,0x40,
+	0x01,0x00,
+		sizeof(struct qeth_ipa_cmd)/256,
+		sizeof(struct qeth_ipa_cmd)%256,
+	0x00,0x00,0x00,0x40,
 };
 
 unsigned char WRITE_CCW[]={
@@ -158,4 +165,3 @@ unsigned char READ_CCW[]={
 
 
 
-
--- diff/drivers/s390/net/qeth_mpc.h	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/s390/net/qeth_mpc.h	2004-04-21 10:45:34.664433704 +0100
@@ -5,215 +5,279 @@
  *
  * Copyright 2000,2003 IBM Corporation
  * Author(s): Utz Bacher <utz.bacher@de.ibm.com>
+ *            Thomas Spatzier <tspat@de.ibm.com>
+ *            Frank Pavlic <pavlic@de.ibm.com>
  *
  */
 #ifndef __QETH_MPC_H__
 #define __QETH_MPC_H__
 
-#define VERSION_QETH_MPC_H "$Revision: 1.18 $"
+#include <asm/qeth.h>
 
-#define QETH_IPA_TIMEOUT (card->ipa_timeout)
-#define QETH_MPC_TIMEOUT 2000
-#define QETH_ADDR_TIMEOUT 1000
+#define VERSION_QETH_MPC_H "$Revision: 1.27 $"
 
-#define QETH_SETIP_RETRIES 2
-
-#define IDX_ACTIVATE_SIZE 0x22
-#define CM_ENABLE_SIZE 0x63
-#define CM_SETUP_SIZE 0x64
-#define ULP_ENABLE_SIZE 0x6b
-#define ULP_SETUP_SIZE 0x6c
-#define DM_ACT_SIZE 0x55
-
-#define QETH_MPC_TOKEN_LENGTH 4
-#define QETH_SEQ_NO_LENGTH 4
-#define QETH_IPA_SEQ_NO_LENGTH 2
-
-#define QETH_TRANSPORT_HEADER_SEQ_NO(buffer) (buffer+4)
-#define QETH_PDU_HEADER_SEQ_NO(buffer) (buffer+0x1c)
-#define QETH_PDU_HEADER_ACK_SEQ_NO(buffer) (buffer+0x20)
-
-extern unsigned char IDX_ACTIVATE_READ[];
+#define IPA_PDU_HEADER_SIZE	0x40
+#define QETH_IPA_PDU_LEN_TOTAL(buffer) (buffer+0x0e)
+#define QETH_IPA_PDU_LEN_PDU1(buffer) (buffer+0x26)
+#define QETH_IPA_PDU_LEN_PDU2(buffer) (buffer+0x2a)
+#define QETH_IPA_PDU_LEN_PDU3(buffer) (buffer+0x3a)
 
-extern unsigned char IDX_ACTIVATE_WRITE[];
+extern unsigned char IPA_PDU_HEADER[];
+#define QETH_IPA_CMD_DEST_ADDR(buffer) (buffer+0x2c)
 
-#define QETH_IDX_ACT_ISSUER_RM_TOKEN(buffer) (buffer+0x0c)
-#define QETH_IDX_NO_PORTNAME_REQUIRED(buffer) ((buffer)[0x0b]&0x80)
-#define QETH_IDX_ACT_FUNC_LEVEL(buffer) (buffer+0x10)
-#define QETH_IDX_ACT_DATASET_NAME(buffer) (buffer+0x16)
-#define QETH_IDX_ACT_QDIO_DEV_CUA(buffer) (buffer+0x1e)
-#define QETH_IDX_ACT_QDIO_DEV_REALADDR(buffer) (buffer+0x20)
+#define IPA_CMD_LENGTH	(IPA_PDU_HEADER_SIZE + sizeof(struct qeth_ipa_cmd))
 
-#define QETH_IS_IDX_ACT_POS_REPLY(buffer) (((buffer)[0x08]&3)==2)
+#define QETH_SEQ_NO_LENGTH 	4
+#define QETH_MPC_TOKEN_LENGTH 	4
+#define QETH_MCL_LENGTH		4
+#define OSA_ADDR_LEN		6
+
+#define QETH_TIMEOUT 		(10 * HZ)
+#define QETH_IDX_COMMAND_SEQNO 	-1
+#define SR_INFO_LEN		16
+
+#define QETH_CLEAR_CHANNEL_PARM	-10
+#define QETH_HALT_CHANNEL_PARM	-11
+
+/*****************************************************************************/
+/* IP Assist related definitions                                             */
+/*****************************************************************************/
+#define IPA_CMD_INITIATOR_HOST  0x00
+#define IPA_CMD_INITIATOR_HYDRA 0x01
+#define IPA_CMD_PRIM_VERSION_NO 0x01
+
+enum qeth_card_types {
+	QETH_CARD_TYPE_UNKNOWN = 0,
+	QETH_CARD_TYPE_OSAE    = 10,
+	QETH_CARD_TYPE_IQD     = 1234,
+};
 
-#define QETH_IDX_REPLY_LEVEL(buffer) (buffer+0x12)
-#define QETH_MCL_LENGTH 4
+#define QETH_MPC_DIFINFO_LEN_INDICATES_LINK_TYPE 0x18
+/* only the first two bytes are looked at in qeth_get_cardname_short */
+enum qeth_link_types {
+	QETH_LINK_TYPE_FAST_ETH     = 0x01,
+	QETH_LINK_TYPE_HSTR         = 0x02,
+	QETH_LINK_TYPE_GBIT_ETH     = 0x03,
+	QETH_LINK_TYPE_10GBIT_ETH   = 0x10,
+	QETH_LINK_TYPE_LANE_ETH100  = 0x81,
+	QETH_LINK_TYPE_LANE_TR      = 0x82,
+	QETH_LINK_TYPE_LANE_ETH1000 = 0x83,
+	QETH_LINK_TYPE_LANE         = 0x88,
+	QETH_LINK_TYPE_ATM_NATIVE   = 0x90,
+};
 
-extern unsigned char CM_ENABLE[];
+enum qeth_tr_macaddr_modes {
+	QETH_TR_MACADDR_NONCANONICAL = 0,
+	QETH_TR_MACADDR_CANONICAL    = 1,
+};
 
-#define QETH_CM_ENABLE_ISSUER_RM_TOKEN(buffer) (buffer+0x2c)
-#define QETH_CM_ENABLE_FILTER_TOKEN(buffer) (buffer+0x53)
-#define QETH_CM_ENABLE_USER_DATA(buffer) (buffer+0x5b)
+enum qeth_tr_broadcast_modes {
+	QETH_TR_BROADCAST_ALLRINGS = 0,
+	QETH_TR_BROADCAST_LOCAL    = 1,
+};
 
-#define QETH_CM_ENABLE_RESP_FILTER_TOKEN(buffer) (PDU_ENCAPSULATION(buffer)+ \
-						  0x13)
+/* these values match CHECKSUM_* in include/linux/skbuff.h */
+enum qeth_checksum_types {
+	SW_CHECKSUMMING = 0, /* TODO: set to bit flag used in IPA Command */
+	HW_CHECKSUMMING = 1,
+	NO_CHECKSUMMING = 2,
+};
+#define QETH_CHECKSUM_DEFAULT SW_CHECKSUMMING
 
-extern unsigned char CM_SETUP[];
+/*
+ * Routing stuff
+ */
+#define RESET_ROUTING_FLAG 0x10 /* indicate that routing type shall be set */
+enum qeth_routing_types {
+	NO_ROUTER           = 0, /* TODO: set to bit flag used in IPA Command */
+	PRIMARY_ROUTER      = 1,
+	SECONDARY_ROUTER    = 2,
+	MULTICAST_ROUTER    = 3,
+	PRIMARY_CONNECTOR   = 4,
+	SECONDARY_CONNECTOR = 5,
+};
 
-#define QETH_CM_SETUP_DEST_ADDR(buffer) (buffer+0x2c)
-#define QETH_CM_SETUP_CONNECTION_TOKEN(buffer) (buffer+0x51)
-#define QETH_CM_SETUP_FILTER_TOKEN(buffer) (buffer+0x5a)
 
-#define QETH_CM_SETUP_RESP_DEST_ADDR(buffer) (PDU_ENCAPSULATION(buffer)+ \
-					      0x1a)
+/* IPA Commands */
+enum qeth_ipa_cmds {
+	IPA_CMD_STARTLAN              = 0x01,
+	IPA_CMD_STOPLAN               = 0x02,
+	IPA_CMD_SETIP                 = 0xb1,
+	IPA_CMD_DELIP                 = 0xb7,
+	IPA_CMD_QIPASSIST             = 0xb2,
+	IPA_CMD_SETASSPARMS           = 0xb3,
+	IPA_CMD_SETIPM                = 0xb4,
+	IPA_CMD_DELIPM                = 0xb5,
+	IPA_CMD_SETRTG                = 0xb6,
+	IPA_CMD_SETADAPTERPARMS       = 0xb8,
+	IPA_CMD_IPFRAME               = 0xb9,
+	IPA_CMD_ADD_ADDR_ENTRY        = 0xc1,
+	IPA_CMD_DELETE_ADDR_ENTRY     = 0xc2,
+	IPA_CMD_CREATE_ADDR           = 0xc3,
+	IPA_CMD_DESTROY_ADDR          = 0xc4,
+	IPA_CMD_REGISTER_LOCAL_ADDR   = 0xd1,
+	IPA_CMD_UNREGISTER_LOCAL_ADDR = 0xd2,
+};
 
-extern unsigned char ULP_ENABLE[];
+enum qeth_ip_ass_cmds {
+	IPA_CMD_ASS_START	= 0x0001,
+	IPA_CMD_ASS_STOP	= 0x0002,
+	IPA_CMD_ASS_CONFIGURE 	= 0x0003,
+	IPA_CMD_ASS_ENABLE 	= 0x0004,
+};
 
-#define QETH_ULP_ENABLE_LINKNUM(buffer) (buffer+0x61)
-#define QETH_ULP_ENABLE_DEST_ADDR(buffer) (buffer+0x2c)
-#define QETH_ULP_ENABLE_FILTER_TOKEN(buffer) (buffer+0x53)
-#define QETH_ULP_ENABLE_PORTNAME_AND_LL(buffer) (buffer+0x62)
+enum qeth_arp_process_subcmds {
+	IPA_CMD_ASS_ARP_SET_NO_ENTRIES 	= 0x0003,
+	IPA_CMD_ASS_ARP_QUERY_CACHE 	= 0x0004,
+	IPA_CMD_ASS_ARP_ADD_ENTRY 	= 0x0005,
+	IPA_CMD_ASS_ARP_REMOVE_ENTRY 	= 0x0006,
+	IPA_CMD_ASS_ARP_FLUSH_CACHE 	= 0x0007,
+	IPA_CMD_ASS_ARP_QUERY_INFO 	= 0x0104,
+	IPA_CMD_ASS_ARP_QUERY_STATS 	= 0x0204,
+};
 
-#define QETH_ULP_ENABLE_RESP_FILTER_TOKEN(buffer) (PDU_ENCAPSULATION(buffer)+ \
-						   0x13)
-#define QETH_ULP_ENABLE_RESP_MAX_MTU(buffer) (PDU_ENCAPSULATION(buffer)+ 0x1f)
-#define QETH_ULP_ENABLE_RESP_DIFINFO_LEN(buffer) (PDU_ENCAPSULATION(buffer)+ \
-					  	  0x17)
-#define QETH_ULP_ENABLE_RESP_LINK_TYPE(buffer) (PDU_ENCAPSULATION(buffer)+ \
-						0x2b)
+/* Return Codes for IPA Commands */
+enum qeth_ipa_return_codes {
+	IPA_RC_SUCCESS             = 0x0000,
+	IPA_RC_NOTSUPP             = 0x0001,
+	IPA_RC_NO_ACCESS           = 0x0002,
+	IPA_RC_FAILED              = 0x0003,
+	IPA_RC_DATA_MISMATCH       = 0xe001,
+	IPA_RC_INVALID_LAN_TYPE    = 0xe003,
+	IPA_RC_INVALID_LAN_NO      = 0xe004,
+	IPA_RC_IPADDR_ALREADY_REG  = 0xe005,
+	IPA_RC_IPADDR_TABLE_FULL   = 0xe006,
+	IPA_RC_IPADDR_ALREADY_USED = 0xe00a,
+	IPA_RC_ASSNO_NOT_SUPP      = 0xe00d,
+	IPA_RC_ASSCMD_START_FAILED = 0xe00e,
+	IPA_RC_ASSCMD_PART_SUCCESS = 0xe00f,
+	IPA_RC_IPADDR_NOT_DEFINED  = 0xe010,
+	IPA_RC_LAN_OFFLINE         = 0xe080,
+};
 
-extern unsigned char ULP_SETUP[];
+/* IPA function flags; each flag marks availability of respective function */
+enum qeth_ipa_funcs {
+	IPA_ARP_PROCESSING      = 0x00000001L,
+	IPA_INBOUND_CHECKSUM    = 0x00000002L,
+	IPA_OUTBOUND_CHECKSUM   = 0x00000004L,
+	IPA_IP_FRAGMENTATION    = 0x00000008L,
+	IPA_FILTERING           = 0x00000010L,
+	IPA_IPV6                = 0x00000020L,
+	IPA_MULTICASTING        = 0x00000040L,
+	IPA_IP_REASSEMBLY       = 0x00000080L,
+	IPA_QUERY_ARP_COUNTERS  = 0x00000100L,
+	IPA_QUERY_ARP_ADDR_INFO = 0x00000200L,
+	IPA_SETADAPTERPARMS     = 0x00000400L,
+	IPA_VLAN_PRIO           = 0x00000800L,
+	IPA_PASSTHRU            = 0x00001000L,
+	IPA_FULL_VLAN           = 0x00004000L,
+	IPA_SOURCE_MAC          = 0x00010000L,
+	IPA_OSA_MC_ROUTER       = 0x00020000L,
+};
 
-#define QETH_ULP_SETUP_DEST_ADDR(buffer) (buffer+0x2c)
-#define QETH_ULP_SETUP_CONNECTION_TOKEN(buffer) (buffer+0x51)
-#define QETH_ULP_SETUP_FILTER_TOKEN(buffer) (buffer+0x5a)
-#define QETH_ULP_SETUP_CUA(buffer) (buffer+0x68)
-#define QETH_ULP_SETUP_REAL_DEVADDR(buffer) (buffer+0x6a)
+/* SETIP/DELIP IPA Command: ***************************************************/
+enum qeth_ipa_setdelip_flags {
+	QETH_IPA_SETDELIP_DEFAULT          = 0x00L, /* default */
+	QETH_IPA_SETIP_VIPA_FLAG           = 0x01L, /* no grat. ARP */
+	QETH_IPA_SETIP_TAKEOVER_FLAG       = 0x02L, /* nofail on grat. ARP */
+	QETH_IPA_DELIP_ADDR_2_B_TAKEN_OVER = 0x20L,
+	QETH_IPA_DELIP_VIPA_FLAG           = 0x40L,
+	QETH_IPA_DELIP_ADDR_NEEDS_SETIP    = 0x80L,
+};
 
-#define QETH_ULP_SETUP_RESP_CONNECTION_TOKEN(buffer) (PDU_ENCAPSULATION \
-						      (buffer)+0x1a)
+/* SETADAPTER IPA Command: ****************************************************/
+enum qeth_ipa_setadp_cmd {
+	IPA_SETADP_QUERY_COMMANDS_SUPPORTED	= 0x01,
+	IPA_SETADP_ALTER_MAC_ADDRESS 		= 0x02,
+	IPA_SETADP_ADD_DELETE_GROUP_ADDRESS 	= 0x04,
+	IPA_SETADP_ADD_DELETE_FUNCTIONAL_ADDR 	= 0x08,
+	IPA_SETADP_SET_ADDRESSING_MODE 		= 0x10,
+	IPA_SETADP_SET_CONFIG_PARMS 		= 0x20,
+	IPA_SETADP_SET_CONFIG_PARMS_EXTENDED 	= 0x40,
+	IPA_SETADP_SET_BROADCAST_MODE 		= 0x80,
+	IPA_SETADP_SEND_OSA_MESSAGE 		= 0x0100,
+	IPA_SETADP_SET_SNMP_CONTROL 		= 0x0200,
+	IPA_SETADP_READ_SNMP_PARMS 		= 0x0400,
+	IPA_SETADP_WRITE_SNMP_PARMS 		= 0x0800,
+	IPA_SETADP_QUERY_CARD_INFO 		= 0x1000,
+};
+enum qeth_ipa_mac_ops {
+	CHANGE_ADDR_READ_MAC 		= 0,
+	CHANGE_ADDR_REPLACE_MAC 	= 1,
+	CHANGE_ADDR_ADD_MAC 		= 2,
+	CHANGE_ADDR_DEL_MAC 		= 4,
+	CHANGE_ADDR_RESET_MAC 		= 8,
+};
+enum qeth_ipa_addr_ops {
+	CHANGE_ADDR_READ_ADDR 		= 0,
+	CHANGE_ADDR_ADD_ADDR 		= 1,
+	CHANGE_ADDR_DEL_ADDR 		= 2,
+	CHANGE_ADDR_FLUSH_ADDR_TABLE 	= 4,
 
-extern unsigned char DM_ACT[];
 
-#define QETH_DM_ACT_DEST_ADDR(buffer) (buffer+0x2c)
-#define QETH_DM_ACT_CONNECTION_TOKEN(buffer) (buffer+0x51)
+};
+/* (SET)DELIP(M) IPA stuff ***************************************************/
+struct qeth_ipacmd_setdelip4 {
+	__u8   ip_addr[4];
+	__u8   mask[4];
+	__u32  flags;
+} __attribute__ ((packed));
+
+struct qeth_ipacmd_setdelip6 {
+	__u8   ip_addr[16];
+	__u8   mask[16];
+	__u32  flags;
+} __attribute__ ((packed));
+
+struct qeth_ipacmd_setdelipm {
+	__u8 mac[6];
+	__u8 padding[2];
+	__u8 ip6[12];
+	__u8 ip4[4];
+} __attribute__ ((packed));
+
+struct qeth_ipacmd_setassparms_hdr {
+	__u32 assist_no;
+	__u16 length;
+	__u16 command_code;
+	__u16 return_code;
+	__u8 number_of_replies;
+	__u8 seq_no;
+} __attribute__((packed));
+
+/* SETASSPARMS IPA Command: */
+struct qeth_ipacmd_setassparms {
+	struct qeth_ipacmd_setassparms_hdr hdr;
+	union {
+		__u32 flags_32bit;
+		struct qeth_arp_cache_entry add_arp_entry;
+		__u8 ip[16];
+	} data;
+} __attribute__ ((packed));
 
-#define IPA_CMD_STARTLAN 0x01
-#define IPA_CMD_STOPLAN 0x02
-#define IPA_CMD_SETIP 0xb1
-#define IPA_CMD_DELIP 0xb7
-#define IPA_CMD_QIPASSIST 0xb2
-#define IPA_CMD_SETASSPARMS 0xb3
-#define IPA_CMD_SETIPM 0xb4
-#define IPA_CMD_DELIPM 0xb5
-#define IPA_CMD_SETRTG 0xb6
-#define IPA_CMD_SETADAPTERPARMS 0xb8
-#define IPA_CMD_ADD_ADDR_ENTRY 0xc1
-#define IPA_CMD_DELETE_ADDR_ENTRY 0xc2
-#define IPA_CMD_CREATE_ADDR 0xc3
-#define IPA_CMD_DESTROY_ADDR 0xc4
-#define IPA_CMD_REGISTER_LOCAL_ADDR 0xd1
-#define IPA_CMD_UNREGISTER_LOCAL_ADDR 0xd2
-
-#define INITIATOR_HOST 0
-#define INITIATOR_HYDRA 1
-
-#define PRIM_VERSION_IPA 1
-
-#define PROT_VERSION_SNA 1 /* hahaha */
-#define PROT_VERSION_IPv4 4
-#define PROT_VERSION_IPv6 6
-
-#define OSA_ADDR_LEN 6
-#define IPA_SETADAPTERPARMS_IP_VERSION PROT_VERSION_IPv4
-#define SR_INFO_LEN 16
-
-#define IPA_ARP_PROCESSING 0x00000001L
-#define IPA_INBOUND_CHECKSUM 0x00000002L
-#define IPA_OUTBOUND_CHECKSUM 0x00000004L
-#define IPA_IP_FRAGMENTATION 0x00000008L
-#define IPA_FILTERING 0x00000010L
-#define IPA_IPv6 0x00000020L
-#define IPA_MULTICASTING 0x00000040L
-#define IPA_IP_REASSEMBLY 0x00000080L
-#define IPA_QUERY_ARP_COUNTERS 0x00000100L
-#define IPA_QUERY_ARP_ADDR_INFO 0x00000200L
-#define IPA_SETADAPTERPARMS 0x00000400L
-#define IPA_VLAN_PRIO 0x00000800L
-#define IPA_PASSTHRU 0x00001000L
-#define IPA_FULL_VLAN 0x00004000L
-#define IPA_SOURCE_MAC_AVAIL 0x00010000L
-#define IPA_OSA_MC_ROUTER_AVAIL 0x00020000L
-
-#define IPA_SETADP_QUERY_COMMANDS_SUPPORTED 0x01
-#define IPA_SETADP_ALTER_MAC_ADDRESS 0x02
-#define IPA_SETADP_ADD_DELETE_GROUP_ADDRESS 0x04
-#define IPA_SETADP_ADD_DELETE_FUNCTIONAL_ADDR 0x08
-#define IPA_SETADP_SET_ADDRESSING_MODE 0x10
-#define IPA_SETADP_SET_CONFIG_PARMS 0x20
-#define IPA_SETADP_SET_CONFIG_PARMS_EXTENDED 0x40
-#define IPA_SETADP_SET_BROADCAST_MODE 0x80
-#define IPA_SETADP_SEND_OSA_MESSAGE 0x0100
-#define IPA_SETADP_SET_SNMP_CONTROL 0x0200
-#define IPA_SETADP_READ_SNMP_PARMS 0x0400
-#define IPA_SETADP_WRITE_SNMP_PARMS 0x0800
-#define IPA_SETADP_QUERY_CARD_INFO 0x1000
-
-#define CHANGE_ADDR_READ_MAC 0
-#define CHANGE_ADDR_REPLACE_MAC 1
-#define CHANGE_ADDR_ADD_MAC 2
-#define CHANGE_ADDR_DEL_MAC 4
-#define CHANGE_ADDR_RESET_MAC 8
-#define CHANGE_ADDR_READ_ADDR 0
-#define CHANGE_ADDR_ADD_ADDR 1
-#define CHANGE_ADDR_DEL_ADDR 2
-#define CHANGE_ADDR_FLUSH_ADDR_TABLE 4
- 
-/* we assumed, that the card is named card */
-#define qeth_is_supported(str) (card->ipa_supported&str)
-#define qeth_is_supported6(str) (card->ipa6_supported&str)
-#define qeth_is_adp_supported(str) (card->adp_supported&str)
-
-/* the same for all assist parms: */
-#define IPA_CMD_ASS_START 0x0001
-#define IPA_CMD_ASS_STOP 0x0002
-
-#define IPA_CMD_ASS_CONFIGURE 0x0003
-#define IPA_CMD_ASS_ENABLE 0x0004
-
-#define IPA_CMD_ASS_ARP_SET_NO_ENTRIES 0x0003
-#define IPA_CMD_ASS_ARP_QUERY_CACHE 0x0004
-#define IPA_CMD_ASS_ARP_ADD_ENTRY 0x0005
-#define IPA_CMD_ASS_ARP_REMOVE_ENTRY 0x0006
-#define IPA_CMD_ASS_ARP_FLUSH_CACHE 0x0007
-#define IPA_CMD_ASS_ARP_QUERY_INFO 0x0104
-#define IPA_CMD_ASS_ARP_QUERY_STATS 0x0204
-
-#define IPA_CHECKSUM_DEFAULT_ENABLE_MASK 0x001a
-
-#define IPA_CMD_ASS_FILTER_SET_TYPES 0x0003
-
-#define IPA_CMD_ASS_IPv6_SET_FUNCTIONS 0x0003
-
-#define IPA_REPLY_SUCCESS 0
-#define IPA_REPLY_FAILED 1
-#define IPA_REPLY_OPNOTSUPP 2
-#define IPA_REPLY_OPNOTSUPP2 4
-#define IPA_REPLY_NOINFO 8
-
-#define IPA_SETIP_FLAGS 0
-#define IPA_SETIP_VIPA_FLAGS 1
-#define IPA_SETIP_TAKEOVER_FLAGS 2
-
-#define VIPA_2_B_ADDED 0
-#define VIPA_ESTABLISHED 1
-#define VIPA_2_B_REMOVED 2
 
-#define IPA_DELIP_FLAGS 0
+/* SETRTG IPA Command:    ****************************************************/
+struct qeth_set_routing {
+	__u8 type;
+};
 
-#define IPA_SETADP_CMDSIZE 40
+/* SETADAPTERPARMS IPA Command:    *******************************************/
+struct qeth_query_cmds_supp {
+	__u32 no_lantypes_supp;
+	__u8 lan_type;
+	__u8 reserved1[3];
+	__u32 supported_cmds;
+	__u8 reserved2[8];
+} __attribute__ ((packed));
+
+struct qeth_change_addr {
+	__u32 cmd;
+	__u32 addr_size;
+	__u32 no_macs;
+	__u8 addr[OSA_ADDR_LEN];
+} __attribute__ ((packed));
 
-struct ipa_setadp_cmd {
+struct qeth_ipacmd_setadpparms {
 	__u32 supp_hw_cmds;
 	__u32 reserved1;
 	__u16 cmdlength;
@@ -224,221 +288,197 @@ struct ipa_setadp_cmd {
 	__u8 frame_seq_no;
 	__u32 reserved3;
 	union {
-		struct {
-			__u32 no_lantypes_supp;
-			__u8 lan_type;
-			__u8 reserved1[3];
-			__u32 supported_cmds;
-			__u8 reserved2[8];
-		} query_cmds_supp;
-		struct {
-			__u32 cmd;
-			__u32 addr_size;
-			__u32 no_macs;
-			__u8 addr[OSA_ADDR_LEN];
-		} change_addr;
+		struct qeth_query_cmds_supp query_cmds_supp;
+		struct qeth_change_addr change_addr;
 		__u32 mode;
 	} data;
-};
+} __attribute__ ((packed));
 
-struct ipa_cmd{
-	__u8 command;
-	__u8 initiator;
-	__u16 seq_no;
-	__u16 return_code;
-	__u8 adapter_type;
-	__u8 rel_adapter_no;
-	__u8 prim_version_no;
-	__u8 param_count;
-	__u16 prot_version;
-	__u32 ipa_supported;
-	__u32 ipa_enabled;
-	union {
-		struct {
-			__u8 ip[4];
-			__u8 netmask[4];
-			__u32 flags;
-		} setdelip4;
-		struct {
-			__u8 ip[16];
-			__u8 netmask[16];
-			__u32 flags;
-		} setdelip6;
-		struct {
-			__u32 assist_no;
-			__u16 length;
-			__u16 command_code;
-			__u16 return_code;
-			__u8 number_of_replies;
-			__u8 seq_no;
-			union {
-				__u32 flags_32bit;
-				struct {
-					__u8 mac[6];
-					__u8 reserved[2];
-					__u8 ip[16];
-					__u8 reserved2[32];
-				} add_arp_entry;
-				__u8 ip[16];
-			} data;
-		} setassparms;
-		struct {
-			__u8 mac[6];
-			__u8 padding[2];
-			__u8 ip6[12];
-			__u8 ip4_6[4];
-		} setdelipm;
-		struct {
-			__u8 type;
-		} setrtg;
-		struct ipa_setadp_cmd setadapterparms;
-		struct {
-			__u32 command;
-#define ADDR_FRAME_TYPE_DIX 1
-#define ADDR_FRAME_TYPE_802_3 2
-#define ADDR_FRAME_TYPE_TR_WITHOUT_SR 0x10
-#define ADDR_FRAME_TYPE_TR_WITH_SR 0x20
-			__u32 frame_type;
-			__u32 cmd_flags;
-			__u8 ip_addr[16];
-			__u32 tag_field;
-			__u8 mac_addr[6];
-			__u8 reserved[10];
-			__u32 sr_len;
-			__u8 sr_info[SR_INFO_LEN];
-		} add_addr_entry;
-		struct {
-			__u32 command;
-			__u32 cmd_flags;
-			__u8 ip_addr[16];
-			__u32 tag_field;
-		} delete_addr_entry;
-		struct {
-			__u8 unique_id[8];
-		} create_destroy_addr;
-	} data;
-}__attribute__ ((packed));
+/* IPFRAME IPA Command:    ***************************************************/
+/* TODO: define in analogy to commands define above */
 
-#define QETH_IOC_MAGIC 0x22
-/* these don't really have 'unsigned long' arguments but were defined that way */
-#define QETH_IOCPROC_OSAEINTERFACES _IOWR(QETH_IOC_MAGIC, 1, unsigned long)
-#define QETH_IOCPROC_INTERFACECHANGES _IOWR(QETH_IOC_MAGIC, 2, unsigned long)
-
-#define SNMP_QUERY_CARD_INFO 0x00000002L
-#define SNMP_REGISETER_MIB   0x00000004L
-#define SNMP_GET_OID         0x00000010L
-#define SNMP_SET_OID         0x00000011L
-#define SNMP_GET_NEXT_OID    0x00000012L
-#define SNMP_QUERY_ALERTS    0x00000020L
-#define SNMP_SET_TRAP        0x00000021L
-
-
-#define ARP_DATA_SIZE 3968
-#define ARP_FLUSH -3
-#define ARP_RETURNCODE_NOARPDATA -2
-#define ARP_RETURNCODE_ERROR -1
-#define ARP_RETURNCODE_SUCCESS 0
-#define ARP_RETURNCODE_LASTREPLY 1
-
-#define SNMP_BASE_CMDLENGTH 44
-#define SNMP_SETADP_CMDLENGTH 16
-#define SNMP_REQUEST_DATA_OFFSET 16
+/* ADD_ADDR_ENTRY IPA Command:    ********************************************/
+/* TODO: define in analogy to commands define above */
 
-struct snmp_ipa_setadp_cmd {
-	__u32 supp_hw_cmds;
-	__u32 reserved1;
-	__u16 cmdlength;
-	__u16 reserved2;
-	__u32 command_code;
-	__u16 return_code;
-	__u8 frames_used_total;
-	__u8 frame_seq_no;
-	__u32 reserved3;
-	__u8 snmp_token[16];
+/* DELETE_ADDR_ENTRY IPA Command:    *****************************************/
+/* TODO: define in analogy to commands define above */
+
+/* CREATE_ADDR IPA Command:    ***********************************************/
+struct qeth_create_destroy_address {
+	__u8 unique_id[8];
+} __attribute__ ((packed));
+
+/* REGISTER_LOCAL_ADDR IPA Command:    ***************************************/
+/* TODO: define in analogy to commands define above */
+
+/* UNREGISTER_LOCAL_ADDR IPA Command:    *************************************/
+/* TODO: define in analogy to commands define above */
+
+/* Header for each IPA command */
+struct qeth_ipacmd_hdr {
+	__u8   command;
+	__u8   initiator;
+	__u16  seqno;
+	__u16  return_code;
+	__u8   adapter_type;
+	__u8   rel_adapter_no;
+	__u8   prim_version_no;
+	__u8   param_count;
+	__u16  prot_version;
+	__u32  ipa_supported;
+	__u32  ipa_enabled;
+} __attribute__ ((packed));
+
+/* The IPA command itself */
+struct qeth_ipa_cmd {
+	struct qeth_ipacmd_hdr hdr;
 	union {
-		struct {
-			__u32 snmp_request;
-			__u32 snmp_interface;
-			__u32 snmp_returncode;
-			__u32 snmp_firmwarelevel;
-			__u32 snmp_seqno;
-			__u8 snmp_data[ARP_DATA_SIZE];
-		} snmp_subcommand;
+		struct qeth_ipacmd_setdelip4   	setdelip4;
+		struct qeth_ipacmd_setdelip6   	setdelip6;
+		struct qeth_ipacmd_setdelipm	setdelipm;
+		struct qeth_ipacmd_setassparms 	setassparms;
+		struct qeth_create_destroy_address create_destroy_addr;
+		struct qeth_ipacmd_setadpparms 	setadapterparms;
+		struct qeth_set_routing setrtg;
 	} data;
-}__attribute__ ((packed));
+} __attribute__ ((packed));
 
+/*
+ * special command for ARP processing.
+ * this is not included in setassparms command before, because we get
+ * problem with the size of struct qeth_ipacmd_setassparms otherwise
+ */
+enum qeth_ipa_arp_return_codes {
+	QETH_IPA_ARP_RC_SUCCESS      = 0x0000,
+	QETH_IPA_ARP_RC_FAILED       = 0x0001,
+	QETH_IPA_ARP_RC_NOTSUPP      = 0x0002,
+	QETH_IPA_ARP_RC_OUT_OF_RANGE = 0x0003,
+	QETH_IPA_ARP_RC_Q_NOTSUPP    = 0x0004,
+	QETH_IPA_ARP_RC_Q_NO_DATA    = 0x0008,
+};
 
-struct arp_cmd {
-	__u8 command;
-	__u8 initiator;
-	__u16 seq_no;
-	__u16 return_code;
-	__u8 adapter_type;
-	__u8 rel_adapter_no;
-	__u8 prim_version_no;
-	__u8 param_count;
-	__u16 prot_version;
-	__u32 ipa_supported;
-	__u32 ipa_enabled;
+#define QETH_QARP_DATA_SIZE 3968
+struct qeth_arp_query_data {
+	__u16 request_bits;
+	__u16 reply_bits;
+	__u32 no_entries;
+	char data[QETH_QARP_DATA_SIZE];
+} __attribute__((packed));
+
+/* used as parameter for arp_query reply */
+struct qeth_arp_query_info {
+	__u32 udata_len;
+	__u32 udata_offset;
+	__u32 no_entries;
+	char *udata;
+};
+
+#define IPA_ARP_CMD_LEN (IPA_PDU_HEADER_SIZE+sizeof(struct qeth_ipa_arp_cmd))
+#define QETH_ARP_CMD_BASE_LEN (sizeof(struct qeth_ipacmd_hdr) + \
+			       sizeof(struct qeth_ipacmd_setassparms_hdr))
+#define QETH_IPA_ARP_DATA_POS(buffer) (buffer + IPA_PDU_HEADER_SIZE + \
+				       QETH_ARP_CMD_BASE_LEN)
+struct qeth_ipa_arp_cmd {
+	struct qeth_ipacmd_hdr ihdr;
+	struct qeth_ipacmd_setassparms_hdr shdr;
 	union {
-		struct {
-			__u32 assist_no;
-			__u16 length;
-			__u16 command_code;
-			__u16 return_code;
-			__u8 number_of_replies;
-			__u8 seq_no;
-			union {
-				struct {
-					__u16 tcpip_requestbitmask;
-					__u16 osa_setbitmask;
-					__u32 number_of_entries;
-					__u8 arp_data[ARP_DATA_SIZE];
-				} queryarp_data;
-			} data;
-		} setassparms;
-                struct snmp_ipa_setadp_cmd setadapterparms; 
+		struct qeth_arp_query_data query_arp;
 	} data;
-}__attribute__ ((packed));
+} __attribute__((packed));
 
 
+/* Helper functions */
+#define IS_IPA_REPLY(cmd) (cmd->hdr.initiator == IPA_CMD_INITIATOR_HOST)
 
-#define IPA_PDU_HEADER_SIZE 0x40
-#define QETH_IPA_PDU_LEN_TOTAL(buffer) (buffer+0x0e)
-#define QETH_IPA_PDU_LEN_PDU1(buffer) (buffer+0x26)
-#define QETH_IPA_PDU_LEN_PDU2(buffer) (buffer+0x2a)
-#define QETH_IPA_PDU_LEN_PDU3(buffer) (buffer+0x3a)
+/*****************************************************************************/
+/* END OF   IP Assist related definitions                                    */
+/*****************************************************************************/
 
-extern unsigned char IPA_PDU_HEADER[];
-
-#define QETH_IPA_CMD_DEST_ADDR(buffer) (buffer+0x2c)
 
-#define PDU_ENCAPSULATION(buffer) \
-	(buffer+ \
-	 *(buffer+ (*(buffer+0x0b))+ *(buffer+*(buffer+0x0b)+0x11) +0x07))
+extern unsigned char WRITE_CCW[];
+extern unsigned char READ_CCW[];
 
-#define IS_IPA(buffer) ((buffer) && ( *(buffer+ ((*(buffer+0x0b))+4) )==0xc1) )
+extern unsigned char CM_ENABLE[];
+#define CM_ENABLE_SIZE 0x63
+#define QETH_CM_ENABLE_ISSUER_RM_TOKEN(buffer) (buffer+0x2c)
+#define QETH_CM_ENABLE_FILTER_TOKEN(buffer) (buffer+0x53)
+#define QETH_CM_ENABLE_USER_DATA(buffer) (buffer+0x5b)
 
-#define IS_IPA_REPLY(buffer) ( (buffer) && ( (*(PDU_ENCAPSULATION(buffer)+1))==INITIATOR_HOST ) )
+#define QETH_CM_ENABLE_RESP_FILTER_TOKEN(buffer) \
+		(PDU_ENCAPSULATION(buffer)+ 0x13)
 
-#define CCW_NOP_CMD 0x03
-#define CCW_NOP_COUNT 1
 
-extern unsigned char WRITE_CCW[];
+extern unsigned char CM_SETUP[];
+#define CM_SETUP_SIZE 0x64
+#define QETH_CM_SETUP_DEST_ADDR(buffer) (buffer+0x2c)
+#define QETH_CM_SETUP_CONNECTION_TOKEN(buffer) (buffer+0x51)
+#define QETH_CM_SETUP_FILTER_TOKEN(buffer) (buffer+0x5a)
 
-extern unsigned char READ_CCW[];
+#define QETH_CM_SETUP_RESP_DEST_ADDR(buffer) \
+		(PDU_ENCAPSULATION(buffer) + 0x1a)
 
-#endif /* __QETH_MPC_H__ */
+extern unsigned char ULP_ENABLE[];
+#define ULP_ENABLE_SIZE 0x6b
+#define QETH_ULP_ENABLE_LINKNUM(buffer) (buffer+0x61)
+#define QETH_ULP_ENABLE_DEST_ADDR(buffer) (buffer+0x2c)
+#define QETH_ULP_ENABLE_FILTER_TOKEN(buffer) (buffer+0x53)
+#define QETH_ULP_ENABLE_PORTNAME_AND_LL(buffer) (buffer+0x62)
+#define QETH_ULP_ENABLE_RESP_FILTER_TOKEN(buffer) \
+		(PDU_ENCAPSULATION(buffer) + 0x13)
+#define QETH_ULP_ENABLE_RESP_MAX_MTU(buffer) \
+		(PDU_ENCAPSULATION(buffer)+ 0x1f)
+#define QETH_ULP_ENABLE_RESP_DIFINFO_LEN(buffer) \
+		(PDU_ENCAPSULATION(buffer) + 0x17)
+#define QETH_ULP_ENABLE_RESP_LINK_TYPE(buffer) \
+		(PDU_ENCAPSULATION(buffer)+ 0x2b)
 
+extern unsigned char ULP_SETUP[];
+#define ULP_SETUP_SIZE 0x6c
+#define QETH_ULP_SETUP_DEST_ADDR(buffer) (buffer+0x2c)
+#define QETH_ULP_SETUP_CONNECTION_TOKEN(buffer) (buffer+0x51)
+#define QETH_ULP_SETUP_FILTER_TOKEN(buffer) (buffer+0x5a)
+#define QETH_ULP_SETUP_CUA(buffer) (buffer+0x68)
+#define QETH_ULP_SETUP_REAL_DEVADDR(buffer) (buffer+0x6a)
 
+#define QETH_ULP_SETUP_RESP_CONNECTION_TOKEN(buffer) \
+		(PDU_ENCAPSULATION(buffer)+0x1a)
 
 
+extern unsigned char DM_ACT[];
+#define DM_ACT_SIZE 0x55
+#define QETH_DM_ACT_DEST_ADDR(buffer) (buffer+0x2c)
+#define QETH_DM_ACT_CONNECTION_TOKEN(buffer) (buffer+0x51)
 
 
 
+#define QETH_TRANSPORT_HEADER_SEQ_NO(buffer) (buffer+4)
+#define QETH_PDU_HEADER_SEQ_NO(buffer) (buffer+0x1c)
+#define QETH_PDU_HEADER_ACK_SEQ_NO(buffer) (buffer+0x20)
 
+extern unsigned char IDX_ACTIVATE_READ[];
+extern unsigned char IDX_ACTIVATE_WRITE[];
 
+#define IDX_ACTIVATE_SIZE 	0x22
+#define QETH_IDX_ACT_ISSUER_RM_TOKEN(buffer) (buffer+0x0c)
+#define QETH_IDX_NO_PORTNAME_REQUIRED(buffer) ((buffer)[0x0b]&0x80)
+#define QETH_IDX_ACT_FUNC_LEVEL(buffer) (buffer+0x10)
+#define QETH_IDX_ACT_DATASET_NAME(buffer) (buffer+0x16)
+#define QETH_IDX_ACT_QDIO_DEV_CUA(buffer) (buffer+0x1e)
+#define QETH_IDX_ACT_QDIO_DEV_REALADDR(buffer) (buffer+0x20)
+#define QETH_IS_IDX_ACT_POS_REPLY(buffer) (((buffer)[0x08]&3)==2)
+#define QETH_IDX_REPLY_LEVEL(buffer) (buffer+0x12)
 
+#define PDU_ENCAPSULATION(buffer) \
+	(buffer + *(buffer + (*(buffer+0x0b)) + \
+	 *(buffer + *(buffer+0x0b)+0x11) +0x07))
 
+#define IS_IPA(buffer) \
+	((buffer) && \
+	 ( *(buffer + ((*(buffer+0x0b))+4) )==0xc1) )
 
+#define ADDR_FRAME_TYPE_DIX 1
+#define ADDR_FRAME_TYPE_802_3 2
+#define ADDR_FRAME_TYPE_TR_WITHOUT_SR 0x10
+#define ADDR_FRAME_TYPE_TR_WITH_SR 0x20
 
+#endif
--- diff/drivers/s390/scsi/zfcp_aux.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/s390/scsi/zfcp_aux.c	2004-04-21 10:45:34.680431272 +0100
@@ -29,43 +29,10 @@
  */
 
 /* this drivers version (do not edit !!! generated and updated by cvs) */
-#define ZFCP_AUX_REVISION "$Revision: 1.98 $"
-
-/********************** INCLUDES *********************************************/
-
-#include <linux/init.h>
-#include <linux/config.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/ctype.h>
-#include <linux/mm.h>
-#include <linux/timer.h>
-#include <linux/delay.h>
-#include <linux/slab.h>
-#include <linux/version.h>
-#include <linux/list.h>
-#include <linux/interrupt.h>
-#include <linux/init.h>
-#include <linux/proc_fs.h>
-#include <linux/time.h>
-#include <linux/module.h>
-#include <linux/moduleparam.h>
-#include <linux/workqueue.h>
-#include <linux/syscalls.h>
+#define ZFCP_AUX_REVISION "$Revision: 1.105 $"
 
 #include "zfcp_ext.h"
 
-#include <asm/semaphore.h>
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <asm/ebcdic.h>
-#include <asm/cpcmd.h>		/* Debugging only */
-#include <asm/processor.h>	/* Debugging only */
-
-#include <linux/miscdevice.h>
-#include <linux/major.h>
-
 /* accumulated log level (module parameter) */
 static u32 loglevel = ZFCP_LOG_LEVEL_DEFAULTS;
 static char *device;
@@ -73,7 +40,6 @@ static char *device;
 
 /* written against the module interface */
 static int __init  zfcp_module_init(void);
-static void __exit zfcp_module_exit(void);
 
 int zfcp_reboot_handler(struct notifier_block *, unsigned long, void *);
 
@@ -120,7 +86,6 @@ static struct miscdevice zfcp_cfdc_misc 
 
 /* declare driver module init/cleanup functions */
 module_init(zfcp_module_init);
-module_exit(zfcp_module_exit);
 
 MODULE_AUTHOR("Heiko Carstens <heiko.carstens@de.ibm.com>, "
 	      "Martin Peschke <mpeschke@de.ibm.com>, "
@@ -272,7 +237,6 @@ void
 zfcp_cmd_dbf_event_fsf(const char *text, struct zfcp_fsf_req *fsf_req,
 		       void *add_data, int add_length)
 {
-#ifdef ZFCP_DEBUG_COMMANDS
 	struct zfcp_adapter *adapter = fsf_req->adapter;
 	struct scsi_cmnd *scsi_cmnd;
 	int level = 3;
@@ -299,7 +263,6 @@ zfcp_cmd_dbf_event_fsf(const char *text,
 				    min(ZFCP_CMD_DBF_LENGTH, add_length - i));
 	}
 	write_unlock_irqrestore(&adapter->cmd_dbf_lock, flags);
-#endif
 }
 
 /* XXX additionally log unit if available */
@@ -307,7 +270,6 @@ zfcp_cmd_dbf_event_fsf(const char *text,
 void
 zfcp_cmd_dbf_event_scsi(const char *text, struct scsi_cmnd *scsi_cmnd)
 {
-#ifdef ZFCP_DEBUG_COMMANDS
 	struct zfcp_adapter *adapter;
 	union zfcp_req_data *req_data;
 	struct zfcp_fsf_req *fsf_req;
@@ -335,14 +297,12 @@ zfcp_cmd_dbf_event_scsi(const char *text
 		debug_text_event(adapter->cmd_dbf, level, "");
 	}
 	write_unlock_irqrestore(&adapter->cmd_dbf_lock, flags);
-#endif
 }
 
 void
 zfcp_in_els_dbf_event(struct zfcp_adapter *adapter, const char *text,
 		      struct fsf_status_read_buffer *status_buffer, int length)
 {
-#ifdef ZFCP_DEBUG_INCOMING_ELS
 	int level = 1;
 	int i;
 
@@ -353,7 +313,6 @@ zfcp_in_els_dbf_event(struct zfcp_adapte
 			    level,
 			    (char *) status_buffer->payload + i,
 			    min(ZFCP_IN_ELS_DBF_LENGTH, length - i));
-#endif
 }
 
 /**
@@ -421,8 +380,8 @@ zfcp_init_device_configure(void)
 		goto out_unit;
 	up(&zfcp_data.config_sema);
 	ccw_device_set_online(adapter->ccw_device);
-	down(&zfcp_data.config_sema);
 	wait_event(unit->scsi_add_wq, atomic_read(&unit->scsi_add_work) == 0);
+	down(&zfcp_data.config_sema);
 	zfcp_unit_put(unit);
  out_unit:
 	zfcp_port_put(port);
@@ -441,11 +400,6 @@ zfcp_module_init(void)
 
 	atomic_set(&zfcp_data.loglevel, loglevel);
 
-	ZFCP_LOG_DEBUG(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
-
-	ZFCP_LOG_TRACE("Start Address of module: 0x%lx\n",
-		       (unsigned long) &zfcp_module_init);
-
 	/* initialize adapter list */
 	INIT_LIST_HEAD(&zfcp_data.adapter_list_head);
 
@@ -460,22 +414,18 @@ zfcp_module_init(void)
 	retval = register_ioctl32_conversion(zfcp_ioctl_trans.cmd,
 					     zfcp_ioctl_trans.handler);
 	if (retval != 0) {
-		ZFCP_LOG_INFO("Cannot register a 32-bit support of "
-			      "the IOC handler\n");
+		ZFCP_LOG_INFO("registration of ioctl32 conversion failed\n");
 		goto out_ioctl32;
 	}
 #endif
 	retval = misc_register(&zfcp_cfdc_misc);
 	if (retval != 0) {
-		ZFCP_LOG_INFO(
-			"Device file for the control file data channel "
-			"cannot be registered\n");
+		ZFCP_LOG_INFO("registration of misc device "
+			      "zfcp_cfdc failed\n");
 		goto out_misc_register;
 	} else {
-		ZFCP_LOG_INFO(
-			"Device file for the control file data channel "
-			"has become MAJOR/MINOR numbers %d/%d\n",
-			ZFCP_CFDC_DEV_MAJOR, zfcp_cfdc_misc.minor);
+		ZFCP_LOG_TRACE("major/minor for zfcp_cfdc: %d/%d\n",
+			       ZFCP_CFDC_DEV_MAJOR, zfcp_cfdc_misc.minor);
 	}
 
 	/* Initialise proc semaphores */
@@ -493,7 +443,7 @@ zfcp_module_init(void)
 	/* setup dynamic I/O */
 	retval = zfcp_ccw_register();
 	if (retval) {
-		ZFCP_LOG_NORMAL("Registering with common I/O layer failed.\n");
+		ZFCP_LOG_NORMAL("registration with common I/O layer failed\n");
 		goto out_ccw_register;
 	}
 
@@ -518,21 +468,6 @@ zfcp_module_init(void)
 	return retval;
 }
 
-static void __exit
-zfcp_module_exit(void)
-{
-	unregister_reboot_notifier(&zfcp_data.reboot_notifier);
-	zfcp_ccw_unregister();
-	misc_deregister(&zfcp_cfdc_misc);
-#ifdef CONFIG_S390_SUPPORT
-	unregister_ioctl32_conversion(zfcp_ioctl_trans.cmd);
-#endif
-#ifdef ZFCP_STAT_REQSIZES
-	zfcp_statistics_clear_all();
-#endif
-	ZFCP_LOG_DEBUG("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");
-}
-
 /*
  * This function is called automatically by the kernel whenever a reboot or a 
  * shut-down is initiated and zfcp is still loaded
@@ -577,46 +512,35 @@ zfcp_cfdc_dev_ioctl(struct inode *inode,
 	char *bus_id = NULL;
 	int retval = 0;
 
-	ZFCP_LOG_NORMAL(
-		"Control file data channel transaction opened\n");
-
 	sg_list = kmalloc(sizeof(struct zfcp_sg_list), GFP_KERNEL);
 	if (sg_list == NULL) {
-		ZFCP_LOG_NORMAL(
-			"Not enough memory for the scatter-gather list\n");
 		retval = -ENOMEM;
 		goto out;
 	}
 	sg_list->count = 0;
 
 	if (command != ZFCP_CFDC_IOC) {
-		ZFCP_LOG_NORMAL(
-			"IOC request code 0x%x is not valid\n",
-			command);
+		ZFCP_LOG_INFO("IOC request code 0x%x invalid\n", command);
 		retval = -ENOTTY;
 		goto out;
 	}
 
 	if ((sense_data_user = (struct zfcp_cfdc_sense_data*)buffer) == NULL) {
-		ZFCP_LOG_NORMAL(
-			"Sense data record is required\n");
+		ZFCP_LOG_INFO("sense data record is required\n");
 		retval = -EINVAL;
 		goto out;
 	}
 
 	retval = copy_from_user(&sense_data, sense_data_user,
-		sizeof(struct zfcp_cfdc_sense_data));
+				sizeof(struct zfcp_cfdc_sense_data));
 	if (retval) {
-		ZFCP_LOG_NORMAL("Cannot copy sense data record from user space "
-				"memory\n");
 		retval = -EFAULT;
 		goto out;
 	}
 
 	if (sense_data.signature != ZFCP_CFDC_SIGNATURE) {
-		ZFCP_LOG_NORMAL(
-			"No valid sense data request signature 0x%08x found\n",
-			ZFCP_CFDC_SIGNATURE);
+		ZFCP_LOG_INFO("invalid sense data request signature 0x%08x\n",
+			      ZFCP_CFDC_SIGNATURE);
 		retval = -EINVAL;
 		goto out;
 	}
@@ -649,16 +573,14 @@ zfcp_cfdc_dev_ioctl(struct inode *inode,
 		break;
 
 	default:
-		ZFCP_LOG_NORMAL(
-			"Command code 0x%08x is not valid\n",
-			sense_data.command);
+		ZFCP_LOG_INFO("invalid command code 0x%08x\n",
+			      sense_data.command);
 		retval = -EINVAL;
 		goto out;
 	}
 
 	bus_id = kmalloc(BUS_ID_SIZE, GFP_KERNEL);
 	if (bus_id == NULL) {
-		ZFCP_LOG_NORMAL("Out of memory!\n");
 		retval = -ENOMEM;
 		goto out;
 	}
@@ -682,7 +604,7 @@ zfcp_cfdc_dev_ioctl(struct inode *inode,
 	kfree(bus_id);
 
 	if (retval != 0) {
-		ZFCP_LOG_NORMAL("Specified adapter does not exist\n");
+		ZFCP_LOG_INFO("invalid adapter\n");
 		goto out;
 	}
 
@@ -690,8 +612,6 @@ zfcp_cfdc_dev_ioctl(struct inode *inode,
 		retval = zfcp_sg_list_alloc(sg_list,
 					    ZFCP_CFDC_MAX_CONTROL_FILE_SIZE);
 		if (retval) {
-			ZFCP_LOG_NORMAL("Not enough memory for the "
-					"scatter-gather list\n");
 			retval = -ENOMEM;
 			goto out;
 		}
@@ -703,8 +623,6 @@ zfcp_cfdc_dev_ioctl(struct inode *inode,
 			sg_list, &sense_data_user->control_file,
 			ZFCP_CFDC_MAX_CONTROL_FILE_SIZE);
 		if (retval) {
-			ZFCP_LOG_NORMAL("Cannot copy control file from user "
-					"space memory\n");
 			retval = -EFAULT;
 			goto out;
 		}
@@ -713,12 +631,10 @@ zfcp_cfdc_dev_ioctl(struct inode *inode,
 	retval = zfcp_fsf_control_file(
 		adapter, &fsf_req, fsf_command, option, sg_list);
 	if (retval == -EOPNOTSUPP) {
-		ZFCP_LOG_NORMAL(
-			"Specified adapter does not support control file\n");
+		ZFCP_LOG_INFO("adapter does not support cfdc\n");
 		goto out;
 	} else if (retval != 0) {
-		ZFCP_LOG_NORMAL(
-			"Cannot create or queue FSF request or create SBALs\n");
+		ZFCP_LOG_INFO("initiation of cfdc up/download failed\n");
 		retval = -EPERM;
 		goto out;
 	}
@@ -735,8 +651,6 @@ zfcp_cfdc_dev_ioctl(struct inode *inode,
 	retval = copy_to_user(sense_data_user, &sense_data,
 		sizeof(struct zfcp_cfdc_sense_data));
 	if (retval) {
-		ZFCP_LOG_NORMAL(
-			"Cannot copy sense data record to user space memory\n");
 		retval = -EFAULT;
 		goto out;
 	}
@@ -746,8 +660,6 @@ zfcp_cfdc_dev_ioctl(struct inode *inode,
 			&sense_data_user->control_file, sg_list,
 			ZFCP_CFDC_MAX_CONTROL_FILE_SIZE);
 		if (retval) {
-			ZFCP_LOG_NORMAL("Cannot copy control file to user "
-					"space memory\n");
 			retval = -EFAULT;
 			goto out;
 		}
@@ -765,9 +677,6 @@ zfcp_cfdc_dev_ioctl(struct inode *inode,
 		kfree(sg_list);
 	}
 
-	ZFCP_LOG_NORMAL(
-		"Control file data channel transaction closed\n");
-
 	return retval;
 }
 
@@ -784,7 +693,7 @@ static inline int
 zfcp_sg_list_alloc(struct zfcp_sg_list *sg_list, size_t size)
 {
 	struct scatterlist *sg;
-	int i;
+	unsigned int i;
 	int retval = 0;
 
 	sg_list->count = size >> PAGE_SHIFT;
@@ -826,7 +735,7 @@ static inline int
 zfcp_sg_list_free(struct zfcp_sg_list *sg_list)
 {
 	struct scatterlist *sg;
-	int i;
+	unsigned int i;
 	int retval = 0;
 
 	BUG_ON((sg_list->sg == NULL) || (sg_list == NULL));
@@ -860,7 +769,6 @@ zfcp_sg_list_copy_from_user(struct zfcp_
 		zfcp_buffer = (void*)
 			((page_to_pfn(sg->page) << PAGE_SHIFT) + sg->offset);
 		if (copy_from_user(zfcp_buffer, user_buffer, length)) {
-			ZFCP_LOG_INFO("Memory error (copy_from_user)\n");
 			retval = -EFAULT;
 			goto out;
 		}
@@ -895,7 +803,6 @@ zfcp_sg_list_copy_to_user(void *user_buf
 		zfcp_buffer = (void*)
 			((page_to_pfn(sg->page) << PAGE_SHIFT) + sg->offset);
 		if (copy_to_user(user_buffer, zfcp_buffer, length)) {
-			ZFCP_LOG_INFO("Memory error (copy_to_user)\n");
 			retval = -EFAULT;
 			goto out;
 		}
@@ -978,7 +885,9 @@ zfcp_get_port_by_wwpn(struct zfcp_adapte
 struct zfcp_unit *
 zfcp_unit_enqueue(struct zfcp_port *port, fcp_lun_t fcp_lun)
 {
-	struct zfcp_unit *unit;
+	struct zfcp_unit *unit, *tmp_unit;
+	scsi_lun_t scsi_lun;
+	int found;
 
 	/*
 	 * check that there is no unit with this FCP_LUN already in list
@@ -1002,13 +911,7 @@ zfcp_unit_enqueue(struct zfcp_port *port
 	init_waitqueue_head(&unit->remove_wq);
 
 	unit->port = port;
-	/*
-	 * FIXME: reuse of scsi_luns!
-	 */
-	unit->scsi_lun = port->max_scsi_lun + 1;
 	unit->fcp_lun = fcp_lun;
-	unit->common_magic = ZFCP_MAGIC;
-	unit->specific_magic = ZFCP_MAGIC_UNIT;
 
 	/* setup for sysfs registration */
 	snprintf(unit->sysfs_device.bus_id, BUS_ID_SIZE, "0x%016llx", fcp_lun);
@@ -1025,43 +928,29 @@ zfcp_unit_enqueue(struct zfcp_port *port
 	}
 
 	if (zfcp_sysfs_unit_create_files(&unit->sysfs_device)) {
-		/*
-		 * failed to create all sysfs attributes, therefore the unit
-		 * must be put on the unit_remove listhead of the port where
-		 * the release function expects it.
-		 */
-		write_lock_irq(&zfcp_data.config_lock);
-		list_add_tail(&unit->list, &port->unit_remove_lh);
-		write_unlock_irq(&zfcp_data.config_lock);
 		device_unregister(&unit->sysfs_device);
 		return NULL;
 	}
 
-	/*
-	 * update max SCSI LUN of logical units attached to parent remote port
-	 */
-	port->max_scsi_lun++;
-
-	/*
-	 * update max SCSI LUN of logical units attached to parent adapter
-	 */
-	if (port->adapter->max_scsi_lun < port->max_scsi_lun)
-		port->adapter->max_scsi_lun = port->max_scsi_lun;
-
-	/*
-	 * update max SCSI LUN of logical units attached to host (SCSI stack)
-	 */
-	if (port->adapter->scsi_host &&
-	    (port->adapter->scsi_host->max_lun < port->max_scsi_lun))
-		port->adapter->scsi_host->max_lun = port->max_scsi_lun + 1;
-
 	zfcp_unit_get(unit);
 
-	/* unit is new and needs to be added to list */
+	scsi_lun = 0;
+	found = 0;
 	write_lock_irq(&zfcp_data.config_lock);
+	list_for_each_entry(tmp_unit, &port->unit_list_head, list) {
+		if (tmp_unit->scsi_lun != scsi_lun) {
+			found = 1;
+			break;
+		}
+		scsi_lun++;
+	}
+	unit->scsi_lun = scsi_lun;
+	if (found)
+		list_add_tail(&unit->list, &tmp_unit->list);
+	else
+		list_add_tail(&unit->list, &port->unit_list_head);
 	atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status);
 	atomic_set_mask(ZFCP_STATUS_COMMON_RUNNING, &unit->status);
-	list_add_tail(&unit->list, &port->unit_list_head);
 	write_unlock_irq(&zfcp_data.config_lock);
 
 	port->units++;
@@ -1070,21 +959,17 @@ zfcp_unit_enqueue(struct zfcp_port *port
 	return unit;
 }
 
-/* locks:  config_sema must be held */
 void
 zfcp_unit_dequeue(struct zfcp_unit *unit)
 {
-	/* remove specified unit data structure from list */
+	zfcp_unit_wait(unit);
 	write_lock_irq(&zfcp_data.config_lock);
 	list_del(&unit->list);
 	write_unlock_irq(&zfcp_data.config_lock);
-
 	unit->port->units--;
 	zfcp_port_put(unit->port);
-
-	kfree(unit);
-
-	return;
+	zfcp_sysfs_unit_remove_files(&unit->sysfs_device);
+	device_unregister(&unit->sysfs_device);
 }
 
 static void *
@@ -1115,63 +1000,48 @@ zfcp_allocate_low_mem_buffers(struct zfc
 			       zfcp_mempool_alloc, zfcp_mempool_free, (void *)
 			       sizeof(struct zfcp_fsf_req_pool_element));
 
-	if (NULL == adapter->pool.fsf_req_erp) {
-		ZFCP_LOG_INFO("error: pool allocation failed (fsf_req_erp)\n");
+	if (NULL == adapter->pool.fsf_req_erp)
 		return -ENOMEM;
-	}
 
 	adapter->pool.fsf_req_scsi =
 		mempool_create(ZFCP_POOL_FSF_REQ_SCSI_NR,
 			       zfcp_mempool_alloc, zfcp_mempool_free, (void *)
 			       sizeof(struct zfcp_fsf_req_pool_element));
 
-	if (NULL == adapter->pool.fsf_req_scsi) {
-		ZFCP_LOG_INFO("error: pool allocation failed (fsf_req_scsi)\n");
+	if (NULL == adapter->pool.fsf_req_scsi)
 		return -ENOMEM;
-	}
 
 	adapter->pool.fsf_req_abort =
 		mempool_create(ZFCP_POOL_FSF_REQ_ABORT_NR,
 			       zfcp_mempool_alloc, zfcp_mempool_free, (void *)
 			       sizeof(struct zfcp_fsf_req_pool_element));
 
-	if (NULL == adapter->pool.fsf_req_abort) {
-		ZFCP_LOG_INFO("error: pool allocation failed "
-			      "(fsf_req_abort)\n");
+	if (NULL == adapter->pool.fsf_req_abort)
 		return -ENOMEM;
-	}
 
 	adapter->pool.fsf_req_status_read =
 		mempool_create(ZFCP_POOL_STATUS_READ_NR,
 			       zfcp_mempool_alloc, zfcp_mempool_free,
 			       (void *) sizeof(struct zfcp_fsf_req));
 
-	if (NULL == adapter->pool.fsf_req_status_read) {
-		ZFCP_LOG_INFO("error: pool allocation failed "
-			      "(fsf_req_status_read\n");
+	if (NULL == adapter->pool.fsf_req_status_read)
 		return -ENOMEM;
-	}
 
 	adapter->pool.data_status_read =
 		mempool_create(ZFCP_POOL_STATUS_READ_NR,
 			       zfcp_mempool_alloc, zfcp_mempool_free,
 			       (void *) sizeof(struct fsf_status_read_buffer));
 
-	if (NULL == adapter->pool.data_status_read) {
-		ZFCP_LOG_INFO("error: pool allocation failed "
-			      "(data_status_read)\n");
+	if (NULL == adapter->pool.data_status_read)
 		return -ENOMEM;
-	}
 
 	adapter->pool.data_gid_pn =
 		mempool_create(ZFCP_POOL_DATA_GID_PN_NR,
 			       zfcp_mempool_alloc, zfcp_mempool_free, (void *)
 			       sizeof(struct zfcp_gid_pn_data));
 
-	if (NULL == adapter->pool.data_gid_pn) {
-		ZFCP_LOG_INFO("error: pool allocation failed (data_gid_pn)\n");
+	if (NULL == adapter->pool.data_gid_pn)
 		return -ENOMEM;
-	}
 
 	return 0;
 }
@@ -1198,6 +1068,91 @@ zfcp_free_low_mem_buffers(struct zfcp_ad
 		mempool_destroy(adapter->pool.data_gid_pn);
 }
 
+/**
+ * zfcp_adapter_debug_register - registers debug feature for an adapter
+ * @adapter: pointer to adapter for which debug features should be registered
+ * return: -ENOMEM on error, 0 otherwise
+ */
+int
+zfcp_adapter_debug_register(struct zfcp_adapter *adapter)
+{
+	char dbf_name[20];
+
+	/* debug feature area which records fsf request sequence numbers */
+	sprintf(dbf_name, ZFCP_REQ_DBF_NAME "%s",
+		zfcp_get_busid_by_adapter(adapter));
+	adapter->req_dbf = debug_register(dbf_name,
+					  ZFCP_REQ_DBF_INDEX,
+					  ZFCP_REQ_DBF_AREAS,
+					  ZFCP_REQ_DBF_LENGTH);
+	debug_register_view(adapter->req_dbf, &debug_hex_ascii_view);
+	debug_set_level(adapter->req_dbf, ZFCP_REQ_DBF_LEVEL);
+	debug_text_event(adapter->req_dbf, 1, "zzz");
+
+	/* debug feature area which records SCSI command failures (hostbyte) */
+	rwlock_init(&adapter->cmd_dbf_lock);
+	sprintf(dbf_name, ZFCP_CMD_DBF_NAME "%s",
+		zfcp_get_busid_by_adapter(adapter));
+	adapter->cmd_dbf = debug_register(dbf_name,
+					  ZFCP_CMD_DBF_INDEX,
+					  ZFCP_CMD_DBF_AREAS,
+					  ZFCP_CMD_DBF_LENGTH);
+	debug_register_view(adapter->cmd_dbf, &debug_hex_ascii_view);
+	debug_set_level(adapter->cmd_dbf, ZFCP_CMD_DBF_LEVEL);
+
+	/* debug feature area which records SCSI command aborts */
+	sprintf(dbf_name, ZFCP_ABORT_DBF_NAME "%s",
+		zfcp_get_busid_by_adapter(adapter));
+	adapter->abort_dbf = debug_register(dbf_name,
+					    ZFCP_ABORT_DBF_INDEX,
+					    ZFCP_ABORT_DBF_AREAS,
+					    ZFCP_ABORT_DBF_LENGTH);
+	debug_register_view(adapter->abort_dbf, &debug_hex_ascii_view);
+	debug_set_level(adapter->abort_dbf, ZFCP_ABORT_DBF_LEVEL);
+
+	/* debug feature area which records SCSI command aborts */
+	sprintf(dbf_name, ZFCP_IN_ELS_DBF_NAME "%s",
+		zfcp_get_busid_by_adapter(adapter));
+	adapter->in_els_dbf = debug_register(dbf_name,
+					     ZFCP_IN_ELS_DBF_INDEX,
+					     ZFCP_IN_ELS_DBF_AREAS,
+					     ZFCP_IN_ELS_DBF_LENGTH);
+	debug_register_view(adapter->in_els_dbf, &debug_hex_ascii_view);
+	debug_set_level(adapter->in_els_dbf, ZFCP_IN_ELS_DBF_LEVEL);
+
+
+	/* debug feature area which records erp events */
+	sprintf(dbf_name, ZFCP_ERP_DBF_NAME "%s",
+		zfcp_get_busid_by_adapter(adapter));
+	adapter->erp_dbf = debug_register(dbf_name,
+					  ZFCP_ERP_DBF_INDEX,
+					  ZFCP_ERP_DBF_AREAS,
+					  ZFCP_ERP_DBF_LENGTH);
+	debug_register_view(adapter->erp_dbf, &debug_hex_ascii_view);
+	debug_set_level(adapter->erp_dbf, ZFCP_ERP_DBF_LEVEL);
+
+	if (adapter->req_dbf && adapter->cmd_dbf && adapter->abort_dbf &&
+	    adapter->in_els_dbf && adapter->erp_dbf)
+		return 0;
+
+	zfcp_adapter_debug_unregister(adapter);
+	return -ENOMEM;
+}
+
+/**
+ * zfcp_adapter_debug_unregister - unregisters debug feature for an adapter
+ * @adapter: pointer to adapter for which debug features should be unregistered
+ */
+void
+zfcp_adapter_debug_unregister(struct zfcp_adapter *adapter)
+{
+	debug_unregister(adapter->erp_dbf);
+	debug_unregister(adapter->req_dbf);
+	debug_unregister(adapter->cmd_dbf);
+	debug_unregister(adapter->abort_dbf);
+	debug_unregister(adapter->in_els_dbf);
+}
+
 /*
  * Enqueues an adapter at the end of the adapter list in the driver data.
  * All adapter internal structures are set up.
@@ -1213,7 +1168,6 @@ zfcp_adapter_enqueue(struct ccw_device *
 {
 	int retval = 0;
 	struct zfcp_adapter *adapter;
-	char dbf_name[20];
 
 	/*
 	 * Note: It is safe to release the list_lock, as any list changes 
@@ -1223,7 +1177,7 @@ zfcp_adapter_enqueue(struct ccw_device *
 	/* try to allocate new adapter data structure (zeroed) */
 	adapter = kmalloc(sizeof (struct zfcp_adapter), GFP_KERNEL);
 	if (!adapter) {
-		ZFCP_LOG_INFO("error: Allocation of base adapter "
+		ZFCP_LOG_INFO("error: allocation of base adapter "
 			      "structure failed\n");
 		goto out;
 	}
@@ -1243,12 +1197,10 @@ zfcp_adapter_enqueue(struct ccw_device *
 		goto qdio_allocate_failed;
 
 	retval = zfcp_allocate_low_mem_buffers(adapter);
-	if (retval)
+	if (retval) {
+		ZFCP_LOG_INFO("error: pool allocation failed\n");
 		goto failed_low_mem_buffers;
-
-	/* set magics */
-	adapter->common_magic = ZFCP_MAGIC;
-	adapter->specific_magic = ZFCP_MAGIC_ADAPTER;
+	}
 
 	/* initialise reference count stuff */
 	atomic_set(&adapter->refcount, 0);
@@ -1292,103 +1244,6 @@ zfcp_adapter_enqueue(struct ccw_device *
 	if (zfcp_sysfs_adapter_create_files(&ccw_device->dev))
 		goto sysfs_failed;
 
-#ifdef ZFCP_DEBUG_REQUESTS
-	/* debug feature area which records fsf request sequence numbers */
-	sprintf(dbf_name, ZFCP_REQ_DBF_NAME "%s",
-		zfcp_get_busid_by_adapter(adapter));
-	adapter->req_dbf = debug_register(dbf_name,
-					  ZFCP_REQ_DBF_INDEX,
-					  ZFCP_REQ_DBF_AREAS,
-					  ZFCP_REQ_DBF_LENGTH);
-	if (!adapter->req_dbf) {
-		ZFCP_LOG_INFO
-		    ("error: Out of resources. Request debug feature for "
-		     "adapter %s could not be generated.\n",
-		     zfcp_get_busid_by_adapter(adapter));
-		retval = -ENOMEM;
-		goto failed_req_dbf;
-	}
-	debug_register_view(adapter->req_dbf, &debug_hex_ascii_view);
-	debug_set_level(adapter->req_dbf, ZFCP_REQ_DBF_LEVEL);
-	debug_text_event(adapter->req_dbf, 1, "zzz");
-#endif				/* ZFCP_DEBUG_REQUESTS */
-
-#ifdef ZFCP_DEBUG_COMMANDS
-	/* debug feature area which records SCSI command failures (hostbyte) */
-	rwlock_init(&adapter->cmd_dbf_lock);
-	sprintf(dbf_name, ZFCP_CMD_DBF_NAME "%s",
-		zfcp_get_busid_by_adapter(adapter));
-	adapter->cmd_dbf = debug_register(dbf_name,
-					  ZFCP_CMD_DBF_INDEX,
-					  ZFCP_CMD_DBF_AREAS,
-					  ZFCP_CMD_DBF_LENGTH);
-	if (!adapter->cmd_dbf) {
-		ZFCP_LOG_INFO
-		    ("error: Out of resources. Command debug feature for "
-		     "adapter %s could not be generated.\n",
-		     zfcp_get_busid_by_adapter(adapter));
-		retval = -ENOMEM;
-		goto failed_cmd_dbf;
-	}
-	debug_register_view(adapter->cmd_dbf, &debug_hex_ascii_view);
-	debug_set_level(adapter->cmd_dbf, ZFCP_CMD_DBF_LEVEL);
-#endif				/* ZFCP_DEBUG_COMMANDS */
-
-#ifdef ZFCP_DEBUG_ABORTS
-	/* debug feature area which records SCSI command aborts */
-	sprintf(dbf_name, ZFCP_ABORT_DBF_NAME "%s",
-		zfcp_get_busid_by_adapter(adapter));
-	adapter->abort_dbf = debug_register(dbf_name,
-					    ZFCP_ABORT_DBF_INDEX,
-					    ZFCP_ABORT_DBF_AREAS,
-					    ZFCP_ABORT_DBF_LENGTH);
-	if (!adapter->abort_dbf) {
-		ZFCP_LOG_INFO
-		    ("error: Out of resources. Abort debug feature for "
-		     "adapter %s could not be generated.\n",
-		     zfcp_get_busid_by_adapter(adapter));
-		retval = -ENOMEM;
-		goto failed_abort_dbf;
-	}
-	debug_register_view(adapter->abort_dbf, &debug_hex_ascii_view);
-	debug_set_level(adapter->abort_dbf, ZFCP_ABORT_DBF_LEVEL);
-#endif				/* ZFCP_DEBUG_ABORTS */
-
-#ifdef ZFCP_DEBUG_INCOMING_ELS
-	/* debug feature area which records SCSI command aborts */
-	sprintf(dbf_name, ZFCP_IN_ELS_DBF_NAME "%s",
-		zfcp_get_busid_by_adapter(adapter));
-	adapter->in_els_dbf = debug_register(dbf_name,
-					     ZFCP_IN_ELS_DBF_INDEX,
-					     ZFCP_IN_ELS_DBF_AREAS,
-					     ZFCP_IN_ELS_DBF_LENGTH);
-	if (!adapter->in_els_dbf) {
-		ZFCP_LOG_INFO("error: Out of resources. ELS debug feature for "
-			      "adapter %s could not be generated.\n",
-			      zfcp_get_busid_by_adapter(adapter));
-		retval = -ENOMEM;
-		goto failed_in_els_dbf;
-	}
-	debug_register_view(adapter->in_els_dbf, &debug_hex_ascii_view);
-	debug_set_level(adapter->in_els_dbf, ZFCP_IN_ELS_DBF_LEVEL);
-#endif				/* ZFCP_DEBUG_INCOMING_ELS */
-
-	sprintf(dbf_name, ZFCP_ERP_DBF_NAME "%s",
-		zfcp_get_busid_by_adapter(adapter));
-	adapter->erp_dbf = debug_register(dbf_name,
-					  ZFCP_ERP_DBF_INDEX,
-					  ZFCP_ERP_DBF_AREAS,
-					  ZFCP_ERP_DBF_LENGTH);
-	if (!adapter->erp_dbf) {
-		ZFCP_LOG_INFO("error: Out of resources. ERP debug feature for "
-			      "adapter %s could not be generated.\n",
-			      zfcp_get_busid_by_adapter(adapter));
-		retval = -ENOMEM;
-		goto failed_erp_dbf;
-	}
-	debug_register_view(adapter->erp_dbf, &debug_hex_ascii_view);
-	debug_set_level(adapter->erp_dbf, ZFCP_ERP_DBF_LEVEL);
-
 	/* put allocated adapter at list tail */
 	write_lock_irq(&zfcp_data.config_lock);
 	atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status);
@@ -1399,36 +1254,13 @@ zfcp_adapter_enqueue(struct ccw_device *
 
 	goto out;
 
- failed_erp_dbf:
-#ifdef ZFCP_DEBUG_INCOMING_ELS
-	debug_unregister(adapter->in_els_dbf);
- failed_in_els_dbf:
-#endif
-
-#ifdef ZFCP_DEBUG_ABORTS
-	debug_unregister(adapter->abort_dbf);
- failed_abort_dbf:
-#endif
-
-#ifdef ZFCP_DEBUG_COMMANDS
-	debug_unregister(adapter->cmd_dbf);
- failed_cmd_dbf:
-#endif
-
-#ifdef ZFCP_DEBUG_REQUESTS
-	debug_unregister(adapter->req_dbf);
- failed_req_dbf:
-#endif
-	zfcp_sysfs_adapter_remove_files(&ccw_device->dev);
  sysfs_failed:
 	dev_set_drvdata(&ccw_device->dev, NULL);
  failed_low_mem_buffers:
 	zfcp_free_low_mem_buffers(adapter);
 	if (qdio_free(ccw_device) != 0)
-		ZFCP_LOG_NORMAL
-		    ("bug: could not free memory used by data transfer "
-		     "mechanism for adapter %s\n",
-		     zfcp_get_busid_by_adapter(adapter));
+		ZFCP_LOG_NORMAL("bug: qdio_free for adapter %s failed\n",
+				zfcp_get_busid_by_adapter(adapter));
  qdio_allocate_failed:
 	zfcp_qdio_free_queues(adapter);
  queues_alloc_failed:
@@ -1459,12 +1291,10 @@ zfcp_adapter_dequeue(struct zfcp_adapter
 	retval = !list_empty(&adapter->fsf_req_list_head);
 	read_unlock_irqrestore(&adapter->fsf_req_list_lock, flags);
 	if (retval) {
-		ZFCP_LOG_NORMAL("bug: Adapter %s is still in use, "
-				"%i requests are still outstanding "
-				"(debug info 0x%lx)\n",
-				zfcp_get_busid_by_adapter(adapter),
-				atomic_read(&adapter->fsf_reqs_active),
-				(unsigned long) adapter);
+		ZFCP_LOG_NORMAL("bug: adapter %s (%p) still in use, "
+				"%i requests outstanding\n",
+				zfcp_get_busid_by_adapter(adapter), adapter,
+				atomic_read(&adapter->fsf_reqs_active));
 		retval = -EBUSY;
 		goto out;
 	}
@@ -1477,63 +1307,40 @@ zfcp_adapter_dequeue(struct zfcp_adapter
 	/* decrease number of adapters in list */
 	zfcp_data.adapters--;
 
-	ZFCP_LOG_TRACE("adapter 0x%lx removed from list, "
+	ZFCP_LOG_TRACE("adapter %s (%p) removed from list, "
 		       "%i adapters still in list\n",
-		       (unsigned long) adapter, zfcp_data.adapters);
+		       zfcp_get_busid_by_adapter(adapter),
+		       adapter, zfcp_data.adapters);
 
 	retval = qdio_free(adapter->ccw_device);
 	if (retval)
-		ZFCP_LOG_NORMAL
-		    ("bug: could not free memory used by data transfer "
-		     "mechanism for adapter %s\n",
-		     zfcp_get_busid_by_adapter(adapter));
-
-	debug_unregister(adapter->erp_dbf);
-
-#ifdef ZFCP_DEBUG_REQUESTS
-	debug_unregister(adapter->req_dbf);
-#endif
-
-#ifdef ZFCP_DEBUG_COMMANDS
-	debug_unregister(adapter->cmd_dbf);
-#endif
-#ifdef ZFCP_DEBUG_ABORTS
-	debug_unregister(adapter->abort_dbf);
-#endif
-
-#ifdef ZFCP_DEBUG_INCOMING_ELS
-	debug_unregister(adapter->in_els_dbf);
-#endif
+		ZFCP_LOG_NORMAL("bug: qdio_free for adapter %s failed\n",
+				zfcp_get_busid_by_adapter(adapter));
 
 	zfcp_free_low_mem_buffers(adapter);
 	/* free memory of adapter data structure and queues */
 	zfcp_qdio_free_queues(adapter);
-	ZFCP_LOG_TRACE("Freeing adapter structure.\n");
+	ZFCP_LOG_TRACE("freeing adapter structure\n");
 	kfree(adapter);
  out:
 	return;
 }
 
 /*
- * Enqueues a remote port at the end of the port list.
- * All port internal structures are set-up and the proc-fs entry is also 
- * allocated. Some SCSI-stack structures are modified for the port.
+ * Enqueues a remote port to the port list. All port internal structures
+ * are set up and the sysfs entry is also generated.
  *
- * returns:	0            if a new port was successfully enqueued
- *              ZFCP_KNOWN   if a port with the requested wwpn already exists
- *              -ENOMEM      if allocation failed
- *              -EINVAL      if at least one of the specified parameters was wrong
+ * returns:     pointer to port or NULL
  * locks:       config_sema must be held to serialise changes to the port list
- *              within this function (must not be held on entry)
  */
 struct zfcp_port *
 zfcp_port_enqueue(struct zfcp_adapter *adapter, wwn_t wwpn, u32 status)
 {
-	struct zfcp_port *port;
-	int check_scsi_id;
+	struct zfcp_port *port, *tmp_port;
 	int check_wwpn;
+	scsi_id_t scsi_id;
+	int found;
 
-	check_scsi_id = !(status & ZFCP_STATUS_PORT_NO_SCSI_ID);
 	check_wwpn = !(status & ZFCP_STATUS_PORT_NO_WWPN);
 
 	/*
@@ -1561,17 +1368,11 @@ zfcp_port_enqueue(struct zfcp_adapter *a
 
 	port->adapter = adapter;
 
-	if (check_scsi_id)
-		port->scsi_id = adapter->max_scsi_id + 1;
-
 	if (check_wwpn)
 		port->wwpn = wwpn;
 
 	atomic_set_mask(status, &port->status);
 
-	port->common_magic = ZFCP_MAGIC;
-	port->specific_magic = ZFCP_MAGIC_PORT;
-
 	/* setup for sysfs registration */
 	if (status & ZFCP_STATUS_PORT_NAMESERVER)
 		snprintf(port->sysfs_device.bus_id, BUS_ID_SIZE, "nameserver");
@@ -1591,41 +1392,32 @@ zfcp_port_enqueue(struct zfcp_adapter *a
 	}
 
 	if (zfcp_sysfs_port_create_files(&port->sysfs_device, status)) {
-		/*
-		 * failed to create all sysfs attributes, therefore the port
-		 * must be put on the port_remove listhead of the adapter
-		 * where the release function expects it.
-		 */
-		write_lock_irq(&zfcp_data.config_lock);
-		list_add_tail(&port->list, &adapter->port_remove_lh);
-		write_unlock_irq(&zfcp_data.config_lock);
 		device_unregister(&port->sysfs_device);
 		return NULL;
 	}
 
-	if (check_scsi_id) {
-		/*
-		 * update max. SCSI ID of remote ports attached to
-		 * "parent" adapter if necessary
-		 * (do not care about the adapters own SCSI ID)
-		 */
-		adapter->max_scsi_id++;
-
-		/*
-		 * update max. SCSI ID of remote ports attached to
-		 * "parent" host (SCSI stack) if necessary
-		 */
-		if (adapter->scsi_host &&
-		    (adapter->scsi_host->max_id < adapter->max_scsi_id + 1))
-			adapter->scsi_host->max_id = adapter->max_scsi_id + 1;
-	}
-
 	zfcp_port_get(port);
 
+	scsi_id = 1;
+	found = 0;
 	write_lock_irq(&zfcp_data.config_lock);
+	list_for_each_entry(tmp_port, &adapter->port_list_head, list) {
+		if (atomic_test_mask(ZFCP_STATUS_PORT_NO_SCSI_ID,
+				     &tmp_port->status))
+			continue;
+		if (tmp_port->scsi_id != scsi_id) {
+			found = 1;
+			break;
+		}
+		scsi_id++;
+	}
+	port->scsi_id = scsi_id;
+	if (found)
+		list_add_tail(&port->list, &tmp_port->list);
+	else
+		list_add_tail(&port->list, &adapter->port_list_head);
 	atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status);
 	atomic_set_mask(ZFCP_STATUS_COMMON_RUNNING, &port->status);
-	list_add_tail(&port->list, &adapter->port_list_head);
 	write_unlock_irq(&zfcp_data.config_lock);
 
 	adapter->ports++;
@@ -1634,26 +1426,18 @@ zfcp_port_enqueue(struct zfcp_adapter *a
 	return port;
 }
 
-/*
- * returns:	0 - struct zfcp_port data structure successfully removed
- *		!0 - struct zfcp_port data structure could not be removed
- *			(e.g. still used)
- * locks :	port list write lock is assumed to be held by caller
- */
 void
 zfcp_port_dequeue(struct zfcp_port *port)
 {
-	/* remove specified port from list */
+	zfcp_port_wait(port);
 	write_lock_irq(&zfcp_data.config_lock);
 	list_del(&port->list);
 	write_unlock_irq(&zfcp_data.config_lock);
-
 	port->adapter->ports--;
 	zfcp_adapter_put(port->adapter);
-
-	kfree(port);
-
-	return;
+	zfcp_sysfs_port_remove_files(&port->sysfs_device,
+				     atomic_read(&port->status));
+	device_unregister(&port->sysfs_device);
 }
 
 /* Enqueues a nameserver port */
@@ -1665,9 +1449,8 @@ zfcp_nameserver_enqueue(struct zfcp_adap
 	/* generate port structure */
 	port = zfcp_port_enqueue(adapter, 0, ZFCP_STATUS_PORT_NAMESERVER);
 	if (!port) {
-		ZFCP_LOG_INFO("error: Could not establish a connection to the "
-			      "fabric name server connected to the "
-			      "adapter %s\n",
+		ZFCP_LOG_INFO("error: enqueue of nameserver port for "
+			      "adapter %s failed\n",
 			      zfcp_get_busid_by_adapter(adapter));
 		return -ENXIO;
 	}
@@ -1730,8 +1513,8 @@ zfcp_fsf_incoming_els_rscn(struct zfcp_a
 			range_mask = ZFCP_PORTS_RANGE_FABRIC;
 			break;
 		default:
-			ZFCP_LOG_INFO("Received RSCN with unknown "
-				      "address format.\n");
+			ZFCP_LOG_INFO("incoming RSCN with unknown "
+				      "address format\n");
 			continue;
 		}
 		read_lock_irqsave(&zfcp_data.config_lock, flags);
@@ -1742,11 +1525,8 @@ zfcp_fsf_incoming_els_rscn(struct zfcp_a
 			/* Do we know this port? If not skip it. */
 			if (!atomic_test_mask
 			    (ZFCP_STATUS_PORT_DID_DID, &port->status)) {
-				ZFCP_LOG_INFO
-					("Received state change notification."
-					 "Trying to open the port with wwpn "
-					 "0x%Lx. Hope it's there now.\n",
-					 port->wwpn);
+				ZFCP_LOG_INFO("incoming RSCN, trying to open "
+					      "port 0x%016Lx\n", port->wwpn);
 				debug_text_event(adapter->erp_dbf, 1,
 						 "unsol_els_rscnu:");
 				zfcp_erp_port_reopen(port,
@@ -1760,7 +1540,7 @@ zfcp_fsf_incoming_els_rscn(struct zfcp_a
 			 */
 			if ((port->d_id & range_mask)
 			    == (fcp_rscn_element->nport_did & range_mask)) {
-				ZFCP_LOG_TRACE("reopen did 0x%x\n",
+				ZFCP_LOG_TRACE("reopen did 0x%08x\n",
 					       fcp_rscn_element->nport_did);
 				/*
 				 * Unfortunately, an RSCN does not specify the
@@ -1772,10 +1552,8 @@ zfcp_fsf_incoming_els_rscn(struct zfcp_a
 				 * Where would such code be put in?
 				 * (inside or outside erp)
 				 */
-				ZFCP_LOG_INFO
-				    ("Received state change notification."
-				     "Trying to reopen the port with wwpn "
-				     "0x%Lx.\n", port->wwpn);
+				ZFCP_LOG_INFO("incoming RSCN, trying to open "
+					      "port 0x%016Lx\n", port->wwpn);
 				debug_text_event(adapter->erp_dbf, 1,
 						 "unsol_els_rscnk:");
 				zfcp_test_link(port);
@@ -1803,10 +1581,8 @@ zfcp_fsf_incoming_els_plogi(struct zfcp_
 	read_unlock_irqrestore(&zfcp_data.config_lock, flags);
 
 	if (!port || (port->wwpn != (*(wwn_t *) & els_logi->nport_wwn))) {
-		ZFCP_LOG_DEBUG("Re-open port indication received "
-			       "for the non-existing port with D_ID "
-			       "0x%3.3x, on the adapter "
-			       "%s. Ignored.\n",
+		ZFCP_LOG_DEBUG("ignored incoming PLOGI for nonexisting port "
+			       "with d_id 0x%08x on adapter %s\n",
 			       status_buffer->d_id,
 			       zfcp_get_busid_by_adapter(adapter));
 	} else {
@@ -1834,10 +1610,8 @@ zfcp_fsf_incoming_els_logo(struct zfcp_a
 	read_unlock_irqrestore(&zfcp_data.config_lock, flags);
 
 	if (!port || (port->wwpn != els_logo->nport_wwpn)) {
-		ZFCP_LOG_DEBUG("Re-open port indication received "
-			       "for the non-existing port with D_ID "
-			       "0x%3.3x, on the adapter "
-			       "%s. Ignored.\n",
+		ZFCP_LOG_DEBUG("ignored incoming LOGO for nonexisting port "
+			       "with d_id 0x%08x on adapter %s\n",
 			       status_buffer->d_id,
 			       zfcp_get_busid_by_adapter(adapter));
 	} else {
@@ -1852,9 +1626,8 @@ zfcp_fsf_incoming_els_unknown(struct zfc
 			      struct fsf_status_read_buffer *status_buffer)
 {
 	zfcp_in_els_dbf_event(adapter, "##undef", status_buffer, 24);
-	ZFCP_LOG_NORMAL("warning: Unknown incoming ELS (0x%x) received "
-			"for the adapter %s\n",
-			*(u32 *) (status_buffer->payload),
+	ZFCP_LOG_NORMAL("warning: unknown incoming ELS 0x%08x "
+			"for adapter %s\n", *(u32 *) (status_buffer->payload),
 			zfcp_get_busid_by_adapter(adapter));
 
 }
@@ -1900,12 +1673,10 @@ zfcp_gid_pn_buffers_alloc(struct zfcp_gi
 		}
 	} else {
 		data = kmalloc(sizeof(struct zfcp_gid_pn_data), GFP_ATOMIC);
-		}
+	}
 
-        if (NULL == data){
-		ZFCP_LOG_DEBUG("Out of memory.\n");
+        if (NULL == data)
                 return -ENOMEM;
-	}
 
 	memset(data, 0, sizeof(*data));
         data->ct.req = &data->req;
@@ -1927,11 +1698,10 @@ zfcp_gid_pn_buffers_alloc(struct zfcp_gi
 static void
 zfcp_gid_pn_buffers_free(struct zfcp_gid_pn_data *gid_pn)
 {
-        if ((gid_pn->ct.pool != 0)) {
+        if ((gid_pn->ct.pool != 0))
 		mempool_free(gid_pn, gid_pn->ct.pool);
-        } else {
+	else
                 kfree(gid_pn);
-	}
 
 	return;
 }
@@ -1950,11 +1720,10 @@ zfcp_ns_gid_pn_request(struct zfcp_erp_a
 
 	ret = zfcp_gid_pn_buffers_alloc(&gid_pn, adapter->pool.data_gid_pn);
 	if (ret < 0) {
-		ZFCP_LOG_INFO("error: Out of memory. Could not allocate "
-                              "buffers for nameserver request GID_PN. "
-                              "(adapter: %s)\n",
+		ZFCP_LOG_INFO("error: buffer allocation for gid_pn nameserver "
+			      "request failed for adapter %s\n",
 			      zfcp_get_busid_by_adapter(adapter));
-	goto out;
+		goto out;
 	}
 
 	/* setup nameserver request */
@@ -1978,8 +1747,8 @@ zfcp_ns_gid_pn_request(struct zfcp_erp_a
 	ret = zfcp_fsf_send_ct(&gid_pn->ct, adapter->pool.fsf_req_erp,
 			       erp_action);
 	if (ret) {
-		ZFCP_LOG_INFO("error: Could not send nameserver request GID_PN."
-                              "(adapter %s)\n",
+		ZFCP_LOG_INFO("error: initiation of gid_pn nameserver request "
+                              "failed for adapter %s\n",
 			      zfcp_get_busid_by_adapter(adapter));
 
                 zfcp_gid_pn_buffers_free(gid_pn);
@@ -2023,26 +1792,23 @@ static void zfcp_ns_gid_pn_handler(unsig
 	}
 	/* paranoia */
 	if (ct_iu_req->wwpn != port->wwpn) {
-		ZFCP_LOG_NORMAL(
-			"bug: Port WWPN returned by nameserver lookup "
-                        "does not correspond to the expected value "
-			"(adapter: %s, debug info: 0x%016Lx, 0x%016Lx)\n",
-			zfcp_get_busid_by_port(port), port->wwpn,
-                        ct_iu_req->wwpn);
+		ZFCP_LOG_NORMAL("bug: wwpn 0x%016Lx returned by nameserver "
+				"lookup does not match expected wwpn 0x%016Lx "
+				"for adapter %s\n", ct_iu_req->wwpn, port->wwpn,
+				zfcp_get_busid_by_port(port));
 		goto failed;
 	}
 
 	/* looks like a valid d_id */
         port->d_id = ct_iu_resp->d_id & ZFCP_DID_MASK;
 	atomic_set_mask(ZFCP_STATUS_PORT_DID_DID, &port->status);
-	ZFCP_LOG_DEBUG("busid %s:  WWPN=0x%Lx ---> D_ID=0x%6.6x\n",
-		       zfcp_get_busid_by_port(port),
-		       port->wwpn, (unsigned int) port->d_id);
+	ZFCP_LOG_DEBUG("adapter %s:  wwpn=0x%016Lx ---> d_id=0x%08x\n",
+		       zfcp_get_busid_by_port(port), port->wwpn, port->d_id);
 	goto out;
 
 failed:
-	ZFCP_LOG_NORMAL("warning: WWPN 0x%Lx not found by nameserver lookup "
-			"(adapter: %s)\n",
+	ZFCP_LOG_NORMAL("warning: failed gid_pn nameserver request for wwpn "
+			"0x%016Lx for adapter %s\n",
 			port->wwpn, zfcp_get_busid_by_port(port));
 	ZFCP_LOG_DEBUG("CT IUs do not match:\n");
 	ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, (char *) ct_iu_req,
--- diff/drivers/s390/scsi/zfcp_ccw.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/s390/scsi/zfcp_ccw.c	2004-04-21 10:45:34.681431120 +0100
@@ -26,7 +26,7 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#define ZFCP_CCW_C_REVISION "$Revision: 1.48 $"
+#define ZFCP_CCW_C_REVISION "$Revision: 1.52 $"
 
 #include <linux/init.h>
 #include <linux/module.h>
@@ -55,6 +55,7 @@ static struct ccw_device_id zfcp_ccw_dev
 };
 
 static struct ccw_driver zfcp_ccw_driver = {
+	.owner       = THIS_MODULE,
 	.name        = ZFCP_NAME,
 	.ids         = zfcp_ccw_device_id,
 	.probe       = zfcp_ccw_probe,
@@ -130,14 +131,9 @@ zfcp_ccw_remove(struct ccw_device *ccw_d
 
 	list_for_each_entry_safe(port, p, &adapter->port_remove_lh, list) {
 		list_for_each_entry_safe(unit, u, &port->unit_remove_lh, list) {
-			zfcp_unit_wait(unit);
-			zfcp_sysfs_unit_remove_files(&unit->sysfs_device);
-			device_unregister(&unit->sysfs_device);
+			zfcp_unit_dequeue(unit);
 		}
-		zfcp_port_wait(port);
-		zfcp_sysfs_port_remove_files(&port->sysfs_device,
-					     atomic_read(&port->status));
-		device_unregister(&port->sysfs_device);
+		zfcp_port_dequeue(port);
 	}
 	zfcp_adapter_wait(adapter);
 	zfcp_adapter_dequeue(adapter);
@@ -163,13 +159,15 @@ zfcp_ccw_set_online(struct ccw_device *c
 	down(&zfcp_data.config_sema);
 	adapter = dev_get_drvdata(&ccw_device->dev);
 
+	retval = zfcp_adapter_debug_register(adapter);
+	if (retval)
+		goto out;
 	retval = zfcp_erp_thread_setup(adapter);
 	if (retval) {
-		ZFCP_LOG_INFO("error: out of resources. "
-			      "error recovery thread for adapter %s "
-			      "could not be started\n",
+		ZFCP_LOG_INFO("error: start of error recovery thread for "
+			      "adapter %s failed\n",
 			      zfcp_get_busid_by_adapter(adapter));
-		goto out;
+		goto out_erp_thread;
 	}
 
 	retval = zfcp_adapter_scsi_register(adapter);
@@ -183,6 +181,8 @@ zfcp_ccw_set_online(struct ccw_device *c
 
  out_scsi_register:
 	zfcp_erp_thread_kill(adapter);
+ out_erp_thread:
+	zfcp_adapter_debug_unregister(adapter);
  out:
 	up(&zfcp_data.config_sema);
 	return retval;
@@ -208,6 +208,7 @@ zfcp_ccw_set_offline(struct ccw_device *
 	zfcp_erp_wait(adapter);
 	zfcp_adapter_scsi_unregister(adapter);
 	zfcp_erp_thread_kill(adapter);
+	zfcp_adapter_debug_unregister(adapter);
 	up(&zfcp_data.config_sema);
 	return 0;
 }
@@ -229,15 +230,15 @@ zfcp_ccw_notify(struct ccw_device *ccw_d
 	adapter = dev_get_drvdata(&ccw_device->dev);
 	switch (event) {
 	case CIO_GONE:
-		ZFCP_LOG_NORMAL("Adapter %s: device gone.\n",
+		ZFCP_LOG_NORMAL("adapter %s: device gone\n",
 				zfcp_get_busid_by_adapter(adapter));
 		break;
 	case CIO_NO_PATH:
-		ZFCP_LOG_NORMAL("Adapter %s: no path.\n",
+		ZFCP_LOG_NORMAL("adapter %s: no path\n",
 				zfcp_get_busid_by_adapter(adapter));
 		break;
 	case CIO_OPER:
-		ZFCP_LOG_NORMAL("Adapter %s: operational again.\n",
+		ZFCP_LOG_NORMAL("adapter %s: operational again\n",
 				zfcp_get_busid_by_adapter(adapter));
 		zfcp_erp_modify_adapter_status(adapter,
 					       ZFCP_STATUS_COMMON_RUNNING,
--- diff/drivers/s390/scsi/zfcp_def.h	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/s390/scsi/zfcp_def.h	2004-04-21 10:45:34.683430816 +0100
@@ -33,25 +33,29 @@
 #define ZFCP_DEF_H
 
 /* this drivers version (do not edit !!! generated and updated by cvs) */
-#define ZFCP_DEF_REVISION "$Revision: 1.62 $"
+#define ZFCP_DEF_REVISION "$Revision: 1.71 $"
 
 /*************************** INCLUDES *****************************************/
 
+#include <linux/init.h>
+#include <linux/moduleparam.h>
+#include <linux/miscdevice.h>
+#include <linux/major.h>
 #include <linux/blkdev.h>
 #include <scsi/scsi.h>
 #include <scsi/scsi_tcq.h>
 #include <scsi/scsi_cmnd.h>
 #include <scsi/scsi_device.h>
 #include <scsi/scsi_host.h>
-#include "../../scsi/scsi.h"
 #include "../../fc4/fc.h"
-#include "zfcp_fsf.h"			/* FSF SW Interface */
+#include "zfcp_fsf.h"
 #include <asm/ccwdev.h>
 #include <asm/qdio.h>
 #include <asm/debug.h>
 #include <asm/ebcdic.h>
 #include <linux/reboot.h>
 #include <linux/mempool.h>
+#include <linux/syscalls.h>
 #include <linux/ioctl.h>
 #ifdef CONFIG_S390_SUPPORT
 #include <linux/ioctl32.h>
@@ -60,10 +64,6 @@
 /************************ DEBUG FLAGS *****************************************/
 
 #define	ZFCP_PRINT_FLAGS
-#define	ZFCP_DEBUG_REQUESTS     /* fsf_req tracing */
-#define ZFCP_DEBUG_COMMANDS     /* host_byte tracing */
-#define ZFCP_DEBUG_ABORTS       /* scsi_cmnd abort tracing */
-#define ZFCP_DEBUG_INCOMING_ELS /* incoming ELS tracing */
 #define	ZFCP_STAT_REQSIZES
 #define	ZFCP_STAT_QUEUES
 
@@ -723,11 +723,6 @@ struct zfcp_cfdc_sense_data {
 
 #define ZFCP_CFDC_MAX_CONTROL_FILE_SIZE		127 * 1024
 
-static const char zfcp_act_subtable_type[5][8] = {
-	{"unknown"}, {"OS"}, {"WWPN"}, {"DID"}, {"LUN"}
-};
-
-
 /************************* STRUCTURE DEFINITIONS *****************************/
 
 struct zfcp_fsf_req;
@@ -937,8 +932,6 @@ struct zfcp_erp_action {
 
 
 struct zfcp_adapter {
-	u32			common_magic;	   /* driver common magic */
-	u32			specific_magic;	   /* struct specific magic */
 	struct list_head	list;              /* list of adapters */
 	atomic_t                refcount;          /* reference count */
 	wait_queue_head_t	remove_wq;         /* can be used to wait for
@@ -956,14 +949,12 @@ struct zfcp_adapter {
         u32			hardware_version;  /* of FCP channel */
         u8			serial_number[32]; /* of hardware */
 	struct Scsi_Host	*scsi_host;	   /* Pointer to mid-layer */
-
+	unsigned short          scsi_host_no;      /* Assigned host number */
 	unsigned char		name[9];
 	struct list_head	port_list_head;	   /* remote port list */
 	struct list_head        port_remove_lh;    /* head of ports to be
 						      removed */
 	u32			ports;	           /* number of remote ports */
-	scsi_id_t		max_scsi_id;	   /* largest SCSI ID */
-	scsi_lun_t		max_scsi_lun;	   /* largest SCSI LUN */
         struct timer_list       scsi_er_timer;     /* SCSI err recovery watch */
 	struct list_head	fsf_req_list_head; /* head of FSF req list */
 	rwlock_t		fsf_req_list_lock; /* lock for ops on list of
@@ -1003,9 +994,13 @@ struct zfcp_adapter {
 	struct qdio_initialize  qdio_init_data;    /* for qdio_establish */
 };
 
+/*
+ * the struct device sysfs_device must be at the beginning of this structure.
+ * pointer to struct device is used to free port structure in release function
+ * of the device. don't change!
+ */
 struct zfcp_port {
-	u32		       common_magic;   /* driver wide common magic */
-	u32		       specific_magic; /* structure specific magic */
+	struct device          sysfs_device;   /* sysfs device */
 	struct list_head       list;	       /* list of remote ports */
 	atomic_t               refcount;       /* reference count */
 	wait_queue_head_t      remove_wq;      /* can be used to wait for
@@ -1020,16 +1015,17 @@ struct zfcp_port {
 	wwn_t		       wwnn;	       /* WWNN if known */
 	wwn_t		       wwpn;	       /* WWPN */
 	fc_id_t		       d_id;	       /* D_ID */
-	scsi_lun_t	       max_scsi_lun;   /* largest SCSI LUN */
 	u32		       handle;	       /* handle assigned by FSF */
 	struct zfcp_erp_action erp_action;     /* pending error recovery */
         atomic_t               erp_counter;
-	struct device          sysfs_device;   /* sysfs device */
 };
 
+/* the struct device sysfs_device must be at the beginning of this structure.
+ * pointer to struct device is used to free unit structure in release function
+ * of the device. don't change!
+ */
 struct zfcp_unit {
-	u32		       common_magic;   /* driver wide common magic */
-	u32		       specific_magic; /* structure specific magic */
+	struct device          sysfs_device;   /* sysfs device */
 	struct list_head       list;	       /* list of logical units */
 	atomic_t               refcount;       /* reference count */
 	wait_queue_head_t      remove_wq;      /* can be used to wait for
@@ -1042,15 +1038,12 @@ struct zfcp_unit {
         struct scsi_device     *device;        /* scsi device struct pointer */
 	struct zfcp_erp_action erp_action;     /* pending error recovery */
         atomic_t               erp_counter;
-	struct device          sysfs_device;   /* sysfs device */
 	atomic_t               scsi_add_work;  /* used to synchronize */
 	wait_queue_head_t      scsi_add_wq;    /* wait for scsi_add_device */
 };
 
 /* FSF request */
 struct zfcp_fsf_req {
-	u32		       common_magic;   /* driver wide common magic */
-	u32		       specific_magic; /* structure specific magic */
 	struct list_head       list;	       /* list of FSF requests */
 	struct zfcp_adapter    *adapter;       /* adapter request belongs to */
 	u8		       sbal_number;    /* nr of SBALs free for use */
@@ -1158,13 +1151,6 @@ struct zfcp_fsf_req_pool_element {
 #define ZFCP_INTERRUPTIBLE	1
 #define ZFCP_UNINTERRUPTIBLE	0
 
-/* some magics which may be used to authenticate data structures */
-#define ZFCP_MAGIC		0xFCFCFCFC
-#define ZFCP_MAGIC_ADAPTER	0xAAAAAAAA
-#define ZFCP_MAGIC_PORT		0xBBBBBBBB
-#define ZFCP_MAGIC_UNIT		0xCCCCCCCC
-#define ZFCP_MAGIC_FSFREQ	0xEEEEEEEE
-
 #ifndef atomic_test_mask
 #define atomic_test_mask(mask, target) \
            ((atomic_read(target) & mask) == mask)
--- diff/drivers/s390/scsi/zfcp_erp.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/s390/scsi/zfcp_erp.c	2004-04-21 10:45:34.687430208 +0100
@@ -31,7 +31,7 @@
 #define ZFCP_LOG_AREA			ZFCP_LOG_AREA_ERP
 
 /* this drivers version (do not edit !!! generated and updated by cvs) */
-#define ZFCP_ERP_REVISION "$Revision: 1.44 $"
+#define ZFCP_ERP_REVISION "$Revision: 1.49 $"
 
 #include "zfcp_ext.h"
 
@@ -159,31 +159,6 @@ zfcp_erp_adapter_shutdown_all(void)
 }
 
 /*
- * function:     zfcp_erp_scsi_low_mem_buffer_timeout_handler
- *
- * purpose:      This function needs to be called whenever the SCSI command
- *               in the low memory buffer does not return.
- *               Re-opening the adapter means that the command can be returned
- *               by zfcp (it is guarranteed that it does not return via the
- *               adapter anymore). The buffer can then be used again.
- *    
- * returns:      sod all
- */
-void
-zfcp_erp_scsi_low_mem_buffer_timeout_handler(unsigned long data)
-{
-	struct zfcp_adapter *adapter = (struct zfcp_adapter *) data;
-
-	ZFCP_LOG_NORMAL("warning: Emergency buffer for SCSI I/O timed out. "
-			"Restarting all operations on the adapter %s.\n",
-			zfcp_get_busid_by_adapter(adapter));
-	debug_text_event(adapter->erp_dbf, 1, "scsi_lmem_tout");
-	zfcp_erp_adapter_reopen(adapter, 0);
-
-	return;
-}
-
-/*
  * function:	zfcp_fsf_scsi_er_timeout_handler
  *
  * purpose:     This function needs to be called whenever a SCSI error recovery
@@ -199,10 +174,9 @@ zfcp_fsf_scsi_er_timeout_handler(unsigne
 {
 	struct zfcp_adapter *adapter = (struct zfcp_adapter *) data;
 
-	ZFCP_LOG_NORMAL
-	    ("warning: Emergency buffer for SCSI error handling timed out. "
-	     "Restarting all operations on the adapter %s.\n",
-	     zfcp_get_busid_by_adapter(adapter));
+	ZFCP_LOG_NORMAL("warning: SCSI error recovery timed out. "
+			"Restarting all operations on the adapter %s\n",
+			zfcp_get_busid_by_adapter(adapter));
 	debug_text_event(adapter->erp_dbf, 1, "eh_lmem_tout");
 	zfcp_erp_adapter_reopen(adapter, 0);
 
@@ -225,13 +199,13 @@ zfcp_erp_adapter_reopen_internal(struct 
 	int retval;
 
 	debug_text_event(adapter->erp_dbf, 5, "a_ro");
-	ZFCP_LOG_DEBUG("Reopen on the adapter %s.\n",
+	ZFCP_LOG_DEBUG("reopen adapter %s\n",
 		       zfcp_get_busid_by_adapter(adapter));
 
 	zfcp_erp_adapter_block(adapter, clear_mask);
 
 	if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &adapter->status)) {
-		ZFCP_LOG_DEBUG("skipped reopen on the failed adapter %s.\n",
+		ZFCP_LOG_DEBUG("skipped reopen of failed adapter %s\n",
 			       zfcp_get_busid_by_adapter(adapter));
 		debug_text_event(adapter->erp_dbf, 5, "a_ro_f");
 		/* ensure propagation of failed status to new devices */
@@ -390,9 +364,8 @@ zfcp_els(struct zfcp_port *port, u8 ls_c
 	case ZFCP_LS_RTV:
 		send_els->req->length = sizeof(struct zfcp_ls_rtv);
 		send_els->resp->length = sizeof(struct zfcp_ls_rtv_acc);
-		ZFCP_LOG_NORMAL(
-			"RTV request from sid 0x%06x to did 0x%06x\n",
-			port->adapter->s_id, port->d_id);
+		ZFCP_LOG_INFO("RTV request from s_id 0x%08x to d_id 0x%08x\n",
+			      port->adapter->s_id, port->d_id);
 		break;
 
 	case ZFCP_LS_RLS:
@@ -400,10 +373,9 @@ zfcp_els(struct zfcp_port *port, u8 ls_c
 		send_els->resp->length = sizeof(struct zfcp_ls_rls_acc);
 		rls = (struct zfcp_ls_rls*)req;
 		rls->port_id = port->adapter->s_id;
-		ZFCP_LOG_NORMAL(
-			"RLS request from sid 0x%06x to did 0x%06x "
-			"with payload(port_id=0x%06x)\n",
-			port->adapter->s_id, port->d_id, rls->port_id);
+		ZFCP_LOG_INFO("RLS request from s_id 0x%08x to d_id 0x%08x "
+			      "(port_id=0x%08x)\n",
+			      port->adapter->s_id, port->d_id, rls->port_id);
 		break;
 
 	case ZFCP_LS_PDISC:
@@ -412,11 +384,10 @@ zfcp_els(struct zfcp_port *port, u8 ls_c
 		pdisc = (struct zfcp_ls_pdisc*)req;
 		pdisc->wwpn = port->adapter->wwpn;
 		pdisc->wwnn = port->adapter->wwnn;
-		ZFCP_LOG_NORMAL(
-			"PDISC request from sid 0x%06x to did 0x%06x "
-			"with payload(wwpn=0x%016Lx wwnn=0x%016Lx)\n",
-			port->adapter->s_id, port->d_id,
-			pdisc->wwpn, pdisc->wwnn);
+		ZFCP_LOG_INFO("PDISC request from s_id 0x%08x to d_id 0x%08x "
+			      "(wwpn=0x%016Lx, wwnn=0x%016Lx)\n",
+			      port->adapter->s_id, port->d_id,
+			      pdisc->wwpn, pdisc->wwnn);
 		break;
 
 	case ZFCP_LS_ADISC:
@@ -427,35 +398,33 @@ zfcp_els(struct zfcp_port *port, u8 ls_c
 		adisc->wwpn = port->adapter->wwpn;
 		adisc->wwnn = port->adapter->wwnn;
 		adisc->nport_id = port->adapter->s_id;
-		ZFCP_LOG_NORMAL(
-			"ADISC request from sid 0x%06x to did 0x%06x "
-			"with payload(wwpn=0x%016Lx wwnn=0x%016Lx "
-			"hard_nport_id=0x%06x nport_id=0x%06x)\n",
-			port->adapter->s_id, port->d_id,
-			adisc->wwpn, adisc->wwnn,
-			adisc->hard_nport_id, adisc->nport_id);
+		ZFCP_LOG_INFO("ADISC request from s_id 0x%08x to d_id 0x%08x "
+			      "(wwpn=0x%016Lx, wwnn=0x%016Lx, "
+			      "hard_nport_id=0x%08x, nport_id=0x%08x)\n",
+			      port->adapter->s_id, port->d_id,
+			      adisc->wwpn, adisc->wwnn,
+			      adisc->hard_nport_id, adisc->nport_id);
 		break;
 
 	default:
-		ZFCP_LOG_NORMAL(
-			"ELS command code 0x%02x is not supported\n", ls_code);
+		ZFCP_LOG_NORMAL("ELS command code 0x%02x is not supported\n",
+				ls_code);
 		retval = -EINVAL;
 		goto invalid_ls_code;
 	}
 
 	retval = zfcp_fsf_send_els(send_els);
 	if (retval != 0) {
-		ZFCP_LOG_NORMAL(
-			"ELS request could not be processed "
-			"(sid=0x%06x did=0x%06x)\n",
-			port->adapter->s_id, port->d_id);
+		ZFCP_LOG_NORMAL("error: initiation of Send ELS failed for port "
+				"0x%016Lx on adapter %s\n",
+				port->wwpn, zfcp_get_busid_by_port(port));
 		retval = -EPERM;
 	}
 
 	goto out;
 
 nomem:
-	ZFCP_LOG_INFO("Out of memory!\n");
+	ZFCP_LOG_DEBUG("out of memory\n");
 	retval = -ENOMEM;
 
 invalid_ls_code:
@@ -513,68 +482,53 @@ zfcp_els_handler(unsigned long data)
 		switch (rjt->reason_code) {
 
 		case ZFCP_LS_RJT_INVALID_COMMAND_CODE:
-			ZFCP_LOG_NORMAL(
-				"Invalid command code "
-				"(wwpn=0x%016Lx command=0x%02x)\n",
-				(unsigned long long)port->wwpn,
-				req_code);
+			ZFCP_LOG_INFO("invalid LS command code "
+				      "(wwpn=0x%016Lx, command=0x%02x)\n",
+				      port->wwpn, req_code);
 			break;
 
 		case ZFCP_LS_RJT_LOGICAL_ERROR:
-			ZFCP_LOG_NORMAL(
-				"Logical error "
-				"(wwpn=0x%016Lx reason_explanation=0x%02x)\n",
-				(unsigned long long)port->wwpn,
-				rjt->reason_expl);
+			ZFCP_LOG_INFO("logical error (wwpn=0x%016Lx, "
+				      "reason_expl=0x%02x)\n",
+				      port->wwpn, rjt->reason_expl);
 			break;
 
 		case ZFCP_LS_RJT_LOGICAL_BUSY:
-			ZFCP_LOG_NORMAL(
-				"Logical busy "
-				"(wwpn=0x%016Lx reason_explanation=0x%02x)\n",
-				(unsigned long long)port->wwpn,
-				rjt->reason_expl);
+			ZFCP_LOG_INFO("logical busy (wwpn=0x%016Lx, "
+				      "reason_expl=0x%02x)\n",
+				      port->wwpn, rjt->reason_expl);
 			break;
 
 		case ZFCP_LS_RJT_PROTOCOL_ERROR:
-			ZFCP_LOG_NORMAL(
-				"Protocol error "
-				"(wwpn=0x%016Lx reason_explanation=0x%02x)\n",
-				(unsigned long long)port->wwpn,
-				rjt->reason_expl);
+			ZFCP_LOG_INFO("protocol error (wwpn=0x%016Lx, "
+				      "reason_expl=0x%02x)\n",
+				      port->wwpn, rjt->reason_expl);
 			break;
 
 		case ZFCP_LS_RJT_UNABLE_TO_PERFORM:
-			ZFCP_LOG_NORMAL(
-				"Unable to perform command requested "
-				"(wwpn=0x%016Lx reason_explanation=0x%02x)\n",
-				(unsigned long long)port->wwpn,
-				rjt->reason_expl);
+			ZFCP_LOG_INFO("unable to perform command requested "
+				      "(wwpn=0x%016Lx, reason_expl=0x%02x)\n",
+				      port->wwpn, rjt->reason_expl);
 			break;
 
 		case ZFCP_LS_RJT_COMMAND_NOT_SUPPORTED:
-			ZFCP_LOG_NORMAL(
-				"Command not supported "
-				"(wwpn=0x%016Lx command=0x%02x)\n",
-				(unsigned long long)port->wwpn,
-				req_code);
+			ZFCP_LOG_INFO("command not supported (wwpn=0x%016Lx, "
+				      "command=0x%02x)\n",
+				      port->wwpn, req_code);
 			break;
 
 		case ZFCP_LS_RJT_VENDOR_UNIQUE_ERROR:
-			ZFCP_LOG_NORMAL(
-				"Vendor unique error "
-				"(wwpn=0x%016Lx vendor_unique=0x%02x)\n",
-				(unsigned long long)port->wwpn,
-				rjt->vendor_unique);
+			ZFCP_LOG_INFO("vendor specific error (wwpn=0x%016Lx, "
+				      "vendor_unique=0x%02x)\n",
+				      port->wwpn, rjt->vendor_unique);
 			break;
 
 		default:
-			ZFCP_LOG_NORMAL(
-				"ELS has been rejected by remote port "
-				"with WWPN 0x%Lx on the adapter %s "
-				"with the reason code 0x%02x\n",
-				port->wwpn, zfcp_get_busid_by_port(port),
-				rjt->reason_code);
+			ZFCP_LOG_NORMAL("ELS rejected by remote port 0x%016Lx "
+					"on adapter %s (reason_code=0x%02x)\n",
+					port->wwpn,
+					zfcp_get_busid_by_port(port),
+					rjt->reason_code);
 		}
 		retval = -ENXIO;
 		break;
@@ -584,57 +538,51 @@ zfcp_els_handler(unsigned long data)
 
 		case ZFCP_LS_RTV:
 			rtv = (struct zfcp_ls_rtv_acc*)resp;
-			ZFCP_LOG_NORMAL(
-				"RTV response from did 0x%06x to sid 0x%06x "
-				"with payload(R_A_TOV=%ds E_D_TOV=%d%cs)\n",
-				port->d_id, port->adapter->s_id,
-				rtv->r_a_tov, rtv->e_d_tov,
-				rtv->qualifier & ZFCP_LS_RTV_E_D_TOV_FLAG ?
-					'n' : 'm');
+			ZFCP_LOG_INFO("RTV response from d_id 0x%08x to s_id "
+				      "0x%08x (R_A_TOV=%ds E_D_TOV=%d%cs)\n",
+				      port->d_id, port->adapter->s_id,
+				      rtv->r_a_tov, rtv->e_d_tov,
+				      rtv->qualifier &
+				      ZFCP_LS_RTV_E_D_TOV_FLAG ? 'n' : 'm');
 			break;
 
 		case ZFCP_LS_RLS:
 			rls = (struct zfcp_ls_rls_acc*)resp;
-			ZFCP_LOG_NORMAL(
-				"RLS response from did 0x%06x to sid 0x%06x "
-				"with payload(link_failure_count=%u "
-				"loss_of_sync_count=%u "
-				"loss_of_signal_count=%u "
-				"primitive_sequence_protocol_error=%u "
-				"invalid_transmition_word=%u "
-				"invalid_crc_count=%u)\n",
-				port->d_id, port->adapter->s_id,
-				rls->link_failure_count,
-				rls->loss_of_sync_count,
-				rls->loss_of_signal_count,
-				rls->prim_seq_prot_error,
-				rls->invalid_transmition_word,
-				rls->invalid_crc_count);
+			ZFCP_LOG_INFO("RLS response from d_id 0x%08x to s_id "
+				      "0x%08x (link_failure_count=%u, "
+				      "loss_of_sync_count=%u, "
+				      "loss_of_signal_count=%u, "
+				      "primitive_sequence_protocol_error=%u, "
+				      "invalid_transmition_word=%u, "
+				      "invalid_crc_count=%u)\n",
+				      port->d_id, port->adapter->s_id,
+				      rls->link_failure_count,
+				      rls->loss_of_sync_count,
+				      rls->loss_of_signal_count,
+				      rls->prim_seq_prot_error,
+				      rls->invalid_transmition_word,
+				      rls->invalid_crc_count);
 			break;
 
 		case ZFCP_LS_PDISC:
 			pdisc = (struct zfcp_ls_pdisc_acc*)resp;
-			ZFCP_LOG_NORMAL(
-				"PDISC response from did 0x%06x to sid 0x%06x "
-				"with payload(wwpn=0x%016Lx wwnn=0x%016Lx "
-				"vendor='%-16s')\n",
-				port->d_id, port->adapter->s_id,
-				(unsigned long long)pdisc->wwpn,
-				(unsigned long long)pdisc->wwnn,
-				pdisc->vendor_version);
+			ZFCP_LOG_INFO("PDISC response from d_id 0x%08x to s_id "
+				      "0x%08x (wwpn=0x%016Lx, wwnn=0x%016Lx, "
+				      "vendor='%-16s')\n", port->d_id,
+				      port->adapter->s_id, pdisc->wwpn,
+				      pdisc->wwnn, pdisc->vendor_version);
 			break;
 
 		case ZFCP_LS_ADISC:
 			adisc = (struct zfcp_ls_adisc_acc*)resp;
-			ZFCP_LOG_NORMAL(
-				"ADISC response from did 0x%06x to sid 0x%06x "
-				"with payload(wwpn=0x%016Lx wwnn=0x%016Lx "
-				"hard_nport_id=0x%06x nport_id=0x%06x)\n",
-				port->d_id, port->adapter->s_id,
-				(unsigned long long)adisc->wwpn,
-				(unsigned long long)adisc->wwnn,
-				adisc->hard_nport_id, adisc->nport_id);
-			/* FIXME: missing wwnn value in port struct */
+			ZFCP_LOG_INFO("ADISC response from d_id 0x%08x to s_id "
+				      "0x%08x (wwpn=0x%016Lx, wwnn=0x%016Lx, "
+				      "hard_nport_id=0x%08x, "
+				      "nport_id=0x%08x)\n", port->d_id,
+				      port->adapter->s_id, adisc->wwpn,
+				      adisc->wwnn, adisc->hard_nport_id,
+				      adisc->nport_id);
+			/* FIXME: set wwnn in during open port */
 			if (port->wwnn == 0)
 				port->wwnn = adisc->wwnn;
 			break;
@@ -642,17 +590,16 @@ zfcp_els_handler(unsigned long data)
 		break;
 
 	default:
-		ZFCP_LOG_NORMAL(
-			"Unknown payload code 0x%02x received on a request "
-			"0x%02x from sid 0x%06x to did 0x%06x, "
-			"port needs to be reopened\n",
-			req_code, resp_code, port->adapter->s_id, port->d_id);
+		ZFCP_LOG_NORMAL("unknown payload code 0x%02x received for "
+				"request 0x%02x to d_id 0x%08x, reopen needed "
+				"for port 0x%016Lx on adapter %s\n", resp_code,
+				req_code, port->d_id,  port->wwpn,
+				zfcp_get_busid_by_port(port));
 		retval = zfcp_erp_port_forced_reopen(port, 0);
 		if (retval != 0) {
-			ZFCP_LOG_NORMAL(
-				"Cannot reopen a remote port "
-				"with WWPN 0x%Lx on the adapter %s\n",
-				port->wwpn, zfcp_get_busid_by_port(port));
+			ZFCP_LOG_NORMAL("reopen of remote port 0x%016Lx on "
+					"adapter %s failed\n", port->wwpn,
+					zfcp_get_busid_by_port(port));
 			retval = -EPERM;
 		}
 	}
@@ -681,16 +628,14 @@ zfcp_test_link(struct zfcp_port *port)
 
 	retval = zfcp_els(port, ZFCP_LS_ADISC);
 	if (retval != 0) {
-		ZFCP_LOG_NORMAL(
-			"Port with WWPN 0x%Lx on the adapter %s "
-			"needs to be reopened\n",
-			port->wwpn, zfcp_get_busid_by_port(port));
+		ZFCP_LOG_NORMAL("reopen needed for port 0x%016Lx "
+				"on adapter %s\n ", port->wwpn,
+				zfcp_get_busid_by_port(port));
 		retval = zfcp_erp_port_forced_reopen(port, 0);
 		if (retval != 0) {
-			ZFCP_LOG_NORMAL(
-				"Cannot reopen a remote port "
-				"with WWPN 0x%Lx on the adapter %s\n",
-				port->wwpn, zfcp_get_busid_by_port(port));
+			ZFCP_LOG_NORMAL("reopen of remote port 0x%016Lx "
+					"on adapter %s failed\n", port->wwpn,
+					zfcp_get_busid_by_port(port));
 			retval = -EPERM;
 		}
 	}
@@ -718,16 +663,15 @@ zfcp_erp_port_forced_reopen_internal(str
 	debug_text_event(adapter->erp_dbf, 5, "pf_ro");
 	debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t));
 
-	ZFCP_LOG_DEBUG("Forced reopen of the port with WWPN 0x%Lx "
-		       "on the adapter %s.\n",
+	ZFCP_LOG_DEBUG("forced reopen of port 0x%016Lx on adapter %s\n",
 		       port->wwpn, zfcp_get_busid_by_port(port));
 
 	zfcp_erp_port_block(port, clear_mask);
 
 	if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &port->status)) {
-		ZFCP_LOG_DEBUG("skipped forced reopen on the failed port "
-			       "with WWPN 0x%Lx on the adapter %s.\n",
-			       port->wwpn, zfcp_get_busid_by_port(port));
+		ZFCP_LOG_DEBUG("skipped forced reopen of failed port 0x%016Lx "
+			       "on adapter %s\n", port->wwpn,
+			       zfcp_get_busid_by_port(port));
 		debug_text_event(adapter->erp_dbf, 5, "pf_ro_f");
 		debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t));
 		retval = -EIO;
@@ -786,17 +730,15 @@ zfcp_erp_port_reopen_internal(struct zfc
 	debug_text_event(adapter->erp_dbf, 5, "p_ro");
 	debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t));
 
-	ZFCP_LOG_DEBUG("Reopen of the port with WWPN 0x%Lx "
-		       "on the adapter %s.\n",
+	ZFCP_LOG_DEBUG("reopen of port 0x%016Lx on adapter %s\n",
 		       port->wwpn, zfcp_get_busid_by_port(port));
 
 	zfcp_erp_port_block(port, clear_mask);
 
 	if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &port->status)) {
-		ZFCP_LOG_DEBUG
-		    ("skipped reopen on the failed port with WWPN 0x%Lx "
-		     "on the adapter %s.\n", port->wwpn,
-		     zfcp_get_busid_by_port(port));
+		ZFCP_LOG_DEBUG("skipped reopen of failed port 0x%016Lx "
+			       "on adapter %s\n", port->wwpn,
+			       zfcp_get_busid_by_port(port));
 		debug_text_event(adapter->erp_dbf, 5, "p_ro_f");
 		debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t));
 		/* ensure propagation of failed status to new devices */
@@ -855,20 +797,17 @@ zfcp_erp_unit_reopen_internal(struct zfc
 
 	debug_text_event(adapter->erp_dbf, 5, "u_ro");
 	debug_event(adapter->erp_dbf, 5, &unit->fcp_lun, sizeof (fcp_lun_t));
-	ZFCP_LOG_DEBUG("Reopen of the unit with FCP LUN 0x%Lx on the "
-		       "port with WWPN 0x%Lx "
-		       "on the adapter %s.\n",
-		       unit->fcp_lun,
+	ZFCP_LOG_DEBUG("reopen of unit 0x%016Lx on port 0x%016Lx "
+		       "on adapter %s\n", unit->fcp_lun,
 		       unit->port->wwpn, zfcp_get_busid_by_unit(unit));
 
 	zfcp_erp_unit_block(unit, clear_mask);
 
 	if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &unit->status)) {
-		ZFCP_LOG_DEBUG
-		    ("skipped reopen on the failed unit with FCP LUN 0x%Lx "
-		     "on the port with WWPN 0x%Lx " "on the adapter %s.\n",
-		     unit->fcp_lun, unit->port->wwpn,
-		     zfcp_get_busid_by_unit(unit));
+		ZFCP_LOG_DEBUG("skipped reopen of failed unit 0x%016Lx "
+			       "on port 0x%016Lx on adapter %s\n",
+			       unit->fcp_lun, unit->port->wwpn,
+			       zfcp_get_busid_by_unit(unit));
 		debug_text_event(adapter->erp_dbf, 5, "u_ro_f");
 		debug_event(adapter->erp_dbf, 5, &unit->fcp_lun,
 			    sizeof (fcp_lun_t));
@@ -1115,14 +1054,10 @@ zfcp_erp_strategy_check_fsfreq(struct zf
 				fsf_req->status |= ZFCP_STATUS_FSFREQ_DISMISSED;
 			}
 			if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) {
-				ZFCP_LOG_NORMAL
-					("error: Error Recovery Procedure "
-					 "step timed out. The action flag "
-					 "is 0x%x. The FSF request "
-					 "is at 0x%lx\n",
-					 erp_action->action,
-					 (unsigned long)
-					 erp_action->fsf_req);
+				ZFCP_LOG_NORMAL("error: erp step timed out "
+						"(action=%d, fsf_req=%p)\n ",
+						erp_action->action,
+						erp_action->fsf_req);
 			}
 			/*
 			 * If fsf_req is neither dismissed nor completed
@@ -1202,7 +1137,7 @@ zfcp_erp_async_handler_nolock(struct zfc
  * returns:	0 - there was an action to handle
  *		!0 - otherwise
  */
-static int
+int
 zfcp_erp_async_handler(struct zfcp_erp_action *erp_action,
 		       unsigned long set_mask)
 {
@@ -1218,28 +1153,6 @@ zfcp_erp_async_handler(struct zfcp_erp_a
 }
 
 /*
- * purpose:	is called for finished FSF requests related to erp,
- *		moves concerned erp action to 'ready' queue and
- *		signals erp thread to process it,
- *		besides it cancels a timeout
- */
-void
-zfcp_erp_fsf_req_handler(struct zfcp_fsf_req *fsf_req)
-{
-	struct zfcp_erp_action *erp_action = fsf_req->erp_action;
-	struct zfcp_adapter *adapter = fsf_req->adapter;
-
-	debug_text_event(adapter->erp_dbf, 3, "a_frh");
-	debug_event(adapter->erp_dbf, 3, &erp_action->action, sizeof (int));
-
-	if (erp_action) {
-		debug_event(adapter->erp_dbf, 3, &erp_action->action,
-			    sizeof (int));
-		zfcp_erp_async_handler(erp_action, 0);
-	}
-}
-
-/*
  * purpose:	is called for erp_action which was slept waiting for
  *		memory becoming avaliable,
  *		will trigger that this action will be continued
@@ -1309,9 +1222,8 @@ zfcp_erp_thread_setup(struct zfcp_adapte
 
 	retval = kernel_thread(zfcp_erp_thread, adapter, SIGCHLD);
 	if (retval < 0) {
-		ZFCP_LOG_NORMAL("error: Out of resources. Could not create an "
-				"error recovery procedure thread "
-				"for the adapter %s.\n",
+		ZFCP_LOG_NORMAL("error: creation of erp thread failed for "
+				"adapter %s\n",
 				zfcp_get_busid_by_adapter(adapter));
 		debug_text_event(adapter->erp_dbf, 5, "a_thset_fail");
 	} else {
@@ -1497,11 +1409,10 @@ zfcp_erp_strategy(struct zfcp_erp_action
 		 */
 		if (adapter->erp_total_count == adapter->erp_low_mem_count) {
 			debug_text_event(adapter->erp_dbf, 3, "a_st_lowmem");
-			ZFCP_LOG_NORMAL
-				("error: Out of memory. No mempool elements "
-				 "available. Restarting IO on the adapter %s "
-				 "to free mempool.\n",
-				 zfcp_get_busid_by_adapter(adapter));
+			ZFCP_LOG_NORMAL("error: no mempool elements available, "
+					"restarting I/O on adapter %s "
+					"to free mempool\n",
+					zfcp_get_busid_by_adapter(adapter));
 			zfcp_erp_adapter_reopen_internal(adapter, 0);
 		} else {
 		debug_text_event(adapter->erp_dbf, 2, "a_st_memw");
@@ -1640,9 +1551,8 @@ zfcp_erp_strategy_do_action(struct zfcp_
 		debug_text_exception(adapter->erp_dbf, 1, "a_stda_bug");
 		debug_event(adapter->erp_dbf, 1, &erp_action->action,
 			    sizeof (int));
-		ZFCP_LOG_NORMAL("bug: Unknown error recovery procedure "
-				"action requested on the adapter %s "
-				"(debug info %d)\n",
+		ZFCP_LOG_NORMAL("bug: unknown erp action requested on "
+				"adapter %s (action=%d)\n",
 				zfcp_get_busid_by_adapter(erp_action->adapter),
 				erp_action->action);
 	}
@@ -1686,8 +1596,8 @@ zfcp_erp_adapter_failed(struct zfcp_adap
 {
 	zfcp_erp_modify_adapter_status(adapter,
 				       ZFCP_STATUS_COMMON_ERP_FAILED, ZFCP_SET);
-	ZFCP_LOG_NORMAL("Adapter recovery failed on the "
-			"adapter %s.\n", zfcp_get_busid_by_adapter(adapter));
+	ZFCP_LOG_NORMAL("adapter erp failed on adapter %s\n",
+			zfcp_get_busid_by_adapter(adapter));
 	debug_text_event(adapter->erp_dbf, 2, "a_afail");
 }
 
@@ -1703,9 +1613,7 @@ zfcp_erp_port_failed(struct zfcp_port *p
 	zfcp_erp_modify_port_status(port,
 				    ZFCP_STATUS_COMMON_ERP_FAILED, ZFCP_SET);
 
-	ZFCP_LOG_NORMAL("Port recovery failed on the "
-			"port with WWPN 0x%Lx at the "
-			"adapter %s.\n",
+	ZFCP_LOG_NORMAL("port erp failed on port 0x%016Lx on adapter %s\n",
 			port->wwpn, zfcp_get_busid_by_port(port));
 	debug_text_event(port->adapter->erp_dbf, 2, "p_pfail");
 	debug_event(port->adapter->erp_dbf, 2, &port->wwpn, sizeof (wwn_t));
@@ -1723,10 +1631,8 @@ zfcp_erp_unit_failed(struct zfcp_unit *u
 	zfcp_erp_modify_unit_status(unit,
 				    ZFCP_STATUS_COMMON_ERP_FAILED, ZFCP_SET);
 
-	ZFCP_LOG_NORMAL("Unit recovery failed on the unit with FCP LUN 0x%Lx "
-			"connected to the port with WWPN 0x%Lx at the "
-			"adapter %s.\n",
-			unit->fcp_lun,
+	ZFCP_LOG_NORMAL("unit erp failed on unit 0x%016Lx on port 0x%016Lx "
+			" on adapter %s\n", unit->fcp_lun,
 			unit->port->wwpn, zfcp_get_busid_by_unit(unit));
 	debug_text_event(unit->port->adapter->erp_dbf, 2, "u_ufail");
 	debug_event(unit->port->adapter->erp_dbf, 2,
@@ -1885,14 +1791,11 @@ zfcp_erp_schedule_work(struct zfcp_unit 
 		return 0;
 
 	if ((p = kmalloc(sizeof(*p), GFP_KERNEL)) == NULL) {
-		ZFCP_LOG_NORMAL("error: Out of resources. Could not register "
-			      "the FCP-LUN 0x%Lx connected to "
-			      "the port with WWPN 0x%Lx connected to "
-			      "the adapter %s with the SCSI stack.\n",
-			      unit->fcp_lun,
-			      unit->port->wwpn,
-			      zfcp_get_busid_by_unit(unit));
-		atomic_set(&p->unit->scsi_add_work, 0);
+		ZFCP_LOG_NORMAL("error: registration at SCSI stack failed for "
+				"unit 0x%016Lx on port 0x%016Lx on "
+				"adapter %s\n", unit->fcp_lun, unit->port->wwpn,
+				zfcp_get_busid_by_unit(unit));
+		atomic_set(&unit->scsi_add_work, 0);
 		return -ENOMEM;
 	}
 
@@ -2301,7 +2204,7 @@ zfcp_erp_adapter_strategy(struct zfcp_er
 
 	if (retval == ZFCP_ERP_FAILED) {
 		ZFCP_LOG_INFO("Waiting to allow the adapter %s "
-			      "to recover itself\n.",
+			      "to recover itself\n",
 			      zfcp_get_busid_by_adapter(adapter));
 		/*
 		 * SUGGESTION: substitute by
@@ -2417,25 +2320,23 @@ zfcp_erp_adapter_strategy_open_qdio(stru
 	int retval_cleanup = 0;
 
 	if (atomic_test_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status)) {
-		ZFCP_LOG_NORMAL
-		    ("bug: QDIO (data transfer mechanism) start-up on "
-		     "adapter %s attempted twice. Second attempt ignored.\n",
-		     zfcp_get_busid_by_adapter(adapter));
+		ZFCP_LOG_NORMAL("bug: second attempt to set up QDIO on "
+				"adapter %s\n",
+				zfcp_get_busid_by_adapter(adapter));
 		goto failed_sanity;
 	}
 
 	if (qdio_establish(&adapter->qdio_init_data) != 0) {
-		ZFCP_LOG_INFO
-		    ("error: Could not establish queues for QDIO (data "
-		     "transfer mechanism) operation on adapter %s\n.",
-		     zfcp_get_busid_by_adapter(adapter));
+		ZFCP_LOG_INFO("error: establishment of QDIO queues failed "
+			      "on adapter %s\n.",
+			      zfcp_get_busid_by_adapter(adapter));
 		goto failed_qdio_establish;
 	}
 	ZFCP_LOG_DEBUG("queues established\n");
 
 	if (qdio_activate(adapter->ccw_device, 0) != 0) {
-		ZFCP_LOG_INFO("error: Could not activate queues for QDIO (data "
-			      "transfer mechanism) operation on adapter %s\n.",
+		ZFCP_LOG_INFO("error: activation of QDIO queues failed "
+			      "on adapter %s\n",
 			      zfcp_get_busid_by_adapter(adapter));
 		goto failed_qdio_activate;
 	}
@@ -2451,8 +2352,8 @@ zfcp_erp_adapter_strategy_open_qdio(stru
 		sbale->addr = 0;
 	}
 
-	ZFCP_LOG_TRACE("Calling do QDIO busid=%s, flags=0x%x, queue_no=%i, "
-		       "index_in_queue=%i, count=%i\n",
+	ZFCP_LOG_TRACE("calling do_QDIO on adapter %s (flags=0x%x, "
+		       "queue_no=%i, index_in_queue=%i, count=%i)\n",
 		       zfcp_get_busid_by_adapter(adapter),
 		       QDIO_FLAG_SYNC_INPUT, 0, 0, QDIO_MAX_BUFFERS_PER_Q);
 
@@ -2461,17 +2362,14 @@ zfcp_erp_adapter_strategy_open_qdio(stru
 			 0, 0, QDIO_MAX_BUFFERS_PER_Q, NULL);
 
 	if (retval) {
-		ZFCP_LOG_NORMAL
-		    ("bug: QDIO (data transfer mechanism) inobund transfer "
-		     "structures could not be set-up (debug info %d)\n",
-		     retval);
+		ZFCP_LOG_NORMAL("bug: setup of QDIO failed (retval=%d)\n",
+				retval);
 		goto failed_do_qdio;
 	} else {
 		adapter->response_queue.free_index = 0;
 		atomic_set(&adapter->response_queue.free_count, 0);
-		ZFCP_LOG_DEBUG
-		    ("%i buffers successfully enqueued to response queue\n",
-		     QDIO_MAX_BUFFERS_PER_Q);
+		ZFCP_LOG_DEBUG("%i buffers successfully enqueued to "
+			       "response queue\n", QDIO_MAX_BUFFERS_PER_Q);
 	}
 	/* set index of first avalable SBALS / number of available SBALS */
 	adapter->request_queue.free_index = 0;
@@ -2496,14 +2394,11 @@ zfcp_erp_adapter_strategy_open_qdio(stru
 	retval_cleanup = qdio_shutdown(adapter->ccw_device,
 				       QDIO_FLAG_CLEANUP_USING_CLEAR);
 	if (retval_cleanup) {
-		ZFCP_LOG_NORMAL
-		    ("bug: Could not clean QDIO (data transfer mechanism) "
-		     "queues. (debug info %i).\n", retval_cleanup);
+		ZFCP_LOG_NORMAL("bug: shutdown of QDIO queues failed "
+				"(retval=%d)\n", retval_cleanup);
 	}
-#ifdef ZFCP_DEBUG_REQUESTS
 	else
 		debug_text_event(adapter->req_dbf, 1, "q_clean");
-#endif				/* ZFCP_DEBUG_REQUESTS */
 
  failed_qdio_establish:
 	atomic_clear_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status);
@@ -2532,9 +2427,8 @@ zfcp_erp_adapter_strategy_close_qdio(str
 	struct zfcp_adapter *adapter = erp_action->adapter;
 
 	if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status)) {
-		ZFCP_LOG_DEBUG("Termination of QDIO (data transfer operation) "
-			       "attempted for an inactive qdio on the "
-			       "adapter %s....ignored.\n",
+		ZFCP_LOG_DEBUG("error: attempt to shut down inactive QDIO "
+			       "queues on adapter %s\n",
 			       zfcp_get_busid_by_adapter(adapter));
 		retval = ZFCP_ERP_FAILED;
 		goto out;
@@ -2571,15 +2465,12 @@ zfcp_erp_adapter_strategy_close_qdio(str
 		 * FIXME(design):
 		 * What went wrong? What to do best? Proper retval?
 		 */
-		ZFCP_LOG_NORMAL
-		    ("error: Clean-up of QDIO (data transfer mechanism) "
-		     "structures failed for adapter %s.\n",
-		     zfcp_get_busid_by_adapter(adapter));
+		ZFCP_LOG_NORMAL("bug: shutdown of QDIO queues failed on "
+				"adapter %s\n",
+				zfcp_get_busid_by_adapter(adapter));
 	} else {
 		ZFCP_LOG_DEBUG("queues cleaned up\n");
-#ifdef ZFCP_DEBUG_REQUESTS
 		debug_text_event(adapter->req_dbf, 1, "q_clean");
-#endif				/* ZFCP_DEBUG_REQUESTS */
 	}
 
 	/*
@@ -2657,10 +2548,9 @@ zfcp_erp_adapter_strategy_open_fsf_xconf
 		if (zfcp_fsf_exchange_config_data(erp_action)) {
 			retval = ZFCP_ERP_FAILED;
 			debug_text_event(adapter->erp_dbf, 5, "a_fstx_xf");
-			ZFCP_LOG_INFO("error: Out of resources. Could not "
-				      "start exchange of configuration data "
-				      "between the adapter %s "
-				      "and the device driver.\n",
+			ZFCP_LOG_INFO("error:  initiation of exchange of "
+				      "configuration data failed for "
+				      "adapter %s\n",
 				      zfcp_get_busid_by_adapter(adapter));
 			break;
 		}
@@ -2682,17 +2572,15 @@ zfcp_erp_adapter_strategy_open_fsf_xconf
 		 */
 		down_interruptible(&adapter->erp_ready_sem);
 		if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) {
-			ZFCP_LOG_INFO
-			    ("error: Exchange of configuration data between "
-			     "the adapter with %s and the device "
-			     "driver timed out\n",
-			     zfcp_get_busid_by_adapter(adapter));
+			ZFCP_LOG_INFO("error: exchange of configuration data "
+				      "for adapter %s timed out\n",
+				      zfcp_get_busid_by_adapter(adapter));
 			break;
 		}
 		if (atomic_test_mask(ZFCP_STATUS_ADAPTER_HOST_CON_INIT,
 				     &adapter->status)) {
-			ZFCP_LOG_DEBUG("Host connection still initialising... "
-				       "waiting and retrying....\n");
+			ZFCP_LOG_DEBUG("host connection still initialising... "
+				       "waiting and retrying...\n");
 			/* sleep a little bit before retry */
 			set_current_state(TASK_INTERRUPTIBLE);
 			schedule_timeout(ZFCP_EXCHANGE_CONFIG_DATA_SLEEP);
@@ -2703,8 +2591,8 @@ zfcp_erp_adapter_strategy_open_fsf_xconf
 
 	if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK,
 			      &adapter->status)) {
-		ZFCP_LOG_INFO("error: Exchange of configuration data between "
-			      "the adapter %s and the device driver failed.\n",
+		ZFCP_LOG_INFO("error: exchange of configuration data for "
+			      "adapter %s failed\n",
 			      zfcp_get_busid_by_adapter(adapter));
 		retval = ZFCP_ERP_FAILED;
 	}
@@ -2732,10 +2620,8 @@ zfcp_erp_adapter_strategy_open_fsf_statu
 	for (i = 0; i < ZFCP_STATUS_READS_RECOM; i++) {
 		temp_ret = zfcp_fsf_status_read(adapter, ZFCP_WAIT_FOR_SBAL);
 		if (temp_ret < 0) {
-			ZFCP_LOG_INFO("error: Out of resources. Could not "
-				      "set-up the infrastructure for "
-				      "unsolicited status presentation "
-				      "for the adapter %s.\n",
+			ZFCP_LOG_INFO("error: set-up of unsolicited status "
+				      "notification failed on adapter %s\n",
 				      zfcp_get_busid_by_adapter(adapter));
 			retval = ZFCP_ERP_FAILED;
 			i--;
@@ -2807,9 +2693,8 @@ zfcp_erp_port_forced_strategy(struct zfc
 		if (atomic_test_mask((ZFCP_STATUS_PORT_PHYS_OPEN |
 				      ZFCP_STATUS_COMMON_OPEN),
 			             &port->status)) {
-			ZFCP_LOG_DEBUG("Port wwpn=0x%Lx is open -> trying "
-				       " close physical\n",
-				       port->wwpn);
+			ZFCP_LOG_DEBUG("port 0x%016Lx is open -> trying "
+				       "close physical\n", port->wwpn);
 			retval =
 			    zfcp_erp_port_forced_strategy_close(erp_action);
 		} else
@@ -2819,9 +2704,8 @@ zfcp_erp_port_forced_strategy(struct zfc
 	case ZFCP_ERP_STEP_PHYS_PORT_CLOSING:
 		if (atomic_test_mask(ZFCP_STATUS_PORT_PHYS_OPEN,
 				     &port->status)) {
-			ZFCP_LOG_DEBUG
-				("failed to close physical port wwpn=0x%Lx\n",
-				 port->wwpn);
+			ZFCP_LOG_DEBUG("close physical failed for port "
+				       "0x%016Lx\n", port->wwpn);
 			retval = ZFCP_ERP_FAILED;
 		} else
 			retval = ZFCP_ERP_SUCCEEDED;
@@ -2861,9 +2745,8 @@ zfcp_erp_port_strategy(struct zfcp_erp_a
 	case ZFCP_ERP_STEP_UNINITIALIZED:
 		zfcp_erp_port_strategy_clearstati(port);
 		if (atomic_test_mask(ZFCP_STATUS_COMMON_OPEN, &port->status)) {
-			ZFCP_LOG_DEBUG
-			    ("port wwpn=0x%Lx is open -> trying close\n",
-			     port->wwpn);
+			ZFCP_LOG_DEBUG("port 0x%016Lx is open -> trying "
+				       "close\n", port->wwpn);
 			retval = zfcp_erp_port_strategy_close(erp_action);
 			goto out;
 		}		/* else it's already closed, open it */
@@ -2871,7 +2754,7 @@ zfcp_erp_port_strategy(struct zfcp_erp_a
 
 	case ZFCP_ERP_STEP_PORT_CLOSING:
 		if (atomic_test_mask(ZFCP_STATUS_COMMON_OPEN, &port->status)) {
-			ZFCP_LOG_DEBUG("failed to close port wwpn=0x%Lx\n",
+			ZFCP_LOG_DEBUG("close failed for port 0x%016Lx\n",
 				       port->wwpn);
 			retval = ZFCP_ERP_FAILED;
 			goto out;
@@ -2937,19 +2820,17 @@ zfcp_erp_port_strategy_open_common(struc
 		if (!(adapter->nameserver_port)) {
 			retval = zfcp_nameserver_enqueue(adapter);
 			if (retval != 0) {
-				ZFCP_LOG_NORMAL
-				    ("error: nameserver port not available "
-				     "(adapter with busid %s)\n",
-				     zfcp_get_busid_by_adapter(adapter));
+				ZFCP_LOG_NORMAL("error: nameserver port "
+						"unavailable for adapter %s\n",
+						zfcp_get_busid_by_adapter(adapter));
 				retval = ZFCP_ERP_FAILED;
 				break;
 			}
 		}
 		if (!atomic_test_mask(ZFCP_STATUS_COMMON_UNBLOCKED,
 				      &adapter->nameserver_port->status)) {
-			ZFCP_LOG_DEBUG
-			    ("nameserver port is not open -> open "
-			     "nameserver port\n");
+			ZFCP_LOG_DEBUG("nameserver port is not open -> open "
+				       "nameserver port\n");
 			/* nameserver port may live again */
 			atomic_set_mask(ZFCP_STATUS_COMMON_RUNNING,
 					&adapter->nameserver_port->status);
@@ -2962,12 +2843,11 @@ zfcp_erp_port_strategy_open_common(struc
 	case ZFCP_ERP_STEP_NAMESERVER_OPEN:
 		if (!atomic_test_mask(ZFCP_STATUS_COMMON_OPEN,
 				      &adapter->nameserver_port->status)) {
-			ZFCP_LOG_DEBUG("failed to open nameserver port\n");
+			ZFCP_LOG_DEBUG("open failed for nameserver port\n");
 			retval = ZFCP_ERP_FAILED;
 		} else {
 			ZFCP_LOG_DEBUG("nameserver port is open -> "
-				       "ask nameserver for current D_ID of "
-				       "port with WWPN 0x%Lx\n",
+				       "nameserver look-up for port 0x%016Lx\n",
 				       port->wwpn);
 			retval = zfcp_erp_port_strategy_open_common_lookup
 				(erp_action);
@@ -2978,21 +2858,20 @@ zfcp_erp_port_strategy_open_common(struc
 		if (!atomic_test_mask(ZFCP_STATUS_PORT_DID_DID, &port->status)) {
 			if (atomic_test_mask
 			    (ZFCP_STATUS_PORT_INVALID_WWPN, &port->status)) {
-				ZFCP_LOG_DEBUG
-				    ("failed to look up the D_ID of the port wwpn=0x%Lx "
-				     "(misconfigured WWPN?)\n", port->wwpn);
+				ZFCP_LOG_DEBUG("nameserver look-up failed "
+					       "for port 0x%016Lx "
+					       "(misconfigured WWPN?)\n",
+					       port->wwpn);
 				zfcp_erp_port_failed(port);
 				retval = ZFCP_ERP_EXIT;
 			} else {
-				ZFCP_LOG_DEBUG
-				    ("failed to look up the D_ID of the port wwpn=0x%Lx\n",
-				     port->wwpn);
+				ZFCP_LOG_DEBUG("nameserver look-up failed for "
+					       "port 0x%016Lx\n", port->wwpn);
 				retval = ZFCP_ERP_FAILED;
 			}
 		} else {
-			ZFCP_LOG_DEBUG
-			    ("port wwpn=0x%Lx has D_ID=0x%6.6x -> trying open\n",
-			     port->wwpn, (unsigned int) port->d_id);
+			ZFCP_LOG_DEBUG("port 0x%016Lx has d_id=0x%08x -> "
+				       "trying open\n", port->wwpn, port->d_id);
 			retval = zfcp_erp_port_strategy_open_port(erp_action);
 		}
 		break;
@@ -3002,17 +2881,17 @@ zfcp_erp_port_strategy_open_common(struc
 		if (atomic_test_mask((ZFCP_STATUS_COMMON_OPEN |
 				      ZFCP_STATUS_PORT_DID_DID),
 				     &port->status)) {
-			ZFCP_LOG_DEBUG("port wwpn=0x%Lx is open\n", port->wwpn);
+			ZFCP_LOG_DEBUG("port 0x%016Lx is open\n", port->wwpn);
 			retval = ZFCP_ERP_SUCCEEDED;
 		} else {
-			ZFCP_LOG_DEBUG("failed to open port wwpn=0x%Lx\n",
+			ZFCP_LOG_DEBUG("open failed for port 0x%016Lx\n",
 				       port->wwpn);
 			retval = ZFCP_ERP_FAILED;
 		}
 		break;
 
 	default:
-		ZFCP_LOG_NORMAL("bug: unkown erp step 0x%x\n",
+		ZFCP_LOG_NORMAL("bug: unknown erp step 0x%08x\n",
 				erp_action->step);
 		retval = ZFCP_ERP_FAILED;
 	}
@@ -3038,9 +2917,8 @@ zfcp_erp_port_strategy_open_nameserver(s
 	case ZFCP_ERP_STEP_UNINITIALIZED:
 	case ZFCP_ERP_STEP_PHYS_PORT_CLOSING:
 	case ZFCP_ERP_STEP_PORT_CLOSING:
-		ZFCP_LOG_DEBUG
-		    ("port wwpn=0x%Lx has D_ID=0x%6.6x -> trying open\n",
-		     port->wwpn, (unsigned int) port->d_id);
+		ZFCP_LOG_DEBUG("port 0x%016Lx has d_id=0x%08x -> trying open\n",
+			       port->wwpn, port->d_id);
 		retval = zfcp_erp_port_strategy_open_port(erp_action);
 		break;
 
@@ -3049,7 +2927,7 @@ zfcp_erp_port_strategy_open_nameserver(s
 			ZFCP_LOG_DEBUG("nameserver port is open\n");
 			retval = ZFCP_ERP_SUCCEEDED;
 		} else {
-			ZFCP_LOG_DEBUG("failed to open nameserver port\n");
+			ZFCP_LOG_DEBUG("open failed for nameserver port\n");
 			retval = ZFCP_ERP_FAILED;
 		}
 		/* this is needed anyway (dont care for retval of wakeup) */
@@ -3058,7 +2936,7 @@ zfcp_erp_port_strategy_open_nameserver(s
 		break;
 
 	default:
-		ZFCP_LOG_NORMAL("bug: unkown erp step 0x%x\n",
+		ZFCP_LOG_NORMAL("bug: unknown erp step 0x%08x\n",
 				erp_action->step);
 		retval = ZFCP_ERP_FAILED;
 	}
@@ -3304,25 +3182,23 @@ zfcp_erp_unit_strategy(struct zfcp_erp_a
 	case ZFCP_ERP_STEP_UNINITIALIZED:
 		zfcp_erp_unit_strategy_clearstati(unit);
 		if (atomic_test_mask(ZFCP_STATUS_COMMON_OPEN, &unit->status)) {
-			ZFCP_LOG_DEBUG
-			    ("unit fcp_lun=0x%Lx is open -> trying close\n",
-			     unit->fcp_lun);
+			ZFCP_LOG_DEBUG("unit 0x%016Lx is open -> "
+				       "trying close\n", unit->fcp_lun);
 			retval = zfcp_erp_unit_strategy_close(erp_action);
 			break;
 		}
 		/* else it's already closed, fall through */
 	case ZFCP_ERP_STEP_UNIT_CLOSING:
 		if (atomic_test_mask(ZFCP_STATUS_COMMON_OPEN, &unit->status)) {
-			ZFCP_LOG_DEBUG("failed to close unit fcp_lun=0x%Lx\n",
+			ZFCP_LOG_DEBUG("close failed for unit 0x%016Lx\n",
 				       unit->fcp_lun);
 			retval = ZFCP_ERP_FAILED;
 		} else {
 			if (erp_action->status & ZFCP_STATUS_ERP_CLOSE_ONLY)
 				retval = ZFCP_ERP_EXIT;
 			else {
-				ZFCP_LOG_DEBUG("unit fcp_lun=0x%Lx is not "
-					       "open -> trying open\n",
-					       unit->fcp_lun);
+				ZFCP_LOG_DEBUG("unit 0x%016Lx is not open -> "
+					       "trying open\n", unit->fcp_lun);
 				retval =
 				    zfcp_erp_unit_strategy_open(erp_action);
 			}
@@ -3331,11 +3207,11 @@ zfcp_erp_unit_strategy(struct zfcp_erp_a
 
 	case ZFCP_ERP_STEP_UNIT_OPENING:
 		if (atomic_test_mask(ZFCP_STATUS_COMMON_OPEN, &unit->status)) {
-			ZFCP_LOG_DEBUG("unit fcp_lun=0x%Lx is open\n",
+			ZFCP_LOG_DEBUG("unit 0x%016Lx is open\n",
 				       unit->fcp_lun);
 			retval = ZFCP_ERP_SUCCEEDED;
 		} else {
-			ZFCP_LOG_DEBUG("failed to open unit fcp_lun=0x%Lx\n",
+			ZFCP_LOG_DEBUG("open failed for unit 0x%016Lx\n",
 				       unit->fcp_lun);
 			retval = ZFCP_ERP_FAILED;
 		}
@@ -3572,9 +3448,8 @@ zfcp_erp_action_enqueue(int action,
 	default:
 		debug_text_exception(adapter->erp_dbf, 1, "a_actenq_bug");
 		debug_event(adapter->erp_dbf, 1, &action, sizeof (int));
-		ZFCP_LOG_NORMAL("bug: Unknown error recovery procedure "
-				"action requested on the adapter %s "
-				"(debug info %d)\n",
+		ZFCP_LOG_NORMAL("bug: unknown erp action requested "
+				"on adapter %s (action=%d)\n",
 				zfcp_get_busid_by_adapter(adapter), action);
 		goto out;
 	}
@@ -3584,8 +3459,8 @@ zfcp_erp_action_enqueue(int action,
 		debug_text_event(adapter->erp_dbf, 4, "a_actenq_str");
 		debug_event(adapter->erp_dbf, 4, &stronger_action,
 			    sizeof (int));
-		ZFCP_LOG_DEBUG("shortcut: need erp action %i before "
-			       "erp action %i (adapter busid=%s)\n",
+		ZFCP_LOG_DEBUG("stronger erp action %d needed before "
+			       "erp action %d on adapter %s\n",
 			       stronger_action, action,
 			       zfcp_get_busid_by_adapter(adapter));
 		action = stronger_action;
--- diff/drivers/s390/scsi/zfcp_ext.h	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/s390/scsi/zfcp_ext.h	2004-04-21 10:45:34.688430056 +0100
@@ -31,7 +31,7 @@
 #ifndef ZFCP_EXT_H
 #define ZFCP_EXT_H
 /* this drivers version (do not edit !!! generated and updated by cvs) */
-#define ZFCP_EXT_REVISION "$Revision: 1.45 $"
+#define ZFCP_EXT_REVISION "$Revision: 1.49 $"
 
 #include "zfcp_def.h"
 
@@ -55,7 +55,9 @@ extern struct zfcp_unit *zfcp_get_unit_b
 extern struct zfcp_port *zfcp_get_port_by_wwpn(struct zfcp_adapter *,
 					       wwn_t wwpn);
 extern struct zfcp_adapter *zfcp_adapter_enqueue(struct ccw_device *);
+extern int    zfcp_adapter_debug_register(struct zfcp_adapter *);
 extern void   zfcp_adapter_dequeue(struct zfcp_adapter *);
+extern void   zfcp_adapter_debug_unregister(struct zfcp_adapter *);
 extern struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *, wwn_t, u32);
 extern void   zfcp_port_dequeue(struct zfcp_port *);
 extern struct zfcp_unit *zfcp_unit_enqueue(struct zfcp_port *, fcp_lun_t);
@@ -154,11 +156,10 @@ extern int  zfcp_erp_unit_reopen(struct 
 extern int  zfcp_erp_unit_shutdown(struct zfcp_unit *, int);
 extern void zfcp_erp_unit_failed(struct zfcp_unit *);
 
-extern void zfcp_erp_scsi_low_mem_buffer_timeout_handler(unsigned long);
 extern int  zfcp_erp_thread_setup(struct zfcp_adapter *);
 extern int  zfcp_erp_thread_kill(struct zfcp_adapter *);
 extern int  zfcp_erp_wait(struct zfcp_adapter *);
-extern void zfcp_erp_fsf_req_handler(struct zfcp_fsf_req *);
+extern int  zfcp_erp_async_handler(struct zfcp_erp_action *, unsigned long);
 
 extern int  zfcp_test_link(struct zfcp_port *);
 
--- diff/drivers/s390/scsi/zfcp_fsf.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/s390/scsi/zfcp_fsf.c	2004-04-21 10:45:34.697428688 +0100
@@ -29,7 +29,7 @@
  */
 
 /* this drivers version (do not edit !!! generated and updated by cvs) */
-#define ZFCP_FSF_C_REVISION "$Revision: 1.29 $"
+#define ZFCP_FSF_C_REVISION "$Revision: 1.43 $"
 
 #include "zfcp_ext.h"
 
@@ -78,6 +78,11 @@ static u32 fsf_qtcb_type[] = {
 	[FSF_QTCB_UPLOAD_CONTROL_FILE] =  FSF_SUPPORT_COMMAND
 };
 
+static const char zfcp_act_subtable_type[5][8] = {
+	{"unknown"}, {"OS"}, {"WWPN"}, {"DID"}, {"LUN"}
+};
+
+
 /****************************************************************/
 /*************** FSF related Functions  *************************/
 /****************************************************************/
@@ -250,8 +255,7 @@ zfcp_fsf_req_complete(struct zfcp_fsf_re
 
 	/* cleanup request if requested by initiator */
 	if (likely(cleanup)) {
-		ZFCP_LOG_TRACE("removing FSF request 0x%lx\n",
-			       (unsigned long) fsf_req);
+		ZFCP_LOG_TRACE("removing FSF request %p\n", fsf_req);
 		/*
 		 * lock must not be held here since it will be
 		 * grabed by the called routine, too
@@ -259,8 +263,7 @@ zfcp_fsf_req_complete(struct zfcp_fsf_re
 		zfcp_fsf_req_cleanup(fsf_req);
 	} else {
 		/* notify initiator waiting for the requests completion */
-		ZFCP_LOG_TRACE("waking initiator of FSF request 0x%lx\n",
-			       (unsigned long) fsf_req);
+		ZFCP_LOG_TRACE("waking initiator of FSF request %p\n",fsf_req);
 		/*
 		 * FIXME: Race! We must not access fsf_req here as it might have been
 		 * cleaned up already due to the set ZFCP_STATUS_FSFREQ_COMPLETED
@@ -297,7 +300,7 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf
 	int retval = 0;
 	struct zfcp_adapter *adapter = fsf_req->adapter;
 
-	ZFCP_LOG_DEBUG("QTCB is at 0x%lx\n", (unsigned long) fsf_req->qtcb);
+	ZFCP_LOG_DEBUG("QTCB is at %p\n", fsf_req->qtcb);
 
 	if (fsf_req->status & ZFCP_STATUS_FSFREQ_DISMISSED) {
 		ZFCP_LOG_DEBUG("fsf_req 0x%lx has been dismissed\n",
@@ -320,7 +323,7 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf
 			     sizeof(struct fsf_qtcb));
 			goto forget_log;
 		}
-		if ((fsf_req->qtcb->header.log_start +
+		if ((size_t) (fsf_req->qtcb->header.log_start +
 		     fsf_req->qtcb->header.log_length)
 		    > sizeof(struct fsf_qtcb)) {
 			ZFCP_LOG_NORMAL("bug: ULP (FSF logging) log data ends "
@@ -352,18 +355,6 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf
 
 	case FSF_PROT_QTCB_VERSION_ERROR:
 		ZFCP_LOG_FLAGS(0, "FSF_PROT_QTCB_VERSION_ERROR\n");
-		/* DEBUG */
-		ZFCP_LOG_NORMAL("fsf_req=0x%lx, qtcb=0x%lx (0x%lx, 0x%lx)\n",
-				(unsigned long) fsf_req,
-				(unsigned long) fsf_req->qtcb,
-				((unsigned long) fsf_req) & 0xFFFFFF00,
-				(unsigned
-				 long) ((struct zfcp_fsf_req
-					 *) (((unsigned long) fsf_req) &
-					     0xFFFFFF00))->qtcb);
-		ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL,
-			      (char *) (((unsigned long) fsf_req) & 0xFFFFFF00),
-			      sizeof (struct zfcp_fsf_req));
 		ZFCP_LOG_NORMAL("error: The adapter %s contains "
 				"microcode of version 0x%x, the device driver "
 				"only supports 0x%x. Aborting.\n",
@@ -388,7 +379,6 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf
 				zfcp_get_busid_by_adapter(adapter),
 				fsf_req->qtcb->prefix.prot_status_qual.
 				sequence_error.exp_req_seq_no);
-#ifdef ZFCP_DEBUG_REQUESTS
 		debug_text_event(adapter->req_dbf, 1, "exp_seq!");
 		debug_event(adapter->req_dbf, 1,
 			    &fsf_req->qtcb->prefix.prot_status_qual.
@@ -396,7 +386,6 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf
 		debug_text_event(adapter->req_dbf, 1, "qtcb_seq!");
 		debug_exception(adapter->req_dbf, 1,
 				&fsf_req->qtcb->prefix.req_seq_no, 4);
-#endif				/* ZFCP_DEBUG_REQUESTS */
 		debug_text_exception(adapter->erp_dbf, 0, "prot_seq_err");
 		/* restart operation on this adapter */
 		zfcp_erp_adapter_reopen(adapter, 0);
@@ -414,17 +403,6 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf
 				"that used on adapter %s. "
 				"Stopping all operations on this adapter.\n",
 				zfcp_get_busid_by_adapter(adapter));
-		ZFCP_LOG_NORMAL("fsf_req=0x%lx, qtcb=0x%lx (0x%lx, 0x%lx)\n",
-				(unsigned long) fsf_req,
-				(unsigned long) fsf_req->qtcb,
-				((unsigned long) fsf_req) & 0xFFFFFF00,
-				(unsigned long) (
-					(struct zfcp_fsf_req *) (
-						((unsigned long)
-						 fsf_req) & 0xFFFFFF00))->qtcb);
-		ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL,
-			      (char *) (((unsigned long) fsf_req) & 0xFFFFFF00),
-			      sizeof (struct zfcp_fsf_req));
 		debug_text_exception(adapter->erp_dbf, 0, "prot_unsup_qtcb");
 		zfcp_erp_adapter_shutdown(adapter, 0);
 		zfcp_cmd_dbf_event_fsf("unsqtcbt", fsf_req,
@@ -447,7 +425,7 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf
 	case FSF_PROT_DUPLICATE_REQUEST_ID:
 		ZFCP_LOG_FLAGS(0, "FSF_PROT_DUPLICATE_REQUEST_IDS\n");
 		if (fsf_req->qtcb) {
-			ZFCP_LOG_NORMAL("bug: The request identifier  0x%Lx "
+			ZFCP_LOG_NORMAL("bug: The request identifier 0x%Lx "
 					"to the adapter %s is ambiguous. "
 					"Stopping all operations on this "
 					"adapter.\n",
@@ -456,13 +434,13 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf
 					 req_handle),
 					zfcp_get_busid_by_adapter(adapter));
 		} else {
-			ZFCP_LOG_NORMAL("bug: The request identifier  0x%lx "
+			ZFCP_LOG_NORMAL("bug: The request identifier %p "
 					"to the adapter %s is ambiguous. "
 					"Stopping all operations on this "
 					"adapter. "
 					"(bug: got this for an unsolicited "
 					"status read request)\n",
-					(unsigned long) fsf_req,
+					fsf_req,
 					zfcp_get_busid_by_adapter(adapter));
 		}
 		debug_text_exception(adapter->erp_dbf, 0, "prot_dup_id");
@@ -581,19 +559,6 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf
 				"(debug info 0x%x).\n",
 				zfcp_get_busid_by_adapter(adapter),
 				fsf_req->qtcb->prefix.prot_status);
-		ZFCP_LOG_NORMAL("fsf_req=0x%lx, qtcb=0x%lx (0x%lx, 0x%lx)\n",
-				(unsigned long) fsf_req,
-				(unsigned long) fsf_req->qtcb,
-				((unsigned long) fsf_req) & 0xFFFFFF00,
-				(unsigned
-				 long) ((struct zfcp_fsf_req
-					 *) (((unsigned long) fsf_req) &
-					     0xFFFFFF00))->qtcb);
-		ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL,
-			      (char *) (((unsigned long) fsf_req) & 0xFFFFFF00),
-			      sizeof (struct zfcp_fsf_req));
-		ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL, (char *) fsf_req->qtcb,
-			      sizeof(struct fsf_qtcb));
 		debug_text_event(adapter->erp_dbf, 0, "prot_inval:");
 		debug_exception(adapter->erp_dbf, 0,
 				&fsf_req->qtcb->prefix.prot_status,
@@ -771,12 +736,12 @@ zfcp_fsf_fsfstatus_qual_eval(struct zfcp
 static int
 zfcp_fsf_req_dispatch(struct zfcp_fsf_req *fsf_req)
 {
+	struct zfcp_erp_action *erp_action = fsf_req->erp_action;
+	struct zfcp_adapter *adapter = fsf_req->adapter;
 	int retval = 0;
 
 	if (unlikely(fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR)) {
-		ZFCP_LOG_TRACE("fsf_req=0x%lx, QTCB=0x%lx\n",
-			       (unsigned long) fsf_req,
-			       (unsigned long) (fsf_req->qtcb));
+		ZFCP_LOG_TRACE("fsf_req=%p, QTCB=%p\n", fsf_req, fsf_req->qtcb);
 		ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_TRACE,
 			      (char *) fsf_req->qtcb, sizeof(struct fsf_qtcb));
 	}
@@ -847,10 +812,8 @@ zfcp_fsf_req_dispatch(struct zfcp_fsf_re
 		ZFCP_LOG_FLAGS(2, "FSF_QTCB_UNKNOWN\n");
 		fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 		ZFCP_LOG_NORMAL("bug: Command issued by the device driver is "
-				"not supported by the adapter %s "
-				"(debug info 0x%lx 0x%x).\n",
-				zfcp_get_busid_by_adapter(fsf_req->adapter),
-				(unsigned long) fsf_req, fsf_req->fsf_command);
+				"not supported by the adapter %s\n",
+				zfcp_get_busid_by_adapter(fsf_req->adapter));
 		if (fsf_req->fsf_command != fsf_req->qtcb->header.fsf_command)
 			ZFCP_LOG_NORMAL
 			    ("bug: Command issued by the device driver differs "
@@ -861,7 +824,13 @@ zfcp_fsf_req_dispatch(struct zfcp_fsf_re
 			     fsf_req->qtcb->header.fsf_command);
 	}
 
-        zfcp_erp_fsf_req_handler(fsf_req);
+	if (!erp_action)
+		return retval;
+
+	debug_text_event(adapter->erp_dbf, 3, "a_frh");
+	debug_event(adapter->erp_dbf, 3, &erp_action->action, sizeof (int));
+	zfcp_erp_async_handler(erp_action, 0);
+
 	return retval;
 }
 
@@ -887,9 +856,8 @@ zfcp_fsf_status_read(struct zfcp_adapter
 				     adapter->pool.fsf_req_status_read,
 				     &lock_flags, &fsf_req);
 	if (retval < 0) {
-		ZFCP_LOG_INFO("error: Out of resources. Could not create an "
-			      "unsolicited status buffer for "
-			      "the adapter %s.\n",
+		ZFCP_LOG_INFO("error: Could not create unsolicited status "
+			      "buffer for adapter %s.\n",
 			      zfcp_get_busid_by_adapter(adapter));
 		goto failed_req_create;
 	}
@@ -921,12 +889,9 @@ zfcp_fsf_status_read(struct zfcp_adapter
 		goto failed_req_send;
 	}
 
-	ZFCP_LOG_TRACE("Status Read request initiated "
-		       "(adapter busid=%s)\n",
+	ZFCP_LOG_TRACE("Status Read request initiated (adapter%s)\n",
 		       zfcp_get_busid_by_adapter(adapter));
-#ifdef ZFCP_DEBUG_REQUESTS
 	debug_text_event(adapter->req_dbf, 1, "unso");
-#endif
 	goto out;
 
  failed_req_send:
@@ -958,9 +923,9 @@ zfcp_fsf_status_read_port_closed(struct 
 	read_unlock_irqrestore(&zfcp_data.config_lock, flags);
 
 	if (!port || (port->d_id != (status_buffer->d_id & ZFCP_DID_MASK))) {
-		ZFCP_LOG_NORMAL("bug: Re-open port indication received for the "
-				"non-existing port with DID 0x%3.3x, on "
-				"the adapter %s. Ignored.\n",
+		ZFCP_LOG_NORMAL("bug: Reopen port indication received for"
+				"nonexisting port with d_id 0x%08x on "
+				"adapter %s. Ignored.\n",
 				status_buffer->d_id & ZFCP_DID_MASK,
 				zfcp_get_busid_by_adapter(adapter));
 		goto out;
@@ -985,9 +950,9 @@ zfcp_fsf_status_read_port_closed(struct 
 		debug_exception(adapter->erp_dbf, 0,
 				&status_buffer->status_subtype, sizeof (u32));
 		ZFCP_LOG_NORMAL("bug: Undefined status subtype received "
-				"for a re-open indication on the port with "
-				"DID 0x%3.3x, on the adapter "
-				"%s. Ignored. (debug info 0x%x)\n",
+				"for a reopen indication on port with "
+				"d_id 0x%08x on the adapter %s. "
+				"Ignored. (debug info 0x%x)\n",
 				status_buffer->d_id,
 				zfcp_get_busid_by_adapter(adapter),
 				status_buffer->status_subtype);
@@ -1044,16 +1009,19 @@ zfcp_fsf_status_read_handler(struct zfcp
 
 	case FSF_STATUS_READ_LINK_DOWN:
 		ZFCP_LOG_FLAGS(1, "FSF_STATUS_READ_LINK_DOWN\n");
-
-		/* Unneccessary, ignoring.... */
+		debug_text_event(adapter->erp_dbf, 0, "unsol_link_down:");
+		ZFCP_LOG_INFO("Local link to adapter %s is down\n",
+			      zfcp_get_busid_by_adapter(adapter));
+		atomic_set_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED,
+				&adapter->status);
+		zfcp_erp_adapter_failed(adapter);
 		break;
 
 	case FSF_STATUS_READ_LINK_UP:
 		ZFCP_LOG_FLAGS(1, "FSF_STATUS_READ_LINK_UP\n");
 		debug_text_event(adapter->erp_dbf, 2, "unsol_link_up:");
-		ZFCP_LOG_INFO("The local link to the adapter %s "
-			      "was re-plugged. "
-			      "Re-starting operations on this adapter..\n",
+		ZFCP_LOG_INFO("Local link to adapter %s was replugged. "
+			      "Restarting operations on this adapter\n",
 			      zfcp_get_busid_by_adapter(adapter));
 		/* All ports should be marked as ready to run again */
 		zfcp_erp_modify_adapter_status(adapter,
@@ -1065,33 +1033,11 @@ zfcp_fsf_status_read_handler(struct zfcp
 
 		break;
 
-	case FSF_STATUS_READ_NOTIFICATION_LOST:
-		ZFCP_LOG_FLAGS(1, "FSF_STATUS_READ_NOTIFICATION_LOST\n");
-		debug_text_event(adapter->erp_dbf, 2, "unsol_not_lost:");
-		switch (status_buffer->status_subtype) {
-		case FSF_STATUS_READ_SUB_LOST_CFDC_UPDATED:
-			ZFCP_LOG_NORMAL(
-				"The unsolicited status information about "
-				"CFDC update on the adapter %s is lost "
-				"due to the lack of internal resources\n",
-				zfcp_get_busid_by_adapter(adapter));
-			break;
-		case FSF_STATUS_READ_SUB_LOST_CFDC_HARDENED:
-			ZFCP_LOG_NORMAL(
-				"The unsolicited status information about "
-				"CFDC harden on the adapter %s is lost "
-				"due to the lack of internal resources\n",
-				zfcp_get_busid_by_adapter(adapter));
-			break;
-		}
-		break;
-
 	case FSF_STATUS_READ_CFDC_UPDATED:
 		ZFCP_LOG_FLAGS(1, "FSF_STATUS_READ_CFDC_UPDATED\n");
 		debug_text_event(adapter->erp_dbf, 2, "unsol_cfdc_update:");
-		ZFCP_LOG_NORMAL(
-			"CFDC has been updated on the adapter %s\n",
-			zfcp_get_busid_by_adapter(adapter));
+		ZFCP_LOG_INFO("CFDC has been updated on the adapter %s\n",
+			      zfcp_get_busid_by_adapter(adapter));
 		break;
 
 	case FSF_STATUS_READ_CFDC_HARDENED:
@@ -1099,21 +1045,17 @@ zfcp_fsf_status_read_handler(struct zfcp
 		debug_text_event(adapter->erp_dbf, 2, "unsol_cfdc_harden:");
 		switch (status_buffer->status_subtype) {
 		case FSF_STATUS_READ_SUB_CFDC_HARDENED_ON_SE:
-			ZFCP_LOG_NORMAL(
-				"CFDC of the adapter %s "
-				"has been saved on the SE\n",
-				zfcp_get_busid_by_adapter(adapter));
+			ZFCP_LOG_INFO("CFDC of adapter %s saved on SE\n",
+				      zfcp_get_busid_by_adapter(adapter));
 			break;
 		case FSF_STATUS_READ_SUB_CFDC_HARDENED_ON_SE2:
-			ZFCP_LOG_NORMAL(
-				"CFDC of the adapter %s "
-				"has been copied to the secondary SE\n",
+			ZFCP_LOG_INFO("CFDC of adapter %s has been copied "
+				      "to the secondary SE\n",
 				zfcp_get_busid_by_adapter(adapter));
 			break;
 		default:
-			ZFCP_LOG_NORMAL(
-				"CFDC of the adapter %s has been hardened\n",
-				zfcp_get_busid_by_adapter(adapter));
+			ZFCP_LOG_INFO("CFDC of adapter %s has been hardened\n",
+				      zfcp_get_busid_by_adapter(adapter));
 		}
 		break;
 
@@ -1122,11 +1064,10 @@ zfcp_fsf_status_read_handler(struct zfcp
 		debug_exception(adapter->erp_dbf, 0,
 				&status_buffer->status_type, sizeof (u32));
 		ZFCP_LOG_NORMAL("bug: An unsolicited status packet of unknown "
-				"type was received by the zfcp-driver "
-				"(debug info 0x%x)\n",
+				"type was received (debug info 0x%x)\n",
 				status_buffer->status_type);
-		ZFCP_LOG_DEBUG("Dump of status_read_buffer 0x%lx:\n",
-			       (unsigned long) status_buffer);
+		ZFCP_LOG_DEBUG("Dump of status_read_buffer %p:\n",
+			       status_buffer);
 		ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG,
 			      (char *) status_buffer,
 			      sizeof (struct fsf_status_read_buffer));
@@ -1150,17 +1091,15 @@ zfcp_fsf_status_read_handler(struct zfcp
 	 */
 	retval = zfcp_fsf_status_read(adapter, 0);
 	if (retval < 0) {
-		ZFCP_LOG_INFO("Outbound queue busy. "
-			      "Could not create use an "
-			      "unsolicited status read request for "
-			      "the adapter %s.\n",
+		ZFCP_LOG_INFO("Failed to create unsolicited status read "
+			      "request for the adapter %s.\n",
 			      zfcp_get_busid_by_adapter(adapter));
 		/* temporary fix to avoid status read buffer shortage */
 		adapter->status_read_failed++;
 		if ((ZFCP_STATUS_READS_RECOM - adapter->status_read_failed)
 		    < ZFCP_STATUS_READ_FAILED_THRESHOLD) {
-			ZFCP_LOG_INFO("restart adapter due to status read "
-				      "buffer shortage (busid %s)\n",
+			ZFCP_LOG_INFO("restart adapter %s due to status read "
+				      "buffer shortage\n",
 				      zfcp_get_busid_by_adapter(adapter));
 			zfcp_erp_adapter_reopen(adapter, 0);
 		}
@@ -1196,11 +1135,9 @@ zfcp_fsf_abort_fcp_command(unsigned long
 				     req_flags, adapter->pool.fsf_req_abort,
 				     &lock_flags, &fsf_req);
 	if (retval < 0) {
-		ZFCP_LOG_INFO("error: Out of resources. Could not create an "
-			      "abort command request on the device with "
-			      "the FCP-LUN 0x%Lx connected to "
-			      "the port with WWPN 0x%Lx connected to "
-			      "the adapter %s.\n",
+		ZFCP_LOG_INFO("error: Failed to create an abort command "
+			      "request for lun 0x%016Lx on port 0x%016Lx "
+			      "on adapter %s.\n",
 			      unit->fcp_lun,
 			      unit->port->wwpn,
 			      zfcp_get_busid_by_adapter(adapter));
@@ -1226,9 +1163,8 @@ zfcp_fsf_abort_fcp_command(unsigned long
 	retval = zfcp_fsf_req_send(fsf_req, NULL);
 	if (retval) {
 		del_timer(&adapter->scsi_er_timer);
-		ZFCP_LOG_INFO("error: Could not send an abort command request "
-			      "for a command on the adapter %s, "
-			      "port WWPN 0x%Lx and unit LUN 0x%Lx\n",
+		ZFCP_LOG_INFO("error: Failed to send abort command request "
+			      "on adapter %s, port 0x%016Lx, unit 0x%016Lx\n",
 			      zfcp_get_busid_by_adapter(adapter),
 			      unit->port->wwpn, unit->fcp_lun);
 		zfcp_fsf_req_free(fsf_req);
@@ -1237,10 +1173,10 @@ zfcp_fsf_abort_fcp_command(unsigned long
 	}
 
 	ZFCP_LOG_DEBUG("Abort FCP Command request initiated "
-		       "(adapter busid=%s, port d_id=0x%x, "
-		       "unit fcp_lun=0x%Lx, old_req_id=0x%lx)\n",
+		       "(adapter%s, port d_id=0x%08x, "
+		       "unit x%016Lx, old_req_id=0x%lx)\n",
 		       zfcp_get_busid_by_adapter(adapter),
-		       (unsigned int) unit->port->d_id,
+		       unit->port->d_id,
 		       unit->fcp_lun, old_req_id);
  out:
 	write_unlock_irqrestore(&adapter->request_queue.queue_lock, lock_flags);
@@ -1284,10 +1220,9 @@ zfcp_fsf_abort_fcp_command_handler(struc
 			 */
 		} else {
 			ZFCP_LOG_FLAGS(1, "FSF_PORT_HANDLE_NOT_VALID\n");
-			ZFCP_LOG_INFO("Temporary port identifier (handle) 0x%x "
-				      "for the port with WWPN 0x%Lx connected "
-				      "to the adapter %s is not valid. This "
-				      "may happen occasionally.\n",
+			ZFCP_LOG_INFO("Temporary port identifier 0x%x for "
+				      "port 0x%016Lx on adapter %s invalid. "
+				      "This may happen occasionally.\n",
 				      unit->port->handle,
 				      unit->port->wwpn,
 				      zfcp_get_busid_by_unit(unit));
@@ -1318,11 +1253,9 @@ zfcp_fsf_abort_fcp_command_handler(struc
 		} else {
 			ZFCP_LOG_FLAGS(1, "FSF_LUN_HANDLE_NOT_VALID\n");
 			ZFCP_LOG_INFO
-			    ("Warning: Temporary LUN identifier (handle) 0x%x "
-			     "of the logical unit with FCP-LUN 0x%Lx at "
-			     "the remote port with WWPN 0x%Lx connected "
-			     "to the adapter %s is "
-			     "not valid. This may happen in rare cases."
+			    ("Warning: Temporary LUN identifier 0x%x of LUN "
+			     "0x%016Lx on port 0x%016Lx on adapter %s is "
+			     "invalid. This may happen in rare cases. "
 			     "Trying to re-establish link.\n",
 			     unit->handle,
 			     unit->fcp_lun,
@@ -1344,16 +1277,10 @@ zfcp_fsf_abort_fcp_command_handler(struc
 	case FSF_FCP_COMMAND_DOES_NOT_EXIST:
 		ZFCP_LOG_FLAGS(2, "FSF_FCP_COMMAND_DOES_NOT_EXIST\n");
 		retval = 0;
-#ifdef ZFCP_DEBUG_REQUESTS
-		/*
-		 * debug feature area which records
-		 * fsf request sequence numbers
-		 */
 		debug_text_event(new_fsf_req->adapter->req_dbf, 3, "no_exist");
 		debug_event(new_fsf_req->adapter->req_dbf, 3,
 			    &new_fsf_req->qtcb->bottom.support.req_handle,
 			    sizeof (unsigned long));
-#endif				/* ZFCP_DEBUG_REQUESTS */
 		debug_text_event(new_fsf_req->adapter->erp_dbf, 3,
 				 "fsf_s_no_exist");
 		new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED;
@@ -1362,10 +1289,9 @@ zfcp_fsf_abort_fcp_command_handler(struc
 	case FSF_PORT_BOXED:
 		/* 2 */
 		ZFCP_LOG_FLAGS(0, "FSF_PORT_BOXED\n");
-		ZFCP_LOG_DEBUG("The remote port "
-			       "with WWPN 0x%Lx on the adapter %s "
-			       "needs to be reopened\n",
-			       unit->port->wwpn, zfcp_get_busid_by_unit(unit));
+		ZFCP_LOG_INFO("Remote port 0x%016Lx on adapter %s needs to "
+			      "be reopened\n", unit->port->wwpn,
+			      zfcp_get_busid_by_unit(unit));
 		debug_text_event(new_fsf_req->adapter->erp_dbf, 2,
 				 "fsf_s_pboxed");
 		zfcp_erp_port_reopen(unit->port, 0);
@@ -1479,8 +1405,8 @@ zfcp_fsf_send_ct(struct zfcp_send_ct *ct
 				  ZFCP_WAIT_FOR_SBAL | ZFCP_REQ_AUTO_CLEANUP,
 				  pool, &lock_flags, &fsf_req);
 	if (ret < 0) {
-                ZFCP_LOG_INFO("error: out of memory. Could not create CT "
-			      "request (FC-GS). (adapter: %s)\n",
+                ZFCP_LOG_INFO("error: Could not create CT request (FC-GS) for "
+			      "adapter: %s\n",
 			      zfcp_get_busid_by_adapter(adapter));
 		goto failed_req;
 	}
@@ -1509,9 +1435,8 @@ zfcp_fsf_send_ct(struct zfcp_send_ct *ct
                                                 ct->req, ct->req_count,
                                                 ZFCP_MAX_SBALS_PER_CT_REQ);
                 if (bytes <= 0) {
-                        ZFCP_LOG_INFO("error: out of resources (outbuf). "
-                                      "Could not create CT request (FC-GS). "
-				      "(adapter: %s)\n",
+                        ZFCP_LOG_INFO("error: creation of CT request failed "
+				      "on adapter %s\n",
 				      zfcp_get_busid_by_adapter(adapter));
                         if (bytes == 0)
                                 ret = -ENOMEM;
@@ -1527,9 +1452,8 @@ zfcp_fsf_send_ct(struct zfcp_send_ct *ct
                                                 ct->resp, ct->resp_count,
                                                 ZFCP_MAX_SBALS_PER_CT_REQ);
                 if (bytes <= 0) {
-                        ZFCP_LOG_INFO("error: out of resources (inbuf). "
-                                      "Could not create a CT request (FC-GS). "
-				      "(adapter: %s)\n",
+                        ZFCP_LOG_INFO("error: creation of CT request failed "
+				      "on adapter %s\n",
 				      zfcp_get_busid_by_adapter(adapter));
                         if (bytes == 0)
                                 ret = -ENOMEM;
@@ -1542,8 +1466,8 @@ zfcp_fsf_send_ct(struct zfcp_send_ct *ct
         } else {
                 /* reject send generic request */
 		ZFCP_LOG_INFO(
-			"error: microcode does not support chained SBALs."
-                        "CT request (FC-GS) too big. (adapter: %s)\n",
+			"error: microcode does not support chained SBALs,"
+                        "CT request too big (adapter %s)\n",
 			zfcp_get_busid_by_adapter(adapter));
                 ret = -EOPNOTSUPP;
                 goto failed_send;
@@ -1558,14 +1482,13 @@ zfcp_fsf_send_ct(struct zfcp_send_ct *ct
 	/* start QDIO request for this FSF request */
 	ret = zfcp_fsf_req_send(fsf_req, ct->timer);
 	if (ret) {
-		ZFCP_LOG_DEBUG("error: out of resources. Could not send CT "
-			       "request (FC-GS). (adapter: %s, "
-			       "port WWPN 0x%Lx)\n",
+		ZFCP_LOG_DEBUG("error: initiation of CT request failed "
+			       "(adapter %s, port 0x%016Lx)\n",
 			       zfcp_get_busid_by_adapter(adapter), port->wwpn);
 		goto failed_send;
 	}
 
-	ZFCP_LOG_DEBUG("CT request initiated. (adapter: %s, port WWPN 0x%Lx)\n",
+	ZFCP_LOG_DEBUG("CT request initiated (adapter %s, port 0x%016Lx)\n",
 		       zfcp_get_busid_by_adapter(adapter), port->wwpn);
 	goto out;
 
@@ -1623,15 +1546,15 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf
         case FSF_SERVICE_CLASS_NOT_SUPPORTED :
 		ZFCP_LOG_FLAGS(2, "FSF_SERVICE_CLASS_NOT_SUPPORTED\n");
 		if (adapter->fc_service_class <= 3) {
-			ZFCP_LOG_INFO("error: The adapter %s does "
-					"not support fibre-channel class %d.\n",
-					zfcp_get_busid_by_port(port),
+			ZFCP_LOG_INFO("error: adapter %s does not support fc "
+				      "class %d.\n",
+				      zfcp_get_busid_by_port(port),
 				      adapter->fc_service_class);
 		} else {
 			ZFCP_LOG_INFO("bug: The fibre channel class at the "
 				      "adapter %s is invalid. "
 				      "(debug info %d)\n",
-			     zfcp_get_busid_by_port(port),
+				      zfcp_get_busid_by_port(port),
 				      adapter->fc_service_class);
 		}
 		/* stop operation for this adapter */
@@ -1667,31 +1590,28 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf
 	case FSF_ACCESS_DENIED:
 		ZFCP_LOG_FLAGS(2, "FSF_ACCESS_DENIED\n");
 		ZFCP_LOG_NORMAL("Access denied, cannot send generic command "
-				"to a port with WWPN 0x%Lx connected "
-				"to the adapter %s\n", port->wwpn,
+				"to port 0x%016Lx on adapter %s\n", port->wwpn,
 				zfcp_get_busid_by_port(port));
-		counter = 0;
-		do {
-			subtable = header->fsf_status_qual.halfword[counter++];
-			rule = header->fsf_status_qual.halfword[counter++];
+		for (counter = 0; counter < 2; counter++) {
+			subtable = header->fsf_status_qual.halfword[counter * 2];
+			rule = header->fsf_status_qual.halfword[counter * 2 + 1];
 			switch (subtable) {
 			case FSF_SQ_CFDC_SUBTABLE_OS:
 			case FSF_SQ_CFDC_SUBTABLE_PORT_WWPN:
 			case FSF_SQ_CFDC_SUBTABLE_PORT_DID:
 			case FSF_SQ_CFDC_SUBTABLE_LUN:
-       				ZFCP_LOG_NORMAL("Access denied (%s rule %d)\n",
+       				ZFCP_LOG_INFO("Access denied (%s rule %d)\n",
 					zfcp_act_subtable_type[subtable], rule);
 				break;
 			}
-		} while (counter < 4);
+		}
 		debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_access");
 		fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 		break;
 
         case FSF_GENERIC_COMMAND_REJECTED :
 		ZFCP_LOG_FLAGS(2, "FSF_GENERIC_COMMAND_REJECTED\n");
-		ZFCP_LOG_INFO("warning: The port with WWPN 0x%Lx connected to "
-			      "the adapter %s has "
+		ZFCP_LOG_INFO("warning: The port 0x%016Lx on adapter %s has "
 			      "rejected a generic services command.\n",
 			      port->wwpn, zfcp_get_busid_by_port(port));
 		ZFCP_LOG_INFO("status qualifier:\n");
@@ -1704,11 +1624,9 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf
 
         case FSF_PORT_HANDLE_NOT_VALID :
 		ZFCP_LOG_FLAGS(2, "FSF_PORT_HANDLE_NOT_VALID\n");
-		ZFCP_LOG_DEBUG("Temporary port identifier (handle) 0x%x "
-			       "for the port with WWPN 0x%Lx connected to "
-			       "the adapter %s is "
-			       "not valid. This may happen occasionally.\n",
-			       port->handle,
+		ZFCP_LOG_DEBUG("Temporary port identifier 0x%x for port "
+			       "0x%016Lx on adapter %s invalid. This may "
+			       "happen occasionally.\n", port->handle,
 			       port->wwpn, zfcp_get_busid_by_port(port));
 		ZFCP_LOG_INFO("status qualifier:\n");
 		ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_INFO,
@@ -1721,8 +1639,7 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf
 
 	case FSF_REQUEST_BUF_NOT_VALID :
 		ZFCP_LOG_FLAGS(2, "FSF_REQUEST_BUF_NOT_VALID\n");
-		ZFCP_LOG_NORMAL("error: The port with WWPN 0x%Lx connected to "
-				"the adapter %s has "
+		ZFCP_LOG_NORMAL("error: The port 0x%016Lx on adapter %s has "
 				"rejected a generic services command "
 				"due to invalid request buffer.\n",
 				port->wwpn, zfcp_get_busid_by_port(port));
@@ -1732,8 +1649,7 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf
 
 	case FSF_RESPONSE_BUF_NOT_VALID :
 		ZFCP_LOG_FLAGS(2, "FSF_RESPONSE_BUF_NOT_VALID\n");
-		ZFCP_LOG_NORMAL("error: The port with WWPN 0x%Lx connected to "
-				"the adapter %s has "
+		ZFCP_LOG_NORMAL("error: The port 0x%016Lx on adapter %s has "
 				"rejected a generic services command "
 				"due to invalid response buffer.\n",
 				port->wwpn, zfcp_get_busid_by_port(port));
@@ -1743,8 +1659,7 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf
 
         case FSF_PORT_BOXED :
 		ZFCP_LOG_FLAGS(2, "FSF_PORT_BOXED\n");
-		ZFCP_LOG_DEBUG("The remote port "
-			       "with WWPN 0x%Lx on the adapter %s "
+		ZFCP_LOG_INFO("The remote port 0x%016Lx on adapter %s "
 			       "needs to be reopened\n",
 			       port->wwpn, zfcp_get_busid_by_port(port));
 		debug_text_event(adapter->erp_dbf, 2, "fsf_s_pboxed");
@@ -1793,8 +1708,8 @@ zfcp_fsf_send_els(struct zfcp_send_els *
 				  ZFCP_WAIT_FOR_SBAL|ZFCP_REQ_AUTO_CLEANUP,
 				  NULL, &lock_flags, &fsf_req);
 	if (ret < 0) {
-                ZFCP_LOG_INFO("error: out of memory. Could not create ELS "
-			      "request. (adapter: %s, port did: 0x%06x)\n",
+                ZFCP_LOG_INFO("error: creation of ELS request failed "
+			      "(adapter %s, port d_id: 0x%08x)\n",
                               zfcp_get_busid_by_adapter(adapter), port->d_id);
                 goto failed_req;
 	}
@@ -1818,9 +1733,8 @@ zfcp_fsf_send_els(struct zfcp_send_els *
                                                 els->req, els->req_count,
                                                 ZFCP_MAX_SBALS_PER_ELS_REQ);
                 if (bytes <= 0) {
-                        ZFCP_LOG_INFO("error: out of resources (outbuf). "
-                                      "Could not create ELS request. "
-				      "(adapter: %s, port did: 0x%06x)\n",
+                        ZFCP_LOG_INFO("error: creation of ELS request failed "
+				      "(adapter %s, port d_id: 0x%08x)\n",
 				      zfcp_get_busid_by_adapter(adapter),
 				      port->d_id);
                         if (bytes == 0) {
@@ -1837,9 +1751,8 @@ zfcp_fsf_send_els(struct zfcp_send_els *
                                                 els->resp, els->resp_count,
                                                 ZFCP_MAX_SBALS_PER_ELS_REQ);
                 if (bytes <= 0) {
-                        ZFCP_LOG_INFO("error: out of resources (inbuf). "
-                                      "Could not create ELS request. "
-				      "(adapter: %s, port did: 0x%06x)\n",
+                        ZFCP_LOG_INFO("error: creation of ELS request failed "
+				      "(adapter %s, port d_id: 0x%08x)\n",
 				      zfcp_get_busid_by_adapter(adapter),
 				      port->d_id);
                         if (bytes == 0) {
@@ -1852,9 +1765,9 @@ zfcp_fsf_send_els(struct zfcp_send_els *
                 fsf_req->qtcb->bottom.support.resp_buf_length = bytes;
         } else {
                 /* reject request */
-		ZFCP_LOG_INFO("error: microcode does not support chained SBALs."
-                              "ELS request too big. "
-			      "(adapter: %s, port did: 0x%06x)\n",
+		ZFCP_LOG_INFO("error: microcode does not support chained SBALs"
+                              ", ELS request too big (adapter %s, "
+			      "port d_id: 0x%08x)\n",
 			      zfcp_get_busid_by_adapter(adapter), port->d_id);
                 ret = -EOPNOTSUPP;
                 goto failed_send;
@@ -1871,13 +1784,13 @@ zfcp_fsf_send_els(struct zfcp_send_els *
 	/* start QDIO request for this FSF request */
 	ret = zfcp_fsf_req_send(fsf_req, NULL);
 	if (ret) {
-		ZFCP_LOG_DEBUG("error: out of resources. Could not send ELS "
-                               "request. (adapter: %s, port WWPN 0x%Lx)\n",
+		ZFCP_LOG_DEBUG("error: initiation of ELS request failed "
+			       "(adapter %s, port 0x%016Lx)\n",
 			       zfcp_get_busid_by_adapter(adapter), port->wwpn);
 		goto failed_send;
 	}
 
-	ZFCP_LOG_DEBUG("ELS request initiated (adapter: %s, port WWPN 0x%Lx)\n",
+	ZFCP_LOG_DEBUG("ELS request initiated (adapter %s, port 0x%016Lx)\n",
 		       zfcp_get_busid_by_adapter(adapter), port->wwpn);
 	goto out;
 
@@ -1930,12 +1843,12 @@ static int zfcp_fsf_send_els_handler(str
 	case FSF_SERVICE_CLASS_NOT_SUPPORTED:
 		ZFCP_LOG_FLAGS(2, "FSF_SERVICE_CLASS_NOT_SUPPORTED\n");
 		if (adapter->fc_service_class <= 3) {
-			ZFCP_LOG_INFO("error: The adapter %s does "
-				      "not support fibre-channel class %d.\n",
+			ZFCP_LOG_INFO("error: adapter %s does "
+				      "not support fibrechannel class %d.\n",
 				      zfcp_get_busid_by_port(port),
 				      adapter->fc_service_class);
 		} else {
-			ZFCP_LOG_INFO("bug: The fibre channel class at the "
+			ZFCP_LOG_INFO("bug: The fibrechannel class at "
 				      "adapter %s is invalid. "
 				      "(debug info %d)\n",
 				      zfcp_get_busid_by_port(port),
@@ -1979,9 +1892,8 @@ static int zfcp_fsf_send_els_handler(str
 
 	case FSF_ELS_COMMAND_REJECTED:
 		ZFCP_LOG_FLAGS(2, "FSF_ELS_COMMAND_REJECTED\n");
-		ZFCP_LOG_INFO("The ELS command has been rejected because "
-			      "a command filter in the FCP channel prohibited "
-			      "sending of the ELS to the SAN "
+		ZFCP_LOG_INFO("ELS has been rejected because command filter "
+			      "prohibited sending "
 			      "(adapter: %s, wwpn=0x%016Lx)\n",
 			      zfcp_get_busid_by_port(port), port->wwpn);
 
@@ -2036,20 +1948,19 @@ static int zfcp_fsf_send_els_handler(str
 		ZFCP_LOG_NORMAL("Access denied, cannot send ELS "
 				"(adapter: %s, wwpn=0x%016Lx)\n",
 				zfcp_get_busid_by_port(port), port->wwpn);
-		counter = 0;
-		do {
-			subtable = header->fsf_status_qual.halfword[counter++];
-			rule = header->fsf_status_qual.halfword[counter++];
+		for (counter = 0; counter < 2; counter++) {
+			subtable = header->fsf_status_qual.halfword[counter * 2];
+			rule = header->fsf_status_qual.halfword[counter * 2 + 1];
 			switch (subtable) {
 			case FSF_SQ_CFDC_SUBTABLE_OS:
 			case FSF_SQ_CFDC_SUBTABLE_PORT_WWPN:
 			case FSF_SQ_CFDC_SUBTABLE_PORT_DID:
 			case FSF_SQ_CFDC_SUBTABLE_LUN:
-				ZFCP_LOG_NORMAL("Access denied (%s rule %d)\n",
+				ZFCP_LOG_INFO("Access denied (%s rule %d)\n",
 					zfcp_act_subtable_type[subtable], rule);
 				break;
 			}
-		} while (counter < 4);
+		}
 		debug_text_event(adapter->erp_dbf, 1, "fsf_s_access");
 		fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 		break;
@@ -2100,9 +2011,8 @@ zfcp_fsf_exchange_config_data(struct zfc
 				     erp_action->adapter->pool.fsf_req_erp,
 				     &lock_flags, &(erp_action->fsf_req));
 	if (retval < 0) {
-		ZFCP_LOG_INFO("error: Out of resources. Could not create an "
-			      "exchange configuration data request for"
-			      "the adapter %s.\n",
+		ZFCP_LOG_INFO("error: Could not create exchange configuration "
+			      "data request for adapter %s.\n",
 			      zfcp_get_busid_by_adapter(erp_action->adapter));
 		goto out;
 	}
@@ -2120,7 +2030,7 @@ zfcp_fsf_exchange_config_data(struct zfc
 	retval = zfcp_fsf_req_send(erp_action->fsf_req, &erp_action->timer);
 	if (retval) {
 		ZFCP_LOG_INFO
-		    ("error: Could not send an exchange configuration data "
+		    ("error: Could not send exchange configuration data "
 		     "command on the adapter %s\n",
 		     zfcp_get_busid_by_adapter(erp_action->adapter));
 		zfcp_fsf_req_free(erp_action->fsf_req);
@@ -2128,8 +2038,8 @@ zfcp_fsf_exchange_config_data(struct zfc
 		goto out;
 	}
 
-	ZFCP_LOG_DEBUG("Exchange Configuration Data request initiated "
-		       "(adapter busid=%s)\n",
+	ZFCP_LOG_DEBUG("exchange configuration data request initiated "
+		       "(adapter %s)\n",
 		       zfcp_get_busid_by_adapter(erp_action->adapter));
 
  out:
@@ -2138,6 +2048,84 @@ zfcp_fsf_exchange_config_data(struct zfc
 	return retval;
 }
 
+/**
+ * zfcp_fsf_exchange_config_evaluate
+ * @fsf_req: fsf_req which belongs to xchg config data request
+ * @xchg_ok: specifies if xchg config data was incomplete or complete (0/1)
+ *
+ * returns: -EIO on error, 0 otherwise
+ */
+static int
+zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *fsf_req, int xchg_ok)
+{
+	struct fsf_qtcb_bottom_config *bottom;
+	struct zfcp_adapter *adapter = fsf_req->adapter;
+
+	bottom = &fsf_req->qtcb->bottom.config;
+	ZFCP_LOG_DEBUG("low/high QTCB version 0x%x/0x%x of FSF\n",
+		       bottom->low_qtcb_version, bottom->high_qtcb_version);
+	adapter->fsf_lic_version = bottom->lic_version;
+	adapter->supported_features = bottom->supported_features;
+
+	if (xchg_ok) {
+		adapter->wwnn = bottom->nport_serv_param.wwnn;
+		adapter->wwpn = bottom->nport_serv_param.wwpn;
+		adapter->s_id = bottom->s_id & ZFCP_DID_MASK;
+		adapter->fc_topology = bottom->fc_topology;
+		adapter->fc_link_speed = bottom->fc_link_speed;
+		adapter->hydra_version = bottom->adapter_type;
+	} else {
+		adapter->wwnn = 0;
+		adapter->wwpn = 0;
+		adapter->s_id = 0;
+		adapter->fc_topology = 0;
+		adapter->fc_link_speed = 0;
+		adapter->hydra_version = 0;
+	}
+
+	if(adapter->supported_features & FSF_FEATURE_HBAAPI_MANAGEMENT){
+		adapter->hardware_version = bottom->hardware_version;
+		memcpy(adapter->serial_number, bottom->serial_number, 17);
+		EBCASC(adapter->serial_number, sizeof(adapter->serial_number));
+	}
+
+	ZFCP_LOG_INFO("The adapter %s reported the following characteristics:\n"
+		      "WWNN 0x%016Lx, "
+		      "WWPN 0x%016Lx, "
+		      "S_ID 0x%08x,\n"
+		      "adapter version 0x%x, "
+		      "LIC version 0x%x, "
+		      "FC link speed %d Gb/s\n",
+		      zfcp_get_busid_by_adapter(adapter),
+		      adapter->wwnn,
+		      adapter->wwpn,
+		      (unsigned int) adapter->s_id,
+		      adapter->hydra_version,
+		      adapter->fsf_lic_version,
+		      adapter->fc_link_speed);
+	if (ZFCP_QTCB_VERSION < bottom->low_qtcb_version) {
+		ZFCP_LOG_NORMAL("error: the adapter %s "
+				"only supports newer control block "
+				"versions in comparison to this device "
+				"driver (try updated device driver)\n",
+				zfcp_get_busid_by_adapter(adapter));
+		debug_text_event(adapter->erp_dbf, 0, "low_qtcb_ver");
+		zfcp_erp_adapter_shutdown(adapter, 0);
+		return -EIO;
+	}
+	if (ZFCP_QTCB_VERSION > bottom->high_qtcb_version) {
+		ZFCP_LOG_NORMAL("error: the adapter %s "
+				"only supports older control block "
+				"versions than this device driver uses"
+				"(consider a microcode upgrade)\n",
+				zfcp_get_busid_by_adapter(adapter));
+		debug_text_event(adapter->erp_dbf, 0, "high_qtcb_ver");
+		zfcp_erp_adapter_shutdown(adapter, 0);
+		return -EIO;
+	}
+	return 0;
+}
+
 /*
  * function:    zfcp_fsf_exchange_config_data_handler
  *
@@ -2148,113 +2136,49 @@ zfcp_fsf_exchange_config_data(struct zfc
 static int
 zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *fsf_req)
 {
-	int retval = -EIO;
 	struct fsf_qtcb_bottom_config *bottom;
 	struct zfcp_adapter *adapter = fsf_req->adapter;
 
-	if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR) {
-		/* don't set any value, stay with the old (unitialized) ones */
-		goto skip_fsfstatus;
-	}
+	if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR)
+		return -EIO;
 
-	/* evaluate FSF status in QTCB */
 	switch (fsf_req->qtcb->header.fsf_status) {
 
 	case FSF_GOOD:
 		ZFCP_LOG_FLAGS(2, "FSF_GOOD\n");
-		bottom = &fsf_req->qtcb->bottom.config;
-		/* only log QTCB versions for now */
-		ZFCP_LOG_DEBUG("low QTCB version 0x%x of FSF, "
-			       "high QTCB version 0x%x of FSF, \n",
-			       bottom->low_qtcb_version,
-			       bottom->high_qtcb_version);
-		adapter->wwnn = bottom->nport_serv_param.wwnn;
-		adapter->wwpn = bottom->nport_serv_param.wwpn;
-		adapter->s_id = bottom->s_id & ZFCP_DID_MASK;
-		adapter->hydra_version = bottom->adapter_type;
-		adapter->fsf_lic_version = bottom->lic_version;
-		adapter->fc_topology = bottom->fc_topology;
-		adapter->fc_link_speed = bottom->fc_link_speed;
-                adapter->supported_features = bottom->supported_features;
 
-		if(adapter->supported_features & FSF_FEATURE_HBAAPI_MANAGEMENT){
-			adapter->hardware_version = bottom->hardware_version;
-                        /* copy just first 17 bytes */
-                        memcpy(adapter->serial_number,
-                               bottom->serial_number, 17);
-                        EBCASC(adapter->serial_number,
-                               sizeof(adapter->serial_number));
-		}
+		if (zfcp_fsf_exchange_config_evaluate(fsf_req, 1))
+			return -EIO;
 
-		ZFCP_LOG_INFO("The adapter %s reported "
-			      "the following characteristics:\n"
-			      "WWNN 0x%16.16Lx, "
-			      "WWPN 0x%16.16Lx, "
-			      "S_ID 0x%6.6x,\n"
-			      "adapter version 0x%x, "
-			      "LIC version 0x%x, "
-			      "FC link speed %d Gb/s\n",
-			      zfcp_get_busid_by_adapter(adapter),
-			      adapter->wwnn,
-			      adapter->wwpn,
-			      (unsigned int) adapter->s_id,
-			      adapter->hydra_version,
-			      adapter->fsf_lic_version,
-			      adapter->fc_link_speed);
-		if (ZFCP_QTCB_VERSION < bottom->low_qtcb_version) {
-			ZFCP_LOG_NORMAL("error: the adapter %s "
-					"only supports newer control block "
-					"versions in comparison to this device "
-					"driver (try updated device driver)\n",
-					zfcp_get_busid_by_adapter(adapter));
-			debug_text_event(fsf_req->adapter->erp_dbf, 0,
-					 "low_qtcb_ver");
-			zfcp_erp_adapter_shutdown(adapter, 0);
-			goto skip_fsfstatus;
-		}
-		if (ZFCP_QTCB_VERSION > bottom->high_qtcb_version) {
-			ZFCP_LOG_NORMAL("error: the adapter %s "
-					"only supports older control block "
-					"versions than this device driver uses"
-					"(consider a microcode upgrade)\n",
-					zfcp_get_busid_by_adapter(adapter));
-			debug_text_event(fsf_req->adapter->erp_dbf, 0,
-					 "high_qtcb_ver");
-			zfcp_erp_adapter_shutdown(adapter, 0);
-			goto skip_fsfstatus;
-		}
 		switch (adapter->fc_topology) {
 		case FSF_TOPO_P2P:
 			ZFCP_LOG_FLAGS(1, "FSF_TOPO_P2P\n");
-			ZFCP_LOG_NORMAL("error: Point-to-point fibre-channel "
-					"configuration detected "
-					"at the adapter %s, not "
-					"supported, shutting down adapter\n",
+			ZFCP_LOG_NORMAL("error: Point-to-point fibrechannel "
+					"configuration detected at adapter %s "
+					"unsupported, shutting down adapter\n",
 					zfcp_get_busid_by_adapter(adapter));
 			debug_text_event(fsf_req->adapter->erp_dbf, 0,
 					 "top-p-to-p");
 			zfcp_erp_adapter_shutdown(adapter, 0);
-			goto skip_fsfstatus;
+			return -EIO;
 		case FSF_TOPO_AL:
 			ZFCP_LOG_FLAGS(1, "FSF_TOPO_AL\n");
-			ZFCP_LOG_NORMAL("error: Arbitrated loop fibre-channel "
-					"topology detected "
-					"at the adapter %s, not "
-					"supported, shutting down adapter\n",
+			ZFCP_LOG_NORMAL("error: Arbitrated loop fibrechannel "
+					"topology detected at adapter %s "
+					"unsupported, shutting down adapter\n",
 					zfcp_get_busid_by_adapter(adapter));
 			debug_text_event(fsf_req->adapter->erp_dbf, 0,
 					 "top-al");
 			zfcp_erp_adapter_shutdown(adapter, 0);
-			goto skip_fsfstatus;
+			return -EIO;
 		case FSF_TOPO_FABRIC:
 			ZFCP_LOG_FLAGS(1, "FSF_TOPO_FABRIC\n");
-			ZFCP_LOG_INFO("Switched fabric fibre-channel "
-				      "network detected "
-				      "at the adapter %s.\n",
+			ZFCP_LOG_INFO("Switched fabric fibrechannel "
+				      "network detected at adapter %s.\n",
 				      zfcp_get_busid_by_adapter(adapter));
 			break;
 		default:
-			ZFCP_LOG_NORMAL("bug: The fibre-channel topology "
+			ZFCP_LOG_NORMAL("bug: The fibrechannel topology "
 					"reported by the exchange "
 					"configuration command for "
 					"the adapter %s is not "
@@ -2264,8 +2188,9 @@ zfcp_fsf_exchange_config_data_handler(st
 			debug_text_exception(fsf_req->adapter->erp_dbf, 0,
 					     "unknown-topo");
 			zfcp_erp_adapter_shutdown(adapter, 0);
-			goto skip_fsfstatus;
+			return -EIO;
 		}
+		bottom = &fsf_req->qtcb->bottom.config;
 		if (bottom->max_qtcb_size < sizeof(struct fsf_qtcb)) {
 			ZFCP_LOG_NORMAL("bug: Maximum QTCB size (%d bytes) "
 					"allowed by the adapter %s "
@@ -2279,22 +2204,32 @@ zfcp_fsf_exchange_config_data_handler(st
 			debug_event(fsf_req->adapter->erp_dbf, 0,
 				    &bottom->max_qtcb_size, sizeof (u32));
 			zfcp_erp_adapter_shutdown(adapter, 0);
-			goto skip_fsfstatus;
+			return -EIO;
 		}
 		atomic_set_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK,
 				&adapter->status);
-		retval = 0;
-
 		break;
+	case FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE:
+		debug_text_event(adapter->erp_dbf, 0, "xchg-inco");
 
+		if (zfcp_fsf_exchange_config_evaluate(fsf_req, 0))
+			return -EIO;
+
+		ZFCP_LOG_INFO("Local link to adapter %s is down\n",
+			      zfcp_get_busid_by_adapter(adapter));
+		atomic_set_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK |
+				ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED,
+				&adapter->status);
+		zfcp_erp_adapter_failed(adapter);
+		break;
 	default:
-		/* retval is -EIO by default */
 		debug_text_event(fsf_req->adapter->erp_dbf, 0, "fsf-stat-ng");
 		debug_event(fsf_req->adapter->erp_dbf, 0,
 			    &fsf_req->qtcb->header.fsf_status, sizeof (u32));
+		zfcp_erp_adapter_shutdown(adapter, 0);
+		return -EIO;
 	}
- skip_fsfstatus:
-	return retval;
+	return 0;
 }
 
 /*
@@ -2319,10 +2254,8 @@ zfcp_fsf_open_port(struct zfcp_erp_actio
 				     erp_action->adapter->pool.fsf_req_erp,
 				     &lock_flags, &(erp_action->fsf_req));
 	if (retval < 0) {
-		ZFCP_LOG_INFO("error: Out of resources. Could not create an "
-			      "open port request for "
-			      "the port with WWPN 0x%Lx connected to "
-			      "the adapter %s.\n",
+		ZFCP_LOG_INFO("error: Could not create open port request "
+			      "for port 0x%016Lx on adapter %s.\n",
 			      erp_action->port->wwpn,
 			      zfcp_get_busid_by_adapter(erp_action->adapter));
 		goto out;
@@ -2341,10 +2274,8 @@ zfcp_fsf_open_port(struct zfcp_erp_actio
 	/* start QDIO request for this FSF request */
 	retval = zfcp_fsf_req_send(erp_action->fsf_req, &erp_action->timer);
 	if (retval) {
-		ZFCP_LOG_INFO("error: Could not send an "
-			      "open port request for "
-			      "the port with WWPN 0x%Lx connected to "
-			      "the adapter %s.\n",
+		ZFCP_LOG_INFO("error: Could not send open port request for "
+			      "port 0x%016Lx on adapter %s.\n",
 			      erp_action->port->wwpn,
 			      zfcp_get_busid_by_adapter(erp_action->adapter));
 		zfcp_fsf_req_free(erp_action->fsf_req);
@@ -2352,8 +2283,8 @@ zfcp_fsf_open_port(struct zfcp_erp_actio
 		goto out;
 	}
 
-	ZFCP_LOG_DEBUG("Open Port request initiated "
-		       "(adapter busid=%s, port wwpn=0x%Lx)\n",
+	ZFCP_LOG_DEBUG("open port request initiated "
+		       "(adapter %s,  port 0x%016Lx)\n",
 		       zfcp_get_busid_by_adapter(erp_action->adapter),
 		       erp_action->port->wwpn);
  out:
@@ -2391,8 +2322,7 @@ zfcp_fsf_open_port_handler(struct zfcp_f
 
 	case FSF_PORT_ALREADY_OPEN:
 		ZFCP_LOG_FLAGS(0, "FSF_PORT_ALREADY_OPEN\n");
-		ZFCP_LOG_NORMAL("bug: The remote port with WWPN=0x%Lx "
-				"connected to the adapter %s "
+		ZFCP_LOG_NORMAL("bug: remote port 0x%016Lx on adapter %s "
 				"is already open.\n",
 				port->wwpn, zfcp_get_busid_by_port(port));
 		debug_text_exception(fsf_req->adapter->erp_dbf, 0,
@@ -2405,23 +2335,22 @@ zfcp_fsf_open_port_handler(struct zfcp_f
 
 	case FSF_ACCESS_DENIED:
 		ZFCP_LOG_FLAGS(2, "FSF_ACCESS_DENIED\n");
-		ZFCP_LOG_NORMAL("Access denied, cannot open port "
-			"with WWPN 0x%Lx connected to the adapter %s\n",
+		ZFCP_LOG_NORMAL("Access denied, cannot open port 0x%016Lx "
+				"on adapter %s\n",
 			port->wwpn, zfcp_get_busid_by_port(port));
-		counter = 0;
-		do {
-			subtable = header->fsf_status_qual.halfword[counter++];
-			rule = header->fsf_status_qual.halfword[counter++];
+		for (counter = 0; counter < 2; counter++) {
+			subtable = header->fsf_status_qual.halfword[counter * 2];
+			rule = header->fsf_status_qual.halfword[counter * 2 + 1];
 			switch (subtable) {
 			case FSF_SQ_CFDC_SUBTABLE_OS:
 			case FSF_SQ_CFDC_SUBTABLE_PORT_WWPN:
 			case FSF_SQ_CFDC_SUBTABLE_PORT_DID:
 			case FSF_SQ_CFDC_SUBTABLE_LUN:
-				ZFCP_LOG_NORMAL("Access denied (%s rule %d)\n",
+				ZFCP_LOG_INFO("Access denied (%s rule %d)\n",
 					zfcp_act_subtable_type[subtable], rule);
 				break;
 			}
-		} while (counter < 4);
+		}
 		debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_access");
 		zfcp_erp_port_failed(port);
 		fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
@@ -2430,8 +2359,7 @@ zfcp_fsf_open_port_handler(struct zfcp_f
 	case FSF_MAXIMUM_NUMBER_OF_PORTS_EXCEEDED:
 		ZFCP_LOG_FLAGS(1, "FSF_MAXIMUM_NUMBER_OF_PORTS_EXCEEDED\n");
 		ZFCP_LOG_INFO("error: The FSF adapter is out of resources. "
-			      "The remote port with WWPN=0x%Lx "
-			      "connected to the adapter %s "
+			      "The remote port 0x%016Lx on adapter %s "
 			      "could not be opened. Disabling it.\n",
 			      port->wwpn, zfcp_get_busid_by_port(port));
 		debug_text_event(fsf_req->adapter->erp_dbf, 1,
@@ -2459,9 +2387,9 @@ zfcp_fsf_open_port_handler(struct zfcp_f
 			break;
 		case FSF_SQ_NO_RETRY_POSSIBLE:
 			ZFCP_LOG_FLAGS(0, "FSF_SQ_NO_RETRY_POSSIBLE\n");
-			ZFCP_LOG_NORMAL("The remote port with WWPN=0x%Lx "
-					"connected to the adapter %s "
-					"could not be opened. Disabling it.\n",
+			ZFCP_LOG_NORMAL("The remote port 0x%016Lx on "
+					"adapter %s could not be opened. "
+					"Disabling it.\n",
 					port->wwpn,
 					zfcp_get_busid_by_port(port));
 			debug_text_exception(fsf_req->adapter->erp_dbf, 0,
@@ -2487,11 +2415,9 @@ zfcp_fsf_open_port_handler(struct zfcp_f
 		ZFCP_LOG_FLAGS(3, "FSF_GOOD\n");
 		/* save port handle assigned by FSF */
 		port->handle = header->port_handle;
-		ZFCP_LOG_INFO("The remote port (WWPN=0x%Lx) via adapter "
-			      "(busid=%s) was opened, it's "
-			      "port handle is 0x%x\n",
-			      port->wwpn,
-			      zfcp_get_busid_by_port(port),
+		ZFCP_LOG_INFO("The remote port 0x%016Lx via adapter %s "
+			      "was opened, it's port handle is 0x%x\n",
+			      port->wwpn, zfcp_get_busid_by_port(port),
 			      port->handle);
 		/* mark port as open */
 		atomic_set_mask(ZFCP_STATUS_COMMON_OPEN |
@@ -2527,9 +2453,9 @@ zfcp_fsf_open_port_handler(struct zfcp_f
 				/* skip sanity check and assume wwpn is ok */
 			} else {
 				if (plogi->serv_param.wwpn != port->wwpn) {
-					ZFCP_LOG_INFO("warning: D_ID of port "
-						      "with WWPN 0x%Lx changed "
-						      "during open\n", port->wwpn);
+					ZFCP_LOG_INFO("warning: d_id of port "
+						      "0x%016Lx changed during "
+						      "open\n", port->wwpn);
 					debug_text_event(
 						fsf_req->adapter->erp_dbf, 0,
 						"fsf_s_did_change:");
@@ -2579,9 +2505,8 @@ zfcp_fsf_close_port(struct zfcp_erp_acti
 				     erp_action->adapter->pool.fsf_req_erp,
 				     &lock_flags, &(erp_action->fsf_req));
 	if (retval < 0) {
-		ZFCP_LOG_INFO("error: Out of resources. Could not create a "
-			      "close port request for WWPN 0x%Lx connected to "
-			      "the adapter %s.\n",
+		ZFCP_LOG_INFO("error: Could not create a close port request "
+			      "for port 0x%016Lx on adapter %s.\n",
 			      erp_action->port->wwpn,
 			      zfcp_get_busid_by_adapter(erp_action->adapter));
 		goto out;
@@ -2601,9 +2526,8 @@ zfcp_fsf_close_port(struct zfcp_erp_acti
 	/* start QDIO request for this FSF request */
 	retval = zfcp_fsf_req_send(erp_action->fsf_req, &erp_action->timer);
 	if (retval) {
-		ZFCP_LOG_INFO("error: Could not send a "
-			      "close port request for WWPN 0x%Lx connected to "
-			      "the adapter %s.\n",
+		ZFCP_LOG_INFO("error: Could not send a close port request for "
+			      "port 0x%016Lx on adapter %s.\n",
 			      erp_action->port->wwpn,
 			      zfcp_get_busid_by_adapter(erp_action->adapter));
 		zfcp_fsf_req_free(erp_action->fsf_req);
@@ -2611,8 +2535,8 @@ zfcp_fsf_close_port(struct zfcp_erp_acti
 		goto out;
 	}
 
-	ZFCP_LOG_TRACE("Close Port request initiated "
-		       "(adapter busid=%s, port wwpn=0x%Lx)\n",
+	ZFCP_LOG_TRACE("close port request initiated "
+		       "(adapter %s, port 0x%016Lx)\n",
 		       zfcp_get_busid_by_adapter(erp_action->adapter),
 		       erp_action->port->wwpn);
  out:
@@ -2646,11 +2570,9 @@ zfcp_fsf_close_port_handler(struct zfcp_
 
 	case FSF_PORT_HANDLE_NOT_VALID:
 		ZFCP_LOG_FLAGS(1, "FSF_PORT_HANDLE_NOT_VALID\n");
-		ZFCP_LOG_INFO("Temporary port identifier (handle) 0x%x "
-			      "for the port with WWPN 0x%Lx connected to "
-			      "the adapter %s is "
-			      "not valid. This may happen occasionally.\n",
-			      port->handle,
+		ZFCP_LOG_INFO("Temporary port identifier 0x%x for port "
+			      "0x%016Lx on adapter %s invalid. This may happen "
+			      "occasionally.\n", port->handle,
 			      port->wwpn, zfcp_get_busid_by_port(port));
 		ZFCP_LOG_DEBUG("status qualifier:\n");
 		ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG,
@@ -2672,11 +2594,9 @@ zfcp_fsf_close_port_handler(struct zfcp_
 
 	case FSF_GOOD:
 		ZFCP_LOG_FLAGS(3, "FSF_GOOD\n");
-		ZFCP_LOG_TRACE("remote port (WWPN=0x%Lx) via adapter "
-			       "(busid=%s) closed, port handle 0x%x\n",
-			       port->wwpn,
-			       zfcp_get_busid_by_port(port),
-			       port->handle);
+		ZFCP_LOG_TRACE("remote port 0x016%Lx on adapter %s closed, "
+			       "port handle 0x%x\n", port->wwpn,
+			       zfcp_get_busid_by_port(port), port->handle);
 		zfcp_erp_modify_port_status(port,
 					    ZFCP_STATUS_COMMON_OPEN,
 					    ZFCP_CLEAR);
@@ -2720,12 +2640,11 @@ zfcp_fsf_close_physical_port(struct zfcp
 				     erp_action->adapter->pool.fsf_req_erp,
 				     &lock_flags, &erp_action->fsf_req);
 	if (retval < 0) {
-		ZFCP_LOG_INFO("error: Out of resources. Could not create a "
-			      "close physical port request for "
-			      "the port with WWPN 0x%Lx connected to "
-			      "the adapter %s.\n",
-			      erp_action->port->wwpn,
-			      zfcp_get_busid_by_adapter(erp_action->adapter));
+		ZFCP_LOG_INFO("error: Could not create close physical port "
+			      "request (adapter %s, port 0x%016Lx)\n",
+			      zfcp_get_busid_by_adapter(erp_action->adapter),
+			      erp_action->port->wwpn);
+
 		goto out;
 	}
 
@@ -2742,18 +2661,17 @@ zfcp_fsf_close_physical_port(struct zfcp
 	/* start QDIO request for this FSF request */
 	retval = zfcp_fsf_req_send(erp_action->fsf_req, &erp_action->timer);
 	if (retval) {
-		ZFCP_LOG_INFO("error: Could not send an close physical port "
-			      "request for the port with WWPN 0x%Lx connected "
-			      "to the adapter %s.\n",
-			      erp_action->port->wwpn,
-			      zfcp_get_busid_by_adapter(erp_action->adapter));
+		ZFCP_LOG_INFO("error: Could not send close physical port "
+			      "request (adapter %s, port 0x%016Lx)\n",
+			      zfcp_get_busid_by_adapter(erp_action->adapter),
+			      erp_action->port->wwpn);
 		zfcp_fsf_req_free(erp_action->fsf_req);
 		erp_action->fsf_req = NULL;
 		goto out;
 	}
 
-	ZFCP_LOG_TRACE("Close Physical Port request initiated "
-		       "(adapter busid=%s, port wwpn=0x%Lx)\n",
+	ZFCP_LOG_TRACE("close physical port request initiated "
+		       "(adapter %s, port 0x%016Lx)\n",
 		       zfcp_get_busid_by_adapter(erp_action->adapter),
 		       erp_action->port->wwpn);
  out:
@@ -2791,13 +2709,12 @@ zfcp_fsf_close_physical_port_handler(str
 
 	case FSF_PORT_HANDLE_NOT_VALID:
 		ZFCP_LOG_FLAGS(1, "FSF_PORT_HANDLE_NOT_VALID\n");
-		ZFCP_LOG_INFO("Temporary port identifier (handle) 0x%x "
-			      "for the port with WWPN 0x%Lx connected to "
-			      "the adapter %s is not valid. This may happen "
-			      "occasionally.\n",
+		ZFCP_LOG_INFO("Temporary port identifier 0x%x invalid"
+			      "(adapter %s, port 0x%016Lx). "
+			      "This may happen occasionally.\n",
 			      port->handle,
-			      port->wwpn,
-			      zfcp_get_busid_by_port(port));
+			      zfcp_get_busid_by_port(port),
+			      port->wwpn);
 		ZFCP_LOG_DEBUG("status qualifier:\n");
 		ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG,
 			      (char *) &header->fsf_status_qual,
@@ -2811,30 +2728,29 @@ zfcp_fsf_close_physical_port_handler(str
 	case FSF_ACCESS_DENIED:
 		ZFCP_LOG_FLAGS(2, "FSF_ACCESS_DENIED\n");
 		ZFCP_LOG_NORMAL("Access denied, cannot close "
-				"physical port with WWPN 0x%Lx connected to "
-				"the adapter %s\n", port->wwpn,
+				"physical port 0x%016Lx on "
+				"adapter %s\n", port->wwpn,
 				zfcp_get_busid_by_port(port));
-		counter = 0;
-		do {
-			subtable = header->fsf_status_qual.halfword[counter++];
-			rule = header->fsf_status_qual.halfword[counter++];
+		for (counter = 0; counter < 2; counter++) {
+			subtable = header->fsf_status_qual.halfword[counter * 2];
+			rule = header->fsf_status_qual.halfword[counter * 2 + 1];
 			switch (subtable) {
 			case FSF_SQ_CFDC_SUBTABLE_OS:
 			case FSF_SQ_CFDC_SUBTABLE_PORT_WWPN:
 			case FSF_SQ_CFDC_SUBTABLE_PORT_DID:
 			case FSF_SQ_CFDC_SUBTABLE_LUN:
-	       			ZFCP_LOG_NORMAL("Access denied (%s rule %d)\n",
+	       			ZFCP_LOG_INFO("Access denied (%s rule %d)\n",
 					zfcp_act_subtable_type[subtable], rule);
 				break;
 			}
-		} while (counter < 4);
+		}
 		debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_access");
 		fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 		break;
 
 	case FSF_PORT_BOXED:
 		ZFCP_LOG_FLAGS(2, "FSF_PORT_BOXED\n");
-		ZFCP_LOG_DEBUG("The remote port with WWPN 0x%Lx on the adapter "
+		ZFCP_LOG_DEBUG("The remote port 0x%016Lx on adapter "
 			       "%s needs to be reopened but it was attempted "
 			       "to close it physically.\n",
 			       port->wwpn,
@@ -2879,9 +2795,8 @@ zfcp_fsf_close_physical_port_handler(str
 
 	case FSF_GOOD:
 		ZFCP_LOG_FLAGS(3, "FSF_GOOD\n");
-		ZFCP_LOG_DEBUG("Remote port (WWPN=0x%Lx) via adapter "
-			       "(busid=%s) physically closed, "
-			       "port handle 0x%x\n",
+		ZFCP_LOG_DEBUG("Remote port 0x%016Lx via adapter %s "
+			       "physically closed, port handle 0x%x\n",
 			       port->wwpn,
 			       zfcp_get_busid_by_port(port), port->handle);
 		/* can't use generic zfcp_erp_modify_port_status because
@@ -2934,10 +2849,8 @@ zfcp_fsf_open_unit(struct zfcp_erp_actio
 				     erp_action->adapter->pool.fsf_req_erp,
 				     &lock_flags, &(erp_action->fsf_req));
 	if (retval < 0) {
-		ZFCP_LOG_INFO("error: Out of resources. Could not create an "
-			      "open unit request for FCP-LUN 0x%Lx connected "
-			      "to the port with WWPN 0x%Lx connected to "
-			      "the adapter %s.\n",
+		ZFCP_LOG_INFO("error: Could not create open unit request for "
+			      "unit 0x%016Lx on port 0x%016Lx on adapter %s.\n",
 			      erp_action->unit->fcp_lun,
 			      erp_action->unit->port->wwpn,
 			      zfcp_get_busid_by_adapter(erp_action->adapter));
@@ -2956,15 +2869,13 @@ zfcp_fsf_open_unit(struct zfcp_erp_actio
 	atomic_set_mask(ZFCP_STATUS_COMMON_OPENING, &erp_action->unit->status);
 	erp_action->fsf_req->data.open_unit.unit = erp_action->unit;
 	erp_action->fsf_req->erp_action = erp_action;
-	erp_action->fsf_req->qtcb->bottom.support.option =
-		FSF_OPEN_LUN_SUPPRESS_BOXING;
 
 	/* start QDIO request for this FSF request */
 	retval = zfcp_fsf_req_send(erp_action->fsf_req, &erp_action->timer);
 	if (retval) {
 		ZFCP_LOG_INFO("error: Could not send an open unit request "
-			      "on the adapter %s, port WWPN 0x%Lx for "
-			      "unit LUN 0x%Lx\n",
+			      "on the adapter %s, port 0x%016Lx for "
+			      "unit 0x%016Lx\n",
 			      zfcp_get_busid_by_adapter(erp_action->adapter),
 			      erp_action->port->wwpn,
 			      erp_action->unit->fcp_lun);
@@ -2973,8 +2884,8 @@ zfcp_fsf_open_unit(struct zfcp_erp_actio
 		goto out;
 	}
 
-	ZFCP_LOG_TRACE("Open LUN request initiated (adapter busid=%s, "
-		       "port wwpn=0x%Lx, unit fcp_lun=0x%Lx)\n",
+	ZFCP_LOG_TRACE("Open LUN request initiated (adapter %s, "
+		       "port 0x%016Lx, unit 0x%016Lx)\n",
 		       zfcp_get_busid_by_adapter(erp_action->adapter),
 		       erp_action->port->wwpn, erp_action->unit->fcp_lun);
  out:
@@ -2994,12 +2905,16 @@ static int
 zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req)
 {
 	int retval = -EINVAL;
+	struct zfcp_adapter *adapter;
 	struct zfcp_unit *unit;
 	struct fsf_qtcb_header *header;
+	struct fsf_qtcb_bottom_support *bottom;
 	u16 subtable, rule, counter;
 
+	adapter = fsf_req->adapter;
 	unit = fsf_req->data.open_unit.unit;
 	header = &fsf_req->qtcb->header;
+	bottom = &fsf_req->qtcb->bottom.support;
 
 	if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR) {
 		/* don't change unit status in our bookkeeping */
@@ -3011,67 +2926,61 @@ zfcp_fsf_open_unit_handler(struct zfcp_f
 
 	case FSF_PORT_HANDLE_NOT_VALID:
 		ZFCP_LOG_FLAGS(1, "FSF_PORT_HANDLE_NOT_VALID\n");
-		ZFCP_LOG_INFO("Temporary port identifier (handle) 0x%x "
-			      "for the port with WWPN 0x%Lx connected to "
-			      "the adapter %s is "
-			      "not valid. This may happen occasionally.\n",
+		ZFCP_LOG_INFO("Temporary port identifier 0x%x "
+			      "for port 0x%016Lx on adapter %s invalid "
+			      "This may happen occasionally\n",
 			      unit->port->handle,
 			      unit->port->wwpn, zfcp_get_busid_by_unit(unit));
 		ZFCP_LOG_DEBUG("status qualifier:\n");
 		ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG,
 			      (char *) &header->fsf_status_qual,
 			      sizeof (union fsf_status_qual));
-		debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_ph_nv");
+		debug_text_event(adapter->erp_dbf, 1, "fsf_s_ph_nv");
 		zfcp_erp_adapter_reopen(unit->port->adapter, 0);
 		fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 		break;
 
 	case FSF_LUN_ALREADY_OPEN:
 		ZFCP_LOG_FLAGS(0, "FSF_LUN_ALREADY_OPEN\n");
-		ZFCP_LOG_NORMAL("bug: Attempted to open the logical unit "
-				"with FCP-LUN 0x%Lx at "
-				"the remote port with WWPN 0x%Lx connected "
-				"to the adapter %s twice.\n",
+		ZFCP_LOG_NORMAL("bug: Attempted to open unit 0x%016Lx on "
+				"remote port 0x%016Lx on adapter %s twice.\n",
 				unit->fcp_lun,
 				unit->port->wwpn, zfcp_get_busid_by_unit(unit));
-		debug_text_exception(fsf_req->adapter->erp_dbf, 0,
+		debug_text_exception(adapter->erp_dbf, 0,
 				     "fsf_s_uopen");
 		fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 		break;
 
 	case FSF_ACCESS_DENIED:
 		ZFCP_LOG_FLAGS(2, "FSF_ACCESS_DENIED\n");
-		ZFCP_LOG_NORMAL("Access denied, cannot open unit "
-				"with FCP-LUN 0x%Lx at the remote port with "
-				"WWPN 0x%Lx connected to the adapter %s\n",
-			unit->fcp_lun, unit->port->wwpn,
-			zfcp_get_busid_by_unit(unit));
-		counter = 0;
-		do {
-			subtable = header->fsf_status_qual.halfword[counter++];
-			rule = header->fsf_status_qual.halfword[counter++];
+		ZFCP_LOG_NORMAL("Access denied, cannot open unit 0x%016Lx on "
+				"remote port 0x%016Lx on adapter %s\n",
+				unit->fcp_lun, unit->port->wwpn,
+				zfcp_get_busid_by_unit(unit));
+		for (counter = 0; counter < 2; counter++) {
+			subtable = header->fsf_status_qual.halfword[counter * 2];
+			rule = header->fsf_status_qual.halfword[counter * 2 + 1];
 			switch (subtable) {
 			case FSF_SQ_CFDC_SUBTABLE_OS:
 			case FSF_SQ_CFDC_SUBTABLE_PORT_WWPN:
 			case FSF_SQ_CFDC_SUBTABLE_PORT_DID:
 			case FSF_SQ_CFDC_SUBTABLE_LUN:
-				ZFCP_LOG_NORMAL("Access denied (%s rule %d)\n",
+				ZFCP_LOG_INFO("Access denied (%s rule %d)\n",
 					zfcp_act_subtable_type[subtable], rule);
 				break;
 			}
-		} while (counter < 4);
-		debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_access");
+		}
+		debug_text_event(adapter->erp_dbf, 1, "fsf_s_access");
 		zfcp_erp_unit_failed(unit);
 		fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 		break;
 
 	case FSF_PORT_BOXED:
 		ZFCP_LOG_FLAGS(2, "FSF_PORT_BOXED\n");
-		ZFCP_LOG_DEBUG("The remote port "
-			       "with WWPN 0x%Lx on the adapter %s "
+		ZFCP_LOG_DEBUG("The remote port 0x%016Lx on adapter %s "
 			       "needs to be reopened\n",
 			       unit->port->wwpn, zfcp_get_busid_by_unit(unit));
-		debug_text_event(fsf_req->adapter->erp_dbf, 2, "fsf_s_pboxed");
+		debug_text_event(adapter->erp_dbf, 2, "fsf_s_pboxed");
 		zfcp_erp_port_reopen(unit->port, 0);
 		fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR |
 			ZFCP_STATUS_FSFREQ_RETRY;
@@ -3079,30 +2988,40 @@ zfcp_fsf_open_unit_handler(struct zfcp_f
 
 	case FSF_LUN_SHARING_VIOLATION :
 		ZFCP_LOG_FLAGS(2, "FSF_LUN_SHARING_VIOLATION\n");
-		ZFCP_LOG_NORMAL("error: FCP-LUN 0x%Lx at "
-				"the remote port with WWPN 0x%Lx connected "
-				"to the adapter %s "
-				"is already owned by another operating system "
-				"instance (LPAR or VM guest)\n",
-				unit->fcp_lun,
-				unit->port->wwpn,
-				zfcp_get_busid_by_unit(unit));
-		subtable = header->fsf_status_qual.halfword[4];
-		rule = header->fsf_status_qual.halfword[5];
-		switch (subtable) {
-		case FSF_SQ_CFDC_SUBTABLE_OS:
-		case FSF_SQ_CFDC_SUBTABLE_PORT_WWPN:
-		case FSF_SQ_CFDC_SUBTABLE_PORT_DID:
-		case FSF_SQ_CFDC_SUBTABLE_LUN:
-			ZFCP_LOG_NORMAL("Access denied (%s rule %d)\n",
-				zfcp_act_subtable_type[subtable], rule);
-			break;
+		if (header->fsf_status_qual.word[0] != 0) {
+			ZFCP_LOG_NORMAL("FCP-LUN 0x%Lx at the remote port "
+					"with WWPN 0x%Lx "
+					"connected to the adapter %s "
+					"is already in use in LPAR%d\n",
+					unit->fcp_lun,
+					unit->port->wwpn,
+					zfcp_get_busid_by_unit(unit),
+					header->fsf_status_qual.fsf_queue_designator.hla);
+		} else {
+			subtable = header->fsf_status_qual.halfword[4];
+			rule = header->fsf_status_qual.halfword[5];
+			switch (subtable) {
+			case FSF_SQ_CFDC_SUBTABLE_OS:
+			case FSF_SQ_CFDC_SUBTABLE_PORT_WWPN:
+			case FSF_SQ_CFDC_SUBTABLE_PORT_DID:
+			case FSF_SQ_CFDC_SUBTABLE_LUN:
+				ZFCP_LOG_NORMAL("Access to FCP-LUN 0x%Lx at the "
+						"remote port with WWPN 0x%Lx "
+						"connected to the adapter %s "
+						"is denied (%s rule %d)\n",
+						unit->fcp_lun,
+						unit->port->wwpn,
+						zfcp_get_busid_by_unit(unit),
+						zfcp_act_subtable_type[subtable],
+						rule);
+				break;
+			}
 		}
-		ZFCP_LOG_NORMAL("Additional sense data is presented:\n");
-		ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL,
+		ZFCP_LOG_DEBUG("status qualifier:\n");
+		ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG,
 			      (char *) &header->fsf_status_qual,
 			      sizeof (union fsf_status_qual));
-		debug_text_event(fsf_req->adapter->erp_dbf, 2,
+		debug_text_event(adapter->erp_dbf, 2,
 				 "fsf_s_l_sh_vio");
 		zfcp_erp_unit_failed(unit);
 		fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
@@ -3112,13 +3031,12 @@ zfcp_fsf_open_unit_handler(struct zfcp_f
 		ZFCP_LOG_FLAGS(1, "FSF_MAXIMUM_NUMBER_OF_LUNS_EXCEEDED\n");
 		ZFCP_LOG_INFO("error: The adapter ran out of resources. "
 			      "There is no handle (temporary port identifier) "
-			      "available for the unit with FCP-LUN 0x%Lx "
-			      "at the remote port with WWPN 0x%Lx connected "
-			      "to the adapter %s\n",
+			      "available for unit 0x%016Lx on port 0x%016Lx "
+			      "on adapter %s\n",
 			      unit->fcp_lun,
 			      unit->port->wwpn,
 			      zfcp_get_busid_by_unit(unit));
-		debug_text_event(fsf_req->adapter->erp_dbf, 1,
+		debug_text_event(adapter->erp_dbf, 1,
 				 "fsf_s_max_units");
 		zfcp_erp_unit_failed(unit);
 		fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
@@ -3131,7 +3049,7 @@ zfcp_fsf_open_unit_handler(struct zfcp_f
 			ZFCP_LOG_FLAGS(2,
 				       "FSF_SQ_INVOKE_LINK_TEST_PROCEDURE\n");
 			/* Re-establish link to port */
-			debug_text_event(fsf_req->adapter->erp_dbf, 1,
+			debug_text_event(adapter->erp_dbf, 1,
 					 "fsf_sq_ltest");
 			zfcp_erp_port_reopen(unit->port, 0);
 			fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
@@ -3140,7 +3058,7 @@ zfcp_fsf_open_unit_handler(struct zfcp_f
 			ZFCP_LOG_FLAGS(2,
 				       "FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED\n");
 			/* ERP strategy will escalate */
-			debug_text_event(fsf_req->adapter->erp_dbf, 1,
+			debug_text_event(adapter->erp_dbf, 1,
 					 "fsf_sq_ulp");
 			fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 			break;
@@ -3148,21 +3066,31 @@ zfcp_fsf_open_unit_handler(struct zfcp_f
 			ZFCP_LOG_NORMAL
 			    ("bug: Wrong status qualifier 0x%x arrived.\n",
 			     header->fsf_status_qual.word[0]);
-			debug_text_event(fsf_req->adapter->erp_dbf, 0,
+			debug_text_event(adapter->erp_dbf, 0,
 					 "fsf_sq_inval:");
-			debug_exception(fsf_req->adapter->erp_dbf, 0,
+			debug_exception(adapter->erp_dbf, 0,
 					&header->fsf_status_qual.word[0],
 				sizeof (u32));
 		}
 		break;
 
+	case FSF_INVALID_COMMAND_OPTION:
+		ZFCP_LOG_FLAGS(2, "FSF_INVALID_COMMAND_OPTION\n");
+		ZFCP_LOG_NORMAL(
+			"Invalid option 0x%x has been specified "
+			"in QTCB bottom sent to the adapter %s\n",
+			bottom->option,
+			zfcp_get_busid_by_adapter(adapter));
+		fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
+		retval = -EINVAL;
+		break;
+
 	case FSF_GOOD:
 		ZFCP_LOG_FLAGS(3, "FSF_GOOD\n");
 		/* save LUN handle assigned by FSF */
 		unit->handle = header->lun_handle;
-		ZFCP_LOG_TRACE("unit (FCP_LUN=0x%Lx) of remote port "
-			       "(WWPN=0x%Lx) via adapter (busid=%s) opened, "
-			       "port handle 0x%x \n",
+		ZFCP_LOG_TRACE("unit 0x%016Lx on remote port 0x%016Lx on "
+			       "adapter %s opened, port handle 0x%x\n",
 			       unit->fcp_lun,
 			       unit->port->wwpn,
 			       zfcp_get_busid_by_unit(unit),
@@ -3176,8 +3104,8 @@ zfcp_fsf_open_unit_handler(struct zfcp_f
 		ZFCP_LOG_NORMAL("bug: An unknown FSF Status was presented "
 				"(debug info 0x%x)\n",
 				header->fsf_status);
-		debug_text_event(fsf_req->adapter->erp_dbf, 0, "fsf_s_inval:");
-		debug_exception(fsf_req->adapter->erp_dbf, 0,
+		debug_text_event(adapter->erp_dbf, 0, "fsf_s_inval:");
+		debug_exception(adapter->erp_dbf, 0,
 				&header->fsf_status, sizeof (u32));
 		break;
 	}
@@ -3214,10 +3142,8 @@ zfcp_fsf_close_unit(struct zfcp_erp_acti
 				     erp_action->adapter->pool.fsf_req_erp,
 				     &lock_flags, &(erp_action->fsf_req));
 	if (retval < 0) {
-		ZFCP_LOG_INFO("error: Out of resources. Could not create a "
-			      "close unit request for FCP-LUN 0x%Lx "
-			      "connected to the port with WWPN 0x%Lx connected "
-			      "to the adapter %s.\n",
+		ZFCP_LOG_INFO("error: Could not create close unit request for "
+			      "unit 0x%016Lx on port 0x%016Lx on adapter %s.\n",
 			      erp_action->unit->fcp_lun,
 			      erp_action->port->wwpn,
 			      zfcp_get_busid_by_adapter(erp_action->adapter));
@@ -3240,8 +3166,7 @@ zfcp_fsf_close_unit(struct zfcp_erp_acti
 	retval = zfcp_fsf_req_send(erp_action->fsf_req, &erp_action->timer);
 	if (retval) {
 		ZFCP_LOG_INFO("error: Could not send a close unit request for "
-			      "FCP-LUN 0x%Lx connected to the port with "
-			      "WWPN 0x%Lx connected to the adapter %s.\n",
+			      "unit 0x%016Lx on port 0x%016Lx onadapter %s.\n",
 			      erp_action->unit->fcp_lun,
 			      erp_action->port->wwpn,
 			      zfcp_get_busid_by_adapter(erp_action->adapter));
@@ -3250,8 +3175,8 @@ zfcp_fsf_close_unit(struct zfcp_erp_acti
 		goto out;
 	}
 
-	ZFCP_LOG_TRACE("Close LUN request initiated (adapter busid=%s, "
-		       "port wwpn=0x%Lx, unit fcp_lun=0x%Lx)\n",
+	ZFCP_LOG_TRACE("Close LUN request initiated (adapter %s, "
+		       "port 0x%016Lx, unit 0x%016Lx)\n",
 		       zfcp_get_busid_by_adapter(erp_action->adapter),
 		       erp_action->port->wwpn, erp_action->unit->fcp_lun);
  out:
@@ -3285,9 +3210,8 @@ zfcp_fsf_close_unit_handler(struct zfcp_
 
 	case FSF_PORT_HANDLE_NOT_VALID:
 		ZFCP_LOG_FLAGS(1, "FSF_PORT_HANDLE_NOT_VALID\n");
-		ZFCP_LOG_INFO("Temporary port identifier (handle) 0x%x "
-			      "for the port with WWPN 0x%Lx connected to "
-			      "the adapter %s is not valid. This may "
+		ZFCP_LOG_INFO("Temporary port identifier 0x%x for port "
+			      "0x%016Lx on adapter %s invalid. This may "
 			      "happen in rare circumstances\n",
 			      unit->port->handle,
 			      unit->port->wwpn,
@@ -3307,11 +3231,9 @@ zfcp_fsf_close_unit_handler(struct zfcp_
 
 	case FSF_LUN_HANDLE_NOT_VALID:
 		ZFCP_LOG_FLAGS(1, "FSF_LUN_HANDLE_NOT_VALID\n");
-		ZFCP_LOG_INFO("Temporary LUN identifier (handle) 0x%x "
-			      "of the logical unit with FCP-LUN 0x%Lx at "
-			      "the remote port with WWPN 0x%Lx connected "
-			      "to the adapter %s is "
-			      "not valid. This may happen occasionally.\n",
+		ZFCP_LOG_INFO("Temporary LUN identifier 0x%x of unit "
+			      "0x%016Lx on port 0x%016Lx on adapter %s is "
+			      "invalid. This may happen occasionally.\n",
 			      unit->handle,
 			      unit->fcp_lun,
 			      unit->port->wwpn,
@@ -3331,8 +3253,7 @@ zfcp_fsf_close_unit_handler(struct zfcp_
 
 	case FSF_PORT_BOXED:
 		ZFCP_LOG_FLAGS(2, "FSF_PORT_BOXED\n");
-		ZFCP_LOG_DEBUG("The remote port "
-			       "with WWPN 0x%Lx on the adapter %s "
+		ZFCP_LOG_DEBUG("The remote port 0x%016Lx on adapter %s "
 			       "needs to be reopened\n",
 			       unit->port->wwpn,
 			       zfcp_get_busid_by_unit(unit));
@@ -3378,9 +3299,8 @@ zfcp_fsf_close_unit_handler(struct zfcp_
 
 	case FSF_GOOD:
 		ZFCP_LOG_FLAGS(3, "FSF_GOOD\n");
-		ZFCP_LOG_TRACE("unit (FCP_LUN=0x%Lx) of remote port "
-			       "(WWPN=0x%Lx) via adapter (busid=%s) closed, "
-			       "port handle 0x%x \n",
+		ZFCP_LOG_TRACE("unit 0x%016Lx on port 0x%016Lx on adapter %s "
+			       "closed, port handle 0x%x\n",
 			       unit->fcp_lun,
 			       unit->port->wwpn,
 			       zfcp_get_busid_by_unit(unit),
@@ -3432,10 +3352,9 @@ zfcp_fsf_send_fcp_command_task(struct zf
 				     adapter->pool.fsf_req_scsi,
 				     &lock_flags, &fsf_req);
 	if (unlikely(retval < 0)) {
-		ZFCP_LOG_DEBUG("error: Out of resources. Could not create an "
-			       "FCP command request for FCP-LUN 0x%Lx "
-			       "connected to the port with WWPN 0x%Lx "
-			       "connected to the adapter %s.\n",
+		ZFCP_LOG_DEBUG("error: Could not create FCP command request "
+			       "for unit 0x%016Lx on port 0x%016Lx on "
+			       "adapter %s\n",
 			       unit->fcp_lun,
 			       unit->port->wwpn,
 			       zfcp_get_busid_by_adapter(adapter));
@@ -3454,18 +3373,13 @@ zfcp_fsf_send_fcp_command_task(struct zf
 	 * (need this for look up on normal command completion)
 	 */
 	fsf_req->data.send_fcp_command_task.scsi_cmnd = scsi_cmnd;
-#ifdef ZFCP_DEBUG_REQUESTS
 	debug_text_event(adapter->req_dbf, 3, "fsf/sc");
 	debug_event(adapter->req_dbf, 3, &fsf_req, sizeof (unsigned long));
 	debug_event(adapter->req_dbf, 3, &scsi_cmnd, sizeof (unsigned long));
-#endif				/* ZFCP_DEBUG_REQUESTS */
-#ifdef ZFCP_DEBUG_ABORTS
-	fsf_req->data.send_fcp_command_task.start_jiffies = jiffies;
-#endif
 
+	fsf_req->data.send_fcp_command_task.start_jiffies = jiffies;
 	fsf_req->data.send_fcp_command_task.unit = unit;
-	ZFCP_LOG_DEBUG("unit=0x%lx, unit_fcp_lun=0x%Lx\n",
-		       (unsigned long) unit, unit->fcp_lun);
+	ZFCP_LOG_DEBUG("unit=%p, fcp_lun=0x%016Lx\n", unit, unit->fcp_lun);
 
 	/* set handles of unit and its parent port in QTCB */
 	fsf_req->qtcb->header.lun_handle = unit->handle;
@@ -3560,9 +3474,9 @@ zfcp_fsf_send_fcp_command_task(struct zf
 		retval = -EIO;
 	} else {
 		ZFCP_LOG_NORMAL("error: No truncation implemented but "
-					"required. Shutting down unit "
-					"(busid=%s, WWPN=0x%16.16Lx, "
-					"FCP_LUN=0x%16.16Lx)\n",
+				"required. Shutting down unit "
+				"(adapter %s, port 0x%016Lx, "
+				"unit 0x%016Lx)\n",
 				zfcp_get_busid_by_unit(unit),
 				unit->port->wwpn,
 				unit->fcp_lun);
@@ -3585,17 +3499,16 @@ zfcp_fsf_send_fcp_command_task(struct zf
 	 */
 	retval = zfcp_fsf_req_send(fsf_req, NULL);
 	if (unlikely(retval < 0)) {
-		ZFCP_LOG_INFO("error: Could not send an FCP command request "
-			      "for a command on the adapter %s, "
-			      "port WWPN 0x%Lx and unit LUN 0x%Lx\n",
+		ZFCP_LOG_INFO("error: Could not send FCP command request "
+			      "on adapter %s, port 0x%016Lx, unit 0x%016Lx\n",
 			      zfcp_get_busid_by_adapter(adapter),
 			      unit->port->wwpn,
 			      unit->fcp_lun);
 		goto send_failed;
 	}
 
-	ZFCP_LOG_TRACE("Send FCP Command initiated (adapter busid=%s, "
-		       "port wwpn=0x%Lx, unit fcp_lun=0x%Lx)\n",
+	ZFCP_LOG_TRACE("Send FCP Command initiated (adapter %s, "
+		       "port 0x%016Lx, unit 0x%016Lx)\n",
 		       zfcp_get_busid_by_adapter(adapter),
 		       unit->port->wwpn,
 		       unit->fcp_lun);
@@ -3605,10 +3518,8 @@ zfcp_fsf_send_fcp_command_task(struct zf
  no_fit:
  failed_scsi_cmnd:
 	/* dequeue new FSF request previously enqueued */
-#ifdef ZFCP_DEBUG_REQUESTS
 	debug_text_event(adapter->req_dbf, 3, "fail_sc");
 	debug_event(adapter->req_dbf, 3, &scsi_cmnd, sizeof (unsigned long));
-#endif				/* ZFCP_DEBUG_REQUESTS */
 
 	zfcp_fsf_req_free(fsf_req);
 	fsf_req = NULL;
@@ -3646,10 +3557,9 @@ zfcp_fsf_send_fcp_command_task_managemen
 				     adapter->pool.fsf_req_scsi,
 				     &lock_flags, &fsf_req);
 	if (retval < 0) {
-		ZFCP_LOG_INFO("error: Out of resources. Could not create an "
-			      "FCP command (task management) request for "
-			      "the adapter %s, port with "
-			      "WWPN 0x%Lx and FCP_LUN 0x%Lx.\n",
+		ZFCP_LOG_INFO("error: Could not create FCP command (task "
+			      "management) request for adapter %s, port "
+			      " 0x%016Lx, unit 0x%016Lx.\n",
 			      zfcp_get_busid_by_adapter(adapter),
 			      unit->port->wwpn, unit->fcp_lun);
 		goto out;
@@ -3692,8 +3602,8 @@ zfcp_fsf_send_fcp_command_task_managemen
 	if (retval) {
 		del_timer(&adapter->scsi_er_timer);
 		ZFCP_LOG_INFO("error: Could not send an FCP-command (task "
-			      "management) on the adapter %s, port WWPN "
-			      "0x%Lx for unit LUN 0x%Lx\n",
+			      "management) on adapter %s, port 0x%016Lx for "
+			      "unit LUN 0x%016Lx\n",
 			      zfcp_get_busid_by_adapter(adapter),
 			      unit->port->wwpn,
 			      unit->fcp_lun);
@@ -3703,8 +3613,8 @@ zfcp_fsf_send_fcp_command_task_managemen
 	}
 
 	ZFCP_LOG_TRACE("Send FCP Command (task management function) initiated "
-		       "(adapter busid=%s, port wwpn=0x%Lx, "
-		       "unit fcp_lun=0x%Lx, tm_flags=0x%x)\n",
+		       "(adapter %s, port 0x%016Lx, unit 0x%016Lx, "
+		       "tm_flags=0x%x)\n",
 		       zfcp_get_busid_by_adapter(adapter),
 		       unit->port->wwpn,
 		       unit->fcp_lun,
@@ -3746,9 +3656,8 @@ zfcp_fsf_send_fcp_command_handler(struct
 
 	case FSF_PORT_HANDLE_NOT_VALID:
 		ZFCP_LOG_FLAGS(1, "FSF_PORT_HANDLE_NOT_VALID\n");
-		ZFCP_LOG_INFO("Temporary port identifier (handle) 0x%x "
-			      "for the port with WWPN 0x%Lx connected to "
-			      "the adapter %s is not valid.\n",
+		ZFCP_LOG_INFO("Temporary port identifier 0x%x for port "
+			      "0x%016Lx on adapter %s invalid\n",
 			      unit->port->handle,
 			      unit->port->wwpn, zfcp_get_busid_by_unit(unit));
 		ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG,
@@ -3762,11 +3671,9 @@ zfcp_fsf_send_fcp_command_handler(struct
 
 	case FSF_LUN_HANDLE_NOT_VALID:
 		ZFCP_LOG_FLAGS(1, "FSF_LUN_HANDLE_NOT_VALID\n");
-		ZFCP_LOG_INFO("Temporary LUN identifier (handle) 0x%x "
-			      "of the logical unit with FCP-LUN 0x%Lx at "
-			      "the remote port with WWPN 0x%Lx connected "
-			      "to the adapter %s is "
-			      "not valid. This may happen occasionally.\n",
+		ZFCP_LOG_INFO("Temporary LUN identifier 0x%x for unit "
+			      "0x%016Lx on port 0x%016Lx on adapter %s is "
+			      "invalid. This may happen occasionally.\n",
 			      unit->handle,
 			      unit->fcp_lun,
 			      unit->port->wwpn,
@@ -3783,16 +3690,13 @@ zfcp_fsf_send_fcp_command_handler(struct
 
 	case FSF_HANDLE_MISMATCH:
 		ZFCP_LOG_FLAGS(0, "FSF_HANDLE_MISMATCH\n");
-		ZFCP_LOG_NORMAL("bug: The port handle (temporary port "
-				"identifier) 0x%x has changed unexpectedly. "
-				"This was detected upon receiveing the "
-				"response of a command send to the unit with "
-				"FCP-LUN 0x%Lx at the remote port with WWPN "
-				"0x%Lx connected to the adapter %s.\n",
+		ZFCP_LOG_NORMAL("bug: The port handle 0x%x has changed "
+				"unexpectedly. (adapter %s, port 0x%016Lx, "
+				"unit 0x%016Lx)\n",
 				unit->port->handle,
-				unit->fcp_lun,
+				zfcp_get_busid_by_unit(unit),
 				unit->port->wwpn,
-				zfcp_get_busid_by_unit(unit));
+				unit->fcp_lun);
 		ZFCP_LOG_NORMAL("status qualifier:\n");
 		ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL,
 			      (char *) &header->fsf_status_qual,
@@ -3811,11 +3715,11 @@ zfcp_fsf_send_fcp_command_handler(struct
 		ZFCP_LOG_FLAGS(0, "FSF_SERVICE_CLASS_NOT_SUPPORTED\n");
 		if (fsf_req->adapter->fc_service_class <= 3) {
 			ZFCP_LOG_NORMAL("error: The adapter %s does "
-					"not support fibre-channel class %d.\n",
+					"not support fibrechannel class %d.\n",
 					zfcp_get_busid_by_unit(unit),
 					fsf_req->adapter->fc_service_class);
 		} else {
-			ZFCP_LOG_NORMAL("bug: The fibre channel class at the "
+			ZFCP_LOG_NORMAL("bug: The fibrechannel class at "
 					"adapter %s is invalid. "
 					"(debug info %d)\n",
 					zfcp_get_busid_by_unit(unit),
@@ -3834,10 +3738,9 @@ zfcp_fsf_send_fcp_command_handler(struct
 
 	case FSF_FCPLUN_NOT_VALID:
 		ZFCP_LOG_FLAGS(0, "FSF_FCPLUN_NOT_VALID\n");
-		ZFCP_LOG_NORMAL("bug: The FCP LUN 0x%Lx behind the remote port "
-				"of WWPN0x%Lx via the adapter %s does not have "
-				"the correct unit handle (temporary unit "
-				"identifier) 0x%x\n",
+		ZFCP_LOG_NORMAL("bug: unit 0x%016Lx on port 0x%016Lx on "
+				"adapter %s does not have correct unit "
+				"handle 0x%x\n",
 				unit->fcp_lun,
 				unit->port->wwpn,
 				zfcp_get_busid_by_unit(unit),
@@ -3858,34 +3761,31 @@ zfcp_fsf_send_fcp_command_handler(struct
 
 	case FSF_ACCESS_DENIED:
 		ZFCP_LOG_FLAGS(2, "FSF_ACCESS_DENIED\n");
-		ZFCP_LOG_NORMAL("Access denied, cannot send FCP "
-				"command to the unit with FCP-LUN 0x%Lx at the "
-				"remote port with WWPN 0x%Lx connected to the "
+		ZFCP_LOG_NORMAL("Access denied, cannot send FCP command to "
+				"unit 0x%016Lx on port 0x%016Lx on "
 				"adapter %s\n",	unit->fcp_lun, unit->port->wwpn,
-			zfcp_get_busid_by_unit(unit));
-		counter = 0;
-		do {
-			subtable = header->fsf_status_qual.halfword[counter++];
-			rule = header->fsf_status_qual.halfword[counter++];
+				zfcp_get_busid_by_unit(unit));
+		for (counter = 0; counter < 2; counter++) {
+			subtable = header->fsf_status_qual.halfword[counter * 2];
+			rule = header->fsf_status_qual.halfword[counter * 2 + 1];
 			switch (subtable) {
 			case FSF_SQ_CFDC_SUBTABLE_OS:
 			case FSF_SQ_CFDC_SUBTABLE_PORT_WWPN:
 			case FSF_SQ_CFDC_SUBTABLE_PORT_DID:
 			case FSF_SQ_CFDC_SUBTABLE_LUN:
-				ZFCP_LOG_NORMAL("Access denied (%s rule %d)\n",
+				ZFCP_LOG_INFO("Access denied (%s rule %d)\n",
 					zfcp_act_subtable_type[subtable], rule);
 				break;
 			}
-		} while (counter < 4);
+		}
 		debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_access");
 		fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
 		break;
 
 	case FSF_DIRECTION_INDICATOR_NOT_VALID:
 		ZFCP_LOG_FLAGS(0, "FSF_DIRECTION_INDICATOR_NOT_VALID\n");
-		ZFCP_LOG_INFO("bug: Invalid data direction given for the unit "
-			      "with FCP LUN 0x%Lx at the remote port with "
-			      "WWPN 0x%Lx via the adapter %s "
+		ZFCP_LOG_INFO("bug: Invalid data direction given for unit "
+			      "0x%016Lx on port 0x%016Lx on adapter %s "
 			      "(debug info %d)\n",
 			      unit->fcp_lun,
 			      unit->port->wwpn,
@@ -3906,9 +3806,8 @@ zfcp_fsf_send_fcp_command_handler(struct
 	case FSF_INBOUND_DATA_LENGTH_NOT_VALID:
 		ZFCP_LOG_FLAGS(0, "FSF_INBOUND_DATA_LENGTH_NOT_VALID\n");
 		ZFCP_LOG_NORMAL("bug: An invalid inbound data length field "
-				"was found in a command for the unit with "
-				"FCP LUN 0x%Lx of the remote port "
-				"with WWPN 0x%Lx via the adapter %s.\n",
+				"was found in a command for unit 0x%016Lx "
+				"on port 0x%016Lx on adapter %s.\n",
 				unit->fcp_lun,
 				unit->port->wwpn, zfcp_get_busid_by_unit(unit));
 		/* stop operation for this adapter */
@@ -3926,9 +3825,8 @@ zfcp_fsf_send_fcp_command_handler(struct
 	case FSF_OUTBOUND_DATA_LENGTH_NOT_VALID:
 		ZFCP_LOG_FLAGS(0, "FSF_OUTBOUND_DATA_LENGTH_NOT_VALID\n");
 		ZFCP_LOG_NORMAL("bug: An invalid outbound data length field "
-				"was found in a command for the unit with "
-				"FCP LUN 0x%Lx of the remote port "
-				"with WWPN 0x%Lx via the adapter %s\n.",
+				"was found in a command unit 0x%016Lx on port "
+				"0x%016Lx on adapter %s\n",
 				unit->fcp_lun,
 				unit->port->wwpn,
 				zfcp_get_busid_by_unit(unit));
@@ -3946,9 +3844,8 @@ zfcp_fsf_send_fcp_command_handler(struct
 		ZFCP_LOG_FLAGS(0, "FSF_CMND_LENGTH_NOT_VALID\n");
 		ZFCP_LOG_NORMAL
 		    ("bug: An invalid control-data-block length field "
-		     "was found in a command for the unit with "
-		     "FCP LUN 0x%Lx of the remote port "
-		     "with WWPN 0x%Lx via the adapter %s " "(debug info %d)\n",
+		     "was found in a command for unit 0x%016Lx on port "
+		     "0x%016Lx on adapter %s " "(debug info %d)\n",
 		     unit->fcp_lun, unit->port->wwpn,
 		     zfcp_get_busid_by_unit(unit),
 		     fsf_req->qtcb->bottom.io.fcp_cmnd_length);
@@ -3965,8 +3862,7 @@ zfcp_fsf_send_fcp_command_handler(struct
 
 	case FSF_PORT_BOXED:
 		ZFCP_LOG_FLAGS(2, "FSF_PORT_BOXED\n");
-		ZFCP_LOG_DEBUG("The remote port "
-			       "with WWPN 0x%Lx on the adapter %s "
+		ZFCP_LOG_DEBUG("The remote port 0x%016Lx on adapter %s "
 			       "needs to be reopened\n",
 			       unit->port->wwpn, zfcp_get_busid_by_unit(unit));
 		debug_text_event(fsf_req->adapter->erp_dbf, 2, "fsf_s_pboxed");
@@ -3981,9 +3877,8 @@ zfcp_fsf_send_fcp_command_handler(struct
 	case FSF_LUN_BOXED:
 		ZFCP_LOG_FLAGS(0, "FSF_LUN_BOXED\n");
 		ZFCP_LOG_NORMAL(
-			"The remote unit with FCP-LUN 0x%Lx "
-			"at the remote port with WWPN 0x%Lx "
-			"connected to the adapter %s needs to be reopened\n",
+			"unit 0x%016Lx on port 0x%016Lx on adapter %s needs "
+			"to be reopened\n",
 			unit->fcp_lun, unit->port->wwpn,
 			zfcp_get_busid_by_unit(unit));
 		debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_lboxed");
@@ -4090,9 +3985,8 @@ zfcp_fsf_send_fcp_command_task_handler(s
 	scpnt = fsf_req->data.send_fcp_command_task.scsi_cmnd;
 	if (unlikely(!scpnt)) {
 		ZFCP_LOG_DEBUG
-		    ("Command with fsf_req 0x%lx is not associated to "
-		     "a scsi command anymore. Aborted?\n",
-		     (unsigned long) fsf_req);
+		    ("Command with fsf_req %p is not associated to "
+		     "a scsi command anymore. Aborted?\n", fsf_req);
 		goto out;
 	}
 	if (unlikely(fsf_req->status & ZFCP_STATUS_FSFREQ_ABORTED)) {
@@ -4150,12 +4044,10 @@ zfcp_fsf_send_fcp_command_task_handler(s
 			ZFCP_LOG_FLAGS(0, "RSP_CODE_LENGTH_MISMATCH\n");
 			/* hardware bug */
 			ZFCP_LOG_NORMAL("bug: FCP response code indictates "
-					" that the fibre-channel protocol data "
+					"that the fibrechannel protocol data "
 					"length differs from the burst length. "
-					"The problem occured on the unit "
-					"with FCP LUN 0x%Lx connected to the "
-					"port with WWPN 0x%Lx at the "
-					"adapter %s",
+					"The problem occured on unit 0x%016Lx "
+					"on port 0x%016Lx on adapter %s",
 					unit->fcp_lun,
 					unit->port->wwpn,
 					zfcp_get_busid_by_unit(unit));
@@ -4170,11 +4062,10 @@ zfcp_fsf_send_fcp_command_task_handler(s
 			ZFCP_LOG_FLAGS(0, "RSP_CODE_FIELD_INVALID\n");
 			/* driver or hardware bug */
 			ZFCP_LOG_NORMAL("bug: FCP response code indictates "
-					"that the fibre-channel protocol data "
-					"fields were incorrectly set-up. "
+					"that the fibrechannel protocol data "
+					"fields were incorrectly set up. "
 					"The problem occured on the unit "
-					"with FCP LUN 0x%Lx connected to the "
-					"port with WWPN 0x%Lx at the "
+					"0x%016Lx on port 0x%016Lx on "
 					"adapter %s",
 					unit->fcp_lun,
 					unit->port->wwpn,
@@ -4191,12 +4082,10 @@ zfcp_fsf_send_fcp_command_task_handler(s
 			/* hardware bug */
 			ZFCP_LOG_NORMAL("bug: The FCP response code indicates "
 					"that conflicting  values for the "
-					"fibre-channel payload offset from the "
+					"fibrechannel payload offset from the "
 					"header were found. "
-					"The problem occured on the unit "
-					"with FCP LUN 0x%Lx connected to the "
-					"port with WWPN 0x%Lx at the "
-					"adapter %s.\n",
+					"The problem occured on unit 0x%016Lx "
+					"on port 0x%016Lx on adapter %s.\n",
 					unit->fcp_lun,
 					unit->port->wwpn,
 					zfcp_get_busid_by_unit(unit));
@@ -4211,10 +4100,8 @@ zfcp_fsf_send_fcp_command_task_handler(s
 			ZFCP_LOG_NORMAL("bug: An invalid FCP response "
 					"code was detected for a command. "
 					"The problem occured on the unit "
-					"with FCP LUN 0x%Lx connected to the "
-					"port with WWPN 0x%Lx at the "
-					"adapter %s "
-					"(debug info 0x%x)\n",
+					"0x%016Lx on port 0x%016Lx on "
+					"adapter %s (debug info 0x%x)\n",
 					unit->fcp_lun,
 					unit->port->wwpn,
 					zfcp_get_busid_by_unit(unit),
@@ -4254,9 +4141,7 @@ zfcp_fsf_send_fcp_command_task_handler(s
 	/* check for overrun */
 	if (unlikely(fcp_rsp_iu->validity.bits.fcp_resid_over)) {
 		ZFCP_LOG_INFO("A data overrun was detected for a command. "
-			      "This happened for a command to the unit "
-			      "with FCP LUN 0x%Lx connected to the "
-			      "port with WWPN 0x%Lx at the adapter %s. "
+			      "unit 0x%016Lx, port 0x%016Lx, adapter %s. "
 			      "The response data length is "
 			      "%d, the original length was %d.\n",
 			      unit->fcp_lun,
@@ -4269,9 +4154,7 @@ zfcp_fsf_send_fcp_command_task_handler(s
 	/* check for underrun */
 	if (unlikely(fcp_rsp_iu->validity.bits.fcp_resid_under)) {
 		ZFCP_LOG_DEBUG("A data underrun was detected for a command. "
-			       "This happened for a command to the unit "
-			       "with FCP LUN 0x%Lx connected to the "
-			       "port with WWPN 0x%Lx at the adapter %s. "
+			       "unit 0x%016Lx, port 0x%016Lx, adapter %s. "
 			       "The response data length is "
 			       "%d, the original length was %d.\n",
 			       unit->fcp_lun,
@@ -4384,7 +4267,6 @@ zfcp_fsf_send_fcp_command_task_handler(s
 	 * the new eh
 	 */
 	/* always call back */
-#ifdef ZFCP_DEBUG_REQUESTS
 	debug_text_event(fsf_req->adapter->req_dbf, 2, "ok_done:");
 	debug_event(fsf_req->adapter->req_dbf, 2, &scpnt,
 		    sizeof (unsigned long));
@@ -4392,7 +4274,6 @@ zfcp_fsf_send_fcp_command_task_handler(s
 		    sizeof (unsigned long));
 	debug_event(fsf_req->adapter->req_dbf, 2, &fsf_req,
 		    sizeof (unsigned long));
-#endif /* ZFCP_DEBUG_REQUESTS */
 	(scpnt->scsi_done) (scpnt);
 	/*
 	 * We must hold this lock until scsi_done has been called.
@@ -4440,9 +4321,7 @@ zfcp_fsf_send_fcp_command_task_managemen
 		ZFCP_LOG_FLAGS(0, "RSP_CODE_TASKMAN_UNSUPP\n");
 		ZFCP_LOG_NORMAL("bug: A reuested task management function "
 				"is not supported on the target device "
-				"The corresponding device is the unit with "
-				"FCP LUN 0x%Lx at the port "
-				"with WWPN 0x%Lx at the adapter %s\n ",
+				"unit 0x%016Lx, port 0x%016Lx, adapter %s\n ",
 				unit->fcp_lun,
 				unit->port->wwpn,
 				zfcp_get_busid_by_unit(unit));
@@ -4452,9 +4331,7 @@ zfcp_fsf_send_fcp_command_task_managemen
 		ZFCP_LOG_FLAGS(0, "RSP_CODE_TASKMAN_FAILED\n");
 		ZFCP_LOG_NORMAL("bug: A reuested task management function "
 				"failed to complete successfully. "
-				"The corresponding device is the unit with "
-				"FCP LUN 0x%Lx at the port "
-				"with WWPN 0x%Lx at the adapter %s.\n",
+				"unit 0x%016Lx, port 0x%016Lx, adapter %s.\n",
 				unit->fcp_lun,
 				unit->port->wwpn,
 				zfcp_get_busid_by_unit(unit));
@@ -4463,9 +4340,7 @@ zfcp_fsf_send_fcp_command_task_managemen
 	default:
 		ZFCP_LOG_NORMAL("bug: An invalid FCP response "
 				"code was detected for a command. "
-				"The problem occured on the unit "
-				"with FCP LUN 0x%Lx connected to the "
-				"port with WWPN 0x%Lx at the adapter %s "
+				"unit 0x%016Lx, port 0x%016Lx, adapter %s "
 				"(debug info 0x%x)\n",
 				unit->fcp_lun,
 				unit->port->wwpn,
@@ -4505,15 +4380,13 @@ zfcp_fsf_control_file(struct zfcp_adapte
 	int direction;
 	int retval = 0;
 
-#if 0
-	if (!(adapter->features & FSF_FEATURE_CFDC)) {
+	if (!(adapter->supported_features & FSF_FEATURE_CFDC)) {
 		ZFCP_LOG_INFO(
 			"Adapter %s does not support control file\n",
 			zfcp_get_busid_by_adapter(adapter));
 		retval = -EOPNOTSUPP;
-		goto no_act_support;
+		goto no_cfdc_support;
 	}
-#endif
 
 	switch (fsf_command) {
 
@@ -4595,6 +4468,7 @@ out:
 	write_unlock_irqrestore(&adapter->request_queue.queue_lock, lock_flags);
 
 invalid_command:
+no_cfdc_support:
 	return retval;
 }
 
@@ -4809,8 +4683,8 @@ zfcp_fsf_req_wait_and_cleanup(struct zfc
 					   signal);
 		if (signal) {
 			ZFCP_LOG_DEBUG("Caught signal %i while waiting for the "
-				       "completion of the request at 0x%lx\n",
-				       signal, (unsigned long) fsf_req);
+				       "completion of the request at %p\n",
+				       signal, fsf_req);
 			retval = signal;
 			goto out;
 		}
@@ -4932,11 +4806,6 @@ zfcp_fsf_req_create(struct zfcp_adapter 
                 goto failed_sbals;
 	}
 
-
-	/* set magics */
-	fsf_req->common_magic = ZFCP_MAGIC;
-	fsf_req->specific_magic = ZFCP_MAGIC_FSFREQ;
-
 	fsf_req->adapter = adapter;	/* pointer to "parent" adapter */
 	fsf_req->fsf_command = fsf_cmd;
 	fsf_req->sbal_number = 1;
@@ -5012,10 +4881,10 @@ zfcp_fsf_req_send(struct zfcp_fsf_req *f
 	if (likely(fsf_req->qtcb)) {
 		fsf_req->qtcb->prefix.req_seq_no = adapter->fsf_req_seq_no;
 		fsf_req->seq_no = adapter->fsf_req_seq_no;
-		ZFCP_LOG_TRACE("FSF request 0x%lx of adapter 0x%lx gets "
+		ZFCP_LOG_TRACE("FSF request %p of adapter %s gets "
 			       "FSF sequence counter value of %i\n",
-			       (unsigned long) fsf_req,
-			       (unsigned long) adapter,
+			       fsf_req,
+			       zfcp_get_busid_by_adapter(adapter),
 			       fsf_req->qtcb->prefix.req_seq_no);
 	} else
 		inc_seq_no = 0;
@@ -5031,18 +4900,18 @@ zfcp_fsf_req_send(struct zfcp_fsf_req *f
 		add_timer(timer);
 	}
 
-	ZFCP_LOG_TRACE("request queue of adapter with busid=%s: "
+	ZFCP_LOG_TRACE("request queue of adapter %s: "
 		       "next free SBAL is %i, %i free SBALs\n",
 		       zfcp_get_busid_by_adapter(adapter),
 		       req_queue->free_index,
 		       atomic_read(&req_queue->free_count));
 
-	ZFCP_LOG_DEBUG("Calling do QDIO busid=%s, flags=0x%x, queue_no=%i, "
-		       "index_in_queue=%i, count=%i, buffers=0x%lx\n",
+	ZFCP_LOG_DEBUG("calling do_QDIO adapter %s, flags=0x%x, queue_no=%i, "
+		       "index_in_queue=%i, count=%i, buffers=%p\n",
 		       zfcp_get_busid_by_adapter(adapter),
 		       QDIO_FLAG_SYNC_OUTPUT,
 		       0, fsf_req->sbal_first, fsf_req->sbal_number,
-		       (unsigned long) &req_queue->buffer[fsf_req->sbal_first]);
+		       &req_queue->buffer[fsf_req->sbal_first]);
 
 	/*
 	 * adjust the number of free SBALs in request queue as well as
@@ -5085,7 +4954,6 @@ zfcp_fsf_req_send(struct zfcp_fsf_req *f
 			 "to request queue.\n");
 	} else {
 		req_queue->distance_from_int = new_distance_from_int;
-#ifdef ZFCP_DEBUG_REQUESTS
 		debug_text_event(adapter->req_dbf, 1, "o:a/seq");
 		debug_event(adapter->req_dbf, 1, &fsf_req,
 			    sizeof (unsigned long));
@@ -5095,7 +4963,6 @@ zfcp_fsf_req_send(struct zfcp_fsf_req *f
 		} else {
 			debug_text_event(adapter->req_dbf, 1, "nocb");
 		}
-#endif				/* ZFCP_DEBUG_REQUESTS */
 		/*
 		 * increase FSF sequence counter -
 		 * this must only be done for request successfully enqueued to
@@ -5107,8 +4974,9 @@ zfcp_fsf_req_send(struct zfcp_fsf_req *f
 		if (likely(inc_seq_no)) {
 			adapter->fsf_req_seq_no++;
 			ZFCP_LOG_TRACE
-			    ("FSF sequence counter value of adapter 0x%lx "
-			     "increased to %i\n", (unsigned long) adapter,
+			    ("FSF sequence counter value of adapter %s "
+			     "increased to %i\n",
+			     zfcp_get_busid_by_adapter(adapter),
 			     adapter->fsf_req_seq_no);
 		}
 		/* count FSF requests pending */
--- diff/drivers/s390/scsi/zfcp_fsf.h	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/s390/scsi/zfcp_fsf.h	2004-04-21 10:45:34.698428536 +0100
@@ -108,6 +108,7 @@
 #define FSF_CONFLICTS_OVERRULED			0x00000058
 #define FSF_PORT_BOXED				0x00000059
 #define FSF_LUN_BOXED				0x0000005A
+#define FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE	0x0000005B
 #define FSF_PAYLOAD_SIZE_MISMATCH		0x00000060
 #define FSF_REQUEST_SIZE_TOO_LARGE		0x00000061
 #define FSF_RESPONSE_SIZE_TOO_LARGE		0x00000062
@@ -156,7 +157,6 @@
 #define FSF_STATUS_READ_BIT_ERROR_THRESHOLD	0x00000004
 #define FSF_STATUS_READ_LINK_DOWN		0x00000005 /* FIXME: really? */
 #define FSF_STATUS_READ_LINK_UP          	0x00000006
-#define FSF_STATUS_READ_NOTIFICATION_LOST	0x00000009
 #define FSF_STATUS_READ_CFDC_UPDATED		0x0000000A
 #define FSF_STATUS_READ_CFDC_HARDENED		0x0000000B
 
@@ -165,8 +165,6 @@
 #define FSF_STATUS_READ_SUB_ERROR_PORT		0x00000002
 
 /* status subtypes for CFDC */
-#define FSF_STATUS_READ_SUB_LOST_CFDC_UPDATED	0x00000020
-#define FSF_STATUS_READ_SUB_LOST_CFDC_HARDENED	0x00000040
 #define FSF_STATUS_READ_SUB_CFDC_HARDENED_ON_SE	0x00000002
 #define FSF_STATUS_READ_SUB_CFDC_HARDENED_ON_SE2 0x0000000F
 
@@ -198,8 +196,6 @@
 /* channel features */
 #define FSF_FEATURE_QTCB_SUPPRESSION            0x00000001
 #define FSF_FEATURE_CFDC			0x00000002
-#define FSF_FEATURE_SENSEDATA_REPLICATION       0x00000004
-#define FSF_FEATURE_LOST_SAN_NOTIFICATION       0x00000008
 #define FSF_FEATURE_HBAAPI_MANAGEMENT           0x00000010
 #define FSF_FEATURE_ELS_CT_CHAINED_SBALS        0x00000020
 
@@ -325,18 +321,7 @@ union fsf_status_qual {
 	u8  byte[FSF_STATUS_QUALIFIER_SIZE];
 	u16 halfword[FSF_STATUS_QUALIFIER_SIZE / sizeof (u16)];
 	u32 word[FSF_STATUS_QUALIFIER_SIZE / sizeof (u32)];
-	struct {
-		u32 this_cmd;
-		u32 aborted_cmd;
-	} port_handle;
-	struct {
-		u32 this_cmd;
-		u32 aborted_cmd;
-	} lun_handle;
-	struct {
-		u64 found;
-		u64 expected;
-	} fcp_lun;
+	struct fsf_queue_designator fsf_queue_designator;
 } __attribute__ ((packed));
 
 struct fsf_qtcb_header {
@@ -394,9 +379,9 @@ struct fsf_qtcb_bottom_support {
 	u64 res2;
 	u64 req_handle;
 	u32 service_class;
-	u8 res3[3];
+	u8  res3[3];
 	u8  timeout;
-	u8 res4[184];
+	u8  res4[184];
 	u32 els1_length;
 	u32 els2_length;
 	u32 req_buf_length;
--- diff/drivers/s390/scsi/zfcp_qdio.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/s390/scsi/zfcp_qdio.c	2004-04-21 10:45:34.700428232 +0100
@@ -28,7 +28,7 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#define ZFCP_QDIO_C_REVISION "$Revision: 1.13 $"
+#define ZFCP_QDIO_C_REVISION "$Revision: 1.16 $"
 
 #include "zfcp_ext.h"
 
@@ -76,16 +76,15 @@ zfcp_qdio_buffers_enqueue(struct qdio_bu
 	struct qdio_buffer *first_in_page = NULL;
 
 	qdio_buffers_per_page = PAGE_SIZE / sizeof (struct qdio_buffer);
-	ZFCP_LOG_TRACE("Buffers per page %d.\n", qdio_buffers_per_page);
+	ZFCP_LOG_TRACE("buffers_per_page=%d\n", qdio_buffers_per_page);
 
 	for (buf_pos = 0; buf_pos < count; buf_pos++) {
 		if (page_pos == 0) {
 			cur_buf[buf_pos] = (struct qdio_buffer *)
 			    get_zeroed_page(GFP_KERNEL);
 			if (cur_buf[buf_pos] == NULL) {
-				ZFCP_LOG_INFO("error: Could not allocate "
-					      "memory for qdio transfer "
-					      "structures.\n");
+				ZFCP_LOG_INFO("error: allocation of "
+					      "QDIO buffer failed \n");
 				goto out;
 			}
 			first_in_page = cur_buf[buf_pos];
@@ -115,7 +114,7 @@ zfcp_qdio_buffers_dequeue(struct qdio_bu
 	int qdio_buffers_per_page;
 
 	qdio_buffers_per_page = PAGE_SIZE / sizeof (struct qdio_buffer);
-	ZFCP_LOG_TRACE("Buffers per page %d.\n", qdio_buffers_per_page);
+	ZFCP_LOG_TRACE("buffers_per_page=%d\n", qdio_buffers_per_page);
 
 	for (buf_pos = 0; buf_pos < count; buf_pos += qdio_buffers_per_page)
 		free_page((unsigned long) cur_buf[buf_pos]);
@@ -133,9 +132,8 @@ zfcp_qdio_allocate_queues(struct zfcp_ad
 	    zfcp_qdio_buffers_enqueue(&(adapter->request_queue.buffer[0]),
 				      QDIO_MAX_BUFFERS_PER_Q);
 	if (buffer_count < QDIO_MAX_BUFFERS_PER_Q) {
-		ZFCP_LOG_DEBUG("error: Out of memory allocating "
-			       "request queue, only %d buffers got. "
-			       "Binning them.\n", buffer_count);
+		ZFCP_LOG_DEBUG("only %d QDIO buffers allocated for request "
+			       "queue\n", buffer_count);
 		zfcp_qdio_buffers_dequeue(&(adapter->request_queue.buffer[0]),
 					  buffer_count);
 		retval = -ENOMEM;
@@ -146,12 +144,11 @@ zfcp_qdio_allocate_queues(struct zfcp_ad
 	    zfcp_qdio_buffers_enqueue(&(adapter->response_queue.buffer[0]),
 				      QDIO_MAX_BUFFERS_PER_Q);
 	if (buffer_count < QDIO_MAX_BUFFERS_PER_Q) {
-		ZFCP_LOG_DEBUG("error: Out of memory allocating "
-			       "response queue, only %d buffers got. "
-			       "Binning them.\n", buffer_count);
+		ZFCP_LOG_DEBUG("only %d QDIO buffers allocated for response "
+			       "queue", buffer_count);
 		zfcp_qdio_buffers_dequeue(&(adapter->response_queue.buffer[0]),
 					  buffer_count);
-		ZFCP_LOG_TRACE("Deallocating request_queue Buffers.\n");
+		ZFCP_LOG_TRACE("freeing request_queue buffers\n");
 		zfcp_qdio_buffers_dequeue(&(adapter->request_queue.buffer[0]),
 					  QDIO_MAX_BUFFERS_PER_Q);
 		retval = -ENOMEM;
@@ -165,11 +162,11 @@ zfcp_qdio_allocate_queues(struct zfcp_ad
 void
 zfcp_qdio_free_queues(struct zfcp_adapter *adapter)
 {
-	ZFCP_LOG_TRACE("Deallocating request_queue Buffers.\n");
+	ZFCP_LOG_TRACE("freeing request_queue buffers\n");
 	zfcp_qdio_buffers_dequeue(&(adapter->request_queue.buffer[0]),
 				  QDIO_MAX_BUFFERS_PER_Q);
 
-	ZFCP_LOG_TRACE("Deallocating response_queue Buffers.\n");
+	ZFCP_LOG_TRACE("freeing response_queue buffers\n");
 	zfcp_qdio_buffers_dequeue(&(adapter->response_queue.buffer[0]),
 				  QDIO_MAX_BUFFERS_PER_Q);
 }
@@ -237,8 +234,8 @@ zfcp_qdio_handler_error_check(struct zfc
 
 		ZFCP_LOG_FLAGS(1, "QDIO_STATUS_LOOK_FOR_ERROR \n");
 
-		ZFCP_LOG_INFO("A qdio problem occured. The status, qdio_error "
-			      "and siga_error are 0x%x, 0x%x and 0x%x\n",
+		ZFCP_LOG_INFO("QDIO problem occurred (status=0x%x, "
+			      "qdio_error=0x%x, siga_error=0x%x)\n",
 			      status, qdio_error, siga_error);
 
 		if (status & QDIO_STATUS_ACTIVATE_CHECK_CONDITION) {
@@ -273,8 +270,8 @@ zfcp_qdio_handler_error_check(struct zfc
 			ZFCP_LOG_FLAGS(1, "SLSB_P_OUTPUT_ERROR\n");
 			break;
 		default:
-			ZFCP_LOG_NORMAL("bug: Unknown qdio error reported "
-					"(debug info 0x%x)\n", qdio_error);
+			ZFCP_LOG_NORMAL("bug: unknown QDIO error 0x%x\n",
+					qdio_error);
 			break;
 		}
 		/* Restarting IO on the failed adapter from scratch */
@@ -317,7 +314,7 @@ zfcp_qdio_request_handler(struct ccw_dev
 	adapter = (struct zfcp_adapter *) int_parm;
 	queue = &adapter->request_queue;
 
-	ZFCP_LOG_DEBUG("busid=%s, first=%d, count=%d\n",
+	ZFCP_LOG_DEBUG("adapter %s, first=%d, elements_processed=%d\n",
 		       zfcp_get_busid_by_adapter(adapter),
 		       first_element, elements_processed);
 
@@ -336,7 +333,7 @@ zfcp_qdio_request_handler(struct ccw_dev
 	atomic_add(elements_processed, &queue->free_count);
 	ZFCP_LOG_DEBUG("free_count=%d\n", atomic_read(&queue->free_count));
 	wake_up(&adapter->request_wq);
-	ZFCP_LOG_DEBUG("Elements_processed = %d, free count=%d\n",
+	ZFCP_LOG_DEBUG("elements_processed=%d, free count=%d\n",
 		       elements_processed, atomic_read(&queue->free_count));
  out:
 	return;
@@ -383,7 +380,7 @@ zfcp_qdio_response_handler(struct ccw_de
 	 */
 
 	buffere = &(queue->buffer[first_element]->element[0]);
-	ZFCP_LOG_DEBUG("first BUFFERE flags=0x%x \n", buffere->flags);
+	ZFCP_LOG_DEBUG("first BUFFERE flags=0x%x\n", buffere->flags);
 	/*
 	 * go through all SBALs from input queue currently
 	 * returned by QDIO layer
@@ -406,19 +403,20 @@ zfcp_qdio_response_handler(struct ccw_de
 						       (void *) buffere->addr);
 
 			if (retval) {
-				ZFCP_LOG_NORMAL
-				    ("bug: Inbound packet seems not to "
-				     "have been sent at all. It will be "
-				     "ignored. (debug info 0x%lx, 0x%lx, "
-				     "%d, %d, %s)\n",
-				     (unsigned long) buffere->addr,
-				     (unsigned long) &(buffere->addr),
-				     first_element, elements_processed,
-				     zfcp_get_busid_by_adapter(adapter));
-				ZFCP_LOG_NORMAL("Dump of inbound BUFFER %d "
-						"BUFFERE %d at address 0x%lx\n",
-						buffer_index, buffere_index,
-						(unsigned long) buffer);
+				ZFCP_LOG_NORMAL("bug: unexpected inbound "
+						"packet on adapter %s "
+						"(reqid=0x%lx, "
+						"first_element=%d, "
+						"elements_processed=%d)\n",
+						zfcp_get_busid_by_adapter(adapter),
+						(unsigned long) buffere->addr,
+						first_element,
+						elements_processed);
+				ZFCP_LOG_NORMAL("hex dump of inbound buffer "
+						"at address %p "
+						"(buffer_index=%d, "
+						"buffere_index=%d)\n", buffer,
+						buffer_index, buffere_index);
 				ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL,
 					      (char *) buffer, SBAL_SIZE);
 			}
@@ -445,8 +443,9 @@ zfcp_qdio_response_handler(struct ccw_de
 	count = atomic_read(&queue->free_count) + elements_processed;
 	start = queue->free_index;
 
-	ZFCP_LOG_TRACE("Calling do QDIO busid=%s, flags=0x%x, queue_no=%i, "
-		       "index_in_queue=%i, count=%i, buffers=0x%lx\n",
+	ZFCP_LOG_TRACE("calling do_QDIO on adapter %s (flags=0x%x, "
+		       "queue_no=%i, index_in_queue=%i, count=%i, "
+		       "buffers=0x%lx\n",
 		       zfcp_get_busid_by_adapter(adapter),
 		       QDIO_FLAG_SYNC_INPUT | QDIO_FLAG_UNDER_INTERRUPT,
 		       0, start, count, (unsigned long) &queue->buffer[start]);
@@ -457,15 +456,16 @@ zfcp_qdio_response_handler(struct ccw_de
 
 	if (unlikely(retval)) {
 		atomic_set(&queue->free_count, count);
-		ZFCP_LOG_DEBUG("Inbound data regions could not be cleared "
-			       "Transfer queues may be down. "
-			       "(info %d, %d, %d)\n", count, start, retval);
+		ZFCP_LOG_DEBUG("clearing of inbound data regions failed, "
+			       "queues may be down "
+			       "(count=%d, start=%d, retval=%d)\n",
+			       count, start, retval);
 	} else {
 		queue->free_index += count;
 		queue->free_index %= QDIO_MAX_BUFFERS_PER_Q;
 		atomic_set(&queue->free_count, 0);
-		ZFCP_LOG_TRACE("%i buffers successfully enqueued to response "
-			       "queue starting at position %i\n", count, start);
+		ZFCP_LOG_TRACE("%i buffers enqueued to response "
+			       "queue at position %i\n", count, start);
 	}
  out:
 	return;
@@ -485,16 +485,13 @@ zfcp_qdio_reqid_check(struct zfcp_adapte
 	struct zfcp_fsf_req *fsf_req;
 	int retval = 0;
 
-#ifdef ZFCP_DEBUG_REQUESTS
 	/* Note: seq is entered later */
 	debug_text_event(adapter->req_dbf, 1, "i:a/seq");
 	debug_event(adapter->req_dbf, 1, &sbale_addr, sizeof (unsigned long));
-#endif				/* ZFCP_DEBUG_REQUESTS */
 
 	/* invalid (per convention used in this driver) */
 	if (unlikely(!sbale_addr)) {
-		ZFCP_LOG_NORMAL
-		    ("bug: Inbound data faulty, contains null-pointer!\n");
+		ZFCP_LOG_NORMAL("bug: invalid reqid\n");
 		retval = -EINVAL;
 		goto out;
 	}
@@ -502,38 +499,22 @@ zfcp_qdio_reqid_check(struct zfcp_adapte
 	/* valid request id and thus (hopefully :) valid fsf_req address */
 	fsf_req = (struct zfcp_fsf_req *) sbale_addr;
 
-	if (unlikely((fsf_req->common_magic != ZFCP_MAGIC) ||
-	             (fsf_req->specific_magic != ZFCP_MAGIC_FSFREQ))) {
-		ZFCP_LOG_NORMAL("bug: An inbound FSF acknowledgement was "
-				"faulty (debug info 0x%x, 0x%x, 0x%lx)\n",
-				fsf_req->common_magic,
-				fsf_req->specific_magic,
-				(unsigned long) fsf_req);
-		retval = -EINVAL;
-		goto out;
-	}
-
 	if (unlikely(adapter != fsf_req->adapter)) {
-		ZFCP_LOG_NORMAL("bug: An inbound FSF acknowledgement was not "
-				"correct (debug info 0x%lx, 0x%lx, 0%lx) \n",
-				(unsigned long) fsf_req,
-				(unsigned long) fsf_req->adapter,
-				(unsigned long) adapter);
+		ZFCP_LOG_NORMAL("bug: invalid reqid (fsf_req=%p, "
+				"fsf_req->adapter=%p, adapter=%p)\n",
+				fsf_req, fsf_req->adapter, adapter);
 		retval = -EINVAL;
 		goto out;
 	}
-#ifdef ZFCP_DEBUG_REQUESTS
 	/* debug feature stuff (test for QTCB: remember new unsol. status!) */
 	if (likely(fsf_req->qtcb)) {
 		debug_event(adapter->req_dbf, 1,
 			    &fsf_req->qtcb->prefix.req_seq_no, sizeof (u32));
 	}
-#endif				/* ZFCP_DEBUG_REQUESTS */
 
-	ZFCP_LOG_TRACE("fsf_req at 0x%lx, QTCB at 0x%lx\n",
-		       (unsigned long) fsf_req, (unsigned long) fsf_req->qtcb);
+	ZFCP_LOG_TRACE("fsf_req at %p, QTCB at %p\n", fsf_req, fsf_req->qtcb);
 	if (likely(fsf_req->qtcb)) {
-		ZFCP_LOG_TRACE("HEX DUMP OF 1ST BUFFERE PAYLOAD (QTCB):\n");
+		ZFCP_LOG_TRACE("hex dump of QTCB:\n");
 		ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_TRACE, (char *) fsf_req->qtcb,
 			      sizeof(struct fsf_qtcb));
 	}
@@ -904,8 +885,8 @@ zfcp_qdio_zero_sbals(struct qdio_buffer 
 	for (cur_pos = first; cur_pos < (first + clean_count); cur_pos++) {
 		index = cur_pos % QDIO_MAX_BUFFERS_PER_Q;
 		memset(buf[index], 0, sizeof (struct qdio_buffer));
-		ZFCP_LOG_TRACE("zeroing BUFFER %d at address 0x%lx\n",
-			       index, (unsigned long) buf[index]);
+		ZFCP_LOG_TRACE("zeroing BUFFER %d at address %p\n",
+			       index, buf[index]);
 	}
 }
 
--- diff/drivers/s390/scsi/zfcp_scsi.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/s390/scsi/zfcp_scsi.c	2004-04-21 10:45:34.702427928 +0100
@@ -31,7 +31,7 @@
 #define ZFCP_LOG_AREA			ZFCP_LOG_AREA_SCSI
 
 /* this drivers version (do not edit !!! generated and updated by cvs) */
-#define ZFCP_SCSI_REVISION "$Revision: 1.52 $"
+#define ZFCP_SCSI_REVISION "$Revision: 1.59 $"
 
 #include <linux/blkdev.h>
 
@@ -48,14 +48,15 @@ static int zfcp_scsi_eh_bus_reset_handle
 static int zfcp_scsi_eh_host_reset_handler(struct scsi_cmnd *);
 static int zfcp_task_management_function(struct zfcp_unit *, u8);
 
-static struct zfcp_unit *zfcp_unit_lookup(struct zfcp_adapter *, int, int, int);
+static struct zfcp_unit *zfcp_unit_lookup(struct zfcp_adapter *, int, scsi_id_t,
+					  scsi_lun_t);
 
 static struct device_attribute *zfcp_sysfs_sdev_attrs[];
 
 struct zfcp_data zfcp_data = {
 	.scsi_host_template = {
 	      name:	               ZFCP_NAME,
-	      proc_name:               "dummy",
+	      proc_name:               "zfcp",
 	      proc_info:               NULL,
 	      detect:	               NULL,
 	      slave_alloc:             zfcp_scsi_slave_alloc,
@@ -211,8 +212,8 @@ zfcp_scsi_slave_destroy(struct scsi_devi
 		unit->device = NULL;
 		zfcp_unit_put(unit);
 	} else {
-		ZFCP_LOG_INFO("no unit associated with SCSI device at "
-			      "address 0x%lx\n", (unsigned long) sdpnt);
+		ZFCP_LOG_NORMAL("bug: no unit associated with SCSI device at "
+				"address %p\n", sdpnt);
 	}
 }
 
@@ -272,11 +273,9 @@ zfcp_scsi_command_async(struct zfcp_adap
 	if (unlikely(
 	      atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &unit->status) ||
 	     !atomic_test_mask(ZFCP_STATUS_COMMON_RUNNING, &unit->status))) {
-		ZFCP_LOG_DEBUG("Stopping SCSI IO on the unit with "
-			       "FCP LUN 0x%Lx connected to the port "
-			       "with WWPN 0x%Lx at the adapter %s.\n",
-			       unit->fcp_lun,
-			       unit->port->wwpn,
+		ZFCP_LOG_DEBUG("stopping SCSI I/O on unit 0x%016Lx on port "
+			       "0x%016Lx on adapter %s\n",
+			       unit->fcp_lun, unit->port->wwpn,
 			       zfcp_get_busid_by_adapter(adapter));
 		zfcp_scsi_command_fail(scpnt, DID_ERROR);
 		goto out;
@@ -284,8 +283,8 @@ zfcp_scsi_command_async(struct zfcp_adap
 
 	if (unlikely(
 	     !atomic_test_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &unit->status))) {
-		ZFCP_LOG_DEBUG("adapter %s not ready or unit with LUN 0x%Lx "
-			       "on the port with WWPN 0x%Lx in recovery.\n",
+		ZFCP_LOG_DEBUG("adapter %s not ready or unit 0x%016Lx "
+			       "on port 0x%016Lx in recovery\n",
 			       zfcp_get_busid_by_unit(unit),
 			       unit->fcp_lun, unit->port->wwpn);
 		retval = SCSI_MLQUEUE_DEVICE_BUSY;
@@ -296,15 +295,12 @@ zfcp_scsi_command_async(struct zfcp_adap
 					     ZFCP_REQ_AUTO_CLEANUP);
 
 	if (unlikely(tmp < 0)) {
-		ZFCP_LOG_DEBUG("error: Could not send a Send FCP Command\n");
+		ZFCP_LOG_DEBUG("error: initiation of Send FCP Cmnd failed\n");
 		retval = SCSI_MLQUEUE_HOST_BUSY;
 	} else {
-
-#ifdef ZFCP_DEBUG_REQUESTS
 		debug_text_event(adapter->req_dbf, 3, "q_scpnt");
 		debug_event(adapter->req_dbf, 3, &scpnt,
 			    sizeof (unsigned long));
-#endif				/* ZFCP_DEBUG_REQUESTS */
 	}
 
 out:
@@ -376,7 +372,8 @@ zfcp_scsi_queuecommand(struct scsi_cmnd 
  * context:	
  */
 static struct zfcp_unit *
-zfcp_unit_lookup(struct zfcp_adapter *adapter, int channel, int id, int lun)
+zfcp_unit_lookup(struct zfcp_adapter *adapter, int channel, scsi_id_t id,
+		 scsi_lun_t lun)
 {
 	struct zfcp_port *port;
 	struct zfcp_unit *unit, *retval = NULL;
@@ -426,8 +423,6 @@ zfcp_scsi_eh_abort_handler(struct scsi_c
 	unsigned long flags;
 	u32 status = 0;
 
-
-#ifdef ZFCP_DEBUG_ABORTS
 	/* the components of a abort_dbf record (fixed size record) */
 	u64 dbf_scsi_cmnd = (unsigned long) scpnt;
 	char dbf_opcode[ZFCP_ABORT_DBF_LENGTH];
@@ -445,13 +440,9 @@ zfcp_scsi_eh_abort_handler(struct scsi_c
 	memcpy(dbf_opcode,
 	       scpnt->cmnd,
 	       min(scpnt->cmd_len, (unsigned char) ZFCP_ABORT_DBF_LENGTH));
-#endif
 
-	 /*TRACE*/
-	    ZFCP_LOG_INFO
-	    ("Aborting for adapter=0x%lx, busid=%s, scsi_cmnd=0x%lx\n",
-	     (unsigned long) adapter, zfcp_get_busid_by_adapter(adapter),
-	     (unsigned long) scpnt);
+	ZFCP_LOG_INFO("aborting scsi_cmnd=%p on adapter %s\n",
+		      scpnt, zfcp_get_busid_by_adapter(adapter));
 
 	spin_unlock_irq(scsi_host->host_lock);
 
@@ -473,7 +464,7 @@ zfcp_scsi_eh_abort_handler(struct scsi_c
 	 */
 	req_data = (union zfcp_req_data *) scpnt->host_scribble;
 	/* DEBUG */
-	ZFCP_LOG_DEBUG("req_data=0x%lx\n", (unsigned long) req_data);
+	ZFCP_LOG_DEBUG("req_data=%p\n", req_data);
 	if (!req_data) {
 		ZFCP_LOG_DEBUG("late command completion overtook abort\n");
 		/*
@@ -488,16 +479,15 @@ zfcp_scsi_eh_abort_handler(struct scsi_c
 
 	/* Figure out which fsf_req needs to be aborted. */
 	old_fsf_req = req_data->send_fcp_command_task.fsf_req;
-#ifdef ZFCP_DEBUG_ABORTS
+
 	dbf_fsf_req = (unsigned long) old_fsf_req;
 	dbf_timeout =
 	    (jiffies - req_data->send_fcp_command_task.start_jiffies) / HZ;
-#endif
-	/* DEBUG */
-	ZFCP_LOG_DEBUG("old_fsf_req=0x%lx\n", (unsigned long) old_fsf_req);
+
+	ZFCP_LOG_DEBUG("old_fsf_req=%p\n", old_fsf_req);
 	if (!old_fsf_req) {
 		write_unlock_irqrestore(&adapter->abort_lock, flags);
-		ZFCP_LOG_NORMAL("bug: No old fsf request found.\n");
+		ZFCP_LOG_NORMAL("bug: no old fsf request found\n");
 		ZFCP_LOG_NORMAL("req_data:\n");
 		ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL,
 			      (char *) req_data, sizeof (union zfcp_req_data));
@@ -521,8 +511,7 @@ zfcp_scsi_eh_abort_handler(struct scsi_c
 	 * Since this lock will not be held, fsf_req may complete
 	 * late and may be released meanwhile.
 	 */
-	ZFCP_LOG_DEBUG("unit=0x%lx, unit_fcp_lun=0x%Lx\n",
-		       (unsigned long) unit, unit->fcp_lun);
+	ZFCP_LOG_DEBUG("unit 0x%016Lx (%p)\n", unit->fcp_lun, unit);
 
 	/*
 	 * The 'Abort FCP Command' routine may block (call schedule)
@@ -537,18 +526,18 @@ zfcp_scsi_eh_abort_handler(struct scsi_c
 	new_fsf_req = zfcp_fsf_abort_fcp_command((unsigned long) old_fsf_req,
 						 adapter,
 						 unit, ZFCP_WAIT_FOR_SBAL);
-	ZFCP_LOG_DEBUG("new_fsf_req=0x%lx\n", (unsigned long) new_fsf_req);
+	ZFCP_LOG_DEBUG("new_fsf_req=%p\n", new_fsf_req);
 	if (!new_fsf_req) {
 		retval = FAILED;
-		ZFCP_LOG_DEBUG("warning: Could not abort SCSI command "
-			       "at 0x%lx\n", (unsigned long) scpnt);
+		ZFCP_LOG_NORMAL("error: initiation of Abort FCP Cmnd "
+				"failed\n");
 		strncpy(dbf_result, "##nores", ZFCP_ABORT_DBF_LENGTH);
 		goto out;
 	}
 
 	/* wait for completion of abort */
-	ZFCP_LOG_DEBUG("Waiting for cleanup....\n");
-#ifdef ZFCP_DEBUG_ABORTS
+	ZFCP_LOG_DEBUG("waiting for cleanup...\n");
+#if 1
 	/*
 	 * FIXME:
 	 * copying zfcp_fsf_req_wait_and_cleanup code is not really nice
@@ -584,8 +573,7 @@ zfcp_scsi_eh_abort_handler(struct scsi_c
 		strncpy(dbf_result, "##fail", ZFCP_ABORT_DBF_LENGTH);
 	}
 
-      out:
-#ifdef ZFCP_DEBUG_ABORTS
+ out:
 	debug_event(adapter->abort_dbf, 1, &dbf_scsi_cmnd, sizeof (u64));
 	debug_event(adapter->abort_dbf, 1, &dbf_opcode, ZFCP_ABORT_DBF_LENGTH);
 	debug_event(adapter->abort_dbf, 1, &dbf_wwn, sizeof (wwn_t));
@@ -598,7 +586,7 @@ zfcp_scsi_eh_abort_handler(struct scsi_c
 	debug_event(adapter->abort_dbf, 1, &dbf_fsf_qual[0], sizeof (u64));
 	debug_event(adapter->abort_dbf, 1, &dbf_fsf_qual[1], sizeof (u64));
 	debug_text_event(adapter->abort_dbf, 1, dbf_result);
-#endif
+
 	spin_lock_irq(scsi_host->host_lock);
 	return retval;
 }
@@ -620,11 +608,11 @@ zfcp_scsi_eh_device_reset_handler(struct
 	spin_unlock_irq(scsi_host->host_lock);
 
 	if (!unit) {
-		ZFCP_LOG_NORMAL("bug: Tried to reset a non existant unit.\n");
+		ZFCP_LOG_NORMAL("bug: Tried reset for nonexistent unit\n");
 		retval = SUCCESS;
 		goto out;
 	}
-	ZFCP_LOG_NORMAL("Resetting Device fcp_lun=0x%Lx\n", unit->fcp_lun);
+	ZFCP_LOG_NORMAL("resetting unit 0x%016Lx\n", unit->fcp_lun);
 
 	/*
 	 * If we do not know whether the unit supports 'logical unit reset'
@@ -638,18 +626,15 @@ zfcp_scsi_eh_device_reset_handler(struct
 		retval =
 		    zfcp_task_management_function(unit, LOGICAL_UNIT_RESET);
 		if (retval) {
-			ZFCP_LOG_DEBUG
-			    ("logical unit reset failed (unit=0x%lx)\n",
-			     (unsigned long) unit);
+			ZFCP_LOG_DEBUG("unit reset failed (unit=%p)\n", unit);
 			if (retval == -ENOTSUPP)
 				atomic_set_mask
 				    (ZFCP_STATUS_UNIT_NOTSUPPUNITRESET,
 				     &unit->status);
 			/* fall through and try 'target reset' next */
 		} else {
-			ZFCP_LOG_DEBUG
-			    ("logical unit reset succeeded (unit=0x%lx)\n",
-			     (unsigned long) unit);
+			ZFCP_LOG_DEBUG("unit reset succeeded (unit=%p)\n",
+				       unit);
 			/* avoid 'target reset' */
 			retval = SUCCESS;
 			goto out;
@@ -657,12 +642,10 @@ zfcp_scsi_eh_device_reset_handler(struct
 	}
 	retval = zfcp_task_management_function(unit, TARGET_RESET);
 	if (retval) {
-		ZFCP_LOG_DEBUG("target reset failed (unit=0x%lx)\n",
-			       (unsigned long) unit);
+		ZFCP_LOG_DEBUG("target reset failed (unit=%p)\n", unit);
 		retval = FAILED;
 	} else {
-		ZFCP_LOG_DEBUG("target reset succeeded (unit=0x%lx)\n",
-			       (unsigned long) unit);
+		ZFCP_LOG_DEBUG("target reset succeeded (unit=%p)\n", unit);
 		retval = SUCCESS;
 	}
  out:
@@ -682,13 +665,9 @@ zfcp_task_management_function(struct zfc
 	fsf_req = zfcp_fsf_send_fcp_command_task_management
 	    (adapter, unit, tm_flags, ZFCP_WAIT_FOR_SBAL);
 	if (!fsf_req) {
-		ZFCP_LOG_INFO("error: Out of resources. Could not create a "
-			      "task management (abort, reset, etc) request "
-			      "for the unit with FCP-LUN 0x%Lx connected to "
-			      "the port with WWPN 0x%Lx connected to "
-			      "the adapter %s.\n",
-			      unit->fcp_lun,
-			      unit->port->wwpn,
+		ZFCP_LOG_INFO("error: creation of task management request "
+			      "failed for unit 0x%016Lx on port 0x%016Lx on  "
+			      "adapter %s\n", unit->fcp_lun, unit->port->wwpn,
 			      zfcp_get_busid_by_adapter(adapter));
 		retval = -ENOMEM;
 		goto out;
@@ -727,10 +706,8 @@ zfcp_scsi_eh_bus_reset_handler(struct sc
 	spin_unlock_irq(scsi_host->host_lock);
 
 	unit = (struct zfcp_unit *) scpnt->device->hostdata;
-	 /*DEBUG*/
-	    ZFCP_LOG_NORMAL("Resetting because of problems with "
-			    "unit=0x%lx, unit_fcp_lun=0x%Lx\n",
-			    (unsigned long) unit, unit->fcp_lun);
+	ZFCP_LOG_NORMAL("bus reset because of problems with "
+			"unit 0x%016Lx\n", unit->fcp_lun);
 	zfcp_erp_adapter_reopen(unit->port->adapter, 0);
 	zfcp_erp_wait(unit->port->adapter);
 	retval = SUCCESS;
@@ -756,10 +733,8 @@ zfcp_scsi_eh_host_reset_handler(struct s
 	spin_unlock_irq(scsi_host->host_lock);
 
 	unit = (struct zfcp_unit *) scpnt->device->hostdata;
-	 /*DEBUG*/
-	    ZFCP_LOG_NORMAL("Resetting because of problems with "
-			    "unit=0x%lx, unit_fcp_lun=0x%Lx\n",
-			    (unsigned long) unit, unit->fcp_lun);
+	ZFCP_LOG_NORMAL("host reset because of problems with "
+			"unit 0x%016Lx\n", unit->fcp_lun);
 	zfcp_erp_adapter_reopen(unit->port->adapter, 0);
 	zfcp_erp_wait(unit->port->adapter);
 	retval = SUCCESS;
@@ -785,23 +760,26 @@ zfcp_adapter_scsi_register(struct zfcp_a
 	adapter->scsi_host = scsi_host_alloc(&zfcp_data.scsi_host_template,
 					     sizeof (struct zfcp_adapter *));
 	if (!adapter->scsi_host) {
-		ZFCP_LOG_NORMAL("error: Not enough free memory. "
-				"Could not register adapter %s "
-				"with the SCSI-stack.\n",
+		ZFCP_LOG_NORMAL("error: registration with SCSI stack failed "
+				"for adapter %s ",
 				zfcp_get_busid_by_adapter(adapter));
 		retval = -EIO;
 		goto out;
 	}
-	ZFCP_LOG_DEBUG("host registered, scsi_host at 0x%lx\n",
-		       (unsigned long) adapter->scsi_host);
+	ZFCP_LOG_DEBUG("host registered, scsi_host=%p\n", adapter->scsi_host);
 
 	/* tell the SCSI stack some characteristics of this adapter */
-	adapter->scsi_host->max_id = adapter->max_scsi_id + 1;
-	adapter->scsi_host->max_lun = adapter->max_scsi_lun + 1;
+	adapter->scsi_host->max_id = 1;
+	adapter->scsi_host->max_lun = 1;
 	adapter->scsi_host->max_channel = 0;
 	adapter->scsi_host->unique_id = unique_id++;	/* FIXME */
 	adapter->scsi_host->max_cmd_len = ZFCP_MAX_SCSI_CMND_LENGTH;
 	/*
+	 * Reverse mapping of the host number to avoid race condition
+	 */
+	adapter->scsi_host_no = adapter->scsi_host->host_no;
+
+	/*
 	 * save a pointer to our own adapter data structure within
 	 * hostdata field of SCSI host data structure
 	 */
@@ -835,6 +813,7 @@ zfcp_adapter_scsi_unregister(struct zfcp
 	scsi_remove_host(shost);
 	scsi_host_put(shost);
 	adapter->scsi_host = NULL;
+	adapter->scsi_host_no = 0;
 	atomic_clear_mask(ZFCP_STATUS_ADAPTER_REGISTERED, &adapter->status);
 
 	return;
@@ -850,68 +829,32 @@ zfcp_fsf_start_scsi_er_timer(struct zfcp
 	add_timer(&adapter->scsi_er_timer);
 }
 
-/**
- * zfcp_sysfs_hba_id_show - display hba_id of scsi device
- * @dev: pointer to belonging device
- * @buf: pointer to input buffer
- *
- * "hba_id" attribute of a scsi device. Displays hba_id (bus_id)
- * of the adapter belonging to a scsi device.
- */
-static ssize_t
-zfcp_sysfs_hba_id_show(struct device *dev, char *buf)
-{
-	struct scsi_device *sdev;
-	struct zfcp_unit *unit;
-
-	sdev = to_scsi_device(dev);
-	unit = (struct zfcp_unit *) sdev->hostdata;
-	return sprintf(buf, "%s\n", zfcp_get_busid_by_unit(unit));
-}
-
-static DEVICE_ATTR(hba_id, S_IRUGO, zfcp_sysfs_hba_id_show, NULL);
-
-/**
- * zfcp_sysfs_wwpn_show - display wwpn of scsi device
- * @dev: pointer to belonging device
- * @buf: pointer to input buffer
- *
- * "wwpn" attribute of a scsi device. Displays wwpn of the port
- * belonging to a scsi device.
- */
-static ssize_t
-zfcp_sysfs_wwpn_show(struct device *dev, char *buf)
-{
-	struct scsi_device *sdev;
-	struct zfcp_unit *unit;
-
-	sdev = to_scsi_device(dev);
-	unit = (struct zfcp_unit *) sdev->hostdata;
-	return sprintf(buf, "0x%016llx\n", unit->port->wwpn);
-}
-
-static DEVICE_ATTR(wwpn, S_IRUGO, zfcp_sysfs_wwpn_show, NULL);
 
 /**
- * zfcp_sysfs_fcp_lun_show - display fcp lun of scsi device
- * @dev: pointer to belonging device
- * @buf: pointer to input buffer
- *
- * "fcp_lun" attribute of a scsi device. Displays fcp_lun of the unit
- * belonging to a scsi device.
- */
-static ssize_t
-zfcp_sysfs_fcp_lun_show(struct device *dev, char *buf)
-{
-	struct scsi_device *sdev;
-	struct zfcp_unit *unit;
-
-	sdev = to_scsi_device(dev);
-	unit = (struct zfcp_unit *) sdev->hostdata;
-	return sprintf(buf, "0x%016llx\n", unit->fcp_lun);
-}
-
-static DEVICE_ATTR(fcp_lun, S_IRUGO, zfcp_sysfs_fcp_lun_show, NULL);
+ * ZFCP_DEFINE_SCSI_ATTR
+ * @_name:   name of show attribute
+ * @_format: format string
+ * @_value:  value to print
+ *
+ * Generates attribute for a unit.
+ */
+#define ZFCP_DEFINE_SCSI_ATTR(_name, _format, _value)                    \
+static ssize_t zfcp_sysfs_scsi_##_name##_show(struct device *dev,        \
+                                              char *buf)                 \
+{                                                                        \
+        struct scsi_device *sdev;                                        \
+        struct zfcp_unit *unit;                                          \
+                                                                         \
+        sdev = to_scsi_device(dev);                                      \
+        unit = sdev->hostdata;                                           \
+        return sprintf(buf, _format, _value);                            \
+}                                                                        \
+                                                                         \
+static DEVICE_ATTR(_name, S_IRUGO, zfcp_sysfs_scsi_##_name##_show, NULL);
+
+ZFCP_DEFINE_SCSI_ATTR(hba_id, "%s\n", zfcp_get_busid_by_unit(unit));
+ZFCP_DEFINE_SCSI_ATTR(wwpn, "0x%016llx\n", unit->port->wwpn);
+ZFCP_DEFINE_SCSI_ATTR(fcp_lun, "0x%016llx\n", unit->fcp_lun);
 
 static struct device_attribute *zfcp_sysfs_sdev_attrs[] = {
 	&dev_attr_fcp_lun,
--- diff/drivers/s390/scsi/zfcp_sysfs_adapter.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/s390/scsi/zfcp_sysfs_adapter.c	2004-04-21 10:45:34.702427928 +0100
@@ -26,7 +26,7 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#define ZFCP_SYSFS_ADAPTER_C_REVISION "$Revision: 1.30 $"
+#define ZFCP_SYSFS_ADAPTER_C_REVISION "$Revision: 1.32 $"
 
 #include <asm/ccwdev.h>
 #include "zfcp_ext.h"
@@ -75,6 +75,7 @@ ZFCP_DEFINE_ADAPTER_ATTR(fc_topology, "%
 ZFCP_DEFINE_ADAPTER_ATTR(hardware_version, "0x%08x\n",
 			 adapter->hardware_version);
 ZFCP_DEFINE_ADAPTER_ATTR(serial_number, "%17s\n", adapter->serial_number);
+ZFCP_DEFINE_ADAPTER_ATTR(scsi_host_no, "0x%x\n", adapter->scsi_host_no);
 
 /**
  * zfcp_sysfs_adapter_in_recovery_show - recovery state of adapter
@@ -100,30 +101,6 @@ static DEVICE_ATTR(in_recovery, S_IRUGO,
 		   zfcp_sysfs_adapter_in_recovery_show, NULL);
 
 /**
- * zfcp_sysfs_adapter_scsi_host_no_show - display scsi_host_no of adapter
- * @dev: pointer to belonging device
- * @buf: pointer to input buffer
- *
- * "scsi_host_no" attribute of adapter. Displays the SCSI host number.
- */
-static ssize_t
-zfcp_sysfs_adapter_scsi_host_no_show(struct device *dev, char *buf)
-{
-	struct zfcp_adapter *adapter;
-	unsigned short host_no = 0;
-
-	down(&zfcp_data.config_sema);
-	adapter = dev_get_drvdata(dev);
-	if (adapter->scsi_host)
-		host_no = adapter->scsi_host->host_no;
-	up(&zfcp_data.config_sema);
-	return sprintf(buf, "0x%x\n", host_no);
-}
-
-static DEVICE_ATTR(scsi_host_no, S_IRUGO, zfcp_sysfs_adapter_scsi_host_no_show,
-		   NULL);
-
-/**
  * zfcp_sysfs_port_add_store - add a port to sysfs tree
  * @dev: pointer to belonging device
  * @buf: pointer to input buffer
@@ -219,9 +196,7 @@ zfcp_sysfs_port_remove_store(struct devi
 	zfcp_erp_port_shutdown(port, 0);
 	zfcp_erp_wait(adapter);
 	zfcp_port_put(port);
-	zfcp_sysfs_port_remove_files(&port->sysfs_device,
-				     atomic_read(&port->status));
-	device_unregister(&port->sysfs_device);
+	zfcp_port_dequeue(port);
  out:
 	up(&zfcp_data.config_sema);
 	return retval ? retval : count;
--- diff/drivers/s390/scsi/zfcp_sysfs_port.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/s390/scsi/zfcp_sysfs_port.c	2004-04-21 10:45:34.703427776 +0100
@@ -26,7 +26,7 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#define ZFCP_SYSFS_PORT_C_REVISION "$Revision: 1.37 $"
+#define ZFCP_SYSFS_PORT_C_REVISION "$Revision: 1.39 $"
 
 #include <linux/init.h>
 #include <linux/module.h>
@@ -43,11 +43,7 @@
 void
 zfcp_sysfs_port_release(struct device *dev)
 {
-	struct zfcp_port *port;
-
-	port = dev_get_drvdata(dev);
-	zfcp_port_dequeue(port);
-	return;
+	kfree(dev);
 }
 
 /**
@@ -112,7 +108,6 @@ zfcp_sysfs_unit_add_store(struct device 
 
 	zfcp_erp_unit_reopen(unit, 0);
 	zfcp_erp_wait(unit->port->adapter);
-	wait_event(unit->scsi_add_wq, atomic_read(&unit->scsi_add_work) == 0);
 	zfcp_unit_put(unit);
  out:
 	up(&zfcp_data.config_sema);
@@ -168,8 +163,7 @@ zfcp_sysfs_unit_remove_store(struct devi
 	zfcp_erp_unit_shutdown(unit, 0);
 	zfcp_erp_wait(unit->port->adapter);
 	zfcp_unit_put(unit);
-	zfcp_sysfs_unit_remove_files(&unit->sysfs_device);
-	device_unregister(&unit->sysfs_device);
+	zfcp_unit_dequeue(unit);
  out:
 	up(&zfcp_data.config_sema);
 	return retval ? retval : count;
--- diff/drivers/s390/scsi/zfcp_sysfs_unit.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/s390/scsi/zfcp_sysfs_unit.c	2004-04-21 10:45:34.703427776 +0100
@@ -26,7 +26,7 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#define ZFCP_SYSFS_UNIT_C_REVISION "$Revision: 1.23 $"
+#define ZFCP_SYSFS_UNIT_C_REVISION "$Revision: 1.24 $"
 
 #include <linux/init.h>
 #include <linux/module.h>
@@ -43,11 +43,7 @@
 void
 zfcp_sysfs_unit_release(struct device *dev)
 {
-	struct zfcp_unit *unit;
-
-	unit = dev_get_drvdata(dev);
-	zfcp_unit_dequeue(unit);
-	return;
+	kfree(dev);
 }
 
 /**
--- diff/drivers/scsi/Kconfig	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/Kconfig	2004-04-21 10:45:34.710426712 +0100
@@ -449,6 +449,14 @@ config SCSI_SATA_SIL
 
 	  If unsure, say N.
 
+config SCSI_SATA_SIS
+	tristate "SiS 964/180 SATA support"
+	depends on SCSI_SATA && PCI
+	help
+	  This option enables support for SiS Serial ATA 964/180.
+
+	  If unsure, say N.
+
 config SCSI_SATA_VIA
 	tristate "VIA SATA support"
 	depends on SCSI_SATA && PCI && EXPERIMENTAL
@@ -908,6 +916,7 @@ config 53C700_LE_ON_BE
 config SCSI_SYM53C8XX_2
 	tristate "SYM53C8XX Version 2 SCSI support"
 	depends on PCI && SCSI
+	select SCSI_SPI_ATTRS
 	---help---
 	  This driver supports the whole NCR53C8XX/SYM53C8XX family of
 	  PCI-SCSI controllers.  It also supports the subset of LSI53C10XX
--- diff/drivers/scsi/Makefile	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/Makefile	2004-04-21 10:45:34.711426560 +0100
@@ -123,6 +123,7 @@ obj-$(CONFIG_SCSI_SATA_PROMISE)	+= libat
 obj-$(CONFIG_SCSI_SATA_SIL)	+= libata.o sata_sil.o
 obj-$(CONFIG_SCSI_SATA_VIA)	+= libata.o sata_via.o
 obj-$(CONFIG_SCSI_SATA_VITESSE)	+= libata.o sata_vsc.o
+obj-$(CONFIG_SCSI_SATA_SIS)	+= libata.o sata_sis.o
 
 obj-$(CONFIG_ARM)		+= arm/
 
--- diff/drivers/scsi/aacraid/linit.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/aacraid/linit.c	2004-04-21 10:45:34.711426560 +0100
@@ -371,15 +371,22 @@ static int aac_eh_reset(struct scsi_cmnd
 	 * target (block maximum 60 seconds).
 	 */
 	for (count = 60; count; --count) {
+		int active = 0;
 		__shost_for_each_device(dev, host) {
 			spin_lock_irqsave(&dev->list_lock, flags);
 			list_for_each_entry(command, &dev->cmd_list, list) {
 				if (command->serial_number) {
-					spin_unlock_irqrestore(&dev->list_lock, flags);
-					return SUCCESS;
+					active++;
+					break;
 				}
 			}
 			spin_unlock_irqrestore(&dev->list_lock, flags);
+
+			/*
+			 * We can exit If all the commands are complete
+			 */
+			if (active == 0)
+				return SUCCESS;
 		}
 		spin_unlock_irq(host->host_lock);
 		scsi_sleep(HZ);
--- diff/drivers/scsi/aic7xxx_old.c	2003-08-20 14:16:12.000000000 +0100
+++ source/drivers/scsi/aic7xxx_old.c	2004-04-21 10:45:34.716425800 +0100
@@ -9033,7 +9033,7 @@ aic7xxx_detect(Scsi_Host_Template *templ
    * PCI-bus probe.
    */
   {
-    struct
+    static struct
     {
       unsigned short      vendor_id;
       unsigned short      device_id;
--- diff/drivers/scsi/ata_piix.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/ata_piix.c	2004-04-21 10:45:34.718425496 +0100
@@ -28,17 +28,24 @@
 #include <linux/libata.h>
 
 #define DRV_NAME	"ata_piix"
-#define DRV_VERSION	"1.01"
+#define DRV_VERSION	"1.02"
 
 enum {
 	PIIX_IOCFG		= 0x54, /* IDE I/O configuration register */
+	ICH5_PMR		= 0x90, /* port mapping register */
 	ICH5_PCS		= 0x92,	/* port control and status */
 
 	PIIX_FLAG_CHECKINTR	= (1 << 29), /* make sure PCI INTx enabled */
 	PIIX_FLAG_COMBINED	= (1 << 30), /* combined mode possible */
 
-	PIIX_COMB_PRI		= (1 << 0), /* combined mode, PATA primary */
-	PIIX_COMB_SEC		= (1 << 1), /* combined mode, PATA secondary */
+	/* combined mode.  if set, PATA is channel 0.
+	 * if clear, PATA is channel 1.
+	 */
+	PIIX_COMB_PATA_P0	= (1 << 1),
+	PIIX_COMB		= (1 << 2), /* combined mode enabled? */
+
+	PIIX_PORT_PRESENT	= (1 << 0),
+	PIIX_PORT_ENABLED	= (1 << 4),
 
 	PIIX_80C_PRI		= (1 << 5) | (1 << 4),
 	PIIX_80C_SEC		= (1 << 7) | (1 << 6),
@@ -53,7 +60,6 @@ static int piix_init_one (struct pci_dev
 
 static void piix_pata_phy_reset(struct ata_port *ap);
 static void piix_sata_phy_reset(struct ata_port *ap);
-static void piix_sata_port_disable(struct ata_port *ap);
 static void piix_set_piomode (struct ata_port *ap, struct ata_device *adev,
 			      unsigned int pio);
 static void piix_set_udmamode (struct ata_port *ap, struct ata_device *adev,
@@ -137,7 +143,7 @@ static struct ata_port_operations piix_p
 };
 
 static struct ata_port_operations piix_sata_ops = {
-	.port_disable		= piix_sata_port_disable,
+	.port_disable		= ata_port_disable,
 	.set_piomode		= piix_set_piomode,
 	.set_udmamode		= piix_set_udmamode,
 
@@ -259,54 +265,48 @@ static void piix_pata_phy_reset(struct a
 }
 
 /**
- *	piix_pcs_probe - Probe SATA port configuration and status register
- *	@ap: Port to probe
- *	@have_port: (output) Non-zero if SATA port is enabled
- *	@have_device: (output) Non-zero if SATA phy indicates device present
+ *	piix_sata_probe - Probe PCI device for present SATA devices
+ *	@pdev: PCI device to probe
  *
  *	Reads SATA PCI device's PCI config register Port Configuration
  *	and Status (PCS) to determine port and device availability.
  *
  *	LOCKING:
  *	None (inherited from caller).
- */
-static void piix_pcs_probe (struct ata_port *ap, unsigned int *have_port,
-			    unsigned int *have_device)
-{
-	struct pci_dev *pdev = ap->host_set->pdev;
-	u16 pcs;
-
-	pci_read_config_word(pdev, ICH5_PCS, &pcs);
-
-	/* is SATA port enabled? */
-	if (pcs & (1 << ap->port_no)) {
-		*have_port = 1;
-
-		if (pcs & (1 << (ap->port_no + 4)))
-			*have_device = 1;
-	}
-}
-
-/**
- *	piix_pcs_disable - Disable SATA port
- *	@ap: Port to disable
- *
- *	Disable SATA phy for specified port.
  *
- *	LOCKING:
- *	None (inherited from caller).
+ *	RETURNS:
+ *	Non-zero if device detected, zero otherwise.
  */
-static void piix_pcs_disable (struct ata_port *ap)
+static int piix_sata_probe (struct ata_port *ap)
 {
 	struct pci_dev *pdev = ap->host_set->pdev;
-	u16 pcs;
+	int combined = (ap->flags & ATA_FLAG_SLAVE_POSS);
+	int orig_mask, mask, i;
+	u8 pcs;
+
+	mask = (PIIX_PORT_PRESENT << ap->port_no) |
+	       (PIIX_PORT_ENABLED << ap->port_no);
+
+	pci_read_config_byte(pdev, ICH5_PCS, &pcs);
+	orig_mask = (int) pcs & 0xff;
+
+	/* TODO: this is vaguely wrong for ICH6 combined mode,
+	 * where only two of the four SATA ports are mapped
+	 * onto a single ATA channel.  It is also vaguely inaccurate
+	 * for ICH5, which has only two ports.  However, this is ok,
+	 * as further device presence detection code will handle
+	 * any false positives produced here.
+	 */
 
-	pci_read_config_word(pdev, ICH5_PCS, &pcs);
+	for (i = 0; i < 4; i++) {
+		mask = (PIIX_PORT_PRESENT << i) | (PIIX_PORT_ENABLED << i);
 
-	if (pcs & (1 << ap->port_no)) {
-		pcs &= ~(1 << ap->port_no);
-		pci_write_config_word(pdev, ICH5_PCS, pcs);
+		if ((orig_mask & mask) == mask)
+			if (combined || (i == ap->port_no))
+				return 1;
 	}
+
+	return 0;
 }
 
 /**
@@ -321,8 +321,6 @@ static void piix_pcs_disable (struct ata
 
 static void piix_sata_phy_reset(struct ata_port *ap)
 {
-	unsigned int have_port = 0, have_dev = 0;
-
 	if (!pci_test_config_bits(ap->host_set->pdev,
 				  &piix_enable_bits[ap->port_no])) {
 		ata_port_disable(ap);
@@ -330,21 +328,9 @@ static void piix_sata_phy_reset(struct a
 		return;
 	}
 
-	piix_pcs_probe(ap, &have_port, &have_dev);
-
-	/* if port not enabled, exit */
-	if (!have_port) {
+	if (!piix_sata_probe(ap)) {
 		ata_port_disable(ap);
-		printk(KERN_INFO "ata%u: SATA port disabled. ignoring.\n",
-		       ap->id);
-		return;
-	}
-
-	/* if port enabled but no device, disable port and exit */
-	if (!have_dev) {
-		piix_sata_port_disable(ap);
-		printk(KERN_INFO "ata%u: SATA port has no device. disabling.\n",
-		       ap->id);
+		printk(KERN_INFO "ata%u: SATA port has no device.\n", ap->id);
 		return;
 	}
 
@@ -356,22 +342,6 @@ static void piix_sata_phy_reset(struct a
 }
 
 /**
- *	piix_sata_port_disable - Disable SATA port
- *	@ap: Port to disable.
- *
- *	Disable SATA port.
- *
- *	LOCKING:
- *	None (inherited from caller).
- */
-
-static void piix_sata_port_disable(struct ata_port *ap)
-{
-	ata_port_disable(ap);
-	piix_pcs_disable(ap);
-}
-
-/**
  *	piix_set_piomode - Initialize host controller PATA PIO timings
  *	@ap: Port whose timings we are configuring
  *	@adev: um
@@ -493,31 +463,6 @@ static void piix_set_udmamode (struct at
 	}
 }
 
-/**
- *	piix_probe_combined - Determine if PATA and SATA are combined
- *	@pdev: PCI device to examine
- *	@mask: (output) zero, %PIIX_COMB_PRI or %PIIX_COMB_SEC
- *
- *	Determine if BIOS has secretly stuffed a PATA port into our
- *	otherwise-beautiful SATA PCI device.
- *
- *	LOCKING:
- *	Inherited from PCI layer (may sleep).
- */
-static void piix_probe_combined (struct pci_dev *pdev, unsigned int *mask)
-{
-	u8 tmp;
-
-	pci_read_config_byte(pdev, 0x90, &tmp); /* combined mode reg */
-	tmp &= 0x6; 	/* interesting bits 2:1, PATA primary/secondary */
-
-	/* backwards from what one might expect */
-	if (tmp == 0x4)	/* bits 10x */
-		*mask |= PIIX_COMB_SEC;
-	if (tmp == 0x6)	/* bits 11x */
-		*mask |= PIIX_COMB_PRI;
-}
-
 /* move to PCI layer, integrate w/ MSI stuff */
 static void pci_enable_intx(struct pci_dev *pdev)
 {
@@ -550,7 +495,7 @@ static int piix_init_one (struct pci_dev
 	static int printed_version;
 	struct ata_port_info *port_info[2];
 	unsigned int combined = 0, n_ports = 1;
-	unsigned int pata_comb = 0, sata_comb = 0;
+	unsigned int pata_chan = 0, sata_chan = 0;
 
 	if (!printed_version++)
 		printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n");
@@ -561,8 +506,19 @@ static int piix_init_one (struct pci_dev
 
 	port_info[0] = &piix_port_info[ent->driver_data];
 	port_info[1] = NULL;
-	if (port_info[0]->host_flags & PIIX_FLAG_COMBINED)
-		piix_probe_combined(pdev, &combined);
+
+	if (port_info[0]->host_flags & PIIX_FLAG_COMBINED) {
+		u8 tmp;
+		pci_read_config_byte(pdev, ICH5_PMR, &tmp);
+
+		if (tmp & PIIX_COMB) {
+			combined = 1;
+			if (tmp & PIIX_COMB_PATA_P0)
+				sata_chan = 1;
+			else
+				pata_chan = 1;
+		}
+	}
 
 	/* On ICH5, some BIOSen disable the interrupt using the
 	 * PCI_COMMAND_INTX_DISABLE bit added in PCI 2.3.
@@ -573,15 +529,10 @@ static int piix_init_one (struct pci_dev
 	if (port_info[0]->host_flags & PIIX_FLAG_CHECKINTR)
 		pci_enable_intx(pdev);
 
-	if (combined & PIIX_COMB_PRI)
-		sata_comb = 1;
-	else if (combined & PIIX_COMB_SEC)
-		pata_comb = 1;
-
-	if (pata_comb || sata_comb) {
-		port_info[sata_comb] = &piix_port_info[ent->driver_data];
-		port_info[sata_comb]->host_flags |= ATA_FLAG_SLAVE_POSS; /* sigh */
-		port_info[pata_comb] = &piix_port_info[ich5_pata]; /*ich5-specific*/
+	if (combined) {
+		port_info[sata_chan] = &piix_port_info[ent->driver_data];
+		port_info[sata_chan]->host_flags |= ATA_FLAG_SLAVE_POSS;
+		port_info[pata_chan] = &piix_port_info[ich5_pata];
 		n_ports++;
 
 		printk(KERN_WARNING DRV_NAME ": combined mode detected\n");
--- diff/drivers/scsi/atari_NCR5380.c	2003-08-26 10:00:53.000000000 +0100
+++ source/drivers/scsi/atari_NCR5380.c	2004-04-21 10:45:34.719425344 +0100
@@ -329,7 +329,7 @@ static void __init init_tags( void )
     for( target = 0; target < 8; ++target ) {
 	for( lun = 0; lun < 8; ++lun ) {
 	    ta = &TagAlloc[target][lun];
-	    CLEAR_BITMAP( ta->allocated, MAX_TAGS );
+	    bitmap_zero(ta->allocated, MAX_TAGS);
 	    ta->nr_allocated = 0;
 	    /* At the beginning, assume the maximum queue size we could
 	     * support (MAX_TAGS). This value will be decreased if the target
@@ -438,7 +438,7 @@ static void free_all_tags( void )
     for( target = 0; target < 8; ++target ) {
 	for( lun = 0; lun < 8; ++lun ) {
 	    ta = &TagAlloc[target][lun];
-	    CLEAR_BITMAP( ta->allocated, MAX_TAGS );
+	    bitmap_zero(ta->allocated, MAX_TAGS);
 	    ta->nr_allocated = 0;
 	}
     }
--- diff/drivers/scsi/dpt_i2o.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/dpt_i2o.c	2004-04-21 10:45:34.729423824 +0100
@@ -592,7 +592,7 @@ static int adpt_proc_info(struct Scsi_Ho
 				unit = d->pI2o_dev->lct_data.tid;
 				len += sprintf(buffer+len, "\tTID=%d, (Channel=%d, Target=%d, Lun=%d)  (%s)\n\n",
 					       unit, (int)d->scsi_channel, (int)d->scsi_id, (int)d->scsi_lun,
-					       d->pScsi_dev->online? "online":"offline"); 
+					       scsi_device_online(d->pScsi_dev)? "online":"offline"); 
 				pos = begin + len;
 
 				/* CHECKPOINT */
@@ -2436,11 +2436,11 @@ static s32 adpt_i2o_reparse_lct(adpt_hba
 			// We found an old device - check it
 			while(pDev) {
 				if(pDev->scsi_lun == scsi_lun) {
-					if(pDev->pScsi_dev->online == FALSE) {
+					if(!scsi_device_online(pDev->pScsi_dev)) {
 						printk(KERN_WARNING"%s: Setting device (%d,%d,%d) back online\n",
 								pHba->name,bus_no,scsi_id,scsi_lun);
 						if (pDev->pScsi_dev) {
-							pDev->pScsi_dev->online = TRUE;
+							scsi_device_set_state(pDev->pScsi_dev, SDEV_RUNNING);
 						}
 					}
 					d = pDev->pI2o_dev;
@@ -2471,7 +2471,7 @@ static s32 adpt_i2o_reparse_lct(adpt_hba
 			pDev->state = DPTI_DEV_OFFLINE;
 			printk(KERN_WARNING"%s: Device (%d,%d,%d) offline\n",pHba->name,pDev->scsi_channel,pDev->scsi_id,pDev->scsi_lun);
 			if (pDev->pScsi_dev) {
-				pDev->pScsi_dev->online = FALSE;
+				scsi_device_set_state(pDev->pScsi_dev, SDEV_OFFLINE);
 			}
 		}
 	}
--- diff/drivers/scsi/ips.c	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/scsi/ips.c	2004-04-21 10:45:34.732423368 +0100
@@ -198,7 +198,7 @@ MODULE_PARM(ips, "s");
  * DRIVER_VER
  */
 #define IPS_VERSION_HIGH        "7.00"
-#define IPS_VERSION_LOW         ".00 "
+#define IPS_VERSION_LOW         ".15 "
 
 #if !defined(__i386__) && !defined(__ia64__) && !defined(__x86_64__)
 #warning "This driver has only been tested on the x86/ia64/x86_64 platforms"
@@ -328,7 +328,10 @@ static char ips_adapter_name[][30] = {
 	"ServeRAID 5i",
 	"ServeRAID 5i",
 	"ServeRAID 6M",
-	"ServeRAID 6i"
+	"ServeRAID 6i",
+	"ServeRAID 7t",
+	"ServeRAID 7k",
+	"ServeRAID 7M"
 };
 
 static struct notifier_block ips_notifier = {
@@ -2375,6 +2378,12 @@ ips_identify_controller(ips_ha_t * ha)
 		case IPS_SUBDEVICEID_6I:
 			ha->ad_type = IPS_ADTYPE_SERVERAID6I;
 			break;
+		case IPS_SUBDEVICEID_7k:
+			ha->ad_type = IPS_ADTYPE_SERVERAID7k;
+			break;
+		case IPS_SUBDEVICEID_7M:
+			ha->ad_type = IPS_ADTYPE_SERVERAID7M;
+			break;
 		}
 		break;
 	}
@@ -6987,6 +6996,8 @@ ips_order_controllers(void)
 			for (j = position; j < ips_num_controllers; j++) {
 				switch (ips_ha[j]->ad_type) {
 				case IPS_ADTYPE_SERVERAID6M:
+				case IPS_ADTYPE_SERVERAID7k:
+				case IPS_ADTYPE_SERVERAID7M:
 					if (nvram->adapter_order[i] == 'M') {
 						ips_shift_controllers(position,
 								      j);
--- diff/drivers/scsi/ips.h	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/scsi/ips.h	2004-04-21 10:45:34.734423064 +0100
@@ -246,6 +246,8 @@
    #define IPS_SUBDEVICEID_5I1          0x0258
    #define IPS_SUBDEVICEID_6M           0x0279
    #define IPS_SUBDEVICEID_6I           0x028C
+   #define IPS_SUBDEVICEID_7k           0x028E
+   #define IPS_SUBDEVICEID_7M           0x028F
    #define IPS_IOCTL_SIZE               8192
    #define IPS_STATUS_SIZE              4
    #define IPS_STATUS_Q_SIZE            (IPS_MAX_CMDS+1) * IPS_STATUS_SIZE
@@ -330,6 +332,9 @@
    #define IPS_ADTYPE_SERVERAID5I1      0x0D
    #define IPS_ADTYPE_SERVERAID6M       0x0E
    #define IPS_ADTYPE_SERVERAID6I       0x0F
+   #define IPS_ADTYPE_SERVERAID7t       0x10
+   #define IPS_ADTYPE_SERVERAID7k       0x11
+   #define IPS_ADTYPE_SERVERAID7M       0x12
 
    /*
     * Adapter Command/Status Packet Definitions
@@ -1207,25 +1212,26 @@ typedef struct {
 #define IPS_VER_MAJOR_STRING "7"
 #define IPS_VER_MINOR 00
 #define IPS_VER_MINOR_STRING "00"
-#define IPS_VER_BUILD 00
-#define IPS_VER_BUILD_STRING "00"
-#define IPS_VER_STRING "7.00.00"
-#define IPS_RELEASE_ID 0x00010001
-#define IPS_BUILD_IDENT 475
-#define IPS_LEGALCOPYRIGHT_STRING "(C) Copyright IBM Corp. 1994, 2003. All Rights Reserved."
-#define IPS_ADAPTECCOPYRIGHT_STRING "(c) Copyright Adaptec, Inc. 2002 to present. All Rights Reserved."
-#define IPS_NT_LEGALCOPYRIGHT_STRING "(C) Copyright IBM Corp. 1994, 2003."
+#define IPS_VER_BUILD 15
+#define IPS_VER_BUILD_STRING "15"
+#define IPS_VER_STRING "7.00.15"
+#define IPS_RELEASE_ID 0x00020000
+#define IPS_BUILD_IDENT 625
+#define IPS_LEGALCOPYRIGHT_STRING "(C) Copyright IBM Corp. 1994, 2002. All Rights Reserved."
+#define IPS_ADAPTECCOPYRIGHT_STRING "(c) Copyright Adaptec, Inc. 2002 to 2004. All Rights Reserved."
+#define IPS_DELLCOPYRIGHT_STRING "(c) Copyright Dell 2004. All Rights Reserved."
+#define IPS_NT_LEGALCOPYRIGHT_STRING "(C) Copyright IBM Corp. 1994, 2002."
 
 /* Version numbers for various adapters */
 #define IPS_VER_SERVERAID1 "2.25.01"
 #define IPS_VER_SERVERAID2 "2.88.13"
 #define IPS_VER_NAVAJO "2.88.13"
 #define IPS_VER_SERVERAID3 "6.10.24"
-#define IPS_VER_SERVERAID4H "6.11.07"
-#define IPS_VER_SERVERAID4MLx "6.11.07"
-#define IPS_VER_SARASOTA "6.11.07"
-#define IPS_VER_MARCO "6.11.07"
-#define IPS_VER_SEBRING "6.11.07"
+#define IPS_VER_SERVERAID4H "7.00.15"
+#define IPS_VER_SERVERAID4MLx "7.00.15"
+#define IPS_VER_SARASOTA "7.00.15"
+#define IPS_VER_MARCO "7.00.15"
+#define IPS_VER_SEBRING "7.00.15"
 
 /* Compatability IDs for various adapters */
 #define IPS_COMPAT_UNKNOWN ""
--- diff/drivers/scsi/libata-core.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/libata-core.c	2004-04-21 10:45:34.741422000 +0100
@@ -118,7 +118,7 @@ static const char *ata_thr_state_name(un
 static void msleep(unsigned long msecs)
 {
 	set_current_state(TASK_UNINTERRUPTIBLE);
-	schedule_timeout(msecs_to_jiffies(msecs));
+	schedule_timeout(msecs_to_jiffies(msecs) + 1);
 }
 
 /**
@@ -439,6 +439,81 @@ u8 ata_check_status_mmio(struct ata_port
        	return readb((void *) ap->ioaddr.status_addr);
 }
 
+/**
+ *	ata_prot_to_cmd - determine which read/write opcodes to use
+ *	@protocol: ATA_PROT_xxx taskfile protocol
+ *	@lba48: true is lba48 is present
+ *
+ *	Given necessary input, determine which read/write commands
+ *	to use to transfer data.
+ *
+ *	LOCKING:
+ *	None.
+ */
+static int ata_prot_to_cmd(int protocol, int lba48)
+{
+	int rcmd = 0, wcmd = 0;
+
+	switch (protocol) {
+	case ATA_PROT_PIO:
+		if (lba48) {
+			rcmd = ATA_CMD_PIO_READ_EXT;
+			wcmd = ATA_CMD_PIO_WRITE_EXT;
+		} else {
+			rcmd = ATA_CMD_PIO_READ;
+			wcmd = ATA_CMD_PIO_WRITE;
+		}
+		break;
+
+	case ATA_PROT_DMA:
+		if (lba48) {
+			rcmd = ATA_CMD_READ_EXT;
+			wcmd = ATA_CMD_WRITE_EXT;
+		} else {
+			rcmd = ATA_CMD_READ;
+			wcmd = ATA_CMD_WRITE;
+		}
+		break;
+
+	default:
+		return -1;
+	}
+
+	return rcmd | (wcmd << 8);
+}
+
+/**
+ *	ata_dev_set_protocol - set taskfile protocol and r/w commands
+ *	@dev: device to examine and configure
+ *
+ *	Examine the device configuration, after we have
+ *	read the identify-device page and configured the
+ *	data transfer mode.  Set internal state related to
+ *	the ATA taskfile protocol (pio, pio mult, dma, etc.)
+ *	and calculate the proper read/write commands to use.
+ *
+ *	LOCKING:
+ *	caller.
+ */
+static void ata_dev_set_protocol(struct ata_device *dev)
+{
+	int pio = (dev->flags & ATA_DFLAG_PIO);
+	int lba48 = (dev->flags & ATA_DFLAG_LBA48);
+	int proto, cmd;
+
+	if (pio)
+		proto = dev->xfer_protocol = ATA_PROT_PIO;
+	else
+		proto = dev->xfer_protocol = ATA_PROT_DMA;
+
+	cmd = ata_prot_to_cmd(proto, lba48);
+	if (cmd < 0)
+		BUG();
+
+	dev->read_cmd = cmd & 0xff;
+	dev->write_cmd = (cmd >> 8) & 0xff;
+}
+
 static const char * udma_str[] = {
 	"UDMA/16",
 	"UDMA/25",
@@ -478,12 +553,21 @@ static const char *ata_udma_string(unsig
 }
 
 /**
- *	ata_pio_devchk -
- *	@ap:
- *	@device:
+ *	ata_pio_devchk - PATA device presence detection
+ *	@ap: ATA channel to examine
+ *	@device: Device to examine (starting at zero)
  *
- *	LOCKING:
+ *	This technique was originally described in
+ *	Hale Landis's ATADRVR (www.ata-atapi.com), and
+ *	later found its way into the ATA/ATAPI spec.
  *
+ *	Write a pattern to the ATA shadow registers,
+ *	and if a device is present, it will respond by
+ *	correctly storing and echoing back the
+ *	ATA shadow register contents.
+ *
+ *	LOCKING:
+ *	caller.
  */
 
 static unsigned int ata_pio_devchk(struct ata_port *ap,
@@ -513,12 +597,21 @@ static unsigned int ata_pio_devchk(struc
 }
 
 /**
- *	ata_mmio_devchk -
- *	@ap:
- *	@device:
+ *	ata_mmio_devchk - PATA device presence detection
+ *	@ap: ATA channel to examine
+ *	@device: Device to examine (starting at zero)
  *
- *	LOCKING:
+ *	This technique was originally described in
+ *	Hale Landis's ATADRVR (www.ata-atapi.com), and
+ *	later found its way into the ATA/ATAPI spec.
  *
+ *	Write a pattern to the ATA shadow registers,
+ *	and if a device is present, it will respond by
+ *	correctly storing and echoing back the
+ *	ATA shadow register contents.
+ *
+ *	LOCKING:
+ *	caller.
  */
 
 static unsigned int ata_mmio_devchk(struct ata_port *ap,
@@ -548,12 +641,16 @@ static unsigned int ata_mmio_devchk(stru
 }
 
 /**
- *	ata_dev_devchk -
- *	@ap:
- *	@device:
+ *	ata_dev_devchk - PATA device presence detection
+ *	@ap: ATA channel to examine
+ *	@device: Device to examine (starting at zero)
  *
- *	LOCKING:
+ *	Dispatch ATA device presence detection, depending
+ *	on whether we are using PIO or MMIO to talk to the
+ *	ATA shadow registers.
  *
+ *	LOCKING:
+ *	caller.
  */
 
 static unsigned int ata_dev_devchk(struct ata_port *ap,
@@ -604,16 +701,24 @@ static unsigned int ata_dev_classify(str
 }
 
 /**
- *	ata_dev_try_classify -
- *	@ap:
- *	@device:
+ *	ata_dev_try_classify - Parse returned ATA device signature
+ *	@ap: ATA channel to examine
+ *	@device: Device to examine (starting at zero)
  *
- *	LOCKING:
+ *	After an event -- SRST, E.D.D., or SATA COMRESET -- occurs,
+ *	an ATA/ATAPI-defined set of values is placed in the ATA
+ *	shadow registers, indicating the results of device detection
+ *	and diagnostics.
  *
+ *	Select the ATA device, and read the values from the ATA shadow
+ *	registers.  Then parse according to the Error register value,
+ *	and the spec-defined values examined by ata_dev_classify().
+ *
+ *	LOCKING:
+ *	caller.
  */
 
-static u8 ata_dev_try_classify(struct ata_port *ap, unsigned int device,
-			       unsigned int maybe_have_dev)
+static u8 ata_dev_try_classify(struct ata_port *ap, unsigned int device)
 {
 	struct ata_device *dev = &ap->device[device];
 	struct ata_taskfile tf;
@@ -650,44 +755,51 @@ static u8 ata_dev_try_classify(struct at
 }
 
 /**
- *	ata_dev_id_string -
- *	@dev:
- *	@s:
- *	@ofs:
- *	@len:
+ *	ata_dev_id_string - Convert IDENTIFY DEVICE page into string
+ *	@dev: Device whose IDENTIFY DEVICE results we will examine
+ *	@s: string into which data is output
+ *	@ofs: offset into identify device page
+ *	@len: length of string to return
  *
- *	LOCKING:
- *
- *	RETURNS:
+ *	The strings in the IDENTIFY DEVICE page are broken up into
+ *	16-bit chunks.  Run through the string, and output each
+ *	8-bit chunk linearly, regardless of platform.
  *
+ *	LOCKING:
+ *	caller.
  */
 
-unsigned int ata_dev_id_string(struct ata_device *dev, unsigned char *s,
-			       unsigned int ofs, unsigned int len)
+void ata_dev_id_string(struct ata_device *dev, unsigned char *s,
+		       unsigned int ofs, unsigned int len)
 {
-	unsigned int c, ret = 0;
+	unsigned int c;
 
 	while (len > 0) {
 		c = dev->id[ofs] >> 8;
 		*s = c;
 		s++;
 
-		ret = c = dev->id[ofs] & 0xff;
+		c = dev->id[ofs] & 0xff;
 		*s = c;
 		s++;
 
 		ofs++;
 		len -= 2;
 	}
-
-	return ret;
 }
 
 /**
- *	ata_dev_parse_strings -
- *	@dev:
+ *	ata_dev_parse_strings - Store useful IDENTIFY DEVICE page strings
+ *	@dev: Device whose IDENTIFY DEVICE page info we use
+ *
+ *	We store 'vendor' and 'product' strings read from the device,
+ *	for later use in the SCSI simulator's INQUIRY data.
+ *
+ *	Set these strings here, in the case of 'product', using
+ *	data read from the ATA IDENTIFY DEVICE page.
  *
  *	LOCKING:
+ *	caller.
  */
 
 static void ata_dev_parse_strings(struct ata_device *dev)
@@ -700,12 +812,16 @@ static void ata_dev_parse_strings(struct
 }
 
 /**
- *	__ata_dev_select -
- *	@ap:
- *	@device:
+ *	__ata_dev_select - Select device 0/1 on ATA bus
+ *	@ap: ATA channel to manipulate
+ *	@device: ATA device (numbered from zero) to select
  *
- *	LOCKING:
+ *	Use the method defined in the ATA specification to
+ *	make either device 0, or device 1, active on the
+ *	ATA channel.
  *
+ *	LOCKING:
+ *	caller.
  */
 
 static void __ata_dev_select (struct ata_port *ap, unsigned int device)
@@ -726,16 +842,22 @@ static void __ata_dev_select (struct ata
 }
 
 /**
- *	ata_dev_select -
- *	@ap:
- *	@device:
- *	@wait:
- *	@can_sleep:
+ *	ata_dev_select - Select device 0/1 on ATA bus
+ *	@ap: ATA channel to manipulate
+ *	@device: ATA device (numbered from zero) to select
+ *	@wait: non-zero to wait for Status register BSY bit to clear
+ *	@can_sleep: non-zero if context allows sleeping
+ *
+ *	Use the method defined in the ATA specification to
+ *	make either device 0, or device 1, active on the
+ *	ATA channel.
+ *
+ *	This is a high-level version of __ata_dev_select(),
+ *	which additionally provides the services of inserting
+ *	the proper pauses and status polling, where needed.
  *
  *	LOCKING:
- *
- *	RETURNS:
- *
+ *	caller.
  */
 
 void ata_dev_select(struct ata_port *ap, unsigned int device,
@@ -757,10 +879,14 @@ void ata_dev_select(struct ata_port *ap,
 }
 
 /**
- *	ata_dump_id -
- *	@dev:
+ *	ata_dump_id - IDENTIFY DEVICE info debugging output
+ *	@dev: Device whose IDENTIFY DEVICE page we will dump
+ *
+ *	Dump selected 16-bit words from a detected device's
+ *	IDENTIFY PAGE page.
  *
  *	LOCKING:
+ *	caller.
  */
 
 static inline void ata_dump_id(struct ata_device *dev)
@@ -843,7 +969,7 @@ static void ata_dev_identify(struct ata_
 retry:
 	ata_tf_init(ap, &tf, device);
 	tf.ctl |= ATA_NIEN;
-	tf.protocol = ATA_PROT_PIO_READ;
+	tf.protocol = ATA_PROT_PIO;
 
 	if (dev->class == ATA_DEV_ATA) {
 		tf.command = ATA_CMD_ID_ATA;
@@ -1129,7 +1255,7 @@ void ata_port_disable(struct ata_port *a
  */
 static void ata_set_mode(struct ata_port *ap)
 {
-	unsigned int force_pio;
+	unsigned int force_pio, i;
 
 	ata_host_set_pio(ap);
 	if (ap->flags & ATA_FLAG_PORT_DISABLED)
@@ -1148,19 +1274,21 @@ static void ata_set_mode(struct ata_port
 	if (force_pio) {
 		ata_dev_set_pio(ap, 0);
 		ata_dev_set_pio(ap, 1);
-
-		if (ap->flags & ATA_FLAG_PORT_DISABLED)
-			return;
 	} else {
 		ata_dev_set_udma(ap, 0);
 		ata_dev_set_udma(ap, 1);
-
-		if (ap->flags & ATA_FLAG_PORT_DISABLED)
-			return;
 	}
 
+	if (ap->flags & ATA_FLAG_PORT_DISABLED)
+		return;
+
 	if (ap->ops->post_set_mode)
 		ap->ops->post_set_mode(ap);
+
+	for (i = 0; i < 2; i++) {
+		struct ata_device *dev = &ap->device[i];
+		ata_dev_set_protocol(dev);
+	}
 }
 
 /**
@@ -1386,9 +1514,9 @@ void ata_bus_reset(struct ata_port *ap)
 	/*
 	 * determine by signature whether we have ATA or ATAPI devices
 	 */
-	err = ata_dev_try_classify(ap, 0, dev0);
+	err = ata_dev_try_classify(ap, 0);
 	if ((slave_possible) && (err != 0x81))
-		ata_dev_try_classify(ap, 1, dev1);
+		ata_dev_try_classify(ap, 1);
 
 	/* re-enable interrupts */
 	ata_irq_on(ap);
@@ -1725,6 +1853,7 @@ static int ata_sg_setup_one(struct ata_q
 	int dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
 	struct scatterlist *sg = qc->sg;
 	unsigned int have_sg = (qc->flags & ATA_QCFLAG_SG);
+	dma_addr_t dma_address;
 
 	assert(sg == &qc->sgent);
 	assert(qc->n_elem == 1);
@@ -1736,12 +1865,15 @@ static int ata_sg_setup_one(struct ata_q
 	if (!have_sg)
 		return 0;
 
-	sg_dma_address(sg) = pci_map_single(ap->host_set->pdev,
-					 cmd->request_buffer,
-					 cmd->request_bufflen, dir);
+	dma_address = pci_map_single(ap->host_set->pdev, cmd->request_buffer,
+				     cmd->request_bufflen, dir);
+	if (pci_dma_mapping_error(dma_address))
+		return -1;
+
+	sg_dma_address(sg) = dma_address;
 
 	DPRINTK("mapped buffer of %d bytes for %s\n", cmd->request_bufflen,
-		qc->flags & ATA_QCFLAG_WRITE ? "write" : "read");
+		qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");
 
 	return 0;
 }
@@ -1842,8 +1974,7 @@ static void ata_pio_start (struct ata_qu
 {
 	struct ata_port *ap = qc->ap;
 
-	assert((qc->tf.protocol == ATA_PROT_PIO_READ) ||
-	       (qc->tf.protocol == ATA_PROT_PIO_WRITE));
+	assert(qc->tf.protocol == ATA_PROT_PIO);
 
 	qc->flags |= ATA_QCFLAG_POLL;
 	qc->tf.ctl |= ATA_NIEN;	/* disable interrupts */
@@ -1963,12 +2094,12 @@ static void ata_pio_sector(struct ata_po
 		}
 
 	DPRINTK("data %s, drv_stat 0x%X\n",
-		qc->flags & ATA_QCFLAG_WRITE ? "write" : "read",
+		qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read",
 		status);
 
 	/* do the actual data transfer */
 	/* FIXME: mmio-ize */
-	if (qc->flags & ATA_QCFLAG_WRITE)
+	if (qc->tf.flags & ATA_TFLAG_WRITE)
 		outsl(ap->ioaddr.data_addr, buf, ATA_SECT_DWORDS);
 	else
 		insl(ap->ioaddr.data_addr, buf, ATA_SECT_DWORDS);
@@ -2033,8 +2164,7 @@ void ata_eng_timeout(struct ata_port *ap
 	qc->scsidone = scsi_finish_command;
 
 	switch (qc->tf.protocol) {
-	case ATA_PROT_DMA_READ:
-	case ATA_PROT_DMA_WRITE:
+	case ATA_PROT_DMA:
 		if (ap->flags & ATA_FLAG_MMIO) {
 			void *mmio = (void *) ap->ioaddr.bmdma_addr;
 			host_stat = readb(mmio + ATA_DMA_STATUS);
@@ -2115,6 +2245,7 @@ struct ata_queued_cmd *ata_qc_new_init(s
 		qc->scsicmd = NULL;
 		qc->ap = ap;
 		qc->dev = dev;
+		qc->cursect = qc->cursg = qc->cursg_ofs = 0;
 		INIT_LIST_HEAD(&qc->node);
 		init_MUTEX_LOCKED(&qc->sem);
 
@@ -2258,7 +2389,7 @@ err_out:
 void ata_bmdma_start_mmio (struct ata_queued_cmd *qc)
 {
 	struct ata_port *ap = qc->ap;
-	unsigned int rw = (qc->flags & ATA_QCFLAG_WRITE);
+	unsigned int rw = (qc->tf.flags & ATA_TFLAG_WRITE);
 	u8 host_stat, dmactl;
 	void *mmio = (void *) ap->ioaddr.bmdma_addr;
 
@@ -2307,7 +2438,7 @@ void ata_bmdma_start_mmio (struct ata_qu
 void ata_bmdma_start_pio (struct ata_queued_cmd *qc)
 {
 	struct ata_port *ap = qc->ap;
-	unsigned int rw = (qc->flags & ATA_QCFLAG_WRITE);
+	unsigned int rw = (qc->tf.flags & ATA_TFLAG_WRITE);
 	u8 host_stat, dmactl;
 
 	/* load PRD table addr. */
@@ -2402,8 +2533,7 @@ inline unsigned int ata_host_intr (struc
 	unsigned int handled = 0;
 
 	switch (qc->tf.protocol) {
-	case ATA_PROT_DMA_READ:
-	case ATA_PROT_DMA_WRITE:
+	case ATA_PROT_DMA:
 		if (ap->flags & ATA_FLAG_MMIO) {
 			void *mmio = (void *) ap->ioaddr.bmdma_addr;
 			host_stat = readb(mmio + ATA_DMA_STATUS);
@@ -2629,7 +2759,7 @@ static int ata_thread (void *data)
                         flush_signals(current);
                         
                 if (current->flags & PF_FREEZE)
-			refrigerator(PF_IOTHREAD);
+			refrigerator(PF_FREEZE);
                                                         
 
                 if ((timeout < 0) || (ap->time_to_die))
@@ -2810,6 +2940,7 @@ static void ata_host_init(struct ata_por
 	host->unique_id = ata_unique_id++;
 	host->max_cmd_len = 12;
 	scsi_set_device(host, &ent->pdev->dev);
+	scsi_assign_lock(host, &host_set->lock);
 
 	ap->flags = ATA_FLAG_PORT_DISABLED;
 	ap->id = host->unique_id;
--- diff/drivers/scsi/libata-scsi.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/libata-scsi.c	2004-04-21 10:45:34.743421696 +0100
@@ -32,17 +32,29 @@
 
 #include "libata.h"
 
+typedef unsigned int (*ata_xlat_func_t)(struct ata_queued_cmd *qc, u8 *scsicmd);
+static void ata_scsi_simulate(struct ata_port *ap, struct ata_device *dev,
+			      struct scsi_cmnd *cmd,
+			      void (*done)(struct scsi_cmnd *));
+
 
 /**
- *	ata_std_bios_param - generic bios head/sector/cylinder calculator
- *	    used by sd. Most BIOSes nowadays expect a XXX/255/16  (CHS) 
- *	    mapping. Some situations may arise where the disk is not 
- *	    bootable if this is not used.
+ *	ata_std_bios_param - generic bios head/sector/cylinder calculator used by sd.
+ *	@sdev: SCSI device for which BIOS geometry is to be determined
+ *	@bdev: block device associated with @sdev
+ *	@capacity: capacity of SCSI device
+ *	@geom: location to which geometry will be output
+ *
+ *	Generic bios head/sector/cylinder calculator
+ *	used by sd. Most BIOSes nowadays expect a XXX/255/16  (CHS) 
+ *	mapping. Some situations may arise where the disk is not 
+ *	bootable if this is not used.
  *
  *	LOCKING:
+ *	Defined by the SCSI layer.  We don't really care.
  *
  *	RETURNS:
- *
+ *	Zero.
  */
 int ata_std_bios_param(struct scsi_device *sdev, struct block_device *bdev,
 		       sector_t capacity, int geom[]) 
@@ -56,6 +68,27 @@ int ata_std_bios_param(struct scsi_devic
 }
 
 
+/**
+ *	ata_scsi_qc_new - acquire new ata_queued_cmd reference
+ *	@ap: ATA port to which the new command is attached
+ *	@dev: ATA device to which the new command is attached
+ *	@cmd: SCSI command that originated this ATA command
+ *	@done: SCSI command completion function
+ *
+ *	Obtain a reference to an unused ata_queued_cmd structure,
+ *	which is the basic libata structure representing a single
+ *	ATA command sent to the hardware.
+ *
+ *	If a command was available, fill in the SCSI-specific
+ *	portions of the structure with information on the
+ *	current command.
+ *
+ *	LOCKING:
+ *	spin_lock_irqsave(host_set lock)
+ *
+ *	RETURNS:
+ *	Command allocated, or %NULL if none available.
+ */
 struct ata_queued_cmd *ata_scsi_qc_new(struct ata_port *ap,
 				       struct ata_device *dev,
 				       struct scsi_cmnd *cmd,
@@ -84,11 +117,18 @@ struct ata_queued_cmd *ata_scsi_qc_new(s
 }
 
 /**
- *	ata_to_sense_error -
- *	@qc:
- *	@cmd:
+ *	ata_to_sense_error - convert ATA error to SCSI error
+ *	@qc: Command that we are erroring out
+ *
+ *	Converts an ATA error into a SCSI error.
+ *
+ *	Right now, this routine is laughably primitive.  We
+ *	don't even examine what ATA told us, we just look at
+ *	the command data direction, and return a fatal SCSI
+ *	sense error based on that.
  *
  *	LOCKING:
+ *	spin_lock_irqsave(host_set lock)
  */
 
 void ata_to_sense_error(struct ata_queued_cmd *qc)
@@ -102,7 +142,7 @@ void ata_to_sense_error(struct ata_queue
 	cmd->sense_buffer[7] = 14 - 8;	/* addnl. sense len. FIXME: correct? */
 
 	/* additional-sense-code[-qualifier] */
-	if ((qc->flags & ATA_QCFLAG_WRITE) == 0) {
+	if (cmd->sc_data_direction == SCSI_DATA_READ) {
 		cmd->sense_buffer[12] = 0x11; /* "unrecovered read error" */
 		cmd->sense_buffer[13] = 0x04;
 	} else {
@@ -112,11 +152,15 @@ void ata_to_sense_error(struct ata_queue
 }
 
 /**
- *	ata_scsi_slave_config -
- *	@sdev:
+ *	ata_scsi_slave_config - Set SCSI device attributes
+ *	@sdev: SCSI device to examine
  *
- *	LOCKING:
+ *	This is called before we actually start reading
+ *	and writing to the device, to configure certain
+ *	SCSI mid-layer behaviors.
  *
+ *	LOCKING:
+ *	Defined by SCSI layer.  We don't really care.
  */
 
 int ata_scsi_slave_config(struct scsi_device *sdev)
@@ -155,68 +199,47 @@ int ata_scsi_error(struct Scsi_Host *hos
 }
 
 /**
- *	ata_scsi_rw_xlat -
- *	@qc:
- *	@scsicmd:
- *	@cmd_size:
+ *	ata_scsi_rw_xlat - Translate SCSI r/w command into an ATA one
+ *	@qc: Storage for translated ATA taskfile
+ *	@scsicmd: SCSI command to translate
+ *
+ *	Converts any of six SCSI read/write commands into the
+ *	ATA counterpart, including starting sector (LBA),
+ *	sector count, and taking into account the device's LBA48
+ *	support.
+ *
+ *	Commands %READ_6, %READ_10, %READ_16, %WRITE_6, %WRITE_10, and
+ *	%WRITE_16 are currently supported.
  *
  *	LOCKING:
  *	spin_lock_irqsave(host_set lock)
  *
  *	RETURNS:
- *
+ *	Zero on success, non-zero on error.
  */
 
-static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, u8 *scsicmd,
-				   unsigned int cmd_size)
+static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, u8 *scsicmd)
 {
 	struct ata_taskfile *tf = &qc->tf;
 	unsigned int lba48 = tf->flags & ATA_TFLAG_LBA48;
-	unsigned int dma = qc->flags & ATA_QCFLAG_DMA;
 
-	qc->cursect = qc->cursg = qc->cursg_ofs = 0;
 	tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
 	tf->hob_nsect = 0;
 	tf->hob_lbal = 0;
 	tf->hob_lbam = 0;
 	tf->hob_lbah = 0;
+	tf->protocol = qc->dev->xfer_protocol;
+	tf->device |= ATA_LBA;
 
 	if (scsicmd[0] == READ_10 || scsicmd[0] == READ_6 ||
 	    scsicmd[0] == READ_16) {
-		if (likely(dma)) {
-			if (lba48)
-				tf->command = ATA_CMD_READ_EXT;
-			else
-				tf->command = ATA_CMD_READ;
-			tf->protocol = ATA_PROT_DMA_READ;
-		} else {
-			if (lba48)
-				tf->command = ATA_CMD_PIO_READ_EXT;
-			else
-				tf->command = ATA_CMD_PIO_READ;
-			tf->protocol = ATA_PROT_PIO_READ;
-		}
-		qc->flags &= ~ATA_QCFLAG_WRITE;
-		VPRINTK("reading\n");
+		tf->command = qc->dev->read_cmd;
 	} else {
-		if (likely(dma)) {
-			if (lba48)
-				tf->command = ATA_CMD_WRITE_EXT;
-			else
-				tf->command = ATA_CMD_WRITE;
-			tf->protocol = ATA_PROT_DMA_WRITE;
-		} else {
-			if (lba48)
-				tf->command = ATA_CMD_PIO_WRITE_EXT;
-			else
-				tf->command = ATA_CMD_PIO_WRITE;
-			tf->protocol = ATA_PROT_PIO_WRITE;
-		}
-		qc->flags |= ATA_QCFLAG_WRITE;
-		VPRINTK("writing\n");
+		tf->command = qc->dev->write_cmd;
+		tf->flags |= ATA_TFLAG_WRITE;
 	}
 
-	if (cmd_size == 10) {
+	if (scsicmd[0] == READ_10 || scsicmd[0] == WRITE_10) {
 		if (lba48) {
 			tf->hob_nsect = scsicmd[7];
 			tf->hob_lbal = scsicmd[2];
@@ -234,7 +257,6 @@ static unsigned int ata_scsi_rw_xlat(str
 
 			qc->nsect = scsicmd[8];
 		}
-		tf->device |= ATA_LBA;
 
 		tf->nsect = scsicmd[8];
 		tf->lbal = scsicmd[5];
@@ -245,19 +267,17 @@ static unsigned int ata_scsi_rw_xlat(str
 		return 0;
 	}
 
-	if (cmd_size == 6) {
+	if (scsicmd[0] == READ_6 || scsicmd[0] == WRITE_6) {
 		qc->nsect = tf->nsect = scsicmd[4];
 		tf->lbal = scsicmd[3];
 		tf->lbam = scsicmd[2];
 		tf->lbah = scsicmd[1] & 0x1f; /* mask out reserved bits */
 
-		tf->device |= ATA_LBA;
-
 		VPRINTK("six-byte command\n");
 		return 0;
 	}
 
-	if (cmd_size == 16) {
+	if (scsicmd[0] == READ_16 || scsicmd[0] == WRITE_16) {
 		/* rule out impossible LBAs and sector counts */
 		if (scsicmd[2] || scsicmd[3] || scsicmd[10] || scsicmd[11])
 			return 1;
@@ -281,7 +301,6 @@ static unsigned int ata_scsi_rw_xlat(str
 
 			qc->nsect = scsicmd[13];
 		}
-		tf->device |= ATA_LBA;
 
 		tf->nsect = scsicmd[13];
 		tf->lbal = scsicmd[9];
@@ -297,20 +316,27 @@ static unsigned int ata_scsi_rw_xlat(str
 }
 
 /**
- *	ata_scsi_rw_queue -
- *	@ap:
- *	@dev:
- *	@cmd:
- *	@done:
- *	@cmd_size:
+ *	ata_scsi_translate - Translate then issue SCSI command to ATA device
+ *	@ap: ATA port to which the command is addressed
+ *	@dev: ATA device to which the command is addressed
+ *	@cmd: SCSI command to execute
+ *	@done: SCSI command completion function
+ *
+ *	Our ->queuecommand() function has decided that the SCSI
+ *	command issued can be directly translated into an ATA
+ *	command, rather than handled internally.
+ *
+ *	This function sets up an ata_queued_cmd structure for the
+ *	SCSI command, and sends that ata_queued_cmd to the hardware.
  *
  *	LOCKING:
  *	spin_lock_irqsave(host_set lock)
  */
 
-void ata_scsi_rw_queue(struct ata_port *ap, struct ata_device *dev,
-		      struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *),
-		      unsigned int cmd_size)
+static void ata_scsi_translate(struct ata_port *ap, struct ata_device *dev,
+			      struct scsi_cmnd *cmd,
+			      void (*done)(struct scsi_cmnd *),
+			      ata_xlat_func_t xlat_func)
 {
 	struct ata_queued_cmd *qc;
 	u8 *scsicmd = cmd->cmnd;
@@ -327,9 +353,11 @@ void ata_scsi_rw_queue(struct ata_port *
 	if (!qc)
 		return;
 
-	qc->flags |= ATA_QCFLAG_SG;	/* data is present; dma-map it */
+	if (cmd->sc_data_direction == SCSI_DATA_READ ||
+	    cmd->sc_data_direction == SCSI_DATA_WRITE)
+		qc->flags |= ATA_QCFLAG_SG; /* data is present; dma-map it */
 
-	if (ata_scsi_rw_xlat(qc, scsicmd, cmd_size))
+	if (xlat_func(qc, scsicmd))
 		goto err_out;
 
 	/* select device, send command to hardware */
@@ -353,7 +381,6 @@ err_out:
  *
  *	LOCKING:
  *	spin_lock_irqsave(host_set lock)
- *	FIXME: kmap inside spin_lock_irqsave ok?
  *
  *	RETURNS:
  *	Length of response buffer.
@@ -368,7 +395,7 @@ static unsigned int ata_scsi_rbuf_get(st
 		struct scatterlist *sg;
 
 		sg = (struct scatterlist *) cmd->request_buffer;
-		buf = kmap(sg->page) + sg->offset;
+		buf = kmap_atomic(sg->page, KM_USER0) + sg->offset;
 		buflen = sg->length;
 	} else {
 		buf = cmd->request_buffer;
@@ -396,7 +423,7 @@ static inline void ata_scsi_rbuf_put(str
 		struct scatterlist *sg;
 
 		sg = (struct scatterlist *) cmd->request_buffer;
-		kunmap(sg->page);
+		kunmap_atomic(sg->page, KM_USER0);
 	}
 }
 
@@ -596,30 +623,6 @@ unsigned int ata_scsiop_noop(struct ata_
 }
 
 /**
- *	ata_scsiop_sync_cache - Simulate SYNCHRONIZE CACHE command
- *	@args: Port / device / SCSI command of interest.
- *	@rbuf: Response buffer, to which simulated SCSI cmd output is sent.
- *	@buflen: Response buffer length.
- *
- *	Initiates flush of device's cache.
- *
- *	TODO:
- *	Actually do this :)
- *
- *	LOCKING:
- *	spin_lock_irqsave(host_set lock)
- */
-
-unsigned int ata_scsiop_sync_cache(struct ata_scsi_args *args, u8 *rbuf,
-				  unsigned int buflen)
-{
-	VPRINTK("ENTER\n");
-
-	/* FIXME */
-	return 1;
-}
-
-/**
  *	ata_msense_push - Push data onto MODE SENSE data output buffer
  *	@ptr_io: (input/output) Location to store more output data
  *	@last: End of output data buffer
@@ -649,9 +652,9 @@ static void ata_msense_push(u8 **ptr_io,
 
 /**
  *	ata_msense_caching - Simulate MODE SENSE caching info page
- *	@dev:
- *	@ptr_io:
- *	@last:
+ *	@dev: Device associated with this MODE SENSE command
+ *	@ptr_io: (input/output) Location to store more output data
+ *	@last: End of output data buffer
  *
  *	Generate a caching info page, which conditionally indicates
  *	write caching to the SCSI layer, depending on device
@@ -674,9 +677,9 @@ static unsigned int ata_msense_caching(s
 
 /**
  *	ata_msense_ctl_mode - Simulate MODE SENSE control mode page
- *	@dev:
- *	@ptr_io:
- *	@last:
+ *	@dev: Device associated with this MODE SENSE command
+ *	@ptr_io: (input/output) Location to store more output data
+ *	@last: End of output data buffer
  *
  *	Generate a generic MODE SENSE control mode page.
  *
@@ -834,11 +837,15 @@ unsigned int ata_scsiop_report_luns(stru
 }
 
 /**
- *	ata_scsi_badcmd -
- *	@cmd:
- *	@done:
- *	@asc:
- *	@ascq:
+ *	ata_scsi_badcmd - End a SCSI request with an error
+ *	@cmd: SCSI request to be handled
+ *	@done: SCSI command completion function
+ *	@asc: SCSI-defined additional sense code
+ *	@ascq: SCSI-defined additional sense code qualifier
+ *
+ *	Helper function that completes a SCSI command with
+ *	%SAM_STAT_CHECK_CONDITION, with a sense key %ILLEGAL_REQUEST
+ *	and the specified additional sense codes.
  *
  *	LOCKING:
  *	spin_lock_irqsave(host_set lock)
@@ -912,7 +919,7 @@ static void atapi_scsi_queuecmd(struct a
 
 	qc->tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
 	if (cmd->sc_data_direction == SCSI_DATA_WRITE) {
-		qc->flags |= ATA_QCFLAG_WRITE;
+		qc->tf.flags |= ATA_TFLAG_WRITE;
 		DPRINTK("direction: write\n");
 	}
 
@@ -967,6 +974,99 @@ err_out:
 }
 
 /**
+ *	ata_scsi_find_dev - lookup ata_device from scsi_cmnd
+ *	@ap: ATA port to which the device is attached
+ *	@cmd: SCSI command to be sent to the device
+ *
+ *	Given various information provided in struct scsi_cmnd,
+ *	map that onto an ATA bus, and using that mapping
+ *	determine which ata_device is associated with the
+ *	SCSI command to be sent.
+ *
+ *	LOCKING:
+ *	spin_lock_irqsave(host_set lock)
+ *
+ *	RETURNS:
+ *	Associated ATA device, or %NULL if not found.
+ */
+
+static inline struct ata_device *
+ata_scsi_find_dev(struct ata_port *ap, struct scsi_cmnd *cmd)
+{
+	struct ata_device *dev;
+
+	/* skip commands not addressed to targets we simulate */
+	if (likely(cmd->device->id < ATA_MAX_DEVICES))
+		dev = &ap->device[cmd->device->id];
+	else
+		return NULL;
+
+	if (unlikely((cmd->device->channel != 0) ||
+		     (cmd->device->lun != 0)))
+		return NULL;
+
+	if (unlikely(!ata_dev_present(dev)))
+		return NULL;
+
+#ifndef ATA_ENABLE_ATAPI
+	if (unlikely(dev->class == ATA_DEV_ATAPI))
+		return NULL;
+#endif
+
+	return dev;
+}
+
+/**
+ *	ata_get_xlat_func - check if SCSI to ATA translation is possible
+ *	@cmd: SCSI command opcode to consider
+ *
+ *	Look up the SCSI command given, and determine whether the
+ *	SCSI command is to be translated or simulated.
+ *
+ *	RETURNS:
+ *	Pointer to translation function if possible, %NULL if not.
+ */
+
+static inline ata_xlat_func_t ata_get_xlat_func(u8 cmd)
+{
+	switch (cmd) {
+	case READ_6:
+	case READ_10:
+	case READ_16:
+
+	case WRITE_6:
+	case WRITE_10:
+	case WRITE_16:
+		return ata_scsi_rw_xlat;
+	}
+
+	return NULL;
+}
+
+/**
+ *	ata_scsi_dump_cdb - dump SCSI command contents to dmesg
+ *	@ap: ATA port to which the command was being sent
+ *	@cmd: SCSI command to dump
+ *
+ *	Prints the contents of a SCSI command via printk().
+ */
+
+static inline void ata_scsi_dump_cdb(struct ata_port *ap,
+				     struct scsi_cmnd *cmd)
+{
+#ifdef ATA_DEBUG
+	u8 *scsicmd = cmd->cmnd;
+
+	DPRINTK("CDB (%u:%d,%d,%d) %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
+		ap->id,
+		cmd->device->channel, cmd->device->id, cmd->device->lun,
+		scsicmd[0], scsicmd[1], scsicmd[2], scsicmd[3],
+		scsicmd[4], scsicmd[5], scsicmd[6], scsicmd[7],
+		scsicmd[8]);
+#endif
+}
+
+/**
  *	ata_scsi_queuecmd - Issue SCSI cdb to libata-managed device
  *	@cmd: SCSI command to be sent
  *	@done: Completion function, called when command is complete
@@ -987,83 +1087,54 @@ err_out:
 
 int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
 {
-	u8 *scsicmd = cmd->cmnd;
 	struct ata_port *ap;
 	struct ata_device *dev;
-	struct ata_scsi_args args;
-	const unsigned int atapi_support =
-#ifdef ATA_ENABLE_ATAPI
-					   1;
-#else
-					   0;
-#endif
-
-	/* Note: spin_lock_irqsave is held by caller... */
-	spin_unlock(cmd->device->host->host_lock);
 
 	ap = (struct ata_port *) &cmd->device->host->hostdata[0];
 
-	DPRINTK("CDB (%u:%d,%d,%d) %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
-		ap->id,
-		cmd->device->channel, cmd->device->id, cmd->device->lun,
-		scsicmd[0], scsicmd[1], scsicmd[2], scsicmd[3],
-		scsicmd[4], scsicmd[5], scsicmd[6], scsicmd[7],
-		scsicmd[8]);
+	ata_scsi_dump_cdb(ap, cmd);
 
-	/* skip commands not addressed to targets we care about */
-	if ((cmd->device->channel != 0) || (cmd->device->lun != 0) ||
-	    (cmd->device->id >= ATA_MAX_DEVICES)) {
-		cmd->result = (DID_BAD_TARGET << 16); /* FIXME: correct? */
-		done(cmd);
-		goto out;
-	}
-
-	spin_lock(&ap->host_set->lock);
-
-	dev = &ap->device[cmd->device->id];
-
-	if (!ata_dev_present(dev)) {
-		DPRINTK("no device\n");
-		cmd->result = (DID_BAD_TARGET << 16); /* FIXME: correct? */
+	dev = ata_scsi_find_dev(ap, cmd);
+	if (unlikely(!dev)) {
+		cmd->result = (DID_BAD_TARGET << 16);
 		done(cmd);
 		goto out_unlock;
 	}
 
-	if (dev->class == ATA_DEV_ATAPI) {
-		if (atapi_support)
-			atapi_scsi_queuecmd(ap, dev, cmd, done);
-		else {
-			cmd->result = (DID_BAD_TARGET << 16); /* correct? */
-			done(cmd);
-		}
-		goto out_unlock;
-	}
+	if (dev->class == ATA_DEV_ATA) {
+		ata_xlat_func_t xlat_func = ata_get_xlat_func(cmd->cmnd[0]);
 
-	/* fast path */
-	switch(scsicmd[0]) {
-		case READ_6:
-		case WRITE_6:
-			ata_scsi_rw_queue(ap, dev, cmd, done, 6);
-			goto out_unlock;
-
-		case READ_10:
-		case WRITE_10:
-			ata_scsi_rw_queue(ap, dev, cmd, done, 10);
-			goto out_unlock;
-
-		case READ_16:
-		case WRITE_16:
-			ata_scsi_rw_queue(ap, dev, cmd, done, 16);
-			goto out_unlock;
+		if (xlat_func)
+			ata_scsi_translate(ap, dev, cmd, done, xlat_func);
+		else
+			ata_scsi_simulate(ap, dev, cmd, done);
+	} else
+		atapi_scsi_queuecmd(ap, dev, cmd, done);
 
-		default:
-			/* do nothing */
-			break;
-	}
+out_unlock:
+	return 0;
+}
 
-	/*
-	 * slow path
-	 */
+/**
+ *	ata_scsi_simulate - simulate SCSI command on ATA device
+ *	@ap: Port to which ATA device is attached.
+ *	@dev: Target device for CDB.
+ *	@cmd: SCSI command being sent to device.
+ *	@done: SCSI command completion function.
+ *
+ *	Interprets and directly executes a select list of SCSI commands
+ *	that can be handled internally.
+ *
+ *	LOCKING:
+ *	spin_lock_irqsave(host_set lock)
+ */
+
+static void ata_scsi_simulate(struct ata_port *ap, struct ata_device *dev,
+			      struct scsi_cmnd *cmd,
+			      void (*done)(struct scsi_cmnd *))
+{
+	struct ata_scsi_args args;
+	u8 *scsicmd = cmd->cmnd;
 
 	args.ap = ap;
 	args.dev = dev;
@@ -1102,13 +1173,6 @@ int ata_scsi_queuecmd(struct scsi_cmnd *
 			ata_bad_cdb(cmd, done);
 			break;
 
-		case SYNCHRONIZE_CACHE:
-			if ((dev->flags & ATA_DFLAG_WCACHE) == 0)
-				ata_bad_scsiop(cmd, done);
-			else
-				ata_scsi_rbuf_fill(&args, ata_scsiop_sync_cache);
-			break;
-
 		case READ_CAPACITY:
 			ata_scsi_rbuf_fill(&args, ata_scsiop_read_cap);
 			break;
@@ -1132,11 +1196,5 @@ int ata_scsi_queuecmd(struct scsi_cmnd *
 			ata_bad_scsiop(cmd, done);
 			break;
 	}
-
-out_unlock:
-	spin_unlock(&ap->host_set->lock);
-out:
-	spin_lock(cmd->device->host->host_lock);
-	return 0;
 }
 
--- diff/drivers/scsi/libata.h	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/libata.h	2004-04-21 10:45:34.743421696 +0100
@@ -37,8 +37,8 @@ struct ata_scsi_args {
 
 
 /* libata-core.c */
-extern unsigned int ata_dev_id_string(struct ata_device *dev, unsigned char *s,
-                               unsigned int ofs, unsigned int len);
+extern void ata_dev_id_string(struct ata_device *dev, unsigned char *s,
+			      unsigned int ofs, unsigned int len);
 extern struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap,
 				      struct ata_device *dev);
 extern int ata_qc_issue(struct ata_queued_cmd *qc);
@@ -50,9 +50,6 @@ extern void ata_thread_wake(struct ata_p
 
 /* libata-scsi.c */
 extern void ata_to_sense_error(struct ata_queued_cmd *qc);
-extern void ata_scsi_rw_queue(struct ata_port *ap, struct ata_device *dev,
-		      struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *),
-		      unsigned int cmd_size);
 extern int ata_scsi_error(struct Scsi_Host *host);
 extern unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf,
 			       unsigned int buflen);
--- diff/drivers/scsi/pcmcia/nsp_debug.c	2003-08-26 10:00:54.000000000 +0100
+++ source/drivers/scsi/pcmcia/nsp_debug.c	2004-04-21 10:45:34.744421544 +0100
@@ -90,7 +90,7 @@ static void print_commandk (unsigned cha
 	int i, s;
 	printk(KERN_DEBUG);
 	print_opcodek(command[0]);
-	/*printk(KERN_DEBUG __FUNCTION__ " ");*/
+	/*printk(KERN_DEBUG "%s ", __FUNCTION__);*/
 	if ((command[0] >> 5) == 6 ||
 	    (command[0] >> 5) == 7 ) {
 		s = 12; /* vender specific */
--- diff/drivers/scsi/qla2xxx/Kconfig	2004-02-18 08:54:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/Kconfig	2004-04-21 10:45:34.744421544 +0100
@@ -6,18 +6,21 @@ config SCSI_QLA2XXX
 config SCSI_QLA21XX
 	tristate "QLogic ISP2100 host adapter family support"
 	depends on SCSI_QLA2XXX
+        select SCSI_FC_ATTRS
 	---help---
 	This driver supports the QLogic 21xx (ISP2100) host adapter family.
 
 config SCSI_QLA22XX
 	tristate "QLogic ISP2200 host adapter family support"
 	depends on SCSI_QLA2XXX
+        select SCSI_FC_ATTRS
 	---help---
 	This driver supports the QLogic 22xx (ISP2200) host adapter family.
 
 config SCSI_QLA2300
 	tristate "QLogic ISP2300 host adapter family support"
 	depends on SCSI_QLA2XXX
+        select SCSI_FC_ATTRS
 	---help---
 	This driver supports the QLogic 2300 (ISP2300, and ISP2312) host
 	adapter family.
@@ -25,17 +28,20 @@ config SCSI_QLA2300
 config SCSI_QLA2322
 	tristate "QLogic ISP2322 host adapter family support"
 	depends on SCSI_QLA2XXX
+        select SCSI_FC_ATTRS
 	---help---
 	This driver supports the QLogic 2322 (ISP2322) host adapter family.
 
 config SCSI_QLA6312
 	tristate "QLogic ISP6312 host adapter family support"
 	depends on SCSI_QLA2XXX
+        select SCSI_FC_ATTRS
 	---help---
 	This driver supports the QLogic 6312 (ISP6312) host adapter family.
 
 config SCSI_QLA6322
 	tristate "QLogic ISP6322 host adapter family support"
 	depends on SCSI_QLA2XXX
+        select SCSI_FC_ATTRS
 	---help---
 	This driver supports the QLogic 6322 (ISP6322) host adapter family.
--- diff/drivers/scsi/qla2xxx/ql2100.c	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/ql2100.c	2004-04-21 10:45:34.744421544 +0100
@@ -1,7 +1,7 @@
 /*
  * QLogic ISP2100 device driver for Linux 2.6.x
  * Copyright (C) 2003 Christoph Hellwig.
- * Copyright (C) 2003 QLogic Corporation (www.qlogic.com)
+ * Copyright (C) 2003-2004 QLogic Corporation (www.qlogic.com)
  *
  * Released under GPL v2.
  */
--- diff/drivers/scsi/qla2xxx/ql2100_fw.c	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/ql2100_fw.c	2004-04-21 10:45:34.748420936 +0100
@@ -2,7 +2,7 @@
  *                  QLOGIC LINUX SOFTWARE
  *
  * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation
+ * Copyright (C) 2003-2004 QLogic Corporation
  * (www.qlogic.com)
  *
  * This program is free software; you can redistribute it and/or modify it
--- diff/drivers/scsi/qla2xxx/ql2200.c	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/ql2200.c	2004-04-21 10:45:34.748420936 +0100
@@ -1,7 +1,7 @@
 /*
  * QLogic ISP2200 device driver for Linux 2.6.x
  * Copyright (C) 2003 Christoph Hellwig.
- * Copyright (C) 2003 QLogic Corporation (www.qlogic.com)
+ * Copyright (C) 2003-2004 QLogic Corporation (www.qlogic.com)
  *
  * Released under GPL v2.
  */
--- diff/drivers/scsi/qla2xxx/ql2200_fw.c	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/ql2200_fw.c	2004-04-21 10:45:34.752420328 +0100
@@ -2,7 +2,7 @@
  *                  QLOGIC LINUX SOFTWARE
  *
  * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation
+ * Copyright (C) 2003-2004 QLogic Corporation
  * (www.qlogic.com)
  *
  * This program is free software; you can redistribute it and/or modify it
--- diff/drivers/scsi/qla2xxx/ql2300.c	2004-02-18 08:54:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/ql2300.c	2004-04-21 10:45:34.753420176 +0100
@@ -1,7 +1,7 @@
 /*
  * QLogic ISP2300 device driver for Linux 2.6.x
  * Copyright (C) 2003 Christoph Hellwig.
- * Copyright (C) 2003 QLogic Corporation (www.qlogic.com)
+ * Copyright (C) 2003-2004 QLogic Corporation (www.qlogic.com)
  *
  * Released under GPL v2.
  */
--- diff/drivers/scsi/qla2xxx/ql2300_fw.c	2004-02-18 08:54:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/ql2300_fw.c	2004-04-21 10:45:34.788414856 +0100
@@ -2,7 +2,7 @@
  *                  QLOGIC LINUX SOFTWARE
  *
  * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation
+ * Copyright (C) 2003-2004 QLogic Corporation
  * (www.qlogic.com)
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -18,7 +18,7 @@
  *************************************************************************/
 
 /*
- *	Firmware Version 3.02.21 (16:31 Jan 19, 2004)
+ *	Firmware Version 3.02.26 (08:42 Mar 11, 2004)
  */
 
 #ifdef UNIQUE_FW_NAME
@@ -28,15 +28,15 @@ unsigned short risc_code_version = 3*102
 #endif
 
 #ifdef UNIQUE_FW_NAME
-unsigned char fw2300ipx_version_str[] = {3, 2,21};
+unsigned char fw2300ipx_version_str[] = {3, 2,26};
 #else
-unsigned char firmware_version[] = {3, 2,21};
+unsigned char firmware_version[] = {3, 2,26};
 #endif
 
 #ifdef UNIQUE_FW_NAME
-#define fw2300ipx_VERSION_STRING "3.02.21"
+#define fw2300ipx_VERSION_STRING "3.02.26"
 #else
-#define FW_VERSION_STRING "3.02.21"
+#define FW_VERSION_STRING "3.02.26"
 #endif
 
 #ifdef UNIQUE_FW_NAME
@@ -50,12 +50,12 @@ unsigned short fw2300ipx_code01[] = { 
 #else
 unsigned short risc_code01[] = { 
 #endif
-	0x0470, 0x0000, 0x0000, 0xe666, 0x0000, 0x0003, 0x0002, 0x0015,
+	0x0470, 0x0000, 0x0000, 0xe9a6, 0x0000, 0x0003, 0x0002, 0x001a,
 	0x0137, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030,
 	0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241,
 	0x5449, 0x4f4e, 0x2049, 0x5350, 0x3233, 0x3030, 0x2046, 0x6972,
 	0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030,
-	0x332e, 0x3032, 0x2e32, 0x3120, 0x2020, 0x2020, 0x2400, 0x20a9,
+	0x332e, 0x3032, 0x2e32, 0x3620, 0x2020, 0x2020, 0x2400, 0x20a9,
 	0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2200, 0x20a9, 0x000f,
 	0x2001, 0x0000, 0x400f, 0x2091, 0x2400, 0x20a9, 0x000f, 0x2001,
 	0x0000, 0x400f, 0x2091, 0x2600, 0x20a9, 0x000f, 0x2001, 0x0000,
@@ -64,175 +64,175 @@ unsigned short risc_code01[] = { 
 	0x2c00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2e00,
 	0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2000, 0x2001,
 	0x0000, 0x20c1, 0x0004, 0x20c9, 0x1bff, 0x2059, 0x0000, 0x2b78,
-	0x7883, 0x0004, 0x2089, 0x2bdb, 0x2051, 0x1800, 0x2a70, 0x20e1,
+	0x7883, 0x0004, 0x2089, 0x2d29, 0x2051, 0x1800, 0x2a70, 0x20e1,
 	0x0001, 0x20e9, 0x0001, 0x2009, 0x0000, 0x080c, 0x0e51, 0x2029,
 	0x4d00, 0x2031, 0xffff, 0x2039, 0x4cd0, 0x2021, 0x0200, 0x20e9,
 	0x0001, 0x20a1, 0x0000, 0x20a9, 0x0800, 0x900e, 0x4104, 0x20e9,
 	0x0001, 0x20a1, 0x1000, 0x900e, 0x2001, 0x0cc0, 0x9084, 0x0fff,
 	0x20a8, 0x4104, 0x2001, 0x0000, 0x9086, 0x0000, 0x0120, 0x21a8,
 	0x4104, 0x8001, 0x1de0, 0x756e, 0x7672, 0x776a, 0x7476, 0x747a,
-	0x00e6, 0x2071, 0x1abf, 0x2472, 0x00ee, 0x20a1, 0x1cd0, 0x7170,
+	0x00e6, 0x2071, 0x1ac8, 0x2472, 0x00ee, 0x20a1, 0x1cd0, 0x7170,
 	0x810d, 0x810d, 0x810d, 0x810d, 0x918c, 0x000f, 0x2001, 0x0001,
 	0x9112, 0x900e, 0x21a8, 0x4104, 0x8211, 0x1de0, 0x7170, 0x3400,
 	0x8001, 0x9102, 0x0120, 0x0218, 0x20a8, 0x900e, 0x4104, 0x2009,
 	0x1800, 0x810d, 0x810d, 0x810d, 0x810d, 0x810d, 0x918c, 0x001f,
 	0x2001, 0x0001, 0x9112, 0x20e9, 0x0001, 0x20a1, 0x0800, 0x900e,
-	0x20a9, 0x0800, 0x4104, 0x8211, 0x1dd8, 0x080c, 0x0f18, 0x080c,
-	0x5e06, 0x080c, 0xab01, 0x080c, 0x10cf, 0x080c, 0x12e4, 0x080c,
-	0x1afa, 0x080c, 0x0d69, 0x080c, 0x1054, 0x080c, 0x32d0, 0x080c,
-	0x7479, 0x080c, 0x675b, 0x080c, 0x8485, 0x080c, 0x81bc, 0x080c,
-	0x232a, 0x080c, 0x8d27, 0x080c, 0x7b3e, 0x080c, 0x2163, 0x080c,
-	0x2297, 0x080c, 0x231f, 0x2091, 0x3009, 0x7883, 0x0000, 0x1004,
+	0x20a9, 0x0800, 0x4104, 0x8211, 0x1dd8, 0x080c, 0x0f17, 0x080c,
+	0x6029, 0x080c, 0xaddd, 0x080c, 0x10ce, 0x080c, 0x12ed, 0x080c,
+	0x1ba4, 0x080c, 0x0d69, 0x080c, 0x1053, 0x080c, 0x341e, 0x080c,
+	0x76ac, 0x080c, 0x698e, 0x080c, 0x86cd, 0x080c, 0x8401, 0x080c,
+	0x2478, 0x080c, 0x8f6f, 0x080c, 0x7d76, 0x080c, 0x22b1, 0x080c,
+	0x23e5, 0x080c, 0x246d, 0x2091, 0x3009, 0x7883, 0x0000, 0x1004,
 	0x091f, 0x7880, 0x9086, 0x0002, 0x1190, 0x7883, 0x4000, 0x7837,
 	0x4000, 0x7833, 0x0010, 0x0e04, 0x0913, 0x2091, 0x5000, 0x2091,
-	0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1192, 0x2071,
+	0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x119b, 0x2071,
 	0x1800, 0x7003, 0x0000, 0x2071, 0x1800, 0x7000, 0x908e, 0x0003,
-	0x1178, 0x080c, 0x49c0, 0x080c, 0x32f7, 0x080c, 0x74ea, 0x080c,
-	0x6c9c, 0x080c, 0x8563, 0x080c, 0x81e5, 0x080c, 0x2b45, 0x0c58,
+	0x1178, 0x080c, 0x4bca, 0x080c, 0x3445, 0x080c, 0x771d, 0x080c,
+	0x6ecf, 0x080c, 0x87ab, 0x080c, 0x842a, 0x080c, 0x2c93, 0x0c58,
 	0x000b, 0x0c78, 0x0944, 0x0945, 0x0ae7, 0x0942, 0x0bae, 0x0d68,
 	0x0d68, 0x0d68, 0x080c, 0x0dd5, 0x0005, 0x0126, 0x00f6, 0x2091,
-	0x8000, 0x7000, 0x9086, 0x0001, 0x1904, 0x0aba, 0x080c, 0x54c6,
+	0x8000, 0x7000, 0x9086, 0x0001, 0x1904, 0x0aba, 0x080c, 0x56df,
 	0x1130, 0x0026, 0x2011, 0x0080, 0x080c, 0x0edf, 0x002e, 0x080c,
-	0x717d, 0x0150, 0x080c, 0x71a0, 0x15a0, 0x2079, 0x0100, 0x7828,
-	0x9085, 0x1800, 0x782a, 0x0468, 0x080c, 0x70af, 0x7000, 0x9086,
+	0x73b0, 0x0150, 0x080c, 0x73d3, 0x15a0, 0x2079, 0x0100, 0x7828,
+	0x9085, 0x1800, 0x782a, 0x0468, 0x080c, 0x72e2, 0x7000, 0x9086,
 	0x0001, 0x1904, 0x0aba, 0x7098, 0x9086, 0x0028, 0x1904, 0x0aba,
-	0x080c, 0x81b4, 0x080c, 0x81a6, 0x2001, 0x0161, 0x2003, 0x0001,
+	0x080c, 0x83f9, 0x080c, 0x83eb, 0x2001, 0x0161, 0x2003, 0x0001,
 	0x2079, 0x0100, 0x7827, 0xffff, 0x7a28, 0x9295, 0x5e2f, 0x7a2a,
-	0x2011, 0x7013, 0x080c, 0x8285, 0x2011, 0x7006, 0x080c, 0x835c,
-	0x2011, 0x5c61, 0x080c, 0x8285, 0x2011, 0x8030, 0x901e, 0x7396,
-	0x04d0, 0x080c, 0x550e, 0x2079, 0x0100, 0x7844, 0x9005, 0x1904,
-	0x0aba, 0x2011, 0x5c61, 0x080c, 0x8285, 0x2011, 0x7013, 0x080c,
-	0x8285, 0x2011, 0x7006, 0x080c, 0x835c, 0x2001, 0x0265, 0x2001,
+	0x2011, 0x7246, 0x080c, 0x84ca, 0x2011, 0x7239, 0x080c, 0x85a4,
+	0x2011, 0x5e84, 0x080c, 0x84ca, 0x2011, 0x8030, 0x901e, 0x7396,
+	0x04d0, 0x080c, 0x5731, 0x2079, 0x0100, 0x7844, 0x9005, 0x1904,
+	0x0aba, 0x2011, 0x5e84, 0x080c, 0x84ca, 0x2011, 0x7246, 0x080c,
+	0x84ca, 0x2011, 0x7239, 0x080c, 0x85a4, 0x2001, 0x0265, 0x2001,
 	0x0205, 0x2003, 0x0000, 0x7840, 0x9084, 0xfffb, 0x7842, 0x2001,
-	0x19a4, 0x2004, 0x9005, 0x1140, 0x00c6, 0x2061, 0x0100, 0x080c,
-	0x5dae, 0x00ce, 0x0804, 0x0aba, 0x780f, 0x006b, 0x7a28, 0x080c,
-	0x7185, 0x0118, 0x9295, 0x5e2f, 0x0010, 0x9295, 0x402f, 0x7a2a,
-	0x2011, 0x8010, 0x73d8, 0x2001, 0x19a5, 0x2003, 0x0001, 0x080c,
-	0x2a0b, 0x080c, 0x48fb, 0x7248, 0xc284, 0x724a, 0x2001, 0x180c,
-	0x200c, 0xc1ac, 0xc1cc, 0x2102, 0x080c, 0xa213, 0x2011, 0x0004,
-	0x080c, 0xc835, 0x080c, 0x65f0, 0x080c, 0x717d, 0x1120, 0x080c,
-	0x2a4f, 0x02e0, 0x0400, 0x080c, 0x5db5, 0x0140, 0x7097, 0x0001,
-	0x70d3, 0x0000, 0x080c, 0x56db, 0x0804, 0x0aba, 0x080c, 0x54b7,
+	0x19a6, 0x2004, 0x9005, 0x1140, 0x00c6, 0x2061, 0x0100, 0x080c,
+	0x5fd1, 0x00ce, 0x0804, 0x0aba, 0x780f, 0x006b, 0x7a28, 0x080c,
+	0x73b8, 0x0118, 0x9295, 0x5e2f, 0x0010, 0x9295, 0x402f, 0x7a2a,
+	0x2011, 0x8010, 0x73d8, 0x2001, 0x19a7, 0x2003, 0x0001, 0x080c,
+	0x2b59, 0x080c, 0x4b05, 0x7248, 0xc284, 0x724a, 0x2001, 0x180c,
+	0x200c, 0xc1ac, 0xc1cc, 0x2102, 0x080c, 0xa503, 0x2011, 0x0004,
+	0x080c, 0xcb2b, 0x080c, 0x6823, 0x080c, 0x73b0, 0x1120, 0x080c,
+	0x2b9d, 0x02e0, 0x0400, 0x080c, 0x5fd8, 0x0140, 0x7097, 0x0001,
+	0x70d3, 0x0000, 0x080c, 0x58fe, 0x0804, 0x0aba, 0x080c, 0x56d0,
 	0xd094, 0x0188, 0x2011, 0x180c, 0x2204, 0xc0cd, 0x2012, 0x080c,
-	0x54bb, 0xd0d4, 0x1118, 0x080c, 0x2a4f, 0x1270, 0x2011, 0x180c,
-	0x2204, 0xc0bc, 0x00a8, 0x080c, 0x54bb, 0xd0d4, 0x1db8, 0x2011,
+	0x56d4, 0xd0d4, 0x1118, 0x080c, 0x2b9d, 0x1270, 0x2011, 0x180c,
+	0x2204, 0xc0bc, 0x00a8, 0x080c, 0x56d4, 0xd0d4, 0x1db8, 0x2011,
 	0x180c, 0x2204, 0xc0bd, 0x0060, 0x2011, 0x180c, 0x2204, 0xc0bd,
-	0x2012, 0x080c, 0x672f, 0x1128, 0xd0a4, 0x0118, 0x2204, 0xc0fd,
-	0x2012, 0x080c, 0x66f5, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, 0x00a8,
-	0x707f, 0x0000, 0x080c, 0x717d, 0x1130, 0x70b0, 0x9005, 0x1168,
-	0x080c, 0xcc6a, 0x0050, 0x080c, 0xcc6a, 0x70dc, 0xd09c, 0x1128,
-	0x70b0, 0x9005, 0x0110, 0x080c, 0x5d8b, 0x70e7, 0x0000, 0x70e3,
-	0x0000, 0x70a7, 0x0000, 0x080c, 0x2a57, 0x0228, 0x2011, 0x0101,
-	0x2204, 0xc0c4, 0x2012, 0x72dc, 0x080c, 0x717d, 0x1178, 0x9016,
-	0x0016, 0x080c, 0x2808, 0x2019, 0x196d, 0x211a, 0x001e, 0x705f,
+	0x2012, 0x080c, 0x6962, 0x1128, 0xd0a4, 0x0118, 0x2204, 0xc0fd,
+	0x2012, 0x080c, 0x6928, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, 0x00a8,
+	0x707f, 0x0000, 0x080c, 0x73b0, 0x1130, 0x70b0, 0x9005, 0x1168,
+	0x080c, 0xcf67, 0x0050, 0x080c, 0xcf67, 0x70dc, 0xd09c, 0x1128,
+	0x70b0, 0x9005, 0x0110, 0x080c, 0x5fae, 0x70e7, 0x0000, 0x70e3,
+	0x0000, 0x70a7, 0x0000, 0x080c, 0x2ba5, 0x0228, 0x2011, 0x0101,
+	0x2204, 0xc0c4, 0x2012, 0x72dc, 0x080c, 0x73b0, 0x1178, 0x9016,
+	0x0016, 0x080c, 0x2956, 0x2019, 0x196d, 0x211a, 0x001e, 0x705f,
 	0xffff, 0x7063, 0x00ef, 0x7083, 0x0000, 0x0020, 0x2019, 0x196d,
 	0x201b, 0x0000, 0x2079, 0x1847, 0x7804, 0xd0ac, 0x0108, 0xc295,
-	0x72de, 0x080c, 0x717d, 0x0118, 0x9296, 0x0004, 0x0548, 0x2011,
-	0x0001, 0x080c, 0xc835, 0x70ab, 0x0000, 0x70af, 0xffff, 0x7003,
+	0x72de, 0x080c, 0x73b0, 0x0118, 0x9296, 0x0004, 0x0548, 0x2011,
+	0x0001, 0x080c, 0xcb2b, 0x70ab, 0x0000, 0x70af, 0xffff, 0x7003,
 	0x0002, 0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0x9085, 0x0003,
-	0x782a, 0x00fe, 0x080c, 0x2e48, 0x2011, 0x0005, 0x080c, 0xa349,
-	0x080c, 0x941c, 0x080c, 0x717d, 0x0148, 0x00c6, 0x2061, 0x0100,
-	0x0016, 0x080c, 0x2808, 0x61e2, 0x001e, 0x00ce, 0x012e, 0x0420,
+	0x782a, 0x00fe, 0x080c, 0x2f96, 0x2011, 0x0005, 0x080c, 0xa639,
+	0x080c, 0x9664, 0x080c, 0x73b0, 0x0148, 0x00c6, 0x2061, 0x0100,
+	0x0016, 0x080c, 0x2956, 0x61e2, 0x001e, 0x00ce, 0x012e, 0x0420,
 	0x70ab, 0x0000, 0x70af, 0xffff, 0x7003, 0x0002, 0x00f6, 0x2079,
 	0x0100, 0x7827, 0x0003, 0x7828, 0x9085, 0x0003, 0x782a, 0x00fe,
-	0x2011, 0x0005, 0x080c, 0xa349, 0x080c, 0x941c, 0x080c, 0x717d,
-	0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, 0x2808, 0x61e2,
+	0x2011, 0x0005, 0x080c, 0xa639, 0x080c, 0x9664, 0x080c, 0x73b0,
+	0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, 0x2956, 0x61e2,
 	0x001e, 0x00ce, 0x00fe, 0x012e, 0x0005, 0x00c6, 0x00b6, 0x080c,
-	0x717d, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c,
-	0x717d, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, 0x86ff, 0x0138,
+	0x73b0, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c,
+	0x73b0, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, 0x86ff, 0x0138,
 	0x9180, 0x1000, 0x2004, 0x905d, 0x0110, 0xb800, 0xd0bc, 0x090c,
-	0x3166, 0x8108, 0x1f04, 0x0ace, 0x707f, 0x0000, 0x7080, 0x9084,
+	0x32b4, 0x8108, 0x1f04, 0x0ace, 0x707f, 0x0000, 0x7080, 0x9084,
 	0x00ff, 0x7082, 0x70b3, 0x0000, 0x00be, 0x00ce, 0x0005, 0x00b6,
 	0x0126, 0x2091, 0x8000, 0x7000, 0x9086, 0x0002, 0x1904, 0x0bab,
-	0x70ac, 0x9086, 0xffff, 0x0130, 0x080c, 0x2e48, 0x080c, 0x941c,
+	0x70ac, 0x9086, 0xffff, 0x0130, 0x080c, 0x2f96, 0x080c, 0x9664,
 	0x0804, 0x0bab, 0x70dc, 0xd0ac, 0x1110, 0xd09c, 0x0558, 0xd084,
 	0x0548, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, 0x000e, 0xd08c,
-	0x0508, 0x080c, 0x31c9, 0x11d0, 0x70e0, 0x9086, 0xffff, 0x01b0,
-	0x080c, 0x2fda, 0x080c, 0x941c, 0x70dc, 0xd094, 0x1904, 0x0bab,
-	0x2011, 0x0001, 0x080c, 0xcf18, 0x0110, 0x2011, 0x0003, 0x901e,
-	0x080c, 0x3014, 0x080c, 0x941c, 0x0804, 0x0bab, 0x70e4, 0x9005,
+	0x0508, 0x080c, 0x3317, 0x11d0, 0x70e0, 0x9086, 0xffff, 0x01b0,
+	0x080c, 0x3128, 0x080c, 0x9664, 0x70dc, 0xd094, 0x1904, 0x0bab,
+	0x2011, 0x0001, 0x080c, 0xd216, 0x0110, 0x2011, 0x0003, 0x901e,
+	0x080c, 0x3162, 0x080c, 0x9664, 0x0804, 0x0bab, 0x70e4, 0x9005,
 	0x1904, 0x0bab, 0x70a8, 0x9005, 0x1904, 0x0bab, 0x70dc, 0xd0a4,
-	0x0118, 0xd0b4, 0x0904, 0x0bab, 0x080c, 0x66f5, 0x1904, 0x0bab,
-	0x080c, 0x6748, 0x1904, 0x0bab, 0x080c, 0x672f, 0x01c0, 0x0156,
-	0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x63cd, 0x1118,
+	0x0118, 0xd0b4, 0x0904, 0x0bab, 0x080c, 0x6928, 0x1904, 0x0bab,
+	0x080c, 0x697b, 0x1904, 0x0bab, 0x080c, 0x6962, 0x01c0, 0x0156,
+	0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x6600, 0x1118,
 	0xb800, 0xd0ec, 0x1138, 0x001e, 0x8108, 0x1f04, 0x0b44, 0x00ce,
 	0x015e, 0x0028, 0x001e, 0x00ce, 0x015e, 0x0804, 0x0bab, 0x0006,
-	0x2001, 0x0103, 0x2003, 0x002b, 0x000e, 0x2011, 0x19b1, 0x080c,
-	0x0f88, 0x2011, 0x19cb, 0x080c, 0x0f88, 0x7030, 0xc08c, 0x7032,
-	0x7003, 0x0003, 0x70af, 0xffff, 0x080c, 0x54c6, 0x1130, 0x0026,
-	0x2011, 0x0040, 0x080c, 0x0edf, 0x002e, 0x9006, 0x080c, 0x269c,
-	0x080c, 0x31c9, 0x0118, 0x080c, 0x4a98, 0x0050, 0x0036, 0x0046,
-	0x2019, 0xffff, 0x2021, 0x0006, 0x080c, 0x4ab2, 0x004e, 0x003e,
-	0x00f6, 0x2079, 0x0100, 0x080c, 0x71a0, 0x0150, 0x080c, 0x717d,
+	0x2001, 0x0103, 0x2003, 0x002b, 0x000e, 0x2011, 0x19b3, 0x080c,
+	0x0f87, 0x2011, 0x19cd, 0x080c, 0x0f87, 0x7030, 0xc08c, 0x7032,
+	0x7003, 0x0003, 0x70af, 0xffff, 0x080c, 0x56df, 0x1130, 0x0026,
+	0x2011, 0x0040, 0x080c, 0x0edf, 0x002e, 0x9006, 0x080c, 0x27ea,
+	0x080c, 0x3317, 0x0118, 0x080c, 0x4ca2, 0x0050, 0x0036, 0x0046,
+	0x2019, 0xffff, 0x2021, 0x0006, 0x080c, 0x4cbc, 0x004e, 0x003e,
+	0x00f6, 0x2079, 0x0100, 0x080c, 0x73d3, 0x0150, 0x080c, 0x73b0,
 	0x7828, 0x0118, 0x9084, 0xe1ff, 0x0010, 0x9084, 0xffdf, 0x782a,
-	0x00fe, 0x2001, 0x19e6, 0x2004, 0x9086, 0x0005, 0x1120, 0x2011,
-	0x0000, 0x080c, 0xa349, 0x2011, 0x0000, 0x080c, 0xa353, 0x080c,
-	0x941c, 0x080c, 0x9548, 0x012e, 0x00be, 0x0005, 0x0016, 0x0046,
+	0x00fe, 0x2001, 0x19e8, 0x2004, 0x9086, 0x0005, 0x1120, 0x2011,
+	0x0000, 0x080c, 0xa639, 0x2011, 0x0000, 0x080c, 0xa643, 0x080c,
+	0x9664, 0x080c, 0x9790, 0x012e, 0x00be, 0x0005, 0x0016, 0x0046,
 	0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, 0x7904, 0x918c,
-	0xfffd, 0x7906, 0x2009, 0x00f7, 0x080c, 0x5d74, 0x7940, 0x918c,
+	0xfffd, 0x7906, 0x2009, 0x00f7, 0x080c, 0x5f97, 0x7940, 0x918c,
 	0x0010, 0x7942, 0x7924, 0xd1b4, 0x0110, 0x7827, 0x0040, 0xd19c,
 	0x0110, 0x7827, 0x0008, 0x0006, 0x0036, 0x0156, 0x7954, 0xd1ac,
-	0x1904, 0x0c3b, 0x2001, 0x19a5, 0x2004, 0x9005, 0x1518, 0x080c,
-	0x2ad2, 0x1148, 0x2001, 0x0001, 0x080c, 0x2a3a, 0x2001, 0x0001,
-	0x080c, 0x2a1d, 0x00b8, 0x080c, 0x2ada, 0x1138, 0x9006, 0x080c,
-	0x2a3a, 0x9006, 0x080c, 0x2a1d, 0x0068, 0x080c, 0x2ae2, 0x1d50,
-	0x2001, 0x1996, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, 0x2834,
-	0x0804, 0x0d1a, 0x080c, 0x718e, 0x0148, 0x080c, 0x71a0, 0x1118,
-	0x080c, 0x7474, 0x0050, 0x080c, 0x7185, 0x0dd0, 0x080c, 0x746f,
-	0x080c, 0x7465, 0x080c, 0x70af, 0x0058, 0x080c, 0x717d, 0x0140,
-	0x2009, 0x00f8, 0x080c, 0x5d74, 0x7843, 0x0090, 0x7843, 0x0010,
-	0x20a9, 0x09c4, 0x7820, 0xd09c, 0x1138, 0x080c, 0x717d, 0x0138,
+	0x1904, 0x0c3b, 0x2001, 0x19a7, 0x2004, 0x9005, 0x1518, 0x080c,
+	0x2c20, 0x1148, 0x2001, 0x0001, 0x080c, 0x2b88, 0x2001, 0x0001,
+	0x080c, 0x2b6b, 0x00b8, 0x080c, 0x2c28, 0x1138, 0x9006, 0x080c,
+	0x2b88, 0x9006, 0x080c, 0x2b6b, 0x0068, 0x080c, 0x2c30, 0x1d50,
+	0x2001, 0x1998, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, 0x2982,
+	0x0804, 0x0d1a, 0x080c, 0x73c1, 0x0148, 0x080c, 0x73d3, 0x1118,
+	0x080c, 0x76a7, 0x0050, 0x080c, 0x73b8, 0x0dd0, 0x080c, 0x76a2,
+	0x080c, 0x7698, 0x080c, 0x72e2, 0x0058, 0x080c, 0x73b0, 0x0140,
+	0x2009, 0x00f8, 0x080c, 0x5f97, 0x7843, 0x0090, 0x7843, 0x0010,
+	0x20a9, 0x09c4, 0x7820, 0xd09c, 0x1138, 0x080c, 0x73b0, 0x0138,
 	0x7824, 0xd0ac, 0x1904, 0x0d1f, 0x1f04, 0x0c1a, 0x0070, 0x7824,
-	0x080c, 0x7197, 0x0118, 0xd0ac, 0x1904, 0x0d1f, 0x9084, 0x1800,
+	0x080c, 0x73ca, 0x0118, 0xd0ac, 0x1904, 0x0d1f, 0x9084, 0x1800,
 	0x0d98, 0x7003, 0x0001, 0x0804, 0x0d1f, 0x2001, 0x0001, 0x080c,
-	0x269c, 0x0804, 0x0d32, 0x2001, 0x19a5, 0x2004, 0x9005, 0x1518,
-	0x080c, 0x2ad2, 0x1148, 0x2001, 0x0001, 0x080c, 0x2a3a, 0x2001,
-	0x0001, 0x080c, 0x2a1d, 0x00b8, 0x080c, 0x2ada, 0x1138, 0x9006,
-	0x080c, 0x2a3a, 0x9006, 0x080c, 0x2a1d, 0x0068, 0x080c, 0x2ae2,
-	0x1d50, 0x2001, 0x1996, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c,
-	0x2834, 0x0804, 0x0d1a, 0x7850, 0x9085, 0x0040, 0x7852, 0x7938,
-	0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, 0x2aea, 0x9085, 0x2000,
-	0x7852, 0x793a, 0x20a9, 0x0046, 0x1d04, 0x0c74, 0x080c, 0x833c,
+	0x27ea, 0x0804, 0x0d32, 0x2001, 0x19a7, 0x2004, 0x9005, 0x1518,
+	0x080c, 0x2c20, 0x1148, 0x2001, 0x0001, 0x080c, 0x2b88, 0x2001,
+	0x0001, 0x080c, 0x2b6b, 0x00b8, 0x080c, 0x2c28, 0x1138, 0x9006,
+	0x080c, 0x2b88, 0x9006, 0x080c, 0x2b6b, 0x0068, 0x080c, 0x2c30,
+	0x1d50, 0x2001, 0x1998, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c,
+	0x2982, 0x0804, 0x0d1a, 0x7850, 0x9085, 0x0040, 0x7852, 0x7938,
+	0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, 0x2c38, 0x9085, 0x2000,
+	0x7852, 0x793a, 0x20a9, 0x0046, 0x1d04, 0x0c74, 0x080c, 0x8584,
 	0x1f04, 0x0c74, 0x7850, 0x9085, 0x0400, 0x9084, 0xdfbf, 0x7852,
-	0x793a, 0x080c, 0x718e, 0x0148, 0x080c, 0x71a0, 0x1118, 0x080c,
-	0x7474, 0x0050, 0x080c, 0x7185, 0x0dd0, 0x080c, 0x746f, 0x080c,
-	0x7465, 0x080c, 0x70af, 0x0020, 0x2009, 0x00f8, 0x080c, 0x5d74,
+	0x793a, 0x080c, 0x73c1, 0x0148, 0x080c, 0x73d3, 0x1118, 0x080c,
+	0x76a7, 0x0050, 0x080c, 0x73b8, 0x0dd0, 0x080c, 0x76a2, 0x080c,
+	0x7698, 0x080c, 0x72e2, 0x0020, 0x2009, 0x00f8, 0x080c, 0x5f97,
 	0x20a9, 0x0028, 0xa001, 0x1f04, 0x0c9a, 0x7850, 0x9085, 0x1400,
-	0x7852, 0x080c, 0x717d, 0x0120, 0x7843, 0x0090, 0x7843, 0x0010,
-	0x2021, 0xe678, 0x2019, 0xea60, 0x0d0c, 0x833c, 0x7820, 0xd09c,
-	0x1580, 0x080c, 0x717d, 0x0904, 0x0cff, 0x7824, 0xd0ac, 0x1904,
-	0x0d1f, 0x080c, 0x71a0, 0x1528, 0x0046, 0x2021, 0x0320, 0x8421,
-	0x1df0, 0x004e, 0x7827, 0x1800, 0x080c, 0x2aea, 0x7824, 0x9084,
+	0x7852, 0x080c, 0x73b0, 0x0120, 0x7843, 0x0090, 0x7843, 0x0010,
+	0x2021, 0xe678, 0x2019, 0xea60, 0x0d0c, 0x8584, 0x7820, 0xd09c,
+	0x1580, 0x080c, 0x73b0, 0x0904, 0x0cff, 0x7824, 0xd0ac, 0x1904,
+	0x0d1f, 0x080c, 0x73d3, 0x1528, 0x0046, 0x2021, 0x0320, 0x8421,
+	0x1df0, 0x004e, 0x7827, 0x1800, 0x080c, 0x2c38, 0x7824, 0x9084,
 	0x1800, 0x1160, 0x9484, 0x0fff, 0x1138, 0x2001, 0x1810, 0x2004,
 	0xd0fc, 0x0110, 0x080c, 0x0d45, 0x8421, 0x1158, 0x1d04, 0x0cda,
-	0x080c, 0x833c, 0x080c, 0x746f, 0x080c, 0x7465, 0x7003, 0x0001,
-	0x04f0, 0x8319, 0x1948, 0x1d04, 0x0ce7, 0x080c, 0x833c, 0x2009,
-	0x1999, 0x2104, 0x9005, 0x0118, 0x8001, 0x200a, 0x1178, 0x200b,
-	0x000a, 0x7827, 0x0048, 0x20a9, 0x0002, 0x080c, 0x2acb, 0x7924,
-	0x080c, 0x2aea, 0xd19c, 0x0110, 0x080c, 0x2a0b, 0x00d8, 0x080c,
-	0x718e, 0x1140, 0x94a2, 0x03e8, 0x1128, 0x080c, 0x7155, 0x7003,
-	0x0001, 0x00a8, 0x7827, 0x1800, 0x080c, 0x2aea, 0x7824, 0x080c,
-	0x7197, 0x0110, 0xd0ac, 0x1158, 0x9084, 0x1800, 0x0950, 0x7003,
-	0x0001, 0x0028, 0x2001, 0x0001, 0x080c, 0x269c, 0x0078, 0x2009,
+	0x080c, 0x8584, 0x080c, 0x76a2, 0x080c, 0x7698, 0x7003, 0x0001,
+	0x04f0, 0x8319, 0x1948, 0x1d04, 0x0ce7, 0x080c, 0x8584, 0x2009,
+	0x199b, 0x2104, 0x9005, 0x0118, 0x8001, 0x200a, 0x1178, 0x200b,
+	0x000a, 0x7827, 0x0048, 0x20a9, 0x0002, 0x080c, 0x2c19, 0x7924,
+	0x080c, 0x2c38, 0xd19c, 0x0110, 0x080c, 0x2b59, 0x00d8, 0x080c,
+	0x73c1, 0x1140, 0x94a2, 0x03e8, 0x1128, 0x080c, 0x7388, 0x7003,
+	0x0001, 0x00a8, 0x7827, 0x1800, 0x080c, 0x2c38, 0x7824, 0x080c,
+	0x73ca, 0x0110, 0xd0ac, 0x1158, 0x9084, 0x1800, 0x0950, 0x7003,
+	0x0001, 0x0028, 0x2001, 0x0001, 0x080c, 0x27ea, 0x0078, 0x2009,
 	0x180c, 0x210c, 0xd19c, 0x1120, 0x7904, 0x918d, 0x0002, 0x7906,
 	0x7827, 0x0048, 0x7828, 0x9085, 0x0028, 0x782a, 0x7850, 0x9085,
-	0x0400, 0x7852, 0x2001, 0x19a5, 0x2003, 0x0000, 0x9006, 0x78f2,
-	0x015e, 0x003e, 0x000e, 0x080c, 0x54c6, 0x1110, 0x080c, 0x0e62,
+	0x0400, 0x7852, 0x2001, 0x19a7, 0x2003, 0x0000, 0x9006, 0x78f2,
+	0x015e, 0x003e, 0x000e, 0x080c, 0x56df, 0x1110, 0x080c, 0x0e62,
 	0x012e, 0x00fe, 0x004e, 0x001e, 0x0005, 0x0006, 0x0016, 0x0036,
 	0x0046, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0069,
-	0x0d0c, 0x833c, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be,
+	0x0d0c, 0x8584, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be,
 	0x004e, 0x003e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x189e,
-	0x7004, 0x9086, 0x0001, 0x1110, 0x080c, 0x32f7, 0x00ee, 0x0005,
-	0x0005, 0x2a70, 0x2061, 0x19a9, 0x2063, 0x0003, 0x6007, 0x0002,
-	0x600b, 0x0015, 0x600f, 0x0137, 0x2001, 0x197c, 0x900e, 0x2102,
+	0x7004, 0x9086, 0x0001, 0x1110, 0x080c, 0x3445, 0x00ee, 0x0005,
+	0x0005, 0x2a70, 0x2061, 0x19ab, 0x2063, 0x0003, 0x6007, 0x0002,
+	0x600b, 0x001a, 0x600f, 0x0137, 0x2001, 0x197c, 0x900e, 0x2102,
 	0x7196, 0x2001, 0x0100, 0x2004, 0x9082, 0x0002, 0x0218, 0x705f,
 	0xffff, 0x0008, 0x715e, 0x7067, 0xffff, 0x717e, 0x7182, 0x080c,
-	0xcc6a, 0x2061, 0x196c, 0x6003, 0x0909, 0x6106, 0x600b, 0x8800,
+	0xcf67, 0x2061, 0x196c, 0x6003, 0x0909, 0x6106, 0x600b, 0x8800,
 	0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x001f, 0x611a, 0x601f,
 	0x07d0, 0x2061, 0x1974, 0x6003, 0x8000, 0x6106, 0x610a, 0x600f,
 	0x0200, 0x6013, 0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, 0x2061,
-	0x1987, 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f,
-	0x2020, 0x2001, 0x182c, 0x2102, 0x0005, 0x9016, 0x080c, 0x63cd,
+	0x1989, 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f,
+	0x2020, 0x2001, 0x182c, 0x2102, 0x0005, 0x9016, 0x080c, 0x6600,
 	0x1178, 0xb804, 0x90c4, 0x00ff, 0x98c6, 0x0006, 0x0128, 0x90c4,
 	0xff00, 0x98c6, 0x0600, 0x1120, 0x9186, 0x0080, 0x0108, 0x8210,
 	0x8108, 0x9186, 0x0800, 0x1d50, 0x2208, 0x0005, 0x2091, 0x8000,
@@ -240,22 +240,22 @@ unsigned short risc_code01[] = { 
 	0x0dd7, 0x0006, 0x0016, 0x2001, 0x8002, 0x0006, 0x2079, 0x0000,
 	0x000e, 0x7882, 0x7836, 0x001e, 0x798e, 0x000e, 0x788a, 0x000e,
 	0x7886, 0x3900, 0x789a, 0x7833, 0x0012, 0x2091, 0x5000, 0x0156,
-	0x00d6, 0x0036, 0x0026, 0x2079, 0x0300, 0x2069, 0x1a99, 0x7a08,
-	0x226a, 0x2069, 0x1a9a, 0x7a18, 0x226a, 0x8d68, 0x7a1c, 0x226a,
-	0x782c, 0x2019, 0x1aa7, 0x201a, 0x2019, 0x1aaa, 0x9016, 0x7808,
-	0xd09c, 0x0168, 0x7820, 0x201a, 0x8210, 0x8318, 0x9386, 0x1abf,
+	0x00d6, 0x0036, 0x0026, 0x2079, 0x0300, 0x2069, 0x1aa2, 0x7a08,
+	0x226a, 0x2069, 0x1aa3, 0x7a18, 0x226a, 0x8d68, 0x7a1c, 0x226a,
+	0x782c, 0x2019, 0x1ab0, 0x201a, 0x2019, 0x1ab3, 0x9016, 0x7808,
+	0xd09c, 0x0168, 0x7820, 0x201a, 0x8210, 0x8318, 0x9386, 0x1ac8,
 	0x0108, 0x0ca8, 0x7808, 0xd09c, 0x0110, 0x2011, 0xdead, 0x2019,
-	0x1aa8, 0x782c, 0x201a, 0x8318, 0x221a, 0x7803, 0x0000, 0x2069,
-	0x1a79, 0x901e, 0x20a9, 0x0020, 0x7b26, 0x7a28, 0x226a, 0x8d68,
+	0x1ab1, 0x782c, 0x201a, 0x8318, 0x221a, 0x7803, 0x0000, 0x2069,
+	0x1a82, 0x901e, 0x20a9, 0x0020, 0x7b26, 0x7a28, 0x226a, 0x8d68,
 	0x8318, 0x1f04, 0x0e24, 0x002e, 0x003e, 0x00de, 0x015e, 0x2079,
 	0x1800, 0x7803, 0x0005, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
-	0xd084, 0x0180, 0x2001, 0x1a17, 0x2004, 0x9005, 0x0128, 0x2001,
+	0xd084, 0x0180, 0x2001, 0x1a19, 0x2004, 0x9005, 0x0128, 0x2001,
 	0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002,
-	0x2003, 0x1001, 0x080c, 0x54c6, 0x1110, 0x080c, 0x0e99, 0x0cd0,
+	0x2003, 0x1001, 0x080c, 0x56df, 0x1110, 0x080c, 0x0e99, 0x0cd0,
 	0x0005, 0x918c, 0x03ff, 0x2001, 0x0003, 0x2004, 0x9084, 0x0600,
 	0x1118, 0x918d, 0x2800, 0x0010, 0x918d, 0x2000, 0x2001, 0x017f,
 	0x2102, 0x0005, 0x00f6, 0x0006, 0x2079, 0x1827, 0x2f04, 0x8000,
-	0x207a, 0x080c, 0x2ae2, 0x1150, 0x0006, 0x2001, 0x1996, 0x2004,
+	0x207a, 0x080c, 0x2c30, 0x1150, 0x0006, 0x2001, 0x1998, 0x2004,
 	0xd0fc, 0x000e, 0x1118, 0x9082, 0x7530, 0x0010, 0x9082, 0x000f,
 	0x0258, 0x9006, 0x207a, 0x2079, 0x182a, 0x2f04, 0x9084, 0x0001,
 	0x9086, 0x0001, 0x207a, 0x0090, 0x2079, 0x182a, 0x2f7c, 0x8fff,
@@ -266,8 +266,8 @@ unsigned short risc_code01[] = { 
 	0x080c, 0x0f00, 0x0c80, 0x7038, 0xd0b4, 0x1128, 0x0026, 0x2011,
 	0x0040, 0x0469, 0x002e, 0x0005, 0x7038, 0xd0b4, 0x1128, 0x0026,
 	0x2011, 0x0080, 0x0421, 0x002e, 0x0005, 0x0026, 0x70ef, 0x0000,
-	0x0459, 0x1148, 0x080c, 0x2ae2, 0x1118, 0x2011, 0x8484, 0x0058,
-	0x2011, 0x8282, 0x0040, 0x080c, 0x2ae2, 0x1118, 0x2011, 0xcdc5,
+	0x0459, 0x1148, 0x080c, 0x2c30, 0x1118, 0x2011, 0x8484, 0x0058,
+	0x2011, 0x8282, 0x0040, 0x080c, 0x2c30, 0x1118, 0x2011, 0xcdc5,
 	0x0010, 0x2011, 0xcac2, 0x00e9, 0x002e, 0x0005, 0xd0b4, 0x0130,
 	0x0006, 0x3b00, 0x9084, 0xff3f, 0x20d8, 0x000e, 0x0005, 0x0016,
 	0x3b08, 0x3a00, 0x9104, 0x918d, 0x00c0, 0x21d8, 0x9084, 0xff3f,
@@ -276,3767 +276,3840 @@ unsigned short risc_code01[] = { 
 	0xc2e5, 0x72ea, 0xd0e4, 0x1118, 0x9294, 0x00c0, 0x0c01, 0x0005,
 	0x1d04, 0x0f00, 0x2091, 0x6000, 0x1f04, 0x0f00, 0x0005, 0x890e,
 	0x810e, 0x810f, 0x9194, 0x003f, 0x918c, 0xffc0, 0x0005, 0x0006,
-	0x2200, 0x914d, 0x894f, 0x894d, 0x894d, 0x000e, 0x000e, 0x0005,
-	0x01d6, 0x0146, 0x0036, 0x0096, 0x2061, 0x188d, 0x600b, 0x0000,
-	0x600f, 0x0000, 0x6003, 0x0000, 0x6007, 0x0000, 0x2009, 0xffc0,
-	0x2105, 0x0006, 0x2001, 0xaaaa, 0x200f, 0x2019, 0x5555, 0x9016,
-	0x2049, 0x0bff, 0xab02, 0xa001, 0xa001, 0xa800, 0x9306, 0x1138,
-	0x2105, 0x9306, 0x0120, 0x8210, 0x99c8, 0x0400, 0x0c98, 0x000e,
-	0x200f, 0x2001, 0x189d, 0x928a, 0x000e, 0x1638, 0x928a, 0x0006,
-	0x2011, 0x0006, 0x1210, 0x2011, 0x0000, 0x2202, 0x9006, 0x2008,
-	0x82ff, 0x01b0, 0x8200, 0x600a, 0x600f, 0xffff, 0x6003, 0x0002,
-	0x6007, 0x0000, 0x0026, 0x2019, 0x0010, 0x9280, 0x0001, 0x20e8,
-	0x21a0, 0x21a8, 0x4104, 0x8319, 0x1de0, 0x8211, 0x1da0, 0x002e,
-	0x009e, 0x003e, 0x014e, 0x01de, 0x0005, 0x2011, 0x000e, 0x08e8,
-	0x0016, 0x0026, 0x0096, 0x3348, 0x080c, 0x0f07, 0x2100, 0x9300,
-	0x2098, 0x22e0, 0x009e, 0x002e, 0x001e, 0x0036, 0x3518, 0x20a9,
-	0x0001, 0x4002, 0x8007, 0x4004, 0x8319, 0x1dd8, 0x003e, 0x0005,
-	0x20e9, 0x0001, 0x71b8, 0x81ff, 0x11c0, 0x9006, 0x2009, 0x0200,
-	0x20a9, 0x0002, 0x9298, 0x0018, 0x23a0, 0x4001, 0x2009, 0x0700,
-	0x20a9, 0x0002, 0x9298, 0x0008, 0x23a0, 0x4001, 0x707c, 0x8007,
-	0x7180, 0x810f, 0x20a9, 0x0002, 0x4001, 0x9298, 0x000c, 0x23a0,
-	0x900e, 0x080c, 0x0db5, 0x2001, 0x0000, 0x810f, 0x20a9, 0x0002,
-	0x4001, 0x0005, 0x89ff, 0x0140, 0xa804, 0xa807, 0x0000, 0x0006,
-	0x080c, 0x1032, 0x009e, 0x0cb0, 0x0005, 0x00e6, 0x2071, 0x1800,
-	0x080c, 0x10ab, 0x090c, 0x0dd5, 0x00ee, 0x0005, 0x0086, 0x00e6,
-	0x0006, 0x0026, 0x0036, 0x0126, 0x2091, 0x8000, 0x00c9, 0x2071,
-	0x1800, 0x73c0, 0x702c, 0x9016, 0x9045, 0x0158, 0x8210, 0x9906,
-	0x090c, 0x0dd5, 0x2300, 0x9202, 0x0120, 0x1a0c, 0x0dd5, 0xa000,
-	0x0c98, 0x012e, 0x003e, 0x002e, 0x000e, 0x00ee, 0x008e, 0x0005,
-	0x0086, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x1910,
-	0x7010, 0x9005, 0x0140, 0x7018, 0x9045, 0x0128, 0x9906, 0x090c,
-	0x0dd5, 0xa000, 0x0cc8, 0x012e, 0x000e, 0x00ee, 0x008e, 0x0005,
-	0x00e6, 0x2071, 0x1800, 0x0126, 0x2091, 0x8000, 0x70c0, 0x8001,
-	0x0270, 0x70c2, 0x702c, 0x2048, 0x9085, 0x0001, 0xa800, 0x702e,
+	0x2200, 0x914d, 0x894f, 0x894d, 0x894d, 0x000e, 0x0005, 0x01d6,
+	0x0146, 0x0036, 0x0096, 0x2061, 0x188d, 0x600b, 0x0000, 0x600f,
+	0x0000, 0x6003, 0x0000, 0x6007, 0x0000, 0x2009, 0xffc0, 0x2105,
+	0x0006, 0x2001, 0xaaaa, 0x200f, 0x2019, 0x5555, 0x9016, 0x2049,
+	0x0bff, 0xab02, 0xa001, 0xa001, 0xa800, 0x9306, 0x1138, 0x2105,
+	0x9306, 0x0120, 0x8210, 0x99c8, 0x0400, 0x0c98, 0x000e, 0x200f,
+	0x2001, 0x189d, 0x928a, 0x000e, 0x1638, 0x928a, 0x0006, 0x2011,
+	0x0006, 0x1210, 0x2011, 0x0000, 0x2202, 0x9006, 0x2008, 0x82ff,
+	0x01b0, 0x8200, 0x600a, 0x600f, 0xffff, 0x6003, 0x0002, 0x6007,
+	0x0000, 0x0026, 0x2019, 0x0010, 0x9280, 0x0001, 0x20e8, 0x21a0,
+	0x21a8, 0x4104, 0x8319, 0x1de0, 0x8211, 0x1da0, 0x002e, 0x009e,
+	0x003e, 0x014e, 0x01de, 0x0005, 0x2011, 0x000e, 0x08e8, 0x0016,
+	0x0026, 0x0096, 0x3348, 0x080c, 0x0f07, 0x2100, 0x9300, 0x2098,
+	0x22e0, 0x009e, 0x002e, 0x001e, 0x0036, 0x3518, 0x20a9, 0x0001,
+	0x4002, 0x8007, 0x4004, 0x8319, 0x1dd8, 0x003e, 0x0005, 0x20e9,
+	0x0001, 0x71b8, 0x81ff, 0x11c0, 0x9006, 0x2009, 0x0200, 0x20a9,
+	0x0002, 0x9298, 0x0018, 0x23a0, 0x4001, 0x2009, 0x0700, 0x20a9,
+	0x0002, 0x9298, 0x0008, 0x23a0, 0x4001, 0x707c, 0x8007, 0x7180,
+	0x810f, 0x20a9, 0x0002, 0x4001, 0x9298, 0x000c, 0x23a0, 0x900e,
+	0x080c, 0x0db5, 0x2001, 0x0000, 0x810f, 0x20a9, 0x0002, 0x4001,
+	0x0005, 0x89ff, 0x0140, 0xa804, 0xa807, 0x0000, 0x0006, 0x080c,
+	0x1031, 0x009e, 0x0cb0, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c,
+	0x10aa, 0x090c, 0x0dd5, 0x00ee, 0x0005, 0x0086, 0x00e6, 0x0006,
+	0x0026, 0x0036, 0x0126, 0x2091, 0x8000, 0x00c9, 0x2071, 0x1800,
+	0x73c0, 0x702c, 0x9016, 0x9045, 0x0158, 0x8210, 0x9906, 0x090c,
+	0x0dd5, 0x2300, 0x9202, 0x0120, 0x1a0c, 0x0dd5, 0xa000, 0x0c98,
+	0x012e, 0x003e, 0x002e, 0x000e, 0x00ee, 0x008e, 0x0005, 0x0086,
+	0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x1910, 0x7010,
+	0x9005, 0x0140, 0x7018, 0x9045, 0x0128, 0x9906, 0x090c, 0x0dd5,
+	0xa000, 0x0cc8, 0x012e, 0x000e, 0x00ee, 0x008e, 0x0005, 0x00e6,
+	0x2071, 0x1800, 0x0126, 0x2091, 0x8000, 0x70c0, 0x8001, 0x0270,
+	0x70c2, 0x702c, 0x2048, 0x9085, 0x0001, 0xa800, 0x702e, 0xa803,
+	0x0000, 0xa807, 0x0000, 0x012e, 0x00ee, 0x0005, 0x904e, 0x0cd8,
+	0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x70c0, 0x90ca,
+	0x0020, 0x0268, 0x8001, 0x70c2, 0x702c, 0x2048, 0xa800, 0x702e,
 	0xa803, 0x0000, 0xa807, 0x0000, 0x012e, 0x00ee, 0x0005, 0x904e,
-	0x0cd8, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x70c0,
-	0x90ca, 0x0020, 0x0268, 0x8001, 0x70c2, 0x702c, 0x2048, 0xa800,
-	0x702e, 0xa803, 0x0000, 0xa807, 0x0000, 0x012e, 0x00ee, 0x0005,
-	0x904e, 0x0cd8, 0x00e6, 0x0126, 0x2091, 0x8000, 0x0016, 0x890e,
-	0x810e, 0x810f, 0x9184, 0x003f, 0xa862, 0x9184, 0xffc0, 0xa85e,
-	0x001e, 0x0020, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800,
-	0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c,
-	0x81a6, 0x012e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9026, 0x2009,
-	0x0000, 0x2049, 0x0400, 0x2900, 0x702e, 0x8940, 0x2800, 0xa802,
-	0xa95e, 0xa863, 0x0001, 0x8420, 0x9886, 0x0440, 0x0120, 0x2848,
-	0x9188, 0x0040, 0x0c90, 0x2071, 0x188d, 0x7000, 0x9005, 0x11a0,
-	0x2001, 0x0534, 0xa802, 0x2048, 0x2009, 0x4d00, 0x8940, 0x2800,
-	0xa802, 0xa95e, 0xa863, 0x0001, 0x8420, 0x9886, 0x0800, 0x0120,
-	0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, 0x188d, 0x7104, 0x7200,
-	0x82ff, 0x01d0, 0x7308, 0x8318, 0x831f, 0x831b, 0x831b, 0x7312,
-	0x8319, 0x2001, 0x0800, 0xa802, 0x2048, 0x8900, 0xa802, 0x2040,
-	0xa95e, 0xaa62, 0x8420, 0x2300, 0x9906, 0x0130, 0x2848, 0x9188,
-	0x0040, 0x9291, 0x0000, 0x0c88, 0xa803, 0x0000, 0x2071, 0x1800,
-	0x74be, 0x74c2, 0x0005, 0x00e6, 0x0016, 0x9984, 0xfc00, 0x01e8,
-	0x908c, 0xf800, 0x1168, 0x9982, 0x0400, 0x02b8, 0x9982, 0x0440,
-	0x0278, 0x9982, 0x0534, 0x0288, 0x9982, 0x0800, 0x1270, 0x0040,
-	0x9982, 0x0800, 0x0250, 0x2071, 0x188d, 0x7010, 0x9902, 0x1228,
-	0x9085, 0x0001, 0x001e, 0x00ee, 0x0005, 0x9006, 0x0cd8, 0x00e6,
-	0x2071, 0x1a16, 0x7007, 0x0000, 0x9006, 0x701e, 0x7022, 0x7002,
-	0x2071, 0x0000, 0x7010, 0x9085, 0x8044, 0x7012, 0x00ee, 0x0005,
-	0x0126, 0x2091, 0x8000, 0x00e6, 0xa06f, 0x0000, 0x2071, 0x1a16,
-	0x701c, 0x9088, 0x1a20, 0x280a, 0x8000, 0x9084, 0x003f, 0x701e,
-	0x7120, 0x9106, 0x090c, 0x0dd5, 0x7004, 0x9005, 0x1128, 0x00f6,
-	0x2079, 0x0080, 0x00a9, 0x00fe, 0x00ee, 0x012e, 0x0005, 0x0126,
-	0x2091, 0x8000, 0x00e6, 0x2071, 0x1a16, 0x7004, 0x9005, 0x1128,
-	0x00f6, 0x2079, 0x0080, 0x0021, 0x00fe, 0x00ee, 0x012e, 0x0005,
-	0x7004, 0x9086, 0x0000, 0x1110, 0x7007, 0x0006, 0x7000, 0x0002,
-	0x1122, 0x12a5, 0x1120, 0x1120, 0x1299, 0x1299, 0x1299, 0x1299,
-	0x080c, 0x0dd5, 0x701c, 0x7120, 0x9106, 0x1148, 0x792c, 0x9184,
-	0x0001, 0x1120, 0xd1fc, 0x1110, 0x7007, 0x0000, 0x0005, 0x0096,
-	0x9180, 0x1a20, 0x2004, 0x700a, 0x2048, 0x8108, 0x918c, 0x003f,
-	0x7122, 0x782b, 0x0026, 0xa88c, 0x7802, 0xa890, 0x7806, 0xa894,
-	0x780a, 0xa898, 0x780e, 0xa878, 0x700e, 0xa870, 0x7016, 0xa874,
-	0x701a, 0xa868, 0x009e, 0xd084, 0x0120, 0x7007, 0x0001, 0x0029,
-	0x0005, 0x7007, 0x0002, 0x00b1, 0x0005, 0x0016, 0x0026, 0x710c,
-	0x2011, 0x0040, 0x9182, 0x0040, 0x1210, 0x2110, 0x9006, 0x700e,
-	0x7212, 0x8203, 0x7812, 0x782b, 0x0020, 0x782b, 0x0041, 0x002e,
-	0x001e, 0x0005, 0x0016, 0x0026, 0x0136, 0x0146, 0x0156, 0x7014,
-	0x20e0, 0x7018, 0x2098, 0x20e9, 0x0000, 0x20a1, 0x0088, 0x782b,
-	0x0026, 0x710c, 0x2011, 0x0040, 0x9182, 0x0040, 0x1210, 0x2110,
-	0x9006, 0x700e, 0x22a8, 0x4006, 0x8203, 0x7812, 0x782b, 0x0020,
-	0x3300, 0x701a, 0x782b, 0x0001, 0x015e, 0x014e, 0x013e, 0x002e,
-	0x001e, 0x0005, 0x2009, 0x1a16, 0x2104, 0xc095, 0x200a, 0x080c,
-	0x10ff, 0x0005, 0x0016, 0x00e6, 0x2071, 0x1a16, 0x00f6, 0x2079,
-	0x0080, 0x792c, 0xd1bc, 0x190c, 0x0dce, 0x782b, 0x0002, 0xd1fc,
-	0x0120, 0x918c, 0x0700, 0x7004, 0x0023, 0x00fe, 0x00ee, 0x001e,
-	0x0005, 0x1110, 0x11b8, 0x11ec, 0x12c4, 0x0dd5, 0x12df, 0x0dd5,
-	0x918c, 0x0700, 0x1550, 0x0136, 0x0146, 0x0156, 0x7014, 0x20e8,
-	0x7018, 0x20a0, 0x20e1, 0x0000, 0x2099, 0x0088, 0x782b, 0x0040,
-	0x7010, 0x20a8, 0x4005, 0x3400, 0x701a, 0x015e, 0x014e, 0x013e,
-	0x700c, 0x9005, 0x0578, 0x7800, 0x7802, 0x7804, 0x7806, 0x080c,
-	0x1155, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0100, 0x009e,
-	0x7007, 0x0000, 0x080c, 0x1110, 0x0005, 0x7008, 0x0096, 0x2048,
-	0xa86f, 0x0200, 0x009e, 0x0ca0, 0x918c, 0x0700, 0x1150, 0x700c,
-	0x9005, 0x0180, 0x7800, 0x7802, 0x7804, 0x7806, 0x080c, 0x116a,
-	0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e, 0x7007,
-	0x0000, 0x0080, 0x0096, 0x7008, 0x2048, 0x7800, 0xa88e, 0x7804,
-	0xa892, 0x7808, 0xa896, 0x780c, 0xa89a, 0xa86f, 0x0100, 0x009e,
-	0x7007, 0x0000, 0x0096, 0x00d6, 0x7008, 0x2048, 0x2001, 0x18b9,
-	0x2004, 0x9906, 0x1128, 0xa89c, 0x080f, 0x00de, 0x009e, 0x00a0,
-	0x00de, 0x009e, 0x0096, 0x00d6, 0x7008, 0x2048, 0x0081, 0x0150,
-	0xa89c, 0x0086, 0x2940, 0x080f, 0x008e, 0x00de, 0x009e, 0x080c,
-	0x10ff, 0x0005, 0x00de, 0x009e, 0x080c, 0x10ff, 0x0005, 0xa8a8,
-	0xd08c, 0x0005, 0x0096, 0xa0a0, 0x904d, 0x090c, 0x0dd5, 0xa06c,
-	0x908e, 0x0100, 0x0130, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897,
-	0x4002, 0x080c, 0x6a3a, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x2848,
-	0x080c, 0x1032, 0x009e, 0x0005, 0x00a6, 0xa0a0, 0x904d, 0x090c,
-	0x0dd5, 0xa06c, 0x908e, 0x0100, 0x0128, 0xa87b, 0x0001, 0xa883,
-	0x0000, 0x00c0, 0xa80c, 0x2050, 0xb004, 0x9005, 0x0198, 0xa80e,
-	0x2050, 0x8006, 0x8006, 0x8007, 0x908c, 0x003f, 0x9084, 0xffc0,
-	0x9080, 0x0002, 0xa076, 0xa172, 0xb000, 0xa07a, 0x2810, 0x080c,
-	0x10e0, 0x00e8, 0xa97c, 0xa894, 0x0016, 0x0006, 0x080c, 0x6a3a,
-	0x000e, 0x001e, 0xd1fc, 0x1138, 0xd1f4, 0x0128, 0x00c6, 0x2060,
-	0x080c, 0xab6b, 0x00ce, 0x7008, 0x2048, 0xa89f, 0x0000, 0xa8a3,
-	0x0000, 0x080c, 0x1032, 0x7007, 0x0000, 0x080c, 0x10ff, 0x00ae,
-	0x0005, 0x0126, 0x2091, 0x8000, 0x782b, 0x1001, 0x7007, 0x0005,
-	0x7000, 0xc094, 0x7002, 0x012e, 0x0005, 0x0096, 0x2001, 0x192e,
-	0x204c, 0xa87c, 0x7812, 0xa88c, 0x7802, 0xa890, 0x7806, 0xa894,
-	0x780a, 0xa898, 0x780e, 0x782b, 0x0020, 0x0126, 0x2091, 0x8000,
-	0x782b, 0x0041, 0x7007, 0x0003, 0x7000, 0xc084, 0x7002, 0x2900,
-	0x700a, 0x012e, 0x009e, 0x0005, 0x20e1, 0x0000, 0x2099, 0x0088,
-	0x782b, 0x0040, 0x0096, 0x2001, 0x192e, 0x204c, 0xaa7c, 0x009e,
-	0x080c, 0x879b, 0x2009, 0x188c, 0x2104, 0x9084, 0xfffc, 0x200a,
-	0x080c, 0x860e, 0x7007, 0x0000, 0x080c, 0x1110, 0x0005, 0x7007,
-	0x0000, 0x080c, 0x1110, 0x0005, 0x0126, 0x2091, 0x2200, 0x2079,
-	0x0300, 0x2071, 0x1a60, 0x7003, 0x0000, 0x78bf, 0x00f6, 0x00c1,
-	0x7803, 0x0003, 0x780f, 0x0000, 0x20a9, 0x03ce, 0x2061, 0xe6bb,
-	0x2c0d, 0x7912, 0xe104, 0x9ce0, 0x0002, 0x7916, 0x1f04, 0x12f8,
-	0x7807, 0x0007, 0x7803, 0x0000, 0x7803, 0x0001, 0x012e, 0x0005,
-	0x00c6, 0x7803, 0x0000, 0x7808, 0xd09c, 0x0118, 0x7820, 0x04a9,
-	0x0cd0, 0x2001, 0x1a61, 0x2003, 0x0000, 0x78ab, 0x0004, 0x78ac,
-	0xd0ac, 0x1de8, 0x78ab, 0x0002, 0x7807, 0x0007, 0x7827, 0x0030,
-	0x782b, 0x0400, 0x7827, 0x0031, 0x782b, 0x1a79, 0x781f, 0xff00,
-	0x781b, 0xff00, 0x2001, 0x0200, 0x2004, 0xd0dc, 0x0110, 0x781f,
-	0x0303, 0x2061, 0x1a79, 0x602f, 0x1cd0, 0x2001, 0x181a, 0x2004,
-	0x9082, 0x1cd0, 0x6032, 0x603b, 0x1f4a, 0x604f, 0x193c, 0x2001,
-	0x1927, 0x2004, 0x6042, 0x00ce, 0x0005, 0x9086, 0x000d, 0x11d0,
-	0x7808, 0xd09c, 0x01b8, 0x7820, 0x0026, 0x2010, 0x080c, 0xc813,
-	0x0180, 0x2260, 0x6000, 0x9086, 0x0004, 0x1158, 0x0016, 0x6120,
-	0x9186, 0x0009, 0x0108, 0x0020, 0x2009, 0x004c, 0x080c, 0xabe6,
-	0x001e, 0x002e, 0x0005, 0x0126, 0x2091, 0x2200, 0x7908, 0x9184,
-	0x0070, 0x190c, 0x0dce, 0xd19c, 0x0158, 0x7820, 0x908c, 0xf000,
-	0x15e8, 0x908a, 0x0024, 0x1a0c, 0x0dd5, 0x0023, 0x012e, 0x0005,
-	0x012e, 0x0005, 0x139e, 0x139e, 0x13b5, 0x13ba, 0x13be, 0x13c3,
-	0x13eb, 0x13ef, 0x13fd, 0x1401, 0x139e, 0x14cc, 0x14d0, 0x1535,
-	0x153c, 0x139e, 0x153d, 0x153e, 0x1549, 0x1550, 0x139e, 0x139e,
-	0x139e, 0x139e, 0x139e, 0x139e, 0x139e, 0x13c5, 0x139e, 0x139e,
-	0x139e, 0x139e, 0x139e, 0x139e, 0x13a2, 0x13a0, 0x080c, 0x0dd5,
-	0x080c, 0x0dce, 0x080c, 0x155b, 0x2009, 0x1a78, 0x2104, 0x8000,
-	0x200a, 0x080c, 0x7c01, 0x080c, 0x19ff, 0x0005, 0x2009, 0x0048,
-	0x2060, 0x080c, 0xabe6, 0x012e, 0x0005, 0x7004, 0xc085, 0xc0b5,
-	0x7006, 0x0005, 0x7004, 0xc085, 0x7006, 0x0005, 0x080c, 0x155b,
-	0x080c, 0x161f, 0x0005, 0x080c, 0x0dd5, 0x080c, 0x155b, 0x2060,
-	0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048,
-	0x080c, 0xabe6, 0x2001, 0x015d, 0x2003, 0x0000, 0x2009, 0x03e8,
-	0x8109, 0x0160, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001,
-	0x0218, 0x2004, 0xd0ec, 0x1110, 0x080c, 0x1560, 0x2001, 0x0307,
-	0x2003, 0x8000, 0x0005, 0x7004, 0xc095, 0x7006, 0x0005, 0x080c,
-	0x155b, 0x2060, 0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e,
-	0x2009, 0x0048, 0x080c, 0xabe6, 0x0005, 0x080c, 0x155b, 0x080c,
-	0x0dd5, 0x080c, 0x155b, 0x080c, 0x14b7, 0x7827, 0x0018, 0x79ac,
-	0xd1dc, 0x0904, 0x146a, 0x7827, 0x0015, 0x7828, 0x782b, 0x0000,
-	0x9065, 0x0140, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020,
-	0x0804, 0x1470, 0x7004, 0x9005, 0x01c8, 0x1188, 0x78ab, 0x0004,
-	0x7827, 0x0018, 0x782b, 0x0000, 0xd1bc, 0x090c, 0x0dd5, 0x2001,
-	0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0804, 0x149c, 0x78ab,
-	0x0004, 0x7803, 0x0001, 0x080c, 0x14d0, 0x0005, 0x7827, 0x0018,
-	0xa001, 0x7828, 0x7827, 0x0011, 0xa001, 0x7928, 0x9106, 0x0110,
-	0x79ac, 0x08e0, 0x00e6, 0x2071, 0x0200, 0x702c, 0xd0c4, 0x0140,
-	0x00ee, 0x080c, 0x19ff, 0x080c, 0x1308, 0x7803, 0x0001, 0x0005,
-	0x7037, 0x0001, 0xa001, 0x7150, 0x00ee, 0x918c, 0xff00, 0x9186,
-	0x0500, 0x0110, 0x79ac, 0x0810, 0x7004, 0xc09d, 0x7006, 0x78ab,
-	0x0004, 0x7803, 0x0001, 0x080c, 0x14d0, 0x2001, 0x020d, 0x2003,
-	0x0020, 0x0005, 0x7828, 0x782b, 0x0000, 0x9065, 0x090c, 0x0dd5,
-	0x6014, 0x2048, 0x78ab, 0x0004, 0x918c, 0x0700, 0x0198, 0x080c,
-	0x7c01, 0x080c, 0x19ff, 0x080c, 0xc825, 0x0158, 0xa9ac, 0xa936,
-	0xa9b0, 0xa93a, 0xa83f, 0xffff, 0xa843, 0xffff, 0xa880, 0xc0bd,
-	0xa882, 0x0005, 0x6020, 0x9086, 0x0009, 0x1128, 0x2009, 0x004c,
-	0x080c, 0xabe6, 0x0048, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be,
-	0xd0bc, 0x6024, 0x190c, 0xcc03, 0x2029, 0x00c8, 0x8529, 0x0128,
-	0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x7dbc, 0x080c, 0xe664,
-	0xd5a4, 0x1118, 0x080c, 0x1560, 0x0005, 0x080c, 0x7c01, 0x080c,
-	0x19ff, 0x0005, 0x781f, 0x0300, 0x7803, 0x0001, 0x0005, 0x0016,
-	0x0066, 0x0076, 0x00f6, 0x2079, 0x0300, 0x7908, 0x918c, 0x0007,
-	0x9186, 0x0003, 0x0120, 0x2001, 0x0016, 0x080c, 0x15d1, 0x00fe,
-	0x007e, 0x006e, 0x001e, 0x0005, 0x7004, 0xc09d, 0x7006, 0x0005,
-	0x7104, 0x9184, 0x0004, 0x190c, 0x0dd5, 0xd184, 0x1189, 0xd19c,
-	0x0158, 0xc19c, 0x7106, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003,
-	0x0020, 0x080c, 0x1560, 0x0005, 0x81ff, 0x190c, 0x0dd5, 0x0005,
-	0xc184, 0xd1b4, 0xc1b4, 0x7106, 0x0016, 0x00e6, 0x15f0, 0x2071,
-	0x0200, 0x080c, 0x160c, 0x05c8, 0x6014, 0x9005, 0x05b0, 0x0096,
-	0x2048, 0xa864, 0x009e, 0x9084, 0x00ff, 0x908e, 0x0029, 0x0160,
-	0x908e, 0x0048, 0x1550, 0x601c, 0xd084, 0x11e0, 0x00f6, 0x2c78,
-	0x080c, 0x1689, 0x00fe, 0x00b0, 0x00f6, 0x2c78, 0x080c, 0x180e,
-	0x00fe, 0x2009, 0x01f4, 0x8109, 0x0168, 0x2001, 0x0201, 0x2004,
-	0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec, 0x1118, 0x080c,
-	0x1560, 0x0040, 0x2001, 0x020d, 0x2003, 0x0020, 0x080c, 0x1308,
-	0x7803, 0x0001, 0x00ee, 0x001e, 0x0005, 0x2001, 0x020d, 0x2003,
-	0x0050, 0x2003, 0x0020, 0x0461, 0x0ca8, 0x0429, 0x2060, 0x2009,
-	0x0053, 0x080c, 0xabe6, 0x0005, 0x0005, 0x0005, 0x00e1, 0x2008,
-	0x00d1, 0x0006, 0x7004, 0xc09d, 0x7006, 0x000e, 0x080c, 0x8af8,
-	0x0005, 0x0089, 0x9005, 0x0118, 0x080c, 0x86fb, 0x0cd0, 0x0005,
-	0x2001, 0x0036, 0x2009, 0x1820, 0x210c, 0x2011, 0x181f, 0x2214,
-	0x080c, 0x15d1, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x0005,
-	0x080c, 0x14b7, 0x00d6, 0x2069, 0x0200, 0x2009, 0x01f4, 0x8109,
-	0x0510, 0x6804, 0x9005, 0x0dd8, 0x2001, 0x015d, 0x2003, 0x0000,
-	0x79bc, 0xd1a4, 0x1528, 0x79b8, 0x918c, 0x0fff, 0x0180, 0x9182,
-	0x0841, 0x1268, 0x9188, 0x0007, 0x918c, 0x0ff8, 0x810c, 0x810c,
-	0x810c, 0x080c, 0x15c3, 0x6827, 0x0001, 0x8109, 0x1dd0, 0x04d9,
-	0x6827, 0x0002, 0x04c1, 0x6804, 0x9005, 0x1130, 0x682c, 0xd0e4,
-	0x1500, 0x6804, 0x9005, 0x0de8, 0x79b8, 0xd1ec, 0x1130, 0x08c0,
-	0x080c, 0x7c01, 0x080c, 0x19ff, 0x0090, 0x7827, 0x0015, 0x782b,
-	0x0000, 0x7827, 0x0018, 0x782b, 0x0000, 0x2001, 0x020d, 0x2003,
-	0x0020, 0x2001, 0x0307, 0x2003, 0x0300, 0x7803, 0x0001, 0x00de,
-	0x0005, 0x682c, 0x9084, 0x5400, 0x9086, 0x5400, 0x0d30, 0x7827,
-	0x0015, 0x782b, 0x0000, 0x7803, 0x0001, 0x6800, 0x9085, 0x1800,
-	0x6802, 0x00de, 0x0005, 0x6824, 0x9084, 0x0003, 0x1de0, 0x0005,
-	0x2001, 0x0030, 0x2c08, 0x621c, 0x0021, 0x7830, 0x9086, 0x0041,
-	0x0005, 0x00f6, 0x2079, 0x0300, 0x0006, 0x7808, 0xd09c, 0x0140,
-	0x0016, 0x0026, 0x00c6, 0x080c, 0x1363, 0x00ce, 0x002e, 0x001e,
-	0x000e, 0x0006, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x0059,
-	0x1118, 0x000e, 0x00fe, 0x0005, 0x000e, 0x792c, 0x3900, 0x8000,
-	0x2004, 0x080c, 0x0dd5, 0x2009, 0xff00, 0x8109, 0x0120, 0x7818,
-	0xd0bc, 0x1dd8, 0x0005, 0x9085, 0x0001, 0x0005, 0x7832, 0x7936,
-	0x7a3a, 0x781b, 0x8080, 0x0c79, 0x1108, 0x0005, 0x792c, 0x3900,
-	0x8000, 0x2004, 0x080c, 0x0dd5, 0x7037, 0x0001, 0x7150, 0x7037,
-	0x0002, 0x7050, 0x2060, 0xd1bc, 0x1110, 0x7054, 0x2060, 0x918c,
-	0xff00, 0x9186, 0x0500, 0x0110, 0x9085, 0x0001, 0x0005, 0x00e6,
-	0x0016, 0x2071, 0x0200, 0x0c41, 0x6124, 0xd1dc, 0x01f8, 0x701c,
-	0xd08c, 0x0904, 0x167e, 0x7017, 0x0000, 0x2001, 0x0264, 0x2004,
-	0xd0bc, 0x0904, 0x167e, 0x2001, 0x0268, 0x00c6, 0x2064, 0x6104,
-	0x6038, 0x00ce, 0x918e, 0x0039, 0x1904, 0x167e, 0x9c06, 0x15f0,
-	0x0126, 0x2091, 0x2600, 0x080c, 0x7b59, 0x012e, 0x7358, 0x745c,
-	0x6014, 0x905d, 0x0598, 0x2b48, 0x6010, 0x00b6, 0x2058, 0xb800,
-	0x00be, 0xd0bc, 0x190c, 0xcbde, 0xab42, 0xac3e, 0x2001, 0x1869,
-	0x2004, 0xd0b4, 0x1170, 0x601c, 0xd0e4, 0x1158, 0x6010, 0x00b6,
-	0x2058, 0xb800, 0x00be, 0xd0bc, 0x1120, 0xa83b, 0x7fff, 0xa837,
-	0xffff, 0x080c, 0x1f6a, 0x1190, 0x080c, 0x185d, 0x2a00, 0xa816,
-	0x0130, 0x2800, 0xa80e, 0x2c05, 0xa80a, 0x2c00, 0xa812, 0x7037,
-	0x0020, 0x781f, 0x0300, 0x001e, 0x00ee, 0x0005, 0x7037, 0x0050,
-	0x7037, 0x0020, 0x001e, 0x00ee, 0x080c, 0x1560, 0x0005, 0x080c,
-	0x0dd5, 0x2ff0, 0x0126, 0x2091, 0x2200, 0x3e60, 0x6014, 0x2048,
-	0x2940, 0x903e, 0x2730, 0xa864, 0x2068, 0xa81a, 0x9d84, 0x000f,
-	0x9088, 0x1f4a, 0x2165, 0x0002, 0x16b3, 0x1721, 0x16b3, 0x16b3,
-	0x16b7, 0x1702, 0x16b3, 0x16d7, 0x16ac, 0x1718, 0x16b3, 0x16b3,
-	0x16bc, 0x180c, 0x16eb, 0x16e1, 0xa964, 0x918c, 0x00ff, 0x918e,
-	0x0048, 0x0904, 0x1718, 0x9085, 0x0001, 0x0804, 0x1804, 0xa87c,
-	0xd0ac, 0x0dc8, 0x0804, 0x1728, 0xa87c, 0xd0ac, 0x0da0, 0x0804,
-	0x1793, 0xa898, 0x901d, 0x1108, 0xab9c, 0x9016, 0xaab2, 0xaa3e,
-	0xaa42, 0x3e00, 0x9080, 0x0008, 0x2004, 0x9080, 0x8cbf, 0x2005,
-	0x9005, 0x090c, 0x0dd5, 0x2004, 0xa8ae, 0x0804, 0x17ec, 0xa87c,
-	0xd0bc, 0x09c8, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804,
-	0x1728, 0xa87c, 0xd0bc, 0x0978, 0xa890, 0xa842, 0xa88c, 0xa83e,
-	0xa888, 0x0804, 0x1793, 0xa87c, 0xd0bc, 0x0928, 0xa890, 0xa842,
-	0xa88c, 0xa83e, 0xa804, 0x9045, 0x090c, 0x0dd5, 0xa164, 0xa91a,
-	0x91ec, 0x000f, 0x9d80, 0x1f4a, 0x2065, 0xa888, 0xd19c, 0x1904,
-	0x1793, 0x0430, 0xa87c, 0xd0ac, 0x0904, 0x16b3, 0xa804, 0x9045,
-	0x090c, 0x0dd5, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1f4a,
-	0x2065, 0x9006, 0xa842, 0xa83e, 0xd19c, 0x1904, 0x1793, 0x0080,
-	0xa87c, 0xd0ac, 0x0904, 0x16b3, 0x9006, 0xa842, 0xa83e, 0x0804,
-	0x1793, 0xa87c, 0xd0ac, 0x0904, 0x16b3, 0x9006, 0xa842, 0xa83e,
-	0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002,
-	0x174b, 0x174b, 0x174d, 0x174b, 0x174b, 0x174b, 0x1757, 0x174b,
-	0x174b, 0x174b, 0x1761, 0x174b, 0x174b, 0x174b, 0x176b, 0x174b,
-	0x174b, 0x174b, 0x1775, 0x174b, 0x174b, 0x174b, 0x177f, 0x174b,
-	0x174b, 0x174b, 0x1789, 0x080c, 0x0dd5, 0xa574, 0xa478, 0x9d86,
-	0x0024, 0x0904, 0x16c1, 0xa37c, 0xa280, 0x0804, 0x17ec, 0xa584,
-	0xa488, 0x9d86, 0x0024, 0x0904, 0x16c1, 0xa38c, 0xa290, 0x0804,
-	0x17ec, 0xa594, 0xa498, 0x9d86, 0x0024, 0x0904, 0x16c1, 0xa39c,
-	0xa2a0, 0x0804, 0x17ec, 0xa5a4, 0xa4a8, 0x9d86, 0x0024, 0x0904,
-	0x16c1, 0xa3ac, 0xa2b0, 0x0804, 0x17ec, 0xa5b4, 0xa4b8, 0x9d86,
-	0x0024, 0x0904, 0x16c1, 0xa3bc, 0xa2c0, 0x0804, 0x17ec, 0xa5c4,
-	0xa4c8, 0x9d86, 0x0024, 0x0904, 0x16c1, 0xa3cc, 0xa2d0, 0x0804,
-	0x17ec, 0xa5d4, 0xa4d8, 0x9d86, 0x0024, 0x0904, 0x16c1, 0xa3dc,
-	0xa2e0, 0x0804, 0x17ec, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dd5,
-	0x9082, 0x001b, 0x0002, 0x17b6, 0x17b4, 0x17b4, 0x17b4, 0x17b4,
-	0x17b4, 0x17c1, 0x17b4, 0x17b4, 0x17b4, 0x17b4, 0x17b4, 0x17cc,
-	0x17b4, 0x17b4, 0x17b4, 0x17b4, 0x17b4, 0x17d7, 0x17b4, 0x17b4,
-	0x17b4, 0x17b4, 0x17b4, 0x17e2, 0x080c, 0x0dd5, 0xa56c, 0xa470,
-	0xa774, 0xa678, 0x9d86, 0x002c, 0x0904, 0x16c1, 0xa37c, 0xa280,
-	0x0458, 0xa584, 0xa488, 0xa78c, 0xa690, 0x9d86, 0x002c, 0x0904,
-	0x16c1, 0xa394, 0xa298, 0x0400, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8,
-	0x9d86, 0x002c, 0x0904, 0x16c1, 0xa3ac, 0xa2b0, 0x00a8, 0xa5b4,
-	0xa4b8, 0xa7bc, 0xa6c0, 0x9d86, 0x002c, 0x0904, 0x16c1, 0xa3c4,
-	0xa2c8, 0x0050, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0x9d86, 0x002c,
-	0x0904, 0x16c1, 0xa3dc, 0xa2e0, 0xab2e, 0xaa32, 0xad1e, 0xac22,
-	0xaf26, 0xae2a, 0xa988, 0x8c60, 0x2c1d, 0xa8ac, 0xaab0, 0xa836,
-	0xaa3a, 0x8109, 0xa916, 0x1150, 0x3e60, 0x601c, 0xc085, 0x601e,
-	0xa87c, 0xc0dd, 0xa87e, 0x9006, 0x012e, 0x0005, 0x2800, 0xa80e,
-	0xab0a, 0x2c00, 0xa812, 0x0c80, 0x0804, 0x16b3, 0x2ff0, 0x0126,
-	0x2091, 0x2200, 0x3e60, 0x6014, 0x2048, 0x2940, 0xa80e, 0x2061,
-	0x1f45, 0xa813, 0x1f45, 0x2c05, 0xa80a, 0xa964, 0xa91a, 0xa87c,
-	0xd0ac, 0x090c, 0x0dd5, 0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a,
-	0x0034, 0x1a0c, 0x0dd5, 0xadcc, 0xacd0, 0xafd4, 0xaed8, 0xabdc,
-	0xaae0, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa8ac,
-	0xaab0, 0xa836, 0xaa3a, 0xa988, 0x918a, 0x0002, 0xa916, 0x1150,
-	0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c, 0xc0dd, 0xa87e, 0x9006,
-	0x012e, 0x0005, 0xa804, 0x9045, 0x090c, 0x0dd5, 0xa80e, 0xa064,
-	0xa81a, 0x9084, 0x000f, 0x9080, 0x1f4a, 0x2015, 0x82ff, 0x090c,
-	0x0dd5, 0xaa12, 0x2205, 0xa80a, 0x0c18, 0x903e, 0x2730, 0xa880,
-	0xd0fc, 0x1190, 0x2d00, 0x0002, 0x1987, 0x18b4, 0x18b4, 0x1987,
-	0x18b4, 0x1981, 0x1987, 0x18b4, 0x1987, 0x1924, 0x1924, 0x1987,
-	0x1924, 0x1987, 0x197e, 0x1924, 0xc0fc, 0xa882, 0xab2c, 0xaa30,
-	0xad1c, 0xac20, 0xdd9c, 0x0904, 0x1989, 0x2c05, 0x908a, 0x0034,
-	0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x18a0, 0x189e, 0x189e,
-	0x189e, 0x189e, 0x189e, 0x18a4, 0x189e, 0x189e, 0x189e, 0x189e,
-	0x189e, 0x18a8, 0x189e, 0x189e, 0x189e, 0x189e, 0x189e, 0x18ac,
-	0x189e, 0x189e, 0x189e, 0x189e, 0x189e, 0x18b0, 0x080c, 0x0dd5,
-	0xa774, 0xa678, 0x0804, 0x1989, 0xa78c, 0xa690, 0x0804, 0x1989,
-	0xa7a4, 0xa6a8, 0x0804, 0x1989, 0xa7bc, 0xa6c0, 0x0804, 0x1989,
-	0xa7d4, 0xa6d8, 0x0804, 0x1989, 0xa898, 0x901d, 0x1108, 0xab9c,
-	0x9016, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0dd5, 0x9082, 0x001b,
-	0x0002, 0x18dc, 0x18dc, 0x18de, 0x18dc, 0x18dc, 0x18dc, 0x18e8,
-	0x18dc, 0x18dc, 0x18dc, 0x18f2, 0x18dc, 0x18dc, 0x18dc, 0x18fc,
-	0x18dc, 0x18dc, 0x18dc, 0x1906, 0x18dc, 0x18dc, 0x18dc, 0x1910,
-	0x18dc, 0x18dc, 0x18dc, 0x191a, 0x080c, 0x0dd5, 0xa574, 0xa478,
-	0x9d86, 0x0004, 0x0904, 0x1989, 0xa37c, 0xa280, 0x0804, 0x1989,
-	0xa584, 0xa488, 0x9d86, 0x0004, 0x0904, 0x1989, 0xa38c, 0xa290,
-	0x0804, 0x1989, 0xa594, 0xa498, 0x9d86, 0x0004, 0x0904, 0x1989,
-	0xa39c, 0xa2a0, 0x0804, 0x1989, 0xa5a4, 0xa4a8, 0x9d86, 0x0004,
-	0x0904, 0x1989, 0xa3ac, 0xa2b0, 0x0804, 0x1989, 0xa5b4, 0xa4b8,
-	0x9d86, 0x0004, 0x0904, 0x1989, 0xa3bc, 0xa2c0, 0x0804, 0x1989,
-	0xa5c4, 0xa4c8, 0x9d86, 0x0004, 0x0904, 0x1989, 0xa3cc, 0xa2d0,
-	0x0804, 0x1989, 0xa5d4, 0xa4d8, 0x9d86, 0x0004, 0x0904, 0x1989,
-	0xa3dc, 0xa2e0, 0x0804, 0x1989, 0xa898, 0x901d, 0x1108, 0xab9c,
-	0x9016, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dd5, 0x9082, 0x001b,
-	0x0002, 0x194c, 0x194a, 0x194a, 0x194a, 0x194a, 0x194a, 0x1956,
-	0x194a, 0x194a, 0x194a, 0x194a, 0x194a, 0x1960, 0x194a, 0x194a,
-	0x194a, 0x194a, 0x194a, 0x196a, 0x194a, 0x194a, 0x194a, 0x194a,
-	0x194a, 0x1974, 0x080c, 0x0dd5, 0xa56c, 0xa470, 0xa774, 0xa678,
-	0x9d86, 0x000c, 0x05b0, 0xa37c, 0xa280, 0x0498, 0xa584, 0xa488,
-	0xa78c, 0xa690, 0x9d86, 0x000c, 0x0560, 0xa394, 0xa298, 0x0448,
-	0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0x9d86, 0x000c, 0x0510, 0xa3ac,
-	0xa2b0, 0x00f8, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0x9d86, 0x000c,
-	0x01c0, 0xa3c4, 0xa2c8, 0x00a8, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8,
-	0x9d86, 0x000c, 0x0170, 0xa3dc, 0xa2e0, 0x0058, 0x9d86, 0x000e,
-	0x1130, 0x080c, 0x1f08, 0x1904, 0x185d, 0x900e, 0x0050, 0x080c,
-	0x0dd5, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0x080c,
-	0x1f08, 0x0005, 0x6014, 0x2048, 0x6118, 0x810c, 0x810c, 0x810c,
-	0x81ff, 0x1118, 0xa887, 0x0001, 0x0008, 0xa986, 0x601b, 0x0002,
-	0xa974, 0xd1dc, 0x1108, 0x0005, 0xa934, 0xa88c, 0x9106, 0x1158,
-	0xa938, 0xa890, 0x9106, 0x1138, 0x601c, 0xc084, 0x601e, 0x2009,
-	0x0048, 0x0804, 0xabe6, 0x0005, 0x0126, 0x00c6, 0x2091, 0x2200,
-	0x00ce, 0x7908, 0x918c, 0x0007, 0x9186, 0x0000, 0x05b0, 0x9186,
-	0x0003, 0x0598, 0x6020, 0x6023, 0x0000, 0x0006, 0x2031, 0x0008,
-	0x00c6, 0x781f, 0x0808, 0x7808, 0xd09c, 0x0120, 0x080c, 0x1363,
-	0x8631, 0x1db8, 0x00ce, 0x781f, 0x0800, 0x2031, 0x0168, 0x00c6,
-	0x7808, 0xd09c, 0x190c, 0x1363, 0x00ce, 0x2001, 0x0038, 0x080c,
-	0x1a8c, 0x7930, 0x9186, 0x0040, 0x0160, 0x9186, 0x0042, 0x190c,
-	0x0dd5, 0x2001, 0x001e, 0x8001, 0x1df0, 0x8631, 0x1d40, 0x080c,
-	0x1a9b, 0x000e, 0x6022, 0x012e, 0x0005, 0x080c, 0x1a88, 0x7827,
-	0x0015, 0x7828, 0x9c06, 0x1db8, 0x782b, 0x0000, 0x0ca0, 0x00f6,
-	0x2079, 0x0300, 0x7803, 0x0000, 0x78ab, 0x0004, 0x00fe, 0x080c,
-	0x717d, 0x11b0, 0x2001, 0x0138, 0x2003, 0x0000, 0x2001, 0x0160,
-	0x2003, 0x0000, 0x2011, 0x012c, 0xa001, 0xa001, 0x8211, 0x1de0,
-	0x0081, 0x0066, 0x2031, 0x0000, 0x080c, 0x722d, 0x006e, 0x0005,
-	0x0479, 0x0039, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202,
-	0x0005, 0x00e6, 0x2071, 0x0200, 0x080c, 0x2af6, 0x2009, 0x003c,
-	0x080c, 0x2284, 0x2001, 0x015d, 0x2003, 0x0000, 0x7000, 0x9084,
-	0x003c, 0x1de0, 0x080c, 0x81a6, 0x70a0, 0x70a2, 0x7098, 0x709a,
-	0x709c, 0x709e, 0x2001, 0x020d, 0x2003, 0x0020, 0x00f6, 0x2079,
-	0x0300, 0x080c, 0x1308, 0x7803, 0x0001, 0x00fe, 0x00ee, 0x0005,
-	0x2001, 0x0138, 0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c,
-	0x2003, 0x0000, 0x080c, 0x717d, 0x1108, 0x0005, 0x2021, 0x0260,
-	0x2001, 0x0141, 0x201c, 0xd3dc, 0x1168, 0x2001, 0x0109, 0x201c,
-	0x939c, 0x0048, 0x1160, 0x2001, 0x0111, 0x201c, 0x83ff, 0x1110,
-	0x8421, 0x1d70, 0x2001, 0x015d, 0x2003, 0x0000, 0x0005, 0x0046,
-	0x2021, 0x0019, 0x2003, 0x0048, 0xa001, 0xa001, 0x201c, 0x939c,
-	0x0048, 0x0120, 0x8421, 0x1db0, 0x004e, 0x0c60, 0x004e, 0x0c40,
-	0x601c, 0xc084, 0x601e, 0x0005, 0x2c08, 0x621c, 0x080c, 0x15d1,
-	0x7930, 0x0005, 0x2c08, 0x621c, 0x080c, 0x15fe, 0x7930, 0x0005,
-	0x8001, 0x1df0, 0x0005, 0x2031, 0x0005, 0x781c, 0x9084, 0x0007,
-	0x0170, 0x2001, 0x0038, 0x0c41, 0x9186, 0x0040, 0x0904, 0x1af9,
-	0x2001, 0x001e, 0x0c69, 0x8631, 0x1d80, 0x080c, 0x0dd5, 0x781f,
-	0x0202, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001, 0x0b10, 0x0c01,
-	0x781c, 0xd084, 0x0110, 0x0861, 0x04e0, 0x2001, 0x0030, 0x0891,
-	0x9186, 0x0040, 0x0568, 0x781c, 0xd084, 0x1da8, 0x781f, 0x0101,
-	0x2001, 0x0014, 0x0869, 0x2001, 0x0037, 0x0821, 0x9186, 0x0040,
-	0x0140, 0x2001, 0x0030, 0x080c, 0x1a92, 0x9186, 0x0040, 0x190c,
-	0x0dd5, 0x00d6, 0x2069, 0x0200, 0x692c, 0xd1f4, 0x1170, 0xd1c4,
-	0x0160, 0xd19c, 0x0130, 0x6800, 0x9085, 0x1800, 0x6802, 0x00de,
-	0x0080, 0x6908, 0x9184, 0x0007, 0x1db0, 0x00de, 0x781f, 0x0100,
-	0x791c, 0x9184, 0x0007, 0x090c, 0x0dd5, 0xa001, 0xa001, 0x781f,
-	0x0200, 0x0005, 0x0126, 0x2091, 0x2400, 0x2071, 0x1a64, 0x2079,
-	0x0090, 0x012e, 0x0005, 0x9280, 0x0005, 0x2004, 0x2048, 0xa97c,
-	0xd1dc, 0x1904, 0x1b8b, 0xa964, 0x9184, 0x0007, 0x0002, 0x1b17,
-	0x1b76, 0x1b1e, 0x1b20, 0x1b1e, 0x1b5e, 0x1b3e, 0x1b2d, 0x2100,
-	0x9084, 0x00ff, 0x9086, 0x0048, 0x0904, 0x1b76, 0x080c, 0x0dd5,
-	0x9184, 0x00ff, 0x9086, 0x0013, 0x0904, 0x1b76, 0x9184, 0x00ff,
-	0x9086, 0x001b, 0x0904, 0x1b76, 0x0c88, 0xa87c, 0xd0b4, 0x0904,
-	0x1d4b, 0xa890, 0xa842, 0xa83a, 0xa88c, 0xa83e, 0xa836, 0xa8ac,
-	0xa846, 0xa8b0, 0xa84a, 0xa988, 0x0804, 0x1b7e, 0xa864, 0x9084,
-	0x00ff, 0x9086, 0x001e, 0x19d0, 0xa87c, 0xd0b4, 0x0904, 0x1d4b,
-	0xa890, 0xa842, 0xa83a, 0xa88c, 0xa83e, 0xa836, 0xa8ac, 0xa846,
-	0xa8b0, 0xa84a, 0xa804, 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f,
-	0x9080, 0x1f4a, 0x2005, 0xa812, 0xa988, 0x0448, 0x918c, 0x00ff,
-	0x9186, 0x0015, 0x1540, 0xa87c, 0xd0b4, 0x0904, 0x1d4b, 0xa804,
-	0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, 0x1f4a, 0x2005,
-	0xa812, 0xa988, 0x9006, 0xa842, 0xa83e, 0x0088, 0xa87c, 0xd0b4,
-	0x0904, 0x1d4b, 0xa988, 0x9006, 0xa842, 0xa83e, 0x2900, 0xa85a,
-	0xa864, 0x9084, 0x000f, 0x9080, 0x1f4a, 0x2005, 0xa812, 0xa916,
-	0xa87c, 0xc0dd, 0xa87e, 0x0005, 0x00f6, 0x2079, 0x0090, 0x782c,
-	0xd0fc, 0x190c, 0x1d8c, 0x00e6, 0x2071, 0x1a64, 0x7000, 0x9005,
-	0x1904, 0x1be5, 0x7206, 0x9280, 0x0005, 0x204c, 0x9280, 0x0004,
-	0x2004, 0x782b, 0x0004, 0x00f6, 0x2079, 0x0200, 0x7803, 0x0040,
-	0x00fe, 0x00b6, 0x2058, 0xb86c, 0x7836, 0xb890, 0x00be, 0x00f6,
-	0x2079, 0x0200, 0x7803, 0x0040, 0xa001, 0xa001, 0xa001, 0xa001,
-	0xa001, 0xa001, 0x781a, 0x2079, 0x0100, 0x8004, 0x78d6, 0x00fe,
-	0xa814, 0x2050, 0xa858, 0x2040, 0xa810, 0x2060, 0xa064, 0x90ec,
-	0x000f, 0xa944, 0x791a, 0x7116, 0xa848, 0x781e, 0x701a, 0x9006,
-	0x700e, 0x7012, 0x7004, 0xa940, 0xa838, 0x9106, 0x1188, 0xa93c,
-	0xa834, 0x9106, 0x1168, 0x8aff, 0x01a8, 0x0126, 0x2091, 0x8000,
-	0x00a1, 0x0108, 0x0091, 0x012e, 0x9006, 0x00ee, 0x00fe, 0x0005,
-	0x0036, 0x0046, 0xab38, 0xac34, 0x080c, 0x1f6a, 0x004e, 0x003e,
-	0x0d50, 0x0c98, 0x9085, 0x0001, 0x0c80, 0x0076, 0x0066, 0x0056,
-	0x0046, 0x0036, 0x0026, 0x8aff, 0x0904, 0x1d44, 0x700c, 0x7214,
-	0x923a, 0x7010, 0x7218, 0x9203, 0x0a04, 0x1d43, 0x9705, 0x0904,
-	0x1d43, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00, 0x0002,
-	0x1d1c, 0x1c60, 0x1c60, 0x1d1c, 0x1d1c, 0x1cfe, 0x1d1c, 0x1c60,
-	0x1d05, 0x1caf, 0x1caf, 0x1d1c, 0x1d1c, 0x1d1c, 0x1cf8, 0x1caf,
+	0x0cd8, 0x00e6, 0x0126, 0x2091, 0x8000, 0x0016, 0x890e, 0x810e,
+	0x810f, 0x9184, 0x003f, 0xa862, 0x9184, 0xffc0, 0xa85e, 0x001e,
+	0x0020, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x702c,
+	0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x83eb,
+	0x012e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9026, 0x2009, 0x0000,
+	0x2049, 0x0400, 0x2900, 0x702e, 0x8940, 0x2800, 0xa802, 0xa95e,
+	0xa863, 0x0001, 0x8420, 0x9886, 0x0440, 0x0120, 0x2848, 0x9188,
+	0x0040, 0x0c90, 0x2071, 0x188d, 0x7000, 0x9005, 0x11a0, 0x2001,
+	0x0534, 0xa802, 0x2048, 0x2009, 0x4d00, 0x8940, 0x2800, 0xa802,
+	0xa95e, 0xa863, 0x0001, 0x8420, 0x9886, 0x0800, 0x0120, 0x2848,
+	0x9188, 0x0040, 0x0c90, 0x2071, 0x188d, 0x7104, 0x7200, 0x82ff,
+	0x01d0, 0x7308, 0x8318, 0x831f, 0x831b, 0x831b, 0x7312, 0x8319,
+	0x2001, 0x0800, 0xa802, 0x2048, 0x8900, 0xa802, 0x2040, 0xa95e,
+	0xaa62, 0x8420, 0x2300, 0x9906, 0x0130, 0x2848, 0x9188, 0x0040,
+	0x9291, 0x0000, 0x0c88, 0xa803, 0x0000, 0x2071, 0x1800, 0x74be,
+	0x74c2, 0x0005, 0x00e6, 0x0016, 0x9984, 0xfc00, 0x01e8, 0x908c,
+	0xf800, 0x1168, 0x9982, 0x0400, 0x02b8, 0x9982, 0x0440, 0x0278,
+	0x9982, 0x0534, 0x0288, 0x9982, 0x0800, 0x1270, 0x0040, 0x9982,
+	0x0800, 0x0250, 0x2071, 0x188d, 0x7010, 0x9902, 0x1228, 0x9085,
+	0x0001, 0x001e, 0x00ee, 0x0005, 0x9006, 0x0cd8, 0x00e6, 0x2071,
+	0x1a18, 0x7007, 0x0000, 0x9006, 0x701e, 0x7022, 0x7002, 0x2071,
+	0x0000, 0x7010, 0x9085, 0x8044, 0x7012, 0x2071, 0x0080, 0x9006,
+	0x20a9, 0x0040, 0x7022, 0x1f04, 0x10e2, 0x702b, 0x0020, 0x00ee,
+	0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0xa06f, 0x0000, 0x2071,
+	0x1a18, 0x701c, 0x9088, 0x1a22, 0x280a, 0x8000, 0x9084, 0x003f,
+	0x701e, 0x7120, 0x9106, 0x090c, 0x0dd5, 0x7004, 0x9005, 0x1128,
+	0x00f6, 0x2079, 0x0080, 0x00a9, 0x00fe, 0x00ee, 0x012e, 0x0005,
+	0x0126, 0x2091, 0x8000, 0x00e6, 0x2071, 0x1a18, 0x7004, 0x9005,
+	0x1128, 0x00f6, 0x2079, 0x0080, 0x0021, 0x00fe, 0x00ee, 0x012e,
+	0x0005, 0x7004, 0x9086, 0x0000, 0x1110, 0x7007, 0x0006, 0x7000,
+	0x0002, 0x112b, 0x12ae, 0x1129, 0x1129, 0x12a2, 0x12a2, 0x12a2,
+	0x12a2, 0x080c, 0x0dd5, 0x701c, 0x7120, 0x9106, 0x1148, 0x792c,
+	0x9184, 0x0001, 0x1120, 0xd1fc, 0x1110, 0x7007, 0x0000, 0x0005,
+	0x0096, 0x9180, 0x1a22, 0x2004, 0x700a, 0x2048, 0x8108, 0x918c,
+	0x003f, 0x7122, 0x782b, 0x0026, 0xa88c, 0x7802, 0xa890, 0x7806,
+	0xa894, 0x780a, 0xa898, 0x780e, 0xa878, 0x700e, 0xa870, 0x7016,
+	0xa874, 0x701a, 0xa868, 0x009e, 0xd084, 0x0120, 0x7007, 0x0001,
+	0x0029, 0x0005, 0x7007, 0x0002, 0x00b1, 0x0005, 0x0016, 0x0026,
+	0x710c, 0x2011, 0x0040, 0x9182, 0x0040, 0x1210, 0x2110, 0x9006,
+	0x700e, 0x7212, 0x8203, 0x7812, 0x782b, 0x0020, 0x782b, 0x0041,
+	0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x0136, 0x0146, 0x0156,
+	0x7014, 0x20e0, 0x7018, 0x2098, 0x20e9, 0x0000, 0x20a1, 0x0088,
+	0x782b, 0x0026, 0x710c, 0x2011, 0x0040, 0x9182, 0x0040, 0x1210,
+	0x2110, 0x9006, 0x700e, 0x22a8, 0x4006, 0x8203, 0x7812, 0x782b,
+	0x0020, 0x3300, 0x701a, 0x782b, 0x0001, 0x015e, 0x014e, 0x013e,
+	0x002e, 0x001e, 0x0005, 0x2009, 0x1a18, 0x2104, 0xc095, 0x200a,
+	0x080c, 0x1108, 0x0005, 0x0016, 0x00e6, 0x2071, 0x1a18, 0x00f6,
+	0x2079, 0x0080, 0x792c, 0xd1bc, 0x190c, 0x0dce, 0x782b, 0x0002,
+	0xd1fc, 0x0120, 0x918c, 0x0700, 0x7004, 0x0023, 0x00fe, 0x00ee,
+	0x001e, 0x0005, 0x1119, 0x11c1, 0x11f5, 0x12cd, 0x0dd5, 0x12e8,
+	0x0dd5, 0x918c, 0x0700, 0x1550, 0x0136, 0x0146, 0x0156, 0x7014,
+	0x20e8, 0x7018, 0x20a0, 0x20e1, 0x0000, 0x2099, 0x0088, 0x782b,
+	0x0040, 0x7010, 0x20a8, 0x4005, 0x3400, 0x701a, 0x015e, 0x014e,
+	0x013e, 0x700c, 0x9005, 0x0578, 0x7800, 0x7802, 0x7804, 0x7806,
+	0x080c, 0x115e, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0100,
+	0x009e, 0x7007, 0x0000, 0x080c, 0x1119, 0x0005, 0x7008, 0x0096,
+	0x2048, 0xa86f, 0x0200, 0x009e, 0x0ca0, 0x918c, 0x0700, 0x1150,
+	0x700c, 0x9005, 0x0180, 0x7800, 0x7802, 0x7804, 0x7806, 0x080c,
+	0x1173, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e,
+	0x7007, 0x0000, 0x0080, 0x0096, 0x7008, 0x2048, 0x7800, 0xa88e,
+	0x7804, 0xa892, 0x7808, 0xa896, 0x780c, 0xa89a, 0xa86f, 0x0100,
+	0x009e, 0x7007, 0x0000, 0x0096, 0x00d6, 0x7008, 0x2048, 0x2001,
+	0x18b9, 0x2004, 0x9906, 0x1128, 0xa89c, 0x080f, 0x00de, 0x009e,
+	0x00a0, 0x00de, 0x009e, 0x0096, 0x00d6, 0x7008, 0x2048, 0x0081,
+	0x0150, 0xa89c, 0x0086, 0x2940, 0x080f, 0x008e, 0x00de, 0x009e,
+	0x080c, 0x1108, 0x0005, 0x00de, 0x009e, 0x080c, 0x1108, 0x0005,
+	0xa8a8, 0xd08c, 0x0005, 0x0096, 0xa0a0, 0x904d, 0x090c, 0x0dd5,
+	0xa06c, 0x908e, 0x0100, 0x0130, 0xa87b, 0x0030, 0xa883, 0x0000,
+	0xa897, 0x4002, 0x080c, 0x6c6d, 0xa09f, 0x0000, 0xa0a3, 0x0000,
+	0x2848, 0x080c, 0x1031, 0x009e, 0x0005, 0x00a6, 0xa0a0, 0x904d,
+	0x090c, 0x0dd5, 0xa06c, 0x908e, 0x0100, 0x0128, 0xa87b, 0x0001,
+	0xa883, 0x0000, 0x00c0, 0xa80c, 0x2050, 0xb004, 0x9005, 0x0198,
+	0xa80e, 0x2050, 0x8006, 0x8006, 0x8007, 0x908c, 0x003f, 0x9084,
+	0xffc0, 0x9080, 0x0002, 0xa076, 0xa172, 0xb000, 0xa07a, 0x2810,
+	0x080c, 0x10e9, 0x00e8, 0xa97c, 0xa894, 0x0016, 0x0006, 0x080c,
+	0x6c6d, 0x000e, 0x001e, 0xd1fc, 0x1138, 0xd1f4, 0x0128, 0x00c6,
+	0x2060, 0x080c, 0xae47, 0x00ce, 0x7008, 0x2048, 0xa89f, 0x0000,
+	0xa8a3, 0x0000, 0x080c, 0x1031, 0x7007, 0x0000, 0x080c, 0x1108,
+	0x00ae, 0x0005, 0x0126, 0x2091, 0x8000, 0x782b, 0x1001, 0x7007,
+	0x0005, 0x7000, 0xc094, 0x7002, 0x012e, 0x0005, 0x0096, 0x2001,
+	0x192e, 0x204c, 0xa87c, 0x7812, 0xa88c, 0x7802, 0xa890, 0x7806,
+	0xa894, 0x780a, 0xa898, 0x780e, 0x782b, 0x0020, 0x0126, 0x2091,
+	0x8000, 0x782b, 0x0041, 0x7007, 0x0003, 0x7000, 0xc084, 0x7002,
+	0x2900, 0x700a, 0x012e, 0x009e, 0x0005, 0x20e1, 0x0000, 0x2099,
+	0x0088, 0x782b, 0x0040, 0x0096, 0x2001, 0x192e, 0x204c, 0xaa7c,
+	0x009e, 0x080c, 0x89e3, 0x2009, 0x188c, 0x2104, 0x9084, 0xfffc,
+	0x200a, 0x080c, 0x8856, 0x7007, 0x0000, 0x080c, 0x1119, 0x0005,
+	0x7007, 0x0000, 0x080c, 0x1119, 0x0005, 0x0126, 0x2091, 0x2200,
+	0x2079, 0x0300, 0x2071, 0x1a62, 0x7003, 0x0000, 0x78bf, 0x00f6,
+	0x781b, 0x4800, 0x00c1, 0x7803, 0x0003, 0x780f, 0x0000, 0x20a9,
+	0x03d0, 0x2061, 0xe9f7, 0x2c0d, 0x7912, 0xe104, 0x9ce0, 0x0002,
+	0x7916, 0x1f04, 0x1303, 0x7807, 0x0007, 0x7803, 0x0000, 0x7803,
+	0x0001, 0x012e, 0x0005, 0x00c6, 0x7803, 0x0000, 0x7808, 0xd09c,
+	0x0120, 0x7820, 0x080c, 0x1362, 0x0cc8, 0x2001, 0x1a63, 0x2003,
+	0x0000, 0x78ab, 0x0004, 0x78ac, 0xd0ac, 0x1de8, 0x78ab, 0x0002,
+	0x7807, 0x0007, 0x7827, 0x0030, 0x782b, 0x0400, 0x7827, 0x0031,
+	0x782b, 0x1a82, 0x781f, 0xff00, 0x781b, 0xb700, 0x2001, 0x0200,
+	0x2004, 0xd0dc, 0x0110, 0x781f, 0x0303, 0x2061, 0x1a82, 0x602f,
+	0x1cd0, 0x2001, 0x181a, 0x2004, 0x9082, 0x1cd0, 0x6032, 0x603b,
+	0x2090, 0x604f, 0x193c, 0x2001, 0x331e, 0xd0fc, 0x190c, 0x0dd5,
+	0x2001, 0x0003, 0x2004, 0xd0d4, 0x1118, 0x783f, 0x331e, 0x0020,
+	0x9084, 0xc000, 0x783f, 0xb31e, 0x2001, 0x1927, 0x2004, 0x6042,
+	0x00ce, 0x0005, 0x9086, 0x000d, 0x11d0, 0x7808, 0xd09c, 0x01b8,
+	0x7820, 0x0026, 0x2010, 0x080c, 0xcb09, 0x0180, 0x2260, 0x6000,
+	0x9086, 0x0004, 0x1158, 0x0016, 0x6120, 0x9186, 0x0009, 0x0108,
+	0x0020, 0x2009, 0x004c, 0x080c, 0xaec2, 0x001e, 0x002e, 0x0005,
+	0x0126, 0x2091, 0x2200, 0x7908, 0x9184, 0x0070, 0x190c, 0x0dce,
+	0xd19c, 0x0158, 0x7820, 0x908c, 0xf000, 0x15e8, 0x908a, 0x0024,
+	0x1a0c, 0x0dd5, 0x0023, 0x012e, 0x0005, 0x012e, 0x0005, 0x13bb,
+	0x13bb, 0x13d2, 0x13d7, 0x13db, 0x13e0, 0x1408, 0x140c, 0x141a,
+	0x141e, 0x13bb, 0x14e9, 0x14ed, 0x1552, 0x1559, 0x13bb, 0x155a,
+	0x155b, 0x1566, 0x156d, 0x13bb, 0x13bb, 0x13bb, 0x13bb, 0x13bb,
+	0x13bb, 0x13bb, 0x13e2, 0x13bb, 0x13bb, 0x13bb, 0x13bb, 0x13bb,
+	0x13bb, 0x13bf, 0x13bd, 0x080c, 0x0dd5, 0x080c, 0x0dce, 0x080c,
+	0x1578, 0x2009, 0x1a7b, 0x2104, 0x8000, 0x200a, 0x080c, 0x7e4a,
+	0x080c, 0x1aa9, 0x0005, 0x2009, 0x0048, 0x2060, 0x080c, 0xaec2,
+	0x012e, 0x0005, 0x7004, 0xc085, 0xc0b5, 0x7006, 0x0005, 0x7004,
+	0xc085, 0x7006, 0x0005, 0x080c, 0x1578, 0x080c, 0x16bb, 0x0005,
+	0x080c, 0x0dd5, 0x080c, 0x1578, 0x2060, 0x6014, 0x0096, 0x2048,
+	0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c, 0xaec2, 0x2001,
+	0x015d, 0x2003, 0x0000, 0x2009, 0x03e8, 0x8109, 0x0160, 0x2001,
+	0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec,
+	0x1110, 0x080c, 0x157d, 0x2001, 0x0307, 0x2003, 0x8000, 0x0005,
+	0x7004, 0xc095, 0x7006, 0x0005, 0x080c, 0x1578, 0x2060, 0x6014,
+	0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c,
+	0xaec2, 0x0005, 0x080c, 0x1578, 0x080c, 0x0dd5, 0x080c, 0x1578,
+	0x080c, 0x14d4, 0x7827, 0x0018, 0x79ac, 0xd1dc, 0x0904, 0x1487,
+	0x7827, 0x0015, 0x7828, 0x782b, 0x0000, 0x9065, 0x0140, 0x2001,
+	0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0804, 0x148d, 0x7004,
+	0x9005, 0x01c8, 0x1188, 0x78ab, 0x0004, 0x7827, 0x0018, 0x782b,
+	0x0000, 0xd1bc, 0x090c, 0x0dd5, 0x2001, 0x020d, 0x2003, 0x0050,
+	0x2003, 0x0020, 0x0804, 0x14b9, 0x78ab, 0x0004, 0x7803, 0x0001,
+	0x080c, 0x14ed, 0x0005, 0x7827, 0x0018, 0xa001, 0x7828, 0x7827,
+	0x0011, 0xa001, 0x7928, 0x9106, 0x0110, 0x79ac, 0x08e0, 0x00e6,
+	0x2071, 0x0200, 0x702c, 0xd0c4, 0x0140, 0x00ee, 0x080c, 0x1aa9,
+	0x080c, 0x1313, 0x7803, 0x0001, 0x0005, 0x7037, 0x0001, 0xa001,
+	0x7150, 0x00ee, 0x918c, 0xff00, 0x9186, 0x0500, 0x0110, 0x79ac,
+	0x0810, 0x7004, 0xc09d, 0x7006, 0x78ab, 0x0004, 0x7803, 0x0001,
+	0x080c, 0x14ed, 0x2001, 0x020d, 0x2003, 0x0020, 0x0005, 0x7828,
+	0x782b, 0x0000, 0x9065, 0x090c, 0x0dd5, 0x6014, 0x2048, 0x78ab,
+	0x0004, 0x918c, 0x0700, 0x0198, 0x080c, 0x7e4a, 0x080c, 0x1aa9,
+	0x080c, 0xcb1b, 0x0158, 0xa9ac, 0xa936, 0xa9b0, 0xa93a, 0xa83f,
+	0xffff, 0xa843, 0xffff, 0xa880, 0xc0bd, 0xa882, 0x0005, 0x6020,
+	0x9086, 0x0009, 0x1128, 0x2009, 0x004c, 0x080c, 0xaec2, 0x0048,
+	0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x6024, 0x190c,
+	0xcf00, 0x2029, 0x00c8, 0x8529, 0x0128, 0x2001, 0x0201, 0x2004,
+	0x9005, 0x0dc8, 0x7dbc, 0x080c, 0xe9a0, 0xd5a4, 0x1118, 0x080c,
+	0x157d, 0x0005, 0x080c, 0x7e4a, 0x080c, 0x1aa9, 0x0005, 0x781f,
+	0x0300, 0x7803, 0x0001, 0x0005, 0x0016, 0x0066, 0x0076, 0x00f6,
+	0x2079, 0x0300, 0x7908, 0x918c, 0x0007, 0x9186, 0x0003, 0x0120,
+	0x2001, 0x0016, 0x080c, 0x15ee, 0x00fe, 0x007e, 0x006e, 0x001e,
+	0x0005, 0x7004, 0xc09d, 0x7006, 0x0005, 0x7104, 0x9184, 0x0004,
+	0x190c, 0x0dd5, 0xd184, 0x1189, 0xd19c, 0x0158, 0xc19c, 0x7106,
+	0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x080c, 0x157d,
+	0x0005, 0x81ff, 0x190c, 0x0dd5, 0x0005, 0xc184, 0xd1b4, 0xc1b4,
+	0x7106, 0x0016, 0x00e6, 0x15f0, 0x2071, 0x0200, 0x080c, 0x16a8,
+	0x05c8, 0x6014, 0x9005, 0x05b0, 0x0096, 0x2048, 0xa864, 0x009e,
+	0x9084, 0x00ff, 0x908e, 0x0029, 0x0160, 0x908e, 0x0048, 0x1550,
+	0x601c, 0xd084, 0x11e0, 0x00f6, 0x2c78, 0x080c, 0x1725, 0x00fe,
+	0x00b0, 0x00f6, 0x2c78, 0x080c, 0x18ac, 0x00fe, 0x2009, 0x01f4,
+	0x8109, 0x0168, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001,
+	0x0218, 0x2004, 0xd0ec, 0x1118, 0x080c, 0x157d, 0x0040, 0x2001,
+	0x020d, 0x2003, 0x0020, 0x080c, 0x1313, 0x7803, 0x0001, 0x00ee,
+	0x001e, 0x0005, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020,
+	0x0461, 0x0ca8, 0x0429, 0x2060, 0x2009, 0x0053, 0x080c, 0xaec2,
+	0x0005, 0x0005, 0x0005, 0x00e1, 0x2008, 0x00d1, 0x0006, 0x7004,
+	0xc09d, 0x7006, 0x000e, 0x080c, 0x8d40, 0x0005, 0x0089, 0x9005,
+	0x0118, 0x080c, 0x8943, 0x0cd0, 0x0005, 0x2001, 0x0036, 0x2009,
+	0x1820, 0x210c, 0x2011, 0x181f, 0x2214, 0x080c, 0x15ee, 0x0005,
+	0x7808, 0xd09c, 0x0de8, 0x7820, 0x0005, 0x080c, 0x14d4, 0x00d6,
+	0x2069, 0x0200, 0x2009, 0x01f4, 0x8109, 0x0510, 0x6804, 0x9005,
+	0x0dd8, 0x2001, 0x015d, 0x2003, 0x0000, 0x79bc, 0xd1a4, 0x1528,
+	0x79b8, 0x918c, 0x0fff, 0x0180, 0x9182, 0x0841, 0x1268, 0x9188,
+	0x0007, 0x918c, 0x0ff8, 0x810c, 0x810c, 0x810c, 0x080c, 0x15e0,
+	0x6827, 0x0001, 0x8109, 0x1dd0, 0x04d9, 0x6827, 0x0002, 0x04c1,
+	0x6804, 0x9005, 0x1130, 0x682c, 0xd0e4, 0x1500, 0x6804, 0x9005,
+	0x0de8, 0x79b8, 0xd1ec, 0x1130, 0x08c0, 0x080c, 0x7e4a, 0x080c,
+	0x1aa9, 0x0090, 0x7827, 0x0015, 0x782b, 0x0000, 0x7827, 0x0018,
+	0x782b, 0x0000, 0x2001, 0x020d, 0x2003, 0x0020, 0x2001, 0x0307,
+	0x2003, 0x0300, 0x7803, 0x0001, 0x00de, 0x0005, 0x682c, 0x9084,
+	0x5400, 0x9086, 0x5400, 0x0d30, 0x7827, 0x0015, 0x782b, 0x0000,
+	0x7803, 0x0001, 0x6800, 0x9085, 0x1800, 0x6802, 0x00de, 0x0005,
+	0x6824, 0x9084, 0x0003, 0x1de0, 0x0005, 0x2001, 0x0030, 0x2c08,
+	0x621c, 0x0021, 0x7830, 0x9086, 0x0041, 0x0005, 0x00f6, 0x2079,
+	0x0300, 0x0006, 0x7808, 0xd09c, 0x0140, 0x0016, 0x0026, 0x00c6,
+	0x080c, 0x1380, 0x00ce, 0x002e, 0x001e, 0x000e, 0x0006, 0x7832,
+	0x7936, 0x7a3a, 0x781b, 0x8080, 0x0059, 0x1118, 0x000e, 0x00fe,
+	0x0005, 0x000e, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c, 0x0dd5,
+	0x2009, 0x180c, 0x2104, 0xc0f4, 0x200a, 0x2009, 0xff00, 0x8109,
+	0x0904, 0x166c, 0x7a18, 0x9284, 0x0030, 0x0904, 0x1667, 0x9284,
+	0x0048, 0x9086, 0x0008, 0x1904, 0x1667, 0x2001, 0x0109, 0x2004,
+	0xd08c, 0x01f0, 0x0006, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
+	0x0126, 0x2091, 0x2800, 0x00f6, 0x0026, 0x0016, 0x2009, 0x1a7d,
+	0x2104, 0x8000, 0x0208, 0x200a, 0x080c, 0x9079, 0x001e, 0x002e,
+	0x00fe, 0x012e, 0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x000e,
+	0x2001, 0x009b, 0x2004, 0xd0fc, 0x01d0, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x00f6, 0x0016, 0x2009, 0x1a7e,
+	0x2104, 0x8000, 0x0208, 0x200a, 0x080c, 0x1eb4, 0x001e, 0x00fe,
+	0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e, 0x000e, 0x7818,
+	0xd0bc, 0x1904, 0x1617, 0x0005, 0x2001, 0x180c, 0x2004, 0xd0f4,
+	0x1528, 0x7a18, 0x9284, 0x0030, 0x0508, 0x9284, 0x0048, 0x9086,
+	0x0008, 0x11e0, 0x2001, 0x19f6, 0x2004, 0x9005, 0x01b8, 0x2001,
+	0x1a66, 0x2004, 0x9086, 0x0000, 0x0188, 0x2009, 0x1a7c, 0x2104,
+	0x8000, 0x0208, 0x200a, 0x080c, 0xa2dd, 0x2009, 0x180c, 0x2104,
+	0xc0f5, 0x200a, 0x2009, 0xff00, 0x0804, 0x1617, 0x9085, 0x0001,
+	0x0005, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x080c, 0x1610,
+	0x1108, 0x0005, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c, 0x0dd5,
+	0x7037, 0x0001, 0x7150, 0x7037, 0x0002, 0x7050, 0x2060, 0xd1bc,
+	0x1110, 0x7054, 0x2060, 0x918c, 0xff00, 0x9186, 0x0500, 0x0110,
+	0x9085, 0x0001, 0x0005, 0x00e6, 0x0016, 0x2071, 0x0200, 0x0c41,
+	0x6124, 0xd1dc, 0x01f8, 0x701c, 0xd08c, 0x0904, 0x171a, 0x7017,
+	0x0000, 0x2001, 0x0264, 0x2004, 0xd0bc, 0x0904, 0x171a, 0x2001,
+	0x0268, 0x00c6, 0x2064, 0x6104, 0x6038, 0x00ce, 0x918e, 0x0039,
+	0x1904, 0x171a, 0x9c06, 0x15f0, 0x0126, 0x2091, 0x2600, 0x080c,
+	0x7d91, 0x012e, 0x7358, 0x745c, 0x6014, 0x905d, 0x0598, 0x2b48,
+	0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x190c, 0xcedb,
+	0xab42, 0xac3e, 0x2001, 0x1869, 0x2004, 0xd0b4, 0x1170, 0x601c,
+	0xd0e4, 0x1158, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc,
+	0x1120, 0xa83b, 0x7fff, 0xa837, 0xffff, 0x080c, 0x20b0, 0x1190,
+	0x080c, 0x1907, 0x2a00, 0xa816, 0x0130, 0x2800, 0xa80e, 0x2c05,
+	0xa80a, 0x2c00, 0xa812, 0x7037, 0x0020, 0x781f, 0x0300, 0x001e,
+	0x00ee, 0x0005, 0x7037, 0x0050, 0x7037, 0x0020, 0x001e, 0x00ee,
+	0x080c, 0x157d, 0x0005, 0x080c, 0x0dd5, 0x2ff0, 0x0126, 0x2091,
+	0x2200, 0x00c6, 0x3e60, 0x6014, 0x2048, 0x2940, 0x903e, 0x2730,
+	0xa864, 0x2068, 0xa81a, 0x9d84, 0x000f, 0x9088, 0x2090, 0x2165,
+	0x0002, 0x1750, 0x17be, 0x1750, 0x1750, 0x1754, 0x179f, 0x1750,
+	0x1774, 0x1749, 0x17b5, 0x1750, 0x1750, 0x1759, 0x18aa, 0x1788,
+	0x177e, 0xa964, 0x918c, 0x00ff, 0x918e, 0x0048, 0x0904, 0x17b5,
+	0x9085, 0x0001, 0x0804, 0x18a1, 0xa87c, 0xd0ac, 0x0dc8, 0x0804,
+	0x17c5, 0xa87c, 0xd0ac, 0x0da0, 0x0804, 0x1830, 0xa898, 0x901d,
+	0x1108, 0xab9c, 0x9016, 0xaab2, 0xaa3e, 0xaa42, 0x3e00, 0x9080,
+	0x0008, 0x2004, 0x9080, 0x8f07, 0x2005, 0x9005, 0x090c, 0x0dd5,
+	0x2004, 0xa8ae, 0x0804, 0x1889, 0xa87c, 0xd0bc, 0x09c8, 0xa890,
+	0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, 0x17c5, 0xa87c, 0xd0bc,
+	0x0978, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, 0x1830,
+	0xa87c, 0xd0bc, 0x0928, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa804,
+	0x9045, 0x090c, 0x0dd5, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80,
+	0x2090, 0x2065, 0xa888, 0xd19c, 0x1904, 0x1830, 0x0430, 0xa87c,
+	0xd0ac, 0x0904, 0x1750, 0xa804, 0x9045, 0x090c, 0x0dd5, 0xa164,
+	0xa91a, 0x91ec, 0x000f, 0x9d80, 0x2090, 0x2065, 0x9006, 0xa842,
+	0xa83e, 0xd19c, 0x1904, 0x1830, 0x0080, 0xa87c, 0xd0ac, 0x0904,
+	0x1750, 0x9006, 0xa842, 0xa83e, 0x0804, 0x1830, 0xa87c, 0xd0ac,
+	0x0904, 0x1750, 0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0036,
+	0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x17e8, 0x17e8, 0x17ea,
+	0x17e8, 0x17e8, 0x17e8, 0x17f4, 0x17e8, 0x17e8, 0x17e8, 0x17fe,
+	0x17e8, 0x17e8, 0x17e8, 0x1808, 0x17e8, 0x17e8, 0x17e8, 0x1812,
+	0x17e8, 0x17e8, 0x17e8, 0x181c, 0x17e8, 0x17e8, 0x17e8, 0x1826,
+	0x080c, 0x0dd5, 0xa574, 0xa478, 0x9d86, 0x0024, 0x0904, 0x175e,
+	0xa37c, 0xa280, 0x0804, 0x1889, 0xa584, 0xa488, 0x9d86, 0x0024,
+	0x0904, 0x175e, 0xa38c, 0xa290, 0x0804, 0x1889, 0xa594, 0xa498,
+	0x9d86, 0x0024, 0x0904, 0x175e, 0xa39c, 0xa2a0, 0x0804, 0x1889,
+	0xa5a4, 0xa4a8, 0x9d86, 0x0024, 0x0904, 0x175e, 0xa3ac, 0xa2b0,
+	0x0804, 0x1889, 0xa5b4, 0xa4b8, 0x9d86, 0x0024, 0x0904, 0x175e,
+	0xa3bc, 0xa2c0, 0x0804, 0x1889, 0xa5c4, 0xa4c8, 0x9d86, 0x0024,
+	0x0904, 0x175e, 0xa3cc, 0xa2d0, 0x0804, 0x1889, 0xa5d4, 0xa4d8,
+	0x9d86, 0x0024, 0x0904, 0x175e, 0xa3dc, 0xa2e0, 0x0804, 0x1889,
+	0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002,
+	0x1853, 0x1851, 0x1851, 0x1851, 0x1851, 0x1851, 0x185e, 0x1851,
+	0x1851, 0x1851, 0x1851, 0x1851, 0x1869, 0x1851, 0x1851, 0x1851,
+	0x1851, 0x1851, 0x1874, 0x1851, 0x1851, 0x1851, 0x1851, 0x1851,
+	0x187f, 0x080c, 0x0dd5, 0xa56c, 0xa470, 0xa774, 0xa678, 0x9d86,
+	0x002c, 0x0904, 0x175e, 0xa37c, 0xa280, 0x0458, 0xa584, 0xa488,
+	0xa78c, 0xa690, 0x9d86, 0x002c, 0x0904, 0x175e, 0xa394, 0xa298,
+	0x0400, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0x9d86, 0x002c, 0x0904,
+	0x175e, 0xa3ac, 0xa2b0, 0x00a8, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0,
+	0x9d86, 0x002c, 0x0904, 0x175e, 0xa3c4, 0xa2c8, 0x0050, 0xa5cc,
+	0xa4d0, 0xa7d4, 0xa6d8, 0x9d86, 0x002c, 0x0904, 0x175e, 0xa3dc,
+	0xa2e0, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa988,
+	0x8c60, 0x2c1d, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x8109, 0xa916,
+	0x1158, 0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c, 0xc0dd, 0xa87e,
+	0x9006, 0x00ce, 0x012e, 0x0005, 0x2800, 0xa80e, 0xab0a, 0x2c00,
+	0xa812, 0x0c78, 0x0804, 0x1750, 0x2ff0, 0x0126, 0x2091, 0x2200,
+	0x00c6, 0x3e60, 0x6014, 0x2048, 0x2940, 0xa80e, 0x2061, 0x208b,
+	0xa813, 0x208b, 0x2c05, 0xa80a, 0xa964, 0xa91a, 0xa87c, 0xd0ac,
+	0x090c, 0x0dd5, 0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0034,
+	0x1a0c, 0x0dd5, 0xadcc, 0xacd0, 0xafd4, 0xaed8, 0xabdc, 0xaae0,
+	0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa8ac, 0xaab0,
+	0xa836, 0xaa3a, 0xa988, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0008,
+	0x1120, 0x8109, 0xa916, 0x0128, 0x0078, 0x918a, 0x0002, 0xa916,
+	0x1158, 0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c, 0xc0dd, 0xa87e,
+	0x9006, 0x00ce, 0x012e, 0x0005, 0xa804, 0x9045, 0x090c, 0x0dd5,
+	0xa80e, 0xa064, 0xa81a, 0x9084, 0x000f, 0x9080, 0x2090, 0x2015,
+	0x82ff, 0x090c, 0x0dd5, 0xaa12, 0x2205, 0xa80a, 0x0c10, 0x903e,
+	0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00, 0x0002, 0x1a31, 0x195e,
+	0x195e, 0x1a31, 0x195e, 0x1a2b, 0x1a31, 0x195e, 0x19ce, 0x19ce,
+	0x19ce, 0x1a31, 0x19ce, 0x1a31, 0x1a28, 0x19ce, 0xc0fc, 0xa882,
+	0xab2c, 0xaa30, 0xad1c, 0xac20, 0xdd9c, 0x0904, 0x1a33, 0x2c05,
+	0x908a, 0x0034, 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x194a,
+	0x1948, 0x1948, 0x1948, 0x1948, 0x1948, 0x194e, 0x1948, 0x1948,
+	0x1948, 0x1948, 0x1948, 0x1952, 0x1948, 0x1948, 0x1948, 0x1948,
+	0x1948, 0x1956, 0x1948, 0x1948, 0x1948, 0x1948, 0x1948, 0x195a,
+	0x080c, 0x0dd5, 0xa774, 0xa678, 0x0804, 0x1a33, 0xa78c, 0xa690,
+	0x0804, 0x1a33, 0xa7a4, 0xa6a8, 0x0804, 0x1a33, 0xa7bc, 0xa6c0,
+	0x0804, 0x1a33, 0xa7d4, 0xa6d8, 0x0804, 0x1a33, 0xa898, 0x901d,
+	0x1108, 0xab9c, 0x9016, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0dd5,
+	0x9082, 0x001b, 0x0002, 0x1986, 0x1986, 0x1988, 0x1986, 0x1986,
+	0x1986, 0x1992, 0x1986, 0x1986, 0x1986, 0x199c, 0x1986, 0x1986,
+	0x1986, 0x19a6, 0x1986, 0x1986, 0x1986, 0x19b0, 0x1986, 0x1986,
+	0x1986, 0x19ba, 0x1986, 0x1986, 0x1986, 0x19c4, 0x080c, 0x0dd5,
+	0xa574, 0xa478, 0x9d86, 0x0004, 0x0904, 0x1a33, 0xa37c, 0xa280,
+	0x0804, 0x1a33, 0xa584, 0xa488, 0x9d86, 0x0004, 0x0904, 0x1a33,
+	0xa38c, 0xa290, 0x0804, 0x1a33, 0xa594, 0xa498, 0x9d86, 0x0004,
+	0x0904, 0x1a33, 0xa39c, 0xa2a0, 0x0804, 0x1a33, 0xa5a4, 0xa4a8,
+	0x9d86, 0x0004, 0x0904, 0x1a33, 0xa3ac, 0xa2b0, 0x0804, 0x1a33,
+	0xa5b4, 0xa4b8, 0x9d86, 0x0004, 0x0904, 0x1a33, 0xa3bc, 0xa2c0,
+	0x0804, 0x1a33, 0xa5c4, 0xa4c8, 0x9d86, 0x0004, 0x0904, 0x1a33,
+	0xa3cc, 0xa2d0, 0x0804, 0x1a33, 0xa5d4, 0xa4d8, 0x9d86, 0x0004,
+	0x0904, 0x1a33, 0xa3dc, 0xa2e0, 0x0804, 0x1a33, 0xa898, 0x901d,
+	0x1108, 0xab9c, 0x9016, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dd5,
+	0x9082, 0x001b, 0x0002, 0x19f6, 0x19f4, 0x19f4, 0x19f4, 0x19f4,
+	0x19f4, 0x1a00, 0x19f4, 0x19f4, 0x19f4, 0x19f4, 0x19f4, 0x1a0a,
+	0x19f4, 0x19f4, 0x19f4, 0x19f4, 0x19f4, 0x1a14, 0x19f4, 0x19f4,
+	0x19f4, 0x19f4, 0x19f4, 0x1a1e, 0x080c, 0x0dd5, 0xa56c, 0xa470,
+	0xa774, 0xa678, 0x9d86, 0x000c, 0x05b0, 0xa37c, 0xa280, 0x0498,
+	0xa584, 0xa488, 0xa78c, 0xa690, 0x9d86, 0x000c, 0x0560, 0xa394,
+	0xa298, 0x0448, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0x9d86, 0x000c,
+	0x0510, 0xa3ac, 0xa2b0, 0x00f8, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0,
+	0x9d86, 0x000c, 0x01c0, 0xa3c4, 0xa2c8, 0x00a8, 0xa5cc, 0xa4d0,
+	0xa7d4, 0xa6d8, 0x9d86, 0x000c, 0x0170, 0xa3dc, 0xa2e0, 0x0058,
+	0x9d86, 0x000e, 0x1130, 0x080c, 0x2048, 0x1904, 0x1907, 0x900e,
+	0x0050, 0x080c, 0x0dd5, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26,
+	0xae2a, 0x080c, 0x2048, 0x0005, 0x6014, 0x2048, 0x6118, 0x810c,
+	0x810c, 0x810c, 0x81ff, 0x1118, 0xa887, 0x0001, 0x0008, 0xa986,
+	0x601b, 0x0002, 0xa974, 0xd1dc, 0x1108, 0x0005, 0xa934, 0xa88c,
+	0x9106, 0x1158, 0xa938, 0xa890, 0x9106, 0x1138, 0x601c, 0xc084,
+	0x601e, 0x2009, 0x0048, 0x0804, 0xaec2, 0x0005, 0x0126, 0x00c6,
+	0x2091, 0x2200, 0x00ce, 0x7908, 0x918c, 0x0007, 0x9186, 0x0000,
+	0x05b0, 0x9186, 0x0003, 0x0598, 0x6020, 0x6023, 0x0000, 0x0006,
+	0x2031, 0x0008, 0x00c6, 0x781f, 0x0808, 0x7808, 0xd09c, 0x0120,
+	0x080c, 0x1380, 0x8631, 0x1db8, 0x00ce, 0x781f, 0x0800, 0x2031,
+	0x0168, 0x00c6, 0x7808, 0xd09c, 0x190c, 0x1380, 0x00ce, 0x2001,
+	0x0038, 0x080c, 0x1b36, 0x7930, 0x9186, 0x0040, 0x0160, 0x9186,
+	0x0042, 0x190c, 0x0dd5, 0x2001, 0x001e, 0x8001, 0x1df0, 0x8631,
+	0x1d40, 0x080c, 0x1b45, 0x000e, 0x6022, 0x012e, 0x0005, 0x080c,
+	0x1b32, 0x7827, 0x0015, 0x7828, 0x9c06, 0x1db8, 0x782b, 0x0000,
+	0x0ca0, 0x00f6, 0x2079, 0x0300, 0x7803, 0x0000, 0x78ab, 0x0004,
+	0x00fe, 0x080c, 0x73b0, 0x11b0, 0x2001, 0x0138, 0x2003, 0x0000,
+	0x2001, 0x0160, 0x2003, 0x0000, 0x2011, 0x012c, 0xa001, 0xa001,
+	0x8211, 0x1de0, 0x0081, 0x0066, 0x2031, 0x0000, 0x080c, 0x7460,
+	0x006e, 0x0005, 0x0479, 0x0039, 0x2001, 0x0160, 0x2502, 0x2001,
+	0x0138, 0x2202, 0x0005, 0x00e6, 0x2071, 0x0200, 0x080c, 0x2c44,
+	0x2009, 0x003c, 0x080c, 0x23d2, 0x2001, 0x015d, 0x2003, 0x0000,
+	0x7000, 0x9084, 0x003c, 0x1de0, 0x080c, 0x83eb, 0x70a0, 0x70a2,
+	0x7098, 0x709a, 0x709c, 0x709e, 0x2001, 0x020d, 0x2003, 0x0020,
+	0x00f6, 0x2079, 0x0300, 0x080c, 0x1313, 0x7803, 0x0001, 0x00fe,
+	0x00ee, 0x0005, 0x2001, 0x0138, 0x2014, 0x2003, 0x0000, 0x2001,
+	0x0160, 0x202c, 0x2003, 0x0000, 0x080c, 0x73b0, 0x1108, 0x0005,
+	0x2021, 0x0260, 0x2001, 0x0141, 0x201c, 0xd3dc, 0x1168, 0x2001,
+	0x0109, 0x201c, 0x939c, 0x0048, 0x1160, 0x2001, 0x0111, 0x201c,
+	0x83ff, 0x1110, 0x8421, 0x1d70, 0x2001, 0x015d, 0x2003, 0x0000,
+	0x0005, 0x0046, 0x2021, 0x0019, 0x2003, 0x0048, 0xa001, 0xa001,
+	0x201c, 0x939c, 0x0048, 0x0120, 0x8421, 0x1db0, 0x004e, 0x0c60,
+	0x004e, 0x0c40, 0x601c, 0xc084, 0x601e, 0x0005, 0x2c08, 0x621c,
+	0x080c, 0x15ee, 0x7930, 0x0005, 0x2c08, 0x621c, 0x080c, 0x1699,
+	0x7930, 0x0005, 0x8001, 0x1df0, 0x0005, 0x2031, 0x0005, 0x781c,
+	0x9084, 0x0007, 0x0170, 0x2001, 0x0038, 0x0c41, 0x9186, 0x0040,
+	0x0904, 0x1ba3, 0x2001, 0x001e, 0x0c69, 0x8631, 0x1d80, 0x080c,
+	0x0dd5, 0x781f, 0x0202, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001,
+	0x0b10, 0x0c01, 0x781c, 0xd084, 0x0110, 0x0861, 0x04e0, 0x2001,
+	0x0030, 0x0891, 0x9186, 0x0040, 0x0568, 0x781c, 0xd084, 0x1da8,
+	0x781f, 0x0101, 0x2001, 0x0014, 0x0869, 0x2001, 0x0037, 0x0821,
+	0x9186, 0x0040, 0x0140, 0x2001, 0x0030, 0x080c, 0x1b3c, 0x9186,
+	0x0040, 0x190c, 0x0dd5, 0x00d6, 0x2069, 0x0200, 0x692c, 0xd1f4,
+	0x1170, 0xd1c4, 0x0160, 0xd19c, 0x0130, 0x6800, 0x9085, 0x1800,
+	0x6802, 0x00de, 0x0080, 0x6908, 0x9184, 0x0007, 0x1db0, 0x00de,
+	0x781f, 0x0100, 0x791c, 0x9184, 0x0007, 0x090c, 0x0dd5, 0xa001,
+	0xa001, 0x781f, 0x0200, 0x0005, 0x0126, 0x2091, 0x2400, 0x2071,
+	0x1a66, 0x2079, 0x0090, 0x012e, 0x0005, 0x9280, 0x0005, 0x2004,
+	0x2048, 0xa97c, 0xd1dc, 0x1904, 0x1c45, 0xa964, 0x9184, 0x0007,
+	0x0002, 0x1bc1, 0x1c30, 0x1bd8, 0x1bda, 0x1bd8, 0x1c18, 0x1bf8,
+	0x1be7, 0x918c, 0x00ff, 0x9186, 0x0008, 0x1170, 0xa87c, 0xd0b4,
+	0x0904, 0x1e6f, 0x9006, 0xa842, 0xa83e, 0xa988, 0x2900, 0xa85a,
+	0xa813, 0x208b, 0x0804, 0x1c41, 0x9186, 0x0048, 0x0904, 0x1c30,
+	0x080c, 0x0dd5, 0x9184, 0x00ff, 0x9086, 0x0013, 0x0904, 0x1c30,
+	0x9184, 0x00ff, 0x9086, 0x001b, 0x0904, 0x1c30, 0x0c88, 0xa87c,
+	0xd0b4, 0x0904, 0x1e6f, 0xa890, 0xa842, 0xa83a, 0xa88c, 0xa83e,
+	0xa836, 0xa8ac, 0xa846, 0xa8b0, 0xa84a, 0xa988, 0x0804, 0x1c38,
+	0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x19d0, 0xa87c, 0xd0b4,
+	0x0904, 0x1e6f, 0xa890, 0xa842, 0xa83a, 0xa88c, 0xa83e, 0xa836,
+	0xa8ac, 0xa846, 0xa8b0, 0xa84a, 0xa804, 0xa85a, 0x2040, 0xa064,
+	0x9084, 0x000f, 0x9080, 0x2090, 0x2005, 0xa812, 0xa988, 0x0448,
+	0x918c, 0x00ff, 0x9186, 0x0015, 0x1540, 0xa87c, 0xd0b4, 0x0904,
+	0x1e6f, 0xa804, 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080,
+	0x2090, 0x2005, 0xa812, 0xa988, 0x9006, 0xa842, 0xa83e, 0x0088,
+	0xa87c, 0xd0b4, 0x0904, 0x1e6f, 0xa988, 0x9006, 0xa842, 0xa83e,
+	0x2900, 0xa85a, 0xa864, 0x9084, 0x000f, 0x9080, 0x2090, 0x2005,
+	0xa812, 0xa916, 0xa87c, 0xc0dd, 0xa87e, 0x0005, 0x00f6, 0x2079,
+	0x0090, 0x782c, 0xd0fc, 0x190c, 0x1eb4, 0x00e6, 0x2071, 0x1a66,
+	0x7000, 0x9005, 0x1904, 0x1cae, 0x7206, 0x9280, 0x0005, 0x204c,
+	0x9280, 0x0004, 0x2004, 0x782b, 0x0004, 0x00f6, 0x2079, 0x0200,
+	0x7803, 0x0040, 0x00fe, 0x00b6, 0x2058, 0xb86c, 0x7836, 0xb890,
+	0x00be, 0x00f6, 0x2079, 0x0200, 0x7803, 0x0040, 0xa001, 0xa001,
+	0xa001, 0xa001, 0xa001, 0xa001, 0x781a, 0x2079, 0x0100, 0x8004,
+	0x78d6, 0x00fe, 0xa814, 0x2050, 0xa858, 0x2040, 0xa810, 0x2060,
+	0xa064, 0x90ec, 0x000f, 0xa944, 0x791a, 0x7116, 0xa848, 0x781e,
+	0x701a, 0x9006, 0x700e, 0x7012, 0x7004, 0xa940, 0xa838, 0x9106,
+	0x1500, 0xa93c, 0xa834, 0x9106, 0x11e0, 0x0006, 0x0016, 0xa938,
+	0xa834, 0x9105, 0x0118, 0x001e, 0x000e, 0x0098, 0x001e, 0x000e,
+	0x8aff, 0x01c8, 0x0126, 0x2091, 0x8000, 0x2009, 0x0306, 0x200b,
+	0x0808, 0x00d9, 0x0108, 0x00c9, 0x012e, 0x9006, 0x00ee, 0x00fe,
+	0x0005, 0x0036, 0x0046, 0xab38, 0xac34, 0x080c, 0x20b0, 0x004e,
+	0x003e, 0x0d30, 0x0c98, 0x9085, 0x0001, 0x0c80, 0x2009, 0x0306,
+	0x200b, 0x4800, 0x7027, 0x0000, 0x0005, 0x0076, 0x0066, 0x0056,
+	0x0046, 0x0036, 0x0026, 0x8aff, 0x0904, 0x1e68, 0x700c, 0x7214,
+	0x923a, 0x7010, 0x7218, 0x9203, 0x0a04, 0x1e67, 0x9705, 0x0904,
+	0x1e67, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00, 0x0002,
+	0x1df1, 0x1d30, 0x1d30, 0x1df1, 0x1df1, 0x1dce, 0x1df1, 0x1d30,
+	0x1dd5, 0x1d7f, 0x1d7f, 0x1df1, 0x1df1, 0x1df1, 0x1dc8, 0x1d7f,
 	0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20, 0xdd9c, 0x0904,
-	0x1d29, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dd5, 0x9082, 0x001b,
-	0x0002, 0x1c4c, 0x1c4a, 0x1c4a, 0x1c4a, 0x1c4a, 0x1c4a, 0x1c50,
-	0x1c4a, 0x1c4a, 0x1c4a, 0x1c4a, 0x1c4a, 0x1c54, 0x1c4a, 0x1c4a,
-	0x1c4a, 0x1c4a, 0x1c4a, 0x1c58, 0x1c4a, 0x1c4a, 0x1c4a, 0x1c4a,
-	0x1c4a, 0x1c5c, 0x080c, 0x0dd5, 0xa774, 0xa678, 0x0804, 0x1d29,
-	0xa78c, 0xa690, 0x0804, 0x1d29, 0xa7a4, 0xa6a8, 0x0804, 0x1d29,
-	0xa7bc, 0xa6c0, 0x0804, 0x1d29, 0xa7d4, 0xa6d8, 0x0804, 0x1d29,
+	0x1dfe, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dd5, 0x9082, 0x001b,
+	0x0002, 0x1d1c, 0x1d1a, 0x1d1a, 0x1d1a, 0x1d1a, 0x1d1a, 0x1d20,
+	0x1d1a, 0x1d1a, 0x1d1a, 0x1d1a, 0x1d1a, 0x1d24, 0x1d1a, 0x1d1a,
+	0x1d1a, 0x1d1a, 0x1d1a, 0x1d28, 0x1d1a, 0x1d1a, 0x1d1a, 0x1d1a,
+	0x1d1a, 0x1d2c, 0x080c, 0x0dd5, 0xa774, 0xa678, 0x0804, 0x1dfe,
+	0xa78c, 0xa690, 0x0804, 0x1dfe, 0xa7a4, 0xa6a8, 0x0804, 0x1dfe,
+	0xa7bc, 0xa6c0, 0x0804, 0x1dfe, 0xa7d4, 0xa6d8, 0x0804, 0x1dfe,
 	0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002,
-	0x1c83, 0x1c83, 0x1c85, 0x1c83, 0x1c83, 0x1c83, 0x1c8b, 0x1c83,
-	0x1c83, 0x1c83, 0x1c91, 0x1c83, 0x1c83, 0x1c83, 0x1c97, 0x1c83,
-	0x1c83, 0x1c83, 0x1c9d, 0x1c83, 0x1c83, 0x1c83, 0x1ca3, 0x1c83,
-	0x1c83, 0x1c83, 0x1ca9, 0x080c, 0x0dd5, 0xa574, 0xa478, 0xa37c,
-	0xa280, 0x0804, 0x1d29, 0xa584, 0xa488, 0xa38c, 0xa290, 0x0804,
-	0x1d29, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x1d29, 0xa5a4,
-	0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x1d29, 0xa5b4, 0xa4b8, 0xa3bc,
-	0xa2c0, 0x0804, 0x1d29, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804,
-	0x1d29, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x1d29, 0x2c05,
-	0x908a, 0x0034, 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x1cd2,
-	0x1cd0, 0x1cd0, 0x1cd0, 0x1cd0, 0x1cd0, 0x1cda, 0x1cd0, 0x1cd0,
-	0x1cd0, 0x1cd0, 0x1cd0, 0x1ce2, 0x1cd0, 0x1cd0, 0x1cd0, 0x1cd0,
-	0x1cd0, 0x1cea, 0x1cd0, 0x1cd0, 0x1cd0, 0x1cd0, 0x1cd0, 0x1cf1,
+	0x1d53, 0x1d53, 0x1d55, 0x1d53, 0x1d53, 0x1d53, 0x1d5b, 0x1d53,
+	0x1d53, 0x1d53, 0x1d61, 0x1d53, 0x1d53, 0x1d53, 0x1d67, 0x1d53,
+	0x1d53, 0x1d53, 0x1d6d, 0x1d53, 0x1d53, 0x1d53, 0x1d73, 0x1d53,
+	0x1d53, 0x1d53, 0x1d79, 0x080c, 0x0dd5, 0xa574, 0xa478, 0xa37c,
+	0xa280, 0x0804, 0x1dfe, 0xa584, 0xa488, 0xa38c, 0xa290, 0x0804,
+	0x1dfe, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x1dfe, 0xa5a4,
+	0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x1dfe, 0xa5b4, 0xa4b8, 0xa3bc,
+	0xa2c0, 0x0804, 0x1dfe, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804,
+	0x1dfe, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x1dfe, 0x2c05,
+	0x908a, 0x0034, 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x1da2,
+	0x1da0, 0x1da0, 0x1da0, 0x1da0, 0x1da0, 0x1daa, 0x1da0, 0x1da0,
+	0x1da0, 0x1da0, 0x1da0, 0x1db2, 0x1da0, 0x1da0, 0x1da0, 0x1da0,
+	0x1da0, 0x1dba, 0x1da0, 0x1da0, 0x1da0, 0x1da0, 0x1da0, 0x1dc1,
 	0x080c, 0x0dd5, 0xa56c, 0xa470, 0xa774, 0xa678, 0xa37c, 0xa280,
-	0x0804, 0x1d29, 0xa584, 0xa488, 0xa78c, 0xa690, 0xa394, 0xa298,
-	0x0804, 0x1d29, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, 0xa2b0,
-	0x0804, 0x1d29, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8,
-	0x04c0, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, 0x0488,
-	0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x11f0, 0x080c, 0x1f08,
-	0x1904, 0x1bfb, 0x900e, 0x0804, 0x1d44, 0xa864, 0x9084, 0x00ff,
-	0x9086, 0x0048, 0x190c, 0x0dd5, 0x00c6, 0x7004, 0x2060, 0x6004,
-	0x9086, 0x0043, 0x00ce, 0x0904, 0x1caf, 0xab9c, 0x9016, 0xad8c,
-	0xac90, 0xaf94, 0xae98, 0x0068, 0xa964, 0x918c, 0x00ff, 0x9186,
-	0x0013, 0x0904, 0x1c60, 0x9186, 0x001b, 0x0904, 0x1caf, 0x080c,
-	0x0dd5, 0x7b12, 0x7a16, 0x7d02, 0x7c06, 0x7f0a, 0x7e0e, 0x782b,
+	0x0804, 0x1dfe, 0xa584, 0xa488, 0xa78c, 0xa690, 0xa394, 0xa298,
+	0x0804, 0x1dfe, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, 0xa2b0,
+	0x0804, 0x1dfe, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8,
+	0x04e8, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, 0x04b0,
+	0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x1518, 0x080c, 0x2048,
+	0x1904, 0x1ccb, 0x900e, 0x0804, 0x1e68, 0xab64, 0x939c, 0x00ff,
+	0x9386, 0x0048, 0x1180, 0x00c6, 0x7004, 0x2060, 0x6004, 0x9086,
+	0x0043, 0x00ce, 0x0904, 0x1d7f, 0xab9c, 0x9016, 0xad8c, 0xac90,
+	0xaf94, 0xae98, 0x0098, 0x9386, 0x0008, 0x0904, 0x1d7f, 0x080c,
+	0x0dd5, 0xa964, 0x918c, 0x00ff, 0x9186, 0x0013, 0x0904, 0x1d30,
+	0x9186, 0x001b, 0x0904, 0x1d7f, 0x080c, 0x0dd5, 0x2009, 0x030f,
+	0x2104, 0xd0fc, 0x0530, 0x0066, 0x2009, 0x0306, 0x2104, 0x9084,
+	0x0030, 0x15c8, 0x2031, 0x1000, 0x200b, 0x4000, 0x2600, 0x9302,
+	0x928b, 0x0000, 0xa82e, 0xa932, 0x0278, 0x9105, 0x0168, 0x2011,
+	0x0000, 0x2618, 0x2600, 0x9500, 0xa81e, 0x9481, 0x0000, 0xa822,
+	0xa880, 0xc0fd, 0xa882, 0x0020, 0xa82f, 0x0000, 0xa833, 0x0000,
+	0x006e, 0x7b12, 0x7a16, 0x7d02, 0x7c06, 0x7f0a, 0x7e0e, 0x782b,
 	0x0001, 0x7000, 0x8000, 0x7002, 0xa83c, 0x9300, 0xa83e, 0xa840,
 	0x9201, 0xa842, 0x700c, 0x9300, 0x700e, 0x7010, 0x9201, 0x7012,
-	0x080c, 0x1f08, 0x0008, 0x9006, 0x002e, 0x003e, 0x004e, 0x005e,
-	0x006e, 0x007e, 0x0005, 0x080c, 0x0dd5, 0x0026, 0x2001, 0x0105,
-	0x2003, 0x0010, 0x782b, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060,
-	0x6014, 0x2048, 0x080c, 0xc825, 0x0118, 0xa880, 0xc0bd, 0xa882,
+	0x080c, 0x2048, 0x0428, 0x2031, 0x0080, 0x9584, 0x007f, 0x0108,
+	0x9632, 0x7124, 0x7000, 0x9086, 0x0000, 0x1198, 0xc185, 0x7126,
+	0x2009, 0x0306, 0x2104, 0xd0b4, 0x1904, 0x1e0e, 0x200b, 0x4040,
+	0x2009, 0x1a7f, 0x2104, 0x8000, 0x0a04, 0x1e0e, 0x200a, 0x0804,
+	0x1e0e, 0xc18d, 0x7126, 0xd184, 0x1d58, 0x0804, 0x1e0e, 0x9006,
+	0x002e, 0x003e, 0x004e, 0x005e, 0x006e, 0x007e, 0x0005, 0x080c,
+	0x0dd5, 0x0026, 0x2001, 0x0105, 0x2003, 0x0010, 0x782b, 0x0004,
+	0x7003, 0x0000, 0x7004, 0x0016, 0x080c, 0x1cbe, 0x001e, 0x2060,
+	0x6014, 0x2048, 0x080c, 0xcb1b, 0x0118, 0xa880, 0xc0bd, 0xa882,
 	0x6020, 0x9086, 0x0006, 0x1180, 0x2061, 0x0100, 0x62c8, 0x2001,
 	0x00fa, 0x8001, 0x1df0, 0x60c8, 0x9206, 0x1dc0, 0x60c4, 0xa89a,
-	0x60c8, 0xa896, 0x7004, 0x2060, 0x00c6, 0x080c, 0xc472, 0x00ce,
-	0x2001, 0x19f4, 0x2004, 0x9c06, 0x1160, 0x2009, 0x0040, 0x080c,
-	0x2284, 0x080c, 0xa4d6, 0x2011, 0x0000, 0x080c, 0xa353, 0x080c,
-	0x9548, 0x002e, 0x0804, 0x1eba, 0x0126, 0x2091, 0x2400, 0xa858,
-	0x2040, 0x792c, 0x782b, 0x0002, 0x9184, 0x0700, 0x1904, 0x1d4d,
-	0x7000, 0x0002, 0x1eba, 0x1d9e, 0x1e0b, 0x1eb8, 0x8001, 0x7002,
-	0xd19c, 0x1150, 0x8aff, 0x05b0, 0x080c, 0x1bf5, 0x0904, 0x1eba,
-	0x080c, 0x1bf5, 0x0804, 0x1eba, 0x782b, 0x0004, 0xd194, 0x0148,
-	0xa880, 0xc0fc, 0xa882, 0x8aff, 0x11d8, 0xa87c, 0xc0f5, 0xa87e,
-	0x00b8, 0x0026, 0x0036, 0xab3c, 0xaa40, 0x7810, 0xa82e, 0x931a,
-	0x7814, 0xa832, 0x9213, 0x7800, 0xa81e, 0x7804, 0xa822, 0xab3e,
-	0xaa42, 0x003e, 0x002e, 0x080c, 0x1f20, 0xa880, 0xc0fd, 0xa882,
-	0x2a00, 0xa816, 0x2800, 0xa85a, 0x2c00, 0xa812, 0x7003, 0x0000,
-	0x0804, 0x1eba, 0x00f6, 0x0026, 0x781c, 0x0006, 0x7818, 0x0006,
-	0x2079, 0x0100, 0x7a14, 0x9284, 0x1984, 0x9085, 0x0012, 0x7816,
-	0x0036, 0x2019, 0x1000, 0x8319, 0x090c, 0x0dd5, 0x7820, 0xd0bc,
-	0x1dd0, 0x003e, 0x79c8, 0x000e, 0x9102, 0x001e, 0x0006, 0x0016,
-	0x79c4, 0x000e, 0x9103, 0x78c6, 0x000e, 0x78ca, 0x9284, 0x1984,
-	0x9085, 0x0012, 0x7816, 0x002e, 0x00fe, 0x782b, 0x0008, 0x7003,
-	0x0000, 0x0804, 0x1eba, 0x8001, 0x7002, 0xd194, 0x0170, 0x782c,
-	0xd0fc, 0x1904, 0x1d91, 0xd19c, 0x1904, 0x1eb6, 0x8aff, 0x0904,
-	0x1eba, 0x080c, 0x1bf5, 0x0804, 0x1eba, 0x0026, 0x0036, 0xab3c,
-	0xaa40, 0x080c, 0x1f20, 0xdd9c, 0x1904, 0x1e75, 0x2c05, 0x908a,
-	0x0036, 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x1e49, 0x1e49,
-	0x1e4b, 0x1e49, 0x1e49, 0x1e49, 0x1e51, 0x1e49, 0x1e49, 0x1e49,
-	0x1e57, 0x1e49, 0x1e49, 0x1e49, 0x1e5d, 0x1e49, 0x1e49, 0x1e49,
-	0x1e63, 0x1e49, 0x1e49, 0x1e49, 0x1e69, 0x1e49, 0x1e49, 0x1e49,
-	0x1e6f, 0x080c, 0x0dd5, 0xa07c, 0x931a, 0xa080, 0x9213, 0x0804,
-	0x1dbd, 0xa08c, 0x931a, 0xa090, 0x9213, 0x0804, 0x1dbd, 0xa09c,
-	0x931a, 0xa0a0, 0x9213, 0x0804, 0x1dbd, 0xa0ac, 0x931a, 0xa0b0,
-	0x9213, 0x0804, 0x1dbd, 0xa0bc, 0x931a, 0xa0c0, 0x9213, 0x0804,
-	0x1dbd, 0xa0cc, 0x931a, 0xa0d0, 0x9213, 0x0804, 0x1dbd, 0xa0dc,
-	0x931a, 0xa0e0, 0x9213, 0x0804, 0x1dbd, 0x2c05, 0x908a, 0x0034,
-	0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x1e98, 0x1e96, 0x1e96,
-	0x1e96, 0x1e96, 0x1e96, 0x1e9e, 0x1e96, 0x1e96, 0x1e96, 0x1e96,
-	0x1e96, 0x1ea4, 0x1e96, 0x1e96, 0x1e96, 0x1e96, 0x1e96, 0x1eaa,
-	0x1e96, 0x1e96, 0x1e96, 0x1e96, 0x1e96, 0x1eb0, 0x080c, 0x0dd5,
-	0xa07c, 0x931a, 0xa080, 0x9213, 0x0804, 0x1dbd, 0xa094, 0x931a,
-	0xa098, 0x9213, 0x0804, 0x1dbd, 0xa0ac, 0x931a, 0xa0b0, 0x9213,
-	0x0804, 0x1dbd, 0xa0c4, 0x931a, 0xa0c8, 0x9213, 0x0804, 0x1dbd,
-	0xa0dc, 0x931a, 0xa0e0, 0x9213, 0x0804, 0x1dbd, 0x0804, 0x1db9,
-	0x080c, 0x0dd5, 0x012e, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a64,
-	0x7000, 0x9086, 0x0000, 0x0904, 0x1f05, 0x2079, 0x0090, 0x2009,
-	0x0207, 0x210c, 0xd194, 0x01b8, 0x2009, 0x020c, 0x210c, 0x9184,
-	0x0003, 0x0188, 0x080c, 0xe6ad, 0x2001, 0x0133, 0x2004, 0x9005,
-	0x090c, 0x0dd5, 0x0016, 0x2009, 0x0040, 0x080c, 0x2284, 0x001e,
-	0x2001, 0x020c, 0x2102, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203,
-	0x210c, 0x9106, 0x1120, 0x2009, 0x0040, 0x080c, 0x2284, 0x782c,
-	0xd0fc, 0x09a8, 0x080c, 0x1d8c, 0x7000, 0x9086, 0x0000, 0x1978,
-	0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c,
-	0x2284, 0x782b, 0x0002, 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005,
-	0x8c60, 0x2c05, 0x9005, 0x0110, 0x8a51, 0x0005, 0xa004, 0x9005,
-	0x0168, 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, 0x1f4a,
-	0x2065, 0x8cff, 0x090c, 0x0dd5, 0x8a51, 0x0005, 0x2050, 0x0005,
-	0x8a50, 0x8c61, 0x2c05, 0x9005, 0x1190, 0x2800, 0x9906, 0x0120,
-	0xa000, 0x9005, 0x1108, 0x2900, 0x2040, 0xa85a, 0xa064, 0x9084,
-	0x000f, 0x9080, 0x1f5a, 0x2065, 0x8cff, 0x090c, 0x0dd5, 0x0005,
-	0x0000, 0x001d, 0x0021, 0x0025, 0x0029, 0x002d, 0x0031, 0x0035,
-	0x0000, 0x001b, 0x0021, 0x0027, 0x002d, 0x0033, 0x0000, 0x0000,
-	0x0023, 0x0000, 0x0000, 0x1f3d, 0x1f39, 0x1f3d, 0x1f3d, 0x1f47,
-	0x0000, 0x1f3d, 0x1f44, 0x1f44, 0x1f41, 0x1f44, 0x1f44, 0x0000,
-	0x1f47, 0x1f44, 0x0000, 0x1f3f, 0x1f3f, 0x0000, 0x1f3f, 0x1f47,
-	0x0000, 0x1f3f, 0x1f45, 0x1f45, 0x1f45, 0x0000, 0x1f45, 0x0000,
-	0x1f47, 0x1f45, 0x00c6, 0x00d6, 0x0086, 0xab42, 0xac3e, 0xa888,
-	0x9055, 0x0904, 0x2141, 0x2940, 0xa064, 0x90ec, 0x000f, 0x9de0,
-	0x1f4a, 0x9d86, 0x0007, 0x0130, 0x9d86, 0x000e, 0x0118, 0x9d86,
-	0x000f, 0x1120, 0xa08c, 0x9422, 0xa090, 0x931b, 0x2c05, 0x9065,
-	0x1140, 0x0310, 0x0804, 0x2141, 0xa004, 0x9045, 0x0904, 0x2141,
-	0x0c18, 0x2c05, 0x9005, 0x0904, 0x2029, 0xdd9c, 0x1904, 0x1fe5,
-	0x908a, 0x0036, 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x1fba,
-	0x1fba, 0x1fbc, 0x1fba, 0x1fba, 0x1fba, 0x1fc2, 0x1fba, 0x1fba,
-	0x1fba, 0x1fc8, 0x1fba, 0x1fba, 0x1fba, 0x1fce, 0x1fba, 0x1fba,
-	0x1fba, 0x1fd4, 0x1fba, 0x1fba, 0x1fba, 0x1fda, 0x1fba, 0x1fba,
-	0x1fba, 0x1fe0, 0x080c, 0x0dd5, 0xa07c, 0x9422, 0xa080, 0x931b,
-	0x0804, 0x201f, 0xa08c, 0x9422, 0xa090, 0x931b, 0x0804, 0x201f,
-	0xa09c, 0x9422, 0xa0a0, 0x931b, 0x0804, 0x201f, 0xa0ac, 0x9422,
-	0xa0b0, 0x931b, 0x0804, 0x201f, 0xa0bc, 0x9422, 0xa0c0, 0x931b,
-	0x0804, 0x201f, 0xa0cc, 0x9422, 0xa0d0, 0x931b, 0x0804, 0x201f,
-	0xa0dc, 0x9422, 0xa0e0, 0x931b, 0x04d0, 0x908a, 0x0034, 0x1a0c,
-	0x0dd5, 0x9082, 0x001b, 0x0002, 0x2007, 0x2005, 0x2005, 0x2005,
-	0x2005, 0x2005, 0x200c, 0x2005, 0x2005, 0x2005, 0x2005, 0x2005,
-	0x2011, 0x2005, 0x2005, 0x2005, 0x2005, 0x2005, 0x2016, 0x2005,
-	0x2005, 0x2005, 0x2005, 0x2005, 0x201b, 0x080c, 0x0dd5, 0xa07c,
-	0x9422, 0xa080, 0x931b, 0x0098, 0xa094, 0x9422, 0xa098, 0x931b,
-	0x0070, 0xa0ac, 0x9422, 0xa0b0, 0x931b, 0x0048, 0xa0c4, 0x9422,
-	0xa0c8, 0x931b, 0x0020, 0xa0dc, 0x9422, 0xa0e0, 0x931b, 0x0630,
-	0x2300, 0x9405, 0x0160, 0x8a51, 0x0904, 0x2141, 0x8c60, 0x0804,
-	0x1f91, 0xa004, 0x9045, 0x0904, 0x2141, 0x0804, 0x1f74, 0x8a51,
-	0x0904, 0x2141, 0x8c60, 0x2c05, 0x9005, 0x1158, 0xa004, 0x9045,
-	0x0904, 0x2141, 0xa064, 0x90ec, 0x000f, 0x9de0, 0x1f4a, 0x2c05,
-	0x2060, 0xa880, 0xc0fc, 0xa882, 0x0804, 0x2136, 0x2c05, 0x8422,
-	0x8420, 0x831a, 0x9399, 0x0000, 0xac2e, 0xab32, 0xdd9c, 0x1904,
-	0x20d3, 0x9082, 0x001b, 0x0002, 0x206f, 0x206f, 0x2071, 0x206f,
-	0x206f, 0x206f, 0x207f, 0x206f, 0x206f, 0x206f, 0x208d, 0x206f,
-	0x206f, 0x206f, 0x209b, 0x206f, 0x206f, 0x206f, 0x20a9, 0x206f,
-	0x206f, 0x206f, 0x20b7, 0x206f, 0x206f, 0x206f, 0x20c5, 0x080c,
-	0x0dd5, 0xa17c, 0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c,
-	0x0dd5, 0xa074, 0x9420, 0xa078, 0x9319, 0x0804, 0x2131, 0xa18c,
-	0x2400, 0x9122, 0xa190, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa084,
-	0x9420, 0xa088, 0x9319, 0x0804, 0x2131, 0xa19c, 0x2400, 0x9122,
-	0xa1a0, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa094, 0x9420, 0xa098,
-	0x9319, 0x0804, 0x2131, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300,
-	0x911b, 0x0a0c, 0x0dd5, 0xa0a4, 0x9420, 0xa0a8, 0x9319, 0x0804,
-	0x2131, 0xa1bc, 0x2400, 0x9122, 0xa1c0, 0x2300, 0x911b, 0x0a0c,
-	0x0dd5, 0xa0b4, 0x9420, 0xa0b8, 0x9319, 0x0804, 0x2131, 0xa1cc,
-	0x2400, 0x9122, 0xa1d0, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa0c4,
-	0x9420, 0xa0c8, 0x9319, 0x0804, 0x2131, 0xa1dc, 0x2400, 0x9122,
-	0xa1e0, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa0d4, 0x9420, 0xa0d8,
-	0x9319, 0x0804, 0x2131, 0x9082, 0x001b, 0x0002, 0x20f1, 0x20ef,
-	0x20ef, 0x20ef, 0x20ef, 0x20ef, 0x20fe, 0x20ef, 0x20ef, 0x20ef,
-	0x20ef, 0x20ef, 0x210b, 0x20ef, 0x20ef, 0x20ef, 0x20ef, 0x20ef,
-	0x2118, 0x20ef, 0x20ef, 0x20ef, 0x20ef, 0x20ef, 0x2125, 0x080c,
-	0x0dd5, 0xa17c, 0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c,
-	0x0dd5, 0xa06c, 0x9420, 0xa070, 0x9319, 0x0498, 0xa194, 0x2400,
-	0x9122, 0xa198, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa084, 0x9420,
-	0xa088, 0x9319, 0x0430, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300,
-	0x911b, 0x0a0c, 0x0dd5, 0xa09c, 0x9420, 0xa0a0, 0x9319, 0x00c8,
-	0xa1c4, 0x2400, 0x9122, 0xa1c8, 0x2300, 0x911b, 0x0a0c, 0x0dd5,
-	0xa0b4, 0x9420, 0xa0b8, 0x9319, 0x0060, 0xa1dc, 0x2400, 0x9122,
-	0xa1e0, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa0cc, 0x9420, 0xa0d0,
-	0x9319, 0xac1e, 0xab22, 0xa880, 0xc0fd, 0xa882, 0x2800, 0xa85a,
-	0x2c00, 0xa812, 0x2a00, 0xa816, 0x000e, 0x000e, 0x000e, 0x9006,
-	0x0028, 0x008e, 0x00de, 0x00ce, 0x9085, 0x0001, 0x0005, 0x2001,
-	0x0005, 0x2004, 0xd0bc, 0x190c, 0x0dce, 0x9084, 0x0007, 0x0002,
-	0x2162, 0x1d8c, 0x2162, 0x2158, 0x215b, 0x215e, 0x215b, 0x215e,
-	0x080c, 0x1d8c, 0x0005, 0x080c, 0x119a, 0x0005, 0x080c, 0x1d8c,
-	0x080c, 0x119a, 0x0005, 0x0126, 0x2091, 0x2600, 0x2079, 0x0200,
-	0x2071, 0x0260, 0x2069, 0x1800, 0x7817, 0x0000, 0x789b, 0x0814,
-	0x78a3, 0x0406, 0x789f, 0x0410, 0x2009, 0x013b, 0x200b, 0x0400,
-	0x781b, 0x0002, 0x783b, 0x001f, 0x7837, 0x0020, 0x7803, 0x1600,
-	0x012e, 0x0005, 0x2091, 0x2600, 0x781c, 0xd0a4, 0x190c, 0x2281,
-	0x7900, 0xd1dc, 0x1118, 0x9084, 0x0006, 0x001a, 0x9084, 0x000e,
-	0x0002, 0x21a9, 0x21a1, 0x7b59, 0x21a1, 0x21a3, 0x21a3, 0x21a3,
-	0x21a3, 0x7b3f, 0x21a1, 0x21a5, 0x21a1, 0x21a3, 0x21a1, 0x21a3,
-	0x21a1, 0x080c, 0x0dd5, 0x0031, 0x0020, 0x080c, 0x7b3f, 0x080c,
-	0x7b59, 0x0005, 0x0006, 0x0016, 0x0026, 0x080c, 0xe6ad, 0x7930,
-	0x9184, 0x0003, 0x01c0, 0x2001, 0x19f4, 0x2004, 0x9005, 0x0170,
-	0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0dd5, 0x00c6, 0x2001,
-	0x19f4, 0x2064, 0x080c, 0xc472, 0x00ce, 0x00f8, 0x2009, 0x0040,
-	0x080c, 0x2284, 0x00d0, 0x9184, 0x0014, 0x01a0, 0x6a00, 0x9286,
-	0x0003, 0x0160, 0x080c, 0x717d, 0x1138, 0x080c, 0x7465, 0x080c,
-	0x5df8, 0x080c, 0x70af, 0x0010, 0x080c, 0x5cb7, 0x080c, 0x7bf7,
-	0x0041, 0x0018, 0x9184, 0x9540, 0x1dc8, 0x002e, 0x001e, 0x000e,
-	0x0005, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a60, 0x080c,
-	0x19ff, 0x005e, 0x004e, 0x003e, 0x00ee, 0x0005, 0x0126, 0x2091,
-	0x2e00, 0x2071, 0x1800, 0x7128, 0x2001, 0x196f, 0x2102, 0x2001,
-	0x1977, 0x2102, 0x2001, 0x013b, 0x2102, 0x2079, 0x0200, 0x2001,
-	0x0201, 0x789e, 0x78a3, 0x0200, 0x9198, 0x0007, 0x831c, 0x831c,
-	0x831c, 0x9398, 0x0005, 0x2320, 0x9182, 0x0204, 0x1230, 0x2011,
-	0x0008, 0x8423, 0x8423, 0x8423, 0x0488, 0x9182, 0x024c, 0x1240,
-	0x2011, 0x0007, 0x8403, 0x8003, 0x9400, 0x9400, 0x9420, 0x0430,
-	0x9182, 0x02bc, 0x1238, 0x2011, 0x0006, 0x8403, 0x8003, 0x9400,
-	0x9420, 0x00e0, 0x9182, 0x034c, 0x1230, 0x2011, 0x0005, 0x8403,
-	0x8003, 0x9420, 0x0098, 0x9182, 0x042c, 0x1228, 0x2011, 0x0004,
-	0x8423, 0x8423, 0x0058, 0x9182, 0x059c, 0x1228, 0x2011, 0x0003,
-	0x8403, 0x9420, 0x0018, 0x2011, 0x0002, 0x8423, 0x9482, 0x0228,
-	0x8002, 0x8020, 0x8301, 0x9402, 0x0110, 0x0208, 0x8321, 0x8217,
-	0x8203, 0x9405, 0x789a, 0x012e, 0x0005, 0x0006, 0x00d6, 0x2069,
-	0x0200, 0x6814, 0x9084, 0xffc0, 0x910d, 0x6916, 0x00de, 0x000e,
-	0x0005, 0x00d6, 0x2069, 0x0200, 0x9005, 0x6810, 0x0110, 0xc0a5,
-	0x0008, 0xc0a4, 0x6812, 0x00de, 0x0005, 0x0006, 0x00d6, 0x2069,
-	0x0200, 0x6810, 0x9084, 0xfff8, 0x910d, 0x6912, 0x00de, 0x000e,
-	0x0005, 0x7938, 0x080c, 0x0dce, 0x00f6, 0x2079, 0x0200, 0x7902,
-	0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x7902, 0xa001,
-	0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x00fe, 0x0005, 0x0126,
-	0x2091, 0x2800, 0x2061, 0x0100, 0x2071, 0x1800, 0x2009, 0x0000,
-	0x080c, 0x2af0, 0x080c, 0x2a0b, 0x6054, 0x8004, 0x8004, 0x8004,
-	0x8004, 0x9084, 0x000c, 0x6150, 0x918c, 0xfff3, 0x9105, 0x6052,
-	0x6050, 0x9084, 0xb17f, 0x9085, 0x2000, 0x6052, 0x2009, 0x199b,
-	0x2011, 0x199c, 0x6358, 0x939c, 0x38f0, 0x2320, 0x080c, 0x2a4f,
-	0x1238, 0x939d, 0x4003, 0x94a5, 0x8603, 0x230a, 0x2412, 0x0030,
-	0x939d, 0x0203, 0x94a5, 0x8603, 0x230a, 0x2412, 0x9006, 0x080c,
-	0x2a3a, 0x9006, 0x080c, 0x2a1d, 0x20a9, 0x0012, 0x1d04, 0x22d6,
-	0x2091, 0x6000, 0x1f04, 0x22d6, 0x602f, 0x0100, 0x602f, 0x0000,
-	0x6050, 0x9085, 0x0400, 0x9084, 0xdfff, 0x6052, 0x6024, 0x6026,
-	0x080c, 0x2729, 0x2009, 0x00ef, 0x6132, 0x6136, 0x080c, 0x2739,
-	0x60e7, 0x0000, 0x61ea, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043,
-	0x0000, 0x602f, 0x0080, 0x602f, 0x0000, 0x6007, 0x349f, 0x60bb,
-	0x0000, 0x20a9, 0x0018, 0x60bf, 0x0000, 0x1f04, 0x2303, 0x60bb,
-	0x0000, 0x60bf, 0x0108, 0x60bf, 0x0012, 0x60bf, 0x0405, 0x60bf,
-	0x0014, 0x60bf, 0x0320, 0x60bf, 0x0018, 0x601b, 0x00f0, 0x601f,
-	0x001e, 0x600f, 0x006b, 0x602b, 0x402f, 0x012e, 0x0005, 0x00f6,
-	0x2079, 0x0140, 0x78c3, 0x0080, 0x78c3, 0x0083, 0x78c3, 0x0000,
-	0x00fe, 0x0005, 0x2001, 0x1835, 0x2003, 0x0000, 0x2001, 0x1834,
-	0x2003, 0x0001, 0x0005, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016,
-	0x0026, 0x6124, 0x0066, 0x2031, 0x1837, 0x2634, 0x96b4, 0x0028,
-	0x006e, 0x1138, 0x6020, 0xd1bc, 0x0120, 0xd0bc, 0x1168, 0xd0b4,
-	0x1198, 0x9184, 0x5e2c, 0x1118, 0x9184, 0x0007, 0x00aa, 0x9195,
-	0x0004, 0x9284, 0x0007, 0x0082, 0x0016, 0x2001, 0x188b, 0x200c,
-	0xd184, 0x001e, 0x0d70, 0x0c98, 0x0016, 0x2001, 0x188b, 0x200c,
-	0xd194, 0x001e, 0x0d30, 0x0c58, 0x2386, 0x236c, 0x236f, 0x2372,
-	0x2377, 0x2379, 0x237d, 0x2381, 0x080c, 0x8d64, 0x00b8, 0x080c,
-	0x8e31, 0x00a0, 0x080c, 0x8e31, 0x080c, 0x8d64, 0x0078, 0x0099,
-	0x0068, 0x080c, 0x8d64, 0x0079, 0x0048, 0x080c, 0x8e31, 0x0059,
-	0x0028, 0x080c, 0x8e31, 0x080c, 0x8d64, 0x0029, 0x002e, 0x001e,
-	0x000e, 0x012e, 0x0005, 0x00a6, 0x6124, 0x6028, 0xd09c, 0x0118,
-	0xd19c, 0x1904, 0x25ee, 0xd1f4, 0x190c, 0x0dce, 0x080c, 0x717d,
-	0x0904, 0x23e1, 0x080c, 0xcf18, 0x1120, 0x7000, 0x9086, 0x0003,
-	0x0570, 0x6024, 0x9084, 0x1800, 0x0550, 0x080c, 0x71a0, 0x0118,
-	0x080c, 0x718e, 0x1520, 0x6027, 0x0020, 0x6043, 0x0000, 0x080c,
-	0xcf18, 0x0168, 0x080c, 0x71a0, 0x1150, 0x2001, 0x19a5, 0x2003,
-	0x0001, 0x6027, 0x1800, 0x080c, 0x7013, 0x0804, 0x25f1, 0x70a4,
-	0x9005, 0x1150, 0x70a7, 0x0001, 0x00d6, 0x2069, 0x0140, 0x080c,
-	0x71d4, 0x00de, 0x1904, 0x25f1, 0x080c, 0x746f, 0x0428, 0x080c,
-	0x71a0, 0x1590, 0x6024, 0x9084, 0x1800, 0x1108, 0x0468, 0x080c,
-	0x746f, 0x080c, 0x7465, 0x080c, 0x5df8, 0x080c, 0x70af, 0x0804,
-	0x25ee, 0xd1ac, 0x1508, 0x6024, 0xd0dc, 0x1170, 0xd0e4, 0x1178,
-	0xd0d4, 0x1190, 0xd0cc, 0x0130, 0x7098, 0x9086, 0x0028, 0x1110,
-	0x080c, 0x7352, 0x0804, 0x25ee, 0x080c, 0x746a, 0x0048, 0x2001,
-	0x197d, 0x2003, 0x0002, 0x0020, 0x080c, 0x72b7, 0x0804, 0x25ee,
-	0x080c, 0x73ed, 0x0804, 0x25ee, 0x6220, 0xd1bc, 0x0138, 0xd2bc,
-	0x1904, 0x2661, 0xd2b4, 0x1904, 0x2674, 0x0000, 0xd1ac, 0x0904,
-	0x2503, 0x0036, 0x6328, 0xc3bc, 0x632a, 0x003e, 0x080c, 0x717d,
-	0x11c0, 0x6027, 0x0020, 0x0006, 0x0026, 0x0036, 0x080c, 0x7197,
-	0x1158, 0x080c, 0x7465, 0x080c, 0x5df8, 0x080c, 0x70af, 0x003e,
-	0x002e, 0x000e, 0x00ae, 0x0005, 0x003e, 0x002e, 0x000e, 0x080c,
-	0x7155, 0x0016, 0x0046, 0x00c6, 0x644c, 0x9486, 0xf0f0, 0x1138,
-	0x2061, 0x0100, 0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74da,
-	0x948c, 0xff00, 0x7038, 0xd084, 0x0178, 0x9186, 0xf800, 0x1160,
-	0x7048, 0xd084, 0x1148, 0xc085, 0x704a, 0x0036, 0x2418, 0x2011,
-	0x8016, 0x080c, 0x48fb, 0x003e, 0x080c, 0xcf11, 0x1904, 0x24e0,
-	0x9196, 0xff00, 0x05a8, 0x7060, 0x9084, 0x00ff, 0x810f, 0x81ff,
-	0x0110, 0x9116, 0x0568, 0x7130, 0xd184, 0x1550, 0x080c, 0x31c4,
-	0x0128, 0xc18d, 0x7132, 0x080c, 0x672f, 0x1510, 0x6240, 0x9294,
-	0x0010, 0x0130, 0x6248, 0x9294, 0xff00, 0x9296, 0xff00, 0x01c0,
-	0x7030, 0xd08c, 0x0904, 0x24e0, 0x7038, 0xd08c, 0x1140, 0x2001,
-	0x180c, 0x200c, 0xd1ac, 0x1904, 0x24e0, 0xc1ad, 0x2102, 0x0036,
-	0x73d8, 0x2011, 0x8013, 0x080c, 0x48fb, 0x003e, 0x0804, 0x24e0,
-	0x7038, 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904,
-	0x24e0, 0xc1ad, 0x2102, 0x0036, 0x73d8, 0x2011, 0x8013, 0x080c,
-	0x48fb, 0x003e, 0x7130, 0xc185, 0x7132, 0x2011, 0x1848, 0x220c,
-	0xd1a4, 0x01f0, 0x0016, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c,
-	0x846c, 0x2019, 0x000e, 0x00c6, 0x2061, 0x0000, 0x080c, 0xe1f4,
-	0x00ce, 0x9484, 0x00ff, 0x9080, 0x31d0, 0x200d, 0x918c, 0xff00,
-	0x810f, 0x2120, 0x9006, 0x2009, 0x000e, 0x080c, 0xe280, 0x001e,
-	0x0016, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x3039, 0x001e,
-	0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x63cd,
-	0x1110, 0x080c, 0x5e12, 0x8108, 0x1f04, 0x24d6, 0x00be, 0x015e,
-	0x00ce, 0x004e, 0x080c, 0xaadc, 0x60e3, 0x0000, 0x001e, 0x2001,
-	0x1800, 0x2014, 0x9296, 0x0004, 0x1170, 0xd19c, 0x11a0, 0x2011,
-	0x180c, 0x2214, 0xd29c, 0x1120, 0x6204, 0x9295, 0x0002, 0x6206,
-	0x6228, 0xc29d, 0x622a, 0x2003, 0x0001, 0x2001, 0x1826, 0x2003,
-	0x0000, 0x6027, 0x0020, 0xd194, 0x0904, 0x25ee, 0x0016, 0x6220,
-	0xd2b4, 0x0904, 0x258b, 0x080c, 0x8308, 0x080c, 0x9ffc, 0x6027,
-	0x0004, 0x00f6, 0x2019, 0x19ee, 0x2304, 0x907d, 0x0904, 0x255a,
-	0x7804, 0x9086, 0x0032, 0x15f0, 0x00d6, 0x00c6, 0x00e6, 0x0096,
-	0x2069, 0x0140, 0x782c, 0x685e, 0x7808, 0x685a, 0x6043, 0x0002,
-	0x2001, 0x0003, 0x8001, 0x1df0, 0x6043, 0x0000, 0x2001, 0x003c,
-	0x8001, 0x1df0, 0x080c, 0x2bb1, 0x2001, 0x001e, 0x8001, 0x0240,
-	0x20a9, 0x0009, 0x080c, 0x2acb, 0x6904, 0xd1dc, 0x1140, 0x0cb0,
-	0x2001, 0x0100, 0x080c, 0x2ba1, 0x9006, 0x080c, 0x2ba1, 0x080c,
-	0x9317, 0x080c, 0x941c, 0x7814, 0x2048, 0xa867, 0x0103, 0x2f60,
-	0x080c, 0xab6b, 0x009e, 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e,
-	0x00ae, 0x0005, 0x00fe, 0x00d6, 0x2069, 0x0140, 0x6804, 0x9084,
-	0x4000, 0x0110, 0x080c, 0x2bb1, 0x00de, 0x00c6, 0x2061, 0x19e5,
-	0x6028, 0x080c, 0xcf18, 0x0120, 0x909a, 0x0003, 0x1258, 0x0018,
-	0x909a, 0x00c8, 0x1238, 0x8000, 0x602a, 0x00ce, 0x080c, 0x9fd8,
-	0x0804, 0x25ed, 0x2061, 0x0100, 0x62c0, 0x080c, 0xa967, 0x2019,
-	0x19ee, 0x2304, 0x9065, 0x0120, 0x2009, 0x0027, 0x080c, 0xabe6,
-	0x00ce, 0x0804, 0x25ed, 0xd2bc, 0x0904, 0x25d4, 0x080c, 0x8315,
-	0x6014, 0x9084, 0x1984, 0x9085, 0x0010, 0x6016, 0x6027, 0x0004,
-	0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0110, 0x080c,
-	0x2bb1, 0x00de, 0x00c6, 0x2061, 0x19e5, 0x6044, 0x080c, 0xcf18,
-	0x0120, 0x909a, 0x0003, 0x1658, 0x0018, 0x909a, 0x00c8, 0x1638,
-	0x8000, 0x6046, 0x603c, 0x00ce, 0x9005, 0x05b8, 0x2009, 0x07d0,
-	0x080c, 0x830d, 0x9080, 0x0008, 0x2004, 0x9086, 0x0006, 0x1138,
-	0x6114, 0x918c, 0x1984, 0x918d, 0x0012, 0x6116, 0x0430, 0x9080,
-	0x0008, 0x2004, 0x9086, 0x0009, 0x0d98, 0x6114, 0x918c, 0x1984,
-	0x918d, 0x0016, 0x6116, 0x00c8, 0x6027, 0x0004, 0x00b0, 0x0036,
-	0x2019, 0x0001, 0x080c, 0xa2ac, 0x003e, 0x2019, 0x19f4, 0x2304,
-	0x9065, 0x0150, 0x2009, 0x004f, 0x6020, 0x9086, 0x0009, 0x1110,
-	0x2009, 0x004f, 0x080c, 0xabe6, 0x00ce, 0x001e, 0xd19c, 0x0904,
-	0x265c, 0x7038, 0xd0ac, 0x1904, 0x2635, 0x0016, 0x0156, 0x6027,
-	0x0008, 0x6050, 0x9085, 0x0040, 0x6052, 0x6050, 0x9084, 0xfbcf,
-	0x6052, 0x080c, 0x2aea, 0x9085, 0x2000, 0x6052, 0x20a9, 0x0012,
-	0x1d04, 0x2608, 0x080c, 0x833c, 0x1f04, 0x2608, 0x6050, 0x9085,
-	0x0400, 0x9084, 0xdfbf, 0x6052, 0x20a9, 0x0028, 0xa001, 0x1f04,
-	0x2616, 0x6150, 0x9185, 0x1400, 0x6052, 0x20a9, 0x0366, 0x1d04,
-	0x261f, 0x080c, 0x833c, 0x6020, 0xd09c, 0x1130, 0x015e, 0x6152,
-	0x001e, 0x6027, 0x0008, 0x0480, 0x080c, 0x2ab2, 0x1f04, 0x261f,
-	0x015e, 0x6152, 0x001e, 0x6027, 0x0008, 0x0016, 0x6028, 0xc09c,
-	0x602a, 0x080c, 0xaadc, 0x60e3, 0x0000, 0x080c, 0xe68c, 0x080c,
-	0xe6a7, 0x080c, 0x54bb, 0xd0fc, 0x1138, 0x080c, 0xcf11, 0x1120,
-	0x9085, 0x0001, 0x080c, 0x71c4, 0x9006, 0x080c, 0x2ba1, 0x2009,
-	0x0002, 0x080c, 0x2af0, 0x2001, 0x1800, 0x2003, 0x0004, 0x6027,
-	0x0008, 0x080c, 0x0bae, 0x001e, 0x918c, 0xffd0, 0x6126, 0x00ae,
-	0x0005, 0x0016, 0x2001, 0x188b, 0x200c, 0xd184, 0x001e, 0x0904,
-	0x240e, 0x0016, 0x2009, 0x266d, 0x00d0, 0x2001, 0x188b, 0x200c,
-	0xc184, 0x2102, 0x001e, 0x0c40, 0x0016, 0x2001, 0x188b, 0x200c,
-	0xd194, 0x001e, 0x0904, 0x240e, 0x0016, 0x2009, 0x2680, 0x0038,
-	0x2001, 0x188b, 0x200c, 0xc194, 0x2102, 0x001e, 0x08a8, 0x6028,
-	0xc0bc, 0x602a, 0x2001, 0x0156, 0x2003, 0xbc91, 0x8000, 0x2003,
-	0xffff, 0x6043, 0x0001, 0x080c, 0x2aea, 0x6027, 0x0080, 0x6017,
-	0x0000, 0x6043, 0x0000, 0x0817, 0x0006, 0x0016, 0x0026, 0x0036,
-	0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x71d0,
-	0x70d2, 0x9116, 0x05e8, 0x81ff, 0x01a0, 0x2009, 0x0000, 0x080c,
-	0x2af0, 0x2011, 0x8011, 0x2019, 0x010e, 0x231c, 0x939e, 0x0007,
-	0x1118, 0x2019, 0x0001, 0x0010, 0x2019, 0x0000, 0x080c, 0x48fb,
-	0x0438, 0x2001, 0x19a6, 0x200c, 0x81ff, 0x1140, 0x2001, 0x0109,
-	0x2004, 0xd0b4, 0x0118, 0x2019, 0x0003, 0x0008, 0x2118, 0x2011,
-	0x8012, 0x080c, 0x48fb, 0x080c, 0x54bb, 0xd0fc, 0x1188, 0x080c,
-	0xcf11, 0x1170, 0x00c6, 0x080c, 0x2784, 0x080c, 0xa213, 0x2061,
-	0x0100, 0x2019, 0x0028, 0x2009, 0x0002, 0x080c, 0x3039, 0x00ce,
-	0x012e, 0x00fe, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005,
-	0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, 0xff00, 0x11f0, 0x2011,
-	0x1837, 0x2214, 0xd2ac, 0x11c8, 0x81ff, 0x01e8, 0x2011, 0x181f,
-	0x2204, 0x9106, 0x1190, 0x2011, 0x1820, 0x2214, 0x9294, 0xff00,
-	0x9584, 0xff00, 0x9206, 0x1148, 0x2011, 0x1820, 0x2214, 0x9294,
-	0x00ff, 0x9584, 0x00ff, 0x9206, 0x1120, 0x2500, 0x080c, 0x7e50,
-	0x0048, 0x9584, 0x00ff, 0x9080, 0x31d0, 0x200d, 0x918c, 0xff00,
-	0x810f, 0x9006, 0x0005, 0x9080, 0x31d0, 0x200d, 0x918c, 0x00ff,
-	0x0005, 0x00d6, 0x2069, 0x0140, 0x2001, 0x1818, 0x2003, 0x00ef,
-	0x20a9, 0x0010, 0x9006, 0x6852, 0x6856, 0x1f04, 0x2734, 0x00de,
-	0x0005, 0x0006, 0x00d6, 0x0026, 0x2069, 0x0140, 0x2001, 0x1818,
-	0x2102, 0x8114, 0x8214, 0x8214, 0x8214, 0x20a9, 0x0010, 0x6853,
-	0x0000, 0x9006, 0x82ff, 0x1128, 0x9184, 0x000f, 0x9080, 0xee55,
-	0x2005, 0x6856, 0x8211, 0x1f04, 0x2749, 0x002e, 0x00de, 0x000e,
-	0x0005, 0x00c6, 0x2061, 0x1800, 0x6030, 0x0110, 0xc09d, 0x0008,
-	0xc09c, 0x6032, 0x00ce, 0x0005, 0x0156, 0x00d6, 0x0026, 0x0016,
-	0x0006, 0x2069, 0x0140, 0x6980, 0x9116, 0x0180, 0x9112, 0x1230,
-	0x8212, 0x8210, 0x22a8, 0x2001, 0x0402, 0x0018, 0x22a8, 0x2001,
-	0x0404, 0x680e, 0x1f04, 0x2779, 0x680f, 0x0000, 0x000e, 0x001e,
-	0x002e, 0x00de, 0x015e, 0x0005, 0x080c, 0x54b7, 0xd0c4, 0x0150,
-	0xd0a4, 0x0140, 0x9006, 0x0046, 0x2020, 0x2009, 0x002e, 0x080c,
-	0xe280, 0x004e, 0x0005, 0x00f6, 0x0016, 0x0026, 0x2079, 0x0140,
-	0x78c4, 0xd0dc, 0x0904, 0x27f0, 0x080c, 0x2a4f, 0x0660, 0x9084,
-	0x0700, 0x908e, 0x0600, 0x1120, 0x2011, 0x4000, 0x900e, 0x0458,
-	0x908e, 0x0500, 0x1120, 0x2011, 0x8000, 0x900e, 0x0420, 0x908e,
-	0x0400, 0x1120, 0x9016, 0x2009, 0x0001, 0x00e8, 0x908e, 0x0300,
-	0x1120, 0x9016, 0x2009, 0x0002, 0x00b0, 0x908e, 0x0200, 0x1120,
-	0x9016, 0x2009, 0x0004, 0x0078, 0x908e, 0x0100, 0x1548, 0x9016,
-	0x2009, 0x0008, 0x0040, 0x9084, 0x0700, 0x908e, 0x0300, 0x1500,
-	0x2011, 0x0030, 0x0058, 0x2300, 0x9080, 0x0020, 0x2018, 0x080c,
-	0x8cf7, 0x928c, 0xff00, 0x0110, 0x2011, 0x00ff, 0x2200, 0x8007,
-	0x9085, 0x004c, 0x78c2, 0x2009, 0x0138, 0x220a, 0x080c, 0x717d,
-	0x1118, 0x2009, 0x196d, 0x220a, 0x002e, 0x001e, 0x00fe, 0x0005,
-	0x78c3, 0x0000, 0x0cc8, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016,
-	0x0026, 0x2001, 0x0170, 0x200c, 0x8000, 0x2014, 0x9184, 0x0003,
-	0x0110, 0x080c, 0x0dce, 0x002e, 0x001e, 0x000e, 0x012e, 0x0005,
-	0x2001, 0x0171, 0x2004, 0xd0dc, 0x0168, 0x2001, 0x0170, 0x200c,
-	0x918c, 0x00ff, 0x918e, 0x004c, 0x1128, 0x200c, 0x918c, 0xff00,
-	0x810f, 0x0005, 0x900e, 0x2001, 0x0227, 0x2004, 0x8007, 0x9084,
-	0x00ff, 0x8004, 0x9108, 0x2001, 0x0226, 0x2004, 0x8007, 0x9084,
-	0x00ff, 0x8004, 0x9108, 0x0005, 0x0018, 0x000c, 0x0018, 0x0020,
-	0x1000, 0x0800, 0x1000, 0x1800, 0x0156, 0x0006, 0x0016, 0x0026,
-	0x00e6, 0x2001, 0x198e, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0dd5,
-	0x0033, 0x00ee, 0x002e, 0x001e, 0x000e, 0x015e, 0x0005, 0x284e,
-	0x286c, 0x2890, 0x2892, 0x28bb, 0x28bd, 0x28bf, 0x2001, 0x0001,
-	0x080c, 0x269c, 0x080c, 0x2aad, 0x2001, 0x1990, 0x2003, 0x0000,
-	0x7828, 0x9084, 0xe1d7, 0x782a, 0x9006, 0x20a9, 0x0009, 0x080c,
-	0x2a6b, 0x2001, 0x198e, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011,
-	0x28c0, 0x080c, 0x831a, 0x0005, 0x2009, 0x1993, 0x200b, 0x0000,
-	0x2001, 0x1998, 0x2003, 0x0036, 0x2001, 0x1997, 0x2003, 0x002a,
-	0x2001, 0x1990, 0x2003, 0x0001, 0x9006, 0x080c, 0x2a1d, 0x2001,
-	0xffff, 0x20a9, 0x0009, 0x080c, 0x2a6b, 0x2001, 0x198e, 0x2003,
-	0x0006, 0x2009, 0x001e, 0x2011, 0x28c0, 0x080c, 0x831a, 0x0005,
-	0x080c, 0x0dd5, 0x2001, 0x1998, 0x2003, 0x0036, 0x2001, 0x1990,
-	0x2003, 0x0003, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110,
-	0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2a1d, 0x2001, 0x1994,
-	0x2003, 0x0000, 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, 0x2a6b,
-	0x2001, 0x198e, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x28c0,
-	0x080c, 0x831a, 0x0005, 0x080c, 0x0dd5, 0x080c, 0x0dd5, 0x0005,
-	0x0006, 0x0016, 0x0026, 0x00e6, 0x00f6, 0x0156, 0x0126, 0x2091,
-	0x8000, 0x2079, 0x0100, 0x2001, 0x1990, 0x2004, 0x908a, 0x0007,
-	0x1a0c, 0x0dd5, 0x0043, 0x012e, 0x015e, 0x00fe, 0x00ee, 0x002e,
-	0x001e, 0x000e, 0x0005, 0x28e2, 0x2902, 0x2942, 0x2972, 0x2996,
-	0x29a6, 0x29a8, 0x080c, 0x2a5f, 0x11b0, 0x7850, 0x9084, 0xefff,
-	0x7852, 0x2009, 0x1996, 0x2104, 0x7a38, 0x9294, 0x0005, 0x9296,
-	0x0004, 0x0110, 0xc08d, 0x0008, 0xc085, 0x200a, 0x2001, 0x198e,
-	0x2003, 0x0001, 0x0030, 0x080c, 0x29cc, 0x2001, 0xffff, 0x080c,
-	0x285d, 0x0005, 0x080c, 0x29aa, 0x05e0, 0x2009, 0x1997, 0x2104,
-	0x8001, 0x200a, 0x080c, 0x2a5f, 0x1178, 0x7850, 0x9084, 0xefff,
-	0x7852, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0518, 0x2009,
-	0x1996, 0x2104, 0xc085, 0x200a, 0x2009, 0x1993, 0x2104, 0x8000,
-	0x200a, 0x9086, 0x0005, 0x0118, 0x080c, 0x29b2, 0x00c0, 0x200b,
-	0x0000, 0x7a38, 0x9294, 0x0006, 0x9296, 0x0004, 0x0110, 0x9006,
-	0x0010, 0x2001, 0x0001, 0x080c, 0x2a3a, 0x2001, 0x1990, 0x2003,
-	0x0002, 0x0028, 0x2001, 0x198e, 0x2003, 0x0003, 0x0010, 0x080c,
-	0x287f, 0x0005, 0x080c, 0x29aa, 0x0560, 0x2009, 0x1997, 0x2104,
-	0x8001, 0x200a, 0x080c, 0x2a5f, 0x1168, 0x7850, 0x9084, 0xefff,
-	0x7852, 0x2001, 0x198e, 0x2003, 0x0003, 0x2001, 0x198f, 0x2003,
-	0x0000, 0x00b8, 0x2009, 0x1997, 0x2104, 0x9005, 0x1118, 0x080c,
-	0x29ef, 0x0010, 0x080c, 0x29bf, 0x080c, 0x29b2, 0x2009, 0x1993,
-	0x200b, 0x0000, 0x2001, 0x1990, 0x2003, 0x0001, 0x080c, 0x287f,
-	0x0000, 0x0005, 0x04b9, 0x0508, 0x080c, 0x2a5f, 0x11b8, 0x7850,
-	0x9084, 0xefff, 0x7852, 0x2009, 0x1994, 0x2104, 0x8000, 0x200a,
-	0x9086, 0x0007, 0x0108, 0x0078, 0x2001, 0x1999, 0x2003, 0x000a,
-	0x2009, 0x1996, 0x2104, 0xc0fd, 0x200a, 0x0038, 0x0419, 0x2001,
-	0x1990, 0x2003, 0x0004, 0x080c, 0x28aa, 0x0005, 0x0099, 0x0168,
-	0x080c, 0x2a5f, 0x1138, 0x7850, 0x9084, 0xefff, 0x7852, 0x080c,
-	0x2896, 0x0018, 0x0079, 0x080c, 0x28aa, 0x0005, 0x080c, 0x0dd5,
-	0x080c, 0x0dd5, 0x2009, 0x1998, 0x2104, 0x8001, 0x200a, 0x090c,
-	0x2a0b, 0x0005, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110,
-	0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2a3a, 0x0005, 0x7a38,
-	0x9294, 0x0006, 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001,
-	0x0001, 0x080c, 0x2a1d, 0x0005, 0x2009, 0x1993, 0x2104, 0x8000,
-	0x200a, 0x9086, 0x0005, 0x0108, 0x0068, 0x200b, 0x0000, 0x7a38,
-	0x9294, 0x0006, 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001,
-	0x0001, 0x04d9, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110,
-	0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2a3a, 0x0005, 0x0086,
-	0x2001, 0x1996, 0x2004, 0x9084, 0x7fff, 0x090c, 0x0dd5, 0x2009,
-	0x1995, 0x2144, 0x8846, 0x280a, 0x9844, 0x0dd8, 0xd08c, 0x1120,
-	0xd084, 0x1120, 0x080c, 0x0dd5, 0x9006, 0x0010, 0x2001, 0x0001,
-	0x00a1, 0x008e, 0x0005, 0x0006, 0x0156, 0x2001, 0x198e, 0x20a9,
-	0x0009, 0x2003, 0x0000, 0x8000, 0x1f04, 0x2a11, 0x2001, 0x1995,
-	0x2003, 0x8000, 0x015e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0100,
-	0x9085, 0x0000, 0x0158, 0x7838, 0x9084, 0xfff9, 0x9085, 0x0004,
-	0x783a, 0x2009, 0x199b, 0x210c, 0x795a, 0x0050, 0x7838, 0x9084,
-	0xfffb, 0x9085, 0x0006, 0x783a, 0x2009, 0x199c, 0x210c, 0x795a,
-	0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0138,
-	0x7838, 0x9084, 0xfffa, 0x9085, 0x0004, 0x783a, 0x0030, 0x7838,
-	0x9084, 0xfffb, 0x9085, 0x0005, 0x783a, 0x00fe, 0x0005, 0x0006,
-	0x2001, 0x0100, 0x2004, 0x9082, 0x0007, 0x000e, 0x0005, 0x0006,
-	0x2001, 0x0100, 0x2004, 0x9082, 0x0009, 0x000e, 0x0005, 0x0156,
-	0x20a9, 0x0064, 0x7820, 0x080c, 0x2aea, 0xd09c, 0x1110, 0x1f04,
-	0x2a62, 0x015e, 0x0005, 0x0126, 0x0016, 0x0006, 0x2091, 0x8000,
-	0x7850, 0x9085, 0x0040, 0x7852, 0x7850, 0x9084, 0xfbcf, 0x7852,
-	0x080c, 0x2aea, 0x9085, 0x2000, 0x7852, 0x000e, 0x2008, 0x9186,
-	0x0000, 0x1118, 0x783b, 0x0007, 0x0090, 0x9186, 0x0001, 0x1118,
-	0x783b, 0x0006, 0x0060, 0x9186, 0x0002, 0x1118, 0x783b, 0x0005,
-	0x0030, 0x9186, 0x0003, 0x1118, 0x783b, 0x0004, 0x0000, 0x0006,
-	0x1d04, 0x2a98, 0x080c, 0x833c, 0x1f04, 0x2a98, 0x7850, 0x9085,
-	0x0400, 0x9084, 0xdfbf, 0x7852, 0x080c, 0x2aea, 0x9085, 0x1000,
-	0x7852, 0x000e, 0x001e, 0x012e, 0x0005, 0x7850, 0x9084, 0xffcf,
-	0x7852, 0x0005, 0x0006, 0x0156, 0x00f6, 0x2079, 0x0100, 0x20a9,
-	0x000a, 0x7854, 0xd0ac, 0x1130, 0x7820, 0xd0e4, 0x1140, 0x1f04,
-	0x2abc, 0x0028, 0x7854, 0xd08c, 0x1110, 0x1f04, 0x2ac2, 0x00fe,
-	0x015e, 0x000e, 0x0005, 0x1d04, 0x2acb, 0x080c, 0x833c, 0x1f04,
-	0x2acb, 0x0005, 0x0006, 0x2001, 0x199a, 0x2004, 0x9086, 0x0000,
-	0x000e, 0x0005, 0x0006, 0x2001, 0x199a, 0x2004, 0x9086, 0x0001,
-	0x000e, 0x0005, 0x0006, 0x2001, 0x199a, 0x2004, 0x9086, 0x0002,
-	0x000e, 0x0005, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x0005,
-	0x0006, 0x2001, 0x19a6, 0x2102, 0x000e, 0x0005, 0x2009, 0x0171,
-	0x2104, 0xd0dc, 0x0140, 0x2009, 0x0170, 0x2104, 0x200b, 0x0080,
-	0xa001, 0xa001, 0x200a, 0x0005, 0x0036, 0x0046, 0x2001, 0x0141,
-	0x200c, 0x918c, 0xff00, 0x9186, 0x2000, 0x0118, 0x9186, 0x0100,
-	0x1588, 0x2009, 0x00a2, 0x080c, 0x0e51, 0x2019, 0x0160, 0x2324,
-	0x2011, 0x0003, 0x2009, 0x0169, 0x2104, 0x9084, 0x0007, 0x210c,
-	0x918c, 0x0007, 0x910e, 0x1db0, 0x9086, 0x0003, 0x11b8, 0x2304,
-	0x9402, 0x02a0, 0x1d60, 0x8211, 0x1d68, 0x84ff, 0x0170, 0x2001,
-	0x0141, 0x200c, 0x918c, 0xff00, 0x9186, 0x0100, 0x0130, 0x2009,
-	0x180c, 0x2104, 0xc0dd, 0x200a, 0x0008, 0x0419, 0x2009, 0x0000,
-	0x080c, 0x0e51, 0x004e, 0x003e, 0x0005, 0x2001, 0x180c, 0x2004,
-	0xd0dc, 0x01b0, 0x2001, 0x0160, 0x2004, 0x9005, 0x0140, 0x2001,
-	0x0141, 0x2004, 0x9084, 0xff00, 0x9086, 0x0100, 0x1148, 0x0126,
-	0x2091, 0x8000, 0x0016, 0x0026, 0x0021, 0x002e, 0x001e, 0x012e,
-	0x0005, 0x00c6, 0x2061, 0x0100, 0x6014, 0x0006, 0x2001, 0x0161,
-	0x2003, 0x0000, 0x6017, 0x0018, 0xa001, 0xa001, 0x602f, 0x0008,
-	0x6104, 0x918e, 0x0010, 0x6106, 0x918e, 0x0010, 0x6106, 0x6017,
-	0x0040, 0x04b9, 0x001e, 0x9184, 0x0003, 0x01e0, 0x0036, 0x0016,
-	0x2019, 0x0141, 0x6124, 0x918c, 0x0028, 0x1120, 0x2304, 0x9084,
-	0x2800, 0x0dc0, 0x001e, 0x919c, 0xffe4, 0x9184, 0x0001, 0x0118,
-	0x9385, 0x0009, 0x6016, 0x9184, 0x0002, 0x0118, 0x9385, 0x0012,
-	0x6016, 0x003e, 0x2001, 0x180c, 0x200c, 0xc1dc, 0x2102, 0x00ce,
-	0x0005, 0x0016, 0x0026, 0x080c, 0x7197, 0x0108, 0xc0bc, 0x2009,
+	0x60c8, 0xa896, 0x7004, 0x2060, 0x00c6, 0x080c, 0xc74e, 0x00ce,
+	0x2001, 0x19f6, 0x2004, 0x9c06, 0x1160, 0x2009, 0x0040, 0x080c,
+	0x23d2, 0x080c, 0xa7b2, 0x2011, 0x0000, 0x080c, 0xa643, 0x080c,
+	0x9790, 0x002e, 0x0804, 0x1ff8, 0x0126, 0x2091, 0x2400, 0xa858,
+	0x2040, 0x792c, 0x782b, 0x0002, 0x9184, 0x0700, 0x1904, 0x1e71,
+	0x7000, 0x0002, 0x1ff8, 0x1ec6, 0x1f46, 0x1ff6, 0x8001, 0x7002,
+	0x7027, 0x0000, 0xd19c, 0x1158, 0x8aff, 0x0904, 0x1f13, 0x080c,
+	0x1cc5, 0x0904, 0x1ff8, 0x080c, 0x1cc5, 0x0804, 0x1ff8, 0x782b,
+	0x0004, 0xd194, 0x0148, 0xa880, 0xc0fc, 0xa882, 0x8aff, 0x1518,
+	0xa87c, 0xc0f5, 0xa87e, 0x00f8, 0x0026, 0x0036, 0xab3c, 0xaa40,
+	0x0016, 0x7910, 0xa82c, 0x9100, 0xa82e, 0x7914, 0xa830, 0x9101,
+	0xa832, 0x001e, 0x7810, 0x931a, 0x7814, 0x9213, 0x7800, 0xa81e,
+	0x7804, 0xa822, 0xab3e, 0xaa42, 0x003e, 0x002e, 0x080c, 0x2063,
+	0xa880, 0xc0fd, 0xa882, 0x2a00, 0xa816, 0x2800, 0xa85a, 0x2c00,
+	0xa812, 0x7003, 0x0000, 0x2009, 0x0306, 0x200b, 0x4800, 0x7027,
+	0x0000, 0x0804, 0x1ff8, 0x00f6, 0x0026, 0x781c, 0x0006, 0x7818,
+	0x0006, 0x2079, 0x0100, 0x7a14, 0x9284, 0x1984, 0x9085, 0x0012,
+	0x7816, 0x0036, 0x2019, 0x1000, 0x8319, 0x090c, 0x0dd5, 0x7820,
+	0xd0bc, 0x1dd0, 0x003e, 0x79c8, 0x000e, 0x9102, 0x001e, 0x0006,
+	0x0016, 0x79c4, 0x000e, 0x9103, 0x78c6, 0x000e, 0x78ca, 0x9284,
+	0x1984, 0x9085, 0x0012, 0x7816, 0x002e, 0x00fe, 0x782b, 0x0008,
+	0x7003, 0x0000, 0x080c, 0x1cbe, 0x0804, 0x1ff8, 0x8001, 0x7002,
+	0x7024, 0x8004, 0x7026, 0xd194, 0x0170, 0x782c, 0xd0fc, 0x1904,
+	0x1eb9, 0xd19c, 0x1904, 0x1ff4, 0x8aff, 0x0904, 0x1ff8, 0x080c,
+	0x1cc5, 0x0804, 0x1ff8, 0x0026, 0x0036, 0xab3c, 0xaa40, 0x080c,
+	0x2063, 0xdd9c, 0x1904, 0x1fb3, 0x2c05, 0x908a, 0x0036, 0x1a0c,
+	0x0dd5, 0x9082, 0x001b, 0x0002, 0x1f87, 0x1f87, 0x1f89, 0x1f87,
+	0x1f87, 0x1f87, 0x1f8f, 0x1f87, 0x1f87, 0x1f87, 0x1f95, 0x1f87,
+	0x1f87, 0x1f87, 0x1f9b, 0x1f87, 0x1f87, 0x1f87, 0x1fa1, 0x1f87,
+	0x1f87, 0x1f87, 0x1fa7, 0x1f87, 0x1f87, 0x1f87, 0x1fad, 0x080c,
+	0x0dd5, 0xa07c, 0x931a, 0xa080, 0x9213, 0x0804, 0x1ee8, 0xa08c,
+	0x931a, 0xa090, 0x9213, 0x0804, 0x1ee8, 0xa09c, 0x931a, 0xa0a0,
+	0x9213, 0x0804, 0x1ee8, 0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804,
+	0x1ee8, 0xa0bc, 0x931a, 0xa0c0, 0x9213, 0x0804, 0x1ee8, 0xa0cc,
+	0x931a, 0xa0d0, 0x9213, 0x0804, 0x1ee8, 0xa0dc, 0x931a, 0xa0e0,
+	0x9213, 0x0804, 0x1ee8, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dd5,
+	0x9082, 0x001b, 0x0002, 0x1fd6, 0x1fd4, 0x1fd4, 0x1fd4, 0x1fd4,
+	0x1fd4, 0x1fdc, 0x1fd4, 0x1fd4, 0x1fd4, 0x1fd4, 0x1fd4, 0x1fe2,
+	0x1fd4, 0x1fd4, 0x1fd4, 0x1fd4, 0x1fd4, 0x1fe8, 0x1fd4, 0x1fd4,
+	0x1fd4, 0x1fd4, 0x1fd4, 0x1fee, 0x080c, 0x0dd5, 0xa07c, 0x931a,
+	0xa080, 0x9213, 0x0804, 0x1ee8, 0xa094, 0x931a, 0xa098, 0x9213,
+	0x0804, 0x1ee8, 0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, 0x1ee8,
+	0xa0c4, 0x931a, 0xa0c8, 0x9213, 0x0804, 0x1ee8, 0xa0dc, 0x931a,
+	0xa0e0, 0x9213, 0x0804, 0x1ee8, 0x0804, 0x1ee4, 0x080c, 0x0dd5,
+	0x012e, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a66, 0x7000, 0x9086,
+	0x0000, 0x0904, 0x2043, 0x2079, 0x0090, 0x2009, 0x0207, 0x210c,
+	0xd194, 0x01b8, 0x2009, 0x020c, 0x210c, 0x9184, 0x0003, 0x0188,
+	0x080c, 0xe9e9, 0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0dd5,
+	0x0016, 0x2009, 0x0040, 0x080c, 0x23d2, 0x001e, 0x2001, 0x020c,
+	0x2102, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106,
+	0x1120, 0x2009, 0x0040, 0x080c, 0x23d2, 0x782c, 0xd0fc, 0x09a8,
+	0x080c, 0x1eb4, 0x7000, 0x9086, 0x0000, 0x1978, 0x782b, 0x0004,
+	0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x23d2, 0x782b,
+	0x0002, 0x7003, 0x0000, 0x080c, 0x1cbe, 0x00ee, 0x00fe, 0x0005,
+	0xa880, 0xd0fc, 0x11a8, 0x8c60, 0x2c05, 0x9005, 0x0110, 0x8a51,
+	0x0005, 0xa004, 0x9005, 0x0168, 0xa85a, 0x2040, 0xa064, 0x9084,
+	0x000f, 0x9080, 0x2090, 0x2065, 0x8cff, 0x090c, 0x0dd5, 0x8a51,
+	0x0005, 0x2050, 0x0005, 0xa880, 0xd0fc, 0x11b8, 0x8a50, 0x8c61,
+	0x2c05, 0x9005, 0x1190, 0x2800, 0x9906, 0x0120, 0xa000, 0x9005,
+	0x1108, 0x2900, 0x2040, 0xa85a, 0xa064, 0x9084, 0x000f, 0x9080,
+	0x20a0, 0x2065, 0x8cff, 0x090c, 0x0dd5, 0x0005, 0x0000, 0x001d,
+	0x0021, 0x0025, 0x0029, 0x002d, 0x0031, 0x0035, 0x0000, 0x001b,
+	0x0021, 0x0027, 0x002d, 0x0033, 0x0000, 0x0000, 0x0023, 0x0000,
+	0x0000, 0x2083, 0x207f, 0x2083, 0x2083, 0x208d, 0x0000, 0x2083,
+	0x208a, 0x208a, 0x2087, 0x208a, 0x208a, 0x0000, 0x208d, 0x208a,
+	0x0000, 0x2085, 0x2085, 0x0000, 0x2085, 0x208d, 0x0000, 0x2085,
+	0x208b, 0x208b, 0x208b, 0x0000, 0x208b, 0x0000, 0x208d, 0x208b,
+	0x00c6, 0x00d6, 0x0086, 0xab42, 0xac3e, 0xa888, 0x9055, 0x0904,
+	0x228f, 0x2940, 0xa064, 0x90ec, 0x000f, 0x9084, 0x00ff, 0x9086,
+	0x0008, 0x1118, 0x2061, 0x208b, 0x00d0, 0x9de0, 0x2090, 0x9d86,
+	0x0007, 0x0130, 0x9d86, 0x000e, 0x0118, 0x9d86, 0x000f, 0x1120,
+	0xa08c, 0x9422, 0xa090, 0x931b, 0x2c05, 0x9065, 0x1140, 0x0310,
+	0x0804, 0x228f, 0xa004, 0x9045, 0x0904, 0x228f, 0x08d8, 0x2c05,
+	0x9005, 0x0904, 0x2177, 0xdd9c, 0x1904, 0x2133, 0x908a, 0x0036,
+	0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x2108, 0x2108, 0x210a,
+	0x2108, 0x2108, 0x2108, 0x2110, 0x2108, 0x2108, 0x2108, 0x2116,
+	0x2108, 0x2108, 0x2108, 0x211c, 0x2108, 0x2108, 0x2108, 0x2122,
+	0x2108, 0x2108, 0x2108, 0x2128, 0x2108, 0x2108, 0x2108, 0x212e,
+	0x080c, 0x0dd5, 0xa07c, 0x9422, 0xa080, 0x931b, 0x0804, 0x216d,
+	0xa08c, 0x9422, 0xa090, 0x931b, 0x0804, 0x216d, 0xa09c, 0x9422,
+	0xa0a0, 0x931b, 0x0804, 0x216d, 0xa0ac, 0x9422, 0xa0b0, 0x931b,
+	0x0804, 0x216d, 0xa0bc, 0x9422, 0xa0c0, 0x931b, 0x0804, 0x216d,
+	0xa0cc, 0x9422, 0xa0d0, 0x931b, 0x0804, 0x216d, 0xa0dc, 0x9422,
+	0xa0e0, 0x931b, 0x04d0, 0x908a, 0x0034, 0x1a0c, 0x0dd5, 0x9082,
+	0x001b, 0x0002, 0x2155, 0x2153, 0x2153, 0x2153, 0x2153, 0x2153,
+	0x215a, 0x2153, 0x2153, 0x2153, 0x2153, 0x2153, 0x215f, 0x2153,
+	0x2153, 0x2153, 0x2153, 0x2153, 0x2164, 0x2153, 0x2153, 0x2153,
+	0x2153, 0x2153, 0x2169, 0x080c, 0x0dd5, 0xa07c, 0x9422, 0xa080,
+	0x931b, 0x0098, 0xa094, 0x9422, 0xa098, 0x931b, 0x0070, 0xa0ac,
+	0x9422, 0xa0b0, 0x931b, 0x0048, 0xa0c4, 0x9422, 0xa0c8, 0x931b,
+	0x0020, 0xa0dc, 0x9422, 0xa0e0, 0x931b, 0x0630, 0x2300, 0x9405,
+	0x0160, 0x8a51, 0x0904, 0x228f, 0x8c60, 0x0804, 0x20df, 0xa004,
+	0x9045, 0x0904, 0x228f, 0x0804, 0x20ba, 0x8a51, 0x0904, 0x228f,
+	0x8c60, 0x2c05, 0x9005, 0x1158, 0xa004, 0x9045, 0x0904, 0x228f,
+	0xa064, 0x90ec, 0x000f, 0x9de0, 0x2090, 0x2c05, 0x2060, 0xa880,
+	0xc0fc, 0xa882, 0x0804, 0x2284, 0x2c05, 0x8422, 0x8420, 0x831a,
+	0x9399, 0x0000, 0xac2e, 0xab32, 0xdd9c, 0x1904, 0x2221, 0x9082,
+	0x001b, 0x0002, 0x21bd, 0x21bd, 0x21bf, 0x21bd, 0x21bd, 0x21bd,
+	0x21cd, 0x21bd, 0x21bd, 0x21bd, 0x21db, 0x21bd, 0x21bd, 0x21bd,
+	0x21e9, 0x21bd, 0x21bd, 0x21bd, 0x21f7, 0x21bd, 0x21bd, 0x21bd,
+	0x2205, 0x21bd, 0x21bd, 0x21bd, 0x2213, 0x080c, 0x0dd5, 0xa17c,
+	0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa074,
+	0x9420, 0xa078, 0x9319, 0x0804, 0x227f, 0xa18c, 0x2400, 0x9122,
+	0xa190, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa084, 0x9420, 0xa088,
+	0x9319, 0x0804, 0x227f, 0xa19c, 0x2400, 0x9122, 0xa1a0, 0x2300,
+	0x911b, 0x0a0c, 0x0dd5, 0xa094, 0x9420, 0xa098, 0x9319, 0x0804,
+	0x227f, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c,
+	0x0dd5, 0xa0a4, 0x9420, 0xa0a8, 0x9319, 0x0804, 0x227f, 0xa1bc,
+	0x2400, 0x9122, 0xa1c0, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa0b4,
+	0x9420, 0xa0b8, 0x9319, 0x0804, 0x227f, 0xa1cc, 0x2400, 0x9122,
+	0xa1d0, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa0c4, 0x9420, 0xa0c8,
+	0x9319, 0x0804, 0x227f, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300,
+	0x911b, 0x0a0c, 0x0dd5, 0xa0d4, 0x9420, 0xa0d8, 0x9319, 0x0804,
+	0x227f, 0x9082, 0x001b, 0x0002, 0x223f, 0x223d, 0x223d, 0x223d,
+	0x223d, 0x223d, 0x224c, 0x223d, 0x223d, 0x223d, 0x223d, 0x223d,
+	0x2259, 0x223d, 0x223d, 0x223d, 0x223d, 0x223d, 0x2266, 0x223d,
+	0x223d, 0x223d, 0x223d, 0x223d, 0x2273, 0x080c, 0x0dd5, 0xa17c,
+	0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa06c,
+	0x9420, 0xa070, 0x9319, 0x0498, 0xa194, 0x2400, 0x9122, 0xa198,
+	0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa084, 0x9420, 0xa088, 0x9319,
+	0x0430, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c,
+	0x0dd5, 0xa09c, 0x9420, 0xa0a0, 0x9319, 0x00c8, 0xa1c4, 0x2400,
+	0x9122, 0xa1c8, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa0b4, 0x9420,
+	0xa0b8, 0x9319, 0x0060, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300,
+	0x911b, 0x0a0c, 0x0dd5, 0xa0cc, 0x9420, 0xa0d0, 0x9319, 0xac1e,
+	0xab22, 0xa880, 0xc0fd, 0xa882, 0x2800, 0xa85a, 0x2c00, 0xa812,
+	0x2a00, 0xa816, 0x000e, 0x000e, 0x000e, 0x9006, 0x0028, 0x008e,
+	0x00de, 0x00ce, 0x9085, 0x0001, 0x0005, 0x2001, 0x0005, 0x2004,
+	0xd0bc, 0x190c, 0x0dce, 0x9084, 0x0007, 0x0002, 0x22b0, 0x1eb4,
+	0x22b0, 0x22a6, 0x22a9, 0x22ac, 0x22a9, 0x22ac, 0x080c, 0x1eb4,
+	0x0005, 0x080c, 0x11a3, 0x0005, 0x080c, 0x1eb4, 0x080c, 0x11a3,
+	0x0005, 0x0126, 0x2091, 0x2600, 0x2079, 0x0200, 0x2071, 0x0260,
+	0x2069, 0x1800, 0x7817, 0x0000, 0x789b, 0x0814, 0x78a3, 0x0406,
+	0x789f, 0x0410, 0x2009, 0x013b, 0x200b, 0x0400, 0x781b, 0x0002,
+	0x783b, 0x001f, 0x7837, 0x0020, 0x7803, 0x1600, 0x012e, 0x0005,
+	0x2091, 0x2600, 0x781c, 0xd0a4, 0x190c, 0x23cf, 0x7900, 0xd1dc,
+	0x1118, 0x9084, 0x0006, 0x001a, 0x9084, 0x000e, 0x0002, 0x22f7,
+	0x22ef, 0x7d91, 0x22ef, 0x22f1, 0x22f1, 0x22f1, 0x22f1, 0x7d77,
+	0x22ef, 0x22f3, 0x22ef, 0x22f1, 0x22ef, 0x22f1, 0x22ef, 0x080c,
+	0x0dd5, 0x0031, 0x0020, 0x080c, 0x7d77, 0x080c, 0x7d91, 0x0005,
+	0x0006, 0x0016, 0x0026, 0x080c, 0xe9e9, 0x7930, 0x9184, 0x0003,
+	0x01c0, 0x2001, 0x19f6, 0x2004, 0x9005, 0x0170, 0x2001, 0x0133,
+	0x2004, 0x9005, 0x090c, 0x0dd5, 0x00c6, 0x2001, 0x19f6, 0x2064,
+	0x080c, 0xc74e, 0x00ce, 0x00f8, 0x2009, 0x0040, 0x080c, 0x23d2,
+	0x00d0, 0x9184, 0x0014, 0x01a0, 0x6a00, 0x9286, 0x0003, 0x0160,
+	0x080c, 0x73b0, 0x1138, 0x080c, 0x7698, 0x080c, 0x601b, 0x080c,
+	0x72e2, 0x0010, 0x080c, 0x5eda, 0x080c, 0x7e40, 0x0041, 0x0018,
+	0x9184, 0x9540, 0x1dc8, 0x002e, 0x001e, 0x000e, 0x0005, 0x00e6,
+	0x0036, 0x0046, 0x0056, 0x2071, 0x1a62, 0x080c, 0x1aa9, 0x005e,
+	0x004e, 0x003e, 0x00ee, 0x0005, 0x0126, 0x2091, 0x2e00, 0x2071,
+	0x1800, 0x7128, 0x2001, 0x196f, 0x2102, 0x2001, 0x1977, 0x2102,
+	0x2001, 0x013b, 0x2102, 0x2079, 0x0200, 0x2001, 0x0201, 0x789e,
+	0x78a3, 0x0200, 0x9198, 0x0007, 0x831c, 0x831c, 0x831c, 0x9398,
+	0x0005, 0x2320, 0x9182, 0x0204, 0x1230, 0x2011, 0x0008, 0x8423,
+	0x8423, 0x8423, 0x0488, 0x9182, 0x024c, 0x1240, 0x2011, 0x0007,
+	0x8403, 0x8003, 0x9400, 0x9400, 0x9420, 0x0430, 0x9182, 0x02bc,
+	0x1238, 0x2011, 0x0006, 0x8403, 0x8003, 0x9400, 0x9420, 0x00e0,
+	0x9182, 0x034c, 0x1230, 0x2011, 0x0005, 0x8403, 0x8003, 0x9420,
+	0x0098, 0x9182, 0x042c, 0x1228, 0x2011, 0x0004, 0x8423, 0x8423,
+	0x0058, 0x9182, 0x059c, 0x1228, 0x2011, 0x0003, 0x8403, 0x9420,
+	0x0018, 0x2011, 0x0002, 0x8423, 0x9482, 0x0228, 0x8002, 0x8020,
+	0x8301, 0x9402, 0x0110, 0x0208, 0x8321, 0x8217, 0x8203, 0x9405,
+	0x789a, 0x012e, 0x0005, 0x0006, 0x00d6, 0x2069, 0x0200, 0x6814,
+	0x9084, 0xffc0, 0x910d, 0x6916, 0x00de, 0x000e, 0x0005, 0x00d6,
+	0x2069, 0x0200, 0x9005, 0x6810, 0x0110, 0xc0a5, 0x0008, 0xc0a4,
+	0x6812, 0x00de, 0x0005, 0x0006, 0x00d6, 0x2069, 0x0200, 0x6810,
+	0x9084, 0xfff8, 0x910d, 0x6912, 0x00de, 0x000e, 0x0005, 0x7938,
+	0x080c, 0x0dce, 0x00f6, 0x2079, 0x0200, 0x7902, 0xa001, 0xa001,
+	0xa001, 0xa001, 0xa001, 0xa001, 0x7902, 0xa001, 0xa001, 0xa001,
+	0xa001, 0xa001, 0xa001, 0x00fe, 0x0005, 0x0126, 0x2091, 0x2800,
+	0x2061, 0x0100, 0x2071, 0x1800, 0x2009, 0x0000, 0x080c, 0x2c3e,
+	0x080c, 0x2b59, 0x6054, 0x8004, 0x8004, 0x8004, 0x8004, 0x9084,
+	0x000c, 0x6150, 0x918c, 0xfff3, 0x9105, 0x6052, 0x6050, 0x9084,
+	0xb17f, 0x9085, 0x2000, 0x6052, 0x2009, 0x199d, 0x2011, 0x199e,
+	0x6358, 0x939c, 0x38f0, 0x2320, 0x080c, 0x2b9d, 0x1238, 0x939d,
+	0x4003, 0x94a5, 0x8603, 0x230a, 0x2412, 0x0030, 0x939d, 0x0203,
+	0x94a5, 0x8603, 0x230a, 0x2412, 0x9006, 0x080c, 0x2b88, 0x9006,
+	0x080c, 0x2b6b, 0x20a9, 0x0012, 0x1d04, 0x2424, 0x2091, 0x6000,
+	0x1f04, 0x2424, 0x602f, 0x0100, 0x602f, 0x0000, 0x6050, 0x9085,
+	0x0400, 0x9084, 0xdfff, 0x6052, 0x6024, 0x6026, 0x080c, 0x2877,
+	0x2009, 0x00ef, 0x6132, 0x6136, 0x080c, 0x2887, 0x60e7, 0x0000,
+	0x61ea, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f,
+	0x0080, 0x602f, 0x0000, 0x6007, 0x349f, 0x60bb, 0x0000, 0x20a9,
+	0x0018, 0x60bf, 0x0000, 0x1f04, 0x2451, 0x60bb, 0x0000, 0x60bf,
+	0x0108, 0x60bf, 0x0012, 0x60bf, 0x0405, 0x60bf, 0x0014, 0x60bf,
+	0x0320, 0x60bf, 0x0018, 0x601b, 0x00f0, 0x601f, 0x001e, 0x600f,
+	0x006b, 0x602b, 0x402f, 0x012e, 0x0005, 0x00f6, 0x2079, 0x0140,
+	0x78c3, 0x0080, 0x78c3, 0x0083, 0x78c3, 0x0000, 0x00fe, 0x0005,
+	0x2001, 0x1835, 0x2003, 0x0000, 0x2001, 0x1834, 0x2003, 0x0001,
+	0x0005, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x6124,
+	0x0066, 0x2031, 0x1837, 0x2634, 0x96b4, 0x0028, 0x006e, 0x1138,
+	0x6020, 0xd1bc, 0x0120, 0xd0bc, 0x1168, 0xd0b4, 0x1198, 0x9184,
+	0x5e2c, 0x1118, 0x9184, 0x0007, 0x00aa, 0x9195, 0x0004, 0x9284,
+	0x0007, 0x0082, 0x0016, 0x2001, 0x188b, 0x200c, 0xd184, 0x001e,
+	0x0d70, 0x0c98, 0x0016, 0x2001, 0x188b, 0x200c, 0xd194, 0x001e,
+	0x0d30, 0x0c58, 0x24d4, 0x24ba, 0x24bd, 0x24c0, 0x24c5, 0x24c7,
+	0x24cb, 0x24cf, 0x080c, 0x8fac, 0x00b8, 0x080c, 0x9079, 0x00a0,
+	0x080c, 0x9079, 0x080c, 0x8fac, 0x0078, 0x0099, 0x0068, 0x080c,
+	0x8fac, 0x0079, 0x0048, 0x080c, 0x9079, 0x0059, 0x0028, 0x080c,
+	0x9079, 0x080c, 0x8fac, 0x0029, 0x002e, 0x001e, 0x000e, 0x012e,
+	0x0005, 0x00a6, 0x6124, 0x6028, 0xd09c, 0x0118, 0xd19c, 0x1904,
+	0x273c, 0xd1f4, 0x190c, 0x0dce, 0x080c, 0x73b0, 0x0904, 0x252f,
+	0x080c, 0xd216, 0x1120, 0x7000, 0x9086, 0x0003, 0x0570, 0x6024,
+	0x9084, 0x1800, 0x0550, 0x080c, 0x73d3, 0x0118, 0x080c, 0x73c1,
+	0x1520, 0x6027, 0x0020, 0x6043, 0x0000, 0x080c, 0xd216, 0x0168,
+	0x080c, 0x73d3, 0x1150, 0x2001, 0x19a7, 0x2003, 0x0001, 0x6027,
+	0x1800, 0x080c, 0x7246, 0x0804, 0x273f, 0x70a4, 0x9005, 0x1150,
+	0x70a7, 0x0001, 0x00d6, 0x2069, 0x0140, 0x080c, 0x7407, 0x00de,
+	0x1904, 0x273f, 0x080c, 0x76a2, 0x0428, 0x080c, 0x73d3, 0x1590,
+	0x6024, 0x9084, 0x1800, 0x1108, 0x0468, 0x080c, 0x76a2, 0x080c,
+	0x7698, 0x080c, 0x601b, 0x080c, 0x72e2, 0x0804, 0x273c, 0xd1ac,
+	0x1508, 0x6024, 0xd0dc, 0x1170, 0xd0e4, 0x1178, 0xd0d4, 0x1190,
+	0xd0cc, 0x0130, 0x7098, 0x9086, 0x0028, 0x1110, 0x080c, 0x7585,
+	0x0804, 0x273c, 0x080c, 0x769d, 0x0048, 0x2001, 0x197d, 0x2003,
+	0x0002, 0x0020, 0x080c, 0x74ea, 0x0804, 0x273c, 0x080c, 0x7620,
+	0x0804, 0x273c, 0x6220, 0xd1bc, 0x0138, 0xd2bc, 0x1904, 0x27af,
+	0xd2b4, 0x1904, 0x27c2, 0x0000, 0xd1ac, 0x0904, 0x2651, 0x0036,
+	0x6328, 0xc3bc, 0x632a, 0x003e, 0x080c, 0x73b0, 0x11c0, 0x6027,
+	0x0020, 0x0006, 0x0026, 0x0036, 0x080c, 0x73ca, 0x1158, 0x080c,
+	0x7698, 0x080c, 0x601b, 0x080c, 0x72e2, 0x003e, 0x002e, 0x000e,
+	0x00ae, 0x0005, 0x003e, 0x002e, 0x000e, 0x080c, 0x7388, 0x0016,
+	0x0046, 0x00c6, 0x644c, 0x9486, 0xf0f0, 0x1138, 0x2061, 0x0100,
+	0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74da, 0x948c, 0xff00,
+	0x7038, 0xd084, 0x0178, 0x9186, 0xf800, 0x1160, 0x7048, 0xd084,
+	0x1148, 0xc085, 0x704a, 0x0036, 0x2418, 0x2011, 0x8016, 0x080c,
+	0x4b05, 0x003e, 0x080c, 0xd20f, 0x1904, 0x262e, 0x9196, 0xff00,
+	0x05a8, 0x7060, 0x9084, 0x00ff, 0x810f, 0x81ff, 0x0110, 0x9116,
+	0x0568, 0x7130, 0xd184, 0x1550, 0x080c, 0x3312, 0x0128, 0xc18d,
+	0x7132, 0x080c, 0x6962, 0x1510, 0x6240, 0x9294, 0x0010, 0x0130,
+	0x6248, 0x9294, 0xff00, 0x9296, 0xff00, 0x01c0, 0x7030, 0xd08c,
+	0x0904, 0x262e, 0x7038, 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c,
+	0xd1ac, 0x1904, 0x262e, 0xc1ad, 0x2102, 0x0036, 0x73d8, 0x2011,
+	0x8013, 0x080c, 0x4b05, 0x003e, 0x0804, 0x262e, 0x7038, 0xd08c,
+	0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, 0x262e, 0xc1ad,
+	0x2102, 0x0036, 0x73d8, 0x2011, 0x8013, 0x080c, 0x4b05, 0x003e,
+	0x7130, 0xc185, 0x7132, 0x2011, 0x1848, 0x220c, 0xd1a4, 0x01f0,
+	0x0016, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x86b4, 0x2019,
+	0x000e, 0x00c6, 0x2061, 0x0000, 0x080c, 0xe501, 0x00ce, 0x9484,
+	0x00ff, 0x9080, 0x331e, 0x200d, 0x918c, 0xff00, 0x810f, 0x2120,
+	0x9006, 0x2009, 0x000e, 0x080c, 0xe58d, 0x001e, 0x0016, 0x2009,
+	0x0002, 0x2019, 0x0004, 0x080c, 0x3187, 0x001e, 0x0078, 0x0156,
+	0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x6600, 0x1110, 0x080c,
+	0x6035, 0x8108, 0x1f04, 0x2624, 0x00be, 0x015e, 0x00ce, 0x004e,
+	0x080c, 0xadb8, 0x60e3, 0x0000, 0x001e, 0x2001, 0x1800, 0x2014,
+	0x9296, 0x0004, 0x1170, 0xd19c, 0x11a0, 0x2011, 0x180c, 0x2214,
+	0xd29c, 0x1120, 0x6204, 0x9295, 0x0002, 0x6206, 0x6228, 0xc29d,
+	0x622a, 0x2003, 0x0001, 0x2001, 0x1826, 0x2003, 0x0000, 0x6027,
+	0x0020, 0xd194, 0x0904, 0x273c, 0x0016, 0x6220, 0xd2b4, 0x0904,
+	0x26d9, 0x080c, 0x8550, 0x080c, 0xa259, 0x6027, 0x0004, 0x00f6,
+	0x2019, 0x19f0, 0x2304, 0x907d, 0x0904, 0x26a8, 0x7804, 0x9086,
+	0x0032, 0x15f0, 0x00d6, 0x00c6, 0x00e6, 0x0096, 0x2069, 0x0140,
+	0x782c, 0x685e, 0x7808, 0x685a, 0x6043, 0x0002, 0x2001, 0x0003,
+	0x8001, 0x1df0, 0x6043, 0x0000, 0x2001, 0x003c, 0x8001, 0x1df0,
+	0x080c, 0x2cff, 0x2001, 0x001e, 0x8001, 0x0240, 0x20a9, 0x0009,
+	0x080c, 0x2c19, 0x6904, 0xd1dc, 0x1140, 0x0cb0, 0x2001, 0x0100,
+	0x080c, 0x2cef, 0x9006, 0x080c, 0x2cef, 0x080c, 0x955f, 0x080c,
+	0x9664, 0x7814, 0x2048, 0xa867, 0x0103, 0x2f60, 0x080c, 0xae47,
+	0x009e, 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x00ae, 0x0005,
+	0x00fe, 0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0110,
+	0x080c, 0x2cff, 0x00de, 0x00c6, 0x2061, 0x19e7, 0x6028, 0x080c,
+	0xd216, 0x0120, 0x909a, 0x0003, 0x1258, 0x0018, 0x909a, 0x00c8,
+	0x1238, 0x8000, 0x602a, 0x00ce, 0x080c, 0xa235, 0x0804, 0x273b,
+	0x2061, 0x0100, 0x62c0, 0x080c, 0xac43, 0x2019, 0x19f0, 0x2304,
+	0x9065, 0x0120, 0x2009, 0x0027, 0x080c, 0xaec2, 0x00ce, 0x0804,
+	0x273b, 0xd2bc, 0x0904, 0x2722, 0x080c, 0x855d, 0x6014, 0x9084,
+	0x1984, 0x9085, 0x0010, 0x6016, 0x6027, 0x0004, 0x00d6, 0x2069,
+	0x0140, 0x6804, 0x9084, 0x4000, 0x0110, 0x080c, 0x2cff, 0x00de,
+	0x00c6, 0x2061, 0x19e7, 0x6044, 0x080c, 0xd216, 0x0120, 0x909a,
+	0x0003, 0x1658, 0x0018, 0x909a, 0x00c8, 0x1638, 0x8000, 0x6046,
+	0x603c, 0x00ce, 0x9005, 0x05b8, 0x2009, 0x07d0, 0x080c, 0x8555,
+	0x9080, 0x0008, 0x2004, 0x9086, 0x0006, 0x1138, 0x6114, 0x918c,
+	0x1984, 0x918d, 0x0012, 0x6116, 0x0430, 0x9080, 0x0008, 0x2004,
+	0x9086, 0x0009, 0x0d98, 0x6114, 0x918c, 0x1984, 0x918d, 0x0016,
+	0x6116, 0x00c8, 0x6027, 0x0004, 0x00b0, 0x0036, 0x2019, 0x0001,
+	0x080c, 0xa59c, 0x003e, 0x2019, 0x19f6, 0x2304, 0x9065, 0x0150,
+	0x2009, 0x004f, 0x6020, 0x9086, 0x0009, 0x1110, 0x2009, 0x004f,
+	0x080c, 0xaec2, 0x00ce, 0x001e, 0xd19c, 0x0904, 0x27aa, 0x7038,
+	0xd0ac, 0x1904, 0x2783, 0x0016, 0x0156, 0x6027, 0x0008, 0x6050,
+	0x9085, 0x0040, 0x6052, 0x6050, 0x9084, 0xfbcf, 0x6052, 0x080c,
+	0x2c38, 0x9085, 0x2000, 0x6052, 0x20a9, 0x0012, 0x1d04, 0x2756,
+	0x080c, 0x8584, 0x1f04, 0x2756, 0x6050, 0x9085, 0x0400, 0x9084,
+	0xdfbf, 0x6052, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x2764, 0x6150,
+	0x9185, 0x1400, 0x6052, 0x20a9, 0x0366, 0x1d04, 0x276d, 0x080c,
+	0x8584, 0x6020, 0xd09c, 0x1130, 0x015e, 0x6152, 0x001e, 0x6027,
+	0x0008, 0x0480, 0x080c, 0x2c00, 0x1f04, 0x276d, 0x015e, 0x6152,
+	0x001e, 0x6027, 0x0008, 0x0016, 0x6028, 0xc09c, 0x602a, 0x080c,
+	0xadb8, 0x60e3, 0x0000, 0x080c, 0xe9c8, 0x080c, 0xe9e3, 0x080c,
+	0x56d4, 0xd0fc, 0x1138, 0x080c, 0xd20f, 0x1120, 0x9085, 0x0001,
+	0x080c, 0x73f7, 0x9006, 0x080c, 0x2cef, 0x2009, 0x0002, 0x080c,
+	0x2c3e, 0x2001, 0x1800, 0x2003, 0x0004, 0x6027, 0x0008, 0x080c,
+	0x0bae, 0x001e, 0x918c, 0xffd0, 0x6126, 0x00ae, 0x0005, 0x0016,
+	0x2001, 0x188b, 0x200c, 0xd184, 0x001e, 0x0904, 0x255c, 0x0016,
+	0x2009, 0x27bb, 0x00d0, 0x2001, 0x188b, 0x200c, 0xc184, 0x2102,
+	0x001e, 0x0c40, 0x0016, 0x2001, 0x188b, 0x200c, 0xd194, 0x001e,
+	0x0904, 0x255c, 0x0016, 0x2009, 0x27ce, 0x0038, 0x2001, 0x188b,
+	0x200c, 0xc194, 0x2102, 0x001e, 0x08a8, 0x6028, 0xc0bc, 0x602a,
+	0x2001, 0x0156, 0x2003, 0xbc91, 0x8000, 0x2003, 0xffff, 0x6043,
+	0x0001, 0x080c, 0x2c38, 0x6027, 0x0080, 0x6017, 0x0000, 0x6043,
+	0x0000, 0x0817, 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, 0x00f6,
+	0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x71d0, 0x70d2, 0x9116,
+	0x05e8, 0x81ff, 0x01a0, 0x2009, 0x0000, 0x080c, 0x2c3e, 0x2011,
+	0x8011, 0x2019, 0x010e, 0x231c, 0x939e, 0x0007, 0x1118, 0x2019,
+	0x0001, 0x0010, 0x2019, 0x0000, 0x080c, 0x4b05, 0x0438, 0x2001,
+	0x19a8, 0x200c, 0x81ff, 0x1140, 0x2001, 0x0109, 0x2004, 0xd0b4,
+	0x0118, 0x2019, 0x0003, 0x0008, 0x2118, 0x2011, 0x8012, 0x080c,
+	0x4b05, 0x080c, 0x56d4, 0xd0fc, 0x1188, 0x080c, 0xd20f, 0x1170,
+	0x00c6, 0x080c, 0x28d2, 0x080c, 0xa503, 0x2061, 0x0100, 0x2019,
+	0x0028, 0x2009, 0x0002, 0x080c, 0x3187, 0x00ce, 0x012e, 0x00fe,
+	0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x2028, 0x918c,
+	0x00ff, 0x2130, 0x9094, 0xff00, 0x11f0, 0x2011, 0x1837, 0x2214,
+	0xd2ac, 0x11c8, 0x81ff, 0x01e8, 0x2011, 0x181f, 0x2204, 0x9106,
+	0x1190, 0x2011, 0x1820, 0x2214, 0x9294, 0xff00, 0x9584, 0xff00,
+	0x9206, 0x1148, 0x2011, 0x1820, 0x2214, 0x9294, 0x00ff, 0x9584,
+	0x00ff, 0x9206, 0x1120, 0x2500, 0x080c, 0x8095, 0x0048, 0x9584,
+	0x00ff, 0x9080, 0x331e, 0x200d, 0x918c, 0xff00, 0x810f, 0x9006,
+	0x0005, 0x9080, 0x331e, 0x200d, 0x918c, 0x00ff, 0x0005, 0x00d6,
+	0x2069, 0x0140, 0x2001, 0x1818, 0x2003, 0x00ef, 0x20a9, 0x0010,
+	0x9006, 0x6852, 0x6856, 0x1f04, 0x2882, 0x00de, 0x0005, 0x0006,
+	0x00d6, 0x0026, 0x2069, 0x0140, 0x2001, 0x1818, 0x2102, 0x8114,
+	0x8214, 0x8214, 0x8214, 0x20a9, 0x0010, 0x6853, 0x0000, 0x9006,
+	0x82ff, 0x1128, 0x9184, 0x000f, 0x9080, 0xf195, 0x2005, 0x6856,
+	0x8211, 0x1f04, 0x2897, 0x002e, 0x00de, 0x000e, 0x0005, 0x00c6,
+	0x2061, 0x1800, 0x6030, 0x0110, 0xc09d, 0x0008, 0xc09c, 0x6032,
+	0x00ce, 0x0005, 0x0156, 0x00d6, 0x0026, 0x0016, 0x0006, 0x2069,
+	0x0140, 0x6980, 0x9116, 0x0180, 0x9112, 0x1230, 0x8212, 0x8210,
+	0x22a8, 0x2001, 0x0402, 0x0018, 0x22a8, 0x2001, 0x0404, 0x680e,
+	0x1f04, 0x28c7, 0x680f, 0x0000, 0x000e, 0x001e, 0x002e, 0x00de,
+	0x015e, 0x0005, 0x080c, 0x56d0, 0xd0c4, 0x0150, 0xd0a4, 0x0140,
+	0x9006, 0x0046, 0x2020, 0x2009, 0x002e, 0x080c, 0xe58d, 0x004e,
+	0x0005, 0x00f6, 0x0016, 0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc,
+	0x0904, 0x293e, 0x080c, 0x2b9d, 0x0660, 0x9084, 0x0700, 0x908e,
+	0x0600, 0x1120, 0x2011, 0x4000, 0x900e, 0x0458, 0x908e, 0x0500,
+	0x1120, 0x2011, 0x8000, 0x900e, 0x0420, 0x908e, 0x0400, 0x1120,
+	0x9016, 0x2009, 0x0001, 0x00e8, 0x908e, 0x0300, 0x1120, 0x9016,
+	0x2009, 0x0002, 0x00b0, 0x908e, 0x0200, 0x1120, 0x9016, 0x2009,
+	0x0004, 0x0078, 0x908e, 0x0100, 0x1548, 0x9016, 0x2009, 0x0008,
+	0x0040, 0x9084, 0x0700, 0x908e, 0x0300, 0x1500, 0x2011, 0x0030,
+	0x0058, 0x2300, 0x9080, 0x0020, 0x2018, 0x080c, 0x8f3f, 0x928c,
+	0xff00, 0x0110, 0x2011, 0x00ff, 0x2200, 0x8007, 0x9085, 0x004c,
+	0x78c2, 0x2009, 0x0138, 0x220a, 0x080c, 0x73b0, 0x1118, 0x2009,
+	0x196d, 0x220a, 0x002e, 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000,
+	0x0cc8, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x2001,
+	0x0170, 0x200c, 0x8000, 0x2014, 0x9184, 0x0003, 0x0110, 0x080c,
+	0x0dce, 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x2001, 0x0171,
+	0x2004, 0xd0dc, 0x0168, 0x2001, 0x0170, 0x200c, 0x918c, 0x00ff,
+	0x918e, 0x004c, 0x1128, 0x200c, 0x918c, 0xff00, 0x810f, 0x0005,
+	0x900e, 0x2001, 0x0227, 0x2004, 0x8007, 0x9084, 0x00ff, 0x8004,
+	0x9108, 0x2001, 0x0226, 0x2004, 0x8007, 0x9084, 0x00ff, 0x8004,
+	0x9108, 0x0005, 0x0018, 0x000c, 0x0018, 0x0020, 0x1000, 0x0800,
+	0x1000, 0x1800, 0x0156, 0x0006, 0x0016, 0x0026, 0x00e6, 0x2001,
+	0x1990, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0dd5, 0x0033, 0x00ee,
+	0x002e, 0x001e, 0x000e, 0x015e, 0x0005, 0x299c, 0x29ba, 0x29de,
+	0x29e0, 0x2a09, 0x2a0b, 0x2a0d, 0x2001, 0x0001, 0x080c, 0x27ea,
+	0x080c, 0x2bfb, 0x2001, 0x1992, 0x2003, 0x0000, 0x7828, 0x9084,
+	0xe1d7, 0x782a, 0x9006, 0x20a9, 0x0009, 0x080c, 0x2bb9, 0x2001,
+	0x1990, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x2a0e, 0x080c,
+	0x8562, 0x0005, 0x2009, 0x1995, 0x200b, 0x0000, 0x2001, 0x199a,
+	0x2003, 0x0036, 0x2001, 0x1999, 0x2003, 0x002a, 0x2001, 0x1992,
+	0x2003, 0x0001, 0x9006, 0x080c, 0x2b6b, 0x2001, 0xffff, 0x20a9,
+	0x0009, 0x080c, 0x2bb9, 0x2001, 0x1990, 0x2003, 0x0006, 0x2009,
+	0x001e, 0x2011, 0x2a0e, 0x080c, 0x8562, 0x0005, 0x080c, 0x0dd5,
+	0x2001, 0x199a, 0x2003, 0x0036, 0x2001, 0x1992, 0x2003, 0x0003,
+	0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010,
+	0x2001, 0x0001, 0x080c, 0x2b6b, 0x2001, 0x1996, 0x2003, 0x0000,
+	0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, 0x2bb9, 0x2001, 0x1990,
+	0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x2a0e, 0x080c, 0x8562,
+	0x0005, 0x080c, 0x0dd5, 0x080c, 0x0dd5, 0x0005, 0x0006, 0x0016,
+	0x0026, 0x00e6, 0x00f6, 0x0156, 0x0126, 0x2091, 0x8000, 0x2079,
+	0x0100, 0x2001, 0x1992, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0dd5,
+	0x0043, 0x012e, 0x015e, 0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e,
+	0x0005, 0x2a30, 0x2a50, 0x2a90, 0x2ac0, 0x2ae4, 0x2af4, 0x2af6,
+	0x080c, 0x2bad, 0x11b0, 0x7850, 0x9084, 0xefff, 0x7852, 0x2009,
+	0x1998, 0x2104, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110,
+	0xc08d, 0x0008, 0xc085, 0x200a, 0x2001, 0x1990, 0x2003, 0x0001,
+	0x0030, 0x080c, 0x2b1a, 0x2001, 0xffff, 0x080c, 0x29ab, 0x0005,
+	0x080c, 0x2af8, 0x05e0, 0x2009, 0x1999, 0x2104, 0x8001, 0x200a,
+	0x080c, 0x2bad, 0x1178, 0x7850, 0x9084, 0xefff, 0x7852, 0x7a38,
+	0x9294, 0x0005, 0x9296, 0x0005, 0x0518, 0x2009, 0x1998, 0x2104,
+	0xc085, 0x200a, 0x2009, 0x1995, 0x2104, 0x8000, 0x200a, 0x9086,
+	0x0005, 0x0118, 0x080c, 0x2b00, 0x00c0, 0x200b, 0x0000, 0x7a38,
+	0x9294, 0x0006, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001,
+	0x0001, 0x080c, 0x2b88, 0x2001, 0x1992, 0x2003, 0x0002, 0x0028,
+	0x2001, 0x1990, 0x2003, 0x0003, 0x0010, 0x080c, 0x29cd, 0x0005,
+	0x080c, 0x2af8, 0x0560, 0x2009, 0x1999, 0x2104, 0x8001, 0x200a,
+	0x080c, 0x2bad, 0x1168, 0x7850, 0x9084, 0xefff, 0x7852, 0x2001,
+	0x1990, 0x2003, 0x0003, 0x2001, 0x1991, 0x2003, 0x0000, 0x00b8,
+	0x2009, 0x1999, 0x2104, 0x9005, 0x1118, 0x080c, 0x2b3d, 0x0010,
+	0x080c, 0x2b0d, 0x080c, 0x2b00, 0x2009, 0x1995, 0x200b, 0x0000,
+	0x2001, 0x1992, 0x2003, 0x0001, 0x080c, 0x29cd, 0x0000, 0x0005,
+	0x04b9, 0x0508, 0x080c, 0x2bad, 0x11b8, 0x7850, 0x9084, 0xefff,
+	0x7852, 0x2009, 0x1996, 0x2104, 0x8000, 0x200a, 0x9086, 0x0007,
+	0x0108, 0x0078, 0x2001, 0x199b, 0x2003, 0x000a, 0x2009, 0x1998,
+	0x2104, 0xc0fd, 0x200a, 0x0038, 0x0419, 0x2001, 0x1992, 0x2003,
+	0x0004, 0x080c, 0x29f8, 0x0005, 0x0099, 0x0168, 0x080c, 0x2bad,
+	0x1138, 0x7850, 0x9084, 0xefff, 0x7852, 0x080c, 0x29e4, 0x0018,
+	0x0079, 0x080c, 0x29f8, 0x0005, 0x080c, 0x0dd5, 0x080c, 0x0dd5,
+	0x2009, 0x199a, 0x2104, 0x8001, 0x200a, 0x090c, 0x2b59, 0x0005,
+	0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, 0x0010,
+	0x2001, 0x0001, 0x080c, 0x2b88, 0x0005, 0x7a38, 0x9294, 0x0006,
+	0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c,
+	0x2b6b, 0x0005, 0x2009, 0x1995, 0x2104, 0x8000, 0x200a, 0x9086,
+	0x0005, 0x0108, 0x0068, 0x200b, 0x0000, 0x7a38, 0x9294, 0x0006,
+	0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x04d9,
+	0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, 0x0010,
+	0x2001, 0x0001, 0x080c, 0x2b88, 0x0005, 0x0086, 0x2001, 0x1998,
+	0x2004, 0x9084, 0x7fff, 0x090c, 0x0dd5, 0x2009, 0x1997, 0x2144,
+	0x8846, 0x280a, 0x9844, 0x0dd8, 0xd08c, 0x1120, 0xd084, 0x1120,
+	0x080c, 0x0dd5, 0x9006, 0x0010, 0x2001, 0x0001, 0x00a1, 0x008e,
+	0x0005, 0x0006, 0x0156, 0x2001, 0x1990, 0x20a9, 0x0009, 0x2003,
+	0x0000, 0x8000, 0x1f04, 0x2b5f, 0x2001, 0x1997, 0x2003, 0x8000,
+	0x015e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000,
+	0x0158, 0x7838, 0x9084, 0xfff9, 0x9085, 0x0004, 0x783a, 0x2009,
+	0x199d, 0x210c, 0x795a, 0x0050, 0x7838, 0x9084, 0xfffb, 0x9085,
+	0x0006, 0x783a, 0x2009, 0x199e, 0x210c, 0x795a, 0x00fe, 0x0005,
+	0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0138, 0x7838, 0x9084,
+	0xfffa, 0x9085, 0x0004, 0x783a, 0x0030, 0x7838, 0x9084, 0xfffb,
+	0x9085, 0x0005, 0x783a, 0x00fe, 0x0005, 0x0006, 0x2001, 0x0100,
+	0x2004, 0x9082, 0x0007, 0x000e, 0x0005, 0x0006, 0x2001, 0x0100,
+	0x2004, 0x9082, 0x0009, 0x000e, 0x0005, 0x0156, 0x20a9, 0x0064,
+	0x7820, 0x080c, 0x2c38, 0xd09c, 0x1110, 0x1f04, 0x2bb0, 0x015e,
+	0x0005, 0x0126, 0x0016, 0x0006, 0x2091, 0x8000, 0x7850, 0x9085,
+	0x0040, 0x7852, 0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, 0x2c38,
+	0x9085, 0x2000, 0x7852, 0x000e, 0x2008, 0x9186, 0x0000, 0x1118,
+	0x783b, 0x0007, 0x0090, 0x9186, 0x0001, 0x1118, 0x783b, 0x0006,
+	0x0060, 0x9186, 0x0002, 0x1118, 0x783b, 0x0005, 0x0030, 0x9186,
+	0x0003, 0x1118, 0x783b, 0x0004, 0x0000, 0x0006, 0x1d04, 0x2be6,
+	0x080c, 0x8584, 0x1f04, 0x2be6, 0x7850, 0x9085, 0x0400, 0x9084,
+	0xdfbf, 0x7852, 0x080c, 0x2c38, 0x9085, 0x1000, 0x7852, 0x000e,
+	0x001e, 0x012e, 0x0005, 0x7850, 0x9084, 0xffcf, 0x7852, 0x0005,
+	0x0006, 0x0156, 0x00f6, 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854,
+	0xd0ac, 0x1130, 0x7820, 0xd0e4, 0x1140, 0x1f04, 0x2c0a, 0x0028,
+	0x7854, 0xd08c, 0x1110, 0x1f04, 0x2c10, 0x00fe, 0x015e, 0x000e,
+	0x0005, 0x1d04, 0x2c19, 0x080c, 0x8584, 0x1f04, 0x2c19, 0x0005,
+	0x0006, 0x2001, 0x199c, 0x2004, 0x9086, 0x0000, 0x000e, 0x0005,
+	0x0006, 0x2001, 0x199c, 0x2004, 0x9086, 0x0001, 0x000e, 0x0005,
+	0x0006, 0x2001, 0x199c, 0x2004, 0x9086, 0x0002, 0x000e, 0x0005,
+	0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x0005, 0x0006, 0x2001,
+	0x19a8, 0x2102, 0x000e, 0x0005, 0x2009, 0x0171, 0x2104, 0xd0dc,
+	0x0140, 0x2009, 0x0170, 0x2104, 0x200b, 0x0080, 0xa001, 0xa001,
+	0x200a, 0x0005, 0x0036, 0x0046, 0x2001, 0x0141, 0x200c, 0x918c,
+	0xff00, 0x9186, 0x2000, 0x0118, 0x9186, 0x0100, 0x1588, 0x2009,
+	0x00a2, 0x080c, 0x0e51, 0x2019, 0x0160, 0x2324, 0x2011, 0x0003,
+	0x2009, 0x0169, 0x2104, 0x9084, 0x0007, 0x210c, 0x918c, 0x0007,
+	0x910e, 0x1db0, 0x9086, 0x0003, 0x11b8, 0x2304, 0x9402, 0x02a0,
+	0x1d60, 0x8211, 0x1d68, 0x84ff, 0x0170, 0x2001, 0x0141, 0x200c,
+	0x918c, 0xff00, 0x9186, 0x0100, 0x0130, 0x2009, 0x180c, 0x2104,
+	0xc0dd, 0x200a, 0x0008, 0x0419, 0x2009, 0x0000, 0x080c, 0x0e51,
+	0x004e, 0x003e, 0x0005, 0x2001, 0x180c, 0x2004, 0xd0dc, 0x01b0,
+	0x2001, 0x0160, 0x2004, 0x9005, 0x0140, 0x2001, 0x0141, 0x2004,
+	0x9084, 0xff00, 0x9086, 0x0100, 0x1148, 0x0126, 0x2091, 0x8000,
+	0x0016, 0x0026, 0x0021, 0x002e, 0x001e, 0x012e, 0x0005, 0x00c6,
+	0x2061, 0x0100, 0x6014, 0x0006, 0x2001, 0x0161, 0x2003, 0x0000,
+	0x6017, 0x0018, 0xa001, 0xa001, 0x602f, 0x0008, 0x6104, 0x918e,
+	0x0010, 0x6106, 0x918e, 0x0010, 0x6106, 0x6017, 0x0040, 0x04b9,
+	0x001e, 0x9184, 0x0003, 0x01e0, 0x0036, 0x0016, 0x2019, 0x0141,
+	0x6124, 0x918c, 0x0028, 0x1120, 0x2304, 0x9084, 0x2800, 0x0dc0,
+	0x001e, 0x919c, 0xffe4, 0x9184, 0x0001, 0x0118, 0x9385, 0x0009,
+	0x6016, 0x9184, 0x0002, 0x0118, 0x9385, 0x0012, 0x6016, 0x003e,
+	0x2001, 0x180c, 0x200c, 0xc1dc, 0x2102, 0x00ce, 0x0005, 0x0016,
+	0x0026, 0x080c, 0x73ca, 0x0108, 0xc0bc, 0x2009, 0x0140, 0x2114,
+	0x9294, 0x0001, 0x9215, 0x220a, 0x002e, 0x001e, 0x0005, 0x0016,
+	0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, 0x9285, 0x1000,
+	0x200a, 0x220a, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x2009,
 	0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a, 0x002e, 0x001e,
-	0x0005, 0x0016, 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001,
-	0x9285, 0x1000, 0x200a, 0x220a, 0x002e, 0x001e, 0x0005, 0x0016,
-	0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a,
-	0x002e, 0x001e, 0x0005, 0x0006, 0x0016, 0x2009, 0x0140, 0x2104,
-	0x1128, 0x080c, 0x7197, 0x0110, 0xc0bc, 0x0008, 0xc0bd, 0x200a,
-	0x001e, 0x000e, 0x0005, 0x2e47, 0x2e47, 0x2c6b, 0x2c6b, 0x2c77,
-	0x2c77, 0x2c83, 0x2c83, 0x2c91, 0x2c91, 0x2c9d, 0x2c9d, 0x2cab,
-	0x2cab, 0x2cb9, 0x2cb9, 0x2ccb, 0x2ccb, 0x2cd7, 0x2cd7, 0x2ce5,
-	0x2ce5, 0x2d03, 0x2d03, 0x2d23, 0x2d23, 0x2cf3, 0x2cf3, 0x2d13,
-	0x2d13, 0x2d31, 0x2d31, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9,
-	0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9,
-	0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9,
-	0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9,
-	0x2cc9, 0x2cc9, 0x2cc9, 0x2d43, 0x2d43, 0x2d4f, 0x2d4f, 0x2d5d,
-	0x2d5d, 0x2d6b, 0x2d6b, 0x2d7b, 0x2d7b, 0x2d89, 0x2d89, 0x2d99,
-	0x2d99, 0x2da9, 0x2da9, 0x2dbb, 0x2dbb, 0x2dc9, 0x2dc9, 0x2dd9,
-	0x2dd9, 0x2dfb, 0x2dfb, 0x2e1d, 0x2e1d, 0x2de9, 0x2de9, 0x2e0c,
-	0x2e0c, 0x2e2c, 0x2e2c, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9,
-	0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9,
-	0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9,
-	0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9,
-	0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9,
-	0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9, 0x2cc9,
-	0x2cc9, 0x2cc9, 0x2cc9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
-	0x0136, 0x0146, 0x0156, 0x080c, 0x2333, 0x0804, 0x2e3f, 0x0106,
+	0x0005, 0x0006, 0x0016, 0x2009, 0x0140, 0x2104, 0x1128, 0x080c,
+	0x73ca, 0x0110, 0xc0bc, 0x0008, 0xc0bd, 0x200a, 0x001e, 0x000e,
+	0x0005, 0x2f95, 0x2f95, 0x2db9, 0x2db9, 0x2dc5, 0x2dc5, 0x2dd1,
+	0x2dd1, 0x2ddf, 0x2ddf, 0x2deb, 0x2deb, 0x2df9, 0x2df9, 0x2e07,
+	0x2e07, 0x2e19, 0x2e19, 0x2e25, 0x2e25, 0x2e33, 0x2e33, 0x2e51,
+	0x2e51, 0x2e71, 0x2e71, 0x2e41, 0x2e41, 0x2e61, 0x2e61, 0x2e7f,
+	0x2e7f, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17,
+	0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17,
+	0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17,
+	0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17,
+	0x2e17, 0x2e91, 0x2e91, 0x2e9d, 0x2e9d, 0x2eab, 0x2eab, 0x2eb9,
+	0x2eb9, 0x2ec9, 0x2ec9, 0x2ed7, 0x2ed7, 0x2ee7, 0x2ee7, 0x2ef7,
+	0x2ef7, 0x2f09, 0x2f09, 0x2f17, 0x2f17, 0x2f27, 0x2f27, 0x2f49,
+	0x2f49, 0x2f6b, 0x2f6b, 0x2f37, 0x2f37, 0x2f5a, 0x2f5a, 0x2f7a,
+	0x2f7a, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17,
+	0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17,
+	0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17,
+	0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17,
+	0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17,
+	0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17,
+	0x2e17, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x2481, 0x0804, 0x2f8d, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2295, 0x0804,
+	0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x2295, 0x080c, 0x2481, 0x0804, 0x2f8d, 0x0106,
 	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
-	0x2147, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
-	0x0136, 0x0146, 0x0156, 0x080c, 0x2147, 0x080c, 0x2333, 0x0804,
-	0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
-	0x0156, 0x080c, 0x2182, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126,
-	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2333, 0x080c,
-	0x2182, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
-	0x0136, 0x0146, 0x0156, 0x080c, 0x2147, 0x080c, 0x2182, 0x0804,
-	0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
-	0x0156, 0x080c, 0x2147, 0x080c, 0x2333, 0x080c, 0x2182, 0x0804,
-	0x2e3f, 0xa001, 0x0cf0, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
-	0x0136, 0x0146, 0x0156, 0x080c, 0x1363, 0x0804, 0x2e3f, 0x0106,
+	0x22d0, 0x0804, 0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0x2481, 0x080c, 0x22d0, 0x0804,
+	0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x2295, 0x080c, 0x22d0, 0x0804, 0x2f8d, 0x0106,
 	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
-	0x2333, 0x080c, 0x1363, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126,
-	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2147, 0x080c,
-	0x1363, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
-	0x0136, 0x0146, 0x0156, 0x080c, 0x2333, 0x080c, 0x1363, 0x080c,
-	0x2182, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
-	0x0136, 0x0146, 0x0156, 0x080c, 0x2147, 0x080c, 0x2333, 0x080c,
-	0x1363, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
-	0x0136, 0x0146, 0x0156, 0x080c, 0x2147, 0x080c, 0x1363, 0x080c,
-	0x2182, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
-	0x0136, 0x0146, 0x0156, 0x080c, 0x1363, 0x080c, 0x2182, 0x0804,
-	0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
-	0x0156, 0x080c, 0x2147, 0x080c, 0x2333, 0x080c, 0x1363, 0x080c,
-	0x2182, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
-	0x0136, 0x0146, 0x0156, 0x080c, 0x27f3, 0x0804, 0x2e3f, 0x0106,
+	0x2295, 0x080c, 0x2481, 0x080c, 0x22d0, 0x0804, 0x2f8d, 0xa001,
+	0x0cf0, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x1380, 0x0804, 0x2f8d, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2481, 0x080c,
+	0x1380, 0x0804, 0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0x2295, 0x080c, 0x1380, 0x0804,
+	0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x2481, 0x080c, 0x1380, 0x080c, 0x22d0, 0x0804,
+	0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x2295, 0x080c, 0x2481, 0x080c, 0x1380, 0x0804,
+	0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x2295, 0x080c, 0x1380, 0x080c, 0x22d0, 0x0804,
+	0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x1380, 0x080c, 0x22d0, 0x0804, 0x2f8d, 0x0106,
 	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
-	0x27f3, 0x080c, 0x2333, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126,
-	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x27f3, 0x080c,
-	0x2147, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
-	0x0136, 0x0146, 0x0156, 0x080c, 0x27f3, 0x080c, 0x2147, 0x080c,
-	0x2333, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
-	0x0136, 0x0146, 0x0156, 0x080c, 0x27f3, 0x080c, 0x2182, 0x0804,
-	0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
-	0x0156, 0x080c, 0x27f3, 0x080c, 0x2333, 0x080c, 0x2182, 0x0804,
-	0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
-	0x0156, 0x080c, 0x27f3, 0x080c, 0x2147, 0x080c, 0x2182, 0x0804,
-	0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
-	0x0156, 0x080c, 0x27f3, 0x080c, 0x2147, 0x080c, 0x2333, 0x080c,
-	0x2182, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
-	0x0136, 0x0146, 0x0156, 0x080c, 0x27f3, 0x080c, 0x1363, 0x0804,
-	0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
-	0x0156, 0x080c, 0x27f3, 0x080c, 0x2333, 0x080c, 0x1363, 0x0804,
-	0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
-	0x0156, 0x080c, 0x27f3, 0x080c, 0x2147, 0x080c, 0x1363, 0x0804,
-	0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
-	0x0156, 0x080c, 0x27f3, 0x080c, 0x2333, 0x080c, 0x1363, 0x080c,
-	0x2182, 0x0804, 0x2e3f, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
-	0x0136, 0x0146, 0x0156, 0x080c, 0x27f3, 0x080c, 0x2147, 0x080c,
-	0x2333, 0x080c, 0x1363, 0x0498, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x27f3, 0x080c, 0x2147,
-	0x080c, 0x1363, 0x080c, 0x2182, 0x0410, 0x0106, 0x0006, 0x0126,
-	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x27f3, 0x080c,
-	0x1363, 0x080c, 0x2182, 0x0098, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x27f3, 0x080c, 0x2147,
-	0x080c, 0x2333, 0x080c, 0x1363, 0x080c, 0x2182, 0x0000, 0x015e,
-	0x014e, 0x013e, 0x01de, 0x01ce, 0x012e, 0x000e, 0x010e, 0x000d,
-	0x00b6, 0x00c6, 0x0026, 0x0046, 0x9026, 0x080c, 0x66f5, 0x1904,
-	0x2f55, 0x72dc, 0x2001, 0x197c, 0x2004, 0x9005, 0x1110, 0xd29c,
-	0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, 0x2f55, 0x080c, 0x2f5a,
-	0x0804, 0x2f55, 0xd2cc, 0x1904, 0x2f55, 0x080c, 0x717d, 0x1120,
-	0x70af, 0xffff, 0x0804, 0x2f55, 0xd294, 0x0120, 0x70af, 0xffff,
-	0x0804, 0x2f55, 0x080c, 0x31bf, 0x0160, 0x080c, 0xcf18, 0x0128,
-	0x2001, 0x1818, 0x203c, 0x0804, 0x2ee2, 0x70af, 0xffff, 0x0804,
-	0x2f55, 0x2001, 0x1818, 0x203c, 0x7294, 0xd284, 0x0904, 0x2ee2,
-	0xd28c, 0x1904, 0x2ee2, 0x0036, 0x73ac, 0x938e, 0xffff, 0x1110,
-	0x2019, 0x0001, 0x8314, 0x92e0, 0x1c80, 0x2c04, 0x938c, 0x0001,
-	0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, 0x970e,
-	0x05b8, 0x908e, 0x0000, 0x05a0, 0x908e, 0x00ff, 0x1150, 0x7230,
-	0xd284, 0x1598, 0x7294, 0xc28d, 0x7296, 0x70af, 0xffff, 0x003e,
-	0x0488, 0x900e, 0x080c, 0x26f0, 0x080c, 0x636c, 0x1520, 0x9006,
-	0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0148, 0x00c6, 0x2060, 0x080c,
-	0x8710, 0x00ce, 0x090c, 0x8ab4, 0xb8af, 0x0000, 0x080c, 0x6737,
-	0x1150, 0x7030, 0xd08c, 0x0118, 0xb800, 0xd0bc, 0x0120, 0x080c,
-	0x2f73, 0x0148, 0x0028, 0x080c, 0x30af, 0x080c, 0x2f9f, 0x0118,
-	0x8318, 0x0804, 0x2e92, 0x73ae, 0x0010, 0x70af, 0xffff, 0x003e,
-	0x0804, 0x2f55, 0x9780, 0x31d0, 0x203d, 0x97bc, 0xff00, 0x873f,
-	0x2041, 0x007e, 0x70ac, 0x9096, 0xffff, 0x1118, 0x900e, 0x28a8,
-	0x0050, 0x9812, 0x0220, 0x2008, 0x9802, 0x20a8, 0x0020, 0x70af,
-	0xffff, 0x0804, 0x2f55, 0x2700, 0x0156, 0x0016, 0x9106, 0x0904,
-	0x2f4a, 0xc484, 0x080c, 0x63cd, 0x0148, 0x080c, 0xcf18, 0x1904,
-	0x2f4a, 0x080c, 0x636c, 0x1904, 0x2f52, 0x0008, 0xc485, 0xb8bb,
-	0x0520, 0xb8ac, 0x9005, 0x0148, 0x00c6, 0x2060, 0x080c, 0x8710,
-	0x00ce, 0x090c, 0x8ab4, 0xb8af, 0x0000, 0x080c, 0x6737, 0x1130,
-	0x7030, 0xd08c, 0x01f8, 0xb800, 0xd0bc, 0x11e0, 0x7294, 0xd28c,
-	0x0180, 0x080c, 0x6737, 0x9082, 0x0006, 0x02e0, 0xd484, 0x1118,
-	0x080c, 0x6391, 0x0028, 0x080c, 0x313b, 0x01a0, 0x080c, 0x3166,
-	0x0088, 0x080c, 0x30af, 0x080c, 0xcf18, 0x1160, 0x080c, 0x2f9f,
-	0x0188, 0x0040, 0x080c, 0xcf18, 0x1118, 0x080c, 0x313b, 0x0110,
-	0x0451, 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, 0x2efb, 0x70af,
-	0xffff, 0x0018, 0x001e, 0x015e, 0x71ae, 0x004e, 0x002e, 0x00ce,
-	0x00be, 0x0005, 0x00c6, 0x0016, 0x70af, 0x0001, 0x2009, 0x007e,
-	0x080c, 0x636c, 0x1168, 0xb813, 0x00ff, 0xb817, 0xfffe, 0x080c,
-	0x30af, 0x04a9, 0x0128, 0x70dc, 0xc0bd, 0x70de, 0x080c, 0xcc6a,
-	0x001e, 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001,
-	0x184c, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0xabb9, 0x01d0,
-	0x2b00, 0x6012, 0x080c, 0xcc93, 0x6023, 0x0001, 0x9006, 0x080c,
-	0x6309, 0x2001, 0x0000, 0x080c, 0x631d, 0x0126, 0x2091, 0x8000,
-	0x70a8, 0x8000, 0x70aa, 0x012e, 0x2009, 0x0004, 0x080c, 0xabe6,
-	0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x0016,
-	0x0076, 0x00d6, 0x00c6, 0x2001, 0x184c, 0x2004, 0x9084, 0x00ff,
-	0xb842, 0x080c, 0xabb9, 0x0548, 0x2b00, 0x6012, 0xb800, 0xc0c4,
-	0xb802, 0xb8a0, 0x9086, 0x007e, 0x0140, 0xb804, 0x9084, 0x00ff,
-	0x9086, 0x0006, 0x1110, 0x080c, 0x306e, 0x080c, 0xcc93, 0x6023,
-	0x0001, 0x9006, 0x080c, 0x6309, 0x2001, 0x0002, 0x080c, 0x631d,
-	0x0126, 0x2091, 0x8000, 0x70a8, 0x8000, 0x70aa, 0x012e, 0x2009,
-	0x0002, 0x080c, 0xabe6, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e,
-	0x001e, 0x0005, 0x00b6, 0x00c6, 0x0026, 0x2009, 0x0080, 0x080c,
-	0x636c, 0x1140, 0xb813, 0x00ff, 0xb817, 0xfffc, 0x0039, 0x0110,
-	0x70e3, 0xffff, 0x002e, 0x00ce, 0x00be, 0x0005, 0x0016, 0x0076,
-	0x00d6, 0x00c6, 0x080c, 0xab15, 0x01d0, 0x2b00, 0x6012, 0x080c,
-	0xcc93, 0x6023, 0x0001, 0x9006, 0x080c, 0x6309, 0x2001, 0x0002,
-	0x080c, 0x631d, 0x0126, 0x2091, 0x8000, 0x70e4, 0x8000, 0x70e6,
-	0x012e, 0x2009, 0x0002, 0x080c, 0xabe6, 0x9085, 0x0001, 0x00ce,
-	0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0126, 0x2091,
-	0x8000, 0x2009, 0x007f, 0x080c, 0x636c, 0x11b8, 0xb813, 0x00ff,
-	0xb817, 0xfffd, 0xb8cf, 0x0004, 0x080c, 0xab15, 0x0170, 0x2b00,
-	0x6012, 0x6316, 0x6023, 0x0001, 0x620a, 0x080c, 0xcc93, 0x2009,
-	0x0022, 0x080c, 0xabe6, 0x9085, 0x0001, 0x012e, 0x00de, 0x00ce,
-	0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x00b6, 0x21f0,
-	0x080c, 0x9025, 0x080c, 0x8faa, 0x080c, 0xa9ae, 0x080c, 0xba81,
-	0x3e08, 0x2130, 0x81ff, 0x0120, 0x20a9, 0x007e, 0x900e, 0x0018,
-	0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x63cd, 0x1140, 0x9686,
-	0x0002, 0x1118, 0xb800, 0xd0bc, 0x1110, 0x080c, 0x5e12, 0x001e,
-	0x8108, 0x1f04, 0x3053, 0x9686, 0x0001, 0x190c, 0x3193, 0x00be,
-	0x002e, 0x003e, 0x006e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6,
-	0x0036, 0x0026, 0x0016, 0x00b6, 0x6210, 0x2258, 0xbaa0, 0x0026,
-	0x2019, 0x0029, 0x080c, 0x901a, 0x0076, 0x2039, 0x0000, 0x080c,
-	0x8ef7, 0x2c08, 0x080c, 0xdfbd, 0x007e, 0x001e, 0xba10, 0xbb14,
-	0x080c, 0x5e12, 0xba12, 0xbb16, 0x00be, 0x001e, 0x002e, 0x003e,
-	0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x00b6, 0x6010, 0x2058,
-	0xb8a0, 0x00be, 0x9086, 0x0080, 0x0150, 0x2071, 0x1800, 0x70a8,
-	0x9005, 0x0110, 0x8001, 0x70aa, 0x000e, 0x00ee, 0x0005, 0x2071,
-	0x1800, 0x70e4, 0x9005, 0x0dc0, 0x8001, 0x70e6, 0x0ca8, 0xb800,
-	0xc08c, 0xb802, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x00b6, 0x0036,
-	0x0026, 0x0016, 0x0156, 0x2178, 0x81ff, 0x1118, 0x20a9, 0x0001,
-	0x0088, 0x080c, 0x54b7, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006,
-	0x0046, 0x2020, 0x2009, 0x002d, 0x080c, 0xe280, 0x004e, 0x20a9,
-	0x0800, 0x9016, 0x0026, 0x928e, 0x007e, 0x0904, 0x311b, 0x928e,
-	0x007f, 0x0904, 0x311b, 0x928e, 0x0080, 0x05e8, 0x9288, 0x1000,
-	0x210c, 0x81ff, 0x05c0, 0x8fff, 0x1148, 0x2001, 0x198c, 0x0006,
-	0x2003, 0x0001, 0x04e9, 0x000e, 0x2003, 0x0000, 0x00b6, 0x00c6,
-	0x2158, 0x2001, 0x0001, 0x080c, 0x6701, 0x00ce, 0x00be, 0x2019,
-	0x0029, 0x080c, 0x901a, 0x0076, 0x2039, 0x0000, 0x080c, 0x8ef7,
-	0x00b6, 0x00c6, 0x0026, 0x2158, 0xba04, 0x9294, 0x00ff, 0x9286,
-	0x0006, 0x1118, 0xb807, 0x0404, 0x0028, 0x2001, 0x0004, 0x8007,
-	0x9215, 0xba06, 0x002e, 0x00ce, 0x00be, 0x0016, 0x2c08, 0x080c,
-	0xdfbd, 0x001e, 0x007e, 0x002e, 0x8210, 0x1f04, 0x30d2, 0x015e,
-	0x001e, 0x002e, 0x003e, 0x00be, 0x00ce, 0x00ee, 0x00fe, 0x0005,
-	0x0046, 0x0026, 0x0016, 0x080c, 0x54b7, 0xd0c4, 0x0140, 0xd0a4,
-	0x0130, 0x9006, 0x2220, 0x2009, 0x0029, 0x080c, 0xe280, 0x001e,
-	0x002e, 0x004e, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x7294,
-	0x82ff, 0x01e8, 0x080c, 0x672f, 0x11d0, 0x2100, 0x080c, 0x2723,
-	0x81ff, 0x01b8, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1c80, 0x2c04,
-	0xd384, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff,
-	0x9116, 0x0138, 0x9096, 0x00ff, 0x0110, 0x8318, 0x0c68, 0x9085,
-	0x0001, 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x0016, 0x00c6,
-	0x0126, 0x2091, 0x8000, 0x0036, 0x2019, 0x0029, 0x00a9, 0x003e,
-	0x9180, 0x1000, 0x2004, 0x9065, 0x0158, 0x0016, 0x00c6, 0x2061,
-	0x1aa7, 0x001e, 0x6112, 0x080c, 0x306e, 0x001e, 0x080c, 0x6391,
-	0x012e, 0x00ce, 0x001e, 0x0005, 0x0016, 0x0026, 0x2110, 0x080c,
-	0xa512, 0x080c, 0xe5e4, 0x002e, 0x001e, 0x0005, 0x2001, 0x1837,
-	0x2004, 0xd0cc, 0x0005, 0x00c6, 0x00b6, 0x080c, 0x717d, 0x1118,
-	0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c, 0x717d, 0x1110,
-	0x900e, 0x0010, 0x2009, 0x007e, 0x9180, 0x1000, 0x2004, 0x905d,
-	0x0130, 0x86ff, 0x0110, 0xb800, 0xd0bc, 0x090c, 0x6391, 0x8108,
-	0x1f04, 0x31a4, 0x2061, 0x1800, 0x607f, 0x0000, 0x6080, 0x9084,
-	0x00ff, 0x6082, 0x60b3, 0x0000, 0x00be, 0x00ce, 0x0005, 0x2001,
-	0x1869, 0x2004, 0xd0bc, 0x0005, 0x2011, 0x1848, 0x2214, 0xd2ec,
-	0x0005, 0x0026, 0x2011, 0x1867, 0x2214, 0xd2dc, 0x002e, 0x0005,
-	0x7eef, 0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da,
-	0x7ad9, 0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce,
-	0x78cd, 0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5,
-	0x76c3, 0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3,
-	0x80b2, 0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9,
-	0x80a7, 0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b,
-	0x8098, 0x6797, 0x6690, 0x658f, 0x6488, 0x6384, 0x6282, 0x8081,
-	0x8080, 0x617c, 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, 0x8073,
-	0x8072, 0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69,
-	0x8067, 0x5a66, 0x5965, 0x5863, 0x575c, 0x565a, 0x5559, 0x8056,
-	0x8055, 0x5454, 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c,
-	0x804b, 0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, 0x803c,
-	0x803a, 0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831,
-	0x802e, 0x472d, 0x462c, 0x452b, 0x442a, 0x4329, 0x4227, 0x8026,
-	0x8025, 0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017,
-	0x8010, 0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, 0x8000,
-	0x3800, 0x3700, 0x3600, 0x8000, 0x3500, 0x8000, 0x8000, 0x8000,
-	0x3400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3300,
-	0x3200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3100,
-	0x3000, 0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00,
-	0x8000, 0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800,
-	0x8000, 0x2700, 0x2600, 0x2500, 0x2400, 0x2300, 0x2200, 0x8000,
-	0x8000, 0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000,
-	0x8000, 0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, 0x8000,
-	0x8000, 0x8000, 0x8000, 0x1800, 0x8000, 0x1700, 0x1600, 0x1500,
-	0x8000, 0x1400, 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, 0x8000,
-	0x8000, 0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000,
-	0x8000, 0x0800, 0x0700, 0x8000, 0x0600, 0x8000, 0x8000, 0x8000,
-	0x0500, 0x0400, 0x0300, 0x8000, 0x0200, 0x8000, 0x8000, 0x8000,
-	0x0100, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000,
-	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+	0x2295, 0x080c, 0x2481, 0x080c, 0x1380, 0x080c, 0x22d0, 0x0804,
+	0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x2941, 0x0804, 0x2f8d, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2941, 0x080c,
+	0x2481, 0x0804, 0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0x2941, 0x080c, 0x2295, 0x0804,
+	0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x2941, 0x080c, 0x2295, 0x080c, 0x2481, 0x0804,
+	0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x2941, 0x080c, 0x22d0, 0x0804, 0x2f8d, 0x0106,
+	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
+	0x2941, 0x080c, 0x2481, 0x080c, 0x22d0, 0x0804, 0x2f8d, 0x0106,
+	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
+	0x2941, 0x080c, 0x2295, 0x080c, 0x22d0, 0x0804, 0x2f8d, 0x0106,
+	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
+	0x2941, 0x080c, 0x2295, 0x080c, 0x2481, 0x080c, 0x22d0, 0x0804,
+	0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x2941, 0x080c, 0x1380, 0x0804, 0x2f8d, 0x0106,
+	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
+	0x2941, 0x080c, 0x2481, 0x080c, 0x1380, 0x0804, 0x2f8d, 0x0106,
+	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
+	0x2941, 0x080c, 0x2295, 0x080c, 0x1380, 0x0804, 0x2f8d, 0x0106,
+	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
+	0x2941, 0x080c, 0x2481, 0x080c, 0x1380, 0x080c, 0x22d0, 0x0804,
+	0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x2941, 0x080c, 0x2295, 0x080c, 0x2481, 0x080c,
+	0x1380, 0x0498, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
+	0x0146, 0x0156, 0x080c, 0x2941, 0x080c, 0x2295, 0x080c, 0x1380,
+	0x080c, 0x22d0, 0x0410, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0x2941, 0x080c, 0x1380, 0x080c,
+	0x22d0, 0x0098, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
+	0x0146, 0x0156, 0x080c, 0x2941, 0x080c, 0x2295, 0x080c, 0x2481,
+	0x080c, 0x1380, 0x080c, 0x22d0, 0x0000, 0x015e, 0x014e, 0x013e,
+	0x01de, 0x01ce, 0x012e, 0x000e, 0x010e, 0x000d, 0x00b6, 0x00c6,
+	0x0026, 0x0046, 0x9026, 0x080c, 0x6928, 0x1904, 0x30a3, 0x72dc,
+	0x2001, 0x197c, 0x2004, 0x9005, 0x1110, 0xd29c, 0x0148, 0xd284,
+	0x1138, 0xd2bc, 0x1904, 0x30a3, 0x080c, 0x30a8, 0x0804, 0x30a3,
+	0xd2cc, 0x1904, 0x30a3, 0x080c, 0x73b0, 0x1120, 0x70af, 0xffff,
+	0x0804, 0x30a3, 0xd294, 0x0120, 0x70af, 0xffff, 0x0804, 0x30a3,
+	0x080c, 0x330d, 0x0160, 0x080c, 0xd216, 0x0128, 0x2001, 0x1818,
+	0x203c, 0x0804, 0x3030, 0x70af, 0xffff, 0x0804, 0x30a3, 0x2001,
+	0x1818, 0x203c, 0x7294, 0xd284, 0x0904, 0x3030, 0xd28c, 0x1904,
+	0x3030, 0x0036, 0x73ac, 0x938e, 0xffff, 0x1110, 0x2019, 0x0001,
+	0x8314, 0x92e0, 0x1c80, 0x2c04, 0x938c, 0x0001, 0x0120, 0x9084,
+	0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, 0x970e, 0x05b8, 0x908e,
+	0x0000, 0x05a0, 0x908e, 0x00ff, 0x1150, 0x7230, 0xd284, 0x1598,
+	0x7294, 0xc28d, 0x7296, 0x70af, 0xffff, 0x003e, 0x0488, 0x900e,
+	0x080c, 0x283e, 0x080c, 0x659f, 0x1520, 0x9006, 0xb8bb, 0x0520,
+	0xb8ac, 0x9005, 0x0148, 0x00c6, 0x2060, 0x080c, 0x8958, 0x00ce,
+	0x090c, 0x8cfc, 0xb8af, 0x0000, 0x080c, 0x696a, 0x1150, 0x7030,
+	0xd08c, 0x0118, 0xb800, 0xd0bc, 0x0120, 0x080c, 0x30c1, 0x0148,
+	0x0028, 0x080c, 0x31fd, 0x080c, 0x30ed, 0x0118, 0x8318, 0x0804,
+	0x2fe0, 0x73ae, 0x0010, 0x70af, 0xffff, 0x003e, 0x0804, 0x30a3,
+	0x9780, 0x331e, 0x203d, 0x97bc, 0xff00, 0x873f, 0x2041, 0x007e,
+	0x70ac, 0x9096, 0xffff, 0x1118, 0x900e, 0x28a8, 0x0050, 0x9812,
+	0x0220, 0x2008, 0x9802, 0x20a8, 0x0020, 0x70af, 0xffff, 0x0804,
+	0x30a3, 0x2700, 0x0156, 0x0016, 0x9106, 0x0904, 0x3098, 0xc484,
+	0x080c, 0x6600, 0x0148, 0x080c, 0xd216, 0x1904, 0x3098, 0x080c,
+	0x659f, 0x1904, 0x30a0, 0x0008, 0xc485, 0xb8bb, 0x0520, 0xb8ac,
+	0x9005, 0x0148, 0x00c6, 0x2060, 0x080c, 0x8958, 0x00ce, 0x090c,
+	0x8cfc, 0xb8af, 0x0000, 0x080c, 0x696a, 0x1130, 0x7030, 0xd08c,
+	0x01f8, 0xb800, 0xd0bc, 0x11e0, 0x7294, 0xd28c, 0x0180, 0x080c,
+	0x696a, 0x9082, 0x0006, 0x02e0, 0xd484, 0x1118, 0x080c, 0x65c4,
+	0x0028, 0x080c, 0x3289, 0x01a0, 0x080c, 0x32b4, 0x0088, 0x080c,
+	0x31fd, 0x080c, 0xd216, 0x1160, 0x080c, 0x30ed, 0x0188, 0x0040,
+	0x080c, 0xd216, 0x1118, 0x080c, 0x3289, 0x0110, 0x0451, 0x0140,
+	0x001e, 0x8108, 0x015e, 0x1f04, 0x3049, 0x70af, 0xffff, 0x0018,
+	0x001e, 0x015e, 0x71ae, 0x004e, 0x002e, 0x00ce, 0x00be, 0x0005,
+	0x00c6, 0x0016, 0x70af, 0x0001, 0x2009, 0x007e, 0x080c, 0x659f,
+	0x1168, 0xb813, 0x00ff, 0xb817, 0xfffe, 0x080c, 0x31fd, 0x04a9,
+	0x0128, 0x70dc, 0xc0bd, 0x70de, 0x080c, 0xcf67, 0x001e, 0x00ce,
+	0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, 0x184c, 0x2004,
+	0x9084, 0x00ff, 0xb842, 0x080c, 0xae95, 0x01d0, 0x2b00, 0x6012,
+	0x080c, 0xcf90, 0x6023, 0x0001, 0x9006, 0x080c, 0x653c, 0x2001,
+	0x0000, 0x080c, 0x6550, 0x0126, 0x2091, 0x8000, 0x70a8, 0x8000,
+	0x70aa, 0x012e, 0x2009, 0x0004, 0x080c, 0xaec2, 0x9085, 0x0001,
+	0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x0016, 0x0076, 0x00d6,
+	0x00c6, 0x2001, 0x184c, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c,
+	0xae95, 0x0548, 0x2b00, 0x6012, 0xb800, 0xc0c4, 0xb802, 0xb8a0,
+	0x9086, 0x007e, 0x0140, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006,
+	0x1110, 0x080c, 0x31bc, 0x080c, 0xcf90, 0x6023, 0x0001, 0x9006,
+	0x080c, 0x653c, 0x2001, 0x0002, 0x080c, 0x6550, 0x0126, 0x2091,
+	0x8000, 0x70a8, 0x8000, 0x70aa, 0x012e, 0x2009, 0x0002, 0x080c,
+	0xaec2, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005,
+	0x00b6, 0x00c6, 0x0026, 0x2009, 0x0080, 0x080c, 0x659f, 0x1140,
+	0xb813, 0x00ff, 0xb817, 0xfffc, 0x0039, 0x0110, 0x70e3, 0xffff,
+	0x002e, 0x00ce, 0x00be, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6,
+	0x080c, 0xadf1, 0x01d0, 0x2b00, 0x6012, 0x080c, 0xcf90, 0x6023,
+	0x0001, 0x9006, 0x080c, 0x653c, 0x2001, 0x0002, 0x080c, 0x6550,
+	0x0126, 0x2091, 0x8000, 0x70e4, 0x8000, 0x70e6, 0x012e, 0x2009,
+	0x0002, 0x080c, 0xaec2, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e,
+	0x001e, 0x0005, 0x00c6, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2009,
+	0x007f, 0x080c, 0x659f, 0x11b8, 0xb813, 0x00ff, 0xb817, 0xfffd,
+	0xb8cf, 0x0004, 0x080c, 0xadf1, 0x0170, 0x2b00, 0x6012, 0x6316,
+	0x6023, 0x0001, 0x620a, 0x080c, 0xcf90, 0x2009, 0x0022, 0x080c,
+	0xaec2, 0x9085, 0x0001, 0x012e, 0x00de, 0x00ce, 0x0005, 0x00e6,
+	0x00c6, 0x0066, 0x0036, 0x0026, 0x00b6, 0x21f0, 0x080c, 0x926d,
+	0x080c, 0x91f2, 0x080c, 0xac8a, 0x080c, 0xbd5d, 0x3e08, 0x2130,
+	0x81ff, 0x0120, 0x20a9, 0x007e, 0x900e, 0x0018, 0x20a9, 0x007f,
+	0x900e, 0x0016, 0x080c, 0x6600, 0x1140, 0x9686, 0x0002, 0x1118,
+	0xb800, 0xd0bc, 0x1110, 0x080c, 0x6035, 0x001e, 0x8108, 0x1f04,
+	0x31a1, 0x9686, 0x0001, 0x190c, 0x32e1, 0x00be, 0x002e, 0x003e,
+	0x006e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0026,
+	0x0016, 0x00b6, 0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029,
+	0x080c, 0x9262, 0x0076, 0x2039, 0x0000, 0x080c, 0x913f, 0x2c08,
+	0x080c, 0xe2ca, 0x007e, 0x001e, 0xba10, 0xbb14, 0x080c, 0x6035,
+	0xba12, 0xbb16, 0x00be, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee,
+	0x0005, 0x00e6, 0x0006, 0x00b6, 0x6010, 0x2058, 0xb8a0, 0x00be,
+	0x9086, 0x0080, 0x0150, 0x2071, 0x1800, 0x70a8, 0x9005, 0x0110,
+	0x8001, 0x70aa, 0x000e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x70e4,
+	0x9005, 0x0dc0, 0x8001, 0x70e6, 0x0ca8, 0xb800, 0xc08c, 0xb802,
+	0x0005, 0x00f6, 0x00e6, 0x00c6, 0x00b6, 0x0036, 0x0026, 0x0016,
+	0x0156, 0x2178, 0x81ff, 0x1118, 0x20a9, 0x0001, 0x0088, 0x080c,
+	0x56d0, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006, 0x0046, 0x2020,
+	0x2009, 0x002d, 0x080c, 0xe58d, 0x004e, 0x20a9, 0x0800, 0x9016,
+	0x0026, 0x928e, 0x007e, 0x0904, 0x3269, 0x928e, 0x007f, 0x0904,
+	0x3269, 0x928e, 0x0080, 0x05e8, 0x9288, 0x1000, 0x210c, 0x81ff,
+	0x05c0, 0x8fff, 0x1148, 0x2001, 0x198e, 0x0006, 0x2003, 0x0001,
+	0x04e9, 0x000e, 0x2003, 0x0000, 0x00b6, 0x00c6, 0x2158, 0x2001,
+	0x0001, 0x080c, 0x6934, 0x00ce, 0x00be, 0x2019, 0x0029, 0x080c,
+	0x9262, 0x0076, 0x2039, 0x0000, 0x080c, 0x913f, 0x00b6, 0x00c6,
+	0x0026, 0x2158, 0xba04, 0x9294, 0x00ff, 0x9286, 0x0006, 0x1118,
+	0xb807, 0x0404, 0x0028, 0x2001, 0x0004, 0x8007, 0x9215, 0xba06,
+	0x002e, 0x00ce, 0x00be, 0x0016, 0x2c08, 0x080c, 0xe2ca, 0x001e,
+	0x007e, 0x002e, 0x8210, 0x1f04, 0x3220, 0x015e, 0x001e, 0x002e,
+	0x003e, 0x00be, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0046, 0x0026,
+	0x0016, 0x080c, 0x56d0, 0xd0c4, 0x0140, 0xd0a4, 0x0130, 0x9006,
+	0x2220, 0x2009, 0x0029, 0x080c, 0xe58d, 0x001e, 0x002e, 0x004e,
+	0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x7294, 0x82ff, 0x01e8,
+	0x080c, 0x6962, 0x11d0, 0x2100, 0x080c, 0x2871, 0x81ff, 0x01b8,
+	0x2019, 0x0001, 0x8314, 0x92e0, 0x1c80, 0x2c04, 0xd384, 0x0120,
+	0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, 0x9116, 0x0138,
+	0x9096, 0x00ff, 0x0110, 0x8318, 0x0c68, 0x9085, 0x0001, 0x00ce,
+	0x003e, 0x002e, 0x001e, 0x0005, 0x0016, 0x00c6, 0x0126, 0x2091,
+	0x8000, 0x0036, 0x2019, 0x0029, 0x00a9, 0x003e, 0x9180, 0x1000,
+	0x2004, 0x9065, 0x0158, 0x0016, 0x00c6, 0x2061, 0x1ab0, 0x001e,
+	0x6112, 0x080c, 0x31bc, 0x001e, 0x080c, 0x65c4, 0x012e, 0x00ce,
+	0x001e, 0x0005, 0x0016, 0x0026, 0x2110, 0x080c, 0xa7ee, 0x080c,
+	0xe8f6, 0x002e, 0x001e, 0x0005, 0x2001, 0x1837, 0x2004, 0xd0cc,
+	0x0005, 0x00c6, 0x00b6, 0x080c, 0x73b0, 0x1118, 0x20a9, 0x0800,
+	0x0010, 0x20a9, 0x0782, 0x080c, 0x73b0, 0x1110, 0x900e, 0x0010,
+	0x2009, 0x007e, 0x9180, 0x1000, 0x2004, 0x905d, 0x0130, 0x86ff,
+	0x0110, 0xb800, 0xd0bc, 0x090c, 0x65c4, 0x8108, 0x1f04, 0x32f2,
+	0x2061, 0x1800, 0x607f, 0x0000, 0x6080, 0x9084, 0x00ff, 0x6082,
+	0x60b3, 0x0000, 0x00be, 0x00ce, 0x0005, 0x2001, 0x1869, 0x2004,
+	0xd0bc, 0x0005, 0x2011, 0x1848, 0x2214, 0xd2ec, 0x0005, 0x0026,
+	0x2011, 0x1867, 0x2214, 0xd2dc, 0x002e, 0x0005, 0x7eef, 0x7de8,
+	0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da, 0x7ad9, 0x80d6,
+	0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce, 0x78cd, 0x80cc,
+	0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5, 0x76c3, 0x80bc,
+	0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3, 0x80b2, 0x80b1,
+	0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9, 0x80a7, 0x6da6,
+	0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b, 0x8098, 0x6797,
+	0x6690, 0x658f, 0x6488, 0x6384, 0x6282, 0x8081, 0x8080, 0x617c,
+	0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, 0x8073, 0x8072, 0x8071,
+	0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69, 0x8067, 0x5a66,
+	0x5965, 0x5863, 0x575c, 0x565a, 0x5559, 0x8056, 0x8055, 0x5454,
+	0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c, 0x804b, 0x4e4a,
+	0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, 0x803c, 0x803a, 0x8039,
+	0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831, 0x802e, 0x472d,
+	0x462c, 0x452b, 0x442a, 0x4329, 0x4227, 0x8026, 0x8025, 0x4123,
+	0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017, 0x8010, 0x3b0f,
+	0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, 0x8000, 0x3800, 0x3700,
+	0x3600, 0x8000, 0x3500, 0x8000, 0x8000, 0x8000, 0x3400, 0x8000,
+	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3300, 0x3200, 0x8000,
+	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3100, 0x3000, 0x8000,
+	0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00, 0x8000, 0x8000,
+	0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800, 0x8000, 0x2700,
+	0x2600, 0x2500, 0x2400, 0x2300, 0x2200, 0x8000, 0x8000, 0x2100,
+	0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000, 0x8000, 0x1b00,
+	0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+	0x8000, 0x1800, 0x8000, 0x1700, 0x1600, 0x1500, 0x8000, 0x1400,
+	0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, 0x8000, 0x8000, 0x0e00,
+	0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000, 0x8000, 0x0800,
+	0x0700, 0x8000, 0x0600, 0x8000, 0x8000, 0x8000, 0x0500, 0x0400,
+	0x0300, 0x8000, 0x0200, 0x8000, 0x8000, 0x8000, 0x0100, 0x8000,
+	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x8000, 0x8000,
 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
-	0x2071, 0x189e, 0x7003, 0x0002, 0x9006, 0x7016, 0x701a, 0x704a,
-	0x704e, 0x700e, 0x7042, 0x7046, 0x703b, 0x18ba, 0x703f, 0x18ba,
-	0x7007, 0x0001, 0x080c, 0x1019, 0x090c, 0x0dd5, 0x2900, 0x706a,
-	0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x080c, 0x1019, 0x090c, 0x0dd5,
-	0x2900, 0x706e, 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x0005, 0x2071,
-	0x189e, 0x7004, 0x0002, 0x32ff, 0x3300, 0x3313, 0x3327, 0x0005,
-	0x1004, 0x3310, 0x0e04, 0x3310, 0x2079, 0x0000, 0x0126, 0x2091,
-	0x8000, 0x700c, 0x9005, 0x1128, 0x700f, 0x0001, 0x012e, 0x0468,
-	0x0005, 0x012e, 0x0ce8, 0x2079, 0x0000, 0x2061, 0x18b8, 0x2c4c,
-	0xa86c, 0x908e, 0x0100, 0x0128, 0x9086, 0x0200, 0x0904, 0x33fb,
-	0x0005, 0x7018, 0x2048, 0x2061, 0x1800, 0x701c, 0x0807, 0x7014,
-	0x2048, 0xa864, 0x9094, 0x00ff, 0x9296, 0x0029, 0x1120, 0xaa78,
-	0xd2fc, 0x0128, 0x0005, 0x9086, 0x0103, 0x0108, 0x0005, 0x2079,
-	0x0000, 0x2061, 0x1800, 0x701c, 0x0807, 0x2061, 0x1800, 0x7880,
-	0x908a, 0x0040, 0x1210, 0x61d0, 0x0042, 0x2100, 0x908a, 0x003f,
-	0x1a04, 0x33f8, 0x61d0, 0x0804, 0x338d, 0x33cf, 0x3407, 0x3411,
-	0x3415, 0x341f, 0x3425, 0x3429, 0x3439, 0x343c, 0x3446, 0x344b,
-	0x3450, 0x345b, 0x3466, 0x3475, 0x3484, 0x3492, 0x34a9, 0x34c4,
-	0x33f8, 0x356d, 0x35ab, 0x3651, 0x3662, 0x3685, 0x33f8, 0x33f8,
-	0x33f8, 0x36bd, 0x36d9, 0x36e2, 0x3711, 0x3717, 0x33f8, 0x375d,
-	0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x3768, 0x3771, 0x3779,
-	0x377b, 0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x37a7,
-	0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x37c4, 0x3825, 0x33f8,
-	0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x0002, 0x384f, 0x3852,
-	0x38b1, 0x38ca, 0x38fa, 0x3b98, 0x33f8, 0x5090, 0x33f8, 0x33f8,
-	0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x33f8, 0x3446, 0x344b,
-	0x40b9, 0x54db, 0x40d7, 0x511f, 0x5170, 0x5273, 0x33f8, 0x52d5,
-	0x5311, 0x5342, 0x5446, 0x536f, 0x53c6, 0x33f8, 0x40db, 0x42a4,
-	0x42ba, 0x42df, 0x4344, 0x43b8, 0x43d8, 0x444f, 0x4460, 0x4478,
-	0x447b, 0x44a0, 0x4510, 0x4576, 0x457e, 0x46b0, 0x4825, 0x4859,
-	0x4abd, 0x33f8, 0x4adb, 0x4b87, 0x4c69, 0x4cc3, 0x33f8, 0x4d78,
-	0x33f8, 0x4dde, 0x4df9, 0x457e, 0x503f, 0x714c, 0x0000, 0x2021,
-	0x4000, 0x080c, 0x48d7, 0x0126, 0x2091, 0x8000, 0x0e04, 0x33d9,
-	0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833,
-	0x0011, 0x0010, 0x7833, 0x0010, 0x7c82, 0x7986, 0x7a8a, 0x7b8e,
-	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1192,
-	0x7007, 0x0001, 0x2091, 0x5000, 0x700f, 0x0000, 0x012e, 0x0005,
-	0x2021, 0x4001, 0x08b0, 0x2021, 0x4002, 0x0898, 0x2021, 0x4003,
-	0x0880, 0x2021, 0x4005, 0x0868, 0x2021, 0x4006, 0x0850, 0x2039,
-	0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804,
-	0x48e4, 0x7883, 0x0004, 0x7884, 0x0807, 0x2039, 0x0001, 0x902e,
-	0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804, 0x48e7, 0x7984,
-	0x7888, 0x2114, 0x200a, 0x0804, 0x33cf, 0x7984, 0x2114, 0x0804,
-	0x33cf, 0x20e1, 0x0000, 0x2099, 0x0021, 0x20e9, 0x0000, 0x20a1,
-	0x0021, 0x20a9, 0x001f, 0x4003, 0x7984, 0x7a88, 0x7b8c, 0x0804,
-	0x33cf, 0x7884, 0x2060, 0x04d8, 0x2009, 0x0003, 0x2011, 0x0002,
-	0x2019, 0x0015, 0x789b, 0x0137, 0x0804, 0x33cf, 0x2039, 0x0001,
-	0x7d98, 0x7c9c, 0x0800, 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0848,
-	0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3404, 0x2138, 0x7d98,
-	0x7c9c, 0x0804, 0x340b, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804,
-	0x3404, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x3419, 0x79a0, 0x9182,
-	0x0040, 0x0210, 0x0804, 0x3404, 0x21e8, 0x7984, 0x7888, 0x20a9,
-	0x0001, 0x21a0, 0x4004, 0x0804, 0x33cf, 0x2061, 0x0800, 0xe10c,
-	0x9006, 0x2c15, 0x9200, 0x8c60, 0x8109, 0x1dd8, 0x2010, 0x9005,
-	0x0904, 0x33cf, 0x0804, 0x33fe, 0x79a0, 0x9182, 0x0040, 0x0210,
-	0x0804, 0x3404, 0x21e0, 0x20a9, 0x0001, 0x7984, 0x2198, 0x4012,
-	0x0804, 0x33cf, 0x2069, 0x1847, 0x7884, 0x7990, 0x911a, 0x1a04,
-	0x3404, 0x8019, 0x0904, 0x3404, 0x684a, 0x6942, 0x788c, 0x6852,
-	0x7888, 0x6856, 0x9006, 0x685a, 0x685e, 0x080c, 0x7496, 0x0804,
-	0x33cf, 0x2069, 0x1847, 0x7884, 0x7994, 0x911a, 0x1a04, 0x3404,
-	0x8019, 0x0904, 0x3404, 0x684e, 0x6946, 0x788c, 0x6862, 0x7888,
-	0x6866, 0x9006, 0x686a, 0x686e, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x67a1, 0x012e, 0x0804, 0x33cf, 0x902e, 0x2520, 0x81ff, 0x0120,
-	0x2009, 0x0001, 0x0804, 0x3401, 0x7984, 0x7b88, 0x7a8c, 0x20a9,
-	0x0005, 0x20e9, 0x0001, 0x20a1, 0x18a6, 0x4101, 0x080c, 0x489b,
-	0x1120, 0x2009, 0x0002, 0x0804, 0x3401, 0x2009, 0x0020, 0xa85c,
-	0x9080, 0x0019, 0xaf60, 0x080c, 0x48e4, 0x701f, 0x34e8, 0x0005,
-	0xa864, 0x2008, 0x9084, 0x00ff, 0x9096, 0x0011, 0x0168, 0x9096,
-	0x0019, 0x0150, 0x9096, 0x0015, 0x0138, 0x9096, 0x0048, 0x0120,
-	0x9096, 0x0029, 0x1904, 0x3401, 0x810f, 0x918c, 0x00ff, 0x0904,
-	0x3401, 0x7112, 0x7010, 0x8001, 0x0560, 0x7012, 0x080c, 0x489b,
-	0x1120, 0x2009, 0x0002, 0x0804, 0x3401, 0x2009, 0x0020, 0x7068,
-	0x2040, 0xa28c, 0xa390, 0xa494, 0xa598, 0x9290, 0x0040, 0x9399,
-	0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, 0xa85c, 0x9080, 0x0019,
-	0xaf60, 0x080c, 0x48e4, 0x701f, 0x3526, 0x0005, 0xa864, 0x9084,
-	0x00ff, 0x9096, 0x0002, 0x0120, 0x9096, 0x000a, 0x1904, 0x3401,
-	0x0888, 0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a, 0xa864, 0x9084,
-	0x00ff, 0x9096, 0x0029, 0x1160, 0xc2fd, 0xaa7a, 0x080c, 0x5f69,
-	0x0150, 0x0126, 0x2091, 0x8000, 0xa87a, 0xa982, 0x012e, 0x0050,
-	0x080c, 0x6282, 0x1128, 0x7007, 0x0003, 0x701f, 0x3552, 0x0005,
-	0x080c, 0x6c85, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x20e1,
-	0x0001, 0x2099, 0x18a6, 0x400a, 0x2100, 0x9210, 0x9399, 0x0000,
-	0x94a1, 0x0000, 0x95a9, 0x0000, 0xa85c, 0x9080, 0x0019, 0x2009,
-	0x0020, 0x012e, 0xaf60, 0x0804, 0x48e7, 0x2091, 0x8000, 0x7837,
-	0x4000, 0x7833, 0x0010, 0x7883, 0x4000, 0x7887, 0x4953, 0x788b,
-	0x5020, 0x788f, 0x2020, 0x2009, 0x017f, 0x2104, 0x7892, 0x3f00,
-	0x7896, 0x2061, 0x0100, 0x6200, 0x2061, 0x0200, 0x603c, 0x8007,
-	0x9205, 0x789a, 0x2009, 0x04fd, 0x2104, 0x789e, 0x2091, 0x5000,
-	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x0180, 0x2001,
-	0x1a17, 0x2004, 0x9005, 0x0128, 0x2001, 0x008b, 0x2004, 0xd0fc,
-	0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, 0x2003, 0x1001, 0x2071,
-	0x0080, 0x0804, 0x0427, 0x81ff, 0x1904, 0x3401, 0x7984, 0x080c,
-	0x63cd, 0x1904, 0x3404, 0x7e98, 0x9684, 0x3fff, 0x9082, 0x4000,
-	0x1a04, 0x3404, 0x7c88, 0x7d8c, 0x080c, 0x6530, 0x080c, 0x64ff,
-	0x0000, 0x1518, 0x2061, 0x1cd0, 0x0126, 0x2091, 0x8000, 0x6000,
-	0x9086, 0x0000, 0x0148, 0x6014, 0x904d, 0x0130, 0xa86c, 0x9406,
-	0x1118, 0xa870, 0x9506, 0x0150, 0x012e, 0x9ce0, 0x0018, 0x2001,
-	0x181a, 0x2004, 0x9c02, 0x1a04, 0x3401, 0x0c30, 0x080c, 0xc472,
-	0x012e, 0x0904, 0x3401, 0x0804, 0x33cf, 0x900e, 0x2001, 0x0005,
-	0x080c, 0x6c85, 0x0126, 0x2091, 0x8000, 0x080c, 0xcb13, 0x080c,
-	0x6a46, 0x012e, 0x0804, 0x33cf, 0x00a6, 0x2950, 0xb198, 0x080c,
-	0x63cd, 0x1904, 0x363e, 0xb6a4, 0x9684, 0x3fff, 0x9082, 0x4000,
-	0x16e8, 0xb49c, 0xb5a0, 0x080c, 0x6530, 0x080c, 0x64ff, 0x1520,
+	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x2071, 0x189e,
+	0x7003, 0x0002, 0x9006, 0x7016, 0x701a, 0x704a, 0x704e, 0x700e,
+	0x7042, 0x7046, 0x703b, 0x18ba, 0x703f, 0x18ba, 0x7007, 0x0001,
+	0x080c, 0x1018, 0x090c, 0x0dd5, 0x2900, 0x706a, 0xa867, 0x0002,
+	0xa8ab, 0xdcb0, 0x080c, 0x1018, 0x090c, 0x0dd5, 0x2900, 0x706e,
+	0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x189e, 0x7004,
+	0x0002, 0x344d, 0x344e, 0x3461, 0x3475, 0x0005, 0x1004, 0x345e,
+	0x0e04, 0x345e, 0x2079, 0x0000, 0x0126, 0x2091, 0x8000, 0x700c,
+	0x9005, 0x1128, 0x700f, 0x0001, 0x012e, 0x0468, 0x0005, 0x012e,
+	0x0ce8, 0x2079, 0x0000, 0x2061, 0x18b8, 0x2c4c, 0xa86c, 0x908e,
+	0x0100, 0x0128, 0x9086, 0x0200, 0x0904, 0x3549, 0x0005, 0x7018,
+	0x2048, 0x2061, 0x1800, 0x701c, 0x0807, 0x7014, 0x2048, 0xa864,
+	0x9094, 0x00ff, 0x9296, 0x0029, 0x1120, 0xaa78, 0xd2fc, 0x0128,
+	0x0005, 0x9086, 0x0103, 0x0108, 0x0005, 0x2079, 0x0000, 0x2061,
+	0x1800, 0x701c, 0x0807, 0x2061, 0x1800, 0x7880, 0x908a, 0x0040,
+	0x1210, 0x61d0, 0x0042, 0x2100, 0x908a, 0x003f, 0x1a04, 0x3546,
+	0x61d0, 0x0804, 0x34db, 0x351d, 0x3555, 0x355f, 0x3563, 0x356d,
+	0x3573, 0x3577, 0x3587, 0x358a, 0x3594, 0x3599, 0x359e, 0x35a9,
+	0x35b4, 0x35c3, 0x35d2, 0x35e0, 0x35f7, 0x3612, 0x3546, 0x36bb,
+	0x36f9, 0x379f, 0x37b0, 0x37d3, 0x3546, 0x3546, 0x3546, 0x380b,
+	0x3827, 0x3830, 0x385f, 0x3865, 0x3546, 0x38ab, 0x3546, 0x3546,
+	0x3546, 0x3546, 0x3546, 0x38b6, 0x38bf, 0x38c7, 0x38c9, 0x3546,
+	0x3546, 0x3546, 0x3546, 0x3546, 0x3546, 0x38f5, 0x3546, 0x3546,
+	0x3546, 0x3546, 0x3546, 0x3912, 0x3973, 0x3546, 0x3546, 0x3546,
+	0x3546, 0x3546, 0x3546, 0x0002, 0x399d, 0x39a0, 0x39ff, 0x3a18,
+	0x3a48, 0x3ce6, 0x3546, 0x52a9, 0x3546, 0x3546, 0x3546, 0x3546,
+	0x3546, 0x3546, 0x3546, 0x3546, 0x3594, 0x3599, 0x4207, 0x56f4,
+	0x4225, 0x5338, 0x5389, 0x548c, 0x3546, 0x54ee, 0x552a, 0x555b,
+	0x565f, 0x5588, 0x55df, 0x3546, 0x4229, 0x43f2, 0x4408, 0x442d,
+	0x4492, 0x4506, 0x4526, 0x459d, 0x45f9, 0x4655, 0x4658, 0x467d,
+	0x471a, 0x4780, 0x4788, 0x48ba, 0x4a2f, 0x4a63, 0x4cc7, 0x3546,
+	0x4ce5, 0x4d91, 0x4e73, 0x4ecd, 0x3546, 0x4f82, 0x3546, 0x4fe8,
+	0x5003, 0x4788, 0x5249, 0x714c, 0x0000, 0x2021, 0x4000, 0x080c,
+	0x4ae1, 0x0126, 0x2091, 0x8000, 0x0e04, 0x3527, 0x0010, 0x012e,
+	0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010,
+	0x7833, 0x0010, 0x7c82, 0x7986, 0x7a8a, 0x7b8e, 0x2091, 0x4080,
+	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x119b, 0x7007, 0x0001,
+	0x2091, 0x5000, 0x700f, 0x0000, 0x012e, 0x0005, 0x2021, 0x4001,
+	0x08b0, 0x2021, 0x4002, 0x0898, 0x2021, 0x4003, 0x0880, 0x2021,
+	0x4005, 0x0868, 0x2021, 0x4006, 0x0850, 0x2039, 0x0001, 0x902e,
+	0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804, 0x4aee, 0x7883,
+	0x0004, 0x7884, 0x0807, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88,
+	0x7a8c, 0x7884, 0x7990, 0x0804, 0x4af1, 0x7984, 0x7888, 0x2114,
+	0x200a, 0x0804, 0x351d, 0x7984, 0x2114, 0x0804, 0x351d, 0x20e1,
+	0x0000, 0x2099, 0x0021, 0x20e9, 0x0000, 0x20a1, 0x0021, 0x20a9,
+	0x001f, 0x4003, 0x7984, 0x7a88, 0x7b8c, 0x0804, 0x351d, 0x7884,
+	0x2060, 0x04d8, 0x2009, 0x0003, 0x2011, 0x0002, 0x2019, 0x001a,
+	0x789b, 0x0137, 0x0804, 0x351d, 0x2039, 0x0001, 0x7d98, 0x7c9c,
+	0x0800, 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0848, 0x79a0, 0x9182,
+	0x0040, 0x0210, 0x0804, 0x3552, 0x2138, 0x7d98, 0x7c9c, 0x0804,
+	0x3559, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3552, 0x2138,
+	0x7d98, 0x7c9c, 0x0804, 0x3567, 0x79a0, 0x9182, 0x0040, 0x0210,
+	0x0804, 0x3552, 0x21e8, 0x7984, 0x7888, 0x20a9, 0x0001, 0x21a0,
+	0x4004, 0x0804, 0x351d, 0x2061, 0x0800, 0xe10c, 0x9006, 0x2c15,
+	0x9200, 0x8c60, 0x8109, 0x1dd8, 0x2010, 0x9005, 0x0904, 0x351d,
+	0x0804, 0x354c, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3552,
+	0x21e0, 0x20a9, 0x0001, 0x7984, 0x2198, 0x4012, 0x0804, 0x351d,
+	0x2069, 0x1847, 0x7884, 0x7990, 0x911a, 0x1a04, 0x3552, 0x8019,
+	0x0904, 0x3552, 0x684a, 0x6942, 0x788c, 0x6852, 0x7888, 0x6856,
+	0x9006, 0x685a, 0x685e, 0x080c, 0x76c9, 0x0804, 0x351d, 0x2069,
+	0x1847, 0x7884, 0x7994, 0x911a, 0x1a04, 0x3552, 0x8019, 0x0904,
+	0x3552, 0x684e, 0x6946, 0x788c, 0x6862, 0x7888, 0x6866, 0x9006,
+	0x686a, 0x686e, 0x0126, 0x2091, 0x8000, 0x080c, 0x69d4, 0x012e,
+	0x0804, 0x351d, 0x902e, 0x2520, 0x81ff, 0x0120, 0x2009, 0x0001,
+	0x0804, 0x354f, 0x7984, 0x7b88, 0x7a8c, 0x20a9, 0x0005, 0x20e9,
+	0x0001, 0x20a1, 0x18a6, 0x4101, 0x080c, 0x4aa5, 0x1120, 0x2009,
+	0x0002, 0x0804, 0x354f, 0x2009, 0x0020, 0xa85c, 0x9080, 0x0019,
+	0xaf60, 0x080c, 0x4aee, 0x701f, 0x3636, 0x0005, 0xa864, 0x2008,
+	0x9084, 0x00ff, 0x9096, 0x0011, 0x0168, 0x9096, 0x0019, 0x0150,
+	0x9096, 0x0015, 0x0138, 0x9096, 0x0048, 0x0120, 0x9096, 0x0029,
+	0x1904, 0x354f, 0x810f, 0x918c, 0x00ff, 0x0904, 0x354f, 0x7112,
+	0x7010, 0x8001, 0x0560, 0x7012, 0x080c, 0x4aa5, 0x1120, 0x2009,
+	0x0002, 0x0804, 0x354f, 0x2009, 0x0020, 0x7068, 0x2040, 0xa28c,
+	0xa390, 0xa494, 0xa598, 0x9290, 0x0040, 0x9399, 0x0000, 0x94a1,
+	0x0000, 0x95a9, 0x0000, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c,
+	0x4aee, 0x701f, 0x3674, 0x0005, 0xa864, 0x9084, 0x00ff, 0x9096,
+	0x0002, 0x0120, 0x9096, 0x000a, 0x1904, 0x354f, 0x0888, 0x7014,
+	0x2048, 0xa868, 0xc0fd, 0xa86a, 0xa864, 0x9084, 0x00ff, 0x9096,
+	0x0029, 0x1160, 0xc2fd, 0xaa7a, 0x080c, 0x618c, 0x0150, 0x0126,
+	0x2091, 0x8000, 0xa87a, 0xa982, 0x012e, 0x0050, 0x080c, 0x64b5,
+	0x1128, 0x7007, 0x0003, 0x701f, 0x36a0, 0x0005, 0x080c, 0x6eb8,
+	0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x20e1, 0x0001, 0x2099,
+	0x18a6, 0x400a, 0x2100, 0x9210, 0x9399, 0x0000, 0x94a1, 0x0000,
+	0x95a9, 0x0000, 0xa85c, 0x9080, 0x0019, 0x2009, 0x0020, 0x012e,
+	0xaf60, 0x0804, 0x4af1, 0x2091, 0x8000, 0x7837, 0x4000, 0x7833,
+	0x0010, 0x7883, 0x4000, 0x7887, 0x4953, 0x788b, 0x5020, 0x788f,
+	0x2020, 0x2009, 0x017f, 0x2104, 0x7892, 0x3f00, 0x7896, 0x2061,
+	0x0100, 0x6200, 0x2061, 0x0200, 0x603c, 0x8007, 0x9205, 0x789a,
+	0x2009, 0x04fd, 0x2104, 0x789e, 0x2091, 0x5000, 0x2091, 0x4080,
+	0x2001, 0x0089, 0x2004, 0xd084, 0x0180, 0x2001, 0x1a19, 0x2004,
+	0x9005, 0x0128, 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001,
+	0x008a, 0x2003, 0x0002, 0x2003, 0x1001, 0x2071, 0x0080, 0x0804,
+	0x0427, 0x81ff, 0x1904, 0x354f, 0x7984, 0x080c, 0x6600, 0x1904,
+	0x3552, 0x7e98, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x3552,
+	0x7c88, 0x7d8c, 0x080c, 0x6763, 0x080c, 0x6732, 0x0000, 0x1518,
 	0x2061, 0x1cd0, 0x0126, 0x2091, 0x8000, 0x6000, 0x9086, 0x0000,
 	0x0148, 0x6014, 0x904d, 0x0130, 0xa86c, 0x9406, 0x1118, 0xa870,
-	0x9506, 0x0158, 0x012e, 0x9ce0, 0x0018, 0x2001, 0x181a, 0x2004,
-	0x9c02, 0x2009, 0x000d, 0x12b0, 0x0c28, 0x080c, 0xc472, 0x012e,
-	0x2009, 0x0003, 0x0178, 0x00e0, 0x900e, 0x2001, 0x0005, 0x080c,
-	0x6c85, 0x0126, 0x2091, 0x8000, 0x080c, 0xcb13, 0x080c, 0x6a3a,
-	0x012e, 0x0070, 0xb097, 0x4005, 0xb19a, 0x0010, 0xb097, 0x4006,
-	0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x2a48, 0x00ae, 0x0005,
-	0xb097, 0x4000, 0x9006, 0x918d, 0x0001, 0x2008, 0x2a48, 0x00ae,
-	0x0005, 0x81ff, 0x1904, 0x3401, 0x080c, 0x48b2, 0x0904, 0x3404,
-	0x080c, 0x6494, 0x0904, 0x3401, 0x080c, 0x6536, 0x0904, 0x3401,
-	0x0804, 0x43cf, 0x81ff, 0x1904, 0x3401, 0x080c, 0x48ce, 0x0904,
-	0x3404, 0x080c, 0x65c4, 0x0904, 0x3401, 0x2019, 0x0005, 0x79a8,
-	0x080c, 0x6551, 0x0904, 0x3401, 0x7888, 0x908a, 0x1000, 0x1a04,
-	0x3404, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x8293, 0x7984,
-	0xd184, 0x1904, 0x33cf, 0x0804, 0x43cf, 0x0126, 0x2091, 0x8000,
-	0x81ff, 0x0118, 0x2009, 0x0001, 0x0450, 0x2029, 0x07ff, 0x645c,
-	0x2400, 0x9506, 0x01f8, 0x2508, 0x080c, 0x63cd, 0x11d8, 0x080c,
-	0x65c4, 0x1128, 0x2009, 0x0002, 0x62c0, 0x2518, 0x00c0, 0x2019,
-	0x0004, 0x900e, 0x080c, 0x6551, 0x1118, 0x2009, 0x0006, 0x0078,
-	0x7884, 0x908a, 0x1000, 0x1270, 0x8003, 0x800b, 0x810b, 0x9108,
-	0x080c, 0x8293, 0x8529, 0x1ae0, 0x012e, 0x0804, 0x33cf, 0x012e,
-	0x0804, 0x3401, 0x012e, 0x0804, 0x3404, 0x080c, 0x48b2, 0x0904,
-	0x3404, 0x080c, 0x6494, 0x0904, 0x3401, 0xbaa0, 0x2019, 0x0005,
-	0x00c6, 0x9066, 0x080c, 0x901a, 0x0076, 0x903e, 0x080c, 0x8ef7,
-	0x900e, 0x080c, 0xdfbd, 0x007e, 0x00ce, 0x080c, 0x6530, 0x0804,
-	0x33cf, 0x080c, 0x48b2, 0x0904, 0x3404, 0x080c, 0x6530, 0x2208,
-	0x0804, 0x33cf, 0x0156, 0x00d6, 0x00e6, 0x2069, 0x1910, 0x6810,
-	0x6914, 0x910a, 0x1208, 0x900e, 0x6816, 0x9016, 0x901e, 0x20a9,
-	0x007e, 0x2069, 0x1000, 0x2d04, 0x905d, 0x0118, 0xb84c, 0x0059,
-	0x9210, 0x8d68, 0x1f04, 0x36f3, 0x2300, 0x9218, 0x00ee, 0x00de,
-	0x015e, 0x0804, 0x33cf, 0x00f6, 0x0016, 0x907d, 0x0138, 0x9006,
-	0x8000, 0x2f0c, 0x81ff, 0x0110, 0x2178, 0x0cd0, 0x001e, 0x00fe,
-	0x0005, 0x2069, 0x1910, 0x6910, 0x62bc, 0x0804, 0x33cf, 0x81ff,
-	0x0120, 0x2009, 0x0001, 0x0804, 0x3401, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x54cb, 0x0128, 0x2009, 0x0007, 0x012e, 0x0804, 0x3401,
-	0x012e, 0x615c, 0x9190, 0x31d0, 0x2215, 0x9294, 0x00ff, 0x637c,
-	0x83ff, 0x0108, 0x6280, 0x67dc, 0x97c4, 0x000a, 0x98c6, 0x000a,
-	0x1118, 0x2031, 0x0001, 0x00e8, 0x97c4, 0x0022, 0x98c6, 0x0022,
-	0x1118, 0x2031, 0x0003, 0x00a8, 0x97c4, 0x0012, 0x98c6, 0x0012,
-	0x1118, 0x2031, 0x0002, 0x0068, 0x080c, 0x717d, 0x1118, 0x2031,
-	0x0004, 0x0038, 0xd79c, 0x0120, 0x2009, 0x0005, 0x0804, 0x3401,
-	0x9036, 0x7e9a, 0x7f9e, 0x0804, 0x33cf, 0x614c, 0x6250, 0x2019,
-	0x1984, 0x231c, 0x2001, 0x1985, 0x2004, 0x789a, 0x0804, 0x33cf,
-	0x0126, 0x2091, 0x8000, 0x6138, 0x623c, 0x6340, 0x012e, 0x0804,
-	0x33cf, 0x080c, 0x48ce, 0x0904, 0x3404, 0xba44, 0xbb38, 0x0804,
-	0x33cf, 0x080c, 0x0dd5, 0x080c, 0x48ce, 0x2110, 0x0904, 0x3404,
-	0xb804, 0x908c, 0x00ff, 0x918e, 0x0006, 0x0140, 0x9084, 0xff00,
-	0x9086, 0x0600, 0x2009, 0x0009, 0x1904, 0x3401, 0x0126, 0x2091,
-	0x8000, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c, 0xa512, 0x080c,
-	0x901a, 0x0076, 0x903e, 0x080c, 0x8ef7, 0x900e, 0x080c, 0xdfbd,
-	0x007e, 0x00ce, 0xb807, 0x0407, 0x012e, 0x0804, 0x33cf, 0x614c,
-	0x6250, 0x7884, 0x604e, 0x7b88, 0x6352, 0x2069, 0x1847, 0x831f,
-	0x9305, 0x6816, 0x788c, 0x2069, 0x1984, 0x2d1c, 0x206a, 0x7e98,
-	0x9682, 0x0014, 0x1210, 0x2031, 0x07d0, 0x2069, 0x1985, 0x2d04,
-	0x266a, 0x789a, 0x0804, 0x33cf, 0x0126, 0x2091, 0x8000, 0x7884,
-	0x603a, 0xd0c4, 0x01a8, 0x00d6, 0x78a8, 0x2009, 0x199b, 0x200a,
-	0x78ac, 0x2011, 0x199c, 0x2012, 0x2069, 0x0100, 0x6838, 0x9086,
-	0x0007, 0x1118, 0x2214, 0x6a5a, 0x0010, 0x210c, 0x695a, 0x00de,
-	0x7884, 0xd0b4, 0x0120, 0x3b00, 0x9084, 0xff3f, 0x20d8, 0x7888,
-	0x603e, 0x2011, 0x0114, 0x220c, 0x7888, 0xd08c, 0x0118, 0x918d,
-	0x0080, 0x0010, 0x918c, 0xff7f, 0x2112, 0x788c, 0x6042, 0x9084,
-	0x0020, 0x0130, 0x78b4, 0x6046, 0x9084, 0x0001, 0x090c, 0x40b9,
-	0x6040, 0xd0cc, 0x0120, 0x78b0, 0x2011, 0x0114, 0x2012, 0x012e,
-	0x0804, 0x33cf, 0x00f6, 0x2079, 0x1800, 0x7a38, 0xa898, 0x9084,
-	0xfebf, 0x9215, 0xa89c, 0x9084, 0xfebf, 0x8002, 0x9214, 0x7838,
-	0x9084, 0x0140, 0x9215, 0x7a3a, 0xa897, 0x4000, 0x900e, 0x9085,
-	0x0001, 0x2001, 0x0000, 0x00fe, 0x0005, 0x7898, 0x9005, 0x01a8,
-	0x7888, 0x9025, 0x0904, 0x3404, 0x788c, 0x902d, 0x0904, 0x3404,
-	0x900e, 0x080c, 0x63cd, 0x1120, 0xba44, 0xbb38, 0xbc46, 0xbd3a,
-	0x9186, 0x07ff, 0x0190, 0x8108, 0x0ca0, 0x080c, 0x48ce, 0x0904,
-	0x3404, 0x7888, 0x900d, 0x0904, 0x3404, 0x788c, 0x9005, 0x0904,
-	0x3404, 0xba44, 0xb946, 0xbb38, 0xb83a, 0x0804, 0x33cf, 0x2011,
-	0xbc09, 0x0010, 0x2011, 0xbc05, 0x080c, 0x54cb, 0x1904, 0x3401,
-	0x00c6, 0x2061, 0x0100, 0x7984, 0x9186, 0x00ff, 0x1130, 0x2001,
-	0x1818, 0x2004, 0x9085, 0xff00, 0x0088, 0x9182, 0x007f, 0x16e0,
-	0x9188, 0x31d0, 0x210d, 0x918c, 0x00ff, 0x2001, 0x1818, 0x2004,
-	0x0026, 0x9116, 0x002e, 0x0580, 0x810f, 0x9105, 0x0126, 0x2091,
-	0x8000, 0x0006, 0x080c, 0xab15, 0x000e, 0x0510, 0x602e, 0x620a,
-	0x7984, 0x00b6, 0x080c, 0x6372, 0x2b08, 0x00be, 0x1500, 0x6112,
-	0x6023, 0x0001, 0x080c, 0x489b, 0x01d0, 0x9006, 0xa866, 0x7007,
-	0x0003, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x701f, 0x38aa, 0x2900,
-	0x6016, 0x2009, 0x0032, 0x080c, 0xabe6, 0x012e, 0x00ce, 0x0005,
-	0x012e, 0x00ce, 0x0804, 0x3401, 0x00ce, 0x0804, 0x3404, 0x080c,
-	0xab6b, 0x0cb0, 0xa830, 0x9086, 0x0100, 0x0904, 0x3401, 0x0804,
-	0x33cf, 0x2061, 0x1a6e, 0x0126, 0x2091, 0x8000, 0x6000, 0xd084,
-	0x0170, 0x6104, 0x6208, 0x2061, 0x1800, 0x6354, 0x6074, 0x789a,
-	0x60c0, 0x789e, 0x60bc, 0x78aa, 0x012e, 0x0804, 0x33cf, 0x900e,
-	0x2110, 0x0c88, 0x81ff, 0x1904, 0x3401, 0x080c, 0x717d, 0x0904,
-	0x3401, 0x0126, 0x2091, 0x8000, 0x6254, 0x6074, 0x9202, 0x0248,
-	0x9085, 0x0001, 0x080c, 0x2759, 0x080c, 0x56db, 0x012e, 0x0804,
-	0x33cf, 0x012e, 0x0804, 0x3404, 0x0006, 0x0016, 0x00c6, 0x00e6,
-	0x2001, 0x19a7, 0x2070, 0x2061, 0x1847, 0x6008, 0x2072, 0x900e,
-	0x2011, 0x1400, 0x080c, 0x8cf7, 0x7206, 0x00ee, 0x00ce, 0x001e,
-	0x000e, 0x0005, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0128, 0x012e,
-	0x2021, 0x400b, 0x0804, 0x33d1, 0x7884, 0xd0fc, 0x0148, 0x2001,
-	0x002a, 0x2004, 0x9082, 0x00e1, 0x0288, 0x012e, 0x0804, 0x3404,
-	0x2001, 0x002a, 0x2004, 0x2069, 0x1847, 0x6908, 0x9102, 0x1230,
-	0x012e, 0x0804, 0x3404, 0x012e, 0x0804, 0x3401, 0x080c, 0xaad5,
-	0x0dd0, 0x7884, 0xd0fc, 0x0904, 0x3975, 0x00c6, 0x080c, 0x489b,
-	0x00ce, 0x0d88, 0xa867, 0x0000, 0x7884, 0xa80a, 0x7898, 0xa80e,
-	0x789c, 0xa812, 0x2001, 0x002e, 0x2004, 0xa81a, 0x2001, 0x002f,
-	0x2004, 0xa81e, 0x2001, 0x0030, 0x2004, 0xa822, 0x2001, 0x0031,
-	0x2004, 0xa826, 0x2001, 0x0034, 0x2004, 0xa82a, 0x2001, 0x0035,
-	0x2004, 0xa82e, 0x2001, 0x002a, 0x2004, 0x9080, 0x0003, 0x9084,
-	0x00fc, 0x8004, 0xa816, 0x080c, 0x3afb, 0x0928, 0x7014, 0x2048,
-	0xad2c, 0xac28, 0xab1c, 0xaa18, 0xa930, 0xa808, 0xd0b4, 0x1120,
-	0x2029, 0x0000, 0x2021, 0x0000, 0x8906, 0x8006, 0x8007, 0x90bc,
-	0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x080c, 0x48e4, 0x701f,
-	0x3a38, 0x7023, 0x0001, 0x012e, 0x0005, 0x0046, 0x0086, 0x0096,
-	0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x38e4,
-	0x2001, 0x199d, 0x2003, 0x0000, 0x2021, 0x000a, 0x2061, 0x0100,
-	0x6104, 0x0016, 0x60bb, 0x0000, 0x60bf, 0x32e1, 0x60bf, 0x0012,
-	0x080c, 0x3b6a, 0x080c, 0x3b29, 0x00f6, 0x00e6, 0x0086, 0x2940,
-	0x2071, 0x1a64, 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884,
-	0xd0b4, 0x0140, 0x2001, 0x0035, 0x2004, 0x780e, 0x2001, 0x0034,
-	0x2004, 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, 0x3efd, 0x008e,
-	0x00ee, 0x00fe, 0x080c, 0x3e2a, 0x080c, 0x3d2f, 0x05b8, 0x2001,
-	0x020b, 0x2004, 0x9084, 0x0140, 0x1db8, 0x080c, 0x3f71, 0x00f6,
-	0x2079, 0x0300, 0x78bc, 0x00fe, 0x908c, 0x0070, 0x1560, 0x2071,
-	0x0200, 0x7037, 0x0000, 0x7050, 0x9084, 0xff00, 0x9086, 0x3200,
-	0x1510, 0x7037, 0x0001, 0x7050, 0x9084, 0xff00, 0x9086, 0xe100,
-	0x11d0, 0x7037, 0x0000, 0x7054, 0x7037, 0x0000, 0x715c, 0x9106,
-	0x1190, 0x2001, 0x1820, 0x2004, 0x9106, 0x1168, 0x00c6, 0x2061,
-	0x0100, 0x6024, 0x9084, 0x1e00, 0x00ce, 0x0138, 0x080c, 0x3d39,
-	0x080c, 0x3b24, 0x0058, 0x080c, 0x3b24, 0x080c, 0x3e95, 0x080c,
-	0x3e20, 0x2001, 0x020b, 0x2004, 0xd0e4, 0x0dd8, 0x2001, 0x032a,
-	0x2003, 0x0004, 0x2061, 0x0100, 0x6027, 0x0002, 0x001e, 0x6106,
-	0x2011, 0x020d, 0x2013, 0x0020, 0x60bb, 0x0000, 0x60bf, 0x0108,
-	0x60bf, 0x0012, 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102,
-	0x080c, 0x12e4, 0x2009, 0x0028, 0x080c, 0x2284, 0x2001, 0x0227,
-	0x200c, 0x2102, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae,
-	0x009e, 0x008e, 0x004e, 0x2001, 0x199d, 0x2004, 0x9005, 0x1118,
-	0x012e, 0x0804, 0x33cf, 0x012e, 0x2021, 0x400c, 0x0804, 0x33d1,
-	0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096,
-	0x00d6, 0x0156, 0x7014, 0x2048, 0x7020, 0x20a8, 0x8000, 0x7022,
-	0xa804, 0x9005, 0x0904, 0x3a94, 0x2048, 0x1f04, 0x3a48, 0x7068,
-	0x2040, 0xa28c, 0xa390, 0xa494, 0xa598, 0xa930, 0xa808, 0xd0b4,
-	0x1120, 0x2029, 0x0000, 0x2021, 0x0000, 0x0096, 0x7014, 0x2048,
-	0xa864, 0x009e, 0x9086, 0x0103, 0x0170, 0x8906, 0x8006, 0x8007,
-	0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x080c, 0x48e4,
-	0x701f, 0x3a38, 0x00b0, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f,
-	0x9084, 0xffc0, 0x9080, 0x001b, 0x21a8, 0x27e0, 0x2098, 0x27e8,
-	0x20a0, 0x0006, 0x080c, 0x0f7d, 0x000e, 0x080c, 0x48e7, 0x701f,
-	0x3a38, 0x015e, 0x00de, 0x009e, 0x008e, 0x007e, 0x005e, 0x004e,
-	0x003e, 0x002e, 0x001e, 0x0005, 0x7014, 0x2048, 0xa864, 0x9086,
-	0x0103, 0x1118, 0x701f, 0x3af9, 0x0450, 0x7014, 0x2048, 0xa868,
-	0xc0fd, 0xa86a, 0x2009, 0x007f, 0x080c, 0x636c, 0x0110, 0x9006,
-	0x0030, 0xb813, 0x00ff, 0xb817, 0xfffd, 0x080c, 0xcce2, 0x015e,
+	0x9506, 0x0150, 0x012e, 0x9ce0, 0x0018, 0x2001, 0x181a, 0x2004,
+	0x9c02, 0x1a04, 0x354f, 0x0c30, 0x080c, 0xc74e, 0x012e, 0x0904,
+	0x354f, 0x0804, 0x351d, 0x900e, 0x2001, 0x0005, 0x080c, 0x6eb8,
+	0x0126, 0x2091, 0x8000, 0x080c, 0xce10, 0x080c, 0x6c79, 0x012e,
+	0x0804, 0x351d, 0x00a6, 0x2950, 0xb198, 0x080c, 0x6600, 0x1904,
+	0x378c, 0xb6a4, 0x9684, 0x3fff, 0x9082, 0x4000, 0x16e8, 0xb49c,
+	0xb5a0, 0x080c, 0x6763, 0x080c, 0x6732, 0x1520, 0x2061, 0x1cd0,
+	0x0126, 0x2091, 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014,
+	0x904d, 0x0130, 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0158,
+	0x012e, 0x9ce0, 0x0018, 0x2001, 0x181a, 0x2004, 0x9c02, 0x2009,
+	0x000d, 0x12b0, 0x0c28, 0x080c, 0xc74e, 0x012e, 0x2009, 0x0003,
+	0x0178, 0x00e0, 0x900e, 0x2001, 0x0005, 0x080c, 0x6eb8, 0x0126,
+	0x2091, 0x8000, 0x080c, 0xce10, 0x080c, 0x6c6d, 0x012e, 0x0070,
+	0xb097, 0x4005, 0xb19a, 0x0010, 0xb097, 0x4006, 0x900e, 0x9085,
+	0x0001, 0x2001, 0x0030, 0x2a48, 0x00ae, 0x0005, 0xb097, 0x4000,
+	0x9006, 0x918d, 0x0001, 0x2008, 0x2a48, 0x00ae, 0x0005, 0x81ff,
+	0x1904, 0x354f, 0x080c, 0x4abc, 0x0904, 0x3552, 0x080c, 0x66c7,
+	0x0904, 0x354f, 0x080c, 0x6769, 0x0904, 0x354f, 0x0804, 0x451d,
+	0x81ff, 0x1904, 0x354f, 0x080c, 0x4ad8, 0x0904, 0x3552, 0x080c,
+	0x67f7, 0x0904, 0x354f, 0x2019, 0x0005, 0x79a8, 0x080c, 0x6784,
+	0x0904, 0x354f, 0x7888, 0x908a, 0x1000, 0x1a04, 0x3552, 0x8003,
+	0x800b, 0x810b, 0x9108, 0x080c, 0x84d8, 0x7984, 0xd184, 0x1904,
+	0x351d, 0x0804, 0x451d, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0118,
+	0x2009, 0x0001, 0x0450, 0x2029, 0x07ff, 0x645c, 0x2400, 0x9506,
+	0x01f8, 0x2508, 0x080c, 0x6600, 0x11d8, 0x080c, 0x67f7, 0x1128,
+	0x2009, 0x0002, 0x62c0, 0x2518, 0x00c0, 0x2019, 0x0004, 0x900e,
+	0x080c, 0x6784, 0x1118, 0x2009, 0x0006, 0x0078, 0x7884, 0x908a,
+	0x1000, 0x1270, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x84d8,
+	0x8529, 0x1ae0, 0x012e, 0x0804, 0x351d, 0x012e, 0x0804, 0x354f,
+	0x012e, 0x0804, 0x3552, 0x080c, 0x4abc, 0x0904, 0x3552, 0x080c,
+	0x66c7, 0x0904, 0x354f, 0xbaa0, 0x2019, 0x0005, 0x00c6, 0x9066,
+	0x080c, 0x9262, 0x0076, 0x903e, 0x080c, 0x913f, 0x900e, 0x080c,
+	0xe2ca, 0x007e, 0x00ce, 0x080c, 0x6763, 0x0804, 0x351d, 0x080c,
+	0x4abc, 0x0904, 0x3552, 0x080c, 0x6763, 0x2208, 0x0804, 0x351d,
+	0x0156, 0x00d6, 0x00e6, 0x2069, 0x1910, 0x6810, 0x6914, 0x910a,
+	0x1208, 0x900e, 0x6816, 0x9016, 0x901e, 0x20a9, 0x007e, 0x2069,
+	0x1000, 0x2d04, 0x905d, 0x0118, 0xb84c, 0x0059, 0x9210, 0x8d68,
+	0x1f04, 0x3841, 0x2300, 0x9218, 0x00ee, 0x00de, 0x015e, 0x0804,
+	0x351d, 0x00f6, 0x0016, 0x907d, 0x0138, 0x9006, 0x8000, 0x2f0c,
+	0x81ff, 0x0110, 0x2178, 0x0cd0, 0x001e, 0x00fe, 0x0005, 0x2069,
+	0x1910, 0x6910, 0x62bc, 0x0804, 0x351d, 0x81ff, 0x0120, 0x2009,
+	0x0001, 0x0804, 0x354f, 0x0126, 0x2091, 0x8000, 0x080c, 0x56e4,
+	0x0128, 0x2009, 0x0007, 0x012e, 0x0804, 0x354f, 0x012e, 0x615c,
+	0x9190, 0x331e, 0x2215, 0x9294, 0x00ff, 0x637c, 0x83ff, 0x0108,
+	0x6280, 0x67dc, 0x97c4, 0x000a, 0x98c6, 0x000a, 0x1118, 0x2031,
+	0x0001, 0x00e8, 0x97c4, 0x0022, 0x98c6, 0x0022, 0x1118, 0x2031,
+	0x0003, 0x00a8, 0x97c4, 0x0012, 0x98c6, 0x0012, 0x1118, 0x2031,
+	0x0002, 0x0068, 0x080c, 0x73b0, 0x1118, 0x2031, 0x0004, 0x0038,
+	0xd79c, 0x0120, 0x2009, 0x0005, 0x0804, 0x354f, 0x9036, 0x7e9a,
+	0x7f9e, 0x0804, 0x351d, 0x614c, 0x6250, 0x2019, 0x1986, 0x231c,
+	0x2001, 0x1987, 0x2004, 0x789a, 0x0804, 0x351d, 0x0126, 0x2091,
+	0x8000, 0x6138, 0x623c, 0x6340, 0x012e, 0x0804, 0x351d, 0x080c,
+	0x4ad8, 0x0904, 0x3552, 0xba44, 0xbb38, 0x0804, 0x351d, 0x080c,
+	0x0dd5, 0x080c, 0x4ad8, 0x2110, 0x0904, 0x3552, 0xb804, 0x908c,
+	0x00ff, 0x918e, 0x0006, 0x0140, 0x9084, 0xff00, 0x9086, 0x0600,
+	0x2009, 0x0009, 0x1904, 0x354f, 0x0126, 0x2091, 0x8000, 0x2019,
+	0x0005, 0x00c6, 0x9066, 0x080c, 0xa7ee, 0x080c, 0x9262, 0x0076,
+	0x903e, 0x080c, 0x913f, 0x900e, 0x080c, 0xe2ca, 0x007e, 0x00ce,
+	0xb807, 0x0407, 0x012e, 0x0804, 0x351d, 0x614c, 0x6250, 0x7884,
+	0x604e, 0x7b88, 0x6352, 0x2069, 0x1847, 0x831f, 0x9305, 0x6816,
+	0x788c, 0x2069, 0x1986, 0x2d1c, 0x206a, 0x7e98, 0x9682, 0x0014,
+	0x1210, 0x2031, 0x07d0, 0x2069, 0x1987, 0x2d04, 0x266a, 0x789a,
+	0x0804, 0x351d, 0x0126, 0x2091, 0x8000, 0x7884, 0x603a, 0xd0c4,
+	0x01a8, 0x00d6, 0x78a8, 0x2009, 0x199d, 0x200a, 0x78ac, 0x2011,
+	0x199e, 0x2012, 0x2069, 0x0100, 0x6838, 0x9086, 0x0007, 0x1118,
+	0x2214, 0x6a5a, 0x0010, 0x210c, 0x695a, 0x00de, 0x7884, 0xd0b4,
+	0x0120, 0x3b00, 0x9084, 0xff3f, 0x20d8, 0x7888, 0x603e, 0x2011,
+	0x0114, 0x220c, 0x7888, 0xd08c, 0x0118, 0x918d, 0x0080, 0x0010,
+	0x918c, 0xff7f, 0x2112, 0x788c, 0x6042, 0x9084, 0x0020, 0x0130,
+	0x78b4, 0x6046, 0x9084, 0x0001, 0x090c, 0x4207, 0x6040, 0xd0cc,
+	0x0120, 0x78b0, 0x2011, 0x0114, 0x2012, 0x012e, 0x0804, 0x351d,
+	0x00f6, 0x2079, 0x1800, 0x7a38, 0xa898, 0x9084, 0xfebf, 0x9215,
+	0xa89c, 0x9084, 0xfebf, 0x8002, 0x9214, 0x7838, 0x9084, 0x0140,
+	0x9215, 0x7a3a, 0xa897, 0x4000, 0x900e, 0x9085, 0x0001, 0x2001,
+	0x0000, 0x00fe, 0x0005, 0x7898, 0x9005, 0x01a8, 0x7888, 0x9025,
+	0x0904, 0x3552, 0x788c, 0x902d, 0x0904, 0x3552, 0x900e, 0x080c,
+	0x6600, 0x1120, 0xba44, 0xbb38, 0xbc46, 0xbd3a, 0x9186, 0x07ff,
+	0x0190, 0x8108, 0x0ca0, 0x080c, 0x4ad8, 0x0904, 0x3552, 0x7888,
+	0x900d, 0x0904, 0x3552, 0x788c, 0x9005, 0x0904, 0x3552, 0xba44,
+	0xb946, 0xbb38, 0xb83a, 0x0804, 0x351d, 0x2011, 0xbc09, 0x0010,
+	0x2011, 0xbc05, 0x080c, 0x56e4, 0x1904, 0x354f, 0x00c6, 0x2061,
+	0x0100, 0x7984, 0x9186, 0x00ff, 0x1130, 0x2001, 0x1818, 0x2004,
+	0x9085, 0xff00, 0x0088, 0x9182, 0x007f, 0x16e0, 0x9188, 0x331e,
+	0x210d, 0x918c, 0x00ff, 0x2001, 0x1818, 0x2004, 0x0026, 0x9116,
+	0x002e, 0x0580, 0x810f, 0x9105, 0x0126, 0x2091, 0x8000, 0x0006,
+	0x080c, 0xadf1, 0x000e, 0x0510, 0x602e, 0x620a, 0x7984, 0x00b6,
+	0x080c, 0x65a5, 0x2b08, 0x00be, 0x1500, 0x6112, 0x6023, 0x0001,
+	0x080c, 0x4aa5, 0x01d0, 0x9006, 0xa866, 0x7007, 0x0003, 0xa832,
+	0xa868, 0xc0fd, 0xa86a, 0x701f, 0x39f8, 0x2900, 0x6016, 0x2009,
+	0x0032, 0x080c, 0xaec2, 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce,
+	0x0804, 0x354f, 0x00ce, 0x0804, 0x3552, 0x080c, 0xae47, 0x0cb0,
+	0xa830, 0x9086, 0x0100, 0x0904, 0x354f, 0x0804, 0x351d, 0x2061,
+	0x1a71, 0x0126, 0x2091, 0x8000, 0x6000, 0xd084, 0x0170, 0x6104,
+	0x6208, 0x2061, 0x1800, 0x6354, 0x6074, 0x789a, 0x60c0, 0x789e,
+	0x60bc, 0x78aa, 0x012e, 0x0804, 0x351d, 0x900e, 0x2110, 0x0c88,
+	0x81ff, 0x1904, 0x354f, 0x080c, 0x73b0, 0x0904, 0x354f, 0x0126,
+	0x2091, 0x8000, 0x6254, 0x6074, 0x9202, 0x0248, 0x9085, 0x0001,
+	0x080c, 0x28a7, 0x080c, 0x58fe, 0x012e, 0x0804, 0x351d, 0x012e,
+	0x0804, 0x3552, 0x0006, 0x0016, 0x00c6, 0x00e6, 0x2001, 0x19a9,
+	0x2070, 0x2061, 0x1847, 0x6008, 0x2072, 0x900e, 0x2011, 0x1400,
+	0x080c, 0x8f3f, 0x7206, 0x00ee, 0x00ce, 0x001e, 0x000e, 0x0005,
+	0x0126, 0x2091, 0x8000, 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b,
+	0x0804, 0x351f, 0x7884, 0xd0fc, 0x0148, 0x2001, 0x002a, 0x2004,
+	0x9082, 0x00e1, 0x0288, 0x012e, 0x0804, 0x3552, 0x2001, 0x002a,
+	0x2004, 0x2069, 0x1847, 0x6908, 0x9102, 0x1230, 0x012e, 0x0804,
+	0x3552, 0x012e, 0x0804, 0x354f, 0x080c, 0xadb1, 0x0dd0, 0x7884,
+	0xd0fc, 0x0904, 0x3ac3, 0x00c6, 0x080c, 0x4aa5, 0x00ce, 0x0d88,
+	0xa867, 0x0000, 0x7884, 0xa80a, 0x7898, 0xa80e, 0x789c, 0xa812,
+	0x2001, 0x002e, 0x2004, 0xa81a, 0x2001, 0x002f, 0x2004, 0xa81e,
+	0x2001, 0x0030, 0x2004, 0xa822, 0x2001, 0x0031, 0x2004, 0xa826,
+	0x2001, 0x0034, 0x2004, 0xa82a, 0x2001, 0x0035, 0x2004, 0xa82e,
+	0x2001, 0x002a, 0x2004, 0x9080, 0x0003, 0x9084, 0x00fc, 0x8004,
+	0xa816, 0x080c, 0x3c49, 0x0928, 0x7014, 0x2048, 0xad2c, 0xac28,
+	0xab1c, 0xaa18, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000,
+	0x2021, 0x0000, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084,
+	0xffc0, 0x9080, 0x001b, 0x080c, 0x4aee, 0x701f, 0x3b86, 0x7023,
+	0x0001, 0x012e, 0x0005, 0x0046, 0x0086, 0x0096, 0x00a6, 0x00b6,
+	0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3a32, 0x2001, 0x199f,
+	0x2003, 0x0000, 0x2021, 0x000a, 0x2061, 0x0100, 0x6104, 0x0016,
+	0x60bb, 0x0000, 0x60bf, 0x32e1, 0x60bf, 0x0012, 0x080c, 0x3cb8,
+	0x080c, 0x3c77, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x1a66,
+	0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0140,
+	0x2001, 0x0035, 0x2004, 0x780e, 0x2001, 0x0034, 0x2004, 0x780a,
+	0x00de, 0x2011, 0x0001, 0x080c, 0x404b, 0x008e, 0x00ee, 0x00fe,
+	0x080c, 0x3f78, 0x080c, 0x3e7d, 0x05b8, 0x2001, 0x020b, 0x2004,
+	0x9084, 0x0140, 0x1db8, 0x080c, 0x40bf, 0x00f6, 0x2079, 0x0300,
+	0x78bc, 0x00fe, 0x908c, 0x0070, 0x1560, 0x2071, 0x0200, 0x7037,
+	0x0000, 0x7050, 0x9084, 0xff00, 0x9086, 0x3200, 0x1510, 0x7037,
+	0x0001, 0x7050, 0x9084, 0xff00, 0x9086, 0xe100, 0x11d0, 0x7037,
+	0x0000, 0x7054, 0x7037, 0x0000, 0x715c, 0x9106, 0x1190, 0x2001,
+	0x1820, 0x2004, 0x9106, 0x1168, 0x00c6, 0x2061, 0x0100, 0x6024,
+	0x9084, 0x1e00, 0x00ce, 0x0138, 0x080c, 0x3e87, 0x080c, 0x3c72,
+	0x0058, 0x080c, 0x3c72, 0x080c, 0x3fe3, 0x080c, 0x3f6e, 0x2001,
+	0x020b, 0x2004, 0xd0e4, 0x0dd8, 0x2001, 0x032a, 0x2003, 0x0004,
+	0x2061, 0x0100, 0x6027, 0x0002, 0x001e, 0x6106, 0x2011, 0x020d,
+	0x2013, 0x0020, 0x60bb, 0x0000, 0x60bf, 0x0108, 0x60bf, 0x0012,
+	0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, 0x12ed,
+	0x2009, 0x0028, 0x080c, 0x23d2, 0x2001, 0x0227, 0x200c, 0x2102,
+	0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e,
+	0x004e, 0x2001, 0x199f, 0x2004, 0x9005, 0x1118, 0x012e, 0x0804,
+	0x351d, 0x012e, 0x2021, 0x400c, 0x0804, 0x351f, 0x0016, 0x0026,
+	0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, 0x0156,
+	0x7014, 0x2048, 0x7020, 0x20a8, 0x8000, 0x7022, 0xa804, 0x9005,
+	0x0904, 0x3be2, 0x2048, 0x1f04, 0x3b96, 0x7068, 0x2040, 0xa28c,
+	0xa390, 0xa494, 0xa598, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029,
+	0x0000, 0x2021, 0x0000, 0x0096, 0x7014, 0x2048, 0xa864, 0x009e,
+	0x9086, 0x0103, 0x0170, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f,
+	0x9084, 0xffc0, 0x9080, 0x001b, 0x080c, 0x4aee, 0x701f, 0x3b86,
+	0x00b0, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0,
+	0x9080, 0x001b, 0x21a8, 0x27e0, 0x2098, 0x27e8, 0x20a0, 0x0006,
+	0x080c, 0x0f7c, 0x000e, 0x080c, 0x4af1, 0x701f, 0x3b86, 0x015e,
 	0x00de, 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e,
-	0x001e, 0x0904, 0x3401, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056,
-	0x0076, 0x0086, 0x0096, 0x00d6, 0x0156, 0x701f, 0x3acb, 0x7007,
-	0x0003, 0x0804, 0x3a89, 0xa830, 0x9086, 0x0100, 0x2021, 0x400c,
-	0x0904, 0x33d1, 0x0076, 0xad10, 0xac0c, 0xab24, 0xaa20, 0xa930,
-	0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, 0x0000, 0x8906,
-	0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b,
-	0x21a8, 0x27e0, 0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c, 0x0f7d,
-	0x000e, 0x080c, 0x48e7, 0x007e, 0x701f, 0x3a38, 0x7023, 0x0001,
-	0x0005, 0x0804, 0x33cf, 0x0156, 0x00c6, 0xa814, 0x908a, 0x001e,
-	0x0218, 0xa833, 0x001e, 0x0010, 0xa832, 0x0078, 0x81ff, 0x0168,
-	0x0016, 0x080c, 0x489b, 0x001e, 0x0130, 0xa800, 0x2040, 0xa008,
-	0xa80a, 0x2100, 0x0c58, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce,
-	0x015e, 0x0005, 0x0006, 0x00f6, 0x2079, 0x0000, 0x7880, 0x9086,
-	0x0044, 0x00fe, 0x000e, 0x0005, 0x2001, 0x199d, 0x2003, 0x0001,
-	0x0005, 0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200, 0x2001, 0x19a8,
-	0x2004, 0x601a, 0x2061, 0x0100, 0x2001, 0x19a7, 0x2004, 0x60ce,
-	0x6104, 0xc1ac, 0x6106, 0x080c, 0x489b, 0xa813, 0x0019, 0xa817,
-	0x0001, 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, 0xa866, 0x2001,
-	0x002f, 0x2004, 0xa86a, 0x2061, 0x0090, 0x2079, 0x0100, 0x2001,
-	0x19a7, 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, 0x2284, 0x2001,
-	0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, 0x601a, 0xa873, 0x0000,
-	0x601f, 0x0000, 0x78ca, 0x9006, 0x600a, 0x600e, 0x00ce, 0x00ee,
-	0x00fe, 0x0005, 0x00e6, 0x080c, 0x489b, 0x2940, 0xa013, 0x0019,
-	0xa017, 0x0001, 0x2800, 0xa05a, 0x2001, 0x0030, 0x2004, 0xa866,
-	0x2001, 0x0031, 0x2004, 0xa86a, 0x2001, 0x002a, 0x2004, 0x9084,
-	0xfff8, 0xa86e, 0xa873, 0x0000, 0x2001, 0x032a, 0x2003, 0x0004,
-	0x2001, 0x0300, 0x2003, 0x0000, 0x2001, 0x020d, 0x2003, 0x0000,
-	0x2001, 0x0004, 0x200c, 0x918d, 0x0002, 0x2102, 0x00ee, 0x0005,
-	0x0126, 0x2091, 0x8000, 0x81ff, 0x0148, 0x080c, 0x2ae2, 0x1130,
-	0x9006, 0x080c, 0x2a3a, 0x9006, 0x080c, 0x2a1d, 0x7884, 0x9084,
-	0x0007, 0x0002, 0x3bb5, 0x3bbe, 0x3bc7, 0x3bb2, 0x3bb2, 0x3bb2,
-	0x3bb2, 0x3bb2, 0x012e, 0x0804, 0x3404, 0x2009, 0x0114, 0x2104,
-	0x9085, 0x0800, 0x200a, 0x080c, 0x3d83, 0x00c0, 0x2009, 0x0114,
-	0x2104, 0x9085, 0x4000, 0x200a, 0x080c, 0x3d83, 0x0078, 0x080c,
-	0x717d, 0x1128, 0x012e, 0x2009, 0x0016, 0x0804, 0x3401, 0x81ff,
-	0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x33d1, 0x0086, 0x0096,
-	0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x38e4,
-	0x2009, 0x0101, 0x210c, 0x0016, 0x7ec8, 0x7dcc, 0x9006, 0x2068,
-	0x2060, 0x2058, 0x080c, 0x404c, 0x080c, 0x3f9c, 0x903e, 0x2720,
-	0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x1a64, 0x2079, 0x0090,
-	0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120, 0x68d4, 0x780e,
-	0x68d0, 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, 0x3efd, 0x080c,
-	0x2aea, 0x080c, 0x2aea, 0x080c, 0x2aea, 0x080c, 0x2aea, 0x080c,
-	0x3efd, 0x008e, 0x00ee, 0x00fe, 0x080c, 0x3e2a, 0x2009, 0x9c40,
-	0x8109, 0x11b0, 0x080c, 0x3d39, 0x2001, 0x0004, 0x200c, 0x918c,
-	0xfffd, 0x2102, 0x001e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be,
-	0x00ae, 0x009e, 0x008e, 0x2009, 0x0017, 0x080c, 0x3401, 0x0cf8,
-	0x2001, 0x020b, 0x2004, 0x9084, 0x0140, 0x1d10, 0x00f6, 0x2079,
-	0x0000, 0x7884, 0x00fe, 0xd0bc, 0x0178, 0x2001, 0x0201, 0x200c,
-	0x81ff, 0x0150, 0x080c, 0x3e08, 0x2d00, 0x9c05, 0x9b05, 0x0120,
-	0x080c, 0x3d39, 0x0804, 0x3ce6, 0x080c, 0x3f71, 0x080c, 0x3e95,
-	0x080c, 0x3deb, 0x080c, 0x3e20, 0x00f6, 0x2079, 0x0100, 0x7824,
-	0xd0ac, 0x0130, 0x8b58, 0x080c, 0x3d39, 0x00fe, 0x0804, 0x3ce6,
-	0x00fe, 0x080c, 0x3d2f, 0x1150, 0x8d68, 0x2001, 0x0032, 0x2602,
-	0x2001, 0x0033, 0x2502, 0x080c, 0x3d39, 0x0080, 0x87ff, 0x0138,
-	0x2001, 0x0201, 0x2004, 0x9005, 0x1908, 0x8739, 0x0038, 0x2001,
-	0x1a60, 0x2004, 0x9086, 0x0000, 0x1904, 0x3c36, 0x2001, 0x032f,
-	0x2003, 0x00f6, 0x8631, 0x1208, 0x8529, 0x2500, 0x9605, 0x0904,
-	0x3ce6, 0x7884, 0xd0bc, 0x0128, 0x2d00, 0x9c05, 0x9b05, 0x1904,
-	0x3ce6, 0xa013, 0x0019, 0x2001, 0x032a, 0x2003, 0x0004, 0x7884,
-	0xd0ac, 0x1148, 0x2001, 0x1a60, 0x2003, 0x0003, 0x2001, 0x032a,
-	0x2003, 0x0009, 0x0030, 0xa017, 0x0001, 0x78b4, 0x9005, 0x0108,
-	0xa016, 0x2800, 0xa05a, 0x2009, 0x0040, 0x080c, 0x2284, 0x2900,
-	0xa85a, 0xa813, 0x0019, 0x7884, 0xd0a4, 0x1180, 0xa817, 0x0000,
-	0x00c6, 0x20a9, 0x0004, 0x2061, 0x0090, 0x602b, 0x0008, 0x2001,
-	0x0203, 0x2004, 0x1f04, 0x3cbd, 0x00ce, 0x0030, 0xa817, 0x0001,
-	0x78b0, 0x9005, 0x0108, 0xa816, 0x00f6, 0x00c6, 0x2079, 0x0100,
-	0x2061, 0x0090, 0x7827, 0x0002, 0x2001, 0x002a, 0x2004, 0x9084,
+	0x001e, 0x0005, 0x7014, 0x2048, 0xa864, 0x9086, 0x0103, 0x1118,
+	0x701f, 0x3c47, 0x0450, 0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a,
+	0x2009, 0x007f, 0x080c, 0x659f, 0x0110, 0x9006, 0x0030, 0xb813,
+	0x00ff, 0xb817, 0xfffd, 0x080c, 0xcfdf, 0x015e, 0x00de, 0x009e,
+	0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0904,
+	0x354f, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x0086,
+	0x0096, 0x00d6, 0x0156, 0x701f, 0x3c19, 0x7007, 0x0003, 0x0804,
+	0x3bd7, 0xa830, 0x9086, 0x0100, 0x2021, 0x400c, 0x0904, 0x351f,
+	0x0076, 0xad10, 0xac0c, 0xab24, 0xaa20, 0xa930, 0xa808, 0xd0b4,
+	0x1120, 0x2029, 0x0000, 0x2021, 0x0000, 0x8906, 0x8006, 0x8007,
+	0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x21a8, 0x27e0,
+	0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c, 0x0f7c, 0x000e, 0x080c,
+	0x4af1, 0x007e, 0x701f, 0x3b86, 0x7023, 0x0001, 0x0005, 0x0804,
+	0x351d, 0x0156, 0x00c6, 0xa814, 0x908a, 0x001e, 0x0218, 0xa833,
+	0x001e, 0x0010, 0xa832, 0x0078, 0x81ff, 0x0168, 0x0016, 0x080c,
+	0x4aa5, 0x001e, 0x0130, 0xa800, 0x2040, 0xa008, 0xa80a, 0x2100,
+	0x0c58, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce, 0x015e, 0x0005,
+	0x0006, 0x00f6, 0x2079, 0x0000, 0x7880, 0x9086, 0x0044, 0x00fe,
+	0x000e, 0x0005, 0x2001, 0x199f, 0x2003, 0x0001, 0x0005, 0x00f6,
+	0x00e6, 0x00c6, 0x2061, 0x0200, 0x2001, 0x19aa, 0x2004, 0x601a,
+	0x2061, 0x0100, 0x2001, 0x19a9, 0x2004, 0x60ce, 0x6104, 0xc1ac,
+	0x6106, 0x080c, 0x4aa5, 0xa813, 0x0019, 0xa817, 0x0001, 0x2900,
+	0xa85a, 0x2001, 0x002e, 0x2004, 0xa866, 0x2001, 0x002f, 0x2004,
+	0xa86a, 0x2061, 0x0090, 0x2079, 0x0100, 0x2001, 0x19a9, 0x2004,
+	0x6036, 0x2009, 0x0040, 0x080c, 0x23d2, 0x2001, 0x002a, 0x2004,
+	0x9084, 0xfff8, 0xa86e, 0x601a, 0xa873, 0x0000, 0x601f, 0x0000,
+	0x78ca, 0x9006, 0x600a, 0x600e, 0x00ce, 0x00ee, 0x00fe, 0x0005,
+	0x00e6, 0x080c, 0x4aa5, 0x2940, 0xa013, 0x0019, 0xa017, 0x0001,
+	0x2800, 0xa05a, 0x2001, 0x0030, 0x2004, 0xa866, 0x2001, 0x0031,
+	0x2004, 0xa86a, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e,
+	0xa873, 0x0000, 0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x0300,
+	0x2003, 0x0000, 0x2001, 0x020d, 0x2003, 0x0000, 0x2001, 0x0004,
+	0x200c, 0x918d, 0x0002, 0x2102, 0x00ee, 0x0005, 0x0126, 0x2091,
+	0x8000, 0x81ff, 0x0148, 0x080c, 0x2c30, 0x1130, 0x9006, 0x080c,
+	0x2b88, 0x9006, 0x080c, 0x2b6b, 0x7884, 0x9084, 0x0007, 0x0002,
+	0x3d03, 0x3d0c, 0x3d15, 0x3d00, 0x3d00, 0x3d00, 0x3d00, 0x3d00,
+	0x012e, 0x0804, 0x3552, 0x2009, 0x0114, 0x2104, 0x9085, 0x0800,
+	0x200a, 0x080c, 0x3ed1, 0x00c0, 0x2009, 0x0114, 0x2104, 0x9085,
+	0x4000, 0x200a, 0x080c, 0x3ed1, 0x0078, 0x080c, 0x73b0, 0x1128,
+	0x012e, 0x2009, 0x0016, 0x0804, 0x354f, 0x81ff, 0x0128, 0x012e,
+	0x2021, 0x400b, 0x0804, 0x351f, 0x0086, 0x0096, 0x00a6, 0x00b6,
+	0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3a32, 0x2009, 0x0101,
+	0x210c, 0x0016, 0x7ec8, 0x7dcc, 0x9006, 0x2068, 0x2060, 0x2058,
+	0x080c, 0x419a, 0x080c, 0x40ea, 0x903e, 0x2720, 0x00f6, 0x00e6,
+	0x0086, 0x2940, 0x2071, 0x1a66, 0x2079, 0x0090, 0x00d6, 0x2069,
+	0x0000, 0x6884, 0xd0b4, 0x0120, 0x68d4, 0x780e, 0x68d0, 0x780a,
+	0x00de, 0x2011, 0x0001, 0x080c, 0x404b, 0x080c, 0x2c38, 0x080c,
+	0x2c38, 0x080c, 0x2c38, 0x080c, 0x2c38, 0x080c, 0x404b, 0x008e,
+	0x00ee, 0x00fe, 0x080c, 0x3f78, 0x2009, 0x9c40, 0x8109, 0x11b0,
+	0x080c, 0x3e87, 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102,
+	0x001e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e,
+	0x008e, 0x2009, 0x0017, 0x080c, 0x354f, 0x0cf8, 0x2001, 0x020b,
+	0x2004, 0x9084, 0x0140, 0x1d10, 0x00f6, 0x2079, 0x0000, 0x7884,
+	0x00fe, 0xd0bc, 0x0178, 0x2001, 0x0201, 0x200c, 0x81ff, 0x0150,
+	0x080c, 0x3f56, 0x2d00, 0x9c05, 0x9b05, 0x0120, 0x080c, 0x3e87,
+	0x0804, 0x3e34, 0x080c, 0x40bf, 0x080c, 0x3fe3, 0x080c, 0x3f39,
+	0x080c, 0x3f6e, 0x00f6, 0x2079, 0x0100, 0x7824, 0xd0ac, 0x0130,
+	0x8b58, 0x080c, 0x3e87, 0x00fe, 0x0804, 0x3e34, 0x00fe, 0x080c,
+	0x3e7d, 0x1150, 0x8d68, 0x2001, 0x0032, 0x2602, 0x2001, 0x0033,
+	0x2502, 0x080c, 0x3e87, 0x0080, 0x87ff, 0x0138, 0x2001, 0x0201,
+	0x2004, 0x9005, 0x1908, 0x8739, 0x0038, 0x2001, 0x1a62, 0x2004,
+	0x9086, 0x0000, 0x1904, 0x3d84, 0x2001, 0x032f, 0x2003, 0x00f6,
+	0x8631, 0x1208, 0x8529, 0x2500, 0x9605, 0x0904, 0x3e34, 0x7884,
+	0xd0bc, 0x0128, 0x2d00, 0x9c05, 0x9b05, 0x1904, 0x3e34, 0xa013,
+	0x0019, 0x2001, 0x032a, 0x2003, 0x0004, 0x7884, 0xd0ac, 0x1148,
+	0x2001, 0x1a62, 0x2003, 0x0003, 0x2001, 0x032a, 0x2003, 0x0009,
+	0x0030, 0xa017, 0x0001, 0x78b4, 0x9005, 0x0108, 0xa016, 0x2800,
+	0xa05a, 0x2009, 0x0040, 0x080c, 0x23d2, 0x2900, 0xa85a, 0xa813,
+	0x0019, 0x7884, 0xd0a4, 0x1180, 0xa817, 0x0000, 0x00c6, 0x20a9,
+	0x0004, 0x2061, 0x0090, 0x602b, 0x0008, 0x2001, 0x0203, 0x2004,
+	0x1f04, 0x3e0b, 0x00ce, 0x0030, 0xa817, 0x0001, 0x78b0, 0x9005,
+	0x0108, 0xa816, 0x00f6, 0x00c6, 0x2079, 0x0100, 0x2061, 0x0090,
+	0x7827, 0x0002, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0x601a,
+	0x0006, 0x2001, 0x002b, 0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca,
+	0x00ce, 0x00fe, 0x0804, 0x3d3e, 0x001e, 0x00c6, 0x2001, 0x032a,
+	0x2003, 0x0004, 0x2061, 0x0100, 0x6027, 0x0002, 0x6106, 0x2011,
+	0x020d, 0x2013, 0x0020, 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd,
+	0x2102, 0x080c, 0x12ed, 0x7884, 0x9084, 0x0003, 0x9086, 0x0002,
+	0x01a0, 0x2009, 0x0028, 0x080c, 0x23d2, 0x2001, 0x0227, 0x200c,
+	0x2102, 0x6050, 0x9084, 0xb7ef, 0x6052, 0x602f, 0x0000, 0x604b,
+	0xf7f7, 0x6043, 0x0090, 0x6043, 0x0010, 0x00ce, 0x2d08, 0x2c10,
+	0x2b18, 0x2b00, 0x9c05, 0x9d05, 0x00fe, 0x00ee, 0x00de, 0x00ce,
+	0x00be, 0x00ae, 0x009e, 0x008e, 0x1118, 0x012e, 0x0804, 0x351d,
+	0x012e, 0x2021, 0x400c, 0x0804, 0x351f, 0x9085, 0x0001, 0x1d04,
+	0x3e86, 0x2091, 0x6000, 0x8420, 0x9486, 0x0064, 0x0005, 0x2001,
+	0x0105, 0x2003, 0x0010, 0x2001, 0x032a, 0x2003, 0x0004, 0x2001,
+	0x1a62, 0x2003, 0x0000, 0x0071, 0x2009, 0x0048, 0x080c, 0x23d2,
+	0x2001, 0x0227, 0x2024, 0x2402, 0x2001, 0x0109, 0x2003, 0x4000,
+	0x9026, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a66, 0x7000, 0x9086,
+	0x0000, 0x0520, 0x2079, 0x0090, 0x2009, 0x0206, 0x2104, 0x2009,
+	0x0203, 0x210c, 0x9106, 0x1120, 0x2009, 0x0040, 0x080c, 0x23d2,
+	0x782c, 0xd0fc, 0x0d88, 0x080c, 0x40bf, 0x7000, 0x9086, 0x0000,
+	0x1d58, 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040,
+	0x080c, 0x23d2, 0x782b, 0x0002, 0x7003, 0x0000, 0x00ee, 0x00fe,
+	0x0005, 0x00f6, 0x2079, 0x0100, 0x2001, 0x1818, 0x200c, 0x7932,
+	0x7936, 0x080c, 0x2887, 0x7850, 0x9084, 0xfbff, 0x9085, 0x0030,
+	0x7852, 0x2019, 0x01f4, 0x8319, 0x1df0, 0x9084, 0xffcf, 0x9085,
+	0x2000, 0x7852, 0x20a9, 0x0046, 0x1d04, 0x3eec, 0x2091, 0x6000,
+	0x1f04, 0x3eec, 0x7850, 0x9085, 0x0400, 0x9084, 0xdfff, 0x7852,
+	0x2001, 0x0021, 0x2004, 0x9084, 0x0003, 0x9086, 0x0001, 0x1120,
+	0x7850, 0x9084, 0xdfff, 0x7852, 0x784b, 0xf7f7, 0x7843, 0x0090,
+	0x7843, 0x0010, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x3f0c, 0x7850,
+	0x9085, 0x1400, 0x7852, 0x2019, 0x61a8, 0x7854, 0xa001, 0xa001,
+	0xd08c, 0x1110, 0x8319, 0x1dc8, 0x7827, 0x0048, 0x7850, 0x9085,
+	0x0400, 0x7852, 0x7843, 0x0040, 0x2019, 0x01f4, 0xa001, 0xa001,
+	0x8319, 0x1de0, 0x2001, 0x0100, 0x080c, 0x2cef, 0x7827, 0x0020,
+	0x7843, 0x0000, 0x9006, 0x080c, 0x2cef, 0x7827, 0x0048, 0x00fe,
+	0x0005, 0x7884, 0xd0ac, 0x11c8, 0x00f6, 0x00e6, 0x2071, 0x1a62,
+	0x2079, 0x0320, 0x2001, 0x0201, 0x2004, 0x9005, 0x0160, 0x7000,
+	0x9086, 0x0000, 0x1140, 0x0051, 0xd0bc, 0x0108, 0x8738, 0x7003,
+	0x0003, 0x782b, 0x0019, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079,
+	0x0300, 0x78bc, 0x00fe, 0x908c, 0x0070, 0x0178, 0x2009, 0x0032,
+	0x260a, 0x2009, 0x0033, 0x250a, 0xd0b4, 0x0108, 0x8c60, 0xd0ac,
+	0x0108, 0x8d68, 0xd0a4, 0x0108, 0x8b58, 0x0005, 0x00f6, 0x2079,
+	0x0200, 0x781c, 0xd084, 0x0110, 0x7837, 0x0050, 0x00fe, 0x0005,
+	0x00e6, 0x2071, 0x0100, 0x2001, 0x19aa, 0x2004, 0x70e2, 0x080c,
+	0x3c68, 0x1188, 0x2001, 0x1820, 0x2004, 0x2009, 0x181f, 0x210c,
+	0x918c, 0x00ff, 0x706e, 0x716a, 0x7066, 0x918d, 0x3200, 0x7162,
+	0x7073, 0xe109, 0x0080, 0x702c, 0x9085, 0x0002, 0x702e, 0x2009,
+	0x1818, 0x210c, 0x716e, 0x7063, 0x0100, 0x7166, 0x719e, 0x706b,
+	0x0000, 0x7073, 0x0809, 0x7077, 0x0008, 0x7078, 0x9080, 0x0100,
+	0x707a, 0x7080, 0x8000, 0x7082, 0x7087, 0xaaaa, 0x9006, 0x708a,
+	0x708e, 0x707e, 0x70d6, 0x70ab, 0x0036, 0x70af, 0x95d5, 0x7014,
+	0x9084, 0x1984, 0x9085, 0x0092, 0x7016, 0x080c, 0x40bf, 0x00f6,
+	0x2071, 0x1a62, 0x2079, 0x0320, 0x00d6, 0x2069, 0x0000, 0x6884,
+	0xd0b4, 0x0120, 0x689c, 0x780e, 0x6898, 0x780a, 0x00de, 0x2009,
+	0x03e8, 0x8109, 0x1df0, 0x792c, 0xd1fc, 0x0110, 0x782b, 0x0004,
+	0x2011, 0x0011, 0x080c, 0x404b, 0x2011, 0x0001, 0x080c, 0x404b,
+	0x00fe, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a62, 0x2079,
+	0x0320, 0x792c, 0xd1fc, 0x0904, 0x4048, 0x782b, 0x0002, 0x9026,
+	0xd19c, 0x1904, 0x4044, 0x7000, 0x0002, 0x4048, 0x3ff9, 0x4029,
+	0x4044, 0xd1bc, 0x1170, 0xd1dc, 0x1190, 0x8001, 0x7002, 0x2011,
+	0x0001, 0x080c, 0x404b, 0x0904, 0x4048, 0x080c, 0x404b, 0x0804,
+	0x4048, 0x00f6, 0x2079, 0x0300, 0x78bf, 0x0000, 0x00fe, 0x7810,
+	0x7914, 0x782b, 0x0004, 0x7812, 0x7916, 0x2001, 0x0201, 0x200c,
+	0x81ff, 0x0de8, 0x080c, 0x3f56, 0x2009, 0x0001, 0x00f6, 0x2079,
+	0x0300, 0x78b8, 0x00fe, 0xd0ec, 0x0110, 0x2009, 0x0011, 0x792a,
+	0x00f8, 0x8001, 0x7002, 0x9184, 0x0880, 0x1140, 0x782c, 0xd0fc,
+	0x1904, 0x3fed, 0x2011, 0x0001, 0x00b1, 0x0090, 0xa010, 0x9092,
+	0x0004, 0x9086, 0x0015, 0x1120, 0xa000, 0xa05a, 0x2011, 0x0031,
+	0xa212, 0xd1dc, 0x1960, 0x0828, 0x782b, 0x0004, 0x7003, 0x0000,
+	0x00ee, 0x00fe, 0x0005, 0xa014, 0x9005, 0x0550, 0x8001, 0x0036,
+	0x0096, 0xa016, 0xa058, 0x2048, 0xa010, 0x2009, 0x0031, 0x911a,
+	0x831c, 0x831c, 0x938a, 0x0007, 0x1a0c, 0x0dd5, 0x9398, 0x4079,
+	0x231d, 0x083f, 0x9080, 0x0004, 0x7a2a, 0x7100, 0x8108, 0x7102,
+	0x009e, 0x003e, 0x908a, 0x0035, 0x1140, 0x0096, 0xa058, 0x2048,
+	0xa804, 0xa05a, 0x2001, 0x0019, 0x009e, 0xa012, 0x9085, 0x0001,
+	0x0005, 0x40b6, 0x40ad, 0x40a4, 0x409b, 0x4092, 0x4089, 0x4080,
+	0xa964, 0x7902, 0xa968, 0x7906, 0xa96c, 0x7912, 0xa970, 0x7916,
+	0x0005, 0xa974, 0x7902, 0xa978, 0x7906, 0xa97c, 0x7912, 0xa980,
+	0x7916, 0x0005, 0xa984, 0x7902, 0xa988, 0x7906, 0xa98c, 0x7912,
+	0xa990, 0x7916, 0x0005, 0xa994, 0x7902, 0xa998, 0x7906, 0xa99c,
+	0x7912, 0xa9a0, 0x7916, 0x0005, 0xa9a4, 0x7902, 0xa9a8, 0x7906,
+	0xa9ac, 0x7912, 0xa9b0, 0x7916, 0x0005, 0xa9b4, 0x7902, 0xa9b8,
+	0x7906, 0xa9bc, 0x7912, 0xa9c0, 0x7916, 0x0005, 0xa9c4, 0x7902,
+	0xa9c8, 0x7906, 0xa9cc, 0x7912, 0xa9d0, 0x7916, 0x0005, 0x00f6,
+	0x00e6, 0x0086, 0x2071, 0x1a66, 0x2079, 0x0090, 0x792c, 0xd1fc,
+	0x01e8, 0x782b, 0x0002, 0x2940, 0x9026, 0x7000, 0x0002, 0x40e6,
+	0x40d2, 0x40dd, 0x8001, 0x7002, 0xd19c, 0x1180, 0x2011, 0x0001,
+	0x080c, 0x404b, 0x190c, 0x404b, 0x0048, 0x8001, 0x7002, 0x782c,
+	0xd0fc, 0x1d38, 0x2011, 0x0001, 0x080c, 0x404b, 0x008e, 0x00ee,
+	0x00fe, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x2061, 0x0200,
+	0x2001, 0x19aa, 0x2004, 0x601a, 0x2061, 0x0100, 0x2001, 0x19a9,
+	0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x2001, 0x002c, 0x2004,
+	0x9005, 0x0520, 0x2038, 0x2001, 0x002e, 0x2024, 0x2001, 0x002f,
+	0x201c, 0x080c, 0x4aa5, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a,
+	0x978a, 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708,
+	0x903e, 0x0096, 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e,
+	0x080c, 0x4162, 0x1d68, 0x2900, 0xa85a, 0x00d0, 0x080c, 0x4aa5,
+	0xa813, 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e,
+	0x2004, 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, 0x2001, 0x002a,
+	0x2004, 0x9084, 0xfff8, 0xa86e, 0x2001, 0x002b, 0x2004, 0xa872,
+	0x2061, 0x0090, 0x2079, 0x0100, 0x2001, 0x19a9, 0x2004, 0x6036,
+	0x2009, 0x0040, 0x080c, 0x23d2, 0x2001, 0x002a, 0x2004, 0x9084,
 	0xfff8, 0x601a, 0x0006, 0x2001, 0x002b, 0x2004, 0x601e, 0x78c6,
-	0x000e, 0x78ca, 0x00ce, 0x00fe, 0x0804, 0x3bf0, 0x001e, 0x00c6,
-	0x2001, 0x032a, 0x2003, 0x0004, 0x2061, 0x0100, 0x6027, 0x0002,
-	0x6106, 0x2011, 0x020d, 0x2013, 0x0020, 0x2001, 0x0004, 0x200c,
-	0x918c, 0xfffd, 0x2102, 0x080c, 0x12e4, 0x7884, 0x9084, 0x0003,
-	0x9086, 0x0002, 0x01a0, 0x2009, 0x0028, 0x080c, 0x2284, 0x2001,
-	0x0227, 0x200c, 0x2102, 0x6050, 0x9084, 0xb7ef, 0x6052, 0x602f,
-	0x0000, 0x604b, 0xf7f7, 0x6043, 0x0090, 0x6043, 0x0010, 0x00ce,
-	0x2d08, 0x2c10, 0x2b18, 0x2b00, 0x9c05, 0x9d05, 0x00fe, 0x00ee,
-	0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x1118, 0x012e,
-	0x0804, 0x33cf, 0x012e, 0x2021, 0x400c, 0x0804, 0x33d1, 0x9085,
-	0x0001, 0x1d04, 0x3d38, 0x2091, 0x6000, 0x8420, 0x9486, 0x0064,
-	0x0005, 0x2001, 0x0105, 0x2003, 0x0010, 0x2001, 0x032a, 0x2003,
-	0x0004, 0x2001, 0x1a60, 0x2003, 0x0000, 0x0071, 0x2009, 0x0048,
-	0x080c, 0x2284, 0x2001, 0x0227, 0x2024, 0x2402, 0x2001, 0x0109,
-	0x2003, 0x4000, 0x9026, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a64,
-	0x7000, 0x9086, 0x0000, 0x0520, 0x2079, 0x0090, 0x2009, 0x0206,
-	0x2104, 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, 0x2009, 0x0040,
-	0x080c, 0x2284, 0x782c, 0xd0fc, 0x0d88, 0x080c, 0x3f71, 0x7000,
-	0x9086, 0x0000, 0x1d58, 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8,
-	0x2009, 0x0040, 0x080c, 0x2284, 0x782b, 0x0002, 0x7003, 0x0000,
-	0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100, 0x2001, 0x1818,
-	0x200c, 0x7932, 0x7936, 0x080c, 0x2739, 0x7850, 0x9084, 0xfbff,
-	0x9085, 0x0030, 0x7852, 0x2019, 0x01f4, 0x8319, 0x1df0, 0x9084,
-	0xffcf, 0x9085, 0x2000, 0x7852, 0x20a9, 0x0046, 0x1d04, 0x3d9e,
-	0x2091, 0x6000, 0x1f04, 0x3d9e, 0x7850, 0x9085, 0x0400, 0x9084,
-	0xdfff, 0x7852, 0x2001, 0x0021, 0x2004, 0x9084, 0x0003, 0x9086,
-	0x0001, 0x1120, 0x7850, 0x9084, 0xdfff, 0x7852, 0x784b, 0xf7f7,
-	0x7843, 0x0090, 0x7843, 0x0010, 0x20a9, 0x0028, 0xa001, 0x1f04,
-	0x3dbe, 0x7850, 0x9085, 0x1400, 0x7852, 0x2019, 0x61a8, 0x7854,
-	0xa001, 0xa001, 0xd08c, 0x1110, 0x8319, 0x1dc8, 0x7827, 0x0048,
-	0x7850, 0x9085, 0x0400, 0x7852, 0x7843, 0x0040, 0x2019, 0x01f4,
-	0xa001, 0xa001, 0x8319, 0x1de0, 0x2001, 0x0100, 0x080c, 0x2ba1,
-	0x7827, 0x0020, 0x7843, 0x0000, 0x9006, 0x080c, 0x2ba1, 0x7827,
-	0x0048, 0x00fe, 0x0005, 0x7884, 0xd0ac, 0x11c8, 0x00f6, 0x00e6,
-	0x2071, 0x1a60, 0x2079, 0x0320, 0x2001, 0x0201, 0x2004, 0x9005,
-	0x0160, 0x7000, 0x9086, 0x0000, 0x1140, 0x0051, 0xd0bc, 0x0108,
-	0x8738, 0x7003, 0x0003, 0x782b, 0x0019, 0x00ee, 0x00fe, 0x0005,
-	0x00f6, 0x2079, 0x0300, 0x78bc, 0x00fe, 0x908c, 0x0070, 0x0178,
-	0x2009, 0x0032, 0x260a, 0x2009, 0x0033, 0x250a, 0xd0b4, 0x0108,
-	0x8c60, 0xd0ac, 0x0108, 0x8d68, 0xd0a4, 0x0108, 0x8b58, 0x0005,
-	0x00f6, 0x2079, 0x0200, 0x781c, 0xd084, 0x0110, 0x7837, 0x0050,
-	0x00fe, 0x0005, 0x00e6, 0x2071, 0x0100, 0x2001, 0x19a8, 0x2004,
-	0x70e2, 0x080c, 0x3b1a, 0x1188, 0x2001, 0x1820, 0x2004, 0x2009,
-	0x181f, 0x210c, 0x918c, 0x00ff, 0x706e, 0x716a, 0x7066, 0x918d,
-	0x3200, 0x7162, 0x7073, 0xe109, 0x0080, 0x702c, 0x9085, 0x0002,
-	0x702e, 0x2009, 0x1818, 0x210c, 0x716e, 0x7063, 0x0100, 0x7166,
-	0x719e, 0x706b, 0x0000, 0x7073, 0x0809, 0x7077, 0x0008, 0x7078,
-	0x9080, 0x0100, 0x707a, 0x7080, 0x8000, 0x7082, 0x7087, 0xaaaa,
-	0x9006, 0x708a, 0x708e, 0x707e, 0x70d6, 0x70ab, 0x0036, 0x70af,
-	0x95d5, 0x7014, 0x9084, 0x1984, 0x9085, 0x0092, 0x7016, 0x080c,
-	0x3f71, 0x00f6, 0x2071, 0x1a60, 0x2079, 0x0320, 0x00d6, 0x2069,
-	0x0000, 0x6884, 0xd0b4, 0x0120, 0x689c, 0x780e, 0x6898, 0x780a,
-	0x00de, 0x2009, 0x03e8, 0x8109, 0x1df0, 0x792c, 0xd1fc, 0x0110,
-	0x782b, 0x0004, 0x2011, 0x0011, 0x080c, 0x3efd, 0x2011, 0x0001,
-	0x080c, 0x3efd, 0x00fe, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x2071,
-	0x1a60, 0x2079, 0x0320, 0x792c, 0xd1fc, 0x0904, 0x3efa, 0x782b,
-	0x0002, 0x9026, 0xd19c, 0x1904, 0x3ef6, 0x7000, 0x0002, 0x3efa,
-	0x3eab, 0x3edb, 0x3ef6, 0xd1bc, 0x1170, 0xd1dc, 0x1190, 0x8001,
-	0x7002, 0x2011, 0x0001, 0x080c, 0x3efd, 0x0904, 0x3efa, 0x080c,
-	0x3efd, 0x0804, 0x3efa, 0x00f6, 0x2079, 0x0300, 0x78bf, 0x0000,
-	0x00fe, 0x7810, 0x7914, 0x782b, 0x0004, 0x7812, 0x7916, 0x2001,
-	0x0201, 0x200c, 0x81ff, 0x0de8, 0x080c, 0x3e08, 0x2009, 0x0001,
-	0x00f6, 0x2079, 0x0300, 0x78b8, 0x00fe, 0xd0ec, 0x0110, 0x2009,
-	0x0011, 0x792a, 0x00f8, 0x8001, 0x7002, 0x9184, 0x0880, 0x1140,
-	0x782c, 0xd0fc, 0x1904, 0x3e9f, 0x2011, 0x0001, 0x00b1, 0x0090,
-	0xa010, 0x9092, 0x0004, 0x9086, 0x0015, 0x1120, 0xa000, 0xa05a,
-	0x2011, 0x0031, 0xa212, 0xd1dc, 0x1960, 0x0828, 0x782b, 0x0004,
-	0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005, 0xa014, 0x9005, 0x0550,
-	0x8001, 0x0036, 0x0096, 0xa016, 0xa058, 0x2048, 0xa010, 0x2009,
-	0x0031, 0x911a, 0x831c, 0x831c, 0x938a, 0x0007, 0x1a0c, 0x0dd5,
-	0x9398, 0x3f2b, 0x231d, 0x083f, 0x9080, 0x0004, 0x7a2a, 0x7100,
-	0x8108, 0x7102, 0x009e, 0x003e, 0x908a, 0x0035, 0x1140, 0x0096,
-	0xa058, 0x2048, 0xa804, 0xa05a, 0x2001, 0x0019, 0x009e, 0xa012,
-	0x9085, 0x0001, 0x0005, 0x3f68, 0x3f5f, 0x3f56, 0x3f4d, 0x3f44,
-	0x3f3b, 0x3f32, 0xa964, 0x7902, 0xa968, 0x7906, 0xa96c, 0x7912,
-	0xa970, 0x7916, 0x0005, 0xa974, 0x7902, 0xa978, 0x7906, 0xa97c,
-	0x7912, 0xa980, 0x7916, 0x0005, 0xa984, 0x7902, 0xa988, 0x7906,
-	0xa98c, 0x7912, 0xa990, 0x7916, 0x0005, 0xa994, 0x7902, 0xa998,
-	0x7906, 0xa99c, 0x7912, 0xa9a0, 0x7916, 0x0005, 0xa9a4, 0x7902,
-	0xa9a8, 0x7906, 0xa9ac, 0x7912, 0xa9b0, 0x7916, 0x0005, 0xa9b4,
-	0x7902, 0xa9b8, 0x7906, 0xa9bc, 0x7912, 0xa9c0, 0x7916, 0x0005,
-	0xa9c4, 0x7902, 0xa9c8, 0x7906, 0xa9cc, 0x7912, 0xa9d0, 0x7916,
-	0x0005, 0x00f6, 0x00e6, 0x0086, 0x2071, 0x1a64, 0x2079, 0x0090,
-	0x792c, 0xd1fc, 0x01e8, 0x782b, 0x0002, 0x2940, 0x9026, 0x7000,
-	0x0002, 0x3f98, 0x3f84, 0x3f8f, 0x8001, 0x7002, 0xd19c, 0x1180,
-	0x2011, 0x0001, 0x080c, 0x3efd, 0x190c, 0x3efd, 0x0048, 0x8001,
-	0x7002, 0x782c, 0xd0fc, 0x1d38, 0x2011, 0x0001, 0x080c, 0x3efd,
-	0x008e, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086,
-	0x2061, 0x0200, 0x2001, 0x19a8, 0x2004, 0x601a, 0x2061, 0x0100,
-	0x2001, 0x19a7, 0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x2001,
-	0x002c, 0x2004, 0x9005, 0x0520, 0x2038, 0x2001, 0x002e, 0x2024,
-	0x2001, 0x002f, 0x201c, 0x080c, 0x489b, 0xa813, 0x0019, 0xaf16,
-	0x2900, 0xa85a, 0x978a, 0x0007, 0x0220, 0x2138, 0x2009, 0x0007,
-	0x0010, 0x2708, 0x903e, 0x0096, 0xa858, 0x2048, 0xa85c, 0x9080,
-	0x0019, 0x009e, 0x080c, 0x4014, 0x1d68, 0x2900, 0xa85a, 0x00d0,
-	0x080c, 0x489b, 0xa813, 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a,
-	0x2001, 0x002e, 0x2004, 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a,
-	0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, 0x2001, 0x002b,
-	0x2004, 0xa872, 0x2061, 0x0090, 0x2079, 0x0100, 0x2001, 0x19a7,
-	0x2004, 0x6036, 0x2009, 0x0040, 0x080c, 0x2284, 0x2001, 0x002a,
-	0x2004, 0x9084, 0xfff8, 0x601a, 0x0006, 0x2001, 0x002b, 0x2004,
-	0x601e, 0x78c6, 0x000e, 0x78ca, 0x9006, 0x600a, 0x600e, 0x008e,
-	0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, 0x2071, 0x0080, 0xaa60,
-	0x22e8, 0x20a0, 0x20e1, 0x0000, 0x2099, 0x0088, 0x702b, 0x0026,
-	0x7402, 0x7306, 0x9006, 0x700a, 0x700e, 0x810b, 0x810b, 0x21a8,
-	0x810b, 0x7112, 0x702b, 0x0041, 0x702c, 0xd0fc, 0x0de8, 0x702b,
-	0x0002, 0x702b, 0x0040, 0x4005, 0x7400, 0x7304, 0x87ff, 0x0190,
-	0x0086, 0x0096, 0x2940, 0x0086, 0x080c, 0x489b, 0x008e, 0xa058,
-	0x00a6, 0x2050, 0x2900, 0xb006, 0xa05a, 0x00ae, 0x009e, 0x008e,
-	0x9085, 0x0001, 0x00ee, 0x0005, 0x00e6, 0x2001, 0x002d, 0x2004,
-	0x9005, 0x0528, 0x2038, 0x2001, 0x0030, 0x2024, 0x2001, 0x0031,
-	0x201c, 0x080c, 0x489b, 0x2940, 0xa813, 0x0019, 0xaf16, 0x2900,
-	0xa85a, 0x978a, 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010,
-	0x2708, 0x903e, 0x0096, 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019,
-	0x009e, 0x080c, 0x4014, 0x1d68, 0x2900, 0xa85a, 0x00d8, 0x080c,
-	0x489b, 0x2940, 0xa013, 0x0019, 0xa017, 0x0001, 0x2800, 0xa05a,
-	0x2001, 0x0030, 0x2004, 0xa066, 0x2001, 0x0031, 0x2004, 0xa06a,
-	0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa06e, 0x2001, 0x002b,
-	0x2004, 0xa072, 0x2001, 0x032a, 0x2003, 0x0004, 0x7884, 0xd0ac,
-	0x1180, 0x2001, 0x0101, 0x200c, 0x918d, 0x0200, 0x2102, 0xa017,
-	0x0000, 0x2001, 0x1a60, 0x2003, 0x0003, 0x2001, 0x032a, 0x2003,
-	0x0009, 0x2001, 0x0300, 0x2003, 0x0000, 0x2001, 0x020d, 0x2003,
-	0x0000, 0x2001, 0x0004, 0x200c, 0x918d, 0x0002, 0x2102, 0x00ee,
-	0x0005, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0007, 0x20a1, 0x1840,
-	0x20e9, 0x0001, 0x9006, 0x4004, 0x20a9, 0x000c, 0x20a1, 0xfff4,
-	0x20e9, 0x0000, 0x9006, 0x4004, 0x2009, 0x013c, 0x200a, 0x012e,
-	0x7880, 0x9086, 0x0052, 0x0108, 0x0005, 0x0804, 0x33cf, 0x7d98,
-	0x7c9c, 0x0804, 0x34c6, 0x080c, 0x54c6, 0x1128, 0x3a00, 0x9084,
-	0x0010, 0x0904, 0x3404, 0x080c, 0x717d, 0x190c, 0x5dbd, 0x6040,
-	0x9084, 0x0020, 0x0971, 0x2069, 0x1847, 0x2d00, 0x2009, 0x0030,
-	0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x080c, 0x48e4,
-	0x701f, 0x40fb, 0x0005, 0x080c, 0x54c6, 0x1130, 0x3b00, 0x3a08,
-	0xc194, 0xc095, 0x20d8, 0x21d0, 0x2069, 0x1847, 0x6800, 0x9005,
-	0x0904, 0x3404, 0x6804, 0xd0ac, 0x0118, 0xd0a4, 0x0904, 0x3404,
-	0xd094, 0x00c6, 0x2061, 0x0100, 0x6104, 0x0138, 0x6200, 0x9292,
-	0x0005, 0x0218, 0x918c, 0xffdf, 0x0010, 0x918d, 0x0020, 0x6106,
-	0x00ce, 0xd08c, 0x00c6, 0x2061, 0x0100, 0x6104, 0x0118, 0x918d,
-	0x0010, 0x0010, 0x918c, 0xffef, 0x6106, 0x00ce, 0xd084, 0x0158,
-	0x6a28, 0x928a, 0x007f, 0x1a04, 0x3404, 0x9288, 0x31d0, 0x210d,
-	0x918c, 0x00ff, 0x6166, 0xd0dc, 0x0130, 0x6828, 0x908a, 0x007f,
-	0x1a04, 0x3404, 0x605e, 0x6888, 0x9084, 0x0030, 0x8004, 0x8004,
-	0x8004, 0x8004, 0x0006, 0x2009, 0x19af, 0x9080, 0x282c, 0x2005,
-	0x200a, 0x000e, 0x2009, 0x19b0, 0x9080, 0x2830, 0x2005, 0x200a,
-	0x6808, 0x908a, 0x0100, 0x0a04, 0x3404, 0x908a, 0x0841, 0x1a04,
-	0x3404, 0x9084, 0x0007, 0x1904, 0x3404, 0x680c, 0x9005, 0x0904,
-	0x3404, 0x6810, 0x9005, 0x0904, 0x3404, 0x6848, 0x6940, 0x910a,
-	0x1a04, 0x3404, 0x8001, 0x0904, 0x3404, 0x684c, 0x6944, 0x910a,
-	0x1a04, 0x3404, 0x8001, 0x0904, 0x3404, 0x2009, 0x197f, 0x200b,
-	0x0000, 0x2001, 0x1869, 0x2004, 0xd0c4, 0x0140, 0x7884, 0x200a,
-	0x2009, 0x017f, 0x200a, 0x3b00, 0xc085, 0x20d8, 0x6814, 0x908c,
-	0x00ff, 0x614e, 0x8007, 0x9084, 0x00ff, 0x6052, 0x080c, 0x7496,
-	0x080c, 0x676d, 0x080c, 0x67a1, 0x6808, 0x602a, 0x080c, 0x21f6,
-	0x2009, 0x0170, 0x200b, 0x0080, 0xa001, 0xa001, 0x200b, 0x0000,
-	0x0036, 0x6b08, 0x080c, 0x2793, 0x003e, 0x6000, 0x9086, 0x0000,
-	0x1904, 0x4292, 0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f,
-	0x8217, 0x831f, 0x6016, 0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4,
-	0x0148, 0x6830, 0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f, 0x8217,
-	0x831f, 0x0010, 0x9084, 0xf0ff, 0x6006, 0x610a, 0x620e, 0x6312,
-	0x8007, 0x810f, 0x8217, 0x831f, 0x20a9, 0x0004, 0x20a1, 0x19b1,
-	0x20e9, 0x0001, 0x4001, 0x20a9, 0x0004, 0x20a1, 0x19cb, 0x20e9,
-	0x0001, 0x4001, 0x080c, 0x837e, 0x00c6, 0x900e, 0x20a9, 0x0001,
-	0x6b70, 0xd384, 0x0510, 0x0068, 0x2009, 0x0100, 0x210c, 0x918e,
-	0x0008, 0x1110, 0x839d, 0x0010, 0x83f5, 0x3e18, 0x12b0, 0x3508,
-	0x8109, 0x080c, 0x7a4c, 0x6878, 0x6016, 0x6874, 0x2008, 0x9084,
-	0xff00, 0x8007, 0x600a, 0x9184, 0x00ff, 0x6006, 0x8108, 0x1118,
-	0x6003, 0x0003, 0x0010, 0x6003, 0x0001, 0x1f04, 0x41ec, 0x00ce,
-	0x00c6, 0x2061, 0x199a, 0x6a88, 0x9284, 0xc000, 0x2010, 0x9286,
-	0x0000, 0x1158, 0x2063, 0x0000, 0x2001, 0x0001, 0x080c, 0x2a3a,
-	0x2001, 0x0001, 0x080c, 0x2a1d, 0x0088, 0x9286, 0x4000, 0x1148,
-	0x2063, 0x0001, 0x9006, 0x080c, 0x2a3a, 0x9006, 0x080c, 0x2a1d,
-	0x0028, 0x9286, 0x8000, 0x1d30, 0x2063, 0x0002, 0x00ce, 0x6888,
-	0xd0ec, 0x0130, 0x2011, 0x0114, 0x2204, 0x9085, 0x0100, 0x2012,
-	0x6a80, 0x9284, 0x0030, 0x9086, 0x0030, 0x1128, 0x9294, 0xffcf,
-	0x9295, 0x0020, 0x6a82, 0x2001, 0x197c, 0x6a80, 0x9294, 0x0030,
-	0x928e, 0x0000, 0x0170, 0x928e, 0x0010, 0x0118, 0x928e, 0x0020,
-	0x0140, 0x2003, 0xaaaa, 0x080c, 0x2808, 0x2001, 0x196d, 0x2102,
-	0x0008, 0x2102, 0x00c6, 0x2061, 0x0100, 0x602f, 0x0040, 0x602f,
-	0x0000, 0x00ce, 0x080c, 0x717d, 0x0128, 0x080c, 0x4dd2, 0x0110,
-	0x080c, 0x2759, 0x60d4, 0x9005, 0x01c0, 0x6003, 0x0001, 0x2009,
-	0x427a, 0x00e0, 0x080c, 0x717d, 0x1168, 0x2011, 0x7013, 0x080c,
-	0x8285, 0x2011, 0x7006, 0x080c, 0x835c, 0x080c, 0x746a, 0x080c,
-	0x70af, 0x0040, 0x080c, 0x5cb7, 0x0028, 0x6003, 0x0004, 0x2009,
-	0x4292, 0x0020, 0x080c, 0x66a2, 0x0804, 0x33cf, 0x2001, 0x0170,
-	0x2004, 0x9084, 0x00ff, 0x9086, 0x004c, 0x1118, 0x2091, 0x30bd,
-	0x0817, 0x2091, 0x303d, 0x0817, 0x6000, 0x9086, 0x0000, 0x0904,
-	0x3401, 0x2069, 0x1847, 0x7890, 0x6842, 0x7894, 0x6846, 0x2d00,
-	0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001,
-	0x0804, 0x48e7, 0x9006, 0x080c, 0x2759, 0x81ff, 0x1904, 0x3401,
-	0x080c, 0x717d, 0x11b0, 0x080c, 0x7465, 0x080c, 0x5df8, 0x080c,
-	0x31c4, 0x0118, 0x6130, 0xc18d, 0x6132, 0x080c, 0xcf18, 0x0130,
-	0x080c, 0x71a0, 0x1118, 0x080c, 0x7155, 0x0038, 0x080c, 0x70af,
-	0x0020, 0x080c, 0x5dbd, 0x080c, 0x5cb7, 0x0804, 0x33cf, 0x81ff,
-	0x1904, 0x3401, 0x080c, 0x717d, 0x1110, 0x0804, 0x3401, 0x6194,
-	0x81ff, 0x01a8, 0x704f, 0x0000, 0x2001, 0x1c80, 0x2009, 0x0040,
-	0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0126, 0x2091, 0x8000, 0x2039,
-	0x0001, 0x080c, 0x48e7, 0x701f, 0x33cd, 0x012e, 0x0005, 0x704f,
-	0x0001, 0x00d6, 0x2069, 0x1c80, 0x20a9, 0x0040, 0x20e9, 0x0001,
-	0x20a1, 0x1c80, 0x2019, 0xffff, 0x4304, 0x655c, 0x9588, 0x31d0,
-	0x210d, 0x918c, 0x00ff, 0x216a, 0x900e, 0x2011, 0x0002, 0x2100,
-	0x9506, 0x01a8, 0x080c, 0x63cd, 0x1190, 0xb814, 0x821c, 0x0238,
-	0x9398, 0x1c80, 0x9085, 0xff00, 0x8007, 0x201a, 0x0038, 0x9398,
-	0x1c80, 0x2324, 0x94a4, 0xff00, 0x9405, 0x201a, 0x8210, 0x8108,
-	0x9182, 0x0080, 0x1208, 0x0c18, 0x8201, 0x8007, 0x2d0c, 0x9105,
-	0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1, 0x1c80, 0x2099, 0x1c80,
-	0x080c, 0x5d48, 0x0804, 0x42ec, 0x080c, 0x48ce, 0x0904, 0x3404,
-	0x080c, 0x489b, 0x1120, 0x2009, 0x0002, 0x0804, 0x3401, 0x080c,
-	0x54b7, 0xd0b4, 0x0558, 0x7884, 0x908e, 0x007e, 0x0538, 0x908e,
-	0x007f, 0x0520, 0x908e, 0x0080, 0x0508, 0x080c, 0x31bf, 0x1148,
-	0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006,
-	0x11a8, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xc9e7,
-	0x1120, 0x2009, 0x0003, 0x0804, 0x3401, 0x7007, 0x0003, 0x701f,
-	0x437a, 0x0005, 0x080c, 0x48ce, 0x0904, 0x3404, 0x20a9, 0x002b,
-	0xb8c4, 0x20e0, 0xb8c8, 0x2098, 0xa860, 0x20e8, 0xa85c, 0x9080,
-	0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080, 0x0006, 0x20a0,
-	0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0f7d,
-	0x0070, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x000a, 0x20a0, 0xb8c4,
-	0x20e0, 0xb8c8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0f7d, 0x8906,
-	0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002,
-	0x2009, 0x002b, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x48e7,
-	0x81ff, 0x1904, 0x3401, 0x080c, 0x48b2, 0x0904, 0x3404, 0x080c,
-	0x653f, 0x0904, 0x3401, 0x0058, 0xa878, 0x9005, 0x0120, 0x2009,
-	0x0004, 0x0804, 0x3401, 0xa974, 0xaa94, 0x0804, 0x33cf, 0x080c,
-	0x54bf, 0x0904, 0x33cf, 0x701f, 0x43c4, 0x7007, 0x0003, 0x0005,
-	0x81ff, 0x1904, 0x3401, 0x7888, 0x908a, 0x1000, 0x1a04, 0x3404,
-	0x080c, 0x48ce, 0x0904, 0x3404, 0x080c, 0x6737, 0x0120, 0x080c,
-	0x673f, 0x1904, 0x3404, 0x080c, 0x65c4, 0x0904, 0x3401, 0x2019,
-	0x0004, 0x900e, 0x080c, 0x6551, 0x0904, 0x3401, 0x7984, 0x7a88,
-	0x04c9, 0x08a8, 0xa89c, 0x908a, 0x1000, 0x12f8, 0x080c, 0x48cc,
-	0x01e0, 0x080c, 0x6737, 0x0118, 0x080c, 0x673f, 0x11b0, 0x080c,
-	0x65c4, 0x2009, 0x0002, 0x0168, 0x2009, 0x0002, 0x2019, 0x0004,
-	0x080c, 0x6551, 0x2009, 0x0003, 0x0120, 0xa998, 0xaa9c, 0x00d1,
-	0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e,
-	0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x080c,
-	0x54bf, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001,
-	0x0000, 0x0005, 0x9186, 0x00ff, 0x0110, 0x0071, 0x0060, 0x2029,
-	0x007e, 0x2061, 0x1800, 0x645c, 0x2400, 0x9506, 0x0110, 0x2508,
-	0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c, 0x63cd, 0x1138, 0x2200,
-	0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x8293, 0x0005, 0x81ff,
-	0x1904, 0x3401, 0x080c, 0x48b2, 0x0904, 0x3404, 0x080c, 0x6494,
-	0x0904, 0x3401, 0x080c, 0x6548, 0x0904, 0x3401, 0x0804, 0x43cf,
-	0x81ff, 0x1904, 0x3401, 0x080c, 0x48b2, 0x0904, 0x3404, 0x080c,
-	0x6737, 0x0120, 0x080c, 0x673f, 0x1904, 0x3404, 0x080c, 0x6494,
-	0x0904, 0x3401, 0x080c, 0x6536, 0x0904, 0x3401, 0x0804, 0x43cf,
-	0x6100, 0x0804, 0x33cf, 0x080c, 0x48ce, 0x0904, 0x3404, 0x080c,
-	0x54cb, 0x1904, 0x3401, 0x79a8, 0xd184, 0x1158, 0xb834, 0x8007,
-	0x789e, 0xb830, 0x8007, 0x789a, 0xbb2c, 0x831f, 0xba28, 0x8217,
-	0x0050, 0xb824, 0x8007, 0x789e, 0xb820, 0x8007, 0x789a, 0xbb1c,
-	0x831f, 0xba18, 0x8217, 0xb900, 0x918c, 0x0200, 0x0804, 0x33cf,
-	0x78a8, 0x909c, 0x0003, 0xd0b4, 0x1140, 0x939a, 0x0003, 0x1a04,
-	0x3401, 0x625c, 0x7884, 0x9206, 0x1548, 0x080c, 0x8368, 0x2001,
-	0xfff4, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039,
-	0x0000, 0x0006, 0x78a8, 0x9084, 0x0080, 0x1118, 0x000e, 0x0804,
-	0x48e7, 0x000e, 0x2031, 0x0000, 0x2061, 0x18b8, 0x2c44, 0xa66a,
-	0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c,
-	0x10e0, 0x7007, 0x0002, 0x701f, 0x44f6, 0x0005, 0x81ff, 0x1904,
-	0x3401, 0x080c, 0x48ce, 0x0904, 0x3404, 0x080c, 0x6737, 0x1904,
-	0x3401, 0x00c6, 0x080c, 0x489b, 0x00ce, 0x0904, 0x3401, 0xa867,
-	0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7ea8, 0x080c, 0xc98d, 0x0904,
-	0x3401, 0x7007, 0x0003, 0x701f, 0x44fa, 0x0005, 0x080c, 0x40b9,
-	0x0804, 0x33cf, 0xa830, 0x9086, 0x0100, 0x0904, 0x3401, 0x8906,
-	0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b,
-	0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x48e7,
-	0x9006, 0x080c, 0x2759, 0x78a8, 0x9084, 0x00ff, 0x9086, 0x00ff,
-	0x0118, 0x81ff, 0x1904, 0x3401, 0x080c, 0x717d, 0x0110, 0x080c,
-	0x5dbd, 0x7888, 0x908a, 0x1000, 0x1a04, 0x3404, 0x7984, 0x9186,
-	0x00ff, 0x0138, 0x9182, 0x007f, 0x1a04, 0x3404, 0x2100, 0x080c,
-	0x2723, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2061, 0x19f8,
-	0x601b, 0x0000, 0x601f, 0x0000, 0x6073, 0x0000, 0x6077, 0x0000,
-	0x080c, 0x717d, 0x1158, 0x080c, 0x7465, 0x080c, 0x5df8, 0x9085,
-	0x0001, 0x080c, 0x71c4, 0x080c, 0x70af, 0x00d0, 0x080c, 0xaadc,
-	0x2061, 0x0100, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, 0x810f,
-	0x9105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x1997,
-	0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x5ce3, 0x080c, 0x831a,
-	0x7984, 0x080c, 0x717d, 0x1110, 0x2009, 0x00ff, 0x7a88, 0x080c,
-	0x4432, 0x012e, 0x00ce, 0x002e, 0x0804, 0x33cf, 0x7984, 0x080c,
-	0x636c, 0x2b08, 0x1904, 0x3404, 0x0804, 0x33cf, 0x81ff, 0x0120,
-	0x2009, 0x0001, 0x0804, 0x3401, 0x60dc, 0xd0ac, 0x1130, 0xd09c,
-	0x1120, 0x2009, 0x0005, 0x0804, 0x3401, 0x080c, 0x489b, 0x1120,
-	0x2009, 0x0002, 0x0804, 0x3401, 0x7984, 0x9192, 0x0021, 0x1a04,
-	0x3404, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019,
-	0x702a, 0xaf60, 0x7736, 0x080c, 0x48e4, 0x701f, 0x45ae, 0x7880,
-	0x9086, 0x006e, 0x0110, 0x701f, 0x4f84, 0x0005, 0x2009, 0x0080,
-	0x080c, 0x63cd, 0x1118, 0x080c, 0x6737, 0x0120, 0x2021, 0x400a,
-	0x0804, 0x33d1, 0x00d6, 0x0096, 0xa964, 0xaa6c, 0xab70, 0xac74,
-	0xad78, 0xae7c, 0xa884, 0x90be, 0x0100, 0x0904, 0x4647, 0x90be,
-	0x0112, 0x0904, 0x4647, 0x90be, 0x0113, 0x0904, 0x4647, 0x90be,
-	0x0114, 0x0904, 0x4647, 0x90be, 0x0117, 0x0904, 0x4647, 0x90be,
-	0x011a, 0x0904, 0x4647, 0x90be, 0x011c, 0x0904, 0x4647, 0x90be,
-	0x0121, 0x0904, 0x462e, 0x90be, 0x0131, 0x0904, 0x462e, 0x90be,
-	0x0171, 0x0904, 0x4647, 0x90be, 0x0173, 0x0904, 0x4647, 0x90be,
-	0x01a1, 0x1128, 0xa894, 0x8007, 0xa896, 0x0804, 0x4652, 0x90be,
-	0x0212, 0x0904, 0x463b, 0x90be, 0x0213, 0x05e8, 0x90be, 0x0214,
-	0x0500, 0x90be, 0x0217, 0x0188, 0x90be, 0x021a, 0x1120, 0xa89c,
-	0x8007, 0xa89e, 0x04e0, 0x90be, 0x021f, 0x05c8, 0x90be, 0x0300,
-	0x05b0, 0x009e, 0x00de, 0x0804, 0x3404, 0x7028, 0x9080, 0x0010,
-	0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0007, 0x080c,
-	0x4690, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0, 0x7034, 0x20e0,
-	0x20e8, 0x20a9, 0x0001, 0x080c, 0x4690, 0x00c8, 0x7028, 0x9080,
-	0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001,
-	0x080c, 0x469d, 0x00b8, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0,
-	0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x469d, 0x7028,
-	0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9,
-	0x0001, 0x04f1, 0x00c6, 0x080c, 0x489b, 0x0550, 0xa868, 0xc0fd,
-	0xa86a, 0xa867, 0x0119, 0x9006, 0xa882, 0xa87f, 0x0020, 0xa88b,
-	0x0001, 0x810b, 0xa9ae, 0xa8b2, 0xaab6, 0xabba, 0xacbe, 0xadc2,
-	0xa9c6, 0xa8ca, 0x00ce, 0x009e, 0x00de, 0xa866, 0xa822, 0xa868,
-	0xc0fd, 0xa86a, 0xa804, 0x2048, 0x080c, 0xc9a8, 0x1120, 0x2009,
-	0x0003, 0x0804, 0x3401, 0x7007, 0x0003, 0x701f, 0x4687, 0x0005,
-	0x00ce, 0x009e, 0x00de, 0x2009, 0x0002, 0x0804, 0x3401, 0xa820,
-	0x9086, 0x8001, 0x1904, 0x33cf, 0x2009, 0x0004, 0x0804, 0x3401,
-	0x0016, 0x0026, 0x3510, 0x20a9, 0x0002, 0x4002, 0x4104, 0x4004,
-	0x8211, 0x1dc8, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x0036,
-	0x0046, 0x3520, 0x20a9, 0x0004, 0x4002, 0x4304, 0x4204, 0x4104,
-	0x4004, 0x8421, 0x1db8, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005,
-	0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3401, 0x60dc, 0xd0ac,
-	0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x3401, 0x7984,
-	0x78a8, 0x2040, 0x080c, 0xaad5, 0x1120, 0x9182, 0x007f, 0x0a04,
-	0x3404, 0x9186, 0x00ff, 0x0904, 0x3404, 0x9182, 0x0800, 0x1a04,
-	0x3404, 0x7a8c, 0x7b88, 0x607c, 0x9306, 0x1140, 0x6080, 0x924e,
-	0x0904, 0x3404, 0x99cc, 0xff00, 0x0904, 0x3404, 0x0126, 0x2091,
-	0x8000, 0x080c, 0x47ae, 0x0904, 0x472e, 0x0086, 0x90c6, 0x4000,
-	0x008e, 0x1538, 0x00c6, 0x0006, 0x0036, 0xb818, 0xbb1c, 0x9305,
-	0xbb20, 0x9305, 0xbb24, 0x9305, 0xbb28, 0x9305, 0xbb2c, 0x9305,
-	0xbb30, 0x9305, 0xbb34, 0x9305, 0x003e, 0x0570, 0xd88c, 0x1128,
-	0x080c, 0x6737, 0x0110, 0xc89d, 0x0438, 0x900e, 0x080c, 0x65ed,
-	0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x000e, 0x00ce,
-	0x00b8, 0x90c6, 0x4007, 0x1110, 0x2408, 0x0090, 0x90c6, 0x4008,
-	0x1118, 0x2708, 0x2610, 0x0060, 0x90c6, 0x4009, 0x1108, 0x0040,
-	0x90c6, 0x4006, 0x1108, 0x0020, 0x2001, 0x4005, 0x2009, 0x000a,
-	0x2020, 0x012e, 0x0804, 0x33d1, 0x000e, 0x00ce, 0x2b00, 0x7026,
-	0x0016, 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c, 0xabb9, 0x0904,
-	0x4783, 0x2b00, 0x6012, 0x080c, 0xcc93, 0x2e58, 0x00ee, 0x00e6,
-	0x00c6, 0x080c, 0x489b, 0x00ce, 0x2b70, 0x1158, 0x080c, 0xab6b,
-	0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x2009, 0x0002, 0x0804,
-	0x3401, 0x900e, 0xa966, 0xa96a, 0x2900, 0x6016, 0xa932, 0xa868,
-	0xc0fd, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0xd89c, 0x1110, 0x080c,
-	0x306e, 0x6023, 0x0001, 0x9006, 0x080c, 0x6309, 0xd89c, 0x0138,
-	0x2001, 0x0004, 0x080c, 0x631d, 0x2009, 0x0003, 0x0030, 0x2001,
-	0x0002, 0x080c, 0x631d, 0x2009, 0x0002, 0x080c, 0xabe6, 0x78a8,
-	0xd094, 0x0138, 0x00ee, 0x7024, 0x00e6, 0x2058, 0xb8cc, 0xc08d,
-	0xb8ce, 0x9085, 0x0001, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e,
-	0x1120, 0x2009, 0x0003, 0x0804, 0x3401, 0x7007, 0x0003, 0x701f,
-	0x4792, 0x0005, 0xa830, 0x9086, 0x0100, 0x7024, 0x2058, 0x1138,
-	0x2009, 0x0004, 0xba04, 0x9294, 0x00ff, 0x0804, 0x5414, 0x900e,
-	0xa868, 0xd0f4, 0x1904, 0x33cf, 0x080c, 0x65ed, 0x1108, 0xc185,
-	0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x33cf, 0x00e6, 0x00d6,
-	0x0096, 0x83ff, 0x0904, 0x47fd, 0x902e, 0x080c, 0xaad5, 0x0130,
-	0x9026, 0x20a9, 0x0800, 0x2071, 0x1000, 0x0030, 0x2021, 0x007f,
-	0x20a9, 0x0781, 0x2071, 0x107f, 0x2e04, 0x9005, 0x11b8, 0x2100,
-	0x9406, 0x1904, 0x480e, 0x2428, 0x94ce, 0x007f, 0x1120, 0x92ce,
-	0xfffd, 0x1558, 0x0030, 0x94ce, 0x0080, 0x1130, 0x92ce, 0xfffc,
-	0x1520, 0x93ce, 0x00ff, 0x1508, 0xc5fd, 0x0480, 0x2058, 0xbf10,
-	0x2700, 0x9306, 0x11e8, 0xbe14, 0x2600, 0x9206, 0x11c8, 0x2400,
-	0x9106, 0x1180, 0xd884, 0x0598, 0xd894, 0x1588, 0x080c, 0x66d7,
-	0x1570, 0x2001, 0x4000, 0x0460, 0x080c, 0x6737, 0x1540, 0x2001,
-	0x4000, 0x0430, 0x2001, 0x4007, 0x0418, 0x2001, 0x4006, 0x0400,
-	0x2400, 0x9106, 0x1158, 0xbe14, 0x87ff, 0x1128, 0x86ff, 0x0918,
-	0x080c, 0xaad5, 0x1900, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70,
-	0x1f04, 0x47c4, 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001,
-	0x0001, 0x0030, 0x080c, 0x636c, 0x1dd0, 0xbb12, 0xba16, 0x9006,
-	0x9005, 0x009e, 0x00de, 0x00ee, 0x0005, 0x81ff, 0x0120, 0x2009,
-	0x0001, 0x0804, 0x3401, 0x080c, 0x489b, 0x1120, 0x2009, 0x0002,
-	0x0804, 0x3401, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7884,
-	0x9005, 0x0904, 0x3404, 0x9096, 0x00ff, 0x0120, 0x9092, 0x0004,
-	0x1a04, 0x3404, 0x2010, 0x2918, 0x080c, 0x3014, 0x1120, 0x2009,
-	0x0003, 0x0804, 0x3401, 0x7007, 0x0003, 0x701f, 0x4850, 0x0005,
-	0xa830, 0x9086, 0x0100, 0x1904, 0x33cf, 0x2009, 0x0004, 0x0804,
-	0x3401, 0x7984, 0x080c, 0xaad5, 0x1120, 0x9182, 0x007f, 0x0a04,
-	0x3404, 0x9186, 0x00ff, 0x0904, 0x3404, 0x9182, 0x0800, 0x1a04,
-	0x3404, 0x2001, 0x9000, 0x080c, 0x546f, 0x1904, 0x3401, 0x0804,
-	0x33cf, 0xa998, 0x080c, 0xaad5, 0x1118, 0x9182, 0x007f, 0x0280,
-	0x9186, 0x00ff, 0x0168, 0x9182, 0x0800, 0x1250, 0x2001, 0x9000,
-	0x080c, 0x546f, 0x11a8, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010,
-	0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005,
-	0xa897, 0x4000, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005,
-	0x2009, 0x000a, 0x0c48, 0x080c, 0x1000, 0x0198, 0x9006, 0xa802,
-	0x7014, 0x9005, 0x1120, 0x2900, 0x7016, 0x701a, 0x0040, 0x7018,
-	0xa802, 0x0086, 0x2040, 0x2900, 0xa006, 0x701a, 0x008e, 0x9085,
-	0x0001, 0x0005, 0x7984, 0x080c, 0x63cd, 0x1130, 0x7e88, 0x9684,
-	0x3fff, 0x9082, 0x4000, 0x0208, 0x905e, 0x8bff, 0x0005, 0xa998,
-	0x080c, 0x63cd, 0x1130, 0xae9c, 0x9684, 0x3fff, 0x9082, 0x4000,
-	0x0208, 0x905e, 0x8bff, 0x0005, 0xae98, 0x0008, 0x7e84, 0x2608,
-	0x080c, 0x63cd, 0x1108, 0x0008, 0x905e, 0x8bff, 0x0005, 0x0016,
-	0x7114, 0x81ff, 0x0128, 0x2148, 0xa904, 0x080c, 0x1032, 0x0cc8,
-	0x7116, 0x711a, 0x001e, 0x0005, 0x2031, 0x0001, 0x0010, 0x2031,
-	0x0000, 0x2061, 0x18b8, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076,
-	0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x10e0, 0x7007, 0x0002,
-	0x701f, 0x33cf, 0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079,
-	0x0000, 0x2001, 0x18b0, 0x2004, 0x9005, 0x1190, 0x0e04, 0x4918,
-	0x7a36, 0x7833, 0x0012, 0x7a82, 0x7b86, 0x7c8a, 0x2091, 0x4080,
-	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1192, 0x0804, 0x497e,
-	0x0016, 0x0086, 0x0096, 0x00c6, 0x00e6, 0x2071, 0x189e, 0x7044,
-	0x9005, 0x1540, 0x7148, 0x9182, 0x0010, 0x0288, 0x7038, 0x2060,
-	0x080c, 0x1000, 0x0904, 0x4976, 0xa84b, 0x0000, 0x2900, 0x7046,
-	0x2001, 0x0002, 0x9080, 0x1f4a, 0x2005, 0xa846, 0x0098, 0x7038,
-	0x90e0, 0x0004, 0x2001, 0x18ba, 0x9c82, 0x18fa, 0x0210, 0x2061,
-	0x18ba, 0x2c00, 0x703a, 0x7148, 0x81ff, 0x1108, 0x703e, 0x8108,
-	0x714a, 0x0460, 0x7148, 0x8108, 0x714a, 0x7044, 0x2040, 0xa144,
-	0x2105, 0x0016, 0x908a, 0x0036, 0x1a0c, 0x0dd5, 0x2060, 0x001e,
-	0x8108, 0x2105, 0x9005, 0xa146, 0x1520, 0x080c, 0x1000, 0x1130,
-	0x8109, 0xa946, 0x7148, 0x8109, 0x714a, 0x00d8, 0x9006, 0xa806,
-	0xa84a, 0xa046, 0x2800, 0xa802, 0x2900, 0xa006, 0x7046, 0x2001,
-	0x0002, 0x9080, 0x1f4a, 0x2005, 0xa846, 0x0058, 0x2262, 0x6306,
-	0x640a, 0x00ee, 0x00ce, 0x009e, 0x008e, 0x001e, 0x012e, 0x00fe,
-	0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, 0x49a0, 0x49a0, 0x49a2,
-	0x49a0, 0x49a0, 0x49a0, 0x49a6, 0x49a0, 0x49a0, 0x49a0, 0x49aa,
-	0x49a0, 0x49a0, 0x49a0, 0x49ae, 0x49a0, 0x49a0, 0x49a0, 0x49b2,
-	0x49a0, 0x49a0, 0x49a0, 0x49b6, 0x49a0, 0x49a0, 0x49a0, 0x49bb,
-	0x080c, 0x0dd5, 0xa276, 0xa37a, 0xa47e, 0x0898, 0xa286, 0xa38a,
-	0xa48e, 0x0878, 0xa296, 0xa39a, 0xa49e, 0x0858, 0xa2a6, 0xa3aa,
-	0xa4ae, 0x0838, 0xa2b6, 0xa3ba, 0xa4be, 0x0818, 0xa2c6, 0xa3ca,
-	0xa4ce, 0x0804, 0x4979, 0xa2d6, 0xa3da, 0xa4de, 0x0804, 0x4979,
-	0x00e6, 0x2071, 0x189e, 0x7048, 0x9005, 0x0904, 0x4a52, 0x0126,
-	0x2091, 0x8000, 0x0e04, 0x4a51, 0x00f6, 0x2079, 0x0000, 0x00c6,
-	0x0096, 0x0086, 0x0076, 0x9006, 0x2038, 0x7040, 0x2048, 0x9005,
-	0x0500, 0xa948, 0x2105, 0x0016, 0x908a, 0x0036, 0x1a0c, 0x0dd5,
-	0x2060, 0x001e, 0x8108, 0x2105, 0x9005, 0xa94a, 0x1904, 0x4a54,
-	0xa804, 0x9005, 0x090c, 0x0dd5, 0x7042, 0x2938, 0x2040, 0xa003,
-	0x0000, 0x2001, 0x0002, 0x9080, 0x1f4a, 0x2005, 0xa04a, 0x0804,
-	0x4a54, 0x703c, 0x2060, 0x2c14, 0x6304, 0x6408, 0x650c, 0x2200,
-	0x7836, 0x7833, 0x0012, 0x7882, 0x2300, 0x7886, 0x2400, 0x788a,
-	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1192,
-	0x87ff, 0x0118, 0x2748, 0x080c, 0x1032, 0x7048, 0x8001, 0x704a,
-	0x9005, 0x1170, 0x7040, 0x2048, 0x9005, 0x0128, 0x080c, 0x1032,
-	0x9006, 0x7042, 0x7046, 0x703b, 0x18ba, 0x703f, 0x18ba, 0x0420,
-	0x7040, 0x9005, 0x1508, 0x7238, 0x2c00, 0x9206, 0x0148, 0x9c80,
-	0x0004, 0x90fa, 0x18fa, 0x0210, 0x2001, 0x18ba, 0x703e, 0x00a0,
-	0x9006, 0x703e, 0x703a, 0x7044, 0x9005, 0x090c, 0x0dd5, 0x2048,
-	0xa800, 0x9005, 0x1de0, 0x2900, 0x7042, 0x2001, 0x0002, 0x9080,
-	0x1f4a, 0x2005, 0xa84a, 0x0000, 0x007e, 0x008e, 0x009e, 0x00ce,
-	0x00fe, 0x012e, 0x00ee, 0x0005, 0x2c00, 0x9082, 0x001b, 0x0002,
-	0x4a73, 0x4a73, 0x4a75, 0x4a73, 0x4a73, 0x4a73, 0x4a7a, 0x4a73,
-	0x4a73, 0x4a73, 0x4a7f, 0x4a73, 0x4a73, 0x4a73, 0x4a84, 0x4a73,
-	0x4a73, 0x4a73, 0x4a89, 0x4a73, 0x4a73, 0x4a73, 0x4a8e, 0x4a73,
-	0x4a73, 0x4a73, 0x4a93, 0x080c, 0x0dd5, 0xaa74, 0xab78, 0xac7c,
-	0x0804, 0x49ff, 0xaa84, 0xab88, 0xac8c, 0x0804, 0x49ff, 0xaa94,
-	0xab98, 0xac9c, 0x0804, 0x49ff, 0xaaa4, 0xaba8, 0xacac, 0x0804,
-	0x49ff, 0xaab4, 0xabb8, 0xacbc, 0x0804, 0x49ff, 0xaac4, 0xabc8,
-	0xaccc, 0x0804, 0x49ff, 0xaad4, 0xabd8, 0xacdc, 0x0804, 0x49ff,
-	0x0016, 0x0026, 0x0036, 0x00b6, 0x00c6, 0x2009, 0x007e, 0x080c,
-	0x63cd, 0x2019, 0x0001, 0xb85c, 0xd0ac, 0x0110, 0x2019, 0x0000,
-	0x2011, 0x801b, 0x080c, 0x48fb, 0x00ce, 0x00be, 0x003e, 0x002e,
-	0x001e, 0x0005, 0x0026, 0x080c, 0x54b7, 0xd0c4, 0x0120, 0x2011,
-	0x8014, 0x080c, 0x48fb, 0x002e, 0x0005, 0x81ff, 0x1904, 0x3401,
-	0x0126, 0x2091, 0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032,
-	0x080c, 0x717d, 0x1158, 0x080c, 0x7465, 0x080c, 0x5df8, 0x9085,
-	0x0001, 0x080c, 0x71c4, 0x080c, 0x70af, 0x0010, 0x080c, 0x5cb7,
-	0x012e, 0x0804, 0x33cf, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804,
-	0x3401, 0x080c, 0x54cb, 0x0120, 0x2009, 0x0007, 0x0804, 0x3401,
-	0x080c, 0x672f, 0x0120, 0x2009, 0x0008, 0x0804, 0x3401, 0x080c,
-	0x31bf, 0x0128, 0x7984, 0x080c, 0x636c, 0x1904, 0x3404, 0x080c,
-	0x48ce, 0x0904, 0x3404, 0x2b00, 0x7026, 0x080c, 0x6737, 0x7888,
-	0x1170, 0x9084, 0x0005, 0x1158, 0x900e, 0x080c, 0x65ed, 0x1108,
-	0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x33cf, 0x080c,
-	0x489b, 0x0904, 0x3401, 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd,
-	0xa86a, 0x080c, 0xca41, 0x0904, 0x3401, 0x7888, 0xd094, 0x0118,
-	0xb8cc, 0xc08d, 0xb8ce, 0x7007, 0x0003, 0x701f, 0x4b74, 0x0005,
-	0x2061, 0x1800, 0x080c, 0x54cb, 0x2009, 0x0007, 0x1578, 0x080c,
-	0x672f, 0x0118, 0x2009, 0x0008, 0x0448, 0x080c, 0x31bf, 0x0120,
-	0xa998, 0x080c, 0x636c, 0x1530, 0x080c, 0x48cc, 0x0518, 0x080c,
-	0x6737, 0xa89c, 0x1168, 0x9084, 0x0005, 0x1150, 0x900e, 0x080c,
-	0x65ed, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x00d0,
-	0xa868, 0xc0fc, 0xa86a, 0x080c, 0xca41, 0x11e0, 0xa89c, 0xd094,
-	0x0118, 0xb8cc, 0xc08d, 0xb8ce, 0x2009, 0x0003, 0xa897, 0x4005,
+	0x000e, 0x78ca, 0x9006, 0x600a, 0x600e, 0x008e, 0x00ce, 0x00ee,
+	0x00fe, 0x0005, 0x00e6, 0x2071, 0x0080, 0xaa60, 0x22e8, 0x20a0,
+	0x20e1, 0x0000, 0x2099, 0x0088, 0x702b, 0x0026, 0x7402, 0x7306,
+	0x9006, 0x700a, 0x700e, 0x810b, 0x810b, 0x21a8, 0x810b, 0x7112,
+	0x702b, 0x0041, 0x702c, 0xd0fc, 0x0de8, 0x702b, 0x0002, 0x702b,
+	0x0040, 0x4005, 0x7400, 0x7304, 0x87ff, 0x0190, 0x0086, 0x0096,
+	0x2940, 0x0086, 0x080c, 0x4aa5, 0x008e, 0xa058, 0x00a6, 0x2050,
+	0x2900, 0xb006, 0xa05a, 0x00ae, 0x009e, 0x008e, 0x9085, 0x0001,
+	0x00ee, 0x0005, 0x00e6, 0x2001, 0x002d, 0x2004, 0x9005, 0x0528,
+	0x2038, 0x2001, 0x0030, 0x2024, 0x2001, 0x0031, 0x201c, 0x080c,
+	0x4aa5, 0x2940, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a,
+	0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e,
+	0x0096, 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c,
+	0x4162, 0x1d68, 0x2900, 0xa85a, 0x00d8, 0x080c, 0x4aa5, 0x2940,
+	0xa013, 0x0019, 0xa017, 0x0001, 0x2800, 0xa05a, 0x2001, 0x0030,
+	0x2004, 0xa066, 0x2001, 0x0031, 0x2004, 0xa06a, 0x2001, 0x002a,
+	0x2004, 0x9084, 0xfff8, 0xa06e, 0x2001, 0x002b, 0x2004, 0xa072,
+	0x2001, 0x032a, 0x2003, 0x0004, 0x7884, 0xd0ac, 0x1180, 0x2001,
+	0x0101, 0x200c, 0x918d, 0x0200, 0x2102, 0xa017, 0x0000, 0x2001,
+	0x1a62, 0x2003, 0x0003, 0x2001, 0x032a, 0x2003, 0x0009, 0x2001,
+	0x0300, 0x2003, 0x0000, 0x2001, 0x020d, 0x2003, 0x0000, 0x2001,
+	0x0004, 0x200c, 0x918d, 0x0002, 0x2102, 0x00ee, 0x0005, 0x0126,
+	0x2091, 0x8000, 0x20a9, 0x0007, 0x20a1, 0x1840, 0x20e9, 0x0001,
+	0x9006, 0x4004, 0x20a9, 0x000c, 0x20a1, 0xfff4, 0x20e9, 0x0000,
+	0x9006, 0x4004, 0x2009, 0x013c, 0x200a, 0x012e, 0x7880, 0x9086,
+	0x0052, 0x0108, 0x0005, 0x0804, 0x351d, 0x7d98, 0x7c9c, 0x0804,
+	0x3614, 0x080c, 0x56df, 0x1128, 0x3a00, 0x9084, 0x0010, 0x0904,
+	0x3552, 0x080c, 0x73b0, 0x190c, 0x5fe0, 0x6040, 0x9084, 0x0020,
+	0x0971, 0x2069, 0x1847, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88,
+	0x7c9c, 0x7d98, 0x2039, 0x0001, 0x080c, 0x4aee, 0x701f, 0x4249,
+	0x0005, 0x080c, 0x56df, 0x1130, 0x3b00, 0x3a08, 0xc194, 0xc095,
+	0x20d8, 0x21d0, 0x2069, 0x1847, 0x6800, 0x9005, 0x0904, 0x3552,
+	0x6804, 0xd0ac, 0x0118, 0xd0a4, 0x0904, 0x3552, 0xd094, 0x00c6,
+	0x2061, 0x0100, 0x6104, 0x0138, 0x6200, 0x9292, 0x0005, 0x0218,
+	0x918c, 0xffdf, 0x0010, 0x918d, 0x0020, 0x6106, 0x00ce, 0xd08c,
+	0x00c6, 0x2061, 0x0100, 0x6104, 0x0118, 0x918d, 0x0010, 0x0010,
+	0x918c, 0xffef, 0x6106, 0x00ce, 0xd084, 0x0158, 0x6a28, 0x928a,
+	0x007f, 0x1a04, 0x3552, 0x9288, 0x331e, 0x210d, 0x918c, 0x00ff,
+	0x6166, 0xd0dc, 0x0130, 0x6828, 0x908a, 0x007f, 0x1a04, 0x3552,
+	0x605e, 0x6888, 0x9084, 0x0030, 0x8004, 0x8004, 0x8004, 0x8004,
+	0x0006, 0x2009, 0x19b1, 0x9080, 0x297a, 0x2005, 0x200a, 0x000e,
+	0x2009, 0x19b2, 0x9080, 0x297e, 0x2005, 0x200a, 0x6808, 0x908a,
+	0x0100, 0x0a04, 0x3552, 0x908a, 0x0841, 0x1a04, 0x3552, 0x9084,
+	0x0007, 0x1904, 0x3552, 0x680c, 0x9005, 0x0904, 0x3552, 0x6810,
+	0x9005, 0x0904, 0x3552, 0x6848, 0x6940, 0x910a, 0x1a04, 0x3552,
+	0x8001, 0x0904, 0x3552, 0x684c, 0x6944, 0x910a, 0x1a04, 0x3552,
+	0x8001, 0x0904, 0x3552, 0x2009, 0x1981, 0x200b, 0x0000, 0x2001,
+	0x1869, 0x2004, 0xd0c4, 0x0140, 0x7884, 0x200a, 0x2009, 0x017f,
+	0x200a, 0x3b00, 0xc085, 0x20d8, 0x6814, 0x908c, 0x00ff, 0x614e,
+	0x8007, 0x9084, 0x00ff, 0x6052, 0x080c, 0x76c9, 0x080c, 0x69a0,
+	0x080c, 0x69d4, 0x6808, 0x602a, 0x080c, 0x2344, 0x2009, 0x0170,
+	0x200b, 0x0080, 0xa001, 0xa001, 0x200b, 0x0000, 0x0036, 0x6b08,
+	0x080c, 0x28e1, 0x003e, 0x6000, 0x9086, 0x0000, 0x1904, 0x43e0,
+	0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f,
+	0x6016, 0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0148, 0x6830,
+	0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f, 0x0010,
+	0x9084, 0xf0ff, 0x6006, 0x610a, 0x620e, 0x6312, 0x8007, 0x810f,
+	0x8217, 0x831f, 0x20a9, 0x0004, 0x20a1, 0x19b3, 0x20e9, 0x0001,
+	0x4001, 0x20a9, 0x0004, 0x20a1, 0x19cd, 0x20e9, 0x0001, 0x4001,
+	0x080c, 0x85c6, 0x00c6, 0x900e, 0x20a9, 0x0001, 0x6b70, 0xd384,
+	0x0510, 0x0068, 0x2009, 0x0100, 0x210c, 0x918e, 0x0008, 0x1110,
+	0x839d, 0x0010, 0x83f5, 0x3e18, 0x12b0, 0x3508, 0x8109, 0x080c,
+	0x7c7f, 0x6878, 0x6016, 0x6874, 0x2008, 0x9084, 0xff00, 0x8007,
+	0x600a, 0x9184, 0x00ff, 0x6006, 0x8108, 0x1118, 0x6003, 0x0003,
+	0x0010, 0x6003, 0x0001, 0x1f04, 0x433a, 0x00ce, 0x00c6, 0x2061,
+	0x199c, 0x6a88, 0x9284, 0xc000, 0x2010, 0x9286, 0x0000, 0x1158,
+	0x2063, 0x0000, 0x2001, 0x0001, 0x080c, 0x2b88, 0x2001, 0x0001,
+	0x080c, 0x2b6b, 0x0088, 0x9286, 0x4000, 0x1148, 0x2063, 0x0001,
+	0x9006, 0x080c, 0x2b88, 0x9006, 0x080c, 0x2b6b, 0x0028, 0x9286,
+	0x8000, 0x1d30, 0x2063, 0x0002, 0x00ce, 0x6888, 0xd0ec, 0x0130,
+	0x2011, 0x0114, 0x2204, 0x9085, 0x0100, 0x2012, 0x6a80, 0x9284,
+	0x0030, 0x9086, 0x0030, 0x1128, 0x9294, 0xffcf, 0x9295, 0x0020,
+	0x6a82, 0x2001, 0x197c, 0x6a80, 0x9294, 0x0030, 0x928e, 0x0000,
+	0x0170, 0x928e, 0x0010, 0x0118, 0x928e, 0x0020, 0x0140, 0x2003,
+	0xaaaa, 0x080c, 0x2956, 0x2001, 0x196d, 0x2102, 0x0008, 0x2102,
+	0x00c6, 0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce,
+	0x080c, 0x73b0, 0x0128, 0x080c, 0x4fdc, 0x0110, 0x080c, 0x28a7,
+	0x60d4, 0x9005, 0x01c0, 0x6003, 0x0001, 0x2009, 0x43c8, 0x00e0,
+	0x080c, 0x73b0, 0x1168, 0x2011, 0x7246, 0x080c, 0x84ca, 0x2011,
+	0x7239, 0x080c, 0x85a4, 0x080c, 0x769d, 0x080c, 0x72e2, 0x0040,
+	0x080c, 0x5eda, 0x0028, 0x6003, 0x0004, 0x2009, 0x43e0, 0x0020,
+	0x080c, 0x68d5, 0x0804, 0x351d, 0x2001, 0x0170, 0x2004, 0x9084,
+	0x00ff, 0x9086, 0x004c, 0x1118, 0x2091, 0x30bd, 0x0817, 0x2091,
+	0x303d, 0x0817, 0x6000, 0x9086, 0x0000, 0x0904, 0x354f, 0x2069,
+	0x1847, 0x7890, 0x6842, 0x7894, 0x6846, 0x2d00, 0x2009, 0x0030,
+	0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x0804, 0x4af1,
+	0x9006, 0x080c, 0x28a7, 0x81ff, 0x1904, 0x354f, 0x080c, 0x73b0,
+	0x11b0, 0x080c, 0x7698, 0x080c, 0x601b, 0x080c, 0x3312, 0x0118,
+	0x6130, 0xc18d, 0x6132, 0x080c, 0xd216, 0x0130, 0x080c, 0x73d3,
+	0x1118, 0x080c, 0x7388, 0x0038, 0x080c, 0x72e2, 0x0020, 0x080c,
+	0x5fe0, 0x080c, 0x5eda, 0x0804, 0x351d, 0x81ff, 0x1904, 0x354f,
+	0x080c, 0x73b0, 0x1110, 0x0804, 0x354f, 0x6194, 0x81ff, 0x01a8,
+	0x704f, 0x0000, 0x2001, 0x1c80, 0x2009, 0x0040, 0x7a8c, 0x7b88,
+	0x7c9c, 0x7d98, 0x0126, 0x2091, 0x8000, 0x2039, 0x0001, 0x080c,
+	0x4af1, 0x701f, 0x351b, 0x012e, 0x0005, 0x704f, 0x0001, 0x00d6,
+	0x2069, 0x1c80, 0x20a9, 0x0040, 0x20e9, 0x0001, 0x20a1, 0x1c80,
+	0x2019, 0xffff, 0x4304, 0x655c, 0x9588, 0x331e, 0x210d, 0x918c,
+	0x00ff, 0x216a, 0x900e, 0x2011, 0x0002, 0x2100, 0x9506, 0x01a8,
+	0x080c, 0x6600, 0x1190, 0xb814, 0x821c, 0x0238, 0x9398, 0x1c80,
+	0x9085, 0xff00, 0x8007, 0x201a, 0x0038, 0x9398, 0x1c80, 0x2324,
+	0x94a4, 0xff00, 0x9405, 0x201a, 0x8210, 0x8108, 0x9182, 0x0080,
+	0x1208, 0x0c18, 0x8201, 0x8007, 0x2d0c, 0x9105, 0x206a, 0x00de,
+	0x20a9, 0x0040, 0x20a1, 0x1c80, 0x2099, 0x1c80, 0x080c, 0x5f6b,
+	0x0804, 0x443a, 0x080c, 0x4ad8, 0x0904, 0x3552, 0x080c, 0x4aa5,
+	0x1120, 0x2009, 0x0002, 0x0804, 0x354f, 0x080c, 0x56d0, 0xd0b4,
+	0x0558, 0x7884, 0x908e, 0x007e, 0x0538, 0x908e, 0x007f, 0x0520,
+	0x908e, 0x0080, 0x0508, 0x080c, 0x330d, 0x1148, 0xb800, 0xd08c,
+	0x11d8, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x11a8, 0xa867,
+	0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xcce4, 0x1120, 0x2009,
+	0x0003, 0x0804, 0x354f, 0x7007, 0x0003, 0x701f, 0x44c8, 0x0005,
+	0x080c, 0x4ad8, 0x0904, 0x3552, 0x20a9, 0x002b, 0xb8c4, 0x20e0,
+	0xb8c8, 0x2098, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0,
+	0x4003, 0x20a9, 0x0008, 0x9080, 0x0006, 0x20a0, 0xb8c4, 0x20e0,
+	0xb8c8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0f7c, 0x0070, 0x20a9,
+	0x0004, 0xa85c, 0x9080, 0x000a, 0x20a0, 0xb8c4, 0x20e0, 0xb8c8,
+	0x9080, 0x000a, 0x2098, 0x080c, 0x0f7c, 0x8906, 0x8006, 0x8007,
+	0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b,
+	0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x4af1, 0x81ff, 0x1904,
+	0x354f, 0x080c, 0x4abc, 0x0904, 0x3552, 0x080c, 0x6772, 0x0904,
+	0x354f, 0x0058, 0xa878, 0x9005, 0x0120, 0x2009, 0x0004, 0x0804,
+	0x354f, 0xa974, 0xaa94, 0x0804, 0x351d, 0x080c, 0x56d8, 0x0904,
+	0x351d, 0x701f, 0x4512, 0x7007, 0x0003, 0x0005, 0x81ff, 0x1904,
+	0x354f, 0x7888, 0x908a, 0x1000, 0x1a04, 0x3552, 0x080c, 0x4ad8,
+	0x0904, 0x3552, 0x080c, 0x696a, 0x0120, 0x080c, 0x6972, 0x1904,
+	0x3552, 0x080c, 0x67f7, 0x0904, 0x354f, 0x2019, 0x0004, 0x900e,
+	0x080c, 0x6784, 0x0904, 0x354f, 0x7984, 0x7a88, 0x04c9, 0x08a8,
+	0xa89c, 0x908a, 0x1000, 0x12f8, 0x080c, 0x4ad6, 0x01e0, 0x080c,
+	0x696a, 0x0118, 0x080c, 0x6972, 0x11b0, 0x080c, 0x67f7, 0x2009,
+	0x0002, 0x0168, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x6784,
+	0x2009, 0x0003, 0x0120, 0xa998, 0xaa9c, 0x00d1, 0x0060, 0xa897,
+	0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001,
+	0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x080c, 0x56d8, 0x0110,
+	0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005,
+	0x9186, 0x00ff, 0x0110, 0x0071, 0x0060, 0x2029, 0x007e, 0x2061,
+	0x1800, 0x645c, 0x2400, 0x9506, 0x0110, 0x2508, 0x0019, 0x8529,
+	0x1ec8, 0x0005, 0x080c, 0x6600, 0x1138, 0x2200, 0x8003, 0x800b,
+	0x810b, 0x9108, 0x080c, 0x84d8, 0x0005, 0x81ff, 0x1904, 0x354f,
+	0x798c, 0x2001, 0x1980, 0x918c, 0x8000, 0x2102, 0x080c, 0x4abc,
+	0x0904, 0x3552, 0x080c, 0x696a, 0x0120, 0x080c, 0x6972, 0x1904,
+	0x3552, 0x080c, 0x66c7, 0x0904, 0x354f, 0x080c, 0x677b, 0x0904,
+	0x354f, 0x2001, 0x1980, 0x2004, 0xd0fc, 0x1904, 0x351d, 0x0804,
+	0x451d, 0xa9a0, 0x2001, 0x1980, 0x918c, 0x8000, 0xc18d, 0x2102,
+	0x080c, 0x4ac9, 0x01a0, 0x080c, 0x696a, 0x0118, 0x080c, 0x6972,
+	0x1170, 0x080c, 0x66c7, 0x2009, 0x0002, 0x0128, 0x080c, 0x677b,
+	0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897,
+	0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897,
+	0x4000, 0x2001, 0x1980, 0x2004, 0xd0fc, 0x1128, 0x080c, 0x56d8,
+	0x0110, 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000,
+	0x0005, 0x81ff, 0x1904, 0x354f, 0x798c, 0x2001, 0x197f, 0x918c,
+	0x8000, 0x2102, 0x080c, 0x4abc, 0x0904, 0x3552, 0x080c, 0x696a,
+	0x0120, 0x080c, 0x6972, 0x1904, 0x3552, 0x080c, 0x66c7, 0x0904,
+	0x354f, 0x080c, 0x6769, 0x0904, 0x354f, 0x2001, 0x197f, 0x2004,
+	0xd0fc, 0x1904, 0x351d, 0x0804, 0x451d, 0xa9a0, 0x2001, 0x197f,
+	0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, 0x4ac9, 0x01a0, 0x080c,
+	0x696a, 0x0118, 0x080c, 0x6972, 0x1170, 0x080c, 0x66c7, 0x2009,
+	0x0002, 0x0128, 0x080c, 0x6769, 0x1170, 0x2009, 0x0003, 0xa897,
+	0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001,
+	0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x2001, 0x197f, 0x2004,
+	0xd0fc, 0x1128, 0x080c, 0x56d8, 0x0110, 0x9006, 0x0018, 0x900e,
+	0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x6100, 0x0804, 0x351d,
+	0x080c, 0x4ad8, 0x0904, 0x3552, 0x080c, 0x56e4, 0x1904, 0x354f,
+	0x79a8, 0xd184, 0x1158, 0xb834, 0x8007, 0x789e, 0xb830, 0x8007,
+	0x789a, 0xbb2c, 0x831f, 0xba28, 0x8217, 0x0050, 0xb824, 0x8007,
+	0x789e, 0xb820, 0x8007, 0x789a, 0xbb1c, 0x831f, 0xba18, 0x8217,
+	0xb900, 0x918c, 0x0200, 0x0804, 0x351d, 0x78a8, 0x909c, 0x0003,
+	0xd0b4, 0x1148, 0x939a, 0x0003, 0x1a04, 0x354f, 0x625c, 0x7884,
+	0x9206, 0x1904, 0x46ca, 0x080c, 0x85b0, 0x2001, 0xfff4, 0x2009,
+	0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0000, 0x0006,
+	0x78a8, 0x9084, 0x0080, 0x11c8, 0x0006, 0x0036, 0x2001, 0x1a7f,
+	0x201c, 0x7b9a, 0x2003, 0x0000, 0x2001, 0x1a80, 0x201c, 0x7b9e,
+	0x2003, 0x0000, 0x2001, 0x1a81, 0x201c, 0x7ba2, 0x2003, 0x0000,
+	0x003e, 0x000e, 0x000e, 0x0804, 0x4af1, 0x000e, 0x2031, 0x0000,
+	0x2061, 0x18b8, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e,
+	0xa392, 0xa496, 0xa59a, 0x080c, 0x10e9, 0x7007, 0x0002, 0x701f,
+	0x46ea, 0x0005, 0x81ff, 0x1904, 0x354f, 0x080c, 0x4ad8, 0x0904,
+	0x3552, 0x080c, 0x696a, 0x1904, 0x354f, 0x00c6, 0x080c, 0x4aa5,
+	0x00ce, 0x0904, 0x354f, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a,
+	0x7ea8, 0x080c, 0xcc8a, 0x0904, 0x354f, 0x7007, 0x0003, 0x701f,
+	0x4704, 0x0005, 0x080c, 0x4207, 0x0006, 0x0036, 0x2001, 0x1a7f,
+	0x201c, 0x7b9a, 0x2003, 0x0000, 0x2001, 0x1a80, 0x201c, 0x7b9e,
+	0x2003, 0x0000, 0x2001, 0x1a81, 0x201c, 0x7ba2, 0x2003, 0x0000,
+	0x003e, 0x000e, 0x0804, 0x351d, 0xa830, 0x9086, 0x0100, 0x0904,
+	0x354f, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0,
+	0x9080, 0x001b, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98,
+	0x0804, 0x4af1, 0x9006, 0x080c, 0x28a7, 0x78a8, 0x9084, 0x00ff,
+	0x9086, 0x00ff, 0x0118, 0x81ff, 0x1904, 0x354f, 0x080c, 0x73b0,
+	0x0110, 0x080c, 0x5fe0, 0x7888, 0x908a, 0x1000, 0x1a04, 0x3552,
+	0x7984, 0x9186, 0x00ff, 0x0138, 0x9182, 0x007f, 0x1a04, 0x3552,
+	0x2100, 0x080c, 0x2871, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000,
+	0x2061, 0x19fa, 0x601b, 0x0000, 0x601f, 0x0000, 0x6073, 0x0000,
+	0x6077, 0x0000, 0x080c, 0x73b0, 0x1158, 0x080c, 0x7698, 0x080c,
+	0x601b, 0x9085, 0x0001, 0x080c, 0x73f7, 0x080c, 0x72e2, 0x00d0,
+	0x080c, 0xadb8, 0x2061, 0x0100, 0x2001, 0x1818, 0x2004, 0x9084,
+	0x00ff, 0x810f, 0x9105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010,
+	0x2009, 0x1999, 0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x5f06,
+	0x080c, 0x8562, 0x7984, 0x080c, 0x73b0, 0x1110, 0x2009, 0x00ff,
+	0x7a88, 0x080c, 0x4580, 0x012e, 0x00ce, 0x002e, 0x0804, 0x351d,
+	0x7984, 0x080c, 0x659f, 0x2b08, 0x1904, 0x3552, 0x0804, 0x351d,
+	0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x354f, 0x60dc, 0xd0ac,
+	0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x354f, 0x080c,
+	0x4aa5, 0x1120, 0x2009, 0x0002, 0x0804, 0x354f, 0x7984, 0x9192,
+	0x0021, 0x1a04, 0x3552, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c,
+	0x9080, 0x0019, 0x702a, 0xaf60, 0x7736, 0x080c, 0x4aee, 0x701f,
+	0x47b8, 0x7880, 0x9086, 0x006e, 0x0110, 0x701f, 0x518e, 0x0005,
+	0x2009, 0x0080, 0x080c, 0x6600, 0x1118, 0x080c, 0x696a, 0x0120,
+	0x2021, 0x400a, 0x0804, 0x351f, 0x00d6, 0x0096, 0xa964, 0xaa6c,
+	0xab70, 0xac74, 0xad78, 0xae7c, 0xa884, 0x90be, 0x0100, 0x0904,
+	0x4851, 0x90be, 0x0112, 0x0904, 0x4851, 0x90be, 0x0113, 0x0904,
+	0x4851, 0x90be, 0x0114, 0x0904, 0x4851, 0x90be, 0x0117, 0x0904,
+	0x4851, 0x90be, 0x011a, 0x0904, 0x4851, 0x90be, 0x011c, 0x0904,
+	0x4851, 0x90be, 0x0121, 0x0904, 0x4838, 0x90be, 0x0131, 0x0904,
+	0x4838, 0x90be, 0x0171, 0x0904, 0x4851, 0x90be, 0x0173, 0x0904,
+	0x4851, 0x90be, 0x01a1, 0x1128, 0xa894, 0x8007, 0xa896, 0x0804,
+	0x485c, 0x90be, 0x0212, 0x0904, 0x4845, 0x90be, 0x0213, 0x05e8,
+	0x90be, 0x0214, 0x0500, 0x90be, 0x0217, 0x0188, 0x90be, 0x021a,
+	0x1120, 0xa89c, 0x8007, 0xa89e, 0x04e0, 0x90be, 0x021f, 0x05c8,
+	0x90be, 0x0300, 0x05b0, 0x009e, 0x00de, 0x0804, 0x3552, 0x7028,
+	0x9080, 0x0010, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9,
+	0x0007, 0x080c, 0x489a, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0,
+	0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x489a, 0x00c8,
+	0x7028, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8,
+	0x20a9, 0x0001, 0x080c, 0x48a7, 0x00b8, 0x7028, 0x9080, 0x000e,
+	0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c,
+	0x48a7, 0x7028, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0,
+	0x20e8, 0x20a9, 0x0001, 0x04f1, 0x00c6, 0x080c, 0x4aa5, 0x0550,
+	0xa868, 0xc0fd, 0xa86a, 0xa867, 0x0119, 0x9006, 0xa882, 0xa87f,
+	0x0020, 0xa88b, 0x0001, 0x810b, 0xa9ae, 0xa8b2, 0xaab6, 0xabba,
+	0xacbe, 0xadc2, 0xa9c6, 0xa8ca, 0x00ce, 0x009e, 0x00de, 0xa866,
+	0xa822, 0xa868, 0xc0fd, 0xa86a, 0xa804, 0x2048, 0x080c, 0xcca5,
+	0x1120, 0x2009, 0x0003, 0x0804, 0x354f, 0x7007, 0x0003, 0x701f,
+	0x4891, 0x0005, 0x00ce, 0x009e, 0x00de, 0x2009, 0x0002, 0x0804,
+	0x354f, 0xa820, 0x9086, 0x8001, 0x1904, 0x351d, 0x2009, 0x0004,
+	0x0804, 0x354f, 0x0016, 0x0026, 0x3510, 0x20a9, 0x0002, 0x4002,
+	0x4104, 0x4004, 0x8211, 0x1dc8, 0x002e, 0x001e, 0x0005, 0x0016,
+	0x0026, 0x0036, 0x0046, 0x3520, 0x20a9, 0x0004, 0x4002, 0x4304,
+	0x4204, 0x4104, 0x4004, 0x8421, 0x1db8, 0x004e, 0x003e, 0x002e,
+	0x001e, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x354f,
+	0x60dc, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804,
+	0x354f, 0x7984, 0x78a8, 0x2040, 0x080c, 0xadb1, 0x1120, 0x9182,
+	0x007f, 0x0a04, 0x3552, 0x9186, 0x00ff, 0x0904, 0x3552, 0x9182,
+	0x0800, 0x1a04, 0x3552, 0x7a8c, 0x7b88, 0x607c, 0x9306, 0x1140,
+	0x6080, 0x924e, 0x0904, 0x3552, 0x99cc, 0xff00, 0x0904, 0x3552,
+	0x0126, 0x2091, 0x8000, 0x080c, 0x49b8, 0x0904, 0x4938, 0x0086,
+	0x90c6, 0x4000, 0x008e, 0x1538, 0x00c6, 0x0006, 0x0036, 0xb818,
+	0xbb1c, 0x9305, 0xbb20, 0x9305, 0xbb24, 0x9305, 0xbb28, 0x9305,
+	0xbb2c, 0x9305, 0xbb30, 0x9305, 0xbb34, 0x9305, 0x003e, 0x0570,
+	0xd88c, 0x1128, 0x080c, 0x696a, 0x0110, 0xc89d, 0x0438, 0x900e,
+	0x080c, 0x6820, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d,
+	0x000e, 0x00ce, 0x00b8, 0x90c6, 0x4007, 0x1110, 0x2408, 0x0090,
+	0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0060, 0x90c6, 0x4009,
+	0x1108, 0x0040, 0x90c6, 0x4006, 0x1108, 0x0020, 0x2001, 0x4005,
+	0x2009, 0x000a, 0x2020, 0x012e, 0x0804, 0x351f, 0x000e, 0x00ce,
+	0x2b00, 0x7026, 0x0016, 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c,
+	0xae95, 0x0904, 0x498d, 0x2b00, 0x6012, 0x080c, 0xcf90, 0x2e58,
+	0x00ee, 0x00e6, 0x00c6, 0x080c, 0x4aa5, 0x00ce, 0x2b70, 0x1158,
+	0x080c, 0xae47, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x2009,
+	0x0002, 0x0804, 0x354f, 0x900e, 0xa966, 0xa96a, 0x2900, 0x6016,
+	0xa932, 0xa868, 0xc0fd, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0xd89c,
+	0x1110, 0x080c, 0x31bc, 0x6023, 0x0001, 0x9006, 0x080c, 0x653c,
+	0xd89c, 0x0138, 0x2001, 0x0004, 0x080c, 0x6550, 0x2009, 0x0003,
+	0x0030, 0x2001, 0x0002, 0x080c, 0x6550, 0x2009, 0x0002, 0x080c,
+	0xaec2, 0x78a8, 0xd094, 0x0138, 0x00ee, 0x7024, 0x00e6, 0x2058,
+	0xb8cc, 0xc08d, 0xb8ce, 0x9085, 0x0001, 0x00ee, 0x00ce, 0x00be,
+	0x001e, 0x012e, 0x1120, 0x2009, 0x0003, 0x0804, 0x354f, 0x7007,
+	0x0003, 0x701f, 0x499c, 0x0005, 0xa830, 0x9086, 0x0100, 0x7024,
+	0x2058, 0x1138, 0x2009, 0x0004, 0xba04, 0x9294, 0x00ff, 0x0804,
+	0x562d, 0x900e, 0xa868, 0xd0f4, 0x1904, 0x351d, 0x080c, 0x6820,
+	0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x351d,
+	0x00e6, 0x00d6, 0x0096, 0x83ff, 0x0904, 0x4a07, 0x902e, 0x080c,
+	0xadb1, 0x0130, 0x9026, 0x20a9, 0x0800, 0x2071, 0x1000, 0x0030,
+	0x2021, 0x007f, 0x20a9, 0x0781, 0x2071, 0x107f, 0x2e04, 0x9005,
+	0x11b8, 0x2100, 0x9406, 0x1904, 0x4a18, 0x2428, 0x94ce, 0x007f,
+	0x1120, 0x92ce, 0xfffd, 0x1558, 0x0030, 0x94ce, 0x0080, 0x1130,
+	0x92ce, 0xfffc, 0x1520, 0x93ce, 0x00ff, 0x1508, 0xc5fd, 0x0480,
+	0x2058, 0xbf10, 0x2700, 0x9306, 0x11e8, 0xbe14, 0x2600, 0x9206,
+	0x11c8, 0x2400, 0x9106, 0x1180, 0xd884, 0x0598, 0xd894, 0x1588,
+	0x080c, 0x690a, 0x1570, 0x2001, 0x4000, 0x0460, 0x080c, 0x696a,
+	0x1540, 0x2001, 0x4000, 0x0430, 0x2001, 0x4007, 0x0418, 0x2001,
+	0x4006, 0x0400, 0x2400, 0x9106, 0x1158, 0xbe14, 0x87ff, 0x1128,
+	0x86ff, 0x0918, 0x080c, 0xadb1, 0x1900, 0x2001, 0x4008, 0x0090,
+	0x8420, 0x8e70, 0x1f04, 0x49ce, 0x85ff, 0x1130, 0x2001, 0x4009,
+	0x0048, 0x2001, 0x0001, 0x0030, 0x080c, 0x659f, 0x1dd0, 0xbb12,
+	0xba16, 0x9006, 0x9005, 0x009e, 0x00de, 0x00ee, 0x0005, 0x81ff,
+	0x0120, 0x2009, 0x0001, 0x0804, 0x354f, 0x080c, 0x4aa5, 0x1120,
+	0x2009, 0x0002, 0x0804, 0x354f, 0xa867, 0x0000, 0xa868, 0xc0fd,
+	0xa86a, 0x7884, 0x9005, 0x0904, 0x3552, 0x9096, 0x00ff, 0x0120,
+	0x9092, 0x0004, 0x1a04, 0x3552, 0x2010, 0x2918, 0x080c, 0x3162,
+	0x1120, 0x2009, 0x0003, 0x0804, 0x354f, 0x7007, 0x0003, 0x701f,
+	0x4a5a, 0x0005, 0xa830, 0x9086, 0x0100, 0x1904, 0x351d, 0x2009,
+	0x0004, 0x0804, 0x354f, 0x7984, 0x080c, 0xadb1, 0x1120, 0x9182,
+	0x007f, 0x0a04, 0x3552, 0x9186, 0x00ff, 0x0904, 0x3552, 0x9182,
+	0x0800, 0x1a04, 0x3552, 0x2001, 0x9000, 0x080c, 0x5688, 0x1904,
+	0x354f, 0x0804, 0x351d, 0xa998, 0x080c, 0xadb1, 0x1118, 0x9182,
+	0x007f, 0x0280, 0x9186, 0x00ff, 0x0168, 0x9182, 0x0800, 0x1250,
+	0x2001, 0x9000, 0x080c, 0x5688, 0x11a8, 0x0060, 0xa897, 0x4005,
 	0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001,
-	0x0030, 0x0005, 0xa897, 0x4000, 0xa99a, 0x9006, 0x918d, 0x0001,
-	0x2008, 0x0005, 0x9006, 0x0005, 0xa830, 0x9086, 0x0100, 0x7024,
-	0x2058, 0x1110, 0x0804, 0x5414, 0x900e, 0x080c, 0x65ed, 0x1108,
-	0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x33cf, 0x080c,
-	0x54cb, 0x0120, 0x2009, 0x0007, 0x0804, 0x3401, 0x7f84, 0x7a8c,
-	0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x489b, 0x1120, 0x2009, 0x0002,
-	0x0804, 0x3401, 0x900e, 0x2130, 0x7126, 0x7132, 0xa860, 0x20e8,
-	0x7036, 0xa85c, 0x9080, 0x0005, 0x702a, 0x20a0, 0x080c, 0x63cd,
-	0x1904, 0x4c16, 0x080c, 0x6737, 0x0138, 0x080c, 0x673f, 0x0120,
-	0x080c, 0x66d7, 0x1904, 0x4c16, 0xd794, 0x1110, 0xd784, 0x01a8,
-	0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098, 0x3400, 0xd794,
-	0x0160, 0x20a9, 0x0008, 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0,
-	0x20a9, 0x0002, 0x080c, 0x469d, 0x0048, 0x20a9, 0x0004, 0x4003,
-	0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x469d, 0x9186, 0x007e,
-	0x0170, 0x9186, 0x0080, 0x0158, 0x080c, 0x6737, 0x90c2, 0x0006,
-	0x1210, 0xc1fd, 0x0020, 0x080c, 0x65ed, 0x1108, 0xc1fd, 0x4104,
-	0xc1fc, 0xd794, 0x0528, 0xb8c4, 0x20e0, 0xb8c8, 0x2060, 0x9c80,
-	0x0000, 0x2098, 0x20a9, 0x0002, 0x4003, 0x9c80, 0x0003, 0x2098,
-	0x20a9, 0x0001, 0x4005, 0x9c80, 0x0004, 0x2098, 0x3400, 0x20a9,
-	0x0002, 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x4690,
-	0x9c80, 0x0026, 0x2098, 0xb8c4, 0x20e0, 0x20a9, 0x0002, 0x4003,
-	0xd794, 0x0110, 0x96b0, 0x000b, 0x96b0, 0x0005, 0x8108, 0x080c,
-	0xaad5, 0x0118, 0x9186, 0x0800, 0x0040, 0xd78c, 0x0120, 0x9186,
-	0x0800, 0x0170, 0x0018, 0x9186, 0x007e, 0x0150, 0xd794, 0x0118,
-	0x9686, 0x0020, 0x0010, 0x9686, 0x0028, 0x0150, 0x0804, 0x4ba6,
-	0x86ff, 0x1120, 0x7124, 0x810b, 0x0804, 0x33cf, 0x7033, 0x0001,
-	0x7122, 0x7024, 0x9600, 0x7026, 0x772e, 0x2061, 0x18b8, 0x2c44,
-	0xa06b, 0x0000, 0xa67a, 0x7034, 0xa072, 0x7028, 0xa076, 0xa28e,
-	0xa392, 0xa496, 0xa59a, 0x080c, 0x10e0, 0x7007, 0x0002, 0x701f,
-	0x4c52, 0x0005, 0x7030, 0x9005, 0x1180, 0x7120, 0x7028, 0x20a0,
-	0x772c, 0x9036, 0x7034, 0x20e8, 0x2061, 0x18b8, 0x2c44, 0xa28c,
-	0xa390, 0xa494, 0xa598, 0x0804, 0x4ba6, 0x7124, 0x810b, 0x0804,
-	0x33cf, 0x2029, 0x007e, 0x7984, 0x7a88, 0x7b8c, 0x7c98, 0x9184,
-	0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3404, 0x9502, 0x0a04,
-	0x3404, 0x9184, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3404, 0x9502,
-	0x0a04, 0x3404, 0x9284, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04,
-	0x3404, 0x9502, 0x0a04, 0x3404, 0x9284, 0x00ff, 0x90e2, 0x0020,
-	0x0a04, 0x3404, 0x9502, 0x0a04, 0x3404, 0x9384, 0xff00, 0x8007,
-	0x90e2, 0x0020, 0x0a04, 0x3404, 0x9502, 0x0a04, 0x3404, 0x9384,
-	0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3404, 0x9502, 0x0a04, 0x3404,
-	0x9484, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3404, 0x9502,
-	0x0a04, 0x3404, 0x9484, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3404,
-	0x9502, 0x0a04, 0x3404, 0x2061, 0x1987, 0x6102, 0x6206, 0x630a,
-	0x640e, 0x0804, 0x33cf, 0x080c, 0x489b, 0x0904, 0x3401, 0x2009,
-	0x0016, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019,
-	0xaf60, 0x080c, 0x48e4, 0x701f, 0x4cd6, 0x0005, 0x2001, 0x0138,
-	0x2003, 0x0000, 0x00e6, 0x2071, 0x0300, 0x701c, 0xd0a4, 0x1de8,
-	0x00ee, 0x20a9, 0x0016, 0x896e, 0x8d6e, 0x8d6f, 0x9d84, 0xffc0,
-	0x9080, 0x0019, 0x2098, 0x9d84, 0x003f, 0x20e0, 0x2069, 0x1877,
-	0x20e9, 0x0001, 0x2da0, 0x4003, 0x6800, 0x9005, 0x0904, 0x4d57,
-	0x6804, 0x2008, 0x918c, 0xfff8, 0x1904, 0x4d57, 0x680c, 0x9005,
-	0x0904, 0x4d57, 0x9082, 0xff01, 0x1a04, 0x4d57, 0x6810, 0x9082,
-	0x005c, 0x0a04, 0x4d57, 0x6824, 0x2008, 0x9082, 0x0008, 0x0a04,
-	0x4d57, 0x9182, 0x0400, 0x1a04, 0x4d57, 0x0056, 0x2029, 0x0000,
-	0x080c, 0x888a, 0x005e, 0x6944, 0x6820, 0x9102, 0x06c0, 0x6820,
-	0x9082, 0x0019, 0x16a0, 0x6828, 0x6944, 0x810c, 0x9102, 0x0678,
-	0x6840, 0x9082, 0x000f, 0x1658, 0x080c, 0x1019, 0x2900, 0x0904,
-	0x4d71, 0x684e, 0x00e6, 0x2071, 0x1930, 0x00b6, 0x2059, 0x0000,
-	0x080c, 0x8746, 0x00be, 0x00ee, 0x0558, 0x080c, 0x84a0, 0x080c,
-	0x84e6, 0x11e0, 0x6857, 0x0000, 0x00c6, 0x2061, 0x0100, 0x6104,
-	0x918d, 0x2000, 0x6106, 0x6b10, 0x2061, 0x1a60, 0x630a, 0x00ce,
-	0x080c, 0x2808, 0x2001, 0x0138, 0x2102, 0x0804, 0x33cf, 0x080c,
-	0x2808, 0x2001, 0x0138, 0x2102, 0x0804, 0x3404, 0x00e6, 0x2071,
-	0x1930, 0x080c, 0x891b, 0x080c, 0x892a, 0x080c, 0x8735, 0x00ee,
-	0x2001, 0x188a, 0x204c, 0x080c, 0x1032, 0x2001, 0x188a, 0x2003,
-	0x0000, 0x080c, 0x2808, 0x2001, 0x0138, 0x2102, 0x0804, 0x3401,
-	0x2001, 0x1924, 0x200c, 0x918e, 0x0000, 0x0904, 0x4dd0, 0x080c,
-	0x8730, 0x0904, 0x4dd0, 0x2001, 0x0101, 0x200c, 0x918c, 0xdfff,
-	0x2102, 0x2001, 0x0138, 0x2003, 0x0000, 0x00e6, 0x2071, 0x0300,
-	0x701c, 0xd0a4, 0x1de8, 0x00ee, 0x080c, 0x8735, 0x2001, 0x0035,
-	0x080c, 0x15d1, 0x00c6, 0x2061, 0x193c, 0x6004, 0x6100, 0x9106,
-	0x1de0, 0x00ce, 0x080c, 0x2808, 0x2001, 0x0138, 0x2102, 0x00e6,
-	0x00f6, 0x2071, 0x1923, 0x080c, 0x8671, 0x0120, 0x2f00, 0x080c,
-	0x86fb, 0x0cc8, 0x00fe, 0x00ee, 0x0126, 0x2091, 0x8000, 0x2001,
-	0x188a, 0x200c, 0x81ff, 0x0138, 0x2148, 0x080c, 0x1032, 0x2001,
-	0x188a, 0x2003, 0x0000, 0x2001, 0x183c, 0x2003, 0x0020, 0x00e6,
-	0x2071, 0x1930, 0x080c, 0x891b, 0x080c, 0x892a, 0x00ee, 0x012e,
-	0x0804, 0x33cf, 0x0006, 0x080c, 0x54b7, 0xd0cc, 0x000e, 0x0005,
-	0x0006, 0x080c, 0x54bb, 0xd0bc, 0x000e, 0x0005, 0x6174, 0x7a84,
-	0x6300, 0x82ff, 0x1118, 0x7986, 0x0804, 0x33cf, 0x83ff, 0x1904,
-	0x3404, 0x2001, 0xfff0, 0x9200, 0x1a04, 0x3404, 0x2019, 0xffff,
-	0x6078, 0x9302, 0x9200, 0x0a04, 0x3404, 0x7986, 0x6276, 0x0804,
-	0x33cf, 0x080c, 0x54cb, 0x1904, 0x3401, 0x7c88, 0x7d84, 0x7e98,
-	0x7f8c, 0x080c, 0x489b, 0x0904, 0x3401, 0x900e, 0x901e, 0x7326,
-	0x7332, 0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0003, 0x702a,
-	0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6737,
-	0x0118, 0x080c, 0x673f, 0x1148, 0x20a9, 0x0001, 0xb814, 0x4004,
-	0xb810, 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800,
-	0x0120, 0x9386, 0x003c, 0x0170, 0x0c20, 0x83ff, 0x1148, 0x7224,
-	0x900e, 0x2001, 0x0003, 0x080c, 0x8cf7, 0x2208, 0x0804, 0x33cf,
-	0x7033, 0x0001, 0x7122, 0x7024, 0x9300, 0x7026, 0x2061, 0x18b8,
-	0x2c44, 0xa06b, 0x0000, 0xa37a, 0x7028, 0xa076, 0x7034, 0xa072,
-	0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, 0x10e0, 0x7007, 0x0002,
-	0x701f, 0x4e53, 0x0005, 0x7030, 0x9005, 0x1178, 0x7120, 0x7028,
-	0x20a0, 0x901e, 0x7034, 0x20e8, 0x2061, 0x18b8, 0x2c44, 0xa48c,
-	0xa590, 0xa694, 0xa798, 0x0804, 0x4e11, 0x7224, 0x900e, 0x2001,
-	0x0003, 0x080c, 0x8cf7, 0x2208, 0x0804, 0x33cf, 0x00f6, 0x00e6,
-	0x080c, 0x54cb, 0x2009, 0x0007, 0x1904, 0x4ee6, 0x2071, 0x189e,
-	0x745c, 0x84ff, 0x2009, 0x000e, 0x1904, 0x4ee6, 0xac9c, 0xad98,
-	0xaea4, 0xafa0, 0x0096, 0x080c, 0x1019, 0x2009, 0x0002, 0x0904,
-	0x4ee6, 0x2900, 0x705e, 0x900e, 0x901e, 0x7356, 0x7362, 0xa860,
-	0x7066, 0xa85c, 0x9080, 0x0003, 0x705a, 0x20a0, 0x91d8, 0x1000,
-	0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6737, 0x0118, 0x080c, 0x673f,
-	0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, 0x4104,
-	0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c,
-	0x01e8, 0x0c20, 0x83ff, 0x11c0, 0x7254, 0x900e, 0x2001, 0x0003,
-	0x080c, 0x8cf7, 0x2208, 0x009e, 0xa897, 0x4000, 0xa99a, 0x715c,
-	0x81ff, 0x090c, 0x0dd5, 0x2148, 0x080c, 0x1032, 0x9006, 0x705e,
-	0x918d, 0x0001, 0x2008, 0x0418, 0x7063, 0x0001, 0x7152, 0x7054,
-	0x9300, 0x7056, 0x2061, 0x18b9, 0x2c44, 0xa37a, 0x7058, 0xa076,
-	0x7064, 0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a, 0xa09f, 0x4ef2,
-	0x000e, 0xa0a2, 0x080c, 0x10e0, 0x9006, 0x0048, 0x009e, 0xa897,
-	0x4005, 0xa99a, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x00ee,
-	0x00fe, 0x0005, 0x00f6, 0xa0a0, 0x904d, 0x090c, 0x0dd5, 0x00e6,
-	0x2071, 0x189e, 0xa06c, 0x908e, 0x0100, 0x0138, 0xa87b, 0x0030,
-	0xa883, 0x0000, 0xa897, 0x4002, 0x00d8, 0x7060, 0x9005, 0x1158,
-	0x7150, 0x7058, 0x20a0, 0x901e, 0x7064, 0x20e8, 0xa48c, 0xa590,
-	0xa694, 0xa798, 0x0428, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897,
-	0x4000, 0x7254, 0x900e, 0x2001, 0x0003, 0x080c, 0x8cf7, 0xaa9a,
-	0x715c, 0x81ff, 0x090c, 0x0dd5, 0x2148, 0x080c, 0x1032, 0x705f,
-	0x0000, 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x6a46,
-	0x012e, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x00ee, 0x00fe, 0x0005,
-	0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6737, 0x0118,
-	0x080c, 0x673f, 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810,
+	0x0030, 0x0005, 0xa897, 0x4000, 0x900e, 0x9085, 0x0001, 0x2001,
+	0x0000, 0x0005, 0x2009, 0x000a, 0x0c48, 0x080c, 0x0fff, 0x0198,
+	0x9006, 0xa802, 0x7014, 0x9005, 0x1120, 0x2900, 0x7016, 0x701a,
+	0x0040, 0x7018, 0xa802, 0x0086, 0x2040, 0x2900, 0xa006, 0x701a,
+	0x008e, 0x9085, 0x0001, 0x0005, 0x7984, 0x080c, 0x6600, 0x1130,
+	0x7e88, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, 0x905e, 0x8bff,
+	0x0005, 0xa998, 0x080c, 0x6600, 0x1130, 0xae9c, 0x9684, 0x3fff,
+	0x9082, 0x4000, 0x0208, 0x905e, 0x8bff, 0x0005, 0xae98, 0x0008,
+	0x7e84, 0x2608, 0x080c, 0x6600, 0x1108, 0x0008, 0x905e, 0x8bff,
+	0x0005, 0x0016, 0x7114, 0x81ff, 0x0128, 0x2148, 0xa904, 0x080c,
+	0x1031, 0x0cc8, 0x7116, 0x711a, 0x001e, 0x0005, 0x2031, 0x0001,
+	0x0010, 0x2031, 0x0000, 0x2061, 0x18b8, 0x2c44, 0xa66a, 0xa17a,
+	0xa772, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x10e9,
+	0x7007, 0x0002, 0x701f, 0x351d, 0x0005, 0x00f6, 0x0126, 0x2091,
+	0x8000, 0x2079, 0x0000, 0x2001, 0x18b0, 0x2004, 0x9005, 0x1190,
+	0x0e04, 0x4b22, 0x7a36, 0x7833, 0x0012, 0x7a82, 0x7b86, 0x7c8a,
+	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x119b,
+	0x0804, 0x4b88, 0x0016, 0x0086, 0x0096, 0x00c6, 0x00e6, 0x2071,
+	0x189e, 0x7044, 0x9005, 0x1540, 0x7148, 0x9182, 0x0010, 0x0288,
+	0x7038, 0x2060, 0x080c, 0x0fff, 0x0904, 0x4b80, 0xa84b, 0x0000,
+	0x2900, 0x7046, 0x2001, 0x0002, 0x9080, 0x2090, 0x2005, 0xa846,
+	0x0098, 0x7038, 0x90e0, 0x0004, 0x2001, 0x18ba, 0x9c82, 0x18fa,
+	0x0210, 0x2061, 0x18ba, 0x2c00, 0x703a, 0x7148, 0x81ff, 0x1108,
+	0x703e, 0x8108, 0x714a, 0x0460, 0x7148, 0x8108, 0x714a, 0x7044,
+	0x2040, 0xa144, 0x2105, 0x0016, 0x908a, 0x0036, 0x1a0c, 0x0dd5,
+	0x2060, 0x001e, 0x8108, 0x2105, 0x9005, 0xa146, 0x1520, 0x080c,
+	0x0fff, 0x1130, 0x8109, 0xa946, 0x7148, 0x8109, 0x714a, 0x00d8,
+	0x9006, 0xa806, 0xa84a, 0xa046, 0x2800, 0xa802, 0x2900, 0xa006,
+	0x7046, 0x2001, 0x0002, 0x9080, 0x2090, 0x2005, 0xa846, 0x0058,
+	0x2262, 0x6306, 0x640a, 0x00ee, 0x00ce, 0x009e, 0x008e, 0x001e,
+	0x012e, 0x00fe, 0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, 0x4baa,
+	0x4baa, 0x4bac, 0x4baa, 0x4baa, 0x4baa, 0x4bb0, 0x4baa, 0x4baa,
+	0x4baa, 0x4bb4, 0x4baa, 0x4baa, 0x4baa, 0x4bb8, 0x4baa, 0x4baa,
+	0x4baa, 0x4bbc, 0x4baa, 0x4baa, 0x4baa, 0x4bc0, 0x4baa, 0x4baa,
+	0x4baa, 0x4bc5, 0x080c, 0x0dd5, 0xa276, 0xa37a, 0xa47e, 0x0898,
+	0xa286, 0xa38a, 0xa48e, 0x0878, 0xa296, 0xa39a, 0xa49e, 0x0858,
+	0xa2a6, 0xa3aa, 0xa4ae, 0x0838, 0xa2b6, 0xa3ba, 0xa4be, 0x0818,
+	0xa2c6, 0xa3ca, 0xa4ce, 0x0804, 0x4b83, 0xa2d6, 0xa3da, 0xa4de,
+	0x0804, 0x4b83, 0x00e6, 0x2071, 0x189e, 0x7048, 0x9005, 0x0904,
+	0x4c5c, 0x0126, 0x2091, 0x8000, 0x0e04, 0x4c5b, 0x00f6, 0x2079,
+	0x0000, 0x00c6, 0x0096, 0x0086, 0x0076, 0x9006, 0x2038, 0x7040,
+	0x2048, 0x9005, 0x0500, 0xa948, 0x2105, 0x0016, 0x908a, 0x0036,
+	0x1a0c, 0x0dd5, 0x2060, 0x001e, 0x8108, 0x2105, 0x9005, 0xa94a,
+	0x1904, 0x4c5e, 0xa804, 0x9005, 0x090c, 0x0dd5, 0x7042, 0x2938,
+	0x2040, 0xa003, 0x0000, 0x2001, 0x0002, 0x9080, 0x2090, 0x2005,
+	0xa04a, 0x0804, 0x4c5e, 0x703c, 0x2060, 0x2c14, 0x6304, 0x6408,
+	0x650c, 0x2200, 0x7836, 0x7833, 0x0012, 0x7882, 0x2300, 0x7886,
+	0x2400, 0x788a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084,
+	0x190c, 0x119b, 0x87ff, 0x0118, 0x2748, 0x080c, 0x1031, 0x7048,
+	0x8001, 0x704a, 0x9005, 0x1170, 0x7040, 0x2048, 0x9005, 0x0128,
+	0x080c, 0x1031, 0x9006, 0x7042, 0x7046, 0x703b, 0x18ba, 0x703f,
+	0x18ba, 0x0420, 0x7040, 0x9005, 0x1508, 0x7238, 0x2c00, 0x9206,
+	0x0148, 0x9c80, 0x0004, 0x90fa, 0x18fa, 0x0210, 0x2001, 0x18ba,
+	0x703e, 0x00a0, 0x9006, 0x703e, 0x703a, 0x7044, 0x9005, 0x090c,
+	0x0dd5, 0x2048, 0xa800, 0x9005, 0x1de0, 0x2900, 0x7042, 0x2001,
+	0x0002, 0x9080, 0x2090, 0x2005, 0xa84a, 0x0000, 0x007e, 0x008e,
+	0x009e, 0x00ce, 0x00fe, 0x012e, 0x00ee, 0x0005, 0x2c00, 0x9082,
+	0x001b, 0x0002, 0x4c7d, 0x4c7d, 0x4c7f, 0x4c7d, 0x4c7d, 0x4c7d,
+	0x4c84, 0x4c7d, 0x4c7d, 0x4c7d, 0x4c89, 0x4c7d, 0x4c7d, 0x4c7d,
+	0x4c8e, 0x4c7d, 0x4c7d, 0x4c7d, 0x4c93, 0x4c7d, 0x4c7d, 0x4c7d,
+	0x4c98, 0x4c7d, 0x4c7d, 0x4c7d, 0x4c9d, 0x080c, 0x0dd5, 0xaa74,
+	0xab78, 0xac7c, 0x0804, 0x4c09, 0xaa84, 0xab88, 0xac8c, 0x0804,
+	0x4c09, 0xaa94, 0xab98, 0xac9c, 0x0804, 0x4c09, 0xaaa4, 0xaba8,
+	0xacac, 0x0804, 0x4c09, 0xaab4, 0xabb8, 0xacbc, 0x0804, 0x4c09,
+	0xaac4, 0xabc8, 0xaccc, 0x0804, 0x4c09, 0xaad4, 0xabd8, 0xacdc,
+	0x0804, 0x4c09, 0x0016, 0x0026, 0x0036, 0x00b6, 0x00c6, 0x2009,
+	0x007e, 0x080c, 0x6600, 0x2019, 0x0001, 0xb85c, 0xd0ac, 0x0110,
+	0x2019, 0x0000, 0x2011, 0x801b, 0x080c, 0x4b05, 0x00ce, 0x00be,
+	0x003e, 0x002e, 0x001e, 0x0005, 0x0026, 0x080c, 0x56d0, 0xd0c4,
+	0x0120, 0x2011, 0x8014, 0x080c, 0x4b05, 0x002e, 0x0005, 0x81ff,
+	0x1904, 0x354f, 0x0126, 0x2091, 0x8000, 0x6030, 0xc08d, 0xc085,
+	0xc0ac, 0x6032, 0x080c, 0x73b0, 0x1158, 0x080c, 0x7698, 0x080c,
+	0x601b, 0x9085, 0x0001, 0x080c, 0x73f7, 0x080c, 0x72e2, 0x0010,
+	0x080c, 0x5eda, 0x012e, 0x0804, 0x351d, 0x81ff, 0x0120, 0x2009,
+	0x0001, 0x0804, 0x354f, 0x080c, 0x56e4, 0x0120, 0x2009, 0x0007,
+	0x0804, 0x354f, 0x080c, 0x6962, 0x0120, 0x2009, 0x0008, 0x0804,
+	0x354f, 0x080c, 0x330d, 0x0128, 0x7984, 0x080c, 0x659f, 0x1904,
+	0x3552, 0x080c, 0x4ad8, 0x0904, 0x3552, 0x2b00, 0x7026, 0x080c,
+	0x696a, 0x7888, 0x1170, 0x9084, 0x0005, 0x1158, 0x900e, 0x080c,
+	0x6820, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804,
+	0x351d, 0x080c, 0x4aa5, 0x0904, 0x354f, 0x9006, 0xa866, 0xa832,
+	0xa868, 0xc0fd, 0xa86a, 0x080c, 0xcd3e, 0x0904, 0x354f, 0x7888,
+	0xd094, 0x0118, 0xb8cc, 0xc08d, 0xb8ce, 0x7007, 0x0003, 0x701f,
+	0x4d7e, 0x0005, 0x2061, 0x1800, 0x080c, 0x56e4, 0x2009, 0x0007,
+	0x1578, 0x080c, 0x6962, 0x0118, 0x2009, 0x0008, 0x0448, 0x080c,
+	0x330d, 0x0120, 0xa998, 0x080c, 0x659f, 0x1530, 0x080c, 0x4ad6,
+	0x0518, 0x080c, 0x696a, 0xa89c, 0x1168, 0x9084, 0x0005, 0x1150,
+	0x900e, 0x080c, 0x6820, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108,
+	0xc18d, 0x00d0, 0xa868, 0xc0fc, 0xa86a, 0x080c, 0xcd3e, 0x11e0,
+	0xa89c, 0xd094, 0x0118, 0xb8cc, 0xc08d, 0xb8ce, 0x2009, 0x0003,
+	0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085,
+	0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0xa99a, 0x9006,
+	0x918d, 0x0001, 0x2008, 0x0005, 0x9006, 0x0005, 0xa830, 0x9086,
+	0x0100, 0x7024, 0x2058, 0x1110, 0x0804, 0x562d, 0x900e, 0x080c,
+	0x6820, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804,
+	0x351d, 0x080c, 0x56e4, 0x0120, 0x2009, 0x0007, 0x0804, 0x354f,
+	0x7f84, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x4aa5, 0x1120,
+	0x2009, 0x0002, 0x0804, 0x354f, 0x900e, 0x2130, 0x7126, 0x7132,
+	0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0005, 0x702a, 0x20a0,
+	0x080c, 0x6600, 0x1904, 0x4e20, 0x080c, 0x696a, 0x0138, 0x080c,
+	0x6972, 0x0120, 0x080c, 0x690a, 0x1904, 0x4e20, 0xd794, 0x1110,
+	0xd784, 0x01a8, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098,
+	0x3400, 0xd794, 0x0160, 0x20a9, 0x0008, 0x4003, 0x2098, 0x20a0,
+	0x3d00, 0x20e0, 0x20a9, 0x0002, 0x080c, 0x48a7, 0x0048, 0x20a9,
+	0x0004, 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x48a7,
+	0x9186, 0x007e, 0x0170, 0x9186, 0x0080, 0x0158, 0x080c, 0x696a,
+	0x90c2, 0x0006, 0x1210, 0xc1fd, 0x0020, 0x080c, 0x6820, 0x1108,
+	0xc1fd, 0x4104, 0xc1fc, 0xd794, 0x0528, 0xb8c4, 0x20e0, 0xb8c8,
+	0x2060, 0x9c80, 0x0000, 0x2098, 0x20a9, 0x0002, 0x4003, 0x9c80,
+	0x0003, 0x2098, 0x20a9, 0x0001, 0x4005, 0x9c80, 0x0004, 0x2098,
+	0x3400, 0x20a9, 0x0002, 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0,
+	0x080c, 0x489a, 0x9c80, 0x0026, 0x2098, 0xb8c4, 0x20e0, 0x20a9,
+	0x0002, 0x4003, 0xd794, 0x0110, 0x96b0, 0x000b, 0x96b0, 0x0005,
+	0x8108, 0x080c, 0xadb1, 0x0118, 0x9186, 0x0800, 0x0040, 0xd78c,
+	0x0120, 0x9186, 0x0800, 0x0170, 0x0018, 0x9186, 0x007e, 0x0150,
+	0xd794, 0x0118, 0x9686, 0x0020, 0x0010, 0x9686, 0x0028, 0x0150,
+	0x0804, 0x4db0, 0x86ff, 0x1120, 0x7124, 0x810b, 0x0804, 0x351d,
+	0x7033, 0x0001, 0x7122, 0x7024, 0x9600, 0x7026, 0x772e, 0x2061,
+	0x18b8, 0x2c44, 0xa06b, 0x0000, 0xa67a, 0x7034, 0xa072, 0x7028,
+	0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x10e9, 0x7007,
+	0x0002, 0x701f, 0x4e5c, 0x0005, 0x7030, 0x9005, 0x1180, 0x7120,
+	0x7028, 0x20a0, 0x772c, 0x9036, 0x7034, 0x20e8, 0x2061, 0x18b8,
+	0x2c44, 0xa28c, 0xa390, 0xa494, 0xa598, 0x0804, 0x4db0, 0x7124,
+	0x810b, 0x0804, 0x351d, 0x2029, 0x007e, 0x7984, 0x7a88, 0x7b8c,
+	0x7c98, 0x9184, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3552,
+	0x9502, 0x0a04, 0x3552, 0x9184, 0x00ff, 0x90e2, 0x0020, 0x0a04,
+	0x3552, 0x9502, 0x0a04, 0x3552, 0x9284, 0xff00, 0x8007, 0x90e2,
+	0x0020, 0x0a04, 0x3552, 0x9502, 0x0a04, 0x3552, 0x9284, 0x00ff,
+	0x90e2, 0x0020, 0x0a04, 0x3552, 0x9502, 0x0a04, 0x3552, 0x9384,
+	0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3552, 0x9502, 0x0a04,
+	0x3552, 0x9384, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3552, 0x9502,
+	0x0a04, 0x3552, 0x9484, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04,
+	0x3552, 0x9502, 0x0a04, 0x3552, 0x9484, 0x00ff, 0x90e2, 0x0020,
+	0x0a04, 0x3552, 0x9502, 0x0a04, 0x3552, 0x2061, 0x1989, 0x6102,
+	0x6206, 0x630a, 0x640e, 0x0804, 0x351d, 0x080c, 0x4aa5, 0x0904,
+	0x354f, 0x2009, 0x0016, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c,
+	0x9080, 0x0019, 0xaf60, 0x080c, 0x4aee, 0x701f, 0x4ee0, 0x0005,
+	0x2001, 0x0138, 0x2003, 0x0000, 0x00e6, 0x2071, 0x0300, 0x701c,
+	0xd0a4, 0x1de8, 0x00ee, 0x20a9, 0x0016, 0x896e, 0x8d6e, 0x8d6f,
+	0x9d84, 0xffc0, 0x9080, 0x0019, 0x2098, 0x9d84, 0x003f, 0x20e0,
+	0x2069, 0x1877, 0x20e9, 0x0001, 0x2da0, 0x4003, 0x6800, 0x9005,
+	0x0904, 0x4f61, 0x6804, 0x2008, 0x918c, 0xfff8, 0x1904, 0x4f61,
+	0x680c, 0x9005, 0x0904, 0x4f61, 0x9082, 0xff01, 0x1a04, 0x4f61,
+	0x6810, 0x9082, 0x005c, 0x0a04, 0x4f61, 0x6824, 0x2008, 0x9082,
+	0x0008, 0x0a04, 0x4f61, 0x9182, 0x0400, 0x1a04, 0x4f61, 0x0056,
+	0x2029, 0x0000, 0x080c, 0x8ad2, 0x005e, 0x6944, 0x6820, 0x9102,
+	0x06c0, 0x6820, 0x9082, 0x0019, 0x16a0, 0x6828, 0x6944, 0x810c,
+	0x9102, 0x0678, 0x6840, 0x9082, 0x000f, 0x1658, 0x080c, 0x1018,
+	0x2900, 0x0904, 0x4f7b, 0x684e, 0x00e6, 0x2071, 0x1930, 0x00b6,
+	0x2059, 0x0000, 0x080c, 0x898e, 0x00be, 0x00ee, 0x0558, 0x080c,
+	0x86e8, 0x080c, 0x872e, 0x11e0, 0x6857, 0x0000, 0x00c6, 0x2061,
+	0x0100, 0x6104, 0x918d, 0x2000, 0x6106, 0x6b10, 0x2061, 0x1a62,
+	0x630a, 0x00ce, 0x080c, 0x2956, 0x2001, 0x0138, 0x2102, 0x0804,
+	0x351d, 0x080c, 0x2956, 0x2001, 0x0138, 0x2102, 0x0804, 0x3552,
+	0x00e6, 0x2071, 0x1930, 0x080c, 0x8b63, 0x080c, 0x8b72, 0x080c,
+	0x897d, 0x00ee, 0x2001, 0x188a, 0x204c, 0x080c, 0x1031, 0x2001,
+	0x188a, 0x2003, 0x0000, 0x080c, 0x2956, 0x2001, 0x0138, 0x2102,
+	0x0804, 0x354f, 0x2001, 0x1924, 0x200c, 0x918e, 0x0000, 0x0904,
+	0x4fda, 0x080c, 0x8978, 0x0904, 0x4fda, 0x2001, 0x0101, 0x200c,
+	0x918c, 0xdfff, 0x2102, 0x2001, 0x0138, 0x2003, 0x0000, 0x00e6,
+	0x2071, 0x0300, 0x701c, 0xd0a4, 0x1de8, 0x00ee, 0x080c, 0x897d,
+	0x2001, 0x0035, 0x080c, 0x15ee, 0x00c6, 0x2061, 0x193c, 0x6004,
+	0x6100, 0x9106, 0x1de0, 0x00ce, 0x080c, 0x2956, 0x2001, 0x0138,
+	0x2102, 0x00e6, 0x00f6, 0x2071, 0x1923, 0x080c, 0x88b9, 0x0120,
+	0x2f00, 0x080c, 0x8943, 0x0cc8, 0x00fe, 0x00ee, 0x0126, 0x2091,
+	0x8000, 0x2001, 0x188a, 0x200c, 0x81ff, 0x0138, 0x2148, 0x080c,
+	0x1031, 0x2001, 0x188a, 0x2003, 0x0000, 0x2001, 0x183c, 0x2003,
+	0x0020, 0x00e6, 0x2071, 0x1930, 0x080c, 0x8b63, 0x080c, 0x8b72,
+	0x00ee, 0x012e, 0x0804, 0x351d, 0x0006, 0x080c, 0x56d0, 0xd0cc,
+	0x000e, 0x0005, 0x0006, 0x080c, 0x56d4, 0xd0bc, 0x000e, 0x0005,
+	0x6174, 0x7a84, 0x6300, 0x82ff, 0x1118, 0x7986, 0x0804, 0x351d,
+	0x83ff, 0x1904, 0x3552, 0x2001, 0xfff0, 0x9200, 0x1a04, 0x3552,
+	0x2019, 0xffff, 0x6078, 0x9302, 0x9200, 0x0a04, 0x3552, 0x7986,
+	0x6276, 0x0804, 0x351d, 0x080c, 0x56e4, 0x1904, 0x354f, 0x7c88,
+	0x7d84, 0x7e98, 0x7f8c, 0x080c, 0x4aa5, 0x0904, 0x354f, 0x900e,
+	0x901e, 0x7326, 0x7332, 0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080,
+	0x0003, 0x702a, 0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178,
+	0x080c, 0x696a, 0x0118, 0x080c, 0x6972, 0x1148, 0x20a9, 0x0001,
+	0xb814, 0x4004, 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, 0x8108,
+	0x9182, 0x0800, 0x0120, 0x9386, 0x003c, 0x0170, 0x0c20, 0x83ff,
+	0x1148, 0x7224, 0x900e, 0x2001, 0x0003, 0x080c, 0x8f3f, 0x2208,
+	0x0804, 0x351d, 0x7033, 0x0001, 0x7122, 0x7024, 0x9300, 0x7026,
+	0x2061, 0x18b8, 0x2c44, 0xa06b, 0x0000, 0xa37a, 0x7028, 0xa076,
+	0x7034, 0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, 0x10e9,
+	0x7007, 0x0002, 0x701f, 0x505d, 0x0005, 0x7030, 0x9005, 0x1178,
+	0x7120, 0x7028, 0x20a0, 0x901e, 0x7034, 0x20e8, 0x2061, 0x18b8,
+	0x2c44, 0xa48c, 0xa590, 0xa694, 0xa798, 0x0804, 0x501b, 0x7224,
+	0x900e, 0x2001, 0x0003, 0x080c, 0x8f3f, 0x2208, 0x0804, 0x351d,
+	0x00f6, 0x00e6, 0x080c, 0x56e4, 0x2009, 0x0007, 0x1904, 0x50f0,
+	0x2071, 0x189e, 0x745c, 0x84ff, 0x2009, 0x000e, 0x1904, 0x50f0,
+	0xac9c, 0xad98, 0xaea4, 0xafa0, 0x0096, 0x080c, 0x1018, 0x2009,
+	0x0002, 0x0904, 0x50f0, 0x2900, 0x705e, 0x900e, 0x901e, 0x7356,
+	0x7362, 0xa860, 0x7066, 0xa85c, 0x9080, 0x0003, 0x705a, 0x20a0,
+	0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x696a, 0x0118,
+	0x080c, 0x6972, 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810,
 	0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120,
-	0x9386, 0x003c, 0x0518, 0x0c20, 0x83ff, 0x11f0, 0x7154, 0x810c,
-	0xa99a, 0xa897, 0x4000, 0x715c, 0x81ff, 0x090c, 0x0dd5, 0x2148,
-	0x080c, 0x1032, 0x9006, 0x705e, 0x918d, 0x0001, 0x2008, 0xa0a0,
-	0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x6a46, 0x012e, 0xa09f,
-	0x0000, 0xa0a3, 0x0000, 0x0070, 0x7063, 0x0001, 0x7152, 0x7054,
-	0x9300, 0x7056, 0xa37a, 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c,
-	0x10e0, 0x9006, 0x00ee, 0x0005, 0x0096, 0xa88c, 0x90be, 0x7000,
-	0x0148, 0x90be, 0x7100, 0x0130, 0x90be, 0x7200, 0x0118, 0x009e,
-	0x0804, 0x3404, 0xa884, 0xa988, 0x080c, 0x26f0, 0x1518, 0x080c,
-	0x636c, 0x1500, 0x7126, 0xbe12, 0xbd16, 0xae7c, 0x080c, 0x489b,
-	0x01c8, 0x080c, 0x489b, 0x01b0, 0x009e, 0xa867, 0x0000, 0xa868,
-	0xc0fd, 0xa86a, 0xa823, 0x0000, 0xa804, 0x2048, 0x080c, 0xc9c8,
-	0x1120, 0x2009, 0x0003, 0x0804, 0x3401, 0x7007, 0x0003, 0x701f,
-	0x4fbf, 0x0005, 0x009e, 0x2009, 0x0002, 0x0804, 0x3401, 0x7124,
-	0x080c, 0x3166, 0xa820, 0x9086, 0x8001, 0x1120, 0x2009, 0x0004,
-	0x0804, 0x3401, 0x2900, 0x7022, 0xa804, 0x0096, 0x2048, 0x8906,
-	0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x009e, 0x9080,
-	0x0002, 0x0076, 0x0006, 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9,
-	0x002a, 0x080c, 0x0f7d, 0xaa6c, 0xab70, 0xac74, 0xad78, 0x2061,
-	0x18b8, 0x2c44, 0xa06b, 0x0000, 0xae64, 0xaf8c, 0x97c6, 0x7000,
-	0x0118, 0x97c6, 0x7100, 0x1148, 0x96c2, 0x0004, 0x0600, 0x2009,
-	0x0004, 0x000e, 0x007e, 0x0804, 0x48e7, 0x97c6, 0x7200, 0x11b8,
-	0x96c2, 0x0054, 0x02a0, 0x000e, 0x007e, 0x2061, 0x18b8, 0x2c44,
-	0xa076, 0xa772, 0xa07b, 0x002a, 0xa28e, 0xa392, 0xa496, 0xa59a,
-	0x080c, 0x10e0, 0x7007, 0x0002, 0x701f, 0x501b, 0x0005, 0x000e,
-	0x007e, 0x0804, 0x3404, 0x7020, 0x2048, 0xa804, 0x2048, 0xa804,
+	0x9386, 0x003c, 0x01e8, 0x0c20, 0x83ff, 0x11c0, 0x7254, 0x900e,
+	0x2001, 0x0003, 0x080c, 0x8f3f, 0x2208, 0x009e, 0xa897, 0x4000,
+	0xa99a, 0x715c, 0x81ff, 0x090c, 0x0dd5, 0x2148, 0x080c, 0x1031,
+	0x9006, 0x705e, 0x918d, 0x0001, 0x2008, 0x0418, 0x7063, 0x0001,
+	0x7152, 0x7054, 0x9300, 0x7056, 0x2061, 0x18b9, 0x2c44, 0xa37a,
+	0x7058, 0xa076, 0x7064, 0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a,
+	0xa09f, 0x50fc, 0x000e, 0xa0a2, 0x080c, 0x10e9, 0x9006, 0x0048,
+	0x009e, 0xa897, 0x4005, 0xa99a, 0x900e, 0x9085, 0x0001, 0x2001,
+	0x0030, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0xa0a0, 0x904d, 0x090c,
+	0x0dd5, 0x00e6, 0x2071, 0x189e, 0xa06c, 0x908e, 0x0100, 0x0138,
+	0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4002, 0x00d8, 0x7060,
+	0x9005, 0x1158, 0x7150, 0x7058, 0x20a0, 0x901e, 0x7064, 0x20e8,
+	0xa48c, 0xa590, 0xa694, 0xa798, 0x0428, 0xa87b, 0x0000, 0xa883,
+	0x0000, 0xa897, 0x4000, 0x7254, 0x900e, 0x2001, 0x0003, 0x080c,
+	0x8f3f, 0xaa9a, 0x715c, 0x81ff, 0x090c, 0x0dd5, 0x2148, 0x080c,
+	0x1031, 0x705f, 0x0000, 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000,
+	0x080c, 0x6c79, 0x012e, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x00ee,
+	0x00fe, 0x0005, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c,
+	0x696a, 0x0118, 0x080c, 0x6972, 0x1148, 0xb814, 0x20a9, 0x0001,
+	0x4004, 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182,
+	0x0800, 0x0120, 0x9386, 0x003c, 0x0518, 0x0c20, 0x83ff, 0x11f0,
+	0x7154, 0x810c, 0xa99a, 0xa897, 0x4000, 0x715c, 0x81ff, 0x090c,
+	0x0dd5, 0x2148, 0x080c, 0x1031, 0x9006, 0x705e, 0x918d, 0x0001,
+	0x2008, 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c79,
+	0x012e, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x0070, 0x7063, 0x0001,
+	0x7152, 0x7054, 0x9300, 0x7056, 0xa37a, 0xa48e, 0xa592, 0xa696,
+	0xa79a, 0x080c, 0x10e9, 0x9006, 0x00ee, 0x0005, 0x0096, 0xa88c,
+	0x90be, 0x7000, 0x0148, 0x90be, 0x7100, 0x0130, 0x90be, 0x7200,
+	0x0118, 0x009e, 0x0804, 0x3552, 0xa884, 0xa988, 0x080c, 0x283e,
+	0x1518, 0x080c, 0x659f, 0x1500, 0x7126, 0xbe12, 0xbd16, 0xae7c,
+	0x080c, 0x4aa5, 0x01c8, 0x080c, 0x4aa5, 0x01b0, 0x009e, 0xa867,
+	0x0000, 0xa868, 0xc0fd, 0xa86a, 0xa823, 0x0000, 0xa804, 0x2048,
+	0x080c, 0xccc5, 0x1120, 0x2009, 0x0003, 0x0804, 0x354f, 0x7007,
+	0x0003, 0x701f, 0x51c9, 0x0005, 0x009e, 0x2009, 0x0002, 0x0804,
+	0x354f, 0x7124, 0x080c, 0x32b4, 0xa820, 0x9086, 0x8001, 0x1120,
+	0x2009, 0x0004, 0x0804, 0x354f, 0x2900, 0x7022, 0xa804, 0x0096,
 	0x2048, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0,
-	0x9080, 0x0002, 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a,
-	0x080c, 0x0f7d, 0x2100, 0x2238, 0x2061, 0x18b8, 0x2c44, 0xa28c,
-	0xa390, 0xa494, 0xa598, 0x2009, 0x002a, 0x0804, 0x48e7, 0x81ff,
-	0x1904, 0x3401, 0x798c, 0x2001, 0x197e, 0x2102, 0x080c, 0x48b2,
-	0x0904, 0x3404, 0x080c, 0x6737, 0x0120, 0x080c, 0x673f, 0x1904,
-	0x3404, 0x080c, 0x6494, 0x0904, 0x3401, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x655a, 0x012e, 0x0904, 0x3401, 0x0804, 0x43cf, 0xa9a0,
-	0x2001, 0x197e, 0xc18d, 0x2102, 0x080c, 0x48bf, 0x01a0, 0x080c,
-	0x6737, 0x0118, 0x080c, 0x673f, 0x1170, 0x080c, 0x6494, 0x2009,
-	0x0002, 0x0128, 0x080c, 0x655a, 0x1170, 0x2009, 0x0003, 0xa897,
-	0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001,
-	0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x080c, 0x54bf, 0x0110,
-	0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005,
-	0x78a8, 0xd08c, 0x1118, 0xd084, 0x0904, 0x4344, 0x080c, 0x48ce,
-	0x0904, 0x3404, 0x080c, 0x489b, 0x1120, 0x2009, 0x0002, 0x0804,
-	0x3401, 0x080c, 0x6737, 0x0130, 0x908e, 0x0004, 0x0118, 0x908e,
-	0x0005, 0x15a0, 0x78a8, 0xd08c, 0x0120, 0xb800, 0xc08c, 0xb802,
-	0x0028, 0x080c, 0x54b7, 0xd0b4, 0x0904, 0x437e, 0x7884, 0x908e,
-	0x007e, 0x0904, 0x437e, 0x908e, 0x007f, 0x0904, 0x437e, 0x908e,
-	0x0080, 0x0904, 0x437e, 0xb800, 0xd08c, 0x1904, 0x437e, 0xa867,
-	0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xc9e7, 0x1120, 0x2009,
-	0x0003, 0x0804, 0x3401, 0x7007, 0x0003, 0x701f, 0x50d8, 0x0005,
-	0x080c, 0x48ce, 0x0904, 0x3404, 0x0804, 0x437e, 0x080c, 0x31bf,
-	0x0108, 0x0005, 0x2009, 0x1834, 0x210c, 0x81ff, 0x0120, 0x2009,
-	0x0001, 0x0804, 0x3401, 0x080c, 0x54cb, 0x0120, 0x2009, 0x0007,
-	0x0804, 0x3401, 0x080c, 0x672f, 0x0120, 0x2009, 0x0008, 0x0804,
-	0x3401, 0xb89c, 0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x437e, 0x9006,
-	0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xca41, 0x1120,
-	0x2009, 0x0003, 0x0804, 0x3401, 0x7007, 0x0003, 0x701f, 0x5111,
-	0x0005, 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804,
-	0x5414, 0x080c, 0x48ce, 0x0904, 0x3404, 0x0804, 0x50aa, 0x81ff,
-	0x2009, 0x0001, 0x1904, 0x3401, 0x080c, 0x54cb, 0x2009, 0x0007,
-	0x1904, 0x3401, 0x080c, 0x672f, 0x0120, 0x2009, 0x0008, 0x0804,
-	0x3401, 0x080c, 0x48ce, 0x0904, 0x3404, 0x080c, 0x6737, 0x2009,
-	0x0009, 0x1904, 0x3401, 0x080c, 0x489b, 0x2009, 0x0002, 0x0904,
-	0x3401, 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x7988,
-	0x9194, 0xff00, 0x918c, 0x00ff, 0x9006, 0x82ff, 0x1128, 0xc0ed,
-	0xa952, 0x798c, 0xa956, 0x0038, 0x928e, 0x0100, 0x1904, 0x3404,
-	0xc0e5, 0xa952, 0xa956, 0xa83e, 0x080c, 0xcc94, 0x2009, 0x0003,
-	0x0904, 0x3401, 0x7007, 0x0003, 0x701f, 0x5167, 0x0005, 0xa830,
-	0x9086, 0x0100, 0x2009, 0x0004, 0x0904, 0x3401, 0x0804, 0x33cf,
-	0x7aa8, 0x9284, 0xc000, 0x0148, 0xd2ec, 0x01a0, 0x080c, 0x54cb,
-	0x1188, 0x2009, 0x0014, 0x0804, 0x3401, 0xd2dc, 0x1568, 0x81ff,
-	0x2009, 0x0001, 0x1904, 0x3401, 0x080c, 0x54cb, 0x2009, 0x0007,
-	0x1904, 0x3401, 0xd2f4, 0x0130, 0x9284, 0x5000, 0x080c, 0x5492,
-	0x0804, 0x33cf, 0xd2fc, 0x0158, 0x080c, 0x48ce, 0x0904, 0x3404,
-	0x7984, 0x9284, 0x9000, 0x080c, 0x546f, 0x0804, 0x33cf, 0x080c,
-	0x48ce, 0x0904, 0x3404, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006,
-	0x2009, 0x0009, 0x1904, 0x5250, 0x080c, 0x489b, 0x2009, 0x0002,
-	0x0904, 0x5250, 0xa85c, 0x9080, 0x001b, 0xaf60, 0x2009, 0x0008,
-	0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x48e4, 0x701f, 0x51c1,
-	0x0005, 0xa86c, 0x9086, 0x0500, 0x1138, 0xa870, 0x9005, 0x1120,
-	0xa874, 0x9084, 0xff00, 0x0110, 0x1904, 0x3404, 0xa866, 0xa832,
-	0xa868, 0xc0fd, 0xa86a, 0x080c, 0x48ce, 0x1110, 0x0804, 0x3404,
-	0x2009, 0x0043, 0x080c, 0xccfc, 0x2009, 0x0003, 0x0904, 0x5250,
-	0x7007, 0x0003, 0x701f, 0x51e5, 0x0005, 0xa830, 0x9086, 0x0100,
-	0x2009, 0x0004, 0x0904, 0x5250, 0x7984, 0x7aa8, 0x9284, 0x1000,
-	0x080c, 0x546f, 0x0804, 0x33cf, 0x00c6, 0xaab0, 0x9284, 0xc000,
-	0x0140, 0xd2ec, 0x0168, 0x080c, 0x54cb, 0x1150, 0x2009, 0x0014,
-	0x04f0, 0x2061, 0x1800, 0x080c, 0x54cb, 0x2009, 0x0007, 0x15b8,
-	0xd2f4, 0x0128, 0x9284, 0x5000, 0x080c, 0x5492, 0x0050, 0xd2fc,
-	0x0178, 0x080c, 0x48cc, 0x0588, 0xa998, 0x9284, 0x9000, 0x080c,
-	0x546f, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x0438,
-	0x080c, 0x48cc, 0x0510, 0x080c, 0x6737, 0x2009, 0x0009, 0x11b8,
-	0xa8c4, 0x9086, 0x0500, 0x11c8, 0xa8c8, 0x9005, 0x11b0, 0xa8cc,
-	0x9084, 0xff00, 0x1190, 0x080c, 0x48cc, 0x1108, 0x0070, 0x2009,
-	0x004b, 0x080c, 0xccfc, 0x2009, 0x0003, 0x0108, 0x0078, 0x0429,
-	0x19c0, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e,
-	0x9085, 0x0001, 0x2001, 0x0030, 0x00ce, 0x0005, 0x9006, 0x0ce0,
-	0x7aa8, 0xd2dc, 0x0904, 0x3401, 0x0016, 0x7984, 0x9284, 0x1000,
-	0xc0fd, 0x080c, 0x546f, 0x001e, 0x1904, 0x3401, 0x0804, 0x33cf,
-	0x00f6, 0x2d78, 0x0011, 0x00fe, 0x0005, 0xaab0, 0xd2dc, 0x0150,
-	0x0016, 0xa998, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x546f, 0x001e,
-	0x9085, 0x0001, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804,
-	0x3401, 0x080c, 0x54cb, 0x0120, 0x2009, 0x0007, 0x0804, 0x3401,
-	0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x63cd, 0x1904, 0x3404,
-	0x9186, 0x007f, 0x0138, 0x080c, 0x6737, 0x0120, 0x2009, 0x0009,
-	0x0804, 0x3401, 0x080c, 0x489b, 0x1120, 0x2009, 0x0002, 0x0804,
-	0x3401, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x2001, 0x0100,
-	0x8007, 0xa80a, 0x080c, 0xca01, 0x1120, 0x2009, 0x0003, 0x0804,
-	0x3401, 0x7007, 0x0003, 0x701f, 0x52ae, 0x0005, 0xa808, 0x8007,
-	0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x3401, 0xa8e0,
-	0xa866, 0xa810, 0x8007, 0x9084, 0x00ff, 0x800c, 0xa814, 0x8007,
-	0x9084, 0x00ff, 0x8004, 0x9080, 0x0002, 0x9108, 0x8906, 0x8006,
-	0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0004, 0x7a8c,
-	0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x48e7, 0x080c, 0x489b, 0x1120,
-	0x2009, 0x0002, 0x0804, 0x3401, 0x7984, 0x9194, 0xff00, 0x918c,
-	0x00ff, 0x8217, 0x82ff, 0x1118, 0x7023, 0x19b1, 0x0040, 0x92c6,
-	0x0001, 0x1118, 0x7023, 0x19cb, 0x0010, 0x0804, 0x3404, 0x2009,
+	0x009e, 0x9080, 0x0002, 0x0076, 0x0006, 0x2098, 0x20a0, 0x27e0,
+	0x27e8, 0x20a9, 0x002a, 0x080c, 0x0f7c, 0xaa6c, 0xab70, 0xac74,
+	0xad78, 0x2061, 0x18b8, 0x2c44, 0xa06b, 0x0000, 0xae64, 0xaf8c,
+	0x97c6, 0x7000, 0x0118, 0x97c6, 0x7100, 0x1148, 0x96c2, 0x0004,
+	0x0600, 0x2009, 0x0004, 0x000e, 0x007e, 0x0804, 0x4af1, 0x97c6,
+	0x7200, 0x11b8, 0x96c2, 0x0054, 0x02a0, 0x000e, 0x007e, 0x2061,
+	0x18b8, 0x2c44, 0xa076, 0xa772, 0xa07b, 0x002a, 0xa28e, 0xa392,
+	0xa496, 0xa59a, 0x080c, 0x10e9, 0x7007, 0x0002, 0x701f, 0x5225,
+	0x0005, 0x000e, 0x007e, 0x0804, 0x3552, 0x7020, 0x2048, 0xa804,
+	0x2048, 0xa804, 0x2048, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f,
+	0x9084, 0xffc0, 0x9080, 0x0002, 0x2098, 0x20a0, 0x27e0, 0x27e8,
+	0x20a9, 0x002a, 0x080c, 0x0f7c, 0x2100, 0x2238, 0x2061, 0x18b8,
+	0x2c44, 0xa28c, 0xa390, 0xa494, 0xa598, 0x2009, 0x002a, 0x0804,
+	0x4af1, 0x81ff, 0x1904, 0x354f, 0x798c, 0x2001, 0x197e, 0x918c,
+	0x8000, 0x2102, 0x080c, 0x4abc, 0x0904, 0x3552, 0x080c, 0x696a,
+	0x0120, 0x080c, 0x6972, 0x1904, 0x3552, 0x080c, 0x66c7, 0x0904,
+	0x354f, 0x0126, 0x2091, 0x8000, 0x080c, 0x678d, 0x012e, 0x0904,
+	0x354f, 0x2001, 0x197e, 0x2004, 0xd0fc, 0x1904, 0x351d, 0x0804,
+	0x451d, 0xa9a0, 0x2001, 0x197e, 0x918c, 0x8000, 0xc18d, 0x2102,
+	0x080c, 0x4ac9, 0x01a0, 0x080c, 0x696a, 0x0118, 0x080c, 0x6972,
+	0x1170, 0x080c, 0x66c7, 0x2009, 0x0002, 0x0128, 0x080c, 0x678d,
+	0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897,
+	0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897,
+	0x4000, 0x2001, 0x197e, 0x2004, 0xd0fc, 0x1128, 0x080c, 0x56d8,
+	0x0110, 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000,
+	0x0005, 0x78a8, 0xd08c, 0x1118, 0xd084, 0x0904, 0x4492, 0x080c,
+	0x4ad8, 0x0904, 0x3552, 0x080c, 0x4aa5, 0x1120, 0x2009, 0x0002,
+	0x0804, 0x354f, 0x080c, 0x696a, 0x0130, 0x908e, 0x0004, 0x0118,
+	0x908e, 0x0005, 0x15a0, 0x78a8, 0xd08c, 0x0120, 0xb800, 0xc08c,
+	0xb802, 0x0028, 0x080c, 0x56d0, 0xd0b4, 0x0904, 0x44cc, 0x7884,
+	0x908e, 0x007e, 0x0904, 0x44cc, 0x908e, 0x007f, 0x0904, 0x44cc,
+	0x908e, 0x0080, 0x0904, 0x44cc, 0xb800, 0xd08c, 0x1904, 0x44cc,
+	0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xcce4, 0x1120,
+	0x2009, 0x0003, 0x0804, 0x354f, 0x7007, 0x0003, 0x701f, 0x52f1,
+	0x0005, 0x080c, 0x4ad8, 0x0904, 0x3552, 0x0804, 0x44cc, 0x080c,
+	0x330d, 0x0108, 0x0005, 0x2009, 0x1834, 0x210c, 0x81ff, 0x0120,
+	0x2009, 0x0001, 0x0804, 0x354f, 0x080c, 0x56e4, 0x0120, 0x2009,
+	0x0007, 0x0804, 0x354f, 0x080c, 0x6962, 0x0120, 0x2009, 0x0008,
+	0x0804, 0x354f, 0xb89c, 0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x44cc,
+	0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xcd3e,
+	0x1120, 0x2009, 0x0003, 0x0804, 0x354f, 0x7007, 0x0003, 0x701f,
+	0x532a, 0x0005, 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004,
+	0x0804, 0x562d, 0x080c, 0x4ad8, 0x0904, 0x3552, 0x0804, 0x52c3,
+	0x81ff, 0x2009, 0x0001, 0x1904, 0x354f, 0x080c, 0x56e4, 0x2009,
+	0x0007, 0x1904, 0x354f, 0x080c, 0x6962, 0x0120, 0x2009, 0x0008,
+	0x0804, 0x354f, 0x080c, 0x4ad8, 0x0904, 0x3552, 0x080c, 0x696a,
+	0x2009, 0x0009, 0x1904, 0x354f, 0x080c, 0x4aa5, 0x2009, 0x0002,
+	0x0904, 0x354f, 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a,
+	0x7988, 0x9194, 0xff00, 0x918c, 0x00ff, 0x9006, 0x82ff, 0x1128,
+	0xc0ed, 0xa952, 0x798c, 0xa956, 0x0038, 0x928e, 0x0100, 0x1904,
+	0x3552, 0xc0e5, 0xa952, 0xa956, 0xa83e, 0x080c, 0xcf91, 0x2009,
+	0x0003, 0x0904, 0x354f, 0x7007, 0x0003, 0x701f, 0x5380, 0x0005,
+	0xa830, 0x9086, 0x0100, 0x2009, 0x0004, 0x0904, 0x354f, 0x0804,
+	0x351d, 0x7aa8, 0x9284, 0xc000, 0x0148, 0xd2ec, 0x01a0, 0x080c,
+	0x56e4, 0x1188, 0x2009, 0x0014, 0x0804, 0x354f, 0xd2dc, 0x1568,
+	0x81ff, 0x2009, 0x0001, 0x1904, 0x354f, 0x080c, 0x56e4, 0x2009,
+	0x0007, 0x1904, 0x354f, 0xd2f4, 0x0130, 0x9284, 0x5000, 0x080c,
+	0x56ab, 0x0804, 0x351d, 0xd2fc, 0x0158, 0x080c, 0x4ad8, 0x0904,
+	0x3552, 0x7984, 0x9284, 0x9000, 0x080c, 0x5688, 0x0804, 0x351d,
+	0x080c, 0x4ad8, 0x0904, 0x3552, 0xb804, 0x9084, 0x00ff, 0x9086,
+	0x0006, 0x2009, 0x0009, 0x1904, 0x5469, 0x080c, 0x4aa5, 0x2009,
+	0x0002, 0x0904, 0x5469, 0xa85c, 0x9080, 0x001b, 0xaf60, 0x2009,
+	0x0008, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x4aee, 0x701f,
+	0x53da, 0x0005, 0xa86c, 0x9086, 0x0500, 0x1138, 0xa870, 0x9005,
+	0x1120, 0xa874, 0x9084, 0xff00, 0x0110, 0x1904, 0x3552, 0xa866,
+	0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0x4ad8, 0x1110, 0x0804,
+	0x3552, 0x2009, 0x0043, 0x080c, 0xcff9, 0x2009, 0x0003, 0x0904,
+	0x5469, 0x7007, 0x0003, 0x701f, 0x53fe, 0x0005, 0xa830, 0x9086,
+	0x0100, 0x2009, 0x0004, 0x0904, 0x5469, 0x7984, 0x7aa8, 0x9284,
+	0x1000, 0x080c, 0x5688, 0x0804, 0x351d, 0x00c6, 0xaab0, 0x9284,
+	0xc000, 0x0140, 0xd2ec, 0x0168, 0x080c, 0x56e4, 0x1150, 0x2009,
+	0x0014, 0x04f0, 0x2061, 0x1800, 0x080c, 0x56e4, 0x2009, 0x0007,
+	0x15b8, 0xd2f4, 0x0128, 0x9284, 0x5000, 0x080c, 0x56ab, 0x0050,
+	0xd2fc, 0x0178, 0x080c, 0x4ad6, 0x0588, 0xa998, 0x9284, 0x9000,
+	0x080c, 0x5688, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000,
+	0x0438, 0x080c, 0x4ad6, 0x0510, 0x080c, 0x696a, 0x2009, 0x0009,
+	0x11b8, 0xa8c4, 0x9086, 0x0500, 0x11c8, 0xa8c8, 0x9005, 0x11b0,
+	0xa8cc, 0x9084, 0xff00, 0x1190, 0x080c, 0x4ad6, 0x1108, 0x0070,
+	0x2009, 0x004b, 0x080c, 0xcff9, 0x2009, 0x0003, 0x0108, 0x0078,
+	0x0429, 0x19c0, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006,
+	0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x00ce, 0x0005, 0x9006,
+	0x0ce0, 0x7aa8, 0xd2dc, 0x0904, 0x354f, 0x0016, 0x7984, 0x9284,
+	0x1000, 0xc0fd, 0x080c, 0x5688, 0x001e, 0x1904, 0x354f, 0x0804,
+	0x351d, 0x00f6, 0x2d78, 0x0011, 0x00fe, 0x0005, 0xaab0, 0xd2dc,
+	0x0150, 0x0016, 0xa998, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x5688,
+	0x001e, 0x9085, 0x0001, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001,
+	0x0804, 0x354f, 0x080c, 0x56e4, 0x0120, 0x2009, 0x0007, 0x0804,
+	0x354f, 0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x6600, 0x1904,
+	0x3552, 0x9186, 0x007f, 0x0138, 0x080c, 0x696a, 0x0120, 0x2009,
+	0x0009, 0x0804, 0x354f, 0x080c, 0x4aa5, 0x1120, 0x2009, 0x0002,
+	0x0804, 0x354f, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x2001,
+	0x0100, 0x8007, 0xa80a, 0x080c, 0xccfe, 0x1120, 0x2009, 0x0003,
+	0x0804, 0x354f, 0x7007, 0x0003, 0x701f, 0x54c7, 0x0005, 0xa808,
+	0x8007, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x354f,
+	0xa8e0, 0xa866, 0xa810, 0x8007, 0x9084, 0x00ff, 0x800c, 0xa814,
+	0x8007, 0x9084, 0x00ff, 0x8004, 0x9080, 0x0002, 0x9108, 0x8906,
+	0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0004,
+	0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x4af1, 0x080c, 0x4aa5,
+	0x1120, 0x2009, 0x0002, 0x0804, 0x354f, 0x7984, 0x9194, 0xff00,
+	0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118, 0x7023, 0x19b3, 0x0040,
+	0x92c6, 0x0001, 0x1118, 0x7023, 0x19cd, 0x0010, 0x0804, 0x3552,
+	0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080,
+	0x0019, 0xaf60, 0x080c, 0x4aee, 0x701f, 0x5517, 0x0005, 0x2001,
+	0x182e, 0x2003, 0x0001, 0xa85c, 0x9080, 0x0019, 0x2098, 0xa860,
+	0x20e0, 0x20a9, 0x001a, 0x7020, 0x20a0, 0x20e9, 0x0001, 0x4003,
+	0x0804, 0x351d, 0x080c, 0x4aa5, 0x1120, 0x2009, 0x0002, 0x0804,
+	0x354f, 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff,
+	0x1118, 0x2099, 0x19b3, 0x0040, 0x92c6, 0x0001, 0x1118, 0x2099,
+	0x19cd, 0x0010, 0x0804, 0x3552, 0xa85c, 0x9080, 0x0019, 0x20a0,
+	0xa860, 0x20e8, 0x20a9, 0x001a, 0x20e1, 0x0001, 0x4003, 0x2009,
 	0x001a, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019,
-	0xaf60, 0x080c, 0x48e4, 0x701f, 0x52fe, 0x0005, 0x2001, 0x182e,
-	0x2003, 0x0001, 0xa85c, 0x9080, 0x0019, 0x2098, 0xa860, 0x20e0,
-	0x20a9, 0x001a, 0x7020, 0x20a0, 0x20e9, 0x0001, 0x4003, 0x0804,
-	0x33cf, 0x080c, 0x489b, 0x1120, 0x2009, 0x0002, 0x0804, 0x3401,
-	0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118,
-	0x2099, 0x19b1, 0x0040, 0x92c6, 0x0001, 0x1118, 0x2099, 0x19cb,
-	0x0010, 0x0804, 0x3404, 0xa85c, 0x9080, 0x0019, 0x20a0, 0xa860,
-	0x20e8, 0x20a9, 0x001a, 0x20e1, 0x0001, 0x4003, 0x2009, 0x001a,
-	0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60,
-	0x0804, 0x48e7, 0x7884, 0x908a, 0x1000, 0x1a04, 0x3404, 0x0126,
-	0x2091, 0x8000, 0x8003, 0x800b, 0x810b, 0x9108, 0x00c6, 0x2061,
-	0x19f8, 0x6142, 0x00ce, 0x012e, 0x0804, 0x33cf, 0x00c6, 0x080c,
-	0x717d, 0x1160, 0x080c, 0x7465, 0x080c, 0x5df8, 0x9085, 0x0001,
-	0x080c, 0x71c4, 0x080c, 0x70af, 0x080c, 0x0dd5, 0x2061, 0x1800,
-	0x6030, 0xc09d, 0x6032, 0x080c, 0x5cb7, 0x00ce, 0x0005, 0x00c6,
-	0x2001, 0x1800, 0x2004, 0x908e, 0x0000, 0x0904, 0x3401, 0x7884,
-	0x9005, 0x0188, 0x7888, 0x2061, 0x199a, 0x2c0c, 0x2062, 0x080c,
-	0x2ad2, 0x01a0, 0x080c, 0x2ada, 0x0188, 0x080c, 0x2ae2, 0x0170,
-	0x2162, 0x0804, 0x3404, 0x2061, 0x0100, 0x6038, 0x9086, 0x0007,
-	0x1118, 0x2009, 0x0001, 0x0010, 0x2009, 0x0000, 0x7884, 0x9086,
-	0x0002, 0x1548, 0x2061, 0x0100, 0x6028, 0xc09c, 0x602a, 0x0026,
-	0x2011, 0x0003, 0x080c, 0xa349, 0x2011, 0x0002, 0x080c, 0xa353,
-	0x002e, 0x080c, 0xa236, 0x0036, 0x901e, 0x080c, 0xa2ac, 0x003e,
-	0x60e3, 0x0000, 0x080c, 0xe68c, 0x080c, 0xe6a7, 0x9085, 0x0001,
-	0x080c, 0x71c4, 0x9006, 0x080c, 0x2ba1, 0x2001, 0x1800, 0x2003,
-	0x0004, 0x6027, 0x0008, 0x00ce, 0x0804, 0x33cf, 0x81ff, 0x0120,
-	0x2009, 0x0001, 0x0804, 0x3401, 0x080c, 0x54cb, 0x0120, 0x2009,
-	0x0007, 0x0804, 0x3401, 0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c,
-	0x63cd, 0x1904, 0x3404, 0x9186, 0x007f, 0x0138, 0x080c, 0x6737,
-	0x0120, 0x2009, 0x0009, 0x0804, 0x3401, 0x080c, 0x489b, 0x1120,
-	0x2009, 0x0002, 0x0804, 0x3401, 0xa867, 0x0000, 0xa868, 0xc0fd,
-	0xa86a, 0x080c, 0xca04, 0x1120, 0x2009, 0x0003, 0x0804, 0x3401,
-	0x7007, 0x0003, 0x701f, 0x53fd, 0x0005, 0xa830, 0x9086, 0x0100,
-	0x1120, 0x2009, 0x0004, 0x0804, 0x3401, 0xa8e0, 0xa866, 0xa834,
-	0x8007, 0x800c, 0xa85c, 0x9080, 0x000c, 0x7a8c, 0x7b88, 0x7c9c,
-	0x7d98, 0xaf60, 0x0804, 0x48e7, 0xa898, 0x9086, 0x000d, 0x1904,
-	0x3401, 0x2021, 0x4005, 0x0126, 0x2091, 0x8000, 0x0e04, 0x5421,
-	0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833,
-	0x0011, 0x0010, 0x7833, 0x0010, 0x7883, 0x4005, 0xa998, 0x7986,
-	0xa9a4, 0x799a, 0xa9a8, 0x799e, 0x080c, 0x48d7, 0x2091, 0x4080,
-	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1192, 0x7007, 0x0001,
-	0x2091, 0x5000, 0x700f, 0x0000, 0x012e, 0x0005, 0x0126, 0x2091,
-	0x8000, 0x00c6, 0x2061, 0x19f8, 0x7984, 0x6152, 0x614e, 0x6057,
-	0x0000, 0x604b, 0x0009, 0x7898, 0x606a, 0x789c, 0x6066, 0x7888,
-	0x6062, 0x788c, 0x605e, 0x2001, 0x1a06, 0x2044, 0x2001, 0x1a0d,
-	0xa076, 0xa060, 0xa072, 0xa07b, 0x0001, 0xa07f, 0x0002, 0xa06b,
-	0x0000, 0xa09f, 0x0000, 0x00ce, 0x012e, 0x0804, 0x33cf, 0x0126,
-	0x2091, 0x8000, 0x00b6, 0x00c6, 0x90e4, 0xc000, 0x0128, 0x0006,
-	0x080c, 0xc872, 0x000e, 0x1198, 0xd0e4, 0x0160, 0x9180, 0x1000,
-	0x2004, 0x905d, 0x0160, 0x080c, 0x5e12, 0x080c, 0xaad5, 0x0110,
-	0xb817, 0x0000, 0x9006, 0x00ce, 0x00be, 0x012e, 0x0005, 0x9085,
-	0x0001, 0x0cc8, 0x0126, 0x2091, 0x8000, 0x0156, 0x2010, 0x900e,
-	0x20a9, 0x0800, 0x0016, 0x9180, 0x1000, 0x2004, 0x9005, 0x0180,
-	0x9186, 0x007e, 0x0168, 0x9186, 0x007f, 0x0150, 0x9186, 0x0080,
-	0x0138, 0x9186, 0x00ff, 0x0120, 0x0026, 0x2200, 0x0801, 0x002e,
-	0x001e, 0x8108, 0x1f04, 0x549a, 0x015e, 0x012e, 0x0005, 0x2001,
-	0x1848, 0x2004, 0x0005, 0x2001, 0x1867, 0x2004, 0x0005, 0x0006,
-	0x2001, 0x1810, 0x2004, 0xd0d4, 0x000e, 0x0005, 0x2001, 0x180e,
-	0x2004, 0xd0b4, 0x0005, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003,
-	0x0005, 0x0016, 0x00e6, 0x2071, 0x189e, 0x7108, 0x910d, 0x710a,
-	0x00ee, 0x001e, 0x0005, 0x080c, 0x489b, 0x080c, 0x0f07, 0x2100,
-	0x2238, 0x7d84, 0x7c88, 0x7b8c, 0x7a90, 0x79a4, 0x9182, 0x0081,
-	0x1a04, 0x3404, 0x810c, 0x080c, 0x48e4, 0x701f, 0x54f0, 0x0005,
-	0x2079, 0x0000, 0x7d94, 0x7c98, 0x7ba8, 0x7aac, 0x79a4, 0x810c,
-	0x2061, 0x18b8, 0x2c44, 0xa770, 0xa074, 0x2071, 0x189e, 0x080c,
-	0x48e7, 0x701f, 0x5504, 0x0005, 0x2061, 0x18b8, 0x2c44, 0xa074,
-	0x2048, 0x9006, 0xa802, 0xa806, 0x0804, 0x33cf, 0x0126, 0x0156,
-	0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6,
-	0x2061, 0x0100, 0x2069, 0x0200, 0x2071, 0x1800, 0x6044, 0xd0a4,
-	0x11e8, 0xd084, 0x0118, 0x080c, 0x56b7, 0x0068, 0xd08c, 0x0118,
-	0x080c, 0x55c0, 0x0040, 0xd094, 0x0118, 0x080c, 0x5590, 0x0018,
-	0xd09c, 0x0108, 0x0099, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de,
-	0x01ce, 0x014e, 0x013e, 0x015e, 0x012e, 0x0005, 0x0016, 0x6128,
-	0xd19c, 0x1110, 0xc19d, 0x612a, 0x001e, 0x0c68, 0x0006, 0x7098,
-	0x9005, 0x000e, 0x0120, 0x709b, 0x0000, 0x7093, 0x0000, 0x624c,
-	0x9286, 0xf0f0, 0x1150, 0x6048, 0x9086, 0xf0f0, 0x0130, 0x624a,
-	0x6043, 0x0090, 0x6043, 0x0010, 0x0490, 0x9294, 0xff00, 0x9296,
-	0xf700, 0x0178, 0x7138, 0xd1a4, 0x1160, 0x6240, 0x9295, 0x0100,
-	0x6242, 0x9294, 0x0010, 0x0128, 0x2009, 0x00f7, 0x080c, 0x5d74,
-	0x00f0, 0x6040, 0x9084, 0x0010, 0x9085, 0x0140, 0x6042, 0x6043,
-	0x0000, 0x7087, 0x0000, 0x70a3, 0x0001, 0x70c7, 0x0000, 0x70df,
-	0x0000, 0x2009, 0x1c80, 0x200b, 0x0000, 0x7097, 0x0000, 0x708b,
-	0x000f, 0x2009, 0x000f, 0x2011, 0x5c5a, 0x080c, 0x831a, 0x0005,
-	0x2001, 0x1869, 0x2004, 0xd08c, 0x0110, 0x705f, 0xffff, 0x7088,
-	0x9005, 0x1528, 0x2011, 0x5c5a, 0x080c, 0x8285, 0x6040, 0x9094,
-	0x0010, 0x9285, 0x0020, 0x6042, 0x20a9, 0x00c8, 0x6044, 0xd08c,
-	0x1168, 0x1f04, 0x55a6, 0x6242, 0x709b, 0x0000, 0x6040, 0x9094,
-	0x0010, 0x9285, 0x0080, 0x6042, 0x6242, 0x0048, 0x6242, 0x709b,
-	0x0000, 0x708f, 0x0000, 0x9006, 0x080c, 0x5dfd, 0x0000, 0x0005,
-	0x708c, 0x908a, 0x0003, 0x1a0c, 0x0dd5, 0x000b, 0x0005, 0x55ca,
-	0x561b, 0x56b6, 0x00f6, 0x0016, 0x6900, 0x918c, 0x0800, 0x708f,
-	0x0001, 0x2001, 0x015d, 0x2003, 0x0000, 0x6803, 0x00fc, 0x20a9,
-	0x0004, 0x6800, 0x9084, 0x00fc, 0x0120, 0x1f04, 0x55d9, 0x080c,
-	0x0dd5, 0x68a0, 0x68a2, 0x689c, 0x689e, 0x6898, 0x689a, 0xa001,
-	0x918d, 0x1600, 0x6902, 0x001e, 0x6837, 0x0020, 0x080c, 0x5dd9,
-	0x2079, 0x1c00, 0x7833, 0x1101, 0x7837, 0x0000, 0x20e1, 0x0001,
-	0x2099, 0x1805, 0x20e9, 0x0001, 0x20a1, 0x1c0e, 0x20a9, 0x0004,
-	0x4003, 0x080c, 0xa82b, 0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9,
-	0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c,
-	0x600f, 0x0000, 0x080c, 0x5c8b, 0x00fe, 0x9006, 0x7092, 0x6043,
-	0x0008, 0x6042, 0x0005, 0x00f6, 0x7090, 0x7093, 0x0000, 0x9025,
-	0x0904, 0x5693, 0x6020, 0xd0b4, 0x1904, 0x5691, 0x71a0, 0x81ff,
-	0x0904, 0x567f, 0x9486, 0x000c, 0x1904, 0x568c, 0x9480, 0x0018,
-	0x8004, 0x20a8, 0x080c, 0x5dd2, 0x2011, 0x0260, 0x2019, 0x1c00,
-	0x220c, 0x2304, 0x9106, 0x11e8, 0x8210, 0x8318, 0x1f04, 0x5638,
-	0x6043, 0x0004, 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0,
-	0x2061, 0x0100, 0x6043, 0x0006, 0x708f, 0x0002, 0x709b, 0x0002,
-	0x2009, 0x07d0, 0x2011, 0x5c61, 0x080c, 0x831a, 0x080c, 0x5dd9,
-	0x04c0, 0x080c, 0x5dd2, 0x2079, 0x0260, 0x7930, 0x918e, 0x1101,
-	0x1558, 0x7834, 0x9005, 0x1540, 0x7900, 0x918c, 0x00ff, 0x1118,
-	0x7804, 0x9005, 0x0190, 0x080c, 0x5dd2, 0x2011, 0x026e, 0x2019,
-	0x1805, 0x20a9, 0x0004, 0x220c, 0x2304, 0x9102, 0x0230, 0x11a0,
-	0x8210, 0x8318, 0x1f04, 0x5673, 0x0078, 0x70a3, 0x0000, 0x080c,
-	0x5dd2, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0001, 0x20a1,
-	0x1c00, 0x20a9, 0x0014, 0x4003, 0x6043, 0x0008, 0x6043, 0x0000,
-	0x0010, 0x00fe, 0x0005, 0x6040, 0x9085, 0x0100, 0x6042, 0x6020,
-	0xd0b4, 0x1db8, 0x080c, 0xa82b, 0x20e1, 0x0001, 0x2099, 0x1c00,
-	0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3,
-	0x000c, 0x2011, 0x19ef, 0x2013, 0x0000, 0x7093, 0x0000, 0x60a3,
-	0x0056, 0x60a7, 0x9575, 0x080c, 0x9ff3, 0x08d8, 0x0005, 0x7098,
-	0x908a, 0x001d, 0x1a0c, 0x0dd5, 0x000b, 0x0005, 0x56e8, 0x56fb,
-	0x5724, 0x5744, 0x576a, 0x5799, 0x57bf, 0x57f7, 0x581d, 0x584b,
-	0x5886, 0x58be, 0x58dc, 0x5907, 0x5929, 0x5944, 0x594e, 0x5982,
-	0x59a8, 0x59d7, 0x59fd, 0x5a35, 0x5a79, 0x5ab6, 0x5ad7, 0x5b30,
-	0x5b52, 0x5b80, 0x5b80, 0x00c6, 0x2061, 0x1800, 0x6003, 0x0007,
-	0x2061, 0x0100, 0x6004, 0x9084, 0xfff9, 0x6006, 0x00ce, 0x0005,
-	0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100,
-	0x6043, 0x0002, 0x709b, 0x0001, 0x2009, 0x07d0, 0x2011, 0x5c61,
-	0x080c, 0x831a, 0x0005, 0x00f6, 0x7090, 0x9086, 0x0014, 0x1510,
-	0x6042, 0x6020, 0xd0b4, 0x11f0, 0x080c, 0x5dd2, 0x2079, 0x0260,
-	0x7a30, 0x9296, 0x1102, 0x11a0, 0x7834, 0x9005, 0x1188, 0x7a38,
-	0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x2011,
-	0x5c61, 0x080c, 0x8285, 0x709b, 0x0010, 0x080c, 0x594e, 0x0010,
-	0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0003, 0x6043,
-	0x0004, 0x2011, 0x5c61, 0x080c, 0x8285, 0x080c, 0x5d56, 0x2079,
-	0x0240, 0x7833, 0x1102, 0x7837, 0x0000, 0x20a9, 0x0008, 0x9f88,
-	0x000e, 0x200b, 0x0000, 0x8108, 0x1f04, 0x5739, 0x60c3, 0x0014,
-	0x080c, 0x5c8b, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500,
-	0x2011, 0x5c61, 0x080c, 0x8285, 0x9086, 0x0014, 0x11b8, 0x080c,
-	0x5dd2, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, 0x1178, 0x7834,
+	0xaf60, 0x0804, 0x4af1, 0x7884, 0x908a, 0x1000, 0x1a04, 0x3552,
+	0x0126, 0x2091, 0x8000, 0x8003, 0x800b, 0x810b, 0x9108, 0x00c6,
+	0x2061, 0x19fa, 0x6142, 0x00ce, 0x012e, 0x0804, 0x351d, 0x00c6,
+	0x080c, 0x73b0, 0x1160, 0x080c, 0x7698, 0x080c, 0x601b, 0x9085,
+	0x0001, 0x080c, 0x73f7, 0x080c, 0x72e2, 0x080c, 0x0dd5, 0x2061,
+	0x1800, 0x6030, 0xc09d, 0x6032, 0x080c, 0x5eda, 0x00ce, 0x0005,
+	0x00c6, 0x2001, 0x1800, 0x2004, 0x908e, 0x0000, 0x0904, 0x354f,
+	0x7884, 0x9005, 0x0188, 0x7888, 0x2061, 0x199c, 0x2c0c, 0x2062,
+	0x080c, 0x2c20, 0x01a0, 0x080c, 0x2c28, 0x0188, 0x080c, 0x2c30,
+	0x0170, 0x2162, 0x0804, 0x3552, 0x2061, 0x0100, 0x6038, 0x9086,
+	0x0007, 0x1118, 0x2009, 0x0001, 0x0010, 0x2009, 0x0000, 0x7884,
+	0x9086, 0x0002, 0x1548, 0x2061, 0x0100, 0x6028, 0xc09c, 0x602a,
+	0x0026, 0x2011, 0x0003, 0x080c, 0xa639, 0x2011, 0x0002, 0x080c,
+	0xa643, 0x002e, 0x080c, 0xa526, 0x0036, 0x901e, 0x080c, 0xa59c,
+	0x003e, 0x60e3, 0x0000, 0x080c, 0xe9c8, 0x080c, 0xe9e3, 0x9085,
+	0x0001, 0x080c, 0x73f7, 0x9006, 0x080c, 0x2cef, 0x2001, 0x1800,
+	0x2003, 0x0004, 0x6027, 0x0008, 0x00ce, 0x0804, 0x351d, 0x81ff,
+	0x0120, 0x2009, 0x0001, 0x0804, 0x354f, 0x080c, 0x56e4, 0x0120,
+	0x2009, 0x0007, 0x0804, 0x354f, 0x7984, 0x7ea8, 0x96b4, 0x00ff,
+	0x080c, 0x6600, 0x1904, 0x3552, 0x9186, 0x007f, 0x0138, 0x080c,
+	0x696a, 0x0120, 0x2009, 0x0009, 0x0804, 0x354f, 0x080c, 0x4aa5,
+	0x1120, 0x2009, 0x0002, 0x0804, 0x354f, 0xa867, 0x0000, 0xa868,
+	0xc0fd, 0xa86a, 0x080c, 0xcd01, 0x1120, 0x2009, 0x0003, 0x0804,
+	0x354f, 0x7007, 0x0003, 0x701f, 0x5616, 0x0005, 0xa830, 0x9086,
+	0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x354f, 0xa8e0, 0xa866,
+	0xa834, 0x8007, 0x800c, 0xa85c, 0x9080, 0x000c, 0x7a8c, 0x7b88,
+	0x7c9c, 0x7d98, 0xaf60, 0x0804, 0x4af1, 0xa898, 0x9086, 0x000d,
+	0x1904, 0x354f, 0x2021, 0x4005, 0x0126, 0x2091, 0x8000, 0x0e04,
+	0x563a, 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118,
+	0x7833, 0x0011, 0x0010, 0x7833, 0x0010, 0x7883, 0x4005, 0xa998,
+	0x7986, 0xa9a4, 0x799a, 0xa9a8, 0x799e, 0x080c, 0x4ae1, 0x2091,
+	0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x119b, 0x7007,
+	0x0001, 0x2091, 0x5000, 0x700f, 0x0000, 0x012e, 0x0005, 0x0126,
+	0x2091, 0x8000, 0x00c6, 0x2061, 0x19fa, 0x7984, 0x6152, 0x614e,
+	0x6057, 0x0000, 0x604b, 0x0009, 0x7898, 0x606a, 0x789c, 0x6066,
+	0x7888, 0x6062, 0x788c, 0x605e, 0x2001, 0x1a08, 0x2044, 0x2001,
+	0x1a0f, 0xa076, 0xa060, 0xa072, 0xa07b, 0x0001, 0xa07f, 0x0002,
+	0xa06b, 0x0000, 0xa09f, 0x0000, 0x00ce, 0x012e, 0x0804, 0x351d,
+	0x0126, 0x2091, 0x8000, 0x00b6, 0x00c6, 0x90e4, 0xc000, 0x0128,
+	0x0006, 0x080c, 0xcb68, 0x000e, 0x1198, 0xd0e4, 0x0160, 0x9180,
+	0x1000, 0x2004, 0x905d, 0x0160, 0x080c, 0x6035, 0x080c, 0xadb1,
+	0x0110, 0xb817, 0x0000, 0x9006, 0x00ce, 0x00be, 0x012e, 0x0005,
+	0x9085, 0x0001, 0x0cc8, 0x0126, 0x2091, 0x8000, 0x0156, 0x2010,
+	0x900e, 0x20a9, 0x0800, 0x0016, 0x9180, 0x1000, 0x2004, 0x9005,
+	0x0180, 0x9186, 0x007e, 0x0168, 0x9186, 0x007f, 0x0150, 0x9186,
+	0x0080, 0x0138, 0x9186, 0x00ff, 0x0120, 0x0026, 0x2200, 0x0801,
+	0x002e, 0x001e, 0x8108, 0x1f04, 0x56b3, 0x015e, 0x012e, 0x0005,
+	0x2001, 0x1848, 0x2004, 0x0005, 0x2001, 0x1867, 0x2004, 0x0005,
+	0x0006, 0x2001, 0x1810, 0x2004, 0xd0d4, 0x000e, 0x0005, 0x2001,
+	0x180e, 0x2004, 0xd0b4, 0x0005, 0x2001, 0x1800, 0x2004, 0x9086,
+	0x0003, 0x0005, 0x0016, 0x00e6, 0x2071, 0x189e, 0x7108, 0x910d,
+	0x710a, 0x00ee, 0x001e, 0x0005, 0x79a4, 0x9182, 0x0081, 0x1a04,
+	0x3552, 0x810c, 0x0016, 0x080c, 0x4aa5, 0x080c, 0x0f07, 0x2100,
+	0x2238, 0x7d84, 0x7c88, 0x7b8c, 0x7a90, 0x001e, 0x080c, 0x4aee,
+	0x701f, 0x570b, 0x0005, 0x2079, 0x0000, 0x7d94, 0x7c98, 0x7ba8,
+	0x7aac, 0x79a4, 0x810c, 0x2061, 0x18b8, 0x2c44, 0xa770, 0xa074,
+	0x2071, 0x189e, 0x080c, 0x4af1, 0x701f, 0x571f, 0x0005, 0x2061,
+	0x18b8, 0x2c44, 0x0016, 0x0026, 0xa270, 0xa174, 0x080c, 0x0f0f,
+	0x002e, 0x001e, 0x080c, 0x0fbc, 0x9006, 0xa802, 0xa806, 0x0804,
+	0x351d, 0x0126, 0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6,
+	0x00d6, 0x00e6, 0x00f6, 0x2061, 0x0100, 0x2069, 0x0200, 0x2071,
+	0x1800, 0x6044, 0xd0a4, 0x11e8, 0xd084, 0x0118, 0x080c, 0x58da,
+	0x0068, 0xd08c, 0x0118, 0x080c, 0x57e3, 0x0040, 0xd094, 0x0118,
+	0x080c, 0x57b3, 0x0018, 0xd09c, 0x0108, 0x0099, 0x00fe, 0x00ee,
+	0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x012e,
+	0x0005, 0x0016, 0x6128, 0xd19c, 0x1110, 0xc19d, 0x612a, 0x001e,
+	0x0c68, 0x0006, 0x7098, 0x9005, 0x000e, 0x0120, 0x709b, 0x0000,
+	0x7093, 0x0000, 0x624c, 0x9286, 0xf0f0, 0x1150, 0x6048, 0x9086,
+	0xf0f0, 0x0130, 0x624a, 0x6043, 0x0090, 0x6043, 0x0010, 0x0490,
+	0x9294, 0xff00, 0x9296, 0xf700, 0x0178, 0x7138, 0xd1a4, 0x1160,
+	0x6240, 0x9295, 0x0100, 0x6242, 0x9294, 0x0010, 0x0128, 0x2009,
+	0x00f7, 0x080c, 0x5f97, 0x00f0, 0x6040, 0x9084, 0x0010, 0x9085,
+	0x0140, 0x6042, 0x6043, 0x0000, 0x7087, 0x0000, 0x70a3, 0x0001,
+	0x70c7, 0x0000, 0x70df, 0x0000, 0x2009, 0x1c80, 0x200b, 0x0000,
+	0x7097, 0x0000, 0x708b, 0x000f, 0x2009, 0x000f, 0x2011, 0x5e7d,
+	0x080c, 0x8562, 0x0005, 0x2001, 0x1869, 0x2004, 0xd08c, 0x0110,
+	0x705f, 0xffff, 0x7088, 0x9005, 0x1528, 0x2011, 0x5e7d, 0x080c,
+	0x84ca, 0x6040, 0x9094, 0x0010, 0x9285, 0x0020, 0x6042, 0x20a9,
+	0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04, 0x57c9, 0x6242, 0x709b,
+	0x0000, 0x6040, 0x9094, 0x0010, 0x9285, 0x0080, 0x6042, 0x6242,
+	0x0048, 0x6242, 0x709b, 0x0000, 0x708f, 0x0000, 0x9006, 0x080c,
+	0x6020, 0x0000, 0x0005, 0x708c, 0x908a, 0x0003, 0x1a0c, 0x0dd5,
+	0x000b, 0x0005, 0x57ed, 0x583e, 0x58d9, 0x00f6, 0x0016, 0x6900,
+	0x918c, 0x0800, 0x708f, 0x0001, 0x2001, 0x015d, 0x2003, 0x0000,
+	0x6803, 0x00fc, 0x20a9, 0x0004, 0x6800, 0x9084, 0x00fc, 0x0120,
+	0x1f04, 0x57fc, 0x080c, 0x0dd5, 0x68a0, 0x68a2, 0x689c, 0x689e,
+	0x6898, 0x689a, 0xa001, 0x918d, 0x1600, 0x6902, 0x001e, 0x6837,
+	0x0020, 0x080c, 0x5ffc, 0x2079, 0x1c00, 0x7833, 0x1101, 0x7837,
+	0x0000, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0001, 0x20a1,
+	0x1c0e, 0x20a9, 0x0004, 0x4003, 0x080c, 0xab07, 0x20e1, 0x0001,
+	0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014,
+	0x4003, 0x60c3, 0x000c, 0x600f, 0x0000, 0x080c, 0x5eae, 0x00fe,
+	0x9006, 0x7092, 0x6043, 0x0008, 0x6042, 0x0005, 0x00f6, 0x7090,
+	0x7093, 0x0000, 0x9025, 0x0904, 0x58b6, 0x6020, 0xd0b4, 0x1904,
+	0x58b4, 0x71a0, 0x81ff, 0x0904, 0x58a2, 0x9486, 0x000c, 0x1904,
+	0x58af, 0x9480, 0x0018, 0x8004, 0x20a8, 0x080c, 0x5ff5, 0x2011,
+	0x0260, 0x2019, 0x1c00, 0x220c, 0x2304, 0x9106, 0x11e8, 0x8210,
+	0x8318, 0x1f04, 0x585b, 0x6043, 0x0004, 0x2061, 0x0140, 0x605b,
+	0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0006, 0x708f,
+	0x0002, 0x709b, 0x0002, 0x2009, 0x07d0, 0x2011, 0x5e84, 0x080c,
+	0x8562, 0x080c, 0x5ffc, 0x04c0, 0x080c, 0x5ff5, 0x2079, 0x0260,
+	0x7930, 0x918e, 0x1101, 0x1558, 0x7834, 0x9005, 0x1540, 0x7900,
+	0x918c, 0x00ff, 0x1118, 0x7804, 0x9005, 0x0190, 0x080c, 0x5ff5,
+	0x2011, 0x026e, 0x2019, 0x1805, 0x20a9, 0x0004, 0x220c, 0x2304,
+	0x9102, 0x0230, 0x11a0, 0x8210, 0x8318, 0x1f04, 0x5896, 0x0078,
+	0x70a3, 0x0000, 0x080c, 0x5ff5, 0x20e1, 0x0000, 0x2099, 0x0260,
+	0x20e9, 0x0001, 0x20a1, 0x1c00, 0x20a9, 0x0014, 0x4003, 0x6043,
+	0x0008, 0x6043, 0x0000, 0x0010, 0x00fe, 0x0005, 0x6040, 0x9085,
+	0x0100, 0x6042, 0x6020, 0xd0b4, 0x1db8, 0x080c, 0xab07, 0x20e1,
+	0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9,
+	0x0014, 0x4003, 0x60c3, 0x000c, 0x2011, 0x19f1, 0x2013, 0x0000,
+	0x7093, 0x0000, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0xa250,
+	0x08d8, 0x0005, 0x7098, 0x908a, 0x001d, 0x1a0c, 0x0dd5, 0x000b,
+	0x0005, 0x590b, 0x591e, 0x5947, 0x5967, 0x598d, 0x59bc, 0x59e2,
+	0x5a1a, 0x5a40, 0x5a6e, 0x5aa9, 0x5ae1, 0x5aff, 0x5b2a, 0x5b4c,
+	0x5b67, 0x5b71, 0x5ba5, 0x5bcb, 0x5bfa, 0x5c20, 0x5c58, 0x5c9c,
+	0x5cd9, 0x5cfa, 0x5d53, 0x5d75, 0x5da3, 0x5da3, 0x00c6, 0x2061,
+	0x1800, 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, 0x9084, 0xfff9,
+	0x6006, 0x00ce, 0x0005, 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f,
+	0xf0f0, 0x2061, 0x0100, 0x6043, 0x0002, 0x709b, 0x0001, 0x2009,
+	0x07d0, 0x2011, 0x5e84, 0x080c, 0x8562, 0x0005, 0x00f6, 0x7090,
+	0x9086, 0x0014, 0x1510, 0x6042, 0x6020, 0xd0b4, 0x11f0, 0x080c,
+	0x5ff5, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, 0x11a0, 0x7834,
+	0x9005, 0x1188, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110,
+	0x70c7, 0x0001, 0x2011, 0x5e84, 0x080c, 0x84ca, 0x709b, 0x0010,
+	0x080c, 0x5b71, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6,
+	0x709b, 0x0003, 0x6043, 0x0004, 0x2011, 0x5e84, 0x080c, 0x84ca,
+	0x080c, 0x5f79, 0x2079, 0x0240, 0x7833, 0x1102, 0x7837, 0x0000,
+	0x20a9, 0x0008, 0x9f88, 0x000e, 0x200b, 0x0000, 0x8108, 0x1f04,
+	0x595c, 0x60c3, 0x0014, 0x080c, 0x5eae, 0x00fe, 0x0005, 0x00f6,
+	0x7090, 0x9005, 0x0500, 0x2011, 0x5e84, 0x080c, 0x84ca, 0x9086,
+	0x0014, 0x11b8, 0x080c, 0x5ff5, 0x2079, 0x0260, 0x7a30, 0x9296,
+	0x1102, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128,
+	0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x0004, 0x0029,
+	0x0010, 0x080c, 0x5fd1, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0005,
+	0x080c, 0x5f79, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, 0x0000,
+	0x080c, 0x5ff5, 0x080c, 0x5fd8, 0x1170, 0x7084, 0x9005, 0x1158,
+	0x715c, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, 0x5e31,
+	0x0168, 0x080c, 0x5fae, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099,
+	0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014,
+	0x080c, 0x5eae, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500,
+	0x2011, 0x5e84, 0x080c, 0x84ca, 0x9086, 0x0014, 0x11b8, 0x080c,
+	0x5ff5, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178, 0x7834,
 	0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110,
-	0x70c7, 0x0001, 0x709b, 0x0004, 0x0029, 0x0010, 0x080c, 0x5dae,
-	0x00fe, 0x0005, 0x00f6, 0x709b, 0x0005, 0x080c, 0x5d56, 0x2079,
-	0x0240, 0x7833, 0x1103, 0x7837, 0x0000, 0x080c, 0x5dd2, 0x080c,
-	0x5db5, 0x1170, 0x7084, 0x9005, 0x1158, 0x715c, 0x9186, 0xffff,
-	0x0138, 0x2011, 0x0008, 0x080c, 0x5c0e, 0x0168, 0x080c, 0x5d8b,
-	0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000,
-	0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5c8b, 0x00fe,
-	0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, 0x5c61, 0x080c,
-	0x8285, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5dd2, 0x2079, 0x0260,
-	0x7a30, 0x9296, 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38,
-	0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b,
-	0x0006, 0x0029, 0x0010, 0x080c, 0x5dae, 0x00fe, 0x0005, 0x00f6,
-	0x709b, 0x0007, 0x080c, 0x5d56, 0x2079, 0x0240, 0x7833, 0x1104,
-	0x7837, 0x0000, 0x080c, 0x5dd2, 0x080c, 0x5db5, 0x11b8, 0x7084,
-	0x9005, 0x11a0, 0x7164, 0x9186, 0xffff, 0x0180, 0x9180, 0x31d0,
-	0x200d, 0x918c, 0xff00, 0x810f, 0x2011, 0x0008, 0x080c, 0x5c0e,
-	0x0180, 0x080c, 0x4dd8, 0x0110, 0x080c, 0x2759, 0x20a9, 0x0008,
-	0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e,
-	0x4003, 0x60c3, 0x0014, 0x080c, 0x5c8b, 0x00fe, 0x0005, 0x00f6,
-	0x7090, 0x9005, 0x0500, 0x2011, 0x5c61, 0x080c, 0x8285, 0x9086,
-	0x0014, 0x11b8, 0x080c, 0x5dd2, 0x2079, 0x0260, 0x7a30, 0x9296,
-	0x1104, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128,
-	0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x0008, 0x0029,
-	0x0010, 0x080c, 0x5dae, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0009,
-	0x080c, 0x5d56, 0x2079, 0x0240, 0x7833, 0x1105, 0x7837, 0x0100,
-	0x080c, 0x5db5, 0x1150, 0x7084, 0x9005, 0x1138, 0x080c, 0x5b81,
-	0x1188, 0x9085, 0x0001, 0x080c, 0x2759, 0x20a9, 0x0008, 0x080c,
-	0x5dd2, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1,
-	0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5c8b, 0x0010, 0x080c,
-	0x56db, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x05a8, 0x2011,
-	0x5c61, 0x080c, 0x8285, 0x9086, 0x0014, 0x1560, 0x080c, 0x5dd2,
-	0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, 0x1520, 0x7834, 0x9084,
-	0x0100, 0x2011, 0x0100, 0x921e, 0x1160, 0x7a38, 0xd2fc, 0x0128,
-	0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x000a, 0x00b1,
-	0x0098, 0x9005, 0x1178, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005,
-	0x1110, 0x70c7, 0x0001, 0x7097, 0x0000, 0x709b, 0x000e, 0x080c,
-	0x5929, 0x0010, 0x080c, 0x5dae, 0x00fe, 0x0005, 0x00f6, 0x709b,
-	0x000b, 0x2011, 0x1c0e, 0x20e9, 0x0001, 0x22a0, 0x20a9, 0x0040,
-	0x2019, 0xffff, 0x4304, 0x080c, 0x5d56, 0x2079, 0x0240, 0x7833,
-	0x1106, 0x7837, 0x0000, 0x080c, 0x5db5, 0x0118, 0x2013, 0x0000,
-	0x0020, 0x7060, 0x9085, 0x0100, 0x2012, 0x20a9, 0x0040, 0x2009,
-	0x024e, 0x2011, 0x1c0e, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260,
-	0x1128, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x1f04, 0x58ab,
-	0x60c3, 0x0084, 0x080c, 0x5c8b, 0x00fe, 0x0005, 0x00f6, 0x7090,
-	0x9005, 0x01c0, 0x2011, 0x5c61, 0x080c, 0x8285, 0x9086, 0x0084,
-	0x1178, 0x080c, 0x5dd2, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106,
-	0x1138, 0x7834, 0x9005, 0x1120, 0x709b, 0x000c, 0x0029, 0x0010,
-	0x080c, 0x5dae, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x000d, 0x080c,
-	0x5d56, 0x2079, 0x0240, 0x7833, 0x1107, 0x7837, 0x0000, 0x080c,
-	0x5dd2, 0x20a9, 0x0040, 0x2011, 0x026e, 0x2009, 0x024e, 0x220e,
-	0x8210, 0x8108, 0x9186, 0x0260, 0x1150, 0x6810, 0x8000, 0x6812,
-	0x2009, 0x0240, 0x6814, 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04,
-	0x58ef, 0x60c3, 0x0084, 0x080c, 0x5c8b, 0x00fe, 0x0005, 0x00f6,
-	0x7090, 0x9005, 0x01e0, 0x2011, 0x5c61, 0x080c, 0x8285, 0x9086,
-	0x0084, 0x1198, 0x080c, 0x5dd2, 0x2079, 0x0260, 0x7a30, 0x9296,
-	0x1107, 0x1158, 0x7834, 0x9005, 0x1140, 0x7097, 0x0001, 0x080c,
-	0x5d28, 0x709b, 0x000e, 0x0029, 0x0010, 0x080c, 0x5dae, 0x00fe,
-	0x0005, 0x918d, 0x0001, 0x080c, 0x5dfd, 0x709b, 0x000f, 0x7093,
-	0x0000, 0x2061, 0x0140, 0x605b, 0xbc85, 0x605f, 0xb5b5, 0x2061,
-	0x0100, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009, 0x07d0, 0x2011,
-	0x5c61, 0x080c, 0x8279, 0x0005, 0x7090, 0x9005, 0x0130, 0x2011,
-	0x5c61, 0x080c, 0x8285, 0x709b, 0x0000, 0x0005, 0x709b, 0x0011,
-	0x080c, 0xa82b, 0x080c, 0x5dd2, 0x20e1, 0x0000, 0x2099, 0x0260,
-	0x20e9, 0x0000, 0x20a1, 0x0240, 0x7490, 0x9480, 0x0018, 0x9080,
-	0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, 0x4003, 0x080c, 0x5db5,
-	0x11a0, 0x717c, 0x81ff, 0x0188, 0x900e, 0x7080, 0x9084, 0x00ff,
-	0x0160, 0x080c, 0x26f0, 0x9186, 0x007e, 0x0138, 0x9186, 0x0080,
-	0x0120, 0x2011, 0x0008, 0x080c, 0x5c0e, 0x60c3, 0x0014, 0x080c,
-	0x5c8b, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, 0x5c61,
-	0x080c, 0x8285, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5dd2, 0x2079,
-	0x0260, 0x7a30, 0x9296, 0x1103, 0x1178, 0x7834, 0x9005, 0x1160,
+	0x70c7, 0x0001, 0x709b, 0x0006, 0x0029, 0x0010, 0x080c, 0x5fd1,
+	0x00fe, 0x0005, 0x00f6, 0x709b, 0x0007, 0x080c, 0x5f79, 0x2079,
+	0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x5ff5, 0x080c,
+	0x5fd8, 0x11b8, 0x7084, 0x9005, 0x11a0, 0x7164, 0x9186, 0xffff,
+	0x0180, 0x9180, 0x331e, 0x200d, 0x918c, 0xff00, 0x810f, 0x2011,
+	0x0008, 0x080c, 0x5e31, 0x0180, 0x080c, 0x4fe2, 0x0110, 0x080c,
+	0x28a7, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9,
+	0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5eae,
+	0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, 0x5e84,
+	0x080c, 0x84ca, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5ff5, 0x2079,
+	0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, 0x9005, 0x1160,
 	0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001,
-	0x709b, 0x0012, 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005,
-	0x00f6, 0x709b, 0x0013, 0x080c, 0x5d64, 0x2079, 0x0240, 0x7833,
-	0x1103, 0x7837, 0x0000, 0x080c, 0x5dd2, 0x080c, 0x5db5, 0x1170,
-	0x7084, 0x9005, 0x1158, 0x715c, 0x9186, 0xffff, 0x0138, 0x2011,
-	0x0008, 0x080c, 0x5c0e, 0x0168, 0x080c, 0x5d8b, 0x20a9, 0x0008,
-	0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e,
-	0x4003, 0x60c3, 0x0014, 0x080c, 0x5c8b, 0x00fe, 0x0005, 0x00f6,
-	0x7090, 0x9005, 0x0500, 0x2011, 0x5c61, 0x080c, 0x8285, 0x9086,
-	0x0014, 0x11b8, 0x080c, 0x5dd2, 0x2079, 0x0260, 0x7a30, 0x9296,
-	0x1104, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128,
-	0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x0014, 0x0029,
-	0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0015,
-	0x080c, 0x5d64, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000,
-	0x080c, 0x5dd2, 0x080c, 0x5db5, 0x11b8, 0x7084, 0x9005, 0x11a0,
-	0x7164, 0x9186, 0xffff, 0x0180, 0x9180, 0x31d0, 0x200d, 0x918c,
-	0xff00, 0x810f, 0x2011, 0x0008, 0x080c, 0x5c0e, 0x0180, 0x080c,
-	0x4dd8, 0x0110, 0x080c, 0x2759, 0x20a9, 0x0008, 0x20e1, 0x0000,
-	0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3,
-	0x0014, 0x080c, 0x5c8b, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005,
-	0x05f0, 0x2011, 0x5c61, 0x080c, 0x8285, 0x9086, 0x0014, 0x15a8,
-	0x080c, 0x5dd2, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, 0x1568,
-	0x7834, 0x9084, 0x0100, 0x2011, 0x0100, 0x921e, 0x1168, 0x9085,
-	0x0001, 0x080c, 0x5dfd, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005,
-	0x1110, 0x70c7, 0x0001, 0x0080, 0x9005, 0x11b8, 0x7a38, 0xd2fc,
-	0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x9085, 0x0001,
-	0x080c, 0x5dfd, 0x7097, 0x0000, 0x7a38, 0xd2f4, 0x0110, 0x70df,
-	0x0008, 0x709b, 0x0016, 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe,
-	0x0005, 0x080c, 0xa82b, 0x080c, 0x5dd2, 0x20e1, 0x0000, 0x2099,
-	0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000e, 0x4003,
-	0x2011, 0x026d, 0x2204, 0x9084, 0x0100, 0x2011, 0x024d, 0x2012,
-	0x2011, 0x026e, 0x709b, 0x0017, 0x080c, 0x5db5, 0x1150, 0x7084,
-	0x9005, 0x1138, 0x080c, 0x5b81, 0x1188, 0x9085, 0x0001, 0x080c,
-	0x2759, 0x20a9, 0x0008, 0x080c, 0x5dd2, 0x20e1, 0x0000, 0x2099,
-	0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014,
-	0x080c, 0x5c8b, 0x0010, 0x080c, 0x56db, 0x0005, 0x00f6, 0x7090,
-	0x9005, 0x01d8, 0x2011, 0x5c61, 0x080c, 0x8285, 0x9086, 0x0084,
-	0x1190, 0x080c, 0x5dd2, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106,
-	0x1150, 0x7834, 0x9005, 0x1138, 0x9006, 0x080c, 0x5dfd, 0x709b,
-	0x0018, 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6,
-	0x709b, 0x0019, 0x080c, 0x5d64, 0x2079, 0x0240, 0x7833, 0x1106,
-	0x7837, 0x0000, 0x080c, 0x5dd2, 0x2009, 0x026e, 0x2039, 0x1c0e,
-	0x20a9, 0x0040, 0x213e, 0x8738, 0x8108, 0x9186, 0x0280, 0x1128,
-	0x6814, 0x8000, 0x6816, 0x2009, 0x0260, 0x1f04, 0x5aea, 0x2039,
-	0x1c0e, 0x080c, 0x5db5, 0x11e8, 0x2728, 0x2514, 0x8207, 0x9084,
-	0x00ff, 0x8000, 0x2018, 0x9294, 0x00ff, 0x8007, 0x9205, 0x202a,
-	0x7060, 0x2310, 0x8214, 0x92a0, 0x1c0e, 0x2414, 0x938c, 0x0001,
-	0x0118, 0x9294, 0xff00, 0x0018, 0x9294, 0x00ff, 0x8007, 0x9215,
-	0x2222, 0x20a9, 0x0040, 0x2009, 0x024e, 0x270e, 0x8738, 0x8108,
-	0x9186, 0x0260, 0x1128, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240,
-	0x1f04, 0x5b1d, 0x60c3, 0x0084, 0x080c, 0x5c8b, 0x00fe, 0x0005,
-	0x00f6, 0x7090, 0x9005, 0x01e0, 0x2011, 0x5c61, 0x080c, 0x8285,
-	0x9086, 0x0084, 0x1198, 0x080c, 0x5dd2, 0x2079, 0x0260, 0x7a30,
-	0x9296, 0x1107, 0x1158, 0x7834, 0x9005, 0x1140, 0x7097, 0x0001,
-	0x080c, 0x5d28, 0x709b, 0x001a, 0x0029, 0x0010, 0x7093, 0x0000,
-	0x00fe, 0x0005, 0x9085, 0x0001, 0x080c, 0x5dfd, 0x709b, 0x001b,
-	0x080c, 0xa82b, 0x080c, 0x5dd2, 0x2011, 0x0260, 0x2009, 0x0240,
-	0x7490, 0x9480, 0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004,
-	0x20a8, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1150, 0x6810,
-	0x8000, 0x6812, 0x2009, 0x0240, 0x6814, 0x8000, 0x6816, 0x2011,
-	0x0260, 0x1f04, 0x5b69, 0x60c3, 0x0084, 0x080c, 0x5c8b, 0x0005,
-	0x0005, 0x0086, 0x0096, 0x2029, 0x1848, 0x252c, 0x20a9, 0x0008,
-	0x2041, 0x1c0e, 0x20e9, 0x0001, 0x28a0, 0x080c, 0x5dd2, 0x20e1,
-	0x0000, 0x2099, 0x026e, 0x4003, 0x20a9, 0x0008, 0x2011, 0x0007,
-	0xd5d4, 0x0108, 0x9016, 0x2800, 0x9200, 0x200c, 0x91a6, 0xffff,
-	0x1148, 0xd5d4, 0x0110, 0x8210, 0x0008, 0x8211, 0x1f04, 0x5b9b,
-	0x0804, 0x5c0a, 0x82ff, 0x1160, 0xd5d4, 0x0120, 0x91a6, 0x3fff,
-	0x0d90, 0x0020, 0x91a6, 0x3fff, 0x0904, 0x5c0a, 0x918d, 0xc000,
-	0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4, 0x0110, 0x2019, 0x0010,
-	0x2120, 0xd5d4, 0x0110, 0x8423, 0x0008, 0x8424, 0x1240, 0xd5d4,
-	0x0110, 0x8319, 0x0008, 0x8318, 0x1f04, 0x5bc1, 0x04d8, 0x23a8,
-	0x2021, 0x0001, 0x8426, 0x8425, 0x1f04, 0x5bd3, 0x2328, 0x8529,
-	0x92be, 0x0007, 0x0158, 0x0006, 0x2039, 0x0007, 0x2200, 0x973a,
-	0x000e, 0x27a8, 0x95a8, 0x0010, 0x1f04, 0x5be2, 0x755e, 0x95c8,
-	0x31d0, 0x292d, 0x95ac, 0x00ff, 0x7582, 0x6532, 0x6536, 0x0016,
-	0x2508, 0x080c, 0x2739, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x2018,
-	0x2304, 0x9405, 0x201a, 0x7087, 0x0001, 0x20e9, 0x0000, 0x20a1,
-	0x024e, 0x20e1, 0x0001, 0x2898, 0x20a9, 0x0008, 0x4003, 0x9085,
-	0x0001, 0x0008, 0x9006, 0x009e, 0x008e, 0x0005, 0x0156, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x22a8, 0x20e1, 0x0000, 0x2099, 0x026e,
-	0x20e9, 0x0000, 0x2011, 0x024e, 0x22a0, 0x4003, 0x014e, 0x013e,
-	0x01de, 0x01ce, 0x015e, 0x2118, 0x9026, 0x2001, 0x0007, 0x939a,
-	0x0010, 0x0218, 0x8420, 0x8001, 0x0cd0, 0x2118, 0x84ff, 0x0120,
-	0x939a, 0x0010, 0x8421, 0x1de0, 0x2021, 0x0001, 0x83ff, 0x0118,
-	0x8423, 0x8319, 0x1de8, 0x9238, 0x2029, 0x026e, 0x9528, 0x2504,
-	0x942c, 0x11b8, 0x9405, 0x203a, 0x715e, 0x91a0, 0x31d0, 0x242d,
-	0x95ac, 0x00ff, 0x7582, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c,
-	0x2739, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x7087, 0x0001, 0x9084,
-	0x0000, 0x0005, 0x00e6, 0x2071, 0x1800, 0x708b, 0x0000, 0x00ee,
-	0x0005, 0x00e6, 0x00f6, 0x2079, 0x0100, 0x2071, 0x0140, 0x080c,
-	0x5d17, 0x080c, 0x9ffc, 0x7004, 0x9084, 0x4000, 0x0110, 0x080c,
-	0x2bb1, 0x0126, 0x2091, 0x8000, 0x2071, 0x1826, 0x2073, 0x0000,
-	0x7840, 0x0026, 0x0016, 0x2009, 0x00f7, 0x080c, 0x5d74, 0x001e,
-	0x9094, 0x0010, 0x9285, 0x0080, 0x7842, 0x7a42, 0x002e, 0x012e,
-	0x00fe, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x2a57,
-	0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x2011, 0x19ef,
-	0x2013, 0x0000, 0x7093, 0x0000, 0x012e, 0x60a3, 0x0056, 0x60a7,
-	0x9575, 0x080c, 0x9ff3, 0x6144, 0xd184, 0x0120, 0x7198, 0x918d,
-	0x2000, 0x0018, 0x718c, 0x918d, 0x1000, 0x2011, 0x1997, 0x2112,
-	0x2009, 0x07d0, 0x2011, 0x5c61, 0x080c, 0x831a, 0x0005, 0x0016,
-	0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xaadc, 0x2009,
-	0x00f7, 0x080c, 0x5d74, 0x2061, 0x19f8, 0x900e, 0x611a, 0x611e,
-	0x6172, 0x6176, 0x2061, 0x1800, 0x6003, 0x0001, 0x2061, 0x0100,
-	0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x1997, 0x200b, 0x0000,
-	0x2009, 0x002d, 0x2011, 0x5ce3, 0x080c, 0x8279, 0x012e, 0x00ce,
-	0x002e, 0x001e, 0x0005, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000,
-	0x0471, 0x2071, 0x0100, 0x080c, 0x9ffc, 0x2071, 0x0140, 0x7004,
-	0x9084, 0x4000, 0x0110, 0x080c, 0x2bb1, 0x080c, 0x7185, 0x0188,
-	0x080c, 0x71a0, 0x1170, 0x080c, 0x746f, 0x0016, 0x080c, 0x2808,
-	0x2001, 0x196d, 0x2102, 0x001e, 0x080c, 0x746a, 0x080c, 0x70af,
-	0x0050, 0x2009, 0x0001, 0x080c, 0x2af0, 0x2001, 0x0001, 0x080c,
-	0x269c, 0x080c, 0x5cb7, 0x012e, 0x000e, 0x00ee, 0x0005, 0x2001,
-	0x180e, 0x2004, 0xd0bc, 0x0158, 0x0026, 0x0036, 0x2011, 0x8017,
-	0x2001, 0x1997, 0x201c, 0x080c, 0x48fb, 0x003e, 0x002e, 0x0005,
-	0x20a9, 0x0012, 0x20e9, 0x0001, 0x20a1, 0x1c80, 0x080c, 0x5dd2,
-	0x20e9, 0x0000, 0x2099, 0x026e, 0x0099, 0x20a9, 0x0020, 0x080c,
-	0x5dcc, 0x2099, 0x0260, 0x20a1, 0x1c92, 0x0051, 0x20a9, 0x000e,
-	0x080c, 0x5dcf, 0x2099, 0x0260, 0x20a1, 0x1cb2, 0x0009, 0x0005,
-	0x0016, 0x0026, 0x3410, 0x3308, 0x2104, 0x8007, 0x2012, 0x8108,
-	0x8210, 0x1f04, 0x5d4c, 0x002e, 0x001e, 0x0005, 0x080c, 0xa82b,
-	0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240,
-	0x20a9, 0x000c, 0x4003, 0x0005, 0x080c, 0xa82b, 0x080c, 0x5dd2,
+	0x709b, 0x0008, 0x0029, 0x0010, 0x080c, 0x5fd1, 0x00fe, 0x0005,
+	0x00f6, 0x709b, 0x0009, 0x080c, 0x5f79, 0x2079, 0x0240, 0x7833,
+	0x1105, 0x7837, 0x0100, 0x080c, 0x5fd8, 0x1150, 0x7084, 0x9005,
+	0x1138, 0x080c, 0x5da4, 0x1188, 0x9085, 0x0001, 0x080c, 0x28a7,
+	0x20a9, 0x0008, 0x080c, 0x5ff5, 0x20e1, 0x0000, 0x2099, 0x026e,
+	0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c,
+	0x5eae, 0x0010, 0x080c, 0x58fe, 0x00fe, 0x0005, 0x00f6, 0x7090,
+	0x9005, 0x05a8, 0x2011, 0x5e84, 0x080c, 0x84ca, 0x9086, 0x0014,
+	0x1560, 0x080c, 0x5ff5, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105,
+	0x1520, 0x7834, 0x9084, 0x0100, 0x2011, 0x0100, 0x921e, 0x1160,
+	0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001,
+	0x709b, 0x000a, 0x00b1, 0x0098, 0x9005, 0x1178, 0x7a38, 0xd2fc,
+	0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x7097, 0x0000,
+	0x709b, 0x000e, 0x080c, 0x5b4c, 0x0010, 0x080c, 0x5fd1, 0x00fe,
+	0x0005, 0x00f6, 0x709b, 0x000b, 0x2011, 0x1c0e, 0x20e9, 0x0001,
+	0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff, 0x4304, 0x080c, 0x5f79,
+	0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, 0x5fd8,
+	0x0118, 0x2013, 0x0000, 0x0020, 0x7060, 0x9085, 0x0100, 0x2012,
+	0x20a9, 0x0040, 0x2009, 0x024e, 0x2011, 0x1c0e, 0x220e, 0x8210,
+	0x8108, 0x9186, 0x0260, 0x1128, 0x6810, 0x8000, 0x6812, 0x2009,
+	0x0240, 0x1f04, 0x5ace, 0x60c3, 0x0084, 0x080c, 0x5eae, 0x00fe,
+	0x0005, 0x00f6, 0x7090, 0x9005, 0x01c0, 0x2011, 0x5e84, 0x080c,
+	0x84ca, 0x9086, 0x0084, 0x1178, 0x080c, 0x5ff5, 0x2079, 0x0260,
+	0x7a30, 0x9296, 0x1106, 0x1138, 0x7834, 0x9005, 0x1120, 0x709b,
+	0x000c, 0x0029, 0x0010, 0x080c, 0x5fd1, 0x00fe, 0x0005, 0x00f6,
+	0x709b, 0x000d, 0x080c, 0x5f79, 0x2079, 0x0240, 0x7833, 0x1107,
+	0x7837, 0x0000, 0x080c, 0x5ff5, 0x20a9, 0x0040, 0x2011, 0x026e,
+	0x2009, 0x024e, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1150,
+	0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x6814, 0x8000, 0x6816,
+	0x2011, 0x0260, 0x1f04, 0x5b12, 0x60c3, 0x0084, 0x080c, 0x5eae,
+	0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x01e0, 0x2011, 0x5e84,
+	0x080c, 0x84ca, 0x9086, 0x0084, 0x1198, 0x080c, 0x5ff5, 0x2079,
+	0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, 0x1140,
+	0x7097, 0x0001, 0x080c, 0x5f4b, 0x709b, 0x000e, 0x0029, 0x0010,
+	0x080c, 0x5fd1, 0x00fe, 0x0005, 0x918d, 0x0001, 0x080c, 0x6020,
+	0x709b, 0x000f, 0x7093, 0x0000, 0x2061, 0x0140, 0x605b, 0xbc85,
+	0x605f, 0xb5b5, 0x2061, 0x0100, 0x6043, 0x0005, 0x6043, 0x0004,
+	0x2009, 0x07d0, 0x2011, 0x5e84, 0x080c, 0x84be, 0x0005, 0x7090,
+	0x9005, 0x0130, 0x2011, 0x5e84, 0x080c, 0x84ca, 0x709b, 0x0000,
+	0x0005, 0x709b, 0x0011, 0x080c, 0xab07, 0x080c, 0x5ff5, 0x20e1,
+	0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x7490,
+	0x9480, 0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8,
+	0x4003, 0x080c, 0x5fd8, 0x11a0, 0x717c, 0x81ff, 0x0188, 0x900e,
+	0x7080, 0x9084, 0x00ff, 0x0160, 0x080c, 0x283e, 0x9186, 0x007e,
+	0x0138, 0x9186, 0x0080, 0x0120, 0x2011, 0x0008, 0x080c, 0x5e31,
+	0x60c3, 0x0014, 0x080c, 0x5eae, 0x0005, 0x00f6, 0x7090, 0x9005,
+	0x0500, 0x2011, 0x5e84, 0x080c, 0x84ca, 0x9086, 0x0014, 0x11b8,
+	0x080c, 0x5ff5, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178,
+	0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005,
+	0x1110, 0x70c7, 0x0001, 0x709b, 0x0012, 0x0029, 0x0010, 0x7093,
+	0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0013, 0x080c, 0x5f87,
+	0x2079, 0x0240, 0x7833, 0x1103, 0x7837, 0x0000, 0x080c, 0x5ff5,
+	0x080c, 0x5fd8, 0x1170, 0x7084, 0x9005, 0x1158, 0x715c, 0x9186,
+	0xffff, 0x0138, 0x2011, 0x0008, 0x080c, 0x5e31, 0x0168, 0x080c,
+	0x5fae, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9,
+	0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5eae,
+	0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, 0x5e84,
+	0x080c, 0x84ca, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5ff5, 0x2079,
+	0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, 0x9005, 0x1160,
+	0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001,
+	0x709b, 0x0014, 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005,
+	0x00f6, 0x709b, 0x0015, 0x080c, 0x5f87, 0x2079, 0x0240, 0x7833,
+	0x1104, 0x7837, 0x0000, 0x080c, 0x5ff5, 0x080c, 0x5fd8, 0x11b8,
+	0x7084, 0x9005, 0x11a0, 0x7164, 0x9186, 0xffff, 0x0180, 0x9180,
+	0x331e, 0x200d, 0x918c, 0xff00, 0x810f, 0x2011, 0x0008, 0x080c,
+	0x5e31, 0x0180, 0x080c, 0x4fe2, 0x0110, 0x080c, 0x28a7, 0x20a9,
+	0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1,
+	0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5eae, 0x00fe, 0x0005,
+	0x00f6, 0x7090, 0x9005, 0x05f0, 0x2011, 0x5e84, 0x080c, 0x84ca,
+	0x9086, 0x0014, 0x15a8, 0x080c, 0x5ff5, 0x2079, 0x0260, 0x7a30,
+	0x9296, 0x1105, 0x1568, 0x7834, 0x9084, 0x0100, 0x2011, 0x0100,
+	0x921e, 0x1168, 0x9085, 0x0001, 0x080c, 0x6020, 0x7a38, 0xd2fc,
+	0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x0080, 0x9005,
+	0x11b8, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7,
+	0x0001, 0x9085, 0x0001, 0x080c, 0x6020, 0x7097, 0x0000, 0x7a38,
+	0xd2f4, 0x0110, 0x70df, 0x0008, 0x709b, 0x0016, 0x0029, 0x0010,
+	0x7093, 0x0000, 0x00fe, 0x0005, 0x080c, 0xab07, 0x080c, 0x5ff5,
 	0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240,
-	0x20a9, 0x000c, 0x4003, 0x0005, 0x00c6, 0x0006, 0x2061, 0x0100,
-	0x810f, 0x2001, 0x1834, 0x2004, 0x9005, 0x1138, 0x2001, 0x1818,
-	0x2004, 0x9084, 0x00ff, 0x9105, 0x0010, 0x9185, 0x00f7, 0x604a,
-	0x000e, 0x00ce, 0x0005, 0x0016, 0x0046, 0x080c, 0x6733, 0x0158,
-	0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xe280, 0x2001, 0x180c,
-	0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x900e, 0x080c, 0x3039,
-	0x080c, 0xcf18, 0x0140, 0x0036, 0x2019, 0xffff, 0x2021, 0x0007,
-	0x080c, 0x4ab2, 0x003e, 0x004e, 0x001e, 0x0005, 0x080c, 0x5cb7,
-	0x709b, 0x0000, 0x7093, 0x0000, 0x0005, 0x0006, 0x2001, 0x180c,
-	0x2004, 0xd09c, 0x0100, 0x000e, 0x0005, 0x0006, 0x0016, 0x0126,
-	0x2091, 0x8000, 0x2001, 0x0101, 0x200c, 0x918d, 0x0006, 0x2102,
-	0x012e, 0x001e, 0x000e, 0x0005, 0x2009, 0x0001, 0x0020, 0x2009,
-	0x0002, 0x0008, 0x900e, 0x6814, 0x9084, 0xffc0, 0x910d, 0x6916,
-	0x0005, 0x00f6, 0x0156, 0x0146, 0x01d6, 0x9006, 0x20a9, 0x0080,
-	0x20e9, 0x0001, 0x20a1, 0x1c00, 0x4004, 0x2079, 0x1c00, 0x7803,
-	0x2200, 0x7807, 0x00ef, 0x780f, 0x00ef, 0x7813, 0x0138, 0x7823,
-	0xffff, 0x7827, 0xffff, 0x01de, 0x014e, 0x015e, 0x00fe, 0x0005,
-	0x2001, 0x1800, 0x2003, 0x0001, 0x0005, 0x2001, 0x19a4, 0x0118,
-	0x2003, 0x0001, 0x0010, 0x2003, 0x0000, 0x0005, 0x0156, 0x20a9,
-	0x0800, 0x2009, 0x1000, 0x9006, 0x200a, 0x8108, 0x1f04, 0x5e0c,
-	0x015e, 0x0005, 0x00d6, 0x0036, 0x0156, 0x0136, 0x0146, 0x2069,
-	0x1847, 0x9006, 0xb802, 0xb8ce, 0xb807, 0x0707, 0xb80a, 0xb80e,
-	0xb812, 0x9198, 0x31d0, 0x231d, 0x939c, 0x00ff, 0xbb16, 0x0016,
-	0x0026, 0xb8c2, 0x080c, 0xaad5, 0x1120, 0x9192, 0x007e, 0x1208,
-	0xbbc2, 0x20a9, 0x0004, 0xb8c4, 0x20e8, 0xb9c8, 0x9198, 0x0006,
-	0x9006, 0x23a0, 0x4004, 0x20a9, 0x0004, 0x9198, 0x000a, 0x23a0,
-	0x4004, 0x002e, 0x001e, 0xb83e, 0xb842, 0xb84e, 0xb852, 0xb856,
-	0xb85a, 0xb85e, 0xb862, 0xb866, 0xb86a, 0xb86f, 0x0100, 0xb872,
-	0xb876, 0xb87a, 0xb88a, 0xb88e, 0xb893, 0x0008, 0xb896, 0xb89a,
-	0xb89e, 0xb8be, 0xb9a2, 0x0096, 0xb8a4, 0x904d, 0x0110, 0x080c,
-	0x1032, 0xb8a7, 0x0000, 0x009e, 0x9006, 0xb84a, 0x6810, 0xb83a,
-	0x680c, 0xb846, 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0198, 0x00c6,
-	0x2060, 0x9c82, 0x1cd0, 0x0a0c, 0x0dd5, 0x2001, 0x181a, 0x2004,
-	0x9c02, 0x1a0c, 0x0dd5, 0x080c, 0x8710, 0x00ce, 0x090c, 0x8ab4,
-	0xb8af, 0x0000, 0x6814, 0x9084, 0x00ff, 0xb842, 0x014e, 0x013e,
-	0x015e, 0x003e, 0x00de, 0x0005, 0x0126, 0x2091, 0x8000, 0xa974,
-	0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x5efa, 0x9182,
-	0x0800, 0x1a04, 0x5efe, 0x2001, 0x180c, 0x2004, 0x9084, 0x0003,
-	0x1904, 0x5f04, 0x9188, 0x1000, 0x2104, 0x905d, 0x0518, 0xb804,
-	0x9084, 0x00ff, 0x908e, 0x0006, 0x1508, 0xb8a4, 0x900d, 0x1904,
-	0x5f16, 0xb850, 0x900d, 0x1148, 0xa802, 0x2900, 0xb852, 0xb84e,
-	0x080c, 0x8e9c, 0x9006, 0x012e, 0x0005, 0x00a6, 0x2150, 0x2900,
-	0xb002, 0xa803, 0x0000, 0x00ae, 0xb852, 0x0c90, 0x2001, 0x0005,
-	0x900e, 0x04b8, 0x2001, 0x0028, 0x900e, 0x0498, 0x9082, 0x0006,
-	0x1290, 0x080c, 0xaad5, 0x1160, 0xb8a0, 0x9084, 0xff80, 0x1140,
-	0xb900, 0xd1fc, 0x0990, 0x2001, 0x0029, 0x2009, 0x1000, 0x0408,
-	0x2001, 0x0028, 0x00a8, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118,
-	0x2001, 0x0004, 0x0068, 0xd184, 0x0118, 0x2001, 0x0004, 0x0040,
-	0x2001, 0x0029, 0xb900, 0xd1fc, 0x0118, 0x2009, 0x1000, 0x0048,
-	0x900e, 0x0038, 0x2001, 0x0029, 0x900e, 0x0018, 0x2001, 0x0029,
-	0x900e, 0x9005, 0x012e, 0x0005, 0x2001, 0x180c, 0x2004, 0xd084,
-	0x19d0, 0x9188, 0x1000, 0x2104, 0x905d, 0x09a8, 0x080c, 0x6737,
-	0x1990, 0xb800, 0xd0bc, 0x0978, 0x0804, 0x5ead, 0x080c, 0x6569,
-	0x0904, 0x5ec6, 0x0804, 0x5eb1, 0x00b6, 0x00e6, 0x0126, 0x2091,
-	0x8000, 0xa874, 0x908e, 0x00ff, 0x1120, 0x2001, 0x196b, 0x205c,
-	0x0060, 0xa974, 0x9182, 0x0800, 0x1690, 0x9188, 0x1000, 0x2104,
-	0x905d, 0x01d0, 0x080c, 0x66d7, 0x11d0, 0x080c, 0xab15, 0x0570,
-	0x2b00, 0x6012, 0x2900, 0x6016, 0x6023, 0x0009, 0x600b, 0x0000,
-	0xa874, 0x908e, 0x00ff, 0x1110, 0x600b, 0x8000, 0x2009, 0x0043,
-	0x080c, 0xabe6, 0x9006, 0x00b0, 0x2001, 0x0028, 0x0090, 0x2009,
-	0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184,
-	0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x0010, 0x2001,
+	0x20a9, 0x000e, 0x4003, 0x2011, 0x026d, 0x2204, 0x9084, 0x0100,
+	0x2011, 0x024d, 0x2012, 0x2011, 0x026e, 0x709b, 0x0017, 0x080c,
+	0x5fd8, 0x1150, 0x7084, 0x9005, 0x1138, 0x080c, 0x5da4, 0x1188,
+	0x9085, 0x0001, 0x080c, 0x28a7, 0x20a9, 0x0008, 0x080c, 0x5ff5,
+	0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e,
+	0x4003, 0x60c3, 0x0014, 0x080c, 0x5eae, 0x0010, 0x080c, 0x58fe,
+	0x0005, 0x00f6, 0x7090, 0x9005, 0x01d8, 0x2011, 0x5e84, 0x080c,
+	0x84ca, 0x9086, 0x0084, 0x1190, 0x080c, 0x5ff5, 0x2079, 0x0260,
+	0x7a30, 0x9296, 0x1106, 0x1150, 0x7834, 0x9005, 0x1138, 0x9006,
+	0x080c, 0x6020, 0x709b, 0x0018, 0x0029, 0x0010, 0x7093, 0x0000,
+	0x00fe, 0x0005, 0x00f6, 0x709b, 0x0019, 0x080c, 0x5f87, 0x2079,
+	0x0240, 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, 0x5ff5, 0x2009,
+	0x026e, 0x2039, 0x1c0e, 0x20a9, 0x0040, 0x213e, 0x8738, 0x8108,
+	0x9186, 0x0280, 0x1128, 0x6814, 0x8000, 0x6816, 0x2009, 0x0260,
+	0x1f04, 0x5d0d, 0x2039, 0x1c0e, 0x080c, 0x5fd8, 0x11e8, 0x2728,
+	0x2514, 0x8207, 0x9084, 0x00ff, 0x8000, 0x2018, 0x9294, 0x00ff,
+	0x8007, 0x9205, 0x202a, 0x7060, 0x2310, 0x8214, 0x92a0, 0x1c0e,
+	0x2414, 0x938c, 0x0001, 0x0118, 0x9294, 0xff00, 0x0018, 0x9294,
+	0x00ff, 0x8007, 0x9215, 0x2222, 0x20a9, 0x0040, 0x2009, 0x024e,
+	0x270e, 0x8738, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810, 0x8000,
+	0x6812, 0x2009, 0x0240, 0x1f04, 0x5d40, 0x60c3, 0x0084, 0x080c,
+	0x5eae, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x01e0, 0x2011,
+	0x5e84, 0x080c, 0x84ca, 0x9086, 0x0084, 0x1198, 0x080c, 0x5ff5,
+	0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, 0x9005,
+	0x1140, 0x7097, 0x0001, 0x080c, 0x5f4b, 0x709b, 0x001a, 0x0029,
+	0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x9085, 0x0001, 0x080c,
+	0x6020, 0x709b, 0x001b, 0x080c, 0xab07, 0x080c, 0x5ff5, 0x2011,
+	0x0260, 0x2009, 0x0240, 0x7490, 0x9480, 0x0018, 0x9080, 0x0007,
+	0x9084, 0x03f8, 0x8004, 0x20a8, 0x220e, 0x8210, 0x8108, 0x9186,
+	0x0260, 0x1150, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x6814,
+	0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, 0x5d8c, 0x60c3, 0x0084,
+	0x080c, 0x5eae, 0x0005, 0x0005, 0x0086, 0x0096, 0x2029, 0x1848,
+	0x252c, 0x20a9, 0x0008, 0x2041, 0x1c0e, 0x20e9, 0x0001, 0x28a0,
+	0x080c, 0x5ff5, 0x20e1, 0x0000, 0x2099, 0x026e, 0x4003, 0x20a9,
+	0x0008, 0x2011, 0x0007, 0xd5d4, 0x0108, 0x9016, 0x2800, 0x9200,
+	0x200c, 0x91a6, 0xffff, 0x1148, 0xd5d4, 0x0110, 0x8210, 0x0008,
+	0x8211, 0x1f04, 0x5dbe, 0x0804, 0x5e2d, 0x82ff, 0x1160, 0xd5d4,
+	0x0120, 0x91a6, 0x3fff, 0x0d90, 0x0020, 0x91a6, 0x3fff, 0x0904,
+	0x5e2d, 0x918d, 0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4,
+	0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4, 0x0110, 0x8423, 0x0008,
+	0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319, 0x0008, 0x8318, 0x1f04,
+	0x5de4, 0x04d8, 0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, 0x1f04,
+	0x5df6, 0x2328, 0x8529, 0x92be, 0x0007, 0x0158, 0x0006, 0x2039,
+	0x0007, 0x2200, 0x973a, 0x000e, 0x27a8, 0x95a8, 0x0010, 0x1f04,
+	0x5e05, 0x755e, 0x95c8, 0x331e, 0x292d, 0x95ac, 0x00ff, 0x7582,
+	0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x2887, 0x001e, 0x60e7,
+	0x0000, 0x65ea, 0x2018, 0x2304, 0x9405, 0x201a, 0x7087, 0x0001,
+	0x20e9, 0x0000, 0x20a1, 0x024e, 0x20e1, 0x0001, 0x2898, 0x20a9,
+	0x0008, 0x4003, 0x9085, 0x0001, 0x0008, 0x9006, 0x009e, 0x008e,
+	0x0005, 0x0156, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x22a8, 0x20e1,
+	0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x2011, 0x024e, 0x22a0,
+	0x4003, 0x014e, 0x013e, 0x01de, 0x01ce, 0x015e, 0x2118, 0x9026,
+	0x2001, 0x0007, 0x939a, 0x0010, 0x0218, 0x8420, 0x8001, 0x0cd0,
+	0x2118, 0x84ff, 0x0120, 0x939a, 0x0010, 0x8421, 0x1de0, 0x2021,
+	0x0001, 0x83ff, 0x0118, 0x8423, 0x8319, 0x1de8, 0x9238, 0x2029,
+	0x026e, 0x9528, 0x2504, 0x942c, 0x11b8, 0x9405, 0x203a, 0x715e,
+	0x91a0, 0x331e, 0x242d, 0x95ac, 0x00ff, 0x7582, 0x6532, 0x6536,
+	0x0016, 0x2508, 0x080c, 0x2887, 0x001e, 0x60e7, 0x0000, 0x65ea,
+	0x7087, 0x0001, 0x9084, 0x0000, 0x0005, 0x00e6, 0x2071, 0x1800,
+	0x708b, 0x0000, 0x00ee, 0x0005, 0x00e6, 0x00f6, 0x2079, 0x0100,
+	0x2071, 0x0140, 0x080c, 0x5f3a, 0x080c, 0xa259, 0x7004, 0x9084,
+	0x4000, 0x0110, 0x080c, 0x2cff, 0x0126, 0x2091, 0x8000, 0x2071,
+	0x1826, 0x2073, 0x0000, 0x7840, 0x0026, 0x0016, 0x2009, 0x00f7,
+	0x080c, 0x5f97, 0x001e, 0x9094, 0x0010, 0x9285, 0x0080, 0x7842,
+	0x7a42, 0x002e, 0x012e, 0x00fe, 0x00ee, 0x0005, 0x0126, 0x2091,
+	0x8000, 0x080c, 0x2ba5, 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5,
+	0x2012, 0x2011, 0x19f1, 0x2013, 0x0000, 0x7093, 0x0000, 0x012e,
+	0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0xa250, 0x6144, 0xd184,
+	0x0120, 0x7198, 0x918d, 0x2000, 0x0018, 0x718c, 0x918d, 0x1000,
+	0x2011, 0x1999, 0x2112, 0x2009, 0x07d0, 0x2011, 0x5e84, 0x080c,
+	0x8562, 0x0005, 0x0016, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000,
+	0x080c, 0xadb8, 0x2009, 0x00f7, 0x080c, 0x5f97, 0x2061, 0x19fa,
+	0x900e, 0x611a, 0x611e, 0x6172, 0x6176, 0x2061, 0x1800, 0x6003,
+	0x0001, 0x2061, 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009,
+	0x1999, 0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x5f06, 0x080c,
+	0x84be, 0x012e, 0x00ce, 0x002e, 0x001e, 0x0005, 0x00e6, 0x0006,
+	0x0126, 0x2091, 0x8000, 0x0471, 0x2071, 0x0100, 0x080c, 0xa259,
+	0x2071, 0x0140, 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, 0x2cff,
+	0x080c, 0x73b8, 0x0188, 0x080c, 0x73d3, 0x1170, 0x080c, 0x76a2,
+	0x0016, 0x080c, 0x2956, 0x2001, 0x196d, 0x2102, 0x001e, 0x080c,
+	0x769d, 0x080c, 0x72e2, 0x0050, 0x2009, 0x0001, 0x080c, 0x2c3e,
+	0x2001, 0x0001, 0x080c, 0x27ea, 0x080c, 0x5eda, 0x012e, 0x000e,
+	0x00ee, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0bc, 0x0158, 0x0026,
+	0x0036, 0x2011, 0x8017, 0x2001, 0x1999, 0x201c, 0x080c, 0x4b05,
+	0x003e, 0x002e, 0x0005, 0x20a9, 0x0012, 0x20e9, 0x0001, 0x20a1,
+	0x1c80, 0x080c, 0x5ff5, 0x20e9, 0x0000, 0x2099, 0x026e, 0x0099,
+	0x20a9, 0x0020, 0x080c, 0x5fef, 0x2099, 0x0260, 0x20a1, 0x1c92,
+	0x0051, 0x20a9, 0x000e, 0x080c, 0x5ff2, 0x2099, 0x0260, 0x20a1,
+	0x1cb2, 0x0009, 0x0005, 0x0016, 0x0026, 0x3410, 0x3308, 0x2104,
+	0x8007, 0x2012, 0x8108, 0x8210, 0x1f04, 0x5f6f, 0x002e, 0x001e,
+	0x0005, 0x080c, 0xab07, 0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9,
+	0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x080c,
+	0xab07, 0x080c, 0x5ff5, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9,
+	0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x00c6,
+	0x0006, 0x2061, 0x0100, 0x810f, 0x2001, 0x1834, 0x2004, 0x9005,
+	0x1138, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, 0x9105, 0x0010,
+	0x9185, 0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005, 0x0016, 0x0046,
+	0x080c, 0x6966, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c,
+	0xe58d, 0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a,
+	0x900e, 0x080c, 0x3187, 0x080c, 0xd216, 0x0140, 0x0036, 0x2019,
+	0xffff, 0x2021, 0x0007, 0x080c, 0x4cbc, 0x003e, 0x004e, 0x001e,
+	0x0005, 0x080c, 0x5eda, 0x709b, 0x0000, 0x7093, 0x0000, 0x0005,
+	0x0006, 0x2001, 0x180c, 0x2004, 0xd09c, 0x0100, 0x000e, 0x0005,
+	0x0006, 0x0016, 0x0126, 0x2091, 0x8000, 0x2001, 0x0101, 0x200c,
+	0x918d, 0x0006, 0x2102, 0x012e, 0x001e, 0x000e, 0x0005, 0x2009,
+	0x0001, 0x0020, 0x2009, 0x0002, 0x0008, 0x900e, 0x6814, 0x9084,
+	0xffc0, 0x910d, 0x6916, 0x0005, 0x00f6, 0x0156, 0x0146, 0x01d6,
+	0x9006, 0x20a9, 0x0080, 0x20e9, 0x0001, 0x20a1, 0x1c00, 0x4004,
+	0x2079, 0x1c00, 0x7803, 0x2200, 0x7807, 0x00ef, 0x780f, 0x00ef,
+	0x7813, 0x0138, 0x7823, 0xffff, 0x7827, 0xffff, 0x01de, 0x014e,
+	0x015e, 0x00fe, 0x0005, 0x2001, 0x1800, 0x2003, 0x0001, 0x0005,
+	0x2001, 0x19a6, 0x0118, 0x2003, 0x0001, 0x0010, 0x2003, 0x0000,
+	0x0005, 0x0156, 0x20a9, 0x0800, 0x2009, 0x1000, 0x9006, 0x200a,
+	0x8108, 0x1f04, 0x602f, 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156,
+	0x0136, 0x0146, 0x2069, 0x1847, 0x9006, 0xb802, 0xb8ce, 0xb807,
+	0x0707, 0xb80a, 0xb80e, 0xb812, 0x9198, 0x331e, 0x231d, 0x939c,
+	0x00ff, 0xbb16, 0x0016, 0x0026, 0xb8c2, 0x080c, 0xadb1, 0x1120,
+	0x9192, 0x007e, 0x1208, 0xbbc2, 0x20a9, 0x0004, 0xb8c4, 0x20e8,
+	0xb9c8, 0x9198, 0x0006, 0x9006, 0x23a0, 0x4004, 0x20a9, 0x0004,
+	0x9198, 0x000a, 0x23a0, 0x4004, 0x002e, 0x001e, 0xb83e, 0xb842,
+	0xb84e, 0xb852, 0xb856, 0xb85a, 0xb85e, 0xb862, 0xb866, 0xb86a,
+	0xb86f, 0x0100, 0xb872, 0xb876, 0xb87a, 0xb88a, 0xb88e, 0xb893,
+	0x0008, 0xb896, 0xb89a, 0xb89e, 0xb8be, 0xb9a2, 0x0096, 0xb8a4,
+	0x904d, 0x0110, 0x080c, 0x1031, 0xb8a7, 0x0000, 0x009e, 0x9006,
+	0xb84a, 0x6810, 0xb83a, 0x680c, 0xb846, 0xb8bb, 0x0520, 0xb8ac,
+	0x9005, 0x0198, 0x00c6, 0x2060, 0x9c82, 0x1cd0, 0x0a0c, 0x0dd5,
+	0x2001, 0x181a, 0x2004, 0x9c02, 0x1a0c, 0x0dd5, 0x080c, 0x8958,
+	0x00ce, 0x090c, 0x8cfc, 0xb8af, 0x0000, 0x6814, 0x9084, 0x00ff,
+	0xb842, 0x014e, 0x013e, 0x015e, 0x003e, 0x00de, 0x0005, 0x0126,
+	0x2091, 0x8000, 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000,
+	0x1a04, 0x611d, 0x9182, 0x0800, 0x1a04, 0x6121, 0x2001, 0x180c,
+	0x2004, 0x9084, 0x0003, 0x1904, 0x6127, 0x9188, 0x1000, 0x2104,
+	0x905d, 0x0518, 0xb804, 0x9084, 0x00ff, 0x908e, 0x0006, 0x1508,
+	0xb8a4, 0x900d, 0x1904, 0x6139, 0xb850, 0x900d, 0x1148, 0xa802,
+	0x2900, 0xb852, 0xb84e, 0x080c, 0x90e4, 0x9006, 0x012e, 0x0005,
+	0x00a6, 0x2150, 0x2900, 0xb002, 0xa803, 0x0000, 0x00ae, 0xb852,
+	0x0c90, 0x2001, 0x0005, 0x900e, 0x04b8, 0x2001, 0x0028, 0x900e,
+	0x0498, 0x9082, 0x0006, 0x1290, 0x080c, 0xadb1, 0x1160, 0xb8a0,
+	0x9084, 0xff80, 0x1140, 0xb900, 0xd1fc, 0x0990, 0x2001, 0x0029,
+	0x2009, 0x1000, 0x0408, 0x2001, 0x0028, 0x00a8, 0x2009, 0x180c,
+	0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0068, 0xd184, 0x0118,
+	0x2001, 0x0004, 0x0040, 0x2001, 0x0029, 0xb900, 0xd1fc, 0x0118,
+	0x2009, 0x1000, 0x0048, 0x900e, 0x0038, 0x2001, 0x0029, 0x900e,
+	0x0018, 0x2001, 0x0029, 0x900e, 0x9005, 0x012e, 0x0005, 0x2001,
+	0x180c, 0x2004, 0xd084, 0x19d0, 0x9188, 0x1000, 0x2104, 0x905d,
+	0x09a8, 0x080c, 0x696a, 0x1990, 0xb800, 0xd0bc, 0x0978, 0x0804,
+	0x60d0, 0x080c, 0x679c, 0x0904, 0x60e9, 0x0804, 0x60d4, 0x00b6,
+	0x00e6, 0x0126, 0x2091, 0x8000, 0xa874, 0x908e, 0x00ff, 0x1120,
+	0x2001, 0x196b, 0x205c, 0x0060, 0xa974, 0x9182, 0x0800, 0x1690,
+	0x9188, 0x1000, 0x2104, 0x905d, 0x01d0, 0x080c, 0x690a, 0x11d0,
+	0x080c, 0xadf1, 0x0570, 0x2b00, 0x6012, 0x2900, 0x6016, 0x6023,
+	0x0009, 0x600b, 0x0000, 0xa874, 0x908e, 0x00ff, 0x1110, 0x600b,
+	0x8000, 0x2009, 0x0043, 0x080c, 0xaec2, 0x9006, 0x00b0, 0x2001,
+	0x0028, 0x0090, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001,
+	0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001,
+	0x0029, 0x0010, 0x2001, 0x0029, 0x9005, 0x012e, 0x00ee, 0x00be,
+	0x0005, 0x2001, 0x002c, 0x0cc0, 0x00b6, 0x00e6, 0x0126, 0x2091,
+	0x8000, 0xa974, 0x9182, 0x0800, 0x1a04, 0x6207, 0x9188, 0x1000,
+	0x2104, 0x905d, 0x0904, 0x61df, 0xb8a0, 0x9086, 0x007f, 0x0178,
+	0x080c, 0x6972, 0x0160, 0xa994, 0x81ff, 0x0130, 0x908e, 0x0004,
+	0x0130, 0x908e, 0x0005, 0x0118, 0x080c, 0x696a, 0x1598, 0xa87c,
+	0xd0fc, 0x01e0, 0xa894, 0x9005, 0x01c8, 0x2060, 0x0026, 0x2010,
+	0x080c, 0xcb09, 0x002e, 0x1120, 0x2001, 0x0008, 0x0804, 0x6209,
+	0x6020, 0x9086, 0x000a, 0x0120, 0x2001, 0x0008, 0x0804, 0x6209,
+	0x601a, 0x6003, 0x0008, 0x2900, 0x6016, 0x0058, 0x080c, 0xadf1,
+	0x05e8, 0x2b00, 0x6012, 0x2900, 0x6016, 0x600b, 0xffff, 0x6023,
+	0x000a, 0x2009, 0x0003, 0x080c, 0xaec2, 0x9006, 0x0458, 0x2001,
+	0x0028, 0x0438, 0x9082, 0x0006, 0x1290, 0x080c, 0xadb1, 0x1160,
+	0xb8a0, 0x9084, 0xff80, 0x1140, 0xb900, 0xd1fc, 0x0900, 0x2001,
+	0x0029, 0x2009, 0x1000, 0x00a8, 0x2001, 0x0028, 0x0090, 0x2009,
+	0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0050, 0xd184,
+	0x0118, 0x2001, 0x0004, 0x0028, 0x2001, 0x0029, 0x0010, 0x2001,
 	0x0029, 0x9005, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2001, 0x002c,
-	0x0cc0, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0xa974, 0x9182,
-	0x0800, 0x1a04, 0x5fe4, 0x9188, 0x1000, 0x2104, 0x905d, 0x0904,
-	0x5fbc, 0xb8a0, 0x9086, 0x007f, 0x0178, 0x080c, 0x673f, 0x0160,
-	0xa994, 0x81ff, 0x0130, 0x908e, 0x0004, 0x0130, 0x908e, 0x0005,
-	0x0118, 0x080c, 0x6737, 0x1598, 0xa87c, 0xd0fc, 0x01e0, 0xa894,
-	0x9005, 0x01c8, 0x2060, 0x0026, 0x2010, 0x080c, 0xc813, 0x002e,
-	0x1120, 0x2001, 0x0008, 0x0804, 0x5fe6, 0x6020, 0x9086, 0x000a,
-	0x0120, 0x2001, 0x0008, 0x0804, 0x5fe6, 0x601a, 0x6003, 0x0008,
-	0x2900, 0x6016, 0x0058, 0x080c, 0xab15, 0x05e8, 0x2b00, 0x6012,
-	0x2900, 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, 0x2009, 0x0003,
-	0x080c, 0xabe6, 0x9006, 0x0458, 0x2001, 0x0028, 0x0438, 0x9082,
-	0x0006, 0x1290, 0x080c, 0xaad5, 0x1160, 0xb8a0, 0x9084, 0xff80,
-	0x1140, 0xb900, 0xd1fc, 0x0900, 0x2001, 0x0029, 0x2009, 0x1000,
-	0x00a8, 0x2001, 0x0028, 0x0090, 0x2009, 0x180c, 0x210c, 0xd18c,
-	0x0118, 0x2001, 0x0004, 0x0050, 0xd184, 0x0118, 0x2001, 0x0004,
-	0x0028, 0x2001, 0x0029, 0x0010, 0x2001, 0x0029, 0x9005, 0x012e,
-	0x00ee, 0x00be, 0x0005, 0x2001, 0x002c, 0x0cc0, 0x00f6, 0x00b6,
-	0x0126, 0x2091, 0x8000, 0xa8e0, 0x9005, 0x1550, 0xa8dc, 0x9082,
-	0x0101, 0x1630, 0xa8c8, 0x9005, 0x1518, 0xa8c4, 0x9082, 0x0101,
-	0x12f8, 0xa974, 0x2079, 0x1800, 0x9182, 0x0800, 0x12e8, 0x7830,
-	0x9084, 0x0003, 0x1130, 0xaa98, 0xab94, 0xa878, 0x9084, 0x0007,
-	0x00ea, 0x7930, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184,
-	0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x900e, 0x0038,
-	0x2001, 0x002c, 0x900e, 0x0018, 0x2001, 0x0029, 0x900e, 0x9006,
-	0x0008, 0x9005, 0x012e, 0x00be, 0x00fe, 0x0005, 0x607b, 0x6036,
-	0x604d, 0x607b, 0x607b, 0x607b, 0x607b, 0x607b, 0x2100, 0x9082,
-	0x007e, 0x1278, 0x080c, 0x636c, 0x0148, 0x9046, 0xb810, 0x9306,
-	0x1904, 0x6083, 0xb814, 0x9206, 0x15f0, 0x0028, 0xbb12, 0xba16,
-	0x0010, 0x080c, 0x47ae, 0x0150, 0x04b0, 0x080c, 0x63cd, 0x1598,
-	0xb810, 0x9306, 0x1580, 0xb814, 0x9206, 0x1568, 0x080c, 0xab15,
-	0x0530, 0x2b00, 0x6012, 0x080c, 0xcc93, 0x2900, 0x6016, 0x600b,
-	0xffff, 0x6023, 0x000a, 0xa878, 0x9086, 0x0001, 0x1170, 0x080c,
-	0x306e, 0x9006, 0x080c, 0x6309, 0x2001, 0x0002, 0x080c, 0x631d,
-	0x2001, 0x0200, 0xb86e, 0xb893, 0x0002, 0x2009, 0x0003, 0x080c,
-	0xabe6, 0x9006, 0x0068, 0x2001, 0x0001, 0x900e, 0x0038, 0x2001,
-	0x002c, 0x900e, 0x0018, 0x2001, 0x0028, 0x900e, 0x9005, 0x0000,
-	0x012e, 0x00be, 0x00fe, 0x0005, 0x00b6, 0x00f6, 0x00e6, 0x0126,
-	0x2091, 0x8000, 0xa894, 0x90c6, 0x0015, 0x0904, 0x6262, 0x90c6,
-	0x0056, 0x0904, 0x6266, 0x90c6, 0x0066, 0x0904, 0x626a, 0x90c6,
-	0x0071, 0x0904, 0x626e, 0x90c6, 0x0074, 0x0904, 0x6272, 0x90c6,
-	0x007c, 0x0904, 0x6276, 0x90c6, 0x007e, 0x0904, 0x627a, 0x90c6,
-	0x0037, 0x0904, 0x627e, 0x9016, 0x2079, 0x1800, 0xa974, 0x9186,
-	0x00ff, 0x0904, 0x625d, 0x9182, 0x0800, 0x1a04, 0x625d, 0x080c,
-	0x63cd, 0x1198, 0xb804, 0x9084, 0x00ff, 0x9082, 0x0006, 0x1268,
-	0xa894, 0x90c6, 0x006f, 0x0148, 0x080c, 0xaad5, 0x1904, 0x6246,
-	0xb8a0, 0x9084, 0xff80, 0x1904, 0x6246, 0xa894, 0x90c6, 0x006f,
-	0x0158, 0x90c6, 0x005e, 0x0904, 0x61a6, 0x90c6, 0x0064, 0x0904,
-	0x61cf, 0x2008, 0x0804, 0x6168, 0xa998, 0xa8b0, 0x2040, 0x080c,
-	0xaad5, 0x1120, 0x9182, 0x007f, 0x0a04, 0x6168, 0x9186, 0x00ff,
-	0x0904, 0x6168, 0x9182, 0x0800, 0x1a04, 0x6168, 0xaaa0, 0xab9c,
-	0x787c, 0x9306, 0x1188, 0x7880, 0x0096, 0x924e, 0x1128, 0x2208,
-	0x2310, 0x009e, 0x0804, 0x6168, 0x99cc, 0xff00, 0x009e, 0x1120,
-	0x2208, 0x2310, 0x0804, 0x6168, 0x080c, 0x47ae, 0x0904, 0x6172,
-	0x900e, 0x9016, 0x90c6, 0x4000, 0x15e0, 0x0006, 0x080c, 0x65ed,
-	0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x20a9, 0x0004,
-	0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8c4, 0x20e0,
-	0xb8c8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0f7d, 0x20a9, 0x0004,
-	0xa860, 0x20e8, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8c4, 0x20e0,
-	0xb8c8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0f7d, 0xa8c4, 0xabc8,
-	0x9305, 0xabcc, 0x9305, 0xabd0, 0x9305, 0xabd4, 0x9305, 0xabd8,
-	0x9305, 0xabdc, 0x9305, 0xabe0, 0x9305, 0x9005, 0x0510, 0x000e,
-	0x00c8, 0x90c6, 0x4007, 0x1110, 0x2408, 0x00a0, 0x90c6, 0x4008,
-	0x1118, 0x2708, 0x2610, 0x0070, 0x90c6, 0x4009, 0x1108, 0x0050,
-	0x90c6, 0x4006, 0x0138, 0x2001, 0x4005, 0x2009, 0x000a, 0x0010,
-	0x2001, 0x4006, 0xa896, 0xa99a, 0xaa9e, 0x2001, 0x0030, 0x900e,
-	0x0478, 0x000e, 0x080c, 0xab15, 0x1130, 0x2001, 0x4005, 0x2009,
-	0x0003, 0x9016, 0x0c78, 0x2b00, 0x6012, 0x080c, 0xcc93, 0x2900,
-	0x6016, 0x6023, 0x0001, 0xa868, 0xd88c, 0x0108, 0xc0f5, 0xa86a,
-	0x0126, 0x2091, 0x8000, 0x080c, 0x306e, 0x012e, 0x9006, 0x080c,
-	0x6309, 0x2001, 0x0002, 0x080c, 0x631d, 0x2009, 0x0002, 0x080c,
-	0xabe6, 0xa8b0, 0xd094, 0x0118, 0xb8cc, 0xc08d, 0xb8ce, 0x9006,
-	0x9005, 0x012e, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x080c, 0x54cb,
-	0x0118, 0x2009, 0x0007, 0x00f8, 0xa998, 0xaeb0, 0x080c, 0x63cd,
-	0x1904, 0x6163, 0x9186, 0x007f, 0x0130, 0x080c, 0x6737, 0x0118,
-	0x2009, 0x0009, 0x0080, 0x0096, 0x080c, 0x1000, 0x1120, 0x009e,
-	0x2009, 0x0002, 0x0040, 0x2900, 0x009e, 0xa806, 0x080c, 0xca04,
-	0x19b0, 0x2009, 0x0003, 0x2001, 0x4005, 0x0804, 0x616a, 0xa998,
-	0xaeb0, 0x080c, 0x63cd, 0x1904, 0x6163, 0x0096, 0x080c, 0x1000,
-	0x1128, 0x009e, 0x2009, 0x0002, 0x0804, 0x6223, 0x2900, 0x009e,
-	0xa806, 0x0096, 0x2048, 0x20a9, 0x002b, 0xb8c4, 0x20e0, 0xb8c8,
-	0x2098, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003,
-	0x20a9, 0x0008, 0x9080, 0x0006, 0x20a0, 0xbbc8, 0x9398, 0x0006,
-	0x2398, 0x080c, 0x0f7d, 0x009e, 0xa87b, 0x0000, 0xa883, 0x0000,
-	0xa897, 0x4000, 0xd684, 0x1168, 0x080c, 0x54b7, 0xd0b4, 0x1118,
-	0xa89b, 0x000b, 0x00e0, 0xb800, 0xd08c, 0x0118, 0xa89b, 0x000c,
-	0x00b0, 0x080c, 0x6737, 0x0118, 0xa89b, 0x0009, 0x0080, 0x080c,
-	0x54cb, 0x0118, 0xa89b, 0x0007, 0x0050, 0x080c, 0xc9e7, 0x1904,
-	0x619f, 0x2009, 0x0003, 0x2001, 0x4005, 0x0804, 0x616a, 0xa87b,
-	0x0030, 0xa897, 0x4005, 0xa804, 0x8006, 0x8006, 0x8007, 0x90bc,
-	0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0,
-	0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x123a, 0x080c,
-	0xb084, 0x1904, 0x619f, 0x2009, 0x0002, 0x08e8, 0x2001, 0x0028,
-	0x900e, 0x0804, 0x61a0, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118,
-	0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010,
-	0x2001, 0x0029, 0x900e, 0x0804, 0x61a0, 0x2001, 0x0029, 0x900e,
-	0x0804, 0x61a0, 0x080c, 0x35f4, 0x0804, 0x61a1, 0x080c, 0x51f4,
-	0x0804, 0x61a1, 0x080c, 0x43fa, 0x0804, 0x61a1, 0x080c, 0x4871,
-	0x0804, 0x61a1, 0x080c, 0x4b28, 0x0804, 0x61a1, 0x080c, 0x4e6e,
-	0x0804, 0x61a1, 0x080c, 0x505f, 0x0804, 0x61a1, 0x080c, 0x380a,
-	0x0804, 0x61a1, 0x00b6, 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082,
-	0x4000, 0x1618, 0x9182, 0x0800, 0x1268, 0x9188, 0x1000, 0x2104,
-	0x905d, 0x0140, 0x080c, 0x6737, 0x1148, 0x00e9, 0x080c, 0x64f8,
-	0x9006, 0x00b0, 0x2001, 0x0028, 0x900e, 0x0090, 0x9082, 0x0006,
-	0x1240, 0xb900, 0xd1fc, 0x0d88, 0x2001, 0x0029, 0x2009, 0x1000,
-	0x0038, 0x2001, 0x0029, 0x900e, 0x0018, 0x2001, 0x0029, 0x900e,
-	0x9005, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0xb850, 0x900d,
-	0x0150, 0x2900, 0x0096, 0x2148, 0xa802, 0x009e, 0xa803, 0x0000,
-	0xb852, 0x012e, 0x0005, 0x2900, 0xb852, 0xb84e, 0xa803, 0x0000,
-	0x0cc0, 0x0126, 0x2091, 0x8000, 0xb84c, 0x9005, 0x0170, 0x00e6,
-	0x2071, 0x19e5, 0x7004, 0x9086, 0x0002, 0x0168, 0x00ee, 0xb84c,
-	0xa802, 0x2900, 0xb84e, 0x012e, 0x0005, 0x2900, 0xb852, 0xb84e,
-	0xa803, 0x0000, 0x0cc0, 0x701c, 0x9b06, 0x1d80, 0xb84c, 0x00a6,
-	0x2050, 0xb000, 0xa802, 0x2900, 0xb002, 0x00ae, 0x00ee, 0x012e,
-	0x0005, 0x0126, 0x2091, 0x8000, 0xb84c, 0x904d, 0x0130, 0xa800,
-	0x9005, 0x1108, 0xb852, 0xb84e, 0x9905, 0x012e, 0x0005, 0xb84c,
+	0x0cc0, 0x00f6, 0x00b6, 0x0126, 0x2091, 0x8000, 0xa8e0, 0x9005,
+	0x1550, 0xa8dc, 0x9082, 0x0101, 0x1630, 0xa8c8, 0x9005, 0x1518,
+	0xa8c4, 0x9082, 0x0101, 0x12f8, 0xa974, 0x2079, 0x1800, 0x9182,
+	0x0800, 0x12e8, 0x7830, 0x9084, 0x0003, 0x1130, 0xaa98, 0xab94,
+	0xa878, 0x9084, 0x0007, 0x00ea, 0x7930, 0xd18c, 0x0118, 0x2001,
+	0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001,
+	0x0029, 0x900e, 0x0038, 0x2001, 0x002c, 0x900e, 0x0018, 0x2001,
+	0x0029, 0x900e, 0x9006, 0x0008, 0x9005, 0x012e, 0x00be, 0x00fe,
+	0x0005, 0x629e, 0x6259, 0x6270, 0x629e, 0x629e, 0x629e, 0x629e,
+	0x629e, 0x2100, 0x9082, 0x007e, 0x1278, 0x080c, 0x659f, 0x0148,
+	0x9046, 0xb810, 0x9306, 0x1904, 0x62a6, 0xb814, 0x9206, 0x15f0,
+	0x0028, 0xbb12, 0xba16, 0x0010, 0x080c, 0x49b8, 0x0150, 0x04b0,
+	0x080c, 0x6600, 0x1598, 0xb810, 0x9306, 0x1580, 0xb814, 0x9206,
+	0x1568, 0x080c, 0xadf1, 0x0530, 0x2b00, 0x6012, 0x080c, 0xcf90,
+	0x2900, 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, 0xa878, 0x9086,
+	0x0001, 0x1170, 0x080c, 0x31bc, 0x9006, 0x080c, 0x653c, 0x2001,
+	0x0002, 0x080c, 0x6550, 0x2001, 0x0200, 0xb86e, 0xb893, 0x0002,
+	0x2009, 0x0003, 0x080c, 0xaec2, 0x9006, 0x0068, 0x2001, 0x0001,
+	0x900e, 0x0038, 0x2001, 0x002c, 0x900e, 0x0018, 0x2001, 0x0028,
+	0x900e, 0x9005, 0x0000, 0x012e, 0x00be, 0x00fe, 0x0005, 0x00b6,
+	0x00f6, 0x00e6, 0x0126, 0x2091, 0x8000, 0xa894, 0x90c6, 0x0015,
+	0x0904, 0x648d, 0x90c6, 0x0056, 0x0904, 0x6491, 0x90c6, 0x0066,
+	0x0904, 0x6495, 0x90c6, 0x0067, 0x0904, 0x6499, 0x90c6, 0x0068,
+	0x0904, 0x649d, 0x90c6, 0x0071, 0x0904, 0x64a1, 0x90c6, 0x0074,
+	0x0904, 0x64a5, 0x90c6, 0x007c, 0x0904, 0x64a9, 0x90c6, 0x007e,
+	0x0904, 0x64ad, 0x90c6, 0x0037, 0x0904, 0x64b1, 0x9016, 0x2079,
+	0x1800, 0xa974, 0x9186, 0x00ff, 0x0904, 0x6488, 0x9182, 0x0800,
+	0x1a04, 0x6488, 0x080c, 0x6600, 0x1198, 0xb804, 0x9084, 0x00ff,
+	0x9082, 0x0006, 0x1268, 0xa894, 0x90c6, 0x006f, 0x0148, 0x080c,
+	0xadb1, 0x1904, 0x6471, 0xb8a0, 0x9084, 0xff80, 0x1904, 0x6471,
+	0xa894, 0x90c6, 0x006f, 0x0158, 0x90c6, 0x005e, 0x0904, 0x63d1,
+	0x90c6, 0x0064, 0x0904, 0x63fa, 0x2008, 0x0804, 0x6393, 0xa998,
+	0xa8b0, 0x2040, 0x080c, 0xadb1, 0x1120, 0x9182, 0x007f, 0x0a04,
+	0x6393, 0x9186, 0x00ff, 0x0904, 0x6393, 0x9182, 0x0800, 0x1a04,
+	0x6393, 0xaaa0, 0xab9c, 0x787c, 0x9306, 0x1188, 0x7880, 0x0096,
+	0x924e, 0x1128, 0x2208, 0x2310, 0x009e, 0x0804, 0x6393, 0x99cc,
+	0xff00, 0x009e, 0x1120, 0x2208, 0x2310, 0x0804, 0x6393, 0x080c,
+	0x49b8, 0x0904, 0x639d, 0x900e, 0x9016, 0x90c6, 0x4000, 0x15e0,
+	0x0006, 0x080c, 0x6820, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108,
+	0xc18d, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031,
+	0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098, 0x080c,
+	0x0f7c, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0035,
+	0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x000a, 0x2098, 0x080c,
+	0x0f7c, 0xa8c4, 0xabc8, 0x9305, 0xabcc, 0x9305, 0xabd0, 0x9305,
+	0xabd4, 0x9305, 0xabd8, 0x9305, 0xabdc, 0x9305, 0xabe0, 0x9305,
+	0x9005, 0x0510, 0x000e, 0x00c8, 0x90c6, 0x4007, 0x1110, 0x2408,
+	0x00a0, 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0070, 0x90c6,
+	0x4009, 0x1108, 0x0050, 0x90c6, 0x4006, 0x0138, 0x2001, 0x4005,
+	0x2009, 0x000a, 0x0010, 0x2001, 0x4006, 0xa896, 0xa99a, 0xaa9e,
+	0x2001, 0x0030, 0x900e, 0x0478, 0x000e, 0x080c, 0xadf1, 0x1130,
+	0x2001, 0x4005, 0x2009, 0x0003, 0x9016, 0x0c78, 0x2b00, 0x6012,
+	0x080c, 0xcf90, 0x2900, 0x6016, 0x6023, 0x0001, 0xa868, 0xd88c,
+	0x0108, 0xc0f5, 0xa86a, 0x0126, 0x2091, 0x8000, 0x080c, 0x31bc,
+	0x012e, 0x9006, 0x080c, 0x653c, 0x2001, 0x0002, 0x080c, 0x6550,
+	0x2009, 0x0002, 0x080c, 0xaec2, 0xa8b0, 0xd094, 0x0118, 0xb8cc,
+	0xc08d, 0xb8ce, 0x9006, 0x9005, 0x012e, 0x00ee, 0x00fe, 0x00be,
+	0x0005, 0x080c, 0x56e4, 0x0118, 0x2009, 0x0007, 0x00f8, 0xa998,
+	0xaeb0, 0x080c, 0x6600, 0x1904, 0x638e, 0x9186, 0x007f, 0x0130,
+	0x080c, 0x696a, 0x0118, 0x2009, 0x0009, 0x0080, 0x0096, 0x080c,
+	0x0fff, 0x1120, 0x009e, 0x2009, 0x0002, 0x0040, 0x2900, 0x009e,
+	0xa806, 0x080c, 0xcd01, 0x19b0, 0x2009, 0x0003, 0x2001, 0x4005,
+	0x0804, 0x6395, 0xa998, 0xaeb0, 0x080c, 0x6600, 0x1904, 0x638e,
+	0x0096, 0x080c, 0x0fff, 0x1128, 0x009e, 0x2009, 0x0002, 0x0804,
+	0x644e, 0x2900, 0x009e, 0xa806, 0x0096, 0x2048, 0x20a9, 0x002b,
+	0xb8c4, 0x20e0, 0xb8c8, 0x2098, 0xa860, 0x20e8, 0xa85c, 0x9080,
+	0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080, 0x0006, 0x20a0,
+	0xbbc8, 0x9398, 0x0006, 0x2398, 0x080c, 0x0f7c, 0x009e, 0xa87b,
+	0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0xd684, 0x1168, 0x080c,
+	0x56d0, 0xd0b4, 0x1118, 0xa89b, 0x000b, 0x00e0, 0xb800, 0xd08c,
+	0x0118, 0xa89b, 0x000c, 0x00b0, 0x080c, 0x696a, 0x0118, 0xa89b,
+	0x0009, 0x0080, 0x080c, 0x56e4, 0x0118, 0xa89b, 0x0007, 0x0050,
+	0x080c, 0xcce4, 0x1904, 0x63ca, 0x2009, 0x0003, 0x2001, 0x4005,
+	0x0804, 0x6395, 0xa87b, 0x0030, 0xa897, 0x4005, 0xa804, 0x8006,
+	0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002,
+	0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000,
+	0x2041, 0x1243, 0x080c, 0xb360, 0x1904, 0x63ca, 0x2009, 0x0002,
+	0x08e8, 0x2001, 0x0028, 0x900e, 0x0804, 0x63cb, 0x2009, 0x180c,
+	0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118,
+	0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x900e, 0x0804, 0x63cb,
+	0x2001, 0x0029, 0x900e, 0x0804, 0x63cb, 0x080c, 0x3742, 0x0804,
+	0x63cc, 0x080c, 0x540d, 0x0804, 0x63cc, 0x080c, 0x4548, 0x0804,
+	0x63cc, 0x080c, 0x45c1, 0x0804, 0x63cc, 0x080c, 0x461d, 0x0804,
+	0x63cc, 0x080c, 0x4a7b, 0x0804, 0x63cc, 0x080c, 0x4d32, 0x0804,
+	0x63cc, 0x080c, 0x5078, 0x0804, 0x63cc, 0x080c, 0x5271, 0x0804,
+	0x63cc, 0x080c, 0x3958, 0x0804, 0x63cc, 0x00b6, 0xa974, 0xae78,
+	0x9684, 0x3fff, 0x9082, 0x4000, 0x1618, 0x9182, 0x0800, 0x1268,
+	0x9188, 0x1000, 0x2104, 0x905d, 0x0140, 0x080c, 0x696a, 0x1148,
+	0x00e9, 0x080c, 0x672b, 0x9006, 0x00b0, 0x2001, 0x0028, 0x900e,
+	0x0090, 0x9082, 0x0006, 0x1240, 0xb900, 0xd1fc, 0x0d88, 0x2001,
+	0x0029, 0x2009, 0x1000, 0x0038, 0x2001, 0x0029, 0x900e, 0x0018,
+	0x2001, 0x0029, 0x900e, 0x9005, 0x00be, 0x0005, 0x0126, 0x2091,
+	0x8000, 0xb850, 0x900d, 0x0150, 0x2900, 0x0096, 0x2148, 0xa802,
+	0x009e, 0xa803, 0x0000, 0xb852, 0x012e, 0x0005, 0x2900, 0xb852,
+	0xb84e, 0xa803, 0x0000, 0x0cc0, 0x0126, 0x2091, 0x8000, 0xb84c,
+	0x9005, 0x0170, 0x00e6, 0x2071, 0x19e7, 0x7004, 0x9086, 0x0002,
+	0x0168, 0x00ee, 0xb84c, 0xa802, 0x2900, 0xb84e, 0x012e, 0x0005,
+	0x2900, 0xb852, 0xb84e, 0xa803, 0x0000, 0x0cc0, 0x701c, 0x9b06,
+	0x1d80, 0xb84c, 0x00a6, 0x2050, 0xb000, 0xa802, 0x2900, 0xb002,
+	0x00ae, 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0xb84c,
 	0x904d, 0x0130, 0xa800, 0x9005, 0x1108, 0xb852, 0xb84e, 0x9905,
-	0x0005, 0x00b6, 0x0126, 0x00c6, 0x0026, 0x2091, 0x8000, 0x6210,
-	0x2258, 0xba00, 0x9005, 0x0110, 0xc285, 0x0008, 0xc284, 0xba02,
-	0x002e, 0x00ce, 0x012e, 0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6,
-	0x2091, 0x8000, 0x6210, 0x2258, 0xba04, 0x0006, 0x9086, 0x0006,
-	0x1170, 0xb89c, 0xd0ac, 0x0158, 0x080c, 0x6733, 0x0140, 0x9284,
-	0xff00, 0x8007, 0x9086, 0x0007, 0x1110, 0x2011, 0x0600, 0x000e,
-	0x9294, 0xff00, 0x9215, 0xba06, 0x0006, 0x9086, 0x0006, 0x1120,
-	0xba90, 0x82ff, 0x090c, 0x0dd5, 0x000e, 0x00ce, 0x012e, 0x00be,
-	0x0005, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6210, 0x2258,
-	0xba04, 0x0006, 0x9086, 0x0006, 0x1168, 0xb89c, 0xd0a4, 0x0150,
-	0x080c, 0x672f, 0x1138, 0x9284, 0x00ff, 0x9086, 0x0007, 0x1110,
-	0x2011, 0x0006, 0x000e, 0x9294, 0x00ff, 0x8007, 0x9215, 0xba06,
-	0x00ce, 0x012e, 0x00be, 0x0005, 0x9182, 0x0800, 0x0218, 0x9085,
-	0x0001, 0x0005, 0x00d6, 0x0026, 0x9190, 0x1000, 0x2204, 0x905d,
-	0x1188, 0x0096, 0x080c, 0x1000, 0x2958, 0x009e, 0x0168, 0x2b00,
-	0x2012, 0xb85c, 0xb8ca, 0xb860, 0xb8c6, 0x9006, 0xb8a6, 0xb8ae,
-	0x080c, 0x5e12, 0x9006, 0x0010, 0x9085, 0x0001, 0x002e, 0x00de,
-	0x0005, 0x00b6, 0x0096, 0x0126, 0x2091, 0x8000, 0x0026, 0x9182,
-	0x0800, 0x0218, 0x9085, 0x0001, 0x0458, 0x00d6, 0x9190, 0x1000,
-	0x2204, 0x905d, 0x0518, 0x2013, 0x0000, 0xb8a4, 0x904d, 0x0110,
-	0x080c, 0x1032, 0x00d6, 0x00c6, 0xb8bc, 0x2060, 0x8cff, 0x0168,
-	0x600c, 0x0006, 0x6014, 0x2048, 0x080c, 0xc825, 0x0110, 0x080c,
-	0x0fb2, 0x080c, 0xab6b, 0x00ce, 0x0c88, 0x00ce, 0x00de, 0x2b48,
-	0xb8c8, 0xb85e, 0xb8c4, 0xb862, 0x080c, 0x1042, 0x00de, 0x9006,
-	0x002e, 0x012e, 0x009e, 0x00be, 0x0005, 0x0016, 0x9182, 0x0800,
-	0x0218, 0x9085, 0x0001, 0x0030, 0x9188, 0x1000, 0x2104, 0x905d,
-	0x0dc0, 0x9006, 0x001e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146,
-	0x9006, 0xb80a, 0xb80e, 0xb800, 0xc08c, 0xb802, 0x080c, 0x717d,
-	0x1510, 0xb8a0, 0x9086, 0x007e, 0x0120, 0x080c, 0xaad5, 0x11d8,
-	0x0078, 0x7040, 0xd0e4, 0x01b8, 0x00c6, 0x2061, 0x1980, 0x7048,
-	0x2062, 0x704c, 0x6006, 0x7050, 0x600a, 0x7054, 0x600e, 0x00ce,
-	0x703c, 0x2069, 0x0140, 0x9005, 0x1110, 0x2001, 0x0001, 0x6886,
-	0x2069, 0x1800, 0x68b6, 0x7040, 0xb85e, 0x7048, 0xb862, 0x704c,
-	0xb866, 0x20e1, 0x0000, 0x2099, 0x0276, 0xb8c4, 0x20e8, 0xb8c8,
-	0x9088, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2099, 0x027a,
-	0x9088, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2069, 0x0200,
-	0x6817, 0x0001, 0x7040, 0xb86a, 0x7144, 0xb96e, 0x7048, 0xb872,
-	0x7050, 0xb876, 0x2069, 0x0200, 0x6817, 0x0000, 0xb8a0, 0x9086,
-	0x007e, 0x1110, 0x7144, 0xb96e, 0x9182, 0x0211, 0x1218, 0x2009,
-	0x0008, 0x0400, 0x9182, 0x0259, 0x1218, 0x2009, 0x0007, 0x00d0,
-	0x9182, 0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0, 0x9182, 0x0349,
-	0x1218, 0x2009, 0x0005, 0x0070, 0x9182, 0x0421, 0x1218, 0x2009,
-	0x0004, 0x0040, 0x9182, 0x0581, 0x1218, 0x2009, 0x0003, 0x0010,
-	0x2009, 0x0002, 0xb992, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005,
-	0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, 0x7034, 0xb896, 0x703c,
-	0xb89a, 0x7054, 0xb89e, 0x0036, 0xbbcc, 0xc384, 0xba00, 0x2009,
-	0x1867, 0x210c, 0xd0bc, 0x0120, 0xd1ec, 0x0110, 0xc2ad, 0x0008,
-	0xc2ac, 0xd0c4, 0x0148, 0xd1e4, 0x0138, 0xc2bd, 0xd0cc, 0x0128,
-	0xd38c, 0x1108, 0xc385, 0x0008, 0xc2bc, 0xba02, 0xbbce, 0x003e,
-	0x00ee, 0x002e, 0x001e, 0x0005, 0x0096, 0x0126, 0x2091, 0x8000,
-	0xb8a4, 0x904d, 0x0578, 0xa900, 0x81ff, 0x15c0, 0xaa04, 0x9282,
-	0x0010, 0x16c8, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x8906, 0x8006,
-	0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9080, 0x0004,
-	0x2098, 0x2009, 0x0010, 0x20a9, 0x0001, 0x4002, 0x9086, 0xffff,
-	0x0120, 0x8109, 0x1dd0, 0x080c, 0x0dd5, 0x3c00, 0x20e8, 0x3300,
-	0x8001, 0x20a0, 0x4604, 0x8210, 0xaa06, 0x01de, 0x01ce, 0x014e,
-	0x013e, 0x0060, 0x080c, 0x1000, 0x0170, 0x2900, 0xb8a6, 0xa803,
-	0x0000, 0x080c, 0x6589, 0xa807, 0x0001, 0xae12, 0x9085, 0x0001,
-	0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0126, 0x2091, 0x8000,
-	0x0096, 0xb8a4, 0x904d, 0x0188, 0xa800, 0x9005, 0x1150, 0x080c,
-	0x6598, 0x1158, 0xa804, 0x908a, 0x0002, 0x0218, 0x8001, 0xa806,
-	0x0020, 0x080c, 0x1032, 0xb8a7, 0x0000, 0x009e, 0x012e, 0x0005,
-	0x0126, 0x2091, 0x8000, 0x080c, 0x8e9c, 0x012e, 0x0005, 0x901e,
-	0x0010, 0x2019, 0x0001, 0x900e, 0x0126, 0x2091, 0x8000, 0xb84c,
-	0x2048, 0xb800, 0xd0dc, 0x1170, 0x89ff, 0x0500, 0x83ff, 0x0120,
-	0xa878, 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, 0x1118, 0xa870,
-	0x9506, 0x0120, 0x2908, 0xa800, 0x2048, 0x0c70, 0x080c, 0xa39c,
-	0xaa00, 0xb84c, 0x9906, 0x1110, 0xba4e, 0x0020, 0x00a6, 0x2150,
-	0xb202, 0x00ae, 0x82ff, 0x1110, 0xb952, 0x89ff, 0x012e, 0x0005,
-	0x9016, 0x0489, 0x1110, 0x2011, 0x0001, 0x0005, 0x080c, 0x65ed,
-	0x0128, 0x080c, 0xc8ed, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c,
-	0x65ed, 0x0128, 0x080c, 0xc887, 0x0010, 0x9085, 0x0001, 0x0005,
-	0x080c, 0x65ed, 0x0128, 0x080c, 0xc8ea, 0x0010, 0x9085, 0x0001,
-	0x0005, 0x080c, 0x65ed, 0x0128, 0x080c, 0xc8ab, 0x0010, 0x9085,
-	0x0001, 0x0005, 0x080c, 0x65ed, 0x0128, 0x080c, 0xc917, 0x0010,
-	0x9085, 0x0001, 0x0005, 0xb8a4, 0x900d, 0x1118, 0x9085, 0x0001,
-	0x0005, 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e,
-	0x810f, 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004,
-	0x2098, 0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128,
-	0x8109, 0x1dd8, 0x9085, 0x0001, 0x0008, 0x9006, 0x01ce, 0x013e,
-	0x0005, 0x0146, 0x01d6, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0004,
-	0x20a0, 0x20a9, 0x0010, 0x2009, 0xffff, 0x4104, 0x01de, 0x014e,
-	0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e, 0x810f,
-	0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004, 0x2098,
-	0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128, 0x8109,
-	0x1dd8, 0x9085, 0x0001, 0x0068, 0x0146, 0x01d6, 0x3300, 0x8001,
-	0x20a0, 0x3c00, 0x20e8, 0x2001, 0xffff, 0x4004, 0x01de, 0x014e,
-	0x9006, 0x01ce, 0x013e, 0x0005, 0x0096, 0x0126, 0x2091, 0x8000,
-	0xb8a4, 0x904d, 0x1128, 0x080c, 0x1000, 0x0168, 0x2900, 0xb8a6,
-	0x080c, 0x6589, 0xa803, 0x0001, 0xa807, 0x0000, 0x9085, 0x0001,
-	0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x0126, 0x2091,
-	0x8000, 0xb8a4, 0x904d, 0x0130, 0xb8a7, 0x0000, 0x080c, 0x1032,
-	0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0xb89c, 0xd0a4, 0x0005,
-	0x00b6, 0x00f6, 0x080c, 0x717d, 0x01b0, 0x71c4, 0x81ff, 0x1198,
-	0x71dc, 0xd19c, 0x0180, 0x2001, 0x007e, 0x9080, 0x1000, 0x2004,
-	0x905d, 0x0148, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1118,
-	0xb800, 0xc0ed, 0xb802, 0x2079, 0x1847, 0x7804, 0xd0a4, 0x01d0,
-	0x0156, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x63cd, 0x1168,
-	0xb804, 0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118, 0x9086,
-	0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e, 0x8108, 0x1f04,
-	0x6614, 0x015e, 0x080c, 0x66f5, 0x0120, 0x2001, 0x1983, 0x200c,
-	0x0038, 0x2079, 0x1847, 0x7804, 0xd0a4, 0x0130, 0x2009, 0x07d0,
-	0x2011, 0x663f, 0x080c, 0x831a, 0x00fe, 0x00be, 0x0005, 0x00b6,
-	0x2011, 0x663f, 0x080c, 0x8285, 0x080c, 0x66f5, 0x01d8, 0x2001,
-	0x107e, 0x2004, 0x2058, 0xb900, 0xc1ec, 0xb902, 0x080c, 0x6733,
-	0x0130, 0x2009, 0x07d0, 0x2011, 0x663f, 0x080c, 0x831a, 0x00e6,
-	0x2071, 0x1800, 0x9006, 0x707e, 0x7060, 0x7082, 0x080c, 0x2e48,
-	0x00ee, 0x04b0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016,
-	0x080c, 0x63cd, 0x1538, 0xb800, 0xd0ec, 0x0520, 0x0046, 0xbaa0,
-	0x2220, 0x9006, 0x2009, 0x0029, 0x080c, 0xe280, 0xb800, 0xc0e5,
-	0xc0ec, 0xb802, 0x080c, 0x672f, 0x2001, 0x0707, 0x1128, 0xb804,
-	0x9084, 0x00ff, 0x9085, 0x0700, 0xb806, 0x2019, 0x0029, 0x080c,
-	0x901a, 0x0076, 0x903e, 0x080c, 0x8ef7, 0x900e, 0x080c, 0xdfbd,
-	0x007e, 0x004e, 0x001e, 0x8108, 0x1f04, 0x6667, 0x00ce, 0x015e,
-	0x00be, 0x0005, 0x00b6, 0x6010, 0x2058, 0xb800, 0xc0ec, 0xb802,
-	0x00be, 0x0005, 0x00b6, 0x00c6, 0x0096, 0x080c, 0x1019, 0x090c,
-	0x0dd5, 0x2958, 0x009e, 0x2001, 0x196b, 0x2b02, 0xb8af, 0x0000,
-	0x2009, 0x00ff, 0x080c, 0x5e12, 0xb807, 0x0006, 0xb813, 0x00ff,
-	0xb817, 0xffff, 0xb86f, 0x0200, 0xb86c, 0xb893, 0x0002, 0xb8bb,
-	0x0520, 0xb8a3, 0x00ff, 0xb8af, 0x0000, 0x00ce, 0x00be, 0x0005,
-	0x7810, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ac, 0x0005, 0x6010,
-	0x00b6, 0x905d, 0x0108, 0xb800, 0x00be, 0xd0bc, 0x0005, 0x0006,
-	0x0016, 0x0026, 0xb804, 0x908c, 0x00ff, 0x9196, 0x0006, 0x0188,
-	0x9196, 0x0004, 0x0170, 0x9196, 0x0005, 0x0158, 0x908c, 0xff00,
-	0x810f, 0x9196, 0x0006, 0x0128, 0x9196, 0x0004, 0x0110, 0x9196,
-	0x0005, 0x002e, 0x001e, 0x000e, 0x0005, 0x00b6, 0x00f6, 0x2001,
-	0x107e, 0x2004, 0x905d, 0x0110, 0xb800, 0xd0ec, 0x00fe, 0x00be,
-	0x0005, 0x0126, 0x0026, 0x2091, 0x8000, 0x0006, 0xbaa0, 0x9290,
-	0x1000, 0x2204, 0x9b06, 0x190c, 0x0dd5, 0x000e, 0xba00, 0x9005,
-	0x0110, 0xc2fd, 0x0008, 0xc2fc, 0xba02, 0x002e, 0x012e, 0x0005,
-	0x2011, 0x1837, 0x2204, 0xd0cc, 0x0138, 0x2001, 0x1981, 0x200c,
-	0x2011, 0x6725, 0x080c, 0x831a, 0x0005, 0x2011, 0x6725, 0x080c,
-	0x8285, 0x2011, 0x1837, 0x2204, 0xc0cc, 0x2012, 0x0005, 0x080c,
-	0x54b7, 0xd0ac, 0x0005, 0x080c, 0x54b7, 0xd0a4, 0x0005, 0x0016,
-	0xb904, 0x9184, 0x00ff, 0x908e, 0x0006, 0x001e, 0x0005, 0x0016,
-	0xb904, 0x9184, 0xff00, 0x8007, 0x908e, 0x0006, 0x001e, 0x0005,
-	0x00b6, 0x00f6, 0x080c, 0xcf18, 0x0158, 0x70dc, 0x9084, 0x0028,
-	0x0138, 0x2001, 0x107f, 0x2004, 0x905d, 0x0110, 0xb8cc, 0xd094,
-	0x00fe, 0x00be, 0x0005, 0x2071, 0x1910, 0x7003, 0x0001, 0x7007,
-	0x0000, 0x9006, 0x7012, 0x7016, 0x701a, 0x701e, 0x700a, 0x7046,
-	0x2001, 0x1947, 0x2003, 0x0000, 0x0005, 0x0016, 0x00e6, 0x2071,
-	0x1948, 0x900e, 0x710a, 0x080c, 0x54b7, 0xd0fc, 0x1140, 0x080c,
-	0x54b7, 0x900e, 0xd09c, 0x0108, 0x8108, 0x7102, 0x00f8, 0x2001,
-	0x1867, 0x200c, 0x9184, 0x0007, 0x0002, 0x6777, 0x6777, 0x6777,
-	0x6777, 0x6777, 0x678d, 0x679b, 0x6777, 0x7003, 0x0003, 0x2009,
-	0x1868, 0x210c, 0x9184, 0xff00, 0x8007, 0x9005, 0x1110, 0x2001,
-	0x0002, 0x7006, 0x0018, 0x7003, 0x0005, 0x0c88, 0x00ee, 0x001e,
-	0x0005, 0x00e6, 0x2071, 0x0050, 0x684c, 0x9005, 0x1150, 0x00e6,
-	0x2071, 0x1910, 0x7028, 0xc085, 0x702a, 0x00ee, 0x9085, 0x0001,
-	0x0488, 0x6844, 0x9005, 0x0158, 0x080c, 0x74d7, 0x6a60, 0x9200,
-	0x7002, 0x6864, 0x9101, 0x7006, 0x9006, 0x7012, 0x7016, 0x6860,
-	0x7002, 0x6864, 0x7006, 0x6868, 0x700a, 0x686c, 0x700e, 0x6844,
-	0x9005, 0x1110, 0x7012, 0x7016, 0x684c, 0x701a, 0x701c, 0x9085,
-	0x0040, 0x701e, 0x7037, 0x0019, 0x702b, 0x0001, 0x00e6, 0x2071,
-	0x1910, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0x700b, 0x0000,
-	0x00ee, 0x9006, 0x00ee, 0x0005, 0x00e6, 0x0026, 0x2071, 0x1948,
-	0x7000, 0x9015, 0x0904, 0x6a4b, 0x9286, 0x0003, 0x0904, 0x68e1,
-	0x9286, 0x0005, 0x0904, 0x68e1, 0x2071, 0x1877, 0xa87c, 0x9005,
-	0x0904, 0x6842, 0x7140, 0xa868, 0x9102, 0x0a04, 0x6a4b, 0xa878,
-	0xd084, 0x15d8, 0xa853, 0x0019, 0x2001, 0x8023, 0xa84e, 0x2071,
-	0x1910, 0x701c, 0x9005, 0x1904, 0x6bed, 0x0e04, 0x6c5b, 0x2071,
-	0x0000, 0xa850, 0x7032, 0xa84c, 0x7082, 0xa870, 0x7086, 0xa86c,
-	0x708a, 0xa880, 0x708e, 0x7036, 0x0146, 0x01d6, 0x0136, 0x01c6,
-	0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a, 0xa868, 0x20a8, 0xa860,
-	0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, 0x4003, 0x015e, 0x01ce,
-	0x013e, 0x01de, 0x014e, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
-	0xd084, 0x190c, 0x1192, 0x0804, 0x68c4, 0xa853, 0x001b, 0x2001,
-	0x8027, 0x0820, 0x7004, 0xd08c, 0x1904, 0x6a4b, 0xa853, 0x001a,
-	0x2001, 0x8024, 0x0804, 0x6806, 0x00e6, 0x0026, 0x2071, 0x1948,
-	0x7000, 0x9015, 0x0904, 0x6a4b, 0x9286, 0x0003, 0x0904, 0x68e1,
-	0x9286, 0x0005, 0x0904, 0x68e1, 0xa84f, 0x8022, 0xa853, 0x0018,
-	0x0804, 0x68a9, 0xa868, 0xd0fc, 0x11d8, 0x00e6, 0x0026, 0x2001,
-	0x1948, 0x2004, 0x9005, 0x0904, 0x6a4b, 0xa87c, 0xd0bc, 0x1904,
-	0x6a4b, 0xa978, 0xa874, 0x9105, 0x1904, 0x6a4b, 0x2001, 0x1948,
-	0x2004, 0x0002, 0x6a4b, 0x68a5, 0x68e1, 0x68e1, 0x6a4b, 0x68e1,
-	0x0005, 0xa868, 0xd0fc, 0x1500, 0x00e6, 0x0026, 0x2009, 0x1948,
-	0x210c, 0x81ff, 0x0904, 0x6a4b, 0xa87c, 0xd0cc, 0x0904, 0x6a4b,
-	0xa880, 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x6a4b, 0x9186,
-	0x0003, 0x0904, 0x68e1, 0x9186, 0x0005, 0x0904, 0x68e1, 0xa84f,
-	0x8021, 0xa853, 0x0017, 0x0028, 0x0005, 0xa84f, 0x8020, 0xa853,
-	0x0016, 0x2071, 0x1910, 0x701c, 0x9005, 0x1904, 0x6bed, 0x0e04,
-	0x6c5b, 0x2071, 0x0000, 0xa84c, 0x7082, 0xa850, 0x7032, 0xa86c,
-	0x7086, 0x7036, 0xa870, 0x708a, 0x2091, 0x4080, 0x2001, 0x0089,
-	0x2004, 0xd084, 0x190c, 0x1192, 0x2071, 0x1800, 0x2011, 0x0001,
-	0xa804, 0x900d, 0x702c, 0x1158, 0xa802, 0x2900, 0x702e, 0x70c0,
-	0x9200, 0x70c2, 0x080c, 0x81a6, 0x002e, 0x00ee, 0x0005, 0x0096,
-	0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x009e,
-	0x0c58, 0xa84f, 0x0000, 0x00f6, 0x2079, 0x0050, 0x2071, 0x1910,
-	0xa803, 0x0000, 0x7010, 0x9005, 0x1904, 0x69d0, 0x782c, 0x908c,
-	0x0780, 0x190c, 0x6da7, 0x8004, 0x8004, 0x8004, 0x9084, 0x0003,
-	0x0002, 0x68ff, 0x69d0, 0x6924, 0x696b, 0x080c, 0x0dd5, 0x2071,
-	0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1170, 0x2071, 0x19f8,
-	0x703c, 0x9005, 0x1328, 0x2001, 0x1949, 0x2004, 0x8005, 0x703e,
-	0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904,
-	0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200,
-	0x70c2, 0x080c, 0x81a6, 0x0c10, 0x2071, 0x1800, 0x2900, 0x7822,
-	0xa804, 0x900d, 0x1580, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c,
-	0xd19c, 0x1148, 0x2009, 0x1830, 0x210c, 0x918a, 0x0020, 0x0218,
-	0x7022, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900,
-	0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x81a6, 0x782c, 0x9094,
-	0x0780, 0x190c, 0x6da7, 0xd0a4, 0x19f0, 0x2071, 0x19f8, 0x703c,
-	0x9005, 0x1328, 0x2001, 0x1949, 0x2004, 0x8005, 0x703e, 0x00fe,
-	0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802,
-	0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2,
-	0x080c, 0x81a6, 0x0800, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071,
-	0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2,
-	0x080c, 0x81a6, 0x782c, 0x9094, 0x0780, 0x190c, 0x6da7, 0xd0a4,
-	0x1d60, 0x00ee, 0x782c, 0x9094, 0x0780, 0x190c, 0x6da7, 0xd09c,
-	0x11a0, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x1560, 0x2071,
-	0x19f8, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949, 0x2004, 0x8005,
-	0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x009e, 0x2908, 0x7010,
-	0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008,
-	0x711e, 0x2148, 0xa804, 0x900d, 0x1170, 0x2071, 0x19f8, 0x703c,
-	0x9005, 0x1328, 0x2001, 0x1949, 0x2004, 0x8005, 0x703e, 0x00fe,
-	0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148,
-	0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0,
-	0x9200, 0x70c2, 0x080c, 0x81a6, 0x00fe, 0x002e, 0x00ee, 0x0005,
-	0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110,
-	0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904, 0x6a25,
-	0x782c, 0x9094, 0x0780, 0x190c, 0x6da7, 0xd09c, 0x1198, 0x701c,
-	0x904d, 0x0180, 0x7010, 0x8001, 0x7012, 0x1108, 0x701a, 0xa800,
-	0x701e, 0x2900, 0x7822, 0x782c, 0x9094, 0x0780, 0x190c, 0x6da7,
-	0xd09c, 0x0d68, 0x782c, 0x9094, 0x0780, 0x190c, 0x6da7, 0xd0a4,
-	0x01b0, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802,
-	0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x81a6, 0x782c,
-	0x9094, 0x0780, 0x190c, 0x6da7, 0xd0a4, 0x1d60, 0x00ee, 0x2071,
-	0x19f8, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949, 0x2004, 0x8005,
-	0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800,
-	0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff,
-	0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x81a6, 0x00ee,
-	0x0804, 0x69e0, 0xa868, 0xd0fc, 0x1560, 0x0096, 0xa804, 0xa807,
-	0x0000, 0x904d, 0x190c, 0x0fb2, 0x009e, 0x0018, 0xa868, 0xd0fc,
-	0x1500, 0x00e6, 0x0026, 0xa84f, 0x0000, 0x00f6, 0x2079, 0x0050,
-	0x2071, 0x1910, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904, 0x6b67,
-	0x782c, 0x908c, 0x0780, 0x190c, 0x6da7, 0x8004, 0x8004, 0x8004,
-	0x9084, 0x0003, 0x0002, 0x6a6a, 0x6b67, 0x6a85, 0x6af6, 0x080c,
-	0x0dd5, 0x0005, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d,
-	0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148,
-	0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0,
-	0x9200, 0x70c2, 0x080c, 0x81a6, 0x0c60, 0x2071, 0x1800, 0x2900,
-	0x7822, 0xa804, 0x900d, 0x1904, 0x6ae5, 0x7830, 0x8007, 0x9084,
-	0x001f, 0x9082, 0x0005, 0x1220, 0x00fe, 0x002e, 0x00ee, 0x0005,
-	0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, 0x2009,
-	0x1830, 0x210c, 0x918a, 0x0020, 0x0218, 0x7022, 0x00ee, 0x0058,
-	0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000,
-	0x70c2, 0x080c, 0x81a6, 0x782c, 0x9094, 0x0780, 0x190c, 0x6da7,
-	0xd0a4, 0x19f0, 0x0e04, 0x6adc, 0x7838, 0x7938, 0x910e, 0x1de0,
-	0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2001,
-	0x1921, 0x200c, 0xc184, 0x2102, 0x2091, 0x4080, 0x2001, 0x0089,
-	0x2004, 0xd084, 0x190c, 0x1192, 0x2009, 0x1947, 0x200b, 0x0000,
-	0x00fe, 0x002e, 0x00ee, 0x0005, 0x2001, 0x1921, 0x200c, 0xc185,
-	0x2102, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148,
-	0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0,
-	0x9200, 0x70c2, 0x080c, 0x81a6, 0x0804, 0x6a98, 0x0096, 0x00e6,
-	0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e,
-	0x70c0, 0x8000, 0x70c2, 0x080c, 0x81a6, 0x782c, 0x9094, 0x0780,
-	0x190c, 0x6da7, 0xd0a4, 0x1d60, 0x00ee, 0x0e04, 0x6b3a, 0x7838,
-	0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833,
-	0x0013, 0x00de, 0x7044, 0xc084, 0x7046, 0x2091, 0x4080, 0x2001,
-	0x0089, 0x2004, 0xd084, 0x190c, 0x1192, 0x2009, 0x1947, 0x200b,
-	0x0000, 0x782c, 0x9094, 0x0780, 0x190c, 0x6da7, 0xd09c, 0x1170,
-	0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x11e0, 0x00fe, 0x002e,
-	0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x0c58, 0x009e, 0x2908,
-	0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902,
-	0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1120, 0x00fe, 0x002e,
-	0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904,
-	0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200,
-	0x70c2, 0x080c, 0x81a6, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2908,
-	0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902,
-	0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904, 0x6bd8, 0x782c,
-	0x9094, 0x0780, 0x190c, 0x6da7, 0xd09c, 0x11b0, 0x701c, 0x904d,
-	0x0198, 0xa84c, 0x9005, 0x1180, 0x7010, 0x8001, 0x7012, 0x1108,
-	0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, 0x0780,
-	0x190c, 0x6da7, 0xd09c, 0x0d50, 0x782c, 0x9094, 0x0780, 0x190c,
-	0x6da7, 0xd0a4, 0x05c8, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800,
-	0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c,
-	0x81a6, 0x782c, 0x9094, 0x0780, 0x190c, 0x6da7, 0xd0a4, 0x1d60,
-	0x00ee, 0x0e04, 0x6bd1, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6,
-	0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x7044, 0xc084,
-	0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c,
-	0x1192, 0x2009, 0x1947, 0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee,
-	0x0005, 0x7044, 0xc085, 0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005,
-	0x00e6, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802,
-	0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2,
-	0x080c, 0x81a6, 0x00ee, 0x0804, 0x6b77, 0x2071, 0x1910, 0xa803,
-	0x0000, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a,
-	0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1128,
-	0x1e04, 0x6c18, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016,
+	0x012e, 0x0005, 0xb84c, 0x904d, 0x0130, 0xa800, 0x9005, 0x1108,
+	0xb852, 0xb84e, 0x9905, 0x0005, 0x00b6, 0x0126, 0x00c6, 0x0026,
+	0x2091, 0x8000, 0x6210, 0x2258, 0xba00, 0x9005, 0x0110, 0xc285,
+	0x0008, 0xc284, 0xba02, 0x002e, 0x00ce, 0x012e, 0x00be, 0x0005,
+	0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6210, 0x2258, 0xba04,
+	0x0006, 0x9086, 0x0006, 0x1170, 0xb89c, 0xd0ac, 0x0158, 0x080c,
+	0x6966, 0x0140, 0x9284, 0xff00, 0x8007, 0x9086, 0x0007, 0x1110,
+	0x2011, 0x0600, 0x000e, 0x9294, 0xff00, 0x9215, 0xba06, 0x0006,
+	0x9086, 0x0006, 0x1120, 0xba90, 0x82ff, 0x090c, 0x0dd5, 0x000e,
+	0x00ce, 0x012e, 0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6, 0x2091,
+	0x8000, 0x6210, 0x2258, 0xba04, 0x0006, 0x9086, 0x0006, 0x1168,
+	0xb89c, 0xd0a4, 0x0150, 0x080c, 0x6962, 0x1138, 0x9284, 0x00ff,
+	0x9086, 0x0007, 0x1110, 0x2011, 0x0006, 0x000e, 0x9294, 0x00ff,
+	0x8007, 0x9215, 0xba06, 0x00ce, 0x012e, 0x00be, 0x0005, 0x9182,
+	0x0800, 0x0218, 0x9085, 0x0001, 0x0005, 0x00d6, 0x0026, 0x9190,
+	0x1000, 0x2204, 0x905d, 0x1188, 0x0096, 0x080c, 0x0fff, 0x2958,
+	0x009e, 0x0168, 0x2b00, 0x2012, 0xb85c, 0xb8ca, 0xb860, 0xb8c6,
+	0x9006, 0xb8a6, 0xb8ae, 0x080c, 0x6035, 0x9006, 0x0010, 0x9085,
+	0x0001, 0x002e, 0x00de, 0x0005, 0x00b6, 0x0096, 0x0126, 0x2091,
+	0x8000, 0x0026, 0x9182, 0x0800, 0x0218, 0x9085, 0x0001, 0x0458,
+	0x00d6, 0x9190, 0x1000, 0x2204, 0x905d, 0x0518, 0x2013, 0x0000,
+	0xb8a4, 0x904d, 0x0110, 0x080c, 0x1031, 0x00d6, 0x00c6, 0xb8bc,
+	0x2060, 0x8cff, 0x0168, 0x600c, 0x0006, 0x6014, 0x2048, 0x080c,
+	0xcb1b, 0x0110, 0x080c, 0x0fb1, 0x080c, 0xae47, 0x00ce, 0x0c88,
+	0x00ce, 0x00de, 0x2b48, 0xb8c8, 0xb85e, 0xb8c4, 0xb862, 0x080c,
+	0x1041, 0x00de, 0x9006, 0x002e, 0x012e, 0x009e, 0x00be, 0x0005,
+	0x0016, 0x9182, 0x0800, 0x0218, 0x9085, 0x0001, 0x0030, 0x9188,
+	0x1000, 0x2104, 0x905d, 0x0dc0, 0x9006, 0x001e, 0x0005, 0x00d6,
+	0x0156, 0x0136, 0x0146, 0x9006, 0xb80a, 0xb80e, 0xb800, 0xc08c,
+	0xb802, 0x080c, 0x73b0, 0x1510, 0xb8a0, 0x9086, 0x007e, 0x0120,
+	0x080c, 0xadb1, 0x11d8, 0x0078, 0x7040, 0xd0e4, 0x01b8, 0x00c6,
+	0x2061, 0x1982, 0x7048, 0x2062, 0x704c, 0x6006, 0x7050, 0x600a,
+	0x7054, 0x600e, 0x00ce, 0x703c, 0x2069, 0x0140, 0x9005, 0x1110,
+	0x2001, 0x0001, 0x6886, 0x2069, 0x1800, 0x68b6, 0x7040, 0xb85e,
+	0x7048, 0xb862, 0x704c, 0xb866, 0x20e1, 0x0000, 0x2099, 0x0276,
+	0xb8c4, 0x20e8, 0xb8c8, 0x9088, 0x000a, 0x21a0, 0x20a9, 0x0004,
+	0x4003, 0x2099, 0x027a, 0x9088, 0x0006, 0x21a0, 0x20a9, 0x0004,
+	0x4003, 0x2069, 0x0200, 0x6817, 0x0001, 0x7040, 0xb86a, 0x7144,
+	0xb96e, 0x7048, 0xb872, 0x7050, 0xb876, 0x2069, 0x0200, 0x6817,
+	0x0000, 0xb8a0, 0x9086, 0x007e, 0x1110, 0x7144, 0xb96e, 0x9182,
+	0x0211, 0x1218, 0x2009, 0x0008, 0x0400, 0x9182, 0x0259, 0x1218,
+	0x2009, 0x0007, 0x00d0, 0x9182, 0x02c1, 0x1218, 0x2009, 0x0006,
+	0x00a0, 0x9182, 0x0349, 0x1218, 0x2009, 0x0005, 0x0070, 0x9182,
+	0x0421, 0x1218, 0x2009, 0x0004, 0x0040, 0x9182, 0x0581, 0x1218,
+	0x2009, 0x0003, 0x0010, 0x2009, 0x0002, 0xb992, 0x014e, 0x013e,
+	0x015e, 0x00de, 0x0005, 0x0016, 0x0026, 0x00e6, 0x2071, 0x0260,
+	0x7034, 0xb896, 0x703c, 0xb89a, 0x7054, 0xb89e, 0x0036, 0xbbcc,
+	0xc384, 0xba00, 0x2009, 0x1867, 0x210c, 0xd0bc, 0x0120, 0xd1ec,
+	0x0110, 0xc2ad, 0x0008, 0xc2ac, 0xd0c4, 0x0148, 0xd1e4, 0x0138,
+	0xc2bd, 0xd0cc, 0x0128, 0xd38c, 0x1108, 0xc385, 0x0008, 0xc2bc,
+	0xba02, 0xbbce, 0x003e, 0x00ee, 0x002e, 0x001e, 0x0005, 0x0096,
+	0x0126, 0x2091, 0x8000, 0xb8a4, 0x904d, 0x0578, 0xa900, 0x81ff,
+	0x15c0, 0xaa04, 0x9282, 0x0010, 0x16c8, 0x0136, 0x0146, 0x01c6,
+	0x01d6, 0x8906, 0x8006, 0x8007, 0x908c, 0x003f, 0x21e0, 0x9084,
+	0xffc0, 0x9080, 0x0004, 0x2098, 0x2009, 0x0010, 0x20a9, 0x0001,
+	0x4002, 0x9086, 0xffff, 0x0120, 0x8109, 0x1dd0, 0x080c, 0x0dd5,
+	0x3c00, 0x20e8, 0x3300, 0x8001, 0x20a0, 0x4604, 0x8210, 0xaa06,
+	0x01de, 0x01ce, 0x014e, 0x013e, 0x0060, 0x080c, 0x0fff, 0x0170,
+	0x2900, 0xb8a6, 0xa803, 0x0000, 0x080c, 0x67bc, 0xa807, 0x0001,
+	0xae12, 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8,
+	0x0126, 0x2091, 0x8000, 0x0096, 0xb8a4, 0x904d, 0x0188, 0xa800,
+	0x9005, 0x1150, 0x080c, 0x67cb, 0x1158, 0xa804, 0x908a, 0x0002,
+	0x0218, 0x8001, 0xa806, 0x0020, 0x080c, 0x1031, 0xb8a7, 0x0000,
+	0x009e, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x90e4,
+	0x012e, 0x0005, 0x901e, 0x0010, 0x2019, 0x0001, 0x900e, 0x0126,
+	0x2091, 0x8000, 0xb84c, 0x2048, 0xb800, 0xd0dc, 0x1170, 0x89ff,
+	0x0500, 0x83ff, 0x0120, 0xa878, 0x9606, 0x0158, 0x0030, 0xa86c,
+	0x9406, 0x1118, 0xa870, 0x9506, 0x0120, 0x2908, 0xa800, 0x2048,
+	0x0c70, 0x080c, 0xa678, 0xaa00, 0xb84c, 0x9906, 0x1110, 0xba4e,
+	0x0020, 0x00a6, 0x2150, 0xb202, 0x00ae, 0x82ff, 0x1110, 0xb952,
+	0x89ff, 0x012e, 0x0005, 0x9016, 0x0489, 0x1110, 0x2011, 0x0001,
+	0x0005, 0x080c, 0x6820, 0x0128, 0x080c, 0xcbd8, 0x0010, 0x9085,
+	0x0001, 0x0005, 0x080c, 0x6820, 0x0128, 0x080c, 0xcb7d, 0x0010,
+	0x9085, 0x0001, 0x0005, 0x080c, 0x6820, 0x0128, 0x080c, 0xcbd5,
+	0x0010, 0x9085, 0x0001, 0x0005, 0x080c, 0x6820, 0x0128, 0x080c,
+	0xcb9c, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, 0x6820, 0x0128,
+	0x080c, 0xcc19, 0x0010, 0x9085, 0x0001, 0x0005, 0xb8a4, 0x900d,
+	0x1118, 0x9085, 0x0001, 0x0005, 0x0136, 0x01c6, 0xa800, 0x9005,
+	0x11b8, 0x890e, 0x810e, 0x810f, 0x9184, 0x003f, 0x20e0, 0x9184,
+	0xffc0, 0x9080, 0x0004, 0x2098, 0x20a9, 0x0001, 0x2009, 0x0010,
+	0x4002, 0x9606, 0x0128, 0x8109, 0x1dd8, 0x9085, 0x0001, 0x0008,
+	0x9006, 0x01ce, 0x013e, 0x0005, 0x0146, 0x01d6, 0xa860, 0x20e8,
+	0xa85c, 0x9080, 0x0004, 0x20a0, 0x20a9, 0x0010, 0x2009, 0xffff,
+	0x4104, 0x01de, 0x014e, 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8,
+	0x890e, 0x810e, 0x810f, 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0,
+	0x9080, 0x0004, 0x2098, 0x20a9, 0x0001, 0x2009, 0x0010, 0x4002,
+	0x9606, 0x0128, 0x8109, 0x1dd8, 0x9085, 0x0001, 0x0068, 0x0146,
+	0x01d6, 0x3300, 0x8001, 0x20a0, 0x3c00, 0x20e8, 0x2001, 0xffff,
+	0x4004, 0x01de, 0x014e, 0x9006, 0x01ce, 0x013e, 0x0005, 0x0096,
+	0x0126, 0x2091, 0x8000, 0xb8a4, 0x904d, 0x1128, 0x080c, 0x0fff,
+	0x0168, 0x2900, 0xb8a6, 0x080c, 0x67bc, 0xa803, 0x0001, 0xa807,
+	0x0000, 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8,
+	0x0096, 0x0126, 0x2091, 0x8000, 0xb8a4, 0x904d, 0x0130, 0xb8a7,
+	0x0000, 0x080c, 0x1031, 0x9085, 0x0001, 0x012e, 0x009e, 0x0005,
+	0xb89c, 0xd0a4, 0x0005, 0x00b6, 0x00f6, 0x080c, 0x73b0, 0x01b0,
+	0x71c4, 0x81ff, 0x1198, 0x71dc, 0xd19c, 0x0180, 0x2001, 0x007e,
+	0x9080, 0x1000, 0x2004, 0x905d, 0x0148, 0xb804, 0x9084, 0x00ff,
+	0x9086, 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x2079, 0x1847,
+	0x7804, 0xd0a4, 0x01d0, 0x0156, 0x20a9, 0x007f, 0x900e, 0x0016,
+	0x080c, 0x6600, 0x1168, 0xb804, 0x9084, 0xff00, 0x8007, 0x9096,
+	0x0004, 0x0118, 0x9086, 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802,
+	0x001e, 0x8108, 0x1f04, 0x6847, 0x015e, 0x080c, 0x6928, 0x0120,
+	0x2001, 0x1985, 0x200c, 0x0038, 0x2079, 0x1847, 0x7804, 0xd0a4,
+	0x0130, 0x2009, 0x07d0, 0x2011, 0x6872, 0x080c, 0x8562, 0x00fe,
+	0x00be, 0x0005, 0x00b6, 0x2011, 0x6872, 0x080c, 0x84ca, 0x080c,
+	0x6928, 0x01d8, 0x2001, 0x107e, 0x2004, 0x2058, 0xb900, 0xc1ec,
+	0xb902, 0x080c, 0x6966, 0x0130, 0x2009, 0x07d0, 0x2011, 0x6872,
+	0x080c, 0x8562, 0x00e6, 0x2071, 0x1800, 0x9006, 0x707e, 0x7060,
+	0x7082, 0x080c, 0x2f96, 0x00ee, 0x04b0, 0x0156, 0x00c6, 0x20a9,
+	0x007f, 0x900e, 0x0016, 0x080c, 0x6600, 0x1538, 0xb800, 0xd0ec,
+	0x0520, 0x0046, 0xbaa0, 0x2220, 0x9006, 0x2009, 0x0029, 0x080c,
+	0xe58d, 0xb800, 0xc0e5, 0xc0ec, 0xb802, 0x080c, 0x6962, 0x2001,
+	0x0707, 0x1128, 0xb804, 0x9084, 0x00ff, 0x9085, 0x0700, 0xb806,
+	0x2019, 0x0029, 0x080c, 0x9262, 0x0076, 0x903e, 0x080c, 0x913f,
+	0x900e, 0x080c, 0xe2ca, 0x007e, 0x004e, 0x001e, 0x8108, 0x1f04,
+	0x689a, 0x00ce, 0x015e, 0x00be, 0x0005, 0x00b6, 0x6010, 0x2058,
+	0xb800, 0xc0ec, 0xb802, 0x00be, 0x0005, 0x00b6, 0x00c6, 0x0096,
+	0x080c, 0x1018, 0x090c, 0x0dd5, 0x2958, 0x009e, 0x2001, 0x196b,
+	0x2b02, 0xb8af, 0x0000, 0x2009, 0x00ff, 0x080c, 0x6035, 0xb807,
+	0x0006, 0xb813, 0x00ff, 0xb817, 0xffff, 0xb86f, 0x0200, 0xb86c,
+	0xb893, 0x0002, 0xb8bb, 0x0520, 0xb8a3, 0x00ff, 0xb8af, 0x0000,
+	0x00ce, 0x00be, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb800, 0x00be,
+	0xd0ac, 0x0005, 0x6010, 0x00b6, 0x905d, 0x0108, 0xb800, 0x00be,
+	0xd0bc, 0x0005, 0x0006, 0x0016, 0x0026, 0xb804, 0x908c, 0x00ff,
+	0x9196, 0x0006, 0x0188, 0x9196, 0x0004, 0x0170, 0x9196, 0x0005,
+	0x0158, 0x908c, 0xff00, 0x810f, 0x9196, 0x0006, 0x0128, 0x9196,
+	0x0004, 0x0110, 0x9196, 0x0005, 0x002e, 0x001e, 0x000e, 0x0005,
+	0x00b6, 0x00f6, 0x2001, 0x107e, 0x2004, 0x905d, 0x0110, 0xb800,
+	0xd0ec, 0x00fe, 0x00be, 0x0005, 0x0126, 0x0026, 0x2091, 0x8000,
+	0x0006, 0xbaa0, 0x9290, 0x1000, 0x2204, 0x9b06, 0x190c, 0x0dd5,
+	0x000e, 0xba00, 0x9005, 0x0110, 0xc2fd, 0x0008, 0xc2fc, 0xba02,
+	0x002e, 0x012e, 0x0005, 0x2011, 0x1837, 0x2204, 0xd0cc, 0x0138,
+	0x2001, 0x1983, 0x200c, 0x2011, 0x6958, 0x080c, 0x8562, 0x0005,
+	0x2011, 0x6958, 0x080c, 0x84ca, 0x2011, 0x1837, 0x2204, 0xc0cc,
+	0x2012, 0x0005, 0x080c, 0x56d0, 0xd0ac, 0x0005, 0x080c, 0x56d0,
+	0xd0a4, 0x0005, 0x0016, 0xb904, 0x9184, 0x00ff, 0x908e, 0x0006,
+	0x001e, 0x0005, 0x0016, 0xb904, 0x9184, 0xff00, 0x8007, 0x908e,
+	0x0006, 0x001e, 0x0005, 0x00b6, 0x00f6, 0x080c, 0xd216, 0x0158,
+	0x70dc, 0x9084, 0x0028, 0x0138, 0x2001, 0x107f, 0x2004, 0x905d,
+	0x0110, 0xb8cc, 0xd094, 0x00fe, 0x00be, 0x0005, 0x2071, 0x1910,
+	0x7003, 0x0001, 0x7007, 0x0000, 0x9006, 0x7012, 0x7016, 0x701a,
+	0x701e, 0x700a, 0x7046, 0x2001, 0x1947, 0x2003, 0x0000, 0x0005,
+	0x0016, 0x00e6, 0x2071, 0x1948, 0x900e, 0x710a, 0x080c, 0x56d0,
+	0xd0fc, 0x1140, 0x080c, 0x56d0, 0x900e, 0xd09c, 0x0108, 0x8108,
+	0x7102, 0x00f8, 0x2001, 0x1867, 0x200c, 0x9184, 0x0007, 0x0002,
+	0x69aa, 0x69aa, 0x69aa, 0x69aa, 0x69aa, 0x69c0, 0x69ce, 0x69aa,
+	0x7003, 0x0003, 0x2009, 0x1868, 0x210c, 0x9184, 0xff00, 0x8007,
+	0x9005, 0x1110, 0x2001, 0x0002, 0x7006, 0x0018, 0x7003, 0x0005,
+	0x0c88, 0x00ee, 0x001e, 0x0005, 0x00e6, 0x2071, 0x0050, 0x684c,
+	0x9005, 0x1150, 0x00e6, 0x2071, 0x1910, 0x7028, 0xc085, 0x702a,
+	0x00ee, 0x9085, 0x0001, 0x0488, 0x6844, 0x9005, 0x0158, 0x080c,
+	0x770a, 0x6a60, 0x9200, 0x7002, 0x6864, 0x9101, 0x7006, 0x9006,
+	0x7012, 0x7016, 0x6860, 0x7002, 0x6864, 0x7006, 0x6868, 0x700a,
+	0x686c, 0x700e, 0x6844, 0x9005, 0x1110, 0x7012, 0x7016, 0x684c,
+	0x701a, 0x701c, 0x9085, 0x0040, 0x701e, 0x7037, 0x0019, 0x702b,
+	0x0001, 0x00e6, 0x2071, 0x1910, 0x7028, 0xc084, 0x702a, 0x7007,
+	0x0001, 0x700b, 0x0000, 0x00ee, 0x9006, 0x00ee, 0x0005, 0x00e6,
+	0x0026, 0x2071, 0x1948, 0x7000, 0x9015, 0x0904, 0x6c7e, 0x9286,
+	0x0003, 0x0904, 0x6b14, 0x9286, 0x0005, 0x0904, 0x6b14, 0x2071,
+	0x1877, 0xa87c, 0x9005, 0x0904, 0x6a75, 0x7140, 0xa868, 0x9102,
+	0x0a04, 0x6c7e, 0xa878, 0xd084, 0x15d8, 0xa853, 0x0019, 0x2001,
+	0x8023, 0xa84e, 0x2071, 0x1910, 0x701c, 0x9005, 0x1904, 0x6e20,
+	0x0e04, 0x6e8e, 0x2071, 0x0000, 0xa850, 0x7032, 0xa84c, 0x7082,
+	0xa870, 0x7086, 0xa86c, 0x708a, 0xa880, 0x708e, 0x7036, 0x0146,
+	0x01d6, 0x0136, 0x01c6, 0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a,
+	0xa868, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098,
+	0x4003, 0x015e, 0x01ce, 0x013e, 0x01de, 0x014e, 0x2091, 0x4080,
+	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x119b, 0x0804, 0x6af7,
+	0xa853, 0x001b, 0x2001, 0x8027, 0x0820, 0x7004, 0xd08c, 0x1904,
+	0x6c7e, 0xa853, 0x001a, 0x2001, 0x8024, 0x0804, 0x6a39, 0x00e6,
+	0x0026, 0x2071, 0x1948, 0x7000, 0x9015, 0x0904, 0x6c7e, 0x9286,
+	0x0003, 0x0904, 0x6b14, 0x9286, 0x0005, 0x0904, 0x6b14, 0xa84f,
+	0x8022, 0xa853, 0x0018, 0x0804, 0x6adc, 0xa868, 0xd0fc, 0x11d8,
+	0x00e6, 0x0026, 0x2001, 0x1948, 0x2004, 0x9005, 0x0904, 0x6c7e,
+	0xa87c, 0xd0bc, 0x1904, 0x6c7e, 0xa978, 0xa874, 0x9105, 0x1904,
+	0x6c7e, 0x2001, 0x1948, 0x2004, 0x0002, 0x6c7e, 0x6ad8, 0x6b14,
+	0x6b14, 0x6c7e, 0x6b14, 0x0005, 0xa868, 0xd0fc, 0x1500, 0x00e6,
+	0x0026, 0x2009, 0x1948, 0x210c, 0x81ff, 0x0904, 0x6c7e, 0xa87c,
+	0xd0cc, 0x0904, 0x6c7e, 0xa880, 0x9084, 0x00ff, 0x9086, 0x0001,
+	0x1904, 0x6c7e, 0x9186, 0x0003, 0x0904, 0x6b14, 0x9186, 0x0005,
+	0x0904, 0x6b14, 0xa84f, 0x8021, 0xa853, 0x0017, 0x0028, 0x0005,
+	0xa84f, 0x8020, 0xa853, 0x0016, 0x2071, 0x1910, 0x701c, 0x9005,
+	0x1904, 0x6e20, 0x0e04, 0x6e8e, 0x2071, 0x0000, 0xa84c, 0x7082,
+	0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091,
+	0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x119b, 0x2071,
+	0x1800, 0x2011, 0x0001, 0xa804, 0x900d, 0x702c, 0x1158, 0xa802,
+	0x2900, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x83eb, 0x002e,
+	0x00ee, 0x0005, 0x0096, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900,
+	0x81ff, 0x1dc8, 0x009e, 0x0c58, 0xa84f, 0x0000, 0x00f6, 0x2079,
+	0x0050, 0x2071, 0x1910, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904,
+	0x6c03, 0x782c, 0x908c, 0x0780, 0x190c, 0x6fda, 0x8004, 0x8004,
+	0x8004, 0x9084, 0x0003, 0x0002, 0x6b32, 0x6c03, 0x6b57, 0x6b9e,
+	0x080c, 0x0dd5, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d,
+	0x1170, 0x2071, 0x19fa, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949,
+	0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016,
 	0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8,
-	0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x81a6, 0x0e04, 0x6c02,
-	0x2071, 0x1910, 0x701c, 0x2048, 0xa84c, 0x900d, 0x0d18, 0x2071,
-	0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870,
-	0x708a, 0xa850, 0x9082, 0x0019, 0x1278, 0x2091, 0x4080, 0x2001,
-	0x0089, 0x2004, 0xd084, 0x190c, 0x1192, 0x2071, 0x1910, 0x080c,
-	0x6d93, 0x002e, 0x00ee, 0x0005, 0xa850, 0x9082, 0x001c, 0x1e68,
-	0xa880, 0x708e, 0x7036, 0x0146, 0x01d6, 0x0136, 0x01c6, 0x0156,
-	0x20e9, 0x0000, 0x20a1, 0x002a, 0xa868, 0x20a8, 0xa860, 0x20e0,
-	0xa85c, 0x9080, 0x0021, 0x2098, 0x4003, 0x015e, 0x01ce, 0x013e,
-	0x01de, 0x014e, 0x0890, 0x2071, 0x1910, 0xa803, 0x0000, 0x2908,
-	0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902,
-	0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1118, 0x002e, 0x00ee,
-	0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802,
-	0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2,
-	0x080c, 0x81a6, 0x002e, 0x00ee, 0x0005, 0x0006, 0xa87c, 0x0006,
-	0xa867, 0x0103, 0x20a9, 0x001c, 0xa860, 0x20e8, 0xa85c, 0x9080,
-	0x001d, 0x20a0, 0x9006, 0x4004, 0x000e, 0x9084, 0x00ff, 0xa87e,
-	0x000e, 0xa87a, 0xa982, 0x0005, 0x2071, 0x1910, 0x7004, 0x0002,
-	0x6ca6, 0x6ca7, 0x6d92, 0x6ca7, 0x0dd5, 0x6d92, 0x0005, 0x2001,
-	0x1948, 0x2004, 0x0002, 0x6cb1, 0x6cb1, 0x6d2b, 0x6d2c, 0x6cb1,
-	0x6d2c, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x6db2, 0x701c, 0x904d,
-	0x0508, 0xa84c, 0x9005, 0x0904, 0x6cfc, 0x0e04, 0x6cda, 0xa94c,
-	0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036,
-	0xa870, 0x708a, 0xa850, 0x9082, 0x0019, 0x1278, 0x2091, 0x4080,
-	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1192, 0x2071, 0x1910,
-	0x080c, 0x6d93, 0x012e, 0x0804, 0x6d2a, 0xa850, 0x9082, 0x001c,
-	0x1e68, 0xa880, 0x708e, 0x7036, 0x0146, 0x01d6, 0x0136, 0x01c6,
-	0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a, 0xa868, 0x20a8, 0xa860,
-	0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, 0x4003, 0x015e, 0x01ce,
-	0x013e, 0x01de, 0x014e, 0x0890, 0x2001, 0x005b, 0x2004, 0x9094,
-	0x0780, 0x190c, 0x6da7, 0xd09c, 0x2071, 0x1910, 0x1510, 0x2071,
-	0x1910, 0x700f, 0x0001, 0xa964, 0x9184, 0x00ff, 0x9086, 0x0003,
-	0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108, 0x710e, 0x2900,
-	0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, 0x2071, 0x1910, 0x701c,
-	0x2048, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, 0x1108,
-	0x701a, 0x012e, 0x0005, 0x0005, 0x00d6, 0x2008, 0x2069, 0x19f8,
-	0x683c, 0x9005, 0x0760, 0x0158, 0x9186, 0x0003, 0x0540, 0x2001,
-	0x1815, 0x2004, 0x2009, 0x1abf, 0x210c, 0x9102, 0x1500, 0x0126,
-	0x2091, 0x8000, 0x2069, 0x0050, 0x693c, 0x6838, 0x9106, 0x0190,
-	0x0e04, 0x6d5e, 0x2069, 0x0000, 0x6837, 0x8040, 0x6833, 0x0012,
-	0x6883, 0x8040, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084,
-	0x190c, 0x1192, 0x2069, 0x19f8, 0x683f, 0xffff, 0x012e, 0x00de,
-	0x0126, 0x2091, 0x8000, 0x1e0c, 0x6e23, 0x701c, 0x904d, 0x0540,
-	0x2001, 0x005b, 0x2004, 0x9094, 0x0780, 0x15c9, 0xd09c, 0x1500,
-	0x2071, 0x1910, 0x700f, 0x0001, 0xa964, 0x9184, 0x00ff, 0x9086,
-	0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108, 0x710e,
-	0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, 0x701c, 0x2048,
-	0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, 0x1108, 0x701a,
-	0x012e, 0x0005, 0x0005, 0x0126, 0x2091, 0x8000, 0x701c, 0x904d,
-	0x0160, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, 0x1108,
-	0x701a, 0x012e, 0x080c, 0x1032, 0x0005, 0x012e, 0x0005, 0x2091,
-	0x8000, 0x0e04, 0x6da9, 0x0006, 0x0016, 0x2001, 0x8004, 0x0006,
-	0x0804, 0x0dde, 0x0096, 0x00f6, 0x2079, 0x0050, 0x7044, 0xd084,
-	0x01e0, 0xc084, 0x7046, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6,
-	0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080,
-	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1192, 0x2009, 0x1947,
-	0x200b, 0x0000, 0x00fe, 0x009e, 0x0005, 0x782c, 0x9094, 0x0780,
-	0x1971, 0xd0a4, 0x0db8, 0x2009, 0x1947, 0x2104, 0x8000, 0x200a,
-	0x9082, 0x000f, 0x0e78, 0x00e6, 0x2071, 0x1800, 0x7824, 0x00e6,
+	0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x83eb, 0x0c10, 0x2071,
+	0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1580, 0x7824, 0x00e6,
 	0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, 0x2009, 0x1830, 0x210c,
 	0x918a, 0x0020, 0x0218, 0x7022, 0x00ee, 0x0058, 0x00ee, 0x2048,
 	0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c,
-	0x81a6, 0x782c, 0x9094, 0x0780, 0x190c, 0x6da7, 0xd0a4, 0x19f0,
-	0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836,
-	0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
-	0xd084, 0x190c, 0x1192, 0x2009, 0x1947, 0x200b, 0x0000, 0x00ee,
-	0x00fe, 0x009e, 0x0005, 0x00f6, 0x2079, 0x0050, 0x7044, 0xd084,
-	0x01b8, 0xc084, 0x7046, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6,
+	0x83eb, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fda, 0xd0a4, 0x19f0,
+	0x2071, 0x19fa, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949, 0x2004,
+	0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c,
+	0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e,
+	0x70c0, 0x9200, 0x70c2, 0x080c, 0x83eb, 0x0800, 0x0096, 0x00e6,
+	0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e,
+	0x70c0, 0x8000, 0x70c2, 0x080c, 0x83eb, 0x782c, 0x9094, 0x0780,
+	0x190c, 0x6fda, 0xd0a4, 0x1d60, 0x00ee, 0x782c, 0x9094, 0x0780,
+	0x190c, 0x6fda, 0xd09c, 0x11a0, 0x009e, 0x2900, 0x7822, 0xa804,
+	0x900d, 0x1560, 0x2071, 0x19fa, 0x703c, 0x9005, 0x1328, 0x2001,
+	0x1949, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005,
+	0x009e, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a,
+	0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1170,
+	0x2071, 0x19fa, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949, 0x2004,
+	0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800,
+	0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff,
+	0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x83eb, 0x00fe,
+	0x002e, 0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018,
+	0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804,
+	0x900d, 0x1904, 0x6c58, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fda,
+	0xd09c, 0x1198, 0x701c, 0x904d, 0x0180, 0x7010, 0x8001, 0x7012,
+	0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, 0x9094,
+	0x0780, 0x190c, 0x6fda, 0xd09c, 0x0d68, 0x782c, 0x9094, 0x0780,
+	0x190c, 0x6fda, 0xd0a4, 0x01b0, 0x00e6, 0x7824, 0x2048, 0x2071,
+	0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2,
+	0x080c, 0x83eb, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fda, 0xd0a4,
+	0x1d60, 0x00ee, 0x2071, 0x19fa, 0x703c, 0x9005, 0x1328, 0x2001,
+	0x1949, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005,
+	0x00e6, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802,
+	0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2,
+	0x080c, 0x83eb, 0x00ee, 0x0804, 0x6c13, 0xa868, 0xd0fc, 0x1560,
+	0x0096, 0xa804, 0xa807, 0x0000, 0x904d, 0x190c, 0x0fb1, 0x009e,
+	0x0018, 0xa868, 0xd0fc, 0x1500, 0x00e6, 0x0026, 0xa84f, 0x0000,
+	0x00f6, 0x2079, 0x0050, 0x2071, 0x1910, 0xa803, 0x0000, 0x7010,
+	0x9005, 0x1904, 0x6d9a, 0x782c, 0x908c, 0x0780, 0x190c, 0x6fda,
+	0x8004, 0x8004, 0x8004, 0x9084, 0x0003, 0x0002, 0x6c9d, 0x6d9a,
+	0x6cb8, 0x6d29, 0x080c, 0x0dd5, 0x0005, 0x2071, 0x1800, 0x2900,
+	0x7822, 0xa804, 0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005,
+	0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff,
+	0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x83eb, 0x0c60,
+	0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1904, 0x6d18,
+	0x7830, 0x8007, 0x9084, 0x001f, 0x9082, 0x0005, 0x1220, 0x00fe,
+	0x002e, 0x00ee, 0x0005, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c,
+	0xd19c, 0x1148, 0x2009, 0x1830, 0x210c, 0x918a, 0x0020, 0x0218,
+	0x7022, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900,
+	0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x83eb, 0x782c, 0x9094,
+	0x0780, 0x190c, 0x6fda, 0xd0a4, 0x19f0, 0x0e04, 0x6d0f, 0x7838,
+	0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833,
+	0x0013, 0x00de, 0x2001, 0x1921, 0x200c, 0xc184, 0x2102, 0x2091,
+	0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x119b, 0x2009,
+	0x1947, 0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2001,
+	0x1921, 0x200c, 0xc185, 0x2102, 0x00fe, 0x002e, 0x00ee, 0x0005,
+	0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff,
+	0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x83eb, 0x0804,
+	0x6ccb, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c,
+	0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x83eb,
+	0x782c, 0x9094, 0x0780, 0x190c, 0x6fda, 0xd0a4, 0x1d60, 0x00ee,
+	0x0e04, 0x6d6d, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069,
+	0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, 0x7046,
+	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x119b,
+	0x2009, 0x1947, 0x200b, 0x0000, 0x782c, 0x9094, 0x0780, 0x190c,
+	0x6fda, 0xd09c, 0x1170, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d,
+	0x11e0, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046,
+	0x0c58, 0x009e, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d,
+	0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d,
+	0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016,
+	0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8,
+	0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x83eb, 0x00fe, 0x002e,
+	0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d,
+	0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d,
+	0x1904, 0x6e0b, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fda, 0xd09c,
+	0x11b0, 0x701c, 0x904d, 0x0198, 0xa84c, 0x9005, 0x1180, 0x7010,
+	0x8001, 0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822,
+	0x782c, 0x9094, 0x0780, 0x190c, 0x6fda, 0xd09c, 0x0d50, 0x782c,
+	0x9094, 0x0780, 0x190c, 0x6fda, 0xd0a4, 0x05c8, 0x00e6, 0x7824,
+	0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0,
+	0x8000, 0x70c2, 0x080c, 0x83eb, 0x782c, 0x9094, 0x0780, 0x190c,
+	0x6fda, 0xd0a4, 0x1d60, 0x00ee, 0x0e04, 0x6e04, 0x7838, 0x7938,
+	0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013,
+	0x00de, 0x7044, 0xc084, 0x7046, 0x2091, 0x4080, 0x2001, 0x0089,
+	0x2004, 0xd084, 0x190c, 0x119b, 0x2009, 0x1947, 0x200b, 0x0000,
+	0x00fe, 0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x00fe,
+	0x002e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, 0x9016, 0x702c,
+	0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e,
+	0x70c0, 0x9200, 0x70c2, 0x080c, 0x83eb, 0x00ee, 0x0804, 0x6daa,
+	0x2071, 0x1910, 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, 0x7012,
+	0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148,
+	0xa804, 0x900d, 0x1128, 0x1e04, 0x6e4b, 0x002e, 0x00ee, 0x0005,
+	0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210,
+	0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c,
+	0x83eb, 0x0e04, 0x6e35, 0x2071, 0x1910, 0x701c, 0x2048, 0xa84c,
+	0x900d, 0x0d18, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c,
+	0x7086, 0x7036, 0xa870, 0x708a, 0xa850, 0x9082, 0x0019, 0x1278,
+	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x119b,
+	0x2071, 0x1910, 0x080c, 0x6fc6, 0x002e, 0x00ee, 0x0005, 0xa850,
+	0x9082, 0x001c, 0x1e68, 0xa880, 0x708e, 0x7036, 0x0146, 0x01d6,
+	0x0136, 0x01c6, 0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a, 0xa868,
+	0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, 0x4003,
+	0x015e, 0x01ce, 0x013e, 0x01de, 0x014e, 0x0890, 0x2071, 0x1910,
+	0xa803, 0x0000, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d,
+	0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d,
+	0x1118, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c,
+	0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e,
+	0x70c0, 0x9200, 0x70c2, 0x080c, 0x83eb, 0x002e, 0x00ee, 0x0005,
+	0x0006, 0xa87c, 0x0006, 0xa867, 0x0103, 0x20a9, 0x001c, 0xa860,
+	0x20e8, 0xa85c, 0x9080, 0x001d, 0x20a0, 0x9006, 0x4004, 0x000e,
+	0x9084, 0x00ff, 0xa87e, 0x000e, 0xa87a, 0xa982, 0x0005, 0x2071,
+	0x1910, 0x7004, 0x0002, 0x6ed9, 0x6eda, 0x6fc5, 0x6eda, 0x0dd5,
+	0x6fc5, 0x0005, 0x2001, 0x1948, 0x2004, 0x0002, 0x6ee4, 0x6ee4,
+	0x6f5e, 0x6f5f, 0x6ee4, 0x6f5f, 0x0126, 0x2091, 0x8000, 0x1e0c,
+	0x6fe5, 0x701c, 0x904d, 0x0508, 0xa84c, 0x9005, 0x0904, 0x6f2f,
+	0x0e04, 0x6f0d, 0xa94c, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032,
+	0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0xa850, 0x9082, 0x0019,
+	0x1278, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c,
+	0x119b, 0x2071, 0x1910, 0x080c, 0x6fc6, 0x012e, 0x0804, 0x6f5d,
+	0xa850, 0x9082, 0x001c, 0x1e68, 0xa880, 0x708e, 0x7036, 0x0146,
+	0x01d6, 0x0136, 0x01c6, 0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a,
+	0xa868, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098,
+	0x4003, 0x015e, 0x01ce, 0x013e, 0x01de, 0x014e, 0x0890, 0x2001,
+	0x005b, 0x2004, 0x9094, 0x0780, 0x190c, 0x6fda, 0xd09c, 0x2071,
+	0x1910, 0x1510, 0x2071, 0x1910, 0x700f, 0x0001, 0xa964, 0x9184,
+	0x00ff, 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101,
+	0x0108, 0x710e, 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de,
+	0x2071, 0x1910, 0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800,
+	0x701e, 0x9005, 0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x00d6,
+	0x2008, 0x2069, 0x19fa, 0x683c, 0x9005, 0x0760, 0x0158, 0x9186,
+	0x0003, 0x0540, 0x2001, 0x1815, 0x2004, 0x2009, 0x1ac8, 0x210c,
+	0x9102, 0x1500, 0x0126, 0x2091, 0x8000, 0x2069, 0x0050, 0x693c,
+	0x6838, 0x9106, 0x0190, 0x0e04, 0x6f91, 0x2069, 0x0000, 0x6837,
+	0x8040, 0x6833, 0x0012, 0x6883, 0x8040, 0x2091, 0x4080, 0x2001,
+	0x0089, 0x2004, 0xd084, 0x190c, 0x119b, 0x2069, 0x19fa, 0x683f,
+	0xffff, 0x012e, 0x00de, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x7056,
+	0x701c, 0x904d, 0x0540, 0x2001, 0x005b, 0x2004, 0x9094, 0x0780,
+	0x15c9, 0xd09c, 0x1500, 0x2071, 0x1910, 0x700f, 0x0001, 0xa964,
+	0x9184, 0x00ff, 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff,
+	0x8101, 0x0108, 0x710e, 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822,
+	0x00de, 0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e,
+	0x9005, 0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x0126, 0x2091,
+	0x8000, 0x701c, 0x904d, 0x0160, 0x7010, 0x8001, 0x7012, 0xa800,
+	0x701e, 0x9005, 0x1108, 0x701a, 0x012e, 0x080c, 0x1031, 0x0005,
+	0x012e, 0x0005, 0x2091, 0x8000, 0x0e04, 0x6fdc, 0x0006, 0x0016,
+	0x2001, 0x8004, 0x0006, 0x0804, 0x0dde, 0x0096, 0x00f6, 0x2079,
+	0x0050, 0x7044, 0xd084, 0x01e0, 0xc084, 0x7046, 0x7838, 0x7938,
+	0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013,
+	0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c,
+	0x119b, 0x2009, 0x1947, 0x200b, 0x0000, 0x00fe, 0x009e, 0x0005,
+	0x782c, 0x9094, 0x0780, 0x1971, 0xd0a4, 0x0db8, 0x2009, 0x1947,
+	0x2104, 0x8000, 0x200a, 0x9082, 0x000f, 0x0e78, 0x00e6, 0x2071,
+	0x1800, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148,
+	0x2009, 0x1830, 0x210c, 0x918a, 0x0020, 0x0218, 0x7022, 0x00ee,
+	0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0,
+	0x8000, 0x70c2, 0x080c, 0x83eb, 0x782c, 0x9094, 0x0780, 0x190c,
+	0x6fda, 0xd0a4, 0x19f0, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6,
 	0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080,
-	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1192, 0x00fe, 0x0005,
-	0x782c, 0x9094, 0x0780, 0x190c, 0x6da7, 0xd0a4, 0x0db8, 0x00e6,
-	0x2071, 0x1800, 0x7824, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e,
-	0x70c0, 0x8000, 0x70c2, 0x080c, 0x81a6, 0x782c, 0x9094, 0x0780,
-	0x190c, 0x6da7, 0xd0a4, 0x1d70, 0x00d6, 0x2069, 0x0050, 0x693c,
-	0x2069, 0x1948, 0x6808, 0x690a, 0x2069, 0x19f8, 0x9102, 0x1118,
-	0x683c, 0x9005, 0x1328, 0x2001, 0x1949, 0x200c, 0x810d, 0x693e,
-	0x00de, 0x00ee, 0x00fe, 0x0005, 0x7098, 0x908a, 0x0029, 0x1a0c,
-	0x0dd5, 0x9082, 0x001d, 0x001b, 0x6027, 0x1e00, 0x0005, 0x6f47,
-	0x6ed1, 0x6eed, 0x6f15, 0x6f36, 0x6f76, 0x6f88, 0x6eed, 0x6f5e,
-	0x6e8c, 0x6eba, 0x6e8b, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804,
-	0x9005, 0x1180, 0x6808, 0x9005, 0x1518, 0x709b, 0x0028, 0x2069,
-	0x198d, 0x2d04, 0x7002, 0x080c, 0x72b7, 0x6028, 0x9085, 0x0600,
-	0x602a, 0x00b0, 0x709b, 0x0028, 0x2069, 0x198d, 0x2d04, 0x7002,
-	0x6028, 0x9085, 0x0600, 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056,
-	0x2071, 0x1a60, 0x080c, 0x19ff, 0x005e, 0x004e, 0x003e, 0x00ee,
-	0x00de, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, 0x9005, 0x1178,
-	0x6808, 0x9005, 0x1160, 0x709b, 0x0028, 0x2069, 0x198d, 0x2d04,
-	0x7002, 0x080c, 0x7352, 0x6028, 0x9085, 0x0600, 0x602a, 0x00de,
-	0x0005, 0x0006, 0x2001, 0x0090, 0x080c, 0x2ba1, 0x000e, 0x6124,
-	0xd1e4, 0x1190, 0x080c, 0x6ff5, 0xd1d4, 0x1160, 0xd1dc, 0x1138,
-	0xd1cc, 0x0150, 0x709b, 0x0020, 0x080c, 0x6ff5, 0x0028, 0x709b,
-	0x001d, 0x0010, 0x709b, 0x001f, 0x0005, 0x2001, 0x0088, 0x080c,
-	0x2ba1, 0x6124, 0xd1cc, 0x11d8, 0xd1dc, 0x11b0, 0xd1e4, 0x1188,
-	0x9184, 0x1e00, 0x11c8, 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e,
-	0x080c, 0x71a9, 0x2001, 0x0080, 0x080c, 0x2ba1, 0x709b, 0x0028,
-	0x0058, 0x709b, 0x001e, 0x0040, 0x709b, 0x001d, 0x0028, 0x709b,
-	0x0020, 0x0010, 0x709b, 0x001f, 0x0005, 0x60e3, 0x0001, 0x600c,
-	0xc0b4, 0x600e, 0x080c, 0x71a9, 0x2001, 0x0080, 0x080c, 0x2ba1,
-	0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158, 0xd1e4, 0x1130, 0x9184,
-	0x1e00, 0x1158, 0x709b, 0x0028, 0x0040, 0x709b, 0x001e, 0x0028,
-	0x709b, 0x001d, 0x0010, 0x709b, 0x001f, 0x0005, 0x2001, 0x00a0,
-	0x080c, 0x2ba1, 0x6124, 0xd1dc, 0x1138, 0xd1e4, 0x0138, 0x080c,
-	0x1a29, 0x709b, 0x001e, 0x0010, 0x709b, 0x001d, 0x0005, 0x080c,
-	0x7078, 0x6124, 0xd1dc, 0x1188, 0x080c, 0x6ff5, 0x0016, 0x080c,
-	0x1a29, 0x001e, 0xd1d4, 0x1128, 0xd1e4, 0x0138, 0x709b, 0x001e,
-	0x0020, 0x709b, 0x001f, 0x080c, 0x6ff5, 0x0005, 0x0006, 0x2001,
-	0x00a0, 0x080c, 0x2ba1, 0x000e, 0x6124, 0xd1d4, 0x1160, 0xd1cc,
-	0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x709b, 0x001e, 0x0028,
-	0x709b, 0x001d, 0x0010, 0x709b, 0x0021, 0x0005, 0x080c, 0x7078,
-	0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x709b,
-	0x001e, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x001f, 0x0005,
-	0x0006, 0x2001, 0x0090, 0x080c, 0x2ba1, 0x000e, 0x6124, 0xd1d4,
-	0x1178, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0158, 0x709b,
-	0x001e, 0x0040, 0x709b, 0x001d, 0x0028, 0x709b, 0x0020, 0x0010,
-	0x709b, 0x001f, 0x0005, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x0126,
+	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x119b, 0x2009, 0x1947,
+	0x200b, 0x0000, 0x00ee, 0x00fe, 0x009e, 0x0005, 0x00f6, 0x2079,
+	0x0050, 0x7044, 0xd084, 0x01b8, 0xc084, 0x7046, 0x7838, 0x7938,
+	0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013,
+	0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c,
+	0x119b, 0x00fe, 0x0005, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fda,
+	0xd0a4, 0x0db8, 0x00e6, 0x2071, 0x1800, 0x7824, 0x2048, 0x702c,
+	0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x83eb,
+	0x782c, 0x9094, 0x0780, 0x190c, 0x6fda, 0xd0a4, 0x1d70, 0x00d6,
+	0x2069, 0x0050, 0x693c, 0x2069, 0x1948, 0x6808, 0x690a, 0x2069,
+	0x19fa, 0x9102, 0x1118, 0x683c, 0x9005, 0x1328, 0x2001, 0x1949,
+	0x200c, 0x810d, 0x693e, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x7098,
+	0x908a, 0x0029, 0x1a0c, 0x0dd5, 0x9082, 0x001d, 0x001b, 0x6027,
+	0x1e00, 0x0005, 0x717a, 0x7104, 0x7120, 0x7148, 0x7169, 0x71a9,
+	0x71bb, 0x7120, 0x7191, 0x70bf, 0x70ed, 0x70be, 0x0005, 0x00d6,
+	0x2069, 0x0200, 0x6804, 0x9005, 0x1180, 0x6808, 0x9005, 0x1518,
+	0x709b, 0x0028, 0x2069, 0x198f, 0x2d04, 0x7002, 0x080c, 0x74ea,
+	0x6028, 0x9085, 0x0600, 0x602a, 0x00b0, 0x709b, 0x0028, 0x2069,
+	0x198f, 0x2d04, 0x7002, 0x6028, 0x9085, 0x0600, 0x602a, 0x00e6,
+	0x0036, 0x0046, 0x0056, 0x2071, 0x1a62, 0x080c, 0x1aa9, 0x005e,
+	0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, 0x2069, 0x0200,
+	0x6804, 0x9005, 0x1178, 0x6808, 0x9005, 0x1160, 0x709b, 0x0028,
+	0x2069, 0x198f, 0x2d04, 0x7002, 0x080c, 0x7585, 0x6028, 0x9085,
+	0x0600, 0x602a, 0x00de, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c,
+	0x2cef, 0x000e, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x7228, 0xd1d4,
+	0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x709b, 0x0020, 0x080c,
+	0x7228, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x001f, 0x0005,
+	0x2001, 0x0088, 0x080c, 0x2cef, 0x6124, 0xd1cc, 0x11d8, 0xd1dc,
+	0x11b0, 0xd1e4, 0x1188, 0x9184, 0x1e00, 0x11c8, 0x60e3, 0x0001,
+	0x600c, 0xc0b4, 0x600e, 0x080c, 0x73dc, 0x2001, 0x0080, 0x080c,
+	0x2cef, 0x709b, 0x0028, 0x0058, 0x709b, 0x001e, 0x0040, 0x709b,
+	0x001d, 0x0028, 0x709b, 0x0020, 0x0010, 0x709b, 0x001f, 0x0005,
+	0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x73dc, 0x2001,
+	0x0080, 0x080c, 0x2cef, 0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158,
+	0xd1e4, 0x1130, 0x9184, 0x1e00, 0x1158, 0x709b, 0x0028, 0x0040,
+	0x709b, 0x001e, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x001f,
+	0x0005, 0x2001, 0x00a0, 0x080c, 0x2cef, 0x6124, 0xd1dc, 0x1138,
+	0xd1e4, 0x0138, 0x080c, 0x1ad3, 0x709b, 0x001e, 0x0010, 0x709b,
+	0x001d, 0x0005, 0x080c, 0x72ab, 0x6124, 0xd1dc, 0x1188, 0x080c,
+	0x7228, 0x0016, 0x080c, 0x1ad3, 0x001e, 0xd1d4, 0x1128, 0xd1e4,
+	0x0138, 0x709b, 0x001e, 0x0020, 0x709b, 0x001f, 0x080c, 0x7228,
+	0x0005, 0x0006, 0x2001, 0x00a0, 0x080c, 0x2cef, 0x000e, 0x6124,
+	0xd1d4, 0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140,
+	0x709b, 0x001e, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x0021,
+	0x0005, 0x080c, 0x72ab, 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128,
+	0xd1e4, 0x0140, 0x709b, 0x001e, 0x0028, 0x709b, 0x001d, 0x0010,
+	0x709b, 0x001f, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, 0x2cef,
+	0x000e, 0x6124, 0xd1d4, 0x1178, 0xd1cc, 0x1150, 0xd1dc, 0x1128,
+	0xd1e4, 0x0158, 0x709b, 0x001e, 0x0040, 0x709b, 0x001d, 0x0028,
+	0x709b, 0x0020, 0x0010, 0x709b, 0x001f, 0x0005, 0x0016, 0x00c6,
+	0x00d6, 0x00e6, 0x0126, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071,
+	0x1800, 0x2091, 0x8000, 0x080c, 0x73b0, 0x11d8, 0x2001, 0x180c,
+	0x200c, 0xd1b4, 0x01b0, 0xc1b4, 0x2102, 0x6027, 0x0200, 0x080c,
+	0x2c38, 0x6024, 0xd0cc, 0x0148, 0x2001, 0x00a0, 0x080c, 0x2cef,
+	0x080c, 0x7698, 0x080c, 0x601b, 0x0428, 0x6028, 0xc0cd, 0x602a,
+	0x0408, 0x080c, 0x73ca, 0x0150, 0x080c, 0x73c1, 0x1138, 0x2001,
+	0x0001, 0x080c, 0x27ea, 0x080c, 0x7388, 0x00a0, 0x080c, 0x72a8,
+	0x0178, 0x2001, 0x0001, 0x080c, 0x27ea, 0x7098, 0x9086, 0x001e,
+	0x0120, 0x7098, 0x9086, 0x0022, 0x1118, 0x709b, 0x0025, 0x0010,
+	0x709b, 0x0021, 0x012e, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x0005,
+	0x0026, 0x2011, 0x7239, 0x080c, 0x85a4, 0x002e, 0x0016, 0x0026,
+	0x2009, 0x0064, 0x2011, 0x7239, 0x080c, 0x859b, 0x002e, 0x001e,
+	0x0005, 0x00e6, 0x00f6, 0x0016, 0x080c, 0xa259, 0x2071, 0x1800,
+	0x080c, 0x71d6, 0x001e, 0x00fe, 0x00ee, 0x0005, 0x0016, 0x0026,
+	0x0036, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0126, 0x080c, 0xa259,
 	0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2091, 0x8000,
-	0x080c, 0x717d, 0x11d8, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x01b0,
-	0xc1b4, 0x2102, 0x6027, 0x0200, 0x080c, 0x2aea, 0x6024, 0xd0cc,
-	0x0148, 0x2001, 0x00a0, 0x080c, 0x2ba1, 0x080c, 0x7465, 0x080c,
-	0x5df8, 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x7197,
-	0x0150, 0x080c, 0x718e, 0x1138, 0x2001, 0x0001, 0x080c, 0x269c,
-	0x080c, 0x7155, 0x00a0, 0x080c, 0x7075, 0x0178, 0x2001, 0x0001,
-	0x080c, 0x269c, 0x7098, 0x9086, 0x001e, 0x0120, 0x7098, 0x9086,
-	0x0022, 0x1118, 0x709b, 0x0025, 0x0010, 0x709b, 0x0021, 0x012e,
-	0x00ee, 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x7006,
-	0x080c, 0x835c, 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011,
-	0x7006, 0x080c, 0x8353, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6,
-	0x0016, 0x080c, 0x9ffc, 0x2071, 0x1800, 0x080c, 0x6fa3, 0x001e,
-	0x00fe, 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6,
-	0x00e6, 0x00f6, 0x0126, 0x080c, 0x9ffc, 0x2061, 0x0100, 0x2069,
-	0x0140, 0x2071, 0x1800, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a,
-	0x2011, 0x0003, 0x080c, 0xa349, 0x2011, 0x0002, 0x080c, 0xa353,
-	0x080c, 0xa236, 0x080c, 0x8308, 0x0036, 0x901e, 0x080c, 0xa2ac,
-	0x003e, 0x60e3, 0x0000, 0x080c, 0xe68c, 0x080c, 0xe6a7, 0x2009,
-	0x0004, 0x080c, 0x2af0, 0x080c, 0x2a0b, 0x2001, 0x1800, 0x2003,
-	0x0004, 0x6027, 0x0008, 0x2011, 0x7006, 0x080c, 0x835c, 0x080c,
-	0x7197, 0x0118, 0x9006, 0x080c, 0x2ba1, 0x080c, 0x0bae, 0x2001,
-	0x0001, 0x080c, 0x269c, 0x012e, 0x00fe, 0x00ee, 0x00de, 0x00ce,
-	0x003e, 0x002e, 0x001e, 0x0005, 0x0026, 0x00e6, 0x2011, 0x7013,
-	0x2071, 0x19f8, 0x701c, 0x9206, 0x1118, 0x7018, 0x9005, 0x0110,
-	0x9085, 0x0001, 0x00ee, 0x002e, 0x0005, 0x6020, 0xd09c, 0x0005,
-	0x6800, 0x9084, 0xfffe, 0x9086, 0x00c0, 0x0170, 0x2001, 0x00c0,
-	0x080c, 0x2ba1, 0x0156, 0x20a9, 0x002d, 0x1d04, 0x7085, 0x2091,
-	0x6000, 0x1f04, 0x7085, 0x015e, 0x0005, 0x00c6, 0x00d6, 0x00e6,
-	0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0x7474,
-	0x2001, 0x196d, 0x2003, 0x0000, 0x9006, 0x709a, 0x60e2, 0x6886,
-	0x080c, 0x2764, 0x9006, 0x080c, 0x2ba1, 0x080c, 0x5cb7, 0x6027,
-	0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6,
-	0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800,
-	0x2001, 0x197d, 0x200c, 0x9186, 0x0000, 0x0158, 0x9186, 0x0001,
-	0x0158, 0x9186, 0x0002, 0x0158, 0x9186, 0x0003, 0x0158, 0x0804,
-	0x7145, 0x709b, 0x0022, 0x0040, 0x709b, 0x0021, 0x0028, 0x709b,
-	0x0023, 0x0010, 0x709b, 0x0024, 0x60e3, 0x0000, 0x6887, 0x0001,
-	0x2001, 0x0001, 0x080c, 0x2764, 0x0026, 0x080c, 0xaadc, 0x002e,
-	0x7000, 0x908e, 0x0004, 0x0118, 0x602b, 0x0028, 0x0010, 0x602b,
-	0x0020, 0x0156, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x6024,
-	0xd0ac, 0x0150, 0x012e, 0x015e, 0x080c, 0xcf18, 0x0118, 0x9006,
-	0x080c, 0x2bcb, 0x0804, 0x7151, 0x6800, 0x9084, 0x00a1, 0xc0bd,
-	0x6802, 0x080c, 0x2aea, 0x6904, 0xd1d4, 0x1140, 0x2001, 0x0100,
-	0x080c, 0x2ba1, 0x1f04, 0x70ef, 0x080c, 0x71d4, 0x012e, 0x015e,
-	0x080c, 0x718e, 0x01a8, 0x6044, 0x9005, 0x0168, 0x6050, 0x0006,
-	0x9085, 0x0020, 0x6052, 0x080c, 0x71d4, 0x9006, 0x8001, 0x1df0,
-	0x000e, 0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110, 0x080c, 0x71d4,
-	0x080c, 0xcf18, 0x0118, 0x9006, 0x080c, 0x2bcb, 0x0016, 0x0026,
-	0x7000, 0x908e, 0x0004, 0x0130, 0x2009, 0x00c8, 0x2011, 0x7013,
-	0x080c, 0x831a, 0x002e, 0x001e, 0x080c, 0x819d, 0x7034, 0xc085,
-	0x7036, 0x2001, 0x197d, 0x2003, 0x0004, 0x080c, 0x6e74, 0x080c,
-	0x718e, 0x0138, 0x6804, 0xd0d4, 0x1120, 0xd0dc, 0x1100, 0x080c,
-	0x746a, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6,
-	0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0x81b4,
-	0x080c, 0x81a6, 0x080c, 0x7474, 0x2001, 0x196d, 0x2003, 0x0000,
-	0x9006, 0x709a, 0x60e2, 0x6886, 0x080c, 0x2764, 0x9006, 0x080c,
-	0x2ba1, 0x6043, 0x0090, 0x6043, 0x0010, 0x6027, 0xffff, 0x602b,
-	0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, 0x2001, 0x197c,
-	0x2004, 0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006, 0x080c, 0x54bb,
-	0x9084, 0x0030, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, 0x080c,
-	0x54bb, 0x9084, 0x0030, 0x9086, 0x0030, 0x000e, 0x0005, 0x0006,
-	0x080c, 0x54bb, 0x9084, 0x0030, 0x9086, 0x0010, 0x000e, 0x0005,
-	0x0006, 0x080c, 0x54bb, 0x9084, 0x0030, 0x9086, 0x0020, 0x000e,
-	0x0005, 0x0036, 0x0016, 0x2001, 0x180c, 0x2004, 0x908c, 0x0013,
-	0x0180, 0x0020, 0x080c, 0x2784, 0x900e, 0x0028, 0x080c, 0x672f,
-	0x1dc8, 0x2009, 0x0002, 0x2019, 0x0028, 0x080c, 0x3039, 0x9006,
-	0x0019, 0x001e, 0x003e, 0x0005, 0x00e6, 0x2071, 0x180c, 0x2e04,
-	0x0130, 0x080c, 0xcf11, 0x1128, 0x9085, 0x0010, 0x0010, 0x9084,
-	0xffef, 0x2072, 0x00ee, 0x0005, 0x6050, 0x0006, 0x60ec, 0x0006,
-	0x600c, 0x0006, 0x6004, 0x0006, 0x6028, 0x0006, 0x0016, 0x6138,
-	0x6050, 0x9084, 0xfbff, 0x9085, 0x2000, 0x6052, 0x613a, 0x20a9,
-	0x0012, 0x1d04, 0x71e9, 0x2091, 0x6000, 0x1f04, 0x71e9, 0x602f,
-	0x0100, 0x602f, 0x0000, 0x6050, 0x9085, 0x0400, 0x9084, 0xdfff,
-	0x6052, 0x613a, 0x001e, 0x602f, 0x0040, 0x602f, 0x0000, 0x000e,
-	0x602a, 0x000e, 0x6006, 0x000e, 0x600e, 0x000e, 0x60ee, 0x60e3,
-	0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x2764, 0x2001,
-	0x00a0, 0x0006, 0x080c, 0xcf18, 0x000e, 0x0130, 0x080c, 0x2bbf,
-	0x9006, 0x080c, 0x2bcb, 0x0010, 0x080c, 0x2ba1, 0x000e, 0x6052,
-	0x6050, 0x0006, 0xc0e5, 0x6052, 0x00f6, 0x2079, 0x0100, 0x080c,
-	0x2a5f, 0x00fe, 0x000e, 0x6052, 0x0005, 0x0156, 0x0016, 0x0026,
-	0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140,
-	0x2071, 0x1800, 0x6020, 0x9084, 0x0080, 0x0138, 0x2001, 0x180c,
-	0x200c, 0xc1c5, 0x2102, 0x0804, 0x72a9, 0x2001, 0x180c, 0x200c,
-	0xc1c4, 0x2102, 0x6028, 0x9084, 0xe1ff, 0x602a, 0x6027, 0x0200,
-	0x2001, 0x0090, 0x080c, 0x2ba1, 0x20a9, 0x0366, 0x6024, 0xd0cc,
-	0x1518, 0x1d04, 0x7256, 0x2091, 0x6000, 0x1f04, 0x7256, 0x2011,
-	0x0003, 0x080c, 0xa349, 0x2011, 0x0002, 0x080c, 0xa353, 0x080c,
-	0xa236, 0x901e, 0x080c, 0xa2ac, 0x2001, 0x00a0, 0x080c, 0x2ba1,
-	0x080c, 0x7465, 0x080c, 0x5df8, 0x080c, 0xcf18, 0x0110, 0x080c,
-	0x0d45, 0x9085, 0x0001, 0x0498, 0x86ff, 0x1110, 0x080c, 0x1a29,
-	0x60e3, 0x0000, 0x2001, 0x196d, 0x2004, 0x080c, 0x2764, 0x60e2,
-	0x2001, 0x0080, 0x080c, 0x2ba1, 0x20a9, 0x0366, 0x6027, 0x1e00,
-	0x2009, 0x1e00, 0x080c, 0x2aea, 0x6024, 0x910c, 0x0138, 0x1d04,
-	0x728e, 0x2091, 0x6000, 0x1f04, 0x728e, 0x0808, 0x6028, 0x9085,
-	0x1e00, 0x602a, 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008,
-	0x6886, 0x080c, 0xcf18, 0x0110, 0x080c, 0x0d45, 0x9006, 0x00ee,
-	0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156,
-	0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100,
-	0x2071, 0x1800, 0x7000, 0x9086, 0x0003, 0x1168, 0x2001, 0x020b,
-	0x2004, 0x9084, 0x5540, 0x9086, 0x5540, 0x1128, 0x2069, 0x1a76,
-	0x2d04, 0x8000, 0x206a, 0x2069, 0x0140, 0x6020, 0x9084, 0x00c0,
-	0x0120, 0x6884, 0x9005, 0x1904, 0x731c, 0x2001, 0x0088, 0x080c,
-	0x2ba1, 0x9006, 0x60e2, 0x6886, 0x080c, 0x2764, 0x2069, 0x0200,
-	0x6804, 0x9005, 0x1118, 0x6808, 0x9005, 0x01c0, 0x6028, 0x9084,
-	0xfbff, 0x602a, 0x6027, 0x0400, 0x2069, 0x198d, 0x7000, 0x206a,
-	0x709b, 0x0026, 0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04, 0x72fe,
-	0x2091, 0x6000, 0x1f04, 0x72fe, 0x0804, 0x734a, 0x2069, 0x0140,
-	0x20a9, 0x0384, 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x2aea,
-	0x6024, 0x910c, 0x0508, 0x9084, 0x1a00, 0x11f0, 0x1d04, 0x730a,
-	0x2091, 0x6000, 0x1f04, 0x730a, 0x2011, 0x0003, 0x080c, 0xa349,
-	0x2011, 0x0002, 0x080c, 0xa353, 0x080c, 0xa236, 0x901e, 0x080c,
-	0xa2ac, 0x2001, 0x00a0, 0x080c, 0x2ba1, 0x080c, 0x7465, 0x080c,
-	0x5df8, 0x9085, 0x0001, 0x00b0, 0x2001, 0x0080, 0x080c, 0x2ba1,
-	0x2069, 0x0140, 0x60e3, 0x0000, 0x70b4, 0x9005, 0x1118, 0x6887,
-	0x0001, 0x0008, 0x6886, 0x2001, 0x196d, 0x2004, 0x080c, 0x2764,
-	0x60e2, 0x9006, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e,
+	0x6028, 0xc09c, 0x602a, 0x2011, 0x0003, 0x080c, 0xa639, 0x2011,
+	0x0002, 0x080c, 0xa643, 0x080c, 0xa526, 0x080c, 0x8550, 0x0036,
+	0x901e, 0x080c, 0xa59c, 0x003e, 0x60e3, 0x0000, 0x080c, 0xe9c8,
+	0x080c, 0xe9e3, 0x2009, 0x0004, 0x080c, 0x2c3e, 0x080c, 0x2b59,
+	0x2001, 0x1800, 0x2003, 0x0004, 0x6027, 0x0008, 0x2011, 0x7239,
+	0x080c, 0x85a4, 0x080c, 0x73ca, 0x0118, 0x9006, 0x080c, 0x2cef,
+	0x080c, 0x0bae, 0x2001, 0x0001, 0x080c, 0x27ea, 0x012e, 0x00fe,
+	0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x0026,
+	0x00e6, 0x2011, 0x7246, 0x2071, 0x19fa, 0x701c, 0x9206, 0x1118,
+	0x7018, 0x9005, 0x0110, 0x9085, 0x0001, 0x00ee, 0x002e, 0x0005,
+	0x6020, 0xd09c, 0x0005, 0x6800, 0x9084, 0xfffe, 0x9086, 0x00c0,
+	0x0170, 0x2001, 0x00c0, 0x080c, 0x2cef, 0x0156, 0x20a9, 0x002d,
+	0x1d04, 0x72b8, 0x2091, 0x6000, 0x1f04, 0x72b8, 0x015e, 0x0005,
+	0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071,
+	0x1800, 0x080c, 0x76a7, 0x2001, 0x196d, 0x2003, 0x0000, 0x9006,
+	0x709a, 0x60e2, 0x6886, 0x080c, 0x28b2, 0x9006, 0x080c, 0x2cef,
+	0x080c, 0x5eda, 0x6027, 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de,
+	0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069,
+	0x0140, 0x2071, 0x1800, 0x2001, 0x197d, 0x200c, 0x9186, 0x0000,
+	0x0158, 0x9186, 0x0001, 0x0158, 0x9186, 0x0002, 0x0158, 0x9186,
+	0x0003, 0x0158, 0x0804, 0x7378, 0x709b, 0x0022, 0x0040, 0x709b,
+	0x0021, 0x0028, 0x709b, 0x0023, 0x0010, 0x709b, 0x0024, 0x60e3,
+	0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x28b2, 0x0026,
+	0x080c, 0xadb8, 0x002e, 0x7000, 0x908e, 0x0004, 0x0118, 0x602b,
+	0x0028, 0x0010, 0x602b, 0x0020, 0x0156, 0x0126, 0x2091, 0x8000,
+	0x20a9, 0x0005, 0x6024, 0xd0ac, 0x0150, 0x012e, 0x015e, 0x080c,
+	0xd216, 0x0118, 0x9006, 0x080c, 0x2d19, 0x0804, 0x7384, 0x6800,
+	0x9084, 0x00a1, 0xc0bd, 0x6802, 0x080c, 0x2c38, 0x6904, 0xd1d4,
+	0x1140, 0x2001, 0x0100, 0x080c, 0x2cef, 0x1f04, 0x7322, 0x080c,
+	0x7407, 0x012e, 0x015e, 0x080c, 0x73c1, 0x01a8, 0x6044, 0x9005,
+	0x0168, 0x6050, 0x0006, 0x9085, 0x0020, 0x6052, 0x080c, 0x7407,
+	0x9006, 0x8001, 0x1df0, 0x000e, 0x6052, 0x0028, 0x6804, 0xd0d4,
+	0x1110, 0x080c, 0x7407, 0x080c, 0xd216, 0x0118, 0x9006, 0x080c,
+	0x2d19, 0x0016, 0x0026, 0x7000, 0x908e, 0x0004, 0x0130, 0x2009,
+	0x00c8, 0x2011, 0x7246, 0x080c, 0x8562, 0x002e, 0x001e, 0x080c,
+	0x83e2, 0x7034, 0xc085, 0x7036, 0x2001, 0x197d, 0x2003, 0x0004,
+	0x080c, 0x70a7, 0x080c, 0x73c1, 0x0138, 0x6804, 0xd0d4, 0x1120,
+	0xd0dc, 0x1100, 0x080c, 0x769d, 0x00ee, 0x00de, 0x00ce, 0x0005,
+	0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071,
+	0x1800, 0x080c, 0x83f9, 0x080c, 0x83eb, 0x080c, 0x76a7, 0x2001,
+	0x196d, 0x2003, 0x0000, 0x9006, 0x709a, 0x60e2, 0x6886, 0x080c,
+	0x28b2, 0x9006, 0x080c, 0x2cef, 0x6043, 0x0090, 0x6043, 0x0010,
+	0x6027, 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005,
+	0x0006, 0x2001, 0x197c, 0x2004, 0x9086, 0xaaaa, 0x000e, 0x0005,
+	0x0006, 0x080c, 0x56d4, 0x9084, 0x0030, 0x9086, 0x0000, 0x000e,
+	0x0005, 0x0006, 0x080c, 0x56d4, 0x9084, 0x0030, 0x9086, 0x0030,
+	0x000e, 0x0005, 0x0006, 0x080c, 0x56d4, 0x9084, 0x0030, 0x9086,
+	0x0010, 0x000e, 0x0005, 0x0006, 0x080c, 0x56d4, 0x9084, 0x0030,
+	0x9086, 0x0020, 0x000e, 0x0005, 0x0036, 0x0016, 0x2001, 0x180c,
+	0x2004, 0x908c, 0x0013, 0x0180, 0x0020, 0x080c, 0x28d2, 0x900e,
+	0x0028, 0x080c, 0x6962, 0x1dc8, 0x2009, 0x0002, 0x2019, 0x0028,
+	0x080c, 0x3187, 0x9006, 0x0019, 0x001e, 0x003e, 0x0005, 0x00e6,
+	0x2071, 0x180c, 0x2e04, 0x0130, 0x080c, 0xd20f, 0x1128, 0x9085,
+	0x0010, 0x0010, 0x9084, 0xffef, 0x2072, 0x00ee, 0x0005, 0x6050,
+	0x0006, 0x60ec, 0x0006, 0x600c, 0x0006, 0x6004, 0x0006, 0x6028,
+	0x0006, 0x0016, 0x6138, 0x6050, 0x9084, 0xfbff, 0x9085, 0x2000,
+	0x6052, 0x613a, 0x20a9, 0x0012, 0x1d04, 0x741c, 0x2091, 0x6000,
+	0x1f04, 0x741c, 0x602f, 0x0100, 0x602f, 0x0000, 0x6050, 0x9085,
+	0x0400, 0x9084, 0xdfff, 0x6052, 0x613a, 0x001e, 0x602f, 0x0040,
+	0x602f, 0x0000, 0x000e, 0x602a, 0x000e, 0x6006, 0x000e, 0x600e,
+	0x000e, 0x60ee, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001,
+	0x080c, 0x28b2, 0x2001, 0x00a0, 0x0006, 0x080c, 0xd216, 0x000e,
+	0x0130, 0x080c, 0x2d0d, 0x9006, 0x080c, 0x2d19, 0x0010, 0x080c,
+	0x2cef, 0x000e, 0x6052, 0x6050, 0x0006, 0xc0e5, 0x6052, 0x00f6,
+	0x2079, 0x0100, 0x080c, 0x2bad, 0x00fe, 0x000e, 0x6052, 0x0005,
+	0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061,
+	0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x6020, 0x9084, 0x0080,
+	0x0138, 0x2001, 0x180c, 0x200c, 0xc1c5, 0x2102, 0x0804, 0x74dc,
+	0x2001, 0x180c, 0x200c, 0xc1c4, 0x2102, 0x6028, 0x9084, 0xe1ff,
+	0x602a, 0x6027, 0x0200, 0x2001, 0x0090, 0x080c, 0x2cef, 0x20a9,
+	0x0366, 0x6024, 0xd0cc, 0x1518, 0x1d04, 0x7489, 0x2091, 0x6000,
+	0x1f04, 0x7489, 0x2011, 0x0003, 0x080c, 0xa639, 0x2011, 0x0002,
+	0x080c, 0xa643, 0x080c, 0xa526, 0x901e, 0x080c, 0xa59c, 0x2001,
+	0x00a0, 0x080c, 0x2cef, 0x080c, 0x7698, 0x080c, 0x601b, 0x080c,
+	0xd216, 0x0110, 0x080c, 0x0d45, 0x9085, 0x0001, 0x0498, 0x86ff,
+	0x1110, 0x080c, 0x1ad3, 0x60e3, 0x0000, 0x2001, 0x196d, 0x2004,
+	0x080c, 0x28b2, 0x60e2, 0x2001, 0x0080, 0x080c, 0x2cef, 0x20a9,
+	0x0366, 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x2c38, 0x6024,
+	0x910c, 0x0138, 0x1d04, 0x74c1, 0x2091, 0x6000, 0x1f04, 0x74c1,
+	0x0808, 0x6028, 0x9085, 0x1e00, 0x602a, 0x70b4, 0x9005, 0x1118,
+	0x6887, 0x0001, 0x0008, 0x6886, 0x080c, 0xd216, 0x0110, 0x080c,
+	0x0d45, 0x9006, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e,
 	0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6,
-	0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, 0x6020, 0x9084, 0x00c0,
-	0x01c8, 0x2011, 0x0003, 0x080c, 0xa349, 0x2011, 0x0002, 0x080c,
-	0xa353, 0x080c, 0xa236, 0x901e, 0x080c, 0xa2ac, 0x2069, 0x0140,
-	0x2001, 0x00a0, 0x080c, 0x2ba1, 0x080c, 0x7465, 0x080c, 0x5df8,
-	0x0804, 0x73e5, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x1160, 0xc1b5,
-	0x2102, 0x080c, 0x6ffb, 0x2069, 0x0140, 0x2001, 0x0080, 0x080c,
-	0x2ba1, 0x60e3, 0x0000, 0x2069, 0x0200, 0x6804, 0x9005, 0x1118,
-	0x6808, 0x9005, 0x0180, 0x6028, 0x9084, 0xfdff, 0x602a, 0x6027,
-	0x0200, 0x2069, 0x198d, 0x7000, 0x206a, 0x709b, 0x0027, 0x7003,
-	0x0001, 0x0804, 0x73e5, 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c,
-	0x2aea, 0x6024, 0x910c, 0x01c8, 0x9084, 0x1c00, 0x11b0, 0x1d04,
-	0x73a3, 0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x81e5,
-	0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, 0x19f8,
-	0x7018, 0x00ee, 0x9005, 0x19f8, 0x0500, 0x0026, 0x2011, 0x7013,
-	0x080c, 0x8285, 0x2011, 0x7006, 0x080c, 0x835c, 0x002e, 0x2069,
-	0x0140, 0x60e3, 0x0000, 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001,
-	0x0008, 0x6886, 0x2001, 0x196d, 0x2004, 0x080c, 0x2764, 0x60e2,
-	0x2001, 0x180c, 0x200c, 0xc1b4, 0x2102, 0x00ee, 0x00de, 0x00ce,
+	0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, 0x7000, 0x9086, 0x0003,
+	0x1168, 0x2001, 0x020b, 0x2004, 0x9084, 0x5540, 0x9086, 0x5540,
+	0x1128, 0x2069, 0x1a79, 0x2d04, 0x8000, 0x206a, 0x2069, 0x0140,
+	0x6020, 0x9084, 0x00c0, 0x0120, 0x6884, 0x9005, 0x1904, 0x754f,
+	0x2001, 0x0088, 0x080c, 0x2cef, 0x9006, 0x60e2, 0x6886, 0x080c,
+	0x28b2, 0x2069, 0x0200, 0x6804, 0x9005, 0x1118, 0x6808, 0x9005,
+	0x01c0, 0x6028, 0x9084, 0xfbff, 0x602a, 0x6027, 0x0400, 0x2069,
+	0x198f, 0x7000, 0x206a, 0x709b, 0x0026, 0x7003, 0x0001, 0x20a9,
+	0x0002, 0x1d04, 0x7531, 0x2091, 0x6000, 0x1f04, 0x7531, 0x0804,
+	0x757d, 0x2069, 0x0140, 0x20a9, 0x0384, 0x6027, 0x1e00, 0x2009,
+	0x1e00, 0x080c, 0x2c38, 0x6024, 0x910c, 0x0508, 0x9084, 0x1a00,
+	0x11f0, 0x1d04, 0x753d, 0x2091, 0x6000, 0x1f04, 0x753d, 0x2011,
+	0x0003, 0x080c, 0xa639, 0x2011, 0x0002, 0x080c, 0xa643, 0x080c,
+	0xa526, 0x901e, 0x080c, 0xa59c, 0x2001, 0x00a0, 0x080c, 0x2cef,
+	0x080c, 0x7698, 0x080c, 0x601b, 0x9085, 0x0001, 0x00b0, 0x2001,
+	0x0080, 0x080c, 0x2cef, 0x2069, 0x0140, 0x60e3, 0x0000, 0x70b4,
+	0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, 0x196d,
+	0x2004, 0x080c, 0x28b2, 0x60e2, 0x9006, 0x00ee, 0x00de, 0x00ce,
 	0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026,
-	0x0036, 0x0046, 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800,
-	0x080c, 0xcf11, 0x1904, 0x7453, 0x7130, 0xd184, 0x1170, 0x080c,
-	0x31c4, 0x0138, 0xc18d, 0x7132, 0x2011, 0x1848, 0x2214, 0xd2ac,
-	0x1120, 0x7030, 0xd08c, 0x0904, 0x7453, 0x2011, 0x1848, 0x220c,
-	0xd1a4, 0x0538, 0x0016, 0x2019, 0x000e, 0x080c, 0xe1f4, 0x0156,
-	0x00b6, 0x20a9, 0x007f, 0x900e, 0x9186, 0x007e, 0x01a0, 0x9186,
-	0x0080, 0x0188, 0x080c, 0x63cd, 0x1170, 0x2120, 0x9006, 0x0016,
-	0x2009, 0x000e, 0x080c, 0xe280, 0x2009, 0x0001, 0x2011, 0x0100,
-	0x080c, 0x846c, 0x001e, 0x8108, 0x1f04, 0x741c, 0x00be, 0x015e,
-	0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0002, 0x2019, 0x0004,
-	0x080c, 0x3039, 0x001e, 0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f,
-	0x900e, 0x080c, 0x63cd, 0x1110, 0x080c, 0x5e12, 0x8108, 0x1f04,
-	0x7449, 0x00be, 0x015e, 0x080c, 0x1a29, 0x080c, 0xaadc, 0x60e3,
-	0x0000, 0x080c, 0x5df8, 0x080c, 0x70af, 0x00ee, 0x00ce, 0x004e,
-	0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x2001, 0x197d, 0x2003,
-	0x0001, 0x0005, 0x2001, 0x197d, 0x2003, 0x0000, 0x0005, 0x2001,
-	0x197c, 0x2003, 0xaaaa, 0x0005, 0x2001, 0x197c, 0x2003, 0x0000,
-	0x0005, 0x2071, 0x18fa, 0x7003, 0x0000, 0x7007, 0x0000, 0x080c,
-	0x1019, 0x090c, 0x0dd5, 0xa8ab, 0xdcb0, 0x2900, 0x704e, 0x080c,
-	0x1019, 0x090c, 0x0dd5, 0xa8ab, 0xdcb0, 0x2900, 0x7052, 0xa867,
-	0x0000, 0xa86b, 0x0001, 0xa89f, 0x0000, 0x0005, 0x00e6, 0x2071,
-	0x0040, 0x6848, 0x9005, 0x1118, 0x9085, 0x0001, 0x04b0, 0x6840,
-	0x9005, 0x0150, 0x04a1, 0x6a50, 0x9200, 0x7002, 0x6854, 0x9101,
-	0x7006, 0x9006, 0x7012, 0x7016, 0x6850, 0x7002, 0x6854, 0x7006,
-	0x6858, 0x700a, 0x685c, 0x700e, 0x6840, 0x9005, 0x1110, 0x7012,
-	0x7016, 0x6848, 0x701a, 0x701c, 0x9085, 0x0040, 0x701e, 0x2001,
-	0x0019, 0x7036, 0x702b, 0x0001, 0x2001, 0x0004, 0x200c, 0x918c,
-	0xfff7, 0x918d, 0x8000, 0x2102, 0x00d6, 0x2069, 0x18fa, 0x6807,
-	0x0001, 0x00de, 0x080c, 0x7a51, 0x9006, 0x00ee, 0x0005, 0x900e,
-	0x0156, 0x20a9, 0x0006, 0x8003, 0x2011, 0x0100, 0x2214, 0x9296,
-	0x0008, 0x1110, 0x818d, 0x0010, 0x81f5, 0x3e08, 0x1f04, 0x74db,
-	0x015e, 0x0005, 0x2079, 0x0040, 0x2071, 0x18fa, 0x7004, 0x0002,
-	0x74fa, 0x74fb, 0x7532, 0x758d, 0x769d, 0x74f8, 0x74f8, 0x76c7,
-	0x080c, 0x0dd5, 0x0005, 0x2079, 0x0040, 0x782c, 0x908c, 0x0780,
-	0x190c, 0x7b33, 0xd0a4, 0x01f0, 0x7824, 0x2048, 0x9006, 0xa802,
-	0xa806, 0xa864, 0x9084, 0x00ff, 0x908a, 0x0040, 0x0608, 0x00b8,
-	0x2001, 0x1800, 0x200c, 0x9186, 0x0003, 0x1160, 0x7104, 0x9186,
-	0x0004, 0x0140, 0x9186, 0x0007, 0x0128, 0x9186, 0x0003, 0x19e8,
-	0x080c, 0x758d, 0x782c, 0xd09c, 0x090c, 0x7a51, 0x0005, 0x9082,
-	0x005a, 0x1218, 0x2100, 0x003b, 0x0c18, 0x080c, 0x75c3, 0x0c90,
-	0x00e3, 0x08f0, 0x0005, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3,
-	0x75c3, 0x75c3, 0x75c3, 0x75e5, 0x75c3, 0x75c3, 0x75c3, 0x75c3,
-	0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3,
-	0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75cf,
-	0x75c3, 0x77b8, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75cf,
-	0x77f9, 0x783a, 0x7881, 0x7895, 0x75c3, 0x75c3, 0x75e5, 0x75cf,
-	0x75f9, 0x75c3, 0x7671, 0x7940, 0x795b, 0x75c3, 0x75e5, 0x75c3,
-	0x75f9, 0x75c3, 0x75c3, 0x7667, 0x795b, 0x75c3, 0x75c3, 0x75c3,
-	0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x760d, 0x75c3,
-	0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3,
-	0x7ad7, 0x75c3, 0x7a81, 0x75c3, 0x7a81, 0x75c3, 0x7622, 0x75c3,
-	0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x75c3, 0x2079, 0x0040, 0x7004,
-	0x9086, 0x0003, 0x1198, 0x782c, 0x080c, 0x7a7a, 0xd0a4, 0x0170,
-	0x7824, 0x2048, 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff,
-	0x908a, 0x001a, 0x1210, 0x002b, 0x0c50, 0x00e9, 0x080c, 0x7a51,
-	0x0005, 0x75c3, 0x75cf, 0x77a4, 0x75c3, 0x75cf, 0x75c3, 0x75cf,
-	0x75cf, 0x75c3, 0x75cf, 0x77a4, 0x75cf, 0x75cf, 0x75cf, 0x75cf,
-	0x75cf, 0x75c3, 0x75cf, 0x77a4, 0x75c3, 0x75c3, 0x75cf, 0x75c3,
-	0x75c3, 0x75c3, 0x75cf, 0x00e6, 0x2071, 0x18fa, 0x2009, 0x0400,
-	0x0071, 0x00ee, 0x0005, 0x2009, 0x1000, 0x0049, 0x0005, 0x2009,
-	0x2000, 0x0029, 0x0005, 0x2009, 0x0800, 0x0009, 0x0005, 0x7007,
-	0x0001, 0xa868, 0x9084, 0x00ff, 0x9105, 0xa86a, 0x0126, 0x2091,
-	0x8000, 0x080c, 0x6a46, 0x012e, 0x0005, 0xa864, 0x8007, 0x9084,
-	0x00ff, 0x0d08, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x7746,
-	0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7746,
-	0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0968, 0x8001, 0x1120,
-	0x7007, 0x0001, 0x0804, 0x7761, 0x7007, 0x0003, 0x7012, 0x2900,
-	0x7016, 0x701a, 0x704b, 0x7761, 0x0005, 0xa864, 0x8007, 0x9084,
-	0x00ff, 0x0904, 0x75cb, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804,
-	0x777d, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b,
-	0x777d, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x9086, 0x0001,
-	0x1904, 0x75cb, 0x7007, 0x0001, 0x2009, 0x1834, 0x210c, 0x81ff,
-	0x11a8, 0xa868, 0x9084, 0x00ff, 0xa86a, 0xa883, 0x0000, 0x080c,
-	0x608c, 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139,
-	0xa87a, 0xa982, 0x080c, 0x6a46, 0x012e, 0x0ca0, 0xa994, 0x9186,
-	0x0071, 0x0d38, 0x9186, 0x0064, 0x0d20, 0x9186, 0x007c, 0x0d08,
-	0x9186, 0x0028, 0x09f0, 0x9186, 0x0038, 0x09d8, 0x9186, 0x0078,
-	0x09c0, 0x9186, 0x005f, 0x09a8, 0x9186, 0x0056, 0x0990, 0xa897,
-	0x4005, 0xa89b, 0x0001, 0x2001, 0x0030, 0x900e, 0x08a0, 0xa87c,
-	0x9084, 0x00c0, 0x9086, 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804,
-	0x7972, 0x2900, 0x7016, 0x701a, 0x20a9, 0x0004, 0xa860, 0x20e0,
-	0xa85c, 0x9080, 0x0030, 0x2098, 0x7050, 0x2040, 0xa060, 0x20e8,
-	0xa05c, 0x9080, 0x0023, 0x20a0, 0x4003, 0xa888, 0x7012, 0x9082,
-	0x0401, 0x1a04, 0x75d3, 0xaab4, 0x928a, 0x0002, 0x1a04, 0x75d3,
-	0x82ff, 0x1138, 0xa8b8, 0xa9bc, 0x9105, 0x0118, 0x2001, 0x7704,
-	0x0018, 0x9280, 0x76fa, 0x2005, 0x7056, 0x7010, 0x9015, 0x0904,
-	0x76e5, 0x080c, 0x1019, 0x1118, 0x7007, 0x0004, 0x0005, 0x2900,
-	0x7022, 0x7054, 0x2060, 0xe000, 0xa866, 0x7050, 0x2040, 0xa95c,
-	0xe004, 0x9100, 0xa076, 0xa860, 0xa072, 0xe008, 0x920a, 0x1210,
-	0x900e, 0x2200, 0x7112, 0xe20c, 0x8003, 0x800b, 0x9296, 0x0004,
-	0x0108, 0x9108, 0xa17a, 0x810b, 0xa17e, 0x080c, 0x10e0, 0xa06c,
-	0x908e, 0x0100, 0x0170, 0x9086, 0x0200, 0x0118, 0x7007, 0x0007,
-	0x0005, 0x7020, 0x2048, 0x080c, 0x1032, 0x7014, 0x2048, 0x0804,
-	0x75d3, 0x7020, 0x2048, 0x7018, 0xa802, 0xa807, 0x0000, 0x2908,
-	0x2048, 0xa906, 0x711a, 0x0804, 0x769d, 0x7014, 0x2048, 0x7007,
-	0x0001, 0xa8b4, 0x9005, 0x1128, 0xa8b8, 0xa9bc, 0x9105, 0x0108,
-	0x00b9, 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x0904, 0x7972,
-	0x0804, 0x7746, 0x76fc, 0x7700, 0x0002, 0x001d, 0x0007, 0x0004,
-	0x000a, 0x001b, 0x0005, 0x0006, 0x000a, 0x001d, 0x0005, 0x0004,
-	0x0076, 0x0066, 0xafb8, 0xaebc, 0xa804, 0x2050, 0xb0c0, 0xb0e2,
-	0xb0bc, 0xb0de, 0xb0b8, 0xb0d2, 0xb0b4, 0xb0ce, 0xb6da, 0xb7d6,
-	0xb0b0, 0xb0ca, 0xb0ac, 0xb0c6, 0xb0a8, 0xb0ba, 0xb0a4, 0xb0b6,
-	0xb6c2, 0xb7be, 0xb0a0, 0xb0b2, 0xb09c, 0xb0ae, 0xb098, 0xb0a2,
-	0xb094, 0xb09e, 0xb6aa, 0xb7a6, 0xb090, 0xb09a, 0xb08c, 0xb096,
-	0xb088, 0xb08a, 0xb084, 0xb086, 0xb692, 0xb78e, 0xb080, 0xb082,
-	0xb07c, 0xb07e, 0xb078, 0xb072, 0xb074, 0xb06e, 0xb67a, 0xb776,
-	0xb004, 0x9055, 0x1958, 0x006e, 0x007e, 0x0005, 0x2009, 0x1834,
-	0x210c, 0x81ff, 0x1178, 0x080c, 0x5e8c, 0x1108, 0x0005, 0x080c,
-	0x6c85, 0x0126, 0x2091, 0x8000, 0x080c, 0xcb0d, 0x080c, 0x6a46,
-	0x012e, 0x0ca0, 0x080c, 0xcf11, 0x1d70, 0x2001, 0x0028, 0x900e,
-	0x0c70, 0x2009, 0x1834, 0x210c, 0x81ff, 0x1188, 0xa888, 0x9005,
-	0x0188, 0xa883, 0x0000, 0x080c, 0x5f1c, 0x1108, 0x0005, 0xa87a,
-	0x0126, 0x2091, 0x8000, 0x080c, 0x6a46, 0x012e, 0x0cb8, 0x2001,
-	0x0028, 0x0ca8, 0x2001, 0x0000, 0x0c90, 0x2009, 0x1834, 0x210c,
-	0x81ff, 0x11d8, 0xa888, 0x9005, 0x01e0, 0xa883, 0x0000, 0xa87c,
-	0xd0f4, 0x0120, 0x080c, 0x5fee, 0x1138, 0x0005, 0x9006, 0xa87a,
-	0x080c, 0x5f69, 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0xa87a,
-	0xa982, 0x080c, 0x6a46, 0x012e, 0x0cb0, 0x2001, 0x0028, 0x900e,
-	0x0c98, 0x2001, 0x0000, 0x0c80, 0x7018, 0xa802, 0x2908, 0x2048,
-	0xa906, 0x711a, 0x7010, 0x8001, 0x7012, 0x0118, 0x7007, 0x0003,
-	0x0030, 0x7014, 0x2048, 0x7007, 0x0001, 0x7048, 0x080f, 0x0005,
-	0x00b6, 0x7007, 0x0001, 0xa974, 0xa878, 0x9084, 0x00ff, 0x9096,
-	0x0004, 0x0540, 0x20a9, 0x0001, 0x9096, 0x0001, 0x0190, 0x900e,
-	0x20a9, 0x0800, 0x9096, 0x0002, 0x0160, 0x9005, 0x11d8, 0xa974,
-	0x080c, 0x63cd, 0x11b8, 0x0066, 0xae80, 0x080c, 0x64dd, 0x006e,
-	0x0088, 0x0046, 0x2011, 0x180c, 0x2224, 0xc484, 0x2412, 0x004e,
-	0x00c6, 0x080c, 0x63cd, 0x1110, 0x080c, 0x65dd, 0x8108, 0x1f04,
-	0x77e1, 0x00ce, 0xa87c, 0xd084, 0x1120, 0x080c, 0x1032, 0x00be,
-	0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x6a46, 0x012e, 0x00be,
-	0x0005, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x6733,
-	0x0580, 0x2061, 0x1a6e, 0x6100, 0xd184, 0x0178, 0xa888, 0x9084,
-	0x00ff, 0x1550, 0x6000, 0xd084, 0x0520, 0x6004, 0x9005, 0x1538,
-	0x6003, 0x0000, 0x600b, 0x0000, 0x00c8, 0x2011, 0x0001, 0xa890,
-	0x9005, 0x1110, 0x2001, 0x001e, 0x8000, 0x6016, 0xa888, 0x9084,
-	0x00ff, 0x0178, 0x6006, 0xa888, 0x8007, 0x9084, 0x00ff, 0x0148,
-	0x600a, 0xa888, 0x8000, 0x1108, 0xc28d, 0x6202, 0x012e, 0x0804,
-	0x7a3b, 0x012e, 0x0804, 0x7a35, 0x012e, 0x0804, 0x7a2f, 0x012e,
-	0x0804, 0x7a32, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c,
-	0x6733, 0x05e0, 0x2061, 0x1a6e, 0x6000, 0xd084, 0x05b8, 0x6204,
-	0x6308, 0xd08c, 0x1530, 0xac78, 0x9484, 0x0003, 0x0170, 0xa988,
-	0x918c, 0x00ff, 0x8001, 0x1120, 0x2100, 0x9210, 0x0620, 0x0028,
-	0x8001, 0x1508, 0x2100, 0x9212, 0x02f0, 0x9484, 0x000c, 0x0188,
-	0xa988, 0x810f, 0x918c, 0x00ff, 0x9082, 0x0004, 0x1120, 0x2100,
-	0x9318, 0x0288, 0x0030, 0x9082, 0x0004, 0x1168, 0x2100, 0x931a,
-	0x0250, 0xa890, 0x9005, 0x0110, 0x8000, 0x6016, 0x6206, 0x630a,
-	0x012e, 0x0804, 0x7a3b, 0x012e, 0x0804, 0x7a38, 0x012e, 0x0804,
-	0x7a35, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x2061, 0x1a6e,
-	0x6300, 0xd38c, 0x1120, 0x6308, 0x8318, 0x0220, 0x630a, 0x012e,
-	0x0804, 0x7a49, 0x012e, 0x0804, 0x7a38, 0x00b6, 0x0126, 0x00c6,
-	0x2091, 0x8000, 0x7007, 0x0001, 0xa87c, 0xd0ac, 0x0148, 0x00c6,
-	0x2061, 0x1a6e, 0x6000, 0x9084, 0xfcff, 0x6002, 0x00ce, 0x0440,
-	0xa888, 0x9005, 0x05d8, 0xa88c, 0x9065, 0x0598, 0x2001, 0x1834,
-	0x2004, 0x9005, 0x0118, 0x080c, 0xab9c, 0x0068, 0x6017, 0xf400,
-	0x605b, 0x0000, 0xa97c, 0xd1a4, 0x0110, 0xa980, 0x615a, 0x2009,
-	0x0041, 0x080c, 0xabe6, 0xa988, 0x918c, 0xff00, 0x9186, 0x2000,
-	0x1138, 0x0026, 0x900e, 0x2011, 0xfdff, 0x080c, 0x846c, 0x002e,
-	0xa87c, 0xd0c4, 0x0148, 0x2061, 0x1a6e, 0x6000, 0xd08c, 0x1120,
-	0x6008, 0x8000, 0x0208, 0x600a, 0x00ce, 0x012e, 0x00be, 0x0804,
-	0x7a3b, 0x00ce, 0x012e, 0x00be, 0x0804, 0x7a35, 0xa984, 0x9186,
-	0x002e, 0x0d30, 0x9186, 0x002d, 0x0d18, 0x9186, 0x0045, 0x0510,
-	0x9186, 0x002a, 0x1130, 0x2001, 0x180c, 0x200c, 0xc194, 0x2102,
-	0x08b8, 0x9186, 0x0020, 0x0158, 0x9186, 0x0029, 0x1d10, 0xa974,
-	0x080c, 0x63cd, 0x1968, 0xb800, 0xc0e4, 0xb802, 0x0848, 0xa88c,
-	0x9065, 0x09b8, 0x6007, 0x0024, 0x2001, 0x1984, 0x2004, 0x601a,
-	0x0804, 0x78d0, 0xa88c, 0x9065, 0x0960, 0x00e6, 0xa890, 0x9075,
-	0x2001, 0x1834, 0x2004, 0x9005, 0x0150, 0x080c, 0xab9c, 0x8eff,
-	0x0118, 0x2e60, 0x080c, 0xab9c, 0x00ee, 0x0804, 0x78d0, 0x6024,
-	0xc0dc, 0xc0d5, 0x6026, 0x2e60, 0x6007, 0x003a, 0xa8a0, 0x9005,
-	0x0130, 0x6007, 0x003b, 0xa8a4, 0x602e, 0xa8a8, 0x6016, 0x6003,
-	0x0001, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x00ee, 0x0804, 0x78d0,
-	0x2061, 0x1a6e, 0x6000, 0xd084, 0x0190, 0xd08c, 0x1904, 0x7a49,
-	0x0126, 0x2091, 0x8000, 0x6204, 0x8210, 0x0220, 0x6206, 0x012e,
-	0x0804, 0x7a49, 0x012e, 0xa883, 0x0016, 0x0804, 0x7a42, 0xa883,
-	0x0007, 0x0804, 0x7a42, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0130,
-	0x8001, 0x1138, 0x7007, 0x0001, 0x0069, 0x0005, 0x080c, 0x75cb,
-	0x0040, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b,
-	0x7972, 0x0005, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x903e,
-	0x2061, 0x1800, 0x61d0, 0x81ff, 0x1904, 0x79f4, 0x6130, 0xd194,
-	0x1904, 0x7a1e, 0xa878, 0x2070, 0x9e82, 0x1cd0, 0x0a04, 0x79e8,
-	0x6068, 0x9e02, 0x1a04, 0x79e8, 0x7120, 0x9186, 0x0006, 0x1904,
-	0x79da, 0x7010, 0x905d, 0x0904, 0x79f4, 0xb800, 0xd0e4, 0x1904,
-	0x7a18, 0x2061, 0x1a6e, 0x6100, 0x9184, 0x0301, 0x9086, 0x0001,
-	0x15a0, 0x7024, 0xd0dc, 0x1904, 0x7a21, 0xa883, 0x0000, 0xa803,
-	0x0000, 0x2908, 0x7014, 0x9005, 0x1198, 0x7116, 0xa87c, 0xd0f4,
-	0x1904, 0x7a24, 0x080c, 0x54b7, 0xd09c, 0x1118, 0xa87c, 0xc0cc,
-	0xa87e, 0x2e60, 0x080c, 0x838c, 0x012e, 0x00ee, 0x00be, 0x0005,
-	0x2048, 0xa800, 0x9005, 0x1de0, 0xa902, 0x2148, 0xa87c, 0xd0f4,
-	0x1904, 0x7a24, 0x012e, 0x00ee, 0x00be, 0x0005, 0x012e, 0x00ee,
-	0xa883, 0x0006, 0x00be, 0x0804, 0x7a42, 0xd184, 0x0db8, 0xd1c4,
-	0x1190, 0x00a0, 0xa974, 0x080c, 0x63cd, 0x15d0, 0xb800, 0xd0e4,
-	0x15b8, 0x7120, 0x9186, 0x0007, 0x1118, 0xa883, 0x0002, 0x0490,
-	0xa883, 0x0008, 0x0478, 0xa883, 0x000e, 0x0460, 0xa883, 0x0017,
-	0x0448, 0xa883, 0x0035, 0x0430, 0x080c, 0x54bb, 0xd0fc, 0x01e8,
-	0xa878, 0x2070, 0x9e82, 0x1cd0, 0x02c0, 0x6068, 0x9e02, 0x12a8,
-	0x7120, 0x9186, 0x0006, 0x1188, 0x7010, 0x905d, 0x0170, 0xb800,
-	0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000, 0x9086, 0x0007, 0x1904,
-	0x797e, 0x7003, 0x0002, 0x0804, 0x797e, 0xa883, 0x0028, 0x0010,
-	0xa883, 0x0029, 0x012e, 0x00ee, 0x00be, 0x0420, 0xa883, 0x002a,
-	0x0cc8, 0xa883, 0x0045, 0x0cb0, 0x2e60, 0x2019, 0x0002, 0x601b,
-	0x0014, 0x080c, 0xde08, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2009,
-	0x003e, 0x0058, 0x2009, 0x0004, 0x0040, 0x2009, 0x0006, 0x0028,
-	0x2009, 0x0016, 0x0010, 0x2009, 0x0001, 0xa884, 0x9084, 0xff00,
-	0x9105, 0xa886, 0x0126, 0x2091, 0x8000, 0x080c, 0x6a46, 0x012e,
-	0x0005, 0x080c, 0x1032, 0x0005, 0x00d6, 0x080c, 0x8383, 0x00de,
-	0x0005, 0x00d6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x0040,
-	0x702c, 0xd084, 0x01d8, 0x908c, 0x0780, 0x190c, 0x7b33, 0xd09c,
-	0x11a8, 0x2071, 0x1800, 0x70c0, 0x90ea, 0x0020, 0x0278, 0x8001,
-	0x70c2, 0x702c, 0x2048, 0xa800, 0x702e, 0x9006, 0xa802, 0xa806,
-	0x2071, 0x0040, 0x2900, 0x7022, 0x702c, 0x0c28, 0x012e, 0x00ee,
-	0x00de, 0x0005, 0x0006, 0x9084, 0x0780, 0x190c, 0x7b33, 0x000e,
-	0x0005, 0xa898, 0x9084, 0x0003, 0x05a8, 0x080c, 0xab15, 0x05d8,
-	0x2900, 0x6016, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0035, 0x1138,
-	0x6008, 0xc0fd, 0x600a, 0x2001, 0x196b, 0x2004, 0x0098, 0xa8a0,
-	0x9084, 0x00ff, 0xa99c, 0x918c, 0xff00, 0x9105, 0xa99c, 0x918c,
-	0x00ff, 0x080c, 0x26f0, 0x1540, 0x00b6, 0x080c, 0x63cd, 0x2b00,
-	0x00be, 0x1510, 0x6012, 0x6023, 0x0001, 0x2009, 0x0040, 0xa864,
-	0x9084, 0x00ff, 0x9086, 0x0035, 0x0110, 0x2009, 0x0041, 0x080c,
-	0xabe6, 0x0005, 0xa87b, 0x0101, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x6a46, 0x012e, 0x0005, 0xa87b, 0x002c, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x6a46, 0x012e, 0x0005, 0xa87b, 0x0028, 0x0126, 0x2091,
-	0x8000, 0x080c, 0x6a46, 0x012e, 0x080c, 0xab6b, 0x0005, 0x00d6,
-	0x00c6, 0x0036, 0x0026, 0x0016, 0x00b6, 0x7007, 0x0001, 0xaa74,
-	0x9282, 0x0004, 0x1a04, 0x7b24, 0xa97c, 0x9188, 0x1000, 0x2104,
-	0x905d, 0xb804, 0xd284, 0x0140, 0x05e8, 0x8007, 0x9084, 0x00ff,
-	0x9084, 0x0006, 0x1108, 0x04b0, 0x2b10, 0x080c, 0xab15, 0x1118,
-	0x080c, 0xabb9, 0x05a8, 0x6212, 0xa874, 0x0002, 0x7b02, 0x7b07,
-	0x7b0a, 0x7b10, 0x2019, 0x0002, 0x080c, 0xe1f4, 0x0060, 0x080c,
-	0xe190, 0x0048, 0x2019, 0x0002, 0xa980, 0x080c, 0xe1ab, 0x0018,
-	0xa980, 0x080c, 0xe190, 0x080c, 0xab6b, 0xa887, 0x0000, 0x0126,
-	0x2091, 0x8000, 0x080c, 0x6a46, 0x012e, 0x00be, 0x001e, 0x002e,
-	0x003e, 0x00ce, 0x00de, 0x0005, 0xa887, 0x0006, 0x0c80, 0xa887,
-	0x0002, 0x0c68, 0xa887, 0x0005, 0x0c50, 0xa887, 0x0004, 0x0c38,
-	0xa887, 0x0007, 0x0c20, 0x2091, 0x8000, 0x0e04, 0x7b35, 0x0006,
-	0x0016, 0x2001, 0x8003, 0x0006, 0x0804, 0x0dde, 0x0005, 0x00f6,
+	0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800,
+	0x6020, 0x9084, 0x00c0, 0x01c8, 0x2011, 0x0003, 0x080c, 0xa639,
+	0x2011, 0x0002, 0x080c, 0xa643, 0x080c, 0xa526, 0x901e, 0x080c,
+	0xa59c, 0x2069, 0x0140, 0x2001, 0x00a0, 0x080c, 0x2cef, 0x080c,
+	0x7698, 0x080c, 0x601b, 0x0804, 0x7618, 0x2001, 0x180c, 0x200c,
+	0xd1b4, 0x1160, 0xc1b5, 0x2102, 0x080c, 0x722e, 0x2069, 0x0140,
+	0x2001, 0x0080, 0x080c, 0x2cef, 0x60e3, 0x0000, 0x2069, 0x0200,
+	0x6804, 0x9005, 0x1118, 0x6808, 0x9005, 0x0180, 0x6028, 0x9084,
+	0xfdff, 0x602a, 0x6027, 0x0200, 0x2069, 0x198f, 0x7000, 0x206a,
+	0x709b, 0x0027, 0x7003, 0x0001, 0x0804, 0x7618, 0x6027, 0x1e00,
+	0x2009, 0x1e00, 0x080c, 0x2c38, 0x6024, 0x910c, 0x01c8, 0x9084,
+	0x1c00, 0x11b0, 0x1d04, 0x75d6, 0x0006, 0x0016, 0x00c6, 0x00d6,
+	0x00e6, 0x080c, 0x842a, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e,
+	0x00e6, 0x2071, 0x19fa, 0x7018, 0x00ee, 0x9005, 0x19f8, 0x0500,
+	0x0026, 0x2011, 0x7246, 0x080c, 0x84ca, 0x2011, 0x7239, 0x080c,
+	0x85a4, 0x002e, 0x2069, 0x0140, 0x60e3, 0x0000, 0x70b4, 0x9005,
+	0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, 0x196d, 0x2004,
+	0x080c, 0x28b2, 0x60e2, 0x2001, 0x180c, 0x200c, 0xc1b4, 0x2102,
+	0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005,
+	0x0156, 0x0016, 0x0026, 0x0036, 0x0046, 0x00c6, 0x00e6, 0x2061,
+	0x0100, 0x2071, 0x1800, 0x080c, 0xd20f, 0x1904, 0x7686, 0x7130,
+	0xd184, 0x1170, 0x080c, 0x3312, 0x0138, 0xc18d, 0x7132, 0x2011,
+	0x1848, 0x2214, 0xd2ac, 0x1120, 0x7030, 0xd08c, 0x0904, 0x7686,
+	0x2011, 0x1848, 0x220c, 0xd1a4, 0x0538, 0x0016, 0x2019, 0x000e,
+	0x080c, 0xe501, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x9186,
+	0x007e, 0x01a0, 0x9186, 0x0080, 0x0188, 0x080c, 0x6600, 0x1170,
+	0x2120, 0x9006, 0x0016, 0x2009, 0x000e, 0x080c, 0xe58d, 0x2009,
+	0x0001, 0x2011, 0x0100, 0x080c, 0x86b4, 0x001e, 0x8108, 0x1f04,
+	0x764f, 0x00be, 0x015e, 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009,
+	0x0002, 0x2019, 0x0004, 0x080c, 0x3187, 0x001e, 0x0078, 0x0156,
+	0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x6600, 0x1110, 0x080c,
+	0x6035, 0x8108, 0x1f04, 0x767c, 0x00be, 0x015e, 0x080c, 0x1ad3,
+	0x080c, 0xadb8, 0x60e3, 0x0000, 0x080c, 0x601b, 0x080c, 0x72e2,
+	0x00ee, 0x00ce, 0x004e, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005,
+	0x2001, 0x197d, 0x2003, 0x0001, 0x0005, 0x2001, 0x197d, 0x2003,
+	0x0000, 0x0005, 0x2001, 0x197c, 0x2003, 0xaaaa, 0x0005, 0x2001,
+	0x197c, 0x2003, 0x0000, 0x0005, 0x2071, 0x18fa, 0x7003, 0x0000,
+	0x7007, 0x0000, 0x080c, 0x1018, 0x090c, 0x0dd5, 0xa8ab, 0xdcb0,
+	0x2900, 0x704e, 0x080c, 0x1018, 0x090c, 0x0dd5, 0xa8ab, 0xdcb0,
+	0x2900, 0x7052, 0xa867, 0x0000, 0xa86b, 0x0001, 0xa89f, 0x0000,
+	0x0005, 0x00e6, 0x2071, 0x0040, 0x6848, 0x9005, 0x1118, 0x9085,
+	0x0001, 0x04b0, 0x6840, 0x9005, 0x0150, 0x04a1, 0x6a50, 0x9200,
+	0x7002, 0x6854, 0x9101, 0x7006, 0x9006, 0x7012, 0x7016, 0x6850,
+	0x7002, 0x6854, 0x7006, 0x6858, 0x700a, 0x685c, 0x700e, 0x6840,
+	0x9005, 0x1110, 0x7012, 0x7016, 0x6848, 0x701a, 0x701c, 0x9085,
+	0x0040, 0x701e, 0x2001, 0x0019, 0x7036, 0x702b, 0x0001, 0x2001,
+	0x0004, 0x200c, 0x918c, 0xfff7, 0x918d, 0x8000, 0x2102, 0x00d6,
+	0x2069, 0x18fa, 0x6807, 0x0001, 0x00de, 0x080c, 0x7c84, 0x9006,
+	0x00ee, 0x0005, 0x900e, 0x0156, 0x20a9, 0x0006, 0x8003, 0x2011,
+	0x0100, 0x2214, 0x9296, 0x0008, 0x1110, 0x818d, 0x0010, 0x81f5,
+	0x3e08, 0x1f04, 0x770e, 0x015e, 0x0005, 0x2079, 0x0040, 0x2071,
+	0x18fa, 0x7004, 0x0002, 0x772d, 0x772e, 0x7765, 0x77c0, 0x78d0,
+	0x772b, 0x772b, 0x78fa, 0x080c, 0x0dd5, 0x0005, 0x2079, 0x0040,
+	0x782c, 0x908c, 0x0780, 0x190c, 0x7d66, 0xd0a4, 0x01f0, 0x7824,
+	0x2048, 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a,
+	0x0040, 0x0608, 0x00b8, 0x2001, 0x1800, 0x200c, 0x9186, 0x0003,
+	0x1160, 0x7104, 0x9186, 0x0004, 0x0140, 0x9186, 0x0007, 0x0128,
+	0x9186, 0x0003, 0x19e8, 0x080c, 0x77c0, 0x782c, 0xd09c, 0x090c,
+	0x7c84, 0x0005, 0x9082, 0x005a, 0x1218, 0x2100, 0x003b, 0x0c18,
+	0x080c, 0x77f6, 0x0c90, 0x00e3, 0x08f0, 0x0005, 0x77f6, 0x77f6,
+	0x77f6, 0x77f6, 0x77f6, 0x77f6, 0x77f6, 0x77f6, 0x7818, 0x77f6,
+	0x77f6, 0x77f6, 0x77f6, 0x77f6, 0x77f6, 0x77f6, 0x77f6, 0x77f6,
+	0x77f6, 0x77f6, 0x77f6, 0x77f6, 0x77f6, 0x77f6, 0x77f6, 0x77f6,
+	0x77f6, 0x77f6, 0x7802, 0x77f6, 0x79eb, 0x77f6, 0x77f6, 0x77f6,
+	0x7818, 0x77f6, 0x7802, 0x7a2c, 0x7a6d, 0x7ab4, 0x7ac8, 0x77f6,
+	0x77f6, 0x7818, 0x7802, 0x782c, 0x77f6, 0x78a4, 0x7b73, 0x7b8e,
+	0x77f6, 0x7818, 0x77f6, 0x782c, 0x77f6, 0x77f6, 0x789a, 0x7b8e,
+	0x77f6, 0x77f6, 0x77f6, 0x77f6, 0x77f6, 0x77f6, 0x77f6, 0x77f6,
+	0x77f6, 0x7840, 0x77f6, 0x77f6, 0x77f6, 0x77f6, 0x77f6, 0x77f6,
+	0x77f6, 0x77f6, 0x77f6, 0x7d0a, 0x77f6, 0x7cb4, 0x77f6, 0x7cb4,
+	0x77f6, 0x7855, 0x77f6, 0x77f6, 0x77f6, 0x77f6, 0x77f6, 0x77f6,
+	0x2079, 0x0040, 0x7004, 0x9086, 0x0003, 0x1198, 0x782c, 0x080c,
+	0x7cad, 0xd0a4, 0x0170, 0x7824, 0x2048, 0x9006, 0xa802, 0xa806,
+	0xa864, 0x9084, 0x00ff, 0x908a, 0x001a, 0x1210, 0x002b, 0x0c50,
+	0x00e9, 0x080c, 0x7c84, 0x0005, 0x77f6, 0x7802, 0x79d7, 0x77f6,
+	0x7802, 0x77f6, 0x7802, 0x7802, 0x77f6, 0x7802, 0x79d7, 0x7802,
+	0x7802, 0x7802, 0x7802, 0x7802, 0x77f6, 0x7802, 0x79d7, 0x77f6,
+	0x77f6, 0x7802, 0x77f6, 0x77f6, 0x77f6, 0x7802, 0x00e6, 0x2071,
+	0x18fa, 0x2009, 0x0400, 0x0071, 0x00ee, 0x0005, 0x2009, 0x1000,
+	0x0049, 0x0005, 0x2009, 0x2000, 0x0029, 0x0005, 0x2009, 0x0800,
+	0x0009, 0x0005, 0x7007, 0x0001, 0xa868, 0x9084, 0x00ff, 0x9105,
+	0xa86a, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c79, 0x012e, 0x0005,
+	0xa864, 0x8007, 0x9084, 0x00ff, 0x0d08, 0x8001, 0x1120, 0x7007,
+	0x0001, 0x0804, 0x7979, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016,
+	0x701a, 0x704b, 0x7979, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff,
+	0x0968, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x7994, 0x7007,
+	0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7994, 0x0005,
+	0xa864, 0x8007, 0x9084, 0x00ff, 0x0904, 0x77fe, 0x8001, 0x1120,
+	0x7007, 0x0001, 0x0804, 0x79b0, 0x7007, 0x0003, 0x7012, 0x2900,
+	0x7016, 0x701a, 0x704b, 0x79b0, 0x0005, 0xa864, 0x8007, 0x9084,
+	0x00ff, 0x9086, 0x0001, 0x1904, 0x77fe, 0x7007, 0x0001, 0x2009,
+	0x1834, 0x210c, 0x81ff, 0x11a8, 0xa868, 0x9084, 0x00ff, 0xa86a,
+	0xa883, 0x0000, 0x080c, 0x62af, 0x1108, 0x0005, 0x0126, 0x2091,
+	0x8000, 0xa867, 0x0139, 0xa87a, 0xa982, 0x080c, 0x6c79, 0x012e,
+	0x0ca0, 0xa994, 0x9186, 0x0071, 0x0d38, 0x9186, 0x0064, 0x0d20,
+	0x9186, 0x007c, 0x0d08, 0x9186, 0x0028, 0x09f0, 0x9186, 0x0038,
+	0x09d8, 0x9186, 0x0078, 0x09c0, 0x9186, 0x005f, 0x09a8, 0x9186,
+	0x0056, 0x0990, 0xa897, 0x4005, 0xa89b, 0x0001, 0x2001, 0x0030,
+	0x900e, 0x08a0, 0xa87c, 0x9084, 0x00c0, 0x9086, 0x00c0, 0x1120,
+	0x7007, 0x0001, 0x0804, 0x7ba5, 0x2900, 0x7016, 0x701a, 0x20a9,
+	0x0004, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0030, 0x2098, 0x7050,
+	0x2040, 0xa060, 0x20e8, 0xa05c, 0x9080, 0x0023, 0x20a0, 0x4003,
+	0xa888, 0x7012, 0x9082, 0x0401, 0x1a04, 0x7806, 0xaab4, 0x928a,
+	0x0002, 0x1a04, 0x7806, 0x82ff, 0x1138, 0xa8b8, 0xa9bc, 0x9105,
+	0x0118, 0x2001, 0x7937, 0x0018, 0x9280, 0x792d, 0x2005, 0x7056,
+	0x7010, 0x9015, 0x0904, 0x7918, 0x080c, 0x1018, 0x1118, 0x7007,
+	0x0004, 0x0005, 0x2900, 0x7022, 0x7054, 0x2060, 0xe000, 0xa866,
+	0x7050, 0x2040, 0xa95c, 0xe004, 0x9100, 0xa076, 0xa860, 0xa072,
+	0xe008, 0x920a, 0x1210, 0x900e, 0x2200, 0x7112, 0xe20c, 0x8003,
+	0x800b, 0x9296, 0x0004, 0x0108, 0x9108, 0xa17a, 0x810b, 0xa17e,
+	0x080c, 0x10e9, 0xa06c, 0x908e, 0x0100, 0x0170, 0x9086, 0x0200,
+	0x0118, 0x7007, 0x0007, 0x0005, 0x7020, 0x2048, 0x080c, 0x1031,
+	0x7014, 0x2048, 0x0804, 0x7806, 0x7020, 0x2048, 0x7018, 0xa802,
+	0xa807, 0x0000, 0x2908, 0x2048, 0xa906, 0x711a, 0x0804, 0x78d0,
+	0x7014, 0x2048, 0x7007, 0x0001, 0xa8b4, 0x9005, 0x1128, 0xa8b8,
+	0xa9bc, 0x9105, 0x0108, 0x00b9, 0xa864, 0x9084, 0x00ff, 0x9086,
+	0x001e, 0x0904, 0x7ba5, 0x0804, 0x7979, 0x792f, 0x7933, 0x0002,
+	0x001d, 0x0007, 0x0004, 0x000a, 0x001b, 0x0005, 0x0006, 0x000a,
+	0x001d, 0x0005, 0x0004, 0x0076, 0x0066, 0xafb8, 0xaebc, 0xa804,
+	0x2050, 0xb0c0, 0xb0e2, 0xb0bc, 0xb0de, 0xb0b8, 0xb0d2, 0xb0b4,
+	0xb0ce, 0xb6da, 0xb7d6, 0xb0b0, 0xb0ca, 0xb0ac, 0xb0c6, 0xb0a8,
+	0xb0ba, 0xb0a4, 0xb0b6, 0xb6c2, 0xb7be, 0xb0a0, 0xb0b2, 0xb09c,
+	0xb0ae, 0xb098, 0xb0a2, 0xb094, 0xb09e, 0xb6aa, 0xb7a6, 0xb090,
+	0xb09a, 0xb08c, 0xb096, 0xb088, 0xb08a, 0xb084, 0xb086, 0xb692,
+	0xb78e, 0xb080, 0xb082, 0xb07c, 0xb07e, 0xb078, 0xb072, 0xb074,
+	0xb06e, 0xb67a, 0xb776, 0xb004, 0x9055, 0x1958, 0x006e, 0x007e,
+	0x0005, 0x2009, 0x1834, 0x210c, 0x81ff, 0x1178, 0x080c, 0x60af,
+	0x1108, 0x0005, 0x080c, 0x6eb8, 0x0126, 0x2091, 0x8000, 0x080c,
+	0xce0a, 0x080c, 0x6c79, 0x012e, 0x0ca0, 0x080c, 0xd20f, 0x1d70,
+	0x2001, 0x0028, 0x900e, 0x0c70, 0x2009, 0x1834, 0x210c, 0x81ff,
+	0x1188, 0xa888, 0x9005, 0x0188, 0xa883, 0x0000, 0x080c, 0x613f,
+	0x1108, 0x0005, 0xa87a, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c79,
+	0x012e, 0x0cb8, 0x2001, 0x0028, 0x0ca8, 0x2001, 0x0000, 0x0c90,
+	0x2009, 0x1834, 0x210c, 0x81ff, 0x11d8, 0xa888, 0x9005, 0x01e0,
+	0xa883, 0x0000, 0xa87c, 0xd0f4, 0x0120, 0x080c, 0x6211, 0x1138,
+	0x0005, 0x9006, 0xa87a, 0x080c, 0x618c, 0x1108, 0x0005, 0x0126,
+	0x2091, 0x8000, 0xa87a, 0xa982, 0x080c, 0x6c79, 0x012e, 0x0cb0,
+	0x2001, 0x0028, 0x900e, 0x0c98, 0x2001, 0x0000, 0x0c80, 0x7018,
+	0xa802, 0x2908, 0x2048, 0xa906, 0x711a, 0x7010, 0x8001, 0x7012,
+	0x0118, 0x7007, 0x0003, 0x0030, 0x7014, 0x2048, 0x7007, 0x0001,
+	0x7048, 0x080f, 0x0005, 0x00b6, 0x7007, 0x0001, 0xa974, 0xa878,
+	0x9084, 0x00ff, 0x9096, 0x0004, 0x0540, 0x20a9, 0x0001, 0x9096,
+	0x0001, 0x0190, 0x900e, 0x20a9, 0x0800, 0x9096, 0x0002, 0x0160,
+	0x9005, 0x11d8, 0xa974, 0x080c, 0x6600, 0x11b8, 0x0066, 0xae80,
+	0x080c, 0x6710, 0x006e, 0x0088, 0x0046, 0x2011, 0x180c, 0x2224,
+	0xc484, 0x2412, 0x004e, 0x00c6, 0x080c, 0x6600, 0x1110, 0x080c,
+	0x6810, 0x8108, 0x1f04, 0x7a14, 0x00ce, 0xa87c, 0xd084, 0x1120,
+	0x080c, 0x1031, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c,
+	0x6c79, 0x012e, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x7007,
+	0x0001, 0x080c, 0x6966, 0x0580, 0x2061, 0x1a71, 0x6100, 0xd184,
+	0x0178, 0xa888, 0x9084, 0x00ff, 0x1550, 0x6000, 0xd084, 0x0520,
+	0x6004, 0x9005, 0x1538, 0x6003, 0x0000, 0x600b, 0x0000, 0x00c8,
+	0x2011, 0x0001, 0xa890, 0x9005, 0x1110, 0x2001, 0x001e, 0x8000,
+	0x6016, 0xa888, 0x9084, 0x00ff, 0x0178, 0x6006, 0xa888, 0x8007,
+	0x9084, 0x00ff, 0x0148, 0x600a, 0xa888, 0x8000, 0x1108, 0xc28d,
+	0x6202, 0x012e, 0x0804, 0x7c6e, 0x012e, 0x0804, 0x7c68, 0x012e,
+	0x0804, 0x7c62, 0x012e, 0x0804, 0x7c65, 0x0126, 0x2091, 0x8000,
+	0x7007, 0x0001, 0x080c, 0x6966, 0x05e0, 0x2061, 0x1a71, 0x6000,
+	0xd084, 0x05b8, 0x6204, 0x6308, 0xd08c, 0x1530, 0xac78, 0x9484,
+	0x0003, 0x0170, 0xa988, 0x918c, 0x00ff, 0x8001, 0x1120, 0x2100,
+	0x9210, 0x0620, 0x0028, 0x8001, 0x1508, 0x2100, 0x9212, 0x02f0,
+	0x9484, 0x000c, 0x0188, 0xa988, 0x810f, 0x918c, 0x00ff, 0x9082,
+	0x0004, 0x1120, 0x2100, 0x9318, 0x0288, 0x0030, 0x9082, 0x0004,
+	0x1168, 0x2100, 0x931a, 0x0250, 0xa890, 0x9005, 0x0110, 0x8000,
+	0x6016, 0x6206, 0x630a, 0x012e, 0x0804, 0x7c6e, 0x012e, 0x0804,
+	0x7c6b, 0x012e, 0x0804, 0x7c68, 0x0126, 0x2091, 0x8000, 0x7007,
+	0x0001, 0x2061, 0x1a71, 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318,
+	0x0220, 0x630a, 0x012e, 0x0804, 0x7c7c, 0x012e, 0x0804, 0x7c6b,
+	0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x7007, 0x0001, 0xa87c,
+	0xd0ac, 0x0148, 0x00c6, 0x2061, 0x1a71, 0x6000, 0x9084, 0xfcff,
+	0x6002, 0x00ce, 0x0440, 0xa888, 0x9005, 0x05d8, 0xa88c, 0x9065,
+	0x0598, 0x2001, 0x1834, 0x2004, 0x9005, 0x0118, 0x080c, 0xae78,
+	0x0068, 0x6017, 0xf400, 0x605b, 0x0000, 0xa97c, 0xd1a4, 0x0110,
+	0xa980, 0x615a, 0x2009, 0x0041, 0x080c, 0xaec2, 0xa988, 0x918c,
+	0xff00, 0x9186, 0x2000, 0x1138, 0x0026, 0x900e, 0x2011, 0xfdff,
+	0x080c, 0x86b4, 0x002e, 0xa87c, 0xd0c4, 0x0148, 0x2061, 0x1a71,
+	0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce,
+	0x012e, 0x00be, 0x0804, 0x7c6e, 0x00ce, 0x012e, 0x00be, 0x0804,
+	0x7c68, 0xa984, 0x9186, 0x002e, 0x0d30, 0x9186, 0x002d, 0x0d18,
+	0x9186, 0x0045, 0x0510, 0x9186, 0x002a, 0x1130, 0x2001, 0x180c,
+	0x200c, 0xc194, 0x2102, 0x08b8, 0x9186, 0x0020, 0x0158, 0x9186,
+	0x0029, 0x1d10, 0xa974, 0x080c, 0x6600, 0x1968, 0xb800, 0xc0e4,
+	0xb802, 0x0848, 0xa88c, 0x9065, 0x09b8, 0x6007, 0x0024, 0x2001,
+	0x1986, 0x2004, 0x601a, 0x0804, 0x7b03, 0xa88c, 0x9065, 0x0960,
+	0x00e6, 0xa890, 0x9075, 0x2001, 0x1834, 0x2004, 0x9005, 0x0150,
+	0x080c, 0xae78, 0x8eff, 0x0118, 0x2e60, 0x080c, 0xae78, 0x00ee,
+	0x0804, 0x7b03, 0x6024, 0xc0dc, 0xc0d5, 0x6026, 0x2e60, 0x6007,
+	0x003a, 0xa8a0, 0x9005, 0x0130, 0x6007, 0x003b, 0xa8a4, 0x602e,
+	0xa8a8, 0x6016, 0x6003, 0x0001, 0x080c, 0x90c7, 0x080c, 0x9664,
+	0x00ee, 0x0804, 0x7b03, 0x2061, 0x1a71, 0x6000, 0xd084, 0x0190,
+	0xd08c, 0x1904, 0x7c7c, 0x0126, 0x2091, 0x8000, 0x6204, 0x8210,
+	0x0220, 0x6206, 0x012e, 0x0804, 0x7c7c, 0x012e, 0xa883, 0x0016,
+	0x0804, 0x7c75, 0xa883, 0x0007, 0x0804, 0x7c75, 0xa864, 0x8007,
+	0x9084, 0x00ff, 0x0130, 0x8001, 0x1138, 0x7007, 0x0001, 0x0069,
+	0x0005, 0x080c, 0x77fe, 0x0040, 0x7007, 0x0003, 0x7012, 0x2900,
+	0x7016, 0x701a, 0x704b, 0x7ba5, 0x0005, 0x00b6, 0x00e6, 0x0126,
+	0x2091, 0x8000, 0x903e, 0x2061, 0x1800, 0x61d0, 0x81ff, 0x1904,
+	0x7c27, 0x6130, 0xd194, 0x1904, 0x7c51, 0xa878, 0x2070, 0x9e82,
+	0x1cd0, 0x0a04, 0x7c1b, 0x6068, 0x9e02, 0x1a04, 0x7c1b, 0x7120,
+	0x9186, 0x0006, 0x1904, 0x7c0d, 0x7010, 0x905d, 0x0904, 0x7c27,
+	0xb800, 0xd0e4, 0x1904, 0x7c4b, 0x2061, 0x1a71, 0x6100, 0x9184,
+	0x0301, 0x9086, 0x0001, 0x15a0, 0x7024, 0xd0dc, 0x1904, 0x7c54,
+	0xa883, 0x0000, 0xa803, 0x0000, 0x2908, 0x7014, 0x9005, 0x1198,
+	0x7116, 0xa87c, 0xd0f4, 0x1904, 0x7c57, 0x080c, 0x56d0, 0xd09c,
+	0x1118, 0xa87c, 0xc0cc, 0xa87e, 0x2e60, 0x080c, 0x85d4, 0x012e,
+	0x00ee, 0x00be, 0x0005, 0x2048, 0xa800, 0x9005, 0x1de0, 0xa902,
+	0x2148, 0xa87c, 0xd0f4, 0x1904, 0x7c57, 0x012e, 0x00ee, 0x00be,
+	0x0005, 0x012e, 0x00ee, 0xa883, 0x0006, 0x00be, 0x0804, 0x7c75,
+	0xd184, 0x0db8, 0xd1c4, 0x1190, 0x00a0, 0xa974, 0x080c, 0x6600,
+	0x15d0, 0xb800, 0xd0e4, 0x15b8, 0x7120, 0x9186, 0x0007, 0x1118,
+	0xa883, 0x0002, 0x0490, 0xa883, 0x0008, 0x0478, 0xa883, 0x000e,
+	0x0460, 0xa883, 0x0017, 0x0448, 0xa883, 0x0035, 0x0430, 0x080c,
+	0x56d4, 0xd0fc, 0x01e8, 0xa878, 0x2070, 0x9e82, 0x1cd0, 0x02c0,
+	0x6068, 0x9e02, 0x12a8, 0x7120, 0x9186, 0x0006, 0x1188, 0x7010,
+	0x905d, 0x0170, 0xb800, 0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000,
+	0x9086, 0x0007, 0x1904, 0x7bb1, 0x7003, 0x0002, 0x0804, 0x7bb1,
+	0xa883, 0x0028, 0x0010, 0xa883, 0x0029, 0x012e, 0x00ee, 0x00be,
+	0x0420, 0xa883, 0x002a, 0x0cc8, 0xa883, 0x0045, 0x0cb0, 0x2e60,
+	0x2019, 0x0002, 0x601b, 0x0014, 0x080c, 0xe115, 0x012e, 0x00ee,
+	0x00be, 0x0005, 0x2009, 0x003e, 0x0058, 0x2009, 0x0004, 0x0040,
+	0x2009, 0x0006, 0x0028, 0x2009, 0x0016, 0x0010, 0x2009, 0x0001,
+	0xa884, 0x9084, 0xff00, 0x9105, 0xa886, 0x0126, 0x2091, 0x8000,
+	0x080c, 0x6c79, 0x012e, 0x0005, 0x080c, 0x1031, 0x0005, 0x00d6,
+	0x080c, 0x85cb, 0x00de, 0x0005, 0x00d6, 0x00e6, 0x0126, 0x2091,
+	0x8000, 0x2071, 0x0040, 0x702c, 0xd084, 0x01d8, 0x908c, 0x0780,
+	0x190c, 0x7d66, 0xd09c, 0x11a8, 0x2071, 0x1800, 0x70c0, 0x90ea,
+	0x0020, 0x0278, 0x8001, 0x70c2, 0x702c, 0x2048, 0xa800, 0x702e,
+	0x9006, 0xa802, 0xa806, 0x2071, 0x0040, 0x2900, 0x7022, 0x702c,
+	0x0c28, 0x012e, 0x00ee, 0x00de, 0x0005, 0x0006, 0x9084, 0x0780,
+	0x190c, 0x7d66, 0x000e, 0x0005, 0xa898, 0x9084, 0x0003, 0x05a8,
+	0x080c, 0xadf1, 0x05d8, 0x2900, 0x6016, 0xa864, 0x9084, 0x00ff,
+	0x9086, 0x0035, 0x1138, 0x6008, 0xc0fd, 0x600a, 0x2001, 0x196b,
+	0x2004, 0x0098, 0xa8a0, 0x9084, 0x00ff, 0xa99c, 0x918c, 0xff00,
+	0x9105, 0xa99c, 0x918c, 0x00ff, 0x080c, 0x283e, 0x1540, 0x00b6,
+	0x080c, 0x6600, 0x2b00, 0x00be, 0x1510, 0x6012, 0x6023, 0x0001,
+	0x2009, 0x0040, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0035, 0x0110,
+	0x2009, 0x0041, 0x080c, 0xaec2, 0x0005, 0xa87b, 0x0101, 0x0126,
+	0x2091, 0x8000, 0x080c, 0x6c79, 0x012e, 0x0005, 0xa87b, 0x002c,
+	0x0126, 0x2091, 0x8000, 0x080c, 0x6c79, 0x012e, 0x0005, 0xa87b,
+	0x0028, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c79, 0x012e, 0x080c,
+	0xae47, 0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x00b6,
+	0x7007, 0x0001, 0xaa74, 0x9282, 0x0004, 0x1a04, 0x7d57, 0xa97c,
+	0x9188, 0x1000, 0x2104, 0x905d, 0xb804, 0xd284, 0x0140, 0x05e8,
+	0x8007, 0x9084, 0x00ff, 0x9084, 0x0006, 0x1108, 0x04b0, 0x2b10,
+	0x080c, 0xadf1, 0x1118, 0x080c, 0xae95, 0x05a8, 0x6212, 0xa874,
+	0x0002, 0x7d35, 0x7d3a, 0x7d3d, 0x7d43, 0x2019, 0x0002, 0x080c,
+	0xe501, 0x0060, 0x080c, 0xe49d, 0x0048, 0x2019, 0x0002, 0xa980,
+	0x080c, 0xe4b8, 0x0018, 0xa980, 0x080c, 0xe49d, 0x080c, 0xae47,
+	0xa887, 0x0000, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c79, 0x012e,
+	0x00be, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00de, 0x0005, 0xa887,
+	0x0006, 0x0c80, 0xa887, 0x0002, 0x0c68, 0xa887, 0x0005, 0x0c50,
+	0xa887, 0x0004, 0x0c38, 0xa887, 0x0007, 0x0c20, 0x2091, 0x8000,
+	0x0e04, 0x7d68, 0x0006, 0x0016, 0x2001, 0x8003, 0x0006, 0x0804,
+	0x0dde, 0x2001, 0x1834, 0x2004, 0x9005, 0x0005, 0x0005, 0x00f6,
 	0x2079, 0x0300, 0x2001, 0x0200, 0x200c, 0xc1e5, 0xc1dc, 0x2102,
-	0x2009, 0x0218, 0x210c, 0xd1ec, 0x1120, 0x080c, 0x1560, 0x00fe,
+	0x2009, 0x0218, 0x210c, 0xd1ec, 0x1120, 0x080c, 0x157d, 0x00fe,
 	0x0005, 0x2001, 0x020d, 0x2003, 0x0020, 0x781f, 0x0300, 0x00fe,
-	0x0005, 0x781c, 0xd08c, 0x0904, 0x7b9f, 0x68c0, 0x90aa, 0x0005,
-	0x0a04, 0x819d, 0x7d44, 0x7c40, 0x9584, 0x00f6, 0x1508, 0x9484,
-	0x7000, 0x0138, 0x908a, 0x2000, 0x1258, 0x9584, 0x0700, 0x8007,
-	0x04a8, 0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x0db0, 0x00b0,
-	0x9484, 0x0fff, 0x1130, 0x7000, 0x9084, 0xff00, 0x9086, 0x8100,
-	0x11c0, 0x080c, 0xe664, 0x080c, 0x8092, 0x7817, 0x0140, 0x00a8,
-	0x9584, 0x0076, 0x1118, 0x080c, 0x80f0, 0x19c8, 0xd5a4, 0x0148,
-	0x0046, 0x0056, 0x080c, 0x7c01, 0x080c, 0x21e9, 0x005e, 0x004e,
-	0x0020, 0x080c, 0xe664, 0x7817, 0x0140, 0x080c, 0x7be2, 0x2001,
-	0x19ee, 0x2004, 0x9005, 0x090c, 0x941c, 0x0005, 0x0002, 0x7bb8,
-	0x7eb4, 0x7baf, 0x7baf, 0x7baf, 0x7baf, 0x7baf, 0x7baf, 0x7817,
-	0x0140, 0x2001, 0x19ee, 0x2004, 0x9005, 0x090c, 0x941c, 0x0005,
-	0x7000, 0x908c, 0xff00, 0x9194, 0xf000, 0x810f, 0x9484, 0x0fff,
-	0x6892, 0x9286, 0x2000, 0x1150, 0x6800, 0x9086, 0x0001, 0x1118,
-	0x080c, 0x550e, 0x0070, 0x080c, 0x7c21, 0x0058, 0x9286, 0x3000,
-	0x1118, 0x080c, 0x7def, 0x0028, 0x9286, 0x8000, 0x1110, 0x080c,
-	0x7fc2, 0x7817, 0x0140, 0x2001, 0x19ee, 0x2004, 0x9005, 0x090c,
-	0x941c, 0x0005, 0x2001, 0x1810, 0x2004, 0xd08c, 0x0178, 0x2001,
-	0x1800, 0x2004, 0x9086, 0x0003, 0x1148, 0x0026, 0x0036, 0x2011,
-	0x8048, 0x2518, 0x080c, 0x48fb, 0x003e, 0x002e, 0x0005, 0x0036,
-	0x0046, 0x0056, 0x00f6, 0x2079, 0x0200, 0x2019, 0xfffe, 0x7c30,
-	0x0050, 0x0036, 0x0046, 0x0056, 0x00f6, 0x2079, 0x0200, 0x7d44,
-	0x7c40, 0x2019, 0xffff, 0x2001, 0x1810, 0x2004, 0xd08c, 0x0160,
-	0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x1130, 0x0026, 0x2011,
-	0x8048, 0x080c, 0x48fb, 0x002e, 0x00fe, 0x005e, 0x004e, 0x003e,
-	0x0005, 0x00b6, 0x00c6, 0x7010, 0x9084, 0xff00, 0x8007, 0x9096,
-	0x0001, 0x0120, 0x9096, 0x0023, 0x1904, 0x7dc0, 0x9186, 0x0023,
-	0x15c0, 0x080c, 0x8057, 0x0904, 0x7dc0, 0x6120, 0x9186, 0x0001,
-	0x0150, 0x9186, 0x0004, 0x0138, 0x9186, 0x0008, 0x0120, 0x9186,
-	0x000a, 0x1904, 0x7dc0, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200,
-	0x1130, 0x2009, 0x0015, 0x080c, 0xabe6, 0x0804, 0x7dc0, 0x908e,
-	0x0214, 0x0118, 0x908e, 0x0210, 0x1130, 0x2009, 0x0015, 0x080c,
-	0xabe6, 0x0804, 0x7dc0, 0x908e, 0x0100, 0x1904, 0x7dc0, 0x7034,
-	0x9005, 0x1904, 0x7dc0, 0x2009, 0x0016, 0x080c, 0xabe6, 0x0804,
-	0x7dc0, 0x9186, 0x0022, 0x1904, 0x7dc0, 0x7030, 0x908e, 0x0300,
-	0x1580, 0x68dc, 0xd0a4, 0x0528, 0xc0b5, 0x68de, 0x7100, 0x918c,
-	0x00ff, 0x697e, 0x7004, 0x6882, 0x00f6, 0x2079, 0x0100, 0x79e6,
-	0x78ea, 0x0006, 0x9084, 0x00ff, 0x0016, 0x2008, 0x080c, 0x2739,
-	0x7932, 0x7936, 0x001e, 0x000e, 0x00fe, 0x080c, 0x26f0, 0x695e,
-	0x703c, 0x00e6, 0x2071, 0x0140, 0x7086, 0x2071, 0x1800, 0x70b6,
-	0x00ee, 0x7034, 0x9005, 0x1904, 0x7dc0, 0x2009, 0x0017, 0x0804,
-	0x7d8d, 0x908e, 0x0400, 0x1190, 0x7034, 0x9005, 0x1904, 0x7dc0,
-	0x080c, 0x717d, 0x0120, 0x2009, 0x001d, 0x0804, 0x7d8d, 0x68dc,
-	0xc0a5, 0x68de, 0x2009, 0x0030, 0x0804, 0x7d8d, 0x908e, 0x0500,
-	0x1140, 0x7034, 0x9005, 0x1904, 0x7dc0, 0x2009, 0x0018, 0x0804,
-	0x7d8d, 0x908e, 0x2010, 0x1120, 0x2009, 0x0019, 0x0804, 0x7d8d,
-	0x908e, 0x2110, 0x1120, 0x2009, 0x001a, 0x0804, 0x7d8d, 0x908e,
-	0x5200, 0x1140, 0x7034, 0x9005, 0x1904, 0x7dc0, 0x2009, 0x001b,
-	0x0804, 0x7d8d, 0x908e, 0x5000, 0x1140, 0x7034, 0x9005, 0x1904,
-	0x7dc0, 0x2009, 0x001c, 0x0804, 0x7d8d, 0x908e, 0x1300, 0x1120,
-	0x2009, 0x0034, 0x0804, 0x7d8d, 0x908e, 0x1200, 0x1140, 0x7034,
-	0x9005, 0x1904, 0x7dc0, 0x2009, 0x0024, 0x0804, 0x7d8d, 0x908c,
-	0xff00, 0x918e, 0x2400, 0x1170, 0x2009, 0x002d, 0x2001, 0x1810,
-	0x2004, 0xd09c, 0x0904, 0x7d8d, 0x080c, 0xd5dd, 0x1904, 0x7dc0,
-	0x0804, 0x7d8b, 0x908c, 0xff00, 0x918e, 0x5300, 0x1120, 0x2009,
-	0x002a, 0x0804, 0x7d8d, 0x908e, 0x0f00, 0x1120, 0x2009, 0x0020,
-	0x0804, 0x7d8d, 0x908e, 0x5300, 0x1108, 0x0448, 0x908e, 0x6104,
-	0x1530, 0x2029, 0x0205, 0x2011, 0x026d, 0x8208, 0x2204, 0x9082,
-	0x0004, 0x8004, 0x8004, 0x20a8, 0x2011, 0x8015, 0x211c, 0x8108,
-	0x0046, 0x2124, 0x080c, 0x48fb, 0x004e, 0x8108, 0x0f04, 0x7d41,
-	0x9186, 0x0280, 0x1d88, 0x2504, 0x8000, 0x202a, 0x2009, 0x0260,
-	0x0c58, 0x202b, 0x0000, 0x2009, 0x0023, 0x0804, 0x7d8d, 0x908e,
-	0x6000, 0x1120, 0x2009, 0x003f, 0x0804, 0x7d8d, 0x908e, 0x5400,
-	0x1138, 0x080c, 0x814d, 0x1904, 0x7dc0, 0x2009, 0x0046, 0x04a8,
-	0x908e, 0x5500, 0x1148, 0x080c, 0x8175, 0x1118, 0x2009, 0x0041,
-	0x0460, 0x2009, 0x0042, 0x0448, 0x908e, 0x7800, 0x1118, 0x2009,
-	0x0045, 0x0418, 0x908e, 0x1000, 0x1118, 0x2009, 0x004e, 0x00e8,
-	0x908e, 0x6300, 0x1118, 0x2009, 0x004a, 0x00b8, 0x908c, 0xff00,
-	0x918e, 0x5600, 0x1118, 0x2009, 0x004f, 0x0078, 0x908c, 0xff00,
-	0x918e, 0x5700, 0x1118, 0x2009, 0x0050, 0x0038, 0x2009, 0x001d,
-	0x6838, 0xd0d4, 0x0110, 0x2009, 0x004c, 0x0016, 0x2011, 0x0263,
-	0x2204, 0x8211, 0x220c, 0x080c, 0x26f0, 0x1568, 0x080c, 0x636c,
-	0x1550, 0xbe12, 0xbd16, 0x001e, 0x0016, 0xb8c0, 0x9005, 0x1168,
-	0x9186, 0x0046, 0x1150, 0x687c, 0x9606, 0x1138, 0x6880, 0x9506,
-	0x9084, 0xff00, 0x1110, 0x001e, 0x0098, 0x080c, 0xab15, 0x01a8,
-	0x2b08, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x9186,
-	0x004c, 0x1110, 0x6023, 0x000a, 0x0016, 0x001e, 0x080c, 0xabe6,
-	0x00ce, 0x00be, 0x0005, 0x001e, 0x0cd8, 0x2001, 0x180e, 0x2004,
-	0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x48fb, 0x080c, 0xabb9,
-	0x0d90, 0x2b08, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e,
-	0x0016, 0x9186, 0x0017, 0x0118, 0x9186, 0x0030, 0x1128, 0x6007,
-	0x0009, 0x6017, 0x2900, 0x0020, 0x6007, 0x0051, 0x6017, 0x0000,
-	0x602f, 0x0009, 0x6003, 0x0001, 0x080c, 0x8ec7, 0x08a0, 0x080c,
-	0x318e, 0x1140, 0x7010, 0x9084, 0xff00, 0x8007, 0x908e, 0x0008,
-	0x1108, 0x0009, 0x0005, 0x00b6, 0x00c6, 0x0046, 0x7000, 0x908c,
-	0xff00, 0x810f, 0x9186, 0x0033, 0x11e8, 0x080c, 0x8057, 0x0904,
-	0x7e4c, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1140, 0x7034,
-	0x9005, 0x15d0, 0x2009, 0x0015, 0x080c, 0xabe6, 0x04a8, 0x908e,
-	0x0100, 0x1590, 0x7034, 0x9005, 0x1578, 0x2009, 0x0016, 0x080c,
-	0xabe6, 0x0450, 0x9186, 0x0032, 0x1538, 0x7030, 0x908e, 0x1400,
-	0x1518, 0x2009, 0x0038, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211,
-	0x220c, 0x080c, 0x26f0, 0x11b8, 0x080c, 0x636c, 0x11a0, 0xbe12,
-	0xbd16, 0x080c, 0xab15, 0x0178, 0x2b08, 0x6112, 0x080c, 0xcc93,
-	0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0xabe6, 0x080c,
-	0x941c, 0x0010, 0x00ce, 0x001e, 0x004e, 0x00ce, 0x00be, 0x0005,
-	0x00b6, 0x0046, 0x00e6, 0x00d6, 0x2028, 0x2130, 0x9696, 0x00ff,
-	0x11b8, 0x9592, 0xfffc, 0x02a0, 0x9596, 0xfffd, 0x1120, 0x2009,
-	0x007f, 0x0804, 0x7eae, 0x9596, 0xfffe, 0x1120, 0x2009, 0x007e,
-	0x0804, 0x7eae, 0x9596, 0xfffc, 0x1118, 0x2009, 0x0080, 0x04f0,
-	0x2011, 0x0000, 0x2019, 0x1837, 0x231c, 0xd3ac, 0x0130, 0x9026,
-	0x20a9, 0x0800, 0x2071, 0x1000, 0x0030, 0x2021, 0x0081, 0x20a9,
-	0x077f, 0x2071, 0x1081, 0x2e1c, 0x93dd, 0x0000, 0x1140, 0x82ff,
-	0x11d0, 0x9496, 0x00ff, 0x01b8, 0x2410, 0xc2fd, 0x00a0, 0xbf10,
-	0x2600, 0x9706, 0xb814, 0x1120, 0x9546, 0x1110, 0x2408, 0x00b0,
-	0x9745, 0x1148, 0x94c6, 0x007e, 0x0130, 0x94c6, 0x007f, 0x0118,
-	0x94c6, 0x0080, 0x1d20, 0x8420, 0x8e70, 0x1f04, 0x7e83, 0x82ff,
-	0x1118, 0x9085, 0x0001, 0x0018, 0xc2fc, 0x2208, 0x9006, 0x00de,
-	0x00ee, 0x004e, 0x00be, 0x0005, 0x7000, 0x908c, 0xff00, 0x810f,
-	0x9184, 0x000f, 0x0002, 0x7ecb, 0x7ecb, 0x7ecb, 0x8069, 0x7ecb,
-	0x7ed4, 0x7eff, 0x7f8d, 0x7ecb, 0x7ecb, 0x7ecb, 0x7ecb, 0x7ecb,
-	0x7ecb, 0x7ecb, 0x7ecb, 0x7817, 0x0140, 0x2001, 0x19ee, 0x2004,
-	0x9005, 0x090c, 0x941c, 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x01e8,
-	0x7120, 0x2160, 0x9c8c, 0x0007, 0x11c0, 0x9c8a, 0x1cd0, 0x02a8,
-	0x6868, 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158,
-	0xb910, 0x9106, 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124,
-	0x610a, 0x2009, 0x0046, 0x080c, 0xabe6, 0x7817, 0x0140, 0x2001,
-	0x19ee, 0x2004, 0x9005, 0x090c, 0x941c, 0x00be, 0x0005, 0x00b6,
-	0x00c6, 0x9484, 0x0fff, 0x0904, 0x7f63, 0x7110, 0xd1bc, 0x1904,
-	0x7f63, 0x7108, 0x700c, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094,
-	0xff00, 0x15b0, 0x81ff, 0x15a0, 0x9080, 0x31d0, 0x200d, 0x918c,
-	0xff00, 0x810f, 0x2001, 0x0080, 0x9106, 0x0904, 0x7f63, 0x080c,
-	0x636c, 0x1904, 0x7f63, 0xbe12, 0xbd16, 0xb800, 0xd0ec, 0x15d8,
-	0xba04, 0x9294, 0xff00, 0x9286, 0x0600, 0x11a0, 0x080c, 0xab15,
-	0x05e8, 0x2b08, 0x7028, 0x604a, 0x702c, 0x6046, 0x6112, 0x6023,
-	0x0006, 0x7120, 0x610a, 0x7130, 0x6156, 0x2009, 0x0044, 0x080c,
-	0xd837, 0x0408, 0x080c, 0x6737, 0x1138, 0xb807, 0x0606, 0x0c30,
-	0x190c, 0x7e50, 0x11c0, 0x0898, 0x080c, 0xab15, 0x2b08, 0x0198,
-	0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x9286, 0x0400, 0x1118,
-	0x6007, 0x0005, 0x0010, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c,
-	0x8ec7, 0x080c, 0x941c, 0x7817, 0x0140, 0x2001, 0x19ee, 0x2004,
-	0x9005, 0x090c, 0x941c, 0x00ce, 0x00be, 0x0005, 0x2001, 0x180e,
-	0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x48fb, 0x080c,
-	0xabb9, 0x0d48, 0x2b08, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a,
-	0x7130, 0x6156, 0x6017, 0xf300, 0x6003, 0x0001, 0x6007, 0x0041,
-	0x080c, 0x8e7f, 0x080c, 0x941c, 0x08b0, 0x00b6, 0x7110, 0xd1bc,
-	0x01e8, 0x7020, 0x2060, 0x9c84, 0x0007, 0x11c0, 0x9c82, 0x1cd0,
-	0x02a8, 0x6868, 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110,
-	0x2158, 0xb910, 0x9106, 0x1150, 0x700c, 0xb914, 0x9106, 0x1130,
-	0x7124, 0x610a, 0x2009, 0x0045, 0x080c, 0xabe6, 0x7817, 0x0140,
-	0x2001, 0x19ee, 0x2004, 0x9005, 0x090c, 0x941c, 0x00be, 0x0005,
-	0x6120, 0x9186, 0x0002, 0x0128, 0x9186, 0x0005, 0x0110, 0x9085,
-	0x0001, 0x0005, 0x080c, 0x318e, 0x1168, 0x7010, 0x9084, 0xff00,
-	0x8007, 0x9086, 0x0000, 0x1130, 0x9184, 0x000f, 0x908a, 0x0006,
-	0x1208, 0x000b, 0x0005, 0x7fd9, 0x7fda, 0x7fd9, 0x7fd9, 0x8039,
-	0x8048, 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084,
-	0x0904, 0x8037, 0x700c, 0x7108, 0x080c, 0x26f0, 0x1904, 0x8037,
-	0x080c, 0x636c, 0x1904, 0x8037, 0xbe12, 0xbd16, 0x7110, 0xd1bc,
-	0x01d8, 0x080c, 0x6737, 0x0118, 0x9086, 0x0004, 0x1588, 0x00c6,
-	0x080c, 0x8057, 0x00ce, 0x05d8, 0x080c, 0xab15, 0x2b08, 0x05b8,
-	0x6112, 0x080c, 0xcc93, 0x6023, 0x0002, 0x7120, 0x610a, 0x2009,
-	0x0088, 0x080c, 0xabe6, 0x0458, 0x080c, 0x6737, 0x0148, 0x9086,
-	0x0004, 0x0130, 0x080c, 0x673f, 0x0118, 0x9086, 0x0004, 0x1180,
-	0x080c, 0xab15, 0x2b08, 0x01d8, 0x6112, 0x080c, 0xcc93, 0x6023,
-	0x0005, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0xabe6, 0x0078,
-	0x080c, 0xab15, 0x2b08, 0x0158, 0x6112, 0x080c, 0xcc93, 0x6023,
-	0x0004, 0x7120, 0x610a, 0x2009, 0x0001, 0x080c, 0xabe6, 0x00be,
-	0x0005, 0x7110, 0xd1bc, 0x0158, 0x00d1, 0x0148, 0x080c, 0x7fb8,
-	0x1130, 0x7124, 0x610a, 0x2009, 0x0089, 0x080c, 0xabe6, 0x0005,
-	0x7110, 0xd1bc, 0x0158, 0x0059, 0x0148, 0x080c, 0x7fb8, 0x1130,
-	0x7124, 0x610a, 0x2009, 0x008a, 0x080c, 0xabe6, 0x0005, 0x7020,
-	0x2060, 0x9c84, 0x0007, 0x1158, 0x9c82, 0x1cd0, 0x0240, 0x2001,
-	0x181a, 0x2004, 0x9c02, 0x1218, 0x9085, 0x0001, 0x0005, 0x9006,
-	0x0ce8, 0x00b6, 0x7110, 0xd1bc, 0x11d8, 0x7024, 0x2060, 0x9c84,
-	0x0007, 0x11b0, 0x9c82, 0x1cd0, 0x0298, 0x6868, 0x9c02, 0x1280,
-	0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1140,
-	0x700c, 0xb914, 0x9106, 0x1120, 0x2009, 0x0051, 0x080c, 0xabe6,
-	0x7817, 0x0140, 0x2001, 0x19ee, 0x2004, 0x9005, 0x090c, 0x941c,
-	0x00be, 0x0005, 0x2031, 0x0105, 0x0069, 0x0005, 0x2031, 0x0206,
-	0x0049, 0x0005, 0x2031, 0x0207, 0x0029, 0x0005, 0x2031, 0x0213,
-	0x0009, 0x0005, 0x00c6, 0x0096, 0x00f6, 0x7000, 0x9084, 0xf000,
-	0x9086, 0xc000, 0x05d0, 0x080c, 0xab15, 0x05b8, 0x0066, 0x00c6,
-	0x0046, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x26f0,
-	0x15a0, 0x080c, 0x636c, 0x1588, 0xbe12, 0xbd16, 0x2b00, 0x004e,
-	0x00ce, 0x6012, 0x080c, 0xcc93, 0x080c, 0x1000, 0x0510, 0x2900,
-	0x605a, 0x9006, 0xa802, 0xa866, 0xac6a, 0xa85c, 0x90f8, 0x001b,
-	0x20a9, 0x000e, 0xa860, 0x20e8, 0x20e1, 0x0000, 0x2fa0, 0x2e98,
-	0x4003, 0x006e, 0x6616, 0x6007, 0x003e, 0x6023, 0x0001, 0x6003,
-	0x0001, 0x080c, 0x8ec7, 0x080c, 0x941c, 0x00fe, 0x009e, 0x00ce,
-	0x0005, 0x080c, 0xab6b, 0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8,
-	0x00c6, 0x7000, 0x908c, 0xff00, 0x9184, 0xf000, 0x810f, 0x9086,
-	0x2000, 0x1904, 0x8147, 0x9186, 0x0022, 0x15f0, 0x2001, 0x0111,
-	0x2004, 0x9005, 0x1904, 0x8149, 0x7030, 0x908e, 0x0400, 0x0904,
-	0x8149, 0x908e, 0x6000, 0x05e8, 0x908e, 0x5400, 0x05d0, 0x908e,
-	0x0300, 0x11d8, 0x2009, 0x1837, 0x210c, 0xd18c, 0x1590, 0xd1a4,
-	0x1580, 0x080c, 0x66f5, 0x0558, 0x68b0, 0x9084, 0x00ff, 0x7100,
-	0x918c, 0x00ff, 0x9106, 0x1518, 0x6880, 0x69b0, 0x918c, 0xff00,
-	0x9105, 0x7104, 0x9106, 0x11d8, 0x00e0, 0x2009, 0x0103, 0x210c,
-	0xd1b4, 0x11a8, 0x908e, 0x5200, 0x09e8, 0x908e, 0x0500, 0x09d0,
-	0x908e, 0x5000, 0x09b8, 0x0058, 0x9186, 0x0023, 0x1140, 0x080c,
-	0x8057, 0x0128, 0x6004, 0x9086, 0x0002, 0x0118, 0x0000, 0x9006,
-	0x0010, 0x9085, 0x0001, 0x00ce, 0x0005, 0x0156, 0x0046, 0x0016,
-	0x0036, 0x7038, 0x2020, 0x8427, 0x94a4, 0x0007, 0xd484, 0x0148,
-	0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x027a, 0x080c, 0xbb13,
-	0x1178, 0xd48c, 0x0148, 0x20a9, 0x0004, 0x2019, 0x1801, 0x2011,
-	0x027e, 0x080c, 0xbb13, 0x1120, 0xd494, 0x0110, 0x9085, 0x0001,
-	0x003e, 0x001e, 0x004e, 0x015e, 0x0005, 0x0156, 0x0046, 0x0016,
-	0x0036, 0x7038, 0x2020, 0x8427, 0x94a4, 0x0007, 0xd484, 0x0148,
-	0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0272, 0x080c, 0xbb13,
-	0x1178, 0xd48c, 0x0148, 0x20a9, 0x0004, 0x2019, 0x1801, 0x2011,
-	0x0276, 0x080c, 0xbb13, 0x1120, 0xd494, 0x0110, 0x9085, 0x0001,
-	0x003e, 0x001e, 0x004e, 0x015e, 0x0005, 0x00f6, 0x2079, 0x0200,
-	0x7800, 0xc0e5, 0xc0cc, 0x7802, 0x00fe, 0x0005, 0x00f6, 0x2079,
-	0x1800, 0x7834, 0xd084, 0x1130, 0x2079, 0x0200, 0x7800, 0x9085,
-	0x1200, 0x7802, 0x00fe, 0x0005, 0x00e6, 0x2071, 0x1800, 0x7034,
-	0xc084, 0x7036, 0x00ee, 0x0005, 0x2071, 0x19f8, 0x7003, 0x0003,
-	0x700f, 0x0361, 0x9006, 0x701a, 0x7072, 0x7012, 0x7017, 0x1cd0,
-	0x7007, 0x0000, 0x7026, 0x702b, 0xa012, 0x7032, 0x7037, 0xa080,
-	0x703f, 0xffff, 0x7042, 0x7047, 0x5356, 0x704a, 0x705b, 0x8323,
-	0x080c, 0x1019, 0x090c, 0x0dd5, 0x2900, 0x703a, 0xa867, 0x0003,
-	0xa86f, 0x0100, 0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x19f8, 0x1d04,
-	0x8274, 0x2091, 0x6000, 0x700c, 0x8001, 0x700e, 0x1530, 0x2001,
-	0x013c, 0x2004, 0x9005, 0x190c, 0x8368, 0x2001, 0x1869, 0x2004,
-	0xd0c4, 0x0158, 0x3a00, 0xd08c, 0x1140, 0x20d1, 0x0000, 0x20d1,
-	0x0001, 0x20d1, 0x0000, 0x080c, 0x0dd5, 0x700f, 0x0361, 0x7007,
-	0x0001, 0x0126, 0x2091, 0x8000, 0x7040, 0x900d, 0x0148, 0x8109,
-	0x7142, 0x1130, 0x7044, 0x080f, 0x0018, 0x0126, 0x2091, 0x8000,
-	0x7024, 0x900d, 0x0188, 0x7020, 0x8001, 0x7022, 0x1168, 0x7023,
-	0x0009, 0x8109, 0x7126, 0x9186, 0x03e8, 0x1110, 0x7028, 0x080f,
-	0x81ff, 0x1110, 0x7028, 0x080f, 0x7030, 0x900d, 0x0180, 0x702c,
-	0x8001, 0x702e, 0x1160, 0x702f, 0x0009, 0x8109, 0x7132, 0x0128,
-	0x9184, 0x007f, 0x090c, 0xa10e, 0x0010, 0x7034, 0x080f, 0x703c,
-	0x9005, 0x0118, 0x0310, 0x8001, 0x703e, 0x704c, 0x900d, 0x0168,
-	0x7048, 0x8001, 0x704a, 0x1148, 0x704b, 0x0009, 0x8109, 0x714e,
-	0x1120, 0x7150, 0x714e, 0x7058, 0x080f, 0x7018, 0x900d, 0x01d8,
-	0x0016, 0x7070, 0x900d, 0x0158, 0x706c, 0x8001, 0x706e, 0x1138,
-	0x706f, 0x0009, 0x8109, 0x7172, 0x1110, 0x7074, 0x080f, 0x001e,
-	0x7008, 0x8001, 0x700a, 0x1138, 0x700b, 0x0009, 0x8109, 0x711a,
-	0x1110, 0x701c, 0x080f, 0x012e, 0x7004, 0x0002, 0x829c, 0x829d,
-	0x82b9, 0x00e6, 0x2071, 0x19f8, 0x7018, 0x9005, 0x1120, 0x711a,
-	0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071,
-	0x19f8, 0x701c, 0x9206, 0x1120, 0x701a, 0x701e, 0x7072, 0x7076,
-	0x000e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x19f8, 0xb888, 0x9102,
-	0x0208, 0xb98a, 0x00ee, 0x0005, 0x0005, 0x00b6, 0x7110, 0x080c,
-	0x63cd, 0x1168, 0xb888, 0x8001, 0x0250, 0xb88a, 0x1140, 0x0126,
-	0x2091, 0x8000, 0x0016, 0x080c, 0x941c, 0x001e, 0x012e, 0x8108,
-	0x9182, 0x0800, 0x0218, 0x900e, 0x7007, 0x0002, 0x7112, 0x00be,
-	0x0005, 0x7014, 0x2060, 0x0126, 0x2091, 0x8000, 0x6040, 0x9005,
-	0x0128, 0x8001, 0x6042, 0x1110, 0x080c, 0xcb24, 0x6018, 0x9005,
-	0x0540, 0x8001, 0x601a, 0x1528, 0x6120, 0x9186, 0x0003, 0x0148,
-	0x9186, 0x0006, 0x0130, 0x9186, 0x0009, 0x11c8, 0x611c, 0xd1c4,
-	0x1100, 0x6014, 0x2048, 0xa884, 0x908a, 0x199a, 0x0280, 0x9082,
+	0x0005, 0x781c, 0xd08c, 0x0904, 0x7de8, 0x68c0, 0x90aa, 0x0005,
+	0x0a04, 0x83e2, 0x7d44, 0x7c40, 0x9584, 0x00f6, 0x1510, 0x9484,
+	0x7000, 0x0140, 0x908a, 0x2000, 0x1260, 0x9584, 0x0700, 0x8007,
+	0x0804, 0x7def, 0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x0da8,
+	0x00b0, 0x9484, 0x0fff, 0x1130, 0x7000, 0x9084, 0xff00, 0x9086,
+	0x8100, 0x11c0, 0x080c, 0xe9a0, 0x080c, 0x82d7, 0x7817, 0x0140,
+	0x00a8, 0x9584, 0x0076, 0x1118, 0x080c, 0x8335, 0x19c0, 0xd5a4,
+	0x0148, 0x0046, 0x0056, 0x080c, 0x7e4a, 0x080c, 0x2337, 0x005e,
+	0x004e, 0x0020, 0x080c, 0xe9a0, 0x7817, 0x0140, 0x080c, 0x73b0,
+	0x0168, 0x2001, 0x0111, 0x2004, 0xd08c, 0x0140, 0x6893, 0x0000,
+	0x2001, 0x0110, 0x2003, 0x0008, 0x2003, 0x0000, 0x080c, 0x7e2b,
+	0x2001, 0x19f0, 0x2004, 0x9005, 0x090c, 0x9664, 0x0005, 0x0002,
+	0x7e01, 0x80f9, 0x7df8, 0x7df8, 0x7df8, 0x7df8, 0x7df8, 0x7df8,
+	0x7817, 0x0140, 0x2001, 0x19f0, 0x2004, 0x9005, 0x090c, 0x9664,
+	0x0005, 0x7000, 0x908c, 0xff00, 0x9194, 0xf000, 0x810f, 0x9484,
+	0x0fff, 0x6892, 0x9286, 0x2000, 0x1150, 0x6800, 0x9086, 0x0001,
+	0x1118, 0x080c, 0x5731, 0x0070, 0x080c, 0x7e6a, 0x0058, 0x9286,
+	0x3000, 0x1118, 0x080c, 0x8034, 0x0028, 0x9286, 0x8000, 0x1110,
+	0x080c, 0x8207, 0x7817, 0x0140, 0x2001, 0x19f0, 0x2004, 0x9005,
+	0x090c, 0x9664, 0x0005, 0x2001, 0x1810, 0x2004, 0xd08c, 0x0178,
+	0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x1148, 0x0026, 0x0036,
+	0x2011, 0x8048, 0x2518, 0x080c, 0x4b05, 0x003e, 0x002e, 0x0005,
+	0x0036, 0x0046, 0x0056, 0x00f6, 0x2079, 0x0200, 0x2019, 0xfffe,
+	0x7c30, 0x0050, 0x0036, 0x0046, 0x0056, 0x00f6, 0x2079, 0x0200,
+	0x7d44, 0x7c40, 0x2019, 0xffff, 0x2001, 0x1810, 0x2004, 0xd08c,
+	0x0160, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x1130, 0x0026,
+	0x2011, 0x8048, 0x080c, 0x4b05, 0x002e, 0x00fe, 0x005e, 0x004e,
+	0x003e, 0x0005, 0x00b6, 0x00c6, 0x7010, 0x9084, 0xff00, 0x8007,
+	0x9096, 0x0001, 0x0120, 0x9096, 0x0023, 0x1904, 0x8005, 0x9186,
+	0x0023, 0x15c0, 0x080c, 0x829c, 0x0904, 0x8005, 0x6120, 0x9186,
+	0x0001, 0x0150, 0x9186, 0x0004, 0x0138, 0x9186, 0x0008, 0x0120,
+	0x9186, 0x000a, 0x1904, 0x8005, 0x7124, 0x610a, 0x7030, 0x908e,
+	0x0200, 0x1130, 0x2009, 0x0015, 0x080c, 0xaec2, 0x0804, 0x8005,
+	0x908e, 0x0214, 0x0118, 0x908e, 0x0210, 0x1130, 0x2009, 0x0015,
+	0x080c, 0xaec2, 0x0804, 0x8005, 0x908e, 0x0100, 0x1904, 0x8005,
+	0x7034, 0x9005, 0x1904, 0x8005, 0x2009, 0x0016, 0x080c, 0xaec2,
+	0x0804, 0x8005, 0x9186, 0x0022, 0x1904, 0x8005, 0x7030, 0x908e,
+	0x0300, 0x1580, 0x68dc, 0xd0a4, 0x0528, 0xc0b5, 0x68de, 0x7100,
+	0x918c, 0x00ff, 0x697e, 0x7004, 0x6882, 0x00f6, 0x2079, 0x0100,
+	0x79e6, 0x78ea, 0x0006, 0x9084, 0x00ff, 0x0016, 0x2008, 0x080c,
+	0x2887, 0x7932, 0x7936, 0x001e, 0x000e, 0x00fe, 0x080c, 0x283e,
+	0x695e, 0x703c, 0x00e6, 0x2071, 0x0140, 0x7086, 0x2071, 0x1800,
+	0x70b6, 0x00ee, 0x7034, 0x9005, 0x1904, 0x8005, 0x2009, 0x0017,
+	0x0804, 0x7fd2, 0x908e, 0x0400, 0x1190, 0x7034, 0x9005, 0x1904,
+	0x8005, 0x080c, 0x73b0, 0x0120, 0x2009, 0x001d, 0x0804, 0x7fd2,
+	0x68dc, 0xc0a5, 0x68de, 0x2009, 0x0030, 0x0804, 0x7fd2, 0x908e,
+	0x0500, 0x1140, 0x7034, 0x9005, 0x1904, 0x8005, 0x2009, 0x0018,
+	0x0804, 0x7fd2, 0x908e, 0x2010, 0x1120, 0x2009, 0x0019, 0x0804,
+	0x7fd2, 0x908e, 0x2110, 0x1120, 0x2009, 0x001a, 0x0804, 0x7fd2,
+	0x908e, 0x5200, 0x1140, 0x7034, 0x9005, 0x1904, 0x8005, 0x2009,
+	0x001b, 0x0804, 0x7fd2, 0x908e, 0x5000, 0x1140, 0x7034, 0x9005,
+	0x1904, 0x8005, 0x2009, 0x001c, 0x0804, 0x7fd2, 0x908e, 0x1300,
+	0x1120, 0x2009, 0x0034, 0x0804, 0x7fd2, 0x908e, 0x1200, 0x1140,
+	0x7034, 0x9005, 0x1904, 0x8005, 0x2009, 0x0024, 0x0804, 0x7fd2,
+	0x908c, 0xff00, 0x918e, 0x2400, 0x1170, 0x2009, 0x002d, 0x2001,
+	0x1810, 0x2004, 0xd09c, 0x0904, 0x7fd2, 0x080c, 0xd8ea, 0x1904,
+	0x8005, 0x0804, 0x7fd0, 0x908c, 0xff00, 0x918e, 0x5300, 0x1120,
+	0x2009, 0x002a, 0x0804, 0x7fd2, 0x908e, 0x0f00, 0x1120, 0x2009,
+	0x0020, 0x0804, 0x7fd2, 0x908e, 0x6104, 0x1530, 0x2029, 0x0205,
+	0x2011, 0x026d, 0x8208, 0x2204, 0x9082, 0x0004, 0x8004, 0x8004,
+	0x20a8, 0x2011, 0x8015, 0x211c, 0x8108, 0x0046, 0x2124, 0x080c,
+	0x4b05, 0x004e, 0x8108, 0x0f04, 0x7f86, 0x9186, 0x0280, 0x1d88,
+	0x2504, 0x8000, 0x202a, 0x2009, 0x0260, 0x0c58, 0x202b, 0x0000,
+	0x2009, 0x0023, 0x0804, 0x7fd2, 0x908e, 0x6000, 0x1120, 0x2009,
+	0x003f, 0x0804, 0x7fd2, 0x908e, 0x5400, 0x1138, 0x080c, 0x8392,
+	0x1904, 0x8005, 0x2009, 0x0046, 0x04a8, 0x908e, 0x5500, 0x1148,
+	0x080c, 0x83ba, 0x1118, 0x2009, 0x0041, 0x0460, 0x2009, 0x0042,
+	0x0448, 0x908e, 0x7800, 0x1118, 0x2009, 0x0045, 0x0418, 0x908e,
+	0x1000, 0x1118, 0x2009, 0x004e, 0x00e8, 0x908e, 0x6300, 0x1118,
+	0x2009, 0x004a, 0x00b8, 0x908c, 0xff00, 0x918e, 0x5600, 0x1118,
+	0x2009, 0x004f, 0x0078, 0x908c, 0xff00, 0x918e, 0x5700, 0x1118,
+	0x2009, 0x0050, 0x0038, 0x2009, 0x001d, 0x6838, 0xd0d4, 0x0110,
+	0x2009, 0x004c, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c,
+	0x080c, 0x283e, 0x1568, 0x080c, 0x659f, 0x1550, 0xbe12, 0xbd16,
+	0x001e, 0x0016, 0xb8c0, 0x9005, 0x1168, 0x9186, 0x0046, 0x1150,
+	0x687c, 0x9606, 0x1138, 0x6880, 0x9506, 0x9084, 0xff00, 0x1110,
+	0x001e, 0x0098, 0x080c, 0xadf1, 0x01a8, 0x2b08, 0x6112, 0x6023,
+	0x0004, 0x7120, 0x610a, 0x001e, 0x9186, 0x004c, 0x1110, 0x6023,
+	0x000a, 0x0016, 0x001e, 0x080c, 0xaec2, 0x00ce, 0x00be, 0x0005,
+	0x001e, 0x0cd8, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011,
+	0x8049, 0x080c, 0x4b05, 0x080c, 0xae95, 0x0d90, 0x2b08, 0x6112,
+	0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x0016, 0x9186, 0x0017,
+	0x0118, 0x9186, 0x0030, 0x1128, 0x6007, 0x0009, 0x6017, 0x2900,
+	0x0020, 0x6007, 0x0051, 0x6017, 0x0000, 0x602f, 0x0009, 0x6003,
+	0x0001, 0x080c, 0x910f, 0x08a0, 0x080c, 0x32dc, 0x1140, 0x7010,
+	0x9084, 0xff00, 0x8007, 0x908e, 0x0008, 0x1108, 0x0009, 0x0005,
+	0x00b6, 0x00c6, 0x0046, 0x7000, 0x908c, 0xff00, 0x810f, 0x9186,
+	0x0033, 0x11e8, 0x080c, 0x829c, 0x0904, 0x8091, 0x7124, 0x610a,
+	0x7030, 0x908e, 0x0200, 0x1140, 0x7034, 0x9005, 0x15d0, 0x2009,
+	0x0015, 0x080c, 0xaec2, 0x04a8, 0x908e, 0x0100, 0x1590, 0x7034,
+	0x9005, 0x1578, 0x2009, 0x0016, 0x080c, 0xaec2, 0x0450, 0x9186,
+	0x0032, 0x1538, 0x7030, 0x908e, 0x1400, 0x1518, 0x2009, 0x0038,
+	0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x283e,
+	0x11b8, 0x080c, 0x659f, 0x11a0, 0xbe12, 0xbd16, 0x080c, 0xadf1,
+	0x0178, 0x2b08, 0x6112, 0x080c, 0xcf90, 0x6023, 0x0004, 0x7120,
+	0x610a, 0x001e, 0x080c, 0xaec2, 0x080c, 0x9664, 0x0010, 0x00ce,
+	0x001e, 0x004e, 0x00ce, 0x00be, 0x0005, 0x00b6, 0x0046, 0x00e6,
+	0x00d6, 0x2028, 0x2130, 0x9696, 0x00ff, 0x11b8, 0x9592, 0xfffc,
+	0x02a0, 0x9596, 0xfffd, 0x1120, 0x2009, 0x007f, 0x0804, 0x80f3,
+	0x9596, 0xfffe, 0x1120, 0x2009, 0x007e, 0x0804, 0x80f3, 0x9596,
+	0xfffc, 0x1118, 0x2009, 0x0080, 0x04f0, 0x2011, 0x0000, 0x2019,
+	0x1837, 0x231c, 0xd3ac, 0x0130, 0x9026, 0x20a9, 0x0800, 0x2071,
+	0x1000, 0x0030, 0x2021, 0x0081, 0x20a9, 0x077f, 0x2071, 0x1081,
+	0x2e1c, 0x93dd, 0x0000, 0x1140, 0x82ff, 0x11d0, 0x9496, 0x00ff,
+	0x01b8, 0x2410, 0xc2fd, 0x00a0, 0xbf10, 0x2600, 0x9706, 0xb814,
+	0x1120, 0x9546, 0x1110, 0x2408, 0x00b0, 0x9745, 0x1148, 0x94c6,
+	0x007e, 0x0130, 0x94c6, 0x007f, 0x0118, 0x94c6, 0x0080, 0x1d20,
+	0x8420, 0x8e70, 0x1f04, 0x80c8, 0x82ff, 0x1118, 0x9085, 0x0001,
+	0x0018, 0xc2fc, 0x2208, 0x9006, 0x00de, 0x00ee, 0x004e, 0x00be,
+	0x0005, 0x7000, 0x908c, 0xff00, 0x810f, 0x9184, 0x000f, 0x0002,
+	0x8110, 0x8110, 0x8110, 0x82ae, 0x8110, 0x8119, 0x8144, 0x81d2,
+	0x8110, 0x8110, 0x8110, 0x8110, 0x8110, 0x8110, 0x8110, 0x8110,
+	0x7817, 0x0140, 0x2001, 0x19f0, 0x2004, 0x9005, 0x090c, 0x9664,
+	0x0005, 0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7120, 0x2160, 0x9c8c,
+	0x0007, 0x11c0, 0x9c8a, 0x1cd0, 0x02a8, 0x6868, 0x9c02, 0x1290,
+	0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1150,
+	0x700c, 0xb914, 0x9106, 0x1130, 0x7124, 0x610a, 0x2009, 0x0046,
+	0x080c, 0xaec2, 0x7817, 0x0140, 0x2001, 0x19f0, 0x2004, 0x9005,
+	0x090c, 0x9664, 0x00be, 0x0005, 0x00b6, 0x00c6, 0x9484, 0x0fff,
+	0x0904, 0x81a8, 0x7110, 0xd1bc, 0x1904, 0x81a8, 0x7108, 0x700c,
+	0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, 0xff00, 0x15b0, 0x81ff,
+	0x15a0, 0x9080, 0x331e, 0x200d, 0x918c, 0xff00, 0x810f, 0x2001,
+	0x0080, 0x9106, 0x0904, 0x81a8, 0x080c, 0x659f, 0x1904, 0x81a8,
+	0xbe12, 0xbd16, 0xb800, 0xd0ec, 0x15d8, 0xba04, 0x9294, 0xff00,
+	0x9286, 0x0600, 0x11a0, 0x080c, 0xadf1, 0x05e8, 0x2b08, 0x7028,
+	0x604a, 0x702c, 0x6046, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a,
+	0x7130, 0x6156, 0x2009, 0x0044, 0x080c, 0xdb44, 0x0408, 0x080c,
+	0x696a, 0x1138, 0xb807, 0x0606, 0x0c30, 0x190c, 0x8095, 0x11c0,
+	0x0898, 0x080c, 0xadf1, 0x2b08, 0x0198, 0x6112, 0x6023, 0x0004,
+	0x7120, 0x610a, 0x9286, 0x0400, 0x1118, 0x6007, 0x0005, 0x0010,
+	0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x910f, 0x080c, 0x9664,
+	0x7817, 0x0140, 0x2001, 0x19f0, 0x2004, 0x9005, 0x090c, 0x9664,
+	0x00ce, 0x00be, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120,
+	0x2011, 0x8049, 0x080c, 0x4b05, 0x080c, 0xae95, 0x0d48, 0x2b08,
+	0x6112, 0x6023, 0x0006, 0x7120, 0x610a, 0x7130, 0x6156, 0x6017,
+	0xf300, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x90c7, 0x080c,
+	0x9664, 0x08b0, 0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7020, 0x2060,
+	0x9c84, 0x0007, 0x11c0, 0x9c82, 0x1cd0, 0x02a8, 0x6868, 0x9c02,
+	0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106,
+	0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124, 0x610a, 0x2009,
+	0x0045, 0x080c, 0xaec2, 0x7817, 0x0140, 0x2001, 0x19f0, 0x2004,
+	0x9005, 0x090c, 0x9664, 0x00be, 0x0005, 0x6120, 0x9186, 0x0002,
+	0x0128, 0x9186, 0x0005, 0x0110, 0x9085, 0x0001, 0x0005, 0x080c,
+	0x32dc, 0x1168, 0x7010, 0x9084, 0xff00, 0x8007, 0x9086, 0x0000,
+	0x1130, 0x9184, 0x000f, 0x908a, 0x0006, 0x1208, 0x000b, 0x0005,
+	0x821e, 0x821f, 0x821e, 0x821e, 0x827e, 0x828d, 0x0005, 0x00b6,
+	0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084, 0x0904, 0x827c, 0x700c,
+	0x7108, 0x080c, 0x283e, 0x1904, 0x827c, 0x080c, 0x659f, 0x1904,
+	0x827c, 0xbe12, 0xbd16, 0x7110, 0xd1bc, 0x01d8, 0x080c, 0x696a,
+	0x0118, 0x9086, 0x0004, 0x1588, 0x00c6, 0x080c, 0x829c, 0x00ce,
+	0x05d8, 0x080c, 0xadf1, 0x2b08, 0x05b8, 0x6112, 0x080c, 0xcf90,
+	0x6023, 0x0002, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0xaec2,
+	0x0458, 0x080c, 0x696a, 0x0148, 0x9086, 0x0004, 0x0130, 0x080c,
+	0x6972, 0x0118, 0x9086, 0x0004, 0x1180, 0x080c, 0xadf1, 0x2b08,
+	0x01d8, 0x6112, 0x080c, 0xcf90, 0x6023, 0x0005, 0x7120, 0x610a,
+	0x2009, 0x0088, 0x080c, 0xaec2, 0x0078, 0x080c, 0xadf1, 0x2b08,
+	0x0158, 0x6112, 0x080c, 0xcf90, 0x6023, 0x0004, 0x7120, 0x610a,
+	0x2009, 0x0001, 0x080c, 0xaec2, 0x00be, 0x0005, 0x7110, 0xd1bc,
+	0x0158, 0x00d1, 0x0148, 0x080c, 0x81fd, 0x1130, 0x7124, 0x610a,
+	0x2009, 0x0089, 0x080c, 0xaec2, 0x0005, 0x7110, 0xd1bc, 0x0158,
+	0x0059, 0x0148, 0x080c, 0x81fd, 0x1130, 0x7124, 0x610a, 0x2009,
+	0x008a, 0x080c, 0xaec2, 0x0005, 0x7020, 0x2060, 0x9c84, 0x0007,
+	0x1158, 0x9c82, 0x1cd0, 0x0240, 0x2001, 0x181a, 0x2004, 0x9c02,
+	0x1218, 0x9085, 0x0001, 0x0005, 0x9006, 0x0ce8, 0x00b6, 0x7110,
+	0xd1bc, 0x11d8, 0x7024, 0x2060, 0x9c84, 0x0007, 0x11b0, 0x9c82,
+	0x1cd0, 0x0298, 0x6868, 0x9c02, 0x1280, 0x7008, 0x9084, 0x00ff,
+	0x6110, 0x2158, 0xb910, 0x9106, 0x1140, 0x700c, 0xb914, 0x9106,
+	0x1120, 0x2009, 0x0051, 0x080c, 0xaec2, 0x7817, 0x0140, 0x2001,
+	0x19f0, 0x2004, 0x9005, 0x090c, 0x9664, 0x00be, 0x0005, 0x2031,
+	0x0105, 0x0069, 0x0005, 0x2031, 0x0206, 0x0049, 0x0005, 0x2031,
+	0x0207, 0x0029, 0x0005, 0x2031, 0x0213, 0x0009, 0x0005, 0x00c6,
+	0x0096, 0x00f6, 0x7000, 0x9084, 0xf000, 0x9086, 0xc000, 0x05d0,
+	0x080c, 0xadf1, 0x05b8, 0x0066, 0x00c6, 0x0046, 0x2011, 0x0263,
+	0x2204, 0x8211, 0x220c, 0x080c, 0x283e, 0x15a0, 0x080c, 0x659f,
+	0x1588, 0xbe12, 0xbd16, 0x2b00, 0x004e, 0x00ce, 0x6012, 0x080c,
+	0xcf90, 0x080c, 0x0fff, 0x0510, 0x2900, 0x605a, 0x9006, 0xa802,
+	0xa866, 0xac6a, 0xa85c, 0x90f8, 0x001b, 0x20a9, 0x000e, 0xa860,
+	0x20e8, 0x20e1, 0x0000, 0x2fa0, 0x2e98, 0x4003, 0x006e, 0x6616,
+	0x6007, 0x003e, 0x6023, 0x0001, 0x6003, 0x0001, 0x080c, 0x910f,
+	0x080c, 0x9664, 0x00fe, 0x009e, 0x00ce, 0x0005, 0x080c, 0xae47,
+	0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8, 0x00c6, 0x7000, 0x908c,
+	0xff00, 0x9184, 0xf000, 0x810f, 0x9086, 0x2000, 0x1904, 0x838c,
+	0x9186, 0x0022, 0x15f0, 0x2001, 0x0111, 0x2004, 0x9005, 0x1904,
+	0x838e, 0x7030, 0x908e, 0x0400, 0x0904, 0x838e, 0x908e, 0x6000,
+	0x05e8, 0x908e, 0x5400, 0x05d0, 0x908e, 0x0300, 0x11d8, 0x2009,
+	0x1837, 0x210c, 0xd18c, 0x1590, 0xd1a4, 0x1580, 0x080c, 0x6928,
+	0x0558, 0x68b0, 0x9084, 0x00ff, 0x7100, 0x918c, 0x00ff, 0x9106,
+	0x1518, 0x6880, 0x69b0, 0x918c, 0xff00, 0x9105, 0x7104, 0x9106,
+	0x11d8, 0x00e0, 0x2009, 0x0103, 0x210c, 0xd1b4, 0x11a8, 0x908e,
+	0x5200, 0x09e8, 0x908e, 0x0500, 0x09d0, 0x908e, 0x5000, 0x09b8,
+	0x0058, 0x9186, 0x0023, 0x1140, 0x080c, 0x829c, 0x0128, 0x6004,
+	0x9086, 0x0002, 0x0118, 0x0000, 0x9006, 0x0010, 0x9085, 0x0001,
+	0x00ce, 0x0005, 0x0156, 0x0046, 0x0016, 0x0036, 0x7038, 0x2020,
+	0x8427, 0x94a4, 0x0007, 0xd484, 0x0148, 0x20a9, 0x0004, 0x2019,
+	0x1805, 0x2011, 0x027a, 0x080c, 0xbdef, 0x1178, 0xd48c, 0x0148,
+	0x20a9, 0x0004, 0x2019, 0x1801, 0x2011, 0x027e, 0x080c, 0xbdef,
+	0x1120, 0xd494, 0x0110, 0x9085, 0x0001, 0x003e, 0x001e, 0x004e,
+	0x015e, 0x0005, 0x0156, 0x0046, 0x0016, 0x0036, 0x7038, 0x2020,
+	0x8427, 0x94a4, 0x0007, 0xd484, 0x0148, 0x20a9, 0x0004, 0x2019,
+	0x1805, 0x2011, 0x0272, 0x080c, 0xbdef, 0x1178, 0xd48c, 0x0148,
+	0x20a9, 0x0004, 0x2019, 0x1801, 0x2011, 0x0276, 0x080c, 0xbdef,
+	0x1120, 0xd494, 0x0110, 0x9085, 0x0001, 0x003e, 0x001e, 0x004e,
+	0x015e, 0x0005, 0x00f6, 0x2079, 0x0200, 0x7800, 0xc0e5, 0xc0cc,
+	0x7802, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x1800, 0x7834, 0xd084,
+	0x1130, 0x2079, 0x0200, 0x7800, 0x9085, 0x1200, 0x7802, 0x00fe,
+	0x0005, 0x00e6, 0x2071, 0x1800, 0x7034, 0xc084, 0x7036, 0x00ee,
+	0x0005, 0x2071, 0x19fa, 0x7003, 0x0003, 0x700f, 0x0361, 0x9006,
+	0x701a, 0x7072, 0x7012, 0x7017, 0x1cd0, 0x7007, 0x0000, 0x7026,
+	0x702b, 0xa26f, 0x7032, 0x7037, 0xa2dd, 0x703f, 0xffff, 0x7042,
+	0x7047, 0x556f, 0x704a, 0x705b, 0x856b, 0x080c, 0x1018, 0x090c,
+	0x0dd5, 0x2900, 0x703a, 0xa867, 0x0003, 0xa86f, 0x0100, 0xa8ab,
+	0xdcb0, 0x0005, 0x2071, 0x19fa, 0x1d04, 0x84b9, 0x2091, 0x6000,
+	0x700c, 0x8001, 0x700e, 0x1530, 0x2001, 0x013c, 0x2004, 0x9005,
+	0x190c, 0x85b0, 0x2001, 0x1869, 0x2004, 0xd0c4, 0x0158, 0x3a00,
+	0xd08c, 0x1140, 0x20d1, 0x0000, 0x20d1, 0x0001, 0x20d1, 0x0000,
+	0x080c, 0x0dd5, 0x700f, 0x0361, 0x7007, 0x0001, 0x0126, 0x2091,
+	0x8000, 0x7040, 0x900d, 0x0148, 0x8109, 0x7142, 0x1130, 0x7044,
+	0x080f, 0x0018, 0x0126, 0x2091, 0x8000, 0x7024, 0x900d, 0x0188,
+	0x7020, 0x8001, 0x7022, 0x1168, 0x7023, 0x0009, 0x8109, 0x7126,
+	0x9186, 0x03e8, 0x1110, 0x7028, 0x080f, 0x81ff, 0x1110, 0x7028,
+	0x080f, 0x7030, 0x900d, 0x0180, 0x702c, 0x8001, 0x702e, 0x1160,
+	0x702f, 0x0009, 0x8109, 0x7132, 0x0128, 0x9184, 0x007f, 0x090c,
+	0xa3fe, 0x0010, 0x7034, 0x080f, 0x703c, 0x9005, 0x0118, 0x0310,
+	0x8001, 0x703e, 0x704c, 0x900d, 0x0168, 0x7048, 0x8001, 0x704a,
+	0x1148, 0x704b, 0x0009, 0x8109, 0x714e, 0x1120, 0x7150, 0x714e,
+	0x7058, 0x080f, 0x7018, 0x900d, 0x01d8, 0x0016, 0x7070, 0x900d,
+	0x0158, 0x706c, 0x8001, 0x706e, 0x1138, 0x706f, 0x0009, 0x8109,
+	0x7172, 0x1110, 0x7074, 0x080f, 0x001e, 0x7008, 0x8001, 0x700a,
+	0x1138, 0x700b, 0x0009, 0x8109, 0x711a, 0x1110, 0x701c, 0x080f,
+	0x012e, 0x7004, 0x0002, 0x84e1, 0x84e2, 0x84fe, 0x00e6, 0x2071,
+	0x19fa, 0x7018, 0x9005, 0x1120, 0x711a, 0x721e, 0x700b, 0x0009,
+	0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x19fa, 0x701c, 0x9206,
+	0x1120, 0x701a, 0x701e, 0x7072, 0x7076, 0x000e, 0x00ee, 0x0005,
+	0x00e6, 0x2071, 0x19fa, 0xb888, 0x9102, 0x0208, 0xb98a, 0x00ee,
+	0x0005, 0x0005, 0x00b6, 0x7110, 0x080c, 0x6600, 0x1168, 0xb888,
+	0x8001, 0x0250, 0xb88a, 0x1140, 0x0126, 0x2091, 0x8000, 0x0016,
+	0x080c, 0x9664, 0x001e, 0x012e, 0x8108, 0x9182, 0x0800, 0x0218,
+	0x900e, 0x7007, 0x0002, 0x7112, 0x00be, 0x0005, 0x7014, 0x2060,
+	0x0126, 0x2091, 0x8000, 0x6040, 0x9005, 0x0128, 0x8001, 0x6042,
+	0x1110, 0x080c, 0xce21, 0x6018, 0x9005, 0x0558, 0x8001, 0x601a,
+	0x1540, 0x6120, 0x9186, 0x0003, 0x0148, 0x9186, 0x0006, 0x0130,
+	0x9186, 0x0009, 0x11e0, 0x611c, 0xd1c4, 0x1100, 0x080c, 0xcb1b,
+	0x01b0, 0x6014, 0x2048, 0xa884, 0x908a, 0x199a, 0x0280, 0x9082,
 	0x1999, 0xa886, 0x908a, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003,
 	0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, 0xd0e4, 0x0110, 0x080c,
-	0xc53d, 0x012e, 0x9c88, 0x0018, 0x7116, 0x2001, 0x181a, 0x2004,
+	0xc819, 0x012e, 0x9c88, 0x0018, 0x7116, 0x2001, 0x181a, 0x2004,
 	0x9102, 0x0220, 0x7017, 0x1cd0, 0x7007, 0x0000, 0x0005, 0x00e6,
-	0x2071, 0x19f8, 0x7027, 0x07d0, 0x7023, 0x0009, 0x00ee, 0x0005,
-	0x2001, 0x1a01, 0x2003, 0x0000, 0x0005, 0x00e6, 0x2071, 0x19f8,
-	0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, 0x2011, 0x1a04, 0x2013,
-	0x0000, 0x0005, 0x00e6, 0x2071, 0x19f8, 0x711a, 0x721e, 0x700b,
+	0x2071, 0x19fa, 0x7027, 0x07d0, 0x7023, 0x0009, 0x00ee, 0x0005,
+	0x2001, 0x1a03, 0x2003, 0x0000, 0x0005, 0x00e6, 0x2071, 0x19fa,
+	0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, 0x2011, 0x1a06, 0x2013,
+	0x0000, 0x0005, 0x00e6, 0x2071, 0x19fa, 0x711a, 0x721e, 0x700b,
 	0x0009, 0x00ee, 0x0005, 0x0086, 0x0026, 0x7054, 0x8000, 0x7056,
-	0x2001, 0x1a06, 0x2044, 0xa06c, 0x9086, 0x0000, 0x0150, 0x7068,
+	0x2001, 0x1a08, 0x2044, 0xa06c, 0x9086, 0x0000, 0x0150, 0x7068,
 	0xa09a, 0x7064, 0xa096, 0x7060, 0xa092, 0x705c, 0xa08e, 0x080c,
-	0x10e0, 0x002e, 0x008e, 0x0005, 0x0006, 0x0016, 0x0096, 0x00a6,
-	0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x080c, 0x81e5,
+	0x10e9, 0x002e, 0x008e, 0x0005, 0x0006, 0x0016, 0x0096, 0x00a6,
+	0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x080c, 0x842a,
 	0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e,
-	0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x19f8, 0x7172, 0x7276,
-	0x706f, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x19f8,
+	0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x19fa, 0x7172, 0x7276,
+	0x706f, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x19fa,
 	0x7074, 0x9206, 0x1110, 0x7072, 0x7076, 0x000e, 0x00ee, 0x0005,
 	0x0016, 0x00c6, 0x2009, 0xfffc, 0x210d, 0x2061, 0x0100, 0x60f0,
 	0x9100, 0x60f3, 0x0000, 0x2009, 0xfffc, 0x200f, 0x1220, 0x8108,
 	0x2105, 0x8000, 0x200f, 0x00ce, 0x001e, 0x0005, 0x00c6, 0x2061,
-	0x1a6e, 0x00ce, 0x0005, 0x9184, 0x000f, 0x8003, 0x8003, 0x8003,
-	0x9080, 0x1a6e, 0x2060, 0x0005, 0xa884, 0x908a, 0x199a, 0x1638,
-	0x9005, 0x1150, 0x00c6, 0x2061, 0x1a6e, 0x6014, 0x00ce, 0x9005,
+	0x1a71, 0x00ce, 0x0005, 0x9184, 0x000f, 0x8003, 0x8003, 0x8003,
+	0x9080, 0x1a71, 0x2060, 0x0005, 0xa884, 0x908a, 0x199a, 0x1638,
+	0x9005, 0x1150, 0x00c6, 0x2061, 0x1a71, 0x6014, 0x00ce, 0x9005,
 	0x1130, 0x2001, 0x001e, 0x0018, 0x908e, 0xffff, 0x01b0, 0x8003,
 	0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, 0x908c, 0x00c0, 0x918e,
-	0x00c0, 0x0904, 0x8416, 0xd0b4, 0x1168, 0xd0bc, 0x1904, 0x83ef,
-	0x2009, 0x0006, 0x080c, 0x8443, 0x0005, 0x900e, 0x0c60, 0x2001,
+	0x00c0, 0x0904, 0x865e, 0xd0b4, 0x1168, 0xd0bc, 0x1904, 0x8637,
+	0x2009, 0x0006, 0x080c, 0x868b, 0x0005, 0x900e, 0x0c60, 0x2001,
 	0x1999, 0x08b0, 0xd0fc, 0x0160, 0x908c, 0x0003, 0x0120, 0x918e,
-	0x0003, 0x1904, 0x843d, 0x908c, 0x2020, 0x918e, 0x2020, 0x01a8,
+	0x0003, 0x1904, 0x8685, 0x908c, 0x2020, 0x918e, 0x2020, 0x01a8,
 	0x6024, 0xd0d4, 0x11e8, 0x2009, 0x1869, 0x2104, 0xd084, 0x1138,
-	0x87ff, 0x1120, 0x2009, 0x0043, 0x0804, 0xabe6, 0x0005, 0x87ff,
-	0x1de8, 0x2009, 0x0042, 0x0804, 0xabe6, 0x6110, 0x00b6, 0x2158,
+	0x87ff, 0x1120, 0x2009, 0x0043, 0x0804, 0xaec2, 0x0005, 0x87ff,
+	0x1de8, 0x2009, 0x0042, 0x0804, 0xaec2, 0x6110, 0x00b6, 0x2158,
 	0xb900, 0x00be, 0xd1ac, 0x0d20, 0x6024, 0xc0cd, 0x6026, 0x0c00,
 	0xc0d4, 0x6026, 0xa890, 0x602e, 0xa88c, 0x6032, 0x08e0, 0xd0fc,
-	0x0160, 0x908c, 0x0003, 0x0120, 0x918e, 0x0003, 0x1904, 0x843d,
+	0x0160, 0x908c, 0x0003, 0x0120, 0x918e, 0x0003, 0x1904, 0x8685,
 	0x908c, 0x2020, 0x918e, 0x2020, 0x0170, 0x0076, 0x00f6, 0x2c78,
-	0x080c, 0x1689, 0x00fe, 0x007e, 0x87ff, 0x1120, 0x2009, 0x0042,
-	0x080c, 0xabe6, 0x0005, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be,
+	0x080c, 0x1725, 0x00fe, 0x007e, 0x87ff, 0x1120, 0x2009, 0x0042,
+	0x080c, 0xaec2, 0x0005, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be,
 	0xd1ac, 0x0d58, 0x6124, 0xc1cd, 0x6126, 0x0c38, 0xd0fc, 0x0188,
 	0x908c, 0x2020, 0x918e, 0x2020, 0x01a8, 0x9084, 0x0003, 0x908e,
-	0x0002, 0x0148, 0x87ff, 0x1120, 0x2009, 0x0041, 0x080c, 0xabe6,
+	0x0002, 0x0148, 0x87ff, 0x1120, 0x2009, 0x0041, 0x080c, 0xaec2,
 	0x0005, 0x00b9, 0x0ce8, 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c,
-	0xabe6, 0x0cb0, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac,
+	0xaec2, 0x0cb0, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac,
 	0x0d20, 0x6124, 0xc1cd, 0x6126, 0x0c00, 0x2009, 0x0004, 0x0019,
-	0x0005, 0x2009, 0x0001, 0x0096, 0x080c, 0xc825, 0x0518, 0x6014,
+	0x0005, 0x2009, 0x0001, 0x0096, 0x080c, 0xcb1b, 0x0518, 0x6014,
 	0x2048, 0xa982, 0xa800, 0x6016, 0x9186, 0x0001, 0x1188, 0xa97c,
-	0x918c, 0x8100, 0x918e, 0x8100, 0x1158, 0x00c6, 0x2061, 0x1a6e,
+	0x918c, 0x8100, 0x918e, 0x8100, 0x1158, 0x00c6, 0x2061, 0x1a71,
 	0x6200, 0xd28c, 0x1120, 0x6204, 0x8210, 0x0208, 0x6206, 0x00ce,
-	0x080c, 0x6881, 0x6014, 0x904d, 0x0076, 0x2039, 0x0000, 0x190c,
-	0x838c, 0x007e, 0x009e, 0x0005, 0x0156, 0x00c6, 0x2061, 0x1a6e,
+	0x080c, 0x6ab4, 0x6014, 0x904d, 0x0076, 0x2039, 0x0000, 0x190c,
+	0x85d4, 0x007e, 0x009e, 0x0005, 0x0156, 0x00c6, 0x2061, 0x1a71,
 	0x6000, 0x81ff, 0x0110, 0x9205, 0x0008, 0x9204, 0x6002, 0x00ce,
 	0x015e, 0x0005, 0x6800, 0xd08c, 0x1138, 0x6808, 0x9005, 0x0120,
 	0x8001, 0x680a, 0x9085, 0x0001, 0x0005, 0x2071, 0x1923, 0x7003,
 	0x0006, 0x7007, 0x0000, 0x700f, 0x0000, 0x7013, 0x0001, 0x080c,
-	0x1019, 0x090c, 0x0dd5, 0xa867, 0x0006, 0xa86b, 0x0001, 0xa8ab,
+	0x1018, 0x090c, 0x0dd5, 0xa867, 0x0006, 0xa86b, 0x0001, 0xa8ab,
 	0xdcb0, 0xa89f, 0x0000, 0x2900, 0x702e, 0x7033, 0x0000, 0x0005,
 	0x0096, 0x00e6, 0x2071, 0x1923, 0x702c, 0x2048, 0x6a2c, 0x721e,
 	0x6b30, 0x7322, 0x6834, 0x7026, 0xa896, 0x6838, 0x702a, 0xa89a,
@@ -4044,69 +4117,69 @@ unsigned short risc_code01[] = { 
 	0x0148, 0x900e, 0x9188, 0x000c, 0x8001, 0x1de0, 0x2100, 0x9210,
 	0x1208, 0x8318, 0xaa8e, 0xab92, 0x7010, 0xd084, 0x0178, 0xc084,
 	0x7007, 0x0001, 0x700f, 0x0000, 0x0006, 0x2009, 0x181d, 0x2104,
-	0x9082, 0x0007, 0x2009, 0x1abf, 0x200a, 0x000e, 0xc095, 0x7012,
-	0x2008, 0x2001, 0x003b, 0x080c, 0x15d1, 0x9006, 0x2071, 0x193c,
+	0x9082, 0x0007, 0x2009, 0x1ac8, 0x200a, 0x000e, 0xc095, 0x7012,
+	0x2008, 0x2001, 0x003b, 0x080c, 0x15ee, 0x9006, 0x2071, 0x193c,
 	0x7002, 0x7006, 0x702a, 0x00ee, 0x009e, 0x0005, 0x00e6, 0x0126,
 	0x0156, 0x2091, 0x8000, 0x2071, 0x1800, 0x7154, 0x2001, 0x0008,
 	0x910a, 0x0638, 0x2001, 0x187d, 0x20ac, 0x9006, 0x9080, 0x0008,
-	0x1f04, 0x84f6, 0x71c0, 0x9102, 0x02e0, 0x2071, 0x1877, 0x20a9,
-	0x0007, 0x00c6, 0x080c, 0xab15, 0x6023, 0x0009, 0x6003, 0x0004,
-	0x601f, 0x0101, 0x0089, 0x0126, 0x2091, 0x8000, 0x080c, 0x867c,
-	0x012e, 0x1f04, 0x8502, 0x9006, 0x00ce, 0x015e, 0x012e, 0x00ee,
+	0x1f04, 0x873e, 0x71c0, 0x9102, 0x02e0, 0x2071, 0x1877, 0x20a9,
+	0x0007, 0x00c6, 0x080c, 0xadf1, 0x6023, 0x0009, 0x6003, 0x0004,
+	0x601f, 0x0101, 0x0089, 0x0126, 0x2091, 0x8000, 0x080c, 0x88c4,
+	0x012e, 0x1f04, 0x874a, 0x9006, 0x00ce, 0x015e, 0x012e, 0x00ee,
 	0x0005, 0x9085, 0x0001, 0x0cc8, 0x00e6, 0x00b6, 0x0096, 0x0086,
 	0x0056, 0x0046, 0x0026, 0x7118, 0x720c, 0x7620, 0x7004, 0xd084,
 	0x1128, 0x2021, 0x0024, 0x2029, 0x0002, 0x0020, 0x2021, 0x002c,
-	0x2029, 0x000a, 0x080c, 0x1000, 0x090c, 0x0dd5, 0x2900, 0x6016,
+	0x2029, 0x000a, 0x080c, 0x0fff, 0x090c, 0x0dd5, 0x2900, 0x6016,
 	0x2058, 0xac66, 0x9006, 0xa802, 0xa806, 0xa86a, 0xa87a, 0xa8aa,
 	0xa887, 0x0005, 0xa87f, 0x0020, 0x7008, 0xa89a, 0x7010, 0xa89e,
 	0xae8a, 0xa8af, 0xffff, 0xa8b3, 0x0000, 0x8109, 0x0160, 0x080c,
-	0x1000, 0x090c, 0x0dd5, 0xad66, 0x2b00, 0xa802, 0x2900, 0xb806,
+	0x0fff, 0x090c, 0x0dd5, 0xad66, 0x2b00, 0xa802, 0x2900, 0xb806,
 	0x2058, 0x8109, 0x1da0, 0x002e, 0x004e, 0x005e, 0x008e, 0x009e,
 	0x00be, 0x00ee, 0x0005, 0x2079, 0x0000, 0x2071, 0x1923, 0x7004,
-	0x004b, 0x700c, 0x0002, 0x856e, 0x8567, 0x8567, 0x0005, 0x8578,
-	0x85d9, 0x85d9, 0x85d9, 0x85da, 0x85eb, 0x85eb, 0x700c, 0x0cba,
+	0x004b, 0x700c, 0x0002, 0x87b6, 0x87af, 0x87af, 0x0005, 0x87c0,
+	0x8821, 0x8821, 0x8821, 0x8822, 0x8833, 0x8833, 0x700c, 0x0cba,
 	0x0126, 0x2091, 0x8000, 0x78a0, 0x79a0, 0x9106, 0x0128, 0x78a0,
-	0x79a0, 0x9106, 0x1904, 0x85cc, 0x2001, 0x0005, 0x2004, 0xd0bc,
+	0x79a0, 0x9106, 0x1904, 0x8814, 0x2001, 0x0005, 0x2004, 0xd0bc,
 	0x0130, 0x2011, 0x0004, 0x2204, 0xc0c5, 0x2012, 0x0ca8, 0x012e,
-	0x7018, 0x910a, 0x1130, 0x7030, 0x9005, 0x05a8, 0x080c, 0x861a,
+	0x7018, 0x910a, 0x1130, 0x7030, 0x9005, 0x05a8, 0x080c, 0x8862,
 	0x0490, 0x1210, 0x7114, 0x910a, 0x9192, 0x000a, 0x0210, 0x2009,
 	0x000a, 0x2001, 0x1888, 0x2014, 0x2001, 0x1935, 0x2004, 0x9100,
-	0x9202, 0x0e48, 0x080c, 0x8766, 0x2200, 0x9102, 0x0208, 0x2208,
-	0x0096, 0x702c, 0x2048, 0xa873, 0x0001, 0xa976, 0x080c, 0x886f,
+	0x9202, 0x0e48, 0x080c, 0x89ae, 0x2200, 0x9102, 0x0208, 0x2208,
+	0x0096, 0x702c, 0x2048, 0xa873, 0x0001, 0xa976, 0x080c, 0x8ab7,
 	0x2100, 0xa87e, 0xa86f, 0x0000, 0x009e, 0x0126, 0x2091, 0x8000,
-	0x2009, 0x1a16, 0x2104, 0xc085, 0x200a, 0x700f, 0x0002, 0x012e,
-	0x080c, 0x10ff, 0x1de8, 0x0005, 0x2001, 0x0005, 0x2004, 0xd0bc,
+	0x2009, 0x1a18, 0x2104, 0xc085, 0x200a, 0x700f, 0x0002, 0x012e,
+	0x080c, 0x1108, 0x1de8, 0x0005, 0x2001, 0x0005, 0x2004, 0xd0bc,
 	0x0130, 0x2011, 0x0004, 0x2204, 0xc0c5, 0x2012, 0x0ca8, 0x012e,
-	0x0005, 0x0005, 0x700c, 0x0002, 0x85df, 0x85e2, 0x85e1, 0x080c,
-	0x8576, 0x0005, 0x8001, 0x700e, 0x0096, 0x702c, 0x2048, 0xa974,
+	0x0005, 0x0005, 0x700c, 0x0002, 0x8827, 0x882a, 0x8829, 0x080c,
+	0x87be, 0x0005, 0x8001, 0x700e, 0x0096, 0x702c, 0x2048, 0xa974,
 	0x009e, 0x0011, 0x0ca0, 0x0005, 0x0096, 0x702c, 0x2048, 0x7018,
 	0x9100, 0x7214, 0x921a, 0x1130, 0x701c, 0xa88e, 0x7020, 0xa892,
-	0x9006, 0x0068, 0x0006, 0x080c, 0x886f, 0x2100, 0xaa8c, 0x9210,
+	0x9006, 0x0068, 0x0006, 0x080c, 0x8ab7, 0x2100, 0xaa8c, 0x9210,
 	0xaa8e, 0x1220, 0xa890, 0x9081, 0x0000, 0xa892, 0x000e, 0x009e,
 	0x2f08, 0x9188, 0x0028, 0x200a, 0x701a, 0x0005, 0x00e6, 0x2071,
-	0x1923, 0x700c, 0x0002, 0x8618, 0x8618, 0x8616, 0x700f, 0x0001,
+	0x1923, 0x700c, 0x0002, 0x8860, 0x8860, 0x885e, 0x700f, 0x0001,
 	0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x7030, 0x9005, 0x0508,
 	0x2078, 0x7814, 0x2048, 0xae88, 0x00b6, 0x2059, 0x0000, 0x080c,
-	0x8685, 0x00be, 0x01b0, 0x00e6, 0x2071, 0x193c, 0x080c, 0x86cc,
-	0x00ee, 0x0178, 0x0096, 0x080c, 0x1019, 0x2900, 0x009e, 0x0148,
+	0x88cd, 0x00be, 0x01b0, 0x00e6, 0x2071, 0x193c, 0x080c, 0x8914,
+	0x00ee, 0x0178, 0x0096, 0x080c, 0x1018, 0x2900, 0x009e, 0x0148,
 	0xa8aa, 0x04b9, 0x0041, 0x2001, 0x1946, 0x2003, 0x0000, 0x012e,
 	0x08c8, 0x012e, 0x0005, 0x00d6, 0x00c6, 0x0086, 0x00a6, 0x2940,
 	0x2650, 0x2600, 0x9005, 0x0180, 0xa864, 0x9084, 0x000f, 0x2068,
-	0x9d88, 0x1f4a, 0x2165, 0x0056, 0x2029, 0x0000, 0x080c, 0x87f4,
-	0x080c, 0x1f08, 0x1dd8, 0x005e, 0x00ae, 0x2001, 0x187f, 0x2004,
-	0xa88a, 0x080c, 0x1689, 0x781f, 0x0101, 0x7813, 0x0000, 0x0126,
-	0x2091, 0x8000, 0x080c, 0x86db, 0x012e, 0x008e, 0x00ce, 0x00de,
+	0x9d88, 0x2090, 0x2165, 0x0056, 0x2029, 0x0000, 0x080c, 0x8a3c,
+	0x080c, 0x2048, 0x1dd8, 0x005e, 0x00ae, 0x2001, 0x187f, 0x2004,
+	0xa88a, 0x080c, 0x1725, 0x781f, 0x0101, 0x7813, 0x0000, 0x0126,
+	0x2091, 0x8000, 0x080c, 0x8923, 0x012e, 0x008e, 0x00ce, 0x00de,
 	0x0005, 0x7030, 0x9005, 0x0138, 0x2078, 0x780c, 0x7032, 0x2001,
 	0x1946, 0x2003, 0x0001, 0x0005, 0x00e6, 0x2071, 0x1923, 0x7030,
 	0x600e, 0x2c00, 0x7032, 0x00ee, 0x0005, 0x00d6, 0x00c6, 0x0026,
-	0x9b80, 0x894e, 0x2005, 0x906d, 0x090c, 0x0dd5, 0x9b80, 0x8946,
+	0x9b80, 0x8b96, 0x2005, 0x906d, 0x090c, 0x0dd5, 0x9b80, 0x8b8e,
 	0x2005, 0x9065, 0x090c, 0x0dd5, 0x6114, 0x2600, 0x9102, 0x0248,
 	0x6828, 0x9102, 0x02f0, 0x9085, 0x0001, 0x002e, 0x00ce, 0x00de,
 	0x0005, 0x6804, 0xd094, 0x0148, 0x6854, 0xd084, 0x1178, 0xc085,
-	0x6856, 0x2011, 0x8026, 0x080c, 0x48fb, 0x684c, 0x0096, 0x904d,
+	0x6856, 0x2011, 0x8026, 0x080c, 0x4b05, 0x684c, 0x0096, 0x904d,
 	0x090c, 0x0dd5, 0xa804, 0x8000, 0xa806, 0x009e, 0x9006, 0x2030,
 	0x0c20, 0x6854, 0xd08c, 0x1d08, 0xc08d, 0x6856, 0x2011, 0x8025,
-	0x080c, 0x48fb, 0x684c, 0x0096, 0x904d, 0x090c, 0x0dd5, 0xa800,
+	0x080c, 0x4b05, 0x684c, 0x0096, 0x904d, 0x090c, 0x0dd5, 0xa800,
 	0x8000, 0xa802, 0x009e, 0x0888, 0x7000, 0x2019, 0x0008, 0x8319,
 	0x7104, 0x9102, 0x1118, 0x2300, 0x9005, 0x0020, 0x0210, 0x9302,
 	0x0008, 0x8002, 0x0005, 0x00d6, 0x7814, 0x9005, 0x090c, 0x0dd5,
@@ -4114,21 +4187,21 @@ unsigned short risc_code01[] = { 
 	0x193c, 0x6804, 0x9080, 0x193e, 0x2f08, 0x2102, 0x6904, 0x8108,
 	0x9182, 0x0008, 0x0208, 0x900e, 0x6906, 0x9180, 0x193e, 0x2003,
 	0x0000, 0x00de, 0x0005, 0x0096, 0x00c6, 0x2060, 0x6014, 0x2048,
-	0xa8a8, 0x0096, 0x2048, 0x9005, 0x190c, 0x1032, 0x009e, 0xa8ab,
-	0x0000, 0x080c, 0x0fb2, 0x080c, 0xab6b, 0x00ce, 0x009e, 0x0005,
+	0xa8a8, 0x0096, 0x2048, 0x9005, 0x190c, 0x1031, 0x009e, 0xa8ab,
+	0x0000, 0x080c, 0x0fb1, 0x080c, 0xae47, 0x00ce, 0x009e, 0x0005,
 	0x6020, 0x9086, 0x0009, 0x1128, 0x601c, 0xd0c4, 0x0110, 0x9006,
 	0x0005, 0x9085, 0x0001, 0x0005, 0x6000, 0x9086, 0x0000, 0x0178,
-	0x6010, 0x9005, 0x0150, 0x00b6, 0x2058, 0x080c, 0x8a81, 0x00be,
+	0x6010, 0x9005, 0x0150, 0x00b6, 0x2058, 0x080c, 0x8cc9, 0x00be,
 	0x6013, 0x0000, 0x601b, 0x0000, 0x0010, 0x2c00, 0x0861, 0x0005,
 	0x2009, 0x1927, 0x210c, 0xd194, 0x0005, 0x00e6, 0x2071, 0x1923,
 	0x7110, 0xc194, 0xd19c, 0x1118, 0xc185, 0x7007, 0x0000, 0x7112,
-	0x2001, 0x003b, 0x080c, 0x15d1, 0x00ee, 0x0005, 0x0096, 0x00d6,
+	0x2001, 0x003b, 0x080c, 0x15ee, 0x00ee, 0x0005, 0x0096, 0x00d6,
 	0x9006, 0x7006, 0x700e, 0x701a, 0x701e, 0x7022, 0x7016, 0x702a,
-	0x7026, 0x702f, 0x0000, 0x080c, 0x88ce, 0x0170, 0x080c, 0x8903,
+	0x7026, 0x702f, 0x0000, 0x080c, 0x8b16, 0x0170, 0x080c, 0x8b4b,
 	0x0158, 0x2900, 0x7002, 0x700a, 0x701a, 0x7013, 0x0001, 0x701f,
 	0x000a, 0x00de, 0x009e, 0x0005, 0x900e, 0x0cd8, 0x00e6, 0x0096,
 	0x0086, 0x00d6, 0x00c6, 0x2071, 0x1930, 0x721c, 0x2100, 0x9202,
-	0x1618, 0x080c, 0x8903, 0x090c, 0x0dd5, 0x7018, 0x9005, 0x1160,
+	0x1618, 0x080c, 0x8b4b, 0x090c, 0x0dd5, 0x7018, 0x9005, 0x1160,
 	0x2900, 0x7002, 0x700a, 0x701a, 0x9006, 0x7006, 0x700e, 0xa806,
 	0xa802, 0x7012, 0x701e, 0x0038, 0x2040, 0xa806, 0x2900, 0xa002,
 	0x701a, 0xa803, 0x0000, 0x7010, 0x8000, 0x7012, 0x701c, 0x9080,
@@ -4136,93 +4209,93 @@ unsigned short risc_code01[] = { 
 	0x009e, 0x00ee, 0x0005, 0x0096, 0x0156, 0x0136, 0x0146, 0x00e6,
 	0x0126, 0x2091, 0x8000, 0x2071, 0x1930, 0x7300, 0x831f, 0x831e,
 	0x831e, 0x9384, 0x003f, 0x20e8, 0x939c, 0xffc0, 0x9398, 0x0003,
-	0x7104, 0x080c, 0x886f, 0x810c, 0x2100, 0x9318, 0x8003, 0x2228,
+	0x7104, 0x080c, 0x8ab7, 0x810c, 0x2100, 0x9318, 0x8003, 0x2228,
 	0x2021, 0x0078, 0x9402, 0x9532, 0x0208, 0x2028, 0x2500, 0x8004,
-	0x20a8, 0x23a0, 0xa001, 0xa001, 0x4005, 0x2508, 0x080c, 0x8878,
+	0x20a8, 0x23a0, 0xa001, 0xa001, 0x4005, 0x2508, 0x080c, 0x8ac0,
 	0x2130, 0x7014, 0x9600, 0x7016, 0x2600, 0x711c, 0x9102, 0x701e,
 	0x7004, 0x9600, 0x2008, 0x9082, 0x000a, 0x1190, 0x7000, 0x2048,
-	0xa800, 0x9005, 0x1148, 0x2009, 0x0001, 0x0026, 0x080c, 0x8766,
+	0xa800, 0x9005, 0x1148, 0x2009, 0x0001, 0x0026, 0x080c, 0x89ae,
 	0x002e, 0x7000, 0x2048, 0xa800, 0x7002, 0x7007, 0x0000, 0x0008,
-	0x7106, 0x2500, 0x9212, 0x1904, 0x87a5, 0x012e, 0x00ee, 0x014e,
+	0x7106, 0x2500, 0x9212, 0x1904, 0x89ed, 0x012e, 0x00ee, 0x014e,
 	0x013e, 0x015e, 0x009e, 0x0005, 0x0016, 0x0026, 0x00e6, 0x0126,
-	0x2091, 0x8000, 0x9580, 0x8946, 0x2005, 0x9075, 0x090c, 0x0dd5,
-	0x080c, 0x884a, 0x012e, 0x9580, 0x8942, 0x2005, 0x9075, 0x090c,
+	0x2091, 0x8000, 0x9580, 0x8b8e, 0x2005, 0x9075, 0x090c, 0x0dd5,
+	0x080c, 0x8a92, 0x012e, 0x9580, 0x8b8a, 0x2005, 0x9075, 0x090c,
 	0x0dd5, 0x0156, 0x0136, 0x01c6, 0x0146, 0x01d6, 0x831f, 0x831e,
 	0x831e, 0x9384, 0x003f, 0x20e0, 0x9384, 0xffc0, 0x9100, 0x2098,
 	0xa860, 0x20e8, 0xa95c, 0x2c05, 0x9100, 0x20a0, 0x20a9, 0x0002,
-	0x4003, 0x2e0c, 0x2d00, 0x0002, 0x8834, 0x8834, 0x8836, 0x8834,
-	0x8836, 0x8834, 0x8834, 0x8834, 0x8834, 0x8834, 0x883c, 0x8834,
-	0x883c, 0x8834, 0x8834, 0x8834, 0x080c, 0x0dd5, 0x4104, 0x20a9,
+	0x4003, 0x2e0c, 0x2d00, 0x0002, 0x8a7c, 0x8a7c, 0x8a7e, 0x8a7c,
+	0x8a7e, 0x8a7c, 0x8a7c, 0x8a7c, 0x8a7c, 0x8a7c, 0x8a84, 0x8a7c,
+	0x8a84, 0x8a7c, 0x8a7c, 0x8a7c, 0x080c, 0x0dd5, 0x4104, 0x20a9,
 	0x0002, 0x4002, 0x4003, 0x0028, 0x20a9, 0x0002, 0x4003, 0x4104,
 	0x4003, 0x01de, 0x014e, 0x01ce, 0x013e, 0x015e, 0x00ee, 0x002e,
 	0x001e, 0x0005, 0x0096, 0x7014, 0x8001, 0x7016, 0x710c, 0x2110,
 	0x00f1, 0x810c, 0x9188, 0x0003, 0x7308, 0x8210, 0x9282, 0x000a,
 	0x1198, 0x7008, 0x2048, 0xa800, 0x9005, 0x0158, 0x0006, 0x080c,
-	0x8912, 0x009e, 0xa807, 0x0000, 0x2900, 0x700a, 0x7010, 0x8001,
+	0x8b5a, 0x009e, 0xa807, 0x0000, 0x2900, 0x700a, 0x7010, 0x8001,
 	0x7012, 0x700f, 0x0000, 0x0008, 0x720e, 0x009e, 0x0005, 0x0006,
 	0x810b, 0x810b, 0x2100, 0x810b, 0x9100, 0x2008, 0x000e, 0x0005,
 	0x0006, 0x0026, 0x2100, 0x9005, 0x0158, 0x9092, 0x000c, 0x0240,
 	0x900e, 0x8108, 0x9082, 0x000c, 0x1de0, 0x002e, 0x000e, 0x0005,
 	0x900e, 0x0cd8, 0x2d00, 0x90b8, 0x0008, 0x690c, 0x6810, 0x2019,
-	0x0001, 0x2031, 0x88b8, 0x9112, 0x0220, 0x0118, 0x8318, 0x2208,
+	0x0001, 0x2031, 0x8b00, 0x9112, 0x0220, 0x0118, 0x8318, 0x2208,
 	0x0cd0, 0x6808, 0x9005, 0x0108, 0x8318, 0x233a, 0x6804, 0xd084,
 	0x2300, 0x2021, 0x0001, 0x1150, 0x9082, 0x0003, 0x0967, 0x0a67,
 	0x8420, 0x9082, 0x0007, 0x0967, 0x0a67, 0x0cd0, 0x9082, 0x0002,
 	0x0967, 0x0a67, 0x8420, 0x9082, 0x0005, 0x0967, 0x0a67, 0x0cd0,
 	0x6c1a, 0x2d00, 0x90b8, 0x0007, 0x00e6, 0x2071, 0x1800, 0x7128,
 	0x6810, 0x2019, 0x0001, 0x910a, 0x0118, 0x0210, 0x8318, 0x0cd8,
-	0x2031, 0x88cb, 0x0870, 0x6c16, 0x00ee, 0x0005, 0x0096, 0x0046,
-	0x0126, 0x2091, 0x8000, 0x2b00, 0x9080, 0x894a, 0x2005, 0x9005,
-	0x090c, 0x0dd5, 0x2004, 0x90a0, 0x000a, 0x080c, 0x1019, 0x01d0,
-	0x2900, 0x7026, 0xa803, 0x0000, 0xa807, 0x0000, 0x080c, 0x1019,
+	0x2031, 0x8b13, 0x0870, 0x6c16, 0x00ee, 0x0005, 0x0096, 0x0046,
+	0x0126, 0x2091, 0x8000, 0x2b00, 0x9080, 0x8b92, 0x2005, 0x9005,
+	0x090c, 0x0dd5, 0x2004, 0x90a0, 0x000a, 0x080c, 0x1018, 0x01d0,
+	0x2900, 0x7026, 0xa803, 0x0000, 0xa807, 0x0000, 0x080c, 0x1018,
 	0x0188, 0x7024, 0xa802, 0xa807, 0x0000, 0x2900, 0x7026, 0x94a2,
 	0x000a, 0x0110, 0x0208, 0x0c90, 0x9085, 0x0001, 0x012e, 0x004e,
 	0x009e, 0x0005, 0x7024, 0x9005, 0x0dc8, 0x2048, 0xac00, 0x080c,
-	0x1032, 0x2400, 0x0cc0, 0x0126, 0x2091, 0x8000, 0x7024, 0x2048,
+	0x1031, 0x2400, 0x0cc0, 0x0126, 0x2091, 0x8000, 0x7024, 0x2048,
 	0x9005, 0x0130, 0xa800, 0x7026, 0xa803, 0x0000, 0xa807, 0x0000,
 	0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x7024, 0xa802, 0x2900,
 	0x7026, 0x012e, 0x0005, 0x0096, 0x9e80, 0x0009, 0x2004, 0x9005,
-	0x0138, 0x2048, 0xa800, 0x0006, 0x080c, 0x1032, 0x000e, 0x0cb8,
+	0x0138, 0x2048, 0xa800, 0x0006, 0x080c, 0x1031, 0x000e, 0x0cb8,
 	0x009e, 0x0005, 0x0096, 0x7008, 0x9005, 0x0138, 0x2048, 0xa800,
-	0x0006, 0x080c, 0x1032, 0x000e, 0x0cb8, 0x9006, 0x7002, 0x700a,
+	0x0006, 0x080c, 0x1031, 0x000e, 0x0cb8, 0x9006, 0x7002, 0x700a,
 	0x7006, 0x700e, 0x701a, 0x701e, 0x7022, 0x702a, 0x7026, 0x702e,
-	0x009e, 0x0005, 0x1a62, 0x0000, 0x0000, 0x0000, 0x1930, 0x0000,
+	0x009e, 0x0005, 0x1a64, 0x0000, 0x0000, 0x0000, 0x1930, 0x0000,
 	0x0000, 0x0000, 0x1888, 0x0000, 0x0000, 0x0000, 0x1877, 0x0000,
 	0x0000, 0x0000, 0x00e6, 0x00c6, 0x00b6, 0x00a6, 0xa8a8, 0x2040,
-	0x2071, 0x1877, 0x080c, 0x8a6c, 0xa067, 0x0023, 0x6010, 0x905d,
-	0x0904, 0x8a41, 0xb814, 0xa06e, 0xb910, 0xa172, 0xb9a0, 0xa176,
+	0x2071, 0x1877, 0x080c, 0x8cb4, 0xa067, 0x0023, 0x6010, 0x905d,
+	0x0904, 0x8c89, 0xb814, 0xa06e, 0xb910, 0xa172, 0xb9a0, 0xa176,
 	0x2001, 0x0003, 0xa07e, 0xa834, 0xa082, 0xa07b, 0x0000, 0xa898,
 	0x9005, 0x0118, 0xa078, 0xc085, 0xa07a, 0x2858, 0x2031, 0x0018,
 	0xa068, 0x908a, 0x0019, 0x1a0c, 0x0dd5, 0x2020, 0x2050, 0x2940,
-	0xa864, 0x90bc, 0x00ff, 0x908c, 0x000f, 0x91e0, 0x1f4a, 0x2c65,
+	0xa864, 0x90bc, 0x00ff, 0x908c, 0x000f, 0x91e0, 0x2090, 0x2c65,
 	0x9786, 0x0024, 0x2c05, 0x1590, 0x908a, 0x0036, 0x1a0c, 0x0dd5,
-	0x9082, 0x001b, 0x0002, 0x89ae, 0x89ae, 0x89b0, 0x89ae, 0x89ae,
-	0x89ae, 0x89b2, 0x89ae, 0x89ae, 0x89ae, 0x89b4, 0x89ae, 0x89ae,
-	0x89ae, 0x89b6, 0x89ae, 0x89ae, 0x89ae, 0x89b8, 0x89ae, 0x89ae,
-	0x89ae, 0x89ba, 0x89ae, 0x89ae, 0x89ae, 0x89bc, 0x080c, 0x0dd5,
+	0x9082, 0x001b, 0x0002, 0x8bf6, 0x8bf6, 0x8bf8, 0x8bf6, 0x8bf6,
+	0x8bf6, 0x8bfa, 0x8bf6, 0x8bf6, 0x8bf6, 0x8bfc, 0x8bf6, 0x8bf6,
+	0x8bf6, 0x8bfe, 0x8bf6, 0x8bf6, 0x8bf6, 0x8c00, 0x8bf6, 0x8bf6,
+	0x8bf6, 0x8c02, 0x8bf6, 0x8bf6, 0x8bf6, 0x8c04, 0x080c, 0x0dd5,
 	0xa180, 0x04b8, 0xa190, 0x04a8, 0xa1a0, 0x0498, 0xa1b0, 0x0488,
 	0xa1c0, 0x0478, 0xa1d0, 0x0468, 0xa1e0, 0x0458, 0x908a, 0x0034,
-	0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x89e0, 0x89de, 0x89de,
-	0x89de, 0x89de, 0x89de, 0x89e2, 0x89de, 0x89de, 0x89de, 0x89de,
-	0x89de, 0x89e4, 0x89de, 0x89de, 0x89de, 0x89de, 0x89de, 0x89e6,
-	0x89de, 0x89de, 0x89de, 0x89de, 0x89de, 0x89e8, 0x080c, 0x0dd5,
+	0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x8c28, 0x8c26, 0x8c26,
+	0x8c26, 0x8c26, 0x8c26, 0x8c2a, 0x8c26, 0x8c26, 0x8c26, 0x8c26,
+	0x8c26, 0x8c2c, 0x8c26, 0x8c26, 0x8c26, 0x8c26, 0x8c26, 0x8c2e,
+	0x8c26, 0x8c26, 0x8c26, 0x8c26, 0x8c26, 0x8c30, 0x080c, 0x0dd5,
 	0xa180, 0x0038, 0xa198, 0x0028, 0xa1b0, 0x0018, 0xa1c8, 0x0008,
-	0xa1e0, 0x2600, 0x0002, 0x8a04, 0x8a06, 0x8a08, 0x8a0a, 0x8a0c,
-	0x8a0e, 0x8a10, 0x8a12, 0x8a14, 0x8a16, 0x8a18, 0x8a1a, 0x8a1c,
-	0x8a1e, 0x8a20, 0x8a22, 0x8a24, 0x8a26, 0x8a28, 0x8a2a, 0x8a2c,
-	0x8a2e, 0x8a30, 0x8a32, 0x8a34, 0x080c, 0x0dd5, 0xb9e2, 0x0468,
+	0xa1e0, 0x2600, 0x0002, 0x8c4c, 0x8c4e, 0x8c50, 0x8c52, 0x8c54,
+	0x8c56, 0x8c58, 0x8c5a, 0x8c5c, 0x8c5e, 0x8c60, 0x8c62, 0x8c64,
+	0x8c66, 0x8c68, 0x8c6a, 0x8c6c, 0x8c6e, 0x8c70, 0x8c72, 0x8c74,
+	0x8c76, 0x8c78, 0x8c7a, 0x8c7c, 0x080c, 0x0dd5, 0xb9e2, 0x0468,
 	0xb9de, 0x0458, 0xb9da, 0x0448, 0xb9d6, 0x0438, 0xb9d2, 0x0428,
 	0xb9ce, 0x0418, 0xb9ca, 0x0408, 0xb9c6, 0x00f8, 0xb9c2, 0x00e8,
 	0xb9be, 0x00d8, 0xb9ba, 0x00c8, 0xb9b6, 0x00b8, 0xb9b2, 0x00a8,
 	0xb9ae, 0x0098, 0xb9aa, 0x0088, 0xb9a6, 0x0078, 0xb9a2, 0x0068,
 	0xb99e, 0x0058, 0xb99a, 0x0048, 0xb996, 0x0038, 0xb992, 0x0028,
 	0xb98e, 0x0018, 0xb98a, 0x0008, 0xb986, 0x8631, 0x8421, 0x0120,
-	0x080c, 0x1f08, 0x0804, 0x8988, 0x00ae, 0x00be, 0x00ce, 0x00ee,
+	0x080c, 0x2048, 0x0804, 0x8bd0, 0x00ae, 0x00be, 0x00ce, 0x00ee,
 	0x0005, 0xa86c, 0xa06e, 0xa870, 0xa072, 0xa077, 0x00ff, 0x9006,
-	0x0804, 0x896a, 0x0006, 0x0016, 0x00b6, 0x6010, 0x2058, 0xb810,
+	0x0804, 0x8bb2, 0x0006, 0x0016, 0x00b6, 0x6010, 0x2058, 0xb810,
 	0x9005, 0x01b0, 0x2001, 0x1924, 0x2004, 0x9005, 0x0188, 0x2001,
 	0x1800, 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0xbba0,
-	0x2021, 0x0004, 0x2011, 0x8014, 0x080c, 0x48fb, 0x004e, 0x003e,
+	0x2021, 0x0004, 0x2011, 0x8014, 0x080c, 0x4b05, 0x004e, 0x003e,
 	0x00be, 0x001e, 0x000e, 0x0005, 0x9016, 0x710c, 0xa834, 0x910a,
 	0xa936, 0x7008, 0x9005, 0x0120, 0x8210, 0x910a, 0x0238, 0x0130,
 	0x7010, 0x8210, 0x910a, 0x0210, 0x0108, 0x0cd8, 0xaa8a, 0xa26a,
@@ -4234,476 +4307,476 @@ unsigned short risc_code01[] = { 
 	0x6b0c, 0x7b0e, 0x600f, 0x0000, 0x2079, 0x0300, 0x781b, 0x0200,
 	0x003e, 0x00de, 0x00fe, 0x0005, 0x00e6, 0x00d6, 0x0096, 0x00c6,
 	0x0036, 0x0126, 0x2091, 0x8000, 0x0156, 0x20a9, 0x01ff, 0x2071,
-	0x0300, 0x701b, 0x0200, 0x7018, 0xd094, 0x0110, 0x1f04, 0x8ac1,
+	0x0300, 0x701b, 0x0200, 0x7018, 0xd094, 0x0110, 0x1f04, 0x8d09,
 	0x701b, 0x0202, 0xa001, 0xa001, 0x7018, 0xd094, 0x1d90, 0xb8ac,
 	0x9005, 0x01d0, 0x2060, 0x600c, 0xb8ae, 0x6003, 0x0004, 0x601b,
 	0x0000, 0x6013, 0x0000, 0x601f, 0x0101, 0x6014, 0x2048, 0xa88b,
 	0x0000, 0xa8a8, 0xa8ab, 0x0000, 0x904d, 0x090c, 0x0dd5, 0x080c,
-	0x1032, 0x080c, 0x867c, 0x0c18, 0x2071, 0x0300, 0x701b, 0x0200,
+	0x1031, 0x080c, 0x88c4, 0x0c18, 0x2071, 0x0300, 0x701b, 0x0200,
 	0x015e, 0x012e, 0x003e, 0x00ce, 0x009e, 0x00de, 0x00ee, 0x0005,
-	0x00c6, 0x00b6, 0x0016, 0x0006, 0x0156, 0x080c, 0x26f0, 0x015e,
-	0x11b0, 0x080c, 0x636c, 0x190c, 0x0dd5, 0x000e, 0x001e, 0xb912,
-	0xb816, 0x080c, 0xab15, 0x0140, 0x2b00, 0x6012, 0x6023, 0x0001,
-	0x2009, 0x0001, 0x080c, 0xabe6, 0x00be, 0x00ce, 0x0005, 0x000e,
+	0x00c6, 0x00b6, 0x0016, 0x0006, 0x0156, 0x080c, 0x283e, 0x015e,
+	0x11b0, 0x080c, 0x659f, 0x190c, 0x0dd5, 0x000e, 0x001e, 0xb912,
+	0xb816, 0x080c, 0xadf1, 0x0140, 0x2b00, 0x6012, 0x6023, 0x0001,
+	0x2009, 0x0001, 0x080c, 0xaec2, 0x00be, 0x00ce, 0x0005, 0x000e,
 	0x001e, 0x0cd0, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0dd5,
-	0x0013, 0x006e, 0x0005, 0x8b33, 0x8b33, 0x8b33, 0x8b35, 0x8b86,
-	0x8b33, 0x8b33, 0x8b33, 0x8be9, 0x8b33, 0x8c26, 0x8b33, 0x8b33,
-	0x8b33, 0x8b33, 0x8b33, 0x080c, 0x0dd5, 0x9182, 0x0040, 0x0002,
-	0x8b48, 0x8b48, 0x8b48, 0x8b48, 0x8b48, 0x8b48, 0x8b48, 0x8b48,
-	0x8b48, 0x8b4a, 0x8b5f, 0x8b48, 0x8b48, 0x8b48, 0x8b48, 0x8b72,
-	0x080c, 0x0dd5, 0x0096, 0x080c, 0x93cc, 0x080c, 0x9548, 0x6114,
+	0x0013, 0x006e, 0x0005, 0x8d7b, 0x8d7b, 0x8d7b, 0x8d7d, 0x8dce,
+	0x8d7b, 0x8d7b, 0x8d7b, 0x8e31, 0x8d7b, 0x8e6e, 0x8d7b, 0x8d7b,
+	0x8d7b, 0x8d7b, 0x8d7b, 0x080c, 0x0dd5, 0x9182, 0x0040, 0x0002,
+	0x8d90, 0x8d90, 0x8d90, 0x8d90, 0x8d90, 0x8d90, 0x8d90, 0x8d90,
+	0x8d90, 0x8d92, 0x8da7, 0x8d90, 0x8d90, 0x8d90, 0x8d90, 0x8dba,
+	0x080c, 0x0dd5, 0x0096, 0x080c, 0x9614, 0x080c, 0x9790, 0x6114,
 	0x2148, 0xa87b, 0x0000, 0x6010, 0x00b6, 0x2058, 0xb8bb, 0x0500,
-	0x00be, 0x080c, 0x684c, 0x080c, 0xab6b, 0x009e, 0x0005, 0x080c,
-	0x93cc, 0x00d6, 0x6114, 0x080c, 0xc825, 0x0130, 0x0096, 0x6114,
-	0x2148, 0x080c, 0x6a46, 0x009e, 0x00de, 0x080c, 0xab6b, 0x080c,
-	0x9548, 0x0005, 0x080c, 0x93cc, 0x080c, 0x306e, 0x6114, 0x0096,
-	0x2148, 0x080c, 0xc825, 0x0120, 0xa87b, 0x0029, 0x080c, 0x6a46,
-	0x009e, 0x080c, 0xab6b, 0x080c, 0x9548, 0x0005, 0x601b, 0x0000,
-	0x9182, 0x0040, 0x0096, 0x0002, 0x8ba1, 0x8ba1, 0x8ba1, 0x8ba1,
-	0x8ba1, 0x8ba1, 0x8ba1, 0x8ba1, 0x8ba3, 0x8ba1, 0x8ba1, 0x8ba1,
-	0x8be5, 0x8ba1, 0x8ba1, 0x8ba1, 0x8ba1, 0x8ba1, 0x8ba1, 0x8ba9,
-	0x8ba1, 0x080c, 0x0dd5, 0x6114, 0x2148, 0xa938, 0x918e, 0xffff,
-	0x05e0, 0x00e6, 0x6114, 0x2148, 0x080c, 0x8952, 0x0096, 0xa8a8,
-	0x2048, 0x080c, 0x67e4, 0x009e, 0xa8ab, 0x0000, 0x6010, 0x9005,
-	0x0128, 0x00b6, 0x2058, 0x080c, 0x8a81, 0x00be, 0xae88, 0x00b6,
-	0x2059, 0x0000, 0x080c, 0x8685, 0x00be, 0x01e0, 0x2071, 0x193c,
-	0x080c, 0x86cc, 0x01b8, 0x9086, 0x0001, 0x1128, 0x2001, 0x1946,
-	0x2004, 0x9005, 0x1178, 0x0096, 0x080c, 0x1000, 0x2900, 0x009e,
-	0x0148, 0xa8aa, 0x00f6, 0x2c78, 0x080c, 0x8643, 0x00fe, 0x00ee,
-	0x009e, 0x0005, 0x080c, 0x867c, 0x0cd0, 0x080c, 0x8c93, 0x009e,
-	0x0005, 0x9182, 0x0040, 0x0096, 0x0002, 0x8bfd, 0x8bfd, 0x8bfd,
-	0x8bff, 0x8bfd, 0x8bfd, 0x8bfd, 0x8c24, 0x8bfd, 0x8bfd, 0x8bfd,
-	0x8bfd, 0x8bfd, 0x8bfd, 0x8bfd, 0x8bfd, 0x080c, 0x0dd5, 0x6003,
+	0x00be, 0x080c, 0x6a7f, 0x080c, 0xae47, 0x009e, 0x0005, 0x080c,
+	0x9614, 0x00d6, 0x6114, 0x080c, 0xcb1b, 0x0130, 0x0096, 0x6114,
+	0x2148, 0x080c, 0x6c79, 0x009e, 0x00de, 0x080c, 0xae47, 0x080c,
+	0x9790, 0x0005, 0x080c, 0x9614, 0x080c, 0x31bc, 0x6114, 0x0096,
+	0x2148, 0x080c, 0xcb1b, 0x0120, 0xa87b, 0x0029, 0x080c, 0x6c79,
+	0x009e, 0x080c, 0xae47, 0x080c, 0x9790, 0x0005, 0x601b, 0x0000,
+	0x9182, 0x0040, 0x0096, 0x0002, 0x8de9, 0x8de9, 0x8de9, 0x8de9,
+	0x8de9, 0x8de9, 0x8de9, 0x8de9, 0x8deb, 0x8de9, 0x8de9, 0x8de9,
+	0x8e2d, 0x8de9, 0x8de9, 0x8de9, 0x8de9, 0x8de9, 0x8de9, 0x8df1,
+	0x8de9, 0x080c, 0x0dd5, 0x6114, 0x2148, 0xa938, 0x918e, 0xffff,
+	0x05e0, 0x00e6, 0x6114, 0x2148, 0x080c, 0x8b9a, 0x0096, 0xa8a8,
+	0x2048, 0x080c, 0x6a17, 0x009e, 0xa8ab, 0x0000, 0x6010, 0x9005,
+	0x0128, 0x00b6, 0x2058, 0x080c, 0x8cc9, 0x00be, 0xae88, 0x00b6,
+	0x2059, 0x0000, 0x080c, 0x88cd, 0x00be, 0x01e0, 0x2071, 0x193c,
+	0x080c, 0x8914, 0x01b8, 0x9086, 0x0001, 0x1128, 0x2001, 0x1946,
+	0x2004, 0x9005, 0x1178, 0x0096, 0x080c, 0x0fff, 0x2900, 0x009e,
+	0x0148, 0xa8aa, 0x00f6, 0x2c78, 0x080c, 0x888b, 0x00fe, 0x00ee,
+	0x009e, 0x0005, 0x080c, 0x88c4, 0x0cd0, 0x080c, 0x8edb, 0x009e,
+	0x0005, 0x9182, 0x0040, 0x0096, 0x0002, 0x8e45, 0x8e45, 0x8e45,
+	0x8e47, 0x8e45, 0x8e45, 0x8e45, 0x8e6c, 0x8e45, 0x8e45, 0x8e45,
+	0x8e45, 0x8e45, 0x8e45, 0x8e45, 0x8e45, 0x080c, 0x0dd5, 0x6003,
 	0x0003, 0x6106, 0x6014, 0x2048, 0xa8ac, 0xa846, 0xa8b0, 0xa84a,
 	0xa837, 0x0000, 0xa83b, 0x0000, 0xa884, 0x9092, 0x199a, 0x0210,
 	0x2001, 0x1999, 0x8003, 0x8013, 0x8213, 0x9210, 0x621a, 0x2c10,
-	0x080c, 0x1b03, 0x080c, 0x8ee4, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x9548, 0x012e, 0x009e, 0x0005, 0x080c, 0x0dd5, 0x080c, 0x93cc,
-	0x080c, 0x9548, 0x6114, 0x2148, 0xa87b, 0x0000, 0x6010, 0x00b6,
-	0x2058, 0xb8bb, 0x0500, 0x00be, 0x080c, 0x6a46, 0x080c, 0xab6b,
+	0x080c, 0x1bad, 0x080c, 0x912c, 0x0126, 0x2091, 0x8000, 0x080c,
+	0x9790, 0x012e, 0x009e, 0x0005, 0x080c, 0x0dd5, 0x080c, 0x9614,
+	0x080c, 0x9790, 0x6114, 0x2148, 0xa87b, 0x0000, 0x6010, 0x00b6,
+	0x2058, 0xb8bb, 0x0500, 0x00be, 0x080c, 0x6c79, 0x080c, 0xae47,
 	0x009e, 0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0dd5, 0x0096,
-	0x0013, 0x009e, 0x0005, 0x8c53, 0x8c53, 0x8c53, 0x8c55, 0x8c66,
-	0x8c53, 0x8c53, 0x8c53, 0x8c53, 0x8c53, 0x8c53, 0x8c53, 0x8c53,
-	0x8c53, 0x8c53, 0x8c53, 0x080c, 0x0dd5, 0x080c, 0xa4d6, 0x6114,
+	0x0013, 0x009e, 0x0005, 0x8e9b, 0x8e9b, 0x8e9b, 0x8e9d, 0x8eae,
+	0x8e9b, 0x8e9b, 0x8e9b, 0x8e9b, 0x8e9b, 0x8e9b, 0x8e9b, 0x8e9b,
+	0x8e9b, 0x8e9b, 0x8e9b, 0x080c, 0x0dd5, 0x080c, 0xa7b2, 0x6114,
 	0x2148, 0xa87b, 0x0006, 0x6010, 0x00b6, 0x2058, 0xb8bb, 0x0500,
-	0x00be, 0x080c, 0x6a46, 0x080c, 0xab6b, 0x0005, 0x0461, 0x0005,
+	0x00be, 0x080c, 0x6c79, 0x080c, 0xae47, 0x0005, 0x0461, 0x0005,
 	0x6000, 0x908a, 0x0016, 0x1a0c, 0x0dd5, 0x0096, 0x0013, 0x009e,
-	0x0005, 0x8c81, 0x8c81, 0x8c81, 0x8c83, 0x8c93, 0x8c81, 0x8c81,
-	0x8c81, 0x8c81, 0x8c81, 0x8c81, 0x8c81, 0x8c81, 0x8c81, 0x8c81,
-	0x8c81, 0x080c, 0x0dd5, 0x0036, 0x00e6, 0x2071, 0x19e5, 0x703c,
-	0x9c06, 0x1120, 0x2019, 0x0000, 0x080c, 0xa2ac, 0x080c, 0xa4d6,
+	0x0005, 0x8ec9, 0x8ec9, 0x8ec9, 0x8ecb, 0x8edb, 0x8ec9, 0x8ec9,
+	0x8ec9, 0x8ec9, 0x8ec9, 0x8ec9, 0x8ec9, 0x8ec9, 0x8ec9, 0x8ec9,
+	0x8ec9, 0x080c, 0x0dd5, 0x0036, 0x00e6, 0x2071, 0x19e7, 0x703c,
+	0x9c06, 0x1120, 0x2019, 0x0000, 0x080c, 0xa59c, 0x080c, 0xa7b2,
 	0x00ee, 0x003e, 0x0005, 0x00f6, 0x00e6, 0x601b, 0x0000, 0x6014,
-	0x2048, 0x6010, 0x9005, 0x0128, 0x00b6, 0x2058, 0x080c, 0x8a81,
-	0x00be, 0x2071, 0x193c, 0x080c, 0x86cc, 0x0160, 0x2001, 0x187f,
-	0x2004, 0xa88a, 0x2031, 0x0000, 0x2c78, 0x080c, 0x8643, 0x00ee,
+	0x2048, 0x6010, 0x9005, 0x0128, 0x00b6, 0x2058, 0x080c, 0x8cc9,
+	0x00be, 0x2071, 0x193c, 0x080c, 0x8914, 0x0160, 0x2001, 0x187f,
+	0x2004, 0xa88a, 0x2031, 0x0000, 0x2c78, 0x080c, 0x888b, 0x00ee,
 	0x00fe, 0x0005, 0x0096, 0xa88b, 0x0000, 0xa8a8, 0x2048, 0x080c,
-	0x1032, 0x009e, 0xa8ab, 0x0000, 0x080c, 0x867c, 0x0c80, 0x0000,
+	0x1031, 0x009e, 0xa8ab, 0x0000, 0x080c, 0x88c4, 0x0c80, 0x0000,
 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
 	0x187a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0126,
 	0x2091, 0x8000, 0x0036, 0x0046, 0x20a9, 0x0010, 0x9006, 0x8004,
 	0x2019, 0x0100, 0x231c, 0x93a6, 0x0008, 0x1118, 0x8086, 0x818e,
 	0x0020, 0x80f6, 0x3e00, 0x81f6, 0x3e08, 0x1208, 0x9200, 0x1f04,
-	0x8cd8, 0x93a6, 0x0008, 0x1118, 0x8086, 0x818e, 0x0020, 0x80f6,
+	0x8f20, 0x93a6, 0x0008, 0x1118, 0x8086, 0x818e, 0x0020, 0x80f6,
 	0x3e00, 0x81f6, 0x3e08, 0x004e, 0x003e, 0x012e, 0x0005, 0x0126,
 	0x2091, 0x8000, 0x0076, 0x0156, 0x20a9, 0x0010, 0x9005, 0x0510,
 	0x911a, 0x1600, 0x8213, 0x2039, 0x0100, 0x273c, 0x97be, 0x0008,
 	0x1110, 0x818d, 0x0010, 0x81f5, 0x3e08, 0x0228, 0x911a, 0x1220,
-	0x1f04, 0x8d02, 0x0028, 0x911a, 0x2308, 0x8210, 0x1f04, 0x8d02,
+	0x1f04, 0x8f4a, 0x0028, 0x911a, 0x2308, 0x8210, 0x1f04, 0x8f4a,
 	0x0006, 0x3200, 0x9084, 0xefff, 0x2080, 0x000e, 0x015e, 0x007e,
 	0x012e, 0x0005, 0x0006, 0x3200, 0x9085, 0x1000, 0x0ca8, 0x0126,
-	0x2091, 0x2800, 0x2079, 0x19e5, 0x012e, 0x00d6, 0x2069, 0x19e5,
+	0x2091, 0x2800, 0x2079, 0x19e7, 0x012e, 0x00d6, 0x2069, 0x19e7,
 	0x6803, 0x0005, 0x0156, 0x0146, 0x01d6, 0x20e9, 0x0000, 0x2069,
-	0x0200, 0x080c, 0xa82b, 0x0401, 0x080c, 0xa816, 0x00e9, 0x080c,
-	0xa819, 0x00d1, 0x080c, 0xa81c, 0x00b9, 0x080c, 0xa81f, 0x00a1,
-	0x080c, 0xa822, 0x0089, 0x080c, 0xa825, 0x0071, 0x080c, 0xa828,
+	0x0200, 0x080c, 0xab07, 0x0401, 0x080c, 0xaaf2, 0x00e9, 0x080c,
+	0xaaf5, 0x00d1, 0x080c, 0xaaf8, 0x00b9, 0x080c, 0xaafb, 0x00a1,
+	0x080c, 0xaafe, 0x0089, 0x080c, 0xab01, 0x0071, 0x080c, 0xab04,
 	0x0059, 0x01de, 0x014e, 0x015e, 0x2069, 0x0004, 0x2d04, 0x9085,
 	0x8001, 0x206a, 0x00de, 0x0005, 0x20a9, 0x0020, 0x20a1, 0x0240,
 	0x2001, 0x0000, 0x4004, 0x0005, 0x00c6, 0x6027, 0x0001, 0x7804,
-	0x9084, 0x0007, 0x0002, 0x8d75, 0x8d99, 0x8dd8, 0x8d7b, 0x8d99,
-	0x8d75, 0x8d73, 0x8d73, 0x080c, 0x0dd5, 0x080c, 0x8308, 0x080c,
-	0x941c, 0x00ce, 0x0005, 0x62c0, 0x82ff, 0x1110, 0x00ce, 0x0005,
-	0x2011, 0x5c61, 0x080c, 0x8285, 0x7828, 0x9092, 0x00c8, 0x1228,
-	0x8000, 0x782a, 0x080c, 0x5ca1, 0x0c88, 0x62c0, 0x080c, 0xa967,
-	0x080c, 0x5c61, 0x7807, 0x0003, 0x7827, 0x0000, 0x782b, 0x0000,
-	0x0c28, 0x080c, 0x8308, 0x6220, 0xd2a4, 0x0160, 0x782b, 0x0000,
-	0x7824, 0x9065, 0x090c, 0x0dd5, 0x2009, 0x0013, 0x080c, 0xabe6,
+	0x9084, 0x0007, 0x0002, 0x8fbd, 0x8fe1, 0x9020, 0x8fc3, 0x8fe1,
+	0x8fbd, 0x8fbb, 0x8fbb, 0x080c, 0x0dd5, 0x080c, 0x8550, 0x080c,
+	0x9664, 0x00ce, 0x0005, 0x62c0, 0x82ff, 0x1110, 0x00ce, 0x0005,
+	0x2011, 0x5e84, 0x080c, 0x84ca, 0x7828, 0x9092, 0x00c8, 0x1228,
+	0x8000, 0x782a, 0x080c, 0x5ec4, 0x0c88, 0x62c0, 0x080c, 0xac43,
+	0x080c, 0x5e84, 0x7807, 0x0003, 0x7827, 0x0000, 0x782b, 0x0000,
+	0x0c28, 0x080c, 0x8550, 0x6220, 0xd2a4, 0x0160, 0x782b, 0x0000,
+	0x7824, 0x9065, 0x090c, 0x0dd5, 0x2009, 0x0013, 0x080c, 0xaec2,
 	0x00ce, 0x0005, 0x00c6, 0x7824, 0x9065, 0x090c, 0x0dd5, 0x7828,
-	0x9092, 0xc350, 0x12c0, 0x8000, 0x782a, 0x00ce, 0x080c, 0x2a57,
+	0x9092, 0xc350, 0x12c0, 0x8000, 0x782a, 0x00ce, 0x080c, 0x2ba5,
 	0x0278, 0x00c6, 0x7924, 0x2160, 0x6010, 0x906d, 0x090c, 0x0dd5,
-	0x7807, 0x0000, 0x7827, 0x0000, 0x00ce, 0x080c, 0x941c, 0x0c00,
-	0x080c, 0x9fd8, 0x08e8, 0x2011, 0x0130, 0x2214, 0x080c, 0xa967,
-	0x080c, 0xe6a1, 0x2009, 0x0014, 0x080c, 0xabe6, 0x00ce, 0x0880,
-	0x2001, 0x1a01, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160, 0x782b,
+	0x7807, 0x0000, 0x7827, 0x0000, 0x00ce, 0x080c, 0x9664, 0x0c00,
+	0x080c, 0xa235, 0x08e8, 0x2011, 0x0130, 0x2214, 0x080c, 0xac43,
+	0x080c, 0xe9dd, 0x2009, 0x0014, 0x080c, 0xaec2, 0x00ce, 0x0880,
+	0x2001, 0x1a03, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160, 0x782b,
 	0x0000, 0x7824, 0x9065, 0x090c, 0x0dd5, 0x2009, 0x0013, 0x080c,
-	0xac38, 0x00ce, 0x0005, 0x00b6, 0x00c6, 0x00d6, 0x7824, 0x9005,
+	0xaf14, 0x00ce, 0x0005, 0x00b6, 0x00c6, 0x00d6, 0x7824, 0x9005,
 	0x090c, 0x0dd5, 0x7828, 0x9092, 0xc350, 0x1648, 0x8000, 0x782a,
-	0x00de, 0x00ce, 0x00be, 0x080c, 0x2a57, 0x02f0, 0x00b6, 0x00c6,
+	0x00de, 0x00ce, 0x00be, 0x080c, 0x2ba5, 0x02f0, 0x00b6, 0x00c6,
 	0x00d6, 0x781c, 0x905d, 0x090c, 0x0dd5, 0xb800, 0xc0dc, 0xb802,
-	0x7924, 0x2160, 0x080c, 0xab6b, 0xb93c, 0x81ff, 0x090c, 0x0dd5,
+	0x7924, 0x2160, 0x080c, 0xae47, 0xb93c, 0x81ff, 0x090c, 0x0dd5,
 	0x8109, 0xb93e, 0x7807, 0x0000, 0x7827, 0x0000, 0x00de, 0x00ce,
-	0x00be, 0x080c, 0x941c, 0x0868, 0x080c, 0x9fd8, 0x0850, 0x2011,
-	0x0130, 0x2214, 0x080c, 0xa967, 0x080c, 0xe6a1, 0x7824, 0x9065,
-	0x2009, 0x0014, 0x080c, 0xabe6, 0x00de, 0x00ce, 0x00be, 0x0804,
-	0x8de9, 0x00c6, 0x2001, 0x009b, 0x2004, 0xd0fc, 0x190c, 0x1d8c,
+	0x00be, 0x080c, 0x9664, 0x0868, 0x080c, 0xa235, 0x0850, 0x2011,
+	0x0130, 0x2214, 0x080c, 0xac43, 0x080c, 0xe9dd, 0x7824, 0x9065,
+	0x2009, 0x0014, 0x080c, 0xaec2, 0x00de, 0x00ce, 0x00be, 0x0804,
+	0x9031, 0x00c6, 0x2001, 0x009b, 0x2004, 0xd0fc, 0x190c, 0x1eb4,
 	0x6024, 0x6027, 0x0002, 0xd0f4, 0x15b8, 0x62c8, 0x60c4, 0x9205,
-	0x1170, 0x783c, 0x9065, 0x0130, 0x2009, 0x0049, 0x080c, 0xabe6,
-	0x00ce, 0x0005, 0x2011, 0x1a04, 0x2013, 0x0000, 0x0cc8, 0x793c,
+	0x1170, 0x783c, 0x9065, 0x0130, 0x2009, 0x0049, 0x080c, 0xaec2,
+	0x00ce, 0x0005, 0x2011, 0x1a06, 0x2013, 0x0000, 0x0cc8, 0x793c,
 	0x81ff, 0x0dc0, 0x7944, 0x9192, 0x7530, 0x1628, 0x8108, 0x7946,
 	0x793c, 0x9188, 0x0008, 0x210c, 0x918e, 0x0006, 0x1138, 0x6014,
 	0x9084, 0x1984, 0x9085, 0x0012, 0x6016, 0x0c10, 0x793c, 0x9188,
 	0x0008, 0x210c, 0x918e, 0x0009, 0x0d90, 0x6014, 0x9084, 0x1984,
 	0x9085, 0x0016, 0x6016, 0x08a0, 0x793c, 0x2160, 0x2009, 0x004a,
-	0x080c, 0xabe6, 0x0868, 0x7848, 0xc085, 0x784a, 0x0848, 0x0006,
+	0x080c, 0xaec2, 0x0868, 0x7848, 0xc085, 0x784a, 0x0848, 0x0006,
 	0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08,
-	0x2061, 0x19e5, 0x6020, 0x8000, 0x6022, 0x6010, 0x9005, 0x0148,
+	0x2061, 0x19e7, 0x6020, 0x8000, 0x6022, 0x6010, 0x9005, 0x0148,
 	0x9080, 0x0003, 0x2102, 0x6112, 0x012e, 0x00ce, 0x001e, 0x000e,
-	0x0005, 0x6116, 0x6112, 0x0cc0, 0x00d6, 0x2069, 0x19e5, 0xb800,
+	0x0005, 0x6116, 0x6112, 0x0cc0, 0x00d6, 0x2069, 0x19e7, 0xb800,
 	0xd0d4, 0x0168, 0x6820, 0x8000, 0x6822, 0x9086, 0x0001, 0x1110,
-	0x2b00, 0x681e, 0x00de, 0x0804, 0x941c, 0x00de, 0x0005, 0xc0d5,
+	0x2b00, 0x681e, 0x00de, 0x0804, 0x9664, 0x00de, 0x0005, 0xc0d5,
 	0xb802, 0x6818, 0x9005, 0x0168, 0xb856, 0xb85b, 0x0000, 0x0086,
-	0x0006, 0x2b00, 0x681a, 0x008e, 0xa05a, 0x008e, 0x2069, 0x19e5,
+	0x0006, 0x2b00, 0x681a, 0x008e, 0xa05a, 0x008e, 0x2069, 0x19e7,
 	0x0c08, 0xb856, 0xb85a, 0x2b00, 0x681a, 0x681e, 0x08d8, 0x0006,
 	0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08,
-	0x2061, 0x19e5, 0x6020, 0x8000, 0x6022, 0x6008, 0x9005, 0x0148,
+	0x2061, 0x19e7, 0x6020, 0x8000, 0x6022, 0x6008, 0x9005, 0x0148,
 	0x9080, 0x0003, 0x2102, 0x610a, 0x012e, 0x00ce, 0x001e, 0x000e,
 	0x0005, 0x610e, 0x610a, 0x0cc0, 0x00c6, 0x600f, 0x0000, 0x2c08,
-	0x2061, 0x19e5, 0x6034, 0x9005, 0x0130, 0x9080, 0x0003, 0x2102,
+	0x2061, 0x19e7, 0x6034, 0x9005, 0x0130, 0x9080, 0x0003, 0x2102,
 	0x6136, 0x00ce, 0x0005, 0x613a, 0x6136, 0x00ce, 0x0005, 0x00f6,
 	0x00e6, 0x00d6, 0x00c6, 0x00b6, 0x0096, 0x0076, 0x0066, 0x0056,
-	0x0036, 0x0026, 0x0016, 0x0006, 0x0126, 0x902e, 0x2071, 0x19e5,
-	0x7638, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0904, 0x8f6e,
-	0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x8f69, 0x87ff, 0x0120,
-	0x6054, 0x9106, 0x1904, 0x8f69, 0x703c, 0x9c06, 0x1178, 0x0036,
-	0x2019, 0x0001, 0x080c, 0xa2ac, 0x7033, 0x0000, 0x9006, 0x703e,
+	0x0036, 0x0026, 0x0016, 0x0006, 0x0126, 0x902e, 0x2071, 0x19e7,
+	0x7638, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0904, 0x91b6,
+	0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x91b1, 0x87ff, 0x0120,
+	0x6054, 0x9106, 0x1904, 0x91b1, 0x703c, 0x9c06, 0x1178, 0x0036,
+	0x2019, 0x0001, 0x080c, 0xa59c, 0x7033, 0x0000, 0x9006, 0x703e,
 	0x7042, 0x7046, 0x704a, 0x003e, 0x2029, 0x0001, 0x7038, 0x9c36,
 	0x1110, 0x660c, 0x763a, 0x7034, 0x9c36, 0x1140, 0x2c00, 0x9f36,
 	0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000, 0x660c, 0x0066,
 	0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000,
-	0x080c, 0xc825, 0x01c8, 0x6014, 0x2048, 0x6020, 0x9086, 0x0003,
+	0x080c, 0xcb1b, 0x01c8, 0x6014, 0x2048, 0x6020, 0x9086, 0x0003,
 	0x1590, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036,
-	0x0076, 0x080c, 0xcb0d, 0x080c, 0xe5d5, 0x080c, 0x6a46, 0x007e,
-	0x003e, 0x001e, 0x080c, 0xca07, 0x080c, 0xab9c, 0x00ce, 0x0804,
-	0x8f0d, 0x2c78, 0x600c, 0x2060, 0x0804, 0x8f0d, 0x85ff, 0x0120,
-	0x0036, 0x080c, 0x9548, 0x003e, 0x012e, 0x000e, 0x001e, 0x002e,
+	0x0076, 0x080c, 0xce0a, 0x080c, 0xe8e7, 0x080c, 0x6c79, 0x007e,
+	0x003e, 0x001e, 0x080c, 0xcd04, 0x080c, 0xae78, 0x00ce, 0x0804,
+	0x9155, 0x2c78, 0x600c, 0x2060, 0x0804, 0x9155, 0x85ff, 0x0120,
+	0x0036, 0x080c, 0x9790, 0x003e, 0x012e, 0x000e, 0x001e, 0x002e,
 	0x003e, 0x005e, 0x006e, 0x007e, 0x009e, 0x00be, 0x00ce, 0x00de,
 	0x00ee, 0x00fe, 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, 0x0016,
-	0x0036, 0x0076, 0x080c, 0xe5d5, 0x080c, 0xe223, 0x007e, 0x003e,
+	0x0036, 0x0076, 0x080c, 0xe8e7, 0x080c, 0xe530, 0x007e, 0x003e,
 	0x001e, 0x0890, 0x6020, 0x9086, 0x0009, 0x1168, 0xa87b, 0x0006,
-	0x0016, 0x0036, 0x0076, 0x080c, 0x6a46, 0x080c, 0xab6b, 0x007e,
-	0x003e, 0x001e, 0x0818, 0x6020, 0x9086, 0x000a, 0x0904, 0x8f53,
-	0x0804, 0x8f51, 0x0006, 0x0066, 0x0096, 0x00c6, 0x00d6, 0x00f6,
-	0x9036, 0x0126, 0x2091, 0x8000, 0x2079, 0x19e5, 0x7838, 0x9065,
-	0x0904, 0x8ffa, 0x600c, 0x0006, 0x600f, 0x0000, 0x783c, 0x9c06,
-	0x1168, 0x0036, 0x2019, 0x0001, 0x080c, 0xa2ac, 0x7833, 0x0000,
-	0x901e, 0x7b3e, 0x7b42, 0x7b46, 0x7b4a, 0x003e, 0x080c, 0xc825,
+	0x0016, 0x0036, 0x0076, 0x080c, 0x6c79, 0x080c, 0xae47, 0x007e,
+	0x003e, 0x001e, 0x0818, 0x6020, 0x9086, 0x000a, 0x0904, 0x919b,
+	0x0804, 0x9199, 0x0006, 0x0066, 0x0096, 0x00c6, 0x00d6, 0x00f6,
+	0x9036, 0x0126, 0x2091, 0x8000, 0x2079, 0x19e7, 0x7838, 0x9065,
+	0x0904, 0x9242, 0x600c, 0x0006, 0x600f, 0x0000, 0x783c, 0x9c06,
+	0x1168, 0x0036, 0x2019, 0x0001, 0x080c, 0xa59c, 0x7833, 0x0000,
+	0x901e, 0x7b3e, 0x7b42, 0x7b46, 0x7b4a, 0x003e, 0x080c, 0xcb1b,
 	0x0520, 0x6014, 0x2048, 0x6020, 0x9086, 0x0003, 0x1568, 0x3e08,
 	0x918e, 0x0002, 0x1188, 0x6010, 0x9005, 0x0170, 0x00b6, 0x2058,
 	0xb800, 0x00be, 0xd0bc, 0x0140, 0x6040, 0x9005, 0x1180, 0x2001,
-	0x1986, 0x2004, 0x6042, 0x0058, 0xa867, 0x0103, 0xab7a, 0xa877,
-	0x0000, 0x080c, 0x6a3a, 0x080c, 0xca07, 0x080c, 0xab9c, 0x000e,
-	0x0804, 0x8fb7, 0x7e3a, 0x7e36, 0x012e, 0x00fe, 0x00de, 0x00ce,
+	0x1988, 0x2004, 0x6042, 0x0058, 0xa867, 0x0103, 0xab7a, 0xa877,
+	0x0000, 0x080c, 0x6c6d, 0x080c, 0xcd04, 0x080c, 0xae78, 0x000e,
+	0x0804, 0x91ff, 0x7e3a, 0x7e36, 0x012e, 0x00fe, 0x00de, 0x00ce,
 	0x009e, 0x006e, 0x000e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1118,
-	0x080c, 0xe223, 0x0c50, 0x6020, 0x9086, 0x0009, 0x1130, 0xab7a,
-	0x080c, 0x6a46, 0x080c, 0xab6b, 0x0c10, 0x6020, 0x9086, 0x000a,
+	0x080c, 0xe530, 0x0c50, 0x6020, 0x9086, 0x0009, 0x1130, 0xab7a,
+	0x080c, 0x6c79, 0x080c, 0xae47, 0x0c10, 0x6020, 0x9086, 0x000a,
 	0x09a8, 0x0890, 0x0016, 0x0026, 0x0086, 0x9046, 0x0099, 0x080c,
-	0x9103, 0x008e, 0x002e, 0x001e, 0x0005, 0x00f6, 0x0126, 0x2079,
-	0x19e5, 0x2091, 0x8000, 0x080c, 0x919a, 0x080c, 0x9228, 0x012e,
+	0x934b, 0x008e, 0x002e, 0x001e, 0x0005, 0x00f6, 0x0126, 0x2079,
+	0x19e7, 0x2091, 0x8000, 0x080c, 0x93e2, 0x080c, 0x9470, 0x012e,
 	0x00fe, 0x0005, 0x00b6, 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6,
-	0x0066, 0x0016, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e5,
-	0x7614, 0x2660, 0x2678, 0x8cff, 0x0904, 0x90c8, 0x6010, 0x2058,
-	0xb8a0, 0x9206, 0x1904, 0x90c3, 0x88ff, 0x0120, 0x6054, 0x9106,
-	0x1904, 0x90c3, 0x7024, 0x9c06, 0x1558, 0x2069, 0x0100, 0x6820,
-	0xd0a4, 0x1508, 0x080c, 0x8308, 0x080c, 0x9ffc, 0x68c3, 0x0000,
-	0x080c, 0xa4c6, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04,
-	0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2ba1, 0x9006,
-	0x080c, 0x2ba1, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827,
-	0x0001, 0x003e, 0x0028, 0x6003, 0x0009, 0x630a, 0x0804, 0x90c3,
+	0x0066, 0x0016, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e7,
+	0x7614, 0x2660, 0x2678, 0x8cff, 0x0904, 0x9310, 0x6010, 0x2058,
+	0xb8a0, 0x9206, 0x1904, 0x930b, 0x88ff, 0x0120, 0x6054, 0x9106,
+	0x1904, 0x930b, 0x7024, 0x9c06, 0x1558, 0x2069, 0x0100, 0x6820,
+	0xd0a4, 0x1508, 0x080c, 0x8550, 0x080c, 0xa259, 0x68c3, 0x0000,
+	0x080c, 0xa7a2, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04,
+	0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2cef, 0x9006,
+	0x080c, 0x2cef, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827,
+	0x0001, 0x003e, 0x0028, 0x6003, 0x0009, 0x630a, 0x0804, 0x930b,
 	0x7014, 0x9c36, 0x1110, 0x660c, 0x7616, 0x7010, 0x9c36, 0x1140,
 	0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, 0x0000,
 	0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678,
-	0x600f, 0x0000, 0x6014, 0x2048, 0x080c, 0xc825, 0x01e8, 0x6020,
-	0x9086, 0x0003, 0x1580, 0x080c, 0xca24, 0x1118, 0x080c, 0xb51d,
+	0x600f, 0x0000, 0x6014, 0x2048, 0x080c, 0xcb1b, 0x01e8, 0x6020,
+	0x9086, 0x0003, 0x1580, 0x080c, 0xcd21, 0x1118, 0x080c, 0xb7f9,
 	0x0098, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036,
-	0x0086, 0x080c, 0xcb0d, 0x080c, 0xe5d5, 0x080c, 0x6a46, 0x008e,
-	0x003e, 0x001e, 0x080c, 0xca07, 0x080c, 0xab9c, 0x080c, 0xa39c,
-	0x00ce, 0x0804, 0x9043, 0x2c78, 0x600c, 0x2060, 0x0804, 0x9043,
+	0x0086, 0x080c, 0xce0a, 0x080c, 0xe8e7, 0x080c, 0x6c79, 0x008e,
+	0x003e, 0x001e, 0x080c, 0xcd04, 0x080c, 0xae78, 0x080c, 0xa678,
+	0x00ce, 0x0804, 0x928b, 0x2c78, 0x600c, 0x2060, 0x0804, 0x928b,
 	0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe,
 	0x009e, 0x00be, 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, 0x0016,
-	0x0036, 0x0086, 0x080c, 0xe5d5, 0x080c, 0xe223, 0x008e, 0x003e,
-	0x001e, 0x08d0, 0x080c, 0xb51d, 0x6020, 0x9086, 0x0002, 0x1160,
-	0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0904, 0x90a9, 0x9086,
-	0x008b, 0x0904, 0x90a9, 0x0840, 0x6020, 0x9086, 0x0005, 0x1920,
+	0x0036, 0x0086, 0x080c, 0xe8e7, 0x080c, 0xe530, 0x008e, 0x003e,
+	0x001e, 0x08d0, 0x080c, 0xb7f9, 0x6020, 0x9086, 0x0002, 0x1160,
+	0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0904, 0x92f1, 0x9086,
+	0x008b, 0x0904, 0x92f1, 0x0840, 0x6020, 0x9086, 0x0005, 0x1920,
 	0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x09c8, 0x9086, 0x008b,
-	0x09b0, 0x0804, 0x90bc, 0x00b6, 0x00a6, 0x0096, 0x00c6, 0x0006,
+	0x09b0, 0x0804, 0x9304, 0x00b6, 0x00a6, 0x0096, 0x00c6, 0x0006,
 	0x0126, 0x2091, 0x8000, 0x9280, 0x1000, 0x2004, 0x905d, 0x0904,
-	0x9193, 0x00f6, 0x00e6, 0x00d6, 0x0066, 0x2071, 0x19e5, 0xbe54,
+	0x93db, 0x00f6, 0x00e6, 0x00d6, 0x0066, 0x2071, 0x19e7, 0xbe54,
 	0x7018, 0x9b06, 0x1108, 0x761a, 0x701c, 0x9b06, 0x1130, 0x86ff,
 	0x1118, 0x7018, 0x701e, 0x0008, 0x761e, 0xb858, 0x904d, 0x0108,
 	0xae56, 0x96d5, 0x0000, 0x0110, 0x2900, 0xb05a, 0xb857, 0x0000,
-	0xb85b, 0x0000, 0xb800, 0xc0d4, 0xc0dc, 0xb802, 0x080c, 0x62ff,
-	0x0904, 0x918f, 0x7624, 0x86ff, 0x0904, 0x917e, 0x9680, 0x0005,
+	0xb85b, 0x0000, 0xb800, 0xc0d4, 0xc0dc, 0xb802, 0x080c, 0x6532,
+	0x0904, 0x93d7, 0x7624, 0x86ff, 0x0904, 0x93c6, 0x9680, 0x0005,
 	0x2004, 0x9906, 0x15d8, 0x00d6, 0x2069, 0x0100, 0x68c0, 0x9005,
-	0x0560, 0x080c, 0x8308, 0x080c, 0x9ffc, 0x68c3, 0x0000, 0x080c,
-	0xa4c6, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384,
-	0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2ba1, 0x9006, 0x080c,
-	0x2ba1, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001,
+	0x0560, 0x080c, 0x8550, 0x080c, 0xa259, 0x68c3, 0x0000, 0x080c,
+	0xa7a2, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384,
+	0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2cef, 0x9006, 0x080c,
+	0x2cef, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001,
 	0x003e, 0x00de, 0x00c6, 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e,
-	0x2660, 0x080c, 0xab9c, 0x00ce, 0x0048, 0x00de, 0x00c6, 0x2660,
-	0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x9136, 0x89ff, 0x0158,
-	0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xcb0d, 0x080c,
-	0xe5d5, 0x080c, 0x6a46, 0x080c, 0xa39c, 0x0804, 0x9136, 0x006e,
+	0x2660, 0x080c, 0xae78, 0x00ce, 0x0048, 0x00de, 0x00c6, 0x2660,
+	0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x937e, 0x89ff, 0x0158,
+	0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xce0a, 0x080c,
+	0xe8e7, 0x080c, 0x6c79, 0x080c, 0xa678, 0x0804, 0x937e, 0x006e,
 	0x00de, 0x00ee, 0x00fe, 0x012e, 0x000e, 0x00ce, 0x009e, 0x00ae,
 	0x00be, 0x0005, 0x0096, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x9036,
-	0x7814, 0x9065, 0x0904, 0x91fb, 0x600c, 0x0006, 0x600f, 0x0000,
+	0x7814, 0x9065, 0x0904, 0x9443, 0x600c, 0x0006, 0x600f, 0x0000,
 	0x7824, 0x9c06, 0x1570, 0x2069, 0x0100, 0x6820, 0xd0a4, 0x1508,
-	0x080c, 0x8308, 0x080c, 0x9ffc, 0x68c3, 0x0000, 0x080c, 0xa4c6,
+	0x080c, 0x8550, 0x080c, 0xa259, 0x68c3, 0x0000, 0x080c, 0xa7a2,
 	0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000,
-	0x0138, 0x2001, 0x0100, 0x080c, 0x2ba1, 0x9006, 0x080c, 0x2ba1,
+	0x0138, 0x2001, 0x0100, 0x080c, 0x2cef, 0x9006, 0x080c, 0x2cef,
 	0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e,
-	0x0040, 0x080c, 0x66cf, 0x1520, 0x6003, 0x0009, 0x630a, 0x2c30,
-	0x00f8, 0x6014, 0x2048, 0x080c, 0xc823, 0x01b0, 0x6020, 0x9086,
-	0x0003, 0x1508, 0x080c, 0xca24, 0x1118, 0x080c, 0xb51d, 0x0060,
-	0x080c, 0x66cf, 0x1168, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000,
-	0x080c, 0x6a46, 0x080c, 0xca07, 0x080c, 0xab9c, 0x080c, 0xa39c,
-	0x000e, 0x0804, 0x91a1, 0x7e16, 0x7e12, 0x00de, 0x00ce, 0x006e,
+	0x0040, 0x080c, 0x6902, 0x1520, 0x6003, 0x0009, 0x630a, 0x2c30,
+	0x00f8, 0x6014, 0x2048, 0x080c, 0xcb19, 0x01b0, 0x6020, 0x9086,
+	0x0003, 0x1508, 0x080c, 0xcd21, 0x1118, 0x080c, 0xb7f9, 0x0060,
+	0x080c, 0x6902, 0x1168, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000,
+	0x080c, 0x6c79, 0x080c, 0xcd04, 0x080c, 0xae78, 0x080c, 0xa678,
+	0x000e, 0x0804, 0x93e9, 0x7e16, 0x7e12, 0x00de, 0x00ce, 0x006e,
 	0x000e, 0x009e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1118, 0x080c,
-	0xe223, 0x0c50, 0x080c, 0xb51d, 0x6020, 0x9086, 0x0002, 0x1150,
+	0xe530, 0x0c50, 0x080c, 0xb7f9, 0x6020, 0x9086, 0x0002, 0x1150,
 	0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0990, 0x9086, 0x008b,
 	0x0978, 0x08d0, 0x6020, 0x9086, 0x0005, 0x19b0, 0x6004, 0x0006,
 	0x9086, 0x0085, 0x000e, 0x0d18, 0x9086, 0x008b, 0x0d00, 0x0860,
 	0x0006, 0x0066, 0x0096, 0x00b6, 0x00c6, 0x00d6, 0x7818, 0x905d,
-	0x0904, 0x92a8, 0xb854, 0x0006, 0x9006, 0xb856, 0xb85a, 0xb800,
-	0xc0d4, 0xc0dc, 0xb802, 0x080c, 0x62ff, 0x0904, 0x92a5, 0x7e24,
-	0x86ff, 0x0904, 0x9298, 0x9680, 0x0005, 0x2004, 0x9906, 0x1904,
-	0x9298, 0x00d6, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x928f,
-	0x080c, 0x8308, 0x080c, 0x9ffc, 0x68c3, 0x0000, 0x080c, 0xa4c6,
+	0x0904, 0x94f0, 0xb854, 0x0006, 0x9006, 0xb856, 0xb85a, 0xb800,
+	0xc0d4, 0xc0dc, 0xb802, 0x080c, 0x6532, 0x0904, 0x94ed, 0x7e24,
+	0x86ff, 0x0904, 0x94e0, 0x9680, 0x0005, 0x2004, 0x9906, 0x1904,
+	0x94e0, 0x00d6, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x94d7,
+	0x080c, 0x8550, 0x080c, 0xa259, 0x68c3, 0x0000, 0x080c, 0xa7a2,
 	0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000,
-	0x0138, 0x2001, 0x0100, 0x080c, 0x2ba1, 0x9006, 0x080c, 0x2ba1,
+	0x0138, 0x2001, 0x0100, 0x080c, 0x2cef, 0x9006, 0x080c, 0x2cef,
 	0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e,
 	0x00de, 0x00c6, 0x3e08, 0x918e, 0x0002, 0x1168, 0xb800, 0xd0bc,
-	0x0150, 0x9680, 0x0010, 0x200c, 0x81ff, 0x1518, 0x2009, 0x1986,
+	0x0150, 0x9680, 0x0010, 0x200c, 0x81ff, 0x1518, 0x2009, 0x1988,
 	0x210c, 0x2102, 0x00f0, 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e,
-	0x2660, 0x600f, 0x0000, 0x080c, 0xab9c, 0x00ce, 0x0048, 0x00de,
-	0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x923b,
+	0x2660, 0x600f, 0x0000, 0x080c, 0xae78, 0x00ce, 0x0048, 0x00de,
+	0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x9483,
 	0x89ff, 0x0138, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c,
-	0x6a46, 0x080c, 0xa39c, 0x0804, 0x923b, 0x000e, 0x0804, 0x922f,
+	0x6c79, 0x080c, 0xa678, 0x0804, 0x9483, 0x000e, 0x0804, 0x9477,
 	0x781e, 0x781a, 0x00de, 0x00ce, 0x00be, 0x009e, 0x006e, 0x000e,
 	0x0005, 0x00e6, 0x00d6, 0x0096, 0x0066, 0xb800, 0xd0dc, 0x01a0,
-	0xb84c, 0x904d, 0x0188, 0xa878, 0x9606, 0x1170, 0x2071, 0x19e5,
+	0xb84c, 0x904d, 0x0188, 0xa878, 0x9606, 0x1170, 0x2071, 0x19e7,
 	0x7024, 0x9035, 0x0148, 0x9080, 0x0005, 0x2004, 0x9906, 0x1120,
 	0xb800, 0xc0dc, 0xb802, 0x0029, 0x006e, 0x009e, 0x00de, 0x00ee,
 	0x0005, 0x00f6, 0x2079, 0x0100, 0x78c0, 0x9005, 0x1138, 0x00c6,
-	0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x04b8, 0x080c, 0x9ffc,
-	0x78c3, 0x0000, 0x080c, 0xa4c6, 0x7027, 0x0000, 0x0036, 0x2079,
+	0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x04b8, 0x080c, 0xa259,
+	0x78c3, 0x0000, 0x080c, 0xa7a2, 0x7027, 0x0000, 0x0036, 0x2079,
 	0x0140, 0x7b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c,
-	0x2ba1, 0x9006, 0x080c, 0x2ba1, 0x2079, 0x0100, 0x7824, 0xd084,
-	0x0110, 0x7827, 0x0001, 0x080c, 0xa4c6, 0x003e, 0x080c, 0x62ff,
+	0x2cef, 0x9006, 0x080c, 0x2cef, 0x2079, 0x0100, 0x7824, 0xd084,
+	0x0110, 0x7827, 0x0001, 0x080c, 0xa7a2, 0x003e, 0x080c, 0x6532,
 	0x00c6, 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, 0x2660, 0x080c,
-	0xab6b, 0x00ce, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c,
-	0xcb0d, 0x080c, 0x6a46, 0x080c, 0xa39c, 0x00fe, 0x0005, 0x00b6,
+	0xae47, 0x00ce, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c,
+	0xce0a, 0x080c, 0x6c79, 0x080c, 0xa678, 0x00fe, 0x0005, 0x00b6,
 	0x00e6, 0x00c6, 0x2011, 0x0101, 0x2204, 0xc0c4, 0x2012, 0x2001,
-	0x180c, 0x2014, 0xc2e4, 0x2202, 0x2071, 0x19e5, 0x7004, 0x9084,
-	0x0007, 0x0002, 0x9334, 0x9338, 0x934f, 0x9378, 0x93b6, 0x9334,
-	0x934f, 0x9332, 0x080c, 0x0dd5, 0x00ce, 0x00ee, 0x00be, 0x0005,
+	0x180c, 0x2014, 0xc2e4, 0x2202, 0x2071, 0x19e7, 0x7004, 0x9084,
+	0x0007, 0x0002, 0x957c, 0x9580, 0x9597, 0x95c0, 0x95fe, 0x957c,
+	0x9597, 0x957a, 0x080c, 0x0dd5, 0x00ce, 0x00ee, 0x00be, 0x0005,
 	0x7024, 0x9065, 0x0148, 0x7020, 0x8001, 0x7022, 0x600c, 0x9015,
 	0x0158, 0x7216, 0x600f, 0x0000, 0x7007, 0x0000, 0x7027, 0x0000,
 	0x00ce, 0x00ee, 0x00be, 0x0005, 0x7216, 0x7212, 0x0ca8, 0x6010,
-	0x2058, 0x080c, 0x62ff, 0xb800, 0xc0dc, 0xb802, 0x7007, 0x0000,
+	0x2058, 0x080c, 0x6532, 0xb800, 0xc0dc, 0xb802, 0x7007, 0x0000,
 	0x7027, 0x0000, 0x7020, 0x8001, 0x7022, 0x1148, 0x2001, 0x180c,
 	0x2014, 0xd2ec, 0x1180, 0x00ce, 0x00ee, 0x00be, 0x0005, 0xb854,
-	0x9015, 0x0120, 0x721e, 0x080c, 0x941c, 0x0ca8, 0x7218, 0x721e,
-	0x080c, 0x941c, 0x0c80, 0xc2ec, 0x2202, 0x080c, 0x9548, 0x0c58,
-	0x7024, 0x9065, 0x05b8, 0x700c, 0x9c06, 0x1160, 0x080c, 0xa39c,
+	0x9015, 0x0120, 0x721e, 0x080c, 0x9664, 0x0ca8, 0x7218, 0x721e,
+	0x080c, 0x9664, 0x0c80, 0xc2ec, 0x2202, 0x080c, 0x9790, 0x0c58,
+	0x7024, 0x9065, 0x05b8, 0x700c, 0x9c06, 0x1160, 0x080c, 0xa678,
 	0x600c, 0x9015, 0x0120, 0x720e, 0x600f, 0x0000, 0x0448, 0x720e,
-	0x720a, 0x0430, 0x7014, 0x9c06, 0x1160, 0x080c, 0xa39c, 0x600c,
+	0x720a, 0x0430, 0x7014, 0x9c06, 0x1160, 0x080c, 0xa678, 0x600c,
 	0x9015, 0x0120, 0x7216, 0x600f, 0x0000, 0x00d0, 0x7216, 0x7212,
 	0x00b8, 0x6020, 0x9086, 0x0003, 0x1198, 0x6010, 0x2058, 0x080c,
-	0x62ff, 0xb800, 0xc0dc, 0xb802, 0x080c, 0xa39c, 0x701c, 0x9065,
+	0x6532, 0xb800, 0xc0dc, 0xb802, 0x080c, 0xa678, 0x701c, 0x9065,
 	0x0138, 0xb854, 0x9015, 0x0110, 0x721e, 0x0010, 0x7218, 0x721e,
 	0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x7024, 0x9065,
-	0x0140, 0x080c, 0xa39c, 0x600c, 0x9015, 0x0158, 0x720e, 0x600f,
-	0x0000, 0x080c, 0xa4c6, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be,
-	0x0005, 0x720e, 0x720a, 0x0ca8, 0x00d6, 0x2069, 0x19e5, 0x6830,
-	0x9084, 0x0003, 0x0002, 0x93d9, 0x93db, 0x93ff, 0x93d7, 0x080c,
+	0x0140, 0x080c, 0xa678, 0x600c, 0x9015, 0x0158, 0x720e, 0x600f,
+	0x0000, 0x080c, 0xa7a2, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be,
+	0x0005, 0x720e, 0x720a, 0x0ca8, 0x00d6, 0x2069, 0x19e7, 0x6830,
+	0x9084, 0x0003, 0x0002, 0x9621, 0x9623, 0x9647, 0x961f, 0x080c,
 	0x0dd5, 0x00de, 0x0005, 0x00c6, 0x6840, 0x9086, 0x0001, 0x01b8,
 	0x683c, 0x9065, 0x0130, 0x600c, 0x9015, 0x0170, 0x6a3a, 0x600f,
-	0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x2011, 0x1a04, 0x2013,
+	0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x2011, 0x1a06, 0x2013,
 	0x0000, 0x00ce, 0x00de, 0x0005, 0x683a, 0x6836, 0x0c90, 0x6843,
 	0x0000, 0x6838, 0x9065, 0x0d68, 0x6003, 0x0003, 0x0c50, 0x00c6,
 	0x9006, 0x6842, 0x6846, 0x684a, 0x683c, 0x9065, 0x0160, 0x600c,
 	0x9015, 0x0130, 0x6a3a, 0x600f, 0x0000, 0x683f, 0x0000, 0x0018,
 	0x683e, 0x683a, 0x6836, 0x00ce, 0x00de, 0x0005, 0x2001, 0x180c,
 	0x200c, 0xc1e5, 0x2102, 0x0005, 0x2001, 0x180c, 0x200c, 0xd1ec,
-	0x0120, 0xc1ec, 0x2102, 0x080c, 0x9548, 0x2001, 0x19f1, 0x2004,
-	0x9086, 0x0001, 0x0d58, 0x00d6, 0x2069, 0x19e5, 0x6804, 0x9084,
+	0x0120, 0xc1ec, 0x2102, 0x080c, 0x9790, 0x2001, 0x19f3, 0x2004,
+	0x9086, 0x0001, 0x0d58, 0x00d6, 0x2069, 0x19e7, 0x6804, 0x9084,
 	0x0007, 0x0006, 0x9005, 0x11c8, 0x2001, 0x1837, 0x2004, 0x9084,
 	0x0028, 0x1198, 0x2001, 0x197c, 0x2004, 0x9086, 0xaaaa, 0x0168,
 	0x2001, 0x188b, 0x2004, 0xd08c, 0x1118, 0xd084, 0x1118, 0x0028,
-	0x080c, 0x9548, 0x000e, 0x00de, 0x0005, 0x000e, 0x0002, 0x9459,
-	0x9516, 0x9516, 0x9516, 0x9516, 0x9518, 0x9516, 0x9457, 0x080c,
+	0x080c, 0x9790, 0x000e, 0x00de, 0x0005, 0x000e, 0x0002, 0x96a1,
+	0x975e, 0x975e, 0x975e, 0x975e, 0x9760, 0x975e, 0x969f, 0x080c,
 	0x0dd5, 0x6820, 0x9005, 0x1110, 0x00de, 0x0005, 0x00c6, 0x680c,
 	0x9065, 0x0520, 0x6114, 0x0096, 0x2148, 0xa964, 0x009e, 0x918c,
 	0x00ff, 0x918e, 0x0035, 0x1180, 0x2009, 0x1837, 0x210c, 0x918c,
-	0x0028, 0x1150, 0x080c, 0x717d, 0x0138, 0x0006, 0x2009, 0x188b,
+	0x0028, 0x1150, 0x080c, 0x73b0, 0x0138, 0x0006, 0x2009, 0x188b,
 	0x2104, 0xc095, 0x200a, 0x000e, 0x6807, 0x0004, 0x6826, 0x682b,
-	0x0000, 0x080c, 0x95f0, 0x00ce, 0x00de, 0x0005, 0x6814, 0x9065,
-	0x0150, 0x6807, 0x0001, 0x6826, 0x682b, 0x0000, 0x080c, 0x95f0,
+	0x0000, 0x080c, 0x9838, 0x00ce, 0x00de, 0x0005, 0x6814, 0x9065,
+	0x0150, 0x6807, 0x0001, 0x6826, 0x682b, 0x0000, 0x080c, 0x9838,
 	0x00ce, 0x00de, 0x0005, 0x00b6, 0x00e6, 0x6a1c, 0x92dd, 0x0000,
-	0x0904, 0x9502, 0xb84c, 0x900d, 0x0118, 0xb888, 0x9005, 0x01a0,
-	0xb854, 0x905d, 0x0120, 0x920e, 0x0904, 0x9502, 0x0028, 0x6818,
-	0x920e, 0x0904, 0x9502, 0x2058, 0xb84c, 0x900d, 0x0d88, 0xb888,
+	0x0904, 0x974a, 0xb84c, 0x900d, 0x0118, 0xb888, 0x9005, 0x01a0,
+	0xb854, 0x905d, 0x0120, 0x920e, 0x0904, 0x974a, 0x0028, 0x6818,
+	0x920e, 0x0904, 0x974a, 0x2058, 0xb84c, 0x900d, 0x0d88, 0xb888,
 	0x9005, 0x1d70, 0x2b00, 0x681e, 0xbb3c, 0xb838, 0x9302, 0x1e40,
-	0x080c, 0xab42, 0x0904, 0x9502, 0x8318, 0xbb3e, 0x6116, 0x2b10,
+	0x080c, 0xae1e, 0x0904, 0x974a, 0x8318, 0xbb3e, 0x6116, 0x2b10,
 	0x6212, 0x0096, 0x2148, 0xa880, 0x9084, 0x00ff, 0x605e, 0xa883,
 	0x0000, 0xa884, 0x009e, 0x908a, 0x199a, 0x0210, 0x2001, 0x1999,
 	0x8003, 0x801b, 0x831b, 0x9318, 0x631a, 0x6114, 0x0096, 0x2148,
 	0xa964, 0x009e, 0x918c, 0x00ff, 0x918e, 0x0048, 0x0538, 0x00f6,
 	0x2c78, 0x2061, 0x0100, 0xbac0, 0x629a, 0x2069, 0x0200, 0x2071,
-	0x0240, 0x080c, 0x9b3d, 0x2069, 0x19e5, 0xbb00, 0xc3dd, 0xbb02,
+	0x0240, 0x080c, 0x9d85, 0x2069, 0x19e7, 0xbb00, 0xc3dd, 0xbb02,
 	0x6807, 0x0002, 0x2f18, 0x6b26, 0x682b, 0x0000, 0x7823, 0x0003,
 	0x7803, 0x0001, 0x7807, 0x0040, 0x00fe, 0x00ee, 0x00be, 0x00ce,
 	0x00de, 0x0005, 0x00ee, 0x00be, 0x00ce, 0x0cd0, 0xbb00, 0xc3dd,
 	0xbb02, 0x6807, 0x0006, 0x2f18, 0x6b26, 0x682b, 0x0000, 0x080c,
-	0xa987, 0x00ee, 0x00be, 0x00ce, 0x00de, 0x0005, 0x00de, 0x0005,
+	0xac63, 0x00ee, 0x00be, 0x00ce, 0x00de, 0x0005, 0x00de, 0x0005,
 	0x00c6, 0x680c, 0x9065, 0x0508, 0x6114, 0x0096, 0x2148, 0xa964,
 	0x009e, 0x918c, 0x00ff, 0x918e, 0x0035, 0x1180, 0x2009, 0x1837,
-	0x210c, 0x918c, 0x0028, 0x1150, 0x080c, 0x717d, 0x0138, 0x0006,
+	0x210c, 0x918c, 0x0028, 0x1150, 0x080c, 0x73b0, 0x0138, 0x0006,
 	0x2009, 0x188b, 0x2104, 0xc095, 0x200a, 0x000e, 0x6807, 0x0004,
-	0x6826, 0x682b, 0x0000, 0x080c, 0x95f0, 0x00ce, 0x00de, 0x0005,
+	0x6826, 0x682b, 0x0000, 0x080c, 0x9838, 0x00ce, 0x00de, 0x0005,
 	0x2001, 0x180c, 0x2014, 0xc2ed, 0x2202, 0x00de, 0x00fe, 0x0005,
-	0x00f6, 0x00d6, 0x2069, 0x19e5, 0x6830, 0x9086, 0x0000, 0x1570,
+	0x00f6, 0x00d6, 0x2069, 0x19e7, 0x6830, 0x9086, 0x0000, 0x1570,
 	0x2001, 0x180c, 0x2014, 0xd2e4, 0x0130, 0xc2e4, 0x2202, 0x080c,
-	0x942b, 0x2069, 0x19e5, 0x2001, 0x180c, 0x200c, 0xd1c4, 0x1508,
-	0x6838, 0x907d, 0x01d8, 0x6a04, 0x9296, 0x0000, 0x1904, 0x95e9,
+	0x9673, 0x2069, 0x19e7, 0x2001, 0x180c, 0x200c, 0xd1c4, 0x1508,
+	0x6838, 0x907d, 0x01d8, 0x6a04, 0x9296, 0x0000, 0x1904, 0x9831,
 	0x7920, 0x918e, 0x0009, 0x0588, 0x6833, 0x0001, 0x683e, 0x6847,
 	0x0000, 0x684b, 0x0000, 0x0126, 0x00f6, 0x2091, 0x2400, 0x002e,
-	0x080c, 0x1b8c, 0x1178, 0x012e, 0x080c, 0x9e4a, 0x00de, 0x00fe,
-	0x0005, 0xc1c4, 0x2102, 0x0066, 0x2031, 0x0001, 0x080c, 0x722d,
+	0x080c, 0x1c46, 0x1178, 0x012e, 0x080c, 0xa0a7, 0x00de, 0x00fe,
+	0x0005, 0xc1c4, 0x2102, 0x0066, 0x2031, 0x0001, 0x080c, 0x7460,
 	0x006e, 0x08b0, 0x012e, 0x6843, 0x0000, 0x7803, 0x0002, 0x780c,
 	0x9015, 0x0140, 0x6a3a, 0x780f, 0x0000, 0x6833, 0x0000, 0x683f,
 	0x0000, 0x0c20, 0x683a, 0x6836, 0x0cc0, 0x7908, 0xd1fc, 0x1198,
 	0x6833, 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x0126,
-	0x00f6, 0x2091, 0x2400, 0x002e, 0x080c, 0x1b8c, 0x19d8, 0x012e,
-	0x080c, 0x9dcb, 0x0858, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028,
+	0x00f6, 0x2091, 0x2400, 0x002e, 0x080c, 0x1c46, 0x19d8, 0x012e,
+	0x080c, 0xa028, 0x0858, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028,
 	0x1188, 0x2001, 0x197c, 0x2004, 0x9086, 0xaaaa, 0x0158, 0x2001,
-	0x19e6, 0x2004, 0x9005, 0x11f0, 0x2001, 0x188b, 0x200c, 0xc185,
+	0x19e8, 0x2004, 0x9005, 0x11f0, 0x2001, 0x188b, 0x200c, 0xc185,
 	0xc18c, 0x2102, 0x2f00, 0x6833, 0x0001, 0x683e, 0x6847, 0x0000,
 	0x684b, 0x0000, 0x0126, 0x00f6, 0x2091, 0x2400, 0x002e, 0x080c,
-	0x1b8c, 0x1904, 0x958a, 0x012e, 0x6a3c, 0x2278, 0x080c, 0x9d55,
-	0x0804, 0x957e, 0x2011, 0x188b, 0x2204, 0xc08d, 0x2012, 0x0804,
-	0x957e, 0x6a04, 0x9296, 0x0006, 0x0904, 0x9568, 0x0804, 0x9540,
-	0x6020, 0x9084, 0x000f, 0x000b, 0x0005, 0x9604, 0x9609, 0x9a77,
-	0x9b06, 0x9609, 0x9a77, 0x9b06, 0x9604, 0x9609, 0x9604, 0x9604,
-	0x9604, 0x9604, 0x9604, 0x9604, 0x080c, 0x9317, 0x080c, 0x941c,
+	0x1c46, 0x1904, 0x97d2, 0x012e, 0x6a3c, 0x2278, 0x080c, 0x9fb2,
+	0x0804, 0x97c6, 0x2011, 0x188b, 0x2204, 0xc08d, 0x2012, 0x0804,
+	0x97c6, 0x6a04, 0x9296, 0x0006, 0x0904, 0x97b0, 0x0804, 0x9788,
+	0x6020, 0x9084, 0x000f, 0x000b, 0x0005, 0x984c, 0x9851, 0x9cbf,
+	0x9d4e, 0x9851, 0x9cbf, 0x9d4e, 0x984c, 0x9851, 0x984c, 0x984c,
+	0x984c, 0x984c, 0x984c, 0x984c, 0x080c, 0x955f, 0x080c, 0x9664,
 	0x0005, 0x00b6, 0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6,
 	0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004,
 	0x908a, 0x0053, 0x1a0c, 0x0dd5, 0x6110, 0x2158, 0xb9c0, 0x2c78,
-	0x2061, 0x0100, 0x619a, 0x908a, 0x0040, 0x1a04, 0x9675, 0x005b,
+	0x2061, 0x0100, 0x619a, 0x908a, 0x0040, 0x1a04, 0x98bd, 0x005b,
 	0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e,
-	0x015e, 0x00be, 0x0005, 0x97fa, 0x9835, 0x985e, 0x9906, 0x9928,
-	0x992e, 0x993b, 0x9943, 0x994f, 0x9955, 0x9966, 0x9955, 0x99be,
-	0x9943, 0x99ca, 0x99d0, 0x994f, 0x99d0, 0x99dc, 0x9673, 0x9673,
-	0x9673, 0x9673, 0x9673, 0x9673, 0x9673, 0x9673, 0x9673, 0x9673,
-	0x9673, 0xa163, 0xa186, 0xa197, 0xa1b7, 0xa1e9, 0x993b, 0x9673,
-	0x993b, 0x9955, 0x9673, 0x985e, 0x9906, 0x9673, 0xa5b3, 0x9955,
-	0x9673, 0xa5cf, 0x9955, 0x9673, 0x994f, 0x97f4, 0x9696, 0x9673,
-	0xa5eb, 0xa658, 0xa72f, 0x9673, 0xa73c, 0x9938, 0xa767, 0x9673,
-	0xa1f3, 0xa794, 0x9673, 0x080c, 0x0dd5, 0x2100, 0x005b, 0x00fe,
+	0x015e, 0x00be, 0x0005, 0x9a42, 0x9a7d, 0x9aa6, 0x9b4e, 0x9b70,
+	0x9b76, 0x9b83, 0x9b8b, 0x9b97, 0x9b9d, 0x9bae, 0x9b9d, 0x9c06,
+	0x9b8b, 0x9c12, 0x9c18, 0x9b97, 0x9c18, 0x9c24, 0x98bb, 0x98bb,
+	0x98bb, 0x98bb, 0x98bb, 0x98bb, 0x98bb, 0x98bb, 0x98bb, 0x98bb,
+	0x98bb, 0xa453, 0xa476, 0xa487, 0xa4a7, 0xa4d9, 0x9b83, 0x98bb,
+	0x9b83, 0x9b9d, 0x98bb, 0x9aa6, 0x9b4e, 0x98bb, 0xa88f, 0x9b9d,
+	0x98bb, 0xa8ab, 0x9b9d, 0x98bb, 0x9b97, 0x9a3c, 0x98de, 0x98bb,
+	0xa8c7, 0xa934, 0xaa0b, 0x98bb, 0xaa18, 0x9b80, 0xaa43, 0x98bb,
+	0xa4e3, 0xaa70, 0x98bb, 0x080c, 0x0dd5, 0x2100, 0x005b, 0x00fe,
 	0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e,
-	0x00be, 0x0005, 0xa82f, 0xa8e1, 0x9694, 0x96bd, 0x9769, 0x9774,
-	0x9694, 0x993b, 0x9694, 0x97bb, 0x97c7, 0x96d8, 0x9694, 0x96f3,
-	0x9727, 0xaa49, 0xaa8e, 0x9955, 0x080c, 0x0dd5, 0x00d6, 0x0096,
-	0x080c, 0x99ef, 0x7003, 0x2414, 0x7007, 0x0018, 0x700b, 0x0800,
+	0x00be, 0x0005, 0xab0b, 0xabbd, 0x98dc, 0x9905, 0x99b1, 0x99bc,
+	0x98dc, 0x9b83, 0x98dc, 0x9a03, 0x9a0f, 0x9920, 0x98dc, 0x993b,
+	0x996f, 0xad25, 0xad6a, 0x9b9d, 0x080c, 0x0dd5, 0x00d6, 0x0096,
+	0x080c, 0x9c37, 0x7003, 0x2414, 0x7007, 0x0018, 0x700b, 0x0800,
 	0x7814, 0x2048, 0xa83c, 0x700e, 0xa850, 0x7022, 0xa854, 0x7026,
-	0x60c3, 0x0018, 0x080c, 0x9fd0, 0x009e, 0x00de, 0x0005, 0x7810,
-	0x00b6, 0x2058, 0xb8a0, 0x00be, 0x080c, 0xaad5, 0x1118, 0x9084,
+	0x60c3, 0x0018, 0x080c, 0xa22d, 0x009e, 0x00de, 0x0005, 0x7810,
+	0x00b6, 0x2058, 0xb8a0, 0x00be, 0x080c, 0xadb1, 0x1118, 0x9084,
 	0xff80, 0x0110, 0x9085, 0x0001, 0x0005, 0x00d6, 0x0096, 0x080c,
-	0x99ef, 0x7003, 0x0500, 0x7814, 0x2048, 0xa874, 0x700a, 0xa878,
+	0x9c37, 0x7003, 0x0500, 0x7814, 0x2048, 0xa874, 0x700a, 0xa878,
 	0x700e, 0xa87c, 0x7012, 0xa880, 0x7016, 0xa884, 0x701a, 0xa888,
-	0x701e, 0x60c3, 0x0010, 0x080c, 0x9fd0, 0x009e, 0x00de, 0x0005,
-	0x00d6, 0x0096, 0x080c, 0x99ef, 0x7003, 0x0500, 0x7814, 0x2048,
+	0x701e, 0x60c3, 0x0010, 0x080c, 0xa22d, 0x009e, 0x00de, 0x0005,
+	0x00d6, 0x0096, 0x080c, 0x9c37, 0x7003, 0x0500, 0x7814, 0x2048,
 	0xa8cc, 0x700a, 0xa8d0, 0x700e, 0xa8d4, 0x7012, 0xa8d8, 0x7016,
-	0xa8dc, 0x701a, 0xa8e0, 0x701e, 0x60c3, 0x0010, 0x080c, 0x9fd0,
+	0xa8dc, 0x701a, 0xa8e0, 0x701e, 0x60c3, 0x0010, 0x080c, 0xa22d,
 	0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x99ef, 0x20e9, 0x0000, 0x2001, 0x19a1, 0x2003, 0x0000,
+	0x080c, 0x9c37, 0x20e9, 0x0000, 0x2001, 0x19a3, 0x2003, 0x0000,
 	0x7814, 0x2048, 0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860,
-	0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x2001, 0x19a1, 0x0016,
-	0x200c, 0x2001, 0x0001, 0x080c, 0x2269, 0x080c, 0xd53f, 0x9006,
-	0x080c, 0x2269, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c28,
-	0x04d9, 0x080c, 0x9fd0, 0x012e, 0x009e, 0x00de, 0x0005, 0x00d6,
-	0x0096, 0x0126, 0x2091, 0x8000, 0x080c, 0x9a3a, 0x20e9, 0x0000,
-	0x2001, 0x19a1, 0x2003, 0x0000, 0x7814, 0x2048, 0xa86f, 0x0200,
+	0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x2001, 0x19a3, 0x0016,
+	0x200c, 0x2001, 0x0001, 0x080c, 0x23b7, 0x080c, 0xd84c, 0x9006,
+	0x080c, 0x23b7, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c28,
+	0x04d9, 0x080c, 0xa22d, 0x012e, 0x009e, 0x00de, 0x0005, 0x00d6,
+	0x0096, 0x0126, 0x2091, 0x8000, 0x080c, 0x9c82, 0x20e9, 0x0000,
+	0x2001, 0x19a3, 0x2003, 0x0000, 0x7814, 0x2048, 0xa86f, 0x0200,
 	0xa873, 0x0000, 0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860,
-	0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x2001, 0x19a1, 0x0016,
-	0x200c, 0x080c, 0xd53f, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048,
-	0x0c60, 0x0051, 0x7814, 0x2048, 0x080c, 0x0fb2, 0x080c, 0x9fd0,
+	0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x2001, 0x19a3, 0x0016,
+	0x200c, 0x080c, 0xd84c, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048,
+	0x0c60, 0x0051, 0x7814, 0x2048, 0x080c, 0x0fb1, 0x080c, 0xa22d,
 	0x012e, 0x009e, 0x00de, 0x0005, 0x60c0, 0x8004, 0x9084, 0x0003,
 	0x9005, 0x0130, 0x9082, 0x0004, 0x20a3, 0x0000, 0x8000, 0x1de0,
-	0x0005, 0x080c, 0x99ef, 0x7003, 0x7800, 0x7808, 0x8007, 0x700a,
-	0x60c3, 0x0008, 0x0804, 0x9fd0, 0x00d6, 0x00e6, 0x080c, 0x9a3a,
+	0x0005, 0x080c, 0x9c37, 0x7003, 0x7800, 0x7808, 0x8007, 0x700a,
+	0x60c3, 0x0008, 0x0804, 0xa22d, 0x00d6, 0x00e6, 0x080c, 0x9c82,
 	0x7814, 0x9084, 0xff00, 0x2073, 0x0200, 0x8e70, 0x8e70, 0x9095,
 	0x0010, 0x2272, 0x8e70, 0x2073, 0x0034, 0x8e70, 0x2069, 0x1805,
-	0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x978a, 0x2069,
-	0x1801, 0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x9793,
-	0x2069, 0x19b1, 0x9086, 0xdf00, 0x0110, 0x2069, 0x19cb, 0x20a9,
+	0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x99d2, 0x2069,
+	0x1801, 0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x99db,
+	0x2069, 0x19b3, 0x9086, 0xdf00, 0x0110, 0x2069, 0x19cd, 0x20a9,
 	0x001a, 0x9e86, 0x0260, 0x1148, 0x00c6, 0x2061, 0x0200, 0x6010,
 	0x8000, 0x6012, 0x00ce, 0x2071, 0x0240, 0x2d04, 0x8007, 0x2072,
-	0x8d68, 0x8e70, 0x1f04, 0x97a1, 0x60c3, 0x004c, 0x080c, 0x9fd0,
-	0x00ee, 0x00de, 0x0005, 0x080c, 0x99ef, 0x7003, 0x6300, 0x7007,
-	0x0028, 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9fd0, 0x00d6,
-	0x0026, 0x0016, 0x080c, 0x9a3a, 0x7003, 0x0200, 0x7814, 0x700e,
+	0x8d68, 0x8e70, 0x1f04, 0x99e9, 0x60c3, 0x004c, 0x080c, 0xa22d,
+	0x00ee, 0x00de, 0x0005, 0x080c, 0x9c37, 0x7003, 0x6300, 0x7007,
+	0x0028, 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0xa22d, 0x00d6,
+	0x0026, 0x0016, 0x080c, 0x9c82, 0x7003, 0x0200, 0x7814, 0x700e,
 	0x00e6, 0x9ef0, 0x0004, 0x2009, 0x0001, 0x2011, 0x000c, 0x2069,
 	0x1923, 0x6810, 0xd084, 0x1148, 0x2073, 0x0500, 0x8e70, 0x2073,
 	0x0000, 0x8e70, 0x8108, 0x9290, 0x0004, 0x2073, 0x0800, 0x8e70,
-	0x2073, 0x0000, 0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c, 0x9fd0,
+	0x2073, 0x0000, 0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c, 0xa22d,
 	0x001e, 0x002e, 0x00de, 0x0005, 0x2001, 0x1818, 0x2004, 0x609a,
-	0x0804, 0x9fd0, 0x080c, 0x99ef, 0x7003, 0x5200, 0x2069, 0x1847,
-	0x6804, 0xd084, 0x0130, 0x6828, 0x0016, 0x080c, 0x2723, 0x710e,
+	0x0804, 0xa22d, 0x080c, 0x9c37, 0x7003, 0x5200, 0x2069, 0x1847,
+	0x6804, 0xd084, 0x0130, 0x6828, 0x0016, 0x080c, 0x2871, 0x710e,
 	0x001e, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9,
 	0x0000, 0x20a1, 0x0250, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801,
-	0x20a1, 0x0254, 0x4003, 0x080c, 0xaad5, 0x1120, 0xb8a0, 0x9082,
+	0x20a1, 0x0254, 0x4003, 0x080c, 0xadb1, 0x1120, 0xb8a0, 0x9082,
 	0x007f, 0x0248, 0x2001, 0x181f, 0x2004, 0x7032, 0x2001, 0x1820,
 	0x2004, 0x7036, 0x0030, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff,
-	0x7036, 0x60c3, 0x001c, 0x0804, 0x9fd0, 0x080c, 0x99ef, 0x7003,
-	0x0500, 0x080c, 0xaad5, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248,
+	0x7036, 0x60c3, 0x001c, 0x0804, 0xa22d, 0x080c, 0x9c37, 0x7003,
+	0x0500, 0x080c, 0xadb1, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248,
 	0x2001, 0x181f, 0x2004, 0x700a, 0x2001, 0x1820, 0x2004, 0x700e,
 	0x0030, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, 0x700e, 0x20a9,
 	0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1,
-	0x0250, 0x4003, 0x60c3, 0x0010, 0x0804, 0x9fd0, 0x080c, 0x99ef,
-	0x9006, 0x080c, 0x6701, 0xb8a0, 0x9086, 0x007e, 0x1130, 0x7003,
+	0x0250, 0x4003, 0x60c3, 0x0010, 0x0804, 0xa22d, 0x080c, 0x9c37,
+	0x9006, 0x080c, 0x6934, 0xb8a0, 0x9086, 0x007e, 0x1130, 0x7003,
 	0x0400, 0x620c, 0xc2b4, 0x620e, 0x0058, 0x7814, 0x0096, 0x904d,
 	0x0120, 0x9006, 0xa89a, 0xa8a6, 0xa8aa, 0x009e, 0x7003, 0x0300,
-	0xb8a0, 0x9086, 0x007e, 0x1904, 0x98cd, 0x00d6, 0x2069, 0x196c,
+	0xb8a0, 0x9086, 0x007e, 0x1904, 0x9b15, 0x00d6, 0x2069, 0x196c,
 	0x2001, 0x1837, 0x2004, 0xd0a4, 0x0188, 0x6800, 0x700a, 0x6808,
-	0x9084, 0x2000, 0x7012, 0x080c, 0xaaec, 0x680c, 0x7016, 0x701f,
+	0x9084, 0x2000, 0x7012, 0x080c, 0xadc8, 0x680c, 0x7016, 0x701f,
 	0x2710, 0x6818, 0x7022, 0x681c, 0x7026, 0x0090, 0x6800, 0x700a,
-	0x6804, 0x700e, 0x6808, 0x080c, 0x717d, 0x1118, 0x9084, 0x37ff,
-	0x0010, 0x9084, 0x3fff, 0x7012, 0x080c, 0xaaec, 0x680c, 0x7016,
+	0x6804, 0x700e, 0x6808, 0x080c, 0x73b0, 0x1118, 0x9084, 0x37ff,
+	0x0010, 0x9084, 0x3fff, 0x7012, 0x080c, 0xadc8, 0x680c, 0x7016,
 	0x00de, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9,
 	0x0000, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801,
-	0x20a1, 0x025a, 0x4003, 0x00d6, 0x080c, 0xa816, 0x2069, 0x1974,
-	0x2071, 0x024e, 0x6800, 0xc0dd, 0x7002, 0x080c, 0x54bb, 0xd0e4,
+	0x20a1, 0x025a, 0x4003, 0x00d6, 0x080c, 0xaaf2, 0x2069, 0x1974,
+	0x2071, 0x024e, 0x6800, 0xc0dd, 0x7002, 0x080c, 0x56d4, 0xd0e4,
 	0x0110, 0x680c, 0x700e, 0x00de, 0x04a8, 0x2001, 0x1837, 0x2004,
 	0xd0a4, 0x0170, 0x0016, 0x2001, 0x196d, 0x200c, 0x60e0, 0x9106,
-	0x0130, 0x2100, 0x60e3, 0x0000, 0x080c, 0x2764, 0x61e2, 0x001e,
+	0x0130, 0x2100, 0x60e3, 0x0000, 0x080c, 0x28b2, 0x61e2, 0x001e,
 	0x20e1, 0x0001, 0x2099, 0x196c, 0x20e9, 0x0000, 0x20a1, 0x024e,
 	0x20a9, 0x0008, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1805, 0x20a1,
 	0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, 0x025a,
-	0x4003, 0x080c, 0xa816, 0x20a1, 0x024e, 0x20a9, 0x0008, 0x2099,
-	0x1974, 0x4003, 0x60c3, 0x0074, 0x0804, 0x9fd0, 0x080c, 0x99ef,
+	0x4003, 0x080c, 0xaaf2, 0x20a1, 0x024e, 0x20a9, 0x0008, 0x2099,
+	0x1974, 0x4003, 0x60c3, 0x0074, 0x0804, 0xa22d, 0x080c, 0x9c37,
 	0x7003, 0x2010, 0x7007, 0x0014, 0x700b, 0x0800, 0x700f, 0x2000,
 	0x9006, 0x00f6, 0x2079, 0x1847, 0x7904, 0x00fe, 0xd1ac, 0x1110,
 	0x9085, 0x0020, 0xd1a4, 0x0110, 0x9085, 0x0010, 0x9085, 0x0002,
-	0x00d6, 0x0804, 0x999f, 0x7026, 0x60c3, 0x0014, 0x0804, 0x9fd0,
-	0x080c, 0x99ef, 0x7003, 0x5000, 0x0804, 0x9878, 0x080c, 0x99ef,
-	0x7003, 0x2110, 0x7007, 0x0014, 0x60c3, 0x0014, 0x0804, 0x9fd0,
-	0x080c, 0x9a31, 0x0010, 0x080c, 0x9a3a, 0x7003, 0x0200, 0x60c3,
-	0x0004, 0x0804, 0x9fd0, 0x080c, 0x9a3a, 0x7003, 0x0100, 0x700b,
-	0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0x9fd0, 0x080c,
-	0x9a3a, 0x7003, 0x0200, 0x0804, 0x9878, 0x080c, 0x9a3a, 0x7003,
+	0x00d6, 0x0804, 0x9be7, 0x7026, 0x60c3, 0x0014, 0x0804, 0xa22d,
+	0x080c, 0x9c37, 0x7003, 0x5000, 0x0804, 0x9ac0, 0x080c, 0x9c37,
+	0x7003, 0x2110, 0x7007, 0x0014, 0x60c3, 0x0014, 0x0804, 0xa22d,
+	0x080c, 0x9c79, 0x0010, 0x080c, 0x9c82, 0x7003, 0x0200, 0x60c3,
+	0x0004, 0x0804, 0xa22d, 0x080c, 0x9c82, 0x7003, 0x0100, 0x700b,
+	0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0xa22d, 0x080c,
+	0x9c82, 0x7003, 0x0200, 0x0804, 0x9ac0, 0x080c, 0x9c82, 0x7003,
 	0x0100, 0x782c, 0x9005, 0x0110, 0x700a, 0x0010, 0x700b, 0x0003,
-	0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9fd0, 0x00d6, 0x080c,
-	0x9a3a, 0x7003, 0x0210, 0x7007, 0x0014, 0x700b, 0x0800, 0xb894,
+	0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0xa22d, 0x00d6, 0x080c,
+	0x9c82, 0x7003, 0x0210, 0x7007, 0x0014, 0x700b, 0x0800, 0xb894,
 	0x9086, 0x0014, 0x1198, 0xb99c, 0x9184, 0x0030, 0x0190, 0xb998,
 	0x9184, 0xc000, 0x1140, 0xd1ec, 0x0118, 0x700f, 0x2100, 0x0058,
 	0x700f, 0x0100, 0x0040, 0x700f, 0x0400, 0x0028, 0x700f, 0x0700,
@@ -4713,2720 +4786,2751 @@ unsigned short risc_code01[] = { 
 	0x2009, 0x1867, 0x210c, 0xd1e4, 0x0150, 0xc0c5, 0xbacc, 0xd28c,
 	0x1108, 0xc0cd, 0x9094, 0x0030, 0x9296, 0x0010, 0x0140, 0xd1ec,
 	0x0130, 0x9094, 0x0030, 0x9296, 0x0010, 0x0108, 0xc0bd, 0x002e,
-	0x7026, 0x60c3, 0x0014, 0x00de, 0x0804, 0x9fd0, 0x080c, 0x9a3a,
+	0x7026, 0x60c3, 0x0014, 0x00de, 0x0804, 0xa22d, 0x080c, 0x9c82,
 	0x7003, 0x0210, 0x7007, 0x0014, 0x700f, 0x0100, 0x60c3, 0x0014,
-	0x0804, 0x9fd0, 0x080c, 0x9a3a, 0x7003, 0x0200, 0x0804, 0x97fe,
-	0x080c, 0x9a3a, 0x7003, 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00,
-	0x60c3, 0x0008, 0x0804, 0x9fd0, 0x080c, 0x9a3a, 0x7003, 0x0100,
-	0x700b, 0x000b, 0x60c3, 0x0008, 0x0804, 0x9fd0, 0x0026, 0x00d6,
+	0x0804, 0xa22d, 0x080c, 0x9c82, 0x7003, 0x0200, 0x0804, 0x9a46,
+	0x080c, 0x9c82, 0x7003, 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00,
+	0x60c3, 0x0008, 0x0804, 0xa22d, 0x080c, 0x9c82, 0x7003, 0x0100,
+	0x700b, 0x000b, 0x60c3, 0x0008, 0x0804, 0xa22d, 0x0026, 0x00d6,
 	0x0036, 0x0046, 0x2019, 0x3200, 0x2021, 0x0800, 0x0040, 0x0026,
 	0x00d6, 0x0036, 0x0046, 0x2019, 0x2200, 0x2021, 0x0100, 0x080c,
-	0xa82b, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800,
+	0xab07, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800,
 	0x687c, 0x700a, 0x6880, 0x700e, 0x9485, 0x0029, 0x7012, 0x004e,
-	0x003e, 0x00de, 0x080c, 0x9fbe, 0x721a, 0x9f95, 0x0000, 0x7222,
+	0x003e, 0x00de, 0x080c, 0xa21b, 0x721a, 0x9f95, 0x0000, 0x7222,
 	0x7027, 0xffff, 0x2071, 0x024c, 0x002e, 0x0005, 0x0026, 0x080c,
-	0xa82b, 0x7003, 0x02ff, 0x7007, 0xfffc, 0x00d6, 0x2069, 0x1800,
+	0xab07, 0x7003, 0x02ff, 0x7007, 0xfffc, 0x00d6, 0x2069, 0x1800,
 	0x687c, 0x700a, 0x6880, 0x700e, 0x00de, 0x7013, 0x2029, 0x0c10,
 	0x7003, 0x0100, 0x7007, 0x0000, 0x700b, 0xfc02, 0x700f, 0x0000,
 	0x0005, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x3300, 0x2021,
 	0x0800, 0x0040, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x2300,
-	0x2021, 0x0100, 0x080c, 0xa82b, 0xb810, 0x9305, 0x7002, 0xb814,
+	0x2021, 0x0100, 0x080c, 0xab07, 0xb810, 0x9305, 0x7002, 0xb814,
 	0x7006, 0x2069, 0x1800, 0xb810, 0x9005, 0x1140, 0xb814, 0x9005,
 	0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, 0x0020, 0x687c, 0x700a,
 	0x6880, 0x700e, 0x0000, 0x9485, 0x0098, 0x7012, 0x004e, 0x003e,
-	0x00de, 0x080c, 0x9fbe, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226,
-	0x2071, 0x024c, 0x002e, 0x0005, 0x080c, 0x9fbe, 0x721a, 0x7a08,
+	0x00de, 0x080c, 0xa21b, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226,
+	0x2071, 0x024c, 0x002e, 0x0005, 0x080c, 0xa21b, 0x721a, 0x7a08,
 	0x7222, 0x7814, 0x7026, 0x2071, 0x024c, 0x002e, 0x0005, 0x00b6,
 	0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240,
 	0x6004, 0x908a, 0x0085, 0x0a0c, 0x0dd5, 0x908a, 0x0092, 0x1a0c,
 	0x0dd5, 0x6110, 0x2158, 0xb9c0, 0x2c78, 0x2061, 0x0100, 0x619a,
 	0x9082, 0x0085, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be,
-	0x0005, 0x9aa8, 0x9ab7, 0x9ac2, 0x9aa6, 0x9aa6, 0x9aa6, 0x9aa8,
-	0x9aa6, 0x9aa6, 0x9aa6, 0x9aa6, 0x9aa6, 0x9aa6, 0x080c, 0x0dd5,
-	0x0411, 0x60c3, 0x0000, 0x0026, 0x080c, 0x2a57, 0x0228, 0x2011,
-	0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x0804, 0x9fd0, 0x0431,
+	0x0005, 0x9cf0, 0x9cff, 0x9d0a, 0x9cee, 0x9cee, 0x9cee, 0x9cf0,
+	0x9cee, 0x9cee, 0x9cee, 0x9cee, 0x9cee, 0x9cee, 0x080c, 0x0dd5,
+	0x0411, 0x60c3, 0x0000, 0x0026, 0x080c, 0x2ba5, 0x0228, 0x2011,
+	0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x0804, 0xa22d, 0x0431,
 	0x7808, 0x700a, 0x7814, 0x700e, 0x7017, 0xffff, 0x60c3, 0x000c,
-	0x0804, 0x9fd0, 0x0479, 0x7003, 0x0003, 0x7007, 0x0300, 0x60c3,
-	0x0004, 0x0804, 0x9fd0, 0x0026, 0x080c, 0xa82b, 0xb810, 0x9085,
+	0x0804, 0xa22d, 0x0479, 0x7003, 0x0003, 0x7007, 0x0300, 0x60c3,
+	0x0004, 0x0804, 0xa22d, 0x0026, 0x080c, 0xab07, 0xb810, 0x9085,
 	0x8100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x687c, 0x700a,
-	0x6880, 0x700e, 0x7013, 0x0009, 0x0804, 0x9a0a, 0x0026, 0x080c,
-	0xa82b, 0xb810, 0x9085, 0x8400, 0x7002, 0xb814, 0x7006, 0x2069,
+	0x6880, 0x700e, 0x7013, 0x0009, 0x0804, 0x9c52, 0x0026, 0x080c,
+	0xab07, 0xb810, 0x9085, 0x8400, 0x7002, 0xb814, 0x7006, 0x2069,
 	0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x2001, 0x0099, 0x7012,
-	0x0804, 0x9a6c, 0x0026, 0x080c, 0xa82b, 0xb810, 0x9085, 0x8500,
+	0x0804, 0x9cb4, 0x0026, 0x080c, 0xab07, 0xb810, 0x9085, 0x8500,
 	0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, 0x6880,
-	0x700e, 0x2001, 0x0099, 0x7012, 0x0804, 0x9a6c, 0x00b6, 0x00c6,
+	0x700e, 0x2001, 0x0099, 0x7012, 0x0804, 0x9cb4, 0x00b6, 0x00c6,
 	0x00d6, 0x00e6, 0x00f6, 0x2c78, 0x2069, 0x0200, 0x2071, 0x0240,
 	0x7804, 0x908a, 0x0040, 0x0a0c, 0x0dd5, 0x908a, 0x0054, 0x1a0c,
 	0x0dd5, 0x7910, 0x2158, 0xb9c0, 0x2061, 0x0100, 0x619a, 0x9082,
 	0x0040, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x0005,
-	0x9b3d, 0x9be4, 0x9bb7, 0x9d06, 0x9b3b, 0x9b3b, 0x9b3b, 0x9b3b,
-	0x9b3b, 0x9b3b, 0x9b3b, 0xa369, 0xa375, 0xa381, 0xa38d, 0x9b3b,
-	0xa773, 0x9b3b, 0xa35d, 0x080c, 0x0dd5, 0x0096, 0x780b, 0xffff,
-	0x080c, 0x9b93, 0x7914, 0x2148, 0xa978, 0x7956, 0x7132, 0xa97c,
-	0x9184, 0x000f, 0x1118, 0x2001, 0x0005, 0x0040, 0xd184, 0x0118,
-	0x2001, 0x0004, 0x0018, 0x9084, 0x0006, 0x8004, 0x2010, 0x785c,
-	0x9084, 0x00ff, 0x8007, 0x9205, 0x7042, 0xd1ac, 0x0128, 0x7047,
-	0x0002, 0x080c, 0x1689, 0x0050, 0xd1b4, 0x0118, 0x7047, 0x0001,
-	0x0028, 0x7047, 0x0000, 0x9016, 0x2230, 0x0010, 0xaab0, 0xaeac,
-	0x726a, 0x766e, 0x20a9, 0x0008, 0x20e9, 0x0000, 0xa860, 0x20e0,
-	0xa85c, 0x9080, 0x0023, 0x2098, 0x20a1, 0x0252, 0x2069, 0x0200,
-	0x6813, 0x0018, 0x4003, 0x6813, 0x0008, 0x60c3, 0x0020, 0x6017,
-	0x0009, 0x2001, 0x1a01, 0x2003, 0x07d0, 0x2001, 0x1a00, 0x2003,
-	0x0009, 0x009e, 0x0005, 0x6813, 0x0008, 0xba8c, 0x8210, 0xb8cc,
-	0xd084, 0x0128, 0x7a46, 0x7b14, 0x7b4a, 0x722e, 0x732a, 0x9294,
-	0x00ff, 0xba8e, 0x8217, 0x721a, 0xba10, 0x9295, 0x0600, 0x7202,
-	0xba14, 0x7206, 0x2069, 0x1800, 0x6a7c, 0x720a, 0x6a80, 0x720e,
-	0x7013, 0x0829, 0x2f10, 0x7222, 0x7027, 0xffff, 0x0005, 0x00d6,
-	0x0096, 0x0081, 0x7814, 0x2048, 0xa890, 0x7002, 0xa88c, 0x7006,
-	0xa8b0, 0x700a, 0xa8ac, 0x700e, 0x60c3, 0x000c, 0x009e, 0x00de,
-	0x0804, 0x9fd0, 0x6813, 0x0008, 0xb810, 0x9085, 0x0500, 0x7002,
+	0x9d85, 0x9e41, 0x9e14, 0x9f63, 0x9d83, 0x9d83, 0x9d83, 0x9d83,
+	0x9d83, 0x9d83, 0x9d83, 0xa655, 0xa65d, 0xa665, 0xa66d, 0x9d83,
+	0xaa4f, 0x9d83, 0xa64d, 0x080c, 0x0dd5, 0x0096, 0x780b, 0xffff,
+	0x080c, 0x9df0, 0x7914, 0x2148, 0xa978, 0x7956, 0xae64, 0x96b4,
+	0x00ff, 0x9686, 0x0008, 0x1148, 0xa8b4, 0x7032, 0xa8b8, 0x7036,
+	0xa8bc, 0x703a, 0xa8c0, 0x703e, 0x0008, 0x7132, 0xa97c, 0x9184,
+	0x000f, 0x1118, 0x2001, 0x0005, 0x0040, 0xd184, 0x0118, 0x2001,
+	0x0004, 0x0018, 0x9084, 0x0006, 0x8004, 0x2010, 0x785c, 0x9084,
+	0x00ff, 0x8007, 0x9205, 0x7042, 0xd1ac, 0x0158, 0x7047, 0x0002,
+	0x9686, 0x0008, 0x1118, 0x080c, 0x18ac, 0x0010, 0x080c, 0x1725,
+	0x0050, 0xd1b4, 0x0118, 0x7047, 0x0001, 0x0028, 0x7047, 0x0000,
+	0x9016, 0x2230, 0x0010, 0xaab0, 0xaeac, 0x726a, 0x766e, 0x20a9,
+	0x0008, 0x20e9, 0x0000, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0023,
+	0x2098, 0x20a1, 0x0252, 0x2069, 0x0200, 0x6813, 0x0018, 0x4003,
+	0x6813, 0x0008, 0x60c3, 0x0020, 0x6017, 0x0009, 0x2001, 0x1a03,
+	0x2003, 0x07d0, 0x2001, 0x1a02, 0x2003, 0x0009, 0x009e, 0x0005,
+	0x6813, 0x0008, 0xba8c, 0x8210, 0xb8cc, 0xd084, 0x0128, 0x7a46,
+	0x7b14, 0x7b4a, 0x722e, 0x732a, 0x9294, 0x00ff, 0xba8e, 0x8217,
+	0x721a, 0xba10, 0x9295, 0x0600, 0x7202, 0xba14, 0x7206, 0x2069,
+	0x1800, 0x6a7c, 0x720a, 0x6a80, 0x720e, 0x7013, 0x0829, 0x2f10,
+	0x7222, 0x7027, 0xffff, 0x0005, 0x00d6, 0x0096, 0x0081, 0x7814,
+	0x2048, 0xa890, 0x7002, 0xa88c, 0x7006, 0xa8b0, 0x700a, 0xa8ac,
+	0x700e, 0x60c3, 0x000c, 0x009e, 0x00de, 0x0804, 0xa22d, 0x6813,
+	0x0008, 0xb810, 0x9085, 0x0500, 0x7002, 0xb814, 0x7006, 0x2069,
+	0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x7013, 0x0889, 0x080c,
+	0xa21b, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071, 0x024c,
+	0x0005, 0x00d6, 0x0096, 0x080c, 0x9f41, 0x7814, 0x2048, 0x080c,
+	0xcb19, 0x1130, 0x7814, 0x9084, 0x0700, 0x8007, 0x0033, 0x0010,
+	0x9006, 0x001b, 0x009e, 0x00de, 0x0005, 0x9e5f, 0x9ec8, 0x9ed8,
+	0x9efe, 0x9f0a, 0x9f1b, 0x9f23, 0x9e5d, 0x080c, 0x0dd5, 0x0016,
+	0x0036, 0xa97c, 0x918c, 0x0003, 0x0118, 0x9186, 0x0003, 0x1198,
+	0xaba8, 0x7824, 0xd0cc, 0x1168, 0x7316, 0xa898, 0x701a, 0xa894,
+	0x701e, 0x003e, 0x001e, 0x2001, 0x19b1, 0x2004, 0x60c2, 0x0804,
+	0xa22d, 0xc3e5, 0x0c88, 0x9186, 0x0001, 0x190c, 0x0dd5, 0xaba8,
+	0x7824, 0xd0cc, 0x1904, 0x9ec5, 0x7316, 0xa898, 0x701a, 0xa894,
+	0x701e, 0xa8a4, 0x7026, 0xa8ac, 0x702e, 0x2009, 0x0018, 0x9384,
+	0x0300, 0x0570, 0xd3c4, 0x0110, 0xa8ac, 0x9108, 0xd3cc, 0x0110,
+	0xa8a4, 0x9108, 0x6810, 0x9085, 0x0010, 0x6812, 0x2011, 0x0258,
+	0x20e9, 0x0000, 0x22a0, 0x0156, 0x20a9, 0x0008, 0xa860, 0x20e0,
+	0xa85c, 0x9080, 0x002c, 0x2098, 0x4003, 0x6810, 0x8000, 0x6812,
+	0x2011, 0x0240, 0x22a0, 0x20a9, 0x0005, 0x4003, 0x6810, 0xc084,
+	0x6812, 0x015e, 0x9184, 0x0003, 0x0118, 0x2019, 0x0245, 0x201a,
+	0x61c2, 0x003e, 0x001e, 0x0804, 0xa22d, 0xc3e5, 0x0804, 0x9e84,
+	0x2011, 0x0008, 0x2001, 0x180f, 0x2004, 0xd0a4, 0x0110, 0x2011,
+	0x0028, 0x7824, 0xd0cc, 0x1110, 0x7216, 0x0470, 0x0ce8, 0xc2e5,
+	0x2011, 0x0302, 0x0016, 0x782c, 0x701a, 0x7930, 0x711e, 0x9105,
+	0x0108, 0xc2dd, 0x001e, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216,
+	0x7027, 0x0012, 0x702f, 0x0008, 0x7043, 0x7000, 0x7047, 0x0500,
+	0x704f, 0x000a, 0x2069, 0x0200, 0x6813, 0x0009, 0x2071, 0x0240,
+	0x700b, 0x2500, 0x60c3, 0x0032, 0x0804, 0xa22d, 0x2011, 0x0028,
+	0x7824, 0xd0cc, 0x1128, 0x7216, 0x60c3, 0x0018, 0x0804, 0xa22d,
+	0x0cd0, 0xc2e5, 0x2011, 0x0100, 0x7824, 0xd0cc, 0x0108, 0xc2e5,
+	0x7216, 0x702f, 0x0008, 0x7858, 0x9084, 0x00ff, 0x7036, 0x60c3,
+	0x0020, 0x0804, 0xa22d, 0x2011, 0x0008, 0x7824, 0xd0cc, 0x0108,
+	0xc2e5, 0x7216, 0x0c08, 0x0036, 0x7b14, 0x9384, 0xff00, 0x7816,
+	0x9384, 0x00ff, 0x8001, 0x1138, 0x7824, 0xd0cc, 0x0108, 0xc2e5,
+	0x7216, 0x003e, 0x0888, 0x0046, 0x2021, 0x0800, 0x0006, 0x7824,
+	0xd0cc, 0x000e, 0x0108, 0xc4e5, 0x7416, 0x004e, 0x701e, 0x003e,
+	0x0818, 0x00d6, 0x6813, 0x0008, 0xb810, 0x9085, 0x0700, 0x7002,
 	0xb814, 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e,
-	0x7013, 0x0889, 0x080c, 0x9fbe, 0x721a, 0x7a08, 0x7222, 0x2f10,
-	0x7226, 0x2071, 0x024c, 0x0005, 0x00d6, 0x0096, 0x080c, 0x9ce4,
-	0x7814, 0x2048, 0x080c, 0xc823, 0x1130, 0x7814, 0x9084, 0x0700,
-	0x8007, 0x0033, 0x0010, 0x9006, 0x001b, 0x009e, 0x00de, 0x0005,
-	0x9c02, 0x9c6b, 0x9c7b, 0x9ca1, 0x9cad, 0x9cbe, 0x9cc6, 0x9c00,
-	0x080c, 0x0dd5, 0x0016, 0x0036, 0xa97c, 0x918c, 0x0003, 0x0118,
-	0x9186, 0x0003, 0x1198, 0xaba8, 0x7824, 0xd0cc, 0x1168, 0x7316,
-	0xa898, 0x701a, 0xa894, 0x701e, 0x003e, 0x001e, 0x2001, 0x19af,
-	0x2004, 0x60c2, 0x0804, 0x9fd0, 0xc3e5, 0x0c88, 0x9186, 0x0001,
-	0x190c, 0x0dd5, 0xaba8, 0x7824, 0xd0cc, 0x1904, 0x9c68, 0x7316,
-	0xa898, 0x701a, 0xa894, 0x701e, 0xa8a4, 0x7026, 0xa8ac, 0x702e,
-	0x2009, 0x0018, 0x9384, 0x0300, 0x0570, 0xd3c4, 0x0110, 0xa8ac,
-	0x9108, 0xd3cc, 0x0110, 0xa8a4, 0x9108, 0x6810, 0x9085, 0x0010,
-	0x6812, 0x2011, 0x0258, 0x20e9, 0x0000, 0x22a0, 0x0156, 0x20a9,
-	0x0008, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x002c, 0x2098, 0x4003,
-	0x6810, 0x8000, 0x6812, 0x2011, 0x0240, 0x22a0, 0x20a9, 0x0005,
-	0x4003, 0x6810, 0xc084, 0x6812, 0x015e, 0x9184, 0x0003, 0x0118,
-	0x2019, 0x0245, 0x201a, 0x61c2, 0x003e, 0x001e, 0x0804, 0x9fd0,
-	0xc3e5, 0x0804, 0x9c27, 0x2011, 0x0008, 0x2001, 0x180f, 0x2004,
-	0xd0a4, 0x0110, 0x2011, 0x0028, 0x7824, 0xd0cc, 0x1110, 0x7216,
-	0x0470, 0x0ce8, 0xc2e5, 0x2011, 0x0302, 0x0016, 0x782c, 0x701a,
-	0x7930, 0x711e, 0x9105, 0x0108, 0xc2dd, 0x001e, 0x7824, 0xd0cc,
-	0x0108, 0xc2e5, 0x7216, 0x7027, 0x0012, 0x702f, 0x0008, 0x7043,
-	0x7000, 0x7047, 0x0500, 0x704f, 0x000a, 0x2069, 0x0200, 0x6813,
-	0x0009, 0x2071, 0x0240, 0x700b, 0x2500, 0x60c3, 0x0032, 0x0804,
-	0x9fd0, 0x2011, 0x0028, 0x7824, 0xd0cc, 0x1128, 0x7216, 0x60c3,
-	0x0018, 0x0804, 0x9fd0, 0x0cd0, 0xc2e5, 0x2011, 0x0100, 0x7824,
-	0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x702f, 0x0008, 0x7858, 0x9084,
-	0x00ff, 0x7036, 0x60c3, 0x0020, 0x0804, 0x9fd0, 0x2011, 0x0008,
-	0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x0c08, 0x0036, 0x7b14,
-	0x9384, 0xff00, 0x7816, 0x9384, 0x00ff, 0x8001, 0x1138, 0x7824,
-	0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x003e, 0x0888, 0x0046, 0x2021,
-	0x0800, 0x0006, 0x7824, 0xd0cc, 0x000e, 0x0108, 0xc4e5, 0x7416,
-	0x004e, 0x701e, 0x003e, 0x0818, 0x00d6, 0x6813, 0x0008, 0xb810,
-	0x9085, 0x0700, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x687c,
-	0x700a, 0x6880, 0x700e, 0x7824, 0xd0cc, 0x1168, 0x7013, 0x0898,
-	0x080c, 0x9fbe, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071,
-	0x024c, 0x00de, 0x0005, 0x7013, 0x0889, 0x0c90, 0x0016, 0x7814,
-	0x9084, 0x0700, 0x8007, 0x0013, 0x001e, 0x0005, 0x9d16, 0x9d16,
-	0x9d18, 0x9d16, 0x9d16, 0x9d16, 0x9d32, 0x9d16, 0x080c, 0x0dd5,
-	0x7914, 0x918c, 0x08ff, 0x918d, 0xf600, 0x7916, 0x2009, 0x0003,
-	0x00b9, 0x2069, 0x1847, 0x6804, 0xd0bc, 0x0130, 0x682c, 0x9084,
-	0x00ff, 0x8007, 0x7032, 0x0010, 0x7033, 0x3f00, 0x60c3, 0x0001,
-	0x0804, 0x9fd0, 0x2009, 0x0003, 0x0019, 0x7033, 0x7f00, 0x0cb0,
-	0x0016, 0x080c, 0xa82b, 0x001e, 0xb810, 0x9085, 0x0100, 0x7002,
-	0xb814, 0x7006, 0x2069, 0x1800, 0x6a7c, 0x720a, 0x6a80, 0x720e,
-	0x7013, 0x0888, 0x918d, 0x0008, 0x7116, 0x080c, 0x9fbe, 0x721a,
-	0x7a08, 0x7222, 0x2f10, 0x7226, 0x0005, 0x00b6, 0x00e6, 0x00d6,
-	0x00c6, 0x0066, 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071,
-	0x1800, 0x7160, 0x7810, 0x2058, 0x76dc, 0x96b4, 0x0028, 0x0110,
-	0x737c, 0x7480, 0x2500, 0x76dc, 0x96b4, 0x0028, 0x0140, 0x2001,
-	0x04ff, 0x6062, 0x6067, 0xffff, 0x636a, 0x646e, 0x0050, 0x2001,
-	0x00ff, 0x9085, 0x0400, 0x6062, 0x6067, 0xffff, 0x606b, 0x0000,
-	0x616e, 0xb8b8, 0x6073, 0x0530, 0x6077, 0x0008, 0xb88c, 0x8000,
-	0x9084, 0x00ff, 0xb88e, 0x8007, 0x9085, 0x0020, 0x607a, 0x607f,
-	0x0000, 0x2b00, 0x6082, 0x6087, 0xffff, 0x7814, 0x0096, 0x2048,
+	0x7824, 0xd0cc, 0x1168, 0x7013, 0x0898, 0x080c, 0xa21b, 0x721a,
+	0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071, 0x024c, 0x00de, 0x0005,
+	0x7013, 0x0889, 0x0c90, 0x0016, 0x7814, 0x9084, 0x0700, 0x8007,
+	0x0013, 0x001e, 0x0005, 0x9f73, 0x9f73, 0x9f75, 0x9f73, 0x9f73,
+	0x9f73, 0x9f8f, 0x9f73, 0x080c, 0x0dd5, 0x7914, 0x918c, 0x08ff,
+	0x918d, 0xf600, 0x7916, 0x2009, 0x0003, 0x00b9, 0x2069, 0x1847,
+	0x6804, 0xd0bc, 0x0130, 0x682c, 0x9084, 0x00ff, 0x8007, 0x7032,
+	0x0010, 0x7033, 0x3f00, 0x60c3, 0x0001, 0x0804, 0xa22d, 0x2009,
+	0x0003, 0x0019, 0x7033, 0x7f00, 0x0cb0, 0x0016, 0x080c, 0xab07,
+	0x001e, 0xb810, 0x9085, 0x0100, 0x7002, 0xb814, 0x7006, 0x2069,
+	0x1800, 0x6a7c, 0x720a, 0x6a80, 0x720e, 0x7013, 0x0888, 0x918d,
+	0x0008, 0x7116, 0x080c, 0xa21b, 0x721a, 0x7a08, 0x7222, 0x2f10,
+	0x7226, 0x0005, 0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056,
+	0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0x1800, 0x7160, 0x7810,
+	0x2058, 0x76dc, 0x96b4, 0x0028, 0x0110, 0x737c, 0x7480, 0x2500,
+	0x76dc, 0x96b4, 0x0028, 0x0140, 0x2001, 0x04ff, 0x6062, 0x6067,
+	0xffff, 0x636a, 0x646e, 0x0050, 0x2001, 0x00ff, 0x9085, 0x0400,
+	0x6062, 0x6067, 0xffff, 0x606b, 0x0000, 0x616e, 0xb8b8, 0x6073,
+	0x0530, 0x6077, 0x0008, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e,
+	0x8007, 0x9085, 0x0020, 0x607a, 0x607f, 0x0000, 0x2b00, 0x6082,
+	0x6087, 0xffff, 0x7814, 0x0096, 0x2048, 0xa838, 0x608a, 0xa834,
+	0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca, 0x009e, 0xb86c, 0x60ce,
+	0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, 0x2001, 0x1837,
+	0x2004, 0x9084, 0x0028, 0x0128, 0x609f, 0x0000, 0x2001, 0x0092,
+	0x0048, 0x6028, 0xc0bd, 0x602a, 0x609f, 0x00ff, 0x6027, 0xffff,
+	0x2001, 0x00b2, 0x6016, 0x2009, 0x07d0, 0x080c, 0x8555, 0x003e,
+	0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00be, 0x0005,
+	0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, 0x0036,
+	0x2061, 0x0100, 0x2071, 0x1800, 0x7160, 0x7810, 0x2058, 0xb8a0,
+	0x2028, 0x76dc, 0xd6ac, 0x1168, 0x9582, 0x007e, 0x1250, 0x2500,
+	0x9094, 0xff80, 0x1130, 0x9080, 0x331e, 0x2015, 0x9294, 0x00ff,
+	0x0020, 0xb910, 0xba14, 0x737c, 0x7480, 0x70dc, 0xd0ac, 0x1130,
+	0x9582, 0x007e, 0x1218, 0x9584, 0xff80, 0x0138, 0x9185, 0x0400,
+	0x6062, 0x6266, 0x636a, 0x646e, 0x0030, 0x6063, 0x0400, 0x6266,
+	0x606b, 0x0000, 0x616e, 0xb8b8, 0x6072, 0x6077, 0x0000, 0xb864,
+	0xd0a4, 0x0110, 0x6077, 0x0008, 0xb88c, 0x8000, 0x9084, 0x00ff,
+	0xb88e, 0x8007, 0x9085, 0x0020, 0x607a, 0x607f, 0x0000, 0x2b00,
+	0x6082, 0x6087, 0xffff, 0x7814, 0x0096, 0x2048, 0xa838, 0x608a,
+	0xa834, 0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca, 0x009e, 0xb86c,
+	0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xbac0,
+	0x629e, 0x00f6, 0x2079, 0x0140, 0x7803, 0x0000, 0x00fe, 0x2009,
+	0x0092, 0x6116, 0x2009, 0x07d0, 0x080c, 0x8555, 0x003e, 0x004e,
+	0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00be, 0x0005, 0x00b6,
+	0x0096, 0x00e6, 0x00d6, 0x00c6, 0x0056, 0x0046, 0x0036, 0x2061,
+	0x0100, 0x2071, 0x1800, 0x7810, 0x2058, 0xb8a0, 0x2028, 0xb910,
+	0xba14, 0x737c, 0x7480, 0x7820, 0x90be, 0x0006, 0x0904, 0xa18a,
+	0x90be, 0x000a, 0x1904, 0xa146, 0x609f, 0x0000, 0x7814, 0x2048,
+	0xa87c, 0xd0fc, 0x05d0, 0xaf90, 0x9784, 0xff00, 0x9105, 0x6062,
+	0x873f, 0x9784, 0xff00, 0x0006, 0x7814, 0x2048, 0xa878, 0xc0fc,
+	0x9005, 0x000e, 0x1160, 0xaf94, 0x87ff, 0x0510, 0x2039, 0x0098,
+	0x9705, 0x6072, 0x7808, 0x6082, 0x2f00, 0x6086, 0x0038, 0x9185,
+	0x2200, 0x6062, 0x6073, 0x0129, 0x6077, 0x0000, 0x609f, 0x0000,
+	0x2001, 0x1837, 0x2004, 0xd0ac, 0x11a8, 0xd09c, 0x0130, 0x7814,
+	0x2048, 0xa874, 0x9082, 0x0080, 0x1268, 0xb814, 0x609e, 0x0050,
+	0x2039, 0x0029, 0x9705, 0x6072, 0x0c48, 0x9185, 0x0200, 0x6062,
+	0x6073, 0x2029, 0xa87c, 0xd0fc, 0x0118, 0xaf94, 0x87ff, 0x1120,
+	0x2f00, 0x6082, 0x7808, 0x6086, 0x6266, 0x636a, 0x646e, 0x6077,
+	0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a,
+	0x607f, 0x0000, 0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6,
+	0xa844, 0x60ca, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000,
+	0x080c, 0xaaec, 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005,
+	0x0110, 0x2009, 0x1b58, 0x080c, 0x8555, 0x003e, 0x004e, 0x005e,
+	0x00ce, 0x00de, 0x00ee, 0x009e, 0x00be, 0x0005, 0x7804, 0x9086,
+	0x0040, 0x0904, 0xa1c6, 0x9185, 0x0100, 0x6062, 0x6266, 0x636a,
+	0x646e, 0x6073, 0x0809, 0x6077, 0x0008, 0x60af, 0x95d5, 0x60d7,
+	0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a,
+	0x607f, 0x0000, 0x2f00, 0x6082, 0x7808, 0x6086, 0x7814, 0x2048,
+	0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca,
+	0xb86c, 0x60ce, 0xbac0, 0x629e, 0x080c, 0xaaec, 0x2009, 0x07d0,
+	0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110, 0x2009, 0x1b58, 0x080c,
+	0x8555, 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x009e,
+	0x00be, 0x0005, 0x7814, 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086,
+	0x0002, 0x0904, 0xa1e2, 0x9185, 0x0100, 0x6062, 0x6266, 0x636a,
+	0x646e, 0x6073, 0x0880, 0x6077, 0x0008, 0xb88c, 0x8000, 0x9084,
+	0x00ff, 0xb88e, 0x8007, 0x607a, 0x7838, 0x607e, 0x2f00, 0x6086,
+	0x7808, 0x6082, 0xa890, 0x608a, 0xa88c, 0x608e, 0xa8b0, 0x60c6,
+	0xa8ac, 0x60ca, 0xa8ac, 0x7930, 0x9108, 0x7932, 0xa8b0, 0x792c,
+	0x9109, 0x792e, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000,
+	0xbac0, 0x629e, 0x080c, 0xaac9, 0x0804, 0xa176, 0xb8cc, 0xd084,
+	0x0148, 0xb88c, 0x7814, 0x2048, 0xb88c, 0x7846, 0xa836, 0x2900,
+	0xa83a, 0xb04a, 0x9185, 0x0600, 0x6062, 0x6266, 0x636a, 0x646e,
+	0x6073, 0x0829, 0x6077, 0x0000, 0x60af, 0x9575, 0x60d7, 0x0000,
+	0x0804, 0xa159, 0x9185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e,
+	0x7824, 0xd0cc, 0x7826, 0x0118, 0x6073, 0x0889, 0x0010, 0x6073,
+	0x0898, 0x6077, 0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e,
+	0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808, 0x6082,
 	0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca,
-	0x009e, 0xb86c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7,
-	0x0000, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028, 0x0128, 0x609f,
-	0x0000, 0x2001, 0x0092, 0x0048, 0x6028, 0xc0bd, 0x602a, 0x609f,
-	0x00ff, 0x6027, 0xffff, 0x2001, 0x00b2, 0x6016, 0x2009, 0x07d0,
-	0x080c, 0x830d, 0x003e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de,
-	0x00ee, 0x00be, 0x0005, 0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066,
-	0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0x1800, 0x7160,
-	0x7810, 0x2058, 0xb8a0, 0x2028, 0x76dc, 0xd6ac, 0x1168, 0x9582,
-	0x007e, 0x1250, 0x2500, 0x9094, 0xff80, 0x1130, 0x9080, 0x31d0,
-	0x2015, 0x9294, 0x00ff, 0x0020, 0xb910, 0xba14, 0x737c, 0x7480,
-	0x70dc, 0xd0ac, 0x1130, 0x9582, 0x007e, 0x1218, 0x9584, 0xff80,
-	0x0138, 0x9185, 0x0400, 0x6062, 0x6266, 0x636a, 0x646e, 0x0030,
-	0x6063, 0x0400, 0x6266, 0x606b, 0x0000, 0x616e, 0xb8b8, 0x6072,
-	0x6077, 0x0000, 0xb864, 0xd0a4, 0x0110, 0x6077, 0x0008, 0xb88c,
-	0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x9085, 0x0020, 0x607a,
-	0x607f, 0x0000, 0x2b00, 0x6082, 0x6087, 0xffff, 0x7814, 0x0096,
-	0x2048, 0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844,
-	0x60ca, 0x009e, 0xb86c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5,
-	0x60d7, 0x0000, 0xbac0, 0x629e, 0x00f6, 0x2079, 0x0140, 0x7803,
-	0x0000, 0x00fe, 0x2009, 0x0092, 0x6116, 0x2009, 0x07d0, 0x080c,
-	0x830d, 0x003e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee,
-	0x00be, 0x0005, 0x00b6, 0x0096, 0x00e6, 0x00d6, 0x00c6, 0x0056,
-	0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0x1800, 0x7810, 0x2058,
-	0xb8a0, 0x2028, 0xb910, 0xba14, 0x737c, 0x7480, 0x7820, 0x90be,
-	0x0006, 0x0904, 0x9f2d, 0x90be, 0x000a, 0x1904, 0x9ee9, 0x609f,
-	0x0000, 0x7814, 0x2048, 0xa87c, 0xd0fc, 0x05d0, 0xaf90, 0x9784,
-	0xff00, 0x9105, 0x6062, 0x873f, 0x9784, 0xff00, 0x0006, 0x7814,
-	0x2048, 0xa878, 0xc0fc, 0x9005, 0x000e, 0x1160, 0xaf94, 0x87ff,
-	0x0510, 0x2039, 0x0098, 0x9705, 0x6072, 0x7808, 0x6082, 0x2f00,
-	0x6086, 0x0038, 0x9185, 0x2200, 0x6062, 0x6073, 0x0129, 0x6077,
-	0x0000, 0x609f, 0x0000, 0x2001, 0x1837, 0x2004, 0xd0ac, 0x11a8,
-	0xd09c, 0x0130, 0x7814, 0x2048, 0xa874, 0x9082, 0x0080, 0x1268,
-	0xb814, 0x609e, 0x0050, 0x2039, 0x0029, 0x9705, 0x6072, 0x0c48,
-	0x9185, 0x0200, 0x6062, 0x6073, 0x2029, 0xa87c, 0xd0fc, 0x0118,
-	0xaf94, 0x87ff, 0x1120, 0x2f00, 0x6082, 0x7808, 0x6086, 0x6266,
-	0x636a, 0x646e, 0x6077, 0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff,
-	0xb88e, 0x8007, 0x607a, 0x607f, 0x0000, 0xa838, 0x608a, 0xa834,
-	0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca, 0xb86c, 0x60ce, 0x60af,
-	0x95d5, 0x60d7, 0x0000, 0x080c, 0xa810, 0x2009, 0x07d0, 0x60c4,
-	0x9084, 0xfff0, 0x9005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x830d,
-	0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x009e, 0x00be,
-	0x0005, 0x7804, 0x9086, 0x0040, 0x0904, 0x9f69, 0x9185, 0x0100,
-	0x6062, 0x6266, 0x636a, 0x646e, 0x6073, 0x0809, 0x6077, 0x0008,
-	0x60af, 0x95d5, 0x60d7, 0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff,
-	0xb88e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6082, 0x7808,
-	0x6086, 0x7814, 0x2048, 0xa838, 0x608a, 0xa834, 0x608e, 0xa848,
-	0x60c6, 0xa844, 0x60ca, 0xb86c, 0x60ce, 0xbac0, 0x629e, 0x080c,
-	0xa810, 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110,
-	0x2009, 0x1b58, 0x080c, 0x830d, 0x003e, 0x004e, 0x005e, 0x00ce,
-	0x00de, 0x00ee, 0x009e, 0x00be, 0x0005, 0x7814, 0x2048, 0xa87c,
-	0x9084, 0x0003, 0x9086, 0x0002, 0x0904, 0x9f85, 0x9185, 0x0100,
-	0x6062, 0x6266, 0x636a, 0x646e, 0x6073, 0x0880, 0x6077, 0x0008,
-	0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a, 0x7838,
-	0x607e, 0x2f00, 0x6086, 0x7808, 0x6082, 0xa890, 0x608a, 0xa88c,
-	0x608e, 0xa8b0, 0x60c6, 0xa8ac, 0x60ca, 0xa8ac, 0x7930, 0x9108,
-	0x7932, 0xa8b0, 0x792c, 0x9109, 0x792e, 0xb86c, 0x60ce, 0x60af,
-	0x95d5, 0x60d7, 0x0000, 0xbac0, 0x629e, 0x080c, 0xa7ed, 0x0804,
-	0x9f19, 0xb8cc, 0xd084, 0x0148, 0xb88c, 0x7814, 0x2048, 0xb88c,
-	0x7846, 0xa836, 0x2900, 0xa83a, 0xb04a, 0x9185, 0x0600, 0x6062,
-	0x6266, 0x636a, 0x646e, 0x6073, 0x0829, 0x6077, 0x0000, 0x60af,
-	0x9575, 0x60d7, 0x0000, 0x0804, 0x9efc, 0x9185, 0x0700, 0x6062,
-	0x6266, 0x636a, 0x646e, 0x7824, 0xd0cc, 0x7826, 0x0118, 0x6073,
-	0x0889, 0x0010, 0x6073, 0x0898, 0x6077, 0x0000, 0xb88c, 0x8000,
-	0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00,
-	0x6086, 0x7808, 0x6082, 0xa838, 0x608a, 0xa834, 0x608e, 0xa848,
-	0x60c6, 0xa844, 0x60ca, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7,
-	0x0000, 0xbac0, 0x629e, 0x7824, 0xd0cc, 0x0120, 0x080c, 0xa810,
-	0x0804, 0x9f19, 0x080c, 0xa7ed, 0x0804, 0x9f19, 0x7a10, 0x00b6,
-	0x2258, 0xba8c, 0x8210, 0x9294, 0x00ff, 0xba8e, 0x00be, 0x8217,
-	0x0005, 0x00d6, 0x2069, 0x19e5, 0x6843, 0x0001, 0x00de, 0x0005,
-	0x60a3, 0x0056, 0x60a7, 0x9575, 0x00f1, 0x080c, 0x82ff, 0x0005,
-	0x0016, 0x2001, 0x180c, 0x200c, 0x9184, 0x0600, 0x9086, 0x0600,
-	0x0128, 0x0089, 0x080c, 0x82ff, 0x001e, 0x0005, 0xc1e5, 0x2001,
-	0x180c, 0x2102, 0x2001, 0x19e6, 0x2003, 0x0000, 0x2001, 0x19ee,
-	0x2003, 0x0000, 0x0c88, 0x0006, 0x6014, 0x9084, 0x1804, 0x9085,
-	0x0009, 0x6016, 0x000e, 0x0005, 0x0016, 0x00c6, 0x0006, 0x2061,
-	0x0100, 0x61a4, 0x60a7, 0x95f5, 0x6014, 0x9084, 0x1804, 0x9085,
-	0x0008, 0x6016, 0x000e, 0xa001, 0xa001, 0xa001, 0x61a6, 0x00ce,
-	0x001e, 0x0005, 0x00c6, 0x00d6, 0x0016, 0x0026, 0x2061, 0x0100,
-	0x2069, 0x0140, 0x080c, 0x717d, 0x11e8, 0x2001, 0x1a01, 0x2004,
-	0x9005, 0x1904, 0xa062, 0x0066, 0x2031, 0x0001, 0x080c, 0x722d,
-	0x006e, 0x1160, 0x2061, 0x0100, 0x6020, 0xd0b4, 0x1120, 0x6024,
-	0xd084, 0x090c, 0x0dd5, 0x080c, 0x82ff, 0x0460, 0x00c6, 0x2061,
-	0x19e5, 0x00d0, 0x6904, 0x9194, 0x4000, 0x0548, 0x080c, 0x9ffc,
-	0x080c, 0x2bb1, 0x00c6, 0x2061, 0x19e5, 0x6128, 0x9192, 0x0008,
-	0x1258, 0x8108, 0x612a, 0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c,
-	0x82ff, 0x080c, 0x9ff3, 0x0070, 0x6124, 0x91e5, 0x0000, 0x0140,
-	0x080c, 0xe6a1, 0x080c, 0x8308, 0x2009, 0x0014, 0x080c, 0xabe6,
-	0x00ce, 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001,
-	0x1a01, 0x2004, 0x9005, 0x1db0, 0x00c6, 0x2061, 0x19e5, 0x6128,
-	0x9192, 0x0003, 0x1e08, 0x8108, 0x612a, 0x00ce, 0x080c, 0x82ff,
-	0x080c, 0x5cb7, 0x2009, 0x1846, 0x2114, 0x8210, 0x220a, 0x0c10,
-	0x0096, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026, 0x080c, 0x8315,
-	0x2071, 0x19e5, 0x713c, 0x81ff, 0x0904, 0xa102, 0x2061, 0x0100,
-	0x2069, 0x0140, 0x080c, 0x717d, 0x1500, 0x0036, 0x2019, 0x0002,
-	0x080c, 0xa2ac, 0x003e, 0x713c, 0x2160, 0x080c, 0xe6a1, 0x2009,
-	0x004a, 0x6220, 0x9296, 0x0009, 0x1130, 0x6114, 0x2148, 0xa87b,
-	0x0006, 0x2009, 0x004a, 0x080c, 0xabe6, 0x0066, 0x2031, 0x0001,
-	0x080c, 0x722d, 0x006e, 0x0804, 0xa102, 0x6904, 0xd1f4, 0x0904,
-	0xa109, 0x080c, 0x2bb1, 0x00c6, 0x703c, 0x9065, 0x090c, 0x0dd5,
-	0x6020, 0x00ce, 0x9086, 0x0006, 0x1528, 0x61c8, 0x60c4, 0x9105,
-	0x1508, 0x2009, 0x180c, 0x2104, 0xd0d4, 0x01e0, 0x6214, 0x9294,
-	0x1800, 0x1128, 0x6224, 0x9294, 0x0002, 0x1560, 0x0030, 0xc0d4,
-	0x200a, 0xd0cc, 0x0110, 0x080c, 0x2b04, 0x6014, 0x9084, 0xe7fd,
-	0x9085, 0x0010, 0x6016, 0x703c, 0x2060, 0x2009, 0x0049, 0x080c,
-	0xabe6, 0x00c0, 0x0036, 0x2019, 0x0001, 0x080c, 0xa2ac, 0x003e,
-	0x713c, 0x2160, 0x080c, 0xe6a1, 0x2009, 0x004a, 0x6220, 0x9296,
+	0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xbac0, 0x629e,
+	0x7824, 0xd0cc, 0x0120, 0x080c, 0xaaec, 0x0804, 0xa176, 0x080c,
+	0xaac9, 0x0804, 0xa176, 0x7a10, 0x00b6, 0x2258, 0xba8c, 0x8210,
+	0x9294, 0x00ff, 0xba8e, 0x00be, 0x8217, 0x0005, 0x00d6, 0x2069,
+	0x19e7, 0x6843, 0x0001, 0x00de, 0x0005, 0x60a3, 0x0056, 0x60a7,
+	0x9575, 0x00f1, 0x080c, 0x8547, 0x0005, 0x0016, 0x2001, 0x180c,
+	0x200c, 0x9184, 0x0600, 0x9086, 0x0600, 0x0128, 0x0089, 0x080c,
+	0x8547, 0x001e, 0x0005, 0xc1e5, 0x2001, 0x180c, 0x2102, 0x2001,
+	0x19e8, 0x2003, 0x0000, 0x2001, 0x19f0, 0x2003, 0x0000, 0x0c88,
+	0x0006, 0x6014, 0x9084, 0x1804, 0x9085, 0x0009, 0x6016, 0x000e,
+	0x0005, 0x0016, 0x00c6, 0x0006, 0x2061, 0x0100, 0x61a4, 0x60a7,
+	0x95f5, 0x6014, 0x9084, 0x1804, 0x9085, 0x0008, 0x6016, 0x000e,
+	0xa001, 0xa001, 0xa001, 0x61a6, 0x00ce, 0x001e, 0x0005, 0x00c6,
+	0x00d6, 0x0016, 0x0026, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c,
+	0x73b0, 0x11e8, 0x2001, 0x1a03, 0x2004, 0x9005, 0x1904, 0xa2bf,
+	0x0066, 0x2031, 0x0001, 0x080c, 0x7460, 0x006e, 0x1160, 0x2061,
+	0x0100, 0x6020, 0xd0b4, 0x1120, 0x6024, 0xd084, 0x090c, 0x0dd5,
+	0x080c, 0x8547, 0x0460, 0x00c6, 0x2061, 0x19e7, 0x00d0, 0x6904,
+	0x9194, 0x4000, 0x0548, 0x080c, 0xa259, 0x080c, 0x2cff, 0x00c6,
+	0x2061, 0x19e7, 0x6128, 0x9192, 0x0008, 0x1258, 0x8108, 0x612a,
+	0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c, 0x8547, 0x080c, 0xa250,
+	0x0070, 0x6124, 0x91e5, 0x0000, 0x0140, 0x080c, 0xe9dd, 0x080c,
+	0x8550, 0x2009, 0x0014, 0x080c, 0xaec2, 0x00ce, 0x0000, 0x002e,
+	0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, 0x1a03, 0x2004, 0x9005,
+	0x1db0, 0x00c6, 0x2061, 0x19e7, 0x6128, 0x9192, 0x0003, 0x1e08,
+	0x8108, 0x612a, 0x00ce, 0x080c, 0x8547, 0x080c, 0x5eda, 0x2009,
+	0x1846, 0x2114, 0x8210, 0x220a, 0x0c10, 0x0096, 0x00c6, 0x00d6,
+	0x00e6, 0x0016, 0x0026, 0x080c, 0x855d, 0x2071, 0x19e7, 0x713c,
+	0x81ff, 0x0904, 0xa363, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c,
+	0x73b0, 0x1500, 0x0036, 0x2019, 0x0002, 0x080c, 0xa59c, 0x003e,
+	0x713c, 0x2160, 0x080c, 0xe9dd, 0x2009, 0x004a, 0x6220, 0x9296,
 	0x0009, 0x1130, 0x6114, 0x2148, 0xa87b, 0x0006, 0x2009, 0x004a,
-	0x080c, 0xabe6, 0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x009e,
-	0x0005, 0xd1ec, 0x1904, 0xa0b9, 0x0804, 0xa0bb, 0x0026, 0x00e6,
-	0x2071, 0x19e5, 0x7048, 0xd084, 0x01d8, 0x713c, 0x81ff, 0x01c0,
+	0x080c, 0xaec2, 0x0066, 0x2031, 0x0001, 0x080c, 0x7460, 0x006e,
+	0x0804, 0xa363, 0x080c, 0xa36f, 0x0904, 0xa363, 0x6904, 0xd1f4,
+	0x0904, 0xa36a, 0x080c, 0x2cff, 0x00c6, 0x703c, 0x9065, 0x090c,
+	0x0dd5, 0x6020, 0x00ce, 0x9086, 0x0006, 0x1528, 0x61c8, 0x60c4,
+	0x9105, 0x1508, 0x2009, 0x180c, 0x2104, 0xd0d4, 0x01e0, 0x6214,
+	0x9294, 0x1800, 0x1128, 0x6224, 0x9294, 0x0002, 0x1560, 0x0030,
+	0xc0d4, 0x200a, 0xd0cc, 0x0110, 0x080c, 0x2c52, 0x6014, 0x9084,
+	0xe7fd, 0x9085, 0x0010, 0x6016, 0x703c, 0x2060, 0x2009, 0x0049,
+	0x080c, 0xaec2, 0x00c0, 0x0036, 0x2019, 0x0001, 0x080c, 0xa59c,
+	0x003e, 0x713c, 0x2160, 0x080c, 0xe9dd, 0x2009, 0x004a, 0x6220,
+	0x9296, 0x0009, 0x1130, 0x6114, 0x2148, 0xa87b, 0x0006, 0x2009,
+	0x004a, 0x080c, 0xaec2, 0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce,
+	0x009e, 0x0005, 0xd1ec, 0x1904, 0xa31a, 0x0804, 0xa31c, 0x00d6,
+	0x00c6, 0x0096, 0x703c, 0x9065, 0x090c, 0x0dd5, 0x2001, 0x1837,
+	0x2004, 0xd09c, 0x1904, 0xa3fb, 0x2001, 0x0306, 0x200c, 0x9184,
+	0x0030, 0x0904, 0xa3fb, 0x9184, 0x0048, 0x9086, 0x0008, 0x1904,
+	0xa3fb, 0x2001, 0x020b, 0x2004, 0xd0fc, 0x0904, 0xa3fb, 0xd08c,
+	0x0904, 0xa3fb, 0x2009, 0x1a80, 0x2104, 0x8000, 0x0208, 0x200a,
+	0x2069, 0x0100, 0x6914, 0x918c, 0x0184, 0x918d, 0x0010, 0x6916,
+	0x69c8, 0x2011, 0x0020, 0x68c8, 0x9106, 0x1570, 0x8211, 0x1dd8,
+	0x2001, 0x0306, 0x2003, 0x4800, 0x2001, 0x009a, 0x2003, 0x0004,
+	0x2001, 0x1a66, 0x2003, 0x0000, 0x2001, 0x1a6f, 0x2003, 0x0000,
+	0x6a88, 0x698c, 0x2200, 0x9105, 0x1120, 0x2c10, 0x080c, 0x1bad,
+	0x0040, 0x6014, 0x2048, 0xaa3a, 0xa936, 0x6ac4, 0x69c8, 0xa946,
+	0xaa4a, 0x0126, 0x00c6, 0x2091, 0x2400, 0x002e, 0x080c, 0x1c46,
+	0x190c, 0x0dd5, 0x012e, 0x0090, 0x2009, 0x1a81, 0x2104, 0x8000,
+	0x0208, 0x200a, 0x69c8, 0x2011, 0x0020, 0x8211, 0x1df0, 0x68c8,
+	0x9106, 0x1dc0, 0x69c4, 0x68c8, 0x9105, 0x0160, 0x6824, 0xd08c,
+	0x0110, 0x6827, 0x0002, 0x7048, 0xc085, 0x704a, 0x0079, 0x7048,
+	0xc084, 0x704a, 0x2009, 0x07d0, 0x080c, 0x8555, 0x9006, 0x009e,
+	0x00ce, 0x00de, 0x0005, 0x9085, 0x0001, 0x0cc8, 0x0026, 0x00e6,
+	0x2071, 0x19e7, 0x7048, 0xd084, 0x01d8, 0x713c, 0x81ff, 0x01c0,
 	0x2071, 0x0100, 0x9188, 0x0008, 0x2114, 0x928e, 0x0006, 0x1138,
 	0x7014, 0x9084, 0x1984, 0x9085, 0x0012, 0x7016, 0x0048, 0x928e,
 	0x0009, 0x0db0, 0x7014, 0x9084, 0x1984, 0x9085, 0x0016, 0x7016,
 	0x00ee, 0x002e, 0x0005, 0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066,
 	0x0056, 0x0046, 0x0006, 0x0126, 0x2091, 0x8000, 0x6010, 0x2058,
-	0xbca0, 0x2071, 0x19e5, 0x7018, 0x2058, 0x8bff, 0x0190, 0xb8a0,
+	0xbca0, 0x2071, 0x19e7, 0x7018, 0x2058, 0x8bff, 0x0190, 0xb8a0,
 	0x9406, 0x0118, 0xb854, 0x2058, 0x0cc0, 0x6014, 0x0096, 0x2048,
-	0xac6c, 0xad70, 0xae78, 0x009e, 0x080c, 0x64ff, 0x0110, 0x9085,
+	0xac6c, 0xad70, 0xae78, 0x009e, 0x080c, 0x6732, 0x0110, 0x9085,
 	0x0001, 0x012e, 0x000e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de,
-	0x00ee, 0x00be, 0x0005, 0x080c, 0x99ef, 0x7003, 0x1200, 0x7838,
+	0x00ee, 0x00be, 0x0005, 0x080c, 0x9c37, 0x7003, 0x1200, 0x7838,
 	0x7012, 0x783c, 0x7016, 0x00c6, 0x7820, 0x9086, 0x0004, 0x1148,
 	0x7810, 0x9005, 0x0130, 0x00b6, 0x2058, 0xb810, 0xb914, 0x00be,
 	0x0020, 0x2061, 0x1800, 0x607c, 0x6180, 0x9084, 0x00ff, 0x700a,
-	0x710e, 0x00ce, 0x60c3, 0x002c, 0x0804, 0x9fd0, 0x080c, 0x99ef,
+	0x710e, 0x00ce, 0x60c3, 0x002c, 0x0804, 0xa22d, 0x080c, 0x9c37,
 	0x7003, 0x0f00, 0x7808, 0xd09c, 0x0128, 0xb810, 0x9084, 0x00ff,
-	0x700a, 0xb814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9fd0, 0x0156,
-	0x080c, 0x9a3a, 0x7003, 0x0200, 0x080c, 0x8368, 0x20a9, 0x0006,
+	0x700a, 0xb814, 0x700e, 0x60c3, 0x0008, 0x0804, 0xa22d, 0x0156,
+	0x080c, 0x9c82, 0x7003, 0x0200, 0x080c, 0x85b0, 0x20a9, 0x0006,
 	0x2011, 0xfff4, 0x2019, 0xfff5, 0x9ef0, 0x0002, 0x2305, 0x2072,
 	0x8e70, 0x2205, 0x2072, 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002,
-	0x1f04, 0xa1a6, 0x60c3, 0x001c, 0x015e, 0x0804, 0x9fd0, 0x0016,
-	0x0026, 0x080c, 0x9a16, 0x080c, 0x9a28, 0x9e80, 0x0004, 0x20e9,
+	0x1f04, 0xa496, 0x60c3, 0x001c, 0x015e, 0x0804, 0xa22d, 0x0016,
+	0x0026, 0x080c, 0x9c5e, 0x080c, 0x9c70, 0x9e80, 0x0004, 0x20e9,
 	0x0000, 0x20a0, 0x7814, 0x0096, 0x2048, 0xa800, 0x2048, 0xa860,
 	0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, 0x009e, 0x7808, 0x9088,
 	0x0002, 0x21a8, 0x9192, 0x0010, 0x1250, 0x4003, 0x9080, 0x0004,
-	0x8003, 0x60c2, 0x080c, 0x9fd0, 0x002e, 0x001e, 0x0005, 0x20a9,
-	0x0010, 0x4003, 0x080c, 0xa816, 0x20a1, 0x0240, 0x22a8, 0x4003,
-	0x0c68, 0x080c, 0x99ef, 0x7003, 0x6200, 0x7808, 0x700e, 0x60c3,
-	0x0008, 0x0804, 0x9fd0, 0x0016, 0x0026, 0x080c, 0x99ef, 0x20e9,
+	0x8003, 0x60c2, 0x080c, 0xa22d, 0x002e, 0x001e, 0x0005, 0x20a9,
+	0x0010, 0x4003, 0x080c, 0xaaf2, 0x20a1, 0x0240, 0x22a8, 0x4003,
+	0x0c68, 0x080c, 0x9c37, 0x7003, 0x6200, 0x7808, 0x700e, 0x60c3,
+	0x0008, 0x0804, 0xa22d, 0x0016, 0x0026, 0x080c, 0x9c37, 0x20e9,
 	0x0000, 0x20a1, 0x024c, 0x7814, 0x0096, 0x2048, 0xa800, 0x2048,
 	0xa860, 0x20e0, 0xa85c, 0x9080, 0x0023, 0x2098, 0x009e, 0x7808,
-	0x9088, 0x0002, 0x21a8, 0x4003, 0x8003, 0x60c2, 0x080c, 0x9fd0,
+	0x9088, 0x0002, 0x21a8, 0x4003, 0x8003, 0x60c2, 0x080c, 0xa22d,
 	0x002e, 0x001e, 0x0005, 0x00e6, 0x00c6, 0x0006, 0x0126, 0x2091,
-	0x8000, 0x2071, 0x19e5, 0x700c, 0x2060, 0x8cff, 0x0178, 0x080c,
-	0xca24, 0x1110, 0x080c, 0xb51d, 0x600c, 0x0006, 0x080c, 0xcc8b,
-	0x080c, 0xab6b, 0x080c, 0xa39c, 0x00ce, 0x0c78, 0x2c00, 0x700e,
+	0x8000, 0x2071, 0x19e7, 0x700c, 0x2060, 0x8cff, 0x0178, 0x080c,
+	0xcd21, 0x1110, 0x080c, 0xb7f9, 0x600c, 0x0006, 0x080c, 0xcf88,
+	0x080c, 0xae47, 0x080c, 0xa678, 0x00ce, 0x0c78, 0x2c00, 0x700e,
 	0x700a, 0x012e, 0x000e, 0x00ce, 0x00ee, 0x0005, 0x0126, 0x0156,
 	0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0016, 0x0006,
 	0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, 0xe7ff, 0x2102,
-	0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x19e5, 0x7024, 0x2060,
-	0x8cff, 0x01f8, 0x080c, 0x9ffc, 0x6ac0, 0x68c3, 0x0000, 0x080c,
-	0x8308, 0x00c6, 0x2061, 0x0100, 0x080c, 0xa967, 0x00ce, 0x20a9,
-	0x01f4, 0x0461, 0x2009, 0x0013, 0x080c, 0xabe6, 0x000e, 0x001e,
+	0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x19e7, 0x7024, 0x2060,
+	0x8cff, 0x01f8, 0x080c, 0xa259, 0x6ac0, 0x68c3, 0x0000, 0x080c,
+	0x8550, 0x00c6, 0x2061, 0x0100, 0x080c, 0xac43, 0x00ce, 0x20a9,
+	0x01f4, 0x0461, 0x2009, 0x0013, 0x080c, 0xaec2, 0x000e, 0x001e,
 	0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e,
 	0x0005, 0x2001, 0x1800, 0x2004, 0x9096, 0x0001, 0x0d78, 0x9096,
-	0x0004, 0x0d60, 0x080c, 0x8308, 0x6814, 0x9084, 0x0001, 0x0110,
-	0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x5c61,
-	0x080c, 0x8285, 0x20a9, 0x01f4, 0x0009, 0x08c0, 0x6824, 0xd094,
-	0x0140, 0x6827, 0x0004, 0x7804, 0x9084, 0x4000, 0x190c, 0x2bb1,
-	0x0090, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, 0xa28e,
-	0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2ba1,
-	0x9006, 0x080c, 0x2ba1, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6,
+	0x0004, 0x0d60, 0x080c, 0x8550, 0x6814, 0x9084, 0x0001, 0x0110,
+	0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x5e84,
+	0x080c, 0x84ca, 0x20a9, 0x01f4, 0x0009, 0x08c0, 0x6824, 0xd094,
+	0x0140, 0x6827, 0x0004, 0x7804, 0x9084, 0x4000, 0x190c, 0x2cff,
+	0x0090, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, 0xa57e,
+	0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2cef,
+	0x9006, 0x080c, 0x2cef, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6,
 	0x00d6, 0x00c6, 0x0066, 0x0026, 0x0016, 0x0006, 0x2091, 0x8000,
 	0x2001, 0x180c, 0x200c, 0x918c, 0xdbff, 0x2102, 0x2069, 0x0100,
-	0x2079, 0x0140, 0x2071, 0x19e5, 0x703c, 0x2060, 0x8cff, 0x0904,
-	0xa33e, 0x9386, 0x0002, 0x1128, 0x6814, 0x9084, 0x0002, 0x0904,
-	0xa33e, 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009, 0x00fa, 0x8109,
-	0x1df0, 0x69c6, 0x68cb, 0x0008, 0x080c, 0x8315, 0x080c, 0x1ebc,
+	0x2079, 0x0140, 0x2071, 0x19e7, 0x703c, 0x2060, 0x8cff, 0x0904,
+	0xa62e, 0x9386, 0x0002, 0x1128, 0x6814, 0x9084, 0x0002, 0x0904,
+	0xa62e, 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009, 0x00fa, 0x8109,
+	0x1df0, 0x69c6, 0x68cb, 0x0008, 0x080c, 0x855d, 0x080c, 0x1ffa,
 	0x0046, 0x2009, 0x00a5, 0x080c, 0x0e51, 0x2021, 0x0169, 0x2404,
 	0x9084, 0x000f, 0x9086, 0x0004, 0x11f8, 0x68af, 0x95f5, 0x68c6,
-	0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079, 0x0090, 0x2071, 0x1a64,
+	0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079, 0x0090, 0x2071, 0x1a66,
 	0x6814, 0x9084, 0x1984, 0x9085, 0x0012, 0x6816, 0x782b, 0x0008,
 	0x7003, 0x0000, 0x00fe, 0x00ee, 0x9386, 0x0002, 0x1128, 0x7884,
-	0x9005, 0x1110, 0x7887, 0x0001, 0x2001, 0x197f, 0x200c, 0x080c,
+	0x9005, 0x1110, 0x7887, 0x0001, 0x2001, 0x1981, 0x200c, 0x080c,
 	0x0e51, 0x004e, 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0140, 0x6827,
-	0x0004, 0x7804, 0x9084, 0x4000, 0x190c, 0x2bb1, 0x0090, 0xd08c,
-	0x0118, 0x6827, 0x0002, 0x0010, 0x1f04, 0xa314, 0x7804, 0x9084,
-	0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2ba1, 0x9006, 0x080c,
-	0x2ba1, 0x6827, 0x4000, 0x6824, 0x83ff, 0x1140, 0x2009, 0x0049,
-	0x6020, 0x9086, 0x0009, 0x0110, 0x080c, 0xabe6, 0x000e, 0x001e,
+	0x0004, 0x7804, 0x9084, 0x4000, 0x190c, 0x2cff, 0x0090, 0xd08c,
+	0x0118, 0x6827, 0x0002, 0x0010, 0x1f04, 0xa604, 0x7804, 0x9084,
+	0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2cef, 0x9006, 0x080c,
+	0x2cef, 0x6827, 0x4000, 0x6824, 0x83ff, 0x1140, 0x2009, 0x0049,
+	0x6020, 0x9086, 0x0009, 0x0110, 0x080c, 0xaec2, 0x000e, 0x001e,
 	0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e,
-	0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0x19e5, 0x6a06,
+	0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0x19e7, 0x6a06,
 	0x012e, 0x00de, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069,
-	0x19e5, 0x6a32, 0x012e, 0x00de, 0x0005, 0x080c, 0x9b93, 0x7814,
-	0x080c, 0x54bf, 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x1000,
-	0x0478, 0x080c, 0x9b93, 0x7814, 0x080c, 0x54bf, 0x0108, 0x782c,
-	0x7032, 0x7042, 0x7047, 0x4000, 0x0418, 0x080c, 0x9b93, 0x7814,
-	0x080c, 0x54bf, 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x2000,
-	0x00b8, 0x080c, 0x9b93, 0x7814, 0x080c, 0x54bf, 0x0108, 0x782c,
-	0x7032, 0x7042, 0x7047, 0x0400, 0x0058, 0x080c, 0x9b93, 0x7814,
-	0x080c, 0x54bf, 0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x0200,
-	0x60c3, 0x0020, 0x0804, 0x9fd0, 0x00e6, 0x2071, 0x19e5, 0x7020,
-	0x9005, 0x0110, 0x8001, 0x7022, 0x00ee, 0x0005, 0x00f6, 0x00e6,
-	0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, 0x0126, 0x2091, 0x8000,
-	0x2071, 0x19e5, 0x7614, 0x2660, 0x2678, 0x2039, 0x0001, 0x87ff,
-	0x0904, 0xa441, 0x8cff, 0x0904, 0xa441, 0x6020, 0x9086, 0x0006,
-	0x1904, 0xa43c, 0x88ff, 0x0138, 0x2800, 0x9c06, 0x1904, 0xa43c,
-	0x2039, 0x0000, 0x0050, 0x6010, 0x9b06, 0x1904, 0xa43c, 0x85ff,
-	0x0120, 0x6054, 0x9106, 0x1904, 0xa43c, 0x7024, 0x9c06, 0x15b0,
-	0x2069, 0x0100, 0x68c0, 0x9005, 0x1160, 0x6824, 0xd084, 0x0148,
-	0x6827, 0x0001, 0x080c, 0x8308, 0x080c, 0xa4c6, 0x7027, 0x0000,
-	0x0428, 0x080c, 0x8308, 0x6820, 0xd0b4, 0x0110, 0x68a7, 0x95f5,
-	0x6817, 0x0008, 0x68c3, 0x0000, 0x080c, 0xa4c6, 0x7027, 0x0000,
-	0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001,
-	0x0100, 0x080c, 0x2ba1, 0x9006, 0x080c, 0x2ba1, 0x2069, 0x0100,
-	0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x7014, 0x9c36,
-	0x1110, 0x660c, 0x7616, 0x7010, 0x9c36, 0x1140, 0x2c00, 0x9f36,
-	0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, 0x0000, 0x660c, 0x0066,
-	0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x89ff, 0x1168,
-	0x600f, 0x0000, 0x6014, 0x0096, 0x2048, 0x080c, 0xc823, 0x0110,
-	0x080c, 0xe223, 0x009e, 0x080c, 0xab9c, 0x080c, 0xa39c, 0x88ff,
-	0x1190, 0x00ce, 0x0804, 0xa3b7, 0x2c78, 0x600c, 0x2060, 0x0804,
-	0xa3b7, 0x9006, 0x012e, 0x000e, 0x006e, 0x007e, 0x00ce, 0x00de,
-	0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x98c5, 0x0001,
-	0x0c88, 0x00f6, 0x00e6, 0x00d6, 0x0096, 0x00c6, 0x0066, 0x0026,
-	0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e5, 0x7638, 0x2660,
-	0x2678, 0x8cff, 0x0904, 0xa4b5, 0x6020, 0x9086, 0x0006, 0x1904,
-	0xa4b0, 0x87ff, 0x0128, 0x2700, 0x9c06, 0x1904, 0xa4b0, 0x0040,
-	0x6010, 0x9b06, 0x15e8, 0x85ff, 0x0118, 0x6054, 0x9106, 0x15c0,
-	0x703c, 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001, 0x080c, 0xa2ac,
-	0x7033, 0x0000, 0x9006, 0x703e, 0x7042, 0x7046, 0x704a, 0x003e,
-	0x7038, 0x9c36, 0x1110, 0x660c, 0x763a, 0x7034, 0x9c36, 0x1140,
-	0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000,
+	0x19e7, 0x6a32, 0x012e, 0x00de, 0x0005, 0x080c, 0x9df0, 0x7854,
+	0x7032, 0x7042, 0x7047, 0x1000, 0x00f8, 0x080c, 0x9df0, 0x7854,
+	0x7032, 0x7042, 0x7047, 0x4000, 0x00b8, 0x080c, 0x9df0, 0x7854,
+	0x7032, 0x7042, 0x7047, 0x2000, 0x0078, 0x080c, 0x9df0, 0x7854,
+	0x7032, 0x7042, 0x7047, 0x0400, 0x0038, 0x080c, 0x9df0, 0x7854,
+	0x7032, 0x7042, 0x7047, 0x0200, 0x60c3, 0x0020, 0x0804, 0xa22d,
+	0x00e6, 0x2071, 0x19e7, 0x7020, 0x9005, 0x0110, 0x8001, 0x7022,
+	0x00ee, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066,
+	0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e7, 0x7614, 0x2660,
+	0x2678, 0x2039, 0x0001, 0x87ff, 0x0904, 0xa71d, 0x8cff, 0x0904,
+	0xa71d, 0x6020, 0x9086, 0x0006, 0x1904, 0xa718, 0x88ff, 0x0138,
+	0x2800, 0x9c06, 0x1904, 0xa718, 0x2039, 0x0000, 0x0050, 0x6010,
+	0x9b06, 0x1904, 0xa718, 0x85ff, 0x0120, 0x6054, 0x9106, 0x1904,
+	0xa718, 0x7024, 0x9c06, 0x15b0, 0x2069, 0x0100, 0x68c0, 0x9005,
+	0x1160, 0x6824, 0xd084, 0x0148, 0x6827, 0x0001, 0x080c, 0x8550,
+	0x080c, 0xa7a2, 0x7027, 0x0000, 0x0428, 0x080c, 0x8550, 0x6820,
+	0xd0b4, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000,
+	0x080c, 0xa7a2, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04,
+	0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2cef, 0x9006,
+	0x080c, 0x2cef, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827,
+	0x0001, 0x003e, 0x7014, 0x9c36, 0x1110, 0x660c, 0x7616, 0x7010,
+	0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7012, 0x0010,
+	0x7013, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e,
+	0x0008, 0x2678, 0x89ff, 0x1168, 0x600f, 0x0000, 0x6014, 0x0096,
+	0x2048, 0x080c, 0xcb19, 0x0110, 0x080c, 0xe530, 0x009e, 0x080c,
+	0xae78, 0x080c, 0xa678, 0x88ff, 0x1190, 0x00ce, 0x0804, 0xa693,
+	0x2c78, 0x600c, 0x2060, 0x0804, 0xa693, 0x9006, 0x012e, 0x000e,
+	0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b,
+	0x0000, 0x00ce, 0x98c5, 0x0001, 0x0c88, 0x00f6, 0x00e6, 0x00d6,
+	0x0096, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000,
+	0x2071, 0x19e7, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0904, 0xa791,
+	0x6020, 0x9086, 0x0006, 0x1904, 0xa78c, 0x87ff, 0x0128, 0x2700,
+	0x9c06, 0x1904, 0xa78c, 0x0040, 0x6010, 0x9b06, 0x15e8, 0x85ff,
+	0x0118, 0x6054, 0x9106, 0x15c0, 0x703c, 0x9c06, 0x1168, 0x0036,
+	0x2019, 0x0001, 0x080c, 0xa59c, 0x7033, 0x0000, 0x9006, 0x703e,
+	0x7042, 0x7046, 0x704a, 0x003e, 0x7038, 0x9c36, 0x1110, 0x660c,
+	0x763a, 0x7034, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00,
+	0x7036, 0x0010, 0x7037, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06,
+	0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x6014, 0x2048,
+	0x080c, 0xcb19, 0x0110, 0x080c, 0xe530, 0x080c, 0xae78, 0x87ff,
+	0x1198, 0x00ce, 0x0804, 0xa73d, 0x2c78, 0x600c, 0x2060, 0x0804,
+	0xa73d, 0x9006, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x009e,
+	0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x97bd,
+	0x0001, 0x0c80, 0x00e6, 0x2071, 0x19e7, 0x2001, 0x1800, 0x2004,
+	0x9086, 0x0002, 0x1118, 0x7007, 0x0005, 0x0010, 0x7007, 0x0000,
+	0x00ee, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006,
+	0x0126, 0x2091, 0x8000, 0x2071, 0x19e7, 0x2c10, 0x7638, 0x2660,
+	0x2678, 0x8cff, 0x0518, 0x2200, 0x9c06, 0x11e0, 0x7038, 0x9c36,
+	0x1110, 0x660c, 0x763a, 0x7034, 0x9c36, 0x1140, 0x2c00, 0x9f36,
+	0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000, 0x660c, 0x2c00,
+	0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x9085,
+	0x0001, 0x0020, 0x2c78, 0x600c, 0x2060, 0x08d8, 0x012e, 0x000e,
+	0x002e, 0x006e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0096, 0x00f6,
+	0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091,
+	0x8000, 0x2071, 0x19e7, 0x760c, 0x2660, 0x2678, 0x8cff, 0x0904,
+	0xa87e, 0x6010, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x9206, 0x1904,
+	0xa879, 0x7024, 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005,
+	0x0904, 0xa855, 0x080c, 0xa259, 0x68c3, 0x0000, 0x080c, 0xa7a2,
+	0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000,
+	0x0138, 0x2001, 0x0100, 0x080c, 0x2cef, 0x9006, 0x080c, 0x2cef,
+	0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e,
+	0x700c, 0x9c36, 0x1110, 0x660c, 0x760e, 0x7008, 0x9c36, 0x1140,
+	0x2c00, 0x9f36, 0x0118, 0x2f00, 0x700a, 0x0010, 0x700b, 0x0000,
 	0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678,
-	0x600f, 0x0000, 0x6014, 0x2048, 0x080c, 0xc823, 0x0110, 0x080c,
-	0xe223, 0x080c, 0xab9c, 0x87ff, 0x1198, 0x00ce, 0x0804, 0xa461,
-	0x2c78, 0x600c, 0x2060, 0x0804, 0xa461, 0x9006, 0x012e, 0x000e,
-	0x002e, 0x006e, 0x00ce, 0x009e, 0x00de, 0x00ee, 0x00fe, 0x0005,
-	0x601b, 0x0000, 0x00ce, 0x97bd, 0x0001, 0x0c80, 0x00e6, 0x2071,
-	0x19e5, 0x2001, 0x1800, 0x2004, 0x9086, 0x0002, 0x1118, 0x7007,
-	0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, 0x0005, 0x00f6, 0x00e6,
-	0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071,
-	0x19e5, 0x2c10, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0518, 0x2200,
-	0x9c06, 0x11e0, 0x7038, 0x9c36, 0x1110, 0x660c, 0x763a, 0x7034,
-	0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7036, 0x0010,
-	0x7037, 0x0000, 0x660c, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008,
-	0x2678, 0x600f, 0x0000, 0x9085, 0x0001, 0x0020, 0x2c78, 0x600c,
-	0x2060, 0x08d8, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00ee,
-	0x00fe, 0x0005, 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066,
-	0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e5, 0x760c,
-	0x2660, 0x2678, 0x8cff, 0x0904, 0xa5a2, 0x6010, 0x00b6, 0x2058,
-	0xb8a0, 0x00be, 0x9206, 0x1904, 0xa59d, 0x7024, 0x9c06, 0x1520,
-	0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0xa579, 0x080c, 0x9ffc,
-	0x68c3, 0x0000, 0x080c, 0xa4c6, 0x7027, 0x0000, 0x0036, 0x2069,
-	0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c,
-	0x2ba1, 0x9006, 0x080c, 0x2ba1, 0x2069, 0x0100, 0x6824, 0xd084,
-	0x0110, 0x6827, 0x0001, 0x003e, 0x700c, 0x9c36, 0x1110, 0x660c,
-	0x760e, 0x7008, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00,
-	0x700a, 0x0010, 0x700b, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06,
-	0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xca13,
-	0x1158, 0x080c, 0x3093, 0x080c, 0xca24, 0x11f0, 0x080c, 0xb51d,
-	0x00d8, 0x080c, 0xa4c6, 0x08c0, 0x080c, 0xca24, 0x1118, 0x080c,
-	0xb51d, 0x0090, 0x6014, 0x2048, 0x080c, 0xc823, 0x0168, 0x6020,
-	0x9086, 0x0003, 0x1508, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000,
-	0x080c, 0x6a3a, 0x080c, 0xca07, 0x080c, 0xcc8b, 0x080c, 0xab9c,
-	0x080c, 0xa39c, 0x00ce, 0x0804, 0xa522, 0x2c78, 0x600c, 0x2060,
-	0x0804, 0xa522, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00de,
-	0x00ee, 0x00fe, 0x009e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1d20,
-	0x080c, 0xe223, 0x0c08, 0x00d6, 0x080c, 0x9a3a, 0x7003, 0x0200,
-	0x7007, 0x0014, 0x60c3, 0x0014, 0x20e1, 0x0001, 0x2099, 0x1987,
-	0x20e9, 0x0000, 0x20a1, 0x0250, 0x20a9, 0x0004, 0x4003, 0x7023,
-	0x0004, 0x7027, 0x7878, 0x080c, 0x9fd0, 0x00de, 0x0005, 0x080c,
-	0x9a3a, 0x700b, 0x0800, 0x7814, 0x9084, 0xff00, 0x700e, 0x7814,
-	0x9084, 0x00ff, 0x7022, 0x782c, 0x7026, 0x7858, 0x9084, 0x00ff,
-	0x9085, 0x0200, 0x7002, 0x7858, 0x9084, 0xff00, 0x8007, 0x7006,
-	0x60c2, 0x0804, 0x9fd0, 0x00b6, 0x00d6, 0x0016, 0x00d6, 0x2f68,
-	0x2009, 0x0035, 0x080c, 0xce90, 0x00de, 0x1904, 0xa650, 0x080c,
-	0x99ef, 0x7003, 0x1300, 0x782c, 0x080c, 0xa752, 0x2068, 0x6820,
-	0x9086, 0x0003, 0x0560, 0x7810, 0x2058, 0xbaa0, 0x080c, 0xaad5,
-	0x11d8, 0x9286, 0x007e, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe,
-	0x0498, 0x9286, 0x007f, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffd,
-	0x0458, 0x9284, 0xff80, 0x0180, 0x9286, 0x0080, 0x1128, 0x700b,
-	0x00ff, 0x700f, 0xfffc, 0x0400, 0x92d8, 0x1000, 0x2b5c, 0xb810,
-	0x700a, 0xb814, 0x700e, 0x00c0, 0x6098, 0x700e, 0x00a8, 0x080c,
-	0xaad5, 0x1130, 0x7810, 0x2058, 0xb8a0, 0x9082, 0x007e, 0x0250,
-	0x00d6, 0x2069, 0x181f, 0x2d04, 0x700a, 0x8d68, 0x2d04, 0x700e,
-	0x00de, 0x0010, 0x6034, 0x700e, 0x7838, 0x7012, 0x783c, 0x7016,
-	0x60c3, 0x000c, 0x001e, 0x00de, 0x080c, 0x9fd0, 0x00be, 0x0005,
-	0x781b, 0x0001, 0x7803, 0x0006, 0x001e, 0x00de, 0x00be, 0x0005,
-	0x792c, 0x9180, 0x0008, 0x200c, 0x9186, 0x0006, 0x01c0, 0x9186,
-	0x0003, 0x0904, 0xa6ca, 0x9186, 0x0005, 0x0904, 0xa6b3, 0x9186,
-	0x0004, 0x05d8, 0x9186, 0x0008, 0x0904, 0xa6bb, 0x7807, 0x0037,
-	0x782f, 0x0003, 0x7817, 0x1700, 0x080c, 0xa72f, 0x0005, 0x080c,
-	0xa6f0, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x6800,
-	0x0002, 0xa694, 0xa69f, 0xa696, 0xa69f, 0xa69b, 0xa694, 0xa694,
-	0xa69f, 0xa69f, 0xa69f, 0xa69f, 0xa694, 0xa694, 0xa694, 0xa694,
-	0xa694, 0xa69f, 0xa694, 0xa69f, 0x080c, 0x0dd5, 0x6824, 0xd0e4,
-	0x0110, 0xd0cc, 0x0110, 0x900e, 0x0010, 0x2009, 0x2000, 0x682c,
-	0x7022, 0x6830, 0x7026, 0x0804, 0xa6e9, 0x080c, 0xa6f0, 0x00d6,
-	0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x6a00, 0x9286, 0x0002,
-	0x1108, 0x900e, 0x04b0, 0x04e1, 0x00d6, 0x0026, 0x792c, 0x2168,
-	0x2009, 0x4000, 0x0470, 0x04a1, 0x00d6, 0x0026, 0x792c, 0x2168,
-	0x2009, 0x4000, 0x9286, 0x0005, 0x0118, 0x9286, 0x0002, 0x1108,
-	0x900e, 0x00f8, 0x0429, 0x00d6, 0x0026, 0x792c, 0x2168, 0x6814,
-	0x0096, 0x2048, 0xa9ac, 0xa834, 0x9112, 0xa9b0, 0xa838, 0x009e,
-	0x9103, 0x7022, 0x7226, 0x792c, 0x9180, 0x0000, 0x2004, 0x908e,
-	0x0002, 0x0130, 0x908e, 0x0004, 0x0118, 0x2009, 0x4000, 0x0008,
-	0x900e, 0x712a, 0x60c3, 0x0018, 0x002e, 0x00de, 0x0804, 0x9fd0,
-	0x00b6, 0x0036, 0x0046, 0x0056, 0x0066, 0x080c, 0x9a3a, 0x9006,
-	0x7003, 0x0200, 0x7938, 0x710a, 0x793c, 0x710e, 0x7810, 0x2058,
-	0xb8a0, 0x080c, 0xaad5, 0x1118, 0x9092, 0x007e, 0x0268, 0x00d6,
-	0x2069, 0x181f, 0x2d2c, 0x8d68, 0x2d34, 0x90d8, 0x1000, 0x2b5c,
-	0xbb10, 0xbc14, 0x00de, 0x0028, 0x901e, 0x6498, 0x2029, 0x0000,
-	0x6634, 0x782c, 0x9080, 0x0008, 0x2004, 0x9086, 0x0003, 0x1128,
-	0x7512, 0x7616, 0x731a, 0x741e, 0x0020, 0x7312, 0x7416, 0x751a,
-	0x761e, 0x006e, 0x005e, 0x004e, 0x003e, 0x00be, 0x0005, 0x080c,
-	0x9a3a, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, 0x700e, 0x700e,
-	0x60c3, 0x0008, 0x0804, 0x9fd0, 0x080c, 0x99e6, 0x7003, 0x1400,
-	0x7838, 0x700a, 0x0079, 0x783c, 0x700e, 0x782c, 0x7012, 0x7830,
-	0x7016, 0x7834, 0x9084, 0x00ff, 0x8007, 0x701a, 0x60c3, 0x0010,
-	0x0804, 0x9fd0, 0x00e6, 0x2071, 0x0240, 0x0006, 0x00f6, 0x2078,
-	0x7810, 0x00b6, 0x2058, 0xb8cc, 0xd084, 0x0120, 0x7848, 0x702a,
-	0x7844, 0x702e, 0x00be, 0x00fe, 0x000e, 0x00ee, 0x0005, 0x080c,
-	0x9a31, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, 0x700e, 0x60c3,
-	0x0008, 0x0804, 0x9fd0, 0x0021, 0x60c3, 0x0000, 0x0804, 0x9fd0,
-	0x00d6, 0x080c, 0xa82b, 0xb810, 0x9085, 0x0300, 0x7002, 0xb814,
-	0x7006, 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x7013,
-	0x0819, 0x080c, 0x9fbe, 0x721a, 0x2f10, 0x7222, 0x7a08, 0x7226,
-	0x2071, 0x024c, 0x00de, 0x0005, 0x00a9, 0x7914, 0x712a, 0x60c3,
-	0x0000, 0x60a7, 0x9575, 0x0026, 0x080c, 0x2a57, 0x0228, 0x2011,
-	0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x080c, 0x9ff3, 0x080c,
-	0x82ff, 0x0005, 0x0036, 0x0096, 0x00d6, 0x00e6, 0x7858, 0x2048,
-	0xaa7c, 0x9296, 0x00c0, 0x9294, 0xfffd, 0xaa7e, 0xaa80, 0x9294,
-	0x0300, 0xaa82, 0xa96c, 0x9194, 0x00ff, 0xab74, 0x9384, 0x00ff,
-	0x908d, 0xc200, 0xa96e, 0x9384, 0xff00, 0x9215, 0xaa76, 0xa870,
-	0xaa78, 0xa87a, 0xaa72, 0x00d6, 0x2069, 0x0200, 0x080c, 0xa82b,
-	0x00de, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000a, 0xa860,
-	0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x4003, 0x60a3, 0x0035,
-	0xaa68, 0x9294, 0x7000, 0x9286, 0x3000, 0x0110, 0x60a3, 0x0037,
-	0x00ee, 0x00de, 0x009e, 0x003e, 0x0005, 0x900e, 0x7814, 0x0096,
-	0x2048, 0xa87c, 0xd0fc, 0x01c0, 0x9084, 0x0003, 0x11a8, 0x2001,
-	0x180c, 0x2004, 0xd0bc, 0x0180, 0x7824, 0xd0cc, 0x1168, 0xd0c4,
-	0x1158, 0xa8a8, 0x9005, 0x1140, 0x2001, 0x180c, 0x200c, 0xc1d5,
-	0x2102, 0x2009, 0x19b0, 0x210c, 0x009e, 0x918d, 0x0092, 0x0010,
-	0x2009, 0x0096, 0x60ab, 0x0036, 0x6116, 0x0005, 0x2009, 0x0009,
-	0x00a0, 0x2009, 0x000a, 0x0088, 0x2009, 0x000b, 0x0070, 0x2009,
-	0x000c, 0x0058, 0x2009, 0x000d, 0x0040, 0x2009, 0x000e, 0x0028,
-	0x2009, 0x000f, 0x0010, 0x2009, 0x0008, 0x6912, 0x0005, 0x080c,
-	0x99ef, 0x0016, 0x0026, 0x0096, 0x00d6, 0x7814, 0x2048, 0x7013,
-	0x0138, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028, 0x1138, 0x2001,
-	0x197c, 0x2004, 0x9086, 0xaaaa, 0x1904, 0xa8d0, 0x7003, 0x5400,
-	0x00c6, 0x2061, 0x1800, 0x607c, 0x9084, 0x00ff, 0xa998, 0x810f,
-	0x918c, 0xff00, 0x9105, 0x700a, 0x6080, 0x700e, 0xa998, 0x918c,
-	0xff00, 0x7112, 0x20a9, 0x0004, 0x2009, 0x1805, 0x2e10, 0x9290,
-	0x0006, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xa861, 0x20a9,
-	0x0004, 0x2009, 0x1801, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04,
-	0xa86b, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0029, 0x2098, 0x2009,
-	0x0006, 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109,
-	0x1dc0, 0x00d6, 0x2069, 0x0200, 0x080c, 0xa816, 0x00de, 0x2071,
-	0x0240, 0x2011, 0x0240, 0x2009, 0x0002, 0x20a9, 0x0001, 0x4002,
-	0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0x2009, 0x0008, 0x20a9,
-	0x0001, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0xa85c,
-	0x9080, 0x0031, 0x2098, 0x2009, 0x0008, 0x20a9, 0x0001, 0x4002,
-	0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0x00ce, 0x60c3, 0x004c,
-	0x60a3, 0x0056, 0x60a7, 0x9575, 0x2001, 0x1837, 0x2004, 0x9084,
-	0x0028, 0x1168, 0x080c, 0x717d, 0x0150, 0x6028, 0xc0bd, 0x602a,
-	0x6014, 0x9084, 0x1804, 0x9085, 0x0029, 0x6016, 0x0010, 0x080c,
-	0x9fd0, 0x080c, 0x82ff, 0x00de, 0x009e, 0x002e, 0x001e, 0x0005,
-	0x00e6, 0x2071, 0x0240, 0x2001, 0x2200, 0x9085, 0x00ff, 0x7002,
-	0x7007, 0xffff, 0x2071, 0x0100, 0x709b, 0x00ff, 0x00ee, 0x0804,
-	0xa846, 0x080c, 0x99ef, 0x0016, 0x0026, 0x0096, 0x00d6, 0x7814,
-	0x2048, 0x7013, 0x0138, 0x7003, 0x5500, 0x00c6, 0xa89c, 0x9084,
-	0x00ff, 0xa998, 0x810f, 0x918c, 0xff00, 0x9105, 0x700a, 0xa99c,
-	0x918c, 0xff00, 0xa8a0, 0x9084, 0x00ff, 0x9105, 0x700e, 0xa998,
-	0x918c, 0xff00, 0x2061, 0x1800, 0x607c, 0x9084, 0x00ff, 0x910d,
-	0x7112, 0x6180, 0x7116, 0x2009, 0x0008, 0xa860, 0x20e0, 0xa85c,
-	0x9080, 0x0029, 0x2098, 0x2e10, 0x9290, 0x0006, 0x20a9, 0x0001,
-	0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0x20a9, 0x0004,
-	0x2009, 0x1805, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xa922,
-	0x20a9, 0x0002, 0x2009, 0x1801, 0x2104, 0x2012, 0x8108, 0x8210,
-	0x1f04, 0xa92c, 0x00d6, 0x0016, 0x2069, 0x0200, 0x080c, 0xa816,
-	0x001e, 0x00de, 0x2071, 0x0240, 0x20a9, 0x0002, 0x2009, 0x1803,
-	0x2011, 0x0240, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xa942,
-	0x2009, 0x0008, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dd0,
-	0x9006, 0x20a9, 0x0008, 0x2012, 0x8210, 0x1f04, 0xa953, 0x00ce,
-	0x60c3, 0x004c, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x9fd0,
-	0x080c, 0x82ff, 0x00de, 0x009e, 0x002e, 0x001e, 0x0005, 0x00d6,
-	0x9290, 0x0018, 0x8214, 0x20e9, 0x0000, 0x2069, 0x0200, 0x6813,
-	0x0000, 0x22a8, 0x9284, 0x00e0, 0x0128, 0x20a9, 0x0020, 0x9292,
-	0x0020, 0x0008, 0x9016, 0x20a1, 0x0240, 0x9006, 0x4004, 0x82ff,
-	0x0120, 0x6810, 0x8000, 0x6812, 0x0c60, 0x00de, 0x0005, 0x00d6,
-	0x0096, 0x6014, 0x2048, 0xa878, 0x6056, 0x9006, 0xa836, 0xa83a,
-	0xa99c, 0xa946, 0xa84a, 0x6023, 0x0003, 0x6007, 0x0040, 0x6003,
-	0x0003, 0x600b, 0xffff, 0xa817, 0x0001, 0xa842, 0xa83e, 0x2900,
-	0xa85a, 0xa813, 0x1f48, 0x080c, 0x8ee4, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x9548, 0x012e, 0x009e, 0x00de, 0x0005, 0x00f6, 0x00e6,
-	0x00d6, 0x00c6, 0x00a6, 0x0096, 0x0066, 0x0126, 0x2091, 0x8000,
-	0x2071, 0x19e5, 0x760c, 0x2660, 0x2678, 0x8cff, 0x0904, 0xaa35,
-	0x7024, 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904,
-	0xaa0c, 0x080c, 0x9ffc, 0x68c3, 0x0000, 0x080c, 0xa4c6, 0x7027,
-	0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138,
-	0x2001, 0x0100, 0x080c, 0x2ba1, 0x9006, 0x080c, 0x2ba1, 0x2069,
-	0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x700c,
-	0x9c36, 0x1110, 0x660c, 0x760e, 0x7008, 0x9c36, 0x1140, 0x2c00,
-	0x9f36, 0x0118, 0x2f00, 0x700a, 0x0010, 0x700b, 0x0000, 0x660c,
-	0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f,
-	0x0000, 0x080c, 0xca13, 0x1158, 0x080c, 0x3093, 0x080c, 0xca24,
-	0x11f0, 0x080c, 0xb51d, 0x00d8, 0x080c, 0xa4c6, 0x08c0, 0x080c,
-	0xca24, 0x1118, 0x080c, 0xb51d, 0x0090, 0x6014, 0x2048, 0x080c,
-	0xc823, 0x0168, 0x6020, 0x9086, 0x0003, 0x1520, 0xa867, 0x0103,
-	0xab7a, 0xa877, 0x0000, 0x080c, 0x6a46, 0x080c, 0xca07, 0x080c,
-	0xcc8b, 0x080c, 0xab9c, 0x080c, 0xa39c, 0x00ce, 0x0804, 0xa9bd,
-	0x2c78, 0x600c, 0x2060, 0x0804, 0xa9bd, 0x700f, 0x0000, 0x700b,
-	0x0000, 0x012e, 0x006e, 0x009e, 0x00ae, 0x00ce, 0x00de, 0x00ee,
-	0x00fe, 0x0005, 0x6020, 0x9086, 0x0006, 0x1d08, 0x080c, 0xe223,
-	0x08f0, 0x00d6, 0x0156, 0x080c, 0x9a3a, 0x7a14, 0x82ff, 0x0138,
-	0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x0490, 0x7003,
-	0x0200, 0x7007, 0x0000, 0x2069, 0x1800, 0x901e, 0x6800, 0x9086,
-	0x0004, 0x1110, 0xc38d, 0x0060, 0x080c, 0x717d, 0x1110, 0xc3ad,
-	0x0008, 0xc3a5, 0x6adc, 0xd29c, 0x1110, 0xd2ac, 0x0108, 0xc39d,
-	0x730e, 0x080c, 0x8368, 0x20a9, 0x0006, 0x2011, 0xfff4, 0x2019,
-	0xfff5, 0x2071, 0x0250, 0x2305, 0x2072, 0x8e70, 0x2205, 0x2072,
-	0x8e70, 0x9398, 0x0002, 0x9290, 0x0002, 0x1f04, 0xaa7b, 0x60c3,
-	0x0020, 0x080c, 0x9fd0, 0x015e, 0x00de, 0x0005, 0x0156, 0x080c,
-	0x9a3a, 0x7a14, 0x82ff, 0x0168, 0x9286, 0xffff, 0x0118, 0x9282,
-	0x000e, 0x1238, 0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008,
-	0x0488, 0x7003, 0x0200, 0x7007, 0x001c, 0x700f, 0x0001, 0x2011,
-	0x19bb, 0x2204, 0x8007, 0x701a, 0x8210, 0x2204, 0x8007, 0x701e,
-	0x0421, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, 0x181f,
-	0x2004, 0x7022, 0x2001, 0x1820, 0x2004, 0x7026, 0x0030, 0x2001,
-	0x1818, 0x2004, 0x9084, 0x00ff, 0x7026, 0x20a9, 0x0004, 0x20e1,
-	0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003,
-	0x60c3, 0x001c, 0x015e, 0x0804, 0x9fd0, 0x0006, 0x2001, 0x1837,
-	0x2004, 0xd0ac, 0x000e, 0x0005, 0x2011, 0x0003, 0x080c, 0xa349,
-	0x2011, 0x0002, 0x080c, 0xa353, 0x080c, 0xa236, 0x0036, 0x901e,
-	0x080c, 0xa2ac, 0x003e, 0x0005, 0x080c, 0x31c9, 0x0188, 0x0016,
-	0x00b6, 0x00c6, 0x7010, 0x9085, 0x0020, 0x7012, 0x2009, 0x007e,
-	0x080c, 0x63cd, 0xb85c, 0xc0ac, 0xb85e, 0x00ce, 0x00be, 0x001e,
-	0x0005, 0x2071, 0x188d, 0x7000, 0x9005, 0x0140, 0x2001, 0x0976,
-	0x2071, 0x1800, 0x7076, 0x707a, 0x706b, 0xffe0, 0x2071, 0x1800,
-	0x7074, 0x7056, 0x705b, 0x1cd0, 0x0005, 0x00e6, 0x0126, 0x2071,
-	0x1800, 0x2091, 0x8000, 0x7554, 0x9582, 0x0010, 0x0608, 0x7058,
-	0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7068,
-	0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, 0x0008,
-	0x8529, 0x7556, 0x9ca8, 0x0018, 0x7068, 0x9502, 0x1230, 0x755a,
-	0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x705b, 0x1cd0, 0x0cc0,
-	0x9006, 0x0cc0, 0x00e6, 0x2071, 0x1800, 0x7554, 0x9582, 0x0010,
-	0x0600, 0x7058, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0,
-	0x0018, 0x7068, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98,
-	0x6003, 0x0008, 0x8529, 0x7556, 0x9ca8, 0x0018, 0x7068, 0x9502,
-	0x1228, 0x755a, 0x9085, 0x0001, 0x00ee, 0x0005, 0x705b, 0x1cd0,
-	0x0cc8, 0x9006, 0x0cc8, 0x9c82, 0x1cd0, 0x0a0c, 0x0dd5, 0x2001,
-	0x181a, 0x2004, 0x9c02, 0x1a0c, 0x0dd5, 0x9006, 0x6006, 0x600a,
-	0x600e, 0x6016, 0x601a, 0x6012, 0x6023, 0x0000, 0x6003, 0x0000,
-	0x601e, 0x6056, 0x605a, 0x6026, 0x602a, 0x602e, 0x6032, 0x6036,
-	0x603a, 0x603e, 0x6042, 0x602a, 0x2061, 0x1800, 0x6054, 0x8000,
-	0x6056, 0x9086, 0x0001, 0x0108, 0x0005, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x941c, 0x012e, 0x0cc0, 0x0006, 0x6000, 0x9086, 0x0000,
-	0x01b0, 0x601c, 0xd084, 0x190c, 0x19b4, 0x6017, 0x0000, 0x6023,
-	0x0007, 0x2001, 0x1984, 0x2004, 0x0006, 0x9082, 0x0051, 0x000e,
-	0x0208, 0x8004, 0x601a, 0x080c, 0xe4d8, 0x6043, 0x0000, 0x000e,
+	0x600f, 0x0000, 0x080c, 0xcd10, 0x1158, 0x080c, 0x31e1, 0x080c,
+	0xcd21, 0x11f0, 0x080c, 0xb7f9, 0x00d8, 0x080c, 0xa7a2, 0x08c0,
+	0x080c, 0xcd21, 0x1118, 0x080c, 0xb7f9, 0x0090, 0x6014, 0x2048,
+	0x080c, 0xcb19, 0x0168, 0x6020, 0x9086, 0x0003, 0x1508, 0xa867,
+	0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6c6d, 0x080c, 0xcd04,
+	0x080c, 0xcf88, 0x080c, 0xae78, 0x080c, 0xa678, 0x00ce, 0x0804,
+	0xa7fe, 0x2c78, 0x600c, 0x2060, 0x0804, 0xa7fe, 0x012e, 0x000e,
+	0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, 0x0005,
+	0x6020, 0x9086, 0x0006, 0x1d20, 0x080c, 0xe530, 0x0c08, 0x00d6,
+	0x080c, 0x9c82, 0x7003, 0x0200, 0x7007, 0x0014, 0x60c3, 0x0014,
+	0x20e1, 0x0001, 0x2099, 0x1989, 0x20e9, 0x0000, 0x20a1, 0x0250,
+	0x20a9, 0x0004, 0x4003, 0x7023, 0x0004, 0x7027, 0x7878, 0x080c,
+	0xa22d, 0x00de, 0x0005, 0x080c, 0x9c82, 0x700b, 0x0800, 0x7814,
+	0x9084, 0xff00, 0x700e, 0x7814, 0x9084, 0x00ff, 0x7022, 0x782c,
+	0x7026, 0x7858, 0x9084, 0x00ff, 0x9085, 0x0200, 0x7002, 0x7858,
+	0x9084, 0xff00, 0x8007, 0x7006, 0x60c2, 0x0804, 0xa22d, 0x00b6,
+	0x00d6, 0x0016, 0x00d6, 0x2f68, 0x2009, 0x0035, 0x080c, 0xd18e,
+	0x00de, 0x1904, 0xa92c, 0x080c, 0x9c37, 0x7003, 0x1300, 0x782c,
+	0x080c, 0xaa2e, 0x2068, 0x6820, 0x9086, 0x0003, 0x0560, 0x7810,
+	0x2058, 0xbaa0, 0x080c, 0xadb1, 0x11d8, 0x9286, 0x007e, 0x1128,
+	0x700b, 0x00ff, 0x700f, 0xfffe, 0x0498, 0x9286, 0x007f, 0x1128,
+	0x700b, 0x00ff, 0x700f, 0xfffd, 0x0458, 0x9284, 0xff80, 0x0180,
+	0x9286, 0x0080, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffc, 0x0400,
+	0x92d8, 0x1000, 0x2b5c, 0xb810, 0x700a, 0xb814, 0x700e, 0x00c0,
+	0x6098, 0x700e, 0x00a8, 0x080c, 0xadb1, 0x1130, 0x7810, 0x2058,
+	0xb8a0, 0x9082, 0x007e, 0x0250, 0x00d6, 0x2069, 0x181f, 0x2d04,
+	0x700a, 0x8d68, 0x2d04, 0x700e, 0x00de, 0x0010, 0x6034, 0x700e,
+	0x7838, 0x7012, 0x783c, 0x7016, 0x60c3, 0x000c, 0x001e, 0x00de,
+	0x080c, 0xa22d, 0x00be, 0x0005, 0x781b, 0x0001, 0x7803, 0x0006,
+	0x001e, 0x00de, 0x00be, 0x0005, 0x792c, 0x9180, 0x0008, 0x200c,
+	0x9186, 0x0006, 0x01c0, 0x9186, 0x0003, 0x0904, 0xa9a6, 0x9186,
+	0x0005, 0x0904, 0xa98f, 0x9186, 0x0004, 0x05d8, 0x9186, 0x0008,
+	0x0904, 0xa997, 0x7807, 0x0037, 0x782f, 0x0003, 0x7817, 0x1700,
+	0x080c, 0xaa0b, 0x0005, 0x080c, 0xa9cc, 0x00d6, 0x0026, 0x792c,
+	0x2168, 0x2009, 0x4000, 0x6800, 0x0002, 0xa970, 0xa97b, 0xa972,
+	0xa97b, 0xa977, 0xa970, 0xa970, 0xa97b, 0xa97b, 0xa97b, 0xa97b,
+	0xa970, 0xa970, 0xa970, 0xa970, 0xa970, 0xa97b, 0xa970, 0xa97b,
+	0x080c, 0x0dd5, 0x6824, 0xd0e4, 0x0110, 0xd0cc, 0x0110, 0x900e,
+	0x0010, 0x2009, 0x2000, 0x682c, 0x7022, 0x6830, 0x7026, 0x0804,
+	0xa9c5, 0x080c, 0xa9cc, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009,
+	0x4000, 0x6a00, 0x9286, 0x0002, 0x1108, 0x900e, 0x04b0, 0x04e1,
+	0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x0470, 0x04a1,
+	0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x9286, 0x0005,
+	0x0118, 0x9286, 0x0002, 0x1108, 0x900e, 0x00f8, 0x0429, 0x00d6,
+	0x0026, 0x792c, 0x2168, 0x6814, 0x0096, 0x2048, 0xa9ac, 0xa834,
+	0x9112, 0xa9b0, 0xa838, 0x009e, 0x9103, 0x7022, 0x7226, 0x792c,
+	0x9180, 0x0000, 0x2004, 0x908e, 0x0002, 0x0130, 0x908e, 0x0004,
+	0x0118, 0x2009, 0x4000, 0x0008, 0x900e, 0x712a, 0x60c3, 0x0018,
+	0x002e, 0x00de, 0x0804, 0xa22d, 0x00b6, 0x0036, 0x0046, 0x0056,
+	0x0066, 0x080c, 0x9c82, 0x9006, 0x7003, 0x0200, 0x7938, 0x710a,
+	0x793c, 0x710e, 0x7810, 0x2058, 0xb8a0, 0x080c, 0xadb1, 0x1118,
+	0x9092, 0x007e, 0x0268, 0x00d6, 0x2069, 0x181f, 0x2d2c, 0x8d68,
+	0x2d34, 0x90d8, 0x1000, 0x2b5c, 0xbb10, 0xbc14, 0x00de, 0x0028,
+	0x901e, 0x6498, 0x2029, 0x0000, 0x6634, 0x782c, 0x9080, 0x0008,
+	0x2004, 0x9086, 0x0003, 0x1128, 0x7512, 0x7616, 0x731a, 0x741e,
+	0x0020, 0x7312, 0x7416, 0x751a, 0x761e, 0x006e, 0x005e, 0x004e,
+	0x003e, 0x00be, 0x0005, 0x080c, 0x9c82, 0x7003, 0x0100, 0x782c,
+	0x700a, 0x7814, 0x700e, 0x700e, 0x60c3, 0x0008, 0x0804, 0xa22d,
+	0x080c, 0x9c2e, 0x7003, 0x1400, 0x7838, 0x700a, 0x0079, 0x783c,
+	0x700e, 0x782c, 0x7012, 0x7830, 0x7016, 0x7834, 0x9084, 0x00ff,
+	0x8007, 0x701a, 0x60c3, 0x0010, 0x0804, 0xa22d, 0x00e6, 0x2071,
+	0x0240, 0x0006, 0x00f6, 0x2078, 0x7810, 0x00b6, 0x2058, 0xb8cc,
+	0xd084, 0x0120, 0x7848, 0x702a, 0x7844, 0x702e, 0x00be, 0x00fe,
+	0x000e, 0x00ee, 0x0005, 0x080c, 0x9c79, 0x7003, 0x0100, 0x782c,
+	0x700a, 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0xa22d, 0x0021,
+	0x60c3, 0x0000, 0x0804, 0xa22d, 0x00d6, 0x080c, 0xab07, 0xb810,
+	0x9085, 0x0300, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x687c,
+	0x700a, 0x6880, 0x700e, 0x7013, 0x0819, 0x080c, 0xa21b, 0x721a,
+	0x2f10, 0x7222, 0x7a08, 0x7226, 0x2071, 0x024c, 0x00de, 0x0005,
+	0x00a9, 0x7914, 0x712a, 0x60c3, 0x0000, 0x60a7, 0x9575, 0x0026,
+	0x080c, 0x2ba5, 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012,
+	0x002e, 0x080c, 0xa250, 0x080c, 0x8547, 0x0005, 0x0036, 0x0096,
+	0x00d6, 0x00e6, 0x7858, 0x2048, 0xaa7c, 0x9296, 0x00c0, 0x9294,
+	0xfffd, 0xaa7e, 0xaa80, 0x9294, 0x0300, 0xaa82, 0xa96c, 0x9194,
+	0x00ff, 0xab74, 0x9384, 0x00ff, 0x908d, 0xc200, 0xa96e, 0x9384,
+	0xff00, 0x9215, 0xaa76, 0xa870, 0xaa78, 0xa87a, 0xaa72, 0x00d6,
+	0x2069, 0x0200, 0x080c, 0xab07, 0x00de, 0x20e9, 0x0000, 0x20a1,
+	0x0240, 0x20a9, 0x000a, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b,
+	0x2098, 0x4003, 0x60a3, 0x0035, 0xaa68, 0x9294, 0x7000, 0x9286,
+	0x3000, 0x0110, 0x60a3, 0x0037, 0x00ee, 0x00de, 0x009e, 0x003e,
+	0x0005, 0x900e, 0x7814, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x01c0,
+	0x9084, 0x0003, 0x11a8, 0x2001, 0x180c, 0x2004, 0xd0bc, 0x0180,
+	0x7824, 0xd0cc, 0x1168, 0xd0c4, 0x1158, 0xa8a8, 0x9005, 0x1140,
+	0x2001, 0x180c, 0x200c, 0xc1d5, 0x2102, 0x2009, 0x19b2, 0x210c,
+	0x009e, 0x918d, 0x0092, 0x0010, 0x2009, 0x0096, 0x60ab, 0x0036,
+	0x6116, 0x0005, 0x2009, 0x0009, 0x00a0, 0x2009, 0x000a, 0x0088,
+	0x2009, 0x000b, 0x0070, 0x2009, 0x000c, 0x0058, 0x2009, 0x000d,
+	0x0040, 0x2009, 0x000e, 0x0028, 0x2009, 0x000f, 0x0010, 0x2009,
+	0x0008, 0x6912, 0x0005, 0x080c, 0x9c37, 0x0016, 0x0026, 0x0096,
+	0x00d6, 0x7814, 0x2048, 0x7013, 0x0138, 0x2001, 0x1837, 0x2004,
+	0x9084, 0x0028, 0x1138, 0x2001, 0x197c, 0x2004, 0x9086, 0xaaaa,
+	0x1904, 0xabac, 0x7003, 0x5400, 0x00c6, 0x2061, 0x1800, 0x607c,
+	0x9084, 0x00ff, 0xa998, 0x810f, 0x918c, 0xff00, 0x9105, 0x700a,
+	0x6080, 0x700e, 0xa998, 0x918c, 0xff00, 0x7112, 0x20a9, 0x0004,
+	0x2009, 0x1805, 0x2e10, 0x9290, 0x0006, 0x2104, 0x2012, 0x8108,
+	0x8210, 0x1f04, 0xab3d, 0x20a9, 0x0004, 0x2009, 0x1801, 0x2104,
+	0x2012, 0x8108, 0x8210, 0x1f04, 0xab47, 0xa860, 0x20e0, 0xa85c,
+	0x9080, 0x0029, 0x2098, 0x2009, 0x0006, 0x20a9, 0x0001, 0x4002,
+	0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0x00d6, 0x2069, 0x0200,
+	0x080c, 0xaaf2, 0x00de, 0x2071, 0x0240, 0x2011, 0x0240, 0x2009,
+	0x0002, 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109,
+	0x1dc0, 0x2009, 0x0008, 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012,
+	0x8210, 0x8109, 0x1dc0, 0xa85c, 0x9080, 0x0031, 0x2098, 0x2009,
+	0x0008, 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109,
+	0x1dc0, 0x00ce, 0x60c3, 0x004c, 0x60a3, 0x0056, 0x60a7, 0x9575,
+	0x2001, 0x1837, 0x2004, 0x9084, 0x0028, 0x1168, 0x080c, 0x73b0,
+	0x0150, 0x6028, 0xc0bd, 0x602a, 0x6014, 0x9084, 0x1804, 0x9085,
+	0x0029, 0x6016, 0x0010, 0x080c, 0xa22d, 0x080c, 0x8547, 0x00de,
+	0x009e, 0x002e, 0x001e, 0x0005, 0x00e6, 0x2071, 0x0240, 0x2001,
+	0x2200, 0x9085, 0x00ff, 0x7002, 0x7007, 0xffff, 0x2071, 0x0100,
+	0x709b, 0x00ff, 0x00ee, 0x0804, 0xab22, 0x080c, 0x9c37, 0x0016,
+	0x0026, 0x0096, 0x00d6, 0x7814, 0x2048, 0x7013, 0x0138, 0x7003,
+	0x5500, 0x00c6, 0xa89c, 0x9084, 0x00ff, 0xa998, 0x810f, 0x918c,
+	0xff00, 0x9105, 0x700a, 0xa99c, 0x918c, 0xff00, 0xa8a0, 0x9084,
+	0x00ff, 0x9105, 0x700e, 0xa998, 0x918c, 0xff00, 0x2061, 0x1800,
+	0x607c, 0x9084, 0x00ff, 0x910d, 0x7112, 0x6180, 0x7116, 0x2009,
+	0x0008, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0029, 0x2098, 0x2e10,
+	0x9290, 0x0006, 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, 0x8210,
+	0x8109, 0x1dc0, 0x20a9, 0x0004, 0x2009, 0x1805, 0x2104, 0x2012,
+	0x8108, 0x8210, 0x1f04, 0xabfe, 0x20a9, 0x0002, 0x2009, 0x1801,
+	0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xac08, 0x00d6, 0x0016,
+	0x2069, 0x0200, 0x080c, 0xaaf2, 0x001e, 0x00de, 0x2071, 0x0240,
+	0x20a9, 0x0002, 0x2009, 0x1803, 0x2011, 0x0240, 0x2104, 0x2012,
+	0x8108, 0x8210, 0x1f04, 0xac1e, 0x2009, 0x0008, 0x4002, 0x8007,
+	0x2012, 0x8210, 0x8109, 0x1dd0, 0x9006, 0x20a9, 0x0008, 0x2012,
+	0x8210, 0x1f04, 0xac2f, 0x00ce, 0x60c3, 0x004c, 0x60a3, 0x0056,
+	0x60a7, 0x9575, 0x080c, 0xa22d, 0x080c, 0x8547, 0x00de, 0x009e,
+	0x002e, 0x001e, 0x0005, 0x00d6, 0x9290, 0x0018, 0x8214, 0x20e9,
+	0x0000, 0x2069, 0x0200, 0x6813, 0x0000, 0x22a8, 0x9284, 0x00e0,
+	0x0128, 0x20a9, 0x0020, 0x9292, 0x0020, 0x0008, 0x9016, 0x20a1,
+	0x0240, 0x9006, 0x4004, 0x82ff, 0x0120, 0x6810, 0x8000, 0x6812,
+	0x0c60, 0x00de, 0x0005, 0x00d6, 0x0096, 0x6014, 0x2048, 0xa878,
+	0x6056, 0x9006, 0xa836, 0xa83a, 0xa99c, 0xa946, 0xa84a, 0x6023,
+	0x0003, 0x6007, 0x0040, 0x6003, 0x0003, 0x600b, 0xffff, 0xa817,
+	0x0001, 0xa842, 0xa83e, 0x2900, 0xa85a, 0xa813, 0x208e, 0x080c,
+	0x912c, 0x0126, 0x2091, 0x8000, 0x080c, 0x9790, 0x012e, 0x009e,
+	0x00de, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x00a6, 0x0096,
+	0x0066, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e7, 0x760c, 0x2660,
+	0x2678, 0x8cff, 0x0904, 0xad11, 0x7024, 0x9c06, 0x1520, 0x2069,
+	0x0100, 0x68c0, 0x9005, 0x0904, 0xace8, 0x080c, 0xa259, 0x68c3,
+	0x0000, 0x080c, 0xa7a2, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140,
+	0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2cef,
+	0x9006, 0x080c, 0x2cef, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110,
+	0x6827, 0x0001, 0x003e, 0x700c, 0x9c36, 0x1110, 0x660c, 0x760e,
+	0x7008, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x700a,
+	0x0010, 0x700b, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110,
+	0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xcd10, 0x1158,
+	0x080c, 0x31e1, 0x080c, 0xcd21, 0x11f0, 0x080c, 0xb7f9, 0x00d8,
+	0x080c, 0xa7a2, 0x08c0, 0x080c, 0xcd21, 0x1118, 0x080c, 0xb7f9,
+	0x0090, 0x6014, 0x2048, 0x080c, 0xcb19, 0x0168, 0x6020, 0x9086,
+	0x0003, 0x1520, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c,
+	0x6c79, 0x080c, 0xcd04, 0x080c, 0xcf88, 0x080c, 0xae78, 0x080c,
+	0xa678, 0x00ce, 0x0804, 0xac99, 0x2c78, 0x600c, 0x2060, 0x0804,
+	0xac99, 0x700f, 0x0000, 0x700b, 0x0000, 0x012e, 0x006e, 0x009e,
+	0x00ae, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020, 0x9086,
+	0x0006, 0x1d08, 0x080c, 0xe530, 0x08f0, 0x00d6, 0x0156, 0x080c,
+	0x9c82, 0x7a14, 0x82ff, 0x0138, 0x7003, 0x0100, 0x700b, 0x0003,
+	0x60c3, 0x0008, 0x0490, 0x7003, 0x0200, 0x7007, 0x0000, 0x2069,
+	0x1800, 0x901e, 0x6800, 0x9086, 0x0004, 0x1110, 0xc38d, 0x0060,
+	0x080c, 0x73b0, 0x1110, 0xc3ad, 0x0008, 0xc3a5, 0x6adc, 0xd29c,
+	0x1110, 0xd2ac, 0x0108, 0xc39d, 0x730e, 0x080c, 0x85b0, 0x20a9,
+	0x0006, 0x2011, 0xfff4, 0x2019, 0xfff5, 0x2071, 0x0250, 0x2305,
+	0x2072, 0x8e70, 0x2205, 0x2072, 0x8e70, 0x9398, 0x0002, 0x9290,
+	0x0002, 0x1f04, 0xad57, 0x60c3, 0x0020, 0x080c, 0xa22d, 0x015e,
+	0x00de, 0x0005, 0x0156, 0x080c, 0x9c82, 0x7a14, 0x82ff, 0x0168,
+	0x9286, 0xffff, 0x0118, 0x9282, 0x000e, 0x1238, 0x7003, 0x0100,
+	0x700b, 0x0003, 0x60c3, 0x0008, 0x0488, 0x7003, 0x0200, 0x7007,
+	0x001c, 0x700f, 0x0001, 0x2011, 0x19bd, 0x2204, 0x8007, 0x701a,
+	0x8210, 0x2204, 0x8007, 0x701e, 0x0421, 0x1120, 0xb8a0, 0x9082,
+	0x007f, 0x0248, 0x2001, 0x181f, 0x2004, 0x7022, 0x2001, 0x1820,
+	0x2004, 0x7026, 0x0030, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff,
+	0x7026, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9,
+	0x0000, 0x20a1, 0x0256, 0x4003, 0x60c3, 0x001c, 0x015e, 0x0804,
+	0xa22d, 0x0006, 0x2001, 0x1837, 0x2004, 0xd0ac, 0x000e, 0x0005,
+	0x2011, 0x0003, 0x080c, 0xa639, 0x2011, 0x0002, 0x080c, 0xa643,
+	0x080c, 0xa526, 0x0036, 0x901e, 0x080c, 0xa59c, 0x003e, 0x0005,
+	0x080c, 0x3317, 0x0188, 0x0016, 0x00b6, 0x00c6, 0x7010, 0x9085,
+	0x0020, 0x7012, 0x2009, 0x007e, 0x080c, 0x6600, 0xb85c, 0xc0ac,
+	0xb85e, 0x00ce, 0x00be, 0x001e, 0x0005, 0x2071, 0x188d, 0x7000,
+	0x9005, 0x0140, 0x2001, 0x0976, 0x2071, 0x1800, 0x7076, 0x707a,
+	0x706b, 0xffe0, 0x2071, 0x1800, 0x7074, 0x7056, 0x705b, 0x1cd0,
 	0x0005, 0x00e6, 0x0126, 0x2071, 0x1800, 0x2091, 0x8000, 0x7554,
-	0x9582, 0x0001, 0x0608, 0x7058, 0x2060, 0x6000, 0x9086, 0x0000,
+	0x9582, 0x0010, 0x0608, 0x7058, 0x2060, 0x6000, 0x9086, 0x0000,
 	0x0148, 0x9ce0, 0x0018, 0x7068, 0x9c02, 0x1208, 0x0cb0, 0x2061,
 	0x1cd0, 0x0c98, 0x6003, 0x0008, 0x8529, 0x7556, 0x9ca8, 0x0018,
 	0x7068, 0x9502, 0x1230, 0x755a, 0x9085, 0x0001, 0x012e, 0x00ee,
-	0x0005, 0x705b, 0x1cd0, 0x0cc0, 0x9006, 0x0cc0, 0x6020, 0x9084,
-	0x000f, 0x0002, 0xabf9, 0xac02, 0xac1d, 0xac38, 0xcf3e, 0xcf5b,
-	0xcf76, 0xabf9, 0xac02, 0x8b1a, 0xac54, 0xabf9, 0xabf9, 0xabf9,
-	0xabf9, 0x9186, 0x0013, 0x1128, 0x080c, 0x9317, 0x080c, 0x941c,
-	0x0005, 0x0005, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0dd5,
-	0x0013, 0x006e, 0x0005, 0xac1b, 0xb389, 0xb564, 0xac1b, 0xb5fa,
-	0xaf37, 0xac1b, 0xac1b, 0xb30b, 0xbb5f, 0xac1b, 0xac1b, 0xac1b,
-	0xac1b, 0xac1b, 0xac1b, 0x080c, 0x0dd5, 0x0066, 0x6000, 0x90b2,
-	0x0016, 0x1a0c, 0x0dd5, 0x0013, 0x006e, 0x0005, 0xac36, 0xc233,
-	0xac36, 0xac36, 0xac36, 0xac36, 0xac36, 0xac36, 0xc1d8, 0xc3b5,
-	0xac36, 0xc274, 0xc2f3, 0xc274, 0xc2f3, 0xac36, 0x080c, 0x0dd5,
-	0x6000, 0x9082, 0x0016, 0x1a0c, 0x0dd5, 0x6000, 0x0002, 0xac52,
-	0xbba6, 0xbc8b, 0xbdbb, 0xbf66, 0xac52, 0xac52, 0xac52, 0xbb7a,
-	0xc164, 0xc167, 0xac52, 0xac52, 0xac52, 0xac52, 0xc196, 0xac52,
-	0xac52, 0xac52, 0x080c, 0x0dd5, 0x0066, 0x6000, 0x90b2, 0x0016,
-	0x1a0c, 0x0dd5, 0x0013, 0x006e, 0x0005, 0xac6d, 0xac6d, 0xacb0,
-	0xad4f, 0xade4, 0xac6d, 0xac6d, 0xac6d, 0xac6f, 0xac6d, 0xac6d,
-	0xac6d, 0xac6d, 0xac6d, 0xac6d, 0xac6d, 0x080c, 0x0dd5, 0x9186,
-	0x004c, 0x0588, 0x9186, 0x0003, 0x190c, 0x0dd5, 0x0096, 0x601c,
-	0xc0ed, 0x601e, 0x6003, 0x0003, 0x6106, 0x6014, 0x2048, 0xa87c,
-	0x9084, 0xa000, 0xc0b5, 0xa87e, 0xa8ac, 0xa846, 0xa8b0, 0xa84a,
-	0x9006, 0xa836, 0xa83a, 0xa884, 0x9092, 0x199a, 0x0210, 0x2001,
-	0x1999, 0x8003, 0x8013, 0x8213, 0x9210, 0x621a, 0x009e, 0x2c10,
-	0x080c, 0x1b03, 0x080c, 0x8ee4, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x9548, 0x012e, 0x0005, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be,
-	0x2c00, 0x080c, 0xae06, 0x080c, 0xcf30, 0x6003, 0x0007, 0x0005,
-	0x00d6, 0x0096, 0x00f6, 0x2079, 0x1800, 0x7a90, 0x6014, 0x2048,
-	0xa87c, 0xd0ec, 0x1110, 0x9290, 0x0018, 0xac78, 0xc4fc, 0x0046,
-	0xa8e0, 0x9005, 0x1140, 0xa8dc, 0x921a, 0x0140, 0x0220, 0xa87b,
-	0x0007, 0x2010, 0x0028, 0xa87b, 0x0015, 0x0010, 0xa87b, 0x0000,
-	0x8214, 0xa883, 0x0000, 0xaa02, 0x0006, 0x0016, 0x0026, 0x00c6,
-	0x00d6, 0x00e6, 0x00f6, 0x2400, 0x9005, 0x1108, 0x009a, 0x2100,
-	0x9086, 0x0015, 0x1118, 0x2001, 0x0001, 0x0038, 0x2100, 0x9086,
-	0x0016, 0x0118, 0x2001, 0x0001, 0x002a, 0x94a4, 0x0007, 0x8423,
-	0x9405, 0x0002, 0xad17, 0xad17, 0xad12, 0xad15, 0xad17, 0xad0f,
-	0xad02, 0xad02, 0xad02, 0xad02, 0xad02, 0xad02, 0xad02, 0xad02,
-	0xad02, 0xad02, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e,
-	0x000e, 0x004e, 0x00fe, 0x009e, 0x00de, 0x080c, 0x0dd5, 0x080c,
-	0xb7b7, 0x0028, 0x080c, 0xb89c, 0x0010, 0x080c, 0xb992, 0x00fe,
-	0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x2c00, 0xa896, 0x000e,
-	0x080c, 0xaec4, 0x0530, 0xa804, 0xa80e, 0x00a6, 0x2050, 0xb100,
-	0x00ae, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0,
-	0x9080, 0x0002, 0xaacc, 0xabd0, 0xacd4, 0xadd8, 0x2031, 0x0000,
-	0x2041, 0x1254, 0x080c, 0xb084, 0x0160, 0x000e, 0x9005, 0x0120,
-	0x00fe, 0x009e, 0x00de, 0x0005, 0x00fe, 0x009e, 0x00de, 0x0804,
-	0xab6b, 0x2001, 0x002c, 0x900e, 0x080c, 0xaf2a, 0x0c70, 0x91b6,
-	0x0015, 0x0170, 0x91b6, 0x0016, 0x0158, 0x91b2, 0x0047, 0x0a0c,
-	0x0dd5, 0x91b2, 0x0050, 0x1a0c, 0x0dd5, 0x9182, 0x0047, 0x00ca,
-	0x2001, 0x0109, 0x2004, 0xd08c, 0x0198, 0x0126, 0x2091, 0x2800,
-	0x0006, 0x0016, 0x0026, 0x080c, 0x8e31, 0x002e, 0x001e, 0x000e,
-	0x012e, 0xa001, 0x6000, 0x9086, 0x0002, 0x1110, 0x0804, 0xacb0,
-	0x0005, 0xad82, 0xad82, 0xad84, 0xadba, 0xad82, 0xad82, 0xad82,
-	0xad82, 0xadcd, 0x080c, 0x0dd5, 0x00d6, 0x0016, 0x0096, 0x080c,
-	0x93cc, 0x080c, 0x9548, 0x6003, 0x0004, 0x6114, 0x2148, 0xa87c,
-	0xd0fc, 0x01c0, 0xa878, 0xc0fc, 0x9005, 0x1158, 0xa894, 0x9005,
-	0x0140, 0x2001, 0x0000, 0x900e, 0x080c, 0xaf2a, 0x080c, 0xab6b,
-	0x00a8, 0x6003, 0x0002, 0xa8a4, 0xa9a8, 0x9105, 0x1178, 0xa8ae,
-	0xa8b2, 0x0c78, 0xa87f, 0x0020, 0xa88c, 0xa88a, 0xa8a4, 0xa8ae,
-	0xa8a8, 0xa8b2, 0xa8c7, 0x0000, 0xa8cb, 0x0000, 0x009e, 0x001e,
-	0x00de, 0x0005, 0x080c, 0x93cc, 0x00d6, 0x0096, 0x6114, 0x2148,
-	0x080c, 0xc825, 0x0120, 0xa87b, 0x0006, 0x080c, 0x6a46, 0x009e,
-	0x00de, 0x080c, 0xab6b, 0x0804, 0x9548, 0x080c, 0x93cc, 0x080c,
-	0x306e, 0x080c, 0xcf2d, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c,
-	0xc825, 0x0120, 0xa87b, 0x0029, 0x080c, 0x6a46, 0x009e, 0x00de,
-	0x080c, 0xab6b, 0x0804, 0x9548, 0x9182, 0x0047, 0x0002, 0xadf4,
-	0xadf6, 0xadf4, 0xadf4, 0xadf4, 0xadf4, 0xadf4, 0xadf4, 0xadf4,
-	0xadf4, 0xadf4, 0xadf4, 0xadf6, 0x080c, 0x0dd5, 0x00d6, 0x0096,
-	0x601f, 0x0000, 0x6114, 0x2148, 0xa87b, 0x0000, 0xa883, 0x0000,
-	0x080c, 0x6a46, 0x009e, 0x00de, 0x0804, 0xab6b, 0x0026, 0x0036,
-	0x0056, 0x0066, 0x0096, 0x00a6, 0x00f6, 0x0006, 0x080c, 0x1000,
-	0x000e, 0x090c, 0x0dd5, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019,
-	0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, 0xa87a, 0x2079, 0x1800,
-	0x7990, 0x9188, 0x0018, 0x918c, 0x0fff, 0xa972, 0xac76, 0x2950,
-	0x00a6, 0x2001, 0x0205, 0x2003, 0x0000, 0x901e, 0x2029, 0x0001,
-	0x9182, 0x0034, 0x1228, 0x2011, 0x001f, 0x080c, 0xc43a, 0x04c0,
-	0x2130, 0x2009, 0x0034, 0x2011, 0x001f, 0x080c, 0xc43a, 0x96b2,
-	0x0034, 0xb004, 0x904d, 0x0110, 0x080c, 0x0fb2, 0x080c, 0x1000,
-	0x01d0, 0x8528, 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, 0xb406,
-	0x968a, 0x003d, 0x1230, 0x2608, 0x2011, 0x001b, 0x080c, 0xc43a,
-	0x00b8, 0x96b2, 0x003c, 0x2009, 0x003c, 0x2950, 0x2011, 0x001b,
-	0x080c, 0xc43a, 0x0c18, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae,
-	0x852f, 0x95ad, 0x0050, 0xb566, 0xb070, 0xc0fd, 0xb072, 0x0048,
-	0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0050,
-	0xb566, 0x2a48, 0xa804, 0xa807, 0x0000, 0x0006, 0x080c, 0x6a46,
-	0x000e, 0x2048, 0x9005, 0x1db0, 0x00fe, 0x00ae, 0x009e, 0x006e,
-	0x005e, 0x003e, 0x002e, 0x0005, 0x00d6, 0x00f6, 0x0096, 0x0006,
-	0x080c, 0x1000, 0x000e, 0x090c, 0x0dd5, 0xa960, 0x21e8, 0xa95c,
-	0x9188, 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, 0xaa66,
-	0xa87a, 0x2079, 0x1800, 0x7990, 0x810c, 0x9188, 0x000c, 0x9182,
-	0x001a, 0x0210, 0x2009, 0x001a, 0x21a8, 0x810b, 0xa972, 0xac76,
-	0x2e98, 0xa85c, 0x9080, 0x001f, 0x20a0, 0x2001, 0x0205, 0x200c,
-	0x918d, 0x0080, 0x2102, 0x4003, 0x2003, 0x0000, 0x080c, 0x6a46,
-	0x009e, 0x00fe, 0x00de, 0x0005, 0x0016, 0x00d6, 0x00f6, 0x0096,
-	0x0016, 0x2001, 0x0205, 0x200c, 0x918d, 0x0080, 0x2102, 0x001e,
-	0x2079, 0x0200, 0x2e98, 0xa87c, 0xd0ec, 0x0118, 0x9e80, 0x000c,
-	0x2098, 0x2021, 0x003e, 0x901e, 0x9282, 0x0020, 0x0218, 0x2011,
-	0x0020, 0x2018, 0x9486, 0x003e, 0x1170, 0x0096, 0x080c, 0x1000,
-	0x2900, 0x009e, 0x05c0, 0xa806, 0x2048, 0xa860, 0x20e8, 0xa85c,
-	0x9080, 0x0002, 0x20a0, 0x3300, 0x908e, 0x0260, 0x0140, 0x2009,
-	0x0280, 0x9102, 0x920a, 0x0218, 0x2010, 0x2100, 0x9318, 0x2200,
-	0x9402, 0x1228, 0x2400, 0x9202, 0x2410, 0x9318, 0x9006, 0x2020,
-	0x22a8, 0xa800, 0x9200, 0xa802, 0x20e1, 0x0000, 0x4003, 0x83ff,
-	0x0180, 0x3300, 0x9086, 0x0280, 0x1130, 0x7814, 0x8000, 0x9085,
-	0x0080, 0x7816, 0x2e98, 0x2310, 0x84ff, 0x0904, 0xaed9, 0x0804,
-	0xaedb, 0x9085, 0x0001, 0x7817, 0x0000, 0x009e, 0x00fe, 0x00de,
-	0x001e, 0x0005, 0x00d6, 0x0036, 0x0096, 0x6314, 0x2348, 0xa87a,
-	0xa982, 0x080c, 0x6a3a, 0x009e, 0x003e, 0x00de, 0x0005, 0x91b6,
-	0x0015, 0x1118, 0x080c, 0xab6b, 0x0030, 0x91b6, 0x0016, 0x190c,
-	0x0dd5, 0x080c, 0xab6b, 0x0005, 0x20a9, 0x000e, 0x20e1, 0x0000,
-	0x2e98, 0x6014, 0x0096, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x20a0,
-	0x009e, 0x4003, 0x0136, 0x9080, 0x001b, 0x2011, 0x0006, 0x20a9,
-	0x0001, 0x3418, 0x8318, 0x23a0, 0x4003, 0x3318, 0x8318, 0x2398,
-	0x8211, 0x1db8, 0x2011, 0x0006, 0x013e, 0x20a0, 0x3318, 0x8318,
-	0x2398, 0x4003, 0x3418, 0x8318, 0x23a0, 0x8211, 0x1db8, 0x0096,
-	0x080c, 0xc825, 0x0130, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867,
-	0x0103, 0x009e, 0x0804, 0xab6b, 0x0096, 0x00d6, 0x0036, 0x7330,
-	0x9386, 0x0200, 0x11a8, 0x6010, 0x00b6, 0x2058, 0xb8cf, 0x0000,
-	0x00be, 0x6014, 0x9005, 0x0130, 0x2048, 0xa807, 0x0000, 0xa867,
-	0x0103, 0xab32, 0x080c, 0xab6b, 0x003e, 0x00de, 0x009e, 0x0005,
-	0x0011, 0x1d48, 0x0cc8, 0x0006, 0x0016, 0x080c, 0xcf18, 0x0188,
-	0x6014, 0x9005, 0x1170, 0x600b, 0x0003, 0x601b, 0x0000, 0x6043,
-	0x0000, 0x2009, 0x0022, 0x080c, 0xb361, 0x9006, 0x001e, 0x000e,
-	0x0005, 0x9085, 0x0001, 0x0cd0, 0x0096, 0x0016, 0x20a9, 0x0014,
-	0x9e80, 0x000c, 0x20e1, 0x0000, 0x2098, 0x6014, 0x2048, 0xa860,
+	0x0005, 0x705b, 0x1cd0, 0x0cc0, 0x9006, 0x0cc0, 0x00e6, 0x2071,
+	0x1800, 0x7554, 0x9582, 0x0010, 0x0600, 0x7058, 0x2060, 0x6000,
+	0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7068, 0x9c02, 0x1208,
+	0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, 0x0008, 0x8529, 0x7556,
+	0x9ca8, 0x0018, 0x7068, 0x9502, 0x1228, 0x755a, 0x9085, 0x0001,
+	0x00ee, 0x0005, 0x705b, 0x1cd0, 0x0cc8, 0x9006, 0x0cc8, 0x9c82,
+	0x1cd0, 0x0a0c, 0x0dd5, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1a0c,
+	0x0dd5, 0x9006, 0x6006, 0x600a, 0x600e, 0x6016, 0x601a, 0x6012,
+	0x6023, 0x0000, 0x6003, 0x0000, 0x601e, 0x6056, 0x605a, 0x6026,
+	0x602a, 0x602e, 0x6032, 0x6036, 0x603a, 0x603e, 0x6042, 0x602a,
+	0x2061, 0x1800, 0x6054, 0x8000, 0x6056, 0x9086, 0x0001, 0x0108,
+	0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x9664, 0x012e, 0x0cc0,
+	0x0006, 0x6000, 0x9086, 0x0000, 0x01b0, 0x601c, 0xd084, 0x190c,
+	0x1a5e, 0x6017, 0x0000, 0x6023, 0x0007, 0x2001, 0x1986, 0x2004,
+	0x0006, 0x9082, 0x0051, 0x000e, 0x0208, 0x8004, 0x601a, 0x080c,
+	0xe7ea, 0x6043, 0x0000, 0x000e, 0x0005, 0x00e6, 0x0126, 0x2071,
+	0x1800, 0x2091, 0x8000, 0x7554, 0x9582, 0x0001, 0x0608, 0x7058,
+	0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7068,
+	0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, 0x0008,
+	0x8529, 0x7556, 0x9ca8, 0x0018, 0x7068, 0x9502, 0x1230, 0x755a,
+	0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x705b, 0x1cd0, 0x0cc0,
+	0x9006, 0x0cc0, 0x6020, 0x9084, 0x000f, 0x0002, 0xaed5, 0xaede,
+	0xaef9, 0xaf14, 0xd23c, 0xd259, 0xd274, 0xaed5, 0xaede, 0x8d62,
+	0xaf30, 0xaed5, 0xaed5, 0xaed5, 0xaed5, 0x9186, 0x0013, 0x1128,
+	0x080c, 0x955f, 0x080c, 0x9664, 0x0005, 0x0005, 0x0066, 0x6000,
+	0x90b2, 0x0016, 0x1a0c, 0x0dd5, 0x0013, 0x006e, 0x0005, 0xaef7,
+	0xb665, 0xb840, 0xaef7, 0xb8d6, 0xb213, 0xaef7, 0xaef7, 0xb5e7,
+	0xbe3b, 0xaef7, 0xaef7, 0xaef7, 0xaef7, 0xaef7, 0xaef7, 0x080c,
+	0x0dd5, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0dd5, 0x0013,
+	0x006e, 0x0005, 0xaf12, 0xc50f, 0xaf12, 0xaf12, 0xaf12, 0xaf12,
+	0xaf12, 0xaf12, 0xc4b4, 0xc691, 0xaf12, 0xc550, 0xc5cf, 0xc550,
+	0xc5cf, 0xaf12, 0x080c, 0x0dd5, 0x6000, 0x9082, 0x0016, 0x1a0c,
+	0x0dd5, 0x6000, 0x0002, 0xaf2e, 0xbe82, 0xbf67, 0xc097, 0xc242,
+	0xaf2e, 0xaf2e, 0xaf2e, 0xbe56, 0xc440, 0xc443, 0xaf2e, 0xaf2e,
+	0xaf2e, 0xaf2e, 0xc472, 0xaf2e, 0xaf2e, 0xaf2e, 0x080c, 0x0dd5,
+	0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0dd5, 0x0013, 0x006e,
+	0x0005, 0xaf49, 0xaf49, 0xaf8c, 0xb02b, 0xb0c0, 0xaf49, 0xaf49,
+	0xaf49, 0xaf4b, 0xaf49, 0xaf49, 0xaf49, 0xaf49, 0xaf49, 0xaf49,
+	0xaf49, 0x080c, 0x0dd5, 0x9186, 0x004c, 0x0588, 0x9186, 0x0003,
+	0x190c, 0x0dd5, 0x0096, 0x601c, 0xc0ed, 0x601e, 0x6003, 0x0003,
+	0x6106, 0x6014, 0x2048, 0xa87c, 0x9084, 0xa000, 0xc0b5, 0xa87e,
+	0xa8ac, 0xa846, 0xa8b0, 0xa84a, 0x9006, 0xa836, 0xa83a, 0xa884,
+	0x9092, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x8013, 0x8213,
+	0x9210, 0x621a, 0x009e, 0x2c10, 0x080c, 0x1bad, 0x080c, 0x912c,
+	0x0126, 0x2091, 0x8000, 0x080c, 0x9790, 0x012e, 0x0005, 0x6010,
+	0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x080c, 0xb0e2, 0x080c,
+	0xd22e, 0x6003, 0x0007, 0x0005, 0x00d6, 0x0096, 0x00f6, 0x2079,
+	0x1800, 0x7a90, 0x6014, 0x2048, 0xa87c, 0xd0ec, 0x1110, 0x9290,
+	0x0018, 0xac78, 0xc4fc, 0x0046, 0xa8e0, 0x9005, 0x1140, 0xa8dc,
+	0x921a, 0x0140, 0x0220, 0xa87b, 0x0007, 0x2010, 0x0028, 0xa87b,
+	0x0015, 0x0010, 0xa87b, 0x0000, 0x8214, 0xa883, 0x0000, 0xaa02,
+	0x0006, 0x0016, 0x0026, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2400,
+	0x9005, 0x1108, 0x009a, 0x2100, 0x9086, 0x0015, 0x1118, 0x2001,
+	0x0001, 0x0038, 0x2100, 0x9086, 0x0016, 0x0118, 0x2001, 0x0001,
+	0x002a, 0x94a4, 0x0007, 0x8423, 0x9405, 0x0002, 0xaff3, 0xaff3,
+	0xafee, 0xaff1, 0xaff3, 0xafeb, 0xafde, 0xafde, 0xafde, 0xafde,
+	0xafde, 0xafde, 0xafde, 0xafde, 0xafde, 0xafde, 0x00fe, 0x00ee,
+	0x00de, 0x00ce, 0x002e, 0x001e, 0x000e, 0x004e, 0x00fe, 0x009e,
+	0x00de, 0x080c, 0x0dd5, 0x080c, 0xba93, 0x0028, 0x080c, 0xbb78,
+	0x0010, 0x080c, 0xbc6e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e,
+	0x001e, 0x2c00, 0xa896, 0x000e, 0x080c, 0xb1a0, 0x0530, 0xa804,
+	0xa80e, 0x00a6, 0x2050, 0xb100, 0x00ae, 0x8006, 0x8006, 0x8007,
+	0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0xaacc, 0xabd0,
+	0xacd4, 0xadd8, 0x2031, 0x0000, 0x2041, 0x125d, 0x080c, 0xb360,
+	0x0160, 0x000e, 0x9005, 0x0120, 0x00fe, 0x009e, 0x00de, 0x0005,
+	0x00fe, 0x009e, 0x00de, 0x0804, 0xae47, 0x2001, 0x002c, 0x900e,
+	0x080c, 0xb206, 0x0c70, 0x91b6, 0x0015, 0x0170, 0x91b6, 0x0016,
+	0x0158, 0x91b2, 0x0047, 0x0a0c, 0x0dd5, 0x91b2, 0x0050, 0x1a0c,
+	0x0dd5, 0x9182, 0x0047, 0x00ca, 0x2001, 0x0109, 0x2004, 0xd08c,
+	0x0198, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x080c,
+	0x9079, 0x002e, 0x001e, 0x000e, 0x012e, 0xa001, 0x6000, 0x9086,
+	0x0002, 0x1110, 0x0804, 0xaf8c, 0x0005, 0xb05e, 0xb05e, 0xb060,
+	0xb096, 0xb05e, 0xb05e, 0xb05e, 0xb05e, 0xb0a9, 0x080c, 0x0dd5,
+	0x00d6, 0x0016, 0x0096, 0x080c, 0x9614, 0x080c, 0x9790, 0x6003,
+	0x0004, 0x6114, 0x2148, 0xa87c, 0xd0fc, 0x01c0, 0xa878, 0xc0fc,
+	0x9005, 0x1158, 0xa894, 0x9005, 0x0140, 0x2001, 0x0000, 0x900e,
+	0x080c, 0xb206, 0x080c, 0xae47, 0x00a8, 0x6003, 0x0002, 0xa8a4,
+	0xa9a8, 0x9105, 0x1178, 0xa8ae, 0xa8b2, 0x0c78, 0xa87f, 0x0020,
+	0xa88c, 0xa88a, 0xa8a4, 0xa8ae, 0xa8a8, 0xa8b2, 0xa8c7, 0x0000,
+	0xa8cb, 0x0000, 0x009e, 0x001e, 0x00de, 0x0005, 0x080c, 0x9614,
+	0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, 0xcb1b, 0x0120, 0xa87b,
+	0x0006, 0x080c, 0x6c79, 0x009e, 0x00de, 0x080c, 0xae47, 0x0804,
+	0x9790, 0x080c, 0x9614, 0x080c, 0x31bc, 0x080c, 0xd22b, 0x00d6,
+	0x0096, 0x6114, 0x2148, 0x080c, 0xcb1b, 0x0120, 0xa87b, 0x0029,
+	0x080c, 0x6c79, 0x009e, 0x00de, 0x080c, 0xae47, 0x0804, 0x9790,
+	0x9182, 0x0047, 0x0002, 0xb0d0, 0xb0d2, 0xb0d0, 0xb0d0, 0xb0d0,
+	0xb0d0, 0xb0d0, 0xb0d0, 0xb0d0, 0xb0d0, 0xb0d0, 0xb0d0, 0xb0d2,
+	0x080c, 0x0dd5, 0x00d6, 0x0096, 0x601f, 0x0000, 0x6114, 0x2148,
+	0xa87b, 0x0000, 0xa883, 0x0000, 0x080c, 0x6c79, 0x009e, 0x00de,
+	0x0804, 0xae47, 0x0026, 0x0036, 0x0056, 0x0066, 0x0096, 0x00a6,
+	0x00f6, 0x0006, 0x080c, 0x0fff, 0x000e, 0x090c, 0x0dd5, 0xa960,
+	0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020,
+	0x4104, 0xa87a, 0x2079, 0x1800, 0x7990, 0x9188, 0x0018, 0x918c,
+	0x0fff, 0xa972, 0xac76, 0x2950, 0x00a6, 0x2001, 0x0205, 0x2003,
+	0x0000, 0x901e, 0x2029, 0x0001, 0x9182, 0x0034, 0x1228, 0x2011,
+	0x001f, 0x080c, 0xc716, 0x04c0, 0x2130, 0x2009, 0x0034, 0x2011,
+	0x001f, 0x080c, 0xc716, 0x96b2, 0x0034, 0xb004, 0x904d, 0x0110,
+	0x080c, 0x0fb1, 0x080c, 0x0fff, 0x01d0, 0x8528, 0xa867, 0x0110,
+	0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, 0x1230, 0x2608,
+	0x2011, 0x001b, 0x080c, 0xc716, 0x00b8, 0x96b2, 0x003c, 0x2009,
+	0x003c, 0x2950, 0x2011, 0x001b, 0x080c, 0xc716, 0x0c18, 0x2001,
+	0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0050, 0xb566,
+	0xb070, 0xc0fd, 0xb072, 0x0048, 0x2001, 0x0205, 0x2003, 0x0000,
+	0x00ae, 0x852f, 0x95ad, 0x0050, 0xb566, 0x2a48, 0xa804, 0xa807,
+	0x0000, 0x0006, 0x080c, 0x6c79, 0x000e, 0x2048, 0x9005, 0x1db0,
+	0x00fe, 0x00ae, 0x009e, 0x006e, 0x005e, 0x003e, 0x002e, 0x0005,
+	0x00d6, 0x00f6, 0x0096, 0x0006, 0x080c, 0x0fff, 0x000e, 0x090c,
+	0x0dd5, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e,
+	0x20a9, 0x0020, 0x4104, 0xaa66, 0xa87a, 0x2079, 0x1800, 0x7990,
+	0x810c, 0x9188, 0x000c, 0x9182, 0x001a, 0x0210, 0x2009, 0x001a,
+	0x21a8, 0x810b, 0xa972, 0xac76, 0x2e98, 0xa85c, 0x9080, 0x001f,
+	0x20a0, 0x2001, 0x0205, 0x200c, 0x918d, 0x0080, 0x2102, 0x4003,
+	0x2003, 0x0000, 0x080c, 0x6c79, 0x009e, 0x00fe, 0x00de, 0x0005,
+	0x0016, 0x00d6, 0x00f6, 0x0096, 0x0016, 0x2001, 0x0205, 0x200c,
+	0x918d, 0x0080, 0x2102, 0x001e, 0x2079, 0x0200, 0x2e98, 0xa87c,
+	0xd0ec, 0x0118, 0x9e80, 0x000c, 0x2098, 0x2021, 0x003e, 0x901e,
+	0x9282, 0x0020, 0x0218, 0x2011, 0x0020, 0x2018, 0x9486, 0x003e,
+	0x1170, 0x0096, 0x080c, 0x0fff, 0x2900, 0x009e, 0x05c0, 0xa806,
+	0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x3300,
+	0x908e, 0x0260, 0x0140, 0x2009, 0x0280, 0x9102, 0x920a, 0x0218,
+	0x2010, 0x2100, 0x9318, 0x2200, 0x9402, 0x1228, 0x2400, 0x9202,
+	0x2410, 0x9318, 0x9006, 0x2020, 0x22a8, 0xa800, 0x9200, 0xa802,
+	0x20e1, 0x0000, 0x4003, 0x83ff, 0x0180, 0x3300, 0x9086, 0x0280,
+	0x1130, 0x7814, 0x8000, 0x9085, 0x0080, 0x7816, 0x2e98, 0x2310,
+	0x84ff, 0x0904, 0xb1b5, 0x0804, 0xb1b7, 0x9085, 0x0001, 0x7817,
+	0x0000, 0x009e, 0x00fe, 0x00de, 0x001e, 0x0005, 0x00d6, 0x0036,
+	0x0096, 0x6314, 0x2348, 0xa87a, 0xa982, 0x080c, 0x6c6d, 0x009e,
+	0x003e, 0x00de, 0x0005, 0x91b6, 0x0015, 0x1118, 0x080c, 0xae47,
+	0x0030, 0x91b6, 0x0016, 0x190c, 0x0dd5, 0x080c, 0xae47, 0x0005,
+	0x20a9, 0x000e, 0x20e1, 0x0000, 0x2e98, 0x6014, 0x0096, 0x2048,
+	0xa860, 0x20e8, 0xa85c, 0x20a0, 0x009e, 0x4003, 0x0136, 0x9080,
+	0x001b, 0x2011, 0x0006, 0x20a9, 0x0001, 0x3418, 0x8318, 0x23a0,
+	0x4003, 0x3318, 0x8318, 0x2398, 0x8211, 0x1db8, 0x2011, 0x0006,
+	0x013e, 0x20a0, 0x3318, 0x8318, 0x2398, 0x4003, 0x3418, 0x8318,
+	0x23a0, 0x8211, 0x1db8, 0x0096, 0x080c, 0xcb1b, 0x0130, 0x6014,
+	0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0x009e, 0x0804, 0xae47,
+	0x0096, 0x00d6, 0x0036, 0x7330, 0x9386, 0x0200, 0x11a8, 0x6010,
+	0x00b6, 0x2058, 0xb8cf, 0x0000, 0x00be, 0x6014, 0x9005, 0x0130,
+	0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xab32, 0x080c, 0xae47,
+	0x003e, 0x00de, 0x009e, 0x0005, 0x0011, 0x1d48, 0x0cc8, 0x0006,
+	0x0016, 0x080c, 0xd216, 0x0188, 0x6014, 0x9005, 0x1170, 0x600b,
+	0x0003, 0x601b, 0x0000, 0x6043, 0x0000, 0x2009, 0x0022, 0x080c,
+	0xb63d, 0x9006, 0x001e, 0x000e, 0x0005, 0x9085, 0x0001, 0x0cd0,
+	0x0096, 0x0016, 0x20a9, 0x0014, 0x9e80, 0x000c, 0x20e1, 0x0000,
+	0x2098, 0x6014, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002,
+	0x20a0, 0x4003, 0x2001, 0x0205, 0x2003, 0x0001, 0x2099, 0x0260,
+	0x20a9, 0x0016, 0x4003, 0x20a9, 0x000a, 0xa804, 0x2048, 0xa860,
 	0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x2001, 0x0205,
-	0x2003, 0x0001, 0x2099, 0x0260, 0x20a9, 0x0016, 0x4003, 0x20a9,
-	0x000a, 0xa804, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002,
-	0x20a0, 0x4003, 0x2001, 0x0205, 0x2003, 0x0002, 0x2099, 0x0260,
-	0x20a9, 0x0020, 0x4003, 0x2003, 0x0000, 0x6014, 0x2048, 0xa800,
-	0x2048, 0xa867, 0x0103, 0x080c, 0xab6b, 0x001e, 0x009e, 0x0005,
-	0x0096, 0x0016, 0x900e, 0x7030, 0x9086, 0x0100, 0x0140, 0x7038,
-	0x9084, 0x00ff, 0x800c, 0x703c, 0x9084, 0x00ff, 0x8004, 0x9080,
-	0x0004, 0x9108, 0x810b, 0x2011, 0x0002, 0x2019, 0x000c, 0x6014,
-	0x2048, 0x080c, 0xc43a, 0x080c, 0xc825, 0x0140, 0x6014, 0x2048,
-	0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, 0xab6b,
-	0x001e, 0x009e, 0x0005, 0x0016, 0x2009, 0x0000, 0x7030, 0x9086,
-	0x0200, 0x0110, 0x2009, 0x0001, 0x0096, 0x6014, 0x904d, 0x090c,
-	0x0dd5, 0xa97a, 0x080c, 0x6a46, 0x009e, 0x080c, 0xab6b, 0x001e,
-	0x0005, 0x0016, 0x0096, 0x7030, 0x9086, 0x0100, 0x1118, 0x2009,
-	0x0004, 0x0010, 0x7034, 0x800c, 0x810b, 0x2011, 0x000c, 0x2019,
-	0x000c, 0x6014, 0x2048, 0xa804, 0x0096, 0x9005, 0x0108, 0x2048,
-	0x080c, 0xc43a, 0x009e, 0x080c, 0xc825, 0x0148, 0xa804, 0x9005,
-	0x1158, 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c,
-	0xab6b, 0x009e, 0x001e, 0x0005, 0x0086, 0x2040, 0xa030, 0x8007,
-	0x9086, 0x0100, 0x1118, 0x080c, 0xb51d, 0x00e0, 0xa034, 0x8007,
-	0x800c, 0x8806, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0,
-	0x9080, 0x000c, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000,
-	0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x123a,
-	0x0019, 0x0d08, 0x008e, 0x0898, 0x0096, 0x0006, 0x080c, 0x1000,
-	0x000e, 0x01b0, 0xa8ab, 0x0dcb, 0xa876, 0x000e, 0xa8a2, 0x0006,
-	0xae6a, 0x2800, 0xa89e, 0xa97a, 0xaf72, 0xaa8e, 0xab92, 0xac96,
-	0xad9a, 0x0086, 0x2940, 0x080c, 0x10e0, 0x008e, 0x9085, 0x0001,
-	0x009e, 0x0005, 0x00e6, 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff,
-	0x6210, 0x00b6, 0x2258, 0xba10, 0x00be, 0x9206, 0x1520, 0x700c,
-	0x6210, 0x00b6, 0x2258, 0xba14, 0x00be, 0x9206, 0x11e0, 0x6043,
-	0x0000, 0x2c68, 0x0016, 0x2009, 0x0035, 0x080c, 0xce90, 0x001e,
-	0x1158, 0x622c, 0x2268, 0x2071, 0x026c, 0x6b20, 0x9386, 0x0003,
-	0x0130, 0x9386, 0x0006, 0x0128, 0x080c, 0xab6b, 0x0020, 0x0039,
-	0x0010, 0x080c, 0xb196, 0x002e, 0x00de, 0x00ee, 0x0005, 0x0096,
-	0x6814, 0x2048, 0x9186, 0x0015, 0x0904, 0xb17e, 0x918e, 0x0016,
-	0x1904, 0xb194, 0x700c, 0x908c, 0xff00, 0x9186, 0x1700, 0x0120,
-	0x9186, 0x0300, 0x1904, 0xb158, 0x89ff, 0x1138, 0x6800, 0x9086,
-	0x000f, 0x0904, 0xb13b, 0x0804, 0xb192, 0x6808, 0x9086, 0xffff,
-	0x1904, 0xb180, 0xa87c, 0x9084, 0x0060, 0x9086, 0x0020, 0x1128,
-	0xa83c, 0xa940, 0x9105, 0x1904, 0xb180, 0x6824, 0xd0b4, 0x1904,
-	0xb180, 0x080c, 0xca07, 0x685c, 0xa882, 0xa87c, 0xc0dc, 0xc0f4,
-	0xc0d4, 0xa87e, 0x0026, 0x900e, 0x6a18, 0x2001, 0x000a, 0x080c,
-	0x8cf7, 0xa884, 0x920a, 0x0208, 0x8011, 0xaa86, 0x82ff, 0x002e,
-	0x1138, 0x00c6, 0x2d60, 0x080c, 0xc564, 0x00ce, 0x0804, 0xb192,
-	0x00c6, 0xa868, 0xd0fc, 0x1118, 0x080c, 0x5e8c, 0x0010, 0x080c,
-	0x6282, 0x00ce, 0x1904, 0xb180, 0x00c6, 0x2d60, 0x080c, 0xab6b,
-	0x00ce, 0x0804, 0xb192, 0x00c6, 0x080c, 0xabb9, 0x0198, 0x6017,
-	0x0000, 0x6810, 0x6012, 0x080c, 0xcc93, 0x6023, 0x0003, 0x6904,
-	0x00c6, 0x2d60, 0x080c, 0xab6b, 0x00ce, 0x080c, 0xabe6, 0x00ce,
-	0x0804, 0xb192, 0x2001, 0x1986, 0x2004, 0x6842, 0x00ce, 0x04d0,
-	0x7008, 0x9086, 0x000b, 0x11c8, 0x6010, 0x00b6, 0x2058, 0xb900,
-	0xc1bc, 0xb902, 0x00be, 0x00c6, 0x2d60, 0xa87b, 0x0003, 0x080c,
-	0xced2, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c,
-	0x8e7f, 0x080c, 0x941c, 0x00ce, 0x00e8, 0x700c, 0x9086, 0x2a00,
-	0x1138, 0x2001, 0x1986, 0x2004, 0x6842, 0x00a0, 0x0479, 0x00a0,
-	0x89ff, 0x090c, 0x0dd5, 0x00c6, 0x00d6, 0x2d60, 0xa867, 0x0103,
-	0xa87b, 0x0003, 0x080c, 0x6862, 0x080c, 0xca07, 0x080c, 0xab9c,
-	0x00de, 0x00ce, 0x080c, 0xab6b, 0x009e, 0x0005, 0x9186, 0x0015,
-	0x1128, 0x2001, 0x1986, 0x2004, 0x6842, 0x0068, 0x918e, 0x0016,
-	0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c, 0xe4d8, 0x080c, 0x8441,
-	0x080c, 0xab6b, 0x00ce, 0x080c, 0xab6b, 0x0005, 0x0026, 0x0036,
-	0x0046, 0x7228, 0xacb0, 0xabac, 0xd2f4, 0x0130, 0x2001, 0x1986,
-	0x2004, 0x6842, 0x0804, 0xb210, 0x00c6, 0x2d60, 0x080c, 0xc465,
-	0x00ce, 0x6804, 0x9086, 0x0050, 0x1168, 0x00c6, 0x2d00, 0x2060,
-	0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x8e7f, 0x080c, 0x941c,
-	0x00ce, 0x04f0, 0x6800, 0x9086, 0x000f, 0x01a8, 0x89ff, 0x090c,
-	0x0dd5, 0x6800, 0x9086, 0x0004, 0x1190, 0xa87c, 0xd0ac, 0x0178,
-	0xa843, 0x0fff, 0xa83f, 0x0fff, 0xa880, 0xc0fc, 0xa882, 0x2001,
-	0x0001, 0x6832, 0x0400, 0x2001, 0x0007, 0x6832, 0x00e0, 0xa87c,
-	0xd0b4, 0x1150, 0xd0ac, 0x0db8, 0x6824, 0xd0f4, 0x1d48, 0xa838,
-	0xa934, 0x9105, 0x0d80, 0x0c20, 0xd2ec, 0x1d68, 0x7024, 0x9306,
-	0x1118, 0x7020, 0x9406, 0x0d38, 0x7020, 0x683e, 0x7024, 0x683a,
-	0x2001, 0x0005, 0x6832, 0x080c, 0xcb8a, 0x080c, 0x941c, 0x0010,
-	0x080c, 0xab6b, 0x004e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x00d6,
+	0x2003, 0x0002, 0x2099, 0x0260, 0x20a9, 0x0020, 0x4003, 0x2003,
+	0x0000, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, 0x080c,
+	0xae47, 0x001e, 0x009e, 0x0005, 0x0096, 0x0016, 0x900e, 0x7030,
+	0x9086, 0x0100, 0x0140, 0x7038, 0x9084, 0x00ff, 0x800c, 0x703c,
+	0x9084, 0x00ff, 0x8004, 0x9080, 0x0004, 0x9108, 0x810b, 0x2011,
+	0x0002, 0x2019, 0x000c, 0x6014, 0x2048, 0x080c, 0xc716, 0x080c,
+	0xcb1b, 0x0140, 0x6014, 0x2048, 0xa807, 0x0000, 0xa864, 0xa8e2,
+	0xa867, 0x0103, 0x080c, 0xae47, 0x001e, 0x009e, 0x0005, 0x0016,
+	0x2009, 0x0000, 0x7030, 0x9086, 0x0200, 0x0110, 0x2009, 0x0001,
+	0x0096, 0x6014, 0x904d, 0x090c, 0x0dd5, 0xa97a, 0x080c, 0x6c79,
+	0x009e, 0x080c, 0xae47, 0x001e, 0x0005, 0x0016, 0x0096, 0x7030,
+	0x9086, 0x0100, 0x1118, 0x2009, 0x0004, 0x0010, 0x7034, 0x800c,
+	0x810b, 0x2011, 0x000c, 0x2019, 0x000c, 0x6014, 0x2048, 0xa804,
+	0x0096, 0x9005, 0x0108, 0x2048, 0x080c, 0xc716, 0x009e, 0x080c,
+	0xcb1b, 0x0148, 0xa804, 0x9005, 0x1158, 0xa807, 0x0000, 0xa864,
+	0xa8e2, 0xa867, 0x0103, 0x080c, 0xae47, 0x009e, 0x001e, 0x0005,
+	0x0086, 0x2040, 0xa030, 0x8007, 0x9086, 0x0100, 0x1118, 0x080c,
+	0xb7f9, 0x00e0, 0xa034, 0x8007, 0x800c, 0x8806, 0x8006, 0x8007,
+	0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x000c, 0xa87b, 0x0000,
+	0xa883, 0x0000, 0xa897, 0x4000, 0xaaa0, 0xab9c, 0xaca8, 0xada4,
+	0x2031, 0x0000, 0x2041, 0x1243, 0x0019, 0x0d08, 0x008e, 0x0898,
+	0x0096, 0x0006, 0x080c, 0x0fff, 0x000e, 0x01b0, 0xa8ab, 0x0dcb,
+	0xa876, 0x000e, 0xa8a2, 0x0006, 0xae6a, 0x2800, 0xa89e, 0xa97a,
+	0xaf72, 0xaa8e, 0xab92, 0xac96, 0xad9a, 0x0086, 0x2940, 0x080c,
+	0x10e9, 0x008e, 0x9085, 0x0001, 0x009e, 0x0005, 0x00e6, 0x00d6,
 	0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, 0xba10,
-	0x00be, 0x9206, 0x1904, 0xb27b, 0x700c, 0x6210, 0x00b6, 0x2258,
-	0xba14, 0x00be, 0x9206, 0x1904, 0xb27b, 0x6038, 0x2068, 0x6824,
-	0xc0dc, 0x6826, 0x6a20, 0x9286, 0x0007, 0x0904, 0xb27b, 0x9286,
-	0x0002, 0x0904, 0xb27b, 0x9286, 0x0000, 0x05e8, 0x6808, 0x633c,
-	0x9306, 0x15c8, 0x2071, 0x026c, 0x9186, 0x0015, 0x0570, 0x918e,
-	0x0016, 0x1100, 0x00c6, 0x6038, 0x2060, 0x6104, 0x9186, 0x004b,
-	0x01c0, 0x9186, 0x004c, 0x01a8, 0x9186, 0x004d, 0x0190, 0x9186,
-	0x004e, 0x0178, 0x9186, 0x0052, 0x0160, 0x6014, 0x0096, 0x2048,
-	0x080c, 0xc825, 0x090c, 0x0dd5, 0xa87b, 0x0003, 0x009e, 0x080c,
-	0xced2, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c,
-	0x8e7f, 0x080c, 0x941c, 0x00ce, 0x0030, 0x6038, 0x2070, 0x2001,
-	0x1986, 0x2004, 0x7042, 0x080c, 0xab6b, 0x002e, 0x00de, 0x00ee,
-	0x0005, 0x00b6, 0x0096, 0x00f6, 0x6014, 0x2048, 0x6010, 0x2058,
-	0x91b6, 0x0015, 0x0130, 0xba08, 0xbb0c, 0xbc00, 0xc48c, 0xbc02,
-	0x0460, 0x0096, 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, 0x0010,
-	0x2019, 0x000a, 0x20a9, 0x0004, 0x080c, 0xbb27, 0x002e, 0x003e,
-	0x015e, 0x009e, 0x1904, 0xb2ea, 0x0096, 0x0156, 0x0036, 0x0026,
-	0x2b48, 0x9e90, 0x0014, 0x2019, 0x0006, 0x20a9, 0x0004, 0x080c,
-	0xbb27, 0x002e, 0x003e, 0x015e, 0x009e, 0x15a0, 0x7238, 0xba0a,
-	0x733c, 0xbb0e, 0xbc00, 0xc48d, 0xbc02, 0xa804, 0x9005, 0x1128,
-	0x00fe, 0x009e, 0x00be, 0x0804, 0xaf6f, 0x0096, 0x2048, 0xaa12,
-	0xab16, 0xac0a, 0x009e, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f,
-	0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c,
-	0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x123a, 0x080c, 0xb084,
-	0x0130, 0x00fe, 0x009e, 0x080c, 0xab6b, 0x00be, 0x0005, 0x080c,
-	0xb51d, 0x0cb8, 0x2b78, 0x00f6, 0x080c, 0x306e, 0x080c, 0xcf2d,
-	0x00fe, 0x00c6, 0x080c, 0xab15, 0x2f00, 0x6012, 0x6017, 0x0000,
-	0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007,
-	0x080c, 0x631d, 0x080c, 0x6349, 0x080c, 0x8ec7, 0x080c, 0x941c,
-	0x00ce, 0x0804, 0xb2bd, 0x2100, 0x91b2, 0x0053, 0x1a0c, 0x0dd5,
-	0x91b2, 0x0040, 0x1a04, 0xb373, 0x0002, 0xb361, 0xb361, 0xb357,
-	0xb361, 0xb361, 0xb361, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355,
-	0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355,
-	0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355,
-	0xb355, 0xb355, 0xb355, 0xb355, 0xb361, 0xb355, 0xb361, 0xb361,
-	0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb357, 0xb355, 0xb355,
-	0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb361,
-	0xb361, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355, 0xb355,
-	0xb355, 0xb355, 0xb361, 0xb355, 0xb355, 0x080c, 0x0dd5, 0x0066,
-	0x00b6, 0x6610, 0x2658, 0xb8cc, 0xc08c, 0xb8ce, 0x00be, 0x006e,
-	0x0000, 0x6003, 0x0001, 0x6106, 0x9186, 0x0032, 0x0118, 0x080c,
-	0x8ec7, 0x0010, 0x080c, 0x8e7f, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x941c, 0x012e, 0x0005, 0x2600, 0x0002, 0xb361, 0xb361, 0xb387,
-	0xb361, 0xb361, 0xb387, 0xb387, 0xb387, 0xb387, 0xb361, 0xb387,
-	0xb361, 0xb387, 0xb361, 0xb387, 0xb387, 0xb387, 0xb387, 0x080c,
-	0x0dd5, 0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0dd5, 0x91b6, 0x0013,
-	0x0904, 0xb44b, 0x91b6, 0x0027, 0x1904, 0xb406, 0x080c, 0x9317,
-	0x6004, 0x080c, 0xca13, 0x01b0, 0x080c, 0xca24, 0x01a8, 0x908e,
-	0x0021, 0x0904, 0xb403, 0x908e, 0x0022, 0x1130, 0x080c, 0xaf9b,
-	0x0904, 0xb3ff, 0x0804, 0xb400, 0x908e, 0x003d, 0x0904, 0xb403,
-	0x0804, 0xb3f9, 0x080c, 0x3093, 0x2001, 0x0007, 0x080c, 0x631d,
-	0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, 0xb51d, 0x9186,
-	0x007e, 0x1148, 0x2001, 0x1837, 0x2014, 0xc285, 0x080c, 0x717d,
-	0x1108, 0xc2ad, 0x2202, 0x0036, 0x0026, 0x2019, 0x0028, 0x2110,
-	0x080c, 0xe5e4, 0x002e, 0x003e, 0x0016, 0x0026, 0x0036, 0x2110,
-	0x2019, 0x0028, 0x080c, 0x901a, 0x0076, 0x903e, 0x080c, 0x8ef7,
-	0x6010, 0x00b6, 0x905d, 0x0100, 0x00be, 0x2c08, 0x080c, 0xdfbd,
-	0x007e, 0x003e, 0x002e, 0x001e, 0x080c, 0xcf2d, 0x0016, 0x080c,
-	0xcc8b, 0x080c, 0xab6b, 0x001e, 0x080c, 0x3166, 0x080c, 0x941c,
-	0x0030, 0x080c, 0xcc8b, 0x080c, 0xab6b, 0x080c, 0x941c, 0x0005,
-	0x080c, 0xb51d, 0x0cb0, 0x080c, 0xb559, 0x0c98, 0x9186, 0x0014,
-	0x1db0, 0x080c, 0x9317, 0x6004, 0x908e, 0x0022, 0x1118, 0x080c,
-	0xaf9b, 0x0d68, 0x080c, 0x306e, 0x080c, 0xcf2d, 0x080c, 0xca13,
-	0x1190, 0x080c, 0x3093, 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be,
-	0x080c, 0xb51d, 0x9186, 0x007e, 0x1128, 0x2001, 0x1837, 0x200c,
-	0xc185, 0x2102, 0x0870, 0x080c, 0xca24, 0x1118, 0x080c, 0xb51d,
-	0x0840, 0x6004, 0x908e, 0x0032, 0x1160, 0x00e6, 0x00f6, 0x2071,
-	0x189e, 0x2079, 0x0000, 0x080c, 0x3401, 0x00fe, 0x00ee, 0x0804,
-	0xb3f9, 0x6004, 0x908e, 0x0021, 0x0d48, 0x908e, 0x0022, 0x090c,
-	0xb51d, 0x0804, 0xb3f9, 0x90b2, 0x0040, 0x1a04, 0xb4f9, 0x2008,
-	0x0002, 0xb493, 0xb494, 0xb497, 0xb49a, 0xb49d, 0xb4a0, 0xb491,
-	0xb491, 0xb491, 0xb491, 0xb491, 0xb491, 0xb491, 0xb491, 0xb491,
-	0xb491, 0xb491, 0xb491, 0xb491, 0xb491, 0xb491, 0xb491, 0xb491,
-	0xb491, 0xb491, 0xb491, 0xb491, 0xb491, 0xb491, 0xb491, 0xb4a3,
-	0xb4ae, 0xb491, 0xb4b0, 0xb4ae, 0xb491, 0xb491, 0xb491, 0xb491,
-	0xb491, 0xb4ae, 0xb4ae, 0xb491, 0xb491, 0xb491, 0xb491, 0xb491,
-	0xb491, 0xb491, 0xb491, 0xb4e0, 0xb4ae, 0xb491, 0xb4aa, 0xb491,
-	0xb491, 0xb491, 0xb4ab, 0xb491, 0xb491, 0xb491, 0xb4ae, 0xb4d7,
-	0xb491, 0x080c, 0x0dd5, 0x00d0, 0x2001, 0x000b, 0x0410, 0x2001,
-	0x0003, 0x00f8, 0x2001, 0x0005, 0x00e0, 0x2001, 0x0001, 0x00c8,
-	0x2001, 0x0009, 0x00b0, 0x080c, 0x9317, 0x6003, 0x0005, 0x080c,
-	0x941c, 0x0070, 0x0018, 0x0010, 0x080c, 0x631d, 0x0804, 0xb4f1,
-	0x080c, 0x9317, 0x080c, 0xcf30, 0x6003, 0x0004, 0x080c, 0x941c,
-	0x0005, 0x080c, 0x631d, 0x080c, 0x9317, 0x6003, 0x0002, 0x0036,
-	0x2019, 0x1852, 0x2304, 0x9084, 0xff00, 0x1120, 0x2001, 0x1984,
-	0x201c, 0x0040, 0x8007, 0x909a, 0x0004, 0x0ec0, 0x8003, 0x801b,
-	0x831b, 0x9318, 0x631a, 0x003e, 0x080c, 0x941c, 0x0c08, 0x080c,
-	0x9317, 0x080c, 0xcc8b, 0x080c, 0xab6b, 0x080c, 0x941c, 0x08c0,
-	0x00e6, 0x00f6, 0x2071, 0x189e, 0x2079, 0x0000, 0x080c, 0x3401,
-	0x00fe, 0x00ee, 0x080c, 0x9317, 0x080c, 0xab6b, 0x080c, 0x941c,
-	0x0838, 0x080c, 0x9317, 0x6003, 0x0002, 0x080c, 0xcf30, 0x0804,
-	0x941c, 0x2600, 0x2008, 0x0002, 0xb510, 0xb4f1, 0xb50e, 0xb4f1,
-	0xb4f1, 0xb50e, 0xb50e, 0xb50e, 0xb50e, 0xb4f1, 0xb50e, 0xb4f1,
-	0xb50e, 0xb4f1, 0xb50e, 0xb50e, 0xb50e, 0xb50e, 0x080c, 0x0dd5,
-	0x080c, 0x9317, 0x0096, 0x6014, 0x2048, 0x080c, 0x6a46, 0x009e,
-	0x080c, 0xab6b, 0x080c, 0x941c, 0x0005, 0x00e6, 0x0096, 0x0026,
-	0x0016, 0x080c, 0xc825, 0x0568, 0x6014, 0x2048, 0xa864, 0x9086,
-	0x0139, 0x11a8, 0xa894, 0x9086, 0x0056, 0x1148, 0x080c, 0x5260,
-	0x0130, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x0028, 0x2001,
-	0x0030, 0x900e, 0x2011, 0x4005, 0x080c, 0xcdf7, 0x0090, 0xa868,
-	0xd0fc, 0x0178, 0xa807, 0x0000, 0x0016, 0x6004, 0x908e, 0x0021,
-	0x0168, 0x908e, 0x003d, 0x0150, 0x001e, 0xa867, 0x0103, 0xa833,
-	0x0100, 0x001e, 0x002e, 0x009e, 0x00ee, 0x0005, 0x001e, 0x0009,
-	0x0cc0, 0x0096, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103,
-	0xa823, 0x8001, 0x009e, 0x0005, 0x00b6, 0x6610, 0x2658, 0xb804,
-	0x9084, 0x00ff, 0x90b2, 0x000c, 0x1a0c, 0x0dd5, 0x6604, 0x96b6,
-	0x004d, 0x1120, 0x080c, 0xcd17, 0x0804, 0xb5e9, 0x6604, 0x96b6,
-	0x0043, 0x1120, 0x080c, 0xcd60, 0x0804, 0xb5e9, 0x6604, 0x96b6,
-	0x004b, 0x1120, 0x080c, 0xcd8c, 0x0804, 0xb5e9, 0x6604, 0x96b6,
-	0x0033, 0x1120, 0x080c, 0xccad, 0x0804, 0xb5e9, 0x6604, 0x96b6,
-	0x0028, 0x1120, 0x080c, 0xca5d, 0x0804, 0xb5e9, 0x6604, 0x96b6,
-	0x0029, 0x1120, 0x080c, 0xca9e, 0x0804, 0xb5e9, 0x6604, 0x96b6,
-	0x001f, 0x1120, 0x080c, 0xaf44, 0x0804, 0xb5e9, 0x6604, 0x96b6,
-	0x0000, 0x1118, 0x080c, 0xb281, 0x04e0, 0x6604, 0x96b6, 0x0022,
-	0x1118, 0x080c, 0xaf7c, 0x04a8, 0x6604, 0x96b6, 0x0035, 0x1118,
-	0x080c, 0xb0a2, 0x0470, 0x6604, 0x96b6, 0x0039, 0x1118, 0x080c,
-	0xb216, 0x0438, 0x6604, 0x96b6, 0x003d, 0x1118, 0x080c, 0xafb4,
-	0x0400, 0x6604, 0x96b6, 0x0044, 0x1118, 0x080c, 0xaff0, 0x00c8,
-	0x6604, 0x96b6, 0x0049, 0x1118, 0x080c, 0xb031, 0x0090, 0x6604,
-	0x96b6, 0x0041, 0x1118, 0x080c, 0xb01b, 0x0058, 0x91b6, 0x0015,
-	0x1110, 0x0063, 0x0030, 0x91b6, 0x0016, 0x1128, 0x00be, 0x0804,
-	0xb843, 0x00be, 0x0005, 0x080c, 0xac01, 0x0cd8, 0xb606, 0xb609,
-	0xb606, 0xb650, 0xb606, 0xb7b7, 0xb850, 0xb606, 0xb606, 0xb819,
-	0xb606, 0xb82f, 0x0096, 0x601f, 0x0000, 0x6014, 0x2048, 0xa800,
-	0x2048, 0xa867, 0x0103, 0x009e, 0x0804, 0xab6b, 0xa001, 0xa001,
-	0x0005, 0x00e6, 0x2071, 0x1800, 0x7090, 0x9086, 0x0074, 0x1540,
-	0x080c, 0xdf8e, 0x11b0, 0x6010, 0x00b6, 0x2058, 0x7030, 0xd08c,
-	0x0128, 0xb800, 0xd0bc, 0x0110, 0xc0c5, 0xb802, 0x00f9, 0x00be,
-	0x2001, 0x0006, 0x080c, 0x631d, 0x080c, 0x3093, 0x080c, 0xab6b,
-	0x0098, 0x2001, 0x000a, 0x080c, 0x631d, 0x080c, 0x3093, 0x6003,
-	0x0001, 0x6007, 0x0001, 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0020,
-	0x2001, 0x0001, 0x080c, 0xb787, 0x00ee, 0x0005, 0x00d6, 0xb800,
-	0xd084, 0x0160, 0x9006, 0x080c, 0x6309, 0x2069, 0x1847, 0x6804,
-	0xd0a4, 0x0120, 0x2001, 0x0006, 0x080c, 0x6349, 0x00de, 0x0005,
-	0x00b6, 0x0096, 0x00d6, 0x2011, 0x1824, 0x2204, 0x9086, 0x0074,
-	0x1904, 0xb75e, 0x6010, 0x2058, 0xbaa0, 0x9286, 0x007e, 0x1120,
-	0x080c, 0xb99d, 0x0804, 0xb6c2, 0x080c, 0xb992, 0x6010, 0x2058,
-	0xbaa0, 0x9286, 0x0080, 0x1510, 0x6014, 0x9005, 0x01a8, 0x2048,
-	0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0000,
-	0x900e, 0x2011, 0x4000, 0x080c, 0xcdf7, 0x0030, 0xa807, 0x0000,
-	0xa867, 0x0103, 0xa833, 0x0200, 0x2001, 0x0006, 0x080c, 0x631d,
-	0x080c, 0x3093, 0x080c, 0xab6b, 0x0804, 0xb761, 0x080c, 0xb76f,
-	0x6014, 0x9005, 0x0190, 0x2048, 0xa868, 0xd0f4, 0x01e8, 0xa864,
-	0x9084, 0x00ff, 0x9086, 0x0039, 0x1d08, 0x2001, 0x0000, 0x900e,
-	0x2011, 0x4000, 0x080c, 0xcdf7, 0x08f8, 0x080c, 0xb765, 0x0160,
-	0x9006, 0x080c, 0x6309, 0x2001, 0x0004, 0x080c, 0x6349, 0x2001,
-	0x0007, 0x080c, 0x631d, 0x08a0, 0x2001, 0x0004, 0x080c, 0x631d,
-	0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x8ec7, 0x080c, 0x941c,
-	0x0804, 0xb761, 0xb85c, 0xd0e4, 0x01d8, 0x080c, 0xcc2d, 0x080c,
-	0x717d, 0x0118, 0xd0dc, 0x1904, 0xb684, 0x2011, 0x1837, 0x2204,
-	0xc0ad, 0x2012, 0x2001, 0x196d, 0x2004, 0x00f6, 0x2079, 0x0100,
-	0x78e3, 0x0000, 0x080c, 0x2764, 0x78e2, 0x00fe, 0x0804, 0xb684,
-	0x080c, 0xcc6a, 0x2011, 0x1837, 0x2204, 0xc0a5, 0x2012, 0x0006,
-	0x080c, 0xe113, 0x000e, 0x1904, 0xb684, 0xc0b5, 0x2012, 0x2001,
-	0x0006, 0x080c, 0x631d, 0x9006, 0x080c, 0x6309, 0x00c6, 0x2001,
-	0x180f, 0x2004, 0xd09c, 0x0520, 0x00f6, 0x2079, 0x0100, 0x00e6,
-	0x2071, 0x1800, 0x700c, 0x9084, 0x00ff, 0x78e6, 0x707e, 0x7010,
-	0x78ea, 0x7082, 0x908c, 0x00ff, 0x00ee, 0x780c, 0xc0b5, 0x780e,
-	0x00fe, 0x080c, 0x2739, 0x00f6, 0x2100, 0x900e, 0x080c, 0x26f0,
-	0x795e, 0x00fe, 0x9186, 0x0081, 0x01d8, 0x2009, 0x0081, 0x00c8,
-	0x2009, 0x00ef, 0x00f6, 0x2079, 0x0100, 0x79ea, 0x7932, 0x7936,
-	0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x2739, 0x00f6, 0x2079,
-	0x1800, 0x7982, 0x2100, 0x900e, 0x080c, 0x26f0, 0x795e, 0x00fe,
-	0x8108, 0x080c, 0x636c, 0x2b00, 0x00ce, 0x1904, 0xb684, 0x6012,
-	0x2009, 0x180f, 0x210c, 0xd19c, 0x0150, 0x2009, 0x027c, 0x210c,
-	0x918c, 0x00ff, 0xb912, 0x2009, 0x027d, 0x210c, 0xb916, 0x2001,
-	0x0002, 0x080c, 0x631d, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007,
-	0x0002, 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0018, 0x2001, 0x0001,
-	0x0431, 0x00de, 0x009e, 0x00be, 0x0005, 0x2001, 0x1810, 0x2004,
-	0xd0a4, 0x0120, 0x2001, 0x1848, 0x2004, 0xd0ac, 0x0005, 0x00e6,
-	0x080c, 0xe63d, 0x0190, 0x2071, 0x0260, 0x7108, 0x720c, 0x918c,
-	0x00ff, 0x1118, 0x9284, 0xff00, 0x0140, 0x6010, 0x2058, 0xb8a0,
-	0x9084, 0xff80, 0x1110, 0xb912, 0xba16, 0x00ee, 0x0005, 0x2030,
-	0x9005, 0x0158, 0x2001, 0x0007, 0x080c, 0x631d, 0x080c, 0x54cb,
-	0x1120, 0x2001, 0x0007, 0x080c, 0x6349, 0x2600, 0x9005, 0x11b0,
-	0x6014, 0x0096, 0x2048, 0xa868, 0x009e, 0xd0fc, 0x1178, 0x0036,
-	0x0046, 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0004,
-	0x2011, 0x8014, 0x080c, 0x48fb, 0x004e, 0x003e, 0x080c, 0x3093,
-	0x6020, 0x9086, 0x000a, 0x1108, 0x0005, 0x0804, 0xab6b, 0x00b6,
-	0x00e6, 0x0026, 0x0016, 0x2071, 0x1800, 0x7090, 0x9086, 0x0014,
-	0x1904, 0xb80f, 0x080c, 0x54cb, 0x1170, 0x6014, 0x9005, 0x1158,
-	0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021, 0x0006, 0x080c,
-	0x4ab2, 0x004e, 0x003e, 0x00d6, 0x6010, 0x2058, 0x080c, 0x6468,
-	0x080c, 0xb63e, 0x00de, 0x080c, 0xba63, 0x1588, 0x6010, 0x2058,
-	0xb890, 0x9005, 0x0560, 0x2001, 0x0006, 0x080c, 0x631d, 0x0096,
-	0x6014, 0x904d, 0x01d0, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039,
-	0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xcdf7,
-	0x0060, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0029, 0x0130, 0xa807,
-	0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x009e, 0x080c, 0x3093,
-	0x6020, 0x9086, 0x000a, 0x0140, 0x080c, 0xab6b, 0x0028, 0x080c,
-	0xb51d, 0x9006, 0x080c, 0xb787, 0x001e, 0x002e, 0x00ee, 0x00be,
-	0x0005, 0x2011, 0x1824, 0x2204, 0x9086, 0x0014, 0x1160, 0x2001,
-	0x0002, 0x080c, 0x631d, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c,
-	0x8ec7, 0x0804, 0x941c, 0x2001, 0x0001, 0x0804, 0xb787, 0x2030,
-	0x2011, 0x1824, 0x2204, 0x9086, 0x0004, 0x1148, 0x96b6, 0x000b,
-	0x1120, 0x2001, 0x0007, 0x080c, 0x631d, 0x0804, 0xab6b, 0x2001,
-	0x0001, 0x0804, 0xb787, 0x0002, 0xb606, 0xb85b, 0xb606, 0xb89c,
-	0xb606, 0xb949, 0xb850, 0xb606, 0xb606, 0xb95d, 0xb606, 0xb96f,
-	0x6604, 0x9686, 0x0003, 0x0904, 0xb7b7, 0x96b6, 0x001e, 0x1110,
-	0x080c, 0xab6b, 0x0005, 0x00b6, 0x00d6, 0x00c6, 0x080c, 0xb981,
-	0x11a0, 0x9006, 0x080c, 0x6309, 0x080c, 0x306e, 0x080c, 0xcf2d,
-	0x2001, 0x0002, 0x080c, 0x631d, 0x6003, 0x0001, 0x6007, 0x0002,
-	0x080c, 0x8ec7, 0x080c, 0x941c, 0x0418, 0x2009, 0x026e, 0x2104,
-	0x9086, 0x0009, 0x1160, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff,
-	0x9005, 0x0170, 0x8001, 0xb842, 0x601b, 0x000a, 0x0088, 0x2009,
-	0x026f, 0x2104, 0x9084, 0xff00, 0x9086, 0x1900, 0x1108, 0x08a0,
-	0x080c, 0x306e, 0x080c, 0xcf2d, 0x2001, 0x0001, 0x080c, 0xb787,
-	0x00ce, 0x00de, 0x00be, 0x0005, 0x0096, 0x00b6, 0x0026, 0x9016,
-	0x080c, 0xb98f, 0x00d6, 0x2069, 0x197c, 0x2d04, 0x9005, 0x0168,
-	0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, 0x1138, 0x2069, 0x1820,
-	0x2d04, 0x8000, 0x206a, 0x00de, 0x0010, 0x00de, 0x0088, 0x9006,
-	0x080c, 0x6309, 0x2001, 0x0002, 0x080c, 0x631d, 0x6003, 0x0001,
-	0x6007, 0x0002, 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0804, 0xb919,
-	0x080c, 0xc825, 0x01b0, 0x6014, 0x2048, 0xa864, 0x2010, 0x9086,
-	0x0139, 0x1138, 0x6007, 0x0016, 0x2001, 0x0002, 0x080c, 0xce51,
-	0x00b0, 0x6014, 0x2048, 0xa864, 0xd0fc, 0x0118, 0x2001, 0x0001,
-	0x0ca8, 0x2001, 0x180e, 0x2004, 0xd0dc, 0x0148, 0x6010, 0x2058,
-	0xb840, 0x9084, 0x00ff, 0x9005, 0x1110, 0x9006, 0x0c38, 0x080c,
-	0xb51d, 0x2009, 0x026e, 0x2134, 0x96b4, 0x00ff, 0x9686, 0x0005,
-	0x0520, 0x9686, 0x000b, 0x01c8, 0x2009, 0x026f, 0x2104, 0x9084,
-	0xff00, 0x1118, 0x9686, 0x0009, 0x01c0, 0x9086, 0x1900, 0x1168,
-	0x9686, 0x0009, 0x0190, 0x2001, 0x0004, 0x080c, 0x631d, 0x2001,
-	0x0028, 0x601a, 0x6007, 0x0052, 0x0020, 0x2001, 0x0001, 0x080c,
-	0xb787, 0x002e, 0x00be, 0x009e, 0x0005, 0x9286, 0x0139, 0x0160,
-	0x6014, 0x2048, 0x080c, 0xc825, 0x0140, 0xa864, 0x9086, 0x0139,
-	0x0118, 0xa868, 0xd0fc, 0x0108, 0x0c40, 0x6010, 0x2058, 0xb840,
-	0x9084, 0x00ff, 0x9005, 0x0138, 0x8001, 0xb842, 0x601b, 0x000a,
-	0x6007, 0x0016, 0x08f0, 0xb8a0, 0x9086, 0x007e, 0x1138, 0x00e6,
-	0x2071, 0x1800, 0x080c, 0x5d8b, 0x00ee, 0x0010, 0x080c, 0x306e,
-	0x0860, 0x080c, 0xb98f, 0x1160, 0x2001, 0x0004, 0x080c, 0x631d,
-	0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x8ec7, 0x0804, 0x941c,
-	0x080c, 0xb51d, 0x9006, 0x0804, 0xb787, 0x0489, 0x1160, 0x2001,
-	0x0008, 0x080c, 0x631d, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c,
-	0x8ec7, 0x0804, 0x941c, 0x2001, 0x0001, 0x0804, 0xb787, 0x00f9,
-	0x1160, 0x2001, 0x000a, 0x080c, 0x631d, 0x6003, 0x0001, 0x6007,
-	0x0001, 0x080c, 0x8ec7, 0x0804, 0x941c, 0x2001, 0x0001, 0x0804,
-	0xb787, 0x2009, 0x026e, 0x2104, 0x9086, 0x0003, 0x1138, 0x2009,
-	0x026f, 0x2104, 0x9084, 0xff00, 0x9086, 0x2a00, 0x0005, 0x9085,
-	0x0001, 0x0005, 0x00b6, 0x00c6, 0x0016, 0x6110, 0x2158, 0x080c,
-	0x63dc, 0x001e, 0x00ce, 0x00be, 0x0005, 0x00b6, 0x00f6, 0x00e6,
-	0x00d6, 0x0036, 0x0016, 0x6010, 0x2058, 0x2009, 0x1837, 0x2104,
-	0x9085, 0x0003, 0x200a, 0x080c, 0xba35, 0x0560, 0x2009, 0x1837,
-	0x2104, 0xc0cd, 0x200a, 0x080c, 0x6733, 0x0158, 0x9006, 0x2020,
-	0x2009, 0x002a, 0x080c, 0xe280, 0x2001, 0x180c, 0x200c, 0xc195,
-	0x2102, 0x2019, 0x002a, 0x2009, 0x0001, 0x080c, 0x3039, 0x00e6,
-	0x2071, 0x1800, 0x080c, 0x2e48, 0x00ee, 0x00c6, 0x0156, 0x20a9,
-	0x0781, 0x2009, 0x007f, 0x080c, 0x3166, 0x8108, 0x1f04, 0xb9d3,
-	0x015e, 0x00ce, 0x080c, 0xb992, 0x2071, 0x0260, 0x2079, 0x0200,
-	0x7817, 0x0001, 0x2001, 0x1837, 0x200c, 0xc1c5, 0x7018, 0xd0fc,
-	0x0110, 0xd0dc, 0x0118, 0x7038, 0xd0dc, 0x1108, 0xc1c4, 0x7817,
-	0x0000, 0x2001, 0x1837, 0x2102, 0x2079, 0x0100, 0x2e04, 0x9084,
-	0x00ff, 0x2069, 0x181f, 0x206a, 0x78e6, 0x0006, 0x8e70, 0x2e04,
-	0x2069, 0x1820, 0x206a, 0x78ea, 0x7832, 0x7836, 0x2010, 0x9084,
-	0xff00, 0x001e, 0x9105, 0x2009, 0x182c, 0x200a, 0x2200, 0x9084,
-	0x00ff, 0x2008, 0x080c, 0x2739, 0x080c, 0x717d, 0x0170, 0x2071,
-	0x0260, 0x2069, 0x1980, 0x7048, 0x206a, 0x704c, 0x6806, 0x7050,
-	0x680a, 0x7054, 0x680e, 0x080c, 0xcc2d, 0x0040, 0x2001, 0x0006,
-	0x080c, 0x631d, 0x080c, 0x3093, 0x080c, 0xab6b, 0x001e, 0x003e,
-	0x00de, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x0096, 0x0026, 0x0036,
-	0x00e6, 0x0156, 0x2019, 0x182c, 0x231c, 0x83ff, 0x01f0, 0x2071,
-	0x0260, 0x7200, 0x9294, 0x00ff, 0x7004, 0x9084, 0xff00, 0x9205,
-	0x9306, 0x1198, 0x2011, 0x0276, 0x20a9, 0x0004, 0x2b48, 0x2019,
-	0x000a, 0x080c, 0xbb27, 0x1148, 0x2011, 0x027a, 0x20a9, 0x0004,
-	0x2019, 0x0006, 0x080c, 0xbb27, 0x1100, 0x015e, 0x00ee, 0x003e,
-	0x002e, 0x009e, 0x0005, 0x00e6, 0x2071, 0x0260, 0x7034, 0x9086,
-	0x0014, 0x11a8, 0x7038, 0x9086, 0x0800, 0x1188, 0x703c, 0xd0ec,
-	0x0160, 0x9084, 0x0f00, 0x9086, 0x0100, 0x1138, 0x7054, 0xd0a4,
-	0x1110, 0xd0ac, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ee,
-	0x0005, 0x00e6, 0x0096, 0x00c6, 0x0076, 0x0056, 0x0046, 0x0026,
-	0x0006, 0x0126, 0x2091, 0x8000, 0x2029, 0x19ee, 0x252c, 0x2021,
-	0x19f4, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x7254, 0x7074,
-	0x9202, 0x1a04, 0xbaf3, 0x080c, 0x8710, 0x0904, 0xbaec, 0x080c,
-	0xe2ac, 0x0904, 0xbaec, 0x6720, 0x9786, 0x0007, 0x0904, 0xbaec,
-	0x2500, 0x9c06, 0x0904, 0xbaec, 0x2400, 0x9c06, 0x05e8, 0x3e08,
-	0x9186, 0x0002, 0x1148, 0x6010, 0x9005, 0x0130, 0x00b6, 0x2058,
-	0xb800, 0x00be, 0xd0bc, 0x1580, 0x00c6, 0x6000, 0x9086, 0x0004,
-	0x1110, 0x080c, 0x19b4, 0x9786, 0x000a, 0x0148, 0x080c, 0xca24,
-	0x1130, 0x00ce, 0x080c, 0xb51d, 0x080c, 0xab9c, 0x00e8, 0x6014,
-	0x2048, 0x080c, 0xc825, 0x01a8, 0x9786, 0x0003, 0x1530, 0xa867,
-	0x0103, 0xab7a, 0xa877, 0x0000, 0xa87c, 0xd0cc, 0x0130, 0x0096,
-	0xa878, 0x2048, 0x080c, 0x0fb2, 0x009e, 0x080c, 0x6a3a, 0x080c,
-	0xca07, 0x080c, 0xab9c, 0x00ce, 0x9ce0, 0x0018, 0x7068, 0x9c02,
-	0x1210, 0x0804, 0xba96, 0x012e, 0x000e, 0x002e, 0x004e, 0x005e,
-	0x007e, 0x00ce, 0x009e, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1118,
-	0x080c, 0xe223, 0x0c30, 0x9786, 0x0009, 0x1148, 0x6000, 0x9086,
-	0x0004, 0x0d08, 0x2009, 0x004c, 0x080c, 0xabe6, 0x08e0, 0x9786,
-	0x000a, 0x0938, 0x0820, 0x220c, 0x2304, 0x9106, 0x1130, 0x8210,
-	0x8318, 0x1f04, 0xbb13, 0x9006, 0x0005, 0x2304, 0x9102, 0x0218,
-	0x2001, 0x0001, 0x0008, 0x9006, 0x918d, 0x0001, 0x0005, 0x0136,
-	0x01c6, 0x0016, 0x8906, 0x8006, 0x8007, 0x908c, 0x003f, 0x21e0,
-	0x9084, 0xffc0, 0x9300, 0x2098, 0x3518, 0x20a9, 0x0001, 0x220c,
-	0x4002, 0x910e, 0x1140, 0x8210, 0x8319, 0x1dc8, 0x9006, 0x001e,
-	0x01ce, 0x013e, 0x0005, 0x220c, 0x9102, 0x0218, 0x2001, 0x0001,
-	0x0010, 0x2001, 0x0000, 0x918d, 0x0001, 0x001e, 0x01ce, 0x013e,
-	0x0005, 0x220c, 0x810f, 0x2304, 0x9106, 0x1130, 0x8210, 0x8318,
-	0x1f04, 0xbb51, 0x9006, 0x0005, 0x918d, 0x0001, 0x0005, 0x6004,
-	0x908a, 0x0053, 0x1a0c, 0x0dd5, 0x080c, 0xca13, 0x0120, 0x080c,
-	0xca24, 0x0168, 0x0028, 0x080c, 0x3093, 0x080c, 0xca24, 0x0138,
-	0x080c, 0x9317, 0x080c, 0xab6b, 0x080c, 0x941c, 0x0005, 0x080c,
-	0xb51d, 0x0cb0, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208,
-	0x000a, 0x0005, 0xbb96, 0xbb96, 0xbb96, 0xbb96, 0xbb96, 0xbb96,
-	0xbb96, 0xbb96, 0xbb96, 0xbb96, 0xbb96, 0xbb98, 0xbb98, 0xbb98,
-	0xbb98, 0xbb96, 0xbb96, 0xbb96, 0xbb98, 0xbb96, 0x080c, 0x0dd5,
-	0x600b, 0xffff, 0x6003, 0x0001, 0x6106, 0x080c, 0x8e7f, 0x0126,
-	0x2091, 0x8000, 0x080c, 0x941c, 0x012e, 0x0005, 0x9186, 0x0013,
-	0x1128, 0x6004, 0x9082, 0x0040, 0x0804, 0xbc4d, 0x9186, 0x0027,
-	0x1520, 0x080c, 0x9317, 0x080c, 0x306e, 0x080c, 0xcf2d, 0x0096,
-	0x6114, 0x2148, 0x080c, 0xc825, 0x0198, 0x080c, 0xca24, 0x1118,
-	0x080c, 0xb51d, 0x0068, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877,
-	0x0000, 0xa97c, 0xc1c5, 0xa97e, 0x080c, 0x6a46, 0x080c, 0xca07,
-	0x009e, 0x080c, 0xab6b, 0x0804, 0x941c, 0x9186, 0x0014, 0x1120,
-	0x6004, 0x9082, 0x0040, 0x04a0, 0x9186, 0x0046, 0x0150, 0x9186,
-	0x0045, 0x0138, 0x9186, 0x0053, 0x0120, 0x9186, 0x0048, 0x190c,
-	0x0dd5, 0x2001, 0x0109, 0x2004, 0xd084, 0x0508, 0x0126, 0x2091,
-	0x2800, 0x0006, 0x0016, 0x0026, 0x0036, 0x00f6, 0x00e6, 0x00c6,
-	0x2079, 0x19e5, 0x2071, 0x1800, 0x2061, 0x0100, 0x080c, 0x8d64,
-	0x00ce, 0x00ee, 0x00fe, 0x003e, 0x002e, 0x001e, 0x000e, 0x012e,
-	0xa001, 0x6000, 0x9086, 0x0002, 0x1110, 0x0804, 0xbc8b, 0x0005,
-	0x0002, 0xbc27, 0xbc25, 0xbc25, 0xbc25, 0xbc25, 0xbc25, 0xbc25,
-	0xbc25, 0xbc25, 0xbc25, 0xbc25, 0xbc42, 0xbc42, 0xbc42, 0xbc42,
-	0xbc25, 0xbc42, 0xbc25, 0xbc42, 0xbc25, 0x080c, 0x0dd5, 0x080c,
-	0x9317, 0x0096, 0x6114, 0x2148, 0x080c, 0xc825, 0x0168, 0xa867,
-	0x0103, 0xa87b, 0x0006, 0xa877, 0x0000, 0xa880, 0xc0ec, 0xa882,
-	0x080c, 0x6a46, 0x080c, 0xca07, 0x009e, 0x080c, 0xab6b, 0x080c,
-	0x941c, 0x0005, 0x080c, 0x9317, 0x080c, 0xca24, 0x090c, 0xb51d,
-	0x080c, 0xab6b, 0x080c, 0x941c, 0x0005, 0x0002, 0xbc64, 0xbc62,
-	0xbc62, 0xbc62, 0xbc62, 0xbc62, 0xbc62, 0xbc62, 0xbc62, 0xbc62,
-	0xbc62, 0xbc7b, 0xbc7b, 0xbc7b, 0xbc7b, 0xbc62, 0xbc85, 0xbc62,
-	0xbc7b, 0xbc62, 0x080c, 0x0dd5, 0x0096, 0x080c, 0x9317, 0x6014,
-	0x2048, 0x2001, 0x1986, 0x2004, 0x6042, 0xa97c, 0xd1ac, 0x0140,
-	0x6003, 0x0004, 0xa87c, 0x9085, 0x0400, 0xa87e, 0x009e, 0x0005,
-	0x6003, 0x0002, 0x0cb8, 0x080c, 0x9317, 0x080c, 0xcf30, 0x080c,
-	0xcf35, 0x6003, 0x000f, 0x0804, 0x941c, 0x080c, 0x9317, 0x080c,
-	0xab6b, 0x0804, 0x941c, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040,
-	0x0208, 0x000a, 0x0005, 0xbca7, 0xbca7, 0xbca7, 0xbca7, 0xbca7,
-	0xbca9, 0xbd86, 0xbca7, 0xbdba, 0xbca7, 0xbca7, 0xbca7, 0xbca7,
-	0xbca7, 0xbca7, 0xbca7, 0xbca7, 0xbca7, 0xbca7, 0xbdba, 0x080c,
-	0x0dd5, 0x00b6, 0x0096, 0x6114, 0x2148, 0x7644, 0x96b4, 0x0fff,
-	0x86ff, 0x1528, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xbd75,
-	0xa87b, 0x0000, 0xa867, 0x0103, 0xae76, 0xa87c, 0xd0ac, 0x0128,
-	0xa834, 0xa938, 0x9115, 0x190c, 0xbf4f, 0x080c, 0x6862, 0x6210,
-	0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0x7044, 0xd0e4,
-	0x1904, 0xbd59, 0x080c, 0xab6b, 0x009e, 0x00be, 0x0005, 0x968c,
-	0x0c00, 0x0150, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xbd5d,
-	0x7348, 0xab92, 0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002,
-	0x0508, 0x9186, 0x0028, 0x1118, 0xa87b, 0x001c, 0x00e8, 0xd6dc,
-	0x01a0, 0xa87b, 0x0015, 0xa87c, 0xd0ac, 0x0170, 0xa938, 0xaa34,
-	0x2100, 0x9205, 0x0148, 0x7048, 0x9106, 0x1118, 0x704c, 0x9206,
-	0x0118, 0xa992, 0xaa8e, 0xc6dc, 0x0038, 0xd6d4, 0x0118, 0xa87b,
-	0x0007, 0x0010, 0xa87b, 0x0000, 0xa867, 0x0103, 0xae76, 0x901e,
-	0xd6c4, 0x01d8, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118,
-	0xc6c4, 0x0804, 0xbcb0, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a,
-	0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0x0018,
-	0x2011, 0x0025, 0x080c, 0xc43a, 0x003e, 0xd6cc, 0x0904, 0xbcc5,
-	0x7154, 0xa98a, 0x81ff, 0x0904, 0xbcc5, 0x9192, 0x0021, 0x1278,
-	0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xc43a, 0x2011,
-	0x0205, 0x2013, 0x0000, 0x080c, 0xcebd, 0x0804, 0xbcc5, 0xa868,
-	0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c50, 0x00a6, 0x2950,
-	0x080c, 0xc3d9, 0x00ae, 0x080c, 0xcebd, 0x080c, 0xc42a, 0x0804,
-	0xbcc7, 0x080c, 0xcb17, 0x0804, 0xbcd4, 0xa87c, 0xd0ac, 0x0904,
-	0xbce0, 0xa880, 0xd0bc, 0x1904, 0xbce0, 0x7348, 0xa838, 0x9306,
-	0x11c8, 0x734c, 0xa834, 0x931e, 0x0904, 0xbce0, 0xd6d4, 0x0190,
-	0xab38, 0x9305, 0x0904, 0xbce0, 0x0068, 0xa87c, 0xd0ac, 0x0904,
-	0xbcb8, 0xa838, 0xa934, 0x9105, 0x0904, 0xbcb8, 0xa880, 0xd0bc,
-	0x1904, 0xbcb8, 0x080c, 0xcb51, 0x0804, 0xbcd4, 0x0096, 0x00f6,
-	0x6003, 0x0003, 0x6007, 0x0043, 0x2079, 0x026c, 0x7c04, 0x7b00,
-	0x7e0c, 0x7d08, 0x6014, 0x2048, 0xa87c, 0xd0ac, 0x0140, 0x6003,
-	0x0002, 0x00fe, 0x009e, 0x0005, 0x2130, 0x2228, 0x0058, 0x2400,
-	0xa9ac, 0x910a, 0x2300, 0xaab0, 0x9213, 0x2600, 0x9102, 0x2500,
-	0x9203, 0x0e90, 0xac36, 0xab3a, 0xae46, 0xad4a, 0x00fe, 0x6043,
-	0x0000, 0x2c10, 0x080c, 0x1b03, 0x080c, 0x8ee4, 0x080c, 0x9548,
-	0x009e, 0x0005, 0x0005, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040,
-	0x0208, 0x000a, 0x0005, 0xbdd7, 0xbdd7, 0xbdd7, 0xbdd7, 0xbdd7,
-	0xbdd9, 0xbe6f, 0xbdd7, 0xbdd7, 0xbe86, 0xbf12, 0xbdd7, 0xbdd7,
-	0xbdd7, 0xbdd7, 0xbf27, 0xbdd7, 0xbdd7, 0xbdd7, 0xbdd7, 0x080c,
-	0x0dd5, 0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260, 0x6114,
-	0x2150, 0x7644, 0xb676, 0x96b4, 0x0fff, 0xb77c, 0xc7e5, 0xb77e,
-	0x6210, 0x00b6, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e,
-	0x00be, 0x86ff, 0x0904, 0xbe6a, 0x9694, 0xff00, 0x9284, 0x0c00,
-	0x0120, 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904,
-	0xbe6a, 0x080c, 0x1000, 0x090c, 0x0dd5, 0x2900, 0xb07a, 0xb77c,
-	0xc7cd, 0xb77e, 0xa867, 0x0103, 0xb068, 0xa86a, 0xb06c, 0xa86e,
-	0xb070, 0xa872, 0xae76, 0x968c, 0x0c00, 0x0120, 0x7348, 0xab92,
-	0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0180, 0x9186,
-	0x0028, 0x1118, 0xa87b, 0x001c, 0x0060, 0xd6dc, 0x0118, 0xa87b,
-	0x0015, 0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b,
-	0x0000, 0xaf7e, 0xb080, 0xa882, 0xb084, 0xa886, 0x901e, 0xd6c4,
-	0x0190, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210,
-	0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025,
-	0x080c, 0xc43a, 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff,
-	0x01c8, 0x9192, 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011,
-	0x0029, 0x080c, 0xc43a, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050,
-	0xb068, 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950,
-	0x080c, 0xc3d9, 0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005, 0x00f6,
-	0x00a6, 0x6003, 0x0003, 0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c,
-	0x7d08, 0x6014, 0x2050, 0xb436, 0xb33a, 0xb646, 0xb54a, 0x00ae,
-	0x00fe, 0x2c10, 0x080c, 0x1b03, 0x0804, 0x9fc9, 0x6003, 0x0002,
-	0x6004, 0x9086, 0x0040, 0x11c8, 0x0096, 0x6014, 0x2048, 0xa87c,
-	0xd0ac, 0x0160, 0x601c, 0xd084, 0x1130, 0x00f6, 0x2c00, 0x2078,
-	0x080c, 0x1689, 0x00fe, 0x6003, 0x0004, 0x0010, 0x6003, 0x0002,
-	0x009e, 0x080c, 0x9317, 0x080c, 0x941c, 0x0096, 0x2001, 0x1986,
-	0x2004, 0x6042, 0x080c, 0x93cc, 0x080c, 0x9548, 0x6114, 0x2148,
-	0xa97c, 0xd1e4, 0x0904, 0xbf0d, 0xd1cc, 0x05a8, 0xa978, 0xa868,
-	0xd0fc, 0x0538, 0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, 0xa860,
-	0x20e8, 0xa85c, 0x9080, 0x0019, 0x20a0, 0x810e, 0x810e, 0x810f,
-	0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0019, 0x2098,
-	0x0156, 0x20a9, 0x0020, 0x4003, 0x015e, 0x000e, 0xa882, 0x000e,
-	0xa87e, 0x001e, 0xa874, 0x0006, 0x2148, 0x080c, 0x0fb2, 0x001e,
-	0x0440, 0x0016, 0x080c, 0x0fb2, 0x009e, 0xa974, 0x0016, 0x080c,
-	0xc42a, 0x001e, 0x00f0, 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff,
-	0x90b6, 0x0002, 0x0180, 0x9086, 0x0028, 0x1118, 0xa87b, 0x001c,
-	0x0060, 0xd1dc, 0x0118, 0xa87b, 0x0015, 0x0038, 0xd1d4, 0x0118,
-	0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, 0x0016, 0x080c, 0x6862,
-	0x001e, 0xd1e4, 0x1120, 0x080c, 0xab6b, 0x009e, 0x0005, 0x080c,
-	0xcb17, 0x0cd8, 0x6004, 0x9086, 0x0040, 0x1120, 0x080c, 0x9317,
-	0x080c, 0x941c, 0x2019, 0x0001, 0x080c, 0xa2ac, 0x6003, 0x0002,
-	0x080c, 0xcf35, 0x080c, 0x93cc, 0x080c, 0x9548, 0x0005, 0x6004,
-	0x9086, 0x0040, 0x1120, 0x080c, 0x9317, 0x080c, 0x941c, 0x2019,
-	0x0001, 0x080c, 0xa2ac, 0x080c, 0x93cc, 0x080c, 0x306e, 0x080c,
-	0xcf2d, 0x0096, 0x6114, 0x2148, 0x080c, 0xc825, 0x0150, 0xa867,
-	0x0103, 0xa87b, 0x0029, 0xa877, 0x0000, 0x080c, 0x6a46, 0x080c,
-	0xca07, 0x009e, 0x080c, 0xab6b, 0x080c, 0x9548, 0x0005, 0xa87b,
-	0x0015, 0xd1fc, 0x0180, 0xa87b, 0x0007, 0x8002, 0x8000, 0x810a,
-	0x9189, 0x0000, 0x0006, 0x0016, 0x2009, 0x1a77, 0x2104, 0x8000,
-	0x200a, 0x001e, 0x000e, 0xa992, 0xa88e, 0x0005, 0x9182, 0x0054,
-	0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xbf82, 0xbf82,
-	0xbf82, 0xbf82, 0xbf82, 0xbf84, 0xbf82, 0xbf82, 0xc02a, 0xbf82,
-	0xbf82, 0xbf82, 0xbf82, 0xbf82, 0xbf82, 0xbf82, 0xbf82, 0xbf82,
-	0xbf82, 0xc15b, 0x080c, 0x0dd5, 0x0076, 0x00a6, 0x00e6, 0x0096,
-	0x2071, 0x0260, 0x6114, 0x2150, 0x7644, 0xb676, 0x96b4, 0x0fff,
-	0xb77c, 0xc7e5, 0xb77e, 0x6210, 0x00b6, 0x2258, 0xba3c, 0x82ff,
-	0x0110, 0x8211, 0xba3e, 0x00be, 0x86ff, 0x0904, 0xc023, 0x9694,
-	0xff00, 0x9284, 0x0c00, 0x0120, 0x7048, 0xb092, 0x704c, 0xb08e,
-	0x9284, 0x0300, 0x0904, 0xc023, 0x9686, 0x0100, 0x1130, 0x7064,
-	0x9005, 0x1118, 0xc6c4, 0xb676, 0x0c38, 0x080c, 0x1000, 0x090c,
-	0x0dd5, 0x2900, 0xb07a, 0xb77c, 0x97bd, 0x0200, 0xb77e, 0xa867,
-	0x0103, 0xb068, 0xa86a, 0xb06c, 0xa86e, 0xb070, 0xa872, 0x7044,
-	0x9084, 0xf000, 0x9635, 0xae76, 0x968c, 0x0c00, 0x0120, 0x7348,
-	0xab92, 0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0180,
-	0x9186, 0x0028, 0x1118, 0xa87b, 0x001c, 0x0060, 0xd6dc, 0x0118,
-	0xa87b, 0x0015, 0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010,
-	0xa87b, 0x0000, 0xaf7e, 0xb080, 0xa882, 0xb084, 0xa886, 0x901e,
-	0xd6c4, 0x0190, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009,
-	0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, 0x2011,
-	0x0025, 0x080c, 0xc43a, 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a,
-	0x81ff, 0x01c8, 0x9192, 0x0021, 0x1260, 0x8304, 0x9098, 0x0018,
-	0x2011, 0x0029, 0x080c, 0xc43a, 0x2011, 0x0205, 0x2013, 0x0000,
-	0x0050, 0xb068, 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68,
-	0x2950, 0x080c, 0xc3d9, 0x080c, 0x1992, 0x009e, 0x00ee, 0x00ae,
-	0x007e, 0x0005, 0x2001, 0x1986, 0x2004, 0x6042, 0x0096, 0x6114,
-	0x2148, 0xa83c, 0xa940, 0x9105, 0x1118, 0xa87c, 0xc0dc, 0xa87e,
-	0x6003, 0x0002, 0xa97c, 0xd1e4, 0x0904, 0xc156, 0x6043, 0x0000,
-	0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1500, 0xd1cc,
-	0x0904, 0xc125, 0xa978, 0xa868, 0xd0fc, 0x0904, 0xc0e6, 0x0016,
-	0xa87c, 0x0006, 0xa880, 0x0006, 0x00a6, 0x2150, 0xb174, 0x9184,
-	0x00ff, 0x90b6, 0x0002, 0x0904, 0xc0b4, 0x9086, 0x0028, 0x1904,
-	0xc0a0, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x0804, 0xc0bc, 0x6024,
-	0xd0f4, 0x11d0, 0xa838, 0xaa34, 0x9205, 0x09c8, 0xa838, 0xaa90,
-	0x9206, 0x1120, 0xa88c, 0xaa34, 0x9206, 0x0988, 0x6024, 0xd0d4,
-	0x1148, 0xa9ac, 0xa834, 0x9102, 0x603a, 0xa9b0, 0xa838, 0x9103,
-	0x603e, 0x6024, 0xc0f5, 0x6026, 0x6010, 0x00b6, 0x2058, 0xb83c,
-	0x8000, 0xb83e, 0x00be, 0x9006, 0xa876, 0xa892, 0xa88e, 0xa87c,
-	0xc0e4, 0xa87e, 0xd0cc, 0x0140, 0xc0cc, 0xa87e, 0x0096, 0xa878,
-	0x2048, 0x080c, 0x0fb2, 0x009e, 0x080c, 0xcb51, 0x0804, 0xc156,
-	0xd1dc, 0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xcde0,
-	0x0118, 0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b,
-	0x0007, 0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834,
-	0xa938, 0x9115, 0x190c, 0xbf4f, 0xa87c, 0xb07e, 0xa890, 0xb092,
-	0xa88c, 0xb08e, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0019, 0x20a0,
-	0x20a9, 0x0020, 0x8a06, 0x8006, 0x8007, 0x9094, 0x003f, 0x22e0,
-	0x9084, 0xffc0, 0x9080, 0x0019, 0x2098, 0x4003, 0x00ae, 0x000e,
-	0xa882, 0x000e, 0xa87e, 0x080c, 0xcebd, 0x001e, 0xa874, 0x0006,
-	0x2148, 0x080c, 0x0fb2, 0x001e, 0x0804, 0xc152, 0x0016, 0x00a6,
-	0x2150, 0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01e0, 0x9086,
-	0x0028, 0x1128, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x00e0, 0xd1dc,
-	0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xcde0, 0x0118,
-	0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007,
-	0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938,
-	0x9115, 0x190c, 0xbf4f, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa87c,
-	0xb07e, 0x00ae, 0x080c, 0x0fb2, 0x009e, 0x080c, 0xcebd, 0xa974,
-	0x0016, 0x080c, 0xc42a, 0x001e, 0x0468, 0xa867, 0x0103, 0xa974,
-	0x9184, 0x00ff, 0x90b6, 0x0002, 0x01b0, 0x9086, 0x0028, 0x1118,
-	0xa87b, 0x001c, 0x00d0, 0xd1dc, 0x0148, 0xa87b, 0x0015, 0x080c,
-	0xcde0, 0x0118, 0xa974, 0xc1dc, 0xa976, 0x0078, 0xd1d4, 0x0118,
-	0xa87b, 0x0007, 0x0050, 0xa87b, 0x0000, 0xa87c, 0xd0ac, 0x0128,
-	0xa834, 0xa938, 0x9115, 0x190c, 0xbf4f, 0xa974, 0x0016, 0x080c,
-	0x6862, 0x001e, 0xd1e4, 0x1120, 0x080c, 0xab6b, 0x009e, 0x0005,
-	0x080c, 0xcb17, 0x0cd8, 0x6114, 0x0096, 0x2148, 0xa97c, 0xd1e4,
-	0x190c, 0x19a0, 0x009e, 0x0005, 0x080c, 0x9317, 0x0010, 0x080c,
-	0x93cc, 0x080c, 0xc825, 0x01f0, 0x0096, 0x6114, 0x2148, 0x080c,
-	0xca24, 0x1118, 0x080c, 0xb51d, 0x00a0, 0xa867, 0x0103, 0x2009,
-	0x180c, 0x210c, 0xd18c, 0x11b8, 0xd184, 0x1190, 0x6108, 0xa97a,
-	0x918e, 0x0029, 0x1110, 0x080c, 0xe5d5, 0xa877, 0x0000, 0x080c,
-	0x6a46, 0x009e, 0x080c, 0xab6b, 0x080c, 0x941c, 0x0804, 0x9548,
-	0xa87b, 0x0004, 0x0c90, 0xa87b, 0x0004, 0x0c78, 0x9182, 0x0054,
-	0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xc1b2, 0xc1b2,
-	0xc1b2, 0xc1b2, 0xc1b2, 0xc1b4, 0xc1b2, 0xc1b2, 0xc1b2, 0xc1b2,
-	0xc1b2, 0xc1b2, 0xc1b2, 0xc1b2, 0xc1b2, 0xc1b2, 0xc1b2, 0xc1b2,
-	0xc1b2, 0xc1b2, 0x080c, 0x0dd5, 0x080c, 0x54bf, 0x01f8, 0x6014,
-	0x7144, 0x918c, 0x0fff, 0x9016, 0xd1c4, 0x0118, 0x7264, 0x9294,
-	0x00ff, 0x0096, 0x904d, 0x0188, 0xa87b, 0x0000, 0xa864, 0x9086,
-	0x0139, 0x0128, 0xa867, 0x0103, 0xa976, 0xaa96, 0x0030, 0xa897,
-	0x4000, 0xa99a, 0xaa9e, 0x080c, 0x6a46, 0x009e, 0x0804, 0xab6b,
-	0x9182, 0x0085, 0x0002, 0xc1ea, 0xc1e8, 0xc1e8, 0xc1f6, 0xc1e8,
-	0xc1e8, 0xc1e8, 0xc1e8, 0xc1e8, 0xc1e8, 0xc1e8, 0xc1e8, 0xc1e8,
-	0x080c, 0x0dd5, 0x6003, 0x0001, 0x6106, 0x080c, 0x8e7f, 0x0126,
-	0x2091, 0x8000, 0x080c, 0x941c, 0x012e, 0x0005, 0x0026, 0x0056,
-	0x00d6, 0x00e6, 0x2071, 0x0260, 0x7224, 0x6216, 0x7220, 0x080c,
-	0xc813, 0x01a0, 0x2268, 0x6800, 0x9086, 0x0000, 0x0178, 0x6010,
-	0x6d10, 0x952e, 0x1158, 0x00c6, 0x2d60, 0x080c, 0xc465, 0x00ce,
-	0x0128, 0x6803, 0x0002, 0x6007, 0x0086, 0x0010, 0x6007, 0x0087,
-	0x6003, 0x0001, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x9280, 0x0004,
-	0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0140, 0x6824, 0xd0ec,
-	0x0128, 0x00c6, 0x2260, 0x080c, 0xcb51, 0x00ce, 0x00ee, 0x00de,
-	0x005e, 0x002e, 0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a,
-	0x0085, 0x0a0c, 0x0dd5, 0x908a, 0x0092, 0x1a0c, 0x0dd5, 0x9082,
-	0x0085, 0x00e2, 0x9186, 0x0027, 0x0120, 0x9186, 0x0014, 0x190c,
-	0x0dd5, 0x080c, 0x9317, 0x0096, 0x6014, 0x2048, 0x080c, 0xc825,
-	0x0140, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c,
-	0x6a46, 0x009e, 0x080c, 0xab9c, 0x0804, 0x941c, 0xc26b, 0xc26d,
-	0xc26d, 0xc26b, 0xc26b, 0xc26b, 0xc26b, 0xc26b, 0xc26b, 0xc26b,
-	0xc26b, 0xc26b, 0xc26b, 0x080c, 0x0dd5, 0x080c, 0x9317, 0x080c,
-	0xab9c, 0x080c, 0x941c, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004,
-	0x9082, 0x0085, 0x2008, 0x04b8, 0x9186, 0x0027, 0x11f8, 0x080c,
-	0x9317, 0x080c, 0x306e, 0x080c, 0xcf2d, 0x0096, 0x6014, 0x2048,
-	0x080c, 0xc825, 0x0150, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b,
-	0x0029, 0x080c, 0x6a46, 0x080c, 0xca07, 0x009e, 0x080c, 0xab6b,
-	0x080c, 0x941c, 0x0005, 0x080c, 0xac01, 0x0ce0, 0x9186, 0x0014,
-	0x1dd0, 0x080c, 0x9317, 0x0096, 0x6014, 0x2048, 0x080c, 0xc825,
-	0x0d60, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0006, 0xa880,
-	0xc0ec, 0xa882, 0x08f0, 0x0002, 0xc2c3, 0xc2c1, 0xc2c1, 0xc2c1,
-	0xc2c1, 0xc2c1, 0xc2db, 0xc2c1, 0xc2c1, 0xc2c1, 0xc2c1, 0xc2c1,
-	0xc2c1, 0x080c, 0x0dd5, 0x080c, 0x9317, 0x6034, 0x908c, 0xff00,
-	0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001,
-	0x1984, 0x0010, 0x2001, 0x1985, 0x2004, 0x601a, 0x6003, 0x000c,
-	0x080c, 0x941c, 0x0005, 0x080c, 0x9317, 0x6034, 0x908c, 0xff00,
-	0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001,
-	0x1984, 0x0010, 0x2001, 0x1985, 0x2004, 0x601a, 0x6003, 0x000e,
-	0x080c, 0x941c, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085,
-	0x0208, 0x0012, 0x0804, 0xac01, 0xc309, 0xc309, 0xc309, 0xc309,
-	0xc30b, 0xc358, 0xc309, 0xc309, 0xc309, 0xc309, 0xc309, 0xc309,
-	0xc309, 0x080c, 0x0dd5, 0x0096, 0x6010, 0x00b6, 0x2058, 0xb800,
-	0x00be, 0xd0bc, 0x0168, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186,
-	0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x009e, 0x0804, 0xc36c,
-	0x080c, 0xc825, 0x1118, 0x080c, 0xca07, 0x0068, 0x6014, 0x2048,
-	0xa87c, 0xd0e4, 0x1110, 0x080c, 0xca07, 0xa867, 0x0103, 0x080c,
-	0xcef8, 0x080c, 0x6a46, 0x00d6, 0x2c68, 0x080c, 0xab15, 0x01d0,
-	0x6003, 0x0001, 0x6007, 0x001e, 0x600b, 0xffff, 0x2009, 0x026e,
-	0x210c, 0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x6910, 0x6112,
-	0x080c, 0xcc93, 0x6954, 0x6156, 0x6023, 0x0001, 0x080c, 0x8e7f,
-	0x080c, 0x941c, 0x2d60, 0x00de, 0x080c, 0xab6b, 0x009e, 0x0005,
-	0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x05a0, 0x6034,
-	0x908c, 0xff00, 0x810f, 0x9186, 0x0035, 0x0130, 0x9186, 0x001e,
-	0x0118, 0x9186, 0x0039, 0x1538, 0x00d6, 0x2c68, 0x080c, 0xce90,
-	0x11f0, 0x080c, 0xab15, 0x01d8, 0x6106, 0x6003, 0x0001, 0x6023,
-	0x0001, 0x6910, 0x6112, 0x692c, 0x612e, 0x6930, 0x6132, 0x6934,
-	0x918c, 0x00ff, 0x6136, 0x6938, 0x613a, 0x693c, 0x613e, 0x6954,
-	0x6156, 0x080c, 0xcc93, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x2d60,
-	0x00de, 0x0804, 0xab6b, 0x0096, 0x6014, 0x2048, 0x080c, 0xc825,
-	0x01c8, 0xa867, 0x0103, 0xa880, 0xd0b4, 0x0128, 0xc0ec, 0xa882,
-	0xa87b, 0x0006, 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020,
-	0xa87b, 0x0005, 0x080c, 0xcb13, 0xa877, 0x0000, 0x080c, 0x6a46,
-	0x080c, 0xca07, 0x009e, 0x0804, 0xab6b, 0x0016, 0x0096, 0x6014,
-	0x2048, 0x080c, 0xc825, 0x0140, 0xa867, 0x0103, 0xa87b, 0x0028,
-	0xa877, 0x0000, 0x080c, 0x6a46, 0x009e, 0x001e, 0x9186, 0x0013,
-	0x0148, 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c,
-	0xac01, 0x0030, 0x080c, 0x9317, 0x080c, 0xab9c, 0x080c, 0x941c,
-	0x0005, 0x0056, 0x0066, 0x0096, 0x00a6, 0x2029, 0x0001, 0x9182,
-	0x0101, 0x1208, 0x0010, 0x2009, 0x0100, 0x2130, 0x8304, 0x9098,
-	0x0018, 0x2009, 0x0020, 0x2011, 0x0029, 0x080c, 0xc43a, 0x96b2,
-	0x0020, 0xb004, 0x904d, 0x0110, 0x080c, 0x0fb2, 0x080c, 0x1000,
-	0x0520, 0x8528, 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, 0xb406,
-	0x968a, 0x003d, 0x1228, 0x2608, 0x2011, 0x001b, 0x0499, 0x00a8,
-	0x96b2, 0x003c, 0x2009, 0x003c, 0x2950, 0x2011, 0x001b, 0x0451,
-	0x0c28, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad,
-	0x0003, 0xb566, 0x95ac, 0x0000, 0x0048, 0x2001, 0x0205, 0x2003,
-	0x0000, 0x00ae, 0x852f, 0x95ad, 0x0003, 0xb566, 0x009e, 0x006e,
-	0x005e, 0x0005, 0x00a6, 0x89ff, 0x0158, 0xa804, 0x9055, 0x0130,
-	0xa807, 0x0000, 0x080c, 0x6a46, 0x2a48, 0x0cb8, 0x080c, 0x6a46,
-	0x00ae, 0x0005, 0x00f6, 0x2079, 0x0200, 0x7814, 0x9085, 0x0080,
-	0x7816, 0xd184, 0x0108, 0x8108, 0x810c, 0x20a9, 0x0001, 0xa860,
-	0x20e8, 0xa85c, 0x9200, 0x20a0, 0x20e1, 0x0000, 0x2300, 0x9e00,
-	0x2098, 0x4003, 0x8318, 0x9386, 0x0020, 0x1148, 0x2018, 0x2300,
-	0x9e00, 0x2098, 0x7814, 0x8000, 0x9085, 0x0080, 0x7816, 0x8109,
-	0x1d80, 0x7817, 0x0000, 0x00fe, 0x0005, 0x0066, 0x0126, 0x2091,
-	0x8000, 0x2031, 0x0001, 0x6020, 0x9084, 0x000f, 0x0083, 0x012e,
-	0x006e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0066, 0x2031, 0x0000,
-	0x6020, 0x9084, 0x000f, 0x001b, 0x006e, 0x012e, 0x0005, 0xc4a0,
-	0xc4a0, 0xc49b, 0xc4c2, 0xc48e, 0xc49b, 0xc4c2, 0xc49b, 0xc48e,
-	0x8c68, 0xc49b, 0xc49b, 0xc49b, 0xc48e, 0xc48e, 0x080c, 0x0dd5,
-	0x0036, 0x2019, 0x0010, 0x080c, 0xde08, 0x6023, 0x0006, 0x6003,
-	0x0007, 0x003e, 0x0005, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005,
-	0x0096, 0x86ff, 0x11d8, 0x6014, 0x2048, 0x080c, 0xc825, 0x01c0,
-	0xa864, 0x9086, 0x0139, 0x1128, 0xa87b, 0x0005, 0xa883, 0x0000,
-	0x0028, 0x900e, 0x2001, 0x0005, 0x080c, 0x6c85, 0x080c, 0xcb13,
-	0x080c, 0x6a3a, 0x080c, 0xab9c, 0x9085, 0x0001, 0x009e, 0x0005,
-	0x9006, 0x0ce0, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0dd5, 0x0002,
-	0xc4d8, 0xc506, 0xc4da, 0xc527, 0xc501, 0xc4d8, 0xc49b, 0xc4a0,
-	0xc4a0, 0xc49b, 0xc49b, 0xc49b, 0xc49b, 0xc49b, 0xc49b, 0xc49b,
-	0x080c, 0x0dd5, 0x86ff, 0x1510, 0x6020, 0x9086, 0x0006, 0x01f0,
-	0x0096, 0x6014, 0x2048, 0x080c, 0xc825, 0x0158, 0xa87c, 0xd0cc,
-	0x0130, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fb2, 0x009e, 0x080c,
-	0xcb13, 0x009e, 0x080c, 0xced2, 0x6007, 0x0085, 0x6003, 0x000b,
-	0x6023, 0x0002, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x9085, 0x0001,
-	0x0005, 0x0066, 0x080c, 0x19b4, 0x006e, 0x08a0, 0x00e6, 0x2071,
-	0x19e5, 0x7024, 0x9c06, 0x1120, 0x080c, 0xa236, 0x00ee, 0x0850,
-	0x6020, 0x9084, 0x000f, 0x9086, 0x0006, 0x1150, 0x0086, 0x0096,
-	0x2049, 0x0001, 0x2c40, 0x080c, 0xa3a6, 0x009e, 0x008e, 0x0010,
-	0x080c, 0xa133, 0x00ee, 0x1904, 0xc4da, 0x0804, 0xc49b, 0x0036,
-	0x00e6, 0x2071, 0x19e5, 0x703c, 0x9c06, 0x1138, 0x901e, 0x080c,
-	0xa2ac, 0x00ee, 0x003e, 0x0804, 0xc4da, 0x080c, 0xa4d6, 0x00ee,
-	0x003e, 0x1904, 0xc4da, 0x0804, 0xc49b, 0x00c6, 0x6020, 0x9084,
-	0x000f, 0x0013, 0x00ce, 0x0005, 0xc55a, 0xc609, 0xc770, 0xc564,
-	0xab9c, 0xc55a, 0xddfa, 0xcf3a, 0xc609, 0x8c3a, 0xc7ef, 0xc553,
-	0xc553, 0xc553, 0xc553, 0x080c, 0x0dd5, 0x080c, 0xca24, 0x1110,
-	0x080c, 0xb51d, 0x0005, 0x080c, 0x9317, 0x080c, 0x941c, 0x0804,
-	0xab6b, 0x601b, 0x0001, 0x0005, 0x080c, 0xc825, 0x0130, 0x6014,
-	0x0096, 0x2048, 0x2c00, 0xa896, 0x009e, 0x6000, 0x908a, 0x0016,
-	0x1a0c, 0x0dd5, 0x0002, 0xc583, 0xc585, 0xc5a9, 0xc5bd, 0xc5e1,
-	0xc583, 0xc55a, 0xc55a, 0xc55a, 0xc5bd, 0xc5bd, 0xc583, 0xc583,
-	0xc583, 0xc583, 0xc5c7, 0x080c, 0x0dd5, 0x00e6, 0x6014, 0x0096,
-	0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x2071, 0x19e5, 0x7024,
-	0x9c06, 0x01a0, 0x080c, 0xa133, 0x080c, 0xced2, 0x6007, 0x0085,
-	0x6003, 0x000b, 0x6023, 0x0002, 0x2001, 0x1985, 0x2004, 0x601a,
-	0x080c, 0x8e7f, 0x080c, 0x941c, 0x00ee, 0x0005, 0x601b, 0x0001,
-	0x0cd8, 0x0096, 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e,
-	0x080c, 0xced2, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002,
-	0x080c, 0x8e7f, 0x080c, 0x941c, 0x0005, 0x0096, 0x601b, 0x0001,
-	0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x0005, 0x080c,
-	0x54bf, 0x01a8, 0x6014, 0x0096, 0x904d, 0x0180, 0xa864, 0xa867,
-	0x0103, 0xa87b, 0x0006, 0x9086, 0x0139, 0x1140, 0xa867, 0x0139,
-	0xa897, 0x4005, 0xa89b, 0x0004, 0x080c, 0x6a46, 0x009e, 0x0804,
-	0xab6b, 0x6014, 0x0096, 0x904d, 0x01f8, 0xa97c, 0xd1e4, 0x01e0,
-	0x2001, 0x180f, 0x2004, 0xd0c4, 0x0110, 0x009e, 0x0005, 0xa884,
-	0x009e, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0x2001, 0x0037,
-	0x2c08, 0x080c, 0x15d1, 0x6000, 0x9086, 0x0004, 0x1120, 0x2009,
-	0x0048, 0x080c, 0xabe6, 0x0005, 0x009e, 0x080c, 0x19b4, 0x0804,
-	0xc5a9, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0dd5, 0x000b, 0x0005,
-	0xc620, 0xc561, 0xc622, 0xc620, 0xc622, 0xc622, 0xc55b, 0xc620,
-	0xc555, 0xc555, 0xc620, 0xc620, 0xc620, 0xc620, 0xc620, 0xc620,
-	0x080c, 0x0dd5, 0x6010, 0x00b6, 0x2058, 0xb804, 0x9084, 0x00ff,
-	0x00be, 0x908a, 0x000c, 0x1a0c, 0x0dd5, 0x00b6, 0x0013, 0x00be,
-	0x0005, 0xc63d, 0xc70a, 0xc63f, 0xc67f, 0xc63f, 0xc67f, 0xc63f,
-	0xc64d, 0xc63d, 0xc67f, 0xc63d, 0xc66e, 0x080c, 0x0dd5, 0x6004,
-	0x908e, 0x0016, 0x05c0, 0x908e, 0x0004, 0x05a8, 0x908e, 0x0002,
-	0x0590, 0x908e, 0x0052, 0x0904, 0xc706, 0x6004, 0x080c, 0xca24,
-	0x0904, 0xc723, 0x908e, 0x0004, 0x1110, 0x080c, 0x3093, 0x908e,
-	0x0021, 0x0904, 0xc727, 0x908e, 0x0022, 0x0904, 0xc76b, 0x908e,
-	0x003d, 0x0904, 0xc727, 0x908e, 0x0039, 0x0904, 0xc72b, 0x908e,
-	0x0035, 0x0904, 0xc72b, 0x908e, 0x001e, 0x0178, 0x908e, 0x0001,
-	0x1140, 0x6010, 0x2058, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006,
-	0x0110, 0x080c, 0x306e, 0x080c, 0xb51d, 0x0804, 0xab9c, 0x00c6,
-	0x00d6, 0x6104, 0x9186, 0x0016, 0x0904, 0xc6f7, 0x9186, 0x0002,
-	0x1904, 0xc6cc, 0x2001, 0x1837, 0x2004, 0xd08c, 0x11c8, 0x080c,
-	0x717d, 0x11b0, 0x080c, 0xcf18, 0x0138, 0x080c, 0x71a0, 0x1120,
-	0x080c, 0x708d, 0x0804, 0xc754, 0x2001, 0x197d, 0x2003, 0x0001,
-	0x2001, 0x1800, 0x2003, 0x0001, 0x080c, 0x70af, 0x0804, 0xc754,
-	0x6010, 0x2058, 0x2001, 0x1837, 0x2004, 0xd0ac, 0x1904, 0xc754,
-	0xb8a0, 0x9084, 0xff80, 0x1904, 0xc754, 0xb840, 0x9084, 0x00ff,
-	0x9005, 0x0190, 0x8001, 0xb842, 0x6017, 0x0000, 0x6023, 0x0007,
-	0x601b, 0x0398, 0x6043, 0x0000, 0x080c, 0xab15, 0x0128, 0x2b00,
-	0x6012, 0x6023, 0x0001, 0x0458, 0x00de, 0x00ce, 0x6004, 0x908e,
-	0x0002, 0x11a0, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, 0x1170,
-	0x2009, 0x1837, 0x2104, 0xc085, 0x200a, 0x00e6, 0x2071, 0x1800,
-	0x080c, 0x5d8b, 0x00ee, 0x080c, 0xb51d, 0x0030, 0x080c, 0xb51d,
-	0x080c, 0x306e, 0x080c, 0xcf2d, 0x00e6, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x3093, 0x012e, 0x00ee, 0x080c, 0xab9c, 0x0005, 0x2001,
-	0x0002, 0x080c, 0x631d, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c,
-	0x8ec7, 0x080c, 0x941c, 0x00de, 0x00ce, 0x0c80, 0x080c, 0x3093,
-	0x0804, 0xc67b, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0d38,
-	0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0904, 0xc6cc,
-	0x8001, 0xb842, 0x6003, 0x0001, 0x080c, 0x8ec7, 0x080c, 0x941c,
-	0x00de, 0x00ce, 0x0898, 0x080c, 0xb51d, 0x0804, 0xc67d, 0x080c,
-	0xb559, 0x0804, 0xc67d, 0x00d6, 0x2c68, 0x6104, 0x080c, 0xce90,
-	0x00de, 0x0118, 0x080c, 0xab6b, 0x00f0, 0x6004, 0x8007, 0x6134,
-	0x918c, 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b,
-	0x6023, 0x0002, 0x603c, 0x600a, 0x2001, 0x1985, 0x2004, 0x601a,
-	0x602c, 0x2c08, 0x2060, 0x6024, 0xc0b5, 0x6026, 0x2160, 0x080c,
-	0x8e7f, 0x080c, 0x941c, 0x0005, 0x00de, 0x00ce, 0x080c, 0xb51d,
-	0x080c, 0x306e, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x3093,
-	0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x6043, 0x0000,
-	0x012e, 0x00ee, 0x0005, 0x080c, 0xaf9b, 0x1904, 0xc723, 0x0005,
-	0x6000, 0x908a, 0x0016, 0x1a0c, 0x0dd5, 0x0096, 0x00d6, 0x001b,
-	0x00de, 0x009e, 0x0005, 0xc78b, 0xc78b, 0xc78b, 0xc78b, 0xc78b,
-	0xc78b, 0xc78b, 0xc78b, 0xc78b, 0xc55a, 0xc78b, 0xc561, 0xc78d,
-	0xc561, 0xc79a, 0xc78b, 0x080c, 0x0dd5, 0x6004, 0x9086, 0x008b,
-	0x0148, 0x6007, 0x008b, 0x6003, 0x000d, 0x080c, 0x8e7f, 0x080c,
-	0x941c, 0x0005, 0x080c, 0xcf0c, 0x0118, 0x080c, 0xcf1f, 0x0010,
-	0x080c, 0xcf2d, 0x080c, 0xca07, 0x080c, 0xc825, 0x0570, 0x080c,
-	0x306e, 0x080c, 0xc825, 0x0168, 0x6014, 0x2048, 0xa867, 0x0103,
-	0xa87b, 0x0006, 0xa877, 0x0000, 0xa880, 0xc0ed, 0xa882, 0x080c,
-	0x6a46, 0x2c68, 0x080c, 0xab15, 0x0150, 0x6810, 0x6012, 0x080c,
-	0xcc93, 0x00c6, 0x2d60, 0x080c, 0xab9c, 0x00ce, 0x0008, 0x2d60,
-	0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001,
-	0x080c, 0x8ec7, 0x080c, 0x941c, 0x00c8, 0x080c, 0xcf0c, 0x0138,
-	0x6034, 0x9086, 0x4000, 0x1118, 0x080c, 0x306e, 0x08d0, 0x6034,
+	0x00be, 0x9206, 0x1520, 0x700c, 0x6210, 0x00b6, 0x2258, 0xba14,
+	0x00be, 0x9206, 0x11e0, 0x6043, 0x0000, 0x2c68, 0x0016, 0x2009,
+	0x0035, 0x080c, 0xd18e, 0x001e, 0x1158, 0x622c, 0x2268, 0x2071,
+	0x026c, 0x6b20, 0x9386, 0x0003, 0x0130, 0x9386, 0x0006, 0x0128,
+	0x080c, 0xae47, 0x0020, 0x0039, 0x0010, 0x080c, 0xb472, 0x002e,
+	0x00de, 0x00ee, 0x0005, 0x0096, 0x6814, 0x2048, 0x9186, 0x0015,
+	0x0904, 0xb45a, 0x918e, 0x0016, 0x1904, 0xb470, 0x700c, 0x908c,
+	0xff00, 0x9186, 0x1700, 0x0120, 0x9186, 0x0300, 0x1904, 0xb434,
+	0x89ff, 0x1138, 0x6800, 0x9086, 0x000f, 0x0904, 0xb417, 0x0804,
+	0xb46e, 0x6808, 0x9086, 0xffff, 0x1904, 0xb45c, 0xa87c, 0x9084,
+	0x0060, 0x9086, 0x0020, 0x1128, 0xa83c, 0xa940, 0x9105, 0x1904,
+	0xb45c, 0x6824, 0xd0b4, 0x1904, 0xb45c, 0x080c, 0xcd04, 0x685c,
+	0xa882, 0xa87c, 0xc0dc, 0xc0f4, 0xc0d4, 0xa87e, 0x0026, 0x900e,
+	0x6a18, 0x2001, 0x000a, 0x080c, 0x8f3f, 0xa884, 0x920a, 0x0208,
+	0x8011, 0xaa86, 0x82ff, 0x002e, 0x1138, 0x00c6, 0x2d60, 0x080c,
+	0xc840, 0x00ce, 0x0804, 0xb46e, 0x00c6, 0xa868, 0xd0fc, 0x1118,
+	0x080c, 0x60af, 0x0010, 0x080c, 0x64b5, 0x00ce, 0x1904, 0xb45c,
+	0x00c6, 0x2d60, 0x080c, 0xae47, 0x00ce, 0x0804, 0xb46e, 0x00c6,
+	0x080c, 0xae95, 0x0198, 0x6017, 0x0000, 0x6810, 0x6012, 0x080c,
+	0xcf90, 0x6023, 0x0003, 0x6904, 0x00c6, 0x2d60, 0x080c, 0xae47,
+	0x00ce, 0x080c, 0xaec2, 0x00ce, 0x0804, 0xb46e, 0x2001, 0x1988,
+	0x2004, 0x6842, 0x00ce, 0x04d0, 0x7008, 0x9086, 0x000b, 0x11c8,
+	0x6010, 0x00b6, 0x2058, 0xb900, 0xc1bc, 0xb902, 0x00be, 0x00c6,
+	0x2d60, 0xa87b, 0x0003, 0x080c, 0xd1d0, 0x6007, 0x0085, 0x6003,
+	0x000b, 0x6023, 0x0002, 0x080c, 0x90c7, 0x080c, 0x9664, 0x00ce,
+	0x00e8, 0x700c, 0x9086, 0x2a00, 0x1138, 0x2001, 0x1988, 0x2004,
+	0x6842, 0x00a0, 0x0479, 0x00a0, 0x89ff, 0x090c, 0x0dd5, 0x00c6,
+	0x00d6, 0x2d60, 0xa867, 0x0103, 0xa87b, 0x0003, 0x080c, 0x6a95,
+	0x080c, 0xcd04, 0x080c, 0xae78, 0x00de, 0x00ce, 0x080c, 0xae47,
+	0x009e, 0x0005, 0x9186, 0x0015, 0x1128, 0x2001, 0x1988, 0x2004,
+	0x6842, 0x0068, 0x918e, 0x0016, 0x1160, 0x00c6, 0x2d00, 0x2060,
+	0x080c, 0xe7ea, 0x080c, 0x8689, 0x080c, 0xae47, 0x00ce, 0x080c,
+	0xae47, 0x0005, 0x0026, 0x0036, 0x0046, 0x7228, 0xacb0, 0xabac,
+	0xd2f4, 0x0130, 0x2001, 0x1988, 0x2004, 0x6842, 0x0804, 0xb4ec,
+	0x00c6, 0x2d60, 0x080c, 0xc741, 0x00ce, 0x6804, 0x9086, 0x0050,
+	0x1168, 0x00c6, 0x2d00, 0x2060, 0x6003, 0x0001, 0x6007, 0x0050,
+	0x080c, 0x90c7, 0x080c, 0x9664, 0x00ce, 0x04f0, 0x6800, 0x9086,
+	0x000f, 0x01a8, 0x89ff, 0x090c, 0x0dd5, 0x6800, 0x9086, 0x0004,
+	0x1190, 0xa87c, 0xd0ac, 0x0178, 0xa843, 0x0fff, 0xa83f, 0x0fff,
+	0xa880, 0xc0fc, 0xa882, 0x2001, 0x0001, 0x6832, 0x0400, 0x2001,
+	0x0007, 0x6832, 0x00e0, 0xa87c, 0xd0b4, 0x1150, 0xd0ac, 0x0db8,
+	0x6824, 0xd0f4, 0x1d48, 0xa838, 0xa934, 0x9105, 0x0d80, 0x0c20,
+	0xd2ec, 0x1d68, 0x7024, 0x9306, 0x1118, 0x7020, 0x9406, 0x0d38,
+	0x7020, 0x683e, 0x7024, 0x683a, 0x2001, 0x0005, 0x6832, 0x080c,
+	0xce87, 0x080c, 0x9664, 0x0010, 0x080c, 0xae47, 0x004e, 0x003e,
+	0x002e, 0x0005, 0x00e6, 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff,
+	0x6210, 0x00b6, 0x2258, 0xba10, 0x00be, 0x9206, 0x1904, 0xb557,
+	0x700c, 0x6210, 0x00b6, 0x2258, 0xba14, 0x00be, 0x9206, 0x1904,
+	0xb557, 0x6038, 0x2068, 0x6824, 0xc0dc, 0x6826, 0x6a20, 0x9286,
+	0x0007, 0x0904, 0xb557, 0x9286, 0x0002, 0x0904, 0xb557, 0x9286,
+	0x0000, 0x05e8, 0x6808, 0x633c, 0x9306, 0x15c8, 0x2071, 0x026c,
+	0x9186, 0x0015, 0x0570, 0x918e, 0x0016, 0x1100, 0x00c6, 0x6038,
+	0x2060, 0x6104, 0x9186, 0x004b, 0x01c0, 0x9186, 0x004c, 0x01a8,
+	0x9186, 0x004d, 0x0190, 0x9186, 0x004e, 0x0178, 0x9186, 0x0052,
+	0x0160, 0x6014, 0x0096, 0x2048, 0x080c, 0xcb1b, 0x090c, 0x0dd5,
+	0xa87b, 0x0003, 0x009e, 0x080c, 0xd1d0, 0x6007, 0x0085, 0x6003,
+	0x000b, 0x6023, 0x0002, 0x080c, 0x90c7, 0x080c, 0x9664, 0x00ce,
+	0x0030, 0x6038, 0x2070, 0x2001, 0x1988, 0x2004, 0x7042, 0x080c,
+	0xae47, 0x002e, 0x00de, 0x00ee, 0x0005, 0x00b6, 0x0096, 0x00f6,
+	0x6014, 0x2048, 0x6010, 0x2058, 0x91b6, 0x0015, 0x0130, 0xba08,
+	0xbb0c, 0xbc00, 0xc48c, 0xbc02, 0x0460, 0x0096, 0x0156, 0x0036,
+	0x0026, 0x2b48, 0x9e90, 0x0010, 0x2019, 0x000a, 0x20a9, 0x0004,
+	0x080c, 0xbe03, 0x002e, 0x003e, 0x015e, 0x009e, 0x1904, 0xb5c6,
+	0x0096, 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, 0x0014, 0x2019,
+	0x0006, 0x20a9, 0x0004, 0x080c, 0xbe03, 0x002e, 0x003e, 0x015e,
+	0x009e, 0x15a0, 0x7238, 0xba0a, 0x733c, 0xbb0e, 0xbc00, 0xc48d,
+	0xbc02, 0xa804, 0x9005, 0x1128, 0x00fe, 0x009e, 0x00be, 0x0804,
+	0xb24b, 0x0096, 0x2048, 0xaa12, 0xab16, 0xac0a, 0x009e, 0x8006,
+	0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002,
+	0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000,
+	0x2041, 0x1243, 0x080c, 0xb360, 0x0130, 0x00fe, 0x009e, 0x080c,
+	0xae47, 0x00be, 0x0005, 0x080c, 0xb7f9, 0x0cb8, 0x2b78, 0x00f6,
+	0x080c, 0x31bc, 0x080c, 0xd22b, 0x00fe, 0x00c6, 0x080c, 0xadf1,
+	0x2f00, 0x6012, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001,
+	0x6003, 0x0001, 0x2001, 0x0007, 0x080c, 0x6550, 0x080c, 0x657c,
+	0x080c, 0x910f, 0x080c, 0x9664, 0x00ce, 0x0804, 0xb599, 0x2100,
+	0x91b2, 0x0053, 0x1a0c, 0x0dd5, 0x91b2, 0x0040, 0x1a04, 0xb64f,
+	0x0002, 0xb63d, 0xb63d, 0xb633, 0xb63d, 0xb63d, 0xb63d, 0xb631,
+	0xb631, 0xb631, 0xb631, 0xb631, 0xb631, 0xb631, 0xb631, 0xb631,
+	0xb631, 0xb631, 0xb631, 0xb631, 0xb631, 0xb631, 0xb631, 0xb631,
+	0xb631, 0xb631, 0xb631, 0xb631, 0xb631, 0xb631, 0xb631, 0xb631,
+	0xb63d, 0xb631, 0xb63d, 0xb63d, 0xb631, 0xb631, 0xb631, 0xb631,
+	0xb631, 0xb633, 0xb631, 0xb631, 0xb631, 0xb631, 0xb631, 0xb631,
+	0xb631, 0xb631, 0xb631, 0xb63d, 0xb63d, 0xb631, 0xb631, 0xb631,
+	0xb631, 0xb631, 0xb631, 0xb631, 0xb631, 0xb631, 0xb63d, 0xb631,
+	0xb631, 0x080c, 0x0dd5, 0x0066, 0x00b6, 0x6610, 0x2658, 0xb8cc,
+	0xc08c, 0xb8ce, 0x00be, 0x006e, 0x0000, 0x6003, 0x0001, 0x6106,
+	0x9186, 0x0032, 0x0118, 0x080c, 0x910f, 0x0010, 0x080c, 0x90c7,
+	0x0126, 0x2091, 0x8000, 0x080c, 0x9664, 0x012e, 0x0005, 0x2600,
+	0x0002, 0xb63d, 0xb63d, 0xb663, 0xb63d, 0xb63d, 0xb663, 0xb663,
+	0xb663, 0xb663, 0xb63d, 0xb663, 0xb63d, 0xb663, 0xb63d, 0xb663,
+	0xb663, 0xb663, 0xb663, 0x080c, 0x0dd5, 0x6004, 0x90b2, 0x0053,
+	0x1a0c, 0x0dd5, 0x91b6, 0x0013, 0x0904, 0xb727, 0x91b6, 0x0027,
+	0x1904, 0xb6e2, 0x080c, 0x955f, 0x6004, 0x080c, 0xcd10, 0x01b0,
+	0x080c, 0xcd21, 0x01a8, 0x908e, 0x0021, 0x0904, 0xb6df, 0x908e,
+	0x0022, 0x1130, 0x080c, 0xb277, 0x0904, 0xb6db, 0x0804, 0xb6dc,
+	0x908e, 0x003d, 0x0904, 0xb6df, 0x0804, 0xb6d5, 0x080c, 0x31e1,
+	0x2001, 0x0007, 0x080c, 0x6550, 0x6010, 0x00b6, 0x2058, 0xb9a0,
+	0x00be, 0x080c, 0xb7f9, 0x9186, 0x007e, 0x1148, 0x2001, 0x1837,
+	0x2014, 0xc285, 0x080c, 0x73b0, 0x1108, 0xc2ad, 0x2202, 0x0036,
+	0x0026, 0x2019, 0x0028, 0x2110, 0x080c, 0xe8f6, 0x002e, 0x003e,
+	0x0016, 0x0026, 0x0036, 0x2110, 0x2019, 0x0028, 0x080c, 0x9262,
+	0x0076, 0x903e, 0x080c, 0x913f, 0x6010, 0x00b6, 0x905d, 0x0100,
+	0x00be, 0x2c08, 0x080c, 0xe2ca, 0x007e, 0x003e, 0x002e, 0x001e,
+	0x080c, 0xd22b, 0x0016, 0x080c, 0xcf88, 0x080c, 0xae47, 0x001e,
+	0x080c, 0x32b4, 0x080c, 0x9664, 0x0030, 0x080c, 0xcf88, 0x080c,
+	0xae47, 0x080c, 0x9664, 0x0005, 0x080c, 0xb7f9, 0x0cb0, 0x080c,
+	0xb835, 0x0c98, 0x9186, 0x0014, 0x1db0, 0x080c, 0x955f, 0x6004,
+	0x908e, 0x0022, 0x1118, 0x080c, 0xb277, 0x0d68, 0x080c, 0x31bc,
+	0x080c, 0xd22b, 0x080c, 0xcd10, 0x1190, 0x080c, 0x31e1, 0x6010,
+	0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, 0xb7f9, 0x9186, 0x007e,
+	0x1128, 0x2001, 0x1837, 0x200c, 0xc185, 0x2102, 0x0870, 0x080c,
+	0xcd21, 0x1118, 0x080c, 0xb7f9, 0x0840, 0x6004, 0x908e, 0x0032,
+	0x1160, 0x00e6, 0x00f6, 0x2071, 0x189e, 0x2079, 0x0000, 0x080c,
+	0x354f, 0x00fe, 0x00ee, 0x0804, 0xb6d5, 0x6004, 0x908e, 0x0021,
+	0x0d48, 0x908e, 0x0022, 0x090c, 0xb7f9, 0x0804, 0xb6d5, 0x90b2,
+	0x0040, 0x1a04, 0xb7d5, 0x2008, 0x0002, 0xb76f, 0xb770, 0xb773,
+	0xb776, 0xb779, 0xb77c, 0xb76d, 0xb76d, 0xb76d, 0xb76d, 0xb76d,
+	0xb76d, 0xb76d, 0xb76d, 0xb76d, 0xb76d, 0xb76d, 0xb76d, 0xb76d,
+	0xb76d, 0xb76d, 0xb76d, 0xb76d, 0xb76d, 0xb76d, 0xb76d, 0xb76d,
+	0xb76d, 0xb76d, 0xb76d, 0xb77f, 0xb78a, 0xb76d, 0xb78c, 0xb78a,
+	0xb76d, 0xb76d, 0xb76d, 0xb76d, 0xb76d, 0xb78a, 0xb78a, 0xb76d,
+	0xb76d, 0xb76d, 0xb76d, 0xb76d, 0xb76d, 0xb76d, 0xb76d, 0xb7bc,
+	0xb78a, 0xb76d, 0xb786, 0xb76d, 0xb76d, 0xb76d, 0xb787, 0xb76d,
+	0xb76d, 0xb76d, 0xb78a, 0xb7b3, 0xb76d, 0x080c, 0x0dd5, 0x00d0,
+	0x2001, 0x000b, 0x0410, 0x2001, 0x0003, 0x00f8, 0x2001, 0x0005,
+	0x00e0, 0x2001, 0x0001, 0x00c8, 0x2001, 0x0009, 0x00b0, 0x080c,
+	0x955f, 0x6003, 0x0005, 0x080c, 0x9664, 0x0070, 0x0018, 0x0010,
+	0x080c, 0x6550, 0x0804, 0xb7cd, 0x080c, 0x955f, 0x080c, 0xd22e,
+	0x6003, 0x0004, 0x080c, 0x9664, 0x0005, 0x080c, 0x6550, 0x080c,
+	0x955f, 0x6003, 0x0002, 0x0036, 0x2019, 0x1852, 0x2304, 0x9084,
+	0xff00, 0x1120, 0x2001, 0x1986, 0x201c, 0x0040, 0x8007, 0x909a,
+	0x0004, 0x0ec0, 0x8003, 0x801b, 0x831b, 0x9318, 0x631a, 0x003e,
+	0x080c, 0x9664, 0x0c08, 0x080c, 0x955f, 0x080c, 0xcf88, 0x080c,
+	0xae47, 0x080c, 0x9664, 0x08c0, 0x00e6, 0x00f6, 0x2071, 0x189e,
+	0x2079, 0x0000, 0x080c, 0x354f, 0x00fe, 0x00ee, 0x080c, 0x955f,
+	0x080c, 0xae47, 0x080c, 0x9664, 0x0838, 0x080c, 0x955f, 0x6003,
+	0x0002, 0x080c, 0xd22e, 0x0804, 0x9664, 0x2600, 0x2008, 0x0002,
+	0xb7ec, 0xb7cd, 0xb7ea, 0xb7cd, 0xb7cd, 0xb7ea, 0xb7ea, 0xb7ea,
+	0xb7ea, 0xb7cd, 0xb7ea, 0xb7cd, 0xb7ea, 0xb7cd, 0xb7ea, 0xb7ea,
+	0xb7ea, 0xb7ea, 0x080c, 0x0dd5, 0x080c, 0x955f, 0x0096, 0x6014,
+	0x2048, 0x080c, 0x6c79, 0x009e, 0x080c, 0xae47, 0x080c, 0x9664,
+	0x0005, 0x00e6, 0x0096, 0x0026, 0x0016, 0x080c, 0xcb1b, 0x0568,
+	0x6014, 0x2048, 0xa864, 0x9086, 0x0139, 0x11a8, 0xa894, 0x9086,
+	0x0056, 0x1148, 0x080c, 0x5479, 0x0130, 0x2001, 0x0000, 0x900e,
+	0x2011, 0x4000, 0x0028, 0x2001, 0x0030, 0x900e, 0x2011, 0x4005,
+	0x080c, 0xd0f5, 0x0090, 0xa868, 0xd0fc, 0x0178, 0xa807, 0x0000,
+	0x0016, 0x6004, 0x908e, 0x0021, 0x0168, 0x908e, 0x003d, 0x0150,
+	0x001e, 0xa867, 0x0103, 0xa833, 0x0100, 0x001e, 0x002e, 0x009e,
+	0x00ee, 0x0005, 0x001e, 0x0009, 0x0cc0, 0x0096, 0x6014, 0x2048,
+	0xa800, 0x2048, 0xa867, 0x0103, 0xa823, 0x8001, 0x009e, 0x0005,
+	0x00b6, 0x6610, 0x2658, 0xb804, 0x9084, 0x00ff, 0x90b2, 0x000c,
+	0x1a0c, 0x0dd5, 0x6604, 0x96b6, 0x004d, 0x1120, 0x080c, 0xd014,
+	0x0804, 0xb8c5, 0x6604, 0x96b6, 0x0043, 0x1120, 0x080c, 0xd05d,
+	0x0804, 0xb8c5, 0x6604, 0x96b6, 0x004b, 0x1120, 0x080c, 0xd089,
+	0x0804, 0xb8c5, 0x6604, 0x96b6, 0x0033, 0x1120, 0x080c, 0xcfaa,
+	0x0804, 0xb8c5, 0x6604, 0x96b6, 0x0028, 0x1120, 0x080c, 0xcd5a,
+	0x0804, 0xb8c5, 0x6604, 0x96b6, 0x0029, 0x1120, 0x080c, 0xcd9b,
+	0x0804, 0xb8c5, 0x6604, 0x96b6, 0x001f, 0x1120, 0x080c, 0xb220,
+	0x0804, 0xb8c5, 0x6604, 0x96b6, 0x0000, 0x1118, 0x080c, 0xb55d,
+	0x04e0, 0x6604, 0x96b6, 0x0022, 0x1118, 0x080c, 0xb258, 0x04a8,
+	0x6604, 0x96b6, 0x0035, 0x1118, 0x080c, 0xb37e, 0x0470, 0x6604,
+	0x96b6, 0x0039, 0x1118, 0x080c, 0xb4f2, 0x0438, 0x6604, 0x96b6,
+	0x003d, 0x1118, 0x080c, 0xb290, 0x0400, 0x6604, 0x96b6, 0x0044,
+	0x1118, 0x080c, 0xb2cc, 0x00c8, 0x6604, 0x96b6, 0x0049, 0x1118,
+	0x080c, 0xb30d, 0x0090, 0x6604, 0x96b6, 0x0041, 0x1118, 0x080c,
+	0xb2f7, 0x0058, 0x91b6, 0x0015, 0x1110, 0x0063, 0x0030, 0x91b6,
+	0x0016, 0x1128, 0x00be, 0x0804, 0xbb1f, 0x00be, 0x0005, 0x080c,
+	0xaedd, 0x0cd8, 0xb8e2, 0xb8e5, 0xb8e2, 0xb92c, 0xb8e2, 0xba93,
+	0xbb2c, 0xb8e2, 0xb8e2, 0xbaf5, 0xb8e2, 0xbb0b, 0x0096, 0x601f,
+	0x0000, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, 0x009e,
+	0x0804, 0xae47, 0xa001, 0xa001, 0x0005, 0x00e6, 0x2071, 0x1800,
+	0x7090, 0x9086, 0x0074, 0x1540, 0x080c, 0xe29b, 0x11b0, 0x6010,
+	0x00b6, 0x2058, 0x7030, 0xd08c, 0x0128, 0xb800, 0xd0bc, 0x0110,
+	0xc0c5, 0xb802, 0x00f9, 0x00be, 0x2001, 0x0006, 0x080c, 0x6550,
+	0x080c, 0x31e1, 0x080c, 0xae47, 0x0098, 0x2001, 0x000a, 0x080c,
+	0x6550, 0x080c, 0x31e1, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c,
+	0x910f, 0x080c, 0x9664, 0x0020, 0x2001, 0x0001, 0x080c, 0xba63,
+	0x00ee, 0x0005, 0x00d6, 0xb800, 0xd084, 0x0160, 0x9006, 0x080c,
+	0x653c, 0x2069, 0x1847, 0x6804, 0xd0a4, 0x0120, 0x2001, 0x0006,
+	0x080c, 0x657c, 0x00de, 0x0005, 0x00b6, 0x0096, 0x00d6, 0x2011,
+	0x1824, 0x2204, 0x9086, 0x0074, 0x1904, 0xba3a, 0x6010, 0x2058,
+	0xbaa0, 0x9286, 0x007e, 0x1120, 0x080c, 0xbc79, 0x0804, 0xb99e,
+	0x080c, 0xbc6e, 0x6010, 0x2058, 0xbaa0, 0x9286, 0x0080, 0x1510,
+	0x6014, 0x9005, 0x01a8, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086,
+	0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c,
+	0xd0f5, 0x0030, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200,
+	0x2001, 0x0006, 0x080c, 0x6550, 0x080c, 0x31e1, 0x080c, 0xae47,
+	0x0804, 0xba3d, 0x080c, 0xba4b, 0x6014, 0x9005, 0x0190, 0x2048,
+	0xa868, 0xd0f4, 0x01e8, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039,
+	0x1d08, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xd0f5,
+	0x08f8, 0x080c, 0xba41, 0x0160, 0x9006, 0x080c, 0x653c, 0x2001,
+	0x0004, 0x080c, 0x657c, 0x2001, 0x0007, 0x080c, 0x6550, 0x08a0,
+	0x2001, 0x0004, 0x080c, 0x6550, 0x6003, 0x0001, 0x6007, 0x0003,
+	0x080c, 0x910f, 0x080c, 0x9664, 0x0804, 0xba3d, 0xb85c, 0xd0e4,
+	0x01d8, 0x080c, 0xcf2a, 0x080c, 0x73b0, 0x0118, 0xd0dc, 0x1904,
+	0xb960, 0x2011, 0x1837, 0x2204, 0xc0ad, 0x2012, 0x2001, 0x196d,
+	0x2004, 0x00f6, 0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, 0x28b2,
+	0x78e2, 0x00fe, 0x0804, 0xb960, 0x080c, 0xcf67, 0x2011, 0x1837,
+	0x2204, 0xc0a5, 0x2012, 0x0006, 0x080c, 0xe420, 0x000e, 0x1904,
+	0xb960, 0xc0b5, 0x2012, 0x2001, 0x0006, 0x080c, 0x6550, 0x9006,
+	0x080c, 0x653c, 0x00c6, 0x2001, 0x180f, 0x2004, 0xd09c, 0x0520,
+	0x00f6, 0x2079, 0x0100, 0x00e6, 0x2071, 0x1800, 0x700c, 0x9084,
+	0x00ff, 0x78e6, 0x707e, 0x7010, 0x78ea, 0x7082, 0x908c, 0x00ff,
+	0x00ee, 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x2887, 0x00f6,
+	0x2100, 0x900e, 0x080c, 0x283e, 0x795e, 0x00fe, 0x9186, 0x0081,
+	0x01d8, 0x2009, 0x0081, 0x00c8, 0x2009, 0x00ef, 0x00f6, 0x2079,
+	0x0100, 0x79ea, 0x7932, 0x7936, 0x780c, 0xc0b5, 0x780e, 0x00fe,
+	0x080c, 0x2887, 0x00f6, 0x2079, 0x1800, 0x7982, 0x2100, 0x900e,
+	0x080c, 0x283e, 0x795e, 0x00fe, 0x8108, 0x080c, 0x659f, 0x2b00,
+	0x00ce, 0x1904, 0xb960, 0x6012, 0x2009, 0x180f, 0x210c, 0xd19c,
+	0x0150, 0x2009, 0x027c, 0x210c, 0x918c, 0x00ff, 0xb912, 0x2009,
+	0x027d, 0x210c, 0xb916, 0x2001, 0x0002, 0x080c, 0x6550, 0x6023,
+	0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x910f, 0x080c,
+	0x9664, 0x0018, 0x2001, 0x0001, 0x0431, 0x00de, 0x009e, 0x00be,
+	0x0005, 0x2001, 0x1810, 0x2004, 0xd0a4, 0x0120, 0x2001, 0x1848,
+	0x2004, 0xd0ac, 0x0005, 0x00e6, 0x080c, 0xe94f, 0x0190, 0x2071,
+	0x0260, 0x7108, 0x720c, 0x918c, 0x00ff, 0x1118, 0x9284, 0xff00,
+	0x0140, 0x6010, 0x2058, 0xb8a0, 0x9084, 0xff80, 0x1110, 0xb912,
+	0xba16, 0x00ee, 0x0005, 0x2030, 0x9005, 0x0158, 0x2001, 0x0007,
+	0x080c, 0x6550, 0x080c, 0x56e4, 0x1120, 0x2001, 0x0007, 0x080c,
+	0x657c, 0x2600, 0x9005, 0x11b0, 0x6014, 0x0096, 0x2048, 0xa868,
+	0x009e, 0xd0fc, 0x1178, 0x0036, 0x0046, 0x6010, 0x00b6, 0x2058,
+	0xbba0, 0x00be, 0x2021, 0x0004, 0x2011, 0x8014, 0x080c, 0x4b05,
+	0x004e, 0x003e, 0x080c, 0x31e1, 0x6020, 0x9086, 0x000a, 0x1108,
+	0x0005, 0x0804, 0xae47, 0x00b6, 0x00e6, 0x0026, 0x0016, 0x2071,
+	0x1800, 0x7090, 0x9086, 0x0014, 0x1904, 0xbaeb, 0x080c, 0x56e4,
+	0x1170, 0x6014, 0x9005, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058,
+	0xbba0, 0x2021, 0x0006, 0x080c, 0x4cbc, 0x004e, 0x003e, 0x00d6,
+	0x6010, 0x2058, 0x080c, 0x669b, 0x080c, 0xb91a, 0x00de, 0x080c,
+	0xbd3f, 0x1588, 0x6010, 0x2058, 0xb890, 0x9005, 0x0560, 0x2001,
+	0x0006, 0x080c, 0x6550, 0x0096, 0x6014, 0x904d, 0x01d0, 0xa864,
+	0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0000, 0x900e,
+	0x2011, 0x4000, 0x080c, 0xd0f5, 0x0060, 0xa864, 0x9084, 0x00ff,
+	0x9086, 0x0029, 0x0130, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833,
+	0x0200, 0x009e, 0x080c, 0x31e1, 0x6020, 0x9086, 0x000a, 0x0140,
+	0x080c, 0xae47, 0x0028, 0x080c, 0xb7f9, 0x9006, 0x080c, 0xba63,
+	0x001e, 0x002e, 0x00ee, 0x00be, 0x0005, 0x2011, 0x1824, 0x2204,
+	0x9086, 0x0014, 0x1160, 0x2001, 0x0002, 0x080c, 0x6550, 0x6003,
+	0x0001, 0x6007, 0x0001, 0x080c, 0x910f, 0x0804, 0x9664, 0x2001,
+	0x0001, 0x0804, 0xba63, 0x2030, 0x2011, 0x1824, 0x2204, 0x9086,
+	0x0004, 0x1148, 0x96b6, 0x000b, 0x1120, 0x2001, 0x0007, 0x080c,
+	0x6550, 0x0804, 0xae47, 0x2001, 0x0001, 0x0804, 0xba63, 0x0002,
+	0xb8e2, 0xbb37, 0xb8e2, 0xbb78, 0xb8e2, 0xbc25, 0xbb2c, 0xb8e2,
+	0xb8e2, 0xbc39, 0xb8e2, 0xbc4b, 0x6604, 0x9686, 0x0003, 0x0904,
+	0xba93, 0x96b6, 0x001e, 0x1110, 0x080c, 0xae47, 0x0005, 0x00b6,
+	0x00d6, 0x00c6, 0x080c, 0xbc5d, 0x11a0, 0x9006, 0x080c, 0x653c,
+	0x080c, 0x31bc, 0x080c, 0xd22b, 0x2001, 0x0002, 0x080c, 0x6550,
+	0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x910f, 0x080c, 0x9664,
+	0x0418, 0x2009, 0x026e, 0x2104, 0x9086, 0x0009, 0x1160, 0x6010,
+	0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0170, 0x8001, 0xb842,
+	0x601b, 0x000a, 0x0088, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00,
+	0x9086, 0x1900, 0x1108, 0x08a0, 0x080c, 0x31bc, 0x080c, 0xd22b,
+	0x2001, 0x0001, 0x080c, 0xba63, 0x00ce, 0x00de, 0x00be, 0x0005,
+	0x0096, 0x00b6, 0x0026, 0x9016, 0x080c, 0xbc6b, 0x00d6, 0x2069,
+	0x197c, 0x2d04, 0x9005, 0x0168, 0x6010, 0x2058, 0xb8a0, 0x9086,
+	0x007e, 0x1138, 0x2069, 0x1820, 0x2d04, 0x8000, 0x206a, 0x00de,
+	0x0010, 0x00de, 0x0088, 0x9006, 0x080c, 0x653c, 0x2001, 0x0002,
+	0x080c, 0x6550, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x910f,
+	0x080c, 0x9664, 0x0804, 0xbbf5, 0x080c, 0xcb1b, 0x01b0, 0x6014,
+	0x2048, 0xa864, 0x2010, 0x9086, 0x0139, 0x1138, 0x6007, 0x0016,
+	0x2001, 0x0002, 0x080c, 0xd14f, 0x00b0, 0x6014, 0x2048, 0xa864,
+	0xd0fc, 0x0118, 0x2001, 0x0001, 0x0ca8, 0x2001, 0x180e, 0x2004,
+	0xd0dc, 0x0148, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005,
+	0x1110, 0x9006, 0x0c38, 0x080c, 0xb7f9, 0x2009, 0x026e, 0x2134,
+	0x96b4, 0x00ff, 0x9686, 0x0005, 0x0520, 0x9686, 0x000b, 0x01c8,
+	0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x1118, 0x9686, 0x0009,
+	0x01c0, 0x9086, 0x1900, 0x1168, 0x9686, 0x0009, 0x0190, 0x2001,
+	0x0004, 0x080c, 0x6550, 0x2001, 0x0028, 0x601a, 0x6007, 0x0052,
+	0x0020, 0x2001, 0x0001, 0x080c, 0xba63, 0x002e, 0x00be, 0x009e,
+	0x0005, 0x9286, 0x0139, 0x0160, 0x6014, 0x2048, 0x080c, 0xcb1b,
+	0x0140, 0xa864, 0x9086, 0x0139, 0x0118, 0xa868, 0xd0fc, 0x0108,
+	0x0c40, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0138,
+	0x8001, 0xb842, 0x601b, 0x000a, 0x6007, 0x0016, 0x08f0, 0xb8a0,
+	0x9086, 0x007e, 0x1138, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5fae,
+	0x00ee, 0x0010, 0x080c, 0x31bc, 0x0860, 0x080c, 0xbc6b, 0x1160,
+	0x2001, 0x0004, 0x080c, 0x6550, 0x6003, 0x0001, 0x6007, 0x0003,
+	0x080c, 0x910f, 0x0804, 0x9664, 0x080c, 0xb7f9, 0x9006, 0x0804,
+	0xba63, 0x0489, 0x1160, 0x2001, 0x0008, 0x080c, 0x6550, 0x6003,
+	0x0001, 0x6007, 0x0005, 0x080c, 0x910f, 0x0804, 0x9664, 0x2001,
+	0x0001, 0x0804, 0xba63, 0x00f9, 0x1160, 0x2001, 0x000a, 0x080c,
+	0x6550, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x910f, 0x0804,
+	0x9664, 0x2001, 0x0001, 0x0804, 0xba63, 0x2009, 0x026e, 0x2104,
+	0x9086, 0x0003, 0x1138, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00,
+	0x9086, 0x2a00, 0x0005, 0x9085, 0x0001, 0x0005, 0x00b6, 0x00c6,
+	0x0016, 0x6110, 0x2158, 0x080c, 0x660f, 0x001e, 0x00ce, 0x00be,
+	0x0005, 0x00b6, 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, 0x6010,
+	0x2058, 0x2009, 0x1837, 0x2104, 0x9085, 0x0003, 0x200a, 0x080c,
+	0xbd11, 0x0560, 0x2009, 0x1837, 0x2104, 0xc0cd, 0x200a, 0x080c,
+	0x6966, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xe58d,
+	0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009,
+	0x0001, 0x080c, 0x3187, 0x00e6, 0x2071, 0x1800, 0x080c, 0x2f96,
+	0x00ee, 0x00c6, 0x0156, 0x20a9, 0x0781, 0x2009, 0x007f, 0x080c,
+	0x32b4, 0x8108, 0x1f04, 0xbcaf, 0x015e, 0x00ce, 0x080c, 0xbc6e,
+	0x2071, 0x0260, 0x2079, 0x0200, 0x7817, 0x0001, 0x2001, 0x1837,
+	0x200c, 0xc1c5, 0x7018, 0xd0fc, 0x0110, 0xd0dc, 0x0118, 0x7038,
+	0xd0dc, 0x1108, 0xc1c4, 0x7817, 0x0000, 0x2001, 0x1837, 0x2102,
+	0x2079, 0x0100, 0x2e04, 0x9084, 0x00ff, 0x2069, 0x181f, 0x206a,
+	0x78e6, 0x0006, 0x8e70, 0x2e04, 0x2069, 0x1820, 0x206a, 0x78ea,
+	0x7832, 0x7836, 0x2010, 0x9084, 0xff00, 0x001e, 0x9105, 0x2009,
+	0x182c, 0x200a, 0x2200, 0x9084, 0x00ff, 0x2008, 0x080c, 0x2887,
+	0x080c, 0x73b0, 0x0170, 0x2071, 0x0260, 0x2069, 0x1982, 0x7048,
+	0x206a, 0x704c, 0x6806, 0x7050, 0x680a, 0x7054, 0x680e, 0x080c,
+	0xcf2a, 0x0040, 0x2001, 0x0006, 0x080c, 0x6550, 0x080c, 0x31e1,
+	0x080c, 0xae47, 0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x00be,
+	0x0005, 0x0096, 0x0026, 0x0036, 0x00e6, 0x0156, 0x2019, 0x182c,
+	0x231c, 0x83ff, 0x01f0, 0x2071, 0x0260, 0x7200, 0x9294, 0x00ff,
+	0x7004, 0x9084, 0xff00, 0x9205, 0x9306, 0x1198, 0x2011, 0x0276,
+	0x20a9, 0x0004, 0x2b48, 0x2019, 0x000a, 0x080c, 0xbe03, 0x1148,
+	0x2011, 0x027a, 0x20a9, 0x0004, 0x2019, 0x0006, 0x080c, 0xbe03,
+	0x1100, 0x015e, 0x00ee, 0x003e, 0x002e, 0x009e, 0x0005, 0x00e6,
+	0x2071, 0x0260, 0x7034, 0x9086, 0x0014, 0x11a8, 0x7038, 0x9086,
+	0x0800, 0x1188, 0x703c, 0xd0ec, 0x0160, 0x9084, 0x0f00, 0x9086,
+	0x0100, 0x1138, 0x7054, 0xd0a4, 0x1110, 0xd0ac, 0x0110, 0x9006,
+	0x0010, 0x9085, 0x0001, 0x00ee, 0x0005, 0x00e6, 0x0096, 0x00c6,
+	0x0076, 0x0056, 0x0046, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000,
+	0x2029, 0x19f0, 0x252c, 0x2021, 0x19f6, 0x2424, 0x2061, 0x1cd0,
+	0x2071, 0x1800, 0x7254, 0x7074, 0x9202, 0x1a04, 0xbdcf, 0x080c,
+	0x8958, 0x0904, 0xbdc8, 0x080c, 0xe5be, 0x0904, 0xbdc8, 0x6720,
+	0x9786, 0x0007, 0x0904, 0xbdc8, 0x2500, 0x9c06, 0x0904, 0xbdc8,
+	0x2400, 0x9c06, 0x05e8, 0x3e08, 0x9186, 0x0002, 0x1148, 0x6010,
+	0x9005, 0x0130, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1580,
+	0x00c6, 0x6000, 0x9086, 0x0004, 0x1110, 0x080c, 0x1a5e, 0x9786,
+	0x000a, 0x0148, 0x080c, 0xcd21, 0x1130, 0x00ce, 0x080c, 0xb7f9,
+	0x080c, 0xae78, 0x00e8, 0x6014, 0x2048, 0x080c, 0xcb1b, 0x01a8,
+	0x9786, 0x0003, 0x1530, 0xa867, 0x0103, 0xa87c, 0xd0cc, 0x0130,
+	0x0096, 0xa878, 0x2048, 0x080c, 0x0fb1, 0x009e, 0xab7a, 0xa877,
+	0x0000, 0x080c, 0x6c6d, 0x080c, 0xcd04, 0x080c, 0xae78, 0x00ce,
+	0x9ce0, 0x0018, 0x7068, 0x9c02, 0x1210, 0x0804, 0xbd72, 0x012e,
+	0x000e, 0x002e, 0x004e, 0x005e, 0x007e, 0x00ce, 0x009e, 0x00ee,
+	0x0005, 0x9786, 0x0006, 0x1118, 0x080c, 0xe530, 0x0c30, 0x9786,
+	0x0009, 0x1148, 0x6000, 0x9086, 0x0004, 0x0d08, 0x2009, 0x004c,
+	0x080c, 0xaec2, 0x08e0, 0x9786, 0x000a, 0x0938, 0x0820, 0x220c,
+	0x2304, 0x9106, 0x1130, 0x8210, 0x8318, 0x1f04, 0xbdef, 0x9006,
+	0x0005, 0x2304, 0x9102, 0x0218, 0x2001, 0x0001, 0x0008, 0x9006,
+	0x918d, 0x0001, 0x0005, 0x0136, 0x01c6, 0x0016, 0x8906, 0x8006,
+	0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9300, 0x2098,
+	0x3518, 0x20a9, 0x0001, 0x220c, 0x4002, 0x910e, 0x1140, 0x8210,
+	0x8319, 0x1dc8, 0x9006, 0x001e, 0x01ce, 0x013e, 0x0005, 0x220c,
+	0x9102, 0x0218, 0x2001, 0x0001, 0x0010, 0x2001, 0x0000, 0x918d,
+	0x0001, 0x001e, 0x01ce, 0x013e, 0x0005, 0x220c, 0x810f, 0x2304,
+	0x9106, 0x1130, 0x8210, 0x8318, 0x1f04, 0xbe2d, 0x9006, 0x0005,
+	0x918d, 0x0001, 0x0005, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0dd5,
+	0x080c, 0xcd10, 0x0120, 0x080c, 0xcd21, 0x0168, 0x0028, 0x080c,
+	0x31e1, 0x080c, 0xcd21, 0x0138, 0x080c, 0x955f, 0x080c, 0xae47,
+	0x080c, 0x9664, 0x0005, 0x080c, 0xb7f9, 0x0cb0, 0x9182, 0x0054,
+	0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xbe72, 0xbe72,
+	0xbe72, 0xbe72, 0xbe72, 0xbe72, 0xbe72, 0xbe72, 0xbe72, 0xbe72,
+	0xbe72, 0xbe74, 0xbe74, 0xbe74, 0xbe74, 0xbe72, 0xbe72, 0xbe72,
+	0xbe74, 0xbe72, 0x080c, 0x0dd5, 0x600b, 0xffff, 0x6003, 0x0001,
+	0x6106, 0x080c, 0x90c7, 0x0126, 0x2091, 0x8000, 0x080c, 0x9664,
+	0x012e, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, 0x9082, 0x0040,
+	0x0804, 0xbf29, 0x9186, 0x0027, 0x1520, 0x080c, 0x955f, 0x080c,
+	0x31bc, 0x080c, 0xd22b, 0x0096, 0x6114, 0x2148, 0x080c, 0xcb1b,
+	0x0198, 0x080c, 0xcd21, 0x1118, 0x080c, 0xb7f9, 0x0068, 0xa867,
+	0x0103, 0xa87b, 0x0029, 0xa877, 0x0000, 0xa97c, 0xc1c5, 0xa97e,
+	0x080c, 0x6c79, 0x080c, 0xcd04, 0x009e, 0x080c, 0xae47, 0x0804,
+	0x9664, 0x9186, 0x0014, 0x1120, 0x6004, 0x9082, 0x0040, 0x04a0,
+	0x9186, 0x0046, 0x0150, 0x9186, 0x0045, 0x0138, 0x9186, 0x0053,
+	0x0120, 0x9186, 0x0048, 0x190c, 0x0dd5, 0x2001, 0x0109, 0x2004,
+	0xd084, 0x0508, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026,
+	0x0036, 0x00f6, 0x00e6, 0x00c6, 0x2079, 0x19e7, 0x2071, 0x1800,
+	0x2061, 0x0100, 0x080c, 0x8fac, 0x00ce, 0x00ee, 0x00fe, 0x003e,
+	0x002e, 0x001e, 0x000e, 0x012e, 0xa001, 0x6000, 0x9086, 0x0002,
+	0x1110, 0x0804, 0xbf67, 0x0005, 0x0002, 0xbf03, 0xbf01, 0xbf01,
+	0xbf01, 0xbf01, 0xbf01, 0xbf01, 0xbf01, 0xbf01, 0xbf01, 0xbf01,
+	0xbf1e, 0xbf1e, 0xbf1e, 0xbf1e, 0xbf01, 0xbf1e, 0xbf01, 0xbf1e,
+	0xbf01, 0x080c, 0x0dd5, 0x080c, 0x955f, 0x0096, 0x6114, 0x2148,
+	0x080c, 0xcb1b, 0x0168, 0xa867, 0x0103, 0xa87b, 0x0006, 0xa877,
+	0x0000, 0xa880, 0xc0ec, 0xa882, 0x080c, 0x6c79, 0x080c, 0xcd04,
+	0x009e, 0x080c, 0xae47, 0x080c, 0x9664, 0x0005, 0x080c, 0x955f,
+	0x080c, 0xcd21, 0x090c, 0xb7f9, 0x080c, 0xae47, 0x080c, 0x9664,
+	0x0005, 0x0002, 0xbf40, 0xbf3e, 0xbf3e, 0xbf3e, 0xbf3e, 0xbf3e,
+	0xbf3e, 0xbf3e, 0xbf3e, 0xbf3e, 0xbf3e, 0xbf57, 0xbf57, 0xbf57,
+	0xbf57, 0xbf3e, 0xbf61, 0xbf3e, 0xbf57, 0xbf3e, 0x080c, 0x0dd5,
+	0x0096, 0x080c, 0x955f, 0x6014, 0x2048, 0x2001, 0x1988, 0x2004,
+	0x6042, 0xa97c, 0xd1ac, 0x0140, 0x6003, 0x0004, 0xa87c, 0x9085,
+	0x0400, 0xa87e, 0x009e, 0x0005, 0x6003, 0x0002, 0x0cb8, 0x080c,
+	0x955f, 0x080c, 0xd22e, 0x080c, 0xd233, 0x6003, 0x000f, 0x0804,
+	0x9664, 0x080c, 0x955f, 0x080c, 0xae47, 0x0804, 0x9664, 0x9182,
+	0x0054, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xbf83,
+	0xbf83, 0xbf83, 0xbf83, 0xbf83, 0xbf85, 0xc062, 0xbf83, 0xc096,
+	0xbf83, 0xbf83, 0xbf83, 0xbf83, 0xbf83, 0xbf83, 0xbf83, 0xbf83,
+	0xbf83, 0xbf83, 0xc096, 0x080c, 0x0dd5, 0x00b6, 0x0096, 0x6114,
+	0x2148, 0x7644, 0x96b4, 0x0fff, 0x86ff, 0x1528, 0x6010, 0x2058,
+	0xb800, 0xd0bc, 0x1904, 0xc051, 0xa87b, 0x0000, 0xa867, 0x0103,
+	0xae76, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c,
+	0xc22b, 0x080c, 0x6a95, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110,
+	0x8211, 0xba3e, 0x7044, 0xd0e4, 0x1904, 0xc035, 0x080c, 0xae47,
+	0x009e, 0x00be, 0x0005, 0x968c, 0x0c00, 0x0150, 0x6010, 0x2058,
+	0xb800, 0xd0bc, 0x1904, 0xc039, 0x7348, 0xab92, 0x734c, 0xab8e,
+	0x968c, 0x00ff, 0x9186, 0x0002, 0x0508, 0x9186, 0x0028, 0x1118,
+	0xa87b, 0x001c, 0x00e8, 0xd6dc, 0x01a0, 0xa87b, 0x0015, 0xa87c,
+	0xd0ac, 0x0170, 0xa938, 0xaa34, 0x2100, 0x9205, 0x0148, 0x7048,
+	0x9106, 0x1118, 0x704c, 0x9206, 0x0118, 0xa992, 0xaa8e, 0xc6dc,
+	0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000,
+	0xa867, 0x0103, 0xae76, 0x901e, 0xd6c4, 0x01d8, 0x9686, 0x0100,
+	0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4, 0x0804, 0xbf8c, 0x735c,
+	0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008,
+	0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, 0xc716,
+	0x003e, 0xd6cc, 0x0904, 0xbfa1, 0x7154, 0xa98a, 0x81ff, 0x0904,
+	0xbfa1, 0x9192, 0x0021, 0x1278, 0x8304, 0x9098, 0x0018, 0x2011,
+	0x0029, 0x080c, 0xc716, 0x2011, 0x0205, 0x2013, 0x0000, 0x080c,
+	0xd1bb, 0x0804, 0xbfa1, 0xa868, 0xd0fc, 0x0120, 0x2009, 0x0020,
+	0xa98a, 0x0c50, 0x00a6, 0x2950, 0x080c, 0xc6b5, 0x00ae, 0x080c,
+	0xd1bb, 0x080c, 0xc706, 0x0804, 0xbfa3, 0x080c, 0xce14, 0x0804,
+	0xbfb0, 0xa87c, 0xd0ac, 0x0904, 0xbfbc, 0xa880, 0xd0bc, 0x1904,
+	0xbfbc, 0x7348, 0xa838, 0x9306, 0x11c8, 0x734c, 0xa834, 0x931e,
+	0x0904, 0xbfbc, 0xd6d4, 0x0190, 0xab38, 0x9305, 0x0904, 0xbfbc,
+	0x0068, 0xa87c, 0xd0ac, 0x0904, 0xbf94, 0xa838, 0xa934, 0x9105,
+	0x0904, 0xbf94, 0xa880, 0xd0bc, 0x1904, 0xbf94, 0x080c, 0xce4e,
+	0x0804, 0xbfb0, 0x0096, 0x00f6, 0x6003, 0x0003, 0x6007, 0x0043,
+	0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6014, 0x2048,
+	0xa87c, 0xd0ac, 0x0140, 0x6003, 0x0002, 0x00fe, 0x009e, 0x0005,
+	0x2130, 0x2228, 0x0058, 0x2400, 0xa9ac, 0x910a, 0x2300, 0xaab0,
+	0x9213, 0x2600, 0x9102, 0x2500, 0x9203, 0x0e90, 0xac36, 0xab3a,
+	0xae46, 0xad4a, 0x00fe, 0x6043, 0x0000, 0x2c10, 0x080c, 0x1bad,
+	0x080c, 0x912c, 0x080c, 0x9790, 0x009e, 0x0005, 0x0005, 0x9182,
+	0x0054, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xc0b3,
+	0xc0b3, 0xc0b3, 0xc0b3, 0xc0b3, 0xc0b5, 0xc14b, 0xc0b3, 0xc0b3,
+	0xc162, 0xc1ee, 0xc0b3, 0xc0b3, 0xc0b3, 0xc0b3, 0xc203, 0xc0b3,
+	0xc0b3, 0xc0b3, 0xc0b3, 0x080c, 0x0dd5, 0x0076, 0x00a6, 0x00e6,
+	0x0096, 0x2071, 0x0260, 0x6114, 0x2150, 0x7644, 0xb676, 0x96b4,
+	0x0fff, 0xb77c, 0xc7e5, 0xb77e, 0x6210, 0x00b6, 0x2258, 0xba3c,
+	0x82ff, 0x0110, 0x8211, 0xba3e, 0x00be, 0x86ff, 0x0904, 0xc146,
+	0x9694, 0xff00, 0x9284, 0x0c00, 0x0120, 0x7048, 0xb092, 0x704c,
+	0xb08e, 0x9284, 0x0300, 0x0904, 0xc146, 0x080c, 0x0fff, 0x090c,
+	0x0dd5, 0x2900, 0xb07a, 0xb77c, 0xc7cd, 0xb77e, 0xa867, 0x0103,
+	0xb068, 0xa86a, 0xb06c, 0xa86e, 0xb070, 0xa872, 0xae76, 0x968c,
+	0x0c00, 0x0120, 0x7348, 0xab92, 0x734c, 0xab8e, 0x968c, 0x00ff,
+	0x9186, 0x0002, 0x0180, 0x9186, 0x0028, 0x1118, 0xa87b, 0x001c,
+	0x0060, 0xd6dc, 0x0118, 0xa87b, 0x0015, 0x0038, 0xd6d4, 0x0118,
+	0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, 0xaf7e, 0xb080, 0xa882,
+	0xb084, 0xa886, 0x901e, 0xd6c4, 0x0190, 0x735c, 0xab86, 0x83ff,
+	0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308,
+	0x2019, 0x0018, 0x2011, 0x0025, 0x080c, 0xc716, 0x003e, 0xd6cc,
+	0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8, 0x9192, 0x0021, 0x1260,
+	0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xc716, 0x2011,
+	0x0205, 0x2013, 0x0000, 0x0050, 0xb068, 0xd0fc, 0x0120, 0x2009,
+	0x0020, 0xa98a, 0x0c68, 0x2950, 0x080c, 0xc6b5, 0x009e, 0x00ee,
+	0x00ae, 0x007e, 0x0005, 0x00f6, 0x00a6, 0x6003, 0x0003, 0x2079,
+	0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6014, 0x2050, 0xb436,
+	0xb33a, 0xb646, 0xb54a, 0x00ae, 0x00fe, 0x2c10, 0x080c, 0x1bad,
+	0x0804, 0xa226, 0x6003, 0x0002, 0x6004, 0x9086, 0x0040, 0x11c8,
+	0x0096, 0x6014, 0x2048, 0xa87c, 0xd0ac, 0x0160, 0x601c, 0xd084,
+	0x1130, 0x00f6, 0x2c00, 0x2078, 0x080c, 0x1725, 0x00fe, 0x6003,
+	0x0004, 0x0010, 0x6003, 0x0002, 0x009e, 0x080c, 0x955f, 0x080c,
+	0x9664, 0x0096, 0x2001, 0x1988, 0x2004, 0x6042, 0x080c, 0x9614,
+	0x080c, 0x9790, 0x6114, 0x2148, 0xa97c, 0xd1e4, 0x0904, 0xc1e9,
+	0xd1cc, 0x05a8, 0xa978, 0xa868, 0xd0fc, 0x0538, 0x0016, 0xa87c,
+	0x0006, 0xa880, 0x0006, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0019,
+	0x20a0, 0x810e, 0x810e, 0x810f, 0x9184, 0x003f, 0x20e0, 0x9184,
+	0xffc0, 0x9080, 0x0019, 0x2098, 0x0156, 0x20a9, 0x0020, 0x4003,
+	0x015e, 0x000e, 0xa882, 0x000e, 0xa87e, 0x001e, 0xa874, 0x0006,
+	0x2148, 0x080c, 0x0fb1, 0x001e, 0x0440, 0x0016, 0x080c, 0x0fb1,
+	0x009e, 0xa974, 0x0016, 0x080c, 0xc706, 0x001e, 0x00f0, 0xa867,
+	0x0103, 0xa974, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x0180, 0x9086,
+	0x0028, 0x1118, 0xa87b, 0x001c, 0x0060, 0xd1dc, 0x0118, 0xa87b,
+	0x0015, 0x0038, 0xd1d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b,
+	0x0000, 0x0016, 0x080c, 0x6a95, 0x001e, 0xd1e4, 0x1120, 0x080c,
+	0xae47, 0x009e, 0x0005, 0x080c, 0xce14, 0x0cd8, 0x6004, 0x9086,
+	0x0040, 0x1120, 0x080c, 0x955f, 0x080c, 0x9664, 0x2019, 0x0001,
+	0x080c, 0xa59c, 0x6003, 0x0002, 0x080c, 0xd233, 0x080c, 0x9614,
+	0x080c, 0x9790, 0x0005, 0x6004, 0x9086, 0x0040, 0x1120, 0x080c,
+	0x955f, 0x080c, 0x9664, 0x2019, 0x0001, 0x080c, 0xa59c, 0x080c,
+	0x9614, 0x080c, 0x31bc, 0x080c, 0xd22b, 0x0096, 0x6114, 0x2148,
+	0x080c, 0xcb1b, 0x0150, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877,
+	0x0000, 0x080c, 0x6c79, 0x080c, 0xcd04, 0x009e, 0x080c, 0xae47,
+	0x080c, 0x9790, 0x0005, 0xa87b, 0x0015, 0xd1fc, 0x0180, 0xa87b,
+	0x0007, 0x8002, 0x8000, 0x810a, 0x9189, 0x0000, 0x0006, 0x0016,
+	0x2009, 0x1a7a, 0x2104, 0x8000, 0x200a, 0x001e, 0x000e, 0xa992,
+	0xa88e, 0x0005, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208,
+	0x000a, 0x0005, 0xc25e, 0xc25e, 0xc25e, 0xc25e, 0xc25e, 0xc260,
+	0xc25e, 0xc25e, 0xc306, 0xc25e, 0xc25e, 0xc25e, 0xc25e, 0xc25e,
+	0xc25e, 0xc25e, 0xc25e, 0xc25e, 0xc25e, 0xc437, 0x080c, 0x0dd5,
+	0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260, 0x6114, 0x2150,
+	0x7644, 0xb676, 0x96b4, 0x0fff, 0xb77c, 0xc7e5, 0xb77e, 0x6210,
+	0x00b6, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0x00be,
+	0x86ff, 0x0904, 0xc2ff, 0x9694, 0xff00, 0x9284, 0x0c00, 0x0120,
+	0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, 0xc2ff,
+	0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4, 0xb676,
+	0x0c38, 0x080c, 0x0fff, 0x090c, 0x0dd5, 0x2900, 0xb07a, 0xb77c,
+	0x97bd, 0x0200, 0xb77e, 0xa867, 0x0103, 0xb068, 0xa86a, 0xb06c,
+	0xa86e, 0xb070, 0xa872, 0x7044, 0x9084, 0xf000, 0x9635, 0xae76,
+	0x968c, 0x0c00, 0x0120, 0x7348, 0xab92, 0x734c, 0xab8e, 0x968c,
+	0x00ff, 0x9186, 0x0002, 0x0180, 0x9186, 0x0028, 0x1118, 0xa87b,
+	0x001c, 0x0060, 0xd6dc, 0x0118, 0xa87b, 0x0015, 0x0038, 0xd6d4,
+	0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, 0xaf7e, 0xb080,
+	0xa882, 0xb084, 0xa886, 0x901e, 0xd6c4, 0x0190, 0x735c, 0xab86,
+	0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036,
+	0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, 0xc716, 0x003e,
+	0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8, 0x9192, 0x0021,
+	0x1260, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xc716,
+	0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0xb068, 0xd0fc, 0x0120,
+	0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, 0x080c, 0xc6b5, 0x080c,
+	0x1a3c, 0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005, 0x2001, 0x1988,
+	0x2004, 0x6042, 0x0096, 0x6114, 0x2148, 0xa83c, 0xa940, 0x9105,
+	0x1118, 0xa87c, 0xc0dc, 0xa87e, 0x6003, 0x0002, 0xa97c, 0xd1e4,
+	0x0904, 0xc432, 0x6043, 0x0000, 0x6010, 0x00b6, 0x2058, 0xb800,
+	0x00be, 0xd0bc, 0x1500, 0xd1cc, 0x0904, 0xc401, 0xa978, 0xa868,
+	0xd0fc, 0x0904, 0xc3c2, 0x0016, 0xa87c, 0x0006, 0xa880, 0x0006,
+	0x00a6, 0x2150, 0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x0904,
+	0xc390, 0x9086, 0x0028, 0x1904, 0xc37c, 0xa87b, 0x001c, 0xb07b,
+	0x001c, 0x0804, 0xc398, 0x6024, 0xd0f4, 0x11d0, 0xa838, 0xaa34,
+	0x9205, 0x09c8, 0xa838, 0xaa90, 0x9206, 0x1120, 0xa88c, 0xaa34,
+	0x9206, 0x0988, 0x6024, 0xd0d4, 0x1148, 0xa9ac, 0xa834, 0x9102,
+	0x603a, 0xa9b0, 0xa838, 0x9103, 0x603e, 0x6024, 0xc0f5, 0x6026,
+	0x6010, 0x00b6, 0x2058, 0xb83c, 0x8000, 0xb83e, 0x00be, 0x9006,
+	0xa876, 0xa892, 0xa88e, 0xa87c, 0xc0e4, 0xa87e, 0xd0cc, 0x0140,
+	0xc0cc, 0xa87e, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fb1, 0x009e,
+	0x080c, 0xce4e, 0x0804, 0xc432, 0xd1dc, 0x0158, 0xa87b, 0x0015,
+	0xb07b, 0x0015, 0x080c, 0xd0de, 0x0118, 0xb174, 0xc1dc, 0xb176,
+	0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, 0x0007, 0x0040,
+	0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xc22b,
+	0xa87c, 0xb07e, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa860, 0x20e8,
+	0xa85c, 0x9080, 0x0019, 0x20a0, 0x20a9, 0x0020, 0x8a06, 0x8006,
+	0x8007, 0x9094, 0x003f, 0x22e0, 0x9084, 0xffc0, 0x9080, 0x0019,
+	0x2098, 0x4003, 0x00ae, 0x000e, 0xa882, 0x000e, 0xa87e, 0x080c,
+	0xd1bb, 0x001e, 0xa874, 0x0006, 0x2148, 0x080c, 0x0fb1, 0x001e,
+	0x0804, 0xc42e, 0x0016, 0x00a6, 0x2150, 0xb174, 0x9184, 0x00ff,
+	0x90b6, 0x0002, 0x01e0, 0x9086, 0x0028, 0x1128, 0xa87b, 0x001c,
+	0xb07b, 0x001c, 0x00e0, 0xd1dc, 0x0158, 0xa87b, 0x0015, 0xb07b,
+	0x0015, 0x080c, 0xd0de, 0x0118, 0xb174, 0xc1dc, 0xb176, 0x0078,
+	0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, 0x0007, 0x0040, 0xa87c,
+	0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xc22b, 0xa890,
+	0xb092, 0xa88c, 0xb08e, 0xa87c, 0xb07e, 0x00ae, 0x080c, 0x0fb1,
+	0x009e, 0x080c, 0xd1bb, 0xa974, 0x0016, 0x080c, 0xc706, 0x001e,
+	0x0468, 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff, 0x90b6, 0x0002,
+	0x01b0, 0x9086, 0x0028, 0x1118, 0xa87b, 0x001c, 0x00d0, 0xd1dc,
+	0x0148, 0xa87b, 0x0015, 0x080c, 0xd0de, 0x0118, 0xa974, 0xc1dc,
+	0xa976, 0x0078, 0xd1d4, 0x0118, 0xa87b, 0x0007, 0x0050, 0xa87b,
+	0x0000, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c,
+	0xc22b, 0xa974, 0x0016, 0x080c, 0x6a95, 0x001e, 0xd1e4, 0x1120,
+	0x080c, 0xae47, 0x009e, 0x0005, 0x080c, 0xce14, 0x0cd8, 0x6114,
+	0x0096, 0x2148, 0xa97c, 0xd1e4, 0x190c, 0x1a4a, 0x009e, 0x0005,
+	0x080c, 0x955f, 0x0010, 0x080c, 0x9614, 0x080c, 0xcb1b, 0x01f0,
+	0x0096, 0x6114, 0x2148, 0x080c, 0xcd21, 0x1118, 0x080c, 0xb7f9,
+	0x00a0, 0xa867, 0x0103, 0x2009, 0x180c, 0x210c, 0xd18c, 0x11b8,
+	0xd184, 0x1190, 0x6108, 0xa97a, 0x918e, 0x0029, 0x1110, 0x080c,
+	0xe8e7, 0xa877, 0x0000, 0x080c, 0x6c79, 0x009e, 0x080c, 0xae47,
+	0x080c, 0x9664, 0x0804, 0x9790, 0xa87b, 0x0004, 0x0c90, 0xa87b,
+	0x0004, 0x0c78, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208,
+	0x000a, 0x0005, 0xc48e, 0xc48e, 0xc48e, 0xc48e, 0xc48e, 0xc490,
+	0xc48e, 0xc48e, 0xc48e, 0xc48e, 0xc48e, 0xc48e, 0xc48e, 0xc48e,
+	0xc48e, 0xc48e, 0xc48e, 0xc48e, 0xc48e, 0xc48e, 0x080c, 0x0dd5,
+	0x080c, 0x56d8, 0x01f8, 0x6014, 0x7144, 0x918c, 0x0fff, 0x9016,
+	0xd1c4, 0x0118, 0x7264, 0x9294, 0x00ff, 0x0096, 0x904d, 0x0188,
+	0xa87b, 0x0000, 0xa864, 0x9086, 0x0139, 0x0128, 0xa867, 0x0103,
+	0xa976, 0xaa96, 0x0030, 0xa897, 0x4000, 0xa99a, 0xaa9e, 0x080c,
+	0x6c79, 0x009e, 0x0804, 0xae47, 0x9182, 0x0085, 0x0002, 0xc4c6,
+	0xc4c4, 0xc4c4, 0xc4d2, 0xc4c4, 0xc4c4, 0xc4c4, 0xc4c4, 0xc4c4,
+	0xc4c4, 0xc4c4, 0xc4c4, 0xc4c4, 0x080c, 0x0dd5, 0x6003, 0x0001,
+	0x6106, 0x080c, 0x90c7, 0x0126, 0x2091, 0x8000, 0x080c, 0x9664,
+	0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6, 0x2071, 0x0260,
+	0x7224, 0x6216, 0x7220, 0x080c, 0xcb09, 0x01a0, 0x2268, 0x6800,
+	0x9086, 0x0000, 0x0178, 0x6010, 0x6d10, 0x952e, 0x1158, 0x00c6,
+	0x2d60, 0x080c, 0xc741, 0x00ce, 0x0128, 0x6803, 0x0002, 0x6007,
+	0x0086, 0x0010, 0x6007, 0x0087, 0x6003, 0x0001, 0x080c, 0x90c7,
+	0x080c, 0x9664, 0x9280, 0x0004, 0x00b6, 0x2058, 0xb800, 0x00be,
+	0xd0bc, 0x0140, 0x6824, 0xd0ec, 0x0128, 0x00c6, 0x2260, 0x080c,
+	0xce4e, 0x00ce, 0x00ee, 0x00de, 0x005e, 0x002e, 0x0005, 0x9186,
+	0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0dd5, 0x908a,
+	0x0092, 0x1a0c, 0x0dd5, 0x9082, 0x0085, 0x00e2, 0x9186, 0x0027,
+	0x0120, 0x9186, 0x0014, 0x190c, 0x0dd5, 0x080c, 0x955f, 0x0096,
+	0x6014, 0x2048, 0x080c, 0xcb1b, 0x0140, 0xa867, 0x0103, 0xa877,
+	0x0000, 0xa87b, 0x0029, 0x080c, 0x6c79, 0x009e, 0x080c, 0xae78,
+	0x0804, 0x9664, 0xc547, 0xc549, 0xc549, 0xc547, 0xc547, 0xc547,
+	0xc547, 0xc547, 0xc547, 0xc547, 0xc547, 0xc547, 0xc547, 0x080c,
+	0x0dd5, 0x080c, 0x955f, 0x080c, 0xae78, 0x080c, 0x9664, 0x0005,
+	0x9186, 0x0013, 0x1128, 0x6004, 0x9082, 0x0085, 0x2008, 0x04b8,
+	0x9186, 0x0027, 0x11f8, 0x080c, 0x955f, 0x080c, 0x31bc, 0x080c,
+	0xd22b, 0x0096, 0x6014, 0x2048, 0x080c, 0xcb1b, 0x0150, 0xa867,
+	0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x6c79, 0x080c,
+	0xcd04, 0x009e, 0x080c, 0xae47, 0x080c, 0x9664, 0x0005, 0x080c,
+	0xaedd, 0x0ce0, 0x9186, 0x0014, 0x1dd0, 0x080c, 0x955f, 0x0096,
+	0x6014, 0x2048, 0x080c, 0xcb1b, 0x0d60, 0xa867, 0x0103, 0xa877,
+	0x0000, 0xa87b, 0x0006, 0xa880, 0xc0ec, 0xa882, 0x08f0, 0x0002,
+	0xc59f, 0xc59d, 0xc59d, 0xc59d, 0xc59d, 0xc59d, 0xc5b7, 0xc59d,
+	0xc59d, 0xc59d, 0xc59d, 0xc59d, 0xc59d, 0x080c, 0x0dd5, 0x080c,
+	0x955f, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118,
+	0x9186, 0x0035, 0x1118, 0x2001, 0x1986, 0x0010, 0x2001, 0x1987,
+	0x2004, 0x601a, 0x6003, 0x000c, 0x080c, 0x9664, 0x0005, 0x080c,
+	0x955f, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118,
+	0x9186, 0x0035, 0x1118, 0x2001, 0x1986, 0x0010, 0x2001, 0x1987,
+	0x2004, 0x601a, 0x6003, 0x000e, 0x080c, 0x9664, 0x0005, 0x9182,
+	0x0092, 0x1220, 0x9182, 0x0085, 0x0208, 0x0012, 0x0804, 0xaedd,
+	0xc5e5, 0xc5e5, 0xc5e5, 0xc5e5, 0xc5e7, 0xc634, 0xc5e5, 0xc5e5,
+	0xc5e5, 0xc5e5, 0xc5e5, 0xc5e5, 0xc5e5, 0x080c, 0x0dd5, 0x0096,
+	0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0168, 0x6034,
 	0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035,
-	0x1118, 0x080c, 0x306e, 0x0868, 0x080c, 0xab9c, 0x0005, 0x6000,
-	0x908a, 0x0016, 0x1a0c, 0x0dd5, 0x0002, 0xc805, 0xc805, 0xc807,
-	0xc807, 0xc807, 0xc805, 0xc805, 0xab9c, 0xc805, 0xc805, 0xc805,
-	0xc805, 0xc805, 0xc805, 0xc805, 0xc805, 0x080c, 0x0dd5, 0x080c,
-	0xa4d6, 0x6114, 0x0096, 0x2148, 0xa87b, 0x0006, 0x080c, 0x6a46,
-	0x009e, 0x0804, 0xab6b, 0x9284, 0x0007, 0x1158, 0x9282, 0x1cd0,
-	0x0240, 0x2001, 0x181a, 0x2004, 0x9202, 0x1218, 0x9085, 0x0001,
-	0x0005, 0x9006, 0x0ce8, 0x0096, 0x0028, 0x0096, 0x0006, 0x6014,
-	0x2048, 0x000e, 0x0006, 0x9984, 0xf000, 0x9086, 0xf000, 0x0110,
-	0x080c, 0x10ab, 0x000e, 0x009e, 0x0005, 0x00e6, 0x00c6, 0x0036,
-	0x0006, 0x0126, 0x2091, 0x8000, 0x2061, 0x1cd0, 0x2071, 0x1800,
-	0x7354, 0x7074, 0x9302, 0x1640, 0x6020, 0x9206, 0x11f8, 0x080c,
-	0xcf18, 0x0180, 0x9286, 0x0001, 0x1168, 0x6004, 0x9086, 0x0004,
-	0x1148, 0x080c, 0x306e, 0x080c, 0xcf2d, 0x00c6, 0x080c, 0xab9c,
-	0x00ce, 0x0060, 0x080c, 0xcc0d, 0x0148, 0x080c, 0xca24, 0x1110,
-	0x080c, 0xb51d, 0x00c6, 0x080c, 0xab6b, 0x00ce, 0x9ce0, 0x0018,
-	0x7068, 0x9c02, 0x1208, 0x08a0, 0x012e, 0x000e, 0x003e, 0x00ce,
-	0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000, 0x210c,
-	0x81ff, 0x0128, 0x2061, 0x1aa7, 0x6112, 0x080c, 0x306e, 0x9006,
-	0x0010, 0x9085, 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6,
-	0x0126, 0x2091, 0x8000, 0x080c, 0xab15, 0x01d8, 0x080c, 0x54bf,
-	0x0110, 0x662e, 0x0008, 0x6616, 0x2b00, 0x6012, 0x080c, 0x54bf,
-	0x0118, 0x080c, 0xc94b, 0x0168, 0x080c, 0xcc93, 0x6023, 0x0003,
-	0x2009, 0x004b, 0x080c, 0xabe6, 0x9085, 0x0001, 0x012e, 0x00ce,
-	0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0xbaa0,
-	0x080c, 0xabb9, 0x0590, 0x080c, 0x54bf, 0x0118, 0x602f, 0x0000,
-	0x0010, 0x6017, 0x0000, 0x2b00, 0x6012, 0x080c, 0xcc93, 0x6023,
-	0x0003, 0x0016, 0x080c, 0x901a, 0x0076, 0x903e, 0x080c, 0x8ef7,
-	0x2c08, 0x080c, 0xdfbd, 0x007e, 0x001e, 0xd184, 0x0128, 0x080c,
-	0xab6b, 0x9085, 0x0001, 0x0070, 0x080c, 0x54bf, 0x0128, 0xd18c,
-	0x1170, 0x080c, 0xc94b, 0x0148, 0x2009, 0x004c, 0x080c, 0xabe6,
-	0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2900,
-	0x6016, 0x0c90, 0x2009, 0x004d, 0x0010, 0x2009, 0x004e, 0x00f6,
-	0x00c6, 0x0046, 0x0016, 0x080c, 0xab15, 0x2c78, 0x01d8, 0x080c,
-	0x54bf, 0x0110, 0x7e2e, 0x0008, 0x7e16, 0x2b00, 0x7812, 0x7823,
-	0x0003, 0x2021, 0x0005, 0x080c, 0xc95d, 0x2f60, 0x080c, 0x54bf,
-	0x0118, 0x080c, 0xc94b, 0x0130, 0x001e, 0x0016, 0x080c, 0xabe6,
-	0x9085, 0x0001, 0x001e, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6,
-	0x00c6, 0x0046, 0x080c, 0xab15, 0x2c78, 0x0530, 0x080c, 0x54bf,
-	0x0110, 0x7e2e, 0x0008, 0x7e16, 0x2b00, 0x7812, 0x7823, 0x0003,
-	0x0096, 0x2021, 0x0004, 0x0489, 0x009e, 0x2001, 0x197e, 0x200c,
-	0xd1fc, 0x0120, 0x2f60, 0x080c, 0xab6b, 0x0060, 0x2f60, 0x080c,
-	0x54bf, 0x0120, 0xd18c, 0x1160, 0x0071, 0x0130, 0x2009, 0x0052,
-	0x080c, 0xabe6, 0x9085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005,
-	0x2900, 0x7816, 0x0c98, 0x00c6, 0x080c, 0x489b, 0x00ce, 0x1120,
-	0x080c, 0xab6b, 0x9006, 0x0005, 0xa867, 0x0000, 0xa86b, 0x8000,
-	0x2900, 0x6016, 0x9085, 0x0001, 0x0005, 0x0096, 0x0076, 0x0126,
-	0x2091, 0x8000, 0x080c, 0x6501, 0x0158, 0x2001, 0xc962, 0x0006,
-	0x900e, 0x2400, 0x080c, 0x6c85, 0x080c, 0x6a46, 0x000e, 0x0807,
-	0x2418, 0x080c, 0x92b1, 0xbaa0, 0x0086, 0x2041, 0x0001, 0x2039,
-	0x0001, 0x2608, 0x080c, 0x9032, 0x008e, 0x080c, 0x8ef7, 0x2f08,
-	0x2648, 0x080c, 0xdfbd, 0xb93c, 0x81ff, 0x090c, 0x9103, 0x080c,
-	0x941c, 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, 0x2091,
-	0x8000, 0x080c, 0xab15, 0x0190, 0x660a, 0x2b08, 0x6112, 0x080c,
-	0xcc93, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x001f, 0x080c,
-	0xabe6, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8,
-	0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xabb9, 0x01b8, 0x660a,
-	0x2b08, 0x6112, 0x080c, 0xcc93, 0x6023, 0x0008, 0x2900, 0x6016,
-	0x00f6, 0x2c78, 0x080c, 0x1689, 0x00fe, 0x2009, 0x0021, 0x080c,
-	0xabe6, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8,
-	0x2009, 0x003d, 0x00c6, 0x0126, 0x0016, 0x2091, 0x8000, 0x080c,
-	0xab15, 0x0198, 0x660a, 0x2b08, 0x6112, 0x080c, 0xcc93, 0x6023,
-	0x0001, 0x2900, 0x6016, 0x001e, 0x0016, 0x080c, 0xabe6, 0x9085,
-	0x0001, 0x001e, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd0, 0x00c6,
-	0x0126, 0x2091, 0x8000, 0x080c, 0xabb9, 0x0188, 0x2b08, 0x6112,
-	0x080c, 0xcc93, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x0000,
-	0x080c, 0xabe6, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006,
-	0x0cd8, 0x2009, 0x0044, 0x0830, 0x2009, 0x0049, 0x0818, 0x0026,
-	0x00b6, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e,
-	0x00be, 0x002e, 0x0005, 0x0006, 0x0016, 0x6004, 0x908e, 0x0002,
-	0x0140, 0x908e, 0x0003, 0x0128, 0x908e, 0x0004, 0x0110, 0x9085,
-	0x0001, 0x001e, 0x000e, 0x0005, 0x0006, 0x0096, 0x6020, 0x9086,
-	0x0004, 0x0190, 0x6014, 0x904d, 0x080c, 0xc825, 0x0168, 0xa864,
-	0x9086, 0x0139, 0x0158, 0x6020, 0x9086, 0x0003, 0x0128, 0xa868,
-	0xd0fc, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x009e, 0x000e,
-	0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xabb9, 0x0198,
-	0x2b08, 0x6112, 0x080c, 0xcc93, 0x6023, 0x0001, 0x2900, 0x6016,
-	0x080c, 0x306e, 0x2009, 0x0028, 0x080c, 0xabe6, 0x9085, 0x0001,
-	0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x9186, 0x0015, 0x11a8,
-	0x2011, 0x1824, 0x2204, 0x9086, 0x0074, 0x1178, 0x00b6, 0x080c,
-	0xb76f, 0x00be, 0x080c, 0xb992, 0x6003, 0x0001, 0x6007, 0x0029,
-	0x080c, 0x8ec7, 0x080c, 0x941c, 0x0078, 0x6014, 0x0096, 0x2048,
-	0xa868, 0x009e, 0xd0fc, 0x0148, 0x2001, 0x0001, 0x080c, 0xce51,
-	0x080c, 0xb51d, 0x080c, 0xab6b, 0x0005, 0x0096, 0x6014, 0x904d,
-	0x090c, 0x0dd5, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005,
-	0xa89b, 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x6a46, 0x012e, 0x009e, 0x080c, 0xab6b, 0x0c30, 0x0096, 0x9186,
-	0x0016, 0x1128, 0x2001, 0x0004, 0x080c, 0x631d, 0x00e8, 0x9186,
-	0x0015, 0x1510, 0x2011, 0x1824, 0x2204, 0x9086, 0x0014, 0x11e0,
-	0x6010, 0x00b6, 0x2058, 0x080c, 0x6468, 0x00be, 0x080c, 0xba63,
-	0x1198, 0x6010, 0x00b6, 0x2058, 0xb890, 0x00be, 0x9005, 0x0160,
-	0x2001, 0x0006, 0x080c, 0x631d, 0x6014, 0x2048, 0xa868, 0xd0fc,
-	0x0170, 0x080c, 0xaf6f, 0x0048, 0x6014, 0x2048, 0xa868, 0xd0fc,
-	0x0528, 0x080c, 0xb51d, 0x080c, 0xab6b, 0x009e, 0x0005, 0x6014,
-	0x6310, 0x2358, 0x904d, 0x090c, 0x0dd5, 0xa87b, 0x0000, 0xa883,
-	0x0000, 0xa897, 0x4000, 0x900e, 0x080c, 0x65ed, 0x1108, 0xc185,
-	0xb800, 0xd0bc, 0x0108, 0xc18d, 0xa99a, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x6a46, 0x012e, 0x080c, 0xab6b, 0x08f8, 0x6014, 0x904d,
-	0x090c, 0x0dd5, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005,
-	0xa89b, 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x6a46, 0x012e, 0x080c, 0xab6b, 0x0840, 0xa878, 0x9086, 0x0005,
-	0x1108, 0x0009, 0x0005, 0xa880, 0xc0ad, 0xa882, 0x0005, 0x6043,
-	0x0000, 0x6017, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c,
-	0x8e7f, 0x080c, 0x941c, 0x0005, 0x00c6, 0x6010, 0x00b6, 0x2058,
-	0xb800, 0x00be, 0xd0bc, 0x0120, 0x6020, 0x9084, 0x000f, 0x0013,
-	0x00ce, 0x0005, 0xc55a, 0xcb43, 0xcb43, 0xcb46, 0xe2ca, 0xe2e5,
-	0xe2e8, 0xc55a, 0xc55a, 0xc55a, 0xc55a, 0xc55a, 0xc55a, 0xc55a,
-	0xc55a, 0x080c, 0x0dd5, 0xa001, 0xa001, 0x0005, 0x0096, 0x6014,
-	0x904d, 0x0118, 0xa87c, 0xd0e4, 0x1110, 0x009e, 0x0010, 0x009e,
-	0x0005, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0550,
-	0x2001, 0x1834, 0x2004, 0x9005, 0x1540, 0x00f6, 0x2c78, 0x080c,
-	0xab15, 0x0508, 0x7810, 0x6012, 0x080c, 0xcc93, 0x7820, 0x9086,
-	0x0003, 0x0128, 0x7808, 0x603a, 0x2f00, 0x603e, 0x0020, 0x7808,
-	0x603e, 0x2f00, 0x603a, 0x602e, 0x6023, 0x0001, 0x6007, 0x0035,
-	0x6003, 0x0001, 0x7954, 0x6156, 0x080c, 0x8e7f, 0x080c, 0x941c,
-	0x2f60, 0x00fe, 0x0005, 0x2f60, 0x00fe, 0x2001, 0x1986, 0x2004,
-	0x6042, 0x0005, 0x0016, 0x0096, 0x6814, 0x2048, 0xa87c, 0xd0e4,
-	0x0180, 0xc0e4, 0xa87e, 0xa877, 0x0000, 0xa893, 0x0000, 0xa88f,
-	0x0000, 0xd0cc, 0x0130, 0xc0cc, 0xa87e, 0xa878, 0x2048, 0x080c,
-	0x0fb2, 0x6830, 0x6036, 0x908e, 0x0001, 0x0148, 0x6803, 0x0002,
-	0x9086, 0x0005, 0x0170, 0x9006, 0x602e, 0x6032, 0x00d0, 0x681c,
-	0xc085, 0x681e, 0x6803, 0x0004, 0x6824, 0xc0f4, 0x9085, 0x0c00,
-	0x6826, 0x6814, 0x2048, 0xa8ac, 0x6938, 0x9102, 0xa8b0, 0x693c,
-	0x9103, 0x1e48, 0x683c, 0x602e, 0x6838, 0x9084, 0xfffc, 0x683a,
-	0x6032, 0x2d00, 0x603a, 0x6808, 0x603e, 0x6910, 0x6112, 0x6954,
-	0x6156, 0x6023, 0x0001, 0x6007, 0x0039, 0x6003, 0x0001, 0x080c,
-	0x8e7f, 0x080c, 0x941c, 0x009e, 0x001e, 0x0005, 0x6024, 0xd0d4,
-	0x0510, 0xd0f4, 0x11f8, 0x6038, 0x940a, 0x603c, 0x9303, 0x0230,
-	0x9105, 0x0120, 0x6024, 0xc0d4, 0xc0f5, 0x0098, 0x643a, 0x633e,
-	0xac3e, 0xab42, 0x0046, 0x0036, 0x2400, 0xacac, 0x9402, 0xa836,
-	0x2300, 0xabb0, 0x9303, 0xa83a, 0x003e, 0x004e, 0x6024, 0xc0d4,
-	0x0000, 0x6026, 0x0005, 0xd0f4, 0x1138, 0xa83c, 0x603a, 0xa840,
-	0x603e, 0x6024, 0xc0f5, 0x6026, 0x0005, 0x0006, 0x0016, 0x6004,
-	0x908e, 0x0034, 0x01b8, 0x908e, 0x0035, 0x01a0, 0x908e, 0x0036,
-	0x0188, 0x908e, 0x0037, 0x0170, 0x908e, 0x0038, 0x0158, 0x908e,
-	0x0039, 0x0140, 0x908e, 0x003a, 0x0128, 0x908e, 0x003b, 0x0110,
-	0x9085, 0x0001, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x0026,
-	0x0036, 0x00e6, 0x2001, 0x1980, 0x200c, 0x8000, 0x2014, 0x2001,
-	0x0032, 0x080c, 0x8cf7, 0x2001, 0x1984, 0x82ff, 0x1110, 0x2011,
-	0x0014, 0x2202, 0x2001, 0x1982, 0x200c, 0x8000, 0x2014, 0x2071,
-	0x196c, 0x711a, 0x721e, 0x2001, 0x0064, 0x080c, 0x8cf7, 0x2001,
-	0x1985, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, 0x1986,
-	0x9288, 0x000a, 0x2102, 0x2001, 0x1a88, 0x2102, 0x2001, 0x0032,
-	0x080c, 0x15d1, 0x080c, 0x6718, 0x00ee, 0x003e, 0x002e, 0x001e,
-	0x000e, 0x0005, 0x0006, 0x0016, 0x00e6, 0x2001, 0x1984, 0x2003,
-	0x0028, 0x2001, 0x1985, 0x2003, 0x0014, 0x2071, 0x196c, 0x701b,
-	0x0000, 0x701f, 0x07d0, 0x2001, 0x1986, 0x2009, 0x001e, 0x2102,
-	0x2001, 0x1a88, 0x2102, 0x2001, 0x0032, 0x080c, 0x15d1, 0x00ee,
-	0x001e, 0x000e, 0x0005, 0x0096, 0x6058, 0x904d, 0x0110, 0x080c,
-	0x1032, 0x009e, 0x0005, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000,
-	0x080c, 0xab15, 0x0180, 0x2b08, 0x6112, 0x0ca9, 0x6023, 0x0001,
-	0x2900, 0x6016, 0x2009, 0x0033, 0x080c, 0xabe6, 0x9085, 0x0001,
-	0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x00e6, 0x00f6,
-	0x2071, 0x1800, 0x9186, 0x0015, 0x1500, 0x7090, 0x9086, 0x0018,
-	0x11e0, 0x6014, 0x2048, 0xaa3c, 0xd2e4, 0x1160, 0x2c78, 0x080c,
-	0x96af, 0x01d8, 0x707c, 0xaa50, 0x9206, 0x1160, 0x7080, 0xaa54,
-	0x9206, 0x1140, 0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x900e,
-	0x080c, 0x30b3, 0x080c, 0xaf6f, 0x0020, 0x080c, 0xb51d, 0x080c,
-	0xab6b, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x7060, 0xaa54, 0x9206,
-	0x0d48, 0x0c80, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xab15,
-	0x0188, 0x2b08, 0x6112, 0x080c, 0xcc93, 0x6023, 0x0001, 0x2900,
-	0x6016, 0x2009, 0x004d, 0x080c, 0xabe6, 0x9085, 0x0001, 0x012e,
+	0x1118, 0x009e, 0x0804, 0xc648, 0x080c, 0xcb1b, 0x1118, 0x080c,
+	0xcd04, 0x0068, 0x6014, 0x2048, 0xa87c, 0xd0e4, 0x1110, 0x080c,
+	0xcd04, 0xa867, 0x0103, 0x080c, 0xd1f6, 0x080c, 0x6c79, 0x00d6,
+	0x2c68, 0x080c, 0xadf1, 0x01d0, 0x6003, 0x0001, 0x6007, 0x001e,
+	0x600b, 0xffff, 0x2009, 0x026e, 0x210c, 0x613a, 0x2009, 0x026f,
+	0x210c, 0x613e, 0x6910, 0x6112, 0x080c, 0xcf90, 0x6954, 0x6156,
+	0x6023, 0x0001, 0x080c, 0x90c7, 0x080c, 0x9664, 0x2d60, 0x00de,
+	0x080c, 0xae47, 0x009e, 0x0005, 0x6010, 0x00b6, 0x2058, 0xb800,
+	0x00be, 0xd0bc, 0x05a0, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186,
+	0x0035, 0x0130, 0x9186, 0x001e, 0x0118, 0x9186, 0x0039, 0x1538,
+	0x00d6, 0x2c68, 0x080c, 0xd18e, 0x11f0, 0x080c, 0xadf1, 0x01d8,
+	0x6106, 0x6003, 0x0001, 0x6023, 0x0001, 0x6910, 0x6112, 0x692c,
+	0x612e, 0x6930, 0x6132, 0x6934, 0x918c, 0x00ff, 0x6136, 0x6938,
+	0x613a, 0x693c, 0x613e, 0x6954, 0x6156, 0x080c, 0xcf90, 0x080c,
+	0x90c7, 0x080c, 0x9664, 0x2d60, 0x00de, 0x0804, 0xae47, 0x0096,
+	0x6014, 0x2048, 0x080c, 0xcb1b, 0x01c8, 0xa867, 0x0103, 0xa880,
+	0xd0b4, 0x0128, 0xc0ec, 0xa882, 0xa87b, 0x0006, 0x0048, 0xd0bc,
+	0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, 0xce10,
+	0xa877, 0x0000, 0x080c, 0x6c79, 0x080c, 0xcd04, 0x009e, 0x0804,
+	0xae47, 0x0016, 0x0096, 0x6014, 0x2048, 0x080c, 0xcb1b, 0x0140,
+	0xa867, 0x0103, 0xa87b, 0x0028, 0xa877, 0x0000, 0x080c, 0x6c79,
+	0x009e, 0x001e, 0x9186, 0x0013, 0x0148, 0x9186, 0x0014, 0x0130,
+	0x9186, 0x0027, 0x0118, 0x080c, 0xaedd, 0x0030, 0x080c, 0x955f,
+	0x080c, 0xae78, 0x080c, 0x9664, 0x0005, 0x0056, 0x0066, 0x0096,
+	0x00a6, 0x2029, 0x0001, 0x9182, 0x0101, 0x1208, 0x0010, 0x2009,
+	0x0100, 0x2130, 0x8304, 0x9098, 0x0018, 0x2009, 0x0020, 0x2011,
+	0x0029, 0x080c, 0xc716, 0x96b2, 0x0020, 0xb004, 0x904d, 0x0110,
+	0x080c, 0x0fb1, 0x080c, 0x0fff, 0x0520, 0x8528, 0xa867, 0x0110,
+	0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, 0x1228, 0x2608,
+	0x2011, 0x001b, 0x0499, 0x00a8, 0x96b2, 0x003c, 0x2009, 0x003c,
+	0x2950, 0x2011, 0x001b, 0x0451, 0x0c28, 0x2001, 0x0205, 0x2003,
+	0x0000, 0x00ae, 0x852f, 0x95ad, 0x0003, 0xb566, 0x95ac, 0x0000,
+	0x0048, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad,
+	0x0003, 0xb566, 0x009e, 0x006e, 0x005e, 0x0005, 0x00a6, 0x89ff,
+	0x0158, 0xa804, 0x9055, 0x0130, 0xa807, 0x0000, 0x080c, 0x6c79,
+	0x2a48, 0x0cb8, 0x080c, 0x6c79, 0x00ae, 0x0005, 0x00f6, 0x2079,
+	0x0200, 0x7814, 0x9085, 0x0080, 0x7816, 0xd184, 0x0108, 0x8108,
+	0x810c, 0x20a9, 0x0001, 0xa860, 0x20e8, 0xa85c, 0x9200, 0x20a0,
+	0x20e1, 0x0000, 0x2300, 0x9e00, 0x2098, 0x4003, 0x8318, 0x9386,
+	0x0020, 0x1148, 0x2018, 0x2300, 0x9e00, 0x2098, 0x7814, 0x8000,
+	0x9085, 0x0080, 0x7816, 0x8109, 0x1d80, 0x7817, 0x0000, 0x00fe,
+	0x0005, 0x0066, 0x0126, 0x2091, 0x8000, 0x2031, 0x0001, 0x6020,
+	0x9084, 0x000f, 0x0083, 0x012e, 0x006e, 0x0005, 0x0126, 0x2091,
+	0x8000, 0x0066, 0x2031, 0x0000, 0x6020, 0x9084, 0x000f, 0x001b,
+	0x006e, 0x012e, 0x0005, 0xc77c, 0xc77c, 0xc777, 0xc79e, 0xc76a,
+	0xc777, 0xc79e, 0xc777, 0xc76a, 0x8eb0, 0xc777, 0xc777, 0xc777,
+	0xc76a, 0xc76a, 0x080c, 0x0dd5, 0x0036, 0x2019, 0x0010, 0x080c,
+	0xe115, 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x9006,
+	0x0005, 0x9085, 0x0001, 0x0005, 0x0096, 0x86ff, 0x11d8, 0x6014,
+	0x2048, 0x080c, 0xcb1b, 0x01c0, 0xa864, 0x9086, 0x0139, 0x1128,
+	0xa87b, 0x0005, 0xa883, 0x0000, 0x0028, 0x900e, 0x2001, 0x0005,
+	0x080c, 0x6eb8, 0x080c, 0xce10, 0x080c, 0x6c6d, 0x080c, 0xae78,
+	0x9085, 0x0001, 0x009e, 0x0005, 0x9006, 0x0ce0, 0x6000, 0x908a,
+	0x0016, 0x1a0c, 0x0dd5, 0x0002, 0xc7b4, 0xc7e2, 0xc7b6, 0xc803,
+	0xc7dd, 0xc7b4, 0xc777, 0xc77c, 0xc77c, 0xc777, 0xc777, 0xc777,
+	0xc777, 0xc777, 0xc777, 0xc777, 0x080c, 0x0dd5, 0x86ff, 0x1510,
+	0x6020, 0x9086, 0x0006, 0x01f0, 0x0096, 0x6014, 0x2048, 0x080c,
+	0xcb1b, 0x0158, 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878, 0x2048,
+	0x080c, 0x0fb1, 0x009e, 0x080c, 0xce10, 0x009e, 0x080c, 0xd1d0,
+	0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x90c7,
+	0x080c, 0x9664, 0x9085, 0x0001, 0x0005, 0x0066, 0x080c, 0x1a5e,
+	0x006e, 0x08a0, 0x00e6, 0x2071, 0x19e7, 0x7024, 0x9c06, 0x1120,
+	0x080c, 0xa526, 0x00ee, 0x0850, 0x6020, 0x9084, 0x000f, 0x9086,
+	0x0006, 0x1150, 0x0086, 0x0096, 0x2049, 0x0001, 0x2c40, 0x080c,
+	0xa682, 0x009e, 0x008e, 0x0010, 0x080c, 0xa423, 0x00ee, 0x1904,
+	0xc7b6, 0x0804, 0xc777, 0x0036, 0x00e6, 0x2071, 0x19e7, 0x703c,
+	0x9c06, 0x1138, 0x901e, 0x080c, 0xa59c, 0x00ee, 0x003e, 0x0804,
+	0xc7b6, 0x080c, 0xa7b2, 0x00ee, 0x003e, 0x1904, 0xc7b6, 0x0804,
+	0xc777, 0x00c6, 0x6020, 0x9084, 0x000f, 0x0013, 0x00ce, 0x0005,
+	0xc836, 0xc8ff, 0xca66, 0xc840, 0xae78, 0xc836, 0xe107, 0xd238,
+	0xc8ff, 0x8e82, 0xcae5, 0xc82f, 0xc82f, 0xc82f, 0xc82f, 0x080c,
+	0x0dd5, 0x080c, 0xcd21, 0x1110, 0x080c, 0xb7f9, 0x0005, 0x080c,
+	0x955f, 0x080c, 0x9664, 0x0804, 0xae47, 0x601b, 0x0001, 0x0005,
+	0x080c, 0xcb1b, 0x0130, 0x6014, 0x0096, 0x2048, 0x2c00, 0xa896,
+	0x009e, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0dd5, 0x0002, 0xc85f,
+	0xc861, 0xc885, 0xc899, 0xc8bd, 0xc85f, 0xc836, 0xc836, 0xc836,
+	0xc899, 0xc899, 0xc85f, 0xc85f, 0xc85f, 0xc85f, 0xc8a3, 0x080c,
+	0x0dd5, 0x00e6, 0x6014, 0x0096, 0x2048, 0xa880, 0xc0b5, 0xa882,
+	0x009e, 0x2071, 0x19e7, 0x7024, 0x9c06, 0x01a0, 0x080c, 0xa423,
+	0x080c, 0xd1d0, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002,
+	0x2001, 0x1987, 0x2004, 0x601a, 0x080c, 0x90c7, 0x080c, 0x9664,
+	0x00ee, 0x0005, 0x601b, 0x0001, 0x0cd8, 0x0096, 0x6014, 0x2048,
+	0xa880, 0xc0b5, 0xa882, 0x009e, 0x080c, 0xd1d0, 0x6007, 0x0085,
+	0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x90c7, 0x080c, 0x9664,
+	0x0005, 0x0096, 0x601b, 0x0001, 0x6014, 0x2048, 0xa880, 0xc0b5,
+	0xa882, 0x009e, 0x0005, 0x080c, 0x56d8, 0x01a8, 0x6014, 0x0096,
+	0x904d, 0x0180, 0xa864, 0xa867, 0x0103, 0xa87b, 0x0006, 0x9086,
+	0x0139, 0x1140, 0xa867, 0x0139, 0xa897, 0x4005, 0xa89b, 0x0004,
+	0x080c, 0x6c79, 0x009e, 0x0804, 0xae47, 0x6014, 0x0096, 0x904d,
+	0x05c8, 0xa97c, 0xd1e4, 0x05b0, 0x2001, 0x180f, 0x2004, 0xd0c4,
+	0x0110, 0x009e, 0x0005, 0xa884, 0x009e, 0x8003, 0x800b, 0x810b,
+	0x9108, 0x611a, 0x2001, 0x0030, 0x2c08, 0x080c, 0x15ee, 0x2001,
+	0x030c, 0x2004, 0x9086, 0x0041, 0x11a0, 0x6014, 0x0096, 0x904d,
+	0x090c, 0x0dd5, 0xa880, 0xd0f4, 0x1130, 0xc0f5, 0xa882, 0x009e,
+	0x601b, 0x0002, 0x0070, 0x009e, 0x2001, 0x0037, 0x2c08, 0x080c,
+	0x15ee, 0x6000, 0x9086, 0x0004, 0x1120, 0x2009, 0x0048, 0x080c,
+	0xaec2, 0x0005, 0x009e, 0x080c, 0x1a5e, 0x0804, 0xc885, 0x6000,
+	0x908a, 0x0016, 0x1a0c, 0x0dd5, 0x000b, 0x0005, 0xc916, 0xc83d,
+	0xc918, 0xc916, 0xc918, 0xc918, 0xc837, 0xc916, 0xc831, 0xc831,
+	0xc916, 0xc916, 0xc916, 0xc916, 0xc916, 0xc916, 0x080c, 0x0dd5,
+	0x6010, 0x00b6, 0x2058, 0xb804, 0x9084, 0x00ff, 0x00be, 0x908a,
+	0x000c, 0x1a0c, 0x0dd5, 0x00b6, 0x0013, 0x00be, 0x0005, 0xc933,
+	0xca00, 0xc935, 0xc975, 0xc935, 0xc975, 0xc935, 0xc943, 0xc933,
+	0xc975, 0xc933, 0xc964, 0x080c, 0x0dd5, 0x6004, 0x908e, 0x0016,
+	0x05c0, 0x908e, 0x0004, 0x05a8, 0x908e, 0x0002, 0x0590, 0x908e,
+	0x0052, 0x0904, 0xc9fc, 0x6004, 0x080c, 0xcd21, 0x0904, 0xca19,
+	0x908e, 0x0004, 0x1110, 0x080c, 0x31e1, 0x908e, 0x0021, 0x0904,
+	0xca1d, 0x908e, 0x0022, 0x0904, 0xca61, 0x908e, 0x003d, 0x0904,
+	0xca1d, 0x908e, 0x0039, 0x0904, 0xca21, 0x908e, 0x0035, 0x0904,
+	0xca21, 0x908e, 0x001e, 0x0178, 0x908e, 0x0001, 0x1140, 0x6010,
+	0x2058, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x0110, 0x080c,
+	0x31bc, 0x080c, 0xb7f9, 0x0804, 0xae78, 0x00c6, 0x00d6, 0x6104,
+	0x9186, 0x0016, 0x0904, 0xc9ed, 0x9186, 0x0002, 0x1904, 0xc9c2,
+	0x2001, 0x1837, 0x2004, 0xd08c, 0x11c8, 0x080c, 0x73b0, 0x11b0,
+	0x080c, 0xd216, 0x0138, 0x080c, 0x73d3, 0x1120, 0x080c, 0x72c0,
+	0x0804, 0xca4a, 0x2001, 0x197d, 0x2003, 0x0001, 0x2001, 0x1800,
+	0x2003, 0x0001, 0x080c, 0x72e2, 0x0804, 0xca4a, 0x6010, 0x2058,
+	0x2001, 0x1837, 0x2004, 0xd0ac, 0x1904, 0xca4a, 0xb8a0, 0x9084,
+	0xff80, 0x1904, 0xca4a, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0190,
+	0x8001, 0xb842, 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398,
+	0x6043, 0x0000, 0x080c, 0xadf1, 0x0128, 0x2b00, 0x6012, 0x6023,
+	0x0001, 0x0458, 0x00de, 0x00ce, 0x6004, 0x908e, 0x0002, 0x11a0,
+	0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, 0x1170, 0x2009, 0x1837,
+	0x2104, 0xc085, 0x200a, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5fae,
+	0x00ee, 0x080c, 0xb7f9, 0x0030, 0x080c, 0xb7f9, 0x080c, 0x31bc,
+	0x080c, 0xd22b, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x31e1,
+	0x012e, 0x00ee, 0x080c, 0xae78, 0x0005, 0x2001, 0x0002, 0x080c,
+	0x6550, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x910f, 0x080c,
+	0x9664, 0x00de, 0x00ce, 0x0c80, 0x080c, 0x31e1, 0x0804, 0xc971,
+	0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0d38, 0x6010, 0x2058,
+	0xb840, 0x9084, 0x00ff, 0x9005, 0x0904, 0xc9c2, 0x8001, 0xb842,
+	0x6003, 0x0001, 0x080c, 0x910f, 0x080c, 0x9664, 0x00de, 0x00ce,
+	0x0898, 0x080c, 0xb7f9, 0x0804, 0xc973, 0x080c, 0xb835, 0x0804,
+	0xc973, 0x00d6, 0x2c68, 0x6104, 0x080c, 0xd18e, 0x00de, 0x0118,
+	0x080c, 0xae47, 0x00f0, 0x6004, 0x8007, 0x6134, 0x918c, 0x00ff,
+	0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002,
+	0x603c, 0x600a, 0x2001, 0x1987, 0x2004, 0x601a, 0x602c, 0x2c08,
+	0x2060, 0x6024, 0xc0b5, 0x6026, 0x2160, 0x080c, 0x90c7, 0x080c,
+	0x9664, 0x0005, 0x00de, 0x00ce, 0x080c, 0xb7f9, 0x080c, 0x31bc,
+	0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x31e1, 0x6017, 0x0000,
+	0x6023, 0x0007, 0x601b, 0x0398, 0x6043, 0x0000, 0x012e, 0x00ee,
+	0x0005, 0x080c, 0xb277, 0x1904, 0xca19, 0x0005, 0x6000, 0x908a,
+	0x0016, 0x1a0c, 0x0dd5, 0x0096, 0x00d6, 0x001b, 0x00de, 0x009e,
+	0x0005, 0xca81, 0xca81, 0xca81, 0xca81, 0xca81, 0xca81, 0xca81,
+	0xca81, 0xca81, 0xc836, 0xca81, 0xc83d, 0xca83, 0xc83d, 0xca90,
+	0xca81, 0x080c, 0x0dd5, 0x6004, 0x9086, 0x008b, 0x0148, 0x6007,
+	0x008b, 0x6003, 0x000d, 0x080c, 0x90c7, 0x080c, 0x9664, 0x0005,
+	0x080c, 0xd20a, 0x0118, 0x080c, 0xd21d, 0x0010, 0x080c, 0xd22b,
+	0x080c, 0xcd04, 0x080c, 0xcb1b, 0x0570, 0x080c, 0x31bc, 0x080c,
+	0xcb1b, 0x0168, 0x6014, 0x2048, 0xa867, 0x0103, 0xa87b, 0x0006,
+	0xa877, 0x0000, 0xa880, 0xc0ed, 0xa882, 0x080c, 0x6c79, 0x2c68,
+	0x080c, 0xadf1, 0x0150, 0x6810, 0x6012, 0x080c, 0xcf90, 0x00c6,
+	0x2d60, 0x080c, 0xae78, 0x00ce, 0x0008, 0x2d60, 0x6017, 0x0000,
+	0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x910f,
+	0x080c, 0x9664, 0x00c8, 0x080c, 0xd20a, 0x0138, 0x6034, 0x9086,
+	0x4000, 0x1118, 0x080c, 0x31bc, 0x08d0, 0x6034, 0x908c, 0xff00,
+	0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x080c,
+	0x31bc, 0x0868, 0x080c, 0xae78, 0x0005, 0x6000, 0x908a, 0x0016,
+	0x1a0c, 0x0dd5, 0x0002, 0xcafb, 0xcafb, 0xcafd, 0xcafd, 0xcafd,
+	0xcafb, 0xcafb, 0xae78, 0xcafb, 0xcafb, 0xcafb, 0xcafb, 0xcafb,
+	0xcafb, 0xcafb, 0xcafb, 0x080c, 0x0dd5, 0x080c, 0xa7b2, 0x6114,
+	0x0096, 0x2148, 0xa87b, 0x0006, 0x080c, 0x6c79, 0x009e, 0x0804,
+	0xae47, 0x9284, 0x0007, 0x1158, 0x9282, 0x1cd0, 0x0240, 0x2001,
+	0x181a, 0x2004, 0x9202, 0x1218, 0x9085, 0x0001, 0x0005, 0x9006,
+	0x0ce8, 0x0096, 0x0028, 0x0096, 0x0006, 0x6014, 0x2048, 0x000e,
+	0x0006, 0x9984, 0xf000, 0x9086, 0xf000, 0x0110, 0x080c, 0x10aa,
+	0x000e, 0x009e, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0006, 0x0126,
+	0x2091, 0x8000, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x7354, 0x7074,
+	0x9302, 0x1640, 0x6020, 0x9206, 0x11f8, 0x080c, 0xd216, 0x0180,
+	0x9286, 0x0001, 0x1168, 0x6004, 0x9086, 0x0004, 0x1148, 0x080c,
+	0x31bc, 0x080c, 0xd22b, 0x00c6, 0x080c, 0xae78, 0x00ce, 0x0060,
+	0x080c, 0xcf0a, 0x0148, 0x080c, 0xcd21, 0x1110, 0x080c, 0xb7f9,
+	0x00c6, 0x080c, 0xae47, 0x00ce, 0x9ce0, 0x0018, 0x7068, 0x9c02,
+	0x1208, 0x08a0, 0x012e, 0x000e, 0x003e, 0x00ce, 0x00ee, 0x0005,
+	0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000, 0x210c, 0x81ff, 0x0128,
+	0x2061, 0x1ab0, 0x6112, 0x080c, 0x31bc, 0x9006, 0x0010, 0x9085,
+	0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6, 0x0126, 0x2091,
+	0x8000, 0x080c, 0xadf1, 0x01b0, 0x6656, 0x2b00, 0x6012, 0x080c,
+	0x56d8, 0x0118, 0x080c, 0xcc48, 0x0168, 0x080c, 0xcf90, 0x6023,
+	0x0003, 0x2009, 0x004b, 0x080c, 0xaec2, 0x9085, 0x0001, 0x012e,
 	0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000,
-	0x0016, 0x080c, 0xab15, 0x0180, 0x2b08, 0x6112, 0x080c, 0xcc93,
-	0x6023, 0x0001, 0x2900, 0x6016, 0x001e, 0x080c, 0xabe6, 0x9085,
-	0x0001, 0x012e, 0x00ce, 0x0005, 0x001e, 0x9006, 0x0cd0, 0x0016,
-	0x0026, 0x0036, 0x0046, 0x0056, 0x0066, 0x0096, 0x00e6, 0x00f6,
-	0x2071, 0x1800, 0x9186, 0x0015, 0x1568, 0x7190, 0x6014, 0x2048,
-	0xa814, 0x8003, 0x9106, 0x1530, 0x20e1, 0x0000, 0x2001, 0x199e,
-	0x2003, 0x0000, 0x6014, 0x2048, 0xa830, 0x20a8, 0x8906, 0x8006,
-	0x8007, 0x9094, 0x003f, 0x22e8, 0x9084, 0xffc0, 0x9080, 0x001b,
-	0x20a0, 0x2001, 0x199e, 0x0016, 0x200c, 0x080c, 0xd4f3, 0x001e,
-	0xa804, 0x9005, 0x0110, 0x2048, 0x0c38, 0x6014, 0x2048, 0xa867,
-	0x0103, 0x0010, 0x080c, 0xb51d, 0x080c, 0xab6b, 0x00fe, 0x00ee,
-	0x009e, 0x006e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005,
-	0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x11b8,
-	0x7090, 0x9086, 0x0004, 0x1198, 0x6014, 0x2048, 0x2c78, 0x080c,
-	0x96af, 0x01a8, 0x707c, 0xaa74, 0x9206, 0x1130, 0x7080, 0xaa78,
-	0x9206, 0x1110, 0x080c, 0x306e, 0x080c, 0xaf6f, 0x0020, 0x080c,
-	0xb51d, 0x080c, 0xab6b, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x7060,
-	0xaa78, 0x9206, 0x0d78, 0x0c80, 0x0096, 0x00e6, 0x00f6, 0x2071,
-	0x1800, 0x9186, 0x0015, 0x1550, 0x7090, 0x9086, 0x0004, 0x1530,
-	0x6014, 0x2048, 0x2c78, 0x080c, 0x96af, 0x05e8, 0x707c, 0xaacc,
-	0x9206, 0x1180, 0x7080, 0xaad0, 0x9206, 0x1160, 0x080c, 0x306e,
-	0x0016, 0xa998, 0xaab0, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x546f,
-	0x001e, 0x0010, 0x080c, 0x5260, 0x080c, 0xc825, 0x0500, 0xa87b,
-	0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x0078, 0x080c, 0x5260,
-	0x080c, 0xc825, 0x01a0, 0x6014, 0x2048, 0xa87b, 0x0030, 0xa883,
-	0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0x0126, 0x2091, 0x8000,
-	0xa867, 0x0139, 0x080c, 0x6a46, 0x012e, 0x080c, 0xab6b, 0x00fe,
-	0x00ee, 0x009e, 0x0005, 0x7060, 0xaad0, 0x9206, 0x0938, 0x0890,
-	0x0016, 0x0026, 0xa87c, 0xd0ac, 0x0178, 0xa938, 0xaa34, 0x2100,
-	0x9205, 0x0150, 0xa890, 0x9106, 0x1118, 0xa88c, 0x9206, 0x0120,
-	0xa992, 0xaa8e, 0x9085, 0x0001, 0x002e, 0x001e, 0x0005, 0x00b6,
-	0x00d6, 0x0036, 0x080c, 0xc825, 0x0904, 0xce4d, 0x0096, 0x6314,
-	0x2348, 0xa87a, 0xa982, 0x929e, 0x4000, 0x1580, 0x6310, 0x00c6,
-	0x2358, 0x2009, 0x0000, 0xa868, 0xd0f4, 0x1140, 0x080c, 0x65ed,
-	0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xaa96, 0xa99a,
-	0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0,
-	0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0f7d,
-	0x20a9, 0x0004, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8c8, 0x9080,
-	0x000a, 0x2098, 0x080c, 0x0f7d, 0x00ce, 0x0090, 0xaa96, 0x3918,
-	0x9398, 0x0007, 0x231c, 0x6004, 0x9086, 0x0016, 0x0110, 0xa89b,
-	0x0004, 0xaba2, 0x6310, 0x2358, 0xb804, 0x9084, 0x00ff, 0xa89e,
-	0x080c, 0x6a3a, 0x6017, 0x0000, 0x009e, 0x003e, 0x00de, 0x00be,
-	0x0005, 0x0026, 0x0036, 0x0046, 0x00b6, 0x0096, 0x00f6, 0x6214,
-	0x2248, 0x6210, 0x2258, 0x2079, 0x0260, 0x9096, 0x0000, 0x11a0,
-	0xb814, 0x9084, 0x00ff, 0x900e, 0x080c, 0x26f0, 0x2118, 0x831f,
-	0x939c, 0xff00, 0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c, 0x2011,
-	0x8018, 0x080c, 0x48fb, 0x00a8, 0x9096, 0x0001, 0x1148, 0x89ff,
-	0x0180, 0xa89b, 0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, 0x0048,
-	0x9096, 0x0002, 0x1130, 0xa89b, 0x000d, 0x7838, 0xa8a6, 0x783c,
-	0xa8aa, 0x00fe, 0x009e, 0x00be, 0x004e, 0x003e, 0x002e, 0x0005,
-	0x00c6, 0x0026, 0x0016, 0x9186, 0x0035, 0x0110, 0x6a38, 0x0008,
-	0x6a2c, 0x080c, 0xc813, 0x01f0, 0x2260, 0x6120, 0x9186, 0x0003,
-	0x0118, 0x9186, 0x0006, 0x1190, 0x6838, 0x9206, 0x0140, 0x683c,
-	0x9206, 0x1160, 0x6108, 0x6838, 0x9106, 0x1140, 0x0020, 0x6008,
-	0x693c, 0x9106, 0x1118, 0x6010, 0x6910, 0x9106, 0x001e, 0x002e,
-	0x00ce, 0x0005, 0x9085, 0x0001, 0x0cc8, 0xa974, 0xd1cc, 0x0188,
-	0x918c, 0x00ff, 0x918e, 0x0002, 0x1160, 0xa9a8, 0x918c, 0x0f00,
-	0x810f, 0x918e, 0x0001, 0x1128, 0xa834, 0xa938, 0x9115, 0x190c,
-	0xbf4f, 0x0005, 0x0036, 0x2019, 0x0001, 0x0010, 0x0036, 0x901e,
-	0x0499, 0x01e0, 0x080c, 0xc825, 0x01c8, 0x080c, 0xca07, 0x6037,
-	0x4000, 0x6014, 0x6017, 0x0000, 0x0096, 0x2048, 0xa87c, 0x080c,
-	0xca24, 0x1118, 0x080c, 0xb51d, 0x0040, 0xa867, 0x0103, 0xa877,
-	0x0000, 0x83ff, 0x1129, 0x080c, 0x6a46, 0x009e, 0x003e, 0x0005,
-	0xa880, 0xd0b4, 0x0128, 0xa87b, 0x0006, 0xc0ec, 0xa882, 0x0048,
-	0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c,
-	0xcb13, 0xa877, 0x0000, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0ec,
-	0x0005, 0x0006, 0x2001, 0x1810, 0x2004, 0xd0f4, 0x000e, 0x0005,
-	0x0006, 0x2001, 0x1810, 0x2004, 0xd0e4, 0x000e, 0x0005, 0x0036,
-	0x0046, 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0007,
-	0x080c, 0x4ab2, 0x004e, 0x003e, 0x0005, 0x0c51, 0x1d81, 0x0005,
-	0x2001, 0x1984, 0x2004, 0x601a, 0x0005, 0x2001, 0x1986, 0x2004,
-	0x6042, 0x0005, 0x080c, 0xab6b, 0x0804, 0x941c, 0x00b6, 0x0066,
-	0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0dd5, 0x001b, 0x006e, 0x00be,
-	0x0005, 0xcf59, 0xd650, 0xd7ad, 0xcf59, 0xcf59, 0xcf59, 0xcf59,
-	0xcf59, 0xcf90, 0xd82b, 0xcf59, 0xcf59, 0xcf59, 0xcf59, 0xcf59,
-	0xcf59, 0x080c, 0x0dd5, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c,
-	0x0dd5, 0x0013, 0x006e, 0x0005, 0xcf74, 0xdd93, 0xcf74, 0xcf74,
-	0xcf74, 0xcf74, 0xcf74, 0xcf74, 0xdd40, 0xdde7, 0xcf74, 0xe405,
-	0xe43b, 0xe405, 0xe43b, 0xcf74, 0x080c, 0x0dd5, 0x6000, 0x9082,
-	0x0016, 0x1a0c, 0x0dd5, 0x6000, 0x000a, 0x0005, 0xcf8e, 0xda08,
-	0xdaf8, 0xdb1a, 0xdbd9, 0xcf8e, 0xdcb7, 0xdc61, 0xd837, 0xdd16,
-	0xdd2b, 0xcf8e, 0xcf8e, 0xcf8e, 0xcf8e, 0xcf8e, 0x080c, 0x0dd5,
-	0x91b2, 0x0053, 0x1a0c, 0x0dd5, 0x2100, 0x91b2, 0x0040, 0x1a04,
-	0xd3c6, 0x0002, 0xcfda, 0xd1b7, 0xcfda, 0xcfda, 0xcfda, 0xd1c0,
-	0xcfda, 0xcfda, 0xcfda, 0xcfda, 0xcfda, 0xcfda, 0xcfda, 0xcfda,
-	0xcfda, 0xcfda, 0xcfda, 0xcfda, 0xcfda, 0xcfda, 0xcfda, 0xcfda,
-	0xcfda, 0xcfdc, 0xd032, 0xd041, 0xd0a5, 0xd0d0, 0xd149, 0xd1a2,
-	0xcfda, 0xcfda, 0xd1c3, 0xcfda, 0xcfda, 0xd1d8, 0xd1e5, 0xcfda,
-	0xcfda, 0xcfda, 0xcfda, 0xcfda, 0xd268, 0xcfda, 0xcfda, 0xd27c,
-	0xcfda, 0xcfda, 0xd237, 0xcfda, 0xcfda, 0xcfda, 0xd294, 0xcfda,
-	0xcfda, 0xcfda, 0xd311, 0xcfda, 0xcfda, 0xcfda, 0xcfda, 0xcfda,
-	0xcfda, 0xd38e, 0x080c, 0x0dd5, 0x080c, 0x66f5, 0x1150, 0x2001,
-	0x1837, 0x2004, 0xd0cc, 0x1128, 0x9084, 0x0009, 0x9086, 0x0008,
-	0x1140, 0x6007, 0x0009, 0x602f, 0x0009, 0x6017, 0x0000, 0x0804,
-	0xd1b0, 0x080c, 0x669a, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016,
-	0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0x901a,
-	0x0076, 0x903e, 0x080c, 0x8ef7, 0x2c08, 0x080c, 0xdfbd, 0x007e,
-	0x001e, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x6610, 0x2658,
-	0x080c, 0x63dc, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x0278,
-	0x080c, 0xdeef, 0x1904, 0xd09d, 0x080c, 0xde8b, 0x1120, 0x6007,
-	0x0008, 0x0804, 0xd1b0, 0x6007, 0x0009, 0x0804, 0xd1b0, 0x080c,
-	0xe113, 0x0128, 0x080c, 0xdeef, 0x0d78, 0x0804, 0xd09d, 0x6017,
-	0x1900, 0x0c88, 0x080c, 0x318e, 0x1904, 0xd3c3, 0x6106, 0x080c,
-	0xde42, 0x6007, 0x0006, 0x0804, 0xd1b0, 0x6007, 0x0007, 0x0804,
-	0xd1b0, 0x080c, 0xe477, 0x1904, 0xd3c3, 0x080c, 0x318e, 0x1904,
-	0xd3c3, 0x00d6, 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082,
-	0x0006, 0x1220, 0x2001, 0x0001, 0x080c, 0x6309, 0x96b4, 0xff00,
-	0x8637, 0x9686, 0x0006, 0x0188, 0x9686, 0x0004, 0x0170, 0xbe04,
-	0x96b4, 0x00ff, 0x9686, 0x0006, 0x0140, 0x9686, 0x0004, 0x0128,
-	0x9686, 0x0005, 0x0110, 0x00de, 0x0480, 0x00e6, 0x2071, 0x0260,
-	0x7034, 0x9084, 0x0003, 0x1140, 0x7034, 0x9082, 0x0014, 0x0220,
-	0x7030, 0x9084, 0x0003, 0x0130, 0x00ee, 0x6017, 0x0000, 0x602f,
-	0x0007, 0x00b0, 0x00ee, 0x080c, 0xdf53, 0x1190, 0x9686, 0x0006,
-	0x1140, 0x0026, 0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x30b3,
-	0x002e, 0x080c, 0x6468, 0x6007, 0x000a, 0x00de, 0x0804, 0xd1b0,
-	0x6007, 0x000b, 0x00de, 0x0804, 0xd1b0, 0x080c, 0x306e, 0x080c,
-	0xcf2d, 0x6007, 0x0001, 0x0804, 0xd1b0, 0x080c, 0xe477, 0x1904,
-	0xd3c3, 0x080c, 0x318e, 0x1904, 0xd3c3, 0x2071, 0x0260, 0x7034,
-	0x90b4, 0x0003, 0x1948, 0x90b2, 0x0014, 0x0a30, 0x7030, 0x9084,
-	0x0003, 0x1910, 0x6610, 0x2658, 0xbe04, 0x9686, 0x0707, 0x09e8,
-	0x0026, 0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x30b3, 0x002e,
-	0x6007, 0x000c, 0x2001, 0x0001, 0x080c, 0xe644, 0x0804, 0xd1b0,
-	0x080c, 0x66f5, 0x1140, 0x2001, 0x1837, 0x2004, 0x9084, 0x0009,
-	0x9086, 0x0008, 0x1110, 0x0804, 0xcfe9, 0x080c, 0x669a, 0x6610,
-	0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x06c8, 0x1138,
-	0x0026, 0x2001, 0x0006, 0x080c, 0x6349, 0x002e, 0x0050, 0x96b4,
-	0xff00, 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904,
-	0xd09d, 0x080c, 0xdf60, 0x1120, 0x6007, 0x000e, 0x0804, 0xd1b0,
-	0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x306e, 0x080c,
-	0xcf2d, 0x004e, 0x0016, 0x9006, 0x2009, 0x1848, 0x210c, 0xd1a4,
-	0x0148, 0x2009, 0x0029, 0x080c, 0xe280, 0x6010, 0x2058, 0xb800,
-	0xc0e5, 0xb802, 0x001e, 0x004e, 0x6007, 0x0001, 0x0804, 0xd1b0,
-	0x2001, 0x0001, 0x080c, 0x6309, 0x0156, 0x0016, 0x0026, 0x0036,
-	0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0270, 0x080c, 0xbb13,
-	0x003e, 0x002e, 0x001e, 0x015e, 0x9005, 0x0168, 0x96b4, 0xff00,
-	0x8637, 0x9682, 0x0004, 0x0a04, 0xd09d, 0x9682, 0x0007, 0x0a04,
-	0xd0f9, 0x0804, 0xd09d, 0x6017, 0x1900, 0x6007, 0x0009, 0x0804,
-	0xd1b0, 0x080c, 0x66f5, 0x1140, 0x2001, 0x1837, 0x2004, 0x9084,
-	0x0009, 0x9086, 0x0008, 0x1110, 0x0804, 0xcfe9, 0x080c, 0x669a,
-	0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x0690,
-	0x96b4, 0xff00, 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006,
-	0x1904, 0xd09d, 0x080c, 0xdf8e, 0x1130, 0x080c, 0xde8b, 0x1118,
-	0x6007, 0x0010, 0x04e8, 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046,
-	0x080c, 0x306e, 0x080c, 0xcf2d, 0x004e, 0x0016, 0x9006, 0x2009,
-	0x1848, 0x210c, 0xd1a4, 0x0148, 0x2009, 0x0029, 0x080c, 0xe280,
+	0xbaa0, 0x080c, 0xae95, 0x0560, 0x6057, 0x0000, 0x2b00, 0x6012,
+	0x080c, 0xcf90, 0x6023, 0x0003, 0x0016, 0x080c, 0x9262, 0x0076,
+	0x903e, 0x080c, 0x913f, 0x2c08, 0x080c, 0xe2ca, 0x007e, 0x001e,
+	0xd184, 0x0128, 0x080c, 0xae47, 0x9085, 0x0001, 0x0070, 0x080c,
+	0x56d8, 0x0128, 0xd18c, 0x1170, 0x080c, 0xcc48, 0x0148, 0x2009,
+	0x004c, 0x080c, 0xaec2, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005,
+	0x9006, 0x0cd8, 0x2900, 0x6016, 0x0c90, 0x2009, 0x004d, 0x0010,
+	0x2009, 0x004e, 0x00f6, 0x00c6, 0x0046, 0x0016, 0x080c, 0xadf1,
+	0x2c78, 0x0590, 0x7e56, 0x2b00, 0x7812, 0x7823, 0x0003, 0x2021,
+	0x0005, 0x080c, 0xcc5a, 0x9186, 0x004d, 0x0118, 0x9186, 0x004e,
+	0x0148, 0x2001, 0x1980, 0x200c, 0xd1fc, 0x0168, 0x2f60, 0x080c,
+	0xae47, 0x00d0, 0x2001, 0x197f, 0x200c, 0xd1fc, 0x0120, 0x2f60,
+	0x080c, 0xae47, 0x0088, 0x2f60, 0x080c, 0x56d8, 0x0138, 0xd18c,
+	0x1118, 0x04f1, 0x0148, 0x0010, 0x2900, 0x7816, 0x001e, 0x0016,
+	0x080c, 0xaec2, 0x9085, 0x0001, 0x001e, 0x004e, 0x00ce, 0x00fe,
+	0x0005, 0x00f6, 0x00c6, 0x0046, 0x080c, 0xadf1, 0x2c78, 0x0508,
+	0x7e56, 0x2b00, 0x7812, 0x7823, 0x0003, 0x0096, 0x2021, 0x0004,
+	0x0489, 0x009e, 0x2001, 0x197e, 0x200c, 0xd1fc, 0x0120, 0x2f60,
+	0x080c, 0xae47, 0x0060, 0x2f60, 0x080c, 0x56d8, 0x0120, 0xd18c,
+	0x1160, 0x0071, 0x0130, 0x2009, 0x0052, 0x080c, 0xaec2, 0x9085,
+	0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x2900, 0x7816, 0x0c98,
+	0x00c6, 0x080c, 0x4aa5, 0x00ce, 0x1120, 0x080c, 0xae47, 0x9006,
+	0x0005, 0xa867, 0x0000, 0xa86b, 0x8000, 0x2900, 0x6016, 0x9085,
+	0x0001, 0x0005, 0x0096, 0x0076, 0x0126, 0x2091, 0x8000, 0x080c,
+	0x6734, 0x0158, 0x2001, 0xcc5f, 0x0006, 0x900e, 0x2400, 0x080c,
+	0x6eb8, 0x080c, 0x6c79, 0x000e, 0x0807, 0x2418, 0x080c, 0x94f9,
+	0xbaa0, 0x0086, 0x2041, 0x0001, 0x2039, 0x0001, 0x2608, 0x080c,
+	0x927a, 0x008e, 0x080c, 0x913f, 0x2f08, 0x2648, 0x080c, 0xe2ca,
+	0xb93c, 0x81ff, 0x090c, 0x934b, 0x080c, 0x9664, 0x012e, 0x007e,
+	0x009e, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xadf1,
+	0x0190, 0x660a, 0x2b08, 0x6112, 0x080c, 0xcf90, 0x6023, 0x0001,
+	0x2900, 0x6016, 0x2009, 0x001f, 0x080c, 0xaec2, 0x9085, 0x0001,
+	0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091,
+	0x8000, 0x080c, 0xae95, 0x01b8, 0x660a, 0x2b08, 0x6112, 0x080c,
+	0xcf90, 0x6023, 0x0008, 0x2900, 0x6016, 0x00f6, 0x2c78, 0x080c,
+	0x1725, 0x00fe, 0x2009, 0x0021, 0x080c, 0xaec2, 0x9085, 0x0001,
+	0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, 0x003d, 0x00c6,
+	0x0126, 0x0016, 0x2091, 0x8000, 0x080c, 0xadf1, 0x0198, 0x660a,
+	0x2b08, 0x6112, 0x080c, 0xcf90, 0x6023, 0x0001, 0x2900, 0x6016,
+	0x001e, 0x0016, 0x080c, 0xaec2, 0x9085, 0x0001, 0x001e, 0x012e,
+	0x00ce, 0x0005, 0x9006, 0x0cd0, 0x00c6, 0x0126, 0x2091, 0x8000,
+	0x080c, 0xae95, 0x0188, 0x2b08, 0x6112, 0x080c, 0xcf90, 0x6023,
+	0x0001, 0x2900, 0x6016, 0x2009, 0x0000, 0x080c, 0xaec2, 0x9085,
+	0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, 0x0044,
+	0x0830, 0x2009, 0x0049, 0x0818, 0x0026, 0x00b6, 0x6210, 0x2258,
+	0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0x00be, 0x002e, 0x0005,
+	0x0006, 0x0016, 0x6004, 0x908e, 0x0002, 0x0140, 0x908e, 0x0003,
+	0x0128, 0x908e, 0x0004, 0x0110, 0x9085, 0x0001, 0x001e, 0x000e,
+	0x0005, 0x0006, 0x0096, 0x6020, 0x9086, 0x0004, 0x0190, 0x6014,
+	0x904d, 0x080c, 0xcb1b, 0x0168, 0xa864, 0x9086, 0x0139, 0x0158,
+	0x6020, 0x9086, 0x0003, 0x0128, 0xa868, 0xd0fc, 0x0110, 0x9006,
+	0x0010, 0x9085, 0x0001, 0x009e, 0x000e, 0x0005, 0x00c6, 0x0126,
+	0x2091, 0x8000, 0x080c, 0xae95, 0x0198, 0x2b08, 0x6112, 0x080c,
+	0xcf90, 0x6023, 0x0001, 0x2900, 0x6016, 0x080c, 0x31bc, 0x2009,
+	0x0028, 0x080c, 0xaec2, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005,
+	0x9006, 0x0cd8, 0x9186, 0x0015, 0x11a8, 0x2011, 0x1824, 0x2204,
+	0x9086, 0x0074, 0x1178, 0x00b6, 0x080c, 0xba4b, 0x00be, 0x080c,
+	0xbc6e, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, 0x910f, 0x080c,
+	0x9664, 0x0078, 0x6014, 0x0096, 0x2048, 0xa868, 0x009e, 0xd0fc,
+	0x0148, 0x2001, 0x0001, 0x080c, 0xd14f, 0x080c, 0xb7f9, 0x080c,
+	0xae47, 0x0005, 0x0096, 0x6014, 0x904d, 0x090c, 0x0dd5, 0xa87b,
+	0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0xa867,
+	0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c79, 0x012e, 0x009e,
+	0x080c, 0xae47, 0x0c30, 0x0096, 0x9186, 0x0016, 0x1128, 0x2001,
+	0x0004, 0x080c, 0x6550, 0x00e8, 0x9186, 0x0015, 0x1510, 0x2011,
+	0x1824, 0x2204, 0x9086, 0x0014, 0x11e0, 0x6010, 0x00b6, 0x2058,
+	0x080c, 0x669b, 0x00be, 0x080c, 0xbd3f, 0x1198, 0x6010, 0x00b6,
+	0x2058, 0xb890, 0x00be, 0x9005, 0x0160, 0x2001, 0x0006, 0x080c,
+	0x6550, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0170, 0x080c, 0xb24b,
+	0x0048, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0528, 0x080c, 0xb7f9,
+	0x080c, 0xae47, 0x009e, 0x0005, 0x6014, 0x6310, 0x2358, 0x904d,
+	0x090c, 0x0dd5, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000,
+	0x900e, 0x080c, 0x6820, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108,
+	0xc18d, 0xa99a, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c79, 0x012e,
+	0x080c, 0xae47, 0x08f8, 0x6014, 0x904d, 0x090c, 0x0dd5, 0xa87b,
+	0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0xa867,
+	0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c79, 0x012e, 0x080c,
+	0xae47, 0x0840, 0xa878, 0x9086, 0x0005, 0x1108, 0x0009, 0x0005,
+	0xa880, 0xc0ad, 0xa882, 0x0005, 0x6043, 0x0000, 0x6017, 0x0000,
+	0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x90c7, 0x080c, 0x9664,
+	0x0005, 0x00c6, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc,
+	0x0120, 0x6020, 0x9084, 0x000f, 0x0013, 0x00ce, 0x0005, 0xc836,
+	0xce40, 0xce40, 0xce43, 0xe5dc, 0xe5f7, 0xe5fa, 0xc836, 0xc836,
+	0xc836, 0xc836, 0xc836, 0xc836, 0xc836, 0xc836, 0x080c, 0x0dd5,
+	0xa001, 0xa001, 0x0005, 0x0096, 0x6014, 0x904d, 0x0118, 0xa87c,
+	0xd0e4, 0x1110, 0x009e, 0x0010, 0x009e, 0x0005, 0x6010, 0x00b6,
+	0x2058, 0xb800, 0x00be, 0xd0bc, 0x0550, 0x2001, 0x1834, 0x2004,
+	0x9005, 0x1540, 0x00f6, 0x2c78, 0x080c, 0xadf1, 0x0508, 0x7810,
+	0x6012, 0x080c, 0xcf90, 0x7820, 0x9086, 0x0003, 0x0128, 0x7808,
+	0x603a, 0x2f00, 0x603e, 0x0020, 0x7808, 0x603e, 0x2f00, 0x603a,
+	0x602e, 0x6023, 0x0001, 0x6007, 0x0035, 0x6003, 0x0001, 0x7954,
+	0x6156, 0x080c, 0x90c7, 0x080c, 0x9664, 0x2f60, 0x00fe, 0x0005,
+	0x2f60, 0x00fe, 0x2001, 0x1988, 0x2004, 0x6042, 0x0005, 0x0016,
+	0x0096, 0x6814, 0x2048, 0xa87c, 0xd0e4, 0x0180, 0xc0e4, 0xa87e,
+	0xa877, 0x0000, 0xa893, 0x0000, 0xa88f, 0x0000, 0xd0cc, 0x0130,
+	0xc0cc, 0xa87e, 0xa878, 0x2048, 0x080c, 0x0fb1, 0x6830, 0x6036,
+	0x908e, 0x0001, 0x0148, 0x6803, 0x0002, 0x9086, 0x0005, 0x0170,
+	0x9006, 0x602e, 0x6032, 0x00d0, 0x681c, 0xc085, 0x681e, 0x6803,
+	0x0004, 0x6824, 0xc0f4, 0x9085, 0x0c00, 0x6826, 0x6814, 0x2048,
+	0xa8ac, 0x6938, 0x9102, 0xa8b0, 0x693c, 0x9103, 0x1e48, 0x683c,
+	0x602e, 0x6838, 0x9084, 0xfffc, 0x683a, 0x6032, 0x2d00, 0x603a,
+	0x6808, 0x603e, 0x6910, 0x6112, 0x6954, 0x6156, 0x6023, 0x0001,
+	0x6007, 0x0039, 0x6003, 0x0001, 0x080c, 0x90c7, 0x080c, 0x9664,
+	0x009e, 0x001e, 0x0005, 0x6024, 0xd0d4, 0x0510, 0xd0f4, 0x11f8,
+	0x6038, 0x940a, 0x603c, 0x9303, 0x0230, 0x9105, 0x0120, 0x6024,
+	0xc0d4, 0xc0f5, 0x0098, 0x643a, 0x633e, 0xac3e, 0xab42, 0x0046,
+	0x0036, 0x2400, 0xacac, 0x9402, 0xa836, 0x2300, 0xabb0, 0x9303,
+	0xa83a, 0x003e, 0x004e, 0x6024, 0xc0d4, 0x0000, 0x6026, 0x0005,
+	0xd0f4, 0x1138, 0xa83c, 0x603a, 0xa840, 0x603e, 0x6024, 0xc0f5,
+	0x6026, 0x0005, 0x0006, 0x0016, 0x6004, 0x908e, 0x0034, 0x01b8,
+	0x908e, 0x0035, 0x01a0, 0x908e, 0x0036, 0x0188, 0x908e, 0x0037,
+	0x0170, 0x908e, 0x0038, 0x0158, 0x908e, 0x0039, 0x0140, 0x908e,
+	0x003a, 0x0128, 0x908e, 0x003b, 0x0110, 0x9085, 0x0001, 0x001e,
+	0x000e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, 0x2001,
+	0x1982, 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, 0x080c, 0x8f3f,
+	0x2001, 0x1986, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001,
+	0x1984, 0x200c, 0x8000, 0x2014, 0x2071, 0x196c, 0x711a, 0x721e,
+	0x2001, 0x0064, 0x080c, 0x8f3f, 0x2001, 0x1987, 0x82ff, 0x1110,
+	0x2011, 0x0014, 0x2202, 0x2001, 0x1988, 0x9288, 0x000a, 0x2102,
+	0x2001, 0x1a91, 0x2102, 0x2001, 0x0032, 0x080c, 0x15ee, 0x080c,
+	0x694b, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006,
+	0x0016, 0x00e6, 0x2001, 0x1986, 0x2003, 0x0028, 0x2001, 0x1987,
+	0x2003, 0x0014, 0x2071, 0x196c, 0x701b, 0x0000, 0x701f, 0x07d0,
+	0x2001, 0x1988, 0x2009, 0x001e, 0x2102, 0x2001, 0x1a91, 0x2102,
+	0x2001, 0x0032, 0x080c, 0x15ee, 0x00ee, 0x001e, 0x000e, 0x0005,
+	0x0096, 0x6058, 0x904d, 0x0110, 0x080c, 0x1031, 0x009e, 0x0005,
+	0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xadf1, 0x0180,
+	0x2b08, 0x6112, 0x0ca9, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009,
+	0x0033, 0x080c, 0xaec2, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005,
+	0x9006, 0x0cd8, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186,
+	0x0015, 0x1500, 0x7090, 0x9086, 0x0018, 0x11e0, 0x6014, 0x2048,
+	0xaa3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x98f7, 0x01d8, 0x707c,
+	0xaa50, 0x9206, 0x1160, 0x7080, 0xaa54, 0x9206, 0x1140, 0x6210,
+	0x00b6, 0x2258, 0xbaa0, 0x00be, 0x900e, 0x080c, 0x3201, 0x080c,
+	0xb24b, 0x0020, 0x080c, 0xb7f9, 0x080c, 0xae47, 0x00fe, 0x00ee,
+	0x009e, 0x0005, 0x7060, 0xaa54, 0x9206, 0x0d48, 0x0c80, 0x00c6,
+	0x0126, 0x2091, 0x8000, 0x080c, 0xadf1, 0x0188, 0x2b08, 0x6112,
+	0x080c, 0xcf90, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x004d,
+	0x080c, 0xaec2, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006,
+	0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0016, 0x080c, 0xadf1,
+	0x0180, 0x2b08, 0x6112, 0x080c, 0xcf90, 0x6023, 0x0001, 0x2900,
+	0x6016, 0x001e, 0x080c, 0xaec2, 0x9085, 0x0001, 0x012e, 0x00ce,
+	0x0005, 0x001e, 0x9006, 0x0cd0, 0x0016, 0x0026, 0x0036, 0x0046,
+	0x0056, 0x0066, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186,
+	0x0015, 0x1568, 0x7190, 0x6014, 0x2048, 0xa814, 0x8003, 0x9106,
+	0x1530, 0x20e1, 0x0000, 0x2001, 0x19a0, 0x2003, 0x0000, 0x6014,
+	0x2048, 0xa830, 0x20a8, 0x8906, 0x8006, 0x8007, 0x9094, 0x003f,
+	0x22e8, 0x9084, 0xffc0, 0x9080, 0x001b, 0x20a0, 0x2001, 0x19a0,
+	0x0016, 0x200c, 0x080c, 0xd800, 0x001e, 0xa804, 0x9005, 0x0110,
+	0x2048, 0x0c38, 0x6014, 0x2048, 0xa867, 0x0103, 0x0010, 0x080c,
+	0xb7f9, 0x080c, 0xae47, 0x00fe, 0x00ee, 0x009e, 0x006e, 0x005e,
+	0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x0096, 0x00e6, 0x00f6,
+	0x2071, 0x1800, 0x9186, 0x0015, 0x11b8, 0x7090, 0x9086, 0x0004,
+	0x1198, 0x6014, 0x2048, 0x2c78, 0x080c, 0x98f7, 0x01a8, 0x707c,
+	0xaa74, 0x9206, 0x1130, 0x7080, 0xaa78, 0x9206, 0x1110, 0x080c,
+	0x31bc, 0x080c, 0xb24b, 0x0020, 0x080c, 0xb7f9, 0x080c, 0xae47,
+	0x00fe, 0x00ee, 0x009e, 0x0005, 0x7060, 0xaa78, 0x9206, 0x0d78,
+	0x0c80, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015,
+	0x1550, 0x7090, 0x9086, 0x0004, 0x1530, 0x6014, 0x2048, 0x2c78,
+	0x080c, 0x98f7, 0x05f0, 0x707c, 0xaacc, 0x9206, 0x1180, 0x7080,
+	0xaad0, 0x9206, 0x1160, 0x080c, 0x31bc, 0x0016, 0xa998, 0xaab0,
+	0x9284, 0x1000, 0xc0fd, 0x080c, 0x5688, 0x001e, 0x0010, 0x080c,
+	0x5479, 0x080c, 0xcb1b, 0x0508, 0xa87b, 0x0000, 0xa883, 0x0000,
+	0xa897, 0x4000, 0x0080, 0x080c, 0xcb1b, 0x01b8, 0x6014, 0x2048,
+	0x080c, 0x5479, 0x1d70, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897,
+	0x4005, 0xa89b, 0x0004, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139,
+	0x080c, 0x6c79, 0x012e, 0x080c, 0xae47, 0x00fe, 0x00ee, 0x009e,
+	0x0005, 0x7060, 0xaad0, 0x9206, 0x0930, 0x0888, 0x0016, 0x0026,
+	0xa87c, 0xd0ac, 0x0178, 0xa938, 0xaa34, 0x2100, 0x9205, 0x0150,
+	0xa890, 0x9106, 0x1118, 0xa88c, 0x9206, 0x0120, 0xa992, 0xaa8e,
+	0x9085, 0x0001, 0x002e, 0x001e, 0x0005, 0x00b6, 0x00d6, 0x0036,
+	0x080c, 0xcb1b, 0x0904, 0xd14b, 0x0096, 0x6314, 0x2348, 0xa87a,
+	0xa982, 0x929e, 0x4000, 0x1580, 0x6310, 0x00c6, 0x2358, 0x2009,
+	0x0000, 0xa868, 0xd0f4, 0x1140, 0x080c, 0x6820, 0x1108, 0xc185,
+	0xb800, 0xd0bc, 0x0108, 0xc18d, 0xaa96, 0xa99a, 0x20a9, 0x0004,
+	0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8c4, 0x20e0,
+	0xb8c8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0f7c, 0x20a9, 0x0004,
+	0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8c8, 0x9080, 0x000a, 0x2098,
+	0x080c, 0x0f7c, 0x00ce, 0x0090, 0xaa96, 0x3918, 0x9398, 0x0007,
+	0x231c, 0x6004, 0x9086, 0x0016, 0x0110, 0xa89b, 0x0004, 0xaba2,
+	0x6310, 0x2358, 0xb804, 0x9084, 0x00ff, 0xa89e, 0x080c, 0x6c6d,
+	0x6017, 0x0000, 0x009e, 0x003e, 0x00de, 0x00be, 0x0005, 0x0026,
+	0x0036, 0x0046, 0x00b6, 0x0096, 0x00f6, 0x6214, 0x2248, 0x6210,
+	0x2258, 0x2079, 0x0260, 0x9096, 0x0000, 0x11a0, 0xb814, 0x9084,
+	0x00ff, 0x900e, 0x080c, 0x283e, 0x2118, 0x831f, 0x939c, 0xff00,
+	0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c, 0x2011, 0x8018, 0x080c,
+	0x4b05, 0x00a8, 0x9096, 0x0001, 0x1148, 0x89ff, 0x0180, 0xa89b,
+	0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, 0x0048, 0x9096, 0x0002,
+	0x1130, 0xa89b, 0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, 0x00fe,
+	0x009e, 0x00be, 0x004e, 0x003e, 0x002e, 0x0005, 0x00c6, 0x0026,
+	0x0016, 0x9186, 0x0035, 0x0110, 0x6a38, 0x0008, 0x6a2c, 0x080c,
+	0xcb09, 0x01f0, 0x2260, 0x6120, 0x9186, 0x0003, 0x0118, 0x9186,
+	0x0006, 0x1190, 0x6838, 0x9206, 0x0140, 0x683c, 0x9206, 0x1160,
+	0x6108, 0x6838, 0x9106, 0x1140, 0x0020, 0x6008, 0x693c, 0x9106,
+	0x1118, 0x6010, 0x6910, 0x9106, 0x001e, 0x002e, 0x00ce, 0x0005,
+	0x9085, 0x0001, 0x0cc8, 0xa974, 0xd1cc, 0x0188, 0x918c, 0x00ff,
+	0x918e, 0x0002, 0x1160, 0xa9a8, 0x918c, 0x0f00, 0x810f, 0x918e,
+	0x0001, 0x1128, 0xa834, 0xa938, 0x9115, 0x190c, 0xc22b, 0x0005,
+	0x0036, 0x2019, 0x0001, 0x0010, 0x0036, 0x901e, 0x0499, 0x01e0,
+	0x080c, 0xcb1b, 0x01c8, 0x080c, 0xcd04, 0x6037, 0x4000, 0x6014,
+	0x6017, 0x0000, 0x0096, 0x2048, 0xa87c, 0x080c, 0xcd21, 0x1118,
+	0x080c, 0xb7f9, 0x0040, 0xa867, 0x0103, 0xa877, 0x0000, 0x83ff,
+	0x1129, 0x080c, 0x6c79, 0x009e, 0x003e, 0x0005, 0xa880, 0xd0b4,
+	0x0128, 0xa87b, 0x0006, 0xc0ec, 0xa882, 0x0048, 0xd0bc, 0x0118,
+	0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, 0xce10, 0xa877,
+	0x0000, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0ec, 0x0005, 0x0006,
+	0x2001, 0x1810, 0x2004, 0xd0f4, 0x000e, 0x0005, 0x0006, 0x2001,
+	0x1810, 0x2004, 0xd0e4, 0x000e, 0x0005, 0x0036, 0x0046, 0x6010,
+	0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0007, 0x080c, 0x4cbc,
+	0x004e, 0x003e, 0x0005, 0x0c51, 0x1d81, 0x0005, 0x2001, 0x1986,
+	0x2004, 0x601a, 0x0005, 0x2001, 0x1988, 0x2004, 0x6042, 0x0005,
+	0x080c, 0xae47, 0x0804, 0x9664, 0x00b6, 0x0066, 0x6000, 0x90b2,
+	0x0016, 0x1a0c, 0x0dd5, 0x001b, 0x006e, 0x00be, 0x0005, 0xd257,
+	0xd95d, 0xdaba, 0xd257, 0xd257, 0xd257, 0xd257, 0xd257, 0xd28e,
+	0xdb38, 0xd257, 0xd257, 0xd257, 0xd257, 0xd257, 0xd257, 0x080c,
+	0x0dd5, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0dd5, 0x0013,
+	0x006e, 0x0005, 0xd272, 0xe0a0, 0xd272, 0xd272, 0xd272, 0xd272,
+	0xd272, 0xd272, 0xe04d, 0xe0f4, 0xd272, 0xe717, 0xe74d, 0xe717,
+	0xe74d, 0xd272, 0x080c, 0x0dd5, 0x6000, 0x9082, 0x0016, 0x1a0c,
+	0x0dd5, 0x6000, 0x000a, 0x0005, 0xd28c, 0xdd15, 0xde05, 0xde27,
+	0xdee6, 0xd28c, 0xdfc4, 0xdf6e, 0xdb44, 0xe023, 0xe038, 0xd28c,
+	0xd28c, 0xd28c, 0xd28c, 0xd28c, 0x080c, 0x0dd5, 0x91b2, 0x0053,
+	0x1a0c, 0x0dd5, 0x2100, 0x91b2, 0x0040, 0x1a04, 0xd6d1, 0x0002,
+	0xd2d8, 0xd4c2, 0xd2d8, 0xd2d8, 0xd2d8, 0xd4cb, 0xd2d8, 0xd2d8,
+	0xd2d8, 0xd2d8, 0xd2d8, 0xd2d8, 0xd2d8, 0xd2d8, 0xd2d8, 0xd2d8,
+	0xd2d8, 0xd2d8, 0xd2d8, 0xd2d8, 0xd2d8, 0xd2d8, 0xd2d8, 0xd2da,
+	0xd33d, 0xd34c, 0xd3b0, 0xd3db, 0xd454, 0xd4ad, 0xd2d8, 0xd2d8,
+	0xd4ce, 0xd2d8, 0xd2d8, 0xd4e3, 0xd4f0, 0xd2d8, 0xd2d8, 0xd2d8,
+	0xd2d8, 0xd2d8, 0xd573, 0xd2d8, 0xd2d8, 0xd587, 0xd2d8, 0xd2d8,
+	0xd542, 0xd2d8, 0xd2d8, 0xd2d8, 0xd59f, 0xd2d8, 0xd2d8, 0xd2d8,
+	0xd61c, 0xd2d8, 0xd2d8, 0xd2d8, 0xd2d8, 0xd2d8, 0xd2d8, 0xd699,
+	0x080c, 0x0dd5, 0x080c, 0x6928, 0x1150, 0x2001, 0x1837, 0x2004,
+	0xd0cc, 0x1128, 0x9084, 0x0009, 0x9086, 0x0008, 0x1140, 0x6007,
+	0x0009, 0x602f, 0x0009, 0x6017, 0x0000, 0x0804, 0xd4bb, 0x080c,
+	0x68cd, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x6210, 0x2258,
+	0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0x9262, 0x0076, 0x903e,
+	0x080c, 0x913f, 0x2c08, 0x080c, 0xe2ca, 0x007e, 0x001e, 0x001e,
+	0x002e, 0x003e, 0x00ce, 0x00ee, 0x6610, 0x2658, 0x080c, 0x660f,
+	0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x1268, 0x0016, 0x0026,
+	0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x2c08, 0x080c, 0xe976,
+	0x002e, 0x001e, 0x1178, 0x080c, 0xe1fc, 0x1904, 0xd3a8, 0x080c,
+	0xe198, 0x1120, 0x6007, 0x0008, 0x0804, 0xd4bb, 0x6007, 0x0009,
+	0x0804, 0xd4bb, 0x080c, 0xe420, 0x0128, 0x080c, 0xe1fc, 0x0d78,
+	0x0804, 0xd3a8, 0x6017, 0x1900, 0x0c88, 0x080c, 0x32dc, 0x1904,
+	0xd6ce, 0x6106, 0x080c, 0xe14f, 0x6007, 0x0006, 0x0804, 0xd4bb,
+	0x6007, 0x0007, 0x0804, 0xd4bb, 0x080c, 0xe789, 0x1904, 0xd6ce,
+	0x080c, 0x32dc, 0x1904, 0xd6ce, 0x00d6, 0x6610, 0x2658, 0xbe04,
+	0x9684, 0x00ff, 0x9082, 0x0006, 0x1220, 0x2001, 0x0001, 0x080c,
+	0x653c, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0188, 0x9686,
+	0x0004, 0x0170, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, 0x0140,
+	0x9686, 0x0004, 0x0128, 0x9686, 0x0005, 0x0110, 0x00de, 0x0480,
+	0x00e6, 0x2071, 0x0260, 0x7034, 0x9084, 0x0003, 0x1140, 0x7034,
+	0x9082, 0x0014, 0x0220, 0x7030, 0x9084, 0x0003, 0x0130, 0x00ee,
+	0x6017, 0x0000, 0x602f, 0x0007, 0x00b0, 0x00ee, 0x080c, 0xe260,
+	0x1190, 0x9686, 0x0006, 0x1140, 0x0026, 0x6210, 0x2258, 0xbaa0,
+	0x900e, 0x080c, 0x3201, 0x002e, 0x080c, 0x669b, 0x6007, 0x000a,
+	0x00de, 0x0804, 0xd4bb, 0x6007, 0x000b, 0x00de, 0x0804, 0xd4bb,
+	0x080c, 0x31bc, 0x080c, 0xd22b, 0x6007, 0x0001, 0x0804, 0xd4bb,
+	0x080c, 0xe789, 0x1904, 0xd6ce, 0x080c, 0x32dc, 0x1904, 0xd6ce,
+	0x2071, 0x0260, 0x7034, 0x90b4, 0x0003, 0x1948, 0x90b2, 0x0014,
+	0x0a30, 0x7030, 0x9084, 0x0003, 0x1910, 0x6610, 0x2658, 0xbe04,
+	0x9686, 0x0707, 0x09e8, 0x0026, 0x6210, 0x2258, 0xbaa0, 0x900e,
+	0x080c, 0x3201, 0x002e, 0x6007, 0x000c, 0x2001, 0x0001, 0x080c,
+	0xe956, 0x0804, 0xd4bb, 0x080c, 0x6928, 0x1140, 0x2001, 0x1837,
+	0x2004, 0x9084, 0x0009, 0x9086, 0x0008, 0x1110, 0x0804, 0xd2e7,
+	0x080c, 0x68cd, 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082,
+	0x0006, 0x06c8, 0x1138, 0x0026, 0x2001, 0x0006, 0x080c, 0x657c,
+	0x002e, 0x0050, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0004, 0x0120,
+	0x9686, 0x0006, 0x1904, 0xd3a8, 0x080c, 0xe26d, 0x1120, 0x6007,
+	0x000e, 0x0804, 0xd4bb, 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046,
+	0x080c, 0x31bc, 0x080c, 0xd22b, 0x004e, 0x0016, 0x9006, 0x2009,
+	0x1848, 0x210c, 0xd1a4, 0x0148, 0x2009, 0x0029, 0x080c, 0xe58d,
 	0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e, 0x004e, 0x6007,
-	0x0001, 0x00f0, 0x080c, 0xe113, 0x0140, 0x96b4, 0xff00, 0x8637,
-	0x9686, 0x0006, 0x0978, 0x0804, 0xd09d, 0x6017, 0x1900, 0x6007,
-	0x0009, 0x0070, 0x080c, 0x318e, 0x1904, 0xd3c3, 0x080c, 0xe477,
-	0x1904, 0xd3c3, 0x080c, 0xd58e, 0x1904, 0xd09d, 0x6007, 0x0012,
-	0x6003, 0x0001, 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0005, 0x6007,
-	0x0001, 0x6003, 0x0001, 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0cb0,
-	0x6007, 0x0005, 0x0c68, 0x080c, 0xe477, 0x1904, 0xd3c3, 0x080c,
-	0x318e, 0x1904, 0xd3c3, 0x080c, 0xd58e, 0x1904, 0xd09d, 0x6007,
-	0x0020, 0x6003, 0x0001, 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0005,
-	0x080c, 0x318e, 0x1904, 0xd3c3, 0x6007, 0x0023, 0x6003, 0x0001,
-	0x080c, 0x8ec7, 0x080c, 0x941c, 0x0005, 0x080c, 0xe477, 0x1904,
-	0xd3c3, 0x080c, 0x318e, 0x1904, 0xd3c3, 0x080c, 0xd58e, 0x1904,
-	0xd09d, 0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, 0x7244, 0x9286,
-	0xffff, 0x0180, 0x2c08, 0x080c, 0xc813, 0x01b0, 0x2260, 0x7240,
-	0x6008, 0x9206, 0x1188, 0x6010, 0x9190, 0x0004, 0x2214, 0x9206,
-	0x01b8, 0x0050, 0x7240, 0x2c08, 0x9006, 0x080c, 0xe24a, 0x1180,
-	0x7244, 0x9286, 0xffff, 0x01b0, 0x2160, 0x6007, 0x0026, 0x6017,
-	0x1700, 0x7214, 0x9296, 0xffff, 0x1180, 0x6007, 0x0025, 0x0068,
-	0x6020, 0x9086, 0x0007, 0x1d80, 0x6004, 0x9086, 0x0024, 0x1110,
-	0x080c, 0xab6b, 0x2160, 0x6007, 0x0025, 0x6003, 0x0001, 0x080c,
-	0x8ec7, 0x080c, 0x941c, 0x00ee, 0x002e, 0x001e, 0x0005, 0x2001,
-	0x0001, 0x080c, 0x6309, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9,
-	0x0004, 0x2019, 0x1805, 0x2011, 0x0276, 0x080c, 0xbb13, 0x003e,
-	0x002e, 0x001e, 0x015e, 0x0120, 0x6007, 0x0031, 0x0804, 0xd1b0,
-	0x080c, 0xb787, 0x080c, 0x717d, 0x1190, 0x0006, 0x0026, 0x0036,
-	0x080c, 0x7197, 0x1138, 0x080c, 0x7465, 0x080c, 0x5df8, 0x080c,
-	0x70af, 0x0010, 0x080c, 0x7155, 0x003e, 0x002e, 0x000e, 0x0005,
-	0x080c, 0x318e, 0x1904, 0xd3c3, 0x080c, 0xd58e, 0x1904, 0xd09d,
-	0x6106, 0x080c, 0xd5aa, 0x1120, 0x6007, 0x002b, 0x0804, 0xd1b0,
-	0x6007, 0x002c, 0x0804, 0xd1b0, 0x080c, 0xe477, 0x1904, 0xd3c3,
-	0x080c, 0x318e, 0x1904, 0xd3c3, 0x080c, 0xd58e, 0x1904, 0xd09d,
-	0x6106, 0x080c, 0xd5af, 0x1120, 0x6007, 0x002e, 0x0804, 0xd1b0,
-	0x6007, 0x002f, 0x0804, 0xd1b0, 0x080c, 0x318e, 0x1904, 0xd3c3,
-	0x00e6, 0x00d6, 0x00c6, 0x6010, 0x2058, 0xb904, 0x9184, 0x00ff,
-	0x9086, 0x0006, 0x0158, 0x9184, 0xff00, 0x8007, 0x9086, 0x0006,
-	0x0128, 0x00ce, 0x00de, 0x00ee, 0x0804, 0xd1b7, 0x080c, 0x54bb,
-	0xd0e4, 0x0904, 0xd30e, 0x2071, 0x026c, 0x7010, 0x603a, 0x7014,
-	0x603e, 0x7108, 0x720c, 0x080c, 0x6733, 0x0140, 0x6010, 0x2058,
-	0xb810, 0x9106, 0x1118, 0xb814, 0x9206, 0x0510, 0x080c, 0x672f,
-	0x15b8, 0x2069, 0x1800, 0x6880, 0x9206, 0x1590, 0x687c, 0x9106,
-	0x1578, 0x7210, 0x080c, 0xc813, 0x0590, 0x080c, 0xd47b, 0x0578,
-	0x080c, 0xe2f7, 0x0560, 0x622e, 0x6007, 0x0036, 0x6003, 0x0001,
-	0x080c, 0x8e7f, 0x080c, 0x941c, 0x00ce, 0x00de, 0x00ee, 0x0005,
-	0x7214, 0x9286, 0xffff, 0x0150, 0x080c, 0xc813, 0x01c0, 0x9280,
-	0x0002, 0x2004, 0x7110, 0x9106, 0x1190, 0x08e0, 0x7210, 0x2c08,
-	0x9085, 0x0001, 0x080c, 0xe24a, 0x2c10, 0x2160, 0x0140, 0x0890,
-	0x6007, 0x0037, 0x602f, 0x0009, 0x6017, 0x1500, 0x08b8, 0x6007,
-	0x0037, 0x602f, 0x0003, 0x6017, 0x1700, 0x0880, 0x6007, 0x0012,
-	0x0868, 0x080c, 0x318e, 0x1904, 0xd3c3, 0x6010, 0x2058, 0xb804,
-	0x9084, 0xff00, 0x8007, 0x9086, 0x0006, 0x1904, 0xd1b7, 0x00e6,
-	0x00d6, 0x00c6, 0x080c, 0x54bb, 0xd0e4, 0x0904, 0xd386, 0x2069,
-	0x1800, 0x2071, 0x026c, 0x7008, 0x603a, 0x720c, 0x623e, 0x9286,
-	0xffff, 0x1150, 0x7208, 0x00c6, 0x2c08, 0x9085, 0x0001, 0x080c,
-	0xe24a, 0x2c10, 0x00ce, 0x05e8, 0x080c, 0xc813, 0x05d0, 0x7108,
-	0x9280, 0x0002, 0x2004, 0x9106, 0x15a0, 0x00c6, 0x0026, 0x2260,
-	0x080c, 0xc465, 0x002e, 0x00ce, 0x7118, 0x918c, 0xff00, 0x810f,
-	0x9186, 0x0001, 0x0178, 0x9186, 0x0005, 0x0118, 0x9186, 0x0007,
-	0x1198, 0x9280, 0x0005, 0x2004, 0x9005, 0x0170, 0x080c, 0xd47b,
-	0x0904, 0xd307, 0x0056, 0x7510, 0x7614, 0x080c, 0xe310, 0x005e,
-	0x00ce, 0x00de, 0x00ee, 0x0005, 0x6007, 0x003b, 0x602f, 0x0009,
-	0x6017, 0x2a00, 0x6003, 0x0001, 0x080c, 0x8e7f, 0x080c, 0x941c,
-	0x0c78, 0x6007, 0x003b, 0x602f, 0x0003, 0x6017, 0x0300, 0x6003,
-	0x0001, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x0c10, 0x6007, 0x003b,
-	0x602f, 0x000b, 0x6017, 0x0000, 0x0804, 0xd2de, 0x00e6, 0x0026,
-	0x080c, 0x66f5, 0x0550, 0x080c, 0x669a, 0x080c, 0xe4e9, 0x1518,
-	0x2071, 0x1800, 0x70dc, 0x9085, 0x0003, 0x70de, 0x00f6, 0x2079,
-	0x0100, 0x72b0, 0x9284, 0x00ff, 0x707e, 0x78e6, 0x9284, 0xff00,
-	0x7280, 0x9205, 0x7082, 0x78ea, 0x00fe, 0x70e7, 0x0000, 0x080c,
-	0x6733, 0x0120, 0x2011, 0x19fe, 0x2013, 0x07d0, 0xd0ac, 0x1128,
-	0x080c, 0x2e48, 0x0010, 0x080c, 0xe51b, 0x002e, 0x00ee, 0x080c,
-	0xab6b, 0x0804, 0xd1b6, 0x080c, 0xab6b, 0x0005, 0x2600, 0x0002,
-	0xd3da, 0xd40b, 0xd41c, 0xd3da, 0xd3da, 0xd3dc, 0xd42d, 0xd3da,
-	0xd3da, 0xd3da, 0xd3f9, 0xd3da, 0xd3da, 0xd3da, 0xd438, 0xd445,
-	0xd476, 0xd3da, 0x080c, 0x0dd5, 0x080c, 0xe477, 0x1d20, 0x080c,
-	0x318e, 0x1d08, 0x080c, 0xd58e, 0x1148, 0x7038, 0x6016, 0x6007,
-	0x0045, 0x6003, 0x0001, 0x080c, 0x8ec7, 0x0005, 0x080c, 0x306e,
-	0x080c, 0xcf2d, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x8ec7,
-	0x0005, 0x080c, 0xe477, 0x1938, 0x080c, 0x318e, 0x1920, 0x080c,
-	0xd58e, 0x1d60, 0x703c, 0x6016, 0x6007, 0x004a, 0x6003, 0x0001,
-	0x080c, 0x8ec7, 0x0005, 0x080c, 0x318e, 0x1904, 0xd3c3, 0x2009,
-	0x0041, 0x080c, 0xe524, 0x6007, 0x0047, 0x6003, 0x0001, 0x080c,
-	0x8ec7, 0x080c, 0x941c, 0x0005, 0x080c, 0x318e, 0x1904, 0xd3c3,
-	0x2009, 0x0042, 0x080c, 0xe524, 0x6007, 0x0047, 0x6003, 0x0001,
-	0x080c, 0x8ec7, 0x080c, 0x941c, 0x0005, 0x080c, 0x318e, 0x1904,
-	0xd3c3, 0x2009, 0x0046, 0x080c, 0xe524, 0x080c, 0xab6b, 0x0005,
-	0x080c, 0xd496, 0x0904, 0xd3c3, 0x6007, 0x004e, 0x6003, 0x0001,
-	0x080c, 0x8ec7, 0x080c, 0x941c, 0x0005, 0x6007, 0x004f, 0x6017,
-	0x0000, 0x7134, 0x918c, 0x00ff, 0x81ff, 0x0508, 0x9186, 0x0001,
-	0x1160, 0x7140, 0x2001, 0x19bb, 0x2004, 0x9106, 0x11b0, 0x7144,
-	0x2001, 0x19bc, 0x2004, 0x9106, 0x0190, 0x9186, 0x0002, 0x1168,
-	0x2011, 0x0276, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019,
-	0x000a, 0x080c, 0xbb27, 0x009e, 0x0110, 0x6017, 0x0001, 0x6003,
-	0x0001, 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0005, 0x6007, 0x0050,
-	0x703c, 0x6016, 0x0ca0, 0x00e6, 0x2071, 0x0260, 0x00b6, 0x00c6,
-	0x2260, 0x6010, 0x2058, 0xb8cc, 0xd084, 0x0150, 0x7128, 0x6048,
-	0x9106, 0x1120, 0x712c, 0x6044, 0x9106, 0x0110, 0x9006, 0x0010,
-	0x9085, 0x0001, 0x00ce, 0x00be, 0x00ee, 0x0005, 0x0016, 0x0096,
-	0x0086, 0x00e6, 0x01c6, 0x01d6, 0x0126, 0x2091, 0x8000, 0x2071,
-	0x1800, 0x7090, 0x908a, 0x00f9, 0x16e8, 0x20e1, 0x0000, 0x2001,
-	0x199e, 0x2003, 0x0000, 0x080c, 0x1019, 0x05a0, 0x2900, 0x6016,
-	0x7090, 0x8004, 0xa816, 0x908a, 0x001e, 0x02d0, 0xa833, 0x001e,
-	0x20a9, 0x001e, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0,
-	0x2001, 0x199e, 0x0016, 0x200c, 0x0471, 0x001e, 0x2940, 0x080c,
-	0x1019, 0x01c0, 0x2900, 0xa006, 0x2100, 0x81ff, 0x0180, 0x0c18,
-	0xa832, 0x20a8, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0,
-	0x2001, 0x199e, 0x0016, 0x200c, 0x00b1, 0x001e, 0x0000, 0x9085,
-	0x0001, 0x0048, 0x2071, 0x1800, 0x7093, 0x0000, 0x6014, 0x2048,
-	0x080c, 0x0fb2, 0x9006, 0x012e, 0x01de, 0x01ce, 0x00ee, 0x008e,
-	0x009e, 0x001e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00c6,
-	0x918c, 0xffff, 0x11a8, 0x080c, 0x225d, 0x2099, 0x026c, 0x2001,
-	0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x00f8, 0x20a8,
-	0x4003, 0x22a8, 0x8108, 0x080c, 0x225d, 0x2099, 0x0260, 0x0ca8,
-	0x080c, 0x225d, 0x2061, 0x199e, 0x6004, 0x2098, 0x6008, 0x3518,
-	0x9312, 0x1218, 0x23a8, 0x4003, 0x0048, 0x20a8, 0x4003, 0x22a8,
-	0x8108, 0x080c, 0x225d, 0x2099, 0x0260, 0x0ca8, 0x2061, 0x199e,
-	0x2019, 0x0280, 0x3300, 0x931e, 0x0110, 0x6006, 0x0020, 0x2001,
-	0x0260, 0x6006, 0x8108, 0x2162, 0x9292, 0x0021, 0x9296, 0xffff,
-	0x620a, 0x00ce, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006,
-	0x0016, 0x0026, 0x0036, 0x00c6, 0x81ff, 0x11b8, 0x080c, 0x2275,
-	0x20a1, 0x024c, 0x2001, 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8,
-	0x4003, 0x0418, 0x20a8, 0x4003, 0x82ff, 0x01f8, 0x22a8, 0x8108,
-	0x080c, 0x2275, 0x20a1, 0x0240, 0x0c98, 0x080c, 0x2275, 0x2061,
-	0x19a1, 0x6004, 0x20a0, 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8,
-	0x4003, 0x0058, 0x20a8, 0x4003, 0x82ff, 0x0138, 0x22a8, 0x8108,
-	0x080c, 0x2275, 0x20a1, 0x0240, 0x0c98, 0x2061, 0x19a1, 0x2019,
-	0x0260, 0x3400, 0x931e, 0x0110, 0x6006, 0x0020, 0x2001, 0x0240,
-	0x6006, 0x8108, 0x2162, 0x9292, 0x0021, 0x9296, 0xffff, 0x620a,
-	0x00ce, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x00b6, 0x0066,
+	0x0001, 0x0804, 0xd4bb, 0x2001, 0x0001, 0x080c, 0x653c, 0x0156,
+	0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011,
+	0x0270, 0x080c, 0xbdef, 0x003e, 0x002e, 0x001e, 0x015e, 0x9005,
+	0x0168, 0x96b4, 0xff00, 0x8637, 0x9682, 0x0004, 0x0a04, 0xd3a8,
+	0x9682, 0x0007, 0x0a04, 0xd404, 0x0804, 0xd3a8, 0x6017, 0x1900,
+	0x6007, 0x0009, 0x0804, 0xd4bb, 0x080c, 0x6928, 0x1140, 0x2001,
+	0x1837, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, 0x1110, 0x0804,
+	0xd2e7, 0x080c, 0x68cd, 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff,
+	0x9082, 0x0006, 0x0690, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0004,
+	0x0120, 0x9686, 0x0006, 0x1904, 0xd3a8, 0x080c, 0xe29b, 0x1130,
+	0x080c, 0xe198, 0x1118, 0x6007, 0x0010, 0x04e8, 0x0046, 0x6410,
+	0x2458, 0xbca0, 0x0046, 0x080c, 0x31bc, 0x080c, 0xd22b, 0x004e,
+	0x0016, 0x9006, 0x2009, 0x1848, 0x210c, 0xd1a4, 0x0148, 0x2009,
+	0x0029, 0x080c, 0xe58d, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802,
+	0x001e, 0x004e, 0x6007, 0x0001, 0x00f0, 0x080c, 0xe420, 0x0140,
+	0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0978, 0x0804, 0xd3a8,
+	0x6017, 0x1900, 0x6007, 0x0009, 0x0070, 0x080c, 0x32dc, 0x1904,
+	0xd6ce, 0x080c, 0xe789, 0x1904, 0xd6ce, 0x080c, 0xd89b, 0x1904,
+	0xd3a8, 0x6007, 0x0012, 0x6003, 0x0001, 0x080c, 0x910f, 0x080c,
+	0x9664, 0x0005, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x910f,
+	0x080c, 0x9664, 0x0cb0, 0x6007, 0x0005, 0x0c68, 0x080c, 0xe789,
+	0x1904, 0xd6ce, 0x080c, 0x32dc, 0x1904, 0xd6ce, 0x080c, 0xd89b,
+	0x1904, 0xd3a8, 0x6007, 0x0020, 0x6003, 0x0001, 0x080c, 0x910f,
+	0x080c, 0x9664, 0x0005, 0x080c, 0x32dc, 0x1904, 0xd6ce, 0x6007,
+	0x0023, 0x6003, 0x0001, 0x080c, 0x910f, 0x080c, 0x9664, 0x0005,
+	0x080c, 0xe789, 0x1904, 0xd6ce, 0x080c, 0x32dc, 0x1904, 0xd6ce,
+	0x080c, 0xd89b, 0x1904, 0xd3a8, 0x0016, 0x0026, 0x00e6, 0x2071,
+	0x0260, 0x7244, 0x9286, 0xffff, 0x0180, 0x2c08, 0x080c, 0xcb09,
+	0x01b0, 0x2260, 0x7240, 0x6008, 0x9206, 0x1188, 0x6010, 0x9190,
+	0x0004, 0x2214, 0x9206, 0x01b8, 0x0050, 0x7240, 0x2c08, 0x9006,
+	0x080c, 0xe557, 0x1180, 0x7244, 0x9286, 0xffff, 0x01b0, 0x2160,
+	0x6007, 0x0026, 0x6017, 0x1700, 0x7214, 0x9296, 0xffff, 0x1180,
+	0x6007, 0x0025, 0x0068, 0x6020, 0x9086, 0x0007, 0x1d80, 0x6004,
+	0x9086, 0x0024, 0x1110, 0x080c, 0xae47, 0x2160, 0x6007, 0x0025,
+	0x6003, 0x0001, 0x080c, 0x910f, 0x080c, 0x9664, 0x00ee, 0x002e,
+	0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x653c, 0x0156, 0x0016,
+	0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0276,
+	0x080c, 0xbdef, 0x003e, 0x002e, 0x001e, 0x015e, 0x0120, 0x6007,
+	0x0031, 0x0804, 0xd4bb, 0x080c, 0xba63, 0x080c, 0x73b0, 0x1190,
+	0x0006, 0x0026, 0x0036, 0x080c, 0x73ca, 0x1138, 0x080c, 0x7698,
+	0x080c, 0x601b, 0x080c, 0x72e2, 0x0010, 0x080c, 0x7388, 0x003e,
+	0x002e, 0x000e, 0x0005, 0x080c, 0x32dc, 0x1904, 0xd6ce, 0x080c,
+	0xd89b, 0x1904, 0xd3a8, 0x6106, 0x080c, 0xd8b7, 0x1120, 0x6007,
+	0x002b, 0x0804, 0xd4bb, 0x6007, 0x002c, 0x0804, 0xd4bb, 0x080c,
+	0xe789, 0x1904, 0xd6ce, 0x080c, 0x32dc, 0x1904, 0xd6ce, 0x080c,
+	0xd89b, 0x1904, 0xd3a8, 0x6106, 0x080c, 0xd8bc, 0x1120, 0x6007,
+	0x002e, 0x0804, 0xd4bb, 0x6007, 0x002f, 0x0804, 0xd4bb, 0x080c,
+	0x32dc, 0x1904, 0xd6ce, 0x00e6, 0x00d6, 0x00c6, 0x6010, 0x2058,
+	0xb904, 0x9184, 0x00ff, 0x9086, 0x0006, 0x0158, 0x9184, 0xff00,
+	0x8007, 0x9086, 0x0006, 0x0128, 0x00ce, 0x00de, 0x00ee, 0x0804,
+	0xd4c2, 0x080c, 0x56d4, 0xd0e4, 0x0904, 0xd619, 0x2071, 0x026c,
+	0x7010, 0x603a, 0x7014, 0x603e, 0x7108, 0x720c, 0x080c, 0x6966,
+	0x0140, 0x6010, 0x2058, 0xb810, 0x9106, 0x1118, 0xb814, 0x9206,
+	0x0510, 0x080c, 0x6962, 0x15b8, 0x2069, 0x1800, 0x6880, 0x9206,
+	0x1590, 0x687c, 0x9106, 0x1578, 0x7210, 0x080c, 0xcb09, 0x0590,
+	0x080c, 0xd786, 0x0578, 0x080c, 0xe609, 0x0560, 0x622e, 0x6007,
+	0x0036, 0x6003, 0x0001, 0x080c, 0x90c7, 0x080c, 0x9664, 0x00ce,
+	0x00de, 0x00ee, 0x0005, 0x7214, 0x9286, 0xffff, 0x0150, 0x080c,
+	0xcb09, 0x01c0, 0x9280, 0x0002, 0x2004, 0x7110, 0x9106, 0x1190,
+	0x08e0, 0x7210, 0x2c08, 0x9085, 0x0001, 0x080c, 0xe557, 0x2c10,
+	0x2160, 0x0140, 0x0890, 0x6007, 0x0037, 0x602f, 0x0009, 0x6017,
+	0x1500, 0x08b8, 0x6007, 0x0037, 0x602f, 0x0003, 0x6017, 0x1700,
+	0x0880, 0x6007, 0x0012, 0x0868, 0x080c, 0x32dc, 0x1904, 0xd6ce,
+	0x6010, 0x2058, 0xb804, 0x9084, 0xff00, 0x8007, 0x9086, 0x0006,
+	0x1904, 0xd4c2, 0x00e6, 0x00d6, 0x00c6, 0x080c, 0x56d4, 0xd0e4,
+	0x0904, 0xd691, 0x2069, 0x1800, 0x2071, 0x026c, 0x7008, 0x603a,
+	0x720c, 0x623e, 0x9286, 0xffff, 0x1150, 0x7208, 0x00c6, 0x2c08,
+	0x9085, 0x0001, 0x080c, 0xe557, 0x2c10, 0x00ce, 0x05e8, 0x080c,
+	0xcb09, 0x05d0, 0x7108, 0x9280, 0x0002, 0x2004, 0x9106, 0x15a0,
+	0x00c6, 0x0026, 0x2260, 0x080c, 0xc741, 0x002e, 0x00ce, 0x7118,
+	0x918c, 0xff00, 0x810f, 0x9186, 0x0001, 0x0178, 0x9186, 0x0005,
+	0x0118, 0x9186, 0x0007, 0x1198, 0x9280, 0x0005, 0x2004, 0x9005,
+	0x0170, 0x080c, 0xd786, 0x0904, 0xd612, 0x0056, 0x7510, 0x7614,
+	0x080c, 0xe622, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x6007,
+	0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, 0x0001, 0x080c,
+	0x90c7, 0x080c, 0x9664, 0x0c78, 0x6007, 0x003b, 0x602f, 0x0003,
+	0x6017, 0x0300, 0x6003, 0x0001, 0x080c, 0x90c7, 0x080c, 0x9664,
+	0x0c10, 0x6007, 0x003b, 0x602f, 0x000b, 0x6017, 0x0000, 0x0804,
+	0xd5e9, 0x00e6, 0x0026, 0x080c, 0x6928, 0x0550, 0x080c, 0x68cd,
+	0x080c, 0xe7fb, 0x1518, 0x2071, 0x1800, 0x70dc, 0x9085, 0x0003,
+	0x70de, 0x00f6, 0x2079, 0x0100, 0x72b0, 0x9284, 0x00ff, 0x707e,
+	0x78e6, 0x9284, 0xff00, 0x7280, 0x9205, 0x7082, 0x78ea, 0x00fe,
+	0x70e7, 0x0000, 0x080c, 0x6966, 0x0120, 0x2011, 0x1a00, 0x2013,
+	0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2f96, 0x0010, 0x080c, 0xe82d,
+	0x002e, 0x00ee, 0x080c, 0xae47, 0x0804, 0xd4c1, 0x080c, 0xae47,
+	0x0005, 0x2600, 0x0002, 0xd6e5, 0xd716, 0xd727, 0xd6e5, 0xd6e5,
+	0xd6e7, 0xd738, 0xd6e5, 0xd6e5, 0xd6e5, 0xd704, 0xd6e5, 0xd6e5,
+	0xd6e5, 0xd743, 0xd750, 0xd781, 0xd6e5, 0x080c, 0x0dd5, 0x080c,
+	0xe789, 0x1d20, 0x080c, 0x32dc, 0x1d08, 0x080c, 0xd89b, 0x1148,
+	0x7038, 0x6016, 0x6007, 0x0045, 0x6003, 0x0001, 0x080c, 0x910f,
+	0x0005, 0x080c, 0x31bc, 0x080c, 0xd22b, 0x6007, 0x0001, 0x6003,
+	0x0001, 0x080c, 0x910f, 0x0005, 0x080c, 0xe789, 0x1938, 0x080c,
+	0x32dc, 0x1920, 0x080c, 0xd89b, 0x1d60, 0x703c, 0x6016, 0x6007,
+	0x004a, 0x6003, 0x0001, 0x080c, 0x910f, 0x0005, 0x080c, 0x32dc,
+	0x1904, 0xd6ce, 0x2009, 0x0041, 0x080c, 0xe836, 0x6007, 0x0047,
+	0x6003, 0x0001, 0x080c, 0x910f, 0x080c, 0x9664, 0x0005, 0x080c,
+	0x32dc, 0x1904, 0xd6ce, 0x2009, 0x0042, 0x080c, 0xe836, 0x6007,
+	0x0047, 0x6003, 0x0001, 0x080c, 0x910f, 0x080c, 0x9664, 0x0005,
+	0x080c, 0x32dc, 0x1904, 0xd6ce, 0x2009, 0x0046, 0x080c, 0xe836,
+	0x080c, 0xae47, 0x0005, 0x080c, 0xd7a3, 0x0904, 0xd6ce, 0x6007,
+	0x004e, 0x6003, 0x0001, 0x080c, 0x910f, 0x080c, 0x9664, 0x0005,
+	0x6007, 0x004f, 0x6017, 0x0000, 0x7134, 0x918c, 0x00ff, 0x81ff,
+	0x0508, 0x9186, 0x0001, 0x1160, 0x7140, 0x2001, 0x19bd, 0x2004,
+	0x9106, 0x11b0, 0x7144, 0x2001, 0x19be, 0x2004, 0x9106, 0x0190,
+	0x9186, 0x0002, 0x1168, 0x2011, 0x0276, 0x20a9, 0x0004, 0x6010,
+	0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xbe03, 0x009e, 0x0110,
+	0x6017, 0x0001, 0x6003, 0x0001, 0x080c, 0x910f, 0x080c, 0x9664,
+	0x0005, 0x6007, 0x0050, 0x703c, 0x6016, 0x0ca0, 0x0016, 0x00e6,
+	0x2071, 0x0260, 0x00b6, 0x00c6, 0x2260, 0x6010, 0x2058, 0xb8cc,
+	0xd084, 0x0150, 0x7128, 0x6048, 0x9106, 0x1120, 0x712c, 0x6044,
+	0x9106, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce, 0x00be,
+	0x00ee, 0x001e, 0x0005, 0x0016, 0x0096, 0x0086, 0x00e6, 0x01c6,
+	0x01d6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x7090, 0x908a,
+	0x00f9, 0x16e8, 0x20e1, 0x0000, 0x2001, 0x19a0, 0x2003, 0x0000,
+	0x080c, 0x1018, 0x05a0, 0x2900, 0x6016, 0x7090, 0x8004, 0xa816,
+	0x908a, 0x001e, 0x02d0, 0xa833, 0x001e, 0x20a9, 0x001e, 0xa860,
+	0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, 0x19a0, 0x0016,
+	0x200c, 0x0471, 0x001e, 0x2940, 0x080c, 0x1018, 0x01c0, 0x2900,
+	0xa006, 0x2100, 0x81ff, 0x0180, 0x0c18, 0xa832, 0x20a8, 0xa860,
+	0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, 0x19a0, 0x0016,
+	0x200c, 0x00b1, 0x001e, 0x0000, 0x9085, 0x0001, 0x0048, 0x2071,
+	0x1800, 0x7093, 0x0000, 0x6014, 0x2048, 0x080c, 0x0fb1, 0x9006,
+	0x012e, 0x01de, 0x01ce, 0x00ee, 0x008e, 0x009e, 0x001e, 0x0005,
+	0x0006, 0x0016, 0x0026, 0x0036, 0x00c6, 0x918c, 0xffff, 0x11a8,
+	0x080c, 0x23ab, 0x2099, 0x026c, 0x2001, 0x0014, 0x3518, 0x9312,
+	0x1218, 0x23a8, 0x4003, 0x00f8, 0x20a8, 0x4003, 0x22a8, 0x8108,
+	0x080c, 0x23ab, 0x2099, 0x0260, 0x0ca8, 0x080c, 0x23ab, 0x2061,
+	0x19a0, 0x6004, 0x2098, 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8,
+	0x4003, 0x0048, 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, 0x23ab,
+	0x2099, 0x0260, 0x0ca8, 0x2061, 0x19a0, 0x2019, 0x0280, 0x3300,
+	0x931e, 0x0110, 0x6006, 0x0020, 0x2001, 0x0260, 0x6006, 0x8108,
+	0x2162, 0x9292, 0x0021, 0x9296, 0xffff, 0x620a, 0x00ce, 0x003e,
+	0x002e, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036,
+	0x00c6, 0x81ff, 0x11b8, 0x080c, 0x23c3, 0x20a1, 0x024c, 0x2001,
+	0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0418, 0x20a8,
+	0x4003, 0x82ff, 0x01f8, 0x22a8, 0x8108, 0x080c, 0x23c3, 0x20a1,
+	0x0240, 0x0c98, 0x080c, 0x23c3, 0x2061, 0x19a3, 0x6004, 0x20a0,
+	0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0058, 0x20a8,
+	0x4003, 0x82ff, 0x0138, 0x22a8, 0x8108, 0x080c, 0x23c3, 0x20a1,
+	0x0240, 0x0c98, 0x2061, 0x19a3, 0x2019, 0x0260, 0x3400, 0x931e,
+	0x0110, 0x6006, 0x0020, 0x2001, 0x0240, 0x6006, 0x8108, 0x2162,
+	0x9292, 0x0021, 0x9296, 0xffff, 0x620a, 0x00ce, 0x003e, 0x002e,
+	0x001e, 0x000e, 0x0005, 0x00b6, 0x0066, 0x6610, 0x2658, 0xbe04,
+	0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0170, 0x9686, 0x0004,
+	0x0158, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, 0x0128, 0x9686,
+	0x0004, 0x0110, 0x9085, 0x0001, 0x006e, 0x00be, 0x0005, 0x00d6,
+	0x080c, 0xd933, 0x00de, 0x0005, 0x00d6, 0x080c, 0xd940, 0x1520,
+	0x680c, 0x908c, 0xff00, 0x6820, 0x9084, 0x00ff, 0x9115, 0x6216,
+	0x6824, 0x602e, 0xd1e4, 0x0130, 0x9006, 0x080c, 0xe956, 0x2009,
+	0x0001, 0x0078, 0xd1ec, 0x0180, 0x6920, 0x918c, 0x00ff, 0x6824,
+	0x080c, 0x283e, 0x1148, 0x2001, 0x0001, 0x080c, 0xe956, 0x2110,
+	0x900e, 0x080c, 0x3201, 0x0018, 0x9085, 0x0001, 0x0008, 0x9006,
+	0x00de, 0x0005, 0x00b6, 0x00c6, 0x080c, 0xae95, 0x05a8, 0x0016,
+	0x0026, 0x00c6, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c,
+	0x283e, 0x1578, 0x080c, 0x659f, 0x1560, 0xbe12, 0xbd16, 0x00ce,
+	0x002e, 0x001e, 0x2b00, 0x6012, 0x080c, 0xe789, 0x11d8, 0x080c,
+	0x32dc, 0x11c0, 0x080c, 0xd89b, 0x0510, 0x2001, 0x0007, 0x080c,
+	0x6550, 0x2001, 0x0007, 0x080c, 0x657c, 0x6017, 0x0000, 0x6023,
+	0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x910f, 0x080c,
+	0x9664, 0x0010, 0x080c, 0xae47, 0x9085, 0x0001, 0x00ce, 0x00be,
+	0x0005, 0x080c, 0xae47, 0x00ce, 0x002e, 0x001e, 0x0ca8, 0x080c,
+	0xae47, 0x9006, 0x0c98, 0x2069, 0x026d, 0x6800, 0x9082, 0x0010,
+	0x1228, 0x6017, 0x0000, 0x9085, 0x0001, 0x0008, 0x9006, 0x0005,
+	0x6017, 0x0000, 0x2069, 0x026c, 0x6808, 0x9084, 0xff00, 0x9086,
+	0x0800, 0x1190, 0x6904, 0x9186, 0x0018, 0x0118, 0x9186, 0x0014,
+	0x1158, 0x810f, 0x6800, 0x9084, 0x00ff, 0x910d, 0x615a, 0x908e,
+	0x0014, 0x0110, 0x908e, 0x0010, 0x0005, 0x6004, 0x90b2, 0x0053,
+	0x1a0c, 0x0dd5, 0x91b6, 0x0013, 0x1130, 0x2008, 0x91b2, 0x0040,
+	0x1a04, 0xda8a, 0x0092, 0x91b6, 0x0027, 0x0120, 0x91b6, 0x0014,
+	0x190c, 0x0dd5, 0x2001, 0x0007, 0x080c, 0x657c, 0x080c, 0x955f,
+	0x080c, 0xae78, 0x080c, 0x9664, 0x0005, 0xd9bd, 0xd9bf, 0xd9bd,
+	0xd9bd, 0xd9bd, 0xd9bf, 0xd9ce, 0xda83, 0xda20, 0xda83, 0xda34,
+	0xda83, 0xd9ce, 0xda83, 0xda7b, 0xda83, 0xda7b, 0xda83, 0xda83,
+	0xd9bd, 0xd9bd, 0xd9bd, 0xd9bd, 0xd9bd, 0xd9bd, 0xd9bd, 0xd9bd,
+	0xd9bd, 0xd9bd, 0xd9bd, 0xd9bf, 0xd9bd, 0xda83, 0xd9bd, 0xd9bd,
+	0xda83, 0xd9bd, 0xda80, 0xda83, 0xd9bd, 0xd9bd, 0xd9bd, 0xd9bd,
+	0xda83, 0xda83, 0xd9bd, 0xda83, 0xda83, 0xd9bd, 0xd9c9, 0xd9bd,
+	0xd9bd, 0xd9bd, 0xd9bd, 0xda7f, 0xda83, 0xd9bd, 0xd9bd, 0xda83,
+	0xda83, 0xd9bd, 0xd9bd, 0xd9bd, 0xd9bd, 0x080c, 0x0dd5, 0x080c,
+	0x955f, 0x080c, 0xd22e, 0x6003, 0x0002, 0x080c, 0x9664, 0x0804,
+	0xda89, 0x9006, 0x080c, 0x653c, 0x0804, 0xda83, 0x080c, 0x6962,
+	0x1904, 0xda83, 0x9006, 0x080c, 0x653c, 0x6010, 0x2058, 0xb810,
+	0x9086, 0x00ff, 0x1140, 0x00f6, 0x2079, 0x1800, 0x78a8, 0x8000,
+	0x78aa, 0x00fe, 0x0428, 0x6010, 0x2058, 0xb8c0, 0x9005, 0x1178,
+	0x080c, 0xd216, 0x1904, 0xda83, 0x0036, 0x0046, 0xbba0, 0x2021,
+	0x0007, 0x080c, 0x4cbc, 0x004e, 0x003e, 0x0804, 0xda83, 0x080c,
+	0x330d, 0x1904, 0xda83, 0x2001, 0x1800, 0x2004, 0x9086, 0x0002,
+	0x1138, 0x00f6, 0x2079, 0x1800, 0x78a8, 0x8000, 0x78aa, 0x00fe,
+	0x2001, 0x0002, 0x080c, 0x6550, 0x080c, 0x955f, 0x6023, 0x0001,
+	0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x910f, 0x080c, 0x9664,
+	0x6110, 0x2158, 0x2009, 0x0001, 0x080c, 0x84d8, 0x0804, 0xda89,
 	0x6610, 0x2658, 0xbe04, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006,
-	0x0170, 0x9686, 0x0004, 0x0158, 0xbe04, 0x96b4, 0x00ff, 0x9686,
-	0x0006, 0x0128, 0x9686, 0x0004, 0x0110, 0x9085, 0x0001, 0x006e,
-	0x00be, 0x0005, 0x00d6, 0x080c, 0xd626, 0x00de, 0x0005, 0x00d6,
-	0x080c, 0xd633, 0x1520, 0x680c, 0x908c, 0xff00, 0x6820, 0x9084,
-	0x00ff, 0x9115, 0x6216, 0x6824, 0x602e, 0xd1e4, 0x0130, 0x9006,
-	0x080c, 0xe644, 0x2009, 0x0001, 0x0078, 0xd1ec, 0x0180, 0x6920,
-	0x918c, 0x00ff, 0x6824, 0x080c, 0x26f0, 0x1148, 0x2001, 0x0001,
-	0x080c, 0xe644, 0x2110, 0x900e, 0x080c, 0x30b3, 0x0018, 0x9085,
-	0x0001, 0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, 0x00c6, 0x080c,
-	0xabb9, 0x05a8, 0x0016, 0x0026, 0x00c6, 0x2011, 0x0263, 0x2204,
-	0x8211, 0x220c, 0x080c, 0x26f0, 0x1578, 0x080c, 0x636c, 0x1560,
-	0xbe12, 0xbd16, 0x00ce, 0x002e, 0x001e, 0x2b00, 0x6012, 0x080c,
-	0xe477, 0x11d8, 0x080c, 0x318e, 0x11c0, 0x080c, 0xd58e, 0x0510,
-	0x2001, 0x0007, 0x080c, 0x631d, 0x2001, 0x0007, 0x080c, 0x6349,
-	0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001,
-	0x080c, 0x8ec7, 0x080c, 0x941c, 0x0010, 0x080c, 0xab6b, 0x9085,
-	0x0001, 0x00ce, 0x00be, 0x0005, 0x080c, 0xab6b, 0x00ce, 0x002e,
-	0x001e, 0x0ca8, 0x080c, 0xab6b, 0x9006, 0x0c98, 0x2069, 0x026d,
-	0x6800, 0x9082, 0x0010, 0x1228, 0x6017, 0x0000, 0x9085, 0x0001,
-	0x0008, 0x9006, 0x0005, 0x6017, 0x0000, 0x2069, 0x026c, 0x6808,
-	0x9084, 0xff00, 0x9086, 0x0800, 0x1190, 0x6904, 0x9186, 0x0018,
-	0x0118, 0x9186, 0x0014, 0x1158, 0x810f, 0x6800, 0x9084, 0x00ff,
-	0x910d, 0x615a, 0x908e, 0x0014, 0x0110, 0x908e, 0x0010, 0x0005,
-	0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0dd5, 0x91b6, 0x0013, 0x1130,
-	0x2008, 0x91b2, 0x0040, 0x1a04, 0xd77d, 0x0092, 0x91b6, 0x0027,
-	0x0120, 0x91b6, 0x0014, 0x190c, 0x0dd5, 0x2001, 0x0007, 0x080c,
-	0x6349, 0x080c, 0x9317, 0x080c, 0xab9c, 0x080c, 0x941c, 0x0005,
-	0xd6b0, 0xd6b2, 0xd6b0, 0xd6b0, 0xd6b0, 0xd6b2, 0xd6c1, 0xd776,
-	0xd713, 0xd776, 0xd727, 0xd776, 0xd6c1, 0xd776, 0xd76e, 0xd776,
-	0xd76e, 0xd776, 0xd776, 0xd6b0, 0xd6b0, 0xd6b0, 0xd6b0, 0xd6b0,
-	0xd6b0, 0xd6b0, 0xd6b0, 0xd6b0, 0xd6b0, 0xd6b0, 0xd6b2, 0xd6b0,
-	0xd776, 0xd6b0, 0xd6b0, 0xd776, 0xd6b0, 0xd773, 0xd776, 0xd6b0,
-	0xd6b0, 0xd6b0, 0xd6b0, 0xd776, 0xd776, 0xd6b0, 0xd776, 0xd776,
-	0xd6b0, 0xd6bc, 0xd6b0, 0xd6b0, 0xd6b0, 0xd6b0, 0xd772, 0xd776,
-	0xd6b0, 0xd6b0, 0xd776, 0xd776, 0xd6b0, 0xd6b0, 0xd6b0, 0xd6b0,
-	0x080c, 0x0dd5, 0x080c, 0x9317, 0x080c, 0xcf30, 0x6003, 0x0002,
-	0x080c, 0x941c, 0x0804, 0xd77c, 0x9006, 0x080c, 0x6309, 0x0804,
-	0xd776, 0x080c, 0x672f, 0x1904, 0xd776, 0x9006, 0x080c, 0x6309,
-	0x6010, 0x2058, 0xb810, 0x9086, 0x00ff, 0x1140, 0x00f6, 0x2079,
-	0x1800, 0x78a8, 0x8000, 0x78aa, 0x00fe, 0x0428, 0x6010, 0x2058,
-	0xb8c0, 0x9005, 0x1178, 0x080c, 0xcf18, 0x1904, 0xd776, 0x0036,
-	0x0046, 0xbba0, 0x2021, 0x0007, 0x080c, 0x4ab2, 0x004e, 0x003e,
-	0x0804, 0xd776, 0x080c, 0x31bf, 0x1904, 0xd776, 0x2001, 0x1800,
-	0x2004, 0x9086, 0x0002, 0x1138, 0x00f6, 0x2079, 0x1800, 0x78a8,
-	0x8000, 0x78aa, 0x00fe, 0x2001, 0x0002, 0x080c, 0x631d, 0x080c,
-	0x9317, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c,
-	0x8ec7, 0x080c, 0x941c, 0x6110, 0x2158, 0x2009, 0x0001, 0x080c,
-	0x8293, 0x0804, 0xd77c, 0x6610, 0x2658, 0xbe04, 0x96b4, 0xff00,
-	0x8637, 0x9686, 0x0006, 0x0904, 0xd776, 0x9686, 0x0004, 0x0904,
-	0xd776, 0x080c, 0x8a4a, 0x2001, 0x0004, 0x0804, 0xd774, 0x2001,
-	0x1800, 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0x6010,
-	0x2058, 0xbba0, 0x2021, 0x0006, 0x080c, 0x4ab2, 0x004e, 0x003e,
-	0x2001, 0x0006, 0x080c, 0xd79a, 0x6610, 0x2658, 0xbe04, 0x0066,
-	0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x006e, 0x0168, 0x2001,
-	0x0006, 0x080c, 0x6349, 0x9284, 0x00ff, 0x908e, 0x0007, 0x1120,
-	0x2001, 0x0006, 0x080c, 0x631d, 0x080c, 0x672f, 0x11f8, 0x2001,
-	0x1837, 0x2004, 0xd0a4, 0x01d0, 0xbe04, 0x96b4, 0x00ff, 0x9686,
-	0x0006, 0x01a0, 0x00f6, 0x2079, 0x1800, 0x78a8, 0x8000, 0x78aa,
-	0x00fe, 0x0804, 0xd6fb, 0x2001, 0x0004, 0x0030, 0x2001, 0x0006,
-	0x0449, 0x0020, 0x0018, 0x0010, 0x080c, 0x6349, 0x080c, 0x9317,
-	0x080c, 0xab6b, 0x080c, 0x941c, 0x0005, 0x2600, 0x0002, 0xd791,
-	0xd791, 0xd791, 0xd791, 0xd791, 0xd793, 0xd791, 0xd793, 0xd791,
-	0xd791, 0xd793, 0xd791, 0xd791, 0xd791, 0xd793, 0xd793, 0xd793,
-	0xd793, 0x080c, 0x0dd5, 0x080c, 0x9317, 0x080c, 0xab6b, 0x080c,
-	0x941c, 0x0005, 0x0016, 0x00b6, 0x00d6, 0x6110, 0x2158, 0xb900,
-	0xd184, 0x0138, 0x080c, 0x631d, 0x9006, 0x080c, 0x6309, 0x080c,
-	0x3093, 0x00de, 0x00be, 0x001e, 0x0005, 0x6610, 0x2658, 0xb804,
-	0x9084, 0xff00, 0x8007, 0x90b2, 0x000c, 0x1a0c, 0x0dd5, 0x91b6,
-	0x0015, 0x1110, 0x003b, 0x0028, 0x91b6, 0x0016, 0x190c, 0x0dd5,
-	0x006b, 0x0005, 0xb606, 0xb606, 0xb606, 0xb606, 0xb606, 0xb606,
-	0xd815, 0xd7da, 0xb606, 0xb606, 0xb606, 0xb606, 0xb606, 0xb606,
-	0xb606, 0xb606, 0xb606, 0xb606, 0xd815, 0xd81c, 0xb606, 0xb606,
-	0xb606, 0xb606, 0x00f6, 0x080c, 0x672f, 0x11d8, 0x080c, 0xcf18,
-	0x11c0, 0x6010, 0x905d, 0x01a8, 0xb8c0, 0x9005, 0x0190, 0x9006,
-	0x080c, 0x6309, 0x2001, 0x0002, 0x080c, 0x631d, 0x6023, 0x0001,
-	0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8ec7, 0x080c, 0x941c,
-	0x00d0, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x26f0,
-	0x1190, 0x080c, 0x63cd, 0x0118, 0x080c, 0xab6b, 0x0060, 0xb810,
-	0x0006, 0xb814, 0x0006, 0x080c, 0x5e12, 0x000e, 0xb816, 0x000e,
-	0xb812, 0x080c, 0xab6b, 0x00fe, 0x0005, 0x6604, 0x96b6, 0x001e,
-	0x1110, 0x080c, 0xab6b, 0x0005, 0x080c, 0xb98f, 0x1148, 0x6003,
-	0x0001, 0x6007, 0x0001, 0x080c, 0x8ec7, 0x080c, 0x941c, 0x0010,
-	0x080c, 0xab6b, 0x0005, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0dd5,
-	0x080c, 0x9317, 0x080c, 0xab9c, 0x080c, 0x941c, 0x0005, 0x9182,
-	0x0040, 0x0002, 0xd84d, 0xd84d, 0xd84d, 0xd84d, 0xd84f, 0xd84d,
-	0xd84d, 0xd84d, 0xd84d, 0xd84d, 0xd84d, 0xd84d, 0xd84d, 0xd84d,
-	0xd84d, 0xd84d, 0xd84d, 0xd84d, 0xd84d, 0x080c, 0x0dd5, 0x0096,
-	0x00b6, 0x00d6, 0x00e6, 0x00f6, 0x0046, 0x0026, 0x6210, 0x2258,
-	0xb8bc, 0x9005, 0x11a8, 0x6106, 0x2071, 0x0260, 0x7444, 0x94a4,
-	0xff00, 0x0904, 0xd8b5, 0x080c, 0xe638, 0x1170, 0x9486, 0x2000,
-	0x1158, 0x2009, 0x0001, 0x2011, 0x0200, 0x080c, 0x846c, 0x0020,
-	0x9026, 0x080c, 0xe4bc, 0x0c38, 0x080c, 0x1000, 0x090c, 0x0dd5,
-	0x6003, 0x0007, 0xa867, 0x010d, 0x9006, 0xa802, 0xa86a, 0xac8a,
-	0x2c00, 0xa88e, 0x6008, 0xa8e2, 0x6010, 0x2058, 0xb8a0, 0x7130,
-	0xa97a, 0x0016, 0xa876, 0xa87f, 0x0000, 0xa883, 0x0000, 0xa887,
-	0x0036, 0x080c, 0x6a46, 0x001e, 0x080c, 0xe638, 0x1904, 0xd915,
-	0x9486, 0x2000, 0x1130, 0x2019, 0x0017, 0x080c, 0xe1f4, 0x0804,
-	0xd915, 0x9486, 0x0200, 0x1120, 0x080c, 0xe190, 0x0804, 0xd915,
-	0x9486, 0x0400, 0x0120, 0x9486, 0x1000, 0x1904, 0xd915, 0x2019,
-	0x0002, 0x080c, 0xe1ab, 0x0804, 0xd915, 0x2069, 0x1a6e, 0x6a00,
-	0xd284, 0x0904, 0xd97f, 0x9284, 0x0300, 0x1904, 0xd978, 0x6804,
-	0x9005, 0x0904, 0xd960, 0x2d78, 0x6003, 0x0007, 0x080c, 0x1019,
-	0x0904, 0xd921, 0x7800, 0xd08c, 0x1118, 0x7804, 0x8001, 0x7806,
-	0x6017, 0x0000, 0x2001, 0x180f, 0x2004, 0xd084, 0x1904, 0xd983,
-	0x9006, 0xa802, 0xa867, 0x0116, 0xa86a, 0x6008, 0xa8e2, 0x2c00,
-	0xa87a, 0x6010, 0x2058, 0xb8a0, 0x7130, 0xa9b6, 0xa876, 0xb928,
-	0xa9ba, 0xb92c, 0xa9be, 0xb930, 0xa9c2, 0xb934, 0xa9c6, 0xa883,
-	0x003d, 0x7044, 0x9084, 0x0003, 0x9080, 0xd91d, 0x2005, 0xa87e,
-	0x20a9, 0x000a, 0x2001, 0x0270, 0xaa5c, 0x9290, 0x0021, 0x2009,
-	0x0205, 0x200b, 0x0080, 0x20e1, 0x0000, 0xab60, 0x23e8, 0x2098,
-	0x22a0, 0x4003, 0x200b, 0x0000, 0x2001, 0x027a, 0x200c, 0xa9b2,
-	0x8000, 0x200c, 0xa9ae, 0x080c, 0x6a46, 0x002e, 0x004e, 0x00fe,
-	0x00ee, 0x00de, 0x00be, 0x009e, 0x0005, 0x0000, 0x0080, 0x0040,
-	0x0000, 0x2001, 0x1810, 0x2004, 0xd084, 0x0120, 0x080c, 0x1000,
-	0x1904, 0xd8ca, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041,
-	0x080c, 0x8e7f, 0x080c, 0x941c, 0x0c00, 0x2069, 0x0260, 0x6848,
-	0x9084, 0xff00, 0x9086, 0x1200, 0x1198, 0x686c, 0x9084, 0x00ff,
-	0x0016, 0x6114, 0x918c, 0xf700, 0x910d, 0x6116, 0x001e, 0x6003,
-	0x0001, 0x6007, 0x0043, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x0828,
-	0x6868, 0x602e, 0x686c, 0x6032, 0x6017, 0xf200, 0x6003, 0x0001,
-	0x6007, 0x0041, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x0804, 0xd915,
-	0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c,
-	0x48fb, 0x6017, 0xf300, 0x0010, 0x6017, 0xf100, 0x6003, 0x0001,
-	0x6007, 0x0041, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x0804, 0xd915,
-	0x6017, 0xf500, 0x0c98, 0x6017, 0xf600, 0x0804, 0xd935, 0x6017,
-	0xf200, 0x0804, 0xd935, 0xa867, 0x0146, 0xa86b, 0x0000, 0x6008,
-	0xa886, 0x2c00, 0xa87a, 0x7044, 0x9084, 0x0003, 0x9080, 0xd91d,
-	0x2005, 0xa87e, 0x2928, 0x6010, 0x2058, 0xb8a0, 0xa876, 0xb828,
-	0xa88a, 0xb82c, 0xa88e, 0xb830, 0xa892, 0xb834, 0xa896, 0xa883,
-	0x003d, 0x2009, 0x0205, 0x2104, 0x9085, 0x0080, 0x200a, 0x20e1,
-	0x0000, 0x2011, 0x0210, 0x2214, 0x9294, 0x0fff, 0xaaa2, 0x9282,
-	0x0111, 0x1a0c, 0x0dd5, 0x8210, 0x821c, 0x2001, 0x026c, 0x2098,
-	0xa860, 0x20e8, 0xa85c, 0x9080, 0x0029, 0x20a0, 0x2011, 0xd9ff,
-	0x2041, 0x0001, 0x223d, 0x9784, 0x00ff, 0x9322, 0x1208, 0x2300,
-	0x20a8, 0x4003, 0x931a, 0x0530, 0x8210, 0xd7fc, 0x1130, 0x8d68,
-	0x2d0a, 0x2001, 0x0260, 0x2098, 0x0c68, 0x2950, 0x080c, 0x1019,
-	0x0170, 0x2900, 0xb002, 0xa867, 0x0147, 0xa86b, 0x0000, 0xa860,
-	0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x8840, 0x08d8, 0x2548,
-	0xa800, 0x902d, 0x0118, 0x080c, 0x1032, 0x0cc8, 0x080c, 0x1032,
-	0x0804, 0xd921, 0x2548, 0x8847, 0x9885, 0x0046, 0xa866, 0x2009,
-	0x0205, 0x200b, 0x0000, 0x080c, 0xe223, 0x0804, 0xd915, 0x8010,
-	0x0004, 0x801a, 0x0006, 0x8018, 0x0008, 0x8016, 0x000a, 0x8014,
-	0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0054, 0x1a0c, 0x0dd5,
-	0x9082, 0x0040, 0x0a0c, 0x0dd5, 0x2008, 0x0804, 0xdab0, 0x9186,
-	0x0051, 0x0108, 0x00c0, 0x2001, 0x0109, 0x2004, 0xd084, 0x0904,
-	0xda61, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x080c,
-	0x8d64, 0x002e, 0x001e, 0x000e, 0x012e, 0x6000, 0x9086, 0x0002,
-	0x1580, 0x0804, 0xdaf8, 0x9186, 0x0027, 0x0530, 0x9186, 0x0048,
-	0x0128, 0x9186, 0x0014, 0x0500, 0x190c, 0x0dd5, 0x2001, 0x0109,
-	0x2004, 0xd084, 0x01f0, 0x00c6, 0x0126, 0x2091, 0x2800, 0x00c6,
-	0x2061, 0x0100, 0x0006, 0x0016, 0x0026, 0x080c, 0x8d64, 0x002e,
-	0x001e, 0x000e, 0x00ce, 0x012e, 0x00ce, 0x6000, 0x9086, 0x0004,
-	0x190c, 0x0dd5, 0x0804, 0xdbd9, 0x6004, 0x9082, 0x0040, 0x2008,
-	0x001a, 0x080c, 0xac01, 0x0005, 0xda77, 0xda79, 0xda79, 0xdaa0,
-	0xda77, 0xda77, 0xda77, 0xda77, 0xda77, 0xda77, 0xda77, 0xda77,
-	0xda77, 0xda77, 0xda77, 0xda77, 0xda77, 0xda77, 0xda77, 0x080c,
-	0x0dd5, 0x080c, 0x9317, 0x080c, 0x941c, 0x0036, 0x0096, 0x6014,
-	0x904d, 0x01d8, 0x080c, 0xc825, 0x01c0, 0x6003, 0x0002, 0x6010,
-	0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1178, 0x2019, 0x0004,
-	0x080c, 0xe223, 0x6017, 0x0000, 0x6018, 0x9005, 0x1120, 0x2001,
-	0x1985, 0x2004, 0x601a, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005,
-	0x0096, 0x080c, 0x9317, 0x080c, 0x941c, 0x080c, 0xc825, 0x0120,
-	0x6014, 0x2048, 0x080c, 0x1032, 0x080c, 0xab9c, 0x009e, 0x0005,
-	0x0002, 0xdac4, 0xdadb, 0xdac6, 0xdaf2, 0xdac4, 0xdac4, 0xdac4,
-	0xdac4, 0xdac4, 0xdac4, 0xdac4, 0xdac4, 0xdac4, 0xdac4, 0xdac4,
-	0xdac4, 0xdac4, 0xdac4, 0xdac4, 0x080c, 0x0dd5, 0x0096, 0x080c,
-	0x9317, 0x6014, 0x2048, 0xa87c, 0xd0b4, 0x0138, 0x6003, 0x0007,
-	0x2009, 0x0043, 0x080c, 0xabe6, 0x0010, 0x6003, 0x0004, 0x080c,
-	0x941c, 0x009e, 0x0005, 0x080c, 0x9317, 0x080c, 0xc825, 0x0138,
-	0x6114, 0x0096, 0x2148, 0xa97c, 0x009e, 0xd1ec, 0x1138, 0x080c,
-	0x8441, 0x080c, 0xab6b, 0x080c, 0x941c, 0x0005, 0x080c, 0xe480,
-	0x0db0, 0x0cc8, 0x080c, 0x9317, 0x2009, 0x0041, 0x0804, 0xdc61,
-	0x9182, 0x0040, 0x0002, 0xdb0e, 0xdb10, 0xdb0e, 0xdb0e, 0xdb0e,
-	0xdb0e, 0xdb0e, 0xdb0e, 0xdb0e, 0xdb0e, 0xdb0e, 0xdb0e, 0xdb0e,
-	0xdb0e, 0xdb0e, 0xdb0e, 0xdb0e, 0xdb11, 0xdb0e, 0x080c, 0x0dd5,
-	0x0005, 0x00d6, 0x080c, 0x8441, 0x00de, 0x080c, 0xe4d8, 0x080c,
-	0xab6b, 0x0005, 0x9182, 0x0040, 0x0002, 0xdb30, 0xdb30, 0xdb30,
-	0xdb30, 0xdb30, 0xdb30, 0xdb30, 0xdb30, 0xdb30, 0xdb32, 0xdba1,
-	0xdb30, 0xdb30, 0xdb30, 0xdb30, 0xdba1, 0xdb30, 0xdb30, 0xdb30,
-	0x080c, 0x0dd5, 0x2001, 0x0105, 0x2004, 0x9084, 0x1800, 0x01c8,
-	0x2001, 0x0132, 0x200c, 0x2001, 0x0131, 0x2004, 0x9105, 0x1904,
-	0xdba1, 0x2009, 0x180c, 0x2104, 0xd0d4, 0x0904, 0xdba1, 0xc0d4,
-	0x200a, 0x2009, 0x0105, 0x2104, 0x9084, 0xe7fd, 0x9085, 0x0010,
-	0x200a, 0x2001, 0x1867, 0x2004, 0xd0e4, 0x1528, 0x603b, 0x0000,
-	0x080c, 0x93cc, 0x6014, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0188,
-	0x908c, 0x0003, 0x918e, 0x0002, 0x0508, 0x2001, 0x180c, 0x2004,
-	0xd0d4, 0x11e0, 0x080c, 0x9548, 0x2009, 0x0041, 0x009e, 0x0804,
-	0xdc61, 0x080c, 0x9548, 0x6003, 0x0007, 0x601b, 0x0000, 0x080c,
-	0x8441, 0x009e, 0x0005, 0x2001, 0x0100, 0x2004, 0x9082, 0x0005,
-	0x0aa8, 0x2001, 0x011f, 0x2004, 0x603a, 0x0890, 0x2001, 0x180c,
-	0x200c, 0xc1d4, 0x2102, 0xd1cc, 0x0110, 0x080c, 0x2b04, 0x080c,
-	0x9548, 0x6014, 0x2048, 0xa97c, 0xd1ec, 0x1130, 0x080c, 0x8441,
-	0x080c, 0xab6b, 0x009e, 0x0005, 0x080c, 0xe480, 0x0db8, 0x009e,
-	0x0005, 0x2001, 0x180c, 0x200c, 0xc1d4, 0x2102, 0x0036, 0x080c,
-	0x93cc, 0x080c, 0x9548, 0x6014, 0x0096, 0x2048, 0x6010, 0x00b6,
-	0x2058, 0xb800, 0x00be, 0xd0bc, 0x0188, 0xa87c, 0x9084, 0x0003,
-	0x9086, 0x0002, 0x0140, 0xa8ac, 0x6330, 0x931a, 0x6332, 0xa8b0,
-	0x632c, 0x931b, 0x632e, 0x6003, 0x0002, 0x0080, 0x2019, 0x0004,
-	0x080c, 0xe223, 0x6018, 0x9005, 0x1128, 0x2001, 0x1985, 0x2004,
-	0x8003, 0x601a, 0x6017, 0x0000, 0x6003, 0x0007, 0x009e, 0x003e,
-	0x0005, 0x9182, 0x0040, 0x0002, 0xdbf0, 0xdbf0, 0xdbf0, 0xdbf0,
-	0xdbf0, 0xdbf0, 0xdbf0, 0xdbf0, 0xdbf2, 0xdbf0, 0xdbf0, 0xdbf0,
-	0xdbf0, 0xdbf0, 0xdbf0, 0xdbf0, 0xdbf0, 0xdbf0, 0xdbf0, 0xdc3d,
-	0x080c, 0x0dd5, 0x6014, 0x0096, 0x2048, 0xa834, 0xaa38, 0x6110,
-	0x00b6, 0x2058, 0xb900, 0x00be, 0xd1bc, 0x1190, 0x920d, 0x1518,
-	0xa87c, 0xd0fc, 0x0128, 0x2009, 0x0041, 0x009e, 0x0804, 0xdc61,
-	0x6003, 0x0007, 0x601b, 0x0000, 0x080c, 0x8441, 0x009e, 0x0005,
-	0x6124, 0xd1f4, 0x1d58, 0x0006, 0x0046, 0xacac, 0x9422, 0xa9b0,
-	0x2200, 0x910b, 0x6030, 0x9420, 0x6432, 0x602c, 0x9109, 0x612e,
-	0x004e, 0x000e, 0x08d8, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be,
-	0xd1bc, 0x1178, 0x2009, 0x180e, 0x210c, 0xd19c, 0x0118, 0x6003,
-	0x0007, 0x0010, 0x6003, 0x0006, 0x00e9, 0x080c, 0x8443, 0x009e,
-	0x0005, 0x6003, 0x0002, 0x009e, 0x0005, 0x6024, 0xd0f4, 0x0128,
-	0x080c, 0x15c8, 0x1904, 0xdbf2, 0x0005, 0x6014, 0x0096, 0x2048,
-	0xa834, 0xa938, 0x009e, 0x9105, 0x1120, 0x080c, 0x15c8, 0x1904,
-	0xdbf2, 0x0005, 0xd2fc, 0x0140, 0x8002, 0x8000, 0x8212, 0x9291,
-	0x0000, 0x2009, 0x0009, 0x0010, 0x2009, 0x0015, 0xaa9a, 0xa896,
-	0x0005, 0x9182, 0x0040, 0x0208, 0x0062, 0x9186, 0x0013, 0x0120,
-	0x9186, 0x0014, 0x190c, 0x0dd5, 0x6024, 0xd0dc, 0x090c, 0x0dd5,
-	0x0005, 0xdc84, 0xdc90, 0xdc9c, 0xdca8, 0xdc84, 0xdc84, 0xdc84,
-	0xdc84, 0xdc8b, 0xdc86, 0xdc86, 0xdc84, 0xdc84, 0xdc84, 0xdc84,
-	0xdc86, 0xdc84, 0xdc86, 0xdc84, 0x080c, 0x0dd5, 0x6024, 0xd0dc,
-	0x090c, 0x0dd5, 0x0005, 0x6014, 0x9005, 0x190c, 0x0dd5, 0x0005,
-	0x6003, 0x0001, 0x6106, 0x080c, 0x8e7f, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x941c, 0x012e, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c,
-	0x8e7f, 0x0126, 0x2091, 0x8000, 0x080c, 0x941c, 0x012e, 0x0005,
-	0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, 0x1b03, 0x0126, 0x2091,
-	0x8000, 0x080c, 0x8ee4, 0x080c, 0x9548, 0x012e, 0x0005, 0x0126,
-	0x2091, 0x8000, 0x0036, 0x0096, 0x9182, 0x0040, 0x0023, 0x009e,
-	0x003e, 0x012e, 0x0005, 0xdcd3, 0xdcd5, 0xdce7, 0xdd01, 0xdcd3,
-	0xdcd3, 0xdcd3, 0xdcd3, 0xdcd3, 0xdcd3, 0xdcd3, 0xdcd3, 0xdcd3,
-	0xdcd3, 0xdcd3, 0xdcd3, 0x080c, 0x0dd5, 0x6014, 0x2048, 0xa87c,
-	0xd0fc, 0x01f8, 0x909c, 0x0003, 0x939e, 0x0003, 0x01d0, 0x6003,
-	0x0001, 0x6106, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x0470, 0x6014,
-	0x2048, 0xa87c, 0xd0fc, 0x0168, 0x909c, 0x0003, 0x939e, 0x0003,
-	0x0140, 0x6003, 0x0001, 0x6106, 0x080c, 0x8e7f, 0x080c, 0x941c,
-	0x00e0, 0x901e, 0x6316, 0x631a, 0x2019, 0x0004, 0x080c, 0xe223,
-	0x00a0, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0d98, 0x909c, 0x0003,
-	0x939e, 0x0003, 0x0d70, 0x6003, 0x0003, 0x6106, 0x2c10, 0x080c,
-	0x1b03, 0x080c, 0x8ee4, 0x080c, 0x9548, 0x0005, 0x080c, 0x9317,
-	0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c, 0xe5d5, 0x0036,
-	0x2019, 0x0029, 0x080c, 0xe223, 0x003e, 0x009e, 0x080c, 0xab9c,
-	0x080c, 0x941c, 0x0005, 0x080c, 0x93cc, 0x6114, 0x81ff, 0x0158,
-	0x0096, 0x2148, 0x080c, 0xe5d5, 0x0036, 0x2019, 0x0029, 0x080c,
-	0xe223, 0x003e, 0x009e, 0x080c, 0xab9c, 0x080c, 0x9548, 0x0005,
-	0x9182, 0x0085, 0x0002, 0xdd52, 0xdd50, 0xdd50, 0xdd5e, 0xdd50,
-	0xdd50, 0xdd50, 0xdd50, 0xdd50, 0xdd50, 0xdd50, 0xdd50, 0xdd50,
-	0x080c, 0x0dd5, 0x6003, 0x000b, 0x6106, 0x080c, 0x8e7f, 0x0126,
-	0x2091, 0x8000, 0x080c, 0x941c, 0x012e, 0x0005, 0x0026, 0x00e6,
-	0x080c, 0xe477, 0x0118, 0x080c, 0xab6b, 0x0450, 0x2071, 0x0260,
-	0x7224, 0x6216, 0x2001, 0x180e, 0x2004, 0xd0e4, 0x0150, 0x6010,
-	0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x2011, 0x014e, 0x080c,
-	0xae8c, 0x7220, 0x080c, 0xe0c9, 0x0118, 0x6007, 0x0086, 0x0040,
-	0x6007, 0x0087, 0x7224, 0x9296, 0xffff, 0x1110, 0x6007, 0x0086,
-	0x6003, 0x0001, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x080c, 0x9548,
-	0x00ee, 0x002e, 0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a,
-	0x0085, 0x0a0c, 0x0dd5, 0x908a, 0x0092, 0x1a0c, 0x0dd5, 0x9082,
-	0x0085, 0x00a2, 0x9186, 0x0027, 0x0130, 0x9186, 0x0014, 0x0118,
-	0x080c, 0xac01, 0x0050, 0x2001, 0x0007, 0x080c, 0x6349, 0x080c,
-	0x9317, 0x080c, 0xab9c, 0x080c, 0x941c, 0x0005, 0xddc3, 0xddc5,
-	0xddc5, 0xddc3, 0xddc3, 0xddc3, 0xddc3, 0xddc3, 0xddc3, 0xddc3,
-	0xddc3, 0xddc3, 0xddc3, 0x080c, 0x0dd5, 0x080c, 0x9317, 0x080c,
-	0xab9c, 0x080c, 0x941c, 0x0005, 0x9182, 0x0085, 0x0a0c, 0x0dd5,
-	0x9182, 0x0092, 0x1a0c, 0x0dd5, 0x9182, 0x0085, 0x0002, 0xdde4,
-	0xdde4, 0xdde4, 0xdde6, 0xdde4, 0xdde4, 0xdde4, 0xdde4, 0xdde4,
-	0xdde4, 0xdde4, 0xdde4, 0xdde4, 0x080c, 0x0dd5, 0x0005, 0x9186,
-	0x0013, 0x0148, 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118,
-	0x080c, 0xac01, 0x0030, 0x080c, 0x9317, 0x080c, 0xab9c, 0x080c,
-	0x941c, 0x0005, 0x0036, 0x080c, 0xe4d8, 0x6043, 0x0000, 0x2019,
-	0x000b, 0x0031, 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005,
-	0x0126, 0x0036, 0x2091, 0x8000, 0x0086, 0x2c40, 0x0096, 0x904e,
-	0x080c, 0xa3a6, 0x009e, 0x008e, 0x1550, 0x0076, 0x2c38, 0x080c,
-	0xa451, 0x007e, 0x1520, 0x6000, 0x9086, 0x0000, 0x0500, 0x6020,
-	0x9086, 0x0007, 0x01e0, 0x0096, 0x601c, 0xd084, 0x0140, 0x080c,
-	0xe4d8, 0x080c, 0xcf30, 0x080c, 0x19b4, 0x6023, 0x0007, 0x6014,
-	0x2048, 0x080c, 0xc825, 0x0110, 0x080c, 0xe223, 0x009e, 0x6017,
-	0x0000, 0x080c, 0xe4d8, 0x6023, 0x0007, 0x080c, 0xcf30, 0x003e,
-	0x012e, 0x0005, 0x00f6, 0x00c6, 0x00b6, 0x0036, 0x0156, 0x2079,
-	0x0260, 0x7938, 0x783c, 0x080c, 0x26f0, 0x15b8, 0x0016, 0x00c6,
-	0x080c, 0x63cd, 0x1580, 0x001e, 0x00c6, 0x2160, 0x080c, 0xcf2d,
-	0x00ce, 0x002e, 0x0026, 0x0016, 0x2019, 0x0029, 0x080c, 0xa512,
-	0x080c, 0x901a, 0x0076, 0x903e, 0x080c, 0x8ef7, 0x007e, 0x001e,
-	0x0076, 0x903e, 0x080c, 0xdfbd, 0x007e, 0x0026, 0xba04, 0x9294,
-	0xff00, 0x8217, 0x9286, 0x0006, 0x0118, 0x9286, 0x0004, 0x1118,
-	0xbaa0, 0x080c, 0x3128, 0x002e, 0x001e, 0x080c, 0x5e12, 0xbe12,
-	0xbd16, 0x9006, 0x0010, 0x00ce, 0x001e, 0x015e, 0x003e, 0x00be,
-	0x00ce, 0x00fe, 0x0005, 0x00c6, 0x00d6, 0x00b6, 0x0016, 0x2009,
-	0x1824, 0x2104, 0x9086, 0x0074, 0x1904, 0xdee4, 0x2069, 0x0260,
-	0x6944, 0x9182, 0x0100, 0x06e0, 0x6940, 0x9184, 0x8000, 0x0904,
-	0xdee1, 0x2001, 0x197c, 0x2004, 0x9005, 0x1140, 0x6010, 0x2058,
-	0xb8c0, 0x9005, 0x0118, 0x9184, 0x0800, 0x0598, 0x6948, 0x918a,
-	0x0001, 0x0648, 0x080c, 0xe63d, 0x0118, 0x6978, 0xd1fc, 0x11b8,
-	0x2009, 0x0205, 0x200b, 0x0001, 0x693c, 0x81ff, 0x1198, 0x6944,
-	0x9182, 0x0100, 0x02a8, 0x6940, 0x81ff, 0x1178, 0x6948, 0x918a,
-	0x0001, 0x0288, 0x6950, 0x918a, 0x0001, 0x0298, 0x00d0, 0x6017,
-	0x0100, 0x00a0, 0x6017, 0x0300, 0x0088, 0x6017, 0x0500, 0x0070,
-	0x6017, 0x0700, 0x0058, 0x6017, 0x0900, 0x0040, 0x6017, 0x0b00,
-	0x0028, 0x6017, 0x0f00, 0x0010, 0x6017, 0x2d00, 0x9085, 0x0001,
-	0x0008, 0x9006, 0x001e, 0x00be, 0x00de, 0x00ce, 0x0005, 0x00c6,
-	0x00b6, 0x0026, 0x0036, 0x0156, 0x6210, 0x2258, 0xbb04, 0x9394,
-	0x00ff, 0x9286, 0x0006, 0x0180, 0x9286, 0x0004, 0x0168, 0x9394,
-	0xff00, 0x8217, 0x9286, 0x0006, 0x0138, 0x9286, 0x0004, 0x0120,
-	0x080c, 0x63dc, 0x0804, 0xdf4c, 0x2011, 0x0276, 0x20a9, 0x0004,
-	0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xbb27, 0x009e, 0x15a8,
+	0x0904, 0xda83, 0x9686, 0x0004, 0x0904, 0xda83, 0x080c, 0x8c92,
+	0x2001, 0x0004, 0x0804, 0xda81, 0x2001, 0x1800, 0x2004, 0x9086,
+	0x0003, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021,
+	0x0006, 0x080c, 0x4cbc, 0x004e, 0x003e, 0x2001, 0x0006, 0x080c,
+	0xdaa7, 0x6610, 0x2658, 0xbe04, 0x0066, 0x96b4, 0xff00, 0x8637,
+	0x9686, 0x0006, 0x006e, 0x0168, 0x2001, 0x0006, 0x080c, 0x657c,
+	0x9284, 0x00ff, 0x908e, 0x0007, 0x1120, 0x2001, 0x0006, 0x080c,
+	0x6550, 0x080c, 0x6962, 0x11f8, 0x2001, 0x1837, 0x2004, 0xd0a4,
+	0x01d0, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, 0x01a0, 0x00f6,
+	0x2079, 0x1800, 0x78a8, 0x8000, 0x78aa, 0x00fe, 0x0804, 0xda08,
+	0x2001, 0x0004, 0x0030, 0x2001, 0x0006, 0x0449, 0x0020, 0x0018,
+	0x0010, 0x080c, 0x657c, 0x080c, 0x955f, 0x080c, 0xae47, 0x080c,
+	0x9664, 0x0005, 0x2600, 0x0002, 0xda9e, 0xda9e, 0xda9e, 0xda9e,
+	0xda9e, 0xdaa0, 0xda9e, 0xdaa0, 0xda9e, 0xda9e, 0xdaa0, 0xda9e,
+	0xda9e, 0xda9e, 0xdaa0, 0xdaa0, 0xdaa0, 0xdaa0, 0x080c, 0x0dd5,
+	0x080c, 0x955f, 0x080c, 0xae47, 0x080c, 0x9664, 0x0005, 0x0016,
+	0x00b6, 0x00d6, 0x6110, 0x2158, 0xb900, 0xd184, 0x0138, 0x080c,
+	0x6550, 0x9006, 0x080c, 0x653c, 0x080c, 0x31e1, 0x00de, 0x00be,
+	0x001e, 0x0005, 0x6610, 0x2658, 0xb804, 0x9084, 0xff00, 0x8007,
+	0x90b2, 0x000c, 0x1a0c, 0x0dd5, 0x91b6, 0x0015, 0x1110, 0x003b,
+	0x0028, 0x91b6, 0x0016, 0x190c, 0x0dd5, 0x006b, 0x0005, 0xb8e2,
+	0xb8e2, 0xb8e2, 0xb8e2, 0xb8e2, 0xb8e2, 0xdb22, 0xdae7, 0xb8e2,
+	0xb8e2, 0xb8e2, 0xb8e2, 0xb8e2, 0xb8e2, 0xb8e2, 0xb8e2, 0xb8e2,
+	0xb8e2, 0xdb22, 0xdb29, 0xb8e2, 0xb8e2, 0xb8e2, 0xb8e2, 0x00f6,
+	0x080c, 0x6962, 0x11d8, 0x080c, 0xd216, 0x11c0, 0x6010, 0x905d,
+	0x01a8, 0xb8c0, 0x9005, 0x0190, 0x9006, 0x080c, 0x653c, 0x2001,
+	0x0002, 0x080c, 0x6550, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007,
+	0x0002, 0x080c, 0x910f, 0x080c, 0x9664, 0x00d0, 0x2011, 0x0263,
+	0x2204, 0x8211, 0x220c, 0x080c, 0x283e, 0x1190, 0x080c, 0x6600,
+	0x0118, 0x080c, 0xae47, 0x0060, 0xb810, 0x0006, 0xb814, 0x0006,
+	0x080c, 0x6035, 0x000e, 0xb816, 0x000e, 0xb812, 0x080c, 0xae47,
+	0x00fe, 0x0005, 0x6604, 0x96b6, 0x001e, 0x1110, 0x080c, 0xae47,
+	0x0005, 0x080c, 0xbc6b, 0x1148, 0x6003, 0x0001, 0x6007, 0x0001,
+	0x080c, 0x910f, 0x080c, 0x9664, 0x0010, 0x080c, 0xae47, 0x0005,
+	0x6004, 0x908a, 0x0053, 0x1a0c, 0x0dd5, 0x080c, 0x955f, 0x080c,
+	0xae78, 0x080c, 0x9664, 0x0005, 0x9182, 0x0040, 0x0002, 0xdb5a,
+	0xdb5a, 0xdb5a, 0xdb5a, 0xdb5c, 0xdb5a, 0xdb5a, 0xdb5a, 0xdb5a,
+	0xdb5a, 0xdb5a, 0xdb5a, 0xdb5a, 0xdb5a, 0xdb5a, 0xdb5a, 0xdb5a,
+	0xdb5a, 0xdb5a, 0x080c, 0x0dd5, 0x0096, 0x00b6, 0x00d6, 0x00e6,
+	0x00f6, 0x0046, 0x0026, 0x6210, 0x2258, 0xb8bc, 0x9005, 0x11a8,
+	0x6106, 0x2071, 0x0260, 0x7444, 0x94a4, 0xff00, 0x0904, 0xdbc2,
+	0x080c, 0xe94a, 0x1170, 0x9486, 0x2000, 0x1158, 0x2009, 0x0001,
+	0x2011, 0x0200, 0x080c, 0x86b4, 0x0020, 0x9026, 0x080c, 0xe7ce,
+	0x0c38, 0x080c, 0x0fff, 0x090c, 0x0dd5, 0x6003, 0x0007, 0xa867,
+	0x010d, 0x9006, 0xa802, 0xa86a, 0xac8a, 0x2c00, 0xa88e, 0x6008,
+	0xa8e2, 0x6010, 0x2058, 0xb8a0, 0x7130, 0xa97a, 0x0016, 0xa876,
+	0xa87f, 0x0000, 0xa883, 0x0000, 0xa887, 0x0036, 0x080c, 0x6c79,
+	0x001e, 0x080c, 0xe94a, 0x1904, 0xdc22, 0x9486, 0x2000, 0x1130,
+	0x2019, 0x0017, 0x080c, 0xe501, 0x0804, 0xdc22, 0x9486, 0x0200,
+	0x1120, 0x080c, 0xe49d, 0x0804, 0xdc22, 0x9486, 0x0400, 0x0120,
+	0x9486, 0x1000, 0x1904, 0xdc22, 0x2019, 0x0002, 0x080c, 0xe4b8,
+	0x0804, 0xdc22, 0x2069, 0x1a71, 0x6a00, 0xd284, 0x0904, 0xdc8c,
+	0x9284, 0x0300, 0x1904, 0xdc85, 0x6804, 0x9005, 0x0904, 0xdc6d,
+	0x2d78, 0x6003, 0x0007, 0x080c, 0x1018, 0x0904, 0xdc2e, 0x7800,
+	0xd08c, 0x1118, 0x7804, 0x8001, 0x7806, 0x6017, 0x0000, 0x2001,
+	0x180f, 0x2004, 0xd084, 0x1904, 0xdc90, 0x9006, 0xa802, 0xa867,
+	0x0116, 0xa86a, 0x6008, 0xa8e2, 0x2c00, 0xa87a, 0x6010, 0x2058,
+	0xb8a0, 0x7130, 0xa9b6, 0xa876, 0xb928, 0xa9ba, 0xb92c, 0xa9be,
+	0xb930, 0xa9c2, 0xb934, 0xa9c6, 0xa883, 0x003d, 0x7044, 0x9084,
+	0x0003, 0x9080, 0xdc2a, 0x2005, 0xa87e, 0x20a9, 0x000a, 0x2001,
+	0x0270, 0xaa5c, 0x9290, 0x0021, 0x2009, 0x0205, 0x200b, 0x0080,
+	0x20e1, 0x0000, 0xab60, 0x23e8, 0x2098, 0x22a0, 0x4003, 0x200b,
+	0x0000, 0x2001, 0x027a, 0x200c, 0xa9b2, 0x8000, 0x200c, 0xa9ae,
+	0x080c, 0x6c79, 0x002e, 0x004e, 0x00fe, 0x00ee, 0x00de, 0x00be,
+	0x009e, 0x0005, 0x0000, 0x0080, 0x0040, 0x0000, 0x2001, 0x1810,
+	0x2004, 0xd084, 0x0120, 0x080c, 0x0fff, 0x1904, 0xdbd7, 0x6017,
+	0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x90c7, 0x080c,
+	0x9664, 0x0c00, 0x2069, 0x0260, 0x6848, 0x9084, 0xff00, 0x9086,
+	0x1200, 0x1198, 0x686c, 0x9084, 0x00ff, 0x0016, 0x6114, 0x918c,
+	0xf700, 0x910d, 0x6116, 0x001e, 0x6003, 0x0001, 0x6007, 0x0043,
+	0x080c, 0x90c7, 0x080c, 0x9664, 0x0828, 0x6868, 0x602e, 0x686c,
+	0x6032, 0x6017, 0xf200, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c,
+	0x90c7, 0x080c, 0x9664, 0x0804, 0xdc22, 0x2001, 0x180e, 0x2004,
+	0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x4b05, 0x6017, 0xf300,
+	0x0010, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c,
+	0x90c7, 0x080c, 0x9664, 0x0804, 0xdc22, 0x6017, 0xf500, 0x0c98,
+	0x6017, 0xf600, 0x0804, 0xdc42, 0x6017, 0xf200, 0x0804, 0xdc42,
+	0xa867, 0x0146, 0xa86b, 0x0000, 0x6008, 0xa886, 0x2c00, 0xa87a,
+	0x7044, 0x9084, 0x0003, 0x9080, 0xdc2a, 0x2005, 0xa87e, 0x2928,
+	0x6010, 0x2058, 0xb8a0, 0xa876, 0xb828, 0xa88a, 0xb82c, 0xa88e,
+	0xb830, 0xa892, 0xb834, 0xa896, 0xa883, 0x003d, 0x2009, 0x0205,
+	0x2104, 0x9085, 0x0080, 0x200a, 0x20e1, 0x0000, 0x2011, 0x0210,
+	0x2214, 0x9294, 0x0fff, 0xaaa2, 0x9282, 0x0111, 0x1a0c, 0x0dd5,
+	0x8210, 0x821c, 0x2001, 0x026c, 0x2098, 0xa860, 0x20e8, 0xa85c,
+	0x9080, 0x0029, 0x20a0, 0x2011, 0xdd0c, 0x2041, 0x0001, 0x223d,
+	0x9784, 0x00ff, 0x9322, 0x1208, 0x2300, 0x20a8, 0x4003, 0x931a,
+	0x0530, 0x8210, 0xd7fc, 0x1130, 0x8d68, 0x2d0a, 0x2001, 0x0260,
+	0x2098, 0x0c68, 0x2950, 0x080c, 0x1018, 0x0170, 0x2900, 0xb002,
+	0xa867, 0x0147, 0xa86b, 0x0000, 0xa860, 0x20e8, 0xa85c, 0x9080,
+	0x001b, 0x20a0, 0x8840, 0x08d8, 0x2548, 0xa800, 0x902d, 0x0118,
+	0x080c, 0x1031, 0x0cc8, 0x080c, 0x1031, 0x0804, 0xdc2e, 0x2548,
+	0x8847, 0x9885, 0x0046, 0xa866, 0x2009, 0x0205, 0x200b, 0x0000,
+	0x080c, 0xe530, 0x0804, 0xdc22, 0x8010, 0x0004, 0x801a, 0x0006,
+	0x8018, 0x0008, 0x8016, 0x000a, 0x8014, 0x9186, 0x0013, 0x1160,
+	0x6004, 0x908a, 0x0054, 0x1a0c, 0x0dd5, 0x9082, 0x0040, 0x0a0c,
+	0x0dd5, 0x2008, 0x0804, 0xddbd, 0x9186, 0x0051, 0x0108, 0x00c0,
+	0x2001, 0x0109, 0x2004, 0xd084, 0x0904, 0xdd6e, 0x0126, 0x2091,
+	0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x8fac, 0x002e, 0x001e,
+	0x000e, 0x012e, 0x6000, 0x9086, 0x0002, 0x1580, 0x0804, 0xde05,
+	0x9186, 0x0027, 0x0530, 0x9186, 0x0048, 0x0128, 0x9186, 0x0014,
+	0x0500, 0x190c, 0x0dd5, 0x2001, 0x0109, 0x2004, 0xd084, 0x01f0,
+	0x00c6, 0x0126, 0x2091, 0x2800, 0x00c6, 0x2061, 0x0100, 0x0006,
+	0x0016, 0x0026, 0x080c, 0x8fac, 0x002e, 0x001e, 0x000e, 0x00ce,
+	0x012e, 0x00ce, 0x6000, 0x9086, 0x0004, 0x190c, 0x0dd5, 0x0804,
+	0xdee6, 0x6004, 0x9082, 0x0040, 0x2008, 0x001a, 0x080c, 0xaedd,
+	0x0005, 0xdd84, 0xdd86, 0xdd86, 0xddad, 0xdd84, 0xdd84, 0xdd84,
+	0xdd84, 0xdd84, 0xdd84, 0xdd84, 0xdd84, 0xdd84, 0xdd84, 0xdd84,
+	0xdd84, 0xdd84, 0xdd84, 0xdd84, 0x080c, 0x0dd5, 0x080c, 0x955f,
+	0x080c, 0x9664, 0x0036, 0x0096, 0x6014, 0x904d, 0x01d8, 0x080c,
+	0xcb1b, 0x01c0, 0x6003, 0x0002, 0x6010, 0x00b6, 0x2058, 0xb800,
+	0x00be, 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c, 0xe530, 0x6017,
+	0x0000, 0x6018, 0x9005, 0x1120, 0x2001, 0x1987, 0x2004, 0x601a,
+	0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x0096, 0x080c, 0x955f,
+	0x080c, 0x9664, 0x080c, 0xcb1b, 0x0120, 0x6014, 0x2048, 0x080c,
+	0x1031, 0x080c, 0xae78, 0x009e, 0x0005, 0x0002, 0xddd1, 0xdde8,
+	0xddd3, 0xddff, 0xddd1, 0xddd1, 0xddd1, 0xddd1, 0xddd1, 0xddd1,
+	0xddd1, 0xddd1, 0xddd1, 0xddd1, 0xddd1, 0xddd1, 0xddd1, 0xddd1,
+	0xddd1, 0x080c, 0x0dd5, 0x0096, 0x080c, 0x955f, 0x6014, 0x2048,
+	0xa87c, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, 0x0043, 0x080c,
+	0xaec2, 0x0010, 0x6003, 0x0004, 0x080c, 0x9664, 0x009e, 0x0005,
+	0x080c, 0x955f, 0x080c, 0xcb1b, 0x0138, 0x6114, 0x0096, 0x2148,
+	0xa97c, 0x009e, 0xd1ec, 0x1138, 0x080c, 0x8689, 0x080c, 0xae47,
+	0x080c, 0x9664, 0x0005, 0x080c, 0xe792, 0x0db0, 0x0cc8, 0x080c,
+	0x955f, 0x2009, 0x0041, 0x0804, 0xdf6e, 0x9182, 0x0040, 0x0002,
+	0xde1b, 0xde1d, 0xde1b, 0xde1b, 0xde1b, 0xde1b, 0xde1b, 0xde1b,
+	0xde1b, 0xde1b, 0xde1b, 0xde1b, 0xde1b, 0xde1b, 0xde1b, 0xde1b,
+	0xde1b, 0xde1e, 0xde1b, 0x080c, 0x0dd5, 0x0005, 0x00d6, 0x080c,
+	0x8689, 0x00de, 0x080c, 0xe7ea, 0x080c, 0xae47, 0x0005, 0x9182,
+	0x0040, 0x0002, 0xde3d, 0xde3d, 0xde3d, 0xde3d, 0xde3d, 0xde3d,
+	0xde3d, 0xde3d, 0xde3d, 0xde3f, 0xdeae, 0xde3d, 0xde3d, 0xde3d,
+	0xde3d, 0xdeae, 0xde3d, 0xde3d, 0xde3d, 0x080c, 0x0dd5, 0x2001,
+	0x0105, 0x2004, 0x9084, 0x1800, 0x01c8, 0x2001, 0x0132, 0x200c,
+	0x2001, 0x0131, 0x2004, 0x9105, 0x1904, 0xdeae, 0x2009, 0x180c,
+	0x2104, 0xd0d4, 0x0904, 0xdeae, 0xc0d4, 0x200a, 0x2009, 0x0105,
+	0x2104, 0x9084, 0xe7fd, 0x9085, 0x0010, 0x200a, 0x2001, 0x1867,
+	0x2004, 0xd0e4, 0x1528, 0x603b, 0x0000, 0x080c, 0x9614, 0x6014,
+	0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0188, 0x908c, 0x0003, 0x918e,
+	0x0002, 0x0508, 0x2001, 0x180c, 0x2004, 0xd0d4, 0x11e0, 0x080c,
+	0x9790, 0x2009, 0x0041, 0x009e, 0x0804, 0xdf6e, 0x080c, 0x9790,
+	0x6003, 0x0007, 0x601b, 0x0000, 0x080c, 0x8689, 0x009e, 0x0005,
+	0x2001, 0x0100, 0x2004, 0x9082, 0x0005, 0x0aa8, 0x2001, 0x011f,
+	0x2004, 0x603a, 0x0890, 0x2001, 0x180c, 0x200c, 0xc1d4, 0x2102,
+	0xd1cc, 0x0110, 0x080c, 0x2c52, 0x080c, 0x9790, 0x6014, 0x2048,
+	0xa97c, 0xd1ec, 0x1130, 0x080c, 0x8689, 0x080c, 0xae47, 0x009e,
+	0x0005, 0x080c, 0xe792, 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c,
+	0x200c, 0xc1d4, 0x2102, 0x0036, 0x080c, 0x9614, 0x080c, 0x9790,
+	0x6014, 0x0096, 0x2048, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be,
+	0xd0bc, 0x0188, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x0140,
+	0xa8ac, 0x6330, 0x931a, 0x6332, 0xa8b0, 0x632c, 0x931b, 0x632e,
+	0x6003, 0x0002, 0x0080, 0x2019, 0x0004, 0x080c, 0xe530, 0x6018,
+	0x9005, 0x1128, 0x2001, 0x1987, 0x2004, 0x8003, 0x601a, 0x6017,
+	0x0000, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x9182, 0x0040,
+	0x0002, 0xdefd, 0xdefd, 0xdefd, 0xdefd, 0xdefd, 0xdefd, 0xdefd,
+	0xdefd, 0xdeff, 0xdefd, 0xdefd, 0xdefd, 0xdefd, 0xdefd, 0xdefd,
+	0xdefd, 0xdefd, 0xdefd, 0xdefd, 0xdf4a, 0x080c, 0x0dd5, 0x6014,
+	0x0096, 0x2048, 0xa834, 0xaa38, 0x6110, 0x00b6, 0x2158, 0xb900,
+	0x00be, 0xd1bc, 0x1190, 0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128,
+	0x2009, 0x0041, 0x009e, 0x0804, 0xdf6e, 0x6003, 0x0007, 0x601b,
+	0x0000, 0x080c, 0x8689, 0x009e, 0x0005, 0x6124, 0xd1f4, 0x1d58,
+	0x0006, 0x0046, 0xacac, 0x9422, 0xa9b0, 0x2200, 0x910b, 0x6030,
+	0x9420, 0x6432, 0x602c, 0x9109, 0x612e, 0x004e, 0x000e, 0x08d8,
+	0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1bc, 0x1178, 0x2009,
+	0x180e, 0x210c, 0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003,
+	0x0006, 0x00e9, 0x080c, 0x868b, 0x009e, 0x0005, 0x6003, 0x0002,
+	0x009e, 0x0005, 0x6024, 0xd0f4, 0x0128, 0x080c, 0x15e5, 0x1904,
+	0xdeff, 0x0005, 0x6014, 0x0096, 0x2048, 0xa834, 0xa938, 0x009e,
+	0x9105, 0x1120, 0x080c, 0x15e5, 0x1904, 0xdeff, 0x0005, 0xd2fc,
+	0x0140, 0x8002, 0x8000, 0x8212, 0x9291, 0x0000, 0x2009, 0x0009,
+	0x0010, 0x2009, 0x0015, 0xaa9a, 0xa896, 0x0005, 0x9182, 0x0040,
+	0x0208, 0x0062, 0x9186, 0x0013, 0x0120, 0x9186, 0x0014, 0x190c,
+	0x0dd5, 0x6024, 0xd0dc, 0x090c, 0x0dd5, 0x0005, 0xdf91, 0xdf9d,
+	0xdfa9, 0xdfb5, 0xdf91, 0xdf91, 0xdf91, 0xdf91, 0xdf98, 0xdf93,
+	0xdf93, 0xdf91, 0xdf91, 0xdf91, 0xdf91, 0xdf93, 0xdf91, 0xdf93,
+	0xdf91, 0x080c, 0x0dd5, 0x6024, 0xd0dc, 0x090c, 0x0dd5, 0x0005,
+	0x6014, 0x9005, 0x190c, 0x0dd5, 0x0005, 0x6003, 0x0001, 0x6106,
+	0x080c, 0x90c7, 0x0126, 0x2091, 0x8000, 0x080c, 0x9664, 0x012e,
+	0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x90c7, 0x0126, 0x2091,
+	0x8000, 0x080c, 0x9664, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106,
+	0x2c10, 0x080c, 0x1bad, 0x0126, 0x2091, 0x8000, 0x080c, 0x912c,
+	0x080c, 0x9790, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0036,
+	0x0096, 0x9182, 0x0040, 0x0023, 0x009e, 0x003e, 0x012e, 0x0005,
+	0xdfe0, 0xdfe2, 0xdff4, 0xe00e, 0xdfe0, 0xdfe0, 0xdfe0, 0xdfe0,
+	0xdfe0, 0xdfe0, 0xdfe0, 0xdfe0, 0xdfe0, 0xdfe0, 0xdfe0, 0xdfe0,
+	0x080c, 0x0dd5, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x01f8, 0x909c,
+	0x0003, 0x939e, 0x0003, 0x01d0, 0x6003, 0x0001, 0x6106, 0x080c,
+	0x90c7, 0x080c, 0x9664, 0x0470, 0x6014, 0x2048, 0xa87c, 0xd0fc,
+	0x0168, 0x909c, 0x0003, 0x939e, 0x0003, 0x0140, 0x6003, 0x0001,
+	0x6106, 0x080c, 0x90c7, 0x080c, 0x9664, 0x00e0, 0x901e, 0x6316,
+	0x631a, 0x2019, 0x0004, 0x080c, 0xe530, 0x00a0, 0x6014, 0x2048,
+	0xa87c, 0xd0fc, 0x0d98, 0x909c, 0x0003, 0x939e, 0x0003, 0x0d70,
+	0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, 0x1bad, 0x080c, 0x912c,
+	0x080c, 0x9790, 0x0005, 0x080c, 0x955f, 0x6114, 0x81ff, 0x0158,
+	0x0096, 0x2148, 0x080c, 0xe8e7, 0x0036, 0x2019, 0x0029, 0x080c,
+	0xe530, 0x003e, 0x009e, 0x080c, 0xae78, 0x080c, 0x9664, 0x0005,
+	0x080c, 0x9614, 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c,
+	0xe8e7, 0x0036, 0x2019, 0x0029, 0x080c, 0xe530, 0x003e, 0x009e,
+	0x080c, 0xae78, 0x080c, 0x9790, 0x0005, 0x9182, 0x0085, 0x0002,
+	0xe05f, 0xe05d, 0xe05d, 0xe06b, 0xe05d, 0xe05d, 0xe05d, 0xe05d,
+	0xe05d, 0xe05d, 0xe05d, 0xe05d, 0xe05d, 0x080c, 0x0dd5, 0x6003,
+	0x000b, 0x6106, 0x080c, 0x90c7, 0x0126, 0x2091, 0x8000, 0x080c,
+	0x9664, 0x012e, 0x0005, 0x0026, 0x00e6, 0x080c, 0xe789, 0x0118,
+	0x080c, 0xae47, 0x0450, 0x2071, 0x0260, 0x7224, 0x6216, 0x2001,
+	0x180e, 0x2004, 0xd0e4, 0x0150, 0x6010, 0x00b6, 0x2058, 0xbca0,
+	0x00be, 0x2c00, 0x2011, 0x014e, 0x080c, 0xb168, 0x7220, 0x080c,
+	0xe3d6, 0x0118, 0x6007, 0x0086, 0x0040, 0x6007, 0x0087, 0x7224,
+	0x9296, 0xffff, 0x1110, 0x6007, 0x0086, 0x6003, 0x0001, 0x080c,
+	0x90c7, 0x080c, 0x9664, 0x080c, 0x9790, 0x00ee, 0x002e, 0x0005,
+	0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0dd5,
+	0x908a, 0x0092, 0x1a0c, 0x0dd5, 0x9082, 0x0085, 0x00a2, 0x9186,
+	0x0027, 0x0130, 0x9186, 0x0014, 0x0118, 0x080c, 0xaedd, 0x0050,
+	0x2001, 0x0007, 0x080c, 0x657c, 0x080c, 0x955f, 0x080c, 0xae78,
+	0x080c, 0x9664, 0x0005, 0xe0d0, 0xe0d2, 0xe0d2, 0xe0d0, 0xe0d0,
+	0xe0d0, 0xe0d0, 0xe0d0, 0xe0d0, 0xe0d0, 0xe0d0, 0xe0d0, 0xe0d0,
+	0x080c, 0x0dd5, 0x080c, 0x955f, 0x080c, 0xae78, 0x080c, 0x9664,
+	0x0005, 0x9182, 0x0085, 0x0a0c, 0x0dd5, 0x9182, 0x0092, 0x1a0c,
+	0x0dd5, 0x9182, 0x0085, 0x0002, 0xe0f1, 0xe0f1, 0xe0f1, 0xe0f3,
+	0xe0f1, 0xe0f1, 0xe0f1, 0xe0f1, 0xe0f1, 0xe0f1, 0xe0f1, 0xe0f1,
+	0xe0f1, 0x080c, 0x0dd5, 0x0005, 0x9186, 0x0013, 0x0148, 0x9186,
+	0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0xaedd, 0x0030,
+	0x080c, 0x955f, 0x080c, 0xae78, 0x080c, 0x9664, 0x0005, 0x0036,
+	0x080c, 0xe7ea, 0x6043, 0x0000, 0x2019, 0x000b, 0x0031, 0x6023,
+	0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, 0x0036, 0x2091,
+	0x8000, 0x0086, 0x2c40, 0x0096, 0x904e, 0x080c, 0xa682, 0x009e,
+	0x008e, 0x1550, 0x0076, 0x2c38, 0x080c, 0xa72d, 0x007e, 0x1520,
+	0x6000, 0x9086, 0x0000, 0x0500, 0x6020, 0x9086, 0x0007, 0x01e0,
+	0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xe7ea, 0x080c, 0xd22e,
+	0x080c, 0x1a5e, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, 0xcb1b,
+	0x0110, 0x080c, 0xe530, 0x009e, 0x6017, 0x0000, 0x080c, 0xe7ea,
+	0x6023, 0x0007, 0x080c, 0xd22e, 0x003e, 0x012e, 0x0005, 0x00f6,
+	0x00c6, 0x00b6, 0x0036, 0x0156, 0x2079, 0x0260, 0x7938, 0x783c,
+	0x080c, 0x283e, 0x15b8, 0x0016, 0x00c6, 0x080c, 0x6600, 0x1580,
+	0x001e, 0x00c6, 0x2160, 0x080c, 0xd22b, 0x00ce, 0x002e, 0x0026,
+	0x0016, 0x2019, 0x0029, 0x080c, 0xa7ee, 0x080c, 0x9262, 0x0076,
+	0x903e, 0x080c, 0x913f, 0x007e, 0x001e, 0x0076, 0x903e, 0x080c,
+	0xe2ca, 0x007e, 0x0026, 0xba04, 0x9294, 0xff00, 0x8217, 0x9286,
+	0x0006, 0x0118, 0x9286, 0x0004, 0x1118, 0xbaa0, 0x080c, 0x3276,
+	0x002e, 0x001e, 0x080c, 0x6035, 0xbe12, 0xbd16, 0x9006, 0x0010,
+	0x00ce, 0x001e, 0x015e, 0x003e, 0x00be, 0x00ce, 0x00fe, 0x0005,
+	0x00c6, 0x00d6, 0x00b6, 0x0016, 0x2009, 0x1824, 0x2104, 0x9086,
+	0x0074, 0x1904, 0xe1f1, 0x2069, 0x0260, 0x6944, 0x9182, 0x0100,
+	0x06e0, 0x6940, 0x9184, 0x8000, 0x0904, 0xe1ee, 0x2001, 0x197c,
+	0x2004, 0x9005, 0x1140, 0x6010, 0x2058, 0xb8c0, 0x9005, 0x0118,
+	0x9184, 0x0800, 0x0598, 0x6948, 0x918a, 0x0001, 0x0648, 0x080c,
+	0xe94f, 0x0118, 0x6978, 0xd1fc, 0x11b8, 0x2009, 0x0205, 0x200b,
+	0x0001, 0x693c, 0x81ff, 0x1198, 0x6944, 0x9182, 0x0100, 0x02a8,
+	0x6940, 0x81ff, 0x1178, 0x6948, 0x918a, 0x0001, 0x0288, 0x6950,
+	0x918a, 0x0001, 0x0298, 0x00d0, 0x6017, 0x0100, 0x00a0, 0x6017,
+	0x0300, 0x0088, 0x6017, 0x0500, 0x0070, 0x6017, 0x0700, 0x0058,
+	0x6017, 0x0900, 0x0040, 0x6017, 0x0b00, 0x0028, 0x6017, 0x0f00,
+	0x0010, 0x6017, 0x2d00, 0x9085, 0x0001, 0x0008, 0x9006, 0x001e,
+	0x00be, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00b6, 0x0026, 0x0036,
+	0x0156, 0x6210, 0x2258, 0xbb04, 0x9394, 0x00ff, 0x9286, 0x0006,
+	0x0180, 0x9286, 0x0004, 0x0168, 0x9394, 0xff00, 0x8217, 0x9286,
+	0x0006, 0x0138, 0x9286, 0x0004, 0x0120, 0x080c, 0x660f, 0x0804,
+	0xe259, 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019,
+	0x000a, 0x080c, 0xbe03, 0x009e, 0x15a8, 0x2011, 0x027a, 0x20a9,
+	0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xbe03, 0x009e,
+	0x1548, 0x0046, 0x0016, 0xbaa0, 0x2220, 0x9006, 0x2009, 0x1848,
+	0x210c, 0xd1a4, 0x0138, 0x2009, 0x0029, 0x080c, 0xe58d, 0xb800,
+	0xc0e5, 0xb802, 0x2019, 0x0029, 0x080c, 0x9262, 0x0076, 0x2039,
+	0x0000, 0x080c, 0x913f, 0x2c08, 0x080c, 0xe2ca, 0x007e, 0x2001,
+	0x0007, 0x080c, 0x657c, 0x2001, 0x0007, 0x080c, 0x6550, 0x001e,
+	0x004e, 0x9006, 0x015e, 0x003e, 0x002e, 0x00be, 0x00ce, 0x0005,
+	0x00d6, 0x2069, 0x026e, 0x6800, 0x9086, 0x0800, 0x0118, 0x6017,
+	0x0000, 0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, 0x00f6, 0x0016,
+	0x0026, 0x0036, 0x0156, 0x2079, 0x026c, 0x7930, 0x7834, 0x080c,
+	0x283e, 0x11d0, 0x080c, 0x6600, 0x11b8, 0x2011, 0x0270, 0x20a9,
+	0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xbe03, 0x009e,
+	0x1158, 0x2011, 0x0274, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019,
+	0x0006, 0x080c, 0xbe03, 0x009e, 0x015e, 0x003e, 0x002e, 0x001e,
+	0x00fe, 0x00be, 0x0005, 0x00b6, 0x0006, 0x0016, 0x0026, 0x0036,
+	0x0156, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x283e,
+	0x11d0, 0x080c, 0x6600, 0x11b8, 0x2011, 0x0276, 0x20a9, 0x0004,
+	0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xbe03, 0x009e, 0x1158,
 	0x2011, 0x027a, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006,
-	0x080c, 0xbb27, 0x009e, 0x1548, 0x0046, 0x0016, 0xbaa0, 0x2220,
-	0x9006, 0x2009, 0x1848, 0x210c, 0xd1a4, 0x0138, 0x2009, 0x0029,
-	0x080c, 0xe280, 0xb800, 0xc0e5, 0xb802, 0x2019, 0x0029, 0x080c,
-	0x901a, 0x0076, 0x2039, 0x0000, 0x080c, 0x8ef7, 0x2c08, 0x080c,
-	0xdfbd, 0x007e, 0x2001, 0x0007, 0x080c, 0x6349, 0x2001, 0x0007,
-	0x080c, 0x631d, 0x001e, 0x004e, 0x9006, 0x015e, 0x003e, 0x002e,
-	0x00be, 0x00ce, 0x0005, 0x00d6, 0x2069, 0x026e, 0x6800, 0x9086,
-	0x0800, 0x0118, 0x6017, 0x0000, 0x0008, 0x9006, 0x00de, 0x0005,
-	0x00b6, 0x00f6, 0x0016, 0x0026, 0x0036, 0x0156, 0x2079, 0x026c,
-	0x7930, 0x7834, 0x080c, 0x26f0, 0x11d0, 0x080c, 0x63cd, 0x11b8,
-	0x2011, 0x0270, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a,
-	0x080c, 0xbb27, 0x009e, 0x1158, 0x2011, 0x0274, 0x20a9, 0x0004,
-	0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xbb27, 0x009e, 0x015e,
-	0x003e, 0x002e, 0x001e, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x0006,
-	0x0016, 0x0026, 0x0036, 0x0156, 0x2011, 0x0263, 0x2204, 0x8211,
-	0x220c, 0x080c, 0x26f0, 0x11d0, 0x080c, 0x63cd, 0x11b8, 0x2011,
-	0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c,
-	0xbb27, 0x009e, 0x1158, 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096,
-	0x2b48, 0x2019, 0x0006, 0x080c, 0xbb27, 0x009e, 0x015e, 0x003e,
-	0x002e, 0x001e, 0x000e, 0x00be, 0x0005, 0x00e6, 0x00c6, 0x0086,
-	0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0126, 0x2091, 0x8000,
-	0x2740, 0x2029, 0x19ee, 0x252c, 0x2021, 0x19f4, 0x2424, 0x2061,
-	0x1cd0, 0x2071, 0x1800, 0x7654, 0x7074, 0x81ff, 0x0150, 0x0006,
-	0x9186, 0x1aa7, 0x000e, 0x0128, 0x8001, 0x9602, 0x1a04, 0xe05a,
-	0x0018, 0x9606, 0x0904, 0xe05a, 0x080c, 0x8710, 0x0904, 0xe051,
-	0x2100, 0x9c06, 0x0904, 0xe051, 0x080c, 0xe2bc, 0x1904, 0xe051,
-	0x080c, 0xe65a, 0x0904, 0xe051, 0x080c, 0xe2ac, 0x0904, 0xe051,
-	0x6720, 0x9786, 0x0001, 0x1148, 0x080c, 0x31bf, 0x0904, 0xe099,
-	0x6004, 0x9086, 0x0000, 0x1904, 0xe099, 0x9786, 0x0004, 0x0904,
-	0xe099, 0x9786, 0x0007, 0x0904, 0xe051, 0x2500, 0x9c06, 0x0904,
-	0xe051, 0x2400, 0x9c06, 0x05e8, 0x88ff, 0x0118, 0x6054, 0x9906,
-	0x15c0, 0x0096, 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c,
-	0x19b4, 0x001e, 0x9786, 0x000a, 0x0148, 0x080c, 0xca24, 0x1130,
-	0x080c, 0xb51d, 0x009e, 0x080c, 0xab9c, 0x0418, 0x6014, 0x2048,
-	0x080c, 0xc825, 0x01d8, 0x9786, 0x0003, 0x1570, 0xa867, 0x0103,
-	0xab7a, 0xa877, 0x0000, 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878,
-	0x2048, 0x080c, 0x0fb2, 0x009e, 0x080c, 0xe5d5, 0x0016, 0x080c,
-	0xcb0d, 0x080c, 0x6a3a, 0x001e, 0x080c, 0xca07, 0x009e, 0x080c,
-	0xab9c, 0x9ce0, 0x0018, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1210,
-	0x0804, 0xdfd1, 0x012e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e,
-	0x008e, 0x00ce, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1150, 0x9386,
-	0x0005, 0x0128, 0x080c, 0xe5d5, 0x080c, 0xe223, 0x08f8, 0x009e,
-	0x0c00, 0x9786, 0x0009, 0x11f8, 0x6000, 0x9086, 0x0004, 0x01c0,
-	0x6000, 0x9086, 0x0003, 0x11a0, 0x080c, 0x93cc, 0x0096, 0x6114,
-	0x2148, 0x080c, 0xc825, 0x0118, 0x6010, 0x080c, 0x6a46, 0x009e,
-	0x00c6, 0x080c, 0xab6b, 0x00ce, 0x0036, 0x080c, 0x9548, 0x003e,
-	0x009e, 0x0804, 0xe051, 0x9786, 0x000a, 0x0904, 0xe038, 0x0804,
-	0xe036, 0x81ff, 0x0904, 0xe051, 0x9180, 0x0001, 0x2004, 0x9086,
-	0x0018, 0x0138, 0x9180, 0x0001, 0x2004, 0x9086, 0x002d, 0x1904,
-	0xe051, 0x6000, 0x9086, 0x0002, 0x1904, 0xe051, 0x080c, 0xca13,
-	0x0138, 0x080c, 0xca24, 0x1904, 0xe051, 0x080c, 0xb51d, 0x0038,
-	0x080c, 0x3093, 0x080c, 0xca24, 0x1110, 0x080c, 0xb51d, 0x080c,
-	0xab9c, 0x0804, 0xe051, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039,
-	0x0005, 0x00c6, 0x00e6, 0x0016, 0x2c08, 0x2170, 0x9006, 0x080c,
-	0xe24a, 0x001e, 0x0120, 0x6020, 0x9084, 0x000f, 0x001b, 0x00ee,
-	0x00ce, 0x0005, 0xe0e8, 0xe0e8, 0xe0e8, 0xe0e8, 0xe0e8, 0xe0e8,
-	0xe0ea, 0xe0e8, 0xe0e8, 0xe0e8, 0xe0e8, 0xab9c, 0xab9c, 0xe0e8,
-	0x9006, 0x0005, 0x0036, 0x0046, 0x0016, 0x7010, 0x00b6, 0x2058,
-	0xbca0, 0x00be, 0x2c00, 0x2009, 0x0020, 0x080c, 0xe280, 0x001e,
-	0x004e, 0x2019, 0x0002, 0x080c, 0xde08, 0x003e, 0x9085, 0x0001,
-	0x0005, 0x0096, 0x080c, 0xc825, 0x0140, 0x6014, 0x904d, 0x080c,
-	0xc472, 0x687b, 0x0005, 0x080c, 0x6a46, 0x009e, 0x080c, 0xab9c,
-	0x9085, 0x0001, 0x0005, 0x2001, 0x0001, 0x080c, 0x6309, 0x0156,
-	0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011,
-	0x0276, 0x080c, 0xbb13, 0x003e, 0x002e, 0x001e, 0x015e, 0x9005,
-	0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x00b6,
-	0x0126, 0x2091, 0x8000, 0x2740, 0x2061, 0x1cd0, 0x2079, 0x0001,
-	0x8fff, 0x0904, 0xe183, 0x2071, 0x1800, 0x7654, 0x7074, 0x8001,
-	0x9602, 0x1a04, 0xe183, 0x88ff, 0x0120, 0x2800, 0x9c06, 0x1590,
-	0x2078, 0x080c, 0xe2ac, 0x0570, 0x2400, 0x9c06, 0x0558, 0x6720,
-	0x9786, 0x0006, 0x1538, 0x9786, 0x0007, 0x0520, 0x88ff, 0x1140,
-	0x6010, 0x9b06, 0x11f8, 0x85ff, 0x0118, 0x6054, 0x9106, 0x11d0,
-	0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xe4d8, 0x080c, 0xcf30,
-	0x080c, 0x19b4, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, 0xc825,
-	0x0120, 0x0046, 0x080c, 0xe223, 0x004e, 0x009e, 0x080c, 0xab9c,
-	0x88ff, 0x1198, 0x9ce0, 0x0018, 0x2001, 0x181a, 0x2004, 0x9c02,
-	0x1210, 0x0804, 0xe138, 0x9006, 0x012e, 0x00be, 0x006e, 0x007e,
-	0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x98c5, 0x0001, 0x0ca0,
-	0x00b6, 0x0076, 0x0056, 0x0086, 0x9046, 0x2029, 0x0001, 0x2c20,
-	0x2019, 0x0002, 0x6210, 0x2258, 0x0096, 0x904e, 0x080c, 0xa3a6,
-	0x009e, 0x008e, 0x903e, 0x080c, 0xa451, 0x080c, 0xe129, 0x005e,
-	0x007e, 0x00be, 0x0005, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6,
-	0x0156, 0x2c20, 0x2128, 0x20a9, 0x007f, 0x900e, 0x0016, 0x0036,
-	0x080c, 0x63cd, 0x1190, 0x0056, 0x0086, 0x9046, 0x2508, 0x2029,
-	0x0001, 0x0096, 0x904e, 0x080c, 0xa3a6, 0x009e, 0x008e, 0x903e,
-	0x080c, 0xa451, 0x080c, 0xe129, 0x005e, 0x003e, 0x001e, 0x8108,
-	0x1f04, 0xe1b6, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be,
-	0x0005, 0x00b6, 0x0076, 0x0056, 0x6210, 0x2258, 0x0086, 0x9046,
-	0x2029, 0x0001, 0x2019, 0x0048, 0x0096, 0x904e, 0x080c, 0xa3a6,
-	0x009e, 0x008e, 0x903e, 0x080c, 0xa451, 0x2c20, 0x080c, 0xe129,
-	0x005e, 0x007e, 0x00be, 0x0005, 0x00b6, 0x0046, 0x0056, 0x0076,
-	0x00c6, 0x0156, 0x2c20, 0x20a9, 0x0800, 0x900e, 0x0016, 0x0036,
-	0x080c, 0x63cd, 0x11a0, 0x0086, 0x9046, 0x2828, 0x0046, 0x2021,
-	0x0001, 0x080c, 0xe4bc, 0x004e, 0x0096, 0x904e, 0x080c, 0xa3a6,
-	0x009e, 0x008e, 0x903e, 0x080c, 0xa451, 0x080c, 0xe129, 0x003e,
-	0x001e, 0x8108, 0x1f04, 0xe1fe, 0x015e, 0x00ce, 0x007e, 0x005e,
-	0x004e, 0x00be, 0x0005, 0x0016, 0x00f6, 0x080c, 0xc823, 0x0198,
-	0xa864, 0x9084, 0x00ff, 0x9086, 0x0046, 0x0180, 0xa800, 0x907d,
-	0x0138, 0xa803, 0x0000, 0xab82, 0x080c, 0x6a46, 0x2f48, 0x0cb0,
-	0xab82, 0x080c, 0x6a46, 0x00fe, 0x001e, 0x0005, 0xa800, 0x907d,
-	0x0130, 0xa803, 0x0000, 0x080c, 0x6a46, 0x2f48, 0x0cb8, 0x080c,
-	0x6a46, 0x0c88, 0x00e6, 0x0046, 0x0036, 0x2061, 0x1cd0, 0x9005,
-	0x1138, 0x2071, 0x1800, 0x7454, 0x7074, 0x8001, 0x9402, 0x12f8,
-	0x2100, 0x9c06, 0x0188, 0x6000, 0x9086, 0x0000, 0x0168, 0x6008,
-	0x9206, 0x1150, 0x6320, 0x9386, 0x0009, 0x01b0, 0x6010, 0x91a0,
-	0x0004, 0x2424, 0x9406, 0x0140, 0x9ce0, 0x0018, 0x2001, 0x181a,
-	0x2004, 0x9c02, 0x1220, 0x0c20, 0x9085, 0x0001, 0x0008, 0x9006,
-	0x003e, 0x004e, 0x00ee, 0x0005, 0x631c, 0xd3c4, 0x1d68, 0x0c30,
-	0x0096, 0x0006, 0x080c, 0x1000, 0x000e, 0x090c, 0x0dd5, 0xa867,
-	0x010d, 0xa88e, 0x0026, 0x2010, 0x080c, 0xc813, 0x2001, 0x0000,
-	0x0120, 0x2200, 0x9080, 0x0015, 0x2004, 0x002e, 0xa87a, 0xa986,
-	0xac76, 0xa87f, 0x0000, 0x2001, 0x198c, 0x2004, 0xa882, 0x9006,
-	0xa8e2, 0xa802, 0xa86a, 0xa88a, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x6a46, 0x012e, 0x009e, 0x0005, 0x6700, 0x9786, 0x0000, 0x0158,
-	0x9786, 0x0001, 0x0140, 0x9786, 0x000a, 0x0128, 0x9786, 0x0009,
-	0x0110, 0x9085, 0x0001, 0x0005, 0x00e6, 0x6010, 0x9075, 0x0138,
-	0x00b6, 0x2058, 0xb8a0, 0x00be, 0x9206, 0x00ee, 0x0005, 0x9085,
-	0x0001, 0x0cd8, 0x0016, 0x6004, 0x908e, 0x001e, 0x11a0, 0x8007,
-	0x6134, 0x918c, 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, 0x6003,
-	0x000b, 0x6023, 0x0005, 0x2001, 0x1985, 0x2004, 0x601a, 0x080c,
-	0x8e7f, 0x080c, 0x941c, 0x001e, 0x0005, 0xa001, 0xa001, 0x0005,
-	0x6024, 0xd0e4, 0x0158, 0xd0cc, 0x0118, 0x080c, 0xcb51, 0x0030,
-	0x080c, 0xe4d8, 0x080c, 0x8441, 0x080c, 0xab6b, 0x0005, 0x9280,
-	0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xe30b, 0xe30b, 0xe30b,
-	0xe30d, 0xe30b, 0xe30d, 0xe30d, 0xe30b, 0xe30d, 0xe30b, 0xe30b,
-	0xe30b, 0xe30b, 0xe30b, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005,
-	0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xe324, 0xe324,
-	0xe324, 0xe324, 0xe324, 0xe324, 0xe331, 0xe324, 0xe324, 0xe324,
-	0xe324, 0xe324, 0xe324, 0xe324, 0x6007, 0x003b, 0x602f, 0x0009,
-	0x6017, 0x2a00, 0x6003, 0x0001, 0x080c, 0x8e7f, 0x080c, 0x941c,
-	0x0005, 0x0096, 0x00c6, 0x2260, 0x080c, 0xe4d8, 0x6043, 0x0000,
-	0x6024, 0xc0f4, 0xc0e4, 0x6026, 0x603b, 0x0000, 0x00ce, 0x00d6,
-	0x2268, 0x9186, 0x0007, 0x1904, 0xe38a, 0x6814, 0x9005, 0x0138,
-	0x2048, 0xa87c, 0xd0fc, 0x1118, 0x00de, 0x009e, 0x08a8, 0x6007,
-	0x003a, 0x6003, 0x0001, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x00c6,
-	0x2d60, 0x6100, 0x9186, 0x0002, 0x1904, 0xe401, 0x6014, 0x9005,
-	0x1138, 0x6000, 0x9086, 0x0007, 0x190c, 0x0dd5, 0x0804, 0xe401,
-	0x2048, 0x080c, 0xc825, 0x1130, 0x0028, 0x2048, 0xa800, 0x9005,
-	0x1de0, 0x2900, 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002,
-	0x1168, 0xa87c, 0xc0dc, 0xc0f4, 0xa87e, 0xa880, 0xc0fc, 0xa882,
-	0x2009, 0x0043, 0x080c, 0xdc61, 0x0804, 0xe401, 0x2009, 0x0041,
-	0x0804, 0xe3fb, 0x9186, 0x0005, 0x15a0, 0x6814, 0x2048, 0xa87c,
-	0xd0bc, 0x1120, 0x00de, 0x009e, 0x0804, 0xe324, 0xd0b4, 0x0128,
-	0xd0fc, 0x090c, 0x0dd5, 0x0804, 0xe345, 0x6007, 0x003a, 0x6003,
-	0x0001, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x00c6, 0x2d60, 0x6100,
-	0x9186, 0x0002, 0x0120, 0x9186, 0x0004, 0x1904, 0xe401, 0x6814,
-	0x2048, 0xa97c, 0xc1f4, 0xc1dc, 0xa97e, 0xa980, 0xc1fc, 0xc1bc,
-	0xa982, 0x00f6, 0x2c78, 0x080c, 0x1689, 0x00fe, 0x2009, 0x0042,
-	0x04d0, 0x0036, 0x080c, 0x1000, 0x090c, 0x0dd5, 0xa867, 0x010d,
-	0x9006, 0xa802, 0xa86a, 0xa88a, 0x2d18, 0xab8e, 0xa887, 0x0045,
-	0x2c00, 0xa892, 0x6038, 0xa8a2, 0x2360, 0x6024, 0xc0dd, 0x6026,
-	0x6010, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x2004, 0x6354, 0xab7a,
-	0xa876, 0x9006, 0xa87e, 0xa882, 0xad9a, 0xae96, 0xa89f, 0x0001,
-	0x080c, 0x6a46, 0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xde08,
-	0x2d00, 0x600a, 0x6023, 0x0006, 0x6003, 0x0007, 0x901e, 0x631a,
-	0x6342, 0x003e, 0x0038, 0x6043, 0x0000, 0x6003, 0x0007, 0x080c,
-	0xdc61, 0x00ce, 0x00de, 0x009e, 0x0005, 0x9186, 0x0013, 0x1128,
-	0x6004, 0x9082, 0x0085, 0x2008, 0x00c2, 0x9186, 0x0027, 0x1178,
-	0x080c, 0x9317, 0x0036, 0x0096, 0x6014, 0x2048, 0x2019, 0x0004,
-	0x080c, 0xe223, 0x009e, 0x003e, 0x080c, 0x941c, 0x0005, 0x9186,
-	0x0014, 0x0d70, 0x080c, 0xac01, 0x0005, 0xe434, 0xe432, 0xe432,
-	0xe432, 0xe432, 0xe432, 0xe434, 0xe432, 0xe432, 0xe432, 0xe432,
-	0xe432, 0xe432, 0x080c, 0x0dd5, 0x080c, 0x9317, 0x6003, 0x000c,
-	0x080c, 0x941c, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085,
-	0x0208, 0x001a, 0x080c, 0xac01, 0x0005, 0xe452, 0xe452, 0xe452,
-	0xe452, 0xe454, 0xe474, 0xe452, 0xe452, 0xe452, 0xe452, 0xe452,
-	0xe452, 0xe452, 0x080c, 0x0dd5, 0x00d6, 0x2c68, 0x080c, 0xab15,
-	0x01b0, 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0x026e, 0x210c,
-	0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x600b, 0xffff, 0x6910,
-	0x6112, 0x6023, 0x0004, 0x080c, 0x8e7f, 0x080c, 0x941c, 0x2d60,
-	0x080c, 0xab6b, 0x00de, 0x0005, 0x080c, 0xab6b, 0x0005, 0x00e6,
-	0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ec, 0x00ee, 0x0005,
-	0x2009, 0x1867, 0x210c, 0xd1ec, 0x05b0, 0x6003, 0x0002, 0x6024,
-	0xc0e5, 0x6026, 0xd0cc, 0x0150, 0x2001, 0x1986, 0x2004, 0x6042,
-	0x2009, 0x1867, 0x210c, 0xd1f4, 0x1520, 0x00a0, 0x2009, 0x1867,
-	0x210c, 0xd1f4, 0x0128, 0x6024, 0xc0e4, 0x6026, 0x9006, 0x00d8,
-	0x2001, 0x1986, 0x200c, 0x2001, 0x1984, 0x2004, 0x9100, 0x9080,
-	0x000a, 0x6042, 0x6010, 0x00b6, 0x2058, 0xb8bc, 0x00be, 0x0008,
-	0x2104, 0x9005, 0x0118, 0x9088, 0x0003, 0x0cd0, 0x2c0a, 0x600f,
-	0x0000, 0x9085, 0x0001, 0x0005, 0x0016, 0x00c6, 0x00e6, 0x6154,
-	0xb8bc, 0x2060, 0x8cff, 0x0180, 0x84ff, 0x1118, 0x6054, 0x9106,
-	0x1138, 0x600c, 0x2072, 0x080c, 0x8441, 0x080c, 0xab6b, 0x0010,
-	0x9cf0, 0x0003, 0x2e64, 0x0c70, 0x00ee, 0x00ce, 0x001e, 0x0005,
-	0x00d6, 0x00b6, 0x6010, 0x2058, 0xb8bc, 0x2068, 0x9005, 0x0130,
-	0x9c06, 0x0110, 0x680c, 0x0cd0, 0x600c, 0x680e, 0x00be, 0x00de,
-	0x0005, 0x0026, 0x0036, 0x0156, 0x2011, 0x182c, 0x2204, 0x9084,
-	0x00ff, 0x2019, 0x026e, 0x2334, 0x9636, 0x1508, 0x8318, 0x2334,
-	0x2204, 0x9084, 0xff00, 0x9636, 0x11d0, 0x2011, 0x0270, 0x20a9,
-	0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xbb27,
-	0x009e, 0x1168, 0x2011, 0x0274, 0x20a9, 0x0004, 0x6010, 0x0096,
-	0x2048, 0x2019, 0x0006, 0x080c, 0xbb27, 0x009e, 0x1100, 0x015e,
-	0x003e, 0x002e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5d8b,
-	0x080c, 0x2e48, 0x00ee, 0x0005, 0x0096, 0x0026, 0x080c, 0x1000,
-	0x090c, 0x0dd5, 0xa85c, 0x9080, 0x001a, 0x20a0, 0x20a9, 0x000c,
-	0xa860, 0x20e8, 0x9006, 0x4004, 0x9186, 0x0046, 0x1118, 0xa867,
-	0x0136, 0x0038, 0xa867, 0x0138, 0x9186, 0x0041, 0x0110, 0xa87b,
-	0x0001, 0x7038, 0x9084, 0xff00, 0x7240, 0x9294, 0xff00, 0x8007,
-	0x9215, 0xaa9a, 0x9186, 0x0046, 0x1168, 0x7038, 0x9084, 0x00ff,
-	0x723c, 0x9294, 0xff00, 0x9215, 0xaa9e, 0x723c, 0x9294, 0x00ff,
-	0xaaa2, 0x0060, 0x7040, 0x9084, 0x00ff, 0x7244, 0x9294, 0xff00,
-	0x9215, 0xaa9e, 0x7244, 0x9294, 0x00ff, 0xaaa2, 0x9186, 0x0046,
-	0x1118, 0x9e90, 0x0012, 0x0010, 0x9e90, 0x001a, 0x2204, 0x8007,
-	0xa8a6, 0x8210, 0x2204, 0x8007, 0xa8aa, 0x8210, 0x2204, 0x8007,
-	0xa8ae, 0x8210, 0x2204, 0x8007, 0xa8b2, 0x8210, 0x9186, 0x0046,
-	0x11b8, 0x9e90, 0x0016, 0x2204, 0x8007, 0xa8b6, 0x8210, 0x2204,
-	0x8007, 0xa8ba, 0x8210, 0x2204, 0x8007, 0xa8be, 0x8210, 0x2204,
-	0x8007, 0xa8c2, 0x8210, 0x2011, 0x0205, 0x2013, 0x0001, 0x00b0,
-	0x9e90, 0x001e, 0x2204, 0x8007, 0xa8b6, 0x8210, 0x2204, 0x8007,
-	0xa8ba, 0x2011, 0x0205, 0x2013, 0x0001, 0x2011, 0x0260, 0x2204,
-	0x8007, 0xa8be, 0x8210, 0x2204, 0x8007, 0xa8c2, 0x9186, 0x0046,
-	0x1118, 0x2011, 0x0262, 0x0010, 0x2011, 0x026a, 0x0146, 0x01d6,
-	0x0036, 0x20a9, 0x0001, 0x2019, 0x0008, 0xa860, 0x20e8, 0xa85c,
-	0x9080, 0x0031, 0x20a0, 0x2204, 0x8007, 0x4004, 0x8210, 0x8319,
-	0x1dd0, 0x003e, 0x01ce, 0x013e, 0x2011, 0x0205, 0x2013, 0x0000,
-	0x002e, 0x080c, 0x6a46, 0x009e, 0x0005, 0x00e6, 0x6010, 0x00b6,
-	0x2058, 0xb800, 0x00be, 0xd0fc, 0x0108, 0x0011, 0x00ee, 0x0005,
-	0xa880, 0xc0e5, 0xa882, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0076,
-	0x0066, 0x0056, 0x0046, 0x0026, 0x0016, 0x0126, 0x2091, 0x8000,
-	0x2029, 0x19ee, 0x252c, 0x2021, 0x19f4, 0x2424, 0x2061, 0x1cd0,
-	0x2071, 0x1800, 0x7654, 0x7074, 0x9606, 0x0578, 0x6720, 0x9786,
-	0x0001, 0x0118, 0x9786, 0x0008, 0x1500, 0x2500, 0x9c06, 0x01e8,
-	0x2400, 0x9c06, 0x01d0, 0x080c, 0xe2ac, 0x01b8, 0x080c, 0xe2bc,
-	0x11a0, 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x19b4,
-	0x001e, 0x080c, 0xca13, 0x1110, 0x080c, 0x3093, 0x080c, 0xca24,
-	0x1110, 0x080c, 0xb51d, 0x080c, 0xab9c, 0x9ce0, 0x0018, 0x2001,
-	0x181a, 0x2004, 0x9c02, 0x1208, 0x0858, 0x012e, 0x001e, 0x002e,
-	0x004e, 0x005e, 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x0005,
-	0x2001, 0x1810, 0x2004, 0xd0dc, 0x0005, 0x0006, 0x2001, 0x1837,
-	0x2004, 0xd09c, 0x000e, 0x0005, 0x0006, 0x0036, 0x0046, 0x080c,
-	0xcf18, 0x0168, 0x2019, 0xffff, 0x9005, 0x0128, 0x6010, 0x00b6,
-	0x2058, 0xbba0, 0x00be, 0x2021, 0x0004, 0x080c, 0x4ab2, 0x004e,
-	0x003e, 0x000e, 0x6004, 0x9086, 0x0001, 0x1128, 0x080c, 0xa512,
-	0x080c, 0xab9c, 0x9006, 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016,
-	0x2091, 0x8000, 0x2071, 0x1840, 0xd5a4, 0x0118, 0x7004, 0x8000,
-	0x7006, 0xd5b4, 0x0118, 0x7000, 0x8000, 0x7002, 0xd5ac, 0x0178,
-	0x2500, 0x9084, 0x0007, 0x908e, 0x0003, 0x0148, 0x908e, 0x0004,
-	0x0130, 0x908e, 0x0005, 0x0118, 0x2071, 0xfffe, 0x0089, 0x001e,
-	0x00ee, 0x000e, 0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091,
-	0x8000, 0x2071, 0xfff6, 0x0021, 0x00ee, 0x000e, 0x012e, 0x0005,
-	0x2e05, 0x8000, 0x2077, 0x1220, 0x8e70, 0x2e05, 0x8000, 0x2077,
-	0x0005, 0x00e6, 0x2071, 0xfff4, 0x0c99, 0x00ee, 0x0005, 0x00e6,
-	0x2071, 0xfff8, 0x0c69, 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6,
-	0x2091, 0x8000, 0x2071, 0x1840, 0x7014, 0x8000, 0x7016, 0x00ee,
-	0x000e, 0x012e, 0x0005, 0x0003, 0x000b, 0x079a, 0x0000, 0xc000,
-	0x0001, 0x8064, 0x0008, 0x0010, 0x0000, 0x8066, 0x0000, 0x0101,
-	0x0008, 0x4407, 0x0003, 0x8060, 0x0000, 0x0400, 0x0000, 0x580d,
-	0x000b, 0x79a8, 0x000b, 0x50ee, 0x000b, 0x4c0a, 0x0003, 0xbac0,
-	0x0009, 0x008a, 0x0000, 0x0c0a, 0x000b, 0x15fe, 0x0008, 0x340a,
-	0x0003, 0xc4c0, 0x0009, 0x7000, 0x0000, 0xffa0, 0x0001, 0x2000,
-	0x0000, 0x1668, 0x000b, 0x808c, 0x0008, 0x0001, 0x0000, 0x0000,
-	0x0007, 0x4028, 0x0000, 0x4047, 0x000a, 0x808c, 0x0008, 0x0002,
-	0x0000, 0x0822, 0x0003, 0x4022, 0x0000, 0x0028, 0x000b, 0x4122,
-	0x0008, 0x94c0, 0x0009, 0xff00, 0x0008, 0xffe0, 0x0009, 0x0500,
-	0x0008, 0x0a93, 0x000b, 0x4447, 0x0002, 0x0e90, 0x0003, 0x0bfe,
-	0x0008, 0x11a0, 0x0001, 0x126e, 0x0003, 0x0ca0, 0x0001, 0x126e,
-	0x0003, 0x9180, 0x0001, 0x0004, 0x0000, 0x8060, 0x0000, 0x0400,
-	0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x4436,
-	0x000b, 0x808c, 0x0008, 0x0000, 0x0008, 0x0060, 0x0008, 0x8062,
-	0x0008, 0x0004, 0x0000, 0x8066, 0x0000, 0x0411, 0x0000, 0x443e,
-	0x0003, 0x03fe, 0x0000, 0x43e0, 0x0001, 0x0e6b, 0x000b, 0xc2c0,
-	0x0009, 0x00ff, 0x0008, 0x02e0, 0x0001, 0x0e6b, 0x000b, 0x9180,
-	0x0001, 0x0005, 0x0008, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62,
-	0x0008, 0x8066, 0x0000, 0x0019, 0x0000, 0x444d, 0x000b, 0x0240,
-	0x0002, 0x0a68, 0x0003, 0x00fe, 0x0000, 0x326b, 0x000b, 0x0248,
-	0x000a, 0x085c, 0x0003, 0x9180, 0x0001, 0x0006, 0x0008, 0x7f62,
-	0x0008, 0x8002, 0x0008, 0x0003, 0x0008, 0x8066, 0x0000, 0x020a,
-	0x0000, 0x445b, 0x0003, 0x112a, 0x0000, 0x002e, 0x0008, 0x022c,
-	0x0008, 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x808c, 0x0008, 0x0002,
-	0x0000, 0x1760, 0x0008, 0x8062, 0x0008, 0x000f, 0x0008, 0x8066,
-	0x0000, 0x0011, 0x0008, 0x4468, 0x0003, 0x01fe, 0x0008, 0x42e0,
-	0x0009, 0x0e5c, 0x0003, 0x00fe, 0x0000, 0x43e0, 0x0001, 0x0e5c,
-	0x0003, 0x1734, 0x0000, 0x1530, 0x0000, 0x1632, 0x0008, 0x0d2a,
-	0x0008, 0x9880, 0x0001, 0x0010, 0x0000, 0x8060, 0x0000, 0x0400,
-	0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x1e0a, 0x0008, 0x447a,
-	0x0003, 0x808a, 0x0008, 0x0003, 0x0008, 0x1a60, 0x0000, 0x8062,
-	0x0008, 0x0002, 0x0000, 0x5880, 0x000b, 0x8066, 0x0000, 0x3679,
-	0x0000, 0x4483, 0x0003, 0x5884, 0x0003, 0x3efe, 0x0008, 0x7f4f,
-	0x0002, 0x088a, 0x000b, 0x0d00, 0x0000, 0x0092, 0x000c, 0x8054,
-	0x0008, 0x0011, 0x0008, 0x8074, 0x0000, 0x1010, 0x0008, 0x1efe,
-	0x0000, 0x300a, 0x000b, 0x00c8, 0x000c, 0x000a, 0x000b, 0x00fe,
-	0x0000, 0x349a, 0x0003, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0007,
-	0x0000, 0x8066, 0x0000, 0x0231, 0x0008, 0x4499, 0x000b, 0x03fe,
-	0x0000, 0x04d0, 0x0001, 0x0cc0, 0x000b, 0x82c0, 0x0001, 0x1f00,
-	0x0000, 0xffa0, 0x0001, 0x0400, 0x0000, 0x08af, 0x0003, 0x14c0,
-	0x000b, 0x01fe, 0x0008, 0x0580, 0x0009, 0x7f06, 0x0000, 0x02fe,
-	0x0008, 0xffc0, 0x0001, 0x00ff, 0x0008, 0x0690, 0x0001, 0x10af,
-	0x0003, 0x7f08, 0x0008, 0x84c0, 0x0001, 0xff00, 0x0008, 0x08c0,
-	0x0003, 0x00fe, 0x0000, 0x34b6, 0x000b, 0x8072, 0x0000, 0x1010,
-	0x0008, 0x3944, 0x0002, 0x08b1, 0x0003, 0x00ba, 0x0003, 0x8072,
-	0x0000, 0x2020, 0x0008, 0x3945, 0x000a, 0x08b6, 0x000b, 0x3946,
-	0x000a, 0x0cc7, 0x0003, 0x0000, 0x0007, 0x3943, 0x000a, 0x08c7,
-	0x000b, 0x00ba, 0x0003, 0x00fe, 0x0000, 0x34c5, 0x0003, 0x8072,
-	0x0000, 0x1000, 0x0000, 0x00c7, 0x0003, 0x8072, 0x0000, 0x2000,
-	0x0000, 0x4000, 0x000f, 0x1c60, 0x0000, 0x1b62, 0x0000, 0x8066,
-	0x0000, 0x0231, 0x0008, 0x44cc, 0x000b, 0x58cd, 0x000b, 0x0140,
-	0x0008, 0x0242, 0x0000, 0x1f43, 0x0002, 0x0cdb, 0x000b, 0x0d44,
-	0x0000, 0x0d46, 0x0008, 0x0348, 0x0008, 0x044a, 0x0008, 0x030a,
-	0x0008, 0x040c, 0x0000, 0x0d06, 0x0000, 0x0d08, 0x0008, 0x00df,
-	0x0003, 0x0344, 0x0008, 0x0446, 0x0008, 0x0548, 0x0008, 0x064a,
-	0x0000, 0x1948, 0x000a, 0x08e2, 0x0003, 0x0d4a, 0x0008, 0x58e2,
-	0x0003, 0x3efe, 0x0008, 0x7f4f, 0x0002, 0x08e9, 0x000b, 0x8000,
-	0x0000, 0x0001, 0x0000, 0x0092, 0x000c, 0x8054, 0x0008, 0x0001,
-	0x0000, 0x8074, 0x0000, 0x2020, 0x0008, 0x4000, 0x000f, 0x3a40,
-	0x000a, 0x0c0d, 0x0003, 0x2b24, 0x0008, 0x2b24, 0x0008, 0x58f2,
-	0x000b, 0x8054, 0x0008, 0x0002, 0x0000, 0x1242, 0x0002, 0x0940,
-	0x0003, 0x3a45, 0x000a, 0x092f, 0x0003, 0x8072, 0x0000, 0x1000,
-	0x0000, 0x3945, 0x000a, 0x08ff, 0x0003, 0x8072, 0x0000, 0x3010,
-	0x0000, 0x1e10, 0x000a, 0x7f3c, 0x0000, 0x092a, 0x0003, 0x1d00,
-	0x0002, 0x7f3a, 0x0000, 0x0d60, 0x0000, 0x7f62, 0x0008, 0x8066,
-	0x0000, 0x0009, 0x0008, 0x4508, 0x000b, 0x00fe, 0x0000, 0x3527,
-	0x000b, 0x1c60, 0x0000, 0x8062, 0x0008, 0x0001, 0x0000, 0x8066,
-	0x0000, 0x0009, 0x0008, 0x4510, 0x000b, 0x00fe, 0x0000, 0x3243,
-	0x000b, 0x0038, 0x0000, 0x0060, 0x0008, 0x8062, 0x0008, 0x0019,
-	0x0000, 0x8066, 0x0000, 0x0009, 0x0008, 0x4519, 0x000b, 0x80c0,
-	0x0009, 0x00ff, 0x0008, 0x7f3e, 0x0008, 0x0d60, 0x0000, 0x0efe,
-	0x0008, 0x1f80, 0x0001, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009,
-	0x0008, 0x4523, 0x000b, 0x003a, 0x0008, 0x1dfe, 0x0000, 0x0104,
-	0x000b, 0x0036, 0x0008, 0x00c8, 0x000c, 0x0140, 0x000b, 0x8074,
-	0x0000, 0x2000, 0x0000, 0x8072, 0x0000, 0x2000, 0x0000, 0x0140,
-	0x000b, 0x3a44, 0x0002, 0x0a71, 0x000b, 0x8074, 0x0000, 0x1000,
-	0x0000, 0x8072, 0x0000, 0x1000, 0x0000, 0x2d0e, 0x0000, 0x2d0e,
-	0x0000, 0x3640, 0x0003, 0x26fe, 0x0008, 0x26fe, 0x0008, 0x2700,
-	0x0008, 0x2700, 0x0008, 0x00d0, 0x0009, 0x0d52, 0x000b, 0x8074,
-	0x0000, 0x4040, 0x0008, 0x5940, 0x0003, 0x50ee, 0x000b, 0x3a46,
-	0x000a, 0x0d52, 0x000b, 0x3a47, 0x0002, 0x094d, 0x000b, 0x8054,
-	0x0008, 0x0004, 0x0000, 0x8074, 0x0000, 0x8000, 0x0000, 0x8072,
-	0x0000, 0x3000, 0x0008, 0x019c, 0x0003, 0x92c0, 0x0009, 0x0fc8,
-	0x0000, 0x080a, 0x0003, 0x1246, 0x000a, 0x0e3a, 0x0003, 0x1a60,
-	0x0000, 0x8062, 0x0008, 0x0002, 0x0000, 0x8066, 0x0000, 0x362a,
-	0x0000, 0x4557, 0x000b, 0x2000, 0x0000, 0x2000, 0x0000, 0x2102,
-	0x0000, 0x2102, 0x0000, 0x2204, 0x0000, 0x2204, 0x0000, 0x2306,
-	0x0000, 0x2306, 0x0000, 0x2408, 0x0000, 0x2408, 0x0000, 0x250a,
-	0x0000, 0x250a, 0x0000, 0x260c, 0x0000, 0x260c, 0x0000, 0x270e,
-	0x0000, 0x270e, 0x0000, 0x2810, 0x0000, 0x2810, 0x0000, 0x2912,
-	0x0000, 0x2912, 0x0000, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0007,
-	0x0000, 0x8066, 0x0000, 0x0052, 0x0000, 0x4571, 0x0003, 0x92c0,
-	0x0009, 0x0780, 0x0008, 0x0e56, 0x0003, 0x124b, 0x0002, 0x097a,
-	0x0003, 0x2e4d, 0x0002, 0x2e4d, 0x0002, 0x0a40, 0x0003, 0x3a46,
-	0x000a, 0x0d8a, 0x000b, 0x597c, 0x0003, 0x8054, 0x0008, 0x0004,
-	0x0000, 0x1243, 0x000a, 0x0998, 0x0003, 0x8010, 0x0008, 0x000d,
-	0x0000, 0x021b, 0x000c, 0x1948, 0x000a, 0x0987, 0x000b, 0x0210,
-	0x0004, 0x1810, 0x0000, 0x021b, 0x000c, 0x0198, 0x000b, 0x1948,
-	0x000a, 0x098e, 0x000b, 0x1243, 0x000a, 0x0a43, 0x0003, 0x194d,
-	0x000a, 0x0992, 0x0003, 0x1243, 0x000a, 0x0a4a, 0x0003, 0x5992,
-	0x0003, 0x8054, 0x0008, 0x0004, 0x0000, 0x0210, 0x0004, 0x1810,
-	0x0000, 0x021b, 0x000c, 0x8074, 0x0000, 0xf000, 0x0008, 0x8072,
-	0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, 0x3a42, 0x0002, 0x0da2,
-	0x000b, 0x15fe, 0x0008, 0x3461, 0x000b, 0x000a, 0x000b, 0x8074,
-	0x0000, 0x0501, 0x0000, 0x8010, 0x0008, 0x000c, 0x0008, 0x021b,
-	0x000c, 0x000a, 0x000b, 0xbbe0, 0x0009, 0x0030, 0x0008, 0x0db8,
-	0x0003, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x09b5, 0x0003, 0x15fe,
-	0x0008, 0x3ce0, 0x0009, 0x09b5, 0x0003, 0x020b, 0x0004, 0x8076,
-	0x0008, 0x0040, 0x0000, 0x0208, 0x000b, 0x8076, 0x0008, 0x0041,
-	0x0008, 0x0208, 0x000b, 0xbbe0, 0x0009, 0x0032, 0x0000, 0x0dbd,
-	0x0003, 0x3c1e, 0x0008, 0x0208, 0x000b, 0xbbe0, 0x0009, 0x003b,
-	0x0000, 0x0dc2, 0x000b, 0x3c20, 0x0000, 0x0208, 0x000b, 0xbbe0,
-	0x0009, 0x0035, 0x0008, 0x0dc8, 0x000b, 0x8072, 0x0000, 0x8000,
-	0x0000, 0x0384, 0x000b, 0xbbe0, 0x0009, 0x0036, 0x0008, 0x0aa5,
-	0x000b, 0xbbe0, 0x0009, 0x0037, 0x0000, 0x0de9, 0x000b, 0x18fe,
-	0x0000, 0x3ce0, 0x0009, 0x0db5, 0x000b, 0x8076, 0x0008, 0x0040,
-	0x0000, 0x1a60, 0x0000, 0x8062, 0x0008, 0x000d, 0x0000, 0x2604,
-	0x0008, 0x2604, 0x0008, 0x2706, 0x0008, 0x2706, 0x0008, 0x2808,
-	0x0000, 0x2808, 0x0000, 0x290a, 0x0000, 0x290a, 0x0000, 0x8066,
-	0x0000, 0x0422, 0x0000, 0x45e0, 0x000b, 0x0210, 0x0004, 0x8054,
-	0x0008, 0x0004, 0x0000, 0x8074, 0x0000, 0xf000, 0x0008, 0x8072,
-	0x0000, 0xb000, 0x0000, 0x019c, 0x0003, 0xbbe0, 0x0009, 0x0038,
-	0x0000, 0x0dfb, 0x000b, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x09f8,
-	0x0003, 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x0db1, 0x0003, 0x020b,
-	0x0004, 0x8076, 0x0008, 0x0040, 0x0000, 0x8072, 0x0000, 0x8000,
-	0x0000, 0x0268, 0x000b, 0x8076, 0x0008, 0x0042, 0x0008, 0x0208,
-	0x000b, 0xbbe0, 0x0009, 0x0016, 0x0000, 0x0e08, 0x000b, 0x8074,
-	0x0000, 0x0808, 0x0008, 0x3a44, 0x0002, 0x0c0c, 0x000b, 0x8074,
-	0x0000, 0x0800, 0x0000, 0x8072, 0x0000, 0x8000, 0x0000, 0x8000,
-	0x000f, 0x000a, 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, 0x000a,
-	0x000b, 0x3d30, 0x000a, 0x7f00, 0x0000, 0xbc80, 0x0001, 0x0007,
-	0x0000, 0x0214, 0x0003, 0x1930, 0x000a, 0x7f00, 0x0000, 0x9880,
-	0x0001, 0x0007, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62,
-	0x0008, 0x8066, 0x0000, 0x000a, 0x0008, 0x4619, 0x000b, 0x4000,
-	0x000f, 0x221e, 0x000b, 0x0870, 0x0008, 0x4000, 0x000f, 0x7e1b,
-	0x000b, 0xbbe0, 0x0009, 0x0030, 0x0008, 0x0e1b, 0x0003, 0x18fe,
-	0x0000, 0x3ce0, 0x0009, 0x0a2c, 0x0003, 0x15fe, 0x0008, 0x3ce0,
-	0x0009, 0x0a2c, 0x0003, 0x020b, 0x0004, 0x8076, 0x0008, 0x0040,
-	0x0000, 0x022e, 0x0003, 0x8076, 0x0008, 0x0041, 0x0008, 0x8072,
-	0x0000, 0x8000, 0x0000, 0x021b, 0x0003, 0xbac0, 0x0009, 0x0090,
-	0x0008, 0x0a37, 0x0003, 0x8074, 0x0000, 0x0706, 0x0000, 0x0239,
-	0x0003, 0x8074, 0x0000, 0x0703, 0x0000, 0x4000, 0x000f, 0x8010,
-	0x0008, 0x0023, 0x0000, 0x0276, 0x000b, 0x8010, 0x0008, 0x0008,
-	0x0000, 0x0276, 0x000b, 0x8010, 0x0008, 0x0022, 0x0008, 0x0276,
-	0x000b, 0x0210, 0x0004, 0x8010, 0x0008, 0x0007, 0x0000, 0x021b,
-	0x000c, 0x1810, 0x0000, 0x021b, 0x000c, 0x0282, 0x0003, 0x0210,
-	0x0004, 0x8010, 0x0008, 0x001b, 0x0008, 0x021b, 0x000c, 0x1810,
-	0x0000, 0x021b, 0x000c, 0x8074, 0x0000, 0xf080, 0x0000, 0x8072,
-	0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, 0x000a, 0x000b, 0x8010,
-	0x0008, 0x0009, 0x0008, 0x0276, 0x000b, 0x8010, 0x0008, 0x0005,
-	0x0008, 0x0276, 0x000b, 0x1648, 0x000a, 0x0c6f, 0x000b, 0x808c,
-	0x0008, 0x0001, 0x0000, 0x8010, 0x0008, 0x0004, 0x0000, 0x4143,
-	0x000a, 0x086f, 0x0003, 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x0d2a,
-	0x0008, 0x0276, 0x000b, 0x8010, 0x0008, 0x0003, 0x0008, 0x027a,
-	0x000b, 0x8010, 0x0008, 0x000b, 0x0000, 0x027a, 0x000b, 0x8010,
-	0x0008, 0x0002, 0x0000, 0x027a, 0x000b, 0x3a47, 0x0002, 0x0d40,
-	0x000b, 0x8010, 0x0008, 0x0006, 0x0008, 0x027a, 0x000b, 0x8074,
-	0x0000, 0xf000, 0x0008, 0x8072, 0x0000, 0x3000, 0x0008, 0x021b,
-	0x000c, 0x0231, 0x0004, 0x3a40, 0x000a, 0x080a, 0x0003, 0x8010,
-	0x0008, 0x000c, 0x0008, 0x021b, 0x000c, 0x000a, 0x000b, 0x8074,
-	0x0000, 0xf080, 0x0000, 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30,
-	0x0000, 0x2e4d, 0x0002, 0x2e4d, 0x0002, 0x0a8d, 0x000b, 0x8054,
-	0x0008, 0x0019, 0x0000, 0x000a, 0x000b, 0x8054, 0x0008, 0x0009,
-	0x0008, 0x000a, 0x000b, 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x026b,
-	0x000b, 0x808c, 0x0008, 0x0000, 0x0008, 0x4447, 0x0002, 0x0ab9,
-	0x0003, 0xc0c0, 0x0001, 0x00ff, 0x0008, 0xffe0, 0x0009, 0x00ff,
-	0x0008, 0x0e90, 0x0003, 0xc1e0, 0x0001, 0xffff, 0x0008, 0x0e90,
-	0x0003, 0x8010, 0x0008, 0x0013, 0x0000, 0x021b, 0x000c, 0x8074,
-	0x0000, 0x0202, 0x0008, 0x000a, 0x000b, 0x3a40, 0x000a, 0x0eb6,
-	0x000b, 0x8074, 0x0000, 0x0200, 0x0000, 0x3d00, 0x0000, 0x3cfe,
-	0x0000, 0x8072, 0x0000, 0x8000, 0x0000, 0x43e0, 0x0001, 0x0eb4,
-	0x0003, 0x42fe, 0x0000, 0xffc0, 0x0001, 0x00ff, 0x0008, 0x00e0,
-	0x0009, 0x0a90, 0x000b, 0x0d08, 0x0008, 0x0309, 0x000b, 0x8072,
-	0x0000, 0x8000, 0x0000, 0x000a, 0x000b, 0x038d, 0x0004, 0x808c,
-	0x0008, 0x0001, 0x0000, 0x04fe, 0x0008, 0x3370, 0x0003, 0x0460,
-	0x0000, 0x8062, 0x0008, 0x0001, 0x0000, 0x8066, 0x0000, 0x0009,
-	0x0008, 0x46c3, 0x0003, 0x0004, 0x0000, 0x80c0, 0x0009, 0x00ff,
-	0x0008, 0x7f00, 0x0000, 0x80e0, 0x0001, 0x0004, 0x0000, 0x0add,
-	0x000b, 0x80e0, 0x0001, 0x0005, 0x0008, 0x0add, 0x000b, 0x80e0,
-	0x0001, 0x0006, 0x0008, 0x0add, 0x000b, 0x82c0, 0x0001, 0xff00,
-	0x0008, 0x7f04, 0x0008, 0x82e0, 0x0009, 0x0600, 0x0008, 0x0add,
-	0x000b, 0x82e0, 0x0009, 0x0500, 0x0008, 0x0add, 0x000b, 0x82e0,
-	0x0009, 0x0400, 0x0000, 0x0f70, 0x0003, 0xc4c0, 0x0009, 0x7000,
-	0x0000, 0xffe0, 0x0009, 0x1000, 0x0000, 0x0b09, 0x0003, 0x037e,
-	0x0004, 0x3941, 0x0002, 0x0ae8, 0x000b, 0x8072, 0x0000, 0x0400,
-	0x0000, 0x000a, 0x000b, 0x0460, 0x0000, 0x80fe, 0x0008, 0x002b,
-	0x0008, 0x7f62, 0x0008, 0x8066, 0x0000, 0x2209, 0x0008, 0x46ee,
-	0x0003, 0x11fe, 0x0000, 0x3304, 0x0003, 0x9180, 0x0001, 0x0002,
+	0x080c, 0xbe03, 0x009e, 0x015e, 0x003e, 0x002e, 0x001e, 0x000e,
+	0x00be, 0x0005, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x0056,
+	0x0046, 0x0026, 0x0126, 0x2091, 0x8000, 0x2740, 0x2029, 0x19f0,
+	0x252c, 0x2021, 0x19f6, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800,
+	0x7654, 0x7074, 0x81ff, 0x0150, 0x0006, 0x9186, 0x1ab0, 0x000e,
+	0x0128, 0x8001, 0x9602, 0x1a04, 0xe367, 0x0018, 0x9606, 0x0904,
+	0xe367, 0x080c, 0x8958, 0x0904, 0xe35e, 0x2100, 0x9c06, 0x0904,
+	0xe35e, 0x080c, 0xe5ce, 0x1904, 0xe35e, 0x080c, 0xe96c, 0x0904,
+	0xe35e, 0x080c, 0xe5be, 0x0904, 0xe35e, 0x6720, 0x9786, 0x0001,
+	0x1148, 0x080c, 0x330d, 0x0904, 0xe3a6, 0x6004, 0x9086, 0x0000,
+	0x1904, 0xe3a6, 0x9786, 0x0004, 0x0904, 0xe3a6, 0x9786, 0x0007,
+	0x0904, 0xe35e, 0x2500, 0x9c06, 0x0904, 0xe35e, 0x2400, 0x9c06,
+	0x05e8, 0x88ff, 0x0118, 0x6054, 0x9906, 0x15c0, 0x0096, 0x6000,
+	0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1a5e, 0x001e, 0x9786,
+	0x000a, 0x0148, 0x080c, 0xcd21, 0x1130, 0x080c, 0xb7f9, 0x009e,
+	0x080c, 0xae78, 0x0418, 0x6014, 0x2048, 0x080c, 0xcb1b, 0x01d8,
+	0x9786, 0x0003, 0x1570, 0xa867, 0x0103, 0xa87c, 0xd0cc, 0x0130,
+	0x0096, 0xa878, 0x2048, 0x080c, 0x0fb1, 0x009e, 0xab7a, 0xa877,
+	0x0000, 0x080c, 0xe8e7, 0x0016, 0x080c, 0xce0a, 0x080c, 0x6c6d,
+	0x001e, 0x080c, 0xcd04, 0x009e, 0x080c, 0xae78, 0x9ce0, 0x0018,
+	0x2001, 0x181a, 0x2004, 0x9c02, 0x1210, 0x0804, 0xe2de, 0x012e,
+	0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee,
+	0x0005, 0x9786, 0x0006, 0x1150, 0x9386, 0x0005, 0x0128, 0x080c,
+	0xe8e7, 0x080c, 0xe530, 0x08f8, 0x009e, 0x0c00, 0x9786, 0x0009,
+	0x11f8, 0x6000, 0x9086, 0x0004, 0x01c0, 0x6000, 0x9086, 0x0003,
+	0x11a0, 0x080c, 0x9614, 0x0096, 0x6114, 0x2148, 0x080c, 0xcb1b,
+	0x0118, 0x6010, 0x080c, 0x6c79, 0x009e, 0x00c6, 0x080c, 0xae47,
+	0x00ce, 0x0036, 0x080c, 0x9790, 0x003e, 0x009e, 0x0804, 0xe35e,
+	0x9786, 0x000a, 0x0904, 0xe345, 0x0804, 0xe343, 0x81ff, 0x0904,
+	0xe35e, 0x9180, 0x0001, 0x2004, 0x9086, 0x0018, 0x0138, 0x9180,
+	0x0001, 0x2004, 0x9086, 0x002d, 0x1904, 0xe35e, 0x6000, 0x9086,
+	0x0002, 0x1904, 0xe35e, 0x080c, 0xcd10, 0x0138, 0x080c, 0xcd21,
+	0x1904, 0xe35e, 0x080c, 0xb7f9, 0x0038, 0x080c, 0x31e1, 0x080c,
+	0xcd21, 0x1110, 0x080c, 0xb7f9, 0x080c, 0xae78, 0x0804, 0xe35e,
+	0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x0005, 0x00c6, 0x00e6,
+	0x0016, 0x2c08, 0x2170, 0x9006, 0x080c, 0xe557, 0x001e, 0x0120,
+	0x6020, 0x9084, 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005, 0xe3f5,
+	0xe3f5, 0xe3f5, 0xe3f5, 0xe3f5, 0xe3f5, 0xe3f7, 0xe3f5, 0xe3f5,
+	0xe3f5, 0xe3f5, 0xae78, 0xae78, 0xe3f5, 0x9006, 0x0005, 0x0036,
+	0x0046, 0x0016, 0x7010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00,
+	0x2009, 0x0020, 0x080c, 0xe58d, 0x001e, 0x004e, 0x2019, 0x0002,
+	0x080c, 0xe115, 0x003e, 0x9085, 0x0001, 0x0005, 0x0096, 0x080c,
+	0xcb1b, 0x0140, 0x6014, 0x904d, 0x080c, 0xc74e, 0x687b, 0x0005,
+	0x080c, 0x6c79, 0x009e, 0x080c, 0xae78, 0x9085, 0x0001, 0x0005,
+	0x2001, 0x0001, 0x080c, 0x653c, 0x0156, 0x0016, 0x0026, 0x0036,
+	0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0276, 0x080c, 0xbdef,
+	0x003e, 0x002e, 0x001e, 0x015e, 0x9005, 0x0005, 0x00f6, 0x00e6,
+	0x00c6, 0x0086, 0x0076, 0x0066, 0x00b6, 0x0126, 0x2091, 0x8000,
+	0x2740, 0x2061, 0x1cd0, 0x2079, 0x0001, 0x8fff, 0x0904, 0xe490,
+	0x2071, 0x1800, 0x7654, 0x7074, 0x8001, 0x9602, 0x1a04, 0xe490,
+	0x88ff, 0x0120, 0x2800, 0x9c06, 0x1590, 0x2078, 0x080c, 0xe5be,
+	0x0570, 0x2400, 0x9c06, 0x0558, 0x6720, 0x9786, 0x0006, 0x1538,
+	0x9786, 0x0007, 0x0520, 0x88ff, 0x1140, 0x6010, 0x9b06, 0x11f8,
+	0x85ff, 0x0118, 0x6054, 0x9106, 0x11d0, 0x0096, 0x601c, 0xd084,
+	0x0140, 0x080c, 0xe7ea, 0x080c, 0xd22e, 0x080c, 0x1a5e, 0x6023,
+	0x0007, 0x6014, 0x2048, 0x080c, 0xcb1b, 0x0120, 0x0046, 0x080c,
+	0xe530, 0x004e, 0x009e, 0x080c, 0xae78, 0x88ff, 0x1198, 0x9ce0,
+	0x0018, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1210, 0x0804, 0xe445,
+	0x9006, 0x012e, 0x00be, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee,
+	0x00fe, 0x0005, 0x98c5, 0x0001, 0x0ca0, 0x00b6, 0x0076, 0x0056,
+	0x0086, 0x9046, 0x2029, 0x0001, 0x2c20, 0x2019, 0x0002, 0x6210,
+	0x2258, 0x0096, 0x904e, 0x080c, 0xa682, 0x009e, 0x008e, 0x903e,
+	0x080c, 0xa72d, 0x080c, 0xe436, 0x005e, 0x007e, 0x00be, 0x0005,
+	0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x2128,
+	0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, 0x080c, 0x6600, 0x1190,
+	0x0056, 0x0086, 0x9046, 0x2508, 0x2029, 0x0001, 0x0096, 0x904e,
+	0x080c, 0xa682, 0x009e, 0x008e, 0x903e, 0x080c, 0xa72d, 0x080c,
+	0xe436, 0x005e, 0x003e, 0x001e, 0x8108, 0x1f04, 0xe4c3, 0x015e,
+	0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x0005, 0x00b6, 0x0076,
+	0x0056, 0x6210, 0x2258, 0x0086, 0x9046, 0x2029, 0x0001, 0x2019,
+	0x0048, 0x0096, 0x904e, 0x080c, 0xa682, 0x009e, 0x008e, 0x903e,
+	0x080c, 0xa72d, 0x2c20, 0x080c, 0xe436, 0x005e, 0x007e, 0x00be,
+	0x0005, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20,
+	0x20a9, 0x0800, 0x900e, 0x0016, 0x0036, 0x080c, 0x6600, 0x11a0,
+	0x0086, 0x9046, 0x2828, 0x0046, 0x2021, 0x0001, 0x080c, 0xe7ce,
+	0x004e, 0x0096, 0x904e, 0x080c, 0xa682, 0x009e, 0x008e, 0x903e,
+	0x080c, 0xa72d, 0x080c, 0xe436, 0x003e, 0x001e, 0x8108, 0x1f04,
+	0xe50b, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x0005,
+	0x0016, 0x00f6, 0x080c, 0xcb19, 0x0198, 0xa864, 0x9084, 0x00ff,
+	0x9086, 0x0046, 0x0180, 0xa800, 0x907d, 0x0138, 0xa803, 0x0000,
+	0xab82, 0x080c, 0x6c79, 0x2f48, 0x0cb0, 0xab82, 0x080c, 0x6c79,
+	0x00fe, 0x001e, 0x0005, 0xa800, 0x907d, 0x0130, 0xa803, 0x0000,
+	0x080c, 0x6c79, 0x2f48, 0x0cb8, 0x080c, 0x6c79, 0x0c88, 0x00e6,
+	0x0046, 0x0036, 0x2061, 0x1cd0, 0x9005, 0x1138, 0x2071, 0x1800,
+	0x7454, 0x7074, 0x8001, 0x9402, 0x12f8, 0x2100, 0x9c06, 0x0188,
+	0x6000, 0x9086, 0x0000, 0x0168, 0x6008, 0x9206, 0x1150, 0x6320,
+	0x9386, 0x0009, 0x01b0, 0x6010, 0x91a0, 0x0004, 0x2424, 0x9406,
+	0x0140, 0x9ce0, 0x0018, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1220,
+	0x0c20, 0x9085, 0x0001, 0x0008, 0x9006, 0x003e, 0x004e, 0x00ee,
+	0x0005, 0x631c, 0xd3c4, 0x1d68, 0x0c30, 0x0096, 0x0006, 0x080c,
+	0x0fff, 0x000e, 0x090c, 0x0dd5, 0xaae2, 0xa867, 0x010d, 0xa88e,
+	0x0026, 0x2010, 0x080c, 0xcb09, 0x2001, 0x0000, 0x0120, 0x2200,
+	0x9080, 0x0015, 0x2004, 0x002e, 0xa87a, 0x9186, 0x0020, 0x0110,
+	0xa8e3, 0xffff, 0xa986, 0xac76, 0xa87f, 0x0000, 0x2001, 0x198e,
+	0x2004, 0xa882, 0x9006, 0xa802, 0xa86a, 0xa88a, 0x0126, 0x2091,
+	0x8000, 0x080c, 0x6c79, 0x012e, 0x009e, 0x0005, 0x6700, 0x9786,
+	0x0000, 0x0158, 0x9786, 0x0001, 0x0140, 0x9786, 0x000a, 0x0128,
+	0x9786, 0x0009, 0x0110, 0x9085, 0x0001, 0x0005, 0x00e6, 0x6010,
+	0x9075, 0x0138, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x9206, 0x00ee,
+	0x0005, 0x9085, 0x0001, 0x0cd8, 0x0016, 0x6004, 0x908e, 0x001e,
+	0x11a0, 0x8007, 0x6134, 0x918c, 0x00ff, 0x9105, 0x6036, 0x6007,
+	0x0085, 0x6003, 0x000b, 0x6023, 0x0005, 0x2001, 0x1987, 0x2004,
+	0x601a, 0x080c, 0x90c7, 0x080c, 0x9664, 0x001e, 0x0005, 0xa001,
+	0xa001, 0x0005, 0x6024, 0xd0e4, 0x0158, 0xd0cc, 0x0118, 0x080c,
+	0xce4e, 0x0030, 0x080c, 0xe7ea, 0x080c, 0x8689, 0x080c, 0xae47,
+	0x0005, 0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xe61d,
+	0xe61d, 0xe61d, 0xe61f, 0xe61d, 0xe61f, 0xe61f, 0xe61d, 0xe61f,
+	0xe61d, 0xe61d, 0xe61d, 0xe61d, 0xe61d, 0x9006, 0x0005, 0x9085,
+	0x0001, 0x0005, 0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002,
+	0xe636, 0xe636, 0xe636, 0xe636, 0xe636, 0xe636, 0xe643, 0xe636,
+	0xe636, 0xe636, 0xe636, 0xe636, 0xe636, 0xe636, 0x6007, 0x003b,
+	0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, 0x0001, 0x080c, 0x90c7,
+	0x080c, 0x9664, 0x0005, 0x0096, 0x00c6, 0x2260, 0x080c, 0xe7ea,
+	0x6043, 0x0000, 0x6024, 0xc0f4, 0xc0e4, 0x6026, 0x603b, 0x0000,
+	0x00ce, 0x00d6, 0x2268, 0x9186, 0x0007, 0x1904, 0xe69c, 0x6814,
+	0x9005, 0x0138, 0x2048, 0xa87c, 0xd0fc, 0x1118, 0x00de, 0x009e,
+	0x08a8, 0x6007, 0x003a, 0x6003, 0x0001, 0x080c, 0x90c7, 0x080c,
+	0x9664, 0x00c6, 0x2d60, 0x6100, 0x9186, 0x0002, 0x1904, 0xe713,
+	0x6014, 0x9005, 0x1138, 0x6000, 0x9086, 0x0007, 0x190c, 0x0dd5,
+	0x0804, 0xe713, 0x2048, 0x080c, 0xcb1b, 0x1130, 0x0028, 0x2048,
+	0xa800, 0x9005, 0x1de0, 0x2900, 0x2048, 0xa87c, 0x9084, 0x0003,
+	0x9086, 0x0002, 0x1168, 0xa87c, 0xc0dc, 0xc0f4, 0xa87e, 0xa880,
+	0xc0fc, 0xa882, 0x2009, 0x0043, 0x080c, 0xdf6e, 0x0804, 0xe713,
+	0x2009, 0x0041, 0x0804, 0xe70d, 0x9186, 0x0005, 0x15a0, 0x6814,
+	0x2048, 0xa87c, 0xd0bc, 0x1120, 0x00de, 0x009e, 0x0804, 0xe636,
+	0xd0b4, 0x0128, 0xd0fc, 0x090c, 0x0dd5, 0x0804, 0xe657, 0x6007,
+	0x003a, 0x6003, 0x0001, 0x080c, 0x90c7, 0x080c, 0x9664, 0x00c6,
+	0x2d60, 0x6100, 0x9186, 0x0002, 0x0120, 0x9186, 0x0004, 0x1904,
+	0xe713, 0x6814, 0x2048, 0xa97c, 0xc1f4, 0xc1dc, 0xa97e, 0xa980,
+	0xc1fc, 0xc1bc, 0xa982, 0x00f6, 0x2c78, 0x080c, 0x1725, 0x00fe,
+	0x2009, 0x0042, 0x04d0, 0x0036, 0x080c, 0x0fff, 0x090c, 0x0dd5,
+	0xa867, 0x010d, 0x9006, 0xa802, 0xa86a, 0xa88a, 0x2d18, 0xab8e,
+	0xa887, 0x0045, 0x2c00, 0xa892, 0x6038, 0xa8a2, 0x2360, 0x6024,
+	0xc0dd, 0x6026, 0x6010, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x2004,
+	0x6354, 0xab7a, 0xa876, 0x9006, 0xa87e, 0xa882, 0xad9a, 0xae96,
+	0xa89f, 0x0001, 0x080c, 0x6c79, 0x2019, 0x0045, 0x6008, 0x2068,
+	0x080c, 0xe115, 0x2d00, 0x600a, 0x6023, 0x0006, 0x6003, 0x0007,
+	0x901e, 0x631a, 0x6342, 0x003e, 0x0038, 0x6043, 0x0000, 0x6003,
+	0x0007, 0x080c, 0xdf6e, 0x00ce, 0x00de, 0x009e, 0x0005, 0x9186,
+	0x0013, 0x1128, 0x6004, 0x9082, 0x0085, 0x2008, 0x00c2, 0x9186,
+	0x0027, 0x1178, 0x080c, 0x955f, 0x0036, 0x0096, 0x6014, 0x2048,
+	0x2019, 0x0004, 0x080c, 0xe530, 0x009e, 0x003e, 0x080c, 0x9664,
+	0x0005, 0x9186, 0x0014, 0x0d70, 0x080c, 0xaedd, 0x0005, 0xe746,
+	0xe744, 0xe744, 0xe744, 0xe744, 0xe744, 0xe746, 0xe744, 0xe744,
+	0xe744, 0xe744, 0xe744, 0xe744, 0x080c, 0x0dd5, 0x080c, 0x955f,
+	0x6003, 0x000c, 0x080c, 0x9664, 0x0005, 0x9182, 0x0092, 0x1220,
+	0x9182, 0x0085, 0x0208, 0x001a, 0x080c, 0xaedd, 0x0005, 0xe764,
+	0xe764, 0xe764, 0xe764, 0xe766, 0xe786, 0xe764, 0xe764, 0xe764,
+	0xe764, 0xe764, 0xe764, 0xe764, 0x080c, 0x0dd5, 0x00d6, 0x2c68,
+	0x080c, 0xadf1, 0x01b0, 0x6003, 0x0001, 0x6007, 0x001e, 0x2009,
+	0x026e, 0x210c, 0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x600b,
+	0xffff, 0x6910, 0x6112, 0x6023, 0x0004, 0x080c, 0x90c7, 0x080c,
+	0x9664, 0x2d60, 0x080c, 0xae47, 0x00de, 0x0005, 0x080c, 0xae47,
+	0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ec,
+	0x00ee, 0x0005, 0x2009, 0x1867, 0x210c, 0xd1ec, 0x05b0, 0x6003,
+	0x0002, 0x6024, 0xc0e5, 0x6026, 0xd0cc, 0x0150, 0x2001, 0x1988,
+	0x2004, 0x6042, 0x2009, 0x1867, 0x210c, 0xd1f4, 0x1520, 0x00a0,
+	0x2009, 0x1867, 0x210c, 0xd1f4, 0x0128, 0x6024, 0xc0e4, 0x6026,
+	0x9006, 0x00d8, 0x2001, 0x1988, 0x200c, 0x2001, 0x1986, 0x2004,
+	0x9100, 0x9080, 0x000a, 0x6042, 0x6010, 0x00b6, 0x2058, 0xb8bc,
+	0x00be, 0x0008, 0x2104, 0x9005, 0x0118, 0x9088, 0x0003, 0x0cd0,
+	0x2c0a, 0x600f, 0x0000, 0x9085, 0x0001, 0x0005, 0x0016, 0x00c6,
+	0x00e6, 0x6154, 0xb8bc, 0x2060, 0x8cff, 0x0180, 0x84ff, 0x1118,
+	0x6054, 0x9106, 0x1138, 0x600c, 0x2072, 0x080c, 0x8689, 0x080c,
+	0xae47, 0x0010, 0x9cf0, 0x0003, 0x2e64, 0x0c70, 0x00ee, 0x00ce,
+	0x001e, 0x0005, 0x00d6, 0x00b6, 0x6010, 0x2058, 0xb8bc, 0x2068,
+	0x9005, 0x0130, 0x9c06, 0x0110, 0x680c, 0x0cd0, 0x600c, 0x680e,
+	0x00be, 0x00de, 0x0005, 0x0026, 0x0036, 0x0156, 0x2011, 0x182c,
+	0x2204, 0x9084, 0x00ff, 0x2019, 0x026e, 0x2334, 0x9636, 0x1508,
+	0x8318, 0x2334, 0x2204, 0x9084, 0xff00, 0x9636, 0x11d0, 0x2011,
+	0x0270, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x000a,
+	0x080c, 0xbe03, 0x009e, 0x1168, 0x2011, 0x0274, 0x20a9, 0x0004,
+	0x6010, 0x0096, 0x2048, 0x2019, 0x0006, 0x080c, 0xbe03, 0x009e,
+	0x1100, 0x015e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x2071, 0x1800,
+	0x080c, 0x5fae, 0x080c, 0x2f96, 0x00ee, 0x0005, 0x0096, 0x0026,
+	0x080c, 0x0fff, 0x090c, 0x0dd5, 0xa85c, 0x9080, 0x001a, 0x20a0,
+	0x20a9, 0x000c, 0xa860, 0x20e8, 0x9006, 0x4004, 0x9186, 0x0046,
+	0x1118, 0xa867, 0x0136, 0x0038, 0xa867, 0x0138, 0x9186, 0x0041,
+	0x0110, 0xa87b, 0x0001, 0x7038, 0x9084, 0xff00, 0x7240, 0x9294,
+	0xff00, 0x8007, 0x9215, 0xaa9a, 0x9186, 0x0046, 0x1168, 0x7038,
+	0x9084, 0x00ff, 0x723c, 0x9294, 0xff00, 0x9215, 0xaa9e, 0x723c,
+	0x9294, 0x00ff, 0xaaa2, 0x0060, 0x7040, 0x9084, 0x00ff, 0x7244,
+	0x9294, 0xff00, 0x9215, 0xaa9e, 0x7244, 0x9294, 0x00ff, 0xaaa2,
+	0x9186, 0x0046, 0x1118, 0x9e90, 0x0012, 0x0010, 0x9e90, 0x001a,
+	0x2204, 0x8007, 0xa8a6, 0x8210, 0x2204, 0x8007, 0xa8aa, 0x8210,
+	0x2204, 0x8007, 0xa8ae, 0x8210, 0x2204, 0x8007, 0xa8b2, 0x8210,
+	0x9186, 0x0046, 0x11b8, 0x9e90, 0x0016, 0x2204, 0x8007, 0xa8b6,
+	0x8210, 0x2204, 0x8007, 0xa8ba, 0x8210, 0x2204, 0x8007, 0xa8be,
+	0x8210, 0x2204, 0x8007, 0xa8c2, 0x8210, 0x2011, 0x0205, 0x2013,
+	0x0001, 0x00b0, 0x9e90, 0x001e, 0x2204, 0x8007, 0xa8b6, 0x8210,
+	0x2204, 0x8007, 0xa8ba, 0x2011, 0x0205, 0x2013, 0x0001, 0x2011,
+	0x0260, 0x2204, 0x8007, 0xa8be, 0x8210, 0x2204, 0x8007, 0xa8c2,
+	0x9186, 0x0046, 0x1118, 0x2011, 0x0262, 0x0010, 0x2011, 0x026a,
+	0x0146, 0x01d6, 0x0036, 0x20a9, 0x0001, 0x2019, 0x0008, 0xa860,
+	0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0x2204, 0x8007, 0x4004,
+	0x8210, 0x8319, 0x1dd0, 0x003e, 0x01ce, 0x013e, 0x2011, 0x0205,
+	0x2013, 0x0000, 0x002e, 0x080c, 0x6c79, 0x009e, 0x0005, 0x00e6,
+	0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0fc, 0x0108, 0x0011,
+	0x00ee, 0x0005, 0xa880, 0xc0e5, 0xa882, 0x0005, 0x00e6, 0x00d6,
+	0x00c6, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0016, 0x0126,
+	0x2091, 0x8000, 0x2029, 0x19f0, 0x252c, 0x2021, 0x19f6, 0x2424,
+	0x2061, 0x1cd0, 0x2071, 0x1800, 0x7654, 0x7074, 0x9606, 0x0578,
+	0x6720, 0x9786, 0x0001, 0x0118, 0x9786, 0x0008, 0x1500, 0x2500,
+	0x9c06, 0x01e8, 0x2400, 0x9c06, 0x01d0, 0x080c, 0xe5be, 0x01b8,
+	0x080c, 0xe5ce, 0x11a0, 0x6000, 0x9086, 0x0004, 0x1120, 0x0016,
+	0x080c, 0x1a5e, 0x001e, 0x080c, 0xcd10, 0x1110, 0x080c, 0x31e1,
+	0x080c, 0xcd21, 0x1110, 0x080c, 0xb7f9, 0x080c, 0xae78, 0x9ce0,
+	0x0018, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1208, 0x0858, 0x012e,
+	0x001e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x00ce, 0x00de,
+	0x00ee, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0dc, 0x0005, 0x0006,
+	0x2001, 0x1837, 0x2004, 0xd09c, 0x000e, 0x0005, 0x0006, 0x0036,
+	0x0046, 0x080c, 0xd216, 0x0168, 0x2019, 0xffff, 0x9005, 0x0128,
+	0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0004, 0x080c,
+	0x4cbc, 0x004e, 0x003e, 0x000e, 0x6004, 0x9086, 0x0001, 0x1128,
+	0x080c, 0xa7ee, 0x080c, 0xae78, 0x9006, 0x0005, 0x00e6, 0x00c6,
+	0x00b6, 0x0046, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x7454, 0x7074,
+	0x8001, 0x9402, 0x12b8, 0x2100, 0x9c06, 0x0148, 0x6000, 0x9086,
+	0x0000, 0x0128, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x0140, 0x9ce0,
+	0x0018, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1220, 0x0c60, 0x9085,
+	0x0001, 0x0008, 0x9006, 0x004e, 0x00be, 0x00ce, 0x00ee, 0x0005,
+	0x0126, 0x0006, 0x00e6, 0x0016, 0x2091, 0x8000, 0x2071, 0x1840,
+	0xd5a4, 0x0118, 0x7004, 0x8000, 0x7006, 0xd5b4, 0x0118, 0x7000,
+	0x8000, 0x7002, 0xd5ac, 0x0178, 0x2500, 0x9084, 0x0007, 0x908e,
+	0x0003, 0x0148, 0x908e, 0x0004, 0x0130, 0x908e, 0x0005, 0x0118,
+	0x2071, 0xfffe, 0x0089, 0x001e, 0x00ee, 0x000e, 0x012e, 0x0005,
+	0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0xfff6, 0x0021,
+	0x00ee, 0x000e, 0x012e, 0x0005, 0x2e05, 0x8000, 0x2077, 0x1220,
+	0x8e70, 0x2e05, 0x8000, 0x2077, 0x0005, 0x00e6, 0x2071, 0xfff4,
+	0x0c99, 0x00ee, 0x0005, 0x00e6, 0x2071, 0xfff8, 0x0c69, 0x00ee,
+	0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0x1840,
+	0x7014, 0x8000, 0x7016, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0003,
+	0x000b, 0x079e, 0x0000, 0xc000, 0x0001, 0x8064, 0x0008, 0x0010,
+	0x0000, 0x8066, 0x0000, 0x0101, 0x0008, 0x4407, 0x0003, 0x8060,
+	0x0000, 0x0400, 0x0000, 0x580d, 0x000b, 0x79a8, 0x000b, 0x50ee,
+	0x000b, 0x4c0a, 0x0003, 0xbac0, 0x0009, 0x008a, 0x0000, 0x0c0a,
+	0x000b, 0x15fe, 0x0008, 0x340a, 0x0003, 0xc4c0, 0x0009, 0x7000,
+	0x0000, 0xffa0, 0x0001, 0x2000, 0x0000, 0x1668, 0x000b, 0x808c,
+	0x0008, 0x0001, 0x0000, 0x0000, 0x0007, 0x4028, 0x0000, 0x4047,
+	0x000a, 0x808c, 0x0008, 0x0002, 0x0000, 0x0822, 0x0003, 0x4022,
+	0x0000, 0x0028, 0x000b, 0x4122, 0x0008, 0x94c0, 0x0009, 0xff00,
+	0x0008, 0xffe0, 0x0009, 0x0500, 0x0008, 0x0a93, 0x000b, 0x4447,
+	0x0002, 0x0e90, 0x0003, 0x0bfe, 0x0008, 0x11a0, 0x0001, 0x126e,
+	0x0003, 0x0ca0, 0x0001, 0x126e, 0x0003, 0x9180, 0x0001, 0x0004,
 	0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066,
-	0x0000, 0x0609, 0x0008, 0x46f8, 0x000b, 0x42fe, 0x0000, 0xffc0,
-	0x0001, 0xff00, 0x0008, 0x03e0, 0x0009, 0x0f01, 0x0003, 0x8072,
-	0x0000, 0x0400, 0x0000, 0x0046, 0x0003, 0x9180, 0x0001, 0x0003,
-	0x0008, 0x02eb, 0x0003, 0x8072, 0x0000, 0x0400, 0x0000, 0x8010,
-	0x0008, 0x0010, 0x0000, 0x0361, 0x0003, 0x037e, 0x0004, 0x3941,
-	0x0002, 0x0b0f, 0x0003, 0x8072, 0x0000, 0x0400, 0x0000, 0x000a,
-	0x000b, 0x0346, 0x000c, 0x11fe, 0x0000, 0x0f17, 0x000b, 0x8072,
-	0x0000, 0x0400, 0x0000, 0x8010, 0x0008, 0x000e, 0x0000, 0x0361,
-	0x0003, 0x8060, 0x0000, 0x0400, 0x0000, 0x04fe, 0x0008, 0x0f2c,
-	0x0003, 0x808c, 0x0008, 0x0000, 0x0008, 0x9180, 0x0001, 0x0005,
-	0x0008, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x4722,
-	0x000b, 0x0060, 0x0008, 0x8062, 0x0008, 0x001b, 0x0008, 0x4304,
-	0x0008, 0x4206, 0x0008, 0x8066, 0x0000, 0x0412, 0x0000, 0x472a,
-	0x0003, 0x0343, 0x0003, 0x808c, 0x0008, 0x0001, 0x0000, 0x0460,
-	0x0000, 0x8062, 0x0008, 0x002b, 0x0008, 0x8066, 0x0000, 0x0609,
-	0x0008, 0x4733, 0x000b, 0x8066, 0x0000, 0x220a, 0x0008, 0x4736,
-	0x000b, 0x42fe, 0x0000, 0xffc0, 0x0001, 0xff00, 0x0008, 0x7f04,
-	0x0008, 0x8060, 0x0000, 0x0400, 0x0000, 0x9180, 0x0001, 0x0002,
-	0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x041a, 0x0008, 0x4742,
-	0x000b, 0x8072, 0x0000, 0x0400, 0x0000, 0x0046, 0x0003, 0x8060,
-	0x0000, 0x0400, 0x0000, 0x1362, 0x0008, 0x8066, 0x0000, 0x0411,
-	0x0000, 0x474b, 0x000b, 0x02fe, 0x0008, 0x03e0, 0x0009, 0x0f51,
-	0x0003, 0x0d22, 0x0000, 0x4000, 0x000f, 0x8280, 0x0009, 0x0002,
-	0x0000, 0x1380, 0x0001, 0x7f62, 0x0008, 0x8066, 0x0000, 0x2209,
-	0x0008, 0x4757, 0x0003, 0x0200, 0x000a, 0xffc0, 0x0001, 0x0007,
-	0x0000, 0x7f06, 0x0000, 0x1362, 0x0008, 0x8066, 0x0000, 0x060a,
-	0x0008, 0x475f, 0x000b, 0x4000, 0x000f, 0x3a44, 0x0002, 0x0c0a,
-	0x000b, 0x2f44, 0x000a, 0x2f44, 0x000a, 0x0e6b, 0x000b, 0x808a,
-	0x0008, 0x0003, 0x0008, 0x8074, 0x0000, 0xf080, 0x0000, 0x8072,
-	0x0000, 0x3000, 0x0008, 0x5b6c, 0x0003, 0x8054, 0x0008, 0x0019,
-	0x0000, 0x000a, 0x000b, 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x808c,
-	0x0008, 0x0000, 0x0008, 0x8010, 0x0008, 0x0011, 0x0008, 0x021b,
-	0x000c, 0x42fe, 0x0000, 0xffc0, 0x0001, 0x00ff, 0x0008, 0x7f10,
-	0x0008, 0x021b, 0x000c, 0x4310, 0x0008, 0x027a, 0x000b, 0x3941,
-	0x0002, 0x0b81, 0x0003, 0x4000, 0x000f, 0x8072, 0x0000, 0x0404,
-	0x0008, 0x4000, 0x000f, 0x8010, 0x0008, 0x0012, 0x0008, 0x021b,
-	0x000c, 0x0346, 0x000c, 0x1110, 0x0000, 0x021b, 0x000c, 0x11fe,
-	0x0000, 0x0f87, 0x000b, 0x000a, 0x000b, 0xc2c0, 0x0009, 0x00ff,
-	0x0008, 0x7f00, 0x0000, 0xc3c0, 0x0001, 0xff00, 0x0008, 0x00d0,
-	0x0009, 0x0bb2, 0x0003, 0x0d0a, 0x0000, 0x8580, 0x0001, 0x1000,
-	0x0000, 0x7f62, 0x0008, 0x8060, 0x0000, 0x0400, 0x0000, 0x8066,
-	0x0000, 0x0809, 0x0000, 0x479c, 0x000b, 0x04fe, 0x0008, 0x33ab,
-	0x0003, 0x0460, 0x0000, 0x8062, 0x0008, 0x0004, 0x0000, 0x8066,
-	0x0000, 0x0211, 0x0000, 0x47a4, 0x0003, 0x01fe, 0x0008, 0x00e0,
-	0x0009, 0x0fab, 0x0003, 0x02fe, 0x0008, 0x43e0, 0x0001, 0x0bb1,
-	0x0003, 0x0500, 0x0002, 0x7f0a, 0x0000, 0xffe0, 0x0009, 0x0800,
-	0x0000, 0x0f95, 0x000b, 0x0d08, 0x0008, 0x4000, 0x000f, 0x43fe,
-	0x0008, 0x3e80, 0x0001, 0x0d60, 0x0000, 0x7f62, 0x0008, 0x8066,
-	0x0000, 0x0809, 0x0000, 0x47b8, 0x000b, 0x8060, 0x0000, 0x0400,
+	0x0000, 0x0009, 0x0008, 0x4436, 0x000b, 0x808c, 0x0008, 0x0000,
+	0x0008, 0x0060, 0x0008, 0x8062, 0x0008, 0x0004, 0x0000, 0x8066,
+	0x0000, 0x0411, 0x0000, 0x443e, 0x0003, 0x03fe, 0x0000, 0x43e0,
+	0x0001, 0x0e6b, 0x000b, 0xc2c0, 0x0009, 0x00ff, 0x0008, 0x02e0,
+	0x0001, 0x0e6b, 0x000b, 0x9180, 0x0001, 0x0005, 0x0008, 0x8060,
+	0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0019,
+	0x0000, 0x444d, 0x000b, 0x0240, 0x0002, 0x0a68, 0x0003, 0x00fe,
+	0x0000, 0x326b, 0x000b, 0x0248, 0x000a, 0x085c, 0x0003, 0x9180,
+	0x0001, 0x0006, 0x0008, 0x7f62, 0x0008, 0x8002, 0x0008, 0x0003,
+	0x0008, 0x8066, 0x0000, 0x020a, 0x0000, 0x445b, 0x0003, 0x112a,
+	0x0000, 0x002e, 0x0008, 0x022c, 0x0008, 0x3a44, 0x0002, 0x0c0a,
+	0x000b, 0x808c, 0x0008, 0x0002, 0x0000, 0x1760, 0x0008, 0x8062,
+	0x0008, 0x000f, 0x0008, 0x8066, 0x0000, 0x0011, 0x0008, 0x4468,
+	0x0003, 0x01fe, 0x0008, 0x42e0, 0x0009, 0x0e5c, 0x0003, 0x00fe,
+	0x0000, 0x43e0, 0x0001, 0x0e5c, 0x0003, 0x1734, 0x0000, 0x1530,
+	0x0000, 0x1632, 0x0008, 0x0d2a, 0x0008, 0x9880, 0x0001, 0x0010,
+	0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066,
+	0x0000, 0x1e0a, 0x0008, 0x447a, 0x0003, 0x808a, 0x0008, 0x0003,
+	0x0008, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0002, 0x0000, 0x5880,
+	0x000b, 0x8066, 0x0000, 0x3679, 0x0000, 0x4483, 0x0003, 0x5884,
+	0x0003, 0x3efe, 0x0008, 0x7f4f, 0x0002, 0x088a, 0x000b, 0x0d00,
+	0x0000, 0x0092, 0x000c, 0x8054, 0x0008, 0x0011, 0x0008, 0x8074,
+	0x0000, 0x1010, 0x0008, 0x1efe, 0x0000, 0x300a, 0x000b, 0x00c8,
+	0x000c, 0x000a, 0x000b, 0x00fe, 0x0000, 0x349a, 0x0003, 0x1a60,
+	0x0000, 0x8062, 0x0008, 0x0007, 0x0000, 0x8066, 0x0000, 0x0231,
+	0x0008, 0x4499, 0x000b, 0x03fe, 0x0000, 0x04d0, 0x0001, 0x0cc0,
+	0x000b, 0x82c0, 0x0001, 0x1f00, 0x0000, 0xffa0, 0x0001, 0x0400,
+	0x0000, 0x08af, 0x0003, 0x14c0, 0x000b, 0x01fe, 0x0008, 0x0580,
+	0x0009, 0x7f06, 0x0000, 0x02fe, 0x0008, 0xffc0, 0x0001, 0x00ff,
+	0x0008, 0x0690, 0x0001, 0x10af, 0x0003, 0x7f08, 0x0008, 0x84c0,
+	0x0001, 0xff00, 0x0008, 0x08c0, 0x0003, 0x00fe, 0x0000, 0x34b6,
+	0x000b, 0x8072, 0x0000, 0x1010, 0x0008, 0x3944, 0x0002, 0x08b1,
+	0x0003, 0x00ba, 0x0003, 0x8072, 0x0000, 0x2020, 0x0008, 0x3945,
+	0x000a, 0x08b6, 0x000b, 0x3946, 0x000a, 0x0cc7, 0x0003, 0x0000,
+	0x0007, 0x3943, 0x000a, 0x08c7, 0x000b, 0x00ba, 0x0003, 0x00fe,
+	0x0000, 0x34c5, 0x0003, 0x8072, 0x0000, 0x1000, 0x0000, 0x00c7,
+	0x0003, 0x8072, 0x0000, 0x2000, 0x0000, 0x4000, 0x000f, 0x1c60,
+	0x0000, 0x1b62, 0x0000, 0x8066, 0x0000, 0x0231, 0x0008, 0x44cc,
+	0x000b, 0x58cd, 0x000b, 0x0140, 0x0008, 0x0242, 0x0000, 0x1f43,
+	0x0002, 0x0cdb, 0x000b, 0x0d44, 0x0000, 0x0d46, 0x0008, 0x0348,
+	0x0008, 0x044a, 0x0008, 0x030a, 0x0008, 0x040c, 0x0000, 0x0d06,
+	0x0000, 0x0d08, 0x0008, 0x00df, 0x0003, 0x0344, 0x0008, 0x0446,
+	0x0008, 0x0548, 0x0008, 0x064a, 0x0000, 0x1948, 0x000a, 0x08e2,
+	0x0003, 0x0d4a, 0x0008, 0x58e2, 0x0003, 0x3efe, 0x0008, 0x7f4f,
+	0x0002, 0x08e9, 0x000b, 0x8000, 0x0000, 0x0001, 0x0000, 0x0092,
+	0x000c, 0x8054, 0x0008, 0x0001, 0x0000, 0x8074, 0x0000, 0x2020,
+	0x0008, 0x4000, 0x000f, 0x3a40, 0x000a, 0x0c0d, 0x0003, 0x2b24,
+	0x0008, 0x2b24, 0x0008, 0x58f2, 0x000b, 0x8054, 0x0008, 0x0002,
+	0x0000, 0x1242, 0x0002, 0x0940, 0x0003, 0x3a45, 0x000a, 0x092f,
+	0x0003, 0x8072, 0x0000, 0x1000, 0x0000, 0x3945, 0x000a, 0x08ff,
+	0x0003, 0x8072, 0x0000, 0x3010, 0x0000, 0x1e10, 0x000a, 0x7f3c,
+	0x0000, 0x092a, 0x0003, 0x1d00, 0x0002, 0x7f3a, 0x0000, 0x0d60,
+	0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x4508,
+	0x000b, 0x00fe, 0x0000, 0x3527, 0x000b, 0x1c60, 0x0000, 0x8062,
+	0x0008, 0x0001, 0x0000, 0x8066, 0x0000, 0x0009, 0x0008, 0x4510,
+	0x000b, 0x00fe, 0x0000, 0x3243, 0x000b, 0x0038, 0x0000, 0x0060,
+	0x0008, 0x8062, 0x0008, 0x0019, 0x0000, 0x8066, 0x0000, 0x0009,
+	0x0008, 0x4519, 0x000b, 0x80c0, 0x0009, 0x00ff, 0x0008, 0x7f3e,
+	0x0008, 0x0d60, 0x0000, 0x0efe, 0x0008, 0x1f80, 0x0001, 0x7f62,
+	0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x4523, 0x000b, 0x003a,
+	0x0008, 0x1dfe, 0x0000, 0x0104, 0x000b, 0x0036, 0x0008, 0x00c8,
+	0x000c, 0x0140, 0x000b, 0x8074, 0x0000, 0x2000, 0x0000, 0x8072,
+	0x0000, 0x2000, 0x0000, 0x0140, 0x000b, 0x3a44, 0x0002, 0x0a71,
+	0x000b, 0x8074, 0x0000, 0x1000, 0x0000, 0x8072, 0x0000, 0x1000,
+	0x0000, 0x2d0e, 0x0000, 0x2d0e, 0x0000, 0x3640, 0x0003, 0x26fe,
+	0x0008, 0x26fe, 0x0008, 0x2700, 0x0008, 0x2700, 0x0008, 0x00d0,
+	0x0009, 0x0d52, 0x000b, 0x8074, 0x0000, 0x4040, 0x0008, 0x5940,
+	0x0003, 0x50ee, 0x000b, 0x3a46, 0x000a, 0x0d52, 0x000b, 0x3a47,
+	0x0002, 0x094d, 0x000b, 0x8054, 0x0008, 0x0004, 0x0000, 0x8074,
+	0x0000, 0x8000, 0x0000, 0x8072, 0x0000, 0x3000, 0x0008, 0x019c,
+	0x0003, 0x92c0, 0x0009, 0x0fc8, 0x0000, 0x080a, 0x0003, 0x1246,
+	0x000a, 0x0e3a, 0x0003, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0002,
+	0x0000, 0x8066, 0x0000, 0x362a, 0x0000, 0x4557, 0x000b, 0x2000,
+	0x0000, 0x2000, 0x0000, 0x2102, 0x0000, 0x2102, 0x0000, 0x2204,
+	0x0000, 0x2204, 0x0000, 0x2306, 0x0000, 0x2306, 0x0000, 0x2408,
+	0x0000, 0x2408, 0x0000, 0x250a, 0x0000, 0x250a, 0x0000, 0x260c,
+	0x0000, 0x260c, 0x0000, 0x270e, 0x0000, 0x270e, 0x0000, 0x2810,
+	0x0000, 0x2810, 0x0000, 0x2912, 0x0000, 0x2912, 0x0000, 0x1a60,
+	0x0000, 0x8062, 0x0008, 0x0007, 0x0000, 0x8066, 0x0000, 0x0052,
+	0x0000, 0x4571, 0x0003, 0x92c0, 0x0009, 0x0780, 0x0008, 0x0e56,
+	0x0003, 0x124b, 0x0002, 0x097a, 0x0003, 0x2e4d, 0x0002, 0x2e4d,
+	0x0002, 0x0a40, 0x0003, 0x3a46, 0x000a, 0x0d8a, 0x000b, 0x597c,
+	0x0003, 0x8054, 0x0008, 0x0004, 0x0000, 0x1243, 0x000a, 0x0998,
+	0x0003, 0x8010, 0x0008, 0x000d, 0x0000, 0x021b, 0x000c, 0x1948,
+	0x000a, 0x0987, 0x000b, 0x0210, 0x0004, 0x1810, 0x0000, 0x021b,
+	0x000c, 0x0198, 0x000b, 0x1948, 0x000a, 0x098e, 0x000b, 0x1243,
+	0x000a, 0x0a43, 0x0003, 0x194d, 0x000a, 0x0992, 0x0003, 0x1243,
+	0x000a, 0x0a4a, 0x0003, 0x5992, 0x0003, 0x8054, 0x0008, 0x0004,
+	0x0000, 0x0210, 0x0004, 0x1810, 0x0000, 0x021b, 0x000c, 0x8074,
+	0x0000, 0xf000, 0x0008, 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30,
+	0x0000, 0x3a42, 0x0002, 0x0da2, 0x000b, 0x15fe, 0x0008, 0x3461,
+	0x000b, 0x000a, 0x000b, 0x8074, 0x0000, 0x0501, 0x0000, 0x8010,
+	0x0008, 0x000c, 0x0008, 0x021b, 0x000c, 0x000a, 0x000b, 0xbbe0,
+	0x0009, 0x0030, 0x0008, 0x0db8, 0x0003, 0x18fe, 0x0000, 0x3ce0,
+	0x0009, 0x09b5, 0x0003, 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x09b5,
+	0x0003, 0x020b, 0x0004, 0x8076, 0x0008, 0x0040, 0x0000, 0x0208,
+	0x000b, 0x8076, 0x0008, 0x0041, 0x0008, 0x0208, 0x000b, 0xbbe0,
+	0x0009, 0x0032, 0x0000, 0x0dbd, 0x0003, 0x3c1e, 0x0008, 0x0208,
+	0x000b, 0xbbe0, 0x0009, 0x003b, 0x0000, 0x0dc2, 0x000b, 0x3c20,
+	0x0000, 0x0208, 0x000b, 0xbbe0, 0x0009, 0x0035, 0x0008, 0x0dc8,
+	0x000b, 0x8072, 0x0000, 0x8000, 0x0000, 0x0384, 0x000b, 0xbbe0,
+	0x0009, 0x0036, 0x0008, 0x0aa5, 0x000b, 0xbbe0, 0x0009, 0x0037,
+	0x0000, 0x0de9, 0x000b, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x0db5,
+	0x000b, 0x8076, 0x0008, 0x0040, 0x0000, 0x1a60, 0x0000, 0x8062,
+	0x0008, 0x000d, 0x0000, 0x2604, 0x0008, 0x2604, 0x0008, 0x2706,
+	0x0008, 0x2706, 0x0008, 0x2808, 0x0000, 0x2808, 0x0000, 0x290a,
+	0x0000, 0x290a, 0x0000, 0x8066, 0x0000, 0x0422, 0x0000, 0x45e0,
+	0x000b, 0x0210, 0x0004, 0x8054, 0x0008, 0x0004, 0x0000, 0x8074,
+	0x0000, 0xf000, 0x0008, 0x8072, 0x0000, 0xb000, 0x0000, 0x019c,
+	0x0003, 0xbbe0, 0x0009, 0x0038, 0x0000, 0x0dfb, 0x000b, 0x18fe,
+	0x0000, 0x3ce0, 0x0009, 0x09f8, 0x0003, 0x15fe, 0x0008, 0x3ce0,
+	0x0009, 0x0db1, 0x0003, 0x020b, 0x0004, 0x8076, 0x0008, 0x0040,
+	0x0000, 0x8072, 0x0000, 0x8000, 0x0000, 0x0268, 0x000b, 0x8076,
+	0x0008, 0x0042, 0x0008, 0x0208, 0x000b, 0xbbe0, 0x0009, 0x0016,
+	0x0000, 0x0e08, 0x000b, 0x8074, 0x0000, 0x0808, 0x0008, 0x3a44,
+	0x0002, 0x0c0c, 0x000b, 0x8074, 0x0000, 0x0800, 0x0000, 0x8072,
+	0x0000, 0x8000, 0x0000, 0x8000, 0x000f, 0x000a, 0x000b, 0x8072,
+	0x0000, 0x8000, 0x0000, 0x000a, 0x000b, 0x3d30, 0x000a, 0x7f00,
+	0x0000, 0xbc80, 0x0001, 0x0007, 0x0000, 0x0214, 0x0003, 0x1930,
+	0x000a, 0x7f00, 0x0000, 0x9880, 0x0001, 0x0007, 0x0000, 0x8060,
+	0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x000a,
+	0x0008, 0x4619, 0x000b, 0x4000, 0x000f, 0x221e, 0x000b, 0x0870,
+	0x0008, 0x4000, 0x000f, 0x7e1b, 0x000b, 0xbbe0, 0x0009, 0x0030,
+	0x0008, 0x0e1b, 0x0003, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x0a2c,
+	0x0003, 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x0a2c, 0x0003, 0x020b,
+	0x0004, 0x8076, 0x0008, 0x0040, 0x0000, 0x022e, 0x0003, 0x8076,
+	0x0008, 0x0041, 0x0008, 0x8072, 0x0000, 0x8000, 0x0000, 0x021b,
+	0x0003, 0xbac0, 0x0009, 0x0090, 0x0008, 0x0a37, 0x0003, 0x8074,
+	0x0000, 0x0706, 0x0000, 0x0239, 0x0003, 0x8074, 0x0000, 0x0703,
+	0x0000, 0x4000, 0x000f, 0x8010, 0x0008, 0x0023, 0x0000, 0x0276,
+	0x000b, 0x8010, 0x0008, 0x0008, 0x0000, 0x0276, 0x000b, 0x8010,
+	0x0008, 0x0022, 0x0008, 0x0276, 0x000b, 0x0210, 0x0004, 0x8010,
+	0x0008, 0x0007, 0x0000, 0x021b, 0x000c, 0x1810, 0x0000, 0x021b,
+	0x000c, 0x0282, 0x0003, 0x0210, 0x0004, 0x8010, 0x0008, 0x001b,
+	0x0008, 0x021b, 0x000c, 0x1810, 0x0000, 0x021b, 0x000c, 0x8074,
+	0x0000, 0xf080, 0x0000, 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30,
+	0x0000, 0x000a, 0x000b, 0x8010, 0x0008, 0x0009, 0x0008, 0x0276,
+	0x000b, 0x8010, 0x0008, 0x0005, 0x0008, 0x0276, 0x000b, 0x1648,
+	0x000a, 0x0c6f, 0x000b, 0x808c, 0x0008, 0x0001, 0x0000, 0x8010,
+	0x0008, 0x0004, 0x0000, 0x4143, 0x000a, 0x086f, 0x0003, 0x3a44,
+	0x0002, 0x0c0a, 0x000b, 0x0d2a, 0x0008, 0x0276, 0x000b, 0x8010,
+	0x0008, 0x0003, 0x0008, 0x027a, 0x000b, 0x8010, 0x0008, 0x000b,
+	0x0000, 0x027a, 0x000b, 0x8010, 0x0008, 0x0002, 0x0000, 0x027a,
+	0x000b, 0x3a47, 0x0002, 0x0d40, 0x000b, 0x8010, 0x0008, 0x0006,
+	0x0008, 0x027a, 0x000b, 0x8074, 0x0000, 0xf000, 0x0008, 0x8072,
+	0x0000, 0x3000, 0x0008, 0x021b, 0x000c, 0x0231, 0x0004, 0x3a40,
+	0x000a, 0x080a, 0x0003, 0x8010, 0x0008, 0x000c, 0x0008, 0x021b,
+	0x000c, 0x000a, 0x000b, 0x8074, 0x0000, 0xf080, 0x0000, 0x8072,
+	0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, 0x2e4d, 0x0002, 0x2e4d,
+	0x0002, 0x0a8d, 0x000b, 0x8054, 0x0008, 0x0019, 0x0000, 0x000a,
+	0x000b, 0x8054, 0x0008, 0x0009, 0x0008, 0x000a, 0x000b, 0x3a44,
+	0x0002, 0x0c0a, 0x000b, 0x026b, 0x000b, 0x808c, 0x0008, 0x0000,
+	0x0008, 0x4447, 0x0002, 0x0ab9, 0x0003, 0xc0c0, 0x0001, 0x00ff,
+	0x0008, 0xffe0, 0x0009, 0x00ff, 0x0008, 0x0e90, 0x0003, 0xc1e0,
+	0x0001, 0xffff, 0x0008, 0x0e90, 0x0003, 0x8010, 0x0008, 0x0013,
+	0x0000, 0x021b, 0x000c, 0x8074, 0x0000, 0x0202, 0x0008, 0x000a,
+	0x000b, 0x3a40, 0x000a, 0x0eb6, 0x000b, 0x8074, 0x0000, 0x0200,
+	0x0000, 0x3d00, 0x0000, 0x3cfe, 0x0000, 0x8072, 0x0000, 0x8000,
+	0x0000, 0x43e0, 0x0001, 0x0eb4, 0x0003, 0x42fe, 0x0000, 0xffc0,
+	0x0001, 0x00ff, 0x0008, 0x00e0, 0x0009, 0x0a90, 0x000b, 0x0d08,
+	0x0008, 0x0309, 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, 0x000a,
+	0x000b, 0x038d, 0x0004, 0x808c, 0x0008, 0x0001, 0x0000, 0x04fe,
+	0x0008, 0x3370, 0x0003, 0x0460, 0x0000, 0x8062, 0x0008, 0x0001,
+	0x0000, 0x8066, 0x0000, 0x0009, 0x0008, 0x46c3, 0x0003, 0x0004,
+	0x0000, 0x80c0, 0x0009, 0x00ff, 0x0008, 0x7f00, 0x0000, 0x80e0,
+	0x0001, 0x0004, 0x0000, 0x0add, 0x000b, 0x80e0, 0x0001, 0x0005,
+	0x0008, 0x0add, 0x000b, 0x80e0, 0x0001, 0x0006, 0x0008, 0x0add,
+	0x000b, 0x82c0, 0x0001, 0xff00, 0x0008, 0x7f04, 0x0008, 0x82e0,
+	0x0009, 0x0600, 0x0008, 0x0add, 0x000b, 0x82e0, 0x0009, 0x0500,
+	0x0008, 0x0add, 0x000b, 0x82e0, 0x0009, 0x0400, 0x0000, 0x0f70,
+	0x0003, 0xc4c0, 0x0009, 0x7000, 0x0000, 0xffe0, 0x0009, 0x1000,
+	0x0000, 0x0b09, 0x0003, 0x037e, 0x0004, 0x3941, 0x0002, 0x0ae8,
+	0x000b, 0x8072, 0x0000, 0x0400, 0x0000, 0x000a, 0x000b, 0x0460,
+	0x0000, 0x80fe, 0x0008, 0x002b, 0x0008, 0x7f62, 0x0008, 0x8066,
+	0x0000, 0x2209, 0x0008, 0x46ee, 0x0003, 0x11fe, 0x0000, 0x3304,
+	0x0003, 0x9180, 0x0001, 0x0002, 0x0000, 0x8060, 0x0000, 0x0400,
+	0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0609, 0x0008, 0x46f8,
+	0x000b, 0x42fe, 0x0000, 0xffc0, 0x0001, 0xff00, 0x0008, 0x03e0,
+	0x0009, 0x0f01, 0x0003, 0x8072, 0x0000, 0x0400, 0x0000, 0x0046,
+	0x0003, 0x9180, 0x0001, 0x0003, 0x0008, 0x02eb, 0x0003, 0x8072,
+	0x0000, 0x0400, 0x0000, 0x8010, 0x0008, 0x0010, 0x0000, 0x0361,
+	0x0003, 0x037e, 0x0004, 0x3941, 0x0002, 0x0b0f, 0x0003, 0x8072,
+	0x0000, 0x0400, 0x0000, 0x000a, 0x000b, 0x0346, 0x000c, 0x11fe,
+	0x0000, 0x0f17, 0x000b, 0x8072, 0x0000, 0x0400, 0x0000, 0x8010,
+	0x0008, 0x000e, 0x0000, 0x0361, 0x0003, 0x8060, 0x0000, 0x0400,
+	0x0000, 0x04fe, 0x0008, 0x0f2c, 0x0003, 0x808c, 0x0008, 0x0000,
+	0x0008, 0x9180, 0x0001, 0x0005, 0x0008, 0x7f62, 0x0008, 0x8066,
+	0x0000, 0x0009, 0x0008, 0x4722, 0x000b, 0x0060, 0x0008, 0x8062,
+	0x0008, 0x001b, 0x0008, 0x4304, 0x0008, 0x4206, 0x0008, 0x8066,
+	0x0000, 0x0412, 0x0000, 0x472a, 0x0003, 0x0343, 0x0003, 0x808c,
+	0x0008, 0x0001, 0x0000, 0x0460, 0x0000, 0x8062, 0x0008, 0x002b,
+	0x0008, 0x8066, 0x0000, 0x0609, 0x0008, 0x4733, 0x000b, 0x8066,
+	0x0000, 0x220a, 0x0008, 0x4736, 0x000b, 0x42fe, 0x0000, 0xffc0,
+	0x0001, 0xff00, 0x0008, 0x7f04, 0x0008, 0x8060, 0x0000, 0x0400,
+	0x0000, 0x9180, 0x0001, 0x0002, 0x0000, 0x7f62, 0x0008, 0x8066,
+	0x0000, 0x041a, 0x0008, 0x4742, 0x000b, 0x8072, 0x0000, 0x0400,
+	0x0000, 0x0046, 0x0003, 0x8060, 0x0000, 0x0400, 0x0000, 0x1362,
+	0x0008, 0x8066, 0x0000, 0x0411, 0x0000, 0x474b, 0x000b, 0x02fe,
+	0x0008, 0x03e0, 0x0009, 0x0f51, 0x0003, 0x0d22, 0x0000, 0x4000,
+	0x000f, 0x8280, 0x0009, 0x0002, 0x0000, 0x1380, 0x0001, 0x7f62,
+	0x0008, 0x8066, 0x0000, 0x2209, 0x0008, 0x4757, 0x0003, 0x0200,
+	0x000a, 0xffc0, 0x0001, 0x0007, 0x0000, 0x7f06, 0x0000, 0x1362,
+	0x0008, 0x8066, 0x0000, 0x060a, 0x0008, 0x475f, 0x000b, 0x4000,
+	0x000f, 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x2f44, 0x000a, 0x2f44,
+	0x000a, 0x0e6b, 0x000b, 0x808a, 0x0008, 0x0003, 0x0008, 0x8074,
+	0x0000, 0xf080, 0x0000, 0x8072, 0x0000, 0x3000, 0x0008, 0x5b6c,
+	0x0003, 0x8054, 0x0008, 0x0019, 0x0000, 0x000a, 0x000b, 0x3a44,
+	0x0002, 0x0c0a, 0x000b, 0x808c, 0x0008, 0x0000, 0x0008, 0x8010,
+	0x0008, 0x0011, 0x0008, 0x021b, 0x000c, 0x42fe, 0x0000, 0xffc0,
+	0x0001, 0x00ff, 0x0008, 0x7f10, 0x0008, 0x021b, 0x000c, 0x4310,
+	0x0008, 0x027a, 0x000b, 0x3941, 0x0002, 0x0b81, 0x0003, 0x4000,
+	0x000f, 0x8072, 0x0000, 0x0404, 0x0008, 0x4000, 0x000f, 0x8010,
+	0x0008, 0x0012, 0x0008, 0x021b, 0x000c, 0x0346, 0x000c, 0x1110,
+	0x0000, 0x021b, 0x000c, 0x11fe, 0x0000, 0x0f87, 0x000b, 0x000a,
+	0x000b, 0xc2c0, 0x0009, 0x00ff, 0x0008, 0x7f00, 0x0000, 0xc3c0,
+	0x0001, 0xff00, 0x0008, 0x00d0, 0x0009, 0x0bb2, 0x0003, 0x0d0a,
+	0x0000, 0x8580, 0x0001, 0x1000, 0x0000, 0x7f62, 0x0008, 0x8060,
+	0x0000, 0x0400, 0x0000, 0x8066, 0x0000, 0x0809, 0x0000, 0x479c,
+	0x000b, 0x04fe, 0x0008, 0x33ab, 0x0003, 0x0460, 0x0000, 0x8062,
+	0x0008, 0x0004, 0x0000, 0x8066, 0x0000, 0x0211, 0x0000, 0x47a4,
+	0x0003, 0x01fe, 0x0008, 0x00e0, 0x0009, 0x0fab, 0x0003, 0x02fe,
+	0x0008, 0x43e0, 0x0001, 0x0bb1, 0x0003, 0x0500, 0x0002, 0x7f0a,
+	0x0000, 0xffe0, 0x0009, 0x0800, 0x0000, 0x0f95, 0x000b, 0x0d08,
+	0x0008, 0x4000, 0x000f, 0x43fe, 0x0008, 0x3e80, 0x0001, 0xffc0,
+	0x0001, 0x7fff, 0x0000, 0x0d60, 0x0000, 0x7f62, 0x0008, 0x8066,
+	0x0000, 0x0809, 0x0000, 0x47ba, 0x0003, 0x8060, 0x0000, 0x0400,
 	0x0000, 0x84c0, 0x0001, 0xff00, 0x0008, 0x7f60, 0x000a, 0x7f60,
 	0x000a, 0x7f60, 0x000a, 0x7f60, 0x000a, 0x7f60, 0x000a, 0x7f60,
 	0x000a, 0x7f60, 0x000a, 0x7f60, 0x000a, 0xff80, 0x0009, 0x1000,
-	0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0809, 0x0000, 0x47ca,
-	0x000b, 0x4000, 0x000f, 0x57bb, 0xebe0, 0x0001, 0x0002, 0x0004,
+	0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0809, 0x0000, 0x47cc,
+	0x000b, 0x4000, 0x000f, 0xd7f4, 0xebe5, 0x0001, 0x0002, 0x0004,
 	0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400,
-	0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0x2df1
+	0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0x45cc
 };
 #ifdef UNIQUE_FW_NAME
-unsigned short fw2300ipx_length01 = 0xe666;
+unsigned short fw2300ipx_length01 = 0xe9a6;
 #else
-unsigned short risc_code_length01 = 0xe666;
+unsigned short risc_code_length01 = 0xe9a6;
 #endif
 
--- diff/drivers/scsi/qla2xxx/ql2322.c	2004-02-18 08:54:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/ql2322.c	2004-04-21 10:45:34.789414704 +0100
@@ -1,6 +1,6 @@
 /*
  * QLogic ISP2322 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation (www.qlogic.com)
+ * Copyright (C) 2003-2004 QLogic Corporation (www.qlogic.com)
  *
  * Released under GPL v2.
  */
--- diff/drivers/scsi/qla2xxx/ql2322_fw.c	2004-02-18 08:54:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/ql2322_fw.c	2004-04-21 10:45:34.823409536 +0100
@@ -2,7 +2,7 @@
  *                  QLOGIC LINUX SOFTWARE
  *
  * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation
+ * Copyright (C) 2003-2004 QLogic Corporation
  * (www.qlogic.com)
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -18,7 +18,7 @@
  *************************************************************************/
 
 /*
- *	Firmware Version 3.02.21 (16:27 Jan 19, 2004)
+ *	Firmware Version 3.02.26 (08:08 Mar 11, 2004)
  */
 
 #ifdef UNIQUE_FW_NAME
@@ -28,15 +28,15 @@ unsigned short risc_code_version = 3*102
 #endif
 
 #ifdef UNIQUE_FW_NAME
-unsigned char fw2322ipx_version_str[] = {3, 2,21};
+unsigned char fw2322ipx_version_str[] = {3, 2,26};
 #else
-unsigned char firmware_version[] = {3, 2,21};
+unsigned char firmware_version[] = {3, 2,26};
 #endif
 
 #ifdef UNIQUE_FW_NAME
-#define fw2322ipx_VERSION_STRING "3.02.21"
+#define fw2322ipx_VERSION_STRING "3.02.26"
 #else
-#define FW_VERSION_STRING "3.02.21"
+#define FW_VERSION_STRING "3.02.26"
 #endif
 
 #ifdef UNIQUE_FW_NAME
@@ -50,12 +50,12 @@ unsigned short fw2322ipx_code01[] = { 
 #else
 unsigned short risc_code01[] = { 
 #endif
-	0x0470, 0x0000, 0x0000, 0xdddb, 0x0000, 0x0003, 0x0002, 0x0015,
+	0x0470, 0x0000, 0x0000, 0xdf17, 0x0000, 0x0003, 0x0002, 0x001a,
 	0x0137, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030,
 	0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241,
 	0x5449, 0x4f4e, 0x2049, 0x5350, 0x3233, 0x3030, 0x2046, 0x6972,
 	0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030,
-	0x332e, 0x3032, 0x2e32, 0x3120, 0x2020, 0x2020, 0x2400, 0x20a9,
+	0x332e, 0x3032, 0x2e32, 0x3620, 0x2020, 0x2020, 0x2400, 0x20a9,
 	0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2200, 0x20a9, 0x000f,
 	0x2001, 0x0000, 0x400f, 0x2091, 0x2400, 0x20a9, 0x000f, 0x2001,
 	0x0000, 0x400f, 0x2091, 0x2600, 0x20a9, 0x000f, 0x2001, 0x0000,
@@ -64,164 +64,164 @@ unsigned short risc_code01[] = { 
 	0x2c00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2e00,
 	0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2000, 0x2001,
 	0x0000, 0x20c1, 0x0004, 0x20c9, 0x1cff, 0x2059, 0x0000, 0x2b78,
-	0x7883, 0x0004, 0x2089, 0x2a7c, 0x2051, 0x1800, 0x2a70, 0x20e1,
+	0x7883, 0x0004, 0x2089, 0x2ab5, 0x2051, 0x1800, 0x2a70, 0x20e1,
 	0x0001, 0x20e9, 0x0001, 0x2009, 0x0000, 0x080c, 0x0e55, 0x00f6,
-	0x7888, 0x9005, 0x11f8, 0x2061, 0xc000, 0x080c, 0x202e, 0x1170,
-	0x2079, 0x0300, 0x080c, 0x2044, 0x2061, 0xe000, 0x080c, 0x202e,
-	0x1128, 0x2079, 0x0380, 0x080c, 0x2044, 0x0060, 0x00fe, 0x7883,
+	0x7888, 0x9005, 0x11f8, 0x2061, 0xc000, 0x080c, 0x205a, 0x1170,
+	0x2079, 0x0300, 0x080c, 0x2070, 0x2061, 0xe000, 0x080c, 0x205a,
+	0x1128, 0x2079, 0x0380, 0x080c, 0x2070, 0x0060, 0x00fe, 0x7883,
 	0x4010, 0x7837, 0x4010, 0x7833, 0x0010, 0x2091, 0x5000, 0x2091,
 	0x4080, 0x0cf8, 0x00fe, 0x2029, 0x5600, 0x2031, 0xffff, 0x2039,
 	0x55dc, 0x2021, 0x0200, 0x20e9, 0x0001, 0x20a1, 0x0000, 0x20a9,
 	0x0800, 0x900e, 0x4104, 0x20e9, 0x0001, 0x20a1, 0x1000, 0x900e,
 	0x2001, 0x0dc1, 0x9084, 0x0fff, 0x20a8, 0x4104, 0x2001, 0x0000,
 	0x9086, 0x0000, 0x0120, 0x21a8, 0x4104, 0x8001, 0x1de0, 0x756e,
-	0x7672, 0x776a, 0x7476, 0x747a, 0x00e6, 0x2071, 0x1b4c, 0x2472,
+	0x7672, 0x776a, 0x7476, 0x747a, 0x00e6, 0x2071, 0x1b4e, 0x2472,
 	0x00ee, 0x20a1, 0x1ddc, 0x7170, 0x810d, 0x810d, 0x810d, 0x810d,
 	0x918c, 0x000f, 0x2001, 0x0001, 0x9112, 0x900e, 0x21a8, 0x4104,
 	0x8211, 0x1de0, 0x7170, 0x3400, 0x8001, 0x9102, 0x0120, 0x0218,
 	0x20a8, 0x900e, 0x4104, 0x2009, 0x1800, 0x810d, 0x810d, 0x810d,
 	0x810d, 0x810d, 0x918c, 0x001f, 0x2001, 0x0001, 0x9112, 0x20e9,
 	0x0001, 0x20a1, 0x0800, 0x900e, 0x20a9, 0x0800, 0x4104, 0x8211,
-	0x1dd8, 0x080c, 0x0f53, 0x080c, 0x5f4f, 0x080c, 0xaa6e, 0x080c,
-	0x110a, 0x080c, 0x131f, 0x080c, 0x1b99, 0x080c, 0x9057, 0x080c,
-	0x0d0f, 0x080c, 0x108f, 0x080c, 0x3434, 0x080c, 0x76fc, 0x080c,
-	0x698e, 0x080c, 0x87cf, 0x080c, 0x8436, 0x080c, 0x2213, 0x080c,
-	0x7dcc, 0x080c, 0x205d, 0x080c, 0x2197, 0x080c, 0x2208, 0x2091,
+	0x1dd8, 0x080c, 0x0f52, 0x080c, 0x6030, 0x080c, 0xab5f, 0x080c,
+	0x1109, 0x080c, 0x1328, 0x080c, 0x1bb0, 0x080c, 0x915c, 0x080c,
+	0x0d0f, 0x080c, 0x108e, 0x080c, 0x346d, 0x080c, 0x77ed, 0x080c,
+	0x6a7f, 0x080c, 0x88d4, 0x080c, 0x8538, 0x080c, 0x223f, 0x080c,
+	0x7ec2, 0x080c, 0x2089, 0x080c, 0x21c3, 0x080c, 0x2234, 0x2091,
 	0x3009, 0x7883, 0x0000, 0x1004, 0x0943, 0x7880, 0x9086, 0x0002,
 	0x1190, 0x7883, 0x4000, 0x7837, 0x4000, 0x7833, 0x0010, 0x0e04,
 	0x0937, 0x2091, 0x5000, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
-	0xd084, 0x190c, 0x11cd, 0x2071, 0x1800, 0x7003, 0x0000, 0x780c,
+	0xd084, 0x190c, 0x11d6, 0x2071, 0x1800, 0x7003, 0x0000, 0x780c,
 	0x9084, 0x0030, 0x9086, 0x0000, 0x190c, 0x0d7d, 0x2071, 0x1800,
-	0x7000, 0x908e, 0x0003, 0x1168, 0x080c, 0x4afd, 0x080c, 0x345b,
-	0x080c, 0x7764, 0x080c, 0x6ed6, 0x080c, 0x88ad, 0x080c, 0x845f,
+	0x7000, 0x908e, 0x0003, 0x1168, 0x080c, 0x4bc5, 0x080c, 0x3494,
+	0x080c, 0x7855, 0x080c, 0x6fc7, 0x080c, 0x89b2, 0x080c, 0x8561,
 	0x0c68, 0x000b, 0x0c88, 0x096d, 0x096e, 0x0b09, 0x096b, 0x0bc3,
 	0x0d0e, 0x0d0e, 0x0d0e, 0x080c, 0x0d7d, 0x0005, 0x0126, 0x00f6,
 	0x2091, 0x8000, 0x7000, 0x9086, 0x0001, 0x1904, 0x0adc, 0x080c,
-	0x0ea5, 0x080c, 0x73e4, 0x0150, 0x080c, 0x7407, 0x15b0, 0x2079,
-	0x0100, 0x7828, 0x9085, 0x1800, 0x782a, 0x0478, 0x080c, 0x7315,
+	0x0ea5, 0x080c, 0x74d5, 0x0150, 0x080c, 0x74f8, 0x15b0, 0x2079,
+	0x0100, 0x7828, 0x9085, 0x1800, 0x782a, 0x0478, 0x080c, 0x7406,
 	0x7000, 0x9086, 0x0001, 0x1904, 0x0adc, 0x7098, 0x9086, 0x0028,
-	0x1904, 0x0adc, 0x080c, 0x842e, 0x080c, 0x8420, 0x2001, 0x0161,
-	0x2003, 0x0001, 0x2079, 0x0100, 0x2011, 0xffff, 0x080c, 0x2a0b,
-	0x7a28, 0x9295, 0x5e2c, 0x7a2a, 0x2011, 0x725a, 0x080c, 0x850b,
-	0x2011, 0x724d, 0x080c, 0x8614, 0x2011, 0x5da6, 0x080c, 0x850b,
-	0x2011, 0x8030, 0x901e, 0x7396, 0x04d0, 0x080c, 0x5653, 0x2079,
-	0x0100, 0x7844, 0x9005, 0x1904, 0x0adc, 0x2011, 0x5da6, 0x080c,
-	0x850b, 0x2011, 0x725a, 0x080c, 0x850b, 0x2011, 0x724d, 0x080c,
-	0x8614, 0x2001, 0x0265, 0x2001, 0x0205, 0x2003, 0x0000, 0x7840,
-	0x9084, 0xfffb, 0x7842, 0x2001, 0x19a4, 0x2004, 0x9005, 0x1140,
-	0x00c6, 0x2061, 0x0100, 0x080c, 0x5ef7, 0x00ce, 0x0804, 0x0adc,
-	0x780f, 0x006b, 0x7a28, 0x080c, 0x73ec, 0x0118, 0x9295, 0x5e2c,
+	0x1904, 0x0adc, 0x080c, 0x8530, 0x080c, 0x8522, 0x2001, 0x0161,
+	0x2003, 0x0001, 0x2079, 0x0100, 0x2011, 0xffff, 0x080c, 0x2a44,
+	0x7a28, 0x9295, 0x5e2c, 0x7a2a, 0x2011, 0x734b, 0x080c, 0x860d,
+	0x2011, 0x733e, 0x080c, 0x8719, 0x2011, 0x5e87, 0x080c, 0x860d,
+	0x2011, 0x8030, 0x901e, 0x7396, 0x04d0, 0x080c, 0x5734, 0x2079,
+	0x0100, 0x7844, 0x9005, 0x1904, 0x0adc, 0x2011, 0x5e87, 0x080c,
+	0x860d, 0x2011, 0x734b, 0x080c, 0x860d, 0x2011, 0x733e, 0x080c,
+	0x8719, 0x2001, 0x0265, 0x2001, 0x0205, 0x2003, 0x0000, 0x7840,
+	0x9084, 0xfffb, 0x7842, 0x2001, 0x19a6, 0x2004, 0x9005, 0x1140,
+	0x00c6, 0x2061, 0x0100, 0x080c, 0x5fd8, 0x00ce, 0x0804, 0x0adc,
+	0x780f, 0x006b, 0x7a28, 0x080c, 0x74dd, 0x0118, 0x9295, 0x5e2c,
 	0x0010, 0x9295, 0x402c, 0x7a2a, 0x2011, 0x8010, 0x73d8, 0x2001,
-	0x19a5, 0x2003, 0x0001, 0x080c, 0x28ea, 0x080c, 0x4a38, 0x7248,
+	0x19a7, 0x2003, 0x0001, 0x080c, 0x2916, 0x080c, 0x4b00, 0x7248,
 	0xc284, 0x724a, 0x2001, 0x180c, 0x200c, 0xc1ac, 0xc1cc, 0x2102,
-	0x2001, 0x0390, 0x2003, 0x0400, 0x080c, 0xa781, 0x080c, 0x9f4a,
-	0x2011, 0x0004, 0x080c, 0xc733, 0x080c, 0xa79d, 0x080c, 0x681f,
-	0x080c, 0x73e4, 0x1120, 0x080c, 0x2938, 0x0600, 0x0420, 0x080c,
-	0x5efe, 0x0140, 0x7097, 0x0001, 0x70d3, 0x0000, 0x080c, 0x5820,
-	0x0804, 0x0adc, 0x080c, 0x55fc, 0xd094, 0x01a8, 0x2001, 0x0390,
+	0x2001, 0x0390, 0x2003, 0x0400, 0x080c, 0xa872, 0x080c, 0xa04f,
+	0x2011, 0x0004, 0x080c, 0xc824, 0x080c, 0xa88e, 0x080c, 0x6910,
+	0x080c, 0x74d5, 0x1120, 0x080c, 0x2971, 0x0600, 0x0420, 0x080c,
+	0x5fdf, 0x0140, 0x7097, 0x0001, 0x70d3, 0x0000, 0x080c, 0x5901,
+	0x0804, 0x0adc, 0x080c, 0x56d3, 0xd094, 0x01a8, 0x2001, 0x0390,
 	0x2003, 0x0404, 0x2011, 0x180c, 0x2204, 0xc0cd, 0x2012, 0x080c,
-	0x5600, 0xd0d4, 0x1118, 0x080c, 0x2938, 0x1270, 0x2011, 0x180c,
-	0x2204, 0xc0bc, 0x00a8, 0x080c, 0x5600, 0xd0d4, 0x1db8, 0x2011,
+	0x56d7, 0xd0d4, 0x1118, 0x080c, 0x2971, 0x1270, 0x2011, 0x180c,
+	0x2204, 0xc0bc, 0x00a8, 0x080c, 0x56d7, 0xd0d4, 0x1db8, 0x2011,
 	0x180c, 0x2204, 0xc0bd, 0x0060, 0x2011, 0x180c, 0x2204, 0xc0bd,
-	0x2012, 0x080c, 0x6962, 0x1128, 0xd0a4, 0x0118, 0x2204, 0xc0fd,
-	0x2012, 0x080c, 0x6928, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, 0x00a8,
-	0x707f, 0x0000, 0x080c, 0x73e4, 0x1130, 0x70b0, 0x9005, 0x1168,
-	0x080c, 0xcb83, 0x0050, 0x080c, 0xcb83, 0x70dc, 0xd09c, 0x1128,
-	0x70b0, 0x9005, 0x0110, 0x080c, 0x5ed4, 0x70e7, 0x0000, 0x70e3,
-	0x0000, 0x70a7, 0x0000, 0x080c, 0x2940, 0x0228, 0x2011, 0x0101,
-	0x2204, 0xc0c4, 0x2012, 0x72dc, 0x080c, 0x73e4, 0x1178, 0x9016,
-	0x0016, 0x080c, 0x26e7, 0x2019, 0x196d, 0x211a, 0x001e, 0x705f,
+	0x2012, 0x080c, 0x6a53, 0x1128, 0xd0a4, 0x0118, 0x2204, 0xc0fd,
+	0x2012, 0x080c, 0x6a19, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, 0x00a8,
+	0x707f, 0x0000, 0x080c, 0x74d5, 0x1130, 0x70b0, 0x9005, 0x1168,
+	0x080c, 0xcc7b, 0x0050, 0x080c, 0xcc7b, 0x70dc, 0xd09c, 0x1128,
+	0x70b0, 0x9005, 0x0110, 0x080c, 0x5fb5, 0x70e7, 0x0000, 0x70e3,
+	0x0000, 0x70a7, 0x0000, 0x080c, 0x2979, 0x0228, 0x2011, 0x0101,
+	0x2204, 0xc0c4, 0x2012, 0x72dc, 0x080c, 0x74d5, 0x1178, 0x9016,
+	0x0016, 0x080c, 0x2713, 0x2019, 0x196d, 0x211a, 0x001e, 0x705f,
 	0xffff, 0x7063, 0x00ef, 0x7083, 0x0000, 0x0020, 0x2019, 0x196d,
 	0x201b, 0x0000, 0x2079, 0x1847, 0x7804, 0xd0ac, 0x0108, 0xc295,
-	0x72de, 0x080c, 0x73e4, 0x0118, 0x9296, 0x0004, 0x0518, 0x2011,
-	0x0001, 0x080c, 0xc733, 0x70ab, 0x0000, 0x70af, 0xffff, 0x7003,
-	0x0002, 0x00fe, 0x080c, 0x2f79, 0x080c, 0xa781, 0x2011, 0x0005,
-	0x080c, 0xa0a6, 0x080c, 0xa79d, 0x080c, 0x73e4, 0x0148, 0x00c6,
-	0x2061, 0x0100, 0x0016, 0x080c, 0x26e7, 0x61e2, 0x001e, 0x00ce,
+	0x72de, 0x080c, 0x74d5, 0x0118, 0x9296, 0x0004, 0x0518, 0x2011,
+	0x0001, 0x080c, 0xc824, 0x70ab, 0x0000, 0x70af, 0xffff, 0x7003,
+	0x0002, 0x00fe, 0x080c, 0x2fb2, 0x080c, 0xa872, 0x2011, 0x0005,
+	0x080c, 0xa1ab, 0x080c, 0xa88e, 0x080c, 0x74d5, 0x0148, 0x00c6,
+	0x2061, 0x0100, 0x0016, 0x080c, 0x2713, 0x61e2, 0x001e, 0x00ce,
 	0x012e, 0x00e0, 0x70ab, 0x0000, 0x70af, 0xffff, 0x7003, 0x0002,
-	0x080c, 0xa781, 0x2011, 0x0005, 0x080c, 0xa0a6, 0x080c, 0xa79d,
-	0x080c, 0x73e4, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c,
-	0x26e7, 0x61e2, 0x001e, 0x00ce, 0x00fe, 0x012e, 0x0005, 0x00c6,
-	0x00b6, 0x080c, 0x73e4, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9,
-	0x0782, 0x080c, 0x73e4, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e,
+	0x080c, 0xa872, 0x2011, 0x0005, 0x080c, 0xa1ab, 0x080c, 0xa88e,
+	0x080c, 0x74d5, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c,
+	0x2713, 0x61e2, 0x001e, 0x00ce, 0x00fe, 0x012e, 0x0005, 0x00c6,
+	0x00b6, 0x080c, 0x74d5, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9,
+	0x0782, 0x080c, 0x74d5, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e,
 	0x86ff, 0x0138, 0x9180, 0x1000, 0x2004, 0x905d, 0x0110, 0xb800,
-	0xd0bc, 0x090c, 0x32bc, 0x8108, 0x1f04, 0x0af0, 0x707f, 0x0000,
+	0xd0bc, 0x090c, 0x32f5, 0x8108, 0x1f04, 0x0af0, 0x707f, 0x0000,
 	0x7080, 0x9084, 0x00ff, 0x7082, 0x70b3, 0x0000, 0x00be, 0x00ce,
 	0x0005, 0x00b6, 0x0126, 0x2091, 0x8000, 0x7000, 0x9086, 0x0002,
-	0x1904, 0x0bc0, 0x70ac, 0x9086, 0xffff, 0x0120, 0x080c, 0x2f79,
+	0x1904, 0x0bc0, 0x70ac, 0x9086, 0xffff, 0x0120, 0x080c, 0x2fb2,
 	0x0804, 0x0bc0, 0x70dc, 0xd0ac, 0x1110, 0xd09c, 0x0538, 0xd084,
 	0x0528, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, 0x000e, 0xd08c,
-	0x01e8, 0x080c, 0x332d, 0x11b0, 0x70e0, 0x9086, 0xffff, 0x0190,
-	0x080c, 0x310b, 0x70dc, 0xd094, 0x1904, 0x0bc0, 0x2011, 0x0001,
-	0x080c, 0xce35, 0x0110, 0x2011, 0x0003, 0x901e, 0x080c, 0x3145,
+	0x01e8, 0x080c, 0x3366, 0x11b0, 0x70e0, 0x9086, 0xffff, 0x0190,
+	0x080c, 0x3144, 0x70dc, 0xd094, 0x1904, 0x0bc0, 0x2011, 0x0001,
+	0x080c, 0xcf2e, 0x0110, 0x2011, 0x0003, 0x901e, 0x080c, 0x317e,
 	0x0804, 0x0bc0, 0x70e4, 0x9005, 0x1904, 0x0bc0, 0x70a8, 0x9005,
 	0x1904, 0x0bc0, 0x70dc, 0xd0a4, 0x0118, 0xd0b4, 0x0904, 0x0bc0,
-	0x080c, 0x6928, 0x1904, 0x0bc0, 0x080c, 0x697b, 0x1904, 0x0bc0,
-	0x080c, 0x6962, 0x01c0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e,
-	0x0016, 0x080c, 0x652d, 0x1118, 0xb800, 0xd0ec, 0x1138, 0x001e,
+	0x080c, 0x6a19, 0x1904, 0x0bc0, 0x080c, 0x6a6c, 0x1904, 0x0bc0,
+	0x080c, 0x6a53, 0x01c0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e,
+	0x0016, 0x080c, 0x661e, 0x1118, 0xb800, 0xd0ec, 0x1138, 0x001e,
 	0x8108, 0x1f04, 0x0b60, 0x00ce, 0x015e, 0x0028, 0x001e, 0x00ce,
 	0x015e, 0x0804, 0x0bc0, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b,
-	0x000e, 0x2011, 0x19b1, 0x080c, 0x0fc3, 0x2011, 0x19cb, 0x080c,
-	0x0fc3, 0x7030, 0xc08c, 0x7032, 0x7003, 0x0003, 0x70af, 0xffff,
-	0x080c, 0x0e79, 0x9006, 0x080c, 0x2574, 0x080c, 0x332d, 0x0118,
-	0x080c, 0x4bd5, 0x0050, 0x0036, 0x0046, 0x2019, 0xffff, 0x2021,
-	0x0006, 0x080c, 0x4bef, 0x004e, 0x003e, 0x00f6, 0x2079, 0x0100,
-	0x080c, 0x7407, 0x0150, 0x080c, 0x73e4, 0x7828, 0x0118, 0x9084,
-	0xe1ff, 0x0010, 0x9084, 0xffdf, 0x782a, 0x00fe, 0x080c, 0xa781,
-	0x2001, 0x19e6, 0x2004, 0x9086, 0x0005, 0x1120, 0x2011, 0x0000,
-	0x080c, 0xa0a6, 0x2011, 0x0000, 0x080c, 0xa0b0, 0x080c, 0xa79d,
+	0x000e, 0x2011, 0x19b3, 0x080c, 0x0fc2, 0x2011, 0x19cd, 0x080c,
+	0x0fc2, 0x7030, 0xc08c, 0x7032, 0x7003, 0x0003, 0x70af, 0xffff,
+	0x080c, 0x0e79, 0x9006, 0x080c, 0x25a0, 0x080c, 0x3366, 0x0118,
+	0x080c, 0x4c9d, 0x0050, 0x0036, 0x0046, 0x2019, 0xffff, 0x2021,
+	0x0006, 0x080c, 0x4cb7, 0x004e, 0x003e, 0x00f6, 0x2079, 0x0100,
+	0x080c, 0x74f8, 0x0150, 0x080c, 0x74d5, 0x7828, 0x0118, 0x9084,
+	0xe1ff, 0x0010, 0x9084, 0xffdf, 0x782a, 0x00fe, 0x080c, 0xa872,
+	0x2001, 0x19e8, 0x2004, 0x9086, 0x0005, 0x1120, 0x2011, 0x0000,
+	0x080c, 0xa1ab, 0x2011, 0x0000, 0x080c, 0xa1b5, 0x080c, 0xa88e,
 	0x012e, 0x00be, 0x0005, 0x0016, 0x0026, 0x0046, 0x00f6, 0x0126,
 	0x2091, 0x8000, 0x2079, 0x0100, 0x7904, 0x918c, 0xfffd, 0x7906,
-	0x2009, 0x00f7, 0x080c, 0x5ebd, 0x7940, 0x918c, 0x0010, 0x7942,
-	0x7924, 0xd1b4, 0x0120, 0x2011, 0x0040, 0x080c, 0x2a0b, 0xd19c,
-	0x0120, 0x2011, 0x0008, 0x080c, 0x2a0b, 0x0006, 0x0036, 0x0156,
-	0x0000, 0x2001, 0x19a5, 0x2004, 0x9005, 0x1518, 0x080c, 0x299f,
-	0x1148, 0x2001, 0x0001, 0x080c, 0x2919, 0x2001, 0x0001, 0x080c,
-	0x28fc, 0x00b8, 0x080c, 0x29a7, 0x1138, 0x9006, 0x080c, 0x2919,
-	0x9006, 0x080c, 0x28fc, 0x0068, 0x080c, 0x29af, 0x1d50, 0x2001,
-	0x1996, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, 0x2713, 0x0804,
-	0x0cc1, 0x080c, 0x2a2e, 0x080c, 0x2a72, 0x20a9, 0x003a, 0x1d04,
-	0x0c17, 0x080c, 0x85f4, 0x1f04, 0x0c17, 0x080c, 0x73f5, 0x0148,
-	0x080c, 0x7407, 0x1118, 0x080c, 0x76f7, 0x0050, 0x080c, 0x73ec,
-	0x0dd0, 0x080c, 0x76f2, 0x080c, 0x76e8, 0x080c, 0x7315, 0x0020,
-	0x2009, 0x00f8, 0x080c, 0x5ebd, 0x7850, 0xc0e5, 0x7852, 0x080c,
-	0x73e4, 0x0120, 0x7843, 0x0090, 0x7843, 0x0010, 0x2021, 0xe678,
-	0x2019, 0xea60, 0x0d0c, 0x85f4, 0x7820, 0xd09c, 0x15a0, 0x080c,
-	0x73e4, 0x0904, 0x0ca3, 0x7824, 0xd0ac, 0x1904, 0x0cc6, 0x080c,
-	0x7407, 0x1548, 0x0046, 0x2021, 0x0320, 0x8421, 0x1df0, 0x004e,
-	0x2011, 0x1800, 0x080c, 0x2a0b, 0x080c, 0x29b7, 0x7824, 0x9084,
+	0x2009, 0x00f7, 0x080c, 0x5f9e, 0x7940, 0x918c, 0x0010, 0x7942,
+	0x7924, 0xd1b4, 0x0120, 0x2011, 0x0040, 0x080c, 0x2a44, 0xd19c,
+	0x0120, 0x2011, 0x0008, 0x080c, 0x2a44, 0x0006, 0x0036, 0x0156,
+	0x0000, 0x2001, 0x19a7, 0x2004, 0x9005, 0x1518, 0x080c, 0x29d8,
+	0x1148, 0x2001, 0x0001, 0x080c, 0x2945, 0x2001, 0x0001, 0x080c,
+	0x2928, 0x00b8, 0x080c, 0x29e0, 0x1138, 0x9006, 0x080c, 0x2945,
+	0x9006, 0x080c, 0x2928, 0x0068, 0x080c, 0x29e8, 0x1d50, 0x2001,
+	0x1998, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, 0x273f, 0x0804,
+	0x0cc1, 0x080c, 0x2a67, 0x080c, 0x2aab, 0x20a9, 0x003a, 0x1d04,
+	0x0c17, 0x080c, 0x86f9, 0x1f04, 0x0c17, 0x080c, 0x74e6, 0x0148,
+	0x080c, 0x74f8, 0x1118, 0x080c, 0x77e8, 0x0050, 0x080c, 0x74dd,
+	0x0dd0, 0x080c, 0x77e3, 0x080c, 0x77d9, 0x080c, 0x7406, 0x0020,
+	0x2009, 0x00f8, 0x080c, 0x5f9e, 0x7850, 0xc0e5, 0x7852, 0x080c,
+	0x74d5, 0x0120, 0x7843, 0x0090, 0x7843, 0x0010, 0x2021, 0xe678,
+	0x2019, 0xea60, 0x0d0c, 0x86f9, 0x7820, 0xd09c, 0x15a0, 0x080c,
+	0x74d5, 0x0904, 0x0ca3, 0x7824, 0xd0ac, 0x1904, 0x0cc6, 0x080c,
+	0x74f8, 0x1548, 0x0046, 0x2021, 0x0320, 0x8421, 0x1df0, 0x004e,
+	0x2011, 0x1800, 0x080c, 0x2a44, 0x080c, 0x29f0, 0x7824, 0x9084,
 	0x1800, 0x1168, 0x9484, 0x0fff, 0x1140, 0x2001, 0x1810, 0x2004,
 	0x9084, 0x9000, 0x0110, 0x080c, 0x0ce9, 0x8421, 0x1160, 0x1d04,
-	0x0c73, 0x080c, 0x85f4, 0x080c, 0x76f2, 0x080c, 0x76e8, 0x7003,
+	0x0c73, 0x080c, 0x86f9, 0x080c, 0x77e3, 0x080c, 0x77d9, 0x7003,
 	0x0001, 0x0804, 0x0cc6, 0x8319, 0x1928, 0x2001, 0x1810, 0x2004,
 	0x9084, 0x9000, 0x0110, 0x080c, 0x0ce9, 0x1d04, 0x0c89, 0x080c,
-	0x85f4, 0x2009, 0x1999, 0x2104, 0x9005, 0x0118, 0x8001, 0x200a,
-	0x1188, 0x200b, 0x000a, 0x2011, 0x0048, 0x080c, 0x2a0b, 0x20a9,
-	0x0002, 0x080c, 0x2998, 0x7924, 0x080c, 0x29b7, 0xd19c, 0x0110,
-	0x080c, 0x28ea, 0x00f0, 0x080c, 0x73f5, 0x1140, 0x94a2, 0x03e8,
-	0x1128, 0x080c, 0x73b8, 0x7003, 0x0001, 0x00c0, 0x2011, 0x1800,
-	0x080c, 0x2a0b, 0x080c, 0x29b7, 0x7824, 0x080c, 0x73fe, 0x0110,
+	0x86f9, 0x2009, 0x199b, 0x2104, 0x9005, 0x0118, 0x8001, 0x200a,
+	0x1188, 0x200b, 0x000a, 0x2011, 0x0048, 0x080c, 0x2a44, 0x20a9,
+	0x0002, 0x080c, 0x29d1, 0x7924, 0x080c, 0x29f0, 0xd19c, 0x0110,
+	0x080c, 0x2916, 0x00f0, 0x080c, 0x74e6, 0x1140, 0x94a2, 0x03e8,
+	0x1128, 0x080c, 0x74a9, 0x7003, 0x0001, 0x00c0, 0x2011, 0x1800,
+	0x080c, 0x2a44, 0x080c, 0x29f0, 0x7824, 0x080c, 0x74ef, 0x0110,
 	0xd0ac, 0x1160, 0x9084, 0x1800, 0x0904, 0x0c7b, 0x7003, 0x0001,
-	0x0028, 0x2001, 0x0001, 0x080c, 0x2574, 0x00a0, 0x7850, 0xc0e4,
+	0x0028, 0x2001, 0x0001, 0x080c, 0x25a0, 0x00a0, 0x7850, 0xc0e4,
 	0x7852, 0x2009, 0x180c, 0x210c, 0xd19c, 0x1120, 0x7904, 0x918d,
-	0x0002, 0x7906, 0x2011, 0x0048, 0x080c, 0x2a0b, 0x7828, 0x9085,
-	0x0028, 0x782a, 0x2001, 0x19a5, 0x2003, 0x0000, 0x9006, 0x78f2,
+	0x0002, 0x7906, 0x2011, 0x0048, 0x080c, 0x2a44, 0x7828, 0x9085,
+	0x0028, 0x782a, 0x2001, 0x19a7, 0x2003, 0x0000, 0x9006, 0x78f2,
 	0x015e, 0x003e, 0x000e, 0x012e, 0x00fe, 0x004e, 0x002e, 0x001e,
 	0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x0046, 0x00b6, 0x00c6,
-	0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0071, 0x0d0c, 0x85f4, 0x015e,
+	0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0071, 0x0d0c, 0x86f9, 0x015e,
 	0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x004e, 0x003e, 0x002e,
 	0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x189e, 0x7004, 0x9086,
-	0x0001, 0x1110, 0x080c, 0x345b, 0x00ee, 0x0005, 0x0005, 0x2a70,
-	0x2061, 0x19a9, 0x2063, 0x0003, 0x6007, 0x0002, 0x600b, 0x0015,
+	0x0001, 0x1110, 0x080c, 0x3494, 0x00ee, 0x0005, 0x0005, 0x2a70,
+	0x2061, 0x19ab, 0x2063, 0x0003, 0x6007, 0x0002, 0x600b, 0x001a,
 	0x600f, 0x0137, 0x2001, 0x197c, 0x900e, 0x2102, 0x7196, 0x2001,
 	0x0100, 0x2004, 0x9082, 0x0002, 0x0218, 0x705f, 0xffff, 0x0008,
-	0x715e, 0x7067, 0xffff, 0x717e, 0x7182, 0x080c, 0xcb83, 0x70ef,
+	0x715e, 0x7067, 0xffff, 0x717e, 0x7182, 0x080c, 0xcc7b, 0x70ef,
 	0x00c0, 0x2061, 0x196c, 0x6003, 0x0909, 0x6106, 0x600b, 0x8800,
 	0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x001f, 0x611a, 0x601f,
 	0x07d0, 0x2061, 0x1974, 0x6003, 0x8000, 0x6106, 0x610a, 0x600f,
 	0x0200, 0x6013, 0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, 0x2061,
-	0x1987, 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f,
-	0x2020, 0x2001, 0x182c, 0x2102, 0x0005, 0x9016, 0x080c, 0x652d,
+	0x1989, 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f,
+	0x2020, 0x2001, 0x182c, 0x2102, 0x0005, 0x9016, 0x080c, 0x661e,
 	0x1178, 0xb804, 0x90c4, 0x00ff, 0x98c6, 0x0006, 0x0128, 0x90c4,
 	0xff00, 0x98c6, 0x0600, 0x1120, 0x9186, 0x0080, 0x0108, 0x8210,
 	0x8108, 0x9186, 0x0800, 0x1d50, 0x2208, 0x0005, 0x2091, 0x8000,
@@ -229,29 +229,29 @@ unsigned short risc_code01[] = { 
 	0x0d7f, 0x0006, 0x0016, 0x2001, 0x8002, 0x0006, 0x2079, 0x0000,
 	0x000e, 0x7882, 0x7836, 0x001e, 0x798e, 0x000e, 0x788a, 0x000e,
 	0x7886, 0x3900, 0x789a, 0x7833, 0x0012, 0x2091, 0x5000, 0x0156,
-	0x00d6, 0x0036, 0x0026, 0x2079, 0x0300, 0x2069, 0x1b22, 0x7a08,
-	0x226a, 0x2069, 0x1b23, 0x7a18, 0x226a, 0x8d68, 0x7a1c, 0x226a,
-	0x782c, 0x2019, 0x1b30, 0x201a, 0x2019, 0x1b33, 0x9016, 0x7808,
-	0xd09c, 0x0168, 0x7820, 0x201a, 0x8210, 0x8318, 0x9386, 0x1b4c,
+	0x00d6, 0x0036, 0x0026, 0x2079, 0x0300, 0x2069, 0x1b24, 0x7a08,
+	0x226a, 0x2069, 0x1b25, 0x7a18, 0x226a, 0x8d68, 0x7a1c, 0x226a,
+	0x782c, 0x2019, 0x1b32, 0x201a, 0x2019, 0x1b35, 0x9016, 0x7808,
+	0xd09c, 0x0168, 0x7820, 0x201a, 0x8210, 0x8318, 0x9386, 0x1b4e,
 	0x0108, 0x0ca8, 0x7808, 0xd09c, 0x0110, 0x2011, 0xdead, 0x2019,
-	0x1b31, 0x782c, 0x201a, 0x8318, 0x221a, 0x7803, 0x0000, 0x2069,
-	0x1a78, 0x901e, 0x20a9, 0x0020, 0x7b26, 0x7a28, 0x226a, 0x8d68,
+	0x1b33, 0x782c, 0x201a, 0x8318, 0x221a, 0x7803, 0x0000, 0x2069,
+	0x1a7a, 0x901e, 0x20a9, 0x0020, 0x7b26, 0x7a28, 0x226a, 0x8d68,
 	0x8318, 0x1f04, 0x0dcc, 0x0491, 0x002e, 0x003e, 0x00de, 0x015e,
 	0x2079, 0x1800, 0x7803, 0x0005, 0x2091, 0x4080, 0x2001, 0x0089,
-	0x2004, 0xd084, 0x0180, 0x2001, 0x1a20, 0x2004, 0x9005, 0x0128,
+	0x2004, 0xd084, 0x0180, 0x2001, 0x1a22, 0x2004, 0x9005, 0x0128,
 	0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003,
-	0x0002, 0x2003, 0x1001, 0x080c, 0x560b, 0x1170, 0x080c, 0x0f13,
-	0x0110, 0x080c, 0x0e66, 0x080c, 0x560b, 0x1130, 0x2071, 0x1800,
+	0x0002, 0x2003, 0x1001, 0x080c, 0x56e2, 0x1170, 0x080c, 0x0f13,
+	0x0110, 0x080c, 0x0e66, 0x080c, 0x56e2, 0x1130, 0x2071, 0x1800,
 	0x2011, 0x8000, 0x080c, 0x0f27, 0x0c70, 0x0005, 0x2001, 0x0382,
 	0x2004, 0x9084, 0x0007, 0x9086, 0x0001, 0x1120, 0x2001, 0x0015,
-	0x080c, 0xa772, 0x2079, 0x0380, 0x2069, 0x1b02, 0x7818, 0x6802,
+	0x080c, 0xa863, 0x2079, 0x0380, 0x2069, 0x1b04, 0x7818, 0x6802,
 	0x781c, 0x6806, 0x7840, 0x680a, 0x7844, 0x680e, 0x782c, 0x6812,
-	0x2019, 0x1b0d, 0x9016, 0x7808, 0xd09c, 0x0150, 0x7820, 0x201a,
+	0x2019, 0x1b0f, 0x9016, 0x7808, 0xd09c, 0x0150, 0x7820, 0x201a,
 	0x8210, 0x8318, 0x8210, 0x9282, 0x0011, 0x0ea8, 0x2011, 0xdead,
 	0x6a2a, 0x7830, 0x681a, 0x7834, 0x681e, 0x7838, 0x6822, 0x783c,
-	0x6826, 0x7803, 0x0000, 0x2069, 0x1ac2, 0x901e, 0x20a9, 0x0020,
+	0x6826, 0x7803, 0x0000, 0x2069, 0x1ac4, 0x901e, 0x20a9, 0x0020,
 	0x7b26, 0x7828, 0x206a, 0x8d68, 0x8318, 0x1f04, 0x0e40, 0x2069,
-	0x1ae2, 0x2019, 0x00b0, 0x20a9, 0x0020, 0x7b26, 0x7828, 0x206a,
+	0x1ae4, 0x2019, 0x00b0, 0x20a9, 0x0020, 0x7b26, 0x7828, 0x206a,
 	0x8d68, 0x8318, 0x1f04, 0x0e4d, 0x0005, 0x918c, 0x03ff, 0x2001,
 	0x0003, 0x2004, 0x9084, 0x0600, 0x1118, 0x918d, 0x6c00, 0x0010,
 	0x918d, 0x6400, 0x2001, 0x017f, 0x2102, 0x0005, 0x0026, 0x0126,
@@ -266,7 +266,7 @@ unsigned short risc_code01[] = { 
 	0x0148, 0xd0a4, 0x1138, 0x2011, 0xcdd5, 0x0010, 0x2011, 0x0080,
 	0x080c, 0x0f18, 0x002e, 0x0005, 0x0026, 0x70f3, 0x0000, 0x080c,
 	0x0f13, 0x1130, 0x2011, 0x8040, 0x080c, 0x0f27, 0x002e, 0x0005,
-	0x080c, 0x29af, 0x1118, 0x2011, 0xcdc5, 0x0010, 0x2011, 0xcac2,
+	0x080c, 0x29e8, 0x1118, 0x2011, 0xcdc5, 0x0010, 0x2011, 0xcac2,
 	0x080c, 0x0f18, 0x002e, 0x0005, 0x00e6, 0x0016, 0x0006, 0x2071,
 	0x1800, 0xd0b4, 0x70ec, 0x71e8, 0x1118, 0xc0e4, 0xc1f4, 0x0050,
 	0x0006, 0x3b00, 0x9084, 0xff3e, 0x20d8, 0x000e, 0x70f3, 0x0000,
@@ -284,5948 +284,5979 @@ unsigned short risc_code01[] = { 
 	0x00c1, 0x0861, 0x0005, 0x1d04, 0x0f3b, 0x2091, 0x6000, 0x1f04,
 	0x0f3b, 0x0005, 0x890e, 0x810e, 0x810f, 0x9194, 0x003f, 0x918c,
 	0xffc0, 0x0005, 0x0006, 0x2200, 0x914d, 0x894f, 0x894d, 0x894d,
-	0x000e, 0x000e, 0x0005, 0x01d6, 0x0146, 0x0036, 0x0096, 0x2061,
-	0x188d, 0x600b, 0x0000, 0x600f, 0x0000, 0x6003, 0x0000, 0x6007,
-	0x0000, 0x2009, 0xffc0, 0x2105, 0x0006, 0x2001, 0xaaaa, 0x200f,
-	0x2019, 0x5555, 0x9016, 0x2049, 0x0bff, 0xab02, 0xa001, 0xa001,
-	0xa800, 0x9306, 0x1138, 0x2105, 0x9306, 0x0120, 0x8210, 0x99c8,
-	0x0400, 0x0c98, 0x000e, 0x200f, 0x2001, 0x189d, 0x928a, 0x000e,
-	0x1638, 0x928a, 0x0006, 0x2011, 0x0006, 0x1210, 0x2011, 0x0000,
-	0x2202, 0x9006, 0x2008, 0x82ff, 0x01b0, 0x8200, 0x600a, 0x600f,
-	0xffff, 0x6003, 0x0002, 0x6007, 0x0000, 0x0026, 0x2019, 0x0010,
-	0x9280, 0x0001, 0x20e8, 0x21a0, 0x21a8, 0x4104, 0x8319, 0x1de0,
-	0x8211, 0x1da0, 0x002e, 0x009e, 0x003e, 0x014e, 0x01de, 0x0005,
-	0x2011, 0x000e, 0x08e8, 0x0016, 0x0026, 0x0096, 0x3348, 0x080c,
-	0x0f42, 0x2100, 0x9300, 0x2098, 0x22e0, 0x009e, 0x002e, 0x001e,
-	0x0036, 0x3518, 0x20a9, 0x0001, 0x4002, 0x8007, 0x4004, 0x8319,
-	0x1dd8, 0x003e, 0x0005, 0x20e9, 0x0001, 0x71b8, 0x81ff, 0x11c0,
-	0x9006, 0x2009, 0x0200, 0x20a9, 0x0002, 0x9298, 0x0018, 0x23a0,
-	0x4001, 0x2009, 0x0700, 0x20a9, 0x0002, 0x9298, 0x0008, 0x23a0,
-	0x4001, 0x707c, 0x8007, 0x7180, 0x810f, 0x20a9, 0x0002, 0x4001,
-	0x9298, 0x000c, 0x23a0, 0x900e, 0x080c, 0x0d5d, 0x2001, 0x0000,
-	0x810f, 0x20a9, 0x0002, 0x4001, 0x0005, 0x89ff, 0x0140, 0xa804,
-	0xa807, 0x0000, 0x0006, 0x080c, 0x106d, 0x009e, 0x0cb0, 0x0005,
-	0x00e6, 0x2071, 0x1800, 0x080c, 0x10e6, 0x090c, 0x0d7d, 0x00ee,
-	0x0005, 0x0086, 0x00e6, 0x0006, 0x0026, 0x0036, 0x0126, 0x2091,
-	0x8000, 0x00c9, 0x2071, 0x1800, 0x73c0, 0x702c, 0x9016, 0x9045,
-	0x0158, 0x8210, 0x9906, 0x090c, 0x0d7d, 0x2300, 0x9202, 0x0120,
-	0x1a0c, 0x0d7d, 0xa000, 0x0c98, 0x012e, 0x003e, 0x002e, 0x000e,
-	0x00ee, 0x008e, 0x0005, 0x0086, 0x00e6, 0x0006, 0x0126, 0x2091,
-	0x8000, 0x2071, 0x1910, 0x7010, 0x9005, 0x0140, 0x7018, 0x9045,
-	0x0128, 0x9906, 0x090c, 0x0d7d, 0xa000, 0x0cc8, 0x012e, 0x000e,
-	0x00ee, 0x008e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x0126, 0x2091,
-	0x8000, 0x70c0, 0x8001, 0x0270, 0x70c2, 0x702c, 0x2048, 0x9085,
-	0x0001, 0xa800, 0x702e, 0xa803, 0x0000, 0xa807, 0x0000, 0x012e,
+	0x000e, 0x0005, 0x01d6, 0x0146, 0x0036, 0x0096, 0x2061, 0x188d,
+	0x600b, 0x0000, 0x600f, 0x0000, 0x6003, 0x0000, 0x6007, 0x0000,
+	0x2009, 0xffc0, 0x2105, 0x0006, 0x2001, 0xaaaa, 0x200f, 0x2019,
+	0x5555, 0x9016, 0x2049, 0x0bff, 0xab02, 0xa001, 0xa001, 0xa800,
+	0x9306, 0x1138, 0x2105, 0x9306, 0x0120, 0x8210, 0x99c8, 0x0400,
+	0x0c98, 0x000e, 0x200f, 0x2001, 0x189d, 0x928a, 0x000e, 0x1638,
+	0x928a, 0x0006, 0x2011, 0x0006, 0x1210, 0x2011, 0x0000, 0x2202,
+	0x9006, 0x2008, 0x82ff, 0x01b0, 0x8200, 0x600a, 0x600f, 0xffff,
+	0x6003, 0x0002, 0x6007, 0x0000, 0x0026, 0x2019, 0x0010, 0x9280,
+	0x0001, 0x20e8, 0x21a0, 0x21a8, 0x4104, 0x8319, 0x1de0, 0x8211,
+	0x1da0, 0x002e, 0x009e, 0x003e, 0x014e, 0x01de, 0x0005, 0x2011,
+	0x000e, 0x08e8, 0x0016, 0x0026, 0x0096, 0x3348, 0x080c, 0x0f42,
+	0x2100, 0x9300, 0x2098, 0x22e0, 0x009e, 0x002e, 0x001e, 0x0036,
+	0x3518, 0x20a9, 0x0001, 0x4002, 0x8007, 0x4004, 0x8319, 0x1dd8,
+	0x003e, 0x0005, 0x20e9, 0x0001, 0x71b8, 0x81ff, 0x11c0, 0x9006,
+	0x2009, 0x0200, 0x20a9, 0x0002, 0x9298, 0x0018, 0x23a0, 0x4001,
+	0x2009, 0x0700, 0x20a9, 0x0002, 0x9298, 0x0008, 0x23a0, 0x4001,
+	0x707c, 0x8007, 0x7180, 0x810f, 0x20a9, 0x0002, 0x4001, 0x9298,
+	0x000c, 0x23a0, 0x900e, 0x080c, 0x0d5d, 0x2001, 0x0000, 0x810f,
+	0x20a9, 0x0002, 0x4001, 0x0005, 0x89ff, 0x0140, 0xa804, 0xa807,
+	0x0000, 0x0006, 0x080c, 0x106c, 0x009e, 0x0cb0, 0x0005, 0x00e6,
+	0x2071, 0x1800, 0x080c, 0x10e5, 0x090c, 0x0d7d, 0x00ee, 0x0005,
+	0x0086, 0x00e6, 0x0006, 0x0026, 0x0036, 0x0126, 0x2091, 0x8000,
+	0x00c9, 0x2071, 0x1800, 0x73c0, 0x702c, 0x9016, 0x9045, 0x0158,
+	0x8210, 0x9906, 0x090c, 0x0d7d, 0x2300, 0x9202, 0x0120, 0x1a0c,
+	0x0d7d, 0xa000, 0x0c98, 0x012e, 0x003e, 0x002e, 0x000e, 0x00ee,
+	0x008e, 0x0005, 0x0086, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000,
+	0x2071, 0x1910, 0x7010, 0x9005, 0x0140, 0x7018, 0x9045, 0x0128,
+	0x9906, 0x090c, 0x0d7d, 0xa000, 0x0cc8, 0x012e, 0x000e, 0x00ee,
+	0x008e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x0126, 0x2091, 0x8000,
+	0x70c0, 0x8001, 0x0270, 0x70c2, 0x702c, 0x2048, 0x9085, 0x0001,
+	0xa800, 0x702e, 0xa803, 0x0000, 0xa807, 0x0000, 0x012e, 0x00ee,
+	0x0005, 0x904e, 0x0cd8, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071,
+	0x1800, 0x70c0, 0x90ca, 0x0020, 0x0268, 0x8001, 0x70c2, 0x702c,
+	0x2048, 0xa800, 0x702e, 0xa803, 0x0000, 0xa807, 0x0000, 0x012e,
 	0x00ee, 0x0005, 0x904e, 0x0cd8, 0x00e6, 0x0126, 0x2091, 0x8000,
-	0x2071, 0x1800, 0x70c0, 0x90ca, 0x0020, 0x0268, 0x8001, 0x70c2,
-	0x702c, 0x2048, 0xa800, 0x702e, 0xa803, 0x0000, 0xa807, 0x0000,
-	0x012e, 0x00ee, 0x0005, 0x904e, 0x0cd8, 0x00e6, 0x0126, 0x2091,
-	0x8000, 0x0016, 0x890e, 0x810e, 0x810f, 0x9184, 0x003f, 0xa862,
-	0x9184, 0xffc0, 0xa85e, 0x001e, 0x0020, 0x00e6, 0x0126, 0x2091,
-	0x8000, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0,
-	0x8000, 0x70c2, 0x080c, 0x8420, 0x012e, 0x00ee, 0x0005, 0x2071,
-	0x1800, 0x9026, 0x2009, 0x0000, 0x2049, 0x0400, 0x2900, 0x702e,
+	0x0016, 0x890e, 0x810e, 0x810f, 0x9184, 0x003f, 0xa862, 0x9184,
+	0xffc0, 0xa85e, 0x001e, 0x0020, 0x00e6, 0x0126, 0x2091, 0x8000,
+	0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000,
+	0x70c2, 0x080c, 0x8522, 0x012e, 0x00ee, 0x0005, 0x2071, 0x1800,
+	0x9026, 0x2009, 0x0000, 0x2049, 0x0400, 0x2900, 0x702e, 0x8940,
+	0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420, 0x9886, 0x0440,
+	0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, 0x188d, 0x7000,
+	0x9005, 0x11a0, 0x2001, 0x0558, 0xa802, 0x2048, 0x2009, 0x5600,
 	0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420, 0x9886,
-	0x0440, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, 0x188d,
-	0x7000, 0x9005, 0x11a0, 0x2001, 0x0558, 0xa802, 0x2048, 0x2009,
-	0x5600, 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420,
-	0x9886, 0x0800, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071,
-	0x188d, 0x7104, 0x7200, 0x82ff, 0x01d0, 0x7308, 0x8318, 0x831f,
-	0x831b, 0x831b, 0x7312, 0x8319, 0x2001, 0x0800, 0xa802, 0x2048,
-	0x8900, 0xa802, 0x2040, 0xa95e, 0xaa62, 0x8420, 0x2300, 0x9906,
-	0x0130, 0x2848, 0x9188, 0x0040, 0x9291, 0x0000, 0x0c88, 0xa803,
-	0x0000, 0x2071, 0x1800, 0x74be, 0x74c2, 0x0005, 0x00e6, 0x0016,
-	0x9984, 0xfc00, 0x01e8, 0x908c, 0xf800, 0x1168, 0x9982, 0x0400,
-	0x02b8, 0x9982, 0x0440, 0x0278, 0x9982, 0x0558, 0x0288, 0x9982,
-	0x0800, 0x1270, 0x0040, 0x9982, 0x0800, 0x0250, 0x2071, 0x188d,
-	0x7010, 0x9902, 0x1228, 0x9085, 0x0001, 0x001e, 0x00ee, 0x0005,
-	0x9006, 0x0cd8, 0x00e6, 0x2071, 0x1a1f, 0x7007, 0x0000, 0x9006,
-	0x701e, 0x7022, 0x7002, 0x2071, 0x0000, 0x7010, 0x9085, 0x8044,
-	0x7012, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0xa06f,
-	0x0000, 0x2071, 0x1a1f, 0x701c, 0x9088, 0x1a29, 0x280a, 0x8000,
-	0x9084, 0x003f, 0x701e, 0x7120, 0x9106, 0x090c, 0x0d7d, 0x7004,
-	0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x00a9, 0x00fe, 0x00ee,
-	0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0x2071, 0x1a1f,
-	0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x0021, 0x00fe,
-	0x00ee, 0x012e, 0x0005, 0x7004, 0x9086, 0x0000, 0x1110, 0x7007,
-	0x0006, 0x7000, 0x0002, 0x115d, 0x12e0, 0x115b, 0x115b, 0x12d4,
-	0x12d4, 0x12d4, 0x12d4, 0x080c, 0x0d7d, 0x701c, 0x7120, 0x9106,
-	0x1148, 0x792c, 0x9184, 0x0001, 0x1120, 0xd1fc, 0x1110, 0x7007,
-	0x0000, 0x0005, 0x0096, 0x9180, 0x1a29, 0x2004, 0x700a, 0x2048,
-	0x8108, 0x918c, 0x003f, 0x7122, 0x782b, 0x0026, 0xa88c, 0x7802,
-	0xa890, 0x7806, 0xa894, 0x780a, 0xa898, 0x780e, 0xa878, 0x700e,
-	0xa870, 0x7016, 0xa874, 0x701a, 0xa868, 0x009e, 0xd084, 0x0120,
-	0x7007, 0x0001, 0x0029, 0x0005, 0x7007, 0x0002, 0x00b1, 0x0005,
-	0x0016, 0x0026, 0x710c, 0x2011, 0x0040, 0x9182, 0x0040, 0x1210,
-	0x2110, 0x9006, 0x700e, 0x7212, 0x8203, 0x7812, 0x782b, 0x0020,
-	0x782b, 0x0041, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x0136,
-	0x0146, 0x0156, 0x7014, 0x20e0, 0x7018, 0x2098, 0x20e9, 0x0000,
-	0x20a1, 0x0088, 0x782b, 0x0026, 0x710c, 0x2011, 0x0040, 0x9182,
-	0x0040, 0x1210, 0x2110, 0x9006, 0x700e, 0x22a8, 0x4006, 0x8203,
-	0x7812, 0x782b, 0x0020, 0x3300, 0x701a, 0x782b, 0x0001, 0x015e,
-	0x014e, 0x013e, 0x002e, 0x001e, 0x0005, 0x2009, 0x1a1f, 0x2104,
-	0xc095, 0x200a, 0x080c, 0x113a, 0x0005, 0x0016, 0x00e6, 0x2071,
-	0x1a1f, 0x00f6, 0x2079, 0x0080, 0x792c, 0xd1bc, 0x190c, 0x0d76,
-	0x782b, 0x0002, 0xd1fc, 0x0120, 0x918c, 0x0700, 0x7004, 0x0023,
-	0x00fe, 0x00ee, 0x001e, 0x0005, 0x114b, 0x11f3, 0x1227, 0x12ff,
-	0x0d7d, 0x131a, 0x0d7d, 0x918c, 0x0700, 0x1550, 0x0136, 0x0146,
-	0x0156, 0x7014, 0x20e8, 0x7018, 0x20a0, 0x20e1, 0x0000, 0x2099,
-	0x0088, 0x782b, 0x0040, 0x7010, 0x20a8, 0x4005, 0x3400, 0x701a,
-	0x015e, 0x014e, 0x013e, 0x700c, 0x9005, 0x0578, 0x7800, 0x7802,
-	0x7804, 0x7806, 0x080c, 0x1190, 0x0005, 0x7008, 0x0096, 0x2048,
-	0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x080c, 0x114b, 0x0005,
-	0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e, 0x0ca0, 0x918c,
-	0x0700, 0x1150, 0x700c, 0x9005, 0x0180, 0x7800, 0x7802, 0x7804,
-	0x7806, 0x080c, 0x11a5, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f,
-	0x0200, 0x009e, 0x7007, 0x0000, 0x0080, 0x0096, 0x7008, 0x2048,
-	0x7800, 0xa88e, 0x7804, 0xa892, 0x7808, 0xa896, 0x780c, 0xa89a,
-	0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x0096, 0x00d6, 0x7008,
-	0x2048, 0x2001, 0x18b9, 0x2004, 0x9906, 0x1128, 0xa89c, 0x080f,
-	0x00de, 0x009e, 0x00a0, 0x00de, 0x009e, 0x0096, 0x00d6, 0x7008,
-	0x2048, 0x0081, 0x0150, 0xa89c, 0x0086, 0x2940, 0x080f, 0x008e,
-	0x00de, 0x009e, 0x080c, 0x113a, 0x0005, 0x00de, 0x009e, 0x080c,
-	0x113a, 0x0005, 0xa8a8, 0xd08c, 0x0005, 0x0096, 0xa0a0, 0x904d,
-	0x090c, 0x0d7d, 0xa06c, 0x908e, 0x0100, 0x0130, 0xa87b, 0x0030,
-	0xa883, 0x0000, 0xa897, 0x4002, 0x080c, 0x6c73, 0xa09f, 0x0000,
-	0xa0a3, 0x0000, 0x2848, 0x080c, 0x106d, 0x009e, 0x0005, 0x00a6,
-	0xa0a0, 0x904d, 0x090c, 0x0d7d, 0xa06c, 0x908e, 0x0100, 0x0128,
-	0xa87b, 0x0001, 0xa883, 0x0000, 0x00c0, 0xa80c, 0x2050, 0xb004,
-	0x9005, 0x0198, 0xa80e, 0x2050, 0x8006, 0x8006, 0x8007, 0x908c,
-	0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0xa076, 0xa172, 0xb000,
-	0xa07a, 0x2810, 0x080c, 0x111b, 0x00e8, 0xa97c, 0xa894, 0x0016,
-	0x0006, 0x080c, 0x6c73, 0x000e, 0x001e, 0xd1fc, 0x1138, 0xd1f4,
-	0x0128, 0x00c6, 0x2060, 0x080c, 0xaad8, 0x00ce, 0x7008, 0x2048,
-	0xa89f, 0x0000, 0xa8a3, 0x0000, 0x080c, 0x106d, 0x7007, 0x0000,
-	0x080c, 0x113a, 0x00ae, 0x0005, 0x0126, 0x2091, 0x8000, 0x782b,
-	0x1001, 0x7007, 0x0005, 0x7000, 0xc094, 0x7002, 0x012e, 0x0005,
-	0x0096, 0x2001, 0x192e, 0x204c, 0xa87c, 0x7812, 0xa88c, 0x7802,
-	0xa890, 0x7806, 0xa894, 0x780a, 0xa898, 0x780e, 0x782b, 0x0020,
-	0x0126, 0x2091, 0x8000, 0x782b, 0x0041, 0x7007, 0x0003, 0x7000,
-	0xc084, 0x7002, 0x2900, 0x700a, 0x012e, 0x009e, 0x0005, 0x20e1,
-	0x0000, 0x2099, 0x0088, 0x782b, 0x0040, 0x0096, 0x2001, 0x192e,
-	0x204c, 0xaa7c, 0x009e, 0x080c, 0x8ae5, 0x2009, 0x188c, 0x2104,
-	0x9084, 0xfffc, 0x200a, 0x080c, 0x8958, 0x7007, 0x0000, 0x080c,
-	0x114b, 0x0005, 0x7007, 0x0000, 0x080c, 0x114b, 0x0005, 0x0126,
-	0x2091, 0x2200, 0x2079, 0x0300, 0x2071, 0x1a69, 0x7003, 0x0000,
-	0x78bf, 0x00f6, 0x0041, 0x7807, 0x0007, 0x7803, 0x0000, 0x7803,
-	0x0001, 0x012e, 0x0005, 0x00c6, 0x7803, 0x0000, 0x2001, 0x0165,
-	0x2003, 0x4198, 0x7808, 0xd09c, 0x0118, 0x7820, 0x04e9, 0x0cd0,
-	0x2001, 0x1a6a, 0x2003, 0x0000, 0x78ab, 0x0004, 0x78ac, 0xd0ac,
-	0x1de8, 0x78ab, 0x0002, 0x7807, 0x0007, 0x7827, 0x0030, 0x782b,
-	0x0400, 0x7827, 0x0031, 0x782b, 0x1a78, 0x781f, 0xff00, 0x781b,
-	0xff00, 0x2001, 0x0200, 0x2004, 0xd0dc, 0x0110, 0x781f, 0x0303,
-	0x2061, 0x1a78, 0x602f, 0x1ddc, 0x2001, 0x181a, 0x2004, 0x9082,
-	0x1ddc, 0x6032, 0x603b, 0x1e31, 0x602b, 0x1ab8, 0x6007, 0x1a98,
-	0x2061, 0x1a98, 0x60af, 0x193c, 0x2001, 0x1927, 0x2004, 0x60ba,
-	0x783f, 0x3334, 0x00ce, 0x0005, 0x9086, 0x000d, 0x11d0, 0x7808,
-	0xd09c, 0x01b8, 0x7820, 0x0026, 0x2010, 0x080c, 0xc711, 0x0180,
-	0x2260, 0x6000, 0x9086, 0x0004, 0x1158, 0x0016, 0x6120, 0x9186,
-	0x0009, 0x0108, 0x0020, 0x2009, 0x004c, 0x080c, 0xab77, 0x001e,
-	0x002e, 0x0005, 0x0126, 0x2091, 0x2200, 0x7908, 0x9184, 0x0070,
-	0x190c, 0x0d76, 0xd19c, 0x05a0, 0x7820, 0x908c, 0xf000, 0x0540,
-	0x2060, 0x6020, 0x9086, 0x0003, 0x1550, 0x6000, 0x9086, 0x0004,
-	0x1530, 0x6114, 0x2148, 0xa876, 0xa87a, 0xa867, 0x0103, 0x080c,
-	0x6a95, 0x00b6, 0x6010, 0x2058, 0xba3c, 0x8211, 0x0208, 0xba3e,
-	0xb8d0, 0x9005, 0x190c, 0x6658, 0x00be, 0x6044, 0xd0fc, 0x190c,
-	0xa7aa, 0x080c, 0xab01, 0x7808, 0xd09c, 0x19b0, 0x012e, 0x0005,
-	0x908a, 0x0024, 0x1a0c, 0x0d7d, 0x002b, 0x012e, 0x0005, 0x04b0,
-	0x012e, 0x0005, 0x13fe, 0x1424, 0x1454, 0x1459, 0x145d, 0x1462,
-	0x148a, 0x148e, 0x149c, 0x14a0, 0x13fe, 0x156b, 0x156f, 0x15d4,
-	0x15db, 0x13fe, 0x15dc, 0x15dd, 0x15e8, 0x15ef, 0x13fe, 0x13fe,
-	0x13fe, 0x13fe, 0x13fe, 0x13fe, 0x13fe, 0x1464, 0x13fe, 0x142c,
-	0x1451, 0x1418, 0x13fe, 0x1438, 0x1402, 0x1400, 0x080c, 0x0d7d,
-	0x080c, 0x0d76, 0x080c, 0x15fa, 0x2009, 0x1a77, 0x2104, 0x8000,
-	0x200a, 0x080c, 0x7e7f, 0x080c, 0x1a9e, 0x0005, 0x6044, 0xd0fc,
-	0x190c, 0xa7aa, 0x2009, 0x0055, 0x080c, 0xab77, 0x012e, 0x0005,
-	0x080c, 0x15fa, 0x2060, 0x6044, 0xd0fc, 0x190c, 0xa7aa, 0x2009,
-	0x0055, 0x080c, 0xab77, 0x0005, 0x2009, 0x0048, 0x080c, 0x15fa,
-	0x2060, 0x080c, 0xab77, 0x0005, 0x2009, 0x0054, 0x080c, 0x15fa,
-	0x2060, 0x6044, 0xd0fc, 0x190c, 0xa7aa, 0x080c, 0xab77, 0x0005,
-	0x080c, 0x15fa, 0x2060, 0x0056, 0x0066, 0x080c, 0x15fa, 0x2028,
-	0x080c, 0x15fa, 0x2030, 0x0036, 0x0046, 0x2021, 0x0000, 0x2418,
-	0x2009, 0x0056, 0x080c, 0xab77, 0x004e, 0x003e, 0x006e, 0x005e,
-	0x0005, 0x080c, 0x15fa, 0x0005, 0x7004, 0xc085, 0xc0b5, 0x7006,
-	0x0005, 0x7004, 0xc085, 0x7006, 0x0005, 0x080c, 0x15fa, 0x080c,
-	0x16be, 0x0005, 0x080c, 0x0d7d, 0x080c, 0x15fa, 0x2060, 0x6014,
-	0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c,
-	0xab77, 0x2001, 0x015d, 0x2003, 0x0000, 0x2009, 0x03e8, 0x8109,
-	0x0160, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218,
-	0x2004, 0xd0ec, 0x1110, 0x080c, 0x15ff, 0x2001, 0x0307, 0x2003,
-	0x8000, 0x0005, 0x7004, 0xc095, 0x7006, 0x0005, 0x080c, 0x15fa,
-	0x2060, 0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009,
-	0x0048, 0x080c, 0xab77, 0x0005, 0x080c, 0x15fa, 0x080c, 0x0d7d,
-	0x080c, 0x15fa, 0x080c, 0x1556, 0x7827, 0x0018, 0x79ac, 0xd1dc,
-	0x0904, 0x1509, 0x7827, 0x0015, 0x7828, 0x782b, 0x0000, 0x9065,
-	0x0140, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0804,
-	0x150f, 0x7004, 0x9005, 0x01c8, 0x1188, 0x78ab, 0x0004, 0x7827,
-	0x0018, 0x782b, 0x0000, 0xd1bc, 0x090c, 0x0d7d, 0x2001, 0x020d,
-	0x2003, 0x0050, 0x2003, 0x0020, 0x0804, 0x153b, 0x78ab, 0x0004,
-	0x7803, 0x0001, 0x080c, 0x156f, 0x0005, 0x7827, 0x0018, 0xa001,
-	0x7828, 0x7827, 0x0011, 0xa001, 0x7928, 0x9106, 0x0110, 0x79ac,
-	0x08e0, 0x00e6, 0x2071, 0x0200, 0x702c, 0xd0c4, 0x0140, 0x00ee,
-	0x080c, 0x1a9e, 0x080c, 0x1333, 0x7803, 0x0001, 0x0005, 0x7037,
-	0x0001, 0xa001, 0x7150, 0x00ee, 0x918c, 0xff00, 0x9186, 0x0500,
-	0x0110, 0x79ac, 0x0810, 0x7004, 0xc09d, 0x7006, 0x78ab, 0x0004,
-	0x7803, 0x0001, 0x080c, 0x156f, 0x2001, 0x020d, 0x2003, 0x0020,
-	0x0005, 0x7828, 0x782b, 0x0000, 0x9065, 0x090c, 0x0d7d, 0x6014,
-	0x2048, 0x78ab, 0x0004, 0x918c, 0x0700, 0x0198, 0x080c, 0x7e7f,
-	0x080c, 0x1a9e, 0x080c, 0xc723, 0x0158, 0xa9ac, 0xa936, 0xa9b0,
-	0xa93a, 0xa83f, 0xffff, 0xa843, 0xffff, 0xa880, 0xc0bd, 0xa882,
-	0x0005, 0x6020, 0x9086, 0x0009, 0x1128, 0x2009, 0x004c, 0x080c,
-	0xab77, 0x0048, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc,
-	0x6024, 0x190c, 0xcb18, 0x2029, 0x00c8, 0x8529, 0x0128, 0x2001,
-	0x0201, 0x2004, 0x9005, 0x0dc8, 0x7dbc, 0x080c, 0xe573, 0xd5a4,
-	0x1118, 0x080c, 0x15ff, 0x0005, 0x080c, 0x7e7f, 0x080c, 0x1a9e,
-	0x0005, 0x781f, 0x0300, 0x7803, 0x0001, 0x0005, 0x0016, 0x0066,
-	0x0076, 0x00f6, 0x2079, 0x0300, 0x7908, 0x918c, 0x0007, 0x9186,
-	0x0003, 0x0120, 0x2001, 0x0016, 0x080c, 0x1670, 0x00fe, 0x007e,
-	0x006e, 0x001e, 0x0005, 0x7004, 0xc09d, 0x7006, 0x0005, 0x7104,
-	0x9184, 0x0004, 0x190c, 0x0d7d, 0xd184, 0x1189, 0xd19c, 0x0158,
-	0xc19c, 0x7106, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020,
-	0x080c, 0x15ff, 0x0005, 0x81ff, 0x190c, 0x0d7d, 0x0005, 0xc184,
-	0xd1b4, 0xc1b4, 0x7106, 0x0016, 0x00e6, 0x15f0, 0x2071, 0x0200,
-	0x080c, 0x16ab, 0x05c8, 0x6014, 0x9005, 0x05b0, 0x0096, 0x2048,
-	0xa864, 0x009e, 0x9084, 0x00ff, 0x908e, 0x0029, 0x0160, 0x908e,
-	0x0048, 0x1550, 0x601c, 0xd084, 0x11e0, 0x00f6, 0x2c78, 0x080c,
-	0x1728, 0x00fe, 0x00b0, 0x00f6, 0x2c78, 0x080c, 0x18ad, 0x00fe,
-	0x2009, 0x01f4, 0x8109, 0x0168, 0x2001, 0x0201, 0x2004, 0x9005,
-	0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec, 0x1118, 0x080c, 0x15ff,
-	0x0040, 0x2001, 0x020d, 0x2003, 0x0020, 0x080c, 0x1333, 0x7803,
-	0x0001, 0x00ee, 0x001e, 0x0005, 0x2001, 0x020d, 0x2003, 0x0050,
-	0x2003, 0x0020, 0x0461, 0x0ca8, 0x0429, 0x2060, 0x2009, 0x0053,
-	0x080c, 0xab77, 0x0005, 0x0005, 0x0005, 0x00e1, 0x2008, 0x00d1,
-	0x0006, 0x7004, 0xc09d, 0x7006, 0x000e, 0x080c, 0x8e42, 0x0005,
-	0x0089, 0x9005, 0x0118, 0x080c, 0x8a45, 0x0cd0, 0x0005, 0x2001,
-	0x0036, 0x2009, 0x1820, 0x210c, 0x2011, 0x181f, 0x2214, 0x080c,
-	0x1670, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x0005, 0x080c,
-	0x1556, 0x00d6, 0x2069, 0x0200, 0x2009, 0x01f4, 0x8109, 0x0510,
-	0x6804, 0x9005, 0x0dd8, 0x2001, 0x015d, 0x2003, 0x0000, 0x79bc,
-	0xd1a4, 0x1528, 0x79b8, 0x918c, 0x0fff, 0x0180, 0x9182, 0x0841,
-	0x1268, 0x9188, 0x0007, 0x918c, 0x0ff8, 0x810c, 0x810c, 0x810c,
-	0x080c, 0x1662, 0x6827, 0x0001, 0x8109, 0x1dd0, 0x04d9, 0x6827,
-	0x0002, 0x04c1, 0x6804, 0x9005, 0x1130, 0x682c, 0xd0e4, 0x1500,
-	0x6804, 0x9005, 0x0de8, 0x79b8, 0xd1ec, 0x1130, 0x08c0, 0x080c,
-	0x7e7f, 0x080c, 0x1a9e, 0x0090, 0x7827, 0x0015, 0x782b, 0x0000,
-	0x7827, 0x0018, 0x782b, 0x0000, 0x2001, 0x020d, 0x2003, 0x0020,
-	0x2001, 0x0307, 0x2003, 0x0300, 0x7803, 0x0001, 0x00de, 0x0005,
-	0x682c, 0x9084, 0x5400, 0x9086, 0x5400, 0x0d30, 0x7827, 0x0015,
-	0x782b, 0x0000, 0x7803, 0x0001, 0x6800, 0x9085, 0x1800, 0x6802,
-	0x00de, 0x0005, 0x6824, 0x9084, 0x0003, 0x1de0, 0x0005, 0x2001,
-	0x0030, 0x2c08, 0x621c, 0x0021, 0x7830, 0x9086, 0x0041, 0x0005,
-	0x00f6, 0x2079, 0x0300, 0x0006, 0x7808, 0xd09c, 0x0140, 0x0016,
-	0x0026, 0x00c6, 0x080c, 0x139a, 0x00ce, 0x002e, 0x001e, 0x000e,
-	0x0006, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x0059, 0x1118,
-	0x000e, 0x00fe, 0x0005, 0x000e, 0x792c, 0x3900, 0x8000, 0x2004,
-	0x080c, 0x0d7d, 0x2009, 0xff00, 0x8109, 0x0120, 0x7818, 0xd0bc,
-	0x1dd8, 0x0005, 0x9085, 0x0001, 0x0005, 0x7832, 0x7936, 0x7a3a,
-	0x781b, 0x8080, 0x0c79, 0x1108, 0x0005, 0x792c, 0x3900, 0x8000,
-	0x2004, 0x080c, 0x0d7d, 0x7037, 0x0001, 0x7150, 0x7037, 0x0002,
-	0x7050, 0x2060, 0xd1bc, 0x1110, 0x7054, 0x2060, 0x918c, 0xff00,
-	0x9186, 0x0500, 0x0110, 0x9085, 0x0001, 0x0005, 0x00e6, 0x0016,
-	0x2071, 0x0200, 0x0c41, 0x6124, 0xd1dc, 0x01f8, 0x701c, 0xd08c,
-	0x0904, 0x171d, 0x7017, 0x0000, 0x2001, 0x0264, 0x2004, 0xd0bc,
-	0x0904, 0x171d, 0x2001, 0x0268, 0x00c6, 0x2064, 0x6104, 0x6038,
-	0x00ce, 0x918e, 0x0039, 0x1904, 0x171d, 0x9c06, 0x15f0, 0x0126,
-	0x2091, 0x2600, 0x080c, 0x7de7, 0x012e, 0x7358, 0x745c, 0x6014,
-	0x905d, 0x0598, 0x2b48, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be,
-	0xd0bc, 0x190c, 0xcaf3, 0xab42, 0xac3e, 0x2001, 0x1869, 0x2004,
-	0xd0b4, 0x1170, 0x601c, 0xd0e4, 0x1158, 0x6010, 0x00b6, 0x2058,
-	0xb800, 0x00be, 0xd0bc, 0x1120, 0xa83b, 0x7fff, 0xa837, 0xffff,
-	0x080c, 0x1e51, 0x1190, 0x080c, 0x18fc, 0x2a00, 0xa816, 0x0130,
-	0x2800, 0xa80e, 0x2c05, 0xa80a, 0x2c00, 0xa812, 0x7037, 0x0020,
-	0x781f, 0x0300, 0x001e, 0x00ee, 0x0005, 0x7037, 0x0050, 0x7037,
-	0x0020, 0x001e, 0x00ee, 0x080c, 0x15ff, 0x0005, 0x080c, 0x0d7d,
-	0x2cf0, 0x0126, 0x2091, 0x2200, 0x3e60, 0x6014, 0x2048, 0x2940,
-	0x903e, 0x2730, 0xa864, 0x2068, 0xa81a, 0x9d84, 0x000f, 0x9088,
-	0x1e31, 0x2165, 0x0002, 0x1752, 0x17c0, 0x1752, 0x1752, 0x1756,
-	0x17a1, 0x1752, 0x1776, 0x174b, 0x17b7, 0x1752, 0x1752, 0x175b,
-	0x18ab, 0x178a, 0x1780, 0xa964, 0x918c, 0x00ff, 0x918e, 0x0048,
-	0x0904, 0x17b7, 0x9085, 0x0001, 0x0804, 0x18a3, 0xa87c, 0xd0ac,
-	0x0dc8, 0x0804, 0x17c7, 0xa87c, 0xd0ac, 0x0da0, 0x0804, 0x1832,
-	0xa898, 0x901d, 0x1108, 0xab9c, 0x9016, 0xaab2, 0xaa3e, 0xaa42,
-	0x3e00, 0x9080, 0x0008, 0x2004, 0x9080, 0x900b, 0x2005, 0x9005,
-	0x090c, 0x0d7d, 0x2004, 0xa8ae, 0x0804, 0x188b, 0xa87c, 0xd0bc,
-	0x09c8, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, 0x17c7,
-	0xa87c, 0xd0bc, 0x0978, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888,
-	0x0804, 0x1832, 0xa87c, 0xd0bc, 0x0928, 0xa890, 0xa842, 0xa88c,
-	0xa83e, 0xa804, 0x9045, 0x090c, 0x0d7d, 0xa164, 0xa91a, 0x91ec,
-	0x000f, 0x9d80, 0x1e31, 0x2065, 0xa888, 0xd19c, 0x1904, 0x1832,
-	0x0430, 0xa87c, 0xd0ac, 0x0904, 0x1752, 0xa804, 0x9045, 0x090c,
-	0x0d7d, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1e31, 0x2065,
-	0x9006, 0xa842, 0xa83e, 0xd19c, 0x1904, 0x1832, 0x0080, 0xa87c,
-	0xd0ac, 0x0904, 0x1752, 0x9006, 0xa842, 0xa83e, 0x0804, 0x1832,
-	0xa87c, 0xd0ac, 0x0904, 0x1752, 0x9006, 0xa842, 0xa83e, 0x2c05,
-	0x908a, 0x0036, 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002, 0x17ea,
-	0x17ea, 0x17ec, 0x17ea, 0x17ea, 0x17ea, 0x17f6, 0x17ea, 0x17ea,
-	0x17ea, 0x1800, 0x17ea, 0x17ea, 0x17ea, 0x180a, 0x17ea, 0x17ea,
-	0x17ea, 0x1814, 0x17ea, 0x17ea, 0x17ea, 0x181e, 0x17ea, 0x17ea,
-	0x17ea, 0x1828, 0x080c, 0x0d7d, 0xa574, 0xa478, 0x9d86, 0x0024,
-	0x0904, 0x1760, 0xa37c, 0xa280, 0x0804, 0x188b, 0xa584, 0xa488,
-	0x9d86, 0x0024, 0x0904, 0x1760, 0xa38c, 0xa290, 0x0804, 0x188b,
-	0xa594, 0xa498, 0x9d86, 0x0024, 0x0904, 0x1760, 0xa39c, 0xa2a0,
-	0x0804, 0x188b, 0xa5a4, 0xa4a8, 0x9d86, 0x0024, 0x0904, 0x1760,
-	0xa3ac, 0xa2b0, 0x0804, 0x188b, 0xa5b4, 0xa4b8, 0x9d86, 0x0024,
-	0x0904, 0x1760, 0xa3bc, 0xa2c0, 0x0804, 0x188b, 0xa5c4, 0xa4c8,
-	0x9d86, 0x0024, 0x0904, 0x1760, 0xa3cc, 0xa2d0, 0x0804, 0x188b,
-	0xa5d4, 0xa4d8, 0x9d86, 0x0024, 0x0904, 0x1760, 0xa3dc, 0xa2e0,
-	0x0804, 0x188b, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d7d, 0x9082,
-	0x001b, 0x0002, 0x1855, 0x1853, 0x1853, 0x1853, 0x1853, 0x1853,
-	0x1860, 0x1853, 0x1853, 0x1853, 0x1853, 0x1853, 0x186b, 0x1853,
-	0x1853, 0x1853, 0x1853, 0x1853, 0x1876, 0x1853, 0x1853, 0x1853,
-	0x1853, 0x1853, 0x1881, 0x080c, 0x0d7d, 0xa56c, 0xa470, 0xa774,
-	0xa678, 0x9d86, 0x002c, 0x0904, 0x1760, 0xa37c, 0xa280, 0x0458,
-	0xa584, 0xa488, 0xa78c, 0xa690, 0x9d86, 0x002c, 0x0904, 0x1760,
-	0xa394, 0xa298, 0x0400, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0x9d86,
-	0x002c, 0x0904, 0x1760, 0xa3ac, 0xa2b0, 0x00a8, 0xa5b4, 0xa4b8,
-	0xa7bc, 0xa6c0, 0x9d86, 0x002c, 0x0904, 0x1760, 0xa3c4, 0xa2c8,
-	0x0050, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0x9d86, 0x002c, 0x0904,
-	0x1760, 0xa3dc, 0xa2e0, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26,
-	0xae2a, 0xa988, 0x8c60, 0x2c1d, 0xa8ac, 0xaab0, 0xa836, 0xaa3a,
-	0x8109, 0xa916, 0x1150, 0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c,
-	0xc0dd, 0xa87e, 0x9006, 0x012e, 0x0005, 0x2800, 0xa80e, 0xab0a,
-	0x2c00, 0xa812, 0x0c80, 0x0804, 0x1752, 0x2ff0, 0x0126, 0x2091,
-	0x2200, 0x3e60, 0x6014, 0x2048, 0x2940, 0xa80e, 0x2061, 0x1e2c,
-	0xa813, 0x1e2c, 0x2c05, 0xa80a, 0xa964, 0xa91a, 0xa87c, 0xd0ac,
-	0x090c, 0x0d7d, 0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0034,
-	0x1a0c, 0x0d7d, 0xadcc, 0xacd0, 0xafd4, 0xaed8, 0xabdc, 0xaae0,
-	0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa8ac, 0xaab0,
-	0xa836, 0xaa3a, 0xa988, 0x918a, 0x0002, 0xa916, 0x1150, 0x3e60,
-	0x601c, 0xc085, 0x601e, 0xa87c, 0xc0dd, 0xa87e, 0x9006, 0x012e,
-	0x0005, 0xa804, 0x9045, 0x090c, 0x0d7d, 0xa80e, 0xa064, 0xa81a,
-	0x9084, 0x000f, 0x9080, 0x1e31, 0x2015, 0x82ff, 0x090c, 0x0d7d,
-	0xaa12, 0x2205, 0xa80a, 0x0c18, 0x903e, 0x2730, 0xa880, 0xd0fc,
-	0x1190, 0x2d00, 0x0002, 0x1a26, 0x1953, 0x1953, 0x1a26, 0x1953,
-	0x1a20, 0x1a26, 0x1953, 0x1a26, 0x19c3, 0x19c3, 0x1a26, 0x19c3,
-	0x1a26, 0x1a1d, 0x19c3, 0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c,
-	0xac20, 0xdd9c, 0x0904, 0x1a28, 0x2c05, 0x908a, 0x0034, 0x1a0c,
-	0x0d7d, 0x9082, 0x001b, 0x0002, 0x193f, 0x193d, 0x193d, 0x193d,
-	0x193d, 0x193d, 0x1943, 0x193d, 0x193d, 0x193d, 0x193d, 0x193d,
-	0x1947, 0x193d, 0x193d, 0x193d, 0x193d, 0x193d, 0x194b, 0x193d,
-	0x193d, 0x193d, 0x193d, 0x193d, 0x194f, 0x080c, 0x0d7d, 0xa774,
-	0xa678, 0x0804, 0x1a28, 0xa78c, 0xa690, 0x0804, 0x1a28, 0xa7a4,
-	0xa6a8, 0x0804, 0x1a28, 0xa7bc, 0xa6c0, 0x0804, 0x1a28, 0xa7d4,
-	0xa6d8, 0x0804, 0x1a28, 0xa898, 0x901d, 0x1108, 0xab9c, 0x9016,
-	0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002,
-	0x197b, 0x197b, 0x197d, 0x197b, 0x197b, 0x197b, 0x1987, 0x197b,
-	0x197b, 0x197b, 0x1991, 0x197b, 0x197b, 0x197b, 0x199b, 0x197b,
-	0x197b, 0x197b, 0x19a5, 0x197b, 0x197b, 0x197b, 0x19af, 0x197b,
-	0x197b, 0x197b, 0x19b9, 0x080c, 0x0d7d, 0xa574, 0xa478, 0x9d86,
-	0x0004, 0x0904, 0x1a28, 0xa37c, 0xa280, 0x0804, 0x1a28, 0xa584,
-	0xa488, 0x9d86, 0x0004, 0x0904, 0x1a28, 0xa38c, 0xa290, 0x0804,
-	0x1a28, 0xa594, 0xa498, 0x9d86, 0x0004, 0x0904, 0x1a28, 0xa39c,
-	0xa2a0, 0x0804, 0x1a28, 0xa5a4, 0xa4a8, 0x9d86, 0x0004, 0x0904,
-	0x1a28, 0xa3ac, 0xa2b0, 0x0804, 0x1a28, 0xa5b4, 0xa4b8, 0x9d86,
-	0x0004, 0x0904, 0x1a28, 0xa3bc, 0xa2c0, 0x0804, 0x1a28, 0xa5c4,
-	0xa4c8, 0x9d86, 0x0004, 0x0904, 0x1a28, 0xa3cc, 0xa2d0, 0x0804,
-	0x1a28, 0xa5d4, 0xa4d8, 0x9d86, 0x0004, 0x0904, 0x1a28, 0xa3dc,
-	0xa2e0, 0x0804, 0x1a28, 0xa898, 0x901d, 0x1108, 0xab9c, 0x9016,
-	0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002,
-	0x19eb, 0x19e9, 0x19e9, 0x19e9, 0x19e9, 0x19e9, 0x19f5, 0x19e9,
-	0x19e9, 0x19e9, 0x19e9, 0x19e9, 0x19ff, 0x19e9, 0x19e9, 0x19e9,
-	0x19e9, 0x19e9, 0x1a09, 0x19e9, 0x19e9, 0x19e9, 0x19e9, 0x19e9,
-	0x1a13, 0x080c, 0x0d7d, 0xa56c, 0xa470, 0xa774, 0xa678, 0x9d86,
-	0x000c, 0x05b0, 0xa37c, 0xa280, 0x0498, 0xa584, 0xa488, 0xa78c,
-	0xa690, 0x9d86, 0x000c, 0x0560, 0xa394, 0xa298, 0x0448, 0xa59c,
-	0xa4a0, 0xa7a4, 0xa6a8, 0x9d86, 0x000c, 0x0510, 0xa3ac, 0xa2b0,
-	0x00f8, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0x9d86, 0x000c, 0x01c0,
-	0xa3c4, 0xa2c8, 0x00a8, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0x9d86,
-	0x000c, 0x0170, 0xa3dc, 0xa2e0, 0x0058, 0x9d86, 0x000e, 0x1130,
-	0x080c, 0x1e07, 0x1904, 0x18fc, 0x900e, 0x0050, 0x080c, 0x0d7d,
-	0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0x080c, 0x1e07,
-	0x0005, 0x6014, 0x2048, 0x6118, 0x810c, 0x810c, 0x810c, 0x81ff,
-	0x1118, 0xa887, 0x0001, 0x0008, 0xa986, 0x601b, 0x0002, 0xa974,
-	0xd1dc, 0x1108, 0x0005, 0xa934, 0xa88c, 0x9106, 0x1158, 0xa938,
-	0xa890, 0x9106, 0x1138, 0x601c, 0xc084, 0x601e, 0x2009, 0x0048,
-	0x0804, 0xab77, 0x0005, 0x0126, 0x00c6, 0x2091, 0x2200, 0x00ce,
-	0x7908, 0x918c, 0x0007, 0x9186, 0x0000, 0x05b0, 0x9186, 0x0003,
-	0x0598, 0x6020, 0x6023, 0x0000, 0x0006, 0x2031, 0x0008, 0x00c6,
-	0x781f, 0x0808, 0x7808, 0xd09c, 0x0120, 0x080c, 0x139a, 0x8631,
-	0x1db8, 0x00ce, 0x781f, 0x0800, 0x2031, 0x0168, 0x00c6, 0x7808,
-	0xd09c, 0x190c, 0x139a, 0x00ce, 0x2001, 0x0038, 0x080c, 0x1b2b,
-	0x7930, 0x9186, 0x0040, 0x0160, 0x9186, 0x0042, 0x190c, 0x0d7d,
-	0x2001, 0x001e, 0x8001, 0x1df0, 0x8631, 0x1d40, 0x080c, 0x1b3a,
-	0x000e, 0x6022, 0x012e, 0x0005, 0x080c, 0x1b27, 0x7827, 0x0015,
-	0x7828, 0x9c06, 0x1db8, 0x782b, 0x0000, 0x0ca0, 0x00f6, 0x2079,
-	0x0300, 0x7803, 0x0000, 0x78ab, 0x0004, 0x00fe, 0x080c, 0x73e4,
-	0x11b0, 0x2001, 0x0138, 0x2003, 0x0000, 0x2001, 0x0160, 0x2003,
-	0x0000, 0x2011, 0x012c, 0xa001, 0xa001, 0x8211, 0x1de0, 0x0081,
-	0x2001, 0x0386, 0x2003, 0x2020, 0x080c, 0x7485, 0x0005, 0x0479,
-	0x0039, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0005,
-	0x00e6, 0x2071, 0x0200, 0x080c, 0x29c3, 0x2009, 0x003c, 0x080c,
-	0x2184, 0x2001, 0x015d, 0x2003, 0x0000, 0x7000, 0x9084, 0x003c,
-	0x1de0, 0x080c, 0x8420, 0x70a0, 0x70a2, 0x7098, 0x709a, 0x709c,
-	0x709e, 0x2001, 0x020d, 0x2003, 0x0020, 0x00f6, 0x2079, 0x0300,
-	0x080c, 0x1333, 0x7803, 0x0001, 0x00fe, 0x00ee, 0x0005, 0x2001,
-	0x0138, 0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, 0x2003,
-	0x0000, 0x080c, 0x73e4, 0x1108, 0x0005, 0x2021, 0x0260, 0x2001,
-	0x0141, 0x201c, 0xd3dc, 0x1168, 0x2001, 0x0109, 0x201c, 0x939c,
-	0x0048, 0x1160, 0x2001, 0x0111, 0x201c, 0x83ff, 0x1110, 0x8421,
-	0x1d70, 0x2001, 0x015d, 0x2003, 0x0000, 0x0005, 0x0046, 0x2021,
-	0x0019, 0x2003, 0x0048, 0xa001, 0xa001, 0x201c, 0x939c, 0x0048,
-	0x0120, 0x8421, 0x1db0, 0x004e, 0x0c60, 0x004e, 0x0c40, 0x601c,
-	0xc084, 0x601e, 0x0005, 0x2c08, 0x621c, 0x080c, 0x1670, 0x7930,
-	0x0005, 0x2c08, 0x621c, 0x080c, 0x169d, 0x7930, 0x0005, 0x8001,
-	0x1df0, 0x0005, 0x2031, 0x0005, 0x781c, 0x9084, 0x0007, 0x0170,
-	0x2001, 0x0038, 0x0c41, 0x9186, 0x0040, 0x0904, 0x1b98, 0x2001,
-	0x001e, 0x0c69, 0x8631, 0x1d80, 0x080c, 0x0d7d, 0x781f, 0x0202,
-	0x2001, 0x015d, 0x2003, 0x0000, 0x2001, 0x0b10, 0x0c01, 0x781c,
-	0xd084, 0x0110, 0x0861, 0x04e0, 0x2001, 0x0030, 0x0891, 0x9186,
-	0x0040, 0x0568, 0x781c, 0xd084, 0x1da8, 0x781f, 0x0101, 0x2001,
-	0x0014, 0x0869, 0x2001, 0x0037, 0x0821, 0x9186, 0x0040, 0x0140,
-	0x2001, 0x0030, 0x080c, 0x1b31, 0x9186, 0x0040, 0x190c, 0x0d7d,
-	0x00d6, 0x2069, 0x0200, 0x692c, 0xd1f4, 0x1170, 0xd1c4, 0x0160,
-	0xd19c, 0x0130, 0x6800, 0x9085, 0x1800, 0x6802, 0x00de, 0x0080,
-	0x6908, 0x9184, 0x0007, 0x1db0, 0x00de, 0x781f, 0x0100, 0x791c,
-	0x9184, 0x0007, 0x090c, 0x0d7d, 0xa001, 0xa001, 0x781f, 0x0200,
-	0x0005, 0x0126, 0x2091, 0x2400, 0x2079, 0x0380, 0x2001, 0x19e5,
-	0x2070, 0x012e, 0x0005, 0x2cf0, 0x0126, 0x2091, 0x2400, 0x3e60,
-	0x6014, 0x2048, 0xa964, 0xa91a, 0x918c, 0x00ff, 0x9184, 0x000f,
-	0x0002, 0x1bc1, 0x1bc1, 0x1bc1, 0x1bc3, 0x1bc1, 0x1bc1, 0x1bc1,
-	0x1bc1, 0x1bc1, 0x1bcb, 0x1bc1, 0x1bc7, 0x1bc1, 0x1bc1, 0x1bc1,
-	0x1bc1, 0x080c, 0x0d7d, 0x9186, 0x0013, 0x0128, 0x0cd0, 0x9186,
-	0x001b, 0x0108, 0x0cb0, 0xa87c, 0xd0b4, 0x0904, 0x1d3a, 0x9184,
-	0x000f, 0x9080, 0x1e31, 0x2015, 0x2205, 0xab88, 0x2908, 0xa80a,
-	0xa90e, 0xaa12, 0xab16, 0x9006, 0xa842, 0xa83e, 0x012e, 0x0005,
-	0x2cf0, 0x0126, 0x2091, 0x2400, 0x3e60, 0x6014, 0x2048, 0xa88c,
-	0xa990, 0xaaac, 0xabb0, 0xaa36, 0xab3a, 0xa83e, 0xa942, 0xa846,
-	0xa94a, 0xa964, 0x918c, 0x00ff, 0x9186, 0x001e, 0x0190, 0x2940,
-	0xa064, 0xa81a, 0x90ec, 0x000f, 0x9d80, 0x1e31, 0x2065, 0x2c05,
-	0x2808, 0x2c10, 0xab88, 0xa80a, 0xa90e, 0xaa12, 0xab16, 0x012e,
-	0x0005, 0xa804, 0x2040, 0x0c60, 0x2cf0, 0x0126, 0x2091, 0x2400,
-	0x3e60, 0x6014, 0x2048, 0xa97c, 0x2950, 0xd1dc, 0x1904, 0x1d04,
-	0xc1dd, 0xa97e, 0x9006, 0xa842, 0xa83e, 0xa988, 0x8109, 0xa916,
-	0xa964, 0xa91a, 0x9184, 0x000f, 0x9088, 0x1e31, 0x2145, 0x0002,
-	0x1c38, 0x1c46, 0x1c38, 0x1c38, 0x1c38, 0x1c3a, 0x1c38, 0x1c38,
-	0x1c9b, 0x1c9b, 0x1c38, 0x1c38, 0x1c38, 0x1c99, 0x1c38, 0x1c38,
-	0x080c, 0x0d7d, 0xa804, 0x2050, 0xb164, 0xa91a, 0x9184, 0x000f,
-	0x9080, 0x1e31, 0x2045, 0xd19c, 0x1904, 0x1c9b, 0x9036, 0x2638,
-	0x2805, 0x908a, 0x0036, 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002,
-	0x1c6b, 0x1c6b, 0x1c6d, 0x1c6b, 0x1c6b, 0x1c6b, 0x1c73, 0x1c6b,
-	0x1c6b, 0x1c6b, 0x1c79, 0x1c6b, 0x1c6b, 0x1c6b, 0x1c7f, 0x1c6b,
-	0x1c6b, 0x1c6b, 0x1c85, 0x1c6b, 0x1c6b, 0x1c6b, 0x1c8b, 0x1c6b,
-	0x1c6b, 0x1c6b, 0x1c91, 0x080c, 0x0d7d, 0xb574, 0xb478, 0xb37c,
-	0xb280, 0x0804, 0x1ce0, 0xb584, 0xb488, 0xb38c, 0xb290, 0x0804,
-	0x1ce0, 0xb594, 0xb498, 0xb39c, 0xb2a0, 0x0804, 0x1ce0, 0xb5a4,
-	0xb4a8, 0xb3ac, 0xb2b0, 0x0804, 0x1ce0, 0xb5b4, 0xb4b8, 0xb3bc,
-	0xb2c0, 0x0804, 0x1ce0, 0xb5c4, 0xb4c8, 0xb3cc, 0xb2d0, 0x0804,
-	0x1ce0, 0xb5d4, 0xb4d8, 0xb3dc, 0xb2e0, 0x0804, 0x1ce0, 0x0804,
-	0x1ce0, 0x080c, 0x0d7d, 0x2805, 0x908a, 0x0034, 0x1a0c, 0x0d7d,
-	0x9082, 0x001b, 0x0002, 0x1cbe, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc,
-	0x1cbc, 0x1cc5, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1ccc,
-	0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cbc, 0x1cd3, 0x1cbc, 0x1cbc,
-	0x1cbc, 0x1cbc, 0x1cbc, 0x1cda, 0x080c, 0x0d7d, 0xb56c, 0xb470,
-	0xb774, 0xb678, 0xb37c, 0xb280, 0x00d8, 0xb584, 0xb488, 0xb78c,
-	0xb690, 0xb394, 0xb298, 0x00a0, 0xb59c, 0xb4a0, 0xb7a4, 0xb6a8,
-	0xb3ac, 0xb2b0, 0x0068, 0xb5b4, 0xb4b8, 0xb7bc, 0xb6c0, 0xb3c4,
-	0xb2c8, 0x0030, 0xb5cc, 0xb4d0, 0xb7d4, 0xb6d8, 0xb3dc, 0xb2e0,
-	0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa988, 0x8109,
-	0xa916, 0x1118, 0x9006, 0x012e, 0x0005, 0x8840, 0x2805, 0x9005,
-	0x1168, 0xb004, 0x9005, 0x090c, 0x0d7d, 0x2050, 0xb164, 0xa91a,
-	0x9184, 0x000f, 0x9080, 0x1e31, 0x2045, 0x2805, 0x2810, 0x2a08,
-	0xa80a, 0xa90e, 0xaa12, 0x0c30, 0x3e60, 0x6344, 0xd3fc, 0x190c,
-	0x0d7d, 0xa93c, 0xaa40, 0xa844, 0x9106, 0x1118, 0xa848, 0x9206,
-	0x0508, 0x2958, 0xab48, 0xac44, 0x2940, 0x080c, 0x1e51, 0x1998,
-	0x2850, 0x2c40, 0xab14, 0xa880, 0xd0fc, 0x1140, 0xa810, 0x2005,
-	0xa80a, 0x2a00, 0xa80e, 0x2009, 0x8015, 0x0070, 0x00c6, 0x3e60,
-	0x6044, 0xc0a4, 0x9085, 0x8005, 0x6046, 0x00ce, 0x8319, 0xab16,
-	0x1904, 0x1ced, 0x2009, 0x8005, 0x3e60, 0x6044, 0x9105, 0x6046,
-	0x0804, 0x1cea, 0x080c, 0x0d7d, 0x00f6, 0x00e6, 0x0096, 0x00c6,
-	0x0026, 0x704c, 0x9c06, 0x190c, 0x0d7d, 0x2079, 0x0090, 0x2001,
-	0x0105, 0x2003, 0x0010, 0x782b, 0x0004, 0x7057, 0x0000, 0x6014,
-	0x2048, 0x080c, 0xc723, 0x0118, 0xa880, 0xc0bd, 0xa882, 0x6020,
-	0x9086, 0x0006, 0x1170, 0x2061, 0x0100, 0x62c8, 0x2001, 0x00fa,
-	0x8001, 0x1df0, 0x60c8, 0x9206, 0x1dc0, 0x60c4, 0xa89a, 0x60c8,
-	0xa896, 0x704c, 0x2060, 0x00c6, 0x080c, 0xc32e, 0x080c, 0xa781,
-	0x00ce, 0x704c, 0x9c06, 0x1150, 0x2009, 0x0040, 0x080c, 0x2184,
-	0x080c, 0xa239, 0x2011, 0x0000, 0x080c, 0xa0b0, 0x002e, 0x00ce,
-	0x009e, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0090, 0x781c,
-	0x0006, 0x7818, 0x0006, 0x2079, 0x0100, 0x7a14, 0x9284, 0x1984,
-	0x9085, 0x0012, 0x7816, 0x2019, 0x1000, 0x8319, 0x090c, 0x0d7d,
-	0x7820, 0xd0bc, 0x1dd0, 0x79c8, 0x000e, 0x9102, 0x001e, 0x0006,
-	0x0016, 0x79c4, 0x000e, 0x9103, 0x78c6, 0x000e, 0x78ca, 0x9284,
-	0x1984, 0x9085, 0x0012, 0x7816, 0x2079, 0x0090, 0x782b, 0x0008,
-	0x7057, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x19e5,
-	0x7054, 0x9086, 0x0000, 0x0904, 0x1e02, 0x2079, 0x0090, 0x2009,
-	0x0207, 0x210c, 0xd194, 0x01b8, 0x2009, 0x020c, 0x210c, 0x9184,
-	0x0003, 0x0188, 0x080c, 0xe5bc, 0x2001, 0x0133, 0x2004, 0x9005,
-	0x090c, 0x0d7d, 0x0016, 0x2009, 0x0040, 0x080c, 0x2184, 0x001e,
-	0x2001, 0x020c, 0x2102, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203,
-	0x210c, 0x9106, 0x1120, 0x2009, 0x0040, 0x080c, 0x2184, 0x782c,
-	0xd0fc, 0x09a8, 0x080c, 0xa79d, 0x782c, 0xd0fc, 0x1de8, 0x080c,
-	0xa781, 0x7054, 0x9086, 0x0000, 0x1950, 0x782b, 0x0004, 0x782c,
-	0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x2184, 0x782b, 0x0002,
-	0x7057, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x080c, 0x0d7d, 0x8c60,
-	0x2c05, 0x9005, 0x0110, 0x8a51, 0x0005, 0xa004, 0x9005, 0x0168,
-	0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, 0x1e31, 0x2065,
-	0x8cff, 0x090c, 0x0d7d, 0x8a51, 0x0005, 0x2050, 0x0005, 0x0000,
-	0x001d, 0x0021, 0x0025, 0x0029, 0x002d, 0x0031, 0x0035, 0x0000,
-	0x001b, 0x0021, 0x0027, 0x002d, 0x0033, 0x0000, 0x0000, 0x0023,
-	0x0000, 0x0000, 0x1e24, 0x1e20, 0x1e24, 0x1e24, 0x1e2e, 0x0000,
-	0x1e24, 0x1e2b, 0x1e2b, 0x1e28, 0x1e2b, 0x1e2b, 0x0000, 0x1e2e,
-	0x1e2b, 0x0000, 0x1e26, 0x1e26, 0x0000, 0x1e26, 0x1e2e, 0x0000,
-	0x1e26, 0x1e2c, 0x1e2c, 0x1e2c, 0x0000, 0x1e2c, 0x0000, 0x1e2e,
-	0x1e2c, 0x00c6, 0x00d6, 0x0086, 0xab42, 0xac3e, 0xa888, 0x9055,
-	0x0904, 0x2028, 0x2940, 0xa064, 0x90ec, 0x000f, 0x9de0, 0x1e31,
-	0x9d86, 0x0007, 0x0130, 0x9d86, 0x000e, 0x0118, 0x9d86, 0x000f,
-	0x1120, 0xa08c, 0x9422, 0xa090, 0x931b, 0x2c05, 0x9065, 0x1140,
-	0x0310, 0x0804, 0x2028, 0xa004, 0x9045, 0x0904, 0x2028, 0x0c18,
-	0x2c05, 0x9005, 0x0904, 0x1f10, 0xdd9c, 0x1904, 0x1ecc, 0x908a,
-	0x0036, 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002, 0x1ea1, 0x1ea1,
-	0x1ea3, 0x1ea1, 0x1ea1, 0x1ea1, 0x1ea9, 0x1ea1, 0x1ea1, 0x1ea1,
-	0x1eaf, 0x1ea1, 0x1ea1, 0x1ea1, 0x1eb5, 0x1ea1, 0x1ea1, 0x1ea1,
-	0x1ebb, 0x1ea1, 0x1ea1, 0x1ea1, 0x1ec1, 0x1ea1, 0x1ea1, 0x1ea1,
-	0x1ec7, 0x080c, 0x0d7d, 0xa07c, 0x9422, 0xa080, 0x931b, 0x0804,
-	0x1f06, 0xa08c, 0x9422, 0xa090, 0x931b, 0x0804, 0x1f06, 0xa09c,
-	0x9422, 0xa0a0, 0x931b, 0x0804, 0x1f06, 0xa0ac, 0x9422, 0xa0b0,
-	0x931b, 0x0804, 0x1f06, 0xa0bc, 0x9422, 0xa0c0, 0x931b, 0x0804,
-	0x1f06, 0xa0cc, 0x9422, 0xa0d0, 0x931b, 0x0804, 0x1f06, 0xa0dc,
-	0x9422, 0xa0e0, 0x931b, 0x04d0, 0x908a, 0x0034, 0x1a0c, 0x0d7d,
-	0x9082, 0x001b, 0x0002, 0x1eee, 0x1eec, 0x1eec, 0x1eec, 0x1eec,
-	0x1eec, 0x1ef3, 0x1eec, 0x1eec, 0x1eec, 0x1eec, 0x1eec, 0x1ef8,
-	0x1eec, 0x1eec, 0x1eec, 0x1eec, 0x1eec, 0x1efd, 0x1eec, 0x1eec,
-	0x1eec, 0x1eec, 0x1eec, 0x1f02, 0x080c, 0x0d7d, 0xa07c, 0x9422,
-	0xa080, 0x931b, 0x0098, 0xa094, 0x9422, 0xa098, 0x931b, 0x0070,
-	0xa0ac, 0x9422, 0xa0b0, 0x931b, 0x0048, 0xa0c4, 0x9422, 0xa0c8,
-	0x931b, 0x0020, 0xa0dc, 0x9422, 0xa0e0, 0x931b, 0x0630, 0x2300,
-	0x9405, 0x0160, 0x8a51, 0x0904, 0x2028, 0x8c60, 0x0804, 0x1e78,
-	0xa004, 0x9045, 0x0904, 0x2028, 0x0804, 0x1e5b, 0x8a51, 0x0904,
-	0x2028, 0x8c60, 0x2c05, 0x9005, 0x1158, 0xa004, 0x9045, 0x0904,
-	0x2028, 0xa064, 0x90ec, 0x000f, 0x9de0, 0x1e31, 0x2c05, 0x2060,
-	0xa880, 0xc0fc, 0xa882, 0x0804, 0x201d, 0x2c05, 0x8422, 0x8420,
-	0x831a, 0x9399, 0x0000, 0xac2e, 0xab32, 0xdd9c, 0x1904, 0x1fba,
-	0x9082, 0x001b, 0x0002, 0x1f56, 0x1f56, 0x1f58, 0x1f56, 0x1f56,
-	0x1f56, 0x1f66, 0x1f56, 0x1f56, 0x1f56, 0x1f74, 0x1f56, 0x1f56,
-	0x1f56, 0x1f82, 0x1f56, 0x1f56, 0x1f56, 0x1f90, 0x1f56, 0x1f56,
-	0x1f56, 0x1f9e, 0x1f56, 0x1f56, 0x1f56, 0x1fac, 0x080c, 0x0d7d,
-	0xa17c, 0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0d7d,
-	0xa074, 0x9420, 0xa078, 0x9319, 0x0804, 0x2018, 0xa18c, 0x2400,
-	0x9122, 0xa190, 0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa084, 0x9420,
-	0xa088, 0x9319, 0x0804, 0x2018, 0xa19c, 0x2400, 0x9122, 0xa1a0,
-	0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa094, 0x9420, 0xa098, 0x9319,
-	0x0804, 0x2018, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b,
-	0x0a0c, 0x0d7d, 0xa0a4, 0x9420, 0xa0a8, 0x9319, 0x0804, 0x2018,
-	0xa1bc, 0x2400, 0x9122, 0xa1c0, 0x2300, 0x911b, 0x0a0c, 0x0d7d,
-	0xa0b4, 0x9420, 0xa0b8, 0x9319, 0x0804, 0x2018, 0xa1cc, 0x2400,
-	0x9122, 0xa1d0, 0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa0c4, 0x9420,
-	0xa0c8, 0x9319, 0x0804, 0x2018, 0xa1dc, 0x2400, 0x9122, 0xa1e0,
-	0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa0d4, 0x9420, 0xa0d8, 0x9319,
-	0x0804, 0x2018, 0x9082, 0x001b, 0x0002, 0x1fd8, 0x1fd6, 0x1fd6,
-	0x1fd6, 0x1fd6, 0x1fd6, 0x1fe5, 0x1fd6, 0x1fd6, 0x1fd6, 0x1fd6,
-	0x1fd6, 0x1ff2, 0x1fd6, 0x1fd6, 0x1fd6, 0x1fd6, 0x1fd6, 0x1fff,
-	0x1fd6, 0x1fd6, 0x1fd6, 0x1fd6, 0x1fd6, 0x200c, 0x080c, 0x0d7d,
-	0xa17c, 0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0d7d,
-	0xa06c, 0x9420, 0xa070, 0x9319, 0x0498, 0xa194, 0x2400, 0x9122,
-	0xa198, 0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa084, 0x9420, 0xa088,
-	0x9319, 0x0430, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b,
-	0x0a0c, 0x0d7d, 0xa09c, 0x9420, 0xa0a0, 0x9319, 0x00c8, 0xa1c4,
-	0x2400, 0x9122, 0xa1c8, 0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa0b4,
-	0x9420, 0xa0b8, 0x9319, 0x0060, 0xa1dc, 0x2400, 0x9122, 0xa1e0,
-	0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa0cc, 0x9420, 0xa0d0, 0x9319,
-	0xac1e, 0xab22, 0xa880, 0xc0fd, 0xa882, 0x2800, 0xa85a, 0x2c00,
-	0xa812, 0x2a00, 0xa816, 0x000e, 0x000e, 0x000e, 0x9006, 0x0028,
-	0x008e, 0x00de, 0x00ce, 0x9085, 0x0001, 0x0005, 0x00c6, 0x610c,
-	0x0016, 0x9026, 0x2410, 0x6004, 0x9420, 0x9291, 0x0000, 0x2c04,
-	0x9210, 0x9ce0, 0x0002, 0x918a, 0x0002, 0x1da8, 0x9284, 0x000f,
-	0x9405, 0x001e, 0x00ce, 0x0005, 0x7803, 0x0003, 0x780f, 0x0000,
-	0x6004, 0x7812, 0x2c04, 0x7816, 0x9ce0, 0x0002, 0x918a, 0x0002,
-	0x1db8, 0x0005, 0x2001, 0x0005, 0x2004, 0xd0bc, 0x190c, 0x0d76,
-	0xd094, 0x0110, 0x080c, 0x11d5, 0x0005, 0x0126, 0x2091, 0x2600,
-	0x2079, 0x0200, 0x2071, 0x0260, 0x2069, 0x1800, 0x7817, 0x0000,
-	0x789b, 0x0814, 0x78a3, 0x0406, 0x789f, 0x0410, 0x2009, 0x013b,
-	0x200b, 0x0400, 0x781b, 0x0002, 0x783b, 0x001f, 0x7837, 0x0020,
-	0x7803, 0x1600, 0x012e, 0x0005, 0x2091, 0x2600, 0x781c, 0xd0a4,
-	0x190c, 0x2181, 0x7900, 0xd1dc, 0x1118, 0x9084, 0x0006, 0x001a,
-	0x9084, 0x000e, 0x0002, 0x20a3, 0x209b, 0x7de7, 0x209b, 0x209d,
-	0x209d, 0x209d, 0x209d, 0x7dcd, 0x209b, 0x209f, 0x209b, 0x209d,
-	0x209b, 0x209d, 0x209b, 0x080c, 0x0d7d, 0x0031, 0x0020, 0x080c,
-	0x7dcd, 0x080c, 0x7de7, 0x0005, 0x0006, 0x0016, 0x0026, 0x080c,
-	0xe5bc, 0x7930, 0x9184, 0x0003, 0x01f0, 0x080c, 0xa781, 0x2001,
-	0x19f8, 0x2004, 0x9005, 0x0180, 0x2001, 0x0133, 0x2004, 0x9005,
-	0x090c, 0x0d7d, 0x00c6, 0x2001, 0x19f8, 0x2064, 0x080c, 0xa79d,
-	0x080c, 0xc32e, 0x00ce, 0x0408, 0x2009, 0x0040, 0x080c, 0x2184,
-	0x080c, 0xa79d, 0x00d0, 0x9184, 0x0014, 0x01a0, 0x6a00, 0x9286,
-	0x0003, 0x0160, 0x080c, 0x73e4, 0x1138, 0x080c, 0x76e8, 0x080c,
-	0x5f41, 0x080c, 0x7315, 0x0010, 0x080c, 0x5dfc, 0x080c, 0x7e75,
-	0x0041, 0x0018, 0x9184, 0x9540, 0x1dc8, 0x002e, 0x001e, 0x000e,
-	0x0005, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a69, 0x080c,
-	0x1a9e, 0x005e, 0x004e, 0x003e, 0x00ee, 0x0005, 0x0126, 0x2091,
-	0x2e00, 0x2071, 0x1800, 0x7128, 0x2001, 0x196f, 0x2102, 0x2001,
-	0x1977, 0x2102, 0x2001, 0x013b, 0x2102, 0x2079, 0x0200, 0x2001,
-	0x0201, 0x789e, 0x78a3, 0x0200, 0x9198, 0x0007, 0x831c, 0x831c,
-	0x831c, 0x9398, 0x0005, 0x2320, 0x9182, 0x0204, 0x1230, 0x2011,
-	0x0008, 0x8423, 0x8423, 0x8423, 0x0488, 0x9182, 0x024c, 0x1240,
-	0x2011, 0x0007, 0x8403, 0x8003, 0x9400, 0x9400, 0x9420, 0x0430,
-	0x9182, 0x02bc, 0x1238, 0x2011, 0x0006, 0x8403, 0x8003, 0x9400,
-	0x9420, 0x00e0, 0x9182, 0x034c, 0x1230, 0x2011, 0x0005, 0x8403,
-	0x8003, 0x9420, 0x0098, 0x9182, 0x042c, 0x1228, 0x2011, 0x0004,
-	0x8423, 0x8423, 0x0058, 0x9182, 0x059c, 0x1228, 0x2011, 0x0003,
-	0x8403, 0x9420, 0x0018, 0x2011, 0x0002, 0x8423, 0x9482, 0x0228,
-	0x8002, 0x8020, 0x8301, 0x9402, 0x0110, 0x0208, 0x8321, 0x8217,
-	0x8203, 0x9405, 0x789a, 0x012e, 0x0005, 0x0006, 0x00d6, 0x2069,
-	0x0200, 0x6814, 0x9084, 0xffc0, 0x910d, 0x6916, 0x00de, 0x000e,
-	0x0005, 0x00d6, 0x2069, 0x0200, 0x9005, 0x6810, 0x0110, 0xc0a5,
-	0x0008, 0xc0a4, 0x6812, 0x00de, 0x0005, 0x0006, 0x00d6, 0x2069,
-	0x0200, 0x6810, 0x9084, 0xfff8, 0x910d, 0x6912, 0x00de, 0x000e,
-	0x0005, 0x7938, 0x080c, 0x0d76, 0x00f6, 0x2079, 0x0200, 0x7902,
-	0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x7902, 0xa001,
-	0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x00fe, 0x0005, 0x0126,
-	0x2091, 0x2800, 0x2061, 0x0100, 0x2071, 0x1800, 0x2009, 0x0000,
-	0x080c, 0x29bd, 0x080c, 0x28ea, 0x080c, 0x2a2e, 0x9006, 0x080c,
-	0x2919, 0x9006, 0x080c, 0x28fc, 0x20a9, 0x0012, 0x1d04, 0x21ae,
-	0x2091, 0x6000, 0x1f04, 0x21ae, 0x602f, 0x0100, 0x602f, 0x0000,
-	0x6050, 0x9085, 0x0400, 0x9084, 0xdfff, 0x6052, 0x6224, 0x080c,
-	0x2a0b, 0x080c, 0x2608, 0x2009, 0x00ef, 0x6132, 0x6136, 0x080c,
-	0x2618, 0x60e7, 0x0000, 0x61ea, 0x60e3, 0x0008, 0x604b, 0xf7f7,
-	0x6043, 0x0000, 0x602f, 0x0080, 0x602f, 0x0000, 0x6007, 0x349f,
-	0x00c6, 0x2061, 0x0140, 0x608b, 0x000b, 0x608f, 0x10b8, 0x6093,
-	0x0000, 0x6097, 0x0198, 0x00ce, 0x6004, 0x9085, 0x8000, 0x6006,
-	0x60bb, 0x0000, 0x20a9, 0x0018, 0x60bf, 0x0000, 0x1f04, 0x21ec,
-	0x60bb, 0x0000, 0x60bf, 0x0108, 0x60bf, 0x0012, 0x60bf, 0x0405,
-	0x60bf, 0x0014, 0x60bf, 0x0320, 0x60bf, 0x0018, 0x601b, 0x00f0,
-	0x601f, 0x001e, 0x600f, 0x006b, 0x602b, 0x402c, 0x012e, 0x0005,
-	0x00f6, 0x2079, 0x0140, 0x78c3, 0x0080, 0x78c3, 0x0083, 0x78c3,
-	0x0000, 0x00fe, 0x0005, 0x2001, 0x1835, 0x2003, 0x0000, 0x2001,
-	0x1834, 0x2003, 0x0001, 0x0005, 0x0126, 0x2091, 0x2800, 0x0006,
-	0x0016, 0x0026, 0x6124, 0x6028, 0x910c, 0x0066, 0x2031, 0x1837,
-	0x2634, 0x96b4, 0x0028, 0x006e, 0x1138, 0x6020, 0xd1bc, 0x0120,
-	0xd0bc, 0x1168, 0xd0b4, 0x1198, 0x9184, 0x5e2c, 0x1118, 0x9184,
-	0x0007, 0x00aa, 0x9195, 0x0004, 0x9284, 0x0007, 0x0082, 0x0016,
-	0x2001, 0x0387, 0x200c, 0xd1a4, 0x001e, 0x0d70, 0x0c98, 0x0016,
-	0x2001, 0x0387, 0x200c, 0xd1b4, 0x001e, 0x0d30, 0x0c58, 0x225a,
-	0x2257, 0x2257, 0x2257, 0x2259, 0x2257, 0x2257, 0x2257, 0x080c,
-	0x0d7d, 0x0029, 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x00a6,
-	0x6124, 0x6028, 0xd09c, 0x0118, 0xd19c, 0x1904, 0x24d4, 0xd1f4,
-	0x190c, 0x0d76, 0x080c, 0x73e4, 0x0904, 0x22b7, 0x080c, 0xce35,
-	0x1120, 0x7000, 0x9086, 0x0003, 0x0580, 0x6024, 0x9084, 0x1800,
-	0x0560, 0x080c, 0x7407, 0x0118, 0x080c, 0x73f5, 0x1530, 0x2011,
-	0x0020, 0x080c, 0x2a0b, 0x6043, 0x0000, 0x080c, 0xce35, 0x0168,
-	0x080c, 0x7407, 0x1150, 0x2001, 0x19a5, 0x2003, 0x0001, 0x6027,
-	0x1800, 0x080c, 0x725a, 0x0804, 0x24d7, 0x70a4, 0x9005, 0x1150,
-	0x70a7, 0x0001, 0x00d6, 0x2069, 0x0140, 0x080c, 0x743b, 0x00de,
-	0x1904, 0x24d7, 0x080c, 0x76f2, 0x0428, 0x080c, 0x7407, 0x1590,
-	0x6024, 0x9084, 0x1800, 0x1108, 0x0468, 0x080c, 0x76f2, 0x080c,
-	0x76e8, 0x080c, 0x5f41, 0x080c, 0x7315, 0x0804, 0x24d4, 0xd1ac,
-	0x1508, 0x6024, 0xd0dc, 0x1170, 0xd0e4, 0x1178, 0xd0d4, 0x1190,
-	0xd0cc, 0x0130, 0x7098, 0x9086, 0x0028, 0x1110, 0x080c, 0x75c9,
-	0x0804, 0x24d4, 0x080c, 0x76ed, 0x0048, 0x2001, 0x197d, 0x2003,
-	0x0002, 0x0020, 0x080c, 0x7526, 0x0804, 0x24d4, 0x080c, 0x766c,
-	0x0804, 0x24d4, 0x6220, 0xd1bc, 0x0138, 0xd2bc, 0x1904, 0x2539,
-	0xd2b4, 0x1904, 0x254b, 0x0000, 0xd1ac, 0x0904, 0x23e1, 0x0036,
-	0x6328, 0xc3bc, 0x632a, 0x003e, 0x080c, 0x73e4, 0x11d0, 0x2011,
-	0x0020, 0x080c, 0x2a0b, 0x0006, 0x0026, 0x0036, 0x080c, 0x73fe,
-	0x1158, 0x080c, 0x76e8, 0x080c, 0x5f41, 0x080c, 0x7315, 0x003e,
-	0x002e, 0x000e, 0x00ae, 0x0005, 0x003e, 0x002e, 0x000e, 0x080c,
-	0x73b8, 0x0016, 0x0046, 0x00c6, 0x644c, 0x9486, 0xf0f0, 0x1138,
-	0x2061, 0x0100, 0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74da,
-	0x948c, 0xff00, 0x7038, 0xd084, 0x0178, 0x9186, 0xf800, 0x1160,
-	0x7048, 0xd084, 0x1148, 0xc085, 0x704a, 0x0036, 0x2418, 0x2011,
-	0x8016, 0x080c, 0x4a38, 0x003e, 0x080c, 0xce2e, 0x1904, 0x23b8,
-	0x9196, 0xff00, 0x05a8, 0x7060, 0x9084, 0x00ff, 0x810f, 0x81ff,
-	0x0110, 0x9116, 0x0568, 0x7130, 0xd184, 0x1550, 0x080c, 0x3328,
-	0x0128, 0xc18d, 0x7132, 0x080c, 0x6962, 0x1510, 0x6240, 0x9294,
-	0x0010, 0x0130, 0x6248, 0x9294, 0xff00, 0x9296, 0xff00, 0x01c0,
-	0x7030, 0xd08c, 0x0904, 0x23b8, 0x7038, 0xd08c, 0x1140, 0x2001,
-	0x180c, 0x200c, 0xd1ac, 0x1904, 0x23b8, 0xc1ad, 0x2102, 0x0036,
-	0x73d8, 0x2011, 0x8013, 0x080c, 0x4a38, 0x003e, 0x0804, 0x23b8,
+	0x0800, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, 0x188d,
+	0x7104, 0x7200, 0x82ff, 0x01d0, 0x7308, 0x8318, 0x831f, 0x831b,
+	0x831b, 0x7312, 0x8319, 0x2001, 0x0800, 0xa802, 0x2048, 0x8900,
+	0xa802, 0x2040, 0xa95e, 0xaa62, 0x8420, 0x2300, 0x9906, 0x0130,
+	0x2848, 0x9188, 0x0040, 0x9291, 0x0000, 0x0c88, 0xa803, 0x0000,
+	0x2071, 0x1800, 0x74be, 0x74c2, 0x0005, 0x00e6, 0x0016, 0x9984,
+	0xfc00, 0x01e8, 0x908c, 0xf800, 0x1168, 0x9982, 0x0400, 0x02b8,
+	0x9982, 0x0440, 0x0278, 0x9982, 0x0558, 0x0288, 0x9982, 0x0800,
+	0x1270, 0x0040, 0x9982, 0x0800, 0x0250, 0x2071, 0x188d, 0x7010,
+	0x9902, 0x1228, 0x9085, 0x0001, 0x001e, 0x00ee, 0x0005, 0x9006,
+	0x0cd8, 0x00e6, 0x2071, 0x1a21, 0x7007, 0x0000, 0x9006, 0x701e,
+	0x7022, 0x7002, 0x2071, 0x0000, 0x7010, 0x9085, 0x8044, 0x7012,
+	0x2071, 0x0080, 0x9006, 0x20a9, 0x0040, 0x7022, 0x1f04, 0x111d,
+	0x702b, 0x0020, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6,
+	0xa06f, 0x0000, 0x2071, 0x1a21, 0x701c, 0x9088, 0x1a2b, 0x280a,
+	0x8000, 0x9084, 0x003f, 0x701e, 0x7120, 0x9106, 0x090c, 0x0d7d,
+	0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x00a9, 0x00fe,
+	0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0x2071,
+	0x1a21, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x0021,
+	0x00fe, 0x00ee, 0x012e, 0x0005, 0x7004, 0x9086, 0x0000, 0x1110,
+	0x7007, 0x0006, 0x7000, 0x0002, 0x1166, 0x12e9, 0x1164, 0x1164,
+	0x12dd, 0x12dd, 0x12dd, 0x12dd, 0x080c, 0x0d7d, 0x701c, 0x7120,
+	0x9106, 0x1148, 0x792c, 0x9184, 0x0001, 0x1120, 0xd1fc, 0x1110,
+	0x7007, 0x0000, 0x0005, 0x0096, 0x9180, 0x1a2b, 0x2004, 0x700a,
+	0x2048, 0x8108, 0x918c, 0x003f, 0x7122, 0x782b, 0x0026, 0xa88c,
+	0x7802, 0xa890, 0x7806, 0xa894, 0x780a, 0xa898, 0x780e, 0xa878,
+	0x700e, 0xa870, 0x7016, 0xa874, 0x701a, 0xa868, 0x009e, 0xd084,
+	0x0120, 0x7007, 0x0001, 0x0029, 0x0005, 0x7007, 0x0002, 0x00b1,
+	0x0005, 0x0016, 0x0026, 0x710c, 0x2011, 0x0040, 0x9182, 0x0040,
+	0x1210, 0x2110, 0x9006, 0x700e, 0x7212, 0x8203, 0x7812, 0x782b,
+	0x0020, 0x782b, 0x0041, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026,
+	0x0136, 0x0146, 0x0156, 0x7014, 0x20e0, 0x7018, 0x2098, 0x20e9,
+	0x0000, 0x20a1, 0x0088, 0x782b, 0x0026, 0x710c, 0x2011, 0x0040,
+	0x9182, 0x0040, 0x1210, 0x2110, 0x9006, 0x700e, 0x22a8, 0x4006,
+	0x8203, 0x7812, 0x782b, 0x0020, 0x3300, 0x701a, 0x782b, 0x0001,
+	0x015e, 0x014e, 0x013e, 0x002e, 0x001e, 0x0005, 0x2009, 0x1a21,
+	0x2104, 0xc095, 0x200a, 0x080c, 0x1143, 0x0005, 0x0016, 0x00e6,
+	0x2071, 0x1a21, 0x00f6, 0x2079, 0x0080, 0x792c, 0xd1bc, 0x190c,
+	0x0d76, 0x782b, 0x0002, 0xd1fc, 0x0120, 0x918c, 0x0700, 0x7004,
+	0x0023, 0x00fe, 0x00ee, 0x001e, 0x0005, 0x1154, 0x11fc, 0x1230,
+	0x1308, 0x0d7d, 0x1323, 0x0d7d, 0x918c, 0x0700, 0x1550, 0x0136,
+	0x0146, 0x0156, 0x7014, 0x20e8, 0x7018, 0x20a0, 0x20e1, 0x0000,
+	0x2099, 0x0088, 0x782b, 0x0040, 0x7010, 0x20a8, 0x4005, 0x3400,
+	0x701a, 0x015e, 0x014e, 0x013e, 0x700c, 0x9005, 0x0578, 0x7800,
+	0x7802, 0x7804, 0x7806, 0x080c, 0x1199, 0x0005, 0x7008, 0x0096,
+	0x2048, 0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x080c, 0x1154,
+	0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e, 0x0ca0,
+	0x918c, 0x0700, 0x1150, 0x700c, 0x9005, 0x0180, 0x7800, 0x7802,
+	0x7804, 0x7806, 0x080c, 0x11ae, 0x0005, 0x7008, 0x0096, 0x2048,
+	0xa86f, 0x0200, 0x009e, 0x7007, 0x0000, 0x0080, 0x0096, 0x7008,
+	0x2048, 0x7800, 0xa88e, 0x7804, 0xa892, 0x7808, 0xa896, 0x780c,
+	0xa89a, 0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x0096, 0x00d6,
+	0x7008, 0x2048, 0x2001, 0x18b9, 0x2004, 0x9906, 0x1128, 0xa89c,
+	0x080f, 0x00de, 0x009e, 0x00a0, 0x00de, 0x009e, 0x0096, 0x00d6,
+	0x7008, 0x2048, 0x0081, 0x0150, 0xa89c, 0x0086, 0x2940, 0x080f,
+	0x008e, 0x00de, 0x009e, 0x080c, 0x1143, 0x0005, 0x00de, 0x009e,
+	0x080c, 0x1143, 0x0005, 0xa8a8, 0xd08c, 0x0005, 0x0096, 0xa0a0,
+	0x904d, 0x090c, 0x0d7d, 0xa06c, 0x908e, 0x0100, 0x0130, 0xa87b,
+	0x0030, 0xa883, 0x0000, 0xa897, 0x4002, 0x080c, 0x6d64, 0xa09f,
+	0x0000, 0xa0a3, 0x0000, 0x2848, 0x080c, 0x106c, 0x009e, 0x0005,
+	0x00a6, 0xa0a0, 0x904d, 0x090c, 0x0d7d, 0xa06c, 0x908e, 0x0100,
+	0x0128, 0xa87b, 0x0001, 0xa883, 0x0000, 0x00c0, 0xa80c, 0x2050,
+	0xb004, 0x9005, 0x0198, 0xa80e, 0x2050, 0x8006, 0x8006, 0x8007,
+	0x908c, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0xa076, 0xa172,
+	0xb000, 0xa07a, 0x2810, 0x080c, 0x1124, 0x00e8, 0xa97c, 0xa894,
+	0x0016, 0x0006, 0x080c, 0x6d64, 0x000e, 0x001e, 0xd1fc, 0x1138,
+	0xd1f4, 0x0128, 0x00c6, 0x2060, 0x080c, 0xabc9, 0x00ce, 0x7008,
+	0x2048, 0xa89f, 0x0000, 0xa8a3, 0x0000, 0x080c, 0x106c, 0x7007,
+	0x0000, 0x080c, 0x1143, 0x00ae, 0x0005, 0x0126, 0x2091, 0x8000,
+	0x782b, 0x1001, 0x7007, 0x0005, 0x7000, 0xc094, 0x7002, 0x012e,
+	0x0005, 0x0096, 0x2001, 0x192e, 0x204c, 0xa87c, 0x7812, 0xa88c,
+	0x7802, 0xa890, 0x7806, 0xa894, 0x780a, 0xa898, 0x780e, 0x782b,
+	0x0020, 0x0126, 0x2091, 0x8000, 0x782b, 0x0041, 0x7007, 0x0003,
+	0x7000, 0xc084, 0x7002, 0x2900, 0x700a, 0x012e, 0x009e, 0x0005,
+	0x20e1, 0x0000, 0x2099, 0x0088, 0x782b, 0x0040, 0x0096, 0x2001,
+	0x192e, 0x204c, 0xaa7c, 0x009e, 0x080c, 0x8bea, 0x2009, 0x188c,
+	0x2104, 0x9084, 0xfffc, 0x200a, 0x080c, 0x8a5d, 0x7007, 0x0000,
+	0x080c, 0x1154, 0x0005, 0x7007, 0x0000, 0x080c, 0x1154, 0x0005,
+	0x0126, 0x2091, 0x2200, 0x2079, 0x0300, 0x2071, 0x1a6b, 0x7003,
+	0x0000, 0x78bf, 0x00f6, 0x0041, 0x7807, 0x0007, 0x7803, 0x0000,
+	0x7803, 0x0001, 0x012e, 0x0005, 0x00c6, 0x7803, 0x0000, 0x2001,
+	0x0165, 0x2003, 0x4198, 0x7808, 0xd09c, 0x0118, 0x7820, 0x04e9,
+	0x0cd0, 0x2001, 0x1a6c, 0x2003, 0x0000, 0x78ab, 0x0004, 0x78ac,
+	0xd0ac, 0x1de8, 0x78ab, 0x0002, 0x7807, 0x0007, 0x7827, 0x0030,
+	0x782b, 0x0400, 0x7827, 0x0031, 0x782b, 0x1a7a, 0x781f, 0xff00,
+	0x781b, 0xff00, 0x2001, 0x0200, 0x2004, 0xd0dc, 0x0110, 0x781f,
+	0x0303, 0x2061, 0x1a7a, 0x602f, 0x1ddc, 0x2001, 0x181a, 0x2004,
+	0x9082, 0x1ddc, 0x6032, 0x603b, 0x1e55, 0x602b, 0x1aba, 0x6007,
+	0x1a9a, 0x2061, 0x1a9a, 0x60af, 0x193c, 0x2001, 0x1927, 0x2004,
+	0x60ba, 0x783f, 0x336d, 0x00ce, 0x0005, 0x9086, 0x000d, 0x11d0,
+	0x7808, 0xd09c, 0x01b8, 0x7820, 0x0026, 0x2010, 0x080c, 0xc802,
+	0x0180, 0x2260, 0x6000, 0x9086, 0x0004, 0x1158, 0x0016, 0x6120,
+	0x9186, 0x0009, 0x0108, 0x0020, 0x2009, 0x004c, 0x080c, 0xac68,
+	0x001e, 0x002e, 0x0005, 0x0126, 0x2091, 0x2200, 0x7908, 0x9184,
+	0x0070, 0x190c, 0x0d76, 0xd19c, 0x05a0, 0x7820, 0x908c, 0xf000,
+	0x0540, 0x2060, 0x6020, 0x9086, 0x0003, 0x1550, 0x6000, 0x9086,
+	0x0004, 0x1530, 0x6114, 0x2148, 0xa876, 0xa87a, 0xa867, 0x0103,
+	0x080c, 0x6b86, 0x00b6, 0x6010, 0x2058, 0xba3c, 0x8211, 0x0208,
+	0xba3e, 0xb8d0, 0x9005, 0x190c, 0x6749, 0x00be, 0x6044, 0xd0fc,
+	0x190c, 0xa89b, 0x080c, 0xabf2, 0x7808, 0xd09c, 0x19b0, 0x012e,
+	0x0005, 0x908a, 0x0024, 0x1a0c, 0x0d7d, 0x002b, 0x012e, 0x0005,
+	0x04b0, 0x012e, 0x0005, 0x1407, 0x142d, 0x145d, 0x1462, 0x1466,
+	0x146b, 0x1493, 0x1497, 0x14a5, 0x14a9, 0x1407, 0x1574, 0x1578,
+	0x15dd, 0x15e4, 0x1407, 0x15e5, 0x15e6, 0x15f1, 0x15f8, 0x1407,
+	0x1407, 0x1407, 0x1407, 0x1407, 0x1407, 0x1407, 0x146d, 0x1407,
+	0x1435, 0x145a, 0x1421, 0x1407, 0x1441, 0x140b, 0x1409, 0x080c,
+	0x0d7d, 0x080c, 0x0d76, 0x080c, 0x1603, 0x2009, 0x1a79, 0x2104,
+	0x8000, 0x200a, 0x080c, 0x7f85, 0x080c, 0x1ab5, 0x0005, 0x6044,
+	0xd0fc, 0x190c, 0xa89b, 0x2009, 0x0055, 0x080c, 0xac68, 0x012e,
+	0x0005, 0x080c, 0x1603, 0x2060, 0x6044, 0xd0fc, 0x190c, 0xa89b,
+	0x2009, 0x0055, 0x080c, 0xac68, 0x0005, 0x2009, 0x0048, 0x080c,
+	0x1603, 0x2060, 0x080c, 0xac68, 0x0005, 0x2009, 0x0054, 0x080c,
+	0x1603, 0x2060, 0x6044, 0xd0fc, 0x190c, 0xa89b, 0x080c, 0xac68,
+	0x0005, 0x080c, 0x1603, 0x2060, 0x0056, 0x0066, 0x080c, 0x1603,
+	0x2028, 0x080c, 0x1603, 0x2030, 0x0036, 0x0046, 0x2021, 0x0000,
+	0x2418, 0x2009, 0x0056, 0x080c, 0xac68, 0x004e, 0x003e, 0x006e,
+	0x005e, 0x0005, 0x080c, 0x1603, 0x0005, 0x7004, 0xc085, 0xc0b5,
+	0x7006, 0x0005, 0x7004, 0xc085, 0x7006, 0x0005, 0x080c, 0x1603,
+	0x080c, 0x16c7, 0x0005, 0x080c, 0x0d7d, 0x080c, 0x1603, 0x2060,
+	0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048,
+	0x080c, 0xac68, 0x2001, 0x015d, 0x2003, 0x0000, 0x2009, 0x03e8,
+	0x8109, 0x0160, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001,
+	0x0218, 0x2004, 0xd0ec, 0x1110, 0x080c, 0x1608, 0x2001, 0x0307,
+	0x2003, 0x8000, 0x0005, 0x7004, 0xc095, 0x7006, 0x0005, 0x080c,
+	0x1603, 0x2060, 0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e,
+	0x2009, 0x0048, 0x080c, 0xac68, 0x0005, 0x080c, 0x1603, 0x080c,
+	0x0d7d, 0x080c, 0x1603, 0x080c, 0x155f, 0x7827, 0x0018, 0x79ac,
+	0xd1dc, 0x0904, 0x1512, 0x7827, 0x0015, 0x7828, 0x782b, 0x0000,
+	0x9065, 0x0140, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020,
+	0x0804, 0x1518, 0x7004, 0x9005, 0x01c8, 0x1188, 0x78ab, 0x0004,
+	0x7827, 0x0018, 0x782b, 0x0000, 0xd1bc, 0x090c, 0x0d7d, 0x2001,
+	0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0804, 0x1544, 0x78ab,
+	0x0004, 0x7803, 0x0001, 0x080c, 0x1578, 0x0005, 0x7827, 0x0018,
+	0xa001, 0x7828, 0x7827, 0x0011, 0xa001, 0x7928, 0x9106, 0x0110,
+	0x79ac, 0x08e0, 0x00e6, 0x2071, 0x0200, 0x702c, 0xd0c4, 0x0140,
+	0x00ee, 0x080c, 0x1ab5, 0x080c, 0x133c, 0x7803, 0x0001, 0x0005,
+	0x7037, 0x0001, 0xa001, 0x7150, 0x00ee, 0x918c, 0xff00, 0x9186,
+	0x0500, 0x0110, 0x79ac, 0x0810, 0x7004, 0xc09d, 0x7006, 0x78ab,
+	0x0004, 0x7803, 0x0001, 0x080c, 0x1578, 0x2001, 0x020d, 0x2003,
+	0x0020, 0x0005, 0x7828, 0x782b, 0x0000, 0x9065, 0x090c, 0x0d7d,
+	0x6014, 0x2048, 0x78ab, 0x0004, 0x918c, 0x0700, 0x0198, 0x080c,
+	0x7f85, 0x080c, 0x1ab5, 0x080c, 0xc814, 0x0158, 0xa9ac, 0xa936,
+	0xa9b0, 0xa93a, 0xa83f, 0xffff, 0xa843, 0xffff, 0xa880, 0xc0bd,
+	0xa882, 0x0005, 0x6020, 0x9086, 0x0009, 0x1128, 0x2009, 0x004c,
+	0x080c, 0xac68, 0x0048, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be,
+	0xd0bc, 0x6024, 0x190c, 0xcc10, 0x2029, 0x00c8, 0x8529, 0x0128,
+	0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x7dbc, 0x080c, 0xe6af,
+	0xd5a4, 0x1118, 0x080c, 0x1608, 0x0005, 0x080c, 0x7f85, 0x080c,
+	0x1ab5, 0x0005, 0x781f, 0x0300, 0x7803, 0x0001, 0x0005, 0x0016,
+	0x0066, 0x0076, 0x00f6, 0x2079, 0x0300, 0x7908, 0x918c, 0x0007,
+	0x9186, 0x0003, 0x0120, 0x2001, 0x0016, 0x080c, 0x1679, 0x00fe,
+	0x007e, 0x006e, 0x001e, 0x0005, 0x7004, 0xc09d, 0x7006, 0x0005,
+	0x7104, 0x9184, 0x0004, 0x190c, 0x0d7d, 0xd184, 0x1189, 0xd19c,
+	0x0158, 0xc19c, 0x7106, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003,
+	0x0020, 0x080c, 0x1608, 0x0005, 0x81ff, 0x190c, 0x0d7d, 0x0005,
+	0xc184, 0xd1b4, 0xc1b4, 0x7106, 0x0016, 0x00e6, 0x15f0, 0x2071,
+	0x0200, 0x080c, 0x16b4, 0x05c8, 0x6014, 0x9005, 0x05b0, 0x0096,
+	0x2048, 0xa864, 0x009e, 0x9084, 0x00ff, 0x908e, 0x0029, 0x0160,
+	0x908e, 0x0048, 0x1550, 0x601c, 0xd084, 0x11e0, 0x00f6, 0x2c78,
+	0x080c, 0x1731, 0x00fe, 0x00b0, 0x00f6, 0x2c78, 0x080c, 0x18b8,
+	0x00fe, 0x2009, 0x01f4, 0x8109, 0x0168, 0x2001, 0x0201, 0x2004,
+	0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec, 0x1118, 0x080c,
+	0x1608, 0x0040, 0x2001, 0x020d, 0x2003, 0x0020, 0x080c, 0x133c,
+	0x7803, 0x0001, 0x00ee, 0x001e, 0x0005, 0x2001, 0x020d, 0x2003,
+	0x0050, 0x2003, 0x0020, 0x0461, 0x0ca8, 0x0429, 0x2060, 0x2009,
+	0x0053, 0x080c, 0xac68, 0x0005, 0x0005, 0x0005, 0x00e1, 0x2008,
+	0x00d1, 0x0006, 0x7004, 0xc09d, 0x7006, 0x000e, 0x080c, 0x8f47,
+	0x0005, 0x0089, 0x9005, 0x0118, 0x080c, 0x8b4a, 0x0cd0, 0x0005,
+	0x2001, 0x0036, 0x2009, 0x1820, 0x210c, 0x2011, 0x181f, 0x2214,
+	0x080c, 0x1679, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x0005,
+	0x080c, 0x155f, 0x00d6, 0x2069, 0x0200, 0x2009, 0x01f4, 0x8109,
+	0x0510, 0x6804, 0x9005, 0x0dd8, 0x2001, 0x015d, 0x2003, 0x0000,
+	0x79bc, 0xd1a4, 0x1528, 0x79b8, 0x918c, 0x0fff, 0x0180, 0x9182,
+	0x0841, 0x1268, 0x9188, 0x0007, 0x918c, 0x0ff8, 0x810c, 0x810c,
+	0x810c, 0x080c, 0x166b, 0x6827, 0x0001, 0x8109, 0x1dd0, 0x04d9,
+	0x6827, 0x0002, 0x04c1, 0x6804, 0x9005, 0x1130, 0x682c, 0xd0e4,
+	0x1500, 0x6804, 0x9005, 0x0de8, 0x79b8, 0xd1ec, 0x1130, 0x08c0,
+	0x080c, 0x7f85, 0x080c, 0x1ab5, 0x0090, 0x7827, 0x0015, 0x782b,
+	0x0000, 0x7827, 0x0018, 0x782b, 0x0000, 0x2001, 0x020d, 0x2003,
+	0x0020, 0x2001, 0x0307, 0x2003, 0x0300, 0x7803, 0x0001, 0x00de,
+	0x0005, 0x682c, 0x9084, 0x5400, 0x9086, 0x5400, 0x0d30, 0x7827,
+	0x0015, 0x782b, 0x0000, 0x7803, 0x0001, 0x6800, 0x9085, 0x1800,
+	0x6802, 0x00de, 0x0005, 0x6824, 0x9084, 0x0003, 0x1de0, 0x0005,
+	0x2001, 0x0030, 0x2c08, 0x621c, 0x0021, 0x7830, 0x9086, 0x0041,
+	0x0005, 0x00f6, 0x2079, 0x0300, 0x0006, 0x7808, 0xd09c, 0x0140,
+	0x0016, 0x0026, 0x00c6, 0x080c, 0x13a3, 0x00ce, 0x002e, 0x001e,
+	0x000e, 0x0006, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x0059,
+	0x1118, 0x000e, 0x00fe, 0x0005, 0x000e, 0x792c, 0x3900, 0x8000,
+	0x2004, 0x080c, 0x0d7d, 0x2009, 0xff00, 0x8109, 0x0120, 0x7818,
+	0xd0bc, 0x1dd8, 0x0005, 0x9085, 0x0001, 0x0005, 0x7832, 0x7936,
+	0x7a3a, 0x781b, 0x8080, 0x0c79, 0x1108, 0x0005, 0x792c, 0x3900,
+	0x8000, 0x2004, 0x080c, 0x0d7d, 0x7037, 0x0001, 0x7150, 0x7037,
+	0x0002, 0x7050, 0x2060, 0xd1bc, 0x1110, 0x7054, 0x2060, 0x918c,
+	0xff00, 0x9186, 0x0500, 0x0110, 0x9085, 0x0001, 0x0005, 0x00e6,
+	0x0016, 0x2071, 0x0200, 0x0c41, 0x6124, 0xd1dc, 0x01f8, 0x701c,
+	0xd08c, 0x0904, 0x1726, 0x7017, 0x0000, 0x2001, 0x0264, 0x2004,
+	0xd0bc, 0x0904, 0x1726, 0x2001, 0x0268, 0x00c6, 0x2064, 0x6104,
+	0x6038, 0x00ce, 0x918e, 0x0039, 0x1904, 0x1726, 0x9c06, 0x15f0,
+	0x0126, 0x2091, 0x2600, 0x080c, 0x7edd, 0x012e, 0x7358, 0x745c,
+	0x6014, 0x905d, 0x0598, 0x2b48, 0x6010, 0x00b6, 0x2058, 0xb800,
+	0x00be, 0xd0bc, 0x190c, 0xcbeb, 0xab42, 0xac3e, 0x2001, 0x1869,
+	0x2004, 0xd0b4, 0x1170, 0x601c, 0xd0e4, 0x1158, 0x6010, 0x00b6,
+	0x2058, 0xb800, 0x00be, 0xd0bc, 0x1120, 0xa83b, 0x7fff, 0xa837,
+	0xffff, 0x080c, 0x1e75, 0x1190, 0x080c, 0x1913, 0x2a00, 0xa816,
+	0x0130, 0x2800, 0xa80e, 0x2c05, 0xa80a, 0x2c00, 0xa812, 0x7037,
+	0x0020, 0x781f, 0x0300, 0x001e, 0x00ee, 0x0005, 0x7037, 0x0050,
+	0x7037, 0x0020, 0x001e, 0x00ee, 0x080c, 0x1608, 0x0005, 0x080c,
+	0x0d7d, 0x2cf0, 0x0126, 0x2091, 0x2200, 0x00c6, 0x3e60, 0x6014,
+	0x2048, 0x2940, 0x903e, 0x2730, 0xa864, 0x2068, 0xa81a, 0x9d84,
+	0x000f, 0x9088, 0x1e55, 0x2165, 0x0002, 0x175c, 0x17ca, 0x175c,
+	0x175c, 0x1760, 0x17ab, 0x175c, 0x1780, 0x1755, 0x17c1, 0x175c,
+	0x175c, 0x1765, 0x18b6, 0x1794, 0x178a, 0xa964, 0x918c, 0x00ff,
+	0x918e, 0x0048, 0x0904, 0x17c1, 0x9085, 0x0001, 0x0804, 0x18ad,
+	0xa87c, 0xd0ac, 0x0dc8, 0x0804, 0x17d1, 0xa87c, 0xd0ac, 0x0da0,
+	0x0804, 0x183c, 0xa898, 0x901d, 0x1108, 0xab9c, 0x9016, 0xaab2,
+	0xaa3e, 0xaa42, 0x3e00, 0x9080, 0x0008, 0x2004, 0x9080, 0x9110,
+	0x2005, 0x9005, 0x090c, 0x0d7d, 0x2004, 0xa8ae, 0x0804, 0x1895,
+	0xa87c, 0xd0bc, 0x09c8, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888,
+	0x0804, 0x17d1, 0xa87c, 0xd0bc, 0x0978, 0xa890, 0xa842, 0xa88c,
+	0xa83e, 0xa888, 0x0804, 0x183c, 0xa87c, 0xd0bc, 0x0928, 0xa890,
+	0xa842, 0xa88c, 0xa83e, 0xa804, 0x9045, 0x090c, 0x0d7d, 0xa164,
+	0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1e55, 0x2065, 0xa888, 0xd19c,
+	0x1904, 0x183c, 0x0430, 0xa87c, 0xd0ac, 0x0904, 0x175c, 0xa804,
+	0x9045, 0x090c, 0x0d7d, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80,
+	0x1e55, 0x2065, 0x9006, 0xa842, 0xa83e, 0xd19c, 0x1904, 0x183c,
+	0x0080, 0xa87c, 0xd0ac, 0x0904, 0x175c, 0x9006, 0xa842, 0xa83e,
+	0x0804, 0x183c, 0xa87c, 0xd0ac, 0x0904, 0x175c, 0x9006, 0xa842,
+	0xa83e, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0d7d, 0x9082, 0x001b,
+	0x0002, 0x17f4, 0x17f4, 0x17f6, 0x17f4, 0x17f4, 0x17f4, 0x1800,
+	0x17f4, 0x17f4, 0x17f4, 0x180a, 0x17f4, 0x17f4, 0x17f4, 0x1814,
+	0x17f4, 0x17f4, 0x17f4, 0x181e, 0x17f4, 0x17f4, 0x17f4, 0x1828,
+	0x17f4, 0x17f4, 0x17f4, 0x1832, 0x080c, 0x0d7d, 0xa574, 0xa478,
+	0x9d86, 0x0024, 0x0904, 0x176a, 0xa37c, 0xa280, 0x0804, 0x1895,
+	0xa584, 0xa488, 0x9d86, 0x0024, 0x0904, 0x176a, 0xa38c, 0xa290,
+	0x0804, 0x1895, 0xa594, 0xa498, 0x9d86, 0x0024, 0x0904, 0x176a,
+	0xa39c, 0xa2a0, 0x0804, 0x1895, 0xa5a4, 0xa4a8, 0x9d86, 0x0024,
+	0x0904, 0x176a, 0xa3ac, 0xa2b0, 0x0804, 0x1895, 0xa5b4, 0xa4b8,
+	0x9d86, 0x0024, 0x0904, 0x176a, 0xa3bc, 0xa2c0, 0x0804, 0x1895,
+	0xa5c4, 0xa4c8, 0x9d86, 0x0024, 0x0904, 0x176a, 0xa3cc, 0xa2d0,
+	0x0804, 0x1895, 0xa5d4, 0xa4d8, 0x9d86, 0x0024, 0x0904, 0x176a,
+	0xa3dc, 0xa2e0, 0x0804, 0x1895, 0x2c05, 0x908a, 0x0034, 0x1a0c,
+	0x0d7d, 0x9082, 0x001b, 0x0002, 0x185f, 0x185d, 0x185d, 0x185d,
+	0x185d, 0x185d, 0x186a, 0x185d, 0x185d, 0x185d, 0x185d, 0x185d,
+	0x1875, 0x185d, 0x185d, 0x185d, 0x185d, 0x185d, 0x1880, 0x185d,
+	0x185d, 0x185d, 0x185d, 0x185d, 0x188b, 0x080c, 0x0d7d, 0xa56c,
+	0xa470, 0xa774, 0xa678, 0x9d86, 0x002c, 0x0904, 0x176a, 0xa37c,
+	0xa280, 0x0458, 0xa584, 0xa488, 0xa78c, 0xa690, 0x9d86, 0x002c,
+	0x0904, 0x176a, 0xa394, 0xa298, 0x0400, 0xa59c, 0xa4a0, 0xa7a4,
+	0xa6a8, 0x9d86, 0x002c, 0x0904, 0x176a, 0xa3ac, 0xa2b0, 0x00a8,
+	0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0x9d86, 0x002c, 0x0904, 0x176a,
+	0xa3c4, 0xa2c8, 0x0050, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0x9d86,
+	0x002c, 0x0904, 0x176a, 0xa3dc, 0xa2e0, 0xab2e, 0xaa32, 0xad1e,
+	0xac22, 0xaf26, 0xae2a, 0xa988, 0x8c60, 0x2c1d, 0xa8ac, 0xaab0,
+	0xa836, 0xaa3a, 0x8109, 0xa916, 0x1158, 0x3e60, 0x601c, 0xc085,
+	0x601e, 0xa87c, 0xc0dd, 0xa87e, 0x9006, 0x00ce, 0x012e, 0x0005,
+	0x2800, 0xa80e, 0xab0a, 0x2c00, 0xa812, 0x0c78, 0x0804, 0x175c,
+	0x2ff0, 0x0126, 0x2091, 0x2200, 0x00c6, 0x3e60, 0x6014, 0x2048,
+	0x2940, 0xa80e, 0x2061, 0x1e50, 0xa813, 0x1e50, 0x2c05, 0xa80a,
+	0xa964, 0xa91a, 0xa87c, 0xd0ac, 0x090c, 0x0d7d, 0x9006, 0xa842,
+	0xa83e, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d7d, 0xadcc, 0xacd0,
+	0xafd4, 0xaed8, 0xabdc, 0xaae0, 0xab2e, 0xaa32, 0xad1e, 0xac22,
+	0xaf26, 0xae2a, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0xa988, 0xa864,
+	0x9084, 0x00ff, 0x9086, 0x0008, 0x1120, 0x8109, 0xa916, 0x0128,
+	0x0078, 0x918a, 0x0002, 0xa916, 0x1158, 0x3e60, 0x601c, 0xc085,
+	0x601e, 0xa87c, 0xc0dd, 0xa87e, 0x9006, 0x00ce, 0x012e, 0x0005,
+	0xa804, 0x9045, 0x090c, 0x0d7d, 0xa80e, 0xa064, 0xa81a, 0x9084,
+	0x000f, 0x9080, 0x1e55, 0x2015, 0x82ff, 0x090c, 0x0d7d, 0xaa12,
+	0x2205, 0xa80a, 0x0c10, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190,
+	0x2d00, 0x0002, 0x1a3d, 0x196a, 0x196a, 0x1a3d, 0x196a, 0x1a37,
+	0x1a3d, 0x196a, 0x19da, 0x19da, 0x19da, 0x1a3d, 0x19da, 0x1a3d,
+	0x1a34, 0x19da, 0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20,
+	0xdd9c, 0x0904, 0x1a3f, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d7d,
+	0x9082, 0x001b, 0x0002, 0x1956, 0x1954, 0x1954, 0x1954, 0x1954,
+	0x1954, 0x195a, 0x1954, 0x1954, 0x1954, 0x1954, 0x1954, 0x195e,
+	0x1954, 0x1954, 0x1954, 0x1954, 0x1954, 0x1962, 0x1954, 0x1954,
+	0x1954, 0x1954, 0x1954, 0x1966, 0x080c, 0x0d7d, 0xa774, 0xa678,
+	0x0804, 0x1a3f, 0xa78c, 0xa690, 0x0804, 0x1a3f, 0xa7a4, 0xa6a8,
+	0x0804, 0x1a3f, 0xa7bc, 0xa6c0, 0x0804, 0x1a3f, 0xa7d4, 0xa6d8,
+	0x0804, 0x1a3f, 0xa898, 0x901d, 0x1108, 0xab9c, 0x9016, 0x2c05,
+	0x908a, 0x0036, 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002, 0x1992,
+	0x1992, 0x1994, 0x1992, 0x1992, 0x1992, 0x199e, 0x1992, 0x1992,
+	0x1992, 0x19a8, 0x1992, 0x1992, 0x1992, 0x19b2, 0x1992, 0x1992,
+	0x1992, 0x19bc, 0x1992, 0x1992, 0x1992, 0x19c6, 0x1992, 0x1992,
+	0x1992, 0x19d0, 0x080c, 0x0d7d, 0xa574, 0xa478, 0x9d86, 0x0004,
+	0x0904, 0x1a3f, 0xa37c, 0xa280, 0x0804, 0x1a3f, 0xa584, 0xa488,
+	0x9d86, 0x0004, 0x0904, 0x1a3f, 0xa38c, 0xa290, 0x0804, 0x1a3f,
+	0xa594, 0xa498, 0x9d86, 0x0004, 0x0904, 0x1a3f, 0xa39c, 0xa2a0,
+	0x0804, 0x1a3f, 0xa5a4, 0xa4a8, 0x9d86, 0x0004, 0x0904, 0x1a3f,
+	0xa3ac, 0xa2b0, 0x0804, 0x1a3f, 0xa5b4, 0xa4b8, 0x9d86, 0x0004,
+	0x0904, 0x1a3f, 0xa3bc, 0xa2c0, 0x0804, 0x1a3f, 0xa5c4, 0xa4c8,
+	0x9d86, 0x0004, 0x0904, 0x1a3f, 0xa3cc, 0xa2d0, 0x0804, 0x1a3f,
+	0xa5d4, 0xa4d8, 0x9d86, 0x0004, 0x0904, 0x1a3f, 0xa3dc, 0xa2e0,
+	0x0804, 0x1a3f, 0xa898, 0x901d, 0x1108, 0xab9c, 0x9016, 0x2c05,
+	0x908a, 0x0034, 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002, 0x1a02,
+	0x1a00, 0x1a00, 0x1a00, 0x1a00, 0x1a00, 0x1a0c, 0x1a00, 0x1a00,
+	0x1a00, 0x1a00, 0x1a00, 0x1a16, 0x1a00, 0x1a00, 0x1a00, 0x1a00,
+	0x1a00, 0x1a20, 0x1a00, 0x1a00, 0x1a00, 0x1a00, 0x1a00, 0x1a2a,
+	0x080c, 0x0d7d, 0xa56c, 0xa470, 0xa774, 0xa678, 0x9d86, 0x000c,
+	0x05b0, 0xa37c, 0xa280, 0x0498, 0xa584, 0xa488, 0xa78c, 0xa690,
+	0x9d86, 0x000c, 0x0560, 0xa394, 0xa298, 0x0448, 0xa59c, 0xa4a0,
+	0xa7a4, 0xa6a8, 0x9d86, 0x000c, 0x0510, 0xa3ac, 0xa2b0, 0x00f8,
+	0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0x9d86, 0x000c, 0x01c0, 0xa3c4,
+	0xa2c8, 0x00a8, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0x9d86, 0x000c,
+	0x0170, 0xa3dc, 0xa2e0, 0x0058, 0x9d86, 0x000e, 0x1130, 0x080c,
+	0x1e2b, 0x1904, 0x1913, 0x900e, 0x0050, 0x080c, 0x0d7d, 0xab2e,
+	0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0x080c, 0x1e2b, 0x0005,
+	0x6014, 0x2048, 0x6118, 0x810c, 0x810c, 0x810c, 0x81ff, 0x1118,
+	0xa887, 0x0001, 0x0008, 0xa986, 0x601b, 0x0002, 0xa974, 0xd1dc,
+	0x1108, 0x0005, 0xa934, 0xa88c, 0x9106, 0x1158, 0xa938, 0xa890,
+	0x9106, 0x1138, 0x601c, 0xc084, 0x601e, 0x2009, 0x0048, 0x0804,
+	0xac68, 0x0005, 0x0126, 0x00c6, 0x2091, 0x2200, 0x00ce, 0x7908,
+	0x918c, 0x0007, 0x9186, 0x0000, 0x05b0, 0x9186, 0x0003, 0x0598,
+	0x6020, 0x6023, 0x0000, 0x0006, 0x2031, 0x0008, 0x00c6, 0x781f,
+	0x0808, 0x7808, 0xd09c, 0x0120, 0x080c, 0x13a3, 0x8631, 0x1db8,
+	0x00ce, 0x781f, 0x0800, 0x2031, 0x0168, 0x00c6, 0x7808, 0xd09c,
+	0x190c, 0x13a3, 0x00ce, 0x2001, 0x0038, 0x080c, 0x1b42, 0x7930,
+	0x9186, 0x0040, 0x0160, 0x9186, 0x0042, 0x190c, 0x0d7d, 0x2001,
+	0x001e, 0x8001, 0x1df0, 0x8631, 0x1d40, 0x080c, 0x1b51, 0x000e,
+	0x6022, 0x012e, 0x0005, 0x080c, 0x1b3e, 0x7827, 0x0015, 0x7828,
+	0x9c06, 0x1db8, 0x782b, 0x0000, 0x0ca0, 0x00f6, 0x2079, 0x0300,
+	0x7803, 0x0000, 0x78ab, 0x0004, 0x00fe, 0x080c, 0x74d5, 0x11b0,
+	0x2001, 0x0138, 0x2003, 0x0000, 0x2001, 0x0160, 0x2003, 0x0000,
+	0x2011, 0x012c, 0xa001, 0xa001, 0x8211, 0x1de0, 0x0081, 0x2001,
+	0x0386, 0x2003, 0x2020, 0x080c, 0x7576, 0x0005, 0x0479, 0x0039,
+	0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0005, 0x00e6,
+	0x2071, 0x0200, 0x080c, 0x29fc, 0x2009, 0x003c, 0x080c, 0x21b0,
+	0x2001, 0x015d, 0x2003, 0x0000, 0x7000, 0x9084, 0x003c, 0x1de0,
+	0x080c, 0x8522, 0x70a0, 0x70a2, 0x7098, 0x709a, 0x709c, 0x709e,
+	0x2001, 0x020d, 0x2003, 0x0020, 0x00f6, 0x2079, 0x0300, 0x080c,
+	0x133c, 0x7803, 0x0001, 0x00fe, 0x00ee, 0x0005, 0x2001, 0x0138,
+	0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, 0x2003, 0x0000,
+	0x080c, 0x74d5, 0x1108, 0x0005, 0x2021, 0x0260, 0x2001, 0x0141,
+	0x201c, 0xd3dc, 0x1168, 0x2001, 0x0109, 0x201c, 0x939c, 0x0048,
+	0x1160, 0x2001, 0x0111, 0x201c, 0x83ff, 0x1110, 0x8421, 0x1d70,
+	0x2001, 0x015d, 0x2003, 0x0000, 0x0005, 0x0046, 0x2021, 0x0019,
+	0x2003, 0x0048, 0xa001, 0xa001, 0x201c, 0x939c, 0x0048, 0x0120,
+	0x8421, 0x1db0, 0x004e, 0x0c60, 0x004e, 0x0c40, 0x601c, 0xc084,
+	0x601e, 0x0005, 0x2c08, 0x621c, 0x080c, 0x1679, 0x7930, 0x0005,
+	0x2c08, 0x621c, 0x080c, 0x16a6, 0x7930, 0x0005, 0x8001, 0x1df0,
+	0x0005, 0x2031, 0x0005, 0x781c, 0x9084, 0x0007, 0x0170, 0x2001,
+	0x0038, 0x0c41, 0x9186, 0x0040, 0x0904, 0x1baf, 0x2001, 0x001e,
+	0x0c69, 0x8631, 0x1d80, 0x080c, 0x0d7d, 0x781f, 0x0202, 0x2001,
+	0x015d, 0x2003, 0x0000, 0x2001, 0x0b10, 0x0c01, 0x781c, 0xd084,
+	0x0110, 0x0861, 0x04e0, 0x2001, 0x0030, 0x0891, 0x9186, 0x0040,
+	0x0568, 0x781c, 0xd084, 0x1da8, 0x781f, 0x0101, 0x2001, 0x0014,
+	0x0869, 0x2001, 0x0037, 0x0821, 0x9186, 0x0040, 0x0140, 0x2001,
+	0x0030, 0x080c, 0x1b48, 0x9186, 0x0040, 0x190c, 0x0d7d, 0x00d6,
+	0x2069, 0x0200, 0x692c, 0xd1f4, 0x1170, 0xd1c4, 0x0160, 0xd19c,
+	0x0130, 0x6800, 0x9085, 0x1800, 0x6802, 0x00de, 0x0080, 0x6908,
+	0x9184, 0x0007, 0x1db0, 0x00de, 0x781f, 0x0100, 0x791c, 0x9184,
+	0x0007, 0x090c, 0x0d7d, 0xa001, 0xa001, 0x781f, 0x0200, 0x0005,
+	0x0126, 0x2091, 0x2400, 0x2079, 0x0380, 0x2001, 0x19e7, 0x2070,
+	0x012e, 0x0005, 0x2cf0, 0x0126, 0x2091, 0x2400, 0x3e60, 0x6014,
+	0x2048, 0xa964, 0xa91a, 0x918c, 0x00ff, 0x9184, 0x000f, 0x0002,
+	0x1be4, 0x1be4, 0x1be4, 0x1be6, 0x1be4, 0x1be4, 0x1be4, 0x1be4,
+	0x1bd8, 0x1bee, 0x1be4, 0x1bea, 0x1be4, 0x1be4, 0x1be4, 0x1be4,
+	0x9086, 0x0008, 0x1148, 0xa87c, 0xd0b4, 0x0904, 0x1d5e, 0x2011,
+	0x1e50, 0x2205, 0xab88, 0x00a8, 0x080c, 0x0d7d, 0x9186, 0x0013,
+	0x0128, 0x0cd0, 0x9186, 0x001b, 0x0108, 0x0cb0, 0xa87c, 0xd0b4,
+	0x0904, 0x1d5e, 0x9184, 0x000f, 0x9080, 0x1e55, 0x2015, 0x2205,
+	0xab88, 0x2908, 0xa80a, 0xa90e, 0xaa12, 0xab16, 0x9006, 0xa842,
+	0xa83e, 0x012e, 0x0005, 0x2cf0, 0x0126, 0x2091, 0x2400, 0x3e60,
+	0x6014, 0x2048, 0xa88c, 0xa990, 0xaaac, 0xabb0, 0xaa36, 0xab3a,
+	0xa83e, 0xa942, 0xa846, 0xa94a, 0xa964, 0x918c, 0x00ff, 0x9186,
+	0x001e, 0x0198, 0x2940, 0xa064, 0xa81a, 0x90ec, 0x000f, 0x9d80,
+	0x1e55, 0x2065, 0x2c05, 0x2808, 0x2c10, 0xab88, 0xa80a, 0xa90e,
+	0xaa12, 0xab16, 0x012e, 0x3e60, 0x0005, 0xa804, 0x2040, 0x0c58,
+	0x2cf0, 0x0126, 0x2091, 0x2400, 0x3e60, 0x6014, 0x2048, 0xa97c,
+	0x2950, 0xd1dc, 0x1904, 0x1d28, 0xc1dd, 0xa97e, 0x9006, 0xa842,
+	0xa83e, 0xa988, 0x8109, 0xa916, 0xa964, 0xa91a, 0x9184, 0x000f,
+	0x9088, 0x1e55, 0x2145, 0x0002, 0x1c5c, 0x1c6a, 0x1c5c, 0x1c5c,
+	0x1c5c, 0x1c5e, 0x1c5c, 0x1c5c, 0x1cbf, 0x1cbf, 0x1c5c, 0x1c5c,
+	0x1c5c, 0x1cbd, 0x1c5c, 0x1c5c, 0x080c, 0x0d7d, 0xa804, 0x2050,
+	0xb164, 0xa91a, 0x9184, 0x000f, 0x9080, 0x1e55, 0x2045, 0xd19c,
+	0x1904, 0x1cbf, 0x9036, 0x2638, 0x2805, 0x908a, 0x0036, 0x1a0c,
+	0x0d7d, 0x9082, 0x001b, 0x0002, 0x1c8f, 0x1c8f, 0x1c91, 0x1c8f,
+	0x1c8f, 0x1c8f, 0x1c97, 0x1c8f, 0x1c8f, 0x1c8f, 0x1c9d, 0x1c8f,
+	0x1c8f, 0x1c8f, 0x1ca3, 0x1c8f, 0x1c8f, 0x1c8f, 0x1ca9, 0x1c8f,
+	0x1c8f, 0x1c8f, 0x1caf, 0x1c8f, 0x1c8f, 0x1c8f, 0x1cb5, 0x080c,
+	0x0d7d, 0xb574, 0xb478, 0xb37c, 0xb280, 0x0804, 0x1d04, 0xb584,
+	0xb488, 0xb38c, 0xb290, 0x0804, 0x1d04, 0xb594, 0xb498, 0xb39c,
+	0xb2a0, 0x0804, 0x1d04, 0xb5a4, 0xb4a8, 0xb3ac, 0xb2b0, 0x0804,
+	0x1d04, 0xb5b4, 0xb4b8, 0xb3bc, 0xb2c0, 0x0804, 0x1d04, 0xb5c4,
+	0xb4c8, 0xb3cc, 0xb2d0, 0x0804, 0x1d04, 0xb5d4, 0xb4d8, 0xb3dc,
+	0xb2e0, 0x0804, 0x1d04, 0x0804, 0x1d04, 0x080c, 0x0d7d, 0x2805,
+	0x908a, 0x0034, 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002, 0x1ce2,
+	0x1ce0, 0x1ce0, 0x1ce0, 0x1ce0, 0x1ce0, 0x1ce9, 0x1ce0, 0x1ce0,
+	0x1ce0, 0x1ce0, 0x1ce0, 0x1cf0, 0x1ce0, 0x1ce0, 0x1ce0, 0x1ce0,
+	0x1ce0, 0x1cf7, 0x1ce0, 0x1ce0, 0x1ce0, 0x1ce0, 0x1ce0, 0x1cfe,
+	0x080c, 0x0d7d, 0xb56c, 0xb470, 0xb774, 0xb678, 0xb37c, 0xb280,
+	0x00d8, 0xb584, 0xb488, 0xb78c, 0xb690, 0xb394, 0xb298, 0x00a0,
+	0xb59c, 0xb4a0, 0xb7a4, 0xb6a8, 0xb3ac, 0xb2b0, 0x0068, 0xb5b4,
+	0xb4b8, 0xb7bc, 0xb6c0, 0xb3c4, 0xb2c8, 0x0030, 0xb5cc, 0xb4d0,
+	0xb7d4, 0xb6d8, 0xb3dc, 0xb2e0, 0xab2e, 0xaa32, 0xad1e, 0xac22,
+	0xaf26, 0xae2a, 0xa988, 0x8109, 0xa916, 0x1118, 0x9006, 0x012e,
+	0x0005, 0x8840, 0x2805, 0x9005, 0x1168, 0xb004, 0x9005, 0x090c,
+	0x0d7d, 0x2050, 0xb164, 0xa91a, 0x9184, 0x000f, 0x9080, 0x1e55,
+	0x2045, 0x2805, 0x2810, 0x2a08, 0xa80a, 0xa90e, 0xaa12, 0x0c30,
+	0x3e60, 0x6344, 0xd3fc, 0x190c, 0x0d7d, 0xa93c, 0xaa40, 0xa844,
+	0x9106, 0x1118, 0xa848, 0x9206, 0x0508, 0x2958, 0xab48, 0xac44,
+	0x2940, 0x080c, 0x1e75, 0x1998, 0x2850, 0x2c40, 0xab14, 0xa880,
+	0xd0fc, 0x1140, 0xa810, 0x2005, 0xa80a, 0x2a00, 0xa80e, 0x2009,
+	0x8015, 0x0070, 0x00c6, 0x3e60, 0x6044, 0xc0a4, 0x9085, 0x8005,
+	0x6046, 0x00ce, 0x8319, 0xab16, 0x1904, 0x1d11, 0x2009, 0x8005,
+	0x3e60, 0x6044, 0x9105, 0x6046, 0x0804, 0x1d0e, 0x080c, 0x0d7d,
+	0x00f6, 0x00e6, 0x0096, 0x00c6, 0x0026, 0x704c, 0x9c06, 0x190c,
+	0x0d7d, 0x2079, 0x0090, 0x2001, 0x0105, 0x2003, 0x0010, 0x782b,
+	0x0004, 0x7057, 0x0000, 0x6014, 0x2048, 0x080c, 0xc814, 0x0118,
+	0xa880, 0xc0bd, 0xa882, 0x6020, 0x9086, 0x0006, 0x1170, 0x2061,
+	0x0100, 0x62c8, 0x2001, 0x00fa, 0x8001, 0x1df0, 0x60c8, 0x9206,
+	0x1dc0, 0x60c4, 0xa89a, 0x60c8, 0xa896, 0x704c, 0x2060, 0x00c6,
+	0x080c, 0xc41f, 0x080c, 0xa872, 0x00ce, 0x704c, 0x9c06, 0x1150,
+	0x2009, 0x0040, 0x080c, 0x21b0, 0x080c, 0xa32a, 0x2011, 0x0000,
+	0x080c, 0xa1b5, 0x002e, 0x00ce, 0x009e, 0x00ee, 0x00fe, 0x0005,
+	0x00f6, 0x2079, 0x0090, 0x781c, 0x0006, 0x7818, 0x0006, 0x2079,
+	0x0100, 0x7a14, 0x9284, 0x1984, 0x9085, 0x0012, 0x7816, 0x2019,
+	0x1000, 0x8319, 0x090c, 0x0d7d, 0x7820, 0xd0bc, 0x1dd0, 0x79c8,
+	0x000e, 0x9102, 0x001e, 0x0006, 0x0016, 0x79c4, 0x000e, 0x9103,
+	0x78c6, 0x000e, 0x78ca, 0x9284, 0x1984, 0x9085, 0x0012, 0x7816,
+	0x2079, 0x0090, 0x782b, 0x0008, 0x7057, 0x0000, 0x00fe, 0x0005,
+	0x00f6, 0x00e6, 0x2071, 0x19e7, 0x7054, 0x9086, 0x0000, 0x0904,
+	0x1e26, 0x2079, 0x0090, 0x2009, 0x0207, 0x210c, 0xd194, 0x01b8,
+	0x2009, 0x020c, 0x210c, 0x9184, 0x0003, 0x0188, 0x080c, 0xe6f8,
+	0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0d7d, 0x0016, 0x2009,
+	0x0040, 0x080c, 0x21b0, 0x001e, 0x2001, 0x020c, 0x2102, 0x2009,
+	0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, 0x2009,
+	0x0040, 0x080c, 0x21b0, 0x782c, 0xd0fc, 0x09a8, 0x080c, 0xa88e,
+	0x782c, 0xd0fc, 0x1de8, 0x080c, 0xa872, 0x7054, 0x9086, 0x0000,
+	0x1950, 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040,
+	0x080c, 0x21b0, 0x782b, 0x0002, 0x7057, 0x0000, 0x00ee, 0x00fe,
+	0x0005, 0x080c, 0x0d7d, 0x8c60, 0x2c05, 0x9005, 0x0110, 0x8a51,
+	0x0005, 0xa004, 0x9005, 0x0168, 0xa85a, 0x2040, 0xa064, 0x9084,
+	0x000f, 0x9080, 0x1e55, 0x2065, 0x8cff, 0x090c, 0x0d7d, 0x8a51,
+	0x0005, 0x2050, 0x0005, 0x0000, 0x001d, 0x0021, 0x0025, 0x0029,
+	0x002d, 0x0031, 0x0035, 0x0000, 0x001b, 0x0021, 0x0027, 0x002d,
+	0x0033, 0x0000, 0x0000, 0x0023, 0x0000, 0x0000, 0x1e48, 0x1e44,
+	0x1e48, 0x1e48, 0x1e52, 0x0000, 0x1e48, 0x1e4f, 0x1e4f, 0x1e4c,
+	0x1e4f, 0x1e4f, 0x0000, 0x1e52, 0x1e4f, 0x0000, 0x1e4a, 0x1e4a,
+	0x0000, 0x1e4a, 0x1e52, 0x0000, 0x1e4a, 0x1e50, 0x1e50, 0x1e50,
+	0x0000, 0x1e50, 0x0000, 0x1e52, 0x1e50, 0x00c6, 0x00d6, 0x0086,
+	0xab42, 0xac3e, 0xa888, 0x9055, 0x0904, 0x2054, 0x2940, 0xa064,
+	0x90ec, 0x000f, 0x9084, 0x00ff, 0x9086, 0x0008, 0x1118, 0x2061,
+	0x1e50, 0x00d0, 0x9de0, 0x1e55, 0x9d86, 0x0007, 0x0130, 0x9d86,
+	0x000e, 0x0118, 0x9d86, 0x000f, 0x1120, 0xa08c, 0x9422, 0xa090,
+	0x931b, 0x2c05, 0x9065, 0x1140, 0x0310, 0x0804, 0x2054, 0xa004,
+	0x9045, 0x0904, 0x2054, 0x08d8, 0x2c05, 0x9005, 0x0904, 0x1f3c,
+	0xdd9c, 0x1904, 0x1ef8, 0x908a, 0x0036, 0x1a0c, 0x0d7d, 0x9082,
+	0x001b, 0x0002, 0x1ecd, 0x1ecd, 0x1ecf, 0x1ecd, 0x1ecd, 0x1ecd,
+	0x1ed5, 0x1ecd, 0x1ecd, 0x1ecd, 0x1edb, 0x1ecd, 0x1ecd, 0x1ecd,
+	0x1ee1, 0x1ecd, 0x1ecd, 0x1ecd, 0x1ee7, 0x1ecd, 0x1ecd, 0x1ecd,
+	0x1eed, 0x1ecd, 0x1ecd, 0x1ecd, 0x1ef3, 0x080c, 0x0d7d, 0xa07c,
+	0x9422, 0xa080, 0x931b, 0x0804, 0x1f32, 0xa08c, 0x9422, 0xa090,
+	0x931b, 0x0804, 0x1f32, 0xa09c, 0x9422, 0xa0a0, 0x931b, 0x0804,
+	0x1f32, 0xa0ac, 0x9422, 0xa0b0, 0x931b, 0x0804, 0x1f32, 0xa0bc,
+	0x9422, 0xa0c0, 0x931b, 0x0804, 0x1f32, 0xa0cc, 0x9422, 0xa0d0,
+	0x931b, 0x0804, 0x1f32, 0xa0dc, 0x9422, 0xa0e0, 0x931b, 0x04d0,
+	0x908a, 0x0034, 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002, 0x1f1a,
+	0x1f18, 0x1f18, 0x1f18, 0x1f18, 0x1f18, 0x1f1f, 0x1f18, 0x1f18,
+	0x1f18, 0x1f18, 0x1f18, 0x1f24, 0x1f18, 0x1f18, 0x1f18, 0x1f18,
+	0x1f18, 0x1f29, 0x1f18, 0x1f18, 0x1f18, 0x1f18, 0x1f18, 0x1f2e,
+	0x080c, 0x0d7d, 0xa07c, 0x9422, 0xa080, 0x931b, 0x0098, 0xa094,
+	0x9422, 0xa098, 0x931b, 0x0070, 0xa0ac, 0x9422, 0xa0b0, 0x931b,
+	0x0048, 0xa0c4, 0x9422, 0xa0c8, 0x931b, 0x0020, 0xa0dc, 0x9422,
+	0xa0e0, 0x931b, 0x0630, 0x2300, 0x9405, 0x0160, 0x8a51, 0x0904,
+	0x2054, 0x8c60, 0x0804, 0x1ea4, 0xa004, 0x9045, 0x0904, 0x2054,
+	0x0804, 0x1e7f, 0x8a51, 0x0904, 0x2054, 0x8c60, 0x2c05, 0x9005,
+	0x1158, 0xa004, 0x9045, 0x0904, 0x2054, 0xa064, 0x90ec, 0x000f,
+	0x9de0, 0x1e55, 0x2c05, 0x2060, 0xa880, 0xc0fc, 0xa882, 0x0804,
+	0x2049, 0x2c05, 0x8422, 0x8420, 0x831a, 0x9399, 0x0000, 0xac2e,
+	0xab32, 0xdd9c, 0x1904, 0x1fe6, 0x9082, 0x001b, 0x0002, 0x1f82,
+	0x1f82, 0x1f84, 0x1f82, 0x1f82, 0x1f82, 0x1f92, 0x1f82, 0x1f82,
+	0x1f82, 0x1fa0, 0x1f82, 0x1f82, 0x1f82, 0x1fae, 0x1f82, 0x1f82,
+	0x1f82, 0x1fbc, 0x1f82, 0x1f82, 0x1f82, 0x1fca, 0x1f82, 0x1f82,
+	0x1f82, 0x1fd8, 0x080c, 0x0d7d, 0xa17c, 0x2400, 0x9122, 0xa180,
+	0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa074, 0x9420, 0xa078, 0x9319,
+	0x0804, 0x2044, 0xa18c, 0x2400, 0x9122, 0xa190, 0x2300, 0x911b,
+	0x0a0c, 0x0d7d, 0xa084, 0x9420, 0xa088, 0x9319, 0x0804, 0x2044,
+	0xa19c, 0x2400, 0x9122, 0xa1a0, 0x2300, 0x911b, 0x0a0c, 0x0d7d,
+	0xa094, 0x9420, 0xa098, 0x9319, 0x0804, 0x2044, 0xa1ac, 0x2400,
+	0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa0a4, 0x9420,
+	0xa0a8, 0x9319, 0x0804, 0x2044, 0xa1bc, 0x2400, 0x9122, 0xa1c0,
+	0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa0b4, 0x9420, 0xa0b8, 0x9319,
+	0x0804, 0x2044, 0xa1cc, 0x2400, 0x9122, 0xa1d0, 0x2300, 0x911b,
+	0x0a0c, 0x0d7d, 0xa0c4, 0x9420, 0xa0c8, 0x9319, 0x0804, 0x2044,
+	0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, 0x0a0c, 0x0d7d,
+	0xa0d4, 0x9420, 0xa0d8, 0x9319, 0x0804, 0x2044, 0x9082, 0x001b,
+	0x0002, 0x2004, 0x2002, 0x2002, 0x2002, 0x2002, 0x2002, 0x2011,
+	0x2002, 0x2002, 0x2002, 0x2002, 0x2002, 0x201e, 0x2002, 0x2002,
+	0x2002, 0x2002, 0x2002, 0x202b, 0x2002, 0x2002, 0x2002, 0x2002,
+	0x2002, 0x2038, 0x080c, 0x0d7d, 0xa17c, 0x2400, 0x9122, 0xa180,
+	0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa06c, 0x9420, 0xa070, 0x9319,
+	0x0498, 0xa194, 0x2400, 0x9122, 0xa198, 0x2300, 0x911b, 0x0a0c,
+	0x0d7d, 0xa084, 0x9420, 0xa088, 0x9319, 0x0430, 0xa1ac, 0x2400,
+	0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa09c, 0x9420,
+	0xa0a0, 0x9319, 0x00c8, 0xa1c4, 0x2400, 0x9122, 0xa1c8, 0x2300,
+	0x911b, 0x0a0c, 0x0d7d, 0xa0b4, 0x9420, 0xa0b8, 0x9319, 0x0060,
+	0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, 0x0a0c, 0x0d7d,
+	0xa0cc, 0x9420, 0xa0d0, 0x9319, 0xac1e, 0xab22, 0xa880, 0xc0fd,
+	0xa882, 0x2800, 0xa85a, 0x2c00, 0xa812, 0x2a00, 0xa816, 0x000e,
+	0x000e, 0x000e, 0x9006, 0x0028, 0x008e, 0x00de, 0x00ce, 0x9085,
+	0x0001, 0x0005, 0x00c6, 0x610c, 0x0016, 0x9026, 0x2410, 0x6004,
+	0x9420, 0x9291, 0x0000, 0x2c04, 0x9210, 0x9ce0, 0x0002, 0x918a,
+	0x0002, 0x1da8, 0x9284, 0x000f, 0x9405, 0x001e, 0x00ce, 0x0005,
+	0x7803, 0x0003, 0x780f, 0x0000, 0x6004, 0x7812, 0x2c04, 0x7816,
+	0x9ce0, 0x0002, 0x918a, 0x0002, 0x1db8, 0x0005, 0x2001, 0x0005,
+	0x2004, 0xd0bc, 0x190c, 0x0d76, 0xd094, 0x0110, 0x080c, 0x11de,
+	0x0005, 0x0126, 0x2091, 0x2600, 0x2079, 0x0200, 0x2071, 0x0260,
+	0x2069, 0x1800, 0x7817, 0x0000, 0x789b, 0x0814, 0x78a3, 0x0406,
+	0x789f, 0x0410, 0x2009, 0x013b, 0x200b, 0x0400, 0x781b, 0x0002,
+	0x783b, 0x001f, 0x7837, 0x0020, 0x7803, 0x1600, 0x012e, 0x0005,
+	0x2091, 0x2600, 0x781c, 0xd0a4, 0x190c, 0x21ad, 0x7900, 0xd1dc,
+	0x1118, 0x9084, 0x0006, 0x001a, 0x9084, 0x000e, 0x0002, 0x20cf,
+	0x20c7, 0x7edd, 0x20c7, 0x20c9, 0x20c9, 0x20c9, 0x20c9, 0x7ec3,
+	0x20c7, 0x20cb, 0x20c7, 0x20c9, 0x20c7, 0x20c9, 0x20c7, 0x080c,
+	0x0d7d, 0x0031, 0x0020, 0x080c, 0x7ec3, 0x080c, 0x7edd, 0x0005,
+	0x0006, 0x0016, 0x0026, 0x080c, 0xe6f8, 0x7930, 0x9184, 0x0003,
+	0x01f0, 0x080c, 0xa872, 0x2001, 0x19fa, 0x2004, 0x9005, 0x0180,
+	0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0d7d, 0x00c6, 0x2001,
+	0x19fa, 0x2064, 0x080c, 0xa88e, 0x080c, 0xc41f, 0x00ce, 0x0408,
+	0x2009, 0x0040, 0x080c, 0x21b0, 0x080c, 0xa88e, 0x00d0, 0x9184,
+	0x0014, 0x01a0, 0x6a00, 0x9286, 0x0003, 0x0160, 0x080c, 0x74d5,
+	0x1138, 0x080c, 0x77d9, 0x080c, 0x6022, 0x080c, 0x7406, 0x0010,
+	0x080c, 0x5edd, 0x080c, 0x7f7b, 0x0041, 0x0018, 0x9184, 0x9540,
+	0x1dc8, 0x002e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x0036, 0x0046,
+	0x0056, 0x2071, 0x1a6b, 0x080c, 0x1ab5, 0x005e, 0x004e, 0x003e,
+	0x00ee, 0x0005, 0x0126, 0x2091, 0x2e00, 0x2071, 0x1800, 0x7128,
+	0x2001, 0x196f, 0x2102, 0x2001, 0x1977, 0x2102, 0x2001, 0x013b,
+	0x2102, 0x2079, 0x0200, 0x2001, 0x0201, 0x789e, 0x78a3, 0x0200,
+	0x9198, 0x0007, 0x831c, 0x831c, 0x831c, 0x9398, 0x0005, 0x2320,
+	0x9182, 0x0204, 0x1230, 0x2011, 0x0008, 0x8423, 0x8423, 0x8423,
+	0x0488, 0x9182, 0x024c, 0x1240, 0x2011, 0x0007, 0x8403, 0x8003,
+	0x9400, 0x9400, 0x9420, 0x0430, 0x9182, 0x02bc, 0x1238, 0x2011,
+	0x0006, 0x8403, 0x8003, 0x9400, 0x9420, 0x00e0, 0x9182, 0x034c,
+	0x1230, 0x2011, 0x0005, 0x8403, 0x8003, 0x9420, 0x0098, 0x9182,
+	0x042c, 0x1228, 0x2011, 0x0004, 0x8423, 0x8423, 0x0058, 0x9182,
+	0x059c, 0x1228, 0x2011, 0x0003, 0x8403, 0x9420, 0x0018, 0x2011,
+	0x0002, 0x8423, 0x9482, 0x0228, 0x8002, 0x8020, 0x8301, 0x9402,
+	0x0110, 0x0208, 0x8321, 0x8217, 0x8203, 0x9405, 0x789a, 0x012e,
+	0x0005, 0x0006, 0x00d6, 0x2069, 0x0200, 0x6814, 0x9084, 0xffc0,
+	0x910d, 0x6916, 0x00de, 0x000e, 0x0005, 0x00d6, 0x2069, 0x0200,
+	0x9005, 0x6810, 0x0110, 0xc0a5, 0x0008, 0xc0a4, 0x6812, 0x00de,
+	0x0005, 0x0006, 0x00d6, 0x2069, 0x0200, 0x6810, 0x9084, 0xfff8,
+	0x910d, 0x6912, 0x00de, 0x000e, 0x0005, 0x7938, 0x080c, 0x0d76,
+	0x00f6, 0x2079, 0x0200, 0x7902, 0xa001, 0xa001, 0xa001, 0xa001,
+	0xa001, 0xa001, 0x7902, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001,
+	0xa001, 0x00fe, 0x0005, 0x0126, 0x2091, 0x2800, 0x2061, 0x0100,
+	0x2071, 0x1800, 0x2009, 0x0000, 0x080c, 0x29f6, 0x080c, 0x2916,
+	0x080c, 0x2a67, 0x9006, 0x080c, 0x2945, 0x9006, 0x080c, 0x2928,
+	0x20a9, 0x0012, 0x1d04, 0x21da, 0x2091, 0x6000, 0x1f04, 0x21da,
+	0x602f, 0x0100, 0x602f, 0x0000, 0x6050, 0x9085, 0x0400, 0x9084,
+	0xdfff, 0x6052, 0x6224, 0x080c, 0x2a44, 0x080c, 0x2634, 0x2009,
+	0x00ef, 0x6132, 0x6136, 0x080c, 0x2644, 0x60e7, 0x0000, 0x61ea,
+	0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f, 0x0080,
+	0x602f, 0x0000, 0x6007, 0x349f, 0x00c6, 0x2061, 0x0140, 0x608b,
+	0x000b, 0x608f, 0x10b8, 0x6093, 0x0000, 0x6097, 0x0198, 0x00ce,
+	0x6004, 0x9085, 0x8000, 0x6006, 0x60bb, 0x0000, 0x20a9, 0x0018,
+	0x60bf, 0x0000, 0x1f04, 0x2218, 0x60bb, 0x0000, 0x60bf, 0x0108,
+	0x60bf, 0x0012, 0x60bf, 0x0405, 0x60bf, 0x0014, 0x60bf, 0x0320,
+	0x60bf, 0x0018, 0x601b, 0x00f0, 0x601f, 0x001e, 0x600f, 0x006b,
+	0x602b, 0x402c, 0x012e, 0x0005, 0x00f6, 0x2079, 0x0140, 0x78c3,
+	0x0080, 0x78c3, 0x0083, 0x78c3, 0x0000, 0x00fe, 0x0005, 0x2001,
+	0x1835, 0x2003, 0x0000, 0x2001, 0x1834, 0x2003, 0x0001, 0x0005,
+	0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x6124, 0x6028,
+	0x910c, 0x0066, 0x2031, 0x1837, 0x2634, 0x96b4, 0x0028, 0x006e,
+	0x1138, 0x6020, 0xd1bc, 0x0120, 0xd0bc, 0x1168, 0xd0b4, 0x1198,
+	0x9184, 0x5e2c, 0x1118, 0x9184, 0x0007, 0x00aa, 0x9195, 0x0004,
+	0x9284, 0x0007, 0x0082, 0x0016, 0x2001, 0x0387, 0x200c, 0xd1a4,
+	0x001e, 0x0d70, 0x0c98, 0x0016, 0x2001, 0x0387, 0x200c, 0xd1b4,
+	0x001e, 0x0d30, 0x0c58, 0x2286, 0x2283, 0x2283, 0x2283, 0x2285,
+	0x2283, 0x2283, 0x2283, 0x080c, 0x0d7d, 0x0029, 0x002e, 0x001e,
+	0x000e, 0x012e, 0x0005, 0x00a6, 0x6124, 0x6028, 0xd09c, 0x0118,
+	0xd19c, 0x1904, 0x2500, 0xd1f4, 0x190c, 0x0d76, 0x080c, 0x74d5,
+	0x0904, 0x22e3, 0x080c, 0xcf2e, 0x1120, 0x7000, 0x9086, 0x0003,
+	0x0580, 0x6024, 0x9084, 0x1800, 0x0560, 0x080c, 0x74f8, 0x0118,
+	0x080c, 0x74e6, 0x1530, 0x2011, 0x0020, 0x080c, 0x2a44, 0x6043,
+	0x0000, 0x080c, 0xcf2e, 0x0168, 0x080c, 0x74f8, 0x1150, 0x2001,
+	0x19a7, 0x2003, 0x0001, 0x6027, 0x1800, 0x080c, 0x734b, 0x0804,
+	0x2503, 0x70a4, 0x9005, 0x1150, 0x70a7, 0x0001, 0x00d6, 0x2069,
+	0x0140, 0x080c, 0x752c, 0x00de, 0x1904, 0x2503, 0x080c, 0x77e3,
+	0x0428, 0x080c, 0x74f8, 0x1590, 0x6024, 0x9084, 0x1800, 0x1108,
+	0x0468, 0x080c, 0x77e3, 0x080c, 0x77d9, 0x080c, 0x6022, 0x080c,
+	0x7406, 0x0804, 0x2500, 0xd1ac, 0x1508, 0x6024, 0xd0dc, 0x1170,
+	0xd0e4, 0x1178, 0xd0d4, 0x1190, 0xd0cc, 0x0130, 0x7098, 0x9086,
+	0x0028, 0x1110, 0x080c, 0x76ba, 0x0804, 0x2500, 0x080c, 0x77de,
+	0x0048, 0x2001, 0x197d, 0x2003, 0x0002, 0x0020, 0x080c, 0x7617,
+	0x0804, 0x2500, 0x080c, 0x775d, 0x0804, 0x2500, 0x6220, 0xd1bc,
+	0x0138, 0xd2bc, 0x1904, 0x2565, 0xd2b4, 0x1904, 0x2577, 0x0000,
+	0xd1ac, 0x0904, 0x240d, 0x0036, 0x6328, 0xc3bc, 0x632a, 0x003e,
+	0x080c, 0x74d5, 0x11d0, 0x2011, 0x0020, 0x080c, 0x2a44, 0x0006,
+	0x0026, 0x0036, 0x080c, 0x74ef, 0x1158, 0x080c, 0x77d9, 0x080c,
+	0x6022, 0x080c, 0x7406, 0x003e, 0x002e, 0x000e, 0x00ae, 0x0005,
+	0x003e, 0x002e, 0x000e, 0x080c, 0x74a9, 0x0016, 0x0046, 0x00c6,
+	0x644c, 0x9486, 0xf0f0, 0x1138, 0x2061, 0x0100, 0x644a, 0x6043,
+	0x0090, 0x6043, 0x0010, 0x74da, 0x948c, 0xff00, 0x7038, 0xd084,
+	0x0178, 0x9186, 0xf800, 0x1160, 0x7048, 0xd084, 0x1148, 0xc085,
+	0x704a, 0x0036, 0x2418, 0x2011, 0x8016, 0x080c, 0x4b00, 0x003e,
+	0x080c, 0xcf27, 0x1904, 0x23e4, 0x9196, 0xff00, 0x05a8, 0x7060,
+	0x9084, 0x00ff, 0x810f, 0x81ff, 0x0110, 0x9116, 0x0568, 0x7130,
+	0xd184, 0x1550, 0x080c, 0x3361, 0x0128, 0xc18d, 0x7132, 0x080c,
+	0x6a53, 0x1510, 0x6240, 0x9294, 0x0010, 0x0130, 0x6248, 0x9294,
+	0xff00, 0x9296, 0xff00, 0x01c0, 0x7030, 0xd08c, 0x0904, 0x23e4,
 	0x7038, 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904,
-	0x23b8, 0xc1ad, 0x2102, 0x0036, 0x73d8, 0x2011, 0x8013, 0x080c,
-	0x4a38, 0x003e, 0x7130, 0xc185, 0x7132, 0x2011, 0x1848, 0x220c,
-	0xd1a4, 0x01f0, 0x0016, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c,
-	0x87b6, 0x2019, 0x000e, 0x00c6, 0x2061, 0x0000, 0x080c, 0xe101,
-	0x00ce, 0x9484, 0x00ff, 0x9080, 0x3334, 0x200d, 0x918c, 0xff00,
-	0x810f, 0x2120, 0x9006, 0x2009, 0x000e, 0x080c, 0xe191, 0x001e,
-	0x0016, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x316a, 0x001e,
-	0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x652d,
-	0x1110, 0x080c, 0x5f5b, 0x8108, 0x1f04, 0x23ae, 0x00be, 0x015e,
-	0x00ce, 0x004e, 0x080c, 0xa781, 0x080c, 0xaa49, 0x080c, 0xa79d,
-	0x60e3, 0x0000, 0x001e, 0x2001, 0x1800, 0x2014, 0x9296, 0x0004,
-	0x1170, 0xd19c, 0x11b0, 0x2011, 0x180c, 0x2214, 0xd29c, 0x1120,
-	0x6204, 0x9295, 0x0002, 0x6206, 0x6228, 0xc29d, 0x622a, 0x2003,
-	0x0001, 0x2001, 0x1826, 0x2003, 0x0000, 0x2011, 0x0020, 0x080c,
-	0x2a0b, 0xd194, 0x0904, 0x24d4, 0x0016, 0x080c, 0xa781, 0x6220,
-	0xd2b4, 0x0904, 0x246f, 0x080c, 0x85c0, 0x080c, 0x9d09, 0x2011,
-	0x0004, 0x080c, 0x2a0b, 0x00f6, 0x2019, 0x19f1, 0x2304, 0x907d,
-	0x0904, 0x243c, 0x7804, 0x9086, 0x0032, 0x15f0, 0x00d6, 0x00c6,
-	0x00e6, 0x0096, 0x2069, 0x0140, 0x782c, 0x685e, 0x7808, 0x685a,
-	0x6043, 0x0002, 0x2001, 0x0003, 0x8001, 0x1df0, 0x6043, 0x0000,
-	0x2001, 0x003c, 0x8001, 0x1df0, 0x080c, 0x29e1, 0x2001, 0x001e,
-	0x8001, 0x0240, 0x20a9, 0x0009, 0x080c, 0x2998, 0x6904, 0xd1dc,
-	0x1140, 0x0cb0, 0x2001, 0x0100, 0x080c, 0x29d1, 0x9006, 0x080c,
-	0x29d1, 0x080c, 0x94a8, 0x080c, 0xa79d, 0x7814, 0x2048, 0xa867,
-	0x0103, 0x2f60, 0x080c, 0xaad8, 0x009e, 0x00ee, 0x00ce, 0x00de,
-	0x00fe, 0x001e, 0x00ae, 0x0005, 0x00fe, 0x00d6, 0x2069, 0x0140,
-	0x6804, 0x9084, 0x4000, 0x0110, 0x080c, 0x29e1, 0x00de, 0x00c6,
-	0x2061, 0x19e5, 0x6034, 0x080c, 0xce35, 0x0120, 0x909a, 0x0003,
-	0x1258, 0x0018, 0x909a, 0x00c8, 0x1238, 0x8000, 0x6036, 0x00ce,
-	0x080c, 0x9ce1, 0x0804, 0x24d1, 0x2061, 0x0100, 0x62c0, 0x080c,
-	0xa6b7, 0x2019, 0x19f1, 0x2304, 0x9065, 0x0130, 0x6003, 0x0001,
-	0x2009, 0x0027, 0x080c, 0xab77, 0x00ce, 0x0804, 0x24d1, 0xd2bc,
-	0x0904, 0x24b4, 0x080c, 0x85cd, 0x2011, 0x0004, 0x080c, 0x2a0b,
-	0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0110, 0x080c,
-	0x29e1, 0x00de, 0x00c6, 0x2061, 0x19e5, 0x6050, 0x080c, 0xce35,
-	0x0120, 0x909a, 0x0003, 0x1668, 0x0018, 0x909a, 0x00c8, 0x1648,
-	0x8000, 0x6052, 0x604c, 0x00ce, 0x9005, 0x05d8, 0x2009, 0x07d0,
-	0x080c, 0x85c5, 0x9080, 0x0008, 0x2004, 0x9086, 0x0006, 0x1138,
-	0x2009, 0x1984, 0x2011, 0x0012, 0x080c, 0x2a1a, 0x0450, 0x9080,
-	0x0008, 0x2004, 0x9086, 0x0009, 0x0d98, 0x2009, 0x1984, 0x2011,
-	0x0016, 0x080c, 0x2a1a, 0x00e8, 0x2011, 0x0004, 0x080c, 0x2a0b,
-	0x00c0, 0x0036, 0x2019, 0x0001, 0x080c, 0x9fef, 0x003e, 0x2019,
-	0x19f8, 0x2304, 0x9065, 0x0160, 0x2009, 0x004f, 0x6020, 0x9086,
-	0x0009, 0x1110, 0x2009, 0x004f, 0x6003, 0x0003, 0x080c, 0xab77,
-	0x00ce, 0x080c, 0xa79d, 0x001e, 0xd19c, 0x0904, 0x2532, 0x7038,
-	0xd0ac, 0x1538, 0x0016, 0x0156, 0x2011, 0x0008, 0x080c, 0x2a0b,
-	0x6050, 0xc0e5, 0x6052, 0x20a9, 0x0367, 0x1f04, 0x24ff, 0x1d04,
-	0x24e7, 0x080c, 0x85f4, 0x6020, 0xd09c, 0x1db8, 0x00f6, 0x2079,
-	0x0100, 0x080c, 0x2948, 0x00fe, 0x1d80, 0x6050, 0xc0e4, 0x6052,
-	0x2011, 0x0008, 0x080c, 0x2a0b, 0x015e, 0x001e, 0x0498, 0x015e,
-	0x001e, 0x0016, 0x6028, 0xc09c, 0x602a, 0x080c, 0xa781, 0x080c,
-	0xaa49, 0x080c, 0xa79d, 0x60e3, 0x0000, 0x080c, 0xe59b, 0x080c,
-	0xe5b6, 0x080c, 0x5600, 0xd0fc, 0x1138, 0x080c, 0xce2e, 0x1120,
-	0x9085, 0x0001, 0x080c, 0x742b, 0x9006, 0x080c, 0x29d1, 0x2009,
-	0x0002, 0x080c, 0x29bd, 0x00e6, 0x2071, 0x1800, 0x7003, 0x0004,
-	0x080c, 0x0eb4, 0x00ee, 0x2011, 0x0008, 0x080c, 0x2a0b, 0x080c,
-	0x0bc3, 0x001e, 0x918c, 0xffd0, 0x2110, 0x080c, 0x2a0b, 0x00ae,
-	0x0005, 0x0016, 0x2001, 0x0387, 0x200c, 0xd1a4, 0x001e, 0x0904,
-	0x22e4, 0x0016, 0x2009, 0x2545, 0x00c0, 0x2001, 0x0387, 0x2003,
-	0x1000, 0x001e, 0x0c38, 0x0016, 0x2001, 0x0387, 0x200c, 0xd1b4,
-	0x001e, 0x0904, 0x22e4, 0x0016, 0x2009, 0x2557, 0x0030, 0x2001,
-	0x0387, 0x2003, 0x4000, 0x001e, 0x08a8, 0x6028, 0xc0bc, 0x602a,
-	0x2001, 0x0156, 0x2003, 0xbc91, 0x8000, 0x2003, 0xffff, 0x6043,
-	0x0001, 0x080c, 0x29b7, 0x2011, 0x0080, 0x080c, 0x2a0b, 0x6017,
-	0x0000, 0x6043, 0x0000, 0x0817, 0x0006, 0x0016, 0x0026, 0x0036,
-	0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x71d0,
-	0x70d2, 0x9116, 0x0904, 0x25c7, 0x81ff, 0x01a0, 0x2009, 0x0000,
-	0x080c, 0x29bd, 0x2011, 0x8011, 0x2019, 0x010e, 0x231c, 0x939e,
-	0x0007, 0x1118, 0x2019, 0x0001, 0x0010, 0x2019, 0x0000, 0x080c,
-	0x4a38, 0x0468, 0x2001, 0x19a6, 0x200c, 0x81ff, 0x1140, 0x2001,
-	0x0109, 0x2004, 0xd0b4, 0x0118, 0x2019, 0x0003, 0x0008, 0x2118,
-	0x2011, 0x8012, 0x080c, 0x4a38, 0x080c, 0x0eb4, 0x080c, 0x5600,
-	0xd0fc, 0x11a8, 0x080c, 0xce2e, 0x1190, 0x00c6, 0x080c, 0x2663,
-	0x080c, 0xa781, 0x080c, 0x9f4a, 0x080c, 0xa79d, 0x2061, 0x0100,
-	0x2019, 0x0028, 0x2009, 0x0002, 0x080c, 0x316a, 0x00ce, 0x012e,
-	0x00fe, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x2028,
-	0x918c, 0x00ff, 0x2130, 0x9094, 0xff00, 0x11f0, 0x2011, 0x1837,
-	0x2214, 0xd2ac, 0x11c8, 0x81ff, 0x01e8, 0x2011, 0x181f, 0x2204,
-	0x9106, 0x1190, 0x2011, 0x1820, 0x2214, 0x9294, 0xff00, 0x9584,
-	0xff00, 0x9206, 0x1148, 0x2011, 0x1820, 0x2214, 0x9294, 0x00ff,
-	0x9584, 0x00ff, 0x9206, 0x1120, 0x2500, 0x080c, 0x80cc, 0x0048,
-	0x9584, 0x00ff, 0x9080, 0x3334, 0x200d, 0x918c, 0xff00, 0x810f,
-	0x9006, 0x0005, 0x9080, 0x3334, 0x200d, 0x918c, 0x00ff, 0x0005,
-	0x00d6, 0x2069, 0x0140, 0x2001, 0x1818, 0x2003, 0x00ef, 0x20a9,
-	0x0010, 0x9006, 0x6852, 0x6856, 0x1f04, 0x2613, 0x00de, 0x0005,
-	0x0006, 0x00d6, 0x0026, 0x2069, 0x0140, 0x2001, 0x1818, 0x2102,
-	0x8114, 0x8214, 0x8214, 0x8214, 0x20a9, 0x0010, 0x6853, 0x0000,
-	0x9006, 0x82ff, 0x1128, 0x9184, 0x000f, 0x9080, 0xe5ca, 0x2005,
-	0x6856, 0x8211, 0x1f04, 0x2628, 0x002e, 0x00de, 0x000e, 0x0005,
-	0x00c6, 0x2061, 0x1800, 0x6030, 0x0110, 0xc09d, 0x0008, 0xc09c,
-	0x6032, 0x00ce, 0x0005, 0x0156, 0x00d6, 0x0026, 0x0016, 0x0006,
-	0x2069, 0x0140, 0x6980, 0x9116, 0x0180, 0x9112, 0x1230, 0x8212,
-	0x8210, 0x22a8, 0x2001, 0x0402, 0x0018, 0x22a8, 0x2001, 0x0404,
-	0x680e, 0x1f04, 0x2658, 0x680f, 0x0000, 0x000e, 0x001e, 0x002e,
-	0x00de, 0x015e, 0x0005, 0x080c, 0x55fc, 0xd0c4, 0x0150, 0xd0a4,
-	0x0140, 0x9006, 0x0046, 0x2020, 0x2009, 0x002e, 0x080c, 0xe191,
-	0x004e, 0x0005, 0x00f6, 0x0016, 0x0026, 0x2079, 0x0140, 0x78c4,
-	0xd0dc, 0x0904, 0x26cf, 0x080c, 0x2938, 0x0660, 0x9084, 0x0700,
-	0x908e, 0x0600, 0x1120, 0x2011, 0x4000, 0x900e, 0x0458, 0x908e,
-	0x0500, 0x1120, 0x2011, 0x8000, 0x900e, 0x0420, 0x908e, 0x0400,
-	0x1120, 0x9016, 0x2009, 0x0001, 0x00e8, 0x908e, 0x0300, 0x1120,
-	0x9016, 0x2009, 0x0002, 0x00b0, 0x908e, 0x0200, 0x1120, 0x9016,
-	0x2009, 0x0004, 0x0078, 0x908e, 0x0100, 0x1548, 0x9016, 0x2009,
-	0x0008, 0x0040, 0x9084, 0x0700, 0x908e, 0x0300, 0x1500, 0x2011,
-	0x0030, 0x0058, 0x2300, 0x9080, 0x0020, 0x2018, 0x080c, 0x9030,
-	0x928c, 0xff00, 0x0110, 0x2011, 0x00ff, 0x2200, 0x8007, 0x9085,
-	0x004c, 0x78c2, 0x2009, 0x0138, 0x220a, 0x080c, 0x73e4, 0x1118,
-	0x2009, 0x196d, 0x220a, 0x002e, 0x001e, 0x00fe, 0x0005, 0x78c3,
-	0x0000, 0x0cc8, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026,
-	0x2001, 0x0170, 0x200c, 0x8000, 0x2014, 0x9184, 0x0003, 0x0110,
-	0x080c, 0x0d76, 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x2001,
-	0x0171, 0x2004, 0xd0dc, 0x0168, 0x2001, 0x0170, 0x200c, 0x918c,
-	0x00ff, 0x918e, 0x004c, 0x1128, 0x200c, 0x918c, 0xff00, 0x810f,
-	0x0005, 0x900e, 0x2001, 0x0227, 0x2004, 0x8007, 0x9084, 0x00ff,
-	0x8004, 0x9108, 0x2001, 0x0226, 0x2004, 0x8007, 0x9084, 0x00ff,
-	0x8004, 0x9108, 0x0005, 0x0018, 0x000c, 0x0018, 0x0020, 0x1000,
-	0x0800, 0x1000, 0x1800, 0x0156, 0x0006, 0x0016, 0x0026, 0x00e6,
-	0x2001, 0x198e, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0d7d, 0x0033,
-	0x00ee, 0x002e, 0x001e, 0x000e, 0x015e, 0x0005, 0x272d, 0x274b,
-	0x276f, 0x2771, 0x279a, 0x279c, 0x279e, 0x2001, 0x0001, 0x080c,
-	0x2574, 0x080c, 0x2982, 0x2001, 0x1990, 0x2003, 0x0000, 0x7828,
-	0x9084, 0xe1d7, 0x782a, 0x9006, 0x20a9, 0x0009, 0x080c, 0x2954,
-	0x2001, 0x198e, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x279f,
-	0x080c, 0x85d2, 0x0005, 0x2009, 0x1993, 0x200b, 0x0000, 0x2001,
-	0x1998, 0x2003, 0x0036, 0x2001, 0x1997, 0x2003, 0x002a, 0x2001,
-	0x1990, 0x2003, 0x0001, 0x9006, 0x080c, 0x28fc, 0x2001, 0xffff,
-	0x20a9, 0x0009, 0x080c, 0x2954, 0x2001, 0x198e, 0x2003, 0x0006,
-	0x2009, 0x001e, 0x2011, 0x279f, 0x080c, 0x85d2, 0x0005, 0x080c,
-	0x0d7d, 0x2001, 0x1998, 0x2003, 0x0036, 0x2001, 0x1990, 0x2003,
-	0x0003, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0x9006,
-	0x0010, 0x2001, 0x0001, 0x080c, 0x28fc, 0x2001, 0x1994, 0x2003,
-	0x0000, 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, 0x2954, 0x2001,
-	0x198e, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x279f, 0x080c,
-	0x85d2, 0x0005, 0x080c, 0x0d7d, 0x080c, 0x0d7d, 0x0005, 0x0006,
-	0x0016, 0x0026, 0x00e6, 0x00f6, 0x0156, 0x0126, 0x2091, 0x8000,
-	0x2079, 0x0100, 0x2001, 0x1990, 0x2004, 0x908a, 0x0007, 0x1a0c,
-	0x0d7d, 0x0043, 0x012e, 0x015e, 0x00fe, 0x00ee, 0x002e, 0x001e,
-	0x000e, 0x0005, 0x27c1, 0x27e1, 0x2821, 0x2851, 0x2875, 0x2885,
-	0x2887, 0x080c, 0x2948, 0x11b0, 0x7850, 0x9084, 0xefff, 0x7852,
-	0x2009, 0x1996, 0x2104, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004,
-	0x0110, 0xc08d, 0x0008, 0xc085, 0x200a, 0x2001, 0x198e, 0x2003,
-	0x0001, 0x0030, 0x080c, 0x28ab, 0x2001, 0xffff, 0x080c, 0x273c,
-	0x0005, 0x080c, 0x2889, 0x05e0, 0x2009, 0x1997, 0x2104, 0x8001,
-	0x200a, 0x080c, 0x2948, 0x1178, 0x7850, 0x9084, 0xefff, 0x7852,
-	0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0518, 0x2009, 0x1996,
-	0x2104, 0xc085, 0x200a, 0x2009, 0x1993, 0x2104, 0x8000, 0x200a,
-	0x9086, 0x0005, 0x0118, 0x080c, 0x2891, 0x00c0, 0x200b, 0x0000,
-	0x7a38, 0x9294, 0x0006, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010,
-	0x2001, 0x0001, 0x080c, 0x2919, 0x2001, 0x1990, 0x2003, 0x0002,
-	0x0028, 0x2001, 0x198e, 0x2003, 0x0003, 0x0010, 0x080c, 0x275e,
-	0x0005, 0x080c, 0x2889, 0x0560, 0x2009, 0x1997, 0x2104, 0x8001,
-	0x200a, 0x080c, 0x2948, 0x1168, 0x7850, 0x9084, 0xefff, 0x7852,
-	0x2001, 0x198e, 0x2003, 0x0003, 0x2001, 0x198f, 0x2003, 0x0000,
-	0x00b8, 0x2009, 0x1997, 0x2104, 0x9005, 0x1118, 0x080c, 0x28ce,
-	0x0010, 0x080c, 0x289e, 0x080c, 0x2891, 0x2009, 0x1993, 0x200b,
-	0x0000, 0x2001, 0x1990, 0x2003, 0x0001, 0x080c, 0x275e, 0x0000,
-	0x0005, 0x04b9, 0x0508, 0x080c, 0x2948, 0x11b8, 0x7850, 0x9084,
-	0xefff, 0x7852, 0x2009, 0x1994, 0x2104, 0x8000, 0x200a, 0x9086,
-	0x0007, 0x0108, 0x0078, 0x2001, 0x1999, 0x2003, 0x000a, 0x2009,
-	0x1996, 0x2104, 0xc0fd, 0x200a, 0x0038, 0x0419, 0x2001, 0x1990,
-	0x2003, 0x0004, 0x080c, 0x2789, 0x0005, 0x0099, 0x0168, 0x080c,
-	0x2948, 0x1138, 0x7850, 0x9084, 0xefff, 0x7852, 0x080c, 0x2775,
-	0x0018, 0x0079, 0x080c, 0x2789, 0x0005, 0x080c, 0x0d7d, 0x080c,
-	0x0d7d, 0x2009, 0x1998, 0x2104, 0x8001, 0x200a, 0x090c, 0x28ea,
-	0x0005, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006,
-	0x0010, 0x2001, 0x0001, 0x080c, 0x2919, 0x0005, 0x7a38, 0x9294,
-	0x0006, 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001,
-	0x080c, 0x28fc, 0x0005, 0x2009, 0x1993, 0x2104, 0x8000, 0x200a,
-	0x9086, 0x0005, 0x0108, 0x0068, 0x200b, 0x0000, 0x7a38, 0x9294,
-	0x0006, 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001,
-	0x04d9, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006,
-	0x0010, 0x2001, 0x0001, 0x080c, 0x2919, 0x0005, 0x0086, 0x2001,
-	0x1996, 0x2004, 0x9084, 0x7fff, 0x090c, 0x0d7d, 0x2009, 0x1995,
-	0x2144, 0x8846, 0x280a, 0x9844, 0x0dd8, 0xd08c, 0x1120, 0xd084,
-	0x1120, 0x080c, 0x0d7d, 0x9006, 0x0010, 0x2001, 0x0001, 0x00a1,
-	0x008e, 0x0005, 0x0006, 0x0156, 0x2001, 0x198e, 0x20a9, 0x0009,
-	0x2003, 0x0000, 0x8000, 0x1f04, 0x28f0, 0x2001, 0x1995, 0x2003,
-	0x8000, 0x015e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085,
-	0x0000, 0x0158, 0x7838, 0x9084, 0xfff9, 0x9085, 0x0004, 0x783a,
-	0x2009, 0x199b, 0x210c, 0x795a, 0x0050, 0x7838, 0x9084, 0xfffb,
-	0x9085, 0x0006, 0x783a, 0x2009, 0x199c, 0x210c, 0x795a, 0x00fe,
-	0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0158, 0x7838,
-	0x9084, 0xfffa, 0x9085, 0x0004, 0x783a, 0x7850, 0x9084, 0xfff0,
-	0x7852, 0x0060, 0x7838, 0x9084, 0xfffb, 0x9085, 0x0005, 0x783a,
-	0x7850, 0x9084, 0xfff0, 0x9085, 0x0000, 0x7852, 0x00fe, 0x0005,
-	0x0006, 0x2001, 0x0100, 0x2004, 0x9082, 0x0007, 0x000e, 0x0005,
-	0x0006, 0x2001, 0x0100, 0x2004, 0x9082, 0x0009, 0x000e, 0x0005,
-	0x0156, 0x20a9, 0x0064, 0x7820, 0x080c, 0x29b7, 0xd09c, 0x1110,
-	0x1f04, 0x294b, 0x015e, 0x0005, 0x0126, 0x0016, 0x0006, 0x2091,
-	0x8000, 0x000e, 0x2008, 0x9186, 0x0000, 0x1118, 0x783b, 0x0007,
-	0x0090, 0x9186, 0x0001, 0x1118, 0x783b, 0x0006, 0x0060, 0x9186,
-	0x0002, 0x1118, 0x783b, 0x0005, 0x0030, 0x9186, 0x0003, 0x1118,
-	0x783b, 0x0004, 0x0000, 0x0006, 0x1d04, 0x2974, 0x080c, 0x85f4,
-	0x1f04, 0x2974, 0x7850, 0x9085, 0x1000, 0x7852, 0x000e, 0x001e,
-	0x012e, 0x0005, 0x080c, 0x2a72, 0x0005, 0x0006, 0x0156, 0x00f6,
-	0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd0ac, 0x1100, 0x7854,
-	0xd08c, 0x1110, 0x1f04, 0x298f, 0x00fe, 0x015e, 0x000e, 0x0005,
-	0x1d04, 0x2998, 0x080c, 0x85f4, 0x1f04, 0x2998, 0x0005, 0x0006,
-	0x2001, 0x199a, 0x2004, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006,
-	0x2001, 0x199a, 0x2004, 0x9086, 0x0001, 0x000e, 0x0005, 0x0006,
-	0x2001, 0x199a, 0x2004, 0x9086, 0x0002, 0x000e, 0x0005, 0xa001,
-	0xa001, 0xa001, 0xa001, 0xa001, 0x0005, 0x0006, 0x2001, 0x19a6,
-	0x2102, 0x000e, 0x0005, 0x2009, 0x0171, 0x2104, 0xd0dc, 0x0140,
-	0x2009, 0x0170, 0x2104, 0x200b, 0x0080, 0xa001, 0xa001, 0x200a,
-	0x0005, 0x0016, 0x0026, 0x080c, 0x73fe, 0x0108, 0xc0bc, 0x2009,
-	0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a, 0x002e, 0x001e,
-	0x0005, 0x0016, 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001,
-	0x9285, 0x1000, 0x200a, 0x220a, 0x002e, 0x001e, 0x0005, 0x0016,
-	0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a,
-	0x002e, 0x001e, 0x0005, 0x0006, 0x0016, 0x2009, 0x0140, 0x2104,
-	0x1128, 0x080c, 0x73fe, 0x0110, 0xc0bc, 0x0008, 0xc0bd, 0x200a,
-	0x001e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0380, 0x7843, 0x0101,
-	0x7844, 0xd084, 0x1de8, 0x2001, 0x0109, 0x2202, 0x7843, 0x0100,
-	0x00fe, 0x0005, 0x00f6, 0x2079, 0x0380, 0x7843, 0x0202, 0x7844,
-	0xd08c, 0x1de8, 0x2079, 0x0100, 0x7814, 0x9104, 0x9205, 0x7a16,
-	0x2079, 0x0380, 0x7843, 0x0200, 0x00fe, 0x0005, 0x0016, 0x0026,
-	0x0036, 0x00c6, 0x2061, 0x0100, 0x6050, 0x9084, 0xfbff, 0x9085,
-	0x0040, 0x6052, 0x20a9, 0x0002, 0x080c, 0x2998, 0x6050, 0x9085,
-	0x0400, 0x9084, 0xff9f, 0x6052, 0x20a9, 0x0005, 0x080c, 0x2998,
-	0x6054, 0xd0bc, 0x090c, 0x0d7d, 0x20a9, 0x0005, 0x080c, 0x2998,
-	0x6054, 0xd0ac, 0x090c, 0x0d7d, 0x2009, 0x19ad, 0x9084, 0x7e00,
-	0x8007, 0x8004, 0x8004, 0x200a, 0x9085, 0x0000, 0x605a, 0x2009,
-	0x199b, 0x2011, 0x199c, 0x6358, 0x939c, 0x38df, 0x2320, 0x939d,
-	0x0000, 0x94a5, 0x0000, 0x230a, 0x2412, 0x00ce, 0x003e, 0x002e,
-	0x001e, 0x0005, 0x0006, 0x00c6, 0x2061, 0x0100, 0x6050, 0xc0cd,
-	0x6052, 0x00ce, 0x000e, 0x0005, 0x2f78, 0x2f78, 0x2b7c, 0x2b7c,
-	0x2b88, 0x2b88, 0x2b94, 0x2b94, 0x2ba2, 0x2ba2, 0x2bae, 0x2bae,
-	0x2bbc, 0x2bbc, 0x2bca, 0x2bca, 0x2bdc, 0x2bdc, 0x2be8, 0x2be8,
-	0x2bf6, 0x2bf6, 0x2c14, 0x2c14, 0x2c34, 0x2c34, 0x2c04, 0x2c04,
-	0x2c24, 0x2c24, 0x2c42, 0x2c42, 0x2bda, 0x2bda, 0x2bda, 0x2bda,
-	0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda,
-	0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda,
-	0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda,
-	0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2c54, 0x2c54, 0x2c60, 0x2c60,
-	0x2c6e, 0x2c6e, 0x2c7c, 0x2c7c, 0x2c8c, 0x2c8c, 0x2c9a, 0x2c9a,
-	0x2caa, 0x2caa, 0x2cba, 0x2cba, 0x2ccc, 0x2ccc, 0x2cda, 0x2cda,
-	0x2cea, 0x2cea, 0x2d0c, 0x2d0c, 0x2d30, 0x2d30, 0x2cfa, 0x2cfa,
-	0x2d1e, 0x2d1e, 0x2d40, 0x2d40, 0x2bda, 0x2bda, 0x2bda, 0x2bda,
-	0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda,
-	0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda,
-	0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda,
-	0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2d54, 0x2d54, 0x2d60, 0x2d60,
-	0x2d6e, 0x2d6e, 0x2d7c, 0x2d7c, 0x2d8c, 0x2d8c, 0x2d9a, 0x2d9a,
-	0x2daa, 0x2daa, 0x2dba, 0x2dba, 0x2dcc, 0x2dcc, 0x2dda, 0x2dda,
-	0x2dea, 0x2dea, 0x2dfa, 0x2dfa, 0x2e0c, 0x2e0c, 0x2e1c, 0x2e1c,
-	0x2e2e, 0x2e2e, 0x2e40, 0x2e40, 0x2bda, 0x2bda, 0x2bda, 0x2bda,
-	0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda,
-	0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda,
-	0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda,
-	0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2e54, 0x2e54, 0x2e62, 0x2e62,
-	0x2e72, 0x2e72, 0x2e82, 0x2e82, 0x2e94, 0x2e94, 0x2ea4, 0x2ea4,
-	0x2eb6, 0x2eb6, 0x2ec8, 0x2ec8, 0x2edc, 0x2edc, 0x2eec, 0x2eec,
-	0x2efe, 0x2efe, 0x2f10, 0x2f10, 0x2f24, 0x2f24, 0x2f35, 0x2f35,
-	0x2f48, 0x2f48, 0x2f5b, 0x2f5b, 0x2bda, 0x2bda, 0x2bda, 0x2bda,
-	0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda,
-	0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda,
-	0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x2bda,
-	0x2bda, 0x2bda, 0x2bda, 0x2bda, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x221c, 0x0804, 0x2f70,
-	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x2052, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0x221c,
-	0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x221c,
-	0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0x207c,
-	0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0x221c, 0x080c, 0x207c,
-	0x0804, 0x2f70, 0xa001, 0x0cf0, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x139a, 0x0804, 0x2f70,
-	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x221c, 0x080c, 0x139a, 0x0804, 0x2f70, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2052,
-	0x080c, 0x139a, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x221c, 0x080c, 0x139a,
-	0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0x221c,
-	0x080c, 0x139a, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0x139a,
-	0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x139a, 0x080c, 0x207c,
-	0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0x221c, 0x080c, 0x139a,
-	0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x0804, 0x2f70,
-	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x26d2, 0x080c, 0x221c, 0x0804, 0x2f70, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2,
-	0x080c, 0x2052, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x2052,
-	0x080c, 0x221c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x207c,
-	0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x221c, 0x080c, 0x207c,
-	0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x2052, 0x080c, 0x207c,
-	0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x2052, 0x080c, 0x221c,
-	0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x139a,
-	0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x221c, 0x080c, 0x139a,
-	0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x2052, 0x080c, 0x139a,
-	0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x221c, 0x080c, 0x139a,
-	0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x2052,
-	0x080c, 0x221c, 0x080c, 0x139a, 0x0804, 0x2f70, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2,
-	0x080c, 0x2052, 0x080c, 0x139a, 0x080c, 0x207c, 0x0804, 0x2f70,
-	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x26d2, 0x080c, 0x139a, 0x080c, 0x207c, 0x0804, 0x2f70,
-	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x26d2, 0x080c, 0x2052, 0x080c, 0x221c, 0x080c, 0x139a,
-	0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0xa7e7, 0x0804, 0x2f70,
-	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0xa7e7, 0x080c, 0x221c, 0x0804, 0x2f70, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2052,
-	0x080c, 0xa7e7, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0xa7e7,
-	0x080c, 0x221c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0xa7e7, 0x080c, 0x207c,
-	0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0xa7e7, 0x080c, 0x221c, 0x080c, 0x207c,
-	0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0xa7e7, 0x080c, 0x207c,
-	0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0xa7e7, 0x080c, 0x221c,
-	0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0xa7e7, 0x080c, 0x139a,
-	0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0xa7e7, 0x080c, 0x221c, 0x080c, 0x139a,
-	0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0xa7e7, 0x080c, 0x139a,
-	0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x2052, 0x080c, 0xa7e7, 0x080c, 0x221c,
-	0x080c, 0x139a, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0xa7e7, 0x080c, 0x139a,
-	0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0xa7e7, 0x080c, 0x221c,
-	0x080c, 0x139a, 0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2052,
-	0x080c, 0xa7e7, 0x080c, 0x139a, 0x080c, 0x207c, 0x0804, 0x2f70,
-	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x2052, 0x080c, 0xa7e7, 0x080c, 0x221c, 0x080c, 0x139a,
-	0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0xa7e7,
-	0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0xa7e7, 0x080c, 0x221c,
-	0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x2052, 0x080c, 0xa7e7,
-	0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x2052, 0x080c, 0xa7e7,
-	0x080c, 0x221c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0xa7e7,
-	0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0xa7e7,
-	0x080c, 0x221c, 0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2,
-	0x080c, 0x2052, 0x080c, 0xa7e7, 0x080c, 0x207c, 0x0804, 0x2f70,
-	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x26d2, 0x080c, 0x2052, 0x080c, 0xa7e7, 0x080c, 0x221c,
-	0x080c, 0x207c, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0xa7e7,
-	0x080c, 0x139a, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0xa7e7,
-	0x080c, 0x221c, 0x080c, 0x139a, 0x0804, 0x2f70, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2,
-	0x080c, 0x2052, 0x080c, 0xa7e7, 0x080c, 0x139a, 0x0804, 0x2f70,
-	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x26d2, 0x080c, 0x2052, 0x080c, 0xa7e7, 0x080c, 0x221c,
-	0x080c, 0x139a, 0x0804, 0x2f70, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0xa7e7,
-	0x080c, 0x139a, 0x080c, 0x207c, 0x04d8, 0x0106, 0x0006, 0x0126,
-	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c,
-	0xa7e7, 0x080c, 0x221c, 0x080c, 0x139a, 0x080c, 0x207c, 0x0440,
-	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x26d2, 0x080c, 0x2052, 0x080c, 0x139a, 0x080c, 0xa7e7,
-	0x080c, 0x207c, 0x00a8, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
-	0x0136, 0x0146, 0x0156, 0x080c, 0x26d2, 0x080c, 0x2052, 0x080c,
-	0xa7e7, 0x080c, 0x221c, 0x080c, 0x139a, 0x080c, 0x207c, 0x0000,
-	0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e, 0x000e, 0x010e,
-	0x000d, 0x00b6, 0x00c6, 0x0026, 0x0046, 0x9026, 0x080c, 0x6928,
-	0x1904, 0x3086, 0x72dc, 0x2001, 0x197c, 0x2004, 0x9005, 0x1110,
-	0xd29c, 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, 0x3086, 0x080c,
-	0x308b, 0x0804, 0x3086, 0xd2cc, 0x1904, 0x3086, 0x080c, 0x73e4,
-	0x1120, 0x70af, 0xffff, 0x0804, 0x3086, 0xd294, 0x0120, 0x70af,
-	0xffff, 0x0804, 0x3086, 0x080c, 0x3323, 0x0160, 0x080c, 0xce35,
-	0x0128, 0x2001, 0x1818, 0x203c, 0x0804, 0x3013, 0x70af, 0xffff,
-	0x0804, 0x3086, 0x2001, 0x1818, 0x203c, 0x7294, 0xd284, 0x0904,
-	0x3013, 0xd28c, 0x1904, 0x3013, 0x0036, 0x73ac, 0x938e, 0xffff,
-	0x1110, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1d80, 0x2c04, 0x938c,
-	0x0001, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff,
-	0x970e, 0x05b8, 0x908e, 0x0000, 0x05a0, 0x908e, 0x00ff, 0x1150,
-	0x7230, 0xd284, 0x1598, 0x7294, 0xc28d, 0x7296, 0x70af, 0xffff,
-	0x003e, 0x0488, 0x900e, 0x080c, 0x25cf, 0x080c, 0x64cc, 0x1520,
-	0x9006, 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0148, 0x00c6, 0x2060,
-	0x080c, 0x8a5a, 0x00ce, 0x090c, 0x8dfe, 0xb8af, 0x0000, 0x080c,
-	0x696a, 0x1150, 0x7030, 0xd08c, 0x0118, 0xb800, 0xd0bc, 0x0120,
-	0x080c, 0x30a4, 0x0148, 0x0028, 0x080c, 0x31f8, 0x080c, 0x30d0,
-	0x0118, 0x8318, 0x0804, 0x2fc3, 0x73ae, 0x0010, 0x70af, 0xffff,
-	0x003e, 0x0804, 0x3086, 0x9780, 0x3334, 0x203d, 0x97bc, 0xff00,
-	0x873f, 0x2041, 0x007e, 0x70ac, 0x9096, 0xffff, 0x1118, 0x900e,
-	0x28a8, 0x0050, 0x9812, 0x0220, 0x2008, 0x9802, 0x20a8, 0x0020,
-	0x70af, 0xffff, 0x0804, 0x3086, 0x2700, 0x0156, 0x0016, 0x9106,
-	0x0904, 0x307b, 0xc484, 0x080c, 0x652d, 0x0148, 0x080c, 0xce35,
-	0x1904, 0x307b, 0x080c, 0x64cc, 0x1904, 0x3083, 0x0008, 0xc485,
-	0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0148, 0x00c6, 0x2060, 0x080c,
-	0x8a5a, 0x00ce, 0x090c, 0x8dfe, 0xb8af, 0x0000, 0x080c, 0x696a,
-	0x1130, 0x7030, 0xd08c, 0x01f8, 0xb800, 0xd0bc, 0x11e0, 0x7294,
-	0xd28c, 0x0180, 0x080c, 0x696a, 0x9082, 0x0006, 0x02e0, 0xd484,
-	0x1118, 0x080c, 0x64f1, 0x0028, 0x080c, 0x3291, 0x01a0, 0x080c,
-	0x32bc, 0x0088, 0x080c, 0x31f8, 0x080c, 0xce35, 0x1160, 0x080c,
-	0x30d0, 0x0188, 0x0040, 0x080c, 0xce35, 0x1118, 0x080c, 0x3291,
-	0x0110, 0x0451, 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, 0x302c,
-	0x70af, 0xffff, 0x0018, 0x001e, 0x015e, 0x71ae, 0x004e, 0x002e,
-	0x00ce, 0x00be, 0x0005, 0x00c6, 0x0016, 0x70af, 0x0001, 0x2009,
-	0x007e, 0x080c, 0x64cc, 0x1168, 0xb813, 0x00ff, 0xb817, 0xfffe,
-	0x080c, 0x31f8, 0x04a9, 0x0128, 0x70dc, 0xc0bd, 0x70de, 0x080c,
-	0xcb83, 0x001e, 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6,
-	0x2001, 0x184c, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0xab4a,
-	0x01d0, 0x2b00, 0x6012, 0x080c, 0xcbb0, 0x6023, 0x0001, 0x9006,
-	0x080c, 0x6469, 0x2001, 0x0000, 0x080c, 0x647d, 0x0126, 0x2091,
-	0x8000, 0x70a8, 0x8000, 0x70aa, 0x012e, 0x2009, 0x0004, 0x080c,
-	0xab77, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005,
-	0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, 0x184c, 0x2004, 0x9084,
-	0x00ff, 0xb842, 0x080c, 0xab4a, 0x0548, 0x2b00, 0x6012, 0xb800,
-	0xc0c4, 0xb802, 0xb8a0, 0x9086, 0x007e, 0x0140, 0xb804, 0x9084,
-	0x00ff, 0x9086, 0x0006, 0x1110, 0x080c, 0x31ab, 0x080c, 0xcbb0,
-	0x6023, 0x0001, 0x9006, 0x080c, 0x6469, 0x2001, 0x0002, 0x080c,
-	0x647d, 0x0126, 0x2091, 0x8000, 0x70a8, 0x8000, 0x70aa, 0x012e,
-	0x2009, 0x0002, 0x080c, 0xab77, 0x9085, 0x0001, 0x00ce, 0x00de,
-	0x007e, 0x001e, 0x0005, 0x00b6, 0x00c6, 0x0026, 0x2009, 0x0080,
-	0x080c, 0x64cc, 0x1140, 0xb813, 0x00ff, 0xb817, 0xfffc, 0x0039,
-	0x0110, 0x70e3, 0xffff, 0x002e, 0x00ce, 0x00be, 0x0005, 0x0016,
-	0x0076, 0x00d6, 0x00c6, 0x080c, 0xaa82, 0x01d0, 0x2b00, 0x6012,
-	0x080c, 0xcbb0, 0x6023, 0x0001, 0x9006, 0x080c, 0x6469, 0x2001,
-	0x0002, 0x080c, 0x647d, 0x0126, 0x2091, 0x8000, 0x70e4, 0x8000,
-	0x70e6, 0x012e, 0x2009, 0x0002, 0x080c, 0xab77, 0x9085, 0x0001,
-	0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0126,
-	0x2091, 0x8000, 0x2009, 0x007f, 0x080c, 0x64cc, 0x11b8, 0xb813,
-	0x00ff, 0xb817, 0xfffd, 0xb8d7, 0x0004, 0x080c, 0xaa82, 0x0170,
-	0x2b00, 0x6012, 0x6316, 0x6023, 0x0001, 0x620a, 0x080c, 0xcbb0,
-	0x2009, 0x0022, 0x080c, 0xab77, 0x9085, 0x0001, 0x012e, 0x00de,
-	0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x00b6,
-	0x21f0, 0x9036, 0x080c, 0xa781, 0x1110, 0x2031, 0x0001, 0x0066,
-	0x080c, 0x927a, 0x080c, 0x91f0, 0x080c, 0xa6d7, 0x080c, 0xba04,
-	0x006e, 0x86ff, 0x0110, 0x080c, 0xa79d, 0x3e08, 0x2130, 0x81ff,
-	0x0120, 0x20a9, 0x007e, 0x900e, 0x0018, 0x20a9, 0x007f, 0x900e,
-	0x0016, 0x080c, 0x652d, 0x1140, 0x9686, 0x0002, 0x1118, 0xb800,
-	0xd0bc, 0x1110, 0x080c, 0x5f5b, 0x001e, 0x8108, 0x1f04, 0x3190,
-	0x9686, 0x0001, 0x190c, 0x32f7, 0x00be, 0x002e, 0x003e, 0x006e,
-	0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016,
-	0x00b6, 0x9016, 0x080c, 0xa781, 0x1110, 0x2011, 0x0001, 0x0026,
-	0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0x926f,
-	0x0076, 0x2039, 0x0000, 0x080c, 0x9141, 0x2c08, 0x080c, 0xdeb3,
-	0x007e, 0x001e, 0x002e, 0x82ff, 0x0110, 0x080c, 0xa79d, 0xba10,
-	0xbb14, 0x080c, 0x5f5b, 0xba12, 0xbb16, 0x00be, 0x001e, 0x002e,
-	0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x00b6, 0x6010,
-	0x2058, 0xb8a0, 0x00be, 0x9086, 0x0080, 0x0150, 0x2071, 0x1800,
-	0x70a8, 0x9005, 0x0110, 0x8001, 0x70aa, 0x000e, 0x00ee, 0x0005,
-	0x2071, 0x1800, 0x70e4, 0x9005, 0x0dc0, 0x8001, 0x70e6, 0x0ca8,
-	0xb800, 0xc08c, 0xb802, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x00b6,
-	0x0036, 0x0026, 0x0016, 0x0156, 0x2178, 0x9016, 0x080c, 0xa781,
-	0x1110, 0x2011, 0x0001, 0x0026, 0x81ff, 0x1118, 0x20a9, 0x0001,
-	0x0088, 0x080c, 0x55fc, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006,
-	0x0046, 0x2020, 0x2009, 0x002d, 0x080c, 0xe191, 0x004e, 0x20a9,
-	0x0800, 0x9016, 0x0026, 0x928e, 0x007e, 0x0904, 0x326c, 0x928e,
-	0x007f, 0x0904, 0x326c, 0x928e, 0x0080, 0x05f0, 0x9288, 0x1000,
-	0x210c, 0x81ff, 0x05c8, 0x8fff, 0x1150, 0x2001, 0x198c, 0x0006,
-	0x2003, 0x0001, 0x080c, 0x327e, 0x000e, 0x2003, 0x0000, 0x00b6,
-	0x00c6, 0x2158, 0x2001, 0x0001, 0x080c, 0x6934, 0x00ce, 0x00be,
-	0x2019, 0x0029, 0x080c, 0x926f, 0x0076, 0x2039, 0x0000, 0x080c,
-	0x9141, 0x00b6, 0x00c6, 0x0026, 0x2158, 0xba04, 0x9294, 0x00ff,
-	0x9286, 0x0006, 0x1118, 0xb807, 0x0404, 0x0028, 0x2001, 0x0004,
-	0x8007, 0x9215, 0xba06, 0x002e, 0x00ce, 0x00be, 0x0016, 0x2c08,
-	0x080c, 0xdeb3, 0x001e, 0x007e, 0x002e, 0x8210, 0x1f04, 0x3222,
-	0x002e, 0x82ff, 0x0110, 0x080c, 0xa79d, 0x015e, 0x001e, 0x002e,
-	0x003e, 0x00be, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0046, 0x0026,
-	0x0016, 0x080c, 0x55fc, 0xd0c4, 0x0140, 0xd0a4, 0x0130, 0x9006,
-	0x2220, 0x2009, 0x0029, 0x080c, 0xe191, 0x001e, 0x002e, 0x004e,
-	0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x7294, 0x82ff, 0x01e8,
-	0x080c, 0x6962, 0x11d0, 0x2100, 0x080c, 0x2602, 0x81ff, 0x01b8,
-	0x2019, 0x0001, 0x8314, 0x92e0, 0x1d80, 0x2c04, 0xd384, 0x0120,
-	0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, 0x9116, 0x0138,
-	0x9096, 0x00ff, 0x0110, 0x8318, 0x0c68, 0x9085, 0x0001, 0x00ce,
-	0x003e, 0x002e, 0x001e, 0x0005, 0x0016, 0x00c6, 0x0126, 0x2091,
-	0x8000, 0x0066, 0x9036, 0x080c, 0xa781, 0x1110, 0x2031, 0x0001,
-	0x0066, 0x0036, 0x2019, 0x0029, 0x00d9, 0x003e, 0x006e, 0x86ff,
-	0x0110, 0x080c, 0xa79d, 0x006e, 0x9180, 0x1000, 0x2004, 0x9065,
-	0x0158, 0x0016, 0x00c6, 0x2061, 0x1b30, 0x001e, 0x6112, 0x080c,
-	0x31ab, 0x001e, 0x080c, 0x64f1, 0x012e, 0x00ce, 0x001e, 0x0005,
-	0x0016, 0x0026, 0x2110, 0x080c, 0xa275, 0x080c, 0xe4f3, 0x002e,
-	0x001e, 0x0005, 0x2001, 0x1837, 0x2004, 0xd0cc, 0x0005, 0x00c6,
-	0x00b6, 0x080c, 0x73e4, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9,
-	0x0782, 0x080c, 0x73e4, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e,
-	0x9180, 0x1000, 0x2004, 0x905d, 0x0130, 0x86ff, 0x0110, 0xb800,
-	0xd0bc, 0x090c, 0x64f1, 0x8108, 0x1f04, 0x3308, 0x2061, 0x1800,
-	0x607f, 0x0000, 0x6080, 0x9084, 0x00ff, 0x6082, 0x60b3, 0x0000,
-	0x00be, 0x00ce, 0x0005, 0x2001, 0x1869, 0x2004, 0xd0bc, 0x0005,
-	0x2011, 0x1848, 0x2214, 0xd2ec, 0x0005, 0x0026, 0x2011, 0x1867,
-	0x2214, 0xd2dc, 0x002e, 0x0005, 0x7eef, 0x7de8, 0x7ce4, 0x80e2,
-	0x7be1, 0x80e0, 0x80dc, 0x80da, 0x7ad9, 0x80d6, 0x80d5, 0x80d4,
-	0x80d3, 0x80d2, 0x80d1, 0x79ce, 0x78cd, 0x80cc, 0x80cb, 0x80ca,
-	0x80c9, 0x80c7, 0x80c6, 0x77c5, 0x76c3, 0x80bc, 0x80ba, 0x75b9,
-	0x80b6, 0x74b5, 0x73b4, 0x72b3, 0x80b2, 0x80b1, 0x80ae, 0x71ad,
-	0x80ac, 0x70ab, 0x6faa, 0x6ea9, 0x80a7, 0x6da6, 0x6ca5, 0x6ba3,
-	0x6a9f, 0x699e, 0x689d, 0x809b, 0x8098, 0x6797, 0x6690, 0x658f,
-	0x6488, 0x6384, 0x6282, 0x8081, 0x8080, 0x617c, 0x607a, 0x8079,
-	0x5f76, 0x8075, 0x8074, 0x8073, 0x8072, 0x8071, 0x806e, 0x5e6d,
-	0x806c, 0x5d6b, 0x5c6a, 0x5b69, 0x8067, 0x5a66, 0x5965, 0x5863,
-	0x575c, 0x565a, 0x5559, 0x8056, 0x8055, 0x5454, 0x5353, 0x5252,
-	0x5151, 0x504e, 0x4f4d, 0x804c, 0x804b, 0x4e4a, 0x4d49, 0x8047,
-	0x4c46, 0x8045, 0x8043, 0x803c, 0x803a, 0x8039, 0x8036, 0x4b35,
-	0x8034, 0x4a33, 0x4932, 0x4831, 0x802e, 0x472d, 0x462c, 0x452b,
-	0x442a, 0x4329, 0x4227, 0x8026, 0x8025, 0x4123, 0x401f, 0x3f1e,
-	0x3e1d, 0x3d1b, 0x3c18, 0x8017, 0x8010, 0x3b0f, 0x3a08, 0x8004,
-	0x3902, 0x8001, 0x8000, 0x8000, 0x3800, 0x3700, 0x3600, 0x8000,
-	0x3500, 0x8000, 0x8000, 0x8000, 0x3400, 0x8000, 0x8000, 0x8000,
-	0x8000, 0x8000, 0x8000, 0x3300, 0x3200, 0x8000, 0x8000, 0x8000,
-	0x8000, 0x8000, 0x8000, 0x3100, 0x3000, 0x8000, 0x8000, 0x2f00,
-	0x8000, 0x2e00, 0x2d00, 0x2c00, 0x8000, 0x8000, 0x8000, 0x2b00,
-	0x8000, 0x2a00, 0x2900, 0x2800, 0x8000, 0x2700, 0x2600, 0x2500,
-	0x2400, 0x2300, 0x2200, 0x8000, 0x8000, 0x2100, 0x2000, 0x1f00,
-	0x1e00, 0x1d00, 0x1c00, 0x8000, 0x8000, 0x1b00, 0x1a00, 0x8000,
-	0x1900, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x1800,
-	0x8000, 0x1700, 0x1600, 0x1500, 0x8000, 0x1400, 0x1300, 0x1200,
-	0x1100, 0x1000, 0x0f00, 0x8000, 0x8000, 0x0e00, 0x0d00, 0x0c00,
-	0x0b00, 0x0a00, 0x0900, 0x8000, 0x8000, 0x0800, 0x0700, 0x8000,
-	0x0600, 0x8000, 0x8000, 0x8000, 0x0500, 0x0400, 0x0300, 0x8000,
-	0x0200, 0x8000, 0x8000, 0x8000, 0x0100, 0x8000, 0x8000, 0x8000,
-	0x8000, 0x8000, 0x8000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000,
+	0x23e4, 0xc1ad, 0x2102, 0x0036, 0x73d8, 0x2011, 0x8013, 0x080c,
+	0x4b00, 0x003e, 0x0804, 0x23e4, 0x7038, 0xd08c, 0x1140, 0x2001,
+	0x180c, 0x200c, 0xd1ac, 0x1904, 0x23e4, 0xc1ad, 0x2102, 0x0036,
+	0x73d8, 0x2011, 0x8013, 0x080c, 0x4b00, 0x003e, 0x7130, 0xc185,
+	0x7132, 0x2011, 0x1848, 0x220c, 0xd1a4, 0x01f0, 0x0016, 0x2009,
+	0x0001, 0x2011, 0x0100, 0x080c, 0x88bb, 0x2019, 0x000e, 0x00c6,
+	0x2061, 0x0000, 0x080c, 0xe20e, 0x00ce, 0x9484, 0x00ff, 0x9080,
+	0x336d, 0x200d, 0x918c, 0xff00, 0x810f, 0x2120, 0x9006, 0x2009,
+	0x000e, 0x080c, 0xe29e, 0x001e, 0x0016, 0x2009, 0x0002, 0x2019,
+	0x0004, 0x080c, 0x31a3, 0x001e, 0x0078, 0x0156, 0x00b6, 0x20a9,
+	0x007f, 0x900e, 0x080c, 0x661e, 0x1110, 0x080c, 0x603c, 0x8108,
+	0x1f04, 0x23da, 0x00be, 0x015e, 0x00ce, 0x004e, 0x080c, 0xa872,
+	0x080c, 0xab3a, 0x080c, 0xa88e, 0x60e3, 0x0000, 0x001e, 0x2001,
+	0x1800, 0x2014, 0x9296, 0x0004, 0x1170, 0xd19c, 0x11b0, 0x2011,
+	0x180c, 0x2214, 0xd29c, 0x1120, 0x6204, 0x9295, 0x0002, 0x6206,
+	0x6228, 0xc29d, 0x622a, 0x2003, 0x0001, 0x2001, 0x1826, 0x2003,
+	0x0000, 0x2011, 0x0020, 0x080c, 0x2a44, 0xd194, 0x0904, 0x2500,
+	0x0016, 0x080c, 0xa872, 0x6220, 0xd2b4, 0x0904, 0x249b, 0x080c,
+	0x86c5, 0x080c, 0x9e0e, 0x2011, 0x0004, 0x080c, 0x2a44, 0x00f6,
+	0x2019, 0x19f3, 0x2304, 0x907d, 0x0904, 0x2468, 0x7804, 0x9086,
+	0x0032, 0x15f0, 0x00d6, 0x00c6, 0x00e6, 0x0096, 0x2069, 0x0140,
+	0x782c, 0x685e, 0x7808, 0x685a, 0x6043, 0x0002, 0x2001, 0x0003,
+	0x8001, 0x1df0, 0x6043, 0x0000, 0x2001, 0x003c, 0x8001, 0x1df0,
+	0x080c, 0x2a1a, 0x2001, 0x001e, 0x8001, 0x0240, 0x20a9, 0x0009,
+	0x080c, 0x29d1, 0x6904, 0xd1dc, 0x1140, 0x0cb0, 0x2001, 0x0100,
+	0x080c, 0x2a0a, 0x9006, 0x080c, 0x2a0a, 0x080c, 0x95ad, 0x080c,
+	0xa88e, 0x7814, 0x2048, 0xa867, 0x0103, 0x2f60, 0x080c, 0xabc9,
+	0x009e, 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x00ae, 0x0005,
+	0x00fe, 0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0110,
+	0x080c, 0x2a1a, 0x00de, 0x00c6, 0x2061, 0x19e7, 0x6034, 0x080c,
+	0xcf2e, 0x0120, 0x909a, 0x0003, 0x1258, 0x0018, 0x909a, 0x00c8,
+	0x1238, 0x8000, 0x6036, 0x00ce, 0x080c, 0x9de6, 0x0804, 0x24fd,
+	0x2061, 0x0100, 0x62c0, 0x080c, 0xa7a8, 0x2019, 0x19f3, 0x2304,
+	0x9065, 0x0130, 0x6003, 0x0001, 0x2009, 0x0027, 0x080c, 0xac68,
+	0x00ce, 0x0804, 0x24fd, 0xd2bc, 0x0904, 0x24e0, 0x080c, 0x86d2,
+	0x2011, 0x0004, 0x080c, 0x2a44, 0x00d6, 0x2069, 0x0140, 0x6804,
+	0x9084, 0x4000, 0x0110, 0x080c, 0x2a1a, 0x00de, 0x00c6, 0x2061,
+	0x19e7, 0x6050, 0x080c, 0xcf2e, 0x0120, 0x909a, 0x0003, 0x1668,
+	0x0018, 0x909a, 0x00c8, 0x1648, 0x8000, 0x6052, 0x604c, 0x00ce,
+	0x9005, 0x05d8, 0x2009, 0x07d0, 0x080c, 0x86ca, 0x9080, 0x0008,
+	0x2004, 0x9086, 0x0006, 0x1138, 0x2009, 0x1984, 0x2011, 0x0012,
+	0x080c, 0x2a53, 0x0450, 0x9080, 0x0008, 0x2004, 0x9086, 0x0009,
+	0x0d98, 0x2009, 0x1984, 0x2011, 0x0016, 0x080c, 0x2a53, 0x00e8,
+	0x2011, 0x0004, 0x080c, 0x2a44, 0x00c0, 0x0036, 0x2019, 0x0001,
+	0x080c, 0xa0f4, 0x003e, 0x2019, 0x19fa, 0x2304, 0x9065, 0x0160,
+	0x2009, 0x004f, 0x6020, 0x9086, 0x0009, 0x1110, 0x2009, 0x004f,
+	0x6003, 0x0003, 0x080c, 0xac68, 0x00ce, 0x080c, 0xa88e, 0x001e,
+	0xd19c, 0x0904, 0x255e, 0x7038, 0xd0ac, 0x1538, 0x0016, 0x0156,
+	0x2011, 0x0008, 0x080c, 0x2a44, 0x6050, 0xc0e5, 0x6052, 0x20a9,
+	0x0367, 0x1f04, 0x252b, 0x1d04, 0x2513, 0x080c, 0x86f9, 0x6020,
+	0xd09c, 0x1db8, 0x00f6, 0x2079, 0x0100, 0x080c, 0x2981, 0x00fe,
+	0x1d80, 0x6050, 0xc0e4, 0x6052, 0x2011, 0x0008, 0x080c, 0x2a44,
+	0x015e, 0x001e, 0x0498, 0x015e, 0x001e, 0x0016, 0x6028, 0xc09c,
+	0x602a, 0x080c, 0xa872, 0x080c, 0xab3a, 0x080c, 0xa88e, 0x60e3,
+	0x0000, 0x080c, 0xe6d7, 0x080c, 0xe6f2, 0x080c, 0x56d7, 0xd0fc,
+	0x1138, 0x080c, 0xcf27, 0x1120, 0x9085, 0x0001, 0x080c, 0x751c,
+	0x9006, 0x080c, 0x2a0a, 0x2009, 0x0002, 0x080c, 0x29f6, 0x00e6,
+	0x2071, 0x1800, 0x7003, 0x0004, 0x080c, 0x0eb4, 0x00ee, 0x2011,
+	0x0008, 0x080c, 0x2a44, 0x080c, 0x0bc3, 0x001e, 0x918c, 0xffd0,
+	0x2110, 0x080c, 0x2a44, 0x00ae, 0x0005, 0x0016, 0x2001, 0x0387,
+	0x200c, 0xd1a4, 0x001e, 0x0904, 0x2310, 0x0016, 0x2009, 0x2571,
+	0x00c0, 0x2001, 0x0387, 0x2003, 0x1000, 0x001e, 0x0c38, 0x0016,
+	0x2001, 0x0387, 0x200c, 0xd1b4, 0x001e, 0x0904, 0x2310, 0x0016,
+	0x2009, 0x2583, 0x0030, 0x2001, 0x0387, 0x2003, 0x4000, 0x001e,
+	0x08a8, 0x6028, 0xc0bc, 0x602a, 0x2001, 0x0156, 0x2003, 0xbc91,
+	0x8000, 0x2003, 0xffff, 0x6043, 0x0001, 0x080c, 0x29f0, 0x2011,
+	0x0080, 0x080c, 0x2a44, 0x6017, 0x0000, 0x6043, 0x0000, 0x0817,
+	0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, 0x00f6, 0x0126, 0x2091,
+	0x8000, 0x2071, 0x1800, 0x71d0, 0x70d2, 0x9116, 0x0904, 0x25f3,
+	0x81ff, 0x01a0, 0x2009, 0x0000, 0x080c, 0x29f6, 0x2011, 0x8011,
+	0x2019, 0x010e, 0x231c, 0x939e, 0x0007, 0x1118, 0x2019, 0x0001,
+	0x0010, 0x2019, 0x0000, 0x080c, 0x4b00, 0x0468, 0x2001, 0x19a8,
+	0x200c, 0x81ff, 0x1140, 0x2001, 0x0109, 0x2004, 0xd0b4, 0x0118,
+	0x2019, 0x0003, 0x0008, 0x2118, 0x2011, 0x8012, 0x080c, 0x4b00,
+	0x080c, 0x0eb4, 0x080c, 0x56d7, 0xd0fc, 0x11a8, 0x080c, 0xcf27,
+	0x1190, 0x00c6, 0x080c, 0x268f, 0x080c, 0xa872, 0x080c, 0xa04f,
+	0x080c, 0xa88e, 0x2061, 0x0100, 0x2019, 0x0028, 0x2009, 0x0002,
+	0x080c, 0x31a3, 0x00ce, 0x012e, 0x00fe, 0x00ee, 0x003e, 0x002e,
+	0x001e, 0x000e, 0x0005, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094,
+	0xff00, 0x11f0, 0x2011, 0x1837, 0x2214, 0xd2ac, 0x11c8, 0x81ff,
+	0x01e8, 0x2011, 0x181f, 0x2204, 0x9106, 0x1190, 0x2011, 0x1820,
+	0x2214, 0x9294, 0xff00, 0x9584, 0xff00, 0x9206, 0x1148, 0x2011,
+	0x1820, 0x2214, 0x9294, 0x00ff, 0x9584, 0x00ff, 0x9206, 0x1120,
+	0x2500, 0x080c, 0x81ce, 0x0048, 0x9584, 0x00ff, 0x9080, 0x336d,
+	0x200d, 0x918c, 0xff00, 0x810f, 0x9006, 0x0005, 0x9080, 0x336d,
+	0x200d, 0x918c, 0x00ff, 0x0005, 0x00d6, 0x2069, 0x0140, 0x2001,
+	0x1818, 0x2003, 0x00ef, 0x20a9, 0x0010, 0x9006, 0x6852, 0x6856,
+	0x1f04, 0x263f, 0x00de, 0x0005, 0x0006, 0x00d6, 0x0026, 0x2069,
+	0x0140, 0x2001, 0x1818, 0x2102, 0x8114, 0x8214, 0x8214, 0x8214,
+	0x20a9, 0x0010, 0x6853, 0x0000, 0x9006, 0x82ff, 0x1128, 0x9184,
+	0x000f, 0x9080, 0xe706, 0x2005, 0x6856, 0x8211, 0x1f04, 0x2654,
+	0x002e, 0x00de, 0x000e, 0x0005, 0x00c6, 0x2061, 0x1800, 0x6030,
+	0x0110, 0xc09d, 0x0008, 0xc09c, 0x6032, 0x00ce, 0x0005, 0x0156,
+	0x00d6, 0x0026, 0x0016, 0x0006, 0x2069, 0x0140, 0x6980, 0x9116,
+	0x0180, 0x9112, 0x1230, 0x8212, 0x8210, 0x22a8, 0x2001, 0x0402,
+	0x0018, 0x22a8, 0x2001, 0x0404, 0x680e, 0x1f04, 0x2684, 0x680f,
+	0x0000, 0x000e, 0x001e, 0x002e, 0x00de, 0x015e, 0x0005, 0x080c,
+	0x56d3, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006, 0x0046, 0x2020,
+	0x2009, 0x002e, 0x080c, 0xe29e, 0x004e, 0x0005, 0x00f6, 0x0016,
+	0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, 0x0904, 0x26fb, 0x080c,
+	0x2971, 0x0660, 0x9084, 0x0700, 0x908e, 0x0600, 0x1120, 0x2011,
+	0x4000, 0x900e, 0x0458, 0x908e, 0x0500, 0x1120, 0x2011, 0x8000,
+	0x900e, 0x0420, 0x908e, 0x0400, 0x1120, 0x9016, 0x2009, 0x0001,
+	0x00e8, 0x908e, 0x0300, 0x1120, 0x9016, 0x2009, 0x0002, 0x00b0,
+	0x908e, 0x0200, 0x1120, 0x9016, 0x2009, 0x0004, 0x0078, 0x908e,
+	0x0100, 0x1548, 0x9016, 0x2009, 0x0008, 0x0040, 0x9084, 0x0700,
+	0x908e, 0x0300, 0x1500, 0x2011, 0x0030, 0x0058, 0x2300, 0x9080,
+	0x0020, 0x2018, 0x080c, 0x9135, 0x928c, 0xff00, 0x0110, 0x2011,
+	0x00ff, 0x2200, 0x8007, 0x9085, 0x004c, 0x78c2, 0x2009, 0x0138,
+	0x220a, 0x080c, 0x74d5, 0x1118, 0x2009, 0x196d, 0x220a, 0x002e,
+	0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, 0x0cc8, 0x0126, 0x2091,
+	0x2800, 0x0006, 0x0016, 0x0026, 0x2001, 0x0170, 0x200c, 0x8000,
+	0x2014, 0x9184, 0x0003, 0x0110, 0x080c, 0x0d76, 0x002e, 0x001e,
+	0x000e, 0x012e, 0x0005, 0x2001, 0x0171, 0x2004, 0xd0dc, 0x0168,
+	0x2001, 0x0170, 0x200c, 0x918c, 0x00ff, 0x918e, 0x004c, 0x1128,
+	0x200c, 0x918c, 0xff00, 0x810f, 0x0005, 0x900e, 0x2001, 0x0227,
+	0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9108, 0x2001, 0x0226,
+	0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9108, 0x0005, 0x0018,
+	0x000c, 0x0018, 0x0020, 0x1000, 0x0800, 0x1000, 0x1800, 0x0156,
+	0x0006, 0x0016, 0x0026, 0x00e6, 0x2001, 0x1990, 0x2004, 0x908a,
+	0x0007, 0x1a0c, 0x0d7d, 0x0033, 0x00ee, 0x002e, 0x001e, 0x000e,
+	0x015e, 0x0005, 0x2759, 0x2777, 0x279b, 0x279d, 0x27c6, 0x27c8,
+	0x27ca, 0x2001, 0x0001, 0x080c, 0x25a0, 0x080c, 0x29bb, 0x2001,
+	0x1992, 0x2003, 0x0000, 0x7828, 0x9084, 0xe1d7, 0x782a, 0x9006,
+	0x20a9, 0x0009, 0x080c, 0x298d, 0x2001, 0x1990, 0x2003, 0x0006,
+	0x2009, 0x001e, 0x2011, 0x27cb, 0x080c, 0x86d7, 0x0005, 0x2009,
+	0x1995, 0x200b, 0x0000, 0x2001, 0x199a, 0x2003, 0x0036, 0x2001,
+	0x1999, 0x2003, 0x002a, 0x2001, 0x1992, 0x2003, 0x0001, 0x9006,
+	0x080c, 0x2928, 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, 0x298d,
+	0x2001, 0x1990, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x27cb,
+	0x080c, 0x86d7, 0x0005, 0x080c, 0x0d7d, 0x2001, 0x199a, 0x2003,
+	0x0036, 0x2001, 0x1992, 0x2003, 0x0003, 0x7a38, 0x9294, 0x0005,
+	0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c,
+	0x2928, 0x2001, 0x1996, 0x2003, 0x0000, 0x2001, 0xffff, 0x20a9,
+	0x0009, 0x080c, 0x298d, 0x2001, 0x1990, 0x2003, 0x0006, 0x2009,
+	0x001e, 0x2011, 0x27cb, 0x080c, 0x86d7, 0x0005, 0x080c, 0x0d7d,
+	0x080c, 0x0d7d, 0x0005, 0x0006, 0x0016, 0x0026, 0x00e6, 0x00f6,
+	0x0156, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, 0x2001, 0x1992,
+	0x2004, 0x908a, 0x0007, 0x1a0c, 0x0d7d, 0x0043, 0x012e, 0x015e,
+	0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, 0x0005, 0x27ed, 0x280d,
+	0x284d, 0x287d, 0x28a1, 0x28b1, 0x28b3, 0x080c, 0x2981, 0x11b0,
+	0x7850, 0x9084, 0xefff, 0x7852, 0x2009, 0x1998, 0x2104, 0x7a38,
+	0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0xc08d, 0x0008, 0xc085,
+	0x200a, 0x2001, 0x1990, 0x2003, 0x0001, 0x0030, 0x080c, 0x28d7,
+	0x2001, 0xffff, 0x080c, 0x2768, 0x0005, 0x080c, 0x28b5, 0x05e0,
+	0x2009, 0x1999, 0x2104, 0x8001, 0x200a, 0x080c, 0x2981, 0x1178,
+	0x7850, 0x9084, 0xefff, 0x7852, 0x7a38, 0x9294, 0x0005, 0x9296,
+	0x0005, 0x0518, 0x2009, 0x1998, 0x2104, 0xc085, 0x200a, 0x2009,
+	0x1995, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005, 0x0118, 0x080c,
+	0x28bd, 0x00c0, 0x200b, 0x0000, 0x7a38, 0x9294, 0x0006, 0x9296,
+	0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2945,
+	0x2001, 0x1992, 0x2003, 0x0002, 0x0028, 0x2001, 0x1990, 0x2003,
+	0x0003, 0x0010, 0x080c, 0x278a, 0x0005, 0x080c, 0x28b5, 0x0560,
+	0x2009, 0x1999, 0x2104, 0x8001, 0x200a, 0x080c, 0x2981, 0x1168,
+	0x7850, 0x9084, 0xefff, 0x7852, 0x2001, 0x1990, 0x2003, 0x0003,
+	0x2001, 0x1991, 0x2003, 0x0000, 0x00b8, 0x2009, 0x1999, 0x2104,
+	0x9005, 0x1118, 0x080c, 0x28fa, 0x0010, 0x080c, 0x28ca, 0x080c,
+	0x28bd, 0x2009, 0x1995, 0x200b, 0x0000, 0x2001, 0x1992, 0x2003,
+	0x0001, 0x080c, 0x278a, 0x0000, 0x0005, 0x04b9, 0x0508, 0x080c,
+	0x2981, 0x11b8, 0x7850, 0x9084, 0xefff, 0x7852, 0x2009, 0x1996,
+	0x2104, 0x8000, 0x200a, 0x9086, 0x0007, 0x0108, 0x0078, 0x2001,
+	0x199b, 0x2003, 0x000a, 0x2009, 0x1998, 0x2104, 0xc0fd, 0x200a,
+	0x0038, 0x0419, 0x2001, 0x1992, 0x2003, 0x0004, 0x080c, 0x27b5,
+	0x0005, 0x0099, 0x0168, 0x080c, 0x2981, 0x1138, 0x7850, 0x9084,
+	0xefff, 0x7852, 0x080c, 0x27a1, 0x0018, 0x0079, 0x080c, 0x27b5,
+	0x0005, 0x080c, 0x0d7d, 0x080c, 0x0d7d, 0x2009, 0x199a, 0x2104,
+	0x8001, 0x200a, 0x090c, 0x2916, 0x0005, 0x7a38, 0x9294, 0x0005,
+	0x9296, 0x0005, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c,
+	0x2945, 0x0005, 0x7a38, 0x9294, 0x0006, 0x9296, 0x0006, 0x0110,
+	0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2928, 0x0005, 0x2009,
+	0x1995, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005, 0x0108, 0x0068,
+	0x200b, 0x0000, 0x7a38, 0x9294, 0x0006, 0x9296, 0x0006, 0x0110,
+	0x9006, 0x0010, 0x2001, 0x0001, 0x04d9, 0x7a38, 0x9294, 0x0005,
+	0x9296, 0x0005, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c,
+	0x2945, 0x0005, 0x0086, 0x2001, 0x1998, 0x2004, 0x9084, 0x7fff,
+	0x090c, 0x0d7d, 0x2009, 0x1997, 0x2144, 0x8846, 0x280a, 0x9844,
+	0x0dd8, 0xd08c, 0x1120, 0xd084, 0x1120, 0x080c, 0x0d7d, 0x9006,
+	0x0010, 0x2001, 0x0001, 0x00a1, 0x008e, 0x0005, 0x0006, 0x0156,
+	0x2001, 0x1990, 0x20a9, 0x0009, 0x2003, 0x0000, 0x8000, 0x1f04,
+	0x291c, 0x2001, 0x1997, 0x2003, 0x8000, 0x015e, 0x000e, 0x0005,
+	0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0158, 0x7838, 0x9084,
+	0xfff9, 0x9085, 0x0004, 0x783a, 0x2009, 0x199d, 0x210c, 0x795a,
+	0x0050, 0x7838, 0x9084, 0xfffb, 0x9085, 0x0006, 0x783a, 0x2009,
+	0x199e, 0x210c, 0x795a, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100,
+	0x9085, 0x0000, 0x0158, 0x7838, 0x9084, 0xfffa, 0x9085, 0x0004,
+	0x783a, 0x7850, 0x9084, 0xfff0, 0x7852, 0x00c8, 0x7838, 0x9084,
+	0xfffb, 0x9085, 0x0005, 0x783a, 0x7850, 0x9084, 0xfff0, 0x0016,
+	0x2009, 0x0003, 0x210c, 0x918c, 0x0600, 0x918e, 0x0400, 0x0118,
+	0x9085, 0x000a, 0x0010, 0x9085, 0x0000, 0x001e, 0x7852, 0x00fe,
+	0x0005, 0x0006, 0x2001, 0x0100, 0x2004, 0x9082, 0x0007, 0x000e,
+	0x0005, 0x0006, 0x2001, 0x0100, 0x2004, 0x9082, 0x0009, 0x000e,
+	0x0005, 0x0156, 0x20a9, 0x0064, 0x7820, 0x080c, 0x29f0, 0xd09c,
+	0x1110, 0x1f04, 0x2984, 0x015e, 0x0005, 0x0126, 0x0016, 0x0006,
+	0x2091, 0x8000, 0x000e, 0x2008, 0x9186, 0x0000, 0x1118, 0x783b,
+	0x0007, 0x0090, 0x9186, 0x0001, 0x1118, 0x783b, 0x0006, 0x0060,
+	0x9186, 0x0002, 0x1118, 0x783b, 0x0005, 0x0030, 0x9186, 0x0003,
+	0x1118, 0x783b, 0x0004, 0x0000, 0x0006, 0x1d04, 0x29ad, 0x080c,
+	0x86f9, 0x1f04, 0x29ad, 0x7850, 0x9085, 0x1000, 0x7852, 0x000e,
+	0x001e, 0x012e, 0x0005, 0x080c, 0x2aab, 0x0005, 0x0006, 0x0156,
+	0x00f6, 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd0ac, 0x1100,
+	0x7854, 0xd08c, 0x1110, 0x1f04, 0x29c8, 0x00fe, 0x015e, 0x000e,
+	0x0005, 0x1d04, 0x29d1, 0x080c, 0x86f9, 0x1f04, 0x29d1, 0x0005,
+	0x0006, 0x2001, 0x199c, 0x2004, 0x9086, 0x0000, 0x000e, 0x0005,
+	0x0006, 0x2001, 0x199c, 0x2004, 0x9086, 0x0001, 0x000e, 0x0005,
+	0x0006, 0x2001, 0x199c, 0x2004, 0x9086, 0x0002, 0x000e, 0x0005,
+	0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x0005, 0x0006, 0x2001,
+	0x19a8, 0x2102, 0x000e, 0x0005, 0x2009, 0x0171, 0x2104, 0xd0dc,
+	0x0140, 0x2009, 0x0170, 0x2104, 0x200b, 0x0080, 0xa001, 0xa001,
+	0x200a, 0x0005, 0x0016, 0x0026, 0x080c, 0x74ef, 0x0108, 0xc0bc,
+	0x2009, 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a, 0x002e,
+	0x001e, 0x0005, 0x0016, 0x0026, 0x2009, 0x0140, 0x2114, 0x9294,
+	0x0001, 0x9285, 0x1000, 0x200a, 0x220a, 0x002e, 0x001e, 0x0005,
+	0x0016, 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, 0x9215,
+	0x220a, 0x002e, 0x001e, 0x0005, 0x0006, 0x0016, 0x2009, 0x0140,
+	0x2104, 0x1128, 0x080c, 0x74ef, 0x0110, 0xc0bc, 0x0008, 0xc0bd,
+	0x200a, 0x001e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0380, 0x7843,
+	0x0101, 0x7844, 0xd084, 0x1de8, 0x2001, 0x0109, 0x2202, 0x7843,
+	0x0100, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0380, 0x7843, 0x0202,
+	0x7844, 0xd08c, 0x1de8, 0x2079, 0x0100, 0x7814, 0x9104, 0x9205,
+	0x7a16, 0x2079, 0x0380, 0x7843, 0x0200, 0x00fe, 0x0005, 0x0016,
+	0x0026, 0x0036, 0x00c6, 0x2061, 0x0100, 0x6050, 0x9084, 0xfbff,
+	0x9085, 0x0040, 0x6052, 0x20a9, 0x0002, 0x080c, 0x29d1, 0x6050,
+	0x9085, 0x0400, 0x9084, 0xff9f, 0x6052, 0x20a9, 0x0005, 0x080c,
+	0x29d1, 0x6054, 0xd0bc, 0x090c, 0x0d7d, 0x20a9, 0x0005, 0x080c,
+	0x29d1, 0x6054, 0xd0ac, 0x090c, 0x0d7d, 0x2009, 0x19af, 0x9084,
+	0x7e00, 0x8007, 0x8004, 0x8004, 0x200a, 0x9085, 0x0000, 0x605a,
+	0x2009, 0x199d, 0x2011, 0x199e, 0x6358, 0x939c, 0x38df, 0x2320,
+	0x939d, 0x0000, 0x94a5, 0x0000, 0x230a, 0x2412, 0x00ce, 0x003e,
+	0x002e, 0x001e, 0x0005, 0x0006, 0x00c6, 0x2061, 0x0100, 0x6050,
+	0xc0cd, 0x6052, 0x00ce, 0x000e, 0x0005, 0x2fb1, 0x2fb1, 0x2bb5,
+	0x2bb5, 0x2bc1, 0x2bc1, 0x2bcd, 0x2bcd, 0x2bdb, 0x2bdb, 0x2be7,
+	0x2be7, 0x2bf5, 0x2bf5, 0x2c03, 0x2c03, 0x2c15, 0x2c15, 0x2c21,
+	0x2c21, 0x2c2f, 0x2c2f, 0x2c4d, 0x2c4d, 0x2c6d, 0x2c6d, 0x2c3d,
+	0x2c3d, 0x2c5d, 0x2c5d, 0x2c7b, 0x2c7b, 0x2c13, 0x2c13, 0x2c13,
+	0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13,
+	0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13,
+	0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13,
+	0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c8d, 0x2c8d, 0x2c99,
+	0x2c99, 0x2ca7, 0x2ca7, 0x2cb5, 0x2cb5, 0x2cc5, 0x2cc5, 0x2cd3,
+	0x2cd3, 0x2ce3, 0x2ce3, 0x2cf3, 0x2cf3, 0x2d05, 0x2d05, 0x2d13,
+	0x2d13, 0x2d23, 0x2d23, 0x2d45, 0x2d45, 0x2d69, 0x2d69, 0x2d33,
+	0x2d33, 0x2d57, 0x2d57, 0x2d79, 0x2d79, 0x2c13, 0x2c13, 0x2c13,
+	0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13,
+	0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13,
+	0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13,
+	0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2d8d, 0x2d8d, 0x2d99,
+	0x2d99, 0x2da7, 0x2da7, 0x2db5, 0x2db5, 0x2dc5, 0x2dc5, 0x2dd3,
+	0x2dd3, 0x2de3, 0x2de3, 0x2df3, 0x2df3, 0x2e05, 0x2e05, 0x2e13,
+	0x2e13, 0x2e23, 0x2e23, 0x2e33, 0x2e33, 0x2e45, 0x2e45, 0x2e55,
+	0x2e55, 0x2e67, 0x2e67, 0x2e79, 0x2e79, 0x2c13, 0x2c13, 0x2c13,
+	0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13,
+	0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13,
+	0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13,
+	0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2e8d, 0x2e8d, 0x2e9b,
+	0x2e9b, 0x2eab, 0x2eab, 0x2ebb, 0x2ebb, 0x2ecd, 0x2ecd, 0x2edd,
+	0x2edd, 0x2eef, 0x2eef, 0x2f01, 0x2f01, 0x2f15, 0x2f15, 0x2f25,
+	0x2f25, 0x2f37, 0x2f37, 0x2f49, 0x2f49, 0x2f5d, 0x2f5d, 0x2f6e,
+	0x2f6e, 0x2f81, 0x2f81, 0x2f94, 0x2f94, 0x2c13, 0x2c13, 0x2c13,
+	0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13,
+	0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13,
+	0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13,
+	0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2248, 0x0804,
+	0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x207e, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c,
+	0x2248, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106,
+	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
+	0x2248, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c,
+	0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c, 0x2248, 0x080c,
+	0x20a8, 0x0804, 0x2fa9, 0xa001, 0x0cf0, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x13a3, 0x0804,
+	0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x2248, 0x080c, 0x13a3, 0x0804, 0x2fa9, 0x0106,
+	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
+	0x207e, 0x080c, 0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2248, 0x080c,
+	0x13a3, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c,
+	0x2248, 0x080c, 0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c,
+	0x13a3, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x13a3, 0x080c,
+	0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c, 0x2248, 0x080c,
+	0x13a3, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x0804,
+	0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x26fe, 0x080c, 0x2248, 0x0804, 0x2fa9, 0x0106,
+	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
+	0x26fe, 0x080c, 0x207e, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c,
+	0x207e, 0x080c, 0x2248, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c,
+	0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, 0x2248, 0x080c,
+	0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, 0x207e, 0x080c,
+	0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, 0x207e, 0x080c,
+	0x2248, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c,
+	0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, 0x2248, 0x080c,
+	0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, 0x207e, 0x080c,
+	0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, 0x2248, 0x080c,
+	0x13a3, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c,
+	0x207e, 0x080c, 0x2248, 0x080c, 0x13a3, 0x0804, 0x2fa9, 0x0106,
+	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
+	0x26fe, 0x080c, 0x207e, 0x080c, 0x13a3, 0x080c, 0x20a8, 0x0804,
+	0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x26fe, 0x080c, 0x13a3, 0x080c, 0x20a8, 0x0804,
+	0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x26fe, 0x080c, 0x207e, 0x080c, 0x2248, 0x080c,
+	0x13a3, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0xa8d8, 0x0804,
+	0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0xa8d8, 0x080c, 0x2248, 0x0804, 0x2fa9, 0x0106,
+	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
+	0x207e, 0x080c, 0xa8d8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c,
+	0xa8d8, 0x080c, 0x2248, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0xa8d8, 0x080c,
+	0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0xa8d8, 0x080c, 0x2248, 0x080c,
+	0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c, 0xa8d8, 0x080c,
+	0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c, 0xa8d8, 0x080c,
+	0x2248, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0xa8d8, 0x080c,
+	0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0xa8d8, 0x080c, 0x2248, 0x080c,
+	0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c, 0xa8d8, 0x080c,
+	0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c, 0xa8d8, 0x080c,
+	0x2248, 0x080c, 0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0xa8d8, 0x080c,
+	0x13a3, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0xa8d8, 0x080c,
+	0x2248, 0x080c, 0x13a3, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106,
+	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
+	0x207e, 0x080c, 0xa8d8, 0x080c, 0x13a3, 0x080c, 0x20a8, 0x0804,
+	0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x207e, 0x080c, 0xa8d8, 0x080c, 0x2248, 0x080c,
+	0x13a3, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c,
+	0xa8d8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, 0xa8d8, 0x080c,
+	0x2248, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, 0x207e, 0x080c,
+	0xa8d8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
+	0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, 0x207e, 0x080c,
+	0xa8d8, 0x080c, 0x2248, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c,
+	0xa8d8, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c,
+	0xa8d8, 0x080c, 0x2248, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106,
+	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
+	0x26fe, 0x080c, 0x207e, 0x080c, 0xa8d8, 0x080c, 0x20a8, 0x0804,
+	0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x26fe, 0x080c, 0x207e, 0x080c, 0xa8d8, 0x080c,
+	0x2248, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c,
+	0xa8d8, 0x080c, 0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c,
+	0xa8d8, 0x080c, 0x2248, 0x080c, 0x13a3, 0x0804, 0x2fa9, 0x0106,
+	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
+	0x26fe, 0x080c, 0x207e, 0x080c, 0xa8d8, 0x080c, 0x13a3, 0x0804,
+	0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x26fe, 0x080c, 0x207e, 0x080c, 0xa8d8, 0x080c,
+	0x2248, 0x080c, 0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c,
+	0xa8d8, 0x080c, 0x13a3, 0x080c, 0x20a8, 0x04d8, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe,
+	0x080c, 0xa8d8, 0x080c, 0x2248, 0x080c, 0x13a3, 0x080c, 0x20a8,
+	0x0440, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146,
+	0x0156, 0x080c, 0x26fe, 0x080c, 0x207e, 0x080c, 0x13a3, 0x080c,
+	0xa8d8, 0x080c, 0x20a8, 0x00a8, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, 0x207e,
+	0x080c, 0xa8d8, 0x080c, 0x2248, 0x080c, 0x13a3, 0x080c, 0x20a8,
+	0x0000, 0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e, 0x000e,
+	0x010e, 0x000d, 0x00b6, 0x00c6, 0x0026, 0x0046, 0x9026, 0x080c,
+	0x6a19, 0x1904, 0x30bf, 0x72dc, 0x2001, 0x197c, 0x2004, 0x9005,
+	0x1110, 0xd29c, 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, 0x30bf,
+	0x080c, 0x30c4, 0x0804, 0x30bf, 0xd2cc, 0x1904, 0x30bf, 0x080c,
+	0x74d5, 0x1120, 0x70af, 0xffff, 0x0804, 0x30bf, 0xd294, 0x0120,
+	0x70af, 0xffff, 0x0804, 0x30bf, 0x080c, 0x335c, 0x0160, 0x080c,
+	0xcf2e, 0x0128, 0x2001, 0x1818, 0x203c, 0x0804, 0x304c, 0x70af,
+	0xffff, 0x0804, 0x30bf, 0x2001, 0x1818, 0x203c, 0x7294, 0xd284,
+	0x0904, 0x304c, 0xd28c, 0x1904, 0x304c, 0x0036, 0x73ac, 0x938e,
+	0xffff, 0x1110, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1d80, 0x2c04,
+	0x938c, 0x0001, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084,
+	0x00ff, 0x970e, 0x05b8, 0x908e, 0x0000, 0x05a0, 0x908e, 0x00ff,
+	0x1150, 0x7230, 0xd284, 0x1598, 0x7294, 0xc28d, 0x7296, 0x70af,
+	0xffff, 0x003e, 0x0488, 0x900e, 0x080c, 0x25fb, 0x080c, 0x65bd,
+	0x1520, 0x9006, 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0148, 0x00c6,
+	0x2060, 0x080c, 0x8b5f, 0x00ce, 0x090c, 0x8f03, 0xb8af, 0x0000,
+	0x080c, 0x6a5b, 0x1150, 0x7030, 0xd08c, 0x0118, 0xb800, 0xd0bc,
+	0x0120, 0x080c, 0x30dd, 0x0148, 0x0028, 0x080c, 0x3231, 0x080c,
+	0x3109, 0x0118, 0x8318, 0x0804, 0x2ffc, 0x73ae, 0x0010, 0x70af,
+	0xffff, 0x003e, 0x0804, 0x30bf, 0x9780, 0x336d, 0x203d, 0x97bc,
+	0xff00, 0x873f, 0x2041, 0x007e, 0x70ac, 0x9096, 0xffff, 0x1118,
+	0x900e, 0x28a8, 0x0050, 0x9812, 0x0220, 0x2008, 0x9802, 0x20a8,
+	0x0020, 0x70af, 0xffff, 0x0804, 0x30bf, 0x2700, 0x0156, 0x0016,
+	0x9106, 0x0904, 0x30b4, 0xc484, 0x080c, 0x661e, 0x0148, 0x080c,
+	0xcf2e, 0x1904, 0x30b4, 0x080c, 0x65bd, 0x1904, 0x30bc, 0x0008,
+	0xc485, 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0148, 0x00c6, 0x2060,
+	0x080c, 0x8b5f, 0x00ce, 0x090c, 0x8f03, 0xb8af, 0x0000, 0x080c,
+	0x6a5b, 0x1130, 0x7030, 0xd08c, 0x01f8, 0xb800, 0xd0bc, 0x11e0,
+	0x7294, 0xd28c, 0x0180, 0x080c, 0x6a5b, 0x9082, 0x0006, 0x02e0,
+	0xd484, 0x1118, 0x080c, 0x65e2, 0x0028, 0x080c, 0x32ca, 0x01a0,
+	0x080c, 0x32f5, 0x0088, 0x080c, 0x3231, 0x080c, 0xcf2e, 0x1160,
+	0x080c, 0x3109, 0x0188, 0x0040, 0x080c, 0xcf2e, 0x1118, 0x080c,
+	0x32ca, 0x0110, 0x0451, 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04,
+	0x3065, 0x70af, 0xffff, 0x0018, 0x001e, 0x015e, 0x71ae, 0x004e,
+	0x002e, 0x00ce, 0x00be, 0x0005, 0x00c6, 0x0016, 0x70af, 0x0001,
+	0x2009, 0x007e, 0x080c, 0x65bd, 0x1168, 0xb813, 0x00ff, 0xb817,
+	0xfffe, 0x080c, 0x3231, 0x04a9, 0x0128, 0x70dc, 0xc0bd, 0x70de,
+	0x080c, 0xcc7b, 0x001e, 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6,
+	0x00c6, 0x2001, 0x184c, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c,
+	0xac3b, 0x01d0, 0x2b00, 0x6012, 0x080c, 0xcca8, 0x6023, 0x0001,
+	0x9006, 0x080c, 0x655a, 0x2001, 0x0000, 0x080c, 0x656e, 0x0126,
+	0x2091, 0x8000, 0x70a8, 0x8000, 0x70aa, 0x012e, 0x2009, 0x0004,
+	0x080c, 0xac68, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e,
+	0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, 0x184c, 0x2004,
+	0x9084, 0x00ff, 0xb842, 0x080c, 0xac3b, 0x0548, 0x2b00, 0x6012,
+	0xb800, 0xc0c4, 0xb802, 0xb8a0, 0x9086, 0x007e, 0x0140, 0xb804,
+	0x9084, 0x00ff, 0x9086, 0x0006, 0x1110, 0x080c, 0x31e4, 0x080c,
+	0xcca8, 0x6023, 0x0001, 0x9006, 0x080c, 0x655a, 0x2001, 0x0002,
+	0x080c, 0x656e, 0x0126, 0x2091, 0x8000, 0x70a8, 0x8000, 0x70aa,
+	0x012e, 0x2009, 0x0002, 0x080c, 0xac68, 0x9085, 0x0001, 0x00ce,
+	0x00de, 0x007e, 0x001e, 0x0005, 0x00b6, 0x00c6, 0x0026, 0x2009,
+	0x0080, 0x080c, 0x65bd, 0x1140, 0xb813, 0x00ff, 0xb817, 0xfffc,
+	0x0039, 0x0110, 0x70e3, 0xffff, 0x002e, 0x00ce, 0x00be, 0x0005,
+	0x0016, 0x0076, 0x00d6, 0x00c6, 0x080c, 0xab73, 0x01d0, 0x2b00,
+	0x6012, 0x080c, 0xcca8, 0x6023, 0x0001, 0x9006, 0x080c, 0x655a,
+	0x2001, 0x0002, 0x080c, 0x656e, 0x0126, 0x2091, 0x8000, 0x70e4,
+	0x8000, 0x70e6, 0x012e, 0x2009, 0x0002, 0x080c, 0xac68, 0x9085,
+	0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, 0x00d6,
+	0x0126, 0x2091, 0x8000, 0x2009, 0x007f, 0x080c, 0x65bd, 0x11b8,
+	0xb813, 0x00ff, 0xb817, 0xfffd, 0xb8d7, 0x0004, 0x080c, 0xab73,
+	0x0170, 0x2b00, 0x6012, 0x6316, 0x6023, 0x0001, 0x620a, 0x080c,
+	0xcca8, 0x2009, 0x0022, 0x080c, 0xac68, 0x9085, 0x0001, 0x012e,
+	0x00de, 0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026,
+	0x00b6, 0x21f0, 0x9036, 0x080c, 0xa872, 0x1110, 0x2031, 0x0001,
+	0x0066, 0x080c, 0x937f, 0x080c, 0x92f5, 0x080c, 0xa7c8, 0x080c,
+	0xbaf5, 0x006e, 0x86ff, 0x0110, 0x080c, 0xa88e, 0x3e08, 0x2130,
+	0x81ff, 0x0120, 0x20a9, 0x007e, 0x900e, 0x0018, 0x20a9, 0x007f,
+	0x900e, 0x0016, 0x080c, 0x661e, 0x1140, 0x9686, 0x0002, 0x1118,
+	0xb800, 0xd0bc, 0x1110, 0x080c, 0x603c, 0x001e, 0x8108, 0x1f04,
+	0x31c9, 0x9686, 0x0001, 0x190c, 0x3330, 0x00be, 0x002e, 0x003e,
+	0x006e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0026,
+	0x0016, 0x00b6, 0x9016, 0x080c, 0xa872, 0x1110, 0x2011, 0x0001,
+	0x0026, 0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c,
+	0x9374, 0x0076, 0x2039, 0x0000, 0x080c, 0x9246, 0x2c08, 0x080c,
+	0xdfc0, 0x007e, 0x001e, 0x002e, 0x82ff, 0x0110, 0x080c, 0xa88e,
+	0xba10, 0xbb14, 0x080c, 0x603c, 0xba12, 0xbb16, 0x00be, 0x001e,
+	0x002e, 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x00b6,
+	0x6010, 0x2058, 0xb8a0, 0x00be, 0x9086, 0x0080, 0x0150, 0x2071,
+	0x1800, 0x70a8, 0x9005, 0x0110, 0x8001, 0x70aa, 0x000e, 0x00ee,
+	0x0005, 0x2071, 0x1800, 0x70e4, 0x9005, 0x0dc0, 0x8001, 0x70e6,
+	0x0ca8, 0xb800, 0xc08c, 0xb802, 0x0005, 0x00f6, 0x00e6, 0x00c6,
+	0x00b6, 0x0036, 0x0026, 0x0016, 0x0156, 0x2178, 0x9016, 0x080c,
+	0xa872, 0x1110, 0x2011, 0x0001, 0x0026, 0x81ff, 0x1118, 0x20a9,
+	0x0001, 0x0088, 0x080c, 0x56d3, 0xd0c4, 0x0150, 0xd0a4, 0x0140,
+	0x9006, 0x0046, 0x2020, 0x2009, 0x002d, 0x080c, 0xe29e, 0x004e,
+	0x20a9, 0x0800, 0x9016, 0x0026, 0x928e, 0x007e, 0x0904, 0x32a5,
+	0x928e, 0x007f, 0x0904, 0x32a5, 0x928e, 0x0080, 0x05f0, 0x9288,
+	0x1000, 0x210c, 0x81ff, 0x05c8, 0x8fff, 0x1150, 0x2001, 0x198e,
+	0x0006, 0x2003, 0x0001, 0x080c, 0x32b7, 0x000e, 0x2003, 0x0000,
+	0x00b6, 0x00c6, 0x2158, 0x2001, 0x0001, 0x080c, 0x6a25, 0x00ce,
+	0x00be, 0x2019, 0x0029, 0x080c, 0x9374, 0x0076, 0x2039, 0x0000,
+	0x080c, 0x9246, 0x00b6, 0x00c6, 0x0026, 0x2158, 0xba04, 0x9294,
+	0x00ff, 0x9286, 0x0006, 0x1118, 0xb807, 0x0404, 0x0028, 0x2001,
+	0x0004, 0x8007, 0x9215, 0xba06, 0x002e, 0x00ce, 0x00be, 0x0016,
+	0x2c08, 0x080c, 0xdfc0, 0x001e, 0x007e, 0x002e, 0x8210, 0x1f04,
+	0x325b, 0x002e, 0x82ff, 0x0110, 0x080c, 0xa88e, 0x015e, 0x001e,
+	0x002e, 0x003e, 0x00be, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0046,
+	0x0026, 0x0016, 0x080c, 0x56d3, 0xd0c4, 0x0140, 0xd0a4, 0x0130,
+	0x9006, 0x2220, 0x2009, 0x0029, 0x080c, 0xe29e, 0x001e, 0x002e,
+	0x004e, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x7294, 0x82ff,
+	0x01e8, 0x080c, 0x6a53, 0x11d0, 0x2100, 0x080c, 0x262e, 0x81ff,
+	0x01b8, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1d80, 0x2c04, 0xd384,
+	0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, 0x9116,
+	0x0138, 0x9096, 0x00ff, 0x0110, 0x8318, 0x0c68, 0x9085, 0x0001,
+	0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x0016, 0x00c6, 0x0126,
+	0x2091, 0x8000, 0x0066, 0x9036, 0x080c, 0xa872, 0x1110, 0x2031,
+	0x0001, 0x0066, 0x0036, 0x2019, 0x0029, 0x00d9, 0x003e, 0x006e,
+	0x86ff, 0x0110, 0x080c, 0xa88e, 0x006e, 0x9180, 0x1000, 0x2004,
+	0x9065, 0x0158, 0x0016, 0x00c6, 0x2061, 0x1b32, 0x001e, 0x6112,
+	0x080c, 0x31e4, 0x001e, 0x080c, 0x65e2, 0x012e, 0x00ce, 0x001e,
+	0x0005, 0x0016, 0x0026, 0x2110, 0x080c, 0xa366, 0x080c, 0xe605,
+	0x002e, 0x001e, 0x0005, 0x2001, 0x1837, 0x2004, 0xd0cc, 0x0005,
+	0x00c6, 0x00b6, 0x080c, 0x74d5, 0x1118, 0x20a9, 0x0800, 0x0010,
+	0x20a9, 0x0782, 0x080c, 0x74d5, 0x1110, 0x900e, 0x0010, 0x2009,
+	0x007e, 0x9180, 0x1000, 0x2004, 0x905d, 0x0130, 0x86ff, 0x0110,
+	0xb800, 0xd0bc, 0x090c, 0x65e2, 0x8108, 0x1f04, 0x3341, 0x2061,
+	0x1800, 0x607f, 0x0000, 0x6080, 0x9084, 0x00ff, 0x6082, 0x60b3,
+	0x0000, 0x00be, 0x00ce, 0x0005, 0x2001, 0x1869, 0x2004, 0xd0bc,
+	0x0005, 0x2011, 0x1848, 0x2214, 0xd2ec, 0x0005, 0x0026, 0x2011,
+	0x1867, 0x2214, 0xd2dc, 0x002e, 0x0005, 0x7eef, 0x7de8, 0x7ce4,
+	0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da, 0x7ad9, 0x80d6, 0x80d5,
+	0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce, 0x78cd, 0x80cc, 0x80cb,
+	0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5, 0x76c3, 0x80bc, 0x80ba,
+	0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3, 0x80b2, 0x80b1, 0x80ae,
+	0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9, 0x80a7, 0x6da6, 0x6ca5,
+	0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b, 0x8098, 0x6797, 0x6690,
+	0x658f, 0x6488, 0x6384, 0x6282, 0x8081, 0x8080, 0x617c, 0x607a,
+	0x8079, 0x5f76, 0x8075, 0x8074, 0x8073, 0x8072, 0x8071, 0x806e,
+	0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69, 0x8067, 0x5a66, 0x5965,
+	0x5863, 0x575c, 0x565a, 0x5559, 0x8056, 0x8055, 0x5454, 0x5353,
+	0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c, 0x804b, 0x4e4a, 0x4d49,
+	0x8047, 0x4c46, 0x8045, 0x8043, 0x803c, 0x803a, 0x8039, 0x8036,
+	0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831, 0x802e, 0x472d, 0x462c,
+	0x452b, 0x442a, 0x4329, 0x4227, 0x8026, 0x8025, 0x4123, 0x401f,
+	0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017, 0x8010, 0x3b0f, 0x3a08,
+	0x8004, 0x3902, 0x8001, 0x8000, 0x8000, 0x3800, 0x3700, 0x3600,
+	0x8000, 0x3500, 0x8000, 0x8000, 0x8000, 0x3400, 0x8000, 0x8000,
+	0x8000, 0x8000, 0x8000, 0x8000, 0x3300, 0x3200, 0x8000, 0x8000,
+	0x8000, 0x8000, 0x8000, 0x8000, 0x3100, 0x3000, 0x8000, 0x8000,
+	0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00, 0x8000, 0x8000, 0x8000,
+	0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800, 0x8000, 0x2700, 0x2600,
+	0x2500, 0x2400, 0x2300, 0x2200, 0x8000, 0x8000, 0x2100, 0x2000,
+	0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000, 0x8000, 0x1b00, 0x1a00,
+	0x8000, 0x1900, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+	0x1800, 0x8000, 0x1700, 0x1600, 0x1500, 0x8000, 0x1400, 0x1300,
+	0x1200, 0x1100, 0x1000, 0x0f00, 0x8000, 0x8000, 0x0e00, 0x0d00,
+	0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000, 0x8000, 0x0800, 0x0700,
+	0x8000, 0x0600, 0x8000, 0x8000, 0x8000, 0x0500, 0x0400, 0x0300,
+	0x8000, 0x0200, 0x8000, 0x8000, 0x8000, 0x0100, 0x8000, 0x8000,
+	0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x8000, 0x8000, 0x8000,
 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
-	0x8000, 0x8000, 0x8000, 0x8000, 0x2071, 0x189e, 0x7003, 0x0002,
-	0x9006, 0x7016, 0x701a, 0x704a, 0x704e, 0x700e, 0x7042, 0x7046,
-	0x703b, 0x18ba, 0x703f, 0x18ba, 0x7007, 0x0001, 0x080c, 0x1054,
-	0x090c, 0x0d7d, 0x2900, 0x706a, 0xa867, 0x0002, 0xa8ab, 0xdcb0,
-	0x080c, 0x1054, 0x090c, 0x0d7d, 0x2900, 0x706e, 0xa867, 0x0002,
-	0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x189e, 0x7004, 0x0002, 0x3463,
-	0x3464, 0x3477, 0x348b, 0x0005, 0x1004, 0x3474, 0x0e04, 0x3474,
-	0x2079, 0x0000, 0x0126, 0x2091, 0x8000, 0x700c, 0x9005, 0x1128,
-	0x700f, 0x0001, 0x012e, 0x0468, 0x0005, 0x012e, 0x0ce8, 0x2079,
-	0x0000, 0x2061, 0x18b8, 0x2c4c, 0xa86c, 0x908e, 0x0100, 0x0128,
-	0x9086, 0x0200, 0x0904, 0x355f, 0x0005, 0x7018, 0x2048, 0x2061,
-	0x1800, 0x701c, 0x0807, 0x7014, 0x2048, 0xa864, 0x9094, 0x00ff,
-	0x9296, 0x0029, 0x1120, 0xaa78, 0xd2fc, 0x0128, 0x0005, 0x9086,
-	0x0103, 0x0108, 0x0005, 0x2079, 0x0000, 0x2061, 0x1800, 0x701c,
-	0x0807, 0x2061, 0x1800, 0x7880, 0x908a, 0x0040, 0x1210, 0x61d0,
-	0x0042, 0x2100, 0x908a, 0x003f, 0x1a04, 0x355c, 0x61d0, 0x0804,
-	0x34f1, 0x3533, 0x356b, 0x3575, 0x3579, 0x3583, 0x3589, 0x358d,
-	0x359d, 0x35a0, 0x35aa, 0x35af, 0x35b4, 0x35bf, 0x35ca, 0x35d9,
-	0x35e8, 0x35f6, 0x360d, 0x3628, 0x355c, 0x36d1, 0x370f, 0x37b4,
-	0x37c5, 0x37e8, 0x355c, 0x355c, 0x355c, 0x3820, 0x3840, 0x3849,
-	0x3875, 0x387b, 0x355c, 0x38c1, 0x355c, 0x355c, 0x355c, 0x355c,
-	0x355c, 0x38cc, 0x38d5, 0x38dd, 0x38df, 0x355c, 0x355c, 0x355c,
-	0x355c, 0x355c, 0x355c, 0x390f, 0x355c, 0x355c, 0x355c, 0x355c,
-	0x355c, 0x392c, 0x3990, 0x355c, 0x355c, 0x355c, 0x355c, 0x355c,
-	0x355c, 0x0002, 0x39ba, 0x39bd, 0x3a1c, 0x3a35, 0x3a65, 0x3d07,
-	0x355c, 0x51cd, 0x355c, 0x355c, 0x355c, 0x355c, 0x355c, 0x355c,
-	0x355c, 0x355c, 0x35aa, 0x35af, 0x4206, 0x5620, 0x4224, 0x525c,
-	0x52ad, 0x53b0, 0x355c, 0x5412, 0x544e, 0x547f, 0x558b, 0x54ac,
-	0x550b, 0x355c, 0x4228, 0x43dd, 0x43f3, 0x4418, 0x447d, 0x44f1,
-	0x4511, 0x4588, 0x4599, 0x45b1, 0x45b4, 0x45d9, 0x4649, 0x46b3,
-	0x46bb, 0x47ed, 0x4962, 0x4996, 0x4bfa, 0x355c, 0x4c18, 0x4cc4,
-	0x4da6, 0x4e00, 0x355c, 0x4eb5, 0x355c, 0x4f1b, 0x4f36, 0x46bb,
-	0x517c, 0x714c, 0x0000, 0x2021, 0x4000, 0x080c, 0x4a14, 0x0126,
-	0x2091, 0x8000, 0x0e04, 0x353d, 0x0010, 0x012e, 0x0cc0, 0x7c36,
-	0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, 0x0010,
-	0x7c82, 0x7986, 0x7a8a, 0x7b8e, 0x2091, 0x4080, 0x2001, 0x0089,
-	0x2004, 0xd084, 0x190c, 0x11cd, 0x7007, 0x0001, 0x2091, 0x5000,
-	0x700f, 0x0000, 0x012e, 0x0005, 0x2021, 0x4001, 0x08b0, 0x2021,
-	0x4002, 0x0898, 0x2021, 0x4003, 0x0880, 0x2021, 0x4005, 0x0868,
-	0x2021, 0x4006, 0x0850, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88,
-	0x7a8c, 0x7884, 0x7990, 0x0804, 0x4a21, 0x7883, 0x0004, 0x7884,
-	0x0807, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884,
-	0x7990, 0x0804, 0x4a24, 0x7984, 0x7888, 0x2114, 0x200a, 0x0804,
-	0x3533, 0x7984, 0x2114, 0x0804, 0x3533, 0x20e1, 0x0000, 0x2099,
-	0x0021, 0x20e9, 0x0000, 0x20a1, 0x0021, 0x20a9, 0x001f, 0x4003,
-	0x7984, 0x7a88, 0x7b8c, 0x0804, 0x3533, 0x7884, 0x2060, 0x04d8,
-	0x2009, 0x0003, 0x2011, 0x0002, 0x2019, 0x0015, 0x789b, 0x0137,
-	0x0804, 0x3533, 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0800, 0x2039,
-	0x0001, 0x7d98, 0x7c9c, 0x0848, 0x79a0, 0x9182, 0x0040, 0x0210,
-	0x0804, 0x3568, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x356f, 0x79a0,
-	0x9182, 0x0040, 0x0210, 0x0804, 0x3568, 0x2138, 0x7d98, 0x7c9c,
-	0x0804, 0x357d, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3568,
-	0x21e8, 0x7984, 0x7888, 0x20a9, 0x0001, 0x21a0, 0x4004, 0x0804,
-	0x3533, 0x2061, 0x0800, 0xe10c, 0x9006, 0x2c15, 0x9200, 0x8c60,
-	0x8109, 0x1dd8, 0x2010, 0x9005, 0x0904, 0x3533, 0x0804, 0x3562,
-	0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3568, 0x21e0, 0x20a9,
-	0x0001, 0x7984, 0x2198, 0x4012, 0x0804, 0x3533, 0x2069, 0x1847,
-	0x7884, 0x7990, 0x911a, 0x1a04, 0x3568, 0x8019, 0x0904, 0x3568,
-	0x684a, 0x6942, 0x788c, 0x6852, 0x7888, 0x6856, 0x9006, 0x685a,
-	0x685e, 0x080c, 0x7719, 0x0804, 0x3533, 0x2069, 0x1847, 0x7884,
-	0x7994, 0x911a, 0x1a04, 0x3568, 0x8019, 0x0904, 0x3568, 0x684e,
-	0x6946, 0x788c, 0x6862, 0x7888, 0x6866, 0x9006, 0x686a, 0x686e,
-	0x0126, 0x2091, 0x8000, 0x080c, 0x69d4, 0x012e, 0x0804, 0x3533,
-	0x902e, 0x2520, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3565,
-	0x7984, 0x7b88, 0x7a8c, 0x20a9, 0x0005, 0x20e9, 0x0001, 0x20a1,
-	0x18a6, 0x4101, 0x080c, 0x49d8, 0x1120, 0x2009, 0x0002, 0x0804,
-	0x3565, 0x2009, 0x0020, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c,
-	0x4a21, 0x701f, 0x364c, 0x0005, 0xa864, 0x2008, 0x9084, 0x00ff,
-	0x9096, 0x0011, 0x0168, 0x9096, 0x0019, 0x0150, 0x9096, 0x0015,
-	0x0138, 0x9096, 0x0048, 0x0120, 0x9096, 0x0029, 0x1904, 0x3565,
-	0x810f, 0x918c, 0x00ff, 0x0904, 0x3565, 0x7112, 0x7010, 0x8001,
-	0x0560, 0x7012, 0x080c, 0x49d8, 0x1120, 0x2009, 0x0002, 0x0804,
-	0x3565, 0x2009, 0x0020, 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494,
-	0xa598, 0x9290, 0x0040, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9,
-	0x0000, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4a21, 0x701f,
-	0x368a, 0x0005, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0002, 0x0120,
-	0x9096, 0x000a, 0x1904, 0x3565, 0x0888, 0x7014, 0x2048, 0xa868,
-	0xc0fd, 0xa86a, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0029, 0x1160,
-	0xc2fd, 0xaa7a, 0x080c, 0x60ae, 0x0150, 0x0126, 0x2091, 0x8000,
-	0xa87a, 0xa982, 0x012e, 0x0050, 0x080c, 0x63c7, 0x1128, 0x7007,
-	0x0003, 0x701f, 0x36b6, 0x0005, 0x080c, 0x6ebf, 0x0126, 0x2091,
-	0x8000, 0x20a9, 0x0005, 0x20e1, 0x0001, 0x2099, 0x18a6, 0x400a,
-	0x2100, 0x9210, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000,
-	0xa85c, 0x9080, 0x0019, 0x2009, 0x0020, 0x012e, 0xaf60, 0x0804,
-	0x4a24, 0x2091, 0x8000, 0x7837, 0x4000, 0x7833, 0x0010, 0x7883,
-	0x4000, 0x7887, 0x4953, 0x788b, 0x5020, 0x788f, 0x2020, 0x2009,
-	0x017f, 0x2104, 0x7892, 0x3f00, 0x7896, 0x2061, 0x0100, 0x6200,
-	0x2061, 0x0200, 0x603c, 0x8007, 0x9205, 0x789a, 0x2009, 0x04fd,
-	0x2104, 0x789e, 0x2091, 0x5000, 0x2091, 0x4080, 0x2001, 0x0089,
-	0x2004, 0xd084, 0x0180, 0x2001, 0x1a20, 0x2004, 0x9005, 0x0128,
-	0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003,
-	0x0002, 0x2003, 0x1001, 0x2071, 0x0080, 0x0804, 0x0427, 0x81ff,
-	0x1904, 0x3565, 0x7984, 0x080c, 0x652d, 0x1904, 0x3568, 0x7e98,
-	0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x3568, 0x7c88, 0x7d8c,
-	0x080c, 0x675f, 0x080c, 0x66f0, 0x1518, 0x2061, 0x1ddc, 0x0126,
-	0x2091, 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d,
-	0x0130, 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0150, 0x012e,
-	0x9ce0, 0x001c, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1a04, 0x3565,
-	0x0c30, 0x080c, 0xc32e, 0x012e, 0x0904, 0x3565, 0x0804, 0x3533,
-	0x900e, 0x2001, 0x0005, 0x080c, 0x6ebf, 0x0126, 0x2091, 0x8000,
-	0x080c, 0xca20, 0x080c, 0x6c7f, 0x012e, 0x0804, 0x3533, 0x00a6,
-	0x2950, 0xb198, 0x080c, 0x652d, 0x1904, 0x37a1, 0xb6a4, 0x9684,
-	0x3fff, 0x9082, 0x4000, 0x16e8, 0xb49c, 0xb5a0, 0x080c, 0x675f,
-	0x080c, 0x670a, 0x1520, 0x2061, 0x1ddc, 0x0126, 0x2091, 0x8000,
-	0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, 0x0130, 0xa86c,
-	0x9406, 0x1118, 0xa870, 0x9506, 0x0158, 0x012e, 0x9ce0, 0x001c,
-	0x2001, 0x181a, 0x2004, 0x9c02, 0x2009, 0x000d, 0x12b0, 0x0c28,
-	0x080c, 0xc32e, 0x012e, 0x2009, 0x0003, 0x0178, 0x00e0, 0x900e,
-	0x2001, 0x0005, 0x080c, 0x6ebf, 0x0126, 0x2091, 0x8000, 0x080c,
-	0xca20, 0x080c, 0x6c73, 0x012e, 0x0070, 0xb097, 0x4005, 0xb19a,
-	0x0010, 0xb097, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030,
-	0x2a48, 0x00ae, 0x0005, 0xb097, 0x4000, 0x9006, 0x918d, 0x0001,
-	0x2008, 0x2a48, 0x00ae, 0x0005, 0x81ff, 0x1904, 0x3565, 0x080c,
-	0x49ef, 0x0904, 0x3568, 0x080c, 0x65f4, 0x0904, 0x3565, 0x080c,
-	0x6765, 0x0904, 0x3565, 0x0804, 0x4508, 0x81ff, 0x1904, 0x3565,
-	0x080c, 0x4a0b, 0x0904, 0x3568, 0x080c, 0x67f3, 0x0904, 0x3565,
-	0x2019, 0x0005, 0x79a8, 0x080c, 0x6780, 0x0904, 0x3565, 0x7888,
-	0x908a, 0x1000, 0x1a04, 0x3568, 0x8003, 0x800b, 0x810b, 0x9108,
-	0x080c, 0x8519, 0x7984, 0xd184, 0x1904, 0x3533, 0x0804, 0x4508,
-	0x0126, 0x2091, 0x8000, 0x81ff, 0x0118, 0x2009, 0x0001, 0x0450,
-	0x2029, 0x07ff, 0x645c, 0x2400, 0x9506, 0x01f8, 0x2508, 0x080c,
-	0x652d, 0x11d8, 0x080c, 0x67f3, 0x1128, 0x2009, 0x0002, 0x62c0,
-	0x2518, 0x00c0, 0x2019, 0x0004, 0x900e, 0x080c, 0x6780, 0x1118,
-	0x2009, 0x0006, 0x0078, 0x7884, 0x908a, 0x1000, 0x1270, 0x8003,
-	0x800b, 0x810b, 0x9108, 0x080c, 0x8519, 0x8529, 0x1ae0, 0x012e,
-	0x0804, 0x3533, 0x012e, 0x0804, 0x3565, 0x012e, 0x0804, 0x3568,
-	0x080c, 0x49ef, 0x0904, 0x3568, 0x080c, 0x65f4, 0x0904, 0x3565,
-	0x080c, 0xa781, 0xbaa0, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c,
-	0x926f, 0x0076, 0x903e, 0x080c, 0x9141, 0x900e, 0x080c, 0xdeb3,
-	0x007e, 0x00ce, 0x080c, 0xa79d, 0x080c, 0x675f, 0x0804, 0x3533,
-	0x080c, 0x49ef, 0x0904, 0x3568, 0x080c, 0x675f, 0x2208, 0x0804,
-	0x3533, 0x0156, 0x00d6, 0x00e6, 0x00c6, 0x2069, 0x1910, 0x6810,
-	0x6914, 0x910a, 0x1208, 0x900e, 0x6816, 0x9016, 0x901e, 0x2071,
-	0x19e5, 0x7028, 0x9065, 0x0118, 0x8210, 0x600c, 0x0cd8, 0x2300,
-	0x9218, 0x00ce, 0x00ee, 0x00de, 0x015e, 0x0804, 0x3533, 0x00f6,
-	0x0016, 0x907d, 0x0138, 0x9006, 0x8000, 0x2f0c, 0x81ff, 0x0110,
-	0x2178, 0x0cd0, 0x001e, 0x00fe, 0x0005, 0x2069, 0x1910, 0x6910,
-	0x62bc, 0x0804, 0x3533, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804,
-	0x3565, 0x0126, 0x2091, 0x8000, 0x080c, 0x5610, 0x0128, 0x2009,
-	0x0007, 0x012e, 0x0804, 0x3565, 0x012e, 0x615c, 0x9190, 0x3334,
-	0x2215, 0x9294, 0x00ff, 0x637c, 0x83ff, 0x0108, 0x6280, 0x67dc,
-	0x97c4, 0x000a, 0x98c6, 0x000a, 0x1118, 0x2031, 0x0001, 0x00e8,
-	0x97c4, 0x0022, 0x98c6, 0x0022, 0x1118, 0x2031, 0x0003, 0x00a8,
-	0x97c4, 0x0012, 0x98c6, 0x0012, 0x1118, 0x2031, 0x0002, 0x0068,
-	0x080c, 0x73e4, 0x1118, 0x2031, 0x0004, 0x0038, 0xd79c, 0x0120,
-	0x2009, 0x0005, 0x0804, 0x3565, 0x9036, 0x7e9a, 0x7f9e, 0x0804,
-	0x3533, 0x614c, 0x6250, 0x2019, 0x1984, 0x231c, 0x2001, 0x1985,
-	0x2004, 0x789a, 0x0804, 0x3533, 0x0126, 0x2091, 0x8000, 0x6138,
-	0x623c, 0x6340, 0x012e, 0x0804, 0x3533, 0x080c, 0x4a0b, 0x0904,
-	0x3568, 0xba44, 0xbb38, 0x0804, 0x3533, 0x080c, 0x0d7d, 0x080c,
-	0x4a0b, 0x2110, 0x0904, 0x3568, 0xb804, 0x908c, 0x00ff, 0x918e,
-	0x0006, 0x0140, 0x9084, 0xff00, 0x9086, 0x0600, 0x2009, 0x0009,
-	0x1904, 0x3565, 0x0126, 0x2091, 0x8000, 0x2019, 0x0005, 0x00c6,
-	0x9066, 0x080c, 0xa781, 0x080c, 0xa275, 0x080c, 0x926f, 0x0076,
-	0x903e, 0x080c, 0x9141, 0x900e, 0x080c, 0xdeb3, 0x007e, 0x00ce,
-	0x080c, 0xa79d, 0xb807, 0x0407, 0x012e, 0x0804, 0x3533, 0x614c,
-	0x6250, 0x7884, 0x604e, 0x7b88, 0x6352, 0x2069, 0x1847, 0x831f,
-	0x9305, 0x6816, 0x788c, 0x2069, 0x1984, 0x2d1c, 0x206a, 0x7e98,
-	0x9682, 0x0014, 0x1210, 0x2031, 0x07d0, 0x2069, 0x1985, 0x2d04,
-	0x266a, 0x789a, 0x0804, 0x3533, 0x0126, 0x2091, 0x8000, 0x6138,
-	0x7884, 0x603a, 0x910e, 0xd1b4, 0x190c, 0x0ecc, 0xd0c4, 0x01a8,
-	0x00d6, 0x78a8, 0x2009, 0x199b, 0x200a, 0x78ac, 0x2011, 0x199c,
-	0x2012, 0x2069, 0x0100, 0x6838, 0x9086, 0x0007, 0x1118, 0x2214,
-	0x6a5a, 0x0010, 0x210c, 0x695a, 0x00de, 0x7888, 0x603e, 0x2011,
-	0x0116, 0x220c, 0x7888, 0xd08c, 0x0118, 0x918d, 0x0040, 0x0010,
-	0x918c, 0xff7f, 0x2112, 0x6140, 0x788c, 0x6042, 0x910e, 0xd1e4,
-	0x190c, 0x0ee7, 0x9084, 0x0020, 0x0130, 0x78b4, 0x6046, 0x9084,
-	0x0001, 0x090c, 0x4206, 0x6040, 0xd0cc, 0x0120, 0x78b0, 0x2011,
-	0x0114, 0x2012, 0x012e, 0x0804, 0x3533, 0x00f6, 0x2079, 0x1800,
-	0x7a38, 0xa898, 0x9084, 0xfebf, 0x9215, 0xa89c, 0x9084, 0xfebf,
-	0x8002, 0x9214, 0x7838, 0x9084, 0x0140, 0x9215, 0x7a3a, 0xa897,
-	0x4000, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x00fe, 0x0005,
-	0x7898, 0x9005, 0x01a8, 0x7888, 0x9025, 0x0904, 0x3568, 0x788c,
-	0x902d, 0x0904, 0x3568, 0x900e, 0x080c, 0x652d, 0x1120, 0xba44,
-	0xbb38, 0xbc46, 0xbd3a, 0x9186, 0x07ff, 0x0190, 0x8108, 0x0ca0,
-	0x080c, 0x4a0b, 0x0904, 0x3568, 0x7888, 0x900d, 0x0904, 0x3568,
-	0x788c, 0x9005, 0x0904, 0x3568, 0xba44, 0xb946, 0xbb38, 0xb83a,
-	0x0804, 0x3533, 0x2011, 0xbc09, 0x0010, 0x2011, 0xbc05, 0x080c,
-	0x5610, 0x1904, 0x3565, 0x00c6, 0x2061, 0x0100, 0x7984, 0x9186,
-	0x00ff, 0x1130, 0x2001, 0x1818, 0x2004, 0x9085, 0xff00, 0x0088,
-	0x9182, 0x007f, 0x16e0, 0x9188, 0x3334, 0x210d, 0x918c, 0x00ff,
-	0x2001, 0x1818, 0x2004, 0x0026, 0x9116, 0x002e, 0x0580, 0x810f,
-	0x9105, 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0xaa82, 0x000e,
-	0x0510, 0x602e, 0x620a, 0x7984, 0x00b6, 0x080c, 0x64d2, 0x2b08,
-	0x00be, 0x1500, 0x6112, 0x6023, 0x0001, 0x080c, 0x49d8, 0x01d0,
-	0x9006, 0xa866, 0x7007, 0x0003, 0xa832, 0xa868, 0xc0fd, 0xa86a,
-	0x701f, 0x3a15, 0x2900, 0x6016, 0x2009, 0x0032, 0x080c, 0xab77,
-	0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x3565, 0x00ce,
-	0x0804, 0x3568, 0x080c, 0xaad8, 0x0cb0, 0xa830, 0x9086, 0x0100,
-	0x0904, 0x3565, 0x0804, 0x3533, 0x2061, 0x1a6d, 0x0126, 0x2091,
-	0x8000, 0x6000, 0xd084, 0x0170, 0x6104, 0x6208, 0x2061, 0x1800,
-	0x6354, 0x6074, 0x789a, 0x60c0, 0x789e, 0x60bc, 0x78aa, 0x012e,
-	0x0804, 0x3533, 0x900e, 0x2110, 0x0c88, 0x81ff, 0x1904, 0x3565,
-	0x080c, 0x73e4, 0x0904, 0x3565, 0x0126, 0x2091, 0x8000, 0x6254,
-	0x6074, 0x9202, 0x0248, 0x9085, 0x0001, 0x080c, 0x2638, 0x080c,
-	0x5820, 0x012e, 0x0804, 0x3533, 0x012e, 0x0804, 0x3568, 0x0006,
-	0x0016, 0x00c6, 0x00e6, 0x2001, 0x19a7, 0x2070, 0x2061, 0x1847,
-	0x6008, 0x2072, 0x900e, 0x2011, 0x1400, 0x080c, 0x9030, 0x7206,
-	0x00ee, 0x00ce, 0x001e, 0x000e, 0x0005, 0x0126, 0x2091, 0x8000,
-	0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x3535, 0x7884,
-	0xd0fc, 0x0148, 0x2001, 0x002a, 0x2004, 0x9082, 0x00e1, 0x0288,
-	0x012e, 0x0804, 0x3568, 0x2001, 0x002a, 0x2004, 0x2069, 0x1847,
-	0x6908, 0x9102, 0x1230, 0x012e, 0x0804, 0x3568, 0x012e, 0x0804,
-	0x3565, 0x080c, 0xaa42, 0x0dd0, 0x7884, 0xd0fc, 0x0904, 0x3ae0,
-	0x00c6, 0x080c, 0x49d8, 0x00ce, 0x0d88, 0xa867, 0x0000, 0x7884,
-	0xa80a, 0x7898, 0xa80e, 0x789c, 0xa812, 0x2001, 0x002e, 0x2004,
-	0xa81a, 0x2001, 0x002f, 0x2004, 0xa81e, 0x2001, 0x0030, 0x2004,
-	0xa822, 0x2001, 0x0031, 0x2004, 0xa826, 0x2001, 0x0034, 0x2004,
-	0xa82a, 0x2001, 0x0035, 0x2004, 0xa82e, 0x2001, 0x002a, 0x2004,
-	0x9080, 0x0003, 0x9084, 0x00fc, 0x8004, 0xa816, 0x080c, 0x3c6a,
-	0x0928, 0x7014, 0x2048, 0xad2c, 0xac28, 0xab1c, 0xaa18, 0xa930,
+	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x2071, 0x189e, 0x7003,
+	0x0002, 0x9006, 0x7016, 0x701a, 0x704a, 0x704e, 0x700e, 0x7042,
+	0x7046, 0x703b, 0x18ba, 0x703f, 0x18ba, 0x7007, 0x0001, 0x080c,
+	0x1053, 0x090c, 0x0d7d, 0x2900, 0x706a, 0xa867, 0x0002, 0xa8ab,
+	0xdcb0, 0x080c, 0x1053, 0x090c, 0x0d7d, 0x2900, 0x706e, 0xa867,
+	0x0002, 0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x189e, 0x7004, 0x0002,
+	0x349c, 0x349d, 0x34b0, 0x34c4, 0x0005, 0x1004, 0x34ad, 0x0e04,
+	0x34ad, 0x2079, 0x0000, 0x0126, 0x2091, 0x8000, 0x700c, 0x9005,
+	0x1128, 0x700f, 0x0001, 0x012e, 0x0468, 0x0005, 0x012e, 0x0ce8,
+	0x2079, 0x0000, 0x2061, 0x18b8, 0x2c4c, 0xa86c, 0x908e, 0x0100,
+	0x0128, 0x9086, 0x0200, 0x0904, 0x3598, 0x0005, 0x7018, 0x2048,
+	0x2061, 0x1800, 0x701c, 0x0807, 0x7014, 0x2048, 0xa864, 0x9094,
+	0x00ff, 0x9296, 0x0029, 0x1120, 0xaa78, 0xd2fc, 0x0128, 0x0005,
+	0x9086, 0x0103, 0x0108, 0x0005, 0x2079, 0x0000, 0x2061, 0x1800,
+	0x701c, 0x0807, 0x2061, 0x1800, 0x7880, 0x908a, 0x0040, 0x1210,
+	0x61d0, 0x0042, 0x2100, 0x908a, 0x003f, 0x1a04, 0x3595, 0x61d0,
+	0x0804, 0x352a, 0x356c, 0x35a4, 0x35ae, 0x35b2, 0x35bc, 0x35c2,
+	0x35c6, 0x35d6, 0x35d9, 0x35e3, 0x35e8, 0x35ed, 0x35f8, 0x3603,
+	0x3612, 0x3621, 0x362f, 0x3646, 0x3661, 0x3595, 0x370a, 0x3748,
+	0x37ed, 0x37fe, 0x3821, 0x3595, 0x3595, 0x3595, 0x3859, 0x3879,
+	0x3882, 0x38ae, 0x38b4, 0x3595, 0x38fa, 0x3595, 0x3595, 0x3595,
+	0x3595, 0x3595, 0x3905, 0x390e, 0x3916, 0x3918, 0x3595, 0x3595,
+	0x3595, 0x3595, 0x3595, 0x3595, 0x3948, 0x3595, 0x3595, 0x3595,
+	0x3595, 0x3595, 0x3965, 0x39c9, 0x3595, 0x3595, 0x3595, 0x3595,
+	0x3595, 0x3595, 0x0002, 0x39f3, 0x39f6, 0x3a55, 0x3a6e, 0x3a9e,
+	0x3d40, 0x3595, 0x52a4, 0x3595, 0x3595, 0x3595, 0x3595, 0x3595,
+	0x3595, 0x3595, 0x3595, 0x35e3, 0x35e8, 0x423f, 0x56f7, 0x425d,
+	0x5333, 0x5384, 0x5487, 0x3595, 0x54e9, 0x5525, 0x5556, 0x5662,
+	0x5583, 0x55e2, 0x3595, 0x4261, 0x4416, 0x442c, 0x4451, 0x44b6,
+	0x452a, 0x454a, 0x45c1, 0x461d, 0x4679, 0x467c, 0x46a1, 0x4711,
+	0x477b, 0x4783, 0x48b5, 0x4a2a, 0x4a5e, 0x4cc2, 0x3595, 0x4ce0,
+	0x4d8c, 0x4e6e, 0x4ec8, 0x3595, 0x4f7d, 0x3595, 0x4fe3, 0x4ffe,
+	0x4783, 0x5244, 0x714c, 0x0000, 0x2021, 0x4000, 0x080c, 0x4adc,
+	0x0126, 0x2091, 0x8000, 0x0e04, 0x3576, 0x0010, 0x012e, 0x0cc0,
+	0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833,
+	0x0010, 0x7c82, 0x7986, 0x7a8a, 0x7b8e, 0x2091, 0x4080, 0x2001,
+	0x0089, 0x2004, 0xd084, 0x190c, 0x11d6, 0x7007, 0x0001, 0x2091,
+	0x5000, 0x700f, 0x0000, 0x012e, 0x0005, 0x2021, 0x4001, 0x08b0,
+	0x2021, 0x4002, 0x0898, 0x2021, 0x4003, 0x0880, 0x2021, 0x4005,
+	0x0868, 0x2021, 0x4006, 0x0850, 0x2039, 0x0001, 0x902e, 0x2520,
+	0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804, 0x4ae9, 0x7883, 0x0004,
+	0x7884, 0x0807, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c,
+	0x7884, 0x7990, 0x0804, 0x4aec, 0x7984, 0x7888, 0x2114, 0x200a,
+	0x0804, 0x356c, 0x7984, 0x2114, 0x0804, 0x356c, 0x20e1, 0x0000,
+	0x2099, 0x0021, 0x20e9, 0x0000, 0x20a1, 0x0021, 0x20a9, 0x001f,
+	0x4003, 0x7984, 0x7a88, 0x7b8c, 0x0804, 0x356c, 0x7884, 0x2060,
+	0x04d8, 0x2009, 0x0003, 0x2011, 0x0002, 0x2019, 0x001a, 0x789b,
+	0x0137, 0x0804, 0x356c, 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0800,
+	0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0848, 0x79a0, 0x9182, 0x0040,
+	0x0210, 0x0804, 0x35a1, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x35a8,
+	0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x35a1, 0x2138, 0x7d98,
+	0x7c9c, 0x0804, 0x35b6, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804,
+	0x35a1, 0x21e8, 0x7984, 0x7888, 0x20a9, 0x0001, 0x21a0, 0x4004,
+	0x0804, 0x356c, 0x2061, 0x0800, 0xe10c, 0x9006, 0x2c15, 0x9200,
+	0x8c60, 0x8109, 0x1dd8, 0x2010, 0x9005, 0x0904, 0x356c, 0x0804,
+	0x359b, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x35a1, 0x21e0,
+	0x20a9, 0x0001, 0x7984, 0x2198, 0x4012, 0x0804, 0x356c, 0x2069,
+	0x1847, 0x7884, 0x7990, 0x911a, 0x1a04, 0x35a1, 0x8019, 0x0904,
+	0x35a1, 0x684a, 0x6942, 0x788c, 0x6852, 0x7888, 0x6856, 0x9006,
+	0x685a, 0x685e, 0x080c, 0x780a, 0x0804, 0x356c, 0x2069, 0x1847,
+	0x7884, 0x7994, 0x911a, 0x1a04, 0x35a1, 0x8019, 0x0904, 0x35a1,
+	0x684e, 0x6946, 0x788c, 0x6862, 0x7888, 0x6866, 0x9006, 0x686a,
+	0x686e, 0x0126, 0x2091, 0x8000, 0x080c, 0x6ac5, 0x012e, 0x0804,
+	0x356c, 0x902e, 0x2520, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804,
+	0x359e, 0x7984, 0x7b88, 0x7a8c, 0x20a9, 0x0005, 0x20e9, 0x0001,
+	0x20a1, 0x18a6, 0x4101, 0x080c, 0x4aa0, 0x1120, 0x2009, 0x0002,
+	0x0804, 0x359e, 0x2009, 0x0020, 0xa85c, 0x9080, 0x0019, 0xaf60,
+	0x080c, 0x4ae9, 0x701f, 0x3685, 0x0005, 0xa864, 0x2008, 0x9084,
+	0x00ff, 0x9096, 0x0011, 0x0168, 0x9096, 0x0019, 0x0150, 0x9096,
+	0x0015, 0x0138, 0x9096, 0x0048, 0x0120, 0x9096, 0x0029, 0x1904,
+	0x359e, 0x810f, 0x918c, 0x00ff, 0x0904, 0x359e, 0x7112, 0x7010,
+	0x8001, 0x0560, 0x7012, 0x080c, 0x4aa0, 0x1120, 0x2009, 0x0002,
+	0x0804, 0x359e, 0x2009, 0x0020, 0x7068, 0x2040, 0xa28c, 0xa390,
+	0xa494, 0xa598, 0x9290, 0x0040, 0x9399, 0x0000, 0x94a1, 0x0000,
+	0x95a9, 0x0000, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4ae9,
+	0x701f, 0x36c3, 0x0005, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0002,
+	0x0120, 0x9096, 0x000a, 0x1904, 0x359e, 0x0888, 0x7014, 0x2048,
+	0xa868, 0xc0fd, 0xa86a, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0029,
+	0x1160, 0xc2fd, 0xaa7a, 0x080c, 0x618f, 0x0150, 0x0126, 0x2091,
+	0x8000, 0xa87a, 0xa982, 0x012e, 0x0050, 0x080c, 0x64b8, 0x1128,
+	0x7007, 0x0003, 0x701f, 0x36ef, 0x0005, 0x080c, 0x6fb0, 0x0126,
+	0x2091, 0x8000, 0x20a9, 0x0005, 0x20e1, 0x0001, 0x2099, 0x18a6,
+	0x400a, 0x2100, 0x9210, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9,
+	0x0000, 0xa85c, 0x9080, 0x0019, 0x2009, 0x0020, 0x012e, 0xaf60,
+	0x0804, 0x4aec, 0x2091, 0x8000, 0x7837, 0x4000, 0x7833, 0x0010,
+	0x7883, 0x4000, 0x7887, 0x4953, 0x788b, 0x5020, 0x788f, 0x2020,
+	0x2009, 0x017f, 0x2104, 0x7892, 0x3f00, 0x7896, 0x2061, 0x0100,
+	0x6200, 0x2061, 0x0200, 0x603c, 0x8007, 0x9205, 0x789a, 0x2009,
+	0x04fd, 0x2104, 0x789e, 0x2091, 0x5000, 0x2091, 0x4080, 0x2001,
+	0x0089, 0x2004, 0xd084, 0x0180, 0x2001, 0x1a22, 0x2004, 0x9005,
+	0x0128, 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a,
+	0x2003, 0x0002, 0x2003, 0x1001, 0x2071, 0x0080, 0x0804, 0x0427,
+	0x81ff, 0x1904, 0x359e, 0x7984, 0x080c, 0x661e, 0x1904, 0x35a1,
+	0x7e98, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x35a1, 0x7c88,
+	0x7d8c, 0x080c, 0x6850, 0x080c, 0x67e1, 0x1518, 0x2061, 0x1ddc,
+	0x0126, 0x2091, 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014,
+	0x904d, 0x0130, 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0150,
+	0x012e, 0x9ce0, 0x001c, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1a04,
+	0x359e, 0x0c30, 0x080c, 0xc41f, 0x012e, 0x0904, 0x359e, 0x0804,
+	0x356c, 0x900e, 0x2001, 0x0005, 0x080c, 0x6fb0, 0x0126, 0x2091,
+	0x8000, 0x080c, 0xcb18, 0x080c, 0x6d70, 0x012e, 0x0804, 0x356c,
+	0x00a6, 0x2950, 0xb198, 0x080c, 0x661e, 0x1904, 0x37da, 0xb6a4,
+	0x9684, 0x3fff, 0x9082, 0x4000, 0x16e8, 0xb49c, 0xb5a0, 0x080c,
+	0x6850, 0x080c, 0x67fb, 0x1520, 0x2061, 0x1ddc, 0x0126, 0x2091,
+	0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, 0x0130,
+	0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0158, 0x012e, 0x9ce0,
+	0x001c, 0x2001, 0x181a, 0x2004, 0x9c02, 0x2009, 0x000d, 0x12b0,
+	0x0c28, 0x080c, 0xc41f, 0x012e, 0x2009, 0x0003, 0x0178, 0x00e0,
+	0x900e, 0x2001, 0x0005, 0x080c, 0x6fb0, 0x0126, 0x2091, 0x8000,
+	0x080c, 0xcb18, 0x080c, 0x6d64, 0x012e, 0x0070, 0xb097, 0x4005,
+	0xb19a, 0x0010, 0xb097, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001,
+	0x0030, 0x2a48, 0x00ae, 0x0005, 0xb097, 0x4000, 0x9006, 0x918d,
+	0x0001, 0x2008, 0x2a48, 0x00ae, 0x0005, 0x81ff, 0x1904, 0x359e,
+	0x080c, 0x4ab7, 0x0904, 0x35a1, 0x080c, 0x66e5, 0x0904, 0x359e,
+	0x080c, 0x6856, 0x0904, 0x359e, 0x0804, 0x4541, 0x81ff, 0x1904,
+	0x359e, 0x080c, 0x4ad3, 0x0904, 0x35a1, 0x080c, 0x68e4, 0x0904,
+	0x359e, 0x2019, 0x0005, 0x79a8, 0x080c, 0x6871, 0x0904, 0x359e,
+	0x7888, 0x908a, 0x1000, 0x1a04, 0x35a1, 0x8003, 0x800b, 0x810b,
+	0x9108, 0x080c, 0x861b, 0x7984, 0xd184, 0x1904, 0x356c, 0x0804,
+	0x4541, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0118, 0x2009, 0x0001,
+	0x0450, 0x2029, 0x07ff, 0x645c, 0x2400, 0x9506, 0x01f8, 0x2508,
+	0x080c, 0x661e, 0x11d8, 0x080c, 0x68e4, 0x1128, 0x2009, 0x0002,
+	0x62c0, 0x2518, 0x00c0, 0x2019, 0x0004, 0x900e, 0x080c, 0x6871,
+	0x1118, 0x2009, 0x0006, 0x0078, 0x7884, 0x908a, 0x1000, 0x1270,
+	0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x861b, 0x8529, 0x1ae0,
+	0x012e, 0x0804, 0x356c, 0x012e, 0x0804, 0x359e, 0x012e, 0x0804,
+	0x35a1, 0x080c, 0x4ab7, 0x0904, 0x35a1, 0x080c, 0x66e5, 0x0904,
+	0x359e, 0x080c, 0xa872, 0xbaa0, 0x2019, 0x0005, 0x00c6, 0x9066,
+	0x080c, 0x9374, 0x0076, 0x903e, 0x080c, 0x9246, 0x900e, 0x080c,
+	0xdfc0, 0x007e, 0x00ce, 0x080c, 0xa88e, 0x080c, 0x6850, 0x0804,
+	0x356c, 0x080c, 0x4ab7, 0x0904, 0x35a1, 0x080c, 0x6850, 0x2208,
+	0x0804, 0x356c, 0x0156, 0x00d6, 0x00e6, 0x00c6, 0x2069, 0x1910,
+	0x6810, 0x6914, 0x910a, 0x1208, 0x900e, 0x6816, 0x9016, 0x901e,
+	0x2071, 0x19e7, 0x7028, 0x9065, 0x0118, 0x8210, 0x600c, 0x0cd8,
+	0x2300, 0x9218, 0x00ce, 0x00ee, 0x00de, 0x015e, 0x0804, 0x356c,
+	0x00f6, 0x0016, 0x907d, 0x0138, 0x9006, 0x8000, 0x2f0c, 0x81ff,
+	0x0110, 0x2178, 0x0cd0, 0x001e, 0x00fe, 0x0005, 0x2069, 0x1910,
+	0x6910, 0x62bc, 0x0804, 0x356c, 0x81ff, 0x0120, 0x2009, 0x0001,
+	0x0804, 0x359e, 0x0126, 0x2091, 0x8000, 0x080c, 0x56e7, 0x0128,
+	0x2009, 0x0007, 0x012e, 0x0804, 0x359e, 0x012e, 0x615c, 0x9190,
+	0x336d, 0x2215, 0x9294, 0x00ff, 0x637c, 0x83ff, 0x0108, 0x6280,
+	0x67dc, 0x97c4, 0x000a, 0x98c6, 0x000a, 0x1118, 0x2031, 0x0001,
+	0x00e8, 0x97c4, 0x0022, 0x98c6, 0x0022, 0x1118, 0x2031, 0x0003,
+	0x00a8, 0x97c4, 0x0012, 0x98c6, 0x0012, 0x1118, 0x2031, 0x0002,
+	0x0068, 0x080c, 0x74d5, 0x1118, 0x2031, 0x0004, 0x0038, 0xd79c,
+	0x0120, 0x2009, 0x0005, 0x0804, 0x359e, 0x9036, 0x7e9a, 0x7f9e,
+	0x0804, 0x356c, 0x614c, 0x6250, 0x2019, 0x1986, 0x231c, 0x2001,
+	0x1987, 0x2004, 0x789a, 0x0804, 0x356c, 0x0126, 0x2091, 0x8000,
+	0x6138, 0x623c, 0x6340, 0x012e, 0x0804, 0x356c, 0x080c, 0x4ad3,
+	0x0904, 0x35a1, 0xba44, 0xbb38, 0x0804, 0x356c, 0x080c, 0x0d7d,
+	0x080c, 0x4ad3, 0x2110, 0x0904, 0x35a1, 0xb804, 0x908c, 0x00ff,
+	0x918e, 0x0006, 0x0140, 0x9084, 0xff00, 0x9086, 0x0600, 0x2009,
+	0x0009, 0x1904, 0x359e, 0x0126, 0x2091, 0x8000, 0x2019, 0x0005,
+	0x00c6, 0x9066, 0x080c, 0xa872, 0x080c, 0xa366, 0x080c, 0x9374,
+	0x0076, 0x903e, 0x080c, 0x9246, 0x900e, 0x080c, 0xdfc0, 0x007e,
+	0x00ce, 0x080c, 0xa88e, 0xb807, 0x0407, 0x012e, 0x0804, 0x356c,
+	0x614c, 0x6250, 0x7884, 0x604e, 0x7b88, 0x6352, 0x2069, 0x1847,
+	0x831f, 0x9305, 0x6816, 0x788c, 0x2069, 0x1986, 0x2d1c, 0x206a,
+	0x7e98, 0x9682, 0x0014, 0x1210, 0x2031, 0x07d0, 0x2069, 0x1987,
+	0x2d04, 0x266a, 0x789a, 0x0804, 0x356c, 0x0126, 0x2091, 0x8000,
+	0x6138, 0x7884, 0x603a, 0x910e, 0xd1b4, 0x190c, 0x0ecc, 0xd0c4,
+	0x01a8, 0x00d6, 0x78a8, 0x2009, 0x199d, 0x200a, 0x78ac, 0x2011,
+	0x199e, 0x2012, 0x2069, 0x0100, 0x6838, 0x9086, 0x0007, 0x1118,
+	0x2214, 0x6a5a, 0x0010, 0x210c, 0x695a, 0x00de, 0x7888, 0x603e,
+	0x2011, 0x0116, 0x220c, 0x7888, 0xd08c, 0x0118, 0x918d, 0x0040,
+	0x0010, 0x918c, 0xff7f, 0x2112, 0x6140, 0x788c, 0x6042, 0x910e,
+	0xd1e4, 0x190c, 0x0ee7, 0x9084, 0x0020, 0x0130, 0x78b4, 0x6046,
+	0x9084, 0x0001, 0x090c, 0x423f, 0x6040, 0xd0cc, 0x0120, 0x78b0,
+	0x2011, 0x0114, 0x2012, 0x012e, 0x0804, 0x356c, 0x00f6, 0x2079,
+	0x1800, 0x7a38, 0xa898, 0x9084, 0xfebf, 0x9215, 0xa89c, 0x9084,
+	0xfebf, 0x8002, 0x9214, 0x7838, 0x9084, 0x0140, 0x9215, 0x7a3a,
+	0xa897, 0x4000, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x00fe,
+	0x0005, 0x7898, 0x9005, 0x01a8, 0x7888, 0x9025, 0x0904, 0x35a1,
+	0x788c, 0x902d, 0x0904, 0x35a1, 0x900e, 0x080c, 0x661e, 0x1120,
+	0xba44, 0xbb38, 0xbc46, 0xbd3a, 0x9186, 0x07ff, 0x0190, 0x8108,
+	0x0ca0, 0x080c, 0x4ad3, 0x0904, 0x35a1, 0x7888, 0x900d, 0x0904,
+	0x35a1, 0x788c, 0x9005, 0x0904, 0x35a1, 0xba44, 0xb946, 0xbb38,
+	0xb83a, 0x0804, 0x356c, 0x2011, 0xbc09, 0x0010, 0x2011, 0xbc05,
+	0x080c, 0x56e7, 0x1904, 0x359e, 0x00c6, 0x2061, 0x0100, 0x7984,
+	0x9186, 0x00ff, 0x1130, 0x2001, 0x1818, 0x2004, 0x9085, 0xff00,
+	0x0088, 0x9182, 0x007f, 0x16e0, 0x9188, 0x336d, 0x210d, 0x918c,
+	0x00ff, 0x2001, 0x1818, 0x2004, 0x0026, 0x9116, 0x002e, 0x0580,
+	0x810f, 0x9105, 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0xab73,
+	0x000e, 0x0510, 0x602e, 0x620a, 0x7984, 0x00b6, 0x080c, 0x65c3,
+	0x2b08, 0x00be, 0x1500, 0x6112, 0x6023, 0x0001, 0x080c, 0x4aa0,
+	0x01d0, 0x9006, 0xa866, 0x7007, 0x0003, 0xa832, 0xa868, 0xc0fd,
+	0xa86a, 0x701f, 0x3a4e, 0x2900, 0x6016, 0x2009, 0x0032, 0x080c,
+	0xac68, 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x359e,
+	0x00ce, 0x0804, 0x35a1, 0x080c, 0xabc9, 0x0cb0, 0xa830, 0x9086,
+	0x0100, 0x0904, 0x359e, 0x0804, 0x356c, 0x2061, 0x1a6f, 0x0126,
+	0x2091, 0x8000, 0x6000, 0xd084, 0x0170, 0x6104, 0x6208, 0x2061,
+	0x1800, 0x6354, 0x6074, 0x789a, 0x60c0, 0x789e, 0x60bc, 0x78aa,
+	0x012e, 0x0804, 0x356c, 0x900e, 0x2110, 0x0c88, 0x81ff, 0x1904,
+	0x359e, 0x080c, 0x74d5, 0x0904, 0x359e, 0x0126, 0x2091, 0x8000,
+	0x6254, 0x6074, 0x9202, 0x0248, 0x9085, 0x0001, 0x080c, 0x2664,
+	0x080c, 0x5901, 0x012e, 0x0804, 0x356c, 0x012e, 0x0804, 0x35a1,
+	0x0006, 0x0016, 0x00c6, 0x00e6, 0x2001, 0x19a9, 0x2070, 0x2061,
+	0x1847, 0x6008, 0x2072, 0x900e, 0x2011, 0x1400, 0x080c, 0x9135,
+	0x7206, 0x00ee, 0x00ce, 0x001e, 0x000e, 0x0005, 0x0126, 0x2091,
+	0x8000, 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x356e,
+	0x7884, 0xd0fc, 0x0148, 0x2001, 0x002a, 0x2004, 0x9082, 0x00e1,
+	0x0288, 0x012e, 0x0804, 0x35a1, 0x2001, 0x002a, 0x2004, 0x2069,
+	0x1847, 0x6908, 0x9102, 0x1230, 0x012e, 0x0804, 0x35a1, 0x012e,
+	0x0804, 0x359e, 0x080c, 0xab33, 0x0dd0, 0x7884, 0xd0fc, 0x0904,
+	0x3b19, 0x00c6, 0x080c, 0x4aa0, 0x00ce, 0x0d88, 0xa867, 0x0000,
+	0x7884, 0xa80a, 0x7898, 0xa80e, 0x789c, 0xa812, 0x2001, 0x002e,
+	0x2004, 0xa81a, 0x2001, 0x002f, 0x2004, 0xa81e, 0x2001, 0x0030,
+	0x2004, 0xa822, 0x2001, 0x0031, 0x2004, 0xa826, 0x2001, 0x0034,
+	0x2004, 0xa82a, 0x2001, 0x0035, 0x2004, 0xa82e, 0x2001, 0x002a,
+	0x2004, 0x9080, 0x0003, 0x9084, 0x00fc, 0x8004, 0xa816, 0x080c,
+	0x3ca3, 0x0928, 0x7014, 0x2048, 0xad2c, 0xac28, 0xab1c, 0xaa18,
+	0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, 0x0000,
+	0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080,
+	0x001b, 0x080c, 0x4ae9, 0x701f, 0x3be0, 0x7023, 0x0001, 0x012e,
+	0x0005, 0x080c, 0xa872, 0x0046, 0x0086, 0x0096, 0x00a6, 0x00b6,
+	0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3a88, 0x2001, 0x199f,
+	0x2003, 0x0000, 0x2021, 0x000a, 0x2061, 0x0100, 0x6104, 0x0016,
+	0x60bb, 0x0000, 0x60bf, 0x32e1, 0x60bf, 0x0012, 0x080c, 0x3d12,
+	0x080c, 0x3cd1, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x19e7,
+	0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0140,
+	0x2001, 0x0035, 0x2004, 0x780e, 0x2001, 0x0034, 0x2004, 0x780a,
+	0x00de, 0x2011, 0x0001, 0x080c, 0x4083, 0x008e, 0x00ee, 0x00fe,
+	0x080c, 0x3fb0, 0x080c, 0x3edd, 0x05b8, 0x2001, 0x020b, 0x2004,
+	0x9084, 0x0140, 0x1db8, 0x080c, 0x40f7, 0x00f6, 0x2079, 0x0300,
+	0x78bc, 0x00fe, 0x908c, 0x0070, 0x1560, 0x2071, 0x0200, 0x7037,
+	0x0000, 0x7050, 0x9084, 0xff00, 0x9086, 0x3200, 0x1510, 0x7037,
+	0x0001, 0x7050, 0x9084, 0xff00, 0x9086, 0xe100, 0x11d0, 0x7037,
+	0x0000, 0x7054, 0x7037, 0x0000, 0x715c, 0x9106, 0x1190, 0x2001,
+	0x1820, 0x2004, 0x9106, 0x1168, 0x00c6, 0x2061, 0x0100, 0x6024,
+	0x9084, 0x1e00, 0x00ce, 0x0138, 0x080c, 0x3ee7, 0x080c, 0x3ccc,
+	0x0058, 0x080c, 0x3ccc, 0x080c, 0x401b, 0x080c, 0x3fa6, 0x2001,
+	0x020b, 0x2004, 0xd0e4, 0x0dd8, 0x2001, 0x032a, 0x2003, 0x0004,
+	0x2061, 0x0100, 0x6027, 0x0002, 0x001e, 0x6106, 0x2011, 0x020d,
+	0x2013, 0x0020, 0x60bb, 0x0000, 0x60bf, 0x0108, 0x60bf, 0x0012,
+	0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, 0x1328,
+	0x2009, 0x0028, 0x080c, 0x21b0, 0x2001, 0x0227, 0x200c, 0x2102,
+	0x080c, 0xa88e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae,
+	0x009e, 0x008e, 0x004e, 0x2001, 0x199f, 0x2004, 0x9005, 0x1118,
+	0x012e, 0x0804, 0x356c, 0x012e, 0x2021, 0x400c, 0x0804, 0x356e,
+	0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096,
+	0x00d6, 0x0156, 0x7014, 0x2048, 0x7020, 0x20a8, 0x8000, 0x7022,
+	0xa804, 0x9005, 0x0904, 0x3c3c, 0x2048, 0x1f04, 0x3bf0, 0x7068,
+	0x2040, 0xa28c, 0xa390, 0xa494, 0xa598, 0xa930, 0xa808, 0xd0b4,
+	0x1120, 0x2029, 0x0000, 0x2021, 0x0000, 0x0096, 0x7014, 0x2048,
+	0xa864, 0x009e, 0x9086, 0x0103, 0x0170, 0x8906, 0x8006, 0x8007,
+	0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x080c, 0x4ae9,
+	0x701f, 0x3be0, 0x00b0, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f,
+	0x9084, 0xffc0, 0x9080, 0x001b, 0x21a8, 0x27e0, 0x2098, 0x27e8,
+	0x20a0, 0x0006, 0x080c, 0x0fb7, 0x000e, 0x080c, 0x4aec, 0x701f,
+	0x3be0, 0x015e, 0x00de, 0x009e, 0x008e, 0x007e, 0x005e, 0x004e,
+	0x003e, 0x002e, 0x001e, 0x0005, 0x7014, 0x2048, 0xa864, 0x9086,
+	0x0103, 0x1118, 0x701f, 0x3ca1, 0x0450, 0x7014, 0x2048, 0xa868,
+	0xc0fd, 0xa86a, 0x2009, 0x007f, 0x080c, 0x65bd, 0x0110, 0x9006,
+	0x0030, 0xb813, 0x00ff, 0xb817, 0xfffd, 0x080c, 0xccf7, 0x015e,
+	0x00de, 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e,
+	0x001e, 0x0904, 0x359e, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056,
+	0x0076, 0x0086, 0x0096, 0x00d6, 0x0156, 0x701f, 0x3c73, 0x7007,
+	0x0003, 0x0804, 0x3c31, 0xa830, 0x9086, 0x0100, 0x2021, 0x400c,
+	0x0904, 0x356e, 0x0076, 0xad10, 0xac0c, 0xab24, 0xaa20, 0xa930,
 	0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, 0x0000, 0x8906,
 	0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b,
-	0x080c, 0x4a21, 0x701f, 0x3ba7, 0x7023, 0x0001, 0x012e, 0x0005,
-	0x080c, 0xa781, 0x0046, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6,
-	0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3a4f, 0x2001, 0x199d, 0x2003,
-	0x0000, 0x2021, 0x000a, 0x2061, 0x0100, 0x6104, 0x0016, 0x60bb,
-	0x0000, 0x60bf, 0x32e1, 0x60bf, 0x0012, 0x080c, 0x3cd9, 0x080c,
-	0x3c98, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x19e5, 0x2079,
-	0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0140, 0x2001,
-	0x0035, 0x2004, 0x780e, 0x2001, 0x0034, 0x2004, 0x780a, 0x00de,
-	0x2011, 0x0001, 0x080c, 0x404a, 0x008e, 0x00ee, 0x00fe, 0x080c,
-	0x3f77, 0x080c, 0x3ea4, 0x05b8, 0x2001, 0x020b, 0x2004, 0x9084,
-	0x0140, 0x1db8, 0x080c, 0x40be, 0x00f6, 0x2079, 0x0300, 0x78bc,
-	0x00fe, 0x908c, 0x0070, 0x1560, 0x2071, 0x0200, 0x7037, 0x0000,
-	0x7050, 0x9084, 0xff00, 0x9086, 0x3200, 0x1510, 0x7037, 0x0001,
-	0x7050, 0x9084, 0xff00, 0x9086, 0xe100, 0x11d0, 0x7037, 0x0000,
-	0x7054, 0x7037, 0x0000, 0x715c, 0x9106, 0x1190, 0x2001, 0x1820,
-	0x2004, 0x9106, 0x1168, 0x00c6, 0x2061, 0x0100, 0x6024, 0x9084,
-	0x1e00, 0x00ce, 0x0138, 0x080c, 0x3eae, 0x080c, 0x3c93, 0x0058,
-	0x080c, 0x3c93, 0x080c, 0x3fe2, 0x080c, 0x3f6d, 0x2001, 0x020b,
-	0x2004, 0xd0e4, 0x0dd8, 0x2001, 0x032a, 0x2003, 0x0004, 0x2061,
-	0x0100, 0x6027, 0x0002, 0x001e, 0x6106, 0x2011, 0x020d, 0x2013,
-	0x0020, 0x60bb, 0x0000, 0x60bf, 0x0108, 0x60bf, 0x0012, 0x2001,
-	0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, 0x131f, 0x2009,
-	0x0028, 0x080c, 0x2184, 0x2001, 0x0227, 0x200c, 0x2102, 0x080c,
-	0xa79d, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e,
-	0x008e, 0x004e, 0x2001, 0x199d, 0x2004, 0x9005, 0x1118, 0x012e,
-	0x0804, 0x3533, 0x012e, 0x2021, 0x400c, 0x0804, 0x3535, 0x0016,
-	0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6,
-	0x0156, 0x7014, 0x2048, 0x7020, 0x20a8, 0x8000, 0x7022, 0xa804,
-	0x9005, 0x0904, 0x3c03, 0x2048, 0x1f04, 0x3bb7, 0x7068, 0x2040,
-	0xa28c, 0xa390, 0xa494, 0xa598, 0xa930, 0xa808, 0xd0b4, 0x1120,
-	0x2029, 0x0000, 0x2021, 0x0000, 0x0096, 0x7014, 0x2048, 0xa864,
-	0x009e, 0x9086, 0x0103, 0x0170, 0x8906, 0x8006, 0x8007, 0x90bc,
-	0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x080c, 0x4a21, 0x701f,
-	0x3ba7, 0x00b0, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084,
-	0xffc0, 0x9080, 0x001b, 0x21a8, 0x27e0, 0x2098, 0x27e8, 0x20a0,
-	0x0006, 0x080c, 0x0fb8, 0x000e, 0x080c, 0x4a24, 0x701f, 0x3ba7,
-	0x015e, 0x00de, 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, 0x003e,
-	0x002e, 0x001e, 0x0005, 0x7014, 0x2048, 0xa864, 0x9086, 0x0103,
-	0x1118, 0x701f, 0x3c68, 0x0450, 0x7014, 0x2048, 0xa868, 0xc0fd,
-	0xa86a, 0x2009, 0x007f, 0x080c, 0x64cc, 0x0110, 0x9006, 0x0030,
-	0xb813, 0x00ff, 0xb817, 0xfffd, 0x080c, 0xcbff, 0x015e, 0x00de,
-	0x009e, 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e,
-	0x0904, 0x3565, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076,
-	0x0086, 0x0096, 0x00d6, 0x0156, 0x701f, 0x3c3a, 0x7007, 0x0003,
-	0x0804, 0x3bf8, 0xa830, 0x9086, 0x0100, 0x2021, 0x400c, 0x0904,
-	0x3535, 0x0076, 0xad10, 0xac0c, 0xab24, 0xaa20, 0xa930, 0xa808,
-	0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, 0x0000, 0x8906, 0x8006,
-	0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x21a8,
-	0x27e0, 0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c, 0x0fb8, 0x000e,
-	0x080c, 0x4a24, 0x007e, 0x701f, 0x3ba7, 0x7023, 0x0001, 0x0005,
-	0x0804, 0x3533, 0x0156, 0x00c6, 0xa814, 0x908a, 0x001e, 0x0218,
-	0xa833, 0x001e, 0x0010, 0xa832, 0x0078, 0x81ff, 0x0168, 0x0016,
-	0x080c, 0x49d8, 0x001e, 0x0130, 0xa800, 0x2040, 0xa008, 0xa80a,
-	0x2100, 0x0c58, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce, 0x015e,
-	0x0005, 0x0006, 0x00f6, 0x2079, 0x0000, 0x7880, 0x9086, 0x0044,
-	0x00fe, 0x000e, 0x0005, 0x2001, 0x199d, 0x2003, 0x0001, 0x0005,
-	0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200, 0x2001, 0x19a8, 0x2004,
-	0x601a, 0x2061, 0x0100, 0x2001, 0x19a7, 0x2004, 0x60ce, 0x6104,
-	0xc1ac, 0x6106, 0x080c, 0x49d8, 0xa813, 0x0019, 0xa817, 0x0001,
-	0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, 0xa866, 0x2001, 0x002f,
-	0x2004, 0xa86a, 0x2061, 0x0090, 0x2079, 0x0100, 0x2001, 0x19a7,
-	0x2004, 0x6036, 0x2009, 0x0040, 0x080c, 0x2184, 0x2001, 0x002a,
-	0x2004, 0x9084, 0xfff8, 0xa86e, 0x601a, 0xa873, 0x0000, 0x601f,
-	0x0000, 0x78ca, 0x9006, 0x600a, 0x600e, 0x00ce, 0x00ee, 0x00fe,
-	0x0005, 0x00e6, 0x080c, 0x49d8, 0x2940, 0xa013, 0x0019, 0xa017,
-	0x0001, 0x2800, 0xa05a, 0x2001, 0x0030, 0x2004, 0xa866, 0x2001,
-	0x0031, 0x2004, 0xa86a, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8,
-	0xa86e, 0xa873, 0x0000, 0x2001, 0x032a, 0x2003, 0x0004, 0x2001,
-	0x0300, 0x2003, 0x0000, 0x2001, 0x020d, 0x2003, 0x0000, 0x2001,
-	0x0004, 0x200c, 0x918d, 0x0002, 0x2102, 0x00ee, 0x0005, 0x0126,
-	0x2091, 0x8000, 0x81ff, 0x0148, 0x080c, 0x29af, 0x1130, 0x9006,
-	0x080c, 0x2919, 0x9006, 0x080c, 0x28fc, 0x7884, 0x9084, 0x0007,
-	0x0002, 0x3d24, 0x3d2d, 0x3d36, 0x3d21, 0x3d21, 0x3d21, 0x3d21,
-	0x3d21, 0x012e, 0x0804, 0x3568, 0x2009, 0x0114, 0x2104, 0x9085,
-	0x0800, 0x200a, 0x080c, 0x3ef8, 0x00c0, 0x2009, 0x0114, 0x2104,
-	0x9085, 0x4000, 0x200a, 0x080c, 0x3ef8, 0x0078, 0x080c, 0x73e4,
-	0x1128, 0x012e, 0x2009, 0x0016, 0x0804, 0x3565, 0x81ff, 0x0128,
-	0x012e, 0x2021, 0x400b, 0x0804, 0x3535, 0x080c, 0xa781, 0x0086,
-	0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c,
-	0x3a4f, 0x2009, 0x0101, 0x210c, 0x0016, 0x7ec8, 0x7dcc, 0x9006,
-	0x2068, 0x2060, 0x2058, 0x080c, 0x4199, 0x080c, 0x40e9, 0x903e,
-	0x2720, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x19e5, 0x2079,
-	0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120, 0x68d4,
-	0x780e, 0x68d0, 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, 0x404a,
-	0x080c, 0x29b7, 0x080c, 0x29b7, 0x080c, 0x29b7, 0x080c, 0x29b7,
-	0x080c, 0x404a, 0x008e, 0x00ee, 0x00fe, 0x080c, 0x3f77, 0x2009,
-	0x9c40, 0x8109, 0x11b0, 0x080c, 0x3eae, 0x2001, 0x0004, 0x200c,
-	0x918c, 0xfffd, 0x2102, 0x001e, 0x00fe, 0x00ee, 0x00de, 0x00ce,
-	0x00be, 0x00ae, 0x009e, 0x008e, 0x2009, 0x0017, 0x080c, 0x3565,
-	0x0cf8, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, 0x1d10, 0x00f6,
-	0x2079, 0x0000, 0x7884, 0x00fe, 0xd0bc, 0x0178, 0x2001, 0x0201,
-	0x200c, 0x81ff, 0x0150, 0x080c, 0x3f55, 0x2d00, 0x9c05, 0x9b05,
-	0x0120, 0x080c, 0x3eae, 0x0804, 0x3e57, 0x080c, 0x40be, 0x080c,
-	0x3fe2, 0x080c, 0x3f38, 0x080c, 0x3f6d, 0x00f6, 0x2079, 0x0100,
-	0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x3eae, 0x00fe, 0x0804,
-	0x3e57, 0x00fe, 0x080c, 0x3ea4, 0x1150, 0x8d68, 0x2001, 0x0032,
-	0x2602, 0x2001, 0x0033, 0x2502, 0x080c, 0x3eae, 0x0080, 0x87ff,
-	0x0138, 0x2001, 0x0201, 0x2004, 0x9005, 0x1908, 0x8739, 0x0038,
-	0x2001, 0x1a69, 0x2004, 0x9086, 0x0000, 0x1904, 0x3da7, 0x2001,
-	0x032f, 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529, 0x2500, 0x9605,
-	0x0904, 0x3e57, 0x7884, 0xd0bc, 0x0128, 0x2d00, 0x9c05, 0x9b05,
-	0x1904, 0x3e57, 0xa013, 0x0019, 0x2001, 0x032a, 0x2003, 0x0004,
-	0x7884, 0xd0ac, 0x1148, 0x2001, 0x1a69, 0x2003, 0x0003, 0x2001,
-	0x032a, 0x2003, 0x0009, 0x0030, 0xa017, 0x0001, 0x78b4, 0x9005,
-	0x0108, 0xa016, 0x2800, 0xa05a, 0x2009, 0x0040, 0x080c, 0x2184,
-	0x2900, 0xa85a, 0xa813, 0x0019, 0x7884, 0xd0a4, 0x1180, 0xa817,
-	0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061, 0x0090, 0x602b, 0x0008,
-	0x2001, 0x0203, 0x2004, 0x1f04, 0x3e2e, 0x00ce, 0x0030, 0xa817,
-	0x0001, 0x78b0, 0x9005, 0x0108, 0xa816, 0x00f6, 0x00c6, 0x2079,
-	0x0100, 0x2061, 0x0090, 0x7827, 0x0002, 0x2001, 0x002a, 0x2004,
-	0x9084, 0xfff8, 0x601a, 0x0006, 0x2001, 0x002b, 0x2004, 0x601e,
-	0x78c6, 0x000e, 0x78ca, 0x00ce, 0x00fe, 0x0804, 0x3d61, 0x001e,
-	0x00c6, 0x2001, 0x032a, 0x2003, 0x0004, 0x2061, 0x0100, 0x6027,
-	0x0002, 0x6106, 0x2011, 0x020d, 0x2013, 0x0020, 0x2001, 0x0004,
-	0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, 0x131f, 0x7884, 0x9084,
-	0x0003, 0x9086, 0x0002, 0x01b0, 0x2009, 0x0028, 0x080c, 0x2184,
-	0x2001, 0x0227, 0x200c, 0x2102, 0x6050, 0x9084, 0xb7ff, 0x080c,
-	0x2a72, 0x6052, 0x602f, 0x0000, 0x604b, 0xf7f7, 0x6043, 0x0090,
-	0x6043, 0x0010, 0x080c, 0xa79d, 0x00ce, 0x2d08, 0x2c10, 0x2b18,
-	0x2b00, 0x9c05, 0x9d05, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be,
-	0x00ae, 0x009e, 0x008e, 0x1118, 0x012e, 0x0804, 0x3533, 0x012e,
-	0x2021, 0x400c, 0x0804, 0x3535, 0x9085, 0x0001, 0x1d04, 0x3ead,
-	0x2091, 0x6000, 0x8420, 0x9486, 0x0064, 0x0005, 0x2001, 0x0105,
-	0x2003, 0x0010, 0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x1a69,
-	0x2003, 0x0000, 0x0071, 0x2009, 0x0048, 0x080c, 0x2184, 0x2001,
-	0x0227, 0x2024, 0x2402, 0x2001, 0x0109, 0x2003, 0x4000, 0x9026,
-	0x0005, 0x00f6, 0x00e6, 0x2071, 0x19e5, 0x7054, 0x9086, 0x0000,
-	0x0520, 0x2079, 0x0090, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203,
-	0x210c, 0x9106, 0x1120, 0x2009, 0x0040, 0x080c, 0x2184, 0x782c,
-	0xd0fc, 0x0d88, 0x080c, 0x40be, 0x7054, 0x9086, 0x0000, 0x1d58,
-	0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c,
-	0x2184, 0x782b, 0x0002, 0x7057, 0x0000, 0x00ee, 0x00fe, 0x0005,
-	0x00f6, 0x2079, 0x0100, 0x2001, 0x1818, 0x200c, 0x7932, 0x7936,
-	0x080c, 0x2618, 0x080c, 0x2a2e, 0x080c, 0x2a72, 0x784b, 0xf7f7,
-	0x7843, 0x0090, 0x7843, 0x0010, 0x7850, 0xc0e5, 0x7852, 0x2019,
-	0x61a8, 0x7820, 0xd09c, 0x0110, 0x8319, 0x1dd8, 0x7850, 0xc0e4,
-	0x7852, 0x2011, 0x0048, 0x080c, 0x2a0b, 0x7843, 0x0040, 0x2019,
-	0x01f4, 0xa001, 0xa001, 0x8319, 0x1de0, 0x2001, 0x0100, 0x080c,
-	0x29d1, 0x2011, 0x0020, 0x080c, 0x2a0b, 0x7843, 0x0000, 0x9006,
-	0x080c, 0x29d1, 0x2011, 0x0048, 0x080c, 0x2a0b, 0x00fe, 0x0005,
-	0x7884, 0xd0ac, 0x11c8, 0x00f6, 0x00e6, 0x2071, 0x1a69, 0x2079,
-	0x0320, 0x2001, 0x0201, 0x2004, 0x9005, 0x0160, 0x7000, 0x9086,
-	0x0000, 0x1140, 0x0051, 0xd0bc, 0x0108, 0x8738, 0x7003, 0x0003,
-	0x782b, 0x0019, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0300,
-	0x78bc, 0x00fe, 0x908c, 0x0070, 0x0178, 0x2009, 0x0032, 0x260a,
-	0x2009, 0x0033, 0x250a, 0xd0b4, 0x0108, 0x8c60, 0xd0ac, 0x0108,
-	0x8d68, 0xd0a4, 0x0108, 0x8b58, 0x0005, 0x00f6, 0x2079, 0x0200,
-	0x781c, 0xd084, 0x0110, 0x7837, 0x0050, 0x00fe, 0x0005, 0x00e6,
-	0x2071, 0x0100, 0x2001, 0x19a8, 0x2004, 0x70e2, 0x080c, 0x3c89,
-	0x1188, 0x2001, 0x1820, 0x2004, 0x2009, 0x181f, 0x210c, 0x918c,
-	0x00ff, 0x706e, 0x716a, 0x7066, 0x918d, 0x3200, 0x7162, 0x7073,
-	0xe109, 0x0080, 0x702c, 0x9085, 0x0002, 0x702e, 0x2009, 0x1818,
-	0x210c, 0x716e, 0x7063, 0x0100, 0x7166, 0x719e, 0x706b, 0x0000,
-	0x7073, 0x0809, 0x7077, 0x0008, 0x7078, 0x9080, 0x0100, 0x707a,
-	0x7080, 0x8000, 0x7082, 0x7087, 0xaaaa, 0x9006, 0x708a, 0x708e,
-	0x707e, 0x70d6, 0x70ab, 0x0036, 0x70af, 0x95d5, 0x7014, 0x9084,
-	0x1984, 0x9085, 0x0092, 0x7016, 0x080c, 0x40be, 0x00f6, 0x2071,
-	0x1a69, 0x2079, 0x0320, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4,
-	0x0120, 0x689c, 0x780e, 0x6898, 0x780a, 0x00de, 0x2009, 0x03e8,
-	0x8109, 0x1df0, 0x792c, 0xd1fc, 0x0110, 0x782b, 0x0004, 0x2011,
-	0x0011, 0x080c, 0x404a, 0x2011, 0x0001, 0x080c, 0x404a, 0x00fe,
-	0x00ee, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a69, 0x2079, 0x0320,
-	0x792c, 0xd1fc, 0x0904, 0x4047, 0x782b, 0x0002, 0x9026, 0xd19c,
-	0x1904, 0x4043, 0x7000, 0x0002, 0x4047, 0x3ff8, 0x4028, 0x4043,
-	0xd1bc, 0x1170, 0xd1dc, 0x1190, 0x8001, 0x7002, 0x2011, 0x0001,
-	0x080c, 0x404a, 0x0904, 0x4047, 0x080c, 0x404a, 0x0804, 0x4047,
-	0x00f6, 0x2079, 0x0300, 0x78bf, 0x0000, 0x00fe, 0x7810, 0x7914,
-	0x782b, 0x0004, 0x7812, 0x7916, 0x2001, 0x0201, 0x200c, 0x81ff,
-	0x0de8, 0x080c, 0x3f55, 0x2009, 0x0001, 0x00f6, 0x2079, 0x0300,
-	0x78b8, 0x00fe, 0xd0ec, 0x0110, 0x2009, 0x0011, 0x792a, 0x00f8,
-	0x8001, 0x7002, 0x9184, 0x0880, 0x1140, 0x782c, 0xd0fc, 0x1904,
-	0x3fec, 0x2011, 0x0001, 0x00b1, 0x0090, 0xa010, 0x9092, 0x0004,
-	0x9086, 0x0015, 0x1120, 0xa000, 0xa05a, 0x2011, 0x0031, 0xa212,
-	0xd1dc, 0x1960, 0x0828, 0x782b, 0x0004, 0x7003, 0x0000, 0x00ee,
-	0x00fe, 0x0005, 0xa014, 0x9005, 0x0550, 0x8001, 0x0036, 0x0096,
-	0xa016, 0xa058, 0x2048, 0xa010, 0x2009, 0x0031, 0x911a, 0x831c,
-	0x831c, 0x938a, 0x0007, 0x1a0c, 0x0d7d, 0x9398, 0x4078, 0x231d,
-	0x083f, 0x9080, 0x0004, 0x7a2a, 0x7100, 0x8108, 0x7102, 0x009e,
-	0x003e, 0x908a, 0x0035, 0x1140, 0x0096, 0xa058, 0x2048, 0xa804,
-	0xa05a, 0x2001, 0x0019, 0x009e, 0xa012, 0x9085, 0x0001, 0x0005,
-	0x40b5, 0x40ac, 0x40a3, 0x409a, 0x4091, 0x4088, 0x407f, 0xa964,
-	0x7902, 0xa968, 0x7906, 0xa96c, 0x7912, 0xa970, 0x7916, 0x0005,
-	0xa974, 0x7902, 0xa978, 0x7906, 0xa97c, 0x7912, 0xa980, 0x7916,
-	0x0005, 0xa984, 0x7902, 0xa988, 0x7906, 0xa98c, 0x7912, 0xa990,
-	0x7916, 0x0005, 0xa994, 0x7902, 0xa998, 0x7906, 0xa99c, 0x7912,
-	0xa9a0, 0x7916, 0x0005, 0xa9a4, 0x7902, 0xa9a8, 0x7906, 0xa9ac,
-	0x7912, 0xa9b0, 0x7916, 0x0005, 0xa9b4, 0x7902, 0xa9b8, 0x7906,
-	0xa9bc, 0x7912, 0xa9c0, 0x7916, 0x0005, 0xa9c4, 0x7902, 0xa9c8,
-	0x7906, 0xa9cc, 0x7912, 0xa9d0, 0x7916, 0x0005, 0x00f6, 0x00e6,
-	0x0086, 0x2071, 0x19e5, 0x2079, 0x0090, 0x792c, 0xd1fc, 0x01e8,
-	0x782b, 0x0002, 0x2940, 0x9026, 0x7054, 0x0002, 0x40e5, 0x40d1,
-	0x40dc, 0x8001, 0x7056, 0xd19c, 0x1180, 0x2011, 0x0001, 0x080c,
-	0x404a, 0x190c, 0x404a, 0x0048, 0x8001, 0x7056, 0x782c, 0xd0fc,
-	0x1d38, 0x2011, 0x0001, 0x080c, 0x404a, 0x008e, 0x00ee, 0x00fe,
-	0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x2061, 0x0200, 0x2001,
-	0x19a8, 0x2004, 0x601a, 0x2061, 0x0100, 0x2001, 0x19a7, 0x2004,
-	0x60ce, 0x6104, 0xc1ac, 0x6106, 0x2001, 0x002c, 0x2004, 0x9005,
-	0x0520, 0x2038, 0x2001, 0x002e, 0x2024, 0x2001, 0x002f, 0x201c,
-	0x080c, 0x49d8, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a,
+	0x21a8, 0x27e0, 0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c, 0x0fb7,
+	0x000e, 0x080c, 0x4aec, 0x007e, 0x701f, 0x3be0, 0x7023, 0x0001,
+	0x0005, 0x0804, 0x356c, 0x0156, 0x00c6, 0xa814, 0x908a, 0x001e,
+	0x0218, 0xa833, 0x001e, 0x0010, 0xa832, 0x0078, 0x81ff, 0x0168,
+	0x0016, 0x080c, 0x4aa0, 0x001e, 0x0130, 0xa800, 0x2040, 0xa008,
+	0xa80a, 0x2100, 0x0c58, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce,
+	0x015e, 0x0005, 0x0006, 0x00f6, 0x2079, 0x0000, 0x7880, 0x9086,
+	0x0044, 0x00fe, 0x000e, 0x0005, 0x2001, 0x199f, 0x2003, 0x0001,
+	0x0005, 0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200, 0x2001, 0x19aa,
+	0x2004, 0x601a, 0x2061, 0x0100, 0x2001, 0x19a9, 0x2004, 0x60ce,
+	0x6104, 0xc1ac, 0x6106, 0x080c, 0x4aa0, 0xa813, 0x0019, 0xa817,
+	0x0001, 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, 0xa866, 0x2001,
+	0x002f, 0x2004, 0xa86a, 0x2061, 0x0090, 0x2079, 0x0100, 0x2001,
+	0x19a9, 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, 0x21b0, 0x2001,
+	0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, 0x601a, 0xa873, 0x0000,
+	0x601f, 0x0000, 0x78ca, 0x9006, 0x600a, 0x600e, 0x00ce, 0x00ee,
+	0x00fe, 0x0005, 0x00e6, 0x080c, 0x4aa0, 0x2940, 0xa013, 0x0019,
+	0xa017, 0x0001, 0x2800, 0xa05a, 0x2001, 0x0030, 0x2004, 0xa866,
+	0x2001, 0x0031, 0x2004, 0xa86a, 0x2001, 0x002a, 0x2004, 0x9084,
+	0xfff8, 0xa86e, 0xa873, 0x0000, 0x2001, 0x032a, 0x2003, 0x0004,
+	0x2001, 0x0300, 0x2003, 0x0000, 0x2001, 0x020d, 0x2003, 0x0000,
+	0x2001, 0x0004, 0x200c, 0x918d, 0x0002, 0x2102, 0x00ee, 0x0005,
+	0x0126, 0x2091, 0x8000, 0x81ff, 0x0148, 0x080c, 0x29e8, 0x1130,
+	0x9006, 0x080c, 0x2945, 0x9006, 0x080c, 0x2928, 0x7884, 0x9084,
+	0x0007, 0x0002, 0x3d5d, 0x3d66, 0x3d6f, 0x3d5a, 0x3d5a, 0x3d5a,
+	0x3d5a, 0x3d5a, 0x012e, 0x0804, 0x35a1, 0x2009, 0x0114, 0x2104,
+	0x9085, 0x0800, 0x200a, 0x080c, 0x3f31, 0x00c0, 0x2009, 0x0114,
+	0x2104, 0x9085, 0x4000, 0x200a, 0x080c, 0x3f31, 0x0078, 0x080c,
+	0x74d5, 0x1128, 0x012e, 0x2009, 0x0016, 0x0804, 0x359e, 0x81ff,
+	0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x356e, 0x080c, 0xa872,
+	0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6,
+	0x080c, 0x3a88, 0x2009, 0x0101, 0x210c, 0x0016, 0x7ec8, 0x7dcc,
+	0x9006, 0x2068, 0x2060, 0x2058, 0x080c, 0x41d2, 0x080c, 0x4122,
+	0x903e, 0x2720, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x19e7,
+	0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120,
+	0x68d4, 0x780e, 0x68d0, 0x780a, 0x00de, 0x2011, 0x0001, 0x080c,
+	0x4083, 0x080c, 0x29f0, 0x080c, 0x29f0, 0x080c, 0x29f0, 0x080c,
+	0x29f0, 0x080c, 0x4083, 0x008e, 0x00ee, 0x00fe, 0x080c, 0x3fb0,
+	0x2009, 0x9c40, 0x8109, 0x11b0, 0x080c, 0x3ee7, 0x2001, 0x0004,
+	0x200c, 0x918c, 0xfffd, 0x2102, 0x001e, 0x00fe, 0x00ee, 0x00de,
+	0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x2009, 0x0017, 0x080c,
+	0x359e, 0x0cf8, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, 0x1d10,
+	0x00f6, 0x2079, 0x0000, 0x7884, 0x00fe, 0xd0bc, 0x0178, 0x2001,
+	0x0201, 0x200c, 0x81ff, 0x0150, 0x080c, 0x3f8e, 0x2d00, 0x9c05,
+	0x9b05, 0x0120, 0x080c, 0x3ee7, 0x0804, 0x3e90, 0x080c, 0x40f7,
+	0x080c, 0x401b, 0x080c, 0x3f71, 0x080c, 0x3fa6, 0x00f6, 0x2079,
+	0x0100, 0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x3ee7, 0x00fe,
+	0x0804, 0x3e90, 0x00fe, 0x080c, 0x3edd, 0x1150, 0x8d68, 0x2001,
+	0x0032, 0x2602, 0x2001, 0x0033, 0x2502, 0x080c, 0x3ee7, 0x0080,
+	0x87ff, 0x0138, 0x2001, 0x0201, 0x2004, 0x9005, 0x1908, 0x8739,
+	0x0038, 0x2001, 0x1a6b, 0x2004, 0x9086, 0x0000, 0x1904, 0x3de0,
+	0x2001, 0x032f, 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529, 0x2500,
+	0x9605, 0x0904, 0x3e90, 0x7884, 0xd0bc, 0x0128, 0x2d00, 0x9c05,
+	0x9b05, 0x1904, 0x3e90, 0xa013, 0x0019, 0x2001, 0x032a, 0x2003,
+	0x0004, 0x7884, 0xd0ac, 0x1148, 0x2001, 0x1a6b, 0x2003, 0x0003,
+	0x2001, 0x032a, 0x2003, 0x0009, 0x0030, 0xa017, 0x0001, 0x78b4,
+	0x9005, 0x0108, 0xa016, 0x2800, 0xa05a, 0x2009, 0x0040, 0x080c,
+	0x21b0, 0x2900, 0xa85a, 0xa813, 0x0019, 0x7884, 0xd0a4, 0x1180,
+	0xa817, 0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061, 0x0090, 0x602b,
+	0x0008, 0x2001, 0x0203, 0x2004, 0x1f04, 0x3e67, 0x00ce, 0x0030,
+	0xa817, 0x0001, 0x78b0, 0x9005, 0x0108, 0xa816, 0x00f6, 0x00c6,
+	0x2079, 0x0100, 0x2061, 0x0090, 0x7827, 0x0002, 0x2001, 0x002a,
+	0x2004, 0x9084, 0xfff8, 0x601a, 0x0006, 0x2001, 0x002b, 0x2004,
+	0x601e, 0x78c6, 0x000e, 0x78ca, 0x00ce, 0x00fe, 0x0804, 0x3d9a,
+	0x001e, 0x00c6, 0x2001, 0x032a, 0x2003, 0x0004, 0x2061, 0x0100,
+	0x6027, 0x0002, 0x6106, 0x2011, 0x020d, 0x2013, 0x0020, 0x2001,
+	0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, 0x1328, 0x7884,
+	0x9084, 0x0003, 0x9086, 0x0002, 0x01b0, 0x2009, 0x0028, 0x080c,
+	0x21b0, 0x2001, 0x0227, 0x200c, 0x2102, 0x6050, 0x9084, 0xb7ff,
+	0x080c, 0x2aab, 0x6052, 0x602f, 0x0000, 0x604b, 0xf7f7, 0x6043,
+	0x0090, 0x6043, 0x0010, 0x080c, 0xa88e, 0x00ce, 0x2d08, 0x2c10,
+	0x2b18, 0x2b00, 0x9c05, 0x9d05, 0x00fe, 0x00ee, 0x00de, 0x00ce,
+	0x00be, 0x00ae, 0x009e, 0x008e, 0x1118, 0x012e, 0x0804, 0x356c,
+	0x012e, 0x2021, 0x400c, 0x0804, 0x356e, 0x9085, 0x0001, 0x1d04,
+	0x3ee6, 0x2091, 0x6000, 0x8420, 0x9486, 0x0064, 0x0005, 0x2001,
+	0x0105, 0x2003, 0x0010, 0x2001, 0x032a, 0x2003, 0x0004, 0x2001,
+	0x1a6b, 0x2003, 0x0000, 0x0071, 0x2009, 0x0048, 0x080c, 0x21b0,
+	0x2001, 0x0227, 0x2024, 0x2402, 0x2001, 0x0109, 0x2003, 0x4000,
+	0x9026, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x19e7, 0x7054, 0x9086,
+	0x0000, 0x0520, 0x2079, 0x0090, 0x2009, 0x0206, 0x2104, 0x2009,
+	0x0203, 0x210c, 0x9106, 0x1120, 0x2009, 0x0040, 0x080c, 0x21b0,
+	0x782c, 0xd0fc, 0x0d88, 0x080c, 0x40f7, 0x7054, 0x9086, 0x0000,
+	0x1d58, 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040,
+	0x080c, 0x21b0, 0x782b, 0x0002, 0x7057, 0x0000, 0x00ee, 0x00fe,
+	0x0005, 0x00f6, 0x2079, 0x0100, 0x2001, 0x1818, 0x200c, 0x7932,
+	0x7936, 0x080c, 0x2644, 0x080c, 0x2a67, 0x080c, 0x2aab, 0x784b,
+	0xf7f7, 0x7843, 0x0090, 0x7843, 0x0010, 0x7850, 0xc0e5, 0x7852,
+	0x2019, 0x61a8, 0x7820, 0xd09c, 0x0110, 0x8319, 0x1dd8, 0x7850,
+	0xc0e4, 0x7852, 0x2011, 0x0048, 0x080c, 0x2a44, 0x7843, 0x0040,
+	0x2019, 0x01f4, 0xa001, 0xa001, 0x8319, 0x1de0, 0x2001, 0x0100,
+	0x080c, 0x2a0a, 0x2011, 0x0020, 0x080c, 0x2a44, 0x7843, 0x0000,
+	0x9006, 0x080c, 0x2a0a, 0x2011, 0x0048, 0x080c, 0x2a44, 0x00fe,
+	0x0005, 0x7884, 0xd0ac, 0x11c8, 0x00f6, 0x00e6, 0x2071, 0x1a6b,
+	0x2079, 0x0320, 0x2001, 0x0201, 0x2004, 0x9005, 0x0160, 0x7000,
+	0x9086, 0x0000, 0x1140, 0x0051, 0xd0bc, 0x0108, 0x8738, 0x7003,
+	0x0003, 0x782b, 0x0019, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079,
+	0x0300, 0x78bc, 0x00fe, 0x908c, 0x0070, 0x0178, 0x2009, 0x0032,
+	0x260a, 0x2009, 0x0033, 0x250a, 0xd0b4, 0x0108, 0x8c60, 0xd0ac,
+	0x0108, 0x8d68, 0xd0a4, 0x0108, 0x8b58, 0x0005, 0x00f6, 0x2079,
+	0x0200, 0x781c, 0xd084, 0x0110, 0x7837, 0x0050, 0x00fe, 0x0005,
+	0x00e6, 0x2071, 0x0100, 0x2001, 0x19aa, 0x2004, 0x70e2, 0x080c,
+	0x3cc2, 0x1188, 0x2001, 0x1820, 0x2004, 0x2009, 0x181f, 0x210c,
+	0x918c, 0x00ff, 0x706e, 0x716a, 0x7066, 0x918d, 0x3200, 0x7162,
+	0x7073, 0xe109, 0x0080, 0x702c, 0x9085, 0x0002, 0x702e, 0x2009,
+	0x1818, 0x210c, 0x716e, 0x7063, 0x0100, 0x7166, 0x719e, 0x706b,
+	0x0000, 0x7073, 0x0809, 0x7077, 0x0008, 0x7078, 0x9080, 0x0100,
+	0x707a, 0x7080, 0x8000, 0x7082, 0x7087, 0xaaaa, 0x9006, 0x708a,
+	0x708e, 0x707e, 0x70d6, 0x70ab, 0x0036, 0x70af, 0x95d5, 0x7014,
+	0x9084, 0x1984, 0x9085, 0x0092, 0x7016, 0x080c, 0x40f7, 0x00f6,
+	0x2071, 0x1a6b, 0x2079, 0x0320, 0x00d6, 0x2069, 0x0000, 0x6884,
+	0xd0b4, 0x0120, 0x689c, 0x780e, 0x6898, 0x780a, 0x00de, 0x2009,
+	0x03e8, 0x8109, 0x1df0, 0x792c, 0xd1fc, 0x0110, 0x782b, 0x0004,
+	0x2011, 0x0011, 0x080c, 0x4083, 0x2011, 0x0001, 0x080c, 0x4083,
+	0x00fe, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a6b, 0x2079,
+	0x0320, 0x792c, 0xd1fc, 0x0904, 0x4080, 0x782b, 0x0002, 0x9026,
+	0xd19c, 0x1904, 0x407c, 0x7000, 0x0002, 0x4080, 0x4031, 0x4061,
+	0x407c, 0xd1bc, 0x1170, 0xd1dc, 0x1190, 0x8001, 0x7002, 0x2011,
+	0x0001, 0x080c, 0x4083, 0x0904, 0x4080, 0x080c, 0x4083, 0x0804,
+	0x4080, 0x00f6, 0x2079, 0x0300, 0x78bf, 0x0000, 0x00fe, 0x7810,
+	0x7914, 0x782b, 0x0004, 0x7812, 0x7916, 0x2001, 0x0201, 0x200c,
+	0x81ff, 0x0de8, 0x080c, 0x3f8e, 0x2009, 0x0001, 0x00f6, 0x2079,
+	0x0300, 0x78b8, 0x00fe, 0xd0ec, 0x0110, 0x2009, 0x0011, 0x792a,
+	0x00f8, 0x8001, 0x7002, 0x9184, 0x0880, 0x1140, 0x782c, 0xd0fc,
+	0x1904, 0x4025, 0x2011, 0x0001, 0x00b1, 0x0090, 0xa010, 0x9092,
+	0x0004, 0x9086, 0x0015, 0x1120, 0xa000, 0xa05a, 0x2011, 0x0031,
+	0xa212, 0xd1dc, 0x1960, 0x0828, 0x782b, 0x0004, 0x7003, 0x0000,
+	0x00ee, 0x00fe, 0x0005, 0xa014, 0x9005, 0x0550, 0x8001, 0x0036,
+	0x0096, 0xa016, 0xa058, 0x2048, 0xa010, 0x2009, 0x0031, 0x911a,
+	0x831c, 0x831c, 0x938a, 0x0007, 0x1a0c, 0x0d7d, 0x9398, 0x40b1,
+	0x231d, 0x083f, 0x9080, 0x0004, 0x7a2a, 0x7100, 0x8108, 0x7102,
+	0x009e, 0x003e, 0x908a, 0x0035, 0x1140, 0x0096, 0xa058, 0x2048,
+	0xa804, 0xa05a, 0x2001, 0x0019, 0x009e, 0xa012, 0x9085, 0x0001,
+	0x0005, 0x40ee, 0x40e5, 0x40dc, 0x40d3, 0x40ca, 0x40c1, 0x40b8,
+	0xa964, 0x7902, 0xa968, 0x7906, 0xa96c, 0x7912, 0xa970, 0x7916,
+	0x0005, 0xa974, 0x7902, 0xa978, 0x7906, 0xa97c, 0x7912, 0xa980,
+	0x7916, 0x0005, 0xa984, 0x7902, 0xa988, 0x7906, 0xa98c, 0x7912,
+	0xa990, 0x7916, 0x0005, 0xa994, 0x7902, 0xa998, 0x7906, 0xa99c,
+	0x7912, 0xa9a0, 0x7916, 0x0005, 0xa9a4, 0x7902, 0xa9a8, 0x7906,
+	0xa9ac, 0x7912, 0xa9b0, 0x7916, 0x0005, 0xa9b4, 0x7902, 0xa9b8,
+	0x7906, 0xa9bc, 0x7912, 0xa9c0, 0x7916, 0x0005, 0xa9c4, 0x7902,
+	0xa9c8, 0x7906, 0xa9cc, 0x7912, 0xa9d0, 0x7916, 0x0005, 0x00f6,
+	0x00e6, 0x0086, 0x2071, 0x19e7, 0x2079, 0x0090, 0x792c, 0xd1fc,
+	0x01e8, 0x782b, 0x0002, 0x2940, 0x9026, 0x7054, 0x0002, 0x411e,
+	0x410a, 0x4115, 0x8001, 0x7056, 0xd19c, 0x1180, 0x2011, 0x0001,
+	0x080c, 0x4083, 0x190c, 0x4083, 0x0048, 0x8001, 0x7056, 0x782c,
+	0xd0fc, 0x1d38, 0x2011, 0x0001, 0x080c, 0x4083, 0x008e, 0x00ee,
+	0x00fe, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x2061, 0x0200,
+	0x2001, 0x19aa, 0x2004, 0x601a, 0x2061, 0x0100, 0x2001, 0x19a9,
+	0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x2001, 0x002c, 0x2004,
+	0x9005, 0x0520, 0x2038, 0x2001, 0x002e, 0x2024, 0x2001, 0x002f,
+	0x201c, 0x080c, 0x4aa0, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a,
+	0x978a, 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708,
+	0x903e, 0x0096, 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e,
+	0x080c, 0x419a, 0x1d68, 0x2900, 0xa85a, 0x00d0, 0x080c, 0x4aa0,
+	0xa813, 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e,
+	0x2004, 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, 0x2001, 0x002a,
+	0x2004, 0x9084, 0xfff8, 0xa86e, 0x2001, 0x002b, 0x2004, 0xa872,
+	0x2061, 0x0090, 0x2079, 0x0100, 0x2001, 0x19a9, 0x2004, 0x6036,
+	0x2009, 0x0040, 0x080c, 0x21b0, 0x2001, 0x002a, 0x2004, 0x9084,
+	0xfff8, 0x601a, 0x0006, 0x2001, 0x002b, 0x2004, 0x601e, 0x78c6,
+	0x000e, 0x78ca, 0x9006, 0x600a, 0x600e, 0x008e, 0x00ce, 0x00ee,
+	0x00fe, 0x0005, 0x00e6, 0x2071, 0x0080, 0xaa60, 0x22e8, 0x20a0,
+	0x20e1, 0x0000, 0x2099, 0x0088, 0x702b, 0x0026, 0x7402, 0x7306,
+	0x9006, 0x700a, 0x700e, 0x810b, 0x810b, 0x21a8, 0x810b, 0x7112,
+	0x702b, 0x0041, 0x702c, 0xd0fc, 0x0de8, 0x702b, 0x0002, 0x702b,
+	0x0040, 0x4005, 0x7400, 0x7304, 0x87ff, 0x0190, 0x0086, 0x0096,
+	0x2940, 0x0086, 0x080c, 0x4aa0, 0x008e, 0xa058, 0x00a6, 0x2050,
+	0x2900, 0xb006, 0xa05a, 0x00ae, 0x009e, 0x008e, 0x9085, 0x0001,
+	0x00ee, 0x0005, 0x00e6, 0x2001, 0x002d, 0x2004, 0x9005, 0x0528,
+	0x2038, 0x2001, 0x0030, 0x2024, 0x2001, 0x0031, 0x201c, 0x080c,
+	0x4aa0, 0x2940, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a,
 	0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e,
 	0x0096, 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c,
-	0x4161, 0x1d68, 0x2900, 0xa85a, 0x00d0, 0x080c, 0x49d8, 0xa813,
-	0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004,
-	0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, 0x2001, 0x002a, 0x2004,
-	0x9084, 0xfff8, 0xa86e, 0x2001, 0x002b, 0x2004, 0xa872, 0x2061,
-	0x0090, 0x2079, 0x0100, 0x2001, 0x19a7, 0x2004, 0x6036, 0x2009,
-	0x0040, 0x080c, 0x2184, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8,
-	0x601a, 0x0006, 0x2001, 0x002b, 0x2004, 0x601e, 0x78c6, 0x000e,
-	0x78ca, 0x9006, 0x600a, 0x600e, 0x008e, 0x00ce, 0x00ee, 0x00fe,
-	0x0005, 0x00e6, 0x2071, 0x0080, 0xaa60, 0x22e8, 0x20a0, 0x20e1,
-	0x0000, 0x2099, 0x0088, 0x702b, 0x0026, 0x7402, 0x7306, 0x9006,
-	0x700a, 0x700e, 0x810b, 0x810b, 0x21a8, 0x810b, 0x7112, 0x702b,
-	0x0041, 0x702c, 0xd0fc, 0x0de8, 0x702b, 0x0002, 0x702b, 0x0040,
-	0x4005, 0x7400, 0x7304, 0x87ff, 0x0190, 0x0086, 0x0096, 0x2940,
-	0x0086, 0x080c, 0x49d8, 0x008e, 0xa058, 0x00a6, 0x2050, 0x2900,
-	0xb006, 0xa05a, 0x00ae, 0x009e, 0x008e, 0x9085, 0x0001, 0x00ee,
-	0x0005, 0x00e6, 0x2001, 0x002d, 0x2004, 0x9005, 0x0528, 0x2038,
-	0x2001, 0x0030, 0x2024, 0x2001, 0x0031, 0x201c, 0x080c, 0x49d8,
-	0x2940, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007,
-	0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096,
-	0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x4161,
-	0x1d68, 0x2900, 0xa85a, 0x00d8, 0x080c, 0x49d8, 0x2940, 0xa013,
-	0x0019, 0xa017, 0x0001, 0x2800, 0xa05a, 0x2001, 0x0030, 0x2004,
-	0xa066, 0x2001, 0x0031, 0x2004, 0xa06a, 0x2001, 0x002a, 0x2004,
-	0x9084, 0xfff8, 0xa06e, 0x2001, 0x002b, 0x2004, 0xa072, 0x2001,
-	0x032a, 0x2003, 0x0004, 0x7884, 0xd0ac, 0x1180, 0x2001, 0x0101,
-	0x200c, 0x918d, 0x0200, 0x2102, 0xa017, 0x0000, 0x2001, 0x1a69,
-	0x2003, 0x0003, 0x2001, 0x032a, 0x2003, 0x0009, 0x2001, 0x0300,
-	0x2003, 0x0000, 0x2001, 0x020d, 0x2003, 0x0000, 0x2001, 0x0004,
-	0x200c, 0x918d, 0x0002, 0x2102, 0x00ee, 0x0005, 0x0126, 0x2091,
-	0x8000, 0x20a9, 0x0007, 0x20a1, 0x1840, 0x20e9, 0x0001, 0x9006,
-	0x4004, 0x20a9, 0x000c, 0x20a1, 0xfff4, 0x20e9, 0x0000, 0x9006,
-	0x4004, 0x2009, 0x013c, 0x200a, 0x012e, 0x7880, 0x9086, 0x0052,
-	0x0108, 0x0005, 0x0804, 0x3533, 0x7d98, 0x7c9c, 0x0804, 0x362a,
-	0x080c, 0x73e4, 0x190c, 0x5f06, 0x6040, 0x9084, 0x0020, 0x09b1,
-	0x2069, 0x1847, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c,
-	0x7d98, 0x2039, 0x0001, 0x080c, 0x4a21, 0x701f, 0x4240, 0x0005,
-	0x080c, 0x560b, 0x1130, 0x3b00, 0x3a08, 0xc194, 0xc095, 0x20d8,
-	0x21d0, 0x2069, 0x1847, 0x6800, 0x9005, 0x0904, 0x3568, 0x6804,
-	0xd0ac, 0x0118, 0xd0a4, 0x0904, 0x3568, 0xd094, 0x00c6, 0x2061,
-	0x0100, 0x6104, 0x0138, 0x6200, 0x9292, 0x0005, 0x0218, 0x918c,
-	0xffdf, 0x0010, 0x918d, 0x0020, 0x6106, 0x00ce, 0xd08c, 0x00c6,
-	0x2061, 0x0100, 0x6104, 0x0118, 0x918d, 0x0010, 0x0010, 0x918c,
-	0xffef, 0x6106, 0x00ce, 0xd084, 0x0158, 0x6a28, 0x928a, 0x007f,
-	0x1a04, 0x3568, 0x9288, 0x3334, 0x210d, 0x918c, 0x00ff, 0x6166,
-	0xd0dc, 0x0130, 0x6828, 0x908a, 0x007f, 0x1a04, 0x3568, 0x605e,
-	0x6888, 0x9084, 0x0030, 0x8004, 0x8004, 0x8004, 0x8004, 0x0006,
-	0x2009, 0x19af, 0x9080, 0x270b, 0x2005, 0x200a, 0x2008, 0x2001,
-	0x0018, 0x080c, 0xa772, 0x2009, 0x0390, 0x200b, 0x0400, 0x000e,
-	0x2009, 0x19b0, 0x9080, 0x270f, 0x2005, 0x200a, 0x6808, 0x908a,
-	0x0100, 0x0a04, 0x3568, 0x908a, 0x0841, 0x1a04, 0x3568, 0x9084,
-	0x0007, 0x1904, 0x3568, 0x680c, 0x9005, 0x0904, 0x3568, 0x6810,
-	0x9005, 0x0904, 0x3568, 0x6848, 0x6940, 0x910a, 0x1a04, 0x3568,
-	0x8001, 0x0904, 0x3568, 0x684c, 0x6944, 0x910a, 0x1a04, 0x3568,
-	0x8001, 0x0904, 0x3568, 0x6814, 0x908c, 0x00ff, 0x614e, 0x8007,
-	0x9084, 0x00ff, 0x6052, 0x080c, 0x7719, 0x080c, 0x69a0, 0x080c,
-	0x69d4, 0x6808, 0x602a, 0x080c, 0x20f6, 0x2009, 0x0170, 0x200b,
-	0x0080, 0xa001, 0xa001, 0x200b, 0x0000, 0x0036, 0x6b08, 0x080c,
-	0x2672, 0x003e, 0x6000, 0x9086, 0x0000, 0x1904, 0x43cb, 0x6818,
-	0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f, 0x6016,
-	0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0148, 0x6830, 0x6934,
-	0x6a38, 0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f, 0x0010, 0x9084,
-	0xf0ff, 0x6006, 0x610a, 0x620e, 0x6312, 0x8007, 0x810f, 0x8217,
-	0x831f, 0x20a9, 0x0004, 0x20a1, 0x19b1, 0x20e9, 0x0001, 0x4001,
-	0x20a9, 0x0004, 0x20a1, 0x19cb, 0x20e9, 0x0001, 0x4001, 0x080c,
-	0x869b, 0x00c6, 0x900e, 0x20a9, 0x0001, 0x6b70, 0xd384, 0x01c8,
-	0x0020, 0x839d, 0x12b0, 0x3508, 0x8109, 0x080c, 0x7cda, 0x6878,
-	0x6016, 0x6874, 0x2008, 0x9084, 0xff00, 0x8007, 0x600a, 0x9184,
-	0x00ff, 0x6006, 0x8108, 0x1118, 0x6003, 0x0003, 0x0010, 0x6003,
-	0x0001, 0x1f04, 0x4329, 0x00ce, 0x00c6, 0x2061, 0x199a, 0x6a88,
-	0x9284, 0xc000, 0x2010, 0x9286, 0x0000, 0x1158, 0x2063, 0x0000,
-	0x2001, 0x0001, 0x080c, 0x2919, 0x2001, 0x0001, 0x080c, 0x28fc,
-	0x0088, 0x9286, 0x4000, 0x1148, 0x2063, 0x0001, 0x9006, 0x080c,
-	0x2919, 0x9006, 0x080c, 0x28fc, 0x0028, 0x9286, 0x8000, 0x1d30,
-	0x2063, 0x0002, 0x00ce, 0x00e6, 0x2c70, 0x080c, 0x0eb4, 0x00ee,
-	0x6888, 0xd0ec, 0x0130, 0x2011, 0x0114, 0x2204, 0x9085, 0x0180,
-	0x2012, 0x6a80, 0x9284, 0x0030, 0x9086, 0x0030, 0x1128, 0x9294,
-	0xffcf, 0x9295, 0x0020, 0x6a82, 0x2001, 0x197c, 0x6a80, 0x9294,
-	0x0030, 0x928e, 0x0000, 0x0170, 0x928e, 0x0010, 0x0118, 0x928e,
-	0x0020, 0x0140, 0x2003, 0xaaaa, 0x080c, 0x26e7, 0x2001, 0x196d,
-	0x2102, 0x0008, 0x2102, 0x00c6, 0x2061, 0x0100, 0x602f, 0x0040,
-	0x602f, 0x0000, 0x00ce, 0x080c, 0x73e4, 0x0128, 0x080c, 0x4f0f,
-	0x0110, 0x080c, 0x2638, 0x60d4, 0x9005, 0x01c0, 0x6003, 0x0001,
-	0x2009, 0x43b3, 0x00e0, 0x080c, 0x73e4, 0x1168, 0x2011, 0x725a,
-	0x080c, 0x850b, 0x2011, 0x724d, 0x080c, 0x8614, 0x080c, 0x76ed,
-	0x080c, 0x7315, 0x0040, 0x080c, 0x5dfc, 0x0028, 0x6003, 0x0004,
-	0x2009, 0x43cb, 0x0020, 0x080c, 0x68d5, 0x0804, 0x3533, 0x2001,
-	0x0170, 0x2004, 0x9084, 0x00ff, 0x9086, 0x004c, 0x1118, 0x2091,
-	0x31bd, 0x0817, 0x2091, 0x313d, 0x0817, 0x6000, 0x9086, 0x0000,
-	0x0904, 0x3565, 0x2069, 0x1847, 0x7890, 0x6842, 0x7894, 0x6846,
-	0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039,
-	0x0001, 0x0804, 0x4a24, 0x9006, 0x080c, 0x2638, 0x81ff, 0x1904,
-	0x3565, 0x080c, 0x73e4, 0x11b0, 0x080c, 0x76e8, 0x080c, 0x5f41,
-	0x080c, 0x3328, 0x0118, 0x6130, 0xc18d, 0x6132, 0x080c, 0xce35,
-	0x0130, 0x080c, 0x7407, 0x1118, 0x080c, 0x73b8, 0x0038, 0x080c,
-	0x7315, 0x0020, 0x080c, 0x5f06, 0x080c, 0x5dfc, 0x0804, 0x3533,
-	0x81ff, 0x1904, 0x3565, 0x080c, 0x73e4, 0x1110, 0x0804, 0x3565,
-	0x6194, 0x81ff, 0x01a8, 0x704f, 0x0000, 0x2001, 0x1d80, 0x2009,
-	0x0040, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0126, 0x2091, 0x8000,
-	0x2039, 0x0001, 0x080c, 0x4a24, 0x701f, 0x3531, 0x012e, 0x0005,
-	0x704f, 0x0001, 0x00d6, 0x2069, 0x1d80, 0x20a9, 0x0040, 0x20e9,
-	0x0001, 0x20a1, 0x1d80, 0x2019, 0xffff, 0x4304, 0x655c, 0x9588,
-	0x3334, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e, 0x2011, 0x0002,
-	0x2100, 0x9506, 0x01a8, 0x080c, 0x652d, 0x1190, 0xb814, 0x821c,
-	0x0238, 0x9398, 0x1d80, 0x9085, 0xff00, 0x8007, 0x201a, 0x0038,
-	0x9398, 0x1d80, 0x2324, 0x94a4, 0xff00, 0x9405, 0x201a, 0x8210,
-	0x8108, 0x9182, 0x0080, 0x1208, 0x0c18, 0x8201, 0x8007, 0x2d0c,
-	0x9105, 0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1, 0x1d80, 0x2099,
-	0x1d80, 0x080c, 0x5e91, 0x0804, 0x4425, 0x080c, 0x4a0b, 0x0904,
-	0x3568, 0x080c, 0x49d8, 0x1120, 0x2009, 0x0002, 0x0804, 0x3565,
-	0x080c, 0x55fc, 0xd0b4, 0x0558, 0x7884, 0x908e, 0x007e, 0x0538,
-	0x908e, 0x007f, 0x0520, 0x908e, 0x0080, 0x0508, 0x080c, 0x3323,
-	0x1148, 0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084, 0x00ff, 0x9086,
-	0x0006, 0x11a8, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c,
-	0xc8eb, 0x1120, 0x2009, 0x0003, 0x0804, 0x3565, 0x7007, 0x0003,
-	0x701f, 0x44b3, 0x0005, 0x080c, 0x4a0b, 0x0904, 0x3568, 0x20a9,
-	0x002b, 0xb8c4, 0x20e0, 0xb8c8, 0x2098, 0xa860, 0x20e8, 0xa85c,
-	0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080, 0x0006,
-	0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098, 0x080c,
-	0x0fb8, 0x0070, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x000a, 0x20a0,
-	0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0fb8,
-	0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080,
-	0x0002, 0x2009, 0x002b, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804,
-	0x4a24, 0x81ff, 0x1904, 0x3565, 0x080c, 0x49ef, 0x0904, 0x3568,
-	0x080c, 0x676e, 0x0904, 0x3565, 0x0058, 0xa878, 0x9005, 0x0120,
-	0x2009, 0x0004, 0x0804, 0x3565, 0xa974, 0xaa94, 0x0804, 0x3533,
-	0x080c, 0x5604, 0x0904, 0x3533, 0x701f, 0x44fd, 0x7007, 0x0003,
-	0x0005, 0x81ff, 0x1904, 0x3565, 0x7888, 0x908a, 0x1000, 0x1a04,
-	0x3568, 0x080c, 0x4a0b, 0x0904, 0x3568, 0x080c, 0x696a, 0x0120,
-	0x080c, 0x6972, 0x1904, 0x3568, 0x080c, 0x67f3, 0x0904, 0x3565,
-	0x2019, 0x0004, 0x900e, 0x080c, 0x6780, 0x0904, 0x3565, 0x7984,
-	0x7a88, 0x04c9, 0x08a8, 0xa89c, 0x908a, 0x1000, 0x12f8, 0x080c,
-	0x4a09, 0x01e0, 0x080c, 0x696a, 0x0118, 0x080c, 0x6972, 0x11b0,
-	0x080c, 0x67f3, 0x2009, 0x0002, 0x0168, 0x2009, 0x0002, 0x2019,
-	0x0004, 0x080c, 0x6780, 0x2009, 0x0003, 0x0120, 0xa998, 0xaa9c,
-	0x00d1, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006,
-	0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000,
-	0x080c, 0x5604, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, 0x0001,
-	0x2001, 0x0000, 0x0005, 0x9186, 0x00ff, 0x0110, 0x0071, 0x0060,
-	0x2029, 0x007e, 0x2061, 0x1800, 0x645c, 0x2400, 0x9506, 0x0110,
-	0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c, 0x652d, 0x1138,
-	0x2200, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x8519, 0x0005,
-	0x81ff, 0x1904, 0x3565, 0x080c, 0x49ef, 0x0904, 0x3568, 0x080c,
-	0x65f4, 0x0904, 0x3565, 0x080c, 0x6777, 0x0904, 0x3565, 0x0804,
-	0x4508, 0x81ff, 0x1904, 0x3565, 0x080c, 0x49ef, 0x0904, 0x3568,
-	0x080c, 0x696a, 0x0120, 0x080c, 0x6972, 0x1904, 0x3568, 0x080c,
-	0x65f4, 0x0904, 0x3565, 0x080c, 0x6765, 0x0904, 0x3565, 0x0804,
-	0x4508, 0x6100, 0x0804, 0x3533, 0x080c, 0x4a0b, 0x0904, 0x3568,
-	0x080c, 0x5610, 0x1904, 0x3565, 0x79a8, 0xd184, 0x1158, 0xb834,
+	0x419a, 0x1d68, 0x2900, 0xa85a, 0x00d8, 0x080c, 0x4aa0, 0x2940,
+	0xa013, 0x0019, 0xa017, 0x0001, 0x2800, 0xa05a, 0x2001, 0x0030,
+	0x2004, 0xa066, 0x2001, 0x0031, 0x2004, 0xa06a, 0x2001, 0x002a,
+	0x2004, 0x9084, 0xfff8, 0xa06e, 0x2001, 0x002b, 0x2004, 0xa072,
+	0x2001, 0x032a, 0x2003, 0x0004, 0x7884, 0xd0ac, 0x1180, 0x2001,
+	0x0101, 0x200c, 0x918d, 0x0200, 0x2102, 0xa017, 0x0000, 0x2001,
+	0x1a6b, 0x2003, 0x0003, 0x2001, 0x032a, 0x2003, 0x0009, 0x2001,
+	0x0300, 0x2003, 0x0000, 0x2001, 0x020d, 0x2003, 0x0000, 0x2001,
+	0x0004, 0x200c, 0x918d, 0x0002, 0x2102, 0x00ee, 0x0005, 0x0126,
+	0x2091, 0x8000, 0x20a9, 0x0007, 0x20a1, 0x1840, 0x20e9, 0x0001,
+	0x9006, 0x4004, 0x20a9, 0x000c, 0x20a1, 0xfff4, 0x20e9, 0x0000,
+	0x9006, 0x4004, 0x2009, 0x013c, 0x200a, 0x012e, 0x7880, 0x9086,
+	0x0052, 0x0108, 0x0005, 0x0804, 0x356c, 0x7d98, 0x7c9c, 0x0804,
+	0x3663, 0x080c, 0x74d5, 0x190c, 0x5fe7, 0x6040, 0x9084, 0x0020,
+	0x09b1, 0x2069, 0x1847, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88,
+	0x7c9c, 0x7d98, 0x2039, 0x0001, 0x080c, 0x4ae9, 0x701f, 0x4279,
+	0x0005, 0x080c, 0x56e2, 0x1130, 0x3b00, 0x3a08, 0xc194, 0xc095,
+	0x20d8, 0x21d0, 0x2069, 0x1847, 0x6800, 0x9005, 0x0904, 0x35a1,
+	0x6804, 0xd0ac, 0x0118, 0xd0a4, 0x0904, 0x35a1, 0xd094, 0x00c6,
+	0x2061, 0x0100, 0x6104, 0x0138, 0x6200, 0x9292, 0x0005, 0x0218,
+	0x918c, 0xffdf, 0x0010, 0x918d, 0x0020, 0x6106, 0x00ce, 0xd08c,
+	0x00c6, 0x2061, 0x0100, 0x6104, 0x0118, 0x918d, 0x0010, 0x0010,
+	0x918c, 0xffef, 0x6106, 0x00ce, 0xd084, 0x0158, 0x6a28, 0x928a,
+	0x007f, 0x1a04, 0x35a1, 0x9288, 0x336d, 0x210d, 0x918c, 0x00ff,
+	0x6166, 0xd0dc, 0x0130, 0x6828, 0x908a, 0x007f, 0x1a04, 0x35a1,
+	0x605e, 0x6888, 0x9084, 0x0030, 0x8004, 0x8004, 0x8004, 0x8004,
+	0x0006, 0x2009, 0x19b1, 0x9080, 0x2737, 0x2005, 0x200a, 0x2008,
+	0x2001, 0x0018, 0x080c, 0xa863, 0x2009, 0x0390, 0x200b, 0x0400,
+	0x000e, 0x2009, 0x19b2, 0x9080, 0x273b, 0x2005, 0x200a, 0x6808,
+	0x908a, 0x0100, 0x0a04, 0x35a1, 0x908a, 0x0841, 0x1a04, 0x35a1,
+	0x9084, 0x0007, 0x1904, 0x35a1, 0x680c, 0x9005, 0x0904, 0x35a1,
+	0x6810, 0x9005, 0x0904, 0x35a1, 0x6848, 0x6940, 0x910a, 0x1a04,
+	0x35a1, 0x8001, 0x0904, 0x35a1, 0x684c, 0x6944, 0x910a, 0x1a04,
+	0x35a1, 0x8001, 0x0904, 0x35a1, 0x6814, 0x908c, 0x00ff, 0x614e,
+	0x8007, 0x9084, 0x00ff, 0x6052, 0x080c, 0x780a, 0x080c, 0x6a91,
+	0x080c, 0x6ac5, 0x6808, 0x602a, 0x080c, 0x2122, 0x2009, 0x0170,
+	0x200b, 0x0080, 0xa001, 0xa001, 0x200b, 0x0000, 0x0036, 0x6b08,
+	0x080c, 0x269e, 0x003e, 0x6000, 0x9086, 0x0000, 0x1904, 0x4404,
+	0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f,
+	0x6016, 0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0148, 0x6830,
+	0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f, 0x0010,
+	0x9084, 0xf0ff, 0x6006, 0x610a, 0x620e, 0x6312, 0x8007, 0x810f,
+	0x8217, 0x831f, 0x20a9, 0x0004, 0x20a1, 0x19b3, 0x20e9, 0x0001,
+	0x4001, 0x20a9, 0x0004, 0x20a1, 0x19cd, 0x20e9, 0x0001, 0x4001,
+	0x080c, 0x87a0, 0x00c6, 0x900e, 0x20a9, 0x0001, 0x6b70, 0xd384,
+	0x01c8, 0x0020, 0x839d, 0x12b0, 0x3508, 0x8109, 0x080c, 0x7dcb,
+	0x6878, 0x6016, 0x6874, 0x2008, 0x9084, 0xff00, 0x8007, 0x600a,
+	0x9184, 0x00ff, 0x6006, 0x8108, 0x1118, 0x6003, 0x0003, 0x0010,
+	0x6003, 0x0001, 0x1f04, 0x4362, 0x00ce, 0x00c6, 0x2061, 0x199c,
+	0x6a88, 0x9284, 0xc000, 0x2010, 0x9286, 0x0000, 0x1158, 0x2063,
+	0x0000, 0x2001, 0x0001, 0x080c, 0x2945, 0x2001, 0x0001, 0x080c,
+	0x2928, 0x0088, 0x9286, 0x4000, 0x1148, 0x2063, 0x0001, 0x9006,
+	0x080c, 0x2945, 0x9006, 0x080c, 0x2928, 0x0028, 0x9286, 0x8000,
+	0x1d30, 0x2063, 0x0002, 0x00ce, 0x00e6, 0x2c70, 0x080c, 0x0eb4,
+	0x00ee, 0x6888, 0xd0ec, 0x0130, 0x2011, 0x0114, 0x2204, 0x9085,
+	0x0180, 0x2012, 0x6a80, 0x9284, 0x0030, 0x9086, 0x0030, 0x1128,
+	0x9294, 0xffcf, 0x9295, 0x0020, 0x6a82, 0x2001, 0x197c, 0x6a80,
+	0x9294, 0x0030, 0x928e, 0x0000, 0x0170, 0x928e, 0x0010, 0x0118,
+	0x928e, 0x0020, 0x0140, 0x2003, 0xaaaa, 0x080c, 0x2713, 0x2001,
+	0x196d, 0x2102, 0x0008, 0x2102, 0x00c6, 0x2061, 0x0100, 0x602f,
+	0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, 0x74d5, 0x0128, 0x080c,
+	0x4fd7, 0x0110, 0x080c, 0x2664, 0x60d4, 0x9005, 0x01c0, 0x6003,
+	0x0001, 0x2009, 0x43ec, 0x00e0, 0x080c, 0x74d5, 0x1168, 0x2011,
+	0x734b, 0x080c, 0x860d, 0x2011, 0x733e, 0x080c, 0x8719, 0x080c,
+	0x77de, 0x080c, 0x7406, 0x0040, 0x080c, 0x5edd, 0x0028, 0x6003,
+	0x0004, 0x2009, 0x4404, 0x0020, 0x080c, 0x69c6, 0x0804, 0x356c,
+	0x2001, 0x0170, 0x2004, 0x9084, 0x00ff, 0x9086, 0x004c, 0x1118,
+	0x2091, 0x31bd, 0x0817, 0x2091, 0x313d, 0x0817, 0x6000, 0x9086,
+	0x0000, 0x0904, 0x359e, 0x2069, 0x1847, 0x7890, 0x6842, 0x7894,
+	0x6846, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98,
+	0x2039, 0x0001, 0x0804, 0x4aec, 0x9006, 0x080c, 0x2664, 0x81ff,
+	0x1904, 0x359e, 0x080c, 0x74d5, 0x11b0, 0x080c, 0x77d9, 0x080c,
+	0x6022, 0x080c, 0x3361, 0x0118, 0x6130, 0xc18d, 0x6132, 0x080c,
+	0xcf2e, 0x0130, 0x080c, 0x74f8, 0x1118, 0x080c, 0x74a9, 0x0038,
+	0x080c, 0x7406, 0x0020, 0x080c, 0x5fe7, 0x080c, 0x5edd, 0x0804,
+	0x356c, 0x81ff, 0x1904, 0x359e, 0x080c, 0x74d5, 0x1110, 0x0804,
+	0x359e, 0x6194, 0x81ff, 0x01a8, 0x704f, 0x0000, 0x2001, 0x1d80,
+	0x2009, 0x0040, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0126, 0x2091,
+	0x8000, 0x2039, 0x0001, 0x080c, 0x4aec, 0x701f, 0x356a, 0x012e,
+	0x0005, 0x704f, 0x0001, 0x00d6, 0x2069, 0x1d80, 0x20a9, 0x0040,
+	0x20e9, 0x0001, 0x20a1, 0x1d80, 0x2019, 0xffff, 0x4304, 0x655c,
+	0x9588, 0x336d, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e, 0x2011,
+	0x0002, 0x2100, 0x9506, 0x01a8, 0x080c, 0x661e, 0x1190, 0xb814,
+	0x821c, 0x0238, 0x9398, 0x1d80, 0x9085, 0xff00, 0x8007, 0x201a,
+	0x0038, 0x9398, 0x1d80, 0x2324, 0x94a4, 0xff00, 0x9405, 0x201a,
+	0x8210, 0x8108, 0x9182, 0x0080, 0x1208, 0x0c18, 0x8201, 0x8007,
+	0x2d0c, 0x9105, 0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1, 0x1d80,
+	0x2099, 0x1d80, 0x080c, 0x5f72, 0x0804, 0x445e, 0x080c, 0x4ad3,
+	0x0904, 0x35a1, 0x080c, 0x4aa0, 0x1120, 0x2009, 0x0002, 0x0804,
+	0x359e, 0x080c, 0x56d3, 0xd0b4, 0x0558, 0x7884, 0x908e, 0x007e,
+	0x0538, 0x908e, 0x007f, 0x0520, 0x908e, 0x0080, 0x0508, 0x080c,
+	0x335c, 0x1148, 0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084, 0x00ff,
+	0x9086, 0x0006, 0x11a8, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a,
+	0x080c, 0xc9e3, 0x1120, 0x2009, 0x0003, 0x0804, 0x359e, 0x7007,
+	0x0003, 0x701f, 0x44ec, 0x0005, 0x080c, 0x4ad3, 0x0904, 0x35a1,
+	0x20a9, 0x002b, 0xb8c4, 0x20e0, 0xb8c8, 0x2098, 0xa860, 0x20e8,
+	0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080,
+	0x0006, 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098,
+	0x080c, 0x0fb7, 0x0070, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x000a,
+	0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x000a, 0x2098, 0x080c,
+	0x0fb7, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0,
+	0x9080, 0x0002, 0x2009, 0x002b, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98,
+	0x0804, 0x4aec, 0x81ff, 0x1904, 0x359e, 0x080c, 0x4ab7, 0x0904,
+	0x35a1, 0x080c, 0x685f, 0x0904, 0x359e, 0x0058, 0xa878, 0x9005,
+	0x0120, 0x2009, 0x0004, 0x0804, 0x359e, 0xa974, 0xaa94, 0x0804,
+	0x356c, 0x080c, 0x56db, 0x0904, 0x356c, 0x701f, 0x4536, 0x7007,
+	0x0003, 0x0005, 0x81ff, 0x1904, 0x359e, 0x7888, 0x908a, 0x1000,
+	0x1a04, 0x35a1, 0x080c, 0x4ad3, 0x0904, 0x35a1, 0x080c, 0x6a5b,
+	0x0120, 0x080c, 0x6a63, 0x1904, 0x35a1, 0x080c, 0x68e4, 0x0904,
+	0x359e, 0x2019, 0x0004, 0x900e, 0x080c, 0x6871, 0x0904, 0x359e,
+	0x7984, 0x7a88, 0x04c9, 0x08a8, 0xa89c, 0x908a, 0x1000, 0x12f8,
+	0x080c, 0x4ad1, 0x01e0, 0x080c, 0x6a5b, 0x0118, 0x080c, 0x6a63,
+	0x11b0, 0x080c, 0x68e4, 0x2009, 0x0002, 0x0168, 0x2009, 0x0002,
+	0x2019, 0x0004, 0x080c, 0x6871, 0x2009, 0x0003, 0x0120, 0xa998,
+	0xaa9c, 0x00d1, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897,
+	0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897,
+	0x4000, 0x080c, 0x56db, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085,
+	0x0001, 0x2001, 0x0000, 0x0005, 0x9186, 0x00ff, 0x0110, 0x0071,
+	0x0060, 0x2029, 0x007e, 0x2061, 0x1800, 0x645c, 0x2400, 0x9506,
+	0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c, 0x661e,
+	0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x861b,
+	0x0005, 0x81ff, 0x1904, 0x359e, 0x798c, 0x2001, 0x1980, 0x918c,
+	0x8000, 0x2102, 0x080c, 0x4ab7, 0x0904, 0x35a1, 0x080c, 0x6a5b,
+	0x0120, 0x080c, 0x6a63, 0x1904, 0x35a1, 0x080c, 0x66e5, 0x0904,
+	0x359e, 0x080c, 0x6868, 0x0904, 0x359e, 0x2001, 0x1980, 0x2004,
+	0xd0fc, 0x1904, 0x356c, 0x0804, 0x4541, 0xa9a0, 0x2001, 0x1980,
+	0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, 0x4ac4, 0x01a0, 0x080c,
+	0x6a5b, 0x0118, 0x080c, 0x6a63, 0x1170, 0x080c, 0x66e5, 0x2009,
+	0x0002, 0x0128, 0x080c, 0x6868, 0x1170, 0x2009, 0x0003, 0xa897,
+	0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001,
+	0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x2001, 0x1980, 0x2004,
+	0xd0fc, 0x1128, 0x080c, 0x56db, 0x0110, 0x9006, 0x0018, 0x900e,
+	0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x81ff, 0x1904, 0x359e,
+	0x798c, 0x2001, 0x197f, 0x918c, 0x8000, 0x2102, 0x080c, 0x4ab7,
+	0x0904, 0x35a1, 0x080c, 0x6a5b, 0x0120, 0x080c, 0x6a63, 0x1904,
+	0x35a1, 0x080c, 0x66e5, 0x0904, 0x359e, 0x080c, 0x6856, 0x0904,
+	0x359e, 0x2001, 0x197f, 0x2004, 0xd0fc, 0x1904, 0x356c, 0x0804,
+	0x4541, 0xa9a0, 0x2001, 0x197f, 0x918c, 0x8000, 0xc18d, 0x2102,
+	0x080c, 0x4ac4, 0x01a0, 0x080c, 0x6a5b, 0x0118, 0x080c, 0x6a63,
+	0x1170, 0x080c, 0x66e5, 0x2009, 0x0002, 0x0128, 0x080c, 0x6856,
+	0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897,
+	0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897,
+	0x4000, 0x2001, 0x197f, 0x2004, 0xd0fc, 0x1128, 0x080c, 0x56db,
+	0x0110, 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000,
+	0x0005, 0x6100, 0x0804, 0x356c, 0x080c, 0x4ad3, 0x0904, 0x35a1,
+	0x080c, 0x56e7, 0x1904, 0x359e, 0x79a8, 0xd184, 0x1158, 0xb834,
 	0x8007, 0x789e, 0xb830, 0x8007, 0x789a, 0xbb2c, 0x831f, 0xba28,
 	0x8217, 0x0050, 0xb824, 0x8007, 0x789e, 0xb820, 0x8007, 0x789a,
 	0xbb1c, 0x831f, 0xba18, 0x8217, 0xb900, 0x918c, 0x0200, 0x0804,
-	0x3533, 0x78a8, 0x909c, 0x0003, 0xd0b4, 0x1140, 0x939a, 0x0003,
-	0x1a04, 0x3565, 0x625c, 0x7884, 0x9206, 0x1548, 0x080c, 0x8685,
+	0x356c, 0x78a8, 0x909c, 0x0003, 0xd0b4, 0x1140, 0x939a, 0x0003,
+	0x1a04, 0x359e, 0x625c, 0x7884, 0x9206, 0x1548, 0x080c, 0x878a,
 	0x2001, 0xfff4, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98,
 	0x2039, 0x0000, 0x0006, 0x78a8, 0x9084, 0x0080, 0x1118, 0x000e,
-	0x0804, 0x4a24, 0x000e, 0x2031, 0x0000, 0x2061, 0x18b8, 0x2c44,
+	0x0804, 0x4aec, 0x000e, 0x2031, 0x0000, 0x2061, 0x18b8, 0x2c44,
 	0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a,
-	0x080c, 0x111b, 0x7007, 0x0002, 0x701f, 0x462f, 0x0005, 0x81ff,
-	0x1904, 0x3565, 0x080c, 0x4a0b, 0x0904, 0x3568, 0x080c, 0x696a,
-	0x1904, 0x3565, 0x00c6, 0x080c, 0x49d8, 0x00ce, 0x0904, 0x3565,
-	0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7ea8, 0x080c, 0xc891,
-	0x0904, 0x3565, 0x7007, 0x0003, 0x701f, 0x4633, 0x0005, 0x080c,
-	0x4206, 0x0804, 0x3533, 0xa830, 0x9086, 0x0100, 0x0904, 0x3565,
+	0x080c, 0x1124, 0x7007, 0x0002, 0x701f, 0x46f7, 0x0005, 0x81ff,
+	0x1904, 0x359e, 0x080c, 0x4ad3, 0x0904, 0x35a1, 0x080c, 0x6a5b,
+	0x1904, 0x359e, 0x00c6, 0x080c, 0x4aa0, 0x00ce, 0x0904, 0x359e,
+	0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7ea8, 0x080c, 0xc989,
+	0x0904, 0x359e, 0x7007, 0x0003, 0x701f, 0x46fb, 0x0005, 0x080c,
+	0x423f, 0x0804, 0x356c, 0xa830, 0x9086, 0x0100, 0x0904, 0x359e,
 	0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080,
 	0x001b, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804,
-	0x4a24, 0x9006, 0x080c, 0x2638, 0x78a8, 0x9084, 0x00ff, 0x9086,
-	0x00ff, 0x0118, 0x81ff, 0x1904, 0x3565, 0x080c, 0x73e4, 0x0110,
-	0x080c, 0x5f06, 0x7888, 0x908a, 0x1000, 0x1a04, 0x3568, 0x7984,
-	0x9186, 0x00ff, 0x0138, 0x9182, 0x007f, 0x1a04, 0x3568, 0x2100,
-	0x080c, 0x2602, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2061,
-	0x1a01, 0x601b, 0x0000, 0x601f, 0x0000, 0x6073, 0x0000, 0x6077,
-	0x0000, 0x080c, 0x73e4, 0x1158, 0x080c, 0x76e8, 0x080c, 0x5f41,
-	0x9085, 0x0001, 0x080c, 0x742b, 0x080c, 0x7315, 0x00f0, 0x080c,
-	0xa781, 0x080c, 0xaa49, 0x080c, 0xa79d, 0x2061, 0x0100, 0x2001,
+	0x4aec, 0x9006, 0x080c, 0x2664, 0x78a8, 0x9084, 0x00ff, 0x9086,
+	0x00ff, 0x0118, 0x81ff, 0x1904, 0x359e, 0x080c, 0x74d5, 0x0110,
+	0x080c, 0x5fe7, 0x7888, 0x908a, 0x1000, 0x1a04, 0x35a1, 0x7984,
+	0x9186, 0x00ff, 0x0138, 0x9182, 0x007f, 0x1a04, 0x35a1, 0x2100,
+	0x080c, 0x262e, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2061,
+	0x1a03, 0x601b, 0x0000, 0x601f, 0x0000, 0x6073, 0x0000, 0x6077,
+	0x0000, 0x080c, 0x74d5, 0x1158, 0x080c, 0x77d9, 0x080c, 0x6022,
+	0x9085, 0x0001, 0x080c, 0x751c, 0x080c, 0x7406, 0x00f0, 0x080c,
+	0xa872, 0x080c, 0xab3a, 0x080c, 0xa88e, 0x2061, 0x0100, 0x2001,
 	0x1818, 0x2004, 0x9084, 0x00ff, 0x810f, 0x9105, 0x604a, 0x6043,
-	0x0090, 0x6043, 0x0010, 0x2009, 0x1997, 0x200b, 0x0000, 0x2009,
-	0x002d, 0x2011, 0x5e2c, 0x080c, 0x85d2, 0x7984, 0x080c, 0x73e4,
-	0x1110, 0x2009, 0x00ff, 0x7a88, 0x080c, 0x456b, 0x012e, 0x00ce,
-	0x002e, 0x0804, 0x3533, 0x7984, 0x080c, 0x64cc, 0x2b08, 0x1904,
-	0x3568, 0x0804, 0x3533, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804,
-	0x3565, 0x60dc, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005,
-	0x0804, 0x3565, 0x080c, 0x49d8, 0x1120, 0x2009, 0x0002, 0x0804,
-	0x3565, 0x7984, 0x9192, 0x0021, 0x1a04, 0x3568, 0x7a8c, 0x7b88,
+	0x0090, 0x6043, 0x0010, 0x2009, 0x1999, 0x200b, 0x0000, 0x2009,
+	0x002d, 0x2011, 0x5f0d, 0x080c, 0x86d7, 0x7984, 0x080c, 0x74d5,
+	0x1110, 0x2009, 0x00ff, 0x7a88, 0x080c, 0x45a4, 0x012e, 0x00ce,
+	0x002e, 0x0804, 0x356c, 0x7984, 0x080c, 0x65bd, 0x2b08, 0x1904,
+	0x35a1, 0x0804, 0x356c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804,
+	0x359e, 0x60dc, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005,
+	0x0804, 0x359e, 0x080c, 0x4aa0, 0x1120, 0x2009, 0x0002, 0x0804,
+	0x359e, 0x7984, 0x9192, 0x0021, 0x1a04, 0x35a1, 0x7a8c, 0x7b88,
 	0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0x702a, 0xaf60, 0x7736,
-	0x080c, 0x4a21, 0x701f, 0x46eb, 0x7880, 0x9086, 0x006e, 0x0110,
-	0x701f, 0x50c1, 0x0005, 0x2009, 0x0080, 0x080c, 0x652d, 0x1118,
-	0x080c, 0x696a, 0x0120, 0x2021, 0x400a, 0x0804, 0x3535, 0x00d6,
+	0x080c, 0x4ae9, 0x701f, 0x47b3, 0x7880, 0x9086, 0x006e, 0x0110,
+	0x701f, 0x5189, 0x0005, 0x2009, 0x0080, 0x080c, 0x661e, 0x1118,
+	0x080c, 0x6a5b, 0x0120, 0x2021, 0x400a, 0x0804, 0x356e, 0x00d6,
 	0x0096, 0xa964, 0xaa6c, 0xab70, 0xac74, 0xad78, 0xae7c, 0xa884,
-	0x90be, 0x0100, 0x0904, 0x4784, 0x90be, 0x0112, 0x0904, 0x4784,
-	0x90be, 0x0113, 0x0904, 0x4784, 0x90be, 0x0114, 0x0904, 0x4784,
-	0x90be, 0x0117, 0x0904, 0x4784, 0x90be, 0x011a, 0x0904, 0x4784,
-	0x90be, 0x011c, 0x0904, 0x4784, 0x90be, 0x0121, 0x0904, 0x476b,
-	0x90be, 0x0131, 0x0904, 0x476b, 0x90be, 0x0171, 0x0904, 0x4784,
-	0x90be, 0x0173, 0x0904, 0x4784, 0x90be, 0x01a1, 0x1128, 0xa894,
-	0x8007, 0xa896, 0x0804, 0x478f, 0x90be, 0x0212, 0x0904, 0x4778,
+	0x90be, 0x0100, 0x0904, 0x484c, 0x90be, 0x0112, 0x0904, 0x484c,
+	0x90be, 0x0113, 0x0904, 0x484c, 0x90be, 0x0114, 0x0904, 0x484c,
+	0x90be, 0x0117, 0x0904, 0x484c, 0x90be, 0x011a, 0x0904, 0x484c,
+	0x90be, 0x011c, 0x0904, 0x484c, 0x90be, 0x0121, 0x0904, 0x4833,
+	0x90be, 0x0131, 0x0904, 0x4833, 0x90be, 0x0171, 0x0904, 0x484c,
+	0x90be, 0x0173, 0x0904, 0x484c, 0x90be, 0x01a1, 0x1128, 0xa894,
+	0x8007, 0xa896, 0x0804, 0x4857, 0x90be, 0x0212, 0x0904, 0x4840,
 	0x90be, 0x0213, 0x05e8, 0x90be, 0x0214, 0x0500, 0x90be, 0x0217,
 	0x0188, 0x90be, 0x021a, 0x1120, 0xa89c, 0x8007, 0xa89e, 0x04e0,
 	0x90be, 0x021f, 0x05c8, 0x90be, 0x0300, 0x05b0, 0x009e, 0x00de,
-	0x0804, 0x3568, 0x7028, 0x9080, 0x0010, 0x2098, 0x20a0, 0x7034,
-	0x20e0, 0x20e8, 0x20a9, 0x0007, 0x080c, 0x47cd, 0x7028, 0x9080,
+	0x0804, 0x35a1, 0x7028, 0x9080, 0x0010, 0x2098, 0x20a0, 0x7034,
+	0x20e0, 0x20e8, 0x20a9, 0x0007, 0x080c, 0x4895, 0x7028, 0x9080,
 	0x000e, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001,
-	0x080c, 0x47cd, 0x00c8, 0x7028, 0x9080, 0x000c, 0x2098, 0x20a0,
-	0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x47da, 0x00b8,
+	0x080c, 0x4895, 0x00c8, 0x7028, 0x9080, 0x000c, 0x2098, 0x20a0,
+	0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x48a2, 0x00b8,
 	0x7028, 0x9080, 0x000e, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8,
-	0x20a9, 0x0001, 0x080c, 0x47da, 0x7028, 0x9080, 0x000c, 0x2098,
+	0x20a9, 0x0001, 0x080c, 0x48a2, 0x7028, 0x9080, 0x000c, 0x2098,
 	0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x04f1, 0x00c6,
-	0x080c, 0x49d8, 0x0550, 0xa868, 0xc0fd, 0xa86a, 0xa867, 0x0119,
+	0x080c, 0x4aa0, 0x0550, 0xa868, 0xc0fd, 0xa86a, 0xa867, 0x0119,
 	0x9006, 0xa882, 0xa87f, 0x0020, 0xa88b, 0x0001, 0x810b, 0xa9ae,
 	0xa8b2, 0xaab6, 0xabba, 0xacbe, 0xadc2, 0xa9c6, 0xa8ca, 0x00ce,
 	0x009e, 0x00de, 0xa866, 0xa822, 0xa868, 0xc0fd, 0xa86a, 0xa804,
-	0x2048, 0x080c, 0xc8ac, 0x1120, 0x2009, 0x0003, 0x0804, 0x3565,
-	0x7007, 0x0003, 0x701f, 0x47c4, 0x0005, 0x00ce, 0x009e, 0x00de,
-	0x2009, 0x0002, 0x0804, 0x3565, 0xa820, 0x9086, 0x8001, 0x1904,
-	0x3533, 0x2009, 0x0004, 0x0804, 0x3565, 0x0016, 0x0026, 0x3510,
+	0x2048, 0x080c, 0xc9a4, 0x1120, 0x2009, 0x0003, 0x0804, 0x359e,
+	0x7007, 0x0003, 0x701f, 0x488c, 0x0005, 0x00ce, 0x009e, 0x00de,
+	0x2009, 0x0002, 0x0804, 0x359e, 0xa820, 0x9086, 0x8001, 0x1904,
+	0x356c, 0x2009, 0x0004, 0x0804, 0x359e, 0x0016, 0x0026, 0x3510,
 	0x20a9, 0x0002, 0x4002, 0x4104, 0x4004, 0x8211, 0x1dc8, 0x002e,
 	0x001e, 0x0005, 0x0016, 0x0026, 0x0036, 0x0046, 0x3520, 0x20a9,
 	0x0004, 0x4002, 0x4304, 0x4204, 0x4104, 0x4004, 0x8421, 0x1db8,
 	0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x81ff, 0x0120, 0x2009,
-	0x0001, 0x0804, 0x3565, 0x60dc, 0xd0ac, 0x1130, 0xd09c, 0x1120,
-	0x2009, 0x0005, 0x0804, 0x3565, 0x7984, 0x78a8, 0x2040, 0x080c,
-	0xaa42, 0x1120, 0x9182, 0x007f, 0x0a04, 0x3568, 0x9186, 0x00ff,
-	0x0904, 0x3568, 0x9182, 0x0800, 0x1a04, 0x3568, 0x7a8c, 0x7b88,
-	0x607c, 0x9306, 0x1140, 0x6080, 0x924e, 0x0904, 0x3568, 0x99cc,
-	0xff00, 0x0904, 0x3568, 0x0126, 0x2091, 0x8000, 0x080c, 0x48eb,
-	0x0904, 0x486b, 0x0086, 0x90c6, 0x4000, 0x008e, 0x1538, 0x00c6,
+	0x0001, 0x0804, 0x359e, 0x60dc, 0xd0ac, 0x1130, 0xd09c, 0x1120,
+	0x2009, 0x0005, 0x0804, 0x359e, 0x7984, 0x78a8, 0x2040, 0x080c,
+	0xab33, 0x1120, 0x9182, 0x007f, 0x0a04, 0x35a1, 0x9186, 0x00ff,
+	0x0904, 0x35a1, 0x9182, 0x0800, 0x1a04, 0x35a1, 0x7a8c, 0x7b88,
+	0x607c, 0x9306, 0x1140, 0x6080, 0x924e, 0x0904, 0x35a1, 0x99cc,
+	0xff00, 0x0904, 0x35a1, 0x0126, 0x2091, 0x8000, 0x080c, 0x49b3,
+	0x0904, 0x4933, 0x0086, 0x90c6, 0x4000, 0x008e, 0x1538, 0x00c6,
 	0x0006, 0x0036, 0xb818, 0xbb1c, 0x9305, 0xbb20, 0x9305, 0xbb24,
 	0x9305, 0xbb28, 0x9305, 0xbb2c, 0x9305, 0xbb30, 0x9305, 0xbb34,
-	0x9305, 0x003e, 0x0570, 0xd88c, 0x1128, 0x080c, 0x696a, 0x0110,
-	0xc89d, 0x0438, 0x900e, 0x080c, 0x681c, 0x1108, 0xc185, 0xb800,
+	0x9305, 0x003e, 0x0570, 0xd88c, 0x1128, 0x080c, 0x6a5b, 0x0110,
+	0xc89d, 0x0438, 0x900e, 0x080c, 0x690d, 0x1108, 0xc185, 0xb800,
 	0xd0bc, 0x0108, 0xc18d, 0x000e, 0x00ce, 0x00b8, 0x90c6, 0x4007,
 	0x1110, 0x2408, 0x0090, 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610,
 	0x0060, 0x90c6, 0x4009, 0x1108, 0x0040, 0x90c6, 0x4006, 0x1108,
 	0x0020, 0x2001, 0x4005, 0x2009, 0x000a, 0x2020, 0x012e, 0x0804,
-	0x3535, 0x000e, 0x00ce, 0x2b00, 0x7026, 0x0016, 0x00b6, 0x00c6,
-	0x00e6, 0x2c70, 0x080c, 0xab4a, 0x0904, 0x48c0, 0x2b00, 0x6012,
-	0x080c, 0xcbb0, 0x2e58, 0x00ee, 0x00e6, 0x00c6, 0x080c, 0x49d8,
-	0x00ce, 0x2b70, 0x1158, 0x080c, 0xaad8, 0x00ee, 0x00ce, 0x00be,
-	0x001e, 0x012e, 0x2009, 0x0002, 0x0804, 0x3565, 0x900e, 0xa966,
+	0x356e, 0x000e, 0x00ce, 0x2b00, 0x7026, 0x0016, 0x00b6, 0x00c6,
+	0x00e6, 0x2c70, 0x080c, 0xac3b, 0x0904, 0x4988, 0x2b00, 0x6012,
+	0x080c, 0xcca8, 0x2e58, 0x00ee, 0x00e6, 0x00c6, 0x080c, 0x4aa0,
+	0x00ce, 0x2b70, 0x1158, 0x080c, 0xabc9, 0x00ee, 0x00ce, 0x00be,
+	0x001e, 0x012e, 0x2009, 0x0002, 0x0804, 0x359e, 0x900e, 0xa966,
 	0xa96a, 0x2900, 0x6016, 0xa932, 0xa868, 0xc0fd, 0xd88c, 0x0108,
-	0xc0f5, 0xa86a, 0xd89c, 0x1110, 0x080c, 0x31ab, 0x6023, 0x0001,
-	0x9006, 0x080c, 0x6469, 0xd89c, 0x0138, 0x2001, 0x0004, 0x080c,
-	0x647d, 0x2009, 0x0003, 0x0030, 0x2001, 0x0002, 0x080c, 0x647d,
-	0x2009, 0x0002, 0x080c, 0xab77, 0x78a8, 0xd094, 0x0138, 0x00ee,
+	0xc0f5, 0xa86a, 0xd89c, 0x1110, 0x080c, 0x31e4, 0x6023, 0x0001,
+	0x9006, 0x080c, 0x655a, 0xd89c, 0x0138, 0x2001, 0x0004, 0x080c,
+	0x656e, 0x2009, 0x0003, 0x0030, 0x2001, 0x0002, 0x080c, 0x656e,
+	0x2009, 0x0002, 0x080c, 0xac68, 0x78a8, 0xd094, 0x0138, 0x00ee,
 	0x7024, 0x00e6, 0x2058, 0xb8d4, 0xc08d, 0xb8d6, 0x9085, 0x0001,
 	0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x1120, 0x2009, 0x0003,
-	0x0804, 0x3565, 0x7007, 0x0003, 0x701f, 0x48cf, 0x0005, 0xa830,
+	0x0804, 0x359e, 0x7007, 0x0003, 0x701f, 0x4997, 0x0005, 0xa830,
 	0x9086, 0x0100, 0x7024, 0x2058, 0x1138, 0x2009, 0x0004, 0xba04,
-	0x9294, 0x00ff, 0x0804, 0x5559, 0x900e, 0xa868, 0xd0f4, 0x1904,
-	0x3533, 0x080c, 0x681c, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108,
-	0xc18d, 0x0804, 0x3533, 0x00e6, 0x00d6, 0x0096, 0x83ff, 0x0904,
-	0x493a, 0x902e, 0x080c, 0xaa42, 0x0130, 0x9026, 0x20a9, 0x0800,
+	0x9294, 0x00ff, 0x0804, 0x5630, 0x900e, 0xa868, 0xd0f4, 0x1904,
+	0x356c, 0x080c, 0x690d, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108,
+	0xc18d, 0x0804, 0x356c, 0x00e6, 0x00d6, 0x0096, 0x83ff, 0x0904,
+	0x4a02, 0x902e, 0x080c, 0xab33, 0x0130, 0x9026, 0x20a9, 0x0800,
 	0x2071, 0x1000, 0x0030, 0x2021, 0x007f, 0x20a9, 0x0781, 0x2071,
-	0x107f, 0x2e04, 0x9005, 0x11b8, 0x2100, 0x9406, 0x1904, 0x494b,
+	0x107f, 0x2e04, 0x9005, 0x11b8, 0x2100, 0x9406, 0x1904, 0x4a13,
 	0x2428, 0x94ce, 0x007f, 0x1120, 0x92ce, 0xfffd, 0x1558, 0x0030,
 	0x94ce, 0x0080, 0x1130, 0x92ce, 0xfffc, 0x1520, 0x93ce, 0x00ff,
 	0x1508, 0xc5fd, 0x0480, 0x2058, 0xbf10, 0x2700, 0x9306, 0x11e8,
 	0xbe14, 0x2600, 0x9206, 0x11c8, 0x2400, 0x9106, 0x1180, 0xd884,
-	0x0598, 0xd894, 0x1588, 0x080c, 0x690a, 0x1570, 0x2001, 0x4000,
-	0x0460, 0x080c, 0x696a, 0x1540, 0x2001, 0x4000, 0x0430, 0x2001,
+	0x0598, 0xd894, 0x1588, 0x080c, 0x69fb, 0x1570, 0x2001, 0x4000,
+	0x0460, 0x080c, 0x6a5b, 0x1540, 0x2001, 0x4000, 0x0430, 0x2001,
 	0x4007, 0x0418, 0x2001, 0x4006, 0x0400, 0x2400, 0x9106, 0x1158,
-	0xbe14, 0x87ff, 0x1128, 0x86ff, 0x0918, 0x080c, 0xaa42, 0x1900,
-	0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, 0x4901, 0x85ff,
+	0xbe14, 0x87ff, 0x1128, 0x86ff, 0x0918, 0x080c, 0xab33, 0x1900,
+	0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, 0x49c9, 0x85ff,
 	0x1130, 0x2001, 0x4009, 0x0048, 0x2001, 0x0001, 0x0030, 0x080c,
-	0x64cc, 0x1dd0, 0xbb12, 0xba16, 0x9006, 0x9005, 0x009e, 0x00de,
-	0x00ee, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3565,
-	0x080c, 0x49d8, 0x1120, 0x2009, 0x0002, 0x0804, 0x3565, 0xa867,
-	0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7884, 0x9005, 0x0904, 0x3568,
-	0x9096, 0x00ff, 0x0120, 0x9092, 0x0004, 0x1a04, 0x3568, 0x2010,
-	0x2918, 0x080c, 0x3145, 0x1120, 0x2009, 0x0003, 0x0804, 0x3565,
-	0x7007, 0x0003, 0x701f, 0x498d, 0x0005, 0xa830, 0x9086, 0x0100,
-	0x1904, 0x3533, 0x2009, 0x0004, 0x0804, 0x3565, 0x7984, 0x080c,
-	0xaa42, 0x1120, 0x9182, 0x007f, 0x0a04, 0x3568, 0x9186, 0x00ff,
-	0x0904, 0x3568, 0x9182, 0x0800, 0x1a04, 0x3568, 0x2001, 0x9000,
-	0x080c, 0x55b4, 0x1904, 0x3565, 0x0804, 0x3533, 0xa998, 0x080c,
-	0xaa42, 0x1118, 0x9182, 0x007f, 0x0280, 0x9186, 0x00ff, 0x0168,
-	0x9182, 0x0800, 0x1250, 0x2001, 0x9000, 0x080c, 0x55b4, 0x11a8,
+	0x65bd, 0x1dd0, 0xbb12, 0xba16, 0x9006, 0x9005, 0x009e, 0x00de,
+	0x00ee, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x359e,
+	0x080c, 0x4aa0, 0x1120, 0x2009, 0x0002, 0x0804, 0x359e, 0xa867,
+	0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7884, 0x9005, 0x0904, 0x35a1,
+	0x9096, 0x00ff, 0x0120, 0x9092, 0x0004, 0x1a04, 0x35a1, 0x2010,
+	0x2918, 0x080c, 0x317e, 0x1120, 0x2009, 0x0003, 0x0804, 0x359e,
+	0x7007, 0x0003, 0x701f, 0x4a55, 0x0005, 0xa830, 0x9086, 0x0100,
+	0x1904, 0x356c, 0x2009, 0x0004, 0x0804, 0x359e, 0x7984, 0x080c,
+	0xab33, 0x1120, 0x9182, 0x007f, 0x0a04, 0x35a1, 0x9186, 0x00ff,
+	0x0904, 0x35a1, 0x9182, 0x0800, 0x1a04, 0x35a1, 0x2001, 0x9000,
+	0x080c, 0x568b, 0x1904, 0x359e, 0x0804, 0x356c, 0xa998, 0x080c,
+	0xab33, 0x1118, 0x9182, 0x007f, 0x0280, 0x9186, 0x00ff, 0x0168,
+	0x9182, 0x0800, 0x1250, 0x2001, 0x9000, 0x080c, 0x568b, 0x11a8,
 	0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e,
 	0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x900e,
 	0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x2009, 0x000a, 0x0c48,
-	0x080c, 0x103b, 0x0198, 0x9006, 0xa802, 0x7014, 0x9005, 0x1120,
+	0x080c, 0x103a, 0x0198, 0x9006, 0xa802, 0x7014, 0x9005, 0x1120,
 	0x2900, 0x7016, 0x701a, 0x0040, 0x7018, 0xa802, 0x0086, 0x2040,
 	0x2900, 0xa006, 0x701a, 0x008e, 0x9085, 0x0001, 0x0005, 0x7984,
-	0x080c, 0x652d, 0x1130, 0x7e88, 0x9684, 0x3fff, 0x9082, 0x4000,
-	0x0208, 0x905e, 0x8bff, 0x0005, 0xa998, 0x080c, 0x652d, 0x1130,
+	0x080c, 0x661e, 0x1130, 0x7e88, 0x9684, 0x3fff, 0x9082, 0x4000,
+	0x0208, 0x905e, 0x8bff, 0x0005, 0xa998, 0x080c, 0x661e, 0x1130,
 	0xae9c, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, 0x905e, 0x8bff,
-	0x0005, 0xae98, 0x0008, 0x7e84, 0x2608, 0x080c, 0x652d, 0x1108,
+	0x0005, 0xae98, 0x0008, 0x7e84, 0x2608, 0x080c, 0x661e, 0x1108,
 	0x0008, 0x905e, 0x8bff, 0x0005, 0x0016, 0x7114, 0x81ff, 0x0128,
-	0x2148, 0xa904, 0x080c, 0x106d, 0x0cc8, 0x7116, 0x711a, 0x001e,
+	0x2148, 0xa904, 0x080c, 0x106c, 0x0cc8, 0x7116, 0x711a, 0x001e,
 	0x0005, 0x2031, 0x0001, 0x0010, 0x2031, 0x0000, 0x2061, 0x18b8,
 	0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, 0xa496,
-	0xa59a, 0x080c, 0x111b, 0x7007, 0x0002, 0x701f, 0x3533, 0x0005,
+	0xa59a, 0x080c, 0x1124, 0x7007, 0x0002, 0x701f, 0x356c, 0x0005,
 	0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0000, 0x2001, 0x18b0,
-	0x2004, 0x9005, 0x1190, 0x0e04, 0x4a55, 0x7a36, 0x7833, 0x0012,
+	0x2004, 0x9005, 0x1190, 0x0e04, 0x4b1d, 0x7a36, 0x7833, 0x0012,
 	0x7a82, 0x7b86, 0x7c8a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
-	0xd084, 0x190c, 0x11cd, 0x0804, 0x4abb, 0x0016, 0x0086, 0x0096,
+	0xd084, 0x190c, 0x11d6, 0x0804, 0x4b83, 0x0016, 0x0086, 0x0096,
 	0x00c6, 0x00e6, 0x2071, 0x189e, 0x7044, 0x9005, 0x1540, 0x7148,
-	0x9182, 0x0010, 0x0288, 0x7038, 0x2060, 0x080c, 0x103b, 0x0904,
-	0x4ab3, 0xa84b, 0x0000, 0x2900, 0x7046, 0x2001, 0x0002, 0x9080,
-	0x1e31, 0x2005, 0xa846, 0x0098, 0x7038, 0x90e0, 0x0004, 0x2001,
+	0x9182, 0x0010, 0x0288, 0x7038, 0x2060, 0x080c, 0x103a, 0x0904,
+	0x4b7b, 0xa84b, 0x0000, 0x2900, 0x7046, 0x2001, 0x0002, 0x9080,
+	0x1e55, 0x2005, 0xa846, 0x0098, 0x7038, 0x90e0, 0x0004, 0x2001,
 	0x18ba, 0x9c82, 0x18fa, 0x0210, 0x2061, 0x18ba, 0x2c00, 0x703a,
 	0x7148, 0x81ff, 0x1108, 0x703e, 0x8108, 0x714a, 0x0460, 0x7148,
 	0x8108, 0x714a, 0x7044, 0x2040, 0xa144, 0x2105, 0x0016, 0x908a,
 	0x0036, 0x1a0c, 0x0d7d, 0x2060, 0x001e, 0x8108, 0x2105, 0x9005,
-	0xa146, 0x1520, 0x080c, 0x103b, 0x1130, 0x8109, 0xa946, 0x7148,
+	0xa146, 0x1520, 0x080c, 0x103a, 0x1130, 0x8109, 0xa946, 0x7148,
 	0x8109, 0x714a, 0x00d8, 0x9006, 0xa806, 0xa84a, 0xa046, 0x2800,
-	0xa802, 0x2900, 0xa006, 0x7046, 0x2001, 0x0002, 0x9080, 0x1e31,
+	0xa802, 0x2900, 0xa006, 0x7046, 0x2001, 0x0002, 0x9080, 0x1e55,
 	0x2005, 0xa846, 0x0058, 0x2262, 0x6306, 0x640a, 0x00ee, 0x00ce,
 	0x009e, 0x008e, 0x001e, 0x012e, 0x00fe, 0x0005, 0x2c00, 0x9082,
-	0x001b, 0x0002, 0x4add, 0x4add, 0x4adf, 0x4add, 0x4add, 0x4add,
-	0x4ae3, 0x4add, 0x4add, 0x4add, 0x4ae7, 0x4add, 0x4add, 0x4add,
-	0x4aeb, 0x4add, 0x4add, 0x4add, 0x4aef, 0x4add, 0x4add, 0x4add,
-	0x4af3, 0x4add, 0x4add, 0x4add, 0x4af8, 0x080c, 0x0d7d, 0xa276,
+	0x001b, 0x0002, 0x4ba5, 0x4ba5, 0x4ba7, 0x4ba5, 0x4ba5, 0x4ba5,
+	0x4bab, 0x4ba5, 0x4ba5, 0x4ba5, 0x4baf, 0x4ba5, 0x4ba5, 0x4ba5,
+	0x4bb3, 0x4ba5, 0x4ba5, 0x4ba5, 0x4bb7, 0x4ba5, 0x4ba5, 0x4ba5,
+	0x4bbb, 0x4ba5, 0x4ba5, 0x4ba5, 0x4bc0, 0x080c, 0x0d7d, 0xa276,
 	0xa37a, 0xa47e, 0x0898, 0xa286, 0xa38a, 0xa48e, 0x0878, 0xa296,
 	0xa39a, 0xa49e, 0x0858, 0xa2a6, 0xa3aa, 0xa4ae, 0x0838, 0xa2b6,
-	0xa3ba, 0xa4be, 0x0818, 0xa2c6, 0xa3ca, 0xa4ce, 0x0804, 0x4ab6,
-	0xa2d6, 0xa3da, 0xa4de, 0x0804, 0x4ab6, 0x00e6, 0x2071, 0x189e,
-	0x7048, 0x9005, 0x0904, 0x4b8f, 0x0126, 0x2091, 0x8000, 0x0e04,
-	0x4b8e, 0x00f6, 0x2079, 0x0000, 0x00c6, 0x0096, 0x0086, 0x0076,
+	0xa3ba, 0xa4be, 0x0818, 0xa2c6, 0xa3ca, 0xa4ce, 0x0804, 0x4b7e,
+	0xa2d6, 0xa3da, 0xa4de, 0x0804, 0x4b7e, 0x00e6, 0x2071, 0x189e,
+	0x7048, 0x9005, 0x0904, 0x4c57, 0x0126, 0x2091, 0x8000, 0x0e04,
+	0x4c56, 0x00f6, 0x2079, 0x0000, 0x00c6, 0x0096, 0x0086, 0x0076,
 	0x9006, 0x2038, 0x7040, 0x2048, 0x9005, 0x0500, 0xa948, 0x2105,
 	0x0016, 0x908a, 0x0036, 0x1a0c, 0x0d7d, 0x2060, 0x001e, 0x8108,
-	0x2105, 0x9005, 0xa94a, 0x1904, 0x4b91, 0xa804, 0x9005, 0x090c,
+	0x2105, 0x9005, 0xa94a, 0x1904, 0x4c59, 0xa804, 0x9005, 0x090c,
 	0x0d7d, 0x7042, 0x2938, 0x2040, 0xa003, 0x0000, 0x2001, 0x0002,
-	0x9080, 0x1e31, 0x2005, 0xa04a, 0x0804, 0x4b91, 0x703c, 0x2060,
+	0x9080, 0x1e55, 0x2005, 0xa04a, 0x0804, 0x4c59, 0x703c, 0x2060,
 	0x2c14, 0x6304, 0x6408, 0x650c, 0x2200, 0x7836, 0x7833, 0x0012,
 	0x7882, 0x2300, 0x7886, 0x2400, 0x788a, 0x2091, 0x4080, 0x2001,
-	0x0089, 0x2004, 0xd084, 0x190c, 0x11cd, 0x87ff, 0x0118, 0x2748,
-	0x080c, 0x106d, 0x7048, 0x8001, 0x704a, 0x9005, 0x1170, 0x7040,
-	0x2048, 0x9005, 0x0128, 0x080c, 0x106d, 0x9006, 0x7042, 0x7046,
+	0x0089, 0x2004, 0xd084, 0x190c, 0x11d6, 0x87ff, 0x0118, 0x2748,
+	0x080c, 0x106c, 0x7048, 0x8001, 0x704a, 0x9005, 0x1170, 0x7040,
+	0x2048, 0x9005, 0x0128, 0x080c, 0x106c, 0x9006, 0x7042, 0x7046,
 	0x703b, 0x18ba, 0x703f, 0x18ba, 0x0420, 0x7040, 0x9005, 0x1508,
 	0x7238, 0x2c00, 0x9206, 0x0148, 0x9c80, 0x0004, 0x90fa, 0x18fa,
 	0x0210, 0x2001, 0x18ba, 0x703e, 0x00a0, 0x9006, 0x703e, 0x703a,
 	0x7044, 0x9005, 0x090c, 0x0d7d, 0x2048, 0xa800, 0x9005, 0x1de0,
-	0x2900, 0x7042, 0x2001, 0x0002, 0x9080, 0x1e31, 0x2005, 0xa84a,
+	0x2900, 0x7042, 0x2001, 0x0002, 0x9080, 0x1e55, 0x2005, 0xa84a,
 	0x0000, 0x007e, 0x008e, 0x009e, 0x00ce, 0x00fe, 0x012e, 0x00ee,
-	0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, 0x4bb0, 0x4bb0, 0x4bb2,
-	0x4bb0, 0x4bb0, 0x4bb0, 0x4bb7, 0x4bb0, 0x4bb0, 0x4bb0, 0x4bbc,
-	0x4bb0, 0x4bb0, 0x4bb0, 0x4bc1, 0x4bb0, 0x4bb0, 0x4bb0, 0x4bc6,
-	0x4bb0, 0x4bb0, 0x4bb0, 0x4bcb, 0x4bb0, 0x4bb0, 0x4bb0, 0x4bd0,
-	0x080c, 0x0d7d, 0xaa74, 0xab78, 0xac7c, 0x0804, 0x4b3c, 0xaa84,
-	0xab88, 0xac8c, 0x0804, 0x4b3c, 0xaa94, 0xab98, 0xac9c, 0x0804,
-	0x4b3c, 0xaaa4, 0xaba8, 0xacac, 0x0804, 0x4b3c, 0xaab4, 0xabb8,
-	0xacbc, 0x0804, 0x4b3c, 0xaac4, 0xabc8, 0xaccc, 0x0804, 0x4b3c,
-	0xaad4, 0xabd8, 0xacdc, 0x0804, 0x4b3c, 0x0016, 0x0026, 0x0036,
-	0x00b6, 0x00c6, 0x2009, 0x007e, 0x080c, 0x652d, 0x2019, 0x0001,
+	0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, 0x4c78, 0x4c78, 0x4c7a,
+	0x4c78, 0x4c78, 0x4c78, 0x4c7f, 0x4c78, 0x4c78, 0x4c78, 0x4c84,
+	0x4c78, 0x4c78, 0x4c78, 0x4c89, 0x4c78, 0x4c78, 0x4c78, 0x4c8e,
+	0x4c78, 0x4c78, 0x4c78, 0x4c93, 0x4c78, 0x4c78, 0x4c78, 0x4c98,
+	0x080c, 0x0d7d, 0xaa74, 0xab78, 0xac7c, 0x0804, 0x4c04, 0xaa84,
+	0xab88, 0xac8c, 0x0804, 0x4c04, 0xaa94, 0xab98, 0xac9c, 0x0804,
+	0x4c04, 0xaaa4, 0xaba8, 0xacac, 0x0804, 0x4c04, 0xaab4, 0xabb8,
+	0xacbc, 0x0804, 0x4c04, 0xaac4, 0xabc8, 0xaccc, 0x0804, 0x4c04,
+	0xaad4, 0xabd8, 0xacdc, 0x0804, 0x4c04, 0x0016, 0x0026, 0x0036,
+	0x00b6, 0x00c6, 0x2009, 0x007e, 0x080c, 0x661e, 0x2019, 0x0001,
 	0xb85c, 0xd0ac, 0x0110, 0x2019, 0x0000, 0x2011, 0x801b, 0x080c,
-	0x4a38, 0x00ce, 0x00be, 0x003e, 0x002e, 0x001e, 0x0005, 0x0026,
-	0x080c, 0x55fc, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, 0x4a38,
-	0x002e, 0x0005, 0x81ff, 0x1904, 0x3565, 0x0126, 0x2091, 0x8000,
-	0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x73e4, 0x1158,
-	0x080c, 0x76e8, 0x080c, 0x5f41, 0x9085, 0x0001, 0x080c, 0x742b,
-	0x080c, 0x7315, 0x0010, 0x080c, 0x5dfc, 0x012e, 0x0804, 0x3533,
-	0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3565, 0x080c, 0x5610,
-	0x0120, 0x2009, 0x0007, 0x0804, 0x3565, 0x080c, 0x6962, 0x0120,
-	0x2009, 0x0008, 0x0804, 0x3565, 0x080c, 0x3323, 0x0128, 0x7984,
-	0x080c, 0x64cc, 0x1904, 0x3568, 0x080c, 0x4a0b, 0x0904, 0x3568,
-	0x2b00, 0x7026, 0x080c, 0x696a, 0x7888, 0x1170, 0x9084, 0x0005,
-	0x1158, 0x900e, 0x080c, 0x681c, 0x1108, 0xc185, 0xb800, 0xd0bc,
-	0x0108, 0xc18d, 0x0804, 0x3533, 0x080c, 0x49d8, 0x0904, 0x3565,
-	0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xc94e,
-	0x0904, 0x3565, 0x7888, 0xd094, 0x0118, 0xb8d4, 0xc08d, 0xb8d6,
-	0x7007, 0x0003, 0x701f, 0x4cb1, 0x0005, 0x2061, 0x1800, 0x080c,
-	0x5610, 0x2009, 0x0007, 0x1578, 0x080c, 0x6962, 0x0118, 0x2009,
-	0x0008, 0x0448, 0x080c, 0x3323, 0x0120, 0xa998, 0x080c, 0x64cc,
-	0x1530, 0x080c, 0x4a09, 0x0518, 0x080c, 0x696a, 0xa89c, 0x1168,
-	0x9084, 0x0005, 0x1150, 0x900e, 0x080c, 0x681c, 0x1108, 0xc185,
+	0x4b00, 0x00ce, 0x00be, 0x003e, 0x002e, 0x001e, 0x0005, 0x0026,
+	0x080c, 0x56d3, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, 0x4b00,
+	0x002e, 0x0005, 0x81ff, 0x1904, 0x359e, 0x0126, 0x2091, 0x8000,
+	0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x74d5, 0x1158,
+	0x080c, 0x77d9, 0x080c, 0x6022, 0x9085, 0x0001, 0x080c, 0x751c,
+	0x080c, 0x7406, 0x0010, 0x080c, 0x5edd, 0x012e, 0x0804, 0x356c,
+	0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x359e, 0x080c, 0x56e7,
+	0x0120, 0x2009, 0x0007, 0x0804, 0x359e, 0x080c, 0x6a53, 0x0120,
+	0x2009, 0x0008, 0x0804, 0x359e, 0x080c, 0x335c, 0x0128, 0x7984,
+	0x080c, 0x65bd, 0x1904, 0x35a1, 0x080c, 0x4ad3, 0x0904, 0x35a1,
+	0x2b00, 0x7026, 0x080c, 0x6a5b, 0x7888, 0x1170, 0x9084, 0x0005,
+	0x1158, 0x900e, 0x080c, 0x690d, 0x1108, 0xc185, 0xb800, 0xd0bc,
+	0x0108, 0xc18d, 0x0804, 0x356c, 0x080c, 0x4aa0, 0x0904, 0x359e,
+	0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xca46,
+	0x0904, 0x359e, 0x7888, 0xd094, 0x0118, 0xb8d4, 0xc08d, 0xb8d6,
+	0x7007, 0x0003, 0x701f, 0x4d79, 0x0005, 0x2061, 0x1800, 0x080c,
+	0x56e7, 0x2009, 0x0007, 0x1578, 0x080c, 0x6a53, 0x0118, 0x2009,
+	0x0008, 0x0448, 0x080c, 0x335c, 0x0120, 0xa998, 0x080c, 0x65bd,
+	0x1530, 0x080c, 0x4ad1, 0x0518, 0x080c, 0x6a5b, 0xa89c, 0x1168,
+	0x9084, 0x0005, 0x1150, 0x900e, 0x080c, 0x690d, 0x1108, 0xc185,
 	0xb800, 0xd0bc, 0x0108, 0xc18d, 0x00d0, 0xa868, 0xc0fc, 0xa86a,
-	0x080c, 0xc94e, 0x11e0, 0xa89c, 0xd094, 0x0118, 0xb8d4, 0xc08d,
+	0x080c, 0xca46, 0x11e0, 0xa89c, 0xd094, 0x0118, 0xb8d4, 0xc08d,
 	0xb8d6, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897,
 	0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897,
 	0x4000, 0xa99a, 0x9006, 0x918d, 0x0001, 0x2008, 0x0005, 0x9006,
 	0x0005, 0xa830, 0x9086, 0x0100, 0x7024, 0x2058, 0x1110, 0x0804,
-	0x5559, 0x900e, 0x080c, 0x681c, 0x1108, 0xc185, 0xb800, 0xd0bc,
-	0x0108, 0xc18d, 0x0804, 0x3533, 0x080c, 0x5610, 0x0120, 0x2009,
-	0x0007, 0x0804, 0x3565, 0x7f84, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98,
-	0x080c, 0x49d8, 0x1120, 0x2009, 0x0002, 0x0804, 0x3565, 0x900e,
+	0x5630, 0x900e, 0x080c, 0x690d, 0x1108, 0xc185, 0xb800, 0xd0bc,
+	0x0108, 0xc18d, 0x0804, 0x356c, 0x080c, 0x56e7, 0x0120, 0x2009,
+	0x0007, 0x0804, 0x359e, 0x7f84, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98,
+	0x080c, 0x4aa0, 0x1120, 0x2009, 0x0002, 0x0804, 0x359e, 0x900e,
 	0x2130, 0x7126, 0x7132, 0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080,
-	0x0005, 0x702a, 0x20a0, 0x080c, 0x652d, 0x1904, 0x4d53, 0x080c,
-	0x696a, 0x0138, 0x080c, 0x6972, 0x0120, 0x080c, 0x690a, 0x1904,
-	0x4d53, 0xd794, 0x1110, 0xd784, 0x01a8, 0xb8c4, 0x20e0, 0xb8c8,
+	0x0005, 0x702a, 0x20a0, 0x080c, 0x661e, 0x1904, 0x4e1b, 0x080c,
+	0x6a5b, 0x0138, 0x080c, 0x6a63, 0x0120, 0x080c, 0x69fb, 0x1904,
+	0x4e1b, 0xd794, 0x1110, 0xd784, 0x01a8, 0xb8c4, 0x20e0, 0xb8c8,
 	0x9080, 0x0006, 0x2098, 0x3400, 0xd794, 0x0160, 0x20a9, 0x0008,
 	0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x20a9, 0x0002, 0x080c,
-	0x47da, 0x0048, 0x20a9, 0x0004, 0x4003, 0x2098, 0x20a0, 0x3d00,
-	0x20e0, 0x080c, 0x47da, 0x9186, 0x007e, 0x0170, 0x9186, 0x0080,
-	0x0158, 0x080c, 0x696a, 0x90c2, 0x0006, 0x1210, 0xc1fd, 0x0020,
-	0x080c, 0x681c, 0x1108, 0xc1fd, 0x4104, 0xc1fc, 0xd794, 0x0528,
+	0x48a2, 0x0048, 0x20a9, 0x0004, 0x4003, 0x2098, 0x20a0, 0x3d00,
+	0x20e0, 0x080c, 0x48a2, 0x9186, 0x007e, 0x0170, 0x9186, 0x0080,
+	0x0158, 0x080c, 0x6a5b, 0x90c2, 0x0006, 0x1210, 0xc1fd, 0x0020,
+	0x080c, 0x690d, 0x1108, 0xc1fd, 0x4104, 0xc1fc, 0xd794, 0x0528,
 	0xb8c4, 0x20e0, 0xb8c8, 0x2060, 0x9c80, 0x0000, 0x2098, 0x20a9,
 	0x0002, 0x4003, 0x9c80, 0x0003, 0x2098, 0x20a9, 0x0001, 0x4005,
 	0x9c80, 0x0004, 0x2098, 0x3400, 0x20a9, 0x0002, 0x4003, 0x2098,
-	0x20a0, 0x3d00, 0x20e0, 0x080c, 0x47cd, 0x9c80, 0x0026, 0x2098,
+	0x20a0, 0x3d00, 0x20e0, 0x080c, 0x4895, 0x9c80, 0x0026, 0x2098,
 	0xb8c4, 0x20e0, 0x20a9, 0x0002, 0x4003, 0xd794, 0x0110, 0x96b0,
-	0x000b, 0x96b0, 0x0005, 0x8108, 0x080c, 0xaa42, 0x0118, 0x9186,
+	0x000b, 0x96b0, 0x0005, 0x8108, 0x080c, 0xab33, 0x0118, 0x9186,
 	0x0800, 0x0040, 0xd78c, 0x0120, 0x9186, 0x0800, 0x0170, 0x0018,
 	0x9186, 0x007e, 0x0150, 0xd794, 0x0118, 0x9686, 0x0020, 0x0010,
-	0x9686, 0x0028, 0x0150, 0x0804, 0x4ce3, 0x86ff, 0x1120, 0x7124,
-	0x810b, 0x0804, 0x3533, 0x7033, 0x0001, 0x7122, 0x7024, 0x9600,
+	0x9686, 0x0028, 0x0150, 0x0804, 0x4dab, 0x86ff, 0x1120, 0x7124,
+	0x810b, 0x0804, 0x356c, 0x7033, 0x0001, 0x7122, 0x7024, 0x9600,
 	0x7026, 0x772e, 0x2061, 0x18b8, 0x2c44, 0xa06b, 0x0000, 0xa67a,
 	0x7034, 0xa072, 0x7028, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a,
-	0x080c, 0x111b, 0x7007, 0x0002, 0x701f, 0x4d8f, 0x0005, 0x7030,
+	0x080c, 0x1124, 0x7007, 0x0002, 0x701f, 0x4e57, 0x0005, 0x7030,
 	0x9005, 0x1180, 0x7120, 0x7028, 0x20a0, 0x772c, 0x9036, 0x7034,
 	0x20e8, 0x2061, 0x18b8, 0x2c44, 0xa28c, 0xa390, 0xa494, 0xa598,
-	0x0804, 0x4ce3, 0x7124, 0x810b, 0x0804, 0x3533, 0x2029, 0x007e,
+	0x0804, 0x4dab, 0x7124, 0x810b, 0x0804, 0x356c, 0x2029, 0x007e,
 	0x7984, 0x7a88, 0x7b8c, 0x7c98, 0x9184, 0xff00, 0x8007, 0x90e2,
-	0x0020, 0x0a04, 0x3568, 0x9502, 0x0a04, 0x3568, 0x9184, 0x00ff,
-	0x90e2, 0x0020, 0x0a04, 0x3568, 0x9502, 0x0a04, 0x3568, 0x9284,
-	0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3568, 0x9502, 0x0a04,
-	0x3568, 0x9284, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3568, 0x9502,
-	0x0a04, 0x3568, 0x9384, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04,
-	0x3568, 0x9502, 0x0a04, 0x3568, 0x9384, 0x00ff, 0x90e2, 0x0020,
-	0x0a04, 0x3568, 0x9502, 0x0a04, 0x3568, 0x9484, 0xff00, 0x8007,
-	0x90e2, 0x0020, 0x0a04, 0x3568, 0x9502, 0x0a04, 0x3568, 0x9484,
-	0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3568, 0x9502, 0x0a04, 0x3568,
-	0x2061, 0x1987, 0x6102, 0x6206, 0x630a, 0x640e, 0x0804, 0x3533,
-	0x080c, 0x49d8, 0x0904, 0x3565, 0x2009, 0x0016, 0x7a8c, 0x7b88,
-	0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4a21,
-	0x701f, 0x4e13, 0x0005, 0x2001, 0x0138, 0x2003, 0x0000, 0x00e6,
+	0x0020, 0x0a04, 0x35a1, 0x9502, 0x0a04, 0x35a1, 0x9184, 0x00ff,
+	0x90e2, 0x0020, 0x0a04, 0x35a1, 0x9502, 0x0a04, 0x35a1, 0x9284,
+	0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x35a1, 0x9502, 0x0a04,
+	0x35a1, 0x9284, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x35a1, 0x9502,
+	0x0a04, 0x35a1, 0x9384, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04,
+	0x35a1, 0x9502, 0x0a04, 0x35a1, 0x9384, 0x00ff, 0x90e2, 0x0020,
+	0x0a04, 0x35a1, 0x9502, 0x0a04, 0x35a1, 0x9484, 0xff00, 0x8007,
+	0x90e2, 0x0020, 0x0a04, 0x35a1, 0x9502, 0x0a04, 0x35a1, 0x9484,
+	0x00ff, 0x90e2, 0x0020, 0x0a04, 0x35a1, 0x9502, 0x0a04, 0x35a1,
+	0x2061, 0x1989, 0x6102, 0x6206, 0x630a, 0x640e, 0x0804, 0x356c,
+	0x080c, 0x4aa0, 0x0904, 0x359e, 0x2009, 0x0016, 0x7a8c, 0x7b88,
+	0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4ae9,
+	0x701f, 0x4edb, 0x0005, 0x2001, 0x0138, 0x2003, 0x0000, 0x00e6,
 	0x2071, 0x0300, 0x701c, 0xd0a4, 0x1de8, 0x00ee, 0x20a9, 0x0016,
 	0x896e, 0x8d6e, 0x8d6f, 0x9d84, 0xffc0, 0x9080, 0x0019, 0x2098,
 	0x9d84, 0x003f, 0x20e0, 0x2069, 0x1877, 0x20e9, 0x0001, 0x2da0,
-	0x4003, 0x6800, 0x9005, 0x0904, 0x4e94, 0x6804, 0x2008, 0x918c,
-	0xfff8, 0x1904, 0x4e94, 0x680c, 0x9005, 0x0904, 0x4e94, 0x9082,
-	0xff01, 0x1a04, 0x4e94, 0x6810, 0x9082, 0x005c, 0x0a04, 0x4e94,
-	0x6824, 0x2008, 0x9082, 0x0008, 0x0a04, 0x4e94, 0x9182, 0x0400,
-	0x1a04, 0x4e94, 0x0056, 0x2029, 0x0000, 0x080c, 0x8bd4, 0x005e,
+	0x4003, 0x6800, 0x9005, 0x0904, 0x4f5c, 0x6804, 0x2008, 0x918c,
+	0xfff8, 0x1904, 0x4f5c, 0x680c, 0x9005, 0x0904, 0x4f5c, 0x9082,
+	0xff01, 0x1a04, 0x4f5c, 0x6810, 0x9082, 0x005c, 0x0a04, 0x4f5c,
+	0x6824, 0x2008, 0x9082, 0x0008, 0x0a04, 0x4f5c, 0x9182, 0x0400,
+	0x1a04, 0x4f5c, 0x0056, 0x2029, 0x0000, 0x080c, 0x8cd9, 0x005e,
 	0x6944, 0x6820, 0x9102, 0x06c0, 0x6820, 0x9082, 0x0019, 0x16a0,
 	0x6828, 0x6944, 0x810c, 0x9102, 0x0678, 0x6840, 0x9082, 0x000f,
-	0x1658, 0x080c, 0x1054, 0x2900, 0x0904, 0x4eae, 0x684e, 0x00e6,
-	0x2071, 0x1930, 0x00b6, 0x2059, 0x0000, 0x080c, 0x8a90, 0x00be,
-	0x00ee, 0x0558, 0x080c, 0x87ea, 0x080c, 0x8830, 0x11e0, 0x6857,
+	0x1658, 0x080c, 0x1053, 0x2900, 0x0904, 0x4f76, 0x684e, 0x00e6,
+	0x2071, 0x1930, 0x00b6, 0x2059, 0x0000, 0x080c, 0x8b95, 0x00be,
+	0x00ee, 0x0558, 0x080c, 0x88ef, 0x080c, 0x8935, 0x11e0, 0x6857,
 	0x0000, 0x00c6, 0x2061, 0x0100, 0x6104, 0x918d, 0x2000, 0x6106,
-	0x6b10, 0x2061, 0x1a69, 0x630a, 0x00ce, 0x080c, 0x26e7, 0x2001,
-	0x0138, 0x2102, 0x0804, 0x3533, 0x080c, 0x26e7, 0x2001, 0x0138,
-	0x2102, 0x0804, 0x3568, 0x00e6, 0x2071, 0x1930, 0x080c, 0x8c65,
-	0x080c, 0x8c74, 0x080c, 0x8a7f, 0x00ee, 0x2001, 0x188a, 0x204c,
-	0x080c, 0x106d, 0x2001, 0x188a, 0x2003, 0x0000, 0x080c, 0x26e7,
-	0x2001, 0x0138, 0x2102, 0x0804, 0x3565, 0x2001, 0x1924, 0x200c,
-	0x918e, 0x0000, 0x0904, 0x4f0d, 0x080c, 0x8a7a, 0x0904, 0x4f0d,
+	0x6b10, 0x2061, 0x1a6b, 0x630a, 0x00ce, 0x080c, 0x2713, 0x2001,
+	0x0138, 0x2102, 0x0804, 0x356c, 0x080c, 0x2713, 0x2001, 0x0138,
+	0x2102, 0x0804, 0x35a1, 0x00e6, 0x2071, 0x1930, 0x080c, 0x8d6a,
+	0x080c, 0x8d79, 0x080c, 0x8b84, 0x00ee, 0x2001, 0x188a, 0x204c,
+	0x080c, 0x106c, 0x2001, 0x188a, 0x2003, 0x0000, 0x080c, 0x2713,
+	0x2001, 0x0138, 0x2102, 0x0804, 0x359e, 0x2001, 0x1924, 0x200c,
+	0x918e, 0x0000, 0x0904, 0x4fd5, 0x080c, 0x8b7f, 0x0904, 0x4fd5,
 	0x2001, 0x0101, 0x200c, 0x918c, 0xdfff, 0x2102, 0x2001, 0x0138,
 	0x2003, 0x0000, 0x00e6, 0x2071, 0x0300, 0x701c, 0xd0a4, 0x1de8,
-	0x00ee, 0x080c, 0x8a7f, 0x2001, 0x0035, 0x080c, 0x1670, 0x00c6,
+	0x00ee, 0x080c, 0x8b84, 0x2001, 0x0035, 0x080c, 0x1679, 0x00c6,
 	0x2061, 0x193c, 0x6004, 0x6100, 0x9106, 0x1de0, 0x00ce, 0x080c,
-	0x26e7, 0x2001, 0x0138, 0x2102, 0x00e6, 0x00f6, 0x2071, 0x1923,
-	0x080c, 0x89bb, 0x0120, 0x2f00, 0x080c, 0x8a45, 0x0cc8, 0x00fe,
+	0x2713, 0x2001, 0x0138, 0x2102, 0x00e6, 0x00f6, 0x2071, 0x1923,
+	0x080c, 0x8ac0, 0x0120, 0x2f00, 0x080c, 0x8b4a, 0x0cc8, 0x00fe,
 	0x00ee, 0x0126, 0x2091, 0x8000, 0x2001, 0x188a, 0x200c, 0x81ff,
-	0x0138, 0x2148, 0x080c, 0x106d, 0x2001, 0x188a, 0x2003, 0x0000,
+	0x0138, 0x2148, 0x080c, 0x106c, 0x2001, 0x188a, 0x2003, 0x0000,
 	0x2001, 0x183d, 0x2003, 0x0020, 0x00e6, 0x2071, 0x1930, 0x080c,
-	0x8c65, 0x080c, 0x8c74, 0x00ee, 0x012e, 0x0804, 0x3533, 0x0006,
-	0x080c, 0x55fc, 0xd0cc, 0x000e, 0x0005, 0x0006, 0x080c, 0x5600,
+	0x8d6a, 0x080c, 0x8d79, 0x00ee, 0x012e, 0x0804, 0x356c, 0x0006,
+	0x080c, 0x56d3, 0xd0cc, 0x000e, 0x0005, 0x0006, 0x080c, 0x56d7,
 	0xd0bc, 0x000e, 0x0005, 0x6174, 0x7a84, 0x6300, 0x82ff, 0x1118,
-	0x7986, 0x0804, 0x3533, 0x83ff, 0x1904, 0x3568, 0x2001, 0xfff0,
-	0x9200, 0x1a04, 0x3568, 0x2019, 0xffff, 0x6078, 0x9302, 0x9200,
-	0x0a04, 0x3568, 0x7986, 0x6276, 0x0804, 0x3533, 0x080c, 0x5610,
-	0x1904, 0x3565, 0x7c88, 0x7d84, 0x7e98, 0x7f8c, 0x080c, 0x49d8,
-	0x0904, 0x3565, 0x900e, 0x901e, 0x7326, 0x7332, 0xa860, 0x20e8,
+	0x7986, 0x0804, 0x356c, 0x83ff, 0x1904, 0x35a1, 0x2001, 0xfff0,
+	0x9200, 0x1a04, 0x35a1, 0x2019, 0xffff, 0x6078, 0x9302, 0x9200,
+	0x0a04, 0x35a1, 0x7986, 0x6276, 0x0804, 0x356c, 0x080c, 0x56e7,
+	0x1904, 0x359e, 0x7c88, 0x7d84, 0x7e98, 0x7f8c, 0x080c, 0x4aa0,
+	0x0904, 0x359e, 0x900e, 0x901e, 0x7326, 0x7332, 0xa860, 0x20e8,
 	0x7036, 0xa85c, 0x9080, 0x0003, 0x702a, 0x20a0, 0x91d8, 0x1000,
-	0x2b5c, 0x8bff, 0x0178, 0x080c, 0x696a, 0x0118, 0x080c, 0x6972,
+	0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6a5b, 0x0118, 0x080c, 0x6a63,
 	0x1148, 0x20a9, 0x0001, 0xb814, 0x4004, 0xb810, 0x4004, 0x4104,
 	0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c,
 	0x0170, 0x0c20, 0x83ff, 0x1148, 0x7224, 0x900e, 0x2001, 0x0003,
-	0x080c, 0x9030, 0x2208, 0x0804, 0x3533, 0x7033, 0x0001, 0x7122,
+	0x080c, 0x9135, 0x2208, 0x0804, 0x356c, 0x7033, 0x0001, 0x7122,
 	0x7024, 0x9300, 0x7026, 0x2061, 0x18b8, 0x2c44, 0xa06b, 0x0000,
 	0xa37a, 0x7028, 0xa076, 0x7034, 0xa072, 0xa48e, 0xa592, 0xa696,
-	0xa79a, 0x080c, 0x111b, 0x7007, 0x0002, 0x701f, 0x4f90, 0x0005,
+	0xa79a, 0x080c, 0x1124, 0x7007, 0x0002, 0x701f, 0x5058, 0x0005,
 	0x7030, 0x9005, 0x1178, 0x7120, 0x7028, 0x20a0, 0x901e, 0x7034,
 	0x20e8, 0x2061, 0x18b8, 0x2c44, 0xa48c, 0xa590, 0xa694, 0xa798,
-	0x0804, 0x4f4e, 0x7224, 0x900e, 0x2001, 0x0003, 0x080c, 0x9030,
-	0x2208, 0x0804, 0x3533, 0x00f6, 0x00e6, 0x080c, 0x5610, 0x2009,
-	0x0007, 0x1904, 0x5023, 0x2071, 0x189e, 0x745c, 0x84ff, 0x2009,
-	0x000e, 0x1904, 0x5023, 0xac9c, 0xad98, 0xaea4, 0xafa0, 0x0096,
-	0x080c, 0x1054, 0x2009, 0x0002, 0x0904, 0x5023, 0x2900, 0x705e,
+	0x0804, 0x5016, 0x7224, 0x900e, 0x2001, 0x0003, 0x080c, 0x9135,
+	0x2208, 0x0804, 0x356c, 0x00f6, 0x00e6, 0x080c, 0x56e7, 0x2009,
+	0x0007, 0x1904, 0x50eb, 0x2071, 0x189e, 0x745c, 0x84ff, 0x2009,
+	0x000e, 0x1904, 0x50eb, 0xac9c, 0xad98, 0xaea4, 0xafa0, 0x0096,
+	0x080c, 0x1053, 0x2009, 0x0002, 0x0904, 0x50eb, 0x2900, 0x705e,
 	0x900e, 0x901e, 0x7356, 0x7362, 0xa860, 0x7066, 0xa85c, 0x9080,
 	0x0003, 0x705a, 0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178,
-	0x080c, 0x696a, 0x0118, 0x080c, 0x6972, 0x1148, 0xb814, 0x20a9,
+	0x080c, 0x6a5b, 0x0118, 0x080c, 0x6a63, 0x1148, 0xb814, 0x20a9,
 	0x0001, 0x4004, 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, 0x8108,
 	0x9182, 0x0800, 0x0120, 0x9386, 0x003c, 0x01e8, 0x0c20, 0x83ff,
-	0x11c0, 0x7254, 0x900e, 0x2001, 0x0003, 0x080c, 0x9030, 0x2208,
+	0x11c0, 0x7254, 0x900e, 0x2001, 0x0003, 0x080c, 0x9135, 0x2208,
 	0x009e, 0xa897, 0x4000, 0xa99a, 0x715c, 0x81ff, 0x090c, 0x0d7d,
-	0x2148, 0x080c, 0x106d, 0x9006, 0x705e, 0x918d, 0x0001, 0x2008,
+	0x2148, 0x080c, 0x106c, 0x9006, 0x705e, 0x918d, 0x0001, 0x2008,
 	0x0418, 0x7063, 0x0001, 0x7152, 0x7054, 0x9300, 0x7056, 0x2061,
 	0x18b9, 0x2c44, 0xa37a, 0x7058, 0xa076, 0x7064, 0xa072, 0xa48e,
-	0xa592, 0xa696, 0xa79a, 0xa09f, 0x502f, 0x000e, 0xa0a2, 0x080c,
-	0x111b, 0x9006, 0x0048, 0x009e, 0xa897, 0x4005, 0xa99a, 0x900e,
+	0xa592, 0xa696, 0xa79a, 0xa09f, 0x50f7, 0x000e, 0xa0a2, 0x080c,
+	0x1124, 0x9006, 0x0048, 0x009e, 0xa897, 0x4005, 0xa99a, 0x900e,
 	0x9085, 0x0001, 0x2001, 0x0030, 0x00ee, 0x00fe, 0x0005, 0x00f6,
 	0xa0a0, 0x904d, 0x090c, 0x0d7d, 0x00e6, 0x2071, 0x189e, 0xa06c,
 	0x908e, 0x0100, 0x0138, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897,
 	0x4002, 0x00d8, 0x7060, 0x9005, 0x1158, 0x7150, 0x7058, 0x20a0,
 	0x901e, 0x7064, 0x20e8, 0xa48c, 0xa590, 0xa694, 0xa798, 0x0428,
 	0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x7254, 0x900e,
-	0x2001, 0x0003, 0x080c, 0x9030, 0xaa9a, 0x715c, 0x81ff, 0x090c,
-	0x0d7d, 0x2148, 0x080c, 0x106d, 0x705f, 0x0000, 0xa0a0, 0x2048,
-	0x0126, 0x2091, 0x8000, 0x080c, 0x6c7f, 0x012e, 0xa09f, 0x0000,
+	0x2001, 0x0003, 0x080c, 0x9135, 0xaa9a, 0x715c, 0x81ff, 0x090c,
+	0x0d7d, 0x2148, 0x080c, 0x106c, 0x705f, 0x0000, 0xa0a0, 0x2048,
+	0x0126, 0x2091, 0x8000, 0x080c, 0x6d70, 0x012e, 0xa09f, 0x0000,
 	0xa0a3, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x91d8, 0x1000, 0x2b5c,
-	0x8bff, 0x0178, 0x080c, 0x696a, 0x0118, 0x080c, 0x6972, 0x1148,
+	0x8bff, 0x0178, 0x080c, 0x6a5b, 0x0118, 0x080c, 0x6a63, 0x1148,
 	0xb814, 0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, 0x4104, 0x9398,
 	0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, 0x0518,
 	0x0c20, 0x83ff, 0x11f0, 0x7154, 0x810c, 0xa99a, 0xa897, 0x4000,
-	0x715c, 0x81ff, 0x090c, 0x0d7d, 0x2148, 0x080c, 0x106d, 0x9006,
+	0x715c, 0x81ff, 0x090c, 0x0d7d, 0x2148, 0x080c, 0x106c, 0x9006,
 	0x705e, 0x918d, 0x0001, 0x2008, 0xa0a0, 0x2048, 0x0126, 0x2091,
-	0x8000, 0x080c, 0x6c7f, 0x012e, 0xa09f, 0x0000, 0xa0a3, 0x0000,
+	0x8000, 0x080c, 0x6d70, 0x012e, 0xa09f, 0x0000, 0xa0a3, 0x0000,
 	0x0070, 0x7063, 0x0001, 0x7152, 0x7054, 0x9300, 0x7056, 0xa37a,
-	0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, 0x111b, 0x9006, 0x00ee,
+	0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, 0x1124, 0x9006, 0x00ee,
 	0x0005, 0x0096, 0xa88c, 0x90be, 0x7000, 0x0148, 0x90be, 0x7100,
-	0x0130, 0x90be, 0x7200, 0x0118, 0x009e, 0x0804, 0x3568, 0xa884,
-	0xa988, 0x080c, 0x25cf, 0x1518, 0x080c, 0x64cc, 0x1500, 0x7126,
-	0xbe12, 0xbd16, 0xae7c, 0x080c, 0x49d8, 0x01c8, 0x080c, 0x49d8,
+	0x0130, 0x90be, 0x7200, 0x0118, 0x009e, 0x0804, 0x35a1, 0xa884,
+	0xa988, 0x080c, 0x25fb, 0x1518, 0x080c, 0x65bd, 0x1500, 0x7126,
+	0xbe12, 0xbd16, 0xae7c, 0x080c, 0x4aa0, 0x01c8, 0x080c, 0x4aa0,
 	0x01b0, 0x009e, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0xa823,
-	0x0000, 0xa804, 0x2048, 0x080c, 0xc8cc, 0x1120, 0x2009, 0x0003,
-	0x0804, 0x3565, 0x7007, 0x0003, 0x701f, 0x50fc, 0x0005, 0x009e,
-	0x2009, 0x0002, 0x0804, 0x3565, 0x7124, 0x080c, 0x32bc, 0xa820,
-	0x9086, 0x8001, 0x1120, 0x2009, 0x0004, 0x0804, 0x3565, 0x2900,
+	0x0000, 0xa804, 0x2048, 0x080c, 0xc9c4, 0x1120, 0x2009, 0x0003,
+	0x0804, 0x359e, 0x7007, 0x0003, 0x701f, 0x51c4, 0x0005, 0x009e,
+	0x2009, 0x0002, 0x0804, 0x359e, 0x7124, 0x080c, 0x32f5, 0xa820,
+	0x9086, 0x8001, 0x1120, 0x2009, 0x0004, 0x0804, 0x359e, 0x2900,
 	0x7022, 0xa804, 0x0096, 0x2048, 0x8906, 0x8006, 0x8007, 0x90bc,
 	0x003f, 0x9084, 0xffc0, 0x009e, 0x9080, 0x0002, 0x0076, 0x0006,
-	0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, 0x0fb8,
+	0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, 0x0fb7,
 	0xaa6c, 0xab70, 0xac74, 0xad78, 0x2061, 0x18b8, 0x2c44, 0xa06b,
 	0x0000, 0xae64, 0xaf8c, 0x97c6, 0x7000, 0x0118, 0x97c6, 0x7100,
 	0x1148, 0x96c2, 0x0004, 0x0600, 0x2009, 0x0004, 0x000e, 0x007e,
-	0x0804, 0x4a24, 0x97c6, 0x7200, 0x11b8, 0x96c2, 0x0054, 0x02a0,
+	0x0804, 0x4aec, 0x97c6, 0x7200, 0x11b8, 0x96c2, 0x0054, 0x02a0,
 	0x000e, 0x007e, 0x2061, 0x18b8, 0x2c44, 0xa076, 0xa772, 0xa07b,
-	0x002a, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x111b, 0x7007,
-	0x0002, 0x701f, 0x5158, 0x0005, 0x000e, 0x007e, 0x0804, 0x3568,
+	0x002a, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x1124, 0x7007,
+	0x0002, 0x701f, 0x5220, 0x0005, 0x000e, 0x007e, 0x0804, 0x35a1,
 	0x7020, 0x2048, 0xa804, 0x2048, 0xa804, 0x2048, 0x8906, 0x8006,
 	0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2098,
-	0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, 0x0fb8, 0x2100,
+	0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, 0x0fb7, 0x2100,
 	0x2238, 0x2061, 0x18b8, 0x2c44, 0xa28c, 0xa390, 0xa494, 0xa598,
-	0x2009, 0x002a, 0x0804, 0x4a24, 0x81ff, 0x1904, 0x3565, 0x798c,
-	0x2001, 0x197e, 0x2102, 0x080c, 0x49ef, 0x0904, 0x3568, 0x080c,
-	0x696a, 0x0120, 0x080c, 0x6972, 0x1904, 0x3568, 0x080c, 0x65f4,
-	0x0904, 0x3565, 0x0126, 0x2091, 0x8000, 0x080c, 0x6789, 0x012e,
-	0x0904, 0x3565, 0x0804, 0x4508, 0xa9a0, 0x2001, 0x197e, 0xc18d,
-	0x2102, 0x080c, 0x49fc, 0x01a0, 0x080c, 0x696a, 0x0118, 0x080c,
-	0x6972, 0x1170, 0x080c, 0x65f4, 0x2009, 0x0002, 0x0128, 0x080c,
-	0x6789, 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010,
-	0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005,
-	0xa897, 0x4000, 0x080c, 0x5604, 0x0110, 0x9006, 0x0018, 0x900e,
-	0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x78a8, 0xd08c, 0x1118,
-	0xd084, 0x0904, 0x447d, 0x080c, 0x4a0b, 0x0904, 0x3568, 0x080c,
-	0x49d8, 0x1120, 0x2009, 0x0002, 0x0804, 0x3565, 0x080c, 0x696a,
-	0x0130, 0x908e, 0x0004, 0x0118, 0x908e, 0x0005, 0x15a0, 0x78a8,
-	0xd08c, 0x0120, 0xb800, 0xc08c, 0xb802, 0x0028, 0x080c, 0x55fc,
-	0xd0b4, 0x0904, 0x44b7, 0x7884, 0x908e, 0x007e, 0x0904, 0x44b7,
-	0x908e, 0x007f, 0x0904, 0x44b7, 0x908e, 0x0080, 0x0904, 0x44b7,
-	0xb800, 0xd08c, 0x1904, 0x44b7, 0xa867, 0x0000, 0xa868, 0xc0fd,
-	0xa86a, 0x080c, 0xc8eb, 0x1120, 0x2009, 0x0003, 0x0804, 0x3565,
-	0x7007, 0x0003, 0x701f, 0x5215, 0x0005, 0x080c, 0x4a0b, 0x0904,
-	0x3568, 0x0804, 0x44b7, 0x080c, 0x3323, 0x0108, 0x0005, 0x2009,
-	0x1834, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3565,
-	0x080c, 0x5610, 0x0120, 0x2009, 0x0007, 0x0804, 0x3565, 0x080c,
-	0x6962, 0x0120, 0x2009, 0x0008, 0x0804, 0x3565, 0xb89c, 0xd0a4,
-	0x1118, 0xd0ac, 0x1904, 0x44b7, 0x9006, 0xa866, 0xa832, 0xa868,
-	0xc0fd, 0xa86a, 0x080c, 0xc94e, 0x1120, 0x2009, 0x0003, 0x0804,
-	0x3565, 0x7007, 0x0003, 0x701f, 0x524e, 0x0005, 0xa830, 0x9086,
-	0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x5559, 0x080c, 0x4a0b,
-	0x0904, 0x3568, 0x0804, 0x51e7, 0x81ff, 0x2009, 0x0001, 0x1904,
-	0x3565, 0x080c, 0x5610, 0x2009, 0x0007, 0x1904, 0x3565, 0x080c,
-	0x6962, 0x0120, 0x2009, 0x0008, 0x0804, 0x3565, 0x080c, 0x4a0b,
-	0x0904, 0x3568, 0x080c, 0x696a, 0x2009, 0x0009, 0x1904, 0x3565,
-	0x080c, 0x49d8, 0x2009, 0x0002, 0x0904, 0x3565, 0x9006, 0xa866,
-	0xa832, 0xa868, 0xc0fd, 0xa86a, 0x7988, 0x9194, 0xff00, 0x918c,
-	0x00ff, 0x9006, 0x82ff, 0x1128, 0xc0ed, 0xa952, 0x798c, 0xa956,
-	0x0038, 0x928e, 0x0100, 0x1904, 0x3568, 0xc0e5, 0xa952, 0xa956,
-	0xa83e, 0x080c, 0xcbb1, 0x2009, 0x0003, 0x0904, 0x3565, 0x7007,
-	0x0003, 0x701f, 0x52a4, 0x0005, 0xa830, 0x9086, 0x0100, 0x2009,
-	0x0004, 0x0904, 0x3565, 0x0804, 0x3533, 0x7aa8, 0x9284, 0xc000,
-	0x0148, 0xd2ec, 0x01a0, 0x080c, 0x5610, 0x1188, 0x2009, 0x0014,
-	0x0804, 0x3565, 0xd2dc, 0x1568, 0x81ff, 0x2009, 0x0001, 0x1904,
-	0x3565, 0x080c, 0x5610, 0x2009, 0x0007, 0x1904, 0x3565, 0xd2f4,
-	0x0130, 0x9284, 0x5000, 0x080c, 0x55d7, 0x0804, 0x3533, 0xd2fc,
-	0x0158, 0x080c, 0x4a0b, 0x0904, 0x3568, 0x7984, 0x9284, 0x9000,
-	0x080c, 0x55b4, 0x0804, 0x3533, 0x080c, 0x4a0b, 0x0904, 0x3568,
-	0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x2009, 0x0009, 0x1904,
-	0x538d, 0x080c, 0x49d8, 0x2009, 0x0002, 0x0904, 0x538d, 0xa85c,
-	0x9080, 0x001b, 0xaf60, 0x2009, 0x0008, 0x7a8c, 0x7b88, 0x7c9c,
-	0x7d98, 0x080c, 0x4a21, 0x701f, 0x52fe, 0x0005, 0xa86c, 0x9086,
-	0x0500, 0x1138, 0xa870, 0x9005, 0x1120, 0xa874, 0x9084, 0xff00,
-	0x0110, 0x1904, 0x3568, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a,
-	0x080c, 0x4a0b, 0x1110, 0x0804, 0x3568, 0x2009, 0x0043, 0x080c,
-	0xcc19, 0x2009, 0x0003, 0x0904, 0x538d, 0x7007, 0x0003, 0x701f,
-	0x5322, 0x0005, 0xa830, 0x9086, 0x0100, 0x2009, 0x0004, 0x0904,
-	0x538d, 0x7984, 0x7aa8, 0x9284, 0x1000, 0x080c, 0x55b4, 0x0804,
-	0x3533, 0x00c6, 0xaab0, 0x9284, 0xc000, 0x0140, 0xd2ec, 0x0168,
-	0x080c, 0x5610, 0x1150, 0x2009, 0x0014, 0x04f0, 0x2061, 0x1800,
-	0x080c, 0x5610, 0x2009, 0x0007, 0x15b8, 0xd2f4, 0x0128, 0x9284,
-	0x5000, 0x080c, 0x55d7, 0x0050, 0xd2fc, 0x0178, 0x080c, 0x4a09,
-	0x0588, 0xa998, 0x9284, 0x9000, 0x080c, 0x55b4, 0xa87b, 0x0000,
-	0xa883, 0x0000, 0xa897, 0x4000, 0x0438, 0x080c, 0x4a09, 0x0510,
-	0x080c, 0x696a, 0x2009, 0x0009, 0x11b8, 0xa8c4, 0x9086, 0x0500,
-	0x11c8, 0xa8c8, 0x9005, 0x11b0, 0xa8cc, 0x9084, 0xff00, 0x1190,
-	0x080c, 0x4a09, 0x1108, 0x0070, 0x2009, 0x004b, 0x080c, 0xcc19,
-	0x2009, 0x0003, 0x0108, 0x0078, 0x0429, 0x19c0, 0xa897, 0x4005,
+	0x2009, 0x002a, 0x0804, 0x4aec, 0x81ff, 0x1904, 0x359e, 0x798c,
+	0x2001, 0x197e, 0x918c, 0x8000, 0x2102, 0x080c, 0x4ab7, 0x0904,
+	0x35a1, 0x080c, 0x6a5b, 0x0120, 0x080c, 0x6a63, 0x1904, 0x35a1,
+	0x080c, 0x66e5, 0x0904, 0x359e, 0x0126, 0x2091, 0x8000, 0x080c,
+	0x687a, 0x012e, 0x0904, 0x359e, 0x2001, 0x197e, 0x2004, 0xd0fc,
+	0x1904, 0x356c, 0x0804, 0x4541, 0xa9a0, 0x2001, 0x197e, 0x918c,
+	0x8000, 0xc18d, 0x2102, 0x080c, 0x4ac4, 0x01a0, 0x080c, 0x6a5b,
+	0x0118, 0x080c, 0x6a63, 0x1170, 0x080c, 0x66e5, 0x2009, 0x0002,
+	0x0128, 0x080c, 0x687a, 0x1170, 0x2009, 0x0003, 0xa897, 0x4005,
 	0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001,
-	0x0030, 0x00ce, 0x0005, 0x9006, 0x0ce0, 0x7aa8, 0xd2dc, 0x0904,
-	0x3565, 0x0016, 0x7984, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x55b4,
-	0x001e, 0x1904, 0x3565, 0x0804, 0x3533, 0x00f6, 0x2d78, 0x0011,
-	0x00fe, 0x0005, 0xaab0, 0xd2dc, 0x0150, 0x0016, 0xa998, 0x9284,
-	0x1000, 0xc0fd, 0x080c, 0x55b4, 0x001e, 0x9085, 0x0001, 0x0005,
-	0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3565, 0x080c, 0x5610,
-	0x0120, 0x2009, 0x0007, 0x0804, 0x3565, 0x7984, 0x7ea8, 0x96b4,
-	0x00ff, 0x080c, 0x652d, 0x1904, 0x3568, 0x9186, 0x007f, 0x0138,
-	0x080c, 0x696a, 0x0120, 0x2009, 0x0009, 0x0804, 0x3565, 0x080c,
-	0x49d8, 0x1120, 0x2009, 0x0002, 0x0804, 0x3565, 0xa867, 0x0000,
-	0xa868, 0xc0fd, 0xa86a, 0x2001, 0x0100, 0x8007, 0xa80a, 0x080c,
-	0xc905, 0x1120, 0x2009, 0x0003, 0x0804, 0x3565, 0x7007, 0x0003,
-	0x701f, 0x53eb, 0x0005, 0xa808, 0x8007, 0x9086, 0x0100, 0x1120,
-	0x2009, 0x0004, 0x0804, 0x3565, 0xa8e0, 0xa866, 0xa810, 0x8007,
-	0x9084, 0x00ff, 0x800c, 0xa814, 0x8007, 0x9084, 0x00ff, 0x8004,
-	0x9080, 0x0002, 0x9108, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f,
-	0x9084, 0xffc0, 0x9080, 0x0004, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98,
-	0x0804, 0x4a24, 0x080c, 0x49d8, 0x1120, 0x2009, 0x0002, 0x0804,
-	0x3565, 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff,
-	0x1118, 0x7023, 0x19b1, 0x0040, 0x92c6, 0x0001, 0x1118, 0x7023,
-	0x19cb, 0x0010, 0x0804, 0x3568, 0x2009, 0x001a, 0x7a8c, 0x7b88,
-	0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4a21,
-	0x701f, 0x543b, 0x0005, 0x2001, 0x182e, 0x2003, 0x0001, 0xa85c,
-	0x9080, 0x0019, 0x2098, 0xa860, 0x20e0, 0x20a9, 0x001a, 0x7020,
-	0x20a0, 0x20e9, 0x0001, 0x4003, 0x0804, 0x3533, 0x080c, 0x49d8,
-	0x1120, 0x2009, 0x0002, 0x0804, 0x3565, 0x7984, 0x9194, 0xff00,
-	0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118, 0x2099, 0x19b1, 0x0040,
-	0x92c6, 0x0001, 0x1118, 0x2099, 0x19cb, 0x0010, 0x0804, 0x3568,
-	0xa85c, 0x9080, 0x0019, 0x20a0, 0xa860, 0x20e8, 0x20a9, 0x001a,
-	0x20e1, 0x0001, 0x4003, 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c,
-	0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x0804, 0x4a24, 0x7884,
-	0x908a, 0x1000, 0x1a04, 0x3568, 0x0126, 0x2091, 0x8000, 0x8003,
-	0x800b, 0x810b, 0x9108, 0x00c6, 0x2061, 0x1a01, 0x6142, 0x00ce,
-	0x012e, 0x0804, 0x3533, 0x00c6, 0x080c, 0x73e4, 0x1160, 0x080c,
-	0x76e8, 0x080c, 0x5f41, 0x9085, 0x0001, 0x080c, 0x742b, 0x080c,
-	0x7315, 0x080c, 0x0d7d, 0x2061, 0x1800, 0x6030, 0xc09d, 0x6032,
-	0x080c, 0x5dfc, 0x00ce, 0x0005, 0x00c6, 0x2001, 0x1800, 0x2004,
-	0x908e, 0x0000, 0x0904, 0x3565, 0x7884, 0x9005, 0x0188, 0x7888,
-	0x2061, 0x199a, 0x2c0c, 0x2062, 0x080c, 0x299f, 0x01a0, 0x080c,
-	0x29a7, 0x0188, 0x080c, 0x29af, 0x0170, 0x2162, 0x0804, 0x3568,
-	0x2061, 0x0100, 0x6038, 0x9086, 0x0007, 0x1118, 0x2009, 0x0001,
-	0x0010, 0x2009, 0x0000, 0x7884, 0x9086, 0x0002, 0x1588, 0x2061,
-	0x0100, 0x6028, 0xc09c, 0x602a, 0x080c, 0xa781, 0x0026, 0x2011,
-	0x0003, 0x080c, 0xa0a6, 0x2011, 0x0002, 0x080c, 0xa0b0, 0x002e,
-	0x080c, 0x9f6f, 0x0036, 0x901e, 0x080c, 0x9fef, 0x003e, 0x080c,
-	0xa79d, 0x60e3, 0x0000, 0x080c, 0xe59b, 0x080c, 0xe5b6, 0x9085,
-	0x0001, 0x080c, 0x742b, 0x9006, 0x080c, 0x29d1, 0x2001, 0x1800,
-	0x2003, 0x0004, 0x0026, 0x2011, 0x0008, 0x080c, 0x2a0b, 0x002e,
-	0x00ce, 0x0804, 0x3533, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804,
-	0x3565, 0x080c, 0x5610, 0x0120, 0x2009, 0x0007, 0x0804, 0x3565,
-	0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x652d, 0x1904, 0x3568,
-	0x9186, 0x007f, 0x0138, 0x080c, 0x696a, 0x0120, 0x2009, 0x0009,
-	0x0804, 0x3565, 0x080c, 0x49d8, 0x1120, 0x2009, 0x0002, 0x0804,
-	0x3565, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xc908,
-	0x1120, 0x2009, 0x0003, 0x0804, 0x3565, 0x7007, 0x0003, 0x701f,
-	0x5542, 0x0005, 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004,
-	0x0804, 0x3565, 0xa8e0, 0xa866, 0xa834, 0x8007, 0x800c, 0xa85c,
-	0x9080, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xaf60, 0x0804,
-	0x4a24, 0xa898, 0x9086, 0x000d, 0x1904, 0x3565, 0x2021, 0x4005,
-	0x0126, 0x2091, 0x8000, 0x0e04, 0x5566, 0x0010, 0x012e, 0x0cc0,
-	0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833,
-	0x0010, 0x7883, 0x4005, 0xa998, 0x7986, 0xa9a4, 0x799a, 0xa9a8,
-	0x799e, 0x080c, 0x4a14, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
-	0xd084, 0x190c, 0x11cd, 0x7007, 0x0001, 0x2091, 0x5000, 0x700f,
-	0x0000, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061,
-	0x1a01, 0x7984, 0x6152, 0x614e, 0x6057, 0x0000, 0x604b, 0x0009,
-	0x7898, 0x606a, 0x789c, 0x6066, 0x7888, 0x6062, 0x788c, 0x605e,
-	0x2001, 0x1a0f, 0x2044, 0x2001, 0x1a16, 0xa076, 0xa060, 0xa072,
-	0xa07b, 0x0001, 0xa07f, 0x0002, 0xa06b, 0x0000, 0xa09f, 0x0000,
-	0x00ce, 0x012e, 0x0804, 0x3533, 0x0126, 0x2091, 0x8000, 0x00b6,
-	0x00c6, 0x90e4, 0xc000, 0x0128, 0x0006, 0x080c, 0xc770, 0x000e,
-	0x1198, 0xd0e4, 0x0160, 0x9180, 0x1000, 0x2004, 0x905d, 0x0160,
-	0x080c, 0x5f5b, 0x080c, 0xaa42, 0x0110, 0xb817, 0x0000, 0x9006,
-	0x00ce, 0x00be, 0x012e, 0x0005, 0x9085, 0x0001, 0x0cc8, 0x0126,
-	0x2091, 0x8000, 0x0156, 0x2010, 0x900e, 0x20a9, 0x0800, 0x0016,
-	0x9180, 0x1000, 0x2004, 0x9005, 0x0180, 0x9186, 0x007e, 0x0168,
-	0x9186, 0x007f, 0x0150, 0x9186, 0x0080, 0x0138, 0x9186, 0x00ff,
-	0x0120, 0x0026, 0x2200, 0x0801, 0x002e, 0x001e, 0x8108, 0x1f04,
-	0x55df, 0x015e, 0x012e, 0x0005, 0x2001, 0x1848, 0x2004, 0x0005,
-	0x2001, 0x1867, 0x2004, 0x0005, 0x0006, 0x2001, 0x1810, 0x2004,
-	0xd0d4, 0x000e, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0b4, 0x0005,
-	0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x0005, 0x0016, 0x00e6,
-	0x2071, 0x189e, 0x7108, 0x910d, 0x710a, 0x00ee, 0x001e, 0x0005,
-	0x080c, 0x49d8, 0x080c, 0x0f42, 0x2100, 0x2238, 0x7d84, 0x7c88,
-	0x7b8c, 0x7a90, 0x79a4, 0x9182, 0x0081, 0x1a04, 0x3568, 0x810c,
-	0x080c, 0x4a21, 0x701f, 0x5635, 0x0005, 0x2079, 0x0000, 0x7d94,
-	0x7c98, 0x7ba8, 0x7aac, 0x79a4, 0x810c, 0x2061, 0x18b8, 0x2c44,
-	0xa770, 0xa074, 0x2071, 0x189e, 0x080c, 0x4a24, 0x701f, 0x5649,
-	0x0005, 0x2061, 0x18b8, 0x2c44, 0xa074, 0x2048, 0x9006, 0xa802,
-	0xa806, 0x0804, 0x3533, 0x0126, 0x0156, 0x0136, 0x0146, 0x01c6,
-	0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2061, 0x0100, 0x2069,
-	0x0200, 0x2071, 0x1800, 0x6044, 0xd0a4, 0x11e8, 0xd084, 0x0118,
-	0x080c, 0x57fc, 0x0068, 0xd08c, 0x0118, 0x080c, 0x5705, 0x0040,
-	0xd094, 0x0118, 0x080c, 0x56d5, 0x0018, 0xd09c, 0x0108, 0x0099,
-	0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e,
-	0x015e, 0x012e, 0x0005, 0x0016, 0x6128, 0xd19c, 0x1110, 0xc19d,
-	0x612a, 0x001e, 0x0c68, 0x0006, 0x7098, 0x9005, 0x000e, 0x0120,
-	0x709b, 0x0000, 0x7093, 0x0000, 0x624c, 0x9286, 0xf0f0, 0x1150,
-	0x6048, 0x9086, 0xf0f0, 0x0130, 0x624a, 0x6043, 0x0090, 0x6043,
-	0x0010, 0x0490, 0x9294, 0xff00, 0x9296, 0xf700, 0x0178, 0x7138,
-	0xd1a4, 0x1160, 0x6240, 0x9295, 0x0100, 0x6242, 0x9294, 0x0010,
-	0x0128, 0x2009, 0x00f7, 0x080c, 0x5ebd, 0x00f0, 0x6040, 0x9084,
-	0x0010, 0x9085, 0x0140, 0x6042, 0x6043, 0x0000, 0x7087, 0x0000,
-	0x70a3, 0x0001, 0x70c7, 0x0000, 0x70df, 0x0000, 0x2009, 0x1d80,
-	0x200b, 0x0000, 0x7097, 0x0000, 0x708b, 0x000f, 0x2009, 0x000f,
-	0x2011, 0x5d9f, 0x080c, 0x85d2, 0x0005, 0x2001, 0x1869, 0x2004,
-	0xd08c, 0x0110, 0x705f, 0xffff, 0x7088, 0x9005, 0x1528, 0x2011,
-	0x5d9f, 0x080c, 0x850b, 0x6040, 0x9094, 0x0010, 0x9285, 0x0020,
-	0x6042, 0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04, 0x56eb,
-	0x6242, 0x709b, 0x0000, 0x6040, 0x9094, 0x0010, 0x9285, 0x0080,
-	0x6042, 0x6242, 0x0048, 0x6242, 0x709b, 0x0000, 0x708f, 0x0000,
-	0x9006, 0x080c, 0x5f46, 0x0000, 0x0005, 0x708c, 0x908a, 0x0003,
-	0x1a0c, 0x0d7d, 0x000b, 0x0005, 0x570f, 0x5760, 0x57fb, 0x00f6,
-	0x0016, 0x6900, 0x918c, 0x0800, 0x708f, 0x0001, 0x2001, 0x015d,
-	0x2003, 0x0000, 0x6803, 0x00fc, 0x20a9, 0x0004, 0x6800, 0x9084,
-	0x00fc, 0x0120, 0x1f04, 0x571e, 0x080c, 0x0d7d, 0x68a0, 0x68a2,
-	0x689c, 0x689e, 0x6898, 0x689a, 0xa001, 0x918d, 0x1600, 0x6902,
-	0x001e, 0x6837, 0x0020, 0x080c, 0x5f22, 0x2079, 0x1d00, 0x7833,
-	0x1101, 0x7837, 0x0000, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9,
-	0x0001, 0x20a1, 0x1d0e, 0x20a9, 0x0004, 0x4003, 0x080c, 0xa57b,
-	0x20e1, 0x0001, 0x2099, 0x1d00, 0x20e9, 0x0000, 0x20a1, 0x0240,
-	0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x600f, 0x0000, 0x080c,
-	0x5dd0, 0x00fe, 0x9006, 0x7092, 0x6043, 0x0008, 0x6042, 0x0005,
-	0x00f6, 0x7090, 0x7093, 0x0000, 0x9025, 0x0904, 0x57d8, 0x6020,
-	0xd0b4, 0x1904, 0x57d6, 0x71a0, 0x81ff, 0x0904, 0x57c4, 0x9486,
-	0x000c, 0x1904, 0x57d1, 0x9480, 0x0018, 0x8004, 0x20a8, 0x080c,
-	0x5f1b, 0x2011, 0x0260, 0x2019, 0x1d00, 0x220c, 0x2304, 0x9106,
-	0x11e8, 0x8210, 0x8318, 0x1f04, 0x577d, 0x6043, 0x0004, 0x2061,
-	0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043,
-	0x0006, 0x708f, 0x0002, 0x709b, 0x0002, 0x2009, 0x07d0, 0x2011,
-	0x5da6, 0x080c, 0x85d2, 0x080c, 0x5f22, 0x04c0, 0x080c, 0x5f1b,
-	0x2079, 0x0260, 0x7930, 0x918e, 0x1101, 0x1558, 0x7834, 0x9005,
-	0x1540, 0x7900, 0x918c, 0x00ff, 0x1118, 0x7804, 0x9005, 0x0190,
-	0x080c, 0x5f1b, 0x2011, 0x026e, 0x2019, 0x1805, 0x20a9, 0x0004,
-	0x220c, 0x2304, 0x9102, 0x0230, 0x11a0, 0x8210, 0x8318, 0x1f04,
-	0x57b8, 0x0078, 0x70a3, 0x0000, 0x080c, 0x5f1b, 0x20e1, 0x0000,
-	0x2099, 0x0260, 0x20e9, 0x0001, 0x20a1, 0x1d00, 0x20a9, 0x0014,
-	0x4003, 0x6043, 0x0008, 0x6043, 0x0000, 0x0010, 0x00fe, 0x0005,
-	0x6040, 0x9085, 0x0100, 0x6042, 0x6020, 0xd0b4, 0x1db8, 0x080c,
-	0xa57b, 0x20e1, 0x0001, 0x2099, 0x1d00, 0x20e9, 0x0000, 0x20a1,
-	0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x2011, 0x19f2,
-	0x2013, 0x0000, 0x7093, 0x0000, 0x60a3, 0x0056, 0x60a7, 0x9575,
-	0x080c, 0x9cfc, 0x08d8, 0x0005, 0x7098, 0x908a, 0x001d, 0x1a0c,
-	0x0d7d, 0x000b, 0x0005, 0x582d, 0x5840, 0x5869, 0x5889, 0x58af,
-	0x58de, 0x5904, 0x593c, 0x5962, 0x5990, 0x59cb, 0x5a03, 0x5a21,
-	0x5a4c, 0x5a6e, 0x5a89, 0x5a93, 0x5ac7, 0x5aed, 0x5b1c, 0x5b42,
-	0x5b7a, 0x5bbe, 0x5bfb, 0x5c1c, 0x5c75, 0x5c97, 0x5cc5, 0x5cc5,
-	0x00c6, 0x2061, 0x1800, 0x6003, 0x0007, 0x2061, 0x0100, 0x6004,
-	0x9084, 0xfff9, 0x6006, 0x00ce, 0x0005, 0x2061, 0x0140, 0x605b,
-	0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0002, 0x709b,
-	0x0001, 0x2009, 0x07d0, 0x2011, 0x5da6, 0x080c, 0x85d2, 0x0005,
-	0x00f6, 0x7090, 0x9086, 0x0014, 0x1510, 0x6042, 0x6020, 0xd0b4,
-	0x11f0, 0x080c, 0x5f1b, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102,
-	0x11a0, 0x7834, 0x9005, 0x1188, 0x7a38, 0xd2fc, 0x0128, 0x70c4,
-	0x9005, 0x1110, 0x70c7, 0x0001, 0x2011, 0x5da6, 0x080c, 0x850b,
-	0x709b, 0x0010, 0x080c, 0x5a93, 0x0010, 0x7093, 0x0000, 0x00fe,
-	0x0005, 0x00f6, 0x709b, 0x0003, 0x6043, 0x0004, 0x2011, 0x5da6,
-	0x080c, 0x850b, 0x080c, 0x5e9f, 0x2079, 0x0240, 0x7833, 0x1102,
-	0x7837, 0x0000, 0x20a9, 0x0008, 0x9f88, 0x000e, 0x200b, 0x0000,
-	0x8108, 0x1f04, 0x587e, 0x60c3, 0x0014, 0x080c, 0x5dd0, 0x00fe,
-	0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, 0x5da6, 0x080c,
-	0x850b, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5f1b, 0x2079, 0x0260,
-	0x7a30, 0x9296, 0x1102, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38,
-	0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b,
-	0x0004, 0x0029, 0x0010, 0x080c, 0x5ef7, 0x00fe, 0x0005, 0x00f6,
-	0x709b, 0x0005, 0x080c, 0x5e9f, 0x2079, 0x0240, 0x7833, 0x1103,
-	0x7837, 0x0000, 0x080c, 0x5f1b, 0x080c, 0x5efe, 0x1170, 0x7084,
-	0x9005, 0x1158, 0x715c, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008,
-	0x080c, 0x5d53, 0x0168, 0x080c, 0x5ed4, 0x20a9, 0x0008, 0x20e1,
-	0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003,
-	0x60c3, 0x0014, 0x080c, 0x5dd0, 0x00fe, 0x0005, 0x00f6, 0x7090,
-	0x9005, 0x0500, 0x2011, 0x5da6, 0x080c, 0x850b, 0x9086, 0x0014,
-	0x11b8, 0x080c, 0x5f1b, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103,
-	0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4,
-	0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x0006, 0x0029, 0x0010,
-	0x080c, 0x5ef7, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0007, 0x080c,
-	0x5e9f, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c,
-	0x5f1b, 0x080c, 0x5efe, 0x11b8, 0x7084, 0x9005, 0x11a0, 0x7164,
-	0x9186, 0xffff, 0x0180, 0x9180, 0x3334, 0x200d, 0x918c, 0xff00,
-	0x810f, 0x2011, 0x0008, 0x080c, 0x5d53, 0x0180, 0x080c, 0x4f15,
-	0x0110, 0x080c, 0x2638, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099,
-	0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014,
-	0x080c, 0x5dd0, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500,
-	0x2011, 0x5da6, 0x080c, 0x850b, 0x9086, 0x0014, 0x11b8, 0x080c,
-	0x5f1b, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834,
-	0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110,
-	0x70c7, 0x0001, 0x709b, 0x0008, 0x0029, 0x0010, 0x080c, 0x5ef7,
-	0x00fe, 0x0005, 0x00f6, 0x709b, 0x0009, 0x080c, 0x5e9f, 0x2079,
-	0x0240, 0x7833, 0x1105, 0x7837, 0x0100, 0x080c, 0x5efe, 0x1150,
-	0x7084, 0x9005, 0x1138, 0x080c, 0x5cc6, 0x1188, 0x9085, 0x0001,
-	0x080c, 0x2638, 0x20a9, 0x0008, 0x080c, 0x5f1b, 0x20e1, 0x0000,
-	0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3,
-	0x0014, 0x080c, 0x5dd0, 0x0010, 0x080c, 0x5820, 0x00fe, 0x0005,
-	0x00f6, 0x7090, 0x9005, 0x05a8, 0x2011, 0x5da6, 0x080c, 0x850b,
-	0x9086, 0x0014, 0x1560, 0x080c, 0x5f1b, 0x2079, 0x0260, 0x7a30,
-	0x9296, 0x1105, 0x1520, 0x7834, 0x9084, 0x0100, 0x2011, 0x0100,
-	0x921e, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110,
-	0x70c7, 0x0001, 0x709b, 0x000a, 0x00b1, 0x0098, 0x9005, 0x1178,
+	0x0030, 0x0005, 0xa897, 0x4000, 0x2001, 0x197e, 0x2004, 0xd0fc,
+	0x1128, 0x080c, 0x56db, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085,
+	0x0001, 0x2001, 0x0000, 0x0005, 0x78a8, 0xd08c, 0x1118, 0xd084,
+	0x0904, 0x44b6, 0x080c, 0x4ad3, 0x0904, 0x35a1, 0x080c, 0x4aa0,
+	0x1120, 0x2009, 0x0002, 0x0804, 0x359e, 0x080c, 0x6a5b, 0x0130,
+	0x908e, 0x0004, 0x0118, 0x908e, 0x0005, 0x15a0, 0x78a8, 0xd08c,
+	0x0120, 0xb800, 0xc08c, 0xb802, 0x0028, 0x080c, 0x56d3, 0xd0b4,
+	0x0904, 0x44f0, 0x7884, 0x908e, 0x007e, 0x0904, 0x44f0, 0x908e,
+	0x007f, 0x0904, 0x44f0, 0x908e, 0x0080, 0x0904, 0x44f0, 0xb800,
+	0xd08c, 0x1904, 0x44f0, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a,
+	0x080c, 0xc9e3, 0x1120, 0x2009, 0x0003, 0x0804, 0x359e, 0x7007,
+	0x0003, 0x701f, 0x52ec, 0x0005, 0x080c, 0x4ad3, 0x0904, 0x35a1,
+	0x0804, 0x44f0, 0x080c, 0x335c, 0x0108, 0x0005, 0x2009, 0x1834,
+	0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x359e, 0x080c,
+	0x56e7, 0x0120, 0x2009, 0x0007, 0x0804, 0x359e, 0x080c, 0x6a53,
+	0x0120, 0x2009, 0x0008, 0x0804, 0x359e, 0xb89c, 0xd0a4, 0x1118,
+	0xd0ac, 0x1904, 0x44f0, 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd,
+	0xa86a, 0x080c, 0xca46, 0x1120, 0x2009, 0x0003, 0x0804, 0x359e,
+	0x7007, 0x0003, 0x701f, 0x5325, 0x0005, 0xa830, 0x9086, 0x0100,
+	0x1120, 0x2009, 0x0004, 0x0804, 0x5630, 0x080c, 0x4ad3, 0x0904,
+	0x35a1, 0x0804, 0x52be, 0x81ff, 0x2009, 0x0001, 0x1904, 0x359e,
+	0x080c, 0x56e7, 0x2009, 0x0007, 0x1904, 0x359e, 0x080c, 0x6a53,
+	0x0120, 0x2009, 0x0008, 0x0804, 0x359e, 0x080c, 0x4ad3, 0x0904,
+	0x35a1, 0x080c, 0x6a5b, 0x2009, 0x0009, 0x1904, 0x359e, 0x080c,
+	0x4aa0, 0x2009, 0x0002, 0x0904, 0x359e, 0x9006, 0xa866, 0xa832,
+	0xa868, 0xc0fd, 0xa86a, 0x7988, 0x9194, 0xff00, 0x918c, 0x00ff,
+	0x9006, 0x82ff, 0x1128, 0xc0ed, 0xa952, 0x798c, 0xa956, 0x0038,
+	0x928e, 0x0100, 0x1904, 0x35a1, 0xc0e5, 0xa952, 0xa956, 0xa83e,
+	0x080c, 0xcca9, 0x2009, 0x0003, 0x0904, 0x359e, 0x7007, 0x0003,
+	0x701f, 0x537b, 0x0005, 0xa830, 0x9086, 0x0100, 0x2009, 0x0004,
+	0x0904, 0x359e, 0x0804, 0x356c, 0x7aa8, 0x9284, 0xc000, 0x0148,
+	0xd2ec, 0x01a0, 0x080c, 0x56e7, 0x1188, 0x2009, 0x0014, 0x0804,
+	0x359e, 0xd2dc, 0x1568, 0x81ff, 0x2009, 0x0001, 0x1904, 0x359e,
+	0x080c, 0x56e7, 0x2009, 0x0007, 0x1904, 0x359e, 0xd2f4, 0x0130,
+	0x9284, 0x5000, 0x080c, 0x56ae, 0x0804, 0x356c, 0xd2fc, 0x0158,
+	0x080c, 0x4ad3, 0x0904, 0x35a1, 0x7984, 0x9284, 0x9000, 0x080c,
+	0x568b, 0x0804, 0x356c, 0x080c, 0x4ad3, 0x0904, 0x35a1, 0xb804,
+	0x9084, 0x00ff, 0x9086, 0x0006, 0x2009, 0x0009, 0x1904, 0x5464,
+	0x080c, 0x4aa0, 0x2009, 0x0002, 0x0904, 0x5464, 0xa85c, 0x9080,
+	0x001b, 0xaf60, 0x2009, 0x0008, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98,
+	0x080c, 0x4ae9, 0x701f, 0x53d5, 0x0005, 0xa86c, 0x9086, 0x0500,
+	0x1138, 0xa870, 0x9005, 0x1120, 0xa874, 0x9084, 0xff00, 0x0110,
+	0x1904, 0x35a1, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c,
+	0x4ad3, 0x1110, 0x0804, 0x35a1, 0x2009, 0x0043, 0x080c, 0xcd11,
+	0x2009, 0x0003, 0x0904, 0x5464, 0x7007, 0x0003, 0x701f, 0x53f9,
+	0x0005, 0xa830, 0x9086, 0x0100, 0x2009, 0x0004, 0x0904, 0x5464,
+	0x7984, 0x7aa8, 0x9284, 0x1000, 0x080c, 0x568b, 0x0804, 0x356c,
+	0x00c6, 0xaab0, 0x9284, 0xc000, 0x0140, 0xd2ec, 0x0168, 0x080c,
+	0x56e7, 0x1150, 0x2009, 0x0014, 0x04f0, 0x2061, 0x1800, 0x080c,
+	0x56e7, 0x2009, 0x0007, 0x15b8, 0xd2f4, 0x0128, 0x9284, 0x5000,
+	0x080c, 0x56ae, 0x0050, 0xd2fc, 0x0178, 0x080c, 0x4ad1, 0x0588,
+	0xa998, 0x9284, 0x9000, 0x080c, 0x568b, 0xa87b, 0x0000, 0xa883,
+	0x0000, 0xa897, 0x4000, 0x0438, 0x080c, 0x4ad1, 0x0510, 0x080c,
+	0x6a5b, 0x2009, 0x0009, 0x11b8, 0xa8c4, 0x9086, 0x0500, 0x11c8,
+	0xa8c8, 0x9005, 0x11b0, 0xa8cc, 0x9084, 0xff00, 0x1190, 0x080c,
+	0x4ad1, 0x1108, 0x0070, 0x2009, 0x004b, 0x080c, 0xcd11, 0x2009,
+	0x0003, 0x0108, 0x0078, 0x0429, 0x19c0, 0xa897, 0x4005, 0xa99a,
+	0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030,
+	0x00ce, 0x0005, 0x9006, 0x0ce0, 0x7aa8, 0xd2dc, 0x0904, 0x359e,
+	0x0016, 0x7984, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x568b, 0x001e,
+	0x1904, 0x359e, 0x0804, 0x356c, 0x00f6, 0x2d78, 0x0011, 0x00fe,
+	0x0005, 0xaab0, 0xd2dc, 0x0150, 0x0016, 0xa998, 0x9284, 0x1000,
+	0xc0fd, 0x080c, 0x568b, 0x001e, 0x9085, 0x0001, 0x0005, 0x81ff,
+	0x0120, 0x2009, 0x0001, 0x0804, 0x359e, 0x080c, 0x56e7, 0x0120,
+	0x2009, 0x0007, 0x0804, 0x359e, 0x7984, 0x7ea8, 0x96b4, 0x00ff,
+	0x080c, 0x661e, 0x1904, 0x35a1, 0x9186, 0x007f, 0x0138, 0x080c,
+	0x6a5b, 0x0120, 0x2009, 0x0009, 0x0804, 0x359e, 0x080c, 0x4aa0,
+	0x1120, 0x2009, 0x0002, 0x0804, 0x359e, 0xa867, 0x0000, 0xa868,
+	0xc0fd, 0xa86a, 0x2001, 0x0100, 0x8007, 0xa80a, 0x080c, 0xc9fd,
+	0x1120, 0x2009, 0x0003, 0x0804, 0x359e, 0x7007, 0x0003, 0x701f,
+	0x54c2, 0x0005, 0xa808, 0x8007, 0x9086, 0x0100, 0x1120, 0x2009,
+	0x0004, 0x0804, 0x359e, 0xa8e0, 0xa866, 0xa810, 0x8007, 0x9084,
+	0x00ff, 0x800c, 0xa814, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9080,
+	0x0002, 0x9108, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084,
+	0xffc0, 0x9080, 0x0004, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804,
+	0x4aec, 0x080c, 0x4aa0, 0x1120, 0x2009, 0x0002, 0x0804, 0x359e,
+	0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118,
+	0x7023, 0x19b3, 0x0040, 0x92c6, 0x0001, 0x1118, 0x7023, 0x19cd,
+	0x0010, 0x0804, 0x35a1, 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c,
+	0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4ae9, 0x701f,
+	0x5512, 0x0005, 0x2001, 0x182e, 0x2003, 0x0001, 0xa85c, 0x9080,
+	0x0019, 0x2098, 0xa860, 0x20e0, 0x20a9, 0x001a, 0x7020, 0x20a0,
+	0x20e9, 0x0001, 0x4003, 0x0804, 0x356c, 0x080c, 0x4aa0, 0x1120,
+	0x2009, 0x0002, 0x0804, 0x359e, 0x7984, 0x9194, 0xff00, 0x918c,
+	0x00ff, 0x8217, 0x82ff, 0x1118, 0x2099, 0x19b3, 0x0040, 0x92c6,
+	0x0001, 0x1118, 0x2099, 0x19cd, 0x0010, 0x0804, 0x35a1, 0xa85c,
+	0x9080, 0x0019, 0x20a0, 0xa860, 0x20e8, 0x20a9, 0x001a, 0x20e1,
+	0x0001, 0x4003, 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98,
+	0xa85c, 0x9080, 0x0019, 0xaf60, 0x0804, 0x4aec, 0x7884, 0x908a,
+	0x1000, 0x1a04, 0x35a1, 0x0126, 0x2091, 0x8000, 0x8003, 0x800b,
+	0x810b, 0x9108, 0x00c6, 0x2061, 0x1a03, 0x6142, 0x00ce, 0x012e,
+	0x0804, 0x356c, 0x00c6, 0x080c, 0x74d5, 0x1160, 0x080c, 0x77d9,
+	0x080c, 0x6022, 0x9085, 0x0001, 0x080c, 0x751c, 0x080c, 0x7406,
+	0x080c, 0x0d7d, 0x2061, 0x1800, 0x6030, 0xc09d, 0x6032, 0x080c,
+	0x5edd, 0x00ce, 0x0005, 0x00c6, 0x2001, 0x1800, 0x2004, 0x908e,
+	0x0000, 0x0904, 0x359e, 0x7884, 0x9005, 0x0188, 0x7888, 0x2061,
+	0x199c, 0x2c0c, 0x2062, 0x080c, 0x29d8, 0x01a0, 0x080c, 0x29e0,
+	0x0188, 0x080c, 0x29e8, 0x0170, 0x2162, 0x0804, 0x35a1, 0x2061,
+	0x0100, 0x6038, 0x9086, 0x0007, 0x1118, 0x2009, 0x0001, 0x0010,
+	0x2009, 0x0000, 0x7884, 0x9086, 0x0002, 0x1588, 0x2061, 0x0100,
+	0x6028, 0xc09c, 0x602a, 0x080c, 0xa872, 0x0026, 0x2011, 0x0003,
+	0x080c, 0xa1ab, 0x2011, 0x0002, 0x080c, 0xa1b5, 0x002e, 0x080c,
+	0xa074, 0x0036, 0x901e, 0x080c, 0xa0f4, 0x003e, 0x080c, 0xa88e,
+	0x60e3, 0x0000, 0x080c, 0xe6d7, 0x080c, 0xe6f2, 0x9085, 0x0001,
+	0x080c, 0x751c, 0x9006, 0x080c, 0x2a0a, 0x2001, 0x1800, 0x2003,
+	0x0004, 0x0026, 0x2011, 0x0008, 0x080c, 0x2a44, 0x002e, 0x00ce,
+	0x0804, 0x356c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x359e,
+	0x080c, 0x56e7, 0x0120, 0x2009, 0x0007, 0x0804, 0x359e, 0x7984,
+	0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x661e, 0x1904, 0x35a1, 0x9186,
+	0x007f, 0x0138, 0x080c, 0x6a5b, 0x0120, 0x2009, 0x0009, 0x0804,
+	0x359e, 0x080c, 0x4aa0, 0x1120, 0x2009, 0x0002, 0x0804, 0x359e,
+	0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xca00, 0x1120,
+	0x2009, 0x0003, 0x0804, 0x359e, 0x7007, 0x0003, 0x701f, 0x5619,
+	0x0005, 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804,
+	0x359e, 0xa8e0, 0xa866, 0xa834, 0x8007, 0x800c, 0xa85c, 0x9080,
+	0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xaf60, 0x0804, 0x4aec,
+	0xa898, 0x9086, 0x000d, 0x1904, 0x359e, 0x2021, 0x4005, 0x0126,
+	0x2091, 0x8000, 0x0e04, 0x563d, 0x0010, 0x012e, 0x0cc0, 0x7c36,
+	0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, 0x0010,
+	0x7883, 0x4005, 0xa998, 0x7986, 0xa9a4, 0x799a, 0xa9a8, 0x799e,
+	0x080c, 0x4adc, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084,
+	0x190c, 0x11d6, 0x7007, 0x0001, 0x2091, 0x5000, 0x700f, 0x0000,
+	0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061, 0x1a03,
+	0x7984, 0x6152, 0x614e, 0x6057, 0x0000, 0x604b, 0x0009, 0x7898,
+	0x606a, 0x789c, 0x6066, 0x7888, 0x6062, 0x788c, 0x605e, 0x2001,
+	0x1a11, 0x2044, 0x2001, 0x1a18, 0xa076, 0xa060, 0xa072, 0xa07b,
+	0x0001, 0xa07f, 0x0002, 0xa06b, 0x0000, 0xa09f, 0x0000, 0x00ce,
+	0x012e, 0x0804, 0x356c, 0x0126, 0x2091, 0x8000, 0x00b6, 0x00c6,
+	0x90e4, 0xc000, 0x0128, 0x0006, 0x080c, 0xc861, 0x000e, 0x1198,
+	0xd0e4, 0x0160, 0x9180, 0x1000, 0x2004, 0x905d, 0x0160, 0x080c,
+	0x603c, 0x080c, 0xab33, 0x0110, 0xb817, 0x0000, 0x9006, 0x00ce,
+	0x00be, 0x012e, 0x0005, 0x9085, 0x0001, 0x0cc8, 0x0126, 0x2091,
+	0x8000, 0x0156, 0x2010, 0x900e, 0x20a9, 0x0800, 0x0016, 0x9180,
+	0x1000, 0x2004, 0x9005, 0x0180, 0x9186, 0x007e, 0x0168, 0x9186,
+	0x007f, 0x0150, 0x9186, 0x0080, 0x0138, 0x9186, 0x00ff, 0x0120,
+	0x0026, 0x2200, 0x0801, 0x002e, 0x001e, 0x8108, 0x1f04, 0x56b6,
+	0x015e, 0x012e, 0x0005, 0x2001, 0x1848, 0x2004, 0x0005, 0x2001,
+	0x1867, 0x2004, 0x0005, 0x0006, 0x2001, 0x1810, 0x2004, 0xd0d4,
+	0x000e, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0b4, 0x0005, 0x2001,
+	0x1800, 0x2004, 0x9086, 0x0003, 0x0005, 0x0016, 0x00e6, 0x2071,
+	0x189e, 0x7108, 0x910d, 0x710a, 0x00ee, 0x001e, 0x0005, 0x79a4,
+	0x9182, 0x0081, 0x1a04, 0x35a1, 0x810c, 0x0016, 0x080c, 0x4aa0,
+	0x080c, 0x0f42, 0x2100, 0x2238, 0x7d84, 0x7c88, 0x7b8c, 0x7a90,
+	0x001e, 0x080c, 0x4ae9, 0x701f, 0x570e, 0x0005, 0x2079, 0x0000,
+	0x7d94, 0x7c98, 0x7ba8, 0x7aac, 0x79a4, 0x810c, 0x2061, 0x18b8,
+	0x2c44, 0xa770, 0xa074, 0x2071, 0x189e, 0x080c, 0x4aec, 0x701f,
+	0x5722, 0x0005, 0x2061, 0x18b8, 0x2c44, 0x0016, 0x0026, 0xa270,
+	0xa174, 0x080c, 0x0f4a, 0x002e, 0x001e, 0x080c, 0x0ff7, 0x9006,
+	0xa802, 0xa806, 0x0804, 0x356c, 0x0126, 0x0156, 0x0136, 0x0146,
+	0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2061, 0x0100,
+	0x2069, 0x0200, 0x2071, 0x1800, 0x6044, 0xd0a4, 0x11e8, 0xd084,
+	0x0118, 0x080c, 0x58dd, 0x0068, 0xd08c, 0x0118, 0x080c, 0x57e6,
+	0x0040, 0xd094, 0x0118, 0x080c, 0x57b6, 0x0018, 0xd09c, 0x0108,
+	0x0099, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e,
+	0x013e, 0x015e, 0x012e, 0x0005, 0x0016, 0x6128, 0xd19c, 0x1110,
+	0xc19d, 0x612a, 0x001e, 0x0c68, 0x0006, 0x7098, 0x9005, 0x000e,
+	0x0120, 0x709b, 0x0000, 0x7093, 0x0000, 0x624c, 0x9286, 0xf0f0,
+	0x1150, 0x6048, 0x9086, 0xf0f0, 0x0130, 0x624a, 0x6043, 0x0090,
+	0x6043, 0x0010, 0x0490, 0x9294, 0xff00, 0x9296, 0xf700, 0x0178,
+	0x7138, 0xd1a4, 0x1160, 0x6240, 0x9295, 0x0100, 0x6242, 0x9294,
+	0x0010, 0x0128, 0x2009, 0x00f7, 0x080c, 0x5f9e, 0x00f0, 0x6040,
+	0x9084, 0x0010, 0x9085, 0x0140, 0x6042, 0x6043, 0x0000, 0x7087,
+	0x0000, 0x70a3, 0x0001, 0x70c7, 0x0000, 0x70df, 0x0000, 0x2009,
+	0x1d80, 0x200b, 0x0000, 0x7097, 0x0000, 0x708b, 0x000f, 0x2009,
+	0x000f, 0x2011, 0x5e80, 0x080c, 0x86d7, 0x0005, 0x2001, 0x1869,
+	0x2004, 0xd08c, 0x0110, 0x705f, 0xffff, 0x7088, 0x9005, 0x1528,
+	0x2011, 0x5e80, 0x080c, 0x860d, 0x6040, 0x9094, 0x0010, 0x9285,
+	0x0020, 0x6042, 0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04,
+	0x57cc, 0x6242, 0x709b, 0x0000, 0x6040, 0x9094, 0x0010, 0x9285,
+	0x0080, 0x6042, 0x6242, 0x0048, 0x6242, 0x709b, 0x0000, 0x708f,
+	0x0000, 0x9006, 0x080c, 0x6027, 0x0000, 0x0005, 0x708c, 0x908a,
+	0x0003, 0x1a0c, 0x0d7d, 0x000b, 0x0005, 0x57f0, 0x5841, 0x58dc,
+	0x00f6, 0x0016, 0x6900, 0x918c, 0x0800, 0x708f, 0x0001, 0x2001,
+	0x015d, 0x2003, 0x0000, 0x6803, 0x00fc, 0x20a9, 0x0004, 0x6800,
+	0x9084, 0x00fc, 0x0120, 0x1f04, 0x57ff, 0x080c, 0x0d7d, 0x68a0,
+	0x68a2, 0x689c, 0x689e, 0x6898, 0x689a, 0xa001, 0x918d, 0x1600,
+	0x6902, 0x001e, 0x6837, 0x0020, 0x080c, 0x6003, 0x2079, 0x1d00,
+	0x7833, 0x1101, 0x7837, 0x0000, 0x20e1, 0x0001, 0x2099, 0x1805,
+	0x20e9, 0x0001, 0x20a1, 0x1d0e, 0x20a9, 0x0004, 0x4003, 0x080c,
+	0xa66c, 0x20e1, 0x0001, 0x2099, 0x1d00, 0x20e9, 0x0000, 0x20a1,
+	0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x600f, 0x0000,
+	0x080c, 0x5eb1, 0x00fe, 0x9006, 0x7092, 0x6043, 0x0008, 0x6042,
+	0x0005, 0x00f6, 0x7090, 0x7093, 0x0000, 0x9025, 0x0904, 0x58b9,
+	0x6020, 0xd0b4, 0x1904, 0x58b7, 0x71a0, 0x81ff, 0x0904, 0x58a5,
+	0x9486, 0x000c, 0x1904, 0x58b2, 0x9480, 0x0018, 0x8004, 0x20a8,
+	0x080c, 0x5ffc, 0x2011, 0x0260, 0x2019, 0x1d00, 0x220c, 0x2304,
+	0x9106, 0x11e8, 0x8210, 0x8318, 0x1f04, 0x585e, 0x6043, 0x0004,
+	0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100,
+	0x6043, 0x0006, 0x708f, 0x0002, 0x709b, 0x0002, 0x2009, 0x07d0,
+	0x2011, 0x5e87, 0x080c, 0x86d7, 0x080c, 0x6003, 0x04c0, 0x080c,
+	0x5ffc, 0x2079, 0x0260, 0x7930, 0x918e, 0x1101, 0x1558, 0x7834,
+	0x9005, 0x1540, 0x7900, 0x918c, 0x00ff, 0x1118, 0x7804, 0x9005,
+	0x0190, 0x080c, 0x5ffc, 0x2011, 0x026e, 0x2019, 0x1805, 0x20a9,
+	0x0004, 0x220c, 0x2304, 0x9102, 0x0230, 0x11a0, 0x8210, 0x8318,
+	0x1f04, 0x5899, 0x0078, 0x70a3, 0x0000, 0x080c, 0x5ffc, 0x20e1,
+	0x0000, 0x2099, 0x0260, 0x20e9, 0x0001, 0x20a1, 0x1d00, 0x20a9,
+	0x0014, 0x4003, 0x6043, 0x0008, 0x6043, 0x0000, 0x0010, 0x00fe,
+	0x0005, 0x6040, 0x9085, 0x0100, 0x6042, 0x6020, 0xd0b4, 0x1db8,
+	0x080c, 0xa66c, 0x20e1, 0x0001, 0x2099, 0x1d00, 0x20e9, 0x0000,
+	0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x2011,
+	0x19f4, 0x2013, 0x0000, 0x7093, 0x0000, 0x60a3, 0x0056, 0x60a7,
+	0x9575, 0x080c, 0x9e01, 0x08d8, 0x0005, 0x7098, 0x908a, 0x001d,
+	0x1a0c, 0x0d7d, 0x000b, 0x0005, 0x590e, 0x5921, 0x594a, 0x596a,
+	0x5990, 0x59bf, 0x59e5, 0x5a1d, 0x5a43, 0x5a71, 0x5aac, 0x5ae4,
+	0x5b02, 0x5b2d, 0x5b4f, 0x5b6a, 0x5b74, 0x5ba8, 0x5bce, 0x5bfd,
+	0x5c23, 0x5c5b, 0x5c9f, 0x5cdc, 0x5cfd, 0x5d56, 0x5d78, 0x5da6,
+	0x5da6, 0x00c6, 0x2061, 0x1800, 0x6003, 0x0007, 0x2061, 0x0100,
+	0x6004, 0x9084, 0xfff9, 0x6006, 0x00ce, 0x0005, 0x2061, 0x0140,
+	0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0002,
+	0x709b, 0x0001, 0x2009, 0x07d0, 0x2011, 0x5e87, 0x080c, 0x86d7,
+	0x0005, 0x00f6, 0x7090, 0x9086, 0x0014, 0x1510, 0x6042, 0x6020,
+	0xd0b4, 0x11f0, 0x080c, 0x5ffc, 0x2079, 0x0260, 0x7a30, 0x9296,
+	0x1102, 0x11a0, 0x7834, 0x9005, 0x1188, 0x7a38, 0xd2fc, 0x0128,
+	0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x2011, 0x5e87, 0x080c,
+	0x860d, 0x709b, 0x0010, 0x080c, 0x5b74, 0x0010, 0x7093, 0x0000,
+	0x00fe, 0x0005, 0x00f6, 0x709b, 0x0003, 0x6043, 0x0004, 0x2011,
+	0x5e87, 0x080c, 0x860d, 0x080c, 0x5f80, 0x2079, 0x0240, 0x7833,
+	0x1102, 0x7837, 0x0000, 0x20a9, 0x0008, 0x9f88, 0x000e, 0x200b,
+	0x0000, 0x8108, 0x1f04, 0x595f, 0x60c3, 0x0014, 0x080c, 0x5eb1,
+	0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, 0x5e87,
+	0x080c, 0x860d, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5ffc, 0x2079,
+	0x0260, 0x7a30, 0x9296, 0x1102, 0x1178, 0x7834, 0x9005, 0x1160,
 	0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001,
-	0x7097, 0x0000, 0x709b, 0x000e, 0x080c, 0x5a6e, 0x0010, 0x080c,
-	0x5ef7, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x000b, 0x2011, 0x1d0e,
-	0x20e9, 0x0001, 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff, 0x4304,
-	0x080c, 0x5e9f, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000,
-	0x080c, 0x5efe, 0x0118, 0x2013, 0x0000, 0x0020, 0x7060, 0x9085,
-	0x0100, 0x2012, 0x20a9, 0x0040, 0x2009, 0x024e, 0x2011, 0x1d0e,
-	0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810, 0x8000,
-	0x6812, 0x2009, 0x0240, 0x1f04, 0x59f0, 0x60c3, 0x0084, 0x080c,
-	0x5dd0, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x01c0, 0x2011,
-	0x5da6, 0x080c, 0x850b, 0x9086, 0x0084, 0x1178, 0x080c, 0x5f1b,
-	0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1138, 0x7834, 0x9005,
-	0x1120, 0x709b, 0x000c, 0x0029, 0x0010, 0x080c, 0x5ef7, 0x00fe,
-	0x0005, 0x00f6, 0x709b, 0x000d, 0x080c, 0x5e9f, 0x2079, 0x0240,
-	0x7833, 0x1107, 0x7837, 0x0000, 0x080c, 0x5f1b, 0x20a9, 0x0040,
-	0x2011, 0x026e, 0x2009, 0x024e, 0x220e, 0x8210, 0x8108, 0x9186,
-	0x0260, 0x1150, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x6814,
-	0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, 0x5a34, 0x60c3, 0x0084,
-	0x080c, 0x5dd0, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x01e0,
-	0x2011, 0x5da6, 0x080c, 0x850b, 0x9086, 0x0084, 0x1198, 0x080c,
-	0x5f1b, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834,
-	0x9005, 0x1140, 0x7097, 0x0001, 0x080c, 0x5e71, 0x709b, 0x000e,
-	0x0029, 0x0010, 0x080c, 0x5ef7, 0x00fe, 0x0005, 0x918d, 0x0001,
-	0x080c, 0x5f46, 0x709b, 0x000f, 0x7093, 0x0000, 0x2061, 0x0140,
-	0x605b, 0xbc85, 0x605f, 0xb5b5, 0x2061, 0x0100, 0x6043, 0x0005,
-	0x6043, 0x0004, 0x2009, 0x07d0, 0x2011, 0x5da6, 0x080c, 0x84ff,
-	0x0005, 0x7090, 0x9005, 0x0130, 0x2011, 0x5da6, 0x080c, 0x850b,
-	0x709b, 0x0000, 0x0005, 0x709b, 0x0011, 0x080c, 0xa57b, 0x080c,
-	0x5f1b, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1,
-	0x0240, 0x7490, 0x9480, 0x0018, 0x9080, 0x0007, 0x9084, 0x03f8,
-	0x8004, 0x20a8, 0x4003, 0x080c, 0x5efe, 0x11a0, 0x717c, 0x81ff,
-	0x0188, 0x900e, 0x7080, 0x9084, 0x00ff, 0x0160, 0x080c, 0x25cf,
-	0x9186, 0x007e, 0x0138, 0x9186, 0x0080, 0x0120, 0x2011, 0x0008,
-	0x080c, 0x5d53, 0x60c3, 0x0014, 0x080c, 0x5dd0, 0x0005, 0x00f6,
-	0x7090, 0x9005, 0x0500, 0x2011, 0x5da6, 0x080c, 0x850b, 0x9086,
-	0x0014, 0x11b8, 0x080c, 0x5f1b, 0x2079, 0x0260, 0x7a30, 0x9296,
+	0x709b, 0x0004, 0x0029, 0x0010, 0x080c, 0x5fd8, 0x00fe, 0x0005,
+	0x00f6, 0x709b, 0x0005, 0x080c, 0x5f80, 0x2079, 0x0240, 0x7833,
+	0x1103, 0x7837, 0x0000, 0x080c, 0x5ffc, 0x080c, 0x5fdf, 0x1170,
+	0x7084, 0x9005, 0x1158, 0x715c, 0x9186, 0xffff, 0x0138, 0x2011,
+	0x0008, 0x080c, 0x5e34, 0x0168, 0x080c, 0x5fb5, 0x20a9, 0x0008,
+	0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e,
+	0x4003, 0x60c3, 0x0014, 0x080c, 0x5eb1, 0x00fe, 0x0005, 0x00f6,
+	0x7090, 0x9005, 0x0500, 0x2011, 0x5e87, 0x080c, 0x860d, 0x9086,
+	0x0014, 0x11b8, 0x080c, 0x5ffc, 0x2079, 0x0260, 0x7a30, 0x9296,
 	0x1103, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128,
-	0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x0012, 0x0029,
-	0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0013,
-	0x080c, 0x5ead, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, 0x0000,
-	0x080c, 0x5f1b, 0x080c, 0x5efe, 0x1170, 0x7084, 0x9005, 0x1158,
-	0x715c, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, 0x5d53,
-	0x0168, 0x080c, 0x5ed4, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099,
-	0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014,
-	0x080c, 0x5dd0, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500,
-	0x2011, 0x5da6, 0x080c, 0x850b, 0x9086, 0x0014, 0x11b8, 0x080c,
-	0x5f1b, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834,
-	0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110,
-	0x70c7, 0x0001, 0x709b, 0x0014, 0x0029, 0x0010, 0x7093, 0x0000,
-	0x00fe, 0x0005, 0x00f6, 0x709b, 0x0015, 0x080c, 0x5ead, 0x2079,
-	0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x5f1b, 0x080c,
-	0x5efe, 0x11b8, 0x7084, 0x9005, 0x11a0, 0x7164, 0x9186, 0xffff,
-	0x0180, 0x9180, 0x3334, 0x200d, 0x918c, 0xff00, 0x810f, 0x2011,
-	0x0008, 0x080c, 0x5d53, 0x0180, 0x080c, 0x4f15, 0x0110, 0x080c,
-	0x2638, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9,
-	0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5dd0,
-	0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x05f0, 0x2011, 0x5da6,
-	0x080c, 0x850b, 0x9086, 0x0014, 0x15a8, 0x080c, 0x5f1b, 0x2079,
-	0x0260, 0x7a30, 0x9296, 0x1105, 0x1568, 0x7834, 0x9084, 0x0100,
-	0x2011, 0x0100, 0x921e, 0x1168, 0x9085, 0x0001, 0x080c, 0x5f46,
-	0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001,
-	0x0080, 0x9005, 0x11b8, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005,
-	0x1110, 0x70c7, 0x0001, 0x9085, 0x0001, 0x080c, 0x5f46, 0x7097,
-	0x0000, 0x7a38, 0xd2f4, 0x0110, 0x70df, 0x0008, 0x709b, 0x0016,
-	0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x080c, 0xa57b,
-	0x080c, 0x5f1b, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000,
-	0x20a1, 0x0240, 0x20a9, 0x000e, 0x4003, 0x2011, 0x026d, 0x2204,
-	0x9084, 0x0100, 0x2011, 0x024d, 0x2012, 0x2011, 0x026e, 0x709b,
-	0x0017, 0x080c, 0x5efe, 0x1150, 0x7084, 0x9005, 0x1138, 0x080c,
-	0x5cc6, 0x1188, 0x9085, 0x0001, 0x080c, 0x2638, 0x20a9, 0x0008,
-	0x080c, 0x5f1b, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000,
-	0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5dd0, 0x0010,
-	0x080c, 0x5820, 0x0005, 0x00f6, 0x7090, 0x9005, 0x01d8, 0x2011,
-	0x5da6, 0x080c, 0x850b, 0x9086, 0x0084, 0x1190, 0x080c, 0x5f1b,
-	0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1150, 0x7834, 0x9005,
-	0x1138, 0x9006, 0x080c, 0x5f46, 0x709b, 0x0018, 0x0029, 0x0010,
-	0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0019, 0x080c,
-	0x5ead, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, 0x080c,
-	0x5f1b, 0x2009, 0x026e, 0x2039, 0x1d0e, 0x20a9, 0x0040, 0x213e,
-	0x8738, 0x8108, 0x9186, 0x0280, 0x1128, 0x6814, 0x8000, 0x6816,
-	0x2009, 0x0260, 0x1f04, 0x5c2f, 0x2039, 0x1d0e, 0x080c, 0x5efe,
-	0x11e8, 0x2728, 0x2514, 0x8207, 0x9084, 0x00ff, 0x8000, 0x2018,
-	0x9294, 0x00ff, 0x8007, 0x9205, 0x202a, 0x7060, 0x2310, 0x8214,
-	0x92a0, 0x1d0e, 0x2414, 0x938c, 0x0001, 0x0118, 0x9294, 0xff00,
-	0x0018, 0x9294, 0x00ff, 0x8007, 0x9215, 0x2222, 0x20a9, 0x0040,
-	0x2009, 0x024e, 0x270e, 0x8738, 0x8108, 0x9186, 0x0260, 0x1128,
-	0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x1f04, 0x5c62, 0x60c3,
-	0x0084, 0x080c, 0x5dd0, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005,
-	0x01e0, 0x2011, 0x5da6, 0x080c, 0x850b, 0x9086, 0x0084, 0x1198,
-	0x080c, 0x5f1b, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158,
-	0x7834, 0x9005, 0x1140, 0x7097, 0x0001, 0x080c, 0x5e71, 0x709b,
-	0x001a, 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x9085,
-	0x0001, 0x080c, 0x5f46, 0x709b, 0x001b, 0x080c, 0xa57b, 0x080c,
-	0x5f1b, 0x2011, 0x0260, 0x2009, 0x0240, 0x7490, 0x9480, 0x0018,
-	0x9080, 0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, 0x220e, 0x8210,
-	0x8108, 0x9186, 0x0260, 0x1150, 0x6810, 0x8000, 0x6812, 0x2009,
-	0x0240, 0x6814, 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, 0x5cae,
-	0x60c3, 0x0084, 0x080c, 0x5dd0, 0x0005, 0x0005, 0x0086, 0x0096,
-	0x2029, 0x1848, 0x252c, 0x20a9, 0x0008, 0x2041, 0x1d0e, 0x20e9,
-	0x0001, 0x28a0, 0x080c, 0x5f1b, 0x20e1, 0x0000, 0x2099, 0x026e,
-	0x4003, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0108, 0x9016,
-	0x2800, 0x9200, 0x200c, 0x91a6, 0xffff, 0x1148, 0xd5d4, 0x0110,
-	0x8210, 0x0008, 0x8211, 0x1f04, 0x5ce0, 0x0804, 0x5d4f, 0x82ff,
-	0x1160, 0xd5d4, 0x0120, 0x91a6, 0x3fff, 0x0d90, 0x0020, 0x91a6,
-	0x3fff, 0x0904, 0x5d4f, 0x918d, 0xc000, 0x20a9, 0x0010, 0x2019,
-	0x0001, 0xd5d4, 0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4, 0x0110,
-	0x8423, 0x0008, 0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319, 0x0008,
-	0x8318, 0x1f04, 0x5d06, 0x04d8, 0x23a8, 0x2021, 0x0001, 0x8426,
-	0x8425, 0x1f04, 0x5d18, 0x2328, 0x8529, 0x92be, 0x0007, 0x0158,
-	0x0006, 0x2039, 0x0007, 0x2200, 0x973a, 0x000e, 0x27a8, 0x95a8,
-	0x0010, 0x1f04, 0x5d27, 0x755e, 0x95c8, 0x3334, 0x292d, 0x95ac,
-	0x00ff, 0x7582, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x2618,
-	0x001e, 0x60e7, 0x0000, 0x65ea, 0x2018, 0x2304, 0x9405, 0x201a,
-	0x7087, 0x0001, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x20e1, 0x0001,
-	0x2898, 0x20a9, 0x0008, 0x4003, 0x9085, 0x0001, 0x0008, 0x9006,
-	0x009e, 0x008e, 0x0005, 0x0156, 0x01c6, 0x01d6, 0x0136, 0x0146,
-	0x22a8, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x2011,
-	0x024e, 0x22a0, 0x4003, 0x014e, 0x013e, 0x01de, 0x01ce, 0x015e,
-	0x2118, 0x9026, 0x2001, 0x0007, 0x939a, 0x0010, 0x0218, 0x8420,
-	0x8001, 0x0cd0, 0x2118, 0x84ff, 0x0120, 0x939a, 0x0010, 0x8421,
-	0x1de0, 0x2021, 0x0001, 0x83ff, 0x0118, 0x8423, 0x8319, 0x1de8,
-	0x9238, 0x2029, 0x026e, 0x9528, 0x2504, 0x942c, 0x11b8, 0x9405,
-	0x203a, 0x715e, 0x91a0, 0x3334, 0x242d, 0x95ac, 0x00ff, 0x7582,
-	0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x2618, 0x001e, 0x60e7,
-	0x0000, 0x65ea, 0x7087, 0x0001, 0x9084, 0x0000, 0x0005, 0x00e6,
-	0x2071, 0x1800, 0x708b, 0x0000, 0x00ee, 0x0005, 0x00e6, 0x00f6,
-	0x2079, 0x0100, 0x2071, 0x0140, 0x080c, 0x5e60, 0x080c, 0x9d09,
-	0x7004, 0x9084, 0x4000, 0x0110, 0x080c, 0x29e1, 0x0126, 0x2091,
-	0x8000, 0x2071, 0x1826, 0x2073, 0x0000, 0x7840, 0x0026, 0x0016,
-	0x2009, 0x00f7, 0x080c, 0x5ebd, 0x001e, 0x9094, 0x0010, 0x9285,
-	0x0080, 0x7842, 0x7a42, 0x002e, 0x012e, 0x00fe, 0x00ee, 0x0005,
-	0x0126, 0x2091, 0x8000, 0x080c, 0x2940, 0x0228, 0x2011, 0x0101,
-	0x2204, 0xc0c5, 0x2012, 0x2011, 0x19f2, 0x2013, 0x0000, 0x7093,
-	0x0000, 0x012e, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x9cfc,
-	0x6144, 0xd184, 0x0120, 0x7198, 0x918d, 0x2000, 0x0018, 0x718c,
-	0x918d, 0x1000, 0x2011, 0x1997, 0x2112, 0x2009, 0x07d0, 0x2011,
-	0x5da6, 0x080c, 0x85d2, 0x0005, 0x0016, 0x0026, 0x00c6, 0x0126,
-	0x2091, 0x8000, 0x080c, 0xa781, 0x080c, 0xaa49, 0x080c, 0xa79d,
-	0x2009, 0x00f7, 0x080c, 0x5ebd, 0x2061, 0x1a01, 0x900e, 0x611a,
-	0x611e, 0x6172, 0x6176, 0x2061, 0x1800, 0x6003, 0x0001, 0x2061,
-	0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x1997, 0x200b,
-	0x0000, 0x2009, 0x002d, 0x2011, 0x5e2c, 0x080c, 0x84ff, 0x012e,
-	0x00ce, 0x002e, 0x001e, 0x0005, 0x00e6, 0x0006, 0x0126, 0x2091,
-	0x8000, 0x0471, 0x2071, 0x0100, 0x080c, 0x9d09, 0x2071, 0x0140,
-	0x7004, 0x9084, 0x4000, 0x0110, 0x080c, 0x29e1, 0x080c, 0x73ec,
-	0x0188, 0x080c, 0x7407, 0x1170, 0x080c, 0x76f2, 0x0016, 0x080c,
-	0x26e7, 0x2001, 0x196d, 0x2102, 0x001e, 0x080c, 0x76ed, 0x080c,
-	0x7315, 0x0050, 0x2009, 0x0001, 0x080c, 0x29bd, 0x2001, 0x0001,
-	0x080c, 0x2574, 0x080c, 0x5dfc, 0x012e, 0x000e, 0x00ee, 0x0005,
-	0x2001, 0x180e, 0x2004, 0xd0bc, 0x0158, 0x0026, 0x0036, 0x2011,
-	0x8017, 0x2001, 0x1997, 0x201c, 0x080c, 0x4a38, 0x003e, 0x002e,
-	0x0005, 0x20a9, 0x0012, 0x20e9, 0x0001, 0x20a1, 0x1d80, 0x080c,
-	0x5f1b, 0x20e9, 0x0000, 0x2099, 0x026e, 0x0099, 0x20a9, 0x0020,
-	0x080c, 0x5f15, 0x2099, 0x0260, 0x20a1, 0x1d92, 0x0051, 0x20a9,
-	0x000e, 0x080c, 0x5f18, 0x2099, 0x0260, 0x20a1, 0x1db2, 0x0009,
-	0x0005, 0x0016, 0x0026, 0x3410, 0x3308, 0x2104, 0x8007, 0x2012,
-	0x8108, 0x8210, 0x1f04, 0x5e95, 0x002e, 0x001e, 0x0005, 0x080c,
-	0xa57b, 0x20e1, 0x0001, 0x2099, 0x1d00, 0x20e9, 0x0000, 0x20a1,
-	0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x080c, 0xa57b, 0x080c,
-	0x5f1b, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1,
-	0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x00c6, 0x0006, 0x2061,
-	0x0100, 0x810f, 0x2001, 0x1834, 0x2004, 0x9005, 0x1138, 0x2001,
-	0x1818, 0x2004, 0x9084, 0x00ff, 0x9105, 0x0010, 0x9185, 0x00f7,
-	0x604a, 0x000e, 0x00ce, 0x0005, 0x0016, 0x0046, 0x080c, 0x6966,
-	0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xe191, 0x2001,
-	0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x900e, 0x080c,
-	0x316a, 0x080c, 0xce35, 0x0140, 0x0036, 0x2019, 0xffff, 0x2021,
-	0x0007, 0x080c, 0x4bef, 0x003e, 0x004e, 0x001e, 0x0005, 0x080c,
-	0x5dfc, 0x709b, 0x0000, 0x7093, 0x0000, 0x0005, 0x0006, 0x2001,
-	0x180c, 0x2004, 0xd09c, 0x0100, 0x000e, 0x0005, 0x0006, 0x0016,
-	0x0126, 0x2091, 0x8000, 0x2001, 0x0101, 0x200c, 0x918d, 0x0006,
-	0x2102, 0x012e, 0x001e, 0x000e, 0x0005, 0x2009, 0x0001, 0x0020,
-	0x2009, 0x0002, 0x0008, 0x900e, 0x6814, 0x9084, 0xffc0, 0x910d,
-	0x6916, 0x0005, 0x00f6, 0x0156, 0x0146, 0x01d6, 0x9006, 0x20a9,
-	0x0080, 0x20e9, 0x0001, 0x20a1, 0x1d00, 0x4004, 0x2079, 0x1d00,
-	0x7803, 0x2200, 0x7807, 0x00ef, 0x780f, 0x00ef, 0x7813, 0x0138,
-	0x7823, 0xffff, 0x7827, 0xffff, 0x01de, 0x014e, 0x015e, 0x00fe,
-	0x0005, 0x2001, 0x1800, 0x2003, 0x0001, 0x0005, 0x2001, 0x19a4,
-	0x0118, 0x2003, 0x0001, 0x0010, 0x2003, 0x0000, 0x0005, 0x0156,
-	0x20a9, 0x0800, 0x2009, 0x1000, 0x9006, 0x200a, 0x8108, 0x1f04,
-	0x5f55, 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156, 0x0136, 0x0146,
-	0x2069, 0x1847, 0x9006, 0xb802, 0xb8d6, 0xb807, 0x0707, 0xb80a,
-	0xb80e, 0xb812, 0x9198, 0x3334, 0x231d, 0x939c, 0x00ff, 0xbb16,
-	0x0016, 0x0026, 0xb886, 0x080c, 0xaa42, 0x1120, 0x9192, 0x007e,
-	0x1208, 0xbb86, 0x20a9, 0x0004, 0xb8c4, 0x20e8, 0xb9c8, 0x9198,
-	0x0006, 0x9006, 0x23a0, 0x4004, 0x20a9, 0x0004, 0x9198, 0x000a,
-	0x23a0, 0x4004, 0x002e, 0x001e, 0xb83e, 0xb842, 0xb8ce, 0xb8d2,
-	0xb85e, 0xb862, 0xb866, 0xb86a, 0xb86f, 0x0100, 0xb872, 0xb876,
-	0xb87a, 0xb88a, 0xb88e, 0xb893, 0x0008, 0xb896, 0xb89a, 0xb89e,
-	0xb8be, 0xb9a2, 0x0096, 0xb8a4, 0x904d, 0x0110, 0x080c, 0x106d,
-	0xb8a7, 0x0000, 0x009e, 0x9006, 0xb84a, 0x6810, 0xb83a, 0x680c,
-	0xb846, 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0198, 0x00c6, 0x2060,
-	0x9c82, 0x1ddc, 0x0a0c, 0x0d7d, 0x2001, 0x181a, 0x2004, 0x9c02,
-	0x1a0c, 0x0d7d, 0x080c, 0x8a5a, 0x00ce, 0x090c, 0x8dfe, 0xb8af,
-	0x0000, 0x6814, 0x9084, 0x00ff, 0xb842, 0x014e, 0x013e, 0x015e,
-	0x003e, 0x00de, 0x0005, 0x0126, 0x2091, 0x8000, 0xa974, 0xae78,
-	0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x6031, 0x9182, 0x0800,
-	0x1a04, 0x6035, 0x2001, 0x180c, 0x2004, 0x9084, 0x0003, 0x1904,
-	0x603b, 0x9188, 0x1000, 0x2104, 0x905d, 0x0198, 0xb804, 0x9084,
-	0x00ff, 0x908e, 0x0006, 0x1188, 0xb8a4, 0x900d, 0x1904, 0x604d,
-	0x080c, 0x63f6, 0x9006, 0x012e, 0x0005, 0x2001, 0x0005, 0x900e,
-	0x04b8, 0x2001, 0x0028, 0x900e, 0x0498, 0x9082, 0x0006, 0x1290,
-	0x080c, 0xaa42, 0x1160, 0xb8a0, 0x9084, 0xff80, 0x1140, 0xb900,
-	0xd1fc, 0x0d10, 0x2001, 0x0029, 0x2009, 0x1000, 0x0408, 0x2001,
-	0x0028, 0x00a8, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001,
-	0x0004, 0x0068, 0xd184, 0x0118, 0x2001, 0x0004, 0x0040, 0x2001,
-	0x0029, 0xb900, 0xd1fc, 0x0118, 0x2009, 0x1000, 0x0048, 0x900e,
-	0x0038, 0x2001, 0x0029, 0x900e, 0x0018, 0x2001, 0x0029, 0x900e,
-	0x9005, 0x012e, 0x0005, 0x2001, 0x180c, 0x2004, 0xd084, 0x19d0,
-	0x9188, 0x1000, 0x2104, 0x9065, 0x09a8, 0x080c, 0x696a, 0x1990,
-	0xb800, 0xd0bc, 0x0978, 0x0804, 0x5ff4, 0x080c, 0x6798, 0x0904,
-	0x5ffd, 0x0804, 0x5ff8, 0x00e6, 0x2071, 0x19e5, 0x7004, 0x9086,
-	0x0002, 0x1128, 0x7030, 0x9080, 0x0004, 0x2004, 0x9b06, 0x00ee,
-	0x0005, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0xa874, 0x908e,
-	0x00ff, 0x1120, 0x2001, 0x196b, 0x205c, 0x0060, 0xa974, 0x9182,
-	0x0800, 0x1690, 0x9188, 0x1000, 0x2104, 0x905d, 0x01d0, 0x080c,
-	0x690a, 0x11d0, 0x080c, 0xaa82, 0x0570, 0x2b00, 0x6012, 0x2900,
-	0x6016, 0x6023, 0x0009, 0x602b, 0x0000, 0xa874, 0x908e, 0x00ff,
-	0x1110, 0x602b, 0x8000, 0x2009, 0x0043, 0x080c, 0xab77, 0x9006,
-	0x00b0, 0x2001, 0x0028, 0x0090, 0x2009, 0x180c, 0x210c, 0xd18c,
-	0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004,
-	0x0010, 0x2001, 0x0029, 0x0010, 0x2001, 0x0029, 0x9005, 0x012e,
-	0x00ee, 0x00be, 0x0005, 0x2001, 0x002c, 0x0cc0, 0x00b6, 0x00e6,
-	0x0126, 0x2091, 0x8000, 0xa974, 0x9182, 0x0800, 0x1a04, 0x6129,
-	0x9188, 0x1000, 0x2104, 0x905d, 0x0904, 0x6101, 0xb8a0, 0x9086,
-	0x007f, 0x0178, 0x080c, 0x6972, 0x0160, 0xa994, 0x81ff, 0x0130,
-	0x908e, 0x0004, 0x0130, 0x908e, 0x0005, 0x0118, 0x080c, 0x696a,
-	0x1598, 0xa87c, 0xd0fc, 0x01e0, 0xa894, 0x9005, 0x01c8, 0x2060,
-	0x0026, 0x2010, 0x080c, 0xc711, 0x002e, 0x1120, 0x2001, 0x0008,
-	0x0804, 0x612b, 0x6020, 0x9086, 0x000a, 0x0120, 0x2001, 0x0008,
-	0x0804, 0x612b, 0x601a, 0x6003, 0x0008, 0x2900, 0x6016, 0x0058,
-	0x080c, 0xaa82, 0x05e8, 0x2b00, 0x6012, 0x2900, 0x6016, 0x600b,
-	0xffff, 0x6023, 0x000a, 0x2009, 0x0003, 0x080c, 0xab77, 0x9006,
-	0x0458, 0x2001, 0x0028, 0x0438, 0x9082, 0x0006, 0x1290, 0x080c,
-	0xaa42, 0x1160, 0xb8a0, 0x9084, 0xff80, 0x1140, 0xb900, 0xd1fc,
-	0x0900, 0x2001, 0x0029, 0x2009, 0x1000, 0x00a8, 0x2001, 0x0028,
-	0x0090, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004,
-	0x0050, 0xd184, 0x0118, 0x2001, 0x0004, 0x0028, 0x2001, 0x0029,
-	0x0010, 0x2001, 0x0029, 0x9005, 0x012e, 0x00ee, 0x00be, 0x0005,
-	0x2001, 0x002c, 0x0cc0, 0x00f6, 0x00b6, 0x0126, 0x2091, 0x8000,
-	0xa8e0, 0x9005, 0x1550, 0xa8dc, 0x9082, 0x0101, 0x1630, 0xa8c8,
-	0x9005, 0x1518, 0xa8c4, 0x9082, 0x0101, 0x12f8, 0xa974, 0x2079,
-	0x1800, 0x9182, 0x0800, 0x12e8, 0x7830, 0x9084, 0x0003, 0x1130,
-	0xaa98, 0xab94, 0xa878, 0x9084, 0x0007, 0x00ea, 0x7930, 0xd18c,
-	0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004,
-	0x0010, 0x2001, 0x0029, 0x900e, 0x0038, 0x2001, 0x002c, 0x900e,
-	0x0018, 0x2001, 0x0029, 0x900e, 0x9006, 0x0008, 0x9005, 0x012e,
-	0x00be, 0x00fe, 0x0005, 0x61c0, 0x617b, 0x6192, 0x61c0, 0x61c0,
-	0x61c0, 0x61c0, 0x61c0, 0x2100, 0x9082, 0x007e, 0x1278, 0x080c,
-	0x64cc, 0x0148, 0x9046, 0xb810, 0x9306, 0x1904, 0x61c8, 0xb814,
-	0x9206, 0x15f0, 0x0028, 0xbb12, 0xba16, 0x0010, 0x080c, 0x48eb,
-	0x0150, 0x04b0, 0x080c, 0x652d, 0x1598, 0xb810, 0x9306, 0x1580,
-	0xb814, 0x9206, 0x1568, 0x080c, 0xaa82, 0x0530, 0x2b00, 0x6012,
-	0x080c, 0xcbb0, 0x2900, 0x6016, 0x600b, 0xffff, 0x6023, 0x000a,
-	0xa878, 0x9086, 0x0001, 0x1170, 0x080c, 0x31ab, 0x9006, 0x080c,
-	0x6469, 0x2001, 0x0002, 0x080c, 0x647d, 0x2001, 0x0200, 0xb86e,
-	0xb893, 0x0002, 0x2009, 0x0003, 0x080c, 0xab77, 0x9006, 0x0068,
-	0x2001, 0x0001, 0x900e, 0x0038, 0x2001, 0x002c, 0x900e, 0x0018,
-	0x2001, 0x0028, 0x900e, 0x9005, 0x0000, 0x012e, 0x00be, 0x00fe,
-	0x0005, 0x00b6, 0x00f6, 0x00e6, 0x0126, 0x2091, 0x8000, 0xa894,
-	0x90c6, 0x0015, 0x0904, 0x63a7, 0x90c6, 0x0056, 0x0904, 0x63ab,
-	0x90c6, 0x0066, 0x0904, 0x63af, 0x90c6, 0x0071, 0x0904, 0x63b3,
-	0x90c6, 0x0074, 0x0904, 0x63b7, 0x90c6, 0x007c, 0x0904, 0x63bb,
-	0x90c6, 0x007e, 0x0904, 0x63bf, 0x90c6, 0x0037, 0x0904, 0x63c3,
-	0x9016, 0x2079, 0x1800, 0xa974, 0x9186, 0x00ff, 0x0904, 0x63a2,
-	0x9182, 0x0800, 0x1a04, 0x63a2, 0x080c, 0x652d, 0x1198, 0xb804,
-	0x9084, 0x00ff, 0x9082, 0x0006, 0x1268, 0xa894, 0x90c6, 0x006f,
-	0x0148, 0x080c, 0xaa42, 0x1904, 0x638b, 0xb8a0, 0x9084, 0xff80,
-	0x1904, 0x638b, 0xa894, 0x90c6, 0x006f, 0x0158, 0x90c6, 0x005e,
-	0x0904, 0x62eb, 0x90c6, 0x0064, 0x0904, 0x6314, 0x2008, 0x0804,
-	0x62ad, 0xa998, 0xa8b0, 0x2040, 0x080c, 0xaa42, 0x1120, 0x9182,
-	0x007f, 0x0a04, 0x62ad, 0x9186, 0x00ff, 0x0904, 0x62ad, 0x9182,
-	0x0800, 0x1a04, 0x62ad, 0xaaa0, 0xab9c, 0x787c, 0x9306, 0x1188,
-	0x7880, 0x0096, 0x924e, 0x1128, 0x2208, 0x2310, 0x009e, 0x0804,
-	0x62ad, 0x99cc, 0xff00, 0x009e, 0x1120, 0x2208, 0x2310, 0x0804,
-	0x62ad, 0x080c, 0x48eb, 0x0904, 0x62b7, 0x900e, 0x9016, 0x90c6,
-	0x4000, 0x15e0, 0x0006, 0x080c, 0x681c, 0x1108, 0xc185, 0xb800,
-	0xd0bc, 0x0108, 0xc18d, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c,
-	0x9080, 0x0031, 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006,
-	0x2098, 0x080c, 0x0fb8, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c,
-	0x9080, 0x0035, 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x000a,
-	0x2098, 0x080c, 0x0fb8, 0xa8c4, 0xabc8, 0x9305, 0xabcc, 0x9305,
-	0xabd0, 0x9305, 0xabd4, 0x9305, 0xabd8, 0x9305, 0xabdc, 0x9305,
-	0xabe0, 0x9305, 0x9005, 0x0510, 0x000e, 0x00c8, 0x90c6, 0x4007,
-	0x1110, 0x2408, 0x00a0, 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610,
-	0x0070, 0x90c6, 0x4009, 0x1108, 0x0050, 0x90c6, 0x4006, 0x0138,
-	0x2001, 0x4005, 0x2009, 0x000a, 0x0010, 0x2001, 0x4006, 0xa896,
-	0xa99a, 0xaa9e, 0x2001, 0x0030, 0x900e, 0x0478, 0x000e, 0x080c,
-	0xaa82, 0x1130, 0x2001, 0x4005, 0x2009, 0x0003, 0x9016, 0x0c78,
-	0x2b00, 0x6012, 0x080c, 0xcbb0, 0x2900, 0x6016, 0x6023, 0x0001,
-	0xa868, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x31ab, 0x012e, 0x9006, 0x080c, 0x6469, 0x2001, 0x0002,
-	0x080c, 0x647d, 0x2009, 0x0002, 0x080c, 0xab77, 0xa8b0, 0xd094,
-	0x0118, 0xb8d4, 0xc08d, 0xb8d6, 0x9006, 0x9005, 0x012e, 0x00ee,
-	0x00fe, 0x00be, 0x0005, 0x080c, 0x5610, 0x0118, 0x2009, 0x0007,
-	0x00f8, 0xa998, 0xaeb0, 0x080c, 0x652d, 0x1904, 0x62a8, 0x9186,
-	0x007f, 0x0130, 0x080c, 0x696a, 0x0118, 0x2009, 0x0009, 0x0080,
-	0x0096, 0x080c, 0x103b, 0x1120, 0x009e, 0x2009, 0x0002, 0x0040,
-	0x2900, 0x009e, 0xa806, 0x080c, 0xc908, 0x19b0, 0x2009, 0x0003,
-	0x2001, 0x4005, 0x0804, 0x62af, 0xa998, 0xaeb0, 0x080c, 0x652d,
-	0x1904, 0x62a8, 0x0096, 0x080c, 0x103b, 0x1128, 0x009e, 0x2009,
-	0x0002, 0x0804, 0x6368, 0x2900, 0x009e, 0xa806, 0x0096, 0x2048,
-	0x20a9, 0x002b, 0xb8c4, 0x20e0, 0xb8c8, 0x2098, 0xa860, 0x20e8,
-	0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080,
-	0x0006, 0x20a0, 0xbbc8, 0x9398, 0x0006, 0x2398, 0x080c, 0x0fb8,
-	0x009e, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0xd684,
-	0x1168, 0x080c, 0x55fc, 0xd0b4, 0x1118, 0xa89b, 0x000b, 0x00e0,
-	0xb800, 0xd08c, 0x0118, 0xa89b, 0x000c, 0x00b0, 0x080c, 0x696a,
-	0x0118, 0xa89b, 0x0009, 0x0080, 0x080c, 0x5610, 0x0118, 0xa89b,
-	0x0007, 0x0050, 0x080c, 0xc8eb, 0x1904, 0x62e4, 0x2009, 0x0003,
-	0x2001, 0x4005, 0x0804, 0x62af, 0xa87b, 0x0030, 0xa897, 0x4005,
-	0xa804, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0,
-	0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4,
-	0x2031, 0x0000, 0x2041, 0x1275, 0x080c, 0xaffd, 0x1904, 0x62e4,
-	0x2009, 0x0002, 0x08e8, 0x2001, 0x0028, 0x900e, 0x0804, 0x62e5,
-	0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038,
-	0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x900e,
-	0x0804, 0x62e5, 0x2001, 0x0029, 0x900e, 0x0804, 0x62e5, 0x080c,
-	0x3757, 0x0804, 0x62e6, 0x080c, 0x5331, 0x0804, 0x62e6, 0x080c,
-	0x4533, 0x0804, 0x62e6, 0x080c, 0x49ae, 0x0804, 0x62e6, 0x080c,
-	0x4c65, 0x0804, 0x62e6, 0x080c, 0x4fab, 0x0804, 0x62e6, 0x080c,
-	0x519c, 0x0804, 0x62e6, 0x080c, 0x3975, 0x0804, 0x62e6, 0x00b6,
-	0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1608, 0x9182,
-	0x0800, 0x1258, 0x9188, 0x1000, 0x2104, 0x905d, 0x0130, 0x080c,
-	0x696a, 0x1138, 0x00d9, 0x9006, 0x00b0, 0x2001, 0x0028, 0x900e,
-	0x0090, 0x9082, 0x0006, 0x1240, 0xb900, 0xd1fc, 0x0d98, 0x2001,
-	0x0029, 0x2009, 0x1000, 0x0038, 0x2001, 0x0029, 0x900e, 0x0018,
-	0x2001, 0x0029, 0x900e, 0x9005, 0x00be, 0x0005, 0xa877, 0x0000,
-	0xb8d0, 0x9005, 0x1904, 0x645d, 0xb888, 0x9005, 0x1904, 0x645d,
-	0xb838, 0xb93c, 0x9102, 0x1a04, 0x645d, 0x2b10, 0x080c, 0xaaaf,
-	0x0904, 0x6459, 0x8108, 0xb93e, 0x6212, 0x2900, 0x6016, 0x6023,
-	0x0003, 0x600b, 0xffff, 0x6007, 0x0040, 0xa878, 0x605e, 0xa880,
-	0x9084, 0x00ff, 0x6066, 0xa883, 0x0000, 0xa87c, 0xd0ac, 0x0588,
-	0xc0dd, 0xa87e, 0xa888, 0x8001, 0x1530, 0xa816, 0xa864, 0x9094,
-	0x00f7, 0x9296, 0x0011, 0x11f8, 0x9084, 0x00ff, 0xc0bd, 0x601e,
-	0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x2001, 0x000f, 0x8001, 0x1df0,
-	0x2001, 0x8004, 0x6003, 0x0004, 0x6046, 0x00f6, 0x2079, 0x0380,
-	0x7818, 0xd0bc, 0x1de8, 0x7833, 0x0010, 0x2c00, 0x7836, 0x781b,
-	0x8080, 0x00fe, 0x0005, 0x080c, 0x1728, 0x601c, 0xc0bd, 0x601e,
-	0x0c38, 0xd0b4, 0x190c, 0x1c0c, 0x2001, 0x8004, 0x6003, 0x0002,
-	0x0c18, 0x81ff, 0x1110, 0xb88b, 0x0001, 0x2908, 0xb8cc, 0xb9ce,
-	0x9005, 0x1110, 0xb9d2, 0x0020, 0x0096, 0x2048, 0xa902, 0x009e,
-	0x0005, 0x00b6, 0x0126, 0x00c6, 0x0026, 0x2091, 0x8000, 0x6210,
-	0x2258, 0xba00, 0x9005, 0x0110, 0xc285, 0x0008, 0xc284, 0xba02,
-	0x002e, 0x00ce, 0x012e, 0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6,
-	0x2091, 0x8000, 0x6210, 0x2258, 0xba04, 0x0006, 0x9086, 0x0006,
-	0x1170, 0xb89c, 0xd0ac, 0x0158, 0x080c, 0x6966, 0x0140, 0x9284,
-	0xff00, 0x8007, 0x9086, 0x0007, 0x1110, 0x2011, 0x0600, 0x000e,
-	0x9294, 0xff00, 0x9215, 0xba06, 0x0006, 0x9086, 0x0006, 0x1120,
-	0xba90, 0x82ff, 0x090c, 0x0d7d, 0x000e, 0x00ce, 0x012e, 0x00be,
-	0x0005, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6210, 0x2258,
-	0xba04, 0x0006, 0x9086, 0x0006, 0x1168, 0xb89c, 0xd0a4, 0x0150,
-	0x080c, 0x6962, 0x1138, 0x9284, 0x00ff, 0x9086, 0x0007, 0x1110,
-	0x2011, 0x0006, 0x000e, 0x9294, 0x00ff, 0x8007, 0x9215, 0xba06,
-	0x00ce, 0x012e, 0x00be, 0x0005, 0x9182, 0x0800, 0x0218, 0x9085,
-	0x0001, 0x0005, 0x00d6, 0x0026, 0x9190, 0x1000, 0x2204, 0x905d,
-	0x1188, 0x0096, 0x080c, 0x103b, 0x2958, 0x009e, 0x0168, 0x2b00,
-	0x2012, 0xb85c, 0xb8ca, 0xb860, 0xb8c6, 0x9006, 0xb8a6, 0xb8ae,
-	0x080c, 0x5f5b, 0x9006, 0x0010, 0x9085, 0x0001, 0x002e, 0x00de,
-	0x0005, 0x00b6, 0x0096, 0x0126, 0x2091, 0x8000, 0x0026, 0x9182,
-	0x0800, 0x0218, 0x9085, 0x0001, 0x0458, 0x00d6, 0x9190, 0x1000,
-	0x2204, 0x905d, 0x0518, 0x2013, 0x0000, 0xb8a4, 0x904d, 0x0110,
-	0x080c, 0x106d, 0x00d6, 0x00c6, 0xb8bc, 0x2060, 0x8cff, 0x0168,
-	0x600c, 0x0006, 0x6014, 0x2048, 0x080c, 0xc723, 0x0110, 0x080c,
-	0x0fed, 0x080c, 0xaad8, 0x00ce, 0x0c88, 0x00ce, 0x00de, 0x2b48,
-	0xb8c8, 0xb85e, 0xb8c4, 0xb862, 0x080c, 0x107d, 0x00de, 0x9006,
-	0x002e, 0x012e, 0x009e, 0x00be, 0x0005, 0x0016, 0x9182, 0x0800,
-	0x0218, 0x9085, 0x0001, 0x0030, 0x9188, 0x1000, 0x2104, 0x905d,
-	0x0dc0, 0x9006, 0x001e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146,
-	0x9006, 0xb80a, 0xb80e, 0xb800, 0xc08c, 0xb802, 0x080c, 0x73e4,
-	0x1510, 0xb8a0, 0x9086, 0x007e, 0x0120, 0x080c, 0xaa42, 0x11d8,
-	0x0078, 0x7040, 0xd0e4, 0x01b8, 0x00c6, 0x2061, 0x1980, 0x7048,
-	0x2062, 0x704c, 0x6006, 0x7050, 0x600a, 0x7054, 0x600e, 0x00ce,
-	0x703c, 0x2069, 0x0140, 0x9005, 0x1110, 0x2001, 0x0001, 0x6886,
-	0x2069, 0x1800, 0x68b6, 0x7040, 0xb85e, 0x7048, 0xb862, 0x704c,
-	0xb866, 0x20e1, 0x0000, 0x2099, 0x0276, 0xb8c4, 0x20e8, 0xb8c8,
-	0x9088, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2099, 0x027a,
-	0x9088, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2069, 0x0200,
-	0x6817, 0x0001, 0x7040, 0xb86a, 0x7144, 0xb96e, 0x7048, 0xb872,
-	0x7050, 0xb876, 0x2069, 0x0200, 0x6817, 0x0000, 0xb8a0, 0x9086,
-	0x007e, 0x1110, 0x7144, 0xb96e, 0x9182, 0x0211, 0x1218, 0x2009,
-	0x0008, 0x0400, 0x9182, 0x0259, 0x1218, 0x2009, 0x0007, 0x00d0,
-	0x9182, 0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0, 0x9182, 0x0349,
-	0x1218, 0x2009, 0x0005, 0x0070, 0x9182, 0x0421, 0x1218, 0x2009,
-	0x0004, 0x0040, 0x9182, 0x0581, 0x1218, 0x2009, 0x0003, 0x0010,
-	0x2009, 0x0002, 0xb992, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005,
-	0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, 0x7034, 0xb896, 0x703c,
-	0xb89a, 0x7054, 0xb89e, 0x0036, 0xbbd4, 0xc384, 0xba00, 0x2009,
-	0x1867, 0x210c, 0xd0bc, 0x0120, 0xd1ec, 0x0110, 0xc2ad, 0x0008,
-	0xc2ac, 0xd0c4, 0x0148, 0xd1e4, 0x0138, 0xc2bd, 0xd0cc, 0x0128,
-	0xd38c, 0x1108, 0xc385, 0x0008, 0xc2bc, 0xba02, 0xbbd6, 0x003e,
-	0x00ee, 0x002e, 0x001e, 0x0005, 0x0096, 0x0126, 0x2091, 0x8000,
-	0xb8a4, 0x904d, 0x0578, 0xa900, 0x81ff, 0x15c0, 0xaa04, 0x9282,
-	0x0010, 0x16c8, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x8906, 0x8006,
-	0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9080, 0x0004,
-	0x2098, 0x2009, 0x0010, 0x20a9, 0x0001, 0x4002, 0x9086, 0xffff,
-	0x0120, 0x8109, 0x1dd0, 0x080c, 0x0d7d, 0x3c00, 0x20e8, 0x3300,
-	0x8001, 0x20a0, 0x4604, 0x8210, 0xaa06, 0x01de, 0x01ce, 0x014e,
-	0x013e, 0x0060, 0x080c, 0x103b, 0x0170, 0x2900, 0xb8a6, 0xa803,
-	0x0000, 0x080c, 0x67b8, 0xa807, 0x0001, 0xae12, 0x9085, 0x0001,
-	0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0126, 0x2091, 0x8000,
-	0x0096, 0xb8a4, 0x904d, 0x0188, 0xa800, 0x9005, 0x1150, 0x080c,
-	0x67c7, 0x1158, 0xa804, 0x908a, 0x0002, 0x0218, 0x8001, 0xa806,
-	0x0020, 0x080c, 0x106d, 0xb8a7, 0x0000, 0x009e, 0x012e, 0x0005,
-	0x0096, 0x00c6, 0xb888, 0x9005, 0x1904, 0x66b1, 0xb8d0, 0x904d,
-	0x0904, 0x66b1, 0x080c, 0xaaaf, 0x0904, 0x66ad, 0x8210, 0xba3e,
-	0xa800, 0xb8d2, 0x9005, 0x1108, 0xb8ce, 0x2b00, 0x6012, 0x2900,
-	0x6016, 0x6023, 0x0003, 0x600b, 0xffff, 0x6007, 0x0040, 0xa878,
-	0x605e, 0xa880, 0x9084, 0x00ff, 0x6066, 0xa883, 0x0000, 0xa87c,
-	0xd0ac, 0x01c8, 0xc0dd, 0xa87e, 0xa888, 0x8001, 0x1568, 0xa816,
-	0xa864, 0x9094, 0x00f7, 0x9296, 0x0011, 0x1530, 0x9084, 0x00ff,
-	0xc0bd, 0x601e, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x2001, 0x8004,
-	0x6003, 0x0004, 0x0030, 0x080c, 0x1c0c, 0x2001, 0x8004, 0x6003,
-	0x0002, 0x6046, 0x2001, 0x0010, 0x2c08, 0x080c, 0xa772, 0xb838,
-	0xba3c, 0x9202, 0x0a04, 0x665e, 0x0020, 0x82ff, 0x1110, 0xb88b,
-	0x0001, 0x00ce, 0x009e, 0x0005, 0x080c, 0x1728, 0x601c, 0xc0bd,
-	0x601e, 0x08e0, 0x00b6, 0x0096, 0x0016, 0x20a9, 0x0800, 0x900e,
-	0x0016, 0x080c, 0x652d, 0x1158, 0xb8d0, 0x904d, 0x0140, 0x3e00,
-	0x9086, 0x0002, 0x1118, 0xb800, 0xd0bc, 0x1108, 0x0041, 0x001e,
-	0x8108, 0x1f04, 0x66c0, 0x001e, 0x00be, 0x009e, 0x0005, 0x0096,
-	0x0016, 0xb8d0, 0x904d, 0x0188, 0xa800, 0xb8d2, 0x9005, 0x1108,
-	0xb8ce, 0x9006, 0xa802, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000,
-	0x080c, 0xca1a, 0x080c, 0x6c7f, 0x0c60, 0x001e, 0x009e, 0x0005,
-	0x0086, 0x9046, 0xb8d0, 0x904d, 0x0198, 0xa86c, 0x9406, 0x1118,
-	0xa870, 0x9506, 0x0128, 0x2940, 0xa800, 0x904d, 0x0148, 0x0ca8,
-	0xa800, 0x88ff, 0x1110, 0xb8d2, 0x0008, 0xa002, 0xa803, 0x0000,
-	0x008e, 0x0005, 0x901e, 0x0010, 0x2019, 0x0001, 0x00e6, 0x0096,
-	0x00c6, 0x0086, 0x0026, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e5,
-	0x9046, 0x7028, 0x9065, 0x01e8, 0x6014, 0x2068, 0x83ff, 0x0120,
-	0x605c, 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, 0x1118, 0xa870,
-	0x9506, 0x0120, 0x2c40, 0x600c, 0x2060, 0x0c60, 0x600c, 0x0006,
-	0x0066, 0x2830, 0x080c, 0x9e79, 0x006e, 0x000e, 0x83ff, 0x0508,
-	0x0c08, 0x9046, 0xb8d0, 0x904d, 0x01e0, 0x83ff, 0x0120, 0xa878,
-	0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506,
-	0x0120, 0x2940, 0xa800, 0x2048, 0x0c70, 0xb8d0, 0xaa00, 0x0026,
-	0x9906, 0x1110, 0xbad2, 0x0008, 0xa202, 0x000e, 0x83ff, 0x0108,
-	0x0c10, 0x002e, 0x008e, 0x00ce, 0x009e, 0x00ee, 0x0005, 0x9016,
-	0x0489, 0x1110, 0x2011, 0x0001, 0x0005, 0x080c, 0x681c, 0x0128,
-	0x080c, 0xc7ef, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, 0x681c,
-	0x0128, 0x080c, 0xc785, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c,
-	0x681c, 0x0128, 0x080c, 0xc7ec, 0x0010, 0x9085, 0x0001, 0x0005,
-	0x080c, 0x681c, 0x0128, 0x080c, 0xc7a9, 0x0010, 0x9085, 0x0001,
-	0x0005, 0x080c, 0x681c, 0x0128, 0x080c, 0xc819, 0x0010, 0x9085,
-	0x0001, 0x0005, 0xb8a4, 0x900d, 0x1118, 0x9085, 0x0001, 0x0005,
+	0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x0006, 0x0029,
+	0x0010, 0x080c, 0x5fd8, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0007,
+	0x080c, 0x5f80, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000,
+	0x080c, 0x5ffc, 0x080c, 0x5fdf, 0x11b8, 0x7084, 0x9005, 0x11a0,
+	0x7164, 0x9186, 0xffff, 0x0180, 0x9180, 0x336d, 0x200d, 0x918c,
+	0xff00, 0x810f, 0x2011, 0x0008, 0x080c, 0x5e34, 0x0180, 0x080c,
+	0x4fdd, 0x0110, 0x080c, 0x2664, 0x20a9, 0x0008, 0x20e1, 0x0000,
+	0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3,
+	0x0014, 0x080c, 0x5eb1, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005,
+	0x0500, 0x2011, 0x5e87, 0x080c, 0x860d, 0x9086, 0x0014, 0x11b8,
+	0x080c, 0x5ffc, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178,
+	0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005,
+	0x1110, 0x70c7, 0x0001, 0x709b, 0x0008, 0x0029, 0x0010, 0x080c,
+	0x5fd8, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0009, 0x080c, 0x5f80,
+	0x2079, 0x0240, 0x7833, 0x1105, 0x7837, 0x0100, 0x080c, 0x5fdf,
+	0x1150, 0x7084, 0x9005, 0x1138, 0x080c, 0x5da7, 0x1188, 0x9085,
+	0x0001, 0x080c, 0x2664, 0x20a9, 0x0008, 0x080c, 0x5ffc, 0x20e1,
+	0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003,
+	0x60c3, 0x0014, 0x080c, 0x5eb1, 0x0010, 0x080c, 0x5901, 0x00fe,
+	0x0005, 0x00f6, 0x7090, 0x9005, 0x05a8, 0x2011, 0x5e87, 0x080c,
+	0x860d, 0x9086, 0x0014, 0x1560, 0x080c, 0x5ffc, 0x2079, 0x0260,
+	0x7a30, 0x9296, 0x1105, 0x1520, 0x7834, 0x9084, 0x0100, 0x2011,
+	0x0100, 0x921e, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005,
+	0x1110, 0x70c7, 0x0001, 0x709b, 0x000a, 0x00b1, 0x0098, 0x9005,
+	0x1178, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7,
+	0x0001, 0x7097, 0x0000, 0x709b, 0x000e, 0x080c, 0x5b4f, 0x0010,
+	0x080c, 0x5fd8, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x000b, 0x2011,
+	0x1d0e, 0x20e9, 0x0001, 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff,
+	0x4304, 0x080c, 0x5f80, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837,
+	0x0000, 0x080c, 0x5fdf, 0x0118, 0x2013, 0x0000, 0x0020, 0x7060,
+	0x9085, 0x0100, 0x2012, 0x20a9, 0x0040, 0x2009, 0x024e, 0x2011,
+	0x1d0e, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810,
+	0x8000, 0x6812, 0x2009, 0x0240, 0x1f04, 0x5ad1, 0x60c3, 0x0084,
+	0x080c, 0x5eb1, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x01c0,
+	0x2011, 0x5e87, 0x080c, 0x860d, 0x9086, 0x0084, 0x1178, 0x080c,
+	0x5ffc, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1138, 0x7834,
+	0x9005, 0x1120, 0x709b, 0x000c, 0x0029, 0x0010, 0x080c, 0x5fd8,
+	0x00fe, 0x0005, 0x00f6, 0x709b, 0x000d, 0x080c, 0x5f80, 0x2079,
+	0x0240, 0x7833, 0x1107, 0x7837, 0x0000, 0x080c, 0x5ffc, 0x20a9,
+	0x0040, 0x2011, 0x026e, 0x2009, 0x024e, 0x220e, 0x8210, 0x8108,
+	0x9186, 0x0260, 0x1150, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240,
+	0x6814, 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, 0x5b15, 0x60c3,
+	0x0084, 0x080c, 0x5eb1, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005,
+	0x01e0, 0x2011, 0x5e87, 0x080c, 0x860d, 0x9086, 0x0084, 0x1198,
+	0x080c, 0x5ffc, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158,
+	0x7834, 0x9005, 0x1140, 0x7097, 0x0001, 0x080c, 0x5f52, 0x709b,
+	0x000e, 0x0029, 0x0010, 0x080c, 0x5fd8, 0x00fe, 0x0005, 0x918d,
+	0x0001, 0x080c, 0x6027, 0x709b, 0x000f, 0x7093, 0x0000, 0x2061,
+	0x0140, 0x605b, 0xbc85, 0x605f, 0xb5b5, 0x2061, 0x0100, 0x6043,
+	0x0005, 0x6043, 0x0004, 0x2009, 0x07d0, 0x2011, 0x5e87, 0x080c,
+	0x8601, 0x0005, 0x7090, 0x9005, 0x0130, 0x2011, 0x5e87, 0x080c,
+	0x860d, 0x709b, 0x0000, 0x0005, 0x709b, 0x0011, 0x080c, 0xa66c,
+	0x080c, 0x5ffc, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000,
+	0x20a1, 0x0240, 0x7490, 0x9480, 0x0018, 0x9080, 0x0007, 0x9084,
+	0x03f8, 0x8004, 0x20a8, 0x4003, 0x080c, 0x5fdf, 0x11a0, 0x717c,
+	0x81ff, 0x0188, 0x900e, 0x7080, 0x9084, 0x00ff, 0x0160, 0x080c,
+	0x25fb, 0x9186, 0x007e, 0x0138, 0x9186, 0x0080, 0x0120, 0x2011,
+	0x0008, 0x080c, 0x5e34, 0x60c3, 0x0014, 0x080c, 0x5eb1, 0x0005,
+	0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, 0x5e87, 0x080c, 0x860d,
+	0x9086, 0x0014, 0x11b8, 0x080c, 0x5ffc, 0x2079, 0x0260, 0x7a30,
+	0x9296, 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc,
+	0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x0012,
+	0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b,
+	0x0013, 0x080c, 0x5f8e, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837,
+	0x0000, 0x080c, 0x5ffc, 0x080c, 0x5fdf, 0x1170, 0x7084, 0x9005,
+	0x1158, 0x715c, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c,
+	0x5e34, 0x0168, 0x080c, 0x5fb5, 0x20a9, 0x0008, 0x20e1, 0x0000,
+	0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3,
+	0x0014, 0x080c, 0x5eb1, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005,
+	0x0500, 0x2011, 0x5e87, 0x080c, 0x860d, 0x9086, 0x0014, 0x11b8,
+	0x080c, 0x5ffc, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178,
+	0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005,
+	0x1110, 0x70c7, 0x0001, 0x709b, 0x0014, 0x0029, 0x0010, 0x7093,
+	0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0015, 0x080c, 0x5f8e,
+	0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x5ffc,
+	0x080c, 0x5fdf, 0x11b8, 0x7084, 0x9005, 0x11a0, 0x7164, 0x9186,
+	0xffff, 0x0180, 0x9180, 0x336d, 0x200d, 0x918c, 0xff00, 0x810f,
+	0x2011, 0x0008, 0x080c, 0x5e34, 0x0180, 0x080c, 0x4fdd, 0x0110,
+	0x080c, 0x2664, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e,
+	0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c,
+	0x5eb1, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x05f0, 0x2011,
+	0x5e87, 0x080c, 0x860d, 0x9086, 0x0014, 0x15a8, 0x080c, 0x5ffc,
+	0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, 0x1568, 0x7834, 0x9084,
+	0x0100, 0x2011, 0x0100, 0x921e, 0x1168, 0x9085, 0x0001, 0x080c,
+	0x6027, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7,
+	0x0001, 0x0080, 0x9005, 0x11b8, 0x7a38, 0xd2fc, 0x0128, 0x70c4,
+	0x9005, 0x1110, 0x70c7, 0x0001, 0x9085, 0x0001, 0x080c, 0x6027,
+	0x7097, 0x0000, 0x7a38, 0xd2f4, 0x0110, 0x70df, 0x0008, 0x709b,
+	0x0016, 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x080c,
+	0xa66c, 0x080c, 0x5ffc, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9,
+	0x0000, 0x20a1, 0x0240, 0x20a9, 0x000e, 0x4003, 0x2011, 0x026d,
+	0x2204, 0x9084, 0x0100, 0x2011, 0x024d, 0x2012, 0x2011, 0x026e,
+	0x709b, 0x0017, 0x080c, 0x5fdf, 0x1150, 0x7084, 0x9005, 0x1138,
+	0x080c, 0x5da7, 0x1188, 0x9085, 0x0001, 0x080c, 0x2664, 0x20a9,
+	0x0008, 0x080c, 0x5ffc, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9,
+	0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5eb1,
+	0x0010, 0x080c, 0x5901, 0x0005, 0x00f6, 0x7090, 0x9005, 0x01d8,
+	0x2011, 0x5e87, 0x080c, 0x860d, 0x9086, 0x0084, 0x1190, 0x080c,
+	0x5ffc, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1150, 0x7834,
+	0x9005, 0x1138, 0x9006, 0x080c, 0x6027, 0x709b, 0x0018, 0x0029,
+	0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0019,
+	0x080c, 0x5f8e, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000,
+	0x080c, 0x5ffc, 0x2009, 0x026e, 0x2039, 0x1d0e, 0x20a9, 0x0040,
+	0x213e, 0x8738, 0x8108, 0x9186, 0x0280, 0x1128, 0x6814, 0x8000,
+	0x6816, 0x2009, 0x0260, 0x1f04, 0x5d10, 0x2039, 0x1d0e, 0x080c,
+	0x5fdf, 0x11e8, 0x2728, 0x2514, 0x8207, 0x9084, 0x00ff, 0x8000,
+	0x2018, 0x9294, 0x00ff, 0x8007, 0x9205, 0x202a, 0x7060, 0x2310,
+	0x8214, 0x92a0, 0x1d0e, 0x2414, 0x938c, 0x0001, 0x0118, 0x9294,
+	0xff00, 0x0018, 0x9294, 0x00ff, 0x8007, 0x9215, 0x2222, 0x20a9,
+	0x0040, 0x2009, 0x024e, 0x270e, 0x8738, 0x8108, 0x9186, 0x0260,
+	0x1128, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x1f04, 0x5d43,
+	0x60c3, 0x0084, 0x080c, 0x5eb1, 0x00fe, 0x0005, 0x00f6, 0x7090,
+	0x9005, 0x01e0, 0x2011, 0x5e87, 0x080c, 0x860d, 0x9086, 0x0084,
+	0x1198, 0x080c, 0x5ffc, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107,
+	0x1158, 0x7834, 0x9005, 0x1140, 0x7097, 0x0001, 0x080c, 0x5f52,
+	0x709b, 0x001a, 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005,
+	0x9085, 0x0001, 0x080c, 0x6027, 0x709b, 0x001b, 0x080c, 0xa66c,
+	0x080c, 0x5ffc, 0x2011, 0x0260, 0x2009, 0x0240, 0x7490, 0x9480,
+	0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, 0x220e,
+	0x8210, 0x8108, 0x9186, 0x0260, 0x1150, 0x6810, 0x8000, 0x6812,
+	0x2009, 0x0240, 0x6814, 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04,
+	0x5d8f, 0x60c3, 0x0084, 0x080c, 0x5eb1, 0x0005, 0x0005, 0x0086,
+	0x0096, 0x2029, 0x1848, 0x252c, 0x20a9, 0x0008, 0x2041, 0x1d0e,
+	0x20e9, 0x0001, 0x28a0, 0x080c, 0x5ffc, 0x20e1, 0x0000, 0x2099,
+	0x026e, 0x4003, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0108,
+	0x9016, 0x2800, 0x9200, 0x200c, 0x91a6, 0xffff, 0x1148, 0xd5d4,
+	0x0110, 0x8210, 0x0008, 0x8211, 0x1f04, 0x5dc1, 0x0804, 0x5e30,
+	0x82ff, 0x1160, 0xd5d4, 0x0120, 0x91a6, 0x3fff, 0x0d90, 0x0020,
+	0x91a6, 0x3fff, 0x0904, 0x5e30, 0x918d, 0xc000, 0x20a9, 0x0010,
+	0x2019, 0x0001, 0xd5d4, 0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4,
+	0x0110, 0x8423, 0x0008, 0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319,
+	0x0008, 0x8318, 0x1f04, 0x5de7, 0x04d8, 0x23a8, 0x2021, 0x0001,
+	0x8426, 0x8425, 0x1f04, 0x5df9, 0x2328, 0x8529, 0x92be, 0x0007,
+	0x0158, 0x0006, 0x2039, 0x0007, 0x2200, 0x973a, 0x000e, 0x27a8,
+	0x95a8, 0x0010, 0x1f04, 0x5e08, 0x755e, 0x95c8, 0x336d, 0x292d,
+	0x95ac, 0x00ff, 0x7582, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c,
+	0x2644, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x2018, 0x2304, 0x9405,
+	0x201a, 0x7087, 0x0001, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x20e1,
+	0x0001, 0x2898, 0x20a9, 0x0008, 0x4003, 0x9085, 0x0001, 0x0008,
+	0x9006, 0x009e, 0x008e, 0x0005, 0x0156, 0x01c6, 0x01d6, 0x0136,
+	0x0146, 0x22a8, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000,
+	0x2011, 0x024e, 0x22a0, 0x4003, 0x014e, 0x013e, 0x01de, 0x01ce,
+	0x015e, 0x2118, 0x9026, 0x2001, 0x0007, 0x939a, 0x0010, 0x0218,
+	0x8420, 0x8001, 0x0cd0, 0x2118, 0x84ff, 0x0120, 0x939a, 0x0010,
+	0x8421, 0x1de0, 0x2021, 0x0001, 0x83ff, 0x0118, 0x8423, 0x8319,
+	0x1de8, 0x9238, 0x2029, 0x026e, 0x9528, 0x2504, 0x942c, 0x11b8,
+	0x9405, 0x203a, 0x715e, 0x91a0, 0x336d, 0x242d, 0x95ac, 0x00ff,
+	0x7582, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x2644, 0x001e,
+	0x60e7, 0x0000, 0x65ea, 0x7087, 0x0001, 0x9084, 0x0000, 0x0005,
+	0x00e6, 0x2071, 0x1800, 0x708b, 0x0000, 0x00ee, 0x0005, 0x00e6,
+	0x00f6, 0x2079, 0x0100, 0x2071, 0x0140, 0x080c, 0x5f41, 0x080c,
+	0x9e0e, 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, 0x2a1a, 0x0126,
+	0x2091, 0x8000, 0x2071, 0x1826, 0x2073, 0x0000, 0x7840, 0x0026,
+	0x0016, 0x2009, 0x00f7, 0x080c, 0x5f9e, 0x001e, 0x9094, 0x0010,
+	0x9285, 0x0080, 0x7842, 0x7a42, 0x002e, 0x012e, 0x00fe, 0x00ee,
+	0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x2979, 0x0228, 0x2011,
+	0x0101, 0x2204, 0xc0c5, 0x2012, 0x2011, 0x19f4, 0x2013, 0x0000,
+	0x7093, 0x0000, 0x012e, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c,
+	0x9e01, 0x6144, 0xd184, 0x0120, 0x7198, 0x918d, 0x2000, 0x0018,
+	0x718c, 0x918d, 0x1000, 0x2011, 0x1999, 0x2112, 0x2009, 0x07d0,
+	0x2011, 0x5e87, 0x080c, 0x86d7, 0x0005, 0x0016, 0x0026, 0x00c6,
+	0x0126, 0x2091, 0x8000, 0x080c, 0xa872, 0x080c, 0xab3a, 0x080c,
+	0xa88e, 0x2009, 0x00f7, 0x080c, 0x5f9e, 0x2061, 0x1a03, 0x900e,
+	0x611a, 0x611e, 0x6172, 0x6176, 0x2061, 0x1800, 0x6003, 0x0001,
+	0x2061, 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x1999,
+	0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x5f0d, 0x080c, 0x8601,
+	0x012e, 0x00ce, 0x002e, 0x001e, 0x0005, 0x00e6, 0x0006, 0x0126,
+	0x2091, 0x8000, 0x0471, 0x2071, 0x0100, 0x080c, 0x9e0e, 0x2071,
+	0x0140, 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, 0x2a1a, 0x080c,
+	0x74dd, 0x0188, 0x080c, 0x74f8, 0x1170, 0x080c, 0x77e3, 0x0016,
+	0x080c, 0x2713, 0x2001, 0x196d, 0x2102, 0x001e, 0x080c, 0x77de,
+	0x080c, 0x7406, 0x0050, 0x2009, 0x0001, 0x080c, 0x29f6, 0x2001,
+	0x0001, 0x080c, 0x25a0, 0x080c, 0x5edd, 0x012e, 0x000e, 0x00ee,
+	0x0005, 0x2001, 0x180e, 0x2004, 0xd0bc, 0x0158, 0x0026, 0x0036,
+	0x2011, 0x8017, 0x2001, 0x1999, 0x201c, 0x080c, 0x4b00, 0x003e,
+	0x002e, 0x0005, 0x20a9, 0x0012, 0x20e9, 0x0001, 0x20a1, 0x1d80,
+	0x080c, 0x5ffc, 0x20e9, 0x0000, 0x2099, 0x026e, 0x0099, 0x20a9,
+	0x0020, 0x080c, 0x5ff6, 0x2099, 0x0260, 0x20a1, 0x1d92, 0x0051,
+	0x20a9, 0x000e, 0x080c, 0x5ff9, 0x2099, 0x0260, 0x20a1, 0x1db2,
+	0x0009, 0x0005, 0x0016, 0x0026, 0x3410, 0x3308, 0x2104, 0x8007,
+	0x2012, 0x8108, 0x8210, 0x1f04, 0x5f76, 0x002e, 0x001e, 0x0005,
+	0x080c, 0xa66c, 0x20e1, 0x0001, 0x2099, 0x1d00, 0x20e9, 0x0000,
+	0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x080c, 0xa66c,
+	0x080c, 0x5ffc, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000,
+	0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x00c6, 0x0006,
+	0x2061, 0x0100, 0x810f, 0x2001, 0x1834, 0x2004, 0x9005, 0x1138,
+	0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, 0x9105, 0x0010, 0x9185,
+	0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005, 0x0016, 0x0046, 0x080c,
+	0x6a57, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xe29e,
+	0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x900e,
+	0x080c, 0x31a3, 0x080c, 0xcf2e, 0x0140, 0x0036, 0x2019, 0xffff,
+	0x2021, 0x0007, 0x080c, 0x4cb7, 0x003e, 0x004e, 0x001e, 0x0005,
+	0x080c, 0x5edd, 0x709b, 0x0000, 0x7093, 0x0000, 0x0005, 0x0006,
+	0x2001, 0x180c, 0x2004, 0xd09c, 0x0100, 0x000e, 0x0005, 0x0006,
+	0x0016, 0x0126, 0x2091, 0x8000, 0x2001, 0x0101, 0x200c, 0x918d,
+	0x0006, 0x2102, 0x012e, 0x001e, 0x000e, 0x0005, 0x2009, 0x0001,
+	0x0020, 0x2009, 0x0002, 0x0008, 0x900e, 0x6814, 0x9084, 0xffc0,
+	0x910d, 0x6916, 0x0005, 0x00f6, 0x0156, 0x0146, 0x01d6, 0x9006,
+	0x20a9, 0x0080, 0x20e9, 0x0001, 0x20a1, 0x1d00, 0x4004, 0x2079,
+	0x1d00, 0x7803, 0x2200, 0x7807, 0x00ef, 0x780f, 0x00ef, 0x7813,
+	0x0138, 0x7823, 0xffff, 0x7827, 0xffff, 0x01de, 0x014e, 0x015e,
+	0x00fe, 0x0005, 0x2001, 0x1800, 0x2003, 0x0001, 0x0005, 0x2001,
+	0x19a6, 0x0118, 0x2003, 0x0001, 0x0010, 0x2003, 0x0000, 0x0005,
+	0x0156, 0x20a9, 0x0800, 0x2009, 0x1000, 0x9006, 0x200a, 0x8108,
+	0x1f04, 0x6036, 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156, 0x0136,
+	0x0146, 0x2069, 0x1847, 0x9006, 0xb802, 0xb8d6, 0xb807, 0x0707,
+	0xb80a, 0xb80e, 0xb812, 0x9198, 0x336d, 0x231d, 0x939c, 0x00ff,
+	0xbb16, 0x0016, 0x0026, 0xb886, 0x080c, 0xab33, 0x1120, 0x9192,
+	0x007e, 0x1208, 0xbb86, 0x20a9, 0x0004, 0xb8c4, 0x20e8, 0xb9c8,
+	0x9198, 0x0006, 0x9006, 0x23a0, 0x4004, 0x20a9, 0x0004, 0x9198,
+	0x000a, 0x23a0, 0x4004, 0x002e, 0x001e, 0xb83e, 0xb842, 0xb8ce,
+	0xb8d2, 0xb85e, 0xb862, 0xb866, 0xb86a, 0xb86f, 0x0100, 0xb872,
+	0xb876, 0xb87a, 0xb88a, 0xb88e, 0xb893, 0x0008, 0xb896, 0xb89a,
+	0xb89e, 0xb8be, 0xb9a2, 0x0096, 0xb8a4, 0x904d, 0x0110, 0x080c,
+	0x106c, 0xb8a7, 0x0000, 0x009e, 0x9006, 0xb84a, 0x6810, 0xb83a,
+	0x680c, 0xb846, 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0198, 0x00c6,
+	0x2060, 0x9c82, 0x1ddc, 0x0a0c, 0x0d7d, 0x2001, 0x181a, 0x2004,
+	0x9c02, 0x1a0c, 0x0d7d, 0x080c, 0x8b5f, 0x00ce, 0x090c, 0x8f03,
+	0xb8af, 0x0000, 0x6814, 0x9084, 0x00ff, 0xb842, 0x014e, 0x013e,
+	0x015e, 0x003e, 0x00de, 0x0005, 0x0126, 0x2091, 0x8000, 0xa974,
+	0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x6112, 0x9182,
+	0x0800, 0x1a04, 0x6116, 0x2001, 0x180c, 0x2004, 0x9084, 0x0003,
+	0x1904, 0x611c, 0x9188, 0x1000, 0x2104, 0x905d, 0x0198, 0xb804,
+	0x9084, 0x00ff, 0x908e, 0x0006, 0x1188, 0xb8a4, 0x900d, 0x1904,
+	0x612e, 0x080c, 0x64e7, 0x9006, 0x012e, 0x0005, 0x2001, 0x0005,
+	0x900e, 0x04b8, 0x2001, 0x0028, 0x900e, 0x0498, 0x9082, 0x0006,
+	0x1290, 0x080c, 0xab33, 0x1160, 0xb8a0, 0x9084, 0xff80, 0x1140,
+	0xb900, 0xd1fc, 0x0d10, 0x2001, 0x0029, 0x2009, 0x1000, 0x0408,
+	0x2001, 0x0028, 0x00a8, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118,
+	0x2001, 0x0004, 0x0068, 0xd184, 0x0118, 0x2001, 0x0004, 0x0040,
+	0x2001, 0x0029, 0xb900, 0xd1fc, 0x0118, 0x2009, 0x1000, 0x0048,
+	0x900e, 0x0038, 0x2001, 0x0029, 0x900e, 0x0018, 0x2001, 0x0029,
+	0x900e, 0x9005, 0x012e, 0x0005, 0x2001, 0x180c, 0x2004, 0xd084,
+	0x19d0, 0x9188, 0x1000, 0x2104, 0x9065, 0x09a8, 0x080c, 0x6a5b,
+	0x1990, 0xb800, 0xd0bc, 0x0978, 0x0804, 0x60d5, 0x080c, 0x6889,
+	0x0904, 0x60de, 0x0804, 0x60d9, 0x00e6, 0x2071, 0x19e7, 0x7004,
+	0x9086, 0x0002, 0x1128, 0x7030, 0x9080, 0x0004, 0x2004, 0x9b06,
+	0x00ee, 0x0005, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0xa874,
+	0x908e, 0x00ff, 0x1120, 0x2001, 0x196b, 0x205c, 0x0060, 0xa974,
+	0x9182, 0x0800, 0x1690, 0x9188, 0x1000, 0x2104, 0x905d, 0x01d0,
+	0x080c, 0x69fb, 0x11d0, 0x080c, 0xab73, 0x0570, 0x2b00, 0x6012,
+	0x2900, 0x6016, 0x6023, 0x0009, 0x602b, 0x0000, 0xa874, 0x908e,
+	0x00ff, 0x1110, 0x602b, 0x8000, 0x2009, 0x0043, 0x080c, 0xac68,
+	0x9006, 0x00b0, 0x2001, 0x0028, 0x0090, 0x2009, 0x180c, 0x210c,
+	0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001,
+	0x0004, 0x0010, 0x2001, 0x0029, 0x0010, 0x2001, 0x0029, 0x9005,
+	0x012e, 0x00ee, 0x00be, 0x0005, 0x2001, 0x002c, 0x0cc0, 0x00b6,
+	0x00e6, 0x0126, 0x2091, 0x8000, 0xa974, 0x9182, 0x0800, 0x1a04,
+	0x620a, 0x9188, 0x1000, 0x2104, 0x905d, 0x0904, 0x61e2, 0xb8a0,
+	0x9086, 0x007f, 0x0178, 0x080c, 0x6a63, 0x0160, 0xa994, 0x81ff,
+	0x0130, 0x908e, 0x0004, 0x0130, 0x908e, 0x0005, 0x0118, 0x080c,
+	0x6a5b, 0x1598, 0xa87c, 0xd0fc, 0x01e0, 0xa894, 0x9005, 0x01c8,
+	0x2060, 0x0026, 0x2010, 0x080c, 0xc802, 0x002e, 0x1120, 0x2001,
+	0x0008, 0x0804, 0x620c, 0x6020, 0x9086, 0x000a, 0x0120, 0x2001,
+	0x0008, 0x0804, 0x620c, 0x601a, 0x6003, 0x0008, 0x2900, 0x6016,
+	0x0058, 0x080c, 0xab73, 0x05e8, 0x2b00, 0x6012, 0x2900, 0x6016,
+	0x600b, 0xffff, 0x6023, 0x000a, 0x2009, 0x0003, 0x080c, 0xac68,
+	0x9006, 0x0458, 0x2001, 0x0028, 0x0438, 0x9082, 0x0006, 0x1290,
+	0x080c, 0xab33, 0x1160, 0xb8a0, 0x9084, 0xff80, 0x1140, 0xb900,
+	0xd1fc, 0x0900, 0x2001, 0x0029, 0x2009, 0x1000, 0x00a8, 0x2001,
+	0x0028, 0x0090, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001,
+	0x0004, 0x0050, 0xd184, 0x0118, 0x2001, 0x0004, 0x0028, 0x2001,
+	0x0029, 0x0010, 0x2001, 0x0029, 0x9005, 0x012e, 0x00ee, 0x00be,
+	0x0005, 0x2001, 0x002c, 0x0cc0, 0x00f6, 0x00b6, 0x0126, 0x2091,
+	0x8000, 0xa8e0, 0x9005, 0x1550, 0xa8dc, 0x9082, 0x0101, 0x1630,
+	0xa8c8, 0x9005, 0x1518, 0xa8c4, 0x9082, 0x0101, 0x12f8, 0xa974,
+	0x2079, 0x1800, 0x9182, 0x0800, 0x12e8, 0x7830, 0x9084, 0x0003,
+	0x1130, 0xaa98, 0xab94, 0xa878, 0x9084, 0x0007, 0x00ea, 0x7930,
+	0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001,
+	0x0004, 0x0010, 0x2001, 0x0029, 0x900e, 0x0038, 0x2001, 0x002c,
+	0x900e, 0x0018, 0x2001, 0x0029, 0x900e, 0x9006, 0x0008, 0x9005,
+	0x012e, 0x00be, 0x00fe, 0x0005, 0x62a1, 0x625c, 0x6273, 0x62a1,
+	0x62a1, 0x62a1, 0x62a1, 0x62a1, 0x2100, 0x9082, 0x007e, 0x1278,
+	0x080c, 0x65bd, 0x0148, 0x9046, 0xb810, 0x9306, 0x1904, 0x62a9,
+	0xb814, 0x9206, 0x15f0, 0x0028, 0xbb12, 0xba16, 0x0010, 0x080c,
+	0x49b3, 0x0150, 0x04b0, 0x080c, 0x661e, 0x1598, 0xb810, 0x9306,
+	0x1580, 0xb814, 0x9206, 0x1568, 0x080c, 0xab73, 0x0530, 0x2b00,
+	0x6012, 0x080c, 0xcca8, 0x2900, 0x6016, 0x600b, 0xffff, 0x6023,
+	0x000a, 0xa878, 0x9086, 0x0001, 0x1170, 0x080c, 0x31e4, 0x9006,
+	0x080c, 0x655a, 0x2001, 0x0002, 0x080c, 0x656e, 0x2001, 0x0200,
+	0xb86e, 0xb893, 0x0002, 0x2009, 0x0003, 0x080c, 0xac68, 0x9006,
+	0x0068, 0x2001, 0x0001, 0x900e, 0x0038, 0x2001, 0x002c, 0x900e,
+	0x0018, 0x2001, 0x0028, 0x900e, 0x9005, 0x0000, 0x012e, 0x00be,
+	0x00fe, 0x0005, 0x00b6, 0x00f6, 0x00e6, 0x0126, 0x2091, 0x8000,
+	0xa894, 0x90c6, 0x0015, 0x0904, 0x6490, 0x90c6, 0x0056, 0x0904,
+	0x6494, 0x90c6, 0x0066, 0x0904, 0x6498, 0x90c6, 0x0067, 0x0904,
+	0x649c, 0x90c6, 0x0068, 0x0904, 0x64a0, 0x90c6, 0x0071, 0x0904,
+	0x64a4, 0x90c6, 0x0074, 0x0904, 0x64a8, 0x90c6, 0x007c, 0x0904,
+	0x64ac, 0x90c6, 0x007e, 0x0904, 0x64b0, 0x90c6, 0x0037, 0x0904,
+	0x64b4, 0x9016, 0x2079, 0x1800, 0xa974, 0x9186, 0x00ff, 0x0904,
+	0x648b, 0x9182, 0x0800, 0x1a04, 0x648b, 0x080c, 0x661e, 0x1198,
+	0xb804, 0x9084, 0x00ff, 0x9082, 0x0006, 0x1268, 0xa894, 0x90c6,
+	0x006f, 0x0148, 0x080c, 0xab33, 0x1904, 0x6474, 0xb8a0, 0x9084,
+	0xff80, 0x1904, 0x6474, 0xa894, 0x90c6, 0x006f, 0x0158, 0x90c6,
+	0x005e, 0x0904, 0x63d4, 0x90c6, 0x0064, 0x0904, 0x63fd, 0x2008,
+	0x0804, 0x6396, 0xa998, 0xa8b0, 0x2040, 0x080c, 0xab33, 0x1120,
+	0x9182, 0x007f, 0x0a04, 0x6396, 0x9186, 0x00ff, 0x0904, 0x6396,
+	0x9182, 0x0800, 0x1a04, 0x6396, 0xaaa0, 0xab9c, 0x787c, 0x9306,
+	0x1188, 0x7880, 0x0096, 0x924e, 0x1128, 0x2208, 0x2310, 0x009e,
+	0x0804, 0x6396, 0x99cc, 0xff00, 0x009e, 0x1120, 0x2208, 0x2310,
+	0x0804, 0x6396, 0x080c, 0x49b3, 0x0904, 0x63a0, 0x900e, 0x9016,
+	0x90c6, 0x4000, 0x15e0, 0x0006, 0x080c, 0x690d, 0x1108, 0xc185,
+	0xb800, 0xd0bc, 0x0108, 0xc18d, 0x20a9, 0x0004, 0xa860, 0x20e8,
+	0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080,
+	0x0006, 0x2098, 0x080c, 0x0fb7, 0x20a9, 0x0004, 0xa860, 0x20e8,
+	0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080,
+	0x000a, 0x2098, 0x080c, 0x0fb7, 0xa8c4, 0xabc8, 0x9305, 0xabcc,
+	0x9305, 0xabd0, 0x9305, 0xabd4, 0x9305, 0xabd8, 0x9305, 0xabdc,
+	0x9305, 0xabe0, 0x9305, 0x9005, 0x0510, 0x000e, 0x00c8, 0x90c6,
+	0x4007, 0x1110, 0x2408, 0x00a0, 0x90c6, 0x4008, 0x1118, 0x2708,
+	0x2610, 0x0070, 0x90c6, 0x4009, 0x1108, 0x0050, 0x90c6, 0x4006,
+	0x0138, 0x2001, 0x4005, 0x2009, 0x000a, 0x0010, 0x2001, 0x4006,
+	0xa896, 0xa99a, 0xaa9e, 0x2001, 0x0030, 0x900e, 0x0478, 0x000e,
+	0x080c, 0xab73, 0x1130, 0x2001, 0x4005, 0x2009, 0x0003, 0x9016,
+	0x0c78, 0x2b00, 0x6012, 0x080c, 0xcca8, 0x2900, 0x6016, 0x6023,
+	0x0001, 0xa868, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0x0126, 0x2091,
+	0x8000, 0x080c, 0x31e4, 0x012e, 0x9006, 0x080c, 0x655a, 0x2001,
+	0x0002, 0x080c, 0x656e, 0x2009, 0x0002, 0x080c, 0xac68, 0xa8b0,
+	0xd094, 0x0118, 0xb8d4, 0xc08d, 0xb8d6, 0x9006, 0x9005, 0x012e,
+	0x00ee, 0x00fe, 0x00be, 0x0005, 0x080c, 0x56e7, 0x0118, 0x2009,
+	0x0007, 0x00f8, 0xa998, 0xaeb0, 0x080c, 0x661e, 0x1904, 0x6391,
+	0x9186, 0x007f, 0x0130, 0x080c, 0x6a5b, 0x0118, 0x2009, 0x0009,
+	0x0080, 0x0096, 0x080c, 0x103a, 0x1120, 0x009e, 0x2009, 0x0002,
+	0x0040, 0x2900, 0x009e, 0xa806, 0x080c, 0xca00, 0x19b0, 0x2009,
+	0x0003, 0x2001, 0x4005, 0x0804, 0x6398, 0xa998, 0xaeb0, 0x080c,
+	0x661e, 0x1904, 0x6391, 0x0096, 0x080c, 0x103a, 0x1128, 0x009e,
+	0x2009, 0x0002, 0x0804, 0x6451, 0x2900, 0x009e, 0xa806, 0x0096,
+	0x2048, 0x20a9, 0x002b, 0xb8c4, 0x20e0, 0xb8c8, 0x2098, 0xa860,
+	0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008,
+	0x9080, 0x0006, 0x20a0, 0xbbc8, 0x9398, 0x0006, 0x2398, 0x080c,
+	0x0fb7, 0x009e, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000,
+	0xd684, 0x1168, 0x080c, 0x56d3, 0xd0b4, 0x1118, 0xa89b, 0x000b,
+	0x00e0, 0xb800, 0xd08c, 0x0118, 0xa89b, 0x000c, 0x00b0, 0x080c,
+	0x6a5b, 0x0118, 0xa89b, 0x0009, 0x0080, 0x080c, 0x56e7, 0x0118,
+	0xa89b, 0x0007, 0x0050, 0x080c, 0xc9e3, 0x1904, 0x63cd, 0x2009,
+	0x0003, 0x2001, 0x4005, 0x0804, 0x6398, 0xa87b, 0x0030, 0xa897,
+	0x4005, 0xa804, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084,
+	0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8,
+	0xada4, 0x2031, 0x0000, 0x2041, 0x127e, 0x080c, 0xb0ee, 0x1904,
+	0x63cd, 0x2009, 0x0002, 0x08e8, 0x2001, 0x0028, 0x900e, 0x0804,
+	0x63ce, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004,
+	0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029,
+	0x900e, 0x0804, 0x63ce, 0x2001, 0x0029, 0x900e, 0x0804, 0x63ce,
+	0x080c, 0x3790, 0x0804, 0x63cf, 0x080c, 0x5408, 0x0804, 0x63cf,
+	0x080c, 0x456c, 0x0804, 0x63cf, 0x080c, 0x45e5, 0x0804, 0x63cf,
+	0x080c, 0x4641, 0x0804, 0x63cf, 0x080c, 0x4a76, 0x0804, 0x63cf,
+	0x080c, 0x4d2d, 0x0804, 0x63cf, 0x080c, 0x5073, 0x0804, 0x63cf,
+	0x080c, 0x526c, 0x0804, 0x63cf, 0x080c, 0x39ae, 0x0804, 0x63cf,
+	0x00b6, 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1608,
+	0x9182, 0x0800, 0x1258, 0x9188, 0x1000, 0x2104, 0x905d, 0x0130,
+	0x080c, 0x6a5b, 0x1138, 0x00d9, 0x9006, 0x00b0, 0x2001, 0x0028,
+	0x900e, 0x0090, 0x9082, 0x0006, 0x1240, 0xb900, 0xd1fc, 0x0d98,
+	0x2001, 0x0029, 0x2009, 0x1000, 0x0038, 0x2001, 0x0029, 0x900e,
+	0x0018, 0x2001, 0x0029, 0x900e, 0x9005, 0x00be, 0x0005, 0xa877,
+	0x0000, 0xb8d0, 0x9005, 0x1904, 0x654e, 0xb888, 0x9005, 0x1904,
+	0x654e, 0xb838, 0xb93c, 0x9102, 0x1a04, 0x654e, 0x2b10, 0x080c,
+	0xaba0, 0x0904, 0x654a, 0x8108, 0xb93e, 0x6212, 0x2900, 0x6016,
+	0x6023, 0x0003, 0x600b, 0xffff, 0x6007, 0x0040, 0xa878, 0x605e,
+	0xa880, 0x9084, 0x00ff, 0x6066, 0xa883, 0x0000, 0xa87c, 0xd0ac,
+	0x0588, 0xc0dd, 0xa87e, 0xa888, 0x8001, 0x1530, 0xa816, 0xa864,
+	0x9094, 0x00f7, 0x9296, 0x0011, 0x11f8, 0x9084, 0x00ff, 0xc0bd,
+	0x601e, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x2001, 0x000f, 0x8001,
+	0x1df0, 0x2001, 0x8004, 0x6003, 0x0004, 0x6046, 0x00f6, 0x2079,
+	0x0380, 0x7818, 0xd0bc, 0x1de8, 0x7833, 0x0010, 0x2c00, 0x7836,
+	0x781b, 0x8080, 0x00fe, 0x0005, 0x080c, 0x1731, 0x601c, 0xc0bd,
+	0x601e, 0x0c38, 0xd0b4, 0x190c, 0x1c30, 0x2001, 0x8004, 0x6003,
+	0x0002, 0x0c18, 0x81ff, 0x1110, 0xb88b, 0x0001, 0x2908, 0xb8cc,
+	0xb9ce, 0x9005, 0x1110, 0xb9d2, 0x0020, 0x0096, 0x2048, 0xa902,
+	0x009e, 0x0005, 0x00b6, 0x0126, 0x00c6, 0x0026, 0x2091, 0x8000,
+	0x6210, 0x2258, 0xba00, 0x9005, 0x0110, 0xc285, 0x0008, 0xc284,
+	0xba02, 0x002e, 0x00ce, 0x012e, 0x00be, 0x0005, 0x00b6, 0x0126,
+	0x00c6, 0x2091, 0x8000, 0x6210, 0x2258, 0xba04, 0x0006, 0x9086,
+	0x0006, 0x1170, 0xb89c, 0xd0ac, 0x0158, 0x080c, 0x6a57, 0x0140,
+	0x9284, 0xff00, 0x8007, 0x9086, 0x0007, 0x1110, 0x2011, 0x0600,
+	0x000e, 0x9294, 0xff00, 0x9215, 0xba06, 0x0006, 0x9086, 0x0006,
+	0x1120, 0xba90, 0x82ff, 0x090c, 0x0d7d, 0x000e, 0x00ce, 0x012e,
+	0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6210,
+	0x2258, 0xba04, 0x0006, 0x9086, 0x0006, 0x1168, 0xb89c, 0xd0a4,
+	0x0150, 0x080c, 0x6a53, 0x1138, 0x9284, 0x00ff, 0x9086, 0x0007,
+	0x1110, 0x2011, 0x0006, 0x000e, 0x9294, 0x00ff, 0x8007, 0x9215,
+	0xba06, 0x00ce, 0x012e, 0x00be, 0x0005, 0x9182, 0x0800, 0x0218,
+	0x9085, 0x0001, 0x0005, 0x00d6, 0x0026, 0x9190, 0x1000, 0x2204,
+	0x905d, 0x1188, 0x0096, 0x080c, 0x103a, 0x2958, 0x009e, 0x0168,
+	0x2b00, 0x2012, 0xb85c, 0xb8ca, 0xb860, 0xb8c6, 0x9006, 0xb8a6,
+	0xb8ae, 0x080c, 0x603c, 0x9006, 0x0010, 0x9085, 0x0001, 0x002e,
+	0x00de, 0x0005, 0x00b6, 0x0096, 0x0126, 0x2091, 0x8000, 0x0026,
+	0x9182, 0x0800, 0x0218, 0x9085, 0x0001, 0x0458, 0x00d6, 0x9190,
+	0x1000, 0x2204, 0x905d, 0x0518, 0x2013, 0x0000, 0xb8a4, 0x904d,
+	0x0110, 0x080c, 0x106c, 0x00d6, 0x00c6, 0xb8bc, 0x2060, 0x8cff,
+	0x0168, 0x600c, 0x0006, 0x6014, 0x2048, 0x080c, 0xc814, 0x0110,
+	0x080c, 0x0fec, 0x080c, 0xabc9, 0x00ce, 0x0c88, 0x00ce, 0x00de,
+	0x2b48, 0xb8c8, 0xb85e, 0xb8c4, 0xb862, 0x080c, 0x107c, 0x00de,
+	0x9006, 0x002e, 0x012e, 0x009e, 0x00be, 0x0005, 0x0016, 0x9182,
+	0x0800, 0x0218, 0x9085, 0x0001, 0x0030, 0x9188, 0x1000, 0x2104,
+	0x905d, 0x0dc0, 0x9006, 0x001e, 0x0005, 0x00d6, 0x0156, 0x0136,
+	0x0146, 0x9006, 0xb80a, 0xb80e, 0xb800, 0xc08c, 0xb802, 0x080c,
+	0x74d5, 0x1510, 0xb8a0, 0x9086, 0x007e, 0x0120, 0x080c, 0xab33,
+	0x11d8, 0x0078, 0x7040, 0xd0e4, 0x01b8, 0x00c6, 0x2061, 0x1982,
+	0x7048, 0x2062, 0x704c, 0x6006, 0x7050, 0x600a, 0x7054, 0x600e,
+	0x00ce, 0x703c, 0x2069, 0x0140, 0x9005, 0x1110, 0x2001, 0x0001,
+	0x6886, 0x2069, 0x1800, 0x68b6, 0x7040, 0xb85e, 0x7048, 0xb862,
+	0x704c, 0xb866, 0x20e1, 0x0000, 0x2099, 0x0276, 0xb8c4, 0x20e8,
+	0xb8c8, 0x9088, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2099,
+	0x027a, 0x9088, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2069,
+	0x0200, 0x6817, 0x0001, 0x7040, 0xb86a, 0x7144, 0xb96e, 0x7048,
+	0xb872, 0x7050, 0xb876, 0x2069, 0x0200, 0x6817, 0x0000, 0xb8a0,
+	0x9086, 0x007e, 0x1110, 0x7144, 0xb96e, 0x9182, 0x0211, 0x1218,
+	0x2009, 0x0008, 0x0400, 0x9182, 0x0259, 0x1218, 0x2009, 0x0007,
+	0x00d0, 0x9182, 0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0, 0x9182,
+	0x0349, 0x1218, 0x2009, 0x0005, 0x0070, 0x9182, 0x0421, 0x1218,
+	0x2009, 0x0004, 0x0040, 0x9182, 0x0581, 0x1218, 0x2009, 0x0003,
+	0x0010, 0x2009, 0x0002, 0xb992, 0x014e, 0x013e, 0x015e, 0x00de,
+	0x0005, 0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, 0x7034, 0xb896,
+	0x703c, 0xb89a, 0x7054, 0xb89e, 0x0036, 0xbbd4, 0xc384, 0xba00,
+	0x2009, 0x1867, 0x210c, 0xd0bc, 0x0120, 0xd1ec, 0x0110, 0xc2ad,
+	0x0008, 0xc2ac, 0xd0c4, 0x0148, 0xd1e4, 0x0138, 0xc2bd, 0xd0cc,
+	0x0128, 0xd38c, 0x1108, 0xc385, 0x0008, 0xc2bc, 0xba02, 0xbbd6,
+	0x003e, 0x00ee, 0x002e, 0x001e, 0x0005, 0x0096, 0x0126, 0x2091,
+	0x8000, 0xb8a4, 0x904d, 0x0578, 0xa900, 0x81ff, 0x15c0, 0xaa04,
+	0x9282, 0x0010, 0x16c8, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x8906,
+	0x8006, 0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9080,
+	0x0004, 0x2098, 0x2009, 0x0010, 0x20a9, 0x0001, 0x4002, 0x9086,
+	0xffff, 0x0120, 0x8109, 0x1dd0, 0x080c, 0x0d7d, 0x3c00, 0x20e8,
+	0x3300, 0x8001, 0x20a0, 0x4604, 0x8210, 0xaa06, 0x01de, 0x01ce,
+	0x014e, 0x013e, 0x0060, 0x080c, 0x103a, 0x0170, 0x2900, 0xb8a6,
+	0xa803, 0x0000, 0x080c, 0x68a9, 0xa807, 0x0001, 0xae12, 0x9085,
+	0x0001, 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0126, 0x2091,
+	0x8000, 0x0096, 0xb8a4, 0x904d, 0x0188, 0xa800, 0x9005, 0x1150,
+	0x080c, 0x68b8, 0x1158, 0xa804, 0x908a, 0x0002, 0x0218, 0x8001,
+	0xa806, 0x0020, 0x080c, 0x106c, 0xb8a7, 0x0000, 0x009e, 0x012e,
+	0x0005, 0x0096, 0x00c6, 0xb888, 0x9005, 0x1904, 0x67a2, 0xb8d0,
+	0x904d, 0x0904, 0x67a2, 0x080c, 0xaba0, 0x0904, 0x679e, 0x8210,
+	0xba3e, 0xa800, 0xb8d2, 0x9005, 0x1108, 0xb8ce, 0x2b00, 0x6012,
+	0x2900, 0x6016, 0x6023, 0x0003, 0x600b, 0xffff, 0x6007, 0x0040,
+	0xa878, 0x605e, 0xa880, 0x9084, 0x00ff, 0x6066, 0xa883, 0x0000,
+	0xa87c, 0xd0ac, 0x01c8, 0xc0dd, 0xa87e, 0xa888, 0x8001, 0x1568,
+	0xa816, 0xa864, 0x9094, 0x00f7, 0x9296, 0x0011, 0x1530, 0x9084,
+	0x00ff, 0xc0bd, 0x601e, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x2001,
+	0x8004, 0x6003, 0x0004, 0x0030, 0x080c, 0x1c30, 0x2001, 0x8004,
+	0x6003, 0x0002, 0x6046, 0x2001, 0x0010, 0x2c08, 0x080c, 0xa863,
+	0xb838, 0xba3c, 0x9202, 0x0a04, 0x674f, 0x0020, 0x82ff, 0x1110,
+	0xb88b, 0x0001, 0x00ce, 0x009e, 0x0005, 0x080c, 0x1731, 0x601c,
+	0xc0bd, 0x601e, 0x08e0, 0x00b6, 0x0096, 0x0016, 0x20a9, 0x0800,
+	0x900e, 0x0016, 0x080c, 0x661e, 0x1158, 0xb8d0, 0x904d, 0x0140,
+	0x3e00, 0x9086, 0x0002, 0x1118, 0xb800, 0xd0bc, 0x1108, 0x0041,
+	0x001e, 0x8108, 0x1f04, 0x67b1, 0x001e, 0x00be, 0x009e, 0x0005,
+	0x0096, 0x0016, 0xb8d0, 0x904d, 0x0188, 0xa800, 0xb8d2, 0x9005,
+	0x1108, 0xb8ce, 0x9006, 0xa802, 0xa867, 0x0103, 0xab7a, 0xa877,
+	0x0000, 0x080c, 0xcb12, 0x080c, 0x6d70, 0x0c60, 0x001e, 0x009e,
+	0x0005, 0x0086, 0x9046, 0xb8d0, 0x904d, 0x0198, 0xa86c, 0x9406,
+	0x1118, 0xa870, 0x9506, 0x0128, 0x2940, 0xa800, 0x904d, 0x0148,
+	0x0ca8, 0xa800, 0x88ff, 0x1110, 0xb8d2, 0x0008, 0xa002, 0xa803,
+	0x0000, 0x008e, 0x0005, 0x901e, 0x0010, 0x2019, 0x0001, 0x00e6,
+	0x0096, 0x00c6, 0x0086, 0x0026, 0x0126, 0x2091, 0x8000, 0x2071,
+	0x19e7, 0x9046, 0x7028, 0x9065, 0x01e8, 0x6014, 0x2068, 0x83ff,
+	0x0120, 0x605c, 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, 0x1118,
+	0xa870, 0x9506, 0x0120, 0x2c40, 0x600c, 0x2060, 0x0c60, 0x600c,
+	0x0006, 0x0066, 0x2830, 0x080c, 0x9f7e, 0x006e, 0x000e, 0x83ff,
+	0x0508, 0x0c08, 0x9046, 0xb8d0, 0x904d, 0x01e0, 0x83ff, 0x0120,
+	0xa878, 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, 0x1118, 0xa870,
+	0x9506, 0x0120, 0x2940, 0xa800, 0x2048, 0x0c70, 0xb8d0, 0xaa00,
+	0x0026, 0x9906, 0x1110, 0xbad2, 0x0008, 0xa202, 0x000e, 0x83ff,
+	0x0108, 0x0c10, 0x002e, 0x008e, 0x00ce, 0x009e, 0x00ee, 0x0005,
+	0x9016, 0x0489, 0x1110, 0x2011, 0x0001, 0x0005, 0x080c, 0x690d,
+	0x0128, 0x080c, 0xc8d5, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c,
+	0x690d, 0x0128, 0x080c, 0xc876, 0x0010, 0x9085, 0x0001, 0x0005,
+	0x080c, 0x690d, 0x0128, 0x080c, 0xc8d2, 0x0010, 0x9085, 0x0001,
+	0x0005, 0x080c, 0x690d, 0x0128, 0x080c, 0xc895, 0x0010, 0x9085,
+	0x0001, 0x0005, 0x080c, 0x690d, 0x0128, 0x080c, 0xc916, 0x0010,
+	0x9085, 0x0001, 0x0005, 0xb8a4, 0x900d, 0x1118, 0x9085, 0x0001,
+	0x0005, 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e,
+	0x810f, 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004,
+	0x2098, 0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128,
+	0x8109, 0x1dd8, 0x9085, 0x0001, 0x0008, 0x9006, 0x01ce, 0x013e,
+	0x0005, 0x0146, 0x01d6, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0004,
+	0x20a0, 0x20a9, 0x0010, 0x2009, 0xffff, 0x4104, 0x01de, 0x014e,
 	0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e, 0x810f,
 	0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004, 0x2098,
 	0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128, 0x8109,
-	0x1dd8, 0x9085, 0x0001, 0x0008, 0x9006, 0x01ce, 0x013e, 0x0005,
-	0x0146, 0x01d6, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0004, 0x20a0,
-	0x20a9, 0x0010, 0x2009, 0xffff, 0x4104, 0x01de, 0x014e, 0x0136,
-	0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e, 0x810f, 0x9184,
-	0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004, 0x2098, 0x20a9,
-	0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128, 0x8109, 0x1dd8,
-	0x9085, 0x0001, 0x0068, 0x0146, 0x01d6, 0x3300, 0x8001, 0x20a0,
-	0x3c00, 0x20e8, 0x2001, 0xffff, 0x4004, 0x01de, 0x014e, 0x9006,
-	0x01ce, 0x013e, 0x0005, 0x0096, 0x0126, 0x2091, 0x8000, 0xb8a4,
-	0x904d, 0x1128, 0x080c, 0x103b, 0x0168, 0x2900, 0xb8a6, 0x080c,
-	0x67b8, 0xa803, 0x0001, 0xa807, 0x0000, 0x9085, 0x0001, 0x012e,
-	0x009e, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x0126, 0x2091, 0x8000,
-	0xb8a4, 0x904d, 0x0130, 0xb8a7, 0x0000, 0x080c, 0x106d, 0x9085,
-	0x0001, 0x012e, 0x009e, 0x0005, 0xb89c, 0xd0a4, 0x0005, 0x00b6,
-	0x00f6, 0x080c, 0x73e4, 0x01b0, 0x71c4, 0x81ff, 0x1198, 0x71dc,
-	0xd19c, 0x0180, 0x2001, 0x007e, 0x9080, 0x1000, 0x2004, 0x905d,
-	0x0148, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1118, 0xb800,
-	0xc0ed, 0xb802, 0x2079, 0x1847, 0x7804, 0xd0a4, 0x01d0, 0x0156,
-	0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x652d, 0x1168, 0xb804,
-	0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118, 0x9086, 0x0006,
-	0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e, 0x8108, 0x1f04, 0x6843,
-	0x015e, 0x080c, 0x6928, 0x0120, 0x2001, 0x1983, 0x200c, 0x0038,
-	0x2079, 0x1847, 0x7804, 0xd0a4, 0x0130, 0x2009, 0x07d0, 0x2011,
-	0x686e, 0x080c, 0x85d2, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x2011,
-	0x686e, 0x080c, 0x850b, 0x080c, 0x6928, 0x01d8, 0x2001, 0x107e,
-	0x2004, 0x2058, 0xb900, 0xc1ec, 0xb902, 0x080c, 0x6966, 0x0130,
-	0x2009, 0x07d0, 0x2011, 0x686e, 0x080c, 0x85d2, 0x00e6, 0x2071,
-	0x1800, 0x9006, 0x707e, 0x7060, 0x7082, 0x080c, 0x2f79, 0x00ee,
-	0x04d0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c,
-	0x652d, 0x1558, 0xb800, 0xd0ec, 0x0540, 0x0046, 0xbaa0, 0x2220,
-	0x9006, 0x2009, 0x0029, 0x080c, 0xe191, 0xb800, 0xc0e5, 0xc0ec,
-	0xb802, 0x080c, 0x6962, 0x2001, 0x0707, 0x1128, 0xb804, 0x9084,
-	0x00ff, 0x9085, 0x0700, 0xb806, 0x080c, 0xa781, 0x2019, 0x0029,
-	0x080c, 0x926f, 0x0076, 0x903e, 0x080c, 0x9141, 0x900e, 0x080c,
-	0xdeb3, 0x007e, 0x004e, 0x080c, 0xa79d, 0x001e, 0x8108, 0x1f04,
-	0x6896, 0x00ce, 0x015e, 0x00be, 0x0005, 0x00b6, 0x6010, 0x2058,
-	0xb800, 0xc0ec, 0xb802, 0x00be, 0x0005, 0x00b6, 0x00c6, 0x0096,
-	0x080c, 0x1054, 0x090c, 0x0d7d, 0x2958, 0x009e, 0x2001, 0x196b,
-	0x2b02, 0xb8af, 0x0000, 0x2009, 0x00ff, 0x080c, 0x5f5b, 0xb807,
-	0x0006, 0xb813, 0x00ff, 0xb817, 0xffff, 0xb86f, 0x0200, 0xb86c,
-	0xb893, 0x0002, 0xb8bb, 0x0520, 0xb8a3, 0x00ff, 0xb8af, 0x0000,
-	0x00ce, 0x00be, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb800, 0x00be,
-	0xd0ac, 0x0005, 0x6010, 0x00b6, 0x905d, 0x0108, 0xb800, 0x00be,
-	0xd0bc, 0x0005, 0x0006, 0x0016, 0x0026, 0xb804, 0x908c, 0x00ff,
-	0x9196, 0x0006, 0x0188, 0x9196, 0x0004, 0x0170, 0x9196, 0x0005,
-	0x0158, 0x908c, 0xff00, 0x810f, 0x9196, 0x0006, 0x0128, 0x9196,
-	0x0004, 0x0110, 0x9196, 0x0005, 0x002e, 0x001e, 0x000e, 0x0005,
-	0x00b6, 0x00f6, 0x2001, 0x107e, 0x2004, 0x905d, 0x0110, 0xb800,
-	0xd0ec, 0x00fe, 0x00be, 0x0005, 0x0126, 0x0026, 0x2091, 0x8000,
-	0x0006, 0xbaa0, 0x9290, 0x1000, 0x2204, 0x9b06, 0x190c, 0x0d7d,
-	0x000e, 0xba00, 0x9005, 0x0110, 0xc2fd, 0x0008, 0xc2fc, 0xba02,
-	0x002e, 0x012e, 0x0005, 0x2011, 0x1837, 0x2204, 0xd0cc, 0x0138,
-	0x2001, 0x1981, 0x200c, 0x2011, 0x6958, 0x080c, 0x85d2, 0x0005,
-	0x2011, 0x6958, 0x080c, 0x850b, 0x2011, 0x1837, 0x2204, 0xc0cc,
-	0x2012, 0x0005, 0x080c, 0x55fc, 0xd0ac, 0x0005, 0x080c, 0x55fc,
-	0xd0a4, 0x0005, 0x0016, 0xb904, 0x9184, 0x00ff, 0x908e, 0x0006,
-	0x001e, 0x0005, 0x0016, 0xb904, 0x9184, 0xff00, 0x8007, 0x908e,
-	0x0006, 0x001e, 0x0005, 0x00b6, 0x00f6, 0x080c, 0xce35, 0x0158,
-	0x70dc, 0x9084, 0x0028, 0x0138, 0x2001, 0x107f, 0x2004, 0x905d,
-	0x0110, 0xb8d4, 0xd094, 0x00fe, 0x00be, 0x0005, 0x2071, 0x1910,
-	0x7003, 0x0001, 0x7007, 0x0000, 0x9006, 0x7012, 0x7016, 0x701a,
-	0x701e, 0x700a, 0x7046, 0x2001, 0x1947, 0x2003, 0x0000, 0x0005,
-	0x0016, 0x00e6, 0x2071, 0x1948, 0x900e, 0x710a, 0x080c, 0x55fc,
-	0xd0fc, 0x1140, 0x080c, 0x55fc, 0x900e, 0xd09c, 0x0108, 0x8108,
-	0x7102, 0x00f8, 0x2001, 0x1867, 0x200c, 0x9184, 0x0007, 0x0002,
-	0x69aa, 0x69aa, 0x69aa, 0x69aa, 0x69aa, 0x69c0, 0x69ce, 0x69aa,
-	0x7003, 0x0003, 0x2009, 0x1868, 0x210c, 0x9184, 0xff00, 0x8007,
-	0x9005, 0x1110, 0x2001, 0x0002, 0x7006, 0x0018, 0x7003, 0x0005,
-	0x0c88, 0x00ee, 0x001e, 0x0005, 0x00e6, 0x2071, 0x0050, 0x684c,
-	0x9005, 0x1150, 0x00e6, 0x2071, 0x1910, 0x7028, 0xc085, 0x702a,
-	0x00ee, 0x9085, 0x0001, 0x0488, 0x6844, 0x9005, 0x0158, 0x080c,
-	0x775a, 0x6a60, 0x9200, 0x7002, 0x6864, 0x9101, 0x7006, 0x9006,
-	0x7012, 0x7016, 0x6860, 0x7002, 0x6864, 0x7006, 0x6868, 0x700a,
-	0x686c, 0x700e, 0x6844, 0x9005, 0x1110, 0x7012, 0x7016, 0x684c,
-	0x701a, 0x701c, 0x9085, 0x0040, 0x701e, 0x7037, 0x0019, 0x702b,
-	0x0001, 0x00e6, 0x2071, 0x1910, 0x7028, 0xc084, 0x702a, 0x7007,
-	0x0001, 0x700b, 0x0000, 0x00ee, 0x9006, 0x00ee, 0x0005, 0x00e6,
-	0x0026, 0x2071, 0x1948, 0x7000, 0x9015, 0x0904, 0x6c84, 0x9286,
-	0x0003, 0x0904, 0x6b14, 0x9286, 0x0005, 0x0904, 0x6b14, 0x2071,
-	0x1877, 0xa87c, 0x9005, 0x0904, 0x6a75, 0x7140, 0xa868, 0x9102,
-	0x0a04, 0x6c84, 0xa878, 0xd084, 0x15d8, 0xa853, 0x0019, 0x2001,
-	0x8023, 0xa84e, 0x2071, 0x1910, 0x701c, 0x9005, 0x1904, 0x6e27,
-	0x0e04, 0x6e95, 0x2071, 0x0000, 0xa850, 0x7032, 0xa84c, 0x7082,
-	0xa870, 0x7086, 0xa86c, 0x708a, 0xa880, 0x708e, 0x7036, 0x0146,
-	0x01d6, 0x0136, 0x01c6, 0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a,
-	0xa868, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098,
-	0x4003, 0x015e, 0x01ce, 0x013e, 0x01de, 0x014e, 0x2091, 0x4080,
-	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11cd, 0x0804, 0x6af7,
-	0xa853, 0x001b, 0x2001, 0x8027, 0x0820, 0x7004, 0xd08c, 0x1904,
-	0x6c84, 0xa853, 0x001a, 0x2001, 0x8024, 0x0804, 0x6a39, 0x00e6,
-	0x0026, 0x2071, 0x1948, 0x7000, 0x9015, 0x0904, 0x6c84, 0x9286,
-	0x0003, 0x0904, 0x6b14, 0x9286, 0x0005, 0x0904, 0x6b14, 0xa84f,
-	0x8022, 0xa853, 0x0018, 0x0804, 0x6adc, 0xa868, 0xd0fc, 0x11d8,
-	0x00e6, 0x0026, 0x2001, 0x1948, 0x2004, 0x9005, 0x0904, 0x6c84,
-	0xa87c, 0xd0bc, 0x1904, 0x6c84, 0xa978, 0xa874, 0x9105, 0x1904,
-	0x6c84, 0x2001, 0x1948, 0x2004, 0x0002, 0x6c84, 0x6ad8, 0x6b14,
-	0x6b14, 0x6c84, 0x6b14, 0x0005, 0xa868, 0xd0fc, 0x1500, 0x00e6,
-	0x0026, 0x2009, 0x1948, 0x210c, 0x81ff, 0x0904, 0x6c84, 0xa87c,
-	0xd0cc, 0x0904, 0x6c84, 0xa880, 0x9084, 0x00ff, 0x9086, 0x0001,
-	0x1904, 0x6c84, 0x9186, 0x0003, 0x0904, 0x6b14, 0x9186, 0x0005,
-	0x0904, 0x6b14, 0xa84f, 0x8021, 0xa853, 0x0017, 0x0028, 0x0005,
-	0xa84f, 0x8020, 0xa853, 0x0016, 0x2071, 0x1910, 0x701c, 0x9005,
-	0x1904, 0x6e27, 0x0e04, 0x6e95, 0x2071, 0x0000, 0xa84c, 0x7082,
-	0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091,
-	0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11cd, 0x2071,
-	0x1800, 0x2011, 0x0001, 0xa804, 0x900d, 0x702c, 0x1158, 0xa802,
-	0x2900, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8420, 0x002e,
-	0x00ee, 0x0005, 0x0096, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900,
-	0x81ff, 0x1dc8, 0x009e, 0x0c58, 0xa84f, 0x0000, 0x00f6, 0x2079,
-	0x0050, 0x2071, 0x1910, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904,
-	0x6c09, 0x782c, 0x908c, 0x0780, 0x190c, 0x6fe1, 0x8004, 0x8004,
-	0x8004, 0x9084, 0x0003, 0x0002, 0x6b32, 0x6c09, 0x6b57, 0x6ba4,
-	0x080c, 0x0d7d, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d,
-	0x1170, 0x2071, 0x1a01, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949,
-	0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016,
+	0x1dd8, 0x9085, 0x0001, 0x0068, 0x0146, 0x01d6, 0x3300, 0x8001,
+	0x20a0, 0x3c00, 0x20e8, 0x2001, 0xffff, 0x4004, 0x01de, 0x014e,
+	0x9006, 0x01ce, 0x013e, 0x0005, 0x0096, 0x0126, 0x2091, 0x8000,
+	0xb8a4, 0x904d, 0x1128, 0x080c, 0x103a, 0x0168, 0x2900, 0xb8a6,
+	0x080c, 0x68a9, 0xa803, 0x0001, 0xa807, 0x0000, 0x9085, 0x0001,
+	0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x0126, 0x2091,
+	0x8000, 0xb8a4, 0x904d, 0x0130, 0xb8a7, 0x0000, 0x080c, 0x106c,
+	0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0xb89c, 0xd0a4, 0x0005,
+	0x00b6, 0x00f6, 0x080c, 0x74d5, 0x01b0, 0x71c4, 0x81ff, 0x1198,
+	0x71dc, 0xd19c, 0x0180, 0x2001, 0x007e, 0x9080, 0x1000, 0x2004,
+	0x905d, 0x0148, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1118,
+	0xb800, 0xc0ed, 0xb802, 0x2079, 0x1847, 0x7804, 0xd0a4, 0x01d0,
+	0x0156, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x661e, 0x1168,
+	0xb804, 0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118, 0x9086,
+	0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e, 0x8108, 0x1f04,
+	0x6934, 0x015e, 0x080c, 0x6a19, 0x0120, 0x2001, 0x1985, 0x200c,
+	0x0038, 0x2079, 0x1847, 0x7804, 0xd0a4, 0x0130, 0x2009, 0x07d0,
+	0x2011, 0x695f, 0x080c, 0x86d7, 0x00fe, 0x00be, 0x0005, 0x00b6,
+	0x2011, 0x695f, 0x080c, 0x860d, 0x080c, 0x6a19, 0x01d8, 0x2001,
+	0x107e, 0x2004, 0x2058, 0xb900, 0xc1ec, 0xb902, 0x080c, 0x6a57,
+	0x0130, 0x2009, 0x07d0, 0x2011, 0x695f, 0x080c, 0x86d7, 0x00e6,
+	0x2071, 0x1800, 0x9006, 0x707e, 0x7060, 0x7082, 0x080c, 0x2fb2,
+	0x00ee, 0x04d0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016,
+	0x080c, 0x661e, 0x1558, 0xb800, 0xd0ec, 0x0540, 0x0046, 0xbaa0,
+	0x2220, 0x9006, 0x2009, 0x0029, 0x080c, 0xe29e, 0xb800, 0xc0e5,
+	0xc0ec, 0xb802, 0x080c, 0x6a53, 0x2001, 0x0707, 0x1128, 0xb804,
+	0x9084, 0x00ff, 0x9085, 0x0700, 0xb806, 0x080c, 0xa872, 0x2019,
+	0x0029, 0x080c, 0x9374, 0x0076, 0x903e, 0x080c, 0x9246, 0x900e,
+	0x080c, 0xdfc0, 0x007e, 0x004e, 0x080c, 0xa88e, 0x001e, 0x8108,
+	0x1f04, 0x6987, 0x00ce, 0x015e, 0x00be, 0x0005, 0x00b6, 0x6010,
+	0x2058, 0xb800, 0xc0ec, 0xb802, 0x00be, 0x0005, 0x00b6, 0x00c6,
+	0x0096, 0x080c, 0x1053, 0x090c, 0x0d7d, 0x2958, 0x009e, 0x2001,
+	0x196b, 0x2b02, 0xb8af, 0x0000, 0x2009, 0x00ff, 0x080c, 0x603c,
+	0xb807, 0x0006, 0xb813, 0x00ff, 0xb817, 0xffff, 0xb86f, 0x0200,
+	0xb86c, 0xb893, 0x0002, 0xb8bb, 0x0520, 0xb8a3, 0x00ff, 0xb8af,
+	0x0000, 0x00ce, 0x00be, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb800,
+	0x00be, 0xd0ac, 0x0005, 0x6010, 0x00b6, 0x905d, 0x0108, 0xb800,
+	0x00be, 0xd0bc, 0x0005, 0x0006, 0x0016, 0x0026, 0xb804, 0x908c,
+	0x00ff, 0x9196, 0x0006, 0x0188, 0x9196, 0x0004, 0x0170, 0x9196,
+	0x0005, 0x0158, 0x908c, 0xff00, 0x810f, 0x9196, 0x0006, 0x0128,
+	0x9196, 0x0004, 0x0110, 0x9196, 0x0005, 0x002e, 0x001e, 0x000e,
+	0x0005, 0x00b6, 0x00f6, 0x2001, 0x107e, 0x2004, 0x905d, 0x0110,
+	0xb800, 0xd0ec, 0x00fe, 0x00be, 0x0005, 0x0126, 0x0026, 0x2091,
+	0x8000, 0x0006, 0xbaa0, 0x9290, 0x1000, 0x2204, 0x9b06, 0x190c,
+	0x0d7d, 0x000e, 0xba00, 0x9005, 0x0110, 0xc2fd, 0x0008, 0xc2fc,
+	0xba02, 0x002e, 0x012e, 0x0005, 0x2011, 0x1837, 0x2204, 0xd0cc,
+	0x0138, 0x2001, 0x1983, 0x200c, 0x2011, 0x6a49, 0x080c, 0x86d7,
+	0x0005, 0x2011, 0x6a49, 0x080c, 0x860d, 0x2011, 0x1837, 0x2204,
+	0xc0cc, 0x2012, 0x0005, 0x080c, 0x56d3, 0xd0ac, 0x0005, 0x080c,
+	0x56d3, 0xd0a4, 0x0005, 0x0016, 0xb904, 0x9184, 0x00ff, 0x908e,
+	0x0006, 0x001e, 0x0005, 0x0016, 0xb904, 0x9184, 0xff00, 0x8007,
+	0x908e, 0x0006, 0x001e, 0x0005, 0x00b6, 0x00f6, 0x080c, 0xcf2e,
+	0x0158, 0x70dc, 0x9084, 0x0028, 0x0138, 0x2001, 0x107f, 0x2004,
+	0x905d, 0x0110, 0xb8d4, 0xd094, 0x00fe, 0x00be, 0x0005, 0x2071,
+	0x1910, 0x7003, 0x0001, 0x7007, 0x0000, 0x9006, 0x7012, 0x7016,
+	0x701a, 0x701e, 0x700a, 0x7046, 0x2001, 0x1947, 0x2003, 0x0000,
+	0x0005, 0x0016, 0x00e6, 0x2071, 0x1948, 0x900e, 0x710a, 0x080c,
+	0x56d3, 0xd0fc, 0x1140, 0x080c, 0x56d3, 0x900e, 0xd09c, 0x0108,
+	0x8108, 0x7102, 0x00f8, 0x2001, 0x1867, 0x200c, 0x9184, 0x0007,
+	0x0002, 0x6a9b, 0x6a9b, 0x6a9b, 0x6a9b, 0x6a9b, 0x6ab1, 0x6abf,
+	0x6a9b, 0x7003, 0x0003, 0x2009, 0x1868, 0x210c, 0x9184, 0xff00,
+	0x8007, 0x9005, 0x1110, 0x2001, 0x0002, 0x7006, 0x0018, 0x7003,
+	0x0005, 0x0c88, 0x00ee, 0x001e, 0x0005, 0x00e6, 0x2071, 0x0050,
+	0x684c, 0x9005, 0x1150, 0x00e6, 0x2071, 0x1910, 0x7028, 0xc085,
+	0x702a, 0x00ee, 0x9085, 0x0001, 0x0488, 0x6844, 0x9005, 0x0158,
+	0x080c, 0x784b, 0x6a60, 0x9200, 0x7002, 0x6864, 0x9101, 0x7006,
+	0x9006, 0x7012, 0x7016, 0x6860, 0x7002, 0x6864, 0x7006, 0x6868,
+	0x700a, 0x686c, 0x700e, 0x6844, 0x9005, 0x1110, 0x7012, 0x7016,
+	0x684c, 0x701a, 0x701c, 0x9085, 0x0040, 0x701e, 0x7037, 0x0019,
+	0x702b, 0x0001, 0x00e6, 0x2071, 0x1910, 0x7028, 0xc084, 0x702a,
+	0x7007, 0x0001, 0x700b, 0x0000, 0x00ee, 0x9006, 0x00ee, 0x0005,
+	0x00e6, 0x0026, 0x2071, 0x1948, 0x7000, 0x9015, 0x0904, 0x6d75,
+	0x9286, 0x0003, 0x0904, 0x6c05, 0x9286, 0x0005, 0x0904, 0x6c05,
+	0x2071, 0x1877, 0xa87c, 0x9005, 0x0904, 0x6b66, 0x7140, 0xa868,
+	0x9102, 0x0a04, 0x6d75, 0xa878, 0xd084, 0x15d8, 0xa853, 0x0019,
+	0x2001, 0x8023, 0xa84e, 0x2071, 0x1910, 0x701c, 0x9005, 0x1904,
+	0x6f18, 0x0e04, 0x6f86, 0x2071, 0x0000, 0xa850, 0x7032, 0xa84c,
+	0x7082, 0xa870, 0x7086, 0xa86c, 0x708a, 0xa880, 0x708e, 0x7036,
+	0x0146, 0x01d6, 0x0136, 0x01c6, 0x0156, 0x20e9, 0x0000, 0x20a1,
+	0x002a, 0xa868, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021,
+	0x2098, 0x4003, 0x015e, 0x01ce, 0x013e, 0x01de, 0x014e, 0x2091,
+	0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11d6, 0x0804,
+	0x6be8, 0xa853, 0x001b, 0x2001, 0x8027, 0x0820, 0x7004, 0xd08c,
+	0x1904, 0x6d75, 0xa853, 0x001a, 0x2001, 0x8024, 0x0804, 0x6b2a,
+	0x00e6, 0x0026, 0x2071, 0x1948, 0x7000, 0x9015, 0x0904, 0x6d75,
+	0x9286, 0x0003, 0x0904, 0x6c05, 0x9286, 0x0005, 0x0904, 0x6c05,
+	0xa84f, 0x8022, 0xa853, 0x0018, 0x0804, 0x6bcd, 0xa868, 0xd0fc,
+	0x11d8, 0x00e6, 0x0026, 0x2001, 0x1948, 0x2004, 0x9005, 0x0904,
+	0x6d75, 0xa87c, 0xd0bc, 0x1904, 0x6d75, 0xa978, 0xa874, 0x9105,
+	0x1904, 0x6d75, 0x2001, 0x1948, 0x2004, 0x0002, 0x6d75, 0x6bc9,
+	0x6c05, 0x6c05, 0x6d75, 0x6c05, 0x0005, 0xa868, 0xd0fc, 0x1500,
+	0x00e6, 0x0026, 0x2009, 0x1948, 0x210c, 0x81ff, 0x0904, 0x6d75,
+	0xa87c, 0xd0cc, 0x0904, 0x6d75, 0xa880, 0x9084, 0x00ff, 0x9086,
+	0x0001, 0x1904, 0x6d75, 0x9186, 0x0003, 0x0904, 0x6c05, 0x9186,
+	0x0005, 0x0904, 0x6c05, 0xa84f, 0x8021, 0xa853, 0x0017, 0x0028,
+	0x0005, 0xa84f, 0x8020, 0xa853, 0x0016, 0x2071, 0x1910, 0x701c,
+	0x9005, 0x1904, 0x6f18, 0x0e04, 0x6f86, 0x2071, 0x0000, 0xa84c,
+	0x7082, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a,
+	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11d6,
+	0x2071, 0x1800, 0x2011, 0x0001, 0xa804, 0x900d, 0x702c, 0x1158,
+	0xa802, 0x2900, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8522,
+	0x002e, 0x00ee, 0x0005, 0x0096, 0x2148, 0xa904, 0xa802, 0x8210,
+	0x2900, 0x81ff, 0x1dc8, 0x009e, 0x0c58, 0xa84f, 0x0000, 0x00f6,
+	0x2079, 0x0050, 0x2071, 0x1910, 0xa803, 0x0000, 0x7010, 0x9005,
+	0x1904, 0x6cfa, 0x782c, 0x908c, 0x0780, 0x190c, 0x70d2, 0x8004,
+	0x8004, 0x8004, 0x9084, 0x0003, 0x0002, 0x6c23, 0x6cfa, 0x6c48,
+	0x6c95, 0x080c, 0x0d7d, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804,
+	0x900d, 0x1170, 0x2071, 0x1a03, 0x703c, 0x9005, 0x1328, 0x2001,
+	0x1949, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005,
+	0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff,
+	0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8522, 0x0c10,
+	0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x15a8, 0x7824,
+	0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1170, 0x2009, 0x1830,
+	0x210c, 0x918a, 0x0020, 0x0240, 0x7022, 0x2001, 0x1dc0, 0x200c,
+	0x8108, 0x2102, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802,
+	0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8522, 0x782c,
+	0x9094, 0x0780, 0x190c, 0x70d2, 0xd0a4, 0x19c8, 0x2071, 0x1a03,
+	0x703c, 0x9005, 0x1328, 0x2001, 0x1949, 0x2004, 0x8005, 0x703e,
+	0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904,
+	0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200,
+	0x70c2, 0x080c, 0x8522, 0x0804, 0x6c4f, 0x0096, 0x00e6, 0x7824,
+	0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0,
+	0x8000, 0x70c2, 0x080c, 0x8522, 0x782c, 0x9094, 0x0780, 0x190c,
+	0x70d2, 0xd0a4, 0x1d60, 0x00ee, 0x782c, 0x9094, 0x0780, 0x190c,
+	0x70d2, 0xd09c, 0x11a0, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d,
+	0x1560, 0x2071, 0x1a03, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949,
+	0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x009e,
+	0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110,
+	0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1170, 0x2071,
+	0x1a03, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949, 0x2004, 0x8005,
+	0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016,
 	0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8,
-	0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8420, 0x0c10, 0x2071,
-	0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x15a8, 0x7824, 0x00e6,
+	0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8522, 0x00fe, 0x002e,
+	0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d,
+	0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d,
+	0x1904, 0x6d4f, 0x782c, 0x9094, 0x0780, 0x190c, 0x70d2, 0xd09c,
+	0x1198, 0x701c, 0x904d, 0x0180, 0x7010, 0x8001, 0x7012, 0x1108,
+	0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, 0x0780,
+	0x190c, 0x70d2, 0xd09c, 0x0d68, 0x782c, 0x9094, 0x0780, 0x190c,
+	0x70d2, 0xd0a4, 0x01b0, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800,
+	0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c,
+	0x8522, 0x782c, 0x9094, 0x0780, 0x190c, 0x70d2, 0xd0a4, 0x1d60,
+	0x00ee, 0x2071, 0x1a03, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949,
+	0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x00e6,
+	0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210,
+	0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c,
+	0x8522, 0x00ee, 0x0804, 0x6d0a, 0xa868, 0xd0fc, 0x1560, 0x0096,
+	0xa804, 0xa807, 0x0000, 0x904d, 0x190c, 0x0fec, 0x009e, 0x0018,
+	0xa868, 0xd0fc, 0x1500, 0x00e6, 0x0026, 0xa84f, 0x0000, 0x00f6,
+	0x2079, 0x0050, 0x2071, 0x1910, 0xa803, 0x0000, 0x7010, 0x9005,
+	0x1904, 0x6e92, 0x782c, 0x908c, 0x0780, 0x190c, 0x70d2, 0x8004,
+	0x8004, 0x8004, 0x9084, 0x0003, 0x0002, 0x6d94, 0x6e92, 0x6daf,
+	0x6e21, 0x080c, 0x0d7d, 0x0005, 0x2071, 0x1800, 0x2900, 0x7822,
+	0xa804, 0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016,
+	0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8,
+	0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8522, 0x0c60, 0x2071,
+	0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1904, 0x6e10, 0x7830,
+	0xd0dc, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7824, 0x00e6,
 	0x2071, 0x0040, 0x712c, 0xd19c, 0x1170, 0x2009, 0x1830, 0x210c,
 	0x918a, 0x0020, 0x0240, 0x7022, 0x2001, 0x1dc0, 0x200c, 0x8108,
 	0x2102, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900,
-	0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8420, 0x782c, 0x9094,
-	0x0780, 0x190c, 0x6fe1, 0xd0a4, 0x19c8, 0x2071, 0x1a01, 0x703c,
-	0x9005, 0x1328, 0x2001, 0x1949, 0x2004, 0x8005, 0x703e, 0x00fe,
-	0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802,
-	0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2,
-	0x080c, 0x8420, 0x0804, 0x6b5e, 0x0096, 0x00e6, 0x7824, 0x2048,
-	0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000,
-	0x70c2, 0x080c, 0x8420, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe1,
-	0xd0a4, 0x1d60, 0x00ee, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe1,
-	0xd09c, 0x11a0, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x1560,
-	0x2071, 0x1a01, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949, 0x2004,
-	0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x009e, 0x2908,
-	0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902,
-	0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1170, 0x2071, 0x1a01,
-	0x703c, 0x9005, 0x1328, 0x2001, 0x1949, 0x2004, 0x8005, 0x703e,
-	0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c,
-	0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e,
-	0x70c0, 0x9200, 0x70c2, 0x080c, 0x8420, 0x00fe, 0x002e, 0x00ee,
-	0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a,
-	0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904,
-	0x6c5e, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe1, 0xd09c, 0x1198,
-	0x701c, 0x904d, 0x0180, 0x7010, 0x8001, 0x7012, 0x1108, 0x701a,
-	0xa800, 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, 0x0780, 0x190c,
-	0x6fe1, 0xd09c, 0x0d68, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe1,
-	0xd0a4, 0x01b0, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c,
-	0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8420,
-	0x782c, 0x9094, 0x0780, 0x190c, 0x6fe1, 0xd0a4, 0x1d60, 0x00ee,
-	0x2071, 0x1a01, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949, 0x2004,
-	0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x00e6, 0x2071,
-	0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900,
-	0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8420,
-	0x00ee, 0x0804, 0x6c19, 0xa868, 0xd0fc, 0x1560, 0x0096, 0xa804,
-	0xa807, 0x0000, 0x904d, 0x190c, 0x0fed, 0x009e, 0x0018, 0xa868,
-	0xd0fc, 0x1500, 0x00e6, 0x0026, 0xa84f, 0x0000, 0x00f6, 0x2079,
-	0x0050, 0x2071, 0x1910, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904,
-	0x6da1, 0x782c, 0x908c, 0x0780, 0x190c, 0x6fe1, 0x8004, 0x8004,
-	0x8004, 0x9084, 0x0003, 0x0002, 0x6ca3, 0x6da1, 0x6cbe, 0x6d30,
-	0x080c, 0x0d7d, 0x0005, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804,
-	0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c,
-	0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e,
-	0x70c0, 0x9200, 0x70c2, 0x080c, 0x8420, 0x0c60, 0x2071, 0x1800,
-	0x2900, 0x7822, 0xa804, 0x900d, 0x1904, 0x6d1f, 0x7830, 0xd0dc,
-	0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7824, 0x00e6, 0x2071,
-	0x0040, 0x712c, 0xd19c, 0x1170, 0x2009, 0x1830, 0x210c, 0x918a,
-	0x0020, 0x0240, 0x7022, 0x2001, 0x1dc0, 0x200c, 0x8108, 0x2102,
-	0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e,
-	0x70c0, 0x8000, 0x70c2, 0x080c, 0x8420, 0x782c, 0x9094, 0x0780,
-	0x190c, 0x6fe1, 0xd0a4, 0x19c8, 0x0e04, 0x6d16, 0x7838, 0x7938,
-	0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013,
-	0x00de, 0x2001, 0x1921, 0x200c, 0xc184, 0x2102, 0x2091, 0x4080,
-	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11cd, 0x2009, 0x1947,
-	0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2001, 0x1921,
-	0x200c, 0xc185, 0x2102, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016,
+	0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8522, 0x782c, 0x9094,
+	0x0780, 0x190c, 0x70d2, 0xd0a4, 0x19c8, 0x0e04, 0x6e07, 0x7838,
+	0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833,
+	0x0013, 0x00de, 0x2001, 0x1921, 0x200c, 0xc184, 0x2102, 0x2091,
+	0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11d6, 0x2009,
+	0x1947, 0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2001,
+	0x1921, 0x200c, 0xc185, 0x2102, 0x00fe, 0x002e, 0x00ee, 0x0005,
+	0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff,
+	0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8522, 0x0804,
+	0x6dbe, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c,
+	0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8522,
+	0x782c, 0x9094, 0x0780, 0x190c, 0x70d2, 0xd0a4, 0x1d60, 0x00ee,
+	0x0e04, 0x6e65, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069,
+	0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, 0x7046,
+	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11d6,
+	0x2009, 0x1947, 0x200b, 0x0000, 0x782c, 0x9094, 0x0780, 0x190c,
+	0x70d2, 0xd09c, 0x1170, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d,
+	0x11e0, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046,
+	0x0c58, 0x009e, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d,
+	0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d,
+	0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016,
 	0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8,
-	0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8420, 0x0804, 0x6ccd,
-	0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802,
-	0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8420, 0x782c,
-	0x9094, 0x0780, 0x190c, 0x6fe1, 0xd0a4, 0x1d60, 0x00ee, 0x0e04,
-	0x6d74, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000,
-	0x6836, 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, 0x7046, 0x2091,
-	0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11cd, 0x2009,
-	0x1947, 0x200b, 0x0000, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe1,
-	0xd09c, 0x1170, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x11e0,
-	0x00fe, 0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x0c58,
-	0x009e, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a,
-	0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1120,
-	0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c,
+	0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8522, 0x00fe, 0x002e,
+	0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d,
+	0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d,
+	0x1904, 0x6f03, 0x782c, 0x9094, 0x0780, 0x190c, 0x70d2, 0xd09c,
+	0x11b0, 0x701c, 0x904d, 0x0198, 0xa84c, 0x9005, 0x1180, 0x7010,
+	0x8001, 0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822,
+	0x782c, 0x9094, 0x0780, 0x190c, 0x70d2, 0xd09c, 0x0d50, 0x782c,
+	0x9094, 0x0780, 0x190c, 0x70d2, 0xd0a4, 0x05c8, 0x00e6, 0x7824,
+	0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0,
+	0x8000, 0x70c2, 0x080c, 0x8522, 0x782c, 0x9094, 0x0780, 0x190c,
+	0x70d2, 0xd0a4, 0x1d60, 0x00ee, 0x0e04, 0x6efc, 0x7838, 0x7938,
+	0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013,
+	0x00de, 0x7044, 0xc084, 0x7046, 0x2091, 0x4080, 0x2001, 0x0089,
+	0x2004, 0xd084, 0x190c, 0x11d6, 0x2009, 0x1947, 0x200b, 0x0000,
+	0x00fe, 0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x00fe,
+	0x002e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, 0x9016, 0x702c,
 	0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e,
-	0x70c0, 0x9200, 0x70c2, 0x080c, 0x8420, 0x00fe, 0x002e, 0x00ee,
-	0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a,
-	0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904,
-	0x6e12, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe1, 0xd09c, 0x11b0,
-	0x701c, 0x904d, 0x0198, 0xa84c, 0x9005, 0x1180, 0x7010, 0x8001,
-	0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c,
-	0x9094, 0x0780, 0x190c, 0x6fe1, 0xd09c, 0x0d50, 0x782c, 0x9094,
-	0x0780, 0x190c, 0x6fe1, 0xd0a4, 0x05c8, 0x00e6, 0x7824, 0x2048,
-	0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000,
-	0x70c2, 0x080c, 0x8420, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe1,
-	0xd0a4, 0x1d60, 0x00ee, 0x0e04, 0x6e0b, 0x7838, 0x7938, 0x910e,
-	0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de,
-	0x7044, 0xc084, 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
-	0xd084, 0x190c, 0x11cd, 0x2009, 0x1947, 0x200b, 0x0000, 0x00fe,
-	0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x00fe, 0x002e,
-	0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148,
-	0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0,
-	0x9200, 0x70c2, 0x080c, 0x8420, 0x00ee, 0x0804, 0x6db1, 0x2071,
-	0x1910, 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018,
-	0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804,
-	0x900d, 0x1128, 0x1e04, 0x6e52, 0x002e, 0x00ee, 0x0005, 0x2071,
-	0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900,
-	0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8420,
-	0x0e04, 0x6e3c, 0x2071, 0x1910, 0x701c, 0x2048, 0xa84c, 0x900d,
-	0x0d18, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086,
-	0x7036, 0xa870, 0x708a, 0xa850, 0x9082, 0x0019, 0x1278, 0x2091,
-	0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11cd, 0x2071,
-	0x1910, 0x080c, 0x6fcd, 0x002e, 0x00ee, 0x0005, 0xa850, 0x9082,
-	0x001c, 0x1e68, 0xa880, 0x708e, 0x7036, 0x0146, 0x01d6, 0x0136,
-	0x01c6, 0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a, 0xa868, 0x20a8,
-	0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, 0x4003, 0x015e,
-	0x01ce, 0x013e, 0x01de, 0x014e, 0x0890, 0x2071, 0x1910, 0xa803,
-	0x0000, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a,
-	0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1118,
-	0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148,
-	0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0,
-	0x9200, 0x70c2, 0x080c, 0x8420, 0x002e, 0x00ee, 0x0005, 0x0006,
-	0xa87c, 0x0006, 0xa867, 0x0103, 0x20a9, 0x001c, 0xa860, 0x20e8,
-	0xa85c, 0x9080, 0x001d, 0x20a0, 0x9006, 0x4004, 0x000e, 0x9084,
-	0x00ff, 0xa87e, 0x000e, 0xa87a, 0xa982, 0x0005, 0x2071, 0x1910,
-	0x7004, 0x0002, 0x6ee0, 0x6ee1, 0x6fcc, 0x6ee1, 0x0d7d, 0x6fcc,
-	0x0005, 0x2001, 0x1948, 0x2004, 0x0002, 0x6eeb, 0x6eeb, 0x6f65,
-	0x6f66, 0x6eeb, 0x6f66, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x6fec,
-	0x701c, 0x904d, 0x0508, 0xa84c, 0x9005, 0x0904, 0x6f36, 0x0e04,
-	0x6f14, 0xa94c, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c,
+	0x70c0, 0x9200, 0x70c2, 0x080c, 0x8522, 0x00ee, 0x0804, 0x6ea2,
+	0x2071, 0x1910, 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, 0x7012,
+	0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148,
+	0xa804, 0x900d, 0x1128, 0x1e04, 0x6f43, 0x002e, 0x00ee, 0x0005,
+	0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210,
+	0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c,
+	0x8522, 0x0e04, 0x6f2d, 0x2071, 0x1910, 0x701c, 0x2048, 0xa84c,
+	0x900d, 0x0d18, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c,
 	0x7086, 0x7036, 0xa870, 0x708a, 0xa850, 0x9082, 0x0019, 0x1278,
-	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11cd,
-	0x2071, 0x1910, 0x080c, 0x6fcd, 0x012e, 0x0804, 0x6f64, 0xa850,
+	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11d6,
+	0x2071, 0x1910, 0x080c, 0x70be, 0x002e, 0x00ee, 0x0005, 0xa850,
 	0x9082, 0x001c, 0x1e68, 0xa880, 0x708e, 0x7036, 0x0146, 0x01d6,
 	0x0136, 0x01c6, 0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a, 0xa868,
 	0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, 0x4003,
-	0x015e, 0x01ce, 0x013e, 0x01de, 0x014e, 0x0890, 0x2001, 0x005b,
-	0x2004, 0x9094, 0x0780, 0x190c, 0x6fe1, 0xd09c, 0x2071, 0x1910,
-	0x1510, 0x2071, 0x1910, 0x700f, 0x0001, 0xa964, 0x9184, 0x00ff,
-	0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108,
-	0x710e, 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, 0x2071,
-	0x1910, 0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e,
-	0x9005, 0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x00d6, 0x2008,
-	0x2069, 0x1a01, 0x683c, 0x9005, 0x0760, 0x0158, 0x9186, 0x0003,
-	0x0540, 0x2001, 0x1815, 0x2004, 0x2009, 0x1b4c, 0x210c, 0x9102,
-	0x1500, 0x0126, 0x2091, 0x8000, 0x2069, 0x0050, 0x693c, 0x6838,
-	0x9106, 0x0190, 0x0e04, 0x6f98, 0x2069, 0x0000, 0x6837, 0x8040,
-	0x6833, 0x0012, 0x6883, 0x8040, 0x2091, 0x4080, 0x2001, 0x0089,
-	0x2004, 0xd084, 0x190c, 0x11cd, 0x2069, 0x1a01, 0x683f, 0xffff,
-	0x012e, 0x00de, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x7062, 0x701c,
-	0x904d, 0x0540, 0x2001, 0x005b, 0x2004, 0x9094, 0x0780, 0x15c9,
-	0xd09c, 0x1500, 0x2071, 0x1910, 0x700f, 0x0001, 0xa964, 0x9184,
+	0x015e, 0x01ce, 0x013e, 0x01de, 0x014e, 0x0890, 0x2071, 0x1910,
+	0xa803, 0x0000, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d,
+	0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d,
+	0x1118, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c,
+	0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e,
+	0x70c0, 0x9200, 0x70c2, 0x080c, 0x8522, 0x002e, 0x00ee, 0x0005,
+	0x0006, 0xa87c, 0x0006, 0xa867, 0x0103, 0x20a9, 0x001c, 0xa860,
+	0x20e8, 0xa85c, 0x9080, 0x001d, 0x20a0, 0x9006, 0x4004, 0x000e,
+	0x9084, 0x00ff, 0xa87e, 0x000e, 0xa87a, 0xa982, 0x0005, 0x2071,
+	0x1910, 0x7004, 0x0002, 0x6fd1, 0x6fd2, 0x70bd, 0x6fd2, 0x0d7d,
+	0x70bd, 0x0005, 0x2001, 0x1948, 0x2004, 0x0002, 0x6fdc, 0x6fdc,
+	0x7056, 0x7057, 0x6fdc, 0x7057, 0x0126, 0x2091, 0x8000, 0x1e0c,
+	0x70dd, 0x701c, 0x904d, 0x0508, 0xa84c, 0x9005, 0x0904, 0x7027,
+	0x0e04, 0x7005, 0xa94c, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032,
+	0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0xa850, 0x9082, 0x0019,
+	0x1278, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c,
+	0x11d6, 0x2071, 0x1910, 0x080c, 0x70be, 0x012e, 0x0804, 0x7055,
+	0xa850, 0x9082, 0x001c, 0x1e68, 0xa880, 0x708e, 0x7036, 0x0146,
+	0x01d6, 0x0136, 0x01c6, 0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a,
+	0xa868, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098,
+	0x4003, 0x015e, 0x01ce, 0x013e, 0x01de, 0x014e, 0x0890, 0x2001,
+	0x005b, 0x2004, 0x9094, 0x0780, 0x190c, 0x70d2, 0xd09c, 0x2071,
+	0x1910, 0x1510, 0x2071, 0x1910, 0x700f, 0x0001, 0xa964, 0x9184,
 	0x00ff, 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101,
 	0x0108, 0x710e, 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de,
-	0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005,
-	0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x0126, 0x2091, 0x8000,
-	0x701c, 0x904d, 0x0160, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e,
-	0x9005, 0x1108, 0x701a, 0x012e, 0x080c, 0x106d, 0x0005, 0x012e,
-	0x0005, 0x2091, 0x8000, 0x0e04, 0x6fe3, 0x0006, 0x0016, 0x2001,
-	0x8004, 0x0006, 0x0804, 0x0d86, 0x0096, 0x00f6, 0x2079, 0x0050,
-	0x7044, 0xd084, 0x01e0, 0xc084, 0x7046, 0x7838, 0x7938, 0x910e,
-	0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de,
-	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11cd,
-	0x2009, 0x1947, 0x200b, 0x0000, 0x00fe, 0x009e, 0x0005, 0x782c,
-	0x9094, 0x0780, 0x1971, 0xd0a4, 0x0db8, 0x2009, 0x1947, 0x2104,
-	0x8000, 0x200a, 0x9082, 0x000f, 0x0e78, 0x00e6, 0x2071, 0x1800,
-	0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1170, 0x2009,
-	0x1830, 0x210c, 0x918a, 0x0020, 0x0240, 0x7022, 0x2001, 0x1dc0,
-	0x200c, 0x8108, 0x2102, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c,
-	0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8420,
-	0x782c, 0x9094, 0x0780, 0x190c, 0x6fe1, 0xd0a4, 0x19c8, 0x7838,
-	0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833,
-	0x0013, 0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084,
-	0x190c, 0x11cd, 0x2009, 0x1947, 0x200b, 0x0000, 0x00ee, 0x00fe,
-	0x009e, 0x0005, 0x00f6, 0x2079, 0x0050, 0x7044, 0xd084, 0x01b8,
-	0xc084, 0x7046, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069,
-	0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001,
-	0x0089, 0x2004, 0xd084, 0x190c, 0x11cd, 0x00fe, 0x0005, 0x782c,
-	0x9094, 0x0780, 0x190c, 0x6fe1, 0xd0a4, 0x0db8, 0x00e6, 0x2071,
-	0x1800, 0x7824, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0,
-	0x8000, 0x70c2, 0x080c, 0x8420, 0x782c, 0x9094, 0x0780, 0x190c,
-	0x6fe1, 0xd0a4, 0x1d70, 0x00d6, 0x2069, 0x0050, 0x693c, 0x2069,
-	0x1948, 0x6808, 0x690a, 0x2069, 0x1a01, 0x9102, 0x1118, 0x683c,
-	0x9005, 0x1328, 0x2001, 0x1949, 0x200c, 0x810d, 0x693e, 0x00de,
-	0x00ee, 0x00fe, 0x0005, 0x7098, 0x908a, 0x0029, 0x1a0c, 0x0d7d,
-	0x9082, 0x001d, 0x003b, 0x0026, 0x2011, 0x1e00, 0x080c, 0x2a0b,
-	0x002e, 0x0005, 0x718a, 0x7114, 0x7130, 0x7158, 0x7179, 0x71b9,
-	0x71cb, 0x7130, 0x71a1, 0x70cf, 0x70fd, 0x70ce, 0x0005, 0x00d6,
-	0x2069, 0x0200, 0x6804, 0x9005, 0x1180, 0x6808, 0x9005, 0x1518,
-	0x709b, 0x0028, 0x2069, 0x198d, 0x2d04, 0x7002, 0x080c, 0x7526,
-	0x6028, 0x9085, 0x0600, 0x602a, 0x00b0, 0x709b, 0x0028, 0x2069,
-	0x198d, 0x2d04, 0x7002, 0x6028, 0x9085, 0x0600, 0x602a, 0x00e6,
-	0x0036, 0x0046, 0x0056, 0x2071, 0x1a69, 0x080c, 0x1a9e, 0x005e,
-	0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, 0x2069, 0x0200,
-	0x6804, 0x9005, 0x1178, 0x6808, 0x9005, 0x1160, 0x709b, 0x0028,
-	0x2069, 0x198d, 0x2d04, 0x7002, 0x080c, 0x75c9, 0x6028, 0x9085,
-	0x0600, 0x602a, 0x00de, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c,
-	0x29d1, 0x000e, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x723c, 0xd1d4,
-	0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x709b, 0x0020, 0x080c,
-	0x723c, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x001f, 0x0005,
-	0x2001, 0x0088, 0x080c, 0x29d1, 0x6124, 0xd1cc, 0x11d8, 0xd1dc,
-	0x11b0, 0xd1e4, 0x1188, 0x9184, 0x1e00, 0x11c8, 0x60e3, 0x0001,
-	0x600c, 0xc0b4, 0x600e, 0x080c, 0x7410, 0x2001, 0x0080, 0x080c,
-	0x29d1, 0x709b, 0x0028, 0x0058, 0x709b, 0x001e, 0x0040, 0x709b,
-	0x001d, 0x0028, 0x709b, 0x0020, 0x0010, 0x709b, 0x001f, 0x0005,
-	0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x7410, 0x2001,
-	0x0080, 0x080c, 0x29d1, 0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158,
-	0xd1e4, 0x1130, 0x9184, 0x1e00, 0x1158, 0x709b, 0x0028, 0x0040,
-	0x709b, 0x001e, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x001f,
-	0x0005, 0x2001, 0x00a0, 0x080c, 0x29d1, 0x6124, 0xd1dc, 0x1138,
-	0xd1e4, 0x0138, 0x080c, 0x1ac8, 0x709b, 0x001e, 0x0010, 0x709b,
-	0x001d, 0x0005, 0x080c, 0x72c5, 0x6124, 0xd1dc, 0x1188, 0x080c,
-	0x723c, 0x0016, 0x080c, 0x1ac8, 0x001e, 0xd1d4, 0x1128, 0xd1e4,
-	0x0138, 0x709b, 0x001e, 0x0020, 0x709b, 0x001f, 0x080c, 0x723c,
-	0x0005, 0x0006, 0x2001, 0x00a0, 0x080c, 0x29d1, 0x000e, 0x6124,
-	0xd1d4, 0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140,
-	0x709b, 0x001e, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x0021,
-	0x0005, 0x080c, 0x72c5, 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128,
-	0xd1e4, 0x0140, 0x709b, 0x001e, 0x0028, 0x709b, 0x001d, 0x0010,
-	0x709b, 0x001f, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, 0x29d1,
-	0x000e, 0x6124, 0xd1d4, 0x1178, 0xd1cc, 0x1150, 0xd1dc, 0x1128,
-	0xd1e4, 0x0158, 0x709b, 0x001e, 0x0040, 0x709b, 0x001d, 0x0028,
-	0x709b, 0x0020, 0x0010, 0x709b, 0x001f, 0x0005, 0x0016, 0x00c6,
-	0x00d6, 0x00e6, 0x0126, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071,
-	0x1800, 0x2091, 0x8000, 0x080c, 0x73e4, 0x11f8, 0x2001, 0x180c,
-	0x200c, 0xd1b4, 0x01d0, 0xc1b4, 0x2102, 0x0026, 0x2011, 0x0200,
-	0x080c, 0x2a0b, 0x002e, 0x080c, 0x29b7, 0x6024, 0xd0cc, 0x0148,
-	0x2001, 0x00a0, 0x080c, 0x29d1, 0x080c, 0x76e8, 0x080c, 0x5f41,
-	0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x73fe, 0x0150,
-	0x080c, 0x73f5, 0x1138, 0x2001, 0x0001, 0x080c, 0x2574, 0x080c,
-	0x73b8, 0x00a0, 0x080c, 0x72c2, 0x0178, 0x2001, 0x0001, 0x080c,
-	0x2574, 0x7098, 0x9086, 0x001e, 0x0120, 0x7098, 0x9086, 0x0022,
-	0x1118, 0x709b, 0x0025, 0x0010, 0x709b, 0x0021, 0x012e, 0x00ee,
-	0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x724d, 0x080c,
-	0x8614, 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011, 0x724d,
-	0x080c, 0x860b, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, 0x0016,
-	0x080c, 0x9d09, 0x2071, 0x1800, 0x080c, 0x71e6, 0x001e, 0x00fe,
-	0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6,
-	0x00f6, 0x0126, 0x080c, 0x9d09, 0x2061, 0x0100, 0x2069, 0x0140,
-	0x2071, 0x1800, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a, 0x080c,
-	0xa781, 0x2011, 0x0003, 0x080c, 0xa0a6, 0x2011, 0x0002, 0x080c,
-	0xa0b0, 0x080c, 0x9f6f, 0x080c, 0x85c0, 0x0036, 0x901e, 0x080c,
-	0x9fef, 0x003e, 0x080c, 0xa79d, 0x60e3, 0x0000, 0x080c, 0xe59b,
-	0x080c, 0xe5b6, 0x2009, 0x0004, 0x080c, 0x29bd, 0x080c, 0x28ea,
-	0x2001, 0x1800, 0x2003, 0x0004, 0x2011, 0x0008, 0x080c, 0x2a0b,
-	0x2011, 0x724d, 0x080c, 0x8614, 0x080c, 0x73fe, 0x0118, 0x9006,
-	0x080c, 0x29d1, 0x080c, 0x0bc3, 0x2001, 0x0001, 0x080c, 0x2574,
-	0x012e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e,
-	0x0005, 0x0026, 0x00e6, 0x2011, 0x725a, 0x2071, 0x1a01, 0x701c,
-	0x9206, 0x1118, 0x7018, 0x9005, 0x0110, 0x9085, 0x0001, 0x00ee,
-	0x002e, 0x0005, 0x6020, 0xd09c, 0x0005, 0x6800, 0x9084, 0xfffe,
-	0x9086, 0x00c0, 0x01b8, 0x2001, 0x00c0, 0x080c, 0x29d1, 0x0156,
-	0x20a9, 0x002d, 0x1d04, 0x72d2, 0x2091, 0x6000, 0x1f04, 0x72d2,
-	0x015e, 0x00d6, 0x2069, 0x1800, 0x689c, 0x8001, 0x0220, 0x0118,
-	0x689e, 0x00de, 0x0005, 0x689f, 0x0014, 0x68ec, 0xd0dc, 0x0dc8,
-	0x6800, 0x9086, 0x0001, 0x1da8, 0x080c, 0x8620, 0x0c90, 0x00c6,
-	0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800,
-	0x080c, 0x76f7, 0x2001, 0x196d, 0x2003, 0x0000, 0x9006, 0x709a,
-	0x60e2, 0x6886, 0x080c, 0x2643, 0x9006, 0x080c, 0x29d1, 0x080c,
-	0x5dfc, 0x0026, 0x2011, 0xffff, 0x080c, 0x2a0b, 0x002e, 0x602b,
-	0x182c, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6,
-	0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2001, 0x197d,
-	0x200c, 0x9186, 0x0000, 0x0158, 0x9186, 0x0001, 0x0158, 0x9186,
-	0x0002, 0x0158, 0x9186, 0x0003, 0x0158, 0x0804, 0x73a8, 0x709b,
-	0x0022, 0x0040, 0x709b, 0x0021, 0x0028, 0x709b, 0x0023, 0x0010,
-	0x709b, 0x0024, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001,
-	0x080c, 0x2643, 0x080c, 0xa781, 0x0026, 0x080c, 0xaa49, 0x002e,
-	0x080c, 0xa79d, 0x7000, 0x908e, 0x0004, 0x0118, 0x602b, 0x0028,
-	0x0010, 0x602b, 0x0020, 0x0156, 0x0126, 0x2091, 0x8000, 0x20a9,
-	0x0005, 0x6024, 0xd0ac, 0x0150, 0x012e, 0x015e, 0x080c, 0xce35,
-	0x0118, 0x9006, 0x080c, 0x29fb, 0x0804, 0x73b4, 0x6800, 0x9084,
-	0x00a1, 0xc0bd, 0x6802, 0x080c, 0x29b7, 0x6904, 0xd1d4, 0x1140,
-	0x2001, 0x0100, 0x080c, 0x29d1, 0x1f04, 0x7359, 0x080c, 0x743b,
-	0x012e, 0x015e, 0x080c, 0x73f5, 0x0170, 0x6044, 0x9005, 0x0130,
-	0x080c, 0x743b, 0x9006, 0x8001, 0x1df0, 0x0028, 0x6804, 0xd0d4,
-	0x1110, 0x080c, 0x743b, 0x080c, 0xce35, 0x0118, 0x9006, 0x080c,
-	0x29fb, 0x0016, 0x0026, 0x7000, 0x908e, 0x0004, 0x0130, 0x2009,
-	0x00c8, 0x2011, 0x725a, 0x080c, 0x85d2, 0x002e, 0x001e, 0x080c,
-	0x8417, 0x7034, 0xc085, 0x7036, 0x2001, 0x197d, 0x2003, 0x0004,
-	0x080c, 0x70b3, 0x080c, 0x73f5, 0x0138, 0x6804, 0xd0d4, 0x1120,
-	0xd0dc, 0x1100, 0x080c, 0x76ed, 0x00ee, 0x00de, 0x00ce, 0x0005,
+	0x2071, 0x1910, 0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800,
+	0x701e, 0x9005, 0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x00d6,
+	0x2008, 0x2069, 0x1a03, 0x683c, 0x9005, 0x0760, 0x0158, 0x9186,
+	0x0003, 0x0540, 0x2001, 0x1815, 0x2004, 0x2009, 0x1b4e, 0x210c,
+	0x9102, 0x1500, 0x0126, 0x2091, 0x8000, 0x2069, 0x0050, 0x693c,
+	0x6838, 0x9106, 0x0190, 0x0e04, 0x7089, 0x2069, 0x0000, 0x6837,
+	0x8040, 0x6833, 0x0012, 0x6883, 0x8040, 0x2091, 0x4080, 0x2001,
+	0x0089, 0x2004, 0xd084, 0x190c, 0x11d6, 0x2069, 0x1a03, 0x683f,
+	0xffff, 0x012e, 0x00de, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x7153,
+	0x701c, 0x904d, 0x0540, 0x2001, 0x005b, 0x2004, 0x9094, 0x0780,
+	0x15c9, 0xd09c, 0x1500, 0x2071, 0x1910, 0x700f, 0x0001, 0xa964,
+	0x9184, 0x00ff, 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff,
+	0x8101, 0x0108, 0x710e, 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822,
+	0x00de, 0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e,
+	0x9005, 0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x0126, 0x2091,
+	0x8000, 0x701c, 0x904d, 0x0160, 0x7010, 0x8001, 0x7012, 0xa800,
+	0x701e, 0x9005, 0x1108, 0x701a, 0x012e, 0x080c, 0x106c, 0x0005,
+	0x012e, 0x0005, 0x2091, 0x8000, 0x0e04, 0x70d4, 0x0006, 0x0016,
+	0x2001, 0x8004, 0x0006, 0x0804, 0x0d86, 0x0096, 0x00f6, 0x2079,
+	0x0050, 0x7044, 0xd084, 0x01e0, 0xc084, 0x7046, 0x7838, 0x7938,
+	0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013,
+	0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c,
+	0x11d6, 0x2009, 0x1947, 0x200b, 0x0000, 0x00fe, 0x009e, 0x0005,
+	0x782c, 0x9094, 0x0780, 0x1971, 0xd0a4, 0x0db8, 0x2009, 0x1947,
+	0x2104, 0x8000, 0x200a, 0x9082, 0x000f, 0x0e78, 0x00e6, 0x2071,
+	0x1800, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1170,
+	0x2009, 0x1830, 0x210c, 0x918a, 0x0020, 0x0240, 0x7022, 0x2001,
+	0x1dc0, 0x200c, 0x8108, 0x2102, 0x00ee, 0x0058, 0x00ee, 0x2048,
+	0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c,
+	0x8522, 0x782c, 0x9094, 0x0780, 0x190c, 0x70d2, 0xd0a4, 0x19c8,
+	0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836,
+	0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
+	0xd084, 0x190c, 0x11d6, 0x2009, 0x1947, 0x200b, 0x0000, 0x00ee,
+	0x00fe, 0x009e, 0x0005, 0x00f6, 0x2079, 0x0050, 0x7044, 0xd084,
+	0x01b8, 0xc084, 0x7046, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6,
+	0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080,
+	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11d6, 0x00fe, 0x0005,
+	0x782c, 0x9094, 0x0780, 0x190c, 0x70d2, 0xd0a4, 0x0db8, 0x00e6,
+	0x2071, 0x1800, 0x7824, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e,
+	0x70c0, 0x8000, 0x70c2, 0x080c, 0x8522, 0x782c, 0x9094, 0x0780,
+	0x190c, 0x70d2, 0xd0a4, 0x1d70, 0x00d6, 0x2069, 0x0050, 0x693c,
+	0x2069, 0x1948, 0x6808, 0x690a, 0x2069, 0x1a03, 0x9102, 0x1118,
+	0x683c, 0x9005, 0x1328, 0x2001, 0x1949, 0x200c, 0x810d, 0x693e,
+	0x00de, 0x00ee, 0x00fe, 0x0005, 0x7098, 0x908a, 0x0029, 0x1a0c,
+	0x0d7d, 0x9082, 0x001d, 0x003b, 0x0026, 0x2011, 0x1e00, 0x080c,
+	0x2a44, 0x002e, 0x0005, 0x727b, 0x7205, 0x7221, 0x7249, 0x726a,
+	0x72aa, 0x72bc, 0x7221, 0x7292, 0x71c0, 0x71ee, 0x71bf, 0x0005,
+	0x00d6, 0x2069, 0x0200, 0x6804, 0x9005, 0x1180, 0x6808, 0x9005,
+	0x1518, 0x709b, 0x0028, 0x2069, 0x198f, 0x2d04, 0x7002, 0x080c,
+	0x7617, 0x6028, 0x9085, 0x0600, 0x602a, 0x00b0, 0x709b, 0x0028,
+	0x2069, 0x198f, 0x2d04, 0x7002, 0x6028, 0x9085, 0x0600, 0x602a,
+	0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a6b, 0x080c, 0x1ab5,
+	0x005e, 0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, 0x2069,
+	0x0200, 0x6804, 0x9005, 0x1178, 0x6808, 0x9005, 0x1160, 0x709b,
+	0x0028, 0x2069, 0x198f, 0x2d04, 0x7002, 0x080c, 0x76ba, 0x6028,
+	0x9085, 0x0600, 0x602a, 0x00de, 0x0005, 0x0006, 0x2001, 0x0090,
+	0x080c, 0x2a0a, 0x000e, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x732d,
+	0xd1d4, 0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x709b, 0x0020,
+	0x080c, 0x732d, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x001f,
+	0x0005, 0x2001, 0x0088, 0x080c, 0x2a0a, 0x6124, 0xd1cc, 0x11d8,
+	0xd1dc, 0x11b0, 0xd1e4, 0x1188, 0x9184, 0x1e00, 0x11c8, 0x60e3,
+	0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x7501, 0x2001, 0x0080,
+	0x080c, 0x2a0a, 0x709b, 0x0028, 0x0058, 0x709b, 0x001e, 0x0040,
+	0x709b, 0x001d, 0x0028, 0x709b, 0x0020, 0x0010, 0x709b, 0x001f,
+	0x0005, 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x7501,
+	0x2001, 0x0080, 0x080c, 0x2a0a, 0x6124, 0xd1d4, 0x1180, 0xd1dc,
+	0x1158, 0xd1e4, 0x1130, 0x9184, 0x1e00, 0x1158, 0x709b, 0x0028,
+	0x0040, 0x709b, 0x001e, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b,
+	0x001f, 0x0005, 0x2001, 0x00a0, 0x080c, 0x2a0a, 0x6124, 0xd1dc,
+	0x1138, 0xd1e4, 0x0138, 0x080c, 0x1adf, 0x709b, 0x001e, 0x0010,
+	0x709b, 0x001d, 0x0005, 0x080c, 0x73b6, 0x6124, 0xd1dc, 0x1188,
+	0x080c, 0x732d, 0x0016, 0x080c, 0x1adf, 0x001e, 0xd1d4, 0x1128,
+	0xd1e4, 0x0138, 0x709b, 0x001e, 0x0020, 0x709b, 0x001f, 0x080c,
+	0x732d, 0x0005, 0x0006, 0x2001, 0x00a0, 0x080c, 0x2a0a, 0x000e,
+	0x6124, 0xd1d4, 0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4,
+	0x0140, 0x709b, 0x001e, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b,
+	0x0021, 0x0005, 0x080c, 0x73b6, 0x6124, 0xd1d4, 0x1150, 0xd1dc,
+	0x1128, 0xd1e4, 0x0140, 0x709b, 0x001e, 0x0028, 0x709b, 0x001d,
+	0x0010, 0x709b, 0x001f, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c,
+	0x2a0a, 0x000e, 0x6124, 0xd1d4, 0x1178, 0xd1cc, 0x1150, 0xd1dc,
+	0x1128, 0xd1e4, 0x0158, 0x709b, 0x001e, 0x0040, 0x709b, 0x001d,
+	0x0028, 0x709b, 0x0020, 0x0010, 0x709b, 0x001f, 0x0005, 0x0016,
+	0x00c6, 0x00d6, 0x00e6, 0x0126, 0x2061, 0x0100, 0x2069, 0x0140,
+	0x2071, 0x1800, 0x2091, 0x8000, 0x080c, 0x74d5, 0x11f8, 0x2001,
+	0x180c, 0x200c, 0xd1b4, 0x01d0, 0xc1b4, 0x2102, 0x0026, 0x2011,
+	0x0200, 0x080c, 0x2a44, 0x002e, 0x080c, 0x29f0, 0x6024, 0xd0cc,
+	0x0148, 0x2001, 0x00a0, 0x080c, 0x2a0a, 0x080c, 0x77d9, 0x080c,
+	0x6022, 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x74ef,
+	0x0150, 0x080c, 0x74e6, 0x1138, 0x2001, 0x0001, 0x080c, 0x25a0,
+	0x080c, 0x74a9, 0x00a0, 0x080c, 0x73b3, 0x0178, 0x2001, 0x0001,
+	0x080c, 0x25a0, 0x7098, 0x9086, 0x001e, 0x0120, 0x7098, 0x9086,
+	0x0022, 0x1118, 0x709b, 0x0025, 0x0010, 0x709b, 0x0021, 0x012e,
+	0x00ee, 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x733e,
+	0x080c, 0x8719, 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011,
+	0x733e, 0x080c, 0x8710, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6,
+	0x0016, 0x080c, 0x9e0e, 0x2071, 0x1800, 0x080c, 0x72d7, 0x001e,
+	0x00fe, 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6,
+	0x00e6, 0x00f6, 0x0126, 0x080c, 0x9e0e, 0x2061, 0x0100, 0x2069,
+	0x0140, 0x2071, 0x1800, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a,
+	0x080c, 0xa872, 0x2011, 0x0003, 0x080c, 0xa1ab, 0x2011, 0x0002,
+	0x080c, 0xa1b5, 0x080c, 0xa074, 0x080c, 0x86c5, 0x0036, 0x901e,
+	0x080c, 0xa0f4, 0x003e, 0x080c, 0xa88e, 0x60e3, 0x0000, 0x080c,
+	0xe6d7, 0x080c, 0xe6f2, 0x2009, 0x0004, 0x080c, 0x29f6, 0x080c,
+	0x2916, 0x2001, 0x1800, 0x2003, 0x0004, 0x2011, 0x0008, 0x080c,
+	0x2a44, 0x2011, 0x733e, 0x080c, 0x8719, 0x080c, 0x74ef, 0x0118,
+	0x9006, 0x080c, 0x2a0a, 0x080c, 0x0bc3, 0x2001, 0x0001, 0x080c,
+	0x25a0, 0x012e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e,
+	0x001e, 0x0005, 0x0026, 0x00e6, 0x2011, 0x734b, 0x2071, 0x1a03,
+	0x701c, 0x9206, 0x1118, 0x7018, 0x9005, 0x0110, 0x9085, 0x0001,
+	0x00ee, 0x002e, 0x0005, 0x6020, 0xd09c, 0x0005, 0x6800, 0x9084,
+	0xfffe, 0x9086, 0x00c0, 0x01b8, 0x2001, 0x00c0, 0x080c, 0x2a0a,
+	0x0156, 0x20a9, 0x002d, 0x1d04, 0x73c3, 0x2091, 0x6000, 0x1f04,
+	0x73c3, 0x015e, 0x00d6, 0x2069, 0x1800, 0x689c, 0x8001, 0x0220,
+	0x0118, 0x689e, 0x00de, 0x0005, 0x689f, 0x0014, 0x68ec, 0xd0dc,
+	0x0dc8, 0x6800, 0x9086, 0x0001, 0x1da8, 0x080c, 0x8725, 0x0c90,
 	0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071,
-	0x1800, 0x080c, 0x842e, 0x080c, 0x8420, 0x080c, 0x76f7, 0x2001,
-	0x196d, 0x2003, 0x0000, 0x9006, 0x709a, 0x60e2, 0x6886, 0x080c,
-	0x2643, 0x9006, 0x080c, 0x29d1, 0x6043, 0x0090, 0x6043, 0x0010,
-	0x0026, 0x2011, 0xffff, 0x080c, 0x2a0b, 0x002e, 0x602b, 0x182c,
-	0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, 0x2001, 0x197c, 0x2004,
-	0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006, 0x080c, 0x5600, 0x9084,
-	0x0030, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, 0x080c, 0x5600,
-	0x9084, 0x0030, 0x9086, 0x0030, 0x000e, 0x0005, 0x0006, 0x080c,
-	0x5600, 0x9084, 0x0030, 0x9086, 0x0010, 0x000e, 0x0005, 0x0006,
-	0x080c, 0x5600, 0x9084, 0x0030, 0x9086, 0x0020, 0x000e, 0x0005,
-	0x0036, 0x0016, 0x2001, 0x180c, 0x2004, 0x908c, 0x0013, 0x0180,
-	0x0020, 0x080c, 0x2663, 0x900e, 0x0028, 0x080c, 0x6962, 0x1dc8,
-	0x2009, 0x0002, 0x2019, 0x0028, 0x080c, 0x316a, 0x9006, 0x0019,
-	0x001e, 0x003e, 0x0005, 0x00e6, 0x2071, 0x180c, 0x2e04, 0x0130,
-	0x080c, 0xce2e, 0x1128, 0x9085, 0x0010, 0x0010, 0x9084, 0xffef,
-	0x2072, 0x00ee, 0x0005, 0x6050, 0x0006, 0x60ec, 0x0006, 0x600c,
-	0x0006, 0x6004, 0x0006, 0x6028, 0x0006, 0x602f, 0x0100, 0x602f,
-	0x0000, 0x602f, 0x0040, 0x602f, 0x0000, 0x20a9, 0x0002, 0x080c,
-	0x2998, 0x0026, 0x2011, 0x0040, 0x080c, 0x2a0b, 0x002e, 0x000e,
-	0x602a, 0x000e, 0x6006, 0x000e, 0x600e, 0x000e, 0x60ee, 0x60e3,
-	0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x2643, 0x2001,
-	0x00a0, 0x0006, 0x080c, 0xce35, 0x000e, 0x0130, 0x080c, 0x29ef,
-	0x9006, 0x080c, 0x29fb, 0x0010, 0x080c, 0x29d1, 0x000e, 0x6052,
-	0x6050, 0x0006, 0xc0e5, 0x6052, 0x00f6, 0x2079, 0x0100, 0x080c,
-	0x2948, 0x00fe, 0x000e, 0x6052, 0x0005, 0x0156, 0x0016, 0x0026,
-	0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140,
-	0x2071, 0x1800, 0x080c, 0xa7df, 0x0158, 0x2001, 0x0386, 0x2004,
-	0xd0b4, 0x1130, 0x2001, 0x0016, 0x080c, 0xa772, 0x0804, 0x7518,
-	0x2001, 0x180c, 0x200c, 0xc1c4, 0x2102, 0x6028, 0x9084, 0xe1ff,
-	0x602a, 0x2011, 0x0200, 0x080c, 0x2a0b, 0x2001, 0x0090, 0x080c,
-	0x29d1, 0x20a9, 0x0366, 0x6024, 0xd0cc, 0x1558, 0x1d04, 0x74b3,
-	0x2091, 0x6000, 0x1f04, 0x74b3, 0x080c, 0xa781, 0x2011, 0x0003,
-	0x080c, 0xa0a6, 0x2011, 0x0002, 0x080c, 0xa0b0, 0x080c, 0x9f6f,
-	0x901e, 0x080c, 0x9fef, 0x2001, 0x0386, 0x2003, 0x7000, 0x080c,
-	0xa79d, 0x2001, 0x00a0, 0x080c, 0x29d1, 0x080c, 0x76e8, 0x080c,
-	0x5f41, 0x080c, 0xce35, 0x0110, 0x080c, 0x0ce9, 0x9085, 0x0001,
-	0x04e8, 0x2001, 0x0386, 0x2004, 0xd0ac, 0x0110, 0x080c, 0x1ac8,
-	0x60e3, 0x0000, 0x2001, 0x196d, 0x2004, 0x080c, 0x2643, 0x60e2,
-	0x2001, 0x0080, 0x080c, 0x29d1, 0x20a9, 0x0366, 0x2011, 0x1e00,
-	0x080c, 0x2a0b, 0x2009, 0x1e00, 0x080c, 0x29b7, 0x6024, 0x910c,
-	0x0140, 0x1d04, 0x74f6, 0x2091, 0x6000, 0x1f04, 0x74f6, 0x0804,
-	0x74bc, 0x2001, 0x0386, 0x2003, 0x7000, 0x6028, 0x9085, 0x1e00,
-	0x602a, 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886,
-	0x080c, 0xce35, 0x0110, 0x080c, 0x0ce9, 0x9006, 0x00ee, 0x00de,
-	0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016,
-	0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071,
-	0x1800, 0x7000, 0x9086, 0x0003, 0x1168, 0x2001, 0x020b, 0x2004,
-	0x9084, 0x5540, 0x9086, 0x5540, 0x1128, 0x2069, 0x1a75, 0x2d04,
-	0x8000, 0x206a, 0x2069, 0x0140, 0x6020, 0x9084, 0x00c0, 0x0120,
-	0x6884, 0x9005, 0x1904, 0x758f, 0x2001, 0x0088, 0x080c, 0x29d1,
-	0x9006, 0x60e2, 0x6886, 0x080c, 0x2643, 0x2069, 0x0200, 0x6804,
-	0x9005, 0x1118, 0x6808, 0x9005, 0x01d0, 0x6028, 0x9084, 0xfbff,
-	0x602a, 0x2011, 0x0400, 0x080c, 0x2a0b, 0x2069, 0x198d, 0x7000,
-	0x206a, 0x709b, 0x0026, 0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04,
-	0x756f, 0x2091, 0x6000, 0x1f04, 0x756f, 0x0804, 0x75c1, 0x2069,
-	0x0140, 0x20a9, 0x0384, 0x2011, 0x1e00, 0x080c, 0x2a0b, 0x2009,
-	0x1e00, 0x080c, 0x29b7, 0x6024, 0x910c, 0x0528, 0x9084, 0x1a00,
-	0x1510, 0x1d04, 0x757b, 0x2091, 0x6000, 0x1f04, 0x757b, 0x080c,
-	0xa781, 0x2011, 0x0003, 0x080c, 0xa0a6, 0x2011, 0x0002, 0x080c,
-	0xa0b0, 0x080c, 0x9f6f, 0x901e, 0x080c, 0x9fef, 0x080c, 0xa79d,
-	0x2001, 0x00a0, 0x080c, 0x29d1, 0x080c, 0x76e8, 0x080c, 0x5f41,
-	0x9085, 0x0001, 0x00b0, 0x2001, 0x0080, 0x080c, 0x29d1, 0x2069,
+	0x1800, 0x080c, 0x77e8, 0x2001, 0x196d, 0x2003, 0x0000, 0x9006,
+	0x709a, 0x60e2, 0x6886, 0x080c, 0x266f, 0x9006, 0x080c, 0x2a0a,
+	0x080c, 0x5edd, 0x0026, 0x2011, 0xffff, 0x080c, 0x2a44, 0x002e,
+	0x602b, 0x182c, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6,
+	0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2001,
+	0x197d, 0x200c, 0x9186, 0x0000, 0x0158, 0x9186, 0x0001, 0x0158,
+	0x9186, 0x0002, 0x0158, 0x9186, 0x0003, 0x0158, 0x0804, 0x7499,
+	0x709b, 0x0022, 0x0040, 0x709b, 0x0021, 0x0028, 0x709b, 0x0023,
+	0x0010, 0x709b, 0x0024, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001,
+	0x0001, 0x080c, 0x266f, 0x080c, 0xa872, 0x0026, 0x080c, 0xab3a,
+	0x002e, 0x080c, 0xa88e, 0x7000, 0x908e, 0x0004, 0x0118, 0x602b,
+	0x0028, 0x0010, 0x602b, 0x0020, 0x0156, 0x0126, 0x2091, 0x8000,
+	0x20a9, 0x0005, 0x6024, 0xd0ac, 0x0150, 0x012e, 0x015e, 0x080c,
+	0xcf2e, 0x0118, 0x9006, 0x080c, 0x2a34, 0x0804, 0x74a5, 0x6800,
+	0x9084, 0x00a1, 0xc0bd, 0x6802, 0x080c, 0x29f0, 0x6904, 0xd1d4,
+	0x1140, 0x2001, 0x0100, 0x080c, 0x2a0a, 0x1f04, 0x744a, 0x080c,
+	0x752c, 0x012e, 0x015e, 0x080c, 0x74e6, 0x0170, 0x6044, 0x9005,
+	0x0130, 0x080c, 0x752c, 0x9006, 0x8001, 0x1df0, 0x0028, 0x6804,
+	0xd0d4, 0x1110, 0x080c, 0x752c, 0x080c, 0xcf2e, 0x0118, 0x9006,
+	0x080c, 0x2a34, 0x0016, 0x0026, 0x7000, 0x908e, 0x0004, 0x0130,
+	0x2009, 0x00c8, 0x2011, 0x734b, 0x080c, 0x86d7, 0x002e, 0x001e,
+	0x080c, 0x8519, 0x7034, 0xc085, 0x7036, 0x2001, 0x197d, 0x2003,
+	0x0004, 0x080c, 0x71a4, 0x080c, 0x74e6, 0x0138, 0x6804, 0xd0d4,
+	0x1120, 0xd0dc, 0x1100, 0x080c, 0x77de, 0x00ee, 0x00de, 0x00ce,
+	0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140,
+	0x2071, 0x1800, 0x080c, 0x8530, 0x080c, 0x8522, 0x080c, 0x77e8,
+	0x2001, 0x196d, 0x2003, 0x0000, 0x9006, 0x709a, 0x60e2, 0x6886,
+	0x080c, 0x266f, 0x9006, 0x080c, 0x2a0a, 0x6043, 0x0090, 0x6043,
+	0x0010, 0x0026, 0x2011, 0xffff, 0x080c, 0x2a44, 0x002e, 0x602b,
+	0x182c, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, 0x2001, 0x197c,
+	0x2004, 0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006, 0x080c, 0x56d7,
+	0x9084, 0x0030, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, 0x080c,
+	0x56d7, 0x9084, 0x0030, 0x9086, 0x0030, 0x000e, 0x0005, 0x0006,
+	0x080c, 0x56d7, 0x9084, 0x0030, 0x9086, 0x0010, 0x000e, 0x0005,
+	0x0006, 0x080c, 0x56d7, 0x9084, 0x0030, 0x9086, 0x0020, 0x000e,
+	0x0005, 0x0036, 0x0016, 0x2001, 0x180c, 0x2004, 0x908c, 0x0013,
+	0x0180, 0x0020, 0x080c, 0x268f, 0x900e, 0x0028, 0x080c, 0x6a53,
+	0x1dc8, 0x2009, 0x0002, 0x2019, 0x0028, 0x080c, 0x31a3, 0x9006,
+	0x0019, 0x001e, 0x003e, 0x0005, 0x00e6, 0x2071, 0x180c, 0x2e04,
+	0x0130, 0x080c, 0xcf27, 0x1128, 0x9085, 0x0010, 0x0010, 0x9084,
+	0xffef, 0x2072, 0x00ee, 0x0005, 0x6050, 0x0006, 0x60ec, 0x0006,
+	0x600c, 0x0006, 0x6004, 0x0006, 0x6028, 0x0006, 0x602f, 0x0100,
+	0x602f, 0x0000, 0x602f, 0x0040, 0x602f, 0x0000, 0x20a9, 0x0002,
+	0x080c, 0x29d1, 0x0026, 0x2011, 0x0040, 0x080c, 0x2a44, 0x002e,
+	0x000e, 0x602a, 0x000e, 0x6006, 0x000e, 0x600e, 0x000e, 0x60ee,
+	0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x266f,
+	0x2001, 0x00a0, 0x0006, 0x080c, 0xcf2e, 0x000e, 0x0130, 0x080c,
+	0x2a28, 0x9006, 0x080c, 0x2a34, 0x0010, 0x080c, 0x2a0a, 0x000e,
+	0x6052, 0x6050, 0x0006, 0xc0e5, 0x6052, 0x00f6, 0x2079, 0x0100,
+	0x080c, 0x2981, 0x00fe, 0x000e, 0x6052, 0x0005, 0x0156, 0x0016,
+	0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069,
+	0x0140, 0x2071, 0x1800, 0x080c, 0xa8d0, 0x0158, 0x2001, 0x0386,
+	0x2004, 0xd0b4, 0x1130, 0x2001, 0x0016, 0x080c, 0xa863, 0x0804,
+	0x7609, 0x2001, 0x180c, 0x200c, 0xc1c4, 0x2102, 0x6028, 0x9084,
+	0xe1ff, 0x602a, 0x2011, 0x0200, 0x080c, 0x2a44, 0x2001, 0x0090,
+	0x080c, 0x2a0a, 0x20a9, 0x0366, 0x6024, 0xd0cc, 0x1558, 0x1d04,
+	0x75a4, 0x2091, 0x6000, 0x1f04, 0x75a4, 0x080c, 0xa872, 0x2011,
+	0x0003, 0x080c, 0xa1ab, 0x2011, 0x0002, 0x080c, 0xa1b5, 0x080c,
+	0xa074, 0x901e, 0x080c, 0xa0f4, 0x2001, 0x0386, 0x2003, 0x7000,
+	0x080c, 0xa88e, 0x2001, 0x00a0, 0x080c, 0x2a0a, 0x080c, 0x77d9,
+	0x080c, 0x6022, 0x080c, 0xcf2e, 0x0110, 0x080c, 0x0ce9, 0x9085,
+	0x0001, 0x04e8, 0x2001, 0x0386, 0x2004, 0xd0ac, 0x0110, 0x080c,
+	0x1adf, 0x60e3, 0x0000, 0x2001, 0x196d, 0x2004, 0x080c, 0x266f,
+	0x60e2, 0x2001, 0x0080, 0x080c, 0x2a0a, 0x20a9, 0x0366, 0x2011,
+	0x1e00, 0x080c, 0x2a44, 0x2009, 0x1e00, 0x080c, 0x29f0, 0x6024,
+	0x910c, 0x0140, 0x1d04, 0x75e7, 0x2091, 0x6000, 0x1f04, 0x75e7,
+	0x0804, 0x75ad, 0x2001, 0x0386, 0x2003, 0x7000, 0x6028, 0x9085,
+	0x1e00, 0x602a, 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008,
+	0x6886, 0x080c, 0xcf2e, 0x0110, 0x080c, 0x0ce9, 0x9006, 0x00ee,
+	0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156,
+	0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100,
+	0x2071, 0x1800, 0x7000, 0x9086, 0x0003, 0x1168, 0x2001, 0x020b,
+	0x2004, 0x9084, 0x5540, 0x9086, 0x5540, 0x1128, 0x2069, 0x1a77,
+	0x2d04, 0x8000, 0x206a, 0x2069, 0x0140, 0x6020, 0x9084, 0x00c0,
+	0x0120, 0x6884, 0x9005, 0x1904, 0x7680, 0x2001, 0x0088, 0x080c,
+	0x2a0a, 0x9006, 0x60e2, 0x6886, 0x080c, 0x266f, 0x2069, 0x0200,
+	0x6804, 0x9005, 0x1118, 0x6808, 0x9005, 0x01d0, 0x6028, 0x9084,
+	0xfbff, 0x602a, 0x2011, 0x0400, 0x080c, 0x2a44, 0x2069, 0x198f,
+	0x7000, 0x206a, 0x709b, 0x0026, 0x7003, 0x0001, 0x20a9, 0x0002,
+	0x1d04, 0x7660, 0x2091, 0x6000, 0x1f04, 0x7660, 0x0804, 0x76b2,
+	0x2069, 0x0140, 0x20a9, 0x0384, 0x2011, 0x1e00, 0x080c, 0x2a44,
+	0x2009, 0x1e00, 0x080c, 0x29f0, 0x6024, 0x910c, 0x0528, 0x9084,
+	0x1a00, 0x1510, 0x1d04, 0x766c, 0x2091, 0x6000, 0x1f04, 0x766c,
+	0x080c, 0xa872, 0x2011, 0x0003, 0x080c, 0xa1ab, 0x2011, 0x0002,
+	0x080c, 0xa1b5, 0x080c, 0xa074, 0x901e, 0x080c, 0xa0f4, 0x080c,
+	0xa88e, 0x2001, 0x00a0, 0x080c, 0x2a0a, 0x080c, 0x77d9, 0x080c,
+	0x6022, 0x9085, 0x0001, 0x00b0, 0x2001, 0x0080, 0x080c, 0x2a0a,
+	0x2069, 0x0140, 0x60e3, 0x0000, 0x70b4, 0x9005, 0x1118, 0x6887,
+	0x0001, 0x0008, 0x6886, 0x2001, 0x196d, 0x2004, 0x080c, 0x266f,
+	0x60e2, 0x9006, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e,
+	0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6,
+	0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, 0x6020, 0x9084, 0x00c0,
+	0x01e8, 0x080c, 0xa872, 0x2011, 0x0003, 0x080c, 0xa1ab, 0x2011,
+	0x0002, 0x080c, 0xa1b5, 0x080c, 0xa074, 0x901e, 0x080c, 0xa0f4,
+	0x080c, 0xa88e, 0x2069, 0x0140, 0x2001, 0x00a0, 0x080c, 0x2a0a,
+	0x080c, 0x77d9, 0x080c, 0x6022, 0x0804, 0x7755, 0x2001, 0x180c,
+	0x200c, 0xd1b4, 0x1160, 0xc1b5, 0x2102, 0x080c, 0x7333, 0x2069,
+	0x0140, 0x2001, 0x0080, 0x080c, 0x2a0a, 0x60e3, 0x0000, 0x2069,
+	0x0200, 0x6804, 0x9005, 0x1118, 0x6808, 0x9005, 0x0190, 0x6028,
+	0x9084, 0xfdff, 0x602a, 0x2011, 0x0200, 0x080c, 0x2a44, 0x2069,
+	0x198f, 0x7000, 0x206a, 0x709b, 0x0027, 0x7003, 0x0001, 0x0804,
+	0x7755, 0x2011, 0x1e00, 0x080c, 0x2a44, 0x2009, 0x1e00, 0x080c,
+	0x29f0, 0x6024, 0x910c, 0x01c8, 0x9084, 0x1c00, 0x11b0, 0x1d04,
+	0x7711, 0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x8561,
+	0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, 0x1a03,
+	0x7018, 0x00ee, 0x9005, 0x19e8, 0x0500, 0x0026, 0x2011, 0x734b,
+	0x080c, 0x860d, 0x2011, 0x733e, 0x080c, 0x8719, 0x002e, 0x2069,
 	0x0140, 0x60e3, 0x0000, 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001,
-	0x0008, 0x6886, 0x2001, 0x196d, 0x2004, 0x080c, 0x2643, 0x60e2,
-	0x9006, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e,
-	0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6,
-	0x2061, 0x0100, 0x2071, 0x1800, 0x6020, 0x9084, 0x00c0, 0x01e8,
-	0x080c, 0xa781, 0x2011, 0x0003, 0x080c, 0xa0a6, 0x2011, 0x0002,
-	0x080c, 0xa0b0, 0x080c, 0x9f6f, 0x901e, 0x080c, 0x9fef, 0x080c,
-	0xa79d, 0x2069, 0x0140, 0x2001, 0x00a0, 0x080c, 0x29d1, 0x080c,
-	0x76e8, 0x080c, 0x5f41, 0x0804, 0x7664, 0x2001, 0x180c, 0x200c,
-	0xd1b4, 0x1160, 0xc1b5, 0x2102, 0x080c, 0x7242, 0x2069, 0x0140,
-	0x2001, 0x0080, 0x080c, 0x29d1, 0x60e3, 0x0000, 0x2069, 0x0200,
-	0x6804, 0x9005, 0x1118, 0x6808, 0x9005, 0x0190, 0x6028, 0x9084,
-	0xfdff, 0x602a, 0x2011, 0x0200, 0x080c, 0x2a0b, 0x2069, 0x198d,
-	0x7000, 0x206a, 0x709b, 0x0027, 0x7003, 0x0001, 0x0804, 0x7664,
-	0x2011, 0x1e00, 0x080c, 0x2a0b, 0x2009, 0x1e00, 0x080c, 0x29b7,
-	0x6024, 0x910c, 0x01c8, 0x9084, 0x1c00, 0x11b0, 0x1d04, 0x7620,
-	0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x845f, 0x00ee,
-	0x00de, 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, 0x1a01, 0x7018,
-	0x00ee, 0x9005, 0x19e8, 0x0500, 0x0026, 0x2011, 0x725a, 0x080c,
-	0x850b, 0x2011, 0x724d, 0x080c, 0x8614, 0x002e, 0x2069, 0x0140,
-	0x60e3, 0x0000, 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008,
-	0x6886, 0x2001, 0x196d, 0x2004, 0x080c, 0x2643, 0x60e2, 0x2001,
-	0x180c, 0x200c, 0xc1b4, 0x2102, 0x00ee, 0x00de, 0x00ce, 0x003e,
-	0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036,
-	0x0046, 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, 0x080c,
-	0xce2e, 0x1904, 0x76d2, 0x7130, 0xd184, 0x1170, 0x080c, 0x3328,
-	0x0138, 0xc18d, 0x7132, 0x2011, 0x1848, 0x2214, 0xd2ac, 0x1120,
-	0x7030, 0xd08c, 0x0904, 0x76d2, 0x2011, 0x1848, 0x220c, 0xd1a4,
-	0x0538, 0x0016, 0x2019, 0x000e, 0x080c, 0xe101, 0x0156, 0x00b6,
-	0x20a9, 0x007f, 0x900e, 0x9186, 0x007e, 0x01a0, 0x9186, 0x0080,
-	0x0188, 0x080c, 0x652d, 0x1170, 0x2120, 0x9006, 0x0016, 0x2009,
-	0x000e, 0x080c, 0xe191, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c,
-	0x87b6, 0x001e, 0x8108, 0x1f04, 0x769b, 0x00be, 0x015e, 0x001e,
-	0xd1ac, 0x1148, 0x0016, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c,
-	0x316a, 0x001e, 0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e,
-	0x080c, 0x652d, 0x1110, 0x080c, 0x5f5b, 0x8108, 0x1f04, 0x76c8,
-	0x00be, 0x015e, 0x080c, 0x1ac8, 0x080c, 0xa781, 0x080c, 0xaa49,
-	0x080c, 0xa79d, 0x60e3, 0x0000, 0x080c, 0x5f41, 0x080c, 0x7315,
-	0x00ee, 0x00ce, 0x004e, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005,
-	0x2001, 0x197d, 0x2003, 0x0001, 0x0005, 0x2001, 0x197d, 0x2003,
-	0x0000, 0x0005, 0x2001, 0x197c, 0x2003, 0xaaaa, 0x0005, 0x2001,
-	0x197c, 0x2003, 0x0000, 0x0005, 0x2071, 0x18fa, 0x7003, 0x0000,
-	0x7007, 0x0000, 0x080c, 0x1054, 0x090c, 0x0d7d, 0xa8ab, 0xdcb0,
-	0x2900, 0x704e, 0x080c, 0x1054, 0x090c, 0x0d7d, 0xa8ab, 0xdcb0,
-	0x2900, 0x7052, 0xa867, 0x0000, 0xa86b, 0x0001, 0xa89f, 0x0000,
-	0x0005, 0x00e6, 0x2071, 0x0040, 0x6848, 0x9005, 0x1118, 0x9085,
-	0x0001, 0x04b0, 0x6840, 0x9005, 0x0150, 0x04a1, 0x6a50, 0x9200,
-	0x7002, 0x6854, 0x9101, 0x7006, 0x9006, 0x7012, 0x7016, 0x6850,
-	0x7002, 0x6854, 0x7006, 0x6858, 0x700a, 0x685c, 0x700e, 0x6840,
-	0x9005, 0x1110, 0x7012, 0x7016, 0x6848, 0x701a, 0x701c, 0x9085,
-	0x0040, 0x701e, 0x2001, 0x0019, 0x7036, 0x702b, 0x0001, 0x2001,
-	0x0004, 0x200c, 0x918c, 0xfff7, 0x918d, 0x8000, 0x2102, 0x00d6,
-	0x2069, 0x18fa, 0x6807, 0x0001, 0x00de, 0x080c, 0x7cdf, 0x9006,
-	0x00ee, 0x0005, 0x900e, 0x0156, 0x20a9, 0x0006, 0x8003, 0x818d,
-	0x1f04, 0x775e, 0x015e, 0x0005, 0x2079, 0x0040, 0x2071, 0x18fa,
-	0x7004, 0x0002, 0x7774, 0x7775, 0x77c0, 0x781b, 0x792b, 0x7772,
-	0x7772, 0x7955, 0x080c, 0x0d7d, 0x0005, 0x2079, 0x0040, 0x2001,
-	0x1dc0, 0x2003, 0x0000, 0x782c, 0x908c, 0x0780, 0x190c, 0x7dc1,
-	0xd0a4, 0x0570, 0x2001, 0x1dc0, 0x2004, 0x9082, 0x0080, 0x1640,
-	0x1d04, 0x7792, 0x2001, 0x1a04, 0x200c, 0x8109, 0x0508, 0x2091,
-	0x6000, 0x2102, 0x7824, 0x2048, 0x9006, 0xa802, 0xa806, 0xa864,
-	0x9084, 0x00ff, 0x908a, 0x0040, 0x0608, 0x00b8, 0x2001, 0x1800,
-	0x200c, 0x9186, 0x0003, 0x1160, 0x7104, 0x9186, 0x0004, 0x0140,
-	0x9186, 0x0007, 0x0128, 0x9186, 0x0003, 0x1968, 0x080c, 0x781b,
-	0x782c, 0xd09c, 0x090c, 0x7cdf, 0x0005, 0x9082, 0x005a, 0x1218,
-	0x2100, 0x003b, 0x0c18, 0x080c, 0x7851, 0x0c90, 0x00e3, 0x08f0,
-	0x0005, 0x7851, 0x7851, 0x7851, 0x7851, 0x7851, 0x7851, 0x7851,
-	0x7851, 0x7873, 0x7851, 0x7851, 0x7851, 0x7851, 0x7851, 0x7851,
-	0x7851, 0x7851, 0x7851, 0x7851, 0x7851, 0x7851, 0x7851, 0x7851,
-	0x7851, 0x7851, 0x7851, 0x7851, 0x7851, 0x785d, 0x7851, 0x7a46,
-	0x7851, 0x7851, 0x7851, 0x7851, 0x7851, 0x785d, 0x7a87, 0x7ac8,
-	0x7b0f, 0x7b23, 0x7851, 0x7851, 0x7873, 0x785d, 0x7887, 0x7851,
-	0x78ff, 0x7bce, 0x7be9, 0x7851, 0x7873, 0x7851, 0x7887, 0x7851,
-	0x7851, 0x78f5, 0x7be9, 0x7851, 0x7851, 0x7851, 0x7851, 0x7851,
-	0x7851, 0x7851, 0x7851, 0x7851, 0x789b, 0x7851, 0x7851, 0x7851,
-	0x7851, 0x7851, 0x7851, 0x7851, 0x7851, 0x7851, 0x7d65, 0x7851,
-	0x7d0f, 0x7851, 0x7d0f, 0x7851, 0x78b0, 0x7851, 0x7851, 0x7851,
-	0x7851, 0x7851, 0x7851, 0x2079, 0x0040, 0x7004, 0x9086, 0x0003,
-	0x1198, 0x782c, 0x080c, 0x7d08, 0xd0a4, 0x0170, 0x7824, 0x2048,
-	0x9006, 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a, 0x001a,
-	0x1210, 0x002b, 0x0c50, 0x00e9, 0x080c, 0x7cdf, 0x0005, 0x7851,
-	0x785d, 0x7a32, 0x7851, 0x785d, 0x7851, 0x785d, 0x785d, 0x7851,
-	0x785d, 0x7a32, 0x785d, 0x785d, 0x785d, 0x785d, 0x785d, 0x7851,
-	0x785d, 0x7a32, 0x7851, 0x7851, 0x785d, 0x7851, 0x7851, 0x7851,
-	0x785d, 0x00e6, 0x2071, 0x18fa, 0x2009, 0x0400, 0x0071, 0x00ee,
-	0x0005, 0x2009, 0x1000, 0x0049, 0x0005, 0x2009, 0x2000, 0x0029,
-	0x0005, 0x2009, 0x0800, 0x0009, 0x0005, 0x7007, 0x0001, 0xa868,
-	0x9084, 0x00ff, 0x9105, 0xa86a, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x6c7f, 0x012e, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0d08,
-	0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x79d4, 0x7007, 0x0003,
-	0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x79d4, 0x0005, 0xa864,
-	0x8007, 0x9084, 0x00ff, 0x0968, 0x8001, 0x1120, 0x7007, 0x0001,
-	0x0804, 0x79ef, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a,
-	0x704b, 0x79ef, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0904,
-	0x7859, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x7a0b, 0x7007,
-	0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7a0b, 0x0005,
-	0xa864, 0x8007, 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x7859,
-	0x7007, 0x0001, 0x2009, 0x1834, 0x210c, 0x81ff, 0x11a8, 0xa868,
-	0x9084, 0x00ff, 0xa86a, 0xa883, 0x0000, 0x080c, 0x61d1, 0x1108,
-	0x0005, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, 0xa87a, 0xa982,
-	0x080c, 0x6c7f, 0x012e, 0x0ca0, 0xa994, 0x9186, 0x0071, 0x0d38,
-	0x9186, 0x0064, 0x0d20, 0x9186, 0x007c, 0x0d08, 0x9186, 0x0028,
-	0x09f0, 0x9186, 0x0038, 0x09d8, 0x9186, 0x0078, 0x09c0, 0x9186,
-	0x005f, 0x09a8, 0x9186, 0x0056, 0x0990, 0xa897, 0x4005, 0xa89b,
-	0x0001, 0x2001, 0x0030, 0x900e, 0x08a0, 0xa87c, 0x9084, 0x00c0,
-	0x9086, 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, 0x7c00, 0x2900,
-	0x7016, 0x701a, 0x20a9, 0x0004, 0xa860, 0x20e0, 0xa85c, 0x9080,
-	0x0030, 0x2098, 0x7050, 0x2040, 0xa060, 0x20e8, 0xa05c, 0x9080,
-	0x0023, 0x20a0, 0x4003, 0xa888, 0x7012, 0x9082, 0x0401, 0x1a04,
-	0x7861, 0xaab4, 0x928a, 0x0002, 0x1a04, 0x7861, 0x82ff, 0x1138,
-	0xa8b8, 0xa9bc, 0x9105, 0x0118, 0x2001, 0x7992, 0x0018, 0x9280,
-	0x7988, 0x2005, 0x7056, 0x7010, 0x9015, 0x0904, 0x7973, 0x080c,
-	0x1054, 0x1118, 0x7007, 0x0004, 0x0005, 0x2900, 0x7022, 0x7054,
-	0x2060, 0xe000, 0xa866, 0x7050, 0x2040, 0xa95c, 0xe004, 0x9100,
-	0xa076, 0xa860, 0xa072, 0xe008, 0x920a, 0x1210, 0x900e, 0x2200,
-	0x7112, 0xe20c, 0x8003, 0x800b, 0x9296, 0x0004, 0x0108, 0x9108,
-	0xa17a, 0x810b, 0xa17e, 0x080c, 0x111b, 0xa06c, 0x908e, 0x0100,
-	0x0170, 0x9086, 0x0200, 0x0118, 0x7007, 0x0007, 0x0005, 0x7020,
-	0x2048, 0x080c, 0x106d, 0x7014, 0x2048, 0x0804, 0x7861, 0x7020,
-	0x2048, 0x7018, 0xa802, 0xa807, 0x0000, 0x2908, 0x2048, 0xa906,
-	0x711a, 0x0804, 0x792b, 0x7014, 0x2048, 0x7007, 0x0001, 0xa8b4,
-	0x9005, 0x1128, 0xa8b8, 0xa9bc, 0x9105, 0x0108, 0x00b9, 0xa864,
-	0x9084, 0x00ff, 0x9086, 0x001e, 0x0904, 0x7c00, 0x0804, 0x79d4,
-	0x798a, 0x798e, 0x0002, 0x001d, 0x0007, 0x0004, 0x000a, 0x001b,
-	0x0005, 0x0006, 0x000a, 0x001d, 0x0005, 0x0004, 0x0076, 0x0066,
-	0xafb8, 0xaebc, 0xa804, 0x2050, 0xb0c0, 0xb0e2, 0xb0bc, 0xb0de,
-	0xb0b8, 0xb0d2, 0xb0b4, 0xb0ce, 0xb6da, 0xb7d6, 0xb0b0, 0xb0ca,
-	0xb0ac, 0xb0c6, 0xb0a8, 0xb0ba, 0xb0a4, 0xb0b6, 0xb6c2, 0xb7be,
-	0xb0a0, 0xb0b2, 0xb09c, 0xb0ae, 0xb098, 0xb0a2, 0xb094, 0xb09e,
-	0xb6aa, 0xb7a6, 0xb090, 0xb09a, 0xb08c, 0xb096, 0xb088, 0xb08a,
-	0xb084, 0xb086, 0xb692, 0xb78e, 0xb080, 0xb082, 0xb07c, 0xb07e,
-	0xb078, 0xb072, 0xb074, 0xb06e, 0xb67a, 0xb776, 0xb004, 0x9055,
-	0x1958, 0x006e, 0x007e, 0x0005, 0x2009, 0x1834, 0x210c, 0x81ff,
-	0x1178, 0x080c, 0x5fd3, 0x1108, 0x0005, 0x080c, 0x6ebf, 0x0126,
-	0x2091, 0x8000, 0x080c, 0xca1a, 0x080c, 0x6c7f, 0x012e, 0x0ca0,
-	0x080c, 0xce2e, 0x1d70, 0x2001, 0x0028, 0x900e, 0x0c70, 0x2009,
-	0x1834, 0x210c, 0x81ff, 0x1188, 0xa888, 0x9005, 0x0188, 0xa883,
-	0x0000, 0x080c, 0x6061, 0x1108, 0x0005, 0xa87a, 0x0126, 0x2091,
-	0x8000, 0x080c, 0x6c7f, 0x012e, 0x0cb8, 0x2001, 0x0028, 0x0ca8,
-	0x2001, 0x0000, 0x0c90, 0x2009, 0x1834, 0x210c, 0x81ff, 0x11d8,
-	0xa888, 0x9005, 0x01e0, 0xa883, 0x0000, 0xa87c, 0xd0f4, 0x0120,
-	0x080c, 0x6133, 0x1138, 0x0005, 0x9006, 0xa87a, 0x080c, 0x60ae,
-	0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0xa87a, 0xa982, 0x080c,
-	0x6c7f, 0x012e, 0x0cb0, 0x2001, 0x0028, 0x900e, 0x0c98, 0x2001,
-	0x0000, 0x0c80, 0x7018, 0xa802, 0x2908, 0x2048, 0xa906, 0x711a,
-	0x7010, 0x8001, 0x7012, 0x0118, 0x7007, 0x0003, 0x0030, 0x7014,
-	0x2048, 0x7007, 0x0001, 0x7048, 0x080f, 0x0005, 0x00b6, 0x7007,
-	0x0001, 0xa974, 0xa878, 0x9084, 0x00ff, 0x9096, 0x0004, 0x0540,
-	0x20a9, 0x0001, 0x9096, 0x0001, 0x0190, 0x900e, 0x20a9, 0x0800,
-	0x9096, 0x0002, 0x0160, 0x9005, 0x11d8, 0xa974, 0x080c, 0x652d,
-	0x11b8, 0x0066, 0xae80, 0x080c, 0x663d, 0x006e, 0x0088, 0x0046,
-	0x2011, 0x180c, 0x2224, 0xc484, 0x2412, 0x004e, 0x00c6, 0x080c,
-	0x652d, 0x1110, 0x080c, 0x680c, 0x8108, 0x1f04, 0x7a6f, 0x00ce,
-	0xa87c, 0xd084, 0x1120, 0x080c, 0x106d, 0x00be, 0x0005, 0x0126,
-	0x2091, 0x8000, 0x080c, 0x6c7f, 0x012e, 0x00be, 0x0005, 0x0126,
-	0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x6966, 0x0580, 0x2061,
-	0x1a6d, 0x6100, 0xd184, 0x0178, 0xa888, 0x9084, 0x00ff, 0x1550,
-	0x6000, 0xd084, 0x0520, 0x6004, 0x9005, 0x1538, 0x6003, 0x0000,
-	0x600b, 0x0000, 0x00c8, 0x2011, 0x0001, 0xa890, 0x9005, 0x1110,
-	0x2001, 0x001e, 0x8000, 0x6016, 0xa888, 0x9084, 0x00ff, 0x0178,
-	0x6006, 0xa888, 0x8007, 0x9084, 0x00ff, 0x0148, 0x600a, 0xa888,
-	0x8000, 0x1108, 0xc28d, 0x6202, 0x012e, 0x0804, 0x7cc9, 0x012e,
-	0x0804, 0x7cc3, 0x012e, 0x0804, 0x7cbd, 0x012e, 0x0804, 0x7cc0,
-	0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x6966, 0x05e0,
-	0x2061, 0x1a6d, 0x6000, 0xd084, 0x05b8, 0x6204, 0x6308, 0xd08c,
-	0x1530, 0xac78, 0x9484, 0x0003, 0x0170, 0xa988, 0x918c, 0x00ff,
-	0x8001, 0x1120, 0x2100, 0x9210, 0x0620, 0x0028, 0x8001, 0x1508,
-	0x2100, 0x9212, 0x02f0, 0x9484, 0x000c, 0x0188, 0xa988, 0x810f,
-	0x918c, 0x00ff, 0x9082, 0x0004, 0x1120, 0x2100, 0x9318, 0x0288,
-	0x0030, 0x9082, 0x0004, 0x1168, 0x2100, 0x931a, 0x0250, 0xa890,
-	0x9005, 0x0110, 0x8000, 0x6016, 0x6206, 0x630a, 0x012e, 0x0804,
-	0x7cc9, 0x012e, 0x0804, 0x7cc6, 0x012e, 0x0804, 0x7cc3, 0x0126,
-	0x2091, 0x8000, 0x7007, 0x0001, 0x2061, 0x1a6d, 0x6300, 0xd38c,
-	0x1120, 0x6308, 0x8318, 0x0220, 0x630a, 0x012e, 0x0804, 0x7cd7,
-	0x012e, 0x0804, 0x7cc6, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000,
-	0x7007, 0x0001, 0xa87c, 0xd0ac, 0x0148, 0x00c6, 0x2061, 0x1a6d,
-	0x6000, 0x9084, 0xfcff, 0x6002, 0x00ce, 0x0440, 0xa888, 0x9005,
-	0x05d8, 0xa88c, 0x9065, 0x0598, 0x2001, 0x1834, 0x2004, 0x9005,
-	0x0118, 0x080c, 0xab13, 0x0068, 0x6017, 0xf400, 0x6063, 0x0000,
-	0xa97c, 0xd1a4, 0x0110, 0xa980, 0x6162, 0x2009, 0x0041, 0x080c,
-	0xab77, 0xa988, 0x918c, 0xff00, 0x9186, 0x2000, 0x1138, 0x0026,
-	0x900e, 0x2011, 0xfdff, 0x080c, 0x87b6, 0x002e, 0xa87c, 0xd0c4,
-	0x0148, 0x2061, 0x1a6d, 0x6000, 0xd08c, 0x1120, 0x6008, 0x8000,
-	0x0208, 0x600a, 0x00ce, 0x012e, 0x00be, 0x0804, 0x7cc9, 0x00ce,
-	0x012e, 0x00be, 0x0804, 0x7cc3, 0xa984, 0x9186, 0x002e, 0x0d30,
-	0x9186, 0x002d, 0x0d18, 0x9186, 0x0045, 0x0510, 0x9186, 0x002a,
-	0x1130, 0x2001, 0x180c, 0x200c, 0xc194, 0x2102, 0x08b8, 0x9186,
-	0x0020, 0x0158, 0x9186, 0x0029, 0x1d10, 0xa974, 0x080c, 0x652d,
-	0x1968, 0xb800, 0xc0e4, 0xb802, 0x0848, 0xa88c, 0x9065, 0x09b8,
-	0x6007, 0x0024, 0x2001, 0x1984, 0x2004, 0x601a, 0x0804, 0x7b5e,
-	0xa88c, 0x9065, 0x0960, 0x00e6, 0xa890, 0x9075, 0x2001, 0x1834,
-	0x2004, 0x9005, 0x0150, 0x080c, 0xab13, 0x8eff, 0x0118, 0x2e60,
-	0x080c, 0xab13, 0x00ee, 0x0804, 0x7b5e, 0x6024, 0xc0dc, 0xc0d5,
-	0x6026, 0x2e60, 0x6007, 0x003a, 0xa8a0, 0x9005, 0x0130, 0x6007,
-	0x003b, 0xa8a4, 0x602e, 0xa8a8, 0x6016, 0x6003, 0x0001, 0x2009,
-	0x8020, 0x080c, 0x90e8, 0x00ee, 0x0804, 0x7b5e, 0x2061, 0x1a6d,
-	0x6000, 0xd084, 0x0190, 0xd08c, 0x1904, 0x7cd7, 0x0126, 0x2091,
-	0x8000, 0x6204, 0x8210, 0x0220, 0x6206, 0x012e, 0x0804, 0x7cd7,
-	0x012e, 0xa883, 0x0016, 0x0804, 0x7cd0, 0xa883, 0x0007, 0x0804,
-	0x7cd0, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0130, 0x8001, 0x1138,
-	0x7007, 0x0001, 0x0069, 0x0005, 0x080c, 0x7859, 0x0040, 0x7007,
-	0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7c00, 0x0005,
-	0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x903e, 0x2061, 0x1800,
-	0x61d0, 0x81ff, 0x1904, 0x7c82, 0x6130, 0xd194, 0x1904, 0x7cac,
-	0xa878, 0x2070, 0x9e82, 0x1ddc, 0x0a04, 0x7c76, 0x6068, 0x9e02,
-	0x1a04, 0x7c76, 0x7120, 0x9186, 0x0006, 0x1904, 0x7c68, 0x7010,
-	0x905d, 0x0904, 0x7c82, 0xb800, 0xd0e4, 0x1904, 0x7ca6, 0x2061,
-	0x1a6d, 0x6100, 0x9184, 0x0301, 0x9086, 0x0001, 0x15a0, 0x7024,
-	0xd0dc, 0x1904, 0x7caf, 0xa883, 0x0000, 0xa803, 0x0000, 0x2908,
-	0x7014, 0x9005, 0x1198, 0x7116, 0xa87c, 0xd0f4, 0x1904, 0x7cb2,
-	0x080c, 0x55fc, 0xd09c, 0x1118, 0xa87c, 0xc0cc, 0xa87e, 0x2e60,
-	0x080c, 0x86a9, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2048, 0xa800,
-	0x9005, 0x1de0, 0xa902, 0x2148, 0xa87c, 0xd0f4, 0x1904, 0x7cb2,
-	0x012e, 0x00ee, 0x00be, 0x0005, 0x012e, 0x00ee, 0xa883, 0x0006,
-	0x00be, 0x0804, 0x7cd0, 0xd184, 0x0db8, 0xd1c4, 0x1190, 0x00a0,
-	0xa974, 0x080c, 0x652d, 0x15d0, 0xb800, 0xd0e4, 0x15b8, 0x7120,
-	0x9186, 0x0007, 0x1118, 0xa883, 0x0002, 0x0490, 0xa883, 0x0008,
-	0x0478, 0xa883, 0x000e, 0x0460, 0xa883, 0x0017, 0x0448, 0xa883,
-	0x0035, 0x0430, 0x080c, 0x5600, 0xd0fc, 0x01e8, 0xa878, 0x2070,
-	0x9e82, 0x1ddc, 0x02c0, 0x6068, 0x9e02, 0x12a8, 0x7120, 0x9186,
-	0x0006, 0x1188, 0x7010, 0x905d, 0x0170, 0xb800, 0xd0bc, 0x0158,
-	0x2039, 0x0001, 0x7000, 0x9086, 0x0007, 0x1904, 0x7c0c, 0x7003,
-	0x0002, 0x0804, 0x7c0c, 0xa883, 0x0028, 0x0010, 0xa883, 0x0029,
-	0x012e, 0x00ee, 0x00be, 0x0420, 0xa883, 0x002a, 0x0cc8, 0xa883,
-	0x0045, 0x0cb0, 0x2e60, 0x2019, 0x0002, 0x601b, 0x0014, 0x080c,
-	0xdce5, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2009, 0x003e, 0x0058,
-	0x2009, 0x0004, 0x0040, 0x2009, 0x0006, 0x0028, 0x2009, 0x0016,
-	0x0010, 0x2009, 0x0001, 0xa884, 0x9084, 0xff00, 0x9105, 0xa886,
-	0x0126, 0x2091, 0x8000, 0x080c, 0x6c7f, 0x012e, 0x0005, 0x080c,
-	0x106d, 0x0005, 0x00d6, 0x080c, 0x86a0, 0x00de, 0x0005, 0x00d6,
-	0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x0040, 0x702c, 0xd084,
-	0x01d8, 0x908c, 0x0780, 0x190c, 0x7dc1, 0xd09c, 0x11a8, 0x2071,
-	0x1800, 0x70c0, 0x90ea, 0x0020, 0x0278, 0x8001, 0x70c2, 0x702c,
-	0x2048, 0xa800, 0x702e, 0x9006, 0xa802, 0xa806, 0x2071, 0x0040,
-	0x2900, 0x7022, 0x702c, 0x0c28, 0x012e, 0x00ee, 0x00de, 0x0005,
-	0x0006, 0x9084, 0x0780, 0x190c, 0x7dc1, 0x000e, 0x0005, 0xa898,
-	0x9084, 0x0003, 0x05a8, 0x080c, 0xaa82, 0x05d8, 0x2900, 0x6016,
-	0xa864, 0x9084, 0x00ff, 0x9086, 0x0035, 0x1138, 0x6028, 0xc0fd,
-	0x602a, 0x2001, 0x196b, 0x2004, 0x0098, 0xa8a0, 0x9084, 0x00ff,
-	0xa99c, 0x918c, 0xff00, 0x9105, 0xa99c, 0x918c, 0x00ff, 0x080c,
-	0x25cf, 0x1540, 0x00b6, 0x080c, 0x652d, 0x2b00, 0x00be, 0x1510,
-	0x6012, 0x6023, 0x0001, 0x2009, 0x0040, 0xa864, 0x9084, 0x00ff,
-	0x9086, 0x0035, 0x0110, 0x2009, 0x0041, 0x080c, 0xab77, 0x0005,
-	0xa87b, 0x0101, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c7f, 0x012e,
-	0x0005, 0xa87b, 0x002c, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c7f,
-	0x012e, 0x0005, 0xa87b, 0x0028, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x6c7f, 0x012e, 0x080c, 0xaad8, 0x0005, 0x00d6, 0x00c6, 0x0036,
-	0x0026, 0x0016, 0x00b6, 0x7007, 0x0001, 0xaa74, 0x9282, 0x0004,
-	0x1a04, 0x7db2, 0xa97c, 0x9188, 0x1000, 0x2104, 0x905d, 0xb804,
-	0xd284, 0x0140, 0x05e8, 0x8007, 0x9084, 0x00ff, 0x9084, 0x0006,
-	0x1108, 0x04b0, 0x2b10, 0x080c, 0xaa82, 0x1118, 0x080c, 0xab4a,
-	0x05a8, 0x6212, 0xa874, 0x0002, 0x7d90, 0x7d95, 0x7d98, 0x7d9e,
-	0x2019, 0x0002, 0x080c, 0xe101, 0x0060, 0x080c, 0xe091, 0x0048,
-	0x2019, 0x0002, 0xa980, 0x080c, 0xe0b0, 0x0018, 0xa980, 0x080c,
-	0xe091, 0x080c, 0xaad8, 0xa887, 0x0000, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x6c7f, 0x012e, 0x00be, 0x001e, 0x002e, 0x003e, 0x00ce,
-	0x00de, 0x0005, 0xa887, 0x0006, 0x0c80, 0xa887, 0x0002, 0x0c68,
-	0xa887, 0x0005, 0x0c50, 0xa887, 0x0004, 0x0c38, 0xa887, 0x0007,
-	0x0c20, 0x2091, 0x8000, 0x0e04, 0x7dc3, 0x0006, 0x0016, 0x2001,
-	0x8003, 0x0006, 0x0804, 0x0d86, 0x0005, 0x00f6, 0x2079, 0x0300,
-	0x2001, 0x0200, 0x200c, 0xc1e5, 0xc1dc, 0x2102, 0x2009, 0x0218,
-	0x210c, 0xd1ec, 0x1120, 0x080c, 0x15ff, 0x00fe, 0x0005, 0x2001,
-	0x020d, 0x2003, 0x0020, 0x781f, 0x0300, 0x00fe, 0x0005, 0x781c,
-	0xd08c, 0x0904, 0x7e2f, 0x68c0, 0x90aa, 0x0005, 0x0a04, 0x8417,
-	0x7d44, 0x7c40, 0xd59c, 0x190c, 0x0d7d, 0x9584, 0x00f6, 0x1508,
-	0x9484, 0x7000, 0x0138, 0x908a, 0x2000, 0x1258, 0x9584, 0x0700,
-	0x8007, 0x0470, 0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x0db0,
-	0x00b0, 0x9484, 0x0fff, 0x1130, 0x7000, 0x9084, 0xff00, 0x9086,
-	0x8100, 0x11c0, 0x080c, 0xe573, 0x080c, 0x830e, 0x7817, 0x0140,
-	0x00a8, 0x9584, 0x0076, 0x1118, 0x080c, 0x836a, 0x19c8, 0xd5a4,
-	0x0148, 0x0046, 0x0056, 0x080c, 0x7e7f, 0x080c, 0x20e9, 0x005e,
-	0x004e, 0x0020, 0x080c, 0xe573, 0x7817, 0x0140, 0x0489, 0x0005,
-	0x0002, 0x7e3c, 0x8130, 0x7e39, 0x7e39, 0x7e39, 0x7e39, 0x7e39,
-	0x7e39, 0x7817, 0x0140, 0x0005, 0x7000, 0x908c, 0xff00, 0x9194,
-	0xf000, 0x810f, 0x9484, 0x0fff, 0x6892, 0x9286, 0x2000, 0x1150,
-	0x6800, 0x9086, 0x0001, 0x1118, 0x080c, 0x5653, 0x0070, 0x080c,
-	0x7e9f, 0x0058, 0x9286, 0x3000, 0x1118, 0x080c, 0x806d, 0x0028,
-	0x9286, 0x8000, 0x1110, 0x080c, 0x8244, 0x7817, 0x0140, 0x0005,
-	0x2001, 0x1810, 0x2004, 0xd08c, 0x0178, 0x2001, 0x1800, 0x2004,
-	0x9086, 0x0003, 0x1148, 0x0026, 0x0036, 0x2011, 0x8048, 0x2518,
-	0x080c, 0x4a38, 0x003e, 0x002e, 0x0005, 0x0036, 0x0046, 0x0056,
-	0x00f6, 0x2079, 0x0200, 0x2019, 0xfffe, 0x7c30, 0x0050, 0x0036,
-	0x0046, 0x0056, 0x00f6, 0x2079, 0x0200, 0x7d44, 0x7c40, 0x2019,
-	0xffff, 0x2001, 0x1810, 0x2004, 0xd08c, 0x0160, 0x2001, 0x1800,
-	0x2004, 0x9086, 0x0003, 0x1130, 0x0026, 0x2011, 0x8048, 0x080c,
-	0x4a38, 0x002e, 0x00fe, 0x005e, 0x004e, 0x003e, 0x0005, 0x00b6,
-	0x00c6, 0x7010, 0x9084, 0xff00, 0x8007, 0x9096, 0x0001, 0x0120,
-	0x9096, 0x0023, 0x1904, 0x803e, 0x9186, 0x0023, 0x15c0, 0x080c,
-	0x82d9, 0x0904, 0x803e, 0x6120, 0x9186, 0x0001, 0x0150, 0x9186,
-	0x0004, 0x0138, 0x9186, 0x0008, 0x0120, 0x9186, 0x000a, 0x1904,
-	0x803e, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1130, 0x2009,
-	0x0015, 0x080c, 0xab77, 0x0804, 0x803e, 0x908e, 0x0214, 0x0118,
-	0x908e, 0x0210, 0x1130, 0x2009, 0x0015, 0x080c, 0xab77, 0x0804,
-	0x803e, 0x908e, 0x0100, 0x1904, 0x803e, 0x7034, 0x9005, 0x1904,
-	0x803e, 0x2009, 0x0016, 0x080c, 0xab77, 0x0804, 0x803e, 0x9186,
-	0x0022, 0x1904, 0x803e, 0x7030, 0x908e, 0x0300, 0x1580, 0x68dc,
-	0xd0a4, 0x0528, 0xc0b5, 0x68de, 0x7100, 0x918c, 0x00ff, 0x697e,
-	0x7004, 0x6882, 0x00f6, 0x2079, 0x0100, 0x79e6, 0x78ea, 0x0006,
-	0x9084, 0x00ff, 0x0016, 0x2008, 0x080c, 0x2618, 0x7932, 0x7936,
-	0x001e, 0x000e, 0x00fe, 0x080c, 0x25cf, 0x695e, 0x703c, 0x00e6,
-	0x2071, 0x0140, 0x7086, 0x2071, 0x1800, 0x70b6, 0x00ee, 0x7034,
-	0x9005, 0x1904, 0x803e, 0x2009, 0x0017, 0x0804, 0x800b, 0x908e,
-	0x0400, 0x1190, 0x7034, 0x9005, 0x1904, 0x803e, 0x080c, 0x73e4,
-	0x0120, 0x2009, 0x001d, 0x0804, 0x800b, 0x68dc, 0xc0a5, 0x68de,
-	0x2009, 0x0030, 0x0804, 0x800b, 0x908e, 0x0500, 0x1140, 0x7034,
-	0x9005, 0x1904, 0x803e, 0x2009, 0x0018, 0x0804, 0x800b, 0x908e,
-	0x2010, 0x1120, 0x2009, 0x0019, 0x0804, 0x800b, 0x908e, 0x2110,
-	0x1120, 0x2009, 0x001a, 0x0804, 0x800b, 0x908e, 0x5200, 0x1140,
-	0x7034, 0x9005, 0x1904, 0x803e, 0x2009, 0x001b, 0x0804, 0x800b,
-	0x908e, 0x5000, 0x1140, 0x7034, 0x9005, 0x1904, 0x803e, 0x2009,
-	0x001c, 0x0804, 0x800b, 0x908e, 0x1300, 0x1120, 0x2009, 0x0034,
-	0x0804, 0x800b, 0x908e, 0x1200, 0x1140, 0x7034, 0x9005, 0x1904,
-	0x803e, 0x2009, 0x0024, 0x0804, 0x800b, 0x908c, 0xff00, 0x918e,
-	0x2400, 0x1170, 0x2009, 0x002d, 0x2001, 0x1810, 0x2004, 0xd09c,
-	0x0904, 0x800b, 0x080c, 0xd522, 0x1904, 0x803e, 0x0804, 0x8009,
-	0x908c, 0xff00, 0x918e, 0x5300, 0x1120, 0x2009, 0x002a, 0x0804,
-	0x800b, 0x908e, 0x0f00, 0x1120, 0x2009, 0x0020, 0x0804, 0x800b,
-	0x908e, 0x5300, 0x1108, 0x0448, 0x908e, 0x6104, 0x1530, 0x2029,
-	0x0205, 0x2011, 0x026d, 0x8208, 0x2204, 0x9082, 0x0004, 0x8004,
-	0x8004, 0x20a8, 0x2011, 0x8015, 0x211c, 0x8108, 0x0046, 0x2124,
-	0x080c, 0x4a38, 0x004e, 0x8108, 0x0f04, 0x7fbf, 0x9186, 0x0280,
-	0x1d88, 0x2504, 0x8000, 0x202a, 0x2009, 0x0260, 0x0c58, 0x202b,
-	0x0000, 0x2009, 0x0023, 0x0804, 0x800b, 0x908e, 0x6000, 0x1120,
-	0x2009, 0x003f, 0x0804, 0x800b, 0x908e, 0x5400, 0x1138, 0x080c,
-	0x83c7, 0x1904, 0x803e, 0x2009, 0x0046, 0x04a8, 0x908e, 0x5500,
-	0x1148, 0x080c, 0x83ef, 0x1118, 0x2009, 0x0041, 0x0460, 0x2009,
-	0x0042, 0x0448, 0x908e, 0x7800, 0x1118, 0x2009, 0x0045, 0x0418,
-	0x908e, 0x1000, 0x1118, 0x2009, 0x004e, 0x00e8, 0x908e, 0x6300,
-	0x1118, 0x2009, 0x004a, 0x00b8, 0x908c, 0xff00, 0x918e, 0x5600,
-	0x1118, 0x2009, 0x004f, 0x0078, 0x908c, 0xff00, 0x918e, 0x5700,
-	0x1118, 0x2009, 0x0050, 0x0038, 0x2009, 0x001d, 0x6838, 0xd0d4,
-	0x0110, 0x2009, 0x004c, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211,
-	0x220c, 0x080c, 0x25cf, 0x1568, 0x080c, 0x64cc, 0x1550, 0xbe12,
-	0xbd16, 0x001e, 0x0016, 0xb884, 0x9005, 0x1168, 0x9186, 0x0046,
-	0x1150, 0x687c, 0x9606, 0x1138, 0x6880, 0x9506, 0x9084, 0xff00,
-	0x1110, 0x001e, 0x0098, 0x080c, 0xaa82, 0x01a8, 0x2b08, 0x6112,
-	0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x9186, 0x004c, 0x1110,
-	0x6023, 0x000a, 0x0016, 0x001e, 0x080c, 0xab77, 0x00ce, 0x00be,
-	0x0005, 0x001e, 0x0cd8, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120,
-	0x2011, 0x8049, 0x080c, 0x4a38, 0x080c, 0xab4a, 0x0d90, 0x2b08,
-	0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x0016, 0x9186,
-	0x0017, 0x0118, 0x9186, 0x0030, 0x1128, 0x6007, 0x0009, 0x6017,
-	0x2900, 0x0020, 0x6007, 0x0051, 0x6017, 0x0000, 0x602f, 0x0009,
-	0x6003, 0x0001, 0x080c, 0x90ef, 0x08a0, 0x080c, 0x32f2, 0x1140,
-	0x7010, 0x9084, 0xff00, 0x8007, 0x908e, 0x0008, 0x1108, 0x0009,
-	0x0005, 0x00b6, 0x00c6, 0x0046, 0x7000, 0x908c, 0xff00, 0x810f,
-	0x9186, 0x0033, 0x11e8, 0x080c, 0x82d9, 0x0904, 0x80c8, 0x7124,
-	0x610a, 0x7030, 0x908e, 0x0200, 0x1140, 0x7034, 0x9005, 0x15c0,
-	0x2009, 0x0015, 0x080c, 0xab77, 0x0498, 0x908e, 0x0100, 0x1580,
-	0x7034, 0x9005, 0x1568, 0x2009, 0x0016, 0x080c, 0xab77, 0x0440,
-	0x9186, 0x0032, 0x1528, 0x7030, 0x908e, 0x1400, 0x1508, 0x2009,
-	0x0038, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c,
-	0x25cf, 0x11a8, 0x080c, 0x64cc, 0x1190, 0xbe12, 0xbd16, 0x080c,
-	0xaa82, 0x0168, 0x2b08, 0x6112, 0x080c, 0xcbb0, 0x6023, 0x0004,
-	0x7120, 0x610a, 0x001e, 0x080c, 0xab77, 0x0010, 0x00ce, 0x001e,
-	0x004e, 0x00ce, 0x00be, 0x0005, 0x00b6, 0x0046, 0x00e6, 0x00d6,
-	0x2028, 0x2130, 0x9696, 0x00ff, 0x11b8, 0x9592, 0xfffc, 0x02a0,
-	0x9596, 0xfffd, 0x1120, 0x2009, 0x007f, 0x0804, 0x812a, 0x9596,
-	0xfffe, 0x1120, 0x2009, 0x007e, 0x0804, 0x812a, 0x9596, 0xfffc,
-	0x1118, 0x2009, 0x0080, 0x04f0, 0x2011, 0x0000, 0x2019, 0x1837,
-	0x231c, 0xd3ac, 0x0130, 0x9026, 0x20a9, 0x0800, 0x2071, 0x1000,
-	0x0030, 0x2021, 0x0081, 0x20a9, 0x077f, 0x2071, 0x1081, 0x2e1c,
-	0x93dd, 0x0000, 0x1140, 0x82ff, 0x11d0, 0x9496, 0x00ff, 0x01b8,
-	0x2410, 0xc2fd, 0x00a0, 0xbf10, 0x2600, 0x9706, 0xb814, 0x1120,
-	0x9546, 0x1110, 0x2408, 0x00b0, 0x9745, 0x1148, 0x94c6, 0x007e,
-	0x0130, 0x94c6, 0x007f, 0x0118, 0x94c6, 0x0080, 0x1d20, 0x8420,
-	0x8e70, 0x1f04, 0x80ff, 0x82ff, 0x1118, 0x9085, 0x0001, 0x0018,
-	0xc2fc, 0x2208, 0x9006, 0x00de, 0x00ee, 0x004e, 0x00be, 0x0005,
-	0x7000, 0x908c, 0xff00, 0x810f, 0x9184, 0x000f, 0x0002, 0x8147,
-	0x8147, 0x8147, 0x82eb, 0x8147, 0x814a, 0x816f, 0x81f8, 0x8147,
-	0x8147, 0x8147, 0x8147, 0x8147, 0x8147, 0x8147, 0x8147, 0x7817,
-	0x0140, 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7120, 0x2160,
-	0x9c8c, 0x0003, 0x11c0, 0x9c8a, 0x1ddc, 0x02a8, 0x6868, 0x9c02,
-	0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106,
-	0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124, 0x610a, 0x2009,
-	0x0046, 0x080c, 0xab77, 0x7817, 0x0140, 0x00be, 0x0005, 0x00b6,
-	0x00c6, 0x9484, 0x0fff, 0x0904, 0x81d4, 0x7110, 0xd1bc, 0x1904,
-	0x81d4, 0x7108, 0x700c, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094,
-	0xff00, 0x15c8, 0x81ff, 0x15b8, 0x9080, 0x3334, 0x200d, 0x918c,
-	0xff00, 0x810f, 0x2001, 0x0080, 0x9106, 0x0904, 0x81d4, 0x9182,
-	0x0801, 0x1a04, 0x81d4, 0x9190, 0x1000, 0x2204, 0x905d, 0x05e0,
-	0xbe12, 0xbd16, 0xb800, 0xd0ec, 0x15b8, 0xba04, 0x9294, 0xff00,
-	0x9286, 0x0600, 0x1190, 0x080c, 0xaa82, 0x0598, 0x2b08, 0x7028,
-	0x6052, 0x702c, 0x604e, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a,
-	0x7130, 0x615e, 0x080c, 0xd784, 0x00f8, 0x080c, 0x696a, 0x1138,
-	0xb807, 0x0606, 0x0c40, 0x190c, 0x80cc, 0x11b0, 0x0880, 0x080c,
-	0xaa82, 0x2b08, 0x0188, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a,
-	0x9286, 0x0400, 0x1118, 0x6007, 0x0005, 0x0010, 0x6007, 0x0001,
-	0x6003, 0x0001, 0x080c, 0x90ef, 0x7817, 0x0140, 0x00ce, 0x00be,
-	0x0005, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049,
-	0x080c, 0x4a38, 0x080c, 0xab4a, 0x0d78, 0x2b08, 0x6112, 0x6023,
-	0x0006, 0x7120, 0x610a, 0x7130, 0x615e, 0x6017, 0xf300, 0x6003,
-	0x0001, 0x6007, 0x0041, 0x2009, 0xa022, 0x080c, 0x90e8, 0x08e0,
-	0x00b6, 0x7110, 0xd1bc, 0x05d0, 0x7020, 0x2060, 0x9c84, 0x0003,
-	0x15a8, 0x9c82, 0x1ddc, 0x0690, 0x6868, 0x9c02, 0x1678, 0x9484,
-	0x0fff, 0x9082, 0x000c, 0x0650, 0x7008, 0x9084, 0x00ff, 0x6110,
-	0x2158, 0xb910, 0x9106, 0x1510, 0x700c, 0xb914, 0x9106, 0x11f0,
-	0x7124, 0x610a, 0x601c, 0xd0fc, 0x11c8, 0x2001, 0x0271, 0x2004,
-	0x9005, 0x1180, 0x9484, 0x0fff, 0x9082, 0x000c, 0x0158, 0x0066,
-	0x2031, 0x0100, 0xa001, 0xa001, 0x8631, 0x1de0, 0x006e, 0x601c,
-	0xd0fc, 0x1120, 0x2009, 0x0045, 0x080c, 0xab77, 0x7817, 0x0140,
-	0x00be, 0x0005, 0x6120, 0x9186, 0x0002, 0x0128, 0x9186, 0x0005,
-	0x0110, 0x9085, 0x0001, 0x0005, 0x080c, 0x32f2, 0x1168, 0x7010,
-	0x9084, 0xff00, 0x8007, 0x9086, 0x0000, 0x1130, 0x9184, 0x000f,
-	0x908a, 0x0006, 0x1208, 0x000b, 0x0005, 0x825b, 0x825c, 0x825b,
-	0x825b, 0x82bb, 0x82ca, 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x0120,
-	0x702c, 0xd084, 0x0904, 0x82b9, 0x700c, 0x7108, 0x080c, 0x25cf,
-	0x1904, 0x82b9, 0x080c, 0x64cc, 0x1904, 0x82b9, 0xbe12, 0xbd16,
-	0x7110, 0xd1bc, 0x01d8, 0x080c, 0x696a, 0x0118, 0x9086, 0x0004,
-	0x1588, 0x00c6, 0x080c, 0x82d9, 0x00ce, 0x05d8, 0x080c, 0xaa82,
-	0x2b08, 0x05b8, 0x6112, 0x080c, 0xcbb0, 0x6023, 0x0002, 0x7120,
-	0x610a, 0x2009, 0x0088, 0x080c, 0xab77, 0x0458, 0x080c, 0x696a,
-	0x0148, 0x9086, 0x0004, 0x0130, 0x080c, 0x6972, 0x0118, 0x9086,
-	0x0004, 0x1180, 0x080c, 0xaa82, 0x2b08, 0x01d8, 0x6112, 0x080c,
-	0xcbb0, 0x6023, 0x0005, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c,
-	0xab77, 0x0078, 0x080c, 0xaa82, 0x2b08, 0x0158, 0x6112, 0x080c,
-	0xcbb0, 0x6023, 0x0004, 0x7120, 0x610a, 0x2009, 0x0001, 0x080c,
-	0xab77, 0x00be, 0x0005, 0x7110, 0xd1bc, 0x0158, 0x00d1, 0x0148,
-	0x080c, 0x823a, 0x1130, 0x7124, 0x610a, 0x2009, 0x0089, 0x080c,
-	0xab77, 0x0005, 0x7110, 0xd1bc, 0x0158, 0x0059, 0x0148, 0x080c,
-	0x823a, 0x1130, 0x7124, 0x610a, 0x2009, 0x008a, 0x080c, 0xab77,
-	0x0005, 0x7020, 0x2060, 0x9c84, 0x0003, 0x1158, 0x9c82, 0x1ddc,
-	0x0240, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1218, 0x9085, 0x0001,
-	0x0005, 0x9006, 0x0ce8, 0x00b6, 0x7110, 0xd1bc, 0x11d8, 0x7024,
-	0x2060, 0x9c84, 0x0003, 0x11b0, 0x9c82, 0x1ddc, 0x0298, 0x6868,
-	0x9c02, 0x1280, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910,
-	0x9106, 0x1140, 0x700c, 0xb914, 0x9106, 0x1120, 0x2009, 0x0051,
-	0x080c, 0xab77, 0x7817, 0x0140, 0x00be, 0x0005, 0x2031, 0x0105,
-	0x0069, 0x0005, 0x2031, 0x0206, 0x0049, 0x0005, 0x2031, 0x0207,
-	0x0029, 0x0005, 0x2031, 0x0213, 0x0009, 0x0005, 0x00c6, 0x0096,
-	0x00f6, 0x7000, 0x9084, 0xf000, 0x9086, 0xc000, 0x05c0, 0x080c,
-	0xaa82, 0x05a8, 0x0066, 0x00c6, 0x0046, 0x2011, 0x0263, 0x2204,
-	0x8211, 0x220c, 0x080c, 0x25cf, 0x1590, 0x080c, 0x64cc, 0x1578,
-	0xbe12, 0xbd16, 0x2b00, 0x004e, 0x00ce, 0x6012, 0x080c, 0xcbb0,
-	0x080c, 0x103b, 0x0500, 0x2900, 0x6062, 0x9006, 0xa802, 0xa866,
-	0xac6a, 0xa85c, 0x90f8, 0x001b, 0x20a9, 0x000e, 0xa860, 0x20e8,
-	0x20e1, 0x0000, 0x2fa0, 0x2e98, 0x4003, 0x006e, 0x6616, 0x6007,
-	0x003e, 0x6023, 0x0001, 0x6003, 0x0001, 0x080c, 0x90ef, 0x00fe,
-	0x009e, 0x00ce, 0x0005, 0x080c, 0xaad8, 0x006e, 0x0cc0, 0x004e,
-	0x00ce, 0x0cc8, 0x00c6, 0x7000, 0x908c, 0xff00, 0x9184, 0xf000,
-	0x810f, 0x9086, 0x2000, 0x1904, 0x83c1, 0x9186, 0x0022, 0x15f0,
-	0x2001, 0x0111, 0x2004, 0x9005, 0x1904, 0x83c3, 0x7030, 0x908e,
-	0x0400, 0x0904, 0x83c3, 0x908e, 0x6000, 0x05e8, 0x908e, 0x5400,
-	0x05d0, 0x908e, 0x0300, 0x11d8, 0x2009, 0x1837, 0x210c, 0xd18c,
-	0x1590, 0xd1a4, 0x1580, 0x080c, 0x6928, 0x0558, 0x68b0, 0x9084,
-	0x00ff, 0x7100, 0x918c, 0x00ff, 0x9106, 0x1518, 0x6880, 0x69b0,
-	0x918c, 0xff00, 0x9105, 0x7104, 0x9106, 0x11d8, 0x00e0, 0x2009,
-	0x0103, 0x210c, 0xd1b4, 0x11a8, 0x908e, 0x5200, 0x09e8, 0x908e,
-	0x0500, 0x09d0, 0x908e, 0x5000, 0x09b8, 0x0058, 0x9186, 0x0023,
-	0x1140, 0x080c, 0x82d9, 0x0128, 0x6004, 0x9086, 0x0002, 0x0118,
-	0x0000, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce, 0x0005, 0x0156,
-	0x0046, 0x0016, 0x0036, 0x7038, 0x2020, 0x8427, 0x94a4, 0x0007,
-	0xd484, 0x0148, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x027a,
-	0x080c, 0xba99, 0x1178, 0xd48c, 0x0148, 0x20a9, 0x0004, 0x2019,
-	0x1801, 0x2011, 0x027e, 0x080c, 0xba99, 0x1120, 0xd494, 0x0110,
-	0x9085, 0x0001, 0x003e, 0x001e, 0x004e, 0x015e, 0x0005, 0x0156,
-	0x0046, 0x0016, 0x0036, 0x7038, 0x2020, 0x8427, 0x94a4, 0x0007,
-	0xd484, 0x0148, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0272,
-	0x080c, 0xba99, 0x1178, 0xd48c, 0x0148, 0x20a9, 0x0004, 0x2019,
-	0x1801, 0x2011, 0x0276, 0x080c, 0xba99, 0x1120, 0xd494, 0x0110,
-	0x9085, 0x0001, 0x003e, 0x001e, 0x004e, 0x015e, 0x0005, 0x00f6,
-	0x2079, 0x0200, 0x7800, 0xc0e5, 0xc0cc, 0x7802, 0x00fe, 0x0005,
-	0x00f6, 0x2079, 0x1800, 0x7834, 0xd084, 0x1130, 0x2079, 0x0200,
-	0x7800, 0x9085, 0x1200, 0x7802, 0x00fe, 0x0005, 0x00e6, 0x2071,
-	0x1800, 0x7034, 0xc084, 0x7036, 0x00ee, 0x0005, 0x2071, 0x1a01,
-	0x7003, 0x0003, 0x700f, 0x0361, 0x9006, 0x701a, 0x7072, 0x7012,
-	0x7017, 0x1ddc, 0x7007, 0x0000, 0x7026, 0x702b, 0x9d2b, 0x7032,
-	0x7037, 0x9da8, 0x703f, 0xffff, 0x7042, 0x7047, 0x5493, 0x704a,
-	0x705b, 0x85db, 0x080c, 0x1054, 0x090c, 0x0d7d, 0x2900, 0x703a,
-	0xa867, 0x0003, 0xa86f, 0x0100, 0xa8ab, 0xdcb0, 0x0005, 0x2071,
-	0x1a01, 0x1d04, 0x84fa, 0x2091, 0x6000, 0x700c, 0x8001, 0x700e,
-	0x1590, 0x2001, 0x013c, 0x2004, 0x9005, 0x190c, 0x8685, 0x2001,
-	0x1869, 0x2004, 0xd0c4, 0x0158, 0x3a00, 0xd08c, 0x1140, 0x20d1,
-	0x0000, 0x20d1, 0x0001, 0x20d1, 0x0000, 0x080c, 0x0d7d, 0x700f,
-	0x0361, 0x7007, 0x0001, 0x0126, 0x2091, 0x8000, 0x2069, 0x1800,
-	0x69ec, 0xd1e4, 0x1138, 0xd1dc, 0x1118, 0x080c, 0x8649, 0x0010,
-	0x080c, 0x8620, 0x7040, 0x900d, 0x0148, 0x8109, 0x7142, 0x1130,
-	0x7044, 0x080f, 0x0018, 0x0126, 0x2091, 0x8000, 0x7024, 0x900d,
-	0x0188, 0x7020, 0x8001, 0x7022, 0x1168, 0x7023, 0x0009, 0x8109,
-	0x7126, 0x9186, 0x03e8, 0x1110, 0x7028, 0x080f, 0x81ff, 0x1110,
-	0x7028, 0x080f, 0x7030, 0x900d, 0x0180, 0x702c, 0x8001, 0x702e,
-	0x1160, 0x702f, 0x0009, 0x8109, 0x7132, 0x0128, 0x9184, 0x007f,
-	0x090c, 0x9e44, 0x0010, 0x7034, 0x080f, 0x703c, 0x9005, 0x0118,
-	0x0310, 0x8001, 0x703e, 0x704c, 0x900d, 0x0168, 0x7048, 0x8001,
-	0x704a, 0x1148, 0x704b, 0x0009, 0x8109, 0x714e, 0x1120, 0x7150,
-	0x714e, 0x7058, 0x080f, 0x7018, 0x900d, 0x01d8, 0x0016, 0x7070,
-	0x900d, 0x0158, 0x706c, 0x8001, 0x706e, 0x1138, 0x706f, 0x0009,
-	0x8109, 0x7172, 0x1110, 0x7074, 0x080f, 0x001e, 0x7008, 0x8001,
-	0x700a, 0x1138, 0x700b, 0x0009, 0x8109, 0x711a, 0x1110, 0x701c,
-	0x080f, 0x012e, 0x7004, 0x0002, 0x8522, 0x8523, 0x854d, 0x00e6,
-	0x2071, 0x1a01, 0x7018, 0x9005, 0x1120, 0x711a, 0x721e, 0x700b,
-	0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x1a01, 0x701c,
-	0x9206, 0x1120, 0x701a, 0x701e, 0x7072, 0x7076, 0x000e, 0x00ee,
-	0x0005, 0x00e6, 0x2071, 0x1a01, 0xb888, 0x9102, 0x0208, 0xb98a,
-	0x00ee, 0x0005, 0x0005, 0x00b6, 0x2031, 0x0010, 0x7110, 0x080c,
-	0x652d, 0x11a8, 0xb888, 0x8001, 0x0290, 0xb88a, 0x1180, 0x0126,
-	0x2091, 0x8000, 0x0066, 0xb8d0, 0x9005, 0x0138, 0x0026, 0xba3c,
-	0x0016, 0x080c, 0x6658, 0x001e, 0x002e, 0x006e, 0x012e, 0x8108,
-	0x9182, 0x0800, 0x1220, 0x8631, 0x0128, 0x7112, 0x0c00, 0x900e,
-	0x7007, 0x0002, 0x7112, 0x00be, 0x0005, 0x2031, 0x0010, 0x7014,
-	0x2060, 0x0126, 0x2091, 0x8000, 0x6048, 0x9005, 0x0128, 0x8001,
-	0x604a, 0x1110, 0x080c, 0xca31, 0x6018, 0x9005, 0x0904, 0x85a2,
-	0x00f6, 0x2079, 0x0300, 0x7918, 0xd1b4, 0x1904, 0x85b5, 0x781b,
-	0x2020, 0xa001, 0x7918, 0xd1b4, 0x0120, 0x781b, 0x2000, 0x0804,
-	0x85b5, 0x8001, 0x601a, 0x0106, 0x781b, 0x2000, 0xa001, 0x7918,
-	0xd1ac, 0x1dd0, 0x010e, 0x00fe, 0x1528, 0x6120, 0x9186, 0x0003,
-	0x0148, 0x9186, 0x0006, 0x0130, 0x9186, 0x0009, 0x11c8, 0x611c,
-	0xd1c4, 0x1100, 0x6014, 0x2048, 0xa884, 0x908a, 0x199a, 0x0280,
-	0x9082, 0x1999, 0xa886, 0x908a, 0x199a, 0x0210, 0x2001, 0x1999,
-	0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0x080c, 0xce61, 0x0110,
-	0x080c, 0xc421, 0x012e, 0x9c88, 0x001c, 0x7116, 0x2001, 0x181a,
-	0x2004, 0x9102, 0x1228, 0x8631, 0x0138, 0x2160, 0x0804, 0x8551,
-	0x7017, 0x1ddc, 0x7007, 0x0000, 0x0005, 0x00fe, 0x0c58, 0x00e6,
-	0x2071, 0x1a01, 0x7027, 0x07d0, 0x7023, 0x0009, 0x00ee, 0x0005,
-	0x2001, 0x1a0a, 0x2003, 0x0000, 0x0005, 0x00e6, 0x2071, 0x1a01,
-	0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, 0x2011, 0x1a0d, 0x2013,
-	0x0000, 0x0005, 0x00e6, 0x2071, 0x1a01, 0x711a, 0x721e, 0x700b,
-	0x0009, 0x00ee, 0x0005, 0x0086, 0x0026, 0x7054, 0x8000, 0x7056,
-	0x2001, 0x1a0f, 0x2044, 0xa06c, 0x9086, 0x0000, 0x0150, 0x7068,
-	0xa09a, 0x7064, 0xa096, 0x7060, 0xa092, 0x705c, 0xa08e, 0x080c,
-	0x111b, 0x002e, 0x008e, 0x0005, 0x0006, 0x0016, 0x0096, 0x00a6,
-	0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x080c, 0x845f,
-	0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e,
-	0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x1a01, 0x7172, 0x7276,
-	0x706f, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x1a01,
-	0x7074, 0x9206, 0x1110, 0x7072, 0x7076, 0x000e, 0x00ee, 0x0005,
-	0x2069, 0x1800, 0x69ec, 0xd1e4, 0x1518, 0x0026, 0xd1ec, 0x0140,
-	0x6a54, 0x6874, 0x9202, 0x0288, 0x8117, 0x9294, 0x00c1, 0x0088,
-	0x9184, 0x0007, 0x01a0, 0x8109, 0x9184, 0x0007, 0x0110, 0x69ee,
-	0x0070, 0x8107, 0x9084, 0x0007, 0x910d, 0x8107, 0x9106, 0x9094,
-	0x00c1, 0x9184, 0xff3e, 0x9205, 0x68ee, 0x080c, 0x0f05, 0x002e,
-	0x0005, 0x69e8, 0x9184, 0x003f, 0x05b8, 0x8109, 0x9184, 0x003f,
-	0x01a8, 0x6a54, 0x6874, 0x9202, 0x0220, 0xd1bc, 0x0168, 0xc1bc,
-	0x0018, 0xd1bc, 0x1148, 0xc1bd, 0x2110, 0x00e6, 0x2071, 0x1800,
-	0x080c, 0x0f27, 0x00ee, 0x0400, 0x69ea, 0x00f0, 0x0026, 0x8107,
-	0x9094, 0x0007, 0x0128, 0x8001, 0x8007, 0x9085, 0x0007, 0x0050,
-	0x2010, 0x8004, 0x8004, 0x8004, 0x9084, 0x0007, 0x9205, 0x8007,
-	0x9085, 0x0028, 0x9086, 0x0040, 0x2010, 0x00e6, 0x2071, 0x1800,
-	0x080c, 0x0f27, 0x00ee, 0x002e, 0x0005, 0x0016, 0x00c6, 0x2009,
-	0xfffc, 0x210d, 0x2061, 0x0100, 0x60f0, 0x9100, 0x60f3, 0x0000,
-	0x2009, 0xfffc, 0x200f, 0x1220, 0x8108, 0x2105, 0x8000, 0x200f,
-	0x00ce, 0x001e, 0x0005, 0x00c6, 0x2061, 0x1a6d, 0x00ce, 0x0005,
-	0x9184, 0x000f, 0x8003, 0x8003, 0x8003, 0x9080, 0x1a6d, 0x2060,
-	0x0005, 0xa884, 0x908a, 0x199a, 0x1638, 0x9005, 0x1150, 0x00c6,
-	0x2061, 0x1a6d, 0x6014, 0x00ce, 0x9005, 0x1130, 0x2001, 0x001e,
-	0x0018, 0x908e, 0xffff, 0x01b0, 0x8003, 0x800b, 0x810b, 0x9108,
-	0x611a, 0xa87c, 0x908c, 0x00c0, 0x918e, 0x00c0, 0x0904, 0x8760,
-	0xd0b4, 0x1168, 0xd0bc, 0x1904, 0x8739, 0x2009, 0x0006, 0x080c,
-	0x878d, 0x0005, 0x900e, 0x0c60, 0x2001, 0x1999, 0x08b0, 0xd0fc,
-	0x05c8, 0x908c, 0x2023, 0x1550, 0x87ff, 0x1540, 0x6124, 0x918c,
-	0x0500, 0x1520, 0x6100, 0x918e, 0x0007, 0x1500, 0x2009, 0x1869,
-	0x210c, 0xd184, 0x11d8, 0x6003, 0x0003, 0x6007, 0x0043, 0x6047,
-	0xb035, 0x080c, 0x1be0, 0xa87c, 0xc0dd, 0xa87e, 0x600f, 0x0000,
-	0x00f6, 0x2079, 0x0380, 0x7818, 0xd0bc, 0x1de8, 0x7833, 0x0013,
-	0x2c00, 0x7836, 0x781b, 0x8080, 0x00fe, 0x0005, 0x908c, 0x0003,
-	0x0120, 0x918e, 0x0003, 0x1904, 0x8787, 0x908c, 0x2020, 0x918e,
-	0x2020, 0x01a8, 0x6024, 0xd0d4, 0x11e8, 0x2009, 0x1869, 0x2104,
-	0xd084, 0x1138, 0x87ff, 0x1120, 0x2009, 0x0043, 0x0804, 0xab77,
-	0x0005, 0x87ff, 0x1de8, 0x2009, 0x0042, 0x0804, 0xab77, 0x6110,
-	0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d20, 0x6024, 0xc0cd,
-	0x6026, 0x0c00, 0xc0d4, 0x6026, 0xa890, 0x602e, 0xa88c, 0x6032,
-	0x08e0, 0xd0fc, 0x0160, 0x908c, 0x0003, 0x0120, 0x918e, 0x0003,
-	0x1904, 0x8787, 0x908c, 0x2020, 0x918e, 0x2020, 0x0170, 0x0076,
-	0x00f6, 0x2c78, 0x080c, 0x1728, 0x00fe, 0x007e, 0x87ff, 0x1120,
-	0x2009, 0x0042, 0x080c, 0xab77, 0x0005, 0x6110, 0x00b6, 0x2158,
-	0xb900, 0x00be, 0xd1ac, 0x0d58, 0x6124, 0xc1cd, 0x6126, 0x0c38,
-	0xd0fc, 0x0188, 0x908c, 0x2020, 0x918e, 0x2020, 0x01a8, 0x9084,
-	0x0003, 0x908e, 0x0002, 0x0148, 0x87ff, 0x1120, 0x2009, 0x0041,
-	0x080c, 0xab77, 0x0005, 0x00b9, 0x0ce8, 0x87ff, 0x1dd8, 0x2009,
-	0x0043, 0x080c, 0xab77, 0x0cb0, 0x6110, 0x00b6, 0x2158, 0xb900,
-	0x00be, 0xd1ac, 0x0d20, 0x6124, 0xc1cd, 0x6126, 0x0c00, 0x2009,
-	0x0004, 0x0019, 0x0005, 0x2009, 0x0001, 0x0096, 0x080c, 0xc723,
-	0x0518, 0x6014, 0x2048, 0xa982, 0xa800, 0x6016, 0x9186, 0x0001,
-	0x1188, 0xa97c, 0x918c, 0x8100, 0x918e, 0x8100, 0x1158, 0x00c6,
-	0x2061, 0x1a6d, 0x6200, 0xd28c, 0x1120, 0x6204, 0x8210, 0x0208,
-	0x6206, 0x00ce, 0x080c, 0x6ab4, 0x6014, 0x904d, 0x0076, 0x2039,
-	0x0000, 0x190c, 0x86a9, 0x007e, 0x009e, 0x0005, 0x0156, 0x00c6,
-	0x2061, 0x1a6d, 0x6000, 0x81ff, 0x0110, 0x9205, 0x0008, 0x9204,
-	0x6002, 0x00ce, 0x015e, 0x0005, 0x6800, 0xd08c, 0x1138, 0x6808,
-	0x9005, 0x0120, 0x8001, 0x680a, 0x9085, 0x0001, 0x0005, 0x2071,
-	0x1923, 0x7003, 0x0006, 0x7007, 0x0000, 0x700f, 0x0000, 0x7013,
-	0x0001, 0x080c, 0x1054, 0x090c, 0x0d7d, 0xa867, 0x0006, 0xa86b,
-	0x0001, 0xa8ab, 0xdcb0, 0xa89f, 0x0000, 0x2900, 0x702e, 0x7033,
-	0x0000, 0x0005, 0x0096, 0x00e6, 0x2071, 0x1923, 0x702c, 0x2048,
-	0x6a2c, 0x721e, 0x6b30, 0x7322, 0x6834, 0x7026, 0xa896, 0x6838,
-	0x702a, 0xa89a, 0x6824, 0x7016, 0x683c, 0x701a, 0x2009, 0x0028,
-	0x200a, 0x9005, 0x0148, 0x900e, 0x9188, 0x000c, 0x8001, 0x1de0,
-	0x2100, 0x9210, 0x1208, 0x8318, 0xaa8e, 0xab92, 0x7010, 0xd084,
-	0x0178, 0xc084, 0x7007, 0x0001, 0x700f, 0x0000, 0x0006, 0x2009,
-	0x181d, 0x2104, 0x9082, 0x0007, 0x2009, 0x1b4c, 0x200a, 0x000e,
-	0xc095, 0x7012, 0x2008, 0x2001, 0x003b, 0x080c, 0x1670, 0x9006,
-	0x2071, 0x193c, 0x7002, 0x7006, 0x702a, 0x00ee, 0x009e, 0x0005,
-	0x00e6, 0x0126, 0x0156, 0x2091, 0x8000, 0x2071, 0x1800, 0x7154,
-	0x2001, 0x0008, 0x910a, 0x0638, 0x2001, 0x187d, 0x20ac, 0x9006,
-	0x9080, 0x0008, 0x1f04, 0x8840, 0x71c0, 0x9102, 0x02e0, 0x2071,
-	0x1877, 0x20a9, 0x0007, 0x00c6, 0x080c, 0xaa82, 0x6023, 0x0009,
-	0x6003, 0x0004, 0x601f, 0x0101, 0x0089, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x89c6, 0x012e, 0x1f04, 0x884c, 0x9006, 0x00ce, 0x015e,
-	0x012e, 0x00ee, 0x0005, 0x9085, 0x0001, 0x0cc8, 0x00e6, 0x00b6,
-	0x0096, 0x0086, 0x0056, 0x0046, 0x0026, 0x7118, 0x720c, 0x7620,
-	0x7004, 0xd084, 0x1128, 0x2021, 0x0024, 0x2029, 0x0002, 0x0020,
-	0x2021, 0x002c, 0x2029, 0x000a, 0x080c, 0x103b, 0x090c, 0x0d7d,
-	0x2900, 0x6016, 0x2058, 0xac66, 0x9006, 0xa802, 0xa806, 0xa86a,
-	0xa87a, 0xa8aa, 0xa887, 0x0005, 0xa87f, 0x0020, 0x7008, 0xa89a,
-	0x7010, 0xa89e, 0xae8a, 0xa8af, 0xffff, 0xa8b3, 0x0000, 0x8109,
-	0x0160, 0x080c, 0x103b, 0x090c, 0x0d7d, 0xad66, 0x2b00, 0xa802,
-	0x2900, 0xb806, 0x2058, 0x8109, 0x1da0, 0x002e, 0x004e, 0x005e,
-	0x008e, 0x009e, 0x00be, 0x00ee, 0x0005, 0x2079, 0x0000, 0x2071,
-	0x1923, 0x7004, 0x004b, 0x700c, 0x0002, 0x88b8, 0x88b1, 0x88b1,
-	0x0005, 0x88c2, 0x8923, 0x8923, 0x8923, 0x8924, 0x8935, 0x8935,
-	0x700c, 0x0cba, 0x0126, 0x2091, 0x8000, 0x78a0, 0x79a0, 0x9106,
-	0x0128, 0x78a0, 0x79a0, 0x9106, 0x1904, 0x8916, 0x2001, 0x0005,
-	0x2004, 0xd0bc, 0x0130, 0x2011, 0x0004, 0x2204, 0xc0c5, 0x2012,
-	0x0ca8, 0x012e, 0x7018, 0x910a, 0x1130, 0x7030, 0x9005, 0x05a8,
-	0x080c, 0x8964, 0x0490, 0x1210, 0x7114, 0x910a, 0x9192, 0x000a,
-	0x0210, 0x2009, 0x000a, 0x2001, 0x1888, 0x2014, 0x2001, 0x1935,
-	0x2004, 0x9100, 0x9202, 0x0e48, 0x080c, 0x8ab0, 0x2200, 0x9102,
-	0x0208, 0x2208, 0x0096, 0x702c, 0x2048, 0xa873, 0x0001, 0xa976,
-	0x080c, 0x8bb9, 0x2100, 0xa87e, 0xa86f, 0x0000, 0x009e, 0x0126,
-	0x2091, 0x8000, 0x2009, 0x1a1f, 0x2104, 0xc085, 0x200a, 0x700f,
-	0x0002, 0x012e, 0x080c, 0x113a, 0x1de8, 0x0005, 0x2001, 0x0005,
-	0x2004, 0xd0bc, 0x0130, 0x2011, 0x0004, 0x2204, 0xc0c5, 0x2012,
-	0x0ca8, 0x012e, 0x0005, 0x0005, 0x700c, 0x0002, 0x8929, 0x892c,
-	0x892b, 0x080c, 0x88c0, 0x0005, 0x8001, 0x700e, 0x0096, 0x702c,
-	0x2048, 0xa974, 0x009e, 0x0011, 0x0ca0, 0x0005, 0x0096, 0x702c,
-	0x2048, 0x7018, 0x9100, 0x7214, 0x921a, 0x1130, 0x701c, 0xa88e,
-	0x7020, 0xa892, 0x9006, 0x0068, 0x0006, 0x080c, 0x8bb9, 0x2100,
-	0xaa8c, 0x9210, 0xaa8e, 0x1220, 0xa890, 0x9081, 0x0000, 0xa892,
-	0x000e, 0x009e, 0x2f08, 0x9188, 0x0028, 0x200a, 0x701a, 0x0005,
-	0x00e6, 0x2071, 0x1923, 0x700c, 0x0002, 0x8962, 0x8962, 0x8960,
-	0x700f, 0x0001, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x7030,
-	0x9005, 0x0508, 0x2078, 0x7814, 0x2048, 0xae88, 0x00b6, 0x2059,
-	0x0000, 0x080c, 0x89cf, 0x00be, 0x01b0, 0x00e6, 0x2071, 0x193c,
-	0x080c, 0x8a16, 0x00ee, 0x0178, 0x0096, 0x080c, 0x1054, 0x2900,
-	0x009e, 0x0148, 0xa8aa, 0x04b9, 0x0041, 0x2001, 0x1946, 0x2003,
-	0x0000, 0x012e, 0x08c8, 0x012e, 0x0005, 0x00d6, 0x00c6, 0x0086,
-	0x00a6, 0x2940, 0x2650, 0x2600, 0x9005, 0x0180, 0xa864, 0x9084,
-	0x000f, 0x2068, 0x9d88, 0x1e31, 0x2165, 0x0056, 0x2029, 0x0000,
-	0x080c, 0x8b3e, 0x080c, 0x1e07, 0x1dd8, 0x005e, 0x00ae, 0x2001,
-	0x187f, 0x2004, 0xa88a, 0x080c, 0x1728, 0x781f, 0x0101, 0x7813,
-	0x0000, 0x0126, 0x2091, 0x8000, 0x080c, 0x8a25, 0x012e, 0x008e,
-	0x00ce, 0x00de, 0x0005, 0x7030, 0x9005, 0x0138, 0x2078, 0x780c,
-	0x7032, 0x2001, 0x1946, 0x2003, 0x0001, 0x0005, 0x00e6, 0x2071,
-	0x1923, 0x7030, 0x600e, 0x2c00, 0x7032, 0x00ee, 0x0005, 0x00d6,
-	0x00c6, 0x0026, 0x9b80, 0x8c98, 0x2005, 0x906d, 0x090c, 0x0d7d,
-	0x9b80, 0x8c90, 0x2005, 0x9065, 0x090c, 0x0d7d, 0x6114, 0x2600,
-	0x9102, 0x0248, 0x6828, 0x9102, 0x02f0, 0x9085, 0x0001, 0x002e,
-	0x00ce, 0x00de, 0x0005, 0x6804, 0xd094, 0x0148, 0x6854, 0xd084,
-	0x1178, 0xc085, 0x6856, 0x2011, 0x8026, 0x080c, 0x4a38, 0x684c,
-	0x0096, 0x904d, 0x090c, 0x0d7d, 0xa804, 0x8000, 0xa806, 0x009e,
-	0x9006, 0x2030, 0x0c20, 0x6854, 0xd08c, 0x1d08, 0xc08d, 0x6856,
-	0x2011, 0x8025, 0x080c, 0x4a38, 0x684c, 0x0096, 0x904d, 0x090c,
-	0x0d7d, 0xa800, 0x8000, 0xa802, 0x009e, 0x0888, 0x7000, 0x2019,
-	0x0008, 0x8319, 0x7104, 0x9102, 0x1118, 0x2300, 0x9005, 0x0020,
-	0x0210, 0x9302, 0x0008, 0x8002, 0x0005, 0x00d6, 0x7814, 0x9005,
-	0x090c, 0x0d7d, 0x781c, 0x9084, 0x0101, 0x9086, 0x0101, 0x190c,
-	0x0d7d, 0x2069, 0x193c, 0x6804, 0x9080, 0x193e, 0x2f08, 0x2102,
-	0x6904, 0x8108, 0x9182, 0x0008, 0x0208, 0x900e, 0x6906, 0x9180,
-	0x193e, 0x2003, 0x0000, 0x00de, 0x0005, 0x0096, 0x00c6, 0x2060,
-	0x6014, 0x2048, 0xa8a8, 0x0096, 0x2048, 0x9005, 0x190c, 0x106d,
-	0x009e, 0xa8ab, 0x0000, 0x080c, 0x0fed, 0x080c, 0xaad8, 0x00ce,
-	0x009e, 0x0005, 0x6020, 0x9086, 0x0009, 0x1128, 0x601c, 0xd0c4,
-	0x0110, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x6000, 0x9086,
-	0x0000, 0x0178, 0x6010, 0x9005, 0x0150, 0x00b6, 0x2058, 0x080c,
-	0x8dcb, 0x00be, 0x6013, 0x0000, 0x601b, 0x0000, 0x0010, 0x2c00,
-	0x0861, 0x0005, 0x2009, 0x1927, 0x210c, 0xd194, 0x0005, 0x00e6,
-	0x2071, 0x1923, 0x7110, 0xc194, 0xd19c, 0x1118, 0xc185, 0x7007,
-	0x0000, 0x7112, 0x2001, 0x003b, 0x080c, 0x1670, 0x00ee, 0x0005,
-	0x0096, 0x00d6, 0x9006, 0x7006, 0x700e, 0x701a, 0x701e, 0x7022,
-	0x7016, 0x702a, 0x7026, 0x702f, 0x0000, 0x080c, 0x8c18, 0x0170,
-	0x080c, 0x8c4d, 0x0158, 0x2900, 0x7002, 0x700a, 0x701a, 0x7013,
-	0x0001, 0x701f, 0x000a, 0x00de, 0x009e, 0x0005, 0x900e, 0x0cd8,
-	0x00e6, 0x0096, 0x0086, 0x00d6, 0x00c6, 0x2071, 0x1930, 0x721c,
-	0x2100, 0x9202, 0x1618, 0x080c, 0x8c4d, 0x090c, 0x0d7d, 0x7018,
-	0x9005, 0x1160, 0x2900, 0x7002, 0x700a, 0x701a, 0x9006, 0x7006,
-	0x700e, 0xa806, 0xa802, 0x7012, 0x701e, 0x0038, 0x2040, 0xa806,
-	0x2900, 0xa002, 0x701a, 0xa803, 0x0000, 0x7010, 0x8000, 0x7012,
-	0x701c, 0x9080, 0x000a, 0x701e, 0x721c, 0x08d0, 0x721c, 0x00ce,
-	0x00de, 0x008e, 0x009e, 0x00ee, 0x0005, 0x0096, 0x0156, 0x0136,
-	0x0146, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1930, 0x7300,
-	0x831f, 0x831e, 0x831e, 0x9384, 0x003f, 0x20e8, 0x939c, 0xffc0,
-	0x9398, 0x0003, 0x7104, 0x080c, 0x8bb9, 0x810c, 0x2100, 0x9318,
-	0x8003, 0x2228, 0x2021, 0x0078, 0x9402, 0x9532, 0x0208, 0x2028,
-	0x2500, 0x8004, 0x20a8, 0x23a0, 0xa001, 0xa001, 0x4005, 0x2508,
-	0x080c, 0x8bc2, 0x2130, 0x7014, 0x9600, 0x7016, 0x2600, 0x711c,
-	0x9102, 0x701e, 0x7004, 0x9600, 0x2008, 0x9082, 0x000a, 0x1190,
-	0x7000, 0x2048, 0xa800, 0x9005, 0x1148, 0x2009, 0x0001, 0x0026,
-	0x080c, 0x8ab0, 0x002e, 0x7000, 0x2048, 0xa800, 0x7002, 0x7007,
-	0x0000, 0x0008, 0x7106, 0x2500, 0x9212, 0x1904, 0x8aef, 0x012e,
-	0x00ee, 0x014e, 0x013e, 0x015e, 0x009e, 0x0005, 0x0016, 0x0026,
-	0x00e6, 0x0126, 0x2091, 0x8000, 0x9580, 0x8c90, 0x2005, 0x9075,
-	0x090c, 0x0d7d, 0x080c, 0x8b94, 0x012e, 0x9580, 0x8c8c, 0x2005,
-	0x9075, 0x090c, 0x0d7d, 0x0156, 0x0136, 0x01c6, 0x0146, 0x01d6,
-	0x831f, 0x831e, 0x831e, 0x9384, 0x003f, 0x20e0, 0x9384, 0xffc0,
-	0x9100, 0x2098, 0xa860, 0x20e8, 0xa95c, 0x2c05, 0x9100, 0x20a0,
-	0x20a9, 0x0002, 0x4003, 0x2e0c, 0x2d00, 0x0002, 0x8b7e, 0x8b7e,
-	0x8b80, 0x8b7e, 0x8b80, 0x8b7e, 0x8b7e, 0x8b7e, 0x8b7e, 0x8b7e,
-	0x8b86, 0x8b7e, 0x8b86, 0x8b7e, 0x8b7e, 0x8b7e, 0x080c, 0x0d7d,
-	0x4104, 0x20a9, 0x0002, 0x4002, 0x4003, 0x0028, 0x20a9, 0x0002,
-	0x4003, 0x4104, 0x4003, 0x01de, 0x014e, 0x01ce, 0x013e, 0x015e,
-	0x00ee, 0x002e, 0x001e, 0x0005, 0x0096, 0x7014, 0x8001, 0x7016,
-	0x710c, 0x2110, 0x00f1, 0x810c, 0x9188, 0x0003, 0x7308, 0x8210,
-	0x9282, 0x000a, 0x1198, 0x7008, 0x2048, 0xa800, 0x9005, 0x0158,
-	0x0006, 0x080c, 0x8c5c, 0x009e, 0xa807, 0x0000, 0x2900, 0x700a,
-	0x7010, 0x8001, 0x7012, 0x700f, 0x0000, 0x0008, 0x720e, 0x009e,
-	0x0005, 0x0006, 0x810b, 0x810b, 0x2100, 0x810b, 0x9100, 0x2008,
-	0x000e, 0x0005, 0x0006, 0x0026, 0x2100, 0x9005, 0x0158, 0x9092,
-	0x000c, 0x0240, 0x900e, 0x8108, 0x9082, 0x000c, 0x1de0, 0x002e,
-	0x000e, 0x0005, 0x900e, 0x0cd8, 0x2d00, 0x90b8, 0x0008, 0x690c,
-	0x6810, 0x2019, 0x0001, 0x2031, 0x8c02, 0x9112, 0x0220, 0x0118,
-	0x8318, 0x2208, 0x0cd0, 0x6808, 0x9005, 0x0108, 0x8318, 0x233a,
-	0x6804, 0xd084, 0x2300, 0x2021, 0x0001, 0x1150, 0x9082, 0x0003,
-	0x0967, 0x0a67, 0x8420, 0x9082, 0x0007, 0x0967, 0x0a67, 0x0cd0,
-	0x9082, 0x0002, 0x0967, 0x0a67, 0x8420, 0x9082, 0x0005, 0x0967,
-	0x0a67, 0x0cd0, 0x6c1a, 0x2d00, 0x90b8, 0x0007, 0x00e6, 0x2071,
-	0x1800, 0x7128, 0x6810, 0x2019, 0x0001, 0x910a, 0x0118, 0x0210,
-	0x8318, 0x0cd8, 0x2031, 0x8c15, 0x0870, 0x6c16, 0x00ee, 0x0005,
-	0x0096, 0x0046, 0x0126, 0x2091, 0x8000, 0x2b00, 0x9080, 0x8c94,
-	0x2005, 0x9005, 0x090c, 0x0d7d, 0x2004, 0x90a0, 0x000a, 0x080c,
-	0x1054, 0x01d0, 0x2900, 0x7026, 0xa803, 0x0000, 0xa807, 0x0000,
-	0x080c, 0x1054, 0x0188, 0x7024, 0xa802, 0xa807, 0x0000, 0x2900,
-	0x7026, 0x94a2, 0x000a, 0x0110, 0x0208, 0x0c90, 0x9085, 0x0001,
-	0x012e, 0x004e, 0x009e, 0x0005, 0x7024, 0x9005, 0x0dc8, 0x2048,
-	0xac00, 0x080c, 0x106d, 0x2400, 0x0cc0, 0x0126, 0x2091, 0x8000,
-	0x7024, 0x2048, 0x9005, 0x0130, 0xa800, 0x7026, 0xa803, 0x0000,
-	0xa807, 0x0000, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x7024,
-	0xa802, 0x2900, 0x7026, 0x012e, 0x0005, 0x0096, 0x9e80, 0x0009,
-	0x2004, 0x9005, 0x0138, 0x2048, 0xa800, 0x0006, 0x080c, 0x106d,
-	0x000e, 0x0cb8, 0x009e, 0x0005, 0x0096, 0x7008, 0x9005, 0x0138,
-	0x2048, 0xa800, 0x0006, 0x080c, 0x106d, 0x000e, 0x0cb8, 0x9006,
-	0x7002, 0x700a, 0x7006, 0x700e, 0x701a, 0x701e, 0x7022, 0x702a,
-	0x7026, 0x702e, 0x009e, 0x0005, 0x1a6b, 0x0000, 0x0000, 0x0000,
-	0x1930, 0x0000, 0x0000, 0x0000, 0x1888, 0x0000, 0x0000, 0x0000,
-	0x1877, 0x0000, 0x0000, 0x0000, 0x00e6, 0x00c6, 0x00b6, 0x00a6,
-	0xa8a8, 0x2040, 0x2071, 0x1877, 0x080c, 0x8db6, 0xa067, 0x0023,
-	0x6010, 0x905d, 0x0904, 0x8d8b, 0xb814, 0xa06e, 0xb910, 0xa172,
-	0xb9a0, 0xa176, 0x2001, 0x0003, 0xa07e, 0xa834, 0xa082, 0xa07b,
-	0x0000, 0xa898, 0x9005, 0x0118, 0xa078, 0xc085, 0xa07a, 0x2858,
-	0x2031, 0x0018, 0xa068, 0x908a, 0x0019, 0x1a0c, 0x0d7d, 0x2020,
-	0x2050, 0x2940, 0xa864, 0x90bc, 0x00ff, 0x908c, 0x000f, 0x91e0,
-	0x1e31, 0x2c65, 0x9786, 0x0024, 0x2c05, 0x1590, 0x908a, 0x0036,
-	0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002, 0x8cf8, 0x8cf8, 0x8cfa,
-	0x8cf8, 0x8cf8, 0x8cf8, 0x8cfc, 0x8cf8, 0x8cf8, 0x8cf8, 0x8cfe,
-	0x8cf8, 0x8cf8, 0x8cf8, 0x8d00, 0x8cf8, 0x8cf8, 0x8cf8, 0x8d02,
-	0x8cf8, 0x8cf8, 0x8cf8, 0x8d04, 0x8cf8, 0x8cf8, 0x8cf8, 0x8d06,
-	0x080c, 0x0d7d, 0xa180, 0x04b8, 0xa190, 0x04a8, 0xa1a0, 0x0498,
-	0xa1b0, 0x0488, 0xa1c0, 0x0478, 0xa1d0, 0x0468, 0xa1e0, 0x0458,
-	0x908a, 0x0034, 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002, 0x8d2a,
-	0x8d28, 0x8d28, 0x8d28, 0x8d28, 0x8d28, 0x8d2c, 0x8d28, 0x8d28,
-	0x8d28, 0x8d28, 0x8d28, 0x8d2e, 0x8d28, 0x8d28, 0x8d28, 0x8d28,
-	0x8d28, 0x8d30, 0x8d28, 0x8d28, 0x8d28, 0x8d28, 0x8d28, 0x8d32,
-	0x080c, 0x0d7d, 0xa180, 0x0038, 0xa198, 0x0028, 0xa1b0, 0x0018,
-	0xa1c8, 0x0008, 0xa1e0, 0x2600, 0x0002, 0x8d4e, 0x8d50, 0x8d52,
-	0x8d54, 0x8d56, 0x8d58, 0x8d5a, 0x8d5c, 0x8d5e, 0x8d60, 0x8d62,
-	0x8d64, 0x8d66, 0x8d68, 0x8d6a, 0x8d6c, 0x8d6e, 0x8d70, 0x8d72,
-	0x8d74, 0x8d76, 0x8d78, 0x8d7a, 0x8d7c, 0x8d7e, 0x080c, 0x0d7d,
-	0xb9e2, 0x0468, 0xb9de, 0x0458, 0xb9da, 0x0448, 0xb9d6, 0x0438,
-	0xb9d2, 0x0428, 0xb9ce, 0x0418, 0xb9ca, 0x0408, 0xb9c6, 0x00f8,
-	0xb9c2, 0x00e8, 0xb9be, 0x00d8, 0xb9ba, 0x00c8, 0xb9b6, 0x00b8,
-	0xb9b2, 0x00a8, 0xb9ae, 0x0098, 0xb9aa, 0x0088, 0xb9a6, 0x0078,
-	0xb9a2, 0x0068, 0xb99e, 0x0058, 0xb99a, 0x0048, 0xb996, 0x0038,
-	0xb992, 0x0028, 0xb98e, 0x0018, 0xb98a, 0x0008, 0xb986, 0x8631,
-	0x8421, 0x0120, 0x080c, 0x1e07, 0x0804, 0x8cd2, 0x00ae, 0x00be,
-	0x00ce, 0x00ee, 0x0005, 0xa86c, 0xa06e, 0xa870, 0xa072, 0xa077,
-	0x00ff, 0x9006, 0x0804, 0x8cb4, 0x0006, 0x0016, 0x00b6, 0x6010,
-	0x2058, 0xb810, 0x9005, 0x01b0, 0x2001, 0x1924, 0x2004, 0x9005,
-	0x0188, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x1158, 0x0036,
-	0x0046, 0xbba0, 0x2021, 0x0004, 0x2011, 0x8014, 0x080c, 0x4a38,
-	0x004e, 0x003e, 0x00be, 0x001e, 0x000e, 0x0005, 0x9016, 0x710c,
-	0xa834, 0x910a, 0xa936, 0x7008, 0x9005, 0x0120, 0x8210, 0x910a,
-	0x0238, 0x0130, 0x7010, 0x8210, 0x910a, 0x0210, 0x0108, 0x0cd8,
-	0xaa8a, 0xa26a, 0x0005, 0x00f6, 0x00d6, 0x0036, 0x2079, 0x0300,
-	0x781b, 0x0200, 0x7818, 0xd094, 0x1dd8, 0x781b, 0x0202, 0xa001,
-	0xa001, 0x7818, 0xd094, 0x1da0, 0xb8ac, 0x9005, 0x01b8, 0x2068,
-	0x2079, 0x0000, 0x2c08, 0x911e, 0x1118, 0x680c, 0xb8ae, 0x0060,
-	0x9106, 0x0140, 0x2d00, 0x2078, 0x680c, 0x9005, 0x090c, 0x0d7d,
-	0x2068, 0x0cb0, 0x6b0c, 0x7b0e, 0x600f, 0x0000, 0x2079, 0x0300,
-	0x781b, 0x0200, 0x003e, 0x00de, 0x00fe, 0x0005, 0x00e6, 0x00d6,
-	0x0096, 0x00c6, 0x0036, 0x0126, 0x2091, 0x8000, 0x0156, 0x20a9,
-	0x01ff, 0x2071, 0x0300, 0x701b, 0x0200, 0x7018, 0xd094, 0x0110,
-	0x1f04, 0x8e0b, 0x701b, 0x0202, 0xa001, 0xa001, 0x7018, 0xd094,
-	0x1d90, 0xb8ac, 0x9005, 0x01d0, 0x2060, 0x600c, 0xb8ae, 0x6003,
-	0x0004, 0x601b, 0x0000, 0x6013, 0x0000, 0x601f, 0x0101, 0x6014,
-	0x2048, 0xa88b, 0x0000, 0xa8a8, 0xa8ab, 0x0000, 0x904d, 0x090c,
-	0x0d7d, 0x080c, 0x106d, 0x080c, 0x89c6, 0x0c18, 0x2071, 0x0300,
-	0x701b, 0x0200, 0x015e, 0x012e, 0x003e, 0x00ce, 0x009e, 0x00de,
-	0x00ee, 0x0005, 0x00c6, 0x00b6, 0x0016, 0x0006, 0x0156, 0x080c,
-	0x25cf, 0x015e, 0x11b0, 0x080c, 0x64cc, 0x190c, 0x0d7d, 0x000e,
-	0x001e, 0xb912, 0xb816, 0x080c, 0xaa82, 0x0140, 0x2b00, 0x6012,
-	0x6023, 0x0001, 0x2009, 0x0001, 0x080c, 0xab77, 0x00be, 0x00ce,
-	0x0005, 0x000e, 0x001e, 0x0cd0, 0x0066, 0x6000, 0x90b2, 0x0016,
-	0x1a0c, 0x0d7d, 0x0013, 0x006e, 0x0005, 0x8e7d, 0x8e7d, 0x8e7d,
-	0x8e7f, 0x8ec8, 0x8e7d, 0x8e7d, 0x8e7d, 0x8f2b, 0x8e7d, 0x8f63,
-	0x8e7d, 0x8e7d, 0x8e7d, 0x8e7d, 0x8e7d, 0x080c, 0x0d7d, 0x9182,
-	0x0040, 0x0002, 0x8e92, 0x8e92, 0x8e92, 0x8e92, 0x8e92, 0x8e92,
-	0x8e92, 0x8e92, 0x8e92, 0x8e94, 0x8ea5, 0x8e92, 0x8e92, 0x8e92,
-	0x8e92, 0x8eb6, 0x080c, 0x0d7d, 0x0096, 0x6114, 0x2148, 0xa87b,
-	0x0000, 0x6010, 0x00b6, 0x2058, 0xb8bb, 0x0500, 0x00be, 0x080c,
-	0x6a7f, 0x080c, 0xaad8, 0x009e, 0x0005, 0x080c, 0x9505, 0x00d6,
-	0x6114, 0x080c, 0xc723, 0x0130, 0x0096, 0x6114, 0x2148, 0x080c,
-	0x6c7f, 0x009e, 0x00de, 0x080c, 0xaad8, 0x0005, 0x080c, 0x9505,
-	0x080c, 0x31ab, 0x6114, 0x0096, 0x2148, 0x080c, 0xc723, 0x0120,
-	0xa87b, 0x0029, 0x080c, 0x6c7f, 0x009e, 0x080c, 0xaad8, 0x0005,
-	0x601b, 0x0000, 0x9182, 0x0040, 0x0096, 0x0002, 0x8ee3, 0x8ee3,
-	0x8ee3, 0x8ee3, 0x8ee3, 0x8ee3, 0x8ee3, 0x8ee3, 0x8ee5, 0x8ee3,
-	0x8ee3, 0x8ee3, 0x8f27, 0x8ee3, 0x8ee3, 0x8ee3, 0x8ee3, 0x8ee3,
-	0x8ee3, 0x8eeb, 0x8ee3, 0x080c, 0x0d7d, 0x6114, 0x2148, 0xa938,
-	0x918e, 0xffff, 0x05e0, 0x00e6, 0x6114, 0x2148, 0x080c, 0x8c9c,
-	0x0096, 0xa8a8, 0x2048, 0x080c, 0x6a17, 0x009e, 0xa8ab, 0x0000,
-	0x6010, 0x9005, 0x0128, 0x00b6, 0x2058, 0x080c, 0x8dcb, 0x00be,
-	0xae88, 0x00b6, 0x2059, 0x0000, 0x080c, 0x89cf, 0x00be, 0x01e0,
-	0x2071, 0x193c, 0x080c, 0x8a16, 0x01b8, 0x9086, 0x0001, 0x1128,
-	0x2001, 0x1946, 0x2004, 0x9005, 0x1178, 0x0096, 0x080c, 0x103b,
-	0x2900, 0x009e, 0x0148, 0xa8aa, 0x00f6, 0x2c78, 0x080c, 0x898d,
-	0x00fe, 0x00ee, 0x009e, 0x0005, 0x080c, 0x89c6, 0x0cd0, 0x080c,
-	0x8fdf, 0x009e, 0x0005, 0x9182, 0x0040, 0x0096, 0x0002, 0x8f3f,
-	0x8f3f, 0x8f3f, 0x8f41, 0x8f3f, 0x8f3f, 0x8f3f, 0x8f61, 0x8f3f,
-	0x8f3f, 0x8f3f, 0x8f3f, 0x8f3f, 0x8f3f, 0x8f3f, 0x8f3f, 0x080c,
-	0x0d7d, 0x6003, 0x0003, 0x6106, 0x6014, 0x2048, 0xa8ac, 0xa836,
-	0xa8b0, 0xa83a, 0xa847, 0x0000, 0xa84b, 0x0000, 0xa884, 0x9092,
-	0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x8013, 0x8213, 0x9210,
-	0x621a, 0x080c, 0x1ba3, 0x2009, 0x8030, 0x080c, 0x912f, 0x009e,
-	0x0005, 0x080c, 0x0d7d, 0x080c, 0x9505, 0x6114, 0x2148, 0xa87b,
-	0x0000, 0x6010, 0x00b6, 0x2058, 0xb8bb, 0x0500, 0x00be, 0x080c,
-	0x6c7f, 0x080c, 0xaad8, 0x009e, 0x0005, 0x080c, 0xa781, 0x6144,
-	0xd1fc, 0x0120, 0xd1ac, 0x1110, 0x6003, 0x0003, 0x6000, 0x908a,
-	0x0016, 0x1a0c, 0x0d7d, 0x0096, 0x0023, 0x009e, 0x080c, 0xa79d,
-	0x0005, 0x8f99, 0x8f99, 0x8f99, 0x8f9b, 0x8fac, 0x8f99, 0x8f99,
-	0x8f99, 0x8f99, 0x8f99, 0x8f99, 0x8f99, 0x8f99, 0x8f99, 0x8f99,
-	0x8f99, 0x080c, 0x0d7d, 0x080c, 0xa915, 0x6114, 0x2148, 0xa87b,
-	0x0006, 0x6010, 0x00b6, 0x2058, 0xb8bb, 0x0500, 0x00be, 0x080c,
-	0x6c7f, 0x080c, 0xaad8, 0x0005, 0x0491, 0x0005, 0x080c, 0xa781,
-	0x6000, 0x6144, 0xd1fc, 0x0130, 0xd1ac, 0x1120, 0x6003, 0x0003,
-	0x2009, 0x0003, 0x908a, 0x0016, 0x1a0c, 0x0d7d, 0x0096, 0x0033,
-	0x009e, 0x0106, 0x080c, 0xa79d, 0x010e, 0x0005, 0x8fd6, 0x8fd6,
-	0x8fd6, 0x8fd8, 0x8fdf, 0x8fd6, 0x8fd6, 0x8fd6, 0x8fd6, 0x8fd6,
-	0x8fd6, 0x8fd6, 0x8fd6, 0x8fd6, 0x8fd6, 0x8fd6, 0x080c, 0x0d7d,
-	0x0036, 0x00e6, 0x080c, 0xa915, 0x00ee, 0x003e, 0x0005, 0x00f6,
-	0x00e6, 0x601b, 0x0000, 0x6014, 0x2048, 0x6010, 0x9005, 0x0128,
-	0x00b6, 0x2058, 0x080c, 0x8dcb, 0x00be, 0x2071, 0x193c, 0x080c,
-	0x8a16, 0x0160, 0x2001, 0x187f, 0x2004, 0xa88a, 0x2031, 0x0000,
-	0x2c78, 0x080c, 0x898d, 0x00ee, 0x00fe, 0x0005, 0x0096, 0xa88b,
-	0x0000, 0xa8a8, 0x2048, 0x080c, 0x106d, 0x009e, 0xa8ab, 0x0000,
-	0x080c, 0x89c6, 0x0c80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
-	0x0000, 0x0000, 0x0000, 0x0000, 0x187a, 0x0000, 0x0000, 0x0000,
-	0x0000, 0x0000, 0x0000, 0x0126, 0x2091, 0x8000, 0x0036, 0x0046,
-	0x20a9, 0x0010, 0x9006, 0x8004, 0x8086, 0x818e, 0x1208, 0x9200,
-	0x1f04, 0x9024, 0x8086, 0x818e, 0x004e, 0x003e, 0x012e, 0x0005,
-	0x0126, 0x2091, 0x8000, 0x0076, 0x0156, 0x20a9, 0x0010, 0x9005,
-	0x01c8, 0x911a, 0x12b8, 0x8213, 0x818d, 0x0228, 0x911a, 0x1220,
-	0x1f04, 0x903b, 0x0028, 0x911a, 0x2308, 0x8210, 0x1f04, 0x903b,
-	0x0006, 0x3200, 0x9084, 0xefff, 0x2080, 0x000e, 0x015e, 0x007e,
-	0x012e, 0x0005, 0x0006, 0x3200, 0x9085, 0x1000, 0x0ca8, 0x0126,
-	0x2091, 0x2800, 0x2079, 0x19e5, 0x012e, 0x00d6, 0x2069, 0x19e5,
-	0x6803, 0x0005, 0x0156, 0x0146, 0x01d6, 0x20e9, 0x0000, 0x2069,
-	0x0200, 0x080c, 0xa57b, 0x04a9, 0x080c, 0xa566, 0x0491, 0x080c,
-	0xa569, 0x0479, 0x080c, 0xa56c, 0x0461, 0x080c, 0xa56f, 0x0449,
-	0x080c, 0xa572, 0x0431, 0x080c, 0xa575, 0x0419, 0x080c, 0xa578,
-	0x0401, 0x01de, 0x014e, 0x015e, 0x6857, 0x0000, 0x00f6, 0x2079,
-	0x0380, 0x00f9, 0x7807, 0x0003, 0x7803, 0x0000, 0x7803, 0x0001,
-	0x2069, 0x0004, 0x2d04, 0x9084, 0xfffe, 0x9085, 0x8000, 0x206a,
-	0x2069, 0x0100, 0x6828, 0x9084, 0xfffc, 0x682a, 0x00fe, 0x00de,
-	0x0005, 0x20a9, 0x0020, 0x20a1, 0x0240, 0x2001, 0x0000, 0x4004,
-	0x0005, 0x00c6, 0x7803, 0x0000, 0x9006, 0x7827, 0x0030, 0x782b,
-	0x0400, 0x7827, 0x0031, 0x782b, 0x1aed, 0x781f, 0xff00, 0x781b,
-	0xff00, 0x2061, 0x1ae2, 0x602f, 0x19e5, 0x6033, 0x1800, 0x6037,
-	0x1a01, 0x603b, 0x1e31, 0x603f, 0x1e41, 0x6042, 0x6047, 0x1ab8,
-	0x00ce, 0x0005, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086,
-	0x0001, 0x01b0, 0x00c6, 0x6146, 0x600f, 0x0000, 0x2c08, 0x2061,
-	0x19e5, 0x602c, 0x8000, 0x602e, 0x601c, 0x9005, 0x0130, 0x9080,
-	0x0003, 0x2102, 0x611e, 0x00ce, 0x0005, 0x6122, 0x611e, 0x0cd8,
-	0x6146, 0x2c08, 0x2001, 0x0012, 0x080c, 0xa772, 0x0005, 0x0016,
-	0x2009, 0x8020, 0x6146, 0x2c08, 0x2001, 0x0382, 0x2004, 0x9084,
-	0x0007, 0x9086, 0x0001, 0x1128, 0x2001, 0x0019, 0x080c, 0xa772,
-	0x0088, 0x00c6, 0x2061, 0x19e5, 0x602c, 0x8000, 0x602e, 0x600c,
-	0x9005, 0x0128, 0x9080, 0x0003, 0x2102, 0x610e, 0x0010, 0x6112,
-	0x610e, 0x00ce, 0x001e, 0x0005, 0x2001, 0x0382, 0x2004, 0x9084,
-	0x0007, 0x9086, 0x0001, 0x0198, 0x00c6, 0x6146, 0x600f, 0x0000,
-	0x2c08, 0x2061, 0x19e5, 0x6044, 0x9005, 0x0130, 0x9080, 0x0003,
-	0x2102, 0x6146, 0x00ce, 0x0005, 0x614a, 0x6146, 0x0cd8, 0x6146,
-	0x600f, 0x0000, 0x2c08, 0x2001, 0x0013, 0x080c, 0xa772, 0x0005,
-	0x6044, 0xd0dc, 0x0128, 0x9006, 0x7007, 0x0000, 0x700a, 0x7032,
-	0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x00b6, 0x0096, 0x0076,
-	0x0066, 0x0056, 0x0036, 0x0026, 0x0016, 0x0006, 0x0126, 0x902e,
-	0x2071, 0x19e5, 0x7648, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff,
-	0x0904, 0x91ba, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x91b5,
-	0x87ff, 0x0120, 0x605c, 0x9106, 0x1904, 0x91b5, 0x704c, 0x9c06,
-	0x1178, 0x0036, 0x2019, 0x0001, 0x080c, 0x9fef, 0x703f, 0x0000,
-	0x9006, 0x704e, 0x706a, 0x7052, 0x706e, 0x003e, 0x2029, 0x0001,
-	0x080c, 0x9138, 0x7048, 0x9c36, 0x1110, 0x660c, 0x764a, 0x7044,
-	0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7046, 0x0010,
-	0x7047, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e,
-	0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xc723, 0x01c8, 0x6014,
-	0x2048, 0x6020, 0x9086, 0x0003, 0x1560, 0xa867, 0x0103, 0xab7a,
-	0xa877, 0x0000, 0x0016, 0x0036, 0x0076, 0x080c, 0xca1a, 0x080c,
-	0xe4e4, 0x080c, 0x6c7f, 0x007e, 0x003e, 0x001e, 0x080c, 0xc90b,
-	0x080c, 0xab13, 0x00ce, 0x0804, 0x9157, 0x2c78, 0x600c, 0x2060,
-	0x0804, 0x9157, 0x012e, 0x000e, 0x001e, 0x002e, 0x003e, 0x005e,
-	0x006e, 0x007e, 0x009e, 0x00be, 0x00ce, 0x00de, 0x00ee, 0x00fe,
-	0x0005, 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0076,
-	0x080c, 0xe4e4, 0x080c, 0xe134, 0x007e, 0x003e, 0x001e, 0x08c0,
-	0x6020, 0x9086, 0x0009, 0x1168, 0xa87b, 0x0006, 0x0016, 0x0036,
-	0x0076, 0x080c, 0x6c7f, 0x080c, 0xaad8, 0x007e, 0x003e, 0x001e,
-	0x0848, 0x6020, 0x9086, 0x000a, 0x0904, 0x919f, 0x0804, 0x919d,
-	0x0006, 0x0066, 0x0096, 0x00c6, 0x00d6, 0x00f6, 0x9036, 0x0126,
-	0x2091, 0x8000, 0x2079, 0x19e5, 0x7848, 0x9065, 0x0904, 0x924f,
-	0x600c, 0x0006, 0x600f, 0x0000, 0x784c, 0x9c06, 0x11a0, 0x0036,
-	0x2019, 0x0001, 0x080c, 0x9fef, 0x783f, 0x0000, 0x901e, 0x7b4e,
-	0x7b6a, 0x7b52, 0x7b6e, 0x003e, 0x000e, 0x9005, 0x1118, 0x600c,
-	0x600f, 0x0000, 0x0006, 0x00e6, 0x2f70, 0x080c, 0x9138, 0x00ee,
-	0x080c, 0xc723, 0x0520, 0x6014, 0x2048, 0x6020, 0x9086, 0x0003,
-	0x1580, 0x3e08, 0x918e, 0x0002, 0x1188, 0x6010, 0x9005, 0x0170,
-	0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0140, 0x6048, 0x9005,
-	0x1198, 0x2001, 0x1986, 0x2004, 0x604a, 0x0070, 0xa867, 0x0103,
-	0xab7a, 0xa877, 0x0000, 0x080c, 0x6c73, 0x080c, 0xc90b, 0x6044,
-	0xc0fc, 0x6046, 0x080c, 0xab13, 0x000e, 0x0804, 0x91fd, 0x7e4a,
-	0x7e46, 0x012e, 0x00fe, 0x00de, 0x00ce, 0x009e, 0x006e, 0x000e,
-	0x0005, 0x6020, 0x9086, 0x0006, 0x1118, 0x080c, 0xe134, 0x0c38,
-	0x6020, 0x9086, 0x0009, 0x1130, 0xab7a, 0x080c, 0x6c7f, 0x080c,
-	0xaad8, 0x0c10, 0x6020, 0x9086, 0x000a, 0x0990, 0x0878, 0x0016,
-	0x0026, 0x0086, 0x9046, 0x00a9, 0x080c, 0x9360, 0x008e, 0x002e,
-	0x001e, 0x0005, 0x00f6, 0x0126, 0x2079, 0x19e5, 0x2091, 0x8000,
-	0x080c, 0x93a9, 0x080c, 0x943d, 0x080c, 0x66ba, 0x012e, 0x00fe,
-	0x0005, 0x00b6, 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066,
-	0x0016, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e5, 0x7620,
-	0x2660, 0x2678, 0x8cff, 0x0904, 0x9325, 0x6010, 0x2058, 0xb8a0,
-	0x9206, 0x1904, 0x9320, 0x88ff, 0x0120, 0x605c, 0x9106, 0x1904,
-	0x9320, 0x7030, 0x9c06, 0x1570, 0x2069, 0x0100, 0x6820, 0xd0a4,
-	0x1508, 0x080c, 0x85c0, 0x080c, 0x9d09, 0x68c3, 0x0000, 0x080c,
-	0xa223, 0x7033, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384,
-	0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x29d1, 0x9006, 0x080c,
-	0x29d1, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001,
-	0x003e, 0x0040, 0x7008, 0xc0ad, 0x700a, 0x6003, 0x0009, 0x630a,
-	0x0804, 0x9320, 0x7020, 0x9c36, 0x1110, 0x660c, 0x7622, 0x701c,
-	0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x701e, 0x0010,
-	0x701f, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e,
-	0x0008, 0x2678, 0x600f, 0x0000, 0x6044, 0xc0fc, 0x6046, 0x6014,
-	0x2048, 0x080c, 0xc723, 0x01e8, 0x6020, 0x9086, 0x0003, 0x1580,
-	0x080c, 0xc931, 0x1118, 0x080c, 0xb4a0, 0x0098, 0xa867, 0x0103,
-	0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, 0x0086, 0x080c, 0xca1a,
-	0x080c, 0xe4e4, 0x080c, 0x6c7f, 0x008e, 0x003e, 0x001e, 0x080c,
-	0xc90b, 0x080c, 0xab13, 0x080c, 0xa0f9, 0x00ce, 0x0804, 0x929a,
-	0x2c78, 0x600c, 0x2060, 0x0804, 0x929a, 0x012e, 0x000e, 0x001e,
-	0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, 0x00be, 0x0005,
-	0x6020, 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0086, 0x080c,
-	0xe4e4, 0x080c, 0xe134, 0x008e, 0x003e, 0x001e, 0x08d0, 0x080c,
-	0xb4a0, 0x6020, 0x9086, 0x0002, 0x1160, 0x6004, 0x0006, 0x9086,
-	0x0085, 0x000e, 0x0904, 0x9306, 0x9086, 0x008b, 0x0904, 0x9306,
-	0x0840, 0x6020, 0x9086, 0x0005, 0x1920, 0x6004, 0x0006, 0x9086,
-	0x0085, 0x000e, 0x09c8, 0x9086, 0x008b, 0x09b0, 0x0804, 0x9319,
-	0x0006, 0x00f6, 0x00e6, 0x0096, 0x00b6, 0x00c6, 0x0066, 0x0016,
-	0x0126, 0x2091, 0x8000, 0x9280, 0x1000, 0x2004, 0x905d, 0x2079,
-	0x19e5, 0x9036, 0x7828, 0x2060, 0x8cff, 0x0538, 0x6010, 0x9b06,
-	0x1500, 0x6043, 0xffff, 0x080c, 0xa960, 0x01d8, 0x610c, 0x0016,
-	0x080c, 0x9e79, 0x6014, 0x2048, 0xa867, 0x0103, 0xab7a, 0xa877,
-	0x0000, 0x0016, 0x0036, 0x0086, 0x080c, 0xca1a, 0x080c, 0xe4e4,
-	0x080c, 0x6c7f, 0x008e, 0x003e, 0x001e, 0x080c, 0xab13, 0x00ce,
-	0x08d8, 0x2c30, 0x600c, 0x2060, 0x08b8, 0x080c, 0x66d7, 0x012e,
-	0x001e, 0x006e, 0x00ce, 0x00be, 0x009e, 0x00ee, 0x00fe, 0x000e,
-	0x0005, 0x0096, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x9036, 0x7820,
-	0x9065, 0x0904, 0x9410, 0x600c, 0x0006, 0x6044, 0xc0fc, 0x6046,
-	0x600f, 0x0000, 0x7830, 0x9c06, 0x1588, 0x2069, 0x0100, 0x6820,
-	0xd0a4, 0x1508, 0x080c, 0x85c0, 0x080c, 0x9d09, 0x68c3, 0x0000,
-	0x080c, 0xa223, 0x7833, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04,
-	0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x29d1, 0x9006,
-	0x080c, 0x29d1, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827,
-	0x0001, 0x003e, 0x0058, 0x080c, 0x6902, 0x1538, 0x6003, 0x0009,
-	0x630a, 0x7808, 0xc0ad, 0x780a, 0x2c30, 0x00f8, 0x6014, 0x2048,
-	0x080c, 0xc721, 0x01b0, 0x6020, 0x9086, 0x0003, 0x1508, 0x080c,
-	0xc931, 0x1118, 0x080c, 0xb4a0, 0x0060, 0x080c, 0x6902, 0x1168,
-	0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6c7f, 0x080c,
-	0xc90b, 0x080c, 0xab13, 0x080c, 0xa0f9, 0x000e, 0x0804, 0x93b0,
-	0x7e22, 0x7e1e, 0x00de, 0x00ce, 0x006e, 0x000e, 0x009e, 0x0005,
-	0x6020, 0x9086, 0x0006, 0x1118, 0x080c, 0xe134, 0x0c50, 0x080c,
-	0xb4a0, 0x6020, 0x9086, 0x0002, 0x1150, 0x6004, 0x0006, 0x9086,
-	0x0085, 0x000e, 0x0990, 0x9086, 0x008b, 0x0978, 0x08d0, 0x6020,
-	0x9086, 0x0005, 0x19b0, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e,
-	0x0d18, 0x9086, 0x008b, 0x0d00, 0x0860, 0x0006, 0x0096, 0x00b6,
-	0x00c6, 0x0066, 0x9036, 0x7828, 0x9065, 0x0510, 0x6010, 0x2058,
-	0x600c, 0x0006, 0x3e08, 0x918e, 0x0002, 0x1118, 0xb800, 0xd0bc,
-	0x11a8, 0x6043, 0xffff, 0x080c, 0xa960, 0x0180, 0x610c, 0x080c,
-	0x9e79, 0x6014, 0x2048, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000,
-	0x080c, 0x6c7f, 0x080c, 0xab13, 0x000e, 0x08f0, 0x2c30, 0x0ce0,
-	0x006e, 0x00ce, 0x00be, 0x009e, 0x000e, 0x0005, 0x00e6, 0x00d6,
-	0x0096, 0x0066, 0x080c, 0x6053, 0x11b0, 0x2071, 0x19e5, 0x7030,
-	0x9080, 0x0005, 0x2004, 0x904d, 0x0170, 0xa878, 0x9606, 0x1158,
-	0x2071, 0x19e5, 0x7030, 0x9035, 0x0130, 0x9080, 0x0005, 0x2004,
-	0x9906, 0x1108, 0x0029, 0x006e, 0x009e, 0x00de, 0x00ee, 0x0005,
-	0x00c6, 0x2660, 0x6043, 0xffff, 0x080c, 0xa960, 0x0178, 0x080c,
-	0x9e79, 0x6014, 0x2048, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000,
-	0x080c, 0xca1a, 0x080c, 0x6c7f, 0x080c, 0xab13, 0x00ce, 0x0005,
-	0x00b6, 0x00e6, 0x00c6, 0x080c, 0xa7df, 0x0106, 0x190c, 0xa781,
-	0x2071, 0x0101, 0x2e04, 0xc0c4, 0x2072, 0x6044, 0xd0fc, 0x1138,
-	0x010e, 0x190c, 0xa79d, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x2071,
-	0x19e5, 0x7030, 0x9005, 0x0da0, 0x9c06, 0x190c, 0x0d7d, 0x7036,
-	0x080c, 0x85c0, 0x7004, 0x9084, 0x0007, 0x0002, 0x94d8, 0x94da,
-	0x94e1, 0x94eb, 0x94f9, 0x94d8, 0x94e1, 0x94d6, 0x080c, 0x0d7d,
-	0x0428, 0x0005, 0x080c, 0xa94b, 0x7007, 0x0000, 0x7033, 0x0000,
-	0x00e8, 0x0066, 0x9036, 0x080c, 0x9e79, 0x006e, 0x7007, 0x0000,
-	0x7033, 0x0000, 0x0098, 0x080c, 0xa936, 0x0140, 0x080c, 0xa94b,
-	0x0128, 0x0066, 0x9036, 0x080c, 0x9e79, 0x006e, 0x7033, 0x0000,
-	0x0028, 0x080c, 0xa936, 0x080c, 0xa223, 0x0000, 0x010e, 0x190c,
-	0xa79d, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x00d6, 0x00c6, 0x080c,
-	0xa7df, 0x0106, 0x190c, 0xa781, 0x6044, 0xd0fc, 0x1130, 0x010e,
-	0x190c, 0xa79d, 0x00ce, 0x00de, 0x0005, 0x2069, 0x19e5, 0x684c,
-	0x9005, 0x0da8, 0x9c06, 0x190c, 0x0d7d, 0x6852, 0x00e6, 0x2d70,
-	0x080c, 0x9138, 0x00ee, 0x080c, 0x85cd, 0x0016, 0x2009, 0x0040,
-	0x080c, 0x2184, 0x001e, 0x683c, 0x9084, 0x0003, 0x0002, 0x9535,
-	0x9536, 0x9554, 0x9533, 0x080c, 0x0d7d, 0x0460, 0x6868, 0x9086,
-	0x0001, 0x0190, 0x600c, 0x9015, 0x0160, 0x6a4a, 0x600f, 0x0000,
-	0x6044, 0xc0fc, 0x6046, 0x9006, 0x7042, 0x684e, 0x683f, 0x0000,
-	0x00c8, 0x684a, 0x6846, 0x0ca0, 0x686b, 0x0000, 0x6848, 0x9065,
-	0x0d78, 0x6003, 0x0002, 0x0c60, 0x9006, 0x686a, 0x6852, 0x686e,
-	0x600c, 0x9015, 0x0120, 0x6a4a, 0x600f, 0x0000, 0x0018, 0x684e,
-	0x684a, 0x6846, 0x684f, 0x0000, 0x010e, 0x190c, 0xa79d, 0x00ce,
-	0x00de, 0x0005, 0x0005, 0x6020, 0x9084, 0x000f, 0x000b, 0x0005,
-	0x9580, 0x9583, 0x99f1, 0x9a80, 0x9583, 0x99f1, 0x9a80, 0x9580,
-	0x9583, 0x9580, 0x9580, 0x9580, 0x9580, 0x9580, 0x9580, 0x9580,
-	0x080c, 0x94a8, 0x0005, 0x00b6, 0x0156, 0x0136, 0x0146, 0x01c6,
-	0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071,
-	0x0240, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0d7d, 0x6110, 0x2158,
-	0xb984, 0x2c78, 0x2061, 0x0100, 0x619a, 0x908a, 0x0040, 0x1a04,
-	0x95ef, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce,
-	0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0x9774, 0x97af, 0x97d8,
-	0x9880, 0x98a2, 0x98a8, 0x98b5, 0x98bd, 0x98c9, 0x98cf, 0x98e0,
-	0x98cf, 0x9938, 0x98bd, 0x9944, 0x994a, 0x98c9, 0x994a, 0x9956,
-	0x95ed, 0x95ed, 0x95ed, 0x95ed, 0x95ed, 0x95ed, 0x95ed, 0x95ed,
-	0x95ed, 0x95ed, 0x95ed, 0x9e9a, 0x9ebd, 0x9ece, 0x9eee, 0x9f20,
-	0x98b5, 0x95ed, 0x98b5, 0x98cf, 0x95ed, 0x97d8, 0x9880, 0x95ed,
-	0xa316, 0x98cf, 0x95ed, 0xa332, 0x98cf, 0x95ed, 0x98c9, 0x976e,
-	0x9610, 0x95ed, 0xa34e, 0xa3bb, 0xa49b, 0x95ed, 0xa4a8, 0x98b2,
-	0xa4d3, 0x95ed, 0x9f2a, 0xa4df, 0x95ed, 0x080c, 0x0d7d, 0x2100,
-	0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e,
-	0x013e, 0x015e, 0x00be, 0x0005, 0xa57f, 0xa631, 0x960e, 0x9637,
-	0x96e3, 0x96ee, 0x960e, 0x98b5, 0x960e, 0x9735, 0x9741, 0x9652,
-	0x960e, 0x966d, 0x96a1, 0xa9b6, 0xa9fb, 0x98cf, 0x080c, 0x0d7d,
-	0x00d6, 0x0096, 0x080c, 0x9969, 0x7003, 0x2414, 0x7007, 0x0018,
-	0x700b, 0x0800, 0x7814, 0x2048, 0xa83c, 0x700e, 0xa850, 0x7022,
-	0xa854, 0x7026, 0x60c3, 0x0018, 0x080c, 0x9cd9, 0x009e, 0x00de,
-	0x0005, 0x7810, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x080c, 0xaa42,
-	0x1118, 0x9084, 0xff80, 0x0110, 0x9085, 0x0001, 0x0005, 0x00d6,
-	0x0096, 0x080c, 0x9969, 0x7003, 0x0500, 0x7814, 0x2048, 0xa874,
-	0x700a, 0xa878, 0x700e, 0xa87c, 0x7012, 0xa880, 0x7016, 0xa884,
-	0x701a, 0xa888, 0x701e, 0x60c3, 0x0010, 0x080c, 0x9cd9, 0x009e,
-	0x00de, 0x0005, 0x00d6, 0x0096, 0x080c, 0x9969, 0x7003, 0x0500,
-	0x7814, 0x2048, 0xa8cc, 0x700a, 0xa8d0, 0x700e, 0xa8d4, 0x7012,
-	0xa8d8, 0x7016, 0xa8dc, 0x701a, 0xa8e0, 0x701e, 0x60c3, 0x0010,
-	0x080c, 0x9cd9, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x0126,
-	0x2091, 0x8000, 0x080c, 0x9969, 0x20e9, 0x0000, 0x2001, 0x19a1,
-	0x2003, 0x0000, 0x7814, 0x2048, 0xa814, 0x8003, 0x60c2, 0xa830,
-	0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x2001,
-	0x19a1, 0x0016, 0x200c, 0x2001, 0x0001, 0x080c, 0x2169, 0x080c,
-	0xd484, 0x9006, 0x080c, 0x2169, 0x001e, 0xa804, 0x9005, 0x0110,
-	0x2048, 0x0c28, 0x04d9, 0x080c, 0x9cd9, 0x012e, 0x009e, 0x00de,
-	0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, 0x080c, 0x99b4,
-	0x20e9, 0x0000, 0x2001, 0x19a1, 0x2003, 0x0000, 0x7814, 0x2048,
-	0xa86f, 0x0200, 0xa873, 0x0000, 0xa814, 0x8003, 0x60c2, 0xa830,
-	0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x2001,
-	0x19a1, 0x0016, 0x200c, 0x080c, 0xd484, 0x001e, 0xa804, 0x9005,
-	0x0110, 0x2048, 0x0c60, 0x0051, 0x7814, 0x2048, 0x080c, 0x0fed,
-	0x080c, 0x9cd9, 0x012e, 0x009e, 0x00de, 0x0005, 0x60c0, 0x8004,
-	0x9084, 0x0003, 0x9005, 0x0130, 0x9082, 0x0004, 0x20a3, 0x0000,
-	0x8000, 0x1de0, 0x0005, 0x080c, 0x9969, 0x7003, 0x7800, 0x7808,
-	0x8007, 0x700a, 0x60c3, 0x0008, 0x0804, 0x9cd9, 0x00d6, 0x00e6,
-	0x080c, 0x99b4, 0x7814, 0x9084, 0xff00, 0x2073, 0x0200, 0x8e70,
-	0x8e70, 0x9095, 0x0010, 0x2272, 0x8e70, 0x2073, 0x0034, 0x8e70,
-	0x2069, 0x1805, 0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04,
-	0x9704, 0x2069, 0x1801, 0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70,
-	0x1f04, 0x970d, 0x2069, 0x19b1, 0x9086, 0xdf00, 0x0110, 0x2069,
-	0x19cb, 0x20a9, 0x001a, 0x9e86, 0x0260, 0x1148, 0x00c6, 0x2061,
-	0x0200, 0x6010, 0x8000, 0x6012, 0x00ce, 0x2071, 0x0240, 0x2d04,
-	0x8007, 0x2072, 0x8d68, 0x8e70, 0x1f04, 0x971b, 0x60c3, 0x004c,
-	0x080c, 0x9cd9, 0x00ee, 0x00de, 0x0005, 0x080c, 0x9969, 0x7003,
-	0x6300, 0x7007, 0x0028, 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804,
-	0x9cd9, 0x00d6, 0x0026, 0x0016, 0x080c, 0x99b4, 0x7003, 0x0200,
-	0x7814, 0x700e, 0x00e6, 0x9ef0, 0x0004, 0x2009, 0x0001, 0x2011,
-	0x000c, 0x2069, 0x1923, 0x6810, 0xd084, 0x1148, 0x2073, 0x0500,
-	0x8e70, 0x2073, 0x0000, 0x8e70, 0x8108, 0x9290, 0x0004, 0x2073,
-	0x0800, 0x8e70, 0x2073, 0x0000, 0x00ee, 0x7206, 0x710a, 0x62c2,
-	0x080c, 0x9cd9, 0x001e, 0x002e, 0x00de, 0x0005, 0x2001, 0x1818,
-	0x2004, 0x609a, 0x0804, 0x9cd9, 0x080c, 0x9969, 0x7003, 0x5200,
-	0x2069, 0x1847, 0x6804, 0xd084, 0x0130, 0x6828, 0x0016, 0x080c,
-	0x2602, 0x710e, 0x001e, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099,
-	0x1805, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x4003, 0x20a9, 0x0004,
-	0x2099, 0x1801, 0x20a1, 0x0254, 0x4003, 0x080c, 0xaa42, 0x1120,
-	0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, 0x181f, 0x2004, 0x7032,
-	0x2001, 0x1820, 0x2004, 0x7036, 0x0030, 0x2001, 0x1818, 0x2004,
-	0x9084, 0x00ff, 0x7036, 0x60c3, 0x001c, 0x0804, 0x9cd9, 0x080c,
-	0x9969, 0x7003, 0x0500, 0x080c, 0xaa42, 0x1120, 0xb8a0, 0x9082,
-	0x007f, 0x0248, 0x2001, 0x181f, 0x2004, 0x700a, 0x2001, 0x1820,
-	0x2004, 0x700e, 0x0030, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff,
-	0x700e, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9,
-	0x0000, 0x20a1, 0x0250, 0x4003, 0x60c3, 0x0010, 0x0804, 0x9cd9,
-	0x080c, 0x9969, 0x9006, 0x080c, 0x6934, 0xb8a0, 0x9086, 0x007e,
-	0x1130, 0x7003, 0x0400, 0x620c, 0xc2b4, 0x620e, 0x0058, 0x7814,
-	0x0096, 0x904d, 0x0120, 0x9006, 0xa89a, 0xa8a6, 0xa8aa, 0x009e,
-	0x7003, 0x0300, 0xb8a0, 0x9086, 0x007e, 0x1904, 0x9847, 0x00d6,
-	0x2069, 0x196c, 0x2001, 0x1837, 0x2004, 0xd0a4, 0x0188, 0x6800,
-	0x700a, 0x6808, 0x9084, 0x2000, 0x7012, 0x080c, 0xaa59, 0x680c,
-	0x7016, 0x701f, 0x2710, 0x6818, 0x7022, 0x681c, 0x7026, 0x0090,
-	0x6800, 0x700a, 0x6804, 0x700e, 0x6808, 0x080c, 0x73e4, 0x1118,
-	0x9084, 0x37ff, 0x0010, 0x9084, 0x3fff, 0x7012, 0x080c, 0xaa59,
-	0x680c, 0x7016, 0x00de, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099,
-	0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004,
-	0x2099, 0x1801, 0x20a1, 0x025a, 0x4003, 0x00d6, 0x080c, 0xa566,
-	0x2069, 0x1974, 0x2071, 0x024e, 0x6800, 0xc0dd, 0x7002, 0x080c,
-	0x5600, 0xd0e4, 0x0110, 0x680c, 0x700e, 0x00de, 0x04a8, 0x2001,
-	0x1837, 0x2004, 0xd0a4, 0x0170, 0x0016, 0x2001, 0x196d, 0x200c,
-	0x60e0, 0x9106, 0x0130, 0x2100, 0x60e3, 0x0000, 0x080c, 0x2643,
-	0x61e2, 0x001e, 0x20e1, 0x0001, 0x2099, 0x196c, 0x20e9, 0x0000,
-	0x20a1, 0x024e, 0x20a9, 0x0008, 0x4003, 0x20a9, 0x0004, 0x2099,
-	0x1805, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801,
-	0x20a1, 0x025a, 0x4003, 0x080c, 0xa566, 0x20a1, 0x024e, 0x20a9,
-	0x0008, 0x2099, 0x1974, 0x4003, 0x60c3, 0x0074, 0x0804, 0x9cd9,
-	0x080c, 0x9969, 0x7003, 0x2010, 0x7007, 0x0014, 0x700b, 0x0800,
-	0x700f, 0x2000, 0x9006, 0x00f6, 0x2079, 0x1847, 0x7904, 0x00fe,
-	0xd1ac, 0x1110, 0x9085, 0x0020, 0xd1a4, 0x0110, 0x9085, 0x0010,
-	0x9085, 0x0002, 0x00d6, 0x0804, 0x9919, 0x7026, 0x60c3, 0x0014,
-	0x0804, 0x9cd9, 0x080c, 0x9969, 0x7003, 0x5000, 0x0804, 0x97f2,
-	0x080c, 0x9969, 0x7003, 0x2110, 0x7007, 0x0014, 0x60c3, 0x0014,
-	0x0804, 0x9cd9, 0x080c, 0x99ab, 0x0010, 0x080c, 0x99b4, 0x7003,
-	0x0200, 0x60c3, 0x0004, 0x0804, 0x9cd9, 0x080c, 0x99b4, 0x7003,
-	0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804,
-	0x9cd9, 0x080c, 0x99b4, 0x7003, 0x0200, 0x0804, 0x97f2, 0x080c,
-	0x99b4, 0x7003, 0x0100, 0x782c, 0x9005, 0x0110, 0x700a, 0x0010,
-	0x700b, 0x0003, 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9cd9,
-	0x00d6, 0x080c, 0x99b4, 0x7003, 0x0210, 0x7007, 0x0014, 0x700b,
-	0x0800, 0xb894, 0x9086, 0x0014, 0x1198, 0xb99c, 0x9184, 0x0030,
-	0x0190, 0xb998, 0x9184, 0xc000, 0x1140, 0xd1ec, 0x0118, 0x700f,
-	0x2100, 0x0058, 0x700f, 0x0100, 0x0040, 0x700f, 0x0400, 0x0028,
-	0x700f, 0x0700, 0x0010, 0x700f, 0x0800, 0x00f6, 0x2079, 0x1847,
-	0x7904, 0x00fe, 0xd1ac, 0x1110, 0x9085, 0x0020, 0xd1a4, 0x0110,
-	0x9085, 0x0010, 0x2009, 0x1869, 0x210c, 0xd184, 0x1110, 0x9085,
-	0x0002, 0x0026, 0x2009, 0x1867, 0x210c, 0xd1e4, 0x0150, 0xc0c5,
-	0xbad4, 0xd28c, 0x1108, 0xc0cd, 0x9094, 0x0030, 0x9296, 0x0010,
-	0x0140, 0xd1ec, 0x0130, 0x9094, 0x0030, 0x9296, 0x0010, 0x0108,
-	0xc0bd, 0x002e, 0x7026, 0x60c3, 0x0014, 0x00de, 0x0804, 0x9cd9,
-	0x080c, 0x99b4, 0x7003, 0x0210, 0x7007, 0x0014, 0x700f, 0x0100,
-	0x60c3, 0x0014, 0x0804, 0x9cd9, 0x080c, 0x99b4, 0x7003, 0x0200,
-	0x0804, 0x9778, 0x080c, 0x99b4, 0x7003, 0x0100, 0x700b, 0x0003,
-	0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0x9cd9, 0x080c, 0x99b4,
-	0x7003, 0x0100, 0x700b, 0x000b, 0x60c3, 0x0008, 0x0804, 0x9cd9,
-	0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x3200, 0x2021, 0x0800,
-	0x0040, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x2200, 0x2021,
-	0x0100, 0x080c, 0xa57b, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006,
-	0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x9485, 0x0029,
-	0x7012, 0x004e, 0x003e, 0x00de, 0x080c, 0x9ccd, 0x721a, 0x9f95,
-	0x0000, 0x7222, 0x7027, 0xffff, 0x2071, 0x024c, 0x002e, 0x0005,
-	0x0026, 0x080c, 0xa57b, 0x7003, 0x02ff, 0x7007, 0xfffc, 0x00d6,
-	0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x00de, 0x7013,
-	0x2029, 0x0c10, 0x7003, 0x0100, 0x7007, 0x0000, 0x700b, 0xfc02,
-	0x700f, 0x0000, 0x0005, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019,
-	0x3300, 0x2021, 0x0800, 0x0040, 0x0026, 0x00d6, 0x0036, 0x0046,
-	0x2019, 0x2300, 0x2021, 0x0100, 0x080c, 0xa57b, 0xb810, 0x9305,
-	0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0xb810, 0x9005, 0x1140,
-	0xb814, 0x9005, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, 0x0020,
-	0x687c, 0x700a, 0x6880, 0x700e, 0x0000, 0x9485, 0x0098, 0x7012,
-	0x004e, 0x003e, 0x00de, 0x080c, 0x9ccd, 0x721a, 0x7a08, 0x7222,
-	0x2f10, 0x7226, 0x2071, 0x024c, 0x002e, 0x0005, 0x080c, 0x9ccd,
-	0x721a, 0x7a08, 0x7222, 0x7814, 0x7026, 0x2071, 0x024c, 0x002e,
-	0x0005, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200,
-	0x2071, 0x0240, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d7d, 0x908a,
-	0x0092, 0x1a0c, 0x0d7d, 0x6110, 0x2158, 0xb984, 0x2c78, 0x2061,
-	0x0100, 0x619a, 0x9082, 0x0085, 0x0033, 0x00fe, 0x00ee, 0x00de,
-	0x00ce, 0x00be, 0x0005, 0x9a22, 0x9a31, 0x9a3c, 0x9a20, 0x9a20,
-	0x9a20, 0x9a22, 0x9a20, 0x9a20, 0x9a20, 0x9a20, 0x9a20, 0x9a20,
-	0x080c, 0x0d7d, 0x0411, 0x60c3, 0x0000, 0x0026, 0x080c, 0x2940,
-	0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x0804,
-	0x9cd9, 0x0431, 0x7808, 0x700a, 0x7814, 0x700e, 0x7017, 0xffff,
-	0x60c3, 0x000c, 0x0804, 0x9cd9, 0x0479, 0x7003, 0x0003, 0x7007,
-	0x0300, 0x60c3, 0x0004, 0x0804, 0x9cd9, 0x0026, 0x080c, 0xa57b,
-	0xb810, 0x9085, 0x8100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800,
-	0x687c, 0x700a, 0x6880, 0x700e, 0x7013, 0x0009, 0x0804, 0x9984,
-	0x0026, 0x080c, 0xa57b, 0xb810, 0x9085, 0x8400, 0x7002, 0xb814,
-	0x7006, 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x2001,
-	0x0099, 0x7012, 0x0804, 0x99e6, 0x0026, 0x080c, 0xa57b, 0xb810,
-	0x9085, 0x8500, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x687c,
-	0x700a, 0x6880, 0x700e, 0x2001, 0x0099, 0x7012, 0x0804, 0x99e6,
-	0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2c78, 0x2069, 0x0200,
-	0x2071, 0x0240, 0x7804, 0x908a, 0x0040, 0x0a0c, 0x0d7d, 0x908a,
-	0x0057, 0x1a0c, 0x0d7d, 0x7910, 0x2158, 0xb984, 0x2061, 0x0100,
-	0x619a, 0x9082, 0x0040, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce,
-	0x00be, 0x0005, 0x9ab5, 0x9ab5, 0x9ab5, 0x9ad9, 0x9ab5, 0x9ab5,
-	0x9ab5, 0x9ab5, 0x9ab5, 0x9ab5, 0x9ab5, 0xa0c6, 0xa0d2, 0xa0de,
-	0xa0ea, 0x9ab5, 0x9ab5, 0x9ab5, 0xa0ba, 0x080c, 0x0d7d, 0x6813,
-	0x0008, 0xba8c, 0x8210, 0xb8d4, 0xd084, 0x0128, 0x7a4e, 0x7b14,
-	0x7b52, 0x722e, 0x732a, 0x9294, 0x00ff, 0xba8e, 0x8217, 0x721a,
-	0xba10, 0x9295, 0x0600, 0x7202, 0xba14, 0x7206, 0x6a7c, 0x720a,
-	0x6a80, 0x720e, 0x7013, 0x0829, 0x2f10, 0x7222, 0x7027, 0xffff,
-	0x0005, 0x0016, 0x7814, 0x9084, 0x0700, 0x8007, 0x0013, 0x001e,
-	0x0005, 0x9ae9, 0x9ae9, 0x9aeb, 0x9ae9, 0x9ae9, 0x9ae9, 0x9b05,
-	0x9ae9, 0x080c, 0x0d7d, 0x7914, 0x918c, 0x08ff, 0x918d, 0xf600,
-	0x7916, 0x2009, 0x0003, 0x00b9, 0x2069, 0x1847, 0x6804, 0xd0bc,
-	0x0130, 0x682c, 0x9084, 0x00ff, 0x8007, 0x7032, 0x0010, 0x7033,
-	0x3f00, 0x60c3, 0x0001, 0x0804, 0x9cd9, 0x2009, 0x0003, 0x0019,
-	0x7033, 0x7f00, 0x0cb0, 0x0016, 0x080c, 0xa57b, 0x001e, 0xb810,
-	0x9085, 0x0100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6a7c,
-	0x720a, 0x6a80, 0x720e, 0x7013, 0x0888, 0x918d, 0x0008, 0x7116,
-	0x080c, 0x9ccd, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x0005,
+	0x0008, 0x6886, 0x2001, 0x196d, 0x2004, 0x080c, 0x266f, 0x60e2,
+	0x2001, 0x180c, 0x200c, 0xc1b4, 0x2102, 0x00ee, 0x00de, 0x00ce,
+	0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026,
+	0x0036, 0x0046, 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800,
+	0x080c, 0xcf27, 0x1904, 0x77c3, 0x7130, 0xd184, 0x1170, 0x080c,
+	0x3361, 0x0138, 0xc18d, 0x7132, 0x2011, 0x1848, 0x2214, 0xd2ac,
+	0x1120, 0x7030, 0xd08c, 0x0904, 0x77c3, 0x2011, 0x1848, 0x220c,
+	0xd1a4, 0x0538, 0x0016, 0x2019, 0x000e, 0x080c, 0xe20e, 0x0156,
+	0x00b6, 0x20a9, 0x007f, 0x900e, 0x9186, 0x007e, 0x01a0, 0x9186,
+	0x0080, 0x0188, 0x080c, 0x661e, 0x1170, 0x2120, 0x9006, 0x0016,
+	0x2009, 0x000e, 0x080c, 0xe29e, 0x2009, 0x0001, 0x2011, 0x0100,
+	0x080c, 0x88bb, 0x001e, 0x8108, 0x1f04, 0x778c, 0x00be, 0x015e,
+	0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0002, 0x2019, 0x0004,
+	0x080c, 0x31a3, 0x001e, 0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f,
+	0x900e, 0x080c, 0x661e, 0x1110, 0x080c, 0x603c, 0x8108, 0x1f04,
+	0x77b9, 0x00be, 0x015e, 0x080c, 0x1adf, 0x080c, 0xa872, 0x080c,
+	0xab3a, 0x080c, 0xa88e, 0x60e3, 0x0000, 0x080c, 0x6022, 0x080c,
+	0x7406, 0x00ee, 0x00ce, 0x004e, 0x003e, 0x002e, 0x001e, 0x015e,
+	0x0005, 0x2001, 0x197d, 0x2003, 0x0001, 0x0005, 0x2001, 0x197d,
+	0x2003, 0x0000, 0x0005, 0x2001, 0x197c, 0x2003, 0xaaaa, 0x0005,
+	0x2001, 0x197c, 0x2003, 0x0000, 0x0005, 0x2071, 0x18fa, 0x7003,
+	0x0000, 0x7007, 0x0000, 0x080c, 0x1053, 0x090c, 0x0d7d, 0xa8ab,
+	0xdcb0, 0x2900, 0x704e, 0x080c, 0x1053, 0x090c, 0x0d7d, 0xa8ab,
+	0xdcb0, 0x2900, 0x7052, 0xa867, 0x0000, 0xa86b, 0x0001, 0xa89f,
+	0x0000, 0x0005, 0x00e6, 0x2071, 0x0040, 0x6848, 0x9005, 0x1118,
+	0x9085, 0x0001, 0x04b0, 0x6840, 0x9005, 0x0150, 0x04a1, 0x6a50,
+	0x9200, 0x7002, 0x6854, 0x9101, 0x7006, 0x9006, 0x7012, 0x7016,
+	0x6850, 0x7002, 0x6854, 0x7006, 0x6858, 0x700a, 0x685c, 0x700e,
+	0x6840, 0x9005, 0x1110, 0x7012, 0x7016, 0x6848, 0x701a, 0x701c,
+	0x9085, 0x0040, 0x701e, 0x2001, 0x0019, 0x7036, 0x702b, 0x0001,
+	0x2001, 0x0004, 0x200c, 0x918c, 0xfff7, 0x918d, 0x8000, 0x2102,
+	0x00d6, 0x2069, 0x18fa, 0x6807, 0x0001, 0x00de, 0x080c, 0x7dd0,
+	0x9006, 0x00ee, 0x0005, 0x900e, 0x0156, 0x20a9, 0x0006, 0x8003,
+	0x818d, 0x1f04, 0x784f, 0x015e, 0x0005, 0x2079, 0x0040, 0x2071,
+	0x18fa, 0x7004, 0x0002, 0x7865, 0x7866, 0x78b1, 0x790c, 0x7a1c,
+	0x7863, 0x7863, 0x7a46, 0x080c, 0x0d7d, 0x0005, 0x2079, 0x0040,
+	0x2001, 0x1dc0, 0x2003, 0x0000, 0x782c, 0x908c, 0x0780, 0x190c,
+	0x7eb2, 0xd0a4, 0x0570, 0x2001, 0x1dc0, 0x2004, 0x9082, 0x0080,
+	0x1640, 0x1d04, 0x7883, 0x2001, 0x1a06, 0x200c, 0x8109, 0x0508,
+	0x2091, 0x6000, 0x2102, 0x7824, 0x2048, 0x9006, 0xa802, 0xa806,
+	0xa864, 0x9084, 0x00ff, 0x908a, 0x0040, 0x0608, 0x00b8, 0x2001,
+	0x1800, 0x200c, 0x9186, 0x0003, 0x1160, 0x7104, 0x9186, 0x0004,
+	0x0140, 0x9186, 0x0007, 0x0128, 0x9186, 0x0003, 0x1968, 0x080c,
+	0x790c, 0x782c, 0xd09c, 0x090c, 0x7dd0, 0x0005, 0x9082, 0x005a,
+	0x1218, 0x2100, 0x003b, 0x0c18, 0x080c, 0x7942, 0x0c90, 0x00e3,
+	0x08f0, 0x0005, 0x7942, 0x7942, 0x7942, 0x7942, 0x7942, 0x7942,
+	0x7942, 0x7942, 0x7964, 0x7942, 0x7942, 0x7942, 0x7942, 0x7942,
+	0x7942, 0x7942, 0x7942, 0x7942, 0x7942, 0x7942, 0x7942, 0x7942,
+	0x7942, 0x7942, 0x7942, 0x7942, 0x7942, 0x7942, 0x794e, 0x7942,
+	0x7b37, 0x7942, 0x7942, 0x7942, 0x7964, 0x7942, 0x794e, 0x7b78,
+	0x7bb9, 0x7c00, 0x7c14, 0x7942, 0x7942, 0x7964, 0x794e, 0x7978,
+	0x7942, 0x79f0, 0x7cbf, 0x7cda, 0x7942, 0x7964, 0x7942, 0x7978,
+	0x7942, 0x7942, 0x79e6, 0x7cda, 0x7942, 0x7942, 0x7942, 0x7942,
+	0x7942, 0x7942, 0x7942, 0x7942, 0x7942, 0x798c, 0x7942, 0x7942,
+	0x7942, 0x7942, 0x7942, 0x7942, 0x7942, 0x7942, 0x7942, 0x7e56,
+	0x7942, 0x7e00, 0x7942, 0x7e00, 0x7942, 0x79a1, 0x7942, 0x7942,
+	0x7942, 0x7942, 0x7942, 0x7942, 0x2079, 0x0040, 0x7004, 0x9086,
+	0x0003, 0x1198, 0x782c, 0x080c, 0x7df9, 0xd0a4, 0x0170, 0x7824,
+	0x2048, 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a,
+	0x001a, 0x1210, 0x002b, 0x0c50, 0x00e9, 0x080c, 0x7dd0, 0x0005,
+	0x7942, 0x794e, 0x7b23, 0x7942, 0x794e, 0x7942, 0x794e, 0x794e,
+	0x7942, 0x794e, 0x7b23, 0x794e, 0x794e, 0x794e, 0x794e, 0x794e,
+	0x7942, 0x794e, 0x7b23, 0x7942, 0x7942, 0x794e, 0x7942, 0x7942,
+	0x7942, 0x794e, 0x00e6, 0x2071, 0x18fa, 0x2009, 0x0400, 0x0071,
+	0x00ee, 0x0005, 0x2009, 0x1000, 0x0049, 0x0005, 0x2009, 0x2000,
+	0x0029, 0x0005, 0x2009, 0x0800, 0x0009, 0x0005, 0x7007, 0x0001,
+	0xa868, 0x9084, 0x00ff, 0x9105, 0xa86a, 0x0126, 0x2091, 0x8000,
+	0x080c, 0x6d70, 0x012e, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff,
+	0x0d08, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x7ac5, 0x7007,
+	0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7ac5, 0x0005,
+	0xa864, 0x8007, 0x9084, 0x00ff, 0x0968, 0x8001, 0x1120, 0x7007,
+	0x0001, 0x0804, 0x7ae0, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016,
+	0x701a, 0x704b, 0x7ae0, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff,
+	0x0904, 0x794a, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x7afc,
+	0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7afc,
+	0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904,
+	0x794a, 0x7007, 0x0001, 0x2009, 0x1834, 0x210c, 0x81ff, 0x11a8,
+	0xa868, 0x9084, 0x00ff, 0xa86a, 0xa883, 0x0000, 0x080c, 0x62b2,
+	0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, 0xa87a,
+	0xa982, 0x080c, 0x6d70, 0x012e, 0x0ca0, 0xa994, 0x9186, 0x0071,
+	0x0d38, 0x9186, 0x0064, 0x0d20, 0x9186, 0x007c, 0x0d08, 0x9186,
+	0x0028, 0x09f0, 0x9186, 0x0038, 0x09d8, 0x9186, 0x0078, 0x09c0,
+	0x9186, 0x005f, 0x09a8, 0x9186, 0x0056, 0x0990, 0xa897, 0x4005,
+	0xa89b, 0x0001, 0x2001, 0x0030, 0x900e, 0x08a0, 0xa87c, 0x9084,
+	0x00c0, 0x9086, 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, 0x7cf1,
+	0x2900, 0x7016, 0x701a, 0x20a9, 0x0004, 0xa860, 0x20e0, 0xa85c,
+	0x9080, 0x0030, 0x2098, 0x7050, 0x2040, 0xa060, 0x20e8, 0xa05c,
+	0x9080, 0x0023, 0x20a0, 0x4003, 0xa888, 0x7012, 0x9082, 0x0401,
+	0x1a04, 0x7952, 0xaab4, 0x928a, 0x0002, 0x1a04, 0x7952, 0x82ff,
+	0x1138, 0xa8b8, 0xa9bc, 0x9105, 0x0118, 0x2001, 0x7a83, 0x0018,
+	0x9280, 0x7a79, 0x2005, 0x7056, 0x7010, 0x9015, 0x0904, 0x7a64,
+	0x080c, 0x1053, 0x1118, 0x7007, 0x0004, 0x0005, 0x2900, 0x7022,
+	0x7054, 0x2060, 0xe000, 0xa866, 0x7050, 0x2040, 0xa95c, 0xe004,
+	0x9100, 0xa076, 0xa860, 0xa072, 0xe008, 0x920a, 0x1210, 0x900e,
+	0x2200, 0x7112, 0xe20c, 0x8003, 0x800b, 0x9296, 0x0004, 0x0108,
+	0x9108, 0xa17a, 0x810b, 0xa17e, 0x080c, 0x1124, 0xa06c, 0x908e,
+	0x0100, 0x0170, 0x9086, 0x0200, 0x0118, 0x7007, 0x0007, 0x0005,
+	0x7020, 0x2048, 0x080c, 0x106c, 0x7014, 0x2048, 0x0804, 0x7952,
+	0x7020, 0x2048, 0x7018, 0xa802, 0xa807, 0x0000, 0x2908, 0x2048,
+	0xa906, 0x711a, 0x0804, 0x7a1c, 0x7014, 0x2048, 0x7007, 0x0001,
+	0xa8b4, 0x9005, 0x1128, 0xa8b8, 0xa9bc, 0x9105, 0x0108, 0x00b9,
+	0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x0904, 0x7cf1, 0x0804,
+	0x7ac5, 0x7a7b, 0x7a7f, 0x0002, 0x001d, 0x0007, 0x0004, 0x000a,
+	0x001b, 0x0005, 0x0006, 0x000a, 0x001d, 0x0005, 0x0004, 0x0076,
+	0x0066, 0xafb8, 0xaebc, 0xa804, 0x2050, 0xb0c0, 0xb0e2, 0xb0bc,
+	0xb0de, 0xb0b8, 0xb0d2, 0xb0b4, 0xb0ce, 0xb6da, 0xb7d6, 0xb0b0,
+	0xb0ca, 0xb0ac, 0xb0c6, 0xb0a8, 0xb0ba, 0xb0a4, 0xb0b6, 0xb6c2,
+	0xb7be, 0xb0a0, 0xb0b2, 0xb09c, 0xb0ae, 0xb098, 0xb0a2, 0xb094,
+	0xb09e, 0xb6aa, 0xb7a6, 0xb090, 0xb09a, 0xb08c, 0xb096, 0xb088,
+	0xb08a, 0xb084, 0xb086, 0xb692, 0xb78e, 0xb080, 0xb082, 0xb07c,
+	0xb07e, 0xb078, 0xb072, 0xb074, 0xb06e, 0xb67a, 0xb776, 0xb004,
+	0x9055, 0x1958, 0x006e, 0x007e, 0x0005, 0x2009, 0x1834, 0x210c,
+	0x81ff, 0x1178, 0x080c, 0x60b4, 0x1108, 0x0005, 0x080c, 0x6fb0,
+	0x0126, 0x2091, 0x8000, 0x080c, 0xcb12, 0x080c, 0x6d70, 0x012e,
+	0x0ca0, 0x080c, 0xcf27, 0x1d70, 0x2001, 0x0028, 0x900e, 0x0c70,
+	0x2009, 0x1834, 0x210c, 0x81ff, 0x1188, 0xa888, 0x9005, 0x0188,
+	0xa883, 0x0000, 0x080c, 0x6142, 0x1108, 0x0005, 0xa87a, 0x0126,
+	0x2091, 0x8000, 0x080c, 0x6d70, 0x012e, 0x0cb8, 0x2001, 0x0028,
+	0x0ca8, 0x2001, 0x0000, 0x0c90, 0x2009, 0x1834, 0x210c, 0x81ff,
+	0x11d8, 0xa888, 0x9005, 0x01e0, 0xa883, 0x0000, 0xa87c, 0xd0f4,
+	0x0120, 0x080c, 0x6214, 0x1138, 0x0005, 0x9006, 0xa87a, 0x080c,
+	0x618f, 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0xa87a, 0xa982,
+	0x080c, 0x6d70, 0x012e, 0x0cb0, 0x2001, 0x0028, 0x900e, 0x0c98,
+	0x2001, 0x0000, 0x0c80, 0x7018, 0xa802, 0x2908, 0x2048, 0xa906,
+	0x711a, 0x7010, 0x8001, 0x7012, 0x0118, 0x7007, 0x0003, 0x0030,
+	0x7014, 0x2048, 0x7007, 0x0001, 0x7048, 0x080f, 0x0005, 0x00b6,
+	0x7007, 0x0001, 0xa974, 0xa878, 0x9084, 0x00ff, 0x9096, 0x0004,
+	0x0540, 0x20a9, 0x0001, 0x9096, 0x0001, 0x0190, 0x900e, 0x20a9,
+	0x0800, 0x9096, 0x0002, 0x0160, 0x9005, 0x11d8, 0xa974, 0x080c,
+	0x661e, 0x11b8, 0x0066, 0xae80, 0x080c, 0x672e, 0x006e, 0x0088,
+	0x0046, 0x2011, 0x180c, 0x2224, 0xc484, 0x2412, 0x004e, 0x00c6,
+	0x080c, 0x661e, 0x1110, 0x080c, 0x68fd, 0x8108, 0x1f04, 0x7b60,
+	0x00ce, 0xa87c, 0xd084, 0x1120, 0x080c, 0x106c, 0x00be, 0x0005,
+	0x0126, 0x2091, 0x8000, 0x080c, 0x6d70, 0x012e, 0x00be, 0x0005,
+	0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x6a57, 0x0580,
+	0x2061, 0x1a6f, 0x6100, 0xd184, 0x0178, 0xa888, 0x9084, 0x00ff,
+	0x1550, 0x6000, 0xd084, 0x0520, 0x6004, 0x9005, 0x1538, 0x6003,
+	0x0000, 0x600b, 0x0000, 0x00c8, 0x2011, 0x0001, 0xa890, 0x9005,
+	0x1110, 0x2001, 0x001e, 0x8000, 0x6016, 0xa888, 0x9084, 0x00ff,
+	0x0178, 0x6006, 0xa888, 0x8007, 0x9084, 0x00ff, 0x0148, 0x600a,
+	0xa888, 0x8000, 0x1108, 0xc28d, 0x6202, 0x012e, 0x0804, 0x7dba,
+	0x012e, 0x0804, 0x7db4, 0x012e, 0x0804, 0x7dae, 0x012e, 0x0804,
+	0x7db1, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x6a57,
+	0x05e0, 0x2061, 0x1a6f, 0x6000, 0xd084, 0x05b8, 0x6204, 0x6308,
+	0xd08c, 0x1530, 0xac78, 0x9484, 0x0003, 0x0170, 0xa988, 0x918c,
+	0x00ff, 0x8001, 0x1120, 0x2100, 0x9210, 0x0620, 0x0028, 0x8001,
+	0x1508, 0x2100, 0x9212, 0x02f0, 0x9484, 0x000c, 0x0188, 0xa988,
+	0x810f, 0x918c, 0x00ff, 0x9082, 0x0004, 0x1120, 0x2100, 0x9318,
+	0x0288, 0x0030, 0x9082, 0x0004, 0x1168, 0x2100, 0x931a, 0x0250,
+	0xa890, 0x9005, 0x0110, 0x8000, 0x6016, 0x6206, 0x630a, 0x012e,
+	0x0804, 0x7dba, 0x012e, 0x0804, 0x7db7, 0x012e, 0x0804, 0x7db4,
+	0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x2061, 0x1a6f, 0x6300,
+	0xd38c, 0x1120, 0x6308, 0x8318, 0x0220, 0x630a, 0x012e, 0x0804,
+	0x7dc8, 0x012e, 0x0804, 0x7db7, 0x00b6, 0x0126, 0x00c6, 0x2091,
+	0x8000, 0x7007, 0x0001, 0xa87c, 0xd0ac, 0x0148, 0x00c6, 0x2061,
+	0x1a6f, 0x6000, 0x9084, 0xfcff, 0x6002, 0x00ce, 0x0440, 0xa888,
+	0x9005, 0x05d8, 0xa88c, 0x9065, 0x0598, 0x2001, 0x1834, 0x2004,
+	0x9005, 0x0118, 0x080c, 0xac04, 0x0068, 0x6017, 0xf400, 0x6063,
+	0x0000, 0xa97c, 0xd1a4, 0x0110, 0xa980, 0x6162, 0x2009, 0x0041,
+	0x080c, 0xac68, 0xa988, 0x918c, 0xff00, 0x9186, 0x2000, 0x1138,
+	0x0026, 0x900e, 0x2011, 0xfdff, 0x080c, 0x88bb, 0x002e, 0xa87c,
+	0xd0c4, 0x0148, 0x2061, 0x1a6f, 0x6000, 0xd08c, 0x1120, 0x6008,
+	0x8000, 0x0208, 0x600a, 0x00ce, 0x012e, 0x00be, 0x0804, 0x7dba,
+	0x00ce, 0x012e, 0x00be, 0x0804, 0x7db4, 0xa984, 0x9186, 0x002e,
+	0x0d30, 0x9186, 0x002d, 0x0d18, 0x9186, 0x0045, 0x0510, 0x9186,
+	0x002a, 0x1130, 0x2001, 0x180c, 0x200c, 0xc194, 0x2102, 0x08b8,
+	0x9186, 0x0020, 0x0158, 0x9186, 0x0029, 0x1d10, 0xa974, 0x080c,
+	0x661e, 0x1968, 0xb800, 0xc0e4, 0xb802, 0x0848, 0xa88c, 0x9065,
+	0x09b8, 0x6007, 0x0024, 0x2001, 0x1986, 0x2004, 0x601a, 0x0804,
+	0x7c4f, 0xa88c, 0x9065, 0x0960, 0x00e6, 0xa890, 0x9075, 0x2001,
+	0x1834, 0x2004, 0x9005, 0x0150, 0x080c, 0xac04, 0x8eff, 0x0118,
+	0x2e60, 0x080c, 0xac04, 0x00ee, 0x0804, 0x7c4f, 0x6024, 0xc0dc,
+	0xc0d5, 0x6026, 0x2e60, 0x6007, 0x003a, 0xa8a0, 0x9005, 0x0130,
+	0x6007, 0x003b, 0xa8a4, 0x602e, 0xa8a8, 0x6016, 0x6003, 0x0001,
+	0x2009, 0x8020, 0x080c, 0x91ed, 0x00ee, 0x0804, 0x7c4f, 0x2061,
+	0x1a6f, 0x6000, 0xd084, 0x0190, 0xd08c, 0x1904, 0x7dc8, 0x0126,
+	0x2091, 0x8000, 0x6204, 0x8210, 0x0220, 0x6206, 0x012e, 0x0804,
+	0x7dc8, 0x012e, 0xa883, 0x0016, 0x0804, 0x7dc1, 0xa883, 0x0007,
+	0x0804, 0x7dc1, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0130, 0x8001,
+	0x1138, 0x7007, 0x0001, 0x0069, 0x0005, 0x080c, 0x794a, 0x0040,
+	0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7cf1,
+	0x0005, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x903e, 0x2061,
+	0x1800, 0x61d0, 0x81ff, 0x1904, 0x7d73, 0x6130, 0xd194, 0x1904,
+	0x7d9d, 0xa878, 0x2070, 0x9e82, 0x1ddc, 0x0a04, 0x7d67, 0x6068,
+	0x9e02, 0x1a04, 0x7d67, 0x7120, 0x9186, 0x0006, 0x1904, 0x7d59,
+	0x7010, 0x905d, 0x0904, 0x7d73, 0xb800, 0xd0e4, 0x1904, 0x7d97,
+	0x2061, 0x1a6f, 0x6100, 0x9184, 0x0301, 0x9086, 0x0001, 0x15a0,
+	0x7024, 0xd0dc, 0x1904, 0x7da0, 0xa883, 0x0000, 0xa803, 0x0000,
+	0x2908, 0x7014, 0x9005, 0x1198, 0x7116, 0xa87c, 0xd0f4, 0x1904,
+	0x7da3, 0x080c, 0x56d3, 0xd09c, 0x1118, 0xa87c, 0xc0cc, 0xa87e,
+	0x2e60, 0x080c, 0x87ae, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2048,
+	0xa800, 0x9005, 0x1de0, 0xa902, 0x2148, 0xa87c, 0xd0f4, 0x1904,
+	0x7da3, 0x012e, 0x00ee, 0x00be, 0x0005, 0x012e, 0x00ee, 0xa883,
+	0x0006, 0x00be, 0x0804, 0x7dc1, 0xd184, 0x0db8, 0xd1c4, 0x1190,
+	0x00a0, 0xa974, 0x080c, 0x661e, 0x15d0, 0xb800, 0xd0e4, 0x15b8,
+	0x7120, 0x9186, 0x0007, 0x1118, 0xa883, 0x0002, 0x0490, 0xa883,
+	0x0008, 0x0478, 0xa883, 0x000e, 0x0460, 0xa883, 0x0017, 0x0448,
+	0xa883, 0x0035, 0x0430, 0x080c, 0x56d7, 0xd0fc, 0x01e8, 0xa878,
+	0x2070, 0x9e82, 0x1ddc, 0x02c0, 0x6068, 0x9e02, 0x12a8, 0x7120,
+	0x9186, 0x0006, 0x1188, 0x7010, 0x905d, 0x0170, 0xb800, 0xd0bc,
+	0x0158, 0x2039, 0x0001, 0x7000, 0x9086, 0x0007, 0x1904, 0x7cfd,
+	0x7003, 0x0002, 0x0804, 0x7cfd, 0xa883, 0x0028, 0x0010, 0xa883,
+	0x0029, 0x012e, 0x00ee, 0x00be, 0x0420, 0xa883, 0x002a, 0x0cc8,
+	0xa883, 0x0045, 0x0cb0, 0x2e60, 0x2019, 0x0002, 0x601b, 0x0014,
+	0x080c, 0xddf2, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2009, 0x003e,
+	0x0058, 0x2009, 0x0004, 0x0040, 0x2009, 0x0006, 0x0028, 0x2009,
+	0x0016, 0x0010, 0x2009, 0x0001, 0xa884, 0x9084, 0xff00, 0x9105,
+	0xa886, 0x0126, 0x2091, 0x8000, 0x080c, 0x6d70, 0x012e, 0x0005,
+	0x080c, 0x106c, 0x0005, 0x00d6, 0x080c, 0x87a5, 0x00de, 0x0005,
+	0x00d6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x0040, 0x702c,
+	0xd084, 0x01d8, 0x908c, 0x0780, 0x190c, 0x7eb2, 0xd09c, 0x11a8,
+	0x2071, 0x1800, 0x70c0, 0x90ea, 0x0020, 0x0278, 0x8001, 0x70c2,
+	0x702c, 0x2048, 0xa800, 0x702e, 0x9006, 0xa802, 0xa806, 0x2071,
+	0x0040, 0x2900, 0x7022, 0x702c, 0x0c28, 0x012e, 0x00ee, 0x00de,
+	0x0005, 0x0006, 0x9084, 0x0780, 0x190c, 0x7eb2, 0x000e, 0x0005,
+	0xa898, 0x9084, 0x0003, 0x05a8, 0x080c, 0xab73, 0x05d8, 0x2900,
+	0x6016, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0035, 0x1138, 0x6028,
+	0xc0fd, 0x602a, 0x2001, 0x196b, 0x2004, 0x0098, 0xa8a0, 0x9084,
+	0x00ff, 0xa99c, 0x918c, 0xff00, 0x9105, 0xa99c, 0x918c, 0x00ff,
+	0x080c, 0x25fb, 0x1540, 0x00b6, 0x080c, 0x661e, 0x2b00, 0x00be,
+	0x1510, 0x6012, 0x6023, 0x0001, 0x2009, 0x0040, 0xa864, 0x9084,
+	0x00ff, 0x9086, 0x0035, 0x0110, 0x2009, 0x0041, 0x080c, 0xac68,
+	0x0005, 0xa87b, 0x0101, 0x0126, 0x2091, 0x8000, 0x080c, 0x6d70,
+	0x012e, 0x0005, 0xa87b, 0x002c, 0x0126, 0x2091, 0x8000, 0x080c,
+	0x6d70, 0x012e, 0x0005, 0xa87b, 0x0028, 0x0126, 0x2091, 0x8000,
+	0x080c, 0x6d70, 0x012e, 0x080c, 0xabc9, 0x0005, 0x00d6, 0x00c6,
+	0x0036, 0x0026, 0x0016, 0x00b6, 0x7007, 0x0001, 0xaa74, 0x9282,
+	0x0004, 0x1a04, 0x7ea3, 0xa97c, 0x9188, 0x1000, 0x2104, 0x905d,
+	0xb804, 0xd284, 0x0140, 0x05e8, 0x8007, 0x9084, 0x00ff, 0x9084,
+	0x0006, 0x1108, 0x04b0, 0x2b10, 0x080c, 0xab73, 0x1118, 0x080c,
+	0xac3b, 0x05a8, 0x6212, 0xa874, 0x0002, 0x7e81, 0x7e86, 0x7e89,
+	0x7e8f, 0x2019, 0x0002, 0x080c, 0xe20e, 0x0060, 0x080c, 0xe19e,
+	0x0048, 0x2019, 0x0002, 0xa980, 0x080c, 0xe1bd, 0x0018, 0xa980,
+	0x080c, 0xe19e, 0x080c, 0xabc9, 0xa887, 0x0000, 0x0126, 0x2091,
+	0x8000, 0x080c, 0x6d70, 0x012e, 0x00be, 0x001e, 0x002e, 0x003e,
+	0x00ce, 0x00de, 0x0005, 0xa887, 0x0006, 0x0c80, 0xa887, 0x0002,
+	0x0c68, 0xa887, 0x0005, 0x0c50, 0xa887, 0x0004, 0x0c38, 0xa887,
+	0x0007, 0x0c20, 0x2091, 0x8000, 0x0e04, 0x7eb4, 0x0006, 0x0016,
+	0x2001, 0x8003, 0x0006, 0x0804, 0x0d86, 0x2001, 0x1834, 0x2004,
+	0x9005, 0x0005, 0x0005, 0x00f6, 0x2079, 0x0300, 0x2001, 0x0200,
+	0x200c, 0xc1e5, 0xc1dc, 0x2102, 0x2009, 0x0218, 0x210c, 0xd1ec,
+	0x1120, 0x080c, 0x1608, 0x00fe, 0x0005, 0x2001, 0x020d, 0x2003,
+	0x0020, 0x781f, 0x0300, 0x00fe, 0x0005, 0x781c, 0xd08c, 0x0904,
+	0x7f35, 0x68c0, 0x90aa, 0x0005, 0x0a04, 0x8519, 0x7d44, 0x7c40,
+	0xd59c, 0x190c, 0x0d7d, 0x9584, 0x00f6, 0x1508, 0x9484, 0x7000,
+	0x0138, 0x908a, 0x2000, 0x1258, 0x9584, 0x0700, 0x8007, 0x04f0,
+	0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x0db0, 0x00b0, 0x9484,
+	0x0fff, 0x1130, 0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x11c0,
+	0x080c, 0xe6af, 0x080c, 0x8410, 0x7817, 0x0140, 0x00a8, 0x9584,
+	0x0076, 0x1118, 0x080c, 0x846c, 0x19c8, 0xd5a4, 0x0148, 0x0046,
+	0x0056, 0x080c, 0x7f85, 0x080c, 0x2115, 0x005e, 0x004e, 0x0020,
+	0x080c, 0xe6af, 0x7817, 0x0140, 0x080c, 0x74d5, 0x0168, 0x2001,
+	0x0111, 0x2004, 0xd08c, 0x0140, 0x6893, 0x0000, 0x2001, 0x0110,
+	0x2003, 0x0008, 0x2003, 0x0000, 0x0489, 0x0005, 0x0002, 0x7f42,
+	0x8232, 0x7f3f, 0x7f3f, 0x7f3f, 0x7f3f, 0x7f3f, 0x7f3f, 0x7817,
+	0x0140, 0x0005, 0x7000, 0x908c, 0xff00, 0x9194, 0xf000, 0x810f,
+	0x9484, 0x0fff, 0x6892, 0x9286, 0x2000, 0x1150, 0x6800, 0x9086,
+	0x0001, 0x1118, 0x080c, 0x5734, 0x0070, 0x080c, 0x7fa5, 0x0058,
+	0x9286, 0x3000, 0x1118, 0x080c, 0x816f, 0x0028, 0x9286, 0x8000,
+	0x1110, 0x080c, 0x8346, 0x7817, 0x0140, 0x0005, 0x2001, 0x1810,
+	0x2004, 0xd08c, 0x0178, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003,
+	0x1148, 0x0026, 0x0036, 0x2011, 0x8048, 0x2518, 0x080c, 0x4b00,
+	0x003e, 0x002e, 0x0005, 0x0036, 0x0046, 0x0056, 0x00f6, 0x2079,
+	0x0200, 0x2019, 0xfffe, 0x7c30, 0x0050, 0x0036, 0x0046, 0x0056,
+	0x00f6, 0x2079, 0x0200, 0x7d44, 0x7c40, 0x2019, 0xffff, 0x2001,
+	0x1810, 0x2004, 0xd08c, 0x0160, 0x2001, 0x1800, 0x2004, 0x9086,
+	0x0003, 0x1130, 0x0026, 0x2011, 0x8048, 0x080c, 0x4b00, 0x002e,
+	0x00fe, 0x005e, 0x004e, 0x003e, 0x0005, 0x00b6, 0x00c6, 0x7010,
+	0x9084, 0xff00, 0x8007, 0x9096, 0x0001, 0x0120, 0x9096, 0x0023,
+	0x1904, 0x8140, 0x9186, 0x0023, 0x15c0, 0x080c, 0x83db, 0x0904,
+	0x8140, 0x6120, 0x9186, 0x0001, 0x0150, 0x9186, 0x0004, 0x0138,
+	0x9186, 0x0008, 0x0120, 0x9186, 0x000a, 0x1904, 0x8140, 0x7124,
+	0x610a, 0x7030, 0x908e, 0x0200, 0x1130, 0x2009, 0x0015, 0x080c,
+	0xac68, 0x0804, 0x8140, 0x908e, 0x0214, 0x0118, 0x908e, 0x0210,
+	0x1130, 0x2009, 0x0015, 0x080c, 0xac68, 0x0804, 0x8140, 0x908e,
+	0x0100, 0x1904, 0x8140, 0x7034, 0x9005, 0x1904, 0x8140, 0x2009,
+	0x0016, 0x080c, 0xac68, 0x0804, 0x8140, 0x9186, 0x0022, 0x1904,
+	0x8140, 0x7030, 0x908e, 0x0300, 0x1580, 0x68dc, 0xd0a4, 0x0528,
+	0xc0b5, 0x68de, 0x7100, 0x918c, 0x00ff, 0x697e, 0x7004, 0x6882,
+	0x00f6, 0x2079, 0x0100, 0x79e6, 0x78ea, 0x0006, 0x9084, 0x00ff,
+	0x0016, 0x2008, 0x080c, 0x2644, 0x7932, 0x7936, 0x001e, 0x000e,
+	0x00fe, 0x080c, 0x25fb, 0x695e, 0x703c, 0x00e6, 0x2071, 0x0140,
+	0x7086, 0x2071, 0x1800, 0x70b6, 0x00ee, 0x7034, 0x9005, 0x1904,
+	0x8140, 0x2009, 0x0017, 0x0804, 0x810d, 0x908e, 0x0400, 0x1190,
+	0x7034, 0x9005, 0x1904, 0x8140, 0x080c, 0x74d5, 0x0120, 0x2009,
+	0x001d, 0x0804, 0x810d, 0x68dc, 0xc0a5, 0x68de, 0x2009, 0x0030,
+	0x0804, 0x810d, 0x908e, 0x0500, 0x1140, 0x7034, 0x9005, 0x1904,
+	0x8140, 0x2009, 0x0018, 0x0804, 0x810d, 0x908e, 0x2010, 0x1120,
+	0x2009, 0x0019, 0x0804, 0x810d, 0x908e, 0x2110, 0x1120, 0x2009,
+	0x001a, 0x0804, 0x810d, 0x908e, 0x5200, 0x1140, 0x7034, 0x9005,
+	0x1904, 0x8140, 0x2009, 0x001b, 0x0804, 0x810d, 0x908e, 0x5000,
+	0x1140, 0x7034, 0x9005, 0x1904, 0x8140, 0x2009, 0x001c, 0x0804,
+	0x810d, 0x908e, 0x1300, 0x1120, 0x2009, 0x0034, 0x0804, 0x810d,
+	0x908e, 0x1200, 0x1140, 0x7034, 0x9005, 0x1904, 0x8140, 0x2009,
+	0x0024, 0x0804, 0x810d, 0x908c, 0xff00, 0x918e, 0x2400, 0x1170,
+	0x2009, 0x002d, 0x2001, 0x1810, 0x2004, 0xd09c, 0x0904, 0x810d,
+	0x080c, 0xd62a, 0x1904, 0x8140, 0x0804, 0x810b, 0x908c, 0xff00,
+	0x918e, 0x5300, 0x1120, 0x2009, 0x002a, 0x0804, 0x810d, 0x908e,
+	0x0f00, 0x1120, 0x2009, 0x0020, 0x0804, 0x810d, 0x908e, 0x6104,
+	0x1530, 0x2029, 0x0205, 0x2011, 0x026d, 0x8208, 0x2204, 0x9082,
+	0x0004, 0x8004, 0x8004, 0x20a8, 0x2011, 0x8015, 0x211c, 0x8108,
+	0x0046, 0x2124, 0x080c, 0x4b00, 0x004e, 0x8108, 0x0f04, 0x80c1,
+	0x9186, 0x0280, 0x1d88, 0x2504, 0x8000, 0x202a, 0x2009, 0x0260,
+	0x0c58, 0x202b, 0x0000, 0x2009, 0x0023, 0x0804, 0x810d, 0x908e,
+	0x6000, 0x1120, 0x2009, 0x003f, 0x0804, 0x810d, 0x908e, 0x5400,
+	0x1138, 0x080c, 0x84c9, 0x1904, 0x8140, 0x2009, 0x0046, 0x04a8,
+	0x908e, 0x5500, 0x1148, 0x080c, 0x84f1, 0x1118, 0x2009, 0x0041,
+	0x0460, 0x2009, 0x0042, 0x0448, 0x908e, 0x7800, 0x1118, 0x2009,
+	0x0045, 0x0418, 0x908e, 0x1000, 0x1118, 0x2009, 0x004e, 0x00e8,
+	0x908e, 0x6300, 0x1118, 0x2009, 0x004a, 0x00b8, 0x908c, 0xff00,
+	0x918e, 0x5600, 0x1118, 0x2009, 0x004f, 0x0078, 0x908c, 0xff00,
+	0x918e, 0x5700, 0x1118, 0x2009, 0x0050, 0x0038, 0x2009, 0x001d,
+	0x6838, 0xd0d4, 0x0110, 0x2009, 0x004c, 0x0016, 0x2011, 0x0263,
+	0x2204, 0x8211, 0x220c, 0x080c, 0x25fb, 0x1568, 0x080c, 0x65bd,
+	0x1550, 0xbe12, 0xbd16, 0x001e, 0x0016, 0xb884, 0x9005, 0x1168,
+	0x9186, 0x0046, 0x1150, 0x687c, 0x9606, 0x1138, 0x6880, 0x9506,
+	0x9084, 0xff00, 0x1110, 0x001e, 0x0098, 0x080c, 0xab73, 0x01a8,
+	0x2b08, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x9186,
+	0x004c, 0x1110, 0x6023, 0x000a, 0x0016, 0x001e, 0x080c, 0xac68,
+	0x00ce, 0x00be, 0x0005, 0x001e, 0x0cd8, 0x2001, 0x180e, 0x2004,
+	0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x4b00, 0x080c, 0xac3b,
+	0x0d90, 0x2b08, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e,
+	0x0016, 0x9186, 0x0017, 0x0118, 0x9186, 0x0030, 0x1128, 0x6007,
+	0x0009, 0x6017, 0x2900, 0x0020, 0x6007, 0x0051, 0x6017, 0x0000,
+	0x602f, 0x0009, 0x6003, 0x0001, 0x080c, 0x91f4, 0x08a0, 0x080c,
+	0x332b, 0x1140, 0x7010, 0x9084, 0xff00, 0x8007, 0x908e, 0x0008,
+	0x1108, 0x0009, 0x0005, 0x00b6, 0x00c6, 0x0046, 0x7000, 0x908c,
+	0xff00, 0x810f, 0x9186, 0x0033, 0x11e8, 0x080c, 0x83db, 0x0904,
+	0x81ca, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1140, 0x7034,
+	0x9005, 0x15c0, 0x2009, 0x0015, 0x080c, 0xac68, 0x0498, 0x908e,
+	0x0100, 0x1580, 0x7034, 0x9005, 0x1568, 0x2009, 0x0016, 0x080c,
+	0xac68, 0x0440, 0x9186, 0x0032, 0x1528, 0x7030, 0x908e, 0x1400,
+	0x1508, 0x2009, 0x0038, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211,
+	0x220c, 0x080c, 0x25fb, 0x11a8, 0x080c, 0x65bd, 0x1190, 0xbe12,
+	0xbd16, 0x080c, 0xab73, 0x0168, 0x2b08, 0x6112, 0x080c, 0xcca8,
+	0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0xac68, 0x0010,
+	0x00ce, 0x001e, 0x004e, 0x00ce, 0x00be, 0x0005, 0x00b6, 0x0046,
+	0x00e6, 0x00d6, 0x2028, 0x2130, 0x9696, 0x00ff, 0x11b8, 0x9592,
+	0xfffc, 0x02a0, 0x9596, 0xfffd, 0x1120, 0x2009, 0x007f, 0x0804,
+	0x822c, 0x9596, 0xfffe, 0x1120, 0x2009, 0x007e, 0x0804, 0x822c,
+	0x9596, 0xfffc, 0x1118, 0x2009, 0x0080, 0x04f0, 0x2011, 0x0000,
+	0x2019, 0x1837, 0x231c, 0xd3ac, 0x0130, 0x9026, 0x20a9, 0x0800,
+	0x2071, 0x1000, 0x0030, 0x2021, 0x0081, 0x20a9, 0x077f, 0x2071,
+	0x1081, 0x2e1c, 0x93dd, 0x0000, 0x1140, 0x82ff, 0x11d0, 0x9496,
+	0x00ff, 0x01b8, 0x2410, 0xc2fd, 0x00a0, 0xbf10, 0x2600, 0x9706,
+	0xb814, 0x1120, 0x9546, 0x1110, 0x2408, 0x00b0, 0x9745, 0x1148,
+	0x94c6, 0x007e, 0x0130, 0x94c6, 0x007f, 0x0118, 0x94c6, 0x0080,
+	0x1d20, 0x8420, 0x8e70, 0x1f04, 0x8201, 0x82ff, 0x1118, 0x9085,
+	0x0001, 0x0018, 0xc2fc, 0x2208, 0x9006, 0x00de, 0x00ee, 0x004e,
+	0x00be, 0x0005, 0x7000, 0x908c, 0xff00, 0x810f, 0x9184, 0x000f,
+	0x0002, 0x8249, 0x8249, 0x8249, 0x83ed, 0x8249, 0x824c, 0x8271,
+	0x82fa, 0x8249, 0x8249, 0x8249, 0x8249, 0x8249, 0x8249, 0x8249,
+	0x8249, 0x7817, 0x0140, 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x01e8,
+	0x7120, 0x2160, 0x9c8c, 0x0003, 0x11c0, 0x9c8a, 0x1ddc, 0x02a8,
+	0x6868, 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158,
+	0xb910, 0x9106, 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124,
+	0x610a, 0x2009, 0x0046, 0x080c, 0xac68, 0x7817, 0x0140, 0x00be,
+	0x0005, 0x00b6, 0x00c6, 0x9484, 0x0fff, 0x0904, 0x82d6, 0x7110,
+	0xd1bc, 0x1904, 0x82d6, 0x7108, 0x700c, 0x2028, 0x918c, 0x00ff,
+	0x2130, 0x9094, 0xff00, 0x15c8, 0x81ff, 0x15b8, 0x9080, 0x336d,
+	0x200d, 0x918c, 0xff00, 0x810f, 0x2001, 0x0080, 0x9106, 0x0904,
+	0x82d6, 0x9182, 0x0801, 0x1a04, 0x82d6, 0x9190, 0x1000, 0x2204,
+	0x905d, 0x05e0, 0xbe12, 0xbd16, 0xb800, 0xd0ec, 0x15b8, 0xba04,
+	0x9294, 0xff00, 0x9286, 0x0600, 0x1190, 0x080c, 0xab73, 0x0598,
+	0x2b08, 0x7028, 0x6052, 0x702c, 0x604e, 0x6112, 0x6023, 0x0006,
+	0x7120, 0x610a, 0x7130, 0x615e, 0x080c, 0xd88c, 0x00f8, 0x080c,
+	0x6a5b, 0x1138, 0xb807, 0x0606, 0x0c40, 0x190c, 0x81ce, 0x11b0,
+	0x0880, 0x080c, 0xab73, 0x2b08, 0x0188, 0x6112, 0x6023, 0x0004,
+	0x7120, 0x610a, 0x9286, 0x0400, 0x1118, 0x6007, 0x0005, 0x0010,
+	0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x91f4, 0x7817, 0x0140,
+	0x00ce, 0x00be, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120,
+	0x2011, 0x8049, 0x080c, 0x4b00, 0x080c, 0xac3b, 0x0d78, 0x2b08,
+	0x6112, 0x6023, 0x0006, 0x7120, 0x610a, 0x7130, 0x615e, 0x6017,
+	0xf300, 0x6003, 0x0001, 0x6007, 0x0041, 0x2009, 0xa022, 0x080c,
+	0x91ed, 0x08e0, 0x00b6, 0x7110, 0xd1bc, 0x05d0, 0x7020, 0x2060,
+	0x9c84, 0x0003, 0x15a8, 0x9c82, 0x1ddc, 0x0690, 0x6868, 0x9c02,
+	0x1678, 0x9484, 0x0fff, 0x9082, 0x000c, 0x0650, 0x7008, 0x9084,
+	0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1510, 0x700c, 0xb914,
+	0x9106, 0x11f0, 0x7124, 0x610a, 0x601c, 0xd0fc, 0x11c8, 0x2001,
+	0x0271, 0x2004, 0x9005, 0x1180, 0x9484, 0x0fff, 0x9082, 0x000c,
+	0x0158, 0x0066, 0x2031, 0x0100, 0xa001, 0xa001, 0x8631, 0x1de0,
+	0x006e, 0x601c, 0xd0fc, 0x1120, 0x2009, 0x0045, 0x080c, 0xac68,
+	0x7817, 0x0140, 0x00be, 0x0005, 0x6120, 0x9186, 0x0002, 0x0128,
+	0x9186, 0x0005, 0x0110, 0x9085, 0x0001, 0x0005, 0x080c, 0x332b,
+	0x1168, 0x7010, 0x9084, 0xff00, 0x8007, 0x9086, 0x0000, 0x1130,
+	0x9184, 0x000f, 0x908a, 0x0006, 0x1208, 0x000b, 0x0005, 0x835d,
+	0x835e, 0x835d, 0x835d, 0x83bd, 0x83cc, 0x0005, 0x00b6, 0x7110,
+	0xd1bc, 0x0120, 0x702c, 0xd084, 0x0904, 0x83bb, 0x700c, 0x7108,
+	0x080c, 0x25fb, 0x1904, 0x83bb, 0x080c, 0x65bd, 0x1904, 0x83bb,
+	0xbe12, 0xbd16, 0x7110, 0xd1bc, 0x01d8, 0x080c, 0x6a5b, 0x0118,
+	0x9086, 0x0004, 0x1588, 0x00c6, 0x080c, 0x83db, 0x00ce, 0x05d8,
+	0x080c, 0xab73, 0x2b08, 0x05b8, 0x6112, 0x080c, 0xcca8, 0x6023,
+	0x0002, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0xac68, 0x0458,
+	0x080c, 0x6a5b, 0x0148, 0x9086, 0x0004, 0x0130, 0x080c, 0x6a63,
+	0x0118, 0x9086, 0x0004, 0x1180, 0x080c, 0xab73, 0x2b08, 0x01d8,
+	0x6112, 0x080c, 0xcca8, 0x6023, 0x0005, 0x7120, 0x610a, 0x2009,
+	0x0088, 0x080c, 0xac68, 0x0078, 0x080c, 0xab73, 0x2b08, 0x0158,
+	0x6112, 0x080c, 0xcca8, 0x6023, 0x0004, 0x7120, 0x610a, 0x2009,
+	0x0001, 0x080c, 0xac68, 0x00be, 0x0005, 0x7110, 0xd1bc, 0x0158,
+	0x00d1, 0x0148, 0x080c, 0x833c, 0x1130, 0x7124, 0x610a, 0x2009,
+	0x0089, 0x080c, 0xac68, 0x0005, 0x7110, 0xd1bc, 0x0158, 0x0059,
+	0x0148, 0x080c, 0x833c, 0x1130, 0x7124, 0x610a, 0x2009, 0x008a,
+	0x080c, 0xac68, 0x0005, 0x7020, 0x2060, 0x9c84, 0x0003, 0x1158,
+	0x9c82, 0x1ddc, 0x0240, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1218,
+	0x9085, 0x0001, 0x0005, 0x9006, 0x0ce8, 0x00b6, 0x7110, 0xd1bc,
+	0x11d8, 0x7024, 0x2060, 0x9c84, 0x0003, 0x11b0, 0x9c82, 0x1ddc,
+	0x0298, 0x6868, 0x9c02, 0x1280, 0x7008, 0x9084, 0x00ff, 0x6110,
+	0x2158, 0xb910, 0x9106, 0x1140, 0x700c, 0xb914, 0x9106, 0x1120,
+	0x2009, 0x0051, 0x080c, 0xac68, 0x7817, 0x0140, 0x00be, 0x0005,
+	0x2031, 0x0105, 0x0069, 0x0005, 0x2031, 0x0206, 0x0049, 0x0005,
+	0x2031, 0x0207, 0x0029, 0x0005, 0x2031, 0x0213, 0x0009, 0x0005,
+	0x00c6, 0x0096, 0x00f6, 0x7000, 0x9084, 0xf000, 0x9086, 0xc000,
+	0x05c0, 0x080c, 0xab73, 0x05a8, 0x0066, 0x00c6, 0x0046, 0x2011,
+	0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x25fb, 0x1590, 0x080c,
+	0x65bd, 0x1578, 0xbe12, 0xbd16, 0x2b00, 0x004e, 0x00ce, 0x6012,
+	0x080c, 0xcca8, 0x080c, 0x103a, 0x0500, 0x2900, 0x6062, 0x9006,
+	0xa802, 0xa866, 0xac6a, 0xa85c, 0x90f8, 0x001b, 0x20a9, 0x000e,
+	0xa860, 0x20e8, 0x20e1, 0x0000, 0x2fa0, 0x2e98, 0x4003, 0x006e,
+	0x6616, 0x6007, 0x003e, 0x6023, 0x0001, 0x6003, 0x0001, 0x080c,
+	0x91f4, 0x00fe, 0x009e, 0x00ce, 0x0005, 0x080c, 0xabc9, 0x006e,
+	0x0cc0, 0x004e, 0x00ce, 0x0cc8, 0x00c6, 0x7000, 0x908c, 0xff00,
+	0x9184, 0xf000, 0x810f, 0x9086, 0x2000, 0x1904, 0x84c3, 0x9186,
+	0x0022, 0x15f0, 0x2001, 0x0111, 0x2004, 0x9005, 0x1904, 0x84c5,
+	0x7030, 0x908e, 0x0400, 0x0904, 0x84c5, 0x908e, 0x6000, 0x05e8,
+	0x908e, 0x5400, 0x05d0, 0x908e, 0x0300, 0x11d8, 0x2009, 0x1837,
+	0x210c, 0xd18c, 0x1590, 0xd1a4, 0x1580, 0x080c, 0x6a19, 0x0558,
+	0x68b0, 0x9084, 0x00ff, 0x7100, 0x918c, 0x00ff, 0x9106, 0x1518,
+	0x6880, 0x69b0, 0x918c, 0xff00, 0x9105, 0x7104, 0x9106, 0x11d8,
+	0x00e0, 0x2009, 0x0103, 0x210c, 0xd1b4, 0x11a8, 0x908e, 0x5200,
+	0x09e8, 0x908e, 0x0500, 0x09d0, 0x908e, 0x5000, 0x09b8, 0x0058,
+	0x9186, 0x0023, 0x1140, 0x080c, 0x83db, 0x0128, 0x6004, 0x9086,
+	0x0002, 0x0118, 0x0000, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce,
+	0x0005, 0x0156, 0x0046, 0x0016, 0x0036, 0x7038, 0x2020, 0x8427,
+	0x94a4, 0x0007, 0xd484, 0x0148, 0x20a9, 0x0004, 0x2019, 0x1805,
+	0x2011, 0x027a, 0x080c, 0xbb8a, 0x1178, 0xd48c, 0x0148, 0x20a9,
+	0x0004, 0x2019, 0x1801, 0x2011, 0x027e, 0x080c, 0xbb8a, 0x1120,
+	0xd494, 0x0110, 0x9085, 0x0001, 0x003e, 0x001e, 0x004e, 0x015e,
+	0x0005, 0x0156, 0x0046, 0x0016, 0x0036, 0x7038, 0x2020, 0x8427,
+	0x94a4, 0x0007, 0xd484, 0x0148, 0x20a9, 0x0004, 0x2019, 0x1805,
+	0x2011, 0x0272, 0x080c, 0xbb8a, 0x1178, 0xd48c, 0x0148, 0x20a9,
+	0x0004, 0x2019, 0x1801, 0x2011, 0x0276, 0x080c, 0xbb8a, 0x1120,
+	0xd494, 0x0110, 0x9085, 0x0001, 0x003e, 0x001e, 0x004e, 0x015e,
+	0x0005, 0x00f6, 0x2079, 0x0200, 0x7800, 0xc0e5, 0xc0cc, 0x7802,
+	0x00fe, 0x0005, 0x00f6, 0x2079, 0x1800, 0x7834, 0xd084, 0x1130,
+	0x2079, 0x0200, 0x7800, 0x9085, 0x1200, 0x7802, 0x00fe, 0x0005,
+	0x00e6, 0x2071, 0x1800, 0x7034, 0xc084, 0x7036, 0x00ee, 0x0005,
+	0x2071, 0x1a03, 0x7003, 0x0003, 0x700f, 0x0361, 0x9006, 0x701a,
+	0x7072, 0x7012, 0x7017, 0x1ddc, 0x7007, 0x0000, 0x7026, 0x702b,
+	0x9e30, 0x7032, 0x7037, 0x9ead, 0x703f, 0xffff, 0x7042, 0x7047,
+	0x556a, 0x704a, 0x705b, 0x86e0, 0x080c, 0x1053, 0x090c, 0x0d7d,
+	0x2900, 0x703a, 0xa867, 0x0003, 0xa86f, 0x0100, 0xa8ab, 0xdcb0,
+	0x0005, 0x2071, 0x1a03, 0x1d04, 0x85fc, 0x2091, 0x6000, 0x700c,
+	0x8001, 0x700e, 0x1590, 0x2001, 0x013c, 0x2004, 0x9005, 0x190c,
+	0x878a, 0x2001, 0x1869, 0x2004, 0xd0c4, 0x0158, 0x3a00, 0xd08c,
+	0x1140, 0x20d1, 0x0000, 0x20d1, 0x0001, 0x20d1, 0x0000, 0x080c,
+	0x0d7d, 0x700f, 0x0361, 0x7007, 0x0001, 0x0126, 0x2091, 0x8000,
+	0x2069, 0x1800, 0x69ec, 0xd1e4, 0x1138, 0xd1dc, 0x1118, 0x080c,
+	0x874e, 0x0010, 0x080c, 0x8725, 0x7040, 0x900d, 0x0148, 0x8109,
+	0x7142, 0x1130, 0x7044, 0x080f, 0x0018, 0x0126, 0x2091, 0x8000,
+	0x7024, 0x900d, 0x0188, 0x7020, 0x8001, 0x7022, 0x1168, 0x7023,
+	0x0009, 0x8109, 0x7126, 0x9186, 0x03e8, 0x1110, 0x7028, 0x080f,
+	0x81ff, 0x1110, 0x7028, 0x080f, 0x7030, 0x900d, 0x0180, 0x702c,
+	0x8001, 0x702e, 0x1160, 0x702f, 0x0009, 0x8109, 0x7132, 0x0128,
+	0x9184, 0x007f, 0x090c, 0x9f49, 0x0010, 0x7034, 0x080f, 0x703c,
+	0x9005, 0x0118, 0x0310, 0x8001, 0x703e, 0x704c, 0x900d, 0x0168,
+	0x7048, 0x8001, 0x704a, 0x1148, 0x704b, 0x0009, 0x8109, 0x714e,
+	0x1120, 0x7150, 0x714e, 0x7058, 0x080f, 0x7018, 0x900d, 0x01d8,
+	0x0016, 0x7070, 0x900d, 0x0158, 0x706c, 0x8001, 0x706e, 0x1138,
+	0x706f, 0x0009, 0x8109, 0x7172, 0x1110, 0x7074, 0x080f, 0x001e,
+	0x7008, 0x8001, 0x700a, 0x1138, 0x700b, 0x0009, 0x8109, 0x711a,
+	0x1110, 0x701c, 0x080f, 0x012e, 0x7004, 0x0002, 0x8624, 0x8625,
+	0x864f, 0x00e6, 0x2071, 0x1a03, 0x7018, 0x9005, 0x1120, 0x711a,
+	0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071,
+	0x1a03, 0x701c, 0x9206, 0x1120, 0x701a, 0x701e, 0x7072, 0x7076,
+	0x000e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1a03, 0xb888, 0x9102,
+	0x0208, 0xb98a, 0x00ee, 0x0005, 0x0005, 0x00b6, 0x2031, 0x0010,
+	0x7110, 0x080c, 0x661e, 0x11a8, 0xb888, 0x8001, 0x0290, 0xb88a,
+	0x1180, 0x0126, 0x2091, 0x8000, 0x0066, 0xb8d0, 0x9005, 0x0138,
+	0x0026, 0xba3c, 0x0016, 0x080c, 0x6749, 0x001e, 0x002e, 0x006e,
+	0x012e, 0x8108, 0x9182, 0x0800, 0x1220, 0x8631, 0x0128, 0x7112,
+	0x0c00, 0x900e, 0x7007, 0x0002, 0x7112, 0x00be, 0x0005, 0x2031,
+	0x0010, 0x7014, 0x2060, 0x0126, 0x2091, 0x8000, 0x6048, 0x9005,
+	0x0128, 0x8001, 0x604a, 0x1110, 0x080c, 0xcb29, 0x6018, 0x9005,
+	0x0904, 0x86a7, 0x00f6, 0x2079, 0x0300, 0x7918, 0xd1b4, 0x1904,
+	0x86ba, 0x781b, 0x2020, 0xa001, 0x7918, 0xd1b4, 0x0120, 0x781b,
+	0x2000, 0x0804, 0x86ba, 0x8001, 0x601a, 0x0106, 0x781b, 0x2000,
+	0xa001, 0x7918, 0xd1ac, 0x1dd0, 0x010e, 0x00fe, 0x1540, 0x6120,
+	0x9186, 0x0003, 0x0148, 0x9186, 0x0006, 0x0130, 0x9186, 0x0009,
+	0x11e0, 0x611c, 0xd1c4, 0x1100, 0x080c, 0xc814, 0x01b0, 0x6014,
+	0x2048, 0xa884, 0x908a, 0x199a, 0x0280, 0x9082, 0x1999, 0xa886,
+	0x908a, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x800b, 0x810b,
+	0x9108, 0x611a, 0x080c, 0xcf5a, 0x0110, 0x080c, 0xc512, 0x012e,
+	0x9c88, 0x001c, 0x7116, 0x2001, 0x181a, 0x2004, 0x9102, 0x1228,
+	0x8631, 0x0138, 0x2160, 0x0804, 0x8653, 0x7017, 0x1ddc, 0x7007,
+	0x0000, 0x0005, 0x00fe, 0x0c58, 0x00e6, 0x2071, 0x1a03, 0x7027,
+	0x07d0, 0x7023, 0x0009, 0x00ee, 0x0005, 0x2001, 0x1a0c, 0x2003,
+	0x0000, 0x0005, 0x00e6, 0x2071, 0x1a03, 0x7132, 0x702f, 0x0009,
+	0x00ee, 0x0005, 0x2011, 0x1a0f, 0x2013, 0x0000, 0x0005, 0x00e6,
+	0x2071, 0x1a03, 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005,
+	0x0086, 0x0026, 0x7054, 0x8000, 0x7056, 0x2001, 0x1a11, 0x2044,
+	0xa06c, 0x9086, 0x0000, 0x0150, 0x7068, 0xa09a, 0x7064, 0xa096,
+	0x7060, 0xa092, 0x705c, 0xa08e, 0x080c, 0x1124, 0x002e, 0x008e,
+	0x0005, 0x0006, 0x0016, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6,
+	0x00e6, 0x00f6, 0x0156, 0x080c, 0x8561, 0x015e, 0x00fe, 0x00ee,
+	0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x001e, 0x000e, 0x0005,
+	0x00e6, 0x2071, 0x1a03, 0x7172, 0x7276, 0x706f, 0x0009, 0x00ee,
+	0x0005, 0x00e6, 0x0006, 0x2071, 0x1a03, 0x7074, 0x9206, 0x1110,
+	0x7072, 0x7076, 0x000e, 0x00ee, 0x0005, 0x2069, 0x1800, 0x69ec,
+	0xd1e4, 0x1518, 0x0026, 0xd1ec, 0x0140, 0x6a54, 0x6874, 0x9202,
+	0x0288, 0x8117, 0x9294, 0x00c1, 0x0088, 0x9184, 0x0007, 0x01a0,
+	0x8109, 0x9184, 0x0007, 0x0110, 0x69ee, 0x0070, 0x8107, 0x9084,
+	0x0007, 0x910d, 0x8107, 0x9106, 0x9094, 0x00c1, 0x9184, 0xff3e,
+	0x9205, 0x68ee, 0x080c, 0x0f05, 0x002e, 0x0005, 0x69e8, 0x9184,
+	0x003f, 0x05b8, 0x8109, 0x9184, 0x003f, 0x01a8, 0x6a54, 0x6874,
+	0x9202, 0x0220, 0xd1bc, 0x0168, 0xc1bc, 0x0018, 0xd1bc, 0x1148,
+	0xc1bd, 0x2110, 0x00e6, 0x2071, 0x1800, 0x080c, 0x0f27, 0x00ee,
+	0x0400, 0x69ea, 0x00f0, 0x0026, 0x8107, 0x9094, 0x0007, 0x0128,
+	0x8001, 0x8007, 0x9085, 0x0007, 0x0050, 0x2010, 0x8004, 0x8004,
+	0x8004, 0x9084, 0x0007, 0x9205, 0x8007, 0x9085, 0x0028, 0x9086,
+	0x0040, 0x2010, 0x00e6, 0x2071, 0x1800, 0x080c, 0x0f27, 0x00ee,
+	0x002e, 0x0005, 0x0016, 0x00c6, 0x2009, 0xfffc, 0x210d, 0x2061,
+	0x0100, 0x60f0, 0x9100, 0x60f3, 0x0000, 0x2009, 0xfffc, 0x200f,
+	0x1220, 0x8108, 0x2105, 0x8000, 0x200f, 0x00ce, 0x001e, 0x0005,
+	0x00c6, 0x2061, 0x1a6f, 0x00ce, 0x0005, 0x9184, 0x000f, 0x8003,
+	0x8003, 0x8003, 0x9080, 0x1a6f, 0x2060, 0x0005, 0xa884, 0x908a,
+	0x199a, 0x1638, 0x9005, 0x1150, 0x00c6, 0x2061, 0x1a6f, 0x6014,
+	0x00ce, 0x9005, 0x1130, 0x2001, 0x001e, 0x0018, 0x908e, 0xffff,
+	0x01b0, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, 0x908c,
+	0x00c0, 0x918e, 0x00c0, 0x0904, 0x8865, 0xd0b4, 0x1168, 0xd0bc,
+	0x1904, 0x883e, 0x2009, 0x0006, 0x080c, 0x8892, 0x0005, 0x900e,
+	0x0c60, 0x2001, 0x1999, 0x08b0, 0xd0fc, 0x05c8, 0x908c, 0x2023,
+	0x1550, 0x87ff, 0x1540, 0x6124, 0x918c, 0x0500, 0x1520, 0x6100,
+	0x918e, 0x0007, 0x1500, 0x2009, 0x1869, 0x210c, 0xd184, 0x11d8,
+	0x6003, 0x0003, 0x6007, 0x0043, 0x6047, 0xb035, 0x080c, 0x1c03,
+	0xa87c, 0xc0dd, 0xa87e, 0x600f, 0x0000, 0x00f6, 0x2079, 0x0380,
+	0x7818, 0xd0bc, 0x1de8, 0x7833, 0x0013, 0x2c00, 0x7836, 0x781b,
+	0x8080, 0x00fe, 0x0005, 0x908c, 0x0003, 0x0120, 0x918e, 0x0003,
+	0x1904, 0x888c, 0x908c, 0x2020, 0x918e, 0x2020, 0x01a8, 0x6024,
+	0xd0d4, 0x11e8, 0x2009, 0x1869, 0x2104, 0xd084, 0x1138, 0x87ff,
+	0x1120, 0x2009, 0x0043, 0x0804, 0xac68, 0x0005, 0x87ff, 0x1de8,
+	0x2009, 0x0042, 0x0804, 0xac68, 0x6110, 0x00b6, 0x2158, 0xb900,
+	0x00be, 0xd1ac, 0x0d20, 0x6024, 0xc0cd, 0x6026, 0x0c00, 0xc0d4,
+	0x6026, 0xa890, 0x602e, 0xa88c, 0x6032, 0x08e0, 0xd0fc, 0x0160,
+	0x908c, 0x0003, 0x0120, 0x918e, 0x0003, 0x1904, 0x888c, 0x908c,
+	0x2020, 0x918e, 0x2020, 0x0170, 0x0076, 0x00f6, 0x2c78, 0x080c,
+	0x1731, 0x00fe, 0x007e, 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c,
+	0xac68, 0x0005, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac,
+	0x0d58, 0x6124, 0xc1cd, 0x6126, 0x0c38, 0xd0fc, 0x0188, 0x908c,
+	0x2020, 0x918e, 0x2020, 0x01a8, 0x9084, 0x0003, 0x908e, 0x0002,
+	0x0148, 0x87ff, 0x1120, 0x2009, 0x0041, 0x080c, 0xac68, 0x0005,
+	0x00b9, 0x0ce8, 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, 0xac68,
+	0x0cb0, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d20,
+	0x6124, 0xc1cd, 0x6126, 0x0c00, 0x2009, 0x0004, 0x0019, 0x0005,
+	0x2009, 0x0001, 0x0096, 0x080c, 0xc814, 0x0518, 0x6014, 0x2048,
+	0xa982, 0xa800, 0x6016, 0x9186, 0x0001, 0x1188, 0xa97c, 0x918c,
+	0x8100, 0x918e, 0x8100, 0x1158, 0x00c6, 0x2061, 0x1a6f, 0x6200,
+	0xd28c, 0x1120, 0x6204, 0x8210, 0x0208, 0x6206, 0x00ce, 0x080c,
+	0x6ba5, 0x6014, 0x904d, 0x0076, 0x2039, 0x0000, 0x190c, 0x87ae,
+	0x007e, 0x009e, 0x0005, 0x0156, 0x00c6, 0x2061, 0x1a6f, 0x6000,
+	0x81ff, 0x0110, 0x9205, 0x0008, 0x9204, 0x6002, 0x00ce, 0x015e,
+	0x0005, 0x6800, 0xd08c, 0x1138, 0x6808, 0x9005, 0x0120, 0x8001,
+	0x680a, 0x9085, 0x0001, 0x0005, 0x2071, 0x1923, 0x7003, 0x0006,
+	0x7007, 0x0000, 0x700f, 0x0000, 0x7013, 0x0001, 0x080c, 0x1053,
+	0x090c, 0x0d7d, 0xa867, 0x0006, 0xa86b, 0x0001, 0xa8ab, 0xdcb0,
+	0xa89f, 0x0000, 0x2900, 0x702e, 0x7033, 0x0000, 0x0005, 0x0096,
+	0x00e6, 0x2071, 0x1923, 0x702c, 0x2048, 0x6a2c, 0x721e, 0x6b30,
+	0x7322, 0x6834, 0x7026, 0xa896, 0x6838, 0x702a, 0xa89a, 0x6824,
+	0x7016, 0x683c, 0x701a, 0x2009, 0x0028, 0x200a, 0x9005, 0x0148,
+	0x900e, 0x9188, 0x000c, 0x8001, 0x1de0, 0x2100, 0x9210, 0x1208,
+	0x8318, 0xaa8e, 0xab92, 0x7010, 0xd084, 0x0178, 0xc084, 0x7007,
+	0x0001, 0x700f, 0x0000, 0x0006, 0x2009, 0x181d, 0x2104, 0x9082,
+	0x0007, 0x2009, 0x1b4e, 0x200a, 0x000e, 0xc095, 0x7012, 0x2008,
+	0x2001, 0x003b, 0x080c, 0x1679, 0x9006, 0x2071, 0x193c, 0x7002,
+	0x7006, 0x702a, 0x00ee, 0x009e, 0x0005, 0x00e6, 0x0126, 0x0156,
+	0x2091, 0x8000, 0x2071, 0x1800, 0x7154, 0x2001, 0x0008, 0x910a,
+	0x0638, 0x2001, 0x187d, 0x20ac, 0x9006, 0x9080, 0x0008, 0x1f04,
+	0x8945, 0x71c0, 0x9102, 0x02e0, 0x2071, 0x1877, 0x20a9, 0x0007,
+	0x00c6, 0x080c, 0xab73, 0x6023, 0x0009, 0x6003, 0x0004, 0x601f,
+	0x0101, 0x0089, 0x0126, 0x2091, 0x8000, 0x080c, 0x8acb, 0x012e,
+	0x1f04, 0x8951, 0x9006, 0x00ce, 0x015e, 0x012e, 0x00ee, 0x0005,
+	0x9085, 0x0001, 0x0cc8, 0x00e6, 0x00b6, 0x0096, 0x0086, 0x0056,
+	0x0046, 0x0026, 0x7118, 0x720c, 0x7620, 0x7004, 0xd084, 0x1128,
+	0x2021, 0x0024, 0x2029, 0x0002, 0x0020, 0x2021, 0x002c, 0x2029,
+	0x000a, 0x080c, 0x103a, 0x090c, 0x0d7d, 0x2900, 0x6016, 0x2058,
+	0xac66, 0x9006, 0xa802, 0xa806, 0xa86a, 0xa87a, 0xa8aa, 0xa887,
+	0x0005, 0xa87f, 0x0020, 0x7008, 0xa89a, 0x7010, 0xa89e, 0xae8a,
+	0xa8af, 0xffff, 0xa8b3, 0x0000, 0x8109, 0x0160, 0x080c, 0x103a,
+	0x090c, 0x0d7d, 0xad66, 0x2b00, 0xa802, 0x2900, 0xb806, 0x2058,
+	0x8109, 0x1da0, 0x002e, 0x004e, 0x005e, 0x008e, 0x009e, 0x00be,
+	0x00ee, 0x0005, 0x2079, 0x0000, 0x2071, 0x1923, 0x7004, 0x004b,
+	0x700c, 0x0002, 0x89bd, 0x89b6, 0x89b6, 0x0005, 0x89c7, 0x8a28,
+	0x8a28, 0x8a28, 0x8a29, 0x8a3a, 0x8a3a, 0x700c, 0x0cba, 0x0126,
+	0x2091, 0x8000, 0x78a0, 0x79a0, 0x9106, 0x0128, 0x78a0, 0x79a0,
+	0x9106, 0x1904, 0x8a1b, 0x2001, 0x0005, 0x2004, 0xd0bc, 0x0130,
+	0x2011, 0x0004, 0x2204, 0xc0c5, 0x2012, 0x0ca8, 0x012e, 0x7018,
+	0x910a, 0x1130, 0x7030, 0x9005, 0x05a8, 0x080c, 0x8a69, 0x0490,
+	0x1210, 0x7114, 0x910a, 0x9192, 0x000a, 0x0210, 0x2009, 0x000a,
+	0x2001, 0x1888, 0x2014, 0x2001, 0x1935, 0x2004, 0x9100, 0x9202,
+	0x0e48, 0x080c, 0x8bb5, 0x2200, 0x9102, 0x0208, 0x2208, 0x0096,
+	0x702c, 0x2048, 0xa873, 0x0001, 0xa976, 0x080c, 0x8cbe, 0x2100,
+	0xa87e, 0xa86f, 0x0000, 0x009e, 0x0126, 0x2091, 0x8000, 0x2009,
+	0x1a21, 0x2104, 0xc085, 0x200a, 0x700f, 0x0002, 0x012e, 0x080c,
+	0x1143, 0x1de8, 0x0005, 0x2001, 0x0005, 0x2004, 0xd0bc, 0x0130,
+	0x2011, 0x0004, 0x2204, 0xc0c5, 0x2012, 0x0ca8, 0x012e, 0x0005,
+	0x0005, 0x700c, 0x0002, 0x8a2e, 0x8a31, 0x8a30, 0x080c, 0x89c5,
+	0x0005, 0x8001, 0x700e, 0x0096, 0x702c, 0x2048, 0xa974, 0x009e,
+	0x0011, 0x0ca0, 0x0005, 0x0096, 0x702c, 0x2048, 0x7018, 0x9100,
+	0x7214, 0x921a, 0x1130, 0x701c, 0xa88e, 0x7020, 0xa892, 0x9006,
+	0x0068, 0x0006, 0x080c, 0x8cbe, 0x2100, 0xaa8c, 0x9210, 0xaa8e,
+	0x1220, 0xa890, 0x9081, 0x0000, 0xa892, 0x000e, 0x009e, 0x2f08,
+	0x9188, 0x0028, 0x200a, 0x701a, 0x0005, 0x00e6, 0x2071, 0x1923,
+	0x700c, 0x0002, 0x8a67, 0x8a67, 0x8a65, 0x700f, 0x0001, 0x00ee,
+	0x0005, 0x0126, 0x2091, 0x8000, 0x7030, 0x9005, 0x0508, 0x2078,
+	0x7814, 0x2048, 0xae88, 0x00b6, 0x2059, 0x0000, 0x080c, 0x8ad4,
+	0x00be, 0x01b0, 0x00e6, 0x2071, 0x193c, 0x080c, 0x8b1b, 0x00ee,
+	0x0178, 0x0096, 0x080c, 0x1053, 0x2900, 0x009e, 0x0148, 0xa8aa,
+	0x04b9, 0x0041, 0x2001, 0x1946, 0x2003, 0x0000, 0x012e, 0x08c8,
+	0x012e, 0x0005, 0x00d6, 0x00c6, 0x0086, 0x00a6, 0x2940, 0x2650,
+	0x2600, 0x9005, 0x0180, 0xa864, 0x9084, 0x000f, 0x2068, 0x9d88,
+	0x1e55, 0x2165, 0x0056, 0x2029, 0x0000, 0x080c, 0x8c43, 0x080c,
+	0x1e2b, 0x1dd8, 0x005e, 0x00ae, 0x2001, 0x187f, 0x2004, 0xa88a,
+	0x080c, 0x1731, 0x781f, 0x0101, 0x7813, 0x0000, 0x0126, 0x2091,
+	0x8000, 0x080c, 0x8b2a, 0x012e, 0x008e, 0x00ce, 0x00de, 0x0005,
+	0x7030, 0x9005, 0x0138, 0x2078, 0x780c, 0x7032, 0x2001, 0x1946,
+	0x2003, 0x0001, 0x0005, 0x00e6, 0x2071, 0x1923, 0x7030, 0x600e,
+	0x2c00, 0x7032, 0x00ee, 0x0005, 0x00d6, 0x00c6, 0x0026, 0x9b80,
+	0x8d9d, 0x2005, 0x906d, 0x090c, 0x0d7d, 0x9b80, 0x8d95, 0x2005,
+	0x9065, 0x090c, 0x0d7d, 0x6114, 0x2600, 0x9102, 0x0248, 0x6828,
+	0x9102, 0x02f0, 0x9085, 0x0001, 0x002e, 0x00ce, 0x00de, 0x0005,
+	0x6804, 0xd094, 0x0148, 0x6854, 0xd084, 0x1178, 0xc085, 0x6856,
+	0x2011, 0x8026, 0x080c, 0x4b00, 0x684c, 0x0096, 0x904d, 0x090c,
+	0x0d7d, 0xa804, 0x8000, 0xa806, 0x009e, 0x9006, 0x2030, 0x0c20,
+	0x6854, 0xd08c, 0x1d08, 0xc08d, 0x6856, 0x2011, 0x8025, 0x080c,
+	0x4b00, 0x684c, 0x0096, 0x904d, 0x090c, 0x0d7d, 0xa800, 0x8000,
+	0xa802, 0x009e, 0x0888, 0x7000, 0x2019, 0x0008, 0x8319, 0x7104,
+	0x9102, 0x1118, 0x2300, 0x9005, 0x0020, 0x0210, 0x9302, 0x0008,
+	0x8002, 0x0005, 0x00d6, 0x7814, 0x9005, 0x090c, 0x0d7d, 0x781c,
+	0x9084, 0x0101, 0x9086, 0x0101, 0x190c, 0x0d7d, 0x2069, 0x193c,
+	0x6804, 0x9080, 0x193e, 0x2f08, 0x2102, 0x6904, 0x8108, 0x9182,
+	0x0008, 0x0208, 0x900e, 0x6906, 0x9180, 0x193e, 0x2003, 0x0000,
+	0x00de, 0x0005, 0x0096, 0x00c6, 0x2060, 0x6014, 0x2048, 0xa8a8,
+	0x0096, 0x2048, 0x9005, 0x190c, 0x106c, 0x009e, 0xa8ab, 0x0000,
+	0x080c, 0x0fec, 0x080c, 0xabc9, 0x00ce, 0x009e, 0x0005, 0x6020,
+	0x9086, 0x0009, 0x1128, 0x601c, 0xd0c4, 0x0110, 0x9006, 0x0005,
+	0x9085, 0x0001, 0x0005, 0x6000, 0x9086, 0x0000, 0x0178, 0x6010,
+	0x9005, 0x0150, 0x00b6, 0x2058, 0x080c, 0x8ed0, 0x00be, 0x6013,
+	0x0000, 0x601b, 0x0000, 0x0010, 0x2c00, 0x0861, 0x0005, 0x2009,
+	0x1927, 0x210c, 0xd194, 0x0005, 0x00e6, 0x2071, 0x1923, 0x7110,
+	0xc194, 0xd19c, 0x1118, 0xc185, 0x7007, 0x0000, 0x7112, 0x2001,
+	0x003b, 0x080c, 0x1679, 0x00ee, 0x0005, 0x0096, 0x00d6, 0x9006,
+	0x7006, 0x700e, 0x701a, 0x701e, 0x7022, 0x7016, 0x702a, 0x7026,
+	0x702f, 0x0000, 0x080c, 0x8d1d, 0x0170, 0x080c, 0x8d52, 0x0158,
+	0x2900, 0x7002, 0x700a, 0x701a, 0x7013, 0x0001, 0x701f, 0x000a,
+	0x00de, 0x009e, 0x0005, 0x900e, 0x0cd8, 0x00e6, 0x0096, 0x0086,
+	0x00d6, 0x00c6, 0x2071, 0x1930, 0x721c, 0x2100, 0x9202, 0x1618,
+	0x080c, 0x8d52, 0x090c, 0x0d7d, 0x7018, 0x9005, 0x1160, 0x2900,
+	0x7002, 0x700a, 0x701a, 0x9006, 0x7006, 0x700e, 0xa806, 0xa802,
+	0x7012, 0x701e, 0x0038, 0x2040, 0xa806, 0x2900, 0xa002, 0x701a,
+	0xa803, 0x0000, 0x7010, 0x8000, 0x7012, 0x701c, 0x9080, 0x000a,
+	0x701e, 0x721c, 0x08d0, 0x721c, 0x00ce, 0x00de, 0x008e, 0x009e,
+	0x00ee, 0x0005, 0x0096, 0x0156, 0x0136, 0x0146, 0x00e6, 0x0126,
+	0x2091, 0x8000, 0x2071, 0x1930, 0x7300, 0x831f, 0x831e, 0x831e,
+	0x9384, 0x003f, 0x20e8, 0x939c, 0xffc0, 0x9398, 0x0003, 0x7104,
+	0x080c, 0x8cbe, 0x810c, 0x2100, 0x9318, 0x8003, 0x2228, 0x2021,
+	0x0078, 0x9402, 0x9532, 0x0208, 0x2028, 0x2500, 0x8004, 0x20a8,
+	0x23a0, 0xa001, 0xa001, 0x4005, 0x2508, 0x080c, 0x8cc7, 0x2130,
+	0x7014, 0x9600, 0x7016, 0x2600, 0x711c, 0x9102, 0x701e, 0x7004,
+	0x9600, 0x2008, 0x9082, 0x000a, 0x1190, 0x7000, 0x2048, 0xa800,
+	0x9005, 0x1148, 0x2009, 0x0001, 0x0026, 0x080c, 0x8bb5, 0x002e,
+	0x7000, 0x2048, 0xa800, 0x7002, 0x7007, 0x0000, 0x0008, 0x7106,
+	0x2500, 0x9212, 0x1904, 0x8bf4, 0x012e, 0x00ee, 0x014e, 0x013e,
+	0x015e, 0x009e, 0x0005, 0x0016, 0x0026, 0x00e6, 0x0126, 0x2091,
+	0x8000, 0x9580, 0x8d95, 0x2005, 0x9075, 0x090c, 0x0d7d, 0x080c,
+	0x8c99, 0x012e, 0x9580, 0x8d91, 0x2005, 0x9075, 0x090c, 0x0d7d,
+	0x0156, 0x0136, 0x01c6, 0x0146, 0x01d6, 0x831f, 0x831e, 0x831e,
+	0x9384, 0x003f, 0x20e0, 0x9384, 0xffc0, 0x9100, 0x2098, 0xa860,
+	0x20e8, 0xa95c, 0x2c05, 0x9100, 0x20a0, 0x20a9, 0x0002, 0x4003,
+	0x2e0c, 0x2d00, 0x0002, 0x8c83, 0x8c83, 0x8c85, 0x8c83, 0x8c85,
+	0x8c83, 0x8c83, 0x8c83, 0x8c83, 0x8c83, 0x8c8b, 0x8c83, 0x8c8b,
+	0x8c83, 0x8c83, 0x8c83, 0x080c, 0x0d7d, 0x4104, 0x20a9, 0x0002,
+	0x4002, 0x4003, 0x0028, 0x20a9, 0x0002, 0x4003, 0x4104, 0x4003,
+	0x01de, 0x014e, 0x01ce, 0x013e, 0x015e, 0x00ee, 0x002e, 0x001e,
+	0x0005, 0x0096, 0x7014, 0x8001, 0x7016, 0x710c, 0x2110, 0x00f1,
+	0x810c, 0x9188, 0x0003, 0x7308, 0x8210, 0x9282, 0x000a, 0x1198,
+	0x7008, 0x2048, 0xa800, 0x9005, 0x0158, 0x0006, 0x080c, 0x8d61,
+	0x009e, 0xa807, 0x0000, 0x2900, 0x700a, 0x7010, 0x8001, 0x7012,
+	0x700f, 0x0000, 0x0008, 0x720e, 0x009e, 0x0005, 0x0006, 0x810b,
+	0x810b, 0x2100, 0x810b, 0x9100, 0x2008, 0x000e, 0x0005, 0x0006,
+	0x0026, 0x2100, 0x9005, 0x0158, 0x9092, 0x000c, 0x0240, 0x900e,
+	0x8108, 0x9082, 0x000c, 0x1de0, 0x002e, 0x000e, 0x0005, 0x900e,
+	0x0cd8, 0x2d00, 0x90b8, 0x0008, 0x690c, 0x6810, 0x2019, 0x0001,
+	0x2031, 0x8d07, 0x9112, 0x0220, 0x0118, 0x8318, 0x2208, 0x0cd0,
+	0x6808, 0x9005, 0x0108, 0x8318, 0x233a, 0x6804, 0xd084, 0x2300,
+	0x2021, 0x0001, 0x1150, 0x9082, 0x0003, 0x0967, 0x0a67, 0x8420,
+	0x9082, 0x0007, 0x0967, 0x0a67, 0x0cd0, 0x9082, 0x0002, 0x0967,
+	0x0a67, 0x8420, 0x9082, 0x0005, 0x0967, 0x0a67, 0x0cd0, 0x6c1a,
+	0x2d00, 0x90b8, 0x0007, 0x00e6, 0x2071, 0x1800, 0x7128, 0x6810,
+	0x2019, 0x0001, 0x910a, 0x0118, 0x0210, 0x8318, 0x0cd8, 0x2031,
+	0x8d1a, 0x0870, 0x6c16, 0x00ee, 0x0005, 0x0096, 0x0046, 0x0126,
+	0x2091, 0x8000, 0x2b00, 0x9080, 0x8d99, 0x2005, 0x9005, 0x090c,
+	0x0d7d, 0x2004, 0x90a0, 0x000a, 0x080c, 0x1053, 0x01d0, 0x2900,
+	0x7026, 0xa803, 0x0000, 0xa807, 0x0000, 0x080c, 0x1053, 0x0188,
+	0x7024, 0xa802, 0xa807, 0x0000, 0x2900, 0x7026, 0x94a2, 0x000a,
+	0x0110, 0x0208, 0x0c90, 0x9085, 0x0001, 0x012e, 0x004e, 0x009e,
+	0x0005, 0x7024, 0x9005, 0x0dc8, 0x2048, 0xac00, 0x080c, 0x106c,
+	0x2400, 0x0cc0, 0x0126, 0x2091, 0x8000, 0x7024, 0x2048, 0x9005,
+	0x0130, 0xa800, 0x7026, 0xa803, 0x0000, 0xa807, 0x0000, 0x012e,
+	0x0005, 0x0126, 0x2091, 0x8000, 0x7024, 0xa802, 0x2900, 0x7026,
+	0x012e, 0x0005, 0x0096, 0x9e80, 0x0009, 0x2004, 0x9005, 0x0138,
+	0x2048, 0xa800, 0x0006, 0x080c, 0x106c, 0x000e, 0x0cb8, 0x009e,
+	0x0005, 0x0096, 0x7008, 0x9005, 0x0138, 0x2048, 0xa800, 0x0006,
+	0x080c, 0x106c, 0x000e, 0x0cb8, 0x9006, 0x7002, 0x700a, 0x7006,
+	0x700e, 0x701a, 0x701e, 0x7022, 0x702a, 0x7026, 0x702e, 0x009e,
+	0x0005, 0x1a6d, 0x0000, 0x0000, 0x0000, 0x1930, 0x0000, 0x0000,
+	0x0000, 0x1888, 0x0000, 0x0000, 0x0000, 0x1877, 0x0000, 0x0000,
+	0x0000, 0x00e6, 0x00c6, 0x00b6, 0x00a6, 0xa8a8, 0x2040, 0x2071,
+	0x1877, 0x080c, 0x8ebb, 0xa067, 0x0023, 0x6010, 0x905d, 0x0904,
+	0x8e90, 0xb814, 0xa06e, 0xb910, 0xa172, 0xb9a0, 0xa176, 0x2001,
+	0x0003, 0xa07e, 0xa834, 0xa082, 0xa07b, 0x0000, 0xa898, 0x9005,
+	0x0118, 0xa078, 0xc085, 0xa07a, 0x2858, 0x2031, 0x0018, 0xa068,
+	0x908a, 0x0019, 0x1a0c, 0x0d7d, 0x2020, 0x2050, 0x2940, 0xa864,
+	0x90bc, 0x00ff, 0x908c, 0x000f, 0x91e0, 0x1e55, 0x2c65, 0x9786,
+	0x0024, 0x2c05, 0x1590, 0x908a, 0x0036, 0x1a0c, 0x0d7d, 0x9082,
+	0x001b, 0x0002, 0x8dfd, 0x8dfd, 0x8dff, 0x8dfd, 0x8dfd, 0x8dfd,
+	0x8e01, 0x8dfd, 0x8dfd, 0x8dfd, 0x8e03, 0x8dfd, 0x8dfd, 0x8dfd,
+	0x8e05, 0x8dfd, 0x8dfd, 0x8dfd, 0x8e07, 0x8dfd, 0x8dfd, 0x8dfd,
+	0x8e09, 0x8dfd, 0x8dfd, 0x8dfd, 0x8e0b, 0x080c, 0x0d7d, 0xa180,
+	0x04b8, 0xa190, 0x04a8, 0xa1a0, 0x0498, 0xa1b0, 0x0488, 0xa1c0,
+	0x0478, 0xa1d0, 0x0468, 0xa1e0, 0x0458, 0x908a, 0x0034, 0x1a0c,
+	0x0d7d, 0x9082, 0x001b, 0x0002, 0x8e2f, 0x8e2d, 0x8e2d, 0x8e2d,
+	0x8e2d, 0x8e2d, 0x8e31, 0x8e2d, 0x8e2d, 0x8e2d, 0x8e2d, 0x8e2d,
+	0x8e33, 0x8e2d, 0x8e2d, 0x8e2d, 0x8e2d, 0x8e2d, 0x8e35, 0x8e2d,
+	0x8e2d, 0x8e2d, 0x8e2d, 0x8e2d, 0x8e37, 0x080c, 0x0d7d, 0xa180,
+	0x0038, 0xa198, 0x0028, 0xa1b0, 0x0018, 0xa1c8, 0x0008, 0xa1e0,
+	0x2600, 0x0002, 0x8e53, 0x8e55, 0x8e57, 0x8e59, 0x8e5b, 0x8e5d,
+	0x8e5f, 0x8e61, 0x8e63, 0x8e65, 0x8e67, 0x8e69, 0x8e6b, 0x8e6d,
+	0x8e6f, 0x8e71, 0x8e73, 0x8e75, 0x8e77, 0x8e79, 0x8e7b, 0x8e7d,
+	0x8e7f, 0x8e81, 0x8e83, 0x080c, 0x0d7d, 0xb9e2, 0x0468, 0xb9de,
+	0x0458, 0xb9da, 0x0448, 0xb9d6, 0x0438, 0xb9d2, 0x0428, 0xb9ce,
+	0x0418, 0xb9ca, 0x0408, 0xb9c6, 0x00f8, 0xb9c2, 0x00e8, 0xb9be,
+	0x00d8, 0xb9ba, 0x00c8, 0xb9b6, 0x00b8, 0xb9b2, 0x00a8, 0xb9ae,
+	0x0098, 0xb9aa, 0x0088, 0xb9a6, 0x0078, 0xb9a2, 0x0068, 0xb99e,
+	0x0058, 0xb99a, 0x0048, 0xb996, 0x0038, 0xb992, 0x0028, 0xb98e,
+	0x0018, 0xb98a, 0x0008, 0xb986, 0x8631, 0x8421, 0x0120, 0x080c,
+	0x1e2b, 0x0804, 0x8dd7, 0x00ae, 0x00be, 0x00ce, 0x00ee, 0x0005,
+	0xa86c, 0xa06e, 0xa870, 0xa072, 0xa077, 0x00ff, 0x9006, 0x0804,
+	0x8db9, 0x0006, 0x0016, 0x00b6, 0x6010, 0x2058, 0xb810, 0x9005,
+	0x01b0, 0x2001, 0x1924, 0x2004, 0x9005, 0x0188, 0x2001, 0x1800,
+	0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0xbba0, 0x2021,
+	0x0004, 0x2011, 0x8014, 0x080c, 0x4b00, 0x004e, 0x003e, 0x00be,
+	0x001e, 0x000e, 0x0005, 0x9016, 0x710c, 0xa834, 0x910a, 0xa936,
+	0x7008, 0x9005, 0x0120, 0x8210, 0x910a, 0x0238, 0x0130, 0x7010,
+	0x8210, 0x910a, 0x0210, 0x0108, 0x0cd8, 0xaa8a, 0xa26a, 0x0005,
+	0x00f6, 0x00d6, 0x0036, 0x2079, 0x0300, 0x781b, 0x0200, 0x7818,
+	0xd094, 0x1dd8, 0x781b, 0x0202, 0xa001, 0xa001, 0x7818, 0xd094,
+	0x1da0, 0xb8ac, 0x9005, 0x01b8, 0x2068, 0x2079, 0x0000, 0x2c08,
+	0x911e, 0x1118, 0x680c, 0xb8ae, 0x0060, 0x9106, 0x0140, 0x2d00,
+	0x2078, 0x680c, 0x9005, 0x090c, 0x0d7d, 0x2068, 0x0cb0, 0x6b0c,
+	0x7b0e, 0x600f, 0x0000, 0x2079, 0x0300, 0x781b, 0x0200, 0x003e,
+	0x00de, 0x00fe, 0x0005, 0x00e6, 0x00d6, 0x0096, 0x00c6, 0x0036,
+	0x0126, 0x2091, 0x8000, 0x0156, 0x20a9, 0x01ff, 0x2071, 0x0300,
+	0x701b, 0x0200, 0x7018, 0xd094, 0x0110, 0x1f04, 0x8f10, 0x701b,
+	0x0202, 0xa001, 0xa001, 0x7018, 0xd094, 0x1d90, 0xb8ac, 0x9005,
+	0x01d0, 0x2060, 0x600c, 0xb8ae, 0x6003, 0x0004, 0x601b, 0x0000,
+	0x6013, 0x0000, 0x601f, 0x0101, 0x6014, 0x2048, 0xa88b, 0x0000,
+	0xa8a8, 0xa8ab, 0x0000, 0x904d, 0x090c, 0x0d7d, 0x080c, 0x106c,
+	0x080c, 0x8acb, 0x0c18, 0x2071, 0x0300, 0x701b, 0x0200, 0x015e,
+	0x012e, 0x003e, 0x00ce, 0x009e, 0x00de, 0x00ee, 0x0005, 0x00c6,
+	0x00b6, 0x0016, 0x0006, 0x0156, 0x080c, 0x25fb, 0x015e, 0x11b0,
+	0x080c, 0x65bd, 0x190c, 0x0d7d, 0x000e, 0x001e, 0xb912, 0xb816,
+	0x080c, 0xab73, 0x0140, 0x2b00, 0x6012, 0x6023, 0x0001, 0x2009,
+	0x0001, 0x080c, 0xac68, 0x00be, 0x00ce, 0x0005, 0x000e, 0x001e,
+	0x0cd0, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d7d, 0x0013,
+	0x006e, 0x0005, 0x8f82, 0x8f82, 0x8f82, 0x8f84, 0x8fcd, 0x8f82,
+	0x8f82, 0x8f82, 0x9030, 0x8f82, 0x9068, 0x8f82, 0x8f82, 0x8f82,
+	0x8f82, 0x8f82, 0x080c, 0x0d7d, 0x9182, 0x0040, 0x0002, 0x8f97,
+	0x8f97, 0x8f97, 0x8f97, 0x8f97, 0x8f97, 0x8f97, 0x8f97, 0x8f97,
+	0x8f99, 0x8faa, 0x8f97, 0x8f97, 0x8f97, 0x8f97, 0x8fbb, 0x080c,
+	0x0d7d, 0x0096, 0x6114, 0x2148, 0xa87b, 0x0000, 0x6010, 0x00b6,
+	0x2058, 0xb8bb, 0x0500, 0x00be, 0x080c, 0x6b70, 0x080c, 0xabc9,
+	0x009e, 0x0005, 0x080c, 0x960a, 0x00d6, 0x6114, 0x080c, 0xc814,
+	0x0130, 0x0096, 0x6114, 0x2148, 0x080c, 0x6d70, 0x009e, 0x00de,
+	0x080c, 0xabc9, 0x0005, 0x080c, 0x960a, 0x080c, 0x31e4, 0x6114,
+	0x0096, 0x2148, 0x080c, 0xc814, 0x0120, 0xa87b, 0x0029, 0x080c,
+	0x6d70, 0x009e, 0x080c, 0xabc9, 0x0005, 0x601b, 0x0000, 0x9182,
+	0x0040, 0x0096, 0x0002, 0x8fe8, 0x8fe8, 0x8fe8, 0x8fe8, 0x8fe8,
+	0x8fe8, 0x8fe8, 0x8fe8, 0x8fea, 0x8fe8, 0x8fe8, 0x8fe8, 0x902c,
+	0x8fe8, 0x8fe8, 0x8fe8, 0x8fe8, 0x8fe8, 0x8fe8, 0x8ff0, 0x8fe8,
+	0x080c, 0x0d7d, 0x6114, 0x2148, 0xa938, 0x918e, 0xffff, 0x05e0,
+	0x00e6, 0x6114, 0x2148, 0x080c, 0x8da1, 0x0096, 0xa8a8, 0x2048,
+	0x080c, 0x6b08, 0x009e, 0xa8ab, 0x0000, 0x6010, 0x9005, 0x0128,
+	0x00b6, 0x2058, 0x080c, 0x8ed0, 0x00be, 0xae88, 0x00b6, 0x2059,
+	0x0000, 0x080c, 0x8ad4, 0x00be, 0x01e0, 0x2071, 0x193c, 0x080c,
+	0x8b1b, 0x01b8, 0x9086, 0x0001, 0x1128, 0x2001, 0x1946, 0x2004,
+	0x9005, 0x1178, 0x0096, 0x080c, 0x103a, 0x2900, 0x009e, 0x0148,
+	0xa8aa, 0x00f6, 0x2c78, 0x080c, 0x8a92, 0x00fe, 0x00ee, 0x009e,
+	0x0005, 0x080c, 0x8acb, 0x0cd0, 0x080c, 0x90e4, 0x009e, 0x0005,
+	0x9182, 0x0040, 0x0096, 0x0002, 0x9044, 0x9044, 0x9044, 0x9046,
+	0x9044, 0x9044, 0x9044, 0x9066, 0x9044, 0x9044, 0x9044, 0x9044,
+	0x9044, 0x9044, 0x9044, 0x9044, 0x080c, 0x0d7d, 0x6003, 0x0003,
+	0x6106, 0x6014, 0x2048, 0xa8ac, 0xa836, 0xa8b0, 0xa83a, 0xa847,
+	0x0000, 0xa84b, 0x0000, 0xa884, 0x9092, 0x199a, 0x0210, 0x2001,
+	0x1999, 0x8003, 0x8013, 0x8213, 0x9210, 0x621a, 0x080c, 0x1bba,
+	0x2009, 0x8030, 0x080c, 0x9234, 0x009e, 0x0005, 0x080c, 0x0d7d,
+	0x080c, 0x960a, 0x6114, 0x2148, 0xa87b, 0x0000, 0x6010, 0x00b6,
+	0x2058, 0xb8bb, 0x0500, 0x00be, 0x080c, 0x6d70, 0x080c, 0xabc9,
+	0x009e, 0x0005, 0x080c, 0xa872, 0x6144, 0xd1fc, 0x0120, 0xd1ac,
+	0x1110, 0x6003, 0x0003, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7d,
+	0x0096, 0x0023, 0x009e, 0x080c, 0xa88e, 0x0005, 0x909e, 0x909e,
+	0x909e, 0x90a0, 0x90b1, 0x909e, 0x909e, 0x909e, 0x909e, 0x909e,
+	0x909e, 0x909e, 0x909e, 0x909e, 0x909e, 0x909e, 0x080c, 0x0d7d,
+	0x080c, 0xaa06, 0x6114, 0x2148, 0xa87b, 0x0006, 0x6010, 0x00b6,
+	0x2058, 0xb8bb, 0x0500, 0x00be, 0x080c, 0x6d70, 0x080c, 0xabc9,
+	0x0005, 0x0491, 0x0005, 0x080c, 0xa872, 0x6000, 0x6144, 0xd1fc,
+	0x0130, 0xd1ac, 0x1120, 0x6003, 0x0003, 0x2009, 0x0003, 0x908a,
+	0x0016, 0x1a0c, 0x0d7d, 0x0096, 0x0033, 0x009e, 0x0106, 0x080c,
+	0xa88e, 0x010e, 0x0005, 0x90db, 0x90db, 0x90db, 0x90dd, 0x90e4,
+	0x90db, 0x90db, 0x90db, 0x90db, 0x90db, 0x90db, 0x90db, 0x90db,
+	0x90db, 0x90db, 0x90db, 0x080c, 0x0d7d, 0x0036, 0x00e6, 0x080c,
+	0xaa06, 0x00ee, 0x003e, 0x0005, 0x00f6, 0x00e6, 0x601b, 0x0000,
+	0x6014, 0x2048, 0x6010, 0x9005, 0x0128, 0x00b6, 0x2058, 0x080c,
+	0x8ed0, 0x00be, 0x2071, 0x193c, 0x080c, 0x8b1b, 0x0160, 0x2001,
+	0x187f, 0x2004, 0xa88a, 0x2031, 0x0000, 0x2c78, 0x080c, 0x8a92,
+	0x00ee, 0x00fe, 0x0005, 0x0096, 0xa88b, 0x0000, 0xa8a8, 0x2048,
+	0x080c, 0x106c, 0x009e, 0xa8ab, 0x0000, 0x080c, 0x8acb, 0x0c80,
+	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+	0x0000, 0x187a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+	0x0126, 0x2091, 0x8000, 0x0036, 0x0046, 0x20a9, 0x0010, 0x9006,
+	0x8004, 0x8086, 0x818e, 0x1208, 0x9200, 0x1f04, 0x9129, 0x8086,
+	0x818e, 0x004e, 0x003e, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000,
+	0x0076, 0x0156, 0x20a9, 0x0010, 0x9005, 0x01c8, 0x911a, 0x12b8,
+	0x8213, 0x818d, 0x0228, 0x911a, 0x1220, 0x1f04, 0x9140, 0x0028,
+	0x911a, 0x2308, 0x8210, 0x1f04, 0x9140, 0x0006, 0x3200, 0x9084,
+	0xefff, 0x2080, 0x000e, 0x015e, 0x007e, 0x012e, 0x0005, 0x0006,
+	0x3200, 0x9085, 0x1000, 0x0ca8, 0x0126, 0x2091, 0x2800, 0x2079,
+	0x19e7, 0x012e, 0x00d6, 0x2069, 0x19e7, 0x6803, 0x0005, 0x0156,
+	0x0146, 0x01d6, 0x20e9, 0x0000, 0x2069, 0x0200, 0x080c, 0xa66c,
+	0x04a9, 0x080c, 0xa657, 0x0491, 0x080c, 0xa65a, 0x0479, 0x080c,
+	0xa65d, 0x0461, 0x080c, 0xa660, 0x0449, 0x080c, 0xa663, 0x0431,
+	0x080c, 0xa666, 0x0419, 0x080c, 0xa669, 0x0401, 0x01de, 0x014e,
+	0x015e, 0x6857, 0x0000, 0x00f6, 0x2079, 0x0380, 0x00f9, 0x7807,
+	0x0003, 0x7803, 0x0000, 0x7803, 0x0001, 0x2069, 0x0004, 0x2d04,
+	0x9084, 0xfffe, 0x9085, 0x8000, 0x206a, 0x2069, 0x0100, 0x6828,
+	0x9084, 0xfffc, 0x682a, 0x00fe, 0x00de, 0x0005, 0x20a9, 0x0020,
+	0x20a1, 0x0240, 0x2001, 0x0000, 0x4004, 0x0005, 0x00c6, 0x7803,
+	0x0000, 0x9006, 0x7827, 0x0030, 0x782b, 0x0400, 0x7827, 0x0031,
+	0x782b, 0x1aef, 0x781f, 0xff00, 0x781b, 0xff00, 0x2061, 0x1ae4,
+	0x602f, 0x19e7, 0x6033, 0x1800, 0x6037, 0x1a03, 0x603b, 0x1e55,
+	0x603f, 0x1e65, 0x6042, 0x6047, 0x1aba, 0x00ce, 0x0005, 0x2001,
+	0x0382, 0x2004, 0x9084, 0x0007, 0x9086, 0x0001, 0x01b0, 0x00c6,
+	0x6146, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19e7, 0x602c, 0x8000,
+	0x602e, 0x601c, 0x9005, 0x0130, 0x9080, 0x0003, 0x2102, 0x611e,
+	0x00ce, 0x0005, 0x6122, 0x611e, 0x0cd8, 0x6146, 0x2c08, 0x2001,
+	0x0012, 0x080c, 0xa863, 0x0005, 0x0016, 0x2009, 0x8020, 0x6146,
+	0x2c08, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, 0x0001,
+	0x1128, 0x2001, 0x0019, 0x080c, 0xa863, 0x0088, 0x00c6, 0x2061,
+	0x19e7, 0x602c, 0x8000, 0x602e, 0x600c, 0x9005, 0x0128, 0x9080,
+	0x0003, 0x2102, 0x610e, 0x0010, 0x6112, 0x610e, 0x00ce, 0x001e,
+	0x0005, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, 0x0001,
+	0x0198, 0x00c6, 0x6146, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19e7,
+	0x6044, 0x9005, 0x0130, 0x9080, 0x0003, 0x2102, 0x6146, 0x00ce,
+	0x0005, 0x614a, 0x6146, 0x0cd8, 0x6146, 0x600f, 0x0000, 0x2c08,
+	0x2001, 0x0013, 0x080c, 0xa863, 0x0005, 0x6044, 0xd0dc, 0x0128,
+	0x9006, 0x7007, 0x0000, 0x700a, 0x7032, 0x0005, 0x00f6, 0x00e6,
+	0x00d6, 0x00c6, 0x00b6, 0x0096, 0x0076, 0x0066, 0x0056, 0x0036,
+	0x0026, 0x0016, 0x0006, 0x0126, 0x902e, 0x2071, 0x19e7, 0x7648,
+	0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0904, 0x92bf, 0x6010,
+	0x2058, 0xb8a0, 0x9206, 0x1904, 0x92ba, 0x87ff, 0x0120, 0x605c,
+	0x9106, 0x1904, 0x92ba, 0x704c, 0x9c06, 0x1178, 0x0036, 0x2019,
+	0x0001, 0x080c, 0xa0f4, 0x703f, 0x0000, 0x9006, 0x704e, 0x706a,
+	0x7052, 0x706e, 0x003e, 0x2029, 0x0001, 0x080c, 0x923d, 0x7048,
+	0x9c36, 0x1110, 0x660c, 0x764a, 0x7044, 0x9c36, 0x1140, 0x2c00,
+	0x9f36, 0x0118, 0x2f00, 0x7046, 0x0010, 0x7047, 0x0000, 0x660c,
+	0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f,
+	0x0000, 0x080c, 0xc814, 0x01c8, 0x6014, 0x2048, 0x6020, 0x9086,
+	0x0003, 0x1560, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016,
+	0x0036, 0x0076, 0x080c, 0xcb12, 0x080c, 0xe5f6, 0x080c, 0x6d70,
+	0x007e, 0x003e, 0x001e, 0x080c, 0xca03, 0x080c, 0xac04, 0x00ce,
+	0x0804, 0x925c, 0x2c78, 0x600c, 0x2060, 0x0804, 0x925c, 0x012e,
+	0x000e, 0x001e, 0x002e, 0x003e, 0x005e, 0x006e, 0x007e, 0x009e,
+	0x00be, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020, 0x9086,
+	0x0006, 0x1158, 0x0016, 0x0036, 0x0076, 0x080c, 0xe5f6, 0x080c,
+	0xe241, 0x007e, 0x003e, 0x001e, 0x08c0, 0x6020, 0x9086, 0x0009,
+	0x1168, 0xa87b, 0x0006, 0x0016, 0x0036, 0x0076, 0x080c, 0x6d70,
+	0x080c, 0xabc9, 0x007e, 0x003e, 0x001e, 0x0848, 0x6020, 0x9086,
+	0x000a, 0x0904, 0x92a4, 0x0804, 0x92a2, 0x0006, 0x0066, 0x0096,
+	0x00c6, 0x00d6, 0x00f6, 0x9036, 0x0126, 0x2091, 0x8000, 0x2079,
+	0x19e7, 0x7848, 0x9065, 0x0904, 0x9354, 0x600c, 0x0006, 0x600f,
+	0x0000, 0x784c, 0x9c06, 0x11a0, 0x0036, 0x2019, 0x0001, 0x080c,
+	0xa0f4, 0x783f, 0x0000, 0x901e, 0x7b4e, 0x7b6a, 0x7b52, 0x7b6e,
+	0x003e, 0x000e, 0x9005, 0x1118, 0x600c, 0x600f, 0x0000, 0x0006,
+	0x00e6, 0x2f70, 0x080c, 0x923d, 0x00ee, 0x080c, 0xc814, 0x0520,
+	0x6014, 0x2048, 0x6020, 0x9086, 0x0003, 0x1580, 0x3e08, 0x918e,
+	0x0002, 0x1188, 0x6010, 0x9005, 0x0170, 0x00b6, 0x2058, 0xb800,
+	0x00be, 0xd0bc, 0x0140, 0x6048, 0x9005, 0x1198, 0x2001, 0x1988,
+	0x2004, 0x604a, 0x0070, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000,
+	0x080c, 0x6d64, 0x080c, 0xca03, 0x6044, 0xc0fc, 0x6046, 0x080c,
+	0xac04, 0x000e, 0x0804, 0x9302, 0x7e4a, 0x7e46, 0x012e, 0x00fe,
+	0x00de, 0x00ce, 0x009e, 0x006e, 0x000e, 0x0005, 0x6020, 0x9086,
+	0x0006, 0x1118, 0x080c, 0xe241, 0x0c38, 0x6020, 0x9086, 0x0009,
+	0x1130, 0xab7a, 0x080c, 0x6d70, 0x080c, 0xabc9, 0x0c10, 0x6020,
+	0x9086, 0x000a, 0x0990, 0x0878, 0x0016, 0x0026, 0x0086, 0x9046,
+	0x00a9, 0x080c, 0x9465, 0x008e, 0x002e, 0x001e, 0x0005, 0x00f6,
+	0x0126, 0x2079, 0x19e7, 0x2091, 0x8000, 0x080c, 0x94ae, 0x080c,
+	0x9542, 0x080c, 0x67ab, 0x012e, 0x00fe, 0x0005, 0x00b6, 0x0096,
+	0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126,
+	0x2091, 0x8000, 0x2071, 0x19e7, 0x7620, 0x2660, 0x2678, 0x8cff,
+	0x0904, 0x942a, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x9425,
+	0x88ff, 0x0120, 0x605c, 0x9106, 0x1904, 0x9425, 0x7030, 0x9c06,
+	0x1570, 0x2069, 0x0100, 0x6820, 0xd0a4, 0x1508, 0x080c, 0x86c5,
+	0x080c, 0x9e0e, 0x68c3, 0x0000, 0x080c, 0xa314, 0x7033, 0x0000,
+	0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001,
+	0x0100, 0x080c, 0x2a0a, 0x9006, 0x080c, 0x2a0a, 0x2069, 0x0100,
+	0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0040, 0x7008,
+	0xc0ad, 0x700a, 0x6003, 0x0009, 0x630a, 0x0804, 0x9425, 0x7020,
+	0x9c36, 0x1110, 0x660c, 0x7622, 0x701c, 0x9c36, 0x1140, 0x2c00,
+	0x9f36, 0x0118, 0x2f00, 0x701e, 0x0010, 0x701f, 0x0000, 0x660c,
+	0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f,
+	0x0000, 0x6044, 0xc0fc, 0x6046, 0x6014, 0x2048, 0x080c, 0xc814,
+	0x01e8, 0x6020, 0x9086, 0x0003, 0x1580, 0x080c, 0xca29, 0x1118,
+	0x080c, 0xb591, 0x0098, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000,
+	0x0016, 0x0036, 0x0086, 0x080c, 0xcb12, 0x080c, 0xe5f6, 0x080c,
+	0x6d70, 0x008e, 0x003e, 0x001e, 0x080c, 0xca03, 0x080c, 0xac04,
+	0x080c, 0xa1ea, 0x00ce, 0x0804, 0x939f, 0x2c78, 0x600c, 0x2060,
+	0x0804, 0x939f, 0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, 0x00de,
+	0x00ee, 0x00fe, 0x009e, 0x00be, 0x0005, 0x6020, 0x9086, 0x0006,
+	0x1158, 0x0016, 0x0036, 0x0086, 0x080c, 0xe5f6, 0x080c, 0xe241,
+	0x008e, 0x003e, 0x001e, 0x08d0, 0x080c, 0xb591, 0x6020, 0x9086,
+	0x0002, 0x1160, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0904,
+	0x940b, 0x9086, 0x008b, 0x0904, 0x940b, 0x0840, 0x6020, 0x9086,
+	0x0005, 0x1920, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x09c8,
+	0x9086, 0x008b, 0x09b0, 0x0804, 0x941e, 0x0006, 0x00f6, 0x00e6,
+	0x0096, 0x00b6, 0x00c6, 0x0066, 0x0016, 0x0126, 0x2091, 0x8000,
+	0x9280, 0x1000, 0x2004, 0x905d, 0x2079, 0x19e7, 0x9036, 0x7828,
+	0x2060, 0x8cff, 0x0538, 0x6010, 0x9b06, 0x1500, 0x6043, 0xffff,
+	0x080c, 0xaa51, 0x01d8, 0x610c, 0x0016, 0x080c, 0x9f7e, 0x6014,
+	0x2048, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036,
+	0x0086, 0x080c, 0xcb12, 0x080c, 0xe5f6, 0x080c, 0x6d70, 0x008e,
+	0x003e, 0x001e, 0x080c, 0xac04, 0x00ce, 0x08d8, 0x2c30, 0x600c,
+	0x2060, 0x08b8, 0x080c, 0x67c8, 0x012e, 0x001e, 0x006e, 0x00ce,
+	0x00be, 0x009e, 0x00ee, 0x00fe, 0x000e, 0x0005, 0x0096, 0x0006,
+	0x0066, 0x00c6, 0x00d6, 0x9036, 0x7820, 0x9065, 0x0904, 0x9515,
+	0x600c, 0x0006, 0x6044, 0xc0fc, 0x6046, 0x600f, 0x0000, 0x7830,
+	0x9c06, 0x1588, 0x2069, 0x0100, 0x6820, 0xd0a4, 0x1508, 0x080c,
+	0x86c5, 0x080c, 0x9e0e, 0x68c3, 0x0000, 0x080c, 0xa314, 0x7833,
+	0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138,
+	0x2001, 0x0100, 0x080c, 0x2a0a, 0x9006, 0x080c, 0x2a0a, 0x2069,
+	0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0058,
+	0x080c, 0x69f3, 0x1538, 0x6003, 0x0009, 0x630a, 0x7808, 0xc0ad,
+	0x780a, 0x2c30, 0x00f8, 0x6014, 0x2048, 0x080c, 0xc812, 0x01b0,
+	0x6020, 0x9086, 0x0003, 0x1508, 0x080c, 0xca29, 0x1118, 0x080c,
+	0xb591, 0x0060, 0x080c, 0x69f3, 0x1168, 0xa867, 0x0103, 0xab7a,
+	0xa877, 0x0000, 0x080c, 0x6d70, 0x080c, 0xca03, 0x080c, 0xac04,
+	0x080c, 0xa1ea, 0x000e, 0x0804, 0x94b5, 0x7e22, 0x7e1e, 0x00de,
+	0x00ce, 0x006e, 0x000e, 0x009e, 0x0005, 0x6020, 0x9086, 0x0006,
+	0x1118, 0x080c, 0xe241, 0x0c50, 0x080c, 0xb591, 0x6020, 0x9086,
+	0x0002, 0x1150, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0990,
+	0x9086, 0x008b, 0x0978, 0x08d0, 0x6020, 0x9086, 0x0005, 0x19b0,
+	0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0d18, 0x9086, 0x008b,
+	0x0d00, 0x0860, 0x0006, 0x0096, 0x00b6, 0x00c6, 0x0066, 0x9036,
+	0x7828, 0x9065, 0x0510, 0x6010, 0x2058, 0x600c, 0x0006, 0x3e08,
+	0x918e, 0x0002, 0x1118, 0xb800, 0xd0bc, 0x11a8, 0x6043, 0xffff,
+	0x080c, 0xaa51, 0x0180, 0x610c, 0x080c, 0x9f7e, 0x6014, 0x2048,
+	0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6d70, 0x080c,
+	0xac04, 0x000e, 0x08f0, 0x2c30, 0x0ce0, 0x006e, 0x00ce, 0x00be,
+	0x009e, 0x000e, 0x0005, 0x00e6, 0x00d6, 0x0096, 0x0066, 0x080c,
+	0x6134, 0x11b0, 0x2071, 0x19e7, 0x7030, 0x9080, 0x0005, 0x2004,
+	0x904d, 0x0170, 0xa878, 0x9606, 0x1158, 0x2071, 0x19e7, 0x7030,
+	0x9035, 0x0130, 0x9080, 0x0005, 0x2004, 0x9906, 0x1108, 0x0029,
+	0x006e, 0x009e, 0x00de, 0x00ee, 0x0005, 0x00c6, 0x2660, 0x6043,
+	0xffff, 0x080c, 0xaa51, 0x0178, 0x080c, 0x9f7e, 0x6014, 0x2048,
+	0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xcb12, 0x080c,
+	0x6d70, 0x080c, 0xac04, 0x00ce, 0x0005, 0x00b6, 0x00e6, 0x00c6,
+	0x080c, 0xa8d0, 0x0106, 0x190c, 0xa872, 0x2071, 0x0101, 0x2e04,
+	0xc0c4, 0x2072, 0x6044, 0xd0fc, 0x1138, 0x010e, 0x190c, 0xa88e,
+	0x00ce, 0x00ee, 0x00be, 0x0005, 0x2071, 0x19e7, 0x7030, 0x9005,
+	0x0da0, 0x9c06, 0x190c, 0x0d7d, 0x7036, 0x080c, 0x86c5, 0x7004,
+	0x9084, 0x0007, 0x0002, 0x95dd, 0x95df, 0x95e6, 0x95f0, 0x95fe,
+	0x95dd, 0x95e6, 0x95db, 0x080c, 0x0d7d, 0x0428, 0x0005, 0x080c,
+	0xaa3c, 0x7007, 0x0000, 0x7033, 0x0000, 0x00e8, 0x0066, 0x9036,
+	0x080c, 0x9f7e, 0x006e, 0x7007, 0x0000, 0x7033, 0x0000, 0x0098,
+	0x080c, 0xaa27, 0x0140, 0x080c, 0xaa3c, 0x0128, 0x0066, 0x9036,
+	0x080c, 0x9f7e, 0x006e, 0x7033, 0x0000, 0x0028, 0x080c, 0xaa27,
+	0x080c, 0xa314, 0x0000, 0x010e, 0x190c, 0xa88e, 0x00ce, 0x00ee,
+	0x00be, 0x0005, 0x00d6, 0x00c6, 0x080c, 0xa8d0, 0x0106, 0x190c,
+	0xa872, 0x6044, 0xd0fc, 0x1130, 0x010e, 0x190c, 0xa88e, 0x00ce,
+	0x00de, 0x0005, 0x2069, 0x19e7, 0x684c, 0x9005, 0x0da8, 0x9c06,
+	0x190c, 0x0d7d, 0x6852, 0x00e6, 0x2d70, 0x080c, 0x923d, 0x00ee,
+	0x080c, 0x86d2, 0x0016, 0x2009, 0x0040, 0x080c, 0x21b0, 0x001e,
+	0x683c, 0x9084, 0x0003, 0x0002, 0x963a, 0x963b, 0x9659, 0x9638,
+	0x080c, 0x0d7d, 0x0460, 0x6868, 0x9086, 0x0001, 0x0190, 0x600c,
+	0x9015, 0x0160, 0x6a4a, 0x600f, 0x0000, 0x6044, 0xc0fc, 0x6046,
+	0x9006, 0x7042, 0x684e, 0x683f, 0x0000, 0x00c8, 0x684a, 0x6846,
+	0x0ca0, 0x686b, 0x0000, 0x6848, 0x9065, 0x0d78, 0x6003, 0x0002,
+	0x0c60, 0x9006, 0x686a, 0x6852, 0x686e, 0x600c, 0x9015, 0x0120,
+	0x6a4a, 0x600f, 0x0000, 0x0018, 0x684e, 0x684a, 0x6846, 0x684f,
+	0x0000, 0x010e, 0x190c, 0xa88e, 0x00ce, 0x00de, 0x0005, 0x0005,
+	0x6020, 0x9084, 0x000f, 0x000b, 0x0005, 0x9685, 0x9688, 0x9af6,
+	0x9b85, 0x9688, 0x9af6, 0x9b85, 0x9685, 0x9688, 0x9685, 0x9685,
+	0x9685, 0x9685, 0x9685, 0x9685, 0x9685, 0x080c, 0x95ad, 0x0005,
+	0x00b6, 0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6,
+	0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004, 0x908a,
+	0x0053, 0x1a0c, 0x0d7d, 0x6110, 0x2158, 0xb984, 0x2c78, 0x2061,
+	0x0100, 0x619a, 0x908a, 0x0040, 0x1a04, 0x96f4, 0x005b, 0x00fe,
+	0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e,
+	0x00be, 0x0005, 0x9879, 0x98b4, 0x98dd, 0x9985, 0x99a7, 0x99ad,
+	0x99ba, 0x99c2, 0x99ce, 0x99d4, 0x99e5, 0x99d4, 0x9a3d, 0x99c2,
+	0x9a49, 0x9a4f, 0x99ce, 0x9a4f, 0x9a5b, 0x96f2, 0x96f2, 0x96f2,
+	0x96f2, 0x96f2, 0x96f2, 0x96f2, 0x96f2, 0x96f2, 0x96f2, 0x96f2,
+	0x9f9f, 0x9fc2, 0x9fd3, 0x9ff3, 0xa025, 0x99ba, 0x96f2, 0x99ba,
+	0x99d4, 0x96f2, 0x98dd, 0x9985, 0x96f2, 0xa407, 0x99d4, 0x96f2,
+	0xa423, 0x99d4, 0x96f2, 0x99ce, 0x9873, 0x9715, 0x96f2, 0xa43f,
+	0xa4ac, 0xa58c, 0x96f2, 0xa599, 0x99b7, 0xa5c4, 0x96f2, 0xa02f,
+	0xa5d0, 0x96f2, 0x080c, 0x0d7d, 0x2100, 0x005b, 0x00fe, 0x00ee,
+	0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be,
+	0x0005, 0xa670, 0xa722, 0x9713, 0x973c, 0x97e8, 0x97f3, 0x9713,
+	0x99ba, 0x9713, 0x983a, 0x9846, 0x9757, 0x9713, 0x9772, 0x97a6,
+	0xaaa7, 0xaaec, 0x99d4, 0x080c, 0x0d7d, 0x00d6, 0x0096, 0x080c,
+	0x9a6e, 0x7003, 0x2414, 0x7007, 0x0018, 0x700b, 0x0800, 0x7814,
+	0x2048, 0xa83c, 0x700e, 0xa850, 0x7022, 0xa854, 0x7026, 0x60c3,
+	0x0018, 0x080c, 0x9dde, 0x009e, 0x00de, 0x0005, 0x7810, 0x00b6,
+	0x2058, 0xb8a0, 0x00be, 0x080c, 0xab33, 0x1118, 0x9084, 0xff80,
+	0x0110, 0x9085, 0x0001, 0x0005, 0x00d6, 0x0096, 0x080c, 0x9a6e,
+	0x7003, 0x0500, 0x7814, 0x2048, 0xa874, 0x700a, 0xa878, 0x700e,
+	0xa87c, 0x7012, 0xa880, 0x7016, 0xa884, 0x701a, 0xa888, 0x701e,
+	0x60c3, 0x0010, 0x080c, 0x9dde, 0x009e, 0x00de, 0x0005, 0x00d6,
+	0x0096, 0x080c, 0x9a6e, 0x7003, 0x0500, 0x7814, 0x2048, 0xa8cc,
+	0x700a, 0xa8d0, 0x700e, 0xa8d4, 0x7012, 0xa8d8, 0x7016, 0xa8dc,
+	0x701a, 0xa8e0, 0x701e, 0x60c3, 0x0010, 0x080c, 0x9dde, 0x009e,
+	0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, 0x080c,
+	0x9a6e, 0x20e9, 0x0000, 0x2001, 0x19a3, 0x2003, 0x0000, 0x7814,
+	0x2048, 0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0,
+	0xa85c, 0x9080, 0x001b, 0x2098, 0x2001, 0x19a3, 0x0016, 0x200c,
+	0x2001, 0x0001, 0x080c, 0x2195, 0x080c, 0xd58c, 0x9006, 0x080c,
+	0x2195, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c28, 0x04d9,
+	0x080c, 0x9dde, 0x012e, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096,
+	0x0126, 0x2091, 0x8000, 0x080c, 0x9ab9, 0x20e9, 0x0000, 0x2001,
+	0x19a3, 0x2003, 0x0000, 0x7814, 0x2048, 0xa86f, 0x0200, 0xa873,
+	0x0000, 0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0,
+	0xa85c, 0x9080, 0x001b, 0x2098, 0x2001, 0x19a3, 0x0016, 0x200c,
+	0x080c, 0xd58c, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c60,
+	0x0051, 0x7814, 0x2048, 0x080c, 0x0fec, 0x080c, 0x9dde, 0x012e,
+	0x009e, 0x00de, 0x0005, 0x60c0, 0x8004, 0x9084, 0x0003, 0x9005,
+	0x0130, 0x9082, 0x0004, 0x20a3, 0x0000, 0x8000, 0x1de0, 0x0005,
+	0x080c, 0x9a6e, 0x7003, 0x7800, 0x7808, 0x8007, 0x700a, 0x60c3,
+	0x0008, 0x0804, 0x9dde, 0x00d6, 0x00e6, 0x080c, 0x9ab9, 0x7814,
+	0x9084, 0xff00, 0x2073, 0x0200, 0x8e70, 0x8e70, 0x9095, 0x0010,
+	0x2272, 0x8e70, 0x2073, 0x0034, 0x8e70, 0x2069, 0x1805, 0x20a9,
+	0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x9809, 0x2069, 0x1801,
+	0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x9812, 0x2069,
+	0x19b3, 0x9086, 0xdf00, 0x0110, 0x2069, 0x19cd, 0x20a9, 0x001a,
+	0x9e86, 0x0260, 0x1148, 0x00c6, 0x2061, 0x0200, 0x6010, 0x8000,
+	0x6012, 0x00ce, 0x2071, 0x0240, 0x2d04, 0x8007, 0x2072, 0x8d68,
+	0x8e70, 0x1f04, 0x9820, 0x60c3, 0x004c, 0x080c, 0x9dde, 0x00ee,
+	0x00de, 0x0005, 0x080c, 0x9a6e, 0x7003, 0x6300, 0x7007, 0x0028,
+	0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9dde, 0x00d6, 0x0026,
+	0x0016, 0x080c, 0x9ab9, 0x7003, 0x0200, 0x7814, 0x700e, 0x00e6,
+	0x9ef0, 0x0004, 0x2009, 0x0001, 0x2011, 0x000c, 0x2069, 0x1923,
+	0x6810, 0xd084, 0x1148, 0x2073, 0x0500, 0x8e70, 0x2073, 0x0000,
+	0x8e70, 0x8108, 0x9290, 0x0004, 0x2073, 0x0800, 0x8e70, 0x2073,
+	0x0000, 0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c, 0x9dde, 0x001e,
+	0x002e, 0x00de, 0x0005, 0x2001, 0x1818, 0x2004, 0x609a, 0x0804,
+	0x9dde, 0x080c, 0x9a6e, 0x7003, 0x5200, 0x2069, 0x1847, 0x6804,
+	0xd084, 0x0130, 0x6828, 0x0016, 0x080c, 0x262e, 0x710e, 0x001e,
+	0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000,
+	0x20a1, 0x0250, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1,
+	0x0254, 0x4003, 0x080c, 0xab33, 0x1120, 0xb8a0, 0x9082, 0x007f,
+	0x0248, 0x2001, 0x181f, 0x2004, 0x7032, 0x2001, 0x1820, 0x2004,
+	0x7036, 0x0030, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, 0x7036,
+	0x60c3, 0x001c, 0x0804, 0x9dde, 0x080c, 0x9a6e, 0x7003, 0x0500,
+	0x080c, 0xab33, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001,
+	0x181f, 0x2004, 0x700a, 0x2001, 0x1820, 0x2004, 0x700e, 0x0030,
+	0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, 0x700e, 0x20a9, 0x0004,
+	0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0250,
+	0x4003, 0x60c3, 0x0010, 0x0804, 0x9dde, 0x080c, 0x9a6e, 0x9006,
+	0x080c, 0x6a25, 0xb8a0, 0x9086, 0x007e, 0x1130, 0x7003, 0x0400,
+	0x620c, 0xc2b4, 0x620e, 0x0058, 0x7814, 0x0096, 0x904d, 0x0120,
+	0x9006, 0xa89a, 0xa8a6, 0xa8aa, 0x009e, 0x7003, 0x0300, 0xb8a0,
+	0x9086, 0x007e, 0x1904, 0x994c, 0x00d6, 0x2069, 0x196c, 0x2001,
+	0x1837, 0x2004, 0xd0a4, 0x0188, 0x6800, 0x700a, 0x6808, 0x9084,
+	0x2000, 0x7012, 0x080c, 0xab4a, 0x680c, 0x7016, 0x701f, 0x2710,
+	0x6818, 0x7022, 0x681c, 0x7026, 0x0090, 0x6800, 0x700a, 0x6804,
+	0x700e, 0x6808, 0x080c, 0x74d5, 0x1118, 0x9084, 0x37ff, 0x0010,
+	0x9084, 0x3fff, 0x7012, 0x080c, 0xab4a, 0x680c, 0x7016, 0x00de,
+	0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000,
+	0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1,
+	0x025a, 0x4003, 0x00d6, 0x080c, 0xa657, 0x2069, 0x1974, 0x2071,
+	0x024e, 0x6800, 0xc0dd, 0x7002, 0x080c, 0x56d7, 0xd0e4, 0x0110,
+	0x680c, 0x700e, 0x00de, 0x04a8, 0x2001, 0x1837, 0x2004, 0xd0a4,
+	0x0170, 0x0016, 0x2001, 0x196d, 0x200c, 0x60e0, 0x9106, 0x0130,
+	0x2100, 0x60e3, 0x0000, 0x080c, 0x266f, 0x61e2, 0x001e, 0x20e1,
+	0x0001, 0x2099, 0x196c, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x20a9,
+	0x0008, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1805, 0x20a1, 0x0256,
+	0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, 0x025a, 0x4003,
+	0x080c, 0xa657, 0x20a1, 0x024e, 0x20a9, 0x0008, 0x2099, 0x1974,
+	0x4003, 0x60c3, 0x0074, 0x0804, 0x9dde, 0x080c, 0x9a6e, 0x7003,
+	0x2010, 0x7007, 0x0014, 0x700b, 0x0800, 0x700f, 0x2000, 0x9006,
+	0x00f6, 0x2079, 0x1847, 0x7904, 0x00fe, 0xd1ac, 0x1110, 0x9085,
+	0x0020, 0xd1a4, 0x0110, 0x9085, 0x0010, 0x9085, 0x0002, 0x00d6,
+	0x0804, 0x9a1e, 0x7026, 0x60c3, 0x0014, 0x0804, 0x9dde, 0x080c,
+	0x9a6e, 0x7003, 0x5000, 0x0804, 0x98f7, 0x080c, 0x9a6e, 0x7003,
+	0x2110, 0x7007, 0x0014, 0x60c3, 0x0014, 0x0804, 0x9dde, 0x080c,
+	0x9ab0, 0x0010, 0x080c, 0x9ab9, 0x7003, 0x0200, 0x60c3, 0x0004,
+	0x0804, 0x9dde, 0x080c, 0x9ab9, 0x7003, 0x0100, 0x700b, 0x0003,
+	0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0x9dde, 0x080c, 0x9ab9,
+	0x7003, 0x0200, 0x0804, 0x98f7, 0x080c, 0x9ab9, 0x7003, 0x0100,
+	0x782c, 0x9005, 0x0110, 0x700a, 0x0010, 0x700b, 0x0003, 0x7814,
+	0x700e, 0x60c3, 0x0008, 0x0804, 0x9dde, 0x00d6, 0x080c, 0x9ab9,
+	0x7003, 0x0210, 0x7007, 0x0014, 0x700b, 0x0800, 0xb894, 0x9086,
+	0x0014, 0x1198, 0xb99c, 0x9184, 0x0030, 0x0190, 0xb998, 0x9184,
+	0xc000, 0x1140, 0xd1ec, 0x0118, 0x700f, 0x2100, 0x0058, 0x700f,
+	0x0100, 0x0040, 0x700f, 0x0400, 0x0028, 0x700f, 0x0700, 0x0010,
+	0x700f, 0x0800, 0x00f6, 0x2079, 0x1847, 0x7904, 0x00fe, 0xd1ac,
+	0x1110, 0x9085, 0x0020, 0xd1a4, 0x0110, 0x9085, 0x0010, 0x2009,
+	0x1869, 0x210c, 0xd184, 0x1110, 0x9085, 0x0002, 0x0026, 0x2009,
+	0x1867, 0x210c, 0xd1e4, 0x0150, 0xc0c5, 0xbad4, 0xd28c, 0x1108,
+	0xc0cd, 0x9094, 0x0030, 0x9296, 0x0010, 0x0140, 0xd1ec, 0x0130,
+	0x9094, 0x0030, 0x9296, 0x0010, 0x0108, 0xc0bd, 0x002e, 0x7026,
+	0x60c3, 0x0014, 0x00de, 0x0804, 0x9dde, 0x080c, 0x9ab9, 0x7003,
+	0x0210, 0x7007, 0x0014, 0x700f, 0x0100, 0x60c3, 0x0014, 0x0804,
+	0x9dde, 0x080c, 0x9ab9, 0x7003, 0x0200, 0x0804, 0x987d, 0x080c,
+	0x9ab9, 0x7003, 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3,
+	0x0008, 0x0804, 0x9dde, 0x080c, 0x9ab9, 0x7003, 0x0100, 0x700b,
+	0x000b, 0x60c3, 0x0008, 0x0804, 0x9dde, 0x0026, 0x00d6, 0x0036,
+	0x0046, 0x2019, 0x3200, 0x2021, 0x0800, 0x0040, 0x0026, 0x00d6,
+	0x0036, 0x0046, 0x2019, 0x2200, 0x2021, 0x0100, 0x080c, 0xa66c,
+	0xb810, 0x9305, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x687c,
+	0x700a, 0x6880, 0x700e, 0x9485, 0x0029, 0x7012, 0x004e, 0x003e,
+	0x00de, 0x080c, 0x9dd2, 0x721a, 0x9f95, 0x0000, 0x7222, 0x7027,
+	0xffff, 0x2071, 0x024c, 0x002e, 0x0005, 0x0026, 0x080c, 0xa66c,
+	0x7003, 0x02ff, 0x7007, 0xfffc, 0x00d6, 0x2069, 0x1800, 0x687c,
+	0x700a, 0x6880, 0x700e, 0x00de, 0x7013, 0x2029, 0x0c10, 0x7003,
+	0x0100, 0x7007, 0x0000, 0x700b, 0xfc02, 0x700f, 0x0000, 0x0005,
+	0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x3300, 0x2021, 0x0800,
+	0x0040, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x2300, 0x2021,
+	0x0100, 0x080c, 0xa66c, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006,
+	0x2069, 0x1800, 0xb810, 0x9005, 0x1140, 0xb814, 0x9005, 0x1128,
+	0x700b, 0x00ff, 0x700f, 0xfffe, 0x0020, 0x687c, 0x700a, 0x6880,
+	0x700e, 0x0000, 0x9485, 0x0098, 0x7012, 0x004e, 0x003e, 0x00de,
+	0x080c, 0x9dd2, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071,
+	0x024c, 0x002e, 0x0005, 0x080c, 0x9dd2, 0x721a, 0x7a08, 0x7222,
+	0x7814, 0x7026, 0x2071, 0x024c, 0x002e, 0x0005, 0x00b6, 0x00c6,
+	0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004,
+	0x908a, 0x0085, 0x0a0c, 0x0d7d, 0x908a, 0x0092, 0x1a0c, 0x0d7d,
+	0x6110, 0x2158, 0xb984, 0x2c78, 0x2061, 0x0100, 0x619a, 0x9082,
+	0x0085, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x0005,
+	0x9b27, 0x9b36, 0x9b41, 0x9b25, 0x9b25, 0x9b25, 0x9b27, 0x9b25,
+	0x9b25, 0x9b25, 0x9b25, 0x9b25, 0x9b25, 0x080c, 0x0d7d, 0x0411,
+	0x60c3, 0x0000, 0x0026, 0x080c, 0x2979, 0x0228, 0x2011, 0x0101,
+	0x2204, 0xc0c5, 0x2012, 0x002e, 0x0804, 0x9dde, 0x0431, 0x7808,
+	0x700a, 0x7814, 0x700e, 0x7017, 0xffff, 0x60c3, 0x000c, 0x0804,
+	0x9dde, 0x0479, 0x7003, 0x0003, 0x7007, 0x0300, 0x60c3, 0x0004,
+	0x0804, 0x9dde, 0x0026, 0x080c, 0xa66c, 0xb810, 0x9085, 0x8100,
+	0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, 0x6880,
+	0x700e, 0x7013, 0x0009, 0x0804, 0x9a89, 0x0026, 0x080c, 0xa66c,
+	0xb810, 0x9085, 0x8400, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800,
+	0x687c, 0x700a, 0x6880, 0x700e, 0x2001, 0x0099, 0x7012, 0x0804,
+	0x9aeb, 0x0026, 0x080c, 0xa66c, 0xb810, 0x9085, 0x8500, 0x7002,
+	0xb814, 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e,
+	0x2001, 0x0099, 0x7012, 0x0804, 0x9aeb, 0x00b6, 0x00c6, 0x00d6,
+	0x00e6, 0x00f6, 0x2c78, 0x2069, 0x0200, 0x2071, 0x0240, 0x7804,
+	0x908a, 0x0040, 0x0a0c, 0x0d7d, 0x908a, 0x0057, 0x1a0c, 0x0d7d,
+	0x7910, 0x2158, 0xb984, 0x2061, 0x0100, 0x619a, 0x9082, 0x0040,
+	0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x0005, 0x9bba,
+	0x9bba, 0x9bba, 0x9bde, 0x9bba, 0x9bba, 0x9bba, 0x9bba, 0x9bba,
+	0x9bba, 0x9bba, 0xa1c7, 0xa1cf, 0xa1d7, 0xa1df, 0x9bba, 0x9bba,
+	0x9bba, 0xa1bf, 0x080c, 0x0d7d, 0x6813, 0x0008, 0xba8c, 0x8210,
+	0xb8d4, 0xd084, 0x0128, 0x7a4e, 0x7b14, 0x7b52, 0x722e, 0x732a,
+	0x9294, 0x00ff, 0xba8e, 0x8217, 0x721a, 0xba10, 0x9295, 0x0600,
+	0x7202, 0xba14, 0x7206, 0x6a7c, 0x720a, 0x6a80, 0x720e, 0x7013,
+	0x0829, 0x2f10, 0x7222, 0x7027, 0xffff, 0x0005, 0x0016, 0x7814,
+	0x9084, 0x0700, 0x8007, 0x0013, 0x001e, 0x0005, 0x9bee, 0x9bee,
+	0x9bf0, 0x9bee, 0x9bee, 0x9bee, 0x9c0a, 0x9bee, 0x080c, 0x0d7d,
+	0x7914, 0x918c, 0x08ff, 0x918d, 0xf600, 0x7916, 0x2009, 0x0003,
+	0x00b9, 0x2069, 0x1847, 0x6804, 0xd0bc, 0x0130, 0x682c, 0x9084,
+	0x00ff, 0x8007, 0x7032, 0x0010, 0x7033, 0x3f00, 0x60c3, 0x0001,
+	0x0804, 0x9dde, 0x2009, 0x0003, 0x0019, 0x7033, 0x7f00, 0x0cb0,
+	0x0016, 0x080c, 0xa66c, 0x001e, 0xb810, 0x9085, 0x0100, 0x7002,
+	0xb814, 0x7006, 0x2069, 0x1800, 0x6a7c, 0x720a, 0x6a80, 0x720e,
+	0x7013, 0x0888, 0x918d, 0x0008, 0x7116, 0x080c, 0x9dd2, 0x721a,
+	0x7a08, 0x7222, 0x2f10, 0x7226, 0x0005, 0x00b6, 0x00e6, 0x00d6,
+	0x00c6, 0x0066, 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071,
+	0x1800, 0x7160, 0x7810, 0x2058, 0x76dc, 0x96b4, 0x0028, 0x0110,
+	0x737c, 0x7480, 0x2500, 0x76dc, 0x96b4, 0x0028, 0x0140, 0x2001,
+	0x04ff, 0x6062, 0x6067, 0xffff, 0x636a, 0x646e, 0x0050, 0x2001,
+	0x00ff, 0x9085, 0x0400, 0x6062, 0x6067, 0xffff, 0x606b, 0x0000,
+	0x616e, 0xb8b8, 0x6073, 0x0530, 0x6077, 0x0008, 0xb88c, 0x8000,
+	0x9084, 0x00ff, 0xb88e, 0x8007, 0x9085, 0x0020, 0x607a, 0x607f,
+	0x0000, 0x2b00, 0x6082, 0x6087, 0xffff, 0x7814, 0x0096, 0x2048,
+	0xa848, 0x608a, 0xa844, 0x608e, 0xa838, 0x60c6, 0xa834, 0x60ca,
+	0x009e, 0xb86c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7,
+	0x0000, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028, 0x0128, 0x609f,
+	0x0000, 0x2001, 0x0092, 0x0058, 0x6028, 0xc0bd, 0x602a, 0x609f,
+	0x00ff, 0x2011, 0xffff, 0x080c, 0x2a44, 0x2001, 0x00b2, 0x2010,
+	0x900e, 0x080c, 0x2a53, 0x2009, 0x07d0, 0x080c, 0x86ca, 0x003e,
+	0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00be, 0x0005,
 	0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, 0x0036,
-	0x2061, 0x0100, 0x2071, 0x1800, 0x7160, 0x7810, 0x2058, 0x76dc,
-	0x96b4, 0x0028, 0x0110, 0x737c, 0x7480, 0x2500, 0x76dc, 0x96b4,
-	0x0028, 0x0140, 0x2001, 0x04ff, 0x6062, 0x6067, 0xffff, 0x636a,
-	0x646e, 0x0050, 0x2001, 0x00ff, 0x9085, 0x0400, 0x6062, 0x6067,
-	0xffff, 0x606b, 0x0000, 0x616e, 0xb8b8, 0x6073, 0x0530, 0x6077,
-	0x0008, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x9085,
-	0x0020, 0x607a, 0x607f, 0x0000, 0x2b00, 0x6082, 0x6087, 0xffff,
-	0x7814, 0x0096, 0x2048, 0xa848, 0x608a, 0xa844, 0x608e, 0xa838,
-	0x60c6, 0xa834, 0x60ca, 0x009e, 0xb86c, 0x60ce, 0x60ab, 0x0036,
-	0x60af, 0x95d5, 0x60d7, 0x0000, 0x2001, 0x1837, 0x2004, 0x9084,
-	0x0028, 0x0128, 0x609f, 0x0000, 0x2001, 0x0092, 0x0058, 0x6028,
-	0xc0bd, 0x602a, 0x609f, 0x00ff, 0x2011, 0xffff, 0x080c, 0x2a0b,
-	0x2001, 0x00b2, 0x2010, 0x900e, 0x080c, 0x2a1a, 0x2009, 0x07d0,
-	0x080c, 0x85c5, 0x003e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de,
-	0x00ee, 0x00be, 0x0005, 0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066,
-	0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0x1800, 0x7160,
-	0x7810, 0x2058, 0xb8a0, 0x2028, 0x76dc, 0xd6ac, 0x1168, 0x9582,
-	0x007e, 0x1250, 0x2500, 0x9094, 0xff80, 0x1130, 0x9080, 0x3334,
-	0x2015, 0x9294, 0x00ff, 0x0020, 0xb910, 0xba14, 0x737c, 0x7480,
-	0x70dc, 0xd0ac, 0x1130, 0x9582, 0x007e, 0x1218, 0x9584, 0xff80,
-	0x0138, 0x9185, 0x0400, 0x6062, 0x6266, 0x636a, 0x646e, 0x0030,
-	0x6063, 0x0400, 0x6266, 0x606b, 0x0000, 0x616e, 0xb8b8, 0x6072,
-	0x6077, 0x0000, 0xb864, 0xd0a4, 0x0110, 0x6077, 0x0008, 0xb88c,
-	0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x9085, 0x0020, 0x607a,
-	0x607f, 0x0000, 0x2b00, 0x6082, 0x6087, 0xffff, 0x7814, 0x0096,
-	0x2048, 0xa848, 0x608a, 0xa844, 0x608e, 0xa838, 0x60c6, 0xa834,
-	0x60ca, 0x009e, 0xb86c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5,
-	0x60d7, 0x0000, 0xba84, 0x629e, 0x00f6, 0x2079, 0x0140, 0x7803,
-	0x0000, 0x00fe, 0x900e, 0x2011, 0x0092, 0x080c, 0x2a1a, 0x2009,
-	0x07d0, 0x080c, 0x85c5, 0x003e, 0x004e, 0x005e, 0x006e, 0x00ce,
-	0x00de, 0x00ee, 0x00be, 0x0005, 0x00b6, 0x0096, 0x00e6, 0x00d6,
-	0x00c6, 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0x1800,
-	0x7810, 0x2058, 0xb8a0, 0x2028, 0xb910, 0xba14, 0x737c, 0x7480,
-	0x7820, 0x0002, 0x9c49, 0x9c49, 0x9c49, 0x9c49, 0x9c49, 0x9c49,
-	0x9c49, 0x9c49, 0x9c49, 0x9c49, 0x9c4b, 0x9c49, 0x9c49, 0x9c49,
-	0x9c49, 0x080c, 0x0d7d, 0x609f, 0x0000, 0x7814, 0x2048, 0xa87c,
-	0xd0fc, 0x05d0, 0xaf90, 0x9784, 0xff00, 0x9105, 0x6062, 0x873f,
-	0x9784, 0xff00, 0x0006, 0x7814, 0x2048, 0xa878, 0xc0fc, 0x9005,
-	0x000e, 0x1160, 0xaf94, 0x87ff, 0x0510, 0x2039, 0x0098, 0x9705,
-	0x6072, 0x7808, 0x6082, 0x2f00, 0x6086, 0x0038, 0x9185, 0x2200,
-	0x6062, 0x6073, 0x0129, 0x6077, 0x0000, 0x609f, 0x0000, 0x2001,
-	0x1837, 0x2004, 0xd0ac, 0x11a8, 0xd09c, 0x0130, 0x7814, 0x2048,
-	0xa874, 0x9082, 0x0080, 0x1268, 0xb814, 0x609e, 0x0050, 0x2039,
-	0x0029, 0x9705, 0x6072, 0x0c48, 0x9185, 0x0200, 0x6062, 0x6073,
-	0x2029, 0xa87c, 0xd0fc, 0x0118, 0xaf94, 0x87ff, 0x1120, 0x2f00,
-	0x6082, 0x7808, 0x6086, 0x6266, 0x636a, 0x646e, 0x6077, 0x0000,
-	0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a, 0x607f,
-	0x0000, 0xa848, 0x608a, 0xa844, 0x608e, 0xa838, 0x60c6, 0xa834,
-	0x60ca, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0x080c,
-	0xa55b, 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110,
-	0x2009, 0x1b58, 0x080c, 0x85c5, 0x003e, 0x004e, 0x005e, 0x00ce,
-	0x00de, 0x00ee, 0x009e, 0x00be, 0x0005, 0x7a40, 0x9294, 0x00ff,
-	0x8217, 0x0005, 0x00d6, 0x2069, 0x19e5, 0x686b, 0x0001, 0x00de,
-	0x0005, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x00f1, 0x080c, 0x85b7,
-	0x0005, 0x0016, 0x2001, 0x180c, 0x200c, 0x9184, 0x0600, 0x9086,
-	0x0600, 0x0128, 0x0089, 0x080c, 0x85b7, 0x001e, 0x0005, 0xc1e5,
-	0x2001, 0x180c, 0x2102, 0x2001, 0x19e6, 0x2003, 0x0000, 0x2001,
-	0x19f1, 0x2003, 0x0000, 0x0c88, 0x0006, 0x0016, 0x0026, 0x2009,
-	0x1804, 0x2011, 0x0009, 0x080c, 0x2a1a, 0x002e, 0x001e, 0x000e,
-	0x0005, 0x0016, 0x00c6, 0x0006, 0x080c, 0xa7df, 0x0106, 0x190c,
-	0xa781, 0x2061, 0x0100, 0x61a4, 0x60a7, 0x95f5, 0x0016, 0x0026,
-	0x2009, 0x1804, 0x2011, 0x0008, 0x080c, 0x2a1a, 0x002e, 0x001e,
-	0x010e, 0x190c, 0xa79d, 0x000e, 0xa001, 0xa001, 0xa001, 0x61a6,
-	0x00ce, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0016, 0x0026, 0x2061,
-	0x0100, 0x2069, 0x0140, 0x080c, 0x73e4, 0x1510, 0x2001, 0x1a0a,
-	0x2004, 0x9005, 0x1904, 0x9d8a, 0x080c, 0x7485, 0x11a8, 0x2069,
-	0x0380, 0x6843, 0x0101, 0x6844, 0xd084, 0x1de8, 0x2061, 0x0100,
-	0x6020, 0xd0b4, 0x1120, 0x6024, 0xd084, 0x090c, 0x0d7d, 0x6843,
-	0x0100, 0x080c, 0x85b7, 0x04b0, 0x00c6, 0x2061, 0x19e5, 0x00f0,
-	0x6904, 0x9194, 0x4000, 0x0598, 0x080c, 0x9d09, 0x080c, 0x29e1,
-	0x00c6, 0x2061, 0x19e5, 0x6134, 0x9192, 0x0008, 0x1278, 0x8108,
-	0x6136, 0x080c, 0xa781, 0x6130, 0x080c, 0xa79d, 0x00ce, 0x81ff,
-	0x01c8, 0x080c, 0x85b7, 0x080c, 0x9cfc, 0x00a0, 0x080c, 0xa781,
-	0x6130, 0x91e5, 0x0000, 0x0150, 0x080c, 0xe5b0, 0x080c, 0x85c0,
-	0x6003, 0x0001, 0x2009, 0x0014, 0x080c, 0xab77, 0x080c, 0xa79d,
-	0x00ce, 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001,
-	0x1a0a, 0x2004, 0x9005, 0x1db0, 0x00c6, 0x2061, 0x19e5, 0x6134,
-	0x9192, 0x0003, 0x1ad8, 0x8108, 0x6136, 0x00ce, 0x080c, 0x85b7,
-	0x080c, 0x5dfc, 0x2009, 0x1846, 0x2114, 0x8210, 0x220a, 0x0c10,
-	0x0096, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026, 0x080c, 0x85cd,
-	0x080c, 0xa781, 0x2001, 0x0387, 0x2003, 0x0202, 0x2071, 0x19e5,
-	0x714c, 0x81ff, 0x0904, 0x9e32, 0x2061, 0x0100, 0x2069, 0x0140,
-	0x080c, 0x73e4, 0x1510, 0x0036, 0x2019, 0x0002, 0x080c, 0x9fef,
-	0x003e, 0x714c, 0x2160, 0x080c, 0xe5b0, 0x2009, 0x004a, 0x6220,
-	0x9296, 0x0009, 0x1130, 0x6114, 0x2148, 0xa87b, 0x0006, 0x2009,
-	0x004a, 0x6003, 0x0003, 0x080c, 0xab77, 0x2001, 0x0386, 0x2003,
-	0x5040, 0x080c, 0x7485, 0x0804, 0x9e32, 0x6904, 0xd1f4, 0x0904,
-	0x9e3f, 0x080c, 0x29e1, 0x00c6, 0x704c, 0x9065, 0x090c, 0x0d7d,
-	0x6020, 0x00ce, 0x9086, 0x0006, 0x1518, 0x61c8, 0x60c4, 0x9105,
-	0x11f8, 0x2009, 0x180c, 0x2104, 0xd0d4, 0x01d0, 0x6214, 0x9294,
-	0x1800, 0x1128, 0x6224, 0x9294, 0x0002, 0x1560, 0x0010, 0xc0d4,
-	0x200a, 0x6014, 0x9084, 0xe7fd, 0x9085, 0x0010, 0x6016, 0x704c,
-	0x2060, 0x080c, 0x9505, 0x2009, 0x0049, 0x080c, 0xab77, 0x00d0,
-	0x0036, 0x2019, 0x0001, 0x080c, 0x9fef, 0x003e, 0x714c, 0x2160,
-	0x080c, 0xe5b0, 0x2009, 0x004a, 0x6220, 0x9296, 0x0009, 0x1130,
+	0x2061, 0x0100, 0x2071, 0x1800, 0x7160, 0x7810, 0x2058, 0xb8a0,
+	0x2028, 0x76dc, 0xd6ac, 0x1168, 0x9582, 0x007e, 0x1250, 0x2500,
+	0x9094, 0xff80, 0x1130, 0x9080, 0x336d, 0x2015, 0x9294, 0x00ff,
+	0x0020, 0xb910, 0xba14, 0x737c, 0x7480, 0x70dc, 0xd0ac, 0x1130,
+	0x9582, 0x007e, 0x1218, 0x9584, 0xff80, 0x0138, 0x9185, 0x0400,
+	0x6062, 0x6266, 0x636a, 0x646e, 0x0030, 0x6063, 0x0400, 0x6266,
+	0x606b, 0x0000, 0x616e, 0xb8b8, 0x6072, 0x6077, 0x0000, 0xb864,
+	0xd0a4, 0x0110, 0x6077, 0x0008, 0xb88c, 0x8000, 0x9084, 0x00ff,
+	0xb88e, 0x8007, 0x9085, 0x0020, 0x607a, 0x607f, 0x0000, 0x2b00,
+	0x6082, 0x6087, 0xffff, 0x7814, 0x0096, 0x2048, 0xa848, 0x608a,
+	0xa844, 0x608e, 0xa838, 0x60c6, 0xa834, 0x60ca, 0x009e, 0xb86c,
+	0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xba84,
+	0x629e, 0x00f6, 0x2079, 0x0140, 0x7803, 0x0000, 0x00fe, 0x900e,
+	0x2011, 0x0092, 0x080c, 0x2a53, 0x2009, 0x07d0, 0x080c, 0x86ca,
+	0x003e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00be,
+	0x0005, 0x00b6, 0x0096, 0x00e6, 0x00d6, 0x00c6, 0x0056, 0x0046,
+	0x0036, 0x2061, 0x0100, 0x2071, 0x1800, 0x7810, 0x2058, 0xb8a0,
+	0x2028, 0xb910, 0xba14, 0x737c, 0x7480, 0x7820, 0x0002, 0x9d4e,
+	0x9d4e, 0x9d4e, 0x9d4e, 0x9d4e, 0x9d4e, 0x9d4e, 0x9d4e, 0x9d4e,
+	0x9d4e, 0x9d50, 0x9d4e, 0x9d4e, 0x9d4e, 0x9d4e, 0x080c, 0x0d7d,
+	0x609f, 0x0000, 0x7814, 0x2048, 0xa87c, 0xd0fc, 0x05d0, 0xaf90,
+	0x9784, 0xff00, 0x9105, 0x6062, 0x873f, 0x9784, 0xff00, 0x0006,
+	0x7814, 0x2048, 0xa878, 0xc0fc, 0x9005, 0x000e, 0x1160, 0xaf94,
+	0x87ff, 0x0510, 0x2039, 0x0098, 0x9705, 0x6072, 0x7808, 0x6082,
+	0x2f00, 0x6086, 0x0038, 0x9185, 0x2200, 0x6062, 0x6073, 0x0129,
+	0x6077, 0x0000, 0x609f, 0x0000, 0x2001, 0x1837, 0x2004, 0xd0ac,
+	0x11a8, 0xd09c, 0x0130, 0x7814, 0x2048, 0xa874, 0x9082, 0x0080,
+	0x1268, 0xb814, 0x609e, 0x0050, 0x2039, 0x0029, 0x9705, 0x6072,
+	0x0c48, 0x9185, 0x0200, 0x6062, 0x6073, 0x2029, 0xa87c, 0xd0fc,
+	0x0118, 0xaf94, 0x87ff, 0x1120, 0x2f00, 0x6082, 0x7808, 0x6086,
+	0x6266, 0x636a, 0x646e, 0x6077, 0x0000, 0xb88c, 0x8000, 0x9084,
+	0x00ff, 0xb88e, 0x8007, 0x607a, 0x607f, 0x0000, 0xa848, 0x608a,
+	0xa844, 0x608e, 0xa838, 0x60c6, 0xa834, 0x60ca, 0xb86c, 0x60ce,
+	0x60af, 0x95d5, 0x60d7, 0x0000, 0x080c, 0xa64c, 0x2009, 0x07d0,
+	0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110, 0x2009, 0x1b58, 0x080c,
+	0x86ca, 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x009e,
+	0x00be, 0x0005, 0x7a40, 0x9294, 0x00ff, 0x8217, 0x0005, 0x00d6,
+	0x2069, 0x19e7, 0x686b, 0x0001, 0x00de, 0x0005, 0x60a3, 0x0056,
+	0x60a7, 0x9575, 0x00f1, 0x080c, 0x86bc, 0x0005, 0x0016, 0x2001,
+	0x180c, 0x200c, 0x9184, 0x0600, 0x9086, 0x0600, 0x0128, 0x0089,
+	0x080c, 0x86bc, 0x001e, 0x0005, 0xc1e5, 0x2001, 0x180c, 0x2102,
+	0x2001, 0x19e8, 0x2003, 0x0000, 0x2001, 0x19f3, 0x2003, 0x0000,
+	0x0c88, 0x0006, 0x0016, 0x0026, 0x2009, 0x1804, 0x2011, 0x0009,
+	0x080c, 0x2a53, 0x002e, 0x001e, 0x000e, 0x0005, 0x0016, 0x00c6,
+	0x0006, 0x080c, 0xa8d0, 0x0106, 0x190c, 0xa872, 0x2061, 0x0100,
+	0x61a4, 0x60a7, 0x95f5, 0x0016, 0x0026, 0x2009, 0x1804, 0x2011,
+	0x0008, 0x080c, 0x2a53, 0x002e, 0x001e, 0x010e, 0x190c, 0xa88e,
+	0x000e, 0xa001, 0xa001, 0xa001, 0x61a6, 0x00ce, 0x001e, 0x0005,
+	0x00c6, 0x00d6, 0x0016, 0x0026, 0x2061, 0x0100, 0x2069, 0x0140,
+	0x080c, 0x74d5, 0x1510, 0x2001, 0x1a0c, 0x2004, 0x9005, 0x1904,
+	0x9e8f, 0x080c, 0x7576, 0x11a8, 0x2069, 0x0380, 0x6843, 0x0101,
+	0x6844, 0xd084, 0x1de8, 0x2061, 0x0100, 0x6020, 0xd0b4, 0x1120,
+	0x6024, 0xd084, 0x090c, 0x0d7d, 0x6843, 0x0100, 0x080c, 0x86bc,
+	0x04b0, 0x00c6, 0x2061, 0x19e7, 0x00f0, 0x6904, 0x9194, 0x4000,
+	0x0598, 0x080c, 0x9e0e, 0x080c, 0x2a1a, 0x00c6, 0x2061, 0x19e7,
+	0x6134, 0x9192, 0x0008, 0x1278, 0x8108, 0x6136, 0x080c, 0xa872,
+	0x6130, 0x080c, 0xa88e, 0x00ce, 0x81ff, 0x01c8, 0x080c, 0x86bc,
+	0x080c, 0x9e01, 0x00a0, 0x080c, 0xa872, 0x6130, 0x91e5, 0x0000,
+	0x0150, 0x080c, 0xe6ec, 0x080c, 0x86c5, 0x6003, 0x0001, 0x2009,
+	0x0014, 0x080c, 0xac68, 0x080c, 0xa88e, 0x00ce, 0x0000, 0x002e,
+	0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, 0x1a0c, 0x2004, 0x9005,
+	0x1db0, 0x00c6, 0x2061, 0x19e7, 0x6134, 0x9192, 0x0003, 0x1ad8,
+	0x8108, 0x6136, 0x00ce, 0x080c, 0x86bc, 0x080c, 0x5edd, 0x2009,
+	0x1846, 0x2114, 0x8210, 0x220a, 0x0c10, 0x0096, 0x00c6, 0x00d6,
+	0x00e6, 0x0016, 0x0026, 0x080c, 0x86d2, 0x080c, 0xa872, 0x2001,
+	0x0387, 0x2003, 0x0202, 0x2071, 0x19e7, 0x714c, 0x81ff, 0x0904,
+	0x9f37, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c, 0x74d5, 0x1510,
+	0x0036, 0x2019, 0x0002, 0x080c, 0xa0f4, 0x003e, 0x714c, 0x2160,
+	0x080c, 0xe6ec, 0x2009, 0x004a, 0x6220, 0x9296, 0x0009, 0x1130,
 	0x6114, 0x2148, 0xa87b, 0x0006, 0x2009, 0x004a, 0x6003, 0x0003,
-	0x080c, 0xab77, 0x2001, 0x0387, 0x2003, 0x0200, 0x080c, 0xa79d,
-	0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x009e, 0x0005, 0xd1ec,
-	0x1904, 0x9de9, 0x0804, 0x9deb, 0x0026, 0x00e6, 0x2071, 0x19e5,
-	0x706c, 0xd084, 0x01e8, 0xc084, 0x706e, 0x714c, 0x81ff, 0x01c0,
-	0x2071, 0x0100, 0x9188, 0x0008, 0x2114, 0x928e, 0x0006, 0x1138,
-	0x2009, 0x1984, 0x2011, 0x0012, 0x080c, 0x2a1a, 0x0048, 0x928e,
-	0x0009, 0x0db0, 0x2009, 0x1984, 0x2011, 0x0016, 0x080c, 0x2a1a,
-	0x00ee, 0x002e, 0x0005, 0x9036, 0x2001, 0x19ef, 0x2004, 0x9005,
-	0x0128, 0x9c06, 0x0128, 0x2c30, 0x600c, 0x0cc8, 0x9085, 0x0001,
-	0x0005, 0x00f6, 0x2079, 0x19e5, 0x610c, 0x9006, 0x600e, 0x6044,
-	0xc0fc, 0x6046, 0x86ff, 0x1140, 0x7824, 0x9c06, 0x1118, 0x7826,
-	0x782a, 0x0050, 0x792a, 0x0040, 0x00c6, 0x2660, 0x610e, 0x00ce,
-	0x7824, 0x9c06, 0x1108, 0x7e26, 0x080c, 0xa0f9, 0x080c, 0xc90b,
-	0x00fe, 0x0005, 0x080c, 0x9969, 0x7003, 0x1200, 0x7838, 0x7012,
-	0x783c, 0x7016, 0x00c6, 0x7820, 0x9086, 0x0004, 0x1148, 0x7810,
-	0x9005, 0x0130, 0x00b6, 0x2058, 0xb810, 0xb914, 0x00be, 0x0020,
-	0x2061, 0x1800, 0x607c, 0x6180, 0x9084, 0x00ff, 0x700a, 0x710e,
-	0x00ce, 0x60c3, 0x002c, 0x0804, 0x9cd9, 0x080c, 0x9969, 0x7003,
-	0x0f00, 0x7808, 0xd09c, 0x0128, 0xb810, 0x9084, 0x00ff, 0x700a,
-	0xb814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9cd9, 0x0156, 0x080c,
-	0x99b4, 0x7003, 0x0200, 0x080c, 0x8685, 0x20a9, 0x0006, 0x2011,
-	0xfff4, 0x2019, 0xfff5, 0x9ef0, 0x0002, 0x2305, 0x2072, 0x8e70,
-	0x2205, 0x2072, 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002, 0x1f04,
-	0x9edd, 0x60c3, 0x001c, 0x015e, 0x0804, 0x9cd9, 0x0016, 0x0026,
-	0x080c, 0x9990, 0x080c, 0x99a2, 0x9e80, 0x0004, 0x20e9, 0x0000,
-	0x20a0, 0x7814, 0x0096, 0x2048, 0xa800, 0x2048, 0xa860, 0x20e0,
-	0xa85c, 0x9080, 0x0021, 0x2098, 0x009e, 0x7808, 0x9088, 0x0002,
-	0x21a8, 0x9192, 0x0010, 0x1250, 0x4003, 0x9080, 0x0004, 0x8003,
-	0x60c2, 0x080c, 0x9cd9, 0x002e, 0x001e, 0x0005, 0x20a9, 0x0010,
-	0x4003, 0x080c, 0xa566, 0x20a1, 0x0240, 0x22a8, 0x4003, 0x0c68,
-	0x080c, 0x9969, 0x7003, 0x6200, 0x7808, 0x700e, 0x60c3, 0x0008,
-	0x0804, 0x9cd9, 0x0016, 0x0026, 0x080c, 0x9969, 0x20e9, 0x0000,
-	0x20a1, 0x024c, 0x7814, 0x0096, 0x2048, 0xa800, 0x2048, 0xa860,
-	0x20e0, 0xa85c, 0x9080, 0x0023, 0x2098, 0x009e, 0x7808, 0x9088,
-	0x0002, 0x21a8, 0x4003, 0x8003, 0x60c2, 0x080c, 0x9cd9, 0x002e,
-	0x001e, 0x0005, 0x00e6, 0x00c6, 0x0006, 0x0126, 0x2091, 0x8000,
-	0x2071, 0x19e5, 0x7010, 0x2060, 0x8cff, 0x0188, 0x080c, 0xc931,
-	0x1110, 0x080c, 0xb4a0, 0x600c, 0x0006, 0x080c, 0xcba8, 0x600f,
-	0x0000, 0x080c, 0xaad8, 0x080c, 0xa0f9, 0x00ce, 0x0c68, 0x2c00,
-	0x7012, 0x700e, 0x012e, 0x000e, 0x00ce, 0x00ee, 0x0005, 0x0126,
-	0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0016,
-	0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, 0xe7ff,
-	0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x19e5, 0x7030,
-	0x2060, 0x8cff, 0x0548, 0x080c, 0x9d09, 0x6ac0, 0x68c3, 0x0000,
-	0x080c, 0x85c0, 0x00c6, 0x2061, 0x0100, 0x080c, 0xa6b7, 0x00ce,
-	0x20a9, 0x01f4, 0x04b1, 0x080c, 0x94a8, 0x6044, 0xd0ac, 0x1128,
-	0x2001, 0x1986, 0x2004, 0x604a, 0x0020, 0x2009, 0x0013, 0x080c,
-	0xab77, 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee,
-	0x00fe, 0x015e, 0x012e, 0x0005, 0x2001, 0x1800, 0x2004, 0x9096,
-	0x0001, 0x0d78, 0x9096, 0x0004, 0x0d60, 0x080c, 0x85c0, 0x6814,
-	0x9084, 0x0001, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3,
-	0x0000, 0x2011, 0x5da6, 0x080c, 0x850b, 0x20a9, 0x01f4, 0x0009,
-	0x08c0, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, 0x7804, 0x9084,
-	0x4000, 0x190c, 0x29e1, 0x0090, 0xd084, 0x0118, 0x6827, 0x0001,
-	0x0010, 0x1f04, 0x9fd1, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001,
-	0x0100, 0x080c, 0x29d1, 0x9006, 0x080c, 0x29d1, 0x0005, 0x0126,
-	0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0016,
-	0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, 0xdbff,
-	0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x0380, 0x701c,
-	0x0006, 0x701f, 0x0202, 0x2071, 0x19e5, 0x704c, 0x2060, 0x8cff,
-	0x0904, 0xa094, 0x9386, 0x0002, 0x1128, 0x6814, 0x9084, 0x0002,
-	0x0904, 0xa094, 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009, 0x00fa,
-	0x8109, 0x1df0, 0x69c6, 0x68cb, 0x0008, 0x080c, 0x85cd, 0x080c,
-	0x1db4, 0x0046, 0x2009, 0x00a5, 0x080c, 0x0e55, 0x2021, 0x0169,
-	0x2404, 0x9084, 0x000f, 0x9086, 0x0004, 0x11f8, 0x68af, 0x95f5,
-	0x68c6, 0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079, 0x0090, 0x2071,
-	0x19e5, 0x6814, 0x9084, 0x1984, 0x9085, 0x0012, 0x6816, 0x782b,
-	0x0008, 0x7057, 0x0000, 0x00fe, 0x00ee, 0x9386, 0x0002, 0x1128,
-	0x7884, 0x9005, 0x1110, 0x7887, 0x0001, 0x0016, 0x2009, 0x0040,
-	0x080c, 0x2184, 0x001e, 0x2009, 0x0000, 0x080c, 0x0e55, 0x004e,
-	0x20a9, 0x03e8, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, 0x7804,
-	0x9084, 0x4000, 0x190c, 0x29e1, 0x0090, 0xd08c, 0x0118, 0x6827,
-	0x0002, 0x0010, 0x1f04, 0xa062, 0x7804, 0x9084, 0x1000, 0x0138,
-	0x2001, 0x0100, 0x080c, 0x29d1, 0x9006, 0x080c, 0x29d1, 0x6827,
-	0x4000, 0x6824, 0x83ff, 0x1180, 0x2009, 0x0049, 0x6020, 0x9086,
-	0x0009, 0x0150, 0x080c, 0x9505, 0x6044, 0xd0ac, 0x1118, 0x6003,
-	0x0002, 0x0010, 0x080c, 0xab77, 0x000e, 0x2071, 0x0380, 0xd08c,
-	0x1110, 0x701f, 0x0200, 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce,
-	0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x00d6, 0x0126,
-	0x2091, 0x8000, 0x2069, 0x19e5, 0x6a06, 0x012e, 0x00de, 0x0005,
-	0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0x19e5, 0x6a3e, 0x012e,
-	0x00de, 0x0005, 0x080c, 0x9ab7, 0x7814, 0x080c, 0x5604, 0x0108,
-	0x782c, 0x7032, 0x7042, 0x7047, 0x1000, 0x0478, 0x080c, 0x9ab7,
-	0x7814, 0x080c, 0x5604, 0x0108, 0x782c, 0x7032, 0x7042, 0x7047,
-	0x4000, 0x0418, 0x080c, 0x9ab7, 0x7814, 0x080c, 0x5604, 0x0108,
-	0x782c, 0x7032, 0x7042, 0x7047, 0x2000, 0x00b8, 0x080c, 0x9ab7,
-	0x7814, 0x080c, 0x5604, 0x0108, 0x782c, 0x7032, 0x7042, 0x7047,
-	0x0400, 0x0058, 0x080c, 0x9ab7, 0x7814, 0x080c, 0x5604, 0x0108,
-	0x782c, 0x7032, 0x7042, 0x7047, 0x0200, 0x60c3, 0x0020, 0x0804,
-	0x9cd9, 0x00e6, 0x2071, 0x19e5, 0x702c, 0x9005, 0x0110, 0x8001,
-	0x702e, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076,
-	0x0066, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e5, 0x7620,
-	0x2660, 0x2678, 0x2039, 0x0001, 0x87ff, 0x0904, 0xa19e, 0x8cff,
-	0x0904, 0xa19e, 0x6020, 0x9086, 0x0006, 0x1904, 0xa199, 0x88ff,
-	0x0138, 0x2800, 0x9c06, 0x1904, 0xa199, 0x2039, 0x0000, 0x0050,
-	0x6010, 0x9b06, 0x1904, 0xa199, 0x85ff, 0x0120, 0x605c, 0x9106,
-	0x1904, 0xa199, 0x7030, 0x9c06, 0x15b0, 0x2069, 0x0100, 0x68c0,
-	0x9005, 0x1160, 0x6824, 0xd084, 0x0148, 0x6827, 0x0001, 0x080c,
-	0x85c0, 0x080c, 0xa223, 0x7033, 0x0000, 0x0428, 0x080c, 0x85c0,
-	0x6820, 0xd0b4, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3,
-	0x0000, 0x080c, 0xa223, 0x7033, 0x0000, 0x0036, 0x2069, 0x0140,
-	0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x29d1,
-	0x9006, 0x080c, 0x29d1, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110,
-	0x6827, 0x0001, 0x003e, 0x7020, 0x9c36, 0x1110, 0x660c, 0x7622,
-	0x701c, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x701e,
-	0x0010, 0x701f, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110,
-	0x7e0e, 0x0008, 0x2678, 0x89ff, 0x1168, 0x600f, 0x0000, 0x6014,
-	0x0096, 0x2048, 0x080c, 0xc721, 0x0110, 0x080c, 0xe134, 0x009e,
-	0x080c, 0xab13, 0x080c, 0xa0f9, 0x88ff, 0x1190, 0x00ce, 0x0804,
-	0xa114, 0x2c78, 0x600c, 0x2060, 0x0804, 0xa114, 0x9006, 0x012e,
-	0x000e, 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005,
-	0x601b, 0x0000, 0x00ce, 0x98c5, 0x0001, 0x0c88, 0x00f6, 0x00e6,
-	0x00d6, 0x0096, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091,
-	0x8000, 0x2071, 0x19e5, 0x7648, 0x2660, 0x2678, 0x8cff, 0x0904,
-	0xa212, 0x6020, 0x9086, 0x0006, 0x1904, 0xa20d, 0x87ff, 0x0128,
-	0x2700, 0x9c06, 0x1904, 0xa20d, 0x0040, 0x6010, 0x9b06, 0x15e8,
-	0x85ff, 0x0118, 0x605c, 0x9106, 0x15c0, 0x704c, 0x9c06, 0x1168,
-	0x0036, 0x2019, 0x0001, 0x080c, 0x9fef, 0x703f, 0x0000, 0x9006,
-	0x704e, 0x706a, 0x7052, 0x706e, 0x003e, 0x7048, 0x9c36, 0x1110,
-	0x660c, 0x764a, 0x7044, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118,
-	0x2f00, 0x7046, 0x0010, 0x7047, 0x0000, 0x660c, 0x0066, 0x2c00,
-	0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x6014,
-	0x2048, 0x080c, 0xc721, 0x0110, 0x080c, 0xe134, 0x080c, 0xab13,
-	0x87ff, 0x1198, 0x00ce, 0x0804, 0xa1be, 0x2c78, 0x600c, 0x2060,
-	0x0804, 0xa1be, 0x9006, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce,
-	0x009e, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce,
-	0x97bd, 0x0001, 0x0c80, 0x00e6, 0x2071, 0x19e5, 0x7033, 0x0000,
-	0x7004, 0x9086, 0x0003, 0x0158, 0x2001, 0x1800, 0x2004, 0x9086,
-	0x0002, 0x1118, 0x7007, 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee,
-	0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126,
-	0x2091, 0x8000, 0x2071, 0x19e5, 0x2c10, 0x7648, 0x2660, 0x2678,
-	0x8cff, 0x0518, 0x2200, 0x9c06, 0x11e0, 0x7048, 0x9c36, 0x1110,
-	0x660c, 0x764a, 0x7044, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118,
-	0x2f00, 0x7046, 0x0010, 0x7047, 0x0000, 0x660c, 0x2c00, 0x9f06,
-	0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x9085, 0x0001,
-	0x0020, 0x2c78, 0x600c, 0x2060, 0x08d8, 0x012e, 0x000e, 0x002e,
-	0x006e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0096, 0x00f6, 0x00e6,
-	0x00d6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000,
-	0x2071, 0x19e5, 0x7610, 0x2660, 0x2678, 0x8cff, 0x0904, 0xa305,
-	0x6010, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x9206, 0x1904, 0xa300,
-	0x7030, 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904,
-	0xa2dc, 0x080c, 0x9d09, 0x68c3, 0x0000, 0x080c, 0xa223, 0x7033,
-	0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138,
-	0x2001, 0x0100, 0x080c, 0x29d1, 0x9006, 0x080c, 0x29d1, 0x2069,
-	0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x7010,
-	0x9c36, 0x1110, 0x660c, 0x7612, 0x700c, 0x9c36, 0x1140, 0x2c00,
-	0x9f36, 0x0118, 0x2f00, 0x700e, 0x0010, 0x700f, 0x0000, 0x660c,
-	0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f,
-	0x0000, 0x080c, 0xc920, 0x1158, 0x080c, 0x31dc, 0x080c, 0xc931,
-	0x11f0, 0x080c, 0xb4a0, 0x00d8, 0x080c, 0xa223, 0x08c0, 0x080c,
-	0xc931, 0x1118, 0x080c, 0xb4a0, 0x0090, 0x6014, 0x2048, 0x080c,
-	0xc721, 0x0168, 0x6020, 0x9086, 0x0003, 0x1508, 0xa867, 0x0103,
-	0xab7a, 0xa877, 0x0000, 0x080c, 0x6c73, 0x080c, 0xc90b, 0x080c,
-	0xcba8, 0x080c, 0xab13, 0x080c, 0xa0f9, 0x00ce, 0x0804, 0xa285,
-	0x2c78, 0x600c, 0x2060, 0x0804, 0xa285, 0x012e, 0x000e, 0x002e,
-	0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, 0x0005, 0x6020,
-	0x9086, 0x0006, 0x1d20, 0x080c, 0xe134, 0x0c08, 0x00d6, 0x080c,
-	0x99b4, 0x7003, 0x0200, 0x7007, 0x0014, 0x60c3, 0x0014, 0x20e1,
-	0x0001, 0x2099, 0x1987, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x20a9,
-	0x0004, 0x4003, 0x7023, 0x0004, 0x7027, 0x7878, 0x080c, 0x9cd9,
-	0x00de, 0x0005, 0x080c, 0x99b4, 0x700b, 0x0800, 0x7814, 0x9084,
-	0xff00, 0x700e, 0x7814, 0x9084, 0x00ff, 0x7022, 0x782c, 0x7026,
-	0x7860, 0x9084, 0x00ff, 0x9085, 0x0200, 0x7002, 0x7860, 0x9084,
-	0xff00, 0x8007, 0x7006, 0x60c2, 0x0804, 0x9cd9, 0x00b6, 0x00d6,
-	0x0016, 0x00d6, 0x2f68, 0x2009, 0x0035, 0x080c, 0xcdad, 0x00de,
-	0x1904, 0xa3b3, 0x080c, 0x9969, 0x7003, 0x1300, 0x782c, 0x080c,
-	0xa4be, 0x2068, 0x6820, 0x9086, 0x0003, 0x0560, 0x7810, 0x2058,
-	0xbaa0, 0x080c, 0xaa42, 0x11d8, 0x9286, 0x007e, 0x1128, 0x700b,
-	0x00ff, 0x700f, 0xfffe, 0x0498, 0x9286, 0x007f, 0x1128, 0x700b,
-	0x00ff, 0x700f, 0xfffd, 0x0458, 0x9284, 0xff80, 0x0180, 0x9286,
-	0x0080, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffc, 0x0400, 0x92d8,
-	0x1000, 0x2b5c, 0xb810, 0x700a, 0xb814, 0x700e, 0x00c0, 0xb884,
-	0x700e, 0x00a8, 0x080c, 0xaa42, 0x1130, 0x7810, 0x2058, 0xb8a0,
-	0x9082, 0x007e, 0x0250, 0x00d6, 0x2069, 0x181f, 0x2d04, 0x700a,
-	0x8d68, 0x2d04, 0x700e, 0x00de, 0x0010, 0x6034, 0x700e, 0x7838,
-	0x7012, 0x783c, 0x7016, 0x60c3, 0x000c, 0x001e, 0x00de, 0x080c,
-	0x9cd9, 0x00be, 0x0005, 0x781b, 0x0001, 0x7803, 0x0006, 0x001e,
-	0x00de, 0x00be, 0x0005, 0x792c, 0x9180, 0x0008, 0x200c, 0x9186,
-	0x0006, 0x01c0, 0x9186, 0x0003, 0x0904, 0xa431, 0x9186, 0x0005,
-	0x0904, 0xa419, 0x9186, 0x0004, 0x05f0, 0x9186, 0x0008, 0x0904,
-	0xa422, 0x7807, 0x0037, 0x782f, 0x0003, 0x7817, 0x1700, 0x080c,
-	0xa49b, 0x0005, 0x080c, 0xa45c, 0x00d6, 0x0026, 0x792c, 0x2168,
-	0x2009, 0x4000, 0x6800, 0x6a44, 0xd2fc, 0x11f8, 0x0002, 0xa3fa,
-	0xa405, 0xa3fc, 0xa405, 0xa401, 0xa3fa, 0xa3fa, 0xa405, 0xa405,
-	0xa405, 0xa405, 0xa3fa, 0xa3fa, 0xa3fa, 0xa3fa, 0xa3fa, 0xa405,
-	0xa3fa, 0xa405, 0x080c, 0x0d7d, 0x6824, 0xd0e4, 0x0110, 0xd0cc,
-	0x0110, 0x900e, 0x0010, 0x2009, 0x2000, 0x682c, 0x7022, 0x6830,
-	0x7026, 0x0804, 0xa455, 0x080c, 0xa45c, 0x00d6, 0x0026, 0x792c,
-	0x2168, 0x2009, 0x4000, 0x6a00, 0x9286, 0x0002, 0x1108, 0x900e,
-	0x04e0, 0x080c, 0xa45c, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009,
-	0x4000, 0x0498, 0x04c9, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009,
-	0x4000, 0x9286, 0x0005, 0x0118, 0x9286, 0x0002, 0x1108, 0x900e,
-	0x0420, 0x0451, 0x00d6, 0x0026, 0x792c, 0x2168, 0x6814, 0x0096,
-	0x2048, 0xa9ac, 0xa834, 0x9112, 0xa9b0, 0xa838, 0x009e, 0x9103,
-	0x7022, 0x7226, 0x792c, 0x9180, 0x0011, 0x2004, 0xd0fc, 0x1148,
-	0x9180, 0x0000, 0x2004, 0x908e, 0x0002, 0x0130, 0x908e, 0x0004,
-	0x0118, 0x2009, 0x4000, 0x0008, 0x900e, 0x712a, 0x60c3, 0x0018,
-	0x002e, 0x00de, 0x0804, 0x9cd9, 0x00b6, 0x0036, 0x0046, 0x0056,
-	0x0066, 0x080c, 0x99b4, 0x9006, 0x7003, 0x0200, 0x7938, 0x710a,
-	0x793c, 0x710e, 0x7810, 0x2058, 0xb8a0, 0x080c, 0xaa42, 0x1118,
-	0x9092, 0x007e, 0x0268, 0x00d6, 0x2069, 0x181f, 0x2d2c, 0x8d68,
-	0x2d34, 0x90d8, 0x1000, 0x2b5c, 0xbb10, 0xbc14, 0x00de, 0x0028,
-	0x901e, 0xbc84, 0x2029, 0x0000, 0x6634, 0x782c, 0x9080, 0x0008,
-	0x2004, 0x9086, 0x0003, 0x1128, 0x7512, 0x7616, 0x731a, 0x741e,
-	0x0020, 0x7312, 0x7416, 0x751a, 0x761e, 0x006e, 0x005e, 0x004e,
-	0x003e, 0x00be, 0x0005, 0x080c, 0x99b4, 0x7003, 0x0100, 0x782c,
-	0x700a, 0x7814, 0x700e, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9cd9,
-	0x080c, 0x9960, 0x7003, 0x1400, 0x7838, 0x700a, 0x0079, 0x783c,
-	0x700e, 0x782c, 0x7012, 0x7830, 0x7016, 0x7834, 0x9084, 0x00ff,
-	0x8007, 0x701a, 0x60c3, 0x0010, 0x0804, 0x9cd9, 0x00e6, 0x2071,
-	0x0240, 0x0006, 0x00f6, 0x2078, 0x7810, 0x00b6, 0x2058, 0xb8d4,
-	0xd084, 0x0120, 0x7850, 0x702a, 0x784c, 0x702e, 0x00be, 0x00fe,
-	0x000e, 0x00ee, 0x0005, 0x080c, 0x99ab, 0x7003, 0x0100, 0x782c,
-	0x700a, 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9cd9, 0x00a9,
-	0x7914, 0x712a, 0x60c3, 0x0000, 0x60a7, 0x9575, 0x0026, 0x080c,
-	0x2940, 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e,
-	0x080c, 0x9cfc, 0x080c, 0x85b7, 0x0005, 0x0036, 0x0096, 0x00d6,
-	0x00e6, 0x7860, 0x2048, 0xaa7c, 0x9296, 0x00c0, 0x9294, 0xfffd,
-	0xaa7e, 0xaa80, 0x9294, 0x0300, 0xaa82, 0xa96c, 0x9194, 0x00ff,
-	0xab74, 0x9384, 0x00ff, 0x908d, 0xc200, 0xa96e, 0x9384, 0xff00,
-	0x9215, 0xaa76, 0xa870, 0xaa78, 0xa87a, 0xaa72, 0x00d6, 0x2069,
-	0x0200, 0x080c, 0xa57b, 0x00de, 0x20e9, 0x0000, 0x20a1, 0x0240,
-	0x20a9, 0x000a, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098,
-	0x4003, 0x60a3, 0x0035, 0xaa68, 0x9294, 0x7000, 0x9286, 0x3000,
-	0x0110, 0x60a3, 0x0037, 0x00ee, 0x00de, 0x009e, 0x003e, 0x0005,
-	0x900e, 0x7814, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x01c0, 0x9084,
-	0x0003, 0x11a8, 0x2001, 0x180c, 0x2004, 0xd0bc, 0x0180, 0x7824,
-	0xd0cc, 0x1168, 0xd0c4, 0x1158, 0xa8a8, 0x9005, 0x1140, 0x2001,
-	0x180c, 0x200c, 0xc1d5, 0x2102, 0x2009, 0x19b0, 0x210c, 0x009e,
-	0x918d, 0x0092, 0x0010, 0x2009, 0x0096, 0x60ab, 0x0036, 0x0026,
-	0x2110, 0x900e, 0x080c, 0x2a1a, 0x002e, 0x0005, 0x2009, 0x0009,
-	0x00a0, 0x2009, 0x000a, 0x0088, 0x2009, 0x000b, 0x0070, 0x2009,
-	0x000c, 0x0058, 0x2009, 0x000d, 0x0040, 0x2009, 0x000e, 0x0028,
-	0x2009, 0x000f, 0x0010, 0x2009, 0x0008, 0x6912, 0x0005, 0x080c,
-	0x9969, 0x0016, 0x0026, 0x0096, 0x00d6, 0x7814, 0x2048, 0x7013,
-	0x0138, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028, 0x1138, 0x2001,
-	0x197c, 0x2004, 0x9086, 0xaaaa, 0x1904, 0xa620, 0x7003, 0x5400,
-	0x00c6, 0x2061, 0x1800, 0x607c, 0x9084, 0x00ff, 0xa998, 0x810f,
-	0x918c, 0xff00, 0x9105, 0x700a, 0x6080, 0x700e, 0xa998, 0x918c,
-	0xff00, 0x7112, 0x20a9, 0x0004, 0x2009, 0x1805, 0x2e10, 0x9290,
-	0x0006, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xa5b1, 0x20a9,
-	0x0004, 0x2009, 0x1801, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04,
-	0xa5bb, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0029, 0x2098, 0x2009,
-	0x0006, 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109,
-	0x1dc0, 0x00d6, 0x2069, 0x0200, 0x080c, 0xa566, 0x00de, 0x2071,
-	0x0240, 0x2011, 0x0240, 0x2009, 0x0002, 0x20a9, 0x0001, 0x4002,
-	0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0x2009, 0x0008, 0x20a9,
-	0x0001, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0xa85c,
-	0x9080, 0x0031, 0x2098, 0x2009, 0x0008, 0x20a9, 0x0001, 0x4002,
-	0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0x00ce, 0x60c3, 0x004c,
-	0x60a3, 0x0056, 0x60a7, 0x9575, 0x2001, 0x1837, 0x2004, 0x9084,
-	0x0028, 0x1168, 0x080c, 0x73e4, 0x0150, 0x6028, 0xc0bd, 0x602a,
-	0x2009, 0x1804, 0x2011, 0x0029, 0x080c, 0x2a1a, 0x0010, 0x080c,
-	0x9cd9, 0x080c, 0x85b7, 0x00de, 0x009e, 0x002e, 0x001e, 0x0005,
-	0x00e6, 0x2071, 0x0240, 0x2001, 0x2200, 0x9085, 0x00ff, 0x7002,
-	0x7007, 0xffff, 0x2071, 0x0100, 0x709b, 0x00ff, 0x00ee, 0x0804,
-	0xa596, 0x080c, 0x9969, 0x0016, 0x0026, 0x0096, 0x00d6, 0x7814,
-	0x2048, 0x7013, 0x0138, 0x7003, 0x5500, 0x00c6, 0xa89c, 0x9084,
-	0x00ff, 0xa998, 0x810f, 0x918c, 0xff00, 0x9105, 0x700a, 0xa99c,
-	0x918c, 0xff00, 0xa8a0, 0x9084, 0x00ff, 0x9105, 0x700e, 0xa998,
-	0x918c, 0xff00, 0x2061, 0x1800, 0x607c, 0x9084, 0x00ff, 0x910d,
-	0x7112, 0x6180, 0x7116, 0x2009, 0x0008, 0xa860, 0x20e0, 0xa85c,
-	0x9080, 0x0029, 0x2098, 0x2e10, 0x9290, 0x0006, 0x20a9, 0x0001,
-	0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0x20a9, 0x0004,
-	0x2009, 0x1805, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xa672,
-	0x20a9, 0x0002, 0x2009, 0x1801, 0x2104, 0x2012, 0x8108, 0x8210,
-	0x1f04, 0xa67c, 0x00d6, 0x0016, 0x2069, 0x0200, 0x080c, 0xa566,
-	0x001e, 0x00de, 0x2071, 0x0240, 0x20a9, 0x0002, 0x2009, 0x1803,
-	0x2011, 0x0240, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xa692,
-	0x2009, 0x0008, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dd0,
-	0x9006, 0x20a9, 0x0008, 0x2012, 0x8210, 0x1f04, 0xa6a3, 0x00ce,
-	0x60c3, 0x004c, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x9cd9,
-	0x080c, 0x85b7, 0x00de, 0x009e, 0x002e, 0x001e, 0x0005, 0x00d6,
-	0x9290, 0x0018, 0x8214, 0x20e9, 0x0000, 0x2069, 0x0200, 0x6813,
-	0x0000, 0x22a8, 0x9284, 0x00e0, 0x0128, 0x20a9, 0x0020, 0x9292,
-	0x0020, 0x0008, 0x9016, 0x20a1, 0x0240, 0x9006, 0x4004, 0x82ff,
-	0x0120, 0x6810, 0x8000, 0x6812, 0x0c60, 0x00de, 0x0005, 0x00f6,
-	0x00e6, 0x00d6, 0x00c6, 0x00a6, 0x0096, 0x0066, 0x0126, 0x2091,
-	0x8000, 0x2071, 0x19e5, 0x7610, 0x2660, 0x2678, 0x8cff, 0x0904,
-	0xa75e, 0x7030, 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005,
-	0x0904, 0xa735, 0x080c, 0x9d09, 0x68c3, 0x0000, 0x080c, 0xa223,
+	0x080c, 0xac68, 0x2001, 0x0386, 0x2003, 0x5040, 0x080c, 0x7576,
+	0x0804, 0x9f37, 0x6904, 0xd1f4, 0x0904, 0x9f44, 0x080c, 0x2a1a,
+	0x00c6, 0x704c, 0x9065, 0x090c, 0x0d7d, 0x6020, 0x00ce, 0x9086,
+	0x0006, 0x1518, 0x61c8, 0x60c4, 0x9105, 0x11f8, 0x2009, 0x180c,
+	0x2104, 0xd0d4, 0x01d0, 0x6214, 0x9294, 0x1800, 0x1128, 0x6224,
+	0x9294, 0x0002, 0x1560, 0x0010, 0xc0d4, 0x200a, 0x6014, 0x9084,
+	0xe7fd, 0x9085, 0x0010, 0x6016, 0x704c, 0x2060, 0x080c, 0x960a,
+	0x2009, 0x0049, 0x080c, 0xac68, 0x00d0, 0x0036, 0x2019, 0x0001,
+	0x080c, 0xa0f4, 0x003e, 0x714c, 0x2160, 0x080c, 0xe6ec, 0x2009,
+	0x004a, 0x6220, 0x9296, 0x0009, 0x1130, 0x6114, 0x2148, 0xa87b,
+	0x0006, 0x2009, 0x004a, 0x6003, 0x0003, 0x080c, 0xac68, 0x2001,
+	0x0387, 0x2003, 0x0200, 0x080c, 0xa88e, 0x002e, 0x001e, 0x00ee,
+	0x00de, 0x00ce, 0x009e, 0x0005, 0xd1ec, 0x1904, 0x9eee, 0x0804,
+	0x9ef0, 0x0026, 0x00e6, 0x2071, 0x19e7, 0x706c, 0xd084, 0x01e8,
+	0xc084, 0x706e, 0x714c, 0x81ff, 0x01c0, 0x2071, 0x0100, 0x9188,
+	0x0008, 0x2114, 0x928e, 0x0006, 0x1138, 0x2009, 0x1984, 0x2011,
+	0x0012, 0x080c, 0x2a53, 0x0048, 0x928e, 0x0009, 0x0db0, 0x2009,
+	0x1984, 0x2011, 0x0016, 0x080c, 0x2a53, 0x00ee, 0x002e, 0x0005,
+	0x9036, 0x2001, 0x19f1, 0x2004, 0x9005, 0x0128, 0x9c06, 0x0128,
+	0x2c30, 0x600c, 0x0cc8, 0x9085, 0x0001, 0x0005, 0x00f6, 0x2079,
+	0x19e7, 0x610c, 0x9006, 0x600e, 0x6044, 0xc0fc, 0x6046, 0x86ff,
+	0x1140, 0x7824, 0x9c06, 0x1118, 0x7826, 0x782a, 0x0050, 0x792a,
+	0x0040, 0x00c6, 0x2660, 0x610e, 0x00ce, 0x7824, 0x9c06, 0x1108,
+	0x7e26, 0x080c, 0xa1ea, 0x080c, 0xca03, 0x00fe, 0x0005, 0x080c,
+	0x9a6e, 0x7003, 0x1200, 0x7838, 0x7012, 0x783c, 0x7016, 0x00c6,
+	0x7820, 0x9086, 0x0004, 0x1148, 0x7810, 0x9005, 0x0130, 0x00b6,
+	0x2058, 0xb810, 0xb914, 0x00be, 0x0020, 0x2061, 0x1800, 0x607c,
+	0x6180, 0x9084, 0x00ff, 0x700a, 0x710e, 0x00ce, 0x60c3, 0x002c,
+	0x0804, 0x9dde, 0x080c, 0x9a6e, 0x7003, 0x0f00, 0x7808, 0xd09c,
+	0x0128, 0xb810, 0x9084, 0x00ff, 0x700a, 0xb814, 0x700e, 0x60c3,
+	0x0008, 0x0804, 0x9dde, 0x0156, 0x080c, 0x9ab9, 0x7003, 0x0200,
+	0x080c, 0x878a, 0x20a9, 0x0006, 0x2011, 0xfff4, 0x2019, 0xfff5,
+	0x9ef0, 0x0002, 0x2305, 0x2072, 0x8e70, 0x2205, 0x2072, 0x8e70,
+	0x9398, 0x0002, 0x9290, 0x0002, 0x1f04, 0x9fe2, 0x60c3, 0x001c,
+	0x015e, 0x0804, 0x9dde, 0x0016, 0x0026, 0x080c, 0x9a95, 0x080c,
+	0x9aa7, 0x9e80, 0x0004, 0x20e9, 0x0000, 0x20a0, 0x7814, 0x0096,
+	0x2048, 0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021,
+	0x2098, 0x009e, 0x7808, 0x9088, 0x0002, 0x21a8, 0x9192, 0x0010,
+	0x1250, 0x4003, 0x9080, 0x0004, 0x8003, 0x60c2, 0x080c, 0x9dde,
+	0x002e, 0x001e, 0x0005, 0x20a9, 0x0010, 0x4003, 0x080c, 0xa657,
+	0x20a1, 0x0240, 0x22a8, 0x4003, 0x0c68, 0x080c, 0x9a6e, 0x7003,
+	0x6200, 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9dde, 0x0016,
+	0x0026, 0x080c, 0x9a6e, 0x20e9, 0x0000, 0x20a1, 0x024c, 0x7814,
+	0x0096, 0x2048, 0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, 0x9080,
+	0x0023, 0x2098, 0x009e, 0x7808, 0x9088, 0x0002, 0x21a8, 0x4003,
+	0x8003, 0x60c2, 0x080c, 0x9dde, 0x002e, 0x001e, 0x0005, 0x00e6,
+	0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e7, 0x7010,
+	0x2060, 0x8cff, 0x0188, 0x080c, 0xca29, 0x1110, 0x080c, 0xb591,
+	0x600c, 0x0006, 0x080c, 0xcca0, 0x600f, 0x0000, 0x080c, 0xabc9,
+	0x080c, 0xa1ea, 0x00ce, 0x0c68, 0x2c00, 0x7012, 0x700e, 0x012e,
+	0x000e, 0x00ce, 0x00ee, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6,
+	0x00d6, 0x00c6, 0x0066, 0x0026, 0x0016, 0x0006, 0x2091, 0x8000,
+	0x2001, 0x180c, 0x200c, 0x918c, 0xe7ff, 0x2102, 0x2069, 0x0100,
+	0x2079, 0x0140, 0x2071, 0x19e7, 0x7030, 0x2060, 0x8cff, 0x0548,
+	0x080c, 0x9e0e, 0x6ac0, 0x68c3, 0x0000, 0x080c, 0x86c5, 0x00c6,
+	0x2061, 0x0100, 0x080c, 0xa7a8, 0x00ce, 0x20a9, 0x01f4, 0x04b1,
+	0x080c, 0x95ad, 0x6044, 0xd0ac, 0x1128, 0x2001, 0x1988, 0x2004,
+	0x604a, 0x0020, 0x2009, 0x0013, 0x080c, 0xac68, 0x000e, 0x001e,
+	0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e,
+	0x0005, 0x2001, 0x1800, 0x2004, 0x9096, 0x0001, 0x0d78, 0x9096,
+	0x0004, 0x0d60, 0x080c, 0x86c5, 0x6814, 0x9084, 0x0001, 0x0110,
+	0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x5e87,
+	0x080c, 0x860d, 0x20a9, 0x01f4, 0x0009, 0x08c0, 0x6824, 0xd094,
+	0x0140, 0x6827, 0x0004, 0x7804, 0x9084, 0x4000, 0x190c, 0x2a1a,
+	0x0090, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, 0xa0d6,
+	0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2a0a,
+	0x9006, 0x080c, 0x2a0a, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6,
+	0x00d6, 0x00c6, 0x0066, 0x0026, 0x0016, 0x0006, 0x2091, 0x8000,
+	0x2001, 0x180c, 0x200c, 0x918c, 0xdbff, 0x2102, 0x2069, 0x0100,
+	0x2079, 0x0140, 0x2071, 0x0380, 0x701c, 0x0006, 0x701f, 0x0202,
+	0x2071, 0x19e7, 0x704c, 0x2060, 0x8cff, 0x0904, 0xa199, 0x9386,
+	0x0002, 0x1128, 0x6814, 0x9084, 0x0002, 0x0904, 0xa199, 0x68af,
+	0x95f5, 0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, 0x1df0, 0x69c6,
+	0x68cb, 0x0008, 0x080c, 0x86d2, 0x080c, 0x1dd8, 0x0046, 0x2009,
+	0x00a5, 0x080c, 0x0e55, 0x2021, 0x0169, 0x2404, 0x9084, 0x000f,
+	0x9086, 0x0004, 0x11f8, 0x68af, 0x95f5, 0x68c6, 0x68cb, 0x0008,
+	0x00e6, 0x00f6, 0x2079, 0x0090, 0x2071, 0x19e7, 0x6814, 0x9084,
+	0x1984, 0x9085, 0x0012, 0x6816, 0x782b, 0x0008, 0x7057, 0x0000,
+	0x00fe, 0x00ee, 0x9386, 0x0002, 0x1128, 0x7884, 0x9005, 0x1110,
+	0x7887, 0x0001, 0x0016, 0x2009, 0x0040, 0x080c, 0x21b0, 0x001e,
+	0x2009, 0x0000, 0x080c, 0x0e55, 0x004e, 0x20a9, 0x03e8, 0x6824,
+	0xd094, 0x0140, 0x6827, 0x0004, 0x7804, 0x9084, 0x4000, 0x190c,
+	0x2a1a, 0x0090, 0xd08c, 0x0118, 0x6827, 0x0002, 0x0010, 0x1f04,
+	0xa167, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c,
+	0x2a0a, 0x9006, 0x080c, 0x2a0a, 0x6827, 0x4000, 0x6824, 0x83ff,
+	0x1180, 0x2009, 0x0049, 0x6020, 0x9086, 0x0009, 0x0150, 0x080c,
+	0x960a, 0x6044, 0xd0ac, 0x1118, 0x6003, 0x0002, 0x0010, 0x080c,
+	0xac68, 0x000e, 0x2071, 0x0380, 0xd08c, 0x1110, 0x701f, 0x0200,
+	0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe,
+	0x015e, 0x012e, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069,
+	0x19e7, 0x6a06, 0x012e, 0x00de, 0x0005, 0x00d6, 0x0126, 0x2091,
+	0x8000, 0x2069, 0x19e7, 0x6a3e, 0x012e, 0x00de, 0x0005, 0x080c,
+	0x9bbc, 0x785c, 0x7032, 0x7042, 0x7047, 0x1000, 0x00f8, 0x080c,
+	0x9bbc, 0x785c, 0x7032, 0x7042, 0x7047, 0x4000, 0x00b8, 0x080c,
+	0x9bbc, 0x785c, 0x7032, 0x7042, 0x7047, 0x2000, 0x0078, 0x080c,
+	0x9bbc, 0x785c, 0x7032, 0x7042, 0x7047, 0x0400, 0x0038, 0x080c,
+	0x9bbc, 0x785c, 0x7032, 0x7042, 0x7047, 0x0200, 0x60c3, 0x0020,
+	0x0804, 0x9dde, 0x00e6, 0x2071, 0x19e7, 0x702c, 0x9005, 0x0110,
+	0x8001, 0x702e, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6,
+	0x0076, 0x0066, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e7,
+	0x7620, 0x2660, 0x2678, 0x2039, 0x0001, 0x87ff, 0x0904, 0xa28f,
+	0x8cff, 0x0904, 0xa28f, 0x6020, 0x9086, 0x0006, 0x1904, 0xa28a,
+	0x88ff, 0x0138, 0x2800, 0x9c06, 0x1904, 0xa28a, 0x2039, 0x0000,
+	0x0050, 0x6010, 0x9b06, 0x1904, 0xa28a, 0x85ff, 0x0120, 0x605c,
+	0x9106, 0x1904, 0xa28a, 0x7030, 0x9c06, 0x15b0, 0x2069, 0x0100,
+	0x68c0, 0x9005, 0x1160, 0x6824, 0xd084, 0x0148, 0x6827, 0x0001,
+	0x080c, 0x86c5, 0x080c, 0xa314, 0x7033, 0x0000, 0x0428, 0x080c,
+	0x86c5, 0x6820, 0xd0b4, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008,
+	0x68c3, 0x0000, 0x080c, 0xa314, 0x7033, 0x0000, 0x0036, 0x2069,
+	0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c,
+	0x2a0a, 0x9006, 0x080c, 0x2a0a, 0x2069, 0x0100, 0x6824, 0xd084,
+	0x0110, 0x6827, 0x0001, 0x003e, 0x7020, 0x9c36, 0x1110, 0x660c,
+	0x7622, 0x701c, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00,
+	0x701e, 0x0010, 0x701f, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06,
+	0x0110, 0x7e0e, 0x0008, 0x2678, 0x89ff, 0x1168, 0x600f, 0x0000,
+	0x6014, 0x0096, 0x2048, 0x080c, 0xc812, 0x0110, 0x080c, 0xe241,
+	0x009e, 0x080c, 0xac04, 0x080c, 0xa1ea, 0x88ff, 0x1190, 0x00ce,
+	0x0804, 0xa205, 0x2c78, 0x600c, 0x2060, 0x0804, 0xa205, 0x9006,
+	0x012e, 0x000e, 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x00fe,
+	0x0005, 0x601b, 0x0000, 0x00ce, 0x98c5, 0x0001, 0x0c88, 0x00f6,
+	0x00e6, 0x00d6, 0x0096, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126,
+	0x2091, 0x8000, 0x2071, 0x19e7, 0x7648, 0x2660, 0x2678, 0x8cff,
+	0x0904, 0xa303, 0x6020, 0x9086, 0x0006, 0x1904, 0xa2fe, 0x87ff,
+	0x0128, 0x2700, 0x9c06, 0x1904, 0xa2fe, 0x0040, 0x6010, 0x9b06,
+	0x15e8, 0x85ff, 0x0118, 0x605c, 0x9106, 0x15c0, 0x704c, 0x9c06,
+	0x1168, 0x0036, 0x2019, 0x0001, 0x080c, 0xa0f4, 0x703f, 0x0000,
+	0x9006, 0x704e, 0x706a, 0x7052, 0x706e, 0x003e, 0x7048, 0x9c36,
+	0x1110, 0x660c, 0x764a, 0x7044, 0x9c36, 0x1140, 0x2c00, 0x9f36,
+	0x0118, 0x2f00, 0x7046, 0x0010, 0x7047, 0x0000, 0x660c, 0x0066,
+	0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000,
+	0x6014, 0x2048, 0x080c, 0xc812, 0x0110, 0x080c, 0xe241, 0x080c,
+	0xac04, 0x87ff, 0x1198, 0x00ce, 0x0804, 0xa2af, 0x2c78, 0x600c,
+	0x2060, 0x0804, 0xa2af, 0x9006, 0x012e, 0x000e, 0x002e, 0x006e,
+	0x00ce, 0x009e, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000,
+	0x00ce, 0x97bd, 0x0001, 0x0c80, 0x00e6, 0x2071, 0x19e7, 0x7033,
+	0x0000, 0x7004, 0x9086, 0x0003, 0x0158, 0x2001, 0x1800, 0x2004,
+	0x9086, 0x0002, 0x1118, 0x7007, 0x0005, 0x0010, 0x7007, 0x0000,
+	0x00ee, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006,
+	0x0126, 0x2091, 0x8000, 0x2071, 0x19e7, 0x2c10, 0x7648, 0x2660,
+	0x2678, 0x8cff, 0x0518, 0x2200, 0x9c06, 0x11e0, 0x7048, 0x9c36,
+	0x1110, 0x660c, 0x764a, 0x7044, 0x9c36, 0x1140, 0x2c00, 0x9f36,
+	0x0118, 0x2f00, 0x7046, 0x0010, 0x7047, 0x0000, 0x660c, 0x2c00,
+	0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x9085,
+	0x0001, 0x0020, 0x2c78, 0x600c, 0x2060, 0x08d8, 0x012e, 0x000e,
+	0x002e, 0x006e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0096, 0x00f6,
+	0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091,
+	0x8000, 0x2071, 0x19e7, 0x7610, 0x2660, 0x2678, 0x8cff, 0x0904,
+	0xa3f6, 0x6010, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x9206, 0x1904,
+	0xa3f1, 0x7030, 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005,
+	0x0904, 0xa3cd, 0x080c, 0x9e0e, 0x68c3, 0x0000, 0x080c, 0xa314,
 	0x7033, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000,
-	0x0138, 0x2001, 0x0100, 0x080c, 0x29d1, 0x9006, 0x080c, 0x29d1,
+	0x0138, 0x2001, 0x0100, 0x080c, 0x2a0a, 0x9006, 0x080c, 0x2a0a,
 	0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e,
 	0x7010, 0x9c36, 0x1110, 0x660c, 0x7612, 0x700c, 0x9c36, 0x1140,
 	0x2c00, 0x9f36, 0x0118, 0x2f00, 0x700e, 0x0010, 0x700f, 0x0000,
 	0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678,
-	0x600f, 0x0000, 0x080c, 0xc920, 0x1158, 0x080c, 0x31dc, 0x080c,
-	0xc931, 0x11f0, 0x080c, 0xb4a0, 0x00d8, 0x080c, 0xa223, 0x08c0,
-	0x080c, 0xc931, 0x1118, 0x080c, 0xb4a0, 0x0090, 0x6014, 0x2048,
-	0x080c, 0xc721, 0x0168, 0x6020, 0x9086, 0x0003, 0x1520, 0xa867,
-	0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6c7f, 0x080c, 0xc90b,
-	0x080c, 0xcba8, 0x080c, 0xab13, 0x080c, 0xa0f9, 0x00ce, 0x0804,
-	0xa6e6, 0x2c78, 0x600c, 0x2060, 0x0804, 0xa6e6, 0x7013, 0x0000,
-	0x700f, 0x0000, 0x012e, 0x006e, 0x009e, 0x00ae, 0x00ce, 0x00de,
-	0x00ee, 0x00fe, 0x0005, 0x6020, 0x9086, 0x0006, 0x1d08, 0x080c,
-	0xe134, 0x08f0, 0x00f6, 0x0036, 0x2079, 0x0380, 0x7b18, 0xd3bc,
-	0x1de8, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x003e, 0x00fe,
-	0x0005, 0x0016, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086,
-	0x0001, 0x1188, 0x2001, 0x0015, 0x0c29, 0x2009, 0x1000, 0x2001,
-	0x0382, 0x2004, 0x9084, 0x0007, 0x9086, 0x0003, 0x0120, 0x8109,
-	0x1db0, 0x080c, 0x0d7d, 0x001e, 0x0005, 0x2001, 0x0382, 0x2004,
-	0x9084, 0x0007, 0x9086, 0x0003, 0x1120, 0x2001, 0x0380, 0x2003,
-	0x0001, 0x0005, 0x0156, 0x0016, 0x0026, 0x00e6, 0x900e, 0x2071,
-	0x19e5, 0x0469, 0x0106, 0x0190, 0x7004, 0x9086, 0x0003, 0x0148,
-	0x20a9, 0x1000, 0x6044, 0xd0fc, 0x01d8, 0x1f04, 0xa7ba, 0x080c,
-	0x0d7d, 0x080c, 0xa781, 0x6044, 0xd0fc, 0x0190, 0x7030, 0x9c06,
-	0x1148, 0x080c, 0x94a8, 0x6044, 0xd0dc, 0x0150, 0xc0dc, 0x6046,
-	0x700a, 0x7042, 0x704c, 0x9c06, 0x190c, 0x0d7d, 0x080c, 0x9505,
-	0x010e, 0x1919, 0x00ee, 0x002e, 0x001e, 0x015e, 0x0005, 0x2001,
-	0x0382, 0x2004, 0x9084, 0x0007, 0x9086, 0x0003, 0x0005, 0x0126,
-	0x2091, 0x2400, 0x7808, 0xd0a4, 0x190c, 0x0d76, 0xd09c, 0x0128,
-	0x7820, 0x908c, 0xf000, 0x11b8, 0x0012, 0x012e, 0x0005, 0xa807,
-	0xa845, 0xa86c, 0xa8a3, 0xa8b3, 0xa8c4, 0xa8d3, 0xa8e1, 0xa90e,
-	0xa912, 0xa807, 0xa807, 0xa807, 0xa807, 0xa807, 0xa807, 0x080c,
-	0x0d7d, 0x012e, 0x0005, 0x2060, 0x6044, 0xd0bc, 0x0140, 0xc0bc,
-	0x6046, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7d, 0x0012, 0x012e,
-	0x0005, 0xa82c, 0xa82e, 0xa82c, 0xa834, 0xa82c, 0xa82c, 0xa82c,
-	0xa82c, 0xa82c, 0xa82e, 0xa82c, 0xa82e, 0xa82c, 0xa82e, 0xa82c,
-	0xa82c, 0xa82c, 0xa82e, 0xa82c, 0x080c, 0x0d7d, 0x2009, 0x0013,
-	0x080c, 0xab77, 0x012e, 0x0005, 0x6014, 0x2048, 0xa87c, 0xd0dc,
-	0x0130, 0x080c, 0x878b, 0x080c, 0xaad8, 0x012e, 0x0005, 0x2009,
-	0x0049, 0x080c, 0xab77, 0x012e, 0x0005, 0x080c, 0xa781, 0x2001,
-	0x1a0a, 0x2003, 0x0000, 0x7030, 0x9065, 0x090c, 0x0d7d, 0x7034,
-	0x9092, 0x00c8, 0x1258, 0x8000, 0x7036, 0x7004, 0x9086, 0x0003,
-	0x0110, 0x7007, 0x0000, 0x781f, 0x0808, 0x0040, 0x080c, 0xe5b0,
-	0x6003, 0x0001, 0x2009, 0x0014, 0x080c, 0xab77, 0x781f, 0x0100,
-	0x080c, 0xa79d, 0x012e, 0x0005, 0x080c, 0xa781, 0x714c, 0x81ff,
-	0x1128, 0x2011, 0x1a0d, 0x2013, 0x0000, 0x0438, 0x2061, 0x0100,
-	0x7150, 0x9192, 0x7530, 0x12f0, 0x8108, 0x7152, 0x714c, 0x9188,
-	0x0008, 0x210c, 0x918e, 0x0006, 0x1138, 0x6014, 0x9084, 0x1984,
-	0x9085, 0x0012, 0x6016, 0x0088, 0x714c, 0x9188, 0x0008, 0x210c,
-	0x918e, 0x0009, 0x0d90, 0x6014, 0x9084, 0x1984, 0x9085, 0x0016,
-	0x6016, 0x0018, 0x706c, 0xc085, 0x706e, 0x781f, 0x0200, 0x080c,
-	0xa79d, 0x012e, 0x0005, 0x080c, 0xa781, 0x714c, 0x2160, 0x6003,
-	0x0003, 0x2009, 0x004a, 0x080c, 0xab77, 0x781f, 0x0200, 0x080c,
-	0xa79d, 0x012e, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x2060,
-	0x6003, 0x0003, 0x080c, 0xa781, 0x080c, 0x1d3c, 0x781f, 0x0400,
-	0x080c, 0xa79d, 0x012e, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820,
-	0x2060, 0x080c, 0xa781, 0x080c, 0x1d84, 0x781f, 0x0400, 0x080c,
-	0xa79d, 0x012e, 0x0005, 0x7030, 0x9065, 0x0148, 0x6044, 0xc0bc,
-	0x6046, 0x7104, 0x9186, 0x0003, 0x0110, 0x080c, 0x956b, 0x012e,
-	0x0005, 0x00f6, 0x703c, 0x9086, 0x0002, 0x0528, 0x704c, 0x907d,
-	0x0510, 0x7844, 0xc0bc, 0x7846, 0x7820, 0x9086, 0x0009, 0x0118,
-	0x080c, 0x9c24, 0x00c0, 0x7828, 0xd0fc, 0x1118, 0x080c, 0x9ba3,
-	0x0090, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028, 0x1130, 0x2001,
-	0x197c, 0x2004, 0x9086, 0xaaaa, 0x1120, 0x2001, 0x0387, 0x2003,
-	0x1000, 0x080c, 0x9b28, 0x00fe, 0x012e, 0x0005, 0x080c, 0x7485,
-	0x012e, 0x0005, 0x080c, 0x0d7d, 0x0005, 0x00e6, 0x2071, 0x19e5,
-	0x6044, 0xc0bc, 0x6046, 0xd0fc, 0x01b8, 0x704c, 0x9c06, 0x1190,
-	0x2019, 0x0001, 0x080c, 0x9fef, 0x704f, 0x0000, 0x2001, 0x0109,
-	0x2004, 0xd08c, 0x1138, 0x2001, 0x0108, 0x2004, 0xd0bc, 0x1110,
-	0x703f, 0x0000, 0x080c, 0xa239, 0x00ee, 0x0005, 0x0026, 0x7010,
-	0x9c06, 0x1178, 0x080c, 0xa0f9, 0x6044, 0xc0fc, 0x6046, 0x600c,
-	0x9015, 0x0120, 0x7212, 0x600f, 0x0000, 0x0010, 0x7212, 0x720e,
-	0x9006, 0x002e, 0x0005, 0x0026, 0x7020, 0x9c06, 0x1178, 0x080c,
-	0xa0f9, 0x6044, 0xc0fc, 0x6046, 0x600c, 0x9015, 0x0120, 0x7222,
-	0x600f, 0x0000, 0x0010, 0x7222, 0x721e, 0x9006, 0x002e, 0x0005,
-	0x00d6, 0x0036, 0x7830, 0x9c06, 0x1558, 0x2069, 0x0100, 0x68c0,
-	0x9005, 0x01f8, 0x080c, 0x85c0, 0x080c, 0x9d09, 0x68c3, 0x0000,
-	0x080c, 0xa223, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138,
-	0x2001, 0x0100, 0x080c, 0x29d1, 0x9006, 0x080c, 0x29d1, 0x2069,
-	0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x9085, 0x0001,
-	0x0038, 0x7808, 0xc0ad, 0x780a, 0x6003, 0x0009, 0x630a, 0x9006,
-	0x003e, 0x00de, 0x0005, 0x0016, 0x0026, 0x0036, 0x6100, 0x2019,
-	0x0100, 0x2001, 0x0382, 0x2004, 0xd09c, 0x0190, 0x00c6, 0x0126,
-	0x2091, 0x2800, 0x0016, 0x0036, 0x080c, 0xa7e7, 0x003e, 0x001e,
-	0x012e, 0x00ce, 0x6200, 0x2200, 0x9106, 0x0d58, 0x2200, 0x0010,
-	0x8319, 0x1d38, 0x003e, 0x002e, 0x001e, 0x0005, 0x00d6, 0x0156,
-	0x080c, 0x99b4, 0x7a14, 0x82ff, 0x0138, 0x7003, 0x0100, 0x700b,
-	0x0003, 0x60c3, 0x0008, 0x0490, 0x7003, 0x0200, 0x7007, 0x0000,
-	0x2069, 0x1800, 0x901e, 0x6800, 0x9086, 0x0004, 0x1110, 0xc38d,
-	0x0060, 0x080c, 0x73e4, 0x1110, 0xc3ad, 0x0008, 0xc3a5, 0x6adc,
-	0xd29c, 0x1110, 0xd2ac, 0x0108, 0xc39d, 0x730e, 0x080c, 0x8685,
-	0x20a9, 0x0006, 0x2011, 0xfff4, 0x2019, 0xfff5, 0x2071, 0x0250,
-	0x2305, 0x2072, 0x8e70, 0x2205, 0x2072, 0x8e70, 0x9398, 0x0002,
-	0x9290, 0x0002, 0x1f04, 0xa9e8, 0x60c3, 0x0020, 0x080c, 0x9cd9,
-	0x015e, 0x00de, 0x0005, 0x0156, 0x080c, 0x99b4, 0x7a14, 0x82ff,
-	0x0168, 0x9286, 0xffff, 0x0118, 0x9282, 0x000e, 0x1238, 0x7003,
-	0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x0488, 0x7003, 0x0200,
-	0x7007, 0x001c, 0x700f, 0x0001, 0x2011, 0x19bb, 0x2204, 0x8007,
-	0x701a, 0x8210, 0x2204, 0x8007, 0x701e, 0x0421, 0x1120, 0xb8a0,
-	0x9082, 0x007f, 0x0248, 0x2001, 0x181f, 0x2004, 0x7022, 0x2001,
-	0x1820, 0x2004, 0x7026, 0x0030, 0x2001, 0x1818, 0x2004, 0x9084,
-	0x00ff, 0x7026, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805,
-	0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x60c3, 0x001c, 0x015e,
-	0x0804, 0x9cd9, 0x0006, 0x2001, 0x1837, 0x2004, 0xd0ac, 0x000e,
-	0x0005, 0x2011, 0x0003, 0x080c, 0xa0a6, 0x2011, 0x0002, 0x080c,
-	0xa0b0, 0x080c, 0x9f6f, 0x0036, 0x901e, 0x080c, 0x9fef, 0x003e,
-	0x0005, 0x080c, 0x332d, 0x0188, 0x0016, 0x00b6, 0x00c6, 0x7010,
-	0x9085, 0x0020, 0x7012, 0x2009, 0x007e, 0x080c, 0x652d, 0xb85c,
-	0xc0ac, 0xb85e, 0x00ce, 0x00be, 0x001e, 0x0005, 0x2071, 0x188d,
-	0x7000, 0x9005, 0x0140, 0x2001, 0x0812, 0x2071, 0x1800, 0x7076,
-	0x707a, 0x706b, 0xffd4, 0x2071, 0x1800, 0x7074, 0x7056, 0x705b,
-	0x1ddc, 0x0005, 0x00e6, 0x0126, 0x2071, 0x1800, 0x2091, 0x8000,
-	0x7554, 0x9582, 0x0010, 0x0608, 0x7058, 0x2060, 0x6000, 0x9086,
-	0x0000, 0x0148, 0x9ce0, 0x001c, 0x7068, 0x9c02, 0x1208, 0x0cb0,
-	0x2061, 0x1ddc, 0x0c98, 0x6003, 0x0008, 0x8529, 0x7556, 0x9ca8,
-	0x001c, 0x7068, 0x9502, 0x1230, 0x755a, 0x9085, 0x0001, 0x012e,
-	0x00ee, 0x0005, 0x705b, 0x1ddc, 0x0cc0, 0x9006, 0x0cc0, 0x00e6,
-	0x2071, 0x1800, 0x7554, 0x9582, 0x0010, 0x0600, 0x7058, 0x2060,
-	0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x001c, 0x7068, 0x9c02,
-	0x1208, 0x0cb0, 0x2061, 0x1ddc, 0x0c98, 0x6003, 0x0008, 0x8529,
-	0x7556, 0x9ca8, 0x001c, 0x7068, 0x9502, 0x1228, 0x755a, 0x9085,
-	0x0001, 0x00ee, 0x0005, 0x705b, 0x1ddc, 0x0cc8, 0x9006, 0x0cc8,
-	0x9c82, 0x1ddc, 0x0a0c, 0x0d7d, 0x2001, 0x181a, 0x2004, 0x9c02,
-	0x1a0c, 0x0d7d, 0x9006, 0x6006, 0x600a, 0x600e, 0x6016, 0x601a,
-	0x6012, 0x6023, 0x0000, 0x6003, 0x0000, 0x601e, 0x605e, 0x6062,
-	0x6026, 0x602a, 0x602e, 0x6032, 0x6036, 0x603a, 0x603e, 0x604a,
-	0x602a, 0x6046, 0x6042, 0x2061, 0x1800, 0x6054, 0x8000, 0x6056,
-	0x0005, 0x9006, 0x600e, 0x6016, 0x601a, 0x6012, 0x6022, 0x6002,
-	0x601e, 0x605e, 0x6062, 0x604a, 0x6046, 0x2061, 0x1800, 0x6054,
-	0x8000, 0x6056, 0x0005, 0x0006, 0x6000, 0x9086, 0x0000, 0x01d0,
-	0x601c, 0xd084, 0x190c, 0x1a53, 0x6023, 0x0007, 0x2001, 0x1984,
-	0x2004, 0x0006, 0x9082, 0x0051, 0x000e, 0x0208, 0x8004, 0x601a,
-	0x080c, 0xe3e7, 0x604b, 0x0000, 0x6044, 0xd0fc, 0x1129, 0x9006,
-	0x6046, 0x6016, 0x000e, 0x0005, 0x080c, 0xa7df, 0x0106, 0x190c,
-	0xa781, 0x2001, 0x19f8, 0x2004, 0x9c06, 0x1130, 0x0036, 0x2019,
-	0x0001, 0x080c, 0x9fef, 0x003e, 0x080c, 0xa239, 0x010e, 0x190c,
-	0xa79d, 0x0005, 0x00e6, 0x0126, 0x2071, 0x1800, 0x2091, 0x8000,
-	0x7554, 0x9582, 0x0001, 0x0608, 0x7058, 0x2060, 0x6000, 0x9086,
-	0x0000, 0x0148, 0x9ce0, 0x001c, 0x7068, 0x9c02, 0x1208, 0x0cb0,
-	0x2061, 0x1ddc, 0x0c98, 0x6003, 0x0008, 0x8529, 0x7556, 0x9ca8,
-	0x001c, 0x7068, 0x9502, 0x1230, 0x755a, 0x9085, 0x0001, 0x012e,
-	0x00ee, 0x0005, 0x705b, 0x1ddc, 0x0cc0, 0x9006, 0x0cc0, 0x6020,
-	0x9084, 0x000f, 0x0002, 0xab8b, 0xab95, 0xabb0, 0xabcb, 0xce7f,
-	0xce9c, 0xceb7, 0xab8b, 0xab95, 0x8e64, 0xabe7, 0xab8b, 0xab8b,
-	0xab8b, 0xab8b, 0xab8b, 0x9186, 0x0013, 0x1130, 0x6044, 0xd0fc,
-	0x0110, 0x080c, 0x94a8, 0x0005, 0x0005, 0x0066, 0x6000, 0x90b2,
-	0x0016, 0x1a0c, 0x0d7d, 0x0013, 0x006e, 0x0005, 0xabae, 0xb30c,
-	0xb4e7, 0xabae, 0xb57d, 0xaeb0, 0xabae, 0xabae, 0xb28e, 0xbae5,
-	0xabae, 0xabae, 0xabae, 0xabae, 0xabae, 0xabae, 0x080c, 0x0d7d,
+	0x600f, 0x0000, 0x080c, 0xca18, 0x1158, 0x080c, 0x3215, 0x080c,
+	0xca29, 0x11f0, 0x080c, 0xb591, 0x00d8, 0x080c, 0xa314, 0x08c0,
+	0x080c, 0xca29, 0x1118, 0x080c, 0xb591, 0x0090, 0x6014, 0x2048,
+	0x080c, 0xc812, 0x0168, 0x6020, 0x9086, 0x0003, 0x1508, 0xa867,
+	0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6d64, 0x080c, 0xca03,
+	0x080c, 0xcca0, 0x080c, 0xac04, 0x080c, 0xa1ea, 0x00ce, 0x0804,
+	0xa376, 0x2c78, 0x600c, 0x2060, 0x0804, 0xa376, 0x012e, 0x000e,
+	0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, 0x0005,
+	0x6020, 0x9086, 0x0006, 0x1d20, 0x080c, 0xe241, 0x0c08, 0x00d6,
+	0x080c, 0x9ab9, 0x7003, 0x0200, 0x7007, 0x0014, 0x60c3, 0x0014,
+	0x20e1, 0x0001, 0x2099, 0x1989, 0x20e9, 0x0000, 0x20a1, 0x0250,
+	0x20a9, 0x0004, 0x4003, 0x7023, 0x0004, 0x7027, 0x7878, 0x080c,
+	0x9dde, 0x00de, 0x0005, 0x080c, 0x9ab9, 0x700b, 0x0800, 0x7814,
+	0x9084, 0xff00, 0x700e, 0x7814, 0x9084, 0x00ff, 0x7022, 0x782c,
+	0x7026, 0x7860, 0x9084, 0x00ff, 0x9085, 0x0200, 0x7002, 0x7860,
+	0x9084, 0xff00, 0x8007, 0x7006, 0x60c2, 0x0804, 0x9dde, 0x00b6,
+	0x00d6, 0x0016, 0x00d6, 0x2f68, 0x2009, 0x0035, 0x080c, 0xcea6,
+	0x00de, 0x1904, 0xa4a4, 0x080c, 0x9a6e, 0x7003, 0x1300, 0x782c,
+	0x080c, 0xa5af, 0x2068, 0x6820, 0x9086, 0x0003, 0x0560, 0x7810,
+	0x2058, 0xbaa0, 0x080c, 0xab33, 0x11d8, 0x9286, 0x007e, 0x1128,
+	0x700b, 0x00ff, 0x700f, 0xfffe, 0x0498, 0x9286, 0x007f, 0x1128,
+	0x700b, 0x00ff, 0x700f, 0xfffd, 0x0458, 0x9284, 0xff80, 0x0180,
+	0x9286, 0x0080, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffc, 0x0400,
+	0x92d8, 0x1000, 0x2b5c, 0xb810, 0x700a, 0xb814, 0x700e, 0x00c0,
+	0xb884, 0x700e, 0x00a8, 0x080c, 0xab33, 0x1130, 0x7810, 0x2058,
+	0xb8a0, 0x9082, 0x007e, 0x0250, 0x00d6, 0x2069, 0x181f, 0x2d04,
+	0x700a, 0x8d68, 0x2d04, 0x700e, 0x00de, 0x0010, 0x6034, 0x700e,
+	0x7838, 0x7012, 0x783c, 0x7016, 0x60c3, 0x000c, 0x001e, 0x00de,
+	0x080c, 0x9dde, 0x00be, 0x0005, 0x781b, 0x0001, 0x7803, 0x0006,
+	0x001e, 0x00de, 0x00be, 0x0005, 0x792c, 0x9180, 0x0008, 0x200c,
+	0x9186, 0x0006, 0x01c0, 0x9186, 0x0003, 0x0904, 0xa522, 0x9186,
+	0x0005, 0x0904, 0xa50a, 0x9186, 0x0004, 0x05f0, 0x9186, 0x0008,
+	0x0904, 0xa513, 0x7807, 0x0037, 0x782f, 0x0003, 0x7817, 0x1700,
+	0x080c, 0xa58c, 0x0005, 0x080c, 0xa54d, 0x00d6, 0x0026, 0x792c,
+	0x2168, 0x2009, 0x4000, 0x6800, 0x6a44, 0xd2fc, 0x11f8, 0x0002,
+	0xa4eb, 0xa4f6, 0xa4ed, 0xa4f6, 0xa4f2, 0xa4eb, 0xa4eb, 0xa4f6,
+	0xa4f6, 0xa4f6, 0xa4f6, 0xa4eb, 0xa4eb, 0xa4eb, 0xa4eb, 0xa4eb,
+	0xa4f6, 0xa4eb, 0xa4f6, 0x080c, 0x0d7d, 0x6824, 0xd0e4, 0x0110,
+	0xd0cc, 0x0110, 0x900e, 0x0010, 0x2009, 0x2000, 0x682c, 0x7022,
+	0x6830, 0x7026, 0x0804, 0xa546, 0x080c, 0xa54d, 0x00d6, 0x0026,
+	0x792c, 0x2168, 0x2009, 0x4000, 0x6a00, 0x9286, 0x0002, 0x1108,
+	0x900e, 0x04e0, 0x080c, 0xa54d, 0x00d6, 0x0026, 0x792c, 0x2168,
+	0x2009, 0x4000, 0x0498, 0x04c9, 0x00d6, 0x0026, 0x792c, 0x2168,
+	0x2009, 0x4000, 0x9286, 0x0005, 0x0118, 0x9286, 0x0002, 0x1108,
+	0x900e, 0x0420, 0x0451, 0x00d6, 0x0026, 0x792c, 0x2168, 0x6814,
+	0x0096, 0x2048, 0xa9ac, 0xa834, 0x9112, 0xa9b0, 0xa838, 0x009e,
+	0x9103, 0x7022, 0x7226, 0x792c, 0x9180, 0x0011, 0x2004, 0xd0fc,
+	0x1148, 0x9180, 0x0000, 0x2004, 0x908e, 0x0002, 0x0130, 0x908e,
+	0x0004, 0x0118, 0x2009, 0x4000, 0x0008, 0x900e, 0x712a, 0x60c3,
+	0x0018, 0x002e, 0x00de, 0x0804, 0x9dde, 0x00b6, 0x0036, 0x0046,
+	0x0056, 0x0066, 0x080c, 0x9ab9, 0x9006, 0x7003, 0x0200, 0x7938,
+	0x710a, 0x793c, 0x710e, 0x7810, 0x2058, 0xb8a0, 0x080c, 0xab33,
+	0x1118, 0x9092, 0x007e, 0x0268, 0x00d6, 0x2069, 0x181f, 0x2d2c,
+	0x8d68, 0x2d34, 0x90d8, 0x1000, 0x2b5c, 0xbb10, 0xbc14, 0x00de,
+	0x0028, 0x901e, 0xbc84, 0x2029, 0x0000, 0x6634, 0x782c, 0x9080,
+	0x0008, 0x2004, 0x9086, 0x0003, 0x1128, 0x7512, 0x7616, 0x731a,
+	0x741e, 0x0020, 0x7312, 0x7416, 0x751a, 0x761e, 0x006e, 0x005e,
+	0x004e, 0x003e, 0x00be, 0x0005, 0x080c, 0x9ab9, 0x7003, 0x0100,
+	0x782c, 0x700a, 0x7814, 0x700e, 0x700e, 0x60c3, 0x0008, 0x0804,
+	0x9dde, 0x080c, 0x9a65, 0x7003, 0x1400, 0x7838, 0x700a, 0x0079,
+	0x783c, 0x700e, 0x782c, 0x7012, 0x7830, 0x7016, 0x7834, 0x9084,
+	0x00ff, 0x8007, 0x701a, 0x60c3, 0x0010, 0x0804, 0x9dde, 0x00e6,
+	0x2071, 0x0240, 0x0006, 0x00f6, 0x2078, 0x7810, 0x00b6, 0x2058,
+	0xb8d4, 0xd084, 0x0120, 0x7850, 0x702a, 0x784c, 0x702e, 0x00be,
+	0x00fe, 0x000e, 0x00ee, 0x0005, 0x080c, 0x9ab0, 0x7003, 0x0100,
+	0x782c, 0x700a, 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9dde,
+	0x00a9, 0x7914, 0x712a, 0x60c3, 0x0000, 0x60a7, 0x9575, 0x0026,
+	0x080c, 0x2979, 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012,
+	0x002e, 0x080c, 0x9e01, 0x080c, 0x86bc, 0x0005, 0x0036, 0x0096,
+	0x00d6, 0x00e6, 0x7860, 0x2048, 0xaa7c, 0x9296, 0x00c0, 0x9294,
+	0xfffd, 0xaa7e, 0xaa80, 0x9294, 0x0300, 0xaa82, 0xa96c, 0x9194,
+	0x00ff, 0xab74, 0x9384, 0x00ff, 0x908d, 0xc200, 0xa96e, 0x9384,
+	0xff00, 0x9215, 0xaa76, 0xa870, 0xaa78, 0xa87a, 0xaa72, 0x00d6,
+	0x2069, 0x0200, 0x080c, 0xa66c, 0x00de, 0x20e9, 0x0000, 0x20a1,
+	0x0240, 0x20a9, 0x000a, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b,
+	0x2098, 0x4003, 0x60a3, 0x0035, 0xaa68, 0x9294, 0x7000, 0x9286,
+	0x3000, 0x0110, 0x60a3, 0x0037, 0x00ee, 0x00de, 0x009e, 0x003e,
+	0x0005, 0x900e, 0x7814, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x01c0,
+	0x9084, 0x0003, 0x11a8, 0x2001, 0x180c, 0x2004, 0xd0bc, 0x0180,
+	0x7824, 0xd0cc, 0x1168, 0xd0c4, 0x1158, 0xa8a8, 0x9005, 0x1140,
+	0x2001, 0x180c, 0x200c, 0xc1d5, 0x2102, 0x2009, 0x19b2, 0x210c,
+	0x009e, 0x918d, 0x0092, 0x0010, 0x2009, 0x0096, 0x60ab, 0x0036,
+	0x0026, 0x2110, 0x900e, 0x080c, 0x2a53, 0x002e, 0x0005, 0x2009,
+	0x0009, 0x00a0, 0x2009, 0x000a, 0x0088, 0x2009, 0x000b, 0x0070,
+	0x2009, 0x000c, 0x0058, 0x2009, 0x000d, 0x0040, 0x2009, 0x000e,
+	0x0028, 0x2009, 0x000f, 0x0010, 0x2009, 0x0008, 0x6912, 0x0005,
+	0x080c, 0x9a6e, 0x0016, 0x0026, 0x0096, 0x00d6, 0x7814, 0x2048,
+	0x7013, 0x0138, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028, 0x1138,
+	0x2001, 0x197c, 0x2004, 0x9086, 0xaaaa, 0x1904, 0xa711, 0x7003,
+	0x5400, 0x00c6, 0x2061, 0x1800, 0x607c, 0x9084, 0x00ff, 0xa998,
+	0x810f, 0x918c, 0xff00, 0x9105, 0x700a, 0x6080, 0x700e, 0xa998,
+	0x918c, 0xff00, 0x7112, 0x20a9, 0x0004, 0x2009, 0x1805, 0x2e10,
+	0x9290, 0x0006, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xa6a2,
+	0x20a9, 0x0004, 0x2009, 0x1801, 0x2104, 0x2012, 0x8108, 0x8210,
+	0x1f04, 0xa6ac, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0029, 0x2098,
+	0x2009, 0x0006, 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, 0x8210,
+	0x8109, 0x1dc0, 0x00d6, 0x2069, 0x0200, 0x080c, 0xa657, 0x00de,
+	0x2071, 0x0240, 0x2011, 0x0240, 0x2009, 0x0002, 0x20a9, 0x0001,
+	0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0x2009, 0x0008,
+	0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0,
+	0xa85c, 0x9080, 0x0031, 0x2098, 0x2009, 0x0008, 0x20a9, 0x0001,
+	0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0x00ce, 0x60c3,
+	0x004c, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x2001, 0x1837, 0x2004,
+	0x9084, 0x0028, 0x1168, 0x080c, 0x74d5, 0x0150, 0x6028, 0xc0bd,
+	0x602a, 0x2009, 0x1804, 0x2011, 0x0029, 0x080c, 0x2a53, 0x0010,
+	0x080c, 0x9dde, 0x080c, 0x86bc, 0x00de, 0x009e, 0x002e, 0x001e,
+	0x0005, 0x00e6, 0x2071, 0x0240, 0x2001, 0x2200, 0x9085, 0x00ff,
+	0x7002, 0x7007, 0xffff, 0x2071, 0x0100, 0x709b, 0x00ff, 0x00ee,
+	0x0804, 0xa687, 0x080c, 0x9a6e, 0x0016, 0x0026, 0x0096, 0x00d6,
+	0x7814, 0x2048, 0x7013, 0x0138, 0x7003, 0x5500, 0x00c6, 0xa89c,
+	0x9084, 0x00ff, 0xa998, 0x810f, 0x918c, 0xff00, 0x9105, 0x700a,
+	0xa99c, 0x918c, 0xff00, 0xa8a0, 0x9084, 0x00ff, 0x9105, 0x700e,
+	0xa998, 0x918c, 0xff00, 0x2061, 0x1800, 0x607c, 0x9084, 0x00ff,
+	0x910d, 0x7112, 0x6180, 0x7116, 0x2009, 0x0008, 0xa860, 0x20e0,
+	0xa85c, 0x9080, 0x0029, 0x2098, 0x2e10, 0x9290, 0x0006, 0x20a9,
+	0x0001, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0x20a9,
+	0x0004, 0x2009, 0x1805, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04,
+	0xa763, 0x20a9, 0x0002, 0x2009, 0x1801, 0x2104, 0x2012, 0x8108,
+	0x8210, 0x1f04, 0xa76d, 0x00d6, 0x0016, 0x2069, 0x0200, 0x080c,
+	0xa657, 0x001e, 0x00de, 0x2071, 0x0240, 0x20a9, 0x0002, 0x2009,
+	0x1803, 0x2011, 0x0240, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04,
+	0xa783, 0x2009, 0x0008, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109,
+	0x1dd0, 0x9006, 0x20a9, 0x0008, 0x2012, 0x8210, 0x1f04, 0xa794,
+	0x00ce, 0x60c3, 0x004c, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c,
+	0x9dde, 0x080c, 0x86bc, 0x00de, 0x009e, 0x002e, 0x001e, 0x0005,
+	0x00d6, 0x9290, 0x0018, 0x8214, 0x20e9, 0x0000, 0x2069, 0x0200,
+	0x6813, 0x0000, 0x22a8, 0x9284, 0x00e0, 0x0128, 0x20a9, 0x0020,
+	0x9292, 0x0020, 0x0008, 0x9016, 0x20a1, 0x0240, 0x9006, 0x4004,
+	0x82ff, 0x0120, 0x6810, 0x8000, 0x6812, 0x0c60, 0x00de, 0x0005,
+	0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x00a6, 0x0096, 0x0066, 0x0126,
+	0x2091, 0x8000, 0x2071, 0x19e7, 0x7610, 0x2660, 0x2678, 0x8cff,
+	0x0904, 0xa84f, 0x7030, 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0,
+	0x9005, 0x0904, 0xa826, 0x080c, 0x9e0e, 0x68c3, 0x0000, 0x080c,
+	0xa314, 0x7033, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384,
+	0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2a0a, 0x9006, 0x080c,
+	0x2a0a, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001,
+	0x003e, 0x7010, 0x9c36, 0x1110, 0x660c, 0x7612, 0x700c, 0x9c36,
+	0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x700e, 0x0010, 0x700f,
+	0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008,
+	0x2678, 0x600f, 0x0000, 0x080c, 0xca18, 0x1158, 0x080c, 0x3215,
+	0x080c, 0xca29, 0x11f0, 0x080c, 0xb591, 0x00d8, 0x080c, 0xa314,
+	0x08c0, 0x080c, 0xca29, 0x1118, 0x080c, 0xb591, 0x0090, 0x6014,
+	0x2048, 0x080c, 0xc812, 0x0168, 0x6020, 0x9086, 0x0003, 0x1520,
+	0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6d70, 0x080c,
+	0xca03, 0x080c, 0xcca0, 0x080c, 0xac04, 0x080c, 0xa1ea, 0x00ce,
+	0x0804, 0xa7d7, 0x2c78, 0x600c, 0x2060, 0x0804, 0xa7d7, 0x7013,
+	0x0000, 0x700f, 0x0000, 0x012e, 0x006e, 0x009e, 0x00ae, 0x00ce,
+	0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020, 0x9086, 0x0006, 0x1d08,
+	0x080c, 0xe241, 0x08f0, 0x00f6, 0x0036, 0x2079, 0x0380, 0x7b18,
+	0xd3bc, 0x1de8, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x003e,
+	0x00fe, 0x0005, 0x0016, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007,
+	0x9086, 0x0001, 0x1188, 0x2001, 0x0015, 0x0c29, 0x2009, 0x1000,
+	0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, 0x0003, 0x0120,
+	0x8109, 0x1db0, 0x080c, 0x0d7d, 0x001e, 0x0005, 0x2001, 0x0382,
+	0x2004, 0x9084, 0x0007, 0x9086, 0x0003, 0x1120, 0x2001, 0x0380,
+	0x2003, 0x0001, 0x0005, 0x0156, 0x0016, 0x0026, 0x00e6, 0x900e,
+	0x2071, 0x19e7, 0x0469, 0x0106, 0x0190, 0x7004, 0x9086, 0x0003,
+	0x0148, 0x20a9, 0x1000, 0x6044, 0xd0fc, 0x01d8, 0x1f04, 0xa8ab,
+	0x080c, 0x0d7d, 0x080c, 0xa872, 0x6044, 0xd0fc, 0x0190, 0x7030,
+	0x9c06, 0x1148, 0x080c, 0x95ad, 0x6044, 0xd0dc, 0x0150, 0xc0dc,
+	0x6046, 0x700a, 0x7042, 0x704c, 0x9c06, 0x190c, 0x0d7d, 0x080c,
+	0x960a, 0x010e, 0x1919, 0x00ee, 0x002e, 0x001e, 0x015e, 0x0005,
+	0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, 0x0003, 0x0005,
+	0x0126, 0x2091, 0x2400, 0x7808, 0xd0a4, 0x190c, 0x0d76, 0xd09c,
+	0x0128, 0x7820, 0x908c, 0xf000, 0x11b8, 0x0012, 0x012e, 0x0005,
+	0xa8f8, 0xa936, 0xa95d, 0xa994, 0xa9a4, 0xa9b5, 0xa9c4, 0xa9d2,
+	0xa9ff, 0xaa03, 0xa8f8, 0xa8f8, 0xa8f8, 0xa8f8, 0xa8f8, 0xa8f8,
+	0x080c, 0x0d7d, 0x012e, 0x0005, 0x2060, 0x6044, 0xd0bc, 0x0140,
+	0xc0bc, 0x6046, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7d, 0x0012,
+	0x012e, 0x0005, 0xa91d, 0xa91f, 0xa91d, 0xa925, 0xa91d, 0xa91d,
+	0xa91d, 0xa91d, 0xa91d, 0xa91f, 0xa91d, 0xa91f, 0xa91d, 0xa91f,
+	0xa91d, 0xa91d, 0xa91d, 0xa91f, 0xa91d, 0x080c, 0x0d7d, 0x2009,
+	0x0013, 0x080c, 0xac68, 0x012e, 0x0005, 0x6014, 0x2048, 0xa87c,
+	0xd0dc, 0x0130, 0x080c, 0x8890, 0x080c, 0xabc9, 0x012e, 0x0005,
+	0x2009, 0x0049, 0x080c, 0xac68, 0x012e, 0x0005, 0x080c, 0xa872,
+	0x2001, 0x1a0c, 0x2003, 0x0000, 0x7030, 0x9065, 0x090c, 0x0d7d,
+	0x7034, 0x9092, 0x00c8, 0x1258, 0x8000, 0x7036, 0x7004, 0x9086,
+	0x0003, 0x0110, 0x7007, 0x0000, 0x781f, 0x0808, 0x0040, 0x080c,
+	0xe6ec, 0x6003, 0x0001, 0x2009, 0x0014, 0x080c, 0xac68, 0x781f,
+	0x0100, 0x080c, 0xa88e, 0x012e, 0x0005, 0x080c, 0xa872, 0x714c,
+	0x81ff, 0x1128, 0x2011, 0x1a0f, 0x2013, 0x0000, 0x0438, 0x2061,
+	0x0100, 0x7150, 0x9192, 0x7530, 0x12f0, 0x8108, 0x7152, 0x714c,
+	0x9188, 0x0008, 0x210c, 0x918e, 0x0006, 0x1138, 0x6014, 0x9084,
+	0x1984, 0x9085, 0x0012, 0x6016, 0x0088, 0x714c, 0x9188, 0x0008,
+	0x210c, 0x918e, 0x0009, 0x0d90, 0x6014, 0x9084, 0x1984, 0x9085,
+	0x0016, 0x6016, 0x0018, 0x706c, 0xc085, 0x706e, 0x781f, 0x0200,
+	0x080c, 0xa88e, 0x012e, 0x0005, 0x080c, 0xa872, 0x714c, 0x2160,
+	0x6003, 0x0003, 0x2009, 0x004a, 0x080c, 0xac68, 0x781f, 0x0200,
+	0x080c, 0xa88e, 0x012e, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820,
+	0x2060, 0x6003, 0x0003, 0x080c, 0xa872, 0x080c, 0x1d60, 0x781f,
+	0x0400, 0x080c, 0xa88e, 0x012e, 0x0005, 0x7808, 0xd09c, 0x0de8,
+	0x7820, 0x2060, 0x080c, 0xa872, 0x080c, 0x1da8, 0x781f, 0x0400,
+	0x080c, 0xa88e, 0x012e, 0x0005, 0x7030, 0x9065, 0x0148, 0x6044,
+	0xc0bc, 0x6046, 0x7104, 0x9186, 0x0003, 0x0110, 0x080c, 0x9670,
+	0x012e, 0x0005, 0x00f6, 0x703c, 0x9086, 0x0002, 0x0528, 0x704c,
+	0x907d, 0x0510, 0x7844, 0xc0bc, 0x7846, 0x7820, 0x9086, 0x0009,
+	0x0118, 0x080c, 0x9d29, 0x00c0, 0x7828, 0xd0fc, 0x1118, 0x080c,
+	0x9ca8, 0x0090, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028, 0x1130,
+	0x2001, 0x197c, 0x2004, 0x9086, 0xaaaa, 0x1120, 0x2001, 0x0387,
+	0x2003, 0x1000, 0x080c, 0x9c2d, 0x00fe, 0x012e, 0x0005, 0x080c,
+	0x7576, 0x012e, 0x0005, 0x080c, 0x0d7d, 0x0005, 0x00e6, 0x2071,
+	0x19e7, 0x6044, 0xc0bc, 0x6046, 0xd0fc, 0x01b8, 0x704c, 0x9c06,
+	0x1190, 0x2019, 0x0001, 0x080c, 0xa0f4, 0x704f, 0x0000, 0x2001,
+	0x0109, 0x2004, 0xd08c, 0x1138, 0x2001, 0x0108, 0x2004, 0xd0bc,
+	0x1110, 0x703f, 0x0000, 0x080c, 0xa32a, 0x00ee, 0x0005, 0x0026,
+	0x7010, 0x9c06, 0x1178, 0x080c, 0xa1ea, 0x6044, 0xc0fc, 0x6046,
+	0x600c, 0x9015, 0x0120, 0x7212, 0x600f, 0x0000, 0x0010, 0x7212,
+	0x720e, 0x9006, 0x002e, 0x0005, 0x0026, 0x7020, 0x9c06, 0x1178,
+	0x080c, 0xa1ea, 0x6044, 0xc0fc, 0x6046, 0x600c, 0x9015, 0x0120,
+	0x7222, 0x600f, 0x0000, 0x0010, 0x7222, 0x721e, 0x9006, 0x002e,
+	0x0005, 0x00d6, 0x0036, 0x7830, 0x9c06, 0x1558, 0x2069, 0x0100,
+	0x68c0, 0x9005, 0x01f8, 0x080c, 0x86c5, 0x080c, 0x9e0e, 0x68c3,
+	0x0000, 0x080c, 0xa314, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000,
+	0x0138, 0x2001, 0x0100, 0x080c, 0x2a0a, 0x9006, 0x080c, 0x2a0a,
+	0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x9085,
+	0x0001, 0x0038, 0x7808, 0xc0ad, 0x780a, 0x6003, 0x0009, 0x630a,
+	0x9006, 0x003e, 0x00de, 0x0005, 0x0016, 0x0026, 0x0036, 0x6100,
+	0x2019, 0x0100, 0x2001, 0x0382, 0x2004, 0xd09c, 0x0190, 0x00c6,
+	0x0126, 0x2091, 0x2800, 0x0016, 0x0036, 0x080c, 0xa8d8, 0x003e,
+	0x001e, 0x012e, 0x00ce, 0x6200, 0x2200, 0x9106, 0x0d58, 0x2200,
+	0x0010, 0x8319, 0x1d38, 0x003e, 0x002e, 0x001e, 0x0005, 0x00d6,
+	0x0156, 0x080c, 0x9ab9, 0x7a14, 0x82ff, 0x0138, 0x7003, 0x0100,
+	0x700b, 0x0003, 0x60c3, 0x0008, 0x0490, 0x7003, 0x0200, 0x7007,
+	0x0000, 0x2069, 0x1800, 0x901e, 0x6800, 0x9086, 0x0004, 0x1110,
+	0xc38d, 0x0060, 0x080c, 0x74d5, 0x1110, 0xc3ad, 0x0008, 0xc3a5,
+	0x6adc, 0xd29c, 0x1110, 0xd2ac, 0x0108, 0xc39d, 0x730e, 0x080c,
+	0x878a, 0x20a9, 0x0006, 0x2011, 0xfff4, 0x2019, 0xfff5, 0x2071,
+	0x0250, 0x2305, 0x2072, 0x8e70, 0x2205, 0x2072, 0x8e70, 0x9398,
+	0x0002, 0x9290, 0x0002, 0x1f04, 0xaad9, 0x60c3, 0x0020, 0x080c,
+	0x9dde, 0x015e, 0x00de, 0x0005, 0x0156, 0x080c, 0x9ab9, 0x7a14,
+	0x82ff, 0x0168, 0x9286, 0xffff, 0x0118, 0x9282, 0x000e, 0x1238,
+	0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x0488, 0x7003,
+	0x0200, 0x7007, 0x001c, 0x700f, 0x0001, 0x2011, 0x19bd, 0x2204,
+	0x8007, 0x701a, 0x8210, 0x2204, 0x8007, 0x701e, 0x0421, 0x1120,
+	0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, 0x181f, 0x2004, 0x7022,
+	0x2001, 0x1820, 0x2004, 0x7026, 0x0030, 0x2001, 0x1818, 0x2004,
+	0x9084, 0x00ff, 0x7026, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099,
+	0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x60c3, 0x001c,
+	0x015e, 0x0804, 0x9dde, 0x0006, 0x2001, 0x1837, 0x2004, 0xd0ac,
+	0x000e, 0x0005, 0x2011, 0x0003, 0x080c, 0xa1ab, 0x2011, 0x0002,
+	0x080c, 0xa1b5, 0x080c, 0xa074, 0x0036, 0x901e, 0x080c, 0xa0f4,
+	0x003e, 0x0005, 0x080c, 0x3366, 0x0188, 0x0016, 0x00b6, 0x00c6,
+	0x7010, 0x9085, 0x0020, 0x7012, 0x2009, 0x007e, 0x080c, 0x661e,
+	0xb85c, 0xc0ac, 0xb85e, 0x00ce, 0x00be, 0x001e, 0x0005, 0x2071,
+	0x188d, 0x7000, 0x9005, 0x0140, 0x2001, 0x0812, 0x2071, 0x1800,
+	0x7076, 0x707a, 0x706b, 0xffd4, 0x2071, 0x1800, 0x7074, 0x7056,
+	0x705b, 0x1ddc, 0x0005, 0x00e6, 0x0126, 0x2071, 0x1800, 0x2091,
+	0x8000, 0x7554, 0x9582, 0x0010, 0x0608, 0x7058, 0x2060, 0x6000,
+	0x9086, 0x0000, 0x0148, 0x9ce0, 0x001c, 0x7068, 0x9c02, 0x1208,
+	0x0cb0, 0x2061, 0x1ddc, 0x0c98, 0x6003, 0x0008, 0x8529, 0x7556,
+	0x9ca8, 0x001c, 0x7068, 0x9502, 0x1230, 0x755a, 0x9085, 0x0001,
+	0x012e, 0x00ee, 0x0005, 0x705b, 0x1ddc, 0x0cc0, 0x9006, 0x0cc0,
+	0x00e6, 0x2071, 0x1800, 0x7554, 0x9582, 0x0010, 0x0600, 0x7058,
+	0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x001c, 0x7068,
+	0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1ddc, 0x0c98, 0x6003, 0x0008,
+	0x8529, 0x7556, 0x9ca8, 0x001c, 0x7068, 0x9502, 0x1228, 0x755a,
+	0x9085, 0x0001, 0x00ee, 0x0005, 0x705b, 0x1ddc, 0x0cc8, 0x9006,
+	0x0cc8, 0x9c82, 0x1ddc, 0x0a0c, 0x0d7d, 0x2001, 0x181a, 0x2004,
+	0x9c02, 0x1a0c, 0x0d7d, 0x9006, 0x6006, 0x600a, 0x600e, 0x6016,
+	0x601a, 0x6012, 0x6023, 0x0000, 0x6003, 0x0000, 0x601e, 0x605e,
+	0x6062, 0x6026, 0x602a, 0x602e, 0x6032, 0x6036, 0x603a, 0x603e,
+	0x604a, 0x602a, 0x6046, 0x6042, 0x2061, 0x1800, 0x6054, 0x8000,
+	0x6056, 0x0005, 0x9006, 0x600e, 0x6016, 0x601a, 0x6012, 0x6022,
+	0x6002, 0x601e, 0x605e, 0x6062, 0x604a, 0x6046, 0x2061, 0x1800,
+	0x6054, 0x8000, 0x6056, 0x0005, 0x0006, 0x6000, 0x9086, 0x0000,
+	0x01d0, 0x601c, 0xd084, 0x190c, 0x1a6a, 0x6023, 0x0007, 0x2001,
+	0x1986, 0x2004, 0x0006, 0x9082, 0x0051, 0x000e, 0x0208, 0x8004,
+	0x601a, 0x080c, 0xe4f9, 0x604b, 0x0000, 0x6044, 0xd0fc, 0x1129,
+	0x9006, 0x6046, 0x6016, 0x000e, 0x0005, 0x080c, 0xa8d0, 0x0106,
+	0x190c, 0xa872, 0x2001, 0x19fa, 0x2004, 0x9c06, 0x1130, 0x0036,
+	0x2019, 0x0001, 0x080c, 0xa0f4, 0x003e, 0x080c, 0xa32a, 0x010e,
+	0x190c, 0xa88e, 0x0005, 0x00e6, 0x0126, 0x2071, 0x1800, 0x2091,
+	0x8000, 0x7554, 0x9582, 0x0001, 0x0608, 0x7058, 0x2060, 0x6000,
+	0x9086, 0x0000, 0x0148, 0x9ce0, 0x001c, 0x7068, 0x9c02, 0x1208,
+	0x0cb0, 0x2061, 0x1ddc, 0x0c98, 0x6003, 0x0008, 0x8529, 0x7556,
+	0x9ca8, 0x001c, 0x7068, 0x9502, 0x1230, 0x755a, 0x9085, 0x0001,
+	0x012e, 0x00ee, 0x0005, 0x705b, 0x1ddc, 0x0cc0, 0x9006, 0x0cc0,
+	0x6020, 0x9084, 0x000f, 0x0002, 0xac7c, 0xac86, 0xaca1, 0xacbc,
+	0xcf78, 0xcf95, 0xcfb0, 0xac7c, 0xac86, 0x8f69, 0xacd8, 0xac7c,
+	0xac7c, 0xac7c, 0xac7c, 0xac7c, 0x9186, 0x0013, 0x1130, 0x6044,
+	0xd0fc, 0x0110, 0x080c, 0x95ad, 0x0005, 0x0005, 0x0066, 0x6000,
+	0x90b2, 0x0016, 0x1a0c, 0x0d7d, 0x0013, 0x006e, 0x0005, 0xac9f,
+	0xb3fd, 0xb5d8, 0xac9f, 0xb66e, 0xafa1, 0xac9f, 0xac9f, 0xb37f,
+	0xbbd6, 0xac9f, 0xac9f, 0xac9f, 0xac9f, 0xac9f, 0xac9f, 0x080c,
+	0x0d7d, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d7d, 0x0013,
+	0x006e, 0x0005, 0xacba, 0xc1e1, 0xacba, 0xacba, 0xacba, 0xacba,
+	0xacba, 0xacba, 0xc186, 0xc364, 0xacba, 0xc21e, 0xc2a2, 0xc21e,
+	0xc2a2, 0xacba, 0x080c, 0x0d7d, 0x6000, 0x9082, 0x0016, 0x1a0c,
+	0x0d7d, 0x6000, 0x0002, 0xacd6, 0xbc20, 0xbcb7, 0xbe37, 0xbea6,
+	0xacd6, 0xacd6, 0xacd6, 0xbbef, 0xc107, 0xc10a, 0xacd6, 0xacd6,
+	0xacd6, 0xacd6, 0xc13a, 0xacd6, 0xacd6, 0xacd6, 0x080c, 0x0d7d,
 	0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d7d, 0x0013, 0x006e,
-	0x0005, 0xabc9, 0xc0f0, 0xabc9, 0xabc9, 0xabc9, 0xabc9, 0xabc9,
-	0xabc9, 0xc095, 0xc273, 0xabc9, 0xc12d, 0xc1b1, 0xc12d, 0xc1b1,
-	0xabc9, 0x080c, 0x0d7d, 0x6000, 0x9082, 0x0016, 0x1a0c, 0x0d7d,
-	0x6000, 0x0002, 0xabe5, 0xbb2f, 0xbbc6, 0xbd46, 0xbdb5, 0xabe5,
-	0xabe5, 0xabe5, 0xbafe, 0xc016, 0xc019, 0xabe5, 0xabe5, 0xabe5,
-	0xabe5, 0xc049, 0xabe5, 0xabe5, 0xabe5, 0x080c, 0x0d7d, 0x0066,
-	0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d7d, 0x0013, 0x006e, 0x0005,
-	0xac00, 0xac00, 0xac3e, 0xacdd, 0xad5d, 0xac00, 0xac00, 0xac00,
-	0xac02, 0xac00, 0xac00, 0xac00, 0xac00, 0xac00, 0xac00, 0xac00,
-	0x080c, 0x0d7d, 0x9186, 0x004c, 0x0560, 0x9186, 0x0003, 0x190c,
-	0x0d7d, 0x0096, 0x601c, 0xc0ed, 0x601e, 0x6003, 0x0003, 0x6106,
-	0x6014, 0x2048, 0xa87c, 0x9084, 0xa000, 0xc0b5, 0xa87e, 0xa8ac,
-	0xa836, 0xa8b0, 0xa83a, 0x9006, 0xa846, 0xa84a, 0xa884, 0x9092,
-	0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x8013, 0x8213, 0x9210,
-	0x621a, 0x009e, 0x080c, 0x1ba3, 0x2009, 0x8030, 0x080c, 0x912f,
-	0x0005, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x080c,
-	0xad7f, 0x080c, 0xce4d, 0x6003, 0x0007, 0x0005, 0x00d6, 0x0096,
-	0x00f6, 0x2079, 0x1800, 0x7a90, 0x6014, 0x2048, 0xa87c, 0xd0ec,
-	0x1110, 0x9290, 0x0018, 0xac78, 0xc4fc, 0x0046, 0xa8e0, 0x9005,
-	0x1140, 0xa8dc, 0x921a, 0x0140, 0x0220, 0xa87b, 0x0007, 0x2010,
-	0x0028, 0xa87b, 0x0015, 0x0010, 0xa87b, 0x0000, 0x8214, 0xa883,
-	0x0000, 0xaa02, 0x0006, 0x0016, 0x0026, 0x00c6, 0x00d6, 0x00e6,
-	0x00f6, 0x2400, 0x9005, 0x1108, 0x009a, 0x2100, 0x9086, 0x0015,
-	0x1118, 0x2001, 0x0001, 0x0038, 0x2100, 0x9086, 0x0016, 0x0118,
-	0x2001, 0x0001, 0x002a, 0x94a4, 0x0007, 0x8423, 0x9405, 0x0002,
-	0xaca5, 0xaca5, 0xaca0, 0xaca3, 0xaca5, 0xac9d, 0xac90, 0xac90,
-	0xac90, 0xac90, 0xac90, 0xac90, 0xac90, 0xac90, 0xac90, 0xac90,
-	0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x000e, 0x004e,
-	0x00fe, 0x009e, 0x00de, 0x080c, 0x0d7d, 0x080c, 0xb73a, 0x0028,
-	0x080c, 0xb81f, 0x0010, 0x080c, 0xb915, 0x00fe, 0x00ee, 0x00de,
-	0x00ce, 0x002e, 0x001e, 0x2c00, 0xa896, 0x000e, 0x080c, 0xae3d,
-	0x0530, 0xa804, 0xa80e, 0x00a6, 0x2050, 0xb100, 0x00ae, 0x8006,
+	0x0005, 0xacf1, 0xacf1, 0xad2f, 0xadce, 0xae4e, 0xacf1, 0xacf1,
+	0xacf1, 0xacf3, 0xacf1, 0xacf1, 0xacf1, 0xacf1, 0xacf1, 0xacf1,
+	0xacf1, 0x080c, 0x0d7d, 0x9186, 0x004c, 0x0560, 0x9186, 0x0003,
+	0x190c, 0x0d7d, 0x0096, 0x601c, 0xc0ed, 0x601e, 0x6003, 0x0003,
+	0x6106, 0x6014, 0x2048, 0xa87c, 0x9084, 0xa000, 0xc0b5, 0xa87e,
+	0xa8ac, 0xa836, 0xa8b0, 0xa83a, 0x9006, 0xa846, 0xa84a, 0xa884,
+	0x9092, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x8013, 0x8213,
+	0x9210, 0x621a, 0x009e, 0x080c, 0x1bba, 0x2009, 0x8030, 0x080c,
+	0x9234, 0x0005, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00,
+	0x080c, 0xae70, 0x080c, 0xcf46, 0x6003, 0x0007, 0x0005, 0x00d6,
+	0x0096, 0x00f6, 0x2079, 0x1800, 0x7a90, 0x6014, 0x2048, 0xa87c,
+	0xd0ec, 0x1110, 0x9290, 0x0018, 0xac78, 0xc4fc, 0x0046, 0xa8e0,
+	0x9005, 0x1140, 0xa8dc, 0x921a, 0x0140, 0x0220, 0xa87b, 0x0007,
+	0x2010, 0x0028, 0xa87b, 0x0015, 0x0010, 0xa87b, 0x0000, 0x8214,
+	0xa883, 0x0000, 0xaa02, 0x0006, 0x0016, 0x0026, 0x00c6, 0x00d6,
+	0x00e6, 0x00f6, 0x2400, 0x9005, 0x1108, 0x009a, 0x2100, 0x9086,
+	0x0015, 0x1118, 0x2001, 0x0001, 0x0038, 0x2100, 0x9086, 0x0016,
+	0x0118, 0x2001, 0x0001, 0x002a, 0x94a4, 0x0007, 0x8423, 0x9405,
+	0x0002, 0xad96, 0xad96, 0xad91, 0xad94, 0xad96, 0xad8e, 0xad81,
+	0xad81, 0xad81, 0xad81, 0xad81, 0xad81, 0xad81, 0xad81, 0xad81,
+	0xad81, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x000e,
+	0x004e, 0x00fe, 0x009e, 0x00de, 0x080c, 0x0d7d, 0x080c, 0xb82b,
+	0x0028, 0x080c, 0xb910, 0x0010, 0x080c, 0xba06, 0x00fe, 0x00ee,
+	0x00de, 0x00ce, 0x002e, 0x001e, 0x2c00, 0xa896, 0x000e, 0x080c,
+	0xaf2e, 0x0530, 0xa804, 0xa80e, 0x00a6, 0x2050, 0xb100, 0x00ae,
+	0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080,
+	0x0002, 0xaacc, 0xabd0, 0xacd4, 0xadd8, 0x2031, 0x0000, 0x2041,
+	0x1298, 0x080c, 0xb0ee, 0x0160, 0x000e, 0x9005, 0x0120, 0x00fe,
+	0x009e, 0x00de, 0x0005, 0x00fe, 0x009e, 0x00de, 0x0804, 0xabc9,
+	0x2001, 0x002c, 0x900e, 0x080c, 0xaf94, 0x0c70, 0x91b6, 0x0015,
+	0x0170, 0x91b6, 0x0016, 0x0158, 0x91b2, 0x0047, 0x0a0c, 0x0d7d,
+	0x91b2, 0x0050, 0x1a0c, 0x0d7d, 0x9182, 0x0047, 0x0042, 0x080c,
+	0xaa84, 0x0120, 0x9086, 0x0002, 0x0904, 0xad2f, 0x0005, 0xadf0,
+	0xadf0, 0xadf2, 0xae24, 0xadf0, 0xadf0, 0xadf0, 0xadf0, 0xae37,
+	0x080c, 0x0d7d, 0x00d6, 0x0016, 0x0096, 0x6003, 0x0004, 0x6114,
+	0x2148, 0xa87c, 0xd0fc, 0x01c0, 0xa878, 0xc0fc, 0x9005, 0x1158,
+	0xa894, 0x9005, 0x0140, 0x2001, 0x0000, 0x900e, 0x080c, 0xaf94,
+	0x080c, 0xabc9, 0x00a8, 0x6003, 0x0002, 0xa8a4, 0xa9a8, 0x9105,
+	0x1178, 0xa8ae, 0xa8b2, 0x0c78, 0xa87f, 0x0020, 0xa88c, 0xa88a,
+	0xa8a4, 0xa8ae, 0xa8a8, 0xa8b2, 0xa8c7, 0x0000, 0xa8cb, 0x0000,
+	0x009e, 0x001e, 0x00de, 0x0005, 0x080c, 0x960a, 0x00d6, 0x0096,
+	0x6114, 0x2148, 0x080c, 0xc814, 0x0120, 0xa87b, 0x0006, 0x080c,
+	0x6d70, 0x009e, 0x00de, 0x080c, 0xabc9, 0x0804, 0x966f, 0x080c,
+	0x960a, 0x080c, 0x31e4, 0x080c, 0xcf43, 0x00d6, 0x0096, 0x6114,
+	0x2148, 0x080c, 0xc814, 0x0120, 0xa87b, 0x0029, 0x080c, 0x6d70,
+	0x009e, 0x00de, 0x080c, 0xabc9, 0x0804, 0x966f, 0x9182, 0x0047,
+	0x0002, 0xae5e, 0xae60, 0xae5e, 0xae5e, 0xae5e, 0xae5e, 0xae5e,
+	0xae5e, 0xae5e, 0xae5e, 0xae5e, 0xae5e, 0xae60, 0x080c, 0x0d7d,
+	0x00d6, 0x0096, 0x601f, 0x0000, 0x6114, 0x2148, 0xa87b, 0x0000,
+	0xa883, 0x0000, 0x080c, 0x6d70, 0x009e, 0x00de, 0x0804, 0xabc9,
+	0x0026, 0x0036, 0x0056, 0x0066, 0x0096, 0x00a6, 0x00f6, 0x0006,
+	0x080c, 0x103a, 0x000e, 0x090c, 0x0d7d, 0xa960, 0x21e8, 0xa95c,
+	0x9188, 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, 0xa87a,
+	0x2079, 0x1800, 0x7990, 0x9188, 0x0018, 0x918c, 0x0fff, 0xa972,
+	0xac76, 0x2950, 0x00a6, 0x2001, 0x0205, 0x2003, 0x0000, 0x901e,
+	0x2029, 0x0001, 0x9182, 0x0034, 0x1228, 0x2011, 0x001f, 0x080c,
+	0xc3e7, 0x04c0, 0x2130, 0x2009, 0x0034, 0x2011, 0x001f, 0x080c,
+	0xc3e7, 0x96b2, 0x0034, 0xb004, 0x904d, 0x0110, 0x080c, 0x0fec,
+	0x080c, 0x103a, 0x01d0, 0x8528, 0xa867, 0x0110, 0xa86b, 0x0000,
+	0x2920, 0xb406, 0x968a, 0x003d, 0x1230, 0x2608, 0x2011, 0x001b,
+	0x080c, 0xc3e7, 0x00b8, 0x96b2, 0x003c, 0x2009, 0x003c, 0x2950,
+	0x2011, 0x001b, 0x080c, 0xc3e7, 0x0c18, 0x2001, 0x0205, 0x2003,
+	0x0000, 0x00ae, 0x852f, 0x95ad, 0x0050, 0xb566, 0xb070, 0xc0fd,
+	0xb072, 0x0048, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f,
+	0x95ad, 0x0050, 0xb566, 0x2a48, 0xa804, 0xa807, 0x0000, 0x0006,
+	0x080c, 0x6d70, 0x000e, 0x2048, 0x9005, 0x1db0, 0x00fe, 0x00ae,
+	0x009e, 0x006e, 0x005e, 0x003e, 0x002e, 0x0005, 0x00d6, 0x00f6,
+	0x0096, 0x0006, 0x080c, 0x103a, 0x000e, 0x090c, 0x0d7d, 0xa960,
+	0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020,
+	0x4104, 0xaa66, 0xa87a, 0x2079, 0x1800, 0x7990, 0x810c, 0x9188,
+	0x000c, 0x9182, 0x001a, 0x0210, 0x2009, 0x001a, 0x21a8, 0x810b,
+	0xa972, 0xac76, 0x2e98, 0xa85c, 0x9080, 0x001f, 0x20a0, 0x2001,
+	0x0205, 0x200c, 0x918d, 0x0080, 0x2102, 0x4003, 0x2003, 0x0000,
+	0x080c, 0x6d70, 0x009e, 0x00fe, 0x00de, 0x0005, 0x0016, 0x00d6,
+	0x00f6, 0x0096, 0x0016, 0x2001, 0x0205, 0x200c, 0x918d, 0x0080,
+	0x2102, 0x001e, 0x2079, 0x0200, 0x2e98, 0xa87c, 0xd0ec, 0x0118,
+	0x9e80, 0x000c, 0x2098, 0x2021, 0x003e, 0x901e, 0x9282, 0x0020,
+	0x0218, 0x2011, 0x0020, 0x2018, 0x9486, 0x003e, 0x1170, 0x0096,
+	0x080c, 0x103a, 0x2900, 0x009e, 0x05c0, 0xa806, 0x2048, 0xa860,
+	0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x3300, 0x908e, 0x0260,
+	0x0140, 0x2009, 0x0280, 0x9102, 0x920a, 0x0218, 0x2010, 0x2100,
+	0x9318, 0x2200, 0x9402, 0x1228, 0x2400, 0x9202, 0x2410, 0x9318,
+	0x9006, 0x2020, 0x22a8, 0xa800, 0x9200, 0xa802, 0x20e1, 0x0000,
+	0x4003, 0x83ff, 0x0180, 0x3300, 0x9086, 0x0280, 0x1130, 0x7814,
+	0x8000, 0x9085, 0x0080, 0x7816, 0x2e98, 0x2310, 0x84ff, 0x0904,
+	0xaf43, 0x0804, 0xaf45, 0x9085, 0x0001, 0x7817, 0x0000, 0x009e,
+	0x00fe, 0x00de, 0x001e, 0x0005, 0x00d6, 0x0036, 0x0096, 0x6314,
+	0x2348, 0xa87a, 0xa982, 0x080c, 0x6d64, 0x009e, 0x003e, 0x00de,
+	0x0005, 0x91b6, 0x0015, 0x1118, 0x080c, 0xabc9, 0x0030, 0x91b6,
+	0x0016, 0x190c, 0x0d7d, 0x080c, 0xabc9, 0x0005, 0x20a9, 0x000e,
+	0x20e1, 0x0000, 0x2e98, 0x6014, 0x0096, 0x2048, 0xa860, 0x20e8,
+	0xa85c, 0x20a0, 0x009e, 0x4003, 0x0136, 0x9080, 0x001b, 0x2011,
+	0x0006, 0x20a9, 0x0001, 0x3418, 0x8318, 0x23a0, 0x4003, 0x3318,
+	0x8318, 0x2398, 0x8211, 0x1db8, 0x2011, 0x0006, 0x013e, 0x20a0,
+	0x3318, 0x8318, 0x2398, 0x4003, 0x3418, 0x8318, 0x23a0, 0x8211,
+	0x1db8, 0x0096, 0x080c, 0xc814, 0x0130, 0x6014, 0x2048, 0xa807,
+	0x0000, 0xa867, 0x0103, 0x009e, 0x0804, 0xabc9, 0x0096, 0x00d6,
+	0x0036, 0x7330, 0x9386, 0x0200, 0x11a8, 0x6010, 0x00b6, 0x2058,
+	0xb8d7, 0x0000, 0x00be, 0x6014, 0x9005, 0x0130, 0x2048, 0xa807,
+	0x0000, 0xa867, 0x0103, 0xab32, 0x080c, 0xabc9, 0x003e, 0x00de,
+	0x009e, 0x0005, 0x0011, 0x1d48, 0x0cc8, 0x0006, 0x0016, 0x080c,
+	0xcf2e, 0x0188, 0x6014, 0x9005, 0x1170, 0x600b, 0x0003, 0x601b,
+	0x0000, 0x604b, 0x0000, 0x2009, 0x0022, 0x080c, 0xb3d5, 0x9006,
+	0x001e, 0x000e, 0x0005, 0x9085, 0x0001, 0x0cd0, 0x0096, 0x0016,
+	0x20a9, 0x0014, 0x9e80, 0x000c, 0x20e1, 0x0000, 0x2098, 0x6014,
+	0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003,
+	0x2001, 0x0205, 0x2003, 0x0001, 0x2099, 0x0260, 0x20a9, 0x0016,
+	0x4003, 0x20a9, 0x000a, 0xa804, 0x2048, 0xa860, 0x20e8, 0xa85c,
+	0x9080, 0x0002, 0x20a0, 0x4003, 0x2001, 0x0205, 0x2003, 0x0002,
+	0x2099, 0x0260, 0x20a9, 0x0020, 0x4003, 0x2003, 0x0000, 0x6014,
+	0x2048, 0xa800, 0x2048, 0xa867, 0x0103, 0x080c, 0xabc9, 0x001e,
+	0x009e, 0x0005, 0x0096, 0x0016, 0x900e, 0x7030, 0x9086, 0x0100,
+	0x0140, 0x7038, 0x9084, 0x00ff, 0x800c, 0x703c, 0x9084, 0x00ff,
+	0x8004, 0x9080, 0x0004, 0x9108, 0x810b, 0x2011, 0x0002, 0x2019,
+	0x000c, 0x6014, 0x2048, 0x080c, 0xc3e7, 0x080c, 0xc814, 0x0140,
+	0x6014, 0x2048, 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103,
+	0x080c, 0xabc9, 0x001e, 0x009e, 0x0005, 0x0016, 0x2009, 0x0000,
+	0x7030, 0x9086, 0x0200, 0x0110, 0x2009, 0x0001, 0x0096, 0x6014,
+	0x904d, 0x090c, 0x0d7d, 0xa97a, 0x080c, 0x6d70, 0x009e, 0x080c,
+	0xabc9, 0x001e, 0x0005, 0x0016, 0x0096, 0x7030, 0x9086, 0x0100,
+	0x1118, 0x2009, 0x0004, 0x0010, 0x7034, 0x800c, 0x810b, 0x2011,
+	0x000c, 0x2019, 0x000c, 0x6014, 0x2048, 0xa804, 0x0096, 0x9005,
+	0x0108, 0x2048, 0x080c, 0xc3e7, 0x009e, 0x080c, 0xc814, 0x0148,
+	0xa804, 0x9005, 0x1158, 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867,
+	0x0103, 0x080c, 0xabc9, 0x009e, 0x001e, 0x0005, 0x0086, 0x2040,
+	0xa030, 0x8007, 0x9086, 0x0100, 0x1118, 0x080c, 0xb591, 0x00e0,
+	0xa034, 0x8007, 0x800c, 0x8806, 0x8006, 0x8007, 0x90bc, 0x003f,
+	0x9084, 0xffc0, 0x9080, 0x000c, 0xa87b, 0x0000, 0xa883, 0x0000,
+	0xa897, 0x4000, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000,
+	0x2041, 0x127e, 0x0019, 0x0d08, 0x008e, 0x0898, 0x0096, 0x0006,
+	0x080c, 0x103a, 0x000e, 0x01b0, 0xa8ab, 0x0dcb, 0xa876, 0x000e,
+	0xa8a2, 0x0006, 0xae6a, 0x2800, 0xa89e, 0xa97a, 0xaf72, 0xaa8e,
+	0xab92, 0xac96, 0xad9a, 0x0086, 0x2940, 0x080c, 0x1124, 0x008e,
+	0x9085, 0x0001, 0x009e, 0x0005, 0x00e6, 0x00d6, 0x0026, 0x7008,
+	0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, 0xba10, 0x00be, 0x9206,
+	0x1520, 0x700c, 0x6210, 0x00b6, 0x2258, 0xba14, 0x00be, 0x9206,
+	0x11e0, 0x604b, 0x0000, 0x2c68, 0x0016, 0x2009, 0x0035, 0x080c,
+	0xcea6, 0x001e, 0x1158, 0x622c, 0x2268, 0x2071, 0x026c, 0x6b20,
+	0x9386, 0x0003, 0x0130, 0x9386, 0x0006, 0x0128, 0x080c, 0xabc9,
+	0x0020, 0x0039, 0x0010, 0x080c, 0xb20a, 0x002e, 0x00de, 0x00ee,
+	0x0005, 0x0096, 0x6814, 0x2048, 0x9186, 0x0015, 0x0904, 0xb1e9,
+	0x918e, 0x0016, 0x1904, 0xb208, 0x700c, 0x908c, 0xff00, 0x9186,
+	0x1700, 0x0120, 0x9186, 0x0300, 0x1904, 0xb1c3, 0x89ff, 0x1138,
+	0x6800, 0x9086, 0x000f, 0x0904, 0xb1a5, 0x0804, 0xb206, 0x6808,
+	0x9086, 0xffff, 0x1904, 0xb1eb, 0xa87c, 0x9084, 0x0060, 0x9086,
+	0x0020, 0x1128, 0xa83c, 0xa940, 0x9105, 0x1904, 0xb1eb, 0x6824,
+	0xd0b4, 0x1904, 0xb1eb, 0x080c, 0xca03, 0x6864, 0xa882, 0xa87c,
+	0xc0dc, 0xc0f4, 0xc0d4, 0xa87e, 0x0026, 0x900e, 0x6a18, 0x2001,
+	0x000a, 0x080c, 0x9135, 0xa884, 0x920a, 0x0208, 0x8011, 0xaa86,
+	0x82ff, 0x002e, 0x1138, 0x00c6, 0x2d60, 0x080c, 0xc53a, 0x00ce,
+	0x0804, 0xb206, 0x00c6, 0xa868, 0xd0fc, 0x1118, 0x080c, 0x60b4,
+	0x0010, 0x080c, 0x64b8, 0x00ce, 0x1904, 0xb1eb, 0x00c6, 0x2d60,
+	0x080c, 0xabc9, 0x00ce, 0x0804, 0xb206, 0x00c6, 0x080c, 0xac3b,
+	0x0198, 0x6017, 0x0000, 0x6810, 0x6012, 0x080c, 0xcca8, 0x6023,
+	0x0003, 0x6904, 0x00c6, 0x2d60, 0x080c, 0xabc9, 0x00ce, 0x080c,
+	0xac68, 0x00ce, 0x0804, 0xb206, 0x2001, 0x1988, 0x2004, 0x684a,
+	0x00ce, 0x0804, 0xb206, 0x7008, 0x9086, 0x000b, 0x11c8, 0x6010,
+	0x00b6, 0x2058, 0xb900, 0xc1bc, 0xb902, 0x00be, 0x00c6, 0x2d60,
+	0xa87b, 0x0003, 0x080c, 0xcee8, 0x6007, 0x0085, 0x6003, 0x000b,
+	0x6023, 0x0002, 0x2009, 0x8020, 0x080c, 0x91ed, 0x00ce, 0x0430,
+	0x700c, 0x9086, 0x2a00, 0x1138, 0x2001, 0x1988, 0x2004, 0x684a,
+	0x00e8, 0x04c1, 0x00e8, 0x89ff, 0x090c, 0x0d7d, 0x00c6, 0x00d6,
+	0x2d60, 0xa867, 0x0103, 0xa87b, 0x0003, 0x080c, 0x6b86, 0x080c,
+	0xca03, 0x080c, 0xac04, 0x0026, 0x6010, 0x00b6, 0x2058, 0xba3c,
+	0x080c, 0x6749, 0x00be, 0x002e, 0x00de, 0x00ce, 0x080c, 0xabc9,
+	0x009e, 0x0005, 0x9186, 0x0015, 0x1128, 0x2001, 0x1988, 0x2004,
+	0x684a, 0x0068, 0x918e, 0x0016, 0x1160, 0x00c6, 0x2d00, 0x2060,
+	0x080c, 0xe4f9, 0x080c, 0x8890, 0x080c, 0xabc9, 0x00ce, 0x080c,
+	0xabc9, 0x0005, 0x0026, 0x0036, 0x0046, 0x7228, 0xacb0, 0xabac,
+	0xd2f4, 0x0130, 0x2001, 0x1988, 0x2004, 0x684a, 0x0804, 0xb284,
+	0x00c6, 0x2d60, 0x080c, 0xc412, 0x00ce, 0x6804, 0x9086, 0x0050,
+	0x1168, 0x00c6, 0x2d00, 0x2060, 0x6003, 0x0001, 0x6007, 0x0050,
+	0x2009, 0x8023, 0x080c, 0x91ed, 0x00ce, 0x04f0, 0x6800, 0x9086,
+	0x000f, 0x01a8, 0x89ff, 0x090c, 0x0d7d, 0x6800, 0x9086, 0x0004,
+	0x1190, 0xa87c, 0xd0ac, 0x0178, 0xa843, 0x0fff, 0xa83f, 0x0fff,
+	0xa880, 0xc0fc, 0xa882, 0x2001, 0x0001, 0x6832, 0x0400, 0x2001,
+	0x0007, 0x6832, 0x00e0, 0xa87c, 0xd0b4, 0x1150, 0xd0ac, 0x0db8,
+	0x6824, 0xd0f4, 0x1d48, 0xa838, 0xa934, 0x9105, 0x0d80, 0x0c20,
+	0xd2ec, 0x1d68, 0x7024, 0x9306, 0x1118, 0x7020, 0x9406, 0x0d38,
+	0x7020, 0x683e, 0x7024, 0x683a, 0x2001, 0x0005, 0x6832, 0x080c,
+	0xcb92, 0x080c, 0x966f, 0x0010, 0x080c, 0xabc9, 0x004e, 0x003e,
+	0x002e, 0x0005, 0x00e6, 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff,
+	0x6210, 0x00b6, 0x2258, 0xba10, 0x00be, 0x9206, 0x1904, 0xb2ef,
+	0x700c, 0x6210, 0x00b6, 0x2258, 0xba14, 0x00be, 0x9206, 0x1904,
+	0xb2ef, 0x6038, 0x2068, 0x6824, 0xc0dc, 0x6826, 0x6a20, 0x9286,
+	0x0007, 0x0904, 0xb2ef, 0x9286, 0x0002, 0x0904, 0xb2ef, 0x9286,
+	0x0000, 0x05e8, 0x6808, 0x633c, 0x9306, 0x15c8, 0x2071, 0x026c,
+	0x9186, 0x0015, 0x0570, 0x918e, 0x0016, 0x1100, 0x00c6, 0x6038,
+	0x2060, 0x6104, 0x9186, 0x004b, 0x01c0, 0x9186, 0x004c, 0x01a8,
+	0x9186, 0x004d, 0x0190, 0x9186, 0x004e, 0x0178, 0x9186, 0x0052,
+	0x0160, 0x6014, 0x0096, 0x2048, 0x080c, 0xc814, 0x090c, 0x0d7d,
+	0xa87b, 0x0003, 0x009e, 0x080c, 0xcee8, 0x6007, 0x0085, 0x6003,
+	0x000b, 0x6023, 0x0002, 0x2009, 0x8020, 0x080c, 0x91ed, 0x00ce,
+	0x0030, 0x6038, 0x2070, 0x2001, 0x1988, 0x2004, 0x704a, 0x080c,
+	0xabc9, 0x002e, 0x00de, 0x00ee, 0x0005, 0x00b6, 0x0096, 0x00f6,
+	0x6014, 0x2048, 0x6010, 0x2058, 0x91b6, 0x0015, 0x0130, 0xba08,
+	0xbb0c, 0xbc00, 0xc48c, 0xbc02, 0x0460, 0x0096, 0x0156, 0x0036,
+	0x0026, 0x2b48, 0x9e90, 0x0010, 0x2019, 0x000a, 0x20a9, 0x0004,
+	0x080c, 0xbb9e, 0x002e, 0x003e, 0x015e, 0x009e, 0x1904, 0xb35e,
+	0x0096, 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, 0x0014, 0x2019,
+	0x0006, 0x20a9, 0x0004, 0x080c, 0xbb9e, 0x002e, 0x003e, 0x015e,
+	0x009e, 0x15a0, 0x7238, 0xba0a, 0x733c, 0xbb0e, 0xbc00, 0xc48d,
+	0xbc02, 0xa804, 0x9005, 0x1128, 0x00fe, 0x009e, 0x00be, 0x0804,
+	0xafd9, 0x0096, 0x2048, 0xaa12, 0xab16, 0xac0a, 0x009e, 0x8006,
 	0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002,
-	0xaacc, 0xabd0, 0xacd4, 0xadd8, 0x2031, 0x0000, 0x2041, 0x128f,
-	0x080c, 0xaffd, 0x0160, 0x000e, 0x9005, 0x0120, 0x00fe, 0x009e,
-	0x00de, 0x0005, 0x00fe, 0x009e, 0x00de, 0x0804, 0xaad8, 0x2001,
-	0x002c, 0x900e, 0x080c, 0xaea3, 0x0c70, 0x91b6, 0x0015, 0x0170,
-	0x91b6, 0x0016, 0x0158, 0x91b2, 0x0047, 0x0a0c, 0x0d7d, 0x91b2,
-	0x0050, 0x1a0c, 0x0d7d, 0x9182, 0x0047, 0x0042, 0x080c, 0xa993,
-	0x0120, 0x9086, 0x0002, 0x0904, 0xac3e, 0x0005, 0xacff, 0xacff,
-	0xad01, 0xad33, 0xacff, 0xacff, 0xacff, 0xacff, 0xad46, 0x080c,
-	0x0d7d, 0x00d6, 0x0016, 0x0096, 0x6003, 0x0004, 0x6114, 0x2148,
-	0xa87c, 0xd0fc, 0x01c0, 0xa878, 0xc0fc, 0x9005, 0x1158, 0xa894,
-	0x9005, 0x0140, 0x2001, 0x0000, 0x900e, 0x080c, 0xaea3, 0x080c,
-	0xaad8, 0x00a8, 0x6003, 0x0002, 0xa8a4, 0xa9a8, 0x9105, 0x1178,
-	0xa8ae, 0xa8b2, 0x0c78, 0xa87f, 0x0020, 0xa88c, 0xa88a, 0xa8a4,
-	0xa8ae, 0xa8a8, 0xa8b2, 0xa8c7, 0x0000, 0xa8cb, 0x0000, 0x009e,
-	0x001e, 0x00de, 0x0005, 0x080c, 0x9505, 0x00d6, 0x0096, 0x6114,
-	0x2148, 0x080c, 0xc723, 0x0120, 0xa87b, 0x0006, 0x080c, 0x6c7f,
-	0x009e, 0x00de, 0x080c, 0xaad8, 0x0804, 0x956a, 0x080c, 0x9505,
-	0x080c, 0x31ab, 0x080c, 0xce4a, 0x00d6, 0x0096, 0x6114, 0x2148,
-	0x080c, 0xc723, 0x0120, 0xa87b, 0x0029, 0x080c, 0x6c7f, 0x009e,
-	0x00de, 0x080c, 0xaad8, 0x0804, 0x956a, 0x9182, 0x0047, 0x0002,
-	0xad6d, 0xad6f, 0xad6d, 0xad6d, 0xad6d, 0xad6d, 0xad6d, 0xad6d,
-	0xad6d, 0xad6d, 0xad6d, 0xad6d, 0xad6f, 0x080c, 0x0d7d, 0x00d6,
-	0x0096, 0x601f, 0x0000, 0x6114, 0x2148, 0xa87b, 0x0000, 0xa883,
-	0x0000, 0x080c, 0x6c7f, 0x009e, 0x00de, 0x0804, 0xaad8, 0x0026,
-	0x0036, 0x0056, 0x0066, 0x0096, 0x00a6, 0x00f6, 0x0006, 0x080c,
-	0x103b, 0x000e, 0x090c, 0x0d7d, 0xa960, 0x21e8, 0xa95c, 0x9188,
-	0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, 0xa87a, 0x2079,
-	0x1800, 0x7990, 0x9188, 0x0018, 0x918c, 0x0fff, 0xa972, 0xac76,
-	0x2950, 0x00a6, 0x2001, 0x0205, 0x2003, 0x0000, 0x901e, 0x2029,
-	0x0001, 0x9182, 0x0034, 0x1228, 0x2011, 0x001f, 0x080c, 0xc2f6,
-	0x04c0, 0x2130, 0x2009, 0x0034, 0x2011, 0x001f, 0x080c, 0xc2f6,
-	0x96b2, 0x0034, 0xb004, 0x904d, 0x0110, 0x080c, 0x0fed, 0x080c,
-	0x103b, 0x01d0, 0x8528, 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920,
-	0xb406, 0x968a, 0x003d, 0x1230, 0x2608, 0x2011, 0x001b, 0x080c,
-	0xc2f6, 0x00b8, 0x96b2, 0x003c, 0x2009, 0x003c, 0x2950, 0x2011,
-	0x001b, 0x080c, 0xc2f6, 0x0c18, 0x2001, 0x0205, 0x2003, 0x0000,
-	0x00ae, 0x852f, 0x95ad, 0x0050, 0xb566, 0xb070, 0xc0fd, 0xb072,
-	0x0048, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad,
-	0x0050, 0xb566, 0x2a48, 0xa804, 0xa807, 0x0000, 0x0006, 0x080c,
-	0x6c7f, 0x000e, 0x2048, 0x9005, 0x1db0, 0x00fe, 0x00ae, 0x009e,
-	0x006e, 0x005e, 0x003e, 0x002e, 0x0005, 0x00d6, 0x00f6, 0x0096,
-	0x0006, 0x080c, 0x103b, 0x000e, 0x090c, 0x0d7d, 0xa960, 0x21e8,
-	0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104,
-	0xaa66, 0xa87a, 0x2079, 0x1800, 0x7990, 0x810c, 0x9188, 0x000c,
-	0x9182, 0x001a, 0x0210, 0x2009, 0x001a, 0x21a8, 0x810b, 0xa972,
-	0xac76, 0x2e98, 0xa85c, 0x9080, 0x001f, 0x20a0, 0x2001, 0x0205,
-	0x200c, 0x918d, 0x0080, 0x2102, 0x4003, 0x2003, 0x0000, 0x080c,
-	0x6c7f, 0x009e, 0x00fe, 0x00de, 0x0005, 0x0016, 0x00d6, 0x00f6,
-	0x0096, 0x0016, 0x2001, 0x0205, 0x200c, 0x918d, 0x0080, 0x2102,
-	0x001e, 0x2079, 0x0200, 0x2e98, 0xa87c, 0xd0ec, 0x0118, 0x9e80,
-	0x000c, 0x2098, 0x2021, 0x003e, 0x901e, 0x9282, 0x0020, 0x0218,
-	0x2011, 0x0020, 0x2018, 0x9486, 0x003e, 0x1170, 0x0096, 0x080c,
-	0x103b, 0x2900, 0x009e, 0x05c0, 0xa806, 0x2048, 0xa860, 0x20e8,
-	0xa85c, 0x9080, 0x0002, 0x20a0, 0x3300, 0x908e, 0x0260, 0x0140,
-	0x2009, 0x0280, 0x9102, 0x920a, 0x0218, 0x2010, 0x2100, 0x9318,
-	0x2200, 0x9402, 0x1228, 0x2400, 0x9202, 0x2410, 0x9318, 0x9006,
-	0x2020, 0x22a8, 0xa800, 0x9200, 0xa802, 0x20e1, 0x0000, 0x4003,
-	0x83ff, 0x0180, 0x3300, 0x9086, 0x0280, 0x1130, 0x7814, 0x8000,
-	0x9085, 0x0080, 0x7816, 0x2e98, 0x2310, 0x84ff, 0x0904, 0xae52,
-	0x0804, 0xae54, 0x9085, 0x0001, 0x7817, 0x0000, 0x009e, 0x00fe,
-	0x00de, 0x001e, 0x0005, 0x00d6, 0x0036, 0x0096, 0x6314, 0x2348,
-	0xa87a, 0xa982, 0x080c, 0x6c73, 0x009e, 0x003e, 0x00de, 0x0005,
-	0x91b6, 0x0015, 0x1118, 0x080c, 0xaad8, 0x0030, 0x91b6, 0x0016,
-	0x190c, 0x0d7d, 0x080c, 0xaad8, 0x0005, 0x20a9, 0x000e, 0x20e1,
-	0x0000, 0x2e98, 0x6014, 0x0096, 0x2048, 0xa860, 0x20e8, 0xa85c,
-	0x20a0, 0x009e, 0x4003, 0x0136, 0x9080, 0x001b, 0x2011, 0x0006,
-	0x20a9, 0x0001, 0x3418, 0x8318, 0x23a0, 0x4003, 0x3318, 0x8318,
-	0x2398, 0x8211, 0x1db8, 0x2011, 0x0006, 0x013e, 0x20a0, 0x3318,
-	0x8318, 0x2398, 0x4003, 0x3418, 0x8318, 0x23a0, 0x8211, 0x1db8,
-	0x0096, 0x080c, 0xc723, 0x0130, 0x6014, 0x2048, 0xa807, 0x0000,
-	0xa867, 0x0103, 0x009e, 0x0804, 0xaad8, 0x0096, 0x00d6, 0x0036,
-	0x7330, 0x9386, 0x0200, 0x11a8, 0x6010, 0x00b6, 0x2058, 0xb8d7,
-	0x0000, 0x00be, 0x6014, 0x9005, 0x0130, 0x2048, 0xa807, 0x0000,
-	0xa867, 0x0103, 0xab32, 0x080c, 0xaad8, 0x003e, 0x00de, 0x009e,
-	0x0005, 0x0011, 0x1d48, 0x0cc8, 0x0006, 0x0016, 0x080c, 0xce35,
-	0x0188, 0x6014, 0x9005, 0x1170, 0x600b, 0x0003, 0x601b, 0x0000,
-	0x604b, 0x0000, 0x2009, 0x0022, 0x080c, 0xb2e4, 0x9006, 0x001e,
-	0x000e, 0x0005, 0x9085, 0x0001, 0x0cd0, 0x0096, 0x0016, 0x20a9,
-	0x0014, 0x9e80, 0x000c, 0x20e1, 0x0000, 0x2098, 0x6014, 0x2048,
-	0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x2001,
-	0x0205, 0x2003, 0x0001, 0x2099, 0x0260, 0x20a9, 0x0016, 0x4003,
-	0x20a9, 0x000a, 0xa804, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080,
-	0x0002, 0x20a0, 0x4003, 0x2001, 0x0205, 0x2003, 0x0002, 0x2099,
-	0x0260, 0x20a9, 0x0020, 0x4003, 0x2003, 0x0000, 0x6014, 0x2048,
-	0xa800, 0x2048, 0xa867, 0x0103, 0x080c, 0xaad8, 0x001e, 0x009e,
-	0x0005, 0x0096, 0x0016, 0x900e, 0x7030, 0x9086, 0x0100, 0x0140,
-	0x7038, 0x9084, 0x00ff, 0x800c, 0x703c, 0x9084, 0x00ff, 0x8004,
-	0x9080, 0x0004, 0x9108, 0x810b, 0x2011, 0x0002, 0x2019, 0x000c,
-	0x6014, 0x2048, 0x080c, 0xc2f6, 0x080c, 0xc723, 0x0140, 0x6014,
-	0x2048, 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c,
-	0xaad8, 0x001e, 0x009e, 0x0005, 0x0016, 0x2009, 0x0000, 0x7030,
-	0x9086, 0x0200, 0x0110, 0x2009, 0x0001, 0x0096, 0x6014, 0x904d,
-	0x090c, 0x0d7d, 0xa97a, 0x080c, 0x6c7f, 0x009e, 0x080c, 0xaad8,
-	0x001e, 0x0005, 0x0016, 0x0096, 0x7030, 0x9086, 0x0100, 0x1118,
-	0x2009, 0x0004, 0x0010, 0x7034, 0x800c, 0x810b, 0x2011, 0x000c,
-	0x2019, 0x000c, 0x6014, 0x2048, 0xa804, 0x0096, 0x9005, 0x0108,
-	0x2048, 0x080c, 0xc2f6, 0x009e, 0x080c, 0xc723, 0x0148, 0xa804,
-	0x9005, 0x1158, 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103,
-	0x080c, 0xaad8, 0x009e, 0x001e, 0x0005, 0x0086, 0x2040, 0xa030,
-	0x8007, 0x9086, 0x0100, 0x1118, 0x080c, 0xb4a0, 0x00e0, 0xa034,
-	0x8007, 0x800c, 0x8806, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084,
-	0xffc0, 0x9080, 0x000c, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897,
-	0x4000, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041,
-	0x1275, 0x0019, 0x0d08, 0x008e, 0x0898, 0x0096, 0x0006, 0x080c,
-	0x103b, 0x000e, 0x01b0, 0xa8ab, 0x0dcb, 0xa876, 0x000e, 0xa8a2,
-	0x0006, 0xae6a, 0x2800, 0xa89e, 0xa97a, 0xaf72, 0xaa8e, 0xab92,
-	0xac96, 0xad9a, 0x0086, 0x2940, 0x080c, 0x111b, 0x008e, 0x9085,
-	0x0001, 0x009e, 0x0005, 0x00e6, 0x00d6, 0x0026, 0x7008, 0x9084,
-	0x00ff, 0x6210, 0x00b6, 0x2258, 0xba10, 0x00be, 0x9206, 0x1520,
-	0x700c, 0x6210, 0x00b6, 0x2258, 0xba14, 0x00be, 0x9206, 0x11e0,
-	0x604b, 0x0000, 0x2c68, 0x0016, 0x2009, 0x0035, 0x080c, 0xcdad,
-	0x001e, 0x1158, 0x622c, 0x2268, 0x2071, 0x026c, 0x6b20, 0x9386,
-	0x0003, 0x0130, 0x9386, 0x0006, 0x0128, 0x080c, 0xaad8, 0x0020,
-	0x0039, 0x0010, 0x080c, 0xb119, 0x002e, 0x00de, 0x00ee, 0x0005,
-	0x0096, 0x6814, 0x2048, 0x9186, 0x0015, 0x0904, 0xb0f8, 0x918e,
-	0x0016, 0x1904, 0xb117, 0x700c, 0x908c, 0xff00, 0x9186, 0x1700,
-	0x0120, 0x9186, 0x0300, 0x1904, 0xb0d2, 0x89ff, 0x1138, 0x6800,
-	0x9086, 0x000f, 0x0904, 0xb0b4, 0x0804, 0xb115, 0x6808, 0x9086,
-	0xffff, 0x1904, 0xb0fa, 0xa87c, 0x9084, 0x0060, 0x9086, 0x0020,
-	0x1128, 0xa83c, 0xa940, 0x9105, 0x1904, 0xb0fa, 0x6824, 0xd0b4,
-	0x1904, 0xb0fa, 0x080c, 0xc90b, 0x6864, 0xa882, 0xa87c, 0xc0dc,
-	0xc0f4, 0xc0d4, 0xa87e, 0x0026, 0x900e, 0x6a18, 0x2001, 0x000a,
-	0x080c, 0x9030, 0xa884, 0x920a, 0x0208, 0x8011, 0xaa86, 0x82ff,
-	0x002e, 0x1138, 0x00c6, 0x2d60, 0x080c, 0xc449, 0x00ce, 0x0804,
-	0xb115, 0x00c6, 0xa868, 0xd0fc, 0x1118, 0x080c, 0x5fd3, 0x0010,
-	0x080c, 0x63c7, 0x00ce, 0x1904, 0xb0fa, 0x00c6, 0x2d60, 0x080c,
-	0xaad8, 0x00ce, 0x0804, 0xb115, 0x00c6, 0x080c, 0xab4a, 0x0198,
-	0x6017, 0x0000, 0x6810, 0x6012, 0x080c, 0xcbb0, 0x6023, 0x0003,
-	0x6904, 0x00c6, 0x2d60, 0x080c, 0xaad8, 0x00ce, 0x080c, 0xab77,
-	0x00ce, 0x0804, 0xb115, 0x2001, 0x1986, 0x2004, 0x684a, 0x00ce,
-	0x0804, 0xb115, 0x7008, 0x9086, 0x000b, 0x11c8, 0x6010, 0x00b6,
-	0x2058, 0xb900, 0xc1bc, 0xb902, 0x00be, 0x00c6, 0x2d60, 0xa87b,
-	0x0003, 0x080c, 0xcdef, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023,
-	0x0002, 0x2009, 0x8020, 0x080c, 0x90e8, 0x00ce, 0x0430, 0x700c,
-	0x9086, 0x2a00, 0x1138, 0x2001, 0x1986, 0x2004, 0x684a, 0x00e8,
-	0x04c1, 0x00e8, 0x89ff, 0x090c, 0x0d7d, 0x00c6, 0x00d6, 0x2d60,
-	0xa867, 0x0103, 0xa87b, 0x0003, 0x080c, 0x6a95, 0x080c, 0xc90b,
-	0x080c, 0xab13, 0x0026, 0x6010, 0x00b6, 0x2058, 0xba3c, 0x080c,
-	0x6658, 0x00be, 0x002e, 0x00de, 0x00ce, 0x080c, 0xaad8, 0x009e,
-	0x0005, 0x9186, 0x0015, 0x1128, 0x2001, 0x1986, 0x2004, 0x684a,
-	0x0068, 0x918e, 0x0016, 0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c,
-	0xe3e7, 0x080c, 0x878b, 0x080c, 0xaad8, 0x00ce, 0x080c, 0xaad8,
-	0x0005, 0x0026, 0x0036, 0x0046, 0x7228, 0xacb0, 0xabac, 0xd2f4,
-	0x0130, 0x2001, 0x1986, 0x2004, 0x684a, 0x0804, 0xb193, 0x00c6,
-	0x2d60, 0x080c, 0xc321, 0x00ce, 0x6804, 0x9086, 0x0050, 0x1168,
-	0x00c6, 0x2d00, 0x2060, 0x6003, 0x0001, 0x6007, 0x0050, 0x2009,
-	0x8023, 0x080c, 0x90e8, 0x00ce, 0x04f0, 0x6800, 0x9086, 0x000f,
-	0x01a8, 0x89ff, 0x090c, 0x0d7d, 0x6800, 0x9086, 0x0004, 0x1190,
-	0xa87c, 0xd0ac, 0x0178, 0xa843, 0x0fff, 0xa83f, 0x0fff, 0xa880,
-	0xc0fc, 0xa882, 0x2001, 0x0001, 0x6832, 0x0400, 0x2001, 0x0007,
-	0x6832, 0x00e0, 0xa87c, 0xd0b4, 0x1150, 0xd0ac, 0x0db8, 0x6824,
-	0xd0f4, 0x1d48, 0xa838, 0xa934, 0x9105, 0x0d80, 0x0c20, 0xd2ec,
-	0x1d68, 0x7024, 0x9306, 0x1118, 0x7020, 0x9406, 0x0d38, 0x7020,
-	0x683e, 0x7024, 0x683a, 0x2001, 0x0005, 0x6832, 0x080c, 0xca9a,
-	0x080c, 0x956a, 0x0010, 0x080c, 0xaad8, 0x004e, 0x003e, 0x002e,
-	0x0005, 0x00e6, 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210,
-	0x00b6, 0x2258, 0xba10, 0x00be, 0x9206, 0x1904, 0xb1fe, 0x700c,
-	0x6210, 0x00b6, 0x2258, 0xba14, 0x00be, 0x9206, 0x1904, 0xb1fe,
-	0x6038, 0x2068, 0x6824, 0xc0dc, 0x6826, 0x6a20, 0x9286, 0x0007,
-	0x0904, 0xb1fe, 0x9286, 0x0002, 0x0904, 0xb1fe, 0x9286, 0x0000,
-	0x05e8, 0x6808, 0x633c, 0x9306, 0x15c8, 0x2071, 0x026c, 0x9186,
-	0x0015, 0x0570, 0x918e, 0x0016, 0x1100, 0x00c6, 0x6038, 0x2060,
-	0x6104, 0x9186, 0x004b, 0x01c0, 0x9186, 0x004c, 0x01a8, 0x9186,
-	0x004d, 0x0190, 0x9186, 0x004e, 0x0178, 0x9186, 0x0052, 0x0160,
-	0x6014, 0x0096, 0x2048, 0x080c, 0xc723, 0x090c, 0x0d7d, 0xa87b,
-	0x0003, 0x009e, 0x080c, 0xcdef, 0x6007, 0x0085, 0x6003, 0x000b,
-	0x6023, 0x0002, 0x2009, 0x8020, 0x080c, 0x90e8, 0x00ce, 0x0030,
-	0x6038, 0x2070, 0x2001, 0x1986, 0x2004, 0x704a, 0x080c, 0xaad8,
-	0x002e, 0x00de, 0x00ee, 0x0005, 0x00b6, 0x0096, 0x00f6, 0x6014,
-	0x2048, 0x6010, 0x2058, 0x91b6, 0x0015, 0x0130, 0xba08, 0xbb0c,
-	0xbc00, 0xc48c, 0xbc02, 0x0460, 0x0096, 0x0156, 0x0036, 0x0026,
-	0x2b48, 0x9e90, 0x0010, 0x2019, 0x000a, 0x20a9, 0x0004, 0x080c,
-	0xbaad, 0x002e, 0x003e, 0x015e, 0x009e, 0x1904, 0xb26d, 0x0096,
-	0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, 0x0014, 0x2019, 0x0006,
-	0x20a9, 0x0004, 0x080c, 0xbaad, 0x002e, 0x003e, 0x015e, 0x009e,
-	0x15a0, 0x7238, 0xba0a, 0x733c, 0xbb0e, 0xbc00, 0xc48d, 0xbc02,
-	0xa804, 0x9005, 0x1128, 0x00fe, 0x009e, 0x00be, 0x0804, 0xaee8,
-	0x0096, 0x2048, 0xaa12, 0xab16, 0xac0a, 0x009e, 0x8006, 0x8006,
-	0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009,
-	0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041,
-	0x1275, 0x080c, 0xaffd, 0x0130, 0x00fe, 0x009e, 0x080c, 0xaad8,
-	0x00be, 0x0005, 0x080c, 0xb4a0, 0x0cb8, 0x2b78, 0x00f6, 0x080c,
-	0x31ab, 0x080c, 0xce4a, 0x00fe, 0x00c6, 0x080c, 0xaa82, 0x2f00,
-	0x6012, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003,
-	0x0001, 0x2001, 0x0007, 0x080c, 0x647d, 0x080c, 0x64a9, 0x080c,
-	0x90ef, 0x080c, 0x956a, 0x00ce, 0x0804, 0xb240, 0x2100, 0x91b2,
-	0x0053, 0x1a0c, 0x0d7d, 0x91b2, 0x0040, 0x1a04, 0xb2f6, 0x0002,
-	0xb2e4, 0xb2e4, 0xb2da, 0xb2e4, 0xb2e4, 0xb2e4, 0xb2d8, 0xb2d8,
-	0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8,
-	0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8,
-	0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2e4,
-	0xb2d8, 0xb2e4, 0xb2e4, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8,
-	0xb2da, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8,
-	0xb2d8, 0xb2d8, 0xb2e4, 0xb2e4, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8,
-	0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2d8, 0xb2e4, 0xb2d8, 0xb2d8,
-	0x080c, 0x0d7d, 0x0066, 0x00b6, 0x6610, 0x2658, 0xb8d4, 0xc08c,
-	0xb8d6, 0x00be, 0x006e, 0x0000, 0x6003, 0x0001, 0x6106, 0x9186,
-	0x0032, 0x0118, 0x080c, 0x90ef, 0x0010, 0x080c, 0x90e8, 0x0126,
-	0x2091, 0x8000, 0x080c, 0x956a, 0x012e, 0x0005, 0x2600, 0x0002,
-	0xb2e4, 0xb2e4, 0xb30a, 0xb2e4, 0xb2e4, 0xb30a, 0xb30a, 0xb30a,
-	0xb30a, 0xb2e4, 0xb30a, 0xb2e4, 0xb30a, 0xb2e4, 0xb30a, 0xb30a,
-	0xb30a, 0xb30a, 0x080c, 0x0d7d, 0x6004, 0x90b2, 0x0053, 0x1a0c,
-	0x0d7d, 0x91b6, 0x0013, 0x0904, 0xb3e1, 0x91b6, 0x0027, 0x1904,
-	0xb38d, 0x080c, 0x94a8, 0x6004, 0x080c, 0xc920, 0x01b0, 0x080c,
-	0xc931, 0x01a8, 0x908e, 0x0021, 0x0904, 0xb38a, 0x908e, 0x0022,
-	0x1130, 0x080c, 0xaf14, 0x0904, 0xb386, 0x0804, 0xb387, 0x908e,
-	0x003d, 0x0904, 0xb38a, 0x0804, 0xb380, 0x080c, 0x31dc, 0x2001,
-	0x0007, 0x080c, 0x647d, 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be,
-	0x080c, 0xb4a0, 0x9186, 0x007e, 0x1148, 0x2001, 0x1837, 0x2014,
-	0xc285, 0x080c, 0x73e4, 0x1108, 0xc2ad, 0x2202, 0x080c, 0xa781,
-	0x0036, 0x0026, 0x2019, 0x0028, 0x2110, 0x080c, 0xe4f3, 0x002e,
-	0x003e, 0x0016, 0x0026, 0x0036, 0x2110, 0x2019, 0x0028, 0x080c,
-	0x926f, 0x0076, 0x903e, 0x080c, 0x9141, 0x6010, 0x00b6, 0x905d,
-	0x0100, 0x00be, 0x2c08, 0x080c, 0xdeb3, 0x007e, 0x003e, 0x002e,
-	0x001e, 0x080c, 0xa79d, 0x080c, 0xce4a, 0x0016, 0x080c, 0xcba8,
-	0x080c, 0xaad8, 0x001e, 0x080c, 0x32bc, 0x080c, 0x956a, 0x0030,
-	0x080c, 0xcba8, 0x080c, 0xaad8, 0x080c, 0x956a, 0x0005, 0x080c,
-	0xb4a0, 0x0cb0, 0x080c, 0xb4dc, 0x0c98, 0x9186, 0x0015, 0x0118,
-	0x9186, 0x0016, 0x1140, 0x080c, 0xa993, 0x0d80, 0x9086, 0x0002,
-	0x0904, 0xb4e7, 0x0c58, 0x9186, 0x0014, 0x1d40, 0x080c, 0x94a8,
-	0x6004, 0x908e, 0x0022, 0x1118, 0x080c, 0xaf14, 0x09f8, 0x080c,
-	0x31ab, 0x080c, 0xce4a, 0x080c, 0xc920, 0x1190, 0x080c, 0x31dc,
-	0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, 0xb4a0, 0x9186,
-	0x007e, 0x1128, 0x2001, 0x1837, 0x200c, 0xc185, 0x2102, 0x0800,
-	0x080c, 0xc931, 0x1120, 0x080c, 0xb4a0, 0x0804, 0xb380, 0x6004,
-	0x908e, 0x0032, 0x1160, 0x00e6, 0x00f6, 0x2071, 0x189e, 0x2079,
-	0x0000, 0x080c, 0x3565, 0x00fe, 0x00ee, 0x0804, 0xb380, 0x6004,
-	0x908e, 0x0021, 0x0d40, 0x908e, 0x0022, 0x090c, 0xb4a0, 0x0804,
-	0xb380, 0x90b2, 0x0040, 0x1a04, 0xb480, 0x2008, 0x0002, 0xb429,
-	0xb42a, 0xb42d, 0xb430, 0xb433, 0xb436, 0xb427, 0xb427, 0xb427,
-	0xb427, 0xb427, 0xb427, 0xb427, 0xb427, 0xb427, 0xb427, 0xb427,
-	0xb427, 0xb427, 0xb427, 0xb427, 0xb427, 0xb427, 0xb427, 0xb427,
-	0xb427, 0xb427, 0xb427, 0xb427, 0xb427, 0xb439, 0xb442, 0xb427,
-	0xb443, 0xb442, 0xb427, 0xb427, 0xb427, 0xb427, 0xb427, 0xb442,
-	0xb442, 0xb427, 0xb427, 0xb427, 0xb427, 0xb427, 0xb427, 0xb427,
-	0xb427, 0xb46b, 0xb442, 0xb427, 0xb43e, 0xb427, 0xb427, 0xb427,
-	0xb43f, 0xb427, 0xb427, 0xb427, 0xb442, 0xb466, 0xb427, 0x080c,
-	0x0d7d, 0x00c0, 0x2001, 0x000b, 0x00e8, 0x2001, 0x0003, 0x00d0,
-	0x2001, 0x0005, 0x00b8, 0x2001, 0x0001, 0x00a0, 0x2001, 0x0009,
-	0x0088, 0x6003, 0x0005, 0x080c, 0x956a, 0x0058, 0x0018, 0x0010,
-	0x080c, 0x647d, 0x04b8, 0x080c, 0xce4d, 0x6003, 0x0004, 0x080c,
-	0x956a, 0x0005, 0x080c, 0x647d, 0x6003, 0x0002, 0x0036, 0x2019,
-	0x1852, 0x2304, 0x9084, 0xff00, 0x1120, 0x2001, 0x1984, 0x201c,
-	0x0040, 0x8007, 0x909a, 0x0004, 0x0ec0, 0x8003, 0x801b, 0x831b,
-	0x9318, 0x631a, 0x003e, 0x080c, 0x956a, 0x0c18, 0x080c, 0xcba8,
-	0x080c, 0xaad8, 0x08f0, 0x00e6, 0x00f6, 0x2071, 0x189e, 0x2079,
-	0x0000, 0x080c, 0x3565, 0x00fe, 0x00ee, 0x080c, 0x94a8, 0x080c,
-	0xaad8, 0x0878, 0x6003, 0x0002, 0x080c, 0xce4d, 0x0804, 0x956a,
-	0x2600, 0x2008, 0x0002, 0xb497, 0xb47a, 0xb495, 0xb47a, 0xb47a,
-	0xb495, 0xb495, 0xb495, 0xb495, 0xb47a, 0xb495, 0xb47a, 0xb495,
-	0xb47a, 0xb495, 0xb495, 0xb495, 0xb495, 0x080c, 0x0d7d, 0x0096,
-	0x6014, 0x2048, 0x080c, 0x6c7f, 0x009e, 0x080c, 0xaad8, 0x0005,
-	0x00e6, 0x0096, 0x0026, 0x0016, 0x080c, 0xc723, 0x0568, 0x6014,
-	0x2048, 0xa864, 0x9086, 0x0139, 0x11a8, 0xa894, 0x9086, 0x0056,
-	0x1148, 0x080c, 0x539d, 0x0130, 0x2001, 0x0000, 0x900e, 0x2011,
-	0x4000, 0x0028, 0x2001, 0x0030, 0x900e, 0x2011, 0x4005, 0x080c,
-	0xcd14, 0x0090, 0xa868, 0xd0fc, 0x0178, 0xa807, 0x0000, 0x0016,
-	0x6004, 0x908e, 0x0021, 0x0168, 0x908e, 0x003d, 0x0150, 0x001e,
-	0xa867, 0x0103, 0xa833, 0x0100, 0x001e, 0x002e, 0x009e, 0x00ee,
-	0x0005, 0x001e, 0x0009, 0x0cc0, 0x0096, 0x6014, 0x2048, 0xa800,
-	0x2048, 0xa867, 0x0103, 0xa823, 0x8001, 0x009e, 0x0005, 0x00b6,
-	0x6610, 0x2658, 0xb804, 0x9084, 0x00ff, 0x90b2, 0x000c, 0x1a0c,
-	0x0d7d, 0x6604, 0x96b6, 0x004d, 0x1120, 0x080c, 0xcc34, 0x0804,
-	0xb56c, 0x6604, 0x96b6, 0x0043, 0x1120, 0x080c, 0xcc7d, 0x0804,
-	0xb56c, 0x6604, 0x96b6, 0x004b, 0x1120, 0x080c, 0xcca9, 0x0804,
-	0xb56c, 0x6604, 0x96b6, 0x0033, 0x1120, 0x080c, 0xcbca, 0x0804,
-	0xb56c, 0x6604, 0x96b6, 0x0028, 0x1120, 0x080c, 0xc96a, 0x0804,
-	0xb56c, 0x6604, 0x96b6, 0x0029, 0x1120, 0x080c, 0xc9ab, 0x0804,
-	0xb56c, 0x6604, 0x96b6, 0x001f, 0x1120, 0x080c, 0xaebd, 0x0804,
-	0xb56c, 0x6604, 0x96b6, 0x0000, 0x1118, 0x080c, 0xb204, 0x04e0,
-	0x6604, 0x96b6, 0x0022, 0x1118, 0x080c, 0xaef5, 0x04a8, 0x6604,
-	0x96b6, 0x0035, 0x1118, 0x080c, 0xb01b, 0x0470, 0x6604, 0x96b6,
-	0x0039, 0x1118, 0x080c, 0xb199, 0x0438, 0x6604, 0x96b6, 0x003d,
-	0x1118, 0x080c, 0xaf2d, 0x0400, 0x6604, 0x96b6, 0x0044, 0x1118,
-	0x080c, 0xaf69, 0x00c8, 0x6604, 0x96b6, 0x0049, 0x1118, 0x080c,
-	0xafaa, 0x0090, 0x6604, 0x96b6, 0x0041, 0x1118, 0x080c, 0xaf94,
-	0x0058, 0x91b6, 0x0015, 0x1110, 0x0063, 0x0030, 0x91b6, 0x0016,
-	0x1128, 0x00be, 0x0804, 0xb7c6, 0x00be, 0x0005, 0x080c, 0xab94,
-	0x0cd8, 0xb589, 0xb58c, 0xb589, 0xb5d3, 0xb589, 0xb73a, 0xb7d3,
-	0xb589, 0xb589, 0xb79c, 0xb589, 0xb7b2, 0x0096, 0x601f, 0x0000,
-	0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, 0x009e, 0x0804,
-	0xaad8, 0xa001, 0xa001, 0x0005, 0x00e6, 0x2071, 0x1800, 0x7090,
-	0x9086, 0x0074, 0x1540, 0x080c, 0xde84, 0x11b0, 0x6010, 0x00b6,
-	0x2058, 0x7030, 0xd08c, 0x0128, 0xb800, 0xd0bc, 0x0110, 0xc0c5,
-	0xb802, 0x00f9, 0x00be, 0x2001, 0x0006, 0x080c, 0x647d, 0x080c,
-	0x31dc, 0x080c, 0xaad8, 0x0098, 0x2001, 0x000a, 0x080c, 0x647d,
-	0x080c, 0x31dc, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x90ef,
-	0x080c, 0x956a, 0x0020, 0x2001, 0x0001, 0x080c, 0xb70a, 0x00ee,
-	0x0005, 0x00d6, 0xb800, 0xd084, 0x0160, 0x9006, 0x080c, 0x6469,
-	0x2069, 0x1847, 0x6804, 0xd0a4, 0x0120, 0x2001, 0x0006, 0x080c,
-	0x64a9, 0x00de, 0x0005, 0x00b6, 0x0096, 0x00d6, 0x2011, 0x1824,
-	0x2204, 0x9086, 0x0074, 0x1904, 0xb6e1, 0x6010, 0x2058, 0xbaa0,
-	0x9286, 0x007e, 0x1120, 0x080c, 0xb920, 0x0804, 0xb645, 0x080c,
-	0xb915, 0x6010, 0x2058, 0xbaa0, 0x9286, 0x0080, 0x1510, 0x6014,
-	0x9005, 0x01a8, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039,
-	0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xcd14,
-	0x0030, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x2001,
-	0x0006, 0x080c, 0x647d, 0x080c, 0x31dc, 0x080c, 0xaad8, 0x0804,
-	0xb6e4, 0x080c, 0xb6f2, 0x6014, 0x9005, 0x0190, 0x2048, 0xa868,
-	0xd0f4, 0x01e8, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1d08,
-	0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xcd14, 0x08f8,
-	0x080c, 0xb6e8, 0x0160, 0x9006, 0x080c, 0x6469, 0x2001, 0x0004,
-	0x080c, 0x64a9, 0x2001, 0x0007, 0x080c, 0x647d, 0x08a0, 0x2001,
-	0x0004, 0x080c, 0x647d, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c,
-	0x90ef, 0x080c, 0x956a, 0x0804, 0xb6e4, 0xb85c, 0xd0e4, 0x01d8,
-	0x080c, 0xcb42, 0x080c, 0x73e4, 0x0118, 0xd0dc, 0x1904, 0xb607,
-	0x2011, 0x1837, 0x2204, 0xc0ad, 0x2012, 0x2001, 0x196d, 0x2004,
-	0x00f6, 0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, 0x2643, 0x78e2,
-	0x00fe, 0x0804, 0xb607, 0x080c, 0xcb83, 0x2011, 0x1837, 0x2204,
-	0xc0a5, 0x2012, 0x0006, 0x080c, 0xe014, 0x000e, 0x1904, 0xb607,
-	0xc0b5, 0x2012, 0x2001, 0x0006, 0x080c, 0x647d, 0x9006, 0x080c,
-	0x6469, 0x00c6, 0x2001, 0x180f, 0x2004, 0xd09c, 0x0520, 0x00f6,
-	0x2079, 0x0100, 0x00e6, 0x2071, 0x1800, 0x700c, 0x9084, 0x00ff,
-	0x78e6, 0x707e, 0x7010, 0x78ea, 0x7082, 0x908c, 0x00ff, 0x00ee,
-	0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x2618, 0x00f6, 0x2100,
-	0x900e, 0x080c, 0x25cf, 0x795e, 0x00fe, 0x9186, 0x0081, 0x01d8,
-	0x2009, 0x0081, 0x00c8, 0x2009, 0x00ef, 0x00f6, 0x2079, 0x0100,
-	0x79ea, 0x7932, 0x7936, 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c,
-	0x2618, 0x00f6, 0x2079, 0x1800, 0x7982, 0x2100, 0x900e, 0x080c,
-	0x25cf, 0x795e, 0x00fe, 0x8108, 0x080c, 0x64cc, 0x2b00, 0x00ce,
-	0x1904, 0xb607, 0x6012, 0x2009, 0x180f, 0x210c, 0xd19c, 0x0150,
-	0x2009, 0x027c, 0x210c, 0x918c, 0x00ff, 0xb912, 0x2009, 0x027d,
-	0x210c, 0xb916, 0x2001, 0x0002, 0x080c, 0x647d, 0x6023, 0x0001,
-	0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x90ef, 0x080c, 0x956a,
-	0x0018, 0x2001, 0x0001, 0x0431, 0x00de, 0x009e, 0x00be, 0x0005,
-	0x2001, 0x1810, 0x2004, 0xd0a4, 0x0120, 0x2001, 0x1848, 0x2004,
-	0xd0ac, 0x0005, 0x00e6, 0x080c, 0xe54c, 0x0190, 0x2071, 0x0260,
-	0x7108, 0x720c, 0x918c, 0x00ff, 0x1118, 0x9284, 0xff00, 0x0140,
-	0x6010, 0x2058, 0xb8a0, 0x9084, 0xff80, 0x1110, 0xb912, 0xba16,
-	0x00ee, 0x0005, 0x2030, 0x9005, 0x0158, 0x2001, 0x0007, 0x080c,
-	0x647d, 0x080c, 0x5610, 0x1120, 0x2001, 0x0007, 0x080c, 0x64a9,
-	0x2600, 0x9005, 0x11b0, 0x6014, 0x0096, 0x2048, 0xa868, 0x009e,
-	0xd0fc, 0x1178, 0x0036, 0x0046, 0x6010, 0x00b6, 0x2058, 0xbba0,
-	0x00be, 0x2021, 0x0004, 0x2011, 0x8014, 0x080c, 0x4a38, 0x004e,
-	0x003e, 0x080c, 0x31dc, 0x6020, 0x9086, 0x000a, 0x1108, 0x0005,
-	0x0804, 0xaad8, 0x00b6, 0x00e6, 0x0026, 0x0016, 0x2071, 0x1800,
-	0x7090, 0x9086, 0x0014, 0x1904, 0xb792, 0x080c, 0x5610, 0x1170,
-	0x6014, 0x9005, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0,
-	0x2021, 0x0006, 0x080c, 0x4bef, 0x004e, 0x003e, 0x00d6, 0x6010,
-	0x2058, 0x080c, 0x65c8, 0x080c, 0xb5c1, 0x00de, 0x080c, 0xb9e6,
-	0x1588, 0x6010, 0x2058, 0xb890, 0x9005, 0x0560, 0x2001, 0x0006,
-	0x080c, 0x647d, 0x0096, 0x6014, 0x904d, 0x01d0, 0xa864, 0x9084,
-	0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011,
-	0x4000, 0x080c, 0xcd14, 0x0060, 0xa864, 0x9084, 0x00ff, 0x9086,
-	0x0029, 0x0130, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200,
-	0x009e, 0x080c, 0x31dc, 0x6020, 0x9086, 0x000a, 0x0140, 0x080c,
-	0xaad8, 0x0028, 0x080c, 0xb4a0, 0x9006, 0x080c, 0xb70a, 0x001e,
-	0x002e, 0x00ee, 0x00be, 0x0005, 0x2011, 0x1824, 0x2204, 0x9086,
-	0x0014, 0x1160, 0x2001, 0x0002, 0x080c, 0x647d, 0x6003, 0x0001,
-	0x6007, 0x0001, 0x080c, 0x90ef, 0x0804, 0x956a, 0x2001, 0x0001,
-	0x0804, 0xb70a, 0x2030, 0x2011, 0x1824, 0x2204, 0x9086, 0x0004,
-	0x1148, 0x96b6, 0x000b, 0x1120, 0x2001, 0x0007, 0x080c, 0x647d,
-	0x0804, 0xaad8, 0x2001, 0x0001, 0x0804, 0xb70a, 0x0002, 0xb589,
-	0xb7de, 0xb589, 0xb81f, 0xb589, 0xb8cc, 0xb7d3, 0xb589, 0xb589,
-	0xb8e0, 0xb589, 0xb8f2, 0x6604, 0x9686, 0x0003, 0x0904, 0xb73a,
-	0x96b6, 0x001e, 0x1110, 0x080c, 0xaad8, 0x0005, 0x00b6, 0x00d6,
-	0x00c6, 0x080c, 0xb904, 0x11a0, 0x9006, 0x080c, 0x6469, 0x080c,
-	0x31ab, 0x080c, 0xce4a, 0x2001, 0x0002, 0x080c, 0x647d, 0x6003,
-	0x0001, 0x6007, 0x0002, 0x080c, 0x90ef, 0x080c, 0x956a, 0x0418,
-	0x2009, 0x026e, 0x2104, 0x9086, 0x0009, 0x1160, 0x6010, 0x2058,
-	0xb840, 0x9084, 0x00ff, 0x9005, 0x0170, 0x8001, 0xb842, 0x601b,
-	0x000a, 0x0088, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x9086,
-	0x1900, 0x1108, 0x08a0, 0x080c, 0x31ab, 0x080c, 0xce4a, 0x2001,
-	0x0001, 0x080c, 0xb70a, 0x00ce, 0x00de, 0x00be, 0x0005, 0x0096,
-	0x00b6, 0x0026, 0x9016, 0x080c, 0xb912, 0x00d6, 0x2069, 0x197c,
-	0x2d04, 0x9005, 0x0168, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e,
-	0x1138, 0x2069, 0x1820, 0x2d04, 0x8000, 0x206a, 0x00de, 0x0010,
-	0x00de, 0x0088, 0x9006, 0x080c, 0x6469, 0x2001, 0x0002, 0x080c,
-	0x647d, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x90ef, 0x080c,
-	0x956a, 0x0804, 0xb89c, 0x080c, 0xc723, 0x01b0, 0x6014, 0x2048,
-	0xa864, 0x2010, 0x9086, 0x0139, 0x1138, 0x6007, 0x0016, 0x2001,
-	0x0002, 0x080c, 0xcd6e, 0x00b0, 0x6014, 0x2048, 0xa864, 0xd0fc,
-	0x0118, 0x2001, 0x0001, 0x0ca8, 0x2001, 0x180e, 0x2004, 0xd0dc,
-	0x0148, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x1110,
-	0x9006, 0x0c38, 0x080c, 0xb4a0, 0x2009, 0x026e, 0x2134, 0x96b4,
-	0x00ff, 0x9686, 0x0005, 0x0520, 0x9686, 0x000b, 0x01c8, 0x2009,
-	0x026f, 0x2104, 0x9084, 0xff00, 0x1118, 0x9686, 0x0009, 0x01c0,
-	0x9086, 0x1900, 0x1168, 0x9686, 0x0009, 0x0190, 0x2001, 0x0004,
-	0x080c, 0x647d, 0x2001, 0x0028, 0x601a, 0x6007, 0x0052, 0x0020,
-	0x2001, 0x0001, 0x080c, 0xb70a, 0x002e, 0x00be, 0x009e, 0x0005,
-	0x9286, 0x0139, 0x0160, 0x6014, 0x2048, 0x080c, 0xc723, 0x0140,
-	0xa864, 0x9086, 0x0139, 0x0118, 0xa868, 0xd0fc, 0x0108, 0x0c40,
-	0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0138, 0x8001,
-	0xb842, 0x601b, 0x000a, 0x6007, 0x0016, 0x08f0, 0xb8a0, 0x9086,
-	0x007e, 0x1138, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5ed4, 0x00ee,
-	0x0010, 0x080c, 0x31ab, 0x0860, 0x080c, 0xb912, 0x1160, 0x2001,
-	0x0004, 0x080c, 0x647d, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c,
-	0x90ef, 0x0804, 0x956a, 0x080c, 0xb4a0, 0x9006, 0x0804, 0xb70a,
-	0x0489, 0x1160, 0x2001, 0x0008, 0x080c, 0x647d, 0x6003, 0x0001,
-	0x6007, 0x0005, 0x080c, 0x90ef, 0x0804, 0x956a, 0x2001, 0x0001,
-	0x0804, 0xb70a, 0x00f9, 0x1160, 0x2001, 0x000a, 0x080c, 0x647d,
-	0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x90ef, 0x0804, 0x956a,
-	0x2001, 0x0001, 0x0804, 0xb70a, 0x2009, 0x026e, 0x2104, 0x9086,
-	0x0003, 0x1138, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x9086,
-	0x2a00, 0x0005, 0x9085, 0x0001, 0x0005, 0x00b6, 0x00c6, 0x0016,
-	0x6110, 0x2158, 0x080c, 0x653c, 0x001e, 0x00ce, 0x00be, 0x0005,
-	0x00b6, 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, 0x6010, 0x2058,
-	0x2009, 0x1837, 0x2104, 0x9085, 0x0003, 0x200a, 0x080c, 0xb9b8,
-	0x0560, 0x2009, 0x1837, 0x2104, 0xc0cd, 0x200a, 0x080c, 0x6966,
-	0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xe191, 0x2001,
-	0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0001,
-	0x080c, 0x316a, 0x00e6, 0x2071, 0x1800, 0x080c, 0x2f79, 0x00ee,
-	0x00c6, 0x0156, 0x20a9, 0x0781, 0x2009, 0x007f, 0x080c, 0x32bc,
-	0x8108, 0x1f04, 0xb956, 0x015e, 0x00ce, 0x080c, 0xb915, 0x2071,
-	0x0260, 0x2079, 0x0200, 0x7817, 0x0001, 0x2001, 0x1837, 0x200c,
-	0xc1c5, 0x7018, 0xd0fc, 0x0110, 0xd0dc, 0x0118, 0x7038, 0xd0dc,
-	0x1108, 0xc1c4, 0x7817, 0x0000, 0x2001, 0x1837, 0x2102, 0x2079,
-	0x0100, 0x2e04, 0x9084, 0x00ff, 0x2069, 0x181f, 0x206a, 0x78e6,
-	0x0006, 0x8e70, 0x2e04, 0x2069, 0x1820, 0x206a, 0x78ea, 0x7832,
-	0x7836, 0x2010, 0x9084, 0xff00, 0x001e, 0x9105, 0x2009, 0x182c,
-	0x200a, 0x2200, 0x9084, 0x00ff, 0x2008, 0x080c, 0x2618, 0x080c,
-	0x73e4, 0x0170, 0x2071, 0x0260, 0x2069, 0x1980, 0x7048, 0x206a,
-	0x704c, 0x6806, 0x7050, 0x680a, 0x7054, 0x680e, 0x080c, 0xcb42,
-	0x0040, 0x2001, 0x0006, 0x080c, 0x647d, 0x080c, 0x31dc, 0x080c,
-	0xaad8, 0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x00be, 0x0005,
-	0x0096, 0x0026, 0x0036, 0x00e6, 0x0156, 0x2019, 0x182c, 0x231c,
-	0x83ff, 0x01f0, 0x2071, 0x0260, 0x7200, 0x9294, 0x00ff, 0x7004,
-	0x9084, 0xff00, 0x9205, 0x9306, 0x1198, 0x2011, 0x0276, 0x20a9,
-	0x0004, 0x2b48, 0x2019, 0x000a, 0x080c, 0xbaad, 0x1148, 0x2011,
-	0x027a, 0x20a9, 0x0004, 0x2019, 0x0006, 0x080c, 0xbaad, 0x1100,
-	0x015e, 0x00ee, 0x003e, 0x002e, 0x009e, 0x0005, 0x00e6, 0x2071,
-	0x0260, 0x7034, 0x9086, 0x0014, 0x11a8, 0x7038, 0x9086, 0x0800,
-	0x1188, 0x703c, 0xd0ec, 0x0160, 0x9084, 0x0f00, 0x9086, 0x0100,
-	0x1138, 0x7054, 0xd0a4, 0x1110, 0xd0ac, 0x0110, 0x9006, 0x0010,
-	0x9085, 0x0001, 0x00ee, 0x0005, 0x00e6, 0x0096, 0x00c6, 0x0076,
-	0x0056, 0x0046, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2029,
-	0x19f1, 0x252c, 0x2021, 0x19f8, 0x2424, 0x2061, 0x1ddc, 0x2071,
-	0x1800, 0x7254, 0x7074, 0x9202, 0x1a04, 0xba79, 0x080c, 0x8a5a,
-	0x0904, 0xba72, 0x080c, 0xe1bd, 0x0904, 0xba72, 0x6720, 0x9786,
-	0x0007, 0x0904, 0xba72, 0x2500, 0x9c06, 0x0904, 0xba72, 0x2400,
-	0x9c06, 0x0904, 0xba72, 0x3e08, 0x9186, 0x0002, 0x1148, 0x6010,
-	0x9005, 0x0130, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1590,
-	0x00c6, 0x6043, 0xffff, 0x6000, 0x9086, 0x0004, 0x1110, 0x080c,
-	0x1a53, 0x9786, 0x000a, 0x0148, 0x080c, 0xc931, 0x1130, 0x00ce,
-	0x080c, 0xb4a0, 0x080c, 0xab13, 0x00e8, 0x6014, 0x2048, 0x080c,
-	0xc723, 0x01a8, 0x9786, 0x0003, 0x1530, 0xa867, 0x0103, 0xab7a,
-	0xa877, 0x0000, 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878, 0x2048,
-	0x080c, 0x0fed, 0x009e, 0x080c, 0x6c73, 0x080c, 0xc90b, 0x080c,
-	0xab13, 0x00ce, 0x9ce0, 0x001c, 0x7068, 0x9c02, 0x1210, 0x0804,
-	0xba19, 0x012e, 0x000e, 0x002e, 0x004e, 0x005e, 0x007e, 0x00ce,
-	0x009e, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1118, 0x080c, 0xe134,
-	0x0c30, 0x9786, 0x0009, 0x1148, 0x6000, 0x9086, 0x0004, 0x0d08,
-	0x2009, 0x004c, 0x080c, 0xab77, 0x08e0, 0x9786, 0x000a, 0x0938,
-	0x0820, 0x220c, 0x2304, 0x9106, 0x1130, 0x8210, 0x8318, 0x1f04,
-	0xba99, 0x9006, 0x0005, 0x2304, 0x9102, 0x0218, 0x2001, 0x0001,
-	0x0008, 0x9006, 0x918d, 0x0001, 0x0005, 0x0136, 0x01c6, 0x0016,
-	0x8906, 0x8006, 0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0,
-	0x9300, 0x2098, 0x3518, 0x20a9, 0x0001, 0x220c, 0x4002, 0x910e,
-	0x1140, 0x8210, 0x8319, 0x1dc8, 0x9006, 0x001e, 0x01ce, 0x013e,
-	0x0005, 0x220c, 0x9102, 0x0218, 0x2001, 0x0001, 0x0010, 0x2001,
-	0x0000, 0x918d, 0x0001, 0x001e, 0x01ce, 0x013e, 0x0005, 0x220c,
-	0x810f, 0x2304, 0x9106, 0x1130, 0x8210, 0x8318, 0x1f04, 0xbad7,
-	0x9006, 0x0005, 0x918d, 0x0001, 0x0005, 0x6004, 0x908a, 0x0053,
-	0x1a0c, 0x0d7d, 0x080c, 0xc920, 0x0120, 0x080c, 0xc931, 0x0158,
-	0x0028, 0x080c, 0x31dc, 0x080c, 0xc931, 0x0128, 0x080c, 0x94a8,
-	0x080c, 0xaad8, 0x0005, 0x080c, 0xb4a0, 0x0cc0, 0x9182, 0x0057,
-	0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xbb1d, 0xbb1d,
-	0xbb1d, 0xbb1d, 0xbb1d, 0xbb1d, 0xbb1d, 0xbb1d, 0xbb1d, 0xbb1d,
-	0xbb1d, 0xbb1f, 0xbb1f, 0xbb1f, 0xbb1f, 0xbb1d, 0xbb1d, 0xbb1d,
-	0xbb1f, 0xbb1d, 0xbb1d, 0xbb1d, 0xbb1d, 0x080c, 0x0d7d, 0x600b,
-	0xffff, 0x6003, 0x000f, 0x6106, 0x0126, 0x2091, 0x8000, 0x080c,
-	0xce4d, 0x2009, 0x8000, 0x080c, 0x90e8, 0x012e, 0x0005, 0x9186,
-	0x0013, 0x1128, 0x6004, 0x9082, 0x0040, 0x0804, 0xbba4, 0x9186,
-	0x0027, 0x1520, 0x080c, 0x94a8, 0x080c, 0x31ab, 0x080c, 0xce4a,
-	0x0096, 0x6114, 0x2148, 0x080c, 0xc723, 0x0198, 0x080c, 0xc931,
-	0x1118, 0x080c, 0xb4a0, 0x0068, 0xa867, 0x0103, 0xa87b, 0x0029,
-	0xa877, 0x0000, 0xa97c, 0xc1c5, 0xa97e, 0x080c, 0x6c7f, 0x080c,
-	0xc90b, 0x009e, 0x080c, 0xaad8, 0x0804, 0x956a, 0x9186, 0x0014,
-	0x1120, 0x6004, 0x9082, 0x0040, 0x0018, 0x080c, 0x0d7d, 0x0005,
-	0x0002, 0xbb82, 0xbb80, 0xbb80, 0xbb80, 0xbb80, 0xbb80, 0xbb80,
-	0xbb80, 0xbb80, 0xbb80, 0xbb80, 0xbb9b, 0xbb9b, 0xbb9b, 0xbb9b,
-	0xbb80, 0xbb9b, 0xbb80, 0xbb9b, 0xbb80, 0xbb80, 0xbb80, 0xbb80,
-	0x080c, 0x0d7d, 0x080c, 0x94a8, 0x0096, 0x6114, 0x2148, 0x080c,
-	0xc723, 0x0168, 0xa867, 0x0103, 0xa87b, 0x0006, 0xa877, 0x0000,
-	0xa880, 0xc0ec, 0xa882, 0x080c, 0x6c7f, 0x080c, 0xc90b, 0x009e,
-	0x080c, 0xaad8, 0x0005, 0x080c, 0x94a8, 0x080c, 0xc931, 0x090c,
-	0xb4a0, 0x080c, 0xaad8, 0x0005, 0x0002, 0xbbbe, 0xbbbc, 0xbbbc,
-	0xbbbc, 0xbbbc, 0xbbbc, 0xbbbc, 0xbbbc, 0xbbbc, 0xbbbc, 0xbbbc,
-	0xbbc0, 0xbbc0, 0xbbc0, 0xbbc0, 0xbbbc, 0xbbc2, 0xbbbc, 0xbbc0,
-	0xbbbc, 0xbbbc, 0xbbbc, 0xbbbc, 0x080c, 0x0d7d, 0x080c, 0x0d7d,
-	0x080c, 0x0d7d, 0x080c, 0xaad8, 0x0804, 0x956a, 0x9182, 0x0057,
-	0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xbbe5, 0xbbe5,
-	0xbbe5, 0xbbe5, 0xbbe5, 0xbc1e, 0xbd0d, 0xbbe5, 0xbd19, 0xbbe5,
-	0xbbe5, 0xbbe5, 0xbbe5, 0xbbe5, 0xbbe5, 0xbbe5, 0xbbe5, 0xbbe5,
-	0xbbe5, 0xbd19, 0xbbe7, 0xbbe5, 0xbd17, 0x080c, 0x0d7d, 0x00b6,
-	0x0096, 0x6114, 0x2148, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1508,
-	0xa87b, 0x0000, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87c, 0xd0ac,
-	0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xbd9e, 0x080c, 0x6a95,
-	0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0xb8d0,
-	0x9005, 0x0110, 0x080c, 0x6658, 0x080c, 0xaad8, 0x009e, 0x00be,
-	0x0005, 0xa87c, 0xd0ac, 0x09e0, 0xa838, 0xa934, 0x9105, 0x09c0,
-	0xa880, 0xd0bc, 0x19a8, 0x080c, 0xca61, 0x0c80, 0x00b6, 0x0096,
-	0x6114, 0x2148, 0x601c, 0xd0fc, 0x1110, 0x7644, 0x0008, 0x9036,
-	0x96b4, 0x0fff, 0x86ff, 0x1590, 0x6010, 0x2058, 0xb800, 0xd0bc,
-	0x1904, 0xbcfc, 0xa87b, 0x0000, 0xa867, 0x0103, 0xae76, 0xa87c,
-	0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xbd9e, 0x080c,
-	0x6a95, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e,
-	0xb8d0, 0x9005, 0x0110, 0x080c, 0x6658, 0x601c, 0xd0fc, 0x1148,
-	0x7044, 0xd0e4, 0x1904, 0xbce0, 0x080c, 0xaad8, 0x009e, 0x00be,
-	0x0005, 0x2009, 0x0211, 0x210c, 0x080c, 0x0d7d, 0x968c, 0x0c00,
-	0x0150, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xbce4, 0x7348,
-	0xab92, 0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0508,
-	0x9186, 0x0028, 0x1118, 0xa87b, 0x001c, 0x00e8, 0xd6dc, 0x01a0,
-	0xa87b, 0x0015, 0xa87c, 0xd0ac, 0x0170, 0xa938, 0xaa34, 0x2100,
-	0x9205, 0x0148, 0x7048, 0x9106, 0x1118, 0x704c, 0x9206, 0x0118,
-	0xa992, 0xaa8e, 0xc6dc, 0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007,
-	0x0010, 0xa87b, 0x0000, 0xa867, 0x0103, 0xae76, 0x901e, 0xd6c4,
-	0x01d8, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4,
-	0x0804, 0xbc2a, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009,
-	0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, 0x2011,
-	0x0025, 0x080c, 0xc2f6, 0x003e, 0xd6cc, 0x0904, 0xbc3f, 0x7154,
-	0xa98a, 0x81ff, 0x0904, 0xbc3f, 0x9192, 0x0021, 0x1278, 0x8304,
-	0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xc2f6, 0x2011, 0x0205,
-	0x2013, 0x0000, 0x080c, 0xcdda, 0x0804, 0xbc3f, 0xa868, 0xd0fc,
-	0x0120, 0x2009, 0x0020, 0xa98a, 0x0c50, 0x00a6, 0x2950, 0x080c,
-	0xc295, 0x00ae, 0x080c, 0xcdda, 0x080c, 0xc2e6, 0x0804, 0xbc41,
-	0x080c, 0xca24, 0x0804, 0xbc56, 0xa87c, 0xd0ac, 0x0904, 0xbc67,
-	0xa880, 0xd0bc, 0x1904, 0xbc67, 0x7348, 0xa838, 0x9306, 0x11c8,
-	0x734c, 0xa834, 0x931e, 0x0904, 0xbc67, 0xd6d4, 0x0190, 0xab38,
-	0x9305, 0x0904, 0xbc67, 0x0068, 0xa87c, 0xd0ac, 0x0904, 0xbc32,
-	0xa838, 0xa934, 0x9105, 0x0904, 0xbc32, 0xa880, 0xd0bc, 0x1904,
-	0xbc32, 0x080c, 0xca61, 0x0804, 0xbc56, 0x00f6, 0x2079, 0x026c,
-	0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x00fe, 0x0021, 0x0005, 0x0011,
-	0x0005, 0x0005, 0x0096, 0x6003, 0x0002, 0x6007, 0x0043, 0x6014,
-	0x2048, 0xa87c, 0xd0ac, 0x0128, 0x009e, 0x0005, 0x2130, 0x2228,
-	0x0058, 0x2400, 0xa9ac, 0x910a, 0x2300, 0xaab0, 0x9213, 0x2600,
-	0x9102, 0x2500, 0x9203, 0x0e90, 0xac46, 0xab4a, 0xae36, 0xad3a,
-	0x6044, 0xd0fc, 0x190c, 0xa7aa, 0x604b, 0x0000, 0x080c, 0x1c0c,
-	0x1118, 0x6144, 0x080c, 0x9114, 0x009e, 0x0005, 0x9182, 0x0057,
-	0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xbd65, 0xbd65,
-	0xbd65, 0xbd65, 0xbd65, 0xbd65, 0xbd65, 0xbd65, 0xbd65, 0xbd65,
-	0xbd67, 0xbd65, 0xbd65, 0xbd65, 0xbd65, 0xbd78, 0xbd65, 0xbd65,
-	0xbd65, 0xbd65, 0xbd9c, 0xbd65, 0xbd65, 0x080c, 0x0d7d, 0x6004,
-	0x9086, 0x0040, 0x1110, 0x080c, 0x94a8, 0x2019, 0x0001, 0x080c,
-	0x9fef, 0x6003, 0x0002, 0x080c, 0xce52, 0x080c, 0x9505, 0x0005,
-	0x6004, 0x9086, 0x0040, 0x1110, 0x080c, 0x94a8, 0x2019, 0x0001,
-	0x080c, 0x9fef, 0x080c, 0x9505, 0x080c, 0x31ab, 0x080c, 0xce4a,
-	0x0096, 0x6114, 0x2148, 0x080c, 0xc723, 0x0150, 0xa867, 0x0103,
-	0xa87b, 0x0029, 0xa877, 0x0000, 0x080c, 0x6c7f, 0x080c, 0xc90b,
-	0x009e, 0x080c, 0xaad8, 0x0005, 0x080c, 0x0d7d, 0xa87b, 0x0015,
-	0xd1fc, 0x0180, 0xa87b, 0x0007, 0x8002, 0x8000, 0x810a, 0x9189,
-	0x0000, 0x0006, 0x0016, 0x2009, 0x1a76, 0x2104, 0x8000, 0x200a,
-	0x001e, 0x000e, 0xa992, 0xa88e, 0x0005, 0x9182, 0x0057, 0x1220,
-	0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xbdd4, 0xbdd4, 0xbdd4,
-	0xbdd4, 0xbdd4, 0xbdd6, 0xbdd4, 0xbdd4, 0xbe93, 0xbdd4, 0xbdd4,
-	0xbdd4, 0xbdd4, 0xbdd4, 0xbdd4, 0xbdd4, 0xbdd4, 0xbdd4, 0xbdd4,
-	0xbfd7, 0xbdd4, 0xbfe1, 0xbdd4, 0x080c, 0x0d7d, 0x601c, 0xd0bc,
-	0x0178, 0xd084, 0x0168, 0xd0f4, 0x0120, 0xc084, 0x601e, 0x0804,
-	0xbbc6, 0x6114, 0x0096, 0x2148, 0xa87c, 0xc0e5, 0xa87e, 0x009e,
-	0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260, 0x6114, 0x2150,
-	0x601c, 0xd0fc, 0x1110, 0x7644, 0x0008, 0x9036, 0xb676, 0x96b4,
-	0x0fff, 0xb77c, 0xc7e5, 0xb77e, 0x6210, 0x00b6, 0x2258, 0xba3c,
-	0x82ff, 0x0110, 0x8211, 0xba3e, 0x00be, 0x86ff, 0x0904, 0xbe8c,
-	0x9694, 0xff00, 0x9284, 0x0c00, 0x0120, 0x7048, 0xb092, 0x704c,
-	0xb08e, 0x9284, 0x0300, 0x0904, 0xbe8c, 0x9686, 0x0100, 0x1130,
-	0x7064, 0x9005, 0x1118, 0xc6c4, 0xb676, 0x0c38, 0x080c, 0x103b,
-	0x090c, 0x0d7d, 0x2900, 0xb07a, 0xb77c, 0x97bd, 0x0200, 0xb77e,
-	0xa867, 0x0103, 0xb068, 0xa86a, 0xb06c, 0xa86e, 0xb070, 0xa872,
-	0x7044, 0x9084, 0xf000, 0x9635, 0xae76, 0x968c, 0x0c00, 0x0120,
+	0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000,
+	0x2041, 0x127e, 0x080c, 0xb0ee, 0x0130, 0x00fe, 0x009e, 0x080c,
+	0xabc9, 0x00be, 0x0005, 0x080c, 0xb591, 0x0cb8, 0x2b78, 0x00f6,
+	0x080c, 0x31e4, 0x080c, 0xcf43, 0x00fe, 0x00c6, 0x080c, 0xab73,
+	0x2f00, 0x6012, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001,
+	0x6003, 0x0001, 0x2001, 0x0007, 0x080c, 0x656e, 0x080c, 0x659a,
+	0x080c, 0x91f4, 0x080c, 0x966f, 0x00ce, 0x0804, 0xb331, 0x2100,
+	0x91b2, 0x0053, 0x1a0c, 0x0d7d, 0x91b2, 0x0040, 0x1a04, 0xb3e7,
+	0x0002, 0xb3d5, 0xb3d5, 0xb3cb, 0xb3d5, 0xb3d5, 0xb3d5, 0xb3c9,
+	0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9,
+	0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9,
+	0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9,
+	0xb3d5, 0xb3c9, 0xb3d5, 0xb3d5, 0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9,
+	0xb3c9, 0xb3cb, 0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9,
+	0xb3c9, 0xb3c9, 0xb3c9, 0xb3d5, 0xb3d5, 0xb3c9, 0xb3c9, 0xb3c9,
+	0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9, 0xb3c9, 0xb3d5, 0xb3c9,
+	0xb3c9, 0x080c, 0x0d7d, 0x0066, 0x00b6, 0x6610, 0x2658, 0xb8d4,
+	0xc08c, 0xb8d6, 0x00be, 0x006e, 0x0000, 0x6003, 0x0001, 0x6106,
+	0x9186, 0x0032, 0x0118, 0x080c, 0x91f4, 0x0010, 0x080c, 0x91ed,
+	0x0126, 0x2091, 0x8000, 0x080c, 0x966f, 0x012e, 0x0005, 0x2600,
+	0x0002, 0xb3d5, 0xb3d5, 0xb3fb, 0xb3d5, 0xb3d5, 0xb3fb, 0xb3fb,
+	0xb3fb, 0xb3fb, 0xb3d5, 0xb3fb, 0xb3d5, 0xb3fb, 0xb3d5, 0xb3fb,
+	0xb3fb, 0xb3fb, 0xb3fb, 0x080c, 0x0d7d, 0x6004, 0x90b2, 0x0053,
+	0x1a0c, 0x0d7d, 0x91b6, 0x0013, 0x0904, 0xb4d2, 0x91b6, 0x0027,
+	0x1904, 0xb47e, 0x080c, 0x95ad, 0x6004, 0x080c, 0xca18, 0x01b0,
+	0x080c, 0xca29, 0x01a8, 0x908e, 0x0021, 0x0904, 0xb47b, 0x908e,
+	0x0022, 0x1130, 0x080c, 0xb005, 0x0904, 0xb477, 0x0804, 0xb478,
+	0x908e, 0x003d, 0x0904, 0xb47b, 0x0804, 0xb471, 0x080c, 0x3215,
+	0x2001, 0x0007, 0x080c, 0x656e, 0x6010, 0x00b6, 0x2058, 0xb9a0,
+	0x00be, 0x080c, 0xb591, 0x9186, 0x007e, 0x1148, 0x2001, 0x1837,
+	0x2014, 0xc285, 0x080c, 0x74d5, 0x1108, 0xc2ad, 0x2202, 0x080c,
+	0xa872, 0x0036, 0x0026, 0x2019, 0x0028, 0x2110, 0x080c, 0xe605,
+	0x002e, 0x003e, 0x0016, 0x0026, 0x0036, 0x2110, 0x2019, 0x0028,
+	0x080c, 0x9374, 0x0076, 0x903e, 0x080c, 0x9246, 0x6010, 0x00b6,
+	0x905d, 0x0100, 0x00be, 0x2c08, 0x080c, 0xdfc0, 0x007e, 0x003e,
+	0x002e, 0x001e, 0x080c, 0xa88e, 0x080c, 0xcf43, 0x0016, 0x080c,
+	0xcca0, 0x080c, 0xabc9, 0x001e, 0x080c, 0x32f5, 0x080c, 0x966f,
+	0x0030, 0x080c, 0xcca0, 0x080c, 0xabc9, 0x080c, 0x966f, 0x0005,
+	0x080c, 0xb591, 0x0cb0, 0x080c, 0xb5cd, 0x0c98, 0x9186, 0x0015,
+	0x0118, 0x9186, 0x0016, 0x1140, 0x080c, 0xaa84, 0x0d80, 0x9086,
+	0x0002, 0x0904, 0xb5d8, 0x0c58, 0x9186, 0x0014, 0x1d40, 0x080c,
+	0x95ad, 0x6004, 0x908e, 0x0022, 0x1118, 0x080c, 0xb005, 0x09f8,
+	0x080c, 0x31e4, 0x080c, 0xcf43, 0x080c, 0xca18, 0x1190, 0x080c,
+	0x3215, 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, 0xb591,
+	0x9186, 0x007e, 0x1128, 0x2001, 0x1837, 0x200c, 0xc185, 0x2102,
+	0x0800, 0x080c, 0xca29, 0x1120, 0x080c, 0xb591, 0x0804, 0xb471,
+	0x6004, 0x908e, 0x0032, 0x1160, 0x00e6, 0x00f6, 0x2071, 0x189e,
+	0x2079, 0x0000, 0x080c, 0x359e, 0x00fe, 0x00ee, 0x0804, 0xb471,
+	0x6004, 0x908e, 0x0021, 0x0d40, 0x908e, 0x0022, 0x090c, 0xb591,
+	0x0804, 0xb471, 0x90b2, 0x0040, 0x1a04, 0xb571, 0x2008, 0x0002,
+	0xb51a, 0xb51b, 0xb51e, 0xb521, 0xb524, 0xb527, 0xb518, 0xb518,
+	0xb518, 0xb518, 0xb518, 0xb518, 0xb518, 0xb518, 0xb518, 0xb518,
+	0xb518, 0xb518, 0xb518, 0xb518, 0xb518, 0xb518, 0xb518, 0xb518,
+	0xb518, 0xb518, 0xb518, 0xb518, 0xb518, 0xb518, 0xb52a, 0xb533,
+	0xb518, 0xb534, 0xb533, 0xb518, 0xb518, 0xb518, 0xb518, 0xb518,
+	0xb533, 0xb533, 0xb518, 0xb518, 0xb518, 0xb518, 0xb518, 0xb518,
+	0xb518, 0xb518, 0xb55c, 0xb533, 0xb518, 0xb52f, 0xb518, 0xb518,
+	0xb518, 0xb530, 0xb518, 0xb518, 0xb518, 0xb533, 0xb557, 0xb518,
+	0x080c, 0x0d7d, 0x00c0, 0x2001, 0x000b, 0x00e8, 0x2001, 0x0003,
+	0x00d0, 0x2001, 0x0005, 0x00b8, 0x2001, 0x0001, 0x00a0, 0x2001,
+	0x0009, 0x0088, 0x6003, 0x0005, 0x080c, 0x966f, 0x0058, 0x0018,
+	0x0010, 0x080c, 0x656e, 0x04b8, 0x080c, 0xcf46, 0x6003, 0x0004,
+	0x080c, 0x966f, 0x0005, 0x080c, 0x656e, 0x6003, 0x0002, 0x0036,
+	0x2019, 0x1852, 0x2304, 0x9084, 0xff00, 0x1120, 0x2001, 0x1986,
+	0x201c, 0x0040, 0x8007, 0x909a, 0x0004, 0x0ec0, 0x8003, 0x801b,
+	0x831b, 0x9318, 0x631a, 0x003e, 0x080c, 0x966f, 0x0c18, 0x080c,
+	0xcca0, 0x080c, 0xabc9, 0x08f0, 0x00e6, 0x00f6, 0x2071, 0x189e,
+	0x2079, 0x0000, 0x080c, 0x359e, 0x00fe, 0x00ee, 0x080c, 0x95ad,
+	0x080c, 0xabc9, 0x0878, 0x6003, 0x0002, 0x080c, 0xcf46, 0x0804,
+	0x966f, 0x2600, 0x2008, 0x0002, 0xb588, 0xb56b, 0xb586, 0xb56b,
+	0xb56b, 0xb586, 0xb586, 0xb586, 0xb586, 0xb56b, 0xb586, 0xb56b,
+	0xb586, 0xb56b, 0xb586, 0xb586, 0xb586, 0xb586, 0x080c, 0x0d7d,
+	0x0096, 0x6014, 0x2048, 0x080c, 0x6d70, 0x009e, 0x080c, 0xabc9,
+	0x0005, 0x00e6, 0x0096, 0x0026, 0x0016, 0x080c, 0xc814, 0x0568,
+	0x6014, 0x2048, 0xa864, 0x9086, 0x0139, 0x11a8, 0xa894, 0x9086,
+	0x0056, 0x1148, 0x080c, 0x5474, 0x0130, 0x2001, 0x0000, 0x900e,
+	0x2011, 0x4000, 0x0028, 0x2001, 0x0030, 0x900e, 0x2011, 0x4005,
+	0x080c, 0xce0d, 0x0090, 0xa868, 0xd0fc, 0x0178, 0xa807, 0x0000,
+	0x0016, 0x6004, 0x908e, 0x0021, 0x0168, 0x908e, 0x003d, 0x0150,
+	0x001e, 0xa867, 0x0103, 0xa833, 0x0100, 0x001e, 0x002e, 0x009e,
+	0x00ee, 0x0005, 0x001e, 0x0009, 0x0cc0, 0x0096, 0x6014, 0x2048,
+	0xa800, 0x2048, 0xa867, 0x0103, 0xa823, 0x8001, 0x009e, 0x0005,
+	0x00b6, 0x6610, 0x2658, 0xb804, 0x9084, 0x00ff, 0x90b2, 0x000c,
+	0x1a0c, 0x0d7d, 0x6604, 0x96b6, 0x004d, 0x1120, 0x080c, 0xcd2c,
+	0x0804, 0xb65d, 0x6604, 0x96b6, 0x0043, 0x1120, 0x080c, 0xcd75,
+	0x0804, 0xb65d, 0x6604, 0x96b6, 0x004b, 0x1120, 0x080c, 0xcda1,
+	0x0804, 0xb65d, 0x6604, 0x96b6, 0x0033, 0x1120, 0x080c, 0xccc2,
+	0x0804, 0xb65d, 0x6604, 0x96b6, 0x0028, 0x1120, 0x080c, 0xca62,
+	0x0804, 0xb65d, 0x6604, 0x96b6, 0x0029, 0x1120, 0x080c, 0xcaa3,
+	0x0804, 0xb65d, 0x6604, 0x96b6, 0x001f, 0x1120, 0x080c, 0xafae,
+	0x0804, 0xb65d, 0x6604, 0x96b6, 0x0000, 0x1118, 0x080c, 0xb2f5,
+	0x04e0, 0x6604, 0x96b6, 0x0022, 0x1118, 0x080c, 0xafe6, 0x04a8,
+	0x6604, 0x96b6, 0x0035, 0x1118, 0x080c, 0xb10c, 0x0470, 0x6604,
+	0x96b6, 0x0039, 0x1118, 0x080c, 0xb28a, 0x0438, 0x6604, 0x96b6,
+	0x003d, 0x1118, 0x080c, 0xb01e, 0x0400, 0x6604, 0x96b6, 0x0044,
+	0x1118, 0x080c, 0xb05a, 0x00c8, 0x6604, 0x96b6, 0x0049, 0x1118,
+	0x080c, 0xb09b, 0x0090, 0x6604, 0x96b6, 0x0041, 0x1118, 0x080c,
+	0xb085, 0x0058, 0x91b6, 0x0015, 0x1110, 0x0063, 0x0030, 0x91b6,
+	0x0016, 0x1128, 0x00be, 0x0804, 0xb8b7, 0x00be, 0x0005, 0x080c,
+	0xac85, 0x0cd8, 0xb67a, 0xb67d, 0xb67a, 0xb6c4, 0xb67a, 0xb82b,
+	0xb8c4, 0xb67a, 0xb67a, 0xb88d, 0xb67a, 0xb8a3, 0x0096, 0x601f,
+	0x0000, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, 0x009e,
+	0x0804, 0xabc9, 0xa001, 0xa001, 0x0005, 0x00e6, 0x2071, 0x1800,
+	0x7090, 0x9086, 0x0074, 0x1540, 0x080c, 0xdf91, 0x11b0, 0x6010,
+	0x00b6, 0x2058, 0x7030, 0xd08c, 0x0128, 0xb800, 0xd0bc, 0x0110,
+	0xc0c5, 0xb802, 0x00f9, 0x00be, 0x2001, 0x0006, 0x080c, 0x656e,
+	0x080c, 0x3215, 0x080c, 0xabc9, 0x0098, 0x2001, 0x000a, 0x080c,
+	0x656e, 0x080c, 0x3215, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c,
+	0x91f4, 0x080c, 0x966f, 0x0020, 0x2001, 0x0001, 0x080c, 0xb7fb,
+	0x00ee, 0x0005, 0x00d6, 0xb800, 0xd084, 0x0160, 0x9006, 0x080c,
+	0x655a, 0x2069, 0x1847, 0x6804, 0xd0a4, 0x0120, 0x2001, 0x0006,
+	0x080c, 0x659a, 0x00de, 0x0005, 0x00b6, 0x0096, 0x00d6, 0x2011,
+	0x1824, 0x2204, 0x9086, 0x0074, 0x1904, 0xb7d2, 0x6010, 0x2058,
+	0xbaa0, 0x9286, 0x007e, 0x1120, 0x080c, 0xba11, 0x0804, 0xb736,
+	0x080c, 0xba06, 0x6010, 0x2058, 0xbaa0, 0x9286, 0x0080, 0x1510,
+	0x6014, 0x9005, 0x01a8, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086,
+	0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c,
+	0xce0d, 0x0030, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200,
+	0x2001, 0x0006, 0x080c, 0x656e, 0x080c, 0x3215, 0x080c, 0xabc9,
+	0x0804, 0xb7d5, 0x080c, 0xb7e3, 0x6014, 0x9005, 0x0190, 0x2048,
+	0xa868, 0xd0f4, 0x01e8, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039,
+	0x1d08, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xce0d,
+	0x08f8, 0x080c, 0xb7d9, 0x0160, 0x9006, 0x080c, 0x655a, 0x2001,
+	0x0004, 0x080c, 0x659a, 0x2001, 0x0007, 0x080c, 0x656e, 0x08a0,
+	0x2001, 0x0004, 0x080c, 0x656e, 0x6003, 0x0001, 0x6007, 0x0003,
+	0x080c, 0x91f4, 0x080c, 0x966f, 0x0804, 0xb7d5, 0xb85c, 0xd0e4,
+	0x01d8, 0x080c, 0xcc3a, 0x080c, 0x74d5, 0x0118, 0xd0dc, 0x1904,
+	0xb6f8, 0x2011, 0x1837, 0x2204, 0xc0ad, 0x2012, 0x2001, 0x196d,
+	0x2004, 0x00f6, 0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, 0x266f,
+	0x78e2, 0x00fe, 0x0804, 0xb6f8, 0x080c, 0xcc7b, 0x2011, 0x1837,
+	0x2204, 0xc0a5, 0x2012, 0x0006, 0x080c, 0xe121, 0x000e, 0x1904,
+	0xb6f8, 0xc0b5, 0x2012, 0x2001, 0x0006, 0x080c, 0x656e, 0x9006,
+	0x080c, 0x655a, 0x00c6, 0x2001, 0x180f, 0x2004, 0xd09c, 0x0520,
+	0x00f6, 0x2079, 0x0100, 0x00e6, 0x2071, 0x1800, 0x700c, 0x9084,
+	0x00ff, 0x78e6, 0x707e, 0x7010, 0x78ea, 0x7082, 0x908c, 0x00ff,
+	0x00ee, 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x2644, 0x00f6,
+	0x2100, 0x900e, 0x080c, 0x25fb, 0x795e, 0x00fe, 0x9186, 0x0081,
+	0x01d8, 0x2009, 0x0081, 0x00c8, 0x2009, 0x00ef, 0x00f6, 0x2079,
+	0x0100, 0x79ea, 0x7932, 0x7936, 0x780c, 0xc0b5, 0x780e, 0x00fe,
+	0x080c, 0x2644, 0x00f6, 0x2079, 0x1800, 0x7982, 0x2100, 0x900e,
+	0x080c, 0x25fb, 0x795e, 0x00fe, 0x8108, 0x080c, 0x65bd, 0x2b00,
+	0x00ce, 0x1904, 0xb6f8, 0x6012, 0x2009, 0x180f, 0x210c, 0xd19c,
+	0x0150, 0x2009, 0x027c, 0x210c, 0x918c, 0x00ff, 0xb912, 0x2009,
+	0x027d, 0x210c, 0xb916, 0x2001, 0x0002, 0x080c, 0x656e, 0x6023,
+	0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x91f4, 0x080c,
+	0x966f, 0x0018, 0x2001, 0x0001, 0x0431, 0x00de, 0x009e, 0x00be,
+	0x0005, 0x2001, 0x1810, 0x2004, 0xd0a4, 0x0120, 0x2001, 0x1848,
+	0x2004, 0xd0ac, 0x0005, 0x00e6, 0x080c, 0xe65e, 0x0190, 0x2071,
+	0x0260, 0x7108, 0x720c, 0x918c, 0x00ff, 0x1118, 0x9284, 0xff00,
+	0x0140, 0x6010, 0x2058, 0xb8a0, 0x9084, 0xff80, 0x1110, 0xb912,
+	0xba16, 0x00ee, 0x0005, 0x2030, 0x9005, 0x0158, 0x2001, 0x0007,
+	0x080c, 0x656e, 0x080c, 0x56e7, 0x1120, 0x2001, 0x0007, 0x080c,
+	0x659a, 0x2600, 0x9005, 0x11b0, 0x6014, 0x0096, 0x2048, 0xa868,
+	0x009e, 0xd0fc, 0x1178, 0x0036, 0x0046, 0x6010, 0x00b6, 0x2058,
+	0xbba0, 0x00be, 0x2021, 0x0004, 0x2011, 0x8014, 0x080c, 0x4b00,
+	0x004e, 0x003e, 0x080c, 0x3215, 0x6020, 0x9086, 0x000a, 0x1108,
+	0x0005, 0x0804, 0xabc9, 0x00b6, 0x00e6, 0x0026, 0x0016, 0x2071,
+	0x1800, 0x7090, 0x9086, 0x0014, 0x1904, 0xb883, 0x080c, 0x56e7,
+	0x1170, 0x6014, 0x9005, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058,
+	0xbba0, 0x2021, 0x0006, 0x080c, 0x4cb7, 0x004e, 0x003e, 0x00d6,
+	0x6010, 0x2058, 0x080c, 0x66b9, 0x080c, 0xb6b2, 0x00de, 0x080c,
+	0xbad7, 0x1588, 0x6010, 0x2058, 0xb890, 0x9005, 0x0560, 0x2001,
+	0x0006, 0x080c, 0x656e, 0x0096, 0x6014, 0x904d, 0x01d0, 0xa864,
+	0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0000, 0x900e,
+	0x2011, 0x4000, 0x080c, 0xce0d, 0x0060, 0xa864, 0x9084, 0x00ff,
+	0x9086, 0x0029, 0x0130, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833,
+	0x0200, 0x009e, 0x080c, 0x3215, 0x6020, 0x9086, 0x000a, 0x0140,
+	0x080c, 0xabc9, 0x0028, 0x080c, 0xb591, 0x9006, 0x080c, 0xb7fb,
+	0x001e, 0x002e, 0x00ee, 0x00be, 0x0005, 0x2011, 0x1824, 0x2204,
+	0x9086, 0x0014, 0x1160, 0x2001, 0x0002, 0x080c, 0x656e, 0x6003,
+	0x0001, 0x6007, 0x0001, 0x080c, 0x91f4, 0x0804, 0x966f, 0x2001,
+	0x0001, 0x0804, 0xb7fb, 0x2030, 0x2011, 0x1824, 0x2204, 0x9086,
+	0x0004, 0x1148, 0x96b6, 0x000b, 0x1120, 0x2001, 0x0007, 0x080c,
+	0x656e, 0x0804, 0xabc9, 0x2001, 0x0001, 0x0804, 0xb7fb, 0x0002,
+	0xb67a, 0xb8cf, 0xb67a, 0xb910, 0xb67a, 0xb9bd, 0xb8c4, 0xb67a,
+	0xb67a, 0xb9d1, 0xb67a, 0xb9e3, 0x6604, 0x9686, 0x0003, 0x0904,
+	0xb82b, 0x96b6, 0x001e, 0x1110, 0x080c, 0xabc9, 0x0005, 0x00b6,
+	0x00d6, 0x00c6, 0x080c, 0xb9f5, 0x11a0, 0x9006, 0x080c, 0x655a,
+	0x080c, 0x31e4, 0x080c, 0xcf43, 0x2001, 0x0002, 0x080c, 0x656e,
+	0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x91f4, 0x080c, 0x966f,
+	0x0418, 0x2009, 0x026e, 0x2104, 0x9086, 0x0009, 0x1160, 0x6010,
+	0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0170, 0x8001, 0xb842,
+	0x601b, 0x000a, 0x0088, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00,
+	0x9086, 0x1900, 0x1108, 0x08a0, 0x080c, 0x31e4, 0x080c, 0xcf43,
+	0x2001, 0x0001, 0x080c, 0xb7fb, 0x00ce, 0x00de, 0x00be, 0x0005,
+	0x0096, 0x00b6, 0x0026, 0x9016, 0x080c, 0xba03, 0x00d6, 0x2069,
+	0x197c, 0x2d04, 0x9005, 0x0168, 0x6010, 0x2058, 0xb8a0, 0x9086,
+	0x007e, 0x1138, 0x2069, 0x1820, 0x2d04, 0x8000, 0x206a, 0x00de,
+	0x0010, 0x00de, 0x0088, 0x9006, 0x080c, 0x655a, 0x2001, 0x0002,
+	0x080c, 0x656e, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x91f4,
+	0x080c, 0x966f, 0x0804, 0xb98d, 0x080c, 0xc814, 0x01b0, 0x6014,
+	0x2048, 0xa864, 0x2010, 0x9086, 0x0139, 0x1138, 0x6007, 0x0016,
+	0x2001, 0x0002, 0x080c, 0xce67, 0x00b0, 0x6014, 0x2048, 0xa864,
+	0xd0fc, 0x0118, 0x2001, 0x0001, 0x0ca8, 0x2001, 0x180e, 0x2004,
+	0xd0dc, 0x0148, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005,
+	0x1110, 0x9006, 0x0c38, 0x080c, 0xb591, 0x2009, 0x026e, 0x2134,
+	0x96b4, 0x00ff, 0x9686, 0x0005, 0x0520, 0x9686, 0x000b, 0x01c8,
+	0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x1118, 0x9686, 0x0009,
+	0x01c0, 0x9086, 0x1900, 0x1168, 0x9686, 0x0009, 0x0190, 0x2001,
+	0x0004, 0x080c, 0x656e, 0x2001, 0x0028, 0x601a, 0x6007, 0x0052,
+	0x0020, 0x2001, 0x0001, 0x080c, 0xb7fb, 0x002e, 0x00be, 0x009e,
+	0x0005, 0x9286, 0x0139, 0x0160, 0x6014, 0x2048, 0x080c, 0xc814,
+	0x0140, 0xa864, 0x9086, 0x0139, 0x0118, 0xa868, 0xd0fc, 0x0108,
+	0x0c40, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0138,
+	0x8001, 0xb842, 0x601b, 0x000a, 0x6007, 0x0016, 0x08f0, 0xb8a0,
+	0x9086, 0x007e, 0x1138, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5fb5,
+	0x00ee, 0x0010, 0x080c, 0x31e4, 0x0860, 0x080c, 0xba03, 0x1160,
+	0x2001, 0x0004, 0x080c, 0x656e, 0x6003, 0x0001, 0x6007, 0x0003,
+	0x080c, 0x91f4, 0x0804, 0x966f, 0x080c, 0xb591, 0x9006, 0x0804,
+	0xb7fb, 0x0489, 0x1160, 0x2001, 0x0008, 0x080c, 0x656e, 0x6003,
+	0x0001, 0x6007, 0x0005, 0x080c, 0x91f4, 0x0804, 0x966f, 0x2001,
+	0x0001, 0x0804, 0xb7fb, 0x00f9, 0x1160, 0x2001, 0x000a, 0x080c,
+	0x656e, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x91f4, 0x0804,
+	0x966f, 0x2001, 0x0001, 0x0804, 0xb7fb, 0x2009, 0x026e, 0x2104,
+	0x9086, 0x0003, 0x1138, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00,
+	0x9086, 0x2a00, 0x0005, 0x9085, 0x0001, 0x0005, 0x00b6, 0x00c6,
+	0x0016, 0x6110, 0x2158, 0x080c, 0x662d, 0x001e, 0x00ce, 0x00be,
+	0x0005, 0x00b6, 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, 0x6010,
+	0x2058, 0x2009, 0x1837, 0x2104, 0x9085, 0x0003, 0x200a, 0x080c,
+	0xbaa9, 0x0560, 0x2009, 0x1837, 0x2104, 0xc0cd, 0x200a, 0x080c,
+	0x6a57, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xe29e,
+	0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009,
+	0x0001, 0x080c, 0x31a3, 0x00e6, 0x2071, 0x1800, 0x080c, 0x2fb2,
+	0x00ee, 0x00c6, 0x0156, 0x20a9, 0x0781, 0x2009, 0x007f, 0x080c,
+	0x32f5, 0x8108, 0x1f04, 0xba47, 0x015e, 0x00ce, 0x080c, 0xba06,
+	0x2071, 0x0260, 0x2079, 0x0200, 0x7817, 0x0001, 0x2001, 0x1837,
+	0x200c, 0xc1c5, 0x7018, 0xd0fc, 0x0110, 0xd0dc, 0x0118, 0x7038,
+	0xd0dc, 0x1108, 0xc1c4, 0x7817, 0x0000, 0x2001, 0x1837, 0x2102,
+	0x2079, 0x0100, 0x2e04, 0x9084, 0x00ff, 0x2069, 0x181f, 0x206a,
+	0x78e6, 0x0006, 0x8e70, 0x2e04, 0x2069, 0x1820, 0x206a, 0x78ea,
+	0x7832, 0x7836, 0x2010, 0x9084, 0xff00, 0x001e, 0x9105, 0x2009,
+	0x182c, 0x200a, 0x2200, 0x9084, 0x00ff, 0x2008, 0x080c, 0x2644,
+	0x080c, 0x74d5, 0x0170, 0x2071, 0x0260, 0x2069, 0x1982, 0x7048,
+	0x206a, 0x704c, 0x6806, 0x7050, 0x680a, 0x7054, 0x680e, 0x080c,
+	0xcc3a, 0x0040, 0x2001, 0x0006, 0x080c, 0x656e, 0x080c, 0x3215,
+	0x080c, 0xabc9, 0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x00be,
+	0x0005, 0x0096, 0x0026, 0x0036, 0x00e6, 0x0156, 0x2019, 0x182c,
+	0x231c, 0x83ff, 0x01f0, 0x2071, 0x0260, 0x7200, 0x9294, 0x00ff,
+	0x7004, 0x9084, 0xff00, 0x9205, 0x9306, 0x1198, 0x2011, 0x0276,
+	0x20a9, 0x0004, 0x2b48, 0x2019, 0x000a, 0x080c, 0xbb9e, 0x1148,
+	0x2011, 0x027a, 0x20a9, 0x0004, 0x2019, 0x0006, 0x080c, 0xbb9e,
+	0x1100, 0x015e, 0x00ee, 0x003e, 0x002e, 0x009e, 0x0005, 0x00e6,
+	0x2071, 0x0260, 0x7034, 0x9086, 0x0014, 0x11a8, 0x7038, 0x9086,
+	0x0800, 0x1188, 0x703c, 0xd0ec, 0x0160, 0x9084, 0x0f00, 0x9086,
+	0x0100, 0x1138, 0x7054, 0xd0a4, 0x1110, 0xd0ac, 0x0110, 0x9006,
+	0x0010, 0x9085, 0x0001, 0x00ee, 0x0005, 0x00e6, 0x0096, 0x00c6,
+	0x0076, 0x0056, 0x0046, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000,
+	0x2029, 0x19f3, 0x252c, 0x2021, 0x19fa, 0x2424, 0x2061, 0x1ddc,
+	0x2071, 0x1800, 0x7254, 0x7074, 0x9202, 0x1a04, 0xbb6a, 0x080c,
+	0x8b5f, 0x0904, 0xbb63, 0x080c, 0xe2cf, 0x0904, 0xbb63, 0x6720,
+	0x9786, 0x0007, 0x0904, 0xbb63, 0x2500, 0x9c06, 0x0904, 0xbb63,
+	0x2400, 0x9c06, 0x0904, 0xbb63, 0x3e08, 0x9186, 0x0002, 0x1148,
+	0x6010, 0x9005, 0x0130, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc,
+	0x1590, 0x00c6, 0x6043, 0xffff, 0x6000, 0x9086, 0x0004, 0x1110,
+	0x080c, 0x1a6a, 0x9786, 0x000a, 0x0148, 0x080c, 0xca29, 0x1130,
+	0x00ce, 0x080c, 0xb591, 0x080c, 0xac04, 0x00e8, 0x6014, 0x2048,
+	0x080c, 0xc814, 0x01a8, 0x9786, 0x0003, 0x1530, 0xa867, 0x0103,
+	0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fec,
+	0x009e, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6d64, 0x080c, 0xca03,
+	0x080c, 0xac04, 0x00ce, 0x9ce0, 0x001c, 0x7068, 0x9c02, 0x1210,
+	0x0804, 0xbb0a, 0x012e, 0x000e, 0x002e, 0x004e, 0x005e, 0x007e,
+	0x00ce, 0x009e, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1118, 0x080c,
+	0xe241, 0x0c30, 0x9786, 0x0009, 0x1148, 0x6000, 0x9086, 0x0004,
+	0x0d08, 0x2009, 0x004c, 0x080c, 0xac68, 0x08e0, 0x9786, 0x000a,
+	0x0938, 0x0820, 0x220c, 0x2304, 0x9106, 0x1130, 0x8210, 0x8318,
+	0x1f04, 0xbb8a, 0x9006, 0x0005, 0x2304, 0x9102, 0x0218, 0x2001,
+	0x0001, 0x0008, 0x9006, 0x918d, 0x0001, 0x0005, 0x0136, 0x01c6,
+	0x0016, 0x8906, 0x8006, 0x8007, 0x908c, 0x003f, 0x21e0, 0x9084,
+	0xffc0, 0x9300, 0x2098, 0x3518, 0x20a9, 0x0001, 0x220c, 0x4002,
+	0x910e, 0x1140, 0x8210, 0x8319, 0x1dc8, 0x9006, 0x001e, 0x01ce,
+	0x013e, 0x0005, 0x220c, 0x9102, 0x0218, 0x2001, 0x0001, 0x0010,
+	0x2001, 0x0000, 0x918d, 0x0001, 0x001e, 0x01ce, 0x013e, 0x0005,
+	0x220c, 0x810f, 0x2304, 0x9106, 0x1130, 0x8210, 0x8318, 0x1f04,
+	0xbbc8, 0x9006, 0x0005, 0x918d, 0x0001, 0x0005, 0x6004, 0x908a,
+	0x0053, 0x1a0c, 0x0d7d, 0x080c, 0xca18, 0x0120, 0x080c, 0xca29,
+	0x0158, 0x0028, 0x080c, 0x3215, 0x080c, 0xca29, 0x0128, 0x080c,
+	0x95ad, 0x080c, 0xabc9, 0x0005, 0x080c, 0xb591, 0x0cc0, 0x9182,
+	0x0057, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xbc0e,
+	0xbc0e, 0xbc0e, 0xbc0e, 0xbc0e, 0xbc0e, 0xbc0e, 0xbc0e, 0xbc0e,
+	0xbc0e, 0xbc0e, 0xbc10, 0xbc10, 0xbc10, 0xbc10, 0xbc0e, 0xbc0e,
+	0xbc0e, 0xbc10, 0xbc0e, 0xbc0e, 0xbc0e, 0xbc0e, 0x080c, 0x0d7d,
+	0x600b, 0xffff, 0x6003, 0x000f, 0x6106, 0x0126, 0x2091, 0x8000,
+	0x080c, 0xcf46, 0x2009, 0x8000, 0x080c, 0x91ed, 0x012e, 0x0005,
+	0x9186, 0x0013, 0x1128, 0x6004, 0x9082, 0x0040, 0x0804, 0xbc95,
+	0x9186, 0x0027, 0x1520, 0x080c, 0x95ad, 0x080c, 0x31e4, 0x080c,
+	0xcf43, 0x0096, 0x6114, 0x2148, 0x080c, 0xc814, 0x0198, 0x080c,
+	0xca29, 0x1118, 0x080c, 0xb591, 0x0068, 0xa867, 0x0103, 0xa87b,
+	0x0029, 0xa877, 0x0000, 0xa97c, 0xc1c5, 0xa97e, 0x080c, 0x6d70,
+	0x080c, 0xca03, 0x009e, 0x080c, 0xabc9, 0x0804, 0x966f, 0x9186,
+	0x0014, 0x1120, 0x6004, 0x9082, 0x0040, 0x0018, 0x080c, 0x0d7d,
+	0x0005, 0x0002, 0xbc73, 0xbc71, 0xbc71, 0xbc71, 0xbc71, 0xbc71,
+	0xbc71, 0xbc71, 0xbc71, 0xbc71, 0xbc71, 0xbc8c, 0xbc8c, 0xbc8c,
+	0xbc8c, 0xbc71, 0xbc8c, 0xbc71, 0xbc8c, 0xbc71, 0xbc71, 0xbc71,
+	0xbc71, 0x080c, 0x0d7d, 0x080c, 0x95ad, 0x0096, 0x6114, 0x2148,
+	0x080c, 0xc814, 0x0168, 0xa867, 0x0103, 0xa87b, 0x0006, 0xa877,
+	0x0000, 0xa880, 0xc0ec, 0xa882, 0x080c, 0x6d70, 0x080c, 0xca03,
+	0x009e, 0x080c, 0xabc9, 0x0005, 0x080c, 0x95ad, 0x080c, 0xca29,
+	0x090c, 0xb591, 0x080c, 0xabc9, 0x0005, 0x0002, 0xbcaf, 0xbcad,
+	0xbcad, 0xbcad, 0xbcad, 0xbcad, 0xbcad, 0xbcad, 0xbcad, 0xbcad,
+	0xbcad, 0xbcb1, 0xbcb1, 0xbcb1, 0xbcb1, 0xbcad, 0xbcb3, 0xbcad,
+	0xbcb1, 0xbcad, 0xbcad, 0xbcad, 0xbcad, 0x080c, 0x0d7d, 0x080c,
+	0x0d7d, 0x080c, 0x0d7d, 0x080c, 0xabc9, 0x0804, 0x966f, 0x9182,
+	0x0057, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xbcd6,
+	0xbcd6, 0xbcd6, 0xbcd6, 0xbcd6, 0xbd0f, 0xbdfe, 0xbcd6, 0xbe0a,
+	0xbcd6, 0xbcd6, 0xbcd6, 0xbcd6, 0xbcd6, 0xbcd6, 0xbcd6, 0xbcd6,
+	0xbcd6, 0xbcd6, 0xbe0a, 0xbcd8, 0xbcd6, 0xbe08, 0x080c, 0x0d7d,
+	0x00b6, 0x0096, 0x6114, 0x2148, 0x6010, 0x2058, 0xb800, 0xd0bc,
+	0x1508, 0xa87b, 0x0000, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87c,
+	0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xbe8f, 0x080c,
+	0x6b86, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e,
+	0xb8d0, 0x9005, 0x0110, 0x080c, 0x6749, 0x080c, 0xabc9, 0x009e,
+	0x00be, 0x0005, 0xa87c, 0xd0ac, 0x09e0, 0xa838, 0xa934, 0x9105,
+	0x09c0, 0xa880, 0xd0bc, 0x19a8, 0x080c, 0xcb59, 0x0c80, 0x00b6,
+	0x0096, 0x6114, 0x2148, 0x601c, 0xd0fc, 0x1110, 0x7644, 0x0008,
+	0x9036, 0x96b4, 0x0fff, 0x86ff, 0x1590, 0x6010, 0x2058, 0xb800,
+	0xd0bc, 0x1904, 0xbded, 0xa87b, 0x0000, 0xa867, 0x0103, 0xae76,
+	0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xbe8f,
+	0x080c, 0x6b86, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211,
+	0xba3e, 0xb8d0, 0x9005, 0x0110, 0x080c, 0x6749, 0x601c, 0xd0fc,
+	0x1148, 0x7044, 0xd0e4, 0x1904, 0xbdd1, 0x080c, 0xabc9, 0x009e,
+	0x00be, 0x0005, 0x2009, 0x0211, 0x210c, 0x080c, 0x0d7d, 0x968c,
+	0x0c00, 0x0150, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xbdd5,
 	0x7348, 0xab92, 0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002,
-	0x0180, 0x9186, 0x0028, 0x1118, 0xa87b, 0x001c, 0x0060, 0xd6dc,
-	0x0118, 0xa87b, 0x0015, 0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007,
-	0x0010, 0xa87b, 0x0000, 0xaf7e, 0xb080, 0xa882, 0xb084, 0xa886,
-	0x901e, 0xd6c4, 0x0190, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a,
+	0x0508, 0x9186, 0x0028, 0x1118, 0xa87b, 0x001c, 0x00e8, 0xd6dc,
+	0x01a0, 0xa87b, 0x0015, 0xa87c, 0xd0ac, 0x0170, 0xa938, 0xaa34,
+	0x2100, 0x9205, 0x0148, 0x7048, 0x9106, 0x1118, 0x704c, 0x9206,
+	0x0118, 0xa992, 0xaa8e, 0xc6dc, 0x0038, 0xd6d4, 0x0118, 0xa87b,
+	0x0007, 0x0010, 0xa87b, 0x0000, 0xa867, 0x0103, 0xae76, 0x901e,
+	0xd6c4, 0x01d8, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118,
+	0xc6c4, 0x0804, 0xbd1b, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a,
 	0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0x0018,
-	0x2011, 0x0025, 0x080c, 0xc2f6, 0x003e, 0xd6cc, 0x01e8, 0x7154,
-	0xa98a, 0x81ff, 0x01c8, 0x9192, 0x0021, 0x1260, 0x8304, 0x9098,
-	0x0018, 0x2011, 0x0029, 0x080c, 0xc2f6, 0x2011, 0x0205, 0x2013,
-	0x0000, 0x0050, 0xb068, 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a,
-	0x0c68, 0x2950, 0x080c, 0xc295, 0x080c, 0x1a31, 0x009e, 0x00ee,
-	0x00ae, 0x007e, 0x0005, 0x2001, 0x1986, 0x2004, 0x604a, 0x0096,
-	0x6114, 0x2148, 0xa83c, 0xa940, 0x9105, 0x1118, 0xa87c, 0xc0dc,
-	0xa87e, 0x6003, 0x0002, 0x080c, 0xce5b, 0x0904, 0xbfd2, 0x604b,
-	0x0000, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1500,
-	0xd1cc, 0x0904, 0xbf91, 0xa978, 0xa868, 0xd0fc, 0x0904, 0xbf52,
-	0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, 0x00a6, 0x2150, 0xb174,
-	0x9184, 0x00ff, 0x90b6, 0x0002, 0x0904, 0xbf20, 0x9086, 0x0028,
-	0x1904, 0xbf0c, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x0804, 0xbf28,
-	0x6024, 0xd0f4, 0x11d0, 0xa838, 0xaa34, 0x9205, 0x09c8, 0xa838,
-	0xaa90, 0x9206, 0x1120, 0xa88c, 0xaa34, 0x9206, 0x0988, 0x6024,
-	0xd0d4, 0x1148, 0xa9ac, 0xa834, 0x9102, 0x603a, 0xa9b0, 0xa838,
-	0x9103, 0x603e, 0x6024, 0xc0f5, 0x6026, 0x6010, 0x00b6, 0x2058,
-	0xb83c, 0x8000, 0xb83e, 0x00be, 0x601c, 0xc0fc, 0x601e, 0x9006,
-	0xa876, 0xa892, 0xa88e, 0xa87c, 0xc0e4, 0xa87e, 0xd0cc, 0x0140,
-	0xc0cc, 0xa87e, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fed, 0x009e,
-	0x080c, 0xca61, 0x0804, 0xbfd2, 0xd1dc, 0x0158, 0xa87b, 0x0015,
-	0xb07b, 0x0015, 0x080c, 0xccfd, 0x0118, 0xb174, 0xc1dc, 0xb176,
+	0x2011, 0x0025, 0x080c, 0xc3e7, 0x003e, 0xd6cc, 0x0904, 0xbd30,
+	0x7154, 0xa98a, 0x81ff, 0x0904, 0xbd30, 0x9192, 0x0021, 0x1278,
+	0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xc3e7, 0x2011,
+	0x0205, 0x2013, 0x0000, 0x080c, 0xced3, 0x0804, 0xbd30, 0xa868,
+	0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c50, 0x00a6, 0x2950,
+	0x080c, 0xc386, 0x00ae, 0x080c, 0xced3, 0x080c, 0xc3d7, 0x0804,
+	0xbd32, 0x080c, 0xcb1c, 0x0804, 0xbd47, 0xa87c, 0xd0ac, 0x0904,
+	0xbd58, 0xa880, 0xd0bc, 0x1904, 0xbd58, 0x7348, 0xa838, 0x9306,
+	0x11c8, 0x734c, 0xa834, 0x931e, 0x0904, 0xbd58, 0xd6d4, 0x0190,
+	0xab38, 0x9305, 0x0904, 0xbd58, 0x0068, 0xa87c, 0xd0ac, 0x0904,
+	0xbd23, 0xa838, 0xa934, 0x9105, 0x0904, 0xbd23, 0xa880, 0xd0bc,
+	0x1904, 0xbd23, 0x080c, 0xcb59, 0x0804, 0xbd47, 0x00f6, 0x2079,
+	0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x00fe, 0x0021, 0x0005,
+	0x0011, 0x0005, 0x0005, 0x0096, 0x6003, 0x0002, 0x6007, 0x0043,
+	0x6014, 0x2048, 0xa87c, 0xd0ac, 0x0128, 0x009e, 0x0005, 0x2130,
+	0x2228, 0x0058, 0x2400, 0xa9ac, 0x910a, 0x2300, 0xaab0, 0x9213,
+	0x2600, 0x9102, 0x2500, 0x9203, 0x0e90, 0xac46, 0xab4a, 0xae36,
+	0xad3a, 0x6044, 0xd0fc, 0x190c, 0xa89b, 0x604b, 0x0000, 0x080c,
+	0x1c30, 0x1118, 0x6144, 0x080c, 0x9219, 0x009e, 0x0005, 0x9182,
+	0x0057, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xbe56,
+	0xbe56, 0xbe56, 0xbe56, 0xbe56, 0xbe56, 0xbe56, 0xbe56, 0xbe56,
+	0xbe56, 0xbe58, 0xbe56, 0xbe56, 0xbe56, 0xbe56, 0xbe69, 0xbe56,
+	0xbe56, 0xbe56, 0xbe56, 0xbe8d, 0xbe56, 0xbe56, 0x080c, 0x0d7d,
+	0x6004, 0x9086, 0x0040, 0x1110, 0x080c, 0x95ad, 0x2019, 0x0001,
+	0x080c, 0xa0f4, 0x6003, 0x0002, 0x080c, 0xcf4b, 0x080c, 0x960a,
+	0x0005, 0x6004, 0x9086, 0x0040, 0x1110, 0x080c, 0x95ad, 0x2019,
+	0x0001, 0x080c, 0xa0f4, 0x080c, 0x960a, 0x080c, 0x31e4, 0x080c,
+	0xcf43, 0x0096, 0x6114, 0x2148, 0x080c, 0xc814, 0x0150, 0xa867,
+	0x0103, 0xa87b, 0x0029, 0xa877, 0x0000, 0x080c, 0x6d70, 0x080c,
+	0xca03, 0x009e, 0x080c, 0xabc9, 0x0005, 0x080c, 0x0d7d, 0xa87b,
+	0x0015, 0xd1fc, 0x0180, 0xa87b, 0x0007, 0x8002, 0x8000, 0x810a,
+	0x9189, 0x0000, 0x0006, 0x0016, 0x2009, 0x1a78, 0x2104, 0x8000,
+	0x200a, 0x001e, 0x000e, 0xa992, 0xa88e, 0x0005, 0x9182, 0x0057,
+	0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xbec5, 0xbec5,
+	0xbec5, 0xbec5, 0xbec5, 0xbec7, 0xbec5, 0xbec5, 0xbf84, 0xbec5,
+	0xbec5, 0xbec5, 0xbec5, 0xbec5, 0xbec5, 0xbec5, 0xbec5, 0xbec5,
+	0xbec5, 0xc0c8, 0xbec5, 0xc0d2, 0xbec5, 0x080c, 0x0d7d, 0x601c,
+	0xd0bc, 0x0178, 0xd084, 0x0168, 0xd0f4, 0x0120, 0xc084, 0x601e,
+	0x0804, 0xbcb7, 0x6114, 0x0096, 0x2148, 0xa87c, 0xc0e5, 0xa87e,
+	0x009e, 0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260, 0x6114,
+	0x2150, 0x601c, 0xd0fc, 0x1110, 0x7644, 0x0008, 0x9036, 0xb676,
+	0x96b4, 0x0fff, 0xb77c, 0xc7e5, 0xb77e, 0x6210, 0x00b6, 0x2258,
+	0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0x00be, 0x86ff, 0x0904,
+	0xbf7d, 0x9694, 0xff00, 0x9284, 0x0c00, 0x0120, 0x7048, 0xb092,
+	0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, 0xbf7d, 0x9686, 0x0100,
+	0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4, 0xb676, 0x0c38, 0x080c,
+	0x103a, 0x090c, 0x0d7d, 0x2900, 0xb07a, 0xb77c, 0x97bd, 0x0200,
+	0xb77e, 0xa867, 0x0103, 0xb068, 0xa86a, 0xb06c, 0xa86e, 0xb070,
+	0xa872, 0x7044, 0x9084, 0xf000, 0x9635, 0xae76, 0x968c, 0x0c00,
+	0x0120, 0x7348, 0xab92, 0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186,
+	0x0002, 0x0180, 0x9186, 0x0028, 0x1118, 0xa87b, 0x001c, 0x0060,
+	0xd6dc, 0x0118, 0xa87b, 0x0015, 0x0038, 0xd6d4, 0x0118, 0xa87b,
+	0x0007, 0x0010, 0xa87b, 0x0000, 0xaf7e, 0xb080, 0xa882, 0xb084,
+	0xa886, 0x901e, 0xd6c4, 0x0190, 0x735c, 0xab86, 0x83ff, 0x0170,
+	0x938a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019,
+	0x0018, 0x2011, 0x0025, 0x080c, 0xc3e7, 0x003e, 0xd6cc, 0x01e8,
+	0x7154, 0xa98a, 0x81ff, 0x01c8, 0x9192, 0x0021, 0x1260, 0x8304,
+	0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xc3e7, 0x2011, 0x0205,
+	0x2013, 0x0000, 0x0050, 0xb068, 0xd0fc, 0x0120, 0x2009, 0x0020,
+	0xa98a, 0x0c68, 0x2950, 0x080c, 0xc386, 0x080c, 0x1a48, 0x009e,
+	0x00ee, 0x00ae, 0x007e, 0x0005, 0x2001, 0x1988, 0x2004, 0x604a,
+	0x0096, 0x6114, 0x2148, 0xa83c, 0xa940, 0x9105, 0x1118, 0xa87c,
+	0xc0dc, 0xa87e, 0x6003, 0x0002, 0x080c, 0xcf54, 0x0904, 0xc0c3,
+	0x604b, 0x0000, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc,
+	0x1500, 0xd1cc, 0x0904, 0xc082, 0xa978, 0xa868, 0xd0fc, 0x0904,
+	0xc043, 0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, 0x00a6, 0x2150,
+	0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x0904, 0xc011, 0x9086,
+	0x0028, 0x1904, 0xbffd, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x0804,
+	0xc019, 0x6024, 0xd0f4, 0x11d0, 0xa838, 0xaa34, 0x9205, 0x09c8,
+	0xa838, 0xaa90, 0x9206, 0x1120, 0xa88c, 0xaa34, 0x9206, 0x0988,
+	0x6024, 0xd0d4, 0x1148, 0xa9ac, 0xa834, 0x9102, 0x603a, 0xa9b0,
+	0xa838, 0x9103, 0x603e, 0x6024, 0xc0f5, 0x6026, 0x6010, 0x00b6,
+	0x2058, 0xb83c, 0x8000, 0xb83e, 0x00be, 0x601c, 0xc0fc, 0x601e,
+	0x9006, 0xa876, 0xa892, 0xa88e, 0xa87c, 0xc0e4, 0xa87e, 0xd0cc,
+	0x0140, 0xc0cc, 0xa87e, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fec,
+	0x009e, 0x080c, 0xcb59, 0x0804, 0xc0c3, 0xd1dc, 0x0158, 0xa87b,
+	0x0015, 0xb07b, 0x0015, 0x080c, 0xcdf6, 0x0118, 0xb174, 0xc1dc,
+	0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, 0x0007,
+	0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c,
+	0xbe8f, 0xa87c, 0xb07e, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa860,
+	0x20e8, 0xa85c, 0x9080, 0x0019, 0x20a0, 0x20a9, 0x0020, 0x8a06,
+	0x8006, 0x8007, 0x9094, 0x003f, 0x22e0, 0x9084, 0xffc0, 0x9080,
+	0x0019, 0x2098, 0x4003, 0x00ae, 0x000e, 0xa882, 0x000e, 0xa87e,
+	0x080c, 0xced3, 0x001e, 0xa874, 0x0006, 0x2148, 0x080c, 0x0fec,
+	0x001e, 0x0804, 0xc0af, 0x0016, 0x00a6, 0x2150, 0xb174, 0x9184,
+	0x00ff, 0x90b6, 0x0002, 0x01e0, 0x9086, 0x0028, 0x1128, 0xa87b,
+	0x001c, 0xb07b, 0x001c, 0x00e0, 0xd1dc, 0x0158, 0xa87b, 0x0015,
+	0xb07b, 0x0015, 0x080c, 0xcdf6, 0x0118, 0xb174, 0xc1dc, 0xb176,
 	0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, 0x0007, 0x0040,
-	0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xbd9e,
-	0xa87c, 0xb07e, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa860, 0x20e8,
-	0xa85c, 0x9080, 0x0019, 0x20a0, 0x20a9, 0x0020, 0x8a06, 0x8006,
-	0x8007, 0x9094, 0x003f, 0x22e0, 0x9084, 0xffc0, 0x9080, 0x0019,
-	0x2098, 0x4003, 0x00ae, 0x000e, 0xa882, 0x000e, 0xa87e, 0x080c,
-	0xcdda, 0x001e, 0xa874, 0x0006, 0x2148, 0x080c, 0x0fed, 0x001e,
-	0x0804, 0xbfbe, 0x0016, 0x00a6, 0x2150, 0xb174, 0x9184, 0x00ff,
-	0x90b6, 0x0002, 0x01e0, 0x9086, 0x0028, 0x1128, 0xa87b, 0x001c,
-	0xb07b, 0x001c, 0x00e0, 0xd1dc, 0x0158, 0xa87b, 0x0015, 0xb07b,
-	0x0015, 0x080c, 0xccfd, 0x0118, 0xb174, 0xc1dc, 0xb176, 0x0078,
-	0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, 0x0007, 0x0040, 0xa87c,
-	0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xbd9e, 0xa890,
-	0xb092, 0xa88c, 0xb08e, 0xa87c, 0xb07e, 0x00ae, 0x080c, 0x0fed,
-	0x009e, 0x080c, 0xcdda, 0xa974, 0x0016, 0x080c, 0xc2e6, 0x001e,
-	0x0468, 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff, 0x90b6, 0x0002,
-	0x01b0, 0x9086, 0x0028, 0x1118, 0xa87b, 0x001c, 0x00d0, 0xd1dc,
-	0x0148, 0xa87b, 0x0015, 0x080c, 0xccfd, 0x0118, 0xa974, 0xc1dc,
-	0xa976, 0x0078, 0xd1d4, 0x0118, 0xa87b, 0x0007, 0x0050, 0xa87b,
-	0x0000, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c,
-	0xbd9e, 0xa974, 0x0016, 0x080c, 0x6a95, 0x001e, 0x6010, 0x00b6,
-	0x2058, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0xb8d0, 0x9005,
-	0x0120, 0x0016, 0x080c, 0x6658, 0x001e, 0x00be, 0xd1e4, 0x1120,
-	0x080c, 0xaad8, 0x009e, 0x0005, 0x080c, 0xca24, 0x0cd8, 0x6114,
-	0x0096, 0x2148, 0xa97c, 0x080c, 0xce5b, 0x190c, 0x1a3f, 0x009e,
-	0x0005, 0x0096, 0x6114, 0x2148, 0xa83c, 0xa940, 0x9105, 0x01e8,
-	0xa877, 0x0000, 0xa87b, 0x0000, 0xa867, 0x0103, 0x00b6, 0x6010,
-	0x2058, 0xa834, 0xa938, 0x9115, 0x11a0, 0x080c, 0x6a95, 0xba3c,
-	0x8211, 0x0208, 0xba3e, 0xb8d0, 0x9005, 0x0110, 0x080c, 0x6658,
-	0x080c, 0xaad8, 0x00be, 0x009e, 0x0005, 0xa87c, 0xc0dc, 0xa87e,
-	0x08f8, 0xb800, 0xd0bc, 0x1120, 0xa834, 0x080c, 0xbd9e, 0x0c28,
-	0xa880, 0xd0bc, 0x1dc8, 0x080c, 0xca61, 0x0c60, 0x080c, 0x94a8,
-	0x0010, 0x080c, 0x9505, 0x601c, 0xd084, 0x0110, 0x080c, 0x1a53,
-	0x080c, 0xc723, 0x01f0, 0x0096, 0x6114, 0x2148, 0x080c, 0xc931,
-	0x1118, 0x080c, 0xb4a0, 0x00a0, 0xa867, 0x0103, 0x2009, 0x180c,
-	0x210c, 0xd18c, 0x1198, 0xd184, 0x1170, 0x6108, 0xa97a, 0x918e,
-	0x0029, 0x1110, 0x080c, 0xe4e4, 0xa877, 0x0000, 0x080c, 0x6c7f,
-	0x009e, 0x0804, 0xab13, 0xa87b, 0x0004, 0x0cb0, 0xa87b, 0x0004,
-	0x0c98, 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a,
-	0x0005, 0xc068, 0xc068, 0xc068, 0xc068, 0xc068, 0xc06a, 0xc068,
-	0xc068, 0xc068, 0xc068, 0xc068, 0xc068, 0xc068, 0xc068, 0xc068,
-	0xc068, 0xc068, 0xc068, 0xc068, 0xc068, 0xc08e, 0xc068, 0xc068,
-	0x080c, 0x0d7d, 0x080c, 0x5604, 0x01f8, 0x6014, 0x7144, 0x918c,
-	0x0fff, 0x9016, 0xd1c4, 0x0118, 0x7264, 0x9294, 0x00ff, 0x0096,
-	0x904d, 0x0188, 0xa87b, 0x0000, 0xa864, 0x9086, 0x0139, 0x0128,
-	0xa867, 0x0103, 0xa976, 0xaa96, 0x0030, 0xa897, 0x4000, 0xa99a,
-	0xaa9e, 0x080c, 0x6c7f, 0x009e, 0x0804, 0xaad8, 0x080c, 0x5604,
-	0x0dd8, 0x6014, 0x900e, 0x9016, 0x0c10, 0x9182, 0x0085, 0x0002,
-	0xc0a7, 0xc0a5, 0xc0a5, 0xc0b3, 0xc0a5, 0xc0a5, 0xc0a5, 0xc0a5,
-	0xc0a5, 0xc0a5, 0xc0a5, 0xc0a5, 0xc0a5, 0x080c, 0x0d7d, 0x6003,
-	0x0001, 0x6106, 0x0126, 0x2091, 0x8000, 0x2009, 0x8020, 0x080c,
-	0x90e8, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6, 0x2071,
-	0x0260, 0x7224, 0x6216, 0x7220, 0x080c, 0xc711, 0x01a0, 0x2268,
-	0x6800, 0x9086, 0x0000, 0x0178, 0x6010, 0x6d10, 0x952e, 0x1158,
-	0x00c6, 0x2d60, 0x080c, 0xc321, 0x00ce, 0x0128, 0x6803, 0x0002,
-	0x6007, 0x0086, 0x0010, 0x6007, 0x0087, 0x6003, 0x0001, 0x2009,
-	0x8020, 0x080c, 0x90e8, 0x9280, 0x0004, 0x00b6, 0x2058, 0xb800,
-	0x00be, 0xd0bc, 0x0140, 0x6824, 0xd0ec, 0x0128, 0x00c6, 0x2260,
-	0x080c, 0xca61, 0x00ce, 0x00ee, 0x00de, 0x005e, 0x002e, 0x0005,
-	0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d7d,
-	0x908a, 0x0092, 0x1a0c, 0x0d7d, 0x9082, 0x0085, 0x00e2, 0x9186,
-	0x0027, 0x0120, 0x9186, 0x0014, 0x190c, 0x0d7d, 0x080c, 0x94a8,
-	0x0096, 0x6014, 0x2048, 0x080c, 0xc723, 0x0140, 0xa867, 0x0103,
-	0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x6c7f, 0x009e, 0x080c,
-	0xab13, 0x0804, 0x956a, 0xc128, 0xc12a, 0xc12a, 0xc128, 0xc128,
-	0xc128, 0xc128, 0xc128, 0xc128, 0xc128, 0xc128, 0xc128, 0xc128,
-	0x080c, 0x0d7d, 0x080c, 0xab13, 0x0005, 0x9186, 0x0013, 0x1130,
-	0x6004, 0x9082, 0x0085, 0x2008, 0x0804, 0xc179, 0x9186, 0x0027,
-	0x1558, 0x080c, 0x94a8, 0x080c, 0x31ab, 0x080c, 0xce4a, 0x0096,
-	0x6014, 0x2048, 0x080c, 0xc723, 0x0150, 0xa867, 0x0103, 0xa877,
-	0x0000, 0xa87b, 0x0029, 0x080c, 0x6c7f, 0x080c, 0xc90b, 0x009e,
-	0x080c, 0xaad8, 0x0005, 0x9186, 0x0089, 0x0118, 0x9186, 0x008a,
-	0x1140, 0x080c, 0xa993, 0x0128, 0x9086, 0x000c, 0x0904, 0xc1b1,
-	0x0000, 0x080c, 0xab94, 0x0c70, 0x9186, 0x0014, 0x1d60, 0x080c,
-	0x94a8, 0x0096, 0x6014, 0x2048, 0x080c, 0xc723, 0x0d00, 0xa867,
-	0x0103, 0xa877, 0x0000, 0xa87b, 0x0006, 0xa880, 0xc0ec, 0xa882,
-	0x0890, 0x0002, 0xc189, 0xc187, 0xc187, 0xc187, 0xc187, 0xc187,
-	0xc19d, 0xc187, 0xc187, 0xc187, 0xc187, 0xc187, 0xc187, 0x080c,
-	0x0d7d, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118,
-	0x9186, 0x0035, 0x1118, 0x2001, 0x1984, 0x0010, 0x2001, 0x1985,
-	0x2004, 0x601a, 0x6003, 0x000c, 0x0005, 0x6034, 0x908c, 0xff00,
-	0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001,
-	0x1984, 0x0010, 0x2001, 0x1985, 0x2004, 0x601a, 0x6003, 0x000e,
-	0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, 0x0012,
-	0x0804, 0xab94, 0xc1c7, 0xc1c7, 0xc1c7, 0xc1c7, 0xc1c9, 0xc216,
-	0xc1c7, 0xc1c7, 0xc1c7, 0xc1c7, 0xc1c7, 0xc1c7, 0xc1c7, 0x080c,
-	0x0d7d, 0x0096, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc,
-	0x0168, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118,
-	0x9186, 0x0035, 0x1118, 0x009e, 0x0804, 0xc22a, 0x080c, 0xc723,
-	0x1118, 0x080c, 0xc90b, 0x0068, 0x6014, 0x2048, 0x080c, 0xce61,
-	0x1110, 0x080c, 0xc90b, 0xa867, 0x0103, 0x080c, 0xce15, 0x080c,
-	0x6c7f, 0x00d6, 0x2c68, 0x080c, 0xaa82, 0x01d0, 0x6003, 0x0001,
-	0x6007, 0x001e, 0x600b, 0xffff, 0x2009, 0x026e, 0x210c, 0x613a,
-	0x2009, 0x026f, 0x210c, 0x613e, 0x6910, 0x6112, 0x080c, 0xcbb0,
-	0x695c, 0x615e, 0x6023, 0x0001, 0x2009, 0x8020, 0x080c, 0x90e8,
-	0x2d60, 0x00de, 0x080c, 0xaad8, 0x009e, 0x0005, 0x6010, 0x00b6,
-	0x2058, 0xb800, 0x00be, 0xd0bc, 0x05a0, 0x6034, 0x908c, 0xff00,
-	0x810f, 0x9186, 0x0035, 0x0130, 0x9186, 0x001e, 0x0118, 0x9186,
-	0x0039, 0x1538, 0x00d6, 0x2c68, 0x080c, 0xcdad, 0x11f0, 0x080c,
-	0xaa82, 0x01d8, 0x6106, 0x6003, 0x0001, 0x6023, 0x0001, 0x6910,
-	0x6112, 0x692c, 0x612e, 0x6930, 0x6132, 0x6934, 0x918c, 0x00ff,
-	0x6136, 0x6938, 0x613a, 0x693c, 0x613e, 0x695c, 0x615e, 0x080c,
-	0xcbb0, 0x2009, 0x8020, 0x080c, 0x90e8, 0x2d60, 0x00de, 0x0804,
-	0xaad8, 0x0096, 0x6014, 0x2048, 0x080c, 0xc723, 0x01c8, 0xa867,
-	0x0103, 0xa880, 0xd0b4, 0x0128, 0xc0ec, 0xa882, 0xa87b, 0x0006,
-	0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005,
-	0x080c, 0xca20, 0xa877, 0x0000, 0x080c, 0x6c7f, 0x080c, 0xc90b,
-	0x009e, 0x0804, 0xaad8, 0x0016, 0x0096, 0x6014, 0x2048, 0x080c,
-	0xc723, 0x0140, 0xa867, 0x0103, 0xa87b, 0x0028, 0xa877, 0x0000,
-	0x080c, 0x6c7f, 0x009e, 0x001e, 0x9186, 0x0013, 0x0158, 0x9186,
-	0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0xab94, 0x0020,
-	0x080c, 0x94a8, 0x080c, 0xab13, 0x0005, 0x0056, 0x0066, 0x0096,
-	0x00a6, 0x2029, 0x0001, 0x9182, 0x0101, 0x1208, 0x0010, 0x2009,
-	0x0100, 0x2130, 0x8304, 0x9098, 0x0018, 0x2009, 0x0020, 0x2011,
-	0x0029, 0x080c, 0xc2f6, 0x96b2, 0x0020, 0xb004, 0x904d, 0x0110,
-	0x080c, 0x0fed, 0x080c, 0x103b, 0x0520, 0x8528, 0xa867, 0x0110,
-	0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, 0x1228, 0x2608,
-	0x2011, 0x001b, 0x0499, 0x00a8, 0x96b2, 0x003c, 0x2009, 0x003c,
-	0x2950, 0x2011, 0x001b, 0x0451, 0x0c28, 0x2001, 0x0205, 0x2003,
-	0x0000, 0x00ae, 0x852f, 0x95ad, 0x0003, 0xb566, 0x95ac, 0x0000,
-	0x0048, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad,
-	0x0003, 0xb566, 0x009e, 0x006e, 0x005e, 0x0005, 0x00a6, 0x89ff,
-	0x0158, 0xa804, 0x9055, 0x0130, 0xa807, 0x0000, 0x080c, 0x6c7f,
-	0x2a48, 0x0cb8, 0x080c, 0x6c7f, 0x00ae, 0x0005, 0x00f6, 0x2079,
-	0x0200, 0x7814, 0x9085, 0x0080, 0x7816, 0xd184, 0x0108, 0x8108,
-	0x810c, 0x20a9, 0x0001, 0xa860, 0x20e8, 0xa85c, 0x9200, 0x20a0,
-	0x20e1, 0x0000, 0x2300, 0x9e00, 0x2098, 0x4003, 0x8318, 0x9386,
-	0x0020, 0x1148, 0x2018, 0x2300, 0x9e00, 0x2098, 0x7814, 0x8000,
-	0x9085, 0x0080, 0x7816, 0x8109, 0x1d80, 0x7817, 0x0000, 0x00fe,
-	0x0005, 0x0066, 0x0126, 0x2091, 0x8000, 0x2031, 0x0001, 0x6020,
-	0x9084, 0x000f, 0x0083, 0x012e, 0x006e, 0x0005, 0x0126, 0x2091,
-	0x8000, 0x0066, 0x2031, 0x0000, 0x6020, 0x9084, 0x000f, 0x001b,
-	0x006e, 0x012e, 0x0005, 0xc373, 0xc373, 0xc36e, 0xc397, 0xc34b,
-	0xc36e, 0xc34d, 0xc36e, 0xc34b, 0x8fae, 0xc36e, 0xc36e, 0xc36e,
-	0xc34b, 0xc34b, 0xc34b, 0x080c, 0x0d7d, 0x6010, 0x9080, 0x0000,
-	0x2004, 0xd0bc, 0x190c, 0xc397, 0x0036, 0x6014, 0x0096, 0x2048,
-	0xa880, 0x009e, 0xd0cc, 0x0118, 0x2019, 0x000c, 0x0038, 0xd094,
-	0x0118, 0x2019, 0x000d, 0x0010, 0x2019, 0x0010, 0x080c, 0xdce5,
-	0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x9006, 0x0005,
-	0x9085, 0x0001, 0x0005, 0x0096, 0x86ff, 0x11e8, 0x6014, 0x2048,
-	0x080c, 0xc723, 0x01d0, 0x6043, 0xffff, 0xa864, 0x9086, 0x0139,
-	0x1128, 0xa87b, 0x0005, 0xa883, 0x0000, 0x0028, 0x900e, 0x2001,
-	0x0005, 0x080c, 0x6ebf, 0x080c, 0xca20, 0x080c, 0x6c73, 0x080c,
-	0xab13, 0x9085, 0x0001, 0x009e, 0x0005, 0x9006, 0x0ce0, 0x080c,
-	0xa781, 0x080c, 0xce6f, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7d,
-	0x002b, 0x0106, 0x080c, 0xa79d, 0x010e, 0x0005, 0xc3b6, 0xc3e4,
-	0xc3b8, 0xc40b, 0xc3df, 0xc3b6, 0xc36e, 0xc373, 0xc373, 0xc36e,
-	0xc36e, 0xc36e, 0xc36e, 0xc36e, 0xc36e, 0xc36e, 0x080c, 0x0d7d,
-	0x86ff, 0x1510, 0x6020, 0x9086, 0x0006, 0x01f0, 0x0096, 0x6014,
-	0x2048, 0x080c, 0xc723, 0x0158, 0xa87c, 0xd0cc, 0x0130, 0x0096,
-	0xa878, 0x2048, 0x080c, 0x0fed, 0x009e, 0x080c, 0xca20, 0x009e,
-	0x080c, 0xcdef, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002,
-	0x2009, 0x8020, 0x080c, 0x90ca, 0x9085, 0x0001, 0x0005, 0x0066,
-	0x080c, 0x1a53, 0x006e, 0x08a0, 0x00e6, 0x2071, 0x19e5, 0x7030,
-	0x9c06, 0x1120, 0x080c, 0x9f6f, 0x00ee, 0x0850, 0x6020, 0x9084,
-	0x000f, 0x9086, 0x0006, 0x1150, 0x0086, 0x0096, 0x2049, 0x0001,
-	0x2c40, 0x080c, 0xa103, 0x009e, 0x008e, 0x0040, 0x0066, 0x080c,
-	0x9e6b, 0x190c, 0x0d7d, 0x080c, 0x9e79, 0x006e, 0x00ee, 0x1904,
-	0xc3b8, 0x0804, 0xc36e, 0x0036, 0x00e6, 0x2071, 0x19e5, 0x704c,
-	0x9c06, 0x1138, 0x901e, 0x080c, 0x9fef, 0x00ee, 0x003e, 0x0804,
-	0xc3b8, 0x080c, 0xa239, 0x00ee, 0x003e, 0x1904, 0xc3b8, 0x0804,
-	0xc36e, 0x00c6, 0x0066, 0x6020, 0x9084, 0x000f, 0x001b, 0x006e,
-	0x00ce, 0x0005, 0xc441, 0xc503, 0xc66a, 0xc449, 0xab13, 0xc441,
-	0xdcd7, 0xce57, 0xc503, 0x8f75, 0xc6e9, 0xc43a, 0xc43a, 0xc43a,
-	0xc43a, 0xc43a, 0x080c, 0x0d7d, 0x080c, 0xc931, 0x1110, 0x080c,
-	0xb4a0, 0x0005, 0x080c, 0x94a8, 0x0804, 0xaad8, 0x601b, 0x0001,
-	0x0005, 0x080c, 0xc723, 0x0130, 0x6014, 0x0096, 0x2048, 0x2c00,
-	0xa896, 0x009e, 0x080c, 0xa781, 0x080c, 0xce6f, 0x6000, 0x908a,
-	0x0016, 0x1a0c, 0x0d7d, 0x0013, 0x0804, 0xa79d, 0xc46e, 0xc470,
-	0xc49a, 0xc4ae, 0xc4d9, 0xc46e, 0xc441, 0xc441, 0xc441, 0xc4b5,
-	0xc4b5, 0xc46e, 0xc46e, 0xc46e, 0xc46e, 0xc4bf, 0x080c, 0x0d7d,
-	0x00e6, 0x6014, 0x0096, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e,
-	0x2071, 0x19e5, 0x7030, 0x9c06, 0x01d0, 0x0066, 0x080c, 0x9e6b,
-	0x190c, 0x0d7d, 0x080c, 0x9e79, 0x006e, 0x080c, 0xcdef, 0x6007,
-	0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x2001, 0x1985, 0x2004,
-	0x601a, 0x2009, 0x8020, 0x080c, 0x90ca, 0x00ee, 0x0005, 0x601b,
-	0x0001, 0x0cd8, 0x0096, 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882,
-	0x009e, 0x080c, 0xcdef, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023,
-	0x0002, 0x2009, 0x8020, 0x080c, 0x90ca, 0x0005, 0x080c, 0xa781,
-	0x080c, 0xa915, 0x080c, 0xa79d, 0x0c28, 0x0096, 0x601b, 0x0001,
-	0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x0005, 0x080c,
-	0x5604, 0x01a8, 0x6014, 0x0096, 0x904d, 0x0180, 0xa864, 0xa867,
-	0x0103, 0xa87b, 0x0006, 0x9086, 0x0139, 0x1140, 0xa867, 0x0139,
-	0xa897, 0x4005, 0xa89b, 0x0004, 0x080c, 0x6c7f, 0x009e, 0x0804,
-	0xaad8, 0x6014, 0x0096, 0x904d, 0x0508, 0x080c, 0xce5b, 0x01f0,
-	0x080c, 0xa79d, 0x2001, 0x180f, 0x2004, 0xd0c4, 0x0110, 0x009e,
-	0x0005, 0xa884, 0x009e, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a,
-	0x2001, 0x0037, 0x2c08, 0x080c, 0x1670, 0x6000, 0x9086, 0x0004,
-	0x1120, 0x2009, 0x0048, 0x080c, 0xab77, 0x0005, 0x009e, 0x080c,
-	0x1a53, 0x0804, 0xc49a, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7d,
-	0x000b, 0x0005, 0xc51a, 0xc446, 0xc51c, 0xc51a, 0xc51c, 0xc51c,
-	0xc442, 0xc51a, 0xc43c, 0xc43c, 0xc51a, 0xc51a, 0xc51a, 0xc51a,
-	0xc51a, 0xc51a, 0x080c, 0x0d7d, 0x6010, 0x00b6, 0x2058, 0xb804,
-	0x9084, 0x00ff, 0x00be, 0x908a, 0x000c, 0x1a0c, 0x0d7d, 0x00b6,
-	0x0013, 0x00be, 0x0005, 0xc537, 0xc604, 0xc539, 0xc579, 0xc539,
-	0xc579, 0xc539, 0xc547, 0xc537, 0xc579, 0xc537, 0xc568, 0x080c,
-	0x0d7d, 0x6004, 0x908e, 0x0016, 0x05c0, 0x908e, 0x0004, 0x05a8,
-	0x908e, 0x0002, 0x0590, 0x908e, 0x0052, 0x0904, 0xc600, 0x6004,
-	0x080c, 0xc931, 0x0904, 0xc61d, 0x908e, 0x0004, 0x1110, 0x080c,
-	0x31dc, 0x908e, 0x0021, 0x0904, 0xc621, 0x908e, 0x0022, 0x0904,
-	0xc665, 0x908e, 0x003d, 0x0904, 0xc621, 0x908e, 0x0039, 0x0904,
-	0xc625, 0x908e, 0x0035, 0x0904, 0xc625, 0x908e, 0x001e, 0x0178,
-	0x908e, 0x0001, 0x1140, 0x6010, 0x2058, 0xb804, 0x9084, 0x00ff,
-	0x9086, 0x0006, 0x0110, 0x080c, 0x31ab, 0x080c, 0xb4a0, 0x0804,
-	0xab13, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0904, 0xc5f1,
-	0x9186, 0x0002, 0x1904, 0xc5c6, 0x2001, 0x1837, 0x2004, 0xd08c,
-	0x11c8, 0x080c, 0x73e4, 0x11b0, 0x080c, 0xce35, 0x0138, 0x080c,
-	0x7407, 0x1120, 0x080c, 0x72ef, 0x0804, 0xc64e, 0x2001, 0x197d,
-	0x2003, 0x0001, 0x2001, 0x1800, 0x2003, 0x0001, 0x080c, 0x7315,
-	0x0804, 0xc64e, 0x6010, 0x2058, 0x2001, 0x1837, 0x2004, 0xd0ac,
-	0x1904, 0xc64e, 0xb8a0, 0x9084, 0xff80, 0x1904, 0xc64e, 0xb840,
-	0x9084, 0x00ff, 0x9005, 0x0190, 0x8001, 0xb842, 0x6017, 0x0000,
-	0x6023, 0x0007, 0x601b, 0x0398, 0x604b, 0x0000, 0x080c, 0xaa82,
-	0x0128, 0x2b00, 0x6012, 0x6023, 0x0001, 0x0458, 0x00de, 0x00ce,
-	0x6004, 0x908e, 0x0002, 0x11a0, 0x6010, 0x2058, 0xb8a0, 0x9086,
-	0x007e, 0x1170, 0x2009, 0x1837, 0x2104, 0xc085, 0x200a, 0x00e6,
-	0x2071, 0x1800, 0x080c, 0x5ed4, 0x00ee, 0x080c, 0xb4a0, 0x0030,
-	0x080c, 0xb4a0, 0x080c, 0x31ab, 0x080c, 0xce4a, 0x00e6, 0x0126,
-	0x2091, 0x8000, 0x080c, 0x31dc, 0x012e, 0x00ee, 0x080c, 0xab13,
-	0x0005, 0x2001, 0x0002, 0x080c, 0x647d, 0x6003, 0x0001, 0x6007,
-	0x0002, 0x080c, 0x90ef, 0x080c, 0x956a, 0x00de, 0x00ce, 0x0c80,
-	0x080c, 0x31dc, 0x0804, 0xc575, 0x00c6, 0x00d6, 0x6104, 0x9186,
-	0x0016, 0x0d38, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005,
-	0x0904, 0xc5c6, 0x8001, 0xb842, 0x6003, 0x0001, 0x080c, 0x90ef,
-	0x080c, 0x956a, 0x00de, 0x00ce, 0x0898, 0x080c, 0xb4a0, 0x0804,
-	0xc577, 0x080c, 0xb4dc, 0x0804, 0xc577, 0x00d6, 0x2c68, 0x6104,
-	0x080c, 0xcdad, 0x00de, 0x0118, 0x080c, 0xaad8, 0x00f0, 0x6004,
-	0x8007, 0x6134, 0x918c, 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085,
-	0x6003, 0x000b, 0x6023, 0x0002, 0x603c, 0x600a, 0x2001, 0x1985,
-	0x2004, 0x601a, 0x602c, 0x2c08, 0x2060, 0x6024, 0xc0b5, 0x6026,
-	0x2160, 0x2009, 0x8020, 0x080c, 0x90e8, 0x0005, 0x00de, 0x00ce,
-	0x080c, 0xb4a0, 0x080c, 0x31ab, 0x00e6, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x31dc, 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398,
-	0x604b, 0x0000, 0x012e, 0x00ee, 0x0005, 0x080c, 0xaf14, 0x1904,
-	0xc61d, 0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7d, 0x0096,
-	0x00d6, 0x001b, 0x00de, 0x009e, 0x0005, 0xc685, 0xc685, 0xc685,
-	0xc685, 0xc685, 0xc685, 0xc685, 0xc685, 0xc685, 0xc441, 0xc685,
-	0xc446, 0xc687, 0xc446, 0xc694, 0xc685, 0x080c, 0x0d7d, 0x6004,
-	0x9086, 0x008b, 0x0148, 0x6007, 0x008b, 0x6003, 0x000d, 0x2009,
-	0x8020, 0x080c, 0x90e8, 0x0005, 0x080c, 0xce29, 0x0118, 0x080c,
-	0xce3c, 0x0010, 0x080c, 0xce4a, 0x080c, 0xc90b, 0x080c, 0xc723,
-	0x0570, 0x080c, 0x31ab, 0x080c, 0xc723, 0x0168, 0x6014, 0x2048,
-	0xa867, 0x0103, 0xa87b, 0x0006, 0xa877, 0x0000, 0xa880, 0xc0ed,
-	0xa882, 0x080c, 0x6c7f, 0x2c68, 0x080c, 0xaa82, 0x0150, 0x6810,
-	0x6012, 0x080c, 0xcbb0, 0x00c6, 0x2d60, 0x080c, 0xab13, 0x00ce,
-	0x0008, 0x2d60, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001,
-	0x6003, 0x0001, 0x080c, 0x90ef, 0x080c, 0x956a, 0x00c8, 0x080c,
-	0xce29, 0x0138, 0x6034, 0x9086, 0x4000, 0x1118, 0x080c, 0x31ab,
-	0x08d0, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118,
-	0x9186, 0x0035, 0x1118, 0x080c, 0x31ab, 0x0868, 0x080c, 0xab13,
-	0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7d, 0x0002, 0xc6ff,
-	0xc6ff, 0xc701, 0xc701, 0xc701, 0xc6ff, 0xc6ff, 0xab13, 0xc6ff,
-	0xc6ff, 0xc6ff, 0xc6ff, 0xc6ff, 0xc6ff, 0xc6ff, 0xc6ff, 0x080c,
-	0x0d7d, 0x080c, 0xa781, 0x080c, 0xa915, 0x080c, 0xa79d, 0x6114,
-	0x0096, 0x2148, 0xa87b, 0x0006, 0x080c, 0x6c7f, 0x009e, 0x0804,
-	0xaad8, 0x9284, 0x0003, 0x1158, 0x9282, 0x1ddc, 0x0240, 0x2001,
-	0x181a, 0x2004, 0x9202, 0x1218, 0x9085, 0x0001, 0x0005, 0x9006,
-	0x0ce8, 0x0096, 0x0028, 0x0096, 0x0006, 0x6014, 0x2048, 0x000e,
-	0x0006, 0x9984, 0xf000, 0x9086, 0xf000, 0x0110, 0x080c, 0x10e6,
-	0x000e, 0x009e, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0006, 0x0126,
-	0x2091, 0x8000, 0x2061, 0x1ddc, 0x2071, 0x1800, 0x7354, 0x7074,
-	0x9302, 0x1640, 0x6020, 0x9206, 0x11f8, 0x080c, 0xce35, 0x0180,
-	0x9286, 0x0001, 0x1168, 0x6004, 0x9086, 0x0004, 0x1148, 0x080c,
-	0x31ab, 0x080c, 0xce4a, 0x00c6, 0x080c, 0xab13, 0x00ce, 0x0060,
-	0x080c, 0xcb22, 0x0148, 0x080c, 0xc931, 0x1110, 0x080c, 0xb4a0,
-	0x00c6, 0x080c, 0xaad8, 0x00ce, 0x9ce0, 0x001c, 0x7068, 0x9c02,
-	0x1208, 0x08a0, 0x012e, 0x000e, 0x003e, 0x00ce, 0x00ee, 0x0005,
-	0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000, 0x210c, 0x81ff, 0x0128,
-	0x2061, 0x1b30, 0x6112, 0x080c, 0x31ab, 0x9006, 0x0010, 0x9085,
-	0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6, 0x0126, 0x2091,
-	0x8000, 0x080c, 0xaa82, 0x01d8, 0x080c, 0x5604, 0x0110, 0x662e,
-	0x0008, 0x6616, 0x2b00, 0x6012, 0x080c, 0x5604, 0x0118, 0x080c,
-	0xc84d, 0x0168, 0x080c, 0xcbb0, 0x6023, 0x0003, 0x2009, 0x004b,
-	0x080c, 0xab77, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006,
-	0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0xbaa0, 0x080c, 0xab4a,
-	0x05b0, 0x080c, 0x5604, 0x0118, 0x602f, 0x0000, 0x0010, 0x6017,
-	0x0000, 0x2b00, 0x6012, 0x080c, 0xcbb0, 0x6023, 0x0003, 0x0016,
-	0x080c, 0xa781, 0x080c, 0x926f, 0x0076, 0x903e, 0x080c, 0x9141,
-	0x2c08, 0x080c, 0xdeb3, 0x007e, 0x080c, 0xa79d, 0x001e, 0xd184,
-	0x0128, 0x080c, 0xaad8, 0x9085, 0x0001, 0x0070, 0x080c, 0x5604,
-	0x0128, 0xd18c, 0x1170, 0x080c, 0xc84d, 0x0148, 0x2009, 0x004c,
-	0x080c, 0xab77, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006,
-	0x0cd8, 0x2900, 0x6016, 0x0c90, 0x2009, 0x004d, 0x0010, 0x2009,
-	0x004e, 0x00f6, 0x00c6, 0x0046, 0x0016, 0x080c, 0xaa82, 0x2c78,
-	0x01d8, 0x080c, 0x5604, 0x0110, 0x7e2e, 0x0008, 0x7e16, 0x2b00,
-	0x7812, 0x7823, 0x0003, 0x2021, 0x0005, 0x080c, 0xc85f, 0x2f60,
-	0x080c, 0x5604, 0x0118, 0x080c, 0xc84d, 0x0130, 0x001e, 0x0016,
-	0x080c, 0xab77, 0x9085, 0x0001, 0x001e, 0x004e, 0x00ce, 0x00fe,
-	0x0005, 0x00f6, 0x00c6, 0x0046, 0x080c, 0xaa82, 0x2c78, 0x0530,
-	0x080c, 0x5604, 0x0110, 0x7e2e, 0x0008, 0x7e16, 0x2b00, 0x7812,
+	0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xbe8f,
+	0xa890, 0xb092, 0xa88c, 0xb08e, 0xa87c, 0xb07e, 0x00ae, 0x080c,
+	0x0fec, 0x009e, 0x080c, 0xced3, 0xa974, 0x0016, 0x080c, 0xc3d7,
+	0x001e, 0x0468, 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff, 0x90b6,
+	0x0002, 0x01b0, 0x9086, 0x0028, 0x1118, 0xa87b, 0x001c, 0x00d0,
+	0xd1dc, 0x0148, 0xa87b, 0x0015, 0x080c, 0xcdf6, 0x0118, 0xa974,
+	0xc1dc, 0xa976, 0x0078, 0xd1d4, 0x0118, 0xa87b, 0x0007, 0x0050,
+	0xa87b, 0x0000, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115,
+	0x190c, 0xbe8f, 0xa974, 0x0016, 0x080c, 0x6b86, 0x001e, 0x6010,
+	0x00b6, 0x2058, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0xb8d0,
+	0x9005, 0x0120, 0x0016, 0x080c, 0x6749, 0x001e, 0x00be, 0xd1e4,
+	0x1120, 0x080c, 0xabc9, 0x009e, 0x0005, 0x080c, 0xcb1c, 0x0cd8,
+	0x6114, 0x0096, 0x2148, 0xa97c, 0x080c, 0xcf54, 0x190c, 0x1a56,
+	0x009e, 0x0005, 0x0096, 0x6114, 0x2148, 0xa83c, 0xa940, 0x9105,
+	0x01e8, 0xa877, 0x0000, 0xa87b, 0x0000, 0xa867, 0x0103, 0x00b6,
+	0x6010, 0x2058, 0xa834, 0xa938, 0x9115, 0x11a0, 0x080c, 0x6b86,
+	0xba3c, 0x8211, 0x0208, 0xba3e, 0xb8d0, 0x9005, 0x0110, 0x080c,
+	0x6749, 0x080c, 0xabc9, 0x00be, 0x009e, 0x0005, 0xa87c, 0xc0dc,
+	0xa87e, 0x08f8, 0xb800, 0xd0bc, 0x1120, 0xa834, 0x080c, 0xbe8f,
+	0x0c28, 0xa880, 0xd0bc, 0x1dc8, 0x080c, 0xcb59, 0x0c60, 0x080c,
+	0x95ad, 0x0010, 0x080c, 0x960a, 0x601c, 0xd084, 0x0110, 0x080c,
+	0x1a6a, 0x080c, 0xc814, 0x01f0, 0x0096, 0x6114, 0x2148, 0x080c,
+	0xca29, 0x1118, 0x080c, 0xb591, 0x00a0, 0xa867, 0x0103, 0x2009,
+	0x180c, 0x210c, 0xd18c, 0x1198, 0xd184, 0x1170, 0x6108, 0xa97a,
+	0x918e, 0x0029, 0x1110, 0x080c, 0xe5f6, 0xa877, 0x0000, 0x080c,
+	0x6d70, 0x009e, 0x0804, 0xac04, 0xa87b, 0x0004, 0x0cb0, 0xa87b,
+	0x0004, 0x0c98, 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, 0x0208,
+	0x000a, 0x0005, 0xc159, 0xc159, 0xc159, 0xc159, 0xc159, 0xc15b,
+	0xc159, 0xc159, 0xc159, 0xc159, 0xc159, 0xc159, 0xc159, 0xc159,
+	0xc159, 0xc159, 0xc159, 0xc159, 0xc159, 0xc159, 0xc17f, 0xc159,
+	0xc159, 0x080c, 0x0d7d, 0x080c, 0x56db, 0x01f8, 0x6014, 0x7144,
+	0x918c, 0x0fff, 0x9016, 0xd1c4, 0x0118, 0x7264, 0x9294, 0x00ff,
+	0x0096, 0x904d, 0x0188, 0xa87b, 0x0000, 0xa864, 0x9086, 0x0139,
+	0x0128, 0xa867, 0x0103, 0xa976, 0xaa96, 0x0030, 0xa897, 0x4000,
+	0xa99a, 0xaa9e, 0x080c, 0x6d70, 0x009e, 0x0804, 0xabc9, 0x080c,
+	0x56db, 0x0dd8, 0x6014, 0x900e, 0x9016, 0x0c10, 0x9182, 0x0085,
+	0x0002, 0xc198, 0xc196, 0xc196, 0xc1a4, 0xc196, 0xc196, 0xc196,
+	0xc196, 0xc196, 0xc196, 0xc196, 0xc196, 0xc196, 0x080c, 0x0d7d,
+	0x6003, 0x0001, 0x6106, 0x0126, 0x2091, 0x8000, 0x2009, 0x8020,
+	0x080c, 0x91ed, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6,
+	0x2071, 0x0260, 0x7224, 0x6216, 0x7220, 0x080c, 0xc802, 0x01a0,
+	0x2268, 0x6800, 0x9086, 0x0000, 0x0178, 0x6010, 0x6d10, 0x952e,
+	0x1158, 0x00c6, 0x2d60, 0x080c, 0xc412, 0x00ce, 0x0128, 0x6803,
+	0x0002, 0x6007, 0x0086, 0x0010, 0x6007, 0x0087, 0x6003, 0x0001,
+	0x2009, 0x8020, 0x080c, 0x91ed, 0x9280, 0x0004, 0x00b6, 0x2058,
+	0xb800, 0x00be, 0xd0bc, 0x0140, 0x6824, 0xd0ec, 0x0128, 0x00c6,
+	0x2260, 0x080c, 0xcb59, 0x00ce, 0x00ee, 0x00de, 0x005e, 0x002e,
+	0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c,
+	0x0d7d, 0x908a, 0x0092, 0x1a0c, 0x0d7d, 0x9082, 0x0085, 0x00e2,
+	0x9186, 0x0027, 0x0120, 0x9186, 0x0014, 0x190c, 0x0d7d, 0x080c,
+	0x95ad, 0x0096, 0x6014, 0x2048, 0x080c, 0xc814, 0x0140, 0xa867,
+	0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x6d70, 0x009e,
+	0x080c, 0xac04, 0x0804, 0x966f, 0xc219, 0xc21b, 0xc21b, 0xc219,
+	0xc219, 0xc219, 0xc219, 0xc219, 0xc219, 0xc219, 0xc219, 0xc219,
+	0xc219, 0x080c, 0x0d7d, 0x080c, 0xac04, 0x0005, 0x9186, 0x0013,
+	0x1130, 0x6004, 0x9082, 0x0085, 0x2008, 0x0804, 0xc26a, 0x9186,
+	0x0027, 0x1558, 0x080c, 0x95ad, 0x080c, 0x31e4, 0x080c, 0xcf43,
+	0x0096, 0x6014, 0x2048, 0x080c, 0xc814, 0x0150, 0xa867, 0x0103,
+	0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x6d70, 0x080c, 0xca03,
+	0x009e, 0x080c, 0xabc9, 0x0005, 0x9186, 0x0089, 0x0118, 0x9186,
+	0x008a, 0x1140, 0x080c, 0xaa84, 0x0128, 0x9086, 0x000c, 0x0904,
+	0xc2a2, 0x0000, 0x080c, 0xac85, 0x0c70, 0x9186, 0x0014, 0x1d60,
+	0x080c, 0x95ad, 0x0096, 0x6014, 0x2048, 0x080c, 0xc814, 0x0d00,
+	0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0006, 0xa880, 0xc0ec,
+	0xa882, 0x0890, 0x0002, 0xc27a, 0xc278, 0xc278, 0xc278, 0xc278,
+	0xc278, 0xc28e, 0xc278, 0xc278, 0xc278, 0xc278, 0xc278, 0xc278,
+	0x080c, 0x0d7d, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039,
+	0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1986, 0x0010, 0x2001,
+	0x1987, 0x2004, 0x601a, 0x6003, 0x000c, 0x0005, 0x6034, 0x908c,
+	0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118,
+	0x2001, 0x1986, 0x0010, 0x2001, 0x1987, 0x2004, 0x601a, 0x6003,
+	0x000e, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208,
+	0x0012, 0x0804, 0xac85, 0xc2b8, 0xc2b8, 0xc2b8, 0xc2b8, 0xc2ba,
+	0xc307, 0xc2b8, 0xc2b8, 0xc2b8, 0xc2b8, 0xc2b8, 0xc2b8, 0xc2b8,
+	0x080c, 0x0d7d, 0x0096, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be,
+	0xd0bc, 0x0168, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039,
+	0x0118, 0x9186, 0x0035, 0x1118, 0x009e, 0x0804, 0xc31b, 0x080c,
+	0xc814, 0x1118, 0x080c, 0xca03, 0x0068, 0x6014, 0x2048, 0x080c,
+	0xcf5a, 0x1110, 0x080c, 0xca03, 0xa867, 0x0103, 0x080c, 0xcf0e,
+	0x080c, 0x6d70, 0x00d6, 0x2c68, 0x080c, 0xab73, 0x01d0, 0x6003,
+	0x0001, 0x6007, 0x001e, 0x600b, 0xffff, 0x2009, 0x026e, 0x210c,
+	0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x6910, 0x6112, 0x080c,
+	0xcca8, 0x695c, 0x615e, 0x6023, 0x0001, 0x2009, 0x8020, 0x080c,
+	0x91ed, 0x2d60, 0x00de, 0x080c, 0xabc9, 0x009e, 0x0005, 0x6010,
+	0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x05a0, 0x6034, 0x908c,
+	0xff00, 0x810f, 0x9186, 0x0035, 0x0130, 0x9186, 0x001e, 0x0118,
+	0x9186, 0x0039, 0x1538, 0x00d6, 0x2c68, 0x080c, 0xcea6, 0x11f0,
+	0x080c, 0xab73, 0x01d8, 0x6106, 0x6003, 0x0001, 0x6023, 0x0001,
+	0x6910, 0x6112, 0x692c, 0x612e, 0x6930, 0x6132, 0x6934, 0x918c,
+	0x00ff, 0x6136, 0x6938, 0x613a, 0x693c, 0x613e, 0x695c, 0x615e,
+	0x080c, 0xcca8, 0x2009, 0x8020, 0x080c, 0x91ed, 0x2d60, 0x00de,
+	0x0804, 0xabc9, 0x0096, 0x6014, 0x2048, 0x080c, 0xc814, 0x01c8,
+	0xa867, 0x0103, 0xa880, 0xd0b4, 0x0128, 0xc0ec, 0xa882, 0xa87b,
+	0x0006, 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b,
+	0x0005, 0x080c, 0xcb18, 0xa877, 0x0000, 0x080c, 0x6d70, 0x080c,
+	0xca03, 0x009e, 0x0804, 0xabc9, 0x0016, 0x0096, 0x6014, 0x2048,
+	0x080c, 0xc814, 0x0140, 0xa867, 0x0103, 0xa87b, 0x0028, 0xa877,
+	0x0000, 0x080c, 0x6d70, 0x009e, 0x001e, 0x9186, 0x0013, 0x0158,
+	0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0xac85,
+	0x0020, 0x080c, 0x95ad, 0x080c, 0xac04, 0x0005, 0x0056, 0x0066,
+	0x0096, 0x00a6, 0x2029, 0x0001, 0x9182, 0x0101, 0x1208, 0x0010,
+	0x2009, 0x0100, 0x2130, 0x8304, 0x9098, 0x0018, 0x2009, 0x0020,
+	0x2011, 0x0029, 0x080c, 0xc3e7, 0x96b2, 0x0020, 0xb004, 0x904d,
+	0x0110, 0x080c, 0x0fec, 0x080c, 0x103a, 0x0520, 0x8528, 0xa867,
+	0x0110, 0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, 0x1228,
+	0x2608, 0x2011, 0x001b, 0x0499, 0x00a8, 0x96b2, 0x003c, 0x2009,
+	0x003c, 0x2950, 0x2011, 0x001b, 0x0451, 0x0c28, 0x2001, 0x0205,
+	0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0003, 0xb566, 0x95ac,
+	0x0000, 0x0048, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f,
+	0x95ad, 0x0003, 0xb566, 0x009e, 0x006e, 0x005e, 0x0005, 0x00a6,
+	0x89ff, 0x0158, 0xa804, 0x9055, 0x0130, 0xa807, 0x0000, 0x080c,
+	0x6d70, 0x2a48, 0x0cb8, 0x080c, 0x6d70, 0x00ae, 0x0005, 0x00f6,
+	0x2079, 0x0200, 0x7814, 0x9085, 0x0080, 0x7816, 0xd184, 0x0108,
+	0x8108, 0x810c, 0x20a9, 0x0001, 0xa860, 0x20e8, 0xa85c, 0x9200,
+	0x20a0, 0x20e1, 0x0000, 0x2300, 0x9e00, 0x2098, 0x4003, 0x8318,
+	0x9386, 0x0020, 0x1148, 0x2018, 0x2300, 0x9e00, 0x2098, 0x7814,
+	0x8000, 0x9085, 0x0080, 0x7816, 0x8109, 0x1d80, 0x7817, 0x0000,
+	0x00fe, 0x0005, 0x0066, 0x0126, 0x2091, 0x8000, 0x2031, 0x0001,
+	0x6020, 0x9084, 0x000f, 0x0083, 0x012e, 0x006e, 0x0005, 0x0126,
+	0x2091, 0x8000, 0x0066, 0x2031, 0x0000, 0x6020, 0x9084, 0x000f,
+	0x001b, 0x006e, 0x012e, 0x0005, 0xc464, 0xc464, 0xc45f, 0xc488,
+	0xc43c, 0xc45f, 0xc43e, 0xc45f, 0xc43c, 0x90b3, 0xc45f, 0xc45f,
+	0xc45f, 0xc43c, 0xc43c, 0xc43c, 0x080c, 0x0d7d, 0x6010, 0x9080,
+	0x0000, 0x2004, 0xd0bc, 0x190c, 0xc488, 0x0036, 0x6014, 0x0096,
+	0x2048, 0xa880, 0x009e, 0xd0cc, 0x0118, 0x2019, 0x000c, 0x0038,
+	0xd094, 0x0118, 0x2019, 0x000d, 0x0010, 0x2019, 0x0010, 0x080c,
+	0xddf2, 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x9006,
+	0x0005, 0x9085, 0x0001, 0x0005, 0x0096, 0x86ff, 0x11e8, 0x6014,
+	0x2048, 0x080c, 0xc814, 0x01d0, 0x6043, 0xffff, 0xa864, 0x9086,
+	0x0139, 0x1128, 0xa87b, 0x0005, 0xa883, 0x0000, 0x0028, 0x900e,
+	0x2001, 0x0005, 0x080c, 0x6fb0, 0x080c, 0xcb18, 0x080c, 0x6d64,
+	0x080c, 0xac04, 0x9085, 0x0001, 0x009e, 0x0005, 0x9006, 0x0ce0,
+	0x080c, 0xa872, 0x080c, 0xcf68, 0x6000, 0x908a, 0x0016, 0x1a0c,
+	0x0d7d, 0x002b, 0x0106, 0x080c, 0xa88e, 0x010e, 0x0005, 0xc4a7,
+	0xc4d5, 0xc4a9, 0xc4fc, 0xc4d0, 0xc4a7, 0xc45f, 0xc464, 0xc464,
+	0xc45f, 0xc45f, 0xc45f, 0xc45f, 0xc45f, 0xc45f, 0xc45f, 0x080c,
+	0x0d7d, 0x86ff, 0x1510, 0x6020, 0x9086, 0x0006, 0x01f0, 0x0096,
+	0x6014, 0x2048, 0x080c, 0xc814, 0x0158, 0xa87c, 0xd0cc, 0x0130,
+	0x0096, 0xa878, 0x2048, 0x080c, 0x0fec, 0x009e, 0x080c, 0xcb18,
+	0x009e, 0x080c, 0xcee8, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023,
+	0x0002, 0x2009, 0x8020, 0x080c, 0x91cf, 0x9085, 0x0001, 0x0005,
+	0x0066, 0x080c, 0x1a6a, 0x006e, 0x08a0, 0x00e6, 0x2071, 0x19e7,
+	0x7030, 0x9c06, 0x1120, 0x080c, 0xa074, 0x00ee, 0x0850, 0x6020,
+	0x9084, 0x000f, 0x9086, 0x0006, 0x1150, 0x0086, 0x0096, 0x2049,
+	0x0001, 0x2c40, 0x080c, 0xa1f4, 0x009e, 0x008e, 0x0040, 0x0066,
+	0x080c, 0x9f70, 0x190c, 0x0d7d, 0x080c, 0x9f7e, 0x006e, 0x00ee,
+	0x1904, 0xc4a9, 0x0804, 0xc45f, 0x0036, 0x00e6, 0x2071, 0x19e7,
+	0x704c, 0x9c06, 0x1138, 0x901e, 0x080c, 0xa0f4, 0x00ee, 0x003e,
+	0x0804, 0xc4a9, 0x080c, 0xa32a, 0x00ee, 0x003e, 0x1904, 0xc4a9,
+	0x0804, 0xc45f, 0x00c6, 0x0066, 0x6020, 0x9084, 0x000f, 0x001b,
+	0x006e, 0x00ce, 0x0005, 0xc532, 0xc5f4, 0xc75b, 0xc53a, 0xac04,
+	0xc532, 0xdde4, 0xcf50, 0xc5f4, 0x907a, 0xc7da, 0xc52b, 0xc52b,
+	0xc52b, 0xc52b, 0xc52b, 0x080c, 0x0d7d, 0x080c, 0xca29, 0x1110,
+	0x080c, 0xb591, 0x0005, 0x080c, 0x95ad, 0x0804, 0xabc9, 0x601b,
+	0x0001, 0x0005, 0x080c, 0xc814, 0x0130, 0x6014, 0x0096, 0x2048,
+	0x2c00, 0xa896, 0x009e, 0x080c, 0xa872, 0x080c, 0xcf68, 0x6000,
+	0x908a, 0x0016, 0x1a0c, 0x0d7d, 0x0013, 0x0804, 0xa88e, 0xc55f,
+	0xc561, 0xc58b, 0xc59f, 0xc5ca, 0xc55f, 0xc532, 0xc532, 0xc532,
+	0xc5a6, 0xc5a6, 0xc55f, 0xc55f, 0xc55f, 0xc55f, 0xc5b0, 0x080c,
+	0x0d7d, 0x00e6, 0x6014, 0x0096, 0x2048, 0xa880, 0xc0b5, 0xa882,
+	0x009e, 0x2071, 0x19e7, 0x7030, 0x9c06, 0x01d0, 0x0066, 0x080c,
+	0x9f70, 0x190c, 0x0d7d, 0x080c, 0x9f7e, 0x006e, 0x080c, 0xcee8,
+	0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x2001, 0x1987,
+	0x2004, 0x601a, 0x2009, 0x8020, 0x080c, 0x91cf, 0x00ee, 0x0005,
+	0x601b, 0x0001, 0x0cd8, 0x0096, 0x6014, 0x2048, 0xa880, 0xc0b5,
+	0xa882, 0x009e, 0x080c, 0xcee8, 0x6007, 0x0085, 0x6003, 0x000b,
+	0x6023, 0x0002, 0x2009, 0x8020, 0x080c, 0x91cf, 0x0005, 0x080c,
+	0xa872, 0x080c, 0xaa06, 0x080c, 0xa88e, 0x0c28, 0x0096, 0x601b,
+	0x0001, 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x0005,
+	0x080c, 0x56db, 0x01a8, 0x6014, 0x0096, 0x904d, 0x0180, 0xa864,
+	0xa867, 0x0103, 0xa87b, 0x0006, 0x9086, 0x0139, 0x1140, 0xa867,
+	0x0139, 0xa897, 0x4005, 0xa89b, 0x0004, 0x080c, 0x6d70, 0x009e,
+	0x0804, 0xabc9, 0x6014, 0x0096, 0x904d, 0x0508, 0x080c, 0xcf54,
+	0x01f0, 0x080c, 0xa88e, 0x2001, 0x180f, 0x2004, 0xd0c4, 0x0110,
+	0x009e, 0x0005, 0xa884, 0x009e, 0x8003, 0x800b, 0x810b, 0x9108,
+	0x611a, 0x2001, 0x0037, 0x2c08, 0x080c, 0x1679, 0x6000, 0x9086,
+	0x0004, 0x1120, 0x2009, 0x0048, 0x080c, 0xac68, 0x0005, 0x009e,
+	0x080c, 0x1a6a, 0x0804, 0xc58b, 0x6000, 0x908a, 0x0016, 0x1a0c,
+	0x0d7d, 0x000b, 0x0005, 0xc60b, 0xc537, 0xc60d, 0xc60b, 0xc60d,
+	0xc60d, 0xc533, 0xc60b, 0xc52d, 0xc52d, 0xc60b, 0xc60b, 0xc60b,
+	0xc60b, 0xc60b, 0xc60b, 0x080c, 0x0d7d, 0x6010, 0x00b6, 0x2058,
+	0xb804, 0x9084, 0x00ff, 0x00be, 0x908a, 0x000c, 0x1a0c, 0x0d7d,
+	0x00b6, 0x0013, 0x00be, 0x0005, 0xc628, 0xc6f5, 0xc62a, 0xc66a,
+	0xc62a, 0xc66a, 0xc62a, 0xc638, 0xc628, 0xc66a, 0xc628, 0xc659,
+	0x080c, 0x0d7d, 0x6004, 0x908e, 0x0016, 0x05c0, 0x908e, 0x0004,
+	0x05a8, 0x908e, 0x0002, 0x0590, 0x908e, 0x0052, 0x0904, 0xc6f1,
+	0x6004, 0x080c, 0xca29, 0x0904, 0xc70e, 0x908e, 0x0004, 0x1110,
+	0x080c, 0x3215, 0x908e, 0x0021, 0x0904, 0xc712, 0x908e, 0x0022,
+	0x0904, 0xc756, 0x908e, 0x003d, 0x0904, 0xc712, 0x908e, 0x0039,
+	0x0904, 0xc716, 0x908e, 0x0035, 0x0904, 0xc716, 0x908e, 0x001e,
+	0x0178, 0x908e, 0x0001, 0x1140, 0x6010, 0x2058, 0xb804, 0x9084,
+	0x00ff, 0x9086, 0x0006, 0x0110, 0x080c, 0x31e4, 0x080c, 0xb591,
+	0x0804, 0xac04, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0904,
+	0xc6e2, 0x9186, 0x0002, 0x1904, 0xc6b7, 0x2001, 0x1837, 0x2004,
+	0xd08c, 0x11c8, 0x080c, 0x74d5, 0x11b0, 0x080c, 0xcf2e, 0x0138,
+	0x080c, 0x74f8, 0x1120, 0x080c, 0x73e0, 0x0804, 0xc73f, 0x2001,
+	0x197d, 0x2003, 0x0001, 0x2001, 0x1800, 0x2003, 0x0001, 0x080c,
+	0x7406, 0x0804, 0xc73f, 0x6010, 0x2058, 0x2001, 0x1837, 0x2004,
+	0xd0ac, 0x1904, 0xc73f, 0xb8a0, 0x9084, 0xff80, 0x1904, 0xc73f,
+	0xb840, 0x9084, 0x00ff, 0x9005, 0x0190, 0x8001, 0xb842, 0x6017,
+	0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x604b, 0x0000, 0x080c,
+	0xab73, 0x0128, 0x2b00, 0x6012, 0x6023, 0x0001, 0x0458, 0x00de,
+	0x00ce, 0x6004, 0x908e, 0x0002, 0x11a0, 0x6010, 0x2058, 0xb8a0,
+	0x9086, 0x007e, 0x1170, 0x2009, 0x1837, 0x2104, 0xc085, 0x200a,
+	0x00e6, 0x2071, 0x1800, 0x080c, 0x5fb5, 0x00ee, 0x080c, 0xb591,
+	0x0030, 0x080c, 0xb591, 0x080c, 0x31e4, 0x080c, 0xcf43, 0x00e6,
+	0x0126, 0x2091, 0x8000, 0x080c, 0x3215, 0x012e, 0x00ee, 0x080c,
+	0xac04, 0x0005, 0x2001, 0x0002, 0x080c, 0x656e, 0x6003, 0x0001,
+	0x6007, 0x0002, 0x080c, 0x91f4, 0x080c, 0x966f, 0x00de, 0x00ce,
+	0x0c80, 0x080c, 0x3215, 0x0804, 0xc666, 0x00c6, 0x00d6, 0x6104,
+	0x9186, 0x0016, 0x0d38, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff,
+	0x9005, 0x0904, 0xc6b7, 0x8001, 0xb842, 0x6003, 0x0001, 0x080c,
+	0x91f4, 0x080c, 0x966f, 0x00de, 0x00ce, 0x0898, 0x080c, 0xb591,
+	0x0804, 0xc668, 0x080c, 0xb5cd, 0x0804, 0xc668, 0x00d6, 0x2c68,
+	0x6104, 0x080c, 0xcea6, 0x00de, 0x0118, 0x080c, 0xabc9, 0x00f0,
+	0x6004, 0x8007, 0x6134, 0x918c, 0x00ff, 0x9105, 0x6036, 0x6007,
+	0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x603c, 0x600a, 0x2001,
+	0x1987, 0x2004, 0x601a, 0x602c, 0x2c08, 0x2060, 0x6024, 0xc0b5,
+	0x6026, 0x2160, 0x2009, 0x8020, 0x080c, 0x91ed, 0x0005, 0x00de,
+	0x00ce, 0x080c, 0xb591, 0x080c, 0x31e4, 0x00e6, 0x0126, 0x2091,
+	0x8000, 0x080c, 0x3215, 0x6017, 0x0000, 0x6023, 0x0007, 0x601b,
+	0x0398, 0x604b, 0x0000, 0x012e, 0x00ee, 0x0005, 0x080c, 0xb005,
+	0x1904, 0xc70e, 0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7d,
+	0x0096, 0x00d6, 0x001b, 0x00de, 0x009e, 0x0005, 0xc776, 0xc776,
+	0xc776, 0xc776, 0xc776, 0xc776, 0xc776, 0xc776, 0xc776, 0xc532,
+	0xc776, 0xc537, 0xc778, 0xc537, 0xc785, 0xc776, 0x080c, 0x0d7d,
+	0x6004, 0x9086, 0x008b, 0x0148, 0x6007, 0x008b, 0x6003, 0x000d,
+	0x2009, 0x8020, 0x080c, 0x91ed, 0x0005, 0x080c, 0xcf22, 0x0118,
+	0x080c, 0xcf35, 0x0010, 0x080c, 0xcf43, 0x080c, 0xca03, 0x080c,
+	0xc814, 0x0570, 0x080c, 0x31e4, 0x080c, 0xc814, 0x0168, 0x6014,
+	0x2048, 0xa867, 0x0103, 0xa87b, 0x0006, 0xa877, 0x0000, 0xa880,
+	0xc0ed, 0xa882, 0x080c, 0x6d70, 0x2c68, 0x080c, 0xab73, 0x0150,
+	0x6810, 0x6012, 0x080c, 0xcca8, 0x00c6, 0x2d60, 0x080c, 0xac04,
+	0x00ce, 0x0008, 0x2d60, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007,
+	0x0001, 0x6003, 0x0001, 0x080c, 0x91f4, 0x080c, 0x966f, 0x00c8,
+	0x080c, 0xcf22, 0x0138, 0x6034, 0x9086, 0x4000, 0x1118, 0x080c,
+	0x31e4, 0x08d0, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039,
+	0x0118, 0x9186, 0x0035, 0x1118, 0x080c, 0x31e4, 0x0868, 0x080c,
+	0xac04, 0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7d, 0x0002,
+	0xc7f0, 0xc7f0, 0xc7f2, 0xc7f2, 0xc7f2, 0xc7f0, 0xc7f0, 0xac04,
+	0xc7f0, 0xc7f0, 0xc7f0, 0xc7f0, 0xc7f0, 0xc7f0, 0xc7f0, 0xc7f0,
+	0x080c, 0x0d7d, 0x080c, 0xa872, 0x080c, 0xaa06, 0x080c, 0xa88e,
+	0x6114, 0x0096, 0x2148, 0xa87b, 0x0006, 0x080c, 0x6d70, 0x009e,
+	0x0804, 0xabc9, 0x9284, 0x0003, 0x1158, 0x9282, 0x1ddc, 0x0240,
+	0x2001, 0x181a, 0x2004, 0x9202, 0x1218, 0x9085, 0x0001, 0x0005,
+	0x9006, 0x0ce8, 0x0096, 0x0028, 0x0096, 0x0006, 0x6014, 0x2048,
+	0x000e, 0x0006, 0x9984, 0xf000, 0x9086, 0xf000, 0x0110, 0x080c,
+	0x10e5, 0x000e, 0x009e, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0006,
+	0x0126, 0x2091, 0x8000, 0x2061, 0x1ddc, 0x2071, 0x1800, 0x7354,
+	0x7074, 0x9302, 0x1640, 0x6020, 0x9206, 0x11f8, 0x080c, 0xcf2e,
+	0x0180, 0x9286, 0x0001, 0x1168, 0x6004, 0x9086, 0x0004, 0x1148,
+	0x080c, 0x31e4, 0x080c, 0xcf43, 0x00c6, 0x080c, 0xac04, 0x00ce,
+	0x0060, 0x080c, 0xcc1a, 0x0148, 0x080c, 0xca29, 0x1110, 0x080c,
+	0xb591, 0x00c6, 0x080c, 0xabc9, 0x00ce, 0x9ce0, 0x001c, 0x7068,
+	0x9c02, 0x1208, 0x08a0, 0x012e, 0x000e, 0x003e, 0x00ce, 0x00ee,
+	0x0005, 0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000, 0x210c, 0x81ff,
+	0x0128, 0x2061, 0x1b32, 0x6112, 0x080c, 0x31e4, 0x9006, 0x0010,
+	0x9085, 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6, 0x0126,
+	0x2091, 0x8000, 0x080c, 0xab73, 0x01b0, 0x665e, 0x2b00, 0x6012,
+	0x080c, 0x56db, 0x0118, 0x080c, 0xc945, 0x0168, 0x080c, 0xcca8,
+	0x6023, 0x0003, 0x2009, 0x004b, 0x080c, 0xac68, 0x9085, 0x0001,
+	0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091,
+	0x8000, 0xbaa0, 0x080c, 0xac3b, 0x0580, 0x605f, 0x0000, 0x2b00,
+	0x6012, 0x080c, 0xcca8, 0x6023, 0x0003, 0x0016, 0x080c, 0xa872,
+	0x080c, 0x9374, 0x0076, 0x903e, 0x080c, 0x9246, 0x2c08, 0x080c,
+	0xdfc0, 0x007e, 0x080c, 0xa88e, 0x001e, 0xd184, 0x0128, 0x080c,
+	0xabc9, 0x9085, 0x0001, 0x0070, 0x080c, 0x56db, 0x0128, 0xd18c,
+	0x1170, 0x080c, 0xc945, 0x0148, 0x2009, 0x004c, 0x080c, 0xac68,
+	0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2900,
+	0x6016, 0x0c90, 0x2009, 0x004d, 0x0010, 0x2009, 0x004e, 0x00f6,
+	0x00c6, 0x0046, 0x0016, 0x080c, 0xab73, 0x2c78, 0x0590, 0x7e5e,
+	0x2b00, 0x7812, 0x7823, 0x0003, 0x2021, 0x0005, 0x080c, 0xc957,
+	0x9186, 0x004d, 0x0118, 0x9186, 0x004e, 0x0148, 0x2001, 0x1980,
+	0x200c, 0xd1fc, 0x0168, 0x2f60, 0x080c, 0xabc9, 0x00d0, 0x2001,
+	0x197f, 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, 0xabc9, 0x0088,
+	0x2f60, 0x080c, 0x56db, 0x0138, 0xd18c, 0x1118, 0x04f1, 0x0148,
+	0x0010, 0x2900, 0x7816, 0x001e, 0x0016, 0x080c, 0xac68, 0x9085,
+	0x0001, 0x001e, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6,
+	0x0046, 0x080c, 0xab73, 0x2c78, 0x0508, 0x7e5e, 0x2b00, 0x7812,
 	0x7823, 0x0003, 0x0096, 0x2021, 0x0004, 0x0489, 0x009e, 0x2001,
-	0x197e, 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, 0xaad8, 0x0060,
-	0x2f60, 0x080c, 0x5604, 0x0120, 0xd18c, 0x1160, 0x0071, 0x0130,
-	0x2009, 0x0052, 0x080c, 0xab77, 0x9085, 0x0001, 0x004e, 0x00ce,
-	0x00fe, 0x0005, 0x2900, 0x7816, 0x0c98, 0x00c6, 0x080c, 0x49d8,
-	0x00ce, 0x1120, 0x080c, 0xaad8, 0x9006, 0x0005, 0xa867, 0x0000,
+	0x197e, 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, 0xabc9, 0x0060,
+	0x2f60, 0x080c, 0x56db, 0x0120, 0xd18c, 0x1160, 0x0071, 0x0130,
+	0x2009, 0x0052, 0x080c, 0xac68, 0x9085, 0x0001, 0x004e, 0x00ce,
+	0x00fe, 0x0005, 0x2900, 0x7816, 0x0c98, 0x00c6, 0x080c, 0x4aa0,
+	0x00ce, 0x1120, 0x080c, 0xabc9, 0x9006, 0x0005, 0xa867, 0x0000,
 	0xa86b, 0x8000, 0x2900, 0x6016, 0x9085, 0x0001, 0x0005, 0x0096,
-	0x0076, 0x0126, 0x2091, 0x8000, 0x080c, 0xa781, 0x080c, 0x670c,
-	0x0158, 0x2001, 0xc866, 0x0006, 0x900e, 0x2400, 0x080c, 0x6ebf,
-	0x080c, 0x6c7f, 0x000e, 0x0807, 0x2418, 0x080c, 0x946e, 0xbaa0,
-	0x0086, 0x2041, 0x0001, 0x2039, 0x0001, 0x2608, 0x080c, 0x9289,
-	0x008e, 0x080c, 0x9141, 0x2f08, 0x2648, 0x080c, 0xdeb3, 0xb93c,
-	0x81ff, 0x090c, 0x9360, 0x080c, 0xa79d, 0x012e, 0x007e, 0x009e,
-	0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xaa82, 0x0190,
-	0x660a, 0x2b08, 0x6112, 0x080c, 0xcbb0, 0x6023, 0x0001, 0x2900,
-	0x6016, 0x2009, 0x001f, 0x080c, 0xab77, 0x9085, 0x0001, 0x012e,
+	0x0076, 0x0126, 0x2091, 0x8000, 0x080c, 0xa872, 0x080c, 0x67fd,
+	0x0158, 0x2001, 0xc95e, 0x0006, 0x900e, 0x2400, 0x080c, 0x6fb0,
+	0x080c, 0x6d70, 0x000e, 0x0807, 0x2418, 0x080c, 0x9573, 0xbaa0,
+	0x0086, 0x2041, 0x0001, 0x2039, 0x0001, 0x2608, 0x080c, 0x938e,
+	0x008e, 0x080c, 0x9246, 0x2f08, 0x2648, 0x080c, 0xdfc0, 0xb93c,
+	0x81ff, 0x090c, 0x9465, 0x080c, 0xa88e, 0x012e, 0x007e, 0x009e,
+	0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xab73, 0x0190,
+	0x660a, 0x2b08, 0x6112, 0x080c, 0xcca8, 0x6023, 0x0001, 0x2900,
+	0x6016, 0x2009, 0x001f, 0x080c, 0xac68, 0x9085, 0x0001, 0x012e,
 	0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000,
-	0x080c, 0xab4a, 0x01b8, 0x660a, 0x2b08, 0x6112, 0x080c, 0xcbb0,
-	0x6023, 0x0008, 0x2900, 0x6016, 0x00f6, 0x2c78, 0x080c, 0x1728,
-	0x00fe, 0x2009, 0x0021, 0x080c, 0xab77, 0x9085, 0x0001, 0x012e,
+	0x080c, 0xac3b, 0x01b8, 0x660a, 0x2b08, 0x6112, 0x080c, 0xcca8,
+	0x6023, 0x0008, 0x2900, 0x6016, 0x00f6, 0x2c78, 0x080c, 0x1731,
+	0x00fe, 0x2009, 0x0021, 0x080c, 0xac68, 0x9085, 0x0001, 0x012e,
 	0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, 0x003d, 0x00c6, 0x0126,
-	0x0016, 0x2091, 0x8000, 0x080c, 0xaa82, 0x0198, 0x660a, 0x2b08,
-	0x6112, 0x080c, 0xcbb0, 0x6023, 0x0001, 0x2900, 0x6016, 0x001e,
-	0x0016, 0x080c, 0xab77, 0x9085, 0x0001, 0x001e, 0x012e, 0x00ce,
+	0x0016, 0x2091, 0x8000, 0x080c, 0xab73, 0x0198, 0x660a, 0x2b08,
+	0x6112, 0x080c, 0xcca8, 0x6023, 0x0001, 0x2900, 0x6016, 0x001e,
+	0x0016, 0x080c, 0xac68, 0x9085, 0x0001, 0x001e, 0x012e, 0x00ce,
 	0x0005, 0x9006, 0x0cd0, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c,
-	0xab4a, 0x0188, 0x2b08, 0x6112, 0x080c, 0xcbb0, 0x6023, 0x0001,
-	0x2900, 0x6016, 0x2009, 0x0000, 0x080c, 0xab77, 0x9085, 0x0001,
+	0xac3b, 0x0188, 0x2b08, 0x6112, 0x080c, 0xcca8, 0x6023, 0x0001,
+	0x2900, 0x6016, 0x2009, 0x0000, 0x080c, 0xac68, 0x9085, 0x0001,
 	0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, 0x0044, 0x0830,
 	0x2009, 0x0049, 0x0818, 0x0026, 0x00b6, 0x6210, 0x2258, 0xba3c,
 	0x82ff, 0x0118, 0x8211, 0xba3e, 0x1140, 0xb8d0, 0x9005, 0x0128,
@@ -6233,61 +6264,61 @@ unsigned short risc_code01[] = { 
 	0x0006, 0x0016, 0x6004, 0x908e, 0x0002, 0x0140, 0x908e, 0x0003,
 	0x0128, 0x908e, 0x0004, 0x0110, 0x9085, 0x0001, 0x001e, 0x000e,
 	0x0005, 0x0006, 0x0096, 0x6020, 0x9086, 0x0004, 0x0190, 0x6014,
-	0x904d, 0x080c, 0xc723, 0x0168, 0xa864, 0x9086, 0x0139, 0x0158,
+	0x904d, 0x080c, 0xc814, 0x0168, 0xa864, 0x9086, 0x0139, 0x0158,
 	0x6020, 0x9086, 0x0003, 0x0128, 0xa868, 0xd0fc, 0x0110, 0x9006,
 	0x0010, 0x9085, 0x0001, 0x009e, 0x000e, 0x0005, 0x00c6, 0x0126,
-	0x2091, 0x8000, 0x080c, 0xab4a, 0x0198, 0x2b08, 0x6112, 0x080c,
-	0xcbb0, 0x6023, 0x0001, 0x2900, 0x6016, 0x080c, 0x31ab, 0x2009,
-	0x0028, 0x080c, 0xab77, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005,
+	0x2091, 0x8000, 0x080c, 0xac3b, 0x0198, 0x2b08, 0x6112, 0x080c,
+	0xcca8, 0x6023, 0x0001, 0x2900, 0x6016, 0x080c, 0x31e4, 0x2009,
+	0x0028, 0x080c, 0xac68, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005,
 	0x9006, 0x0cd8, 0x9186, 0x0015, 0x11a8, 0x2011, 0x1824, 0x2204,
-	0x9086, 0x0074, 0x1178, 0x00b6, 0x080c, 0xb6f2, 0x00be, 0x080c,
-	0xb915, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, 0x90ef, 0x080c,
-	0x956a, 0x0078, 0x6014, 0x0096, 0x2048, 0xa868, 0x009e, 0xd0fc,
-	0x0148, 0x2001, 0x0001, 0x080c, 0xcd6e, 0x080c, 0xb4a0, 0x080c,
-	0xaad8, 0x0005, 0x0096, 0x6014, 0x904d, 0x090c, 0x0d7d, 0xa87b,
+	0x9086, 0x0074, 0x1178, 0x00b6, 0x080c, 0xb7e3, 0x00be, 0x080c,
+	0xba06, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, 0x91f4, 0x080c,
+	0x966f, 0x0078, 0x6014, 0x0096, 0x2048, 0xa868, 0x009e, 0xd0fc,
+	0x0148, 0x2001, 0x0001, 0x080c, 0xce67, 0x080c, 0xb591, 0x080c,
+	0xabc9, 0x0005, 0x0096, 0x6014, 0x904d, 0x090c, 0x0d7d, 0xa87b,
 	0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0xa867,
-	0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c7f, 0x012e, 0x009e,
-	0x080c, 0xaad8, 0x0c30, 0x0096, 0x9186, 0x0016, 0x1128, 0x2001,
-	0x0004, 0x080c, 0x647d, 0x00e8, 0x9186, 0x0015, 0x1510, 0x2011,
+	0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x6d70, 0x012e, 0x009e,
+	0x080c, 0xabc9, 0x0c30, 0x0096, 0x9186, 0x0016, 0x1128, 0x2001,
+	0x0004, 0x080c, 0x656e, 0x00e8, 0x9186, 0x0015, 0x1510, 0x2011,
 	0x1824, 0x2204, 0x9086, 0x0014, 0x11e0, 0x6010, 0x00b6, 0x2058,
-	0x080c, 0x65c8, 0x00be, 0x080c, 0xb9e6, 0x1198, 0x6010, 0x00b6,
+	0x080c, 0x66b9, 0x00be, 0x080c, 0xbad7, 0x1198, 0x6010, 0x00b6,
 	0x2058, 0xb890, 0x00be, 0x9005, 0x0160, 0x2001, 0x0006, 0x080c,
-	0x647d, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0170, 0x080c, 0xaee8,
-	0x0048, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0528, 0x080c, 0xb4a0,
-	0x080c, 0xaad8, 0x009e, 0x0005, 0x6014, 0x6310, 0x2358, 0x904d,
+	0x656e, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0170, 0x080c, 0xafd9,
+	0x0048, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0528, 0x080c, 0xb591,
+	0x080c, 0xabc9, 0x009e, 0x0005, 0x6014, 0x6310, 0x2358, 0x904d,
 	0x090c, 0x0d7d, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000,
-	0x900e, 0x080c, 0x681c, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108,
-	0xc18d, 0xa99a, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c7f, 0x012e,
-	0x080c, 0xaad8, 0x08f8, 0x6014, 0x904d, 0x090c, 0x0d7d, 0xa87b,
+	0x900e, 0x080c, 0x690d, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108,
+	0xc18d, 0xa99a, 0x0126, 0x2091, 0x8000, 0x080c, 0x6d70, 0x012e,
+	0x080c, 0xabc9, 0x08f8, 0x6014, 0x904d, 0x090c, 0x0d7d, 0xa87b,
 	0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0xa867,
-	0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c7f, 0x012e, 0x080c,
-	0xaad8, 0x0840, 0xa878, 0x9086, 0x0005, 0x1108, 0x0009, 0x0005,
+	0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x6d70, 0x012e, 0x080c,
+	0xabc9, 0x0840, 0xa878, 0x9086, 0x0005, 0x1108, 0x0009, 0x0005,
 	0xa880, 0xc0ad, 0xa882, 0x0005, 0x604b, 0x0000, 0x6017, 0x0000,
-	0x6003, 0x0001, 0x6007, 0x0050, 0x2009, 0x8023, 0x080c, 0x90e8,
+	0x6003, 0x0001, 0x6007, 0x0050, 0x2009, 0x8023, 0x080c, 0x91ed,
 	0x0005, 0x00c6, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc,
 	0x0130, 0x0066, 0x6020, 0x9084, 0x000f, 0x001b, 0x006e, 0x00ce,
-	0x0005, 0xc441, 0xca53, 0xca53, 0xca56, 0xe1db, 0xe1f6, 0xe1f9,
-	0xc441, 0xc441, 0xc441, 0xc441, 0xc441, 0xc441, 0xc441, 0xc441,
-	0xc441, 0x080c, 0x0d7d, 0xa001, 0xa001, 0x0005, 0x0096, 0x6014,
+	0x0005, 0xc532, 0xcb4b, 0xcb4b, 0xcb4e, 0xe2ed, 0xe308, 0xe30b,
+	0xc532, 0xc532, 0xc532, 0xc532, 0xc532, 0xc532, 0xc532, 0xc532,
+	0xc532, 0x080c, 0x0d7d, 0xa001, 0xa001, 0x0005, 0x0096, 0x6014,
 	0x904d, 0x0118, 0xa87c, 0xd0e4, 0x1110, 0x009e, 0x0010, 0x009e,
 	0x0005, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0550,
 	0x2001, 0x1834, 0x2004, 0x9005, 0x1540, 0x00f6, 0x2c78, 0x080c,
-	0xaa82, 0x0508, 0x7810, 0x6012, 0x080c, 0xcbb0, 0x7820, 0x9086,
+	0xab73, 0x0508, 0x7810, 0x6012, 0x080c, 0xcca8, 0x7820, 0x9086,
 	0x0003, 0x0128, 0x7808, 0x603a, 0x2f00, 0x603e, 0x0020, 0x7808,
 	0x603e, 0x2f00, 0x603a, 0x602e, 0x6023, 0x0001, 0x6007, 0x0035,
-	0x6003, 0x0001, 0x795c, 0x615e, 0x2009, 0x8020, 0x080c, 0x90e8,
-	0x2f60, 0x00fe, 0x0005, 0x2f60, 0x00fe, 0x2001, 0x1986, 0x2004,
+	0x6003, 0x0001, 0x795c, 0x615e, 0x2009, 0x8020, 0x080c, 0x91ed,
+	0x2f60, 0x00fe, 0x0005, 0x2f60, 0x00fe, 0x2001, 0x1988, 0x2004,
 	0x604a, 0x0005, 0x0016, 0x0096, 0x6814, 0x2048, 0x681c, 0xd0fc,
 	0xc0fc, 0x681e, 0xa87c, 0x1108, 0xd0e4, 0x0180, 0xc0e4, 0xa87e,
 	0xa877, 0x0000, 0xa893, 0x0000, 0xa88f, 0x0000, 0xd0cc, 0x0130,
-	0xc0cc, 0xa87e, 0xa878, 0x2048, 0x080c, 0x0fed, 0x6830, 0x6036,
+	0xc0cc, 0xa87e, 0xa878, 0x2048, 0x080c, 0x0fec, 0x6830, 0x6036,
 	0x908e, 0x0001, 0x0148, 0x6803, 0x0002, 0x9086, 0x0005, 0x0170,
 	0x9006, 0x602e, 0x6032, 0x00d0, 0x681c, 0xc085, 0x681e, 0x6803,
 	0x0004, 0x6824, 0xc0f4, 0x9085, 0x0c00, 0x6826, 0x6814, 0x2048,
 	0xa8ac, 0x6938, 0x9102, 0xa8b0, 0x693c, 0x9103, 0x1e48, 0x683c,
 	0x602e, 0x6838, 0x9084, 0xfffc, 0x683a, 0x6032, 0x2d00, 0x603a,
 	0x6808, 0x603e, 0x6910, 0x6112, 0x695c, 0x615e, 0x6023, 0x0001,
-	0x6007, 0x0039, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x90e8,
+	0x6007, 0x0039, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x91ed,
 	0x009e, 0x001e, 0x0005, 0x6024, 0xd0d4, 0x0510, 0xd0f4, 0x11f8,
 	0x6038, 0x940a, 0x603c, 0x9303, 0x0230, 0x9105, 0x0120, 0x6024,
 	0xc0d4, 0xc0f5, 0x0098, 0x643a, 0x633e, 0xac3e, 0xab42, 0x0046,
@@ -6299,862 +6330,870 @@ unsigned short risc_code01[] = { 
 	0x0170, 0x908e, 0x0038, 0x0158, 0x908e, 0x0039, 0x0140, 0x908e,
 	0x003a, 0x0128, 0x908e, 0x003b, 0x0110, 0x9085, 0x0001, 0x001e,
 	0x000e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, 0x2001,
-	0x1980, 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, 0x080c, 0x9030,
-	0x2001, 0x1984, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001,
-	0x1982, 0x200c, 0x8000, 0x2014, 0x2071, 0x196c, 0x711a, 0x721e,
-	0x2001, 0x0064, 0x080c, 0x9030, 0x2001, 0x1985, 0x82ff, 0x1110,
-	0x2011, 0x0014, 0x2202, 0x2001, 0x1986, 0x9288, 0x000a, 0x2102,
-	0x2001, 0x0017, 0x080c, 0xa772, 0x2001, 0x1a87, 0x2102, 0x2001,
-	0x0032, 0x080c, 0x1670, 0x080c, 0x694b, 0x00ee, 0x003e, 0x002e,
-	0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x00e6, 0x2001, 0x1984,
-	0x2003, 0x0028, 0x2001, 0x1985, 0x2003, 0x0014, 0x2071, 0x196c,
-	0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, 0x1986, 0x2009, 0x001e,
-	0x2102, 0x2001, 0x0017, 0x080c, 0xa772, 0x2001, 0x1a87, 0x2102,
-	0x2001, 0x0032, 0x080c, 0x1670, 0x00ee, 0x001e, 0x000e, 0x0005,
-	0x0096, 0x6060, 0x904d, 0x0110, 0x080c, 0x106d, 0x009e, 0x0005,
-	0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xaa82, 0x0180,
+	0x1982, 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, 0x080c, 0x9135,
+	0x2001, 0x1986, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001,
+	0x1984, 0x200c, 0x8000, 0x2014, 0x2071, 0x196c, 0x711a, 0x721e,
+	0x2001, 0x0064, 0x080c, 0x9135, 0x2001, 0x1987, 0x82ff, 0x1110,
+	0x2011, 0x0014, 0x2202, 0x2001, 0x1988, 0x9288, 0x000a, 0x2102,
+	0x2001, 0x0017, 0x080c, 0xa863, 0x2001, 0x1a89, 0x2102, 0x2001,
+	0x0032, 0x080c, 0x1679, 0x080c, 0x6a3c, 0x00ee, 0x003e, 0x002e,
+	0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x00e6, 0x2001, 0x1986,
+	0x2003, 0x0028, 0x2001, 0x1987, 0x2003, 0x0014, 0x2071, 0x196c,
+	0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, 0x1988, 0x2009, 0x001e,
+	0x2102, 0x2001, 0x0017, 0x080c, 0xa863, 0x2001, 0x1a89, 0x2102,
+	0x2001, 0x0032, 0x080c, 0x1679, 0x00ee, 0x001e, 0x000e, 0x0005,
+	0x0096, 0x6060, 0x904d, 0x0110, 0x080c, 0x106c, 0x009e, 0x0005,
+	0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xab73, 0x0180,
 	0x2b08, 0x6112, 0x0ca9, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009,
-	0x0033, 0x080c, 0xab77, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005,
+	0x0033, 0x080c, 0xac68, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005,
 	0x9006, 0x0cd8, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186,
 	0x0015, 0x1500, 0x7090, 0x9086, 0x0018, 0x11e0, 0x6014, 0x2048,
-	0xaa3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x9629, 0x01d8, 0x707c,
+	0xaa3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x972e, 0x01d8, 0x707c,
 	0xaa50, 0x9206, 0x1160, 0x7080, 0xaa54, 0x9206, 0x1140, 0x6210,
-	0x00b6, 0x2258, 0xbaa0, 0x00be, 0x900e, 0x080c, 0x31fc, 0x080c,
-	0xaee8, 0x0020, 0x080c, 0xb4a0, 0x080c, 0xaad8, 0x00fe, 0x00ee,
+	0x00b6, 0x2258, 0xbaa0, 0x00be, 0x900e, 0x080c, 0x3235, 0x080c,
+	0xafd9, 0x0020, 0x080c, 0xb591, 0x080c, 0xabc9, 0x00fe, 0x00ee,
 	0x009e, 0x0005, 0x7060, 0xaa54, 0x9206, 0x0d48, 0x0c80, 0x00c6,
-	0x0126, 0x2091, 0x8000, 0x080c, 0xaa82, 0x0188, 0x2b08, 0x6112,
-	0x080c, 0xcbb0, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x004d,
-	0x080c, 0xab77, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006,
-	0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0016, 0x080c, 0xaa82,
-	0x0180, 0x2b08, 0x6112, 0x080c, 0xcbb0, 0x6023, 0x0001, 0x2900,
-	0x6016, 0x001e, 0x080c, 0xab77, 0x9085, 0x0001, 0x012e, 0x00ce,
+	0x0126, 0x2091, 0x8000, 0x080c, 0xab73, 0x0188, 0x2b08, 0x6112,
+	0x080c, 0xcca8, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x004d,
+	0x080c, 0xac68, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006,
+	0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0016, 0x080c, 0xab73,
+	0x0180, 0x2b08, 0x6112, 0x080c, 0xcca8, 0x6023, 0x0001, 0x2900,
+	0x6016, 0x001e, 0x080c, 0xac68, 0x9085, 0x0001, 0x012e, 0x00ce,
 	0x0005, 0x001e, 0x9006, 0x0cd0, 0x0016, 0x0026, 0x0036, 0x0046,
 	0x0056, 0x0066, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186,
 	0x0015, 0x1568, 0x7190, 0x6014, 0x2048, 0xa814, 0x8003, 0x9106,
-	0x1530, 0x20e1, 0x0000, 0x2001, 0x199e, 0x2003, 0x0000, 0x6014,
+	0x1530, 0x20e1, 0x0000, 0x2001, 0x19a0, 0x2003, 0x0000, 0x6014,
 	0x2048, 0xa830, 0x20a8, 0x8906, 0x8006, 0x8007, 0x9094, 0x003f,
-	0x22e8, 0x9084, 0xffc0, 0x9080, 0x001b, 0x20a0, 0x2001, 0x199e,
-	0x0016, 0x200c, 0x080c, 0xd438, 0x001e, 0xa804, 0x9005, 0x0110,
+	0x22e8, 0x9084, 0xffc0, 0x9080, 0x001b, 0x20a0, 0x2001, 0x19a0,
+	0x0016, 0x200c, 0x080c, 0xd540, 0x001e, 0xa804, 0x9005, 0x0110,
 	0x2048, 0x0c38, 0x6014, 0x2048, 0xa867, 0x0103, 0x0010, 0x080c,
-	0xb4a0, 0x080c, 0xaad8, 0x00fe, 0x00ee, 0x009e, 0x006e, 0x005e,
+	0xb591, 0x080c, 0xabc9, 0x00fe, 0x00ee, 0x009e, 0x006e, 0x005e,
 	0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x0096, 0x00e6, 0x00f6,
 	0x2071, 0x1800, 0x9186, 0x0015, 0x11b8, 0x7090, 0x9086, 0x0004,
-	0x1198, 0x6014, 0x2048, 0x2c78, 0x080c, 0x9629, 0x01a8, 0x707c,
+	0x1198, 0x6014, 0x2048, 0x2c78, 0x080c, 0x972e, 0x01a8, 0x707c,
 	0xaa74, 0x9206, 0x1130, 0x7080, 0xaa78, 0x9206, 0x1110, 0x080c,
-	0x31ab, 0x080c, 0xaee8, 0x0020, 0x080c, 0xb4a0, 0x080c, 0xaad8,
+	0x31e4, 0x080c, 0xafd9, 0x0020, 0x080c, 0xb591, 0x080c, 0xabc9,
 	0x00fe, 0x00ee, 0x009e, 0x0005, 0x7060, 0xaa78, 0x9206, 0x0d78,
 	0x0c80, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015,
 	0x1550, 0x7090, 0x9086, 0x0004, 0x1530, 0x6014, 0x2048, 0x2c78,
-	0x080c, 0x9629, 0x05e8, 0x707c, 0xaacc, 0x9206, 0x1180, 0x7080,
-	0xaad0, 0x9206, 0x1160, 0x080c, 0x31ab, 0x0016, 0xa998, 0xaab0,
-	0x9284, 0x1000, 0xc0fd, 0x080c, 0x55b4, 0x001e, 0x0010, 0x080c,
-	0x539d, 0x080c, 0xc723, 0x0500, 0xa87b, 0x0000, 0xa883, 0x0000,
-	0xa897, 0x4000, 0x0078, 0x080c, 0x539d, 0x080c, 0xc723, 0x01a0,
-	0x6014, 0x2048, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005,
-	0xa89b, 0x0004, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, 0x080c,
-	0x6c7f, 0x012e, 0x080c, 0xaad8, 0x00fe, 0x00ee, 0x009e, 0x0005,
-	0x7060, 0xaad0, 0x9206, 0x0938, 0x0890, 0x0016, 0x0026, 0xa87c,
-	0xd0ac, 0x0178, 0xa938, 0xaa34, 0x2100, 0x9205, 0x0150, 0xa890,
-	0x9106, 0x1118, 0xa88c, 0x9206, 0x0120, 0xa992, 0xaa8e, 0x9085,
-	0x0001, 0x002e, 0x001e, 0x0005, 0x00b6, 0x00d6, 0x0036, 0x080c,
-	0xc723, 0x0904, 0xcd6a, 0x0096, 0x6314, 0x2348, 0xa87a, 0xa982,
-	0x929e, 0x4000, 0x1580, 0x6310, 0x00c6, 0x2358, 0x2009, 0x0000,
-	0xa868, 0xd0f4, 0x1140, 0x080c, 0x681c, 0x1108, 0xc185, 0xb800,
-	0xd0bc, 0x0108, 0xc18d, 0xaa96, 0xa99a, 0x20a9, 0x0004, 0xa860,
-	0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8c4, 0x20e0, 0xb8c8,
-	0x9080, 0x0006, 0x2098, 0x080c, 0x0fb8, 0x20a9, 0x0004, 0xa85c,
-	0x9080, 0x0035, 0x20a0, 0xb8c8, 0x9080, 0x000a, 0x2098, 0x080c,
-	0x0fb8, 0x00ce, 0x0090, 0xaa96, 0x3918, 0x9398, 0x0007, 0x231c,
-	0x6004, 0x9086, 0x0016, 0x0110, 0xa89b, 0x0004, 0xaba2, 0x6310,
-	0x2358, 0xb804, 0x9084, 0x00ff, 0xa89e, 0x080c, 0x6c73, 0x6017,
-	0x0000, 0x009e, 0x003e, 0x00de, 0x00be, 0x0005, 0x0026, 0x0036,
-	0x0046, 0x00b6, 0x0096, 0x00f6, 0x6214, 0x2248, 0x6210, 0x2258,
-	0x2079, 0x0260, 0x9096, 0x0000, 0x11a0, 0xb814, 0x9084, 0x00ff,
-	0x900e, 0x080c, 0x25cf, 0x2118, 0x831f, 0x939c, 0xff00, 0x7838,
-	0x9084, 0x00ff, 0x931d, 0x7c3c, 0x2011, 0x8018, 0x080c, 0x4a38,
-	0x00a8, 0x9096, 0x0001, 0x1148, 0x89ff, 0x0180, 0xa89b, 0x000d,
-	0x7838, 0xa8a6, 0x783c, 0xa8aa, 0x0048, 0x9096, 0x0002, 0x1130,
-	0xa89b, 0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, 0x00fe, 0x009e,
-	0x00be, 0x004e, 0x003e, 0x002e, 0x0005, 0x00c6, 0x0026, 0x0016,
-	0x9186, 0x0035, 0x0110, 0x6a38, 0x0008, 0x6a2c, 0x080c, 0xc711,
-	0x01f0, 0x2260, 0x6120, 0x9186, 0x0003, 0x0118, 0x9186, 0x0006,
-	0x1190, 0x6838, 0x9206, 0x0140, 0x683c, 0x9206, 0x1160, 0x6108,
-	0x6838, 0x9106, 0x1140, 0x0020, 0x6008, 0x693c, 0x9106, 0x1118,
-	0x6010, 0x6910, 0x9106, 0x001e, 0x002e, 0x00ce, 0x0005, 0x9085,
-	0x0001, 0x0cc8, 0xa974, 0xd1cc, 0x0188, 0x918c, 0x00ff, 0x918e,
-	0x0002, 0x1160, 0xa9a8, 0x918c, 0x0f00, 0x810f, 0x918e, 0x0001,
-	0x1128, 0xa834, 0xa938, 0x9115, 0x190c, 0xbd9e, 0x0005, 0x0036,
-	0x2019, 0x0001, 0x0010, 0x0036, 0x901e, 0x0499, 0x01e0, 0x080c,
-	0xc723, 0x01c8, 0x080c, 0xc90b, 0x6037, 0x4000, 0x6014, 0x6017,
-	0x0000, 0x0096, 0x2048, 0xa87c, 0x080c, 0xc931, 0x1118, 0x080c,
-	0xb4a0, 0x0040, 0xa867, 0x0103, 0xa877, 0x0000, 0x83ff, 0x1129,
-	0x080c, 0x6c7f, 0x009e, 0x003e, 0x0005, 0xa880, 0xd0b4, 0x0128,
-	0xa87b, 0x0006, 0xc0ec, 0xa882, 0x0048, 0xd0bc, 0x0118, 0xa87b,
-	0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, 0xca20, 0xa877, 0x0000,
-	0x0005, 0x2001, 0x1810, 0x2004, 0xd0ec, 0x0005, 0x0006, 0x2001,
-	0x1810, 0x2004, 0xd0f4, 0x000e, 0x0005, 0x0006, 0x2001, 0x1810,
-	0x2004, 0xd0e4, 0x000e, 0x0005, 0x0036, 0x0046, 0x6010, 0x00b6,
-	0x2058, 0xbba0, 0x00be, 0x2021, 0x0007, 0x080c, 0x4bef, 0x004e,
-	0x003e, 0x0005, 0x0c51, 0x1d81, 0x0005, 0x2001, 0x1984, 0x2004,
-	0x601a, 0x0005, 0x2001, 0x1986, 0x2004, 0x604a, 0x0005, 0x080c,
-	0xaad8, 0x0804, 0x956a, 0x611c, 0xd1fc, 0xa97c, 0x1108, 0xd1e4,
-	0x0005, 0x601c, 0xd0fc, 0xa87c, 0x1108, 0xd0e4, 0x0005, 0x601c,
-	0xd0fc, 0xc0fc, 0x601e, 0xa87c, 0x1108, 0xd0e4, 0x0005, 0x6044,
-	0xd0fc, 0x0160, 0xd0dc, 0x1128, 0x908c, 0x000f, 0x9186, 0x0005,
-	0x1118, 0x6003, 0x0003, 0x0010, 0x6003, 0x0001, 0x0005, 0x00b6,
-	0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d7d, 0x001b, 0x006e,
-	0x00be, 0x0005, 0xce9a, 0xd593, 0xd6e4, 0xce9a, 0xce9a, 0xce9a,
-	0xce9a, 0xce9a, 0xced1, 0xd762, 0xce9a, 0xce9a, 0xce9a, 0xce9a,
-	0xce9a, 0xce9a, 0x080c, 0x0d7d, 0x0066, 0x6000, 0x90b2, 0x0016,
-	0x1a0c, 0x0d7d, 0x0013, 0x006e, 0x0005, 0xceb5, 0xdc74, 0xceb5,
-	0xceb5, 0xceb5, 0xceb5, 0xceb5, 0xceb5, 0xdc23, 0xdcc6, 0xceb5,
-	0xe316, 0xe34a, 0xe316, 0xe34a, 0xceb5, 0x080c, 0x0d7d, 0x6000,
-	0x9082, 0x0016, 0x1a0c, 0x0d7d, 0x6000, 0x000a, 0x0005, 0xcecf,
-	0xd93e, 0xda07, 0xda29, 0xdaa4, 0xcecf, 0xdb9a, 0xdb2c, 0xd76c,
-	0xdbfb, 0xdc10, 0xcecf, 0xcecf, 0xcecf, 0xcecf, 0xcecf, 0x080c,
-	0x0d7d, 0x91b2, 0x0053, 0x1a0c, 0x0d7d, 0x2100, 0x91b2, 0x0040,
-	0x1a04, 0xd30b, 0x0002, 0xcf1b, 0xd0fc, 0xcf1b, 0xcf1b, 0xcf1b,
-	0xd105, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b,
-	0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b,
-	0xcf1b, 0xcf1b, 0xcf1d, 0xcf77, 0xcf86, 0xcfea, 0xd015, 0xd08e,
-	0xd0e7, 0xcf1b, 0xcf1b, 0xd108, 0xcf1b, 0xcf1b, 0xd11d, 0xd12a,
-	0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, 0xd1ad, 0xcf1b, 0xcf1b,
-	0xd1c1, 0xcf1b, 0xcf1b, 0xd17c, 0xcf1b, 0xcf1b, 0xcf1b, 0xd1d9,
-	0xcf1b, 0xcf1b, 0xcf1b, 0xd256, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b,
-	0xcf1b, 0xcf1b, 0xd2d3, 0x080c, 0x0d7d, 0x080c, 0x6928, 0x1150,
-	0x2001, 0x1837, 0x2004, 0xd0cc, 0x1128, 0x9084, 0x0009, 0x9086,
-	0x0008, 0x1140, 0x6007, 0x0009, 0x602f, 0x0009, 0x6017, 0x0000,
-	0x0804, 0xd0f5, 0x080c, 0x68cd, 0x00e6, 0x00c6, 0x0036, 0x0026,
-	0x0016, 0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c,
-	0xa781, 0x080c, 0x926f, 0x0076, 0x903e, 0x080c, 0x9141, 0x2c08,
-	0x080c, 0xdeb3, 0x007e, 0x001e, 0x080c, 0xa79d, 0x001e, 0x002e,
-	0x003e, 0x00ce, 0x00ee, 0x6610, 0x2658, 0x080c, 0x653c, 0xbe04,
-	0x9684, 0x00ff, 0x9082, 0x0006, 0x0278, 0x080c, 0xdde1, 0x1904,
-	0xcfe2, 0x080c, 0xdd7d, 0x1120, 0x6007, 0x0008, 0x0804, 0xd0f5,
-	0x6007, 0x0009, 0x0804, 0xd0f5, 0x080c, 0xe014, 0x0128, 0x080c,
-	0xdde1, 0x0d78, 0x0804, 0xcfe2, 0x6017, 0x1900, 0x0c88, 0x080c,
-	0x32f2, 0x1904, 0xd308, 0x6106, 0x080c, 0xdd30, 0x6007, 0x0006,
-	0x0804, 0xd0f5, 0x6007, 0x0007, 0x0804, 0xd0f5, 0x080c, 0xe386,
-	0x1904, 0xd308, 0x080c, 0x32f2, 0x1904, 0xd308, 0x00d6, 0x6610,
-	0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x1220, 0x2001,
-	0x0001, 0x080c, 0x6469, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006,
-	0x0188, 0x9686, 0x0004, 0x0170, 0xbe04, 0x96b4, 0x00ff, 0x9686,
-	0x0006, 0x0140, 0x9686, 0x0004, 0x0128, 0x9686, 0x0005, 0x0110,
-	0x00de, 0x0480, 0x00e6, 0x2071, 0x0260, 0x7034, 0x9084, 0x0003,
-	0x1140, 0x7034, 0x9082, 0x0014, 0x0220, 0x7030, 0x9084, 0x0003,
-	0x0130, 0x00ee, 0x6017, 0x0000, 0x602f, 0x0007, 0x00b0, 0x00ee,
-	0x080c, 0xde49, 0x1190, 0x9686, 0x0006, 0x1140, 0x0026, 0x6210,
-	0x2258, 0xbaa0, 0x900e, 0x080c, 0x31fc, 0x002e, 0x080c, 0x65c8,
-	0x6007, 0x000a, 0x00de, 0x0804, 0xd0f5, 0x6007, 0x000b, 0x00de,
-	0x0804, 0xd0f5, 0x080c, 0x31ab, 0x080c, 0xce4a, 0x6007, 0x0001,
-	0x0804, 0xd0f5, 0x080c, 0xe386, 0x1904, 0xd308, 0x080c, 0x32f2,
-	0x1904, 0xd308, 0x2071, 0x0260, 0x7034, 0x90b4, 0x0003, 0x1948,
-	0x90b2, 0x0014, 0x0a30, 0x7030, 0x9084, 0x0003, 0x1910, 0x6610,
-	0x2658, 0xbe04, 0x9686, 0x0707, 0x09e8, 0x0026, 0x6210, 0x2258,
-	0xbaa0, 0x900e, 0x080c, 0x31fc, 0x002e, 0x6007, 0x000c, 0x2001,
-	0x0001, 0x080c, 0xe553, 0x0804, 0xd0f5, 0x080c, 0x6928, 0x1140,
-	0x2001, 0x1837, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, 0x1110,
-	0x0804, 0xcf2a, 0x080c, 0x68cd, 0x6610, 0x2658, 0xbe04, 0x9684,
-	0x00ff, 0x9082, 0x0006, 0x06c8, 0x1138, 0x0026, 0x2001, 0x0006,
-	0x080c, 0x64a9, 0x002e, 0x0050, 0x96b4, 0xff00, 0x8637, 0x9686,
-	0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xcfe2, 0x080c, 0xde56,
-	0x1120, 0x6007, 0x000e, 0x0804, 0xd0f5, 0x0046, 0x6410, 0x2458,
-	0xbca0, 0x0046, 0x080c, 0x31ab, 0x080c, 0xce4a, 0x004e, 0x0016,
-	0x9006, 0x2009, 0x1848, 0x210c, 0xd1a4, 0x0148, 0x2009, 0x0029,
-	0x080c, 0xe191, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e,
-	0x004e, 0x6007, 0x0001, 0x0804, 0xd0f5, 0x2001, 0x0001, 0x080c,
-	0x6469, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019,
-	0x1805, 0x2011, 0x0270, 0x080c, 0xba99, 0x003e, 0x002e, 0x001e,
-	0x015e, 0x9005, 0x0168, 0x96b4, 0xff00, 0x8637, 0x9682, 0x0004,
-	0x0a04, 0xcfe2, 0x9682, 0x0007, 0x0a04, 0xd03e, 0x0804, 0xcfe2,
-	0x6017, 0x1900, 0x6007, 0x0009, 0x0804, 0xd0f5, 0x080c, 0x6928,
-	0x1140, 0x2001, 0x1837, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008,
-	0x1110, 0x0804, 0xcf2a, 0x080c, 0x68cd, 0x6610, 0x2658, 0xbe04,
-	0x9684, 0x00ff, 0x9082, 0x0006, 0x0690, 0x96b4, 0xff00, 0x8637,
-	0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xcfe2, 0x080c,
-	0xde84, 0x1130, 0x080c, 0xdd7d, 0x1118, 0x6007, 0x0010, 0x04e8,
-	0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x31ab, 0x080c,
-	0xce4a, 0x004e, 0x0016, 0x9006, 0x2009, 0x1848, 0x210c, 0xd1a4,
-	0x0148, 0x2009, 0x0029, 0x080c, 0xe191, 0x6010, 0x2058, 0xb800,
-	0xc0e5, 0xb802, 0x001e, 0x004e, 0x6007, 0x0001, 0x00f0, 0x080c,
-	0xe014, 0x0140, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0978,
-	0x0804, 0xcfe2, 0x6017, 0x1900, 0x6007, 0x0009, 0x0070, 0x080c,
-	0x32f2, 0x1904, 0xd308, 0x080c, 0xe386, 0x1904, 0xd308, 0x080c,
-	0xd4d3, 0x1904, 0xcfe2, 0x6007, 0x0012, 0x6003, 0x0001, 0x080c,
-	0x90ef, 0x080c, 0x956a, 0x0005, 0x6007, 0x0001, 0x6003, 0x0001,
-	0x080c, 0x90ef, 0x080c, 0x956a, 0x0cb0, 0x6007, 0x0005, 0x0c68,
-	0x080c, 0xe386, 0x1904, 0xd308, 0x080c, 0x32f2, 0x1904, 0xd308,
-	0x080c, 0xd4d3, 0x1904, 0xcfe2, 0x6007, 0x0020, 0x6003, 0x0001,
-	0x080c, 0x90ef, 0x080c, 0x956a, 0x0005, 0x080c, 0x32f2, 0x1904,
-	0xd308, 0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x90ef, 0x080c,
-	0x956a, 0x0005, 0x080c, 0xe386, 0x1904, 0xd308, 0x080c, 0x32f2,
-	0x1904, 0xd308, 0x080c, 0xd4d3, 0x1904, 0xcfe2, 0x0016, 0x0026,
-	0x00e6, 0x2071, 0x0260, 0x7244, 0x9286, 0xffff, 0x0180, 0x2c08,
-	0x080c, 0xc711, 0x01b0, 0x2260, 0x7240, 0x6008, 0x9206, 0x1188,
-	0x6010, 0x9190, 0x0004, 0x2214, 0x9206, 0x01b8, 0x0050, 0x7240,
-	0x2c08, 0x9006, 0x080c, 0xe15b, 0x1180, 0x7244, 0x9286, 0xffff,
-	0x01b0, 0x2160, 0x6007, 0x0026, 0x6017, 0x1700, 0x7214, 0x9296,
-	0xffff, 0x1180, 0x6007, 0x0025, 0x0068, 0x6020, 0x9086, 0x0007,
-	0x1d80, 0x6004, 0x9086, 0x0024, 0x1110, 0x080c, 0xaad8, 0x2160,
-	0x6007, 0x0025, 0x6003, 0x0001, 0x080c, 0x90ef, 0x080c, 0x956a,
-	0x00ee, 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x6469,
-	0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805,
-	0x2011, 0x0276, 0x080c, 0xba99, 0x003e, 0x002e, 0x001e, 0x015e,
-	0x0120, 0x6007, 0x0031, 0x0804, 0xd0f5, 0x080c, 0xb70a, 0x080c,
-	0x73e4, 0x1190, 0x0006, 0x0026, 0x0036, 0x080c, 0x73fe, 0x1138,
-	0x080c, 0x76e8, 0x080c, 0x5f41, 0x080c, 0x7315, 0x0010, 0x080c,
-	0x73b8, 0x003e, 0x002e, 0x000e, 0x0005, 0x080c, 0x32f2, 0x1904,
-	0xd308, 0x080c, 0xd4d3, 0x1904, 0xcfe2, 0x6106, 0x080c, 0xd4ef,
-	0x1120, 0x6007, 0x002b, 0x0804, 0xd0f5, 0x6007, 0x002c, 0x0804,
-	0xd0f5, 0x080c, 0xe386, 0x1904, 0xd308, 0x080c, 0x32f2, 0x1904,
-	0xd308, 0x080c, 0xd4d3, 0x1904, 0xcfe2, 0x6106, 0x080c, 0xd4f4,
-	0x1120, 0x6007, 0x002e, 0x0804, 0xd0f5, 0x6007, 0x002f, 0x0804,
-	0xd0f5, 0x080c, 0x32f2, 0x1904, 0xd308, 0x00e6, 0x00d6, 0x00c6,
-	0x6010, 0x2058, 0xb904, 0x9184, 0x00ff, 0x9086, 0x0006, 0x0158,
-	0x9184, 0xff00, 0x8007, 0x9086, 0x0006, 0x0128, 0x00ce, 0x00de,
-	0x00ee, 0x0804, 0xd0fc, 0x080c, 0x5600, 0xd0e4, 0x0904, 0xd253,
-	0x2071, 0x026c, 0x7010, 0x603a, 0x7014, 0x603e, 0x7108, 0x720c,
-	0x080c, 0x6966, 0x0140, 0x6010, 0x2058, 0xb810, 0x9106, 0x1118,
-	0xb814, 0x9206, 0x0510, 0x080c, 0x6962, 0x15b8, 0x2069, 0x1800,
-	0x6880, 0x9206, 0x1590, 0x687c, 0x9106, 0x1578, 0x7210, 0x080c,
-	0xc711, 0x0590, 0x080c, 0xd3c0, 0x0578, 0x080c, 0xe208, 0x0560,
-	0x622e, 0x6007, 0x0036, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c,
-	0x90e8, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x7214, 0x9286, 0xffff,
-	0x0150, 0x080c, 0xc711, 0x01c0, 0x9280, 0x0002, 0x2004, 0x7110,
-	0x9106, 0x1190, 0x08e0, 0x7210, 0x2c08, 0x9085, 0x0001, 0x080c,
-	0xe15b, 0x2c10, 0x2160, 0x0140, 0x0890, 0x6007, 0x0037, 0x602f,
-	0x0009, 0x6017, 0x1500, 0x08b8, 0x6007, 0x0037, 0x602f, 0x0003,
-	0x6017, 0x1700, 0x0880, 0x6007, 0x0012, 0x0868, 0x080c, 0x32f2,
-	0x1904, 0xd308, 0x6010, 0x2058, 0xb804, 0x9084, 0xff00, 0x8007,
-	0x9086, 0x0006, 0x1904, 0xd0fc, 0x00e6, 0x00d6, 0x00c6, 0x080c,
-	0x5600, 0xd0e4, 0x0904, 0xd2cb, 0x2069, 0x1800, 0x2071, 0x026c,
-	0x7008, 0x603a, 0x720c, 0x623e, 0x9286, 0xffff, 0x1150, 0x7208,
-	0x00c6, 0x2c08, 0x9085, 0x0001, 0x080c, 0xe15b, 0x2c10, 0x00ce,
-	0x05e8, 0x080c, 0xc711, 0x05d0, 0x7108, 0x9280, 0x0002, 0x2004,
-	0x9106, 0x15a0, 0x00c6, 0x0026, 0x2260, 0x080c, 0xc321, 0x002e,
-	0x00ce, 0x7118, 0x918c, 0xff00, 0x810f, 0x9186, 0x0001, 0x0178,
-	0x9186, 0x0005, 0x0118, 0x9186, 0x0007, 0x1198, 0x9280, 0x0005,
-	0x2004, 0x9005, 0x0170, 0x080c, 0xd3c0, 0x0904, 0xd24c, 0x0056,
-	0x7510, 0x7614, 0x080c, 0xe221, 0x005e, 0x00ce, 0x00de, 0x00ee,
-	0x0005, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003,
-	0x0001, 0x2009, 0x8020, 0x080c, 0x90e8, 0x0c78, 0x6007, 0x003b,
-	0x602f, 0x0003, 0x6017, 0x0300, 0x6003, 0x0001, 0x2009, 0x8020,
-	0x080c, 0x90e8, 0x0c10, 0x6007, 0x003b, 0x602f, 0x000b, 0x6017,
-	0x0000, 0x0804, 0xd223, 0x00e6, 0x0026, 0x080c, 0x6928, 0x0550,
-	0x080c, 0x68cd, 0x080c, 0xe3f8, 0x1518, 0x2071, 0x1800, 0x70dc,
-	0x9085, 0x0003, 0x70de, 0x00f6, 0x2079, 0x0100, 0x72b0, 0x9284,
-	0x00ff, 0x707e, 0x78e6, 0x9284, 0xff00, 0x7280, 0x9205, 0x7082,
-	0x78ea, 0x00fe, 0x70e7, 0x0000, 0x080c, 0x6966, 0x0120, 0x2011,
-	0x1a07, 0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2f79, 0x0010,
-	0x080c, 0xe42a, 0x002e, 0x00ee, 0x080c, 0xaad8, 0x0804, 0xd0fb,
-	0x080c, 0xaad8, 0x0005, 0x2600, 0x0002, 0xd31f, 0xd350, 0xd361,
-	0xd31f, 0xd31f, 0xd321, 0xd372, 0xd31f, 0xd31f, 0xd31f, 0xd33e,
-	0xd31f, 0xd31f, 0xd31f, 0xd37d, 0xd38a, 0xd3bb, 0xd31f, 0x080c,
-	0x0d7d, 0x080c, 0xe386, 0x1d20, 0x080c, 0x32f2, 0x1d08, 0x080c,
-	0xd4d3, 0x1148, 0x7038, 0x6016, 0x6007, 0x0045, 0x6003, 0x0001,
-	0x080c, 0x90ef, 0x0005, 0x080c, 0x31ab, 0x080c, 0xce4a, 0x6007,
-	0x0001, 0x6003, 0x0001, 0x080c, 0x90ef, 0x0005, 0x080c, 0xe386,
-	0x1938, 0x080c, 0x32f2, 0x1920, 0x080c, 0xd4d3, 0x1d60, 0x703c,
-	0x6016, 0x6007, 0x004a, 0x6003, 0x0001, 0x080c, 0x90ef, 0x0005,
-	0x080c, 0x32f2, 0x1904, 0xd308, 0x2009, 0x0041, 0x080c, 0xe433,
-	0x6007, 0x0047, 0x6003, 0x0001, 0x080c, 0x90ef, 0x080c, 0x956a,
-	0x0005, 0x080c, 0x32f2, 0x1904, 0xd308, 0x2009, 0x0042, 0x080c,
-	0xe433, 0x6007, 0x0047, 0x6003, 0x0001, 0x080c, 0x90ef, 0x080c,
-	0x956a, 0x0005, 0x080c, 0x32f2, 0x1904, 0xd308, 0x2009, 0x0046,
-	0x080c, 0xe433, 0x080c, 0xaad8, 0x0005, 0x080c, 0xd3db, 0x0904,
-	0xd308, 0x6007, 0x004e, 0x6003, 0x0001, 0x080c, 0x90ef, 0x080c,
-	0x956a, 0x0005, 0x6007, 0x004f, 0x6017, 0x0000, 0x7134, 0x918c,
-	0x00ff, 0x81ff, 0x0508, 0x9186, 0x0001, 0x1160, 0x7140, 0x2001,
-	0x19bb, 0x2004, 0x9106, 0x11b0, 0x7144, 0x2001, 0x19bc, 0x2004,
-	0x9106, 0x0190, 0x9186, 0x0002, 0x1168, 0x2011, 0x0276, 0x20a9,
-	0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xbaad,
-	0x009e, 0x0110, 0x6017, 0x0001, 0x6003, 0x0001, 0x080c, 0x90ef,
-	0x080c, 0x956a, 0x0005, 0x6007, 0x0050, 0x703c, 0x6016, 0x0ca0,
-	0x00e6, 0x2071, 0x0260, 0x00b6, 0x00c6, 0x2260, 0x6010, 0x2058,
-	0xb8d4, 0xd084, 0x0150, 0x7128, 0x6050, 0x9106, 0x1120, 0x712c,
-	0x604c, 0x9106, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce,
-	0x00be, 0x00ee, 0x0005, 0x0016, 0x0096, 0x0086, 0x00e6, 0x01c6,
+	0x080c, 0x972e, 0x05f0, 0x707c, 0xaacc, 0x9206, 0x1180, 0x7080,
+	0xaad0, 0x9206, 0x1160, 0x080c, 0x31e4, 0x0016, 0xa998, 0xaab0,
+	0x9284, 0x1000, 0xc0fd, 0x080c, 0x568b, 0x001e, 0x0010, 0x080c,
+	0x5474, 0x080c, 0xc814, 0x0508, 0xa87b, 0x0000, 0xa883, 0x0000,
+	0xa897, 0x4000, 0x0080, 0x080c, 0xc814, 0x01b8, 0x6014, 0x2048,
+	0x080c, 0x5474, 0x1d70, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897,
+	0x4005, 0xa89b, 0x0004, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139,
+	0x080c, 0x6d70, 0x012e, 0x080c, 0xabc9, 0x00fe, 0x00ee, 0x009e,
+	0x0005, 0x7060, 0xaad0, 0x9206, 0x0930, 0x0888, 0x0016, 0x0026,
+	0xa87c, 0xd0ac, 0x0178, 0xa938, 0xaa34, 0x2100, 0x9205, 0x0150,
+	0xa890, 0x9106, 0x1118, 0xa88c, 0x9206, 0x0120, 0xa992, 0xaa8e,
+	0x9085, 0x0001, 0x002e, 0x001e, 0x0005, 0x00b6, 0x00d6, 0x0036,
+	0x080c, 0xc814, 0x0904, 0xce63, 0x0096, 0x6314, 0x2348, 0xa87a,
+	0xa982, 0x929e, 0x4000, 0x1580, 0x6310, 0x00c6, 0x2358, 0x2009,
+	0x0000, 0xa868, 0xd0f4, 0x1140, 0x080c, 0x690d, 0x1108, 0xc185,
+	0xb800, 0xd0bc, 0x0108, 0xc18d, 0xaa96, 0xa99a, 0x20a9, 0x0004,
+	0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8c4, 0x20e0,
+	0xb8c8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0fb7, 0x20a9, 0x0004,
+	0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8c8, 0x9080, 0x000a, 0x2098,
+	0x080c, 0x0fb7, 0x00ce, 0x0090, 0xaa96, 0x3918, 0x9398, 0x0007,
+	0x231c, 0x6004, 0x9086, 0x0016, 0x0110, 0xa89b, 0x0004, 0xaba2,
+	0x6310, 0x2358, 0xb804, 0x9084, 0x00ff, 0xa89e, 0x080c, 0x6d64,
+	0x6017, 0x0000, 0x009e, 0x003e, 0x00de, 0x00be, 0x0005, 0x0026,
+	0x0036, 0x0046, 0x00b6, 0x0096, 0x00f6, 0x6214, 0x2248, 0x6210,
+	0x2258, 0x2079, 0x0260, 0x9096, 0x0000, 0x11a0, 0xb814, 0x9084,
+	0x00ff, 0x900e, 0x080c, 0x25fb, 0x2118, 0x831f, 0x939c, 0xff00,
+	0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c, 0x2011, 0x8018, 0x080c,
+	0x4b00, 0x00a8, 0x9096, 0x0001, 0x1148, 0x89ff, 0x0180, 0xa89b,
+	0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, 0x0048, 0x9096, 0x0002,
+	0x1130, 0xa89b, 0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, 0x00fe,
+	0x009e, 0x00be, 0x004e, 0x003e, 0x002e, 0x0005, 0x00c6, 0x0026,
+	0x0016, 0x9186, 0x0035, 0x0110, 0x6a38, 0x0008, 0x6a2c, 0x080c,
+	0xc802, 0x01f0, 0x2260, 0x6120, 0x9186, 0x0003, 0x0118, 0x9186,
+	0x0006, 0x1190, 0x6838, 0x9206, 0x0140, 0x683c, 0x9206, 0x1160,
+	0x6108, 0x6838, 0x9106, 0x1140, 0x0020, 0x6008, 0x693c, 0x9106,
+	0x1118, 0x6010, 0x6910, 0x9106, 0x001e, 0x002e, 0x00ce, 0x0005,
+	0x9085, 0x0001, 0x0cc8, 0xa974, 0xd1cc, 0x0188, 0x918c, 0x00ff,
+	0x918e, 0x0002, 0x1160, 0xa9a8, 0x918c, 0x0f00, 0x810f, 0x918e,
+	0x0001, 0x1128, 0xa834, 0xa938, 0x9115, 0x190c, 0xbe8f, 0x0005,
+	0x0036, 0x2019, 0x0001, 0x0010, 0x0036, 0x901e, 0x0499, 0x01e0,
+	0x080c, 0xc814, 0x01c8, 0x080c, 0xca03, 0x6037, 0x4000, 0x6014,
+	0x6017, 0x0000, 0x0096, 0x2048, 0xa87c, 0x080c, 0xca29, 0x1118,
+	0x080c, 0xb591, 0x0040, 0xa867, 0x0103, 0xa877, 0x0000, 0x83ff,
+	0x1129, 0x080c, 0x6d70, 0x009e, 0x003e, 0x0005, 0xa880, 0xd0b4,
+	0x0128, 0xa87b, 0x0006, 0xc0ec, 0xa882, 0x0048, 0xd0bc, 0x0118,
+	0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, 0xcb18, 0xa877,
+	0x0000, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0ec, 0x0005, 0x0006,
+	0x2001, 0x1810, 0x2004, 0xd0f4, 0x000e, 0x0005, 0x0006, 0x2001,
+	0x1810, 0x2004, 0xd0e4, 0x000e, 0x0005, 0x0036, 0x0046, 0x6010,
+	0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0007, 0x080c, 0x4cb7,
+	0x004e, 0x003e, 0x0005, 0x0c51, 0x1d81, 0x0005, 0x2001, 0x1986,
+	0x2004, 0x601a, 0x0005, 0x2001, 0x1988, 0x2004, 0x604a, 0x0005,
+	0x080c, 0xabc9, 0x0804, 0x966f, 0x611c, 0xd1fc, 0xa97c, 0x1108,
+	0xd1e4, 0x0005, 0x601c, 0xd0fc, 0xa87c, 0x1108, 0xd0e4, 0x0005,
+	0x601c, 0xd0fc, 0xc0fc, 0x601e, 0xa87c, 0x1108, 0xd0e4, 0x0005,
+	0x6044, 0xd0fc, 0x0160, 0xd0dc, 0x1128, 0x908c, 0x000f, 0x9186,
+	0x0005, 0x1118, 0x6003, 0x0003, 0x0010, 0x6003, 0x0001, 0x0005,
+	0x00b6, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d7d, 0x001b,
+	0x006e, 0x00be, 0x0005, 0xcf93, 0xd69b, 0xd7ec, 0xcf93, 0xcf93,
+	0xcf93, 0xcf93, 0xcf93, 0xcfca, 0xd86a, 0xcf93, 0xcf93, 0xcf93,
+	0xcf93, 0xcf93, 0xcf93, 0x080c, 0x0d7d, 0x0066, 0x6000, 0x90b2,
+	0x0016, 0x1a0c, 0x0d7d, 0x0013, 0x006e, 0x0005, 0xcfae, 0xdd81,
+	0xcfae, 0xcfae, 0xcfae, 0xcfae, 0xcfae, 0xcfae, 0xdd30, 0xddd3,
+	0xcfae, 0xe428, 0xe45c, 0xe428, 0xe45c, 0xcfae, 0x080c, 0x0d7d,
+	0x6000, 0x9082, 0x0016, 0x1a0c, 0x0d7d, 0x6000, 0x000a, 0x0005,
+	0xcfc8, 0xda46, 0xdb0f, 0xdb31, 0xdbac, 0xcfc8, 0xdca6, 0xdc34,
+	0xd874, 0xdd08, 0xdd1d, 0xcfc8, 0xcfc8, 0xcfc8, 0xcfc8, 0xcfc8,
+	0x080c, 0x0d7d, 0x91b2, 0x0053, 0x1a0c, 0x0d7d, 0x2100, 0x91b2,
+	0x0040, 0x1a04, 0xd411, 0x0002, 0xd014, 0xd202, 0xd014, 0xd014,
+	0xd014, 0xd20b, 0xd014, 0xd014, 0xd014, 0xd014, 0xd014, 0xd014,
+	0xd014, 0xd014, 0xd014, 0xd014, 0xd014, 0xd014, 0xd014, 0xd014,
+	0xd014, 0xd014, 0xd014, 0xd016, 0xd07d, 0xd08c, 0xd0f0, 0xd11b,
+	0xd194, 0xd1ed, 0xd014, 0xd014, 0xd20e, 0xd014, 0xd014, 0xd223,
+	0xd230, 0xd014, 0xd014, 0xd014, 0xd014, 0xd014, 0xd2b3, 0xd014,
+	0xd014, 0xd2c7, 0xd014, 0xd014, 0xd282, 0xd014, 0xd014, 0xd014,
+	0xd2df, 0xd014, 0xd014, 0xd014, 0xd35c, 0xd014, 0xd014, 0xd014,
+	0xd014, 0xd014, 0xd014, 0xd3d9, 0x080c, 0x0d7d, 0x080c, 0x6a19,
+	0x1150, 0x2001, 0x1837, 0x2004, 0xd0cc, 0x1128, 0x9084, 0x0009,
+	0x9086, 0x0008, 0x1140, 0x6007, 0x0009, 0x602f, 0x0009, 0x6017,
+	0x0000, 0x0804, 0xd1fb, 0x080c, 0x69be, 0x00e6, 0x00c6, 0x0036,
+	0x0026, 0x0016, 0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029,
+	0x080c, 0xa872, 0x080c, 0x9374, 0x0076, 0x903e, 0x080c, 0x9246,
+	0x2c08, 0x080c, 0xdfc0, 0x007e, 0x001e, 0x080c, 0xa88e, 0x001e,
+	0x002e, 0x003e, 0x00ce, 0x00ee, 0x6610, 0x2658, 0x080c, 0x662d,
+	0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x1268, 0x0016, 0x0026,
+	0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x2c08, 0x080c, 0xe685,
+	0x002e, 0x001e, 0x1178, 0x080c, 0xdeee, 0x1904, 0xd0e8, 0x080c,
+	0xde8a, 0x1120, 0x6007, 0x0008, 0x0804, 0xd1fb, 0x6007, 0x0009,
+	0x0804, 0xd1fb, 0x080c, 0xe121, 0x0128, 0x080c, 0xdeee, 0x0d78,
+	0x0804, 0xd0e8, 0x6017, 0x1900, 0x0c88, 0x080c, 0x332b, 0x1904,
+	0xd40e, 0x6106, 0x080c, 0xde3d, 0x6007, 0x0006, 0x0804, 0xd1fb,
+	0x6007, 0x0007, 0x0804, 0xd1fb, 0x080c, 0xe498, 0x1904, 0xd40e,
+	0x080c, 0x332b, 0x1904, 0xd40e, 0x00d6, 0x6610, 0x2658, 0xbe04,
+	0x9684, 0x00ff, 0x9082, 0x0006, 0x1220, 0x2001, 0x0001, 0x080c,
+	0x655a, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0188, 0x9686,
+	0x0004, 0x0170, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, 0x0140,
+	0x9686, 0x0004, 0x0128, 0x9686, 0x0005, 0x0110, 0x00de, 0x0480,
+	0x00e6, 0x2071, 0x0260, 0x7034, 0x9084, 0x0003, 0x1140, 0x7034,
+	0x9082, 0x0014, 0x0220, 0x7030, 0x9084, 0x0003, 0x0130, 0x00ee,
+	0x6017, 0x0000, 0x602f, 0x0007, 0x00b0, 0x00ee, 0x080c, 0xdf56,
+	0x1190, 0x9686, 0x0006, 0x1140, 0x0026, 0x6210, 0x2258, 0xbaa0,
+	0x900e, 0x080c, 0x3235, 0x002e, 0x080c, 0x66b9, 0x6007, 0x000a,
+	0x00de, 0x0804, 0xd1fb, 0x6007, 0x000b, 0x00de, 0x0804, 0xd1fb,
+	0x080c, 0x31e4, 0x080c, 0xcf43, 0x6007, 0x0001, 0x0804, 0xd1fb,
+	0x080c, 0xe498, 0x1904, 0xd40e, 0x080c, 0x332b, 0x1904, 0xd40e,
+	0x2071, 0x0260, 0x7034, 0x90b4, 0x0003, 0x1948, 0x90b2, 0x0014,
+	0x0a30, 0x7030, 0x9084, 0x0003, 0x1910, 0x6610, 0x2658, 0xbe04,
+	0x9686, 0x0707, 0x09e8, 0x0026, 0x6210, 0x2258, 0xbaa0, 0x900e,
+	0x080c, 0x3235, 0x002e, 0x6007, 0x000c, 0x2001, 0x0001, 0x080c,
+	0xe665, 0x0804, 0xd1fb, 0x080c, 0x6a19, 0x1140, 0x2001, 0x1837,
+	0x2004, 0x9084, 0x0009, 0x9086, 0x0008, 0x1110, 0x0804, 0xd023,
+	0x080c, 0x69be, 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082,
+	0x0006, 0x06c8, 0x1138, 0x0026, 0x2001, 0x0006, 0x080c, 0x659a,
+	0x002e, 0x0050, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0004, 0x0120,
+	0x9686, 0x0006, 0x1904, 0xd0e8, 0x080c, 0xdf63, 0x1120, 0x6007,
+	0x000e, 0x0804, 0xd1fb, 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046,
+	0x080c, 0x31e4, 0x080c, 0xcf43, 0x004e, 0x0016, 0x9006, 0x2009,
+	0x1848, 0x210c, 0xd1a4, 0x0148, 0x2009, 0x0029, 0x080c, 0xe29e,
+	0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e, 0x004e, 0x6007,
+	0x0001, 0x0804, 0xd1fb, 0x2001, 0x0001, 0x080c, 0x655a, 0x0156,
+	0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011,
+	0x0270, 0x080c, 0xbb8a, 0x003e, 0x002e, 0x001e, 0x015e, 0x9005,
+	0x0168, 0x96b4, 0xff00, 0x8637, 0x9682, 0x0004, 0x0a04, 0xd0e8,
+	0x9682, 0x0007, 0x0a04, 0xd144, 0x0804, 0xd0e8, 0x6017, 0x1900,
+	0x6007, 0x0009, 0x0804, 0xd1fb, 0x080c, 0x6a19, 0x1140, 0x2001,
+	0x1837, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, 0x1110, 0x0804,
+	0xd023, 0x080c, 0x69be, 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff,
+	0x9082, 0x0006, 0x0690, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0004,
+	0x0120, 0x9686, 0x0006, 0x1904, 0xd0e8, 0x080c, 0xdf91, 0x1130,
+	0x080c, 0xde8a, 0x1118, 0x6007, 0x0010, 0x04e8, 0x0046, 0x6410,
+	0x2458, 0xbca0, 0x0046, 0x080c, 0x31e4, 0x080c, 0xcf43, 0x004e,
+	0x0016, 0x9006, 0x2009, 0x1848, 0x210c, 0xd1a4, 0x0148, 0x2009,
+	0x0029, 0x080c, 0xe29e, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802,
+	0x001e, 0x004e, 0x6007, 0x0001, 0x00f0, 0x080c, 0xe121, 0x0140,
+	0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0978, 0x0804, 0xd0e8,
+	0x6017, 0x1900, 0x6007, 0x0009, 0x0070, 0x080c, 0x332b, 0x1904,
+	0xd40e, 0x080c, 0xe498, 0x1904, 0xd40e, 0x080c, 0xd5db, 0x1904,
+	0xd0e8, 0x6007, 0x0012, 0x6003, 0x0001, 0x080c, 0x91f4, 0x080c,
+	0x966f, 0x0005, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x91f4,
+	0x080c, 0x966f, 0x0cb0, 0x6007, 0x0005, 0x0c68, 0x080c, 0xe498,
+	0x1904, 0xd40e, 0x080c, 0x332b, 0x1904, 0xd40e, 0x080c, 0xd5db,
+	0x1904, 0xd0e8, 0x6007, 0x0020, 0x6003, 0x0001, 0x080c, 0x91f4,
+	0x080c, 0x966f, 0x0005, 0x080c, 0x332b, 0x1904, 0xd40e, 0x6007,
+	0x0023, 0x6003, 0x0001, 0x080c, 0x91f4, 0x080c, 0x966f, 0x0005,
+	0x080c, 0xe498, 0x1904, 0xd40e, 0x080c, 0x332b, 0x1904, 0xd40e,
+	0x080c, 0xd5db, 0x1904, 0xd0e8, 0x0016, 0x0026, 0x00e6, 0x2071,
+	0x0260, 0x7244, 0x9286, 0xffff, 0x0180, 0x2c08, 0x080c, 0xc802,
+	0x01b0, 0x2260, 0x7240, 0x6008, 0x9206, 0x1188, 0x6010, 0x9190,
+	0x0004, 0x2214, 0x9206, 0x01b8, 0x0050, 0x7240, 0x2c08, 0x9006,
+	0x080c, 0xe268, 0x1180, 0x7244, 0x9286, 0xffff, 0x01b0, 0x2160,
+	0x6007, 0x0026, 0x6017, 0x1700, 0x7214, 0x9296, 0xffff, 0x1180,
+	0x6007, 0x0025, 0x0068, 0x6020, 0x9086, 0x0007, 0x1d80, 0x6004,
+	0x9086, 0x0024, 0x1110, 0x080c, 0xabc9, 0x2160, 0x6007, 0x0025,
+	0x6003, 0x0001, 0x080c, 0x91f4, 0x080c, 0x966f, 0x00ee, 0x002e,
+	0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x655a, 0x0156, 0x0016,
+	0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0276,
+	0x080c, 0xbb8a, 0x003e, 0x002e, 0x001e, 0x015e, 0x0120, 0x6007,
+	0x0031, 0x0804, 0xd1fb, 0x080c, 0xb7fb, 0x080c, 0x74d5, 0x1190,
+	0x0006, 0x0026, 0x0036, 0x080c, 0x74ef, 0x1138, 0x080c, 0x77d9,
+	0x080c, 0x6022, 0x080c, 0x7406, 0x0010, 0x080c, 0x74a9, 0x003e,
+	0x002e, 0x000e, 0x0005, 0x080c, 0x332b, 0x1904, 0xd40e, 0x080c,
+	0xd5db, 0x1904, 0xd0e8, 0x6106, 0x080c, 0xd5f7, 0x1120, 0x6007,
+	0x002b, 0x0804, 0xd1fb, 0x6007, 0x002c, 0x0804, 0xd1fb, 0x080c,
+	0xe498, 0x1904, 0xd40e, 0x080c, 0x332b, 0x1904, 0xd40e, 0x080c,
+	0xd5db, 0x1904, 0xd0e8, 0x6106, 0x080c, 0xd5fc, 0x1120, 0x6007,
+	0x002e, 0x0804, 0xd1fb, 0x6007, 0x002f, 0x0804, 0xd1fb, 0x080c,
+	0x332b, 0x1904, 0xd40e, 0x00e6, 0x00d6, 0x00c6, 0x6010, 0x2058,
+	0xb904, 0x9184, 0x00ff, 0x9086, 0x0006, 0x0158, 0x9184, 0xff00,
+	0x8007, 0x9086, 0x0006, 0x0128, 0x00ce, 0x00de, 0x00ee, 0x0804,
+	0xd202, 0x080c, 0x56d7, 0xd0e4, 0x0904, 0xd359, 0x2071, 0x026c,
+	0x7010, 0x603a, 0x7014, 0x603e, 0x7108, 0x720c, 0x080c, 0x6a57,
+	0x0140, 0x6010, 0x2058, 0xb810, 0x9106, 0x1118, 0xb814, 0x9206,
+	0x0510, 0x080c, 0x6a53, 0x15b8, 0x2069, 0x1800, 0x6880, 0x9206,
+	0x1590, 0x687c, 0x9106, 0x1578, 0x7210, 0x080c, 0xc802, 0x0590,
+	0x080c, 0xd4c6, 0x0578, 0x080c, 0xe31a, 0x0560, 0x622e, 0x6007,
+	0x0036, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x91ed, 0x00ce,
+	0x00de, 0x00ee, 0x0005, 0x7214, 0x9286, 0xffff, 0x0150, 0x080c,
+	0xc802, 0x01c0, 0x9280, 0x0002, 0x2004, 0x7110, 0x9106, 0x1190,
+	0x08e0, 0x7210, 0x2c08, 0x9085, 0x0001, 0x080c, 0xe268, 0x2c10,
+	0x2160, 0x0140, 0x0890, 0x6007, 0x0037, 0x602f, 0x0009, 0x6017,
+	0x1500, 0x08b8, 0x6007, 0x0037, 0x602f, 0x0003, 0x6017, 0x1700,
+	0x0880, 0x6007, 0x0012, 0x0868, 0x080c, 0x332b, 0x1904, 0xd40e,
+	0x6010, 0x2058, 0xb804, 0x9084, 0xff00, 0x8007, 0x9086, 0x0006,
+	0x1904, 0xd202, 0x00e6, 0x00d6, 0x00c6, 0x080c, 0x56d7, 0xd0e4,
+	0x0904, 0xd3d1, 0x2069, 0x1800, 0x2071, 0x026c, 0x7008, 0x603a,
+	0x720c, 0x623e, 0x9286, 0xffff, 0x1150, 0x7208, 0x00c6, 0x2c08,
+	0x9085, 0x0001, 0x080c, 0xe268, 0x2c10, 0x00ce, 0x05e8, 0x080c,
+	0xc802, 0x05d0, 0x7108, 0x9280, 0x0002, 0x2004, 0x9106, 0x15a0,
+	0x00c6, 0x0026, 0x2260, 0x080c, 0xc412, 0x002e, 0x00ce, 0x7118,
+	0x918c, 0xff00, 0x810f, 0x9186, 0x0001, 0x0178, 0x9186, 0x0005,
+	0x0118, 0x9186, 0x0007, 0x1198, 0x9280, 0x0005, 0x2004, 0x9005,
+	0x0170, 0x080c, 0xd4c6, 0x0904, 0xd352, 0x0056, 0x7510, 0x7614,
+	0x080c, 0xe333, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x6007,
+	0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, 0x0001, 0x2009,
+	0x8020, 0x080c, 0x91ed, 0x0c78, 0x6007, 0x003b, 0x602f, 0x0003,
+	0x6017, 0x0300, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x91ed,
+	0x0c10, 0x6007, 0x003b, 0x602f, 0x000b, 0x6017, 0x0000, 0x0804,
+	0xd329, 0x00e6, 0x0026, 0x080c, 0x6a19, 0x0550, 0x080c, 0x69be,
+	0x080c, 0xe50a, 0x1518, 0x2071, 0x1800, 0x70dc, 0x9085, 0x0003,
+	0x70de, 0x00f6, 0x2079, 0x0100, 0x72b0, 0x9284, 0x00ff, 0x707e,
+	0x78e6, 0x9284, 0xff00, 0x7280, 0x9205, 0x7082, 0x78ea, 0x00fe,
+	0x70e7, 0x0000, 0x080c, 0x6a57, 0x0120, 0x2011, 0x1a09, 0x2013,
+	0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2fb2, 0x0010, 0x080c, 0xe53c,
+	0x002e, 0x00ee, 0x080c, 0xabc9, 0x0804, 0xd201, 0x080c, 0xabc9,
+	0x0005, 0x2600, 0x0002, 0xd425, 0xd456, 0xd467, 0xd425, 0xd425,
+	0xd427, 0xd478, 0xd425, 0xd425, 0xd425, 0xd444, 0xd425, 0xd425,
+	0xd425, 0xd483, 0xd490, 0xd4c1, 0xd425, 0x080c, 0x0d7d, 0x080c,
+	0xe498, 0x1d20, 0x080c, 0x332b, 0x1d08, 0x080c, 0xd5db, 0x1148,
+	0x7038, 0x6016, 0x6007, 0x0045, 0x6003, 0x0001, 0x080c, 0x91f4,
+	0x0005, 0x080c, 0x31e4, 0x080c, 0xcf43, 0x6007, 0x0001, 0x6003,
+	0x0001, 0x080c, 0x91f4, 0x0005, 0x080c, 0xe498, 0x1938, 0x080c,
+	0x332b, 0x1920, 0x080c, 0xd5db, 0x1d60, 0x703c, 0x6016, 0x6007,
+	0x004a, 0x6003, 0x0001, 0x080c, 0x91f4, 0x0005, 0x080c, 0x332b,
+	0x1904, 0xd40e, 0x2009, 0x0041, 0x080c, 0xe545, 0x6007, 0x0047,
+	0x6003, 0x0001, 0x080c, 0x91f4, 0x080c, 0x966f, 0x0005, 0x080c,
+	0x332b, 0x1904, 0xd40e, 0x2009, 0x0042, 0x080c, 0xe545, 0x6007,
+	0x0047, 0x6003, 0x0001, 0x080c, 0x91f4, 0x080c, 0x966f, 0x0005,
+	0x080c, 0x332b, 0x1904, 0xd40e, 0x2009, 0x0046, 0x080c, 0xe545,
+	0x080c, 0xabc9, 0x0005, 0x080c, 0xd4e3, 0x0904, 0xd40e, 0x6007,
+	0x004e, 0x6003, 0x0001, 0x080c, 0x91f4, 0x080c, 0x966f, 0x0005,
+	0x6007, 0x004f, 0x6017, 0x0000, 0x7134, 0x918c, 0x00ff, 0x81ff,
+	0x0508, 0x9186, 0x0001, 0x1160, 0x7140, 0x2001, 0x19bd, 0x2004,
+	0x9106, 0x11b0, 0x7144, 0x2001, 0x19be, 0x2004, 0x9106, 0x0190,
+	0x9186, 0x0002, 0x1168, 0x2011, 0x0276, 0x20a9, 0x0004, 0x6010,
+	0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xbb9e, 0x009e, 0x0110,
+	0x6017, 0x0001, 0x6003, 0x0001, 0x080c, 0x91f4, 0x080c, 0x966f,
+	0x0005, 0x6007, 0x0050, 0x703c, 0x6016, 0x0ca0, 0x0016, 0x00e6,
+	0x2071, 0x0260, 0x00b6, 0x00c6, 0x2260, 0x6010, 0x2058, 0xb8d4,
+	0xd084, 0x0150, 0x7128, 0x6050, 0x9106, 0x1120, 0x712c, 0x604c,
+	0x9106, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce, 0x00be,
+	0x00ee, 0x001e, 0x0005, 0x0016, 0x0096, 0x0086, 0x00e6, 0x01c6,
 	0x01d6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x7090, 0x908a,
-	0x00f9, 0x16e8, 0x20e1, 0x0000, 0x2001, 0x199e, 0x2003, 0x0000,
-	0x080c, 0x1054, 0x05a0, 0x2900, 0x6016, 0x7090, 0x8004, 0xa816,
+	0x00f9, 0x16e8, 0x20e1, 0x0000, 0x2001, 0x19a0, 0x2003, 0x0000,
+	0x080c, 0x1053, 0x05a0, 0x2900, 0x6016, 0x7090, 0x8004, 0xa816,
 	0x908a, 0x001e, 0x02d0, 0xa833, 0x001e, 0x20a9, 0x001e, 0xa860,
-	0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, 0x199e, 0x0016,
-	0x200c, 0x0471, 0x001e, 0x2940, 0x080c, 0x1054, 0x01c0, 0x2900,
+	0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, 0x19a0, 0x0016,
+	0x200c, 0x0471, 0x001e, 0x2940, 0x080c, 0x1053, 0x01c0, 0x2900,
 	0xa006, 0x2100, 0x81ff, 0x0180, 0x0c18, 0xa832, 0x20a8, 0xa860,
-	0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, 0x199e, 0x0016,
+	0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, 0x19a0, 0x0016,
 	0x200c, 0x00b1, 0x001e, 0x0000, 0x9085, 0x0001, 0x0048, 0x2071,
-	0x1800, 0x7093, 0x0000, 0x6014, 0x2048, 0x080c, 0x0fed, 0x9006,
+	0x1800, 0x7093, 0x0000, 0x6014, 0x2048, 0x080c, 0x0fec, 0x9006,
 	0x012e, 0x01de, 0x01ce, 0x00ee, 0x008e, 0x009e, 0x001e, 0x0005,
 	0x0006, 0x0016, 0x0026, 0x0036, 0x00c6, 0x918c, 0xffff, 0x11a8,
-	0x080c, 0x215d, 0x2099, 0x026c, 0x2001, 0x0014, 0x3518, 0x9312,
+	0x080c, 0x2189, 0x2099, 0x026c, 0x2001, 0x0014, 0x3518, 0x9312,
 	0x1218, 0x23a8, 0x4003, 0x00f8, 0x20a8, 0x4003, 0x22a8, 0x8108,
-	0x080c, 0x215d, 0x2099, 0x0260, 0x0ca8, 0x080c, 0x215d, 0x2061,
-	0x199e, 0x6004, 0x2098, 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8,
-	0x4003, 0x0048, 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, 0x215d,
-	0x2099, 0x0260, 0x0ca8, 0x2061, 0x199e, 0x2019, 0x0280, 0x3300,
+	0x080c, 0x2189, 0x2099, 0x0260, 0x0ca8, 0x080c, 0x2189, 0x2061,
+	0x19a0, 0x6004, 0x2098, 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8,
+	0x4003, 0x0048, 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, 0x2189,
+	0x2099, 0x0260, 0x0ca8, 0x2061, 0x19a0, 0x2019, 0x0280, 0x3300,
 	0x931e, 0x0110, 0x6006, 0x0020, 0x2001, 0x0260, 0x6006, 0x8108,
 	0x2162, 0x9292, 0x0021, 0x9296, 0xffff, 0x620a, 0x00ce, 0x003e,
 	0x002e, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036,
-	0x00c6, 0x81ff, 0x11b8, 0x080c, 0x2175, 0x20a1, 0x024c, 0x2001,
+	0x00c6, 0x81ff, 0x11b8, 0x080c, 0x21a1, 0x20a1, 0x024c, 0x2001,
 	0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0418, 0x20a8,
-	0x4003, 0x82ff, 0x01f8, 0x22a8, 0x8108, 0x080c, 0x2175, 0x20a1,
-	0x0240, 0x0c98, 0x080c, 0x2175, 0x2061, 0x19a1, 0x6004, 0x20a0,
+	0x4003, 0x82ff, 0x01f8, 0x22a8, 0x8108, 0x080c, 0x21a1, 0x20a1,
+	0x0240, 0x0c98, 0x080c, 0x21a1, 0x2061, 0x19a3, 0x6004, 0x20a0,
 	0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0058, 0x20a8,
-	0x4003, 0x82ff, 0x0138, 0x22a8, 0x8108, 0x080c, 0x2175, 0x20a1,
-	0x0240, 0x0c98, 0x2061, 0x19a1, 0x2019, 0x0260, 0x3400, 0x931e,
+	0x4003, 0x82ff, 0x0138, 0x22a8, 0x8108, 0x080c, 0x21a1, 0x20a1,
+	0x0240, 0x0c98, 0x2061, 0x19a3, 0x2019, 0x0260, 0x3400, 0x931e,
 	0x0110, 0x6006, 0x0020, 0x2001, 0x0240, 0x6006, 0x8108, 0x2162,
 	0x9292, 0x0021, 0x9296, 0xffff, 0x620a, 0x00ce, 0x003e, 0x002e,
 	0x001e, 0x000e, 0x0005, 0x00b6, 0x0066, 0x6610, 0x2658, 0xbe04,
 	0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0170, 0x9686, 0x0004,
 	0x0158, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, 0x0128, 0x9686,
 	0x0004, 0x0110, 0x9085, 0x0001, 0x006e, 0x00be, 0x0005, 0x00d6,
-	0x080c, 0xd569, 0x00de, 0x0005, 0x00d6, 0x080c, 0xd576, 0x1520,
+	0x080c, 0xd671, 0x00de, 0x0005, 0x00d6, 0x080c, 0xd67e, 0x1520,
 	0x680c, 0x908c, 0xff00, 0x6820, 0x9084, 0x00ff, 0x9115, 0x6216,
-	0x6824, 0x602e, 0xd1e4, 0x0130, 0x9006, 0x080c, 0xe553, 0x2009,
+	0x6824, 0x602e, 0xd1e4, 0x0130, 0x9006, 0x080c, 0xe665, 0x2009,
 	0x0001, 0x0078, 0xd1ec, 0x0180, 0x6920, 0x918c, 0x00ff, 0x6824,
-	0x080c, 0x25cf, 0x1148, 0x2001, 0x0001, 0x080c, 0xe553, 0x2110,
-	0x900e, 0x080c, 0x31fc, 0x0018, 0x9085, 0x0001, 0x0008, 0x9006,
-	0x00de, 0x0005, 0x00b6, 0x00c6, 0x080c, 0xab4a, 0x0598, 0x0016,
+	0x080c, 0x25fb, 0x1148, 0x2001, 0x0001, 0x080c, 0xe665, 0x2110,
+	0x900e, 0x080c, 0x3235, 0x0018, 0x9085, 0x0001, 0x0008, 0x9006,
+	0x00de, 0x0005, 0x00b6, 0x00c6, 0x080c, 0xac3b, 0x0598, 0x0016,
 	0x0026, 0x00c6, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c,
-	0x25cf, 0x1568, 0x080c, 0x64cc, 0x1550, 0xbe12, 0xbd16, 0x00ce,
-	0x002e, 0x001e, 0x2b00, 0x6012, 0x080c, 0xe386, 0x11c8, 0x080c,
-	0x32f2, 0x11b0, 0x080c, 0xd4d3, 0x0500, 0x2001, 0x0007, 0x080c,
-	0x647d, 0x2001, 0x0007, 0x080c, 0x64a9, 0x6017, 0x0000, 0x6023,
-	0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x90ef, 0x0010,
-	0x080c, 0xaad8, 0x9085, 0x0001, 0x00ce, 0x00be, 0x0005, 0x080c,
-	0xaad8, 0x00ce, 0x002e, 0x001e, 0x0ca8, 0x080c, 0xaad8, 0x9006,
+	0x25fb, 0x1568, 0x080c, 0x65bd, 0x1550, 0xbe12, 0xbd16, 0x00ce,
+	0x002e, 0x001e, 0x2b00, 0x6012, 0x080c, 0xe498, 0x11c8, 0x080c,
+	0x332b, 0x11b0, 0x080c, 0xd5db, 0x0500, 0x2001, 0x0007, 0x080c,
+	0x656e, 0x2001, 0x0007, 0x080c, 0x659a, 0x6017, 0x0000, 0x6023,
+	0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x91f4, 0x0010,
+	0x080c, 0xabc9, 0x9085, 0x0001, 0x00ce, 0x00be, 0x0005, 0x080c,
+	0xabc9, 0x00ce, 0x002e, 0x001e, 0x0ca8, 0x080c, 0xabc9, 0x9006,
 	0x0c98, 0x2069, 0x026d, 0x6800, 0x9082, 0x0010, 0x1228, 0x6017,
 	0x0000, 0x9085, 0x0001, 0x0008, 0x9006, 0x0005, 0x6017, 0x0000,
 	0x2069, 0x026c, 0x6808, 0x9084, 0xff00, 0x9086, 0x0800, 0x1190,
 	0x6904, 0x9186, 0x0018, 0x0118, 0x9186, 0x0014, 0x1158, 0x810f,
 	0x6800, 0x9084, 0x00ff, 0x910d, 0x6162, 0x908e, 0x0014, 0x0110,
 	0x908e, 0x0010, 0x0005, 0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0d7d,
-	0x91b6, 0x0013, 0x1130, 0x2008, 0x91b2, 0x0040, 0x1a04, 0xd6b8,
+	0x91b6, 0x0013, 0x1130, 0x2008, 0x91b2, 0x0040, 0x1a04, 0xd7c0,
 	0x0092, 0x91b6, 0x0027, 0x0120, 0x91b6, 0x0014, 0x190c, 0x0d7d,
-	0x2001, 0x0007, 0x080c, 0x64a9, 0x080c, 0x94a8, 0x080c, 0xab13,
-	0x080c, 0x956a, 0x0005, 0xd5f3, 0xd5f5, 0xd5f3, 0xd5f3, 0xd5f3,
-	0xd5f5, 0xd602, 0xd6b5, 0xd652, 0xd6b5, 0xd666, 0xd6b5, 0xd602,
-	0xd6b5, 0xd6ad, 0xd6b5, 0xd6ad, 0xd6b5, 0xd6b5, 0xd5f3, 0xd5f3,
-	0xd5f3, 0xd5f3, 0xd5f3, 0xd5f3, 0xd5f3, 0xd5f3, 0xd5f3, 0xd5f3,
-	0xd5f3, 0xd5f5, 0xd5f3, 0xd6b5, 0xd5f3, 0xd5f3, 0xd6b5, 0xd5f3,
-	0xd6b2, 0xd6b5, 0xd5f3, 0xd5f3, 0xd5f3, 0xd5f3, 0xd6b5, 0xd6b5,
-	0xd5f3, 0xd6b5, 0xd6b5, 0xd5f3, 0xd5fd, 0xd5f3, 0xd5f3, 0xd5f3,
-	0xd5f3, 0xd6b1, 0xd6b5, 0xd5f3, 0xd5f3, 0xd6b5, 0xd6b5, 0xd5f3,
-	0xd5f3, 0xd5f3, 0xd5f3, 0x080c, 0x0d7d, 0x080c, 0xce4d, 0x6003,
-	0x0002, 0x080c, 0x956a, 0x0804, 0xd6b7, 0x9006, 0x080c, 0x6469,
-	0x0804, 0xd6b5, 0x080c, 0x6962, 0x1904, 0xd6b5, 0x9006, 0x080c,
-	0x6469, 0x6010, 0x2058, 0xb810, 0x9086, 0x00ff, 0x1140, 0x00f6,
+	0x2001, 0x0007, 0x080c, 0x659a, 0x080c, 0x95ad, 0x080c, 0xac04,
+	0x080c, 0x966f, 0x0005, 0xd6fb, 0xd6fd, 0xd6fb, 0xd6fb, 0xd6fb,
+	0xd6fd, 0xd70a, 0xd7bd, 0xd75a, 0xd7bd, 0xd76e, 0xd7bd, 0xd70a,
+	0xd7bd, 0xd7b5, 0xd7bd, 0xd7b5, 0xd7bd, 0xd7bd, 0xd6fb, 0xd6fb,
+	0xd6fb, 0xd6fb, 0xd6fb, 0xd6fb, 0xd6fb, 0xd6fb, 0xd6fb, 0xd6fb,
+	0xd6fb, 0xd6fd, 0xd6fb, 0xd7bd, 0xd6fb, 0xd6fb, 0xd7bd, 0xd6fb,
+	0xd7ba, 0xd7bd, 0xd6fb, 0xd6fb, 0xd6fb, 0xd6fb, 0xd7bd, 0xd7bd,
+	0xd6fb, 0xd7bd, 0xd7bd, 0xd6fb, 0xd705, 0xd6fb, 0xd6fb, 0xd6fb,
+	0xd6fb, 0xd7b9, 0xd7bd, 0xd6fb, 0xd6fb, 0xd7bd, 0xd7bd, 0xd6fb,
+	0xd6fb, 0xd6fb, 0xd6fb, 0x080c, 0x0d7d, 0x080c, 0xcf46, 0x6003,
+	0x0002, 0x080c, 0x966f, 0x0804, 0xd7bf, 0x9006, 0x080c, 0x655a,
+	0x0804, 0xd7bd, 0x080c, 0x6a53, 0x1904, 0xd7bd, 0x9006, 0x080c,
+	0x655a, 0x6010, 0x2058, 0xb810, 0x9086, 0x00ff, 0x1140, 0x00f6,
 	0x2079, 0x1800, 0x78a8, 0x8000, 0x78aa, 0x00fe, 0x0428, 0x6010,
-	0x2058, 0xb884, 0x9005, 0x1178, 0x080c, 0xce35, 0x1904, 0xd6b5,
-	0x0036, 0x0046, 0xbba0, 0x2021, 0x0007, 0x080c, 0x4bef, 0x004e,
-	0x003e, 0x0804, 0xd6b5, 0x080c, 0x3323, 0x1904, 0xd6b5, 0x2001,
+	0x2058, 0xb884, 0x9005, 0x1178, 0x080c, 0xcf2e, 0x1904, 0xd7bd,
+	0x0036, 0x0046, 0xbba0, 0x2021, 0x0007, 0x080c, 0x4cb7, 0x004e,
+	0x003e, 0x0804, 0xd7bd, 0x080c, 0x335c, 0x1904, 0xd7bd, 0x2001,
 	0x1800, 0x2004, 0x9086, 0x0002, 0x1138, 0x00f6, 0x2079, 0x1800,
-	0x78a8, 0x8000, 0x78aa, 0x00fe, 0x2001, 0x0002, 0x080c, 0x647d,
-	0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x90ef,
-	0x080c, 0x956a, 0x6110, 0x2158, 0x2009, 0x0001, 0x080c, 0x8519,
-	0x0804, 0xd6b7, 0x6610, 0x2658, 0xbe04, 0x96b4, 0xff00, 0x8637,
-	0x9686, 0x0006, 0x0904, 0xd6b5, 0x9686, 0x0004, 0x0904, 0xd6b5,
-	0x080c, 0x8d94, 0x2001, 0x0004, 0x0804, 0xd6b3, 0x2001, 0x1800,
+	0x78a8, 0x8000, 0x78aa, 0x00fe, 0x2001, 0x0002, 0x080c, 0x656e,
+	0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x91f4,
+	0x080c, 0x966f, 0x6110, 0x2158, 0x2009, 0x0001, 0x080c, 0x861b,
+	0x0804, 0xd7bf, 0x6610, 0x2658, 0xbe04, 0x96b4, 0xff00, 0x8637,
+	0x9686, 0x0006, 0x0904, 0xd7bd, 0x9686, 0x0004, 0x0904, 0xd7bd,
+	0x080c, 0x8e99, 0x2001, 0x0004, 0x0804, 0xd7bb, 0x2001, 0x1800,
 	0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058,
-	0xbba0, 0x2021, 0x0006, 0x080c, 0x4bef, 0x004e, 0x003e, 0x2001,
-	0x0006, 0x080c, 0xd6d1, 0x6610, 0x2658, 0xbe04, 0x0066, 0x96b4,
+	0xbba0, 0x2021, 0x0006, 0x080c, 0x4cb7, 0x004e, 0x003e, 0x2001,
+	0x0006, 0x080c, 0xd7d9, 0x6610, 0x2658, 0xbe04, 0x0066, 0x96b4,
 	0xff00, 0x8637, 0x9686, 0x0006, 0x006e, 0x0168, 0x2001, 0x0006,
-	0x080c, 0x64a9, 0x9284, 0x00ff, 0x908e, 0x0007, 0x1120, 0x2001,
-	0x0006, 0x080c, 0x647d, 0x080c, 0x6962, 0x11f8, 0x2001, 0x1837,
+	0x080c, 0x659a, 0x9284, 0x00ff, 0x908e, 0x0007, 0x1120, 0x2001,
+	0x0006, 0x080c, 0x656e, 0x080c, 0x6a53, 0x11f8, 0x2001, 0x1837,
 	0x2004, 0xd0a4, 0x01d0, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006,
 	0x01a0, 0x00f6, 0x2079, 0x1800, 0x78a8, 0x8000, 0x78aa, 0x00fe,
-	0x0804, 0xd63c, 0x2001, 0x0004, 0x0030, 0x2001, 0x0006, 0x0409,
-	0x0020, 0x0018, 0x0010, 0x080c, 0x64a9, 0x080c, 0xaad8, 0x0005,
-	0x2600, 0x0002, 0xd6cc, 0xd6cc, 0xd6cc, 0xd6cc, 0xd6cc, 0xd6ce,
-	0xd6cc, 0xd6ce, 0xd6cc, 0xd6cc, 0xd6ce, 0xd6cc, 0xd6cc, 0xd6cc,
-	0xd6ce, 0xd6ce, 0xd6ce, 0xd6ce, 0x080c, 0x0d7d, 0x080c, 0xaad8,
+	0x0804, 0xd744, 0x2001, 0x0004, 0x0030, 0x2001, 0x0006, 0x0409,
+	0x0020, 0x0018, 0x0010, 0x080c, 0x659a, 0x080c, 0xabc9, 0x0005,
+	0x2600, 0x0002, 0xd7d4, 0xd7d4, 0xd7d4, 0xd7d4, 0xd7d4, 0xd7d6,
+	0xd7d4, 0xd7d6, 0xd7d4, 0xd7d4, 0xd7d6, 0xd7d4, 0xd7d4, 0xd7d4,
+	0xd7d6, 0xd7d6, 0xd7d6, 0xd7d6, 0x080c, 0x0d7d, 0x080c, 0xabc9,
 	0x0005, 0x0016, 0x00b6, 0x00d6, 0x6110, 0x2158, 0xb900, 0xd184,
-	0x0138, 0x080c, 0x647d, 0x9006, 0x080c, 0x6469, 0x080c, 0x31dc,
+	0x0138, 0x080c, 0x656e, 0x9006, 0x080c, 0x655a, 0x080c, 0x3215,
 	0x00de, 0x00be, 0x001e, 0x0005, 0x6610, 0x2658, 0xb804, 0x9084,
 	0xff00, 0x8007, 0x90b2, 0x000c, 0x1a0c, 0x0d7d, 0x91b6, 0x0015,
 	0x1110, 0x003b, 0x0028, 0x91b6, 0x0016, 0x190c, 0x0d7d, 0x006b,
-	0x0005, 0xb589, 0xb589, 0xb589, 0xb589, 0xb589, 0xb589, 0xd74c,
-	0xd711, 0xb589, 0xb589, 0xb589, 0xb589, 0xb589, 0xb589, 0xb589,
-	0xb589, 0xb589, 0xb589, 0xd74c, 0xd753, 0xb589, 0xb589, 0xb589,
-	0xb589, 0x00f6, 0x080c, 0x6962, 0x11d8, 0x080c, 0xce35, 0x11c0,
+	0x0005, 0xb67a, 0xb67a, 0xb67a, 0xb67a, 0xb67a, 0xb67a, 0xd854,
+	0xd819, 0xb67a, 0xb67a, 0xb67a, 0xb67a, 0xb67a, 0xb67a, 0xb67a,
+	0xb67a, 0xb67a, 0xb67a, 0xd854, 0xd85b, 0xb67a, 0xb67a, 0xb67a,
+	0xb67a, 0x00f6, 0x080c, 0x6a53, 0x11d8, 0x080c, 0xcf2e, 0x11c0,
 	0x6010, 0x905d, 0x01a8, 0xb884, 0x9005, 0x0190, 0x9006, 0x080c,
-	0x6469, 0x2001, 0x0002, 0x080c, 0x647d, 0x6023, 0x0001, 0x6003,
-	0x0001, 0x6007, 0x0002, 0x080c, 0x90ef, 0x080c, 0x956a, 0x00d0,
-	0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x25cf, 0x1190,
-	0x080c, 0x652d, 0x0118, 0x080c, 0xaad8, 0x0060, 0xb810, 0x0006,
-	0xb814, 0x0006, 0x080c, 0x5f5b, 0x000e, 0xb816, 0x000e, 0xb812,
-	0x080c, 0xaad8, 0x00fe, 0x0005, 0x6604, 0x96b6, 0x001e, 0x1110,
-	0x080c, 0xaad8, 0x0005, 0x080c, 0xb912, 0x1148, 0x6003, 0x0001,
-	0x6007, 0x0001, 0x080c, 0x90ef, 0x080c, 0x956a, 0x0010, 0x080c,
-	0xaad8, 0x0005, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0d7d, 0x080c,
-	0x94a8, 0x080c, 0xab13, 0x0005, 0x9182, 0x0040, 0x0002, 0xd782,
-	0xd782, 0xd782, 0xd782, 0xd784, 0xd782, 0xd782, 0xd782, 0xd782,
-	0xd782, 0xd782, 0xd782, 0xd782, 0xd782, 0xd782, 0xd782, 0xd782,
-	0xd782, 0xd782, 0x080c, 0x0d7d, 0x0096, 0x00b6, 0x00d6, 0x00e6,
+	0x655a, 0x2001, 0x0002, 0x080c, 0x656e, 0x6023, 0x0001, 0x6003,
+	0x0001, 0x6007, 0x0002, 0x080c, 0x91f4, 0x080c, 0x966f, 0x00d0,
+	0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x25fb, 0x1190,
+	0x080c, 0x661e, 0x0118, 0x080c, 0xabc9, 0x0060, 0xb810, 0x0006,
+	0xb814, 0x0006, 0x080c, 0x603c, 0x000e, 0xb816, 0x000e, 0xb812,
+	0x080c, 0xabc9, 0x00fe, 0x0005, 0x6604, 0x96b6, 0x001e, 0x1110,
+	0x080c, 0xabc9, 0x0005, 0x080c, 0xba03, 0x1148, 0x6003, 0x0001,
+	0x6007, 0x0001, 0x080c, 0x91f4, 0x080c, 0x966f, 0x0010, 0x080c,
+	0xabc9, 0x0005, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0d7d, 0x080c,
+	0x95ad, 0x080c, 0xac04, 0x0005, 0x9182, 0x0040, 0x0002, 0xd88a,
+	0xd88a, 0xd88a, 0xd88a, 0xd88c, 0xd88a, 0xd88a, 0xd88a, 0xd88a,
+	0xd88a, 0xd88a, 0xd88a, 0xd88a, 0xd88a, 0xd88a, 0xd88a, 0xd88a,
+	0xd88a, 0xd88a, 0x080c, 0x0d7d, 0x0096, 0x00b6, 0x00d6, 0x00e6,
 	0x00f6, 0x0046, 0x0026, 0x6210, 0x2258, 0xb8bc, 0x9005, 0x11b0,
 	0x6007, 0x0044, 0x2071, 0x0260, 0x7444, 0x94a4, 0xff00, 0x0904,
-	0xd7eb, 0x080c, 0xe547, 0x1170, 0x9486, 0x2000, 0x1158, 0x2009,
-	0x0001, 0x2011, 0x0200, 0x080c, 0x87b6, 0x0020, 0x9026, 0x080c,
-	0xe3cb, 0x0c30, 0x080c, 0x103b, 0x090c, 0x0d7d, 0x6003, 0x0007,
+	0xd8f3, 0x080c, 0xe659, 0x1170, 0x9486, 0x2000, 0x1158, 0x2009,
+	0x0001, 0x2011, 0x0200, 0x080c, 0x88bb, 0x0020, 0x9026, 0x080c,
+	0xe4dd, 0x0c30, 0x080c, 0x103a, 0x090c, 0x0d7d, 0x6003, 0x0007,
 	0xa867, 0x010d, 0x9006, 0xa802, 0xa86a, 0xac8a, 0x2c00, 0xa88e,
 	0x6008, 0xa8e2, 0x6010, 0x2058, 0xb8a0, 0x7130, 0xa97a, 0x0016,
 	0xa876, 0xa87f, 0x0000, 0xa883, 0x0000, 0xa887, 0x0036, 0x080c,
-	0x6c7f, 0x001e, 0x080c, 0xe547, 0x1904, 0xd84b, 0x9486, 0x2000,
-	0x1130, 0x2019, 0x0017, 0x080c, 0xe101, 0x0804, 0xd84b, 0x9486,
-	0x0200, 0x1120, 0x080c, 0xe091, 0x0804, 0xd84b, 0x9486, 0x0400,
-	0x0120, 0x9486, 0x1000, 0x1904, 0xd84b, 0x2019, 0x0002, 0x080c,
-	0xe0b0, 0x0804, 0xd84b, 0x2069, 0x1a6d, 0x6a00, 0xd284, 0x0904,
-	0xd8b5, 0x9284, 0x0300, 0x1904, 0xd8ae, 0x6804, 0x9005, 0x0904,
-	0xd896, 0x2d78, 0x6003, 0x0007, 0x080c, 0x1054, 0x0904, 0xd857,
+	0x6d70, 0x001e, 0x080c, 0xe659, 0x1904, 0xd953, 0x9486, 0x2000,
+	0x1130, 0x2019, 0x0017, 0x080c, 0xe20e, 0x0804, 0xd953, 0x9486,
+	0x0200, 0x1120, 0x080c, 0xe19e, 0x0804, 0xd953, 0x9486, 0x0400,
+	0x0120, 0x9486, 0x1000, 0x1904, 0xd953, 0x2019, 0x0002, 0x080c,
+	0xe1bd, 0x0804, 0xd953, 0x2069, 0x1a6f, 0x6a00, 0xd284, 0x0904,
+	0xd9bd, 0x9284, 0x0300, 0x1904, 0xd9b6, 0x6804, 0x9005, 0x0904,
+	0xd99e, 0x2d78, 0x6003, 0x0007, 0x080c, 0x1053, 0x0904, 0xd95f,
 	0x7800, 0xd08c, 0x1118, 0x7804, 0x8001, 0x7806, 0x6017, 0x0000,
-	0x2001, 0x180f, 0x2004, 0xd084, 0x1904, 0xd8b9, 0x9006, 0xa802,
+	0x2001, 0x180f, 0x2004, 0xd084, 0x1904, 0xd9c1, 0x9006, 0xa802,
 	0xa867, 0x0116, 0xa86a, 0x6008, 0xa8e2, 0x2c00, 0xa87a, 0x6010,
 	0x2058, 0xb8a0, 0x7130, 0xa9b6, 0xa876, 0xb928, 0xa9ba, 0xb92c,
 	0xa9be, 0xb930, 0xa9c2, 0xb934, 0xa9c6, 0xa883, 0x003d, 0x7044,
-	0x9084, 0x0003, 0x9080, 0xd853, 0x2005, 0xa87e, 0x20a9, 0x000a,
+	0x9084, 0x0003, 0x9080, 0xd95b, 0x2005, 0xa87e, 0x20a9, 0x000a,
 	0x2001, 0x0270, 0xaa5c, 0x9290, 0x0021, 0x2009, 0x0205, 0x200b,
 	0x0080, 0x20e1, 0x0000, 0xab60, 0x23e8, 0x2098, 0x22a0, 0x4003,
 	0x200b, 0x0000, 0x2001, 0x027a, 0x200c, 0xa9b2, 0x8000, 0x200c,
-	0xa9ae, 0x080c, 0x6c82, 0x002e, 0x004e, 0x00fe, 0x00ee, 0x00de,
+	0xa9ae, 0x080c, 0x6d73, 0x002e, 0x004e, 0x00fe, 0x00ee, 0x00de,
 	0x00be, 0x009e, 0x0005, 0x0000, 0x0080, 0x0040, 0x0000, 0x2001,
-	0x1810, 0x2004, 0xd084, 0x0120, 0x080c, 0x103b, 0x1904, 0xd800,
+	0x1810, 0x2004, 0xd084, 0x0120, 0x080c, 0x103a, 0x1904, 0xd908,
 	0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x2009, 0xa022,
-	0x080c, 0x90e8, 0x0c00, 0x2069, 0x0260, 0x6848, 0x9084, 0xff00,
+	0x080c, 0x91ed, 0x0c00, 0x2069, 0x0260, 0x6848, 0x9084, 0xff00,
 	0x9086, 0x1200, 0x1198, 0x686c, 0x9084, 0x00ff, 0x0016, 0x6114,
 	0x918c, 0xf700, 0x910d, 0x6116, 0x001e, 0x6003, 0x0001, 0x6007,
-	0x0043, 0x2009, 0xa025, 0x080c, 0x90e8, 0x0828, 0x6868, 0x602e,
+	0x0043, 0x2009, 0xa025, 0x080c, 0x91ed, 0x0828, 0x6868, 0x602e,
 	0x686c, 0x6032, 0x6017, 0xf200, 0x6003, 0x0001, 0x6007, 0x0041,
-	0x2009, 0xa022, 0x080c, 0x90e8, 0x0804, 0xd84b, 0x2001, 0x180e,
-	0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x4a38, 0x6017,
+	0x2009, 0xa022, 0x080c, 0x91ed, 0x0804, 0xd953, 0x2001, 0x180e,
+	0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x4b00, 0x6017,
 	0xf300, 0x0010, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041,
-	0x2009, 0xa022, 0x080c, 0x90e8, 0x0804, 0xd84b, 0x6017, 0xf500,
-	0x0c98, 0x6017, 0xf600, 0x0804, 0xd86b, 0x6017, 0xf200, 0x0804,
-	0xd86b, 0xa867, 0x0146, 0xa86b, 0x0000, 0x6008, 0xa886, 0x2c00,
-	0xa87a, 0x7044, 0x9084, 0x0003, 0x9080, 0xd853, 0x2005, 0xa87e,
+	0x2009, 0xa022, 0x080c, 0x91ed, 0x0804, 0xd953, 0x6017, 0xf500,
+	0x0c98, 0x6017, 0xf600, 0x0804, 0xd973, 0x6017, 0xf200, 0x0804,
+	0xd973, 0xa867, 0x0146, 0xa86b, 0x0000, 0x6008, 0xa886, 0x2c00,
+	0xa87a, 0x7044, 0x9084, 0x0003, 0x9080, 0xd95b, 0x2005, 0xa87e,
 	0x2928, 0x6010, 0x2058, 0xb8a0, 0xa876, 0xb828, 0xa88a, 0xb82c,
 	0xa88e, 0xb830, 0xa892, 0xb834, 0xa896, 0xa883, 0x003d, 0x2009,
 	0x0205, 0x2104, 0x9085, 0x0080, 0x200a, 0x20e1, 0x0000, 0x2011,
 	0x0210, 0x2214, 0x9294, 0x0fff, 0xaaa2, 0x9282, 0x0111, 0x1a0c,
 	0x0d7d, 0x8210, 0x821c, 0x2001, 0x026c, 0x2098, 0xa860, 0x20e8,
-	0xa85c, 0x9080, 0x0029, 0x20a0, 0x2011, 0xd935, 0x2041, 0x0001,
+	0xa85c, 0x9080, 0x0029, 0x20a0, 0x2011, 0xda3d, 0x2041, 0x0001,
 	0x223d, 0x9784, 0x00ff, 0x9322, 0x1208, 0x2300, 0x20a8, 0x4003,
 	0x931a, 0x0530, 0x8210, 0xd7fc, 0x1130, 0x8d68, 0x2d0a, 0x2001,
-	0x0260, 0x2098, 0x0c68, 0x2950, 0x080c, 0x1054, 0x0170, 0x2900,
+	0x0260, 0x2098, 0x0c68, 0x2950, 0x080c, 0x1053, 0x0170, 0x2900,
 	0xb002, 0xa867, 0x0147, 0xa86b, 0x0000, 0xa860, 0x20e8, 0xa85c,
 	0x9080, 0x001b, 0x20a0, 0x8840, 0x08d8, 0x2548, 0xa800, 0x902d,
-	0x0118, 0x080c, 0x106d, 0x0cc8, 0x080c, 0x106d, 0x0804, 0xd857,
+	0x0118, 0x080c, 0x106c, 0x0cc8, 0x080c, 0x106c, 0x0804, 0xd95f,
 	0x2548, 0x8847, 0x9885, 0x0046, 0xa866, 0x2009, 0x0205, 0x200b,
-	0x0000, 0x080c, 0xe134, 0x0804, 0xd84b, 0x8010, 0x0004, 0x801a,
+	0x0000, 0x080c, 0xe241, 0x0804, 0xd953, 0x8010, 0x0004, 0x801a,
 	0x0006, 0x8018, 0x0008, 0x8016, 0x000a, 0x8014, 0x9186, 0x0013,
 	0x1160, 0x6004, 0x908a, 0x0057, 0x1a0c, 0x0d7d, 0x9082, 0x0040,
-	0x0a0c, 0x0d7d, 0x2008, 0x0804, 0xd9c0, 0x9186, 0x0051, 0x0108,
-	0x0040, 0x080c, 0xa993, 0x01e8, 0x9086, 0x0002, 0x0904, 0xda07,
+	0x0a0c, 0x0d7d, 0x2008, 0x0804, 0xdac8, 0x9186, 0x0051, 0x0108,
+	0x0040, 0x080c, 0xaa84, 0x01e8, 0x9086, 0x0002, 0x0904, 0xdb0f,
 	0x00c0, 0x9186, 0x0027, 0x0180, 0x9186, 0x0048, 0x0128, 0x9186,
-	0x0014, 0x0150, 0x190c, 0x0d7d, 0x080c, 0xa993, 0x0150, 0x9086,
-	0x0004, 0x0904, 0xdaa4, 0x0028, 0x6004, 0x9082, 0x0040, 0x2008,
-	0x001a, 0x080c, 0xab94, 0x0005, 0xd987, 0xd989, 0xd989, 0xd9b0,
-	0xd987, 0xd987, 0xd987, 0xd987, 0xd987, 0xd987, 0xd987, 0xd987,
-	0xd987, 0xd987, 0xd987, 0xd987, 0xd987, 0xd987, 0xd987, 0x080c,
-	0x0d7d, 0x080c, 0x94a8, 0x080c, 0x956a, 0x0036, 0x0096, 0x6014,
-	0x904d, 0x01d8, 0x080c, 0xc723, 0x01c0, 0x6003, 0x0002, 0x6010,
+	0x0014, 0x0150, 0x190c, 0x0d7d, 0x080c, 0xaa84, 0x0150, 0x9086,
+	0x0004, 0x0904, 0xdbac, 0x0028, 0x6004, 0x9082, 0x0040, 0x2008,
+	0x001a, 0x080c, 0xac85, 0x0005, 0xda8f, 0xda91, 0xda91, 0xdab8,
+	0xda8f, 0xda8f, 0xda8f, 0xda8f, 0xda8f, 0xda8f, 0xda8f, 0xda8f,
+	0xda8f, 0xda8f, 0xda8f, 0xda8f, 0xda8f, 0xda8f, 0xda8f, 0x080c,
+	0x0d7d, 0x080c, 0x95ad, 0x080c, 0x966f, 0x0036, 0x0096, 0x6014,
+	0x904d, 0x01d8, 0x080c, 0xc814, 0x01c0, 0x6003, 0x0002, 0x6010,
 	0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1178, 0x2019, 0x0004,
-	0x080c, 0xe134, 0x6017, 0x0000, 0x6018, 0x9005, 0x1120, 0x2001,
-	0x1985, 0x2004, 0x601a, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005,
-	0x0096, 0x080c, 0x94a8, 0x080c, 0x956a, 0x080c, 0xc723, 0x0120,
-	0x6014, 0x2048, 0x080c, 0x106d, 0x080c, 0xab13, 0x009e, 0x0005,
-	0x0002, 0xd9d4, 0xd9e9, 0xd9d6, 0xd9fe, 0xd9d4, 0xd9d4, 0xd9d4,
-	0xd9d4, 0xd9d4, 0xd9d4, 0xd9d4, 0xd9d4, 0xd9d4, 0xd9d4, 0xd9d4,
-	0xd9d4, 0xd9d4, 0xd9d4, 0xd9d4, 0x080c, 0x0d7d, 0x0096, 0x6014,
+	0x080c, 0xe241, 0x6017, 0x0000, 0x6018, 0x9005, 0x1120, 0x2001,
+	0x1987, 0x2004, 0x601a, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005,
+	0x0096, 0x080c, 0x95ad, 0x080c, 0x966f, 0x080c, 0xc814, 0x0120,
+	0x6014, 0x2048, 0x080c, 0x106c, 0x080c, 0xac04, 0x009e, 0x0005,
+	0x0002, 0xdadc, 0xdaf1, 0xdade, 0xdb06, 0xdadc, 0xdadc, 0xdadc,
+	0xdadc, 0xdadc, 0xdadc, 0xdadc, 0xdadc, 0xdadc, 0xdadc, 0xdadc,
+	0xdadc, 0xdadc, 0xdadc, 0xdadc, 0x080c, 0x0d7d, 0x0096, 0x6014,
 	0x2048, 0xa87c, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, 0x0043,
-	0x080c, 0xab77, 0x0010, 0x6003, 0x0004, 0x080c, 0x956a, 0x009e,
-	0x0005, 0x080c, 0xc723, 0x0138, 0x6114, 0x0096, 0x2148, 0xa97c,
-	0x009e, 0xd1ec, 0x1138, 0x080c, 0x878b, 0x080c, 0xaad8, 0x080c,
-	0x956a, 0x0005, 0x080c, 0xe38f, 0x0db0, 0x0cc8, 0x6003, 0x0001,
-	0x6007, 0x0041, 0x2009, 0xa022, 0x080c, 0x90e8, 0x0005, 0x9182,
-	0x0040, 0x0002, 0xda1d, 0xda1f, 0xda1d, 0xda1d, 0xda1d, 0xda1d,
-	0xda1d, 0xda1d, 0xda1d, 0xda1d, 0xda1d, 0xda1d, 0xda1d, 0xda1d,
-	0xda1d, 0xda1d, 0xda1d, 0xda20, 0xda1d, 0x080c, 0x0d7d, 0x0005,
-	0x00d6, 0x080c, 0x878b, 0x00de, 0x080c, 0xe3e7, 0x080c, 0xaad8,
-	0x0005, 0x9182, 0x0040, 0x0002, 0xda3f, 0xda3f, 0xda3f, 0xda3f,
-	0xda3f, 0xda3f, 0xda3f, 0xda3f, 0xda3f, 0xda41, 0xda6c, 0xda3f,
-	0xda3f, 0xda3f, 0xda3f, 0xda6c, 0xda3f, 0xda3f, 0xda3f, 0x080c,
+	0x080c, 0xac68, 0x0010, 0x6003, 0x0004, 0x080c, 0x966f, 0x009e,
+	0x0005, 0x080c, 0xc814, 0x0138, 0x6114, 0x0096, 0x2148, 0xa97c,
+	0x009e, 0xd1ec, 0x1138, 0x080c, 0x8890, 0x080c, 0xabc9, 0x080c,
+	0x966f, 0x0005, 0x080c, 0xe4a1, 0x0db0, 0x0cc8, 0x6003, 0x0001,
+	0x6007, 0x0041, 0x2009, 0xa022, 0x080c, 0x91ed, 0x0005, 0x9182,
+	0x0040, 0x0002, 0xdb25, 0xdb27, 0xdb25, 0xdb25, 0xdb25, 0xdb25,
+	0xdb25, 0xdb25, 0xdb25, 0xdb25, 0xdb25, 0xdb25, 0xdb25, 0xdb25,
+	0xdb25, 0xdb25, 0xdb25, 0xdb28, 0xdb25, 0x080c, 0x0d7d, 0x0005,
+	0x00d6, 0x080c, 0x8890, 0x00de, 0x080c, 0xe4f9, 0x080c, 0xabc9,
+	0x0005, 0x9182, 0x0040, 0x0002, 0xdb47, 0xdb47, 0xdb47, 0xdb47,
+	0xdb47, 0xdb47, 0xdb47, 0xdb47, 0xdb47, 0xdb49, 0xdb74, 0xdb47,
+	0xdb47, 0xdb47, 0xdb47, 0xdb74, 0xdb47, 0xdb47, 0xdb47, 0x080c,
 	0x0d7d, 0x6014, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0168, 0x908c,
 	0x0003, 0x918e, 0x0002, 0x0180, 0x6144, 0xd1e4, 0x1168, 0x2009,
-	0x0041, 0x009e, 0x0804, 0xdb2c, 0x6003, 0x0007, 0x601b, 0x0000,
-	0x080c, 0x878b, 0x009e, 0x0005, 0x6014, 0x2048, 0xa97c, 0xd1ec,
-	0x1130, 0x080c, 0x878b, 0x080c, 0xaad8, 0x009e, 0x0005, 0x080c,
-	0xe38f, 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c, 0x200c, 0xc1d4,
-	0x2102, 0x0036, 0x080c, 0x9505, 0x080c, 0x956a, 0x6014, 0x0096,
+	0x0041, 0x009e, 0x0804, 0xdc34, 0x6003, 0x0007, 0x601b, 0x0000,
+	0x080c, 0x8890, 0x009e, 0x0005, 0x6014, 0x2048, 0xa97c, 0xd1ec,
+	0x1130, 0x080c, 0x8890, 0x080c, 0xabc9, 0x009e, 0x0005, 0x080c,
+	0xe4a1, 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c, 0x200c, 0xc1d4,
+	0x2102, 0x0036, 0x080c, 0x960a, 0x080c, 0x966f, 0x6014, 0x0096,
 	0x2048, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0188,
 	0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x0140, 0xa8ac, 0x6330,
 	0x931a, 0x6332, 0xa8b0, 0x632c, 0x931b, 0x632e, 0x6003, 0x0002,
-	0x0080, 0x2019, 0x0004, 0x080c, 0xe134, 0x6018, 0x9005, 0x1128,
-	0x2001, 0x1985, 0x2004, 0x8003, 0x601a, 0x6017, 0x0000, 0x6003,
-	0x0007, 0x009e, 0x003e, 0x0005, 0x9182, 0x0040, 0x0002, 0xdabb,
-	0xdabb, 0xdabb, 0xdabb, 0xdabb, 0xdabb, 0xdabb, 0xdabb, 0xdabd,
-	0xdabb, 0xdabb, 0xdabb, 0xdabb, 0xdabb, 0xdabb, 0xdabb, 0xdabb,
-	0xdabb, 0xdabb, 0xdb08, 0x080c, 0x0d7d, 0x6014, 0x0096, 0x2048,
-	0xa834, 0xaa38, 0x6110, 0x00b6, 0x2058, 0xb900, 0x00be, 0xd1bc,
+	0x0080, 0x2019, 0x0004, 0x080c, 0xe241, 0x6018, 0x9005, 0x1128,
+	0x2001, 0x1987, 0x2004, 0x8003, 0x601a, 0x6017, 0x0000, 0x6003,
+	0x0007, 0x009e, 0x003e, 0x0005, 0x9182, 0x0040, 0x0002, 0xdbc3,
+	0xdbc3, 0xdbc3, 0xdbc3, 0xdbc3, 0xdbc3, 0xdbc3, 0xdbc3, 0xdbc5,
+	0xdbc3, 0xdbc3, 0xdbc3, 0xdbc3, 0xdbc3, 0xdbc3, 0xdbc3, 0xdbc3,
+	0xdbc3, 0xdbc3, 0xdc10, 0x080c, 0x0d7d, 0x6014, 0x0096, 0x2048,
+	0xa834, 0xaa38, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1bc,
 	0x1190, 0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128, 0x2009, 0x0041,
-	0x009e, 0x0804, 0xdb2c, 0x6003, 0x0007, 0x601b, 0x0000, 0x080c,
-	0x878b, 0x009e, 0x0005, 0x6124, 0xd1f4, 0x1d58, 0x0006, 0x0046,
+	0x009e, 0x0804, 0xdc34, 0x6003, 0x0007, 0x601b, 0x0000, 0x080c,
+	0x8890, 0x009e, 0x0005, 0x6124, 0xd1f4, 0x1d58, 0x0006, 0x0046,
 	0xacac, 0x9422, 0xa9b0, 0x2200, 0x910b, 0x6030, 0x9420, 0x6432,
 	0x602c, 0x9109, 0x612e, 0x004e, 0x000e, 0x08d8, 0x6110, 0x00b6,
 	0x2158, 0xb900, 0x00be, 0xd1bc, 0x1178, 0x2009, 0x180e, 0x210c,
 	0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, 0x0006, 0x00e9,
-	0x080c, 0x878d, 0x009e, 0x0005, 0x6003, 0x0002, 0x009e, 0x0005,
-	0x6024, 0xd0f4, 0x0128, 0x080c, 0x1667, 0x1904, 0xdabd, 0x0005,
+	0x080c, 0x8892, 0x009e, 0x0005, 0x6003, 0x0002, 0x009e, 0x0005,
+	0x6024, 0xd0f4, 0x0128, 0x080c, 0x1670, 0x1904, 0xdbc5, 0x0005,
 	0x6014, 0x0096, 0x2048, 0xa834, 0xa938, 0x009e, 0x9105, 0x1120,
-	0x080c, 0x1667, 0x1904, 0xdabd, 0x0005, 0xd2fc, 0x0140, 0x8002,
+	0x080c, 0x1670, 0x1904, 0xdbc5, 0x0005, 0xd2fc, 0x0140, 0x8002,
 	0x8000, 0x8212, 0x9291, 0x0000, 0x2009, 0x0009, 0x0010, 0x2009,
 	0x0015, 0xaa9a, 0xa896, 0x0005, 0x9182, 0x0040, 0x0208, 0x0062,
 	0x9186, 0x0013, 0x0120, 0x9186, 0x0014, 0x190c, 0x0d7d, 0x6024,
-	0xd0dc, 0x090c, 0x0d7d, 0x0005, 0xdb4f, 0xdb5b, 0xdb67, 0xdb73,
-	0xdb4f, 0xdb4f, 0xdb4f, 0xdb4f, 0xdb56, 0xdb51, 0xdb51, 0xdb4f,
-	0xdb4f, 0xdb4f, 0xdb4f, 0xdb51, 0xdb4f, 0xdb51, 0xdb4f, 0x080c,
+	0xd0dc, 0x090c, 0x0d7d, 0x0005, 0xdc57, 0xdc63, 0xdc6f, 0xdc7b,
+	0xdc57, 0xdc57, 0xdc57, 0xdc57, 0xdc5e, 0xdc59, 0xdc59, 0xdc57,
+	0xdc57, 0xdc57, 0xdc57, 0xdc59, 0xdc57, 0xdc59, 0xdc57, 0x080c,
 	0x0d7d, 0x6024, 0xd0dc, 0x090c, 0x0d7d, 0x0005, 0x6014, 0x9005,
 	0x190c, 0x0d7d, 0x0005, 0x6003, 0x0001, 0x6106, 0x0126, 0x2091,
-	0x8000, 0x2009, 0xa022, 0x080c, 0x90ca, 0x012e, 0x0005, 0x6003,
+	0x8000, 0x2009, 0xa022, 0x080c, 0x91cf, 0x012e, 0x0005, 0x6003,
 	0x0004, 0x6106, 0x0126, 0x2091, 0x8000, 0x2009, 0xa001, 0x080c,
-	0x90e8, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106, 0x080c, 0x1be0,
-	0x0126, 0x2091, 0x8000, 0x6014, 0x0096, 0x2048, 0xa87c, 0x9084,
-	0x0003, 0x9086, 0x0002, 0x0198, 0x6024, 0xd0cc, 0x1148, 0xd0c4,
-	0x1138, 0xa8a8, 0x2004, 0x9005, 0x1118, 0x2009, 0xb035, 0x0010,
-	0x2009, 0xa035, 0x009e, 0x080c, 0x912f, 0x012e, 0x0005, 0x2009,
-	0xa032, 0x0cc0, 0x0126, 0x2091, 0x8000, 0x0036, 0x0096, 0x9182,
-	0x0040, 0x0023, 0x009e, 0x003e, 0x012e, 0x0005, 0xdbb6, 0xdbb8,
-	0xdbcd, 0xdbe7, 0xdbb6, 0xdbb6, 0xdbb6, 0xdbb6, 0xdbb6, 0xdbb6,
-	0xdbb6, 0xdbb6, 0xdbb6, 0xdbb6, 0xdbb6, 0xdbb6, 0x080c, 0x0d7d,
-	0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0510, 0x909c, 0x0003, 0x939e,
-	0x0003, 0x01e8, 0x6003, 0x0001, 0x6106, 0x0126, 0x2091, 0x8000,
-	0x2009, 0xa022, 0x080c, 0x90e8, 0x0468, 0x6014, 0x2048, 0xa87c,
-	0xd0fc, 0x0168, 0x909c, 0x0003, 0x939e, 0x0003, 0x0140, 0x6003,
-	0x0001, 0x6106, 0x2009, 0xa001, 0x080c, 0x90e8, 0x00d8, 0x901e,
-	0x6316, 0x631a, 0x2019, 0x0004, 0x080c, 0xe134, 0x0098, 0x6014,
-	0x2048, 0xa87c, 0xd0fc, 0x0d98, 0x909c, 0x0003, 0x939e, 0x0003,
-	0x0d70, 0x6003, 0x0003, 0x6106, 0x080c, 0x1be0, 0x2009, 0xa035,
-	0x080c, 0x912f, 0x0005, 0x080c, 0x94a8, 0x6114, 0x81ff, 0x0158,
-	0x0096, 0x2148, 0x080c, 0xe4e4, 0x0036, 0x2019, 0x0029, 0x080c,
-	0xe134, 0x003e, 0x009e, 0x080c, 0xab13, 0x080c, 0x956a, 0x0005,
-	0x080c, 0x9505, 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c,
-	0xe4e4, 0x0036, 0x2019, 0x0029, 0x080c, 0xe134, 0x003e, 0x009e,
-	0x080c, 0xab13, 0x0005, 0x9182, 0x0085, 0x0002, 0xdc35, 0xdc33,
-	0xdc33, 0xdc41, 0xdc33, 0xdc33, 0xdc33, 0xdc33, 0xdc33, 0xdc33,
-	0xdc33, 0xdc33, 0xdc33, 0x080c, 0x0d7d, 0x6003, 0x000b, 0x6106,
-	0x0126, 0x2091, 0x8000, 0x2009, 0x8020, 0x080c, 0x90e8, 0x012e,
-	0x0005, 0x0026, 0x00e6, 0x080c, 0xe386, 0x0118, 0x080c, 0xaad8,
-	0x0440, 0x2071, 0x0260, 0x7224, 0x6216, 0x2001, 0x180e, 0x2004,
-	0xd0e4, 0x0150, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00,
-	0x2011, 0x014e, 0x080c, 0xae05, 0x7220, 0x080c, 0xdfca, 0x0118,
-	0x6007, 0x0086, 0x0040, 0x6007, 0x0087, 0x7224, 0x9296, 0xffff,
-	0x1110, 0x6007, 0x0086, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c,
-	0x90e8, 0x00ee, 0x002e, 0x0005, 0x9186, 0x0013, 0x1160, 0x6004,
-	0x908a, 0x0085, 0x0a0c, 0x0d7d, 0x908a, 0x0092, 0x1a0c, 0x0d7d,
-	0x9082, 0x0085, 0x00a2, 0x9186, 0x0027, 0x0130, 0x9186, 0x0014,
-	0x0118, 0x080c, 0xab94, 0x0050, 0x2001, 0x0007, 0x080c, 0x64a9,
-	0x080c, 0x94a8, 0x080c, 0xab13, 0x080c, 0x956a, 0x0005, 0xdca4,
-	0xdca6, 0xdca6, 0xdca4, 0xdca4, 0xdca4, 0xdca4, 0xdca4, 0xdca4,
-	0xdca4, 0xdca4, 0xdca4, 0xdca4, 0x080c, 0x0d7d, 0x080c, 0xab13,
-	0x080c, 0x956a, 0x0005, 0x9182, 0x0085, 0x0a0c, 0x0d7d, 0x9182,
-	0x0092, 0x1a0c, 0x0d7d, 0x9182, 0x0085, 0x0002, 0xdcc3, 0xdcc3,
-	0xdcc3, 0xdcc5, 0xdcc3, 0xdcc3, 0xdcc3, 0xdcc3, 0xdcc3, 0xdcc3,
-	0xdcc3, 0xdcc3, 0xdcc3, 0x080c, 0x0d7d, 0x0005, 0x9186, 0x0013,
-	0x0148, 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c,
-	0xab94, 0x0020, 0x080c, 0x94a8, 0x080c, 0xab13, 0x0005, 0x0036,
-	0x080c, 0xe3e7, 0x604b, 0x0000, 0x2019, 0x000b, 0x0031, 0x6023,
-	0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, 0x0036, 0x2091,
-	0x8000, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x0006, 0x9086,
-	0x0003, 0x0110, 0x080c, 0xa781, 0x0086, 0x2c40, 0x0096, 0x904e,
-	0x080c, 0xa103, 0x009e, 0x008e, 0x1550, 0x0076, 0x2c38, 0x080c,
-	0xa1ae, 0x007e, 0x1520, 0x6000, 0x9086, 0x0000, 0x0500, 0x6020,
-	0x9086, 0x0007, 0x01e0, 0x0096, 0x601c, 0xd084, 0x0140, 0x080c,
-	0xe3e7, 0x080c, 0xce4d, 0x080c, 0x1a53, 0x6023, 0x0007, 0x6014,
-	0x2048, 0x080c, 0xc723, 0x0110, 0x080c, 0xe134, 0x009e, 0x6017,
-	0x0000, 0x080c, 0xe3e7, 0x6023, 0x0007, 0x080c, 0xce4d, 0x000e,
-	0x9086, 0x0003, 0x0110, 0x080c, 0xa79d, 0x003e, 0x012e, 0x0005,
-	0x00f6, 0x00c6, 0x00b6, 0x0036, 0x0156, 0x2079, 0x0260, 0x7938,
-	0x783c, 0x080c, 0x25cf, 0x15d8, 0x0016, 0x00c6, 0x080c, 0x652d,
-	0x15a0, 0x001e, 0x00c6, 0x2160, 0x080c, 0xce4a, 0x00ce, 0x002e,
-	0x0026, 0x0016, 0x080c, 0xa781, 0x2019, 0x0029, 0x080c, 0xa275,
-	0x080c, 0x926f, 0x0076, 0x903e, 0x080c, 0x9141, 0x007e, 0x001e,
-	0x0076, 0x903e, 0x080c, 0xdeb3, 0x007e, 0x080c, 0xa79d, 0x0026,
-	0xba04, 0x9294, 0xff00, 0x8217, 0x9286, 0x0006, 0x0118, 0x9286,
-	0x0004, 0x1118, 0xbaa0, 0x080c, 0x327e, 0x002e, 0x001e, 0x080c,
-	0x5f5b, 0xbe12, 0xbd16, 0x9006, 0x0010, 0x00ce, 0x001e, 0x015e,
-	0x003e, 0x00be, 0x00ce, 0x00fe, 0x0005, 0x00c6, 0x00d6, 0x00b6,
-	0x0016, 0x2009, 0x1824, 0x2104, 0x9086, 0x0074, 0x1904, 0xddd6,
-	0x2069, 0x0260, 0x6944, 0x9182, 0x0100, 0x06e0, 0x6940, 0x9184,
-	0x8000, 0x0904, 0xddd3, 0x2001, 0x197c, 0x2004, 0x9005, 0x1140,
-	0x6010, 0x2058, 0xb884, 0x9005, 0x0118, 0x9184, 0x0800, 0x0598,
-	0x6948, 0x918a, 0x0001, 0x0648, 0x080c, 0xe54c, 0x0118, 0x6978,
-	0xd1fc, 0x11b8, 0x2009, 0x0205, 0x200b, 0x0001, 0x693c, 0x81ff,
-	0x1198, 0x6944, 0x9182, 0x0100, 0x02a8, 0x6940, 0x81ff, 0x1178,
-	0x6948, 0x918a, 0x0001, 0x0288, 0x6950, 0x918a, 0x0001, 0x0298,
-	0x00d0, 0x6017, 0x0100, 0x00a0, 0x6017, 0x0300, 0x0088, 0x6017,
-	0x0500, 0x0070, 0x6017, 0x0700, 0x0058, 0x6017, 0x0900, 0x0040,
-	0x6017, 0x0b00, 0x0028, 0x6017, 0x0f00, 0x0010, 0x6017, 0x2d00,
-	0x9085, 0x0001, 0x0008, 0x9006, 0x001e, 0x00be, 0x00de, 0x00ce,
-	0x0005, 0x00c6, 0x00b6, 0x0026, 0x0036, 0x0156, 0x6210, 0x2258,
-	0xbb04, 0x9394, 0x00ff, 0x9286, 0x0006, 0x0180, 0x9286, 0x0004,
-	0x0168, 0x9394, 0xff00, 0x8217, 0x9286, 0x0006, 0x0138, 0x9286,
-	0x0004, 0x0120, 0x080c, 0x653c, 0x0804, 0xde42, 0x2011, 0x0276,
-	0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xbaad,
-	0x009e, 0x15c8, 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096, 0x2b48,
-	0x2019, 0x0006, 0x080c, 0xbaad, 0x009e, 0x1568, 0x0046, 0x0016,
-	0xbaa0, 0x2220, 0x9006, 0x2009, 0x1848, 0x210c, 0xd1a4, 0x0138,
-	0x2009, 0x0029, 0x080c, 0xe191, 0xb800, 0xc0e5, 0xb802, 0x080c,
-	0xa781, 0x2019, 0x0029, 0x080c, 0x926f, 0x0076, 0x2039, 0x0000,
-	0x080c, 0x9141, 0x2c08, 0x080c, 0xdeb3, 0x007e, 0x080c, 0xa79d,
-	0x2001, 0x0007, 0x080c, 0x64a9, 0x2001, 0x0007, 0x080c, 0x647d,
-	0x001e, 0x004e, 0x9006, 0x015e, 0x003e, 0x002e, 0x00be, 0x00ce,
-	0x0005, 0x00d6, 0x2069, 0x026e, 0x6800, 0x9086, 0x0800, 0x0118,
-	0x6017, 0x0000, 0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, 0x00f6,
-	0x0016, 0x0026, 0x0036, 0x0156, 0x2079, 0x026c, 0x7930, 0x7834,
-	0x080c, 0x25cf, 0x11d0, 0x080c, 0x652d, 0x11b8, 0x2011, 0x0270,
-	0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xbaad,
-	0x009e, 0x1158, 0x2011, 0x0274, 0x20a9, 0x0004, 0x0096, 0x2b48,
-	0x2019, 0x0006, 0x080c, 0xbaad, 0x009e, 0x015e, 0x003e, 0x002e,
-	0x001e, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x0006, 0x0016, 0x0026,
-	0x0036, 0x0156, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c,
-	0x25cf, 0x11d0, 0x080c, 0x652d, 0x11b8, 0x2011, 0x0276, 0x20a9,
-	0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xbaad, 0x009e,
-	0x1158, 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019,
-	0x0006, 0x080c, 0xbaad, 0x009e, 0x015e, 0x003e, 0x002e, 0x001e,
-	0x000e, 0x00be, 0x0005, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066,
-	0x0056, 0x0046, 0x0026, 0x0126, 0x2091, 0x8000, 0x080c, 0xa7df,
-	0x0106, 0x190c, 0xa781, 0x2740, 0x2029, 0x19f1, 0x252c, 0x2021,
-	0x19f8, 0x2424, 0x2061, 0x1ddc, 0x2071, 0x1800, 0x7654, 0x7074,
-	0x81ff, 0x0150, 0x0006, 0x9186, 0x1b30, 0x000e, 0x0128, 0x8001,
-	0x9602, 0x1a04, 0xdf58, 0x0018, 0x9606, 0x0904, 0xdf58, 0x080c,
-	0x8a5a, 0x0904, 0xdf4f, 0x2100, 0x9c06, 0x0904, 0xdf4f, 0x080c,
-	0xe1cd, 0x1904, 0xdf4f, 0x080c, 0xe569, 0x0904, 0xdf4f, 0x080c,
-	0xe1bd, 0x0904, 0xdf4f, 0x6720, 0x9786, 0x0001, 0x1148, 0x080c,
-	0x3323, 0x0904, 0xdf9a, 0x6004, 0x9086, 0x0000, 0x1904, 0xdf9a,
-	0x9786, 0x0004, 0x0904, 0xdf9a, 0x9786, 0x0007, 0x0904, 0xdf4f,
-	0x2500, 0x9c06, 0x0904, 0xdf4f, 0x2400, 0x9c06, 0x0904, 0xdf4f,
-	0x88ff, 0x0118, 0x605c, 0x9906, 0x15d0, 0x0096, 0x6043, 0xffff,
-	0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1a53, 0x001e,
-	0x9786, 0x000a, 0x0148, 0x080c, 0xc931, 0x1130, 0x080c, 0xb4a0,
-	0x009e, 0x080c, 0xab13, 0x0418, 0x6014, 0x2048, 0x080c, 0xc723,
-	0x01d8, 0x9786, 0x0003, 0x1588, 0xa867, 0x0103, 0xab7a, 0xa877,
-	0x0000, 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878, 0x2048, 0x080c,
-	0x0fed, 0x009e, 0x080c, 0xe4e4, 0x0016, 0x080c, 0xca1a, 0x080c,
-	0x6c73, 0x001e, 0x080c, 0xc90b, 0x009e, 0x080c, 0xab13, 0x9ce0,
-	0x001c, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1210, 0x0804, 0xdecc,
-	0x010e, 0x190c, 0xa79d, 0x012e, 0x002e, 0x004e, 0x005e, 0x006e,
-	0x007e, 0x008e, 0x00ce, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1150,
-	0x9386, 0x0005, 0x0128, 0x080c, 0xe4e4, 0x080c, 0xe134, 0x08e0,
-	0x009e, 0x08e8, 0x9786, 0x0009, 0x11f8, 0x6000, 0x9086, 0x0004,
-	0x01c0, 0x6000, 0x9086, 0x0003, 0x11a0, 0x080c, 0x9505, 0x0096,
-	0x6114, 0x2148, 0x080c, 0xc723, 0x0118, 0x6010, 0x080c, 0x6c7f,
-	0x009e, 0x00c6, 0x080c, 0xaad8, 0x00ce, 0x0036, 0x080c, 0x956a,
-	0x003e, 0x009e, 0x0804, 0xdf4f, 0x9786, 0x000a, 0x0904, 0xdf36,
-	0x0804, 0xdf34, 0x81ff, 0x0904, 0xdf4f, 0x9180, 0x0001, 0x2004,
-	0x9086, 0x0018, 0x0138, 0x9180, 0x0001, 0x2004, 0x9086, 0x002d,
-	0x1904, 0xdf4f, 0x6000, 0x9086, 0x0002, 0x1904, 0xdf4f, 0x080c,
-	0xc920, 0x0138, 0x080c, 0xc931, 0x1904, 0xdf4f, 0x080c, 0xb4a0,
-	0x0038, 0x080c, 0x31dc, 0x080c, 0xc931, 0x1110, 0x080c, 0xb4a0,
-	0x080c, 0xab13, 0x0804, 0xdf4f, 0xa864, 0x9084, 0x00ff, 0x9086,
-	0x0039, 0x0005, 0x00c6, 0x00e6, 0x0016, 0x2c08, 0x2170, 0x9006,
-	0x080c, 0xe15b, 0x001e, 0x0120, 0x6020, 0x9084, 0x000f, 0x001b,
-	0x00ee, 0x00ce, 0x0005, 0xdfe9, 0xdfe9, 0xdfe9, 0xdfe9, 0xdfe9,
-	0xdfe9, 0xdfeb, 0xdfe9, 0xdfe9, 0xdfe9, 0xdfe9, 0xab13, 0xab13,
-	0xdfe9, 0x9006, 0x0005, 0x0036, 0x0046, 0x0016, 0x7010, 0x00b6,
-	0x2058, 0xbca0, 0x00be, 0x2c00, 0x2009, 0x0020, 0x080c, 0xe191,
-	0x001e, 0x004e, 0x2019, 0x0002, 0x080c, 0xdce5, 0x003e, 0x9085,
-	0x0001, 0x0005, 0x0096, 0x080c, 0xc723, 0x0140, 0x6014, 0x904d,
-	0x080c, 0xc32e, 0x687b, 0x0005, 0x080c, 0x6c7f, 0x009e, 0x080c,
-	0xab13, 0x9085, 0x0001, 0x0005, 0x2001, 0x0001, 0x080c, 0x6469,
-	0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805,
-	0x2011, 0x0276, 0x080c, 0xba99, 0x003e, 0x002e, 0x001e, 0x015e,
-	0x9005, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066,
-	0x00b6, 0x0126, 0x2091, 0x8000, 0x2740, 0x2061, 0x1ddc, 0x2079,
-	0x0001, 0x8fff, 0x0904, 0xe084, 0x2071, 0x1800, 0x7654, 0x7074,
-	0x8001, 0x9602, 0x1a04, 0xe084, 0x88ff, 0x0120, 0x2800, 0x9c06,
-	0x1590, 0x2078, 0x080c, 0xe1bd, 0x0570, 0x2400, 0x9c06, 0x0558,
-	0x6720, 0x9786, 0x0006, 0x1538, 0x9786, 0x0007, 0x0520, 0x88ff,
-	0x1140, 0x6010, 0x9b06, 0x11f8, 0x85ff, 0x0118, 0x605c, 0x9106,
-	0x11d0, 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xe3e7, 0x080c,
-	0xce4d, 0x080c, 0x1a53, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c,
-	0xc723, 0x0120, 0x0046, 0x080c, 0xe134, 0x004e, 0x009e, 0x080c,
-	0xab13, 0x88ff, 0x1198, 0x9ce0, 0x001c, 0x2001, 0x181a, 0x2004,
-	0x9c02, 0x1210, 0x0804, 0xe039, 0x9006, 0x012e, 0x00be, 0x006e,
-	0x007e, 0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x98c5, 0x0001,
-	0x0ca0, 0x080c, 0xa781, 0x00b6, 0x0076, 0x0056, 0x0086, 0x9046,
-	0x2029, 0x0001, 0x2c20, 0x2019, 0x0002, 0x6210, 0x2258, 0x0096,
-	0x904e, 0x080c, 0xa103, 0x009e, 0x008e, 0x903e, 0x080c, 0xa1ae,
-	0x080c, 0xe02a, 0x005e, 0x007e, 0x00be, 0x080c, 0xa79d, 0x0005,
-	0x080c, 0xa781, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156,
-	0x2c20, 0x2128, 0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, 0x080c,
-	0x652d, 0x1190, 0x0056, 0x0086, 0x9046, 0x2508, 0x2029, 0x0001,
-	0x0096, 0x904e, 0x080c, 0xa103, 0x009e, 0x008e, 0x903e, 0x080c,
-	0xa1ae, 0x080c, 0xe02a, 0x005e, 0x003e, 0x001e, 0x8108, 0x1f04,
-	0xe0bd, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x080c,
-	0xa79d, 0x0005, 0x080c, 0xa781, 0x00b6, 0x0076, 0x0056, 0x6210,
-	0x2258, 0x0086, 0x9046, 0x2029, 0x0001, 0x2019, 0x0048, 0x0096,
-	0x904e, 0x080c, 0xa103, 0x009e, 0x008e, 0x903e, 0x080c, 0xa1ae,
-	0x2c20, 0x080c, 0xe02a, 0x005e, 0x007e, 0x00be, 0x080c, 0xa79d,
-	0x0005, 0x080c, 0xa781, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6,
-	0x0156, 0x2c20, 0x20a9, 0x0800, 0x900e, 0x0016, 0x0036, 0x080c,
-	0x652d, 0x11a0, 0x0086, 0x9046, 0x2828, 0x0046, 0x2021, 0x0001,
-	0x080c, 0xe3cb, 0x004e, 0x0096, 0x904e, 0x080c, 0xa103, 0x009e,
-	0x008e, 0x903e, 0x080c, 0xa1ae, 0x080c, 0xe02a, 0x003e, 0x001e,
-	0x8108, 0x1f04, 0xe10d, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e,
-	0x00be, 0x080c, 0xa79d, 0x0005, 0x0016, 0x00f6, 0x080c, 0xc721,
-	0x0198, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0046, 0x0180, 0xa800,
-	0x907d, 0x0138, 0xa803, 0x0000, 0xab82, 0x080c, 0x6c7f, 0x2f48,
-	0x0cb0, 0xab82, 0x080c, 0x6c7f, 0x00fe, 0x001e, 0x0005, 0xa800,
-	0x907d, 0x0130, 0xa803, 0x0000, 0x080c, 0x6c7f, 0x2f48, 0x0cb8,
-	0x080c, 0x6c7f, 0x0c88, 0x00e6, 0x0046, 0x0036, 0x2061, 0x1ddc,
-	0x9005, 0x1138, 0x2071, 0x1800, 0x7454, 0x7074, 0x8001, 0x9402,
-	0x12f8, 0x2100, 0x9c06, 0x0188, 0x6000, 0x9086, 0x0000, 0x0168,
-	0x6008, 0x9206, 0x1150, 0x6320, 0x9386, 0x0009, 0x01b0, 0x6010,
-	0x91a0, 0x0004, 0x2424, 0x9406, 0x0140, 0x9ce0, 0x001c, 0x2001,
-	0x181a, 0x2004, 0x9c02, 0x1220, 0x0c20, 0x9085, 0x0001, 0x0008,
-	0x9006, 0x003e, 0x004e, 0x00ee, 0x0005, 0x631c, 0xd3c4, 0x1d68,
-	0x0c30, 0x0096, 0x0006, 0x080c, 0x103b, 0x000e, 0x090c, 0x0d7d,
-	0xa867, 0x010d, 0xa88e, 0x0026, 0x2010, 0x080c, 0xc711, 0x2001,
-	0x0000, 0x0120, 0x2200, 0x9080, 0x0017, 0x2004, 0x002e, 0xa87a,
-	0xa986, 0xac76, 0xa87f, 0x0000, 0x2001, 0x198c, 0x2004, 0xa882,
-	0x9006, 0xa8e2, 0xa802, 0xa86a, 0xa88a, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x6c7f, 0x012e, 0x009e, 0x0005, 0x6700, 0x9786, 0x0000,
-	0x0158, 0x9786, 0x0001, 0x0140, 0x9786, 0x000a, 0x0128, 0x9786,
-	0x0009, 0x0110, 0x9085, 0x0001, 0x0005, 0x00e6, 0x6010, 0x9075,
-	0x0138, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x9206, 0x00ee, 0x0005,
-	0x9085, 0x0001, 0x0cd8, 0x0016, 0x6004, 0x908e, 0x001e, 0x11a0,
-	0x8007, 0x6134, 0x918c, 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085,
-	0x6003, 0x000b, 0x6023, 0x0005, 0x2001, 0x1985, 0x2004, 0x601a,
-	0x2009, 0x8020, 0x080c, 0x90e8, 0x001e, 0x0005, 0xa001, 0xa001,
-	0x0005, 0x6024, 0xd0e4, 0x0158, 0xd0cc, 0x0118, 0x080c, 0xca61,
-	0x0030, 0x080c, 0xe3e7, 0x080c, 0x878b, 0x080c, 0xaad8, 0x0005,
-	0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xe21c, 0xe21c,
-	0xe21c, 0xe21e, 0xe21c, 0xe21e, 0xe21e, 0xe21c, 0xe21e, 0xe21c,
-	0xe21c, 0xe21c, 0xe21c, 0xe21c, 0x9006, 0x0005, 0x9085, 0x0001,
-	0x0005, 0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xe235,
-	0xe235, 0xe235, 0xe235, 0xe235, 0xe235, 0xe242, 0xe235, 0xe235,
-	0xe235, 0xe235, 0xe235, 0xe235, 0xe235, 0x6007, 0x003b, 0x602f,
-	0x0009, 0x6017, 0x2a00, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c,
-	0x90e8, 0x0005, 0x0096, 0x00c6, 0x2260, 0x080c, 0xe3e7, 0x604b,
-	0x0000, 0x6024, 0xc0f4, 0xc0e4, 0x6026, 0x603b, 0x0000, 0x00ce,
-	0x00d6, 0x2268, 0x9186, 0x0007, 0x1904, 0xe29b, 0x6814, 0x9005,
-	0x0138, 0x2048, 0xa87c, 0xd0fc, 0x1118, 0x00de, 0x009e, 0x08a8,
-	0x6007, 0x003a, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x90e8,
-	0x00c6, 0x2d60, 0x6100, 0x9186, 0x0002, 0x1904, 0xe312, 0x6014,
-	0x9005, 0x1138, 0x6000, 0x9086, 0x0007, 0x190c, 0x0d7d, 0x0804,
-	0xe312, 0x2048, 0x080c, 0xc723, 0x1130, 0x0028, 0x2048, 0xa800,
-	0x9005, 0x1de0, 0x2900, 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086,
-	0x0002, 0x1168, 0xa87c, 0xc0dc, 0xc0f4, 0xa87e, 0xa880, 0xc0fc,
-	0xa882, 0x2009, 0x0043, 0x080c, 0xdb2c, 0x0804, 0xe312, 0x2009,
-	0x0041, 0x0804, 0xe30c, 0x9186, 0x0005, 0x15a0, 0x6814, 0x2048,
-	0xa87c, 0xd0bc, 0x1120, 0x00de, 0x009e, 0x0804, 0xe235, 0xd0b4,
-	0x0128, 0xd0fc, 0x090c, 0x0d7d, 0x0804, 0xe256, 0x6007, 0x003a,
-	0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x90e8, 0x00c6, 0x2d60,
-	0x6100, 0x9186, 0x0002, 0x0120, 0x9186, 0x0004, 0x1904, 0xe312,
-	0x6814, 0x2048, 0xa97c, 0xc1f4, 0xc1dc, 0xa97e, 0xa980, 0xc1fc,
-	0xc1bc, 0xa982, 0x00f6, 0x2c78, 0x080c, 0x1728, 0x00fe, 0x2009,
-	0x0042, 0x04d0, 0x0036, 0x080c, 0x103b, 0x090c, 0x0d7d, 0xa867,
-	0x010d, 0x9006, 0xa802, 0xa86a, 0xa88a, 0x2d18, 0xab8e, 0xa887,
-	0x0045, 0x2c00, 0xa892, 0x6038, 0xa8a2, 0x2360, 0x6024, 0xc0dd,
-	0x6026, 0x6010, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x2004, 0x635c,
-	0xab7a, 0xa876, 0x9006, 0xa87e, 0xa882, 0xad9a, 0xae96, 0xa89f,
-	0x0001, 0x080c, 0x6c7f, 0x2019, 0x0045, 0x6008, 0x2068, 0x080c,
-	0xdce5, 0x2d00, 0x600a, 0x6023, 0x0006, 0x6003, 0x0007, 0x901e,
-	0x631a, 0x634a, 0x003e, 0x0038, 0x604b, 0x0000, 0x6003, 0x0007,
-	0x080c, 0xdb2c, 0x00ce, 0x00de, 0x009e, 0x0005, 0x9186, 0x0013,
-	0x1128, 0x6004, 0x9082, 0x0085, 0x2008, 0x00c2, 0x9186, 0x0027,
-	0x1178, 0x080c, 0x94a8, 0x0036, 0x0096, 0x6014, 0x2048, 0x2019,
-	0x0004, 0x080c, 0xe134, 0x009e, 0x003e, 0x080c, 0x956a, 0x0005,
-	0x9186, 0x0014, 0x0d70, 0x080c, 0xab94, 0x0005, 0xe345, 0xe343,
-	0xe343, 0xe343, 0xe343, 0xe343, 0xe345, 0xe343, 0xe343, 0xe343,
-	0xe343, 0xe343, 0xe343, 0x080c, 0x0d7d, 0x6003, 0x000c, 0x080c,
-	0x956a, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208,
-	0x001a, 0x080c, 0xab94, 0x0005, 0xe361, 0xe361, 0xe361, 0xe361,
-	0xe363, 0xe383, 0xe361, 0xe361, 0xe361, 0xe361, 0xe361, 0xe361,
-	0xe361, 0x080c, 0x0d7d, 0x00d6, 0x2c68, 0x080c, 0xaa82, 0x01b0,
-	0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0x026e, 0x210c, 0x613a,
-	0x2009, 0x026f, 0x210c, 0x613e, 0x600b, 0xffff, 0x6910, 0x6112,
-	0x6023, 0x0004, 0x2009, 0x8020, 0x080c, 0x90e8, 0x2d60, 0x080c,
-	0xaad8, 0x00de, 0x0005, 0x080c, 0xaad8, 0x0005, 0x00e6, 0x6010,
-	0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ec, 0x00ee, 0x0005, 0x2009,
-	0x1867, 0x210c, 0xd1ec, 0x05b0, 0x6003, 0x0002, 0x6024, 0xc0e5,
-	0x6026, 0xd0cc, 0x0150, 0x2001, 0x1986, 0x2004, 0x604a, 0x2009,
-	0x1867, 0x210c, 0xd1f4, 0x1520, 0x00a0, 0x2009, 0x1867, 0x210c,
-	0xd1f4, 0x0128, 0x6024, 0xc0e4, 0x6026, 0x9006, 0x00d8, 0x2001,
-	0x1986, 0x200c, 0x2001, 0x1984, 0x2004, 0x9100, 0x9080, 0x000a,
-	0x604a, 0x6010, 0x00b6, 0x2058, 0xb8bc, 0x00be, 0x0008, 0x2104,
-	0x9005, 0x0118, 0x9088, 0x0003, 0x0cd0, 0x2c0a, 0x600f, 0x0000,
-	0x9085, 0x0001, 0x0005, 0x0016, 0x00c6, 0x00e6, 0x615c, 0xb8bc,
-	0x2060, 0x8cff, 0x0180, 0x84ff, 0x1118, 0x605c, 0x9106, 0x1138,
-	0x600c, 0x2072, 0x080c, 0x878b, 0x080c, 0xaad8, 0x0010, 0x9cf0,
-	0x0003, 0x2e64, 0x0c70, 0x00ee, 0x00ce, 0x001e, 0x0005, 0x00d6,
-	0x00b6, 0x6010, 0x2058, 0xb8bc, 0x2068, 0x9005, 0x0130, 0x9c06,
-	0x0110, 0x680c, 0x0cd0, 0x600c, 0x680e, 0x00be, 0x00de, 0x0005,
-	0x0026, 0x0036, 0x0156, 0x2011, 0x182c, 0x2204, 0x9084, 0x00ff,
-	0x2019, 0x026e, 0x2334, 0x9636, 0x1508, 0x8318, 0x2334, 0x2204,
-	0x9084, 0xff00, 0x9636, 0x11d0, 0x2011, 0x0270, 0x20a9, 0x0004,
-	0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xbaad, 0x009e,
-	0x1168, 0x2011, 0x0274, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048,
-	0x2019, 0x0006, 0x080c, 0xbaad, 0x009e, 0x1100, 0x015e, 0x003e,
-	0x002e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5ed4, 0x080c,
-	0x2f79, 0x00ee, 0x0005, 0x0096, 0x0026, 0x080c, 0x103b, 0x090c,
-	0x0d7d, 0xa85c, 0x9080, 0x001a, 0x20a0, 0x20a9, 0x000c, 0xa860,
-	0x20e8, 0x9006, 0x4004, 0x9186, 0x0046, 0x1118, 0xa867, 0x0136,
-	0x0038, 0xa867, 0x0138, 0x9186, 0x0041, 0x0110, 0xa87b, 0x0001,
-	0x7038, 0x9084, 0xff00, 0x7240, 0x9294, 0xff00, 0x8007, 0x9215,
-	0xaa9a, 0x9186, 0x0046, 0x1168, 0x7038, 0x9084, 0x00ff, 0x723c,
-	0x9294, 0xff00, 0x9215, 0xaa9e, 0x723c, 0x9294, 0x00ff, 0xaaa2,
-	0x0060, 0x7040, 0x9084, 0x00ff, 0x7244, 0x9294, 0xff00, 0x9215,
-	0xaa9e, 0x7244, 0x9294, 0x00ff, 0xaaa2, 0x9186, 0x0046, 0x1118,
-	0x9e90, 0x0012, 0x0010, 0x9e90, 0x001a, 0x2204, 0x8007, 0xa8a6,
-	0x8210, 0x2204, 0x8007, 0xa8aa, 0x8210, 0x2204, 0x8007, 0xa8ae,
-	0x8210, 0x2204, 0x8007, 0xa8b2, 0x8210, 0x9186, 0x0046, 0x11b8,
-	0x9e90, 0x0016, 0x2204, 0x8007, 0xa8b6, 0x8210, 0x2204, 0x8007,
-	0xa8ba, 0x8210, 0x2204, 0x8007, 0xa8be, 0x8210, 0x2204, 0x8007,
-	0xa8c2, 0x8210, 0x2011, 0x0205, 0x2013, 0x0001, 0x00b0, 0x9e90,
-	0x001e, 0x2204, 0x8007, 0xa8b6, 0x8210, 0x2204, 0x8007, 0xa8ba,
-	0x2011, 0x0205, 0x2013, 0x0001, 0x2011, 0x0260, 0x2204, 0x8007,
-	0xa8be, 0x8210, 0x2204, 0x8007, 0xa8c2, 0x9186, 0x0046, 0x1118,
-	0x2011, 0x0262, 0x0010, 0x2011, 0x026a, 0x0146, 0x01d6, 0x0036,
-	0x20a9, 0x0001, 0x2019, 0x0008, 0xa860, 0x20e8, 0xa85c, 0x9080,
-	0x0031, 0x20a0, 0x2204, 0x8007, 0x4004, 0x8210, 0x8319, 0x1dd0,
-	0x003e, 0x01ce, 0x013e, 0x2011, 0x0205, 0x2013, 0x0000, 0x002e,
-	0x080c, 0x6c7f, 0x009e, 0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058,
-	0xb800, 0x00be, 0xd0fc, 0x0108, 0x0011, 0x00ee, 0x0005, 0xa880,
-	0xc0e5, 0xa882, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066,
-	0x0056, 0x0046, 0x0026, 0x0016, 0x0126, 0x2091, 0x8000, 0x2029,
-	0x19f1, 0x252c, 0x2021, 0x19f8, 0x2424, 0x2061, 0x1ddc, 0x2071,
-	0x1800, 0x7654, 0x7074, 0x9606, 0x0578, 0x6720, 0x9786, 0x0001,
-	0x0118, 0x9786, 0x0008, 0x1500, 0x2500, 0x9c06, 0x01e8, 0x2400,
-	0x9c06, 0x01d0, 0x080c, 0xe1bd, 0x01b8, 0x080c, 0xe1cd, 0x11a0,
-	0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1a53, 0x001e,
-	0x080c, 0xc920, 0x1110, 0x080c, 0x31dc, 0x080c, 0xc931, 0x1110,
-	0x080c, 0xb4a0, 0x080c, 0xab13, 0x9ce0, 0x001c, 0x2001, 0x181a,
-	0x2004, 0x9c02, 0x1208, 0x0858, 0x012e, 0x001e, 0x002e, 0x004e,
-	0x005e, 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x2001,
-	0x1810, 0x2004, 0xd0dc, 0x0005, 0x0006, 0x2001, 0x1837, 0x2004,
-	0xd09c, 0x000e, 0x0005, 0x0006, 0x0036, 0x0046, 0x080c, 0xce35,
-	0x0168, 0x2019, 0xffff, 0x9005, 0x0128, 0x6010, 0x00b6, 0x2058,
-	0xbba0, 0x00be, 0x2021, 0x0004, 0x080c, 0x4bef, 0x004e, 0x003e,
-	0x000e, 0x6004, 0x9086, 0x0001, 0x1128, 0x080c, 0xa275, 0x080c,
-	0xab13, 0x9006, 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091,
-	0x8000, 0x2071, 0x1840, 0xd5a4, 0x0118, 0x7004, 0x8000, 0x7006,
-	0xd5b4, 0x0118, 0x7000, 0x8000, 0x7002, 0xd5ac, 0x0178, 0x2500,
-	0x9084, 0x0007, 0x908e, 0x0003, 0x0148, 0x908e, 0x0004, 0x0130,
-	0x908e, 0x0005, 0x0118, 0x2071, 0xfffe, 0x0089, 0x001e, 0x00ee,
-	0x000e, 0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000,
-	0x2071, 0xfff6, 0x0021, 0x00ee, 0x000e, 0x012e, 0x0005, 0x2e05,
-	0x8000, 0x2077, 0x1220, 0x8e70, 0x2e05, 0x8000, 0x2077, 0x0005,
-	0x00e6, 0x2071, 0xfff4, 0x0c99, 0x00ee, 0x0005, 0x00e6, 0x2071,
-	0xfff8, 0x0c69, 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091,
-	0x8000, 0x2071, 0x1840, 0x7014, 0x8000, 0x7016, 0x00ee, 0x000e,
-	0x012e, 0x0005, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020,
-	0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000,
-	0x4000, 0x8000, 0xd89f
+	0x91ed, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106, 0x080c, 0x1c03,
+	0x0126, 0x2091, 0x8000, 0x6014, 0x0096, 0x2048, 0xa87c, 0xd0fc,
+	0x0188, 0x9084, 0x0003, 0x9086, 0x0002, 0x01a0, 0x6024, 0xd0cc,
+	0x1148, 0xd0c4, 0x1138, 0xa8a8, 0x9005, 0x1120, 0x6144, 0x918d,
+	0xb035, 0x0018, 0x6144, 0x918d, 0xa035, 0x009e, 0x080c, 0x9234,
+	0x012e, 0x0005, 0x6144, 0x918d, 0xa032, 0x0cb8, 0x0126, 0x2091,
+	0x8000, 0x0036, 0x0096, 0x9182, 0x0040, 0x0023, 0x009e, 0x003e,
+	0x012e, 0x0005, 0xdcc2, 0xdcc4, 0xdcd9, 0xdcf3, 0xdcc2, 0xdcc2,
+	0xdcc2, 0xdcc2, 0xdcc2, 0xdcc2, 0xdcc2, 0xdcc2, 0xdcc2, 0xdcc2,
+	0xdcc2, 0xdcc2, 0x080c, 0x0d7d, 0x6014, 0x2048, 0xa87c, 0xd0fc,
+	0x0510, 0x909c, 0x0003, 0x939e, 0x0003, 0x01e8, 0x6003, 0x0001,
+	0x6106, 0x0126, 0x2091, 0x8000, 0x2009, 0xa022, 0x080c, 0x91ed,
+	0x0470, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0168, 0x909c, 0x0003,
+	0x939e, 0x0003, 0x0140, 0x6003, 0x0001, 0x6106, 0x2009, 0xa001,
+	0x080c, 0x91ed, 0x00e0, 0x901e, 0x6316, 0x631a, 0x2019, 0x0004,
+	0x080c, 0xe241, 0x00a0, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0d98,
+	0x909c, 0x0003, 0x939e, 0x0003, 0x0d70, 0x6003, 0x0003, 0x6106,
+	0x080c, 0x1c03, 0x6144, 0x918d, 0xa035, 0x080c, 0x9234, 0x0005,
+	0x080c, 0x95ad, 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c,
+	0xe5f6, 0x0036, 0x2019, 0x0029, 0x080c, 0xe241, 0x003e, 0x009e,
+	0x080c, 0xac04, 0x080c, 0x966f, 0x0005, 0x080c, 0x960a, 0x6114,
+	0x81ff, 0x0158, 0x0096, 0x2148, 0x080c, 0xe5f6, 0x0036, 0x2019,
+	0x0029, 0x080c, 0xe241, 0x003e, 0x009e, 0x080c, 0xac04, 0x0005,
+	0x9182, 0x0085, 0x0002, 0xdd42, 0xdd40, 0xdd40, 0xdd4e, 0xdd40,
+	0xdd40, 0xdd40, 0xdd40, 0xdd40, 0xdd40, 0xdd40, 0xdd40, 0xdd40,
+	0x080c, 0x0d7d, 0x6003, 0x000b, 0x6106, 0x0126, 0x2091, 0x8000,
+	0x2009, 0x8020, 0x080c, 0x91ed, 0x012e, 0x0005, 0x0026, 0x00e6,
+	0x080c, 0xe498, 0x0118, 0x080c, 0xabc9, 0x0440, 0x2071, 0x0260,
+	0x7224, 0x6216, 0x2001, 0x180e, 0x2004, 0xd0e4, 0x0150, 0x6010,
+	0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x2011, 0x014e, 0x080c,
+	0xaef6, 0x7220, 0x080c, 0xe0d7, 0x0118, 0x6007, 0x0086, 0x0040,
+	0x6007, 0x0087, 0x7224, 0x9296, 0xffff, 0x1110, 0x6007, 0x0086,
+	0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x91ed, 0x00ee, 0x002e,
+	0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c,
+	0x0d7d, 0x908a, 0x0092, 0x1a0c, 0x0d7d, 0x9082, 0x0085, 0x00a2,
+	0x9186, 0x0027, 0x0130, 0x9186, 0x0014, 0x0118, 0x080c, 0xac85,
+	0x0050, 0x2001, 0x0007, 0x080c, 0x659a, 0x080c, 0x95ad, 0x080c,
+	0xac04, 0x080c, 0x966f, 0x0005, 0xddb1, 0xddb3, 0xddb3, 0xddb1,
+	0xddb1, 0xddb1, 0xddb1, 0xddb1, 0xddb1, 0xddb1, 0xddb1, 0xddb1,
+	0xddb1, 0x080c, 0x0d7d, 0x080c, 0xac04, 0x080c, 0x966f, 0x0005,
+	0x9182, 0x0085, 0x0a0c, 0x0d7d, 0x9182, 0x0092, 0x1a0c, 0x0d7d,
+	0x9182, 0x0085, 0x0002, 0xddd0, 0xddd0, 0xddd0, 0xddd2, 0xddd0,
+	0xddd0, 0xddd0, 0xddd0, 0xddd0, 0xddd0, 0xddd0, 0xddd0, 0xddd0,
+	0x080c, 0x0d7d, 0x0005, 0x9186, 0x0013, 0x0148, 0x9186, 0x0014,
+	0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0xac85, 0x0020, 0x080c,
+	0x95ad, 0x080c, 0xac04, 0x0005, 0x0036, 0x080c, 0xe4f9, 0x604b,
+	0x0000, 0x2019, 0x000b, 0x0031, 0x6023, 0x0006, 0x6003, 0x0007,
+	0x003e, 0x0005, 0x0126, 0x0036, 0x2091, 0x8000, 0x2001, 0x0382,
+	0x2004, 0x9084, 0x0007, 0x0006, 0x9086, 0x0003, 0x0110, 0x080c,
+	0xa872, 0x0086, 0x2c40, 0x0096, 0x904e, 0x080c, 0xa1f4, 0x009e,
+	0x008e, 0x1550, 0x0076, 0x2c38, 0x080c, 0xa29f, 0x007e, 0x1520,
+	0x6000, 0x9086, 0x0000, 0x0500, 0x6020, 0x9086, 0x0007, 0x01e0,
+	0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xe4f9, 0x080c, 0xcf46,
+	0x080c, 0x1a6a, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, 0xc814,
+	0x0110, 0x080c, 0xe241, 0x009e, 0x6017, 0x0000, 0x080c, 0xe4f9,
+	0x6023, 0x0007, 0x080c, 0xcf46, 0x000e, 0x9086, 0x0003, 0x0110,
+	0x080c, 0xa88e, 0x003e, 0x012e, 0x0005, 0x00f6, 0x00c6, 0x00b6,
+	0x0036, 0x0156, 0x2079, 0x0260, 0x7938, 0x783c, 0x080c, 0x25fb,
+	0x15d8, 0x0016, 0x00c6, 0x080c, 0x661e, 0x15a0, 0x001e, 0x00c6,
+	0x2160, 0x080c, 0xcf43, 0x00ce, 0x002e, 0x0026, 0x0016, 0x080c,
+	0xa872, 0x2019, 0x0029, 0x080c, 0xa366, 0x080c, 0x9374, 0x0076,
+	0x903e, 0x080c, 0x9246, 0x007e, 0x001e, 0x0076, 0x903e, 0x080c,
+	0xdfc0, 0x007e, 0x080c, 0xa88e, 0x0026, 0xba04, 0x9294, 0xff00,
+	0x8217, 0x9286, 0x0006, 0x0118, 0x9286, 0x0004, 0x1118, 0xbaa0,
+	0x080c, 0x32b7, 0x002e, 0x001e, 0x080c, 0x603c, 0xbe12, 0xbd16,
+	0x9006, 0x0010, 0x00ce, 0x001e, 0x015e, 0x003e, 0x00be, 0x00ce,
+	0x00fe, 0x0005, 0x00c6, 0x00d6, 0x00b6, 0x0016, 0x2009, 0x1824,
+	0x2104, 0x9086, 0x0074, 0x1904, 0xdee3, 0x2069, 0x0260, 0x6944,
+	0x9182, 0x0100, 0x06e0, 0x6940, 0x9184, 0x8000, 0x0904, 0xdee0,
+	0x2001, 0x197c, 0x2004, 0x9005, 0x1140, 0x6010, 0x2058, 0xb884,
+	0x9005, 0x0118, 0x9184, 0x0800, 0x0598, 0x6948, 0x918a, 0x0001,
+	0x0648, 0x080c, 0xe65e, 0x0118, 0x6978, 0xd1fc, 0x11b8, 0x2009,
+	0x0205, 0x200b, 0x0001, 0x693c, 0x81ff, 0x1198, 0x6944, 0x9182,
+	0x0100, 0x02a8, 0x6940, 0x81ff, 0x1178, 0x6948, 0x918a, 0x0001,
+	0x0288, 0x6950, 0x918a, 0x0001, 0x0298, 0x00d0, 0x6017, 0x0100,
+	0x00a0, 0x6017, 0x0300, 0x0088, 0x6017, 0x0500, 0x0070, 0x6017,
+	0x0700, 0x0058, 0x6017, 0x0900, 0x0040, 0x6017, 0x0b00, 0x0028,
+	0x6017, 0x0f00, 0x0010, 0x6017, 0x2d00, 0x9085, 0x0001, 0x0008,
+	0x9006, 0x001e, 0x00be, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00b6,
+	0x0026, 0x0036, 0x0156, 0x6210, 0x2258, 0xbb04, 0x9394, 0x00ff,
+	0x9286, 0x0006, 0x0180, 0x9286, 0x0004, 0x0168, 0x9394, 0xff00,
+	0x8217, 0x9286, 0x0006, 0x0138, 0x9286, 0x0004, 0x0120, 0x080c,
+	0x662d, 0x0804, 0xdf4f, 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096,
+	0x2b48, 0x2019, 0x000a, 0x080c, 0xbb9e, 0x009e, 0x15c8, 0x2011,
+	0x027a, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c,
+	0xbb9e, 0x009e, 0x1568, 0x0046, 0x0016, 0xbaa0, 0x2220, 0x9006,
+	0x2009, 0x1848, 0x210c, 0xd1a4, 0x0138, 0x2009, 0x0029, 0x080c,
+	0xe29e, 0xb800, 0xc0e5, 0xb802, 0x080c, 0xa872, 0x2019, 0x0029,
+	0x080c, 0x9374, 0x0076, 0x2039, 0x0000, 0x080c, 0x9246, 0x2c08,
+	0x080c, 0xdfc0, 0x007e, 0x080c, 0xa88e, 0x2001, 0x0007, 0x080c,
+	0x659a, 0x2001, 0x0007, 0x080c, 0x656e, 0x001e, 0x004e, 0x9006,
+	0x015e, 0x003e, 0x002e, 0x00be, 0x00ce, 0x0005, 0x00d6, 0x2069,
+	0x026e, 0x6800, 0x9086, 0x0800, 0x0118, 0x6017, 0x0000, 0x0008,
+	0x9006, 0x00de, 0x0005, 0x00b6, 0x00f6, 0x0016, 0x0026, 0x0036,
+	0x0156, 0x2079, 0x026c, 0x7930, 0x7834, 0x080c, 0x25fb, 0x11d0,
+	0x080c, 0x661e, 0x11b8, 0x2011, 0x0270, 0x20a9, 0x0004, 0x0096,
+	0x2b48, 0x2019, 0x000a, 0x080c, 0xbb9e, 0x009e, 0x1158, 0x2011,
+	0x0274, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c,
+	0xbb9e, 0x009e, 0x015e, 0x003e, 0x002e, 0x001e, 0x00fe, 0x00be,
+	0x0005, 0x00b6, 0x0006, 0x0016, 0x0026, 0x0036, 0x0156, 0x2011,
+	0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x25fb, 0x11d0, 0x080c,
+	0x661e, 0x11b8, 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48,
+	0x2019, 0x000a, 0x080c, 0xbb9e, 0x009e, 0x1158, 0x2011, 0x027a,
+	0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xbb9e,
+	0x009e, 0x015e, 0x003e, 0x002e, 0x001e, 0x000e, 0x00be, 0x0005,
+	0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026,
+	0x0126, 0x2091, 0x8000, 0x080c, 0xa8d0, 0x0106, 0x190c, 0xa872,
+	0x2740, 0x2029, 0x19f3, 0x252c, 0x2021, 0x19fa, 0x2424, 0x2061,
+	0x1ddc, 0x2071, 0x1800, 0x7654, 0x7074, 0x81ff, 0x0150, 0x0006,
+	0x9186, 0x1b32, 0x000e, 0x0128, 0x8001, 0x9602, 0x1a04, 0xe065,
+	0x0018, 0x9606, 0x0904, 0xe065, 0x080c, 0x8b5f, 0x0904, 0xe05c,
+	0x2100, 0x9c06, 0x0904, 0xe05c, 0x080c, 0xe2df, 0x1904, 0xe05c,
+	0x080c, 0xe67b, 0x0904, 0xe05c, 0x080c, 0xe2cf, 0x0904, 0xe05c,
+	0x6720, 0x9786, 0x0001, 0x1148, 0x080c, 0x335c, 0x0904, 0xe0a7,
+	0x6004, 0x9086, 0x0000, 0x1904, 0xe0a7, 0x9786, 0x0004, 0x0904,
+	0xe0a7, 0x9786, 0x0007, 0x0904, 0xe05c, 0x2500, 0x9c06, 0x0904,
+	0xe05c, 0x2400, 0x9c06, 0x0904, 0xe05c, 0x88ff, 0x0118, 0x605c,
+	0x9906, 0x15d0, 0x0096, 0x6043, 0xffff, 0x6000, 0x9086, 0x0004,
+	0x1120, 0x0016, 0x080c, 0x1a6a, 0x001e, 0x9786, 0x000a, 0x0148,
+	0x080c, 0xca29, 0x1130, 0x080c, 0xb591, 0x009e, 0x080c, 0xac04,
+	0x0418, 0x6014, 0x2048, 0x080c, 0xc814, 0x01d8, 0x9786, 0x0003,
+	0x1588, 0xa867, 0x0103, 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878,
+	0x2048, 0x080c, 0x0fec, 0x009e, 0xab7a, 0xa877, 0x0000, 0x080c,
+	0xe5f6, 0x0016, 0x080c, 0xcb12, 0x080c, 0x6d64, 0x001e, 0x080c,
+	0xca03, 0x009e, 0x080c, 0xac04, 0x9ce0, 0x001c, 0x2001, 0x181a,
+	0x2004, 0x9c02, 0x1210, 0x0804, 0xdfd9, 0x010e, 0x190c, 0xa88e,
+	0x012e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce,
+	0x00ee, 0x0005, 0x9786, 0x0006, 0x1150, 0x9386, 0x0005, 0x0128,
+	0x080c, 0xe5f6, 0x080c, 0xe241, 0x08e0, 0x009e, 0x08e8, 0x9786,
+	0x0009, 0x11f8, 0x6000, 0x9086, 0x0004, 0x01c0, 0x6000, 0x9086,
+	0x0003, 0x11a0, 0x080c, 0x960a, 0x0096, 0x6114, 0x2148, 0x080c,
+	0xc814, 0x0118, 0x6010, 0x080c, 0x6d70, 0x009e, 0x00c6, 0x080c,
+	0xabc9, 0x00ce, 0x0036, 0x080c, 0x966f, 0x003e, 0x009e, 0x0804,
+	0xe05c, 0x9786, 0x000a, 0x0904, 0xe043, 0x0804, 0xe041, 0x81ff,
+	0x0904, 0xe05c, 0x9180, 0x0001, 0x2004, 0x9086, 0x0018, 0x0138,
+	0x9180, 0x0001, 0x2004, 0x9086, 0x002d, 0x1904, 0xe05c, 0x6000,
+	0x9086, 0x0002, 0x1904, 0xe05c, 0x080c, 0xca18, 0x0138, 0x080c,
+	0xca29, 0x1904, 0xe05c, 0x080c, 0xb591, 0x0038, 0x080c, 0x3215,
+	0x080c, 0xca29, 0x1110, 0x080c, 0xb591, 0x080c, 0xac04, 0x0804,
+	0xe05c, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x0005, 0x00c6,
+	0x00e6, 0x0016, 0x2c08, 0x2170, 0x9006, 0x080c, 0xe268, 0x001e,
+	0x0120, 0x6020, 0x9084, 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005,
+	0xe0f6, 0xe0f6, 0xe0f6, 0xe0f6, 0xe0f6, 0xe0f6, 0xe0f8, 0xe0f6,
+	0xe0f6, 0xe0f6, 0xe0f6, 0xac04, 0xac04, 0xe0f6, 0x9006, 0x0005,
+	0x0036, 0x0046, 0x0016, 0x7010, 0x00b6, 0x2058, 0xbca0, 0x00be,
+	0x2c00, 0x2009, 0x0020, 0x080c, 0xe29e, 0x001e, 0x004e, 0x2019,
+	0x0002, 0x080c, 0xddf2, 0x003e, 0x9085, 0x0001, 0x0005, 0x0096,
+	0x080c, 0xc814, 0x0140, 0x6014, 0x904d, 0x080c, 0xc41f, 0x687b,
+	0x0005, 0x080c, 0x6d70, 0x009e, 0x080c, 0xac04, 0x9085, 0x0001,
+	0x0005, 0x2001, 0x0001, 0x080c, 0x655a, 0x0156, 0x0016, 0x0026,
+	0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0276, 0x080c,
+	0xbb8a, 0x003e, 0x002e, 0x001e, 0x015e, 0x9005, 0x0005, 0x00f6,
+	0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x00b6, 0x0126, 0x2091,
+	0x8000, 0x2740, 0x2061, 0x1ddc, 0x2079, 0x0001, 0x8fff, 0x0904,
+	0xe191, 0x2071, 0x1800, 0x7654, 0x7074, 0x8001, 0x9602, 0x1a04,
+	0xe191, 0x88ff, 0x0120, 0x2800, 0x9c06, 0x1590, 0x2078, 0x080c,
+	0xe2cf, 0x0570, 0x2400, 0x9c06, 0x0558, 0x6720, 0x9786, 0x0006,
+	0x1538, 0x9786, 0x0007, 0x0520, 0x88ff, 0x1140, 0x6010, 0x9b06,
+	0x11f8, 0x85ff, 0x0118, 0x605c, 0x9106, 0x11d0, 0x0096, 0x601c,
+	0xd084, 0x0140, 0x080c, 0xe4f9, 0x080c, 0xcf46, 0x080c, 0x1a6a,
+	0x6023, 0x0007, 0x6014, 0x2048, 0x080c, 0xc814, 0x0120, 0x0046,
+	0x080c, 0xe241, 0x004e, 0x009e, 0x080c, 0xac04, 0x88ff, 0x1198,
+	0x9ce0, 0x001c, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1210, 0x0804,
+	0xe146, 0x9006, 0x012e, 0x00be, 0x006e, 0x007e, 0x008e, 0x00ce,
+	0x00ee, 0x00fe, 0x0005, 0x98c5, 0x0001, 0x0ca0, 0x080c, 0xa872,
+	0x00b6, 0x0076, 0x0056, 0x0086, 0x9046, 0x2029, 0x0001, 0x2c20,
+	0x2019, 0x0002, 0x6210, 0x2258, 0x0096, 0x904e, 0x080c, 0xa1f4,
+	0x009e, 0x008e, 0x903e, 0x080c, 0xa29f, 0x080c, 0xe137, 0x005e,
+	0x007e, 0x00be, 0x080c, 0xa88e, 0x0005, 0x080c, 0xa872, 0x00b6,
+	0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x2128, 0x20a9,
+	0x007f, 0x900e, 0x0016, 0x0036, 0x080c, 0x661e, 0x1190, 0x0056,
+	0x0086, 0x9046, 0x2508, 0x2029, 0x0001, 0x0096, 0x904e, 0x080c,
+	0xa1f4, 0x009e, 0x008e, 0x903e, 0x080c, 0xa29f, 0x080c, 0xe137,
+	0x005e, 0x003e, 0x001e, 0x8108, 0x1f04, 0xe1ca, 0x015e, 0x00ce,
+	0x007e, 0x005e, 0x004e, 0x00be, 0x080c, 0xa88e, 0x0005, 0x080c,
+	0xa872, 0x00b6, 0x0076, 0x0056, 0x6210, 0x2258, 0x0086, 0x9046,
+	0x2029, 0x0001, 0x2019, 0x0048, 0x0096, 0x904e, 0x080c, 0xa1f4,
+	0x009e, 0x008e, 0x903e, 0x080c, 0xa29f, 0x2c20, 0x080c, 0xe137,
+	0x005e, 0x007e, 0x00be, 0x080c, 0xa88e, 0x0005, 0x080c, 0xa872,
+	0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x20a9,
+	0x0800, 0x900e, 0x0016, 0x0036, 0x080c, 0x661e, 0x11a0, 0x0086,
+	0x9046, 0x2828, 0x0046, 0x2021, 0x0001, 0x080c, 0xe4dd, 0x004e,
+	0x0096, 0x904e, 0x080c, 0xa1f4, 0x009e, 0x008e, 0x903e, 0x080c,
+	0xa29f, 0x080c, 0xe137, 0x003e, 0x001e, 0x8108, 0x1f04, 0xe21a,
+	0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x080c, 0xa88e,
+	0x0005, 0x0016, 0x00f6, 0x080c, 0xc812, 0x0198, 0xa864, 0x9084,
+	0x00ff, 0x9086, 0x0046, 0x0180, 0xa800, 0x907d, 0x0138, 0xa803,
+	0x0000, 0xab82, 0x080c, 0x6d70, 0x2f48, 0x0cb0, 0xab82, 0x080c,
+	0x6d70, 0x00fe, 0x001e, 0x0005, 0xa800, 0x907d, 0x0130, 0xa803,
+	0x0000, 0x080c, 0x6d70, 0x2f48, 0x0cb8, 0x080c, 0x6d70, 0x0c88,
+	0x00e6, 0x0046, 0x0036, 0x2061, 0x1ddc, 0x9005, 0x1138, 0x2071,
+	0x1800, 0x7454, 0x7074, 0x8001, 0x9402, 0x12f8, 0x2100, 0x9c06,
+	0x0188, 0x6000, 0x9086, 0x0000, 0x0168, 0x6008, 0x9206, 0x1150,
+	0x6320, 0x9386, 0x0009, 0x01b0, 0x6010, 0x91a0, 0x0004, 0x2424,
+	0x9406, 0x0140, 0x9ce0, 0x001c, 0x2001, 0x181a, 0x2004, 0x9c02,
+	0x1220, 0x0c20, 0x9085, 0x0001, 0x0008, 0x9006, 0x003e, 0x004e,
+	0x00ee, 0x0005, 0x631c, 0xd3c4, 0x1d68, 0x0c30, 0x0096, 0x0006,
+	0x080c, 0x103a, 0x000e, 0x090c, 0x0d7d, 0xaae2, 0xa867, 0x010d,
+	0xa88e, 0x0026, 0x2010, 0x080c, 0xc802, 0x2001, 0x0000, 0x0120,
+	0x2200, 0x9080, 0x0017, 0x2004, 0x002e, 0xa87a, 0x9186, 0x0020,
+	0x0110, 0xa8e3, 0xffff, 0xa986, 0xac76, 0xa87f, 0x0000, 0x2001,
+	0x198e, 0x2004, 0xa882, 0x9006, 0xa802, 0xa86a, 0xa88a, 0x0126,
+	0x2091, 0x8000, 0x080c, 0x6d70, 0x012e, 0x009e, 0x0005, 0x6700,
+	0x9786, 0x0000, 0x0158, 0x9786, 0x0001, 0x0140, 0x9786, 0x000a,
+	0x0128, 0x9786, 0x0009, 0x0110, 0x9085, 0x0001, 0x0005, 0x00e6,
+	0x6010, 0x9075, 0x0138, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x9206,
+	0x00ee, 0x0005, 0x9085, 0x0001, 0x0cd8, 0x0016, 0x6004, 0x908e,
+	0x001e, 0x11a0, 0x8007, 0x6134, 0x918c, 0x00ff, 0x9105, 0x6036,
+	0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0005, 0x2001, 0x1987,
+	0x2004, 0x601a, 0x2009, 0x8020, 0x080c, 0x91ed, 0x001e, 0x0005,
+	0xa001, 0xa001, 0x0005, 0x6024, 0xd0e4, 0x0158, 0xd0cc, 0x0118,
+	0x080c, 0xcb59, 0x0030, 0x080c, 0xe4f9, 0x080c, 0x8890, 0x080c,
+	0xabc9, 0x0005, 0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002,
+	0xe32e, 0xe32e, 0xe32e, 0xe330, 0xe32e, 0xe330, 0xe330, 0xe32e,
+	0xe330, 0xe32e, 0xe32e, 0xe32e, 0xe32e, 0xe32e, 0x9006, 0x0005,
+	0x9085, 0x0001, 0x0005, 0x9280, 0x0008, 0x2004, 0x9084, 0x000f,
+	0x0002, 0xe347, 0xe347, 0xe347, 0xe347, 0xe347, 0xe347, 0xe354,
+	0xe347, 0xe347, 0xe347, 0xe347, 0xe347, 0xe347, 0xe347, 0x6007,
+	0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, 0x0001, 0x2009,
+	0x8020, 0x080c, 0x91ed, 0x0005, 0x0096, 0x00c6, 0x2260, 0x080c,
+	0xe4f9, 0x604b, 0x0000, 0x6024, 0xc0f4, 0xc0e4, 0x6026, 0x603b,
+	0x0000, 0x00ce, 0x00d6, 0x2268, 0x9186, 0x0007, 0x1904, 0xe3ad,
+	0x6814, 0x9005, 0x0138, 0x2048, 0xa87c, 0xd0fc, 0x1118, 0x00de,
+	0x009e, 0x08a8, 0x6007, 0x003a, 0x6003, 0x0001, 0x2009, 0x8020,
+	0x080c, 0x91ed, 0x00c6, 0x2d60, 0x6100, 0x9186, 0x0002, 0x1904,
+	0xe424, 0x6014, 0x9005, 0x1138, 0x6000, 0x9086, 0x0007, 0x190c,
+	0x0d7d, 0x0804, 0xe424, 0x2048, 0x080c, 0xc814, 0x1130, 0x0028,
+	0x2048, 0xa800, 0x9005, 0x1de0, 0x2900, 0x2048, 0xa87c, 0x9084,
+	0x0003, 0x9086, 0x0002, 0x1168, 0xa87c, 0xc0dc, 0xc0f4, 0xa87e,
+	0xa880, 0xc0fc, 0xa882, 0x2009, 0x0043, 0x080c, 0xdc34, 0x0804,
+	0xe424, 0x2009, 0x0041, 0x0804, 0xe41e, 0x9186, 0x0005, 0x15a0,
+	0x6814, 0x2048, 0xa87c, 0xd0bc, 0x1120, 0x00de, 0x009e, 0x0804,
+	0xe347, 0xd0b4, 0x0128, 0xd0fc, 0x090c, 0x0d7d, 0x0804, 0xe368,
+	0x6007, 0x003a, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x91ed,
+	0x00c6, 0x2d60, 0x6100, 0x9186, 0x0002, 0x0120, 0x9186, 0x0004,
+	0x1904, 0xe424, 0x6814, 0x2048, 0xa97c, 0xc1f4, 0xc1dc, 0xa97e,
+	0xa980, 0xc1fc, 0xc1bc, 0xa982, 0x00f6, 0x2c78, 0x080c, 0x1731,
+	0x00fe, 0x2009, 0x0042, 0x04d0, 0x0036, 0x080c, 0x103a, 0x090c,
+	0x0d7d, 0xa867, 0x010d, 0x9006, 0xa802, 0xa86a, 0xa88a, 0x2d18,
+	0xab8e, 0xa887, 0x0045, 0x2c00, 0xa892, 0x6038, 0xa8a2, 0x2360,
+	0x6024, 0xc0dd, 0x6026, 0x6010, 0x00b6, 0x2058, 0xb8a0, 0x00be,
+	0x2004, 0x635c, 0xab7a, 0xa876, 0x9006, 0xa87e, 0xa882, 0xad9a,
+	0xae96, 0xa89f, 0x0001, 0x080c, 0x6d70, 0x2019, 0x0045, 0x6008,
+	0x2068, 0x080c, 0xddf2, 0x2d00, 0x600a, 0x6023, 0x0006, 0x6003,
+	0x0007, 0x901e, 0x631a, 0x634a, 0x003e, 0x0038, 0x604b, 0x0000,
+	0x6003, 0x0007, 0x080c, 0xdc34, 0x00ce, 0x00de, 0x009e, 0x0005,
+	0x9186, 0x0013, 0x1128, 0x6004, 0x9082, 0x0085, 0x2008, 0x00c2,
+	0x9186, 0x0027, 0x1178, 0x080c, 0x95ad, 0x0036, 0x0096, 0x6014,
+	0x2048, 0x2019, 0x0004, 0x080c, 0xe241, 0x009e, 0x003e, 0x080c,
+	0x966f, 0x0005, 0x9186, 0x0014, 0x0d70, 0x080c, 0xac85, 0x0005,
+	0xe457, 0xe455, 0xe455, 0xe455, 0xe455, 0xe455, 0xe457, 0xe455,
+	0xe455, 0xe455, 0xe455, 0xe455, 0xe455, 0x080c, 0x0d7d, 0x6003,
+	0x000c, 0x080c, 0x966f, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182,
+	0x0085, 0x0208, 0x001a, 0x080c, 0xac85, 0x0005, 0xe473, 0xe473,
+	0xe473, 0xe473, 0xe475, 0xe495, 0xe473, 0xe473, 0xe473, 0xe473,
+	0xe473, 0xe473, 0xe473, 0x080c, 0x0d7d, 0x00d6, 0x2c68, 0x080c,
+	0xab73, 0x01b0, 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0x026e,
+	0x210c, 0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x600b, 0xffff,
+	0x6910, 0x6112, 0x6023, 0x0004, 0x2009, 0x8020, 0x080c, 0x91ed,
+	0x2d60, 0x080c, 0xabc9, 0x00de, 0x0005, 0x080c, 0xabc9, 0x0005,
+	0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ec, 0x00ee,
+	0x0005, 0x2009, 0x1867, 0x210c, 0xd1ec, 0x05b0, 0x6003, 0x0002,
+	0x6024, 0xc0e5, 0x6026, 0xd0cc, 0x0150, 0x2001, 0x1988, 0x2004,
+	0x604a, 0x2009, 0x1867, 0x210c, 0xd1f4, 0x1520, 0x00a0, 0x2009,
+	0x1867, 0x210c, 0xd1f4, 0x0128, 0x6024, 0xc0e4, 0x6026, 0x9006,
+	0x00d8, 0x2001, 0x1988, 0x200c, 0x2001, 0x1986, 0x2004, 0x9100,
+	0x9080, 0x000a, 0x604a, 0x6010, 0x00b6, 0x2058, 0xb8bc, 0x00be,
+	0x0008, 0x2104, 0x9005, 0x0118, 0x9088, 0x0003, 0x0cd0, 0x2c0a,
+	0x600f, 0x0000, 0x9085, 0x0001, 0x0005, 0x0016, 0x00c6, 0x00e6,
+	0x615c, 0xb8bc, 0x2060, 0x8cff, 0x0180, 0x84ff, 0x1118, 0x605c,
+	0x9106, 0x1138, 0x600c, 0x2072, 0x080c, 0x8890, 0x080c, 0xabc9,
+	0x0010, 0x9cf0, 0x0003, 0x2e64, 0x0c70, 0x00ee, 0x00ce, 0x001e,
+	0x0005, 0x00d6, 0x00b6, 0x6010, 0x2058, 0xb8bc, 0x2068, 0x9005,
+	0x0130, 0x9c06, 0x0110, 0x680c, 0x0cd0, 0x600c, 0x680e, 0x00be,
+	0x00de, 0x0005, 0x0026, 0x0036, 0x0156, 0x2011, 0x182c, 0x2204,
+	0x9084, 0x00ff, 0x2019, 0x026e, 0x2334, 0x9636, 0x1508, 0x8318,
+	0x2334, 0x2204, 0x9084, 0xff00, 0x9636, 0x11d0, 0x2011, 0x0270,
+	0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c,
+	0xbb9e, 0x009e, 0x1168, 0x2011, 0x0274, 0x20a9, 0x0004, 0x6010,
+	0x0096, 0x2048, 0x2019, 0x0006, 0x080c, 0xbb9e, 0x009e, 0x1100,
+	0x015e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c,
+	0x5fb5, 0x080c, 0x2fb2, 0x00ee, 0x0005, 0x0096, 0x0026, 0x080c,
+	0x103a, 0x090c, 0x0d7d, 0xa85c, 0x9080, 0x001a, 0x20a0, 0x20a9,
+	0x000c, 0xa860, 0x20e8, 0x9006, 0x4004, 0x9186, 0x0046, 0x1118,
+	0xa867, 0x0136, 0x0038, 0xa867, 0x0138, 0x9186, 0x0041, 0x0110,
+	0xa87b, 0x0001, 0x7038, 0x9084, 0xff00, 0x7240, 0x9294, 0xff00,
+	0x8007, 0x9215, 0xaa9a, 0x9186, 0x0046, 0x1168, 0x7038, 0x9084,
+	0x00ff, 0x723c, 0x9294, 0xff00, 0x9215, 0xaa9e, 0x723c, 0x9294,
+	0x00ff, 0xaaa2, 0x0060, 0x7040, 0x9084, 0x00ff, 0x7244, 0x9294,
+	0xff00, 0x9215, 0xaa9e, 0x7244, 0x9294, 0x00ff, 0xaaa2, 0x9186,
+	0x0046, 0x1118, 0x9e90, 0x0012, 0x0010, 0x9e90, 0x001a, 0x2204,
+	0x8007, 0xa8a6, 0x8210, 0x2204, 0x8007, 0xa8aa, 0x8210, 0x2204,
+	0x8007, 0xa8ae, 0x8210, 0x2204, 0x8007, 0xa8b2, 0x8210, 0x9186,
+	0x0046, 0x11b8, 0x9e90, 0x0016, 0x2204, 0x8007, 0xa8b6, 0x8210,
+	0x2204, 0x8007, 0xa8ba, 0x8210, 0x2204, 0x8007, 0xa8be, 0x8210,
+	0x2204, 0x8007, 0xa8c2, 0x8210, 0x2011, 0x0205, 0x2013, 0x0001,
+	0x00b0, 0x9e90, 0x001e, 0x2204, 0x8007, 0xa8b6, 0x8210, 0x2204,
+	0x8007, 0xa8ba, 0x2011, 0x0205, 0x2013, 0x0001, 0x2011, 0x0260,
+	0x2204, 0x8007, 0xa8be, 0x8210, 0x2204, 0x8007, 0xa8c2, 0x9186,
+	0x0046, 0x1118, 0x2011, 0x0262, 0x0010, 0x2011, 0x026a, 0x0146,
+	0x01d6, 0x0036, 0x20a9, 0x0001, 0x2019, 0x0008, 0xa860, 0x20e8,
+	0xa85c, 0x9080, 0x0031, 0x20a0, 0x2204, 0x8007, 0x4004, 0x8210,
+	0x8319, 0x1dd0, 0x003e, 0x01ce, 0x013e, 0x2011, 0x0205, 0x2013,
+	0x0000, 0x002e, 0x080c, 0x6d70, 0x009e, 0x0005, 0x00e6, 0x6010,
+	0x00b6, 0x2058, 0xb800, 0x00be, 0xd0fc, 0x0108, 0x0011, 0x00ee,
+	0x0005, 0xa880, 0xc0e5, 0xa882, 0x0005, 0x00e6, 0x00d6, 0x00c6,
+	0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0016, 0x0126, 0x2091,
+	0x8000, 0x2029, 0x19f3, 0x252c, 0x2021, 0x19fa, 0x2424, 0x2061,
+	0x1ddc, 0x2071, 0x1800, 0x7654, 0x7074, 0x9606, 0x0578, 0x6720,
+	0x9786, 0x0001, 0x0118, 0x9786, 0x0008, 0x1500, 0x2500, 0x9c06,
+	0x01e8, 0x2400, 0x9c06, 0x01d0, 0x080c, 0xe2cf, 0x01b8, 0x080c,
+	0xe2df, 0x11a0, 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c,
+	0x1a6a, 0x001e, 0x080c, 0xca18, 0x1110, 0x080c, 0x3215, 0x080c,
+	0xca29, 0x1110, 0x080c, 0xb591, 0x080c, 0xac04, 0x9ce0, 0x001c,
+	0x2001, 0x181a, 0x2004, 0x9c02, 0x1208, 0x0858, 0x012e, 0x001e,
+	0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee,
+	0x0005, 0x2001, 0x1810, 0x2004, 0xd0dc, 0x0005, 0x0006, 0x2001,
+	0x1837, 0x2004, 0xd09c, 0x000e, 0x0005, 0x0006, 0x0036, 0x0046,
+	0x080c, 0xcf2e, 0x0168, 0x2019, 0xffff, 0x9005, 0x0128, 0x6010,
+	0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0004, 0x080c, 0x4cb7,
+	0x004e, 0x003e, 0x000e, 0x6004, 0x9086, 0x0001, 0x1128, 0x080c,
+	0xa366, 0x080c, 0xac04, 0x9006, 0x0005, 0x00e6, 0x00c6, 0x00b6,
+	0x0046, 0x2061, 0x1ddc, 0x2071, 0x1800, 0x7454, 0x7074, 0x8001,
+	0x9402, 0x12b8, 0x2100, 0x9c06, 0x0148, 0x6000, 0x9086, 0x0000,
+	0x0128, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x0140, 0x9ce0, 0x001c,
+	0x2001, 0x181a, 0x2004, 0x9c02, 0x1220, 0x0c60, 0x9085, 0x0001,
+	0x0008, 0x9006, 0x004e, 0x00be, 0x00ce, 0x00ee, 0x0005, 0x0126,
+	0x0006, 0x00e6, 0x0016, 0x2091, 0x8000, 0x2071, 0x1840, 0xd5a4,
+	0x0118, 0x7004, 0x8000, 0x7006, 0xd5b4, 0x0118, 0x7000, 0x8000,
+	0x7002, 0xd5ac, 0x0178, 0x2500, 0x9084, 0x0007, 0x908e, 0x0003,
+	0x0148, 0x908e, 0x0004, 0x0130, 0x908e, 0x0005, 0x0118, 0x2071,
+	0xfffe, 0x0089, 0x001e, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0126,
+	0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0xfff6, 0x0021, 0x00ee,
+	0x000e, 0x012e, 0x0005, 0x2e05, 0x8000, 0x2077, 0x1220, 0x8e70,
+	0x2e05, 0x8000, 0x2077, 0x0005, 0x00e6, 0x2071, 0xfff4, 0x0c99,
+	0x00ee, 0x0005, 0x00e6, 0x2071, 0xfff8, 0x0c69, 0x00ee, 0x0005,
+	0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0x1840, 0x7014,
+	0x8000, 0x7016, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0001, 0x0002,
+	0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200,
+	0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0xf93e
 };
 #ifdef UNIQUE_FW_NAME
-unsigned short fw2322ipx_length01 = 0xdddb;
+unsigned short fw2322ipx_length01 = 0xdf17;
 #else
-unsigned short risc_code_length01 = 0xdddb;
+unsigned short risc_code_length01 = 0xdf17;
 #endif
 
 /*
--- diff/drivers/scsi/qla2xxx/ql6312.c	2004-02-18 08:54:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/ql6312.c	2004-04-21 10:45:34.825409232 +0100
@@ -1,6 +1,6 @@
 /*
  * QLogic ISP6312 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation (www.qlogic.com)
+ * Copyright (C) 2003-2004 QLogic Corporation (www.qlogic.com)
  *
  * Released under GPL v2.
  */
--- diff/drivers/scsi/qla2xxx/ql6312_fw.c	2004-02-18 08:54:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/ql6312_fw.c	2004-04-21 10:45:34.856404520 +0100
@@ -2,7 +2,7 @@
  *                  QLOGIC LINUX SOFTWARE
  *
  * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation
+ * Copyright (C) 2003-2004 QLogic Corporation
  * (www.qlogic.com)
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -18,7 +18,7 @@
  *************************************************************************/
 
 /*
- *	Firmware Version 3.02.21 (16:22 Jan 19, 2004)
+ *	Firmware Version 3.02.26 (08:43 Mar 11, 2004)
  */
 
 #ifdef UNIQUE_FW_NAME
@@ -28,15 +28,15 @@ unsigned short risc_code_version = 3*102
 #endif
 
 #ifdef UNIQUE_FW_NAME
-unsigned char fw2300flx_version_str[] = {3, 2,21};
+unsigned char fw2300flx_version_str[] = {3, 2,26};
 #else
-unsigned char firmware_version[] = {3, 2,21};
+unsigned char firmware_version[] = {3, 2,26};
 #endif
 
 #ifdef UNIQUE_FW_NAME
-#define fw2300flx_VERSION_STRING "3.02.21"
+#define fw2300flx_VERSION_STRING "3.02.26"
 #else
-#define FW_VERSION_STRING "3.02.21"
+#define FW_VERSION_STRING "3.02.26"
 #endif
 
 #ifdef UNIQUE_FW_NAME
@@ -50,12 +50,12 @@ unsigned short fw2300flx_code01[] = { 
 #else
 unsigned short risc_code01[] = { 
 #endif
-	0x0470, 0x0000, 0x0000, 0xd1c9, 0x0000, 0x0003, 0x0002, 0x0015,
+	0x0470, 0x0000, 0x0000, 0xd57a, 0x0000, 0x0003, 0x0002, 0x001a,
 	0x0317, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030,
 	0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241,
 	0x5449, 0x4f4e, 0x2049, 0x5350, 0x3233, 0x3030, 0x2046, 0x6972,
 	0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030,
-	0x332e, 0x3032, 0x2e32, 0x3120, 0x2020, 0x2020, 0x2400, 0x20a9,
+	0x332e, 0x3032, 0x2e32, 0x3620, 0x2020, 0x2020, 0x2400, 0x20a9,
 	0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2200, 0x20a9, 0x000f,
 	0x2001, 0x0000, 0x400f, 0x2091, 0x2400, 0x20a9, 0x000f, 0x2001,
 	0x0000, 0x400f, 0x2091, 0x2600, 0x20a9, 0x000f, 0x2001, 0x0000,
@@ -64,171 +64,171 @@ unsigned short risc_code01[] = { 
 	0x2c00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2e00,
 	0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2000, 0x2001,
 	0x0000, 0x20c1, 0x0004, 0x20c9, 0x1bff, 0x2059, 0x0000, 0x2b78,
-	0x7883, 0x0004, 0x2089, 0x29f6, 0x2051, 0x1800, 0x2a70, 0x20e1,
+	0x7883, 0x0004, 0x2089, 0x2b4e, 0x2051, 0x1800, 0x2a70, 0x20e1,
 	0x0001, 0x20e9, 0x0001, 0x2009, 0x0000, 0x080c, 0x0e2f, 0x2029,
 	0x2480, 0x2031, 0xffff, 0x2039, 0x2450, 0x2021, 0x0050, 0x20e9,
 	0x0001, 0x20a1, 0x0000, 0x20a9, 0x0800, 0x900e, 0x4104, 0x20e9,
 	0x0001, 0x20a1, 0x1000, 0x900e, 0x2001, 0x0cc0, 0x9084, 0x0fff,
 	0x20a8, 0x4104, 0x2001, 0x0000, 0x9086, 0x0000, 0x0120, 0x21a8,
 	0x4104, 0x8001, 0x1de0, 0x756a, 0x766e, 0x7766, 0x7472, 0x7476,
-	0x00e6, 0x2071, 0x1a8f, 0x2472, 0x00ee, 0x20a1, 0x1cd0, 0x716c,
+	0x00e6, 0x2071, 0x1a98, 0x2472, 0x00ee, 0x20a1, 0x1cd0, 0x716c,
 	0x810d, 0x810d, 0x810d, 0x810d, 0x918c, 0x000f, 0x2001, 0x0001,
 	0x9112, 0x900e, 0x21a8, 0x4104, 0x8211, 0x1de0, 0x716c, 0x3400,
 	0x8001, 0x9102, 0x0120, 0x0218, 0x20a8, 0x900e, 0x4104, 0x2009,
 	0x1800, 0x810d, 0x810d, 0x810d, 0x810d, 0x810d, 0x918c, 0x001f,
 	0x2001, 0x0001, 0x9112, 0x20e9, 0x0001, 0x20a1, 0x0800, 0x900e,
-	0x20a9, 0x0800, 0x4104, 0x8211, 0x1dd8, 0x080c, 0x0f04, 0x080c,
-	0x5aa2, 0x080c, 0x9a5e, 0x080c, 0x10bb, 0x080c, 0x1296, 0x080c,
-	0x19a1, 0x080c, 0x0d46, 0x080c, 0x1040, 0x080c, 0x30d9, 0x080c,
-	0x700c, 0x080c, 0x6383, 0x080c, 0x7c91, 0x080c, 0x21b2, 0x080c,
-	0x7fbb, 0x080c, 0x767b, 0x080c, 0x1fef, 0x080c, 0x2123, 0x080c,
-	0x21a7, 0x2091, 0x3009, 0x7883, 0x0000, 0x1004, 0x091d, 0x7880,
+	0x20a9, 0x0800, 0x4104, 0x8211, 0x1dd8, 0x080c, 0x0f03, 0x080c,
+	0x5cd8, 0x080c, 0x9daf, 0x080c, 0x10ba, 0x080c, 0x129f, 0x080c,
+	0x1a53, 0x080c, 0x0d46, 0x080c, 0x103f, 0x080c, 0x3231, 0x080c,
+	0x729f, 0x080c, 0x6616, 0x080c, 0x7f4b, 0x080c, 0x230a, 0x080c,
+	0x8278, 0x080c, 0x7928, 0x080c, 0x2147, 0x080c, 0x227b, 0x080c,
+	0x22ff, 0x2091, 0x3009, 0x7883, 0x0000, 0x1004, 0x091d, 0x7880,
 	0x9086, 0x0002, 0x1190, 0x7883, 0x4000, 0x7837, 0x4000, 0x7833,
 	0x0010, 0x0e04, 0x0911, 0x2091, 0x5000, 0x2091, 0x4080, 0x2001,
-	0x0089, 0x2004, 0xd084, 0x190c, 0x117e, 0x2071, 0x1800, 0x7003,
+	0x0089, 0x2004, 0xd084, 0x190c, 0x1187, 0x2071, 0x1800, 0x7003,
 	0x0000, 0x2071, 0x1800, 0x7000, 0x908e, 0x0003, 0x1168, 0x080c,
-	0x477e, 0x080c, 0x3100, 0x080c, 0x707d, 0x080c, 0x6843, 0x080c,
-	0x7cba, 0x080c, 0x2960, 0x0c68, 0x000b, 0x0c88, 0x0940, 0x0941,
+	0x4997, 0x080c, 0x3258, 0x080c, 0x7310, 0x080c, 0x6ad6, 0x080c,
+	0x7f74, 0x080c, 0x2ab8, 0x0c68, 0x000b, 0x0c88, 0x0940, 0x0941,
 	0x0ad8, 0x093e, 0x0b8f, 0x0d45, 0x0d45, 0x0d45, 0x080c, 0x0db4,
 	0x0005, 0x0126, 0x00f6, 0x2091, 0x8000, 0x7000, 0x9086, 0x0001,
-	0x1904, 0x0aab, 0x080c, 0x0e71, 0x080c, 0x6d14, 0x0150, 0x080c,
-	0x6d37, 0x15a0, 0x2079, 0x0100, 0x7828, 0x9085, 0x1800, 0x782a,
-	0x0468, 0x080c, 0x6c46, 0x7000, 0x9086, 0x0001, 0x1904, 0x0aab,
-	0x7094, 0x9086, 0x0028, 0x1904, 0x0aab, 0x080c, 0x7c89, 0x080c,
-	0x7c7b, 0x2001, 0x0161, 0x2003, 0x0001, 0x2079, 0x0100, 0x7827,
-	0xffff, 0x7a28, 0x9295, 0x5e2f, 0x7a2a, 0x2011, 0x6b95, 0x080c,
-	0x7d56, 0x2011, 0x6b88, 0x080c, 0x7e27, 0x2011, 0x58fd, 0x080c,
-	0x7d56, 0x2011, 0x8030, 0x901e, 0x7392, 0x04d0, 0x080c, 0x51aa,
-	0x2079, 0x0100, 0x7844, 0x9005, 0x1904, 0x0aab, 0x2011, 0x58fd,
-	0x080c, 0x7d56, 0x2011, 0x6b95, 0x080c, 0x7d56, 0x2011, 0x6b88,
-	0x080c, 0x7e27, 0x2001, 0x0265, 0x2001, 0x0205, 0x2003, 0x0000,
-	0x7840, 0x9084, 0xfffb, 0x7842, 0x2001, 0x1975, 0x2004, 0x9005,
-	0x1140, 0x00c6, 0x2061, 0x0100, 0x080c, 0x5a4a, 0x00ce, 0x0804,
-	0x0aab, 0x780f, 0x006b, 0x7a28, 0x080c, 0x6d1c, 0x0118, 0x9295,
+	0x1904, 0x0aab, 0x080c, 0x0e71, 0x080c, 0x6fa7, 0x0150, 0x080c,
+	0x6fca, 0x15a0, 0x2079, 0x0100, 0x7828, 0x9085, 0x1800, 0x782a,
+	0x0468, 0x080c, 0x6ed9, 0x7000, 0x9086, 0x0001, 0x1904, 0x0aab,
+	0x7094, 0x9086, 0x0028, 0x1904, 0x0aab, 0x080c, 0x7f43, 0x080c,
+	0x7f35, 0x2001, 0x0161, 0x2003, 0x0001, 0x2079, 0x0100, 0x7827,
+	0xffff, 0x7a28, 0x9295, 0x5e2f, 0x7a2a, 0x2011, 0x6e28, 0x080c,
+	0x8010, 0x2011, 0x6e1b, 0x080c, 0x80e4, 0x2011, 0x5b33, 0x080c,
+	0x8010, 0x2011, 0x8030, 0x901e, 0x7392, 0x04d0, 0x080c, 0x53e0,
+	0x2079, 0x0100, 0x7844, 0x9005, 0x1904, 0x0aab, 0x2011, 0x5b33,
+	0x080c, 0x8010, 0x2011, 0x6e28, 0x080c, 0x8010, 0x2011, 0x6e1b,
+	0x080c, 0x80e4, 0x2001, 0x0265, 0x2001, 0x0205, 0x2003, 0x0000,
+	0x7840, 0x9084, 0xfffb, 0x7842, 0x2001, 0x1977, 0x2004, 0x9005,
+	0x1140, 0x00c6, 0x2061, 0x0100, 0x080c, 0x5c80, 0x00ce, 0x0804,
+	0x0aab, 0x780f, 0x006b, 0x7a28, 0x080c, 0x6faf, 0x0118, 0x9295,
 	0x5e2f, 0x0010, 0x9295, 0x402f, 0x7a2a, 0x2011, 0x8010, 0x73d4,
-	0x2001, 0x1976, 0x2003, 0x0001, 0x080c, 0x2826, 0x080c, 0x46b9,
+	0x2001, 0x1978, 0x2003, 0x0001, 0x080c, 0x297e, 0x080c, 0x48d2,
 	0x7244, 0xc284, 0x7246, 0x2001, 0x180c, 0x200c, 0xc1ac, 0xc1cc,
-	0x2102, 0x080c, 0x92c1, 0x2011, 0x0004, 0x080c, 0xb7a3, 0x080c,
-	0x6214, 0x080c, 0x6d14, 0x1120, 0x080c, 0x286a, 0x02e0, 0x0400,
-	0x080c, 0x5a51, 0x0140, 0x7093, 0x0001, 0x70cf, 0x0000, 0x080c,
-	0x5377, 0x0804, 0x0aab, 0x080c, 0x5153, 0xd094, 0x0188, 0x2011,
-	0x180c, 0x2204, 0xc0cd, 0x2012, 0x080c, 0x5157, 0xd0d4, 0x1118,
-	0x080c, 0x286a, 0x1270, 0x2011, 0x180c, 0x2204, 0xc0bc, 0x0088,
-	0x080c, 0x5157, 0xd0d4, 0x1db8, 0x2011, 0x180c, 0x2204, 0xc0bd,
-	0x0040, 0x2011, 0x180c, 0x2204, 0xc0bd, 0x2012, 0x080c, 0x630d,
-	0x0008, 0x2012, 0x080c, 0x62d3, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e,
-	0x00a8, 0x707b, 0x0000, 0x080c, 0x6d14, 0x1130, 0x70ac, 0x9005,
-	0x1168, 0x080c, 0xbbd8, 0x0050, 0x080c, 0xbbd8, 0x70d8, 0xd09c,
-	0x1128, 0x70ac, 0x9005, 0x0110, 0x080c, 0x5a27, 0x70e3, 0x0000,
-	0x70df, 0x0000, 0x70a3, 0x0000, 0x080c, 0x2872, 0x0228, 0x2011,
-	0x0101, 0x2204, 0xc0c4, 0x2012, 0x72d8, 0x080c, 0x6d14, 0x1178,
+	0x2102, 0x080c, 0x9626, 0x2011, 0x0004, 0x080c, 0xbb0e, 0x080c,
+	0x645a, 0x080c, 0x6fa7, 0x1120, 0x080c, 0x29c2, 0x02e0, 0x0400,
+	0x080c, 0x5c87, 0x0140, 0x7093, 0x0001, 0x70cf, 0x0000, 0x080c,
+	0x55ad, 0x0804, 0x0aab, 0x080c, 0x537f, 0xd094, 0x0188, 0x2011,
+	0x180c, 0x2204, 0xc0cd, 0x2012, 0x080c, 0x5383, 0xd0d4, 0x1118,
+	0x080c, 0x29c2, 0x1270, 0x2011, 0x180c, 0x2204, 0xc0bc, 0x0088,
+	0x080c, 0x5383, 0xd0d4, 0x1db8, 0x2011, 0x180c, 0x2204, 0xc0bd,
+	0x0040, 0x2011, 0x180c, 0x2204, 0xc0bd, 0x2012, 0x080c, 0x6553,
+	0x0008, 0x2012, 0x080c, 0x6519, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e,
+	0x00a8, 0x707b, 0x0000, 0x080c, 0x6fa7, 0x1130, 0x70ac, 0x9005,
+	0x1168, 0x080c, 0xbf4a, 0x0050, 0x080c, 0xbf4a, 0x70d8, 0xd09c,
+	0x1128, 0x70ac, 0x9005, 0x0110, 0x080c, 0x5c5d, 0x70e3, 0x0000,
+	0x70df, 0x0000, 0x70a3, 0x0000, 0x080c, 0x29ca, 0x0228, 0x2011,
+	0x0101, 0x2204, 0xc0c4, 0x2012, 0x72d8, 0x080c, 0x6fa7, 0x1178,
 	0x9016, 0x0016, 0x2009, 0x0002, 0x2019, 0x193e, 0x211a, 0x001e,
 	0x705b, 0xffff, 0x705f, 0x00ef, 0x707f, 0x0000, 0x0020, 0x2019,
 	0x193e, 0x201b, 0x0000, 0x2079, 0x1853, 0x7804, 0xd0ac, 0x0108,
-	0xc295, 0x72da, 0x080c, 0x6d14, 0x0118, 0x9296, 0x0004, 0x0548,
-	0x2011, 0x0001, 0x080c, 0xb7a3, 0x70a7, 0x0000, 0x70ab, 0xffff,
+	0xc295, 0x72da, 0x080c, 0x6fa7, 0x0118, 0x9296, 0x0004, 0x0548,
+	0x2011, 0x0001, 0x080c, 0xbb0e, 0x70a7, 0x0000, 0x70ab, 0xffff,
 	0x7003, 0x0002, 0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0x9085,
-	0x0003, 0x782a, 0x00fe, 0x080c, 0x2c63, 0x2011, 0x0005, 0x080c,
-	0x93f3, 0x080c, 0x868e, 0x080c, 0x6d14, 0x0148, 0x00c6, 0x2061,
+	0x0003, 0x782a, 0x00fe, 0x080c, 0x2dbb, 0x2011, 0x0005, 0x080c,
+	0x9758, 0x080c, 0x894b, 0x080c, 0x6fa7, 0x0148, 0x00c6, 0x2061,
 	0x0100, 0x0016, 0x2009, 0x0002, 0x61e2, 0x001e, 0x00ce, 0x012e,
 	0x0420, 0x70a7, 0x0000, 0x70ab, 0xffff, 0x7003, 0x0002, 0x00f6,
 	0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0x9085, 0x0003, 0x782a,
-	0x00fe, 0x2011, 0x0005, 0x080c, 0x93f3, 0x080c, 0x868e, 0x080c,
-	0x6d14, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x2009, 0x0002,
+	0x00fe, 0x2011, 0x0005, 0x080c, 0x9758, 0x080c, 0x894b, 0x080c,
+	0x6fa7, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x2009, 0x0002,
 	0x61e2, 0x001e, 0x00ce, 0x00fe, 0x012e, 0x0005, 0x00c6, 0x00b6,
-	0x080c, 0x6d14, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782,
-	0x080c, 0x6d14, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, 0x86ff,
+	0x080c, 0x6fa7, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782,
+	0x080c, 0x6fa7, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, 0x86ff,
 	0x0138, 0x9180, 0x1000, 0x2004, 0x905d, 0x0110, 0xb800, 0xd0bc,
-	0x090c, 0x2f76, 0x8108, 0x1f04, 0x0abf, 0x707b, 0x0000, 0x707c,
+	0x090c, 0x30ce, 0x8108, 0x1f04, 0x0abf, 0x707b, 0x0000, 0x707c,
 	0x9084, 0x00ff, 0x707e, 0x70af, 0x0000, 0x00be, 0x00ce, 0x0005,
 	0x00b6, 0x0126, 0x2091, 0x8000, 0x7000, 0x9086, 0x0002, 0x1904,
-	0x0b8c, 0x70a8, 0x9086, 0xffff, 0x0130, 0x080c, 0x2c63, 0x080c,
-	0x868e, 0x0804, 0x0b8c, 0x70d8, 0xd0ac, 0x1110, 0xd09c, 0x0540,
+	0x0b8c, 0x70a8, 0x9086, 0xffff, 0x0130, 0x080c, 0x2dbb, 0x080c,
+	0x894b, 0x0804, 0x0b8c, 0x70d8, 0xd0ac, 0x1110, 0xd09c, 0x0540,
 	0xd084, 0x0530, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, 0x000e,
-	0xd08c, 0x01f0, 0x70dc, 0x9086, 0xffff, 0x01b0, 0x080c, 0x2deb,
-	0x080c, 0x868e, 0x70d8, 0xd094, 0x1904, 0x0b8c, 0x2011, 0x0001,
-	0x080c, 0xbe86, 0x0110, 0x2011, 0x0003, 0x901e, 0x080c, 0x2e25,
-	0x080c, 0x868e, 0x0804, 0x0b8c, 0x70e0, 0x9005, 0x1904, 0x0b8c,
+	0xd08c, 0x01f0, 0x70dc, 0x9086, 0xffff, 0x01b0, 0x080c, 0x2f43,
+	0x080c, 0x894b, 0x70d8, 0xd094, 0x1904, 0x0b8c, 0x2011, 0x0001,
+	0x080c, 0xc1f9, 0x0110, 0x2011, 0x0003, 0x901e, 0x080c, 0x2f7d,
+	0x080c, 0x894b, 0x0804, 0x0b8c, 0x70e0, 0x9005, 0x1904, 0x0b8c,
 	0x70a4, 0x9005, 0x1904, 0x0b8c, 0x70d8, 0xd0a4, 0x0118, 0xd0b4,
-	0x0904, 0x0b8c, 0x080c, 0x62d3, 0x1904, 0x0b8c, 0x080c, 0x6326,
-	0x1904, 0x0b8c, 0x080c, 0x630d, 0x01c0, 0x0156, 0x00c6, 0x20a9,
-	0x007f, 0x900e, 0x0016, 0x080c, 0x5ff1, 0x1118, 0xb800, 0xd0ec,
+	0x0904, 0x0b8c, 0x080c, 0x6519, 0x1904, 0x0b8c, 0x080c, 0x656c,
+	0x1904, 0x0b8c, 0x080c, 0x6553, 0x01c0, 0x0156, 0x00c6, 0x20a9,
+	0x007f, 0x900e, 0x0016, 0x080c, 0x6237, 0x1118, 0xb800, 0xd0ec,
 	0x1138, 0x001e, 0x8108, 0x1f04, 0x0b32, 0x00ce, 0x015e, 0x0028,
 	0x001e, 0x00ce, 0x015e, 0x0804, 0x0b8c, 0x0006, 0x2001, 0x0103,
-	0x2003, 0x006b, 0x000e, 0x2011, 0x1982, 0x080c, 0x0f74, 0x2011,
-	0x199c, 0x080c, 0x0f74, 0x7030, 0xc08c, 0x7032, 0x7003, 0x0003,
-	0x70ab, 0xffff, 0x080c, 0x0e53, 0x9006, 0x080c, 0x24b4, 0x0036,
-	0x0046, 0x2019, 0xffff, 0x2021, 0x0006, 0x080c, 0x4856, 0x004e,
-	0x003e, 0x00f6, 0x2079, 0x0100, 0x080c, 0x6d37, 0x0150, 0x080c,
-	0x6d14, 0x7828, 0x0118, 0x9084, 0xe1ff, 0x0010, 0x9084, 0xffdf,
-	0x782a, 0x00fe, 0x2001, 0x19b7, 0x2004, 0x9086, 0x0005, 0x1120,
-	0x2011, 0x0000, 0x080c, 0x93f3, 0x2011, 0x0000, 0x080c, 0x93fd,
-	0x080c, 0x868e, 0x080c, 0x8769, 0x012e, 0x00be, 0x0005, 0x0016,
+	0x2003, 0x006b, 0x000e, 0x2011, 0x1984, 0x080c, 0x0f73, 0x2011,
+	0x199e, 0x080c, 0x0f73, 0x7030, 0xc08c, 0x7032, 0x7003, 0x0003,
+	0x70ab, 0xffff, 0x080c, 0x0e53, 0x9006, 0x080c, 0x260c, 0x0036,
+	0x0046, 0x2019, 0xffff, 0x2021, 0x0006, 0x080c, 0x4a6f, 0x004e,
+	0x003e, 0x00f6, 0x2079, 0x0100, 0x080c, 0x6fca, 0x0150, 0x080c,
+	0x6fa7, 0x7828, 0x0118, 0x9084, 0xe1ff, 0x0010, 0x9084, 0xffdf,
+	0x782a, 0x00fe, 0x2001, 0x19b9, 0x2004, 0x9086, 0x0005, 0x1120,
+	0x2011, 0x0000, 0x080c, 0x9758, 0x2011, 0x0000, 0x080c, 0x9762,
+	0x080c, 0x894b, 0x080c, 0x8a26, 0x012e, 0x00be, 0x0005, 0x0016,
 	0x0046, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, 0x7904,
-	0x918c, 0xfffd, 0x7906, 0x2009, 0x00f7, 0x080c, 0x5a10, 0x7940,
+	0x918c, 0xfffd, 0x7906, 0x2009, 0x00f7, 0x080c, 0x5c46, 0x7940,
 	0x918c, 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0110, 0x7827, 0x0040,
 	0xd19c, 0x0110, 0x7827, 0x0008, 0x0006, 0x0036, 0x0156, 0x7954,
-	0xd1ac, 0x1904, 0x0c1c, 0x2001, 0x1976, 0x2004, 0x9005, 0x1518,
-	0x080c, 0x28ed, 0x1148, 0x2001, 0x0001, 0x080c, 0x2855, 0x2001,
-	0x0001, 0x080c, 0x2838, 0x00b8, 0x080c, 0x28f5, 0x1138, 0x9006,
-	0x080c, 0x2855, 0x9006, 0x080c, 0x2838, 0x0068, 0x080c, 0x28fd,
-	0x1d50, 0x2001, 0x1967, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c,
-	0x264f, 0x0804, 0x0cfc, 0x080c, 0x6d25, 0x0148, 0x080c, 0x6d37,
-	0x1118, 0x080c, 0x7007, 0x0050, 0x080c, 0x6d1c, 0x0dd0, 0x080c,
-	0x7002, 0x080c, 0x6ff8, 0x080c, 0x6c46, 0x0058, 0x080c, 0x6d14,
-	0x0140, 0x2009, 0x00f8, 0x080c, 0x5a10, 0x7843, 0x0090, 0x7843,
-	0x0010, 0x20a9, 0x09c4, 0x7820, 0xd09c, 0x1138, 0x080c, 0x6d14,
+	0xd1ac, 0x1904, 0x0c1c, 0x2001, 0x1978, 0x2004, 0x9005, 0x1518,
+	0x080c, 0x2a45, 0x1148, 0x2001, 0x0001, 0x080c, 0x29ad, 0x2001,
+	0x0001, 0x080c, 0x2990, 0x00b8, 0x080c, 0x2a4d, 0x1138, 0x9006,
+	0x080c, 0x29ad, 0x9006, 0x080c, 0x2990, 0x0068, 0x080c, 0x2a55,
+	0x1d50, 0x2001, 0x1969, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c,
+	0x27a7, 0x0804, 0x0cfc, 0x080c, 0x6fb8, 0x0148, 0x080c, 0x6fca,
+	0x1118, 0x080c, 0x729a, 0x0050, 0x080c, 0x6faf, 0x0dd0, 0x080c,
+	0x7295, 0x080c, 0x728b, 0x080c, 0x6ed9, 0x0058, 0x080c, 0x6fa7,
+	0x0140, 0x2009, 0x00f8, 0x080c, 0x5c46, 0x7843, 0x0090, 0x7843,
+	0x0010, 0x20a9, 0x09c4, 0x7820, 0xd09c, 0x1138, 0x080c, 0x6fa7,
 	0x0138, 0x7824, 0xd0ac, 0x1904, 0x0d01, 0x1f04, 0x0bfb, 0x0070,
-	0x7824, 0x080c, 0x6d2e, 0x0118, 0xd0ac, 0x1904, 0x0d01, 0x9084,
+	0x7824, 0x080c, 0x6fc1, 0x0118, 0xd0ac, 0x1904, 0x0d01, 0x9084,
 	0x1800, 0x0d98, 0x7003, 0x0001, 0x0804, 0x0d01, 0x2001, 0x0001,
-	0x080c, 0x24b4, 0x0804, 0x0d14, 0x2001, 0x1976, 0x2004, 0x9005,
-	0x1518, 0x080c, 0x28ed, 0x1148, 0x2001, 0x0001, 0x080c, 0x2855,
-	0x2001, 0x0001, 0x080c, 0x2838, 0x00b8, 0x080c, 0x28f5, 0x1138,
-	0x9006, 0x080c, 0x2855, 0x9006, 0x080c, 0x2838, 0x0068, 0x080c,
-	0x28fd, 0x1d50, 0x2001, 0x1967, 0x2004, 0xd0fc, 0x0108, 0x0020,
-	0x080c, 0x264f, 0x0804, 0x0cfc, 0x7850, 0x9085, 0x0040, 0x7852,
-	0x7938, 0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, 0x2905, 0x9085,
+	0x080c, 0x260c, 0x0804, 0x0d14, 0x2001, 0x1978, 0x2004, 0x9005,
+	0x1518, 0x080c, 0x2a45, 0x1148, 0x2001, 0x0001, 0x080c, 0x29ad,
+	0x2001, 0x0001, 0x080c, 0x2990, 0x00b8, 0x080c, 0x2a4d, 0x1138,
+	0x9006, 0x080c, 0x29ad, 0x9006, 0x080c, 0x2990, 0x0068, 0x080c,
+	0x2a55, 0x1d50, 0x2001, 0x1969, 0x2004, 0xd0fc, 0x0108, 0x0020,
+	0x080c, 0x27a7, 0x0804, 0x0cfc, 0x7850, 0x9085, 0x0040, 0x7852,
+	0x7938, 0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, 0x2a5d, 0x9085,
 	0x2000, 0x7852, 0x793a, 0x20a9, 0x0046, 0x1d04, 0x0c55, 0x080c,
-	0x7e07, 0x1f04, 0x0c55, 0x7850, 0x9085, 0x0400, 0x9084, 0xdfbf,
-	0x7852, 0x793a, 0x080c, 0x6d25, 0x0148, 0x080c, 0x6d37, 0x1118,
-	0x080c, 0x7007, 0x0050, 0x080c, 0x6d1c, 0x0dd0, 0x080c, 0x7002,
-	0x080c, 0x6ff8, 0x080c, 0x6c46, 0x0020, 0x2009, 0x00f8, 0x080c,
-	0x5a10, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x0c7b, 0x7850, 0x9085,
-	0x1400, 0x7852, 0x080c, 0x6d14, 0x0120, 0x7843, 0x0090, 0x7843,
-	0x0010, 0x2021, 0xe678, 0x2019, 0xea60, 0x0d0c, 0x7e07, 0x7820,
-	0xd09c, 0x1588, 0x080c, 0x6d14, 0x0904, 0x0ce1, 0x7824, 0xd0ac,
-	0x1904, 0x0d01, 0x080c, 0x6d37, 0x1530, 0x0046, 0x2021, 0x0320,
-	0x8421, 0x1df0, 0x004e, 0x7827, 0x1800, 0x080c, 0x2905, 0x7824,
+	0x80c4, 0x1f04, 0x0c55, 0x7850, 0x9085, 0x0400, 0x9084, 0xdfbf,
+	0x7852, 0x793a, 0x080c, 0x6fb8, 0x0148, 0x080c, 0x6fca, 0x1118,
+	0x080c, 0x729a, 0x0050, 0x080c, 0x6faf, 0x0dd0, 0x080c, 0x7295,
+	0x080c, 0x728b, 0x080c, 0x6ed9, 0x0020, 0x2009, 0x00f8, 0x080c,
+	0x5c46, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x0c7b, 0x7850, 0x9085,
+	0x1400, 0x7852, 0x080c, 0x6fa7, 0x0120, 0x7843, 0x0090, 0x7843,
+	0x0010, 0x2021, 0xe678, 0x2019, 0xea60, 0x0d0c, 0x80c4, 0x7820,
+	0xd09c, 0x1588, 0x080c, 0x6fa7, 0x0904, 0x0ce1, 0x7824, 0xd0ac,
+	0x1904, 0x0d01, 0x080c, 0x6fca, 0x1530, 0x0046, 0x2021, 0x0320,
+	0x8421, 0x1df0, 0x004e, 0x7827, 0x1800, 0x080c, 0x2a5d, 0x7824,
 	0x9084, 0x1800, 0x1168, 0x9484, 0x0fff, 0x1140, 0x2001, 0x1810,
 	0x2004, 0x9084, 0x9000, 0x0110, 0x080c, 0x0d22, 0x8421, 0x1158,
-	0x1d04, 0x0cbc, 0x080c, 0x7e07, 0x080c, 0x7002, 0x080c, 0x6ff8,
+	0x1d04, 0x0cbc, 0x080c, 0x80c4, 0x080c, 0x7295, 0x080c, 0x728b,
 	0x7003, 0x0001, 0x04f0, 0x8319, 0x1940, 0x1d04, 0x0cc9, 0x080c,
-	0x7e07, 0x2009, 0x196a, 0x2104, 0x9005, 0x0118, 0x8001, 0x200a,
+	0x80c4, 0x2009, 0x196c, 0x2104, 0x9005, 0x0118, 0x8001, 0x200a,
 	0x1178, 0x200b, 0x000a, 0x7827, 0x0048, 0x20a9, 0x0002, 0x080c,
-	0x28e6, 0x7924, 0x080c, 0x2905, 0xd19c, 0x0110, 0x080c, 0x2826,
-	0x00d8, 0x080c, 0x6d25, 0x1140, 0x94a2, 0x03e8, 0x1128, 0x080c,
-	0x6cec, 0x7003, 0x0001, 0x00a8, 0x7827, 0x1800, 0x080c, 0x2905,
-	0x7824, 0x080c, 0x6d2e, 0x0110, 0xd0ac, 0x1158, 0x9084, 0x1800,
-	0x0950, 0x7003, 0x0001, 0x0028, 0x2001, 0x0001, 0x080c, 0x24b4,
+	0x2a3e, 0x7924, 0x080c, 0x2a5d, 0xd19c, 0x0110, 0x080c, 0x297e,
+	0x00d8, 0x080c, 0x6fb8, 0x1140, 0x94a2, 0x03e8, 0x1128, 0x080c,
+	0x6f7f, 0x7003, 0x0001, 0x00a8, 0x7827, 0x1800, 0x080c, 0x2a5d,
+	0x7824, 0x080c, 0x6fc1, 0x0110, 0xd0ac, 0x1158, 0x9084, 0x1800,
+	0x0950, 0x7003, 0x0001, 0x0028, 0x2001, 0x0001, 0x080c, 0x260c,
 	0x0078, 0x2009, 0x180c, 0x210c, 0xd19c, 0x1120, 0x7904, 0x918d,
 	0x0002, 0x7906, 0x7827, 0x0048, 0x7828, 0x9085, 0x0028, 0x782a,
-	0x7850, 0x9085, 0x0400, 0x7852, 0x2001, 0x1976, 0x2003, 0x0000,
+	0x7850, 0x9085, 0x0400, 0x7852, 0x2001, 0x1978, 0x2003, 0x0000,
 	0x9006, 0x78f2, 0x015e, 0x003e, 0x000e, 0x012e, 0x00fe, 0x004e,
 	0x001e, 0x0005, 0x0006, 0x0016, 0x0036, 0x0046, 0x00b6, 0x00c6,
-	0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0069, 0x0d0c, 0x7e07, 0x015e,
+	0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0069, 0x0d0c, 0x80c4, 0x015e,
 	0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x004e, 0x003e, 0x001e,
 	0x000e, 0x0005, 0x00e6, 0x2071, 0x1894, 0x7004, 0x9086, 0x0001,
-	0x1110, 0x080c, 0x3100, 0x00ee, 0x0005, 0x0005, 0x2a70, 0x2061,
-	0x197a, 0x2063, 0x0003, 0x6007, 0x0002, 0x600b, 0x0015, 0x600f,
+	0x1110, 0x080c, 0x3258, 0x00ee, 0x0005, 0x0005, 0x2a70, 0x2061,
+	0x197c, 0x2063, 0x0003, 0x6007, 0x0002, 0x600b, 0x001a, 0x600f,
 	0x0317, 0x2001, 0x194d, 0x900e, 0x2102, 0x7192, 0x2001, 0x0100,
 	0x2004, 0x9082, 0x0002, 0x0218, 0x705b, 0xffff, 0x0008, 0x715a,
-	0x7063, 0xffff, 0x717a, 0x717e, 0x080c, 0xbbd8, 0x70e7, 0x00c0,
+	0x7063, 0xffff, 0x717a, 0x717e, 0x080c, 0xbf4a, 0x70e7, 0x00c0,
 	0x2061, 0x193d, 0x6003, 0x0909, 0x6106, 0x600b, 0x8800, 0x600f,
 	0x0200, 0x6013, 0x00ff, 0x6017, 0x000f, 0x611a, 0x601f, 0x07d0,
 	0x2061, 0x1945, 0x6003, 0x8000, 0x6106, 0x610a, 0x600f, 0x0200,
-	0x6013, 0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, 0x2061, 0x1958,
+	0x6013, 0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, 0x2061, 0x195a,
 	0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, 0x2020,
-	0x2001, 0x182b, 0x2102, 0x0005, 0x9016, 0x080c, 0x5ff1, 0x1178,
+	0x2001, 0x182b, 0x2102, 0x0005, 0x9016, 0x080c, 0x6237, 0x1178,
 	0xb804, 0x90c4, 0x00ff, 0x98c6, 0x0006, 0x0128, 0x90c4, 0xff00,
 	0x98c6, 0x0600, 0x1120, 0x9186, 0x0080, 0x0108, 0x8210, 0x8108,
 	0x9186, 0x0800, 0x1d50, 0x2208, 0x0005, 0x2091, 0x8000, 0x2079,
@@ -236,18 +236,18 @@ unsigned short risc_code01[] = { 
 	0x0006, 0x0016, 0x2001, 0x8002, 0x0006, 0x2079, 0x0000, 0x000e,
 	0x7882, 0x7836, 0x001e, 0x798e, 0x000e, 0x788a, 0x000e, 0x7886,
 	0x3900, 0x789a, 0x7833, 0x0012, 0x2091, 0x5000, 0x0156, 0x00d6,
-	0x0036, 0x0026, 0x2079, 0x0300, 0x2069, 0x1a69, 0x7a08, 0x226a,
-	0x2069, 0x1a6a, 0x7a18, 0x226a, 0x8d68, 0x7a1c, 0x226a, 0x782c,
-	0x2019, 0x1a77, 0x201a, 0x2019, 0x1a7a, 0x9016, 0x7808, 0xd09c,
-	0x0168, 0x7820, 0x201a, 0x8210, 0x8318, 0x9386, 0x1a8f, 0x0108,
-	0x0ca8, 0x7808, 0xd09c, 0x0110, 0x2011, 0xdead, 0x2019, 0x1a78,
-	0x782c, 0x201a, 0x8318, 0x221a, 0x7803, 0x0000, 0x2069, 0x1a49,
+	0x0036, 0x0026, 0x2079, 0x0300, 0x2069, 0x1a72, 0x7a08, 0x226a,
+	0x2069, 0x1a73, 0x7a18, 0x226a, 0x8d68, 0x7a1c, 0x226a, 0x782c,
+	0x2019, 0x1a80, 0x201a, 0x2019, 0x1a83, 0x9016, 0x7808, 0xd09c,
+	0x0168, 0x7820, 0x201a, 0x8210, 0x8318, 0x9386, 0x1a98, 0x0108,
+	0x0ca8, 0x7808, 0xd09c, 0x0110, 0x2011, 0xdead, 0x2019, 0x1a81,
+	0x782c, 0x201a, 0x8318, 0x221a, 0x7803, 0x0000, 0x2069, 0x1a52,
 	0x901e, 0x20a9, 0x0020, 0x7b26, 0x7a28, 0x226a, 0x8d68, 0x8318,
 	0x1f04, 0x0e03, 0x002e, 0x003e, 0x00de, 0x015e, 0x2079, 0x1800,
 	0x7803, 0x0005, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084,
-	0x0180, 0x2001, 0x19e8, 0x2004, 0x9005, 0x0128, 0x2001, 0x008b,
+	0x0180, 0x2001, 0x19ea, 0x2004, 0x9005, 0x0128, 0x2001, 0x008b,
 	0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, 0x2003,
-	0x1001, 0x080c, 0x5162, 0x1108, 0x0099, 0x0cd8, 0x0005, 0x918c,
+	0x1001, 0x080c, 0x538e, 0x1108, 0x0099, 0x0cd8, 0x0005, 0x918c,
 	0x03ff, 0x2001, 0x0003, 0x2004, 0x9084, 0x0600, 0x1118, 0x918d,
 	0x2800, 0x0010, 0x918d, 0x2000, 0x2001, 0x017f, 0x2102, 0x0005,
 	0x0026, 0x0126, 0x2011, 0x0080, 0x080c, 0x0ecb, 0x20a9, 0x0900,
@@ -258,9 +258,9 @@ unsigned short risc_code01[] = { 
 	0x70eb, 0x0000, 0x1128, 0x70eb, 0x0fa0, 0x080c, 0x0edd, 0x002e,
 	0x0005, 0x0026, 0x080c, 0x0ed8, 0x0128, 0xd0a4, 0x1138, 0x2011,
 	0xcdd5, 0x0010, 0x2011, 0x0080, 0x080c, 0x0edd, 0x002e, 0x0005,
-	0x0026, 0x70eb, 0x0000, 0x080c, 0x0ed8, 0x1148, 0x080c, 0x28fd,
+	0x0026, 0x70eb, 0x0000, 0x080c, 0x0ed8, 0x1148, 0x080c, 0x2a55,
 	0x1118, 0x2011, 0x8484, 0x0058, 0x2011, 0x8282, 0x0040, 0x080c,
-	0x28fd, 0x1118, 0x2011, 0xcdc5, 0x0010, 0x2011, 0xcac2, 0x080c,
+	0x2a55, 0x1118, 0x2011, 0xcdc5, 0x0010, 0x2011, 0xcac2, 0x080c,
 	0x0edd, 0x002e, 0x0005, 0x00e6, 0x0006, 0x2071, 0x1800, 0xd0b4,
 	0x70e4, 0x1110, 0xc0e4, 0x0048, 0x0006, 0x3b00, 0x9084, 0xff3f,
 	0x20d8, 0x000e, 0x70eb, 0x0000, 0xc0e5, 0x0079, 0x000e, 0x00ee,
@@ -274,534 +274,577 @@ unsigned short risc_code01[] = { 
 	0x9294, 0x00c0, 0x0c01, 0x0005, 0x1d04, 0x0eec, 0x2091, 0x6000,
 	0x1f04, 0x0eec, 0x0005, 0x890e, 0x810e, 0x810f, 0x9194, 0x003f,
 	0x918c, 0xffc0, 0x0005, 0x0006, 0x2200, 0x914d, 0x894f, 0x894d,
-	0x894d, 0x000e, 0x000e, 0x0005, 0x01d6, 0x0146, 0x0036, 0x0096,
-	0x2061, 0x1883, 0x600b, 0x0000, 0x600f, 0x0000, 0x6003, 0x0000,
-	0x6007, 0x0000, 0x2009, 0xffc0, 0x2105, 0x0006, 0x2001, 0xaaaa,
-	0x200f, 0x2019, 0x5555, 0x9016, 0x2049, 0x0bff, 0xab02, 0xa001,
-	0xa001, 0xa800, 0x9306, 0x1138, 0x2105, 0x9306, 0x0120, 0x8210,
-	0x99c8, 0x0400, 0x0c98, 0x000e, 0x200f, 0x2001, 0x1893, 0x928a,
-	0x000e, 0x1638, 0x928a, 0x0006, 0x2011, 0x0006, 0x1210, 0x2011,
-	0x0000, 0x2202, 0x9006, 0x2008, 0x82ff, 0x01b0, 0x8200, 0x600a,
-	0x600f, 0xffff, 0x6003, 0x0002, 0x6007, 0x0000, 0x0026, 0x2019,
-	0x0010, 0x9280, 0x0001, 0x20e8, 0x21a0, 0x21a8, 0x4104, 0x8319,
-	0x1de0, 0x8211, 0x1da0, 0x002e, 0x009e, 0x003e, 0x014e, 0x01de,
-	0x0005, 0x2011, 0x000e, 0x08e8, 0x0016, 0x0026, 0x0096, 0x3348,
-	0x080c, 0x0ef3, 0x2100, 0x9300, 0x2098, 0x22e0, 0x009e, 0x002e,
-	0x001e, 0x0036, 0x3518, 0x20a9, 0x0001, 0x4002, 0x8007, 0x4004,
-	0x8319, 0x1dd8, 0x003e, 0x0005, 0x20e9, 0x0001, 0x71b4, 0x81ff,
-	0x11c0, 0x9006, 0x2009, 0x0200, 0x20a9, 0x0002, 0x9298, 0x0018,
-	0x23a0, 0x4001, 0x2009, 0x0700, 0x20a9, 0x0002, 0x9298, 0x0008,
-	0x23a0, 0x4001, 0x7078, 0x8007, 0x717c, 0x810f, 0x20a9, 0x0002,
-	0x4001, 0x9298, 0x000c, 0x23a0, 0x900e, 0x080c, 0x0d94, 0x2001,
-	0x0000, 0x810f, 0x20a9, 0x0002, 0x4001, 0x0005, 0x89ff, 0x0140,
-	0xa804, 0xa807, 0x0000, 0x0006, 0x080c, 0x101e, 0x009e, 0x0cb0,
-	0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x1097, 0x090c, 0x0db4,
-	0x00ee, 0x0005, 0x0086, 0x00e6, 0x0006, 0x0026, 0x0036, 0x0126,
-	0x2091, 0x8000, 0x00c9, 0x2071, 0x1800, 0x73bc, 0x702c, 0x9016,
-	0x9045, 0x0158, 0x8210, 0x9906, 0x090c, 0x0db4, 0x2300, 0x9202,
-	0x0120, 0x1a0c, 0x0db4, 0xa000, 0x0c98, 0x012e, 0x003e, 0x002e,
-	0x000e, 0x00ee, 0x008e, 0x0005, 0x0086, 0x00e6, 0x0006, 0x0126,
-	0x2091, 0x8000, 0x2071, 0x1906, 0x7010, 0x9005, 0x0140, 0x7018,
-	0x9045, 0x0128, 0x9906, 0x090c, 0x0db4, 0xa000, 0x0cc8, 0x012e,
-	0x000e, 0x00ee, 0x008e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x0126,
-	0x2091, 0x8000, 0x70bc, 0x8001, 0x0270, 0x70be, 0x702c, 0x2048,
-	0x9085, 0x0001, 0xa800, 0x702e, 0xa803, 0x0000, 0xa807, 0x0000,
+	0x894d, 0x000e, 0x0005, 0x01d6, 0x0146, 0x0036, 0x0096, 0x2061,
+	0x1883, 0x600b, 0x0000, 0x600f, 0x0000, 0x6003, 0x0000, 0x6007,
+	0x0000, 0x2009, 0xffc0, 0x2105, 0x0006, 0x2001, 0xaaaa, 0x200f,
+	0x2019, 0x5555, 0x9016, 0x2049, 0x0bff, 0xab02, 0xa001, 0xa001,
+	0xa800, 0x9306, 0x1138, 0x2105, 0x9306, 0x0120, 0x8210, 0x99c8,
+	0x0400, 0x0c98, 0x000e, 0x200f, 0x2001, 0x1893, 0x928a, 0x000e,
+	0x1638, 0x928a, 0x0006, 0x2011, 0x0006, 0x1210, 0x2011, 0x0000,
+	0x2202, 0x9006, 0x2008, 0x82ff, 0x01b0, 0x8200, 0x600a, 0x600f,
+	0xffff, 0x6003, 0x0002, 0x6007, 0x0000, 0x0026, 0x2019, 0x0010,
+	0x9280, 0x0001, 0x20e8, 0x21a0, 0x21a8, 0x4104, 0x8319, 0x1de0,
+	0x8211, 0x1da0, 0x002e, 0x009e, 0x003e, 0x014e, 0x01de, 0x0005,
+	0x2011, 0x000e, 0x08e8, 0x0016, 0x0026, 0x0096, 0x3348, 0x080c,
+	0x0ef3, 0x2100, 0x9300, 0x2098, 0x22e0, 0x009e, 0x002e, 0x001e,
+	0x0036, 0x3518, 0x20a9, 0x0001, 0x4002, 0x8007, 0x4004, 0x8319,
+	0x1dd8, 0x003e, 0x0005, 0x20e9, 0x0001, 0x71b4, 0x81ff, 0x11c0,
+	0x9006, 0x2009, 0x0200, 0x20a9, 0x0002, 0x9298, 0x0018, 0x23a0,
+	0x4001, 0x2009, 0x0700, 0x20a9, 0x0002, 0x9298, 0x0008, 0x23a0,
+	0x4001, 0x7078, 0x8007, 0x717c, 0x810f, 0x20a9, 0x0002, 0x4001,
+	0x9298, 0x000c, 0x23a0, 0x900e, 0x080c, 0x0d94, 0x2001, 0x0000,
+	0x810f, 0x20a9, 0x0002, 0x4001, 0x0005, 0x89ff, 0x0140, 0xa804,
+	0xa807, 0x0000, 0x0006, 0x080c, 0x101d, 0x009e, 0x0cb0, 0x0005,
+	0x00e6, 0x2071, 0x1800, 0x080c, 0x1096, 0x090c, 0x0db4, 0x00ee,
+	0x0005, 0x0086, 0x00e6, 0x0006, 0x0026, 0x0036, 0x0126, 0x2091,
+	0x8000, 0x00c9, 0x2071, 0x1800, 0x73bc, 0x702c, 0x9016, 0x9045,
+	0x0158, 0x8210, 0x9906, 0x090c, 0x0db4, 0x2300, 0x9202, 0x0120,
+	0x1a0c, 0x0db4, 0xa000, 0x0c98, 0x012e, 0x003e, 0x002e, 0x000e,
+	0x00ee, 0x008e, 0x0005, 0x0086, 0x00e6, 0x0006, 0x0126, 0x2091,
+	0x8000, 0x2071, 0x1906, 0x7010, 0x9005, 0x0140, 0x7018, 0x9045,
+	0x0128, 0x9906, 0x090c, 0x0db4, 0xa000, 0x0cc8, 0x012e, 0x000e,
+	0x00ee, 0x008e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x0126, 0x2091,
+	0x8000, 0x70bc, 0x8001, 0x0270, 0x70be, 0x702c, 0x2048, 0x9085,
+	0x0001, 0xa800, 0x702e, 0xa803, 0x0000, 0xa807, 0x0000, 0x012e,
+	0x00ee, 0x0005, 0x904e, 0x0cd8, 0x00e6, 0x0126, 0x2091, 0x8000,
+	0x2071, 0x1800, 0x70bc, 0x90ca, 0x0040, 0x0268, 0x8001, 0x70be,
+	0x702c, 0x2048, 0xa800, 0x702e, 0xa803, 0x0000, 0xa807, 0x0000,
 	0x012e, 0x00ee, 0x0005, 0x904e, 0x0cd8, 0x00e6, 0x0126, 0x2091,
-	0x8000, 0x2071, 0x1800, 0x70bc, 0x90ca, 0x0040, 0x0268, 0x8001,
-	0x70be, 0x702c, 0x2048, 0xa800, 0x702e, 0xa803, 0x0000, 0xa807,
-	0x0000, 0x012e, 0x00ee, 0x0005, 0x904e, 0x0cd8, 0x00e6, 0x0126,
-	0x2091, 0x8000, 0x0016, 0x890e, 0x810e, 0x810f, 0x9184, 0x003f,
-	0xa862, 0x9184, 0xffc0, 0xa85e, 0x001e, 0x0020, 0x00e6, 0x0126,
-	0x2091, 0x8000, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e,
-	0x70bc, 0x8000, 0x70be, 0x080c, 0x7c7b, 0x012e, 0x00ee, 0x0005,
-	0x2071, 0x1800, 0x9026, 0x2009, 0x0000, 0x2049, 0x0400, 0x2900,
-	0x702e, 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420,
-	0x9886, 0x0440, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071,
-	0x1883, 0x7000, 0x9005, 0x11a0, 0x2001, 0x0492, 0xa802, 0x2048,
-	0x2009, 0x2480, 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001,
-	0x8420, 0x9886, 0x0800, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90,
-	0x2071, 0x1883, 0x7104, 0x7200, 0x82ff, 0x01d0, 0x7308, 0x8318,
-	0x831f, 0x831b, 0x831b, 0x7312, 0x8319, 0x2001, 0x0800, 0xa802,
-	0x2048, 0x8900, 0xa802, 0x2040, 0xa95e, 0xaa62, 0x8420, 0x2300,
-	0x9906, 0x0130, 0x2848, 0x9188, 0x0040, 0x9291, 0x0000, 0x0c88,
-	0xa803, 0x0000, 0x2071, 0x1800, 0x74ba, 0x74be, 0x0005, 0x00e6,
-	0x0016, 0x9984, 0xfc00, 0x01e8, 0x908c, 0xf800, 0x1168, 0x9982,
-	0x0400, 0x02b8, 0x9982, 0x0440, 0x0278, 0x9982, 0x0492, 0x0288,
-	0x9982, 0x0800, 0x1270, 0x0040, 0x9982, 0x0800, 0x0250, 0x2071,
-	0x1883, 0x7010, 0x9902, 0x1228, 0x9085, 0x0001, 0x001e, 0x00ee,
-	0x0005, 0x9006, 0x0cd8, 0x00e6, 0x2071, 0x19e7, 0x7007, 0x0000,
-	0x9006, 0x701e, 0x7022, 0x7002, 0x2071, 0x0000, 0x7010, 0x9085,
-	0x8044, 0x7012, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6,
-	0xa06f, 0x0000, 0x2071, 0x19e7, 0x701c, 0x9088, 0x19f1, 0x280a,
-	0x8000, 0x9084, 0x003f, 0x701e, 0x7120, 0x9106, 0x090c, 0x0db4,
-	0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x00a9, 0x00fe,
-	0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0x2071,
-	0x19e7, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x0021,
-	0x00fe, 0x00ee, 0x012e, 0x0005, 0x7004, 0x9086, 0x0000, 0x1110,
-	0x7007, 0x0006, 0x7000, 0x0002, 0x110e, 0x110c, 0x110c, 0x110c,
-	0x1285, 0x1285, 0x1285, 0x1285, 0x080c, 0x0db4, 0x701c, 0x7120,
-	0x9106, 0x1148, 0x792c, 0x9184, 0x0001, 0x1120, 0xd1fc, 0x1110,
-	0x7007, 0x0000, 0x0005, 0x0096, 0x9180, 0x19f1, 0x2004, 0x700a,
-	0x2048, 0x8108, 0x918c, 0x003f, 0x7122, 0x782b, 0x0026, 0xa88c,
-	0x7802, 0xa890, 0x7806, 0xa894, 0x780a, 0xa898, 0x780e, 0xa878,
-	0x700e, 0xa870, 0x7016, 0xa874, 0x701a, 0xa868, 0x009e, 0xd084,
-	0x0120, 0x7007, 0x0001, 0x0029, 0x0005, 0x7007, 0x0002, 0x00b1,
-	0x0005, 0x0016, 0x0026, 0x710c, 0x2011, 0x0040, 0x9182, 0x0040,
-	0x1210, 0x2110, 0x9006, 0x700e, 0x7212, 0x8203, 0x7812, 0x782b,
-	0x0020, 0x782b, 0x0041, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026,
-	0x0136, 0x0146, 0x0156, 0x7014, 0x20e0, 0x7018, 0x2098, 0x20e9,
-	0x0000, 0x20a1, 0x0088, 0x782b, 0x0026, 0x710c, 0x2011, 0x0040,
-	0x9182, 0x0040, 0x1210, 0x2110, 0x9006, 0x700e, 0x22a8, 0x4006,
-	0x8203, 0x7812, 0x782b, 0x0020, 0x3300, 0x701a, 0x782b, 0x0001,
-	0x015e, 0x014e, 0x013e, 0x002e, 0x001e, 0x0005, 0x2009, 0x19e7,
-	0x2104, 0xc095, 0x200a, 0x080c, 0x10eb, 0x0005, 0x0016, 0x00e6,
-	0x2071, 0x19e7, 0x00f6, 0x2079, 0x0080, 0x792c, 0xd1bc, 0x190c,
-	0x0dad, 0x782b, 0x0002, 0xd1fc, 0x0120, 0x918c, 0x0700, 0x7004,
-	0x0023, 0x00fe, 0x00ee, 0x001e, 0x0005, 0x10fc, 0x11a4, 0x11d8,
-	0x0db4, 0x0db4, 0x1291, 0x0db4, 0x918c, 0x0700, 0x1550, 0x0136,
-	0x0146, 0x0156, 0x7014, 0x20e8, 0x7018, 0x20a0, 0x20e1, 0x0000,
-	0x2099, 0x0088, 0x782b, 0x0040, 0x7010, 0x20a8, 0x4005, 0x3400,
-	0x701a, 0x015e, 0x014e, 0x013e, 0x700c, 0x9005, 0x0578, 0x7800,
-	0x7802, 0x7804, 0x7806, 0x080c, 0x1141, 0x0005, 0x7008, 0x0096,
-	0x2048, 0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x080c, 0x10fc,
-	0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e, 0x0ca0,
-	0x918c, 0x0700, 0x1150, 0x700c, 0x9005, 0x0180, 0x7800, 0x7802,
-	0x7804, 0x7806, 0x080c, 0x1156, 0x0005, 0x7008, 0x0096, 0x2048,
-	0xa86f, 0x0200, 0x009e, 0x7007, 0x0000, 0x0080, 0x0096, 0x7008,
-	0x2048, 0x7800, 0xa88e, 0x7804, 0xa892, 0x7808, 0xa896, 0x780c,
-	0xa89a, 0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x0096, 0x00d6,
-	0x7008, 0x2048, 0x2001, 0x18af, 0x2004, 0x9906, 0x1128, 0xa89c,
-	0x080f, 0x00de, 0x009e, 0x00a0, 0x00de, 0x009e, 0x0096, 0x00d6,
-	0x7008, 0x2048, 0x0081, 0x0150, 0xa89c, 0x0086, 0x2940, 0x080f,
-	0x008e, 0x00de, 0x009e, 0x080c, 0x10eb, 0x0005, 0x00de, 0x009e,
-	0x080c, 0x10eb, 0x0005, 0xa8a8, 0xd08c, 0x0005, 0x0096, 0xa0a0,
-	0x904d, 0x090c, 0x0db4, 0xa06c, 0x908e, 0x0100, 0x0130, 0xa87b,
-	0x0030, 0xa883, 0x0000, 0xa897, 0x4002, 0x080c, 0x65e5, 0xa09f,
-	0x0000, 0xa0a3, 0x0000, 0x2848, 0x080c, 0x101e, 0x009e, 0x0005,
-	0x00a6, 0xa0a0, 0x904d, 0x090c, 0x0db4, 0xa06c, 0x908e, 0x0100,
-	0x0128, 0xa87b, 0x0001, 0xa883, 0x0000, 0x00c0, 0xa80c, 0x2050,
-	0xb004, 0x9005, 0x0198, 0xa80e, 0x2050, 0x8006, 0x8006, 0x8007,
-	0x908c, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0xa076, 0xa172,
-	0xb000, 0xa07a, 0x2810, 0x080c, 0x10cc, 0x00e8, 0xa97c, 0xa894,
-	0x0016, 0x0006, 0x080c, 0x65e5, 0x000e, 0x001e, 0xd1fc, 0x1138,
-	0xd1f4, 0x0128, 0x00c6, 0x2060, 0x080c, 0x9ac8, 0x00ce, 0x7008,
-	0x2048, 0xa89f, 0x0000, 0xa8a3, 0x0000, 0x080c, 0x101e, 0x7007,
-	0x0000, 0x080c, 0x10eb, 0x00ae, 0x0005, 0x0126, 0x2091, 0x8000,
-	0x782b, 0x1001, 0x7007, 0x0005, 0x7000, 0xc094, 0x7002, 0x012e,
-	0x0005, 0x7007, 0x0000, 0x080c, 0x10fc, 0x0005, 0x0126, 0x2091,
-	0x2200, 0x2079, 0x0300, 0x2071, 0x1a31, 0x7003, 0x0000, 0x78bf,
-	0x00f6, 0x00c1, 0x7803, 0x0003, 0x780f, 0x0000, 0x20a9, 0x0254,
-	0x2061, 0xd512, 0x2c0d, 0x7912, 0xe104, 0x9ce0, 0x0002, 0x7916,
-	0x1f04, 0x12aa, 0x7807, 0x0007, 0x7803, 0x0000, 0x7803, 0x0001,
-	0x012e, 0x0005, 0x00c6, 0x7803, 0x0000, 0x7808, 0xd09c, 0x0110,
-	0x7820, 0x0cd8, 0x2001, 0x1a32, 0x2003, 0x0000, 0x78ab, 0x0004,
-	0x78ac, 0xd0ac, 0x1de8, 0x78ab, 0x0002, 0x7807, 0x0007, 0x7827,
-	0x0030, 0x782b, 0x0400, 0x7827, 0x0031, 0x782b, 0x1a49, 0x781f,
-	0xff00, 0x781b, 0xff00, 0x2001, 0x0200, 0x2004, 0xd0dc, 0x0110,
-	0x781f, 0x0303, 0x2061, 0x1a49, 0x602f, 0x1cd0, 0x2001, 0x1819,
-	0x2004, 0x9082, 0x1cd0, 0x6032, 0x603b, 0x1dd6, 0x00ce, 0x0005,
-	0x0126, 0x2091, 0x2200, 0x7908, 0x9184, 0x0070, 0x190c, 0x0dad,
-	0xd19c, 0x0158, 0x7820, 0x908c, 0xf000, 0x15e8, 0x908a, 0x0024,
-	0x1a0c, 0x0db4, 0x0023, 0x012e, 0x0005, 0x012e, 0x0005, 0x132b,
-	0x132b, 0x1342, 0x1347, 0x134b, 0x1350, 0x1378, 0x137c, 0x138a,
-	0x138e, 0x132b, 0x1418, 0x141c, 0x147f, 0x132b, 0x132b, 0x132b,
-	0x132b, 0x132b, 0x132b, 0x132b, 0x132b, 0x132b, 0x132b, 0x132b,
-	0x132b, 0x132b, 0x1352, 0x132b, 0x132b, 0x132b, 0x132b, 0x132b,
-	0x132b, 0x132f, 0x132d, 0x080c, 0x0db4, 0x080c, 0x0dad, 0x080c,
-	0x1486, 0x2009, 0x1a48, 0x2104, 0x8000, 0x200a, 0x080c, 0x773e,
-	0x080c, 0x18a6, 0x0005, 0x2009, 0x0048, 0x2060, 0x080c, 0x9b42,
-	0x012e, 0x0005, 0x7004, 0xc085, 0xc0b5, 0x7006, 0x0005, 0x7004,
-	0xc085, 0x7006, 0x0005, 0x080c, 0x1486, 0x080c, 0x1543, 0x0005,
-	0x080c, 0x0db4, 0x080c, 0x1486, 0x2060, 0x6014, 0x0096, 0x2048,
-	0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c, 0x9b42, 0x2001,
-	0x015d, 0x2003, 0x0000, 0x2009, 0x03e8, 0x8109, 0x0160, 0x2001,
-	0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec,
-	0x1110, 0x080c, 0x148b, 0x2001, 0x0307, 0x2003, 0x8000, 0x0005,
-	0x7004, 0xc095, 0x7006, 0x0005, 0x080c, 0x1486, 0x2060, 0x6014,
-	0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c,
-	0x9b42, 0x0005, 0x080c, 0x1486, 0x080c, 0x0db4, 0x080c, 0x1486,
-	0x080c, 0x1403, 0x7827, 0x0018, 0x79ac, 0xd1dc, 0x0540, 0x7827,
-	0x0015, 0x7828, 0x782b, 0x0000, 0x9065, 0x0138, 0x2001, 0x020d,
-	0x2003, 0x0050, 0x2003, 0x0020, 0x0400, 0x7004, 0x9005, 0x1180,
-	0x78ab, 0x0004, 0x7827, 0x0018, 0x782b, 0x0000, 0xd1bc, 0x090c,
-	0x0db4, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0480,
-	0x78ab, 0x0004, 0x7803, 0x0001, 0x080c, 0x141c, 0x0005, 0x7828,
-	0x782b, 0x0000, 0x9065, 0x090c, 0x0db4, 0x6014, 0x2048, 0x78ab,
-	0x0004, 0x918c, 0x0700, 0x0198, 0x080c, 0x773e, 0x080c, 0x18a6,
-	0x080c, 0xb793, 0x0158, 0xa9ac, 0xa936, 0xa9b0, 0xa93a, 0xa83f,
-	0xffff, 0xa843, 0xffff, 0xa880, 0xc0bd, 0xa882, 0x0005, 0x6010,
-	0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x6024, 0x190c, 0xbb71,
-	0x2029, 0x00c8, 0x8529, 0x0128, 0x2001, 0x0201, 0x2004, 0x9005,
-	0x0dc8, 0x7dbc, 0x080c, 0xd4bb, 0xd5a4, 0x1118, 0x080c, 0x148b,
-	0x0005, 0x080c, 0x773e, 0x080c, 0x18a6, 0x0005, 0x781f, 0x0300,
-	0x7803, 0x0001, 0x0005, 0x0016, 0x0066, 0x0076, 0x00f6, 0x2079,
-	0x0300, 0x7908, 0x918c, 0x0007, 0x9186, 0x0003, 0x0120, 0x2001,
-	0x0016, 0x080c, 0x14fc, 0x00fe, 0x007e, 0x006e, 0x001e, 0x0005,
-	0x7004, 0xc09d, 0x7006, 0x0005, 0x7104, 0x9184, 0x0004, 0x190c,
-	0x0db4, 0xd184, 0x1189, 0xd19c, 0x0158, 0xc19c, 0x7106, 0x2001,
-	0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x080c, 0x148b, 0x0005,
-	0x81ff, 0x190c, 0x0db4, 0x0005, 0xc184, 0xd1b4, 0xc1b4, 0x7106,
-	0x0016, 0x00e6, 0x15e0, 0x2071, 0x0200, 0x080c, 0x1537, 0x6014,
-	0x9005, 0x05a8, 0x0096, 0x2048, 0xa864, 0x009e, 0x9084, 0x00ff,
-	0x908e, 0x0029, 0x0160, 0x908e, 0x0048, 0x1548, 0x601c, 0xd084,
-	0x11d8, 0x00f6, 0x2c78, 0x080c, 0x15ad, 0x00fe, 0x00a8, 0x00f6,
-	0x2c78, 0x080c, 0x16ea, 0x00fe, 0x2009, 0x01f4, 0x8109, 0x0160,
-	0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004,
-	0xd0ec, 0x1110, 0x0401, 0x0040, 0x2001, 0x020d, 0x2003, 0x0020,
-	0x080c, 0x12ba, 0x7803, 0x0001, 0x00ee, 0x001e, 0x0005, 0x2001,
-	0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0069, 0x0ca8, 0x0031,
-	0x2060, 0x2009, 0x0053, 0x080c, 0x9b42, 0x0005, 0x7808, 0xd09c,
-	0x0de8, 0x7820, 0x0005, 0x080c, 0x1403, 0x00d6, 0x2069, 0x0200,
-	0x2009, 0x01f4, 0x8109, 0x0510, 0x6804, 0x9005, 0x0dd8, 0x2001,
-	0x015d, 0x2003, 0x0000, 0x79bc, 0xd1a4, 0x1528, 0x79b8, 0x918c,
-	0x0fff, 0x0180, 0x9182, 0x0841, 0x1268, 0x9188, 0x0007, 0x918c,
-	0x0ff8, 0x810c, 0x810c, 0x810c, 0x080c, 0x14ee, 0x6827, 0x0001,
-	0x8109, 0x1dd0, 0x04d9, 0x6827, 0x0002, 0x04c1, 0x6804, 0x9005,
-	0x1130, 0x682c, 0xd0e4, 0x1500, 0x6804, 0x9005, 0x0de8, 0x79b8,
-	0xd1ec, 0x1130, 0x08c0, 0x080c, 0x773e, 0x080c, 0x18a6, 0x0090,
-	0x7827, 0x0015, 0x782b, 0x0000, 0x7827, 0x0018, 0x782b, 0x0000,
-	0x2001, 0x020d, 0x2003, 0x0020, 0x2001, 0x0307, 0x2003, 0x0300,
-	0x7803, 0x0001, 0x00de, 0x0005, 0x682c, 0x9084, 0x5400, 0x9086,
-	0x5400, 0x0d30, 0x7827, 0x0015, 0x782b, 0x0000, 0x7803, 0x0001,
-	0x6800, 0x9085, 0x1800, 0x6802, 0x00de, 0x0005, 0x6824, 0x9084,
-	0x0003, 0x1de0, 0x0005, 0x2001, 0x0030, 0x2c08, 0x621c, 0x0021,
-	0x7830, 0x9086, 0x0041, 0x0005, 0x00f6, 0x2079, 0x0300, 0x0006,
-	0x7808, 0xd09c, 0x0140, 0x0016, 0x0026, 0x00c6, 0x080c, 0x12f0,
-	0x00ce, 0x002e, 0x001e, 0x000e, 0x0006, 0x7832, 0x7936, 0x7a3a,
-	0x781b, 0x8080, 0x0059, 0x1118, 0x000e, 0x00fe, 0x0005, 0x000e,
-	0x792c, 0x3900, 0x8000, 0x2004, 0x080c, 0x0db4, 0x2009, 0xff00,
-	0x8109, 0x0120, 0x7818, 0xd0bc, 0x1dd8, 0x0005, 0x9085, 0x0001,
-	0x0005, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x0c79, 0x1108,
-	0x0005, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c, 0x0db4, 0x7037,
-	0x0001, 0x7150, 0x7037, 0x0002, 0x7050, 0x2060, 0xd1bc, 0x1110,
-	0x7054, 0x2060, 0x0005, 0x00e6, 0x0016, 0x2071, 0x0200, 0x0c79,
-	0x6124, 0xd1dc, 0x01f8, 0x701c, 0xd08c, 0x0904, 0x15a2, 0x7017,
-	0x0000, 0x2001, 0x0264, 0x2004, 0xd0bc, 0x0904, 0x15a2, 0x2001,
-	0x0268, 0x00c6, 0x2064, 0x6104, 0x6038, 0x00ce, 0x918e, 0x0039,
-	0x1904, 0x15a2, 0x9c06, 0x15f0, 0x0126, 0x2091, 0x2600, 0x080c,
-	0x7696, 0x012e, 0x7358, 0x745c, 0x6014, 0x905d, 0x0598, 0x2b48,
-	0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x190c, 0xbb4c,
-	0xab42, 0xac3e, 0x2001, 0x1875, 0x2004, 0xd0b4, 0x1170, 0x601c,
-	0xd0e4, 0x1158, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc,
-	0x1120, 0xa83b, 0x7fff, 0xa837, 0xffff, 0x080c, 0x1df6, 0x1190,
-	0x080c, 0x1739, 0x2a00, 0xa816, 0x0130, 0x2800, 0xa80e, 0x2c05,
-	0xa80a, 0x2c00, 0xa812, 0x7037, 0x0020, 0x781f, 0x0300, 0x001e,
-	0x00ee, 0x0005, 0x7037, 0x0050, 0x7037, 0x0020, 0x001e, 0x00ee,
-	0x080c, 0x148b, 0x0005, 0x080c, 0x0db4, 0x0016, 0x2009, 0x00a0,
-	0x8109, 0xa001, 0xa001, 0xa001, 0x1dd8, 0x001e, 0x2ff0, 0x0126,
-	0x2091, 0x2200, 0x3e60, 0x6014, 0x2048, 0x2940, 0x903e, 0x2730,
-	0xa864, 0x2068, 0xa81a, 0x9d84, 0x000f, 0x9088, 0x1dd6, 0x2165,
-	0x0002, 0x15e0, 0x162d, 0x15e0, 0x15e0, 0x15e0, 0x160f, 0x15e0,
-	0x15e4, 0x15d9, 0x1624, 0x15e0, 0x15e0, 0x15e0, 0x16e8, 0x15f8,
-	0x15ee, 0xa964, 0x918c, 0x00ff, 0x918e, 0x0048, 0x0904, 0x1624,
-	0x9085, 0x0001, 0x0804, 0x16e0, 0xa87c, 0xd0bc, 0x0dc8, 0xa890,
-	0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, 0x1634, 0xa87c, 0xd0bc,
-	0x0d78, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, 0x1683,
-	0xa87c, 0xd0bc, 0x0d28, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa804,
-	0x9045, 0x090c, 0x0db4, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80,
-	0x1dd6, 0x2065, 0xa888, 0xd19c, 0x1904, 0x1683, 0x0428, 0xa87c,
-	0xd0ac, 0x0970, 0xa804, 0x9045, 0x090c, 0x0db4, 0xa164, 0xa91a,
-	0x91ec, 0x000f, 0x9d80, 0x1dd6, 0x2065, 0x9006, 0xa842, 0xa83e,
-	0xd19c, 0x1904, 0x1683, 0x0080, 0xa87c, 0xd0ac, 0x0904, 0x15e0,
-	0x9006, 0xa842, 0xa83e, 0x0804, 0x1683, 0xa87c, 0xd0ac, 0x0904,
-	0x15e0, 0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0036, 0x1a0c,
-	0x0db4, 0x9082, 0x001b, 0x0002, 0x1657, 0x1657, 0x1659, 0x1657,
-	0x1657, 0x1657, 0x165f, 0x1657, 0x1657, 0x1657, 0x1665, 0x1657,
-	0x1657, 0x1657, 0x166b, 0x1657, 0x1657, 0x1657, 0x1671, 0x1657,
-	0x1657, 0x1657, 0x1677, 0x1657, 0x1657, 0x1657, 0x167d, 0x080c,
-	0x0db4, 0xa574, 0xa478, 0xa37c, 0xa280, 0x0804, 0x16c8, 0xa584,
-	0xa488, 0xa38c, 0xa290, 0x0804, 0x16c8, 0xa594, 0xa498, 0xa39c,
-	0xa2a0, 0x0804, 0x16c8, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804,
-	0x16c8, 0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x16c8, 0xa5c4,
-	0xa4c8, 0xa3cc, 0xa2d0, 0x0804, 0x16c8, 0xa5d4, 0xa4d8, 0xa3dc,
-	0xa2e0, 0x0804, 0x16c8, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4,
-	0x9082, 0x001b, 0x0002, 0x16a6, 0x16a4, 0x16a4, 0x16a4, 0x16a4,
-	0x16a4, 0x16ad, 0x16a4, 0x16a4, 0x16a4, 0x16a4, 0x16a4, 0x16b4,
-	0x16a4, 0x16a4, 0x16a4, 0x16a4, 0x16a4, 0x16bb, 0x16a4, 0x16a4,
-	0x16a4, 0x16a4, 0x16a4, 0x16c2, 0x080c, 0x0db4, 0xa56c, 0xa470,
-	0xa774, 0xa678, 0xa37c, 0xa280, 0x00d8, 0xa584, 0xa488, 0xa78c,
-	0xa690, 0xa394, 0xa298, 0x00a0, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8,
-	0xa3ac, 0xa2b0, 0x0068, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4,
-	0xa2c8, 0x0030, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0,
-	0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa988, 0x8c60,
-	0x2c1d, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x8109, 0xa916, 0x1150,
-	0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c, 0xc0dd, 0xa87e, 0x9006,
-	0x012e, 0x0005, 0x2800, 0xa80e, 0xab0a, 0x2c00, 0xa812, 0x0c80,
-	0x0804, 0x15e0, 0x2ff0, 0x0126, 0x2091, 0x2200, 0x3e60, 0x6014,
-	0x2048, 0x2940, 0xa80e, 0x2061, 0x1dd1, 0xa813, 0x1dd1, 0x2c05,
-	0xa80a, 0xa964, 0xa91a, 0xa87c, 0xd0ac, 0x090c, 0x0db4, 0x9006,
-	0xa842, 0xa83e, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4, 0xadcc,
-	0xacd0, 0xafd4, 0xaed8, 0xabdc, 0xaae0, 0xab2e, 0xaa32, 0xad1e,
-	0xac22, 0xaf26, 0xae2a, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0xa988,
-	0x918a, 0x0002, 0xa916, 0x1150, 0x3e60, 0x601c, 0xc085, 0x601e,
-	0xa87c, 0xc0dd, 0xa87e, 0x9006, 0x012e, 0x0005, 0xa804, 0x9045,
-	0x090c, 0x0db4, 0xa80e, 0xa064, 0xa81a, 0x9084, 0x000f, 0x9080,
-	0x1dd6, 0x2015, 0x82ff, 0x090c, 0x0db4, 0xaa12, 0x2205, 0xa80a,
-	0x0c18, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00, 0x0002,
-	0x182e, 0x1790, 0x1790, 0x182e, 0x182e, 0x1828, 0x182e, 0x1790,
-	0x182e, 0x17df, 0x17df, 0x182e, 0x182e, 0x182e, 0x1825, 0x17df,
-	0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20, 0xdd9c, 0x0904,
-	0x1830, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4, 0x9082, 0x001b,
-	0x0002, 0x177c, 0x177a, 0x177a, 0x177a, 0x177a, 0x177a, 0x1780,
-	0x177a, 0x177a, 0x177a, 0x177a, 0x177a, 0x1784, 0x177a, 0x177a,
-	0x177a, 0x177a, 0x177a, 0x1788, 0x177a, 0x177a, 0x177a, 0x177a,
-	0x177a, 0x178c, 0x080c, 0x0db4, 0xa774, 0xa678, 0x0804, 0x1830,
-	0xa78c, 0xa690, 0x0804, 0x1830, 0xa7a4, 0xa6a8, 0x0804, 0x1830,
-	0xa7bc, 0xa6c0, 0x0804, 0x1830, 0xa7d4, 0xa6d8, 0x0804, 0x1830,
+	0x8000, 0x0016, 0x890e, 0x810e, 0x810f, 0x9184, 0x003f, 0xa862,
+	0x9184, 0xffc0, 0xa85e, 0x001e, 0x0020, 0x00e6, 0x0126, 0x2091,
+	0x8000, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc,
+	0x8000, 0x70be, 0x080c, 0x7f35, 0x012e, 0x00ee, 0x0005, 0x2071,
+	0x1800, 0x9026, 0x2009, 0x0000, 0x2049, 0x0400, 0x2900, 0x702e,
+	0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420, 0x9886,
+	0x0440, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, 0x1883,
+	0x7000, 0x9005, 0x11a0, 0x2001, 0x0492, 0xa802, 0x2048, 0x2009,
+	0x2480, 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420,
+	0x9886, 0x0800, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071,
+	0x1883, 0x7104, 0x7200, 0x82ff, 0x01d0, 0x7308, 0x8318, 0x831f,
+	0x831b, 0x831b, 0x7312, 0x8319, 0x2001, 0x0800, 0xa802, 0x2048,
+	0x8900, 0xa802, 0x2040, 0xa95e, 0xaa62, 0x8420, 0x2300, 0x9906,
+	0x0130, 0x2848, 0x9188, 0x0040, 0x9291, 0x0000, 0x0c88, 0xa803,
+	0x0000, 0x2071, 0x1800, 0x74ba, 0x74be, 0x0005, 0x00e6, 0x0016,
+	0x9984, 0xfc00, 0x01e8, 0x908c, 0xf800, 0x1168, 0x9982, 0x0400,
+	0x02b8, 0x9982, 0x0440, 0x0278, 0x9982, 0x0492, 0x0288, 0x9982,
+	0x0800, 0x1270, 0x0040, 0x9982, 0x0800, 0x0250, 0x2071, 0x1883,
+	0x7010, 0x9902, 0x1228, 0x9085, 0x0001, 0x001e, 0x00ee, 0x0005,
+	0x9006, 0x0cd8, 0x00e6, 0x2071, 0x19e9, 0x7007, 0x0000, 0x9006,
+	0x701e, 0x7022, 0x7002, 0x2071, 0x0000, 0x7010, 0x9085, 0x8044,
+	0x7012, 0x2071, 0x0080, 0x9006, 0x20a9, 0x0040, 0x7022, 0x1f04,
+	0x10ce, 0x702b, 0x0020, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000,
+	0x00e6, 0xa06f, 0x0000, 0x2071, 0x19e9, 0x701c, 0x9088, 0x19f3,
+	0x280a, 0x8000, 0x9084, 0x003f, 0x701e, 0x7120, 0x9106, 0x090c,
+	0x0db4, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x00a9,
+	0x00fe, 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6,
+	0x2071, 0x19e9, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080,
+	0x0021, 0x00fe, 0x00ee, 0x012e, 0x0005, 0x7004, 0x9086, 0x0000,
+	0x1110, 0x7007, 0x0006, 0x7000, 0x0002, 0x1117, 0x1115, 0x1115,
+	0x1115, 0x128e, 0x128e, 0x128e, 0x128e, 0x080c, 0x0db4, 0x701c,
+	0x7120, 0x9106, 0x1148, 0x792c, 0x9184, 0x0001, 0x1120, 0xd1fc,
+	0x1110, 0x7007, 0x0000, 0x0005, 0x0096, 0x9180, 0x19f3, 0x2004,
+	0x700a, 0x2048, 0x8108, 0x918c, 0x003f, 0x7122, 0x782b, 0x0026,
+	0xa88c, 0x7802, 0xa890, 0x7806, 0xa894, 0x780a, 0xa898, 0x780e,
+	0xa878, 0x700e, 0xa870, 0x7016, 0xa874, 0x701a, 0xa868, 0x009e,
+	0xd084, 0x0120, 0x7007, 0x0001, 0x0029, 0x0005, 0x7007, 0x0002,
+	0x00b1, 0x0005, 0x0016, 0x0026, 0x710c, 0x2011, 0x0040, 0x9182,
+	0x0040, 0x1210, 0x2110, 0x9006, 0x700e, 0x7212, 0x8203, 0x7812,
+	0x782b, 0x0020, 0x782b, 0x0041, 0x002e, 0x001e, 0x0005, 0x0016,
+	0x0026, 0x0136, 0x0146, 0x0156, 0x7014, 0x20e0, 0x7018, 0x2098,
+	0x20e9, 0x0000, 0x20a1, 0x0088, 0x782b, 0x0026, 0x710c, 0x2011,
+	0x0040, 0x9182, 0x0040, 0x1210, 0x2110, 0x9006, 0x700e, 0x22a8,
+	0x4006, 0x8203, 0x7812, 0x782b, 0x0020, 0x3300, 0x701a, 0x782b,
+	0x0001, 0x015e, 0x014e, 0x013e, 0x002e, 0x001e, 0x0005, 0x2009,
+	0x19e9, 0x2104, 0xc095, 0x200a, 0x080c, 0x10f4, 0x0005, 0x0016,
+	0x00e6, 0x2071, 0x19e9, 0x00f6, 0x2079, 0x0080, 0x792c, 0xd1bc,
+	0x190c, 0x0dad, 0x782b, 0x0002, 0xd1fc, 0x0120, 0x918c, 0x0700,
+	0x7004, 0x0023, 0x00fe, 0x00ee, 0x001e, 0x0005, 0x1105, 0x11ad,
+	0x11e1, 0x0db4, 0x0db4, 0x129a, 0x0db4, 0x918c, 0x0700, 0x1550,
+	0x0136, 0x0146, 0x0156, 0x7014, 0x20e8, 0x7018, 0x20a0, 0x20e1,
+	0x0000, 0x2099, 0x0088, 0x782b, 0x0040, 0x7010, 0x20a8, 0x4005,
+	0x3400, 0x701a, 0x015e, 0x014e, 0x013e, 0x700c, 0x9005, 0x0578,
+	0x7800, 0x7802, 0x7804, 0x7806, 0x080c, 0x114a, 0x0005, 0x7008,
+	0x0096, 0x2048, 0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x080c,
+	0x1105, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e,
+	0x0ca0, 0x918c, 0x0700, 0x1150, 0x700c, 0x9005, 0x0180, 0x7800,
+	0x7802, 0x7804, 0x7806, 0x080c, 0x115f, 0x0005, 0x7008, 0x0096,
+	0x2048, 0xa86f, 0x0200, 0x009e, 0x7007, 0x0000, 0x0080, 0x0096,
+	0x7008, 0x2048, 0x7800, 0xa88e, 0x7804, 0xa892, 0x7808, 0xa896,
+	0x780c, 0xa89a, 0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x0096,
+	0x00d6, 0x7008, 0x2048, 0x2001, 0x18af, 0x2004, 0x9906, 0x1128,
+	0xa89c, 0x080f, 0x00de, 0x009e, 0x00a0, 0x00de, 0x009e, 0x0096,
+	0x00d6, 0x7008, 0x2048, 0x0081, 0x0150, 0xa89c, 0x0086, 0x2940,
+	0x080f, 0x008e, 0x00de, 0x009e, 0x080c, 0x10f4, 0x0005, 0x00de,
+	0x009e, 0x080c, 0x10f4, 0x0005, 0xa8a8, 0xd08c, 0x0005, 0x0096,
+	0xa0a0, 0x904d, 0x090c, 0x0db4, 0xa06c, 0x908e, 0x0100, 0x0130,
+	0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4002, 0x080c, 0x6878,
+	0xa09f, 0x0000, 0xa0a3, 0x0000, 0x2848, 0x080c, 0x101d, 0x009e,
+	0x0005, 0x00a6, 0xa0a0, 0x904d, 0x090c, 0x0db4, 0xa06c, 0x908e,
+	0x0100, 0x0128, 0xa87b, 0x0001, 0xa883, 0x0000, 0x00c0, 0xa80c,
+	0x2050, 0xb004, 0x9005, 0x0198, 0xa80e, 0x2050, 0x8006, 0x8006,
+	0x8007, 0x908c, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0xa076,
+	0xa172, 0xb000, 0xa07a, 0x2810, 0x080c, 0x10d5, 0x00e8, 0xa97c,
+	0xa894, 0x0016, 0x0006, 0x080c, 0x6878, 0x000e, 0x001e, 0xd1fc,
+	0x1138, 0xd1f4, 0x0128, 0x00c6, 0x2060, 0x080c, 0x9e19, 0x00ce,
+	0x7008, 0x2048, 0xa89f, 0x0000, 0xa8a3, 0x0000, 0x080c, 0x101d,
+	0x7007, 0x0000, 0x080c, 0x10f4, 0x00ae, 0x0005, 0x0126, 0x2091,
+	0x8000, 0x782b, 0x1001, 0x7007, 0x0005, 0x7000, 0xc094, 0x7002,
+	0x012e, 0x0005, 0x7007, 0x0000, 0x080c, 0x1105, 0x0005, 0x0126,
+	0x2091, 0x2200, 0x2079, 0x0300, 0x2071, 0x1a33, 0x7003, 0x0000,
+	0x78bf, 0x00f6, 0x781b, 0x4800, 0x00c1, 0x7803, 0x0003, 0x780f,
+	0x0000, 0x20a9, 0x0254, 0x2061, 0xd8c3, 0x2c0d, 0x7912, 0xe104,
+	0x9ce0, 0x0002, 0x7916, 0x1f04, 0x12b5, 0x7807, 0x0007, 0x7803,
+	0x0000, 0x7803, 0x0001, 0x012e, 0x0005, 0x00c6, 0x7803, 0x0000,
+	0x7808, 0xd09c, 0x0110, 0x7820, 0x0cd8, 0x2001, 0x1a34, 0x2003,
+	0x0000, 0x78ab, 0x0004, 0x78ac, 0xd0ac, 0x1de8, 0x78ab, 0x0002,
+	0x7807, 0x0007, 0x7827, 0x0030, 0x782b, 0x0400, 0x7827, 0x0031,
+	0x782b, 0x1a52, 0x781f, 0xff00, 0x781b, 0xb700, 0x2001, 0x0200,
+	0x2004, 0xd0dc, 0x0110, 0x781f, 0x0303, 0x2061, 0x1a52, 0x602f,
+	0x1cd0, 0x2001, 0x1819, 0x2004, 0x9082, 0x1cd0, 0x6032, 0x603b,
+	0x1f26, 0x2001, 0x3131, 0xd0fc, 0x190c, 0x0db4, 0x2001, 0x0003,
+	0x2004, 0xd0d4, 0x1118, 0x783f, 0x3131, 0x0020, 0x9084, 0xc000,
+	0x783f, 0xb131, 0x00ce, 0x0005, 0x0126, 0x2091, 0x2200, 0x7908,
+	0x9184, 0x0070, 0x190c, 0x0dad, 0xd19c, 0x0158, 0x7820, 0x908c,
+	0xf000, 0x15e8, 0x908a, 0x0024, 0x1a0c, 0x0db4, 0x0023, 0x012e,
+	0x0005, 0x012e, 0x0005, 0x1347, 0x1347, 0x135e, 0x1363, 0x1367,
+	0x136c, 0x1394, 0x1398, 0x13a6, 0x13aa, 0x1347, 0x1434, 0x1438,
+	0x149b, 0x1347, 0x1347, 0x1347, 0x1347, 0x1347, 0x1347, 0x1347,
+	0x1347, 0x1347, 0x1347, 0x1347, 0x1347, 0x1347, 0x136e, 0x1347,
+	0x1347, 0x1347, 0x1347, 0x1347, 0x1347, 0x134b, 0x1349, 0x080c,
+	0x0db4, 0x080c, 0x0dad, 0x080c, 0x14a2, 0x2009, 0x1a4b, 0x2104,
+	0x8000, 0x200a, 0x080c, 0x79fc, 0x080c, 0x1958, 0x0005, 0x2009,
+	0x0048, 0x2060, 0x080c, 0x9e93, 0x012e, 0x0005, 0x7004, 0xc085,
+	0xc0b5, 0x7006, 0x0005, 0x7004, 0xc085, 0x7006, 0x0005, 0x080c,
+	0x14a2, 0x080c, 0x15de, 0x0005, 0x080c, 0x0db4, 0x080c, 0x14a2,
+	0x2060, 0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009,
+	0x0048, 0x080c, 0x9e93, 0x2001, 0x015d, 0x2003, 0x0000, 0x2009,
+	0x03e8, 0x8109, 0x0160, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8,
+	0x2001, 0x0218, 0x2004, 0xd0ec, 0x1110, 0x080c, 0x14a7, 0x2001,
+	0x0307, 0x2003, 0x8000, 0x0005, 0x7004, 0xc095, 0x7006, 0x0005,
+	0x080c, 0x14a2, 0x2060, 0x6014, 0x0096, 0x2048, 0xa83b, 0xffff,
+	0x009e, 0x2009, 0x0048, 0x080c, 0x9e93, 0x0005, 0x080c, 0x14a2,
+	0x080c, 0x0db4, 0x080c, 0x14a2, 0x080c, 0x141f, 0x7827, 0x0018,
+	0x79ac, 0xd1dc, 0x0540, 0x7827, 0x0015, 0x7828, 0x782b, 0x0000,
+	0x9065, 0x0138, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020,
+	0x0400, 0x7004, 0x9005, 0x1180, 0x78ab, 0x0004, 0x7827, 0x0018,
+	0x782b, 0x0000, 0xd1bc, 0x090c, 0x0db4, 0x2001, 0x020d, 0x2003,
+	0x0050, 0x2003, 0x0020, 0x0480, 0x78ab, 0x0004, 0x7803, 0x0001,
+	0x080c, 0x1438, 0x0005, 0x7828, 0x782b, 0x0000, 0x9065, 0x090c,
+	0x0db4, 0x6014, 0x2048, 0x78ab, 0x0004, 0x918c, 0x0700, 0x0198,
+	0x080c, 0x79fc, 0x080c, 0x1958, 0x080c, 0xbafe, 0x0158, 0xa9ac,
+	0xa936, 0xa9b0, 0xa93a, 0xa83f, 0xffff, 0xa843, 0xffff, 0xa880,
+	0xc0bd, 0xa882, 0x0005, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be,
+	0xd0bc, 0x6024, 0x190c, 0xbee3, 0x2029, 0x00c8, 0x8529, 0x0128,
+	0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x7dbc, 0x080c, 0xd86c,
+	0xd5a4, 0x1118, 0x080c, 0x14a7, 0x0005, 0x080c, 0x79fc, 0x080c,
+	0x1958, 0x0005, 0x781f, 0x0300, 0x7803, 0x0001, 0x0005, 0x0016,
+	0x0066, 0x0076, 0x00f6, 0x2079, 0x0300, 0x7908, 0x918c, 0x0007,
+	0x9186, 0x0003, 0x0120, 0x2001, 0x0016, 0x080c, 0x1518, 0x00fe,
+	0x007e, 0x006e, 0x001e, 0x0005, 0x7004, 0xc09d, 0x7006, 0x0005,
+	0x7104, 0x9184, 0x0004, 0x190c, 0x0db4, 0xd184, 0x1189, 0xd19c,
+	0x0158, 0xc19c, 0x7106, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003,
+	0x0020, 0x080c, 0x14a7, 0x0005, 0x81ff, 0x190c, 0x0db4, 0x0005,
+	0xc184, 0xd1b4, 0xc1b4, 0x7106, 0x0016, 0x00e6, 0x15e0, 0x2071,
+	0x0200, 0x080c, 0x15d2, 0x6014, 0x9005, 0x05a8, 0x0096, 0x2048,
+	0xa864, 0x009e, 0x9084, 0x00ff, 0x908e, 0x0029, 0x0160, 0x908e,
+	0x0048, 0x1548, 0x601c, 0xd084, 0x11d8, 0x00f6, 0x2c78, 0x080c,
+	0x1648, 0x00fe, 0x00a8, 0x00f6, 0x2c78, 0x080c, 0x1790, 0x00fe,
+	0x2009, 0x01f4, 0x8109, 0x0160, 0x2001, 0x0201, 0x2004, 0x9005,
+	0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec, 0x1110, 0x0401, 0x0040,
+	0x2001, 0x020d, 0x2003, 0x0020, 0x080c, 0x12c5, 0x7803, 0x0001,
+	0x00ee, 0x001e, 0x0005, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003,
+	0x0020, 0x0069, 0x0ca8, 0x0031, 0x2060, 0x2009, 0x0053, 0x080c,
+	0x9e93, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x0005, 0x080c,
+	0x141f, 0x00d6, 0x2069, 0x0200, 0x2009, 0x01f4, 0x8109, 0x0510,
+	0x6804, 0x9005, 0x0dd8, 0x2001, 0x015d, 0x2003, 0x0000, 0x79bc,
+	0xd1a4, 0x1528, 0x79b8, 0x918c, 0x0fff, 0x0180, 0x9182, 0x0841,
+	0x1268, 0x9188, 0x0007, 0x918c, 0x0ff8, 0x810c, 0x810c, 0x810c,
+	0x080c, 0x150a, 0x6827, 0x0001, 0x8109, 0x1dd0, 0x04d9, 0x6827,
+	0x0002, 0x04c1, 0x6804, 0x9005, 0x1130, 0x682c, 0xd0e4, 0x1500,
+	0x6804, 0x9005, 0x0de8, 0x79b8, 0xd1ec, 0x1130, 0x08c0, 0x080c,
+	0x79fc, 0x080c, 0x1958, 0x0090, 0x7827, 0x0015, 0x782b, 0x0000,
+	0x7827, 0x0018, 0x782b, 0x0000, 0x2001, 0x020d, 0x2003, 0x0020,
+	0x2001, 0x0307, 0x2003, 0x0300, 0x7803, 0x0001, 0x00de, 0x0005,
+	0x682c, 0x9084, 0x5400, 0x9086, 0x5400, 0x0d30, 0x7827, 0x0015,
+	0x782b, 0x0000, 0x7803, 0x0001, 0x6800, 0x9085, 0x1800, 0x6802,
+	0x00de, 0x0005, 0x6824, 0x9084, 0x0003, 0x1de0, 0x0005, 0x2001,
+	0x0030, 0x2c08, 0x621c, 0x0021, 0x7830, 0x9086, 0x0041, 0x0005,
+	0x00f6, 0x2079, 0x0300, 0x0006, 0x7808, 0xd09c, 0x0140, 0x0016,
+	0x0026, 0x00c6, 0x080c, 0x130c, 0x00ce, 0x002e, 0x001e, 0x000e,
+	0x0006, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x0059, 0x1118,
+	0x000e, 0x00fe, 0x0005, 0x000e, 0x792c, 0x3900, 0x8000, 0x2004,
+	0x080c, 0x0db4, 0x2009, 0x180c, 0x2104, 0xc0f4, 0x200a, 0x2009,
+	0xff00, 0x8109, 0x0904, 0x1596, 0x7a18, 0x9284, 0x0030, 0x0904,
+	0x1591, 0x9284, 0x0048, 0x9086, 0x0008, 0x1904, 0x1591, 0x2001,
+	0x0109, 0x2004, 0xd08c, 0x01f0, 0x0006, 0x01c6, 0x01d6, 0x0136,
+	0x0146, 0x0156, 0x0126, 0x2091, 0x2800, 0x00f6, 0x0026, 0x0016,
+	0x2009, 0x1a4d, 0x2104, 0x8000, 0x0208, 0x200a, 0x080c, 0x8382,
+	0x001e, 0x002e, 0x00fe, 0x012e, 0x015e, 0x014e, 0x013e, 0x01de,
+	0x01ce, 0x000e, 0x2001, 0x009b, 0x2004, 0xd0fc, 0x01d0, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x00f6, 0x0016,
+	0x2009, 0x1a4e, 0x2104, 0x8000, 0x0208, 0x200a, 0x080c, 0x1d4a,
+	0x001e, 0x00fe, 0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e,
+	0x000e, 0x7818, 0xd0bc, 0x1904, 0x1541, 0x0005, 0x2001, 0x180c,
+	0x2004, 0xd0f4, 0x1528, 0x7a18, 0x9284, 0x0030, 0x0508, 0x9284,
+	0x0048, 0x9086, 0x0008, 0x11e0, 0x2001, 0x19c7, 0x2004, 0x9005,
+	0x01b8, 0x2001, 0x1a36, 0x2004, 0x9086, 0x0000, 0x0188, 0x2009,
+	0x1a4c, 0x2104, 0x8000, 0x0208, 0x200a, 0x080c, 0x9417, 0x2009,
+	0x180c, 0x2104, 0xc0f5, 0x200a, 0x2009, 0xff00, 0x0804, 0x1541,
+	0x9085, 0x0001, 0x0005, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080,
+	0x080c, 0x153a, 0x1108, 0x0005, 0x792c, 0x3900, 0x8000, 0x2004,
+	0x080c, 0x0db4, 0x7037, 0x0001, 0x7150, 0x7037, 0x0002, 0x7050,
+	0x2060, 0xd1bc, 0x1110, 0x7054, 0x2060, 0x0005, 0x00e6, 0x0016,
+	0x2071, 0x0200, 0x0c79, 0x6124, 0xd1dc, 0x01f8, 0x701c, 0xd08c,
+	0x0904, 0x163d, 0x7017, 0x0000, 0x2001, 0x0264, 0x2004, 0xd0bc,
+	0x0904, 0x163d, 0x2001, 0x0268, 0x00c6, 0x2064, 0x6104, 0x6038,
+	0x00ce, 0x918e, 0x0039, 0x1904, 0x163d, 0x9c06, 0x15f0, 0x0126,
+	0x2091, 0x2600, 0x080c, 0x7943, 0x012e, 0x7358, 0x745c, 0x6014,
+	0x905d, 0x0598, 0x2b48, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be,
+	0xd0bc, 0x190c, 0xbebe, 0xab42, 0xac3e, 0x2001, 0x1875, 0x2004,
+	0xd0b4, 0x1170, 0x601c, 0xd0e4, 0x1158, 0x6010, 0x00b6, 0x2058,
+	0xb800, 0x00be, 0xd0bc, 0x1120, 0xa83b, 0x7fff, 0xa837, 0xffff,
+	0x080c, 0x1f46, 0x1190, 0x080c, 0x17eb, 0x2a00, 0xa816, 0x0130,
+	0x2800, 0xa80e, 0x2c05, 0xa80a, 0x2c00, 0xa812, 0x7037, 0x0020,
+	0x781f, 0x0300, 0x001e, 0x00ee, 0x0005, 0x7037, 0x0050, 0x7037,
+	0x0020, 0x001e, 0x00ee, 0x080c, 0x14a7, 0x0005, 0x080c, 0x0db4,
+	0x0016, 0x2009, 0x00a0, 0x8109, 0xa001, 0xa001, 0xa001, 0x1dd8,
+	0x001e, 0x2ff0, 0x0126, 0x2091, 0x2200, 0x00c6, 0x3e60, 0x6014,
+	0x2048, 0x2940, 0x903e, 0x2730, 0xa864, 0x2068, 0xa81a, 0x9d84,
+	0x000f, 0x9088, 0x1f26, 0x2165, 0x0002, 0x167c, 0x16c9, 0x167c,
+	0x167c, 0x167c, 0x16ab, 0x167c, 0x1680, 0x1675, 0x16c0, 0x167c,
+	0x167c, 0x167c, 0x1785, 0x1694, 0x168a, 0xa964, 0x918c, 0x00ff,
+	0x918e, 0x0048, 0x0904, 0x16c0, 0x9085, 0x0001, 0x0804, 0x177c,
+	0xa87c, 0xd0bc, 0x0dc8, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888,
+	0x0804, 0x16d0, 0xa87c, 0xd0bc, 0x0d78, 0xa890, 0xa842, 0xa88c,
+	0xa83e, 0xa888, 0x0804, 0x171f, 0xa87c, 0xd0bc, 0x0d28, 0xa890,
+	0xa842, 0xa88c, 0xa83e, 0xa804, 0x9045, 0x090c, 0x0db4, 0xa164,
+	0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1f26, 0x2065, 0xa888, 0xd19c,
+	0x1904, 0x171f, 0x0428, 0xa87c, 0xd0ac, 0x0970, 0xa804, 0x9045,
+	0x090c, 0x0db4, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1f26,
+	0x2065, 0x9006, 0xa842, 0xa83e, 0xd19c, 0x1904, 0x171f, 0x0080,
+	0xa87c, 0xd0ac, 0x0904, 0x167c, 0x9006, 0xa842, 0xa83e, 0x0804,
+	0x171f, 0xa87c, 0xd0ac, 0x0904, 0x167c, 0x9006, 0xa842, 0xa83e,
 	0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0db4, 0x9082, 0x001b, 0x0002,
-	0x17b3, 0x17b3, 0x17b5, 0x17b3, 0x17b3, 0x17b3, 0x17bb, 0x17b3,
-	0x17b3, 0x17b3, 0x17c1, 0x17b3, 0x17b3, 0x17b3, 0x17c7, 0x17b3,
-	0x17b3, 0x17b3, 0x17cd, 0x17b3, 0x17b3, 0x17b3, 0x17d3, 0x17b3,
-	0x17b3, 0x17b3, 0x17d9, 0x080c, 0x0db4, 0xa574, 0xa478, 0xa37c,
-	0xa280, 0x0804, 0x1830, 0xa584, 0xa488, 0xa38c, 0xa290, 0x0804,
-	0x1830, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x1830, 0xa5a4,
-	0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x1830, 0xa5b4, 0xa4b8, 0xa3bc,
-	0xa2c0, 0x0804, 0x1830, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804,
-	0x1830, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x1830, 0x2c05,
-	0x908a, 0x0034, 0x1a0c, 0x0db4, 0x9082, 0x001b, 0x0002, 0x1802,
-	0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1809, 0x1800, 0x1800,
-	0x1800, 0x1800, 0x1800, 0x1810, 0x1800, 0x1800, 0x1800, 0x1800,
-	0x1800, 0x1817, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x181e,
+	0x16f3, 0x16f3, 0x16f5, 0x16f3, 0x16f3, 0x16f3, 0x16fb, 0x16f3,
+	0x16f3, 0x16f3, 0x1701, 0x16f3, 0x16f3, 0x16f3, 0x1707, 0x16f3,
+	0x16f3, 0x16f3, 0x170d, 0x16f3, 0x16f3, 0x16f3, 0x1713, 0x16f3,
+	0x16f3, 0x16f3, 0x1719, 0x080c, 0x0db4, 0xa574, 0xa478, 0xa37c,
+	0xa280, 0x0804, 0x1764, 0xa584, 0xa488, 0xa38c, 0xa290, 0x0804,
+	0x1764, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x1764, 0xa5a4,
+	0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x1764, 0xa5b4, 0xa4b8, 0xa3bc,
+	0xa2c0, 0x0804, 0x1764, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804,
+	0x1764, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x1764, 0x2c05,
+	0x908a, 0x0034, 0x1a0c, 0x0db4, 0x9082, 0x001b, 0x0002, 0x1742,
+	0x1740, 0x1740, 0x1740, 0x1740, 0x1740, 0x1749, 0x1740, 0x1740,
+	0x1740, 0x1740, 0x1740, 0x1750, 0x1740, 0x1740, 0x1740, 0x1740,
+	0x1740, 0x1757, 0x1740, 0x1740, 0x1740, 0x1740, 0x1740, 0x175e,
 	0x080c, 0x0db4, 0xa56c, 0xa470, 0xa774, 0xa678, 0xa37c, 0xa280,
-	0x0438, 0xa584, 0xa488, 0xa78c, 0xa690, 0xa394, 0xa298, 0x0400,
-	0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, 0xa2b0, 0x00c8, 0xa5b4,
-	0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8, 0x0090, 0xa5cc, 0xa4d0,
-	0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, 0x0058, 0x9d86, 0x000e, 0x1130,
-	0x080c, 0x1d94, 0x1904, 0x1739, 0x900e, 0x0050, 0x080c, 0x0db4,
-	0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0x080c, 0x1d94,
-	0x0005, 0x6014, 0x2048, 0x6118, 0x810c, 0x810c, 0x810c, 0x81ff,
-	0x1118, 0xa887, 0x0001, 0x0008, 0xa986, 0x601b, 0x0002, 0xa974,
-	0xd1dc, 0x1108, 0x0005, 0xa934, 0xa88c, 0x9106, 0x1158, 0xa938,
-	0xa890, 0x9106, 0x1138, 0x601c, 0xc084, 0x601e, 0x2009, 0x0048,
-	0x0804, 0x9b42, 0x0005, 0x0126, 0x00c6, 0x2091, 0x2200, 0x00ce,
-	0x7908, 0x918c, 0x0007, 0x9186, 0x0000, 0x05b0, 0x9186, 0x0003,
-	0x0598, 0x6020, 0x6023, 0x0000, 0x0006, 0x2031, 0x0008, 0x00c6,
-	0x781f, 0x0808, 0x7808, 0xd09c, 0x0120, 0x080c, 0x12f0, 0x8631,
-	0x1db8, 0x00ce, 0x781f, 0x0800, 0x2031, 0x0168, 0x00c6, 0x7808,
-	0xd09c, 0x190c, 0x12f0, 0x00ce, 0x2001, 0x0038, 0x080c, 0x1933,
-	0x7930, 0x9186, 0x0040, 0x0160, 0x9186, 0x0042, 0x190c, 0x0db4,
-	0x2001, 0x001e, 0x8001, 0x1df0, 0x8631, 0x1d40, 0x080c, 0x1942,
-	0x000e, 0x6022, 0x012e, 0x0005, 0x080c, 0x192f, 0x7827, 0x0015,
-	0x7828, 0x9c06, 0x1db8, 0x782b, 0x0000, 0x0ca0, 0x00f6, 0x2079,
-	0x0300, 0x7803, 0x0000, 0x78ab, 0x0004, 0x00fe, 0x080c, 0x6d14,
-	0x11b0, 0x2001, 0x0138, 0x2003, 0x0000, 0x2001, 0x0160, 0x2003,
-	0x0000, 0x2011, 0x012c, 0xa001, 0xa001, 0x8211, 0x1de0, 0x0081,
-	0x0066, 0x2031, 0x0000, 0x080c, 0x6dc4, 0x006e, 0x0005, 0x0479,
-	0x0039, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0005,
-	0x00e6, 0x2071, 0x0200, 0x080c, 0x2911, 0x2009, 0x003c, 0x080c,
-	0x2110, 0x2001, 0x015d, 0x2003, 0x0000, 0x7000, 0x9084, 0x003c,
-	0x1de0, 0x080c, 0x7c7b, 0x70a0, 0x70a2, 0x7098, 0x709a, 0x709c,
-	0x709e, 0x2001, 0x020d, 0x2003, 0x0020, 0x00f6, 0x2079, 0x0300,
-	0x080c, 0x12ba, 0x7803, 0x0001, 0x00fe, 0x00ee, 0x0005, 0x2001,
-	0x0138, 0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, 0x2003,
-	0x0000, 0x080c, 0x6d14, 0x1108, 0x0005, 0x2021, 0x0260, 0x2001,
-	0x0141, 0x201c, 0xd3dc, 0x1168, 0x2001, 0x0109, 0x201c, 0x939c,
-	0x0048, 0x1160, 0x2001, 0x0111, 0x201c, 0x83ff, 0x1110, 0x8421,
-	0x1d70, 0x2001, 0x015d, 0x2003, 0x0000, 0x0005, 0x0046, 0x2021,
-	0x0019, 0x2003, 0x0048, 0xa001, 0xa001, 0x201c, 0x939c, 0x0048,
-	0x0120, 0x8421, 0x1db0, 0x004e, 0x0c60, 0x004e, 0x0c40, 0x601c,
-	0xc084, 0x601e, 0x0005, 0x2c08, 0x621c, 0x080c, 0x14fc, 0x7930,
-	0x0005, 0x2c08, 0x621c, 0x080c, 0x1529, 0x7930, 0x0005, 0x8001,
-	0x1df0, 0x0005, 0x2031, 0x0005, 0x781c, 0x9084, 0x0007, 0x0170,
-	0x2001, 0x0038, 0x0c41, 0x9186, 0x0040, 0x0904, 0x19a0, 0x2001,
-	0x001e, 0x0c69, 0x8631, 0x1d80, 0x080c, 0x0db4, 0x781f, 0x0202,
-	0x2001, 0x015d, 0x2003, 0x0000, 0x2001, 0x0b10, 0x0c01, 0x781c,
-	0xd084, 0x0110, 0x0861, 0x04e0, 0x2001, 0x0030, 0x0891, 0x9186,
-	0x0040, 0x0568, 0x781c, 0xd084, 0x1da8, 0x781f, 0x0101, 0x2001,
-	0x0014, 0x0869, 0x2001, 0x0037, 0x0821, 0x9186, 0x0040, 0x0140,
-	0x2001, 0x0030, 0x080c, 0x1939, 0x9186, 0x0040, 0x190c, 0x0db4,
-	0x00d6, 0x2069, 0x0200, 0x692c, 0xd1f4, 0x1170, 0xd1c4, 0x0160,
-	0xd19c, 0x0130, 0x6800, 0x9085, 0x1800, 0x6802, 0x00de, 0x0080,
-	0x6908, 0x9184, 0x0007, 0x1db0, 0x00de, 0x781f, 0x0100, 0x791c,
-	0x9184, 0x0007, 0x090c, 0x0db4, 0xa001, 0xa001, 0x781f, 0x0200,
-	0x0005, 0x0126, 0x2091, 0x2400, 0x2071, 0x1a34, 0x2079, 0x0090,
-	0x012e, 0x0005, 0x9280, 0x0005, 0x2004, 0x2048, 0xa97c, 0xd1dc,
-	0x1904, 0x1a25, 0xa964, 0x9184, 0x0007, 0x0002, 0x19be, 0x1a10,
-	0x19c5, 0x19c5, 0x19c5, 0x19f8, 0x19d8, 0x19c7, 0x2100, 0x9084,
-	0x00ff, 0x9086, 0x0048, 0x0904, 0x1a10, 0x080c, 0x0db4, 0xa87c,
-	0xd0b4, 0x0904, 0x1bd7, 0xa890, 0xa842, 0xa83a, 0xa88c, 0xa83e,
-	0xa836, 0xa8ac, 0xa846, 0xa8b0, 0xa84a, 0xa988, 0x0804, 0x1a18,
-	0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x1d38, 0xa87c, 0xd0b4,
-	0x0904, 0x1bd7, 0xa890, 0xa842, 0xa83a, 0xa88c, 0xa83e, 0xa836,
-	0xa8ac, 0xa846, 0xa8b0, 0xa84a, 0xa804, 0xa85a, 0x2040, 0xa064,
-	0x9084, 0x000f, 0x9080, 0x1dd6, 0x2005, 0xa812, 0xa988, 0x0448,
-	0x918c, 0x00ff, 0x9186, 0x0015, 0x1540, 0xa87c, 0xd0b4, 0x0904,
-	0x1bd7, 0xa804, 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080,
-	0x1dd6, 0x2005, 0xa812, 0xa988, 0x9006, 0xa842, 0xa83e, 0x0088,
-	0xa87c, 0xd0b4, 0x0904, 0x1bd7, 0xa988, 0x9006, 0xa842, 0xa83e,
-	0x2900, 0xa85a, 0xa864, 0x9084, 0x000f, 0x9080, 0x1dd6, 0x2005,
-	0xa812, 0xa916, 0xa87c, 0xc0dd, 0xa87e, 0x0005, 0x00f6, 0x2079,
-	0x0090, 0x782c, 0xd0fc, 0x190c, 0x1c18, 0x00e6, 0x2071, 0x1a34,
-	0x7000, 0x9005, 0x1904, 0x1a7f, 0x7206, 0x9280, 0x0005, 0x204c,
-	0x9280, 0x0004, 0x2004, 0x782b, 0x0004, 0x00f6, 0x2079, 0x0200,
-	0x7803, 0x0040, 0x00fe, 0x00b6, 0x2058, 0xb86c, 0x7836, 0xb890,
-	0x00be, 0x00f6, 0x2079, 0x0200, 0x7803, 0x0040, 0xa001, 0xa001,
-	0xa001, 0xa001, 0xa001, 0xa001, 0x781a, 0x2079, 0x0100, 0x8004,
-	0x78d6, 0x00fe, 0xa814, 0x2050, 0xa858, 0x2040, 0xa810, 0x2060,
-	0xa064, 0x90ec, 0x000f, 0xa944, 0x791a, 0x7116, 0xa848, 0x781e,
-	0x701a, 0x9006, 0x700e, 0x7012, 0x7004, 0xa940, 0xa838, 0x9106,
-	0x1188, 0xa93c, 0xa834, 0x9106, 0x1168, 0x8aff, 0x01a8, 0x0126,
-	0x2091, 0x8000, 0x00a1, 0x0108, 0x0091, 0x012e, 0x9006, 0x00ee,
-	0x00fe, 0x0005, 0x0036, 0x0046, 0xab38, 0xac34, 0x080c, 0x1df6,
-	0x004e, 0x003e, 0x0d50, 0x0c98, 0x9085, 0x0001, 0x0c80, 0x0076,
-	0x0066, 0x0056, 0x0046, 0x0036, 0x0026, 0x8aff, 0x0904, 0x1bd0,
-	0x700c, 0x7214, 0x923a, 0x7010, 0x7218, 0x9203, 0x0a04, 0x1bcf,
-	0x9705, 0x0904, 0x1bcf, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190,
-	0x2d00, 0x0002, 0x1bb3, 0x1afa, 0x1afa, 0x1bb3, 0x1bb3, 0x1b96,
-	0x1bb3, 0x1afa, 0x1b9c, 0x1b49, 0x1b49, 0x1bb3, 0x1bb3, 0x1bb3,
-	0x1b90, 0x1b49, 0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20,
-	0xdd9c, 0x0904, 0x1bb5, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4,
-	0x9082, 0x001b, 0x0002, 0x1ae6, 0x1ae4, 0x1ae4, 0x1ae4, 0x1ae4,
-	0x1ae4, 0x1aea, 0x1ae4, 0x1ae4, 0x1ae4, 0x1ae4, 0x1ae4, 0x1aee,
-	0x1ae4, 0x1ae4, 0x1ae4, 0x1ae4, 0x1ae4, 0x1af2, 0x1ae4, 0x1ae4,
-	0x1ae4, 0x1ae4, 0x1ae4, 0x1af6, 0x080c, 0x0db4, 0xa774, 0xa678,
-	0x0804, 0x1bb5, 0xa78c, 0xa690, 0x0804, 0x1bb5, 0xa7a4, 0xa6a8,
-	0x0804, 0x1bb5, 0xa7bc, 0xa6c0, 0x0804, 0x1bb5, 0xa7d4, 0xa6d8,
-	0x0804, 0x1bb5, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0db4, 0x9082,
-	0x001b, 0x0002, 0x1b1d, 0x1b1d, 0x1b1f, 0x1b1d, 0x1b1d, 0x1b1d,
-	0x1b25, 0x1b1d, 0x1b1d, 0x1b1d, 0x1b2b, 0x1b1d, 0x1b1d, 0x1b1d,
-	0x1b31, 0x1b1d, 0x1b1d, 0x1b1d, 0x1b37, 0x1b1d, 0x1b1d, 0x1b1d,
-	0x1b3d, 0x1b1d, 0x1b1d, 0x1b1d, 0x1b43, 0x080c, 0x0db4, 0xa574,
-	0xa478, 0xa37c, 0xa280, 0x0804, 0x1bb5, 0xa584, 0xa488, 0xa38c,
-	0xa290, 0x0804, 0x1bb5, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804,
-	0x1bb5, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x1bb5, 0xa5b4,
-	0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x1bb5, 0xa5c4, 0xa4c8, 0xa3cc,
-	0xa2d0, 0x0804, 0x1bb5, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804,
-	0x1bb5, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4, 0x9082, 0x001b,
-	0x0002, 0x1b6c, 0x1b6a, 0x1b6a, 0x1b6a, 0x1b6a, 0x1b6a, 0x1b74,
-	0x1b6a, 0x1b6a, 0x1b6a, 0x1b6a, 0x1b6a, 0x1b7b, 0x1b6a, 0x1b6a,
-	0x1b6a, 0x1b6a, 0x1b6a, 0x1b82, 0x1b6a, 0x1b6a, 0x1b6a, 0x1b6a,
-	0x1b6a, 0x1b89, 0x080c, 0x0db4, 0xa56c, 0xa470, 0xa774, 0xa678,
-	0xa37c, 0xa280, 0x0804, 0x1bb5, 0xa584, 0xa488, 0xa78c, 0xa690,
-	0xa394, 0xa298, 0x04d0, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac,
-	0xa2b0, 0x0498, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8,
-	0x0460, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, 0x0428,
-	0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x11e8, 0x080c, 0x1d94,
-	0x1904, 0x1a95, 0x900e, 0x04a0, 0xa864, 0x9084, 0x00ff, 0x9086,
-	0x0048, 0x190c, 0x0db4, 0x00c6, 0x7004, 0x2060, 0x6004, 0x9086,
-	0x0043, 0x00ce, 0x0904, 0x1b49, 0xab9c, 0x9016, 0xad8c, 0xac90,
-	0xaf94, 0xae98, 0x0010, 0x080c, 0x0db4, 0x7b12, 0x7a16, 0x7d02,
-	0x7c06, 0x7f0a, 0x7e0e, 0x782b, 0x0001, 0x7000, 0x8000, 0x7002,
-	0xa83c, 0x9300, 0xa83e, 0xa840, 0x9201, 0xa842, 0x700c, 0x9300,
-	0x700e, 0x7010, 0x9201, 0x7012, 0x080c, 0x1d94, 0x0008, 0x9006,
-	0x002e, 0x003e, 0x004e, 0x005e, 0x006e, 0x007e, 0x0005, 0x080c,
-	0x0db4, 0x0026, 0x2001, 0x0105, 0x2003, 0x0010, 0x782b, 0x0004,
-	0x7003, 0x0000, 0x7004, 0x2060, 0x6014, 0x2048, 0x080c, 0xb793,
-	0x0118, 0xa880, 0xc0bd, 0xa882, 0x6020, 0x9086, 0x0006, 0x1180,
-	0x2061, 0x0100, 0x62c8, 0x2001, 0x00fa, 0x8001, 0x1df0, 0x60c8,
-	0x9206, 0x1dc0, 0x60c4, 0xa89a, 0x60c8, 0xa896, 0x7004, 0x2060,
-	0x00c6, 0x080c, 0xb3e0, 0x00ce, 0x2001, 0x19c5, 0x2004, 0x9c06,
-	0x1160, 0x2009, 0x0040, 0x080c, 0x2110, 0x080c, 0x9580, 0x2011,
-	0x0000, 0x080c, 0x93fd, 0x080c, 0x8769, 0x002e, 0x0804, 0x1d46,
-	0x0126, 0x2091, 0x2400, 0xa858, 0x2040, 0x792c, 0x782b, 0x0002,
-	0x9184, 0x0700, 0x1904, 0x1bd9, 0x7000, 0x0002, 0x1d46, 0x1c2a,
-	0x1c97, 0x1d44, 0x8001, 0x7002, 0xd19c, 0x1150, 0x8aff, 0x05b0,
-	0x080c, 0x1a8f, 0x0904, 0x1d46, 0x080c, 0x1a8f, 0x0804, 0x1d46,
-	0x782b, 0x0004, 0xd194, 0x0148, 0xa880, 0xc0fc, 0xa882, 0x8aff,
-	0x11d8, 0xa87c, 0xc0f5, 0xa87e, 0x00b8, 0x0026, 0x0036, 0xab3c,
-	0xaa40, 0x7810, 0xa82e, 0x931a, 0x7814, 0xa832, 0x9213, 0x7800,
-	0xa81e, 0x7804, 0xa822, 0xab3e, 0xaa42, 0x003e, 0x002e, 0x080c,
-	0x1dac, 0xa880, 0xc0fd, 0xa882, 0x2a00, 0xa816, 0x2800, 0xa85a,
-	0x2c00, 0xa812, 0x7003, 0x0000, 0x0804, 0x1d46, 0x00f6, 0x0026,
-	0x781c, 0x0006, 0x7818, 0x0006, 0x2079, 0x0100, 0x7a14, 0x9284,
-	0x1984, 0x9085, 0x0012, 0x7816, 0x0036, 0x2019, 0x1000, 0x8319,
-	0x090c, 0x0db4, 0x7820, 0xd0bc, 0x1dd0, 0x003e, 0x79c8, 0x000e,
-	0x9102, 0x001e, 0x0006, 0x0016, 0x79c4, 0x000e, 0x9103, 0x78c6,
-	0x000e, 0x78ca, 0x9284, 0x1984, 0x9085, 0x0012, 0x7816, 0x002e,
-	0x00fe, 0x782b, 0x0008, 0x7003, 0x0000, 0x0804, 0x1d46, 0x8001,
-	0x7002, 0xd194, 0x0170, 0x782c, 0xd0fc, 0x1904, 0x1c1d, 0xd19c,
-	0x1904, 0x1d42, 0x8aff, 0x0904, 0x1d46, 0x080c, 0x1a8f, 0x0804,
-	0x1d46, 0x0026, 0x0036, 0xab3c, 0xaa40, 0x080c, 0x1dac, 0xdd9c,
-	0x1904, 0x1d01, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0db4, 0x9082,
-	0x001b, 0x0002, 0x1cd5, 0x1cd5, 0x1cd7, 0x1cd5, 0x1cd5, 0x1cd5,
-	0x1cdd, 0x1cd5, 0x1cd5, 0x1cd5, 0x1ce3, 0x1cd5, 0x1cd5, 0x1cd5,
-	0x1ce9, 0x1cd5, 0x1cd5, 0x1cd5, 0x1cef, 0x1cd5, 0x1cd5, 0x1cd5,
-	0x1cf5, 0x1cd5, 0x1cd5, 0x1cd5, 0x1cfb, 0x080c, 0x0db4, 0xa07c,
-	0x931a, 0xa080, 0x9213, 0x0804, 0x1c49, 0xa08c, 0x931a, 0xa090,
-	0x9213, 0x0804, 0x1c49, 0xa09c, 0x931a, 0xa0a0, 0x9213, 0x0804,
-	0x1c49, 0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, 0x1c49, 0xa0bc,
-	0x931a, 0xa0c0, 0x9213, 0x0804, 0x1c49, 0xa0cc, 0x931a, 0xa0d0,
-	0x9213, 0x0804, 0x1c49, 0xa0dc, 0x931a, 0xa0e0, 0x9213, 0x0804,
-	0x1c49, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4, 0x9082, 0x001b,
-	0x0002, 0x1d24, 0x1d22, 0x1d22, 0x1d22, 0x1d22, 0x1d22, 0x1d2a,
-	0x1d22, 0x1d22, 0x1d22, 0x1d22, 0x1d22, 0x1d30, 0x1d22, 0x1d22,
-	0x1d22, 0x1d22, 0x1d22, 0x1d36, 0x1d22, 0x1d22, 0x1d22, 0x1d22,
-	0x1d22, 0x1d3c, 0x080c, 0x0db4, 0xa07c, 0x931a, 0xa080, 0x9213,
-	0x0804, 0x1c49, 0xa094, 0x931a, 0xa098, 0x9213, 0x0804, 0x1c49,
-	0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, 0x1c49, 0xa0c4, 0x931a,
-	0xa0c8, 0x9213, 0x0804, 0x1c49, 0xa0dc, 0x931a, 0xa0e0, 0x9213,
-	0x0804, 0x1c49, 0x0804, 0x1c45, 0x080c, 0x0db4, 0x012e, 0x0005,
-	0x00f6, 0x00e6, 0x2071, 0x1a34, 0x7000, 0x9086, 0x0000, 0x0904,
-	0x1d91, 0x2079, 0x0090, 0x2009, 0x0207, 0x210c, 0xd194, 0x01b8,
-	0x2009, 0x020c, 0x210c, 0x9184, 0x0003, 0x0188, 0x080c, 0xd504,
+	0x00d8, 0xa584, 0xa488, 0xa78c, 0xa690, 0xa394, 0xa298, 0x00a0,
+	0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, 0xa2b0, 0x0068, 0xa5b4,
+	0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8, 0x0030, 0xa5cc, 0xa4d0,
+	0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, 0xab2e, 0xaa32, 0xad1e, 0xac22,
+	0xaf26, 0xae2a, 0xa988, 0x8c60, 0x2c1d, 0xa8ac, 0xaab0, 0xa836,
+	0xaa3a, 0x8109, 0xa916, 0x1158, 0x3e60, 0x601c, 0xc085, 0x601e,
+	0xa87c, 0xc0dd, 0xa87e, 0x9006, 0x00ce, 0x012e, 0x0005, 0x2800,
+	0xa80e, 0xab0a, 0x2c00, 0xa812, 0x0c78, 0x0804, 0x167c, 0x0016,
+	0x2009, 0x00a0, 0x8109, 0xa001, 0xa001, 0xa001, 0x1dd8, 0x001e,
+	0x2ff0, 0x0126, 0x2091, 0x2200, 0x00c6, 0x3e60, 0x6014, 0x2048,
+	0x2940, 0xa80e, 0x2061, 0x1f21, 0xa813, 0x1f21, 0x2c05, 0xa80a,
+	0xa964, 0xa91a, 0xa87c, 0xd0ac, 0x090c, 0x0db4, 0x9006, 0xa842,
+	0xa83e, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4, 0xadcc, 0xacd0,
+	0xafd4, 0xaed8, 0xabdc, 0xaae0, 0xab2e, 0xaa32, 0xad1e, 0xac22,
+	0xaf26, 0xae2a, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0xa988, 0xa864,
+	0x9084, 0x00ff, 0x9086, 0x0008, 0x1120, 0x8109, 0xa916, 0x0128,
+	0x0078, 0x918a, 0x0002, 0xa916, 0x1158, 0x3e60, 0x601c, 0xc085,
+	0x601e, 0xa87c, 0xc0dd, 0xa87e, 0x9006, 0x00ce, 0x012e, 0x0005,
+	0xa804, 0x9045, 0x090c, 0x0db4, 0xa80e, 0xa064, 0xa81a, 0x9084,
+	0x000f, 0x9080, 0x1f26, 0x2015, 0x82ff, 0x090c, 0x0db4, 0xaa12,
+	0x2205, 0xa80a, 0x0c10, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190,
+	0x2d00, 0x0002, 0x18e0, 0x1842, 0x1842, 0x18e0, 0x18e0, 0x18da,
+	0x18e0, 0x1842, 0x1891, 0x1891, 0x1891, 0x18e0, 0x18e0, 0x18e0,
+	0x18d7, 0x1891, 0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20,
+	0xdd9c, 0x0904, 0x18e2, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4,
+	0x9082, 0x001b, 0x0002, 0x182e, 0x182c, 0x182c, 0x182c, 0x182c,
+	0x182c, 0x1832, 0x182c, 0x182c, 0x182c, 0x182c, 0x182c, 0x1836,
+	0x182c, 0x182c, 0x182c, 0x182c, 0x182c, 0x183a, 0x182c, 0x182c,
+	0x182c, 0x182c, 0x182c, 0x183e, 0x080c, 0x0db4, 0xa774, 0xa678,
+	0x0804, 0x18e2, 0xa78c, 0xa690, 0x0804, 0x18e2, 0xa7a4, 0xa6a8,
+	0x0804, 0x18e2, 0xa7bc, 0xa6c0, 0x0804, 0x18e2, 0xa7d4, 0xa6d8,
+	0x0804, 0x18e2, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0db4, 0x9082,
+	0x001b, 0x0002, 0x1865, 0x1865, 0x1867, 0x1865, 0x1865, 0x1865,
+	0x186d, 0x1865, 0x1865, 0x1865, 0x1873, 0x1865, 0x1865, 0x1865,
+	0x1879, 0x1865, 0x1865, 0x1865, 0x187f, 0x1865, 0x1865, 0x1865,
+	0x1885, 0x1865, 0x1865, 0x1865, 0x188b, 0x080c, 0x0db4, 0xa574,
+	0xa478, 0xa37c, 0xa280, 0x0804, 0x18e2, 0xa584, 0xa488, 0xa38c,
+	0xa290, 0x0804, 0x18e2, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804,
+	0x18e2, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x18e2, 0xa5b4,
+	0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x18e2, 0xa5c4, 0xa4c8, 0xa3cc,
+	0xa2d0, 0x0804, 0x18e2, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804,
+	0x18e2, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4, 0x9082, 0x001b,
+	0x0002, 0x18b4, 0x18b2, 0x18b2, 0x18b2, 0x18b2, 0x18b2, 0x18bb,
+	0x18b2, 0x18b2, 0x18b2, 0x18b2, 0x18b2, 0x18c2, 0x18b2, 0x18b2,
+	0x18b2, 0x18b2, 0x18b2, 0x18c9, 0x18b2, 0x18b2, 0x18b2, 0x18b2,
+	0x18b2, 0x18d0, 0x080c, 0x0db4, 0xa56c, 0xa470, 0xa774, 0xa678,
+	0xa37c, 0xa280, 0x0438, 0xa584, 0xa488, 0xa78c, 0xa690, 0xa394,
+	0xa298, 0x0400, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, 0xa2b0,
+	0x00c8, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8, 0x0090,
+	0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, 0x0058, 0x9d86,
+	0x000e, 0x1130, 0x080c, 0x1ede, 0x1904, 0x17eb, 0x900e, 0x0050,
+	0x080c, 0x0db4, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a,
+	0x080c, 0x1ede, 0x0005, 0x6014, 0x2048, 0x6118, 0x810c, 0x810c,
+	0x810c, 0x81ff, 0x1118, 0xa887, 0x0001, 0x0008, 0xa986, 0x601b,
+	0x0002, 0xa974, 0xd1dc, 0x1108, 0x0005, 0xa934, 0xa88c, 0x9106,
+	0x1158, 0xa938, 0xa890, 0x9106, 0x1138, 0x601c, 0xc084, 0x601e,
+	0x2009, 0x0048, 0x0804, 0x9e93, 0x0005, 0x0126, 0x00c6, 0x2091,
+	0x2200, 0x00ce, 0x7908, 0x918c, 0x0007, 0x9186, 0x0000, 0x05b0,
+	0x9186, 0x0003, 0x0598, 0x6020, 0x6023, 0x0000, 0x0006, 0x2031,
+	0x0008, 0x00c6, 0x781f, 0x0808, 0x7808, 0xd09c, 0x0120, 0x080c,
+	0x130c, 0x8631, 0x1db8, 0x00ce, 0x781f, 0x0800, 0x2031, 0x0168,
+	0x00c6, 0x7808, 0xd09c, 0x190c, 0x130c, 0x00ce, 0x2001, 0x0038,
+	0x080c, 0x19e5, 0x7930, 0x9186, 0x0040, 0x0160, 0x9186, 0x0042,
+	0x190c, 0x0db4, 0x2001, 0x001e, 0x8001, 0x1df0, 0x8631, 0x1d40,
+	0x080c, 0x19f4, 0x000e, 0x6022, 0x012e, 0x0005, 0x080c, 0x19e1,
+	0x7827, 0x0015, 0x7828, 0x9c06, 0x1db8, 0x782b, 0x0000, 0x0ca0,
+	0x00f6, 0x2079, 0x0300, 0x7803, 0x0000, 0x78ab, 0x0004, 0x00fe,
+	0x080c, 0x6fa7, 0x11b0, 0x2001, 0x0138, 0x2003, 0x0000, 0x2001,
+	0x0160, 0x2003, 0x0000, 0x2011, 0x012c, 0xa001, 0xa001, 0x8211,
+	0x1de0, 0x0081, 0x0066, 0x2031, 0x0000, 0x080c, 0x7057, 0x006e,
+	0x0005, 0x0479, 0x0039, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138,
+	0x2202, 0x0005, 0x00e6, 0x2071, 0x0200, 0x080c, 0x2a69, 0x2009,
+	0x003c, 0x080c, 0x2268, 0x2001, 0x015d, 0x2003, 0x0000, 0x7000,
+	0x9084, 0x003c, 0x1de0, 0x080c, 0x7f35, 0x70a0, 0x70a2, 0x7098,
+	0x709a, 0x709c, 0x709e, 0x2001, 0x020d, 0x2003, 0x0020, 0x00f6,
+	0x2079, 0x0300, 0x080c, 0x12c5, 0x7803, 0x0001, 0x00fe, 0x00ee,
+	0x0005, 0x2001, 0x0138, 0x2014, 0x2003, 0x0000, 0x2001, 0x0160,
+	0x202c, 0x2003, 0x0000, 0x080c, 0x6fa7, 0x1108, 0x0005, 0x2021,
+	0x0260, 0x2001, 0x0141, 0x201c, 0xd3dc, 0x1168, 0x2001, 0x0109,
+	0x201c, 0x939c, 0x0048, 0x1160, 0x2001, 0x0111, 0x201c, 0x83ff,
+	0x1110, 0x8421, 0x1d70, 0x2001, 0x015d, 0x2003, 0x0000, 0x0005,
+	0x0046, 0x2021, 0x0019, 0x2003, 0x0048, 0xa001, 0xa001, 0x201c,
+	0x939c, 0x0048, 0x0120, 0x8421, 0x1db0, 0x004e, 0x0c60, 0x004e,
+	0x0c40, 0x601c, 0xc084, 0x601e, 0x0005, 0x2c08, 0x621c, 0x080c,
+	0x1518, 0x7930, 0x0005, 0x2c08, 0x621c, 0x080c, 0x15c3, 0x7930,
+	0x0005, 0x8001, 0x1df0, 0x0005, 0x2031, 0x0005, 0x781c, 0x9084,
+	0x0007, 0x0170, 0x2001, 0x0038, 0x0c41, 0x9186, 0x0040, 0x0904,
+	0x1a52, 0x2001, 0x001e, 0x0c69, 0x8631, 0x1d80, 0x080c, 0x0db4,
+	0x781f, 0x0202, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001, 0x0b10,
+	0x0c01, 0x781c, 0xd084, 0x0110, 0x0861, 0x04e0, 0x2001, 0x0030,
+	0x0891, 0x9186, 0x0040, 0x0568, 0x781c, 0xd084, 0x1da8, 0x781f,
+	0x0101, 0x2001, 0x0014, 0x0869, 0x2001, 0x0037, 0x0821, 0x9186,
+	0x0040, 0x0140, 0x2001, 0x0030, 0x080c, 0x19eb, 0x9186, 0x0040,
+	0x190c, 0x0db4, 0x00d6, 0x2069, 0x0200, 0x692c, 0xd1f4, 0x1170,
+	0xd1c4, 0x0160, 0xd19c, 0x0130, 0x6800, 0x9085, 0x1800, 0x6802,
+	0x00de, 0x0080, 0x6908, 0x9184, 0x0007, 0x1db0, 0x00de, 0x781f,
+	0x0100, 0x791c, 0x9184, 0x0007, 0x090c, 0x0db4, 0xa001, 0xa001,
+	0x781f, 0x0200, 0x0005, 0x0126, 0x2091, 0x2400, 0x2071, 0x1a36,
+	0x2079, 0x0090, 0x012e, 0x0005, 0x9280, 0x0005, 0x2004, 0x2048,
+	0xa97c, 0xd1dc, 0x1904, 0x1ae7, 0xa964, 0x9184, 0x0007, 0x0002,
+	0x1a70, 0x1ad2, 0x1a87, 0x1a87, 0x1a87, 0x1aba, 0x1a9a, 0x1a89,
+	0x918c, 0x00ff, 0x9186, 0x0008, 0x1170, 0xa87c, 0xd0b4, 0x0904,
+	0x1d05, 0x9006, 0xa842, 0xa83e, 0xa988, 0x2900, 0xa85a, 0xa813,
+	0x1f21, 0x0804, 0x1ae3, 0x9186, 0x0048, 0x0904, 0x1ad2, 0x080c,
+	0x0db4, 0xa87c, 0xd0b4, 0x0904, 0x1d05, 0xa890, 0xa842, 0xa83a,
+	0xa88c, 0xa83e, 0xa836, 0xa8ac, 0xa846, 0xa8b0, 0xa84a, 0xa988,
+	0x0804, 0x1ada, 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x1d38,
+	0xa87c, 0xd0b4, 0x0904, 0x1d05, 0xa890, 0xa842, 0xa83a, 0xa88c,
+	0xa83e, 0xa836, 0xa8ac, 0xa846, 0xa8b0, 0xa84a, 0xa804, 0xa85a,
+	0x2040, 0xa064, 0x9084, 0x000f, 0x9080, 0x1f26, 0x2005, 0xa812,
+	0xa988, 0x0448, 0x918c, 0x00ff, 0x9186, 0x0015, 0x1540, 0xa87c,
+	0xd0b4, 0x0904, 0x1d05, 0xa804, 0xa85a, 0x2040, 0xa064, 0x9084,
+	0x000f, 0x9080, 0x1f26, 0x2005, 0xa812, 0xa988, 0x9006, 0xa842,
+	0xa83e, 0x0088, 0xa87c, 0xd0b4, 0x0904, 0x1d05, 0xa988, 0x9006,
+	0xa842, 0xa83e, 0x2900, 0xa85a, 0xa864, 0x9084, 0x000f, 0x9080,
+	0x1f26, 0x2005, 0xa812, 0xa916, 0xa87c, 0xc0dd, 0xa87e, 0x0005,
+	0x00f6, 0x2079, 0x0090, 0x782c, 0xd0fc, 0x190c, 0x1d4a, 0x00e6,
+	0x2071, 0x1a36, 0x7000, 0x9005, 0x1904, 0x1b50, 0x7206, 0x9280,
+	0x0005, 0x204c, 0x9280, 0x0004, 0x2004, 0x782b, 0x0004, 0x00f6,
+	0x2079, 0x0200, 0x7803, 0x0040, 0x00fe, 0x00b6, 0x2058, 0xb86c,
+	0x7836, 0xb890, 0x00be, 0x00f6, 0x2079, 0x0200, 0x7803, 0x0040,
+	0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x781a, 0x2079,
+	0x0100, 0x8004, 0x78d6, 0x00fe, 0xa814, 0x2050, 0xa858, 0x2040,
+	0xa810, 0x2060, 0xa064, 0x90ec, 0x000f, 0xa944, 0x791a, 0x7116,
+	0xa848, 0x781e, 0x701a, 0x9006, 0x700e, 0x7012, 0x7004, 0xa940,
+	0xa838, 0x9106, 0x1500, 0xa93c, 0xa834, 0x9106, 0x11e0, 0x0006,
+	0x0016, 0xa938, 0xa834, 0x9105, 0x0118, 0x001e, 0x000e, 0x0098,
+	0x001e, 0x000e, 0x8aff, 0x01c8, 0x0126, 0x2091, 0x8000, 0x2009,
+	0x0306, 0x200b, 0x0808, 0x00d9, 0x0108, 0x00c9, 0x012e, 0x9006,
+	0x00ee, 0x00fe, 0x0005, 0x0036, 0x0046, 0xab38, 0xac34, 0x080c,
+	0x1f46, 0x004e, 0x003e, 0x0d30, 0x0c98, 0x9085, 0x0001, 0x0c80,
+	0x2009, 0x0306, 0x200b, 0x4800, 0x7027, 0x0000, 0x0005, 0x0076,
+	0x0066, 0x0056, 0x0046, 0x0036, 0x0026, 0x8aff, 0x0904, 0x1cfe,
+	0x700c, 0x7214, 0x923a, 0x7010, 0x7218, 0x9203, 0x0a04, 0x1cfd,
+	0x9705, 0x0904, 0x1cfd, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190,
+	0x2d00, 0x0002, 0x1c92, 0x1bd2, 0x1bd2, 0x1c92, 0x1c92, 0x1c6f,
+	0x1c92, 0x1bd2, 0x1c76, 0x1c21, 0x1c21, 0x1c92, 0x1c92, 0x1c92,
+	0x1c69, 0x1c21, 0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20,
+	0xdd9c, 0x0904, 0x1c94, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4,
+	0x9082, 0x001b, 0x0002, 0x1bbe, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc,
+	0x1bbc, 0x1bc2, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bc6,
+	0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bca, 0x1bbc, 0x1bbc,
+	0x1bbc, 0x1bbc, 0x1bbc, 0x1bce, 0x080c, 0x0db4, 0xa774, 0xa678,
+	0x0804, 0x1c94, 0xa78c, 0xa690, 0x0804, 0x1c94, 0xa7a4, 0xa6a8,
+	0x0804, 0x1c94, 0xa7bc, 0xa6c0, 0x0804, 0x1c94, 0xa7d4, 0xa6d8,
+	0x0804, 0x1c94, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0db4, 0x9082,
+	0x001b, 0x0002, 0x1bf5, 0x1bf5, 0x1bf7, 0x1bf5, 0x1bf5, 0x1bf5,
+	0x1bfd, 0x1bf5, 0x1bf5, 0x1bf5, 0x1c03, 0x1bf5, 0x1bf5, 0x1bf5,
+	0x1c09, 0x1bf5, 0x1bf5, 0x1bf5, 0x1c0f, 0x1bf5, 0x1bf5, 0x1bf5,
+	0x1c15, 0x1bf5, 0x1bf5, 0x1bf5, 0x1c1b, 0x080c, 0x0db4, 0xa574,
+	0xa478, 0xa37c, 0xa280, 0x0804, 0x1c94, 0xa584, 0xa488, 0xa38c,
+	0xa290, 0x0804, 0x1c94, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804,
+	0x1c94, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x1c94, 0xa5b4,
+	0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x1c94, 0xa5c4, 0xa4c8, 0xa3cc,
+	0xa2d0, 0x0804, 0x1c94, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804,
+	0x1c94, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4, 0x9082, 0x001b,
+	0x0002, 0x1c44, 0x1c42, 0x1c42, 0x1c42, 0x1c42, 0x1c42, 0x1c4c,
+	0x1c42, 0x1c42, 0x1c42, 0x1c42, 0x1c42, 0x1c54, 0x1c42, 0x1c42,
+	0x1c42, 0x1c42, 0x1c42, 0x1c5b, 0x1c42, 0x1c42, 0x1c42, 0x1c42,
+	0x1c42, 0x1c62, 0x080c, 0x0db4, 0xa56c, 0xa470, 0xa774, 0xa678,
+	0xa37c, 0xa280, 0x0804, 0x1c94, 0xa584, 0xa488, 0xa78c, 0xa690,
+	0xa394, 0xa298, 0x0804, 0x1c94, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8,
+	0xa3ac, 0xa2b0, 0x04c8, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4,
+	0xa2c8, 0x0490, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0,
+	0x0458, 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x1518, 0x080c,
+	0x1ede, 0x1904, 0x1b6d, 0x900e, 0x0804, 0x1cfe, 0xab64, 0x939c,
+	0x00ff, 0x9386, 0x0048, 0x1180, 0x00c6, 0x7004, 0x2060, 0x6004,
+	0x9086, 0x0043, 0x00ce, 0x0904, 0x1c21, 0xab9c, 0x9016, 0xad8c,
+	0xac90, 0xaf94, 0xae98, 0x0040, 0x9386, 0x0008, 0x0904, 0x1c21,
+	0x080c, 0x0db4, 0x080c, 0x0db4, 0x2009, 0x030f, 0x2104, 0xd0fc,
+	0x0530, 0x0066, 0x2009, 0x0306, 0x2104, 0x9084, 0x0030, 0x15c8,
+	0x2031, 0x1000, 0x200b, 0x4000, 0x2600, 0x9302, 0x928b, 0x0000,
+	0xa82e, 0xa932, 0x0278, 0x9105, 0x0168, 0x2011, 0x0000, 0x2618,
+	0x2600, 0x9500, 0xa81e, 0x9481, 0x0000, 0xa822, 0xa880, 0xc0fd,
+	0xa882, 0x0020, 0xa82f, 0x0000, 0xa833, 0x0000, 0x006e, 0x7b12,
+	0x7a16, 0x7d02, 0x7c06, 0x7f0a, 0x7e0e, 0x782b, 0x0001, 0x7000,
+	0x8000, 0x7002, 0xa83c, 0x9300, 0xa83e, 0xa840, 0x9201, 0xa842,
+	0x700c, 0x9300, 0x700e, 0x7010, 0x9201, 0x7012, 0x080c, 0x1ede,
+	0x0428, 0x2031, 0x0080, 0x9584, 0x007f, 0x0108, 0x9632, 0x7124,
+	0x7000, 0x9086, 0x0000, 0x1198, 0xc185, 0x7126, 0x2009, 0x0306,
+	0x2104, 0xd0b4, 0x1904, 0x1ca4, 0x200b, 0x4040, 0x2009, 0x1a4f,
+	0x2104, 0x8000, 0x0a04, 0x1ca4, 0x200a, 0x0804, 0x1ca4, 0xc18d,
+	0x7126, 0xd184, 0x1d58, 0x0804, 0x1ca4, 0x9006, 0x002e, 0x003e,
+	0x004e, 0x005e, 0x006e, 0x007e, 0x0005, 0x080c, 0x0db4, 0x0026,
+	0x2001, 0x0105, 0x2003, 0x0010, 0x782b, 0x0004, 0x7003, 0x0000,
+	0x7004, 0x0016, 0x080c, 0x1b60, 0x001e, 0x2060, 0x6014, 0x2048,
+	0x080c, 0xbafe, 0x0118, 0xa880, 0xc0bd, 0xa882, 0x6020, 0x9086,
+	0x0006, 0x1180, 0x2061, 0x0100, 0x62c8, 0x2001, 0x00fa, 0x8001,
+	0x1df0, 0x60c8, 0x9206, 0x1dc0, 0x60c4, 0xa89a, 0x60c8, 0xa896,
+	0x7004, 0x2060, 0x00c6, 0x080c, 0xb731, 0x00ce, 0x2001, 0x19c7,
+	0x2004, 0x9c06, 0x1160, 0x2009, 0x0040, 0x080c, 0x2268, 0x080c,
+	0x98d1, 0x2011, 0x0000, 0x080c, 0x9762, 0x080c, 0x8a26, 0x002e,
+	0x0804, 0x1e8e, 0x0126, 0x2091, 0x2400, 0xa858, 0x2040, 0x792c,
+	0x782b, 0x0002, 0x9184, 0x0700, 0x1904, 0x1d07, 0x7000, 0x0002,
+	0x1e8e, 0x1d5c, 0x1ddc, 0x1e8c, 0x8001, 0x7002, 0x7027, 0x0000,
+	0xd19c, 0x1158, 0x8aff, 0x0904, 0x1da9, 0x080c, 0x1b67, 0x0904,
+	0x1e8e, 0x080c, 0x1b67, 0x0804, 0x1e8e, 0x782b, 0x0004, 0xd194,
+	0x0148, 0xa880, 0xc0fc, 0xa882, 0x8aff, 0x1518, 0xa87c, 0xc0f5,
+	0xa87e, 0x00f8, 0x0026, 0x0036, 0xab3c, 0xaa40, 0x0016, 0x7910,
+	0xa82c, 0x9100, 0xa82e, 0x7914, 0xa830, 0x9101, 0xa832, 0x001e,
+	0x7810, 0x931a, 0x7814, 0x9213, 0x7800, 0xa81e, 0x7804, 0xa822,
+	0xab3e, 0xaa42, 0x003e, 0x002e, 0x080c, 0x1ef9, 0xa880, 0xc0fd,
+	0xa882, 0x2a00, 0xa816, 0x2800, 0xa85a, 0x2c00, 0xa812, 0x7003,
+	0x0000, 0x2009, 0x0306, 0x200b, 0x4800, 0x7027, 0x0000, 0x0804,
+	0x1e8e, 0x00f6, 0x0026, 0x781c, 0x0006, 0x7818, 0x0006, 0x2079,
+	0x0100, 0x7a14, 0x9284, 0x1984, 0x9085, 0x0012, 0x7816, 0x0036,
+	0x2019, 0x1000, 0x8319, 0x090c, 0x0db4, 0x7820, 0xd0bc, 0x1dd0,
+	0x003e, 0x79c8, 0x000e, 0x9102, 0x001e, 0x0006, 0x0016, 0x79c4,
+	0x000e, 0x9103, 0x78c6, 0x000e, 0x78ca, 0x9284, 0x1984, 0x9085,
+	0x0012, 0x7816, 0x002e, 0x00fe, 0x782b, 0x0008, 0x7003, 0x0000,
+	0x080c, 0x1b60, 0x0804, 0x1e8e, 0x8001, 0x7002, 0x7024, 0x8004,
+	0x7026, 0xd194, 0x0170, 0x782c, 0xd0fc, 0x1904, 0x1d4f, 0xd19c,
+	0x1904, 0x1e8a, 0x8aff, 0x0904, 0x1e8e, 0x080c, 0x1b67, 0x0804,
+	0x1e8e, 0x0026, 0x0036, 0xab3c, 0xaa40, 0x080c, 0x1ef9, 0xdd9c,
+	0x1904, 0x1e49, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0db4, 0x9082,
+	0x001b, 0x0002, 0x1e1d, 0x1e1d, 0x1e1f, 0x1e1d, 0x1e1d, 0x1e1d,
+	0x1e25, 0x1e1d, 0x1e1d, 0x1e1d, 0x1e2b, 0x1e1d, 0x1e1d, 0x1e1d,
+	0x1e31, 0x1e1d, 0x1e1d, 0x1e1d, 0x1e37, 0x1e1d, 0x1e1d, 0x1e1d,
+	0x1e3d, 0x1e1d, 0x1e1d, 0x1e1d, 0x1e43, 0x080c, 0x0db4, 0xa07c,
+	0x931a, 0xa080, 0x9213, 0x0804, 0x1d7e, 0xa08c, 0x931a, 0xa090,
+	0x9213, 0x0804, 0x1d7e, 0xa09c, 0x931a, 0xa0a0, 0x9213, 0x0804,
+	0x1d7e, 0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, 0x1d7e, 0xa0bc,
+	0x931a, 0xa0c0, 0x9213, 0x0804, 0x1d7e, 0xa0cc, 0x931a, 0xa0d0,
+	0x9213, 0x0804, 0x1d7e, 0xa0dc, 0x931a, 0xa0e0, 0x9213, 0x0804,
+	0x1d7e, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4, 0x9082, 0x001b,
+	0x0002, 0x1e6c, 0x1e6a, 0x1e6a, 0x1e6a, 0x1e6a, 0x1e6a, 0x1e72,
+	0x1e6a, 0x1e6a, 0x1e6a, 0x1e6a, 0x1e6a, 0x1e78, 0x1e6a, 0x1e6a,
+	0x1e6a, 0x1e6a, 0x1e6a, 0x1e7e, 0x1e6a, 0x1e6a, 0x1e6a, 0x1e6a,
+	0x1e6a, 0x1e84, 0x080c, 0x0db4, 0xa07c, 0x931a, 0xa080, 0x9213,
+	0x0804, 0x1d7e, 0xa094, 0x931a, 0xa098, 0x9213, 0x0804, 0x1d7e,
+	0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, 0x1d7e, 0xa0c4, 0x931a,
+	0xa0c8, 0x9213, 0x0804, 0x1d7e, 0xa0dc, 0x931a, 0xa0e0, 0x9213,
+	0x0804, 0x1d7e, 0x0804, 0x1d7a, 0x080c, 0x0db4, 0x012e, 0x0005,
+	0x00f6, 0x00e6, 0x2071, 0x1a36, 0x7000, 0x9086, 0x0000, 0x0904,
+	0x1ed9, 0x2079, 0x0090, 0x2009, 0x0207, 0x210c, 0xd194, 0x01b8,
+	0x2009, 0x020c, 0x210c, 0x9184, 0x0003, 0x0188, 0x080c, 0xd8b5,
 	0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0db4, 0x0016, 0x2009,
-	0x0040, 0x080c, 0x2110, 0x001e, 0x2001, 0x020c, 0x2102, 0x2009,
+	0x0040, 0x080c, 0x2268, 0x001e, 0x2001, 0x020c, 0x2102, 0x2009,
 	0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, 0x2009,
-	0x0040, 0x080c, 0x2110, 0x782c, 0xd0fc, 0x09a8, 0x080c, 0x1c18,
+	0x0040, 0x080c, 0x2268, 0x782c, 0xd0fc, 0x09a8, 0x080c, 0x1d4a,
 	0x7000, 0x9086, 0x0000, 0x1978, 0x782b, 0x0004, 0x782c, 0xd0ac,
-	0x1de8, 0x2009, 0x0040, 0x080c, 0x2110, 0x782b, 0x0002, 0x7003,
-	0x0000, 0x00ee, 0x00fe, 0x0005, 0x8c60, 0x2c05, 0x9005, 0x0110,
-	0x8a51, 0x0005, 0xa004, 0x9005, 0x0168, 0xa85a, 0x2040, 0xa064,
-	0x9084, 0x000f, 0x9080, 0x1dd6, 0x2065, 0x8cff, 0x090c, 0x0db4,
-	0x8a51, 0x0005, 0x2050, 0x0005, 0x8a50, 0x8c61, 0x2c05, 0x9005,
+	0x1de8, 0x2009, 0x0040, 0x080c, 0x2268, 0x782b, 0x0002, 0x7003,
+	0x0000, 0x080c, 0x1b60, 0x00ee, 0x00fe, 0x0005, 0xa880, 0xd0fc,
+	0x11a8, 0x8c60, 0x2c05, 0x9005, 0x0110, 0x8a51, 0x0005, 0xa004,
+	0x9005, 0x0168, 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080,
+	0x1f26, 0x2065, 0x8cff, 0x090c, 0x0db4, 0x8a51, 0x0005, 0x2050,
+	0x0005, 0xa880, 0xd0fc, 0x11b8, 0x8a50, 0x8c61, 0x2c05, 0x9005,
 	0x1190, 0x2800, 0x9906, 0x0120, 0xa000, 0x9005, 0x1108, 0x2900,
-	0x2040, 0xa85a, 0xa064, 0x9084, 0x000f, 0x9080, 0x1de6, 0x2065,
+	0x2040, 0xa85a, 0xa064, 0x9084, 0x000f, 0x9080, 0x1f36, 0x2065,
 	0x8cff, 0x090c, 0x0db4, 0x0005, 0x0000, 0x001d, 0x0021, 0x0025,
 	0x0029, 0x002d, 0x0031, 0x0035, 0x0000, 0x001b, 0x0021, 0x0027,
-	0x002d, 0x0033, 0x0000, 0x0000, 0x0023, 0x0000, 0x0000, 0x1dc9,
-	0x1dc5, 0x0000, 0x0000, 0x1dd3, 0x0000, 0x1dc9, 0x1dd0, 0x1dd0,
-	0x1dcd, 0x0000, 0x0000, 0x0000, 0x1dd3, 0x1dd0, 0x0000, 0x1dcb,
-	0x1dcb, 0x0000, 0x0000, 0x1dd3, 0x0000, 0x1dcb, 0x1dd1, 0x1dd1,
-	0x1dd1, 0x0000, 0x0000, 0x0000, 0x1dd3, 0x1dd1, 0x00c6, 0x00d6,
-	0x0086, 0xab42, 0xac3e, 0xa888, 0x9055, 0x0904, 0x1fcd, 0x2940,
-	0xa064, 0x90ec, 0x000f, 0x9de0, 0x1dd6, 0x9d86, 0x0007, 0x0130,
+	0x002d, 0x0033, 0x0000, 0x0000, 0x0023, 0x0000, 0x0000, 0x1f19,
+	0x1f15, 0x0000, 0x0000, 0x1f23, 0x0000, 0x1f19, 0x1f20, 0x1f20,
+	0x1f1d, 0x0000, 0x0000, 0x0000, 0x1f23, 0x1f20, 0x0000, 0x1f1b,
+	0x1f1b, 0x0000, 0x0000, 0x1f23, 0x0000, 0x1f1b, 0x1f21, 0x1f21,
+	0x1f21, 0x0000, 0x0000, 0x0000, 0x1f23, 0x1f21, 0x00c6, 0x00d6,
+	0x0086, 0xab42, 0xac3e, 0xa888, 0x9055, 0x0904, 0x2125, 0x2940,
+	0xa064, 0x90ec, 0x000f, 0x9084, 0x00ff, 0x9086, 0x0008, 0x1118,
+	0x2061, 0x1f21, 0x00d0, 0x9de0, 0x1f26, 0x9d86, 0x0007, 0x0130,
 	0x9d86, 0x000e, 0x0118, 0x9d86, 0x000f, 0x1120, 0xa08c, 0x9422,
-	0xa090, 0x931b, 0x2c05, 0x9065, 0x1140, 0x0310, 0x0804, 0x1fcd,
-	0xa004, 0x9045, 0x0904, 0x1fcd, 0x0c18, 0x2c05, 0x9005, 0x0904,
-	0x1eb5, 0xdd9c, 0x1904, 0x1e71, 0x908a, 0x0036, 0x1a0c, 0x0db4,
-	0x9082, 0x001b, 0x0002, 0x1e46, 0x1e46, 0x1e48, 0x1e46, 0x1e46,
-	0x1e46, 0x1e4e, 0x1e46, 0x1e46, 0x1e46, 0x1e54, 0x1e46, 0x1e46,
-	0x1e46, 0x1e5a, 0x1e46, 0x1e46, 0x1e46, 0x1e60, 0x1e46, 0x1e46,
-	0x1e46, 0x1e66, 0x1e46, 0x1e46, 0x1e46, 0x1e6c, 0x080c, 0x0db4,
-	0xa07c, 0x9422, 0xa080, 0x931b, 0x0804, 0x1eab, 0xa08c, 0x9422,
-	0xa090, 0x931b, 0x0804, 0x1eab, 0xa09c, 0x9422, 0xa0a0, 0x931b,
-	0x0804, 0x1eab, 0xa0ac, 0x9422, 0xa0b0, 0x931b, 0x0804, 0x1eab,
-	0xa0bc, 0x9422, 0xa0c0, 0x931b, 0x0804, 0x1eab, 0xa0cc, 0x9422,
-	0xa0d0, 0x931b, 0x0804, 0x1eab, 0xa0dc, 0x9422, 0xa0e0, 0x931b,
+	0xa090, 0x931b, 0x2c05, 0x9065, 0x1140, 0x0310, 0x0804, 0x2125,
+	0xa004, 0x9045, 0x0904, 0x2125, 0x08d8, 0x2c05, 0x9005, 0x0904,
+	0x200d, 0xdd9c, 0x1904, 0x1fc9, 0x908a, 0x0036, 0x1a0c, 0x0db4,
+	0x9082, 0x001b, 0x0002, 0x1f9e, 0x1f9e, 0x1fa0, 0x1f9e, 0x1f9e,
+	0x1f9e, 0x1fa6, 0x1f9e, 0x1f9e, 0x1f9e, 0x1fac, 0x1f9e, 0x1f9e,
+	0x1f9e, 0x1fb2, 0x1f9e, 0x1f9e, 0x1f9e, 0x1fb8, 0x1f9e, 0x1f9e,
+	0x1f9e, 0x1fbe, 0x1f9e, 0x1f9e, 0x1f9e, 0x1fc4, 0x080c, 0x0db4,
+	0xa07c, 0x9422, 0xa080, 0x931b, 0x0804, 0x2003, 0xa08c, 0x9422,
+	0xa090, 0x931b, 0x0804, 0x2003, 0xa09c, 0x9422, 0xa0a0, 0x931b,
+	0x0804, 0x2003, 0xa0ac, 0x9422, 0xa0b0, 0x931b, 0x0804, 0x2003,
+	0xa0bc, 0x9422, 0xa0c0, 0x931b, 0x0804, 0x2003, 0xa0cc, 0x9422,
+	0xa0d0, 0x931b, 0x0804, 0x2003, 0xa0dc, 0x9422, 0xa0e0, 0x931b,
 	0x04d0, 0x908a, 0x0034, 0x1a0c, 0x0db4, 0x9082, 0x001b, 0x0002,
-	0x1e93, 0x1e91, 0x1e91, 0x1e91, 0x1e91, 0x1e91, 0x1e98, 0x1e91,
-	0x1e91, 0x1e91, 0x1e91, 0x1e91, 0x1e9d, 0x1e91, 0x1e91, 0x1e91,
-	0x1e91, 0x1e91, 0x1ea2, 0x1e91, 0x1e91, 0x1e91, 0x1e91, 0x1e91,
-	0x1ea7, 0x080c, 0x0db4, 0xa07c, 0x9422, 0xa080, 0x931b, 0x0098,
+	0x1feb, 0x1fe9, 0x1fe9, 0x1fe9, 0x1fe9, 0x1fe9, 0x1ff0, 0x1fe9,
+	0x1fe9, 0x1fe9, 0x1fe9, 0x1fe9, 0x1ff5, 0x1fe9, 0x1fe9, 0x1fe9,
+	0x1fe9, 0x1fe9, 0x1ffa, 0x1fe9, 0x1fe9, 0x1fe9, 0x1fe9, 0x1fe9,
+	0x1fff, 0x080c, 0x0db4, 0xa07c, 0x9422, 0xa080, 0x931b, 0x0098,
 	0xa094, 0x9422, 0xa098, 0x931b, 0x0070, 0xa0ac, 0x9422, 0xa0b0,
 	0x931b, 0x0048, 0xa0c4, 0x9422, 0xa0c8, 0x931b, 0x0020, 0xa0dc,
 	0x9422, 0xa0e0, 0x931b, 0x0630, 0x2300, 0x9405, 0x0160, 0x8a51,
-	0x0904, 0x1fcd, 0x8c60, 0x0804, 0x1e1d, 0xa004, 0x9045, 0x0904,
-	0x1fcd, 0x0804, 0x1e00, 0x8a51, 0x0904, 0x1fcd, 0x8c60, 0x2c05,
-	0x9005, 0x1158, 0xa004, 0x9045, 0x0904, 0x1fcd, 0xa064, 0x90ec,
-	0x000f, 0x9de0, 0x1dd6, 0x2c05, 0x2060, 0xa880, 0xc0fc, 0xa882,
-	0x0804, 0x1fc2, 0x2c05, 0x8422, 0x8420, 0x831a, 0x9399, 0x0000,
-	0xac2e, 0xab32, 0xdd9c, 0x1904, 0x1f5f, 0x9082, 0x001b, 0x0002,
-	0x1efb, 0x1efb, 0x1efd, 0x1efb, 0x1efb, 0x1efb, 0x1f0b, 0x1efb,
-	0x1efb, 0x1efb, 0x1f19, 0x1efb, 0x1efb, 0x1efb, 0x1f27, 0x1efb,
-	0x1efb, 0x1efb, 0x1f35, 0x1efb, 0x1efb, 0x1efb, 0x1f43, 0x1efb,
-	0x1efb, 0x1efb, 0x1f51, 0x080c, 0x0db4, 0xa17c, 0x2400, 0x9122,
+	0x0904, 0x2125, 0x8c60, 0x0804, 0x1f75, 0xa004, 0x9045, 0x0904,
+	0x2125, 0x0804, 0x1f50, 0x8a51, 0x0904, 0x2125, 0x8c60, 0x2c05,
+	0x9005, 0x1158, 0xa004, 0x9045, 0x0904, 0x2125, 0xa064, 0x90ec,
+	0x000f, 0x9de0, 0x1f26, 0x2c05, 0x2060, 0xa880, 0xc0fc, 0xa882,
+	0x0804, 0x211a, 0x2c05, 0x8422, 0x8420, 0x831a, 0x9399, 0x0000,
+	0xac2e, 0xab32, 0xdd9c, 0x1904, 0x20b7, 0x9082, 0x001b, 0x0002,
+	0x2053, 0x2053, 0x2055, 0x2053, 0x2053, 0x2053, 0x2063, 0x2053,
+	0x2053, 0x2053, 0x2071, 0x2053, 0x2053, 0x2053, 0x207f, 0x2053,
+	0x2053, 0x2053, 0x208d, 0x2053, 0x2053, 0x2053, 0x209b, 0x2053,
+	0x2053, 0x2053, 0x20a9, 0x080c, 0x0db4, 0xa17c, 0x2400, 0x9122,
 	0xa180, 0x2300, 0x911b, 0x0a0c, 0x0db4, 0xa074, 0x9420, 0xa078,
-	0x9319, 0x0804, 0x1fbd, 0xa18c, 0x2400, 0x9122, 0xa190, 0x2300,
+	0x9319, 0x0804, 0x2115, 0xa18c, 0x2400, 0x9122, 0xa190, 0x2300,
 	0x911b, 0x0a0c, 0x0db4, 0xa084, 0x9420, 0xa088, 0x9319, 0x0804,
-	0x1fbd, 0xa19c, 0x2400, 0x9122, 0xa1a0, 0x2300, 0x911b, 0x0a0c,
-	0x0db4, 0xa094, 0x9420, 0xa098, 0x9319, 0x0804, 0x1fbd, 0xa1ac,
+	0x2115, 0xa19c, 0x2400, 0x9122, 0xa1a0, 0x2300, 0x911b, 0x0a0c,
+	0x0db4, 0xa094, 0x9420, 0xa098, 0x9319, 0x0804, 0x2115, 0xa1ac,
 	0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0db4, 0xa0a4,
-	0x9420, 0xa0a8, 0x9319, 0x0804, 0x1fbd, 0xa1bc, 0x2400, 0x9122,
+	0x9420, 0xa0a8, 0x9319, 0x0804, 0x2115, 0xa1bc, 0x2400, 0x9122,
 	0xa1c0, 0x2300, 0x911b, 0x0a0c, 0x0db4, 0xa0b4, 0x9420, 0xa0b8,
-	0x9319, 0x0804, 0x1fbd, 0xa1cc, 0x2400, 0x9122, 0xa1d0, 0x2300,
+	0x9319, 0x0804, 0x2115, 0xa1cc, 0x2400, 0x9122, 0xa1d0, 0x2300,
 	0x911b, 0x0a0c, 0x0db4, 0xa0c4, 0x9420, 0xa0c8, 0x9319, 0x0804,
-	0x1fbd, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, 0x0a0c,
-	0x0db4, 0xa0d4, 0x9420, 0xa0d8, 0x9319, 0x0804, 0x1fbd, 0x9082,
-	0x001b, 0x0002, 0x1f7d, 0x1f7b, 0x1f7b, 0x1f7b, 0x1f7b, 0x1f7b,
-	0x1f8a, 0x1f7b, 0x1f7b, 0x1f7b, 0x1f7b, 0x1f7b, 0x1f97, 0x1f7b,
-	0x1f7b, 0x1f7b, 0x1f7b, 0x1f7b, 0x1fa4, 0x1f7b, 0x1f7b, 0x1f7b,
-	0x1f7b, 0x1f7b, 0x1fb1, 0x080c, 0x0db4, 0xa17c, 0x2400, 0x9122,
+	0x2115, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, 0x0a0c,
+	0x0db4, 0xa0d4, 0x9420, 0xa0d8, 0x9319, 0x0804, 0x2115, 0x9082,
+	0x001b, 0x0002, 0x20d5, 0x20d3, 0x20d3, 0x20d3, 0x20d3, 0x20d3,
+	0x20e2, 0x20d3, 0x20d3, 0x20d3, 0x20d3, 0x20d3, 0x20ef, 0x20d3,
+	0x20d3, 0x20d3, 0x20d3, 0x20d3, 0x20fc, 0x20d3, 0x20d3, 0x20d3,
+	0x20d3, 0x20d3, 0x2109, 0x080c, 0x0db4, 0xa17c, 0x2400, 0x9122,
 	0xa180, 0x2300, 0x911b, 0x0a0c, 0x0db4, 0xa06c, 0x9420, 0xa070,
 	0x9319, 0x0498, 0xa194, 0x2400, 0x9122, 0xa198, 0x2300, 0x911b,
 	0x0a0c, 0x0db4, 0xa084, 0x9420, 0xa088, 0x9319, 0x0430, 0xa1ac,
@@ -813,27 +856,27 @@ unsigned short risc_code01[] = { 
 	0xc0fd, 0xa882, 0x2800, 0xa85a, 0x2c00, 0xa812, 0x2a00, 0xa816,
 	0x000e, 0x000e, 0x000e, 0x9006, 0x0028, 0x008e, 0x00de, 0x00ce,
 	0x9085, 0x0001, 0x0005, 0x2001, 0x0005, 0x2004, 0xd0bc, 0x190c,
-	0x0dad, 0x9084, 0x0007, 0x0002, 0x1fee, 0x1c18, 0x1fee, 0x1fe4,
-	0x1fe7, 0x1fea, 0x1fe7, 0x1fea, 0x080c, 0x1c18, 0x0005, 0x080c,
-	0x1186, 0x0005, 0x080c, 0x1c18, 0x080c, 0x1186, 0x0005, 0x0126,
+	0x0dad, 0x9084, 0x0007, 0x0002, 0x2146, 0x1d4a, 0x2146, 0x213c,
+	0x213f, 0x2142, 0x213f, 0x2142, 0x080c, 0x1d4a, 0x0005, 0x080c,
+	0x118f, 0x0005, 0x080c, 0x1d4a, 0x080c, 0x118f, 0x0005, 0x0126,
 	0x2091, 0x2600, 0x2079, 0x0200, 0x2071, 0x0260, 0x2069, 0x1800,
 	0x7817, 0x0000, 0x789b, 0x0814, 0x78a3, 0x0406, 0x789f, 0x0410,
 	0x2009, 0x013b, 0x200b, 0x0400, 0x781b, 0x0002, 0x783b, 0x001f,
 	0x7837, 0x0020, 0x7803, 0x1600, 0x012e, 0x0005, 0x2091, 0x2600,
-	0x781c, 0xd0a4, 0x190c, 0x210d, 0x7900, 0xd1dc, 0x1118, 0x9084,
-	0x0006, 0x001a, 0x9084, 0x000e, 0x0002, 0x2035, 0x202d, 0x7696,
-	0x202d, 0x202f, 0x202f, 0x202f, 0x202f, 0x767c, 0x202d, 0x2031,
-	0x202d, 0x202f, 0x202d, 0x202f, 0x202d, 0x080c, 0x0db4, 0x0031,
-	0x0020, 0x080c, 0x767c, 0x080c, 0x7696, 0x0005, 0x0006, 0x0016,
-	0x0026, 0x080c, 0xd504, 0x7930, 0x9184, 0x0003, 0x01c0, 0x2001,
-	0x19c5, 0x2004, 0x9005, 0x0170, 0x2001, 0x0133, 0x2004, 0x9005,
-	0x090c, 0x0db4, 0x00c6, 0x2001, 0x19c5, 0x2064, 0x080c, 0xb3e0,
-	0x00ce, 0x00f8, 0x2009, 0x0040, 0x080c, 0x2110, 0x00d0, 0x9184,
-	0x0014, 0x01a0, 0x6a00, 0x9286, 0x0003, 0x0160, 0x080c, 0x6d14,
-	0x1138, 0x080c, 0x6ff8, 0x080c, 0x5a94, 0x080c, 0x6c46, 0x0010,
-	0x080c, 0x5953, 0x080c, 0x7734, 0x0041, 0x0018, 0x9184, 0x9540,
+	0x781c, 0xd0a4, 0x190c, 0x2265, 0x7900, 0xd1dc, 0x1118, 0x9084,
+	0x0006, 0x001a, 0x9084, 0x000e, 0x0002, 0x218d, 0x2185, 0x7943,
+	0x2185, 0x2187, 0x2187, 0x2187, 0x2187, 0x7929, 0x2185, 0x2189,
+	0x2185, 0x2187, 0x2185, 0x2187, 0x2185, 0x080c, 0x0db4, 0x0031,
+	0x0020, 0x080c, 0x7929, 0x080c, 0x7943, 0x0005, 0x0006, 0x0016,
+	0x0026, 0x080c, 0xd8b5, 0x7930, 0x9184, 0x0003, 0x01c0, 0x2001,
+	0x19c7, 0x2004, 0x9005, 0x0170, 0x2001, 0x0133, 0x2004, 0x9005,
+	0x090c, 0x0db4, 0x00c6, 0x2001, 0x19c7, 0x2064, 0x080c, 0xb731,
+	0x00ce, 0x00f8, 0x2009, 0x0040, 0x080c, 0x2268, 0x00d0, 0x9184,
+	0x0014, 0x01a0, 0x6a00, 0x9286, 0x0003, 0x0160, 0x080c, 0x6fa7,
+	0x1138, 0x080c, 0x728b, 0x080c, 0x5cca, 0x080c, 0x6ed9, 0x0010,
+	0x080c, 0x5b89, 0x080c, 0x79f2, 0x0041, 0x0018, 0x9184, 0x9540,
 	0x1dc8, 0x002e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x0036, 0x0046,
-	0x0056, 0x2071, 0x1a31, 0x080c, 0x18a6, 0x005e, 0x004e, 0x003e,
+	0x0056, 0x2071, 0x1a33, 0x080c, 0x1958, 0x005e, 0x004e, 0x003e,
 	0x00ee, 0x0005, 0x0126, 0x2091, 0x2e00, 0x2071, 0x1800, 0x7128,
 	0x2001, 0x1940, 0x2102, 0x2001, 0x1948, 0x2102, 0x2001, 0x013b,
 	0x2102, 0x2079, 0x0200, 0x2001, 0x0201, 0x789e, 0x78a3, 0x0200,
@@ -855,162 +898,162 @@ unsigned short risc_code01[] = { 
 	0x00f6, 0x2079, 0x0200, 0x7902, 0xa001, 0xa001, 0xa001, 0xa001,
 	0xa001, 0xa001, 0x7902, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001,
 	0xa001, 0x00fe, 0x0005, 0x0126, 0x2091, 0x2800, 0x2061, 0x0100,
-	0x2071, 0x1800, 0x2009, 0x0000, 0x080c, 0x290b, 0x080c, 0x2826,
+	0x2071, 0x1800, 0x2009, 0x0000, 0x080c, 0x2a63, 0x080c, 0x297e,
 	0x6054, 0x8004, 0x8004, 0x8004, 0x8004, 0x9084, 0x000c, 0x6150,
 	0x918c, 0xfff3, 0x9105, 0x6052, 0x6050, 0x9084, 0xb17f, 0x9085,
-	0x2000, 0x6052, 0x2009, 0x196c, 0x2011, 0x196d, 0x6358, 0x939c,
-	0x38f0, 0x2320, 0x080c, 0x286a, 0x1238, 0x939d, 0x4003, 0x94a5,
+	0x2000, 0x6052, 0x2009, 0x196e, 0x2011, 0x196f, 0x6358, 0x939c,
+	0x38f0, 0x2320, 0x080c, 0x29c2, 0x1238, 0x939d, 0x4003, 0x94a5,
 	0x8603, 0x230a, 0x2412, 0x0030, 0x939d, 0x0203, 0x94a5, 0x8603,
-	0x230a, 0x2412, 0x9006, 0x080c, 0x2855, 0x9006, 0x080c, 0x2838,
-	0x20a9, 0x0012, 0x1d04, 0x2162, 0x2091, 0x6000, 0x1f04, 0x2162,
+	0x230a, 0x2412, 0x9006, 0x080c, 0x29ad, 0x9006, 0x080c, 0x2990,
+	0x20a9, 0x0012, 0x1d04, 0x22ba, 0x2091, 0x6000, 0x1f04, 0x22ba,
 	0x602f, 0x0100, 0x602f, 0x0000, 0x6050, 0x9085, 0x0400, 0x9084,
-	0xdfff, 0x6052, 0x6024, 0x6026, 0x080c, 0x2544, 0x2009, 0x00ef,
-	0x6132, 0x6136, 0x080c, 0x2554, 0x60e7, 0x0000, 0x61ea, 0x60e3,
+	0xdfff, 0x6052, 0x6024, 0x6026, 0x080c, 0x269c, 0x2009, 0x00ef,
+	0x6132, 0x6136, 0x080c, 0x26ac, 0x60e7, 0x0000, 0x61ea, 0x60e3,
 	0x0002, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f, 0x0080, 0x602f,
 	0x0000, 0x6007, 0x149f, 0x60bb, 0x0000, 0x20a9, 0x0018, 0x60bf,
-	0x0000, 0x1f04, 0x218f, 0x60bb, 0x0000, 0x60bf, 0x0108, 0x60bf,
+	0x0000, 0x1f04, 0x22e7, 0x60bb, 0x0000, 0x60bf, 0x0108, 0x60bf,
 	0x0012, 0x60bf, 0x0320, 0x60bf, 0x0018, 0x601b, 0x00f0, 0x601f,
 	0x001e, 0x600f, 0x006b, 0x602b, 0x402f, 0x012e, 0x0005, 0x00f6,
 	0x2079, 0x0140, 0x78c3, 0x0080, 0x78c3, 0x0083, 0x78c3, 0x0000,
 	0x00fe, 0x0005, 0x2001, 0x1834, 0x2003, 0x0000, 0x2001, 0x1833,
 	0x2003, 0x0001, 0x0005, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016,
 	0x0026, 0x6124, 0x9184, 0x5e2c, 0x1118, 0x9184, 0x0007, 0x002a,
-	0x9195, 0x0004, 0x9284, 0x0007, 0x0002, 0x21ef, 0x21d5, 0x21d8,
-	0x21db, 0x21e0, 0x21e2, 0x21e6, 0x21ea, 0x080c, 0x7ff8, 0x00b8,
-	0x080c, 0x80c5, 0x00a0, 0x080c, 0x80c5, 0x080c, 0x7ff8, 0x0078,
-	0x0099, 0x0068, 0x080c, 0x7ff8, 0x0079, 0x0048, 0x080c, 0x80c5,
-	0x0059, 0x0028, 0x080c, 0x80c5, 0x080c, 0x7ff8, 0x0029, 0x002e,
+	0x9195, 0x0004, 0x9284, 0x0007, 0x0002, 0x2347, 0x232d, 0x2330,
+	0x2333, 0x2338, 0x233a, 0x233e, 0x2342, 0x080c, 0x82b5, 0x00b8,
+	0x080c, 0x8382, 0x00a0, 0x080c, 0x8382, 0x080c, 0x82b5, 0x0078,
+	0x0099, 0x0068, 0x080c, 0x82b5, 0x0079, 0x0048, 0x080c, 0x8382,
+	0x0059, 0x0028, 0x080c, 0x8382, 0x080c, 0x82b5, 0x0029, 0x002e,
 	0x001e, 0x000e, 0x012e, 0x0005, 0x00a6, 0x6124, 0x6028, 0xd09c,
-	0x0118, 0xd19c, 0x1904, 0x243d, 0xd1f4, 0x190c, 0x0dad, 0x080c,
-	0x6d14, 0x0904, 0x224a, 0x080c, 0xbe86, 0x1120, 0x7000, 0x9086,
-	0x0003, 0x0570, 0x6024, 0x9084, 0x1800, 0x0550, 0x080c, 0x6d37,
-	0x0118, 0x080c, 0x6d25, 0x1520, 0x6027, 0x0020, 0x6043, 0x0000,
-	0x080c, 0xbe86, 0x0168, 0x080c, 0x6d37, 0x1150, 0x2001, 0x1976,
-	0x2003, 0x0001, 0x6027, 0x1800, 0x080c, 0x6b95, 0x0804, 0x2440,
+	0x0118, 0xd19c, 0x1904, 0x2595, 0xd1f4, 0x190c, 0x0dad, 0x080c,
+	0x6fa7, 0x0904, 0x23a2, 0x080c, 0xc1f9, 0x1120, 0x7000, 0x9086,
+	0x0003, 0x0570, 0x6024, 0x9084, 0x1800, 0x0550, 0x080c, 0x6fca,
+	0x0118, 0x080c, 0x6fb8, 0x1520, 0x6027, 0x0020, 0x6043, 0x0000,
+	0x080c, 0xc1f9, 0x0168, 0x080c, 0x6fca, 0x1150, 0x2001, 0x1978,
+	0x2003, 0x0001, 0x6027, 0x1800, 0x080c, 0x6e28, 0x0804, 0x2598,
 	0x70a0, 0x9005, 0x1150, 0x70a3, 0x0001, 0x00d6, 0x2069, 0x0140,
-	0x080c, 0x6d6b, 0x00de, 0x1904, 0x2440, 0x080c, 0x7002, 0x0428,
-	0x080c, 0x6d37, 0x1590, 0x6024, 0x9084, 0x1800, 0x1108, 0x0468,
-	0x080c, 0x7002, 0x080c, 0x6ff8, 0x080c, 0x5a94, 0x080c, 0x6c46,
-	0x0804, 0x243d, 0xd1ac, 0x1508, 0x6024, 0xd0dc, 0x1170, 0xd0e4,
+	0x080c, 0x6ffe, 0x00de, 0x1904, 0x2598, 0x080c, 0x7295, 0x0428,
+	0x080c, 0x6fca, 0x1590, 0x6024, 0x9084, 0x1800, 0x1108, 0x0468,
+	0x080c, 0x7295, 0x080c, 0x728b, 0x080c, 0x5cca, 0x080c, 0x6ed9,
+	0x0804, 0x2595, 0xd1ac, 0x1508, 0x6024, 0xd0dc, 0x1170, 0xd0e4,
 	0x1178, 0xd0d4, 0x1190, 0xd0cc, 0x0130, 0x7094, 0x9086, 0x0028,
-	0x1110, 0x080c, 0x6ee7, 0x0804, 0x243d, 0x080c, 0x6ffd, 0x0048,
-	0x2001, 0x194e, 0x2003, 0x0002, 0x0020, 0x080c, 0x6e4d, 0x0804,
-	0x243d, 0x080c, 0x6f81, 0x0804, 0x243d, 0xd1ac, 0x0904, 0x235e,
-	0x080c, 0x6d14, 0x11c0, 0x6027, 0x0020, 0x0006, 0x0026, 0x0036,
-	0x080c, 0x6d2e, 0x1158, 0x080c, 0x6ff8, 0x080c, 0x5a94, 0x080c,
-	0x6c46, 0x003e, 0x002e, 0x000e, 0x00ae, 0x0005, 0x003e, 0x002e,
-	0x000e, 0x080c, 0x6cec, 0x0016, 0x0046, 0x00c6, 0x644c, 0x9486,
+	0x1110, 0x080c, 0x717a, 0x0804, 0x2595, 0x080c, 0x7290, 0x0048,
+	0x2001, 0x194e, 0x2003, 0x0002, 0x0020, 0x080c, 0x70e0, 0x0804,
+	0x2595, 0x080c, 0x7214, 0x0804, 0x2595, 0xd1ac, 0x0904, 0x24b6,
+	0x080c, 0x6fa7, 0x11c0, 0x6027, 0x0020, 0x0006, 0x0026, 0x0036,
+	0x080c, 0x6fc1, 0x1158, 0x080c, 0x728b, 0x080c, 0x5cca, 0x080c,
+	0x6ed9, 0x003e, 0x002e, 0x000e, 0x00ae, 0x0005, 0x003e, 0x002e,
+	0x000e, 0x080c, 0x6f7f, 0x0016, 0x0046, 0x00c6, 0x644c, 0x9486,
 	0xf0f0, 0x1138, 0x2061, 0x0100, 0x644a, 0x6043, 0x0090, 0x6043,
 	0x0010, 0x74d6, 0x948c, 0xff00, 0x7038, 0xd084, 0x0178, 0x9186,
 	0xf800, 0x1160, 0x7044, 0xd084, 0x1148, 0xc085, 0x7046, 0x0036,
-	0x2418, 0x2011, 0x8016, 0x080c, 0x46b9, 0x003e, 0x080c, 0xbe7f,
-	0x1904, 0x233b, 0x9196, 0xff00, 0x05a8, 0x705c, 0x9084, 0x00ff,
+	0x2418, 0x2011, 0x8016, 0x080c, 0x48d2, 0x003e, 0x080c, 0xc1f2,
+	0x1904, 0x2493, 0x9196, 0xff00, 0x05a8, 0x705c, 0x9084, 0x00ff,
 	0x810f, 0x81ff, 0x0110, 0x9116, 0x0568, 0x7130, 0xd184, 0x1550,
-	0x080c, 0x2fd4, 0x0128, 0xc18d, 0x7132, 0x080c, 0x630d, 0x1510,
+	0x080c, 0x312c, 0x0128, 0xc18d, 0x7132, 0x080c, 0x6553, 0x1510,
 	0x6240, 0x9294, 0x0010, 0x0130, 0x6248, 0x9294, 0xff00, 0x9296,
-	0xff00, 0x01c0, 0x7030, 0xd08c, 0x0904, 0x233b, 0x7038, 0xd08c,
-	0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, 0x233b, 0xc1ad,
-	0x2102, 0x0036, 0x73d4, 0x2011, 0x8013, 0x080c, 0x46b9, 0x003e,
-	0x0804, 0x233b, 0x7038, 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c,
-	0xd1ac, 0x1904, 0x233b, 0xc1ad, 0x2102, 0x0036, 0x73d4, 0x2011,
-	0x8013, 0x080c, 0x46b9, 0x003e, 0x7130, 0xc185, 0x7132, 0x2011,
+	0xff00, 0x01c0, 0x7030, 0xd08c, 0x0904, 0x2493, 0x7038, 0xd08c,
+	0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, 0x2493, 0xc1ad,
+	0x2102, 0x0036, 0x73d4, 0x2011, 0x8013, 0x080c, 0x48d2, 0x003e,
+	0x0804, 0x2493, 0x7038, 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c,
+	0xd1ac, 0x1904, 0x2493, 0xc1ad, 0x2102, 0x0036, 0x73d4, 0x2011,
+	0x8013, 0x080c, 0x48d2, 0x003e, 0x7130, 0xc185, 0x7132, 0x2011,
 	0x1854, 0x220c, 0x00f0, 0x0016, 0x2009, 0x0001, 0x2011, 0x0100,
-	0x080c, 0x7f4a, 0x2019, 0x000e, 0x00c6, 0x2061, 0x0000, 0x080c,
-	0xd104, 0x00ce, 0x9484, 0x00ff, 0x9080, 0x2fd9, 0x200d, 0x918c,
-	0xff00, 0x810f, 0x2120, 0x9006, 0x2009, 0x000e, 0x080c, 0xd188,
+	0x080c, 0x8207, 0x2019, 0x000e, 0x00c6, 0x2061, 0x0000, 0x080c,
+	0xd486, 0x00ce, 0x9484, 0x00ff, 0x9080, 0x3131, 0x200d, 0x918c,
+	0xff00, 0x810f, 0x2120, 0x9006, 0x2009, 0x000e, 0x080c, 0xd50a,
 	0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0002, 0x2019, 0x0004,
-	0x080c, 0x2e4a, 0x001e, 0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f,
-	0x900e, 0x080c, 0x5ff1, 0x1110, 0x080c, 0x5aae, 0x8108, 0x1f04,
-	0x2331, 0x00be, 0x015e, 0x00ce, 0x004e, 0x080c, 0x9a4e, 0x60e3,
+	0x080c, 0x2fa2, 0x001e, 0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f,
+	0x900e, 0x080c, 0x6237, 0x1110, 0x080c, 0x5ce4, 0x8108, 0x1f04,
+	0x2489, 0x00be, 0x015e, 0x00ce, 0x004e, 0x080c, 0x9d9f, 0x60e3,
 	0x0000, 0x001e, 0x2001, 0x1800, 0x2014, 0x9296, 0x0004, 0x1170,
 	0xd19c, 0x11a0, 0x2011, 0x180c, 0x2214, 0xd29c, 0x1120, 0x6204,
 	0x9295, 0x0002, 0x6206, 0x6228, 0xc29d, 0x622a, 0x2003, 0x0001,
 	0x2001, 0x1825, 0x2003, 0x0000, 0x6027, 0x0020, 0xd194, 0x0904,
-	0x243d, 0x0016, 0x6220, 0xd2b4, 0x0904, 0x23e6, 0x080c, 0x7dd3,
-	0x080c, 0x90c1, 0x6027, 0x0004, 0x00f6, 0x2019, 0x19bf, 0x2304,
-	0x907d, 0x0904, 0x23b5, 0x7804, 0x9086, 0x0032, 0x15f0, 0x00d6,
+	0x2595, 0x0016, 0x6220, 0xd2b4, 0x0904, 0x253e, 0x080c, 0x8090,
+	0x080c, 0x9393, 0x6027, 0x0004, 0x00f6, 0x2019, 0x19c1, 0x2304,
+	0x907d, 0x0904, 0x250d, 0x7804, 0x9086, 0x0032, 0x15f0, 0x00d6,
 	0x00c6, 0x00e6, 0x0096, 0x2069, 0x0140, 0x782c, 0x685e, 0x7808,
 	0x685a, 0x6043, 0x0002, 0x2001, 0x0003, 0x8001, 0x1df0, 0x6043,
-	0x0000, 0x2001, 0x003c, 0x8001, 0x1df0, 0x080c, 0x29cc, 0x2001,
-	0x001e, 0x8001, 0x0240, 0x20a9, 0x0009, 0x080c, 0x28e6, 0x6904,
-	0xd1dc, 0x1140, 0x0cb0, 0x2001, 0x0100, 0x080c, 0x29bc, 0x9006,
-	0x080c, 0x29bc, 0x080c, 0x8589, 0x080c, 0x868e, 0x7814, 0x2048,
-	0xa867, 0x0103, 0x2f60, 0x080c, 0x9ac8, 0x009e, 0x00ee, 0x00ce,
+	0x0000, 0x2001, 0x003c, 0x8001, 0x1df0, 0x080c, 0x2b24, 0x2001,
+	0x001e, 0x8001, 0x0240, 0x20a9, 0x0009, 0x080c, 0x2a3e, 0x6904,
+	0xd1dc, 0x1140, 0x0cb0, 0x2001, 0x0100, 0x080c, 0x2b14, 0x9006,
+	0x080c, 0x2b14, 0x080c, 0x8846, 0x080c, 0x894b, 0x7814, 0x2048,
+	0xa867, 0x0103, 0x2f60, 0x080c, 0x9e19, 0x009e, 0x00ee, 0x00ce,
 	0x00de, 0x00fe, 0x001e, 0x00ae, 0x0005, 0x00fe, 0x00d6, 0x2069,
-	0x0140, 0x6804, 0x9084, 0x4000, 0x0110, 0x080c, 0x29cc, 0x00de,
-	0x00c6, 0x2061, 0x19b6, 0x6028, 0x080c, 0xbe86, 0x0120, 0x909a,
+	0x0140, 0x6804, 0x9084, 0x4000, 0x0110, 0x080c, 0x2b24, 0x00de,
+	0x00c6, 0x2061, 0x19b8, 0x6028, 0x080c, 0xc1f9, 0x0120, 0x909a,
 	0x0003, 0x1258, 0x0018, 0x909a, 0x00c8, 0x1238, 0x8000, 0x602a,
-	0x00ce, 0x080c, 0x909d, 0x0804, 0x243c, 0x2061, 0x0100, 0x62c0,
-	0x080c, 0x98d9, 0x2019, 0x19bf, 0x2304, 0x9065, 0x0120, 0x2009,
-	0x0027, 0x080c, 0x9b42, 0x00ce, 0x0804, 0x243c, 0xd2bc, 0x0904,
-	0x2429, 0x080c, 0x7de0, 0x6014, 0x9084, 0x1984, 0x9085, 0x0010,
+	0x00ce, 0x080c, 0x936f, 0x0804, 0x2594, 0x2061, 0x0100, 0x62c0,
+	0x080c, 0x9c2a, 0x2019, 0x19c1, 0x2304, 0x9065, 0x0120, 0x2009,
+	0x0027, 0x080c, 0x9e93, 0x00ce, 0x0804, 0x2594, 0xd2bc, 0x0904,
+	0x2581, 0x080c, 0x809d, 0x6014, 0x9084, 0x1984, 0x9085, 0x0010,
 	0x6016, 0x6027, 0x0004, 0x00d6, 0x2069, 0x0140, 0x6804, 0x9084,
-	0x4000, 0x0110, 0x080c, 0x29cc, 0x00de, 0x00c6, 0x2061, 0x19b6,
-	0x6044, 0x080c, 0xbe86, 0x0120, 0x909a, 0x0003, 0x1628, 0x0018,
+	0x4000, 0x0110, 0x080c, 0x2b24, 0x00de, 0x00c6, 0x2061, 0x19b8,
+	0x6044, 0x080c, 0xc1f9, 0x0120, 0x909a, 0x0003, 0x1628, 0x0018,
 	0x909a, 0x00c8, 0x1608, 0x8000, 0x6046, 0x603c, 0x00ce, 0x9005,
-	0x0558, 0x2009, 0x07d0, 0x080c, 0x7dd8, 0x9080, 0x0008, 0x2004,
+	0x0558, 0x2009, 0x07d0, 0x080c, 0x8095, 0x9080, 0x0008, 0x2004,
 	0x9086, 0x0006, 0x1138, 0x6114, 0x918c, 0x1984, 0x918d, 0x0012,
 	0x6116, 0x00d0, 0x6114, 0x918c, 0x1984, 0x918d, 0x0016, 0x6116,
 	0x0098, 0x6027, 0x0004, 0x0080, 0x0036, 0x2019, 0x0001, 0x080c,
-	0x935a, 0x003e, 0x2019, 0x19c5, 0x2304, 0x9065, 0x0120, 0x2009,
-	0x004f, 0x080c, 0x9b42, 0x00ce, 0x001e, 0xd19c, 0x0904, 0x24af,
-	0x7038, 0xd0ac, 0x1904, 0x2484, 0x0016, 0x0156, 0x6027, 0x0008,
+	0x96bf, 0x003e, 0x2019, 0x19c7, 0x2304, 0x9065, 0x0120, 0x2009,
+	0x004f, 0x080c, 0x9e93, 0x00ce, 0x001e, 0xd19c, 0x0904, 0x2607,
+	0x7038, 0xd0ac, 0x1904, 0x25dc, 0x0016, 0x0156, 0x6027, 0x0008,
 	0x6050, 0x9085, 0x0040, 0x6052, 0x6050, 0x9084, 0xfbcf, 0x6052,
-	0x080c, 0x2905, 0x9085, 0x2000, 0x6052, 0x20a9, 0x0012, 0x1d04,
-	0x2457, 0x080c, 0x7e07, 0x1f04, 0x2457, 0x6050, 0x9085, 0x0400,
-	0x9084, 0xdfbf, 0x6052, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x2465,
-	0x6150, 0x9185, 0x1400, 0x6052, 0x20a9, 0x0366, 0x1d04, 0x246e,
-	0x080c, 0x7e07, 0x6020, 0xd09c, 0x1130, 0x015e, 0x6152, 0x001e,
-	0x6027, 0x0008, 0x04a0, 0x080c, 0x28cd, 0x1f04, 0x246e, 0x015e,
+	0x080c, 0x2a5d, 0x9085, 0x2000, 0x6052, 0x20a9, 0x0012, 0x1d04,
+	0x25af, 0x080c, 0x80c4, 0x1f04, 0x25af, 0x6050, 0x9085, 0x0400,
+	0x9084, 0xdfbf, 0x6052, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x25bd,
+	0x6150, 0x9185, 0x1400, 0x6052, 0x20a9, 0x0366, 0x1d04, 0x25c6,
+	0x080c, 0x80c4, 0x6020, 0xd09c, 0x1130, 0x015e, 0x6152, 0x001e,
+	0x6027, 0x0008, 0x04a0, 0x080c, 0x2a25, 0x1f04, 0x25c6, 0x015e,
 	0x6152, 0x001e, 0x6027, 0x0008, 0x0016, 0x6028, 0xc09c, 0x602a,
-	0x080c, 0x9a4e, 0x60e3, 0x0000, 0x080c, 0xd4e3, 0x080c, 0xd4fe,
-	0x080c, 0x5157, 0xd0fc, 0x1138, 0x080c, 0xbe7f, 0x1120, 0x9085,
-	0x0001, 0x080c, 0x6d5b, 0x9006, 0x080c, 0x29bc, 0x2009, 0x0002,
-	0x080c, 0x290b, 0x00e6, 0x2071, 0x1800, 0x7003, 0x0004, 0x080c,
+	0x080c, 0x9d9f, 0x60e3, 0x0000, 0x080c, 0xd894, 0x080c, 0xd8af,
+	0x080c, 0x5383, 0xd0fc, 0x1138, 0x080c, 0xc1f2, 0x1120, 0x9085,
+	0x0001, 0x080c, 0x6fee, 0x9006, 0x080c, 0x2b14, 0x2009, 0x0002,
+	0x080c, 0x2a63, 0x00e6, 0x2071, 0x1800, 0x7003, 0x0004, 0x080c,
 	0x0e80, 0x00ee, 0x6027, 0x0008, 0x080c, 0x0b8f, 0x001e, 0x918c,
 	0xffd0, 0x6126, 0x00ae, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036,
 	0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x71cc,
-	0x70ce, 0x9116, 0x0904, 0x2503, 0x81ff, 0x01a0, 0x2009, 0x0000,
-	0x080c, 0x290b, 0x2011, 0x8011, 0x2019, 0x010e, 0x231c, 0x939e,
+	0x70ce, 0x9116, 0x0904, 0x265b, 0x81ff, 0x01a0, 0x2009, 0x0000,
+	0x080c, 0x2a63, 0x2011, 0x8011, 0x2019, 0x010e, 0x231c, 0x939e,
 	0x0007, 0x1118, 0x2019, 0x0001, 0x0010, 0x2019, 0x0000, 0x080c,
-	0x46b9, 0x0448, 0x2001, 0x1977, 0x200c, 0x81ff, 0x1140, 0x2001,
+	0x48d2, 0x0448, 0x2001, 0x1979, 0x200c, 0x81ff, 0x1140, 0x2001,
 	0x0109, 0x2004, 0xd0b4, 0x0118, 0x2019, 0x0003, 0x0008, 0x2118,
-	0x2011, 0x8012, 0x080c, 0x46b9, 0x080c, 0x0e80, 0x080c, 0x5157,
-	0xd0fc, 0x1188, 0x080c, 0xbe7f, 0x1170, 0x00c6, 0x080c, 0x259f,
-	0x080c, 0x92c1, 0x2061, 0x0100, 0x2019, 0x0028, 0x2009, 0x0002,
-	0x080c, 0x2e4a, 0x00ce, 0x012e, 0x00fe, 0x00ee, 0x003e, 0x002e,
+	0x2011, 0x8012, 0x080c, 0x48d2, 0x080c, 0x0e80, 0x080c, 0x5383,
+	0xd0fc, 0x1188, 0x080c, 0xc1f2, 0x1170, 0x00c6, 0x080c, 0x26f7,
+	0x080c, 0x9626, 0x2061, 0x0100, 0x2019, 0x0028, 0x2009, 0x0002,
+	0x080c, 0x2fa2, 0x00ce, 0x012e, 0x00fe, 0x00ee, 0x003e, 0x002e,
 	0x001e, 0x000e, 0x0005, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094,
 	0xff00, 0x11f0, 0x2011, 0x1836, 0x2214, 0xd2ac, 0x11c8, 0x81ff,
 	0x01e8, 0x2011, 0x181e, 0x2204, 0x9106, 0x1190, 0x2011, 0x181f,
 	0x2214, 0x9294, 0xff00, 0x9584, 0xff00, 0x9206, 0x1148, 0x2011,
 	0x181f, 0x2214, 0x9294, 0x00ff, 0x9584, 0x00ff, 0x9206, 0x1120,
-	0x2500, 0x080c, 0x7975, 0x0048, 0x9584, 0x00ff, 0x9080, 0x2fd9,
-	0x200d, 0x918c, 0xff00, 0x810f, 0x9006, 0x0005, 0x9080, 0x2fd9,
+	0x2500, 0x080c, 0x7c2f, 0x0048, 0x9584, 0x00ff, 0x9080, 0x3131,
+	0x200d, 0x918c, 0xff00, 0x810f, 0x9006, 0x0005, 0x9080, 0x3131,
 	0x200d, 0x918c, 0x00ff, 0x0005, 0x00d6, 0x2069, 0x0140, 0x2001,
 	0x1817, 0x2003, 0x00ef, 0x20a9, 0x0010, 0x9006, 0x6852, 0x6856,
-	0x1f04, 0x254f, 0x00de, 0x0005, 0x0006, 0x00d6, 0x0026, 0x2069,
+	0x1f04, 0x26a7, 0x00de, 0x0005, 0x0006, 0x00d6, 0x0026, 0x2069,
 	0x0140, 0x2001, 0x1817, 0x2102, 0x8114, 0x8214, 0x8214, 0x8214,
 	0x20a9, 0x0010, 0x6853, 0x0000, 0x9006, 0x82ff, 0x1128, 0x9184,
-	0x000f, 0x9080, 0xd9b8, 0x2005, 0x6856, 0x8211, 0x1f04, 0x2564,
+	0x000f, 0x9080, 0xdd69, 0x2005, 0x6856, 0x8211, 0x1f04, 0x26bc,
 	0x002e, 0x00de, 0x000e, 0x0005, 0x00c6, 0x2061, 0x1800, 0x6030,
 	0x0110, 0xc09d, 0x0008, 0xc09c, 0x6032, 0x00ce, 0x0005, 0x0156,
 	0x00d6, 0x0026, 0x0016, 0x0006, 0x2069, 0x0140, 0x6980, 0x9116,
 	0x0180, 0x9112, 0x1230, 0x8212, 0x8210, 0x22a8, 0x2001, 0x0402,
-	0x0018, 0x22a8, 0x2001, 0x0404, 0x680e, 0x1f04, 0x2594, 0x680f,
+	0x0018, 0x22a8, 0x2001, 0x0404, 0x680e, 0x1f04, 0x26ec, 0x680f,
 	0x0000, 0x000e, 0x001e, 0x002e, 0x00de, 0x015e, 0x0005, 0x080c,
-	0x5153, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006, 0x0046, 0x2020,
-	0x2009, 0x002e, 0x080c, 0xd188, 0x004e, 0x0005, 0x00f6, 0x0016,
-	0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, 0x0904, 0x260b, 0x080c,
-	0x286a, 0x0660, 0x9084, 0x0700, 0x908e, 0x0600, 0x1120, 0x2011,
+	0x537f, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006, 0x0046, 0x2020,
+	0x2009, 0x002e, 0x080c, 0xd50a, 0x004e, 0x0005, 0x00f6, 0x0016,
+	0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, 0x0904, 0x2763, 0x080c,
+	0x29c2, 0x0660, 0x9084, 0x0700, 0x908e, 0x0600, 0x1120, 0x2011,
 	0x4000, 0x900e, 0x0458, 0x908e, 0x0500, 0x1120, 0x2011, 0x8000,
 	0x900e, 0x0420, 0x908e, 0x0400, 0x1120, 0x9016, 0x2009, 0x0001,
 	0x00e8, 0x908e, 0x0300, 0x1120, 0x9016, 0x2009, 0x0002, 0x00b0,
 	0x908e, 0x0200, 0x1120, 0x9016, 0x2009, 0x0004, 0x0078, 0x908e,
 	0x0100, 0x1548, 0x9016, 0x2009, 0x0008, 0x0040, 0x9084, 0x0700,
 	0x908e, 0x0300, 0x1500, 0x2011, 0x0030, 0x0058, 0x2300, 0x9080,
-	0x0020, 0x2018, 0x080c, 0x7f8b, 0x928c, 0xff00, 0x0110, 0x2011,
+	0x0020, 0x2018, 0x080c, 0x8248, 0x928c, 0xff00, 0x0110, 0x2011,
 	0x00ff, 0x2200, 0x8007, 0x9085, 0x004c, 0x78c2, 0x2009, 0x0138,
-	0x220a, 0x080c, 0x6d14, 0x1118, 0x2009, 0x193e, 0x220a, 0x002e,
+	0x220a, 0x080c, 0x6fa7, 0x1118, 0x2009, 0x193e, 0x220a, 0x002e,
 	0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, 0x0cc8, 0x0126, 0x2091,
 	0x2800, 0x0006, 0x0016, 0x0026, 0x2001, 0x0170, 0x200c, 0x8000,
 	0x2014, 0x9184, 0x0003, 0x0110, 0x080c, 0x0dad, 0x002e, 0x001e,
@@ -1020,94 +1063,94 @@ unsigned short risc_code01[] = { 
 	0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9108, 0x2001, 0x0226,
 	0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9108, 0x0005, 0x0018,
 	0x000c, 0x0018, 0x0020, 0x1000, 0x0800, 0x1000, 0x1800, 0x0156,
-	0x0006, 0x0016, 0x0026, 0x00e6, 0x2001, 0x195f, 0x2004, 0x908a,
+	0x0006, 0x0016, 0x0026, 0x00e6, 0x2001, 0x1961, 0x2004, 0x908a,
 	0x0007, 0x1a0c, 0x0db4, 0x0033, 0x00ee, 0x002e, 0x001e, 0x000e,
-	0x015e, 0x0005, 0x2669, 0x2687, 0x26ab, 0x26ad, 0x26d6, 0x26d8,
-	0x26da, 0x2001, 0x0001, 0x080c, 0x24b4, 0x080c, 0x28c8, 0x2001,
-	0x1961, 0x2003, 0x0000, 0x7828, 0x9084, 0xe1d7, 0x782a, 0x9006,
-	0x20a9, 0x0009, 0x080c, 0x2886, 0x2001, 0x195f, 0x2003, 0x0006,
-	0x2009, 0x001e, 0x2011, 0x26db, 0x080c, 0x7de5, 0x0005, 0x2009,
-	0x1964, 0x200b, 0x0000, 0x2001, 0x1969, 0x2003, 0x0036, 0x2001,
-	0x1968, 0x2003, 0x002a, 0x2001, 0x1961, 0x2003, 0x0001, 0x9006,
-	0x080c, 0x2838, 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, 0x2886,
-	0x2001, 0x195f, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x26db,
-	0x080c, 0x7de5, 0x0005, 0x080c, 0x0db4, 0x2001, 0x1969, 0x2003,
-	0x0036, 0x2001, 0x1961, 0x2003, 0x0003, 0x7a38, 0x9294, 0x0005,
+	0x015e, 0x0005, 0x27c1, 0x27df, 0x2803, 0x2805, 0x282e, 0x2830,
+	0x2832, 0x2001, 0x0001, 0x080c, 0x260c, 0x080c, 0x2a20, 0x2001,
+	0x1963, 0x2003, 0x0000, 0x7828, 0x9084, 0xe1d7, 0x782a, 0x9006,
+	0x20a9, 0x0009, 0x080c, 0x29de, 0x2001, 0x1961, 0x2003, 0x0006,
+	0x2009, 0x001e, 0x2011, 0x2833, 0x080c, 0x80a2, 0x0005, 0x2009,
+	0x1966, 0x200b, 0x0000, 0x2001, 0x196b, 0x2003, 0x0036, 0x2001,
+	0x196a, 0x2003, 0x002a, 0x2001, 0x1963, 0x2003, 0x0001, 0x9006,
+	0x080c, 0x2990, 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, 0x29de,
+	0x2001, 0x1961, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x2833,
+	0x080c, 0x80a2, 0x0005, 0x080c, 0x0db4, 0x2001, 0x196b, 0x2003,
+	0x0036, 0x2001, 0x1963, 0x2003, 0x0003, 0x7a38, 0x9294, 0x0005,
 	0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c,
-	0x2838, 0x2001, 0x1965, 0x2003, 0x0000, 0x2001, 0xffff, 0x20a9,
-	0x0009, 0x080c, 0x2886, 0x2001, 0x195f, 0x2003, 0x0006, 0x2009,
-	0x001e, 0x2011, 0x26db, 0x080c, 0x7de5, 0x0005, 0x080c, 0x0db4,
+	0x2990, 0x2001, 0x1967, 0x2003, 0x0000, 0x2001, 0xffff, 0x20a9,
+	0x0009, 0x080c, 0x29de, 0x2001, 0x1961, 0x2003, 0x0006, 0x2009,
+	0x001e, 0x2011, 0x2833, 0x080c, 0x80a2, 0x0005, 0x080c, 0x0db4,
 	0x080c, 0x0db4, 0x0005, 0x0006, 0x0016, 0x0026, 0x00e6, 0x00f6,
-	0x0156, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, 0x2001, 0x1961,
+	0x0156, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, 0x2001, 0x1963,
 	0x2004, 0x908a, 0x0007, 0x1a0c, 0x0db4, 0x0043, 0x012e, 0x015e,
-	0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, 0x0005, 0x26fd, 0x271d,
-	0x275d, 0x278d, 0x27b1, 0x27c1, 0x27c3, 0x080c, 0x287a, 0x11b0,
-	0x7850, 0x9084, 0xefff, 0x7852, 0x2009, 0x1967, 0x2104, 0x7a38,
+	0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, 0x0005, 0x2855, 0x2875,
+	0x28b5, 0x28e5, 0x2909, 0x2919, 0x291b, 0x080c, 0x29d2, 0x11b0,
+	0x7850, 0x9084, 0xefff, 0x7852, 0x2009, 0x1969, 0x2104, 0x7a38,
 	0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0xc08d, 0x0008, 0xc085,
-	0x200a, 0x2001, 0x195f, 0x2003, 0x0001, 0x0030, 0x080c, 0x27e7,
-	0x2001, 0xffff, 0x080c, 0x2678, 0x0005, 0x080c, 0x27c5, 0x05e0,
-	0x2009, 0x1968, 0x2104, 0x8001, 0x200a, 0x080c, 0x287a, 0x1178,
+	0x200a, 0x2001, 0x1961, 0x2003, 0x0001, 0x0030, 0x080c, 0x293f,
+	0x2001, 0xffff, 0x080c, 0x27d0, 0x0005, 0x080c, 0x291d, 0x05e0,
+	0x2009, 0x196a, 0x2104, 0x8001, 0x200a, 0x080c, 0x29d2, 0x1178,
 	0x7850, 0x9084, 0xefff, 0x7852, 0x7a38, 0x9294, 0x0005, 0x9296,
-	0x0005, 0x0518, 0x2009, 0x1967, 0x2104, 0xc085, 0x200a, 0x2009,
-	0x1964, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005, 0x0118, 0x080c,
-	0x27cd, 0x00c0, 0x200b, 0x0000, 0x7a38, 0x9294, 0x0006, 0x9296,
-	0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2855,
-	0x2001, 0x1961, 0x2003, 0x0002, 0x0028, 0x2001, 0x195f, 0x2003,
-	0x0003, 0x0010, 0x080c, 0x269a, 0x0005, 0x080c, 0x27c5, 0x0560,
-	0x2009, 0x1968, 0x2104, 0x8001, 0x200a, 0x080c, 0x287a, 0x1168,
-	0x7850, 0x9084, 0xefff, 0x7852, 0x2001, 0x195f, 0x2003, 0x0003,
-	0x2001, 0x1960, 0x2003, 0x0000, 0x00b8, 0x2009, 0x1968, 0x2104,
-	0x9005, 0x1118, 0x080c, 0x280a, 0x0010, 0x080c, 0x27da, 0x080c,
-	0x27cd, 0x2009, 0x1964, 0x200b, 0x0000, 0x2001, 0x1961, 0x2003,
-	0x0001, 0x080c, 0x269a, 0x0000, 0x0005, 0x04b9, 0x0508, 0x080c,
-	0x287a, 0x11b8, 0x7850, 0x9084, 0xefff, 0x7852, 0x2009, 0x1965,
+	0x0005, 0x0518, 0x2009, 0x1969, 0x2104, 0xc085, 0x200a, 0x2009,
+	0x1966, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005, 0x0118, 0x080c,
+	0x2925, 0x00c0, 0x200b, 0x0000, 0x7a38, 0x9294, 0x0006, 0x9296,
+	0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x29ad,
+	0x2001, 0x1963, 0x2003, 0x0002, 0x0028, 0x2001, 0x1961, 0x2003,
+	0x0003, 0x0010, 0x080c, 0x27f2, 0x0005, 0x080c, 0x291d, 0x0560,
+	0x2009, 0x196a, 0x2104, 0x8001, 0x200a, 0x080c, 0x29d2, 0x1168,
+	0x7850, 0x9084, 0xefff, 0x7852, 0x2001, 0x1961, 0x2003, 0x0003,
+	0x2001, 0x1962, 0x2003, 0x0000, 0x00b8, 0x2009, 0x196a, 0x2104,
+	0x9005, 0x1118, 0x080c, 0x2962, 0x0010, 0x080c, 0x2932, 0x080c,
+	0x2925, 0x2009, 0x1966, 0x200b, 0x0000, 0x2001, 0x1963, 0x2003,
+	0x0001, 0x080c, 0x27f2, 0x0000, 0x0005, 0x04b9, 0x0508, 0x080c,
+	0x29d2, 0x11b8, 0x7850, 0x9084, 0xefff, 0x7852, 0x2009, 0x1967,
 	0x2104, 0x8000, 0x200a, 0x9086, 0x0007, 0x0108, 0x0078, 0x2001,
-	0x196a, 0x2003, 0x000a, 0x2009, 0x1967, 0x2104, 0xc0fd, 0x200a,
-	0x0038, 0x0419, 0x2001, 0x1961, 0x2003, 0x0004, 0x080c, 0x26c5,
-	0x0005, 0x0099, 0x0168, 0x080c, 0x287a, 0x1138, 0x7850, 0x9084,
-	0xefff, 0x7852, 0x080c, 0x26b1, 0x0018, 0x0079, 0x080c, 0x26c5,
-	0x0005, 0x080c, 0x0db4, 0x080c, 0x0db4, 0x2009, 0x1969, 0x2104,
-	0x8001, 0x200a, 0x090c, 0x2826, 0x0005, 0x7a38, 0x9294, 0x0005,
+	0x196c, 0x2003, 0x000a, 0x2009, 0x1969, 0x2104, 0xc0fd, 0x200a,
+	0x0038, 0x0419, 0x2001, 0x1963, 0x2003, 0x0004, 0x080c, 0x281d,
+	0x0005, 0x0099, 0x0168, 0x080c, 0x29d2, 0x1138, 0x7850, 0x9084,
+	0xefff, 0x7852, 0x080c, 0x2809, 0x0018, 0x0079, 0x080c, 0x281d,
+	0x0005, 0x080c, 0x0db4, 0x080c, 0x0db4, 0x2009, 0x196b, 0x2104,
+	0x8001, 0x200a, 0x090c, 0x297e, 0x0005, 0x7a38, 0x9294, 0x0005,
 	0x9296, 0x0005, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c,
-	0x2855, 0x0005, 0x7a38, 0x9294, 0x0006, 0x9296, 0x0006, 0x0110,
-	0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2838, 0x0005, 0x2009,
-	0x1964, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005, 0x0108, 0x0068,
+	0x29ad, 0x0005, 0x7a38, 0x9294, 0x0006, 0x9296, 0x0006, 0x0110,
+	0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2990, 0x0005, 0x2009,
+	0x1966, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005, 0x0108, 0x0068,
 	0x200b, 0x0000, 0x7a38, 0x9294, 0x0006, 0x9296, 0x0006, 0x0110,
 	0x9006, 0x0010, 0x2001, 0x0001, 0x04d9, 0x7a38, 0x9294, 0x0005,
 	0x9296, 0x0005, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c,
-	0x2855, 0x0005, 0x0086, 0x2001, 0x1967, 0x2004, 0x9084, 0x7fff,
-	0x090c, 0x0db4, 0x2009, 0x1966, 0x2144, 0x8846, 0x280a, 0x9844,
+	0x29ad, 0x0005, 0x0086, 0x2001, 0x1969, 0x2004, 0x9084, 0x7fff,
+	0x090c, 0x0db4, 0x2009, 0x1968, 0x2144, 0x8846, 0x280a, 0x9844,
 	0x0dd8, 0xd08c, 0x1120, 0xd084, 0x1120, 0x080c, 0x0db4, 0x9006,
 	0x0010, 0x2001, 0x0001, 0x00a1, 0x008e, 0x0005, 0x0006, 0x0156,
-	0x2001, 0x195f, 0x20a9, 0x0009, 0x2003, 0x0000, 0x8000, 0x1f04,
-	0x282c, 0x2001, 0x1966, 0x2003, 0x8000, 0x015e, 0x000e, 0x0005,
+	0x2001, 0x1961, 0x20a9, 0x0009, 0x2003, 0x0000, 0x8000, 0x1f04,
+	0x2984, 0x2001, 0x1968, 0x2003, 0x8000, 0x015e, 0x000e, 0x0005,
 	0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0158, 0x7838, 0x9084,
-	0xfff9, 0x9085, 0x0004, 0x783a, 0x2009, 0x196c, 0x210c, 0x795a,
+	0xfff9, 0x9085, 0x0004, 0x783a, 0x2009, 0x196e, 0x210c, 0x795a,
 	0x0050, 0x7838, 0x9084, 0xfffb, 0x9085, 0x0006, 0x783a, 0x2009,
-	0x196d, 0x210c, 0x795a, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100,
+	0x196f, 0x210c, 0x795a, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100,
 	0x9085, 0x0000, 0x0138, 0x7838, 0x9084, 0xfffa, 0x9085, 0x0004,
 	0x783a, 0x0030, 0x7838, 0x9084, 0xfffb, 0x9085, 0x0005, 0x783a,
 	0x00fe, 0x0005, 0x0006, 0x2001, 0x0100, 0x2004, 0x9082, 0x0007,
 	0x000e, 0x0005, 0x0006, 0x2001, 0x0100, 0x2004, 0x9082, 0x0009,
-	0x000e, 0x0005, 0x0156, 0x20a9, 0x0064, 0x7820, 0x080c, 0x2905,
-	0xd09c, 0x1110, 0x1f04, 0x287d, 0x015e, 0x0005, 0x0126, 0x0016,
+	0x000e, 0x0005, 0x0156, 0x20a9, 0x0064, 0x7820, 0x080c, 0x2a5d,
+	0xd09c, 0x1110, 0x1f04, 0x29d5, 0x015e, 0x0005, 0x0126, 0x0016,
 	0x0006, 0x2091, 0x8000, 0x7850, 0x9085, 0x0040, 0x7852, 0x7850,
-	0x9084, 0xfbcf, 0x7852, 0x080c, 0x2905, 0x9085, 0x2000, 0x7852,
+	0x9084, 0xfbcf, 0x7852, 0x080c, 0x2a5d, 0x9085, 0x2000, 0x7852,
 	0x000e, 0x2008, 0x9186, 0x0000, 0x1118, 0x783b, 0x0007, 0x0090,
 	0x9186, 0x0001, 0x1118, 0x783b, 0x0006, 0x0060, 0x9186, 0x0002,
 	0x1118, 0x783b, 0x0005, 0x0030, 0x9186, 0x0003, 0x1118, 0x783b,
-	0x0004, 0x0000, 0x0006, 0x1d04, 0x28b3, 0x080c, 0x7e07, 0x1f04,
-	0x28b3, 0x7850, 0x9085, 0x0400, 0x9084, 0xdfbf, 0x7852, 0x080c,
-	0x2905, 0x9085, 0x1000, 0x7852, 0x000e, 0x001e, 0x012e, 0x0005,
+	0x0004, 0x0000, 0x0006, 0x1d04, 0x2a0b, 0x080c, 0x80c4, 0x1f04,
+	0x2a0b, 0x7850, 0x9085, 0x0400, 0x9084, 0xdfbf, 0x7852, 0x080c,
+	0x2a5d, 0x9085, 0x1000, 0x7852, 0x000e, 0x001e, 0x012e, 0x0005,
 	0x7850, 0x9084, 0xffcf, 0x7852, 0x0005, 0x0006, 0x0156, 0x00f6,
 	0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd0ac, 0x1130, 0x7820,
-	0xd0e4, 0x1140, 0x1f04, 0x28d7, 0x0028, 0x7854, 0xd08c, 0x1110,
-	0x1f04, 0x28dd, 0x00fe, 0x015e, 0x000e, 0x0005, 0x1d04, 0x28e6,
-	0x080c, 0x7e07, 0x1f04, 0x28e6, 0x0005, 0x0006, 0x2001, 0x196b,
-	0x2004, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, 0x2001, 0x196b,
-	0x2004, 0x9086, 0x0001, 0x000e, 0x0005, 0x0006, 0x2001, 0x196b,
+	0xd0e4, 0x1140, 0x1f04, 0x2a2f, 0x0028, 0x7854, 0xd08c, 0x1110,
+	0x1f04, 0x2a35, 0x00fe, 0x015e, 0x000e, 0x0005, 0x1d04, 0x2a3e,
+	0x080c, 0x80c4, 0x1f04, 0x2a3e, 0x0005, 0x0006, 0x2001, 0x196d,
+	0x2004, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, 0x2001, 0x196d,
+	0x2004, 0x9086, 0x0001, 0x000e, 0x0005, 0x0006, 0x2001, 0x196d,
 	0x2004, 0x9086, 0x0002, 0x000e, 0x0005, 0xa001, 0xa001, 0xa001,
-	0xa001, 0xa001, 0x0005, 0x0006, 0x2001, 0x1977, 0x2102, 0x000e,
+	0xa001, 0xa001, 0x0005, 0x0006, 0x2001, 0x1979, 0x2102, 0x000e,
 	0x0005, 0x2009, 0x0171, 0x2104, 0xd0dc, 0x0140, 0x2009, 0x0170,
 	0x2104, 0x200b, 0x0080, 0xa001, 0xa001, 0x200a, 0x0005, 0x0036,
 	0x0046, 0x2001, 0x0141, 0x200c, 0x918c, 0xff00, 0x9186, 0x2000,
@@ -1129,200 +1172,200 @@ unsigned short risc_code01[] = { 
 	0x1120, 0x2304, 0x9084, 0x2800, 0x0dc0, 0x001e, 0x919c, 0xffe4,
 	0x9184, 0x0001, 0x0118, 0x9385, 0x0009, 0x6016, 0x9184, 0x0002,
 	0x0118, 0x9385, 0x0012, 0x6016, 0x003e, 0x2001, 0x180c, 0x200c,
-	0xc1dc, 0x2102, 0x00ce, 0x0005, 0x0016, 0x0026, 0x080c, 0x6d2e,
+	0xc1dc, 0x2102, 0x00ce, 0x0005, 0x0016, 0x0026, 0x080c, 0x6fc1,
 	0x0108, 0xc0bc, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, 0x9215,
 	0x220a, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x2009, 0x0140,
 	0x2114, 0x9294, 0x0001, 0x9285, 0x1000, 0x200a, 0x220a, 0x002e,
 	0x001e, 0x0005, 0x0016, 0x0026, 0x2009, 0x0140, 0x2114, 0x9294,
 	0x0001, 0x9215, 0x220a, 0x002e, 0x001e, 0x0005, 0x0006, 0x0016,
-	0x2009, 0x0140, 0x2104, 0x1128, 0x080c, 0x6d2e, 0x0110, 0xc0bc,
-	0x0008, 0xc0bd, 0x200a, 0x001e, 0x000e, 0x0005, 0x2c62, 0x2c62,
-	0x2a86, 0x2a86, 0x2a92, 0x2a92, 0x2a9e, 0x2a9e, 0x2aac, 0x2aac,
-	0x2ab8, 0x2ab8, 0x2ac6, 0x2ac6, 0x2ad4, 0x2ad4, 0x2ae6, 0x2ae6,
-	0x2af2, 0x2af2, 0x2b00, 0x2b00, 0x2b1e, 0x2b1e, 0x2b3e, 0x2b3e,
-	0x2b0e, 0x2b0e, 0x2b2e, 0x2b2e, 0x2b4c, 0x2b4c, 0x2ae4, 0x2ae4,
-	0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4,
-	0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4,
-	0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4,
-	0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2b5e, 0x2b5e,
-	0x2b6a, 0x2b6a, 0x2b78, 0x2b78, 0x2b86, 0x2b86, 0x2b96, 0x2b96,
-	0x2ba4, 0x2ba4, 0x2bb4, 0x2bb4, 0x2bc4, 0x2bc4, 0x2bd6, 0x2bd6,
-	0x2be4, 0x2be4, 0x2bf4, 0x2bf4, 0x2c16, 0x2c16, 0x2c38, 0x2c38,
-	0x2c04, 0x2c04, 0x2c27, 0x2c27, 0x2c47, 0x2c47, 0x2ae4, 0x2ae4,
-	0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4,
-	0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4,
-	0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4,
-	0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4,
-	0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4,
-	0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x2ae4, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x21bb,
-	0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x1fd3, 0x0804, 0x2c5a, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1fd3,
-	0x080c, 0x21bb, 0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x200e, 0x0804, 0x2c5a,
+	0x2009, 0x0140, 0x2104, 0x1128, 0x080c, 0x6fc1, 0x0110, 0xc0bc,
+	0x0008, 0xc0bd, 0x200a, 0x001e, 0x000e, 0x0005, 0x2dba, 0x2dba,
+	0x2bde, 0x2bde, 0x2bea, 0x2bea, 0x2bf6, 0x2bf6, 0x2c04, 0x2c04,
+	0x2c10, 0x2c10, 0x2c1e, 0x2c1e, 0x2c2c, 0x2c2c, 0x2c3e, 0x2c3e,
+	0x2c4a, 0x2c4a, 0x2c58, 0x2c58, 0x2c76, 0x2c76, 0x2c96, 0x2c96,
+	0x2c66, 0x2c66, 0x2c86, 0x2c86, 0x2ca4, 0x2ca4, 0x2c3c, 0x2c3c,
+	0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c,
+	0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c,
+	0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c,
+	0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2cb6, 0x2cb6,
+	0x2cc2, 0x2cc2, 0x2cd0, 0x2cd0, 0x2cde, 0x2cde, 0x2cee, 0x2cee,
+	0x2cfc, 0x2cfc, 0x2d0c, 0x2d0c, 0x2d1c, 0x2d1c, 0x2d2e, 0x2d2e,
+	0x2d3c, 0x2d3c, 0x2d4c, 0x2d4c, 0x2d6e, 0x2d6e, 0x2d90, 0x2d90,
+	0x2d5c, 0x2d5c, 0x2d7f, 0x2d7f, 0x2d9f, 0x2d9f, 0x2c3c, 0x2c3c,
+	0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c,
+	0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c,
+	0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c,
+	0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c,
+	0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c,
+	0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2313,
+	0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
+	0x0146, 0x0156, 0x080c, 0x212b, 0x0804, 0x2db2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x212b,
+	0x080c, 0x2313, 0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2166, 0x0804, 0x2db2,
 	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x21bb, 0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1fd3,
-	0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1fd3, 0x080c, 0x21bb,
-	0x080c, 0x200e, 0x0804, 0x2c5a, 0xa001, 0x0cf0, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x12f0,
-	0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x21bb, 0x080c, 0x12f0, 0x0804, 0x2c5a,
+	0x080c, 0x2313, 0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x212b,
+	0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x212b, 0x080c, 0x2313,
+	0x080c, 0x2166, 0x0804, 0x2db2, 0xa001, 0x0cf0, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x130c,
+	0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
+	0x0146, 0x0156, 0x080c, 0x2313, 0x080c, 0x130c, 0x0804, 0x2db2,
 	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x1fd3, 0x080c, 0x12f0, 0x0804, 0x2c5a, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x21bb,
-	0x080c, 0x12f0, 0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1fd3,
-	0x080c, 0x21bb, 0x080c, 0x12f0, 0x0804, 0x2c5a, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1fd3,
-	0x080c, 0x12f0, 0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x12f0,
-	0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1fd3, 0x080c, 0x21bb,
-	0x080c, 0x12f0, 0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e,
-	0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x260e, 0x080c, 0x21bb, 0x0804, 0x2c5a,
+	0x080c, 0x212b, 0x080c, 0x130c, 0x0804, 0x2db2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2313,
+	0x080c, 0x130c, 0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x212b,
+	0x080c, 0x2313, 0x080c, 0x130c, 0x0804, 0x2db2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x212b,
+	0x080c, 0x130c, 0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x130c,
+	0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x212b, 0x080c, 0x2313,
+	0x080c, 0x130c, 0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766,
+	0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
+	0x0146, 0x0156, 0x080c, 0x2766, 0x080c, 0x2313, 0x0804, 0x2db2,
 	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x260e, 0x080c, 0x1fd3, 0x0804, 0x2c5a, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e,
-	0x080c, 0x1fd3, 0x080c, 0x21bb, 0x0804, 0x2c5a, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e,
-	0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e, 0x080c, 0x21bb,
-	0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e, 0x080c, 0x1fd3,
-	0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e, 0x080c, 0x1fd3,
-	0x080c, 0x21bb, 0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e,
-	0x080c, 0x12f0, 0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e, 0x080c, 0x21bb,
-	0x080c, 0x12f0, 0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e, 0x080c, 0x1fd3,
-	0x080c, 0x12f0, 0x0804, 0x2c5a, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e, 0x080c, 0x21bb,
-	0x080c, 0x12f0, 0x080c, 0x200e, 0x0804, 0x2c5a, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x260e,
-	0x080c, 0x1fd3, 0x080c, 0x21bb, 0x080c, 0x12f0, 0x0498, 0x0106,
+	0x080c, 0x2766, 0x080c, 0x212b, 0x0804, 0x2db2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766,
+	0x080c, 0x212b, 0x080c, 0x2313, 0x0804, 0x2db2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766,
+	0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766, 0x080c, 0x2313,
+	0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766, 0x080c, 0x212b,
+	0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766, 0x080c, 0x212b,
+	0x080c, 0x2313, 0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766,
+	0x080c, 0x130c, 0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766, 0x080c, 0x2313,
+	0x080c, 0x130c, 0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766, 0x080c, 0x212b,
+	0x080c, 0x130c, 0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766, 0x080c, 0x2313,
+	0x080c, 0x130c, 0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766,
+	0x080c, 0x212b, 0x080c, 0x2313, 0x080c, 0x130c, 0x0498, 0x0106,
 	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
-	0x260e, 0x080c, 0x1fd3, 0x080c, 0x12f0, 0x080c, 0x200e, 0x0410,
+	0x2766, 0x080c, 0x212b, 0x080c, 0x130c, 0x080c, 0x2166, 0x0410,
 	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x260e, 0x080c, 0x12f0, 0x080c, 0x200e, 0x0098, 0x0106,
+	0x080c, 0x2766, 0x080c, 0x130c, 0x080c, 0x2166, 0x0098, 0x0106,
 	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
-	0x260e, 0x080c, 0x1fd3, 0x080c, 0x21bb, 0x080c, 0x12f0, 0x080c,
-	0x200e, 0x0000, 0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e,
+	0x2766, 0x080c, 0x212b, 0x080c, 0x2313, 0x080c, 0x130c, 0x080c,
+	0x2166, 0x0000, 0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e,
 	0x000e, 0x010e, 0x000d, 0x00b6, 0x00c6, 0x0026, 0x0046, 0x9026,
-	0x080c, 0x62d3, 0x1904, 0x2d66, 0x72d8, 0x2001, 0x194d, 0x2004,
+	0x080c, 0x6519, 0x1904, 0x2ebe, 0x72d8, 0x2001, 0x194d, 0x2004,
 	0x9005, 0x1110, 0xd29c, 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904,
-	0x2d66, 0x080c, 0x2d6b, 0x0804, 0x2d66, 0xd2cc, 0x1904, 0x2d66,
-	0x080c, 0x6d14, 0x1120, 0x70ab, 0xffff, 0x0804, 0x2d66, 0xd294,
-	0x0120, 0x70ab, 0xffff, 0x0804, 0x2d66, 0x080c, 0x2fcf, 0x0160,
-	0x080c, 0xbe86, 0x0128, 0x2001, 0x1817, 0x203c, 0x0804, 0x2cf8,
-	0x70ab, 0xffff, 0x0804, 0x2d66, 0x2001, 0x1817, 0x203c, 0x7290,
-	0xd284, 0x0904, 0x2cf8, 0xd28c, 0x1904, 0x2cf8, 0x0036, 0x73a8,
+	0x2ebe, 0x080c, 0x2ec3, 0x0804, 0x2ebe, 0xd2cc, 0x1904, 0x2ebe,
+	0x080c, 0x6fa7, 0x1120, 0x70ab, 0xffff, 0x0804, 0x2ebe, 0xd294,
+	0x0120, 0x70ab, 0xffff, 0x0804, 0x2ebe, 0x080c, 0x3127, 0x0160,
+	0x080c, 0xc1f9, 0x0128, 0x2001, 0x1817, 0x203c, 0x0804, 0x2e50,
+	0x70ab, 0xffff, 0x0804, 0x2ebe, 0x2001, 0x1817, 0x203c, 0x7290,
+	0xd284, 0x0904, 0x2e50, 0xd28c, 0x1904, 0x2e50, 0x0036, 0x73a8,
 	0x938e, 0xffff, 0x1110, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1c80,
 	0x2c04, 0x938c, 0x0001, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010,
 	0x9084, 0x00ff, 0x970e, 0x0590, 0x908e, 0x0000, 0x0578, 0x908e,
 	0x00ff, 0x1150, 0x7230, 0xd284, 0x1570, 0x7290, 0xc28d, 0x7292,
 	0x70ab, 0xffff, 0x003e, 0x0460, 0x0026, 0x2011, 0x0010, 0x080c,
-	0x6339, 0x002e, 0x0118, 0x70ab, 0xffff, 0x00f8, 0x900e, 0x080c,
-	0x250b, 0x080c, 0x5f91, 0x11a8, 0x080c, 0x6315, 0x1150, 0x7030,
-	0xd08c, 0x0118, 0xb800, 0xd0bc, 0x0120, 0x080c, 0x2d84, 0x0148,
-	0x0028, 0x080c, 0x2ec0, 0x080c, 0x2db0, 0x0118, 0x8318, 0x0804,
-	0x2cad, 0x73aa, 0x0010, 0x70ab, 0xffff, 0x003e, 0x0804, 0x2d66,
-	0x9780, 0x2fd9, 0x203d, 0x97bc, 0xff00, 0x873f, 0x2041, 0x007e,
+	0x657f, 0x002e, 0x0118, 0x70ab, 0xffff, 0x00f8, 0x900e, 0x080c,
+	0x2663, 0x080c, 0x61d7, 0x11a8, 0x080c, 0x655b, 0x1150, 0x7030,
+	0xd08c, 0x0118, 0xb800, 0xd0bc, 0x0120, 0x080c, 0x2edc, 0x0148,
+	0x0028, 0x080c, 0x3018, 0x080c, 0x2f08, 0x0118, 0x8318, 0x0804,
+	0x2e05, 0x73aa, 0x0010, 0x70ab, 0xffff, 0x003e, 0x0804, 0x2ebe,
+	0x9780, 0x3131, 0x203d, 0x97bc, 0xff00, 0x873f, 0x2041, 0x007e,
 	0x70a8, 0x9096, 0xffff, 0x1118, 0x900e, 0x28a8, 0x0050, 0x9812,
 	0x0220, 0x2008, 0x9802, 0x20a8, 0x0020, 0x70ab, 0xffff, 0x0804,
-	0x2d66, 0x2700, 0x0156, 0x0016, 0x9106, 0x0904, 0x2d5b, 0x0026,
-	0x2011, 0x0010, 0x080c, 0x6339, 0x002e, 0x0120, 0x2009, 0xffff,
-	0x0804, 0x2d63, 0xc484, 0x080c, 0x5ff1, 0x0138, 0x080c, 0xbe86,
-	0x1590, 0x080c, 0x5f91, 0x15b8, 0x0008, 0xc485, 0x080c, 0x6315,
+	0x2ebe, 0x2700, 0x0156, 0x0016, 0x9106, 0x0904, 0x2eb3, 0x0026,
+	0x2011, 0x0010, 0x080c, 0x657f, 0x002e, 0x0120, 0x2009, 0xffff,
+	0x0804, 0x2ebb, 0xc484, 0x080c, 0x6237, 0x0138, 0x080c, 0xc1f9,
+	0x1590, 0x080c, 0x61d7, 0x15b8, 0x0008, 0xc485, 0x080c, 0x655b,
 	0x1130, 0x7030, 0xd08c, 0x01f8, 0xb800, 0xd0bc, 0x11e0, 0x7290,
-	0xd28c, 0x0180, 0x080c, 0x6315, 0x9082, 0x0006, 0x02e0, 0xd484,
-	0x1118, 0x080c, 0x5fb5, 0x0028, 0x080c, 0x2f4b, 0x01a0, 0x080c,
-	0x2f76, 0x0088, 0x080c, 0x2ec0, 0x080c, 0xbe86, 0x1160, 0x080c,
-	0x2db0, 0x0188, 0x0040, 0x080c, 0xbe86, 0x1118, 0x080c, 0x2f4b,
-	0x0110, 0x0451, 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, 0x2d11,
+	0xd28c, 0x0180, 0x080c, 0x655b, 0x9082, 0x0006, 0x02e0, 0xd484,
+	0x1118, 0x080c, 0x61fb, 0x0028, 0x080c, 0x30a3, 0x01a0, 0x080c,
+	0x30ce, 0x0088, 0x080c, 0x3018, 0x080c, 0xc1f9, 0x1160, 0x080c,
+	0x2f08, 0x0188, 0x0040, 0x080c, 0xc1f9, 0x1118, 0x080c, 0x30a3,
+	0x0110, 0x0451, 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, 0x2e69,
 	0x70ab, 0xffff, 0x0018, 0x001e, 0x015e, 0x71aa, 0x004e, 0x002e,
 	0x00ce, 0x00be, 0x0005, 0x00c6, 0x0016, 0x70ab, 0x0001, 0x2009,
-	0x007e, 0x080c, 0x5f91, 0x1168, 0xb813, 0x00ff, 0xb817, 0xfffe,
-	0x080c, 0x2ec0, 0x04a9, 0x0128, 0x70d8, 0xc0bd, 0x70da, 0x080c,
-	0xbbd8, 0x001e, 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6,
-	0x2001, 0x1858, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0x9b15,
-	0x01d0, 0x2b00, 0x6012, 0x080c, 0xbc01, 0x6023, 0x0001, 0x9006,
-	0x080c, 0x5f2e, 0x2001, 0x0000, 0x080c, 0x5f42, 0x0126, 0x2091,
+	0x007e, 0x080c, 0x61d7, 0x1168, 0xb813, 0x00ff, 0xb817, 0xfffe,
+	0x080c, 0x3018, 0x04a9, 0x0128, 0x70d8, 0xc0bd, 0x70da, 0x080c,
+	0xbf4a, 0x001e, 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6,
+	0x2001, 0x1858, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0x9e66,
+	0x01d0, 0x2b00, 0x6012, 0x080c, 0xbf73, 0x6023, 0x0001, 0x9006,
+	0x080c, 0x6174, 0x2001, 0x0000, 0x080c, 0x6188, 0x0126, 0x2091,
 	0x8000, 0x70a4, 0x8000, 0x70a6, 0x012e, 0x2009, 0x0004, 0x080c,
-	0x9b42, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005,
+	0x9e93, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005,
 	0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, 0x1858, 0x2004, 0x9084,
-	0x00ff, 0xb842, 0x080c, 0x9b15, 0x0548, 0x2b00, 0x6012, 0xb800,
+	0x00ff, 0xb842, 0x080c, 0x9e66, 0x0548, 0x2b00, 0x6012, 0xb800,
 	0xc0c4, 0xb802, 0xb8a0, 0x9086, 0x007e, 0x0140, 0xb804, 0x9084,
-	0x00ff, 0x9086, 0x0006, 0x1110, 0x080c, 0x2e7f, 0x080c, 0xbc01,
-	0x6023, 0x0001, 0x9006, 0x080c, 0x5f2e, 0x2001, 0x0002, 0x080c,
-	0x5f42, 0x0126, 0x2091, 0x8000, 0x70a4, 0x8000, 0x70a6, 0x012e,
-	0x2009, 0x0002, 0x080c, 0x9b42, 0x9085, 0x0001, 0x00ce, 0x00de,
+	0x00ff, 0x9086, 0x0006, 0x1110, 0x080c, 0x2fd7, 0x080c, 0xbf73,
+	0x6023, 0x0001, 0x9006, 0x080c, 0x6174, 0x2001, 0x0002, 0x080c,
+	0x6188, 0x0126, 0x2091, 0x8000, 0x70a4, 0x8000, 0x70a6, 0x012e,
+	0x2009, 0x0002, 0x080c, 0x9e93, 0x9085, 0x0001, 0x00ce, 0x00de,
 	0x007e, 0x001e, 0x0005, 0x00b6, 0x00c6, 0x0026, 0x2009, 0x0080,
-	0x080c, 0x5f91, 0x1140, 0xb813, 0x00ff, 0xb817, 0xfffc, 0x0039,
+	0x080c, 0x61d7, 0x1140, 0xb813, 0x00ff, 0xb817, 0xfffc, 0x0039,
 	0x0110, 0x70df, 0xffff, 0x002e, 0x00ce, 0x00be, 0x0005, 0x0016,
-	0x0076, 0x00d6, 0x00c6, 0x080c, 0x9a72, 0x01d0, 0x2b00, 0x6012,
-	0x080c, 0xbc01, 0x6023, 0x0001, 0x9006, 0x080c, 0x5f2e, 0x2001,
-	0x0002, 0x080c, 0x5f42, 0x0126, 0x2091, 0x8000, 0x70e0, 0x8000,
-	0x70e2, 0x012e, 0x2009, 0x0002, 0x080c, 0x9b42, 0x9085, 0x0001,
+	0x0076, 0x00d6, 0x00c6, 0x080c, 0x9dc3, 0x01d0, 0x2b00, 0x6012,
+	0x080c, 0xbf73, 0x6023, 0x0001, 0x9006, 0x080c, 0x6174, 0x2001,
+	0x0002, 0x080c, 0x6188, 0x0126, 0x2091, 0x8000, 0x70e0, 0x8000,
+	0x70e2, 0x012e, 0x2009, 0x0002, 0x080c, 0x9e93, 0x9085, 0x0001,
 	0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0126,
-	0x2091, 0x8000, 0x2009, 0x007f, 0x080c, 0x5f91, 0x11b8, 0xb813,
-	0x00ff, 0xb817, 0xfffd, 0xb8bf, 0x0004, 0x080c, 0x9a72, 0x0170,
-	0x2b00, 0x6012, 0x6316, 0x6023, 0x0001, 0x620a, 0x080c, 0xbc01,
-	0x2009, 0x0022, 0x080c, 0x9b42, 0x9085, 0x0001, 0x012e, 0x00de,
+	0x2091, 0x8000, 0x2009, 0x007f, 0x080c, 0x61d7, 0x11b8, 0xb813,
+	0x00ff, 0xb817, 0xfffd, 0xb8bf, 0x0004, 0x080c, 0x9dc3, 0x0170,
+	0x2b00, 0x6012, 0x6316, 0x6023, 0x0001, 0x620a, 0x080c, 0xbf73,
+	0x2009, 0x0022, 0x080c, 0x9e93, 0x9085, 0x0001, 0x012e, 0x00de,
 	0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x00b6,
-	0x21f0, 0x080c, 0x8297, 0x080c, 0x8226, 0x080c, 0x9920, 0x080c,
-	0xaa0d, 0x3e08, 0x2130, 0x81ff, 0x0120, 0x20a9, 0x007e, 0x900e,
-	0x0018, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x5ff1, 0x1140,
-	0x9686, 0x0002, 0x1118, 0xb800, 0xd0bc, 0x1110, 0x080c, 0x5aae,
-	0x001e, 0x8108, 0x1f04, 0x2e64, 0x9686, 0x0001, 0x190c, 0x2fa3,
+	0x21f0, 0x080c, 0x8554, 0x080c, 0x84e3, 0x080c, 0x9c71, 0x080c,
+	0xad5e, 0x3e08, 0x2130, 0x81ff, 0x0120, 0x20a9, 0x007e, 0x900e,
+	0x0018, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x6237, 0x1140,
+	0x9686, 0x0002, 0x1118, 0xb800, 0xd0bc, 0x1110, 0x080c, 0x5ce4,
+	0x001e, 0x8108, 0x1f04, 0x2fbc, 0x9686, 0x0001, 0x190c, 0x30fb,
 	0x00be, 0x002e, 0x003e, 0x006e, 0x00ce, 0x00ee, 0x0005, 0x00e6,
 	0x00c6, 0x0036, 0x0026, 0x0016, 0x00b6, 0x6210, 0x2258, 0xbaa0,
-	0x0026, 0x2019, 0x0029, 0x080c, 0x828c, 0x0076, 0x2039, 0x0000,
-	0x080c, 0x8184, 0x2c08, 0x080c, 0xcef9, 0x007e, 0x001e, 0xba10,
-	0xbb14, 0x080c, 0x5aae, 0xba12, 0xbb16, 0x00be, 0x001e, 0x002e,
+	0x0026, 0x2019, 0x0029, 0x080c, 0x8549, 0x0076, 0x2039, 0x0000,
+	0x080c, 0x8441, 0x2c08, 0x080c, 0xd27b, 0x007e, 0x001e, 0xba10,
+	0xbb14, 0x080c, 0x5ce4, 0xba12, 0xbb16, 0x00be, 0x001e, 0x002e,
 	0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x00b6, 0x6010,
 	0x2058, 0xb8a0, 0x00be, 0x9086, 0x0080, 0x0150, 0x2071, 0x1800,
 	0x70a4, 0x9005, 0x0110, 0x8001, 0x70a6, 0x000e, 0x00ee, 0x0005,
 	0x2071, 0x1800, 0x70e0, 0x9005, 0x0dc0, 0x8001, 0x70e2, 0x0ca8,
 	0xb800, 0xc08c, 0xb802, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x00b6,
 	0x0036, 0x0026, 0x0016, 0x0156, 0x2178, 0x81ff, 0x1118, 0x20a9,
-	0x0001, 0x0080, 0x080c, 0x5153, 0xd0c4, 0x0148, 0x0040, 0x9006,
-	0x0046, 0x2020, 0x2009, 0x002d, 0x080c, 0xd188, 0x004e, 0x20a9,
-	0x0800, 0x9016, 0x0026, 0x928e, 0x007e, 0x0904, 0x2f2b, 0x928e,
-	0x007f, 0x0904, 0x2f2b, 0x928e, 0x0080, 0x05e8, 0x9288, 0x1000,
-	0x210c, 0x81ff, 0x05c0, 0x8fff, 0x1148, 0x2001, 0x195d, 0x0006,
+	0x0001, 0x0080, 0x080c, 0x537f, 0xd0c4, 0x0148, 0x0040, 0x9006,
+	0x0046, 0x2020, 0x2009, 0x002d, 0x080c, 0xd50a, 0x004e, 0x20a9,
+	0x0800, 0x9016, 0x0026, 0x928e, 0x007e, 0x0904, 0x3083, 0x928e,
+	0x007f, 0x0904, 0x3083, 0x928e, 0x0080, 0x05e8, 0x9288, 0x1000,
+	0x210c, 0x81ff, 0x05c0, 0x8fff, 0x1148, 0x2001, 0x195f, 0x0006,
 	0x2003, 0x0001, 0x04e9, 0x000e, 0x2003, 0x0000, 0x00b6, 0x00c6,
-	0x2158, 0x2001, 0x0001, 0x080c, 0x62df, 0x00ce, 0x00be, 0x2019,
-	0x0029, 0x080c, 0x828c, 0x0076, 0x2039, 0x0000, 0x080c, 0x8184,
+	0x2158, 0x2001, 0x0001, 0x080c, 0x6525, 0x00ce, 0x00be, 0x2019,
+	0x0029, 0x080c, 0x8549, 0x0076, 0x2039, 0x0000, 0x080c, 0x8441,
 	0x00b6, 0x00c6, 0x0026, 0x2158, 0xba04, 0x9294, 0x00ff, 0x9286,
 	0x0006, 0x1118, 0xb807, 0x0404, 0x0028, 0x2001, 0x0004, 0x8007,
 	0x9215, 0xba06, 0x002e, 0x00ce, 0x00be, 0x0016, 0x2c08, 0x080c,
-	0xcef9, 0x001e, 0x007e, 0x002e, 0x8210, 0x1f04, 0x2ee2, 0x015e,
+	0xd27b, 0x001e, 0x007e, 0x002e, 0x8210, 0x1f04, 0x303a, 0x015e,
 	0x001e, 0x002e, 0x003e, 0x00be, 0x00ce, 0x00ee, 0x00fe, 0x0005,
-	0x0046, 0x0026, 0x0016, 0x080c, 0x5153, 0xd0c4, 0x0140, 0xd0a4,
-	0x0130, 0x9006, 0x2220, 0x2009, 0x0029, 0x080c, 0xd188, 0x001e,
+	0x0046, 0x0026, 0x0016, 0x080c, 0x537f, 0xd0c4, 0x0140, 0xd0a4,
+	0x0130, 0x9006, 0x2220, 0x2009, 0x0029, 0x080c, 0xd50a, 0x001e,
 	0x002e, 0x004e, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x7290,
-	0x82ff, 0x01e8, 0x080c, 0x630d, 0x11d0, 0x2100, 0x080c, 0x253e,
+	0x82ff, 0x01e8, 0x080c, 0x6553, 0x11d0, 0x2100, 0x080c, 0x2696,
 	0x81ff, 0x01b8, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1c80, 0x2c04,
 	0xd384, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff,
 	0x9116, 0x0138, 0x9096, 0x00ff, 0x0110, 0x8318, 0x0c68, 0x9085,
 	0x0001, 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x0016, 0x00c6,
 	0x0126, 0x2091, 0x8000, 0x0036, 0x2019, 0x0029, 0x00a9, 0x003e,
 	0x9180, 0x1000, 0x2004, 0x9065, 0x0158, 0x0016, 0x00c6, 0x2061,
-	0x1a77, 0x001e, 0x6112, 0x080c, 0x2e7f, 0x001e, 0x080c, 0x5fb5,
+	0x1a80, 0x001e, 0x6112, 0x080c, 0x2fd7, 0x001e, 0x080c, 0x61fb,
 	0x012e, 0x00ce, 0x001e, 0x0005, 0x0016, 0x0026, 0x2110, 0x080c,
-	0x95bc, 0x080c, 0xd43b, 0x002e, 0x001e, 0x0005, 0x2001, 0x1836,
-	0x2004, 0xd0cc, 0x0005, 0x00c6, 0x00b6, 0x080c, 0x6d14, 0x1118,
-	0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c, 0x6d14, 0x1110,
+	0x990d, 0x080c, 0xd7c2, 0x002e, 0x001e, 0x0005, 0x2001, 0x1836,
+	0x2004, 0xd0cc, 0x0005, 0x00c6, 0x00b6, 0x080c, 0x6fa7, 0x1118,
+	0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c, 0x6fa7, 0x1110,
 	0x900e, 0x0010, 0x2009, 0x007e, 0x9180, 0x1000, 0x2004, 0x905d,
-	0x0130, 0x86ff, 0x0110, 0xb800, 0xd0bc, 0x090c, 0x5fb5, 0x8108,
-	0x1f04, 0x2fb4, 0x2061, 0x1800, 0x607b, 0x0000, 0x607c, 0x9084,
+	0x0130, 0x86ff, 0x0110, 0xb800, 0xd0bc, 0x090c, 0x61fb, 0x8108,
+	0x1f04, 0x310c, 0x2061, 0x1800, 0x607b, 0x0000, 0x607c, 0x9084,
 	0x00ff, 0x607e, 0x60af, 0x0000, 0x00be, 0x00ce, 0x0005, 0x2001,
 	0x1875, 0x2004, 0xd0bc, 0x0005, 0x2011, 0x1854, 0x2214, 0xd2ec,
 	0x0005, 0x7eef, 0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc,
@@ -1359,360 +1402,360 @@ unsigned short risc_code01[] = { 
 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
 	0x8000, 0x2071, 0x1894, 0x7003, 0x0002, 0x9006, 0x7016, 0x701a,
 	0x704a, 0x704e, 0x700e, 0x7042, 0x7046, 0x703b, 0x18b0, 0x703f,
-	0x18b0, 0x7007, 0x0001, 0x080c, 0x1005, 0x090c, 0x0db4, 0x2900,
-	0x706a, 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x080c, 0x1005, 0x090c,
+	0x18b0, 0x7007, 0x0001, 0x080c, 0x1004, 0x090c, 0x0db4, 0x2900,
+	0x706a, 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x080c, 0x1004, 0x090c,
 	0x0db4, 0x2900, 0x706e, 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x0005,
-	0x2071, 0x1894, 0x7004, 0x0002, 0x3108, 0x3109, 0x311c, 0x3130,
-	0x0005, 0x1004, 0x3119, 0x0e04, 0x3119, 0x2079, 0x0000, 0x0126,
+	0x2071, 0x1894, 0x7004, 0x0002, 0x3260, 0x3261, 0x3274, 0x3288,
+	0x0005, 0x1004, 0x3271, 0x0e04, 0x3271, 0x2079, 0x0000, 0x0126,
 	0x2091, 0x8000, 0x700c, 0x9005, 0x1128, 0x700f, 0x0001, 0x012e,
 	0x0468, 0x0005, 0x012e, 0x0ce8, 0x2079, 0x0000, 0x2061, 0x18ae,
 	0x2c4c, 0xa86c, 0x908e, 0x0100, 0x0128, 0x9086, 0x0200, 0x0904,
-	0x3204, 0x0005, 0x7018, 0x2048, 0x2061, 0x1800, 0x701c, 0x0807,
+	0x335c, 0x0005, 0x7018, 0x2048, 0x2061, 0x1800, 0x701c, 0x0807,
 	0x7014, 0x2048, 0xa864, 0x9094, 0x00ff, 0x9296, 0x0029, 0x1120,
 	0xaa78, 0xd2fc, 0x0128, 0x0005, 0x9086, 0x0103, 0x0108, 0x0005,
 	0x2079, 0x0000, 0x2061, 0x1800, 0x701c, 0x0807, 0x2061, 0x1800,
 	0x7880, 0x908a, 0x0040, 0x1210, 0x61cc, 0x0042, 0x2100, 0x908a,
-	0x003f, 0x1a04, 0x3201, 0x61cc, 0x0804, 0x3196, 0x31d8, 0x3210,
-	0x321a, 0x321e, 0x3228, 0x322e, 0x3232, 0x3242, 0x3245, 0x324f,
-	0x3254, 0x3259, 0x3264, 0x326f, 0x327e, 0x328d, 0x329b, 0x32b2,
-	0x32cd, 0x3201, 0x3376, 0x33b4, 0x345a, 0x346b, 0x348e, 0x3201,
-	0x3201, 0x3201, 0x34c6, 0x34e2, 0x34eb, 0x351a, 0x3520, 0x3201,
-	0x3566, 0x3201, 0x3201, 0x3201, 0x3201, 0x3201, 0x3571, 0x357a,
-	0x3582, 0x3584, 0x3201, 0x3201, 0x3201, 0x3201, 0x3201, 0x3201,
-	0x35b0, 0x3201, 0x3201, 0x3201, 0x3201, 0x3201, 0x35cd, 0x3628,
-	0x3201, 0x3201, 0x3201, 0x3201, 0x3201, 0x3201, 0x0002, 0x3652,
-	0x3655, 0x36b4, 0x36cd, 0x36fd, 0x399b, 0x3201, 0x4d2c, 0x3201,
-	0x3201, 0x3201, 0x3201, 0x3201, 0x3201, 0x3201, 0x3201, 0x324f,
-	0x3254, 0x3ebc, 0x5177, 0x3ed2, 0x4dbb, 0x4e0c, 0x4f0f, 0x3201,
-	0x4f71, 0x4fad, 0x4fde, 0x50e2, 0x500b, 0x5062, 0x3201, 0x3ed6,
-	0x4077, 0x408d, 0x40b2, 0x4117, 0x418b, 0x41ab, 0x4222, 0x4233,
-	0x424b, 0x424e, 0x4273, 0x42e6, 0x434c, 0x4354, 0x4486, 0x45e3,
-	0x4617, 0x4861, 0x3201, 0x487f, 0x493e, 0x4a14, 0x3201, 0x3201,
-	0x3201, 0x3201, 0x4a7a, 0x4a95, 0x4354, 0x4cdb, 0x714c, 0x0000,
-	0x2021, 0x4000, 0x080c, 0x4695, 0x0126, 0x2091, 0x8000, 0x0e04,
-	0x31e2, 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118,
+	0x003f, 0x1a04, 0x3359, 0x61cc, 0x0804, 0x32ee, 0x3330, 0x3368,
+	0x3372, 0x3376, 0x3380, 0x3386, 0x338a, 0x339a, 0x339d, 0x33a7,
+	0x33ac, 0x33b1, 0x33bc, 0x33c7, 0x33d6, 0x33e5, 0x33f3, 0x340a,
+	0x3425, 0x3359, 0x34ce, 0x350c, 0x35b2, 0x35c3, 0x35e6, 0x3359,
+	0x3359, 0x3359, 0x361e, 0x363a, 0x3643, 0x3672, 0x3678, 0x3359,
+	0x36be, 0x3359, 0x3359, 0x3359, 0x3359, 0x3359, 0x36c9, 0x36d2,
+	0x36da, 0x36dc, 0x3359, 0x3359, 0x3359, 0x3359, 0x3359, 0x3359,
+	0x3708, 0x3359, 0x3359, 0x3359, 0x3359, 0x3359, 0x3725, 0x3780,
+	0x3359, 0x3359, 0x3359, 0x3359, 0x3359, 0x3359, 0x0002, 0x37aa,
+	0x37ad, 0x380c, 0x3825, 0x3855, 0x3af3, 0x3359, 0x4f58, 0x3359,
+	0x3359, 0x3359, 0x3359, 0x3359, 0x3359, 0x3359, 0x3359, 0x33a7,
+	0x33ac, 0x4014, 0x53a3, 0x402a, 0x4fe7, 0x5038, 0x513b, 0x3359,
+	0x519d, 0x51d9, 0x520a, 0x530e, 0x5237, 0x528e, 0x3359, 0x402e,
+	0x41cf, 0x41e5, 0x420a, 0x426f, 0x42e3, 0x4303, 0x437a, 0x43d6,
+	0x4432, 0x4435, 0x445a, 0x44fa, 0x4560, 0x4568, 0x469a, 0x47fc,
+	0x4830, 0x4a7a, 0x3359, 0x4a98, 0x4b5b, 0x4c31, 0x3359, 0x3359,
+	0x3359, 0x3359, 0x4c97, 0x4cb2, 0x4568, 0x4ef8, 0x714c, 0x0000,
+	0x2021, 0x4000, 0x080c, 0x48ae, 0x0126, 0x2091, 0x8000, 0x0e04,
+	0x333a, 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118,
 	0x7833, 0x0011, 0x0010, 0x7833, 0x0010, 0x7c82, 0x7986, 0x7a8a,
 	0x7b8e, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c,
-	0x117e, 0x7007, 0x0001, 0x2091, 0x5000, 0x700f, 0x0000, 0x012e,
+	0x1187, 0x7007, 0x0001, 0x2091, 0x5000, 0x700f, 0x0000, 0x012e,
 	0x0005, 0x2021, 0x4001, 0x08b0, 0x2021, 0x4002, 0x0898, 0x2021,
 	0x4003, 0x0880, 0x2021, 0x4005, 0x0868, 0x2021, 0x4006, 0x0850,
 	0x2039, 0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990,
-	0x0804, 0x46a2, 0x7883, 0x0004, 0x7884, 0x0807, 0x2039, 0x0001,
-	0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804, 0x46a5,
-	0x7984, 0x7888, 0x2114, 0x200a, 0x0804, 0x31d8, 0x7984, 0x2114,
-	0x0804, 0x31d8, 0x20e1, 0x0000, 0x2099, 0x0021, 0x20e9, 0x0000,
+	0x0804, 0x48bb, 0x7883, 0x0004, 0x7884, 0x0807, 0x2039, 0x0001,
+	0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804, 0x48be,
+	0x7984, 0x7888, 0x2114, 0x200a, 0x0804, 0x3330, 0x7984, 0x2114,
+	0x0804, 0x3330, 0x20e1, 0x0000, 0x2099, 0x0021, 0x20e9, 0x0000,
 	0x20a1, 0x0021, 0x20a9, 0x001f, 0x4003, 0x7984, 0x7a88, 0x7b8c,
-	0x0804, 0x31d8, 0x7884, 0x2060, 0x04d8, 0x2009, 0x0003, 0x2011,
-	0x0002, 0x2019, 0x0015, 0x789b, 0x0317, 0x0804, 0x31d8, 0x2039,
+	0x0804, 0x3330, 0x7884, 0x2060, 0x04d8, 0x2009, 0x0003, 0x2011,
+	0x0002, 0x2019, 0x001a, 0x789b, 0x0317, 0x0804, 0x3330, 0x2039,
 	0x0001, 0x7d98, 0x7c9c, 0x0800, 0x2039, 0x0001, 0x7d98, 0x7c9c,
-	0x0848, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x320d, 0x2138,
-	0x7d98, 0x7c9c, 0x0804, 0x3214, 0x79a0, 0x9182, 0x0040, 0x0210,
-	0x0804, 0x320d, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x3222, 0x79a0,
-	0x9182, 0x0040, 0x0210, 0x0804, 0x320d, 0x21e8, 0x7984, 0x7888,
-	0x20a9, 0x0001, 0x21a0, 0x4004, 0x0804, 0x31d8, 0x2061, 0x0800,
+	0x0848, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3365, 0x2138,
+	0x7d98, 0x7c9c, 0x0804, 0x336c, 0x79a0, 0x9182, 0x0040, 0x0210,
+	0x0804, 0x3365, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x337a, 0x79a0,
+	0x9182, 0x0040, 0x0210, 0x0804, 0x3365, 0x21e8, 0x7984, 0x7888,
+	0x20a9, 0x0001, 0x21a0, 0x4004, 0x0804, 0x3330, 0x2061, 0x0800,
 	0xe10c, 0x9006, 0x2c15, 0x9200, 0x8c60, 0x8109, 0x1dd8, 0x2010,
-	0x9005, 0x0904, 0x31d8, 0x0804, 0x3207, 0x79a0, 0x9182, 0x0040,
-	0x0210, 0x0804, 0x320d, 0x21e0, 0x20a9, 0x0001, 0x7984, 0x2198,
-	0x4012, 0x0804, 0x31d8, 0x2069, 0x1853, 0x7884, 0x7990, 0x911a,
-	0x1a04, 0x320d, 0x8019, 0x0904, 0x320d, 0x684a, 0x6942, 0x788c,
-	0x6852, 0x7888, 0x6856, 0x9006, 0x685a, 0x685e, 0x080c, 0x7029,
-	0x0804, 0x31d8, 0x2069, 0x1853, 0x7884, 0x7994, 0x911a, 0x1a04,
-	0x320d, 0x8019, 0x0904, 0x320d, 0x684e, 0x6946, 0x788c, 0x6862,
+	0x9005, 0x0904, 0x3330, 0x0804, 0x335f, 0x79a0, 0x9182, 0x0040,
+	0x0210, 0x0804, 0x3365, 0x21e0, 0x20a9, 0x0001, 0x7984, 0x2198,
+	0x4012, 0x0804, 0x3330, 0x2069, 0x1853, 0x7884, 0x7990, 0x911a,
+	0x1a04, 0x3365, 0x8019, 0x0904, 0x3365, 0x684a, 0x6942, 0x788c,
+	0x6852, 0x7888, 0x6856, 0x9006, 0x685a, 0x685e, 0x080c, 0x72bc,
+	0x0804, 0x3330, 0x2069, 0x1853, 0x7884, 0x7994, 0x911a, 0x1a04,
+	0x3365, 0x8019, 0x0904, 0x3365, 0x684e, 0x6946, 0x788c, 0x6862,
 	0x7888, 0x6866, 0x9006, 0x686a, 0x686e, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x63ca, 0x012e, 0x0804, 0x31d8, 0x902e, 0x2520, 0x81ff,
-	0x0120, 0x2009, 0x0001, 0x0804, 0x320a, 0x7984, 0x7b88, 0x7a8c,
+	0x080c, 0x665d, 0x012e, 0x0804, 0x3330, 0x902e, 0x2520, 0x81ff,
+	0x0120, 0x2009, 0x0001, 0x0804, 0x3362, 0x7984, 0x7b88, 0x7a8c,
 	0x20a9, 0x0005, 0x20e9, 0x0001, 0x20a1, 0x189c, 0x4101, 0x080c,
-	0x4659, 0x1120, 0x2009, 0x0002, 0x0804, 0x320a, 0x2009, 0x0020,
-	0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x46a2, 0x701f, 0x32f1,
+	0x4872, 0x1120, 0x2009, 0x0002, 0x0804, 0x3362, 0x2009, 0x0020,
+	0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x48bb, 0x701f, 0x3449,
 	0x0005, 0xa864, 0x2008, 0x9084, 0x00ff, 0x9096, 0x0011, 0x0168,
 	0x9096, 0x0019, 0x0150, 0x9096, 0x0015, 0x0138, 0x9096, 0x0048,
-	0x0120, 0x9096, 0x0029, 0x1904, 0x320a, 0x810f, 0x918c, 0x00ff,
-	0x0904, 0x320a, 0x7112, 0x7010, 0x8001, 0x0560, 0x7012, 0x080c,
-	0x4659, 0x1120, 0x2009, 0x0002, 0x0804, 0x320a, 0x2009, 0x0020,
+	0x0120, 0x9096, 0x0029, 0x1904, 0x3362, 0x810f, 0x918c, 0x00ff,
+	0x0904, 0x3362, 0x7112, 0x7010, 0x8001, 0x0560, 0x7012, 0x080c,
+	0x4872, 0x1120, 0x2009, 0x0002, 0x0804, 0x3362, 0x2009, 0x0020,
 	0x7068, 0x2040, 0xa28c, 0xa390, 0xa494, 0xa598, 0x9290, 0x0040,
 	0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, 0xa85c, 0x9080,
-	0x0019, 0xaf60, 0x080c, 0x46a2, 0x701f, 0x332f, 0x0005, 0xa864,
+	0x0019, 0xaf60, 0x080c, 0x48bb, 0x701f, 0x3487, 0x0005, 0xa864,
 	0x9084, 0x00ff, 0x9096, 0x0002, 0x0120, 0x9096, 0x000a, 0x1904,
-	0x320a, 0x0888, 0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a, 0xa864,
+	0x3362, 0x0888, 0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a, 0xa864,
 	0x9084, 0x00ff, 0x9096, 0x0029, 0x1160, 0xc2fd, 0xaa7a, 0x080c,
-	0x5ba0, 0x0150, 0x0126, 0x2091, 0x8000, 0xa87a, 0xa982, 0x012e,
-	0x0050, 0x080c, 0x5ea7, 0x1128, 0x7007, 0x0003, 0x701f, 0x335b,
-	0x0005, 0x080c, 0x682c, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005,
+	0x5dd6, 0x0150, 0x0126, 0x2091, 0x8000, 0xa87a, 0xa982, 0x012e,
+	0x0050, 0x080c, 0x60ed, 0x1128, 0x7007, 0x0003, 0x701f, 0x34b3,
+	0x0005, 0x080c, 0x6abf, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005,
 	0x20e1, 0x0001, 0x2099, 0x189c, 0x400a, 0x2100, 0x9210, 0x9399,
 	0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, 0xa85c, 0x9080, 0x0019,
-	0x2009, 0x0020, 0x012e, 0xaf60, 0x0804, 0x46a5, 0x2091, 0x8000,
+	0x2009, 0x0020, 0x012e, 0xaf60, 0x0804, 0x48be, 0x2091, 0x8000,
 	0x7837, 0x4000, 0x7833, 0x0010, 0x7883, 0x4000, 0x7887, 0x4953,
 	0x788b, 0x5020, 0x788f, 0x2020, 0x2009, 0x017f, 0x2104, 0x7892,
 	0x3f00, 0x7896, 0x2061, 0x0100, 0x6200, 0x2061, 0x0200, 0x603c,
 	0x8007, 0x9205, 0x789a, 0x2009, 0x04fd, 0x2104, 0x789e, 0x2091,
 	0x5000, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x0180,
-	0x2001, 0x19e8, 0x2004, 0x9005, 0x0128, 0x2001, 0x008b, 0x2004,
+	0x2001, 0x19ea, 0x2004, 0x9005, 0x0128, 0x2001, 0x008b, 0x2004,
 	0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, 0x2003, 0x1001,
-	0x2071, 0x0080, 0x0804, 0x0427, 0x81ff, 0x1904, 0x320a, 0x7984,
-	0x080c, 0x5ff1, 0x1904, 0x320d, 0x7e98, 0x9684, 0x3fff, 0x9082,
-	0x4000, 0x1a04, 0x320d, 0x7c88, 0x7d8c, 0x080c, 0x6154, 0x080c,
-	0x6123, 0x0000, 0x1518, 0x2061, 0x1cd0, 0x0126, 0x2091, 0x8000,
+	0x2071, 0x0080, 0x0804, 0x0427, 0x81ff, 0x1904, 0x3362, 0x7984,
+	0x080c, 0x6237, 0x1904, 0x3365, 0x7e98, 0x9684, 0x3fff, 0x9082,
+	0x4000, 0x1a04, 0x3365, 0x7c88, 0x7d8c, 0x080c, 0x639a, 0x080c,
+	0x6369, 0x0000, 0x1518, 0x2061, 0x1cd0, 0x0126, 0x2091, 0x8000,
 	0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, 0x0130, 0xa86c,
 	0x9406, 0x1118, 0xa870, 0x9506, 0x0150, 0x012e, 0x9ce0, 0x0018,
-	0x2001, 0x1819, 0x2004, 0x9c02, 0x1a04, 0x320a, 0x0c30, 0x080c,
-	0xb3e0, 0x012e, 0x0904, 0x320a, 0x0804, 0x31d8, 0x900e, 0x2001,
-	0x0005, 0x080c, 0x682c, 0x0126, 0x2091, 0x8000, 0x080c, 0xba81,
-	0x080c, 0x65f2, 0x012e, 0x0804, 0x31d8, 0x00a6, 0x2950, 0xb198,
-	0x080c, 0x5ff1, 0x1904, 0x3447, 0xb6a4, 0x9684, 0x3fff, 0x9082,
-	0x4000, 0x16e8, 0xb49c, 0xb5a0, 0x080c, 0x6154, 0x080c, 0x6123,
+	0x2001, 0x1819, 0x2004, 0x9c02, 0x1a04, 0x3362, 0x0c30, 0x080c,
+	0xb731, 0x012e, 0x0904, 0x3362, 0x0804, 0x3330, 0x900e, 0x2001,
+	0x0005, 0x080c, 0x6abf, 0x0126, 0x2091, 0x8000, 0x080c, 0xbdf3,
+	0x080c, 0x6885, 0x012e, 0x0804, 0x3330, 0x00a6, 0x2950, 0xb198,
+	0x080c, 0x6237, 0x1904, 0x359f, 0xb6a4, 0x9684, 0x3fff, 0x9082,
+	0x4000, 0x16e8, 0xb49c, 0xb5a0, 0x080c, 0x639a, 0x080c, 0x6369,
 	0x1520, 0x2061, 0x1cd0, 0x0126, 0x2091, 0x8000, 0x6000, 0x9086,
 	0x0000, 0x0148, 0x6014, 0x904d, 0x0130, 0xa86c, 0x9406, 0x1118,
 	0xa870, 0x9506, 0x0158, 0x012e, 0x9ce0, 0x0018, 0x2001, 0x1819,
-	0x2004, 0x9c02, 0x2009, 0x000d, 0x12b0, 0x0c28, 0x080c, 0xb3e0,
+	0x2004, 0x9c02, 0x2009, 0x000d, 0x12b0, 0x0c28, 0x080c, 0xb731,
 	0x012e, 0x2009, 0x0003, 0x0178, 0x00e0, 0x900e, 0x2001, 0x0005,
-	0x080c, 0x682c, 0x0126, 0x2091, 0x8000, 0x080c, 0xba81, 0x080c,
-	0x65e5, 0x012e, 0x0070, 0xb097, 0x4005, 0xb19a, 0x0010, 0xb097,
+	0x080c, 0x6abf, 0x0126, 0x2091, 0x8000, 0x080c, 0xbdf3, 0x080c,
+	0x6878, 0x012e, 0x0070, 0xb097, 0x4005, 0xb19a, 0x0010, 0xb097,
 	0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x2a48, 0x00ae,
 	0x0005, 0xb097, 0x4000, 0x9006, 0x918d, 0x0001, 0x2008, 0x2a48,
-	0x00ae, 0x0005, 0x81ff, 0x1904, 0x320a, 0x080c, 0x4670, 0x0904,
-	0x320d, 0x080c, 0x60b8, 0x0904, 0x320a, 0x080c, 0x615a, 0x0904,
-	0x320a, 0x0804, 0x41a2, 0x81ff, 0x1904, 0x320a, 0x080c, 0x468c,
-	0x0904, 0x320d, 0x080c, 0x61e8, 0x0904, 0x320a, 0x2019, 0x0005,
-	0x79a8, 0x080c, 0x6175, 0x0904, 0x320a, 0x7888, 0x908a, 0x1000,
-	0x1a04, 0x320d, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x7d64,
-	0x7984, 0xd184, 0x1904, 0x31d8, 0x0804, 0x41a2, 0x0126, 0x2091,
+	0x00ae, 0x0005, 0x81ff, 0x1904, 0x3362, 0x080c, 0x4889, 0x0904,
+	0x3365, 0x080c, 0x62fe, 0x0904, 0x3362, 0x080c, 0x63a0, 0x0904,
+	0x3362, 0x0804, 0x42fa, 0x81ff, 0x1904, 0x3362, 0x080c, 0x48a5,
+	0x0904, 0x3365, 0x080c, 0x642e, 0x0904, 0x3362, 0x2019, 0x0005,
+	0x79a8, 0x080c, 0x63bb, 0x0904, 0x3362, 0x7888, 0x908a, 0x1000,
+	0x1a04, 0x3365, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x801e,
+	0x7984, 0xd184, 0x1904, 0x3330, 0x0804, 0x42fa, 0x0126, 0x2091,
 	0x8000, 0x81ff, 0x0118, 0x2009, 0x0001, 0x0450, 0x2029, 0x07ff,
-	0x6458, 0x2400, 0x9506, 0x01f8, 0x2508, 0x080c, 0x5ff1, 0x11d8,
-	0x080c, 0x61e8, 0x1128, 0x2009, 0x0002, 0x62bc, 0x2518, 0x00c0,
-	0x2019, 0x0004, 0x900e, 0x080c, 0x6175, 0x1118, 0x2009, 0x0006,
+	0x6458, 0x2400, 0x9506, 0x01f8, 0x2508, 0x080c, 0x6237, 0x11d8,
+	0x080c, 0x642e, 0x1128, 0x2009, 0x0002, 0x62bc, 0x2518, 0x00c0,
+	0x2019, 0x0004, 0x900e, 0x080c, 0x63bb, 0x1118, 0x2009, 0x0006,
 	0x0078, 0x7884, 0x908a, 0x1000, 0x1270, 0x8003, 0x800b, 0x810b,
-	0x9108, 0x080c, 0x7d64, 0x8529, 0x1ae0, 0x012e, 0x0804, 0x31d8,
-	0x012e, 0x0804, 0x320a, 0x012e, 0x0804, 0x320d, 0x080c, 0x4670,
-	0x0904, 0x320d, 0x080c, 0x60b8, 0x0904, 0x320a, 0xbaa0, 0x2019,
-	0x0005, 0x00c6, 0x9066, 0x080c, 0x828c, 0x0076, 0x903e, 0x080c,
-	0x8184, 0x900e, 0x080c, 0xcef9, 0x007e, 0x00ce, 0x080c, 0x6154,
-	0x0804, 0x31d8, 0x080c, 0x4670, 0x0904, 0x320d, 0x080c, 0x6154,
-	0x2208, 0x0804, 0x31d8, 0x0156, 0x00d6, 0x00e6, 0x2069, 0x1906,
+	0x9108, 0x080c, 0x801e, 0x8529, 0x1ae0, 0x012e, 0x0804, 0x3330,
+	0x012e, 0x0804, 0x3362, 0x012e, 0x0804, 0x3365, 0x080c, 0x4889,
+	0x0904, 0x3365, 0x080c, 0x62fe, 0x0904, 0x3362, 0xbaa0, 0x2019,
+	0x0005, 0x00c6, 0x9066, 0x080c, 0x8549, 0x0076, 0x903e, 0x080c,
+	0x8441, 0x900e, 0x080c, 0xd27b, 0x007e, 0x00ce, 0x080c, 0x639a,
+	0x0804, 0x3330, 0x080c, 0x4889, 0x0904, 0x3365, 0x080c, 0x639a,
+	0x2208, 0x0804, 0x3330, 0x0156, 0x00d6, 0x00e6, 0x2069, 0x1906,
 	0x6810, 0x6914, 0x910a, 0x1208, 0x900e, 0x6816, 0x9016, 0x901e,
 	0x20a9, 0x007e, 0x2069, 0x1000, 0x2d04, 0x905d, 0x0118, 0xb84c,
-	0x0059, 0x9210, 0x8d68, 0x1f04, 0x34fc, 0x2300, 0x9218, 0x00ee,
-	0x00de, 0x015e, 0x0804, 0x31d8, 0x00f6, 0x0016, 0x907d, 0x0138,
+	0x0059, 0x9210, 0x8d68, 0x1f04, 0x3654, 0x2300, 0x9218, 0x00ee,
+	0x00de, 0x015e, 0x0804, 0x3330, 0x00f6, 0x0016, 0x907d, 0x0138,
 	0x9006, 0x8000, 0x2f0c, 0x81ff, 0x0110, 0x2178, 0x0cd0, 0x001e,
-	0x00fe, 0x0005, 0x2069, 0x1906, 0x6910, 0x62b8, 0x0804, 0x31d8,
-	0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x320a, 0x0126, 0x2091,
-	0x8000, 0x080c, 0x5167, 0x0128, 0x2009, 0x0007, 0x012e, 0x0804,
-	0x320a, 0x012e, 0x6158, 0x9190, 0x2fd9, 0x2215, 0x9294, 0x00ff,
+	0x00fe, 0x0005, 0x2069, 0x1906, 0x6910, 0x62b8, 0x0804, 0x3330,
+	0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3362, 0x0126, 0x2091,
+	0x8000, 0x080c, 0x5393, 0x0128, 0x2009, 0x0007, 0x012e, 0x0804,
+	0x3362, 0x012e, 0x6158, 0x9190, 0x3131, 0x2215, 0x9294, 0x00ff,
 	0x6378, 0x83ff, 0x0108, 0x627c, 0x67d8, 0x97c4, 0x000a, 0x98c6,
 	0x000a, 0x1118, 0x2031, 0x0001, 0x00e8, 0x97c4, 0x0022, 0x98c6,
 	0x0022, 0x1118, 0x2031, 0x0003, 0x00a8, 0x97c4, 0x0012, 0x98c6,
-	0x0012, 0x1118, 0x2031, 0x0002, 0x0068, 0x080c, 0x6d14, 0x1118,
+	0x0012, 0x1118, 0x2031, 0x0002, 0x0068, 0x080c, 0x6fa7, 0x1118,
 	0x2031, 0x0004, 0x0038, 0xd79c, 0x0120, 0x2009, 0x0005, 0x0804,
-	0x320a, 0x9036, 0x7e9a, 0x7f9e, 0x0804, 0x31d8, 0x6148, 0x624c,
-	0x2019, 0x1955, 0x231c, 0x2001, 0x1956, 0x2004, 0x789a, 0x0804,
-	0x31d8, 0x0126, 0x2091, 0x8000, 0x6138, 0x623c, 0x6340, 0x012e,
-	0x0804, 0x31d8, 0x080c, 0x468c, 0x0904, 0x320d, 0xba44, 0xbb38,
-	0x0804, 0x31d8, 0x080c, 0x0db4, 0x080c, 0x468c, 0x2110, 0x0904,
-	0x320d, 0xb804, 0x908c, 0x00ff, 0x918e, 0x0006, 0x0140, 0x9084,
-	0xff00, 0x9086, 0x0600, 0x2009, 0x0009, 0x1904, 0x320a, 0x0126,
-	0x2091, 0x8000, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c, 0x95bc,
-	0x080c, 0x828c, 0x0076, 0x903e, 0x080c, 0x8184, 0x900e, 0x080c,
-	0xcef9, 0x007e, 0x00ce, 0xb807, 0x0407, 0x012e, 0x0804, 0x31d8,
+	0x3362, 0x9036, 0x7e9a, 0x7f9e, 0x0804, 0x3330, 0x6148, 0x624c,
+	0x2019, 0x1957, 0x231c, 0x2001, 0x1958, 0x2004, 0x789a, 0x0804,
+	0x3330, 0x0126, 0x2091, 0x8000, 0x6138, 0x623c, 0x6340, 0x012e,
+	0x0804, 0x3330, 0x080c, 0x48a5, 0x0904, 0x3365, 0xba44, 0xbb38,
+	0x0804, 0x3330, 0x080c, 0x0db4, 0x080c, 0x48a5, 0x2110, 0x0904,
+	0x3365, 0xb804, 0x908c, 0x00ff, 0x918e, 0x0006, 0x0140, 0x9084,
+	0xff00, 0x9086, 0x0600, 0x2009, 0x0009, 0x1904, 0x3362, 0x0126,
+	0x2091, 0x8000, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c, 0x990d,
+	0x080c, 0x8549, 0x0076, 0x903e, 0x080c, 0x8441, 0x900e, 0x080c,
+	0xd27b, 0x007e, 0x00ce, 0xb807, 0x0407, 0x012e, 0x0804, 0x3330,
 	0x6148, 0x624c, 0x7884, 0x604a, 0x7b88, 0x634e, 0x2069, 0x1853,
-	0x831f, 0x9305, 0x6816, 0x788c, 0x2069, 0x1955, 0x2d1c, 0x206a,
-	0x7e98, 0x9682, 0x0014, 0x1210, 0x2031, 0x07d0, 0x2069, 0x1956,
-	0x2d04, 0x266a, 0x789a, 0x0804, 0x31d8, 0x0126, 0x2091, 0x8000,
+	0x831f, 0x9305, 0x6816, 0x788c, 0x2069, 0x1957, 0x2d1c, 0x206a,
+	0x7e98, 0x9682, 0x0014, 0x1210, 0x2031, 0x07d0, 0x2069, 0x1958,
+	0x2d04, 0x266a, 0x789a, 0x0804, 0x3330, 0x0126, 0x2091, 0x8000,
 	0x6138, 0x7884, 0x603a, 0x910e, 0xd1b4, 0x190c, 0x0e9b, 0xd0c4,
-	0x01a8, 0x00d6, 0x78a8, 0x2009, 0x196c, 0x200a, 0x78ac, 0x2011,
-	0x196d, 0x2012, 0x2069, 0x0100, 0x6838, 0x9086, 0x0007, 0x1118,
+	0x01a8, 0x00d6, 0x78a8, 0x2009, 0x196e, 0x200a, 0x78ac, 0x2011,
+	0x196f, 0x2012, 0x2069, 0x0100, 0x6838, 0x9086, 0x0007, 0x1118,
 	0x2214, 0x6a5a, 0x0010, 0x210c, 0x695a, 0x00de, 0x7888, 0x603e,
 	0x2011, 0x0114, 0x220c, 0x7888, 0xd08c, 0x0118, 0x918d, 0x0080,
 	0x0010, 0x918c, 0xff7f, 0x2112, 0x6140, 0x788c, 0x6042, 0x910e,
 	0xd1e4, 0x190c, 0x0eb1, 0x6040, 0xd0cc, 0x0120, 0x78b0, 0x2011,
-	0x0114, 0x2012, 0x012e, 0x0804, 0x31d8, 0x00f6, 0x2079, 0x1800,
+	0x0114, 0x2012, 0x012e, 0x0804, 0x3330, 0x00f6, 0x2079, 0x1800,
 	0x7a38, 0xa898, 0x9084, 0xfebf, 0x9215, 0xa89c, 0x9084, 0xfebf,
 	0x8002, 0x9214, 0x7838, 0x9084, 0x0140, 0x9215, 0x7a3a, 0xa897,
 	0x4000, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x00fe, 0x0005,
-	0x7898, 0x9005, 0x01a8, 0x7888, 0x9025, 0x0904, 0x320d, 0x788c,
-	0x902d, 0x0904, 0x320d, 0x900e, 0x080c, 0x5ff1, 0x1120, 0xba44,
+	0x7898, 0x9005, 0x01a8, 0x7888, 0x9025, 0x0904, 0x3365, 0x788c,
+	0x902d, 0x0904, 0x3365, 0x900e, 0x080c, 0x6237, 0x1120, 0xba44,
 	0xbb38, 0xbc46, 0xbd3a, 0x9186, 0x07ff, 0x0190, 0x8108, 0x0ca0,
-	0x080c, 0x468c, 0x0904, 0x320d, 0x7888, 0x900d, 0x0904, 0x320d,
-	0x788c, 0x9005, 0x0904, 0x320d, 0xba44, 0xb946, 0xbb38, 0xb83a,
-	0x0804, 0x31d8, 0x2011, 0xbc09, 0x0010, 0x2011, 0xbc05, 0x080c,
-	0x5167, 0x1904, 0x320a, 0x00c6, 0x2061, 0x0100, 0x7984, 0x9186,
+	0x080c, 0x48a5, 0x0904, 0x3365, 0x7888, 0x900d, 0x0904, 0x3365,
+	0x788c, 0x9005, 0x0904, 0x3365, 0xba44, 0xb946, 0xbb38, 0xb83a,
+	0x0804, 0x3330, 0x2011, 0xbc09, 0x0010, 0x2011, 0xbc05, 0x080c,
+	0x5393, 0x1904, 0x3362, 0x00c6, 0x2061, 0x0100, 0x7984, 0x9186,
 	0x00ff, 0x1130, 0x2001, 0x1817, 0x2004, 0x9085, 0xff00, 0x0088,
-	0x9182, 0x007f, 0x16e0, 0x9188, 0x2fd9, 0x210d, 0x918c, 0x00ff,
+	0x9182, 0x007f, 0x16e0, 0x9188, 0x3131, 0x210d, 0x918c, 0x00ff,
 	0x2001, 0x1817, 0x2004, 0x0026, 0x9116, 0x002e, 0x0580, 0x810f,
-	0x9105, 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0x9a72, 0x000e,
-	0x0510, 0x602e, 0x620a, 0x7984, 0x00b6, 0x080c, 0x5f97, 0x2b08,
-	0x00be, 0x1500, 0x6112, 0x6023, 0x0001, 0x080c, 0x4659, 0x01d0,
+	0x9105, 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0x9dc3, 0x000e,
+	0x0510, 0x602e, 0x620a, 0x7984, 0x00b6, 0x080c, 0x61dd, 0x2b08,
+	0x00be, 0x1500, 0x6112, 0x6023, 0x0001, 0x080c, 0x4872, 0x01d0,
 	0x9006, 0xa866, 0x7007, 0x0003, 0xa832, 0xa868, 0xc0fd, 0xa86a,
-	0x701f, 0x36ad, 0x2900, 0x6016, 0x2009, 0x0032, 0x080c, 0x9b42,
-	0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x320a, 0x00ce,
-	0x0804, 0x320d, 0x080c, 0x9ac8, 0x0cb0, 0xa830, 0x9086, 0x0100,
-	0x0904, 0x320a, 0x0804, 0x31d8, 0x2061, 0x1a3e, 0x0126, 0x2091,
+	0x701f, 0x3805, 0x2900, 0x6016, 0x2009, 0x0032, 0x080c, 0x9e93,
+	0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x3362, 0x00ce,
+	0x0804, 0x3365, 0x080c, 0x9e19, 0x0cb0, 0xa830, 0x9086, 0x0100,
+	0x0904, 0x3362, 0x0804, 0x3330, 0x2061, 0x1a41, 0x0126, 0x2091,
 	0x8000, 0x6000, 0xd084, 0x0170, 0x6104, 0x6208, 0x2061, 0x1800,
 	0x6350, 0x6070, 0x789a, 0x60bc, 0x789e, 0x60b8, 0x78aa, 0x012e,
-	0x0804, 0x31d8, 0x900e, 0x2110, 0x0c88, 0x81ff, 0x1904, 0x320a,
-	0x080c, 0x6d14, 0x0904, 0x320a, 0x0126, 0x2091, 0x8000, 0x6250,
-	0x6070, 0x9202, 0x0248, 0x9085, 0x0001, 0x080c, 0x2574, 0x080c,
-	0x5377, 0x012e, 0x0804, 0x31d8, 0x012e, 0x0804, 0x320d, 0x0006,
-	0x0016, 0x00c6, 0x00e6, 0x2001, 0x1978, 0x2070, 0x2061, 0x1853,
-	0x6008, 0x2072, 0x900e, 0x2011, 0x1400, 0x080c, 0x7f8b, 0x7206,
+	0x0804, 0x3330, 0x900e, 0x2110, 0x0c88, 0x81ff, 0x1904, 0x3362,
+	0x080c, 0x6fa7, 0x0904, 0x3362, 0x0126, 0x2091, 0x8000, 0x6250,
+	0x6070, 0x9202, 0x0248, 0x9085, 0x0001, 0x080c, 0x26cc, 0x080c,
+	0x55ad, 0x012e, 0x0804, 0x3330, 0x012e, 0x0804, 0x3365, 0x0006,
+	0x0016, 0x00c6, 0x00e6, 0x2001, 0x197a, 0x2070, 0x2061, 0x1853,
+	0x6008, 0x2072, 0x900e, 0x2011, 0x1400, 0x080c, 0x8248, 0x7206,
 	0x00ee, 0x00ce, 0x001e, 0x000e, 0x0005, 0x0126, 0x2091, 0x8000,
-	0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x31da, 0x7884,
+	0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x3332, 0x7884,
 	0xd0fc, 0x0148, 0x2001, 0x002a, 0x2004, 0x9082, 0x00e1, 0x0288,
-	0x012e, 0x0804, 0x320d, 0x2001, 0x002a, 0x2004, 0x2069, 0x1853,
-	0x6908, 0x9102, 0x1230, 0x012e, 0x0804, 0x320d, 0x012e, 0x0804,
-	0x320a, 0x080c, 0x9a47, 0x0dd0, 0x7884, 0xd0fc, 0x0904, 0x3778,
-	0x00c6, 0x080c, 0x4659, 0x00ce, 0x0d88, 0xa867, 0x0000, 0x7884,
+	0x012e, 0x0804, 0x3365, 0x2001, 0x002a, 0x2004, 0x2069, 0x1853,
+	0x6908, 0x9102, 0x1230, 0x012e, 0x0804, 0x3365, 0x012e, 0x0804,
+	0x3362, 0x080c, 0x9d98, 0x0dd0, 0x7884, 0xd0fc, 0x0904, 0x38d0,
+	0x00c6, 0x080c, 0x4872, 0x00ce, 0x0d88, 0xa867, 0x0000, 0x7884,
 	0xa80a, 0x7898, 0xa80e, 0x789c, 0xa812, 0x2001, 0x002e, 0x2004,
 	0xa81a, 0x2001, 0x002f, 0x2004, 0xa81e, 0x2001, 0x0030, 0x2004,
 	0xa822, 0x2001, 0x0031, 0x2004, 0xa826, 0x2001, 0x0034, 0x2004,
 	0xa82a, 0x2001, 0x0035, 0x2004, 0xa82e, 0x2001, 0x002a, 0x2004,
-	0x9080, 0x0003, 0x9084, 0x00fc, 0x8004, 0xa816, 0x080c, 0x38fe,
+	0x9080, 0x0003, 0x9084, 0x00fc, 0x8004, 0xa816, 0x080c, 0x3a56,
 	0x0928, 0x7014, 0x2048, 0xad2c, 0xac28, 0xab1c, 0xaa18, 0xa930,
 	0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, 0x0000, 0x8906,
 	0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b,
-	0x080c, 0x46a2, 0x701f, 0x383b, 0x7023, 0x0001, 0x012e, 0x0005,
+	0x080c, 0x48bb, 0x701f, 0x3993, 0x7023, 0x0001, 0x012e, 0x0005,
 	0x0046, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6,
-	0x00f6, 0x080c, 0x36e7, 0x2001, 0x196e, 0x2003, 0x0000, 0x2021,
+	0x00f6, 0x080c, 0x383f, 0x2001, 0x1970, 0x2003, 0x0000, 0x2021,
 	0x000a, 0x2061, 0x0100, 0x6104, 0x0016, 0x60bb, 0x0000, 0x60bf,
-	0x32e1, 0x60bf, 0x0012, 0x080c, 0x396d, 0x080c, 0x392c, 0x00f6,
-	0x00e6, 0x0086, 0x2940, 0x2071, 0x1a34, 0x2079, 0x0090, 0x00d6,
+	0x32e1, 0x60bf, 0x0012, 0x080c, 0x3ac5, 0x080c, 0x3a84, 0x00f6,
+	0x00e6, 0x0086, 0x2940, 0x2071, 0x1a36, 0x2079, 0x0090, 0x00d6,
 	0x2069, 0x0000, 0x6884, 0xd0b4, 0x0140, 0x2001, 0x0035, 0x2004,
 	0x780e, 0x2001, 0x0034, 0x2004, 0x780a, 0x00de, 0x2011, 0x0001,
-	0x080c, 0x3d00, 0x008e, 0x00ee, 0x00fe, 0x080c, 0x3c2d, 0x080c,
-	0x3b32, 0x05b8, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, 0x1db8,
-	0x080c, 0x3d74, 0x00f6, 0x2079, 0x0300, 0x78bc, 0x00fe, 0x908c,
+	0x080c, 0x3e58, 0x008e, 0x00ee, 0x00fe, 0x080c, 0x3d85, 0x080c,
+	0x3c8a, 0x05b8, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, 0x1db8,
+	0x080c, 0x3ecc, 0x00f6, 0x2079, 0x0300, 0x78bc, 0x00fe, 0x908c,
 	0x0070, 0x1560, 0x2071, 0x0200, 0x7037, 0x0000, 0x7050, 0x9084,
 	0xff00, 0x9086, 0x3200, 0x1510, 0x7037, 0x0001, 0x7050, 0x9084,
 	0xff00, 0x9086, 0xe100, 0x11d0, 0x7037, 0x0000, 0x7054, 0x7037,
 	0x0000, 0x715c, 0x9106, 0x1190, 0x2001, 0x181f, 0x2004, 0x9106,
 	0x1168, 0x00c6, 0x2061, 0x0100, 0x6024, 0x9084, 0x1e00, 0x00ce,
-	0x0138, 0x080c, 0x3b3c, 0x080c, 0x3927, 0x0058, 0x080c, 0x3927,
-	0x080c, 0x3c98, 0x080c, 0x3c23, 0x2001, 0x020b, 0x2004, 0xd0e4,
+	0x0138, 0x080c, 0x3c94, 0x080c, 0x3a7f, 0x0058, 0x080c, 0x3a7f,
+	0x080c, 0x3df0, 0x080c, 0x3d7b, 0x2001, 0x020b, 0x2004, 0xd0e4,
 	0x0dd8, 0x2001, 0x032a, 0x2003, 0x0004, 0x2061, 0x0100, 0x6027,
 	0x0002, 0x001e, 0x6106, 0x2011, 0x020d, 0x2013, 0x0020, 0x60bb,
 	0x0000, 0x60bf, 0x0108, 0x60bf, 0x0012, 0x2001, 0x0004, 0x200c,
-	0x918c, 0xfffd, 0x2102, 0x080c, 0x1296, 0x2009, 0x0028, 0x080c,
-	0x2110, 0x2001, 0x0227, 0x200c, 0x2102, 0x00fe, 0x00ee, 0x00de,
-	0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x004e, 0x2001, 0x196e,
-	0x2004, 0x9005, 0x1118, 0x012e, 0x0804, 0x31d8, 0x012e, 0x2021,
-	0x400c, 0x0804, 0x31da, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056,
+	0x918c, 0xfffd, 0x2102, 0x080c, 0x129f, 0x2009, 0x0028, 0x080c,
+	0x2268, 0x2001, 0x0227, 0x200c, 0x2102, 0x00fe, 0x00ee, 0x00de,
+	0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x004e, 0x2001, 0x1970,
+	0x2004, 0x9005, 0x1118, 0x012e, 0x0804, 0x3330, 0x012e, 0x2021,
+	0x400c, 0x0804, 0x3332, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056,
 	0x0076, 0x0086, 0x0096, 0x00d6, 0x0156, 0x7014, 0x2048, 0x7020,
-	0x20a8, 0x8000, 0x7022, 0xa804, 0x9005, 0x0904, 0x3897, 0x2048,
-	0x1f04, 0x384b, 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494, 0xa598,
+	0x20a8, 0x8000, 0x7022, 0xa804, 0x9005, 0x0904, 0x39ef, 0x2048,
+	0x1f04, 0x39a3, 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494, 0xa598,
 	0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, 0x0000,
 	0x0096, 0x7014, 0x2048, 0xa864, 0x009e, 0x9086, 0x0103, 0x0170,
 	0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080,
-	0x001b, 0x080c, 0x46a2, 0x701f, 0x383b, 0x00b0, 0x8906, 0x8006,
+	0x001b, 0x080c, 0x48bb, 0x701f, 0x3993, 0x00b0, 0x8906, 0x8006,
 	0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x21a8,
-	0x27e0, 0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c, 0x0f69, 0x000e,
-	0x080c, 0x46a5, 0x701f, 0x383b, 0x015e, 0x00de, 0x009e, 0x008e,
+	0x27e0, 0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c, 0x0f68, 0x000e,
+	0x080c, 0x48be, 0x701f, 0x3993, 0x015e, 0x00de, 0x009e, 0x008e,
 	0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x7014,
-	0x2048, 0xa864, 0x9086, 0x0103, 0x1118, 0x701f, 0x38fc, 0x0450,
+	0x2048, 0xa864, 0x9086, 0x0103, 0x1118, 0x701f, 0x3a54, 0x0450,
 	0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a, 0x2009, 0x007f, 0x080c,
-	0x5f91, 0x0110, 0x9006, 0x0030, 0xb813, 0x00ff, 0xb817, 0xfffd,
-	0x080c, 0xbc50, 0x015e, 0x00de, 0x009e, 0x008e, 0x007e, 0x005e,
-	0x004e, 0x003e, 0x002e, 0x001e, 0x0904, 0x320a, 0x0016, 0x0026,
+	0x61d7, 0x0110, 0x9006, 0x0030, 0xb813, 0x00ff, 0xb817, 0xfffd,
+	0x080c, 0xbfc2, 0x015e, 0x00de, 0x009e, 0x008e, 0x007e, 0x005e,
+	0x004e, 0x003e, 0x002e, 0x001e, 0x0904, 0x3362, 0x0016, 0x0026,
 	0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, 0x0156,
-	0x701f, 0x38ce, 0x7007, 0x0003, 0x0804, 0x388c, 0xa830, 0x9086,
-	0x0100, 0x2021, 0x400c, 0x0904, 0x31da, 0x0076, 0xad10, 0xac0c,
+	0x701f, 0x3a26, 0x7007, 0x0003, 0x0804, 0x39e4, 0xa830, 0x9086,
+	0x0100, 0x2021, 0x400c, 0x0904, 0x3332, 0x0076, 0xad10, 0xac0c,
 	0xab24, 0xaa20, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000,
 	0x2021, 0x0000, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084,
 	0xffc0, 0x9080, 0x001b, 0x21a8, 0x27e0, 0x2098, 0x27e8, 0x20a0,
-	0x0006, 0x080c, 0x0f69, 0x000e, 0x080c, 0x46a5, 0x007e, 0x701f,
-	0x383b, 0x7023, 0x0001, 0x0005, 0x0804, 0x31d8, 0x0156, 0x00c6,
+	0x0006, 0x080c, 0x0f68, 0x000e, 0x080c, 0x48be, 0x007e, 0x701f,
+	0x3993, 0x7023, 0x0001, 0x0005, 0x0804, 0x3330, 0x0156, 0x00c6,
 	0xa814, 0x908a, 0x001e, 0x0218, 0xa833, 0x001e, 0x0010, 0xa832,
-	0x0078, 0x81ff, 0x0168, 0x0016, 0x080c, 0x4659, 0x001e, 0x0130,
+	0x0078, 0x81ff, 0x0168, 0x0016, 0x080c, 0x4872, 0x001e, 0x0130,
 	0xa800, 0x2040, 0xa008, 0xa80a, 0x2100, 0x0c58, 0x9006, 0x0010,
 	0x9085, 0x0001, 0x00ce, 0x015e, 0x0005, 0x0006, 0x00f6, 0x2079,
 	0x0000, 0x7880, 0x9086, 0x0044, 0x00fe, 0x000e, 0x0005, 0x2001,
-	0x196e, 0x2003, 0x0001, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x2061,
-	0x0200, 0x2001, 0x1979, 0x2004, 0x601a, 0x2061, 0x0100, 0x2001,
-	0x1978, 0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x080c, 0x4659,
+	0x1970, 0x2003, 0x0001, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x2061,
+	0x0200, 0x2001, 0x197b, 0x2004, 0x601a, 0x2061, 0x0100, 0x2001,
+	0x197a, 0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x080c, 0x4872,
 	0xa813, 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e,
 	0x2004, 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, 0x2061, 0x0090,
-	0x2079, 0x0100, 0x2001, 0x1978, 0x2004, 0x6036, 0x2009, 0x0040,
-	0x080c, 0x2110, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e,
+	0x2079, 0x0100, 0x2001, 0x197a, 0x2004, 0x6036, 0x2009, 0x0040,
+	0x080c, 0x2268, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e,
 	0x601a, 0xa873, 0x0000, 0x601f, 0x0000, 0x78ca, 0x9006, 0x600a,
-	0x600e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, 0x080c, 0x4659,
+	0x600e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, 0x080c, 0x4872,
 	0x2940, 0xa013, 0x0019, 0xa017, 0x0001, 0x2800, 0xa05a, 0x2001,
 	0x0030, 0x2004, 0xa866, 0x2001, 0x0031, 0x2004, 0xa86a, 0x2001,
 	0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, 0xa873, 0x0000, 0x2001,
 	0x032a, 0x2003, 0x0004, 0x2001, 0x0300, 0x2003, 0x0000, 0x2001,
 	0x020d, 0x2003, 0x0000, 0x2001, 0x0004, 0x200c, 0x918d, 0x0002,
 	0x2102, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0148,
-	0x080c, 0x28fd, 0x1130, 0x9006, 0x080c, 0x2855, 0x9006, 0x080c,
-	0x2838, 0x7884, 0x9084, 0x0007, 0x0002, 0x39b8, 0x39c1, 0x39ca,
-	0x39b5, 0x39b5, 0x39b5, 0x39b5, 0x39b5, 0x012e, 0x0804, 0x320d,
-	0x2009, 0x0114, 0x2104, 0x9085, 0x0800, 0x200a, 0x080c, 0x3b86,
+	0x080c, 0x2a55, 0x1130, 0x9006, 0x080c, 0x29ad, 0x9006, 0x080c,
+	0x2990, 0x7884, 0x9084, 0x0007, 0x0002, 0x3b10, 0x3b19, 0x3b22,
+	0x3b0d, 0x3b0d, 0x3b0d, 0x3b0d, 0x3b0d, 0x012e, 0x0804, 0x3365,
+	0x2009, 0x0114, 0x2104, 0x9085, 0x0800, 0x200a, 0x080c, 0x3cde,
 	0x00c0, 0x2009, 0x0114, 0x2104, 0x9085, 0x4000, 0x200a, 0x080c,
-	0x3b86, 0x0078, 0x080c, 0x6d14, 0x1128, 0x012e, 0x2009, 0x0016,
-	0x0804, 0x320a, 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804,
-	0x31da, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6,
-	0x00f6, 0x080c, 0x36e7, 0x2009, 0x0101, 0x210c, 0x0016, 0x7ec8,
-	0x7dcc, 0x9006, 0x2068, 0x2060, 0x2058, 0x080c, 0x3e4f, 0x080c,
-	0x3d9f, 0x903e, 0x2720, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071,
-	0x1a34, 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4,
+	0x3cde, 0x0078, 0x080c, 0x6fa7, 0x1128, 0x012e, 0x2009, 0x0016,
+	0x0804, 0x3362, 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804,
+	0x3332, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6,
+	0x00f6, 0x080c, 0x383f, 0x2009, 0x0101, 0x210c, 0x0016, 0x7ec8,
+	0x7dcc, 0x9006, 0x2068, 0x2060, 0x2058, 0x080c, 0x3fa7, 0x080c,
+	0x3ef7, 0x903e, 0x2720, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071,
+	0x1a36, 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4,
 	0x0120, 0x68d4, 0x780e, 0x68d0, 0x780a, 0x00de, 0x2011, 0x0001,
-	0x080c, 0x3d00, 0x080c, 0x2905, 0x080c, 0x2905, 0x080c, 0x2905,
-	0x080c, 0x2905, 0x080c, 0x3d00, 0x008e, 0x00ee, 0x00fe, 0x080c,
-	0x3c2d, 0x2009, 0x9c40, 0x8109, 0x11b0, 0x080c, 0x3b3c, 0x2001,
+	0x080c, 0x3e58, 0x080c, 0x2a5d, 0x080c, 0x2a5d, 0x080c, 0x2a5d,
+	0x080c, 0x2a5d, 0x080c, 0x3e58, 0x008e, 0x00ee, 0x00fe, 0x080c,
+	0x3d85, 0x2009, 0x9c40, 0x8109, 0x11b0, 0x080c, 0x3c94, 0x2001,
 	0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x001e, 0x00fe, 0x00ee,
 	0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x2009, 0x0017,
-	0x080c, 0x320a, 0x0cf8, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140,
+	0x080c, 0x3362, 0x0cf8, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140,
 	0x1d10, 0x00f6, 0x2079, 0x0000, 0x7884, 0x00fe, 0xd0bc, 0x0178,
-	0x2001, 0x0201, 0x200c, 0x81ff, 0x0150, 0x080c, 0x3c0b, 0x2d00,
-	0x9c05, 0x9b05, 0x0120, 0x080c, 0x3b3c, 0x0804, 0x3ae9, 0x080c,
-	0x3d74, 0x080c, 0x3c98, 0x080c, 0x3bee, 0x080c, 0x3c23, 0x00f6,
-	0x2079, 0x0100, 0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x3b3c,
-	0x00fe, 0x0804, 0x3ae9, 0x00fe, 0x080c, 0x3b32, 0x1150, 0x8d68,
-	0x2001, 0x0032, 0x2602, 0x2001, 0x0033, 0x2502, 0x080c, 0x3b3c,
+	0x2001, 0x0201, 0x200c, 0x81ff, 0x0150, 0x080c, 0x3d63, 0x2d00,
+	0x9c05, 0x9b05, 0x0120, 0x080c, 0x3c94, 0x0804, 0x3c41, 0x080c,
+	0x3ecc, 0x080c, 0x3df0, 0x080c, 0x3d46, 0x080c, 0x3d7b, 0x00f6,
+	0x2079, 0x0100, 0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x3c94,
+	0x00fe, 0x0804, 0x3c41, 0x00fe, 0x080c, 0x3c8a, 0x1150, 0x8d68,
+	0x2001, 0x0032, 0x2602, 0x2001, 0x0033, 0x2502, 0x080c, 0x3c94,
 	0x0080, 0x87ff, 0x0138, 0x2001, 0x0201, 0x2004, 0x9005, 0x1908,
-	0x8739, 0x0038, 0x2001, 0x1a31, 0x2004, 0x9086, 0x0000, 0x1904,
-	0x3a39, 0x2001, 0x032f, 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529,
-	0x2500, 0x9605, 0x0904, 0x3ae9, 0x7884, 0xd0bc, 0x0128, 0x2d00,
-	0x9c05, 0x9b05, 0x1904, 0x3ae9, 0xa013, 0x0019, 0x2001, 0x032a,
-	0x2003, 0x0004, 0x7884, 0xd0ac, 0x1148, 0x2001, 0x1a31, 0x2003,
+	0x8739, 0x0038, 0x2001, 0x1a33, 0x2004, 0x9086, 0x0000, 0x1904,
+	0x3b91, 0x2001, 0x032f, 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529,
+	0x2500, 0x9605, 0x0904, 0x3c41, 0x7884, 0xd0bc, 0x0128, 0x2d00,
+	0x9c05, 0x9b05, 0x1904, 0x3c41, 0xa013, 0x0019, 0x2001, 0x032a,
+	0x2003, 0x0004, 0x7884, 0xd0ac, 0x1148, 0x2001, 0x1a33, 0x2003,
 	0x0003, 0x2001, 0x032a, 0x2003, 0x0009, 0x0030, 0xa017, 0x0001,
 	0x78b4, 0x9005, 0x0108, 0xa016, 0x2800, 0xa05a, 0x2009, 0x0040,
-	0x080c, 0x2110, 0x2900, 0xa85a, 0xa813, 0x0019, 0x7884, 0xd0a4,
+	0x080c, 0x2268, 0x2900, 0xa85a, 0xa813, 0x0019, 0x7884, 0xd0a4,
 	0x1180, 0xa817, 0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061, 0x0090,
-	0x602b, 0x0008, 0x2001, 0x0203, 0x2004, 0x1f04, 0x3ac0, 0x00ce,
+	0x602b, 0x0008, 0x2001, 0x0203, 0x2004, 0x1f04, 0x3c18, 0x00ce,
 	0x0030, 0xa817, 0x0001, 0x78b0, 0x9005, 0x0108, 0xa816, 0x00f6,
 	0x00c6, 0x2079, 0x0100, 0x2061, 0x0090, 0x7827, 0x0002, 0x2001,
 	0x002a, 0x2004, 0x9084, 0xfff8, 0x601a, 0x0006, 0x2001, 0x002b,
 	0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca, 0x00ce, 0x00fe, 0x0804,
-	0x39f3, 0x001e, 0x00c6, 0x2001, 0x032a, 0x2003, 0x0004, 0x2061,
+	0x3b4b, 0x001e, 0x00c6, 0x2001, 0x032a, 0x2003, 0x0004, 0x2061,
 	0x0100, 0x6027, 0x0002, 0x6106, 0x2011, 0x020d, 0x2013, 0x0020,
-	0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, 0x1296,
+	0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, 0x129f,
 	0x7884, 0x9084, 0x0003, 0x9086, 0x0002, 0x01a0, 0x2009, 0x0028,
-	0x080c, 0x2110, 0x2001, 0x0227, 0x200c, 0x2102, 0x6050, 0x9084,
+	0x080c, 0x2268, 0x2001, 0x0227, 0x200c, 0x2102, 0x6050, 0x9084,
 	0xb7ef, 0x6052, 0x602f, 0x0000, 0x604b, 0xf7f7, 0x6043, 0x0090,
 	0x6043, 0x0010, 0x00ce, 0x2d08, 0x2c10, 0x2b18, 0x2b00, 0x9c05,
 	0x9d05, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e,
-	0x008e, 0x1118, 0x012e, 0x0804, 0x31d8, 0x012e, 0x2021, 0x400c,
-	0x0804, 0x31da, 0x9085, 0x0001, 0x1d04, 0x3b3b, 0x2091, 0x6000,
+	0x008e, 0x1118, 0x012e, 0x0804, 0x3330, 0x012e, 0x2021, 0x400c,
+	0x0804, 0x3332, 0x9085, 0x0001, 0x1d04, 0x3c93, 0x2091, 0x6000,
 	0x8420, 0x9486, 0x0064, 0x0005, 0x2001, 0x0105, 0x2003, 0x0010,
-	0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x1a31, 0x2003, 0x0000,
-	0x0071, 0x2009, 0x0048, 0x080c, 0x2110, 0x2001, 0x0227, 0x2024,
+	0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x1a33, 0x2003, 0x0000,
+	0x0071, 0x2009, 0x0048, 0x080c, 0x2268, 0x2001, 0x0227, 0x2024,
 	0x2402, 0x2001, 0x0109, 0x2003, 0x4000, 0x9026, 0x0005, 0x00f6,
-	0x00e6, 0x2071, 0x1a34, 0x7000, 0x9086, 0x0000, 0x0520, 0x2079,
+	0x00e6, 0x2071, 0x1a36, 0x7000, 0x9086, 0x0000, 0x0520, 0x2079,
 	0x0090, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106,
-	0x1120, 0x2009, 0x0040, 0x080c, 0x2110, 0x782c, 0xd0fc, 0x0d88,
-	0x080c, 0x3d74, 0x7000, 0x9086, 0x0000, 0x1d58, 0x782b, 0x0004,
-	0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x2110, 0x782b,
+	0x1120, 0x2009, 0x0040, 0x080c, 0x2268, 0x782c, 0xd0fc, 0x0d88,
+	0x080c, 0x3ecc, 0x7000, 0x9086, 0x0000, 0x1d58, 0x782b, 0x0004,
+	0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x2268, 0x782b,
 	0x0002, 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079,
-	0x0100, 0x2001, 0x1817, 0x200c, 0x7932, 0x7936, 0x080c, 0x2554,
+	0x0100, 0x2001, 0x1817, 0x200c, 0x7932, 0x7936, 0x080c, 0x26ac,
 	0x7850, 0x9084, 0xfbff, 0x9085, 0x0030, 0x7852, 0x2019, 0x01f4,
 	0x8319, 0x1df0, 0x9084, 0xffcf, 0x9085, 0x2000, 0x7852, 0x20a9,
-	0x0046, 0x1d04, 0x3ba1, 0x2091, 0x6000, 0x1f04, 0x3ba1, 0x7850,
+	0x0046, 0x1d04, 0x3cf9, 0x2091, 0x6000, 0x1f04, 0x3cf9, 0x7850,
 	0x9085, 0x0400, 0x9084, 0xdfff, 0x7852, 0x2001, 0x0021, 0x2004,
 	0x9084, 0x0003, 0x9086, 0x0001, 0x1120, 0x7850, 0x9084, 0xdfff,
 	0x7852, 0x784b, 0xf7f7, 0x7843, 0x0090, 0x7843, 0x0010, 0x20a9,
-	0x0028, 0xa001, 0x1f04, 0x3bc1, 0x7850, 0x9085, 0x1400, 0x7852,
+	0x0028, 0xa001, 0x1f04, 0x3d19, 0x7850, 0x9085, 0x1400, 0x7852,
 	0x2019, 0x61a8, 0x7854, 0xa001, 0xa001, 0xd08c, 0x1110, 0x8319,
 	0x1dc8, 0x7827, 0x0048, 0x7850, 0x9085, 0x0400, 0x7852, 0x7843,
 	0x0040, 0x2019, 0x01f4, 0xa001, 0xa001, 0x8319, 0x1de0, 0x2001,
-	0x0100, 0x080c, 0x29bc, 0x7827, 0x0020, 0x7843, 0x0000, 0x9006,
-	0x080c, 0x29bc, 0x7827, 0x0048, 0x00fe, 0x0005, 0x7884, 0xd0ac,
-	0x11c8, 0x00f6, 0x00e6, 0x2071, 0x1a31, 0x2079, 0x0320, 0x2001,
+	0x0100, 0x080c, 0x2b14, 0x7827, 0x0020, 0x7843, 0x0000, 0x9006,
+	0x080c, 0x2b14, 0x7827, 0x0048, 0x00fe, 0x0005, 0x7884, 0xd0ac,
+	0x11c8, 0x00f6, 0x00e6, 0x2071, 0x1a33, 0x2079, 0x0320, 0x2001,
 	0x0201, 0x2004, 0x9005, 0x0160, 0x7000, 0x9086, 0x0000, 0x1140,
 	0x0051, 0xd0bc, 0x0108, 0x8738, 0x7003, 0x0003, 0x782b, 0x0019,
 	0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0300, 0x78bc, 0x00fe,
@@ -1720,7 +1763,7 @@ unsigned short risc_code01[] = { 
 	0x250a, 0xd0b4, 0x0108, 0x8c60, 0xd0ac, 0x0108, 0x8d68, 0xd0a4,
 	0x0108, 0x8b58, 0x0005, 0x00f6, 0x2079, 0x0200, 0x781c, 0xd084,
 	0x0110, 0x7837, 0x0050, 0x00fe, 0x0005, 0x00e6, 0x2071, 0x0100,
-	0x2001, 0x1979, 0x2004, 0x70e2, 0x080c, 0x391d, 0x1188, 0x2001,
+	0x2001, 0x197b, 0x2004, 0x70e2, 0x080c, 0x3a75, 0x1188, 0x2001,
 	0x181f, 0x2004, 0x2009, 0x181e, 0x210c, 0x918c, 0x00ff, 0x706e,
 	0x716a, 0x7066, 0x918d, 0x3200, 0x7162, 0x7073, 0xe109, 0x0080,
 	0x702c, 0x9085, 0x0002, 0x702e, 0x2009, 0x1817, 0x210c, 0x716e,
@@ -1728,31 +1771,31 @@ unsigned short risc_code01[] = { 
 	0x7077, 0x0008, 0x7078, 0x9080, 0x0100, 0x707a, 0x7080, 0x8000,
 	0x7082, 0x7087, 0xaaaa, 0x9006, 0x708a, 0x708e, 0x707e, 0x70d6,
 	0x70ab, 0x0036, 0x70af, 0x95d5, 0x7014, 0x9084, 0x1984, 0x9085,
-	0x0092, 0x7016, 0x080c, 0x3d74, 0x00f6, 0x2071, 0x1a31, 0x2079,
+	0x0092, 0x7016, 0x080c, 0x3ecc, 0x00f6, 0x2071, 0x1a33, 0x2079,
 	0x0320, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120, 0x689c,
 	0x780e, 0x6898, 0x780a, 0x00de, 0x2009, 0x03e8, 0x8109, 0x1df0,
 	0x792c, 0xd1fc, 0x0110, 0x782b, 0x0004, 0x2011, 0x0011, 0x080c,
-	0x3d00, 0x2011, 0x0001, 0x080c, 0x3d00, 0x00fe, 0x00ee, 0x0005,
-	0x00f6, 0x00e6, 0x2071, 0x1a31, 0x2079, 0x0320, 0x792c, 0xd1fc,
-	0x0904, 0x3cfd, 0x782b, 0x0002, 0x9026, 0xd19c, 0x1904, 0x3cf9,
-	0x7000, 0x0002, 0x3cfd, 0x3cae, 0x3cde, 0x3cf9, 0xd1bc, 0x1170,
-	0xd1dc, 0x1190, 0x8001, 0x7002, 0x2011, 0x0001, 0x080c, 0x3d00,
-	0x0904, 0x3cfd, 0x080c, 0x3d00, 0x0804, 0x3cfd, 0x00f6, 0x2079,
+	0x3e58, 0x2011, 0x0001, 0x080c, 0x3e58, 0x00fe, 0x00ee, 0x0005,
+	0x00f6, 0x00e6, 0x2071, 0x1a33, 0x2079, 0x0320, 0x792c, 0xd1fc,
+	0x0904, 0x3e55, 0x782b, 0x0002, 0x9026, 0xd19c, 0x1904, 0x3e51,
+	0x7000, 0x0002, 0x3e55, 0x3e06, 0x3e36, 0x3e51, 0xd1bc, 0x1170,
+	0xd1dc, 0x1190, 0x8001, 0x7002, 0x2011, 0x0001, 0x080c, 0x3e58,
+	0x0904, 0x3e55, 0x080c, 0x3e58, 0x0804, 0x3e55, 0x00f6, 0x2079,
 	0x0300, 0x78bf, 0x0000, 0x00fe, 0x7810, 0x7914, 0x782b, 0x0004,
 	0x7812, 0x7916, 0x2001, 0x0201, 0x200c, 0x81ff, 0x0de8, 0x080c,
-	0x3c0b, 0x2009, 0x0001, 0x00f6, 0x2079, 0x0300, 0x78b8, 0x00fe,
+	0x3d63, 0x2009, 0x0001, 0x00f6, 0x2079, 0x0300, 0x78b8, 0x00fe,
 	0xd0ec, 0x0110, 0x2009, 0x0011, 0x792a, 0x00f8, 0x8001, 0x7002,
-	0x9184, 0x0880, 0x1140, 0x782c, 0xd0fc, 0x1904, 0x3ca2, 0x2011,
+	0x9184, 0x0880, 0x1140, 0x782c, 0xd0fc, 0x1904, 0x3dfa, 0x2011,
 	0x0001, 0x00b1, 0x0090, 0xa010, 0x9092, 0x0004, 0x9086, 0x0015,
 	0x1120, 0xa000, 0xa05a, 0x2011, 0x0031, 0xa212, 0xd1dc, 0x1960,
 	0x0828, 0x782b, 0x0004, 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005,
 	0xa014, 0x9005, 0x0550, 0x8001, 0x0036, 0x0096, 0xa016, 0xa058,
 	0x2048, 0xa010, 0x2009, 0x0031, 0x911a, 0x831c, 0x831c, 0x938a,
-	0x0007, 0x1a0c, 0x0db4, 0x9398, 0x3d2e, 0x231d, 0x083f, 0x9080,
+	0x0007, 0x1a0c, 0x0db4, 0x9398, 0x3e86, 0x231d, 0x083f, 0x9080,
 	0x0004, 0x7a2a, 0x7100, 0x8108, 0x7102, 0x009e, 0x003e, 0x908a,
 	0x0035, 0x1140, 0x0096, 0xa058, 0x2048, 0xa804, 0xa05a, 0x2001,
-	0x0019, 0x009e, 0xa012, 0x9085, 0x0001, 0x0005, 0x3d6b, 0x3d62,
-	0x3d59, 0x3d50, 0x3d47, 0x3d3e, 0x3d35, 0xa964, 0x7902, 0xa968,
+	0x0019, 0x009e, 0xa012, 0x9085, 0x0001, 0x0005, 0x3ec3, 0x3eba,
+	0x3eb1, 0x3ea8, 0x3e9f, 0x3e96, 0x3e8d, 0xa964, 0x7902, 0xa968,
 	0x7906, 0xa96c, 0x7912, 0xa970, 0x7916, 0x0005, 0xa974, 0x7902,
 	0xa978, 0x7906, 0xa97c, 0x7912, 0xa980, 0x7916, 0x0005, 0xa984,
 	0x7902, 0xa988, 0x7906, 0xa98c, 0x7912, 0xa990, 0x7916, 0x0005,
@@ -1761,24 +1804,24 @@ unsigned short risc_code01[] = { 
 	0x7916, 0x0005, 0xa9b4, 0x7902, 0xa9b8, 0x7906, 0xa9bc, 0x7912,
 	0xa9c0, 0x7916, 0x0005, 0xa9c4, 0x7902, 0xa9c8, 0x7906, 0xa9cc,
 	0x7912, 0xa9d0, 0x7916, 0x0005, 0x00f6, 0x00e6, 0x0086, 0x2071,
-	0x1a34, 0x2079, 0x0090, 0x792c, 0xd1fc, 0x01e8, 0x782b, 0x0002,
-	0x2940, 0x9026, 0x7000, 0x0002, 0x3d9b, 0x3d87, 0x3d92, 0x8001,
-	0x7002, 0xd19c, 0x1180, 0x2011, 0x0001, 0x080c, 0x3d00, 0x190c,
-	0x3d00, 0x0048, 0x8001, 0x7002, 0x782c, 0xd0fc, 0x1d38, 0x2011,
-	0x0001, 0x080c, 0x3d00, 0x008e, 0x00ee, 0x00fe, 0x0005, 0x00f6,
-	0x00e6, 0x00c6, 0x0086, 0x2061, 0x0200, 0x2001, 0x1979, 0x2004,
-	0x601a, 0x2061, 0x0100, 0x2001, 0x1978, 0x2004, 0x60ce, 0x6104,
+	0x1a36, 0x2079, 0x0090, 0x792c, 0xd1fc, 0x01e8, 0x782b, 0x0002,
+	0x2940, 0x9026, 0x7000, 0x0002, 0x3ef3, 0x3edf, 0x3eea, 0x8001,
+	0x7002, 0xd19c, 0x1180, 0x2011, 0x0001, 0x080c, 0x3e58, 0x190c,
+	0x3e58, 0x0048, 0x8001, 0x7002, 0x782c, 0xd0fc, 0x1d38, 0x2011,
+	0x0001, 0x080c, 0x3e58, 0x008e, 0x00ee, 0x00fe, 0x0005, 0x00f6,
+	0x00e6, 0x00c6, 0x0086, 0x2061, 0x0200, 0x2001, 0x197b, 0x2004,
+	0x601a, 0x2061, 0x0100, 0x2001, 0x197a, 0x2004, 0x60ce, 0x6104,
 	0xc1ac, 0x6106, 0x2001, 0x002c, 0x2004, 0x9005, 0x0520, 0x2038,
-	0x2001, 0x002e, 0x2024, 0x2001, 0x002f, 0x201c, 0x080c, 0x4659,
+	0x2001, 0x002e, 0x2024, 0x2001, 0x002f, 0x201c, 0x080c, 0x4872,
 	0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, 0x0220,
 	0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, 0xa858,
-	0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x3e17, 0x1d68,
-	0x2900, 0xa85a, 0x00d0, 0x080c, 0x4659, 0xa813, 0x0019, 0xa817,
+	0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x3f6f, 0x1d68,
+	0x2900, 0xa85a, 0x00d0, 0x080c, 0x4872, 0xa813, 0x0019, 0xa817,
 	0x0001, 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, 0xa866, 0x2001,
 	0x002f, 0x2004, 0xa86a, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8,
 	0xa86e, 0x2001, 0x002b, 0x2004, 0xa872, 0x2061, 0x0090, 0x2079,
-	0x0100, 0x2001, 0x1978, 0x2004, 0x6036, 0x2009, 0x0040, 0x080c,
-	0x2110, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0x601a, 0x0006,
+	0x0100, 0x2001, 0x197a, 0x2004, 0x6036, 0x2009, 0x0040, 0x080c,
+	0x2268, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0x601a, 0x0006,
 	0x2001, 0x002b, 0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca, 0x9006,
 	0x600a, 0x600e, 0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6,
 	0x2071, 0x0080, 0xaa60, 0x22e8, 0x20a0, 0x20e1, 0x0000, 0x2099,
@@ -1786,1684 +1829,1726 @@ unsigned short risc_code01[] = { 
 	0x810b, 0x810b, 0x21a8, 0x810b, 0x7112, 0x702b, 0x0041, 0x702c,
 	0xd0fc, 0x0de8, 0x702b, 0x0002, 0x702b, 0x0040, 0x4005, 0x7400,
 	0x7304, 0x87ff, 0x0190, 0x0086, 0x0096, 0x2940, 0x0086, 0x080c,
-	0x4659, 0x008e, 0xa058, 0x00a6, 0x2050, 0x2900, 0xb006, 0xa05a,
+	0x4872, 0x008e, 0xa058, 0x00a6, 0x2050, 0x2900, 0xb006, 0xa05a,
 	0x00ae, 0x009e, 0x008e, 0x9085, 0x0001, 0x00ee, 0x0005, 0x00e6,
 	0x2001, 0x002d, 0x2004, 0x9005, 0x0528, 0x2038, 0x2001, 0x0030,
-	0x2024, 0x2001, 0x0031, 0x201c, 0x080c, 0x4659, 0x2940, 0xa813,
+	0x2024, 0x2001, 0x0031, 0x201c, 0x080c, 0x4872, 0x2940, 0xa813,
 	0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, 0x0220, 0x2138,
 	0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, 0xa858, 0x2048,
-	0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x3e17, 0x1d68, 0x2900,
-	0xa85a, 0x00d8, 0x080c, 0x4659, 0x2940, 0xa013, 0x0019, 0xa017,
+	0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x3f6f, 0x1d68, 0x2900,
+	0xa85a, 0x00d8, 0x080c, 0x4872, 0x2940, 0xa013, 0x0019, 0xa017,
 	0x0001, 0x2800, 0xa05a, 0x2001, 0x0030, 0x2004, 0xa066, 0x2001,
 	0x0031, 0x2004, 0xa06a, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8,
 	0xa06e, 0x2001, 0x002b, 0x2004, 0xa072, 0x2001, 0x032a, 0x2003,
 	0x0004, 0x7884, 0xd0ac, 0x1180, 0x2001, 0x0101, 0x200c, 0x918d,
-	0x0200, 0x2102, 0xa017, 0x0000, 0x2001, 0x1a31, 0x2003, 0x0003,
+	0x0200, 0x2102, 0xa017, 0x0000, 0x2001, 0x1a33, 0x2003, 0x0003,
 	0x2001, 0x032a, 0x2003, 0x0009, 0x2001, 0x0300, 0x2003, 0x0000,
 	0x2001, 0x020d, 0x2003, 0x0000, 0x2001, 0x0004, 0x200c, 0x918d,
 	0x0002, 0x2102, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x20a9,
 	0x0013, 0x20a1, 0x1840, 0x20e9, 0x0001, 0x9006, 0x4004, 0x2009,
 	0x013c, 0x200a, 0x012e, 0x7880, 0x9086, 0x0052, 0x0108, 0x0005,
-	0x0804, 0x31d8, 0x7d98, 0x7c9c, 0x0804, 0x32cf, 0x080c, 0x6d14,
-	0x190c, 0x5a59, 0x2069, 0x1853, 0x2d00, 0x2009, 0x0030, 0x7a8c,
-	0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x080c, 0x46a2, 0x701f,
-	0x3eea, 0x0005, 0x080c, 0x5162, 0x1130, 0x3b00, 0x3a08, 0xc194,
+	0x0804, 0x3330, 0x7d98, 0x7c9c, 0x0804, 0x3427, 0x080c, 0x6fa7,
+	0x190c, 0x5c8f, 0x2069, 0x1853, 0x2d00, 0x2009, 0x0030, 0x7a8c,
+	0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x080c, 0x48bb, 0x701f,
+	0x4042, 0x0005, 0x080c, 0x538e, 0x1130, 0x3b00, 0x3a08, 0xc194,
 	0xc095, 0x20d8, 0x21d0, 0x2069, 0x1853, 0x6800, 0x9005, 0x0904,
-	0x320d, 0x6804, 0xd094, 0x00c6, 0x2061, 0x0100, 0x6104, 0x0138,
+	0x3365, 0x6804, 0xd094, 0x00c6, 0x2061, 0x0100, 0x6104, 0x0138,
 	0x6200, 0x9292, 0x0005, 0x0218, 0x918c, 0xffdf, 0x0010, 0x918d,
 	0x0020, 0x6106, 0x00ce, 0xd08c, 0x00c6, 0x2061, 0x0100, 0x6104,
 	0x0118, 0x918d, 0x0010, 0x0010, 0x918c, 0xffef, 0x6106, 0x00ce,
-	0xd084, 0x0158, 0x6a28, 0x928a, 0x007f, 0x1a04, 0x320d, 0x9288,
-	0x2fd9, 0x210d, 0x918c, 0x00ff, 0x6162, 0xd0dc, 0x0130, 0x6828,
-	0x908a, 0x007f, 0x1a04, 0x320d, 0x605a, 0x6888, 0x9084, 0x0030,
-	0x8004, 0x8004, 0x8004, 0x8004, 0x0006, 0x2009, 0x1980, 0x9080,
-	0x2647, 0x2005, 0x200a, 0x000e, 0x2009, 0x1981, 0x9080, 0x264b,
-	0x2005, 0x200a, 0x6808, 0x908a, 0x0100, 0x0a04, 0x320d, 0x908a,
-	0x0841, 0x1a04, 0x320d, 0x9084, 0x0007, 0x1904, 0x320d, 0x680c,
-	0x9005, 0x0904, 0x320d, 0x6810, 0x9005, 0x0904, 0x320d, 0x6848,
-	0x6940, 0x910a, 0x1a04, 0x320d, 0x8001, 0x0904, 0x320d, 0x684c,
-	0x6944, 0x910a, 0x1a04, 0x320d, 0x8001, 0x0904, 0x320d, 0x2009,
-	0x1950, 0x200b, 0x0000, 0x2001, 0x1875, 0x2004, 0xd0c4, 0x0140,
+	0xd084, 0x0158, 0x6a28, 0x928a, 0x007f, 0x1a04, 0x3365, 0x9288,
+	0x3131, 0x210d, 0x918c, 0x00ff, 0x6162, 0xd0dc, 0x0130, 0x6828,
+	0x908a, 0x007f, 0x1a04, 0x3365, 0x605a, 0x6888, 0x9084, 0x0030,
+	0x8004, 0x8004, 0x8004, 0x8004, 0x0006, 0x2009, 0x1982, 0x9080,
+	0x279f, 0x2005, 0x200a, 0x000e, 0x2009, 0x1983, 0x9080, 0x27a3,
+	0x2005, 0x200a, 0x6808, 0x908a, 0x0100, 0x0a04, 0x3365, 0x908a,
+	0x0841, 0x1a04, 0x3365, 0x9084, 0x0007, 0x1904, 0x3365, 0x680c,
+	0x9005, 0x0904, 0x3365, 0x6810, 0x9005, 0x0904, 0x3365, 0x6848,
+	0x6940, 0x910a, 0x1a04, 0x3365, 0x8001, 0x0904, 0x3365, 0x684c,
+	0x6944, 0x910a, 0x1a04, 0x3365, 0x8001, 0x0904, 0x3365, 0x2009,
+	0x1952, 0x200b, 0x0000, 0x2001, 0x1875, 0x2004, 0xd0c4, 0x0140,
 	0x7884, 0x200a, 0x2009, 0x017f, 0x200a, 0x3b00, 0xc085, 0x20d8,
 	0x6814, 0x908c, 0x00ff, 0x614a, 0x8007, 0x9084, 0x00ff, 0x604e,
-	0x080c, 0x7029, 0x080c, 0x6395, 0x080c, 0x63ca, 0x6808, 0x602a,
-	0x080c, 0x2082, 0x2009, 0x0170, 0x200b, 0x0080, 0xa001, 0xa001,
-	0x200b, 0x0000, 0x0036, 0x6b08, 0x080c, 0x25ae, 0x003e, 0x6000,
-	0x9086, 0x0000, 0x1904, 0x4067, 0x6818, 0x691c, 0x6a20, 0x6b24,
+	0x080c, 0x72bc, 0x080c, 0x6628, 0x080c, 0x665d, 0x6808, 0x602a,
+	0x080c, 0x21da, 0x2009, 0x0170, 0x200b, 0x0080, 0xa001, 0xa001,
+	0x200b, 0x0000, 0x0036, 0x6b08, 0x080c, 0x2706, 0x003e, 0x6000,
+	0x9086, 0x0000, 0x1904, 0x41bf, 0x6818, 0x691c, 0x6a20, 0x6b24,
 	0x8007, 0x810f, 0x8217, 0x831f, 0x6016, 0x611a, 0x621e, 0x6322,
 	0x6c04, 0xd4f4, 0x0148, 0x6830, 0x6934, 0x6a38, 0x6b3c, 0x8007,
 	0x810f, 0x8217, 0x831f, 0x0010, 0x9084, 0xf0ff, 0x6006, 0x610a,
 	0x620e, 0x6312, 0x8007, 0x810f, 0x8217, 0x831f, 0x20a9, 0x0004,
-	0x20a1, 0x1982, 0x20e9, 0x0001, 0x4001, 0x20a9, 0x0004, 0x20a1,
-	0x199c, 0x20e9, 0x0001, 0x4001, 0x080c, 0x7e5c, 0x00c6, 0x900e,
+	0x20a1, 0x1984, 0x20e9, 0x0001, 0x4001, 0x20a9, 0x0004, 0x20a1,
+	0x199e, 0x20e9, 0x0001, 0x4001, 0x080c, 0x8119, 0x00c6, 0x900e,
 	0x20a9, 0x0001, 0x6b70, 0xd384, 0x0510, 0x0068, 0x2009, 0x0100,
 	0x210c, 0x918e, 0x0008, 0x1110, 0x839d, 0x0010, 0x83f5, 0x3e18,
-	0x12b0, 0x3508, 0x8109, 0x080c, 0x75df, 0x6878, 0x6016, 0x6874,
+	0x12b0, 0x3508, 0x8109, 0x080c, 0x7887, 0x6878, 0x6016, 0x6874,
 	0x2008, 0x9084, 0xff00, 0x8007, 0x600a, 0x9184, 0x00ff, 0x6006,
 	0x8108, 0x1118, 0x6003, 0x0003, 0x0010, 0x6003, 0x0001, 0x1f04,
-	0x3fd6, 0x00ce, 0x00c6, 0x2061, 0x196b, 0x2063, 0x0001, 0x9006,
-	0x080c, 0x2855, 0x9006, 0x080c, 0x2838, 0x0000, 0x00ce, 0x00e6,
+	0x412e, 0x00ce, 0x00c6, 0x2061, 0x196d, 0x2063, 0x0001, 0x9006,
+	0x080c, 0x29ad, 0x9006, 0x080c, 0x2990, 0x0000, 0x00ce, 0x00e6,
 	0x2c70, 0x080c, 0x0e80, 0x00ee, 0x6888, 0xd0ec, 0x0130, 0x2011,
 	0x0114, 0x2204, 0x9085, 0x0100, 0x2012, 0x6a80, 0x9284, 0x0030,
 	0x9086, 0x0030, 0x1128, 0x9294, 0xffcf, 0x9295, 0x0020, 0x6a82,
 	0x2001, 0x194d, 0x6a80, 0x9294, 0x0030, 0x928e, 0x0000, 0x0170,
 	0x928e, 0x0010, 0x0118, 0x928e, 0x0020, 0x0140, 0x2003, 0xaaaa,
-	0x080c, 0x2623, 0x2001, 0x193e, 0x2102, 0x0008, 0x2102, 0x00c6,
+	0x080c, 0x277b, 0x2001, 0x193e, 0x2102, 0x0008, 0x2102, 0x00c6,
 	0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c,
-	0x6d14, 0x0128, 0x080c, 0x4a6e, 0x0110, 0x080c, 0x2574, 0x60d0,
-	0x9005, 0x01c0, 0x6003, 0x0001, 0x2009, 0x404f, 0x00d0, 0x080c,
-	0x6d14, 0x1168, 0x2011, 0x6b95, 0x080c, 0x7d56, 0x2011, 0x6b88,
-	0x080c, 0x7e27, 0x080c, 0x6ffd, 0x080c, 0x6c46, 0x0040, 0x080c,
-	0x5953, 0x0028, 0x6003, 0x0004, 0x2009, 0x4067, 0x0010, 0x0804,
-	0x31d8, 0x2001, 0x0170, 0x2004, 0x9084, 0x00ff, 0x9086, 0x004c,
+	0x6fa7, 0x0128, 0x080c, 0x4c8b, 0x0110, 0x080c, 0x26cc, 0x60d0,
+	0x9005, 0x01c0, 0x6003, 0x0001, 0x2009, 0x41a7, 0x00d0, 0x080c,
+	0x6fa7, 0x1168, 0x2011, 0x6e28, 0x080c, 0x8010, 0x2011, 0x6e1b,
+	0x080c, 0x80e4, 0x080c, 0x7290, 0x080c, 0x6ed9, 0x0040, 0x080c,
+	0x5b89, 0x0028, 0x6003, 0x0004, 0x2009, 0x41bf, 0x0010, 0x0804,
+	0x3330, 0x2001, 0x0170, 0x2004, 0x9084, 0x00ff, 0x9086, 0x004c,
 	0x1118, 0x2091, 0x30bd, 0x0817, 0x2091, 0x303d, 0x0817, 0x6000,
-	0x9086, 0x0000, 0x0904, 0x320a, 0x2069, 0x1853, 0x7890, 0x6842,
+	0x9086, 0x0000, 0x0904, 0x3362, 0x2069, 0x1853, 0x7890, 0x6842,
 	0x7894, 0x6846, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c,
-	0x7d98, 0x2039, 0x0001, 0x0804, 0x46a5, 0x9006, 0x080c, 0x2574,
-	0x81ff, 0x1904, 0x320a, 0x080c, 0x6d14, 0x11b0, 0x080c, 0x6ff8,
-	0x080c, 0x5a94, 0x080c, 0x2fd4, 0x0118, 0x6130, 0xc18d, 0x6132,
-	0x080c, 0xbe86, 0x0130, 0x080c, 0x6d37, 0x1118, 0x080c, 0x6cec,
-	0x0038, 0x080c, 0x6c46, 0x0020, 0x080c, 0x5a59, 0x080c, 0x5953,
-	0x0804, 0x31d8, 0x81ff, 0x1904, 0x320a, 0x080c, 0x6d14, 0x1110,
-	0x0804, 0x320a, 0x6190, 0x81ff, 0x01a8, 0x704f, 0x0000, 0x2001,
+	0x7d98, 0x2039, 0x0001, 0x0804, 0x48be, 0x9006, 0x080c, 0x26cc,
+	0x81ff, 0x1904, 0x3362, 0x080c, 0x6fa7, 0x11b0, 0x080c, 0x728b,
+	0x080c, 0x5cca, 0x080c, 0x312c, 0x0118, 0x6130, 0xc18d, 0x6132,
+	0x080c, 0xc1f9, 0x0130, 0x080c, 0x6fca, 0x1118, 0x080c, 0x6f7f,
+	0x0038, 0x080c, 0x6ed9, 0x0020, 0x080c, 0x5c8f, 0x080c, 0x5b89,
+	0x0804, 0x3330, 0x81ff, 0x1904, 0x3362, 0x080c, 0x6fa7, 0x1110,
+	0x0804, 0x3362, 0x6190, 0x81ff, 0x01a8, 0x704f, 0x0000, 0x2001,
 	0x1c80, 0x2009, 0x0040, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0126,
-	0x2091, 0x8000, 0x2039, 0x0001, 0x080c, 0x46a5, 0x701f, 0x31d6,
+	0x2091, 0x8000, 0x2039, 0x0001, 0x080c, 0x48be, 0x701f, 0x332e,
 	0x012e, 0x0005, 0x704f, 0x0001, 0x00d6, 0x2069, 0x1c80, 0x20a9,
 	0x0040, 0x20e9, 0x0001, 0x20a1, 0x1c80, 0x2019, 0xffff, 0x4304,
-	0x6558, 0x9588, 0x2fd9, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e,
-	0x2011, 0x0002, 0x2100, 0x9506, 0x01a8, 0x080c, 0x5ff1, 0x1190,
+	0x6558, 0x9588, 0x3131, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e,
+	0x2011, 0x0002, 0x2100, 0x9506, 0x01a8, 0x080c, 0x6237, 0x1190,
 	0xb814, 0x821c, 0x0238, 0x9398, 0x1c80, 0x9085, 0xff00, 0x8007,
 	0x201a, 0x0038, 0x9398, 0x1c80, 0x2324, 0x94a4, 0xff00, 0x9405,
 	0x201a, 0x8210, 0x8108, 0x9182, 0x0080, 0x1208, 0x0c18, 0x8201,
 	0x8007, 0x2d0c, 0x9105, 0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1,
-	0x1c80, 0x2099, 0x1c80, 0x080c, 0x59e4, 0x0804, 0x40bf, 0x080c,
-	0x468c, 0x0904, 0x320d, 0x080c, 0x4659, 0x1120, 0x2009, 0x0002,
-	0x0804, 0x320a, 0x080c, 0x5153, 0xd0b4, 0x0558, 0x7884, 0x908e,
+	0x1c80, 0x2099, 0x1c80, 0x080c, 0x5c1a, 0x0804, 0x4217, 0x080c,
+	0x48a5, 0x0904, 0x3365, 0x080c, 0x4872, 0x1120, 0x2009, 0x0002,
+	0x0804, 0x3362, 0x080c, 0x537f, 0xd0b4, 0x0558, 0x7884, 0x908e,
 	0x007e, 0x0538, 0x908e, 0x007f, 0x0520, 0x908e, 0x0080, 0x0508,
-	0x080c, 0x2fcf, 0x1148, 0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084,
+	0x080c, 0x3127, 0x1148, 0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084,
 	0x00ff, 0x9086, 0x0006, 0x11a8, 0xa867, 0x0000, 0xa868, 0xc0fd,
-	0xa86a, 0x080c, 0xb955, 0x1120, 0x2009, 0x0003, 0x0804, 0x320a,
-	0x7007, 0x0003, 0x701f, 0x414d, 0x0005, 0x080c, 0x468c, 0x0904,
-	0x320d, 0x20a9, 0x002b, 0xb8b4, 0x20e0, 0xb8b8, 0x2098, 0xa860,
+	0xa86a, 0x080c, 0xbcc7, 0x1120, 0x2009, 0x0003, 0x0804, 0x3362,
+	0x7007, 0x0003, 0x701f, 0x42a5, 0x0005, 0x080c, 0x48a5, 0x0904,
+	0x3365, 0x20a9, 0x002b, 0xb8b4, 0x20e0, 0xb8b8, 0x2098, 0xa860,
 	0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008,
 	0x9080, 0x0006, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006,
-	0x2098, 0x080c, 0x0f69, 0x0070, 0x20a9, 0x0004, 0xa85c, 0x9080,
+	0x2098, 0x080c, 0x0f68, 0x0070, 0x20a9, 0x0004, 0xa85c, 0x9080,
 	0x000a, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098,
-	0x080c, 0x0f69, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084,
+	0x080c, 0x0f68, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084,
 	0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0x7a8c, 0x7b88, 0x7c9c,
-	0x7d98, 0x0804, 0x46a5, 0x81ff, 0x1904, 0x320a, 0x080c, 0x4670,
-	0x0904, 0x320d, 0x080c, 0x6163, 0x0904, 0x320a, 0x0058, 0xa878,
-	0x9005, 0x0120, 0x2009, 0x0004, 0x0804, 0x320a, 0xa974, 0xaa94,
-	0x0804, 0x31d8, 0x080c, 0x515b, 0x0904, 0x31d8, 0x701f, 0x4197,
-	0x7007, 0x0003, 0x0005, 0x81ff, 0x1904, 0x320a, 0x7888, 0x908a,
-	0x1000, 0x1a04, 0x320d, 0x080c, 0x468c, 0x0904, 0x320d, 0x080c,
-	0x6315, 0x0120, 0x080c, 0x631d, 0x1904, 0x320d, 0x080c, 0x61e8,
-	0x0904, 0x320a, 0x2019, 0x0004, 0x900e, 0x080c, 0x6175, 0x0904,
-	0x320a, 0x7984, 0x7a88, 0x04c9, 0x08a8, 0xa89c, 0x908a, 0x1000,
-	0x12f8, 0x080c, 0x468a, 0x01e0, 0x080c, 0x6315, 0x0118, 0x080c,
-	0x631d, 0x11b0, 0x080c, 0x61e8, 0x2009, 0x0002, 0x0168, 0x2009,
-	0x0002, 0x2019, 0x0004, 0x080c, 0x6175, 0x2009, 0x0003, 0x0120,
+	0x7d98, 0x0804, 0x48be, 0x81ff, 0x1904, 0x3362, 0x080c, 0x4889,
+	0x0904, 0x3365, 0x080c, 0x63a9, 0x0904, 0x3362, 0x0058, 0xa878,
+	0x9005, 0x0120, 0x2009, 0x0004, 0x0804, 0x3362, 0xa974, 0xaa94,
+	0x0804, 0x3330, 0x080c, 0x5387, 0x0904, 0x3330, 0x701f, 0x42ef,
+	0x7007, 0x0003, 0x0005, 0x81ff, 0x1904, 0x3362, 0x7888, 0x908a,
+	0x1000, 0x1a04, 0x3365, 0x080c, 0x48a5, 0x0904, 0x3365, 0x080c,
+	0x655b, 0x0120, 0x080c, 0x6563, 0x1904, 0x3365, 0x080c, 0x642e,
+	0x0904, 0x3362, 0x2019, 0x0004, 0x900e, 0x080c, 0x63bb, 0x0904,
+	0x3362, 0x7984, 0x7a88, 0x04c9, 0x08a8, 0xa89c, 0x908a, 0x1000,
+	0x12f8, 0x080c, 0x48a3, 0x01e0, 0x080c, 0x655b, 0x0118, 0x080c,
+	0x6563, 0x11b0, 0x080c, 0x642e, 0x2009, 0x0002, 0x0168, 0x2009,
+	0x0002, 0x2019, 0x0004, 0x080c, 0x63bb, 0x2009, 0x0003, 0x0120,
 	0xa998, 0xaa9c, 0x00d1, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010,
 	0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005,
-	0xa897, 0x4000, 0x080c, 0x515b, 0x0110, 0x9006, 0x0018, 0x900e,
+	0xa897, 0x4000, 0x080c, 0x5387, 0x0110, 0x9006, 0x0018, 0x900e,
 	0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x9186, 0x00ff, 0x0110,
 	0x0071, 0x0060, 0x2029, 0x007e, 0x2061, 0x1800, 0x6458, 0x2400,
 	0x9506, 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c,
-	0x5ff1, 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c,
-	0x7d64, 0x0005, 0x81ff, 0x1904, 0x320a, 0x080c, 0x4670, 0x0904,
-	0x320d, 0x080c, 0x60b8, 0x0904, 0x320a, 0x080c, 0x616c, 0x0904,
-	0x320a, 0x0804, 0x41a2, 0x81ff, 0x1904, 0x320a, 0x080c, 0x4670,
-	0x0904, 0x320d, 0x080c, 0x6315, 0x0120, 0x080c, 0x631d, 0x1904,
-	0x320d, 0x080c, 0x60b8, 0x0904, 0x320a, 0x080c, 0x615a, 0x0904,
-	0x320a, 0x0804, 0x41a2, 0x6100, 0x0804, 0x31d8, 0x080c, 0x468c,
-	0x0904, 0x320d, 0x080c, 0x5167, 0x1904, 0x320a, 0x79a8, 0xd184,
-	0x1158, 0xb834, 0x8007, 0x789e, 0xb830, 0x8007, 0x789a, 0xbb2c,
-	0x831f, 0xba28, 0x8217, 0x0050, 0xb824, 0x8007, 0x789e, 0xb820,
-	0x8007, 0x789a, 0xbb1c, 0x831f, 0xba18, 0x8217, 0xb900, 0x918c,
-	0x0200, 0x0804, 0x31d8, 0x78a8, 0x909c, 0x0003, 0xd0b4, 0x1140,
-	0x939a, 0x0003, 0x1a04, 0x320a, 0x6258, 0x7884, 0x9206, 0x1560,
+	0x6237, 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c,
+	0x801e, 0x0005, 0x81ff, 0x1904, 0x3362, 0x798c, 0x2001, 0x1951,
+	0x918c, 0x8000, 0x2102, 0x080c, 0x4889, 0x0904, 0x3365, 0x080c,
+	0x655b, 0x0120, 0x080c, 0x6563, 0x1904, 0x3365, 0x080c, 0x62fe,
+	0x0904, 0x3362, 0x080c, 0x63b2, 0x0904, 0x3362, 0x2001, 0x1951,
+	0x2004, 0xd0fc, 0x1904, 0x3330, 0x0804, 0x42fa, 0xa9a0, 0x2001,
+	0x1951, 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, 0x4896, 0x01a0,
+	0x080c, 0x655b, 0x0118, 0x080c, 0x6563, 0x1170, 0x080c, 0x62fe,
+	0x2009, 0x0002, 0x0128, 0x080c, 0x63b2, 0x1170, 0x2009, 0x0003,
+	0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085,
+	0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x2001, 0x1951,
+	0x2004, 0xd0fc, 0x1128, 0x080c, 0x5387, 0x0110, 0x9006, 0x0018,
+	0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x81ff, 0x1904,
+	0x3362, 0x798c, 0x2001, 0x1950, 0x918c, 0x8000, 0x2102, 0x080c,
+	0x4889, 0x0904, 0x3365, 0x080c, 0x655b, 0x0120, 0x080c, 0x6563,
+	0x1904, 0x3365, 0x080c, 0x62fe, 0x0904, 0x3362, 0x080c, 0x63a0,
+	0x0904, 0x3362, 0x2001, 0x1950, 0x2004, 0xd0fc, 0x1904, 0x3330,
+	0x0804, 0x42fa, 0xa9a0, 0x2001, 0x1950, 0x918c, 0x8000, 0xc18d,
+	0x2102, 0x080c, 0x4896, 0x01a0, 0x080c, 0x655b, 0x0118, 0x080c,
+	0x6563, 0x1170, 0x080c, 0x62fe, 0x2009, 0x0002, 0x0128, 0x080c,
+	0x63a0, 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010,
+	0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005,
+	0xa897, 0x4000, 0x2001, 0x1950, 0x2004, 0xd0fc, 0x1128, 0x080c,
+	0x5387, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001,
+	0x0000, 0x0005, 0x6100, 0x0804, 0x3330, 0x080c, 0x48a5, 0x0904,
+	0x3365, 0x080c, 0x5393, 0x1904, 0x3362, 0x79a8, 0xd184, 0x1158,
+	0xb834, 0x8007, 0x789e, 0xb830, 0x8007, 0x789a, 0xbb2c, 0x831f,
+	0xba28, 0x8217, 0x0050, 0xb824, 0x8007, 0x789e, 0xb820, 0x8007,
+	0x789a, 0xbb1c, 0x831f, 0xba18, 0x8217, 0xb900, 0x918c, 0x0200,
+	0x0804, 0x3330, 0x78a8, 0x909c, 0x0003, 0xd0b4, 0x1148, 0x939a,
+	0x0003, 0x1a04, 0x3362, 0x6258, 0x7884, 0x9206, 0x1904, 0x44aa,
 	0x2031, 0x1848, 0x2009, 0x013c, 0x2136, 0x2001, 0x1840, 0x2009,
 	0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x0006,
-	0x78a8, 0x9084, 0x0080, 0x1118, 0x000e, 0x0804, 0x46a5, 0x000e,
-	0x2031, 0x0000, 0x2061, 0x18ae, 0x2c44, 0xa66a, 0xa17a, 0xa772,
-	0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x10cc, 0x7007,
-	0x0002, 0x701f, 0x42cc, 0x0005, 0x81ff, 0x1904, 0x320a, 0x080c,
-	0x468c, 0x0904, 0x320d, 0x080c, 0x6315, 0x1904, 0x320a, 0x00c6,
-	0x080c, 0x4659, 0x00ce, 0x0904, 0x320a, 0xa867, 0x0000, 0xa868,
-	0xc0fd, 0xa86a, 0x7ea8, 0x080c, 0xb8fb, 0x0904, 0x320a, 0x7007,
-	0x0003, 0x701f, 0x42d0, 0x0005, 0x080c, 0x3ebc, 0x0804, 0x31d8,
-	0xa830, 0x9086, 0x0100, 0x0904, 0x320a, 0x8906, 0x8006, 0x8007,
-	0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x2009, 0x000c,
-	0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x46a5, 0x9006, 0x080c,
-	0x2574, 0x78a8, 0x9084, 0x00ff, 0x9086, 0x00ff, 0x0118, 0x81ff,
-	0x1904, 0x320a, 0x080c, 0x6d14, 0x0110, 0x080c, 0x5a59, 0x7888,
-	0x908a, 0x1000, 0x1a04, 0x320d, 0x7984, 0x9186, 0x00ff, 0x0138,
-	0x9182, 0x007f, 0x1a04, 0x320d, 0x2100, 0x080c, 0x253e, 0x0026,
-	0x00c6, 0x0126, 0x2091, 0x8000, 0x2061, 0x19c9, 0x601b, 0x0000,
-	0x601f, 0x0000, 0x6073, 0x0000, 0x6077, 0x0000, 0x080c, 0x6d14,
-	0x1158, 0x080c, 0x6ff8, 0x080c, 0x5a94, 0x9085, 0x0001, 0x080c,
-	0x6d5b, 0x080c, 0x6c46, 0x00d0, 0x080c, 0x9a4e, 0x2061, 0x0100,
-	0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x810f, 0x9105, 0x604a,
-	0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x1968, 0x200b, 0x0000,
-	0x2009, 0x002d, 0x2011, 0x597f, 0x080c, 0x7de5, 0x7984, 0x080c,
-	0x6d14, 0x1110, 0x2009, 0x00ff, 0x7a88, 0x080c, 0x4205, 0x012e,
-	0x00ce, 0x002e, 0x0804, 0x31d8, 0x7984, 0x080c, 0x5f91, 0x2b08,
-	0x1904, 0x320d, 0x0804, 0x31d8, 0x81ff, 0x0120, 0x2009, 0x0001,
-	0x0804, 0x320a, 0x60d8, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009,
-	0x0005, 0x0804, 0x320a, 0x080c, 0x4659, 0x1120, 0x2009, 0x0002,
-	0x0804, 0x320a, 0x7984, 0x9192, 0x0021, 0x1a04, 0x320d, 0x7a8c,
-	0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0x702a, 0xaf60,
-	0x7736, 0x080c, 0x46a2, 0x701f, 0x4384, 0x7880, 0x9086, 0x006e,
-	0x0110, 0x701f, 0x4c20, 0x0005, 0x2009, 0x0080, 0x080c, 0x5ff1,
-	0x1118, 0x080c, 0x6315, 0x0120, 0x2021, 0x400a, 0x0804, 0x31da,
-	0x00d6, 0x0096, 0xa964, 0xaa6c, 0xab70, 0xac74, 0xad78, 0xae7c,
-	0xa884, 0x90be, 0x0100, 0x0904, 0x441d, 0x90be, 0x0112, 0x0904,
-	0x441d, 0x90be, 0x0113, 0x0904, 0x441d, 0x90be, 0x0114, 0x0904,
-	0x441d, 0x90be, 0x0117, 0x0904, 0x441d, 0x90be, 0x011a, 0x0904,
-	0x441d, 0x90be, 0x011c, 0x0904, 0x441d, 0x90be, 0x0121, 0x0904,
-	0x4404, 0x90be, 0x0131, 0x0904, 0x4404, 0x90be, 0x0171, 0x0904,
-	0x441d, 0x90be, 0x0173, 0x0904, 0x441d, 0x90be, 0x01a1, 0x1128,
-	0xa894, 0x8007, 0xa896, 0x0804, 0x4428, 0x90be, 0x0212, 0x0904,
-	0x4411, 0x90be, 0x0213, 0x05e8, 0x90be, 0x0214, 0x0500, 0x90be,
-	0x0217, 0x0188, 0x90be, 0x021a, 0x1120, 0xa89c, 0x8007, 0xa89e,
-	0x04e0, 0x90be, 0x021f, 0x05c8, 0x90be, 0x0300, 0x05b0, 0x009e,
-	0x00de, 0x0804, 0x320d, 0x7028, 0x9080, 0x0010, 0x2098, 0x20a0,
-	0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0007, 0x080c, 0x4466, 0x7028,
-	0x9080, 0x000e, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9,
-	0x0001, 0x080c, 0x4466, 0x00c8, 0x7028, 0x9080, 0x000c, 0x2098,
-	0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x4473,
-	0x00b8, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0, 0x7034, 0x20e0,
-	0x20e8, 0x20a9, 0x0001, 0x080c, 0x4473, 0x7028, 0x9080, 0x000c,
-	0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x04f1,
-	0x00c6, 0x080c, 0x4659, 0x0550, 0xa868, 0xc0fd, 0xa86a, 0xa867,
-	0x0119, 0x9006, 0xa882, 0xa87f, 0x0020, 0xa88b, 0x0001, 0x810b,
-	0xa9ae, 0xa8b2, 0xaab6, 0xabba, 0xacbe, 0xadc2, 0xa9c6, 0xa8ca,
-	0x00ce, 0x009e, 0x00de, 0xa866, 0xa822, 0xa868, 0xc0fd, 0xa86a,
-	0xa804, 0x2048, 0x080c, 0xb916, 0x1120, 0x2009, 0x0003, 0x0804,
-	0x320a, 0x7007, 0x0003, 0x701f, 0x445d, 0x0005, 0x00ce, 0x009e,
-	0x00de, 0x2009, 0x0002, 0x0804, 0x320a, 0xa820, 0x9086, 0x8001,
-	0x1904, 0x31d8, 0x2009, 0x0004, 0x0804, 0x320a, 0x0016, 0x0026,
-	0x3510, 0x20a9, 0x0002, 0x4002, 0x4104, 0x4004, 0x8211, 0x1dc8,
-	0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x0036, 0x0046, 0x3520,
-	0x20a9, 0x0004, 0x4002, 0x4304, 0x4204, 0x4104, 0x4004, 0x8421,
-	0x1db8, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x81ff, 0x0120,
-	0x2009, 0x0001, 0x0804, 0x320a, 0x60d8, 0xd0ac, 0x1160, 0xd09c,
-	0x0120, 0x2009, 0x0016, 0x0804, 0x320a, 0xd09c, 0x1120, 0x2009,
-	0x0005, 0x0804, 0x320a, 0x7984, 0x78a8, 0x2040, 0x080c, 0x9a47,
-	0x1120, 0x9182, 0x007f, 0x0a04, 0x320d, 0x9186, 0x00ff, 0x0904,
-	0x320d, 0x9182, 0x0800, 0x1a04, 0x320d, 0x7a8c, 0x7b88, 0x6078,
-	0x9306, 0x1140, 0x607c, 0x924e, 0x0904, 0x320d, 0x99cc, 0xff00,
-	0x0904, 0x320d, 0x0126, 0x2091, 0x8000, 0x0026, 0x2011, 0x8008,
-	0x080c, 0x6339, 0x002e, 0x0118, 0x2001, 0x4009, 0x0458, 0x080c,
-	0x4573, 0x0560, 0x90c6, 0x4000, 0x1170, 0x00c6, 0x0006, 0x900e,
-	0x080c, 0x6211, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d,
-	0x000e, 0x00ce, 0x00b8, 0x90c6, 0x4007, 0x1110, 0x2408, 0x0090,
-	0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0060, 0x90c6, 0x4009,
-	0x1108, 0x0040, 0x90c6, 0x4006, 0x1108, 0x0020, 0x2001, 0x4005,
-	0x2009, 0x000a, 0x2020, 0x012e, 0x0804, 0x31da, 0x2b00, 0x7026,
-	0x0016, 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c, 0x9b15, 0x0904,
-	0x4540, 0x2b00, 0x6012, 0x080c, 0xbc01, 0x2e58, 0x00ee, 0x00e6,
-	0x00c6, 0x080c, 0x4659, 0x00ce, 0x2b70, 0x1158, 0x080c, 0x9ac8,
-	0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x2009, 0x0002, 0x0804,
-	0x320a, 0x900e, 0xa966, 0xa96a, 0x2900, 0x6016, 0xa932, 0xa868,
-	0xc0fd, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0x080c, 0x2e7f, 0x6023,
-	0x0001, 0x9006, 0x080c, 0x5f2e, 0x2001, 0x0002, 0x080c, 0x5f42,
-	0x2009, 0x0002, 0x080c, 0x9b42, 0x78a8, 0xd094, 0x0138, 0x00ee,
-	0x7024, 0x00e6, 0x2058, 0xb8bc, 0xc08d, 0xb8be, 0x9085, 0x0001,
-	0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x1120, 0x2009, 0x0003,
-	0x0804, 0x320a, 0x7007, 0x0003, 0x701f, 0x454f, 0x0005, 0xa830,
-	0x2008, 0x918e, 0xdead, 0x1120, 0x2021, 0x4009, 0x0804, 0x31da,
-	0x9086, 0x0100, 0x7024, 0x2058, 0x1138, 0x2009, 0x0004, 0xba04,
-	0x9294, 0x00ff, 0x0804, 0x50b0, 0x900e, 0xa868, 0xd0f4, 0x1904,
-	0x31d8, 0x080c, 0x6211, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108,
-	0xc18d, 0x0804, 0x31d8, 0x00e6, 0x00d6, 0x0096, 0x83ff, 0x0904,
-	0x45bb, 0x902e, 0x080c, 0x9a47, 0x0130, 0x9026, 0x20a9, 0x0800,
-	0x2071, 0x1000, 0x0030, 0x2021, 0x007f, 0x20a9, 0x0781, 0x2071,
-	0x107f, 0x2e04, 0x9005, 0x11b0, 0x2100, 0x9406, 0x15e8, 0x2428,
-	0x94ce, 0x007f, 0x1120, 0x92ce, 0xfffd, 0x1528, 0x0030, 0x94ce,
-	0x0080, 0x1130, 0x92ce, 0xfffc, 0x11f0, 0x93ce, 0x00ff, 0x11d8,
-	0xc5fd, 0x0450, 0x2058, 0xbf10, 0x2700, 0x9306, 0x11b8, 0xbe14,
-	0x2600, 0x9206, 0x1198, 0x2400, 0x9106, 0x1150, 0xd884, 0x0568,
-	0xd894, 0x1558, 0x080c, 0x6315, 0x1540, 0x2001, 0x4000, 0x0430,
-	0x2001, 0x4007, 0x0418, 0x2001, 0x4006, 0x0400, 0x2400, 0x9106,
-	0x1158, 0xbe14, 0x87ff, 0x1128, 0x86ff, 0x0948, 0x080c, 0x9a47,
-	0x1930, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, 0x4589,
-	0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, 0x0001, 0x0030,
-	0x080c, 0x5f91, 0x1dd0, 0xbb12, 0xba16, 0x9006, 0x9005, 0x009e,
-	0x00de, 0x00ee, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804,
-	0x320a, 0x080c, 0x4659, 0x1120, 0x2009, 0x0002, 0x0804, 0x320a,
-	0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7884, 0x9005, 0x0904,
-	0x320d, 0x9096, 0x00ff, 0x0120, 0x9092, 0x0004, 0x1a04, 0x320d,
-	0x2010, 0x2918, 0x080c, 0x2e25, 0x1120, 0x2009, 0x0003, 0x0804,
-	0x320a, 0x7007, 0x0003, 0x701f, 0x460e, 0x0005, 0xa830, 0x9086,
-	0x0100, 0x1904, 0x31d8, 0x2009, 0x0004, 0x0804, 0x320a, 0x7984,
-	0x080c, 0x9a47, 0x1120, 0x9182, 0x007f, 0x0a04, 0x320d, 0x9186,
-	0x00ff, 0x0904, 0x320d, 0x9182, 0x0800, 0x1a04, 0x320d, 0x2001,
-	0x9000, 0x080c, 0x510b, 0x1904, 0x320a, 0x0804, 0x31d8, 0xa998,
-	0x080c, 0x9a47, 0x1118, 0x9182, 0x007f, 0x0280, 0x9186, 0x00ff,
-	0x0168, 0x9182, 0x0800, 0x1250, 0x2001, 0x9000, 0x080c, 0x510b,
-	0x11a8, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006,
+	0x78a8, 0x9084, 0x0080, 0x11c8, 0x0006, 0x0036, 0x2001, 0x1a4f,
+	0x201c, 0x7b9a, 0x2003, 0x0000, 0x2001, 0x1a50, 0x201c, 0x7b9e,
+	0x2003, 0x0000, 0x2001, 0x1a51, 0x201c, 0x7ba2, 0x2003, 0x0000,
+	0x003e, 0x000e, 0x000e, 0x0804, 0x48be, 0x000e, 0x2031, 0x0000,
+	0x2061, 0x18ae, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e,
+	0xa392, 0xa496, 0xa59a, 0x080c, 0x10d5, 0x7007, 0x0002, 0x701f,
+	0x44ca, 0x0005, 0x81ff, 0x1904, 0x3362, 0x080c, 0x48a5, 0x0904,
+	0x3365, 0x080c, 0x655b, 0x1904, 0x3362, 0x00c6, 0x080c, 0x4872,
+	0x00ce, 0x0904, 0x3362, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a,
+	0x7ea8, 0x080c, 0xbc6d, 0x0904, 0x3362, 0x7007, 0x0003, 0x701f,
+	0x44e4, 0x0005, 0x080c, 0x4014, 0x0006, 0x0036, 0x2001, 0x1a4f,
+	0x201c, 0x7b9a, 0x2003, 0x0000, 0x2001, 0x1a50, 0x201c, 0x7b9e,
+	0x2003, 0x0000, 0x2001, 0x1a51, 0x201c, 0x7ba2, 0x2003, 0x0000,
+	0x003e, 0x000e, 0x0804, 0x3330, 0xa830, 0x9086, 0x0100, 0x0904,
+	0x3362, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0,
+	0x9080, 0x001b, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98,
+	0x0804, 0x48be, 0x9006, 0x080c, 0x26cc, 0x78a8, 0x9084, 0x00ff,
+	0x9086, 0x00ff, 0x0118, 0x81ff, 0x1904, 0x3362, 0x080c, 0x6fa7,
+	0x0110, 0x080c, 0x5c8f, 0x7888, 0x908a, 0x1000, 0x1a04, 0x3365,
+	0x7984, 0x9186, 0x00ff, 0x0138, 0x9182, 0x007f, 0x1a04, 0x3365,
+	0x2100, 0x080c, 0x2696, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000,
+	0x2061, 0x19cb, 0x601b, 0x0000, 0x601f, 0x0000, 0x6073, 0x0000,
+	0x6077, 0x0000, 0x080c, 0x6fa7, 0x1158, 0x080c, 0x728b, 0x080c,
+	0x5cca, 0x9085, 0x0001, 0x080c, 0x6fee, 0x080c, 0x6ed9, 0x00d0,
+	0x080c, 0x9d9f, 0x2061, 0x0100, 0x2001, 0x1817, 0x2004, 0x9084,
+	0x00ff, 0x810f, 0x9105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010,
+	0x2009, 0x196a, 0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x5bb5,
+	0x080c, 0x80a2, 0x7984, 0x080c, 0x6fa7, 0x1110, 0x2009, 0x00ff,
+	0x7a88, 0x080c, 0x435d, 0x012e, 0x00ce, 0x002e, 0x0804, 0x3330,
+	0x7984, 0x080c, 0x61d7, 0x2b08, 0x1904, 0x3365, 0x0804, 0x3330,
+	0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3362, 0x60d8, 0xd0ac,
+	0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x3362, 0x080c,
+	0x4872, 0x1120, 0x2009, 0x0002, 0x0804, 0x3362, 0x7984, 0x9192,
+	0x0021, 0x1a04, 0x3365, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c,
+	0x9080, 0x0019, 0x702a, 0xaf60, 0x7736, 0x080c, 0x48bb, 0x701f,
+	0x4598, 0x7880, 0x9086, 0x006e, 0x0110, 0x701f, 0x4e3d, 0x0005,
+	0x2009, 0x0080, 0x080c, 0x6237, 0x1118, 0x080c, 0x655b, 0x0120,
+	0x2021, 0x400a, 0x0804, 0x3332, 0x00d6, 0x0096, 0xa964, 0xaa6c,
+	0xab70, 0xac74, 0xad78, 0xae7c, 0xa884, 0x90be, 0x0100, 0x0904,
+	0x4631, 0x90be, 0x0112, 0x0904, 0x4631, 0x90be, 0x0113, 0x0904,
+	0x4631, 0x90be, 0x0114, 0x0904, 0x4631, 0x90be, 0x0117, 0x0904,
+	0x4631, 0x90be, 0x011a, 0x0904, 0x4631, 0x90be, 0x011c, 0x0904,
+	0x4631, 0x90be, 0x0121, 0x0904, 0x4618, 0x90be, 0x0131, 0x0904,
+	0x4618, 0x90be, 0x0171, 0x0904, 0x4631, 0x90be, 0x0173, 0x0904,
+	0x4631, 0x90be, 0x01a1, 0x1128, 0xa894, 0x8007, 0xa896, 0x0804,
+	0x463c, 0x90be, 0x0212, 0x0904, 0x4625, 0x90be, 0x0213, 0x05e8,
+	0x90be, 0x0214, 0x0500, 0x90be, 0x0217, 0x0188, 0x90be, 0x021a,
+	0x1120, 0xa89c, 0x8007, 0xa89e, 0x04e0, 0x90be, 0x021f, 0x05c8,
+	0x90be, 0x0300, 0x05b0, 0x009e, 0x00de, 0x0804, 0x3365, 0x7028,
+	0x9080, 0x0010, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9,
+	0x0007, 0x080c, 0x467a, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0,
+	0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x467a, 0x00c8,
+	0x7028, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8,
+	0x20a9, 0x0001, 0x080c, 0x4687, 0x00b8, 0x7028, 0x9080, 0x000e,
+	0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c,
+	0x4687, 0x7028, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0,
+	0x20e8, 0x20a9, 0x0001, 0x04f1, 0x00c6, 0x080c, 0x4872, 0x0550,
+	0xa868, 0xc0fd, 0xa86a, 0xa867, 0x0119, 0x9006, 0xa882, 0xa87f,
+	0x0020, 0xa88b, 0x0001, 0x810b, 0xa9ae, 0xa8b2, 0xaab6, 0xabba,
+	0xacbe, 0xadc2, 0xa9c6, 0xa8ca, 0x00ce, 0x009e, 0x00de, 0xa866,
+	0xa822, 0xa868, 0xc0fd, 0xa86a, 0xa804, 0x2048, 0x080c, 0xbc88,
+	0x1120, 0x2009, 0x0003, 0x0804, 0x3362, 0x7007, 0x0003, 0x701f,
+	0x4671, 0x0005, 0x00ce, 0x009e, 0x00de, 0x2009, 0x0002, 0x0804,
+	0x3362, 0xa820, 0x9086, 0x8001, 0x1904, 0x3330, 0x2009, 0x0004,
+	0x0804, 0x3362, 0x0016, 0x0026, 0x3510, 0x20a9, 0x0002, 0x4002,
+	0x4104, 0x4004, 0x8211, 0x1dc8, 0x002e, 0x001e, 0x0005, 0x0016,
+	0x0026, 0x0036, 0x0046, 0x3520, 0x20a9, 0x0004, 0x4002, 0x4304,
+	0x4204, 0x4104, 0x4004, 0x8421, 0x1db8, 0x004e, 0x003e, 0x002e,
+	0x001e, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3362,
+	0x60d8, 0xd0ac, 0x1160, 0xd09c, 0x0120, 0x2009, 0x0016, 0x0804,
+	0x3362, 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x3362, 0x7984,
+	0x78a8, 0x2040, 0x080c, 0x9d98, 0x1120, 0x9182, 0x007f, 0x0a04,
+	0x3365, 0x9186, 0x00ff, 0x0904, 0x3365, 0x9182, 0x0800, 0x1a04,
+	0x3365, 0x7a8c, 0x7b88, 0x6078, 0x9306, 0x1140, 0x607c, 0x924e,
+	0x0904, 0x3365, 0x99cc, 0xff00, 0x0904, 0x3365, 0x0126, 0x2091,
+	0x8000, 0x0026, 0x2011, 0x8008, 0x080c, 0x657f, 0x002e, 0x0140,
+	0x918d, 0x8000, 0x080c, 0x65c9, 0x1118, 0x2001, 0x4009, 0x0458,
+	0x080c, 0x478c, 0x0560, 0x90c6, 0x4000, 0x1170, 0x00c6, 0x0006,
+	0x900e, 0x080c, 0x6457, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108,
+	0xc18d, 0x000e, 0x00ce, 0x00b8, 0x90c6, 0x4007, 0x1110, 0x2408,
+	0x0090, 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0060, 0x90c6,
+	0x4009, 0x1108, 0x0040, 0x90c6, 0x4006, 0x1108, 0x0020, 0x2001,
+	0x4005, 0x2009, 0x000a, 0x2020, 0x012e, 0x0804, 0x3332, 0x2b00,
+	0x7026, 0x0016, 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c, 0x9e66,
+	0x0904, 0x4759, 0x2b00, 0x6012, 0x080c, 0xbf73, 0x2e58, 0x00ee,
+	0x00e6, 0x00c6, 0x080c, 0x4872, 0x00ce, 0x2b70, 0x1158, 0x080c,
+	0x9e19, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x2009, 0x0002,
+	0x0804, 0x3362, 0x900e, 0xa966, 0xa96a, 0x2900, 0x6016, 0xa932,
+	0xa868, 0xc0fd, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0x080c, 0x2fd7,
+	0x6023, 0x0001, 0x9006, 0x080c, 0x6174, 0x2001, 0x0002, 0x080c,
+	0x6188, 0x2009, 0x0002, 0x080c, 0x9e93, 0x78a8, 0xd094, 0x0138,
+	0x00ee, 0x7024, 0x00e6, 0x2058, 0xb8bc, 0xc08d, 0xb8be, 0x9085,
+	0x0001, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x1120, 0x2009,
+	0x0003, 0x0804, 0x3362, 0x7007, 0x0003, 0x701f, 0x4768, 0x0005,
+	0xa830, 0x2008, 0x918e, 0xdead, 0x1120, 0x2021, 0x4009, 0x0804,
+	0x3332, 0x9086, 0x0100, 0x7024, 0x2058, 0x1138, 0x2009, 0x0004,
+	0xba04, 0x9294, 0x00ff, 0x0804, 0x52dc, 0x900e, 0xa868, 0xd0f4,
+	0x1904, 0x3330, 0x080c, 0x6457, 0x1108, 0xc185, 0xb800, 0xd0bc,
+	0x0108, 0xc18d, 0x0804, 0x3330, 0x00e6, 0x00d6, 0x0096, 0x83ff,
+	0x0904, 0x47d4, 0x902e, 0x080c, 0x9d98, 0x0130, 0x9026, 0x20a9,
+	0x0800, 0x2071, 0x1000, 0x0030, 0x2021, 0x007f, 0x20a9, 0x0781,
+	0x2071, 0x107f, 0x2e04, 0x9005, 0x11b0, 0x2100, 0x9406, 0x15e8,
+	0x2428, 0x94ce, 0x007f, 0x1120, 0x92ce, 0xfffd, 0x1528, 0x0030,
+	0x94ce, 0x0080, 0x1130, 0x92ce, 0xfffc, 0x11f0, 0x93ce, 0x00ff,
+	0x11d8, 0xc5fd, 0x0450, 0x2058, 0xbf10, 0x2700, 0x9306, 0x11b8,
+	0xbe14, 0x2600, 0x9206, 0x1198, 0x2400, 0x9106, 0x1150, 0xd884,
+	0x0568, 0xd894, 0x1558, 0x080c, 0x655b, 0x1540, 0x2001, 0x4000,
+	0x0430, 0x2001, 0x4007, 0x0418, 0x2001, 0x4006, 0x0400, 0x2400,
+	0x9106, 0x1158, 0xbe14, 0x87ff, 0x1128, 0x86ff, 0x0948, 0x080c,
+	0x9d98, 0x1930, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04,
+	0x47a2, 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, 0x0001,
+	0x0030, 0x080c, 0x61d7, 0x1dd0, 0xbb12, 0xba16, 0x9006, 0x9005,
+	0x009e, 0x00de, 0x00ee, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001,
+	0x0804, 0x3362, 0x080c, 0x4872, 0x1120, 0x2009, 0x0002, 0x0804,
+	0x3362, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7884, 0x9005,
+	0x0904, 0x3365, 0x9096, 0x00ff, 0x0120, 0x9092, 0x0004, 0x1a04,
+	0x3365, 0x2010, 0x2918, 0x080c, 0x2f7d, 0x1120, 0x2009, 0x0003,
+	0x0804, 0x3362, 0x7007, 0x0003, 0x701f, 0x4827, 0x0005, 0xa830,
+	0x9086, 0x0100, 0x1904, 0x3330, 0x2009, 0x0004, 0x0804, 0x3362,
+	0x7984, 0x080c, 0x9d98, 0x1120, 0x9182, 0x007f, 0x0a04, 0x3365,
+	0x9186, 0x00ff, 0x0904, 0x3365, 0x9182, 0x0800, 0x1a04, 0x3365,
+	0x2001, 0x9000, 0x080c, 0x5337, 0x1904, 0x3362, 0x0804, 0x3330,
+	0xa998, 0x080c, 0x9d98, 0x1118, 0x9182, 0x007f, 0x0280, 0x9186,
+	0x00ff, 0x0168, 0x9182, 0x0800, 0x1250, 0x2001, 0x9000, 0x080c,
+	0x5337, 0x11a8, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897,
+	0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897,
+	0x4000, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x2009,
+	0x000a, 0x0c48, 0x080c, 0x0feb, 0x0198, 0x9006, 0xa802, 0x7014,
+	0x9005, 0x1120, 0x2900, 0x7016, 0x701a, 0x0040, 0x7018, 0xa802,
+	0x0086, 0x2040, 0x2900, 0xa006, 0x701a, 0x008e, 0x9085, 0x0001,
+	0x0005, 0x7984, 0x080c, 0x6237, 0x1130, 0x7e88, 0x9684, 0x3fff,
+	0x9082, 0x4000, 0x0208, 0x905e, 0x8bff, 0x0005, 0xa998, 0x080c,
+	0x6237, 0x1130, 0xae9c, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208,
+	0x905e, 0x8bff, 0x0005, 0xae98, 0x0008, 0x7e84, 0x2608, 0x080c,
+	0x6237, 0x1108, 0x0008, 0x905e, 0x8bff, 0x0005, 0x0016, 0x7114,
+	0x81ff, 0x0128, 0x2148, 0xa904, 0x080c, 0x101d, 0x0cc8, 0x7116,
+	0x711a, 0x001e, 0x0005, 0x2031, 0x0001, 0x0010, 0x2031, 0x0000,
+	0x2061, 0x18ae, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e,
+	0xa392, 0xa496, 0xa59a, 0x080c, 0x10d5, 0x7007, 0x0002, 0x701f,
+	0x3330, 0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0000,
+	0x2001, 0x18a6, 0x2004, 0x9005, 0x1190, 0x0e04, 0x48ef, 0x7a36,
+	0x7833, 0x0012, 0x7a82, 0x7b86, 0x7c8a, 0x2091, 0x4080, 0x2001,
+	0x0089, 0x2004, 0xd084, 0x190c, 0x1187, 0x0804, 0x4955, 0x0016,
+	0x0086, 0x0096, 0x00c6, 0x00e6, 0x2071, 0x1894, 0x7044, 0x9005,
+	0x1540, 0x7148, 0x9182, 0x0010, 0x0288, 0x7038, 0x2060, 0x080c,
+	0x0feb, 0x0904, 0x494d, 0xa84b, 0x0000, 0x2900, 0x7046, 0x2001,
+	0x0002, 0x9080, 0x1f26, 0x2005, 0xa846, 0x0098, 0x7038, 0x90e0,
+	0x0004, 0x2001, 0x18b0, 0x9c82, 0x18f0, 0x0210, 0x2061, 0x18b0,
+	0x2c00, 0x703a, 0x7148, 0x81ff, 0x1108, 0x703e, 0x8108, 0x714a,
+	0x0460, 0x7148, 0x8108, 0x714a, 0x7044, 0x2040, 0xa144, 0x2105,
+	0x0016, 0x908a, 0x0036, 0x1a0c, 0x0db4, 0x2060, 0x001e, 0x8108,
+	0x2105, 0x9005, 0xa146, 0x1520, 0x080c, 0x0feb, 0x1130, 0x8109,
+	0xa946, 0x7148, 0x8109, 0x714a, 0x00d8, 0x9006, 0xa806, 0xa84a,
+	0xa046, 0x2800, 0xa802, 0x2900, 0xa006, 0x7046, 0x2001, 0x0002,
+	0x9080, 0x1f26, 0x2005, 0xa846, 0x0058, 0x2262, 0x6306, 0x640a,
+	0x00ee, 0x00ce, 0x009e, 0x008e, 0x001e, 0x012e, 0x00fe, 0x0005,
+	0x2c00, 0x9082, 0x001b, 0x0002, 0x4977, 0x4977, 0x4979, 0x4977,
+	0x4977, 0x4977, 0x497d, 0x4977, 0x4977, 0x4977, 0x4981, 0x4977,
+	0x4977, 0x4977, 0x4985, 0x4977, 0x4977, 0x4977, 0x4989, 0x4977,
+	0x4977, 0x4977, 0x498d, 0x4977, 0x4977, 0x4977, 0x4992, 0x080c,
+	0x0db4, 0xa276, 0xa37a, 0xa47e, 0x0898, 0xa286, 0xa38a, 0xa48e,
+	0x0878, 0xa296, 0xa39a, 0xa49e, 0x0858, 0xa2a6, 0xa3aa, 0xa4ae,
+	0x0838, 0xa2b6, 0xa3ba, 0xa4be, 0x0818, 0xa2c6, 0xa3ca, 0xa4ce,
+	0x0804, 0x4950, 0xa2d6, 0xa3da, 0xa4de, 0x0804, 0x4950, 0x00e6,
+	0x2071, 0x1894, 0x7048, 0x9005, 0x0904, 0x4a29, 0x0126, 0x2091,
+	0x8000, 0x0e04, 0x4a28, 0x00f6, 0x2079, 0x0000, 0x00c6, 0x0096,
+	0x0086, 0x0076, 0x9006, 0x2038, 0x7040, 0x2048, 0x9005, 0x0500,
+	0xa948, 0x2105, 0x0016, 0x908a, 0x0036, 0x1a0c, 0x0db4, 0x2060,
+	0x001e, 0x8108, 0x2105, 0x9005, 0xa94a, 0x1904, 0x4a2b, 0xa804,
+	0x9005, 0x090c, 0x0db4, 0x7042, 0x2938, 0x2040, 0xa003, 0x0000,
+	0x2001, 0x0002, 0x9080, 0x1f26, 0x2005, 0xa04a, 0x0804, 0x4a2b,
+	0x703c, 0x2060, 0x2c14, 0x6304, 0x6408, 0x650c, 0x2200, 0x7836,
+	0x7833, 0x0012, 0x7882, 0x2300, 0x7886, 0x2400, 0x788a, 0x2091,
+	0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1187, 0x87ff,
+	0x0118, 0x2748, 0x080c, 0x101d, 0x7048, 0x8001, 0x704a, 0x9005,
+	0x1170, 0x7040, 0x2048, 0x9005, 0x0128, 0x080c, 0x101d, 0x9006,
+	0x7042, 0x7046, 0x703b, 0x18b0, 0x703f, 0x18b0, 0x0420, 0x7040,
+	0x9005, 0x1508, 0x7238, 0x2c00, 0x9206, 0x0148, 0x9c80, 0x0004,
+	0x90fa, 0x18f0, 0x0210, 0x2001, 0x18b0, 0x703e, 0x00a0, 0x9006,
+	0x703e, 0x703a, 0x7044, 0x9005, 0x090c, 0x0db4, 0x2048, 0xa800,
+	0x9005, 0x1de0, 0x2900, 0x7042, 0x2001, 0x0002, 0x9080, 0x1f26,
+	0x2005, 0xa84a, 0x0000, 0x007e, 0x008e, 0x009e, 0x00ce, 0x00fe,
+	0x012e, 0x00ee, 0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, 0x4a4a,
+	0x4a4a, 0x4a4c, 0x4a4a, 0x4a4a, 0x4a4a, 0x4a51, 0x4a4a, 0x4a4a,
+	0x4a4a, 0x4a56, 0x4a4a, 0x4a4a, 0x4a4a, 0x4a5b, 0x4a4a, 0x4a4a,
+	0x4a4a, 0x4a60, 0x4a4a, 0x4a4a, 0x4a4a, 0x4a65, 0x4a4a, 0x4a4a,
+	0x4a4a, 0x4a6a, 0x080c, 0x0db4, 0xaa74, 0xab78, 0xac7c, 0x0804,
+	0x49d6, 0xaa84, 0xab88, 0xac8c, 0x0804, 0x49d6, 0xaa94, 0xab98,
+	0xac9c, 0x0804, 0x49d6, 0xaaa4, 0xaba8, 0xacac, 0x0804, 0x49d6,
+	0xaab4, 0xabb8, 0xacbc, 0x0804, 0x49d6, 0xaac4, 0xabc8, 0xaccc,
+	0x0804, 0x49d6, 0xaad4, 0xabd8, 0xacdc, 0x0804, 0x49d6, 0x0026,
+	0x080c, 0x537f, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, 0x48d2,
+	0x002e, 0x0005, 0x81ff, 0x1904, 0x3362, 0x0126, 0x2091, 0x8000,
+	0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x6fa7, 0x1158,
+	0x080c, 0x728b, 0x080c, 0x5cca, 0x9085, 0x0001, 0x080c, 0x6fee,
+	0x080c, 0x6ed9, 0x0010, 0x080c, 0x5b89, 0x012e, 0x0804, 0x3330,
+	0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3362, 0x080c, 0x5393,
+	0x0120, 0x2009, 0x0007, 0x0804, 0x3362, 0x080c, 0x6553, 0x0120,
+	0x2009, 0x0008, 0x0804, 0x3362, 0x0026, 0x2011, 0x0010, 0x080c,
+	0x657f, 0x002e, 0x0140, 0x7984, 0x080c, 0x65c9, 0x1120, 0x2009,
+	0x4009, 0x0804, 0x3362, 0x080c, 0x3127, 0x0128, 0x7984, 0x080c,
+	0x61d7, 0x1904, 0x3365, 0x080c, 0x48a5, 0x0904, 0x3365, 0x2b00,
+	0x7026, 0x080c, 0x655b, 0x7888, 0x1170, 0x9084, 0x0005, 0x1158,
+	0x900e, 0x080c, 0x6457, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108,
+	0xc18d, 0x0804, 0x3330, 0x080c, 0x4872, 0x0904, 0x3362, 0x9006,
+	0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xbd21, 0x0904,
+	0x3362, 0x7888, 0xd094, 0x0118, 0xb8bc, 0xc08d, 0xb8be, 0x7007,
+	0x0003, 0x701f, 0x4b40, 0x0005, 0x2061, 0x1800, 0x080c, 0x5393,
+	0x2009, 0x0007, 0x1578, 0x080c, 0x6553, 0x0118, 0x2009, 0x0008,
+	0x0448, 0x080c, 0x3127, 0x0120, 0xa998, 0x080c, 0x61d7, 0x1530,
+	0x080c, 0x48a3, 0x0518, 0x080c, 0x655b, 0xa89c, 0x1168, 0x9084,
+	0x0005, 0x1150, 0x900e, 0x080c, 0x6457, 0x1108, 0xc185, 0xb800,
+	0xd0bc, 0x0108, 0xc18d, 0x00d0, 0xa868, 0xc0fc, 0xa86a, 0x080c,
+	0xbd21, 0x11e0, 0xa89c, 0xd094, 0x0118, 0xb8bc, 0xc08d, 0xb8be,
+	0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006,
 	0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000,
-	0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x2009, 0x000a,
-	0x0c48, 0x080c, 0x0fec, 0x0198, 0x9006, 0xa802, 0x7014, 0x9005,
-	0x1120, 0x2900, 0x7016, 0x701a, 0x0040, 0x7018, 0xa802, 0x0086,
-	0x2040, 0x2900, 0xa006, 0x701a, 0x008e, 0x9085, 0x0001, 0x0005,
-	0x7984, 0x080c, 0x5ff1, 0x1130, 0x7e88, 0x9684, 0x3fff, 0x9082,
-	0x4000, 0x0208, 0x905e, 0x8bff, 0x0005, 0xa998, 0x080c, 0x5ff1,
-	0x1130, 0xae9c, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, 0x905e,
-	0x8bff, 0x0005, 0xae98, 0x0008, 0x7e84, 0x2608, 0x080c, 0x5ff1,
-	0x1108, 0x0008, 0x905e, 0x8bff, 0x0005, 0x0016, 0x7114, 0x81ff,
-	0x0128, 0x2148, 0xa904, 0x080c, 0x101e, 0x0cc8, 0x7116, 0x711a,
-	0x001e, 0x0005, 0x2031, 0x0001, 0x0010, 0x2031, 0x0000, 0x2061,
-	0x18ae, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392,
-	0xa496, 0xa59a, 0x080c, 0x10cc, 0x7007, 0x0002, 0x701f, 0x31d8,
-	0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0000, 0x2001,
-	0x18a6, 0x2004, 0x9005, 0x1190, 0x0e04, 0x46d6, 0x7a36, 0x7833,
-	0x0012, 0x7a82, 0x7b86, 0x7c8a, 0x2091, 0x4080, 0x2001, 0x0089,
-	0x2004, 0xd084, 0x190c, 0x117e, 0x0804, 0x473c, 0x0016, 0x0086,
-	0x0096, 0x00c6, 0x00e6, 0x2071, 0x1894, 0x7044, 0x9005, 0x1540,
-	0x7148, 0x9182, 0x0010, 0x0288, 0x7038, 0x2060, 0x080c, 0x0fec,
-	0x0904, 0x4734, 0xa84b, 0x0000, 0x2900, 0x7046, 0x2001, 0x0002,
-	0x9080, 0x1dd6, 0x2005, 0xa846, 0x0098, 0x7038, 0x90e0, 0x0004,
-	0x2001, 0x18b0, 0x9c82, 0x18f0, 0x0210, 0x2061, 0x18b0, 0x2c00,
-	0x703a, 0x7148, 0x81ff, 0x1108, 0x703e, 0x8108, 0x714a, 0x0460,
-	0x7148, 0x8108, 0x714a, 0x7044, 0x2040, 0xa144, 0x2105, 0x0016,
-	0x908a, 0x0036, 0x1a0c, 0x0db4, 0x2060, 0x001e, 0x8108, 0x2105,
-	0x9005, 0xa146, 0x1520, 0x080c, 0x0fec, 0x1130, 0x8109, 0xa946,
-	0x7148, 0x8109, 0x714a, 0x00d8, 0x9006, 0xa806, 0xa84a, 0xa046,
-	0x2800, 0xa802, 0x2900, 0xa006, 0x7046, 0x2001, 0x0002, 0x9080,
-	0x1dd6, 0x2005, 0xa846, 0x0058, 0x2262, 0x6306, 0x640a, 0x00ee,
-	0x00ce, 0x009e, 0x008e, 0x001e, 0x012e, 0x00fe, 0x0005, 0x2c00,
-	0x9082, 0x001b, 0x0002, 0x475e, 0x475e, 0x4760, 0x475e, 0x475e,
-	0x475e, 0x4764, 0x475e, 0x475e, 0x475e, 0x4768, 0x475e, 0x475e,
-	0x475e, 0x476c, 0x475e, 0x475e, 0x475e, 0x4770, 0x475e, 0x475e,
-	0x475e, 0x4774, 0x475e, 0x475e, 0x475e, 0x4779, 0x080c, 0x0db4,
-	0xa276, 0xa37a, 0xa47e, 0x0898, 0xa286, 0xa38a, 0xa48e, 0x0878,
-	0xa296, 0xa39a, 0xa49e, 0x0858, 0xa2a6, 0xa3aa, 0xa4ae, 0x0838,
-	0xa2b6, 0xa3ba, 0xa4be, 0x0818, 0xa2c6, 0xa3ca, 0xa4ce, 0x0804,
-	0x4737, 0xa2d6, 0xa3da, 0xa4de, 0x0804, 0x4737, 0x00e6, 0x2071,
-	0x1894, 0x7048, 0x9005, 0x0904, 0x4810, 0x0126, 0x2091, 0x8000,
-	0x0e04, 0x480f, 0x00f6, 0x2079, 0x0000, 0x00c6, 0x0096, 0x0086,
-	0x0076, 0x9006, 0x2038, 0x7040, 0x2048, 0x9005, 0x0500, 0xa948,
-	0x2105, 0x0016, 0x908a, 0x0036, 0x1a0c, 0x0db4, 0x2060, 0x001e,
-	0x8108, 0x2105, 0x9005, 0xa94a, 0x1904, 0x4812, 0xa804, 0x9005,
-	0x090c, 0x0db4, 0x7042, 0x2938, 0x2040, 0xa003, 0x0000, 0x2001,
-	0x0002, 0x9080, 0x1dd6, 0x2005, 0xa04a, 0x0804, 0x4812, 0x703c,
-	0x2060, 0x2c14, 0x6304, 0x6408, 0x650c, 0x2200, 0x7836, 0x7833,
-	0x0012, 0x7882, 0x2300, 0x7886, 0x2400, 0x788a, 0x2091, 0x4080,
-	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x117e, 0x87ff, 0x0118,
-	0x2748, 0x080c, 0x101e, 0x7048, 0x8001, 0x704a, 0x9005, 0x1170,
-	0x7040, 0x2048, 0x9005, 0x0128, 0x080c, 0x101e, 0x9006, 0x7042,
-	0x7046, 0x703b, 0x18b0, 0x703f, 0x18b0, 0x0420, 0x7040, 0x9005,
-	0x1508, 0x7238, 0x2c00, 0x9206, 0x0148, 0x9c80, 0x0004, 0x90fa,
-	0x18f0, 0x0210, 0x2001, 0x18b0, 0x703e, 0x00a0, 0x9006, 0x703e,
-	0x703a, 0x7044, 0x9005, 0x090c, 0x0db4, 0x2048, 0xa800, 0x9005,
-	0x1de0, 0x2900, 0x7042, 0x2001, 0x0002, 0x9080, 0x1dd6, 0x2005,
-	0xa84a, 0x0000, 0x007e, 0x008e, 0x009e, 0x00ce, 0x00fe, 0x012e,
-	0x00ee, 0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, 0x4831, 0x4831,
-	0x4833, 0x4831, 0x4831, 0x4831, 0x4838, 0x4831, 0x4831, 0x4831,
-	0x483d, 0x4831, 0x4831, 0x4831, 0x4842, 0x4831, 0x4831, 0x4831,
-	0x4847, 0x4831, 0x4831, 0x4831, 0x484c, 0x4831, 0x4831, 0x4831,
-	0x4851, 0x080c, 0x0db4, 0xaa74, 0xab78, 0xac7c, 0x0804, 0x47bd,
-	0xaa84, 0xab88, 0xac8c, 0x0804, 0x47bd, 0xaa94, 0xab98, 0xac9c,
-	0x0804, 0x47bd, 0xaaa4, 0xaba8, 0xacac, 0x0804, 0x47bd, 0xaab4,
-	0xabb8, 0xacbc, 0x0804, 0x47bd, 0xaac4, 0xabc8, 0xaccc, 0x0804,
-	0x47bd, 0xaad4, 0xabd8, 0xacdc, 0x0804, 0x47bd, 0x0026, 0x080c,
-	0x5153, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, 0x46b9, 0x002e,
-	0x0005, 0x81ff, 0x1904, 0x320a, 0x0126, 0x2091, 0x8000, 0x6030,
-	0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x6d14, 0x1158, 0x080c,
-	0x6ff8, 0x080c, 0x5a94, 0x9085, 0x0001, 0x080c, 0x6d5b, 0x080c,
-	0x6c46, 0x0010, 0x080c, 0x5953, 0x012e, 0x0804, 0x31d8, 0x81ff,
-	0x0120, 0x2009, 0x0001, 0x0804, 0x320a, 0x080c, 0x5167, 0x0120,
-	0x2009, 0x0007, 0x0804, 0x320a, 0x080c, 0x630d, 0x0120, 0x2009,
-	0x0008, 0x0804, 0x320a, 0x0026, 0x2011, 0x0010, 0x080c, 0x6339,
-	0x002e, 0x0120, 0x2009, 0x4009, 0x0804, 0x320a, 0x080c, 0x2fcf,
-	0x0128, 0x7984, 0x080c, 0x5f91, 0x1904, 0x320d, 0x080c, 0x468c,
-	0x0904, 0x320d, 0x2b00, 0x7026, 0x080c, 0x6315, 0x7888, 0x1170,
-	0x9084, 0x0005, 0x1158, 0x900e, 0x080c, 0x6211, 0x1108, 0xc185,
-	0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x31d8, 0x080c, 0x4659,
-	0x0904, 0x320a, 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a,
-	0x080c, 0xb9af, 0x0904, 0x320a, 0x7888, 0xd094, 0x0118, 0xb8bc,
-	0xc08d, 0xb8be, 0x7007, 0x0003, 0x701f, 0x4923, 0x0005, 0x2061,
-	0x1800, 0x080c, 0x5167, 0x2009, 0x0007, 0x1578, 0x080c, 0x630d,
-	0x0118, 0x2009, 0x0008, 0x0448, 0x080c, 0x2fcf, 0x0120, 0xa998,
-	0x080c, 0x5f91, 0x1530, 0x080c, 0x468a, 0x0518, 0x080c, 0x6315,
-	0xa89c, 0x1168, 0x9084, 0x0005, 0x1150, 0x900e, 0x080c, 0x6211,
-	0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x00d0, 0xa868,
-	0xc0fc, 0xa86a, 0x080c, 0xb9af, 0x11e0, 0xa89c, 0xd094, 0x0118,
-	0xb8bc, 0xc08d, 0xb8be, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a,
-	0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030,
-	0x0005, 0xa897, 0x4000, 0xa99a, 0x9006, 0x918d, 0x0001, 0x2008,
-	0x0005, 0x9006, 0x0005, 0xa830, 0x2008, 0x918e, 0xdead, 0x1120,
-	0x2021, 0x4009, 0x0804, 0x31da, 0x9086, 0x0100, 0x7024, 0x2058,
-	0x1110, 0x0804, 0x50b0, 0x900e, 0x080c, 0x6211, 0x1108, 0xc185,
-	0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x31d8, 0x080c, 0x5167,
-	0x0120, 0x2009, 0x0007, 0x0804, 0x320a, 0x7f84, 0x7a8c, 0x7b88,
-	0x7c9c, 0x7d98, 0x080c, 0x4659, 0x1120, 0x2009, 0x0002, 0x0804,
-	0x320a, 0x900e, 0x2130, 0x7126, 0x7132, 0xa860, 0x20e8, 0x7036,
-	0xa85c, 0x9080, 0x0005, 0x702a, 0x20a0, 0x080c, 0x5ff1, 0x1904,
-	0x49c1, 0x080c, 0x6315, 0x0120, 0x080c, 0x631d, 0x1904, 0x49c1,
-	0x080c, 0x630d, 0x1130, 0x080c, 0x6211, 0x1118, 0xd79c, 0x0904,
-	0x49c1, 0xd794, 0x1110, 0xd784, 0x01a8, 0xb8b4, 0x20e0, 0xb8b8,
-	0x9080, 0x0006, 0x2098, 0x3400, 0xd794, 0x0160, 0x20a9, 0x0008,
-	0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x20a9, 0x0002, 0x080c,
-	0x4473, 0x0048, 0x20a9, 0x0004, 0x4003, 0x2098, 0x20a0, 0x3d00,
-	0x20e0, 0x080c, 0x4473, 0x4104, 0xd794, 0x0528, 0xb8b4, 0x20e0,
-	0xb8b8, 0x2060, 0x9c80, 0x0000, 0x2098, 0x20a9, 0x0002, 0x4003,
-	0x9c80, 0x0003, 0x2098, 0x20a9, 0x0001, 0x4005, 0x9c80, 0x0004,
-	0x2098, 0x3400, 0x20a9, 0x0002, 0x4003, 0x2098, 0x20a0, 0x3d00,
-	0x20e0, 0x080c, 0x4466, 0x9c80, 0x0026, 0x2098, 0xb8b4, 0x20e0,
-	0x20a9, 0x0002, 0x4003, 0xd794, 0x0110, 0x96b0, 0x000b, 0x96b0,
-	0x0005, 0x8108, 0x080c, 0x9a47, 0x0118, 0x9186, 0x0800, 0x0040,
-	0xd78c, 0x0120, 0x9186, 0x0800, 0x0170, 0x0018, 0x9186, 0x007e,
-	0x0150, 0xd794, 0x0118, 0x9686, 0x0020, 0x0010, 0x9686, 0x0028,
-	0x0150, 0x0804, 0x495d, 0x86ff, 0x1120, 0x7124, 0x810b, 0x0804,
-	0x31d8, 0x7033, 0x0001, 0x7122, 0x7024, 0x9600, 0x7026, 0x772e,
-	0x2061, 0x18ae, 0x2c44, 0xa06b, 0x0000, 0xa67a, 0x7034, 0xa072,
-	0x7028, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x10cc,
-	0x7007, 0x0002, 0x701f, 0x49fd, 0x0005, 0x7030, 0x9005, 0x1180,
-	0x7120, 0x7028, 0x20a0, 0x772c, 0x9036, 0x7034, 0x20e8, 0x2061,
-	0x18ae, 0x2c44, 0xa28c, 0xa390, 0xa494, 0xa598, 0x0804, 0x495d,
-	0x7124, 0x810b, 0x0804, 0x31d8, 0x2029, 0x007e, 0x7984, 0x7a88,
-	0x7b8c, 0x7c98, 0x9184, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04,
-	0x320d, 0x9502, 0x0a04, 0x320d, 0x9184, 0x00ff, 0x90e2, 0x0020,
-	0x0a04, 0x320d, 0x9502, 0x0a04, 0x320d, 0x9284, 0xff00, 0x8007,
-	0x90e2, 0x0020, 0x0a04, 0x320d, 0x9502, 0x0a04, 0x320d, 0x9284,
-	0x00ff, 0x90e2, 0x0020, 0x0a04, 0x320d, 0x9502, 0x0a04, 0x320d,
-	0x9384, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x320d, 0x9502,
-	0x0a04, 0x320d, 0x9384, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x320d,
-	0x9502, 0x0a04, 0x320d, 0x9484, 0xff00, 0x8007, 0x90e2, 0x0020,
-	0x0a04, 0x320d, 0x9502, 0x0a04, 0x320d, 0x9484, 0x00ff, 0x90e2,
-	0x0020, 0x0a04, 0x320d, 0x9502, 0x0a04, 0x320d, 0x2061, 0x1958,
-	0x6102, 0x6206, 0x630a, 0x640e, 0x0804, 0x31d8, 0x0006, 0x080c,
-	0x5153, 0xd0cc, 0x000e, 0x0005, 0x0006, 0x080c, 0x5157, 0xd0bc,
-	0x000e, 0x0005, 0x6170, 0x7a84, 0x6300, 0x82ff, 0x1118, 0x7986,
-	0x0804, 0x31d8, 0x83ff, 0x1904, 0x320d, 0x2001, 0xfff0, 0x9200,
-	0x1a04, 0x320d, 0x2019, 0xffff, 0x6074, 0x9302, 0x9200, 0x0a04,
-	0x320d, 0x7986, 0x6272, 0x0804, 0x31d8, 0x080c, 0x5167, 0x1904,
-	0x320a, 0x7c88, 0x7d84, 0x7e98, 0x7f8c, 0x080c, 0x4659, 0x0904,
-	0x320a, 0x900e, 0x901e, 0x7326, 0x7332, 0xa860, 0x20e8, 0x7036,
-	0xa85c, 0x9080, 0x0003, 0x702a, 0x20a0, 0x91d8, 0x1000, 0x2b5c,
-	0x8bff, 0x0178, 0x080c, 0x6315, 0x0118, 0x080c, 0x631d, 0x1148,
-	0x20a9, 0x0001, 0xb814, 0x4004, 0xb810, 0x4004, 0x4104, 0x9398,
-	0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, 0x0170,
-	0x0c20, 0x83ff, 0x1148, 0x7224, 0x900e, 0x2001, 0x0003, 0x080c,
-	0x7f8b, 0x2208, 0x0804, 0x31d8, 0x7033, 0x0001, 0x7122, 0x7024,
-	0x9300, 0x7026, 0x2061, 0x18ae, 0x2c44, 0xa06b, 0x0000, 0xa37a,
-	0x7028, 0xa076, 0x7034, 0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a,
-	0x080c, 0x10cc, 0x7007, 0x0002, 0x701f, 0x4aef, 0x0005, 0x7030,
-	0x9005, 0x1178, 0x7120, 0x7028, 0x20a0, 0x901e, 0x7034, 0x20e8,
-	0x2061, 0x18ae, 0x2c44, 0xa48c, 0xa590, 0xa694, 0xa798, 0x0804,
-	0x4aad, 0x7224, 0x900e, 0x2001, 0x0003, 0x080c, 0x7f8b, 0x2208,
-	0x0804, 0x31d8, 0x00f6, 0x00e6, 0x080c, 0x5167, 0x2009, 0x0007,
-	0x1904, 0x4b82, 0x2071, 0x1894, 0x745c, 0x84ff, 0x2009, 0x000e,
-	0x1904, 0x4b82, 0xac9c, 0xad98, 0xaea4, 0xafa0, 0x0096, 0x080c,
-	0x1005, 0x2009, 0x0002, 0x0904, 0x4b82, 0x2900, 0x705e, 0x900e,
-	0x901e, 0x7356, 0x7362, 0xa860, 0x7066, 0xa85c, 0x9080, 0x0003,
-	0x705a, 0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c,
-	0x6315, 0x0118, 0x080c, 0x631d, 0x1148, 0xb814, 0x20a9, 0x0001,
+	0xa99a, 0x9006, 0x918d, 0x0001, 0x2008, 0x0005, 0x9006, 0x0005,
+	0xa830, 0x2008, 0x918e, 0xdead, 0x1120, 0x2021, 0x4009, 0x0804,
+	0x3332, 0x9086, 0x0100, 0x7024, 0x2058, 0x1110, 0x0804, 0x52dc,
+	0x900e, 0x080c, 0x6457, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108,
+	0xc18d, 0x0804, 0x3330, 0x080c, 0x5393, 0x0120, 0x2009, 0x0007,
+	0x0804, 0x3362, 0x7f84, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c,
+	0x4872, 0x1120, 0x2009, 0x0002, 0x0804, 0x3362, 0x900e, 0x2130,
+	0x7126, 0x7132, 0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0005,
+	0x702a, 0x20a0, 0x080c, 0x6237, 0x1904, 0x4bde, 0x080c, 0x655b,
+	0x0120, 0x080c, 0x6563, 0x1904, 0x4bde, 0x080c, 0x6553, 0x1130,
+	0x080c, 0x6457, 0x1118, 0xd79c, 0x0904, 0x4bde, 0xd794, 0x1110,
+	0xd784, 0x01a8, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098,
+	0x3400, 0xd794, 0x0160, 0x20a9, 0x0008, 0x4003, 0x2098, 0x20a0,
+	0x3d00, 0x20e0, 0x20a9, 0x0002, 0x080c, 0x4687, 0x0048, 0x20a9,
+	0x0004, 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x4687,
+	0x4104, 0xd794, 0x0528, 0xb8b4, 0x20e0, 0xb8b8, 0x2060, 0x9c80,
+	0x0000, 0x2098, 0x20a9, 0x0002, 0x4003, 0x9c80, 0x0003, 0x2098,
+	0x20a9, 0x0001, 0x4005, 0x9c80, 0x0004, 0x2098, 0x3400, 0x20a9,
+	0x0002, 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x467a,
+	0x9c80, 0x0026, 0x2098, 0xb8b4, 0x20e0, 0x20a9, 0x0002, 0x4003,
+	0xd794, 0x0110, 0x96b0, 0x000b, 0x96b0, 0x0005, 0x8108, 0x080c,
+	0x9d98, 0x0118, 0x9186, 0x0800, 0x0040, 0xd78c, 0x0120, 0x9186,
+	0x0800, 0x0170, 0x0018, 0x9186, 0x007e, 0x0150, 0xd794, 0x0118,
+	0x9686, 0x0020, 0x0010, 0x9686, 0x0028, 0x0150, 0x0804, 0x4b7a,
+	0x86ff, 0x1120, 0x7124, 0x810b, 0x0804, 0x3330, 0x7033, 0x0001,
+	0x7122, 0x7024, 0x9600, 0x7026, 0x772e, 0x2061, 0x18ae, 0x2c44,
+	0xa06b, 0x0000, 0xa67a, 0x7034, 0xa072, 0x7028, 0xa076, 0xa28e,
+	0xa392, 0xa496, 0xa59a, 0x080c, 0x10d5, 0x7007, 0x0002, 0x701f,
+	0x4c1a, 0x0005, 0x7030, 0x9005, 0x1180, 0x7120, 0x7028, 0x20a0,
+	0x772c, 0x9036, 0x7034, 0x20e8, 0x2061, 0x18ae, 0x2c44, 0xa28c,
+	0xa390, 0xa494, 0xa598, 0x0804, 0x4b7a, 0x7124, 0x810b, 0x0804,
+	0x3330, 0x2029, 0x007e, 0x7984, 0x7a88, 0x7b8c, 0x7c98, 0x9184,
+	0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3365, 0x9502, 0x0a04,
+	0x3365, 0x9184, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3365, 0x9502,
+	0x0a04, 0x3365, 0x9284, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04,
+	0x3365, 0x9502, 0x0a04, 0x3365, 0x9284, 0x00ff, 0x90e2, 0x0020,
+	0x0a04, 0x3365, 0x9502, 0x0a04, 0x3365, 0x9384, 0xff00, 0x8007,
+	0x90e2, 0x0020, 0x0a04, 0x3365, 0x9502, 0x0a04, 0x3365, 0x9384,
+	0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3365, 0x9502, 0x0a04, 0x3365,
+	0x9484, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3365, 0x9502,
+	0x0a04, 0x3365, 0x9484, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3365,
+	0x9502, 0x0a04, 0x3365, 0x2061, 0x195a, 0x6102, 0x6206, 0x630a,
+	0x640e, 0x0804, 0x3330, 0x0006, 0x080c, 0x537f, 0xd0cc, 0x000e,
+	0x0005, 0x0006, 0x080c, 0x5383, 0xd0bc, 0x000e, 0x0005, 0x6170,
+	0x7a84, 0x6300, 0x82ff, 0x1118, 0x7986, 0x0804, 0x3330, 0x83ff,
+	0x1904, 0x3365, 0x2001, 0xfff0, 0x9200, 0x1a04, 0x3365, 0x2019,
+	0xffff, 0x6074, 0x9302, 0x9200, 0x0a04, 0x3365, 0x7986, 0x6272,
+	0x0804, 0x3330, 0x080c, 0x5393, 0x1904, 0x3362, 0x7c88, 0x7d84,
+	0x7e98, 0x7f8c, 0x080c, 0x4872, 0x0904, 0x3362, 0x900e, 0x901e,
+	0x7326, 0x7332, 0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0003,
+	0x702a, 0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c,
+	0x655b, 0x0118, 0x080c, 0x6563, 0x1148, 0x20a9, 0x0001, 0xb814,
 	0x4004, 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182,
-	0x0800, 0x0120, 0x9386, 0x003c, 0x01e8, 0x0c20, 0x83ff, 0x11c0,
-	0x7254, 0x900e, 0x2001, 0x0003, 0x080c, 0x7f8b, 0x2208, 0x009e,
-	0xa897, 0x4000, 0xa99a, 0x715c, 0x81ff, 0x090c, 0x0db4, 0x2148,
-	0x080c, 0x101e, 0x9006, 0x705e, 0x918d, 0x0001, 0x2008, 0x0418,
-	0x7063, 0x0001, 0x7152, 0x7054, 0x9300, 0x7056, 0x2061, 0x18af,
-	0x2c44, 0xa37a, 0x7058, 0xa076, 0x7064, 0xa072, 0xa48e, 0xa592,
-	0xa696, 0xa79a, 0xa09f, 0x4b8e, 0x000e, 0xa0a2, 0x080c, 0x10cc,
-	0x9006, 0x0048, 0x009e, 0xa897, 0x4005, 0xa99a, 0x900e, 0x9085,
-	0x0001, 0x2001, 0x0030, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0xa0a0,
-	0x904d, 0x090c, 0x0db4, 0x00e6, 0x2071, 0x1894, 0xa06c, 0x908e,
-	0x0100, 0x0138, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4002,
-	0x00d8, 0x7060, 0x9005, 0x1158, 0x7150, 0x7058, 0x20a0, 0x901e,
-	0x7064, 0x20e8, 0xa48c, 0xa590, 0xa694, 0xa798, 0x0428, 0xa87b,
-	0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x7254, 0x900e, 0x2001,
-	0x0003, 0x080c, 0x7f8b, 0xaa9a, 0x715c, 0x81ff, 0x090c, 0x0db4,
-	0x2148, 0x080c, 0x101e, 0x705f, 0x0000, 0xa0a0, 0x2048, 0x0126,
-	0x2091, 0x8000, 0x080c, 0x65f2, 0x012e, 0xa09f, 0x0000, 0xa0a3,
-	0x0000, 0x00ee, 0x00fe, 0x0005, 0x91d8, 0x1000, 0x2b5c, 0x8bff,
-	0x0178, 0x080c, 0x6315, 0x0118, 0x080c, 0x631d, 0x1148, 0xb814,
-	0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, 0x4104, 0x9398, 0x0003,
-	0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, 0x0518, 0x0c20,
-	0x83ff, 0x11f0, 0x7154, 0x810c, 0xa99a, 0xa897, 0x4000, 0x715c,
-	0x81ff, 0x090c, 0x0db4, 0x2148, 0x080c, 0x101e, 0x9006, 0x705e,
-	0x918d, 0x0001, 0x2008, 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x65f2, 0x012e, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x0070,
-	0x7063, 0x0001, 0x7152, 0x7054, 0x9300, 0x7056, 0xa37a, 0xa48e,
-	0xa592, 0xa696, 0xa79a, 0x080c, 0x10cc, 0x9006, 0x00ee, 0x0005,
-	0x0096, 0xa88c, 0x90be, 0x7000, 0x0148, 0x90be, 0x7100, 0x0130,
-	0x90be, 0x7200, 0x0118, 0x009e, 0x0804, 0x320d, 0xa884, 0xa988,
-	0x080c, 0x250b, 0x1518, 0x080c, 0x5f91, 0x1500, 0x7126, 0xbe12,
-	0xbd16, 0xae7c, 0x080c, 0x4659, 0x01c8, 0x080c, 0x4659, 0x01b0,
-	0x009e, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0xa823, 0x0000,
-	0xa804, 0x2048, 0x080c, 0xb936, 0x1120, 0x2009, 0x0003, 0x0804,
-	0x320a, 0x7007, 0x0003, 0x701f, 0x4c5b, 0x0005, 0x009e, 0x2009,
-	0x0002, 0x0804, 0x320a, 0x7124, 0x080c, 0x2f76, 0xa820, 0x9086,
-	0x8001, 0x1120, 0x2009, 0x0004, 0x0804, 0x320a, 0x2900, 0x7022,
-	0xa804, 0x0096, 0x2048, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f,
-	0x9084, 0xffc0, 0x009e, 0x9080, 0x0002, 0x0076, 0x0006, 0x2098,
-	0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, 0x0f69, 0xaa6c,
-	0xab70, 0xac74, 0xad78, 0x2061, 0x18ae, 0x2c44, 0xa06b, 0x0000,
-	0xae64, 0xaf8c, 0x97c6, 0x7000, 0x0118, 0x97c6, 0x7100, 0x1148,
-	0x96c2, 0x0004, 0x0600, 0x2009, 0x0004, 0x000e, 0x007e, 0x0804,
-	0x46a5, 0x97c6, 0x7200, 0x11b8, 0x96c2, 0x0054, 0x02a0, 0x000e,
-	0x007e, 0x2061, 0x18ae, 0x2c44, 0xa076, 0xa772, 0xa07b, 0x002a,
-	0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x10cc, 0x7007, 0x0002,
-	0x701f, 0x4cb7, 0x0005, 0x000e, 0x007e, 0x0804, 0x320d, 0x7020,
-	0x2048, 0xa804, 0x2048, 0xa804, 0x2048, 0x8906, 0x8006, 0x8007,
-	0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2098, 0x20a0,
-	0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, 0x0f69, 0x2100, 0x2238,
-	0x2061, 0x18ae, 0x2c44, 0xa28c, 0xa390, 0xa494, 0xa598, 0x2009,
-	0x002a, 0x0804, 0x46a5, 0x81ff, 0x1904, 0x320a, 0x798c, 0x2001,
-	0x194f, 0x2102, 0x080c, 0x4670, 0x0904, 0x320d, 0x080c, 0x6315,
-	0x0120, 0x080c, 0x631d, 0x1904, 0x320d, 0x080c, 0x60b8, 0x0904,
-	0x320a, 0x0126, 0x2091, 0x8000, 0x080c, 0x617e, 0x012e, 0x0904,
-	0x320a, 0x0804, 0x41a2, 0xa9a0, 0x2001, 0x194f, 0xc18d, 0x2102,
-	0x080c, 0x467d, 0x01a0, 0x080c, 0x6315, 0x0118, 0x080c, 0x631d,
-	0x1170, 0x080c, 0x60b8, 0x2009, 0x0002, 0x0128, 0x080c, 0x617e,
-	0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897,
-	0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897,
-	0x4000, 0x080c, 0x515b, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085,
-	0x0001, 0x2001, 0x0000, 0x0005, 0x78a8, 0xd08c, 0x1118, 0xd084,
-	0x0904, 0x4117, 0x080c, 0x468c, 0x0904, 0x320d, 0x080c, 0x4659,
-	0x1120, 0x2009, 0x0002, 0x0804, 0x320a, 0x080c, 0x6315, 0x0130,
-	0x908e, 0x0004, 0x0118, 0x908e, 0x0005, 0x15a0, 0x78a8, 0xd08c,
-	0x0120, 0xb800, 0xc08c, 0xb802, 0x0028, 0x080c, 0x5153, 0xd0b4,
-	0x0904, 0x4151, 0x7884, 0x908e, 0x007e, 0x0904, 0x4151, 0x908e,
-	0x007f, 0x0904, 0x4151, 0x908e, 0x0080, 0x0904, 0x4151, 0xb800,
-	0xd08c, 0x1904, 0x4151, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a,
-	0x080c, 0xb955, 0x1120, 0x2009, 0x0003, 0x0804, 0x320a, 0x7007,
-	0x0003, 0x701f, 0x4d74, 0x0005, 0x080c, 0x468c, 0x0904, 0x320d,
-	0x0804, 0x4151, 0x080c, 0x2fcf, 0x0108, 0x0005, 0x2009, 0x1833,
-	0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x320a, 0x080c,
-	0x5167, 0x0120, 0x2009, 0x0007, 0x0804, 0x320a, 0x080c, 0x630d,
-	0x0120, 0x2009, 0x0008, 0x0804, 0x320a, 0xb89c, 0xd0a4, 0x1118,
-	0xd0ac, 0x1904, 0x4151, 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd,
-	0xa86a, 0x080c, 0xb9af, 0x1120, 0x2009, 0x0003, 0x0804, 0x320a,
-	0x7007, 0x0003, 0x701f, 0x4dad, 0x0005, 0xa830, 0x9086, 0x0100,
-	0x1120, 0x2009, 0x0004, 0x0804, 0x50b0, 0x080c, 0x468c, 0x0904,
-	0x320d, 0x0804, 0x4d46, 0x81ff, 0x2009, 0x0001, 0x1904, 0x320a,
-	0x080c, 0x5167, 0x2009, 0x0007, 0x1904, 0x320a, 0x080c, 0x630d,
-	0x0120, 0x2009, 0x0008, 0x0804, 0x320a, 0x080c, 0x468c, 0x0904,
-	0x320d, 0x080c, 0x6315, 0x2009, 0x0009, 0x1904, 0x320a, 0x080c,
-	0x4659, 0x2009, 0x0002, 0x0904, 0x320a, 0x9006, 0xa866, 0xa832,
-	0xa868, 0xc0fd, 0xa86a, 0x7988, 0x9194, 0xff00, 0x918c, 0x00ff,
-	0x9006, 0x82ff, 0x1128, 0xc0ed, 0xa952, 0x798c, 0xa956, 0x0038,
-	0x928e, 0x0100, 0x1904, 0x320d, 0xc0e5, 0xa952, 0xa956, 0xa83e,
-	0x080c, 0xbc02, 0x2009, 0x0003, 0x0904, 0x320a, 0x7007, 0x0003,
-	0x701f, 0x4e03, 0x0005, 0xa830, 0x9086, 0x0100, 0x2009, 0x0004,
-	0x0904, 0x320a, 0x0804, 0x31d8, 0x7aa8, 0x9284, 0xc000, 0x0148,
-	0xd2ec, 0x01a0, 0x080c, 0x5167, 0x1188, 0x2009, 0x0014, 0x0804,
-	0x320a, 0xd2dc, 0x1568, 0x81ff, 0x2009, 0x0001, 0x1904, 0x320a,
-	0x080c, 0x5167, 0x2009, 0x0007, 0x1904, 0x320a, 0xd2f4, 0x0130,
-	0x9284, 0x5000, 0x080c, 0x512e, 0x0804, 0x31d8, 0xd2fc, 0x0158,
-	0x080c, 0x468c, 0x0904, 0x320d, 0x7984, 0x9284, 0x9000, 0x080c,
-	0x510b, 0x0804, 0x31d8, 0x080c, 0x468c, 0x0904, 0x320d, 0xb804,
-	0x9084, 0x00ff, 0x9086, 0x0006, 0x2009, 0x0009, 0x1904, 0x4eec,
-	0x080c, 0x4659, 0x2009, 0x0002, 0x0904, 0x4eec, 0xa85c, 0x9080,
-	0x001b, 0xaf60, 0x2009, 0x0008, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98,
-	0x080c, 0x46a2, 0x701f, 0x4e5d, 0x0005, 0xa86c, 0x9086, 0x0500,
-	0x1138, 0xa870, 0x9005, 0x1120, 0xa874, 0x9084, 0xff00, 0x0110,
-	0x1904, 0x320d, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c,
-	0x468c, 0x1110, 0x0804, 0x320d, 0x2009, 0x0043, 0x080c, 0xbc6a,
-	0x2009, 0x0003, 0x0904, 0x4eec, 0x7007, 0x0003, 0x701f, 0x4e81,
-	0x0005, 0xa830, 0x9086, 0x0100, 0x2009, 0x0004, 0x0904, 0x4eec,
-	0x7984, 0x7aa8, 0x9284, 0x1000, 0x080c, 0x510b, 0x0804, 0x31d8,
-	0x00c6, 0xaab0, 0x9284, 0xc000, 0x0140, 0xd2ec, 0x0168, 0x080c,
-	0x5167, 0x1150, 0x2009, 0x0014, 0x04f0, 0x2061, 0x1800, 0x080c,
-	0x5167, 0x2009, 0x0007, 0x15b8, 0xd2f4, 0x0128, 0x9284, 0x5000,
-	0x080c, 0x512e, 0x0050, 0xd2fc, 0x0178, 0x080c, 0x468a, 0x0588,
-	0xa998, 0x9284, 0x9000, 0x080c, 0x510b, 0xa87b, 0x0000, 0xa883,
-	0x0000, 0xa897, 0x4000, 0x0438, 0x080c, 0x468a, 0x0510, 0x080c,
-	0x6315, 0x2009, 0x0009, 0x11b8, 0xa8c4, 0x9086, 0x0500, 0x11c8,
-	0xa8c8, 0x9005, 0x11b0, 0xa8cc, 0x9084, 0xff00, 0x1190, 0x080c,
-	0x468a, 0x1108, 0x0070, 0x2009, 0x004b, 0x080c, 0xbc6a, 0x2009,
-	0x0003, 0x0108, 0x0078, 0x0429, 0x19c0, 0xa897, 0x4005, 0xa99a,
-	0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030,
-	0x00ce, 0x0005, 0x9006, 0x0ce0, 0x7aa8, 0xd2dc, 0x0904, 0x320a,
-	0x0016, 0x7984, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x510b, 0x001e,
-	0x1904, 0x320a, 0x0804, 0x31d8, 0x00f6, 0x2d78, 0x0011, 0x00fe,
-	0x0005, 0xaab0, 0xd2dc, 0x0150, 0x0016, 0xa998, 0x9284, 0x1000,
-	0xc0fd, 0x080c, 0x510b, 0x001e, 0x9085, 0x0001, 0x0005, 0x81ff,
-	0x0120, 0x2009, 0x0001, 0x0804, 0x320a, 0x080c, 0x5167, 0x0120,
-	0x2009, 0x0007, 0x0804, 0x320a, 0x7984, 0x7ea8, 0x96b4, 0x00ff,
-	0x080c, 0x5ff1, 0x1904, 0x320d, 0x9186, 0x007f, 0x0138, 0x080c,
-	0x6315, 0x0120, 0x2009, 0x0009, 0x0804, 0x320a, 0x080c, 0x4659,
-	0x1120, 0x2009, 0x0002, 0x0804, 0x320a, 0xa867, 0x0000, 0xa868,
-	0xc0fd, 0xa86a, 0x2001, 0x0100, 0x8007, 0xa80a, 0x080c, 0xb96f,
-	0x1120, 0x2009, 0x0003, 0x0804, 0x320a, 0x7007, 0x0003, 0x701f,
-	0x4f4a, 0x0005, 0xa808, 0x8007, 0x9086, 0x0100, 0x1120, 0x2009,
-	0x0004, 0x0804, 0x320a, 0xa8e0, 0xa866, 0xa810, 0x8007, 0x9084,
-	0x00ff, 0x800c, 0xa814, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9080,
-	0x0002, 0x9108, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084,
-	0xffc0, 0x9080, 0x0004, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804,
-	0x46a5, 0x080c, 0x4659, 0x1120, 0x2009, 0x0002, 0x0804, 0x320a,
-	0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118,
-	0x7023, 0x1982, 0x0040, 0x92c6, 0x0001, 0x1118, 0x7023, 0x199c,
-	0x0010, 0x0804, 0x320d, 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c,
-	0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x46a2, 0x701f,
-	0x4f9a, 0x0005, 0x2001, 0x182d, 0x2003, 0x0001, 0xa85c, 0x9080,
-	0x0019, 0x2098, 0xa860, 0x20e0, 0x20a9, 0x001a, 0x7020, 0x20a0,
-	0x20e9, 0x0001, 0x4003, 0x0804, 0x31d8, 0x080c, 0x4659, 0x1120,
-	0x2009, 0x0002, 0x0804, 0x320a, 0x7984, 0x9194, 0xff00, 0x918c,
-	0x00ff, 0x8217, 0x82ff, 0x1118, 0x2099, 0x1982, 0x0040, 0x92c6,
-	0x0001, 0x1118, 0x2099, 0x199c, 0x0010, 0x0804, 0x320d, 0xa85c,
-	0x9080, 0x0019, 0x20a0, 0xa860, 0x20e8, 0x20a9, 0x001a, 0x20e1,
-	0x0001, 0x4003, 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98,
-	0xa85c, 0x9080, 0x0019, 0xaf60, 0x0804, 0x46a5, 0x7884, 0x908a,
-	0x1000, 0x1a04, 0x320d, 0x0126, 0x2091, 0x8000, 0x8003, 0x800b,
-	0x810b, 0x9108, 0x00c6, 0x2061, 0x19c9, 0x6142, 0x00ce, 0x012e,
-	0x0804, 0x31d8, 0x00c6, 0x080c, 0x6d14, 0x1160, 0x080c, 0x6ff8,
-	0x080c, 0x5a94, 0x9085, 0x0001, 0x080c, 0x6d5b, 0x080c, 0x6c46,
-	0x080c, 0x0db4, 0x2061, 0x1800, 0x6030, 0xc09d, 0x6032, 0x080c,
-	0x5953, 0x00ce, 0x0005, 0x00c6, 0x2001, 0x1800, 0x2004, 0x908e,
-	0x0000, 0x0904, 0x320a, 0x7884, 0x9005, 0x0188, 0x7888, 0x2061,
-	0x196b, 0x2c0c, 0x2062, 0x080c, 0x28ed, 0x01a0, 0x080c, 0x28f5,
-	0x0188, 0x080c, 0x28fd, 0x0170, 0x2162, 0x0804, 0x320d, 0x2061,
-	0x0100, 0x6038, 0x9086, 0x0007, 0x1118, 0x2009, 0x0001, 0x0010,
-	0x2009, 0x0000, 0x7884, 0x9086, 0x0002, 0x1548, 0x2061, 0x0100,
-	0x6028, 0xc09c, 0x602a, 0x0026, 0x2011, 0x0003, 0x080c, 0x93f3,
-	0x2011, 0x0002, 0x080c, 0x93fd, 0x002e, 0x080c, 0x92e4, 0x0036,
-	0x901e, 0x080c, 0x935a, 0x003e, 0x60e3, 0x0000, 0x080c, 0xd4e3,
-	0x080c, 0xd4fe, 0x9085, 0x0001, 0x080c, 0x6d5b, 0x9006, 0x080c,
-	0x29bc, 0x2001, 0x1800, 0x2003, 0x0004, 0x6027, 0x0008, 0x00ce,
-	0x0804, 0x31d8, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x320a,
-	0x080c, 0x5167, 0x0120, 0x2009, 0x0007, 0x0804, 0x320a, 0x7984,
-	0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x5ff1, 0x1904, 0x320d, 0x9186,
-	0x007f, 0x0138, 0x080c, 0x6315, 0x0120, 0x2009, 0x0009, 0x0804,
-	0x320a, 0x080c, 0x4659, 0x1120, 0x2009, 0x0002, 0x0804, 0x320a,
-	0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xb972, 0x1120,
-	0x2009, 0x0003, 0x0804, 0x320a, 0x7007, 0x0003, 0x701f, 0x5099,
+	0x0800, 0x0120, 0x9386, 0x003c, 0x0170, 0x0c20, 0x83ff, 0x1148,
+	0x7224, 0x900e, 0x2001, 0x0003, 0x080c, 0x8248, 0x2208, 0x0804,
+	0x3330, 0x7033, 0x0001, 0x7122, 0x7024, 0x9300, 0x7026, 0x2061,
+	0x18ae, 0x2c44, 0xa06b, 0x0000, 0xa37a, 0x7028, 0xa076, 0x7034,
+	0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, 0x10d5, 0x7007,
+	0x0002, 0x701f, 0x4d0c, 0x0005, 0x7030, 0x9005, 0x1178, 0x7120,
+	0x7028, 0x20a0, 0x901e, 0x7034, 0x20e8, 0x2061, 0x18ae, 0x2c44,
+	0xa48c, 0xa590, 0xa694, 0xa798, 0x0804, 0x4cca, 0x7224, 0x900e,
+	0x2001, 0x0003, 0x080c, 0x8248, 0x2208, 0x0804, 0x3330, 0x00f6,
+	0x00e6, 0x080c, 0x5393, 0x2009, 0x0007, 0x1904, 0x4d9f, 0x2071,
+	0x1894, 0x745c, 0x84ff, 0x2009, 0x000e, 0x1904, 0x4d9f, 0xac9c,
+	0xad98, 0xaea4, 0xafa0, 0x0096, 0x080c, 0x1004, 0x2009, 0x0002,
+	0x0904, 0x4d9f, 0x2900, 0x705e, 0x900e, 0x901e, 0x7356, 0x7362,
+	0xa860, 0x7066, 0xa85c, 0x9080, 0x0003, 0x705a, 0x20a0, 0x91d8,
+	0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x655b, 0x0118, 0x080c,
+	0x6563, 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810, 0x4004,
+	0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386,
+	0x003c, 0x01e8, 0x0c20, 0x83ff, 0x11c0, 0x7254, 0x900e, 0x2001,
+	0x0003, 0x080c, 0x8248, 0x2208, 0x009e, 0xa897, 0x4000, 0xa99a,
+	0x715c, 0x81ff, 0x090c, 0x0db4, 0x2148, 0x080c, 0x101d, 0x9006,
+	0x705e, 0x918d, 0x0001, 0x2008, 0x0418, 0x7063, 0x0001, 0x7152,
+	0x7054, 0x9300, 0x7056, 0x2061, 0x18af, 0x2c44, 0xa37a, 0x7058,
+	0xa076, 0x7064, 0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a, 0xa09f,
+	0x4dab, 0x000e, 0xa0a2, 0x080c, 0x10d5, 0x9006, 0x0048, 0x009e,
+	0xa897, 0x4005, 0xa99a, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030,
+	0x00ee, 0x00fe, 0x0005, 0x00f6, 0xa0a0, 0x904d, 0x090c, 0x0db4,
+	0x00e6, 0x2071, 0x1894, 0xa06c, 0x908e, 0x0100, 0x0138, 0xa87b,
+	0x0030, 0xa883, 0x0000, 0xa897, 0x4002, 0x00d8, 0x7060, 0x9005,
+	0x1158, 0x7150, 0x7058, 0x20a0, 0x901e, 0x7064, 0x20e8, 0xa48c,
+	0xa590, 0xa694, 0xa798, 0x0428, 0xa87b, 0x0000, 0xa883, 0x0000,
+	0xa897, 0x4000, 0x7254, 0x900e, 0x2001, 0x0003, 0x080c, 0x8248,
+	0xaa9a, 0x715c, 0x81ff, 0x090c, 0x0db4, 0x2148, 0x080c, 0x101d,
+	0x705f, 0x0000, 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000, 0x080c,
+	0x6885, 0x012e, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x00ee, 0x00fe,
+	0x0005, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x655b,
+	0x0118, 0x080c, 0x6563, 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004,
+	0xb810, 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800,
+	0x0120, 0x9386, 0x003c, 0x0518, 0x0c20, 0x83ff, 0x11f0, 0x7154,
+	0x810c, 0xa99a, 0xa897, 0x4000, 0x715c, 0x81ff, 0x090c, 0x0db4,
+	0x2148, 0x080c, 0x101d, 0x9006, 0x705e, 0x918d, 0x0001, 0x2008,
+	0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x6885, 0x012e,
+	0xa09f, 0x0000, 0xa0a3, 0x0000, 0x0070, 0x7063, 0x0001, 0x7152,
+	0x7054, 0x9300, 0x7056, 0xa37a, 0xa48e, 0xa592, 0xa696, 0xa79a,
+	0x080c, 0x10d5, 0x9006, 0x00ee, 0x0005, 0x0096, 0xa88c, 0x90be,
+	0x7000, 0x0148, 0x90be, 0x7100, 0x0130, 0x90be, 0x7200, 0x0118,
+	0x009e, 0x0804, 0x3365, 0xa884, 0xa988, 0x080c, 0x2663, 0x1518,
+	0x080c, 0x61d7, 0x1500, 0x7126, 0xbe12, 0xbd16, 0xae7c, 0x080c,
+	0x4872, 0x01c8, 0x080c, 0x4872, 0x01b0, 0x009e, 0xa867, 0x0000,
+	0xa868, 0xc0fd, 0xa86a, 0xa823, 0x0000, 0xa804, 0x2048, 0x080c,
+	0xbca8, 0x1120, 0x2009, 0x0003, 0x0804, 0x3362, 0x7007, 0x0003,
+	0x701f, 0x4e78, 0x0005, 0x009e, 0x2009, 0x0002, 0x0804, 0x3362,
+	0x7124, 0x080c, 0x30ce, 0xa820, 0x9086, 0x8001, 0x1120, 0x2009,
+	0x0004, 0x0804, 0x3362, 0x2900, 0x7022, 0xa804, 0x0096, 0x2048,
+	0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x009e,
+	0x9080, 0x0002, 0x0076, 0x0006, 0x2098, 0x20a0, 0x27e0, 0x27e8,
+	0x20a9, 0x002a, 0x080c, 0x0f68, 0xaa6c, 0xab70, 0xac74, 0xad78,
+	0x2061, 0x18ae, 0x2c44, 0xa06b, 0x0000, 0xae64, 0xaf8c, 0x97c6,
+	0x7000, 0x0118, 0x97c6, 0x7100, 0x1148, 0x96c2, 0x0004, 0x0600,
+	0x2009, 0x0004, 0x000e, 0x007e, 0x0804, 0x48be, 0x97c6, 0x7200,
+	0x11b8, 0x96c2, 0x0054, 0x02a0, 0x000e, 0x007e, 0x2061, 0x18ae,
+	0x2c44, 0xa076, 0xa772, 0xa07b, 0x002a, 0xa28e, 0xa392, 0xa496,
+	0xa59a, 0x080c, 0x10d5, 0x7007, 0x0002, 0x701f, 0x4ed4, 0x0005,
+	0x000e, 0x007e, 0x0804, 0x3365, 0x7020, 0x2048, 0xa804, 0x2048,
+	0xa804, 0x2048, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084,
+	0xffc0, 0x9080, 0x0002, 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9,
+	0x002a, 0x080c, 0x0f68, 0x2100, 0x2238, 0x2061, 0x18ae, 0x2c44,
+	0xa28c, 0xa390, 0xa494, 0xa598, 0x2009, 0x002a, 0x0804, 0x48be,
+	0x81ff, 0x1904, 0x3362, 0x798c, 0x2001, 0x194f, 0x918c, 0x8000,
+	0x2102, 0x080c, 0x4889, 0x0904, 0x3365, 0x080c, 0x655b, 0x0120,
+	0x080c, 0x6563, 0x1904, 0x3365, 0x080c, 0x62fe, 0x0904, 0x3362,
+	0x0126, 0x2091, 0x8000, 0x080c, 0x63c4, 0x012e, 0x0904, 0x3362,
+	0x2001, 0x194f, 0x2004, 0xd0fc, 0x1904, 0x3330, 0x0804, 0x42fa,
+	0xa9a0, 0x2001, 0x194f, 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c,
+	0x4896, 0x01a0, 0x080c, 0x655b, 0x0118, 0x080c, 0x6563, 0x1170,
+	0x080c, 0x62fe, 0x2009, 0x0002, 0x0128, 0x080c, 0x63c4, 0x1170,
+	0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006,
+	0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000,
+	0x2001, 0x194f, 0x2004, 0xd0fc, 0x1128, 0x080c, 0x5387, 0x0110,
+	0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005,
+	0x78a8, 0xd08c, 0x1118, 0xd084, 0x0904, 0x426f, 0x080c, 0x48a5,
+	0x0904, 0x3365, 0x080c, 0x4872, 0x1120, 0x2009, 0x0002, 0x0804,
+	0x3362, 0x080c, 0x655b, 0x0130, 0x908e, 0x0004, 0x0118, 0x908e,
+	0x0005, 0x15a0, 0x78a8, 0xd08c, 0x0120, 0xb800, 0xc08c, 0xb802,
+	0x0028, 0x080c, 0x537f, 0xd0b4, 0x0904, 0x42a9, 0x7884, 0x908e,
+	0x007e, 0x0904, 0x42a9, 0x908e, 0x007f, 0x0904, 0x42a9, 0x908e,
+	0x0080, 0x0904, 0x42a9, 0xb800, 0xd08c, 0x1904, 0x42a9, 0xa867,
+	0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xbcc7, 0x1120, 0x2009,
+	0x0003, 0x0804, 0x3362, 0x7007, 0x0003, 0x701f, 0x4fa0, 0x0005,
+	0x080c, 0x48a5, 0x0904, 0x3365, 0x0804, 0x42a9, 0x080c, 0x3127,
+	0x0108, 0x0005, 0x2009, 0x1833, 0x210c, 0x81ff, 0x0120, 0x2009,
+	0x0001, 0x0804, 0x3362, 0x080c, 0x5393, 0x0120, 0x2009, 0x0007,
+	0x0804, 0x3362, 0x080c, 0x6553, 0x0120, 0x2009, 0x0008, 0x0804,
+	0x3362, 0xb89c, 0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x42a9, 0x9006,
+	0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xbd21, 0x1120,
+	0x2009, 0x0003, 0x0804, 0x3362, 0x7007, 0x0003, 0x701f, 0x4fd9,
 	0x0005, 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804,
-	0x320a, 0xa8e0, 0xa866, 0xa834, 0x8007, 0x800c, 0xa85c, 0x9080,
-	0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xaf60, 0x0804, 0x46a5,
-	0xa898, 0x9086, 0x000d, 0x1904, 0x320a, 0x2021, 0x4005, 0x0126,
-	0x2091, 0x8000, 0x0e04, 0x50bd, 0x0010, 0x012e, 0x0cc0, 0x7c36,
-	0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, 0x0010,
-	0x7883, 0x4005, 0xa998, 0x7986, 0xa9a4, 0x799a, 0xa9a8, 0x799e,
-	0x080c, 0x4695, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084,
-	0x190c, 0x117e, 0x7007, 0x0001, 0x2091, 0x5000, 0x700f, 0x0000,
-	0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061, 0x19c9,
-	0x7984, 0x6152, 0x614e, 0x6057, 0x0000, 0x604b, 0x0009, 0x7898,
-	0x606a, 0x789c, 0x6066, 0x7888, 0x6062, 0x788c, 0x605e, 0x2001,
-	0x19d7, 0x2044, 0x2001, 0x19de, 0xa076, 0xa060, 0xa072, 0xa07b,
-	0x0001, 0xa07f, 0x0002, 0xa06b, 0x0000, 0xa09f, 0x0000, 0x00ce,
-	0x012e, 0x0804, 0x31d8, 0x0126, 0x2091, 0x8000, 0x00b6, 0x00c6,
-	0x90e4, 0xc000, 0x0128, 0x0006, 0x080c, 0xb7e0, 0x000e, 0x1198,
-	0xd0e4, 0x0160, 0x9180, 0x1000, 0x2004, 0x905d, 0x0160, 0x080c,
-	0x5aae, 0x080c, 0x9a47, 0x0110, 0xb817, 0x0000, 0x9006, 0x00ce,
-	0x00be, 0x012e, 0x0005, 0x9085, 0x0001, 0x0cc8, 0x0126, 0x2091,
-	0x8000, 0x0156, 0x2010, 0x900e, 0x20a9, 0x0800, 0x0016, 0x9180,
-	0x1000, 0x2004, 0x9005, 0x0180, 0x9186, 0x007e, 0x0168, 0x9186,
-	0x007f, 0x0150, 0x9186, 0x0080, 0x0138, 0x9186, 0x00ff, 0x0120,
-	0x0026, 0x2200, 0x0801, 0x002e, 0x001e, 0x8108, 0x1f04, 0x5136,
-	0x015e, 0x012e, 0x0005, 0x2001, 0x1854, 0x2004, 0x0005, 0x2001,
-	0x1873, 0x2004, 0x0005, 0x0006, 0x2001, 0x1810, 0x2004, 0xd0d4,
-	0x000e, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0b4, 0x0005, 0x2001,
-	0x1800, 0x2004, 0x9086, 0x0003, 0x0005, 0x0016, 0x00e6, 0x2071,
-	0x1894, 0x7108, 0x910d, 0x710a, 0x00ee, 0x001e, 0x0005, 0x080c,
-	0x4659, 0x080c, 0x0ef3, 0x2100, 0x2238, 0x7d84, 0x7c88, 0x7b8c,
-	0x7a90, 0x79a4, 0x9182, 0x0081, 0x1a04, 0x320d, 0x810c, 0x080c,
-	0x46a2, 0x701f, 0x518c, 0x0005, 0x2079, 0x0000, 0x7d94, 0x7c98,
-	0x7ba8, 0x7aac, 0x79a4, 0x810c, 0x2061, 0x18ae, 0x2c44, 0xa770,
-	0xa074, 0x2071, 0x1894, 0x080c, 0x46a5, 0x701f, 0x51a0, 0x0005,
-	0x2061, 0x18ae, 0x2c44, 0xa074, 0x2048, 0x9006, 0xa802, 0xa806,
-	0x0804, 0x31d8, 0x0126, 0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6,
-	0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2061, 0x0100, 0x2069, 0x0200,
-	0x2071, 0x1800, 0x6044, 0xd0a4, 0x11e8, 0xd084, 0x0118, 0x080c,
-	0x5353, 0x0068, 0xd08c, 0x0118, 0x080c, 0x525c, 0x0040, 0xd094,
-	0x0118, 0x080c, 0x522c, 0x0018, 0xd09c, 0x0108, 0x0099, 0x00fe,
-	0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e,
-	0x012e, 0x0005, 0x0016, 0x6128, 0xd19c, 0x1110, 0xc19d, 0x612a,
-	0x001e, 0x0c68, 0x0006, 0x7094, 0x9005, 0x000e, 0x0120, 0x7097,
-	0x0000, 0x708f, 0x0000, 0x624c, 0x9286, 0xf0f0, 0x1150, 0x6048,
-	0x9086, 0xf0f0, 0x0130, 0x624a, 0x6043, 0x0090, 0x6043, 0x0010,
-	0x0490, 0x9294, 0xff00, 0x9296, 0xf700, 0x0178, 0x7138, 0xd1a4,
-	0x1160, 0x6240, 0x9295, 0x0100, 0x6242, 0x9294, 0x0010, 0x0128,
-	0x2009, 0x00f7, 0x080c, 0x5a10, 0x00f0, 0x6040, 0x9084, 0x0010,
-	0x9085, 0x0140, 0x6042, 0x6043, 0x0000, 0x7083, 0x0000, 0x709f,
-	0x0001, 0x70c3, 0x0000, 0x70db, 0x0000, 0x2009, 0x1c80, 0x200b,
-	0x0000, 0x7093, 0x0000, 0x7087, 0x000f, 0x2009, 0x000f, 0x2011,
-	0x58f6, 0x080c, 0x7de5, 0x0005, 0x2001, 0x1875, 0x2004, 0xd08c,
-	0x0110, 0x705b, 0xffff, 0x7084, 0x9005, 0x1528, 0x2011, 0x58f6,
-	0x080c, 0x7d56, 0x6040, 0x9094, 0x0010, 0x9285, 0x0020, 0x6042,
-	0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04, 0x5242, 0x6242,
-	0x7097, 0x0000, 0x6040, 0x9094, 0x0010, 0x9285, 0x0080, 0x6042,
-	0x6242, 0x0048, 0x6242, 0x7097, 0x0000, 0x708b, 0x0000, 0x9006,
-	0x080c, 0x5a99, 0x0000, 0x0005, 0x7088, 0x908a, 0x0003, 0x1a0c,
-	0x0db4, 0x000b, 0x0005, 0x5266, 0x52b7, 0x5352, 0x00f6, 0x0016,
-	0x6900, 0x918c, 0x0800, 0x708b, 0x0001, 0x2001, 0x015d, 0x2003,
-	0x0000, 0x6803, 0x00fc, 0x20a9, 0x0004, 0x6800, 0x9084, 0x00fc,
-	0x0120, 0x1f04, 0x5275, 0x080c, 0x0db4, 0x68a0, 0x68a2, 0x689c,
-	0x689e, 0x6898, 0x689a, 0xa001, 0x918d, 0x1600, 0x6902, 0x001e,
-	0x6837, 0x0020, 0x080c, 0x5a75, 0x2079, 0x1c00, 0x7833, 0x1101,
-	0x7837, 0x0000, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0001,
-	0x20a1, 0x1c0e, 0x20a9, 0x0004, 0x4003, 0x080c, 0x98d5, 0x20e1,
-	0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9,
-	0x0014, 0x4003, 0x60c3, 0x000c, 0x600f, 0x0000, 0x080c, 0x5927,
-	0x00fe, 0x9006, 0x708e, 0x6043, 0x0008, 0x6042, 0x0005, 0x00f6,
-	0x708c, 0x708f, 0x0000, 0x9025, 0x0904, 0x532f, 0x6020, 0xd0b4,
-	0x1904, 0x532d, 0x719c, 0x81ff, 0x0904, 0x531b, 0x9486, 0x000c,
-	0x1904, 0x5328, 0x9480, 0x0018, 0x8004, 0x20a8, 0x080c, 0x5a6e,
-	0x2011, 0x0260, 0x2019, 0x1c00, 0x220c, 0x2304, 0x9106, 0x11e8,
-	0x8210, 0x8318, 0x1f04, 0x52d4, 0x6043, 0x0004, 0x2061, 0x0140,
-	0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0006,
-	0x708b, 0x0002, 0x7097, 0x0002, 0x2009, 0x07d0, 0x2011, 0x58fd,
-	0x080c, 0x7de5, 0x080c, 0x5a75, 0x04c0, 0x080c, 0x5a6e, 0x2079,
-	0x0260, 0x7930, 0x918e, 0x1101, 0x1558, 0x7834, 0x9005, 0x1540,
-	0x7900, 0x918c, 0x00ff, 0x1118, 0x7804, 0x9005, 0x0190, 0x080c,
-	0x5a6e, 0x2011, 0x026e, 0x2019, 0x1805, 0x20a9, 0x0004, 0x220c,
-	0x2304, 0x9102, 0x0230, 0x11a0, 0x8210, 0x8318, 0x1f04, 0x530f,
-	0x0078, 0x709f, 0x0000, 0x080c, 0x5a6e, 0x20e1, 0x0000, 0x2099,
-	0x0260, 0x20e9, 0x0001, 0x20a1, 0x1c00, 0x20a9, 0x0014, 0x4003,
-	0x6043, 0x0008, 0x6043, 0x0000, 0x0010, 0x00fe, 0x0005, 0x6040,
-	0x9085, 0x0100, 0x6042, 0x6020, 0xd0b4, 0x1db8, 0x080c, 0x98d5,
-	0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240,
-	0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x2011, 0x19c0, 0x2013,
-	0x0000, 0x708f, 0x0000, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c,
-	0x90b8, 0x08d8, 0x0005, 0x7094, 0x908a, 0x001d, 0x1a0c, 0x0db4,
-	0x000b, 0x0005, 0x5384, 0x5397, 0x53c0, 0x53e0, 0x5406, 0x5435,
-	0x545b, 0x5493, 0x54b9, 0x54e7, 0x5522, 0x555a, 0x5578, 0x55a3,
-	0x55c5, 0x55e0, 0x55ea, 0x561e, 0x5644, 0x5673, 0x5699, 0x56d1,
-	0x5715, 0x5752, 0x5773, 0x57cc, 0x57ee, 0x581c, 0x581c, 0x00c6,
-	0x2061, 0x1800, 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, 0x9084,
-	0xfff9, 0x6006, 0x00ce, 0x0005, 0x2061, 0x0140, 0x605b, 0xbc94,
-	0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0002, 0x7097, 0x0001,
-	0x2009, 0x07d0, 0x2011, 0x58fd, 0x080c, 0x7de5, 0x0005, 0x00f6,
-	0x708c, 0x9086, 0x0014, 0x1510, 0x6042, 0x6020, 0xd0b4, 0x11f0,
-	0x080c, 0x5a6e, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, 0x11a0,
-	0x7834, 0x9005, 0x1188, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005,
-	0x1110, 0x70c3, 0x0001, 0x2011, 0x58fd, 0x080c, 0x7d56, 0x7097,
-	0x0010, 0x080c, 0x55ea, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005,
-	0x00f6, 0x7097, 0x0003, 0x6043, 0x0004, 0x2011, 0x58fd, 0x080c,
-	0x7d56, 0x080c, 0x59f2, 0x2079, 0x0240, 0x7833, 0x1102, 0x7837,
-	0x0000, 0x20a9, 0x0008, 0x9f88, 0x000e, 0x200b, 0x0000, 0x8108,
-	0x1f04, 0x53d5, 0x60c3, 0x0014, 0x080c, 0x5927, 0x00fe, 0x0005,
-	0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, 0x58fd, 0x080c, 0x7d56,
-	0x9086, 0x0014, 0x11b8, 0x080c, 0x5a6e, 0x2079, 0x0260, 0x7a30,
-	0x9296, 0x1102, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc,
-	0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x0004,
-	0x0029, 0x0010, 0x080c, 0x5a4a, 0x00fe, 0x0005, 0x00f6, 0x7097,
-	0x0005, 0x080c, 0x59f2, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837,
-	0x0000, 0x080c, 0x5a6e, 0x080c, 0x5a51, 0x1170, 0x7080, 0x9005,
-	0x1158, 0x7158, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c,
-	0x58aa, 0x0168, 0x080c, 0x5a27, 0x20a9, 0x0008, 0x20e1, 0x0000,
-	0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3,
-	0x0014, 0x080c, 0x5927, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005,
-	0x0500, 0x2011, 0x58fd, 0x080c, 0x7d56, 0x9086, 0x0014, 0x11b8,
-	0x080c, 0x5a6e, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178,
-	0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005,
-	0x1110, 0x70c3, 0x0001, 0x7097, 0x0006, 0x0029, 0x0010, 0x080c,
-	0x5a4a, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0007, 0x080c, 0x59f2,
-	0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x5a6e,
-	0x080c, 0x5a51, 0x11b8, 0x7080, 0x9005, 0x11a0, 0x7160, 0x9186,
-	0xffff, 0x0180, 0x9180, 0x2fd9, 0x200d, 0x918c, 0xff00, 0x810f,
-	0x2011, 0x0008, 0x080c, 0x58aa, 0x0180, 0x080c, 0x4a74, 0x0110,
-	0x080c, 0x2574, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e,
-	0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c,
-	0x5927, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011,
-	0x58fd, 0x080c, 0x7d56, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5a6e,
-	0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, 0x9005,
-	0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3,
-	0x0001, 0x7097, 0x0008, 0x0029, 0x0010, 0x080c, 0x5a4a, 0x00fe,
-	0x0005, 0x00f6, 0x7097, 0x0009, 0x080c, 0x59f2, 0x2079, 0x0240,
-	0x7833, 0x1105, 0x7837, 0x0100, 0x080c, 0x5a51, 0x1150, 0x7080,
-	0x9005, 0x1138, 0x080c, 0x581d, 0x1188, 0x9085, 0x0001, 0x080c,
-	0x2574, 0x20a9, 0x0008, 0x080c, 0x5a6e, 0x20e1, 0x0000, 0x2099,
-	0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014,
-	0x080c, 0x5927, 0x0010, 0x080c, 0x5377, 0x00fe, 0x0005, 0x00f6,
-	0x708c, 0x9005, 0x05a8, 0x2011, 0x58fd, 0x080c, 0x7d56, 0x9086,
-	0x0014, 0x1560, 0x080c, 0x5a6e, 0x2079, 0x0260, 0x7a30, 0x9296,
-	0x1105, 0x1520, 0x7834, 0x9084, 0x0100, 0x2011, 0x0100, 0x921e,
-	0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3,
-	0x0001, 0x7097, 0x000a, 0x00b1, 0x0098, 0x9005, 0x1178, 0x7a38,
-	0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7093,
-	0x0000, 0x7097, 0x000e, 0x080c, 0x55c5, 0x0010, 0x080c, 0x5a4a,
-	0x00fe, 0x0005, 0x00f6, 0x7097, 0x000b, 0x2011, 0x1c0e, 0x20e9,
-	0x0001, 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff, 0x4304, 0x080c,
-	0x59f2, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, 0x080c,
-	0x5a51, 0x0118, 0x2013, 0x0000, 0x0020, 0x705c, 0x9085, 0x0100,
-	0x2012, 0x20a9, 0x0040, 0x2009, 0x024e, 0x2011, 0x1c0e, 0x220e,
-	0x8210, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810, 0x8000, 0x6812,
-	0x2009, 0x0240, 0x1f04, 0x5547, 0x60c3, 0x0084, 0x080c, 0x5927,
-	0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x01c0, 0x2011, 0x58fd,
-	0x080c, 0x7d56, 0x9086, 0x0084, 0x1178, 0x080c, 0x5a6e, 0x2079,
-	0x0260, 0x7a30, 0x9296, 0x1106, 0x1138, 0x7834, 0x9005, 0x1120,
-	0x7097, 0x000c, 0x0029, 0x0010, 0x080c, 0x5a4a, 0x00fe, 0x0005,
-	0x00f6, 0x7097, 0x000d, 0x080c, 0x59f2, 0x2079, 0x0240, 0x7833,
-	0x1107, 0x7837, 0x0000, 0x080c, 0x5a6e, 0x20a9, 0x0040, 0x2011,
-	0x026e, 0x2009, 0x024e, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260,
-	0x1150, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x6814, 0x8000,
-	0x6816, 0x2011, 0x0260, 0x1f04, 0x558b, 0x60c3, 0x0084, 0x080c,
-	0x5927, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x01e0, 0x2011,
-	0x58fd, 0x080c, 0x7d56, 0x9086, 0x0084, 0x1198, 0x080c, 0x5a6e,
-	0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, 0x9005,
-	0x1140, 0x7093, 0x0001, 0x080c, 0x59c4, 0x7097, 0x000e, 0x0029,
-	0x0010, 0x080c, 0x5a4a, 0x00fe, 0x0005, 0x918d, 0x0001, 0x080c,
-	0x5a99, 0x7097, 0x000f, 0x708f, 0x0000, 0x2061, 0x0140, 0x605b,
-	0xbc85, 0x605f, 0xb5b5, 0x2061, 0x0100, 0x6043, 0x0005, 0x6043,
-	0x0004, 0x2009, 0x07d0, 0x2011, 0x58fd, 0x080c, 0x7d4a, 0x0005,
-	0x708c, 0x9005, 0x0130, 0x2011, 0x58fd, 0x080c, 0x7d56, 0x7097,
-	0x0000, 0x0005, 0x7097, 0x0011, 0x080c, 0x98d5, 0x080c, 0x5a6e,
-	0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240,
-	0x748c, 0x9480, 0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004,
-	0x20a8, 0x4003, 0x080c, 0x5a51, 0x11a0, 0x7178, 0x81ff, 0x0188,
-	0x900e, 0x707c, 0x9084, 0x00ff, 0x0160, 0x080c, 0x250b, 0x9186,
-	0x007e, 0x0138, 0x9186, 0x0080, 0x0120, 0x2011, 0x0008, 0x080c,
-	0x58aa, 0x60c3, 0x0014, 0x080c, 0x5927, 0x0005, 0x00f6, 0x708c,
-	0x9005, 0x0500, 0x2011, 0x58fd, 0x080c, 0x7d56, 0x9086, 0x0014,
-	0x11b8, 0x080c, 0x5a6e, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103,
+	0x52dc, 0x080c, 0x48a5, 0x0904, 0x3365, 0x0804, 0x4f72, 0x81ff,
+	0x2009, 0x0001, 0x1904, 0x3362, 0x080c, 0x5393, 0x2009, 0x0007,
+	0x1904, 0x3362, 0x080c, 0x6553, 0x0120, 0x2009, 0x0008, 0x0804,
+	0x3362, 0x080c, 0x48a5, 0x0904, 0x3365, 0x080c, 0x655b, 0x2009,
+	0x0009, 0x1904, 0x3362, 0x080c, 0x4872, 0x2009, 0x0002, 0x0904,
+	0x3362, 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x7988,
+	0x9194, 0xff00, 0x918c, 0x00ff, 0x9006, 0x82ff, 0x1128, 0xc0ed,
+	0xa952, 0x798c, 0xa956, 0x0038, 0x928e, 0x0100, 0x1904, 0x3365,
+	0xc0e5, 0xa952, 0xa956, 0xa83e, 0x080c, 0xbf74, 0x2009, 0x0003,
+	0x0904, 0x3362, 0x7007, 0x0003, 0x701f, 0x502f, 0x0005, 0xa830,
+	0x9086, 0x0100, 0x2009, 0x0004, 0x0904, 0x3362, 0x0804, 0x3330,
+	0x7aa8, 0x9284, 0xc000, 0x0148, 0xd2ec, 0x01a0, 0x080c, 0x5393,
+	0x1188, 0x2009, 0x0014, 0x0804, 0x3362, 0xd2dc, 0x1568, 0x81ff,
+	0x2009, 0x0001, 0x1904, 0x3362, 0x080c, 0x5393, 0x2009, 0x0007,
+	0x1904, 0x3362, 0xd2f4, 0x0130, 0x9284, 0x5000, 0x080c, 0x535a,
+	0x0804, 0x3330, 0xd2fc, 0x0158, 0x080c, 0x48a5, 0x0904, 0x3365,
+	0x7984, 0x9284, 0x9000, 0x080c, 0x5337, 0x0804, 0x3330, 0x080c,
+	0x48a5, 0x0904, 0x3365, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006,
+	0x2009, 0x0009, 0x1904, 0x5118, 0x080c, 0x4872, 0x2009, 0x0002,
+	0x0904, 0x5118, 0xa85c, 0x9080, 0x001b, 0xaf60, 0x2009, 0x0008,
+	0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x48bb, 0x701f, 0x5089,
+	0x0005, 0xa86c, 0x9086, 0x0500, 0x1138, 0xa870, 0x9005, 0x1120,
+	0xa874, 0x9084, 0xff00, 0x0110, 0x1904, 0x3365, 0xa866, 0xa832,
+	0xa868, 0xc0fd, 0xa86a, 0x080c, 0x48a5, 0x1110, 0x0804, 0x3365,
+	0x2009, 0x0043, 0x080c, 0xbfdc, 0x2009, 0x0003, 0x0904, 0x5118,
+	0x7007, 0x0003, 0x701f, 0x50ad, 0x0005, 0xa830, 0x9086, 0x0100,
+	0x2009, 0x0004, 0x0904, 0x5118, 0x7984, 0x7aa8, 0x9284, 0x1000,
+	0x080c, 0x5337, 0x0804, 0x3330, 0x00c6, 0xaab0, 0x9284, 0xc000,
+	0x0140, 0xd2ec, 0x0168, 0x080c, 0x5393, 0x1150, 0x2009, 0x0014,
+	0x04f0, 0x2061, 0x1800, 0x080c, 0x5393, 0x2009, 0x0007, 0x15b8,
+	0xd2f4, 0x0128, 0x9284, 0x5000, 0x080c, 0x535a, 0x0050, 0xd2fc,
+	0x0178, 0x080c, 0x48a3, 0x0588, 0xa998, 0x9284, 0x9000, 0x080c,
+	0x5337, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x0438,
+	0x080c, 0x48a3, 0x0510, 0x080c, 0x655b, 0x2009, 0x0009, 0x11b8,
+	0xa8c4, 0x9086, 0x0500, 0x11c8, 0xa8c8, 0x9005, 0x11b0, 0xa8cc,
+	0x9084, 0xff00, 0x1190, 0x080c, 0x48a3, 0x1108, 0x0070, 0x2009,
+	0x004b, 0x080c, 0xbfdc, 0x2009, 0x0003, 0x0108, 0x0078, 0x0429,
+	0x19c0, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e,
+	0x9085, 0x0001, 0x2001, 0x0030, 0x00ce, 0x0005, 0x9006, 0x0ce0,
+	0x7aa8, 0xd2dc, 0x0904, 0x3362, 0x0016, 0x7984, 0x9284, 0x1000,
+	0xc0fd, 0x080c, 0x5337, 0x001e, 0x1904, 0x3362, 0x0804, 0x3330,
+	0x00f6, 0x2d78, 0x0011, 0x00fe, 0x0005, 0xaab0, 0xd2dc, 0x0150,
+	0x0016, 0xa998, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x5337, 0x001e,
+	0x9085, 0x0001, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804,
+	0x3362, 0x080c, 0x5393, 0x0120, 0x2009, 0x0007, 0x0804, 0x3362,
+	0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x6237, 0x1904, 0x3365,
+	0x9186, 0x007f, 0x0138, 0x080c, 0x655b, 0x0120, 0x2009, 0x0009,
+	0x0804, 0x3362, 0x080c, 0x4872, 0x1120, 0x2009, 0x0002, 0x0804,
+	0x3362, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x2001, 0x0100,
+	0x8007, 0xa80a, 0x080c, 0xbce1, 0x1120, 0x2009, 0x0003, 0x0804,
+	0x3362, 0x7007, 0x0003, 0x701f, 0x5176, 0x0005, 0xa808, 0x8007,
+	0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x3362, 0xa8e0,
+	0xa866, 0xa810, 0x8007, 0x9084, 0x00ff, 0x800c, 0xa814, 0x8007,
+	0x9084, 0x00ff, 0x8004, 0x9080, 0x0002, 0x9108, 0x8906, 0x8006,
+	0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0004, 0x7a8c,
+	0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x48be, 0x080c, 0x4872, 0x1120,
+	0x2009, 0x0002, 0x0804, 0x3362, 0x7984, 0x9194, 0xff00, 0x918c,
+	0x00ff, 0x8217, 0x82ff, 0x1118, 0x7023, 0x1984, 0x0040, 0x92c6,
+	0x0001, 0x1118, 0x7023, 0x199e, 0x0010, 0x0804, 0x3365, 0x2009,
+	0x001a, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019,
+	0xaf60, 0x080c, 0x48bb, 0x701f, 0x51c6, 0x0005, 0x2001, 0x182d,
+	0x2003, 0x0001, 0xa85c, 0x9080, 0x0019, 0x2098, 0xa860, 0x20e0,
+	0x20a9, 0x001a, 0x7020, 0x20a0, 0x20e9, 0x0001, 0x4003, 0x0804,
+	0x3330, 0x080c, 0x4872, 0x1120, 0x2009, 0x0002, 0x0804, 0x3362,
+	0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118,
+	0x2099, 0x1984, 0x0040, 0x92c6, 0x0001, 0x1118, 0x2099, 0x199e,
+	0x0010, 0x0804, 0x3365, 0xa85c, 0x9080, 0x0019, 0x20a0, 0xa860,
+	0x20e8, 0x20a9, 0x001a, 0x20e1, 0x0001, 0x4003, 0x2009, 0x001a,
+	0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60,
+	0x0804, 0x48be, 0x7884, 0x908a, 0x1000, 0x1a04, 0x3365, 0x0126,
+	0x2091, 0x8000, 0x8003, 0x800b, 0x810b, 0x9108, 0x00c6, 0x2061,
+	0x19cb, 0x6142, 0x00ce, 0x012e, 0x0804, 0x3330, 0x00c6, 0x080c,
+	0x6fa7, 0x1160, 0x080c, 0x728b, 0x080c, 0x5cca, 0x9085, 0x0001,
+	0x080c, 0x6fee, 0x080c, 0x6ed9, 0x080c, 0x0db4, 0x2061, 0x1800,
+	0x6030, 0xc09d, 0x6032, 0x080c, 0x5b89, 0x00ce, 0x0005, 0x00c6,
+	0x2001, 0x1800, 0x2004, 0x908e, 0x0000, 0x0904, 0x3362, 0x7884,
+	0x9005, 0x0188, 0x7888, 0x2061, 0x196d, 0x2c0c, 0x2062, 0x080c,
+	0x2a45, 0x01a0, 0x080c, 0x2a4d, 0x0188, 0x080c, 0x2a55, 0x0170,
+	0x2162, 0x0804, 0x3365, 0x2061, 0x0100, 0x6038, 0x9086, 0x0007,
+	0x1118, 0x2009, 0x0001, 0x0010, 0x2009, 0x0000, 0x7884, 0x9086,
+	0x0002, 0x1548, 0x2061, 0x0100, 0x6028, 0xc09c, 0x602a, 0x0026,
+	0x2011, 0x0003, 0x080c, 0x9758, 0x2011, 0x0002, 0x080c, 0x9762,
+	0x002e, 0x080c, 0x9649, 0x0036, 0x901e, 0x080c, 0x96bf, 0x003e,
+	0x60e3, 0x0000, 0x080c, 0xd894, 0x080c, 0xd8af, 0x9085, 0x0001,
+	0x080c, 0x6fee, 0x9006, 0x080c, 0x2b14, 0x2001, 0x1800, 0x2003,
+	0x0004, 0x6027, 0x0008, 0x00ce, 0x0804, 0x3330, 0x81ff, 0x0120,
+	0x2009, 0x0001, 0x0804, 0x3362, 0x080c, 0x5393, 0x0120, 0x2009,
+	0x0007, 0x0804, 0x3362, 0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c,
+	0x6237, 0x1904, 0x3365, 0x9186, 0x007f, 0x0138, 0x080c, 0x655b,
+	0x0120, 0x2009, 0x0009, 0x0804, 0x3362, 0x080c, 0x4872, 0x1120,
+	0x2009, 0x0002, 0x0804, 0x3362, 0xa867, 0x0000, 0xa868, 0xc0fd,
+	0xa86a, 0x080c, 0xbce4, 0x1120, 0x2009, 0x0003, 0x0804, 0x3362,
+	0x7007, 0x0003, 0x701f, 0x52c5, 0x0005, 0xa830, 0x9086, 0x0100,
+	0x1120, 0x2009, 0x0004, 0x0804, 0x3362, 0xa8e0, 0xa866, 0xa834,
+	0x8007, 0x800c, 0xa85c, 0x9080, 0x000c, 0x7a8c, 0x7b88, 0x7c9c,
+	0x7d98, 0xaf60, 0x0804, 0x48be, 0xa898, 0x9086, 0x000d, 0x1904,
+	0x3362, 0x2021, 0x4005, 0x0126, 0x2091, 0x8000, 0x0e04, 0x52e9,
+	0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833,
+	0x0011, 0x0010, 0x7833, 0x0010, 0x7883, 0x4005, 0xa998, 0x7986,
+	0xa9a4, 0x799a, 0xa9a8, 0x799e, 0x080c, 0x48ae, 0x2091, 0x4080,
+	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1187, 0x7007, 0x0001,
+	0x2091, 0x5000, 0x700f, 0x0000, 0x012e, 0x0005, 0x0126, 0x2091,
+	0x8000, 0x00c6, 0x2061, 0x19cb, 0x7984, 0x6152, 0x614e, 0x6057,
+	0x0000, 0x604b, 0x0009, 0x7898, 0x606a, 0x789c, 0x6066, 0x7888,
+	0x6062, 0x788c, 0x605e, 0x2001, 0x19d9, 0x2044, 0x2001, 0x19e0,
+	0xa076, 0xa060, 0xa072, 0xa07b, 0x0001, 0xa07f, 0x0002, 0xa06b,
+	0x0000, 0xa09f, 0x0000, 0x00ce, 0x012e, 0x0804, 0x3330, 0x0126,
+	0x2091, 0x8000, 0x00b6, 0x00c6, 0x90e4, 0xc000, 0x0128, 0x0006,
+	0x080c, 0xbb4b, 0x000e, 0x1198, 0xd0e4, 0x0160, 0x9180, 0x1000,
+	0x2004, 0x905d, 0x0160, 0x080c, 0x5ce4, 0x080c, 0x9d98, 0x0110,
+	0xb817, 0x0000, 0x9006, 0x00ce, 0x00be, 0x012e, 0x0005, 0x9085,
+	0x0001, 0x0cc8, 0x0126, 0x2091, 0x8000, 0x0156, 0x2010, 0x900e,
+	0x20a9, 0x0800, 0x0016, 0x9180, 0x1000, 0x2004, 0x9005, 0x0180,
+	0x9186, 0x007e, 0x0168, 0x9186, 0x007f, 0x0150, 0x9186, 0x0080,
+	0x0138, 0x9186, 0x00ff, 0x0120, 0x0026, 0x2200, 0x0801, 0x002e,
+	0x001e, 0x8108, 0x1f04, 0x5362, 0x015e, 0x012e, 0x0005, 0x2001,
+	0x1854, 0x2004, 0x0005, 0x2001, 0x1873, 0x2004, 0x0005, 0x0006,
+	0x2001, 0x1810, 0x2004, 0xd0d4, 0x000e, 0x0005, 0x2001, 0x180e,
+	0x2004, 0xd0b4, 0x0005, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003,
+	0x0005, 0x0016, 0x00e6, 0x2071, 0x1894, 0x7108, 0x910d, 0x710a,
+	0x00ee, 0x001e, 0x0005, 0x79a4, 0x9182, 0x0081, 0x1a04, 0x3365,
+	0x810c, 0x0016, 0x080c, 0x4872, 0x080c, 0x0ef3, 0x2100, 0x2238,
+	0x7d84, 0x7c88, 0x7b8c, 0x7a90, 0x001e, 0x080c, 0x48bb, 0x701f,
+	0x53ba, 0x0005, 0x2079, 0x0000, 0x7d94, 0x7c98, 0x7ba8, 0x7aac,
+	0x79a4, 0x810c, 0x2061, 0x18ae, 0x2c44, 0xa770, 0xa074, 0x2071,
+	0x1894, 0x080c, 0x48be, 0x701f, 0x53ce, 0x0005, 0x2061, 0x18ae,
+	0x2c44, 0x0016, 0x0026, 0xa270, 0xa174, 0x080c, 0x0efb, 0x002e,
+	0x001e, 0x080c, 0x0fa8, 0x9006, 0xa802, 0xa806, 0x0804, 0x3330,
+	0x0126, 0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6,
+	0x00e6, 0x00f6, 0x2061, 0x0100, 0x2069, 0x0200, 0x2071, 0x1800,
+	0x6044, 0xd0a4, 0x11e8, 0xd084, 0x0118, 0x080c, 0x5589, 0x0068,
+	0xd08c, 0x0118, 0x080c, 0x5492, 0x0040, 0xd094, 0x0118, 0x080c,
+	0x5462, 0x0018, 0xd09c, 0x0108, 0x0099, 0x00fe, 0x00ee, 0x00de,
+	0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x012e, 0x0005,
+	0x0016, 0x6128, 0xd19c, 0x1110, 0xc19d, 0x612a, 0x001e, 0x0c68,
+	0x0006, 0x7094, 0x9005, 0x000e, 0x0120, 0x7097, 0x0000, 0x708f,
+	0x0000, 0x624c, 0x9286, 0xf0f0, 0x1150, 0x6048, 0x9086, 0xf0f0,
+	0x0130, 0x624a, 0x6043, 0x0090, 0x6043, 0x0010, 0x0490, 0x9294,
+	0xff00, 0x9296, 0xf700, 0x0178, 0x7138, 0xd1a4, 0x1160, 0x6240,
+	0x9295, 0x0100, 0x6242, 0x9294, 0x0010, 0x0128, 0x2009, 0x00f7,
+	0x080c, 0x5c46, 0x00f0, 0x6040, 0x9084, 0x0010, 0x9085, 0x0140,
+	0x6042, 0x6043, 0x0000, 0x7083, 0x0000, 0x709f, 0x0001, 0x70c3,
+	0x0000, 0x70db, 0x0000, 0x2009, 0x1c80, 0x200b, 0x0000, 0x7093,
+	0x0000, 0x7087, 0x000f, 0x2009, 0x000f, 0x2011, 0x5b2c, 0x080c,
+	0x80a2, 0x0005, 0x2001, 0x1875, 0x2004, 0xd08c, 0x0110, 0x705b,
+	0xffff, 0x7084, 0x9005, 0x1528, 0x2011, 0x5b2c, 0x080c, 0x8010,
+	0x6040, 0x9094, 0x0010, 0x9285, 0x0020, 0x6042, 0x20a9, 0x00c8,
+	0x6044, 0xd08c, 0x1168, 0x1f04, 0x5478, 0x6242, 0x7097, 0x0000,
+	0x6040, 0x9094, 0x0010, 0x9285, 0x0080, 0x6042, 0x6242, 0x0048,
+	0x6242, 0x7097, 0x0000, 0x708b, 0x0000, 0x9006, 0x080c, 0x5ccf,
+	0x0000, 0x0005, 0x7088, 0x908a, 0x0003, 0x1a0c, 0x0db4, 0x000b,
+	0x0005, 0x549c, 0x54ed, 0x5588, 0x00f6, 0x0016, 0x6900, 0x918c,
+	0x0800, 0x708b, 0x0001, 0x2001, 0x015d, 0x2003, 0x0000, 0x6803,
+	0x00fc, 0x20a9, 0x0004, 0x6800, 0x9084, 0x00fc, 0x0120, 0x1f04,
+	0x54ab, 0x080c, 0x0db4, 0x68a0, 0x68a2, 0x689c, 0x689e, 0x6898,
+	0x689a, 0xa001, 0x918d, 0x1600, 0x6902, 0x001e, 0x6837, 0x0020,
+	0x080c, 0x5cab, 0x2079, 0x1c00, 0x7833, 0x1101, 0x7837, 0x0000,
+	0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0001, 0x20a1, 0x1c0e,
+	0x20a9, 0x0004, 0x4003, 0x080c, 0x9c26, 0x20e1, 0x0001, 0x2099,
+	0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003,
+	0x60c3, 0x000c, 0x600f, 0x0000, 0x080c, 0x5b5d, 0x00fe, 0x9006,
+	0x708e, 0x6043, 0x0008, 0x6042, 0x0005, 0x00f6, 0x708c, 0x708f,
+	0x0000, 0x9025, 0x0904, 0x5565, 0x6020, 0xd0b4, 0x1904, 0x5563,
+	0x719c, 0x81ff, 0x0904, 0x5551, 0x9486, 0x000c, 0x1904, 0x555e,
+	0x9480, 0x0018, 0x8004, 0x20a8, 0x080c, 0x5ca4, 0x2011, 0x0260,
+	0x2019, 0x1c00, 0x220c, 0x2304, 0x9106, 0x11e8, 0x8210, 0x8318,
+	0x1f04, 0x550a, 0x6043, 0x0004, 0x2061, 0x0140, 0x605b, 0xbc94,
+	0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0006, 0x708b, 0x0002,
+	0x7097, 0x0002, 0x2009, 0x07d0, 0x2011, 0x5b33, 0x080c, 0x80a2,
+	0x080c, 0x5cab, 0x04c0, 0x080c, 0x5ca4, 0x2079, 0x0260, 0x7930,
+	0x918e, 0x1101, 0x1558, 0x7834, 0x9005, 0x1540, 0x7900, 0x918c,
+	0x00ff, 0x1118, 0x7804, 0x9005, 0x0190, 0x080c, 0x5ca4, 0x2011,
+	0x026e, 0x2019, 0x1805, 0x20a9, 0x0004, 0x220c, 0x2304, 0x9102,
+	0x0230, 0x11a0, 0x8210, 0x8318, 0x1f04, 0x5545, 0x0078, 0x709f,
+	0x0000, 0x080c, 0x5ca4, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9,
+	0x0001, 0x20a1, 0x1c00, 0x20a9, 0x0014, 0x4003, 0x6043, 0x0008,
+	0x6043, 0x0000, 0x0010, 0x00fe, 0x0005, 0x6040, 0x9085, 0x0100,
+	0x6042, 0x6020, 0xd0b4, 0x1db8, 0x080c, 0x9c26, 0x20e1, 0x0001,
+	0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014,
+	0x4003, 0x60c3, 0x000c, 0x2011, 0x19c2, 0x2013, 0x0000, 0x708f,
+	0x0000, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x938a, 0x08d8,
+	0x0005, 0x7094, 0x908a, 0x001d, 0x1a0c, 0x0db4, 0x000b, 0x0005,
+	0x55ba, 0x55cd, 0x55f6, 0x5616, 0x563c, 0x566b, 0x5691, 0x56c9,
+	0x56ef, 0x571d, 0x5758, 0x5790, 0x57ae, 0x57d9, 0x57fb, 0x5816,
+	0x5820, 0x5854, 0x587a, 0x58a9, 0x58cf, 0x5907, 0x594b, 0x5988,
+	0x59a9, 0x5a02, 0x5a24, 0x5a52, 0x5a52, 0x00c6, 0x2061, 0x1800,
+	0x6003, 0x0007, 0x2061, 0x0100, 0x6004, 0x9084, 0xfff9, 0x6006,
+	0x00ce, 0x0005, 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0,
+	0x2061, 0x0100, 0x6043, 0x0002, 0x7097, 0x0001, 0x2009, 0x07d0,
+	0x2011, 0x5b33, 0x080c, 0x80a2, 0x0005, 0x00f6, 0x708c, 0x9086,
+	0x0014, 0x1510, 0x6042, 0x6020, 0xd0b4, 0x11f0, 0x080c, 0x5ca4,
+	0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, 0x11a0, 0x7834, 0x9005,
+	0x1188, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3,
+	0x0001, 0x2011, 0x5b33, 0x080c, 0x8010, 0x7097, 0x0010, 0x080c,
+	0x5820, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7097,
+	0x0003, 0x6043, 0x0004, 0x2011, 0x5b33, 0x080c, 0x8010, 0x080c,
+	0x5c28, 0x2079, 0x0240, 0x7833, 0x1102, 0x7837, 0x0000, 0x20a9,
+	0x0008, 0x9f88, 0x000e, 0x200b, 0x0000, 0x8108, 0x1f04, 0x560b,
+	0x60c3, 0x0014, 0x080c, 0x5b5d, 0x00fe, 0x0005, 0x00f6, 0x708c,
+	0x9005, 0x0500, 0x2011, 0x5b33, 0x080c, 0x8010, 0x9086, 0x0014,
+	0x11b8, 0x080c, 0x5ca4, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102,
 	0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0,
-	0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x0012, 0x0029, 0x0010,
-	0x708f, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0013, 0x080c,
-	0x5a00, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, 0x0000, 0x080c,
-	0x5a6e, 0x080c, 0x5a51, 0x1170, 0x7080, 0x9005, 0x1158, 0x7158,
-	0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, 0x58aa, 0x0168,
-	0x080c, 0x5a27, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e,
+	0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x0004, 0x0029, 0x0010,
+	0x080c, 0x5c80, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0005, 0x080c,
+	0x5c28, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, 0x0000, 0x080c,
+	0x5ca4, 0x080c, 0x5c87, 0x1170, 0x7080, 0x9005, 0x1158, 0x7158,
+	0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, 0x5ae0, 0x0168,
+	0x080c, 0x5c5d, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e,
 	0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c,
-	0x5927, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011,
-	0x58fd, 0x080c, 0x7d56, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5a6e,
-	0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, 0x9005,
+	0x5b5d, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011,
+	0x5b33, 0x080c, 0x8010, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5ca4,
+	0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178, 0x7834, 0x9005,
 	0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3,
-	0x0001, 0x7097, 0x0014, 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe,
-	0x0005, 0x00f6, 0x7097, 0x0015, 0x080c, 0x5a00, 0x2079, 0x0240,
-	0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x5a6e, 0x080c, 0x5a51,
+	0x0001, 0x7097, 0x0006, 0x0029, 0x0010, 0x080c, 0x5c80, 0x00fe,
+	0x0005, 0x00f6, 0x7097, 0x0007, 0x080c, 0x5c28, 0x2079, 0x0240,
+	0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x5ca4, 0x080c, 0x5c87,
 	0x11b8, 0x7080, 0x9005, 0x11a0, 0x7160, 0x9186, 0xffff, 0x0180,
-	0x9180, 0x2fd9, 0x200d, 0x918c, 0xff00, 0x810f, 0x2011, 0x0008,
-	0x080c, 0x58aa, 0x0180, 0x080c, 0x4a74, 0x0110, 0x080c, 0x2574,
+	0x9180, 0x3131, 0x200d, 0x918c, 0xff00, 0x810f, 0x2011, 0x0008,
+	0x080c, 0x5ae0, 0x0180, 0x080c, 0x4c91, 0x0110, 0x080c, 0x26cc,
 	0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000,
-	0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5927, 0x00fe,
-	0x0005, 0x00f6, 0x708c, 0x9005, 0x05f0, 0x2011, 0x58fd, 0x080c,
-	0x7d56, 0x9086, 0x0014, 0x15a8, 0x080c, 0x5a6e, 0x2079, 0x0260,
-	0x7a30, 0x9296, 0x1105, 0x1568, 0x7834, 0x9084, 0x0100, 0x2011,
-	0x0100, 0x921e, 0x1168, 0x9085, 0x0001, 0x080c, 0x5a99, 0x7a38,
-	0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x0080,
-	0x9005, 0x11b8, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110,
-	0x70c3, 0x0001, 0x9085, 0x0001, 0x080c, 0x5a99, 0x7093, 0x0000,
-	0x7a38, 0xd2f4, 0x0110, 0x70db, 0x0008, 0x7097, 0x0016, 0x0029,
-	0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, 0x080c, 0x98d5, 0x080c,
-	0x5a6e, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1,
-	0x0240, 0x20a9, 0x000e, 0x4003, 0x2011, 0x026d, 0x2204, 0x9084,
-	0x0100, 0x2011, 0x024d, 0x2012, 0x2011, 0x026e, 0x7097, 0x0017,
-	0x080c, 0x5a51, 0x1150, 0x7080, 0x9005, 0x1138, 0x080c, 0x581d,
-	0x1188, 0x9085, 0x0001, 0x080c, 0x2574, 0x20a9, 0x0008, 0x080c,
-	0x5a6e, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1,
-	0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5927, 0x0010, 0x080c,
-	0x5377, 0x0005, 0x00f6, 0x708c, 0x9005, 0x01d8, 0x2011, 0x58fd,
-	0x080c, 0x7d56, 0x9086, 0x0084, 0x1190, 0x080c, 0x5a6e, 0x2079,
-	0x0260, 0x7a30, 0x9296, 0x1106, 0x1150, 0x7834, 0x9005, 0x1138,
-	0x9006, 0x080c, 0x5a99, 0x7097, 0x0018, 0x0029, 0x0010, 0x708f,
-	0x0000, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0019, 0x080c, 0x5a00,
-	0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, 0x5a6e,
-	0x2009, 0x026e, 0x2039, 0x1c0e, 0x20a9, 0x0040, 0x213e, 0x8738,
-	0x8108, 0x9186, 0x0280, 0x1128, 0x6814, 0x8000, 0x6816, 0x2009,
-	0x0260, 0x1f04, 0x5786, 0x2039, 0x1c0e, 0x080c, 0x5a51, 0x11e8,
-	0x2728, 0x2514, 0x8207, 0x9084, 0x00ff, 0x8000, 0x2018, 0x9294,
-	0x00ff, 0x8007, 0x9205, 0x202a, 0x705c, 0x2310, 0x8214, 0x92a0,
-	0x1c0e, 0x2414, 0x938c, 0x0001, 0x0118, 0x9294, 0xff00, 0x0018,
-	0x9294, 0x00ff, 0x8007, 0x9215, 0x2222, 0x20a9, 0x0040, 0x2009,
-	0x024e, 0x270e, 0x8738, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810,
-	0x8000, 0x6812, 0x2009, 0x0240, 0x1f04, 0x57b9, 0x60c3, 0x0084,
-	0x080c, 0x5927, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x01e0,
-	0x2011, 0x58fd, 0x080c, 0x7d56, 0x9086, 0x0084, 0x1198, 0x080c,
-	0x5a6e, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834,
-	0x9005, 0x1140, 0x7093, 0x0001, 0x080c, 0x59c4, 0x7097, 0x001a,
-	0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, 0x9085, 0x0001,
-	0x080c, 0x5a99, 0x7097, 0x001b, 0x080c, 0x98d5, 0x080c, 0x5a6e,
-	0x2011, 0x0260, 0x2009, 0x0240, 0x748c, 0x9480, 0x0018, 0x9080,
-	0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, 0x220e, 0x8210, 0x8108,
-	0x9186, 0x0260, 0x1150, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240,
-	0x6814, 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, 0x5805, 0x60c3,
-	0x0084, 0x080c, 0x5927, 0x0005, 0x0005, 0x0086, 0x0096, 0x2029,
-	0x1854, 0x252c, 0x20a9, 0x0008, 0x2041, 0x1c0e, 0x20e9, 0x0001,
-	0x28a0, 0x080c, 0x5a6e, 0x20e1, 0x0000, 0x2099, 0x026e, 0x4003,
-	0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0108, 0x9016, 0x2800,
-	0x9200, 0x200c, 0x91a6, 0xffff, 0x1148, 0xd5d4, 0x0110, 0x8210,
-	0x0008, 0x8211, 0x1f04, 0x5837, 0x0804, 0x58a6, 0x82ff, 0x1160,
-	0xd5d4, 0x0120, 0x91a6, 0x3fff, 0x0d90, 0x0020, 0x91a6, 0x3fff,
-	0x0904, 0x58a6, 0x918d, 0xc000, 0x20a9, 0x0010, 0x2019, 0x0001,
-	0xd5d4, 0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4, 0x0110, 0x8423,
-	0x0008, 0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319, 0x0008, 0x8318,
-	0x1f04, 0x585d, 0x04d8, 0x23a8, 0x2021, 0x0001, 0x8426, 0x8425,
-	0x1f04, 0x586f, 0x2328, 0x8529, 0x92be, 0x0007, 0x0158, 0x0006,
-	0x2039, 0x0007, 0x2200, 0x973a, 0x000e, 0x27a8, 0x95a8, 0x0010,
-	0x1f04, 0x587e, 0x755a, 0x95c8, 0x2fd9, 0x292d, 0x95ac, 0x00ff,
-	0x757e, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x2554, 0x001e,
-	0x60e7, 0x0000, 0x65ea, 0x2018, 0x2304, 0x9405, 0x201a, 0x7083,
-	0x0001, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x20e1, 0x0001, 0x2898,
-	0x20a9, 0x0008, 0x4003, 0x9085, 0x0001, 0x0008, 0x9006, 0x009e,
-	0x008e, 0x0005, 0x0156, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x22a8,
-	0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x2011, 0x024e,
-	0x22a0, 0x4003, 0x014e, 0x013e, 0x01de, 0x01ce, 0x015e, 0x2118,
-	0x9026, 0x2001, 0x0007, 0x939a, 0x0010, 0x0218, 0x8420, 0x8001,
-	0x0cd0, 0x2118, 0x84ff, 0x0120, 0x939a, 0x0010, 0x8421, 0x1de0,
-	0x2021, 0x0001, 0x83ff, 0x0118, 0x8423, 0x8319, 0x1de8, 0x9238,
-	0x2029, 0x026e, 0x9528, 0x2504, 0x942c, 0x11b8, 0x9405, 0x203a,
-	0x715a, 0x91a0, 0x2fd9, 0x242d, 0x95ac, 0x00ff, 0x757e, 0x6532,
-	0x6536, 0x0016, 0x2508, 0x080c, 0x2554, 0x001e, 0x60e7, 0x0000,
-	0x65ea, 0x7083, 0x0001, 0x9084, 0x0000, 0x0005, 0x00e6, 0x2071,
-	0x1800, 0x7087, 0x0000, 0x00ee, 0x0005, 0x00e6, 0x00f6, 0x2079,
-	0x0100, 0x2071, 0x0140, 0x080c, 0x59b3, 0x080c, 0x90c1, 0x7004,
-	0x9084, 0x4000, 0x0110, 0x080c, 0x29cc, 0x0126, 0x2091, 0x8000,
-	0x2071, 0x1825, 0x2073, 0x0000, 0x7840, 0x0026, 0x0016, 0x2009,
-	0x00f7, 0x080c, 0x5a10, 0x001e, 0x9094, 0x0010, 0x9285, 0x0080,
-	0x7842, 0x7a42, 0x002e, 0x012e, 0x00fe, 0x00ee, 0x0005, 0x0126,
-	0x2091, 0x8000, 0x080c, 0x2872, 0x0228, 0x2011, 0x0101, 0x2204,
-	0xc0c5, 0x2012, 0x2011, 0x19c0, 0x2013, 0x0000, 0x708f, 0x0000,
-	0x012e, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x90b8, 0x6144,
-	0xd184, 0x0120, 0x7194, 0x918d, 0x2000, 0x0018, 0x7188, 0x918d,
-	0x1000, 0x2011, 0x1968, 0x2112, 0x2009, 0x07d0, 0x2011, 0x58fd,
-	0x080c, 0x7de5, 0x0005, 0x0016, 0x0026, 0x00c6, 0x0126, 0x2091,
-	0x8000, 0x080c, 0x9a4e, 0x2009, 0x00f7, 0x080c, 0x5a10, 0x2061,
-	0x19c9, 0x900e, 0x611a, 0x611e, 0x6172, 0x6176, 0x2061, 0x1800,
-	0x6003, 0x0001, 0x2061, 0x0100, 0x6043, 0x0090, 0x6043, 0x0010,
-	0x2009, 0x1968, 0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x597f,
-	0x080c, 0x7d4a, 0x012e, 0x00ce, 0x002e, 0x001e, 0x0005, 0x00e6,
-	0x0006, 0x0126, 0x2091, 0x8000, 0x0471, 0x2071, 0x0100, 0x080c,
-	0x90c1, 0x2071, 0x0140, 0x7004, 0x9084, 0x4000, 0x0110, 0x080c,
-	0x29cc, 0x080c, 0x6d1c, 0x0188, 0x080c, 0x6d37, 0x1170, 0x080c,
-	0x7002, 0x0016, 0x080c, 0x2623, 0x2001, 0x193e, 0x2102, 0x001e,
-	0x080c, 0x6ffd, 0x080c, 0x6c46, 0x0050, 0x2009, 0x0001, 0x080c,
-	0x290b, 0x2001, 0x0001, 0x080c, 0x24b4, 0x080c, 0x5953, 0x012e,
-	0x000e, 0x00ee, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0bc, 0x0158,
-	0x0026, 0x0036, 0x2011, 0x8017, 0x2001, 0x1968, 0x201c, 0x080c,
-	0x46b9, 0x003e, 0x002e, 0x0005, 0x20a9, 0x0012, 0x20e9, 0x0001,
-	0x20a1, 0x1c80, 0x080c, 0x5a6e, 0x20e9, 0x0000, 0x2099, 0x026e,
-	0x0099, 0x20a9, 0x0020, 0x080c, 0x5a68, 0x2099, 0x0260, 0x20a1,
-	0x1c92, 0x0051, 0x20a9, 0x000e, 0x080c, 0x5a6b, 0x2099, 0x0260,
-	0x20a1, 0x1cb2, 0x0009, 0x0005, 0x0016, 0x0026, 0x3410, 0x3308,
-	0x2104, 0x8007, 0x2012, 0x8108, 0x8210, 0x1f04, 0x59e8, 0x002e,
-	0x001e, 0x0005, 0x080c, 0x98d5, 0x20e1, 0x0001, 0x2099, 0x1c00,
-	0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005,
-	0x080c, 0x98d5, 0x080c, 0x5a6e, 0x20e1, 0x0000, 0x2099, 0x0260,
-	0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005,
-	0x00c6, 0x0006, 0x2061, 0x0100, 0x810f, 0x2001, 0x1833, 0x2004,
-	0x9005, 0x1138, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x9105,
-	0x0010, 0x9185, 0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005, 0x0016,
-	0x0046, 0x080c, 0x6311, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a,
-	0x080c, 0xd188, 0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019,
-	0x002a, 0x900e, 0x080c, 0x2e4a, 0x080c, 0xbe86, 0x0140, 0x0036,
-	0x2019, 0xffff, 0x2021, 0x0007, 0x080c, 0x4856, 0x003e, 0x004e,
-	0x001e, 0x0005, 0x080c, 0x5953, 0x7097, 0x0000, 0x708f, 0x0000,
-	0x0005, 0x0006, 0x2001, 0x180c, 0x2004, 0xd09c, 0x0100, 0x000e,
-	0x0005, 0x0006, 0x0016, 0x0126, 0x2091, 0x8000, 0x2001, 0x0101,
-	0x200c, 0x918d, 0x0006, 0x2102, 0x012e, 0x001e, 0x000e, 0x0005,
-	0x2009, 0x0001, 0x0020, 0x2009, 0x0002, 0x0008, 0x900e, 0x6814,
-	0x9084, 0xffc0, 0x910d, 0x6916, 0x0005, 0x00f6, 0x0156, 0x0146,
-	0x01d6, 0x9006, 0x20a9, 0x0080, 0x20e9, 0x0001, 0x20a1, 0x1c00,
-	0x4004, 0x2079, 0x1c00, 0x7803, 0x2200, 0x7807, 0x00ef, 0x780f,
-	0x00ef, 0x7813, 0x0138, 0x7823, 0xffff, 0x7827, 0xffff, 0x01de,
-	0x014e, 0x015e, 0x00fe, 0x0005, 0x2001, 0x1800, 0x2003, 0x0001,
-	0x0005, 0x2001, 0x1975, 0x0118, 0x2003, 0x0001, 0x0010, 0x2003,
-	0x0000, 0x0005, 0x0156, 0x20a9, 0x0800, 0x2009, 0x1000, 0x9006,
-	0x200a, 0x8108, 0x1f04, 0x5aa8, 0x015e, 0x0005, 0x00d6, 0x0036,
-	0x0156, 0x0136, 0x0146, 0x2069, 0x1853, 0x9006, 0xb802, 0xb8be,
-	0xb807, 0x0707, 0xb80a, 0xb80e, 0xb812, 0x9198, 0x2fd9, 0x231d,
-	0x939c, 0x00ff, 0xbb16, 0x0016, 0x0026, 0xb8b2, 0x080c, 0x9a47,
-	0x1120, 0x9192, 0x007e, 0x1208, 0xbbb2, 0x20a9, 0x0004, 0xb8b4,
-	0x20e8, 0xb9b8, 0x9198, 0x0006, 0x9006, 0x23a0, 0x4004, 0x20a9,
-	0x0004, 0x9198, 0x000a, 0x23a0, 0x4004, 0x002e, 0x001e, 0xb83e,
-	0xb842, 0xb84e, 0xb852, 0xb856, 0xb85a, 0xb85e, 0xb862, 0xb866,
-	0xb86a, 0xb86f, 0x0100, 0xb872, 0xb876, 0xb87a, 0xb88a, 0xb88e,
-	0xb893, 0x0008, 0xb896, 0xb89a, 0xb89e, 0xb8ae, 0xb9a2, 0x0096,
-	0xb8a4, 0x904d, 0x0110, 0x080c, 0x101e, 0xb8a7, 0x0000, 0x009e,
-	0x9006, 0xb84a, 0x6810, 0xb83a, 0x680c, 0xb846, 0x6814, 0x9084,
-	0x00ff, 0xb842, 0x014e, 0x013e, 0x015e, 0x003e, 0x00de, 0x0005,
-	0x0126, 0x2091, 0x8000, 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082,
-	0x4000, 0x1a04, 0x5b7e, 0x9182, 0x0800, 0x1a04, 0x5b82, 0x2001,
-	0x180c, 0x2004, 0x9084, 0x0003, 0x1904, 0x5b88, 0x9188, 0x1000,
-	0x2104, 0x905d, 0x0518, 0xb804, 0x9084, 0x00ff, 0x908e, 0x0006,
-	0x1508, 0xb8a4, 0x900d, 0x1904, 0x5b9a, 0xb850, 0x900d, 0x1148,
-	0xa802, 0x2900, 0xb852, 0xb84e, 0x080c, 0x8129, 0x9006, 0x012e,
-	0x0005, 0x00a6, 0x2150, 0x2900, 0xb002, 0xa803, 0x0000, 0x00ae,
-	0xb852, 0x0c90, 0x2001, 0x0005, 0x900e, 0x04b8, 0x2001, 0x0028,
-	0x900e, 0x0498, 0x9082, 0x0006, 0x1290, 0x080c, 0x9a47, 0x1160,
-	0xb8a0, 0x9084, 0xff80, 0x1140, 0xb900, 0xd1fc, 0x0990, 0x2001,
-	0x0029, 0x2009, 0x1000, 0x0408, 0x2001, 0x0028, 0x00a8, 0x2009,
-	0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0068, 0xd184,
-	0x0118, 0x2001, 0x0004, 0x0040, 0x2001, 0x0029, 0xb900, 0xd1fc,
-	0x0118, 0x2009, 0x1000, 0x0048, 0x900e, 0x0038, 0x2001, 0x0029,
-	0x900e, 0x0018, 0x2001, 0x0029, 0x900e, 0x9005, 0x012e, 0x0005,
-	0x2001, 0x180c, 0x2004, 0xd084, 0x19d0, 0x9188, 0x1000, 0x2104,
-	0x905d, 0x09a8, 0x080c, 0x6315, 0x1990, 0xb800, 0xd0bc, 0x0978,
-	0x0804, 0x5b31, 0x080c, 0x618d, 0x0904, 0x5b4a, 0x0804, 0x5b35,
-	0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0xa974, 0x9182, 0x0800,
-	0x1a04, 0x5c1b, 0x9188, 0x1000, 0x2104, 0x905d, 0x0904, 0x5bf3,
-	0xb8a0, 0x9086, 0x007f, 0x0178, 0x080c, 0x631d, 0x0160, 0xa994,
-	0x81ff, 0x0130, 0x908e, 0x0004, 0x0130, 0x908e, 0x0005, 0x0118,
-	0x080c, 0x6315, 0x1598, 0xa87c, 0xd0fc, 0x01e0, 0xa894, 0x9005,
-	0x01c8, 0x2060, 0x0026, 0x2010, 0x080c, 0xb781, 0x002e, 0x1120,
-	0x2001, 0x0008, 0x0804, 0x5c1d, 0x6020, 0x9086, 0x000a, 0x0120,
-	0x2001, 0x0008, 0x0804, 0x5c1d, 0x601a, 0x6003, 0x0008, 0x2900,
-	0x6016, 0x0058, 0x080c, 0x9a72, 0x05e8, 0x2b00, 0x6012, 0x2900,
-	0x6016, 0x600b, 0xffff, 0x6023, 0x000a, 0x2009, 0x0003, 0x080c,
-	0x9b42, 0x9006, 0x0458, 0x2001, 0x0028, 0x0438, 0x9082, 0x0006,
-	0x1290, 0x080c, 0x9a47, 0x1160, 0xb8a0, 0x9084, 0xff80, 0x1140,
-	0xb900, 0xd1fc, 0x0900, 0x2001, 0x0029, 0x2009, 0x1000, 0x00a8,
-	0x2001, 0x0028, 0x0090, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118,
-	0x2001, 0x0004, 0x0050, 0xd184, 0x0118, 0x2001, 0x0004, 0x0028,
-	0x2001, 0x0029, 0x0010, 0x2001, 0x0029, 0x9005, 0x012e, 0x00ee,
-	0x00be, 0x0005, 0x2001, 0x002c, 0x0cc0, 0x00f6, 0x00b6, 0x0126,
-	0x2091, 0x8000, 0xa8e0, 0x9005, 0x1550, 0xa8dc, 0x9082, 0x0101,
-	0x1630, 0xa8c8, 0x9005, 0x1518, 0xa8c4, 0x9082, 0x0101, 0x12f8,
-	0xa974, 0x2079, 0x1800, 0x9182, 0x0800, 0x12e8, 0x7830, 0x9084,
-	0x0003, 0x1130, 0xaa98, 0xab94, 0xa878, 0x9084, 0x0007, 0x00ea,
-	0x7930, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118,
-	0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x900e, 0x0038, 0x2001,
-	0x002c, 0x900e, 0x0018, 0x2001, 0x0029, 0x900e, 0x9006, 0x0008,
-	0x9005, 0x012e, 0x00be, 0x00fe, 0x0005, 0x5cb2, 0x5c6d, 0x5c84,
-	0x5cb2, 0x5cb2, 0x5cb2, 0x5cb2, 0x5cb2, 0x2100, 0x9082, 0x007e,
-	0x1278, 0x080c, 0x5f91, 0x0148, 0x9046, 0xb810, 0x9306, 0x1904,
-	0x5cba, 0xb814, 0x9206, 0x15f0, 0x0028, 0xbb12, 0xba16, 0x0010,
-	0x080c, 0x4573, 0x0150, 0x04b0, 0x080c, 0x5ff1, 0x1598, 0xb810,
-	0x9306, 0x1580, 0xb814, 0x9206, 0x1568, 0x080c, 0x9a72, 0x0530,
-	0x2b00, 0x6012, 0x080c, 0xbc01, 0x2900, 0x6016, 0x600b, 0xffff,
-	0x6023, 0x000a, 0xa878, 0x9086, 0x0001, 0x1170, 0x080c, 0x2e7f,
-	0x9006, 0x080c, 0x5f2e, 0x2001, 0x0002, 0x080c, 0x5f42, 0x2001,
-	0x0200, 0xb86e, 0xb893, 0x0002, 0x2009, 0x0003, 0x080c, 0x9b42,
-	0x9006, 0x0068, 0x2001, 0x0001, 0x900e, 0x0038, 0x2001, 0x002c,
-	0x900e, 0x0018, 0x2001, 0x0028, 0x900e, 0x9005, 0x0000, 0x012e,
-	0x00be, 0x00fe, 0x0005, 0x00b6, 0x00f6, 0x00e6, 0x0126, 0x2091,
-	0x8000, 0xa894, 0x90c6, 0x0015, 0x0904, 0x5e87, 0x90c6, 0x0056,
-	0x0904, 0x5e8b, 0x90c6, 0x0066, 0x0904, 0x5e8f, 0x90c6, 0x0071,
-	0x0904, 0x5e93, 0x90c6, 0x0074, 0x0904, 0x5e97, 0x90c6, 0x007c,
-	0x0904, 0x5e9b, 0x90c6, 0x007e, 0x0904, 0x5e9f, 0x90c6, 0x0037,
-	0x0904, 0x5ea3, 0x9016, 0x2079, 0x1800, 0xa974, 0x9186, 0x00ff,
-	0x0904, 0x5e82, 0x9182, 0x0800, 0x1a04, 0x5e82, 0x080c, 0x5ff1,
-	0x1198, 0xb804, 0x9084, 0x00ff, 0x9082, 0x0006, 0x1268, 0xa894,
-	0x90c6, 0x006f, 0x0148, 0x080c, 0x9a47, 0x1904, 0x5e6b, 0xb8a0,
-	0x9084, 0xff80, 0x1904, 0x5e6b, 0xa894, 0x90c6, 0x006f, 0x0158,
-	0x90c6, 0x005e, 0x0904, 0x5dcb, 0x90c6, 0x0064, 0x0904, 0x5df4,
-	0x2008, 0x0804, 0x5d8e, 0xa998, 0xa8b0, 0x2040, 0x080c, 0x9a47,
-	0x1120, 0x9182, 0x007f, 0x0a04, 0x5d8e, 0x9186, 0x00ff, 0x0904,
-	0x5d8e, 0x9182, 0x0800, 0x1a04, 0x5d8e, 0xaaa0, 0xab9c, 0x7878,
-	0x9306, 0x1188, 0x787c, 0x0096, 0x924e, 0x1128, 0x2208, 0x2310,
-	0x009e, 0x0804, 0x5d8e, 0x99cc, 0xff00, 0x009e, 0x1120, 0x2208,
-	0x2310, 0x0804, 0x5d8e, 0x080c, 0x4573, 0x0904, 0x5d97, 0x900e,
-	0x9016, 0x90c6, 0x4000, 0x1558, 0x0006, 0x080c, 0x6211, 0x1108,
-	0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x20a9, 0x0004, 0xa860,
-	0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8,
-	0x9080, 0x0006, 0x2098, 0x080c, 0x0f69, 0x20a9, 0x0004, 0xa860,
-	0x20e8, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8,
-	0x9080, 0x000a, 0x2098, 0x080c, 0x0f69, 0x000e, 0x00c8, 0x90c6,
-	0x4007, 0x1110, 0x2408, 0x00a0, 0x90c6, 0x4008, 0x1118, 0x2708,
-	0x2610, 0x0070, 0x90c6, 0x4009, 0x1108, 0x0050, 0x90c6, 0x4006,
-	0x0138, 0x2001, 0x4005, 0x2009, 0x000a, 0x0010, 0x2001, 0x4006,
-	0xa896, 0xa99a, 0xaa9e, 0x2001, 0x0030, 0x900e, 0x0470, 0x080c,
-	0x9a72, 0x1130, 0x2001, 0x4005, 0x2009, 0x0003, 0x9016, 0x0c80,
-	0x2b00, 0x6012, 0x080c, 0xbc01, 0x2900, 0x6016, 0x6023, 0x0001,
-	0xa868, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x2e7f, 0x012e, 0x9006, 0x080c, 0x5f2e, 0x2001, 0x0002,
-	0x080c, 0x5f42, 0x2009, 0x0002, 0x080c, 0x9b42, 0xa8b0, 0xd094,
-	0x0118, 0xb8bc, 0xc08d, 0xb8be, 0x9006, 0x9005, 0x012e, 0x00ee,
-	0x00fe, 0x00be, 0x0005, 0x080c, 0x5167, 0x0118, 0x2009, 0x0007,
-	0x00f8, 0xa998, 0xaeb0, 0x080c, 0x5ff1, 0x1904, 0x5d89, 0x9186,
-	0x007f, 0x0130, 0x080c, 0x6315, 0x0118, 0x2009, 0x0009, 0x0080,
-	0x0096, 0x080c, 0x0fec, 0x1120, 0x009e, 0x2009, 0x0002, 0x0040,
-	0x2900, 0x009e, 0xa806, 0x080c, 0xb972, 0x19b0, 0x2009, 0x0003,
-	0x2001, 0x4005, 0x0804, 0x5d90, 0xa998, 0xaeb0, 0x080c, 0x5ff1,
-	0x1904, 0x5d89, 0x0096, 0x080c, 0x0fec, 0x1128, 0x009e, 0x2009,
-	0x0002, 0x0804, 0x5e48, 0x2900, 0x009e, 0xa806, 0x0096, 0x2048,
-	0x20a9, 0x002b, 0xb8b4, 0x20e0, 0xb8b8, 0x2098, 0xa860, 0x20e8,
-	0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080,
-	0x0006, 0x20a0, 0xbbb8, 0x9398, 0x0006, 0x2398, 0x080c, 0x0f69,
-	0x009e, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0xd684,
-	0x1168, 0x080c, 0x5153, 0xd0b4, 0x1118, 0xa89b, 0x000b, 0x00e0,
-	0xb800, 0xd08c, 0x0118, 0xa89b, 0x000c, 0x00b0, 0x080c, 0x6315,
-	0x0118, 0xa89b, 0x0009, 0x0080, 0x080c, 0x5167, 0x0118, 0xa89b,
-	0x0007, 0x0050, 0x080c, 0xb955, 0x1904, 0x5dc4, 0x2009, 0x0003,
-	0x2001, 0x4005, 0x0804, 0x5d90, 0xa87b, 0x0030, 0xa897, 0x4005,
-	0xa804, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0,
-	0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4,
-	0x2031, 0x0000, 0x2041, 0x1226, 0x080c, 0x9fca, 0x1904, 0x5dc4,
-	0x2009, 0x0002, 0x08e8, 0x2001, 0x0028, 0x900e, 0x0804, 0x5dc5,
-	0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038,
-	0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x900e,
-	0x0804, 0x5dc5, 0x2001, 0x0029, 0x900e, 0x0804, 0x5dc5, 0x080c,
-	0x33fd, 0x0804, 0x5dc6, 0x080c, 0x4e90, 0x0804, 0x5dc6, 0x080c,
-	0x41cd, 0x0804, 0x5dc6, 0x080c, 0x462f, 0x0804, 0x5dc6, 0x080c,
-	0x48d7, 0x0804, 0x5dc6, 0x080c, 0x4b0a, 0x0804, 0x5dc6, 0x080c,
-	0x4cfb, 0x0804, 0x5dc6, 0x080c, 0x360d, 0x0804, 0x5dc6, 0x00b6,
-	0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1618, 0x9182,
-	0x0800, 0x1268, 0x9188, 0x1000, 0x2104, 0x905d, 0x0140, 0x080c,
-	0x6315, 0x1148, 0x00e9, 0x080c, 0x611c, 0x9006, 0x00b0, 0x2001,
-	0x0028, 0x900e, 0x0090, 0x9082, 0x0006, 0x1240, 0xb900, 0xd1fc,
-	0x0d88, 0x2001, 0x0029, 0x2009, 0x1000, 0x0038, 0x2001, 0x0029,
-	0x900e, 0x0018, 0x2001, 0x0029, 0x900e, 0x9005, 0x00be, 0x0005,
-	0x0126, 0x2091, 0x8000, 0xb850, 0x900d, 0x0150, 0x2900, 0x0096,
-	0x2148, 0xa802, 0x009e, 0xa803, 0x0000, 0xb852, 0x012e, 0x0005,
-	0x2900, 0xb852, 0xb84e, 0xa803, 0x0000, 0x0cc0, 0x0126, 0x2091,
-	0x8000, 0xb84c, 0x9005, 0x0170, 0x00e6, 0x2071, 0x19b6, 0x7004,
-	0x9086, 0x0002, 0x0168, 0x00ee, 0xb84c, 0xa802, 0x2900, 0xb84e,
-	0x012e, 0x0005, 0x2900, 0xb852, 0xb84e, 0xa803, 0x0000, 0x0cc0,
-	0x701c, 0x9b06, 0x1d80, 0xb84c, 0x00a6, 0x2050, 0xb000, 0xa802,
-	0x2900, 0xb002, 0x00ae, 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091,
-	0x8000, 0xb84c, 0x904d, 0x0130, 0xa800, 0x9005, 0x1108, 0xb852,
-	0xb84e, 0x9905, 0x012e, 0x0005, 0xb84c, 0x904d, 0x0130, 0xa800,
-	0x9005, 0x1108, 0xb852, 0xb84e, 0x9905, 0x0005, 0x00b6, 0x0126,
-	0x00c6, 0x0026, 0x2091, 0x8000, 0x6210, 0x2258, 0xba00, 0x9005,
-	0x0110, 0xc285, 0x0008, 0xc284, 0xba02, 0x002e, 0x00ce, 0x012e,
-	0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6210,
-	0x2258, 0xba04, 0x0006, 0x9086, 0x0006, 0x1170, 0xb89c, 0xd0ac,
-	0x0158, 0x080c, 0x6311, 0x0140, 0x9284, 0xff00, 0x8007, 0x9086,
-	0x0007, 0x1110, 0x2011, 0x0600, 0x000e, 0x9294, 0xff00, 0x9215,
-	0xba06, 0x0006, 0x9086, 0x0006, 0x1120, 0xba90, 0x82ff, 0x090c,
-	0x0db4, 0x000e, 0x00ce, 0x012e, 0x00be, 0x0005, 0x00b6, 0x0126,
-	0x00c6, 0x2091, 0x8000, 0x6210, 0x2258, 0xba04, 0x0006, 0x9086,
-	0x0006, 0x1168, 0xb89c, 0xd0a4, 0x0150, 0x080c, 0x630d, 0x1138,
-	0x9284, 0x00ff, 0x9086, 0x0007, 0x1110, 0x2011, 0x0006, 0x000e,
-	0x9294, 0x00ff, 0x8007, 0x9215, 0xba06, 0x00ce, 0x012e, 0x00be,
-	0x0005, 0x9182, 0x0800, 0x0218, 0x9085, 0x0001, 0x0005, 0x00d6,
-	0x0026, 0x9190, 0x1000, 0x2204, 0x905d, 0x1180, 0x0096, 0x080c,
-	0x0fec, 0x2958, 0x009e, 0x0160, 0x2b00, 0x2012, 0xb85c, 0xb8ba,
-	0xb860, 0xb8b6, 0x9006, 0xb8a6, 0x080c, 0x5aae, 0x9006, 0x0010,
-	0x9085, 0x0001, 0x002e, 0x00de, 0x0005, 0x00b6, 0x0096, 0x0126,
-	0x2091, 0x8000, 0x0026, 0x9182, 0x0800, 0x0218, 0x9085, 0x0001,
-	0x0458, 0x00d6, 0x9190, 0x1000, 0x2204, 0x905d, 0x0518, 0x2013,
-	0x0000, 0xb8a4, 0x904d, 0x0110, 0x080c, 0x101e, 0x00d6, 0x00c6,
-	0xb8ac, 0x2060, 0x8cff, 0x0168, 0x600c, 0x0006, 0x6014, 0x2048,
-	0x080c, 0xb793, 0x0110, 0x080c, 0x0f9e, 0x080c, 0x9ac8, 0x00ce,
-	0x0c88, 0x00ce, 0x00de, 0x2b48, 0xb8b8, 0xb85e, 0xb8b4, 0xb862,
-	0x080c, 0x102e, 0x00de, 0x9006, 0x002e, 0x012e, 0x009e, 0x00be,
-	0x0005, 0x0016, 0x9182, 0x0800, 0x0218, 0x9085, 0x0001, 0x0030,
-	0x9188, 0x1000, 0x2104, 0x905d, 0x0dc0, 0x9006, 0x001e, 0x0005,
-	0x00d6, 0x0156, 0x0136, 0x0146, 0x9006, 0xb80a, 0xb80e, 0xb800,
-	0xc08c, 0xb802, 0x080c, 0x6d14, 0x1510, 0xb8a0, 0x9086, 0x007e,
-	0x0120, 0x080c, 0x9a47, 0x11d8, 0x0078, 0x7040, 0xd0e4, 0x01b8,
-	0x00c6, 0x2061, 0x1951, 0x7048, 0x2062, 0x704c, 0x6006, 0x7050,
-	0x600a, 0x7054, 0x600e, 0x00ce, 0x703c, 0x2069, 0x0140, 0x9005,
-	0x1110, 0x2001, 0x0001, 0x6886, 0x2069, 0x1800, 0x68b2, 0x7040,
-	0xb85e, 0x7048, 0xb862, 0x704c, 0xb866, 0x20e1, 0x0000, 0x2099,
-	0x0276, 0xb8b4, 0x20e8, 0xb8b8, 0x9088, 0x000a, 0x21a0, 0x20a9,
-	0x0004, 0x4003, 0x2099, 0x027a, 0x9088, 0x0006, 0x21a0, 0x20a9,
-	0x0004, 0x4003, 0x2069, 0x0200, 0x6817, 0x0001, 0x7040, 0xb86a,
-	0x7144, 0xb96e, 0x7048, 0xb872, 0x7050, 0xb876, 0x2069, 0x0200,
-	0x6817, 0x0000, 0xb8a0, 0x9086, 0x007e, 0x1110, 0x7144, 0xb96e,
-	0x9182, 0x0211, 0x1218, 0x2009, 0x0008, 0x0400, 0x9182, 0x0259,
-	0x1218, 0x2009, 0x0007, 0x00d0, 0x9182, 0x02c1, 0x1218, 0x2009,
-	0x0006, 0x00a0, 0x9182, 0x0349, 0x1218, 0x2009, 0x0005, 0x0070,
-	0x9182, 0x0421, 0x1218, 0x2009, 0x0004, 0x0040, 0x9182, 0x0581,
-	0x1218, 0x2009, 0x0003, 0x0010, 0x2009, 0x0002, 0xb992, 0x014e,
-	0x013e, 0x015e, 0x00de, 0x0005, 0x0016, 0x0026, 0x00e6, 0x2071,
-	0x0260, 0x7034, 0xb896, 0x703c, 0xb89a, 0x7054, 0xb89e, 0x0036,
-	0xbbbc, 0xc384, 0xba00, 0x2009, 0x1873, 0x210c, 0xd0bc, 0x0120,
-	0xd1ec, 0x0110, 0xc2ad, 0x0008, 0xc2ac, 0xd0c4, 0x0148, 0xd1e4,
-	0x0138, 0xc2bd, 0xd0cc, 0x0128, 0xd38c, 0x1108, 0xc385, 0x0008,
-	0xc2bc, 0xba02, 0xbbbe, 0x003e, 0x00ee, 0x002e, 0x001e, 0x0005,
-	0x0096, 0x0126, 0x2091, 0x8000, 0xb8a4, 0x904d, 0x0578, 0xa900,
-	0x81ff, 0x15c0, 0xaa04, 0x9282, 0x0010, 0x16c8, 0x0136, 0x0146,
-	0x01c6, 0x01d6, 0x8906, 0x8006, 0x8007, 0x908c, 0x003f, 0x21e0,
-	0x9084, 0xffc0, 0x9080, 0x0004, 0x2098, 0x2009, 0x0010, 0x20a9,
-	0x0001, 0x4002, 0x9086, 0xffff, 0x0120, 0x8109, 0x1dd0, 0x080c,
-	0x0db4, 0x3c00, 0x20e8, 0x3300, 0x8001, 0x20a0, 0x4604, 0x8210,
-	0xaa06, 0x01de, 0x01ce, 0x014e, 0x013e, 0x0060, 0x080c, 0x0fec,
-	0x0170, 0x2900, 0xb8a6, 0xa803, 0x0000, 0x080c, 0x61ad, 0xa807,
-	0x0001, 0xae12, 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0x9006,
-	0x0cd8, 0x0126, 0x2091, 0x8000, 0x0096, 0xb8a4, 0x904d, 0x0188,
-	0xa800, 0x9005, 0x1150, 0x080c, 0x61bc, 0x1158, 0xa804, 0x908a,
-	0x0002, 0x0218, 0x8001, 0xa806, 0x0020, 0x080c, 0x101e, 0xb8a7,
-	0x0000, 0x009e, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x8129, 0x012e, 0x0005, 0x901e, 0x0010, 0x2019, 0x0001, 0x900e,
-	0x0126, 0x2091, 0x8000, 0xb84c, 0x2048, 0xb800, 0xd0dc, 0x1170,
-	0x89ff, 0x0500, 0x83ff, 0x0120, 0xa878, 0x9606, 0x0158, 0x0030,
-	0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0120, 0x2908, 0xa800,
-	0x2048, 0x0c70, 0x080c, 0x9446, 0xaa00, 0xb84c, 0x9906, 0x1110,
-	0xba4e, 0x0020, 0x00a6, 0x2150, 0xb202, 0x00ae, 0x82ff, 0x1110,
-	0xb952, 0x89ff, 0x012e, 0x0005, 0x9016, 0x0489, 0x1110, 0x2011,
-	0x0001, 0x0005, 0x080c, 0x6211, 0x0128, 0x080c, 0xb85b, 0x0010,
-	0x9085, 0x0001, 0x0005, 0x080c, 0x6211, 0x0128, 0x080c, 0xb7f5,
-	0x0010, 0x9085, 0x0001, 0x0005, 0x080c, 0x6211, 0x0128, 0x080c,
-	0xb858, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, 0x6211, 0x0128,
-	0x080c, 0xb819, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, 0x6211,
-	0x0128, 0x080c, 0xb885, 0x0010, 0x9085, 0x0001, 0x0005, 0xb8a4,
-	0x900d, 0x1118, 0x9085, 0x0001, 0x0005, 0x0136, 0x01c6, 0xa800,
-	0x9005, 0x11b8, 0x890e, 0x810e, 0x810f, 0x9184, 0x003f, 0x20e0,
-	0x9184, 0xffc0, 0x9080, 0x0004, 0x2098, 0x20a9, 0x0001, 0x2009,
-	0x0010, 0x4002, 0x9606, 0x0128, 0x8109, 0x1dd8, 0x9085, 0x0001,
-	0x0008, 0x9006, 0x01ce, 0x013e, 0x0005, 0x0146, 0x01d6, 0xa860,
-	0x20e8, 0xa85c, 0x9080, 0x0004, 0x20a0, 0x20a9, 0x0010, 0x2009,
-	0xffff, 0x4104, 0x01de, 0x014e, 0x0136, 0x01c6, 0xa800, 0x9005,
-	0x11b8, 0x890e, 0x810e, 0x810f, 0x9184, 0x003f, 0x20e0, 0x9184,
-	0xffc0, 0x9080, 0x0004, 0x2098, 0x20a9, 0x0001, 0x2009, 0x0010,
-	0x4002, 0x9606, 0x0128, 0x8109, 0x1dd8, 0x9085, 0x0001, 0x0068,
-	0x0146, 0x01d6, 0x3300, 0x8001, 0x20a0, 0x3c00, 0x20e8, 0x2001,
-	0xffff, 0x4004, 0x01de, 0x014e, 0x9006, 0x01ce, 0x013e, 0x0005,
-	0x0096, 0x0126, 0x2091, 0x8000, 0xb8a4, 0x904d, 0x1128, 0x080c,
-	0x0fec, 0x0168, 0x2900, 0xb8a6, 0x080c, 0x61ad, 0xa803, 0x0001,
-	0xa807, 0x0000, 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0x9006,
-	0x0cd8, 0x0096, 0x0126, 0x2091, 0x8000, 0xb8a4, 0x904d, 0x0130,
-	0xb8a7, 0x0000, 0x080c, 0x101e, 0x9085, 0x0001, 0x012e, 0x009e,
-	0x0005, 0xb89c, 0xd0a4, 0x0005, 0x00b6, 0x00f6, 0x080c, 0x6d14,
-	0x01b0, 0x71c0, 0x81ff, 0x1198, 0x71d8, 0xd19c, 0x0180, 0x2001,
-	0x007e, 0x9080, 0x1000, 0x2004, 0x905d, 0x0148, 0xb804, 0x9084,
-	0x00ff, 0x9086, 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x2079,
-	0x1853, 0x7804, 0x00d0, 0x0156, 0x20a9, 0x007f, 0x900e, 0x0016,
-	0x080c, 0x5ff1, 0x1168, 0xb804, 0x9084, 0xff00, 0x8007, 0x9096,
-	0x0004, 0x0118, 0x9086, 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802,
-	0x001e, 0x8108, 0x1f04, 0x6237, 0x015e, 0x080c, 0x62d3, 0x0120,
-	0x2001, 0x1954, 0x200c, 0x0030, 0x2079, 0x1853, 0x7804, 0x0030,
-	0x2009, 0x07d0, 0x2011, 0x6261, 0x080c, 0x7de5, 0x00fe, 0x00be,
-	0x0005, 0x00b6, 0x2011, 0x6261, 0x080c, 0x7d56, 0x080c, 0x62d3,
-	0x01d8, 0x2001, 0x107e, 0x2004, 0x2058, 0xb900, 0xc1ec, 0xb902,
-	0x080c, 0x6311, 0x0130, 0x2009, 0x07d0, 0x2011, 0x6261, 0x080c,
-	0x7de5, 0x00e6, 0x2071, 0x1800, 0x9006, 0x707a, 0x705c, 0x707e,
-	0x080c, 0x2c63, 0x00ee, 0x04b0, 0x0156, 0x00c6, 0x20a9, 0x007f,
-	0x900e, 0x0016, 0x080c, 0x5ff1, 0x1538, 0xb800, 0xd0ec, 0x0520,
-	0x0046, 0xbaa0, 0x2220, 0x9006, 0x2009, 0x0029, 0x080c, 0xd188,
-	0xb800, 0xc0e5, 0xc0ec, 0xb802, 0x080c, 0x630d, 0x2001, 0x0707,
-	0x1128, 0xb804, 0x9084, 0x00ff, 0x9085, 0x0700, 0xb806, 0x2019,
-	0x0029, 0x080c, 0x828c, 0x0076, 0x903e, 0x080c, 0x8184, 0x900e,
-	0x080c, 0xcef9, 0x007e, 0x004e, 0x001e, 0x8108, 0x1f04, 0x6289,
-	0x00ce, 0x015e, 0x00be, 0x0005, 0x00b6, 0x6010, 0x2058, 0xb800,
-	0xc0ec, 0xb802, 0x00be, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb800,
-	0x00be, 0xd0ac, 0x0005, 0x6010, 0x00b6, 0x905d, 0x0108, 0xb800,
-	0x00be, 0xd0bc, 0x0005, 0x00b6, 0x00f6, 0x2001, 0x107e, 0x2004,
-	0x905d, 0x0110, 0xb800, 0xd0ec, 0x00fe, 0x00be, 0x0005, 0x0126,
-	0x0026, 0x2091, 0x8000, 0x0006, 0xbaa0, 0x9290, 0x1000, 0x2204,
-	0x9b06, 0x190c, 0x0db4, 0x000e, 0xba00, 0x9005, 0x0110, 0xc2fd,
-	0x0008, 0xc2fc, 0xba02, 0x002e, 0x012e, 0x0005, 0x2011, 0x1836,
-	0x2204, 0xd0cc, 0x0138, 0x2001, 0x1952, 0x200c, 0x2011, 0x6303,
-	0x080c, 0x7de5, 0x0005, 0x2011, 0x6303, 0x080c, 0x7d56, 0x2011,
-	0x1836, 0x2204, 0xc0cc, 0x2012, 0x0005, 0x080c, 0x5153, 0xd0ac,
-	0x0005, 0x080c, 0x5153, 0xd0a4, 0x0005, 0x0016, 0xb904, 0x9184,
-	0x00ff, 0x908e, 0x0006, 0x001e, 0x0005, 0x0016, 0xb904, 0x9184,
-	0xff00, 0x8007, 0x908e, 0x0006, 0x001e, 0x0005, 0x00b6, 0x00f6,
-	0x080c, 0xbe86, 0x0158, 0x70d8, 0x9084, 0x0028, 0x0138, 0x2001,
-	0x107f, 0x2004, 0x905d, 0x0110, 0xb8bc, 0xd094, 0x00fe, 0x00be,
-	0x0005, 0x0006, 0x0016, 0x0036, 0x0046, 0x0076, 0x00b6, 0x2001,
-	0x1817, 0x203c, 0x9780, 0x2fd9, 0x203d, 0x97bc, 0xff00, 0x873f,
-	0x9006, 0x2018, 0x2008, 0x9284, 0x8000, 0x0110, 0x2019, 0x0001,
-	0x9294, 0x7fff, 0x2100, 0x9706, 0x0190, 0x91a0, 0x1000, 0x2404,
-	0x905d, 0x0168, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1138,
-	0x83ff, 0x0118, 0xb89c, 0xd0a4, 0x0110, 0x8211, 0x0158, 0x8108,
-	0x83ff, 0x0120, 0x9182, 0x0800, 0x0e28, 0x0068, 0x9182, 0x007e,
-	0x0e08, 0x0048, 0x00be, 0x007e, 0x004e, 0x003e, 0x001e, 0x9085,
-	0x0001, 0x000e, 0x0005, 0x00be, 0x007e, 0x004e, 0x003e, 0x001e,
-	0x9006, 0x000e, 0x0005, 0x2071, 0x1906, 0x7003, 0x0001, 0x7007,
-	0x0000, 0x9006, 0x7012, 0x7016, 0x701a, 0x701e, 0x700a, 0x7046,
-	0x2001, 0x1919, 0x2003, 0x0000, 0x0005, 0x0016, 0x00e6, 0x2071,
-	0x191a, 0x900e, 0x710a, 0x080c, 0x5153, 0xd0fc, 0x1140, 0x080c,
-	0x5153, 0x900e, 0xd09c, 0x0108, 0x8108, 0x7102, 0x0400, 0x2001,
-	0x1873, 0x200c, 0x9184, 0x0007, 0x9006, 0x0002, 0x639f, 0x639f,
-	0x639f, 0x639f, 0x639f, 0x63b6, 0x63c4, 0x639f, 0x7003, 0x0003,
-	0x2009, 0x1874, 0x210c, 0x9184, 0xff00, 0x8007, 0x9005, 0x1110,
-	0x2001, 0x0002, 0x7006, 0x0018, 0x7003, 0x0005, 0x0c88, 0x00ee,
-	0x001e, 0x0005, 0x00e6, 0x2071, 0x0050, 0x684c, 0x9005, 0x1150,
-	0x00e6, 0x2071, 0x1906, 0x7028, 0xc085, 0x702a, 0x00ee, 0x9085,
-	0x0001, 0x0488, 0x6844, 0x9005, 0x0158, 0x080c, 0x706a, 0x6a60,
-	0x9200, 0x7002, 0x6864, 0x9101, 0x7006, 0x9006, 0x7012, 0x7016,
-	0x6860, 0x7002, 0x6864, 0x7006, 0x6868, 0x700a, 0x686c, 0x700e,
-	0x6844, 0x9005, 0x1110, 0x7012, 0x7016, 0x684c, 0x701a, 0x701c,
-	0x9085, 0x0040, 0x701e, 0x7037, 0x0019, 0x702b, 0x0001, 0x00e6,
-	0x2071, 0x1906, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0x700b,
-	0x0000, 0x00ee, 0x9006, 0x00ee, 0x0005, 0xa868, 0xd0fc, 0x11d8,
-	0x00e6, 0x0026, 0x2001, 0x191a, 0x2004, 0x9005, 0x0904, 0x65f7,
-	0xa87c, 0xd0bc, 0x1904, 0x65f7, 0xa978, 0xa874, 0x9105, 0x1904,
-	0x65f7, 0x2001, 0x191a, 0x2004, 0x0002, 0x65f7, 0x6450, 0x648c,
-	0x648c, 0x65f7, 0x648c, 0x0005, 0xa868, 0xd0fc, 0x1500, 0x00e6,
-	0x0026, 0x2009, 0x191a, 0x210c, 0x81ff, 0x0904, 0x65f7, 0xa87c,
-	0xd0cc, 0x0904, 0x65f7, 0xa880, 0x9084, 0x00ff, 0x9086, 0x0001,
-	0x1904, 0x65f7, 0x9186, 0x0003, 0x0904, 0x648c, 0x9186, 0x0005,
-	0x0904, 0x648c, 0xa84f, 0x8021, 0xa853, 0x0017, 0x0028, 0x0005,
-	0xa84f, 0x8020, 0xa853, 0x0016, 0x2071, 0x1906, 0x701c, 0x9005,
-	0x1904, 0x67b7, 0x0e04, 0x6802, 0x2071, 0x0000, 0xa84c, 0x7082,
-	0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091,
-	0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x117e, 0x2071,
-	0x1800, 0x2011, 0x0001, 0xa804, 0x900d, 0x702c, 0x1158, 0xa802,
-	0x2900, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7c7b, 0x002e,
-	0x00ee, 0x0005, 0x0096, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900,
-	0x81ff, 0x1dc8, 0x009e, 0x0c58, 0xa84f, 0x0000, 0x00f6, 0x2079,
-	0x0050, 0x2071, 0x1906, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904,
-	0x657b, 0x782c, 0x908c, 0x0780, 0x190c, 0x6929, 0x8004, 0x8004,
-	0x8004, 0x9084, 0x0003, 0x0002, 0x64aa, 0x657b, 0x64cf, 0x6516,
-	0x080c, 0x0db4, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d,
-	0x1170, 0x2071, 0x19c9, 0x703c, 0x9005, 0x1328, 0x2001, 0x191b,
-	0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016,
-	0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8,
-	0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7c7b, 0x0c10, 0x2071,
-	0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1580, 0x7824, 0x00e6,
-	0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, 0x2009, 0x182f, 0x210c,
-	0x918a, 0x0040, 0x0218, 0x7022, 0x00ee, 0x0058, 0x00ee, 0x2048,
-	0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c,
-	0x7c7b, 0x782c, 0x9094, 0x0780, 0x190c, 0x6929, 0xd0a4, 0x19f0,
-	0x2071, 0x19c9, 0x703c, 0x9005, 0x1328, 0x2001, 0x191b, 0x2004,
-	0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c,
-	0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e,
-	0x70bc, 0x9200, 0x70be, 0x080c, 0x7c7b, 0x0800, 0x0096, 0x00e6,
-	0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e,
-	0x70bc, 0x8000, 0x70be, 0x080c, 0x7c7b, 0x782c, 0x9094, 0x0780,
-	0x190c, 0x6929, 0xd0a4, 0x1d60, 0x00ee, 0x782c, 0x9094, 0x0780,
-	0x190c, 0x6929, 0xd09c, 0x11a0, 0x009e, 0x2900, 0x7822, 0xa804,
-	0x900d, 0x1560, 0x2071, 0x19c9, 0x703c, 0x9005, 0x1328, 0x2001,
-	0x191b, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005,
-	0x009e, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a,
-	0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1170,
-	0x2071, 0x19c9, 0x703c, 0x9005, 0x1328, 0x2001, 0x191b, 0x2004,
-	0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800,
-	0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff,
-	0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7c7b, 0x00fe,
-	0x002e, 0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018,
-	0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804,
-	0x900d, 0x1904, 0x65d0, 0x782c, 0x9094, 0x0780, 0x190c, 0x6929,
-	0xd09c, 0x1198, 0x701c, 0x904d, 0x0180, 0x7010, 0x8001, 0x7012,
-	0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, 0x9094,
-	0x0780, 0x190c, 0x6929, 0xd09c, 0x0d68, 0x782c, 0x9094, 0x0780,
-	0x190c, 0x6929, 0xd0a4, 0x01b0, 0x00e6, 0x7824, 0x2048, 0x2071,
-	0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be,
-	0x080c, 0x7c7b, 0x782c, 0x9094, 0x0780, 0x190c, 0x6929, 0xd0a4,
-	0x1d60, 0x00ee, 0x2071, 0x19c9, 0x703c, 0x9005, 0x1328, 0x2001,
-	0x191b, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005,
-	0x00e6, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802,
+	0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5b5d, 0x00fe,
+	0x0005, 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, 0x5b33, 0x080c,
+	0x8010, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5ca4, 0x2079, 0x0260,
+	0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38,
+	0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097,
+	0x0008, 0x0029, 0x0010, 0x080c, 0x5c80, 0x00fe, 0x0005, 0x00f6,
+	0x7097, 0x0009, 0x080c, 0x5c28, 0x2079, 0x0240, 0x7833, 0x1105,
+	0x7837, 0x0100, 0x080c, 0x5c87, 0x1150, 0x7080, 0x9005, 0x1138,
+	0x080c, 0x5a53, 0x1188, 0x9085, 0x0001, 0x080c, 0x26cc, 0x20a9,
+	0x0008, 0x080c, 0x5ca4, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9,
+	0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5b5d,
+	0x0010, 0x080c, 0x55ad, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005,
+	0x05a8, 0x2011, 0x5b33, 0x080c, 0x8010, 0x9086, 0x0014, 0x1560,
+	0x080c, 0x5ca4, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, 0x1520,
+	0x7834, 0x9084, 0x0100, 0x2011, 0x0100, 0x921e, 0x1160, 0x7a38,
+	0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097,
+	0x000a, 0x00b1, 0x0098, 0x9005, 0x1178, 0x7a38, 0xd2fc, 0x0128,
+	0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7093, 0x0000, 0x7097,
+	0x000e, 0x080c, 0x57fb, 0x0010, 0x080c, 0x5c80, 0x00fe, 0x0005,
+	0x00f6, 0x7097, 0x000b, 0x2011, 0x1c0e, 0x20e9, 0x0001, 0x22a0,
+	0x20a9, 0x0040, 0x2019, 0xffff, 0x4304, 0x080c, 0x5c28, 0x2079,
+	0x0240, 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, 0x5c87, 0x0118,
+	0x2013, 0x0000, 0x0020, 0x705c, 0x9085, 0x0100, 0x2012, 0x20a9,
+	0x0040, 0x2009, 0x024e, 0x2011, 0x1c0e, 0x220e, 0x8210, 0x8108,
+	0x9186, 0x0260, 0x1128, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240,
+	0x1f04, 0x577d, 0x60c3, 0x0084, 0x080c, 0x5b5d, 0x00fe, 0x0005,
+	0x00f6, 0x708c, 0x9005, 0x01c0, 0x2011, 0x5b33, 0x080c, 0x8010,
+	0x9086, 0x0084, 0x1178, 0x080c, 0x5ca4, 0x2079, 0x0260, 0x7a30,
+	0x9296, 0x1106, 0x1138, 0x7834, 0x9005, 0x1120, 0x7097, 0x000c,
+	0x0029, 0x0010, 0x080c, 0x5c80, 0x00fe, 0x0005, 0x00f6, 0x7097,
+	0x000d, 0x080c, 0x5c28, 0x2079, 0x0240, 0x7833, 0x1107, 0x7837,
+	0x0000, 0x080c, 0x5ca4, 0x20a9, 0x0040, 0x2011, 0x026e, 0x2009,
+	0x024e, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1150, 0x6810,
+	0x8000, 0x6812, 0x2009, 0x0240, 0x6814, 0x8000, 0x6816, 0x2011,
+	0x0260, 0x1f04, 0x57c1, 0x60c3, 0x0084, 0x080c, 0x5b5d, 0x00fe,
+	0x0005, 0x00f6, 0x708c, 0x9005, 0x01e0, 0x2011, 0x5b33, 0x080c,
+	0x8010, 0x9086, 0x0084, 0x1198, 0x080c, 0x5ca4, 0x2079, 0x0260,
+	0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, 0x1140, 0x7093,
+	0x0001, 0x080c, 0x5bfa, 0x7097, 0x000e, 0x0029, 0x0010, 0x080c,
+	0x5c80, 0x00fe, 0x0005, 0x918d, 0x0001, 0x080c, 0x5ccf, 0x7097,
+	0x000f, 0x708f, 0x0000, 0x2061, 0x0140, 0x605b, 0xbc85, 0x605f,
+	0xb5b5, 0x2061, 0x0100, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009,
+	0x07d0, 0x2011, 0x5b33, 0x080c, 0x8004, 0x0005, 0x708c, 0x9005,
+	0x0130, 0x2011, 0x5b33, 0x080c, 0x8010, 0x7097, 0x0000, 0x0005,
+	0x7097, 0x0011, 0x080c, 0x9c26, 0x080c, 0x5ca4, 0x20e1, 0x0000,
+	0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x748c, 0x9480,
+	0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, 0x4003,
+	0x080c, 0x5c87, 0x11a0, 0x7178, 0x81ff, 0x0188, 0x900e, 0x707c,
+	0x9084, 0x00ff, 0x0160, 0x080c, 0x2663, 0x9186, 0x007e, 0x0138,
+	0x9186, 0x0080, 0x0120, 0x2011, 0x0008, 0x080c, 0x5ae0, 0x60c3,
+	0x0014, 0x080c, 0x5b5d, 0x0005, 0x00f6, 0x708c, 0x9005, 0x0500,
+	0x2011, 0x5b33, 0x080c, 0x8010, 0x9086, 0x0014, 0x11b8, 0x080c,
+	0x5ca4, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178, 0x7834,
+	0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110,
+	0x70c3, 0x0001, 0x7097, 0x0012, 0x0029, 0x0010, 0x708f, 0x0000,
+	0x00fe, 0x0005, 0x00f6, 0x7097, 0x0013, 0x080c, 0x5c36, 0x2079,
+	0x0240, 0x7833, 0x1103, 0x7837, 0x0000, 0x080c, 0x5ca4, 0x080c,
+	0x5c87, 0x1170, 0x7080, 0x9005, 0x1158, 0x7158, 0x9186, 0xffff,
+	0x0138, 0x2011, 0x0008, 0x080c, 0x5ae0, 0x0168, 0x080c, 0x5c5d,
+	0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000,
+	0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5b5d, 0x00fe,
+	0x0005, 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, 0x5b33, 0x080c,
+	0x8010, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5ca4, 0x2079, 0x0260,
+	0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38,
+	0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097,
+	0x0014, 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, 0x00f6,
+	0x7097, 0x0015, 0x080c, 0x5c36, 0x2079, 0x0240, 0x7833, 0x1104,
+	0x7837, 0x0000, 0x080c, 0x5ca4, 0x080c, 0x5c87, 0x11b8, 0x7080,
+	0x9005, 0x11a0, 0x7160, 0x9186, 0xffff, 0x0180, 0x9180, 0x3131,
+	0x200d, 0x918c, 0xff00, 0x810f, 0x2011, 0x0008, 0x080c, 0x5ae0,
+	0x0180, 0x080c, 0x4c91, 0x0110, 0x080c, 0x26cc, 0x20a9, 0x0008,
+	0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e,
+	0x4003, 0x60c3, 0x0014, 0x080c, 0x5b5d, 0x00fe, 0x0005, 0x00f6,
+	0x708c, 0x9005, 0x05f0, 0x2011, 0x5b33, 0x080c, 0x8010, 0x9086,
+	0x0014, 0x15a8, 0x080c, 0x5ca4, 0x2079, 0x0260, 0x7a30, 0x9296,
+	0x1105, 0x1568, 0x7834, 0x9084, 0x0100, 0x2011, 0x0100, 0x921e,
+	0x1168, 0x9085, 0x0001, 0x080c, 0x5ccf, 0x7a38, 0xd2fc, 0x0128,
+	0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x0080, 0x9005, 0x11b8,
+	0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001,
+	0x9085, 0x0001, 0x080c, 0x5ccf, 0x7093, 0x0000, 0x7a38, 0xd2f4,
+	0x0110, 0x70db, 0x0008, 0x7097, 0x0016, 0x0029, 0x0010, 0x708f,
+	0x0000, 0x00fe, 0x0005, 0x080c, 0x9c26, 0x080c, 0x5ca4, 0x20e1,
+	0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9,
+	0x000e, 0x4003, 0x2011, 0x026d, 0x2204, 0x9084, 0x0100, 0x2011,
+	0x024d, 0x2012, 0x2011, 0x026e, 0x7097, 0x0017, 0x080c, 0x5c87,
+	0x1150, 0x7080, 0x9005, 0x1138, 0x080c, 0x5a53, 0x1188, 0x9085,
+	0x0001, 0x080c, 0x26cc, 0x20a9, 0x0008, 0x080c, 0x5ca4, 0x20e1,
+	0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003,
+	0x60c3, 0x0014, 0x080c, 0x5b5d, 0x0010, 0x080c, 0x55ad, 0x0005,
+	0x00f6, 0x708c, 0x9005, 0x01d8, 0x2011, 0x5b33, 0x080c, 0x8010,
+	0x9086, 0x0084, 0x1190, 0x080c, 0x5ca4, 0x2079, 0x0260, 0x7a30,
+	0x9296, 0x1106, 0x1150, 0x7834, 0x9005, 0x1138, 0x9006, 0x080c,
+	0x5ccf, 0x7097, 0x0018, 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe,
+	0x0005, 0x00f6, 0x7097, 0x0019, 0x080c, 0x5c36, 0x2079, 0x0240,
+	0x7833, 0x1106, 0x7837, 0x0000, 0x080c, 0x5ca4, 0x2009, 0x026e,
+	0x2039, 0x1c0e, 0x20a9, 0x0040, 0x213e, 0x8738, 0x8108, 0x9186,
+	0x0280, 0x1128, 0x6814, 0x8000, 0x6816, 0x2009, 0x0260, 0x1f04,
+	0x59bc, 0x2039, 0x1c0e, 0x080c, 0x5c87, 0x11e8, 0x2728, 0x2514,
+	0x8207, 0x9084, 0x00ff, 0x8000, 0x2018, 0x9294, 0x00ff, 0x8007,
+	0x9205, 0x202a, 0x705c, 0x2310, 0x8214, 0x92a0, 0x1c0e, 0x2414,
+	0x938c, 0x0001, 0x0118, 0x9294, 0xff00, 0x0018, 0x9294, 0x00ff,
+	0x8007, 0x9215, 0x2222, 0x20a9, 0x0040, 0x2009, 0x024e, 0x270e,
+	0x8738, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810, 0x8000, 0x6812,
+	0x2009, 0x0240, 0x1f04, 0x59ef, 0x60c3, 0x0084, 0x080c, 0x5b5d,
+	0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x01e0, 0x2011, 0x5b33,
+	0x080c, 0x8010, 0x9086, 0x0084, 0x1198, 0x080c, 0x5ca4, 0x2079,
+	0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, 0x1140,
+	0x7093, 0x0001, 0x080c, 0x5bfa, 0x7097, 0x001a, 0x0029, 0x0010,
+	0x708f, 0x0000, 0x00fe, 0x0005, 0x9085, 0x0001, 0x080c, 0x5ccf,
+	0x7097, 0x001b, 0x080c, 0x9c26, 0x080c, 0x5ca4, 0x2011, 0x0260,
+	0x2009, 0x0240, 0x748c, 0x9480, 0x0018, 0x9080, 0x0007, 0x9084,
+	0x03f8, 0x8004, 0x20a8, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260,
+	0x1150, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x6814, 0x8000,
+	0x6816, 0x2011, 0x0260, 0x1f04, 0x5a3b, 0x60c3, 0x0084, 0x080c,
+	0x5b5d, 0x0005, 0x0005, 0x0086, 0x0096, 0x2029, 0x1854, 0x252c,
+	0x20a9, 0x0008, 0x2041, 0x1c0e, 0x20e9, 0x0001, 0x28a0, 0x080c,
+	0x5ca4, 0x20e1, 0x0000, 0x2099, 0x026e, 0x4003, 0x20a9, 0x0008,
+	0x2011, 0x0007, 0xd5d4, 0x0108, 0x9016, 0x2800, 0x9200, 0x200c,
+	0x91a6, 0xffff, 0x1148, 0xd5d4, 0x0110, 0x8210, 0x0008, 0x8211,
+	0x1f04, 0x5a6d, 0x0804, 0x5adc, 0x82ff, 0x1160, 0xd5d4, 0x0120,
+	0x91a6, 0x3fff, 0x0d90, 0x0020, 0x91a6, 0x3fff, 0x0904, 0x5adc,
+	0x918d, 0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4, 0x0110,
+	0x2019, 0x0010, 0x2120, 0xd5d4, 0x0110, 0x8423, 0x0008, 0x8424,
+	0x1240, 0xd5d4, 0x0110, 0x8319, 0x0008, 0x8318, 0x1f04, 0x5a93,
+	0x04d8, 0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, 0x1f04, 0x5aa5,
+	0x2328, 0x8529, 0x92be, 0x0007, 0x0158, 0x0006, 0x2039, 0x0007,
+	0x2200, 0x973a, 0x000e, 0x27a8, 0x95a8, 0x0010, 0x1f04, 0x5ab4,
+	0x755a, 0x95c8, 0x3131, 0x292d, 0x95ac, 0x00ff, 0x757e, 0x6532,
+	0x6536, 0x0016, 0x2508, 0x080c, 0x26ac, 0x001e, 0x60e7, 0x0000,
+	0x65ea, 0x2018, 0x2304, 0x9405, 0x201a, 0x7083, 0x0001, 0x20e9,
+	0x0000, 0x20a1, 0x024e, 0x20e1, 0x0001, 0x2898, 0x20a9, 0x0008,
+	0x4003, 0x9085, 0x0001, 0x0008, 0x9006, 0x009e, 0x008e, 0x0005,
+	0x0156, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x22a8, 0x20e1, 0x0000,
+	0x2099, 0x026e, 0x20e9, 0x0000, 0x2011, 0x024e, 0x22a0, 0x4003,
+	0x014e, 0x013e, 0x01de, 0x01ce, 0x015e, 0x2118, 0x9026, 0x2001,
+	0x0007, 0x939a, 0x0010, 0x0218, 0x8420, 0x8001, 0x0cd0, 0x2118,
+	0x84ff, 0x0120, 0x939a, 0x0010, 0x8421, 0x1de0, 0x2021, 0x0001,
+	0x83ff, 0x0118, 0x8423, 0x8319, 0x1de8, 0x9238, 0x2029, 0x026e,
+	0x9528, 0x2504, 0x942c, 0x11b8, 0x9405, 0x203a, 0x715a, 0x91a0,
+	0x3131, 0x242d, 0x95ac, 0x00ff, 0x757e, 0x6532, 0x6536, 0x0016,
+	0x2508, 0x080c, 0x26ac, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x7083,
+	0x0001, 0x9084, 0x0000, 0x0005, 0x00e6, 0x2071, 0x1800, 0x7087,
+	0x0000, 0x00ee, 0x0005, 0x00e6, 0x00f6, 0x2079, 0x0100, 0x2071,
+	0x0140, 0x080c, 0x5be9, 0x080c, 0x9393, 0x7004, 0x9084, 0x4000,
+	0x0110, 0x080c, 0x2b24, 0x0126, 0x2091, 0x8000, 0x2071, 0x1825,
+	0x2073, 0x0000, 0x7840, 0x0026, 0x0016, 0x2009, 0x00f7, 0x080c,
+	0x5c46, 0x001e, 0x9094, 0x0010, 0x9285, 0x0080, 0x7842, 0x7a42,
+	0x002e, 0x012e, 0x00fe, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000,
+	0x080c, 0x29ca, 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012,
+	0x2011, 0x19c2, 0x2013, 0x0000, 0x708f, 0x0000, 0x012e, 0x60a3,
+	0x0056, 0x60a7, 0x9575, 0x080c, 0x938a, 0x6144, 0xd184, 0x0120,
+	0x7194, 0x918d, 0x2000, 0x0018, 0x7188, 0x918d, 0x1000, 0x2011,
+	0x196a, 0x2112, 0x2009, 0x07d0, 0x2011, 0x5b33, 0x080c, 0x80a2,
+	0x0005, 0x0016, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c,
+	0x9d9f, 0x2009, 0x00f7, 0x080c, 0x5c46, 0x2061, 0x19cb, 0x900e,
+	0x611a, 0x611e, 0x6172, 0x6176, 0x2061, 0x1800, 0x6003, 0x0001,
+	0x2061, 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x196a,
+	0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x5bb5, 0x080c, 0x8004,
+	0x012e, 0x00ce, 0x002e, 0x001e, 0x0005, 0x00e6, 0x0006, 0x0126,
+	0x2091, 0x8000, 0x0471, 0x2071, 0x0100, 0x080c, 0x9393, 0x2071,
+	0x0140, 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, 0x2b24, 0x080c,
+	0x6faf, 0x0188, 0x080c, 0x6fca, 0x1170, 0x080c, 0x7295, 0x0016,
+	0x080c, 0x277b, 0x2001, 0x193e, 0x2102, 0x001e, 0x080c, 0x7290,
+	0x080c, 0x6ed9, 0x0050, 0x2009, 0x0001, 0x080c, 0x2a63, 0x2001,
+	0x0001, 0x080c, 0x260c, 0x080c, 0x5b89, 0x012e, 0x000e, 0x00ee,
+	0x0005, 0x2001, 0x180e, 0x2004, 0xd0bc, 0x0158, 0x0026, 0x0036,
+	0x2011, 0x8017, 0x2001, 0x196a, 0x201c, 0x080c, 0x48d2, 0x003e,
+	0x002e, 0x0005, 0x20a9, 0x0012, 0x20e9, 0x0001, 0x20a1, 0x1c80,
+	0x080c, 0x5ca4, 0x20e9, 0x0000, 0x2099, 0x026e, 0x0099, 0x20a9,
+	0x0020, 0x080c, 0x5c9e, 0x2099, 0x0260, 0x20a1, 0x1c92, 0x0051,
+	0x20a9, 0x000e, 0x080c, 0x5ca1, 0x2099, 0x0260, 0x20a1, 0x1cb2,
+	0x0009, 0x0005, 0x0016, 0x0026, 0x3410, 0x3308, 0x2104, 0x8007,
+	0x2012, 0x8108, 0x8210, 0x1f04, 0x5c1e, 0x002e, 0x001e, 0x0005,
+	0x080c, 0x9c26, 0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000,
+	0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x080c, 0x9c26,
+	0x080c, 0x5ca4, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000,
+	0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x00c6, 0x0006,
+	0x2061, 0x0100, 0x810f, 0x2001, 0x1833, 0x2004, 0x9005, 0x1138,
+	0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x9105, 0x0010, 0x9185,
+	0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005, 0x0016, 0x0046, 0x080c,
+	0x6557, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xd50a,
+	0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x900e,
+	0x080c, 0x2fa2, 0x080c, 0xc1f9, 0x0140, 0x0036, 0x2019, 0xffff,
+	0x2021, 0x0007, 0x080c, 0x4a6f, 0x003e, 0x004e, 0x001e, 0x0005,
+	0x080c, 0x5b89, 0x7097, 0x0000, 0x708f, 0x0000, 0x0005, 0x0006,
+	0x2001, 0x180c, 0x2004, 0xd09c, 0x0100, 0x000e, 0x0005, 0x0006,
+	0x0016, 0x0126, 0x2091, 0x8000, 0x2001, 0x0101, 0x200c, 0x918d,
+	0x0006, 0x2102, 0x012e, 0x001e, 0x000e, 0x0005, 0x2009, 0x0001,
+	0x0020, 0x2009, 0x0002, 0x0008, 0x900e, 0x6814, 0x9084, 0xffc0,
+	0x910d, 0x6916, 0x0005, 0x00f6, 0x0156, 0x0146, 0x01d6, 0x9006,
+	0x20a9, 0x0080, 0x20e9, 0x0001, 0x20a1, 0x1c00, 0x4004, 0x2079,
+	0x1c00, 0x7803, 0x2200, 0x7807, 0x00ef, 0x780f, 0x00ef, 0x7813,
+	0x0138, 0x7823, 0xffff, 0x7827, 0xffff, 0x01de, 0x014e, 0x015e,
+	0x00fe, 0x0005, 0x2001, 0x1800, 0x2003, 0x0001, 0x0005, 0x2001,
+	0x1977, 0x0118, 0x2003, 0x0001, 0x0010, 0x2003, 0x0000, 0x0005,
+	0x0156, 0x20a9, 0x0800, 0x2009, 0x1000, 0x9006, 0x200a, 0x8108,
+	0x1f04, 0x5cde, 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156, 0x0136,
+	0x0146, 0x2069, 0x1853, 0x9006, 0xb802, 0xb8be, 0xb807, 0x0707,
+	0xb80a, 0xb80e, 0xb812, 0x9198, 0x3131, 0x231d, 0x939c, 0x00ff,
+	0xbb16, 0x0016, 0x0026, 0xb8b2, 0x080c, 0x9d98, 0x1120, 0x9192,
+	0x007e, 0x1208, 0xbbb2, 0x20a9, 0x0004, 0xb8b4, 0x20e8, 0xb9b8,
+	0x9198, 0x0006, 0x9006, 0x23a0, 0x4004, 0x20a9, 0x0004, 0x9198,
+	0x000a, 0x23a0, 0x4004, 0x002e, 0x001e, 0xb83e, 0xb842, 0xb84e,
+	0xb852, 0xb856, 0xb85a, 0xb85e, 0xb862, 0xb866, 0xb86a, 0xb86f,
+	0x0100, 0xb872, 0xb876, 0xb87a, 0xb88a, 0xb88e, 0xb893, 0x0008,
+	0xb896, 0xb89a, 0xb89e, 0xb8ae, 0xb9a2, 0x0096, 0xb8a4, 0x904d,
+	0x0110, 0x080c, 0x101d, 0xb8a7, 0x0000, 0x009e, 0x9006, 0xb84a,
+	0x6810, 0xb83a, 0x680c, 0xb846, 0x6814, 0x9084, 0x00ff, 0xb842,
+	0x014e, 0x013e, 0x015e, 0x003e, 0x00de, 0x0005, 0x0126, 0x2091,
+	0x8000, 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04,
+	0x5db4, 0x9182, 0x0800, 0x1a04, 0x5db8, 0x2001, 0x180c, 0x2004,
+	0x9084, 0x0003, 0x1904, 0x5dbe, 0x9188, 0x1000, 0x2104, 0x905d,
+	0x0518, 0xb804, 0x9084, 0x00ff, 0x908e, 0x0006, 0x1508, 0xb8a4,
+	0x900d, 0x1904, 0x5dd0, 0xb850, 0x900d, 0x1148, 0xa802, 0x2900,
+	0xb852, 0xb84e, 0x080c, 0x83e6, 0x9006, 0x012e, 0x0005, 0x00a6,
+	0x2150, 0x2900, 0xb002, 0xa803, 0x0000, 0x00ae, 0xb852, 0x0c90,
+	0x2001, 0x0005, 0x900e, 0x04b8, 0x2001, 0x0028, 0x900e, 0x0498,
+	0x9082, 0x0006, 0x1290, 0x080c, 0x9d98, 0x1160, 0xb8a0, 0x9084,
+	0xff80, 0x1140, 0xb900, 0xd1fc, 0x0990, 0x2001, 0x0029, 0x2009,
+	0x1000, 0x0408, 0x2001, 0x0028, 0x00a8, 0x2009, 0x180c, 0x210c,
+	0xd18c, 0x0118, 0x2001, 0x0004, 0x0068, 0xd184, 0x0118, 0x2001,
+	0x0004, 0x0040, 0x2001, 0x0029, 0xb900, 0xd1fc, 0x0118, 0x2009,
+	0x1000, 0x0048, 0x900e, 0x0038, 0x2001, 0x0029, 0x900e, 0x0018,
+	0x2001, 0x0029, 0x900e, 0x9005, 0x012e, 0x0005, 0x2001, 0x180c,
+	0x2004, 0xd084, 0x19d0, 0x9188, 0x1000, 0x2104, 0x905d, 0x09a8,
+	0x080c, 0x655b, 0x1990, 0xb800, 0xd0bc, 0x0978, 0x0804, 0x5d67,
+	0x080c, 0x63d3, 0x0904, 0x5d80, 0x0804, 0x5d6b, 0x00b6, 0x00e6,
+	0x0126, 0x2091, 0x8000, 0xa974, 0x9182, 0x0800, 0x1a04, 0x5e51,
+	0x9188, 0x1000, 0x2104, 0x905d, 0x0904, 0x5e29, 0xb8a0, 0x9086,
+	0x007f, 0x0178, 0x080c, 0x6563, 0x0160, 0xa994, 0x81ff, 0x0130,
+	0x908e, 0x0004, 0x0130, 0x908e, 0x0005, 0x0118, 0x080c, 0x655b,
+	0x1598, 0xa87c, 0xd0fc, 0x01e0, 0xa894, 0x9005, 0x01c8, 0x2060,
+	0x0026, 0x2010, 0x080c, 0xbaec, 0x002e, 0x1120, 0x2001, 0x0008,
+	0x0804, 0x5e53, 0x6020, 0x9086, 0x000a, 0x0120, 0x2001, 0x0008,
+	0x0804, 0x5e53, 0x601a, 0x6003, 0x0008, 0x2900, 0x6016, 0x0058,
+	0x080c, 0x9dc3, 0x05e8, 0x2b00, 0x6012, 0x2900, 0x6016, 0x600b,
+	0xffff, 0x6023, 0x000a, 0x2009, 0x0003, 0x080c, 0x9e93, 0x9006,
+	0x0458, 0x2001, 0x0028, 0x0438, 0x9082, 0x0006, 0x1290, 0x080c,
+	0x9d98, 0x1160, 0xb8a0, 0x9084, 0xff80, 0x1140, 0xb900, 0xd1fc,
+	0x0900, 0x2001, 0x0029, 0x2009, 0x1000, 0x00a8, 0x2001, 0x0028,
+	0x0090, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004,
+	0x0050, 0xd184, 0x0118, 0x2001, 0x0004, 0x0028, 0x2001, 0x0029,
+	0x0010, 0x2001, 0x0029, 0x9005, 0x012e, 0x00ee, 0x00be, 0x0005,
+	0x2001, 0x002c, 0x0cc0, 0x00f6, 0x00b6, 0x0126, 0x2091, 0x8000,
+	0xa8e0, 0x9005, 0x1550, 0xa8dc, 0x9082, 0x0101, 0x1630, 0xa8c8,
+	0x9005, 0x1518, 0xa8c4, 0x9082, 0x0101, 0x12f8, 0xa974, 0x2079,
+	0x1800, 0x9182, 0x0800, 0x12e8, 0x7830, 0x9084, 0x0003, 0x1130,
+	0xaa98, 0xab94, 0xa878, 0x9084, 0x0007, 0x00ea, 0x7930, 0xd18c,
+	0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004,
+	0x0010, 0x2001, 0x0029, 0x900e, 0x0038, 0x2001, 0x002c, 0x900e,
+	0x0018, 0x2001, 0x0029, 0x900e, 0x9006, 0x0008, 0x9005, 0x012e,
+	0x00be, 0x00fe, 0x0005, 0x5ee8, 0x5ea3, 0x5eba, 0x5ee8, 0x5ee8,
+	0x5ee8, 0x5ee8, 0x5ee8, 0x2100, 0x9082, 0x007e, 0x1278, 0x080c,
+	0x61d7, 0x0148, 0x9046, 0xb810, 0x9306, 0x1904, 0x5ef0, 0xb814,
+	0x9206, 0x15f0, 0x0028, 0xbb12, 0xba16, 0x0010, 0x080c, 0x478c,
+	0x0150, 0x04b0, 0x080c, 0x6237, 0x1598, 0xb810, 0x9306, 0x1580,
+	0xb814, 0x9206, 0x1568, 0x080c, 0x9dc3, 0x0530, 0x2b00, 0x6012,
+	0x080c, 0xbf73, 0x2900, 0x6016, 0x600b, 0xffff, 0x6023, 0x000a,
+	0xa878, 0x9086, 0x0001, 0x1170, 0x080c, 0x2fd7, 0x9006, 0x080c,
+	0x6174, 0x2001, 0x0002, 0x080c, 0x6188, 0x2001, 0x0200, 0xb86e,
+	0xb893, 0x0002, 0x2009, 0x0003, 0x080c, 0x9e93, 0x9006, 0x0068,
+	0x2001, 0x0001, 0x900e, 0x0038, 0x2001, 0x002c, 0x900e, 0x0018,
+	0x2001, 0x0028, 0x900e, 0x9005, 0x0000, 0x012e, 0x00be, 0x00fe,
+	0x0005, 0x00b6, 0x00f6, 0x00e6, 0x0126, 0x2091, 0x8000, 0xa894,
+	0x90c6, 0x0015, 0x0904, 0x60c5, 0x90c6, 0x0056, 0x0904, 0x60c9,
+	0x90c6, 0x0066, 0x0904, 0x60cd, 0x90c6, 0x0067, 0x0904, 0x60d1,
+	0x90c6, 0x0068, 0x0904, 0x60d5, 0x90c6, 0x0071, 0x0904, 0x60d9,
+	0x90c6, 0x0074, 0x0904, 0x60dd, 0x90c6, 0x007c, 0x0904, 0x60e1,
+	0x90c6, 0x007e, 0x0904, 0x60e5, 0x90c6, 0x0037, 0x0904, 0x60e9,
+	0x9016, 0x2079, 0x1800, 0xa974, 0x9186, 0x00ff, 0x0904, 0x60c0,
+	0x9182, 0x0800, 0x1a04, 0x60c0, 0x080c, 0x6237, 0x1198, 0xb804,
+	0x9084, 0x00ff, 0x9082, 0x0006, 0x1268, 0xa894, 0x90c6, 0x006f,
+	0x0148, 0x080c, 0x9d98, 0x1904, 0x60a9, 0xb8a0, 0x9084, 0xff80,
+	0x1904, 0x60a9, 0xa894, 0x90c6, 0x006f, 0x0158, 0x90c6, 0x005e,
+	0x0904, 0x6009, 0x90c6, 0x0064, 0x0904, 0x6032, 0x2008, 0x0804,
+	0x5fcc, 0xa998, 0xa8b0, 0x2040, 0x080c, 0x9d98, 0x1120, 0x9182,
+	0x007f, 0x0a04, 0x5fcc, 0x9186, 0x00ff, 0x0904, 0x5fcc, 0x9182,
+	0x0800, 0x1a04, 0x5fcc, 0xaaa0, 0xab9c, 0x7878, 0x9306, 0x1188,
+	0x787c, 0x0096, 0x924e, 0x1128, 0x2208, 0x2310, 0x009e, 0x0804,
+	0x5fcc, 0x99cc, 0xff00, 0x009e, 0x1120, 0x2208, 0x2310, 0x0804,
+	0x5fcc, 0x080c, 0x478c, 0x0904, 0x5fd5, 0x900e, 0x9016, 0x90c6,
+	0x4000, 0x1558, 0x0006, 0x080c, 0x6457, 0x1108, 0xc185, 0xb800,
+	0xd0bc, 0x0108, 0xc18d, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c,
+	0x9080, 0x0031, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006,
+	0x2098, 0x080c, 0x0f68, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c,
+	0x9080, 0x0035, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x000a,
+	0x2098, 0x080c, 0x0f68, 0x000e, 0x00c8, 0x90c6, 0x4007, 0x1110,
+	0x2408, 0x00a0, 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0070,
+	0x90c6, 0x4009, 0x1108, 0x0050, 0x90c6, 0x4006, 0x0138, 0x2001,
+	0x4005, 0x2009, 0x000a, 0x0010, 0x2001, 0x4006, 0xa896, 0xa99a,
+	0xaa9e, 0x2001, 0x0030, 0x900e, 0x0470, 0x080c, 0x9dc3, 0x1130,
+	0x2001, 0x4005, 0x2009, 0x0003, 0x9016, 0x0c80, 0x2b00, 0x6012,
+	0x080c, 0xbf73, 0x2900, 0x6016, 0x6023, 0x0001, 0xa868, 0xd88c,
+	0x0108, 0xc0f5, 0xa86a, 0x0126, 0x2091, 0x8000, 0x080c, 0x2fd7,
+	0x012e, 0x9006, 0x080c, 0x6174, 0x2001, 0x0002, 0x080c, 0x6188,
+	0x2009, 0x0002, 0x080c, 0x9e93, 0xa8b0, 0xd094, 0x0118, 0xb8bc,
+	0xc08d, 0xb8be, 0x9006, 0x9005, 0x012e, 0x00ee, 0x00fe, 0x00be,
+	0x0005, 0x080c, 0x5393, 0x0118, 0x2009, 0x0007, 0x00f8, 0xa998,
+	0xaeb0, 0x080c, 0x6237, 0x1904, 0x5fc7, 0x9186, 0x007f, 0x0130,
+	0x080c, 0x655b, 0x0118, 0x2009, 0x0009, 0x0080, 0x0096, 0x080c,
+	0x0feb, 0x1120, 0x009e, 0x2009, 0x0002, 0x0040, 0x2900, 0x009e,
+	0xa806, 0x080c, 0xbce4, 0x19b0, 0x2009, 0x0003, 0x2001, 0x4005,
+	0x0804, 0x5fce, 0xa998, 0xaeb0, 0x080c, 0x6237, 0x1904, 0x5fc7,
+	0x0096, 0x080c, 0x0feb, 0x1128, 0x009e, 0x2009, 0x0002, 0x0804,
+	0x6086, 0x2900, 0x009e, 0xa806, 0x0096, 0x2048, 0x20a9, 0x002b,
+	0xb8b4, 0x20e0, 0xb8b8, 0x2098, 0xa860, 0x20e8, 0xa85c, 0x9080,
+	0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080, 0x0006, 0x20a0,
+	0xbbb8, 0x9398, 0x0006, 0x2398, 0x080c, 0x0f68, 0x009e, 0xa87b,
+	0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0xd684, 0x1168, 0x080c,
+	0x537f, 0xd0b4, 0x1118, 0xa89b, 0x000b, 0x00e0, 0xb800, 0xd08c,
+	0x0118, 0xa89b, 0x000c, 0x00b0, 0x080c, 0x655b, 0x0118, 0xa89b,
+	0x0009, 0x0080, 0x080c, 0x5393, 0x0118, 0xa89b, 0x0007, 0x0050,
+	0x080c, 0xbcc7, 0x1904, 0x6002, 0x2009, 0x0003, 0x2001, 0x4005,
+	0x0804, 0x5fce, 0xa87b, 0x0030, 0xa897, 0x4005, 0xa804, 0x8006,
+	0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002,
+	0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000,
+	0x2041, 0x122f, 0x080c, 0xa31b, 0x1904, 0x6002, 0x2009, 0x0002,
+	0x08e8, 0x2001, 0x0028, 0x900e, 0x0804, 0x6003, 0x2009, 0x180c,
+	0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118,
+	0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x900e, 0x0804, 0x6003,
+	0x2001, 0x0029, 0x900e, 0x0804, 0x6003, 0x080c, 0x3555, 0x0804,
+	0x6004, 0x080c, 0x50bc, 0x0804, 0x6004, 0x080c, 0x4325, 0x0804,
+	0x6004, 0x080c, 0x439e, 0x0804, 0x6004, 0x080c, 0x43fa, 0x0804,
+	0x6004, 0x080c, 0x4848, 0x0804, 0x6004, 0x080c, 0x4af4, 0x0804,
+	0x6004, 0x080c, 0x4d27, 0x0804, 0x6004, 0x080c, 0x4f20, 0x0804,
+	0x6004, 0x080c, 0x3765, 0x0804, 0x6004, 0x00b6, 0xa974, 0xae78,
+	0x9684, 0x3fff, 0x9082, 0x4000, 0x1618, 0x9182, 0x0800, 0x1268,
+	0x9188, 0x1000, 0x2104, 0x905d, 0x0140, 0x080c, 0x655b, 0x1148,
+	0x00e9, 0x080c, 0x6362, 0x9006, 0x00b0, 0x2001, 0x0028, 0x900e,
+	0x0090, 0x9082, 0x0006, 0x1240, 0xb900, 0xd1fc, 0x0d88, 0x2001,
+	0x0029, 0x2009, 0x1000, 0x0038, 0x2001, 0x0029, 0x900e, 0x0018,
+	0x2001, 0x0029, 0x900e, 0x9005, 0x00be, 0x0005, 0x0126, 0x2091,
+	0x8000, 0xb850, 0x900d, 0x0150, 0x2900, 0x0096, 0x2148, 0xa802,
+	0x009e, 0xa803, 0x0000, 0xb852, 0x012e, 0x0005, 0x2900, 0xb852,
+	0xb84e, 0xa803, 0x0000, 0x0cc0, 0x0126, 0x2091, 0x8000, 0xb84c,
+	0x9005, 0x0170, 0x00e6, 0x2071, 0x19b8, 0x7004, 0x9086, 0x0002,
+	0x0168, 0x00ee, 0xb84c, 0xa802, 0x2900, 0xb84e, 0x012e, 0x0005,
+	0x2900, 0xb852, 0xb84e, 0xa803, 0x0000, 0x0cc0, 0x701c, 0x9b06,
+	0x1d80, 0xb84c, 0x00a6, 0x2050, 0xb000, 0xa802, 0x2900, 0xb002,
+	0x00ae, 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0xb84c,
+	0x904d, 0x0130, 0xa800, 0x9005, 0x1108, 0xb852, 0xb84e, 0x9905,
+	0x012e, 0x0005, 0xb84c, 0x904d, 0x0130, 0xa800, 0x9005, 0x1108,
+	0xb852, 0xb84e, 0x9905, 0x0005, 0x00b6, 0x0126, 0x00c6, 0x0026,
+	0x2091, 0x8000, 0x6210, 0x2258, 0xba00, 0x9005, 0x0110, 0xc285,
+	0x0008, 0xc284, 0xba02, 0x002e, 0x00ce, 0x012e, 0x00be, 0x0005,
+	0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6210, 0x2258, 0xba04,
+	0x0006, 0x9086, 0x0006, 0x1170, 0xb89c, 0xd0ac, 0x0158, 0x080c,
+	0x6557, 0x0140, 0x9284, 0xff00, 0x8007, 0x9086, 0x0007, 0x1110,
+	0x2011, 0x0600, 0x000e, 0x9294, 0xff00, 0x9215, 0xba06, 0x0006,
+	0x9086, 0x0006, 0x1120, 0xba90, 0x82ff, 0x090c, 0x0db4, 0x000e,
+	0x00ce, 0x012e, 0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6, 0x2091,
+	0x8000, 0x6210, 0x2258, 0xba04, 0x0006, 0x9086, 0x0006, 0x1168,
+	0xb89c, 0xd0a4, 0x0150, 0x080c, 0x6553, 0x1138, 0x9284, 0x00ff,
+	0x9086, 0x0007, 0x1110, 0x2011, 0x0006, 0x000e, 0x9294, 0x00ff,
+	0x8007, 0x9215, 0xba06, 0x00ce, 0x012e, 0x00be, 0x0005, 0x9182,
+	0x0800, 0x0218, 0x9085, 0x0001, 0x0005, 0x00d6, 0x0026, 0x9190,
+	0x1000, 0x2204, 0x905d, 0x1180, 0x0096, 0x080c, 0x0feb, 0x2958,
+	0x009e, 0x0160, 0x2b00, 0x2012, 0xb85c, 0xb8ba, 0xb860, 0xb8b6,
+	0x9006, 0xb8a6, 0x080c, 0x5ce4, 0x9006, 0x0010, 0x9085, 0x0001,
+	0x002e, 0x00de, 0x0005, 0x00b6, 0x0096, 0x0126, 0x2091, 0x8000,
+	0x0026, 0x9182, 0x0800, 0x0218, 0x9085, 0x0001, 0x0458, 0x00d6,
+	0x9190, 0x1000, 0x2204, 0x905d, 0x0518, 0x2013, 0x0000, 0xb8a4,
+	0x904d, 0x0110, 0x080c, 0x101d, 0x00d6, 0x00c6, 0xb8ac, 0x2060,
+	0x8cff, 0x0168, 0x600c, 0x0006, 0x6014, 0x2048, 0x080c, 0xbafe,
+	0x0110, 0x080c, 0x0f9d, 0x080c, 0x9e19, 0x00ce, 0x0c88, 0x00ce,
+	0x00de, 0x2b48, 0xb8b8, 0xb85e, 0xb8b4, 0xb862, 0x080c, 0x102d,
+	0x00de, 0x9006, 0x002e, 0x012e, 0x009e, 0x00be, 0x0005, 0x0016,
+	0x9182, 0x0800, 0x0218, 0x9085, 0x0001, 0x0030, 0x9188, 0x1000,
+	0x2104, 0x905d, 0x0dc0, 0x9006, 0x001e, 0x0005, 0x00d6, 0x0156,
+	0x0136, 0x0146, 0x9006, 0xb80a, 0xb80e, 0xb800, 0xc08c, 0xb802,
+	0x080c, 0x6fa7, 0x1510, 0xb8a0, 0x9086, 0x007e, 0x0120, 0x080c,
+	0x9d98, 0x11d8, 0x0078, 0x7040, 0xd0e4, 0x01b8, 0x00c6, 0x2061,
+	0x1953, 0x7048, 0x2062, 0x704c, 0x6006, 0x7050, 0x600a, 0x7054,
+	0x600e, 0x00ce, 0x703c, 0x2069, 0x0140, 0x9005, 0x1110, 0x2001,
+	0x0001, 0x6886, 0x2069, 0x1800, 0x68b2, 0x7040, 0xb85e, 0x7048,
+	0xb862, 0x704c, 0xb866, 0x20e1, 0x0000, 0x2099, 0x0276, 0xb8b4,
+	0x20e8, 0xb8b8, 0x9088, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x4003,
+	0x2099, 0x027a, 0x9088, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x4003,
+	0x2069, 0x0200, 0x6817, 0x0001, 0x7040, 0xb86a, 0x7144, 0xb96e,
+	0x7048, 0xb872, 0x7050, 0xb876, 0x2069, 0x0200, 0x6817, 0x0000,
+	0xb8a0, 0x9086, 0x007e, 0x1110, 0x7144, 0xb96e, 0x9182, 0x0211,
+	0x1218, 0x2009, 0x0008, 0x0400, 0x9182, 0x0259, 0x1218, 0x2009,
+	0x0007, 0x00d0, 0x9182, 0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0,
+	0x9182, 0x0349, 0x1218, 0x2009, 0x0005, 0x0070, 0x9182, 0x0421,
+	0x1218, 0x2009, 0x0004, 0x0040, 0x9182, 0x0581, 0x1218, 0x2009,
+	0x0003, 0x0010, 0x2009, 0x0002, 0xb992, 0x014e, 0x013e, 0x015e,
+	0x00de, 0x0005, 0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, 0x7034,
+	0xb896, 0x703c, 0xb89a, 0x7054, 0xb89e, 0x0036, 0xbbbc, 0xc384,
+	0xba00, 0x2009, 0x1873, 0x210c, 0xd0bc, 0x0120, 0xd1ec, 0x0110,
+	0xc2ad, 0x0008, 0xc2ac, 0xd0c4, 0x0148, 0xd1e4, 0x0138, 0xc2bd,
+	0xd0cc, 0x0128, 0xd38c, 0x1108, 0xc385, 0x0008, 0xc2bc, 0xba02,
+	0xbbbe, 0x003e, 0x00ee, 0x002e, 0x001e, 0x0005, 0x0096, 0x0126,
+	0x2091, 0x8000, 0xb8a4, 0x904d, 0x0578, 0xa900, 0x81ff, 0x15c0,
+	0xaa04, 0x9282, 0x0010, 0x16c8, 0x0136, 0x0146, 0x01c6, 0x01d6,
+	0x8906, 0x8006, 0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0,
+	0x9080, 0x0004, 0x2098, 0x2009, 0x0010, 0x20a9, 0x0001, 0x4002,
+	0x9086, 0xffff, 0x0120, 0x8109, 0x1dd0, 0x080c, 0x0db4, 0x3c00,
+	0x20e8, 0x3300, 0x8001, 0x20a0, 0x4604, 0x8210, 0xaa06, 0x01de,
+	0x01ce, 0x014e, 0x013e, 0x0060, 0x080c, 0x0feb, 0x0170, 0x2900,
+	0xb8a6, 0xa803, 0x0000, 0x080c, 0x63f3, 0xa807, 0x0001, 0xae12,
+	0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0126,
+	0x2091, 0x8000, 0x0096, 0xb8a4, 0x904d, 0x0188, 0xa800, 0x9005,
+	0x1150, 0x080c, 0x6402, 0x1158, 0xa804, 0x908a, 0x0002, 0x0218,
+	0x8001, 0xa806, 0x0020, 0x080c, 0x101d, 0xb8a7, 0x0000, 0x009e,
+	0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x83e6, 0x012e,
+	0x0005, 0x901e, 0x0010, 0x2019, 0x0001, 0x900e, 0x0126, 0x2091,
+	0x8000, 0xb84c, 0x2048, 0xb800, 0xd0dc, 0x1170, 0x89ff, 0x0500,
+	0x83ff, 0x0120, 0xa878, 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406,
+	0x1118, 0xa870, 0x9506, 0x0120, 0x2908, 0xa800, 0x2048, 0x0c70,
+	0x080c, 0x9797, 0xaa00, 0xb84c, 0x9906, 0x1110, 0xba4e, 0x0020,
+	0x00a6, 0x2150, 0xb202, 0x00ae, 0x82ff, 0x1110, 0xb952, 0x89ff,
+	0x012e, 0x0005, 0x9016, 0x0489, 0x1110, 0x2011, 0x0001, 0x0005,
+	0x080c, 0x6457, 0x0128, 0x080c, 0xbbbb, 0x0010, 0x9085, 0x0001,
+	0x0005, 0x080c, 0x6457, 0x0128, 0x080c, 0xbb60, 0x0010, 0x9085,
+	0x0001, 0x0005, 0x080c, 0x6457, 0x0128, 0x080c, 0xbbb8, 0x0010,
+	0x9085, 0x0001, 0x0005, 0x080c, 0x6457, 0x0128, 0x080c, 0xbb7f,
+	0x0010, 0x9085, 0x0001, 0x0005, 0x080c, 0x6457, 0x0128, 0x080c,
+	0xbbfc, 0x0010, 0x9085, 0x0001, 0x0005, 0xb8a4, 0x900d, 0x1118,
+	0x9085, 0x0001, 0x0005, 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8,
+	0x890e, 0x810e, 0x810f, 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0,
+	0x9080, 0x0004, 0x2098, 0x20a9, 0x0001, 0x2009, 0x0010, 0x4002,
+	0x9606, 0x0128, 0x8109, 0x1dd8, 0x9085, 0x0001, 0x0008, 0x9006,
+	0x01ce, 0x013e, 0x0005, 0x0146, 0x01d6, 0xa860, 0x20e8, 0xa85c,
+	0x9080, 0x0004, 0x20a0, 0x20a9, 0x0010, 0x2009, 0xffff, 0x4104,
+	0x01de, 0x014e, 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e,
+	0x810e, 0x810f, 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080,
+	0x0004, 0x2098, 0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606,
+	0x0128, 0x8109, 0x1dd8, 0x9085, 0x0001, 0x0068, 0x0146, 0x01d6,
+	0x3300, 0x8001, 0x20a0, 0x3c00, 0x20e8, 0x2001, 0xffff, 0x4004,
+	0x01de, 0x014e, 0x9006, 0x01ce, 0x013e, 0x0005, 0x0096, 0x0126,
+	0x2091, 0x8000, 0xb8a4, 0x904d, 0x1128, 0x080c, 0x0feb, 0x0168,
+	0x2900, 0xb8a6, 0x080c, 0x63f3, 0xa803, 0x0001, 0xa807, 0x0000,
+	0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0096,
+	0x0126, 0x2091, 0x8000, 0xb8a4, 0x904d, 0x0130, 0xb8a7, 0x0000,
+	0x080c, 0x101d, 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0xb89c,
+	0xd0a4, 0x0005, 0x00b6, 0x00f6, 0x080c, 0x6fa7, 0x01b0, 0x71c0,
+	0x81ff, 0x1198, 0x71d8, 0xd19c, 0x0180, 0x2001, 0x007e, 0x9080,
+	0x1000, 0x2004, 0x905d, 0x0148, 0xb804, 0x9084, 0x00ff, 0x9086,
+	0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x2079, 0x1853, 0x7804,
+	0x00d0, 0x0156, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x6237,
+	0x1168, 0xb804, 0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118,
+	0x9086, 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e, 0x8108,
+	0x1f04, 0x647d, 0x015e, 0x080c, 0x6519, 0x0120, 0x2001, 0x1956,
+	0x200c, 0x0030, 0x2079, 0x1853, 0x7804, 0x0030, 0x2009, 0x07d0,
+	0x2011, 0x64a7, 0x080c, 0x80a2, 0x00fe, 0x00be, 0x0005, 0x00b6,
+	0x2011, 0x64a7, 0x080c, 0x8010, 0x080c, 0x6519, 0x01d8, 0x2001,
+	0x107e, 0x2004, 0x2058, 0xb900, 0xc1ec, 0xb902, 0x080c, 0x6557,
+	0x0130, 0x2009, 0x07d0, 0x2011, 0x64a7, 0x080c, 0x80a2, 0x00e6,
+	0x2071, 0x1800, 0x9006, 0x707a, 0x705c, 0x707e, 0x080c, 0x2dbb,
+	0x00ee, 0x04b0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016,
+	0x080c, 0x6237, 0x1538, 0xb800, 0xd0ec, 0x0520, 0x0046, 0xbaa0,
+	0x2220, 0x9006, 0x2009, 0x0029, 0x080c, 0xd50a, 0xb800, 0xc0e5,
+	0xc0ec, 0xb802, 0x080c, 0x6553, 0x2001, 0x0707, 0x1128, 0xb804,
+	0x9084, 0x00ff, 0x9085, 0x0700, 0xb806, 0x2019, 0x0029, 0x080c,
+	0x8549, 0x0076, 0x903e, 0x080c, 0x8441, 0x900e, 0x080c, 0xd27b,
+	0x007e, 0x004e, 0x001e, 0x8108, 0x1f04, 0x64cf, 0x00ce, 0x015e,
+	0x00be, 0x0005, 0x00b6, 0x6010, 0x2058, 0xb800, 0xc0ec, 0xb802,
+	0x00be, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ac,
+	0x0005, 0x6010, 0x00b6, 0x905d, 0x0108, 0xb800, 0x00be, 0xd0bc,
+	0x0005, 0x00b6, 0x00f6, 0x2001, 0x107e, 0x2004, 0x905d, 0x0110,
+	0xb800, 0xd0ec, 0x00fe, 0x00be, 0x0005, 0x0126, 0x0026, 0x2091,
+	0x8000, 0x0006, 0xbaa0, 0x9290, 0x1000, 0x2204, 0x9b06, 0x190c,
+	0x0db4, 0x000e, 0xba00, 0x9005, 0x0110, 0xc2fd, 0x0008, 0xc2fc,
+	0xba02, 0x002e, 0x012e, 0x0005, 0x2011, 0x1836, 0x2204, 0xd0cc,
+	0x0138, 0x2001, 0x1954, 0x200c, 0x2011, 0x6549, 0x080c, 0x80a2,
+	0x0005, 0x2011, 0x6549, 0x080c, 0x8010, 0x2011, 0x1836, 0x2204,
+	0xc0cc, 0x2012, 0x0005, 0x080c, 0x537f, 0xd0ac, 0x0005, 0x080c,
+	0x537f, 0xd0a4, 0x0005, 0x0016, 0xb904, 0x9184, 0x00ff, 0x908e,
+	0x0006, 0x001e, 0x0005, 0x0016, 0xb904, 0x9184, 0xff00, 0x8007,
+	0x908e, 0x0006, 0x001e, 0x0005, 0x00b6, 0x00f6, 0x080c, 0xc1f9,
+	0x0158, 0x70d8, 0x9084, 0x0028, 0x0138, 0x2001, 0x107f, 0x2004,
+	0x905d, 0x0110, 0xb8bc, 0xd094, 0x00fe, 0x00be, 0x0005, 0x0006,
+	0x0016, 0x0036, 0x0046, 0x0076, 0x00b6, 0x2001, 0x1817, 0x203c,
+	0x9780, 0x3131, 0x203d, 0x97bc, 0xff00, 0x873f, 0x9006, 0x2018,
+	0x2008, 0x9284, 0x8000, 0x0110, 0x2019, 0x0001, 0x9294, 0x7fff,
+	0x2100, 0x9706, 0x0190, 0x91a0, 0x1000, 0x2404, 0x905d, 0x0168,
+	0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1138, 0x83ff, 0x0118,
+	0xb89c, 0xd0a4, 0x0110, 0x8211, 0x0158, 0x8108, 0x83ff, 0x0120,
+	0x9182, 0x0800, 0x0e28, 0x0068, 0x9182, 0x007e, 0x0e08, 0x0048,
+	0x00be, 0x007e, 0x004e, 0x003e, 0x001e, 0x9085, 0x0001, 0x000e,
+	0x0005, 0x00be, 0x007e, 0x004e, 0x003e, 0x001e, 0x9006, 0x000e,
+	0x0005, 0x0046, 0x0056, 0x0076, 0x00b6, 0x2100, 0x9084, 0x7fff,
+	0x9080, 0x1000, 0x2004, 0x905d, 0x0130, 0xb804, 0x9084, 0x00ff,
+	0x9086, 0x0006, 0x0550, 0x9184, 0x8000, 0x0580, 0x2001, 0x1817,
+	0x203c, 0x9780, 0x3131, 0x203d, 0x97bc, 0xff00, 0x873f, 0x9006,
+	0x2020, 0x2400, 0x9706, 0x01a0, 0x94a8, 0x1000, 0x2504, 0x905d,
+	0x0178, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1148, 0xb89c,
+	0xd0a4, 0x0130, 0xb814, 0x9206, 0x1118, 0xb810, 0x9306, 0x0128,
+	0x8420, 0x9482, 0x0800, 0x0e28, 0x0048, 0x918c, 0x7fff, 0x00be,
+	0x007e, 0x005e, 0x004e, 0x9085, 0x0001, 0x0005, 0x918c, 0x7fff,
+	0x00be, 0x007e, 0x005e, 0x004e, 0x9006, 0x0005, 0x2071, 0x1906,
+	0x7003, 0x0001, 0x7007, 0x0000, 0x9006, 0x7012, 0x7016, 0x701a,
+	0x701e, 0x700a, 0x7046, 0x2001, 0x1919, 0x2003, 0x0000, 0x0005,
+	0x0016, 0x00e6, 0x2071, 0x191a, 0x900e, 0x710a, 0x080c, 0x537f,
+	0xd0fc, 0x1140, 0x080c, 0x537f, 0x900e, 0xd09c, 0x0108, 0x8108,
+	0x7102, 0x0400, 0x2001, 0x1873, 0x200c, 0x9184, 0x0007, 0x9006,
+	0x0002, 0x6632, 0x6632, 0x6632, 0x6632, 0x6632, 0x6649, 0x6657,
+	0x6632, 0x7003, 0x0003, 0x2009, 0x1874, 0x210c, 0x9184, 0xff00,
+	0x8007, 0x9005, 0x1110, 0x2001, 0x0002, 0x7006, 0x0018, 0x7003,
+	0x0005, 0x0c88, 0x00ee, 0x001e, 0x0005, 0x00e6, 0x2071, 0x0050,
+	0x684c, 0x9005, 0x1150, 0x00e6, 0x2071, 0x1906, 0x7028, 0xc085,
+	0x702a, 0x00ee, 0x9085, 0x0001, 0x0488, 0x6844, 0x9005, 0x0158,
+	0x080c, 0x72fd, 0x6a60, 0x9200, 0x7002, 0x6864, 0x9101, 0x7006,
+	0x9006, 0x7012, 0x7016, 0x6860, 0x7002, 0x6864, 0x7006, 0x6868,
+	0x700a, 0x686c, 0x700e, 0x6844, 0x9005, 0x1110, 0x7012, 0x7016,
+	0x684c, 0x701a, 0x701c, 0x9085, 0x0040, 0x701e, 0x7037, 0x0019,
+	0x702b, 0x0001, 0x00e6, 0x2071, 0x1906, 0x7028, 0xc084, 0x702a,
+	0x7007, 0x0001, 0x700b, 0x0000, 0x00ee, 0x9006, 0x00ee, 0x0005,
+	0xa868, 0xd0fc, 0x11d8, 0x00e6, 0x0026, 0x2001, 0x191a, 0x2004,
+	0x9005, 0x0904, 0x688a, 0xa87c, 0xd0bc, 0x1904, 0x688a, 0xa978,
+	0xa874, 0x9105, 0x1904, 0x688a, 0x2001, 0x191a, 0x2004, 0x0002,
+	0x688a, 0x66e3, 0x671f, 0x671f, 0x688a, 0x671f, 0x0005, 0xa868,
+	0xd0fc, 0x1500, 0x00e6, 0x0026, 0x2009, 0x191a, 0x210c, 0x81ff,
+	0x0904, 0x688a, 0xa87c, 0xd0cc, 0x0904, 0x688a, 0xa880, 0x9084,
+	0x00ff, 0x9086, 0x0001, 0x1904, 0x688a, 0x9186, 0x0003, 0x0904,
+	0x671f, 0x9186, 0x0005, 0x0904, 0x671f, 0xa84f, 0x8021, 0xa853,
+	0x0017, 0x0028, 0x0005, 0xa84f, 0x8020, 0xa853, 0x0016, 0x2071,
+	0x1906, 0x701c, 0x9005, 0x1904, 0x6a4a, 0x0e04, 0x6a95, 0x2071,
+	0x0000, 0xa84c, 0x7082, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036,
+	0xa870, 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084,
+	0x190c, 0x1187, 0x2071, 0x1800, 0x2011, 0x0001, 0xa804, 0x900d,
+	0x702c, 0x1158, 0xa802, 0x2900, 0x702e, 0x70bc, 0x9200, 0x70be,
+	0x080c, 0x7f35, 0x002e, 0x00ee, 0x0005, 0x0096, 0x2148, 0xa904,
+	0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x009e, 0x0c58, 0xa84f,
+	0x0000, 0x00f6, 0x2079, 0x0050, 0x2071, 0x1906, 0xa803, 0x0000,
+	0x7010, 0x9005, 0x1904, 0x680e, 0x782c, 0x908c, 0x0780, 0x190c,
+	0x6bbc, 0x8004, 0x8004, 0x8004, 0x9084, 0x0003, 0x0002, 0x673d,
+	0x680e, 0x6762, 0x67a9, 0x080c, 0x0db4, 0x2071, 0x1800, 0x2900,
+	0x7822, 0xa804, 0x900d, 0x1170, 0x2071, 0x19cb, 0x703c, 0x9005,
+	0x1328, 0x2001, 0x191b, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e,
+	0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210,
+	0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c,
+	0x7f35, 0x0c10, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d,
+	0x1580, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148,
+	0x2009, 0x182f, 0x210c, 0x918a, 0x0040, 0x0218, 0x7022, 0x00ee,
+	0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc,
+	0x8000, 0x70be, 0x080c, 0x7f35, 0x782c, 0x9094, 0x0780, 0x190c,
+	0x6bbc, 0xd0a4, 0x19f0, 0x2071, 0x19cb, 0x703c, 0x9005, 0x1328,
+	0x2001, 0x191b, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee,
+	0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900,
+	0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7f35,
+	0x0800, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c,
+	0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x7f35,
+	0x782c, 0x9094, 0x0780, 0x190c, 0x6bbc, 0xd0a4, 0x1d60, 0x00ee,
+	0x782c, 0x9094, 0x0780, 0x190c, 0x6bbc, 0xd09c, 0x11a0, 0x009e,
+	0x2900, 0x7822, 0xa804, 0x900d, 0x1560, 0x2071, 0x19cb, 0x703c,
+	0x9005, 0x1328, 0x2001, 0x191b, 0x2004, 0x8005, 0x703e, 0x00fe,
+	0x002e, 0x00ee, 0x0005, 0x009e, 0x2908, 0x7010, 0x8000, 0x7012,
+	0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148,
+	0xa804, 0x900d, 0x1170, 0x2071, 0x19cb, 0x703c, 0x9005, 0x1328,
+	0x2001, 0x191b, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee,
+	0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802,
 	0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be,
-	0x080c, 0x7c7b, 0x00ee, 0x0804, 0x658b, 0xa868, 0xd0fc, 0x1904,
-	0x6633, 0x0096, 0xa804, 0xa807, 0x0000, 0x904d, 0x190c, 0x0f9e,
-	0x009e, 0x0018, 0xa868, 0xd0fc, 0x15f0, 0x00e6, 0x0026, 0xa84f,
-	0x0000, 0x00f6, 0x2079, 0x0050, 0x2071, 0x1800, 0x70e8, 0x8001,
-	0x01d0, 0x1678, 0x2071, 0x1906, 0xa803, 0x0000, 0x7010, 0x9005,
-	0x1904, 0x6731, 0x782c, 0x908c, 0x0780, 0x190c, 0x6929, 0x8004,
-	0x8004, 0x8004, 0x9084, 0x0003, 0x0002, 0x6634, 0x6731, 0x664f,
-	0x66c0, 0x080c, 0x0db4, 0x70eb, 0x0fa0, 0x71e4, 0x8107, 0x9106,
-	0x9094, 0x00c0, 0x9184, 0xff3f, 0x9205, 0x70e6, 0x3b08, 0x3a00,
-	0x9104, 0x918d, 0x00c0, 0x21d8, 0x9084, 0xff3f, 0x9205, 0x20d0,
-	0x0888, 0x70ea, 0x0878, 0x0005, 0x2071, 0x1800, 0x2900, 0x7822,
-	0xa804, 0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016,
-	0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8,
-	0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7c7b, 0x0c60, 0x2071,
-	0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1904, 0x66af, 0x7830,
-	0x8007, 0x9084, 0x001f, 0x9082, 0x0005, 0x1220, 0x00fe, 0x002e,
-	0x00ee, 0x0005, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c,
-	0x1148, 0x2009, 0x182f, 0x210c, 0x918a, 0x0040, 0x0218, 0x7022,
-	0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e,
-	0x70bc, 0x8000, 0x70be, 0x080c, 0x7c7b, 0x782c, 0x9094, 0x0780,
-	0x190c, 0x6929, 0xd0a4, 0x19f0, 0x0e04, 0x66a6, 0x7838, 0x7938,
-	0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013,
-	0x00de, 0x2001, 0x1917, 0x200c, 0xc184, 0x2102, 0x2091, 0x4080,
-	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x117e, 0x2009, 0x1919,
-	0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2001, 0x1917,
-	0x200c, 0xc185, 0x2102, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016,
-	0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8,
-	0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7c7b, 0x0804, 0x6662,
-	0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802,
-	0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x7c7b, 0x782c,
-	0x9094, 0x0780, 0x190c, 0x6929, 0xd0a4, 0x1d60, 0x00ee, 0x0e04,
-	0x6704, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000,
-	0x6836, 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, 0x7046, 0x2091,
-	0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x117e, 0x2009,
-	0x1919, 0x200b, 0x0000, 0x782c, 0x9094, 0x0780, 0x190c, 0x6929,
-	0xd09c, 0x1170, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x11e0,
-	0x00fe, 0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x0c58,
-	0x009e, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a,
-	0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1120,
-	0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c,
+	0x080c, 0x7f35, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2908, 0x7010,
+	0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008,
+	0x711e, 0x2148, 0xa804, 0x900d, 0x1904, 0x6863, 0x782c, 0x9094,
+	0x0780, 0x190c, 0x6bbc, 0xd09c, 0x1198, 0x701c, 0x904d, 0x0180,
+	0x7010, 0x8001, 0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900,
+	0x7822, 0x782c, 0x9094, 0x0780, 0x190c, 0x6bbc, 0xd09c, 0x0d68,
+	0x782c, 0x9094, 0x0780, 0x190c, 0x6bbc, 0xd0a4, 0x01b0, 0x00e6,
+	0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e,
+	0x70bc, 0x8000, 0x70be, 0x080c, 0x7f35, 0x782c, 0x9094, 0x0780,
+	0x190c, 0x6bbc, 0xd0a4, 0x1d60, 0x00ee, 0x2071, 0x19cb, 0x703c,
+	0x9005, 0x1328, 0x2001, 0x191b, 0x2004, 0x8005, 0x703e, 0x00fe,
+	0x002e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, 0x9016, 0x702c,
 	0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e,
-	0x70bc, 0x9200, 0x70be, 0x080c, 0x7c7b, 0x00fe, 0x002e, 0x00ee,
-	0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a,
-	0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904,
-	0x67a2, 0x782c, 0x9094, 0x0780, 0x190c, 0x6929, 0xd09c, 0x11b0,
-	0x701c, 0x904d, 0x0198, 0xa84c, 0x9005, 0x1180, 0x7010, 0x8001,
-	0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c,
-	0x9094, 0x0780, 0x190c, 0x6929, 0xd09c, 0x0d50, 0x782c, 0x9094,
-	0x0780, 0x190c, 0x6929, 0xd0a4, 0x05c8, 0x00e6, 0x7824, 0x2048,
-	0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000,
-	0x70be, 0x080c, 0x7c7b, 0x782c, 0x9094, 0x0780, 0x190c, 0x6929,
-	0xd0a4, 0x1d60, 0x00ee, 0x0e04, 0x679b, 0x7838, 0x7938, 0x910e,
-	0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de,
-	0x7044, 0xc084, 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
-	0xd084, 0x190c, 0x117e, 0x2009, 0x1919, 0x200b, 0x0000, 0x00fe,
-	0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x00fe, 0x002e,
-	0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148,
-	0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc,
-	0x9200, 0x70be, 0x080c, 0x7c7b, 0x00ee, 0x0804, 0x6741, 0x2071,
-	0x1906, 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018,
-	0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804,
-	0x900d, 0x1128, 0x1e04, 0x67e2, 0x002e, 0x00ee, 0x0005, 0x2071,
+	0x70bc, 0x9200, 0x70be, 0x080c, 0x7f35, 0x00ee, 0x0804, 0x681e,
+	0xa868, 0xd0fc, 0x1904, 0x68c6, 0x0096, 0xa804, 0xa807, 0x0000,
+	0x904d, 0x190c, 0x0f9d, 0x009e, 0x0018, 0xa868, 0xd0fc, 0x15f0,
+	0x00e6, 0x0026, 0xa84f, 0x0000, 0x00f6, 0x2079, 0x0050, 0x2071,
+	0x1800, 0x70e8, 0x8001, 0x01d0, 0x1678, 0x2071, 0x1906, 0xa803,
+	0x0000, 0x7010, 0x9005, 0x1904, 0x69c4, 0x782c, 0x908c, 0x0780,
+	0x190c, 0x6bbc, 0x8004, 0x8004, 0x8004, 0x9084, 0x0003, 0x0002,
+	0x68c7, 0x69c4, 0x68e2, 0x6953, 0x080c, 0x0db4, 0x70eb, 0x0fa0,
+	0x71e4, 0x8107, 0x9106, 0x9094, 0x00c0, 0x9184, 0xff3f, 0x9205,
+	0x70e6, 0x3b08, 0x3a00, 0x9104, 0x918d, 0x00c0, 0x21d8, 0x9084,
+	0xff3f, 0x9205, 0x20d0, 0x0888, 0x70ea, 0x0878, 0x0005, 0x2071,
+	0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1120, 0x00fe, 0x002e,
+	0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210,
+	0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c,
+	0x7f35, 0x0c60, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d,
+	0x1904, 0x6942, 0x7830, 0x8007, 0x9084, 0x001f, 0x9082, 0x0005,
+	0x1220, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7824, 0x00e6, 0x2071,
+	0x0040, 0x712c, 0xd19c, 0x1148, 0x2009, 0x182f, 0x210c, 0x918a,
+	0x0040, 0x0218, 0x7022, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c,
+	0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x7f35,
+	0x782c, 0x9094, 0x0780, 0x190c, 0x6bbc, 0xd0a4, 0x19f0, 0x0e04,
+	0x6939, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000,
+	0x6836, 0x6833, 0x0013, 0x00de, 0x2001, 0x1917, 0x200c, 0xc184,
+	0x2102, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c,
+	0x1187, 0x2009, 0x1919, 0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee,
+	0x0005, 0x2001, 0x1917, 0x200c, 0xc185, 0x2102, 0x00fe, 0x002e,
+	0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210,
+	0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c,
+	0x7f35, 0x0804, 0x68f5, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071,
+	0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be,
+	0x080c, 0x7f35, 0x782c, 0x9094, 0x0780, 0x190c, 0x6bbc, 0xd0a4,
+	0x1d60, 0x00ee, 0x0e04, 0x6997, 0x7838, 0x7938, 0x910e, 0x1de0,
+	0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x7044,
+	0xc084, 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084,
+	0x190c, 0x1187, 0x2009, 0x1919, 0x200b, 0x0000, 0x782c, 0x9094,
+	0x0780, 0x190c, 0x6bbc, 0xd09c, 0x1170, 0x009e, 0x2900, 0x7822,
+	0xa804, 0x900d, 0x11e0, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7044,
+	0xc085, 0x7046, 0x0c58, 0x009e, 0x2908, 0x7010, 0x8000, 0x7012,
+	0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148,
+	0xa804, 0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071,
 	0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900,
-	0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7c7b,
-	0x0e04, 0x67cc, 0x2071, 0x1906, 0x701c, 0x2048, 0xa84c, 0x900d,
-	0x0d18, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086,
-	0x7036, 0xa870, 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
-	0xd084, 0x190c, 0x117e, 0x2071, 0x1906, 0x080c, 0x6915, 0x002e,
-	0x00ee, 0x0005, 0x2071, 0x1906, 0xa803, 0x0000, 0x2908, 0x7010,
+	0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7f35,
+	0x00fe, 0x002e, 0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, 0x7012,
+	0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148,
+	0xa804, 0x900d, 0x1904, 0x6a35, 0x782c, 0x9094, 0x0780, 0x190c,
+	0x6bbc, 0xd09c, 0x11b0, 0x701c, 0x904d, 0x0198, 0xa84c, 0x9005,
+	0x1180, 0x7010, 0x8001, 0x7012, 0x1108, 0x701a, 0xa800, 0x701e,
+	0x2900, 0x7822, 0x782c, 0x9094, 0x0780, 0x190c, 0x6bbc, 0xd09c,
+	0x0d50, 0x782c, 0x9094, 0x0780, 0x190c, 0x6bbc, 0xd0a4, 0x05c8,
+	0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900,
+	0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x7f35, 0x782c, 0x9094,
+	0x0780, 0x190c, 0x6bbc, 0xd0a4, 0x1d60, 0x00ee, 0x0e04, 0x6a2e,
+	0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836,
+	0x6833, 0x0013, 0x00de, 0x7044, 0xc084, 0x7046, 0x2091, 0x4080,
+	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1187, 0x2009, 0x1919,
+	0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7044, 0xc085,
+	0x7046, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800,
+	0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff,
+	0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7f35, 0x00ee,
+	0x0804, 0x69d4, 0x2071, 0x1906, 0xa803, 0x0000, 0x2908, 0x7010,
 	0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008,
-	0x711e, 0x2148, 0xa804, 0x900d, 0x1118, 0x002e, 0x00ee, 0x0005,
-	0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210,
-	0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c,
-	0x7c7b, 0x002e, 0x00ee, 0x0005, 0x0006, 0xa87c, 0x0006, 0xa867,
-	0x0103, 0x20a9, 0x001c, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001d,
-	0x20a0, 0x9006, 0x4004, 0x000e, 0x9084, 0x00ff, 0xa87e, 0x000e,
-	0xa87a, 0xa982, 0x0005, 0x2071, 0x1906, 0x7004, 0x0002, 0x684d,
-	0x684e, 0x6914, 0x684e, 0x0db4, 0x6914, 0x0005, 0x2001, 0x191a,
-	0x2004, 0x0002, 0x6858, 0x6858, 0x68ad, 0x68ae, 0x6858, 0x68ae,
-	0x0126, 0x2091, 0x8000, 0x1e0c, 0x6934, 0x701c, 0x904d, 0x01e0,
-	0xa84c, 0x9005, 0x01d8, 0x0e04, 0x687c, 0xa94c, 0x2071, 0x0000,
-	0x7182, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a,
-	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x117e,
-	0x2071, 0x1906, 0x080c, 0x6915, 0x012e, 0x0470, 0x2001, 0x005b,
-	0x2004, 0x9094, 0x0780, 0x190c, 0x6929, 0xd09c, 0x2071, 0x1906,
-	0x1510, 0x2071, 0x1906, 0x700f, 0x0001, 0xa964, 0x9184, 0x00ff,
-	0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108,
-	0x710e, 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, 0x2071,
-	0x1906, 0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e,
-	0x9005, 0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x00d6, 0x2008,
-	0x2069, 0x19c9, 0x683c, 0x9005, 0x0760, 0x0158, 0x9186, 0x0003,
-	0x0540, 0x2001, 0x1814, 0x2004, 0x2009, 0x1a8f, 0x210c, 0x9102,
-	0x1500, 0x0126, 0x2091, 0x8000, 0x2069, 0x0050, 0x693c, 0x6838,
-	0x9106, 0x0190, 0x0e04, 0x68e0, 0x2069, 0x0000, 0x6837, 0x8040,
-	0x6833, 0x0012, 0x6883, 0x8040, 0x2091, 0x4080, 0x2001, 0x0089,
-	0x2004, 0xd084, 0x190c, 0x117e, 0x2069, 0x19c9, 0x683f, 0xffff,
-	0x012e, 0x00de, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x69a5, 0x701c,
-	0x904d, 0x0540, 0x2001, 0x005b, 0x2004, 0x9094, 0x0780, 0x15c9,
-	0xd09c, 0x1500, 0x2071, 0x1906, 0x700f, 0x0001, 0xa964, 0x9184,
-	0x00ff, 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101,
-	0x0108, 0x710e, 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de,
-	0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005,
-	0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x0126, 0x2091, 0x8000,
-	0x701c, 0x904d, 0x0160, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e,
-	0x9005, 0x1108, 0x701a, 0x012e, 0x080c, 0x101e, 0x0005, 0x012e,
-	0x0005, 0x2091, 0x8000, 0x0e04, 0x692b, 0x0006, 0x0016, 0x2001,
-	0x8004, 0x0006, 0x0804, 0x0dbd, 0x0096, 0x00f6, 0x2079, 0x0050,
-	0x7044, 0xd084, 0x01e0, 0xc084, 0x7046, 0x7838, 0x7938, 0x910e,
-	0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de,
-	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x117e,
-	0x2009, 0x1919, 0x200b, 0x0000, 0x00fe, 0x009e, 0x0005, 0x782c,
-	0x9094, 0x0780, 0x1971, 0xd0a4, 0x0db8, 0x2009, 0x1919, 0x2104,
-	0x8000, 0x200a, 0x9082, 0x000f, 0x0e78, 0x00e6, 0x2071, 0x1800,
-	0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, 0x2009,
-	0x182f, 0x210c, 0x918a, 0x0040, 0x0218, 0x7022, 0x00ee, 0x0058,
-	0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000,
-	0x70be, 0x080c, 0x7c7b, 0x782c, 0x9094, 0x0780, 0x190c, 0x6929,
-	0xd0a4, 0x19f0, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069,
-	0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001,
-	0x0089, 0x2004, 0xd084, 0x190c, 0x117e, 0x2009, 0x1919, 0x200b,
-	0x0000, 0x00ee, 0x00fe, 0x009e, 0x0005, 0x00f6, 0x2079, 0x0050,
-	0x7044, 0xd084, 0x01b8, 0xc084, 0x7046, 0x7838, 0x7938, 0x910e,
+	0x711e, 0x2148, 0xa804, 0x900d, 0x1128, 0x1e04, 0x6a75, 0x002e,
+	0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904,
+	0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200,
+	0x70be, 0x080c, 0x7f35, 0x0e04, 0x6a5f, 0x2071, 0x1906, 0x701c,
+	0x2048, 0xa84c, 0x900d, 0x0d18, 0x2071, 0x0000, 0x7182, 0xa850,
+	0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, 0x4080,
+	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1187, 0x2071, 0x1906,
+	0x080c, 0x6ba8, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1906, 0xa803,
+	0x0000, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a,
+	0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1118,
+	0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148,
+	0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc,
+	0x9200, 0x70be, 0x080c, 0x7f35, 0x002e, 0x00ee, 0x0005, 0x0006,
+	0xa87c, 0x0006, 0xa867, 0x0103, 0x20a9, 0x001c, 0xa860, 0x20e8,
+	0xa85c, 0x9080, 0x001d, 0x20a0, 0x9006, 0x4004, 0x000e, 0x9084,
+	0x00ff, 0xa87e, 0x000e, 0xa87a, 0xa982, 0x0005, 0x2071, 0x1906,
+	0x7004, 0x0002, 0x6ae0, 0x6ae1, 0x6ba7, 0x6ae1, 0x0db4, 0x6ba7,
+	0x0005, 0x2001, 0x191a, 0x2004, 0x0002, 0x6aeb, 0x6aeb, 0x6b40,
+	0x6b41, 0x6aeb, 0x6b41, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x6bc7,
+	0x701c, 0x904d, 0x01e0, 0xa84c, 0x9005, 0x01d8, 0x0e04, 0x6b0f,
+	0xa94c, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086,
+	0x7036, 0xa870, 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
+	0xd084, 0x190c, 0x1187, 0x2071, 0x1906, 0x080c, 0x6ba8, 0x012e,
+	0x0470, 0x2001, 0x005b, 0x2004, 0x9094, 0x0780, 0x190c, 0x6bbc,
+	0xd09c, 0x2071, 0x1906, 0x1510, 0x2071, 0x1906, 0x700f, 0x0001,
+	0xa964, 0x9184, 0x00ff, 0x9086, 0x0003, 0x1130, 0x810f, 0x918c,
+	0x00ff, 0x8101, 0x0108, 0x710e, 0x2900, 0x00d6, 0x2069, 0x0050,
+	0x6822, 0x00de, 0x2071, 0x1906, 0x701c, 0x2048, 0x7010, 0x8001,
+	0x7012, 0xa800, 0x701e, 0x9005, 0x1108, 0x701a, 0x012e, 0x0005,
+	0x0005, 0x00d6, 0x2008, 0x2069, 0x19cb, 0x683c, 0x9005, 0x0760,
+	0x0158, 0x9186, 0x0003, 0x0540, 0x2001, 0x1814, 0x2004, 0x2009,
+	0x1a98, 0x210c, 0x9102, 0x1500, 0x0126, 0x2091, 0x8000, 0x2069,
+	0x0050, 0x693c, 0x6838, 0x9106, 0x0190, 0x0e04, 0x6b73, 0x2069,
+	0x0000, 0x6837, 0x8040, 0x6833, 0x0012, 0x6883, 0x8040, 0x2091,
+	0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1187, 0x2069,
+	0x19cb, 0x683f, 0xffff, 0x012e, 0x00de, 0x0126, 0x2091, 0x8000,
+	0x1e0c, 0x6c38, 0x701c, 0x904d, 0x0540, 0x2001, 0x005b, 0x2004,
+	0x9094, 0x0780, 0x15c9, 0xd09c, 0x1500, 0x2071, 0x1906, 0x700f,
+	0x0001, 0xa964, 0x9184, 0x00ff, 0x9086, 0x0003, 0x1130, 0x810f,
+	0x918c, 0x00ff, 0x8101, 0x0108, 0x710e, 0x2900, 0x00d6, 0x2069,
+	0x0050, 0x6822, 0x00de, 0x701c, 0x2048, 0x7010, 0x8001, 0x7012,
+	0xa800, 0x701e, 0x9005, 0x1108, 0x701a, 0x012e, 0x0005, 0x0005,
+	0x0126, 0x2091, 0x8000, 0x701c, 0x904d, 0x0160, 0x7010, 0x8001,
+	0x7012, 0xa800, 0x701e, 0x9005, 0x1108, 0x701a, 0x012e, 0x080c,
+	0x101d, 0x0005, 0x012e, 0x0005, 0x2091, 0x8000, 0x0e04, 0x6bbe,
+	0x0006, 0x0016, 0x2001, 0x8004, 0x0006, 0x0804, 0x0dbd, 0x0096,
+	0x00f6, 0x2079, 0x0050, 0x7044, 0xd084, 0x01e0, 0xc084, 0x7046,
+	0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836,
+	0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
+	0xd084, 0x190c, 0x1187, 0x2009, 0x1919, 0x200b, 0x0000, 0x00fe,
+	0x009e, 0x0005, 0x782c, 0x9094, 0x0780, 0x1971, 0xd0a4, 0x0db8,
+	0x2009, 0x1919, 0x2104, 0x8000, 0x200a, 0x9082, 0x000f, 0x0e78,
+	0x00e6, 0x2071, 0x1800, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c,
+	0xd19c, 0x1148, 0x2009, 0x182f, 0x210c, 0x918a, 0x0040, 0x0218,
+	0x7022, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900,
+	0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x7f35, 0x782c, 0x9094,
+	0x0780, 0x190c, 0x6bbc, 0xd0a4, 0x19f0, 0x7838, 0x7938, 0x910e,
 	0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de,
-	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x117e,
-	0x00fe, 0x0005, 0x782c, 0x9094, 0x0780, 0x190c, 0x6929, 0xd0a4,
-	0x0db8, 0x00e6, 0x2071, 0x1800, 0x7824, 0x2048, 0x702c, 0xa802,
-	0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x7c7b, 0x782c,
-	0x9094, 0x0780, 0x190c, 0x6929, 0xd0a4, 0x1d70, 0x00d6, 0x2069,
-	0x0050, 0x693c, 0x2069, 0x191a, 0x6808, 0x690a, 0x2069, 0x19c9,
-	0x9102, 0x1118, 0x683c, 0x9005, 0x1328, 0x2001, 0x191b, 0x200c,
-	0x810d, 0x693e, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x7094, 0x908a,
-	0x0029, 0x1a0c, 0x0db4, 0x9082, 0x001d, 0x001b, 0x6027, 0x1e00,
-	0x0005, 0x6ac9, 0x6a53, 0x6a6f, 0x6a97, 0x6ab8, 0x6af8, 0x6b0a,
-	0x6a6f, 0x6ae0, 0x6a0e, 0x6a3c, 0x6a0d, 0x0005, 0x00d6, 0x2069,
-	0x0200, 0x6804, 0x9005, 0x1180, 0x6808, 0x9005, 0x1518, 0x7097,
-	0x0028, 0x2069, 0x195e, 0x2d04, 0x7002, 0x080c, 0x6e4d, 0x6028,
-	0x9085, 0x0600, 0x602a, 0x00b0, 0x7097, 0x0028, 0x2069, 0x195e,
-	0x2d04, 0x7002, 0x6028, 0x9085, 0x0600, 0x602a, 0x00e6, 0x0036,
-	0x0046, 0x0056, 0x2071, 0x1a31, 0x080c, 0x18a6, 0x005e, 0x004e,
-	0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804,
-	0x9005, 0x1178, 0x6808, 0x9005, 0x1160, 0x7097, 0x0028, 0x2069,
-	0x195e, 0x2d04, 0x7002, 0x080c, 0x6ee7, 0x6028, 0x9085, 0x0600,
-	0x602a, 0x00de, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, 0x29bc,
-	0x000e, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x6b77, 0xd1d4, 0x1160,
-	0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x7097, 0x0020, 0x080c, 0x6b77,
-	0x0028, 0x7097, 0x001d, 0x0010, 0x7097, 0x001f, 0x0005, 0x2001,
-	0x0088, 0x080c, 0x29bc, 0x6124, 0xd1cc, 0x11d8, 0xd1dc, 0x11b0,
-	0xd1e4, 0x1188, 0x9184, 0x1e00, 0x11c8, 0x60e3, 0x0001, 0x600c,
-	0xc0b4, 0x600e, 0x080c, 0x6d40, 0x2001, 0x0080, 0x080c, 0x29bc,
-	0x7097, 0x0028, 0x0058, 0x7097, 0x001e, 0x0040, 0x7097, 0x001d,
-	0x0028, 0x7097, 0x0020, 0x0010, 0x7097, 0x001f, 0x0005, 0x60e3,
-	0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x6d40, 0x2001, 0x0080,
-	0x080c, 0x29bc, 0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158, 0xd1e4,
-	0x1130, 0x9184, 0x1e00, 0x1158, 0x7097, 0x0028, 0x0040, 0x7097,
-	0x001e, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, 0x001f, 0x0005,
-	0x2001, 0x00a0, 0x080c, 0x29bc, 0x6124, 0xd1dc, 0x1138, 0xd1e4,
-	0x0138, 0x080c, 0x18d0, 0x7097, 0x001e, 0x0010, 0x7097, 0x001d,
-	0x0005, 0x080c, 0x6bfa, 0x6124, 0xd1dc, 0x1188, 0x080c, 0x6b77,
-	0x0016, 0x080c, 0x18d0, 0x001e, 0xd1d4, 0x1128, 0xd1e4, 0x0138,
-	0x7097, 0x001e, 0x0020, 0x7097, 0x001f, 0x080c, 0x6b77, 0x0005,
-	0x0006, 0x2001, 0x00a0, 0x080c, 0x29bc, 0x000e, 0x6124, 0xd1d4,
-	0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x7097,
-	0x001e, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, 0x0021, 0x0005,
-	0x080c, 0x6bfa, 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128, 0xd1e4,
-	0x0140, 0x7097, 0x001e, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097,
-	0x001f, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, 0x29bc, 0x000e,
-	0x6124, 0xd1d4, 0x1178, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4,
-	0x0158, 0x7097, 0x001e, 0x0040, 0x7097, 0x001d, 0x0028, 0x7097,
-	0x0020, 0x0010, 0x7097, 0x001f, 0x0005, 0x0016, 0x00c6, 0x00d6,
-	0x00e6, 0x0126, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800,
-	0x2091, 0x8000, 0x080c, 0x6d14, 0x11d8, 0x2001, 0x180c, 0x200c,
-	0xd1b4, 0x01b0, 0xc1b4, 0x2102, 0x6027, 0x0200, 0x080c, 0x2905,
-	0x6024, 0xd0cc, 0x0148, 0x2001, 0x00a0, 0x080c, 0x29bc, 0x080c,
-	0x6ff8, 0x080c, 0x5a94, 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408,
-	0x080c, 0x6d2e, 0x0150, 0x080c, 0x6d25, 0x1138, 0x2001, 0x0001,
-	0x080c, 0x24b4, 0x080c, 0x6cec, 0x00a0, 0x080c, 0x6bf7, 0x0178,
-	0x2001, 0x0001, 0x080c, 0x24b4, 0x7094, 0x9086, 0x001e, 0x0120,
-	0x7094, 0x9086, 0x0022, 0x1118, 0x7097, 0x0025, 0x0010, 0x7097,
-	0x0021, 0x012e, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026,
-	0x2011, 0x6b88, 0x080c, 0x7e27, 0x002e, 0x0016, 0x0026, 0x2009,
-	0x0064, 0x2011, 0x6b88, 0x080c, 0x7e1e, 0x002e, 0x001e, 0x0005,
-	0x00e6, 0x00f6, 0x0016, 0x080c, 0x90c1, 0x2071, 0x1800, 0x080c,
-	0x6b25, 0x001e, 0x00fe, 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036,
-	0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0126, 0x080c, 0x90c1, 0x2061,
-	0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2091, 0x8000, 0x6028,
-	0xc09c, 0x602a, 0x2011, 0x0003, 0x080c, 0x93f3, 0x2011, 0x0002,
-	0x080c, 0x93fd, 0x080c, 0x92e4, 0x080c, 0x7dd3, 0x0036, 0x901e,
-	0x080c, 0x935a, 0x003e, 0x60e3, 0x0000, 0x080c, 0xd4e3, 0x080c,
-	0xd4fe, 0x2009, 0x0004, 0x080c, 0x290b, 0x080c, 0x2826, 0x2001,
-	0x1800, 0x2003, 0x0004, 0x6027, 0x0008, 0x2011, 0x6b88, 0x080c,
-	0x7e27, 0x080c, 0x6d2e, 0x0118, 0x9006, 0x080c, 0x29bc, 0x080c,
-	0x0b8f, 0x2001, 0x0001, 0x080c, 0x24b4, 0x012e, 0x00fe, 0x00ee,
-	0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x0026, 0x00e6,
-	0x2011, 0x6b95, 0x2071, 0x19c9, 0x701c, 0x9206, 0x1118, 0x7018,
-	0x9005, 0x0110, 0x9085, 0x0001, 0x00ee, 0x002e, 0x0005, 0x6020,
-	0xd09c, 0x0005, 0x6800, 0x9084, 0xfffe, 0x9086, 0x00c0, 0x01b8,
-	0x2001, 0x00c0, 0x080c, 0x29bc, 0x0156, 0x20a9, 0x002d, 0x1d04,
-	0x6c07, 0x2091, 0x6000, 0x1f04, 0x6c07, 0x015e, 0x00d6, 0x2069,
-	0x1800, 0x6898, 0x8001, 0x0220, 0x0118, 0x689a, 0x00de, 0x0005,
-	0x689b, 0x0014, 0x68e4, 0xd0dc, 0x0dc8, 0x6800, 0x9086, 0x0001,
-	0x1da8, 0x080c, 0x7e33, 0x0c90, 0x00c6, 0x00d6, 0x00e6, 0x2061,
-	0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0x7007, 0x2001,
-	0x193e, 0x2003, 0x0000, 0x9006, 0x7096, 0x60e2, 0x6886, 0x080c,
-	0x257f, 0x9006, 0x080c, 0x29bc, 0x080c, 0x5953, 0x6027, 0xffff,
-	0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6,
-	0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2001,
-	0x194e, 0x200c, 0x9186, 0x0000, 0x0158, 0x9186, 0x0001, 0x0158,
-	0x9186, 0x0002, 0x0158, 0x9186, 0x0003, 0x0158, 0x0804, 0x6cdc,
-	0x7097, 0x0022, 0x0040, 0x7097, 0x0021, 0x0028, 0x7097, 0x0023,
-	0x0010, 0x7097, 0x0024, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001,
-	0x0001, 0x080c, 0x257f, 0x0026, 0x080c, 0x9a4e, 0x002e, 0x7000,
-	0x908e, 0x0004, 0x0118, 0x602b, 0x0028, 0x0010, 0x602b, 0x0020,
-	0x0156, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x6024, 0xd0ac,
-	0x0150, 0x012e, 0x015e, 0x080c, 0xbe86, 0x0118, 0x9006, 0x080c,
-	0x29e6, 0x0804, 0x6ce8, 0x6800, 0x9084, 0x00a1, 0xc0bd, 0x6802,
-	0x080c, 0x2905, 0x6904, 0xd1d4, 0x1140, 0x2001, 0x0100, 0x080c,
-	0x29bc, 0x1f04, 0x6c86, 0x080c, 0x6d6b, 0x012e, 0x015e, 0x080c,
-	0x6d25, 0x01a8, 0x6044, 0x9005, 0x0168, 0x6050, 0x0006, 0x9085,
-	0x0020, 0x6052, 0x080c, 0x6d6b, 0x9006, 0x8001, 0x1df0, 0x000e,
-	0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110, 0x080c, 0x6d6b, 0x080c,
-	0xbe86, 0x0118, 0x9006, 0x080c, 0x29e6, 0x0016, 0x0026, 0x7000,
-	0x908e, 0x0004, 0x0130, 0x2009, 0x00c8, 0x2011, 0x6b95, 0x080c,
-	0x7de5, 0x002e, 0x001e, 0x080c, 0x7c72, 0x7034, 0xc085, 0x7036,
-	0x2001, 0x194e, 0x2003, 0x0004, 0x080c, 0x69f6, 0x080c, 0x6d25,
-	0x0138, 0x6804, 0xd0d4, 0x1120, 0xd0dc, 0x1100, 0x080c, 0x6ffd,
-	0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061,
-	0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0x7c89, 0x080c,
-	0x7c7b, 0x080c, 0x7007, 0x2001, 0x193e, 0x2003, 0x0000, 0x9006,
-	0x7096, 0x60e2, 0x6886, 0x080c, 0x257f, 0x9006, 0x080c, 0x29bc,
-	0x6043, 0x0090, 0x6043, 0x0010, 0x6027, 0xffff, 0x602b, 0x182f,
-	0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, 0x2001, 0x194d, 0x2004,
-	0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006, 0x080c, 0x5157, 0x9084,
-	0x0030, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, 0x080c, 0x5157,
-	0x9084, 0x0030, 0x9086, 0x0030, 0x000e, 0x0005, 0x0006, 0x080c,
-	0x5157, 0x9084, 0x0030, 0x9086, 0x0010, 0x000e, 0x0005, 0x0006,
-	0x080c, 0x5157, 0x9084, 0x0030, 0x9086, 0x0020, 0x000e, 0x0005,
-	0x0036, 0x0016, 0x2001, 0x180c, 0x2004, 0x908c, 0x0013, 0x0180,
-	0x0020, 0x080c, 0x259f, 0x900e, 0x0028, 0x080c, 0x630d, 0x1dc8,
-	0x2009, 0x0002, 0x2019, 0x0028, 0x080c, 0x2e4a, 0x9006, 0x0019,
-	0x001e, 0x003e, 0x0005, 0x00e6, 0x2071, 0x180c, 0x2e04, 0x0130,
-	0x080c, 0xbe7f, 0x1128, 0x9085, 0x0010, 0x0010, 0x9084, 0xffef,
-	0x2072, 0x00ee, 0x0005, 0x6050, 0x0006, 0x60ec, 0x0006, 0x600c,
-	0x0006, 0x6004, 0x0006, 0x6028, 0x0006, 0x0016, 0x6138, 0x6050,
-	0x9084, 0xfbff, 0x9085, 0x2000, 0x6052, 0x613a, 0x20a9, 0x0012,
-	0x1d04, 0x6d80, 0x2091, 0x6000, 0x1f04, 0x6d80, 0x602f, 0x0100,
-	0x602f, 0x0000, 0x6050, 0x9085, 0x0400, 0x9084, 0xdfff, 0x6052,
-	0x613a, 0x001e, 0x602f, 0x0040, 0x602f, 0x0000, 0x000e, 0x602a,
-	0x000e, 0x6006, 0x000e, 0x600e, 0x000e, 0x60ee, 0x60e3, 0x0000,
-	0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x257f, 0x2001, 0x00a0,
-	0x0006, 0x080c, 0xbe86, 0x000e, 0x0130, 0x080c, 0x29da, 0x9006,
-	0x080c, 0x29e6, 0x0010, 0x080c, 0x29bc, 0x000e, 0x6052, 0x6050,
-	0x0006, 0xc0e5, 0x6052, 0x00f6, 0x2079, 0x0100, 0x080c, 0x287a,
-	0x00fe, 0x000e, 0x6052, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036,
-	0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071,
-	0x1800, 0x6020, 0x9084, 0x0080, 0x0138, 0x2001, 0x180c, 0x200c,
-	0xc1c5, 0x2102, 0x0804, 0x6e3f, 0x2001, 0x180c, 0x200c, 0xc1c4,
-	0x2102, 0x6028, 0x9084, 0xe1ff, 0x602a, 0x6027, 0x0200, 0x2001,
-	0x0090, 0x080c, 0x29bc, 0x20a9, 0x0366, 0x6024, 0xd0cc, 0x1518,
-	0x1d04, 0x6ded, 0x2091, 0x6000, 0x1f04, 0x6ded, 0x2011, 0x0003,
-	0x080c, 0x93f3, 0x2011, 0x0002, 0x080c, 0x93fd, 0x080c, 0x92e4,
-	0x901e, 0x080c, 0x935a, 0x2001, 0x00a0, 0x080c, 0x29bc, 0x080c,
-	0x6ff8, 0x080c, 0x5a94, 0x080c, 0xbe86, 0x0110, 0x080c, 0x0d22,
-	0x9085, 0x0001, 0x0490, 0x86ff, 0x1110, 0x080c, 0x18d0, 0x60e3,
-	0x0000, 0x2001, 0x0002, 0x080c, 0x257f, 0x60e2, 0x2001, 0x0080,
-	0x080c, 0x29bc, 0x20a9, 0x0366, 0x6027, 0x1e00, 0x2009, 0x1e00,
-	0x080c, 0x2905, 0x6024, 0x910c, 0x0138, 0x1d04, 0x6e24, 0x2091,
-	0x6000, 0x1f04, 0x6e24, 0x0810, 0x6028, 0x9085, 0x1e00, 0x602a,
-	0x70b0, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x080c,
-	0xbe86, 0x0110, 0x080c, 0x0d22, 0x9006, 0x00ee, 0x00de, 0x00ce,
-	0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026,
-	0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800,
-	0x7000, 0x9086, 0x0003, 0x1168, 0x2001, 0x020b, 0x2004, 0x9084,
-	0x5540, 0x9086, 0x5540, 0x1128, 0x2069, 0x1a46, 0x2d04, 0x8000,
-	0x206a, 0x2069, 0x0140, 0x6020, 0x9084, 0x00c0, 0x0120, 0x6884,
-	0x9005, 0x1904, 0x6eb2, 0x2001, 0x0088, 0x080c, 0x29bc, 0x9006,
-	0x60e2, 0x6886, 0x080c, 0x257f, 0x2069, 0x0200, 0x6804, 0x9005,
-	0x1118, 0x6808, 0x9005, 0x01c0, 0x6028, 0x9084, 0xfbff, 0x602a,
-	0x6027, 0x0400, 0x2069, 0x195e, 0x7000, 0x206a, 0x7097, 0x0026,
-	0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04, 0x6e94, 0x2091, 0x6000,
-	0x1f04, 0x6e94, 0x0804, 0x6edf, 0x2069, 0x0140, 0x20a9, 0x0384,
-	0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x2905, 0x6024, 0x910c,
-	0x0508, 0x9084, 0x1a00, 0x11f0, 0x1d04, 0x6ea0, 0x2091, 0x6000,
-	0x1f04, 0x6ea0, 0x2011, 0x0003, 0x080c, 0x93f3, 0x2011, 0x0002,
-	0x080c, 0x93fd, 0x080c, 0x92e4, 0x901e, 0x080c, 0x935a, 0x2001,
-	0x00a0, 0x080c, 0x29bc, 0x080c, 0x6ff8, 0x080c, 0x5a94, 0x9085,
-	0x0001, 0x00a8, 0x2001, 0x0080, 0x080c, 0x29bc, 0x2069, 0x0140,
-	0x60e3, 0x0000, 0x70b0, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008,
-	0x6886, 0x2001, 0x0002, 0x080c, 0x257f, 0x60e2, 0x9006, 0x00ee,
-	0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156,
+	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1187,
+	0x2009, 0x1919, 0x200b, 0x0000, 0x00ee, 0x00fe, 0x009e, 0x0005,
+	0x00f6, 0x2079, 0x0050, 0x7044, 0xd084, 0x01b8, 0xc084, 0x7046,
+	0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836,
+	0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
+	0xd084, 0x190c, 0x1187, 0x00fe, 0x0005, 0x782c, 0x9094, 0x0780,
+	0x190c, 0x6bbc, 0xd0a4, 0x0db8, 0x00e6, 0x2071, 0x1800, 0x7824,
+	0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be,
+	0x080c, 0x7f35, 0x782c, 0x9094, 0x0780, 0x190c, 0x6bbc, 0xd0a4,
+	0x1d70, 0x00d6, 0x2069, 0x0050, 0x693c, 0x2069, 0x191a, 0x6808,
+	0x690a, 0x2069, 0x19cb, 0x9102, 0x1118, 0x683c, 0x9005, 0x1328,
+	0x2001, 0x191b, 0x200c, 0x810d, 0x693e, 0x00de, 0x00ee, 0x00fe,
+	0x0005, 0x7094, 0x908a, 0x0029, 0x1a0c, 0x0db4, 0x9082, 0x001d,
+	0x001b, 0x6027, 0x1e00, 0x0005, 0x6d5c, 0x6ce6, 0x6d02, 0x6d2a,
+	0x6d4b, 0x6d8b, 0x6d9d, 0x6d02, 0x6d73, 0x6ca1, 0x6ccf, 0x6ca0,
+	0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, 0x9005, 0x1180, 0x6808,
+	0x9005, 0x1518, 0x7097, 0x0028, 0x2069, 0x1960, 0x2d04, 0x7002,
+	0x080c, 0x70e0, 0x6028, 0x9085, 0x0600, 0x602a, 0x00b0, 0x7097,
+	0x0028, 0x2069, 0x1960, 0x2d04, 0x7002, 0x6028, 0x9085, 0x0600,
+	0x602a, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a33, 0x080c,
+	0x1958, 0x005e, 0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6,
+	0x2069, 0x0200, 0x6804, 0x9005, 0x1178, 0x6808, 0x9005, 0x1160,
+	0x7097, 0x0028, 0x2069, 0x1960, 0x2d04, 0x7002, 0x080c, 0x717a,
+	0x6028, 0x9085, 0x0600, 0x602a, 0x00de, 0x0005, 0x0006, 0x2001,
+	0x0090, 0x080c, 0x2b14, 0x000e, 0x6124, 0xd1e4, 0x1190, 0x080c,
+	0x6e0a, 0xd1d4, 0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x7097,
+	0x0020, 0x080c, 0x6e0a, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097,
+	0x001f, 0x0005, 0x2001, 0x0088, 0x080c, 0x2b14, 0x6124, 0xd1cc,
+	0x11d8, 0xd1dc, 0x11b0, 0xd1e4, 0x1188, 0x9184, 0x1e00, 0x11c8,
+	0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x6fd3, 0x2001,
+	0x0080, 0x080c, 0x2b14, 0x7097, 0x0028, 0x0058, 0x7097, 0x001e,
+	0x0040, 0x7097, 0x001d, 0x0028, 0x7097, 0x0020, 0x0010, 0x7097,
+	0x001f, 0x0005, 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c,
+	0x6fd3, 0x2001, 0x0080, 0x080c, 0x2b14, 0x6124, 0xd1d4, 0x1180,
+	0xd1dc, 0x1158, 0xd1e4, 0x1130, 0x9184, 0x1e00, 0x1158, 0x7097,
+	0x0028, 0x0040, 0x7097, 0x001e, 0x0028, 0x7097, 0x001d, 0x0010,
+	0x7097, 0x001f, 0x0005, 0x2001, 0x00a0, 0x080c, 0x2b14, 0x6124,
+	0xd1dc, 0x1138, 0xd1e4, 0x0138, 0x080c, 0x1982, 0x7097, 0x001e,
+	0x0010, 0x7097, 0x001d, 0x0005, 0x080c, 0x6e8d, 0x6124, 0xd1dc,
+	0x1188, 0x080c, 0x6e0a, 0x0016, 0x080c, 0x1982, 0x001e, 0xd1d4,
+	0x1128, 0xd1e4, 0x0138, 0x7097, 0x001e, 0x0020, 0x7097, 0x001f,
+	0x080c, 0x6e0a, 0x0005, 0x0006, 0x2001, 0x00a0, 0x080c, 0x2b14,
+	0x000e, 0x6124, 0xd1d4, 0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128,
+	0xd1e4, 0x0140, 0x7097, 0x001e, 0x0028, 0x7097, 0x001d, 0x0010,
+	0x7097, 0x0021, 0x0005, 0x080c, 0x6e8d, 0x6124, 0xd1d4, 0x1150,
+	0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x7097, 0x001e, 0x0028, 0x7097,
+	0x001d, 0x0010, 0x7097, 0x001f, 0x0005, 0x0006, 0x2001, 0x0090,
+	0x080c, 0x2b14, 0x000e, 0x6124, 0xd1d4, 0x1178, 0xd1cc, 0x1150,
+	0xd1dc, 0x1128, 0xd1e4, 0x0158, 0x7097, 0x001e, 0x0040, 0x7097,
+	0x001d, 0x0028, 0x7097, 0x0020, 0x0010, 0x7097, 0x001f, 0x0005,
+	0x0016, 0x00c6, 0x00d6, 0x00e6, 0x0126, 0x2061, 0x0100, 0x2069,
+	0x0140, 0x2071, 0x1800, 0x2091, 0x8000, 0x080c, 0x6fa7, 0x11d8,
+	0x2001, 0x180c, 0x200c, 0xd1b4, 0x01b0, 0xc1b4, 0x2102, 0x6027,
+	0x0200, 0x080c, 0x2a5d, 0x6024, 0xd0cc, 0x0148, 0x2001, 0x00a0,
+	0x080c, 0x2b14, 0x080c, 0x728b, 0x080c, 0x5cca, 0x0428, 0x6028,
+	0xc0cd, 0x602a, 0x0408, 0x080c, 0x6fc1, 0x0150, 0x080c, 0x6fb8,
+	0x1138, 0x2001, 0x0001, 0x080c, 0x260c, 0x080c, 0x6f7f, 0x00a0,
+	0x080c, 0x6e8a, 0x0178, 0x2001, 0x0001, 0x080c, 0x260c, 0x7094,
+	0x9086, 0x001e, 0x0120, 0x7094, 0x9086, 0x0022, 0x1118, 0x7097,
+	0x0025, 0x0010, 0x7097, 0x0021, 0x012e, 0x00ee, 0x00de, 0x00ce,
+	0x001e, 0x0005, 0x0026, 0x2011, 0x6e1b, 0x080c, 0x80e4, 0x002e,
+	0x0016, 0x0026, 0x2009, 0x0064, 0x2011, 0x6e1b, 0x080c, 0x80db,
+	0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, 0x0016, 0x080c, 0x9393,
+	0x2071, 0x1800, 0x080c, 0x6db8, 0x001e, 0x00fe, 0x00ee, 0x0005,
+	0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0126,
+	0x080c, 0x9393, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800,
+	0x2091, 0x8000, 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003, 0x080c,
+	0x9758, 0x2011, 0x0002, 0x080c, 0x9762, 0x080c, 0x9649, 0x080c,
+	0x8090, 0x0036, 0x901e, 0x080c, 0x96bf, 0x003e, 0x60e3, 0x0000,
+	0x080c, 0xd894, 0x080c, 0xd8af, 0x2009, 0x0004, 0x080c, 0x2a63,
+	0x080c, 0x297e, 0x2001, 0x1800, 0x2003, 0x0004, 0x6027, 0x0008,
+	0x2011, 0x6e1b, 0x080c, 0x80e4, 0x080c, 0x6fc1, 0x0118, 0x9006,
+	0x080c, 0x2b14, 0x080c, 0x0b8f, 0x2001, 0x0001, 0x080c, 0x260c,
+	0x012e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e,
+	0x0005, 0x0026, 0x00e6, 0x2011, 0x6e28, 0x2071, 0x19cb, 0x701c,
+	0x9206, 0x1118, 0x7018, 0x9005, 0x0110, 0x9085, 0x0001, 0x00ee,
+	0x002e, 0x0005, 0x6020, 0xd09c, 0x0005, 0x6800, 0x9084, 0xfffe,
+	0x9086, 0x00c0, 0x01b8, 0x2001, 0x00c0, 0x080c, 0x2b14, 0x0156,
+	0x20a9, 0x002d, 0x1d04, 0x6e9a, 0x2091, 0x6000, 0x1f04, 0x6e9a,
+	0x015e, 0x00d6, 0x2069, 0x1800, 0x6898, 0x8001, 0x0220, 0x0118,
+	0x689a, 0x00de, 0x0005, 0x689b, 0x0014, 0x68e4, 0xd0dc, 0x0dc8,
+	0x6800, 0x9086, 0x0001, 0x1da8, 0x080c, 0x80f0, 0x0c90, 0x00c6,
+	0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800,
+	0x080c, 0x729a, 0x2001, 0x193e, 0x2003, 0x0000, 0x9006, 0x7096,
+	0x60e2, 0x6886, 0x080c, 0x26d7, 0x9006, 0x080c, 0x2b14, 0x080c,
+	0x5b89, 0x6027, 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce,
+	0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140,
+	0x2071, 0x1800, 0x2001, 0x194e, 0x200c, 0x9186, 0x0000, 0x0158,
+	0x9186, 0x0001, 0x0158, 0x9186, 0x0002, 0x0158, 0x9186, 0x0003,
+	0x0158, 0x0804, 0x6f6f, 0x7097, 0x0022, 0x0040, 0x7097, 0x0021,
+	0x0028, 0x7097, 0x0023, 0x0010, 0x7097, 0x0024, 0x60e3, 0x0000,
+	0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x26d7, 0x0026, 0x080c,
+	0x9d9f, 0x002e, 0x7000, 0x908e, 0x0004, 0x0118, 0x602b, 0x0028,
+	0x0010, 0x602b, 0x0020, 0x0156, 0x0126, 0x2091, 0x8000, 0x20a9,
+	0x0005, 0x6024, 0xd0ac, 0x0150, 0x012e, 0x015e, 0x080c, 0xc1f9,
+	0x0118, 0x9006, 0x080c, 0x2b3e, 0x0804, 0x6f7b, 0x6800, 0x9084,
+	0x00a1, 0xc0bd, 0x6802, 0x080c, 0x2a5d, 0x6904, 0xd1d4, 0x1140,
+	0x2001, 0x0100, 0x080c, 0x2b14, 0x1f04, 0x6f19, 0x080c, 0x6ffe,
+	0x012e, 0x015e, 0x080c, 0x6fb8, 0x01a8, 0x6044, 0x9005, 0x0168,
+	0x6050, 0x0006, 0x9085, 0x0020, 0x6052, 0x080c, 0x6ffe, 0x9006,
+	0x8001, 0x1df0, 0x000e, 0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110,
+	0x080c, 0x6ffe, 0x080c, 0xc1f9, 0x0118, 0x9006, 0x080c, 0x2b3e,
+	0x0016, 0x0026, 0x7000, 0x908e, 0x0004, 0x0130, 0x2009, 0x00c8,
+	0x2011, 0x6e28, 0x080c, 0x80a2, 0x002e, 0x001e, 0x080c, 0x7f2c,
+	0x7034, 0xc085, 0x7036, 0x2001, 0x194e, 0x2003, 0x0004, 0x080c,
+	0x6c89, 0x080c, 0x6fb8, 0x0138, 0x6804, 0xd0d4, 0x1120, 0xd0dc,
+	0x1100, 0x080c, 0x7290, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6,
+	0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800,
+	0x080c, 0x7f43, 0x080c, 0x7f35, 0x080c, 0x729a, 0x2001, 0x193e,
+	0x2003, 0x0000, 0x9006, 0x7096, 0x60e2, 0x6886, 0x080c, 0x26d7,
+	0x9006, 0x080c, 0x2b14, 0x6043, 0x0090, 0x6043, 0x0010, 0x6027,
+	0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006,
+	0x2001, 0x194d, 0x2004, 0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006,
+	0x080c, 0x5383, 0x9084, 0x0030, 0x9086, 0x0000, 0x000e, 0x0005,
+	0x0006, 0x080c, 0x5383, 0x9084, 0x0030, 0x9086, 0x0030, 0x000e,
+	0x0005, 0x0006, 0x080c, 0x5383, 0x9084, 0x0030, 0x9086, 0x0010,
+	0x000e, 0x0005, 0x0006, 0x080c, 0x5383, 0x9084, 0x0030, 0x9086,
+	0x0020, 0x000e, 0x0005, 0x0036, 0x0016, 0x2001, 0x180c, 0x2004,
+	0x908c, 0x0013, 0x0180, 0x0020, 0x080c, 0x26f7, 0x900e, 0x0028,
+	0x080c, 0x6553, 0x1dc8, 0x2009, 0x0002, 0x2019, 0x0028, 0x080c,
+	0x2fa2, 0x9006, 0x0019, 0x001e, 0x003e, 0x0005, 0x00e6, 0x2071,
+	0x180c, 0x2e04, 0x0130, 0x080c, 0xc1f2, 0x1128, 0x9085, 0x0010,
+	0x0010, 0x9084, 0xffef, 0x2072, 0x00ee, 0x0005, 0x6050, 0x0006,
+	0x60ec, 0x0006, 0x600c, 0x0006, 0x6004, 0x0006, 0x6028, 0x0006,
+	0x0016, 0x6138, 0x6050, 0x9084, 0xfbff, 0x9085, 0x2000, 0x6052,
+	0x613a, 0x20a9, 0x0012, 0x1d04, 0x7013, 0x2091, 0x6000, 0x1f04,
+	0x7013, 0x602f, 0x0100, 0x602f, 0x0000, 0x6050, 0x9085, 0x0400,
+	0x9084, 0xdfff, 0x6052, 0x613a, 0x001e, 0x602f, 0x0040, 0x602f,
+	0x0000, 0x000e, 0x602a, 0x000e, 0x6006, 0x000e, 0x600e, 0x000e,
+	0x60ee, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c,
+	0x26d7, 0x2001, 0x00a0, 0x0006, 0x080c, 0xc1f9, 0x000e, 0x0130,
+	0x080c, 0x2b32, 0x9006, 0x080c, 0x2b3e, 0x0010, 0x080c, 0x2b14,
+	0x000e, 0x6052, 0x6050, 0x0006, 0xc0e5, 0x6052, 0x00f6, 0x2079,
+	0x0100, 0x080c, 0x29d2, 0x00fe, 0x000e, 0x6052, 0x0005, 0x0156,
 	0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100,
-	0x2071, 0x1800, 0x6020, 0x9084, 0x00c0, 0x01c8, 0x2011, 0x0003,
-	0x080c, 0x93f3, 0x2011, 0x0002, 0x080c, 0x93fd, 0x080c, 0x92e4,
-	0x901e, 0x080c, 0x935a, 0x2069, 0x0140, 0x2001, 0x00a0, 0x080c,
-	0x29bc, 0x080c, 0x6ff8, 0x080c, 0x5a94, 0x0804, 0x6f79, 0x2001,
-	0x180c, 0x200c, 0xd1b4, 0x1160, 0xc1b5, 0x2102, 0x080c, 0x6b7d,
-	0x2069, 0x0140, 0x2001, 0x0080, 0x080c, 0x29bc, 0x60e3, 0x0000,
-	0x2069, 0x0200, 0x6804, 0x9005, 0x1118, 0x6808, 0x9005, 0x0180,
-	0x6028, 0x9084, 0xfdff, 0x602a, 0x6027, 0x0200, 0x2069, 0x195e,
-	0x7000, 0x206a, 0x7097, 0x0027, 0x7003, 0x0001, 0x0804, 0x6f79,
-	0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x2905, 0x6024, 0x910c,
-	0x01c8, 0x9084, 0x1c00, 0x11b0, 0x1d04, 0x6f38, 0x0006, 0x0016,
-	0x00c6, 0x00d6, 0x00e6, 0x080c, 0x7cba, 0x00ee, 0x00de, 0x00ce,
-	0x001e, 0x000e, 0x00e6, 0x2071, 0x19c9, 0x7018, 0x00ee, 0x9005,
-	0x19f8, 0x01f8, 0x0026, 0x2011, 0x6b95, 0x080c, 0x7d56, 0x2011,
-	0x6b88, 0x080c, 0x7e27, 0x002e, 0x2069, 0x0140, 0x60e3, 0x0000,
-	0x70b0, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001,
-	0x0002, 0x080c, 0x257f, 0x60e2, 0x2001, 0x180c, 0x200c, 0xc1b4,
-	0x2102, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e,
-	0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x0046, 0x00c6, 0x00e6,
-	0x2061, 0x0100, 0x2071, 0x1800, 0x080c, 0xbe7f, 0x1904, 0x6fe6,
-	0x7130, 0xd184, 0x1170, 0x080c, 0x2fd4, 0x0138, 0xc18d, 0x7132,
-	0x2011, 0x1854, 0x2214, 0xd2ac, 0x1120, 0x7030, 0xd08c, 0x0904,
-	0x6fe6, 0x2011, 0x1854, 0x220c, 0x0438, 0x0016, 0x2019, 0x000e,
-	0x080c, 0xd104, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x9186,
-	0x007e, 0x01a0, 0x9186, 0x0080, 0x0188, 0x080c, 0x5ff1, 0x1170,
-	0x2120, 0x9006, 0x0016, 0x2009, 0x000e, 0x080c, 0xd188, 0x2009,
-	0x0001, 0x2011, 0x0100, 0x080c, 0x7f4a, 0x001e, 0x8108, 0x1f04,
-	0x6faf, 0x00be, 0x015e, 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009,
-	0x0002, 0x2019, 0x0004, 0x080c, 0x2e4a, 0x001e, 0x0078, 0x0156,
-	0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x5ff1, 0x1110, 0x080c,
-	0x5aae, 0x8108, 0x1f04, 0x6fdc, 0x00be, 0x015e, 0x080c, 0x18d0,
-	0x080c, 0x9a4e, 0x60e3, 0x0000, 0x080c, 0x5a94, 0x080c, 0x6c46,
-	0x00ee, 0x00ce, 0x004e, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005,
-	0x2001, 0x194e, 0x2003, 0x0001, 0x0005, 0x2001, 0x194e, 0x2003,
-	0x0000, 0x0005, 0x2001, 0x194d, 0x2003, 0xaaaa, 0x0005, 0x2001,
-	0x194d, 0x2003, 0x0000, 0x0005, 0x2071, 0x18f0, 0x7003, 0x0000,
-	0x7007, 0x0000, 0x080c, 0x1005, 0x090c, 0x0db4, 0xa8ab, 0xdcb0,
-	0x2900, 0x704e, 0x080c, 0x1005, 0x090c, 0x0db4, 0xa8ab, 0xdcb0,
-	0x2900, 0x7052, 0xa867, 0x0000, 0xa86b, 0x0001, 0xa89f, 0x0000,
-	0x0005, 0x00e6, 0x2071, 0x0040, 0x6848, 0x9005, 0x1118, 0x9085,
-	0x0001, 0x04b0, 0x6840, 0x9005, 0x0150, 0x04a1, 0x6a50, 0x9200,
-	0x7002, 0x6854, 0x9101, 0x7006, 0x9006, 0x7012, 0x7016, 0x6850,
-	0x7002, 0x6854, 0x7006, 0x6858, 0x700a, 0x685c, 0x700e, 0x6840,
-	0x9005, 0x1110, 0x7012, 0x7016, 0x6848, 0x701a, 0x701c, 0x9085,
-	0x0040, 0x701e, 0x2001, 0x0019, 0x7036, 0x702b, 0x0001, 0x2001,
-	0x0004, 0x200c, 0x918c, 0xfff7, 0x918d, 0x8000, 0x2102, 0x00d6,
-	0x2069, 0x18f0, 0x6807, 0x0001, 0x00de, 0x080c, 0x75e4, 0x9006,
-	0x00ee, 0x0005, 0x900e, 0x0156, 0x20a9, 0x0006, 0x8003, 0x2011,
-	0x0100, 0x2214, 0x9296, 0x0008, 0x1110, 0x818d, 0x0010, 0x81f5,
-	0x3e08, 0x1f04, 0x706e, 0x015e, 0x0005, 0x2079, 0x0040, 0x2071,
-	0x18f0, 0x7004, 0x0002, 0x708d, 0x708e, 0x70c5, 0x7120, 0x724c,
-	0x708b, 0x708b, 0x7276, 0x080c, 0x0db4, 0x0005, 0x2079, 0x0040,
-	0x782c, 0x908c, 0x0780, 0x190c, 0x7670, 0xd0a4, 0x01f0, 0x7824,
-	0x2048, 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a,
-	0x0040, 0x0608, 0x00b8, 0x2001, 0x1800, 0x200c, 0x9186, 0x0003,
-	0x1160, 0x7104, 0x9186, 0x0004, 0x0140, 0x9186, 0x0007, 0x0128,
-	0x9186, 0x0003, 0x19e8, 0x080c, 0x7120, 0x782c, 0xd09c, 0x090c,
-	0x75e4, 0x0005, 0x9082, 0x005a, 0x1218, 0x2100, 0x003b, 0x0c18,
-	0x080c, 0x7156, 0x0c90, 0x00e3, 0x08f0, 0x0005, 0x7156, 0x7156,
-	0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7178, 0x7156,
-	0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156,
-	0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156,
-	0x7156, 0x7156, 0x7162, 0x7156, 0x734b, 0x7156, 0x7156, 0x7156,
-	0x7156, 0x7156, 0x7162, 0x738c, 0x73cd, 0x7414, 0x7428, 0x7156,
-	0x7156, 0x7178, 0x7162, 0x7156, 0x7156, 0x7220, 0x74d3, 0x74ee,
-	0x7156, 0x7178, 0x7156, 0x7156, 0x7156, 0x7156, 0x7216, 0x74ee,
-	0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156,
-	0x7156, 0x718c, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156,
-	0x7156, 0x7156, 0x7156, 0x7614, 0x7156, 0x7156, 0x7156, 0x7156,
-	0x7156, 0x71a0, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156, 0x7156,
-	0x2079, 0x0040, 0x7004, 0x9086, 0x0003, 0x1198, 0x782c, 0x080c,
-	0x760d, 0xd0a4, 0x0170, 0x7824, 0x2048, 0x9006, 0xa802, 0xa806,
-	0xa864, 0x9084, 0x00ff, 0x908a, 0x001a, 0x1210, 0x002b, 0x0c50,
-	0x00e9, 0x080c, 0x75e4, 0x0005, 0x7156, 0x7162, 0x7337, 0x7156,
-	0x7162, 0x7156, 0x7162, 0x7162, 0x7156, 0x7162, 0x7337, 0x7162,
-	0x7162, 0x7162, 0x7162, 0x7162, 0x7156, 0x7162, 0x7337, 0x7156,
-	0x7156, 0x7162, 0x7156, 0x7156, 0x7156, 0x7162, 0x00e6, 0x2071,
-	0x18f0, 0x2009, 0x0400, 0x0071, 0x00ee, 0x0005, 0x2009, 0x1000,
-	0x0049, 0x0005, 0x2009, 0x2000, 0x0029, 0x0005, 0x2009, 0x0800,
-	0x0009, 0x0005, 0x7007, 0x0001, 0xa868, 0x9084, 0x00ff, 0x9105,
-	0xa86a, 0x0126, 0x2091, 0x8000, 0x080c, 0x65f2, 0x012e, 0x0005,
-	0xa864, 0x8007, 0x9084, 0x00ff, 0x0d08, 0x8001, 0x1120, 0x7007,
-	0x0001, 0x0804, 0x72f5, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016,
-	0x701a, 0x704b, 0x72f5, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff,
-	0x0968, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x7310, 0x7007,
-	0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7310, 0x0005,
-	0xa864, 0x8007, 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x715e,
-	0x7007, 0x0001, 0x2009, 0x1833, 0x210c, 0x81ff, 0x15f0, 0xa994,
-	0x9186, 0x006f, 0x0158, 0x9186, 0x0074, 0x1510, 0x0026, 0x2011,
-	0x0010, 0x080c, 0x6339, 0x002e, 0x01d8, 0x0090, 0x080c, 0x6d14,
-	0x0140, 0xa897, 0x4005, 0xa89b, 0x0016, 0x2001, 0x0030, 0x900e,
-	0x00c8, 0x0026, 0x2011, 0x8008, 0x080c, 0x6339, 0x002e, 0x0140,
+	0x2069, 0x0140, 0x2071, 0x1800, 0x6020, 0x9084, 0x0080, 0x0138,
+	0x2001, 0x180c, 0x200c, 0xc1c5, 0x2102, 0x0804, 0x70d2, 0x2001,
+	0x180c, 0x200c, 0xc1c4, 0x2102, 0x6028, 0x9084, 0xe1ff, 0x602a,
+	0x6027, 0x0200, 0x2001, 0x0090, 0x080c, 0x2b14, 0x20a9, 0x0366,
+	0x6024, 0xd0cc, 0x1518, 0x1d04, 0x7080, 0x2091, 0x6000, 0x1f04,
+	0x7080, 0x2011, 0x0003, 0x080c, 0x9758, 0x2011, 0x0002, 0x080c,
+	0x9762, 0x080c, 0x9649, 0x901e, 0x080c, 0x96bf, 0x2001, 0x00a0,
+	0x080c, 0x2b14, 0x080c, 0x728b, 0x080c, 0x5cca, 0x080c, 0xc1f9,
+	0x0110, 0x080c, 0x0d22, 0x9085, 0x0001, 0x0490, 0x86ff, 0x1110,
+	0x080c, 0x1982, 0x60e3, 0x0000, 0x2001, 0x0002, 0x080c, 0x26d7,
+	0x60e2, 0x2001, 0x0080, 0x080c, 0x2b14, 0x20a9, 0x0366, 0x6027,
+	0x1e00, 0x2009, 0x1e00, 0x080c, 0x2a5d, 0x6024, 0x910c, 0x0138,
+	0x1d04, 0x70b7, 0x2091, 0x6000, 0x1f04, 0x70b7, 0x0810, 0x6028,
+	0x9085, 0x1e00, 0x602a, 0x70b0, 0x9005, 0x1118, 0x6887, 0x0001,
+	0x0008, 0x6886, 0x080c, 0xc1f9, 0x0110, 0x080c, 0x0d22, 0x9006,
+	0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005,
+	0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061,
+	0x0100, 0x2071, 0x1800, 0x7000, 0x9086, 0x0003, 0x1168, 0x2001,
+	0x020b, 0x2004, 0x9084, 0x5540, 0x9086, 0x5540, 0x1128, 0x2069,
+	0x1a49, 0x2d04, 0x8000, 0x206a, 0x2069, 0x0140, 0x6020, 0x9084,
+	0x00c0, 0x0120, 0x6884, 0x9005, 0x1904, 0x7145, 0x2001, 0x0088,
+	0x080c, 0x2b14, 0x9006, 0x60e2, 0x6886, 0x080c, 0x26d7, 0x2069,
+	0x0200, 0x6804, 0x9005, 0x1118, 0x6808, 0x9005, 0x01c0, 0x6028,
+	0x9084, 0xfbff, 0x602a, 0x6027, 0x0400, 0x2069, 0x1960, 0x7000,
+	0x206a, 0x7097, 0x0026, 0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04,
+	0x7127, 0x2091, 0x6000, 0x1f04, 0x7127, 0x0804, 0x7172, 0x2069,
+	0x0140, 0x20a9, 0x0384, 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c,
+	0x2a5d, 0x6024, 0x910c, 0x0508, 0x9084, 0x1a00, 0x11f0, 0x1d04,
+	0x7133, 0x2091, 0x6000, 0x1f04, 0x7133, 0x2011, 0x0003, 0x080c,
+	0x9758, 0x2011, 0x0002, 0x080c, 0x9762, 0x080c, 0x9649, 0x901e,
+	0x080c, 0x96bf, 0x2001, 0x00a0, 0x080c, 0x2b14, 0x080c, 0x728b,
+	0x080c, 0x5cca, 0x9085, 0x0001, 0x00a8, 0x2001, 0x0080, 0x080c,
+	0x2b14, 0x2069, 0x0140, 0x60e3, 0x0000, 0x70b0, 0x9005, 0x1118,
+	0x6887, 0x0001, 0x0008, 0x6886, 0x2001, 0x0002, 0x080c, 0x26d7,
+	0x60e2, 0x9006, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e,
+	0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6,
+	0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, 0x6020, 0x9084, 0x00c0,
+	0x01c8, 0x2011, 0x0003, 0x080c, 0x9758, 0x2011, 0x0002, 0x080c,
+	0x9762, 0x080c, 0x9649, 0x901e, 0x080c, 0x96bf, 0x2069, 0x0140,
+	0x2001, 0x00a0, 0x080c, 0x2b14, 0x080c, 0x728b, 0x080c, 0x5cca,
+	0x0804, 0x720c, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x1160, 0xc1b5,
+	0x2102, 0x080c, 0x6e10, 0x2069, 0x0140, 0x2001, 0x0080, 0x080c,
+	0x2b14, 0x60e3, 0x0000, 0x2069, 0x0200, 0x6804, 0x9005, 0x1118,
+	0x6808, 0x9005, 0x0180, 0x6028, 0x9084, 0xfdff, 0x602a, 0x6027,
+	0x0200, 0x2069, 0x1960, 0x7000, 0x206a, 0x7097, 0x0027, 0x7003,
+	0x0001, 0x0804, 0x720c, 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c,
+	0x2a5d, 0x6024, 0x910c, 0x01c8, 0x9084, 0x1c00, 0x11b0, 0x1d04,
+	0x71cb, 0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x7f74,
+	0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, 0x19cb,
+	0x7018, 0x00ee, 0x9005, 0x19f8, 0x01f8, 0x0026, 0x2011, 0x6e28,
+	0x080c, 0x8010, 0x2011, 0x6e1b, 0x080c, 0x80e4, 0x002e, 0x2069,
+	0x0140, 0x60e3, 0x0000, 0x70b0, 0x9005, 0x1118, 0x6887, 0x0001,
+	0x0008, 0x6886, 0x2001, 0x0002, 0x080c, 0x26d7, 0x60e2, 0x2001,
+	0x180c, 0x200c, 0xc1b4, 0x2102, 0x00ee, 0x00de, 0x00ce, 0x003e,
+	0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036,
+	0x0046, 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, 0x080c,
+	0xc1f2, 0x1904, 0x7279, 0x7130, 0xd184, 0x1170, 0x080c, 0x312c,
+	0x0138, 0xc18d, 0x7132, 0x2011, 0x1854, 0x2214, 0xd2ac, 0x1120,
+	0x7030, 0xd08c, 0x0904, 0x7279, 0x2011, 0x1854, 0x220c, 0x0438,
+	0x0016, 0x2019, 0x000e, 0x080c, 0xd486, 0x0156, 0x00b6, 0x20a9,
+	0x007f, 0x900e, 0x9186, 0x007e, 0x01a0, 0x9186, 0x0080, 0x0188,
+	0x080c, 0x6237, 0x1170, 0x2120, 0x9006, 0x0016, 0x2009, 0x000e,
+	0x080c, 0xd50a, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x8207,
+	0x001e, 0x8108, 0x1f04, 0x7242, 0x00be, 0x015e, 0x001e, 0xd1ac,
+	0x1148, 0x0016, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x2fa2,
+	0x001e, 0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c,
+	0x6237, 0x1110, 0x080c, 0x5ce4, 0x8108, 0x1f04, 0x726f, 0x00be,
+	0x015e, 0x080c, 0x1982, 0x080c, 0x9d9f, 0x60e3, 0x0000, 0x080c,
+	0x5cca, 0x080c, 0x6ed9, 0x00ee, 0x00ce, 0x004e, 0x003e, 0x002e,
+	0x001e, 0x015e, 0x0005, 0x2001, 0x194e, 0x2003, 0x0001, 0x0005,
+	0x2001, 0x194e, 0x2003, 0x0000, 0x0005, 0x2001, 0x194d, 0x2003,
+	0xaaaa, 0x0005, 0x2001, 0x194d, 0x2003, 0x0000, 0x0005, 0x2071,
+	0x18f0, 0x7003, 0x0000, 0x7007, 0x0000, 0x080c, 0x1004, 0x090c,
+	0x0db4, 0xa8ab, 0xdcb0, 0x2900, 0x704e, 0x080c, 0x1004, 0x090c,
+	0x0db4, 0xa8ab, 0xdcb0, 0x2900, 0x7052, 0xa867, 0x0000, 0xa86b,
+	0x0001, 0xa89f, 0x0000, 0x0005, 0x00e6, 0x2071, 0x0040, 0x6848,
+	0x9005, 0x1118, 0x9085, 0x0001, 0x04b0, 0x6840, 0x9005, 0x0150,
+	0x04a1, 0x6a50, 0x9200, 0x7002, 0x6854, 0x9101, 0x7006, 0x9006,
+	0x7012, 0x7016, 0x6850, 0x7002, 0x6854, 0x7006, 0x6858, 0x700a,
+	0x685c, 0x700e, 0x6840, 0x9005, 0x1110, 0x7012, 0x7016, 0x6848,
+	0x701a, 0x701c, 0x9085, 0x0040, 0x701e, 0x2001, 0x0019, 0x7036,
+	0x702b, 0x0001, 0x2001, 0x0004, 0x200c, 0x918c, 0xfff7, 0x918d,
+	0x8000, 0x2102, 0x00d6, 0x2069, 0x18f0, 0x6807, 0x0001, 0x00de,
+	0x080c, 0x788c, 0x9006, 0x00ee, 0x0005, 0x900e, 0x0156, 0x20a9,
+	0x0006, 0x8003, 0x2011, 0x0100, 0x2214, 0x9296, 0x0008, 0x1110,
+	0x818d, 0x0010, 0x81f5, 0x3e08, 0x1f04, 0x7301, 0x015e, 0x0005,
+	0x2079, 0x0040, 0x2071, 0x18f0, 0x7004, 0x0002, 0x7320, 0x7321,
+	0x7358, 0x73b3, 0x74f4, 0x731e, 0x731e, 0x751e, 0x080c, 0x0db4,
+	0x0005, 0x2079, 0x0040, 0x782c, 0x908c, 0x0780, 0x190c, 0x7918,
+	0xd0a4, 0x01f0, 0x7824, 0x2048, 0x9006, 0xa802, 0xa806, 0xa864,
+	0x9084, 0x00ff, 0x908a, 0x0040, 0x0608, 0x00b8, 0x2001, 0x1800,
+	0x200c, 0x9186, 0x0003, 0x1160, 0x7104, 0x9186, 0x0004, 0x0140,
+	0x9186, 0x0007, 0x0128, 0x9186, 0x0003, 0x19e8, 0x080c, 0x73b3,
+	0x782c, 0xd09c, 0x090c, 0x788c, 0x0005, 0x9082, 0x005a, 0x1218,
+	0x2100, 0x003b, 0x0c18, 0x080c, 0x73e9, 0x0c90, 0x00e3, 0x08f0,
+	0x0005, 0x73e9, 0x73e9, 0x73e9, 0x73e9, 0x73e9, 0x73e9, 0x73e9,
+	0x73e9, 0x740b, 0x73e9, 0x73e9, 0x73e9, 0x73e9, 0x73e9, 0x73e9,
+	0x73e9, 0x73e9, 0x73e9, 0x73e9, 0x73e9, 0x73e9, 0x73e9, 0x73e9,
+	0x73e9, 0x73e9, 0x73e9, 0x73e9, 0x73e9, 0x73f5, 0x73e9, 0x75f3,
+	0x73e9, 0x73e9, 0x73e9, 0x740b, 0x73e9, 0x73f5, 0x7634, 0x7675,
+	0x76bc, 0x76d0, 0x73e9, 0x73e9, 0x740b, 0x73f5, 0x73e9, 0x73e9,
+	0x74c8, 0x777b, 0x7796, 0x73e9, 0x740b, 0x73e9, 0x73e9, 0x73e9,
+	0x73e9, 0x74be, 0x7796, 0x73e9, 0x73e9, 0x73e9, 0x73e9, 0x73e9,
+	0x73e9, 0x73e9, 0x73e9, 0x73e9, 0x741f, 0x73e9, 0x73e9, 0x73e9,
+	0x73e9, 0x73e9, 0x73e9, 0x73e9, 0x73e9, 0x73e9, 0x78bc, 0x73e9,
+	0x73e9, 0x73e9, 0x73e9, 0x73e9, 0x7433, 0x73e9, 0x73e9, 0x73e9,
+	0x73e9, 0x73e9, 0x73e9, 0x2079, 0x0040, 0x7004, 0x9086, 0x0003,
+	0x1198, 0x782c, 0x080c, 0x78b5, 0xd0a4, 0x0170, 0x7824, 0x2048,
+	0x9006, 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a, 0x001a,
+	0x1210, 0x002b, 0x0c50, 0x00e9, 0x080c, 0x788c, 0x0005, 0x73e9,
+	0x73f5, 0x75df, 0x73e9, 0x73f5, 0x73e9, 0x73f5, 0x73f5, 0x73e9,
+	0x73f5, 0x75df, 0x73f5, 0x73f5, 0x73f5, 0x73f5, 0x73f5, 0x73e9,
+	0x73f5, 0x75df, 0x73e9, 0x73e9, 0x73f5, 0x73e9, 0x73e9, 0x73e9,
+	0x73f5, 0x00e6, 0x2071, 0x18f0, 0x2009, 0x0400, 0x0071, 0x00ee,
+	0x0005, 0x2009, 0x1000, 0x0049, 0x0005, 0x2009, 0x2000, 0x0029,
+	0x0005, 0x2009, 0x0800, 0x0009, 0x0005, 0x7007, 0x0001, 0xa868,
+	0x9084, 0x00ff, 0x9105, 0xa86a, 0x0126, 0x2091, 0x8000, 0x080c,
+	0x6885, 0x012e, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0d08,
+	0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x759d, 0x7007, 0x0003,
+	0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x759d, 0x0005, 0xa864,
+	0x8007, 0x9084, 0x00ff, 0x0968, 0x8001, 0x1120, 0x7007, 0x0001,
+	0x0804, 0x75b8, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a,
+	0x704b, 0x75b8, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x9086,
+	0x0001, 0x1904, 0x73f1, 0x7007, 0x0001, 0x2009, 0x1833, 0x210c,
+	0x81ff, 0x1904, 0x7495, 0xa994, 0x9186, 0x006f, 0x0188, 0x9186,
+	0x0074, 0x15b0, 0x0026, 0x2011, 0x0010, 0x080c, 0x657f, 0x002e,
+	0x0578, 0x0016, 0xa998, 0x080c, 0x65c9, 0x001e, 0x1548, 0x0400,
+	0x080c, 0x6fa7, 0x0140, 0xa897, 0x4005, 0xa89b, 0x0016, 0x2001,
+	0x0030, 0x900e, 0x0438, 0x0026, 0x2011, 0x8008, 0x080c, 0x657f,
+	0x002e, 0x01b0, 0x0016, 0x0026, 0x0036, 0xa998, 0xaaa0, 0xab9c,
+	0x918d, 0x8000, 0x080c, 0x65c9, 0x003e, 0x002e, 0x001e, 0x1140,
 	0xa897, 0x4005, 0xa89b, 0x4009, 0x2001, 0x0030, 0x900e, 0x0050,
-	0xa868, 0x9084, 0x00ff, 0xa86a, 0xa883, 0x0000, 0x080c, 0x5cc3,
+	0xa868, 0x9084, 0x00ff, 0xa86a, 0xa883, 0x0000, 0x080c, 0x5ef9,
 	0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, 0xa87a,
-	0xa982, 0x080c, 0x65f2, 0x012e, 0x0ca0, 0xa994, 0x9186, 0x0071,
-	0x0904, 0x71af, 0x9186, 0x0064, 0x0904, 0x71af, 0x9186, 0x007c,
-	0x0904, 0x71af, 0x9186, 0x0028, 0x0904, 0x71af, 0x9186, 0x0038,
-	0x0904, 0x71af, 0x9186, 0x0078, 0x0904, 0x71af, 0x9186, 0x005f,
-	0x0904, 0x71af, 0x9186, 0x0056, 0x0904, 0x71af, 0xa897, 0x4005,
+	0xa982, 0x080c, 0x6885, 0x012e, 0x0ca0, 0xa994, 0x9186, 0x0071,
+	0x0904, 0x7443, 0x9186, 0x0064, 0x0904, 0x7443, 0x9186, 0x007c,
+	0x0904, 0x7443, 0x9186, 0x0028, 0x0904, 0x7443, 0x9186, 0x0038,
+	0x0904, 0x7443, 0x9186, 0x0078, 0x0904, 0x7443, 0x9186, 0x005f,
+	0x0904, 0x7443, 0x9186, 0x0056, 0x0904, 0x7443, 0xa897, 0x4005,
 	0xa89b, 0x0001, 0x2001, 0x0030, 0x900e, 0x0860, 0xa87c, 0x9084,
-	0x00c0, 0x9086, 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, 0x7505,
+	0x00c0, 0x9086, 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, 0x77ad,
 	0x2900, 0x7016, 0x701a, 0x20a9, 0x0004, 0xa860, 0x20e0, 0xa85c,
 	0x9080, 0x0030, 0x2098, 0x7050, 0x2040, 0xa060, 0x20e8, 0xa05c,
 	0x9080, 0x0023, 0x20a0, 0x4003, 0xa888, 0x7012, 0x9082, 0x0401,
-	0x1a04, 0x7166, 0xaab4, 0x928a, 0x0002, 0x1a04, 0x7166, 0x82ff,
-	0x1138, 0xa8b8, 0xa9bc, 0x9105, 0x0118, 0x2001, 0x72b3, 0x0018,
-	0x9280, 0x72a9, 0x2005, 0x7056, 0x7010, 0x9015, 0x0904, 0x7294,
-	0x080c, 0x1005, 0x1118, 0x7007, 0x0004, 0x0005, 0x2900, 0x7022,
+	0x1a04, 0x73f9, 0xaab4, 0x928a, 0x0002, 0x1a04, 0x73f9, 0x82ff,
+	0x1138, 0xa8b8, 0xa9bc, 0x9105, 0x0118, 0x2001, 0x755b, 0x0018,
+	0x9280, 0x7551, 0x2005, 0x7056, 0x7010, 0x9015, 0x0904, 0x753c,
+	0x080c, 0x1004, 0x1118, 0x7007, 0x0004, 0x0005, 0x2900, 0x7022,
 	0x7054, 0x2060, 0xe000, 0xa866, 0x7050, 0x2040, 0xa95c, 0xe004,
 	0x9100, 0xa076, 0xa860, 0xa072, 0xe008, 0x920a, 0x1210, 0x900e,
 	0x2200, 0x7112, 0xe20c, 0x8003, 0x800b, 0x9296, 0x0004, 0x0108,
-	0x9108, 0xa17a, 0x810b, 0xa17e, 0x080c, 0x10cc, 0xa06c, 0x908e,
+	0x9108, 0xa17a, 0x810b, 0xa17e, 0x080c, 0x10d5, 0xa06c, 0x908e,
 	0x0100, 0x0170, 0x9086, 0x0200, 0x0118, 0x7007, 0x0007, 0x0005,
-	0x7020, 0x2048, 0x080c, 0x101e, 0x7014, 0x2048, 0x0804, 0x7166,
+	0x7020, 0x2048, 0x080c, 0x101d, 0x7014, 0x2048, 0x0804, 0x73f9,
 	0x7020, 0x2048, 0x7018, 0xa802, 0xa807, 0x0000, 0x2908, 0x2048,
-	0xa906, 0x711a, 0x0804, 0x724c, 0x7014, 0x2048, 0x7007, 0x0001,
+	0xa906, 0x711a, 0x0804, 0x74f4, 0x7014, 0x2048, 0x7007, 0x0001,
 	0xa8b4, 0x9005, 0x1128, 0xa8b8, 0xa9bc, 0x9105, 0x0108, 0x00b9,
-	0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x0904, 0x7505, 0x0804,
-	0x72f5, 0x72ab, 0x72af, 0x0002, 0x001d, 0x0007, 0x0004, 0x000a,
+	0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x0904, 0x77ad, 0x0804,
+	0x759d, 0x7553, 0x7557, 0x0002, 0x001d, 0x0007, 0x0004, 0x000a,
 	0x001b, 0x0005, 0x0006, 0x000a, 0x001d, 0x0005, 0x0004, 0x0076,
 	0x0066, 0xafb8, 0xaebc, 0xa804, 0x2050, 0xb0c0, 0xb0e2, 0xb0bc,
 	0xb0de, 0xb0b8, 0xb0d2, 0xb0b4, 0xb0ce, 0xb6da, 0xb7d6, 0xb0b0,
@@ -3473,3301 +3558,3334 @@ unsigned short risc_code01[] = { 
 	0xb08a, 0xb084, 0xb086, 0xb692, 0xb78e, 0xb080, 0xb082, 0xb07c,
 	0xb07e, 0xb078, 0xb072, 0xb074, 0xb06e, 0xb67a, 0xb776, 0xb004,
 	0x9055, 0x1958, 0x006e, 0x007e, 0x0005, 0x2009, 0x1833, 0x210c,
-	0x81ff, 0x1178, 0x080c, 0x5b10, 0x1108, 0x0005, 0x080c, 0x682c,
-	0x0126, 0x2091, 0x8000, 0x080c, 0xba7b, 0x080c, 0x65f2, 0x012e,
-	0x0ca0, 0x080c, 0xbe7f, 0x1d70, 0x2001, 0x0028, 0x900e, 0x0c70,
+	0x81ff, 0x1178, 0x080c, 0x5d46, 0x1108, 0x0005, 0x080c, 0x6abf,
+	0x0126, 0x2091, 0x8000, 0x080c, 0xbded, 0x080c, 0x6885, 0x012e,
+	0x0ca0, 0x080c, 0xc1f2, 0x1d70, 0x2001, 0x0028, 0x900e, 0x0c70,
 	0x2009, 0x1833, 0x210c, 0x81ff, 0x11d8, 0xa888, 0x9005, 0x01e0,
-	0xa883, 0x0000, 0xa87c, 0xd0f4, 0x0120, 0x080c, 0x5c25, 0x1138,
-	0x0005, 0x9006, 0xa87a, 0x080c, 0x5ba0, 0x1108, 0x0005, 0x0126,
-	0x2091, 0x8000, 0xa87a, 0xa982, 0x080c, 0x65f2, 0x012e, 0x0cb0,
+	0xa883, 0x0000, 0xa87c, 0xd0f4, 0x0120, 0x080c, 0x5e5b, 0x1138,
+	0x0005, 0x9006, 0xa87a, 0x080c, 0x5dd6, 0x1108, 0x0005, 0x0126,
+	0x2091, 0x8000, 0xa87a, 0xa982, 0x080c, 0x6885, 0x012e, 0x0cb0,
 	0x2001, 0x0028, 0x900e, 0x0c98, 0x2001, 0x0000, 0x0c80, 0x7018,
 	0xa802, 0x2908, 0x2048, 0xa906, 0x711a, 0x7010, 0x8001, 0x7012,
 	0x0118, 0x7007, 0x0003, 0x0030, 0x7014, 0x2048, 0x7007, 0x0001,
 	0x7048, 0x080f, 0x0005, 0x00b6, 0x7007, 0x0001, 0xa974, 0xa878,
 	0x9084, 0x00ff, 0x9096, 0x0004, 0x0540, 0x20a9, 0x0001, 0x9096,
 	0x0001, 0x0190, 0x900e, 0x20a9, 0x0800, 0x9096, 0x0002, 0x0160,
-	0x9005, 0x11d8, 0xa974, 0x080c, 0x5ff1, 0x11b8, 0x0066, 0xae80,
-	0x080c, 0x6101, 0x006e, 0x0088, 0x0046, 0x2011, 0x180c, 0x2224,
-	0xc484, 0x2412, 0x004e, 0x00c6, 0x080c, 0x5ff1, 0x1110, 0x080c,
-	0x6201, 0x8108, 0x1f04, 0x7374, 0x00ce, 0xa87c, 0xd084, 0x1120,
-	0x080c, 0x101e, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x65f2, 0x012e, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x7007,
-	0x0001, 0x080c, 0x6311, 0x0580, 0x2061, 0x1a3e, 0x6100, 0xd184,
+	0x9005, 0x11d8, 0xa974, 0x080c, 0x6237, 0x11b8, 0x0066, 0xae80,
+	0x080c, 0x6347, 0x006e, 0x0088, 0x0046, 0x2011, 0x180c, 0x2224,
+	0xc484, 0x2412, 0x004e, 0x00c6, 0x080c, 0x6237, 0x1110, 0x080c,
+	0x6447, 0x8108, 0x1f04, 0x761c, 0x00ce, 0xa87c, 0xd084, 0x1120,
+	0x080c, 0x101d, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c,
+	0x6885, 0x012e, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x7007,
+	0x0001, 0x080c, 0x6557, 0x0580, 0x2061, 0x1a41, 0x6100, 0xd184,
 	0x0178, 0xa888, 0x9084, 0x00ff, 0x1550, 0x6000, 0xd084, 0x0520,
 	0x6004, 0x9005, 0x1538, 0x6003, 0x0000, 0x600b, 0x0000, 0x00c8,
 	0x2011, 0x0001, 0xa890, 0x9005, 0x1110, 0x2001, 0x001e, 0x8000,
 	0x6016, 0xa888, 0x9084, 0x00ff, 0x0178, 0x6006, 0xa888, 0x8007,
 	0x9084, 0x00ff, 0x0148, 0x600a, 0xa888, 0x8000, 0x1108, 0xc28d,
-	0x6202, 0x012e, 0x0804, 0x75ce, 0x012e, 0x0804, 0x75c8, 0x012e,
-	0x0804, 0x75c2, 0x012e, 0x0804, 0x75c5, 0x0126, 0x2091, 0x8000,
-	0x7007, 0x0001, 0x080c, 0x6311, 0x05e0, 0x2061, 0x1a3e, 0x6000,
+	0x6202, 0x012e, 0x0804, 0x7876, 0x012e, 0x0804, 0x7870, 0x012e,
+	0x0804, 0x786a, 0x012e, 0x0804, 0x786d, 0x0126, 0x2091, 0x8000,
+	0x7007, 0x0001, 0x080c, 0x6557, 0x05e0, 0x2061, 0x1a41, 0x6000,
 	0xd084, 0x05b8, 0x6204, 0x6308, 0xd08c, 0x1530, 0xac78, 0x9484,
 	0x0003, 0x0170, 0xa988, 0x918c, 0x00ff, 0x8001, 0x1120, 0x2100,
 	0x9210, 0x0620, 0x0028, 0x8001, 0x1508, 0x2100, 0x9212, 0x02f0,
 	0x9484, 0x000c, 0x0188, 0xa988, 0x810f, 0x918c, 0x00ff, 0x9082,
 	0x0004, 0x1120, 0x2100, 0x9318, 0x0288, 0x0030, 0x9082, 0x0004,
 	0x1168, 0x2100, 0x931a, 0x0250, 0xa890, 0x9005, 0x0110, 0x8000,
-	0x6016, 0x6206, 0x630a, 0x012e, 0x0804, 0x75ce, 0x012e, 0x0804,
-	0x75cb, 0x012e, 0x0804, 0x75c8, 0x0126, 0x2091, 0x8000, 0x7007,
-	0x0001, 0x2061, 0x1a3e, 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318,
-	0x0220, 0x630a, 0x012e, 0x0804, 0x75dc, 0x012e, 0x0804, 0x75cb,
+	0x6016, 0x6206, 0x630a, 0x012e, 0x0804, 0x7876, 0x012e, 0x0804,
+	0x7873, 0x012e, 0x0804, 0x7870, 0x0126, 0x2091, 0x8000, 0x7007,
+	0x0001, 0x2061, 0x1a41, 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318,
+	0x0220, 0x630a, 0x012e, 0x0804, 0x7884, 0x012e, 0x0804, 0x7873,
 	0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x7007, 0x0001, 0xa87c,
-	0xd0ac, 0x0148, 0x00c6, 0x2061, 0x1a3e, 0x6000, 0x9084, 0xfcff,
+	0xd0ac, 0x0148, 0x00c6, 0x2061, 0x1a41, 0x6000, 0x9084, 0xfcff,
 	0x6002, 0x00ce, 0x0440, 0xa888, 0x9005, 0x05d8, 0xa88c, 0x9065,
-	0x0598, 0x2001, 0x1833, 0x2004, 0x9005, 0x0118, 0x080c, 0x9af8,
+	0x0598, 0x2001, 0x1833, 0x2004, 0x9005, 0x0118, 0x080c, 0x9e49,
 	0x0068, 0x6017, 0xf400, 0x605b, 0x0000, 0xa97c, 0xd1a4, 0x0110,
-	0xa980, 0x615a, 0x2009, 0x0041, 0x080c, 0x9b42, 0xa988, 0x918c,
+	0xa980, 0x615a, 0x2009, 0x0041, 0x080c, 0x9e93, 0xa988, 0x918c,
 	0xff00, 0x9186, 0x2000, 0x1138, 0x0026, 0x900e, 0x2011, 0xfdff,
-	0x080c, 0x7f4a, 0x002e, 0xa87c, 0xd0c4, 0x0148, 0x2061, 0x1a3e,
+	0x080c, 0x8207, 0x002e, 0xa87c, 0xd0c4, 0x0148, 0x2061, 0x1a41,
 	0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce,
-	0x012e, 0x00be, 0x0804, 0x75ce, 0x00ce, 0x012e, 0x00be, 0x0804,
-	0x75c8, 0xa984, 0x9186, 0x002e, 0x0d30, 0x9186, 0x002d, 0x0d18,
+	0x012e, 0x00be, 0x0804, 0x7876, 0x00ce, 0x012e, 0x00be, 0x0804,
+	0x7870, 0xa984, 0x9186, 0x002e, 0x0d30, 0x9186, 0x002d, 0x0d18,
 	0x9186, 0x0045, 0x0510, 0x9186, 0x002a, 0x1130, 0x2001, 0x180c,
 	0x200c, 0xc194, 0x2102, 0x08b8, 0x9186, 0x0020, 0x0158, 0x9186,
-	0x0029, 0x1d10, 0xa974, 0x080c, 0x5ff1, 0x1968, 0xb800, 0xc0e4,
+	0x0029, 0x1d10, 0xa974, 0x080c, 0x6237, 0x1968, 0xb800, 0xc0e4,
 	0xb802, 0x0848, 0xa88c, 0x9065, 0x09b8, 0x6007, 0x0024, 0x2001,
-	0x1955, 0x2004, 0x601a, 0x0804, 0x7463, 0xa88c, 0x9065, 0x0960,
+	0x1957, 0x2004, 0x601a, 0x0804, 0x770b, 0xa88c, 0x9065, 0x0960,
 	0x00e6, 0xa890, 0x9075, 0x2001, 0x1833, 0x2004, 0x9005, 0x0150,
-	0x080c, 0x9af8, 0x8eff, 0x0118, 0x2e60, 0x080c, 0x9af8, 0x00ee,
-	0x0804, 0x7463, 0x6024, 0xc0dc, 0xc0d5, 0x6026, 0x2e60, 0x6007,
+	0x080c, 0x9e49, 0x8eff, 0x0118, 0x2e60, 0x080c, 0x9e49, 0x00ee,
+	0x0804, 0x770b, 0x6024, 0xc0dc, 0xc0d5, 0x6026, 0x2e60, 0x6007,
 	0x003a, 0xa8a0, 0x9005, 0x0130, 0x6007, 0x003b, 0xa8a4, 0x602e,
-	0xa8a8, 0x6016, 0x6003, 0x0001, 0x080c, 0x810c, 0x080c, 0x868e,
-	0x00ee, 0x0804, 0x7463, 0x2061, 0x1a3e, 0x6000, 0xd084, 0x0190,
-	0xd08c, 0x1904, 0x75dc, 0x0126, 0x2091, 0x8000, 0x6204, 0x8210,
-	0x0220, 0x6206, 0x012e, 0x0804, 0x75dc, 0x012e, 0xa883, 0x0016,
-	0x0804, 0x75d5, 0xa883, 0x0007, 0x0804, 0x75d5, 0xa864, 0x8007,
+	0xa8a8, 0x6016, 0x6003, 0x0001, 0x080c, 0x83c9, 0x080c, 0x894b,
+	0x00ee, 0x0804, 0x770b, 0x2061, 0x1a41, 0x6000, 0xd084, 0x0190,
+	0xd08c, 0x1904, 0x7884, 0x0126, 0x2091, 0x8000, 0x6204, 0x8210,
+	0x0220, 0x6206, 0x012e, 0x0804, 0x7884, 0x012e, 0xa883, 0x0016,
+	0x0804, 0x787d, 0xa883, 0x0007, 0x0804, 0x787d, 0xa864, 0x8007,
 	0x9084, 0x00ff, 0x0130, 0x8001, 0x1138, 0x7007, 0x0001, 0x0069,
-	0x0005, 0x080c, 0x715e, 0x0040, 0x7007, 0x0003, 0x7012, 0x2900,
-	0x7016, 0x701a, 0x704b, 0x7505, 0x0005, 0x00b6, 0x00e6, 0x0126,
+	0x0005, 0x080c, 0x73f1, 0x0040, 0x7007, 0x0003, 0x7012, 0x2900,
+	0x7016, 0x701a, 0x704b, 0x77ad, 0x0005, 0x00b6, 0x00e6, 0x0126,
 	0x2091, 0x8000, 0x903e, 0x2061, 0x1800, 0x61cc, 0x81ff, 0x1904,
-	0x7587, 0x6130, 0xd194, 0x1904, 0x75b1, 0xa878, 0x2070, 0x9e82,
-	0x1cd0, 0x0a04, 0x757b, 0x6064, 0x9e02, 0x1a04, 0x757b, 0x7120,
-	0x9186, 0x0006, 0x1904, 0x756d, 0x7010, 0x905d, 0x0904, 0x7587,
-	0xb800, 0xd0e4, 0x1904, 0x75ab, 0x2061, 0x1a3e, 0x6100, 0x9184,
-	0x0301, 0x9086, 0x0001, 0x15a0, 0x7024, 0xd0dc, 0x1904, 0x75b4,
+	0x782f, 0x6130, 0xd194, 0x1904, 0x7859, 0xa878, 0x2070, 0x9e82,
+	0x1cd0, 0x0a04, 0x7823, 0x6064, 0x9e02, 0x1a04, 0x7823, 0x7120,
+	0x9186, 0x0006, 0x1904, 0x7815, 0x7010, 0x905d, 0x0904, 0x782f,
+	0xb800, 0xd0e4, 0x1904, 0x7853, 0x2061, 0x1a41, 0x6100, 0x9184,
+	0x0301, 0x9086, 0x0001, 0x15a0, 0x7024, 0xd0dc, 0x1904, 0x785c,
 	0xa883, 0x0000, 0xa803, 0x0000, 0x2908, 0x7014, 0x9005, 0x1198,
-	0x7116, 0xa87c, 0xd0f4, 0x1904, 0x75b7, 0x080c, 0x5153, 0xd09c,
-	0x1118, 0xa87c, 0xc0cc, 0xa87e, 0x2e60, 0x080c, 0x7e6a, 0x012e,
+	0x7116, 0xa87c, 0xd0f4, 0x1904, 0x785f, 0x080c, 0x537f, 0xd09c,
+	0x1118, 0xa87c, 0xc0cc, 0xa87e, 0x2e60, 0x080c, 0x8127, 0x012e,
 	0x00ee, 0x00be, 0x0005, 0x2048, 0xa800, 0x9005, 0x1de0, 0xa902,
-	0x2148, 0xa87c, 0xd0f4, 0x1904, 0x75b7, 0x012e, 0x00ee, 0x00be,
-	0x0005, 0x012e, 0x00ee, 0xa883, 0x0006, 0x00be, 0x0804, 0x75d5,
-	0xd184, 0x0db8, 0xd1c4, 0x1190, 0x00a0, 0xa974, 0x080c, 0x5ff1,
+	0x2148, 0xa87c, 0xd0f4, 0x1904, 0x785f, 0x012e, 0x00ee, 0x00be,
+	0x0005, 0x012e, 0x00ee, 0xa883, 0x0006, 0x00be, 0x0804, 0x787d,
+	0xd184, 0x0db8, 0xd1c4, 0x1190, 0x00a0, 0xa974, 0x080c, 0x6237,
 	0x15d0, 0xb800, 0xd0e4, 0x15b8, 0x7120, 0x9186, 0x0007, 0x1118,
 	0xa883, 0x0002, 0x0490, 0xa883, 0x0008, 0x0478, 0xa883, 0x000e,
 	0x0460, 0xa883, 0x0017, 0x0448, 0xa883, 0x0035, 0x0430, 0x080c,
-	0x5157, 0xd0fc, 0x01e8, 0xa878, 0x2070, 0x9e82, 0x1cd0, 0x02c0,
+	0x5383, 0xd0fc, 0x01e8, 0xa878, 0x2070, 0x9e82, 0x1cd0, 0x02c0,
 	0x6064, 0x9e02, 0x12a8, 0x7120, 0x9186, 0x0006, 0x1188, 0x7010,
 	0x905d, 0x0170, 0xb800, 0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000,
-	0x9086, 0x0007, 0x1904, 0x7511, 0x7003, 0x0002, 0x0804, 0x7511,
+	0x9086, 0x0007, 0x1904, 0x77b9, 0x7003, 0x0002, 0x0804, 0x77b9,
 	0xa883, 0x0028, 0x0010, 0xa883, 0x0029, 0x012e, 0x00ee, 0x00be,
 	0x0420, 0xa883, 0x002a, 0x0cc8, 0xa883, 0x0045, 0x0cb0, 0x2e60,
-	0x2019, 0x0002, 0x601b, 0x0014, 0x080c, 0xcd45, 0x012e, 0x00ee,
+	0x2019, 0x0002, 0x601b, 0x0014, 0x080c, 0xd0c7, 0x012e, 0x00ee,
 	0x00be, 0x0005, 0x2009, 0x003e, 0x0058, 0x2009, 0x0004, 0x0040,
 	0x2009, 0x0006, 0x0028, 0x2009, 0x0016, 0x0010, 0x2009, 0x0001,
 	0xa884, 0x9084, 0xff00, 0x9105, 0xa886, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x65f2, 0x012e, 0x0005, 0x080c, 0x101e, 0x0005, 0x00d6,
-	0x080c, 0x7e61, 0x00de, 0x0005, 0x00d6, 0x00e6, 0x0126, 0x2091,
+	0x080c, 0x6885, 0x012e, 0x0005, 0x080c, 0x101d, 0x0005, 0x00d6,
+	0x080c, 0x811e, 0x00de, 0x0005, 0x00d6, 0x00e6, 0x0126, 0x2091,
 	0x8000, 0x2071, 0x0040, 0x702c, 0xd084, 0x01d8, 0x908c, 0x0780,
-	0x190c, 0x7670, 0xd09c, 0x11a8, 0x2071, 0x1800, 0x70bc, 0x90ea,
+	0x190c, 0x7918, 0xd09c, 0x11a8, 0x2071, 0x1800, 0x70bc, 0x90ea,
 	0x0040, 0x0278, 0x8001, 0x70be, 0x702c, 0x2048, 0xa800, 0x702e,
 	0x9006, 0xa802, 0xa806, 0x2071, 0x0040, 0x2900, 0x7022, 0x702c,
 	0x0c28, 0x012e, 0x00ee, 0x00de, 0x0005, 0x0006, 0x9084, 0x0780,
-	0x190c, 0x7670, 0x000e, 0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026,
+	0x190c, 0x7918, 0x000e, 0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026,
 	0x0016, 0x00b6, 0x7007, 0x0001, 0xaa74, 0x9282, 0x0004, 0x1a04,
-	0x7661, 0xa97c, 0x9188, 0x1000, 0x2104, 0x905d, 0xb804, 0xd284,
+	0x7909, 0xa97c, 0x9188, 0x1000, 0x2104, 0x905d, 0xb804, 0xd284,
 	0x0140, 0x05e8, 0x8007, 0x9084, 0x00ff, 0x9084, 0x0006, 0x1108,
-	0x04b0, 0x2b10, 0x080c, 0x9a72, 0x1118, 0x080c, 0x9b15, 0x05a8,
-	0x6212, 0xa874, 0x0002, 0x763f, 0x7644, 0x7647, 0x764d, 0x2019,
-	0x0002, 0x080c, 0xd104, 0x0060, 0x080c, 0xd0a0, 0x0048, 0x2019,
-	0x0002, 0xa980, 0x080c, 0xd0bb, 0x0018, 0xa980, 0x080c, 0xd0a0,
-	0x080c, 0x9ac8, 0xa887, 0x0000, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x65f2, 0x012e, 0x00be, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00de,
+	0x04b0, 0x2b10, 0x080c, 0x9dc3, 0x1118, 0x080c, 0x9e66, 0x05a8,
+	0x6212, 0xa874, 0x0002, 0x78e7, 0x78ec, 0x78ef, 0x78f5, 0x2019,
+	0x0002, 0x080c, 0xd486, 0x0060, 0x080c, 0xd422, 0x0048, 0x2019,
+	0x0002, 0xa980, 0x080c, 0xd43d, 0x0018, 0xa980, 0x080c, 0xd422,
+	0x080c, 0x9e19, 0xa887, 0x0000, 0x0126, 0x2091, 0x8000, 0x080c,
+	0x6885, 0x012e, 0x00be, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00de,
 	0x0005, 0xa887, 0x0006, 0x0c80, 0xa887, 0x0002, 0x0c68, 0xa887,
 	0x0005, 0x0c50, 0xa887, 0x0004, 0x0c38, 0xa887, 0x0007, 0x0c20,
-	0x2091, 0x8000, 0x0e04, 0x7672, 0x0006, 0x0016, 0x2001, 0x8003,
-	0x0006, 0x0804, 0x0dbd, 0x0005, 0x00f6, 0x2079, 0x0300, 0x2001,
-	0x0200, 0x200c, 0xc1e5, 0xc1dc, 0x2102, 0x2009, 0x0218, 0x210c,
-	0xd1ec, 0x1120, 0x080c, 0x148b, 0x00fe, 0x0005, 0x2001, 0x020d,
-	0x2003, 0x0020, 0x781f, 0x0300, 0x00fe, 0x0005, 0x781c, 0xd08c,
-	0x0904, 0x76dc, 0x68bc, 0x90aa, 0x0005, 0x0a04, 0x7c72, 0x7d44,
-	0x7c40, 0x9584, 0x00f6, 0x1508, 0x9484, 0x7000, 0x0138, 0x908a,
-	0x2000, 0x1258, 0x9584, 0x0700, 0x8007, 0x04a8, 0x7000, 0x9084,
-	0xff00, 0x9086, 0x8100, 0x0db0, 0x00b0, 0x9484, 0x0fff, 0x1130,
-	0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x11c0, 0x080c, 0xd4bb,
-	0x080c, 0x7bb7, 0x7817, 0x0140, 0x00a8, 0x9584, 0x0076, 0x1118,
-	0x080c, 0x7c15, 0x19c8, 0xd5a4, 0x0148, 0x0046, 0x0056, 0x080c,
-	0x773e, 0x080c, 0x2075, 0x005e, 0x004e, 0x0020, 0x080c, 0xd4bb,
-	0x7817, 0x0140, 0x080c, 0x771f, 0x2001, 0x19bf, 0x2004, 0x9005,
-	0x090c, 0x868e, 0x0005, 0x0002, 0x76f5, 0x79d9, 0x76ec, 0x76ec,
-	0x76ec, 0x76ec, 0x76ec, 0x76ec, 0x7817, 0x0140, 0x2001, 0x19bf,
-	0x2004, 0x9005, 0x090c, 0x868e, 0x0005, 0x7000, 0x908c, 0xff00,
-	0x9194, 0xf000, 0x810f, 0x9484, 0x0fff, 0x688e, 0x9286, 0x2000,
-	0x1150, 0x6800, 0x9086, 0x0001, 0x1118, 0x080c, 0x51aa, 0x0070,
-	0x080c, 0x775e, 0x0058, 0x9286, 0x3000, 0x1118, 0x080c, 0x7914,
-	0x0028, 0x9286, 0x8000, 0x1110, 0x080c, 0x7ae7, 0x7817, 0x0140,
-	0x2001, 0x19bf, 0x2004, 0x9005, 0x090c, 0x868e, 0x0005, 0x2001,
-	0x1810, 0x2004, 0xd08c, 0x0178, 0x2001, 0x1800, 0x2004, 0x9086,
-	0x0003, 0x1148, 0x0026, 0x0036, 0x2011, 0x8048, 0x2518, 0x080c,
-	0x46b9, 0x003e, 0x002e, 0x0005, 0x0036, 0x0046, 0x0056, 0x00f6,
-	0x2079, 0x0200, 0x2019, 0xfffe, 0x7c30, 0x0050, 0x0036, 0x0046,
-	0x0056, 0x00f6, 0x2079, 0x0200, 0x7d44, 0x7c40, 0x2019, 0xffff,
-	0x2001, 0x1810, 0x2004, 0xd08c, 0x0160, 0x2001, 0x1800, 0x2004,
-	0x9086, 0x0003, 0x1130, 0x0026, 0x2011, 0x8048, 0x080c, 0x46b9,
-	0x002e, 0x00fe, 0x005e, 0x004e, 0x003e, 0x0005, 0x00b6, 0x00c6,
-	0x7010, 0x9084, 0xff00, 0x8007, 0x9096, 0x0001, 0x0120, 0x9096,
-	0x0023, 0x1904, 0x78e5, 0x9186, 0x0023, 0x15c0, 0x080c, 0x7b7c,
-	0x0904, 0x78e5, 0x6120, 0x9186, 0x0001, 0x0150, 0x9186, 0x0004,
-	0x0138, 0x9186, 0x0008, 0x0120, 0x9186, 0x000a, 0x1904, 0x78e5,
-	0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1130, 0x2009, 0x0015,
-	0x080c, 0x9b42, 0x0804, 0x78e5, 0x908e, 0x0214, 0x0118, 0x908e,
-	0x0210, 0x1130, 0x2009, 0x0015, 0x080c, 0x9b42, 0x0804, 0x78e5,
-	0x908e, 0x0100, 0x1904, 0x78e5, 0x7034, 0x9005, 0x1904, 0x78e5,
-	0x2009, 0x0016, 0x080c, 0x9b42, 0x0804, 0x78e5, 0x9186, 0x0022,
-	0x1904, 0x78e5, 0x7030, 0x908e, 0x0300, 0x1580, 0x68d8, 0xd0a4,
-	0x0528, 0xc0b5, 0x68da, 0x7100, 0x918c, 0x00ff, 0x697a, 0x7004,
-	0x687e, 0x00f6, 0x2079, 0x0100, 0x79e6, 0x78ea, 0x0006, 0x9084,
-	0x00ff, 0x0016, 0x2008, 0x080c, 0x2554, 0x7932, 0x7936, 0x001e,
-	0x000e, 0x00fe, 0x080c, 0x250b, 0x695a, 0x703c, 0x00e6, 0x2071,
-	0x0140, 0x7086, 0x2071, 0x1800, 0x70b2, 0x00ee, 0x7034, 0x9005,
-	0x1904, 0x78e5, 0x2009, 0x0017, 0x0804, 0x78b2, 0x908e, 0x0400,
-	0x1190, 0x7034, 0x9005, 0x1904, 0x78e5, 0x080c, 0x6d14, 0x0120,
-	0x2009, 0x001d, 0x0804, 0x78b2, 0x68d8, 0xc0a5, 0x68da, 0x2009,
-	0x0030, 0x0804, 0x78b2, 0x908e, 0x0500, 0x1140, 0x7034, 0x9005,
-	0x1904, 0x78e5, 0x2009, 0x0018, 0x0804, 0x78b2, 0x908e, 0x2010,
-	0x1120, 0x2009, 0x0019, 0x0804, 0x78b2, 0x908e, 0x2110, 0x1120,
-	0x2009, 0x001a, 0x0804, 0x78b2, 0x908e, 0x5200, 0x1140, 0x7034,
-	0x9005, 0x1904, 0x78e5, 0x2009, 0x001b, 0x0804, 0x78b2, 0x908e,
-	0x5000, 0x1140, 0x7034, 0x9005, 0x1904, 0x78e5, 0x2009, 0x001c,
-	0x0804, 0x78b2, 0x908e, 0x1300, 0x1120, 0x2009, 0x0034, 0x0804,
-	0x78b2, 0x908e, 0x1200, 0x1140, 0x7034, 0x9005, 0x1904, 0x78e5,
-	0x2009, 0x0024, 0x0804, 0x78b2, 0x908c, 0xff00, 0x918e, 0x2400,
-	0x1170, 0x2009, 0x002d, 0x2001, 0x1810, 0x2004, 0xd09c, 0x0904,
-	0x78b2, 0x080c, 0xc51c, 0x1904, 0x78e5, 0x0804, 0x78b0, 0x908c,
-	0xff00, 0x918e, 0x5300, 0x1120, 0x2009, 0x002a, 0x0804, 0x78b2,
-	0x908e, 0x0f00, 0x1120, 0x2009, 0x0020, 0x0804, 0x78b2, 0x908e,
-	0x5300, 0x1108, 0x0440, 0x908e, 0x6104, 0x1528, 0x2029, 0x0205,
-	0x2011, 0x026d, 0x8208, 0x2204, 0x9082, 0x0004, 0x8004, 0x8004,
-	0x20a8, 0x2011, 0x8015, 0x211c, 0x8108, 0x0046, 0x2124, 0x080c,
-	0x46b9, 0x004e, 0x8108, 0x0f04, 0x787e, 0x9186, 0x0280, 0x1d88,
-	0x2504, 0x8000, 0x202a, 0x2009, 0x0260, 0x0c58, 0x202b, 0x0000,
-	0x2009, 0x0023, 0x0478, 0x908e, 0x6000, 0x1118, 0x2009, 0x003f,
-	0x0448, 0x908e, 0x7800, 0x1118, 0x2009, 0x0045, 0x0418, 0x908e,
-	0x1000, 0x1118, 0x2009, 0x004e, 0x00e8, 0x908e, 0x6300, 0x1118,
-	0x2009, 0x004a, 0x00b8, 0x908c, 0xff00, 0x918e, 0x5600, 0x1118,
-	0x2009, 0x004f, 0x0078, 0x908c, 0xff00, 0x918e, 0x5700, 0x1118,
-	0x2009, 0x0050, 0x0038, 0x2009, 0x001d, 0x6838, 0xd0d4, 0x0110,
-	0x2009, 0x004c, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c,
-	0x080c, 0x250b, 0x1568, 0x080c, 0x5f91, 0x1550, 0xbe12, 0xbd16,
-	0x001e, 0x0016, 0xb8b0, 0x9005, 0x1168, 0x9186, 0x0046, 0x1150,
-	0x6878, 0x9606, 0x1138, 0x687c, 0x9506, 0x9084, 0xff00, 0x1110,
-	0x001e, 0x0098, 0x080c, 0x9a72, 0x01a8, 0x2b08, 0x6112, 0x6023,
-	0x0004, 0x7120, 0x610a, 0x001e, 0x9186, 0x004c, 0x1110, 0x6023,
-	0x000a, 0x0016, 0x001e, 0x080c, 0x9b42, 0x00ce, 0x00be, 0x0005,
-	0x001e, 0x0cd8, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011,
-	0x8049, 0x080c, 0x46b9, 0x080c, 0x9b15, 0x0d90, 0x2b08, 0x6112,
-	0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x0016, 0x9186, 0x0017,
-	0x0118, 0x9186, 0x0030, 0x1128, 0x6007, 0x0009, 0x6017, 0x2900,
-	0x0020, 0x6007, 0x0051, 0x6017, 0x0000, 0x602f, 0x0009, 0x6003,
-	0x0001, 0x080c, 0x8154, 0x08a0, 0x080c, 0x2f9e, 0x1140, 0x7010,
-	0x9084, 0xff00, 0x8007, 0x908e, 0x0008, 0x1108, 0x0009, 0x0005,
-	0x00b6, 0x00c6, 0x0046, 0x7000, 0x908c, 0xff00, 0x810f, 0x9186,
-	0x0033, 0x11e8, 0x080c, 0x7b7c, 0x0904, 0x7971, 0x7124, 0x610a,
-	0x7030, 0x908e, 0x0200, 0x1140, 0x7034, 0x9005, 0x15d0, 0x2009,
-	0x0015, 0x080c, 0x9b42, 0x04a8, 0x908e, 0x0100, 0x1590, 0x7034,
-	0x9005, 0x1578, 0x2009, 0x0016, 0x080c, 0x9b42, 0x0450, 0x9186,
-	0x0032, 0x1538, 0x7030, 0x908e, 0x1400, 0x1518, 0x2009, 0x0038,
-	0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x250b,
-	0x11b8, 0x080c, 0x5f91, 0x11a0, 0xbe12, 0xbd16, 0x080c, 0x9a72,
-	0x0178, 0x2b08, 0x6112, 0x080c, 0xbc01, 0x6023, 0x0004, 0x7120,
-	0x610a, 0x001e, 0x080c, 0x9b42, 0x080c, 0x868e, 0x0010, 0x00ce,
-	0x001e, 0x004e, 0x00ce, 0x00be, 0x0005, 0x00b6, 0x0046, 0x00e6,
-	0x00d6, 0x2028, 0x2130, 0x9696, 0x00ff, 0x11b8, 0x9592, 0xfffc,
-	0x02a0, 0x9596, 0xfffd, 0x1120, 0x2009, 0x007f, 0x0804, 0x79d3,
-	0x9596, 0xfffe, 0x1120, 0x2009, 0x007e, 0x0804, 0x79d3, 0x9596,
-	0xfffc, 0x1118, 0x2009, 0x0080, 0x04f0, 0x2011, 0x0000, 0x2019,
-	0x1836, 0x231c, 0xd3ac, 0x0130, 0x9026, 0x20a9, 0x0800, 0x2071,
-	0x1000, 0x0030, 0x2021, 0x0081, 0x20a9, 0x077f, 0x2071, 0x1081,
-	0x2e1c, 0x93dd, 0x0000, 0x1140, 0x82ff, 0x11d0, 0x9496, 0x00ff,
-	0x01b8, 0x2410, 0xc2fd, 0x00a0, 0xbf10, 0x2600, 0x9706, 0xb814,
-	0x1120, 0x9546, 0x1110, 0x2408, 0x00b0, 0x9745, 0x1148, 0x94c6,
-	0x007e, 0x0130, 0x94c6, 0x007f, 0x0118, 0x94c6, 0x0080, 0x1d20,
-	0x8420, 0x8e70, 0x1f04, 0x79a8, 0x82ff, 0x1118, 0x9085, 0x0001,
-	0x0018, 0xc2fc, 0x2208, 0x9006, 0x00de, 0x00ee, 0x004e, 0x00be,
-	0x0005, 0x7000, 0x908c, 0xff00, 0x810f, 0x9184, 0x000f, 0x0002,
-	0x79f0, 0x79f0, 0x79f0, 0x7b8e, 0x79f0, 0x79f9, 0x7a24, 0x7ab2,
-	0x79f0, 0x79f0, 0x79f0, 0x79f0, 0x79f0, 0x79f0, 0x79f0, 0x79f0,
-	0x7817, 0x0140, 0x2001, 0x19bf, 0x2004, 0x9005, 0x090c, 0x868e,
-	0x0005, 0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7120, 0x2160, 0x9c8c,
-	0x0007, 0x11c0, 0x9c8a, 0x1cd0, 0x02a8, 0x6864, 0x9c02, 0x1290,
-	0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1150,
-	0x700c, 0xb914, 0x9106, 0x1130, 0x7124, 0x610a, 0x2009, 0x0046,
-	0x080c, 0x9b42, 0x7817, 0x0140, 0x2001, 0x19bf, 0x2004, 0x9005,
-	0x090c, 0x868e, 0x00be, 0x0005, 0x00b6, 0x00c6, 0x9484, 0x0fff,
-	0x0904, 0x7a88, 0x7110, 0xd1bc, 0x1904, 0x7a88, 0x7108, 0x700c,
-	0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, 0xff00, 0x15b0, 0x81ff,
-	0x15a0, 0x9080, 0x2fd9, 0x200d, 0x918c, 0xff00, 0x810f, 0x2001,
-	0x0080, 0x9106, 0x0904, 0x7a88, 0x080c, 0x5f91, 0x1904, 0x7a88,
-	0xbe12, 0xbd16, 0xb800, 0xd0ec, 0x15d8, 0xba04, 0x9294, 0xff00,
-	0x9286, 0x0600, 0x11a0, 0x080c, 0x9a72, 0x05e8, 0x2b08, 0x7028,
-	0x604a, 0x702c, 0x6046, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a,
-	0x7130, 0x6156, 0x2009, 0x0044, 0x080c, 0xc774, 0x0408, 0x080c,
-	0x6315, 0x1138, 0xb807, 0x0606, 0x0c30, 0x190c, 0x7975, 0x11c0,
-	0x0898, 0x080c, 0x9a72, 0x2b08, 0x0198, 0x6112, 0x6023, 0x0004,
-	0x7120, 0x610a, 0x9286, 0x0400, 0x1118, 0x6007, 0x0005, 0x0010,
-	0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x8154, 0x080c, 0x868e,
-	0x7817, 0x0140, 0x2001, 0x19bf, 0x2004, 0x9005, 0x090c, 0x868e,
-	0x00ce, 0x00be, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120,
-	0x2011, 0x8049, 0x080c, 0x46b9, 0x080c, 0x9b15, 0x0d48, 0x2b08,
-	0x6112, 0x6023, 0x0006, 0x7120, 0x610a, 0x7130, 0x6156, 0x6017,
-	0xf300, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x810c, 0x080c,
-	0x868e, 0x08b0, 0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7020, 0x2060,
-	0x9c84, 0x0007, 0x11c0, 0x9c82, 0x1cd0, 0x02a8, 0x6864, 0x9c02,
-	0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106,
-	0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124, 0x610a, 0x2009,
-	0x0045, 0x080c, 0x9b42, 0x7817, 0x0140, 0x2001, 0x19bf, 0x2004,
-	0x9005, 0x090c, 0x868e, 0x00be, 0x0005, 0x6120, 0x9186, 0x0002,
-	0x0128, 0x9186, 0x0005, 0x0110, 0x9085, 0x0001, 0x0005, 0x080c,
-	0x2f9e, 0x1168, 0x7010, 0x9084, 0xff00, 0x8007, 0x9086, 0x0000,
-	0x1130, 0x9184, 0x000f, 0x908a, 0x0006, 0x1208, 0x000b, 0x0005,
-	0x7afe, 0x7aff, 0x7afe, 0x7afe, 0x7b5e, 0x7b6d, 0x0005, 0x00b6,
-	0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084, 0x0904, 0x7b5c, 0x700c,
-	0x7108, 0x080c, 0x250b, 0x1904, 0x7b5c, 0x080c, 0x5f91, 0x1904,
-	0x7b5c, 0xbe12, 0xbd16, 0x7110, 0xd1bc, 0x01d8, 0x080c, 0x6315,
-	0x0118, 0x9086, 0x0004, 0x1588, 0x00c6, 0x080c, 0x7b7c, 0x00ce,
-	0x05d8, 0x080c, 0x9a72, 0x2b08, 0x05b8, 0x6112, 0x080c, 0xbc01,
-	0x6023, 0x0002, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0x9b42,
-	0x0458, 0x080c, 0x6315, 0x0148, 0x9086, 0x0004, 0x0130, 0x080c,
-	0x631d, 0x0118, 0x9086, 0x0004, 0x1180, 0x080c, 0x9a72, 0x2b08,
-	0x01d8, 0x6112, 0x080c, 0xbc01, 0x6023, 0x0005, 0x7120, 0x610a,
-	0x2009, 0x0088, 0x080c, 0x9b42, 0x0078, 0x080c, 0x9a72, 0x2b08,
-	0x0158, 0x6112, 0x080c, 0xbc01, 0x6023, 0x0004, 0x7120, 0x610a,
-	0x2009, 0x0001, 0x080c, 0x9b42, 0x00be, 0x0005, 0x7110, 0xd1bc,
-	0x0158, 0x00d1, 0x0148, 0x080c, 0x7add, 0x1130, 0x7124, 0x610a,
-	0x2009, 0x0089, 0x080c, 0x9b42, 0x0005, 0x7110, 0xd1bc, 0x0158,
-	0x0059, 0x0148, 0x080c, 0x7add, 0x1130, 0x7124, 0x610a, 0x2009,
-	0x008a, 0x080c, 0x9b42, 0x0005, 0x7020, 0x2060, 0x9c84, 0x0007,
-	0x1158, 0x9c82, 0x1cd0, 0x0240, 0x2001, 0x1819, 0x2004, 0x9c02,
-	0x1218, 0x9085, 0x0001, 0x0005, 0x9006, 0x0ce8, 0x00b6, 0x7110,
-	0xd1bc, 0x11d8, 0x7024, 0x2060, 0x9c84, 0x0007, 0x11b0, 0x9c82,
-	0x1cd0, 0x0298, 0x6864, 0x9c02, 0x1280, 0x7008, 0x9084, 0x00ff,
-	0x6110, 0x2158, 0xb910, 0x9106, 0x1140, 0x700c, 0xb914, 0x9106,
-	0x1120, 0x2009, 0x0051, 0x080c, 0x9b42, 0x7817, 0x0140, 0x2001,
-	0x19bf, 0x2004, 0x9005, 0x090c, 0x868e, 0x00be, 0x0005, 0x2031,
-	0x0105, 0x0069, 0x0005, 0x2031, 0x0206, 0x0049, 0x0005, 0x2031,
-	0x0207, 0x0029, 0x0005, 0x2031, 0x0213, 0x0009, 0x0005, 0x00c6,
-	0x0096, 0x00f6, 0x7000, 0x9084, 0xf000, 0x9086, 0xc000, 0x05d0,
-	0x080c, 0x9a72, 0x05b8, 0x0066, 0x00c6, 0x0046, 0x2011, 0x0263,
-	0x2204, 0x8211, 0x220c, 0x080c, 0x250b, 0x15a0, 0x080c, 0x5f91,
-	0x1588, 0xbe12, 0xbd16, 0x2b00, 0x004e, 0x00ce, 0x6012, 0x080c,
-	0xbc01, 0x080c, 0x0fec, 0x0510, 0x2900, 0x605a, 0x9006, 0xa802,
-	0xa866, 0xac6a, 0xa85c, 0x90f8, 0x001b, 0x20a9, 0x000e, 0xa860,
-	0x20e8, 0x20e1, 0x0000, 0x2fa0, 0x2e98, 0x4003, 0x006e, 0x6616,
-	0x6007, 0x003e, 0x6023, 0x0001, 0x6003, 0x0001, 0x080c, 0x8154,
-	0x080c, 0x868e, 0x00fe, 0x009e, 0x00ce, 0x0005, 0x080c, 0x9ac8,
-	0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8, 0x00c6, 0x7000, 0x908c,
-	0xff00, 0x9184, 0xf000, 0x810f, 0x9086, 0x2000, 0x1904, 0x7c6c,
-	0x9186, 0x0022, 0x15f0, 0x2001, 0x0111, 0x2004, 0x9005, 0x1904,
-	0x7c6e, 0x7030, 0x908e, 0x0400, 0x0904, 0x7c6e, 0x908e, 0x6000,
-	0x05e8, 0x908e, 0x5400, 0x05d0, 0x908e, 0x0300, 0x11d8, 0x2009,
-	0x1836, 0x210c, 0xd18c, 0x1590, 0xd1a4, 0x1580, 0x080c, 0x62d3,
-	0x0558, 0x68ac, 0x9084, 0x00ff, 0x7100, 0x918c, 0x00ff, 0x9106,
-	0x1518, 0x687c, 0x69ac, 0x918c, 0xff00, 0x9105, 0x7104, 0x9106,
-	0x11d8, 0x00e0, 0x2009, 0x0103, 0x210c, 0xd1b4, 0x11a8, 0x908e,
-	0x5200, 0x09e8, 0x908e, 0x0500, 0x09d0, 0x908e, 0x5000, 0x09b8,
-	0x0058, 0x9186, 0x0023, 0x1140, 0x080c, 0x7b7c, 0x0128, 0x6004,
-	0x9086, 0x0002, 0x0118, 0x0000, 0x9006, 0x0010, 0x9085, 0x0001,
-	0x00ce, 0x0005, 0x00f6, 0x2079, 0x0200, 0x7800, 0xc0e5, 0xc0cc,
-	0x7802, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x1800, 0x7834, 0xd084,
-	0x1130, 0x2079, 0x0200, 0x7800, 0x9085, 0x1200, 0x7802, 0x00fe,
-	0x0005, 0x00e6, 0x2071, 0x1800, 0x7034, 0xc084, 0x7036, 0x00ee,
-	0x0005, 0x2071, 0x19c9, 0x7003, 0x0003, 0x700f, 0x0361, 0x9006,
-	0x701a, 0x7072, 0x7012, 0x7017, 0x1cd0, 0x7007, 0x0000, 0x7026,
-	0x702b, 0x90d7, 0x7032, 0x7037, 0x9145, 0x703f, 0xffff, 0x7042,
-	0x7047, 0x4ff2, 0x704a, 0x705b, 0x7dee, 0x080c, 0x1005, 0x090c,
-	0x0db4, 0x2900, 0x703a, 0xa867, 0x0003, 0xa86f, 0x0100, 0xa8ab,
-	0xdcb0, 0x0005, 0x2071, 0x19c9, 0x1d04, 0x7d45, 0x2091, 0x6000,
-	0x700c, 0x8001, 0x700e, 0x1510, 0x2001, 0x1875, 0x2004, 0xd0c4,
-	0x0158, 0x3a00, 0xd08c, 0x1140, 0x20d1, 0x0000, 0x20d1, 0x0001,
-	0x20d1, 0x0000, 0x080c, 0x0db4, 0x700f, 0x0361, 0x7007, 0x0001,
-	0x0126, 0x2091, 0x8000, 0x080c, 0x7e33, 0x7040, 0x900d, 0x0148,
-	0x8109, 0x7142, 0x1130, 0x7044, 0x080f, 0x0018, 0x0126, 0x2091,
-	0x8000, 0x7024, 0x900d, 0x0188, 0x7020, 0x8001, 0x7022, 0x1168,
-	0x7023, 0x0009, 0x8109, 0x7126, 0x9186, 0x03e8, 0x1110, 0x7028,
-	0x080f, 0x81ff, 0x1110, 0x7028, 0x080f, 0x7030, 0x900d, 0x0180,
-	0x702c, 0x8001, 0x702e, 0x1160, 0x702f, 0x0009, 0x8109, 0x7132,
-	0x0128, 0x9184, 0x007f, 0x090c, 0x91bf, 0x0010, 0x7034, 0x080f,
-	0x703c, 0x9005, 0x0118, 0x0310, 0x8001, 0x703e, 0x704c, 0x900d,
-	0x0168, 0x7048, 0x8001, 0x704a, 0x1148, 0x704b, 0x0009, 0x8109,
-	0x714e, 0x1120, 0x7150, 0x714e, 0x7058, 0x080f, 0x7018, 0x900d,
-	0x01d8, 0x0016, 0x7070, 0x900d, 0x0158, 0x706c, 0x8001, 0x706e,
-	0x1138, 0x706f, 0x0009, 0x8109, 0x7172, 0x1110, 0x7074, 0x080f,
-	0x001e, 0x7008, 0x8001, 0x700a, 0x1138, 0x700b, 0x0009, 0x8109,
-	0x711a, 0x1110, 0x701c, 0x080f, 0x012e, 0x7004, 0x0002, 0x7d6d,
-	0x7d6e, 0x7d8a, 0x00e6, 0x2071, 0x19c9, 0x7018, 0x9005, 0x1120,
-	0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006,
-	0x2071, 0x19c9, 0x701c, 0x9206, 0x1120, 0x701a, 0x701e, 0x7072,
-	0x7076, 0x000e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x19c9, 0xb888,
-	0x9102, 0x0208, 0xb98a, 0x00ee, 0x0005, 0x0005, 0x00b6, 0x7110,
-	0x080c, 0x5ff1, 0x1168, 0xb888, 0x8001, 0x0250, 0xb88a, 0x1140,
-	0x0126, 0x2091, 0x8000, 0x0016, 0x080c, 0x868e, 0x001e, 0x012e,
-	0x8108, 0x9182, 0x0800, 0x0218, 0x900e, 0x7007, 0x0002, 0x7112,
-	0x00be, 0x0005, 0x7014, 0x2060, 0x0126, 0x2091, 0x8000, 0x6040,
-	0x9005, 0x0128, 0x8001, 0x6042, 0x1110, 0x080c, 0xba92, 0x6018,
-	0x9005, 0x0510, 0x8001, 0x601a, 0x11f8, 0x6120, 0x9186, 0x0003,
-	0x0118, 0x9186, 0x0006, 0x11b0, 0x6014, 0x2048, 0xa884, 0x908a,
-	0x199a, 0x0280, 0x9082, 0x1999, 0xa886, 0x908a, 0x199a, 0x0210,
-	0x2001, 0x1999, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c,
-	0xd0e4, 0x0110, 0x080c, 0xb4ab, 0x012e, 0x9c88, 0x0018, 0x7116,
-	0x2001, 0x1819, 0x2004, 0x9102, 0x0220, 0x7017, 0x1cd0, 0x7007,
-	0x0000, 0x0005, 0x00e6, 0x2071, 0x19c9, 0x7027, 0x07d0, 0x7023,
-	0x0009, 0x00ee, 0x0005, 0x2001, 0x19d2, 0x2003, 0x0000, 0x0005,
-	0x00e6, 0x2071, 0x19c9, 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005,
-	0x2011, 0x19d5, 0x2013, 0x0000, 0x0005, 0x00e6, 0x2071, 0x19c9,
-	0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x0086, 0x0026,
-	0x7054, 0x8000, 0x7056, 0x2001, 0x19d7, 0x2044, 0xa06c, 0x9086,
-	0x0000, 0x0150, 0x7068, 0xa09a, 0x7064, 0xa096, 0x7060, 0xa092,
-	0x705c, 0xa08e, 0x080c, 0x10cc, 0x002e, 0x008e, 0x0005, 0x0006,
-	0x0016, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6,
-	0x0156, 0x080c, 0x7cba, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce,
-	0x00be, 0x00ae, 0x009e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071,
-	0x19c9, 0x7172, 0x7276, 0x706f, 0x0009, 0x00ee, 0x0005, 0x00e6,
-	0x0006, 0x2071, 0x19c9, 0x7074, 0x9206, 0x1110, 0x7072, 0x7076,
-	0x000e, 0x00ee, 0x0005, 0x2069, 0x1800, 0x69e4, 0xd1e4, 0x1518,
-	0x0026, 0xd1ec, 0x0140, 0x6a50, 0x6870, 0x9202, 0x0288, 0x8117,
-	0x9294, 0x00c0, 0x0088, 0x9184, 0x0007, 0x01a0, 0x8109, 0x9184,
-	0x0007, 0x0110, 0x69e6, 0x0070, 0x8107, 0x9084, 0x0007, 0x910d,
-	0x8107, 0x9106, 0x9094, 0x00c0, 0x9184, 0xff3f, 0x9205, 0x68e6,
-	0x080c, 0x0ecb, 0x002e, 0x0005, 0x00c6, 0x2061, 0x1a3e, 0x00ce,
-	0x0005, 0x9184, 0x000f, 0x8003, 0x8003, 0x8003, 0x9080, 0x1a3e,
-	0x2060, 0x0005, 0xa884, 0x908a, 0x199a, 0x1638, 0x9005, 0x1150,
-	0x00c6, 0x2061, 0x1a3e, 0x6014, 0x00ce, 0x9005, 0x1130, 0x2001,
-	0x001e, 0x0018, 0x908e, 0xffff, 0x01b0, 0x8003, 0x800b, 0x810b,
-	0x9108, 0x611a, 0xa87c, 0x908c, 0x00c0, 0x918e, 0x00c0, 0x0904,
-	0x7ef4, 0xd0b4, 0x1168, 0xd0bc, 0x1904, 0x7ecd, 0x2009, 0x0006,
-	0x080c, 0x7f21, 0x0005, 0x900e, 0x0c60, 0x2001, 0x1999, 0x08b0,
-	0xd0fc, 0x0160, 0x908c, 0x0003, 0x0120, 0x918e, 0x0003, 0x1904,
-	0x7f1b, 0x908c, 0x2020, 0x918e, 0x2020, 0x01a8, 0x6024, 0xd0d4,
-	0x11e8, 0x2009, 0x1875, 0x2104, 0xd084, 0x1138, 0x87ff, 0x1120,
-	0x2009, 0x0043, 0x0804, 0x9b42, 0x0005, 0x87ff, 0x1de8, 0x2009,
-	0x0042, 0x0804, 0x9b42, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be,
-	0xd1ac, 0x0d20, 0x6024, 0xc0cd, 0x6026, 0x0c00, 0xc0d4, 0x6026,
-	0xa890, 0x602e, 0xa88c, 0x6032, 0x08e0, 0xd0fc, 0x0160, 0x908c,
-	0x0003, 0x0120, 0x918e, 0x0003, 0x1904, 0x7f1b, 0x908c, 0x2020,
-	0x918e, 0x2020, 0x0170, 0x0076, 0x00f6, 0x2c78, 0x080c, 0x15ad,
-	0x00fe, 0x007e, 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, 0x9b42,
-	0x0005, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d58,
-	0x6124, 0xc1cd, 0x6126, 0x0c38, 0xd0fc, 0x0188, 0x908c, 0x2020,
-	0x918e, 0x2020, 0x01a8, 0x9084, 0x0003, 0x908e, 0x0002, 0x0148,
-	0x87ff, 0x1120, 0x2009, 0x0041, 0x080c, 0x9b42, 0x0005, 0x00b9,
-	0x0ce8, 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, 0x9b42, 0x0cb0,
-	0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d20, 0x6124,
-	0xc1cd, 0x6126, 0x0c00, 0x2009, 0x0004, 0x0019, 0x0005, 0x2009,
-	0x0001, 0x0096, 0x080c, 0xb793, 0x0518, 0x6014, 0x2048, 0xa982,
-	0xa800, 0x6016, 0x9186, 0x0001, 0x1188, 0xa97c, 0x918c, 0x8100,
-	0x918e, 0x8100, 0x1158, 0x00c6, 0x2061, 0x1a3e, 0x6200, 0xd28c,
-	0x1120, 0x6204, 0x8210, 0x0208, 0x6206, 0x00ce, 0x080c, 0x642c,
-	0x6014, 0x904d, 0x0076, 0x2039, 0x0000, 0x190c, 0x7e6a, 0x007e,
-	0x009e, 0x0005, 0x0156, 0x00c6, 0x2061, 0x1a3e, 0x6000, 0x81ff,
-	0x0110, 0x9205, 0x0008, 0x9204, 0x6002, 0x00ce, 0x015e, 0x0005,
-	0x6800, 0xd08c, 0x1138, 0x6808, 0x9005, 0x0120, 0x8001, 0x680a,
-	0x9085, 0x0001, 0x0005, 0x0126, 0x2091, 0x8000, 0x0036, 0x0046,
-	0x20a9, 0x0010, 0x9006, 0x8004, 0x2019, 0x0100, 0x231c, 0x93a6,
-	0x0008, 0x1118, 0x8086, 0x818e, 0x0020, 0x80f6, 0x3e00, 0x81f6,
-	0x3e08, 0x1208, 0x9200, 0x1f04, 0x7f6c, 0x93a6, 0x0008, 0x1118,
-	0x8086, 0x818e, 0x0020, 0x80f6, 0x3e00, 0x81f6, 0x3e08, 0x004e,
-	0x003e, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0076, 0x0156,
-	0x20a9, 0x0010, 0x9005, 0x0510, 0x911a, 0x1600, 0x8213, 0x2039,
-	0x0100, 0x273c, 0x97be, 0x0008, 0x1110, 0x818d, 0x0010, 0x81f5,
-	0x3e08, 0x0228, 0x911a, 0x1220, 0x1f04, 0x7f96, 0x0028, 0x911a,
-	0x2308, 0x8210, 0x1f04, 0x7f96, 0x0006, 0x3200, 0x9084, 0xefff,
-	0x2080, 0x000e, 0x015e, 0x007e, 0x012e, 0x0005, 0x0006, 0x3200,
-	0x9085, 0x1000, 0x0ca8, 0x0126, 0x2091, 0x2800, 0x2079, 0x19b6,
-	0x012e, 0x00d6, 0x2069, 0x19b6, 0x6803, 0x0005, 0x0156, 0x0146,
-	0x01d6, 0x20e9, 0x0000, 0x2069, 0x0200, 0x080c, 0x98d5, 0x0401,
-	0x080c, 0x98c0, 0x00e9, 0x080c, 0x98c3, 0x00d1, 0x080c, 0x98c6,
-	0x00b9, 0x080c, 0x98c9, 0x00a1, 0x080c, 0x98cc, 0x0089, 0x080c,
-	0x98cf, 0x0071, 0x080c, 0x98d2, 0x0059, 0x01de, 0x014e, 0x015e,
-	0x2069, 0x0004, 0x2d04, 0x9085, 0x8001, 0x206a, 0x00de, 0x0005,
-	0x20a9, 0x0020, 0x20a1, 0x0240, 0x2001, 0x0000, 0x4004, 0x0005,
-	0x00c6, 0x6027, 0x0001, 0x7804, 0x9084, 0x0007, 0x0002, 0x8009,
-	0x802d, 0x806c, 0x800f, 0x802d, 0x8009, 0x8007, 0x8007, 0x080c,
-	0x0db4, 0x080c, 0x7dd3, 0x080c, 0x868e, 0x00ce, 0x0005, 0x62c0,
-	0x82ff, 0x1110, 0x00ce, 0x0005, 0x2011, 0x58fd, 0x080c, 0x7d56,
-	0x7828, 0x9092, 0x00c8, 0x1228, 0x8000, 0x782a, 0x080c, 0x593d,
-	0x0c88, 0x62c0, 0x080c, 0x98d9, 0x080c, 0x58fd, 0x7807, 0x0003,
-	0x7827, 0x0000, 0x782b, 0x0000, 0x0c28, 0x080c, 0x7dd3, 0x6220,
-	0xd2a4, 0x0160, 0x782b, 0x0000, 0x7824, 0x9065, 0x090c, 0x0db4,
-	0x2009, 0x0013, 0x080c, 0x9b42, 0x00ce, 0x0005, 0x00c6, 0x7824,
-	0x9065, 0x090c, 0x0db4, 0x7828, 0x9092, 0xc350, 0x12c0, 0x8000,
-	0x782a, 0x00ce, 0x080c, 0x2872, 0x0278, 0x00c6, 0x7924, 0x2160,
-	0x6010, 0x906d, 0x090c, 0x0db4, 0x7807, 0x0000, 0x7827, 0x0000,
-	0x00ce, 0x080c, 0x868e, 0x0c00, 0x080c, 0x909d, 0x08e8, 0x2011,
-	0x0130, 0x2214, 0x080c, 0x98d9, 0x080c, 0xd4f8, 0x2009, 0x0014,
-	0x080c, 0x9b42, 0x00ce, 0x0880, 0x2001, 0x19d2, 0x2003, 0x0000,
-	0x62c0, 0x82ff, 0x1160, 0x782b, 0x0000, 0x7824, 0x9065, 0x090c,
-	0x0db4, 0x2009, 0x0013, 0x080c, 0x9b94, 0x00ce, 0x0005, 0x00b6,
-	0x00c6, 0x00d6, 0x7824, 0x9005, 0x090c, 0x0db4, 0x7828, 0x9092,
-	0xc350, 0x1648, 0x8000, 0x782a, 0x00de, 0x00ce, 0x00be, 0x080c,
-	0x2872, 0x02f0, 0x00b6, 0x00c6, 0x00d6, 0x781c, 0x905d, 0x090c,
-	0x0db4, 0xb800, 0xc0dc, 0xb802, 0x7924, 0x2160, 0x080c, 0x9ac8,
-	0xb93c, 0x81ff, 0x090c, 0x0db4, 0x8109, 0xb93e, 0x7807, 0x0000,
-	0x7827, 0x0000, 0x00de, 0x00ce, 0x00be, 0x080c, 0x868e, 0x0868,
-	0x080c, 0x909d, 0x0850, 0x2011, 0x0130, 0x2214, 0x080c, 0x98d9,
-	0x080c, 0xd4f8, 0x7824, 0x9065, 0x2009, 0x0014, 0x080c, 0x9b42,
-	0x00de, 0x00ce, 0x00be, 0x0804, 0x807d, 0x00c6, 0x2001, 0x009b,
-	0x2004, 0xd0fc, 0x190c, 0x1c18, 0x6024, 0x6027, 0x0002, 0xd0f4,
-	0x1580, 0x62c8, 0x60c4, 0x9205, 0x1170, 0x783c, 0x9065, 0x0130,
-	0x2009, 0x0049, 0x080c, 0x9b42, 0x00ce, 0x0005, 0x2011, 0x19d5,
-	0x2013, 0x0000, 0x0cc8, 0x793c, 0x81ff, 0x0dc0, 0x7944, 0x9192,
-	0x7530, 0x12f0, 0x8108, 0x7946, 0x793c, 0x9188, 0x0008, 0x210c,
-	0x918e, 0x0006, 0x1138, 0x6014, 0x9084, 0x1984, 0x9085, 0x0012,
-	0x6016, 0x0c10, 0x6014, 0x9084, 0x1984, 0x9085, 0x0016, 0x6016,
-	0x08d8, 0x793c, 0x2160, 0x2009, 0x004a, 0x080c, 0x9b42, 0x08a0,
-	0x7848, 0xc085, 0x784a, 0x0880, 0x0006, 0x0016, 0x00c6, 0x0126,
-	0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19b6, 0x6020,
-	0x8000, 0x6022, 0x6010, 0x9005, 0x0148, 0x9080, 0x0003, 0x2102,
-	0x6112, 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005, 0x6116, 0x6112,
-	0x0cc0, 0x00d6, 0x2069, 0x19b6, 0xb800, 0xd0d4, 0x0168, 0x6820,
-	0x8000, 0x6822, 0x9086, 0x0001, 0x1110, 0x2b00, 0x681e, 0x00de,
-	0x0804, 0x868e, 0x00de, 0x0005, 0xc0d5, 0xb802, 0x6818, 0x9005,
-	0x0168, 0xb856, 0xb85b, 0x0000, 0x0086, 0x0006, 0x2b00, 0x681a,
-	0x008e, 0xa05a, 0x008e, 0x2069, 0x19b6, 0x0c08, 0xb856, 0xb85a,
-	0x2b00, 0x681a, 0x681e, 0x08d8, 0x0006, 0x0016, 0x00c6, 0x0126,
-	0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19b6, 0x6020,
-	0x8000, 0x6022, 0x6008, 0x9005, 0x0148, 0x9080, 0x0003, 0x2102,
-	0x610a, 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005, 0x610e, 0x610a,
-	0x0cc0, 0x00c6, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19b6, 0x6034,
-	0x9005, 0x0130, 0x9080, 0x0003, 0x2102, 0x6136, 0x00ce, 0x0005,
-	0x613a, 0x6136, 0x00ce, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6,
-	0x00b6, 0x0096, 0x0076, 0x0066, 0x0056, 0x0036, 0x0026, 0x0016,
-	0x0006, 0x0126, 0x902e, 0x2071, 0x19b6, 0x7638, 0x2660, 0x2678,
-	0x2091, 0x8000, 0x8cff, 0x0904, 0x81fb, 0x6010, 0x2058, 0xb8a0,
-	0x9206, 0x1904, 0x81f6, 0x87ff, 0x0120, 0x6054, 0x9106, 0x1904,
-	0x81f6, 0x703c, 0x9c06, 0x1178, 0x0036, 0x2019, 0x0001, 0x080c,
-	0x935a, 0x7033, 0x0000, 0x9006, 0x703e, 0x7042, 0x7046, 0x704a,
-	0x003e, 0x2029, 0x0001, 0x7038, 0x9c36, 0x1110, 0x660c, 0x763a,
-	0x7034, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7036,
-	0x0010, 0x7037, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110,
-	0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xb793, 0x01c8,
-	0x6014, 0x2048, 0x6020, 0x9086, 0x0003, 0x1590, 0xa867, 0x0103,
-	0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, 0x0076, 0x080c, 0xba7b,
-	0x080c, 0xd42c, 0x080c, 0x65f2, 0x007e, 0x003e, 0x001e, 0x080c,
-	0xb975, 0x080c, 0x9af8, 0x00ce, 0x0804, 0x819a, 0x2c78, 0x600c,
-	0x2060, 0x0804, 0x819a, 0x85ff, 0x0120, 0x0036, 0x080c, 0x8769,
-	0x003e, 0x012e, 0x000e, 0x001e, 0x002e, 0x003e, 0x005e, 0x006e,
-	0x007e, 0x009e, 0x00be, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005,
-	0x6020, 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0076, 0x080c,
-	0xd42c, 0x080c, 0xd133, 0x007e, 0x003e, 0x001e, 0x0890, 0x6020,
-	0x9086, 0x000a, 0x0904, 0x81e0, 0x0804, 0x81de, 0x0006, 0x0066,
-	0x0096, 0x00c6, 0x00d6, 0x00f6, 0x9036, 0x0126, 0x2091, 0x8000,
-	0x2079, 0x19b6, 0x7838, 0x9065, 0x0904, 0x8276, 0x600c, 0x0006,
-	0x600f, 0x0000, 0x783c, 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001,
-	0x080c, 0x935a, 0x7833, 0x0000, 0x901e, 0x7b3e, 0x7b42, 0x7b46,
-	0x7b4a, 0x003e, 0x080c, 0xb793, 0x0520, 0x6014, 0x2048, 0x6020,
-	0x9086, 0x0003, 0x1568, 0x3e08, 0x918e, 0x0002, 0x1188, 0x6010,
-	0x9005, 0x0170, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0140,
-	0x6040, 0x9005, 0x1180, 0x2001, 0x1957, 0x2004, 0x6042, 0x0058,
-	0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x65e5, 0x080c,
-	0xb975, 0x080c, 0x9af8, 0x000e, 0x0804, 0x8233, 0x7e3a, 0x7e36,
-	0x012e, 0x00fe, 0x00de, 0x00ce, 0x009e, 0x006e, 0x000e, 0x0005,
-	0x6020, 0x9086, 0x0006, 0x1118, 0x080c, 0xd133, 0x0c50, 0x6020,
-	0x9086, 0x000a, 0x09f8, 0x08e0, 0x0016, 0x0026, 0x0086, 0x9046,
-	0x0099, 0x080c, 0x8375, 0x008e, 0x002e, 0x001e, 0x0005, 0x00f6,
-	0x0126, 0x2079, 0x19b6, 0x2091, 0x8000, 0x080c, 0x840c, 0x080c,
-	0x849a, 0x012e, 0x00fe, 0x0005, 0x00b6, 0x0096, 0x00f6, 0x00e6,
-	0x00d6, 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126, 0x2091, 0x8000,
-	0x2071, 0x19b6, 0x7614, 0x2660, 0x2678, 0x8cff, 0x0904, 0x833a,
-	0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x8335, 0x88ff, 0x0120,
-	0x6054, 0x9106, 0x1904, 0x8335, 0x7024, 0x9c06, 0x1558, 0x2069,
-	0x0100, 0x6820, 0xd0a4, 0x1508, 0x080c, 0x7dd3, 0x080c, 0x90c1,
-	0x68c3, 0x0000, 0x080c, 0x9570, 0x7027, 0x0000, 0x0036, 0x2069,
-	0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c,
-	0x29bc, 0x9006, 0x080c, 0x29bc, 0x2069, 0x0100, 0x6824, 0xd084,
-	0x0110, 0x6827, 0x0001, 0x003e, 0x0028, 0x6003, 0x0009, 0x630a,
-	0x0804, 0x8335, 0x7014, 0x9c36, 0x1110, 0x660c, 0x7616, 0x7010,
-	0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7012, 0x0010,
-	0x7013, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e,
-	0x0008, 0x2678, 0x600f, 0x0000, 0x6014, 0x2048, 0x080c, 0xb793,
-	0x01e8, 0x6020, 0x9086, 0x0003, 0x1580, 0x080c, 0xb992, 0x1118,
-	0x080c, 0xa456, 0x0098, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000,
-	0x0016, 0x0036, 0x0086, 0x080c, 0xba7b, 0x080c, 0xd42c, 0x080c,
-	0x65f2, 0x008e, 0x003e, 0x001e, 0x080c, 0xb975, 0x080c, 0x9af8,
-	0x080c, 0x9446, 0x00ce, 0x0804, 0x82b5, 0x2c78, 0x600c, 0x2060,
-	0x0804, 0x82b5, 0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, 0x00de,
-	0x00ee, 0x00fe, 0x009e, 0x00be, 0x0005, 0x6020, 0x9086, 0x0006,
-	0x1158, 0x0016, 0x0036, 0x0086, 0x080c, 0xd42c, 0x080c, 0xd133,
-	0x008e, 0x003e, 0x001e, 0x08d0, 0x080c, 0xa456, 0x6020, 0x9086,
-	0x0002, 0x1160, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0904,
-	0x831b, 0x9086, 0x008b, 0x0904, 0x831b, 0x0840, 0x6020, 0x9086,
-	0x0005, 0x1920, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x09c8,
-	0x9086, 0x008b, 0x09b0, 0x0804, 0x832e, 0x00b6, 0x00a6, 0x0096,
-	0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0x9280, 0x1000, 0x2004,
-	0x905d, 0x0904, 0x8405, 0x00f6, 0x00e6, 0x00d6, 0x0066, 0x2071,
-	0x19b6, 0xbe54, 0x7018, 0x9b06, 0x1108, 0x761a, 0x701c, 0x9b06,
-	0x1130, 0x86ff, 0x1118, 0x7018, 0x701e, 0x0008, 0x761e, 0xb858,
-	0x904d, 0x0108, 0xae56, 0x96d5, 0x0000, 0x0110, 0x2900, 0xb05a,
-	0xb857, 0x0000, 0xb85b, 0x0000, 0xb800, 0xc0d4, 0xc0dc, 0xb802,
-	0x080c, 0x5f24, 0x0904, 0x8401, 0x7624, 0x86ff, 0x0904, 0x83f0,
-	0x9680, 0x0005, 0x2004, 0x9906, 0x15d8, 0x00d6, 0x2069, 0x0100,
-	0x68c0, 0x9005, 0x0560, 0x080c, 0x7dd3, 0x080c, 0x90c1, 0x68c3,
-	0x0000, 0x080c, 0x9570, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140,
-	0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x29bc,
-	0x9006, 0x080c, 0x29bc, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110,
-	0x6827, 0x0001, 0x003e, 0x00de, 0x00c6, 0xb83c, 0x9005, 0x0110,
-	0x8001, 0xb83e, 0x2660, 0x080c, 0x9af8, 0x00ce, 0x0048, 0x00de,
-	0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x83a8,
-	0x89ff, 0x0158, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c,
-	0xba7b, 0x080c, 0xd42c, 0x080c, 0x65f2, 0x080c, 0x9446, 0x0804,
-	0x83a8, 0x006e, 0x00de, 0x00ee, 0x00fe, 0x012e, 0x000e, 0x00ce,
-	0x009e, 0x00ae, 0x00be, 0x0005, 0x0096, 0x0006, 0x0066, 0x00c6,
-	0x00d6, 0x9036, 0x7814, 0x9065, 0x0904, 0x846d, 0x600c, 0x0006,
-	0x600f, 0x0000, 0x7824, 0x9c06, 0x1570, 0x2069, 0x0100, 0x6820,
-	0xd0a4, 0x1508, 0x080c, 0x7dd3, 0x080c, 0x90c1, 0x68c3, 0x0000,
-	0x080c, 0x9570, 0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04,
-	0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x29bc, 0x9006,
-	0x080c, 0x29bc, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827,
-	0x0001, 0x003e, 0x0040, 0x080c, 0x62cb, 0x1520, 0x6003, 0x0009,
-	0x630a, 0x2c30, 0x00f8, 0x6014, 0x2048, 0x080c, 0xb791, 0x01b0,
-	0x6020, 0x9086, 0x0003, 0x1508, 0x080c, 0xb992, 0x1118, 0x080c,
-	0xa456, 0x0060, 0x080c, 0x62cb, 0x1168, 0xa867, 0x0103, 0xab7a,
-	0xa877, 0x0000, 0x080c, 0x65f2, 0x080c, 0xb975, 0x080c, 0x9af8,
-	0x080c, 0x9446, 0x000e, 0x0804, 0x8413, 0x7e16, 0x7e12, 0x00de,
-	0x00ce, 0x006e, 0x000e, 0x009e, 0x0005, 0x6020, 0x9086, 0x0006,
-	0x1118, 0x080c, 0xd133, 0x0c50, 0x080c, 0xa456, 0x6020, 0x9086,
-	0x0002, 0x1150, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0990,
-	0x9086, 0x008b, 0x0978, 0x08d0, 0x6020, 0x9086, 0x0005, 0x19b0,
-	0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0d18, 0x9086, 0x008b,
-	0x0d00, 0x0860, 0x0006, 0x0066, 0x0096, 0x00b6, 0x00c6, 0x00d6,
-	0x7818, 0x905d, 0x0904, 0x851a, 0xb854, 0x0006, 0x9006, 0xb856,
-	0xb85a, 0xb800, 0xc0d4, 0xc0dc, 0xb802, 0x080c, 0x5f24, 0x0904,
-	0x8517, 0x7e24, 0x86ff, 0x0904, 0x850a, 0x9680, 0x0005, 0x2004,
-	0x9906, 0x1904, 0x850a, 0x00d6, 0x2069, 0x0100, 0x68c0, 0x9005,
-	0x0904, 0x8501, 0x080c, 0x7dd3, 0x080c, 0x90c1, 0x68c3, 0x0000,
-	0x080c, 0x9570, 0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04,
-	0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x29bc, 0x9006,
-	0x080c, 0x29bc, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827,
-	0x0001, 0x003e, 0x00de, 0x00c6, 0x3e08, 0x918e, 0x0002, 0x1168,
-	0xb800, 0xd0bc, 0x0150, 0x9680, 0x0010, 0x200c, 0x81ff, 0x1518,
-	0x2009, 0x1957, 0x210c, 0x2102, 0x00f0, 0xb83c, 0x9005, 0x0110,
-	0x8001, 0xb83e, 0x2660, 0x600f, 0x0000, 0x080c, 0x9af8, 0x00ce,
-	0x0048, 0x00de, 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce,
-	0x0804, 0x84ad, 0x89ff, 0x0138, 0xa867, 0x0103, 0xab7a, 0xa877,
-	0x0000, 0x080c, 0x65f2, 0x080c, 0x9446, 0x0804, 0x84ad, 0x000e,
-	0x0804, 0x84a1, 0x781e, 0x781a, 0x00de, 0x00ce, 0x00be, 0x009e,
-	0x006e, 0x000e, 0x0005, 0x00e6, 0x00d6, 0x0096, 0x0066, 0xb800,
-	0xd0dc, 0x01a0, 0xb84c, 0x904d, 0x0188, 0xa878, 0x9606, 0x1170,
-	0x2071, 0x19b6, 0x7024, 0x9035, 0x0148, 0x9080, 0x0005, 0x2004,
-	0x9906, 0x1120, 0xb800, 0xc0dc, 0xb802, 0x0029, 0x006e, 0x009e,
-	0x00de, 0x00ee, 0x0005, 0x00f6, 0x2079, 0x0100, 0x78c0, 0x9005,
-	0x1138, 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x04b8,
-	0x080c, 0x90c1, 0x78c3, 0x0000, 0x080c, 0x9570, 0x7027, 0x0000,
-	0x0036, 0x2079, 0x0140, 0x7b04, 0x9384, 0x1000, 0x0138, 0x2001,
-	0x0100, 0x080c, 0x29bc, 0x9006, 0x080c, 0x29bc, 0x2079, 0x0100,
-	0x7824, 0xd084, 0x0110, 0x7827, 0x0001, 0x080c, 0x9570, 0x003e,
-	0x080c, 0x5f24, 0x00c6, 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e,
-	0x2660, 0x080c, 0x9ac8, 0x00ce, 0xa867, 0x0103, 0xab7a, 0xa877,
-	0x0000, 0x080c, 0xba7b, 0x080c, 0x65f2, 0x080c, 0x9446, 0x00fe,
-	0x0005, 0x00b6, 0x00e6, 0x00c6, 0x2011, 0x0101, 0x2204, 0xc0c4,
-	0x2012, 0x2001, 0x180c, 0x2014, 0xc2e4, 0x2202, 0x2071, 0x19b6,
-	0x7004, 0x9084, 0x0007, 0x0002, 0x85a6, 0x85aa, 0x85c1, 0x85ea,
-	0x8628, 0x85a6, 0x85c1, 0x85a4, 0x080c, 0x0db4, 0x00ce, 0x00ee,
-	0x00be, 0x0005, 0x7024, 0x9065, 0x0148, 0x7020, 0x8001, 0x7022,
-	0x600c, 0x9015, 0x0158, 0x7216, 0x600f, 0x0000, 0x7007, 0x0000,
-	0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x7216, 0x7212,
-	0x0ca8, 0x6010, 0x2058, 0x080c, 0x5f24, 0xb800, 0xc0dc, 0xb802,
-	0x7007, 0x0000, 0x7027, 0x0000, 0x7020, 0x8001, 0x7022, 0x1148,
-	0x2001, 0x180c, 0x2014, 0xd2ec, 0x1180, 0x00ce, 0x00ee, 0x00be,
-	0x0005, 0xb854, 0x9015, 0x0120, 0x721e, 0x080c, 0x868e, 0x0ca8,
-	0x7218, 0x721e, 0x080c, 0x868e, 0x0c80, 0xc2ec, 0x2202, 0x080c,
-	0x8769, 0x0c58, 0x7024, 0x9065, 0x05b8, 0x700c, 0x9c06, 0x1160,
-	0x080c, 0x9446, 0x600c, 0x9015, 0x0120, 0x720e, 0x600f, 0x0000,
-	0x0448, 0x720e, 0x720a, 0x0430, 0x7014, 0x9c06, 0x1160, 0x080c,
-	0x9446, 0x600c, 0x9015, 0x0120, 0x7216, 0x600f, 0x0000, 0x00d0,
-	0x7216, 0x7212, 0x00b8, 0x6020, 0x9086, 0x0003, 0x1198, 0x6010,
-	0x2058, 0x080c, 0x5f24, 0xb800, 0xc0dc, 0xb802, 0x080c, 0x9446,
-	0x701c, 0x9065, 0x0138, 0xb854, 0x9015, 0x0110, 0x721e, 0x0010,
-	0x7218, 0x721e, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be, 0x0005,
-	0x7024, 0x9065, 0x0140, 0x080c, 0x9446, 0x600c, 0x9015, 0x0158,
-	0x720e, 0x600f, 0x0000, 0x080c, 0x9570, 0x7027, 0x0000, 0x00ce,
-	0x00ee, 0x00be, 0x0005, 0x720e, 0x720a, 0x0ca8, 0x00d6, 0x2069,
-	0x19b6, 0x6830, 0x9084, 0x0003, 0x0002, 0x864b, 0x864d, 0x8671,
-	0x8649, 0x080c, 0x0db4, 0x00de, 0x0005, 0x00c6, 0x6840, 0x9086,
-	0x0001, 0x01b8, 0x683c, 0x9065, 0x0130, 0x600c, 0x9015, 0x0170,
-	0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x2011,
-	0x19d5, 0x2013, 0x0000, 0x00ce, 0x00de, 0x0005, 0x683a, 0x6836,
-	0x0c90, 0x6843, 0x0000, 0x6838, 0x9065, 0x0d68, 0x6003, 0x0003,
-	0x0c50, 0x00c6, 0x9006, 0x6842, 0x6846, 0x684a, 0x683c, 0x9065,
-	0x0160, 0x600c, 0x9015, 0x0130, 0x6a3a, 0x600f, 0x0000, 0x683f,
-	0x0000, 0x0018, 0x683e, 0x683a, 0x6836, 0x00ce, 0x00de, 0x0005,
-	0x2001, 0x180c, 0x200c, 0xc1e5, 0x2102, 0x0005, 0x2001, 0x180c,
-	0x200c, 0xd1ec, 0x0120, 0xc1ec, 0x2102, 0x080c, 0x8769, 0x2001,
-	0x19c2, 0x2004, 0x9086, 0x0001, 0x0d58, 0x00d6, 0x2069, 0x19b6,
-	0x6804, 0x9084, 0x0007, 0x0002, 0x86ae, 0x8751, 0x8751, 0x8751,
-	0x8751, 0x8753, 0x8751, 0x86ac, 0x080c, 0x0db4, 0x6820, 0x9005,
-	0x1110, 0x00de, 0x0005, 0x00c6, 0x680c, 0x9065, 0x0150, 0x6807,
-	0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x87bf, 0x00ce, 0x00de,
-	0x0005, 0x6814, 0x9065, 0x0150, 0x6807, 0x0001, 0x6826, 0x682b,
-	0x0000, 0x080c, 0x87bf, 0x00ce, 0x00de, 0x0005, 0x00b6, 0x00e6,
-	0x6a1c, 0x92dd, 0x0000, 0x0904, 0x873d, 0xb84c, 0x900d, 0x0118,
-	0xb888, 0x9005, 0x01a0, 0xb854, 0x905d, 0x0120, 0x920e, 0x0904,
-	0x873d, 0x0028, 0x6818, 0x920e, 0x0904, 0x873d, 0x2058, 0xb84c,
-	0x900d, 0x0d88, 0xb888, 0x9005, 0x1d70, 0x2b00, 0x681e, 0xbb3c,
-	0xb838, 0x9302, 0x1e40, 0x080c, 0x9a9f, 0x0904, 0x873d, 0x8318,
-	0xbb3e, 0x6116, 0x2b10, 0x6212, 0x0096, 0x2148, 0xa880, 0x9084,
-	0x00ff, 0x605e, 0xa883, 0x0000, 0xa884, 0x009e, 0x908a, 0x199a,
-	0x0210, 0x2001, 0x1999, 0x8003, 0x801b, 0x831b, 0x9318, 0x631a,
-	0x6114, 0x0096, 0x2148, 0xa964, 0x009e, 0x918c, 0x00ff, 0x918e,
-	0x0048, 0x0538, 0x00f6, 0x2c78, 0x2061, 0x0100, 0xbab0, 0x629a,
-	0x2069, 0x0200, 0x2071, 0x0240, 0x080c, 0x8cf7, 0x2069, 0x19b6,
-	0xbb00, 0xc3dd, 0xbb02, 0x6807, 0x0002, 0x2f18, 0x6b26, 0x682b,
-	0x0000, 0x7823, 0x0003, 0x7803, 0x0001, 0x7807, 0x0040, 0x00fe,
-	0x00ee, 0x00be, 0x00ce, 0x00de, 0x0005, 0x00ee, 0x00be, 0x00ce,
-	0x0cd0, 0xbb00, 0xc3dd, 0xbb02, 0x6807, 0x0006, 0x2f18, 0x6b26,
-	0x682b, 0x0000, 0x080c, 0x98f9, 0x00ee, 0x00be, 0x00ce, 0x00de,
-	0x0005, 0x00de, 0x0005, 0x00c6, 0x680c, 0x9065, 0x0138, 0x6807,
-	0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x87bf, 0x00ce, 0x00de,
-	0x0005, 0x2001, 0x180c, 0x2014, 0xc2ed, 0x2202, 0x00de, 0x00fe,
-	0x0005, 0x00f6, 0x00d6, 0x2069, 0x19b6, 0x6830, 0x9086, 0x0000,
-	0x1548, 0x2001, 0x180c, 0x2014, 0xd2e4, 0x0130, 0xc2e4, 0x2202,
-	0x080c, 0x869d, 0x2069, 0x19b6, 0x2001, 0x180c, 0x200c, 0xd1c4,
-	0x11e0, 0x6838, 0x907d, 0x01b0, 0x6a04, 0x9296, 0x0000, 0x1588,
-	0x6833, 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x0126,
-	0x00f6, 0x2091, 0x2400, 0x002e, 0x080c, 0x1a26, 0x1178, 0x012e,
-	0x080c, 0x8f0f, 0x00de, 0x00fe, 0x0005, 0xc1c4, 0x2102, 0x0066,
-	0x2031, 0x0001, 0x080c, 0x6dc4, 0x006e, 0x08d8, 0x012e, 0x6843,
-	0x0000, 0x7803, 0x0002, 0x780c, 0x9015, 0x0140, 0x6a3a, 0x780f,
-	0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x0c20, 0x683a, 0x6836,
-	0x0cc0, 0x6a04, 0x9296, 0x0006, 0x0958, 0x0804, 0x8761, 0x6020,
-	0x9084, 0x000f, 0x000b, 0x0005, 0x87d3, 0x87d8, 0x8c31, 0x8cc0,
-	0x87d8, 0x8c31, 0x8cc0, 0x87d3, 0x87d8, 0x87d3, 0x87d3, 0x87d3,
-	0x87d3, 0x87d3, 0x87d3, 0x080c, 0x8589, 0x080c, 0x868e, 0x0005,
-	0x00b6, 0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6,
-	0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004, 0x908a,
-	0x0053, 0x1a0c, 0x0db4, 0x6110, 0x2158, 0xb9b0, 0x2c78, 0x2061,
-	0x0100, 0x619a, 0x908a, 0x0040, 0x1a04, 0x8844, 0x005b, 0x00fe,
-	0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e,
-	0x00be, 0x0005, 0x89bb, 0x89f6, 0x8a1f, 0x8ac2, 0x8ae3, 0x8ae9,
-	0x8af6, 0x8afe, 0x8b0a, 0x8b10, 0x8b21, 0x8b10, 0x8b78, 0x8afe,
-	0x8b84, 0x8b8a, 0x8b0a, 0x8b8a, 0x8b96, 0x8842, 0x8842, 0x8842,
-	0x8842, 0x8842, 0x8842, 0x8842, 0x8842, 0x8842, 0x8842, 0x8842,
-	0x9211, 0x9234, 0x9245, 0x9265, 0x9297, 0x8af6, 0x8842, 0x8af6,
-	0x8b10, 0x8842, 0x8a1f, 0x8ac2, 0x8842, 0x965d, 0x8b10, 0x8842,
-	0x9679, 0x8b10, 0x8842, 0x8b0a, 0x89b5, 0x8865, 0x8842, 0x9695,
-	0x9702, 0x97d9, 0x8842, 0x97e6, 0x8af3, 0x9811, 0x8842, 0x92a1,
-	0x983e, 0x8842, 0x080c, 0x0db4, 0x2100, 0x005b, 0x00fe, 0x00ee,
-	0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be,
-	0x0005, 0x8863, 0x8863, 0x8863, 0x888c, 0x8938, 0x8943, 0x8863,
-	0x8863, 0x8863, 0x898a, 0x8996, 0x88a7, 0x8863, 0x88c2, 0x88f6,
-	0x99bb, 0x9a00, 0x8b10, 0x080c, 0x0db4, 0x00d6, 0x0096, 0x080c,
-	0x8ba9, 0x7003, 0x2414, 0x7007, 0x0018, 0x700b, 0x0800, 0x7814,
-	0x2048, 0xa83c, 0x700e, 0xa850, 0x7022, 0xa854, 0x7026, 0x60c3,
-	0x0018, 0x080c, 0x9095, 0x009e, 0x00de, 0x0005, 0x7810, 0x00b6,
-	0x2058, 0xb8a0, 0x00be, 0x080c, 0x9a47, 0x1118, 0x9084, 0xff80,
-	0x0110, 0x9085, 0x0001, 0x0005, 0x00d6, 0x0096, 0x080c, 0x8ba9,
-	0x7003, 0x0500, 0x7814, 0x2048, 0xa874, 0x700a, 0xa878, 0x700e,
-	0xa87c, 0x7012, 0xa880, 0x7016, 0xa884, 0x701a, 0xa888, 0x701e,
-	0x60c3, 0x0010, 0x080c, 0x9095, 0x009e, 0x00de, 0x0005, 0x00d6,
-	0x0096, 0x080c, 0x8ba9, 0x7003, 0x0500, 0x7814, 0x2048, 0xa8cc,
-	0x700a, 0xa8d0, 0x700e, 0xa8d4, 0x7012, 0xa8d8, 0x7016, 0xa8dc,
-	0x701a, 0xa8e0, 0x701e, 0x60c3, 0x0010, 0x080c, 0x9095, 0x009e,
-	0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x8ba9, 0x20e9, 0x0000, 0x2001, 0x1972, 0x2003, 0x0000, 0x7814,
-	0x2048, 0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0,
-	0xa85c, 0x9080, 0x001b, 0x2098, 0x2001, 0x1972, 0x0016, 0x200c,
-	0x2001, 0x0001, 0x080c, 0x20f5, 0x080c, 0xc47e, 0x9006, 0x080c,
-	0x20f5, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c28, 0x04d9,
-	0x080c, 0x9095, 0x012e, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096,
-	0x0126, 0x2091, 0x8000, 0x080c, 0x8bf4, 0x20e9, 0x0000, 0x2001,
-	0x1972, 0x2003, 0x0000, 0x7814, 0x2048, 0xa86f, 0x0200, 0xa873,
-	0x0000, 0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0,
-	0xa85c, 0x9080, 0x001b, 0x2098, 0x2001, 0x1972, 0x0016, 0x200c,
-	0x080c, 0xc47e, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c60,
-	0x0051, 0x7814, 0x2048, 0x080c, 0x0f9e, 0x080c, 0x9095, 0x012e,
-	0x009e, 0x00de, 0x0005, 0x60c0, 0x8004, 0x9084, 0x0003, 0x9005,
-	0x0130, 0x9082, 0x0004, 0x20a3, 0x0000, 0x8000, 0x1de0, 0x0005,
-	0x080c, 0x8ba9, 0x7003, 0x7800, 0x7808, 0x8007, 0x700a, 0x60c3,
-	0x0008, 0x0804, 0x9095, 0x00d6, 0x00e6, 0x080c, 0x8bf4, 0x7814,
-	0x9084, 0xff00, 0x2073, 0x0200, 0x8e70, 0x8e70, 0x9095, 0x0010,
-	0x2272, 0x8e70, 0x2073, 0x0034, 0x8e70, 0x2069, 0x1805, 0x20a9,
-	0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x8959, 0x2069, 0x1801,
-	0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x8962, 0x2069,
-	0x1982, 0x9086, 0xdf00, 0x0110, 0x2069, 0x199c, 0x20a9, 0x001a,
-	0x9e86, 0x0260, 0x1148, 0x00c6, 0x2061, 0x0200, 0x6010, 0x8000,
-	0x6012, 0x00ce, 0x2071, 0x0240, 0x2d04, 0x8007, 0x2072, 0x8d68,
-	0x8e70, 0x1f04, 0x8970, 0x60c3, 0x004c, 0x080c, 0x9095, 0x00ee,
-	0x00de, 0x0005, 0x080c, 0x8ba9, 0x7003, 0x6300, 0x7007, 0x0028,
-	0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9095, 0x00d6, 0x0026,
-	0x0016, 0x080c, 0x8bf4, 0x7003, 0x0200, 0x7814, 0x700e, 0x00e6,
-	0x9ef0, 0x0004, 0x2009, 0x0001, 0x2011, 0x000c, 0x2073, 0x0800,
-	0x8e70, 0x2073, 0x0000, 0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c,
-	0x9095, 0x001e, 0x002e, 0x00de, 0x0005, 0x2001, 0x1817, 0x2004,
-	0x609a, 0x0804, 0x9095, 0x080c, 0x8ba9, 0x7003, 0x5200, 0x2069,
-	0x1853, 0x6804, 0xd084, 0x0130, 0x6828, 0x0016, 0x080c, 0x253e,
-	0x710e, 0x001e, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805,
-	0x20e9, 0x0000, 0x20a1, 0x0250, 0x4003, 0x20a9, 0x0004, 0x2099,
-	0x1801, 0x20a1, 0x0254, 0x4003, 0x080c, 0x9a47, 0x1120, 0xb8a0,
-	0x9082, 0x007f, 0x0248, 0x2001, 0x181e, 0x2004, 0x7032, 0x2001,
-	0x181f, 0x2004, 0x7036, 0x0030, 0x2001, 0x1817, 0x2004, 0x9084,
-	0x00ff, 0x7036, 0x60c3, 0x001c, 0x0804, 0x9095, 0x080c, 0x8ba9,
-	0x7003, 0x0500, 0x080c, 0x9a47, 0x1120, 0xb8a0, 0x9082, 0x007f,
-	0x0248, 0x2001, 0x181e, 0x2004, 0x700a, 0x2001, 0x181f, 0x2004,
-	0x700e, 0x0030, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x700e,
-	0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000,
-	0x20a1, 0x0250, 0x4003, 0x60c3, 0x0010, 0x0804, 0x9095, 0x080c,
-	0x8ba9, 0x9006, 0x080c, 0x62df, 0xb8a0, 0x9086, 0x007e, 0x1130,
-	0x7003, 0x0400, 0x620c, 0xc2b4, 0x620e, 0x0058, 0x7814, 0x0096,
-	0x904d, 0x0120, 0x9006, 0xa89a, 0xa8a6, 0xa8aa, 0x009e, 0x7003,
-	0x0300, 0xb8a0, 0x9086, 0x007e, 0x1904, 0x8a8a, 0x00d6, 0x2069,
-	0x193d, 0x2001, 0x1836, 0x2004, 0xd0a4, 0x0178, 0x6800, 0x700a,
-	0x6808, 0x9084, 0x2000, 0x7012, 0x680c, 0x7016, 0x701f, 0x2710,
-	0x6818, 0x7022, 0x681c, 0x7026, 0x0080, 0x6800, 0x700a, 0x6804,
-	0x700e, 0x6808, 0x080c, 0x6d14, 0x1118, 0x9084, 0x37ff, 0x0010,
-	0x9084, 0x3fff, 0x7012, 0x680c, 0x7016, 0x00de, 0x20a9, 0x0004,
-	0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256,
-	0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, 0x025a, 0x4003,
-	0x00d6, 0x080c, 0x98c0, 0x2069, 0x1945, 0x2071, 0x024e, 0x6800,
-	0xc0dd, 0x7002, 0x080c, 0x5157, 0xd0e4, 0x0110, 0x680c, 0x700e,
-	0x00de, 0x04a0, 0x2001, 0x1836, 0x2004, 0xd0a4, 0x0168, 0x0016,
-	0x2009, 0x0002, 0x60e0, 0x9106, 0x0130, 0x2100, 0x60e3, 0x0000,
-	0x080c, 0x257f, 0x61e2, 0x001e, 0x20e1, 0x0001, 0x2099, 0x193d,
-	0x20e9, 0x0000, 0x20a1, 0x024e, 0x20a9, 0x0008, 0x4003, 0x20a9,
-	0x0004, 0x2099, 0x1805, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004,
-	0x2099, 0x1801, 0x20a1, 0x025a, 0x4003, 0x080c, 0x98c0, 0x20a1,
-	0x024e, 0x20a9, 0x0008, 0x2099, 0x1945, 0x4003, 0x60c3, 0x0074,
-	0x0804, 0x9095, 0x080c, 0x8ba9, 0x7003, 0x2010, 0x7007, 0x0014,
-	0x700b, 0x0800, 0x700f, 0x2000, 0x9006, 0x00f6, 0x2079, 0x1853,
-	0x7904, 0x00fe, 0xd1ac, 0x1110, 0x9085, 0x0020, 0x0010, 0x9085,
-	0x0010, 0x9085, 0x0002, 0x00d6, 0x0804, 0x8b59, 0x7026, 0x60c3,
-	0x0014, 0x0804, 0x9095, 0x080c, 0x8ba9, 0x7003, 0x5000, 0x0804,
-	0x8a39, 0x080c, 0x8ba9, 0x7003, 0x2110, 0x7007, 0x0014, 0x60c3,
-	0x0014, 0x0804, 0x9095, 0x080c, 0x8beb, 0x0010, 0x080c, 0x8bf4,
-	0x7003, 0x0200, 0x60c3, 0x0004, 0x0804, 0x9095, 0x080c, 0x8bf4,
-	0x7003, 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008,
-	0x0804, 0x9095, 0x080c, 0x8bf4, 0x7003, 0x0200, 0x0804, 0x8a39,
-	0x080c, 0x8bf4, 0x7003, 0x0100, 0x782c, 0x9005, 0x0110, 0x700a,
-	0x0010, 0x700b, 0x0003, 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804,
-	0x9095, 0x00d6, 0x080c, 0x8bf4, 0x7003, 0x0210, 0x7007, 0x0014,
-	0x700b, 0x0800, 0xb894, 0x9086, 0x0014, 0x1198, 0xb99c, 0x9184,
-	0x0030, 0x0190, 0xb998, 0x9184, 0xc000, 0x1140, 0xd1ec, 0x0118,
-	0x700f, 0x2100, 0x0058, 0x700f, 0x0100, 0x0040, 0x700f, 0x0400,
-	0x0028, 0x700f, 0x0700, 0x0010, 0x700f, 0x0800, 0x00f6, 0x2079,
-	0x1853, 0x7904, 0x00fe, 0xd1ac, 0x1110, 0x9085, 0x0020, 0x0010,
-	0x9085, 0x0010, 0x2009, 0x1875, 0x210c, 0xd184, 0x1110, 0x9085,
-	0x0002, 0x0026, 0x2009, 0x1873, 0x210c, 0xd1e4, 0x0150, 0xc0c5,
-	0xbabc, 0xd28c, 0x1108, 0xc0cd, 0x9094, 0x0030, 0x9296, 0x0010,
-	0x0140, 0xd1ec, 0x0130, 0x9094, 0x0030, 0x9296, 0x0010, 0x0108,
-	0xc0bd, 0x002e, 0x7026, 0x60c3, 0x0014, 0x00de, 0x0804, 0x9095,
-	0x080c, 0x8bf4, 0x7003, 0x0210, 0x7007, 0x0014, 0x700f, 0x0100,
-	0x60c3, 0x0014, 0x0804, 0x9095, 0x080c, 0x8bf4, 0x7003, 0x0200,
-	0x0804, 0x89bf, 0x080c, 0x8bf4, 0x7003, 0x0100, 0x700b, 0x0003,
-	0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0x9095, 0x080c, 0x8bf4,
-	0x7003, 0x0100, 0x700b, 0x000b, 0x60c3, 0x0008, 0x0804, 0x9095,
-	0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x3200, 0x2021, 0x0800,
-	0x0040, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x2200, 0x2021,
-	0x0100, 0x080c, 0x98d5, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006,
-	0x2069, 0x1800, 0x6878, 0x700a, 0x687c, 0x700e, 0x9485, 0x0029,
-	0x7012, 0x004e, 0x003e, 0x00de, 0x080c, 0x9083, 0x721a, 0x9f95,
-	0x0000, 0x7222, 0x7027, 0xffff, 0x2071, 0x024c, 0x002e, 0x0005,
-	0x0026, 0x080c, 0x98d5, 0x7003, 0x02ff, 0x7007, 0xfffc, 0x00d6,
-	0x2069, 0x1800, 0x6878, 0x700a, 0x687c, 0x700e, 0x00de, 0x7013,
-	0x2029, 0x0c10, 0x7003, 0x0100, 0x7007, 0x0000, 0x700b, 0xfc02,
-	0x700f, 0x0000, 0x0005, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019,
-	0x3300, 0x2021, 0x0800, 0x0040, 0x0026, 0x00d6, 0x0036, 0x0046,
-	0x2019, 0x2300, 0x2021, 0x0100, 0x080c, 0x98d5, 0xb810, 0x9305,
-	0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0xb810, 0x9005, 0x1140,
-	0xb814, 0x9005, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, 0x0020,
-	0x6878, 0x700a, 0x687c, 0x700e, 0x0000, 0x9485, 0x0098, 0x7012,
-	0x004e, 0x003e, 0x00de, 0x080c, 0x9083, 0x721a, 0x7a08, 0x7222,
-	0x2f10, 0x7226, 0x2071, 0x024c, 0x002e, 0x0005, 0x080c, 0x9083,
-	0x721a, 0x7a08, 0x7222, 0x7814, 0x7026, 0x2071, 0x024c, 0x002e,
-	0x0005, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200,
-	0x2071, 0x0240, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0db4, 0x908a,
-	0x0092, 0x1a0c, 0x0db4, 0x6110, 0x2158, 0xb9b0, 0x2c78, 0x2061,
-	0x0100, 0x619a, 0x9082, 0x0085, 0x0033, 0x00fe, 0x00ee, 0x00de,
-	0x00ce, 0x00be, 0x0005, 0x8c62, 0x8c71, 0x8c7c, 0x8c60, 0x8c60,
-	0x8c60, 0x8c62, 0x8c60, 0x8c60, 0x8c60, 0x8c60, 0x8c60, 0x8c60,
-	0x080c, 0x0db4, 0x0411, 0x60c3, 0x0000, 0x0026, 0x080c, 0x2872,
-	0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x0804,
-	0x9095, 0x0431, 0x7808, 0x700a, 0x7814, 0x700e, 0x7017, 0xffff,
-	0x60c3, 0x000c, 0x0804, 0x9095, 0x0479, 0x7003, 0x0003, 0x7007,
-	0x0300, 0x60c3, 0x0004, 0x0804, 0x9095, 0x0026, 0x080c, 0x98d5,
-	0xb810, 0x9085, 0x8100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800,
-	0x6878, 0x700a, 0x687c, 0x700e, 0x7013, 0x0009, 0x0804, 0x8bc4,
-	0x0026, 0x080c, 0x98d5, 0xb810, 0x9085, 0x8400, 0x7002, 0xb814,
-	0x7006, 0x2069, 0x1800, 0x6878, 0x700a, 0x687c, 0x700e, 0x2001,
-	0x0099, 0x7012, 0x0804, 0x8c26, 0x0026, 0x080c, 0x98d5, 0xb810,
-	0x9085, 0x8500, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878,
-	0x700a, 0x687c, 0x700e, 0x2001, 0x0099, 0x7012, 0x0804, 0x8c26,
-	0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2c78, 0x2069, 0x0200,
-	0x2071, 0x0240, 0x7804, 0x908a, 0x0040, 0x0a0c, 0x0db4, 0x908a,
-	0x0054, 0x1a0c, 0x0db4, 0x7910, 0x2158, 0xb9b0, 0x2061, 0x0100,
-	0x619a, 0x9082, 0x0040, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce,
-	0x00be, 0x0005, 0x8cf7, 0x8d9e, 0x8d71, 0x8ec0, 0x8cf5, 0x8cf5,
-	0x8cf5, 0x8cf5, 0x8cf5, 0x8cf5, 0x8cf5, 0x9413, 0x941f, 0x942b,
-	0x9437, 0x8cf5, 0x981d, 0x8cf5, 0x9407, 0x080c, 0x0db4, 0x0096,
-	0x780b, 0xffff, 0x080c, 0x8d4d, 0x7914, 0x2148, 0xa978, 0x7956,
-	0x7132, 0xa97c, 0x9184, 0x000f, 0x1118, 0x2001, 0x0005, 0x0040,
-	0xd184, 0x0118, 0x2001, 0x0004, 0x0018, 0x9084, 0x0006, 0x8004,
-	0x2010, 0x785c, 0x9084, 0x00ff, 0x8007, 0x9205, 0x7042, 0xd1ac,
-	0x0128, 0x7047, 0x0002, 0x080c, 0x15ad, 0x0050, 0xd1b4, 0x0118,
-	0x7047, 0x0001, 0x0028, 0x7047, 0x0000, 0x9016, 0x2230, 0x0010,
-	0xaab0, 0xaeac, 0x726a, 0x766e, 0x20a9, 0x0008, 0x20e9, 0x0000,
-	0xa860, 0x20e0, 0xa85c, 0x9080, 0x0023, 0x2098, 0x20a1, 0x0252,
-	0x2069, 0x0200, 0x6813, 0x0018, 0x4003, 0x6813, 0x0008, 0x60c3,
-	0x0020, 0x6017, 0x0009, 0x2001, 0x19d2, 0x2003, 0x07d0, 0x2001,
-	0x19d1, 0x2003, 0x0009, 0x009e, 0x0005, 0x6813, 0x0008, 0xba8c,
-	0x8210, 0xb8bc, 0xd084, 0x0128, 0x7a46, 0x7b14, 0x7b4a, 0x722e,
-	0x732a, 0x9294, 0x00ff, 0xba8e, 0x8217, 0x721a, 0xba10, 0x9295,
-	0x0600, 0x7202, 0xba14, 0x7206, 0x2069, 0x1800, 0x6a78, 0x720a,
-	0x6a7c, 0x720e, 0x7013, 0x0829, 0x2f10, 0x7222, 0x7027, 0xffff,
-	0x0005, 0x00d6, 0x0096, 0x0081, 0x7814, 0x2048, 0xa890, 0x7002,
-	0xa88c, 0x7006, 0xa8b0, 0x700a, 0xa8ac, 0x700e, 0x60c3, 0x000c,
-	0x009e, 0x00de, 0x0804, 0x9095, 0x6813, 0x0008, 0xb810, 0x9085,
-	0x0500, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, 0x700a,
-	0x687c, 0x700e, 0x7013, 0x0889, 0x080c, 0x9083, 0x721a, 0x7a08,
-	0x7222, 0x2f10, 0x7226, 0x2071, 0x024c, 0x0005, 0x00d6, 0x0096,
-	0x080c, 0x8e9e, 0x7814, 0x2048, 0x080c, 0xb791, 0x1130, 0x7814,
-	0x9084, 0x0700, 0x8007, 0x0033, 0x0010, 0x9006, 0x001b, 0x009e,
-	0x00de, 0x0005, 0x8dbc, 0x8e25, 0x8e35, 0x8e5b, 0x8e67, 0x8e78,
-	0x8e80, 0x8dba, 0x080c, 0x0db4, 0x0016, 0x0036, 0xa97c, 0x918c,
-	0x0003, 0x0118, 0x9186, 0x0003, 0x1198, 0xaba8, 0x7824, 0xd0cc,
-	0x1168, 0x7316, 0xa898, 0x701a, 0xa894, 0x701e, 0x003e, 0x001e,
-	0x2001, 0x1980, 0x2004, 0x60c2, 0x0804, 0x9095, 0xc3e5, 0x0c88,
-	0x9186, 0x0001, 0x190c, 0x0db4, 0xaba8, 0x7824, 0xd0cc, 0x1904,
-	0x8e22, 0x7316, 0xa898, 0x701a, 0xa894, 0x701e, 0xa8a4, 0x7026,
-	0xa8ac, 0x702e, 0x2009, 0x0018, 0x9384, 0x0300, 0x0570, 0xd3c4,
-	0x0110, 0xa8ac, 0x9108, 0xd3cc, 0x0110, 0xa8a4, 0x9108, 0x6810,
-	0x9085, 0x0010, 0x6812, 0x2011, 0x0258, 0x20e9, 0x0000, 0x22a0,
-	0x0156, 0x20a9, 0x0008, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x002c,
-	0x2098, 0x4003, 0x6810, 0x8000, 0x6812, 0x2011, 0x0240, 0x22a0,
-	0x20a9, 0x0005, 0x4003, 0x6810, 0xc084, 0x6812, 0x015e, 0x9184,
-	0x0003, 0x0118, 0x2019, 0x0245, 0x201a, 0x61c2, 0x003e, 0x001e,
-	0x0804, 0x9095, 0xc3e5, 0x0804, 0x8de1, 0x2011, 0x0008, 0x2001,
-	0x180f, 0x2004, 0xd0a4, 0x0110, 0x2011, 0x0028, 0x7824, 0xd0cc,
-	0x1110, 0x7216, 0x0470, 0x0ce8, 0xc2e5, 0x2011, 0x0302, 0x0016,
-	0x782c, 0x701a, 0x7930, 0x711e, 0x9105, 0x0108, 0xc2dd, 0x001e,
-	0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x7027, 0x0012, 0x702f,
-	0x0008, 0x7043, 0x7000, 0x7047, 0x0500, 0x704f, 0x000a, 0x2069,
-	0x0200, 0x6813, 0x0009, 0x2071, 0x0240, 0x700b, 0x2500, 0x60c3,
-	0x0032, 0x0804, 0x9095, 0x2011, 0x0028, 0x7824, 0xd0cc, 0x1128,
-	0x7216, 0x60c3, 0x0018, 0x0804, 0x9095, 0x0cd0, 0xc2e5, 0x2011,
-	0x0100, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x702f, 0x0008,
-	0x7858, 0x9084, 0x00ff, 0x7036, 0x60c3, 0x0020, 0x0804, 0x9095,
-	0x2011, 0x0008, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x0c08,
-	0x0036, 0x7b14, 0x9384, 0xff00, 0x7816, 0x9384, 0x00ff, 0x8001,
-	0x1138, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x003e, 0x0888,
-	0x0046, 0x2021, 0x0800, 0x0006, 0x7824, 0xd0cc, 0x000e, 0x0108,
-	0xc4e5, 0x7416, 0x004e, 0x701e, 0x003e, 0x0818, 0x00d6, 0x6813,
-	0x0008, 0xb810, 0x9085, 0x0700, 0x7002, 0xb814, 0x7006, 0x2069,
-	0x1800, 0x6878, 0x700a, 0x687c, 0x700e, 0x7824, 0xd0cc, 0x1168,
-	0x7013, 0x0898, 0x080c, 0x9083, 0x721a, 0x7a08, 0x7222, 0x2f10,
-	0x7226, 0x2071, 0x024c, 0x00de, 0x0005, 0x7013, 0x0889, 0x0c90,
-	0x0016, 0x7814, 0x9084, 0x0700, 0x8007, 0x0013, 0x001e, 0x0005,
-	0x8ed0, 0x8ed0, 0x8ed2, 0x8ed0, 0x8ed0, 0x8ed0, 0x8eec, 0x8ed0,
-	0x080c, 0x0db4, 0x7914, 0x918c, 0x08ff, 0x918d, 0xf600, 0x7916,
-	0x2009, 0x0003, 0x00b9, 0x2069, 0x1853, 0x6804, 0xd0bc, 0x0130,
-	0x682c, 0x9084, 0x00ff, 0x8007, 0x7032, 0x0010, 0x7033, 0x3f00,
-	0x60c3, 0x0001, 0x0804, 0x9095, 0x2009, 0x0003, 0x0019, 0x7033,
-	0x7f00, 0x0cb0, 0x0016, 0x080c, 0x98d5, 0x001e, 0xb810, 0x9085,
-	0x0100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6a78, 0x720a,
-	0x6a7c, 0x720e, 0x7013, 0x0888, 0x918d, 0x0008, 0x7116, 0x080c,
-	0x9083, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x0005, 0x00b6,
-	0x0096, 0x00e6, 0x00d6, 0x00c6, 0x0056, 0x0046, 0x0036, 0x2061,
-	0x0100, 0x2071, 0x1800, 0x7810, 0x2058, 0xb8a0, 0x2028, 0xb910,
-	0xba14, 0x7378, 0x747c, 0x7820, 0x90be, 0x0006, 0x0904, 0x8ff2,
-	0x90be, 0x000a, 0x1904, 0x8fae, 0x609f, 0x0000, 0x7814, 0x2048,
-	0xa87c, 0xd0fc, 0x05d0, 0xaf90, 0x9784, 0xff00, 0x9105, 0x6062,
-	0x873f, 0x9784, 0xff00, 0x0006, 0x7814, 0x2048, 0xa878, 0xc0fc,
-	0x9005, 0x000e, 0x1160, 0xaf94, 0x87ff, 0x0510, 0x2039, 0x0098,
-	0x9705, 0x6072, 0x7808, 0x6082, 0x2f00, 0x6086, 0x0038, 0x9185,
-	0x2200, 0x6062, 0x6073, 0x0129, 0x6077, 0x0000, 0x609f, 0x0000,
-	0x2001, 0x1836, 0x2004, 0xd0ac, 0x11a8, 0xd09c, 0x0130, 0x7814,
-	0x2048, 0xa874, 0x9082, 0x0080, 0x1268, 0xb814, 0x609e, 0x0050,
-	0x2039, 0x0029, 0x9705, 0x6072, 0x0c48, 0x9185, 0x0200, 0x6062,
-	0x6073, 0x2029, 0xa87c, 0xd0fc, 0x0118, 0xaf94, 0x87ff, 0x1120,
-	0x2f00, 0x6082, 0x7808, 0x6086, 0x6266, 0x636a, 0x646e, 0x6077,
-	0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a,
-	0x607f, 0x0000, 0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6,
-	0xa844, 0x60ca, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000,
-	0x080c, 0x98ba, 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005,
-	0x0110, 0x2009, 0x1b58, 0x080c, 0x7dd8, 0x003e, 0x004e, 0x005e,
-	0x00ce, 0x00de, 0x00ee, 0x009e, 0x00be, 0x0005, 0x7804, 0x9086,
-	0x0040, 0x0904, 0x902e, 0x9185, 0x0100, 0x6062, 0x6266, 0x636a,
-	0x646e, 0x6073, 0x0809, 0x6077, 0x0008, 0x60af, 0x95d5, 0x60d7,
-	0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a,
-	0x607f, 0x0000, 0x2f00, 0x6082, 0x7808, 0x6086, 0x7814, 0x2048,
-	0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca,
-	0xb86c, 0x60ce, 0xbab0, 0x629e, 0x080c, 0x98ba, 0x2009, 0x07d0,
-	0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110, 0x2009, 0x1b58, 0x080c,
-	0x7dd8, 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x009e,
-	0x00be, 0x0005, 0x7814, 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086,
-	0x0002, 0x0904, 0x904a, 0x9185, 0x0100, 0x6062, 0x6266, 0x636a,
-	0x646e, 0x6073, 0x0880, 0x6077, 0x0008, 0xb88c, 0x8000, 0x9084,
-	0x00ff, 0xb88e, 0x8007, 0x607a, 0x7838, 0x607e, 0x2f00, 0x6086,
-	0x7808, 0x6082, 0xa890, 0x608a, 0xa88c, 0x608e, 0xa8b0, 0x60c6,
-	0xa8ac, 0x60ca, 0xa8ac, 0x7930, 0x9108, 0x7932, 0xa8b0, 0x792c,
-	0x9109, 0x792e, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000,
-	0xbab0, 0x629e, 0x080c, 0x9897, 0x0804, 0x8fde, 0xb8bc, 0xd084,
-	0x0148, 0xb88c, 0x7814, 0x2048, 0xb88c, 0x7846, 0xa836, 0x2900,
-	0xa83a, 0xb04a, 0x9185, 0x0600, 0x6062, 0x6266, 0x636a, 0x646e,
-	0x6073, 0x0829, 0x6077, 0x0000, 0x60af, 0x9575, 0x60d7, 0x0000,
-	0x0804, 0x8fc1, 0x9185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e,
-	0x7824, 0xd0cc, 0x7826, 0x0118, 0x6073, 0x0889, 0x0010, 0x6073,
-	0x0898, 0x6077, 0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e,
-	0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808, 0x6082,
-	0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca,
-	0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xbab0, 0x629e,
-	0x7824, 0xd0cc, 0x0120, 0x080c, 0x98ba, 0x0804, 0x8fde, 0x080c,
-	0x9897, 0x0804, 0x8fde, 0x7a10, 0x00b6, 0x2258, 0xba8c, 0x8210,
-	0x9294, 0x00ff, 0xba8e, 0x00be, 0x8217, 0x0005, 0x00d6, 0x2069,
-	0x19b6, 0x6843, 0x0001, 0x00de, 0x0005, 0x60a3, 0x0056, 0x60a7,
-	0x9575, 0x00f1, 0x080c, 0x7dca, 0x0005, 0x0016, 0x2001, 0x180c,
-	0x200c, 0x9184, 0x0600, 0x9086, 0x0600, 0x0128, 0x0089, 0x080c,
-	0x7dca, 0x001e, 0x0005, 0xc1e5, 0x2001, 0x180c, 0x2102, 0x2001,
-	0x19b7, 0x2003, 0x0000, 0x2001, 0x19bf, 0x2003, 0x0000, 0x0c88,
-	0x0006, 0x6014, 0x9084, 0x1804, 0x9085, 0x0009, 0x6016, 0x000e,
-	0x0005, 0x0016, 0x00c6, 0x0006, 0x2061, 0x0100, 0x61a4, 0x60a7,
-	0x95f5, 0x6014, 0x9084, 0x1804, 0x9085, 0x0008, 0x6016, 0x000e,
-	0xa001, 0xa001, 0xa001, 0x61a6, 0x00ce, 0x001e, 0x0005, 0x00c6,
-	0x00d6, 0x0016, 0x0026, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c,
-	0x6d14, 0x11e8, 0x2001, 0x19d2, 0x2004, 0x9005, 0x1904, 0x9127,
-	0x0066, 0x2031, 0x0001, 0x080c, 0x6dc4, 0x006e, 0x1160, 0x2061,
-	0x0100, 0x6020, 0xd0b4, 0x1120, 0x6024, 0xd084, 0x090c, 0x0db4,
-	0x080c, 0x7dca, 0x0460, 0x00c6, 0x2061, 0x19b6, 0x00d0, 0x6904,
-	0x9194, 0x4000, 0x0548, 0x080c, 0x90c1, 0x080c, 0x29cc, 0x00c6,
-	0x2061, 0x19b6, 0x6128, 0x9192, 0x0008, 0x1258, 0x8108, 0x612a,
-	0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c, 0x7dca, 0x080c, 0x90b8,
-	0x0070, 0x6124, 0x91e5, 0x0000, 0x0140, 0x080c, 0xd4f8, 0x080c,
-	0x7dd3, 0x2009, 0x0014, 0x080c, 0x9b42, 0x00ce, 0x0000, 0x002e,
-	0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, 0x19d2, 0x2004, 0x9005,
-	0x1db0, 0x00c6, 0x2061, 0x19b6, 0x6128, 0x9192, 0x0003, 0x1e08,
-	0x8108, 0x612a, 0x00ce, 0x080c, 0x7dca, 0x080c, 0x5953, 0x2009,
-	0x1852, 0x2114, 0x8210, 0x220a, 0x0c10, 0x0096, 0x00c6, 0x00d6,
-	0x00e6, 0x0016, 0x0026, 0x080c, 0x7de0, 0x2071, 0x19b6, 0x713c,
-	0x81ff, 0x0904, 0x91b3, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c,
-	0x6d14, 0x11b0, 0x0036, 0x2019, 0x0002, 0x080c, 0x935a, 0x003e,
-	0x713c, 0x2160, 0x080c, 0xd4f8, 0x2009, 0x004a, 0x080c, 0x9b42,
-	0x0066, 0x2031, 0x0001, 0x080c, 0x6dc4, 0x006e, 0x0804, 0x91b3,
-	0x6904, 0xd1f4, 0x0904, 0x91ba, 0x080c, 0x29cc, 0x00c6, 0x703c,
-	0x9065, 0x090c, 0x0db4, 0x6020, 0x00ce, 0x9086, 0x0006, 0x1528,
-	0x61c8, 0x60c4, 0x9105, 0x1508, 0x2009, 0x180c, 0x2104, 0xd0d4,
-	0x01e0, 0x6214, 0x9294, 0x1800, 0x1128, 0x6224, 0x9294, 0x0002,
-	0x1510, 0x0030, 0xc0d4, 0x200a, 0xd0cc, 0x0110, 0x080c, 0x291f,
-	0x6014, 0x9084, 0xe7fd, 0x9085, 0x0010, 0x6016, 0x703c, 0x2060,
-	0x2009, 0x0049, 0x080c, 0x9b42, 0x0070, 0x0036, 0x2019, 0x0001,
-	0x080c, 0x935a, 0x003e, 0x713c, 0x2160, 0x080c, 0xd4f8, 0x2009,
-	0x004a, 0x080c, 0x9b42, 0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce,
-	0x009e, 0x0005, 0xd1ec, 0x1904, 0x9174, 0x0804, 0x9176, 0x0026,
-	0x00e6, 0x2071, 0x19b6, 0x7048, 0xd084, 0x01c0, 0x713c, 0x81ff,
-	0x01a8, 0x2071, 0x0100, 0x9188, 0x0008, 0x2114, 0x928e, 0x0006,
-	0x1138, 0x7014, 0x9084, 0x1984, 0x9085, 0x0012, 0x7016, 0x0030,
-	0x7014, 0x9084, 0x1984, 0x9085, 0x0016, 0x7016, 0x00ee, 0x002e,
-	0x0005, 0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046,
-	0x0006, 0x0126, 0x2091, 0x8000, 0x6010, 0x2058, 0xbca0, 0x2071,
-	0x19b6, 0x7018, 0x2058, 0x8bff, 0x0190, 0xb8a0, 0x9406, 0x0118,
-	0xb854, 0x2058, 0x0cc0, 0x6014, 0x0096, 0x2048, 0xac6c, 0xad70,
-	0xae78, 0x009e, 0x080c, 0x6123, 0x0110, 0x9085, 0x0001, 0x012e,
-	0x000e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00be,
-	0x0005, 0x080c, 0x8ba9, 0x7003, 0x1200, 0x7838, 0x7012, 0x783c,
-	0x7016, 0x00c6, 0x7820, 0x9086, 0x0004, 0x1148, 0x7810, 0x9005,
-	0x0130, 0x00b6, 0x2058, 0xb810, 0xb914, 0x00be, 0x0020, 0x2061,
-	0x1800, 0x6078, 0x617c, 0x9084, 0x00ff, 0x700a, 0x710e, 0x00ce,
-	0x60c3, 0x002c, 0x0804, 0x9095, 0x080c, 0x8ba9, 0x7003, 0x0f00,
-	0x7808, 0xd09c, 0x0128, 0xb810, 0x9084, 0x00ff, 0x700a, 0xb814,
-	0x700e, 0x60c3, 0x0008, 0x0804, 0x9095, 0x0156, 0x080c, 0x8bf4,
-	0x7003, 0x0200, 0x2011, 0x1848, 0x63f0, 0x2312, 0x20a9, 0x0006,
-	0x2011, 0x1840, 0x2019, 0x1841, 0x9ef0, 0x0002, 0x2376, 0x8e70,
-	0x2276, 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002, 0x1f04, 0x9256,
-	0x60c3, 0x001c, 0x015e, 0x0804, 0x9095, 0x0016, 0x0026, 0x080c,
-	0x8bd0, 0x080c, 0x8be2, 0x9e80, 0x0004, 0x20e9, 0x0000, 0x20a0,
-	0x7814, 0x0096, 0x2048, 0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c,
-	0x9080, 0x0021, 0x2098, 0x009e, 0x7808, 0x9088, 0x0002, 0x21a8,
-	0x9192, 0x0010, 0x1250, 0x4003, 0x9080, 0x0004, 0x8003, 0x60c2,
-	0x080c, 0x9095, 0x002e, 0x001e, 0x0005, 0x20a9, 0x0010, 0x4003,
-	0x080c, 0x98c0, 0x20a1, 0x0240, 0x22a8, 0x4003, 0x0c68, 0x080c,
-	0x8ba9, 0x7003, 0x6200, 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804,
-	0x9095, 0x0016, 0x0026, 0x080c, 0x8ba9, 0x20e9, 0x0000, 0x20a1,
-	0x024c, 0x7814, 0x0096, 0x2048, 0xa800, 0x2048, 0xa860, 0x20e0,
-	0xa85c, 0x9080, 0x0023, 0x2098, 0x009e, 0x7808, 0x9088, 0x0002,
-	0x21a8, 0x4003, 0x8003, 0x60c2, 0x080c, 0x9095, 0x002e, 0x001e,
-	0x0005, 0x00e6, 0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071,
-	0x19b6, 0x700c, 0x2060, 0x8cff, 0x0178, 0x080c, 0xb992, 0x1110,
-	0x080c, 0xa456, 0x600c, 0x0006, 0x080c, 0xbbf9, 0x080c, 0x9ac8,
-	0x080c, 0x9446, 0x00ce, 0x0c78, 0x2c00, 0x700e, 0x700a, 0x012e,
-	0x000e, 0x00ce, 0x00ee, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6,
-	0x00d6, 0x00c6, 0x0066, 0x0026, 0x0016, 0x0006, 0x2091, 0x8000,
-	0x2001, 0x180c, 0x200c, 0x918c, 0xe7ff, 0x2102, 0x2069, 0x0100,
-	0x2079, 0x0140, 0x2071, 0x19b6, 0x7024, 0x2060, 0x8cff, 0x01f8,
-	0x080c, 0x90c1, 0x6ac0, 0x68c3, 0x0000, 0x080c, 0x7dd3, 0x00c6,
-	0x2061, 0x0100, 0x080c, 0x98d9, 0x00ce, 0x20a9, 0x01f4, 0x0461,
-	0x2009, 0x0013, 0x080c, 0x9b42, 0x000e, 0x001e, 0x002e, 0x006e,
-	0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x2001,
-	0x1800, 0x2004, 0x9096, 0x0001, 0x0d78, 0x9096, 0x0004, 0x0d60,
-	0x080c, 0x7dd3, 0x6814, 0x9084, 0x0001, 0x0110, 0x68a7, 0x95f5,
-	0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x58fd, 0x080c, 0x7d56,
-	0x20a9, 0x01f4, 0x0009, 0x08c0, 0x6824, 0xd094, 0x0140, 0x6827,
-	0x0004, 0x7804, 0x9084, 0x4000, 0x190c, 0x29cc, 0x0090, 0xd084,
-	0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, 0x933c, 0x7804, 0x9084,
-	0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x29bc, 0x9006, 0x080c,
-	0x29bc, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6,
-	0x0066, 0x0026, 0x0016, 0x0006, 0x2091, 0x8000, 0x2001, 0x180c,
-	0x200c, 0x918c, 0xdbff, 0x2102, 0x2069, 0x0100, 0x2079, 0x0140,
-	0x2071, 0x19b6, 0x703c, 0x2060, 0x8cff, 0x0904, 0x93e8, 0x9386,
-	0x0002, 0x1128, 0x6814, 0x9084, 0x0002, 0x0904, 0x93e8, 0x68af,
-	0x95f5, 0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, 0x1df0, 0x69c6,
-	0x68cb, 0x0008, 0x080c, 0x7de0, 0x080c, 0x1d48, 0x0046, 0x2009,
-	0x00a5, 0x080c, 0x0e2f, 0x2021, 0x0169, 0x2404, 0x9084, 0x000f,
-	0x9086, 0x0004, 0x11f8, 0x68af, 0x95f5, 0x68c6, 0x68cb, 0x0008,
-	0x00e6, 0x00f6, 0x2079, 0x0090, 0x2071, 0x1a34, 0x6814, 0x9084,
-	0x1984, 0x9085, 0x0012, 0x6816, 0x782b, 0x0008, 0x7003, 0x0000,
-	0x00fe, 0x00ee, 0x9386, 0x0002, 0x1128, 0x7884, 0x9005, 0x1110,
-	0x7887, 0x0001, 0x2001, 0x1950, 0x200c, 0x080c, 0x0e2f, 0x004e,
-	0x20a9, 0x03e8, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, 0x7804,
-	0x9084, 0x4000, 0x190c, 0x29cc, 0x0090, 0xd08c, 0x0118, 0x6827,
-	0x0002, 0x0010, 0x1f04, 0x93c2, 0x7804, 0x9084, 0x1000, 0x0138,
-	0x2001, 0x0100, 0x080c, 0x29bc, 0x9006, 0x080c, 0x29bc, 0x6827,
-	0x4000, 0x6824, 0x83ff, 0x1120, 0x2009, 0x0049, 0x080c, 0x9b42,
-	0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe,
-	0x015e, 0x012e, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069,
-	0x19b6, 0x6a06, 0x012e, 0x00de, 0x0005, 0x00d6, 0x0126, 0x2091,
-	0x8000, 0x2069, 0x19b6, 0x6a32, 0x012e, 0x00de, 0x0005, 0x080c,
-	0x8d4d, 0x7814, 0x080c, 0x515b, 0x0108, 0x782c, 0x7032, 0x7042,
-	0x7047, 0x1000, 0x0478, 0x080c, 0x8d4d, 0x7814, 0x080c, 0x515b,
-	0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x4000, 0x0418, 0x080c,
-	0x8d4d, 0x7814, 0x080c, 0x515b, 0x0108, 0x782c, 0x7032, 0x7042,
-	0x7047, 0x2000, 0x00b8, 0x080c, 0x8d4d, 0x7814, 0x080c, 0x515b,
-	0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x0400, 0x0058, 0x080c,
-	0x8d4d, 0x7814, 0x080c, 0x515b, 0x0108, 0x782c, 0x7032, 0x7042,
-	0x7047, 0x0200, 0x60c3, 0x0020, 0x0804, 0x9095, 0x00e6, 0x2071,
-	0x19b6, 0x7020, 0x9005, 0x0110, 0x8001, 0x7022, 0x00ee, 0x0005,
-	0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, 0x0126,
-	0x2091, 0x8000, 0x2071, 0x19b6, 0x7614, 0x2660, 0x2678, 0x2039,
-	0x0001, 0x87ff, 0x0904, 0x94eb, 0x8cff, 0x0904, 0x94eb, 0x6020,
-	0x9086, 0x0006, 0x1904, 0x94e6, 0x88ff, 0x0138, 0x2800, 0x9c06,
-	0x1904, 0x94e6, 0x2039, 0x0000, 0x0050, 0x6010, 0x9b06, 0x1904,
-	0x94e6, 0x85ff, 0x0120, 0x6054, 0x9106, 0x1904, 0x94e6, 0x7024,
-	0x9c06, 0x15b0, 0x2069, 0x0100, 0x68c0, 0x9005, 0x1160, 0x6824,
-	0xd084, 0x0148, 0x6827, 0x0001, 0x080c, 0x7dd3, 0x080c, 0x9570,
-	0x7027, 0x0000, 0x0428, 0x080c, 0x7dd3, 0x6820, 0xd0b4, 0x0110,
-	0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x080c, 0x9570,
+	0x2091, 0x8000, 0x0e04, 0x791a, 0x0006, 0x0016, 0x2001, 0x8003,
+	0x0006, 0x0804, 0x0dbd, 0x2001, 0x1833, 0x2004, 0x9005, 0x0005,
+	0x0005, 0x00f6, 0x2079, 0x0300, 0x2001, 0x0200, 0x200c, 0xc1e5,
+	0xc1dc, 0x2102, 0x2009, 0x0218, 0x210c, 0xd1ec, 0x1120, 0x080c,
+	0x14a7, 0x00fe, 0x0005, 0x2001, 0x020d, 0x2003, 0x0020, 0x781f,
+	0x0300, 0x00fe, 0x0005, 0x781c, 0xd08c, 0x0904, 0x799a, 0x68bc,
+	0x90aa, 0x0005, 0x0a04, 0x7f2c, 0x7d44, 0x7c40, 0x9584, 0x00f6,
+	0x1510, 0x9484, 0x7000, 0x0140, 0x908a, 0x2000, 0x1260, 0x9584,
+	0x0700, 0x8007, 0x0804, 0x79a1, 0x7000, 0x9084, 0xff00, 0x9086,
+	0x8100, 0x0da8, 0x00b0, 0x9484, 0x0fff, 0x1130, 0x7000, 0x9084,
+	0xff00, 0x9086, 0x8100, 0x11c0, 0x080c, 0xd86c, 0x080c, 0x7e71,
+	0x7817, 0x0140, 0x00a8, 0x9584, 0x0076, 0x1118, 0x080c, 0x7ecf,
+	0x19c0, 0xd5a4, 0x0148, 0x0046, 0x0056, 0x080c, 0x79fc, 0x080c,
+	0x21cd, 0x005e, 0x004e, 0x0020, 0x080c, 0xd86c, 0x7817, 0x0140,
+	0x080c, 0x6fa7, 0x0168, 0x2001, 0x0111, 0x2004, 0xd08c, 0x0140,
+	0x688f, 0x0000, 0x2001, 0x0110, 0x2003, 0x0008, 0x2003, 0x0000,
+	0x080c, 0x79dd, 0x2001, 0x19c1, 0x2004, 0x9005, 0x090c, 0x894b,
+	0x0005, 0x0002, 0x79b3, 0x7c93, 0x79aa, 0x79aa, 0x79aa, 0x79aa,
+	0x79aa, 0x79aa, 0x7817, 0x0140, 0x2001, 0x19c1, 0x2004, 0x9005,
+	0x090c, 0x894b, 0x0005, 0x7000, 0x908c, 0xff00, 0x9194, 0xf000,
+	0x810f, 0x9484, 0x0fff, 0x688e, 0x9286, 0x2000, 0x1150, 0x6800,
+	0x9086, 0x0001, 0x1118, 0x080c, 0x53e0, 0x0070, 0x080c, 0x7a1c,
+	0x0058, 0x9286, 0x3000, 0x1118, 0x080c, 0x7bce, 0x0028, 0x9286,
+	0x8000, 0x1110, 0x080c, 0x7da1, 0x7817, 0x0140, 0x2001, 0x19c1,
+	0x2004, 0x9005, 0x090c, 0x894b, 0x0005, 0x2001, 0x1810, 0x2004,
+	0xd08c, 0x0178, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x1148,
+	0x0026, 0x0036, 0x2011, 0x8048, 0x2518, 0x080c, 0x48d2, 0x003e,
+	0x002e, 0x0005, 0x0036, 0x0046, 0x0056, 0x00f6, 0x2079, 0x0200,
+	0x2019, 0xfffe, 0x7c30, 0x0050, 0x0036, 0x0046, 0x0056, 0x00f6,
+	0x2079, 0x0200, 0x7d44, 0x7c40, 0x2019, 0xffff, 0x2001, 0x1810,
+	0x2004, 0xd08c, 0x0160, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003,
+	0x1130, 0x0026, 0x2011, 0x8048, 0x080c, 0x48d2, 0x002e, 0x00fe,
+	0x005e, 0x004e, 0x003e, 0x0005, 0x00b6, 0x00c6, 0x7010, 0x9084,
+	0xff00, 0x8007, 0x9096, 0x0001, 0x0120, 0x9096, 0x0023, 0x1904,
+	0x7b9f, 0x9186, 0x0023, 0x15c0, 0x080c, 0x7e36, 0x0904, 0x7b9f,
+	0x6120, 0x9186, 0x0001, 0x0150, 0x9186, 0x0004, 0x0138, 0x9186,
+	0x0008, 0x0120, 0x9186, 0x000a, 0x1904, 0x7b9f, 0x7124, 0x610a,
+	0x7030, 0x908e, 0x0200, 0x1130, 0x2009, 0x0015, 0x080c, 0x9e93,
+	0x0804, 0x7b9f, 0x908e, 0x0214, 0x0118, 0x908e, 0x0210, 0x1130,
+	0x2009, 0x0015, 0x080c, 0x9e93, 0x0804, 0x7b9f, 0x908e, 0x0100,
+	0x1904, 0x7b9f, 0x7034, 0x9005, 0x1904, 0x7b9f, 0x2009, 0x0016,
+	0x080c, 0x9e93, 0x0804, 0x7b9f, 0x9186, 0x0022, 0x1904, 0x7b9f,
+	0x7030, 0x908e, 0x0300, 0x1580, 0x68d8, 0xd0a4, 0x0528, 0xc0b5,
+	0x68da, 0x7100, 0x918c, 0x00ff, 0x697a, 0x7004, 0x687e, 0x00f6,
+	0x2079, 0x0100, 0x79e6, 0x78ea, 0x0006, 0x9084, 0x00ff, 0x0016,
+	0x2008, 0x080c, 0x26ac, 0x7932, 0x7936, 0x001e, 0x000e, 0x00fe,
+	0x080c, 0x2663, 0x695a, 0x703c, 0x00e6, 0x2071, 0x0140, 0x7086,
+	0x2071, 0x1800, 0x70b2, 0x00ee, 0x7034, 0x9005, 0x1904, 0x7b9f,
+	0x2009, 0x0017, 0x0804, 0x7b6c, 0x908e, 0x0400, 0x1190, 0x7034,
+	0x9005, 0x1904, 0x7b9f, 0x080c, 0x6fa7, 0x0120, 0x2009, 0x001d,
+	0x0804, 0x7b6c, 0x68d8, 0xc0a5, 0x68da, 0x2009, 0x0030, 0x0804,
+	0x7b6c, 0x908e, 0x0500, 0x1140, 0x7034, 0x9005, 0x1904, 0x7b9f,
+	0x2009, 0x0018, 0x0804, 0x7b6c, 0x908e, 0x2010, 0x1120, 0x2009,
+	0x0019, 0x0804, 0x7b6c, 0x908e, 0x2110, 0x1120, 0x2009, 0x001a,
+	0x0804, 0x7b6c, 0x908e, 0x5200, 0x1140, 0x7034, 0x9005, 0x1904,
+	0x7b9f, 0x2009, 0x001b, 0x0804, 0x7b6c, 0x908e, 0x5000, 0x1140,
+	0x7034, 0x9005, 0x1904, 0x7b9f, 0x2009, 0x001c, 0x0804, 0x7b6c,
+	0x908e, 0x1300, 0x1120, 0x2009, 0x0034, 0x0804, 0x7b6c, 0x908e,
+	0x1200, 0x1140, 0x7034, 0x9005, 0x1904, 0x7b9f, 0x2009, 0x0024,
+	0x0804, 0x7b6c, 0x908c, 0xff00, 0x918e, 0x2400, 0x1170, 0x2009,
+	0x002d, 0x2001, 0x1810, 0x2004, 0xd09c, 0x0904, 0x7b6c, 0x080c,
+	0xc89e, 0x1904, 0x7b9f, 0x0804, 0x7b6a, 0x908c, 0xff00, 0x918e,
+	0x5300, 0x1120, 0x2009, 0x002a, 0x0804, 0x7b6c, 0x908e, 0x0f00,
+	0x1120, 0x2009, 0x0020, 0x0804, 0x7b6c, 0x908e, 0x6104, 0x1528,
+	0x2029, 0x0205, 0x2011, 0x026d, 0x8208, 0x2204, 0x9082, 0x0004,
+	0x8004, 0x8004, 0x20a8, 0x2011, 0x8015, 0x211c, 0x8108, 0x0046,
+	0x2124, 0x080c, 0x48d2, 0x004e, 0x8108, 0x0f04, 0x7b38, 0x9186,
+	0x0280, 0x1d88, 0x2504, 0x8000, 0x202a, 0x2009, 0x0260, 0x0c58,
+	0x202b, 0x0000, 0x2009, 0x0023, 0x0478, 0x908e, 0x6000, 0x1118,
+	0x2009, 0x003f, 0x0448, 0x908e, 0x7800, 0x1118, 0x2009, 0x0045,
+	0x0418, 0x908e, 0x1000, 0x1118, 0x2009, 0x004e, 0x00e8, 0x908e,
+	0x6300, 0x1118, 0x2009, 0x004a, 0x00b8, 0x908c, 0xff00, 0x918e,
+	0x5600, 0x1118, 0x2009, 0x004f, 0x0078, 0x908c, 0xff00, 0x918e,
+	0x5700, 0x1118, 0x2009, 0x0050, 0x0038, 0x2009, 0x001d, 0x6838,
+	0xd0d4, 0x0110, 0x2009, 0x004c, 0x0016, 0x2011, 0x0263, 0x2204,
+	0x8211, 0x220c, 0x080c, 0x2663, 0x1568, 0x080c, 0x61d7, 0x1550,
+	0xbe12, 0xbd16, 0x001e, 0x0016, 0xb8b0, 0x9005, 0x1168, 0x9186,
+	0x0046, 0x1150, 0x6878, 0x9606, 0x1138, 0x687c, 0x9506, 0x9084,
+	0xff00, 0x1110, 0x001e, 0x0098, 0x080c, 0x9dc3, 0x01a8, 0x2b08,
+	0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x9186, 0x004c,
+	0x1110, 0x6023, 0x000a, 0x0016, 0x001e, 0x080c, 0x9e93, 0x00ce,
+	0x00be, 0x0005, 0x001e, 0x0cd8, 0x2001, 0x180e, 0x2004, 0xd0ec,
+	0x0120, 0x2011, 0x8049, 0x080c, 0x48d2, 0x080c, 0x9e66, 0x0d90,
+	0x2b08, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x0016,
+	0x9186, 0x0017, 0x0118, 0x9186, 0x0030, 0x1128, 0x6007, 0x0009,
+	0x6017, 0x2900, 0x0020, 0x6007, 0x0051, 0x6017, 0x0000, 0x602f,
+	0x0009, 0x6003, 0x0001, 0x080c, 0x8411, 0x08a0, 0x080c, 0x30f6,
+	0x1140, 0x7010, 0x9084, 0xff00, 0x8007, 0x908e, 0x0008, 0x1108,
+	0x0009, 0x0005, 0x00b6, 0x00c6, 0x0046, 0x7000, 0x908c, 0xff00,
+	0x810f, 0x9186, 0x0033, 0x11e8, 0x080c, 0x7e36, 0x0904, 0x7c2b,
+	0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1140, 0x7034, 0x9005,
+	0x15d0, 0x2009, 0x0015, 0x080c, 0x9e93, 0x04a8, 0x908e, 0x0100,
+	0x1590, 0x7034, 0x9005, 0x1578, 0x2009, 0x0016, 0x080c, 0x9e93,
+	0x0450, 0x9186, 0x0032, 0x1538, 0x7030, 0x908e, 0x1400, 0x1518,
+	0x2009, 0x0038, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c,
+	0x080c, 0x2663, 0x11b8, 0x080c, 0x61d7, 0x11a0, 0xbe12, 0xbd16,
+	0x080c, 0x9dc3, 0x0178, 0x2b08, 0x6112, 0x080c, 0xbf73, 0x6023,
+	0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0x9e93, 0x080c, 0x894b,
+	0x0010, 0x00ce, 0x001e, 0x004e, 0x00ce, 0x00be, 0x0005, 0x00b6,
+	0x0046, 0x00e6, 0x00d6, 0x2028, 0x2130, 0x9696, 0x00ff, 0x11b8,
+	0x9592, 0xfffc, 0x02a0, 0x9596, 0xfffd, 0x1120, 0x2009, 0x007f,
+	0x0804, 0x7c8d, 0x9596, 0xfffe, 0x1120, 0x2009, 0x007e, 0x0804,
+	0x7c8d, 0x9596, 0xfffc, 0x1118, 0x2009, 0x0080, 0x04f0, 0x2011,
+	0x0000, 0x2019, 0x1836, 0x231c, 0xd3ac, 0x0130, 0x9026, 0x20a9,
+	0x0800, 0x2071, 0x1000, 0x0030, 0x2021, 0x0081, 0x20a9, 0x077f,
+	0x2071, 0x1081, 0x2e1c, 0x93dd, 0x0000, 0x1140, 0x82ff, 0x11d0,
+	0x9496, 0x00ff, 0x01b8, 0x2410, 0xc2fd, 0x00a0, 0xbf10, 0x2600,
+	0x9706, 0xb814, 0x1120, 0x9546, 0x1110, 0x2408, 0x00b0, 0x9745,
+	0x1148, 0x94c6, 0x007e, 0x0130, 0x94c6, 0x007f, 0x0118, 0x94c6,
+	0x0080, 0x1d20, 0x8420, 0x8e70, 0x1f04, 0x7c62, 0x82ff, 0x1118,
+	0x9085, 0x0001, 0x0018, 0xc2fc, 0x2208, 0x9006, 0x00de, 0x00ee,
+	0x004e, 0x00be, 0x0005, 0x7000, 0x908c, 0xff00, 0x810f, 0x9184,
+	0x000f, 0x0002, 0x7caa, 0x7caa, 0x7caa, 0x7e48, 0x7caa, 0x7cb3,
+	0x7cde, 0x7d6c, 0x7caa, 0x7caa, 0x7caa, 0x7caa, 0x7caa, 0x7caa,
+	0x7caa, 0x7caa, 0x7817, 0x0140, 0x2001, 0x19c1, 0x2004, 0x9005,
+	0x090c, 0x894b, 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7120,
+	0x2160, 0x9c8c, 0x0007, 0x11c0, 0x9c8a, 0x1cd0, 0x02a8, 0x6864,
+	0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910,
+	0x9106, 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124, 0x610a,
+	0x2009, 0x0046, 0x080c, 0x9e93, 0x7817, 0x0140, 0x2001, 0x19c1,
+	0x2004, 0x9005, 0x090c, 0x894b, 0x00be, 0x0005, 0x00b6, 0x00c6,
+	0x9484, 0x0fff, 0x0904, 0x7d42, 0x7110, 0xd1bc, 0x1904, 0x7d42,
+	0x7108, 0x700c, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, 0xff00,
+	0x15b0, 0x81ff, 0x15a0, 0x9080, 0x3131, 0x200d, 0x918c, 0xff00,
+	0x810f, 0x2001, 0x0080, 0x9106, 0x0904, 0x7d42, 0x080c, 0x61d7,
+	0x1904, 0x7d42, 0xbe12, 0xbd16, 0xb800, 0xd0ec, 0x15d8, 0xba04,
+	0x9294, 0xff00, 0x9286, 0x0600, 0x11a0, 0x080c, 0x9dc3, 0x05e8,
+	0x2b08, 0x7028, 0x604a, 0x702c, 0x6046, 0x6112, 0x6023, 0x0006,
+	0x7120, 0x610a, 0x7130, 0x6156, 0x2009, 0x0044, 0x080c, 0xcaf6,
+	0x0408, 0x080c, 0x655b, 0x1138, 0xb807, 0x0606, 0x0c30, 0x190c,
+	0x7c2f, 0x11c0, 0x0898, 0x080c, 0x9dc3, 0x2b08, 0x0198, 0x6112,
+	0x6023, 0x0004, 0x7120, 0x610a, 0x9286, 0x0400, 0x1118, 0x6007,
+	0x0005, 0x0010, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x8411,
+	0x080c, 0x894b, 0x7817, 0x0140, 0x2001, 0x19c1, 0x2004, 0x9005,
+	0x090c, 0x894b, 0x00ce, 0x00be, 0x0005, 0x2001, 0x180e, 0x2004,
+	0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x48d2, 0x080c, 0x9e66,
+	0x0d48, 0x2b08, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a, 0x7130,
+	0x6156, 0x6017, 0xf300, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c,
+	0x83c9, 0x080c, 0x894b, 0x08b0, 0x00b6, 0x7110, 0xd1bc, 0x01e8,
+	0x7020, 0x2060, 0x9c84, 0x0007, 0x11c0, 0x9c82, 0x1cd0, 0x02a8,
+	0x6864, 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158,
+	0xb910, 0x9106, 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124,
+	0x610a, 0x2009, 0x0045, 0x080c, 0x9e93, 0x7817, 0x0140, 0x2001,
+	0x19c1, 0x2004, 0x9005, 0x090c, 0x894b, 0x00be, 0x0005, 0x6120,
+	0x9186, 0x0002, 0x0128, 0x9186, 0x0005, 0x0110, 0x9085, 0x0001,
+	0x0005, 0x080c, 0x30f6, 0x1168, 0x7010, 0x9084, 0xff00, 0x8007,
+	0x9086, 0x0000, 0x1130, 0x9184, 0x000f, 0x908a, 0x0006, 0x1208,
+	0x000b, 0x0005, 0x7db8, 0x7db9, 0x7db8, 0x7db8, 0x7e18, 0x7e27,
+	0x0005, 0x00b6, 0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084, 0x0904,
+	0x7e16, 0x700c, 0x7108, 0x080c, 0x2663, 0x1904, 0x7e16, 0x080c,
+	0x61d7, 0x1904, 0x7e16, 0xbe12, 0xbd16, 0x7110, 0xd1bc, 0x01d8,
+	0x080c, 0x655b, 0x0118, 0x9086, 0x0004, 0x1588, 0x00c6, 0x080c,
+	0x7e36, 0x00ce, 0x05d8, 0x080c, 0x9dc3, 0x2b08, 0x05b8, 0x6112,
+	0x080c, 0xbf73, 0x6023, 0x0002, 0x7120, 0x610a, 0x2009, 0x0088,
+	0x080c, 0x9e93, 0x0458, 0x080c, 0x655b, 0x0148, 0x9086, 0x0004,
+	0x0130, 0x080c, 0x6563, 0x0118, 0x9086, 0x0004, 0x1180, 0x080c,
+	0x9dc3, 0x2b08, 0x01d8, 0x6112, 0x080c, 0xbf73, 0x6023, 0x0005,
+	0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0x9e93, 0x0078, 0x080c,
+	0x9dc3, 0x2b08, 0x0158, 0x6112, 0x080c, 0xbf73, 0x6023, 0x0004,
+	0x7120, 0x610a, 0x2009, 0x0001, 0x080c, 0x9e93, 0x00be, 0x0005,
+	0x7110, 0xd1bc, 0x0158, 0x00d1, 0x0148, 0x080c, 0x7d97, 0x1130,
+	0x7124, 0x610a, 0x2009, 0x0089, 0x080c, 0x9e93, 0x0005, 0x7110,
+	0xd1bc, 0x0158, 0x0059, 0x0148, 0x080c, 0x7d97, 0x1130, 0x7124,
+	0x610a, 0x2009, 0x008a, 0x080c, 0x9e93, 0x0005, 0x7020, 0x2060,
+	0x9c84, 0x0007, 0x1158, 0x9c82, 0x1cd0, 0x0240, 0x2001, 0x1819,
+	0x2004, 0x9c02, 0x1218, 0x9085, 0x0001, 0x0005, 0x9006, 0x0ce8,
+	0x00b6, 0x7110, 0xd1bc, 0x11d8, 0x7024, 0x2060, 0x9c84, 0x0007,
+	0x11b0, 0x9c82, 0x1cd0, 0x0298, 0x6864, 0x9c02, 0x1280, 0x7008,
+	0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1140, 0x700c,
+	0xb914, 0x9106, 0x1120, 0x2009, 0x0051, 0x080c, 0x9e93, 0x7817,
+	0x0140, 0x2001, 0x19c1, 0x2004, 0x9005, 0x090c, 0x894b, 0x00be,
+	0x0005, 0x2031, 0x0105, 0x0069, 0x0005, 0x2031, 0x0206, 0x0049,
+	0x0005, 0x2031, 0x0207, 0x0029, 0x0005, 0x2031, 0x0213, 0x0009,
+	0x0005, 0x00c6, 0x0096, 0x00f6, 0x7000, 0x9084, 0xf000, 0x9086,
+	0xc000, 0x05d0, 0x080c, 0x9dc3, 0x05b8, 0x0066, 0x00c6, 0x0046,
+	0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x2663, 0x15a0,
+	0x080c, 0x61d7, 0x1588, 0xbe12, 0xbd16, 0x2b00, 0x004e, 0x00ce,
+	0x6012, 0x080c, 0xbf73, 0x080c, 0x0feb, 0x0510, 0x2900, 0x605a,
+	0x9006, 0xa802, 0xa866, 0xac6a, 0xa85c, 0x90f8, 0x001b, 0x20a9,
+	0x000e, 0xa860, 0x20e8, 0x20e1, 0x0000, 0x2fa0, 0x2e98, 0x4003,
+	0x006e, 0x6616, 0x6007, 0x003e, 0x6023, 0x0001, 0x6003, 0x0001,
+	0x080c, 0x8411, 0x080c, 0x894b, 0x00fe, 0x009e, 0x00ce, 0x0005,
+	0x080c, 0x9e19, 0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8, 0x00c6,
+	0x7000, 0x908c, 0xff00, 0x9184, 0xf000, 0x810f, 0x9086, 0x2000,
+	0x1904, 0x7f26, 0x9186, 0x0022, 0x15f0, 0x2001, 0x0111, 0x2004,
+	0x9005, 0x1904, 0x7f28, 0x7030, 0x908e, 0x0400, 0x0904, 0x7f28,
+	0x908e, 0x6000, 0x05e8, 0x908e, 0x5400, 0x05d0, 0x908e, 0x0300,
+	0x11d8, 0x2009, 0x1836, 0x210c, 0xd18c, 0x1590, 0xd1a4, 0x1580,
+	0x080c, 0x6519, 0x0558, 0x68ac, 0x9084, 0x00ff, 0x7100, 0x918c,
+	0x00ff, 0x9106, 0x1518, 0x687c, 0x69ac, 0x918c, 0xff00, 0x9105,
+	0x7104, 0x9106, 0x11d8, 0x00e0, 0x2009, 0x0103, 0x210c, 0xd1b4,
+	0x11a8, 0x908e, 0x5200, 0x09e8, 0x908e, 0x0500, 0x09d0, 0x908e,
+	0x5000, 0x09b8, 0x0058, 0x9186, 0x0023, 0x1140, 0x080c, 0x7e36,
+	0x0128, 0x6004, 0x9086, 0x0002, 0x0118, 0x0000, 0x9006, 0x0010,
+	0x9085, 0x0001, 0x00ce, 0x0005, 0x00f6, 0x2079, 0x0200, 0x7800,
+	0xc0e5, 0xc0cc, 0x7802, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x1800,
+	0x7834, 0xd084, 0x1130, 0x2079, 0x0200, 0x7800, 0x9085, 0x1200,
+	0x7802, 0x00fe, 0x0005, 0x00e6, 0x2071, 0x1800, 0x7034, 0xc084,
+	0x7036, 0x00ee, 0x0005, 0x2071, 0x19cb, 0x7003, 0x0003, 0x700f,
+	0x0361, 0x9006, 0x701a, 0x7072, 0x7012, 0x7017, 0x1cd0, 0x7007,
+	0x0000, 0x7026, 0x702b, 0x93a9, 0x7032, 0x7037, 0x9417, 0x703f,
+	0xffff, 0x7042, 0x7047, 0x521e, 0x704a, 0x705b, 0x80ab, 0x080c,
+	0x1004, 0x090c, 0x0db4, 0x2900, 0x703a, 0xa867, 0x0003, 0xa86f,
+	0x0100, 0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x19cb, 0x1d04, 0x7fff,
+	0x2091, 0x6000, 0x700c, 0x8001, 0x700e, 0x1510, 0x2001, 0x1875,
+	0x2004, 0xd0c4, 0x0158, 0x3a00, 0xd08c, 0x1140, 0x20d1, 0x0000,
+	0x20d1, 0x0001, 0x20d1, 0x0000, 0x080c, 0x0db4, 0x700f, 0x0361,
+	0x7007, 0x0001, 0x0126, 0x2091, 0x8000, 0x080c, 0x80f0, 0x7040,
+	0x900d, 0x0148, 0x8109, 0x7142, 0x1130, 0x7044, 0x080f, 0x0018,
+	0x0126, 0x2091, 0x8000, 0x7024, 0x900d, 0x0188, 0x7020, 0x8001,
+	0x7022, 0x1168, 0x7023, 0x0009, 0x8109, 0x7126, 0x9186, 0x03e8,
+	0x1110, 0x7028, 0x080f, 0x81ff, 0x1110, 0x7028, 0x080f, 0x7030,
+	0x900d, 0x0180, 0x702c, 0x8001, 0x702e, 0x1160, 0x702f, 0x0009,
+	0x8109, 0x7132, 0x0128, 0x9184, 0x007f, 0x090c, 0x9524, 0x0010,
+	0x7034, 0x080f, 0x703c, 0x9005, 0x0118, 0x0310, 0x8001, 0x703e,
+	0x704c, 0x900d, 0x0168, 0x7048, 0x8001, 0x704a, 0x1148, 0x704b,
+	0x0009, 0x8109, 0x714e, 0x1120, 0x7150, 0x714e, 0x7058, 0x080f,
+	0x7018, 0x900d, 0x01d8, 0x0016, 0x7070, 0x900d, 0x0158, 0x706c,
+	0x8001, 0x706e, 0x1138, 0x706f, 0x0009, 0x8109, 0x7172, 0x1110,
+	0x7074, 0x080f, 0x001e, 0x7008, 0x8001, 0x700a, 0x1138, 0x700b,
+	0x0009, 0x8109, 0x711a, 0x1110, 0x701c, 0x080f, 0x012e, 0x7004,
+	0x0002, 0x8027, 0x8028, 0x8044, 0x00e6, 0x2071, 0x19cb, 0x7018,
+	0x9005, 0x1120, 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005,
+	0x00e6, 0x0006, 0x2071, 0x19cb, 0x701c, 0x9206, 0x1120, 0x701a,
+	0x701e, 0x7072, 0x7076, 0x000e, 0x00ee, 0x0005, 0x00e6, 0x2071,
+	0x19cb, 0xb888, 0x9102, 0x0208, 0xb98a, 0x00ee, 0x0005, 0x0005,
+	0x00b6, 0x7110, 0x080c, 0x6237, 0x1168, 0xb888, 0x8001, 0x0250,
+	0xb88a, 0x1140, 0x0126, 0x2091, 0x8000, 0x0016, 0x080c, 0x894b,
+	0x001e, 0x012e, 0x8108, 0x9182, 0x0800, 0x0218, 0x900e, 0x7007,
+	0x0002, 0x7112, 0x00be, 0x0005, 0x7014, 0x2060, 0x0126, 0x2091,
+	0x8000, 0x6040, 0x9005, 0x0128, 0x8001, 0x6042, 0x1110, 0x080c,
+	0xbe04, 0x6018, 0x9005, 0x0528, 0x8001, 0x601a, 0x1510, 0x6120,
+	0x9186, 0x0003, 0x0118, 0x9186, 0x0006, 0x11c8, 0x080c, 0xbafe,
+	0x01b0, 0x6014, 0x2048, 0xa884, 0x908a, 0x199a, 0x0280, 0x9082,
+	0x1999, 0xa886, 0x908a, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003,
+	0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, 0xd0e4, 0x0110, 0x080c,
+	0xb7fc, 0x012e, 0x9c88, 0x0018, 0x7116, 0x2001, 0x1819, 0x2004,
+	0x9102, 0x0220, 0x7017, 0x1cd0, 0x7007, 0x0000, 0x0005, 0x00e6,
+	0x2071, 0x19cb, 0x7027, 0x07d0, 0x7023, 0x0009, 0x00ee, 0x0005,
+	0x2001, 0x19d4, 0x2003, 0x0000, 0x0005, 0x00e6, 0x2071, 0x19cb,
+	0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, 0x2011, 0x19d7, 0x2013,
+	0x0000, 0x0005, 0x00e6, 0x2071, 0x19cb, 0x711a, 0x721e, 0x700b,
+	0x0009, 0x00ee, 0x0005, 0x0086, 0x0026, 0x7054, 0x8000, 0x7056,
+	0x2001, 0x19d9, 0x2044, 0xa06c, 0x9086, 0x0000, 0x0150, 0x7068,
+	0xa09a, 0x7064, 0xa096, 0x7060, 0xa092, 0x705c, 0xa08e, 0x080c,
+	0x10d5, 0x002e, 0x008e, 0x0005, 0x0006, 0x0016, 0x0096, 0x00a6,
+	0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x080c, 0x7f74,
+	0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e,
+	0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x19cb, 0x7172, 0x7276,
+	0x706f, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x19cb,
+	0x7074, 0x9206, 0x1110, 0x7072, 0x7076, 0x000e, 0x00ee, 0x0005,
+	0x2069, 0x1800, 0x69e4, 0xd1e4, 0x1518, 0x0026, 0xd1ec, 0x0140,
+	0x6a50, 0x6870, 0x9202, 0x0288, 0x8117, 0x9294, 0x00c0, 0x0088,
+	0x9184, 0x0007, 0x01a0, 0x8109, 0x9184, 0x0007, 0x0110, 0x69e6,
+	0x0070, 0x8107, 0x9084, 0x0007, 0x910d, 0x8107, 0x9106, 0x9094,
+	0x00c0, 0x9184, 0xff3f, 0x9205, 0x68e6, 0x080c, 0x0ecb, 0x002e,
+	0x0005, 0x00c6, 0x2061, 0x1a41, 0x00ce, 0x0005, 0x9184, 0x000f,
+	0x8003, 0x8003, 0x8003, 0x9080, 0x1a41, 0x2060, 0x0005, 0xa884,
+	0x908a, 0x199a, 0x1638, 0x9005, 0x1150, 0x00c6, 0x2061, 0x1a41,
+	0x6014, 0x00ce, 0x9005, 0x1130, 0x2001, 0x001e, 0x0018, 0x908e,
+	0xffff, 0x01b0, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c,
+	0x908c, 0x00c0, 0x918e, 0x00c0, 0x0904, 0x81b1, 0xd0b4, 0x1168,
+	0xd0bc, 0x1904, 0x818a, 0x2009, 0x0006, 0x080c, 0x81de, 0x0005,
+	0x900e, 0x0c60, 0x2001, 0x1999, 0x08b0, 0xd0fc, 0x0160, 0x908c,
+	0x0003, 0x0120, 0x918e, 0x0003, 0x1904, 0x81d8, 0x908c, 0x2020,
+	0x918e, 0x2020, 0x01a8, 0x6024, 0xd0d4, 0x11e8, 0x2009, 0x1875,
+	0x2104, 0xd084, 0x1138, 0x87ff, 0x1120, 0x2009, 0x0043, 0x0804,
+	0x9e93, 0x0005, 0x87ff, 0x1de8, 0x2009, 0x0042, 0x0804, 0x9e93,
+	0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d20, 0x6024,
+	0xc0cd, 0x6026, 0x0c00, 0xc0d4, 0x6026, 0xa890, 0x602e, 0xa88c,
+	0x6032, 0x08e0, 0xd0fc, 0x0160, 0x908c, 0x0003, 0x0120, 0x918e,
+	0x0003, 0x1904, 0x81d8, 0x908c, 0x2020, 0x918e, 0x2020, 0x0170,
+	0x0076, 0x00f6, 0x2c78, 0x080c, 0x1648, 0x00fe, 0x007e, 0x87ff,
+	0x1120, 0x2009, 0x0042, 0x080c, 0x9e93, 0x0005, 0x6110, 0x00b6,
+	0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d58, 0x6124, 0xc1cd, 0x6126,
+	0x0c38, 0xd0fc, 0x0188, 0x908c, 0x2020, 0x918e, 0x2020, 0x01a8,
+	0x9084, 0x0003, 0x908e, 0x0002, 0x0148, 0x87ff, 0x1120, 0x2009,
+	0x0041, 0x080c, 0x9e93, 0x0005, 0x00b9, 0x0ce8, 0x87ff, 0x1dd8,
+	0x2009, 0x0043, 0x080c, 0x9e93, 0x0cb0, 0x6110, 0x00b6, 0x2158,
+	0xb900, 0x00be, 0xd1ac, 0x0d20, 0x6124, 0xc1cd, 0x6126, 0x0c00,
+	0x2009, 0x0004, 0x0019, 0x0005, 0x2009, 0x0001, 0x0096, 0x080c,
+	0xbafe, 0x0518, 0x6014, 0x2048, 0xa982, 0xa800, 0x6016, 0x9186,
+	0x0001, 0x1188, 0xa97c, 0x918c, 0x8100, 0x918e, 0x8100, 0x1158,
+	0x00c6, 0x2061, 0x1a41, 0x6200, 0xd28c, 0x1120, 0x6204, 0x8210,
+	0x0208, 0x6206, 0x00ce, 0x080c, 0x66bf, 0x6014, 0x904d, 0x0076,
+	0x2039, 0x0000, 0x190c, 0x8127, 0x007e, 0x009e, 0x0005, 0x0156,
+	0x00c6, 0x2061, 0x1a41, 0x6000, 0x81ff, 0x0110, 0x9205, 0x0008,
+	0x9204, 0x6002, 0x00ce, 0x015e, 0x0005, 0x6800, 0xd08c, 0x1138,
+	0x6808, 0x9005, 0x0120, 0x8001, 0x680a, 0x9085, 0x0001, 0x0005,
+	0x0126, 0x2091, 0x8000, 0x0036, 0x0046, 0x20a9, 0x0010, 0x9006,
+	0x8004, 0x2019, 0x0100, 0x231c, 0x93a6, 0x0008, 0x1118, 0x8086,
+	0x818e, 0x0020, 0x80f6, 0x3e00, 0x81f6, 0x3e08, 0x1208, 0x9200,
+	0x1f04, 0x8229, 0x93a6, 0x0008, 0x1118, 0x8086, 0x818e, 0x0020,
+	0x80f6, 0x3e00, 0x81f6, 0x3e08, 0x004e, 0x003e, 0x012e, 0x0005,
+	0x0126, 0x2091, 0x8000, 0x0076, 0x0156, 0x20a9, 0x0010, 0x9005,
+	0x0510, 0x911a, 0x1600, 0x8213, 0x2039, 0x0100, 0x273c, 0x97be,
+	0x0008, 0x1110, 0x818d, 0x0010, 0x81f5, 0x3e08, 0x0228, 0x911a,
+	0x1220, 0x1f04, 0x8253, 0x0028, 0x911a, 0x2308, 0x8210, 0x1f04,
+	0x8253, 0x0006, 0x3200, 0x9084, 0xefff, 0x2080, 0x000e, 0x015e,
+	0x007e, 0x012e, 0x0005, 0x0006, 0x3200, 0x9085, 0x1000, 0x0ca8,
+	0x0126, 0x2091, 0x2800, 0x2079, 0x19b8, 0x012e, 0x00d6, 0x2069,
+	0x19b8, 0x6803, 0x0005, 0x0156, 0x0146, 0x01d6, 0x20e9, 0x0000,
+	0x2069, 0x0200, 0x080c, 0x9c26, 0x0401, 0x080c, 0x9c11, 0x00e9,
+	0x080c, 0x9c14, 0x00d1, 0x080c, 0x9c17, 0x00b9, 0x080c, 0x9c1a,
+	0x00a1, 0x080c, 0x9c1d, 0x0089, 0x080c, 0x9c20, 0x0071, 0x080c,
+	0x9c23, 0x0059, 0x01de, 0x014e, 0x015e, 0x2069, 0x0004, 0x2d04,
+	0x9085, 0x8001, 0x206a, 0x00de, 0x0005, 0x20a9, 0x0020, 0x20a1,
+	0x0240, 0x2001, 0x0000, 0x4004, 0x0005, 0x00c6, 0x6027, 0x0001,
+	0x7804, 0x9084, 0x0007, 0x0002, 0x82c6, 0x82ea, 0x8329, 0x82cc,
+	0x82ea, 0x82c6, 0x82c4, 0x82c4, 0x080c, 0x0db4, 0x080c, 0x8090,
+	0x080c, 0x894b, 0x00ce, 0x0005, 0x62c0, 0x82ff, 0x1110, 0x00ce,
+	0x0005, 0x2011, 0x5b33, 0x080c, 0x8010, 0x7828, 0x9092, 0x00c8,
+	0x1228, 0x8000, 0x782a, 0x080c, 0x5b73, 0x0c88, 0x62c0, 0x080c,
+	0x9c2a, 0x080c, 0x5b33, 0x7807, 0x0003, 0x7827, 0x0000, 0x782b,
+	0x0000, 0x0c28, 0x080c, 0x8090, 0x6220, 0xd2a4, 0x0160, 0x782b,
+	0x0000, 0x7824, 0x9065, 0x090c, 0x0db4, 0x2009, 0x0013, 0x080c,
+	0x9e93, 0x00ce, 0x0005, 0x00c6, 0x7824, 0x9065, 0x090c, 0x0db4,
+	0x7828, 0x9092, 0xc350, 0x12c0, 0x8000, 0x782a, 0x00ce, 0x080c,
+	0x29ca, 0x0278, 0x00c6, 0x7924, 0x2160, 0x6010, 0x906d, 0x090c,
+	0x0db4, 0x7807, 0x0000, 0x7827, 0x0000, 0x00ce, 0x080c, 0x894b,
+	0x0c00, 0x080c, 0x936f, 0x08e8, 0x2011, 0x0130, 0x2214, 0x080c,
+	0x9c2a, 0x080c, 0xd8a9, 0x2009, 0x0014, 0x080c, 0x9e93, 0x00ce,
+	0x0880, 0x2001, 0x19d4, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160,
+	0x782b, 0x0000, 0x7824, 0x9065, 0x090c, 0x0db4, 0x2009, 0x0013,
+	0x080c, 0x9ee5, 0x00ce, 0x0005, 0x00b6, 0x00c6, 0x00d6, 0x7824,
+	0x9005, 0x090c, 0x0db4, 0x7828, 0x9092, 0xc350, 0x1648, 0x8000,
+	0x782a, 0x00de, 0x00ce, 0x00be, 0x080c, 0x29ca, 0x02f0, 0x00b6,
+	0x00c6, 0x00d6, 0x781c, 0x905d, 0x090c, 0x0db4, 0xb800, 0xc0dc,
+	0xb802, 0x7924, 0x2160, 0x080c, 0x9e19, 0xb93c, 0x81ff, 0x090c,
+	0x0db4, 0x8109, 0xb93e, 0x7807, 0x0000, 0x7827, 0x0000, 0x00de,
+	0x00ce, 0x00be, 0x080c, 0x894b, 0x0868, 0x080c, 0x936f, 0x0850,
+	0x2011, 0x0130, 0x2214, 0x080c, 0x9c2a, 0x080c, 0xd8a9, 0x7824,
+	0x9065, 0x2009, 0x0014, 0x080c, 0x9e93, 0x00de, 0x00ce, 0x00be,
+	0x0804, 0x833a, 0x00c6, 0x2001, 0x009b, 0x2004, 0xd0fc, 0x190c,
+	0x1d4a, 0x6024, 0x6027, 0x0002, 0xd0f4, 0x1580, 0x62c8, 0x60c4,
+	0x9205, 0x1170, 0x783c, 0x9065, 0x0130, 0x2009, 0x0049, 0x080c,
+	0x9e93, 0x00ce, 0x0005, 0x2011, 0x19d7, 0x2013, 0x0000, 0x0cc8,
+	0x793c, 0x81ff, 0x0dc0, 0x7944, 0x9192, 0x7530, 0x12f0, 0x8108,
+	0x7946, 0x793c, 0x9188, 0x0008, 0x210c, 0x918e, 0x0006, 0x1138,
+	0x6014, 0x9084, 0x1984, 0x9085, 0x0012, 0x6016, 0x0c10, 0x6014,
+	0x9084, 0x1984, 0x9085, 0x0016, 0x6016, 0x08d8, 0x793c, 0x2160,
+	0x2009, 0x004a, 0x080c, 0x9e93, 0x08a0, 0x7848, 0xc085, 0x784a,
+	0x0880, 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f,
+	0x0000, 0x2c08, 0x2061, 0x19b8, 0x6020, 0x8000, 0x6022, 0x6010,
+	0x9005, 0x0148, 0x9080, 0x0003, 0x2102, 0x6112, 0x012e, 0x00ce,
+	0x001e, 0x000e, 0x0005, 0x6116, 0x6112, 0x0cc0, 0x00d6, 0x2069,
+	0x19b8, 0xb800, 0xd0d4, 0x0168, 0x6820, 0x8000, 0x6822, 0x9086,
+	0x0001, 0x1110, 0x2b00, 0x681e, 0x00de, 0x0804, 0x894b, 0x00de,
+	0x0005, 0xc0d5, 0xb802, 0x6818, 0x9005, 0x0168, 0xb856, 0xb85b,
+	0x0000, 0x0086, 0x0006, 0x2b00, 0x681a, 0x008e, 0xa05a, 0x008e,
+	0x2069, 0x19b8, 0x0c08, 0xb856, 0xb85a, 0x2b00, 0x681a, 0x681e,
+	0x08d8, 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f,
+	0x0000, 0x2c08, 0x2061, 0x19b8, 0x6020, 0x8000, 0x6022, 0x6008,
+	0x9005, 0x0148, 0x9080, 0x0003, 0x2102, 0x610a, 0x012e, 0x00ce,
+	0x001e, 0x000e, 0x0005, 0x610e, 0x610a, 0x0cc0, 0x00c6, 0x600f,
+	0x0000, 0x2c08, 0x2061, 0x19b8, 0x6034, 0x9005, 0x0130, 0x9080,
+	0x0003, 0x2102, 0x6136, 0x00ce, 0x0005, 0x613a, 0x6136, 0x00ce,
+	0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x00b6, 0x0096, 0x0076,
+	0x0066, 0x0056, 0x0036, 0x0026, 0x0016, 0x0006, 0x0126, 0x902e,
+	0x2071, 0x19b8, 0x7638, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff,
+	0x0904, 0x84b8, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x84b3,
+	0x87ff, 0x0120, 0x6054, 0x9106, 0x1904, 0x84b3, 0x703c, 0x9c06,
+	0x1178, 0x0036, 0x2019, 0x0001, 0x080c, 0x96bf, 0x7033, 0x0000,
+	0x9006, 0x703e, 0x7042, 0x7046, 0x704a, 0x003e, 0x2029, 0x0001,
+	0x7038, 0x9c36, 0x1110, 0x660c, 0x763a, 0x7034, 0x9c36, 0x1140,
+	0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000,
+	0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678,
+	0x600f, 0x0000, 0x080c, 0xbafe, 0x01c8, 0x6014, 0x2048, 0x6020,
+	0x9086, 0x0003, 0x1590, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000,
+	0x0016, 0x0036, 0x0076, 0x080c, 0xbded, 0x080c, 0xd7b3, 0x080c,
+	0x6885, 0x007e, 0x003e, 0x001e, 0x080c, 0xbce7, 0x080c, 0x9e49,
+	0x00ce, 0x0804, 0x8457, 0x2c78, 0x600c, 0x2060, 0x0804, 0x8457,
+	0x85ff, 0x0120, 0x0036, 0x080c, 0x8a26, 0x003e, 0x012e, 0x000e,
+	0x001e, 0x002e, 0x003e, 0x005e, 0x006e, 0x007e, 0x009e, 0x00be,
+	0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020, 0x9086, 0x0006,
+	0x1158, 0x0016, 0x0036, 0x0076, 0x080c, 0xd7b3, 0x080c, 0xd4b5,
+	0x007e, 0x003e, 0x001e, 0x0890, 0x6020, 0x9086, 0x000a, 0x0904,
+	0x849d, 0x0804, 0x849b, 0x0006, 0x0066, 0x0096, 0x00c6, 0x00d6,
+	0x00f6, 0x9036, 0x0126, 0x2091, 0x8000, 0x2079, 0x19b8, 0x7838,
+	0x9065, 0x0904, 0x8533, 0x600c, 0x0006, 0x600f, 0x0000, 0x783c,
+	0x9c06, 0x1168, 0x0036, 0x2019, 0x0001, 0x080c, 0x96bf, 0x7833,
+	0x0000, 0x901e, 0x7b3e, 0x7b42, 0x7b46, 0x7b4a, 0x003e, 0x080c,
+	0xbafe, 0x0520, 0x6014, 0x2048, 0x6020, 0x9086, 0x0003, 0x1568,
+	0x3e08, 0x918e, 0x0002, 0x1188, 0x6010, 0x9005, 0x0170, 0x00b6,
+	0x2058, 0xb800, 0x00be, 0xd0bc, 0x0140, 0x6040, 0x9005, 0x1180,
+	0x2001, 0x1959, 0x2004, 0x6042, 0x0058, 0xa867, 0x0103, 0xab7a,
+	0xa877, 0x0000, 0x080c, 0x6878, 0x080c, 0xbce7, 0x080c, 0x9e49,
+	0x000e, 0x0804, 0x84f0, 0x7e3a, 0x7e36, 0x012e, 0x00fe, 0x00de,
+	0x00ce, 0x009e, 0x006e, 0x000e, 0x0005, 0x6020, 0x9086, 0x0006,
+	0x1118, 0x080c, 0xd4b5, 0x0c50, 0x6020, 0x9086, 0x000a, 0x09f8,
+	0x08e0, 0x0016, 0x0026, 0x0086, 0x9046, 0x0099, 0x080c, 0x8632,
+	0x008e, 0x002e, 0x001e, 0x0005, 0x00f6, 0x0126, 0x2079, 0x19b8,
+	0x2091, 0x8000, 0x080c, 0x86c9, 0x080c, 0x8757, 0x012e, 0x00fe,
+	0x0005, 0x00b6, 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066,
+	0x0016, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b8, 0x7614,
+	0x2660, 0x2678, 0x8cff, 0x0904, 0x85f7, 0x6010, 0x2058, 0xb8a0,
+	0x9206, 0x1904, 0x85f2, 0x88ff, 0x0120, 0x6054, 0x9106, 0x1904,
+	0x85f2, 0x7024, 0x9c06, 0x1558, 0x2069, 0x0100, 0x6820, 0xd0a4,
+	0x1508, 0x080c, 0x8090, 0x080c, 0x9393, 0x68c3, 0x0000, 0x080c,
+	0x98c1, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384,
+	0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2b14, 0x9006, 0x080c,
+	0x2b14, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001,
+	0x003e, 0x0028, 0x6003, 0x0009, 0x630a, 0x0804, 0x85f2, 0x7014,
+	0x9c36, 0x1110, 0x660c, 0x7616, 0x7010, 0x9c36, 0x1140, 0x2c00,
+	0x9f36, 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, 0x0000, 0x660c,
+	0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f,
+	0x0000, 0x6014, 0x2048, 0x080c, 0xbafe, 0x01e8, 0x6020, 0x9086,
+	0x0003, 0x1580, 0x080c, 0xbd04, 0x1118, 0x080c, 0xa7a7, 0x0098,
+	0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, 0x0086,
+	0x080c, 0xbded, 0x080c, 0xd7b3, 0x080c, 0x6885, 0x008e, 0x003e,
+	0x001e, 0x080c, 0xbce7, 0x080c, 0x9e49, 0x080c, 0x9797, 0x00ce,
+	0x0804, 0x8572, 0x2c78, 0x600c, 0x2060, 0x0804, 0x8572, 0x012e,
+	0x000e, 0x001e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e,
+	0x00be, 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, 0x0036,
+	0x0086, 0x080c, 0xd7b3, 0x080c, 0xd4b5, 0x008e, 0x003e, 0x001e,
+	0x08d0, 0x080c, 0xa7a7, 0x6020, 0x9086, 0x0002, 0x1160, 0x6004,
+	0x0006, 0x9086, 0x0085, 0x000e, 0x0904, 0x85d8, 0x9086, 0x008b,
+	0x0904, 0x85d8, 0x0840, 0x6020, 0x9086, 0x0005, 0x1920, 0x6004,
+	0x0006, 0x9086, 0x0085, 0x000e, 0x09c8, 0x9086, 0x008b, 0x09b0,
+	0x0804, 0x85eb, 0x00b6, 0x00a6, 0x0096, 0x00c6, 0x0006, 0x0126,
+	0x2091, 0x8000, 0x9280, 0x1000, 0x2004, 0x905d, 0x0904, 0x86c2,
+	0x00f6, 0x00e6, 0x00d6, 0x0066, 0x2071, 0x19b8, 0xbe54, 0x7018,
+	0x9b06, 0x1108, 0x761a, 0x701c, 0x9b06, 0x1130, 0x86ff, 0x1118,
+	0x7018, 0x701e, 0x0008, 0x761e, 0xb858, 0x904d, 0x0108, 0xae56,
+	0x96d5, 0x0000, 0x0110, 0x2900, 0xb05a, 0xb857, 0x0000, 0xb85b,
+	0x0000, 0xb800, 0xc0d4, 0xc0dc, 0xb802, 0x080c, 0x616a, 0x0904,
+	0x86be, 0x7624, 0x86ff, 0x0904, 0x86ad, 0x9680, 0x0005, 0x2004,
+	0x9906, 0x15d8, 0x00d6, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0560,
+	0x080c, 0x8090, 0x080c, 0x9393, 0x68c3, 0x0000, 0x080c, 0x98c1,
 	0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000,
-	0x0138, 0x2001, 0x0100, 0x080c, 0x29bc, 0x9006, 0x080c, 0x29bc,
+	0x0138, 0x2001, 0x0100, 0x080c, 0x2b14, 0x9006, 0x080c, 0x2b14,
 	0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e,
-	0x7014, 0x9c36, 0x1110, 0x660c, 0x7616, 0x7010, 0x9c36, 0x1140,
-	0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, 0x0000,
-	0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678,
-	0x89ff, 0x1168, 0x600f, 0x0000, 0x6014, 0x0096, 0x2048, 0x080c,
-	0xb791, 0x0110, 0x080c, 0xd133, 0x009e, 0x080c, 0x9af8, 0x080c,
-	0x9446, 0x88ff, 0x1190, 0x00ce, 0x0804, 0x9461, 0x2c78, 0x600c,
-	0x2060, 0x0804, 0x9461, 0x9006, 0x012e, 0x000e, 0x006e, 0x007e,
-	0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce,
-	0x98c5, 0x0001, 0x0c88, 0x00f6, 0x00e6, 0x00d6, 0x0096, 0x00c6,
-	0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b6,
-	0x7638, 0x2660, 0x2678, 0x8cff, 0x0904, 0x955f, 0x6020, 0x9086,
-	0x0006, 0x1904, 0x955a, 0x87ff, 0x0128, 0x2700, 0x9c06, 0x1904,
-	0x955a, 0x0040, 0x6010, 0x9b06, 0x15e8, 0x85ff, 0x0118, 0x6054,
-	0x9106, 0x15c0, 0x703c, 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001,
-	0x080c, 0x935a, 0x7033, 0x0000, 0x9006, 0x703e, 0x7042, 0x7046,
-	0x704a, 0x003e, 0x7038, 0x9c36, 0x1110, 0x660c, 0x763a, 0x7034,
-	0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7036, 0x0010,
-	0x7037, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e,
-	0x0008, 0x2678, 0x600f, 0x0000, 0x6014, 0x2048, 0x080c, 0xb791,
-	0x0110, 0x080c, 0xd133, 0x080c, 0x9af8, 0x87ff, 0x1198, 0x00ce,
-	0x0804, 0x950b, 0x2c78, 0x600c, 0x2060, 0x0804, 0x950b, 0x9006,
-	0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x009e, 0x00de, 0x00ee,
-	0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x97bd, 0x0001, 0x0c80,
-	0x00e6, 0x2071, 0x19b6, 0x2001, 0x1800, 0x2004, 0x9086, 0x0002,
-	0x1118, 0x7007, 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, 0x0005,
-	0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091,
-	0x8000, 0x2071, 0x19b6, 0x2c10, 0x7638, 0x2660, 0x2678, 0x8cff,
-	0x0518, 0x2200, 0x9c06, 0x11e0, 0x7038, 0x9c36, 0x1110, 0x660c,
-	0x763a, 0x7034, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00,
-	0x7036, 0x0010, 0x7037, 0x0000, 0x660c, 0x2c00, 0x9f06, 0x0110,
-	0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x9085, 0x0001, 0x0020,
-	0x2c78, 0x600c, 0x2060, 0x08d8, 0x012e, 0x000e, 0x002e, 0x006e,
-	0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0096, 0x00f6, 0x00e6, 0x00d6,
-	0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071,
-	0x19b6, 0x760c, 0x2660, 0x2678, 0x8cff, 0x0904, 0x964c, 0x6010,
-	0x00b6, 0x2058, 0xb8a0, 0x00be, 0x9206, 0x1904, 0x9647, 0x7024,
-	0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x9623,
-	0x080c, 0x90c1, 0x68c3, 0x0000, 0x080c, 0x9570, 0x7027, 0x0000,
-	0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001,
-	0x0100, 0x080c, 0x29bc, 0x9006, 0x080c, 0x29bc, 0x2069, 0x0100,
-	0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x700c, 0x9c36,
-	0x1110, 0x660c, 0x760e, 0x7008, 0x9c36, 0x1140, 0x2c00, 0x9f36,
-	0x0118, 0x2f00, 0x700a, 0x0010, 0x700b, 0x0000, 0x660c, 0x0066,
-	0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000,
-	0x080c, 0xb981, 0x1158, 0x080c, 0x2ea4, 0x080c, 0xb992, 0x11f0,
-	0x080c, 0xa456, 0x00d8, 0x080c, 0x9570, 0x08c0, 0x080c, 0xb992,
-	0x1118, 0x080c, 0xa456, 0x0090, 0x6014, 0x2048, 0x080c, 0xb791,
-	0x0168, 0x6020, 0x9086, 0x0003, 0x1508, 0xa867, 0x0103, 0xab7a,
-	0xa877, 0x0000, 0x080c, 0x65e5, 0x080c, 0xb975, 0x080c, 0xbbf9,
-	0x080c, 0x9af8, 0x080c, 0x9446, 0x00ce, 0x0804, 0x95cc, 0x2c78,
-	0x600c, 0x2060, 0x0804, 0x95cc, 0x012e, 0x000e, 0x002e, 0x006e,
-	0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, 0x0005, 0x6020, 0x9086,
-	0x0006, 0x1d20, 0x080c, 0xd133, 0x0c08, 0x00d6, 0x080c, 0x8bf4,
-	0x7003, 0x0200, 0x7007, 0x0014, 0x60c3, 0x0014, 0x20e1, 0x0001,
-	0x2099, 0x1958, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x20a9, 0x0004,
-	0x4003, 0x7023, 0x0004, 0x7027, 0x7878, 0x080c, 0x9095, 0x00de,
-	0x0005, 0x080c, 0x8bf4, 0x700b, 0x0800, 0x7814, 0x9084, 0xff00,
-	0x700e, 0x7814, 0x9084, 0x00ff, 0x7022, 0x782c, 0x7026, 0x7858,
-	0x9084, 0x00ff, 0x9085, 0x0200, 0x7002, 0x7858, 0x9084, 0xff00,
-	0x8007, 0x7006, 0x60c2, 0x0804, 0x9095, 0x00b6, 0x00d6, 0x0016,
-	0x00d6, 0x2f68, 0x2009, 0x0035, 0x080c, 0xbdfe, 0x00de, 0x1904,
-	0x96fa, 0x080c, 0x8ba9, 0x7003, 0x1300, 0x782c, 0x080c, 0x97fc,
-	0x2068, 0x6820, 0x9086, 0x0003, 0x0560, 0x7810, 0x2058, 0xbaa0,
-	0x080c, 0x9a47, 0x11d8, 0x9286, 0x007e, 0x1128, 0x700b, 0x00ff,
-	0x700f, 0xfffe, 0x0498, 0x9286, 0x007f, 0x1128, 0x700b, 0x00ff,
-	0x700f, 0xfffd, 0x0458, 0x9284, 0xff80, 0x0180, 0x9286, 0x0080,
-	0x1128, 0x700b, 0x00ff, 0x700f, 0xfffc, 0x0400, 0x92d8, 0x1000,
-	0x2b5c, 0xb810, 0x700a, 0xb814, 0x700e, 0x00c0, 0x6098, 0x700e,
-	0x00a8, 0x080c, 0x9a47, 0x1130, 0x7810, 0x2058, 0xb8a0, 0x9082,
-	0x007e, 0x0250, 0x00d6, 0x2069, 0x181e, 0x2d04, 0x700a, 0x8d68,
-	0x2d04, 0x700e, 0x00de, 0x0010, 0x6034, 0x700e, 0x7838, 0x7012,
-	0x783c, 0x7016, 0x60c3, 0x000c, 0x001e, 0x00de, 0x080c, 0x9095,
-	0x00be, 0x0005, 0x781b, 0x0001, 0x7803, 0x0006, 0x001e, 0x00de,
-	0x00be, 0x0005, 0x792c, 0x9180, 0x0008, 0x200c, 0x9186, 0x0006,
-	0x01c0, 0x9186, 0x0003, 0x0904, 0x9774, 0x9186, 0x0005, 0x0904,
-	0x975d, 0x9186, 0x0004, 0x05d8, 0x9186, 0x0008, 0x0904, 0x9765,
-	0x7807, 0x0037, 0x782f, 0x0003, 0x7817, 0x1700, 0x080c, 0x97d9,
-	0x0005, 0x080c, 0x979a, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009,
-	0x4000, 0x6800, 0x0002, 0x973e, 0x9749, 0x9740, 0x9749, 0x9745,
-	0x973e, 0x973e, 0x9749, 0x9749, 0x9749, 0x9749, 0x973e, 0x973e,
-	0x973e, 0x973e, 0x973e, 0x9749, 0x973e, 0x9749, 0x080c, 0x0db4,
-	0x6824, 0xd0e4, 0x0110, 0xd0cc, 0x0110, 0x900e, 0x0010, 0x2009,
-	0x2000, 0x682c, 0x7022, 0x6830, 0x7026, 0x0804, 0x9793, 0x080c,
-	0x979a, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x6a00,
-	0x9286, 0x0002, 0x1108, 0x900e, 0x04b0, 0x04e1, 0x00d6, 0x0026,
-	0x792c, 0x2168, 0x2009, 0x4000, 0x0470, 0x04a1, 0x00d6, 0x0026,
-	0x792c, 0x2168, 0x2009, 0x4000, 0x9286, 0x0005, 0x0118, 0x9286,
-	0x0002, 0x1108, 0x900e, 0x00f8, 0x0429, 0x00d6, 0x0026, 0x792c,
-	0x2168, 0x6814, 0x0096, 0x2048, 0xa9ac, 0xa834, 0x9112, 0xa9b0,
-	0xa838, 0x009e, 0x9103, 0x7022, 0x7226, 0x792c, 0x9180, 0x0000,
-	0x2004, 0x908e, 0x0002, 0x0130, 0x908e, 0x0004, 0x0118, 0x2009,
-	0x4000, 0x0008, 0x900e, 0x712a, 0x60c3, 0x0018, 0x002e, 0x00de,
-	0x0804, 0x9095, 0x00b6, 0x0036, 0x0046, 0x0056, 0x0066, 0x080c,
-	0x8bf4, 0x9006, 0x7003, 0x0200, 0x7938, 0x710a, 0x793c, 0x710e,
-	0x7810, 0x2058, 0xb8a0, 0x080c, 0x9a47, 0x1118, 0x9092, 0x007e,
-	0x0268, 0x00d6, 0x2069, 0x181e, 0x2d2c, 0x8d68, 0x2d34, 0x90d8,
-	0x1000, 0x2b5c, 0xbb10, 0xbc14, 0x00de, 0x0028, 0x901e, 0x6498,
-	0x2029, 0x0000, 0x6634, 0x782c, 0x9080, 0x0008, 0x2004, 0x9086,
-	0x0003, 0x1128, 0x7512, 0x7616, 0x731a, 0x741e, 0x0020, 0x7312,
-	0x7416, 0x751a, 0x761e, 0x006e, 0x005e, 0x004e, 0x003e, 0x00be,
-	0x0005, 0x080c, 0x8bf4, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814,
-	0x700e, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9095, 0x080c, 0x8ba0,
-	0x7003, 0x1400, 0x7838, 0x700a, 0x0079, 0x783c, 0x700e, 0x782c,
-	0x7012, 0x7830, 0x7016, 0x7834, 0x9084, 0x00ff, 0x8007, 0x701a,
-	0x60c3, 0x0010, 0x0804, 0x9095, 0x00e6, 0x2071, 0x0240, 0x0006,
-	0x00f6, 0x2078, 0x7810, 0x00b6, 0x2058, 0xb8bc, 0xd084, 0x0120,
-	0x7848, 0x702a, 0x7844, 0x702e, 0x00be, 0x00fe, 0x000e, 0x00ee,
-	0x0005, 0x080c, 0x8beb, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814,
-	0x700e, 0x60c3, 0x0008, 0x0804, 0x9095, 0x0021, 0x60c3, 0x0000,
-	0x0804, 0x9095, 0x00d6, 0x080c, 0x98d5, 0xb810, 0x9085, 0x0300,
+	0x00de, 0x00c6, 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, 0x2660,
+	0x080c, 0x9e49, 0x00ce, 0x0048, 0x00de, 0x00c6, 0x2660, 0x6003,
+	0x0009, 0x630a, 0x00ce, 0x0804, 0x8665, 0x89ff, 0x0158, 0xa867,
+	0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xbded, 0x080c, 0xd7b3,
+	0x080c, 0x6885, 0x080c, 0x9797, 0x0804, 0x8665, 0x006e, 0x00de,
+	0x00ee, 0x00fe, 0x012e, 0x000e, 0x00ce, 0x009e, 0x00ae, 0x00be,
+	0x0005, 0x0096, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x9036, 0x7814,
+	0x9065, 0x0904, 0x872a, 0x600c, 0x0006, 0x600f, 0x0000, 0x7824,
+	0x9c06, 0x1570, 0x2069, 0x0100, 0x6820, 0xd0a4, 0x1508, 0x080c,
+	0x8090, 0x080c, 0x9393, 0x68c3, 0x0000, 0x080c, 0x98c1, 0x7827,
+	0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138,
+	0x2001, 0x0100, 0x080c, 0x2b14, 0x9006, 0x080c, 0x2b14, 0x2069,
+	0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0040,
+	0x080c, 0x6511, 0x1520, 0x6003, 0x0009, 0x630a, 0x2c30, 0x00f8,
+	0x6014, 0x2048, 0x080c, 0xbafc, 0x01b0, 0x6020, 0x9086, 0x0003,
+	0x1508, 0x080c, 0xbd04, 0x1118, 0x080c, 0xa7a7, 0x0060, 0x080c,
+	0x6511, 0x1168, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c,
+	0x6885, 0x080c, 0xbce7, 0x080c, 0x9e49, 0x080c, 0x9797, 0x000e,
+	0x0804, 0x86d0, 0x7e16, 0x7e12, 0x00de, 0x00ce, 0x006e, 0x000e,
+	0x009e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1118, 0x080c, 0xd4b5,
+	0x0c50, 0x080c, 0xa7a7, 0x6020, 0x9086, 0x0002, 0x1150, 0x6004,
+	0x0006, 0x9086, 0x0085, 0x000e, 0x0990, 0x9086, 0x008b, 0x0978,
+	0x08d0, 0x6020, 0x9086, 0x0005, 0x19b0, 0x6004, 0x0006, 0x9086,
+	0x0085, 0x000e, 0x0d18, 0x9086, 0x008b, 0x0d00, 0x0860, 0x0006,
+	0x0066, 0x0096, 0x00b6, 0x00c6, 0x00d6, 0x7818, 0x905d, 0x0904,
+	0x87d7, 0xb854, 0x0006, 0x9006, 0xb856, 0xb85a, 0xb800, 0xc0d4,
+	0xc0dc, 0xb802, 0x080c, 0x616a, 0x0904, 0x87d4, 0x7e24, 0x86ff,
+	0x0904, 0x87c7, 0x9680, 0x0005, 0x2004, 0x9906, 0x1904, 0x87c7,
+	0x00d6, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x87be, 0x080c,
+	0x8090, 0x080c, 0x9393, 0x68c3, 0x0000, 0x080c, 0x98c1, 0x7827,
+	0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138,
+	0x2001, 0x0100, 0x080c, 0x2b14, 0x9006, 0x080c, 0x2b14, 0x2069,
+	0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x00de,
+	0x00c6, 0x3e08, 0x918e, 0x0002, 0x1168, 0xb800, 0xd0bc, 0x0150,
+	0x9680, 0x0010, 0x200c, 0x81ff, 0x1518, 0x2009, 0x1959, 0x210c,
+	0x2102, 0x00f0, 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, 0x2660,
+	0x600f, 0x0000, 0x080c, 0x9e49, 0x00ce, 0x0048, 0x00de, 0x00c6,
+	0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x876a, 0x89ff,
+	0x0138, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6885,
+	0x080c, 0x9797, 0x0804, 0x876a, 0x000e, 0x0804, 0x875e, 0x781e,
+	0x781a, 0x00de, 0x00ce, 0x00be, 0x009e, 0x006e, 0x000e, 0x0005,
+	0x00e6, 0x00d6, 0x0096, 0x0066, 0xb800, 0xd0dc, 0x01a0, 0xb84c,
+	0x904d, 0x0188, 0xa878, 0x9606, 0x1170, 0x2071, 0x19b8, 0x7024,
+	0x9035, 0x0148, 0x9080, 0x0005, 0x2004, 0x9906, 0x1120, 0xb800,
+	0xc0dc, 0xb802, 0x0029, 0x006e, 0x009e, 0x00de, 0x00ee, 0x0005,
+	0x00f6, 0x2079, 0x0100, 0x78c0, 0x9005, 0x1138, 0x00c6, 0x2660,
+	0x6003, 0x0009, 0x630a, 0x00ce, 0x04b8, 0x080c, 0x9393, 0x78c3,
+	0x0000, 0x080c, 0x98c1, 0x7027, 0x0000, 0x0036, 0x2079, 0x0140,
+	0x7b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2b14,
+	0x9006, 0x080c, 0x2b14, 0x2079, 0x0100, 0x7824, 0xd084, 0x0110,
+	0x7827, 0x0001, 0x080c, 0x98c1, 0x003e, 0x080c, 0x616a, 0x00c6,
+	0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, 0x2660, 0x080c, 0x9e19,
+	0x00ce, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xbded,
+	0x080c, 0x6885, 0x080c, 0x9797, 0x00fe, 0x0005, 0x00b6, 0x00e6,
+	0x00c6, 0x2011, 0x0101, 0x2204, 0xc0c4, 0x2012, 0x2001, 0x180c,
+	0x2014, 0xc2e4, 0x2202, 0x2071, 0x19b8, 0x7004, 0x9084, 0x0007,
+	0x0002, 0x8863, 0x8867, 0x887e, 0x88a7, 0x88e5, 0x8863, 0x887e,
+	0x8861, 0x080c, 0x0db4, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x7024,
+	0x9065, 0x0148, 0x7020, 0x8001, 0x7022, 0x600c, 0x9015, 0x0158,
+	0x7216, 0x600f, 0x0000, 0x7007, 0x0000, 0x7027, 0x0000, 0x00ce,
+	0x00ee, 0x00be, 0x0005, 0x7216, 0x7212, 0x0ca8, 0x6010, 0x2058,
+	0x080c, 0x616a, 0xb800, 0xc0dc, 0xb802, 0x7007, 0x0000, 0x7027,
+	0x0000, 0x7020, 0x8001, 0x7022, 0x1148, 0x2001, 0x180c, 0x2014,
+	0xd2ec, 0x1180, 0x00ce, 0x00ee, 0x00be, 0x0005, 0xb854, 0x9015,
+	0x0120, 0x721e, 0x080c, 0x894b, 0x0ca8, 0x7218, 0x721e, 0x080c,
+	0x894b, 0x0c80, 0xc2ec, 0x2202, 0x080c, 0x8a26, 0x0c58, 0x7024,
+	0x9065, 0x05b8, 0x700c, 0x9c06, 0x1160, 0x080c, 0x9797, 0x600c,
+	0x9015, 0x0120, 0x720e, 0x600f, 0x0000, 0x0448, 0x720e, 0x720a,
+	0x0430, 0x7014, 0x9c06, 0x1160, 0x080c, 0x9797, 0x600c, 0x9015,
+	0x0120, 0x7216, 0x600f, 0x0000, 0x00d0, 0x7216, 0x7212, 0x00b8,
+	0x6020, 0x9086, 0x0003, 0x1198, 0x6010, 0x2058, 0x080c, 0x616a,
+	0xb800, 0xc0dc, 0xb802, 0x080c, 0x9797, 0x701c, 0x9065, 0x0138,
+	0xb854, 0x9015, 0x0110, 0x721e, 0x0010, 0x7218, 0x721e, 0x7027,
+	0x0000, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x7024, 0x9065, 0x0140,
+	0x080c, 0x9797, 0x600c, 0x9015, 0x0158, 0x720e, 0x600f, 0x0000,
+	0x080c, 0x98c1, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be, 0x0005,
+	0x720e, 0x720a, 0x0ca8, 0x00d6, 0x2069, 0x19b8, 0x6830, 0x9084,
+	0x0003, 0x0002, 0x8908, 0x890a, 0x892e, 0x8906, 0x080c, 0x0db4,
+	0x00de, 0x0005, 0x00c6, 0x6840, 0x9086, 0x0001, 0x01b8, 0x683c,
+	0x9065, 0x0130, 0x600c, 0x9015, 0x0170, 0x6a3a, 0x600f, 0x0000,
+	0x6833, 0x0000, 0x683f, 0x0000, 0x2011, 0x19d7, 0x2013, 0x0000,
+	0x00ce, 0x00de, 0x0005, 0x683a, 0x6836, 0x0c90, 0x6843, 0x0000,
+	0x6838, 0x9065, 0x0d68, 0x6003, 0x0003, 0x0c50, 0x00c6, 0x9006,
+	0x6842, 0x6846, 0x684a, 0x683c, 0x9065, 0x0160, 0x600c, 0x9015,
+	0x0130, 0x6a3a, 0x600f, 0x0000, 0x683f, 0x0000, 0x0018, 0x683e,
+	0x683a, 0x6836, 0x00ce, 0x00de, 0x0005, 0x2001, 0x180c, 0x200c,
+	0xc1e5, 0x2102, 0x0005, 0x2001, 0x180c, 0x200c, 0xd1ec, 0x0120,
+	0xc1ec, 0x2102, 0x080c, 0x8a26, 0x2001, 0x19c4, 0x2004, 0x9086,
+	0x0001, 0x0d58, 0x00d6, 0x2069, 0x19b8, 0x6804, 0x9084, 0x0007,
+	0x0002, 0x896b, 0x8a0e, 0x8a0e, 0x8a0e, 0x8a0e, 0x8a10, 0x8a0e,
+	0x8969, 0x080c, 0x0db4, 0x6820, 0x9005, 0x1110, 0x00de, 0x0005,
+	0x00c6, 0x680c, 0x9065, 0x0150, 0x6807, 0x0004, 0x6826, 0x682b,
+	0x0000, 0x080c, 0x8a7c, 0x00ce, 0x00de, 0x0005, 0x6814, 0x9065,
+	0x0150, 0x6807, 0x0001, 0x6826, 0x682b, 0x0000, 0x080c, 0x8a7c,
+	0x00ce, 0x00de, 0x0005, 0x00b6, 0x00e6, 0x6a1c, 0x92dd, 0x0000,
+	0x0904, 0x89fa, 0xb84c, 0x900d, 0x0118, 0xb888, 0x9005, 0x01a0,
+	0xb854, 0x905d, 0x0120, 0x920e, 0x0904, 0x89fa, 0x0028, 0x6818,
+	0x920e, 0x0904, 0x89fa, 0x2058, 0xb84c, 0x900d, 0x0d88, 0xb888,
+	0x9005, 0x1d70, 0x2b00, 0x681e, 0xbb3c, 0xb838, 0x9302, 0x1e40,
+	0x080c, 0x9df0, 0x0904, 0x89fa, 0x8318, 0xbb3e, 0x6116, 0x2b10,
+	0x6212, 0x0096, 0x2148, 0xa880, 0x9084, 0x00ff, 0x605e, 0xa883,
+	0x0000, 0xa884, 0x009e, 0x908a, 0x199a, 0x0210, 0x2001, 0x1999,
+	0x8003, 0x801b, 0x831b, 0x9318, 0x631a, 0x6114, 0x0096, 0x2148,
+	0xa964, 0x009e, 0x918c, 0x00ff, 0x918e, 0x0048, 0x0538, 0x00f6,
+	0x2c78, 0x2061, 0x0100, 0xbab0, 0x629a, 0x2069, 0x0200, 0x2071,
+	0x0240, 0x080c, 0x8fb4, 0x2069, 0x19b8, 0xbb00, 0xc3dd, 0xbb02,
+	0x6807, 0x0002, 0x2f18, 0x6b26, 0x682b, 0x0000, 0x7823, 0x0003,
+	0x7803, 0x0001, 0x7807, 0x0040, 0x00fe, 0x00ee, 0x00be, 0x00ce,
+	0x00de, 0x0005, 0x00ee, 0x00be, 0x00ce, 0x0cd0, 0xbb00, 0xc3dd,
+	0xbb02, 0x6807, 0x0006, 0x2f18, 0x6b26, 0x682b, 0x0000, 0x080c,
+	0x9c4a, 0x00ee, 0x00be, 0x00ce, 0x00de, 0x0005, 0x00de, 0x0005,
+	0x00c6, 0x680c, 0x9065, 0x0138, 0x6807, 0x0004, 0x6826, 0x682b,
+	0x0000, 0x080c, 0x8a7c, 0x00ce, 0x00de, 0x0005, 0x2001, 0x180c,
+	0x2014, 0xc2ed, 0x2202, 0x00de, 0x00fe, 0x0005, 0x00f6, 0x00d6,
+	0x2069, 0x19b8, 0x6830, 0x9086, 0x0000, 0x1548, 0x2001, 0x180c,
+	0x2014, 0xd2e4, 0x0130, 0xc2e4, 0x2202, 0x080c, 0x895a, 0x2069,
+	0x19b8, 0x2001, 0x180c, 0x200c, 0xd1c4, 0x11e0, 0x6838, 0x907d,
+	0x01b0, 0x6a04, 0x9296, 0x0000, 0x1588, 0x6833, 0x0001, 0x683e,
+	0x6847, 0x0000, 0x684b, 0x0000, 0x0126, 0x00f6, 0x2091, 0x2400,
+	0x002e, 0x080c, 0x1ae8, 0x1178, 0x012e, 0x080c, 0x91e1, 0x00de,
+	0x00fe, 0x0005, 0xc1c4, 0x2102, 0x0066, 0x2031, 0x0001, 0x080c,
+	0x7057, 0x006e, 0x08d8, 0x012e, 0x6843, 0x0000, 0x7803, 0x0002,
+	0x780c, 0x9015, 0x0140, 0x6a3a, 0x780f, 0x0000, 0x6833, 0x0000,
+	0x683f, 0x0000, 0x0c20, 0x683a, 0x6836, 0x0cc0, 0x6a04, 0x9296,
+	0x0006, 0x0958, 0x0804, 0x8a1e, 0x6020, 0x9084, 0x000f, 0x000b,
+	0x0005, 0x8a90, 0x8a95, 0x8eee, 0x8f7d, 0x8a95, 0x8eee, 0x8f7d,
+	0x8a90, 0x8a95, 0x8a90, 0x8a90, 0x8a90, 0x8a90, 0x8a90, 0x8a90,
+	0x080c, 0x8846, 0x080c, 0x894b, 0x0005, 0x00b6, 0x0156, 0x0136,
+	0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069,
+	0x0200, 0x2071, 0x0240, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0db4,
+	0x6110, 0x2158, 0xb9b0, 0x2c78, 0x2061, 0x0100, 0x619a, 0x908a,
+	0x0040, 0x1a04, 0x8b01, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce,
+	0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0x8c78,
+	0x8cb3, 0x8cdc, 0x8d7f, 0x8da0, 0x8da6, 0x8db3, 0x8dbb, 0x8dc7,
+	0x8dcd, 0x8dde, 0x8dcd, 0x8e35, 0x8dbb, 0x8e41, 0x8e47, 0x8dc7,
+	0x8e47, 0x8e53, 0x8aff, 0x8aff, 0x8aff, 0x8aff, 0x8aff, 0x8aff,
+	0x8aff, 0x8aff, 0x8aff, 0x8aff, 0x8aff, 0x9576, 0x9599, 0x95aa,
+	0x95ca, 0x95fc, 0x8db3, 0x8aff, 0x8db3, 0x8dcd, 0x8aff, 0x8cdc,
+	0x8d7f, 0x8aff, 0x99ae, 0x8dcd, 0x8aff, 0x99ca, 0x8dcd, 0x8aff,
+	0x8dc7, 0x8c72, 0x8b22, 0x8aff, 0x99e6, 0x9a53, 0x9b2a, 0x8aff,
+	0x9b37, 0x8db0, 0x9b62, 0x8aff, 0x9606, 0x9b8f, 0x8aff, 0x080c,
+	0x0db4, 0x2100, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de,
+	0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0x8b20, 0x8b20,
+	0x8b20, 0x8b49, 0x8bf5, 0x8c00, 0x8b20, 0x8b20, 0x8b20, 0x8c47,
+	0x8c53, 0x8b64, 0x8b20, 0x8b7f, 0x8bb3, 0x9d0c, 0x9d51, 0x8dcd,
+	0x080c, 0x0db4, 0x00d6, 0x0096, 0x080c, 0x8e66, 0x7003, 0x2414,
+	0x7007, 0x0018, 0x700b, 0x0800, 0x7814, 0x2048, 0xa83c, 0x700e,
+	0xa850, 0x7022, 0xa854, 0x7026, 0x60c3, 0x0018, 0x080c, 0x9367,
+	0x009e, 0x00de, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb8a0, 0x00be,
+	0x080c, 0x9d98, 0x1118, 0x9084, 0xff80, 0x0110, 0x9085, 0x0001,
+	0x0005, 0x00d6, 0x0096, 0x080c, 0x8e66, 0x7003, 0x0500, 0x7814,
+	0x2048, 0xa874, 0x700a, 0xa878, 0x700e, 0xa87c, 0x7012, 0xa880,
+	0x7016, 0xa884, 0x701a, 0xa888, 0x701e, 0x60c3, 0x0010, 0x080c,
+	0x9367, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x080c, 0x8e66,
+	0x7003, 0x0500, 0x7814, 0x2048, 0xa8cc, 0x700a, 0xa8d0, 0x700e,
+	0xa8d4, 0x7012, 0xa8d8, 0x7016, 0xa8dc, 0x701a, 0xa8e0, 0x701e,
+	0x60c3, 0x0010, 0x080c, 0x9367, 0x009e, 0x00de, 0x0005, 0x00d6,
+	0x0096, 0x0126, 0x2091, 0x8000, 0x080c, 0x8e66, 0x20e9, 0x0000,
+	0x2001, 0x1974, 0x2003, 0x0000, 0x7814, 0x2048, 0xa814, 0x8003,
+	0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b,
+	0x2098, 0x2001, 0x1974, 0x0016, 0x200c, 0x2001, 0x0001, 0x080c,
+	0x224d, 0x080c, 0xc800, 0x9006, 0x080c, 0x224d, 0x001e, 0xa804,
+	0x9005, 0x0110, 0x2048, 0x0c28, 0x04d9, 0x080c, 0x9367, 0x012e,
+	0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000,
+	0x080c, 0x8eb1, 0x20e9, 0x0000, 0x2001, 0x1974, 0x2003, 0x0000,
+	0x7814, 0x2048, 0xa86f, 0x0200, 0xa873, 0x0000, 0xa814, 0x8003,
+	0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b,
+	0x2098, 0x2001, 0x1974, 0x0016, 0x200c, 0x080c, 0xc800, 0x001e,
+	0xa804, 0x9005, 0x0110, 0x2048, 0x0c60, 0x0051, 0x7814, 0x2048,
+	0x080c, 0x0f9d, 0x080c, 0x9367, 0x012e, 0x009e, 0x00de, 0x0005,
+	0x60c0, 0x8004, 0x9084, 0x0003, 0x9005, 0x0130, 0x9082, 0x0004,
+	0x20a3, 0x0000, 0x8000, 0x1de0, 0x0005, 0x080c, 0x8e66, 0x7003,
+	0x7800, 0x7808, 0x8007, 0x700a, 0x60c3, 0x0008, 0x0804, 0x9367,
+	0x00d6, 0x00e6, 0x080c, 0x8eb1, 0x7814, 0x9084, 0xff00, 0x2073,
+	0x0200, 0x8e70, 0x8e70, 0x9095, 0x0010, 0x2272, 0x8e70, 0x2073,
+	0x0034, 0x8e70, 0x2069, 0x1805, 0x20a9, 0x0004, 0x2d76, 0x8d68,
+	0x8e70, 0x1f04, 0x8c16, 0x2069, 0x1801, 0x20a9, 0x0004, 0x2d76,
+	0x8d68, 0x8e70, 0x1f04, 0x8c1f, 0x2069, 0x1984, 0x9086, 0xdf00,
+	0x0110, 0x2069, 0x199e, 0x20a9, 0x001a, 0x9e86, 0x0260, 0x1148,
+	0x00c6, 0x2061, 0x0200, 0x6010, 0x8000, 0x6012, 0x00ce, 0x2071,
+	0x0240, 0x2d04, 0x8007, 0x2072, 0x8d68, 0x8e70, 0x1f04, 0x8c2d,
+	0x60c3, 0x004c, 0x080c, 0x9367, 0x00ee, 0x00de, 0x0005, 0x080c,
+	0x8e66, 0x7003, 0x6300, 0x7007, 0x0028, 0x7808, 0x700e, 0x60c3,
+	0x0008, 0x0804, 0x9367, 0x00d6, 0x0026, 0x0016, 0x080c, 0x8eb1,
+	0x7003, 0x0200, 0x7814, 0x700e, 0x00e6, 0x9ef0, 0x0004, 0x2009,
+	0x0001, 0x2011, 0x000c, 0x2073, 0x0800, 0x8e70, 0x2073, 0x0000,
+	0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c, 0x9367, 0x001e, 0x002e,
+	0x00de, 0x0005, 0x2001, 0x1817, 0x2004, 0x609a, 0x0804, 0x9367,
+	0x080c, 0x8e66, 0x7003, 0x5200, 0x2069, 0x1853, 0x6804, 0xd084,
+	0x0130, 0x6828, 0x0016, 0x080c, 0x2696, 0x710e, 0x001e, 0x20a9,
+	0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1,
+	0x0250, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, 0x0254,
+	0x4003, 0x080c, 0x9d98, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248,
+	0x2001, 0x181e, 0x2004, 0x7032, 0x2001, 0x181f, 0x2004, 0x7036,
+	0x0030, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x7036, 0x60c3,
+	0x001c, 0x0804, 0x9367, 0x080c, 0x8e66, 0x7003, 0x0500, 0x080c,
+	0x9d98, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, 0x181e,
+	0x2004, 0x700a, 0x2001, 0x181f, 0x2004, 0x700e, 0x0030, 0x2001,
+	0x1817, 0x2004, 0x9084, 0x00ff, 0x700e, 0x20a9, 0x0004, 0x20e1,
+	0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x4003,
+	0x60c3, 0x0010, 0x0804, 0x9367, 0x080c, 0x8e66, 0x9006, 0x080c,
+	0x6525, 0xb8a0, 0x9086, 0x007e, 0x1130, 0x7003, 0x0400, 0x620c,
+	0xc2b4, 0x620e, 0x0058, 0x7814, 0x0096, 0x904d, 0x0120, 0x9006,
+	0xa89a, 0xa8a6, 0xa8aa, 0x009e, 0x7003, 0x0300, 0xb8a0, 0x9086,
+	0x007e, 0x1904, 0x8d47, 0x00d6, 0x2069, 0x193d, 0x2001, 0x1836,
+	0x2004, 0xd0a4, 0x0178, 0x6800, 0x700a, 0x6808, 0x9084, 0x2000,
+	0x7012, 0x680c, 0x7016, 0x701f, 0x2710, 0x6818, 0x7022, 0x681c,
+	0x7026, 0x0080, 0x6800, 0x700a, 0x6804, 0x700e, 0x6808, 0x080c,
+	0x6fa7, 0x1118, 0x9084, 0x37ff, 0x0010, 0x9084, 0x3fff, 0x7012,
+	0x680c, 0x7016, 0x00de, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099,
+	0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004,
+	0x2099, 0x1801, 0x20a1, 0x025a, 0x4003, 0x00d6, 0x080c, 0x9c11,
+	0x2069, 0x1945, 0x2071, 0x024e, 0x6800, 0xc0dd, 0x7002, 0x080c,
+	0x5383, 0xd0e4, 0x0110, 0x680c, 0x700e, 0x00de, 0x04a0, 0x2001,
+	0x1836, 0x2004, 0xd0a4, 0x0168, 0x0016, 0x2009, 0x0002, 0x60e0,
+	0x9106, 0x0130, 0x2100, 0x60e3, 0x0000, 0x080c, 0x26d7, 0x61e2,
+	0x001e, 0x20e1, 0x0001, 0x2099, 0x193d, 0x20e9, 0x0000, 0x20a1,
+	0x024e, 0x20a9, 0x0008, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1805,
+	0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1,
+	0x025a, 0x4003, 0x080c, 0x9c11, 0x20a1, 0x024e, 0x20a9, 0x0008,
+	0x2099, 0x1945, 0x4003, 0x60c3, 0x0074, 0x0804, 0x9367, 0x080c,
+	0x8e66, 0x7003, 0x2010, 0x7007, 0x0014, 0x700b, 0x0800, 0x700f,
+	0x2000, 0x9006, 0x00f6, 0x2079, 0x1853, 0x7904, 0x00fe, 0xd1ac,
+	0x1110, 0x9085, 0x0020, 0x0010, 0x9085, 0x0010, 0x9085, 0x0002,
+	0x00d6, 0x0804, 0x8e16, 0x7026, 0x60c3, 0x0014, 0x0804, 0x9367,
+	0x080c, 0x8e66, 0x7003, 0x5000, 0x0804, 0x8cf6, 0x080c, 0x8e66,
+	0x7003, 0x2110, 0x7007, 0x0014, 0x60c3, 0x0014, 0x0804, 0x9367,
+	0x080c, 0x8ea8, 0x0010, 0x080c, 0x8eb1, 0x7003, 0x0200, 0x60c3,
+	0x0004, 0x0804, 0x9367, 0x080c, 0x8eb1, 0x7003, 0x0100, 0x700b,
+	0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0x9367, 0x080c,
+	0x8eb1, 0x7003, 0x0200, 0x0804, 0x8cf6, 0x080c, 0x8eb1, 0x7003,
+	0x0100, 0x782c, 0x9005, 0x0110, 0x700a, 0x0010, 0x700b, 0x0003,
+	0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9367, 0x00d6, 0x080c,
+	0x8eb1, 0x7003, 0x0210, 0x7007, 0x0014, 0x700b, 0x0800, 0xb894,
+	0x9086, 0x0014, 0x1198, 0xb99c, 0x9184, 0x0030, 0x0190, 0xb998,
+	0x9184, 0xc000, 0x1140, 0xd1ec, 0x0118, 0x700f, 0x2100, 0x0058,
+	0x700f, 0x0100, 0x0040, 0x700f, 0x0400, 0x0028, 0x700f, 0x0700,
+	0x0010, 0x700f, 0x0800, 0x00f6, 0x2079, 0x1853, 0x7904, 0x00fe,
+	0xd1ac, 0x1110, 0x9085, 0x0020, 0x0010, 0x9085, 0x0010, 0x2009,
+	0x1875, 0x210c, 0xd184, 0x1110, 0x9085, 0x0002, 0x0026, 0x2009,
+	0x1873, 0x210c, 0xd1e4, 0x0150, 0xc0c5, 0xbabc, 0xd28c, 0x1108,
+	0xc0cd, 0x9094, 0x0030, 0x9296, 0x0010, 0x0140, 0xd1ec, 0x0130,
+	0x9094, 0x0030, 0x9296, 0x0010, 0x0108, 0xc0bd, 0x002e, 0x7026,
+	0x60c3, 0x0014, 0x00de, 0x0804, 0x9367, 0x080c, 0x8eb1, 0x7003,
+	0x0210, 0x7007, 0x0014, 0x700f, 0x0100, 0x60c3, 0x0014, 0x0804,
+	0x9367, 0x080c, 0x8eb1, 0x7003, 0x0200, 0x0804, 0x8c7c, 0x080c,
+	0x8eb1, 0x7003, 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3,
+	0x0008, 0x0804, 0x9367, 0x080c, 0x8eb1, 0x7003, 0x0100, 0x700b,
+	0x000b, 0x60c3, 0x0008, 0x0804, 0x9367, 0x0026, 0x00d6, 0x0036,
+	0x0046, 0x2019, 0x3200, 0x2021, 0x0800, 0x0040, 0x0026, 0x00d6,
+	0x0036, 0x0046, 0x2019, 0x2200, 0x2021, 0x0100, 0x080c, 0x9c26,
+	0xb810, 0x9305, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878,
+	0x700a, 0x687c, 0x700e, 0x9485, 0x0029, 0x7012, 0x004e, 0x003e,
+	0x00de, 0x080c, 0x9355, 0x721a, 0x9f95, 0x0000, 0x7222, 0x7027,
+	0xffff, 0x2071, 0x024c, 0x002e, 0x0005, 0x0026, 0x080c, 0x9c26,
+	0x7003, 0x02ff, 0x7007, 0xfffc, 0x00d6, 0x2069, 0x1800, 0x6878,
+	0x700a, 0x687c, 0x700e, 0x00de, 0x7013, 0x2029, 0x0c10, 0x7003,
+	0x0100, 0x7007, 0x0000, 0x700b, 0xfc02, 0x700f, 0x0000, 0x0005,
+	0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x3300, 0x2021, 0x0800,
+	0x0040, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x2300, 0x2021,
+	0x0100, 0x080c, 0x9c26, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006,
+	0x2069, 0x1800, 0xb810, 0x9005, 0x1140, 0xb814, 0x9005, 0x1128,
+	0x700b, 0x00ff, 0x700f, 0xfffe, 0x0020, 0x6878, 0x700a, 0x687c,
+	0x700e, 0x0000, 0x9485, 0x0098, 0x7012, 0x004e, 0x003e, 0x00de,
+	0x080c, 0x9355, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071,
+	0x024c, 0x002e, 0x0005, 0x080c, 0x9355, 0x721a, 0x7a08, 0x7222,
+	0x7814, 0x7026, 0x2071, 0x024c, 0x002e, 0x0005, 0x00b6, 0x00c6,
+	0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004,
+	0x908a, 0x0085, 0x0a0c, 0x0db4, 0x908a, 0x0092, 0x1a0c, 0x0db4,
+	0x6110, 0x2158, 0xb9b0, 0x2c78, 0x2061, 0x0100, 0x619a, 0x9082,
+	0x0085, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x0005,
+	0x8f1f, 0x8f2e, 0x8f39, 0x8f1d, 0x8f1d, 0x8f1d, 0x8f1f, 0x8f1d,
+	0x8f1d, 0x8f1d, 0x8f1d, 0x8f1d, 0x8f1d, 0x080c, 0x0db4, 0x0411,
+	0x60c3, 0x0000, 0x0026, 0x080c, 0x29ca, 0x0228, 0x2011, 0x0101,
+	0x2204, 0xc0c5, 0x2012, 0x002e, 0x0804, 0x9367, 0x0431, 0x7808,
+	0x700a, 0x7814, 0x700e, 0x7017, 0xffff, 0x60c3, 0x000c, 0x0804,
+	0x9367, 0x0479, 0x7003, 0x0003, 0x7007, 0x0300, 0x60c3, 0x0004,
+	0x0804, 0x9367, 0x0026, 0x080c, 0x9c26, 0xb810, 0x9085, 0x8100,
 	0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, 0x700a, 0x687c,
-	0x700e, 0x7013, 0x0819, 0x080c, 0x9083, 0x721a, 0x2f10, 0x7222,
-	0x7a08, 0x7226, 0x2071, 0x024c, 0x00de, 0x0005, 0x00a9, 0x7914,
-	0x712a, 0x60c3, 0x0000, 0x60a7, 0x9575, 0x0026, 0x080c, 0x2872,
-	0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x080c,
-	0x90b8, 0x080c, 0x7dca, 0x0005, 0x0036, 0x0096, 0x00d6, 0x00e6,
-	0x7858, 0x2048, 0xaa7c, 0x9296, 0x00c0, 0x9294, 0xfffd, 0xaa7e,
-	0xaa80, 0x9294, 0x0300, 0xaa82, 0xa96c, 0x9194, 0x00ff, 0xab74,
-	0x9384, 0x00ff, 0x908d, 0xc200, 0xa96e, 0x9384, 0xff00, 0x9215,
-	0xaa76, 0xa870, 0xaa78, 0xa87a, 0xaa72, 0x00d6, 0x2069, 0x0200,
-	0x080c, 0x98d5, 0x00de, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9,
-	0x000a, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x4003,
-	0x60a3, 0x0035, 0xaa68, 0x9294, 0x7000, 0x9286, 0x3000, 0x0110,
-	0x60a3, 0x0037, 0x00ee, 0x00de, 0x009e, 0x003e, 0x0005, 0x900e,
-	0x7814, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x01c0, 0x9084, 0x0003,
-	0x11a8, 0x2001, 0x180c, 0x2004, 0xd0bc, 0x0180, 0x7824, 0xd0cc,
-	0x1168, 0xd0c4, 0x1158, 0xa8a8, 0x9005, 0x1140, 0x2001, 0x180c,
-	0x200c, 0xc1d5, 0x2102, 0x2009, 0x1981, 0x210c, 0x009e, 0x918d,
-	0x0092, 0x0010, 0x2009, 0x0096, 0x60ab, 0x0036, 0x6116, 0x0005,
-	0x2009, 0x0009, 0x00a0, 0x2009, 0x000a, 0x0088, 0x2009, 0x000b,
-	0x0070, 0x2009, 0x000c, 0x0058, 0x2009, 0x000d, 0x0040, 0x2009,
-	0x000e, 0x0028, 0x2009, 0x000f, 0x0010, 0x2009, 0x0008, 0x6912,
-	0x0005, 0x00d6, 0x9290, 0x0018, 0x8214, 0x20e9, 0x0000, 0x2069,
-	0x0200, 0x6813, 0x0000, 0x22a8, 0x9284, 0x00e0, 0x0128, 0x20a9,
-	0x0020, 0x9292, 0x0020, 0x0008, 0x9016, 0x20a1, 0x0240, 0x9006,
-	0x4004, 0x82ff, 0x0120, 0x6810, 0x8000, 0x6812, 0x0c60, 0x00de,
-	0x0005, 0x00d6, 0x0096, 0x6014, 0x2048, 0xa878, 0x6056, 0x9006,
-	0xa836, 0xa83a, 0xa99c, 0xa946, 0xa84a, 0x6023, 0x0003, 0x6007,
-	0x0040, 0x6003, 0x0003, 0x600b, 0xffff, 0xa817, 0x0001, 0xa842,
-	0xa83e, 0x2900, 0xa85a, 0xa813, 0x1dd4, 0x080c, 0x8171, 0x0126,
-	0x2091, 0x8000, 0x080c, 0x8769, 0x012e, 0x009e, 0x00de, 0x0005,
-	0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x00a6, 0x0096, 0x0066, 0x0126,
-	0x2091, 0x8000, 0x2071, 0x19b6, 0x760c, 0x2660, 0x2678, 0x8cff,
-	0x0904, 0x99a7, 0x7024, 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0,
-	0x9005, 0x0904, 0x997e, 0x080c, 0x90c1, 0x68c3, 0x0000, 0x080c,
-	0x9570, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384,
-	0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x29bc, 0x9006, 0x080c,
-	0x29bc, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001,
-	0x003e, 0x700c, 0x9c36, 0x1110, 0x660c, 0x760e, 0x7008, 0x9c36,
-	0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x700a, 0x0010, 0x700b,
+	0x700e, 0x7013, 0x0009, 0x0804, 0x8e81, 0x0026, 0x080c, 0x9c26,
+	0xb810, 0x9085, 0x8400, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800,
+	0x6878, 0x700a, 0x687c, 0x700e, 0x2001, 0x0099, 0x7012, 0x0804,
+	0x8ee3, 0x0026, 0x080c, 0x9c26, 0xb810, 0x9085, 0x8500, 0x7002,
+	0xb814, 0x7006, 0x2069, 0x1800, 0x6878, 0x700a, 0x687c, 0x700e,
+	0x2001, 0x0099, 0x7012, 0x0804, 0x8ee3, 0x00b6, 0x00c6, 0x00d6,
+	0x00e6, 0x00f6, 0x2c78, 0x2069, 0x0200, 0x2071, 0x0240, 0x7804,
+	0x908a, 0x0040, 0x0a0c, 0x0db4, 0x908a, 0x0054, 0x1a0c, 0x0db4,
+	0x7910, 0x2158, 0xb9b0, 0x2061, 0x0100, 0x619a, 0x9082, 0x0040,
+	0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x0005, 0x8fb4,
+	0x9070, 0x9043, 0x9192, 0x8fb2, 0x8fb2, 0x8fb2, 0x8fb2, 0x8fb2,
+	0x8fb2, 0x8fb2, 0x9774, 0x977c, 0x9784, 0x978c, 0x8fb2, 0x9b6e,
+	0x8fb2, 0x976c, 0x080c, 0x0db4, 0x0096, 0x780b, 0xffff, 0x080c,
+	0x901f, 0x7914, 0x2148, 0xa978, 0x7956, 0xae64, 0x96b4, 0x00ff,
+	0x9686, 0x0008, 0x1148, 0xa8b4, 0x7032, 0xa8b8, 0x7036, 0xa8bc,
+	0x703a, 0xa8c0, 0x703e, 0x0008, 0x7132, 0xa97c, 0x9184, 0x000f,
+	0x1118, 0x2001, 0x0005, 0x0040, 0xd184, 0x0118, 0x2001, 0x0004,
+	0x0018, 0x9084, 0x0006, 0x8004, 0x2010, 0x785c, 0x9084, 0x00ff,
+	0x8007, 0x9205, 0x7042, 0xd1ac, 0x0158, 0x7047, 0x0002, 0x9686,
+	0x0008, 0x1118, 0x080c, 0x1787, 0x0010, 0x080c, 0x1648, 0x0050,
+	0xd1b4, 0x0118, 0x7047, 0x0001, 0x0028, 0x7047, 0x0000, 0x9016,
+	0x2230, 0x0010, 0xaab0, 0xaeac, 0x726a, 0x766e, 0x20a9, 0x0008,
+	0x20e9, 0x0000, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0023, 0x2098,
+	0x20a1, 0x0252, 0x2069, 0x0200, 0x6813, 0x0018, 0x4003, 0x6813,
+	0x0008, 0x60c3, 0x0020, 0x6017, 0x0009, 0x2001, 0x19d4, 0x2003,
+	0x07d0, 0x2001, 0x19d3, 0x2003, 0x0009, 0x009e, 0x0005, 0x6813,
+	0x0008, 0xba8c, 0x8210, 0xb8bc, 0xd084, 0x0128, 0x7a46, 0x7b14,
+	0x7b4a, 0x722e, 0x732a, 0x9294, 0x00ff, 0xba8e, 0x8217, 0x721a,
+	0xba10, 0x9295, 0x0600, 0x7202, 0xba14, 0x7206, 0x2069, 0x1800,
+	0x6a78, 0x720a, 0x6a7c, 0x720e, 0x7013, 0x0829, 0x2f10, 0x7222,
+	0x7027, 0xffff, 0x0005, 0x00d6, 0x0096, 0x0081, 0x7814, 0x2048,
+	0xa890, 0x7002, 0xa88c, 0x7006, 0xa8b0, 0x700a, 0xa8ac, 0x700e,
+	0x60c3, 0x000c, 0x009e, 0x00de, 0x0804, 0x9367, 0x6813, 0x0008,
+	0xb810, 0x9085, 0x0500, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800,
+	0x6878, 0x700a, 0x687c, 0x700e, 0x7013, 0x0889, 0x080c, 0x9355,
+	0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071, 0x024c, 0x0005,
+	0x00d6, 0x0096, 0x080c, 0x9170, 0x7814, 0x2048, 0x080c, 0xbafc,
+	0x1130, 0x7814, 0x9084, 0x0700, 0x8007, 0x0033, 0x0010, 0x9006,
+	0x001b, 0x009e, 0x00de, 0x0005, 0x908e, 0x90f7, 0x9107, 0x912d,
+	0x9139, 0x914a, 0x9152, 0x908c, 0x080c, 0x0db4, 0x0016, 0x0036,
+	0xa97c, 0x918c, 0x0003, 0x0118, 0x9186, 0x0003, 0x1198, 0xaba8,
+	0x7824, 0xd0cc, 0x1168, 0x7316, 0xa898, 0x701a, 0xa894, 0x701e,
+	0x003e, 0x001e, 0x2001, 0x1982, 0x2004, 0x60c2, 0x0804, 0x9367,
+	0xc3e5, 0x0c88, 0x9186, 0x0001, 0x190c, 0x0db4, 0xaba8, 0x7824,
+	0xd0cc, 0x1904, 0x90f4, 0x7316, 0xa898, 0x701a, 0xa894, 0x701e,
+	0xa8a4, 0x7026, 0xa8ac, 0x702e, 0x2009, 0x0018, 0x9384, 0x0300,
+	0x0570, 0xd3c4, 0x0110, 0xa8ac, 0x9108, 0xd3cc, 0x0110, 0xa8a4,
+	0x9108, 0x6810, 0x9085, 0x0010, 0x6812, 0x2011, 0x0258, 0x20e9,
+	0x0000, 0x22a0, 0x0156, 0x20a9, 0x0008, 0xa860, 0x20e0, 0xa85c,
+	0x9080, 0x002c, 0x2098, 0x4003, 0x6810, 0x8000, 0x6812, 0x2011,
+	0x0240, 0x22a0, 0x20a9, 0x0005, 0x4003, 0x6810, 0xc084, 0x6812,
+	0x015e, 0x9184, 0x0003, 0x0118, 0x2019, 0x0245, 0x201a, 0x61c2,
+	0x003e, 0x001e, 0x0804, 0x9367, 0xc3e5, 0x0804, 0x90b3, 0x2011,
+	0x0008, 0x2001, 0x180f, 0x2004, 0xd0a4, 0x0110, 0x2011, 0x0028,
+	0x7824, 0xd0cc, 0x1110, 0x7216, 0x0470, 0x0ce8, 0xc2e5, 0x2011,
+	0x0302, 0x0016, 0x782c, 0x701a, 0x7930, 0x711e, 0x9105, 0x0108,
+	0xc2dd, 0x001e, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, 0x7027,
+	0x0012, 0x702f, 0x0008, 0x7043, 0x7000, 0x7047, 0x0500, 0x704f,
+	0x000a, 0x2069, 0x0200, 0x6813, 0x0009, 0x2071, 0x0240, 0x700b,
+	0x2500, 0x60c3, 0x0032, 0x0804, 0x9367, 0x2011, 0x0028, 0x7824,
+	0xd0cc, 0x1128, 0x7216, 0x60c3, 0x0018, 0x0804, 0x9367, 0x0cd0,
+	0xc2e5, 0x2011, 0x0100, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216,
+	0x702f, 0x0008, 0x7858, 0x9084, 0x00ff, 0x7036, 0x60c3, 0x0020,
+	0x0804, 0x9367, 0x2011, 0x0008, 0x7824, 0xd0cc, 0x0108, 0xc2e5,
+	0x7216, 0x0c08, 0x0036, 0x7b14, 0x9384, 0xff00, 0x7816, 0x9384,
+	0x00ff, 0x8001, 0x1138, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216,
+	0x003e, 0x0888, 0x0046, 0x2021, 0x0800, 0x0006, 0x7824, 0xd0cc,
+	0x000e, 0x0108, 0xc4e5, 0x7416, 0x004e, 0x701e, 0x003e, 0x0818,
+	0x00d6, 0x6813, 0x0008, 0xb810, 0x9085, 0x0700, 0x7002, 0xb814,
+	0x7006, 0x2069, 0x1800, 0x6878, 0x700a, 0x687c, 0x700e, 0x7824,
+	0xd0cc, 0x1168, 0x7013, 0x0898, 0x080c, 0x9355, 0x721a, 0x7a08,
+	0x7222, 0x2f10, 0x7226, 0x2071, 0x024c, 0x00de, 0x0005, 0x7013,
+	0x0889, 0x0c90, 0x0016, 0x7814, 0x9084, 0x0700, 0x8007, 0x0013,
+	0x001e, 0x0005, 0x91a2, 0x91a2, 0x91a4, 0x91a2, 0x91a2, 0x91a2,
+	0x91be, 0x91a2, 0x080c, 0x0db4, 0x7914, 0x918c, 0x08ff, 0x918d,
+	0xf600, 0x7916, 0x2009, 0x0003, 0x00b9, 0x2069, 0x1853, 0x6804,
+	0xd0bc, 0x0130, 0x682c, 0x9084, 0x00ff, 0x8007, 0x7032, 0x0010,
+	0x7033, 0x3f00, 0x60c3, 0x0001, 0x0804, 0x9367, 0x2009, 0x0003,
+	0x0019, 0x7033, 0x7f00, 0x0cb0, 0x0016, 0x080c, 0x9c26, 0x001e,
+	0xb810, 0x9085, 0x0100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800,
+	0x6a78, 0x720a, 0x6a7c, 0x720e, 0x7013, 0x0888, 0x918d, 0x0008,
+	0x7116, 0x080c, 0x9355, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226,
+	0x0005, 0x00b6, 0x0096, 0x00e6, 0x00d6, 0x00c6, 0x0056, 0x0046,
+	0x0036, 0x2061, 0x0100, 0x2071, 0x1800, 0x7810, 0x2058, 0xb8a0,
+	0x2028, 0xb910, 0xba14, 0x7378, 0x747c, 0x7820, 0x90be, 0x0006,
+	0x0904, 0x92c4, 0x90be, 0x000a, 0x1904, 0x9280, 0x609f, 0x0000,
+	0x7814, 0x2048, 0xa87c, 0xd0fc, 0x05d0, 0xaf90, 0x9784, 0xff00,
+	0x9105, 0x6062, 0x873f, 0x9784, 0xff00, 0x0006, 0x7814, 0x2048,
+	0xa878, 0xc0fc, 0x9005, 0x000e, 0x1160, 0xaf94, 0x87ff, 0x0510,
+	0x2039, 0x0098, 0x9705, 0x6072, 0x7808, 0x6082, 0x2f00, 0x6086,
+	0x0038, 0x9185, 0x2200, 0x6062, 0x6073, 0x0129, 0x6077, 0x0000,
+	0x609f, 0x0000, 0x2001, 0x1836, 0x2004, 0xd0ac, 0x11a8, 0xd09c,
+	0x0130, 0x7814, 0x2048, 0xa874, 0x9082, 0x0080, 0x1268, 0xb814,
+	0x609e, 0x0050, 0x2039, 0x0029, 0x9705, 0x6072, 0x0c48, 0x9185,
+	0x0200, 0x6062, 0x6073, 0x2029, 0xa87c, 0xd0fc, 0x0118, 0xaf94,
+	0x87ff, 0x1120, 0x2f00, 0x6082, 0x7808, 0x6086, 0x6266, 0x636a,
+	0x646e, 0x6077, 0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e,
+	0x8007, 0x607a, 0x607f, 0x0000, 0xa838, 0x608a, 0xa834, 0x608e,
+	0xa848, 0x60c6, 0xa844, 0x60ca, 0xb86c, 0x60ce, 0x60af, 0x95d5,
+	0x60d7, 0x0000, 0x080c, 0x9c0b, 0x2009, 0x07d0, 0x60c4, 0x9084,
+	0xfff0, 0x9005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x8095, 0x003e,
+	0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x009e, 0x00be, 0x0005,
+	0x7804, 0x9086, 0x0040, 0x0904, 0x9300, 0x9185, 0x0100, 0x6062,
+	0x6266, 0x636a, 0x646e, 0x6073, 0x0809, 0x6077, 0x0008, 0x60af,
+	0x95d5, 0x60d7, 0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e,
+	0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6082, 0x7808, 0x6086,
+	0x7814, 0x2048, 0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6,
+	0xa844, 0x60ca, 0xb86c, 0x60ce, 0xbab0, 0x629e, 0x080c, 0x9c0b,
+	0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110, 0x2009,
+	0x1b58, 0x080c, 0x8095, 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de,
+	0x00ee, 0x009e, 0x00be, 0x0005, 0x7814, 0x2048, 0xa87c, 0x9084,
+	0x0003, 0x9086, 0x0002, 0x0904, 0x931c, 0x9185, 0x0100, 0x6062,
+	0x6266, 0x636a, 0x646e, 0x6073, 0x0880, 0x6077, 0x0008, 0xb88c,
+	0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a, 0x7838, 0x607e,
+	0x2f00, 0x6086, 0x7808, 0x6082, 0xa890, 0x608a, 0xa88c, 0x608e,
+	0xa8b0, 0x60c6, 0xa8ac, 0x60ca, 0xa8ac, 0x7930, 0x9108, 0x7932,
+	0xa8b0, 0x792c, 0x9109, 0x792e, 0xb86c, 0x60ce, 0x60af, 0x95d5,
+	0x60d7, 0x0000, 0xbab0, 0x629e, 0x080c, 0x9be8, 0x0804, 0x92b0,
+	0xb8bc, 0xd084, 0x0148, 0xb88c, 0x7814, 0x2048, 0xb88c, 0x7846,
+	0xa836, 0x2900, 0xa83a, 0xb04a, 0x9185, 0x0600, 0x6062, 0x6266,
+	0x636a, 0x646e, 0x6073, 0x0829, 0x6077, 0x0000, 0x60af, 0x9575,
+	0x60d7, 0x0000, 0x0804, 0x9293, 0x9185, 0x0700, 0x6062, 0x6266,
+	0x636a, 0x646e, 0x7824, 0xd0cc, 0x7826, 0x0118, 0x6073, 0x0889,
+	0x0010, 0x6073, 0x0898, 0x6077, 0x0000, 0xb88c, 0x8000, 0x9084,
+	0x00ff, 0xb88e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086,
+	0x7808, 0x6082, 0xa838, 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6,
+	0xa844, 0x60ca, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000,
+	0xbab0, 0x629e, 0x7824, 0xd0cc, 0x0120, 0x080c, 0x9c0b, 0x0804,
+	0x92b0, 0x080c, 0x9be8, 0x0804, 0x92b0, 0x7a10, 0x00b6, 0x2258,
+	0xba8c, 0x8210, 0x9294, 0x00ff, 0xba8e, 0x00be, 0x8217, 0x0005,
+	0x00d6, 0x2069, 0x19b8, 0x6843, 0x0001, 0x00de, 0x0005, 0x60a3,
+	0x0056, 0x60a7, 0x9575, 0x00f1, 0x080c, 0x8087, 0x0005, 0x0016,
+	0x2001, 0x180c, 0x200c, 0x9184, 0x0600, 0x9086, 0x0600, 0x0128,
+	0x0089, 0x080c, 0x8087, 0x001e, 0x0005, 0xc1e5, 0x2001, 0x180c,
+	0x2102, 0x2001, 0x19b9, 0x2003, 0x0000, 0x2001, 0x19c1, 0x2003,
+	0x0000, 0x0c88, 0x0006, 0x6014, 0x9084, 0x1804, 0x9085, 0x0009,
+	0x6016, 0x000e, 0x0005, 0x0016, 0x00c6, 0x0006, 0x2061, 0x0100,
+	0x61a4, 0x60a7, 0x95f5, 0x6014, 0x9084, 0x1804, 0x9085, 0x0008,
+	0x6016, 0x000e, 0xa001, 0xa001, 0xa001, 0x61a6, 0x00ce, 0x001e,
+	0x0005, 0x00c6, 0x00d6, 0x0016, 0x0026, 0x2061, 0x0100, 0x2069,
+	0x0140, 0x080c, 0x6fa7, 0x11e8, 0x2001, 0x19d4, 0x2004, 0x9005,
+	0x1904, 0x93f9, 0x0066, 0x2031, 0x0001, 0x080c, 0x7057, 0x006e,
+	0x1160, 0x2061, 0x0100, 0x6020, 0xd0b4, 0x1120, 0x6024, 0xd084,
+	0x090c, 0x0db4, 0x080c, 0x8087, 0x0460, 0x00c6, 0x2061, 0x19b8,
+	0x00d0, 0x6904, 0x9194, 0x4000, 0x0548, 0x080c, 0x9393, 0x080c,
+	0x2b24, 0x00c6, 0x2061, 0x19b8, 0x6128, 0x9192, 0x0008, 0x1258,
+	0x8108, 0x612a, 0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c, 0x8087,
+	0x080c, 0x938a, 0x0070, 0x6124, 0x91e5, 0x0000, 0x0140, 0x080c,
+	0xd8a9, 0x080c, 0x8090, 0x2009, 0x0014, 0x080c, 0x9e93, 0x00ce,
+	0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, 0x19d4,
+	0x2004, 0x9005, 0x1db0, 0x00c6, 0x2061, 0x19b8, 0x6128, 0x9192,
+	0x0003, 0x1e08, 0x8108, 0x612a, 0x00ce, 0x080c, 0x8087, 0x080c,
+	0x5b89, 0x2009, 0x1852, 0x2114, 0x8210, 0x220a, 0x0c10, 0x0096,
+	0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026, 0x080c, 0x809d, 0x2071,
+	0x19b8, 0x713c, 0x81ff, 0x0904, 0x9489, 0x2061, 0x0100, 0x2069,
+	0x0140, 0x080c, 0x6fa7, 0x11b0, 0x0036, 0x2019, 0x0002, 0x080c,
+	0x96bf, 0x003e, 0x713c, 0x2160, 0x080c, 0xd8a9, 0x2009, 0x004a,
+	0x080c, 0x9e93, 0x0066, 0x2031, 0x0001, 0x080c, 0x7057, 0x006e,
+	0x0804, 0x9489, 0x080c, 0x9495, 0x0904, 0x9489, 0x6904, 0xd1f4,
+	0x0904, 0x9490, 0x080c, 0x2b24, 0x00c6, 0x703c, 0x9065, 0x090c,
+	0x0db4, 0x6020, 0x00ce, 0x9086, 0x0006, 0x1528, 0x61c8, 0x60c4,
+	0x9105, 0x1508, 0x2009, 0x180c, 0x2104, 0xd0d4, 0x01e0, 0x6214,
+	0x9294, 0x1800, 0x1128, 0x6224, 0x9294, 0x0002, 0x1510, 0x0030,
+	0xc0d4, 0x200a, 0xd0cc, 0x0110, 0x080c, 0x2a77, 0x6014, 0x9084,
+	0xe7fd, 0x9085, 0x0010, 0x6016, 0x703c, 0x2060, 0x2009, 0x0049,
+	0x080c, 0x9e93, 0x0070, 0x0036, 0x2019, 0x0001, 0x080c, 0x96bf,
+	0x003e, 0x713c, 0x2160, 0x080c, 0xd8a9, 0x2009, 0x004a, 0x080c,
+	0x9e93, 0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x009e, 0x0005,
+	0xd1ec, 0x1904, 0x944a, 0x0804, 0x944c, 0x00d6, 0x00c6, 0x0096,
+	0x703c, 0x9065, 0x090c, 0x0db4, 0x2001, 0x1836, 0x2004, 0xd09c,
+	0x1904, 0x9521, 0x2001, 0x0306, 0x200c, 0x9184, 0x0030, 0x0904,
+	0x9521, 0x9184, 0x0048, 0x9086, 0x0008, 0x1904, 0x9521, 0x2001,
+	0x020b, 0x2004, 0xd0fc, 0x0904, 0x9521, 0xd08c, 0x0904, 0x9521,
+	0x2009, 0x1a50, 0x2104, 0x8000, 0x0208, 0x200a, 0x2069, 0x0100,
+	0x6914, 0x918c, 0x0184, 0x918d, 0x0010, 0x6916, 0x69c8, 0x2011,
+	0x0020, 0x68c8, 0x9106, 0x1570, 0x8211, 0x1dd8, 0x2001, 0x0306,
+	0x2003, 0x4800, 0x2001, 0x009a, 0x2003, 0x0004, 0x2001, 0x1a36,
+	0x2003, 0x0000, 0x2001, 0x1a3f, 0x2003, 0x0000, 0x6a88, 0x698c,
+	0x2200, 0x9105, 0x1120, 0x2c10, 0x080c, 0x1a5c, 0x0040, 0x6014,
+	0x2048, 0xaa3a, 0xa936, 0x6ac4, 0x69c8, 0xa946, 0xaa4a, 0x0126,
+	0x00c6, 0x2091, 0x2400, 0x002e, 0x080c, 0x1ae8, 0x190c, 0x0db4,
+	0x012e, 0x0090, 0x2009, 0x1a51, 0x2104, 0x8000, 0x0208, 0x200a,
+	0x69c8, 0x2011, 0x0020, 0x8211, 0x1df0, 0x68c8, 0x9106, 0x1dc0,
+	0x69c4, 0x68c8, 0x9105, 0x0160, 0x6824, 0xd08c, 0x0110, 0x6827,
+	0x0002, 0x7048, 0xc085, 0x704a, 0x0079, 0x7048, 0xc084, 0x704a,
+	0x2009, 0x07d0, 0x080c, 0x8095, 0x9006, 0x009e, 0x00ce, 0x00de,
+	0x0005, 0x9085, 0x0001, 0x0cc8, 0x0026, 0x00e6, 0x2071, 0x19b8,
+	0x7048, 0xd084, 0x01c0, 0x713c, 0x81ff, 0x01a8, 0x2071, 0x0100,
+	0x9188, 0x0008, 0x2114, 0x928e, 0x0006, 0x1138, 0x7014, 0x9084,
+	0x1984, 0x9085, 0x0012, 0x7016, 0x0030, 0x7014, 0x9084, 0x1984,
+	0x9085, 0x0016, 0x7016, 0x00ee, 0x002e, 0x0005, 0x00b6, 0x00e6,
+	0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, 0x0006, 0x0126, 0x2091,
+	0x8000, 0x6010, 0x2058, 0xbca0, 0x2071, 0x19b8, 0x7018, 0x2058,
+	0x8bff, 0x0190, 0xb8a0, 0x9406, 0x0118, 0xb854, 0x2058, 0x0cc0,
+	0x6014, 0x0096, 0x2048, 0xac6c, 0xad70, 0xae78, 0x009e, 0x080c,
+	0x6369, 0x0110, 0x9085, 0x0001, 0x012e, 0x000e, 0x004e, 0x005e,
+	0x006e, 0x00ce, 0x00de, 0x00ee, 0x00be, 0x0005, 0x080c, 0x8e66,
+	0x7003, 0x1200, 0x7838, 0x7012, 0x783c, 0x7016, 0x00c6, 0x7820,
+	0x9086, 0x0004, 0x1148, 0x7810, 0x9005, 0x0130, 0x00b6, 0x2058,
+	0xb810, 0xb914, 0x00be, 0x0020, 0x2061, 0x1800, 0x6078, 0x617c,
+	0x9084, 0x00ff, 0x700a, 0x710e, 0x00ce, 0x60c3, 0x002c, 0x0804,
+	0x9367, 0x080c, 0x8e66, 0x7003, 0x0f00, 0x7808, 0xd09c, 0x0128,
+	0xb810, 0x9084, 0x00ff, 0x700a, 0xb814, 0x700e, 0x60c3, 0x0008,
+	0x0804, 0x9367, 0x0156, 0x080c, 0x8eb1, 0x7003, 0x0200, 0x2011,
+	0x1848, 0x63f0, 0x2312, 0x20a9, 0x0006, 0x2011, 0x1840, 0x2019,
+	0x1841, 0x9ef0, 0x0002, 0x2376, 0x8e70, 0x2276, 0x8e70, 0x9398,
+	0x0002, 0x9290, 0x0002, 0x1f04, 0x95bb, 0x60c3, 0x001c, 0x015e,
+	0x0804, 0x9367, 0x0016, 0x0026, 0x080c, 0x8e8d, 0x080c, 0x8e9f,
+	0x9e80, 0x0004, 0x20e9, 0x0000, 0x20a0, 0x7814, 0x0096, 0x2048,
+	0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098,
+	0x009e, 0x7808, 0x9088, 0x0002, 0x21a8, 0x9192, 0x0010, 0x1250,
+	0x4003, 0x9080, 0x0004, 0x8003, 0x60c2, 0x080c, 0x9367, 0x002e,
+	0x001e, 0x0005, 0x20a9, 0x0010, 0x4003, 0x080c, 0x9c11, 0x20a1,
+	0x0240, 0x22a8, 0x4003, 0x0c68, 0x080c, 0x8e66, 0x7003, 0x6200,
+	0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9367, 0x0016, 0x0026,
+	0x080c, 0x8e66, 0x20e9, 0x0000, 0x20a1, 0x024c, 0x7814, 0x0096,
+	0x2048, 0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0023,
+	0x2098, 0x009e, 0x7808, 0x9088, 0x0002, 0x21a8, 0x4003, 0x8003,
+	0x60c2, 0x080c, 0x9367, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00c6,
+	0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b8, 0x700c, 0x2060,
+	0x8cff, 0x0178, 0x080c, 0xbd04, 0x1110, 0x080c, 0xa7a7, 0x600c,
+	0x0006, 0x080c, 0xbf6b, 0x080c, 0x9e19, 0x080c, 0x9797, 0x00ce,
+	0x0c78, 0x2c00, 0x700e, 0x700a, 0x012e, 0x000e, 0x00ce, 0x00ee,
+	0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066,
+	0x0026, 0x0016, 0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c,
+	0x918c, 0xe7ff, 0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071,
+	0x19b8, 0x7024, 0x2060, 0x8cff, 0x01f8, 0x080c, 0x9393, 0x6ac0,
+	0x68c3, 0x0000, 0x080c, 0x8090, 0x00c6, 0x2061, 0x0100, 0x080c,
+	0x9c2a, 0x00ce, 0x20a9, 0x01f4, 0x0461, 0x2009, 0x0013, 0x080c,
+	0x9e93, 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee,
+	0x00fe, 0x015e, 0x012e, 0x0005, 0x2001, 0x1800, 0x2004, 0x9096,
+	0x0001, 0x0d78, 0x9096, 0x0004, 0x0d60, 0x080c, 0x8090, 0x6814,
+	0x9084, 0x0001, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3,
+	0x0000, 0x2011, 0x5b33, 0x080c, 0x8010, 0x20a9, 0x01f4, 0x0009,
+	0x08c0, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, 0x7804, 0x9084,
+	0x4000, 0x190c, 0x2b24, 0x0090, 0xd084, 0x0118, 0x6827, 0x0001,
+	0x0010, 0x1f04, 0x96a1, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001,
+	0x0100, 0x080c, 0x2b14, 0x9006, 0x080c, 0x2b14, 0x0005, 0x0126,
+	0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0016,
+	0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, 0xdbff,
+	0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x19b8, 0x703c,
+	0x2060, 0x8cff, 0x0904, 0x974d, 0x9386, 0x0002, 0x1128, 0x6814,
+	0x9084, 0x0002, 0x0904, 0x974d, 0x68af, 0x95f5, 0x6817, 0x0010,
+	0x2009, 0x00fa, 0x8109, 0x1df0, 0x69c6, 0x68cb, 0x0008, 0x080c,
+	0x809d, 0x080c, 0x1e90, 0x0046, 0x2009, 0x00a5, 0x080c, 0x0e2f,
+	0x2021, 0x0169, 0x2404, 0x9084, 0x000f, 0x9086, 0x0004, 0x11f8,
+	0x68af, 0x95f5, 0x68c6, 0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079,
+	0x0090, 0x2071, 0x1a36, 0x6814, 0x9084, 0x1984, 0x9085, 0x0012,
+	0x6816, 0x782b, 0x0008, 0x7003, 0x0000, 0x00fe, 0x00ee, 0x9386,
+	0x0002, 0x1128, 0x7884, 0x9005, 0x1110, 0x7887, 0x0001, 0x2001,
+	0x1952, 0x200c, 0x080c, 0x0e2f, 0x004e, 0x20a9, 0x03e8, 0x6824,
+	0xd094, 0x0140, 0x6827, 0x0004, 0x7804, 0x9084, 0x4000, 0x190c,
+	0x2b24, 0x0090, 0xd08c, 0x0118, 0x6827, 0x0002, 0x0010, 0x1f04,
+	0x9727, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c,
+	0x2b14, 0x9006, 0x080c, 0x2b14, 0x6827, 0x4000, 0x6824, 0x83ff,
+	0x1120, 0x2009, 0x0049, 0x080c, 0x9e93, 0x000e, 0x001e, 0x002e,
+	0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005,
+	0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0x19b8, 0x6a06, 0x012e,
+	0x00de, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0x19b8,
+	0x6a32, 0x012e, 0x00de, 0x0005, 0x080c, 0x901f, 0x7854, 0x7032,
+	0x7042, 0x7047, 0x1000, 0x00f8, 0x080c, 0x901f, 0x7854, 0x7032,
+	0x7042, 0x7047, 0x4000, 0x00b8, 0x080c, 0x901f, 0x7854, 0x7032,
+	0x7042, 0x7047, 0x2000, 0x0078, 0x080c, 0x901f, 0x7854, 0x7032,
+	0x7042, 0x7047, 0x0400, 0x0038, 0x080c, 0x901f, 0x7854, 0x7032,
+	0x7042, 0x7047, 0x0200, 0x60c3, 0x0020, 0x0804, 0x9367, 0x00e6,
+	0x2071, 0x19b8, 0x7020, 0x9005, 0x0110, 0x8001, 0x7022, 0x00ee,
+	0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006,
+	0x0126, 0x2091, 0x8000, 0x2071, 0x19b8, 0x7614, 0x2660, 0x2678,
+	0x2039, 0x0001, 0x87ff, 0x0904, 0x983c, 0x8cff, 0x0904, 0x983c,
+	0x6020, 0x9086, 0x0006, 0x1904, 0x9837, 0x88ff, 0x0138, 0x2800,
+	0x9c06, 0x1904, 0x9837, 0x2039, 0x0000, 0x0050, 0x6010, 0x9b06,
+	0x1904, 0x9837, 0x85ff, 0x0120, 0x6054, 0x9106, 0x1904, 0x9837,
+	0x7024, 0x9c06, 0x15b0, 0x2069, 0x0100, 0x68c0, 0x9005, 0x1160,
+	0x6824, 0xd084, 0x0148, 0x6827, 0x0001, 0x080c, 0x8090, 0x080c,
+	0x98c1, 0x7027, 0x0000, 0x0428, 0x080c, 0x8090, 0x6820, 0xd0b4,
+	0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x080c,
+	0x98c1, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384,
+	0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2b14, 0x9006, 0x080c,
+	0x2b14, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001,
+	0x003e, 0x7014, 0x9c36, 0x1110, 0x660c, 0x7616, 0x7010, 0x9c36,
+	0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013,
 	0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008,
-	0x2678, 0x600f, 0x0000, 0x080c, 0xb981, 0x1158, 0x080c, 0x2ea4,
-	0x080c, 0xb992, 0x11f0, 0x080c, 0xa456, 0x00d8, 0x080c, 0x9570,
-	0x08c0, 0x080c, 0xb992, 0x1118, 0x080c, 0xa456, 0x0090, 0x6014,
-	0x2048, 0x080c, 0xb791, 0x0168, 0x6020, 0x9086, 0x0003, 0x1520,
-	0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x65f2, 0x080c,
-	0xb975, 0x080c, 0xbbf9, 0x080c, 0x9af8, 0x080c, 0x9446, 0x00ce,
-	0x0804, 0x992f, 0x2c78, 0x600c, 0x2060, 0x0804, 0x992f, 0x700f,
-	0x0000, 0x700b, 0x0000, 0x012e, 0x006e, 0x009e, 0x00ae, 0x00ce,
-	0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020, 0x9086, 0x0006, 0x1d08,
-	0x080c, 0xd133, 0x08f0, 0x00d6, 0x0156, 0x080c, 0x8bf4, 0x7a14,
-	0x82ff, 0x0138, 0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008,
-	0x0490, 0x7003, 0x0200, 0x7007, 0x0000, 0x2069, 0x1800, 0x901e,
-	0x6800, 0x9086, 0x0004, 0x1110, 0xc38d, 0x0060, 0x080c, 0x6d14,
-	0x1110, 0xc3ad, 0x0008, 0xc3a5, 0x6ad8, 0xd29c, 0x1110, 0xd2ac,
-	0x0108, 0xc39d, 0x730e, 0x2011, 0x1848, 0x63f0, 0x2312, 0x20a9,
-	0x0006, 0x2011, 0x1840, 0x2019, 0x1841, 0x2071, 0x0250, 0x2376,
-	0x8e70, 0x2276, 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002, 0x1f04,
-	0x99ef, 0x60c3, 0x0020, 0x080c, 0x9095, 0x015e, 0x00de, 0x0005,
-	0x0156, 0x080c, 0x8bf4, 0x7a14, 0x82ff, 0x0168, 0x9286, 0xffff,
-	0x0118, 0x9282, 0x000e, 0x1238, 0x7003, 0x0100, 0x700b, 0x0003,
-	0x60c3, 0x0008, 0x0488, 0x7003, 0x0200, 0x7007, 0x001c, 0x700f,
-	0x0001, 0x2011, 0x198c, 0x2204, 0x8007, 0x701a, 0x8210, 0x2204,
-	0x8007, 0x701e, 0x0421, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248,
-	0x2001, 0x181e, 0x2004, 0x7022, 0x2001, 0x181f, 0x2004, 0x7026,
-	0x0030, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x7026, 0x20a9,
-	0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1,
-	0x0256, 0x4003, 0x60c3, 0x001c, 0x015e, 0x0804, 0x9095, 0x0006,
-	0x2001, 0x1836, 0x2004, 0xd0ac, 0x000e, 0x0005, 0x2011, 0x0003,
-	0x080c, 0x93f3, 0x2011, 0x0002, 0x080c, 0x93fd, 0x080c, 0x92e4,
-	0x0036, 0x901e, 0x080c, 0x935a, 0x003e, 0x0005, 0x2071, 0x1883,
-	0x7000, 0x9005, 0x0140, 0x2001, 0x0976, 0x2071, 0x1800, 0x7072,
-	0x7076, 0x7067, 0xffe0, 0x2071, 0x1800, 0x7070, 0x7052, 0x7057,
-	0x1cd0, 0x0005, 0x00e6, 0x0126, 0x2071, 0x1800, 0x2091, 0x8000,
-	0x7550, 0x9582, 0x0010, 0x0608, 0x7054, 0x2060, 0x6000, 0x9086,
-	0x0000, 0x0148, 0x9ce0, 0x0018, 0x7064, 0x9c02, 0x1208, 0x0cb0,
-	0x2061, 0x1cd0, 0x0c98, 0x6003, 0x0008, 0x8529, 0x7552, 0x9ca8,
-	0x0018, 0x7064, 0x9502, 0x1230, 0x7556, 0x9085, 0x0001, 0x012e,
-	0x00ee, 0x0005, 0x7057, 0x1cd0, 0x0cc0, 0x9006, 0x0cc0, 0x00e6,
-	0x2071, 0x1800, 0x7550, 0x9582, 0x0010, 0x0600, 0x7054, 0x2060,
-	0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7064, 0x9c02,
-	0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, 0x0008, 0x8529,
-	0x7552, 0x9ca8, 0x0018, 0x7064, 0x9502, 0x1228, 0x7556, 0x9085,
-	0x0001, 0x00ee, 0x0005, 0x7057, 0x1cd0, 0x0cc8, 0x9006, 0x0cc8,
-	0x9c82, 0x1cd0, 0x0a0c, 0x0db4, 0x2001, 0x1819, 0x2004, 0x9c02,
-	0x1a0c, 0x0db4, 0x9006, 0x6006, 0x600a, 0x600e, 0x6016, 0x601a,
-	0x6012, 0x6023, 0x0000, 0x6003, 0x0000, 0x601e, 0x6056, 0x605a,
-	0x6026, 0x602a, 0x602e, 0x6032, 0x6036, 0x603a, 0x603e, 0x6042,
-	0x2061, 0x1800, 0x6050, 0x8000, 0x6052, 0x9086, 0x0001, 0x0108,
-	0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x868e, 0x012e, 0x0cc0,
-	0x0006, 0x6000, 0x9086, 0x0000, 0x01b0, 0x601c, 0xd084, 0x190c,
-	0x185b, 0x6017, 0x0000, 0x6023, 0x0007, 0x2001, 0x1955, 0x2004,
-	0x0006, 0x9082, 0x0051, 0x000e, 0x0208, 0x8004, 0x601a, 0x080c,
-	0xd3e0, 0x6043, 0x0000, 0x000e, 0x0005, 0x00e6, 0x0126, 0x2071,
-	0x1800, 0x2091, 0x8000, 0x7550, 0x9582, 0x0001, 0x0608, 0x7054,
+	0x2678, 0x89ff, 0x1168, 0x600f, 0x0000, 0x6014, 0x0096, 0x2048,
+	0x080c, 0xbafc, 0x0110, 0x080c, 0xd4b5, 0x009e, 0x080c, 0x9e49,
+	0x080c, 0x9797, 0x88ff, 0x1190, 0x00ce, 0x0804, 0x97b2, 0x2c78,
+	0x600c, 0x2060, 0x0804, 0x97b2, 0x9006, 0x012e, 0x000e, 0x006e,
+	0x007e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000,
+	0x00ce, 0x98c5, 0x0001, 0x0c88, 0x00f6, 0x00e6, 0x00d6, 0x0096,
+	0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071,
+	0x19b8, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0904, 0x98b0, 0x6020,
+	0x9086, 0x0006, 0x1904, 0x98ab, 0x87ff, 0x0128, 0x2700, 0x9c06,
+	0x1904, 0x98ab, 0x0040, 0x6010, 0x9b06, 0x15e8, 0x85ff, 0x0118,
+	0x6054, 0x9106, 0x15c0, 0x703c, 0x9c06, 0x1168, 0x0036, 0x2019,
+	0x0001, 0x080c, 0x96bf, 0x7033, 0x0000, 0x9006, 0x703e, 0x7042,
+	0x7046, 0x704a, 0x003e, 0x7038, 0x9c36, 0x1110, 0x660c, 0x763a,
+	0x7034, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7036,
+	0x0010, 0x7037, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110,
+	0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x6014, 0x2048, 0x080c,
+	0xbafc, 0x0110, 0x080c, 0xd4b5, 0x080c, 0x9e49, 0x87ff, 0x1198,
+	0x00ce, 0x0804, 0x985c, 0x2c78, 0x600c, 0x2060, 0x0804, 0x985c,
+	0x9006, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x009e, 0x00de,
+	0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x97bd, 0x0001,
+	0x0c80, 0x00e6, 0x2071, 0x19b8, 0x2001, 0x1800, 0x2004, 0x9086,
+	0x0002, 0x1118, 0x7007, 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee,
+	0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126,
+	0x2091, 0x8000, 0x2071, 0x19b8, 0x2c10, 0x7638, 0x2660, 0x2678,
+	0x8cff, 0x0518, 0x2200, 0x9c06, 0x11e0, 0x7038, 0x9c36, 0x1110,
+	0x660c, 0x763a, 0x7034, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118,
+	0x2f00, 0x7036, 0x0010, 0x7037, 0x0000, 0x660c, 0x2c00, 0x9f06,
+	0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x9085, 0x0001,
+	0x0020, 0x2c78, 0x600c, 0x2060, 0x08d8, 0x012e, 0x000e, 0x002e,
+	0x006e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0096, 0x00f6, 0x00e6,
+	0x00d6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000,
+	0x2071, 0x19b8, 0x760c, 0x2660, 0x2678, 0x8cff, 0x0904, 0x999d,
+	0x6010, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x9206, 0x1904, 0x9998,
+	0x7024, 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904,
+	0x9974, 0x080c, 0x9393, 0x68c3, 0x0000, 0x080c, 0x98c1, 0x7027,
+	0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138,
+	0x2001, 0x0100, 0x080c, 0x2b14, 0x9006, 0x080c, 0x2b14, 0x2069,
+	0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x700c,
+	0x9c36, 0x1110, 0x660c, 0x760e, 0x7008, 0x9c36, 0x1140, 0x2c00,
+	0x9f36, 0x0118, 0x2f00, 0x700a, 0x0010, 0x700b, 0x0000, 0x660c,
+	0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f,
+	0x0000, 0x080c, 0xbcf3, 0x1158, 0x080c, 0x2ffc, 0x080c, 0xbd04,
+	0x11f0, 0x080c, 0xa7a7, 0x00d8, 0x080c, 0x98c1, 0x08c0, 0x080c,
+	0xbd04, 0x1118, 0x080c, 0xa7a7, 0x0090, 0x6014, 0x2048, 0x080c,
+	0xbafc, 0x0168, 0x6020, 0x9086, 0x0003, 0x1508, 0xa867, 0x0103,
+	0xab7a, 0xa877, 0x0000, 0x080c, 0x6878, 0x080c, 0xbce7, 0x080c,
+	0xbf6b, 0x080c, 0x9e49, 0x080c, 0x9797, 0x00ce, 0x0804, 0x991d,
+	0x2c78, 0x600c, 0x2060, 0x0804, 0x991d, 0x012e, 0x000e, 0x002e,
+	0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, 0x0005, 0x6020,
+	0x9086, 0x0006, 0x1d20, 0x080c, 0xd4b5, 0x0c08, 0x00d6, 0x080c,
+	0x8eb1, 0x7003, 0x0200, 0x7007, 0x0014, 0x60c3, 0x0014, 0x20e1,
+	0x0001, 0x2099, 0x195a, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x20a9,
+	0x0004, 0x4003, 0x7023, 0x0004, 0x7027, 0x7878, 0x080c, 0x9367,
+	0x00de, 0x0005, 0x080c, 0x8eb1, 0x700b, 0x0800, 0x7814, 0x9084,
+	0xff00, 0x700e, 0x7814, 0x9084, 0x00ff, 0x7022, 0x782c, 0x7026,
+	0x7858, 0x9084, 0x00ff, 0x9085, 0x0200, 0x7002, 0x7858, 0x9084,
+	0xff00, 0x8007, 0x7006, 0x60c2, 0x0804, 0x9367, 0x00b6, 0x00d6,
+	0x0016, 0x00d6, 0x2f68, 0x2009, 0x0035, 0x080c, 0xc171, 0x00de,
+	0x1904, 0x9a4b, 0x080c, 0x8e66, 0x7003, 0x1300, 0x782c, 0x080c,
+	0x9b4d, 0x2068, 0x6820, 0x9086, 0x0003, 0x0560, 0x7810, 0x2058,
+	0xbaa0, 0x080c, 0x9d98, 0x11d8, 0x9286, 0x007e, 0x1128, 0x700b,
+	0x00ff, 0x700f, 0xfffe, 0x0498, 0x9286, 0x007f, 0x1128, 0x700b,
+	0x00ff, 0x700f, 0xfffd, 0x0458, 0x9284, 0xff80, 0x0180, 0x9286,
+	0x0080, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffc, 0x0400, 0x92d8,
+	0x1000, 0x2b5c, 0xb810, 0x700a, 0xb814, 0x700e, 0x00c0, 0x6098,
+	0x700e, 0x00a8, 0x080c, 0x9d98, 0x1130, 0x7810, 0x2058, 0xb8a0,
+	0x9082, 0x007e, 0x0250, 0x00d6, 0x2069, 0x181e, 0x2d04, 0x700a,
+	0x8d68, 0x2d04, 0x700e, 0x00de, 0x0010, 0x6034, 0x700e, 0x7838,
+	0x7012, 0x783c, 0x7016, 0x60c3, 0x000c, 0x001e, 0x00de, 0x080c,
+	0x9367, 0x00be, 0x0005, 0x781b, 0x0001, 0x7803, 0x0006, 0x001e,
+	0x00de, 0x00be, 0x0005, 0x792c, 0x9180, 0x0008, 0x200c, 0x9186,
+	0x0006, 0x01c0, 0x9186, 0x0003, 0x0904, 0x9ac5, 0x9186, 0x0005,
+	0x0904, 0x9aae, 0x9186, 0x0004, 0x05d8, 0x9186, 0x0008, 0x0904,
+	0x9ab6, 0x7807, 0x0037, 0x782f, 0x0003, 0x7817, 0x1700, 0x080c,
+	0x9b2a, 0x0005, 0x080c, 0x9aeb, 0x00d6, 0x0026, 0x792c, 0x2168,
+	0x2009, 0x4000, 0x6800, 0x0002, 0x9a8f, 0x9a9a, 0x9a91, 0x9a9a,
+	0x9a96, 0x9a8f, 0x9a8f, 0x9a9a, 0x9a9a, 0x9a9a, 0x9a9a, 0x9a8f,
+	0x9a8f, 0x9a8f, 0x9a8f, 0x9a8f, 0x9a9a, 0x9a8f, 0x9a9a, 0x080c,
+	0x0db4, 0x6824, 0xd0e4, 0x0110, 0xd0cc, 0x0110, 0x900e, 0x0010,
+	0x2009, 0x2000, 0x682c, 0x7022, 0x6830, 0x7026, 0x0804, 0x9ae4,
+	0x080c, 0x9aeb, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000,
+	0x6a00, 0x9286, 0x0002, 0x1108, 0x900e, 0x04b0, 0x04e1, 0x00d6,
+	0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x0470, 0x04a1, 0x00d6,
+	0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x9286, 0x0005, 0x0118,
+	0x9286, 0x0002, 0x1108, 0x900e, 0x00f8, 0x0429, 0x00d6, 0x0026,
+	0x792c, 0x2168, 0x6814, 0x0096, 0x2048, 0xa9ac, 0xa834, 0x9112,
+	0xa9b0, 0xa838, 0x009e, 0x9103, 0x7022, 0x7226, 0x792c, 0x9180,
+	0x0000, 0x2004, 0x908e, 0x0002, 0x0130, 0x908e, 0x0004, 0x0118,
+	0x2009, 0x4000, 0x0008, 0x900e, 0x712a, 0x60c3, 0x0018, 0x002e,
+	0x00de, 0x0804, 0x9367, 0x00b6, 0x0036, 0x0046, 0x0056, 0x0066,
+	0x080c, 0x8eb1, 0x9006, 0x7003, 0x0200, 0x7938, 0x710a, 0x793c,
+	0x710e, 0x7810, 0x2058, 0xb8a0, 0x080c, 0x9d98, 0x1118, 0x9092,
+	0x007e, 0x0268, 0x00d6, 0x2069, 0x181e, 0x2d2c, 0x8d68, 0x2d34,
+	0x90d8, 0x1000, 0x2b5c, 0xbb10, 0xbc14, 0x00de, 0x0028, 0x901e,
+	0x6498, 0x2029, 0x0000, 0x6634, 0x782c, 0x9080, 0x0008, 0x2004,
+	0x9086, 0x0003, 0x1128, 0x7512, 0x7616, 0x731a, 0x741e, 0x0020,
+	0x7312, 0x7416, 0x751a, 0x761e, 0x006e, 0x005e, 0x004e, 0x003e,
+	0x00be, 0x0005, 0x080c, 0x8eb1, 0x7003, 0x0100, 0x782c, 0x700a,
+	0x7814, 0x700e, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9367, 0x080c,
+	0x8e5d, 0x7003, 0x1400, 0x7838, 0x700a, 0x0079, 0x783c, 0x700e,
+	0x782c, 0x7012, 0x7830, 0x7016, 0x7834, 0x9084, 0x00ff, 0x8007,
+	0x701a, 0x60c3, 0x0010, 0x0804, 0x9367, 0x00e6, 0x2071, 0x0240,
+	0x0006, 0x00f6, 0x2078, 0x7810, 0x00b6, 0x2058, 0xb8bc, 0xd084,
+	0x0120, 0x7848, 0x702a, 0x7844, 0x702e, 0x00be, 0x00fe, 0x000e,
+	0x00ee, 0x0005, 0x080c, 0x8ea8, 0x7003, 0x0100, 0x782c, 0x700a,
+	0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9367, 0x0021, 0x60c3,
+	0x0000, 0x0804, 0x9367, 0x00d6, 0x080c, 0x9c26, 0xb810, 0x9085,
+	0x0300, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, 0x700a,
+	0x687c, 0x700e, 0x7013, 0x0819, 0x080c, 0x9355, 0x721a, 0x2f10,
+	0x7222, 0x7a08, 0x7226, 0x2071, 0x024c, 0x00de, 0x0005, 0x00a9,
+	0x7914, 0x712a, 0x60c3, 0x0000, 0x60a7, 0x9575, 0x0026, 0x080c,
+	0x29ca, 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e,
+	0x080c, 0x938a, 0x080c, 0x8087, 0x0005, 0x0036, 0x0096, 0x00d6,
+	0x00e6, 0x7858, 0x2048, 0xaa7c, 0x9296, 0x00c0, 0x9294, 0xfffd,
+	0xaa7e, 0xaa80, 0x9294, 0x0300, 0xaa82, 0xa96c, 0x9194, 0x00ff,
+	0xab74, 0x9384, 0x00ff, 0x908d, 0xc200, 0xa96e, 0x9384, 0xff00,
+	0x9215, 0xaa76, 0xa870, 0xaa78, 0xa87a, 0xaa72, 0x00d6, 0x2069,
+	0x0200, 0x080c, 0x9c26, 0x00de, 0x20e9, 0x0000, 0x20a1, 0x0240,
+	0x20a9, 0x000a, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098,
+	0x4003, 0x60a3, 0x0035, 0xaa68, 0x9294, 0x7000, 0x9286, 0x3000,
+	0x0110, 0x60a3, 0x0037, 0x00ee, 0x00de, 0x009e, 0x003e, 0x0005,
+	0x900e, 0x7814, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x01c0, 0x9084,
+	0x0003, 0x11a8, 0x2001, 0x180c, 0x2004, 0xd0bc, 0x0180, 0x7824,
+	0xd0cc, 0x1168, 0xd0c4, 0x1158, 0xa8a8, 0x9005, 0x1140, 0x2001,
+	0x180c, 0x200c, 0xc1d5, 0x2102, 0x2009, 0x1983, 0x210c, 0x009e,
+	0x918d, 0x0092, 0x0010, 0x2009, 0x0096, 0x60ab, 0x0036, 0x6116,
+	0x0005, 0x2009, 0x0009, 0x00a0, 0x2009, 0x000a, 0x0088, 0x2009,
+	0x000b, 0x0070, 0x2009, 0x000c, 0x0058, 0x2009, 0x000d, 0x0040,
+	0x2009, 0x000e, 0x0028, 0x2009, 0x000f, 0x0010, 0x2009, 0x0008,
+	0x6912, 0x0005, 0x00d6, 0x9290, 0x0018, 0x8214, 0x20e9, 0x0000,
+	0x2069, 0x0200, 0x6813, 0x0000, 0x22a8, 0x9284, 0x00e0, 0x0128,
+	0x20a9, 0x0020, 0x9292, 0x0020, 0x0008, 0x9016, 0x20a1, 0x0240,
+	0x9006, 0x4004, 0x82ff, 0x0120, 0x6810, 0x8000, 0x6812, 0x0c60,
+	0x00de, 0x0005, 0x00d6, 0x0096, 0x6014, 0x2048, 0xa878, 0x6056,
+	0x9006, 0xa836, 0xa83a, 0xa99c, 0xa946, 0xa84a, 0x6023, 0x0003,
+	0x6007, 0x0040, 0x6003, 0x0003, 0x600b, 0xffff, 0xa817, 0x0001,
+	0xa842, 0xa83e, 0x2900, 0xa85a, 0xa813, 0x1f24, 0x080c, 0x842e,
+	0x0126, 0x2091, 0x8000, 0x080c, 0x8a26, 0x012e, 0x009e, 0x00de,
+	0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x00a6, 0x0096, 0x0066,
+	0x0126, 0x2091, 0x8000, 0x2071, 0x19b8, 0x760c, 0x2660, 0x2678,
+	0x8cff, 0x0904, 0x9cf8, 0x7024, 0x9c06, 0x1520, 0x2069, 0x0100,
+	0x68c0, 0x9005, 0x0904, 0x9ccf, 0x080c, 0x9393, 0x68c3, 0x0000,
+	0x080c, 0x98c1, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04,
+	0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2b14, 0x9006,
+	0x080c, 0x2b14, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827,
+	0x0001, 0x003e, 0x700c, 0x9c36, 0x1110, 0x660c, 0x760e, 0x7008,
+	0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x700a, 0x0010,
+	0x700b, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e,
+	0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xbcf3, 0x1158, 0x080c,
+	0x2ffc, 0x080c, 0xbd04, 0x11f0, 0x080c, 0xa7a7, 0x00d8, 0x080c,
+	0x98c1, 0x08c0, 0x080c, 0xbd04, 0x1118, 0x080c, 0xa7a7, 0x0090,
+	0x6014, 0x2048, 0x080c, 0xbafc, 0x0168, 0x6020, 0x9086, 0x0003,
+	0x1520, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6885,
+	0x080c, 0xbce7, 0x080c, 0xbf6b, 0x080c, 0x9e49, 0x080c, 0x9797,
+	0x00ce, 0x0804, 0x9c80, 0x2c78, 0x600c, 0x2060, 0x0804, 0x9c80,
+	0x700f, 0x0000, 0x700b, 0x0000, 0x012e, 0x006e, 0x009e, 0x00ae,
+	0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020, 0x9086, 0x0006,
+	0x1d08, 0x080c, 0xd4b5, 0x08f0, 0x00d6, 0x0156, 0x080c, 0x8eb1,
+	0x7a14, 0x82ff, 0x0138, 0x7003, 0x0100, 0x700b, 0x0003, 0x60c3,
+	0x0008, 0x0490, 0x7003, 0x0200, 0x7007, 0x0000, 0x2069, 0x1800,
+	0x901e, 0x6800, 0x9086, 0x0004, 0x1110, 0xc38d, 0x0060, 0x080c,
+	0x6fa7, 0x1110, 0xc3ad, 0x0008, 0xc3a5, 0x6ad8, 0xd29c, 0x1110,
+	0xd2ac, 0x0108, 0xc39d, 0x730e, 0x2011, 0x1848, 0x63f0, 0x2312,
+	0x20a9, 0x0006, 0x2011, 0x1840, 0x2019, 0x1841, 0x2071, 0x0250,
+	0x2376, 0x8e70, 0x2276, 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002,
+	0x1f04, 0x9d40, 0x60c3, 0x0020, 0x080c, 0x9367, 0x015e, 0x00de,
+	0x0005, 0x0156, 0x080c, 0x8eb1, 0x7a14, 0x82ff, 0x0168, 0x9286,
+	0xffff, 0x0118, 0x9282, 0x000e, 0x1238, 0x7003, 0x0100, 0x700b,
+	0x0003, 0x60c3, 0x0008, 0x0488, 0x7003, 0x0200, 0x7007, 0x001c,
+	0x700f, 0x0001, 0x2011, 0x198e, 0x2204, 0x8007, 0x701a, 0x8210,
+	0x2204, 0x8007, 0x701e, 0x0421, 0x1120, 0xb8a0, 0x9082, 0x007f,
+	0x0248, 0x2001, 0x181e, 0x2004, 0x7022, 0x2001, 0x181f, 0x2004,
+	0x7026, 0x0030, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x7026,
+	0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000,
+	0x20a1, 0x0256, 0x4003, 0x60c3, 0x001c, 0x015e, 0x0804, 0x9367,
+	0x0006, 0x2001, 0x1836, 0x2004, 0xd0ac, 0x000e, 0x0005, 0x2011,
+	0x0003, 0x080c, 0x9758, 0x2011, 0x0002, 0x080c, 0x9762, 0x080c,
+	0x9649, 0x0036, 0x901e, 0x080c, 0x96bf, 0x003e, 0x0005, 0x2071,
+	0x1883, 0x7000, 0x9005, 0x0140, 0x2001, 0x0976, 0x2071, 0x1800,
+	0x7072, 0x7076, 0x7067, 0xffe0, 0x2071, 0x1800, 0x7070, 0x7052,
+	0x7057, 0x1cd0, 0x0005, 0x00e6, 0x0126, 0x2071, 0x1800, 0x2091,
+	0x8000, 0x7550, 0x9582, 0x0010, 0x0608, 0x7054, 0x2060, 0x6000,
+	0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7064, 0x9c02, 0x1208,
+	0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, 0x0008, 0x8529, 0x7552,
+	0x9ca8, 0x0018, 0x7064, 0x9502, 0x1230, 0x7556, 0x9085, 0x0001,
+	0x012e, 0x00ee, 0x0005, 0x7057, 0x1cd0, 0x0cc0, 0x9006, 0x0cc0,
+	0x00e6, 0x2071, 0x1800, 0x7550, 0x9582, 0x0010, 0x0600, 0x7054,
 	0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7064,
 	0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, 0x0008,
-	0x8529, 0x7552, 0x9ca8, 0x0018, 0x7064, 0x9502, 0x1230, 0x7556,
-	0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x7057, 0x1cd0, 0x0cc0,
-	0x9006, 0x0cc0, 0x6020, 0x9084, 0x000f, 0x0002, 0x9b55, 0x9b5e,
-	0x9b79, 0x9b94, 0xbeac, 0xbec9, 0xbee4, 0x9b55, 0x9b5e, 0x9b55,
-	0x9bb0, 0x9b55, 0x9b55, 0x9b55, 0x9b55, 0x9186, 0x0013, 0x1128,
-	0x080c, 0x8589, 0x080c, 0x868e, 0x0005, 0x0005, 0x0066, 0x6000,
-	0x90b2, 0x0016, 0x1a0c, 0x0db4, 0x0013, 0x006e, 0x0005, 0x9b77,
-	0xa2cf, 0xa49d, 0x9b77, 0xa52b, 0x9e93, 0x9b77, 0x9b77, 0xa251,
-	0xaacd, 0x9b77, 0x9b77, 0x9b77, 0x9b77, 0x9b77, 0x9b77, 0x080c,
+	0x8529, 0x7552, 0x9ca8, 0x0018, 0x7064, 0x9502, 0x1228, 0x7556,
+	0x9085, 0x0001, 0x00ee, 0x0005, 0x7057, 0x1cd0, 0x0cc8, 0x9006,
+	0x0cc8, 0x9c82, 0x1cd0, 0x0a0c, 0x0db4, 0x2001, 0x1819, 0x2004,
+	0x9c02, 0x1a0c, 0x0db4, 0x9006, 0x6006, 0x600a, 0x600e, 0x6016,
+	0x601a, 0x6012, 0x6023, 0x0000, 0x6003, 0x0000, 0x601e, 0x6056,
+	0x605a, 0x6026, 0x602a, 0x602e, 0x6032, 0x6036, 0x603a, 0x603e,
+	0x6042, 0x2061, 0x1800, 0x6050, 0x8000, 0x6052, 0x9086, 0x0001,
+	0x0108, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x894b, 0x012e,
+	0x0cc0, 0x0006, 0x6000, 0x9086, 0x0000, 0x01b0, 0x601c, 0xd084,
+	0x190c, 0x190d, 0x6017, 0x0000, 0x6023, 0x0007, 0x2001, 0x1957,
+	0x2004, 0x0006, 0x9082, 0x0051, 0x000e, 0x0208, 0x8004, 0x601a,
+	0x080c, 0xd767, 0x6043, 0x0000, 0x000e, 0x0005, 0x00e6, 0x0126,
+	0x2071, 0x1800, 0x2091, 0x8000, 0x7550, 0x9582, 0x0001, 0x0608,
+	0x7054, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018,
+	0x7064, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003,
+	0x0008, 0x8529, 0x7552, 0x9ca8, 0x0018, 0x7064, 0x9502, 0x1230,
+	0x7556, 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x7057, 0x1cd0,
+	0x0cc0, 0x9006, 0x0cc0, 0x6020, 0x9084, 0x000f, 0x0002, 0x9ea6,
+	0x9eaf, 0x9eca, 0x9ee5, 0xc21f, 0xc23c, 0xc257, 0x9ea6, 0x9eaf,
+	0x9ea6, 0x9f01, 0x9ea6, 0x9ea6, 0x9ea6, 0x9ea6, 0x9186, 0x0013,
+	0x1128, 0x080c, 0x8846, 0x080c, 0x894b, 0x0005, 0x0005, 0x0066,
+	0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0db4, 0x0013, 0x006e, 0x0005,
+	0x9ec8, 0xa620, 0xa7ee, 0x9ec8, 0xa87c, 0xa1e4, 0x9ec8, 0x9ec8,
+	0xa5a2, 0xae1e, 0x9ec8, 0x9ec8, 0x9ec8, 0x9ec8, 0x9ec8, 0x9ec8,
+	0x080c, 0x0db4, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0db4,
+	0x0013, 0x006e, 0x0005, 0x9ee3, 0xb4f2, 0x9ee3, 0x9ee3, 0x9ee3,
+	0x9ee3, 0x9ee3, 0x9ee3, 0xb497, 0xb674, 0x9ee3, 0xb533, 0xb5b2,
+	0xb533, 0xb5b2, 0x9ee3, 0x080c, 0x0db4, 0x6000, 0x9082, 0x0016,
+	0x1a0c, 0x0db4, 0x6000, 0x0002, 0x9eff, 0xae65, 0xaf4a, 0xb07a,
+	0xb225, 0x9eff, 0x9eff, 0x9eff, 0xae39, 0xb423, 0xb426, 0x9eff,
+	0x9eff, 0x9eff, 0x9eff, 0xb455, 0x9eff, 0x9eff, 0x9eff, 0x080c,
 	0x0db4, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0db4, 0x0013,
-	0x006e, 0x0005, 0x9b92, 0xb1a1, 0x9b92, 0x9b92, 0x9b92, 0x9b92,
-	0x9b92, 0x9b92, 0xb146, 0xb323, 0x9b92, 0xb1e2, 0xb261, 0xb1e2,
-	0xb261, 0x9b92, 0x080c, 0x0db4, 0x6000, 0x9082, 0x0016, 0x1a0c,
-	0x0db4, 0x6000, 0x0002, 0x9bae, 0xab14, 0xabf9, 0xad29, 0xaed4,
-	0x9bae, 0x9bae, 0x9bae, 0xaae8, 0xb0d2, 0xb0d5, 0x9bae, 0x9bae,
-	0x9bae, 0x9bae, 0xb104, 0x9bae, 0x9bae, 0x9bae, 0x080c, 0x0db4,
-	0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0db4, 0x0013, 0x006e,
-	0x0005, 0x9bc9, 0x9bc9, 0x9c0c, 0x9cab, 0x9d40, 0x9bc9, 0x9bc9,
-	0x9bc9, 0x9bcb, 0x9bc9, 0x9bc9, 0x9bc9, 0x9bc9, 0x9bc9, 0x9bc9,
-	0x9bc9, 0x080c, 0x0db4, 0x9186, 0x004c, 0x0588, 0x9186, 0x0003,
-	0x190c, 0x0db4, 0x0096, 0x601c, 0xc0ed, 0x601e, 0x6003, 0x0003,
-	0x6106, 0x6014, 0x2048, 0xa87c, 0x9084, 0xa000, 0xc0b5, 0xa87e,
-	0xa8ac, 0xa846, 0xa8b0, 0xa84a, 0x9006, 0xa836, 0xa83a, 0xa884,
-	0x9092, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x8013, 0x8213,
-	0x9210, 0x621a, 0x009e, 0x2c10, 0x080c, 0x19aa, 0x080c, 0x8171,
-	0x0126, 0x2091, 0x8000, 0x080c, 0x8769, 0x012e, 0x0005, 0x6010,
-	0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x080c, 0x9d62, 0x080c,
-	0xbe9e, 0x6003, 0x0007, 0x0005, 0x00d6, 0x0096, 0x00f6, 0x2079,
-	0x1800, 0x7a8c, 0x6014, 0x2048, 0xa87c, 0xd0ec, 0x1110, 0x9290,
-	0x0018, 0xac78, 0xc4fc, 0x0046, 0xa8e0, 0x9005, 0x1140, 0xa8dc,
-	0x921a, 0x0140, 0x0220, 0xa87b, 0x0007, 0x2010, 0x0028, 0xa87b,
-	0x0015, 0x0010, 0xa87b, 0x0000, 0x8214, 0xa883, 0x0000, 0xaa02,
-	0x0006, 0x0016, 0x0026, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2400,
-	0x9005, 0x1108, 0x009a, 0x2100, 0x9086, 0x0015, 0x1118, 0x2001,
-	0x0001, 0x0038, 0x2100, 0x9086, 0x0016, 0x0118, 0x2001, 0x0001,
-	0x002a, 0x94a4, 0x0007, 0x8423, 0x9405, 0x0002, 0x9c73, 0x9c73,
-	0x9c6e, 0x9c71, 0x9c73, 0x9c6b, 0x9c5e, 0x9c5e, 0x9c5e, 0x9c5e,
-	0x9c5e, 0x9c5e, 0x9c5e, 0x9c5e, 0x9c5e, 0x9c5e, 0x00fe, 0x00ee,
-	0x00de, 0x00ce, 0x002e, 0x001e, 0x000e, 0x004e, 0x00fe, 0x009e,
-	0x00de, 0x080c, 0x0db4, 0x080c, 0xa70c, 0x0028, 0x080c, 0xa82f,
-	0x0010, 0x080c, 0xa91e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e,
-	0x001e, 0x2c00, 0xa896, 0x000e, 0x080c, 0x9e20, 0x0530, 0xa804,
-	0xa80e, 0x00a6, 0x2050, 0xb100, 0x00ae, 0x8006, 0x8006, 0x8007,
-	0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0xaacc, 0xabd0,
-	0xacd4, 0xadd8, 0x2031, 0x0000, 0x2041, 0x1240, 0x080c, 0x9fca,
-	0x0160, 0x000e, 0x9005, 0x0120, 0x00fe, 0x009e, 0x00de, 0x0005,
-	0x00fe, 0x009e, 0x00de, 0x0804, 0x9ac8, 0x2001, 0x002c, 0x900e,
-	0x080c, 0x9e86, 0x0c70, 0x91b6, 0x0015, 0x0170, 0x91b6, 0x0016,
-	0x0158, 0x91b2, 0x0047, 0x0a0c, 0x0db4, 0x91b2, 0x0050, 0x1a0c,
-	0x0db4, 0x9182, 0x0047, 0x00ca, 0x2001, 0x0109, 0x2004, 0xd08c,
-	0x0198, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x080c,
-	0x80c5, 0x002e, 0x001e, 0x000e, 0x012e, 0xa001, 0x6000, 0x9086,
-	0x0002, 0x1110, 0x0804, 0x9c0c, 0x0005, 0x9cde, 0x9cde, 0x9ce0,
-	0x9d16, 0x9cde, 0x9cde, 0x9cde, 0x9cde, 0x9d29, 0x080c, 0x0db4,
-	0x00d6, 0x0016, 0x0096, 0x080c, 0x863e, 0x080c, 0x8769, 0x6003,
-	0x0004, 0x6114, 0x2148, 0xa87c, 0xd0fc, 0x01c0, 0xa878, 0xc0fc,
-	0x9005, 0x1158, 0xa894, 0x9005, 0x0140, 0x2001, 0x0000, 0x900e,
-	0x080c, 0x9e86, 0x080c, 0x9ac8, 0x00a8, 0x6003, 0x0002, 0xa8a4,
-	0xa9a8, 0x9105, 0x1178, 0xa8ae, 0xa8b2, 0x0c78, 0xa87f, 0x0020,
-	0xa88c, 0xa88a, 0xa8a4, 0xa8ae, 0xa8a8, 0xa8b2, 0xa8c7, 0x0000,
-	0xa8cb, 0x0000, 0x009e, 0x001e, 0x00de, 0x0005, 0x080c, 0x863e,
-	0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, 0xb793, 0x0120, 0xa87b,
-	0x0006, 0x080c, 0x65f2, 0x009e, 0x00de, 0x080c, 0x9ac8, 0x0804,
-	0x8769, 0x080c, 0x863e, 0x080c, 0x2e7f, 0x080c, 0xbe9b, 0x00d6,
-	0x0096, 0x6114, 0x2148, 0x080c, 0xb793, 0x0120, 0xa87b, 0x0029,
-	0x080c, 0x65f2, 0x009e, 0x00de, 0x080c, 0x9ac8, 0x0804, 0x8769,
-	0x9182, 0x0047, 0x0002, 0x9d50, 0x9d52, 0x9d50, 0x9d50, 0x9d50,
-	0x9d50, 0x9d50, 0x9d50, 0x9d50, 0x9d50, 0x9d50, 0x9d50, 0x9d52,
-	0x080c, 0x0db4, 0x00d6, 0x0096, 0x080c, 0x14f3, 0x6114, 0x2148,
-	0xa87b, 0x0000, 0xa883, 0x0000, 0x080c, 0x65f2, 0x009e, 0x00de,
-	0x0804, 0x9ac8, 0x0026, 0x0036, 0x0056, 0x0066, 0x0096, 0x00a6,
-	0x00f6, 0x0006, 0x080c, 0x0fec, 0x000e, 0x090c, 0x0db4, 0xa960,
-	0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020,
-	0x4104, 0xa87a, 0x2079, 0x1800, 0x798c, 0x9188, 0x0018, 0x918c,
-	0x0fff, 0xa972, 0xac76, 0x2950, 0x00a6, 0x2001, 0x0205, 0x2003,
-	0x0000, 0x901e, 0x2029, 0x0001, 0x9182, 0x0034, 0x1228, 0x2011,
-	0x001f, 0x080c, 0xb3a8, 0x04c0, 0x2130, 0x2009, 0x0034, 0x2011,
-	0x001f, 0x080c, 0xb3a8, 0x96b2, 0x0034, 0xb004, 0x904d, 0x0110,
-	0x080c, 0x0f9e, 0x080c, 0x0fec, 0x01d0, 0x8528, 0xa867, 0x0110,
-	0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, 0x1230, 0x2608,
-	0x2011, 0x001b, 0x080c, 0xb3a8, 0x00b8, 0x96b2, 0x003c, 0x2009,
-	0x003c, 0x2950, 0x2011, 0x001b, 0x080c, 0xb3a8, 0x0c18, 0x2001,
-	0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0050, 0xb566,
-	0xb070, 0xc0fd, 0xb072, 0x0048, 0x2001, 0x0205, 0x2003, 0x0000,
-	0x00ae, 0x852f, 0x95ad, 0x0050, 0xb566, 0x2a48, 0xa804, 0xa807,
-	0x0000, 0x0006, 0x080c, 0x65f2, 0x000e, 0x2048, 0x9005, 0x1db0,
-	0x00fe, 0x00ae, 0x009e, 0x006e, 0x005e, 0x003e, 0x002e, 0x0005,
-	0x00d6, 0x00f6, 0x0096, 0x0006, 0x080c, 0x0fec, 0x000e, 0x090c,
-	0x0db4, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e,
-	0x20a9, 0x0020, 0x4104, 0xaa66, 0xa87a, 0x2079, 0x1800, 0x798c,
-	0x810c, 0x9188, 0x000c, 0x9182, 0x001a, 0x0210, 0x2009, 0x001a,
-	0x21a8, 0x810b, 0xa972, 0xac76, 0x2e98, 0xa85c, 0x9080, 0x001f,
-	0x20a0, 0x2001, 0x0205, 0x200c, 0x918d, 0x0080, 0x2102, 0x4003,
-	0x2003, 0x0000, 0x080c, 0x65f2, 0x009e, 0x00fe, 0x00de, 0x0005,
-	0x0016, 0x00d6, 0x00f6, 0x0096, 0x0016, 0x2001, 0x0205, 0x200c,
-	0x918d, 0x0080, 0x2102, 0x001e, 0x2079, 0x0200, 0x2e98, 0xa87c,
-	0xd0ec, 0x0118, 0x9e80, 0x000c, 0x2098, 0x2021, 0x003e, 0x901e,
-	0x9282, 0x0020, 0x0218, 0x2011, 0x0020, 0x2018, 0x9486, 0x003e,
-	0x1170, 0x0096, 0x080c, 0x0fec, 0x2900, 0x009e, 0x05c0, 0xa806,
-	0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x3300,
-	0x908e, 0x0260, 0x0140, 0x2009, 0x0280, 0x9102, 0x920a, 0x0218,
-	0x2010, 0x2100, 0x9318, 0x2200, 0x9402, 0x1228, 0x2400, 0x9202,
-	0x2410, 0x9318, 0x9006, 0x2020, 0x22a8, 0xa800, 0x9200, 0xa802,
-	0x20e1, 0x0000, 0x4003, 0x83ff, 0x0180, 0x3300, 0x9086, 0x0280,
-	0x1130, 0x7814, 0x8000, 0x9085, 0x0080, 0x7816, 0x2e98, 0x2310,
-	0x84ff, 0x0904, 0x9e35, 0x0804, 0x9e37, 0x9085, 0x0001, 0x7817,
-	0x0000, 0x009e, 0x00fe, 0x00de, 0x001e, 0x0005, 0x00d6, 0x0036,
-	0x0096, 0x6314, 0x2348, 0xa87a, 0xa982, 0x080c, 0x65e5, 0x009e,
-	0x003e, 0x00de, 0x0005, 0x91b6, 0x0015, 0x1118, 0x080c, 0x9ac8,
-	0x0030, 0x91b6, 0x0016, 0x190c, 0x0db4, 0x080c, 0x9ac8, 0x0005,
-	0x20a9, 0x000e, 0x20e1, 0x0000, 0x2e98, 0x6014, 0x0096, 0x2048,
-	0xa860, 0x20e8, 0xa85c, 0x20a0, 0x009e, 0x4003, 0x0136, 0x9080,
-	0x001b, 0x2011, 0x0006, 0x20a9, 0x0001, 0x3418, 0x8318, 0x23a0,
-	0x4003, 0x3318, 0x8318, 0x2398, 0x8211, 0x1db8, 0x2011, 0x0006,
-	0x013e, 0x20a0, 0x3318, 0x8318, 0x2398, 0x4003, 0x3418, 0x8318,
-	0x23a0, 0x8211, 0x1db8, 0x0096, 0x080c, 0xb793, 0x0130, 0x6014,
-	0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0x009e, 0x0804, 0x9ac8,
-	0x0096, 0x00d6, 0x0036, 0x7330, 0x9386, 0x0200, 0x11a8, 0x6010,
-	0x00b6, 0x2058, 0xb8bf, 0x0000, 0x00be, 0x6014, 0x9005, 0x0130,
-	0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xab32, 0x080c, 0x9ac8,
-	0x003e, 0x00de, 0x009e, 0x0005, 0x0011, 0x1d48, 0x0cc8, 0x0006,
-	0x0016, 0x080c, 0xbe86, 0x0188, 0x6014, 0x9005, 0x1170, 0x600b,
-	0x0003, 0x601b, 0x0000, 0x6043, 0x0000, 0x2009, 0x0022, 0x080c,
-	0xa2a7, 0x9006, 0x001e, 0x000e, 0x0005, 0x9085, 0x0001, 0x0cd0,
-	0x0096, 0x0016, 0x20a9, 0x0014, 0x9e80, 0x000c, 0x20e1, 0x0000,
-	0x2098, 0x6014, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002,
-	0x20a0, 0x4003, 0x2001, 0x0205, 0x2003, 0x0001, 0x2099, 0x0260,
-	0x20a9, 0x0016, 0x4003, 0x20a9, 0x000a, 0xa804, 0x2048, 0xa860,
-	0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x2001, 0x0205,
-	0x2003, 0x0002, 0x2099, 0x0260, 0x20a9, 0x0020, 0x4003, 0x2003,
-	0x0000, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, 0x080c,
-	0x9ac8, 0x001e, 0x009e, 0x0005, 0x0096, 0x0016, 0x900e, 0x7030,
-	0x9086, 0x0100, 0x0140, 0x7038, 0x9084, 0x00ff, 0x800c, 0x703c,
-	0x9084, 0x00ff, 0x8004, 0x9080, 0x0004, 0x9108, 0x810b, 0x2011,
-	0x0002, 0x2019, 0x000c, 0x6014, 0x2048, 0x080c, 0xb3a8, 0x080c,
-	0xb793, 0x0140, 0x6014, 0x2048, 0xa807, 0x0000, 0xa864, 0xa8e2,
-	0xa867, 0x0103, 0x080c, 0x9ac8, 0x001e, 0x009e, 0x0005, 0x0016,
-	0x0096, 0x7030, 0x9086, 0x0100, 0x1118, 0x2009, 0x0004, 0x0010,
-	0x7034, 0x800c, 0x810b, 0x2011, 0x000c, 0x2019, 0x000c, 0x6014,
-	0x2048, 0xa804, 0x0096, 0x9005, 0x0108, 0x2048, 0x080c, 0xb3a8,
-	0x009e, 0x080c, 0xb793, 0x0148, 0xa804, 0x9005, 0x1158, 0xa807,
-	0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, 0x9ac8, 0x009e,
-	0x001e, 0x0005, 0x0086, 0x2040, 0xa030, 0x8007, 0x9086, 0x0100,
-	0x1118, 0x080c, 0xa456, 0x00e0, 0xa034, 0x8007, 0x800c, 0x8806,
-	0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x000c,
-	0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0xaaa0, 0xab9c,
-	0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x1226, 0x0019, 0x0d08,
-	0x008e, 0x0898, 0x0096, 0x0006, 0x080c, 0x0fec, 0x000e, 0x01b0,
-	0xa8ab, 0x0dcb, 0xa876, 0x000e, 0xa8a2, 0x0006, 0xae6a, 0x2800,
-	0xa89e, 0xa97a, 0xaf72, 0xaa8e, 0xab92, 0xac96, 0xad9a, 0x0086,
-	0x2940, 0x080c, 0x10cc, 0x008e, 0x9085, 0x0001, 0x009e, 0x0005,
-	0x00e6, 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6,
-	0x2258, 0xba10, 0x00be, 0x9206, 0x1520, 0x700c, 0x6210, 0x00b6,
-	0x2258, 0xba14, 0x00be, 0x9206, 0x11e0, 0x6043, 0x0000, 0x2c68,
-	0x0016, 0x2009, 0x0035, 0x080c, 0xbdfe, 0x001e, 0x1158, 0x622c,
-	0x2268, 0x2071, 0x026c, 0x6b20, 0x9386, 0x0003, 0x0130, 0x9386,
-	0x0006, 0x0128, 0x080c, 0x9ac8, 0x0020, 0x0039, 0x0010, 0x080c,
-	0xa0dc, 0x002e, 0x00de, 0x00ee, 0x0005, 0x0096, 0x6814, 0x2048,
-	0x9186, 0x0015, 0x0904, 0xa0c4, 0x918e, 0x0016, 0x1904, 0xa0da,
-	0x700c, 0x908c, 0xff00, 0x9186, 0x1700, 0x0120, 0x9186, 0x0300,
-	0x1904, 0xa09e, 0x89ff, 0x1138, 0x6800, 0x9086, 0x000f, 0x0904,
-	0xa081, 0x0804, 0xa0d8, 0x6808, 0x9086, 0xffff, 0x1904, 0xa0c6,
-	0xa87c, 0x9084, 0x0060, 0x9086, 0x0020, 0x1128, 0xa83c, 0xa940,
-	0x9105, 0x1904, 0xa0c6, 0x6824, 0xd0b4, 0x1904, 0xa0c6, 0x080c,
-	0xb975, 0x685c, 0xa882, 0xa87c, 0xc0dc, 0xc0f4, 0xc0d4, 0xa87e,
-	0x0026, 0x900e, 0x6a18, 0x2001, 0x000a, 0x080c, 0x7f8b, 0xa884,
-	0x920a, 0x0208, 0x8011, 0xaa86, 0x82ff, 0x002e, 0x1138, 0x00c6,
-	0x2d60, 0x080c, 0xb4d2, 0x00ce, 0x0804, 0xa0d8, 0x00c6, 0xa868,
-	0xd0fc, 0x1118, 0x080c, 0x5b10, 0x0010, 0x080c, 0x5ea7, 0x00ce,
-	0x1904, 0xa0c6, 0x00c6, 0x2d60, 0x080c, 0x9ac8, 0x00ce, 0x0804,
-	0xa0d8, 0x00c6, 0x080c, 0x9b15, 0x0198, 0x6017, 0x0000, 0x6810,
-	0x6012, 0x080c, 0xbc01, 0x6023, 0x0003, 0x6904, 0x00c6, 0x2d60,
-	0x080c, 0x9ac8, 0x00ce, 0x080c, 0x9b42, 0x00ce, 0x0804, 0xa0d8,
-	0x2001, 0x1957, 0x2004, 0x6842, 0x00ce, 0x04d0, 0x7008, 0x9086,
-	0x000b, 0x11c8, 0x6010, 0x00b6, 0x2058, 0xb900, 0xc1bc, 0xb902,
-	0x00be, 0x00c6, 0x2d60, 0xa87b, 0x0003, 0x080c, 0xbe40, 0x6007,
-	0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x810c, 0x080c,
-	0x868e, 0x00ce, 0x00e8, 0x700c, 0x9086, 0x2a00, 0x1138, 0x2001,
-	0x1957, 0x2004, 0x6842, 0x00a0, 0x0479, 0x00a0, 0x89ff, 0x090c,
-	0x0db4, 0x00c6, 0x00d6, 0x2d60, 0xa867, 0x0103, 0xa87b, 0x0003,
-	0x080c, 0x640d, 0x080c, 0xb975, 0x080c, 0x9af8, 0x00de, 0x00ce,
-	0x080c, 0x9ac8, 0x009e, 0x0005, 0x9186, 0x0015, 0x1128, 0x2001,
-	0x1957, 0x2004, 0x6842, 0x0068, 0x918e, 0x0016, 0x1160, 0x00c6,
-	0x2d00, 0x2060, 0x080c, 0xd3e0, 0x080c, 0x7f1f, 0x080c, 0x9ac8,
-	0x00ce, 0x080c, 0x9ac8, 0x0005, 0x0026, 0x0036, 0x0046, 0x7228,
-	0xacb0, 0xabac, 0xd2f4, 0x0130, 0x2001, 0x1957, 0x2004, 0x6842,
-	0x0804, 0xa156, 0x00c6, 0x2d60, 0x080c, 0xb3d3, 0x00ce, 0x6804,
-	0x9086, 0x0050, 0x1168, 0x00c6, 0x2d00, 0x2060, 0x6003, 0x0001,
-	0x6007, 0x0050, 0x080c, 0x810c, 0x080c, 0x868e, 0x00ce, 0x04f0,
-	0x6800, 0x9086, 0x000f, 0x01a8, 0x89ff, 0x090c, 0x0db4, 0x6800,
-	0x9086, 0x0004, 0x1190, 0xa87c, 0xd0ac, 0x0178, 0xa843, 0x0fff,
-	0xa83f, 0x0fff, 0xa880, 0xc0fc, 0xa882, 0x2001, 0x0001, 0x6832,
-	0x0400, 0x2001, 0x0007, 0x6832, 0x00e0, 0xa87c, 0xd0b4, 0x1150,
-	0xd0ac, 0x0db8, 0x6824, 0xd0f4, 0x1d48, 0xa838, 0xa934, 0x9105,
-	0x0d80, 0x0c20, 0xd2ec, 0x1d68, 0x7024, 0x9306, 0x1118, 0x7020,
-	0x9406, 0x0d38, 0x7020, 0x683e, 0x7024, 0x683a, 0x2001, 0x0005,
-	0x6832, 0x080c, 0xbaf8, 0x080c, 0x868e, 0x0010, 0x080c, 0x9ac8,
-	0x004e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x00d6, 0x0026, 0x7008,
-	0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, 0xba10, 0x00be, 0x9206,
-	0x1904, 0xa1c1, 0x700c, 0x6210, 0x00b6, 0x2258, 0xba14, 0x00be,
-	0x9206, 0x1904, 0xa1c1, 0x6038, 0x2068, 0x6824, 0xc0dc, 0x6826,
-	0x6a20, 0x9286, 0x0007, 0x0904, 0xa1c1, 0x9286, 0x0002, 0x0904,
-	0xa1c1, 0x9286, 0x0000, 0x05e8, 0x6808, 0x633c, 0x9306, 0x15c8,
-	0x2071, 0x026c, 0x9186, 0x0015, 0x0570, 0x918e, 0x0016, 0x1100,
-	0x00c6, 0x6038, 0x2060, 0x6104, 0x9186, 0x004b, 0x01c0, 0x9186,
-	0x004c, 0x01a8, 0x9186, 0x004d, 0x0190, 0x9186, 0x004e, 0x0178,
-	0x9186, 0x0052, 0x0160, 0x6014, 0x0096, 0x2048, 0x080c, 0xb793,
-	0x090c, 0x0db4, 0xa87b, 0x0003, 0x009e, 0x080c, 0xbe40, 0x6007,
-	0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x810c, 0x080c,
-	0x868e, 0x00ce, 0x0030, 0x6038, 0x2070, 0x2001, 0x1957, 0x2004,
-	0x7042, 0x080c, 0x9ac8, 0x002e, 0x00de, 0x00ee, 0x0005, 0x00b6,
-	0x0096, 0x00f6, 0x6014, 0x2048, 0x6010, 0x2058, 0x91b6, 0x0015,
-	0x0130, 0xba08, 0xbb0c, 0xbc00, 0xc48c, 0xbc02, 0x0460, 0x0096,
-	0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, 0x0010, 0x2019, 0x000a,
-	0x20a9, 0x0004, 0x080c, 0xaaa3, 0x002e, 0x003e, 0x015e, 0x009e,
-	0x1904, 0xa230, 0x0096, 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90,
-	0x0014, 0x2019, 0x0006, 0x20a9, 0x0004, 0x080c, 0xaaa3, 0x002e,
-	0x003e, 0x015e, 0x009e, 0x15a0, 0x7238, 0xba0a, 0x733c, 0xbb0e,
-	0xbc00, 0xc48d, 0xbc02, 0xa804, 0x9005, 0x1128, 0x00fe, 0x009e,
-	0x00be, 0x0804, 0x9ecb, 0x0096, 0x2048, 0xaa12, 0xab16, 0xac0a,
-	0x009e, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0,
-	0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4,
-	0x2031, 0x0000, 0x2041, 0x1226, 0x080c, 0x9fca, 0x0130, 0x00fe,
-	0x009e, 0x080c, 0x9ac8, 0x00be, 0x0005, 0x080c, 0xa456, 0x0cb8,
-	0x2b78, 0x00f6, 0x080c, 0x2e7f, 0x080c, 0xbe9b, 0x00fe, 0x00c6,
-	0x080c, 0x9a72, 0x2f00, 0x6012, 0x6017, 0x0000, 0x6023, 0x0001,
-	0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, 0x080c, 0x5f42,
-	0x080c, 0x5f6e, 0x080c, 0x8154, 0x080c, 0x868e, 0x00ce, 0x0804,
-	0xa203, 0x2100, 0x91b2, 0x0053, 0x1a0c, 0x0db4, 0x91b2, 0x0040,
-	0x1a04, 0xa2b9, 0x0002, 0xa2a7, 0xa2a7, 0xa29d, 0xa2a7, 0xa2a7,
-	0xa2a7, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b,
-	0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b,
-	0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b,
-	0xa29b, 0xa29b, 0xa2a7, 0xa29b, 0xa2a7, 0xa2a7, 0xa29b, 0xa29b,
-	0xa29b, 0xa29b, 0xa29b, 0xa29d, 0xa29b, 0xa29b, 0xa29b, 0xa29b,
-	0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa2a7, 0xa2a7, 0xa29b,
-	0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b, 0xa29b,
-	0xa2a7, 0xa29b, 0xa29b, 0x080c, 0x0db4, 0x0066, 0x00b6, 0x6610,
-	0x2658, 0xb8bc, 0xc08c, 0xb8be, 0x00be, 0x006e, 0x0000, 0x6003,
-	0x0001, 0x6106, 0x9186, 0x0032, 0x0118, 0x080c, 0x8154, 0x0010,
-	0x080c, 0x810c, 0x0126, 0x2091, 0x8000, 0x080c, 0x868e, 0x012e,
-	0x0005, 0x2600, 0x0002, 0xa2cd, 0xa2cd, 0xa2cd, 0xa2a7, 0xa2a7,
-	0xa2cd, 0xa2cd, 0xa2cd, 0xa2cd, 0xa2a7, 0xa2cd, 0xa2a7, 0xa2cd,
-	0xa2a7, 0xa2cd, 0xa2cd, 0xa2cd, 0xa2cd, 0x080c, 0x0db4, 0x6004,
-	0x90b2, 0x0053, 0x1a0c, 0x0db4, 0x91b6, 0x0013, 0x0904, 0xa391,
-	0x91b6, 0x0027, 0x1904, 0xa34c, 0x080c, 0x8589, 0x6004, 0x080c,
-	0xb981, 0x01b0, 0x080c, 0xb992, 0x01a8, 0x908e, 0x0021, 0x0904,
-	0xa349, 0x908e, 0x0022, 0x1130, 0x080c, 0x9ef7, 0x0904, 0xa345,
-	0x0804, 0xa346, 0x908e, 0x003d, 0x0904, 0xa349, 0x0804, 0xa33f,
-	0x080c, 0x2ea4, 0x2001, 0x0007, 0x080c, 0x5f42, 0x6010, 0x00b6,
-	0x2058, 0xb9a0, 0x00be, 0x080c, 0xa456, 0x9186, 0x007e, 0x1148,
-	0x2001, 0x1836, 0x2014, 0xc285, 0x080c, 0x6d14, 0x1108, 0xc2ad,
-	0x2202, 0x0036, 0x0026, 0x2019, 0x0028, 0x2110, 0x080c, 0xd43b,
-	0x002e, 0x003e, 0x0016, 0x0026, 0x0036, 0x2110, 0x2019, 0x0028,
-	0x080c, 0x828c, 0x0076, 0x903e, 0x080c, 0x8184, 0x6010, 0x00b6,
-	0x905d, 0x0100, 0x00be, 0x2c08, 0x080c, 0xcef9, 0x007e, 0x003e,
-	0x002e, 0x001e, 0x080c, 0xbe9b, 0x0016, 0x080c, 0xbbf9, 0x080c,
-	0x9ac8, 0x001e, 0x080c, 0x2f76, 0x080c, 0x868e, 0x0030, 0x080c,
-	0xbbf9, 0x080c, 0x9ac8, 0x080c, 0x868e, 0x0005, 0x080c, 0xa456,
-	0x0cb0, 0x080c, 0xa492, 0x0c98, 0x9186, 0x0014, 0x1db0, 0x080c,
-	0x8589, 0x6004, 0x908e, 0x0022, 0x1118, 0x080c, 0x9ef7, 0x0d68,
-	0x080c, 0x2e7f, 0x080c, 0xbe9b, 0x080c, 0xb981, 0x1190, 0x080c,
-	0x2ea4, 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, 0xa456,
-	0x9186, 0x007e, 0x1128, 0x2001, 0x1836, 0x200c, 0xc185, 0x2102,
-	0x0870, 0x080c, 0xb992, 0x1118, 0x080c, 0xa456, 0x0840, 0x6004,
-	0x908e, 0x0032, 0x1160, 0x00e6, 0x00f6, 0x2071, 0x1894, 0x2079,
-	0x0000, 0x080c, 0x320a, 0x00fe, 0x00ee, 0x0804, 0xa33f, 0x6004,
-	0x908e, 0x0021, 0x0d48, 0x908e, 0x0022, 0x090c, 0xa456, 0x0804,
-	0xa33f, 0x90b2, 0x0040, 0x1a04, 0xa43f, 0x2008, 0x0002, 0xa3d9,
-	0xa3da, 0xa3dd, 0xa3e0, 0xa3e3, 0xa3e6, 0xa3d7, 0xa3d7, 0xa3d7,
-	0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7,
-	0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7,
-	0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3e9, 0xa3f4, 0xa3d7,
-	0xa3f6, 0xa3f4, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3f4,
-	0xa3f4, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3d7,
-	0xa3d7, 0xa426, 0xa3f4, 0xa3d7, 0xa3f0, 0xa3d7, 0xa3d7, 0xa3d7,
-	0xa3f1, 0xa3d7, 0xa3d7, 0xa3d7, 0xa3f4, 0xa41d, 0xa3d7, 0x080c,
-	0x0db4, 0x00d0, 0x2001, 0x000b, 0x0410, 0x2001, 0x0003, 0x00f8,
-	0x2001, 0x0005, 0x00e0, 0x2001, 0x0001, 0x00c8, 0x2001, 0x0009,
-	0x00b0, 0x080c, 0x8589, 0x6003, 0x0005, 0x080c, 0x868e, 0x0070,
-	0x0018, 0x0010, 0x080c, 0x5f42, 0x0804, 0xa437, 0x080c, 0x8589,
-	0x080c, 0xbe9e, 0x6003, 0x0004, 0x080c, 0x868e, 0x0005, 0x080c,
-	0x5f42, 0x080c, 0x8589, 0x6003, 0x0002, 0x0036, 0x2019, 0x185e,
-	0x2304, 0x9084, 0xff00, 0x1120, 0x2001, 0x1955, 0x201c, 0x0040,
-	0x8007, 0x909a, 0x0004, 0x0ec0, 0x8003, 0x801b, 0x831b, 0x9318,
-	0x631a, 0x003e, 0x080c, 0x868e, 0x0c08, 0x080c, 0x8589, 0x080c,
-	0xbbf9, 0x080c, 0x9ac8, 0x080c, 0x868e, 0x08c0, 0x00e6, 0x00f6,
-	0x2071, 0x1894, 0x2079, 0x0000, 0x080c, 0x320a, 0x00fe, 0x00ee,
-	0x080c, 0x8589, 0x080c, 0x9ac8, 0x080c, 0x868e, 0x0838, 0x080c,
-	0x8589, 0x6003, 0x0002, 0x080c, 0xbe9e, 0x0804, 0x868e, 0x2600,
-	0x2008, 0x0002, 0xa454, 0xa454, 0xa454, 0xa437, 0xa437, 0xa454,
-	0xa454, 0xa454, 0xa454, 0xa437, 0xa454, 0xa437, 0xa454, 0xa437,
-	0xa454, 0xa454, 0xa454, 0xa454, 0x080c, 0x0db4, 0x00e6, 0x0096,
-	0x0026, 0x0016, 0x080c, 0xb793, 0x0568, 0x6014, 0x2048, 0xa864,
-	0x9086, 0x0139, 0x11a8, 0xa894, 0x9086, 0x0056, 0x1148, 0x080c,
-	0x4efc, 0x0130, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x0028,
-	0x2001, 0x0030, 0x900e, 0x2011, 0x4005, 0x080c, 0xbd65, 0x0090,
-	0xa868, 0xd0fc, 0x0178, 0xa807, 0x0000, 0x0016, 0x6004, 0x908e,
-	0x0021, 0x0168, 0x908e, 0x003d, 0x0150, 0x001e, 0xa867, 0x0103,
-	0xa833, 0x0100, 0x001e, 0x002e, 0x009e, 0x00ee, 0x0005, 0x001e,
-	0x0009, 0x0cc0, 0x0096, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867,
-	0x0103, 0xa823, 0x8001, 0x009e, 0x0005, 0x00b6, 0x6610, 0x2658,
-	0xb804, 0x9084, 0x00ff, 0x90b2, 0x000c, 0x1a0c, 0x0db4, 0x6604,
-	0x96b6, 0x004d, 0x1120, 0x080c, 0xbc85, 0x0804, 0xa51a, 0x6604,
-	0x96b6, 0x0043, 0x1120, 0x080c, 0xbcce, 0x0804, 0xa51a, 0x6604,
-	0x96b6, 0x004b, 0x1120, 0x080c, 0xbcfa, 0x0804, 0xa51a, 0x6604,
-	0x96b6, 0x0033, 0x1120, 0x080c, 0xbc1b, 0x0804, 0xa51a, 0x6604,
-	0x96b6, 0x0028, 0x1120, 0x080c, 0xb9cb, 0x0804, 0xa51a, 0x6604,
-	0x96b6, 0x0029, 0x1120, 0x080c, 0xba0c, 0x0804, 0xa51a, 0x6604,
-	0x96b6, 0x001f, 0x1118, 0x080c, 0x9ea0, 0x04e0, 0x6604, 0x96b6,
-	0x0000, 0x1118, 0x080c, 0xa1c7, 0x04a8, 0x6604, 0x96b6, 0x0022,
-	0x1118, 0x080c, 0x9ed8, 0x0470, 0x6604, 0x96b6, 0x0035, 0x1118,
-	0x080c, 0x9fe8, 0x0438, 0x6604, 0x96b6, 0x0039, 0x1118, 0x080c,
-	0xa15c, 0x0400, 0x6604, 0x96b6, 0x003d, 0x1118, 0x080c, 0x9f10,
-	0x00c8, 0x6604, 0x96b6, 0x0044, 0x1118, 0x080c, 0x9f4c, 0x0090,
-	0x6604, 0x96b6, 0x0049, 0x1118, 0x080c, 0x9f77, 0x0058, 0x91b6,
-	0x0015, 0x1110, 0x0063, 0x0030, 0x91b6, 0x0016, 0x1128, 0x00be,
-	0x0804, 0xa7d8, 0x00be, 0x0005, 0x080c, 0x9b5d, 0x0cd8, 0xa537,
-	0xa53a, 0xa537, 0xa57e, 0xa537, 0xa70c, 0xa7e5, 0xa537, 0xa537,
-	0xa7b2, 0xa537, 0xa7c6, 0x0096, 0x080c, 0x14f3, 0x6014, 0x2048,
-	0xa800, 0x2048, 0xa867, 0x0103, 0x009e, 0x0804, 0x9ac8, 0xa001,
-	0xa001, 0x0005, 0x00e6, 0x2071, 0x1800, 0x708c, 0x9086, 0x0074,
-	0x1540, 0x080c, 0xceca, 0x11b0, 0x6010, 0x00b6, 0x2058, 0x7030,
-	0xd08c, 0x0128, 0xb800, 0xd0bc, 0x0110, 0xc0c5, 0xb802, 0x00e9,
-	0x00be, 0x2001, 0x0006, 0x080c, 0x5f42, 0x080c, 0x2ea4, 0x080c,
-	0x9ac8, 0x0088, 0x2001, 0x000a, 0x080c, 0x5f42, 0x080c, 0x2ea4,
-	0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x8154, 0x080c, 0x868e,
-	0x0010, 0x080c, 0xa6f7, 0x00ee, 0x0005, 0x00d6, 0xb800, 0xd084,
-	0x0158, 0x9006, 0x080c, 0x5f2e, 0x2069, 0x1853, 0x6804, 0x0020,
-	0x2001, 0x0006, 0x080c, 0x5f6e, 0x00de, 0x0005, 0x00b6, 0x0096,
-	0x00d6, 0x2011, 0x1823, 0x2204, 0x9086, 0x0074, 0x1904, 0xa6d0,
-	0x6010, 0x2058, 0xbaa0, 0x9286, 0x007e, 0x1120, 0x080c, 0xa929,
-	0x0804, 0xa635, 0x00d6, 0x080c, 0x6d14, 0x0198, 0x0026, 0x2011,
-	0x0010, 0x080c, 0x6339, 0x002e, 0x05c8, 0x080c, 0x5167, 0x1540,
-	0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead,
-	0x00f8, 0x0026, 0x2011, 0x8008, 0x080c, 0x6339, 0x002e, 0x0530,
-	0x6014, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140,
-	0x2001, 0x0030, 0x900e, 0x2011, 0x4009, 0x080c, 0xbd65, 0x0040,
-	0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead,
-	0x6010, 0x2058, 0xb9a0, 0x0016, 0x080c, 0x2ea4, 0x080c, 0x9ac8,
-	0x001e, 0x080c, 0x2f76, 0x00de, 0x0804, 0xa6d1, 0x00de, 0x080c,
-	0xa91e, 0x6010, 0x2058, 0xbaa0, 0x9286, 0x0080, 0x1510, 0x6014,
-	0x9005, 0x01a8, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039,
-	0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xbd65,
-	0x0030, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x2001,
-	0x0006, 0x080c, 0x5f42, 0x080c, 0x2ea4, 0x080c, 0x9ac8, 0x0804,
-	0xa6d1, 0x080c, 0xa6df, 0x6014, 0x9005, 0x0190, 0x2048, 0xa868,
-	0xd0f4, 0x01e8, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1d08,
-	0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xbd65, 0x08f8,
-	0x080c, 0xa6d5, 0x0160, 0x9006, 0x080c, 0x5f2e, 0x2001, 0x0004,
-	0x080c, 0x5f6e, 0x2001, 0x0007, 0x080c, 0x5f42, 0x08a0, 0x2001,
-	0x0004, 0x080c, 0x5f42, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c,
-	0x8154, 0x080c, 0x868e, 0x0804, 0xa6d1, 0xb85c, 0xd0e4, 0x01d0,
-	0x080c, 0xbb9b, 0x080c, 0x6d14, 0x0118, 0xd0dc, 0x1904, 0xa5f7,
-	0x2011, 0x1836, 0x2204, 0xc0ad, 0x2012, 0x2001, 0x0002, 0x00f6,
-	0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, 0x257f, 0x78e2, 0x00fe,
-	0x0804, 0xa5f7, 0x080c, 0xbbd8, 0x2011, 0x1836, 0x2204, 0xc0a5,
-	0x2012, 0x0006, 0x080c, 0xd023, 0x000e, 0x1904, 0xa5f7, 0xc0b5,
-	0x2012, 0x2001, 0x0006, 0x080c, 0x5f42, 0x9006, 0x080c, 0x5f2e,
-	0x00c6, 0x2001, 0x180f, 0x2004, 0xd09c, 0x0520, 0x00f6, 0x2079,
-	0x0100, 0x00e6, 0x2071, 0x1800, 0x700c, 0x9084, 0x00ff, 0x78e6,
-	0x707a, 0x7010, 0x78ea, 0x707e, 0x908c, 0x00ff, 0x00ee, 0x780c,
-	0xc0b5, 0x780e, 0x00fe, 0x080c, 0x2554, 0x00f6, 0x2100, 0x900e,
-	0x080c, 0x250b, 0x795a, 0x00fe, 0x9186, 0x0081, 0x01d8, 0x2009,
-	0x0081, 0x00c8, 0x2009, 0x00ef, 0x00f6, 0x2079, 0x0100, 0x79ea,
-	0x7932, 0x7936, 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x2554,
-	0x00f6, 0x2079, 0x1800, 0x797e, 0x2100, 0x900e, 0x080c, 0x250b,
-	0x795a, 0x00fe, 0x8108, 0x080c, 0x5f91, 0x2b00, 0x00ce, 0x1904,
-	0xa5f7, 0x6012, 0x2009, 0x180f, 0x210c, 0xd19c, 0x0150, 0x2009,
-	0x027c, 0x210c, 0x918c, 0x00ff, 0xb912, 0x2009, 0x027d, 0x210c,
-	0xb916, 0x2001, 0x0002, 0x080c, 0x5f42, 0x6023, 0x0001, 0x6003,
-	0x0001, 0x6007, 0x0002, 0x080c, 0x8154, 0x080c, 0x868e, 0x0008,
-	0x0431, 0x00de, 0x009e, 0x00be, 0x0005, 0x2001, 0x1810, 0x2004,
-	0xd0a4, 0x0120, 0x2001, 0x1854, 0x2004, 0xd0ac, 0x0005, 0x00e6,
-	0x080c, 0xd494, 0x0190, 0x2071, 0x0260, 0x7108, 0x720c, 0x918c,
-	0x00ff, 0x1118, 0x9284, 0xff00, 0x0140, 0x6010, 0x2058, 0xb8a0,
-	0x9084, 0xff80, 0x1110, 0xb912, 0xba16, 0x00ee, 0x0005, 0x2030,
-	0x2001, 0x0007, 0x080c, 0x5f42, 0x080c, 0x5167, 0x1120, 0x2001,
-	0x0007, 0x080c, 0x5f6e, 0x080c, 0x2ea4, 0x6020, 0x9086, 0x000a,
-	0x1108, 0x0005, 0x0804, 0x9ac8, 0x00b6, 0x00e6, 0x0026, 0x0016,
-	0x2071, 0x1800, 0x708c, 0x9086, 0x0014, 0x1904, 0xa7a9, 0x00d6,
-	0x080c, 0x6d14, 0x0198, 0x0026, 0x2011, 0x0010, 0x080c, 0x6339,
-	0x002e, 0x05c8, 0x080c, 0x5167, 0x1540, 0x6014, 0x2048, 0xa807,
-	0x0000, 0xa867, 0x0103, 0xa833, 0xdead, 0x00f8, 0x0026, 0x2011,
-	0x8008, 0x080c, 0x6339, 0x002e, 0x0530, 0x6014, 0x2048, 0xa864,
-	0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0030, 0x900e,
-	0x2011, 0x4009, 0x080c, 0xbd65, 0x0040, 0x6014, 0x2048, 0xa807,
-	0x0000, 0xa867, 0x0103, 0xa833, 0xdead, 0x6010, 0x2058, 0xb9a0,
-	0x0016, 0x080c, 0x2ea4, 0x080c, 0x9ac8, 0x001e, 0x080c, 0x2f76,
-	0x00de, 0x0804, 0xa7ad, 0x00de, 0x080c, 0x5167, 0x1170, 0x6014,
-	0x9005, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021,
-	0x0006, 0x080c, 0x4856, 0x004e, 0x003e, 0x00d6, 0x6010, 0x2058,
-	0x080c, 0x608c, 0x080c, 0xa56d, 0x00de, 0x080c, 0xa9ef, 0x1588,
-	0x6010, 0x2058, 0xb890, 0x9005, 0x0560, 0x2001, 0x0006, 0x080c,
-	0x5f42, 0x0096, 0x6014, 0x904d, 0x01d0, 0xa864, 0x9084, 0x00ff,
-	0x9086, 0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000,
-	0x080c, 0xbd65, 0x0060, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0029,
-	0x0130, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x009e,
-	0x080c, 0x2ea4, 0x6020, 0x9086, 0x000a, 0x0138, 0x080c, 0x9ac8,
-	0x0020, 0x080c, 0xa456, 0x080c, 0xa6f7, 0x001e, 0x002e, 0x00ee,
-	0x00be, 0x0005, 0x2011, 0x1823, 0x2204, 0x9086, 0x0014, 0x1160,
-	0x2001, 0x0002, 0x080c, 0x5f42, 0x6003, 0x0001, 0x6007, 0x0001,
-	0x080c, 0x8154, 0x0804, 0x868e, 0x0804, 0xa6f7, 0x2030, 0x2011,
-	0x1823, 0x2204, 0x9086, 0x0004, 0x1148, 0x96b6, 0x000b, 0x1120,
-	0x2001, 0x0007, 0x080c, 0x5f42, 0x0804, 0x9ac8, 0x0804, 0xa6f7,
-	0x0002, 0xa537, 0xa7f0, 0xa537, 0xa82f, 0xa537, 0xa8da, 0xa7e5,
-	0xa537, 0xa537, 0xa8ed, 0xa537, 0xa8fd, 0x6604, 0x9686, 0x0003,
-	0x0904, 0xa70c, 0x96b6, 0x001e, 0x1110, 0x080c, 0x9ac8, 0x0005,
-	0x00b6, 0x00d6, 0x00c6, 0x080c, 0xa90d, 0x11a0, 0x9006, 0x080c,
-	0x5f2e, 0x080c, 0x2e7f, 0x080c, 0xbe9b, 0x2001, 0x0002, 0x080c,
-	0x5f42, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8154, 0x080c,
-	0x868e, 0x0408, 0x2009, 0x026e, 0x2104, 0x9086, 0x0009, 0x1160,
-	0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0170, 0x8001,
-	0xb842, 0x601b, 0x000a, 0x0078, 0x2009, 0x026f, 0x2104, 0x9084,
-	0xff00, 0x9086, 0x1900, 0x1108, 0x08a0, 0x080c, 0x2e7f, 0x080c,
-	0xbe9b, 0x080c, 0xa6f7, 0x00ce, 0x00de, 0x00be, 0x0005, 0x0096,
-	0x00b6, 0x0026, 0x9016, 0x080c, 0xa91b, 0x00d6, 0x2069, 0x194d,
-	0x2d04, 0x9005, 0x0168, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e,
-	0x1138, 0x2069, 0x181f, 0x2d04, 0x8000, 0x206a, 0x00de, 0x0010,
-	0x00de, 0x0088, 0x9006, 0x080c, 0x5f2e, 0x2001, 0x0002, 0x080c,
-	0x5f42, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8154, 0x080c,
-	0x868e, 0x0804, 0xa8aa, 0x080c, 0xb793, 0x01b0, 0x6014, 0x2048,
-	0xa864, 0x2010, 0x9086, 0x0139, 0x1138, 0x6007, 0x0016, 0x2001,
-	0x0002, 0x080c, 0xbdbf, 0x00b0, 0x6014, 0x2048, 0xa864, 0xd0fc,
-	0x0118, 0x2001, 0x0001, 0x0ca8, 0x2001, 0x180e, 0x2004, 0xd0dc,
-	0x0148, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x1110,
-	0x9006, 0x0c38, 0x080c, 0xa456, 0x2009, 0x026e, 0x2134, 0x96b4,
-	0x00ff, 0x9686, 0x0005, 0x0510, 0x9686, 0x000b, 0x01c8, 0x2009,
-	0x026f, 0x2104, 0x9084, 0xff00, 0x1118, 0x9686, 0x0009, 0x01b0,
-	0x9086, 0x1900, 0x1168, 0x9686, 0x0009, 0x0180, 0x2001, 0x0004,
-	0x080c, 0x5f42, 0x2001, 0x0028, 0x601a, 0x6007, 0x0052, 0x0010,
-	0x080c, 0xa6f7, 0x002e, 0x00be, 0x009e, 0x0005, 0x9286, 0x0139,
-	0x0160, 0x6014, 0x2048, 0x080c, 0xb793, 0x0140, 0xa864, 0x9086,
-	0x0139, 0x0118, 0xa868, 0xd0fc, 0x0108, 0x0c50, 0x6010, 0x2058,
-	0xb840, 0x9084, 0x00ff, 0x9005, 0x0138, 0x8001, 0xb842, 0x601b,
-	0x000a, 0x6007, 0x0016, 0x08f0, 0xb8a0, 0x9086, 0x007e, 0x1138,
-	0x00e6, 0x2071, 0x1800, 0x080c, 0x5a27, 0x00ee, 0x0010, 0x080c,
-	0x2e7f, 0x0870, 0x080c, 0xa91b, 0x1160, 0x2001, 0x0004, 0x080c,
-	0x5f42, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x8154, 0x0804,
-	0x868e, 0x080c, 0xa456, 0x0804, 0xa6f7, 0x0469, 0x1160, 0x2001,
-	0x0008, 0x080c, 0x5f42, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c,
-	0x8154, 0x0804, 0x868e, 0x0804, 0xa6f7, 0x00e9, 0x1160, 0x2001,
-	0x000a, 0x080c, 0x5f42, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c,
-	0x8154, 0x0804, 0x868e, 0x0804, 0xa6f7, 0x2009, 0x026e, 0x2104,
-	0x9086, 0x0003, 0x1138, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00,
-	0x9086, 0x2a00, 0x0005, 0x9085, 0x0001, 0x0005, 0x00b6, 0x00c6,
-	0x0016, 0x6110, 0x2158, 0x080c, 0x6000, 0x001e, 0x00ce, 0x00be,
-	0x0005, 0x00b6, 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, 0x6010,
-	0x2058, 0x2009, 0x1836, 0x2104, 0x9085, 0x0003, 0x200a, 0x080c,
-	0xa9c1, 0x0560, 0x2009, 0x1836, 0x2104, 0xc0cd, 0x200a, 0x080c,
-	0x6311, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xd188,
-	0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009,
-	0x0001, 0x080c, 0x2e4a, 0x00e6, 0x2071, 0x1800, 0x080c, 0x2c63,
-	0x00ee, 0x00c6, 0x0156, 0x20a9, 0x0781, 0x2009, 0x007f, 0x080c,
-	0x2f76, 0x8108, 0x1f04, 0xa95f, 0x015e, 0x00ce, 0x080c, 0xa91e,
-	0x2071, 0x0260, 0x2079, 0x0200, 0x7817, 0x0001, 0x2001, 0x1836,
-	0x200c, 0xc1c5, 0x7018, 0xd0fc, 0x0110, 0xd0dc, 0x0118, 0x7038,
-	0xd0dc, 0x1108, 0xc1c4, 0x7817, 0x0000, 0x2001, 0x1836, 0x2102,
-	0x2079, 0x0100, 0x2e04, 0x9084, 0x00ff, 0x2069, 0x181e, 0x206a,
-	0x78e6, 0x0006, 0x8e70, 0x2e04, 0x2069, 0x181f, 0x206a, 0x78ea,
-	0x7832, 0x7836, 0x2010, 0x9084, 0xff00, 0x001e, 0x9105, 0x2009,
-	0x182b, 0x200a, 0x2200, 0x9084, 0x00ff, 0x2008, 0x080c, 0x2554,
-	0x080c, 0x6d14, 0x0170, 0x2071, 0x0260, 0x2069, 0x1951, 0x7048,
-	0x206a, 0x704c, 0x6806, 0x7050, 0x680a, 0x7054, 0x680e, 0x080c,
-	0xbb9b, 0x0040, 0x2001, 0x0006, 0x080c, 0x5f42, 0x080c, 0x2ea4,
-	0x080c, 0x9ac8, 0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x00be,
-	0x0005, 0x0096, 0x0026, 0x0036, 0x00e6, 0x0156, 0x2019, 0x182b,
-	0x231c, 0x83ff, 0x01f0, 0x2071, 0x0260, 0x7200, 0x9294, 0x00ff,
-	0x7004, 0x9084, 0xff00, 0x9205, 0x9306, 0x1198, 0x2011, 0x0276,
-	0x20a9, 0x0004, 0x2b48, 0x2019, 0x000a, 0x080c, 0xaaa3, 0x1148,
-	0x2011, 0x027a, 0x20a9, 0x0004, 0x2019, 0x0006, 0x080c, 0xaaa3,
-	0x1100, 0x015e, 0x00ee, 0x003e, 0x002e, 0x009e, 0x0005, 0x00e6,
-	0x2071, 0x0260, 0x7034, 0x9086, 0x0014, 0x11a8, 0x7038, 0x9086,
-	0x0800, 0x1188, 0x703c, 0xd0ec, 0x0160, 0x9084, 0x0f00, 0x9086,
-	0x0100, 0x1138, 0x7054, 0xd0a4, 0x1110, 0xd0ac, 0x0110, 0x9006,
-	0x0010, 0x9085, 0x0001, 0x00ee, 0x0005, 0x00e6, 0x0096, 0x00c6,
-	0x0076, 0x0056, 0x0046, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000,
-	0x2029, 0x19bf, 0x252c, 0x2021, 0x19c5, 0x2424, 0x2061, 0x1cd0,
-	0x2071, 0x1800, 0x7250, 0x7070, 0x9202, 0x1a04, 0xaa7b, 0x080c,
-	0xd1b4, 0x0904, 0xaa74, 0x6720, 0x9786, 0x0007, 0x0904, 0xaa74,
-	0x2500, 0x9c06, 0x0904, 0xaa74, 0x2400, 0x9c06, 0x05e8, 0x3e08,
-	0x9186, 0x0002, 0x1148, 0x6010, 0x9005, 0x0130, 0x00b6, 0x2058,
-	0xb800, 0x00be, 0xd0bc, 0x1580, 0x00c6, 0x6000, 0x9086, 0x0004,
-	0x1110, 0x080c, 0x185b, 0x9786, 0x000a, 0x0148, 0x080c, 0xb992,
-	0x1130, 0x00ce, 0x080c, 0xa456, 0x080c, 0x9af8, 0x00e8, 0x6014,
-	0x2048, 0x080c, 0xb793, 0x01a8, 0x9786, 0x0003, 0x1530, 0xa867,
-	0x0103, 0xab7a, 0xa877, 0x0000, 0xa87c, 0xd0cc, 0x0130, 0x0096,
-	0xa878, 0x2048, 0x080c, 0x0f9e, 0x009e, 0x080c, 0x65e5, 0x080c,
-	0xb975, 0x080c, 0x9af8, 0x00ce, 0x9ce0, 0x0018, 0x7064, 0x9c02,
-	0x1210, 0x0804, 0xaa22, 0x012e, 0x000e, 0x002e, 0x004e, 0x005e,
-	0x007e, 0x00ce, 0x009e, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1118,
-	0x080c, 0xd133, 0x0c30, 0x9786, 0x000a, 0x0998, 0x0880, 0x220c,
-	0x2304, 0x9106, 0x1130, 0x8210, 0x8318, 0x1f04, 0xaa8f, 0x9006,
-	0x0005, 0x2304, 0x9102, 0x0218, 0x2001, 0x0001, 0x0008, 0x9006,
-	0x918d, 0x0001, 0x0005, 0x0136, 0x01c6, 0x0016, 0x8906, 0x8006,
-	0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9300, 0x2098,
-	0x3518, 0x20a9, 0x0001, 0x220c, 0x4002, 0x910e, 0x1140, 0x8210,
-	0x8319, 0x1dc8, 0x9006, 0x001e, 0x01ce, 0x013e, 0x0005, 0x220c,
-	0x9102, 0x0218, 0x2001, 0x0001, 0x0010, 0x2001, 0x0000, 0x918d,
-	0x0001, 0x001e, 0x01ce, 0x013e, 0x0005, 0x6004, 0x908a, 0x0053,
-	0x1a0c, 0x0db4, 0x080c, 0xb981, 0x0120, 0x080c, 0xb992, 0x0168,
-	0x0028, 0x080c, 0x2ea4, 0x080c, 0xb992, 0x0138, 0x080c, 0x8589,
-	0x080c, 0x9ac8, 0x080c, 0x868e, 0x0005, 0x080c, 0xa456, 0x0cb0,
-	0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005,
-	0xab04, 0xab04, 0xab04, 0xab04, 0xab04, 0xab04, 0xab04, 0xab04,
-	0xab04, 0xab04, 0xab04, 0xab06, 0xab06, 0xab06, 0xab06, 0xab04,
-	0xab04, 0xab04, 0xab06, 0xab04, 0x080c, 0x0db4, 0x600b, 0xffff,
-	0x6003, 0x0001, 0x6106, 0x080c, 0x810c, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x868e, 0x012e, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004,
-	0x9082, 0x0040, 0x0804, 0xabbb, 0x9186, 0x0027, 0x1520, 0x080c,
-	0x8589, 0x080c, 0x2e7f, 0x080c, 0xbe9b, 0x0096, 0x6114, 0x2148,
-	0x080c, 0xb793, 0x0198, 0x080c, 0xb992, 0x1118, 0x080c, 0xa456,
-	0x0068, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, 0x0000, 0xa97c,
-	0xc1c5, 0xa97e, 0x080c, 0x65f2, 0x080c, 0xb975, 0x009e, 0x080c,
-	0x9ac8, 0x0804, 0x868e, 0x9186, 0x0014, 0x1120, 0x6004, 0x9082,
-	0x0040, 0x04a0, 0x9186, 0x0046, 0x0150, 0x9186, 0x0045, 0x0138,
-	0x9186, 0x0053, 0x0120, 0x9186, 0x0048, 0x190c, 0x0db4, 0x2001,
-	0x0109, 0x2004, 0xd084, 0x0508, 0x0126, 0x2091, 0x2800, 0x0006,
-	0x0016, 0x0026, 0x0036, 0x00f6, 0x00e6, 0x00c6, 0x2079, 0x19b6,
-	0x2071, 0x1800, 0x2061, 0x0100, 0x080c, 0x7ff8, 0x00ce, 0x00ee,
-	0x00fe, 0x003e, 0x002e, 0x001e, 0x000e, 0x012e, 0xa001, 0x6000,
-	0x9086, 0x0002, 0x1110, 0x0804, 0xabf9, 0x0005, 0x0002, 0xab95,
-	0xab93, 0xab93, 0xab93, 0xab93, 0xab93, 0xab93, 0xab93, 0xab93,
-	0xab93, 0xab93, 0xabb0, 0xabb0, 0xabb0, 0xabb0, 0xab93, 0xabb0,
-	0xab93, 0xabb0, 0xab93, 0x080c, 0x0db4, 0x080c, 0x8589, 0x0096,
-	0x6114, 0x2148, 0x080c, 0xb793, 0x0168, 0xa867, 0x0103, 0xa87b,
-	0x0006, 0xa877, 0x0000, 0xa880, 0xc0ec, 0xa882, 0x080c, 0x65f2,
-	0x080c, 0xb975, 0x009e, 0x080c, 0x9ac8, 0x080c, 0x868e, 0x0005,
-	0x080c, 0x8589, 0x080c, 0xb992, 0x090c, 0xa456, 0x080c, 0x9ac8,
-	0x080c, 0x868e, 0x0005, 0x0002, 0xabd2, 0xabd0, 0xabd0, 0xabd0,
-	0xabd0, 0xabd0, 0xabd0, 0xabd0, 0xabd0, 0xabd0, 0xabd0, 0xabe9,
-	0xabe9, 0xabe9, 0xabe9, 0xabd0, 0xabf3, 0xabd0, 0xabe9, 0xabd0,
-	0x080c, 0x0db4, 0x0096, 0x080c, 0x8589, 0x6014, 0x2048, 0x2001,
-	0x1957, 0x2004, 0x6042, 0xa97c, 0xd1ac, 0x0140, 0x6003, 0x0004,
-	0xa87c, 0x9085, 0x0400, 0xa87e, 0x009e, 0x0005, 0x6003, 0x0002,
-	0x0cb8, 0x080c, 0x8589, 0x080c, 0xbe9e, 0x080c, 0xbea3, 0x6003,
-	0x000f, 0x0804, 0x868e, 0x080c, 0x8589, 0x080c, 0x9ac8, 0x0804,
-	0x868e, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a,
-	0x0005, 0xac15, 0xac15, 0xac15, 0xac15, 0xac15, 0xac17, 0xacf4,
-	0xac15, 0xad28, 0xac15, 0xac15, 0xac15, 0xac15, 0xac15, 0xac15,
-	0xac15, 0xac15, 0xac15, 0xac15, 0xad28, 0x080c, 0x0db4, 0x00b6,
-	0x0096, 0x6114, 0x2148, 0x7644, 0x96b4, 0x0fff, 0x86ff, 0x1528,
-	0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xace3, 0xa87b, 0x0000,
-	0xa867, 0x0103, 0xae76, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938,
-	0x9115, 0x190c, 0xaebd, 0x080c, 0x640d, 0x6210, 0x2258, 0xba3c,
-	0x82ff, 0x0110, 0x8211, 0xba3e, 0x7044, 0xd0e4, 0x1904, 0xacc7,
-	0x080c, 0x9ac8, 0x009e, 0x00be, 0x0005, 0x968c, 0x0c00, 0x0150,
-	0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xaccb, 0x7348, 0xab92,
-	0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0508, 0x9186,
-	0x0028, 0x1118, 0xa87b, 0x001c, 0x00e8, 0xd6dc, 0x01a0, 0xa87b,
-	0x0015, 0xa87c, 0xd0ac, 0x0170, 0xa938, 0xaa34, 0x2100, 0x9205,
-	0x0148, 0x7048, 0x9106, 0x1118, 0x704c, 0x9206, 0x0118, 0xa992,
-	0xaa8e, 0xc6dc, 0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010,
-	0xa87b, 0x0000, 0xa867, 0x0103, 0xae76, 0x901e, 0xd6c4, 0x01d8,
-	0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4, 0x0804,
-	0xac1e, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210,
-	0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025,
-	0x080c, 0xb3a8, 0x003e, 0xd6cc, 0x0904, 0xac33, 0x7154, 0xa98a,
-	0x81ff, 0x0904, 0xac33, 0x9192, 0x0021, 0x1278, 0x8304, 0x9098,
-	0x0018, 0x2011, 0x0029, 0x080c, 0xb3a8, 0x2011, 0x0205, 0x2013,
-	0x0000, 0x080c, 0xbe2b, 0x0804, 0xac33, 0xa868, 0xd0fc, 0x0120,
-	0x2009, 0x0020, 0xa98a, 0x0c50, 0x00a6, 0x2950, 0x080c, 0xb347,
-	0x00ae, 0x080c, 0xbe2b, 0x080c, 0xb398, 0x0804, 0xac35, 0x080c,
-	0xba85, 0x0804, 0xac42, 0xa87c, 0xd0ac, 0x0904, 0xac4e, 0xa880,
-	0xd0bc, 0x1904, 0xac4e, 0x7348, 0xa838, 0x9306, 0x11c8, 0x734c,
-	0xa834, 0x931e, 0x0904, 0xac4e, 0xd6d4, 0x0190, 0xab38, 0x9305,
-	0x0904, 0xac4e, 0x0068, 0xa87c, 0xd0ac, 0x0904, 0xac26, 0xa838,
-	0xa934, 0x9105, 0x0904, 0xac26, 0xa880, 0xd0bc, 0x1904, 0xac26,
-	0x080c, 0xbabf, 0x0804, 0xac42, 0x0096, 0x00f6, 0x6003, 0x0003,
-	0x6007, 0x0043, 0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08,
-	0x6014, 0x2048, 0xa87c, 0xd0ac, 0x0140, 0x6003, 0x0002, 0x00fe,
-	0x009e, 0x0005, 0x2130, 0x2228, 0x0058, 0x2400, 0xa9ac, 0x910a,
-	0x2300, 0xaab0, 0x9213, 0x2600, 0x9102, 0x2500, 0x9203, 0x0e90,
-	0xac36, 0xab3a, 0xae46, 0xad4a, 0x00fe, 0x6043, 0x0000, 0x2c10,
-	0x080c, 0x19aa, 0x080c, 0x8171, 0x080c, 0x8769, 0x009e, 0x0005,
-	0x0005, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a,
-	0x0005, 0xad45, 0xad45, 0xad45, 0xad45, 0xad45, 0xad47, 0xaddd,
-	0xad45, 0xad45, 0xadf4, 0xae80, 0xad45, 0xad45, 0xad45, 0xad45,
-	0xae95, 0xad45, 0xad45, 0xad45, 0xad45, 0x080c, 0x0db4, 0x0076,
-	0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260, 0x6114, 0x2150, 0x7644,
-	0xb676, 0x96b4, 0x0fff, 0xb77c, 0xc7e5, 0xb77e, 0x6210, 0x00b6,
-	0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0x00be, 0x86ff,
-	0x0904, 0xadd8, 0x9694, 0xff00, 0x9284, 0x0c00, 0x0120, 0x7048,
-	0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, 0xadd8, 0x080c,
-	0x0fec, 0x090c, 0x0db4, 0x2900, 0xb07a, 0xb77c, 0xc7cd, 0xb77e,
-	0xa867, 0x0103, 0xb068, 0xa86a, 0xb06c, 0xa86e, 0xb070, 0xa872,
-	0xae76, 0x968c, 0x0c00, 0x0120, 0x7348, 0xab92, 0x734c, 0xab8e,
-	0x968c, 0x00ff, 0x9186, 0x0002, 0x0180, 0x9186, 0x0028, 0x1118,
-	0xa87b, 0x001c, 0x0060, 0xd6dc, 0x0118, 0xa87b, 0x0015, 0x0038,
-	0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, 0xaf7e,
-	0xb080, 0xa882, 0xb084, 0xa886, 0x901e, 0xd6c4, 0x0190, 0x735c,
-	0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008,
-	0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, 0xb3a8,
-	0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8, 0x9192,
-	0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c,
-	0xb3a8, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0xb068, 0xd0fc,
-	0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, 0x080c, 0xb347,
-	0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005, 0x00f6, 0x00a6, 0x6003,
-	0x0003, 0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6014,
-	0x2050, 0xb436, 0xb33a, 0xb646, 0xb54a, 0x00ae, 0x00fe, 0x2c10,
-	0x080c, 0x19aa, 0x0804, 0x908e, 0x6003, 0x0002, 0x6004, 0x9086,
-	0x0040, 0x11c8, 0x0096, 0x6014, 0x2048, 0xa87c, 0xd0ac, 0x0160,
-	0x601c, 0xd084, 0x1130, 0x00f6, 0x2c00, 0x2078, 0x080c, 0x15ad,
-	0x00fe, 0x6003, 0x0004, 0x0010, 0x6003, 0x0002, 0x009e, 0x080c,
-	0x8589, 0x080c, 0x868e, 0x0096, 0x2001, 0x1957, 0x2004, 0x6042,
-	0x080c, 0x863e, 0x080c, 0x8769, 0x6114, 0x2148, 0xa97c, 0xd1e4,
-	0x0904, 0xae7b, 0xd1cc, 0x05a8, 0xa978, 0xa868, 0xd0fc, 0x0538,
-	0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, 0xa860, 0x20e8, 0xa85c,
-	0x9080, 0x0019, 0x20a0, 0x810e, 0x810e, 0x810f, 0x9184, 0x003f,
-	0x20e0, 0x9184, 0xffc0, 0x9080, 0x0019, 0x2098, 0x0156, 0x20a9,
-	0x0020, 0x4003, 0x015e, 0x000e, 0xa882, 0x000e, 0xa87e, 0x001e,
-	0xa874, 0x0006, 0x2148, 0x080c, 0x0f9e, 0x001e, 0x0440, 0x0016,
-	0x080c, 0x0f9e, 0x009e, 0xa974, 0x0016, 0x080c, 0xb398, 0x001e,
-	0x00f0, 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff, 0x90b6, 0x0002,
-	0x0180, 0x9086, 0x0028, 0x1118, 0xa87b, 0x001c, 0x0060, 0xd1dc,
-	0x0118, 0xa87b, 0x0015, 0x0038, 0xd1d4, 0x0118, 0xa87b, 0x0007,
-	0x0010, 0xa87b, 0x0000, 0x0016, 0x080c, 0x640d, 0x001e, 0xd1e4,
-	0x1120, 0x080c, 0x9ac8, 0x009e, 0x0005, 0x080c, 0xba85, 0x0cd8,
-	0x6004, 0x9086, 0x0040, 0x1120, 0x080c, 0x8589, 0x080c, 0x868e,
-	0x2019, 0x0001, 0x080c, 0x935a, 0x6003, 0x0002, 0x080c, 0xbea3,
-	0x080c, 0x863e, 0x080c, 0x8769, 0x0005, 0x6004, 0x9086, 0x0040,
-	0x1120, 0x080c, 0x8589, 0x080c, 0x868e, 0x2019, 0x0001, 0x080c,
-	0x935a, 0x080c, 0x863e, 0x080c, 0x2e7f, 0x080c, 0xbe9b, 0x0096,
-	0x6114, 0x2148, 0x080c, 0xb793, 0x0150, 0xa867, 0x0103, 0xa87b,
-	0x0029, 0xa877, 0x0000, 0x080c, 0x65f2, 0x080c, 0xb975, 0x009e,
-	0x080c, 0x9ac8, 0x080c, 0x8769, 0x0005, 0xa87b, 0x0015, 0xd1fc,
-	0x0180, 0xa87b, 0x0007, 0x8002, 0x8000, 0x810a, 0x9189, 0x0000,
-	0x0006, 0x0016, 0x2009, 0x1a47, 0x2104, 0x8000, 0x200a, 0x001e,
-	0x000e, 0xa992, 0xa88e, 0x0005, 0x9182, 0x0054, 0x1220, 0x9182,
-	0x0040, 0x0208, 0x000a, 0x0005, 0xaef0, 0xaef0, 0xaef0, 0xaef0,
-	0xaef0, 0xaef2, 0xaef0, 0xaef0, 0xaf98, 0xaef0, 0xaef0, 0xaef0,
-	0xaef0, 0xaef0, 0xaef0, 0xaef0, 0xaef0, 0xaef0, 0xaef0, 0xb0c9,
-	0x080c, 0x0db4, 0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260,
-	0x6114, 0x2150, 0x7644, 0xb676, 0x96b4, 0x0fff, 0xb77c, 0xc7e5,
-	0xb77e, 0x6210, 0x00b6, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211,
-	0xba3e, 0x00be, 0x86ff, 0x0904, 0xaf91, 0x9694, 0xff00, 0x9284,
-	0x0c00, 0x0120, 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300,
-	0x0904, 0xaf91, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118,
-	0xc6c4, 0xb676, 0x0c38, 0x080c, 0x0fec, 0x090c, 0x0db4, 0x2900,
-	0xb07a, 0xb77c, 0x97bd, 0x0200, 0xb77e, 0xa867, 0x0103, 0xb068,
-	0xa86a, 0xb06c, 0xa86e, 0xb070, 0xa872, 0x7044, 0x9084, 0xf000,
-	0x9635, 0xae76, 0x968c, 0x0c00, 0x0120, 0x7348, 0xab92, 0x734c,
+	0x006e, 0x0005, 0x9f1a, 0x9f1a, 0x9f5d, 0x9ffc, 0xa091, 0x9f1a,
+	0x9f1a, 0x9f1a, 0x9f1c, 0x9f1a, 0x9f1a, 0x9f1a, 0x9f1a, 0x9f1a,
+	0x9f1a, 0x9f1a, 0x080c, 0x0db4, 0x9186, 0x004c, 0x0588, 0x9186,
+	0x0003, 0x190c, 0x0db4, 0x0096, 0x601c, 0xc0ed, 0x601e, 0x6003,
+	0x0003, 0x6106, 0x6014, 0x2048, 0xa87c, 0x9084, 0xa000, 0xc0b5,
+	0xa87e, 0xa8ac, 0xa846, 0xa8b0, 0xa84a, 0x9006, 0xa836, 0xa83a,
+	0xa884, 0x9092, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x8013,
+	0x8213, 0x9210, 0x621a, 0x009e, 0x2c10, 0x080c, 0x1a5c, 0x080c,
+	0x842e, 0x0126, 0x2091, 0x8000, 0x080c, 0x8a26, 0x012e, 0x0005,
+	0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x080c, 0xa0b3,
+	0x080c, 0xc211, 0x6003, 0x0007, 0x0005, 0x00d6, 0x0096, 0x00f6,
+	0x2079, 0x1800, 0x7a8c, 0x6014, 0x2048, 0xa87c, 0xd0ec, 0x1110,
+	0x9290, 0x0018, 0xac78, 0xc4fc, 0x0046, 0xa8e0, 0x9005, 0x1140,
+	0xa8dc, 0x921a, 0x0140, 0x0220, 0xa87b, 0x0007, 0x2010, 0x0028,
+	0xa87b, 0x0015, 0x0010, 0xa87b, 0x0000, 0x8214, 0xa883, 0x0000,
+	0xaa02, 0x0006, 0x0016, 0x0026, 0x00c6, 0x00d6, 0x00e6, 0x00f6,
+	0x2400, 0x9005, 0x1108, 0x009a, 0x2100, 0x9086, 0x0015, 0x1118,
+	0x2001, 0x0001, 0x0038, 0x2100, 0x9086, 0x0016, 0x0118, 0x2001,
+	0x0001, 0x002a, 0x94a4, 0x0007, 0x8423, 0x9405, 0x0002, 0x9fc4,
+	0x9fc4, 0x9fbf, 0x9fc2, 0x9fc4, 0x9fbc, 0x9faf, 0x9faf, 0x9faf,
+	0x9faf, 0x9faf, 0x9faf, 0x9faf, 0x9faf, 0x9faf, 0x9faf, 0x00fe,
+	0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x000e, 0x004e, 0x00fe,
+	0x009e, 0x00de, 0x080c, 0x0db4, 0x080c, 0xaa5d, 0x0028, 0x080c,
+	0xab80, 0x0010, 0x080c, 0xac6f, 0x00fe, 0x00ee, 0x00de, 0x00ce,
+	0x002e, 0x001e, 0x2c00, 0xa896, 0x000e, 0x080c, 0xa171, 0x0530,
+	0xa804, 0xa80e, 0x00a6, 0x2050, 0xb100, 0x00ae, 0x8006, 0x8006,
+	0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0xaacc,
+	0xabd0, 0xacd4, 0xadd8, 0x2031, 0x0000, 0x2041, 0x1249, 0x080c,
+	0xa31b, 0x0160, 0x000e, 0x9005, 0x0120, 0x00fe, 0x009e, 0x00de,
+	0x0005, 0x00fe, 0x009e, 0x00de, 0x0804, 0x9e19, 0x2001, 0x002c,
+	0x900e, 0x080c, 0xa1d7, 0x0c70, 0x91b6, 0x0015, 0x0170, 0x91b6,
+	0x0016, 0x0158, 0x91b2, 0x0047, 0x0a0c, 0x0db4, 0x91b2, 0x0050,
+	0x1a0c, 0x0db4, 0x9182, 0x0047, 0x00ca, 0x2001, 0x0109, 0x2004,
+	0xd08c, 0x0198, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026,
+	0x080c, 0x8382, 0x002e, 0x001e, 0x000e, 0x012e, 0xa001, 0x6000,
+	0x9086, 0x0002, 0x1110, 0x0804, 0x9f5d, 0x0005, 0xa02f, 0xa02f,
+	0xa031, 0xa067, 0xa02f, 0xa02f, 0xa02f, 0xa02f, 0xa07a, 0x080c,
+	0x0db4, 0x00d6, 0x0016, 0x0096, 0x080c, 0x88fb, 0x080c, 0x8a26,
+	0x6003, 0x0004, 0x6114, 0x2148, 0xa87c, 0xd0fc, 0x01c0, 0xa878,
+	0xc0fc, 0x9005, 0x1158, 0xa894, 0x9005, 0x0140, 0x2001, 0x0000,
+	0x900e, 0x080c, 0xa1d7, 0x080c, 0x9e19, 0x00a8, 0x6003, 0x0002,
+	0xa8a4, 0xa9a8, 0x9105, 0x1178, 0xa8ae, 0xa8b2, 0x0c78, 0xa87f,
+	0x0020, 0xa88c, 0xa88a, 0xa8a4, 0xa8ae, 0xa8a8, 0xa8b2, 0xa8c7,
+	0x0000, 0xa8cb, 0x0000, 0x009e, 0x001e, 0x00de, 0x0005, 0x080c,
+	0x88fb, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, 0xbafe, 0x0120,
+	0xa87b, 0x0006, 0x080c, 0x6885, 0x009e, 0x00de, 0x080c, 0x9e19,
+	0x0804, 0x8a26, 0x080c, 0x88fb, 0x080c, 0x2fd7, 0x080c, 0xc20e,
+	0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, 0xbafe, 0x0120, 0xa87b,
+	0x0029, 0x080c, 0x6885, 0x009e, 0x00de, 0x080c, 0x9e19, 0x0804,
+	0x8a26, 0x9182, 0x0047, 0x0002, 0xa0a1, 0xa0a3, 0xa0a1, 0xa0a1,
+	0xa0a1, 0xa0a1, 0xa0a1, 0xa0a1, 0xa0a1, 0xa0a1, 0xa0a1, 0xa0a1,
+	0xa0a3, 0x080c, 0x0db4, 0x00d6, 0x0096, 0x080c, 0x150f, 0x6114,
+	0x2148, 0xa87b, 0x0000, 0xa883, 0x0000, 0x080c, 0x6885, 0x009e,
+	0x00de, 0x0804, 0x9e19, 0x0026, 0x0036, 0x0056, 0x0066, 0x0096,
+	0x00a6, 0x00f6, 0x0006, 0x080c, 0x0feb, 0x000e, 0x090c, 0x0db4,
+	0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e, 0x20a9,
+	0x0020, 0x4104, 0xa87a, 0x2079, 0x1800, 0x798c, 0x9188, 0x0018,
+	0x918c, 0x0fff, 0xa972, 0xac76, 0x2950, 0x00a6, 0x2001, 0x0205,
+	0x2003, 0x0000, 0x901e, 0x2029, 0x0001, 0x9182, 0x0034, 0x1228,
+	0x2011, 0x001f, 0x080c, 0xb6f9, 0x04c0, 0x2130, 0x2009, 0x0034,
+	0x2011, 0x001f, 0x080c, 0xb6f9, 0x96b2, 0x0034, 0xb004, 0x904d,
+	0x0110, 0x080c, 0x0f9d, 0x080c, 0x0feb, 0x01d0, 0x8528, 0xa867,
+	0x0110, 0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, 0x1230,
+	0x2608, 0x2011, 0x001b, 0x080c, 0xb6f9, 0x00b8, 0x96b2, 0x003c,
+	0x2009, 0x003c, 0x2950, 0x2011, 0x001b, 0x080c, 0xb6f9, 0x0c18,
+	0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0050,
+	0xb566, 0xb070, 0xc0fd, 0xb072, 0x0048, 0x2001, 0x0205, 0x2003,
+	0x0000, 0x00ae, 0x852f, 0x95ad, 0x0050, 0xb566, 0x2a48, 0xa804,
+	0xa807, 0x0000, 0x0006, 0x080c, 0x6885, 0x000e, 0x2048, 0x9005,
+	0x1db0, 0x00fe, 0x00ae, 0x009e, 0x006e, 0x005e, 0x003e, 0x002e,
+	0x0005, 0x00d6, 0x00f6, 0x0096, 0x0006, 0x080c, 0x0feb, 0x000e,
+	0x090c, 0x0db4, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0,
+	0x900e, 0x20a9, 0x0020, 0x4104, 0xaa66, 0xa87a, 0x2079, 0x1800,
+	0x798c, 0x810c, 0x9188, 0x000c, 0x9182, 0x001a, 0x0210, 0x2009,
+	0x001a, 0x21a8, 0x810b, 0xa972, 0xac76, 0x2e98, 0xa85c, 0x9080,
+	0x001f, 0x20a0, 0x2001, 0x0205, 0x200c, 0x918d, 0x0080, 0x2102,
+	0x4003, 0x2003, 0x0000, 0x080c, 0x6885, 0x009e, 0x00fe, 0x00de,
+	0x0005, 0x0016, 0x00d6, 0x00f6, 0x0096, 0x0016, 0x2001, 0x0205,
+	0x200c, 0x918d, 0x0080, 0x2102, 0x001e, 0x2079, 0x0200, 0x2e98,
+	0xa87c, 0xd0ec, 0x0118, 0x9e80, 0x000c, 0x2098, 0x2021, 0x003e,
+	0x901e, 0x9282, 0x0020, 0x0218, 0x2011, 0x0020, 0x2018, 0x9486,
+	0x003e, 0x1170, 0x0096, 0x080c, 0x0feb, 0x2900, 0x009e, 0x05c0,
+	0xa806, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0,
+	0x3300, 0x908e, 0x0260, 0x0140, 0x2009, 0x0280, 0x9102, 0x920a,
+	0x0218, 0x2010, 0x2100, 0x9318, 0x2200, 0x9402, 0x1228, 0x2400,
+	0x9202, 0x2410, 0x9318, 0x9006, 0x2020, 0x22a8, 0xa800, 0x9200,
+	0xa802, 0x20e1, 0x0000, 0x4003, 0x83ff, 0x0180, 0x3300, 0x9086,
+	0x0280, 0x1130, 0x7814, 0x8000, 0x9085, 0x0080, 0x7816, 0x2e98,
+	0x2310, 0x84ff, 0x0904, 0xa186, 0x0804, 0xa188, 0x9085, 0x0001,
+	0x7817, 0x0000, 0x009e, 0x00fe, 0x00de, 0x001e, 0x0005, 0x00d6,
+	0x0036, 0x0096, 0x6314, 0x2348, 0xa87a, 0xa982, 0x080c, 0x6878,
+	0x009e, 0x003e, 0x00de, 0x0005, 0x91b6, 0x0015, 0x1118, 0x080c,
+	0x9e19, 0x0030, 0x91b6, 0x0016, 0x190c, 0x0db4, 0x080c, 0x9e19,
+	0x0005, 0x20a9, 0x000e, 0x20e1, 0x0000, 0x2e98, 0x6014, 0x0096,
+	0x2048, 0xa860, 0x20e8, 0xa85c, 0x20a0, 0x009e, 0x4003, 0x0136,
+	0x9080, 0x001b, 0x2011, 0x0006, 0x20a9, 0x0001, 0x3418, 0x8318,
+	0x23a0, 0x4003, 0x3318, 0x8318, 0x2398, 0x8211, 0x1db8, 0x2011,
+	0x0006, 0x013e, 0x20a0, 0x3318, 0x8318, 0x2398, 0x4003, 0x3418,
+	0x8318, 0x23a0, 0x8211, 0x1db8, 0x0096, 0x080c, 0xbafe, 0x0130,
+	0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0x009e, 0x0804,
+	0x9e19, 0x0096, 0x00d6, 0x0036, 0x7330, 0x9386, 0x0200, 0x11a8,
+	0x6010, 0x00b6, 0x2058, 0xb8bf, 0x0000, 0x00be, 0x6014, 0x9005,
+	0x0130, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xab32, 0x080c,
+	0x9e19, 0x003e, 0x00de, 0x009e, 0x0005, 0x0011, 0x1d48, 0x0cc8,
+	0x0006, 0x0016, 0x080c, 0xc1f9, 0x0188, 0x6014, 0x9005, 0x1170,
+	0x600b, 0x0003, 0x601b, 0x0000, 0x6043, 0x0000, 0x2009, 0x0022,
+	0x080c, 0xa5f8, 0x9006, 0x001e, 0x000e, 0x0005, 0x9085, 0x0001,
+	0x0cd0, 0x0096, 0x0016, 0x20a9, 0x0014, 0x9e80, 0x000c, 0x20e1,
+	0x0000, 0x2098, 0x6014, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080,
+	0x0002, 0x20a0, 0x4003, 0x2001, 0x0205, 0x2003, 0x0001, 0x2099,
+	0x0260, 0x20a9, 0x0016, 0x4003, 0x20a9, 0x000a, 0xa804, 0x2048,
+	0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x2001,
+	0x0205, 0x2003, 0x0002, 0x2099, 0x0260, 0x20a9, 0x0020, 0x4003,
+	0x2003, 0x0000, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103,
+	0x080c, 0x9e19, 0x001e, 0x009e, 0x0005, 0x0096, 0x0016, 0x900e,
+	0x7030, 0x9086, 0x0100, 0x0140, 0x7038, 0x9084, 0x00ff, 0x800c,
+	0x703c, 0x9084, 0x00ff, 0x8004, 0x9080, 0x0004, 0x9108, 0x810b,
+	0x2011, 0x0002, 0x2019, 0x000c, 0x6014, 0x2048, 0x080c, 0xb6f9,
+	0x080c, 0xbafe, 0x0140, 0x6014, 0x2048, 0xa807, 0x0000, 0xa864,
+	0xa8e2, 0xa867, 0x0103, 0x080c, 0x9e19, 0x001e, 0x009e, 0x0005,
+	0x0016, 0x0096, 0x7030, 0x9086, 0x0100, 0x1118, 0x2009, 0x0004,
+	0x0010, 0x7034, 0x800c, 0x810b, 0x2011, 0x000c, 0x2019, 0x000c,
+	0x6014, 0x2048, 0xa804, 0x0096, 0x9005, 0x0108, 0x2048, 0x080c,
+	0xb6f9, 0x009e, 0x080c, 0xbafe, 0x0148, 0xa804, 0x9005, 0x1158,
+	0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, 0x9e19,
+	0x009e, 0x001e, 0x0005, 0x0086, 0x2040, 0xa030, 0x8007, 0x9086,
+	0x0100, 0x1118, 0x080c, 0xa7a7, 0x00e0, 0xa034, 0x8007, 0x800c,
+	0x8806, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080,
+	0x000c, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0xaaa0,
+	0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x122f, 0x0019,
+	0x0d08, 0x008e, 0x0898, 0x0096, 0x0006, 0x080c, 0x0feb, 0x000e,
+	0x01b0, 0xa8ab, 0x0dcb, 0xa876, 0x000e, 0xa8a2, 0x0006, 0xae6a,
+	0x2800, 0xa89e, 0xa97a, 0xaf72, 0xaa8e, 0xab92, 0xac96, 0xad9a,
+	0x0086, 0x2940, 0x080c, 0x10d5, 0x008e, 0x9085, 0x0001, 0x009e,
+	0x0005, 0x00e6, 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210,
+	0x00b6, 0x2258, 0xba10, 0x00be, 0x9206, 0x1520, 0x700c, 0x6210,
+	0x00b6, 0x2258, 0xba14, 0x00be, 0x9206, 0x11e0, 0x6043, 0x0000,
+	0x2c68, 0x0016, 0x2009, 0x0035, 0x080c, 0xc171, 0x001e, 0x1158,
+	0x622c, 0x2268, 0x2071, 0x026c, 0x6b20, 0x9386, 0x0003, 0x0130,
+	0x9386, 0x0006, 0x0128, 0x080c, 0x9e19, 0x0020, 0x0039, 0x0010,
+	0x080c, 0xa42d, 0x002e, 0x00de, 0x00ee, 0x0005, 0x0096, 0x6814,
+	0x2048, 0x9186, 0x0015, 0x0904, 0xa415, 0x918e, 0x0016, 0x1904,
+	0xa42b, 0x700c, 0x908c, 0xff00, 0x9186, 0x1700, 0x0120, 0x9186,
+	0x0300, 0x1904, 0xa3ef, 0x89ff, 0x1138, 0x6800, 0x9086, 0x000f,
+	0x0904, 0xa3d2, 0x0804, 0xa429, 0x6808, 0x9086, 0xffff, 0x1904,
+	0xa417, 0xa87c, 0x9084, 0x0060, 0x9086, 0x0020, 0x1128, 0xa83c,
+	0xa940, 0x9105, 0x1904, 0xa417, 0x6824, 0xd0b4, 0x1904, 0xa417,
+	0x080c, 0xbce7, 0x685c, 0xa882, 0xa87c, 0xc0dc, 0xc0f4, 0xc0d4,
+	0xa87e, 0x0026, 0x900e, 0x6a18, 0x2001, 0x000a, 0x080c, 0x8248,
+	0xa884, 0x920a, 0x0208, 0x8011, 0xaa86, 0x82ff, 0x002e, 0x1138,
+	0x00c6, 0x2d60, 0x080c, 0xb823, 0x00ce, 0x0804, 0xa429, 0x00c6,
+	0xa868, 0xd0fc, 0x1118, 0x080c, 0x5d46, 0x0010, 0x080c, 0x60ed,
+	0x00ce, 0x1904, 0xa417, 0x00c6, 0x2d60, 0x080c, 0x9e19, 0x00ce,
+	0x0804, 0xa429, 0x00c6, 0x080c, 0x9e66, 0x0198, 0x6017, 0x0000,
+	0x6810, 0x6012, 0x080c, 0xbf73, 0x6023, 0x0003, 0x6904, 0x00c6,
+	0x2d60, 0x080c, 0x9e19, 0x00ce, 0x080c, 0x9e93, 0x00ce, 0x0804,
+	0xa429, 0x2001, 0x1959, 0x2004, 0x6842, 0x00ce, 0x04d0, 0x7008,
+	0x9086, 0x000b, 0x11c8, 0x6010, 0x00b6, 0x2058, 0xb900, 0xc1bc,
+	0xb902, 0x00be, 0x00c6, 0x2d60, 0xa87b, 0x0003, 0x080c, 0xc1b3,
+	0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x83c9,
+	0x080c, 0x894b, 0x00ce, 0x00e8, 0x700c, 0x9086, 0x2a00, 0x1138,
+	0x2001, 0x1959, 0x2004, 0x6842, 0x00a0, 0x0479, 0x00a0, 0x89ff,
+	0x090c, 0x0db4, 0x00c6, 0x00d6, 0x2d60, 0xa867, 0x0103, 0xa87b,
+	0x0003, 0x080c, 0x66a0, 0x080c, 0xbce7, 0x080c, 0x9e49, 0x00de,
+	0x00ce, 0x080c, 0x9e19, 0x009e, 0x0005, 0x9186, 0x0015, 0x1128,
+	0x2001, 0x1959, 0x2004, 0x6842, 0x0068, 0x918e, 0x0016, 0x1160,
+	0x00c6, 0x2d00, 0x2060, 0x080c, 0xd767, 0x080c, 0x81dc, 0x080c,
+	0x9e19, 0x00ce, 0x080c, 0x9e19, 0x0005, 0x0026, 0x0036, 0x0046,
+	0x7228, 0xacb0, 0xabac, 0xd2f4, 0x0130, 0x2001, 0x1959, 0x2004,
+	0x6842, 0x0804, 0xa4a7, 0x00c6, 0x2d60, 0x080c, 0xb724, 0x00ce,
+	0x6804, 0x9086, 0x0050, 0x1168, 0x00c6, 0x2d00, 0x2060, 0x6003,
+	0x0001, 0x6007, 0x0050, 0x080c, 0x83c9, 0x080c, 0x894b, 0x00ce,
+	0x04f0, 0x6800, 0x9086, 0x000f, 0x01a8, 0x89ff, 0x090c, 0x0db4,
+	0x6800, 0x9086, 0x0004, 0x1190, 0xa87c, 0xd0ac, 0x0178, 0xa843,
+	0x0fff, 0xa83f, 0x0fff, 0xa880, 0xc0fc, 0xa882, 0x2001, 0x0001,
+	0x6832, 0x0400, 0x2001, 0x0007, 0x6832, 0x00e0, 0xa87c, 0xd0b4,
+	0x1150, 0xd0ac, 0x0db8, 0x6824, 0xd0f4, 0x1d48, 0xa838, 0xa934,
+	0x9105, 0x0d80, 0x0c20, 0xd2ec, 0x1d68, 0x7024, 0x9306, 0x1118,
+	0x7020, 0x9406, 0x0d38, 0x7020, 0x683e, 0x7024, 0x683a, 0x2001,
+	0x0005, 0x6832, 0x080c, 0xbe6a, 0x080c, 0x894b, 0x0010, 0x080c,
+	0x9e19, 0x004e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x00d6, 0x0026,
+	0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, 0xba10, 0x00be,
+	0x9206, 0x1904, 0xa512, 0x700c, 0x6210, 0x00b6, 0x2258, 0xba14,
+	0x00be, 0x9206, 0x1904, 0xa512, 0x6038, 0x2068, 0x6824, 0xc0dc,
+	0x6826, 0x6a20, 0x9286, 0x0007, 0x0904, 0xa512, 0x9286, 0x0002,
+	0x0904, 0xa512, 0x9286, 0x0000, 0x05e8, 0x6808, 0x633c, 0x9306,
+	0x15c8, 0x2071, 0x026c, 0x9186, 0x0015, 0x0570, 0x918e, 0x0016,
+	0x1100, 0x00c6, 0x6038, 0x2060, 0x6104, 0x9186, 0x004b, 0x01c0,
+	0x9186, 0x004c, 0x01a8, 0x9186, 0x004d, 0x0190, 0x9186, 0x004e,
+	0x0178, 0x9186, 0x0052, 0x0160, 0x6014, 0x0096, 0x2048, 0x080c,
+	0xbafe, 0x090c, 0x0db4, 0xa87b, 0x0003, 0x009e, 0x080c, 0xc1b3,
+	0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x83c9,
+	0x080c, 0x894b, 0x00ce, 0x0030, 0x6038, 0x2070, 0x2001, 0x1959,
+	0x2004, 0x7042, 0x080c, 0x9e19, 0x002e, 0x00de, 0x00ee, 0x0005,
+	0x00b6, 0x0096, 0x00f6, 0x6014, 0x2048, 0x6010, 0x2058, 0x91b6,
+	0x0015, 0x0130, 0xba08, 0xbb0c, 0xbc00, 0xc48c, 0xbc02, 0x0460,
+	0x0096, 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, 0x0010, 0x2019,
+	0x000a, 0x20a9, 0x0004, 0x080c, 0xadf4, 0x002e, 0x003e, 0x015e,
+	0x009e, 0x1904, 0xa581, 0x0096, 0x0156, 0x0036, 0x0026, 0x2b48,
+	0x9e90, 0x0014, 0x2019, 0x0006, 0x20a9, 0x0004, 0x080c, 0xadf4,
+	0x002e, 0x003e, 0x015e, 0x009e, 0x15a0, 0x7238, 0xba0a, 0x733c,
+	0xbb0e, 0xbc00, 0xc48d, 0xbc02, 0xa804, 0x9005, 0x1128, 0x00fe,
+	0x009e, 0x00be, 0x0804, 0xa21c, 0x0096, 0x2048, 0xaa12, 0xab16,
+	0xac0a, 0x009e, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084,
+	0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8,
+	0xada4, 0x2031, 0x0000, 0x2041, 0x122f, 0x080c, 0xa31b, 0x0130,
+	0x00fe, 0x009e, 0x080c, 0x9e19, 0x00be, 0x0005, 0x080c, 0xa7a7,
+	0x0cb8, 0x2b78, 0x00f6, 0x080c, 0x2fd7, 0x080c, 0xc20e, 0x00fe,
+	0x00c6, 0x080c, 0x9dc3, 0x2f00, 0x6012, 0x6017, 0x0000, 0x6023,
+	0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, 0x080c,
+	0x6188, 0x080c, 0x61b4, 0x080c, 0x8411, 0x080c, 0x894b, 0x00ce,
+	0x0804, 0xa554, 0x2100, 0x91b2, 0x0053, 0x1a0c, 0x0db4, 0x91b2,
+	0x0040, 0x1a04, 0xa60a, 0x0002, 0xa5f8, 0xa5f8, 0xa5ee, 0xa5f8,
+	0xa5f8, 0xa5f8, 0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec,
+	0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec,
+	0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec,
+	0xa5ec, 0xa5ec, 0xa5ec, 0xa5f8, 0xa5ec, 0xa5f8, 0xa5f8, 0xa5ec,
+	0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec, 0xa5ee, 0xa5ec, 0xa5ec, 0xa5ec,
+	0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec, 0xa5f8, 0xa5f8,
+	0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec, 0xa5ec,
+	0xa5ec, 0xa5f8, 0xa5ec, 0xa5ec, 0x080c, 0x0db4, 0x0066, 0x00b6,
+	0x6610, 0x2658, 0xb8bc, 0xc08c, 0xb8be, 0x00be, 0x006e, 0x0000,
+	0x6003, 0x0001, 0x6106, 0x9186, 0x0032, 0x0118, 0x080c, 0x8411,
+	0x0010, 0x080c, 0x83c9, 0x0126, 0x2091, 0x8000, 0x080c, 0x894b,
+	0x012e, 0x0005, 0x2600, 0x0002, 0xa61e, 0xa61e, 0xa61e, 0xa5f8,
+	0xa5f8, 0xa61e, 0xa61e, 0xa61e, 0xa61e, 0xa5f8, 0xa61e, 0xa5f8,
+	0xa61e, 0xa5f8, 0xa61e, 0xa61e, 0xa61e, 0xa61e, 0x080c, 0x0db4,
+	0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0db4, 0x91b6, 0x0013, 0x0904,
+	0xa6e2, 0x91b6, 0x0027, 0x1904, 0xa69d, 0x080c, 0x8846, 0x6004,
+	0x080c, 0xbcf3, 0x01b0, 0x080c, 0xbd04, 0x01a8, 0x908e, 0x0021,
+	0x0904, 0xa69a, 0x908e, 0x0022, 0x1130, 0x080c, 0xa248, 0x0904,
+	0xa696, 0x0804, 0xa697, 0x908e, 0x003d, 0x0904, 0xa69a, 0x0804,
+	0xa690, 0x080c, 0x2ffc, 0x2001, 0x0007, 0x080c, 0x6188, 0x6010,
+	0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, 0xa7a7, 0x9186, 0x007e,
+	0x1148, 0x2001, 0x1836, 0x2014, 0xc285, 0x080c, 0x6fa7, 0x1108,
+	0xc2ad, 0x2202, 0x0036, 0x0026, 0x2019, 0x0028, 0x2110, 0x080c,
+	0xd7c2, 0x002e, 0x003e, 0x0016, 0x0026, 0x0036, 0x2110, 0x2019,
+	0x0028, 0x080c, 0x8549, 0x0076, 0x903e, 0x080c, 0x8441, 0x6010,
+	0x00b6, 0x905d, 0x0100, 0x00be, 0x2c08, 0x080c, 0xd27b, 0x007e,
+	0x003e, 0x002e, 0x001e, 0x080c, 0xc20e, 0x0016, 0x080c, 0xbf6b,
+	0x080c, 0x9e19, 0x001e, 0x080c, 0x30ce, 0x080c, 0x894b, 0x0030,
+	0x080c, 0xbf6b, 0x080c, 0x9e19, 0x080c, 0x894b, 0x0005, 0x080c,
+	0xa7a7, 0x0cb0, 0x080c, 0xa7e3, 0x0c98, 0x9186, 0x0014, 0x1db0,
+	0x080c, 0x8846, 0x6004, 0x908e, 0x0022, 0x1118, 0x080c, 0xa248,
+	0x0d68, 0x080c, 0x2fd7, 0x080c, 0xc20e, 0x080c, 0xbcf3, 0x1190,
+	0x080c, 0x2ffc, 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c,
+	0xa7a7, 0x9186, 0x007e, 0x1128, 0x2001, 0x1836, 0x200c, 0xc185,
+	0x2102, 0x0870, 0x080c, 0xbd04, 0x1118, 0x080c, 0xa7a7, 0x0840,
+	0x6004, 0x908e, 0x0032, 0x1160, 0x00e6, 0x00f6, 0x2071, 0x1894,
+	0x2079, 0x0000, 0x080c, 0x3362, 0x00fe, 0x00ee, 0x0804, 0xa690,
+	0x6004, 0x908e, 0x0021, 0x0d48, 0x908e, 0x0022, 0x090c, 0xa7a7,
+	0x0804, 0xa690, 0x90b2, 0x0040, 0x1a04, 0xa790, 0x2008, 0x0002,
+	0xa72a, 0xa72b, 0xa72e, 0xa731, 0xa734, 0xa737, 0xa728, 0xa728,
+	0xa728, 0xa728, 0xa728, 0xa728, 0xa728, 0xa728, 0xa728, 0xa728,
+	0xa728, 0xa728, 0xa728, 0xa728, 0xa728, 0xa728, 0xa728, 0xa728,
+	0xa728, 0xa728, 0xa728, 0xa728, 0xa728, 0xa728, 0xa73a, 0xa745,
+	0xa728, 0xa747, 0xa745, 0xa728, 0xa728, 0xa728, 0xa728, 0xa728,
+	0xa745, 0xa745, 0xa728, 0xa728, 0xa728, 0xa728, 0xa728, 0xa728,
+	0xa728, 0xa728, 0xa777, 0xa745, 0xa728, 0xa741, 0xa728, 0xa728,
+	0xa728, 0xa742, 0xa728, 0xa728, 0xa728, 0xa745, 0xa76e, 0xa728,
+	0x080c, 0x0db4, 0x00d0, 0x2001, 0x000b, 0x0410, 0x2001, 0x0003,
+	0x00f8, 0x2001, 0x0005, 0x00e0, 0x2001, 0x0001, 0x00c8, 0x2001,
+	0x0009, 0x00b0, 0x080c, 0x8846, 0x6003, 0x0005, 0x080c, 0x894b,
+	0x0070, 0x0018, 0x0010, 0x080c, 0x6188, 0x0804, 0xa788, 0x080c,
+	0x8846, 0x080c, 0xc211, 0x6003, 0x0004, 0x080c, 0x894b, 0x0005,
+	0x080c, 0x6188, 0x080c, 0x8846, 0x6003, 0x0002, 0x0036, 0x2019,
+	0x185e, 0x2304, 0x9084, 0xff00, 0x1120, 0x2001, 0x1957, 0x201c,
+	0x0040, 0x8007, 0x909a, 0x0004, 0x0ec0, 0x8003, 0x801b, 0x831b,
+	0x9318, 0x631a, 0x003e, 0x080c, 0x894b, 0x0c08, 0x080c, 0x8846,
+	0x080c, 0xbf6b, 0x080c, 0x9e19, 0x080c, 0x894b, 0x08c0, 0x00e6,
+	0x00f6, 0x2071, 0x1894, 0x2079, 0x0000, 0x080c, 0x3362, 0x00fe,
+	0x00ee, 0x080c, 0x8846, 0x080c, 0x9e19, 0x080c, 0x894b, 0x0838,
+	0x080c, 0x8846, 0x6003, 0x0002, 0x080c, 0xc211, 0x0804, 0x894b,
+	0x2600, 0x2008, 0x0002, 0xa7a5, 0xa7a5, 0xa7a5, 0xa788, 0xa788,
+	0xa7a5, 0xa7a5, 0xa7a5, 0xa7a5, 0xa788, 0xa7a5, 0xa788, 0xa7a5,
+	0xa788, 0xa7a5, 0xa7a5, 0xa7a5, 0xa7a5, 0x080c, 0x0db4, 0x00e6,
+	0x0096, 0x0026, 0x0016, 0x080c, 0xbafe, 0x0568, 0x6014, 0x2048,
+	0xa864, 0x9086, 0x0139, 0x11a8, 0xa894, 0x9086, 0x0056, 0x1148,
+	0x080c, 0x5128, 0x0130, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000,
+	0x0028, 0x2001, 0x0030, 0x900e, 0x2011, 0x4005, 0x080c, 0xc0d8,
+	0x0090, 0xa868, 0xd0fc, 0x0178, 0xa807, 0x0000, 0x0016, 0x6004,
+	0x908e, 0x0021, 0x0168, 0x908e, 0x003d, 0x0150, 0x001e, 0xa867,
+	0x0103, 0xa833, 0x0100, 0x001e, 0x002e, 0x009e, 0x00ee, 0x0005,
+	0x001e, 0x0009, 0x0cc0, 0x0096, 0x6014, 0x2048, 0xa800, 0x2048,
+	0xa867, 0x0103, 0xa823, 0x8001, 0x009e, 0x0005, 0x00b6, 0x6610,
+	0x2658, 0xb804, 0x9084, 0x00ff, 0x90b2, 0x000c, 0x1a0c, 0x0db4,
+	0x6604, 0x96b6, 0x004d, 0x1120, 0x080c, 0xbff7, 0x0804, 0xa86b,
+	0x6604, 0x96b6, 0x0043, 0x1120, 0x080c, 0xc040, 0x0804, 0xa86b,
+	0x6604, 0x96b6, 0x004b, 0x1120, 0x080c, 0xc06c, 0x0804, 0xa86b,
+	0x6604, 0x96b6, 0x0033, 0x1120, 0x080c, 0xbf8d, 0x0804, 0xa86b,
+	0x6604, 0x96b6, 0x0028, 0x1120, 0x080c, 0xbd3d, 0x0804, 0xa86b,
+	0x6604, 0x96b6, 0x0029, 0x1120, 0x080c, 0xbd7e, 0x0804, 0xa86b,
+	0x6604, 0x96b6, 0x001f, 0x1118, 0x080c, 0xa1f1, 0x04e0, 0x6604,
+	0x96b6, 0x0000, 0x1118, 0x080c, 0xa518, 0x04a8, 0x6604, 0x96b6,
+	0x0022, 0x1118, 0x080c, 0xa229, 0x0470, 0x6604, 0x96b6, 0x0035,
+	0x1118, 0x080c, 0xa339, 0x0438, 0x6604, 0x96b6, 0x0039, 0x1118,
+	0x080c, 0xa4ad, 0x0400, 0x6604, 0x96b6, 0x003d, 0x1118, 0x080c,
+	0xa261, 0x00c8, 0x6604, 0x96b6, 0x0044, 0x1118, 0x080c, 0xa29d,
+	0x0090, 0x6604, 0x96b6, 0x0049, 0x1118, 0x080c, 0xa2c8, 0x0058,
+	0x91b6, 0x0015, 0x1110, 0x0063, 0x0030, 0x91b6, 0x0016, 0x1128,
+	0x00be, 0x0804, 0xab29, 0x00be, 0x0005, 0x080c, 0x9eae, 0x0cd8,
+	0xa888, 0xa88b, 0xa888, 0xa8cf, 0xa888, 0xaa5d, 0xab36, 0xa888,
+	0xa888, 0xab03, 0xa888, 0xab17, 0x0096, 0x080c, 0x150f, 0x6014,
+	0x2048, 0xa800, 0x2048, 0xa867, 0x0103, 0x009e, 0x0804, 0x9e19,
+	0xa001, 0xa001, 0x0005, 0x00e6, 0x2071, 0x1800, 0x708c, 0x9086,
+	0x0074, 0x1540, 0x080c, 0xd24c, 0x11b0, 0x6010, 0x00b6, 0x2058,
+	0x7030, 0xd08c, 0x0128, 0xb800, 0xd0bc, 0x0110, 0xc0c5, 0xb802,
+	0x00e9, 0x00be, 0x2001, 0x0006, 0x080c, 0x6188, 0x080c, 0x2ffc,
+	0x080c, 0x9e19, 0x0088, 0x2001, 0x000a, 0x080c, 0x6188, 0x080c,
+	0x2ffc, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x8411, 0x080c,
+	0x894b, 0x0010, 0x080c, 0xaa48, 0x00ee, 0x0005, 0x00d6, 0xb800,
+	0xd084, 0x0158, 0x9006, 0x080c, 0x6174, 0x2069, 0x1853, 0x6804,
+	0x0020, 0x2001, 0x0006, 0x080c, 0x61b4, 0x00de, 0x0005, 0x00b6,
+	0x0096, 0x00d6, 0x2011, 0x1823, 0x2204, 0x9086, 0x0074, 0x1904,
+	0xaa21, 0x6010, 0x2058, 0xbaa0, 0x9286, 0x007e, 0x1120, 0x080c,
+	0xac7a, 0x0804, 0xa986, 0x00d6, 0x080c, 0x6fa7, 0x0198, 0x0026,
+	0x2011, 0x0010, 0x080c, 0x657f, 0x002e, 0x05c8, 0x080c, 0x5393,
+	0x1540, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833,
+	0xdead, 0x00f8, 0x0026, 0x2011, 0x8008, 0x080c, 0x657f, 0x002e,
+	0x0530, 0x6014, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039,
+	0x1140, 0x2001, 0x0030, 0x900e, 0x2011, 0x4009, 0x080c, 0xc0d8,
+	0x0040, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833,
+	0xdead, 0x6010, 0x2058, 0xb9a0, 0x0016, 0x080c, 0x2ffc, 0x080c,
+	0x9e19, 0x001e, 0x080c, 0x30ce, 0x00de, 0x0804, 0xaa22, 0x00de,
+	0x080c, 0xac6f, 0x6010, 0x2058, 0xbaa0, 0x9286, 0x0080, 0x1510,
+	0x6014, 0x9005, 0x01a8, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086,
+	0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c,
+	0xc0d8, 0x0030, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200,
+	0x2001, 0x0006, 0x080c, 0x6188, 0x080c, 0x2ffc, 0x080c, 0x9e19,
+	0x0804, 0xaa22, 0x080c, 0xaa30, 0x6014, 0x9005, 0x0190, 0x2048,
+	0xa868, 0xd0f4, 0x01e8, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039,
+	0x1d08, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xc0d8,
+	0x08f8, 0x080c, 0xaa26, 0x0160, 0x9006, 0x080c, 0x6174, 0x2001,
+	0x0004, 0x080c, 0x61b4, 0x2001, 0x0007, 0x080c, 0x6188, 0x08a0,
+	0x2001, 0x0004, 0x080c, 0x6188, 0x6003, 0x0001, 0x6007, 0x0003,
+	0x080c, 0x8411, 0x080c, 0x894b, 0x0804, 0xaa22, 0xb85c, 0xd0e4,
+	0x01d0, 0x080c, 0xbf0d, 0x080c, 0x6fa7, 0x0118, 0xd0dc, 0x1904,
+	0xa948, 0x2011, 0x1836, 0x2204, 0xc0ad, 0x2012, 0x2001, 0x0002,
+	0x00f6, 0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, 0x26d7, 0x78e2,
+	0x00fe, 0x0804, 0xa948, 0x080c, 0xbf4a, 0x2011, 0x1836, 0x2204,
+	0xc0a5, 0x2012, 0x0006, 0x080c, 0xd3a5, 0x000e, 0x1904, 0xa948,
+	0xc0b5, 0x2012, 0x2001, 0x0006, 0x080c, 0x6188, 0x9006, 0x080c,
+	0x6174, 0x00c6, 0x2001, 0x180f, 0x2004, 0xd09c, 0x0520, 0x00f6,
+	0x2079, 0x0100, 0x00e6, 0x2071, 0x1800, 0x700c, 0x9084, 0x00ff,
+	0x78e6, 0x707a, 0x7010, 0x78ea, 0x707e, 0x908c, 0x00ff, 0x00ee,
+	0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x26ac, 0x00f6, 0x2100,
+	0x900e, 0x080c, 0x2663, 0x795a, 0x00fe, 0x9186, 0x0081, 0x01d8,
+	0x2009, 0x0081, 0x00c8, 0x2009, 0x00ef, 0x00f6, 0x2079, 0x0100,
+	0x79ea, 0x7932, 0x7936, 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c,
+	0x26ac, 0x00f6, 0x2079, 0x1800, 0x797e, 0x2100, 0x900e, 0x080c,
+	0x2663, 0x795a, 0x00fe, 0x8108, 0x080c, 0x61d7, 0x2b00, 0x00ce,
+	0x1904, 0xa948, 0x6012, 0x2009, 0x180f, 0x210c, 0xd19c, 0x0150,
+	0x2009, 0x027c, 0x210c, 0x918c, 0x00ff, 0xb912, 0x2009, 0x027d,
+	0x210c, 0xb916, 0x2001, 0x0002, 0x080c, 0x6188, 0x6023, 0x0001,
+	0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8411, 0x080c, 0x894b,
+	0x0008, 0x0431, 0x00de, 0x009e, 0x00be, 0x0005, 0x2001, 0x1810,
+	0x2004, 0xd0a4, 0x0120, 0x2001, 0x1854, 0x2004, 0xd0ac, 0x0005,
+	0x00e6, 0x080c, 0xd81b, 0x0190, 0x2071, 0x0260, 0x7108, 0x720c,
+	0x918c, 0x00ff, 0x1118, 0x9284, 0xff00, 0x0140, 0x6010, 0x2058,
+	0xb8a0, 0x9084, 0xff80, 0x1110, 0xb912, 0xba16, 0x00ee, 0x0005,
+	0x2030, 0x2001, 0x0007, 0x080c, 0x6188, 0x080c, 0x5393, 0x1120,
+	0x2001, 0x0007, 0x080c, 0x61b4, 0x080c, 0x2ffc, 0x6020, 0x9086,
+	0x000a, 0x1108, 0x0005, 0x0804, 0x9e19, 0x00b6, 0x00e6, 0x0026,
+	0x0016, 0x2071, 0x1800, 0x708c, 0x9086, 0x0014, 0x1904, 0xaafa,
+	0x00d6, 0x080c, 0x6fa7, 0x0198, 0x0026, 0x2011, 0x0010, 0x080c,
+	0x657f, 0x002e, 0x05c8, 0x080c, 0x5393, 0x1540, 0x6014, 0x2048,
+	0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, 0x00f8, 0x0026,
+	0x2011, 0x8008, 0x080c, 0x657f, 0x002e, 0x0530, 0x6014, 0x2048,
+	0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0030,
+	0x900e, 0x2011, 0x4009, 0x080c, 0xc0d8, 0x0040, 0x6014, 0x2048,
+	0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, 0x6010, 0x2058,
+	0xb9a0, 0x0016, 0x080c, 0x2ffc, 0x080c, 0x9e19, 0x001e, 0x080c,
+	0x30ce, 0x00de, 0x0804, 0xaafe, 0x00de, 0x080c, 0x5393, 0x1170,
+	0x6014, 0x9005, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0,
+	0x2021, 0x0006, 0x080c, 0x4a6f, 0x004e, 0x003e, 0x00d6, 0x6010,
+	0x2058, 0x080c, 0x62d2, 0x080c, 0xa8be, 0x00de, 0x080c, 0xad40,
+	0x1588, 0x6010, 0x2058, 0xb890, 0x9005, 0x0560, 0x2001, 0x0006,
+	0x080c, 0x6188, 0x0096, 0x6014, 0x904d, 0x01d0, 0xa864, 0x9084,
+	0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011,
+	0x4000, 0x080c, 0xc0d8, 0x0060, 0xa864, 0x9084, 0x00ff, 0x9086,
+	0x0029, 0x0130, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200,
+	0x009e, 0x080c, 0x2ffc, 0x6020, 0x9086, 0x000a, 0x0138, 0x080c,
+	0x9e19, 0x0020, 0x080c, 0xa7a7, 0x080c, 0xaa48, 0x001e, 0x002e,
+	0x00ee, 0x00be, 0x0005, 0x2011, 0x1823, 0x2204, 0x9086, 0x0014,
+	0x1160, 0x2001, 0x0002, 0x080c, 0x6188, 0x6003, 0x0001, 0x6007,
+	0x0001, 0x080c, 0x8411, 0x0804, 0x894b, 0x0804, 0xaa48, 0x2030,
+	0x2011, 0x1823, 0x2204, 0x9086, 0x0004, 0x1148, 0x96b6, 0x000b,
+	0x1120, 0x2001, 0x0007, 0x080c, 0x6188, 0x0804, 0x9e19, 0x0804,
+	0xaa48, 0x0002, 0xa888, 0xab41, 0xa888, 0xab80, 0xa888, 0xac2b,
+	0xab36, 0xa888, 0xa888, 0xac3e, 0xa888, 0xac4e, 0x6604, 0x9686,
+	0x0003, 0x0904, 0xaa5d, 0x96b6, 0x001e, 0x1110, 0x080c, 0x9e19,
+	0x0005, 0x00b6, 0x00d6, 0x00c6, 0x080c, 0xac5e, 0x11a0, 0x9006,
+	0x080c, 0x6174, 0x080c, 0x2fd7, 0x080c, 0xc20e, 0x2001, 0x0002,
+	0x080c, 0x6188, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8411,
+	0x080c, 0x894b, 0x0408, 0x2009, 0x026e, 0x2104, 0x9086, 0x0009,
+	0x1160, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0170,
+	0x8001, 0xb842, 0x601b, 0x000a, 0x0078, 0x2009, 0x026f, 0x2104,
+	0x9084, 0xff00, 0x9086, 0x1900, 0x1108, 0x08a0, 0x080c, 0x2fd7,
+	0x080c, 0xc20e, 0x080c, 0xaa48, 0x00ce, 0x00de, 0x00be, 0x0005,
+	0x0096, 0x00b6, 0x0026, 0x9016, 0x080c, 0xac6c, 0x00d6, 0x2069,
+	0x194d, 0x2d04, 0x9005, 0x0168, 0x6010, 0x2058, 0xb8a0, 0x9086,
+	0x007e, 0x1138, 0x2069, 0x181f, 0x2d04, 0x8000, 0x206a, 0x00de,
+	0x0010, 0x00de, 0x0088, 0x9006, 0x080c, 0x6174, 0x2001, 0x0002,
+	0x080c, 0x6188, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8411,
+	0x080c, 0x894b, 0x0804, 0xabfb, 0x080c, 0xbafe, 0x01b0, 0x6014,
+	0x2048, 0xa864, 0x2010, 0x9086, 0x0139, 0x1138, 0x6007, 0x0016,
+	0x2001, 0x0002, 0x080c, 0xc132, 0x00b0, 0x6014, 0x2048, 0xa864,
+	0xd0fc, 0x0118, 0x2001, 0x0001, 0x0ca8, 0x2001, 0x180e, 0x2004,
+	0xd0dc, 0x0148, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005,
+	0x1110, 0x9006, 0x0c38, 0x080c, 0xa7a7, 0x2009, 0x026e, 0x2134,
+	0x96b4, 0x00ff, 0x9686, 0x0005, 0x0510, 0x9686, 0x000b, 0x01c8,
+	0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x1118, 0x9686, 0x0009,
+	0x01b0, 0x9086, 0x1900, 0x1168, 0x9686, 0x0009, 0x0180, 0x2001,
+	0x0004, 0x080c, 0x6188, 0x2001, 0x0028, 0x601a, 0x6007, 0x0052,
+	0x0010, 0x080c, 0xaa48, 0x002e, 0x00be, 0x009e, 0x0005, 0x9286,
+	0x0139, 0x0160, 0x6014, 0x2048, 0x080c, 0xbafe, 0x0140, 0xa864,
+	0x9086, 0x0139, 0x0118, 0xa868, 0xd0fc, 0x0108, 0x0c50, 0x6010,
+	0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0138, 0x8001, 0xb842,
+	0x601b, 0x000a, 0x6007, 0x0016, 0x08f0, 0xb8a0, 0x9086, 0x007e,
+	0x1138, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5c5d, 0x00ee, 0x0010,
+	0x080c, 0x2fd7, 0x0870, 0x080c, 0xac6c, 0x1160, 0x2001, 0x0004,
+	0x080c, 0x6188, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x8411,
+	0x0804, 0x894b, 0x080c, 0xa7a7, 0x0804, 0xaa48, 0x0469, 0x1160,
+	0x2001, 0x0008, 0x080c, 0x6188, 0x6003, 0x0001, 0x6007, 0x0005,
+	0x080c, 0x8411, 0x0804, 0x894b, 0x0804, 0xaa48, 0x00e9, 0x1160,
+	0x2001, 0x000a, 0x080c, 0x6188, 0x6003, 0x0001, 0x6007, 0x0001,
+	0x080c, 0x8411, 0x0804, 0x894b, 0x0804, 0xaa48, 0x2009, 0x026e,
+	0x2104, 0x9086, 0x0003, 0x1138, 0x2009, 0x026f, 0x2104, 0x9084,
+	0xff00, 0x9086, 0x2a00, 0x0005, 0x9085, 0x0001, 0x0005, 0x00b6,
+	0x00c6, 0x0016, 0x6110, 0x2158, 0x080c, 0x6246, 0x001e, 0x00ce,
+	0x00be, 0x0005, 0x00b6, 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016,
+	0x6010, 0x2058, 0x2009, 0x1836, 0x2104, 0x9085, 0x0003, 0x200a,
+	0x080c, 0xad12, 0x0560, 0x2009, 0x1836, 0x2104, 0xc0cd, 0x200a,
+	0x080c, 0x6557, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c,
+	0xd50a, 0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a,
+	0x2009, 0x0001, 0x080c, 0x2fa2, 0x00e6, 0x2071, 0x1800, 0x080c,
+	0x2dbb, 0x00ee, 0x00c6, 0x0156, 0x20a9, 0x0781, 0x2009, 0x007f,
+	0x080c, 0x30ce, 0x8108, 0x1f04, 0xacb0, 0x015e, 0x00ce, 0x080c,
+	0xac6f, 0x2071, 0x0260, 0x2079, 0x0200, 0x7817, 0x0001, 0x2001,
+	0x1836, 0x200c, 0xc1c5, 0x7018, 0xd0fc, 0x0110, 0xd0dc, 0x0118,
+	0x7038, 0xd0dc, 0x1108, 0xc1c4, 0x7817, 0x0000, 0x2001, 0x1836,
+	0x2102, 0x2079, 0x0100, 0x2e04, 0x9084, 0x00ff, 0x2069, 0x181e,
+	0x206a, 0x78e6, 0x0006, 0x8e70, 0x2e04, 0x2069, 0x181f, 0x206a,
+	0x78ea, 0x7832, 0x7836, 0x2010, 0x9084, 0xff00, 0x001e, 0x9105,
+	0x2009, 0x182b, 0x200a, 0x2200, 0x9084, 0x00ff, 0x2008, 0x080c,
+	0x26ac, 0x080c, 0x6fa7, 0x0170, 0x2071, 0x0260, 0x2069, 0x1953,
+	0x7048, 0x206a, 0x704c, 0x6806, 0x7050, 0x680a, 0x7054, 0x680e,
+	0x080c, 0xbf0d, 0x0040, 0x2001, 0x0006, 0x080c, 0x6188, 0x080c,
+	0x2ffc, 0x080c, 0x9e19, 0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe,
+	0x00be, 0x0005, 0x0096, 0x0026, 0x0036, 0x00e6, 0x0156, 0x2019,
+	0x182b, 0x231c, 0x83ff, 0x01f0, 0x2071, 0x0260, 0x7200, 0x9294,
+	0x00ff, 0x7004, 0x9084, 0xff00, 0x9205, 0x9306, 0x1198, 0x2011,
+	0x0276, 0x20a9, 0x0004, 0x2b48, 0x2019, 0x000a, 0x080c, 0xadf4,
+	0x1148, 0x2011, 0x027a, 0x20a9, 0x0004, 0x2019, 0x0006, 0x080c,
+	0xadf4, 0x1100, 0x015e, 0x00ee, 0x003e, 0x002e, 0x009e, 0x0005,
+	0x00e6, 0x2071, 0x0260, 0x7034, 0x9086, 0x0014, 0x11a8, 0x7038,
+	0x9086, 0x0800, 0x1188, 0x703c, 0xd0ec, 0x0160, 0x9084, 0x0f00,
+	0x9086, 0x0100, 0x1138, 0x7054, 0xd0a4, 0x1110, 0xd0ac, 0x0110,
+	0x9006, 0x0010, 0x9085, 0x0001, 0x00ee, 0x0005, 0x00e6, 0x0096,
+	0x00c6, 0x0076, 0x0056, 0x0046, 0x0026, 0x0006, 0x0126, 0x2091,
+	0x8000, 0x2029, 0x19c1, 0x252c, 0x2021, 0x19c7, 0x2424, 0x2061,
+	0x1cd0, 0x2071, 0x1800, 0x7250, 0x7070, 0x9202, 0x1a04, 0xadcc,
+	0x080c, 0xd53b, 0x0904, 0xadc5, 0x6720, 0x9786, 0x0007, 0x0904,
+	0xadc5, 0x2500, 0x9c06, 0x0904, 0xadc5, 0x2400, 0x9c06, 0x05e8,
+	0x3e08, 0x9186, 0x0002, 0x1148, 0x6010, 0x9005, 0x0130, 0x00b6,
+	0x2058, 0xb800, 0x00be, 0xd0bc, 0x1580, 0x00c6, 0x6000, 0x9086,
+	0x0004, 0x1110, 0x080c, 0x190d, 0x9786, 0x000a, 0x0148, 0x080c,
+	0xbd04, 0x1130, 0x00ce, 0x080c, 0xa7a7, 0x080c, 0x9e49, 0x00e8,
+	0x6014, 0x2048, 0x080c, 0xbafe, 0x01a8, 0x9786, 0x0003, 0x1530,
+	0xa867, 0x0103, 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878, 0x2048,
+	0x080c, 0x0f9d, 0x009e, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6878,
+	0x080c, 0xbce7, 0x080c, 0x9e49, 0x00ce, 0x9ce0, 0x0018, 0x7064,
+	0x9c02, 0x1210, 0x0804, 0xad73, 0x012e, 0x000e, 0x002e, 0x004e,
+	0x005e, 0x007e, 0x00ce, 0x009e, 0x00ee, 0x0005, 0x9786, 0x0006,
+	0x1118, 0x080c, 0xd4b5, 0x0c30, 0x9786, 0x000a, 0x0998, 0x0880,
+	0x220c, 0x2304, 0x9106, 0x1130, 0x8210, 0x8318, 0x1f04, 0xade0,
+	0x9006, 0x0005, 0x2304, 0x9102, 0x0218, 0x2001, 0x0001, 0x0008,
+	0x9006, 0x918d, 0x0001, 0x0005, 0x0136, 0x01c6, 0x0016, 0x8906,
+	0x8006, 0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9300,
+	0x2098, 0x3518, 0x20a9, 0x0001, 0x220c, 0x4002, 0x910e, 0x1140,
+	0x8210, 0x8319, 0x1dc8, 0x9006, 0x001e, 0x01ce, 0x013e, 0x0005,
+	0x220c, 0x9102, 0x0218, 0x2001, 0x0001, 0x0010, 0x2001, 0x0000,
+	0x918d, 0x0001, 0x001e, 0x01ce, 0x013e, 0x0005, 0x6004, 0x908a,
+	0x0053, 0x1a0c, 0x0db4, 0x080c, 0xbcf3, 0x0120, 0x080c, 0xbd04,
+	0x0168, 0x0028, 0x080c, 0x2ffc, 0x080c, 0xbd04, 0x0138, 0x080c,
+	0x8846, 0x080c, 0x9e19, 0x080c, 0x894b, 0x0005, 0x080c, 0xa7a7,
+	0x0cb0, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a,
+	0x0005, 0xae55, 0xae55, 0xae55, 0xae55, 0xae55, 0xae55, 0xae55,
+	0xae55, 0xae55, 0xae55, 0xae55, 0xae57, 0xae57, 0xae57, 0xae57,
+	0xae55, 0xae55, 0xae55, 0xae57, 0xae55, 0x080c, 0x0db4, 0x600b,
+	0xffff, 0x6003, 0x0001, 0x6106, 0x080c, 0x83c9, 0x0126, 0x2091,
+	0x8000, 0x080c, 0x894b, 0x012e, 0x0005, 0x9186, 0x0013, 0x1128,
+	0x6004, 0x9082, 0x0040, 0x0804, 0xaf0c, 0x9186, 0x0027, 0x1520,
+	0x080c, 0x8846, 0x080c, 0x2fd7, 0x080c, 0xc20e, 0x0096, 0x6114,
+	0x2148, 0x080c, 0xbafe, 0x0198, 0x080c, 0xbd04, 0x1118, 0x080c,
+	0xa7a7, 0x0068, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, 0x0000,
+	0xa97c, 0xc1c5, 0xa97e, 0x080c, 0x6885, 0x080c, 0xbce7, 0x009e,
+	0x080c, 0x9e19, 0x0804, 0x894b, 0x9186, 0x0014, 0x1120, 0x6004,
+	0x9082, 0x0040, 0x04a0, 0x9186, 0x0046, 0x0150, 0x9186, 0x0045,
+	0x0138, 0x9186, 0x0053, 0x0120, 0x9186, 0x0048, 0x190c, 0x0db4,
+	0x2001, 0x0109, 0x2004, 0xd084, 0x0508, 0x0126, 0x2091, 0x2800,
+	0x0006, 0x0016, 0x0026, 0x0036, 0x00f6, 0x00e6, 0x00c6, 0x2079,
+	0x19b8, 0x2071, 0x1800, 0x2061, 0x0100, 0x080c, 0x82b5, 0x00ce,
+	0x00ee, 0x00fe, 0x003e, 0x002e, 0x001e, 0x000e, 0x012e, 0xa001,
+	0x6000, 0x9086, 0x0002, 0x1110, 0x0804, 0xaf4a, 0x0005, 0x0002,
+	0xaee6, 0xaee4, 0xaee4, 0xaee4, 0xaee4, 0xaee4, 0xaee4, 0xaee4,
+	0xaee4, 0xaee4, 0xaee4, 0xaf01, 0xaf01, 0xaf01, 0xaf01, 0xaee4,
+	0xaf01, 0xaee4, 0xaf01, 0xaee4, 0x080c, 0x0db4, 0x080c, 0x8846,
+	0x0096, 0x6114, 0x2148, 0x080c, 0xbafe, 0x0168, 0xa867, 0x0103,
+	0xa87b, 0x0006, 0xa877, 0x0000, 0xa880, 0xc0ec, 0xa882, 0x080c,
+	0x6885, 0x080c, 0xbce7, 0x009e, 0x080c, 0x9e19, 0x080c, 0x894b,
+	0x0005, 0x080c, 0x8846, 0x080c, 0xbd04, 0x090c, 0xa7a7, 0x080c,
+	0x9e19, 0x080c, 0x894b, 0x0005, 0x0002, 0xaf23, 0xaf21, 0xaf21,
+	0xaf21, 0xaf21, 0xaf21, 0xaf21, 0xaf21, 0xaf21, 0xaf21, 0xaf21,
+	0xaf3a, 0xaf3a, 0xaf3a, 0xaf3a, 0xaf21, 0xaf44, 0xaf21, 0xaf3a,
+	0xaf21, 0x080c, 0x0db4, 0x0096, 0x080c, 0x8846, 0x6014, 0x2048,
+	0x2001, 0x1959, 0x2004, 0x6042, 0xa97c, 0xd1ac, 0x0140, 0x6003,
+	0x0004, 0xa87c, 0x9085, 0x0400, 0xa87e, 0x009e, 0x0005, 0x6003,
+	0x0002, 0x0cb8, 0x080c, 0x8846, 0x080c, 0xc211, 0x080c, 0xc216,
+	0x6003, 0x000f, 0x0804, 0x894b, 0x080c, 0x8846, 0x080c, 0x9e19,
+	0x0804, 0x894b, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208,
+	0x000a, 0x0005, 0xaf66, 0xaf66, 0xaf66, 0xaf66, 0xaf66, 0xaf68,
+	0xb045, 0xaf66, 0xb079, 0xaf66, 0xaf66, 0xaf66, 0xaf66, 0xaf66,
+	0xaf66, 0xaf66, 0xaf66, 0xaf66, 0xaf66, 0xb079, 0x080c, 0x0db4,
+	0x00b6, 0x0096, 0x6114, 0x2148, 0x7644, 0x96b4, 0x0fff, 0x86ff,
+	0x1528, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xb034, 0xa87b,
+	0x0000, 0xa867, 0x0103, 0xae76, 0xa87c, 0xd0ac, 0x0128, 0xa834,
+	0xa938, 0x9115, 0x190c, 0xb20e, 0x080c, 0x66a0, 0x6210, 0x2258,
+	0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0x7044, 0xd0e4, 0x1904,
+	0xb018, 0x080c, 0x9e19, 0x009e, 0x00be, 0x0005, 0x968c, 0x0c00,
+	0x0150, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xb01c, 0x7348,
+	0xab92, 0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0508,
+	0x9186, 0x0028, 0x1118, 0xa87b, 0x001c, 0x00e8, 0xd6dc, 0x01a0,
+	0xa87b, 0x0015, 0xa87c, 0xd0ac, 0x0170, 0xa938, 0xaa34, 0x2100,
+	0x9205, 0x0148, 0x7048, 0x9106, 0x1118, 0x704c, 0x9206, 0x0118,
+	0xa992, 0xaa8e, 0xc6dc, 0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007,
+	0x0010, 0xa87b, 0x0000, 0xa867, 0x0103, 0xae76, 0x901e, 0xd6c4,
+	0x01d8, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4,
+	0x0804, 0xaf6f, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009,
+	0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, 0x2011,
+	0x0025, 0x080c, 0xb6f9, 0x003e, 0xd6cc, 0x0904, 0xaf84, 0x7154,
+	0xa98a, 0x81ff, 0x0904, 0xaf84, 0x9192, 0x0021, 0x1278, 0x8304,
+	0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xb6f9, 0x2011, 0x0205,
+	0x2013, 0x0000, 0x080c, 0xc19e, 0x0804, 0xaf84, 0xa868, 0xd0fc,
+	0x0120, 0x2009, 0x0020, 0xa98a, 0x0c50, 0x00a6, 0x2950, 0x080c,
+	0xb698, 0x00ae, 0x080c, 0xc19e, 0x080c, 0xb6e9, 0x0804, 0xaf86,
+	0x080c, 0xbdf7, 0x0804, 0xaf93, 0xa87c, 0xd0ac, 0x0904, 0xaf9f,
+	0xa880, 0xd0bc, 0x1904, 0xaf9f, 0x7348, 0xa838, 0x9306, 0x11c8,
+	0x734c, 0xa834, 0x931e, 0x0904, 0xaf9f, 0xd6d4, 0x0190, 0xab38,
+	0x9305, 0x0904, 0xaf9f, 0x0068, 0xa87c, 0xd0ac, 0x0904, 0xaf77,
+	0xa838, 0xa934, 0x9105, 0x0904, 0xaf77, 0xa880, 0xd0bc, 0x1904,
+	0xaf77, 0x080c, 0xbe31, 0x0804, 0xaf93, 0x0096, 0x00f6, 0x6003,
+	0x0003, 0x6007, 0x0043, 0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c,
+	0x7d08, 0x6014, 0x2048, 0xa87c, 0xd0ac, 0x0140, 0x6003, 0x0002,
+	0x00fe, 0x009e, 0x0005, 0x2130, 0x2228, 0x0058, 0x2400, 0xa9ac,
+	0x910a, 0x2300, 0xaab0, 0x9213, 0x2600, 0x9102, 0x2500, 0x9203,
+	0x0e90, 0xac36, 0xab3a, 0xae46, 0xad4a, 0x00fe, 0x6043, 0x0000,
+	0x2c10, 0x080c, 0x1a5c, 0x080c, 0x842e, 0x080c, 0x8a26, 0x009e,
+	0x0005, 0x0005, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208,
+	0x000a, 0x0005, 0xb096, 0xb096, 0xb096, 0xb096, 0xb096, 0xb098,
+	0xb12e, 0xb096, 0xb096, 0xb145, 0xb1d1, 0xb096, 0xb096, 0xb096,
+	0xb096, 0xb1e6, 0xb096, 0xb096, 0xb096, 0xb096, 0x080c, 0x0db4,
+	0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260, 0x6114, 0x2150,
+	0x7644, 0xb676, 0x96b4, 0x0fff, 0xb77c, 0xc7e5, 0xb77e, 0x6210,
+	0x00b6, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0x00be,
+	0x86ff, 0x0904, 0xb129, 0x9694, 0xff00, 0x9284, 0x0c00, 0x0120,
+	0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, 0xb129,
+	0x080c, 0x0feb, 0x090c, 0x0db4, 0x2900, 0xb07a, 0xb77c, 0xc7cd,
+	0xb77e, 0xa867, 0x0103, 0xb068, 0xa86a, 0xb06c, 0xa86e, 0xb070,
+	0xa872, 0xae76, 0x968c, 0x0c00, 0x0120, 0x7348, 0xab92, 0x734c,
 	0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0180, 0x9186, 0x0028,
 	0x1118, 0xa87b, 0x001c, 0x0060, 0xd6dc, 0x0118, 0xa87b, 0x0015,
 	0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000,
 	0xaf7e, 0xb080, 0xa882, 0xb084, 0xa886, 0x901e, 0xd6c4, 0x0190,
 	0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019,
 	0x0008, 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c,
-	0xb3a8, 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8,
+	0xb6f9, 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8,
 	0x9192, 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029,
-	0x080c, 0xb3a8, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0xb068,
+	0x080c, 0xb6f9, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0xb068,
 	0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, 0x080c,
-	0xb347, 0x080c, 0x1839, 0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005,
-	0x2001, 0x1957, 0x2004, 0x6042, 0x0096, 0x6114, 0x2148, 0xa83c,
-	0xa940, 0x9105, 0x1118, 0xa87c, 0xc0dc, 0xa87e, 0x6003, 0x0002,
-	0xa97c, 0xd1e4, 0x0904, 0xb0c4, 0x6043, 0x0000, 0x6010, 0x00b6,
-	0x2058, 0xb800, 0x00be, 0xd0bc, 0x1500, 0xd1cc, 0x0904, 0xb093,
-	0xa978, 0xa868, 0xd0fc, 0x0904, 0xb054, 0x0016, 0xa87c, 0x0006,
-	0xa880, 0x0006, 0x00a6, 0x2150, 0xb174, 0x9184, 0x00ff, 0x90b6,
-	0x0002, 0x0904, 0xb022, 0x9086, 0x0028, 0x1904, 0xb00e, 0xa87b,
-	0x001c, 0xb07b, 0x001c, 0x0804, 0xb02a, 0x6024, 0xd0f4, 0x11d0,
-	0xa838, 0xaa34, 0x9205, 0x09c8, 0xa838, 0xaa90, 0x9206, 0x1120,
-	0xa88c, 0xaa34, 0x9206, 0x0988, 0x6024, 0xd0d4, 0x1148, 0xa9ac,
-	0xa834, 0x9102, 0x603a, 0xa9b0, 0xa838, 0x9103, 0x603e, 0x6024,
-	0xc0f5, 0x6026, 0x6010, 0x00b6, 0x2058, 0xb83c, 0x8000, 0xb83e,
-	0x00be, 0x9006, 0xa876, 0xa892, 0xa88e, 0xa87c, 0xc0e4, 0xa87e,
-	0xd0cc, 0x0140, 0xc0cc, 0xa87e, 0x0096, 0xa878, 0x2048, 0x080c,
-	0x0f9e, 0x009e, 0x080c, 0xbabf, 0x0804, 0xb0c4, 0xd1dc, 0x0158,
-	0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xbd4e, 0x0118, 0xb174,
+	0xb698, 0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005, 0x00f6, 0x00a6,
+	0x6003, 0x0003, 0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08,
+	0x6014, 0x2050, 0xb436, 0xb33a, 0xb646, 0xb54a, 0x00ae, 0x00fe,
+	0x2c10, 0x080c, 0x1a5c, 0x0804, 0x9360, 0x6003, 0x0002, 0x6004,
+	0x9086, 0x0040, 0x11c8, 0x0096, 0x6014, 0x2048, 0xa87c, 0xd0ac,
+	0x0160, 0x601c, 0xd084, 0x1130, 0x00f6, 0x2c00, 0x2078, 0x080c,
+	0x1648, 0x00fe, 0x6003, 0x0004, 0x0010, 0x6003, 0x0002, 0x009e,
+	0x080c, 0x8846, 0x080c, 0x894b, 0x0096, 0x2001, 0x1959, 0x2004,
+	0x6042, 0x080c, 0x88fb, 0x080c, 0x8a26, 0x6114, 0x2148, 0xa97c,
+	0xd1e4, 0x0904, 0xb1cc, 0xd1cc, 0x05a8, 0xa978, 0xa868, 0xd0fc,
+	0x0538, 0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, 0xa860, 0x20e8,
+	0xa85c, 0x9080, 0x0019, 0x20a0, 0x810e, 0x810e, 0x810f, 0x9184,
+	0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0019, 0x2098, 0x0156,
+	0x20a9, 0x0020, 0x4003, 0x015e, 0x000e, 0xa882, 0x000e, 0xa87e,
+	0x001e, 0xa874, 0x0006, 0x2148, 0x080c, 0x0f9d, 0x001e, 0x0440,
+	0x0016, 0x080c, 0x0f9d, 0x009e, 0xa974, 0x0016, 0x080c, 0xb6e9,
+	0x001e, 0x00f0, 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff, 0x90b6,
+	0x0002, 0x0180, 0x9086, 0x0028, 0x1118, 0xa87b, 0x001c, 0x0060,
+	0xd1dc, 0x0118, 0xa87b, 0x0015, 0x0038, 0xd1d4, 0x0118, 0xa87b,
+	0x0007, 0x0010, 0xa87b, 0x0000, 0x0016, 0x080c, 0x66a0, 0x001e,
+	0xd1e4, 0x1120, 0x080c, 0x9e19, 0x009e, 0x0005, 0x080c, 0xbdf7,
+	0x0cd8, 0x6004, 0x9086, 0x0040, 0x1120, 0x080c, 0x8846, 0x080c,
+	0x894b, 0x2019, 0x0001, 0x080c, 0x96bf, 0x6003, 0x0002, 0x080c,
+	0xc216, 0x080c, 0x88fb, 0x080c, 0x8a26, 0x0005, 0x6004, 0x9086,
+	0x0040, 0x1120, 0x080c, 0x8846, 0x080c, 0x894b, 0x2019, 0x0001,
+	0x080c, 0x96bf, 0x080c, 0x88fb, 0x080c, 0x2fd7, 0x080c, 0xc20e,
+	0x0096, 0x6114, 0x2148, 0x080c, 0xbafe, 0x0150, 0xa867, 0x0103,
+	0xa87b, 0x0029, 0xa877, 0x0000, 0x080c, 0x6885, 0x080c, 0xbce7,
+	0x009e, 0x080c, 0x9e19, 0x080c, 0x8a26, 0x0005, 0xa87b, 0x0015,
+	0xd1fc, 0x0180, 0xa87b, 0x0007, 0x8002, 0x8000, 0x810a, 0x9189,
+	0x0000, 0x0006, 0x0016, 0x2009, 0x1a4a, 0x2104, 0x8000, 0x200a,
+	0x001e, 0x000e, 0xa992, 0xa88e, 0x0005, 0x9182, 0x0054, 0x1220,
+	0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xb241, 0xb241, 0xb241,
+	0xb241, 0xb241, 0xb243, 0xb241, 0xb241, 0xb2e9, 0xb241, 0xb241,
+	0xb241, 0xb241, 0xb241, 0xb241, 0xb241, 0xb241, 0xb241, 0xb241,
+	0xb41a, 0x080c, 0x0db4, 0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071,
+	0x0260, 0x6114, 0x2150, 0x7644, 0xb676, 0x96b4, 0x0fff, 0xb77c,
+	0xc7e5, 0xb77e, 0x6210, 0x00b6, 0x2258, 0xba3c, 0x82ff, 0x0110,
+	0x8211, 0xba3e, 0x00be, 0x86ff, 0x0904, 0xb2e2, 0x9694, 0xff00,
+	0x9284, 0x0c00, 0x0120, 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284,
+	0x0300, 0x0904, 0xb2e2, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005,
+	0x1118, 0xc6c4, 0xb676, 0x0c38, 0x080c, 0x0feb, 0x090c, 0x0db4,
+	0x2900, 0xb07a, 0xb77c, 0x97bd, 0x0200, 0xb77e, 0xa867, 0x0103,
+	0xb068, 0xa86a, 0xb06c, 0xa86e, 0xb070, 0xa872, 0x7044, 0x9084,
+	0xf000, 0x9635, 0xae76, 0x968c, 0x0c00, 0x0120, 0x7348, 0xab92,
+	0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002, 0x0180, 0x9186,
+	0x0028, 0x1118, 0xa87b, 0x001c, 0x0060, 0xd6dc, 0x0118, 0xa87b,
+	0x0015, 0x0038, 0xd6d4, 0x0118, 0xa87b, 0x0007, 0x0010, 0xa87b,
+	0x0000, 0xaf7e, 0xb080, 0xa882, 0xb084, 0xa886, 0x901e, 0xd6c4,
+	0x0190, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210,
+	0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025,
+	0x080c, 0xb6f9, 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff,
+	0x01c8, 0x9192, 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011,
+	0x0029, 0x080c, 0xb6f9, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050,
+	0xb068, 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950,
+	0x080c, 0xb698, 0x080c, 0x18eb, 0x009e, 0x00ee, 0x00ae, 0x007e,
+	0x0005, 0x2001, 0x1959, 0x2004, 0x6042, 0x0096, 0x6114, 0x2148,
+	0xa83c, 0xa940, 0x9105, 0x1118, 0xa87c, 0xc0dc, 0xa87e, 0x6003,
+	0x0002, 0xa97c, 0xd1e4, 0x0904, 0xb415, 0x6043, 0x0000, 0x6010,
+	0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1500, 0xd1cc, 0x0904,
+	0xb3e4, 0xa978, 0xa868, 0xd0fc, 0x0904, 0xb3a5, 0x0016, 0xa87c,
+	0x0006, 0xa880, 0x0006, 0x00a6, 0x2150, 0xb174, 0x9184, 0x00ff,
+	0x90b6, 0x0002, 0x0904, 0xb373, 0x9086, 0x0028, 0x1904, 0xb35f,
+	0xa87b, 0x001c, 0xb07b, 0x001c, 0x0804, 0xb37b, 0x6024, 0xd0f4,
+	0x11d0, 0xa838, 0xaa34, 0x9205, 0x09c8, 0xa838, 0xaa90, 0x9206,
+	0x1120, 0xa88c, 0xaa34, 0x9206, 0x0988, 0x6024, 0xd0d4, 0x1148,
+	0xa9ac, 0xa834, 0x9102, 0x603a, 0xa9b0, 0xa838, 0x9103, 0x603e,
+	0x6024, 0xc0f5, 0x6026, 0x6010, 0x00b6, 0x2058, 0xb83c, 0x8000,
+	0xb83e, 0x00be, 0x9006, 0xa876, 0xa892, 0xa88e, 0xa87c, 0xc0e4,
+	0xa87e, 0xd0cc, 0x0140, 0xc0cc, 0xa87e, 0x0096, 0xa878, 0x2048,
+	0x080c, 0x0f9d, 0x009e, 0x080c, 0xbe31, 0x0804, 0xb415, 0xd1dc,
+	0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xc0c1, 0x0118,
+	0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007,
+	0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938,
+	0x9115, 0x190c, 0xb20e, 0xa87c, 0xb07e, 0xa890, 0xb092, 0xa88c,
+	0xb08e, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0019, 0x20a0, 0x20a9,
+	0x0020, 0x8a06, 0x8006, 0x8007, 0x9094, 0x003f, 0x22e0, 0x9084,
+	0xffc0, 0x9080, 0x0019, 0x2098, 0x4003, 0x00ae, 0x000e, 0xa882,
+	0x000e, 0xa87e, 0x080c, 0xc19e, 0x001e, 0xa874, 0x0006, 0x2148,
+	0x080c, 0x0f9d, 0x001e, 0x0804, 0xb411, 0x0016, 0x00a6, 0x2150,
+	0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01e0, 0x9086, 0x0028,
+	0x1128, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x00e0, 0xd1dc, 0x0158,
+	0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xc0c1, 0x0118, 0xb174,
 	0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b,
 	0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115,
-	0x190c, 0xaebd, 0xa87c, 0xb07e, 0xa890, 0xb092, 0xa88c, 0xb08e,
-	0xa860, 0x20e8, 0xa85c, 0x9080, 0x0019, 0x20a0, 0x20a9, 0x0020,
-	0x8a06, 0x8006, 0x8007, 0x9094, 0x003f, 0x22e0, 0x9084, 0xffc0,
-	0x9080, 0x0019, 0x2098, 0x4003, 0x00ae, 0x000e, 0xa882, 0x000e,
-	0xa87e, 0x080c, 0xbe2b, 0x001e, 0xa874, 0x0006, 0x2148, 0x080c,
-	0x0f9e, 0x001e, 0x0804, 0xb0c0, 0x0016, 0x00a6, 0x2150, 0xb174,
-	0x9184, 0x00ff, 0x90b6, 0x0002, 0x01e0, 0x9086, 0x0028, 0x1128,
-	0xa87b, 0x001c, 0xb07b, 0x001c, 0x00e0, 0xd1dc, 0x0158, 0xa87b,
-	0x0015, 0xb07b, 0x0015, 0x080c, 0xbd4e, 0x0118, 0xb174, 0xc1dc,
-	0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, 0x0007,
-	0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c,
-	0xaebd, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa87c, 0xb07e, 0x00ae,
-	0x080c, 0x0f9e, 0x009e, 0x080c, 0xbe2b, 0xa974, 0x0016, 0x080c,
-	0xb398, 0x001e, 0x0468, 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff,
-	0x90b6, 0x0002, 0x01b0, 0x9086, 0x0028, 0x1118, 0xa87b, 0x001c,
-	0x00d0, 0xd1dc, 0x0148, 0xa87b, 0x0015, 0x080c, 0xbd4e, 0x0118,
-	0xa974, 0xc1dc, 0xa976, 0x0078, 0xd1d4, 0x0118, 0xa87b, 0x0007,
-	0x0050, 0xa87b, 0x0000, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938,
-	0x9115, 0x190c, 0xaebd, 0xa974, 0x0016, 0x080c, 0x640d, 0x001e,
-	0xd1e4, 0x1120, 0x080c, 0x9ac8, 0x009e, 0x0005, 0x080c, 0xba85,
-	0x0cd8, 0x6114, 0x0096, 0x2148, 0xa97c, 0xd1e4, 0x190c, 0x1847,
-	0x009e, 0x0005, 0x080c, 0x8589, 0x0010, 0x080c, 0x863e, 0x080c,
-	0xb793, 0x01f0, 0x0096, 0x6114, 0x2148, 0x080c, 0xb992, 0x1118,
-	0x080c, 0xa456, 0x00a0, 0xa867, 0x0103, 0x2009, 0x180c, 0x210c,
-	0xd18c, 0x11b8, 0xd184, 0x1190, 0x6108, 0xa97a, 0x918e, 0x0029,
-	0x1110, 0x080c, 0xd42c, 0xa877, 0x0000, 0x080c, 0x65f2, 0x009e,
-	0x080c, 0x9ac8, 0x080c, 0x868e, 0x0804, 0x8769, 0xa87b, 0x0004,
-	0x0c90, 0xa87b, 0x0004, 0x0c78, 0x9182, 0x0054, 0x1220, 0x9182,
-	0x0040, 0x0208, 0x000a, 0x0005, 0xb120, 0xb120, 0xb120, 0xb120,
-	0xb120, 0xb122, 0xb120, 0xb120, 0xb120, 0xb120, 0xb120, 0xb120,
-	0xb120, 0xb120, 0xb120, 0xb120, 0xb120, 0xb120, 0xb120, 0xb120,
-	0x080c, 0x0db4, 0x080c, 0x515b, 0x01f8, 0x6014, 0x7144, 0x918c,
-	0x0fff, 0x9016, 0xd1c4, 0x0118, 0x7264, 0x9294, 0x00ff, 0x0096,
-	0x904d, 0x0188, 0xa87b, 0x0000, 0xa864, 0x9086, 0x0139, 0x0128,
-	0xa867, 0x0103, 0xa976, 0xaa96, 0x0030, 0xa897, 0x4000, 0xa99a,
-	0xaa9e, 0x080c, 0x65f2, 0x009e, 0x0804, 0x9ac8, 0x9182, 0x0085,
-	0x0002, 0xb158, 0xb156, 0xb156, 0xb164, 0xb156, 0xb156, 0xb156,
-	0xb156, 0xb156, 0xb156, 0xb156, 0xb156, 0xb156, 0x080c, 0x0db4,
-	0x6003, 0x0001, 0x6106, 0x080c, 0x810c, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x868e, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6,
-	0x2071, 0x0260, 0x7224, 0x6216, 0x7220, 0x080c, 0xb781, 0x01a0,
-	0x2268, 0x6800, 0x9086, 0x0000, 0x0178, 0x6010, 0x6d10, 0x952e,
-	0x1158, 0x00c6, 0x2d60, 0x080c, 0xb3d3, 0x00ce, 0x0128, 0x6803,
-	0x0002, 0x6007, 0x0086, 0x0010, 0x6007, 0x0087, 0x6003, 0x0001,
-	0x080c, 0x810c, 0x080c, 0x868e, 0x9280, 0x0004, 0x00b6, 0x2058,
-	0xb800, 0x00be, 0xd0bc, 0x0140, 0x6824, 0xd0ec, 0x0128, 0x00c6,
-	0x2260, 0x080c, 0xbabf, 0x00ce, 0x00ee, 0x00de, 0x005e, 0x002e,
-	0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c,
-	0x0db4, 0x908a, 0x0092, 0x1a0c, 0x0db4, 0x9082, 0x0085, 0x00e2,
-	0x9186, 0x0027, 0x0120, 0x9186, 0x0014, 0x190c, 0x0db4, 0x080c,
-	0x8589, 0x0096, 0x6014, 0x2048, 0x080c, 0xb793, 0x0140, 0xa867,
-	0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x65f2, 0x009e,
-	0x080c, 0x9af8, 0x0804, 0x868e, 0xb1d9, 0xb1db, 0xb1db, 0xb1d9,
-	0xb1d9, 0xb1d9, 0xb1d9, 0xb1d9, 0xb1d9, 0xb1d9, 0xb1d9, 0xb1d9,
-	0xb1d9, 0x080c, 0x0db4, 0x080c, 0x8589, 0x080c, 0x9af8, 0x080c,
-	0x868e, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, 0x9082, 0x0085,
-	0x2008, 0x04b8, 0x9186, 0x0027, 0x11f8, 0x080c, 0x8589, 0x080c,
-	0x2e7f, 0x080c, 0xbe9b, 0x0096, 0x6014, 0x2048, 0x080c, 0xb793,
-	0x0150, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c,
-	0x65f2, 0x080c, 0xb975, 0x009e, 0x080c, 0x9ac8, 0x080c, 0x868e,
-	0x0005, 0x080c, 0x9b5d, 0x0ce0, 0x9186, 0x0014, 0x1dd0, 0x080c,
-	0x8589, 0x0096, 0x6014, 0x2048, 0x080c, 0xb793, 0x0d60, 0xa867,
-	0x0103, 0xa877, 0x0000, 0xa87b, 0x0006, 0xa880, 0xc0ec, 0xa882,
-	0x08f0, 0x0002, 0xb231, 0xb22f, 0xb22f, 0xb22f, 0xb22f, 0xb22f,
-	0xb249, 0xb22f, 0xb22f, 0xb22f, 0xb22f, 0xb22f, 0xb22f, 0x080c,
-	0x0db4, 0x080c, 0x8589, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186,
-	0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1955, 0x0010,
-	0x2001, 0x1956, 0x2004, 0x601a, 0x6003, 0x000c, 0x080c, 0x868e,
-	0x0005, 0x080c, 0x8589, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186,
-	0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1955, 0x0010,
-	0x2001, 0x1956, 0x2004, 0x601a, 0x6003, 0x000e, 0x080c, 0x868e,
-	0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, 0x0012,
-	0x0804, 0x9b5d, 0xb277, 0xb277, 0xb277, 0xb277, 0xb279, 0xb2c6,
-	0xb277, 0xb277, 0xb277, 0xb277, 0xb277, 0xb277, 0xb277, 0x080c,
-	0x0db4, 0x0096, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc,
-	0x0168, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118,
-	0x9186, 0x0035, 0x1118, 0x009e, 0x0804, 0xb2da, 0x080c, 0xb793,
-	0x1118, 0x080c, 0xb975, 0x0068, 0x6014, 0x2048, 0xa87c, 0xd0e4,
-	0x1110, 0x080c, 0xb975, 0xa867, 0x0103, 0x080c, 0xbe66, 0x080c,
-	0x65f2, 0x00d6, 0x2c68, 0x080c, 0x9a72, 0x01d0, 0x6003, 0x0001,
-	0x6007, 0x001e, 0x600b, 0xffff, 0x2009, 0x026e, 0x210c, 0x613a,
-	0x2009, 0x026f, 0x210c, 0x613e, 0x6910, 0x6112, 0x080c, 0xbc01,
-	0x6954, 0x6156, 0x6023, 0x0001, 0x080c, 0x810c, 0x080c, 0x868e,
-	0x2d60, 0x00de, 0x080c, 0x9ac8, 0x009e, 0x0005, 0x6010, 0x00b6,
-	0x2058, 0xb800, 0x00be, 0xd0bc, 0x05a0, 0x6034, 0x908c, 0xff00,
-	0x810f, 0x9186, 0x0035, 0x0130, 0x9186, 0x001e, 0x0118, 0x9186,
-	0x0039, 0x1538, 0x00d6, 0x2c68, 0x080c, 0xbdfe, 0x11f0, 0x080c,
-	0x9a72, 0x01d8, 0x6106, 0x6003, 0x0001, 0x6023, 0x0001, 0x6910,
-	0x6112, 0x692c, 0x612e, 0x6930, 0x6132, 0x6934, 0x918c, 0x00ff,
-	0x6136, 0x6938, 0x613a, 0x693c, 0x613e, 0x6954, 0x6156, 0x080c,
-	0xbc01, 0x080c, 0x810c, 0x080c, 0x868e, 0x2d60, 0x00de, 0x0804,
-	0x9ac8, 0x0096, 0x6014, 0x2048, 0x080c, 0xb793, 0x01c8, 0xa867,
-	0x0103, 0xa880, 0xd0b4, 0x0128, 0xc0ec, 0xa882, 0xa87b, 0x0006,
-	0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005,
-	0x080c, 0xba81, 0xa877, 0x0000, 0x080c, 0x65f2, 0x080c, 0xb975,
-	0x009e, 0x0804, 0x9ac8, 0x0016, 0x0096, 0x6014, 0x2048, 0x080c,
-	0xb793, 0x0140, 0xa867, 0x0103, 0xa87b, 0x0028, 0xa877, 0x0000,
-	0x080c, 0x65f2, 0x009e, 0x001e, 0x9186, 0x0013, 0x0148, 0x9186,
-	0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0x9b5d, 0x0030,
-	0x080c, 0x8589, 0x080c, 0x9af8, 0x080c, 0x868e, 0x0005, 0x0056,
-	0x0066, 0x0096, 0x00a6, 0x2029, 0x0001, 0x9182, 0x0101, 0x1208,
-	0x0010, 0x2009, 0x0100, 0x2130, 0x8304, 0x9098, 0x0018, 0x2009,
-	0x0020, 0x2011, 0x0029, 0x080c, 0xb3a8, 0x96b2, 0x0020, 0xb004,
-	0x904d, 0x0110, 0x080c, 0x0f9e, 0x080c, 0x0fec, 0x0520, 0x8528,
-	0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d,
-	0x1228, 0x2608, 0x2011, 0x001b, 0x0499, 0x00a8, 0x96b2, 0x003c,
-	0x2009, 0x003c, 0x2950, 0x2011, 0x001b, 0x0451, 0x0c28, 0x2001,
-	0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0003, 0xb566,
-	0x95ac, 0x0000, 0x0048, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae,
-	0x852f, 0x95ad, 0x0003, 0xb566, 0x009e, 0x006e, 0x005e, 0x0005,
-	0x00a6, 0x89ff, 0x0158, 0xa804, 0x9055, 0x0130, 0xa807, 0x0000,
-	0x080c, 0x65f2, 0x2a48, 0x0cb8, 0x080c, 0x65f2, 0x00ae, 0x0005,
-	0x00f6, 0x2079, 0x0200, 0x7814, 0x9085, 0x0080, 0x7816, 0xd184,
-	0x0108, 0x8108, 0x810c, 0x20a9, 0x0001, 0xa860, 0x20e8, 0xa85c,
-	0x9200, 0x20a0, 0x20e1, 0x0000, 0x2300, 0x9e00, 0x2098, 0x4003,
-	0x8318, 0x9386, 0x0020, 0x1148, 0x2018, 0x2300, 0x9e00, 0x2098,
-	0x7814, 0x8000, 0x9085, 0x0080, 0x7816, 0x8109, 0x1d80, 0x7817,
-	0x0000, 0x00fe, 0x0005, 0x0066, 0x0126, 0x2091, 0x8000, 0x2031,
-	0x0001, 0x6020, 0x9084, 0x000f, 0x0083, 0x012e, 0x006e, 0x0005,
-	0x0126, 0x2091, 0x8000, 0x0066, 0x2031, 0x0000, 0x6020, 0x9084,
-	0x000f, 0x001b, 0x006e, 0x012e, 0x0005, 0xb40e, 0xb40e, 0xb409,
-	0xb430, 0xb3fc, 0xb409, 0xb430, 0xb409, 0xb3fc, 0xb3fc, 0xb409,
-	0xb409, 0xb409, 0xb3fc, 0xb3fc, 0x080c, 0x0db4, 0x0036, 0x2019,
-	0x0010, 0x080c, 0xcd45, 0x6023, 0x0006, 0x6003, 0x0007, 0x003e,
-	0x0005, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x0096, 0x86ff,
-	0x11d8, 0x6014, 0x2048, 0x080c, 0xb793, 0x01c0, 0xa864, 0x9086,
-	0x0139, 0x1128, 0xa87b, 0x0005, 0xa883, 0x0000, 0x0028, 0x900e,
-	0x2001, 0x0005, 0x080c, 0x682c, 0x080c, 0xba81, 0x080c, 0x65e5,
-	0x080c, 0x9af8, 0x9085, 0x0001, 0x009e, 0x0005, 0x9006, 0x0ce0,
-	0x6000, 0x908a, 0x0016, 0x1a0c, 0x0db4, 0x0002, 0xb446, 0xb474,
-	0xb448, 0xb495, 0xb46f, 0xb446, 0xb409, 0xb40e, 0xb40e, 0xb409,
-	0xb409, 0xb409, 0xb409, 0xb409, 0xb409, 0xb409, 0x080c, 0x0db4,
-	0x86ff, 0x1510, 0x6020, 0x9086, 0x0006, 0x01f0, 0x0096, 0x6014,
-	0x2048, 0x080c, 0xb793, 0x0158, 0xa87c, 0xd0cc, 0x0130, 0x0096,
-	0xa878, 0x2048, 0x080c, 0x0f9e, 0x009e, 0x080c, 0xba81, 0x009e,
-	0x080c, 0xbe40, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002,
-	0x080c, 0x810c, 0x080c, 0x868e, 0x9085, 0x0001, 0x0005, 0x0066,
-	0x080c, 0x185b, 0x006e, 0x08a0, 0x00e6, 0x2071, 0x19b6, 0x7024,
-	0x9c06, 0x1120, 0x080c, 0x92e4, 0x00ee, 0x0850, 0x6020, 0x9084,
-	0x000f, 0x9086, 0x0006, 0x1150, 0x0086, 0x0096, 0x2049, 0x0001,
-	0x2c40, 0x080c, 0x9450, 0x009e, 0x008e, 0x0010, 0x080c, 0x91e1,
-	0x00ee, 0x1904, 0xb448, 0x0804, 0xb409, 0x0036, 0x00e6, 0x2071,
-	0x19b6, 0x703c, 0x9c06, 0x1138, 0x901e, 0x080c, 0x935a, 0x00ee,
-	0x003e, 0x0804, 0xb448, 0x080c, 0x9580, 0x00ee, 0x003e, 0x1904,
-	0xb448, 0x0804, 0xb409, 0x00c6, 0x6020, 0x9084, 0x000f, 0x0013,
-	0x00ce, 0x0005, 0xb4c8, 0xb577, 0xb6de, 0xb4d2, 0x9af8, 0xb4c8,
-	0xcd37, 0xbea8, 0xb577, 0xb4c1, 0xb75d, 0xb4c1, 0xb4c1, 0xb4c1,
-	0xb4c1, 0x080c, 0x0db4, 0x080c, 0xb992, 0x1110, 0x080c, 0xa456,
-	0x0005, 0x080c, 0x8589, 0x080c, 0x868e, 0x0804, 0x9ac8, 0x601b,
-	0x0001, 0x0005, 0x080c, 0xb793, 0x0130, 0x6014, 0x0096, 0x2048,
-	0x2c00, 0xa896, 0x009e, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0db4,
-	0x0002, 0xb4f1, 0xb4f3, 0xb517, 0xb52b, 0xb54f, 0xb4f1, 0xb4c8,
-	0xb4c8, 0xb4c8, 0xb52b, 0xb52b, 0xb4f1, 0xb4f1, 0xb4f1, 0xb4f1,
-	0xb535, 0x080c, 0x0db4, 0x00e6, 0x6014, 0x0096, 0x2048, 0xa880,
-	0xc0b5, 0xa882, 0x009e, 0x2071, 0x19b6, 0x7024, 0x9c06, 0x01a0,
-	0x080c, 0x91e1, 0x080c, 0xbe40, 0x6007, 0x0085, 0x6003, 0x000b,
-	0x6023, 0x0002, 0x2001, 0x1956, 0x2004, 0x601a, 0x080c, 0x810c,
-	0x080c, 0x868e, 0x00ee, 0x0005, 0x601b, 0x0001, 0x0cd8, 0x0096,
-	0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x080c, 0xbe40,
-	0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x810c,
-	0x080c, 0x868e, 0x0005, 0x0096, 0x601b, 0x0001, 0x6014, 0x2048,
-	0xa880, 0xc0b5, 0xa882, 0x009e, 0x0005, 0x080c, 0x515b, 0x01a8,
-	0x6014, 0x0096, 0x904d, 0x0180, 0xa864, 0xa867, 0x0103, 0xa87b,
-	0x0006, 0x9086, 0x0139, 0x1140, 0xa867, 0x0139, 0xa897, 0x4005,
-	0xa89b, 0x0004, 0x080c, 0x65f2, 0x009e, 0x0804, 0x9ac8, 0x6014,
-	0x0096, 0x904d, 0x01f8, 0xa97c, 0xd1e4, 0x01e0, 0x2001, 0x180f,
-	0x2004, 0xd0c4, 0x0110, 0x009e, 0x0005, 0xa884, 0x009e, 0x8003,
-	0x800b, 0x810b, 0x9108, 0x611a, 0x2001, 0x0037, 0x2c08, 0x080c,
-	0x14fc, 0x6000, 0x9086, 0x0004, 0x1120, 0x2009, 0x0048, 0x080c,
-	0x9b42, 0x0005, 0x009e, 0x080c, 0x185b, 0x0804, 0xb517, 0x6000,
-	0x908a, 0x0016, 0x1a0c, 0x0db4, 0x000b, 0x0005, 0xb58e, 0xb4cf,
-	0xb590, 0xb58e, 0xb590, 0xb590, 0xb4c9, 0xb58e, 0xb4c3, 0xb4c3,
-	0xb58e, 0xb58e, 0xb58e, 0xb58e, 0xb58e, 0xb58e, 0x080c, 0x0db4,
-	0x6010, 0x00b6, 0x2058, 0xb804, 0x9084, 0x00ff, 0x00be, 0x908a,
-	0x000c, 0x1a0c, 0x0db4, 0x00b6, 0x0013, 0x00be, 0x0005, 0xb5ab,
-	0xb678, 0xb5ad, 0xb5ed, 0xb5ad, 0xb5ed, 0xb5ad, 0xb5bb, 0xb5ab,
-	0xb5ed, 0xb5ab, 0xb5dc, 0x080c, 0x0db4, 0x6004, 0x908e, 0x0016,
-	0x05c0, 0x908e, 0x0004, 0x05a8, 0x908e, 0x0002, 0x0590, 0x908e,
-	0x0052, 0x0904, 0xb674, 0x6004, 0x080c, 0xb992, 0x0904, 0xb691,
-	0x908e, 0x0004, 0x1110, 0x080c, 0x2ea4, 0x908e, 0x0021, 0x0904,
-	0xb695, 0x908e, 0x0022, 0x0904, 0xb6d9, 0x908e, 0x003d, 0x0904,
-	0xb695, 0x908e, 0x0039, 0x0904, 0xb699, 0x908e, 0x0035, 0x0904,
-	0xb699, 0x908e, 0x001e, 0x0178, 0x908e, 0x0001, 0x1140, 0x6010,
-	0x2058, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x0110, 0x080c,
-	0x2e7f, 0x080c, 0xa456, 0x0804, 0x9af8, 0x00c6, 0x00d6, 0x6104,
-	0x9186, 0x0016, 0x0904, 0xb665, 0x9186, 0x0002, 0x1904, 0xb63a,
-	0x2001, 0x1836, 0x2004, 0xd08c, 0x11c8, 0x080c, 0x6d14, 0x11b0,
-	0x080c, 0xbe86, 0x0138, 0x080c, 0x6d37, 0x1120, 0x080c, 0x6c24,
-	0x0804, 0xb6c2, 0x2001, 0x194e, 0x2003, 0x0001, 0x2001, 0x1800,
-	0x2003, 0x0001, 0x080c, 0x6c46, 0x0804, 0xb6c2, 0x6010, 0x2058,
-	0x2001, 0x1836, 0x2004, 0xd0ac, 0x1904, 0xb6c2, 0xb8a0, 0x9084,
-	0xff80, 0x1904, 0xb6c2, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0190,
-	0x8001, 0xb842, 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398,
-	0x6043, 0x0000, 0x080c, 0x9a72, 0x0128, 0x2b00, 0x6012, 0x6023,
-	0x0001, 0x0458, 0x00de, 0x00ce, 0x6004, 0x908e, 0x0002, 0x11a0,
-	0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, 0x1170, 0x2009, 0x1836,
-	0x2104, 0xc085, 0x200a, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5a27,
-	0x00ee, 0x080c, 0xa456, 0x0030, 0x080c, 0xa456, 0x080c, 0x2e7f,
-	0x080c, 0xbe9b, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2ea4,
-	0x012e, 0x00ee, 0x080c, 0x9af8, 0x0005, 0x2001, 0x0002, 0x080c,
-	0x5f42, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8154, 0x080c,
-	0x868e, 0x00de, 0x00ce, 0x0c80, 0x080c, 0x2ea4, 0x0804, 0xb5e9,
-	0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0d38, 0x6010, 0x2058,
-	0xb840, 0x9084, 0x00ff, 0x9005, 0x0904, 0xb63a, 0x8001, 0xb842,
-	0x6003, 0x0001, 0x080c, 0x8154, 0x080c, 0x868e, 0x00de, 0x00ce,
-	0x0898, 0x080c, 0xa456, 0x0804, 0xb5eb, 0x080c, 0xa492, 0x0804,
-	0xb5eb, 0x00d6, 0x2c68, 0x6104, 0x080c, 0xbdfe, 0x00de, 0x0118,
-	0x080c, 0x9ac8, 0x00f0, 0x6004, 0x8007, 0x6134, 0x918c, 0x00ff,
-	0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002,
-	0x603c, 0x600a, 0x2001, 0x1956, 0x2004, 0x601a, 0x602c, 0x2c08,
-	0x2060, 0x6024, 0xc0b5, 0x6026, 0x2160, 0x080c, 0x810c, 0x080c,
-	0x868e, 0x0005, 0x00de, 0x00ce, 0x080c, 0xa456, 0x080c, 0x2e7f,
-	0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2ea4, 0x6017, 0x0000,
-	0x6023, 0x0007, 0x601b, 0x0398, 0x6043, 0x0000, 0x012e, 0x00ee,
-	0x0005, 0x080c, 0x9ef7, 0x1904, 0xb691, 0x0005, 0x6000, 0x908a,
-	0x0016, 0x1a0c, 0x0db4, 0x0096, 0x00d6, 0x001b, 0x00de, 0x009e,
-	0x0005, 0xb6f9, 0xb6f9, 0xb6f9, 0xb6f9, 0xb6f9, 0xb6f9, 0xb6f9,
-	0xb6f9, 0xb6f9, 0xb4c8, 0xb6f9, 0xb4cf, 0xb6fb, 0xb4cf, 0xb708,
-	0xb6f9, 0x080c, 0x0db4, 0x6004, 0x9086, 0x008b, 0x0148, 0x6007,
-	0x008b, 0x6003, 0x000d, 0x080c, 0x810c, 0x080c, 0x868e, 0x0005,
-	0x080c, 0xbe7a, 0x0118, 0x080c, 0xbe8d, 0x0010, 0x080c, 0xbe9b,
-	0x080c, 0xb975, 0x080c, 0xb793, 0x0570, 0x080c, 0x2e7f, 0x080c,
-	0xb793, 0x0168, 0x6014, 0x2048, 0xa867, 0x0103, 0xa87b, 0x0006,
-	0xa877, 0x0000, 0xa880, 0xc0ed, 0xa882, 0x080c, 0x65f2, 0x2c68,
-	0x080c, 0x9a72, 0x0150, 0x6810, 0x6012, 0x080c, 0xbc01, 0x00c6,
-	0x2d60, 0x080c, 0x9af8, 0x00ce, 0x0008, 0x2d60, 0x6017, 0x0000,
-	0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x8154,
-	0x080c, 0x868e, 0x00c8, 0x080c, 0xbe7a, 0x0138, 0x6034, 0x9086,
-	0x4000, 0x1118, 0x080c, 0x2e7f, 0x08d0, 0x6034, 0x908c, 0xff00,
-	0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x080c,
-	0x2e7f, 0x0868, 0x080c, 0x9af8, 0x0005, 0x6000, 0x908a, 0x0016,
-	0x1a0c, 0x0db4, 0x0002, 0xb773, 0xb773, 0xb775, 0xb775, 0xb775,
-	0xb773, 0xb773, 0x9af8, 0xb773, 0xb773, 0xb773, 0xb773, 0xb773,
-	0xb773, 0xb773, 0xb773, 0x080c, 0x0db4, 0x080c, 0x9580, 0x6114,
-	0x0096, 0x2148, 0xa87b, 0x0006, 0x080c, 0x65f2, 0x009e, 0x0804,
-	0x9ac8, 0x9284, 0x0007, 0x1158, 0x9282, 0x1cd0, 0x0240, 0x2001,
-	0x1819, 0x2004, 0x9202, 0x1218, 0x9085, 0x0001, 0x0005, 0x9006,
-	0x0ce8, 0x0096, 0x0028, 0x0096, 0x0006, 0x6014, 0x2048, 0x000e,
-	0x0006, 0x9984, 0xf000, 0x9086, 0xf000, 0x0110, 0x080c, 0x1097,
-	0x000e, 0x009e, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0006, 0x0126,
-	0x2091, 0x8000, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x7350, 0x7070,
-	0x9302, 0x1640, 0x6020, 0x9206, 0x11f8, 0x080c, 0xbe86, 0x0180,
-	0x9286, 0x0001, 0x1168, 0x6004, 0x9086, 0x0004, 0x1148, 0x080c,
-	0x2e7f, 0x080c, 0xbe9b, 0x00c6, 0x080c, 0x9af8, 0x00ce, 0x0060,
-	0x080c, 0xbb7b, 0x0148, 0x080c, 0xb992, 0x1110, 0x080c, 0xa456,
-	0x00c6, 0x080c, 0x9ac8, 0x00ce, 0x9ce0, 0x0018, 0x7064, 0x9c02,
-	0x1208, 0x08a0, 0x012e, 0x000e, 0x003e, 0x00ce, 0x00ee, 0x0005,
-	0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000, 0x210c, 0x81ff, 0x0128,
-	0x2061, 0x1a77, 0x6112, 0x080c, 0x2e7f, 0x9006, 0x0010, 0x9085,
-	0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6, 0x0126, 0x2091,
-	0x8000, 0x080c, 0x9a72, 0x01d8, 0x080c, 0x515b, 0x0110, 0x662e,
-	0x0008, 0x6616, 0x2b00, 0x6012, 0x080c, 0x515b, 0x0118, 0x080c,
-	0xb8b9, 0x0168, 0x080c, 0xbc01, 0x6023, 0x0003, 0x2009, 0x004b,
-	0x080c, 0x9b42, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006,
-	0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0xbaa0, 0x080c, 0x9b15,
-	0x0590, 0x080c, 0x515b, 0x0118, 0x602f, 0x0000, 0x0010, 0x6017,
-	0x0000, 0x2b00, 0x6012, 0x080c, 0xbc01, 0x6023, 0x0003, 0x0016,
-	0x080c, 0x828c, 0x0076, 0x903e, 0x080c, 0x8184, 0x2c08, 0x080c,
-	0xcef9, 0x007e, 0x001e, 0xd184, 0x0128, 0x080c, 0x9ac8, 0x9085,
-	0x0001, 0x0070, 0x080c, 0x515b, 0x0128, 0xd18c, 0x1170, 0x080c,
-	0xb8b9, 0x0148, 0x2009, 0x004c, 0x080c, 0x9b42, 0x9085, 0x0001,
+	0x190c, 0xb20e, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa87c, 0xb07e,
+	0x00ae, 0x080c, 0x0f9d, 0x009e, 0x080c, 0xc19e, 0xa974, 0x0016,
+	0x080c, 0xb6e9, 0x001e, 0x0468, 0xa867, 0x0103, 0xa974, 0x9184,
+	0x00ff, 0x90b6, 0x0002, 0x01b0, 0x9086, 0x0028, 0x1118, 0xa87b,
+	0x001c, 0x00d0, 0xd1dc, 0x0148, 0xa87b, 0x0015, 0x080c, 0xc0c1,
+	0x0118, 0xa974, 0xc1dc, 0xa976, 0x0078, 0xd1d4, 0x0118, 0xa87b,
+	0x0007, 0x0050, 0xa87b, 0x0000, 0xa87c, 0xd0ac, 0x0128, 0xa834,
+	0xa938, 0x9115, 0x190c, 0xb20e, 0xa974, 0x0016, 0x080c, 0x66a0,
+	0x001e, 0xd1e4, 0x1120, 0x080c, 0x9e19, 0x009e, 0x0005, 0x080c,
+	0xbdf7, 0x0cd8, 0x6114, 0x0096, 0x2148, 0xa97c, 0xd1e4, 0x190c,
+	0x18f9, 0x009e, 0x0005, 0x080c, 0x8846, 0x0010, 0x080c, 0x88fb,
+	0x080c, 0xbafe, 0x01f0, 0x0096, 0x6114, 0x2148, 0x080c, 0xbd04,
+	0x1118, 0x080c, 0xa7a7, 0x00a0, 0xa867, 0x0103, 0x2009, 0x180c,
+	0x210c, 0xd18c, 0x11b8, 0xd184, 0x1190, 0x6108, 0xa97a, 0x918e,
+	0x0029, 0x1110, 0x080c, 0xd7b3, 0xa877, 0x0000, 0x080c, 0x6885,
+	0x009e, 0x080c, 0x9e19, 0x080c, 0x894b, 0x0804, 0x8a26, 0xa87b,
+	0x0004, 0x0c90, 0xa87b, 0x0004, 0x0c78, 0x9182, 0x0054, 0x1220,
+	0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xb471, 0xb471, 0xb471,
+	0xb471, 0xb471, 0xb473, 0xb471, 0xb471, 0xb471, 0xb471, 0xb471,
+	0xb471, 0xb471, 0xb471, 0xb471, 0xb471, 0xb471, 0xb471, 0xb471,
+	0xb471, 0x080c, 0x0db4, 0x080c, 0x5387, 0x01f8, 0x6014, 0x7144,
+	0x918c, 0x0fff, 0x9016, 0xd1c4, 0x0118, 0x7264, 0x9294, 0x00ff,
+	0x0096, 0x904d, 0x0188, 0xa87b, 0x0000, 0xa864, 0x9086, 0x0139,
+	0x0128, 0xa867, 0x0103, 0xa976, 0xaa96, 0x0030, 0xa897, 0x4000,
+	0xa99a, 0xaa9e, 0x080c, 0x6885, 0x009e, 0x0804, 0x9e19, 0x9182,
+	0x0085, 0x0002, 0xb4a9, 0xb4a7, 0xb4a7, 0xb4b5, 0xb4a7, 0xb4a7,
+	0xb4a7, 0xb4a7, 0xb4a7, 0xb4a7, 0xb4a7, 0xb4a7, 0xb4a7, 0x080c,
+	0x0db4, 0x6003, 0x0001, 0x6106, 0x080c, 0x83c9, 0x0126, 0x2091,
+	0x8000, 0x080c, 0x894b, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6,
+	0x00e6, 0x2071, 0x0260, 0x7224, 0x6216, 0x7220, 0x080c, 0xbaec,
+	0x01a0, 0x2268, 0x6800, 0x9086, 0x0000, 0x0178, 0x6010, 0x6d10,
+	0x952e, 0x1158, 0x00c6, 0x2d60, 0x080c, 0xb724, 0x00ce, 0x0128,
+	0x6803, 0x0002, 0x6007, 0x0086, 0x0010, 0x6007, 0x0087, 0x6003,
+	0x0001, 0x080c, 0x83c9, 0x080c, 0x894b, 0x9280, 0x0004, 0x00b6,
+	0x2058, 0xb800, 0x00be, 0xd0bc, 0x0140, 0x6824, 0xd0ec, 0x0128,
+	0x00c6, 0x2260, 0x080c, 0xbe31, 0x00ce, 0x00ee, 0x00de, 0x005e,
+	0x002e, 0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085,
+	0x0a0c, 0x0db4, 0x908a, 0x0092, 0x1a0c, 0x0db4, 0x9082, 0x0085,
+	0x00e2, 0x9186, 0x0027, 0x0120, 0x9186, 0x0014, 0x190c, 0x0db4,
+	0x080c, 0x8846, 0x0096, 0x6014, 0x2048, 0x080c, 0xbafe, 0x0140,
+	0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x6885,
+	0x009e, 0x080c, 0x9e49, 0x0804, 0x894b, 0xb52a, 0xb52c, 0xb52c,
+	0xb52a, 0xb52a, 0xb52a, 0xb52a, 0xb52a, 0xb52a, 0xb52a, 0xb52a,
+	0xb52a, 0xb52a, 0x080c, 0x0db4, 0x080c, 0x8846, 0x080c, 0x9e49,
+	0x080c, 0x894b, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, 0x9082,
+	0x0085, 0x2008, 0x04b8, 0x9186, 0x0027, 0x11f8, 0x080c, 0x8846,
+	0x080c, 0x2fd7, 0x080c, 0xc20e, 0x0096, 0x6014, 0x2048, 0x080c,
+	0xbafe, 0x0150, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029,
+	0x080c, 0x6885, 0x080c, 0xbce7, 0x009e, 0x080c, 0x9e19, 0x080c,
+	0x894b, 0x0005, 0x080c, 0x9eae, 0x0ce0, 0x9186, 0x0014, 0x1dd0,
+	0x080c, 0x8846, 0x0096, 0x6014, 0x2048, 0x080c, 0xbafe, 0x0d60,
+	0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0006, 0xa880, 0xc0ec,
+	0xa882, 0x08f0, 0x0002, 0xb582, 0xb580, 0xb580, 0xb580, 0xb580,
+	0xb580, 0xb59a, 0xb580, 0xb580, 0xb580, 0xb580, 0xb580, 0xb580,
+	0x080c, 0x0db4, 0x080c, 0x8846, 0x6034, 0x908c, 0xff00, 0x810f,
+	0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1957,
+	0x0010, 0x2001, 0x1958, 0x2004, 0x601a, 0x6003, 0x000c, 0x080c,
+	0x894b, 0x0005, 0x080c, 0x8846, 0x6034, 0x908c, 0xff00, 0x810f,
+	0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1957,
+	0x0010, 0x2001, 0x1958, 0x2004, 0x601a, 0x6003, 0x000e, 0x080c,
+	0x894b, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208,
+	0x0012, 0x0804, 0x9eae, 0xb5c8, 0xb5c8, 0xb5c8, 0xb5c8, 0xb5ca,
+	0xb617, 0xb5c8, 0xb5c8, 0xb5c8, 0xb5c8, 0xb5c8, 0xb5c8, 0xb5c8,
+	0x080c, 0x0db4, 0x0096, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be,
+	0xd0bc, 0x0168, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039,
+	0x0118, 0x9186, 0x0035, 0x1118, 0x009e, 0x0804, 0xb62b, 0x080c,
+	0xbafe, 0x1118, 0x080c, 0xbce7, 0x0068, 0x6014, 0x2048, 0xa87c,
+	0xd0e4, 0x1110, 0x080c, 0xbce7, 0xa867, 0x0103, 0x080c, 0xc1d9,
+	0x080c, 0x6885, 0x00d6, 0x2c68, 0x080c, 0x9dc3, 0x01d0, 0x6003,
+	0x0001, 0x6007, 0x001e, 0x600b, 0xffff, 0x2009, 0x026e, 0x210c,
+	0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x6910, 0x6112, 0x080c,
+	0xbf73, 0x6954, 0x6156, 0x6023, 0x0001, 0x080c, 0x83c9, 0x080c,
+	0x894b, 0x2d60, 0x00de, 0x080c, 0x9e19, 0x009e, 0x0005, 0x6010,
+	0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x05a0, 0x6034, 0x908c,
+	0xff00, 0x810f, 0x9186, 0x0035, 0x0130, 0x9186, 0x001e, 0x0118,
+	0x9186, 0x0039, 0x1538, 0x00d6, 0x2c68, 0x080c, 0xc171, 0x11f0,
+	0x080c, 0x9dc3, 0x01d8, 0x6106, 0x6003, 0x0001, 0x6023, 0x0001,
+	0x6910, 0x6112, 0x692c, 0x612e, 0x6930, 0x6132, 0x6934, 0x918c,
+	0x00ff, 0x6136, 0x6938, 0x613a, 0x693c, 0x613e, 0x6954, 0x6156,
+	0x080c, 0xbf73, 0x080c, 0x83c9, 0x080c, 0x894b, 0x2d60, 0x00de,
+	0x0804, 0x9e19, 0x0096, 0x6014, 0x2048, 0x080c, 0xbafe, 0x01c8,
+	0xa867, 0x0103, 0xa880, 0xd0b4, 0x0128, 0xc0ec, 0xa882, 0xa87b,
+	0x0006, 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b,
+	0x0005, 0x080c, 0xbdf3, 0xa877, 0x0000, 0x080c, 0x6885, 0x080c,
+	0xbce7, 0x009e, 0x0804, 0x9e19, 0x0016, 0x0096, 0x6014, 0x2048,
+	0x080c, 0xbafe, 0x0140, 0xa867, 0x0103, 0xa87b, 0x0028, 0xa877,
+	0x0000, 0x080c, 0x6885, 0x009e, 0x001e, 0x9186, 0x0013, 0x0148,
+	0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0x9eae,
+	0x0030, 0x080c, 0x8846, 0x080c, 0x9e49, 0x080c, 0x894b, 0x0005,
+	0x0056, 0x0066, 0x0096, 0x00a6, 0x2029, 0x0001, 0x9182, 0x0101,
+	0x1208, 0x0010, 0x2009, 0x0100, 0x2130, 0x8304, 0x9098, 0x0018,
+	0x2009, 0x0020, 0x2011, 0x0029, 0x080c, 0xb6f9, 0x96b2, 0x0020,
+	0xb004, 0x904d, 0x0110, 0x080c, 0x0f9d, 0x080c, 0x0feb, 0x0520,
+	0x8528, 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, 0xb406, 0x968a,
+	0x003d, 0x1228, 0x2608, 0x2011, 0x001b, 0x0499, 0x00a8, 0x96b2,
+	0x003c, 0x2009, 0x003c, 0x2950, 0x2011, 0x001b, 0x0451, 0x0c28,
+	0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0003,
+	0xb566, 0x95ac, 0x0000, 0x0048, 0x2001, 0x0205, 0x2003, 0x0000,
+	0x00ae, 0x852f, 0x95ad, 0x0003, 0xb566, 0x009e, 0x006e, 0x005e,
+	0x0005, 0x00a6, 0x89ff, 0x0158, 0xa804, 0x9055, 0x0130, 0xa807,
+	0x0000, 0x080c, 0x6885, 0x2a48, 0x0cb8, 0x080c, 0x6885, 0x00ae,
+	0x0005, 0x00f6, 0x2079, 0x0200, 0x7814, 0x9085, 0x0080, 0x7816,
+	0xd184, 0x0108, 0x8108, 0x810c, 0x20a9, 0x0001, 0xa860, 0x20e8,
+	0xa85c, 0x9200, 0x20a0, 0x20e1, 0x0000, 0x2300, 0x9e00, 0x2098,
+	0x4003, 0x8318, 0x9386, 0x0020, 0x1148, 0x2018, 0x2300, 0x9e00,
+	0x2098, 0x7814, 0x8000, 0x9085, 0x0080, 0x7816, 0x8109, 0x1d80,
+	0x7817, 0x0000, 0x00fe, 0x0005, 0x0066, 0x0126, 0x2091, 0x8000,
+	0x2031, 0x0001, 0x6020, 0x9084, 0x000f, 0x0083, 0x012e, 0x006e,
+	0x0005, 0x0126, 0x2091, 0x8000, 0x0066, 0x2031, 0x0000, 0x6020,
+	0x9084, 0x000f, 0x001b, 0x006e, 0x012e, 0x0005, 0xb75f, 0xb75f,
+	0xb75a, 0xb781, 0xb74d, 0xb75a, 0xb781, 0xb75a, 0xb74d, 0xb74d,
+	0xb75a, 0xb75a, 0xb75a, 0xb74d, 0xb74d, 0x080c, 0x0db4, 0x0036,
+	0x2019, 0x0010, 0x080c, 0xd0c7, 0x6023, 0x0006, 0x6003, 0x0007,
+	0x003e, 0x0005, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x0096,
+	0x86ff, 0x11d8, 0x6014, 0x2048, 0x080c, 0xbafe, 0x01c0, 0xa864,
+	0x9086, 0x0139, 0x1128, 0xa87b, 0x0005, 0xa883, 0x0000, 0x0028,
+	0x900e, 0x2001, 0x0005, 0x080c, 0x6abf, 0x080c, 0xbdf3, 0x080c,
+	0x6878, 0x080c, 0x9e49, 0x9085, 0x0001, 0x009e, 0x0005, 0x9006,
+	0x0ce0, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0db4, 0x0002, 0xb797,
+	0xb7c5, 0xb799, 0xb7e6, 0xb7c0, 0xb797, 0xb75a, 0xb75f, 0xb75f,
+	0xb75a, 0xb75a, 0xb75a, 0xb75a, 0xb75a, 0xb75a, 0xb75a, 0x080c,
+	0x0db4, 0x86ff, 0x1510, 0x6020, 0x9086, 0x0006, 0x01f0, 0x0096,
+	0x6014, 0x2048, 0x080c, 0xbafe, 0x0158, 0xa87c, 0xd0cc, 0x0130,
+	0x0096, 0xa878, 0x2048, 0x080c, 0x0f9d, 0x009e, 0x080c, 0xbdf3,
+	0x009e, 0x080c, 0xc1b3, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023,
+	0x0002, 0x080c, 0x83c9, 0x080c, 0x894b, 0x9085, 0x0001, 0x0005,
+	0x0066, 0x080c, 0x190d, 0x006e, 0x08a0, 0x00e6, 0x2071, 0x19b8,
+	0x7024, 0x9c06, 0x1120, 0x080c, 0x9649, 0x00ee, 0x0850, 0x6020,
+	0x9084, 0x000f, 0x9086, 0x0006, 0x1150, 0x0086, 0x0096, 0x2049,
+	0x0001, 0x2c40, 0x080c, 0x97a1, 0x009e, 0x008e, 0x0010, 0x080c,
+	0x9546, 0x00ee, 0x1904, 0xb799, 0x0804, 0xb75a, 0x0036, 0x00e6,
+	0x2071, 0x19b8, 0x703c, 0x9c06, 0x1138, 0x901e, 0x080c, 0x96bf,
+	0x00ee, 0x003e, 0x0804, 0xb799, 0x080c, 0x98d1, 0x00ee, 0x003e,
+	0x1904, 0xb799, 0x0804, 0xb75a, 0x00c6, 0x6020, 0x9084, 0x000f,
+	0x0013, 0x00ce, 0x0005, 0xb819, 0xb8e2, 0xba49, 0xb823, 0x9e49,
+	0xb819, 0xd0b9, 0xc21b, 0xb8e2, 0xb812, 0xbac8, 0xb812, 0xb812,
+	0xb812, 0xb812, 0x080c, 0x0db4, 0x080c, 0xbd04, 0x1110, 0x080c,
+	0xa7a7, 0x0005, 0x080c, 0x8846, 0x080c, 0x894b, 0x0804, 0x9e19,
+	0x601b, 0x0001, 0x0005, 0x080c, 0xbafe, 0x0130, 0x6014, 0x0096,
+	0x2048, 0x2c00, 0xa896, 0x009e, 0x6000, 0x908a, 0x0016, 0x1a0c,
+	0x0db4, 0x0002, 0xb842, 0xb844, 0xb868, 0xb87c, 0xb8a0, 0xb842,
+	0xb819, 0xb819, 0xb819, 0xb87c, 0xb87c, 0xb842, 0xb842, 0xb842,
+	0xb842, 0xb886, 0x080c, 0x0db4, 0x00e6, 0x6014, 0x0096, 0x2048,
+	0xa880, 0xc0b5, 0xa882, 0x009e, 0x2071, 0x19b8, 0x7024, 0x9c06,
+	0x01a0, 0x080c, 0x9546, 0x080c, 0xc1b3, 0x6007, 0x0085, 0x6003,
+	0x000b, 0x6023, 0x0002, 0x2001, 0x1958, 0x2004, 0x601a, 0x080c,
+	0x83c9, 0x080c, 0x894b, 0x00ee, 0x0005, 0x601b, 0x0001, 0x0cd8,
+	0x0096, 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x080c,
+	0xc1b3, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c,
+	0x83c9, 0x080c, 0x894b, 0x0005, 0x0096, 0x601b, 0x0001, 0x6014,
+	0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x0005, 0x080c, 0x5387,
+	0x01a8, 0x6014, 0x0096, 0x904d, 0x0180, 0xa864, 0xa867, 0x0103,
+	0xa87b, 0x0006, 0x9086, 0x0139, 0x1140, 0xa867, 0x0139, 0xa897,
+	0x4005, 0xa89b, 0x0004, 0x080c, 0x6885, 0x009e, 0x0804, 0x9e19,
+	0x6014, 0x0096, 0x904d, 0x05c8, 0xa97c, 0xd1e4, 0x05b0, 0x2001,
+	0x180f, 0x2004, 0xd0c4, 0x0110, 0x009e, 0x0005, 0xa884, 0x009e,
+	0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0x2001, 0x0030, 0x2c08,
+	0x080c, 0x1518, 0x2001, 0x030c, 0x2004, 0x9086, 0x0041, 0x11a0,
+	0x6014, 0x0096, 0x904d, 0x090c, 0x0db4, 0xa880, 0xd0f4, 0x1130,
+	0xc0f5, 0xa882, 0x009e, 0x601b, 0x0002, 0x0070, 0x009e, 0x2001,
+	0x0037, 0x2c08, 0x080c, 0x1518, 0x6000, 0x9086, 0x0004, 0x1120,
+	0x2009, 0x0048, 0x080c, 0x9e93, 0x0005, 0x009e, 0x080c, 0x190d,
+	0x0804, 0xb868, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0db4, 0x000b,
+	0x0005, 0xb8f9, 0xb820, 0xb8fb, 0xb8f9, 0xb8fb, 0xb8fb, 0xb81a,
+	0xb8f9, 0xb814, 0xb814, 0xb8f9, 0xb8f9, 0xb8f9, 0xb8f9, 0xb8f9,
+	0xb8f9, 0x080c, 0x0db4, 0x6010, 0x00b6, 0x2058, 0xb804, 0x9084,
+	0x00ff, 0x00be, 0x908a, 0x000c, 0x1a0c, 0x0db4, 0x00b6, 0x0013,
+	0x00be, 0x0005, 0xb916, 0xb9e3, 0xb918, 0xb958, 0xb918, 0xb958,
+	0xb918, 0xb926, 0xb916, 0xb958, 0xb916, 0xb947, 0x080c, 0x0db4,
+	0x6004, 0x908e, 0x0016, 0x05c0, 0x908e, 0x0004, 0x05a8, 0x908e,
+	0x0002, 0x0590, 0x908e, 0x0052, 0x0904, 0xb9df, 0x6004, 0x080c,
+	0xbd04, 0x0904, 0xb9fc, 0x908e, 0x0004, 0x1110, 0x080c, 0x2ffc,
+	0x908e, 0x0021, 0x0904, 0xba00, 0x908e, 0x0022, 0x0904, 0xba44,
+	0x908e, 0x003d, 0x0904, 0xba00, 0x908e, 0x0039, 0x0904, 0xba04,
+	0x908e, 0x0035, 0x0904, 0xba04, 0x908e, 0x001e, 0x0178, 0x908e,
+	0x0001, 0x1140, 0x6010, 0x2058, 0xb804, 0x9084, 0x00ff, 0x9086,
+	0x0006, 0x0110, 0x080c, 0x2fd7, 0x080c, 0xa7a7, 0x0804, 0x9e49,
+	0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0904, 0xb9d0, 0x9186,
+	0x0002, 0x1904, 0xb9a5, 0x2001, 0x1836, 0x2004, 0xd08c, 0x11c8,
+	0x080c, 0x6fa7, 0x11b0, 0x080c, 0xc1f9, 0x0138, 0x080c, 0x6fca,
+	0x1120, 0x080c, 0x6eb7, 0x0804, 0xba2d, 0x2001, 0x194e, 0x2003,
+	0x0001, 0x2001, 0x1800, 0x2003, 0x0001, 0x080c, 0x6ed9, 0x0804,
+	0xba2d, 0x6010, 0x2058, 0x2001, 0x1836, 0x2004, 0xd0ac, 0x1904,
+	0xba2d, 0xb8a0, 0x9084, 0xff80, 0x1904, 0xba2d, 0xb840, 0x9084,
+	0x00ff, 0x9005, 0x0190, 0x8001, 0xb842, 0x6017, 0x0000, 0x6023,
+	0x0007, 0x601b, 0x0398, 0x6043, 0x0000, 0x080c, 0x9dc3, 0x0128,
+	0x2b00, 0x6012, 0x6023, 0x0001, 0x0458, 0x00de, 0x00ce, 0x6004,
+	0x908e, 0x0002, 0x11a0, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e,
+	0x1170, 0x2009, 0x1836, 0x2104, 0xc085, 0x200a, 0x00e6, 0x2071,
+	0x1800, 0x080c, 0x5c5d, 0x00ee, 0x080c, 0xa7a7, 0x0030, 0x080c,
+	0xa7a7, 0x080c, 0x2fd7, 0x080c, 0xc20e, 0x00e6, 0x0126, 0x2091,
+	0x8000, 0x080c, 0x2ffc, 0x012e, 0x00ee, 0x080c, 0x9e49, 0x0005,
+	0x2001, 0x0002, 0x080c, 0x6188, 0x6003, 0x0001, 0x6007, 0x0002,
+	0x080c, 0x8411, 0x080c, 0x894b, 0x00de, 0x00ce, 0x0c80, 0x080c,
+	0x2ffc, 0x0804, 0xb954, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016,
+	0x0d38, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0904,
+	0xb9a5, 0x8001, 0xb842, 0x6003, 0x0001, 0x080c, 0x8411, 0x080c,
+	0x894b, 0x00de, 0x00ce, 0x0898, 0x080c, 0xa7a7, 0x0804, 0xb956,
+	0x080c, 0xa7e3, 0x0804, 0xb956, 0x00d6, 0x2c68, 0x6104, 0x080c,
+	0xc171, 0x00de, 0x0118, 0x080c, 0x9e19, 0x00f0, 0x6004, 0x8007,
+	0x6134, 0x918c, 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, 0x6003,
+	0x000b, 0x6023, 0x0002, 0x603c, 0x600a, 0x2001, 0x1958, 0x2004,
+	0x601a, 0x602c, 0x2c08, 0x2060, 0x6024, 0xc0b5, 0x6026, 0x2160,
+	0x080c, 0x83c9, 0x080c, 0x894b, 0x0005, 0x00de, 0x00ce, 0x080c,
+	0xa7a7, 0x080c, 0x2fd7, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c,
+	0x2ffc, 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x6043,
+	0x0000, 0x012e, 0x00ee, 0x0005, 0x080c, 0xa248, 0x1904, 0xb9fc,
+	0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0db4, 0x0096, 0x00d6,
+	0x001b, 0x00de, 0x009e, 0x0005, 0xba64, 0xba64, 0xba64, 0xba64,
+	0xba64, 0xba64, 0xba64, 0xba64, 0xba64, 0xb819, 0xba64, 0xb820,
+	0xba66, 0xb820, 0xba73, 0xba64, 0x080c, 0x0db4, 0x6004, 0x9086,
+	0x008b, 0x0148, 0x6007, 0x008b, 0x6003, 0x000d, 0x080c, 0x83c9,
+	0x080c, 0x894b, 0x0005, 0x080c, 0xc1ed, 0x0118, 0x080c, 0xc200,
+	0x0010, 0x080c, 0xc20e, 0x080c, 0xbce7, 0x080c, 0xbafe, 0x0570,
+	0x080c, 0x2fd7, 0x080c, 0xbafe, 0x0168, 0x6014, 0x2048, 0xa867,
+	0x0103, 0xa87b, 0x0006, 0xa877, 0x0000, 0xa880, 0xc0ed, 0xa882,
+	0x080c, 0x6885, 0x2c68, 0x080c, 0x9dc3, 0x0150, 0x6810, 0x6012,
+	0x080c, 0xbf73, 0x00c6, 0x2d60, 0x080c, 0x9e49, 0x00ce, 0x0008,
+	0x2d60, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003,
+	0x0001, 0x080c, 0x8411, 0x080c, 0x894b, 0x00c8, 0x080c, 0xc1ed,
+	0x0138, 0x6034, 0x9086, 0x4000, 0x1118, 0x080c, 0x2fd7, 0x08d0,
+	0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186,
+	0x0035, 0x1118, 0x080c, 0x2fd7, 0x0868, 0x080c, 0x9e49, 0x0005,
+	0x6000, 0x908a, 0x0016, 0x1a0c, 0x0db4, 0x0002, 0xbade, 0xbade,
+	0xbae0, 0xbae0, 0xbae0, 0xbade, 0xbade, 0x9e49, 0xbade, 0xbade,
+	0xbade, 0xbade, 0xbade, 0xbade, 0xbade, 0xbade, 0x080c, 0x0db4,
+	0x080c, 0x98d1, 0x6114, 0x0096, 0x2148, 0xa87b, 0x0006, 0x080c,
+	0x6885, 0x009e, 0x0804, 0x9e19, 0x9284, 0x0007, 0x1158, 0x9282,
+	0x1cd0, 0x0240, 0x2001, 0x1819, 0x2004, 0x9202, 0x1218, 0x9085,
+	0x0001, 0x0005, 0x9006, 0x0ce8, 0x0096, 0x0028, 0x0096, 0x0006,
+	0x6014, 0x2048, 0x000e, 0x0006, 0x9984, 0xf000, 0x9086, 0xf000,
+	0x0110, 0x080c, 0x1096, 0x000e, 0x009e, 0x0005, 0x00e6, 0x00c6,
+	0x0036, 0x0006, 0x0126, 0x2091, 0x8000, 0x2061, 0x1cd0, 0x2071,
+	0x1800, 0x7350, 0x7070, 0x9302, 0x1640, 0x6020, 0x9206, 0x11f8,
+	0x080c, 0xc1f9, 0x0180, 0x9286, 0x0001, 0x1168, 0x6004, 0x9086,
+	0x0004, 0x1148, 0x080c, 0x2fd7, 0x080c, 0xc20e, 0x00c6, 0x080c,
+	0x9e49, 0x00ce, 0x0060, 0x080c, 0xbeed, 0x0148, 0x080c, 0xbd04,
+	0x1110, 0x080c, 0xa7a7, 0x00c6, 0x080c, 0x9e19, 0x00ce, 0x9ce0,
+	0x0018, 0x7064, 0x9c02, 0x1208, 0x08a0, 0x012e, 0x000e, 0x003e,
+	0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000,
+	0x210c, 0x81ff, 0x0128, 0x2061, 0x1a80, 0x6112, 0x080c, 0x2fd7,
+	0x9006, 0x0010, 0x9085, 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005,
+	0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9dc3, 0x01b0, 0x6656,
+	0x2b00, 0x6012, 0x080c, 0x5387, 0x0118, 0x080c, 0xbc2b, 0x0168,
+	0x080c, 0xbf73, 0x6023, 0x0003, 0x2009, 0x004b, 0x080c, 0x9e93,
+	0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6,
+	0x0126, 0x2091, 0x8000, 0xbaa0, 0x080c, 0x9e66, 0x0560, 0x6057,
+	0x0000, 0x2b00, 0x6012, 0x080c, 0xbf73, 0x6023, 0x0003, 0x0016,
+	0x080c, 0x8549, 0x0076, 0x903e, 0x080c, 0x8441, 0x2c08, 0x080c,
+	0xd27b, 0x007e, 0x001e, 0xd184, 0x0128, 0x080c, 0x9e19, 0x9085,
+	0x0001, 0x0070, 0x080c, 0x5387, 0x0128, 0xd18c, 0x1170, 0x080c,
+	0xbc2b, 0x0148, 0x2009, 0x004c, 0x080c, 0x9e93, 0x9085, 0x0001,
 	0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2900, 0x6016, 0x0c90,
 	0x2009, 0x004d, 0x0010, 0x2009, 0x004e, 0x00f6, 0x00c6, 0x0046,
-	0x0016, 0x080c, 0x9a72, 0x2c78, 0x01d8, 0x080c, 0x515b, 0x0110,
-	0x7e2e, 0x0008, 0x7e16, 0x2b00, 0x7812, 0x7823, 0x0003, 0x2021,
-	0x0005, 0x080c, 0xb8cb, 0x2f60, 0x080c, 0x515b, 0x0118, 0x080c,
-	0xb8b9, 0x0130, 0x001e, 0x0016, 0x080c, 0x9b42, 0x9085, 0x0001,
-	0x001e, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6, 0x0046,
-	0x080c, 0x9a72, 0x2c78, 0x0530, 0x080c, 0x515b, 0x0110, 0x7e2e,
-	0x0008, 0x7e16, 0x2b00, 0x7812, 0x7823, 0x0003, 0x0096, 0x2021,
-	0x0004, 0x0489, 0x009e, 0x2001, 0x194f, 0x200c, 0xd1fc, 0x0120,
-	0x2f60, 0x080c, 0x9ac8, 0x0060, 0x2f60, 0x080c, 0x515b, 0x0120,
-	0xd18c, 0x1160, 0x0071, 0x0130, 0x2009, 0x0052, 0x080c, 0x9b42,
-	0x9085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x2900, 0x7816,
-	0x0c98, 0x00c6, 0x080c, 0x4659, 0x00ce, 0x1120, 0x080c, 0x9ac8,
-	0x9006, 0x0005, 0xa867, 0x0000, 0xa86b, 0x8000, 0x2900, 0x6016,
-	0x9085, 0x0001, 0x0005, 0x0096, 0x0076, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x6125, 0x0158, 0x2001, 0xb8d0, 0x0006, 0x900e, 0x2400,
-	0x080c, 0x682c, 0x080c, 0x65f2, 0x000e, 0x0807, 0x2418, 0x080c,
-	0x8523, 0xbaa0, 0x0086, 0x2041, 0x0001, 0x2039, 0x0001, 0x2608,
-	0x080c, 0x82a4, 0x008e, 0x080c, 0x8184, 0x2f08, 0x2648, 0x080c,
-	0xcef9, 0xb93c, 0x81ff, 0x090c, 0x8375, 0x080c, 0x868e, 0x012e,
-	0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x9a72, 0x0190, 0x660a, 0x2b08, 0x6112, 0x080c, 0xbc01, 0x6023,
-	0x0001, 0x2900, 0x6016, 0x2009, 0x001f, 0x080c, 0x9b42, 0x9085,
-	0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126,
-	0x2091, 0x8000, 0x080c, 0x9b15, 0x01b8, 0x660a, 0x2b08, 0x6112,
-	0x080c, 0xbc01, 0x6023, 0x0008, 0x2900, 0x6016, 0x00f6, 0x2c78,
-	0x080c, 0x15ad, 0x00fe, 0x2009, 0x0021, 0x080c, 0x9b42, 0x9085,
-	0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, 0x003d,
-	0x00c6, 0x0126, 0x0016, 0x2091, 0x8000, 0x080c, 0x9a72, 0x0198,
-	0x660a, 0x2b08, 0x6112, 0x080c, 0xbc01, 0x6023, 0x0001, 0x2900,
-	0x6016, 0x001e, 0x0016, 0x080c, 0x9b42, 0x9085, 0x0001, 0x001e,
-	0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd0, 0x00c6, 0x0126, 0x2091,
-	0x8000, 0x080c, 0x9b15, 0x0188, 0x2b08, 0x6112, 0x080c, 0xbc01,
-	0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x0000, 0x080c, 0x9b42,
-	0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009,
-	0x0044, 0x0830, 0x2009, 0x0049, 0x0818, 0x0026, 0x00b6, 0x6210,
-	0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0x00be, 0x002e,
-	0x0005, 0x0006, 0x0016, 0x6004, 0x908e, 0x0002, 0x0140, 0x908e,
-	0x0003, 0x0128, 0x908e, 0x0004, 0x0110, 0x9085, 0x0001, 0x001e,
-	0x000e, 0x0005, 0x0006, 0x0096, 0x6020, 0x9086, 0x0004, 0x0190,
-	0x6014, 0x904d, 0x080c, 0xb793, 0x0168, 0xa864, 0x9086, 0x0139,
-	0x0158, 0x6020, 0x9086, 0x0003, 0x0128, 0xa868, 0xd0fc, 0x0110,
-	0x9006, 0x0010, 0x9085, 0x0001, 0x009e, 0x000e, 0x0005, 0x00c6,
-	0x0126, 0x2091, 0x8000, 0x080c, 0x9b15, 0x0198, 0x2b08, 0x6112,
-	0x080c, 0xbc01, 0x6023, 0x0001, 0x2900, 0x6016, 0x080c, 0x2e7f,
-	0x2009, 0x0028, 0x080c, 0x9b42, 0x9085, 0x0001, 0x012e, 0x00ce,
-	0x0005, 0x9006, 0x0cd8, 0x9186, 0x0015, 0x11a8, 0x2011, 0x1823,
-	0x2204, 0x9086, 0x0074, 0x1178, 0x00b6, 0x080c, 0xa6df, 0x00be,
-	0x080c, 0xa91e, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, 0x8154,
-	0x080c, 0x868e, 0x0078, 0x6014, 0x0096, 0x2048, 0xa868, 0x009e,
-	0xd0fc, 0x0148, 0x2001, 0x0001, 0x080c, 0xbdbf, 0x080c, 0xa456,
-	0x080c, 0x9ac8, 0x0005, 0x0096, 0x6014, 0x904d, 0x090c, 0x0db4,
-	0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004,
-	0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x65f2, 0x012e,
-	0x009e, 0x080c, 0x9ac8, 0x0c30, 0x0096, 0x9186, 0x0016, 0x1128,
-	0x2001, 0x0004, 0x080c, 0x5f42, 0x00e8, 0x9186, 0x0015, 0x1510,
-	0x2011, 0x1823, 0x2204, 0x9086, 0x0014, 0x11e0, 0x6010, 0x00b6,
-	0x2058, 0x080c, 0x608c, 0x00be, 0x080c, 0xa9ef, 0x1198, 0x6010,
-	0x00b6, 0x2058, 0xb890, 0x00be, 0x9005, 0x0160, 0x2001, 0x0006,
-	0x080c, 0x5f42, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0170, 0x080c,
-	0x9ecb, 0x0048, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0528, 0x080c,
-	0xa456, 0x080c, 0x9ac8, 0x009e, 0x0005, 0x6014, 0x6310, 0x2358,
-	0x904d, 0x090c, 0x0db4, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897,
-	0x4000, 0x900e, 0x080c, 0x6211, 0x1108, 0xc185, 0xb800, 0xd0bc,
-	0x0108, 0xc18d, 0xa99a, 0x0126, 0x2091, 0x8000, 0x080c, 0x65f2,
-	0x012e, 0x080c, 0x9ac8, 0x08f8, 0x6014, 0x904d, 0x090c, 0x0db4,
-	0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004,
-	0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x65f2, 0x012e,
-	0x080c, 0x9ac8, 0x0840, 0xa878, 0x9086, 0x0005, 0x1108, 0x0009,
-	0x0005, 0xa880, 0xc0ad, 0xa882, 0x0005, 0x6043, 0x0000, 0x6017,
-	0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x810c, 0x080c,
-	0x868e, 0x0005, 0x00c6, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be,
-	0xd0bc, 0x0120, 0x6020, 0x9084, 0x000f, 0x0013, 0x00ce, 0x0005,
-	0xb4c8, 0xbab1, 0xbab1, 0xbab4, 0xd1d2, 0xd1ed, 0xd1f0, 0xb4c8,
-	0xb4c8, 0xb4c8, 0xb4c8, 0xb4c8, 0xb4c8, 0xb4c8, 0xb4c8, 0x080c,
-	0x0db4, 0xa001, 0xa001, 0x0005, 0x0096, 0x6014, 0x904d, 0x0118,
-	0xa87c, 0xd0e4, 0x1110, 0x009e, 0x0010, 0x009e, 0x0005, 0x6010,
-	0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0550, 0x2001, 0x1833,
-	0x2004, 0x9005, 0x1540, 0x00f6, 0x2c78, 0x080c, 0x9a72, 0x0508,
-	0x7810, 0x6012, 0x080c, 0xbc01, 0x7820, 0x9086, 0x0003, 0x0128,
-	0x7808, 0x603a, 0x2f00, 0x603e, 0x0020, 0x7808, 0x603e, 0x2f00,
-	0x603a, 0x602e, 0x6023, 0x0001, 0x6007, 0x0035, 0x6003, 0x0001,
-	0x7954, 0x6156, 0x080c, 0x810c, 0x080c, 0x868e, 0x2f60, 0x00fe,
-	0x0005, 0x2f60, 0x00fe, 0x2001, 0x1957, 0x2004, 0x6042, 0x0005,
-	0x0016, 0x0096, 0x6814, 0x2048, 0xa87c, 0xd0e4, 0x0180, 0xc0e4,
-	0xa87e, 0xa877, 0x0000, 0xa893, 0x0000, 0xa88f, 0x0000, 0xd0cc,
-	0x0130, 0xc0cc, 0xa87e, 0xa878, 0x2048, 0x080c, 0x0f9e, 0x6830,
-	0x6036, 0x908e, 0x0001, 0x0148, 0x6803, 0x0002, 0x9086, 0x0005,
-	0x0170, 0x9006, 0x602e, 0x6032, 0x00d0, 0x681c, 0xc085, 0x681e,
-	0x6803, 0x0004, 0x6824, 0xc0f4, 0x9085, 0x0c00, 0x6826, 0x6814,
-	0x2048, 0xa8ac, 0x6938, 0x9102, 0xa8b0, 0x693c, 0x9103, 0x1e48,
-	0x683c, 0x602e, 0x6838, 0x9084, 0xfffc, 0x683a, 0x6032, 0x2d00,
-	0x603a, 0x6808, 0x603e, 0x6910, 0x6112, 0x6954, 0x6156, 0x6023,
-	0x0001, 0x6007, 0x0039, 0x6003, 0x0001, 0x080c, 0x810c, 0x080c,
-	0x868e, 0x009e, 0x001e, 0x0005, 0x6024, 0xd0d4, 0x0510, 0xd0f4,
-	0x11f8, 0x6038, 0x940a, 0x603c, 0x9303, 0x0230, 0x9105, 0x0120,
-	0x6024, 0xc0d4, 0xc0f5, 0x0098, 0x643a, 0x633e, 0xac3e, 0xab42,
-	0x0046, 0x0036, 0x2400, 0xacac, 0x9402, 0xa836, 0x2300, 0xabb0,
-	0x9303, 0xa83a, 0x003e, 0x004e, 0x6024, 0xc0d4, 0x0000, 0x6026,
-	0x0005, 0xd0f4, 0x1138, 0xa83c, 0x603a, 0xa840, 0x603e, 0x6024,
-	0xc0f5, 0x6026, 0x0005, 0x0006, 0x0016, 0x6004, 0x908e, 0x0034,
-	0x01b8, 0x908e, 0x0035, 0x01a0, 0x908e, 0x0036, 0x0188, 0x908e,
-	0x0037, 0x0170, 0x908e, 0x0038, 0x0158, 0x908e, 0x0039, 0x0140,
-	0x908e, 0x003a, 0x0128, 0x908e, 0x003b, 0x0110, 0x9085, 0x0001,
-	0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6,
-	0x2001, 0x1951, 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, 0x080c,
-	0x7f8b, 0x2001, 0x1955, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202,
-	0x2001, 0x1953, 0x200c, 0x8000, 0x2014, 0x2071, 0x193d, 0x711a,
-	0x721e, 0x2001, 0x0064, 0x080c, 0x7f8b, 0x2001, 0x1956, 0x82ff,
-	0x1110, 0x2011, 0x0014, 0x2202, 0x2001, 0x1957, 0x9288, 0x000a,
-	0x2102, 0x2001, 0x1a58, 0x2102, 0x2001, 0x0032, 0x080c, 0x14fc,
-	0x080c, 0x62f6, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005,
-	0x0006, 0x0016, 0x00e6, 0x2001, 0x1955, 0x2003, 0x0028, 0x2001,
-	0x1956, 0x2003, 0x0014, 0x2071, 0x193d, 0x701b, 0x0000, 0x701f,
-	0x07d0, 0x2001, 0x1957, 0x2009, 0x001e, 0x2102, 0x2001, 0x1a58,
-	0x2102, 0x2001, 0x0032, 0x080c, 0x14fc, 0x00ee, 0x001e, 0x000e,
-	0x0005, 0x0096, 0x6058, 0x904d, 0x0110, 0x080c, 0x101e, 0x009e,
-	0x0005, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9a72,
-	0x0180, 0x2b08, 0x6112, 0x0ca9, 0x6023, 0x0001, 0x2900, 0x6016,
-	0x2009, 0x0033, 0x080c, 0x9b42, 0x9085, 0x0001, 0x012e, 0x00ce,
-	0x0005, 0x9006, 0x0cd8, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800,
-	0x9186, 0x0015, 0x1500, 0x708c, 0x9086, 0x0018, 0x11e0, 0x6014,
-	0x2048, 0xaa3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x887e, 0x01d8,
-	0x7078, 0xaa50, 0x9206, 0x1160, 0x707c, 0xaa54, 0x9206, 0x1140,
-	0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x900e, 0x080c, 0x2ec4,
-	0x080c, 0x9ecb, 0x0020, 0x080c, 0xa456, 0x080c, 0x9ac8, 0x00fe,
-	0x00ee, 0x009e, 0x0005, 0x705c, 0xaa54, 0x9206, 0x0d48, 0x0c80,
-	0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9a72, 0x0188, 0x2b08,
-	0x6112, 0x080c, 0xbc01, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009,
-	0x004d, 0x080c, 0x9b42, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005,
-	0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0016, 0x080c,
-	0x9a72, 0x0180, 0x2b08, 0x6112, 0x080c, 0xbc01, 0x6023, 0x0001,
-	0x2900, 0x6016, 0x001e, 0x080c, 0x9b42, 0x9085, 0x0001, 0x012e,
-	0x00ce, 0x0005, 0x001e, 0x9006, 0x0cd0, 0x0016, 0x0026, 0x0036,
-	0x0046, 0x0056, 0x0066, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800,
-	0x9186, 0x0015, 0x1568, 0x718c, 0x6014, 0x2048, 0xa814, 0x8003,
-	0x9106, 0x1530, 0x20e1, 0x0000, 0x2001, 0x196f, 0x2003, 0x0000,
-	0x6014, 0x2048, 0xa830, 0x20a8, 0x8906, 0x8006, 0x8007, 0x9094,
-	0x003f, 0x22e8, 0x9084, 0xffc0, 0x9080, 0x001b, 0x20a0, 0x2001,
-	0x196f, 0x0016, 0x200c, 0x080c, 0xc432, 0x001e, 0xa804, 0x9005,
-	0x0110, 0x2048, 0x0c38, 0x6014, 0x2048, 0xa867, 0x0103, 0x0010,
-	0x080c, 0xa456, 0x080c, 0x9ac8, 0x00fe, 0x00ee, 0x009e, 0x006e,
-	0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x0096, 0x00e6,
-	0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x11b8, 0x708c, 0x9086,
-	0x0004, 0x1198, 0x6014, 0x2048, 0x2c78, 0x080c, 0x887e, 0x01a8,
-	0x7078, 0xaa74, 0x9206, 0x1130, 0x707c, 0xaa78, 0x9206, 0x1110,
-	0x080c, 0x2e7f, 0x080c, 0x9ecb, 0x0020, 0x080c, 0xa456, 0x080c,
-	0x9ac8, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x705c, 0xaa78, 0x9206,
-	0x0d78, 0x0c80, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186,
-	0x0015, 0x1550, 0x708c, 0x9086, 0x0004, 0x1530, 0x6014, 0x2048,
-	0x2c78, 0x080c, 0x887e, 0x05e8, 0x7078, 0xaacc, 0x9206, 0x1180,
-	0x707c, 0xaad0, 0x9206, 0x1160, 0x080c, 0x2e7f, 0x0016, 0xa998,
-	0xaab0, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x510b, 0x001e, 0x0010,
-	0x080c, 0x4efc, 0x080c, 0xb793, 0x0500, 0xa87b, 0x0000, 0xa883,
-	0x0000, 0xa897, 0x4000, 0x0078, 0x080c, 0x4efc, 0x080c, 0xb793,
-	0x01a0, 0x6014, 0x2048, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897,
-	0x4005, 0xa89b, 0x0004, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139,
-	0x080c, 0x65f2, 0x012e, 0x080c, 0x9ac8, 0x00fe, 0x00ee, 0x009e,
-	0x0005, 0x705c, 0xaad0, 0x9206, 0x0938, 0x0890, 0x0016, 0x0026,
-	0xa87c, 0xd0ac, 0x0178, 0xa938, 0xaa34, 0x2100, 0x9205, 0x0150,
-	0xa890, 0x9106, 0x1118, 0xa88c, 0x9206, 0x0120, 0xa992, 0xaa8e,
-	0x9085, 0x0001, 0x002e, 0x001e, 0x0005, 0x00b6, 0x00d6, 0x0036,
-	0x080c, 0xb793, 0x0904, 0xbdbb, 0x0096, 0x6314, 0x2348, 0xa87a,
-	0xa982, 0x929e, 0x4000, 0x1580, 0x6310, 0x00c6, 0x2358, 0x2009,
-	0x0000, 0xa868, 0xd0f4, 0x1140, 0x080c, 0x6211, 0x1108, 0xc185,
-	0xb800, 0xd0bc, 0x0108, 0xc18d, 0xaa96, 0xa99a, 0x20a9, 0x0004,
-	0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8b4, 0x20e0,
-	0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0f69, 0x20a9, 0x0004,
-	0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8b8, 0x9080, 0x000a, 0x2098,
-	0x080c, 0x0f69, 0x00ce, 0x0090, 0xaa96, 0x3918, 0x9398, 0x0007,
-	0x231c, 0x6004, 0x9086, 0x0016, 0x0110, 0xa89b, 0x0004, 0xaba2,
-	0x6310, 0x2358, 0xb804, 0x9084, 0x00ff, 0xa89e, 0x080c, 0x65e5,
-	0x6017, 0x0000, 0x009e, 0x003e, 0x00de, 0x00be, 0x0005, 0x0026,
-	0x0036, 0x0046, 0x00b6, 0x0096, 0x00f6, 0x6214, 0x2248, 0x6210,
-	0x2258, 0x2079, 0x0260, 0x9096, 0x0000, 0x11a0, 0xb814, 0x9084,
-	0x00ff, 0x900e, 0x080c, 0x250b, 0x2118, 0x831f, 0x939c, 0xff00,
-	0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c, 0x2011, 0x8018, 0x080c,
-	0x46b9, 0x00a8, 0x9096, 0x0001, 0x1148, 0x89ff, 0x0180, 0xa89b,
-	0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, 0x0048, 0x9096, 0x0002,
-	0x1130, 0xa89b, 0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, 0x00fe,
-	0x009e, 0x00be, 0x004e, 0x003e, 0x002e, 0x0005, 0x00c6, 0x0026,
-	0x0016, 0x9186, 0x0035, 0x0110, 0x6a38, 0x0008, 0x6a2c, 0x080c,
-	0xb781, 0x01f0, 0x2260, 0x6120, 0x9186, 0x0003, 0x0118, 0x9186,
-	0x0006, 0x1190, 0x6838, 0x9206, 0x0140, 0x683c, 0x9206, 0x1160,
-	0x6108, 0x6838, 0x9106, 0x1140, 0x0020, 0x6008, 0x693c, 0x9106,
-	0x1118, 0x6010, 0x6910, 0x9106, 0x001e, 0x002e, 0x00ce, 0x0005,
-	0x9085, 0x0001, 0x0cc8, 0xa974, 0xd1cc, 0x0188, 0x918c, 0x00ff,
-	0x918e, 0x0002, 0x1160, 0xa9a8, 0x918c, 0x0f00, 0x810f, 0x918e,
-	0x0001, 0x1128, 0xa834, 0xa938, 0x9115, 0x190c, 0xaebd, 0x0005,
-	0x0036, 0x2019, 0x0001, 0x0010, 0x0036, 0x901e, 0x0499, 0x01e0,
-	0x080c, 0xb793, 0x01c8, 0x080c, 0xb975, 0x6037, 0x4000, 0x6014,
-	0x6017, 0x0000, 0x0096, 0x2048, 0xa87c, 0x080c, 0xb992, 0x1118,
-	0x080c, 0xa456, 0x0040, 0xa867, 0x0103, 0xa877, 0x0000, 0x83ff,
-	0x1129, 0x080c, 0x65f2, 0x009e, 0x003e, 0x0005, 0xa880, 0xd0b4,
-	0x0128, 0xa87b, 0x0006, 0xc0ec, 0xa882, 0x0048, 0xd0bc, 0x0118,
-	0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, 0xba81, 0xa877,
-	0x0000, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0ec, 0x0005, 0x0006,
-	0x2001, 0x1810, 0x2004, 0xd0f4, 0x000e, 0x0005, 0x0006, 0x2001,
-	0x1810, 0x2004, 0xd0e4, 0x000e, 0x0005, 0x0036, 0x0046, 0x6010,
-	0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0007, 0x080c, 0x4856,
-	0x004e, 0x003e, 0x0005, 0x0c51, 0x1d81, 0x0005, 0x2001, 0x1955,
-	0x2004, 0x601a, 0x0005, 0x2001, 0x1957, 0x2004, 0x6042, 0x0005,
-	0x080c, 0x9ac8, 0x0804, 0x868e, 0x00b6, 0x0066, 0x6000, 0x90b2,
-	0x0016, 0x1a0c, 0x0db4, 0x001b, 0x006e, 0x00be, 0x0005, 0xbec7,
-	0xc58f, 0xc6ea, 0xbec7, 0xbec7, 0xbec7, 0xbec7, 0xbec7, 0xbefe,
-	0xc768, 0xbec7, 0xbec7, 0xbec7, 0xbec7, 0xbec7, 0xbec7, 0x080c,
-	0x0db4, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0db4, 0x0013,
-	0x006e, 0x0005, 0xbee2, 0xccd0, 0xbee2, 0xbee2, 0xbee2, 0xbee2,
-	0xbee2, 0xbee2, 0xcc7d, 0xcd24, 0xbee2, 0xd30d, 0xd343, 0xd30d,
-	0xd343, 0xbee2, 0x080c, 0x0db4, 0x6000, 0x9082, 0x0016, 0x1a0c,
-	0x0db4, 0x6000, 0x000a, 0x0005, 0xbefc, 0xc945, 0xca35, 0xca57,
-	0xcb16, 0xbefc, 0xcbf4, 0xcb9e, 0xc774, 0xcc53, 0xcc68, 0xbefc,
-	0xbefc, 0xbefc, 0xbefc, 0xbefc, 0x080c, 0x0db4, 0x91b2, 0x0053,
-	0x1a0c, 0x0db4, 0x2100, 0x91b2, 0x0040, 0x1a04, 0xc332, 0x0002,
-	0xbf48, 0xc123, 0xbf48, 0xbf48, 0xbf48, 0xc12c, 0xbf48, 0xbf48,
-	0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xbf48,
-	0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xbf4a,
-	0xbfa0, 0xbfaf, 0xc013, 0xc03e, 0xc0b6, 0xc10e, 0xbf48, 0xbf48,
-	0xc12f, 0xbf48, 0xbf48, 0xc144, 0xc151, 0xbf48, 0xbf48, 0xbf48,
-	0xbf48, 0xbf48, 0xc1d4, 0xbf48, 0xbf48, 0xc1e8, 0xbf48, 0xbf48,
-	0xc1a3, 0xbf48, 0xbf48, 0xbf48, 0xc200, 0xbf48, 0xbf48, 0xbf48,
-	0xc27d, 0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xbf48, 0xc2fa,
-	0x080c, 0x0db4, 0x080c, 0x62d3, 0x1150, 0x2001, 0x1836, 0x2004,
-	0xd0cc, 0x1128, 0x9084, 0x0009, 0x9086, 0x0008, 0x1140, 0x6007,
-	0x0009, 0x602f, 0x0009, 0x6017, 0x0000, 0x0804, 0xc11c, 0x080c,
-	0x62bc, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x6210, 0x2258,
-	0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0x828c, 0x0076, 0x903e,
-	0x080c, 0x8184, 0x2c08, 0x080c, 0xcef9, 0x007e, 0x001e, 0x001e,
-	0x002e, 0x003e, 0x00ce, 0x00ee, 0x6610, 0x2658, 0x080c, 0x6000,
-	0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x0278, 0x080c, 0xce2c,
-	0x1904, 0xc00b, 0x080c, 0xcdc8, 0x1120, 0x6007, 0x0008, 0x0804,
-	0xc11c, 0x6007, 0x0009, 0x0804, 0xc11c, 0x080c, 0xd023, 0x0128,
-	0x080c, 0xce2c, 0x0d78, 0x0804, 0xc00b, 0x6017, 0x1900, 0x0c88,
-	0x080c, 0x2f9e, 0x1904, 0xc32f, 0x6106, 0x080c, 0xcd7f, 0x6007,
-	0x0006, 0x0804, 0xc11c, 0x6007, 0x0007, 0x0804, 0xc11c, 0x080c,
-	0xd37f, 0x1904, 0xc32f, 0x080c, 0x2f9e, 0x1904, 0xc32f, 0x00d6,
+	0x0016, 0x080c, 0x9dc3, 0x2c78, 0x0590, 0x7e56, 0x2b00, 0x7812,
+	0x7823, 0x0003, 0x2021, 0x0005, 0x080c, 0xbc3d, 0x9186, 0x004d,
+	0x0118, 0x9186, 0x004e, 0x0148, 0x2001, 0x1951, 0x200c, 0xd1fc,
+	0x0168, 0x2f60, 0x080c, 0x9e19, 0x00d0, 0x2001, 0x1950, 0x200c,
+	0xd1fc, 0x0120, 0x2f60, 0x080c, 0x9e19, 0x0088, 0x2f60, 0x080c,
+	0x5387, 0x0138, 0xd18c, 0x1118, 0x04f1, 0x0148, 0x0010, 0x2900,
+	0x7816, 0x001e, 0x0016, 0x080c, 0x9e93, 0x9085, 0x0001, 0x001e,
+	0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6, 0x0046, 0x080c,
+	0x9dc3, 0x2c78, 0x0508, 0x7e56, 0x2b00, 0x7812, 0x7823, 0x0003,
+	0x0096, 0x2021, 0x0004, 0x0489, 0x009e, 0x2001, 0x194f, 0x200c,
+	0xd1fc, 0x0120, 0x2f60, 0x080c, 0x9e19, 0x0060, 0x2f60, 0x080c,
+	0x5387, 0x0120, 0xd18c, 0x1160, 0x0071, 0x0130, 0x2009, 0x0052,
+	0x080c, 0x9e93, 0x9085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005,
+	0x2900, 0x7816, 0x0c98, 0x00c6, 0x080c, 0x4872, 0x00ce, 0x1120,
+	0x080c, 0x9e19, 0x9006, 0x0005, 0xa867, 0x0000, 0xa86b, 0x8000,
+	0x2900, 0x6016, 0x9085, 0x0001, 0x0005, 0x0096, 0x0076, 0x0126,
+	0x2091, 0x8000, 0x080c, 0x636b, 0x0158, 0x2001, 0xbc42, 0x0006,
+	0x900e, 0x2400, 0x080c, 0x6abf, 0x080c, 0x6885, 0x000e, 0x0807,
+	0x2418, 0x080c, 0x87e0, 0xbaa0, 0x0086, 0x2041, 0x0001, 0x2039,
+	0x0001, 0x2608, 0x080c, 0x8561, 0x008e, 0x080c, 0x8441, 0x2f08,
+	0x2648, 0x080c, 0xd27b, 0xb93c, 0x81ff, 0x090c, 0x8632, 0x080c,
+	0x894b, 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, 0x2091,
+	0x8000, 0x080c, 0x9dc3, 0x0190, 0x660a, 0x2b08, 0x6112, 0x080c,
+	0xbf73, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x001f, 0x080c,
+	0x9e93, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8,
+	0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9e66, 0x01b8, 0x660a,
+	0x2b08, 0x6112, 0x080c, 0xbf73, 0x6023, 0x0008, 0x2900, 0x6016,
+	0x00f6, 0x2c78, 0x080c, 0x1648, 0x00fe, 0x2009, 0x0021, 0x080c,
+	0x9e93, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8,
+	0x2009, 0x003d, 0x00c6, 0x0126, 0x0016, 0x2091, 0x8000, 0x080c,
+	0x9dc3, 0x0198, 0x660a, 0x2b08, 0x6112, 0x080c, 0xbf73, 0x6023,
+	0x0001, 0x2900, 0x6016, 0x001e, 0x0016, 0x080c, 0x9e93, 0x9085,
+	0x0001, 0x001e, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd0, 0x00c6,
+	0x0126, 0x2091, 0x8000, 0x080c, 0x9e66, 0x0188, 0x2b08, 0x6112,
+	0x080c, 0xbf73, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x0000,
+	0x080c, 0x9e93, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006,
+	0x0cd8, 0x2009, 0x0044, 0x0830, 0x2009, 0x0049, 0x0818, 0x0026,
+	0x00b6, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e,
+	0x00be, 0x002e, 0x0005, 0x0006, 0x0016, 0x6004, 0x908e, 0x0002,
+	0x0140, 0x908e, 0x0003, 0x0128, 0x908e, 0x0004, 0x0110, 0x9085,
+	0x0001, 0x001e, 0x000e, 0x0005, 0x0006, 0x0096, 0x6020, 0x9086,
+	0x0004, 0x0190, 0x6014, 0x904d, 0x080c, 0xbafe, 0x0168, 0xa864,
+	0x9086, 0x0139, 0x0158, 0x6020, 0x9086, 0x0003, 0x0128, 0xa868,
+	0xd0fc, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x009e, 0x000e,
+	0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9e66, 0x0198,
+	0x2b08, 0x6112, 0x080c, 0xbf73, 0x6023, 0x0001, 0x2900, 0x6016,
+	0x080c, 0x2fd7, 0x2009, 0x0028, 0x080c, 0x9e93, 0x9085, 0x0001,
+	0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x9186, 0x0015, 0x11a8,
+	0x2011, 0x1823, 0x2204, 0x9086, 0x0074, 0x1178, 0x00b6, 0x080c,
+	0xaa30, 0x00be, 0x080c, 0xac6f, 0x6003, 0x0001, 0x6007, 0x0029,
+	0x080c, 0x8411, 0x080c, 0x894b, 0x0078, 0x6014, 0x0096, 0x2048,
+	0xa868, 0x009e, 0xd0fc, 0x0148, 0x2001, 0x0001, 0x080c, 0xc132,
+	0x080c, 0xa7a7, 0x080c, 0x9e19, 0x0005, 0x0096, 0x6014, 0x904d,
+	0x090c, 0x0db4, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005,
+	0xa89b, 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c,
+	0x6885, 0x012e, 0x009e, 0x080c, 0x9e19, 0x0c30, 0x0096, 0x9186,
+	0x0016, 0x1128, 0x2001, 0x0004, 0x080c, 0x6188, 0x00e8, 0x9186,
+	0x0015, 0x1510, 0x2011, 0x1823, 0x2204, 0x9086, 0x0014, 0x11e0,
+	0x6010, 0x00b6, 0x2058, 0x080c, 0x62d2, 0x00be, 0x080c, 0xad40,
+	0x1198, 0x6010, 0x00b6, 0x2058, 0xb890, 0x00be, 0x9005, 0x0160,
+	0x2001, 0x0006, 0x080c, 0x6188, 0x6014, 0x2048, 0xa868, 0xd0fc,
+	0x0170, 0x080c, 0xa21c, 0x0048, 0x6014, 0x2048, 0xa868, 0xd0fc,
+	0x0528, 0x080c, 0xa7a7, 0x080c, 0x9e19, 0x009e, 0x0005, 0x6014,
+	0x6310, 0x2358, 0x904d, 0x090c, 0x0db4, 0xa87b, 0x0000, 0xa883,
+	0x0000, 0xa897, 0x4000, 0x900e, 0x080c, 0x6457, 0x1108, 0xc185,
+	0xb800, 0xd0bc, 0x0108, 0xc18d, 0xa99a, 0x0126, 0x2091, 0x8000,
+	0x080c, 0x6885, 0x012e, 0x080c, 0x9e19, 0x08f8, 0x6014, 0x904d,
+	0x090c, 0x0db4, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005,
+	0xa89b, 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c,
+	0x6885, 0x012e, 0x080c, 0x9e19, 0x0840, 0xa878, 0x9086, 0x0005,
+	0x1108, 0x0009, 0x0005, 0xa880, 0xc0ad, 0xa882, 0x0005, 0x6043,
+	0x0000, 0x6017, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c,
+	0x83c9, 0x080c, 0x894b, 0x0005, 0x00c6, 0x6010, 0x00b6, 0x2058,
+	0xb800, 0x00be, 0xd0bc, 0x0120, 0x6020, 0x9084, 0x000f, 0x0013,
+	0x00ce, 0x0005, 0xb819, 0xbe23, 0xbe23, 0xbe26, 0xd559, 0xd574,
+	0xd577, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819, 0xb819,
+	0xb819, 0x080c, 0x0db4, 0xa001, 0xa001, 0x0005, 0x0096, 0x6014,
+	0x904d, 0x0118, 0xa87c, 0xd0e4, 0x1110, 0x009e, 0x0010, 0x009e,
+	0x0005, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0550,
+	0x2001, 0x1833, 0x2004, 0x9005, 0x1540, 0x00f6, 0x2c78, 0x080c,
+	0x9dc3, 0x0508, 0x7810, 0x6012, 0x080c, 0xbf73, 0x7820, 0x9086,
+	0x0003, 0x0128, 0x7808, 0x603a, 0x2f00, 0x603e, 0x0020, 0x7808,
+	0x603e, 0x2f00, 0x603a, 0x602e, 0x6023, 0x0001, 0x6007, 0x0035,
+	0x6003, 0x0001, 0x7954, 0x6156, 0x080c, 0x83c9, 0x080c, 0x894b,
+	0x2f60, 0x00fe, 0x0005, 0x2f60, 0x00fe, 0x2001, 0x1959, 0x2004,
+	0x6042, 0x0005, 0x0016, 0x0096, 0x6814, 0x2048, 0xa87c, 0xd0e4,
+	0x0180, 0xc0e4, 0xa87e, 0xa877, 0x0000, 0xa893, 0x0000, 0xa88f,
+	0x0000, 0xd0cc, 0x0130, 0xc0cc, 0xa87e, 0xa878, 0x2048, 0x080c,
+	0x0f9d, 0x6830, 0x6036, 0x908e, 0x0001, 0x0148, 0x6803, 0x0002,
+	0x9086, 0x0005, 0x0170, 0x9006, 0x602e, 0x6032, 0x00d0, 0x681c,
+	0xc085, 0x681e, 0x6803, 0x0004, 0x6824, 0xc0f4, 0x9085, 0x0c00,
+	0x6826, 0x6814, 0x2048, 0xa8ac, 0x6938, 0x9102, 0xa8b0, 0x693c,
+	0x9103, 0x1e48, 0x683c, 0x602e, 0x6838, 0x9084, 0xfffc, 0x683a,
+	0x6032, 0x2d00, 0x603a, 0x6808, 0x603e, 0x6910, 0x6112, 0x6954,
+	0x6156, 0x6023, 0x0001, 0x6007, 0x0039, 0x6003, 0x0001, 0x080c,
+	0x83c9, 0x080c, 0x894b, 0x009e, 0x001e, 0x0005, 0x6024, 0xd0d4,
+	0x0510, 0xd0f4, 0x11f8, 0x6038, 0x940a, 0x603c, 0x9303, 0x0230,
+	0x9105, 0x0120, 0x6024, 0xc0d4, 0xc0f5, 0x0098, 0x643a, 0x633e,
+	0xac3e, 0xab42, 0x0046, 0x0036, 0x2400, 0xacac, 0x9402, 0xa836,
+	0x2300, 0xabb0, 0x9303, 0xa83a, 0x003e, 0x004e, 0x6024, 0xc0d4,
+	0x0000, 0x6026, 0x0005, 0xd0f4, 0x1138, 0xa83c, 0x603a, 0xa840,
+	0x603e, 0x6024, 0xc0f5, 0x6026, 0x0005, 0x0006, 0x0016, 0x6004,
+	0x908e, 0x0034, 0x01b8, 0x908e, 0x0035, 0x01a0, 0x908e, 0x0036,
+	0x0188, 0x908e, 0x0037, 0x0170, 0x908e, 0x0038, 0x0158, 0x908e,
+	0x0039, 0x0140, 0x908e, 0x003a, 0x0128, 0x908e, 0x003b, 0x0110,
+	0x9085, 0x0001, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x0026,
+	0x0036, 0x00e6, 0x2001, 0x1953, 0x200c, 0x8000, 0x2014, 0x2001,
+	0x0032, 0x080c, 0x8248, 0x2001, 0x1957, 0x82ff, 0x1110, 0x2011,
+	0x0014, 0x2202, 0x2001, 0x1955, 0x200c, 0x8000, 0x2014, 0x2071,
+	0x193d, 0x711a, 0x721e, 0x2001, 0x0064, 0x080c, 0x8248, 0x2001,
+	0x1958, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, 0x1959,
+	0x9288, 0x000a, 0x2102, 0x2001, 0x1a61, 0x2102, 0x2001, 0x0032,
+	0x080c, 0x1518, 0x080c, 0x653c, 0x00ee, 0x003e, 0x002e, 0x001e,
+	0x000e, 0x0005, 0x0006, 0x0016, 0x00e6, 0x2001, 0x1957, 0x2003,
+	0x0028, 0x2001, 0x1958, 0x2003, 0x0014, 0x2071, 0x193d, 0x701b,
+	0x0000, 0x701f, 0x07d0, 0x2001, 0x1959, 0x2009, 0x001e, 0x2102,
+	0x2001, 0x1a61, 0x2102, 0x2001, 0x0032, 0x080c, 0x1518, 0x00ee,
+	0x001e, 0x000e, 0x0005, 0x0096, 0x6058, 0x904d, 0x0110, 0x080c,
+	0x101d, 0x009e, 0x0005, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000,
+	0x080c, 0x9dc3, 0x0180, 0x2b08, 0x6112, 0x0ca9, 0x6023, 0x0001,
+	0x2900, 0x6016, 0x2009, 0x0033, 0x080c, 0x9e93, 0x9085, 0x0001,
+	0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x00e6, 0x00f6,
+	0x2071, 0x1800, 0x9186, 0x0015, 0x1500, 0x708c, 0x9086, 0x0018,
+	0x11e0, 0x6014, 0x2048, 0xaa3c, 0xd2e4, 0x1160, 0x2c78, 0x080c,
+	0x8b3b, 0x01d8, 0x7078, 0xaa50, 0x9206, 0x1160, 0x707c, 0xaa54,
+	0x9206, 0x1140, 0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x900e,
+	0x080c, 0x301c, 0x080c, 0xa21c, 0x0020, 0x080c, 0xa7a7, 0x080c,
+	0x9e19, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x705c, 0xaa54, 0x9206,
+	0x0d48, 0x0c80, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9dc3,
+	0x0188, 0x2b08, 0x6112, 0x080c, 0xbf73, 0x6023, 0x0001, 0x2900,
+	0x6016, 0x2009, 0x004d, 0x080c, 0x9e93, 0x9085, 0x0001, 0x012e,
+	0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000,
+	0x0016, 0x080c, 0x9dc3, 0x0180, 0x2b08, 0x6112, 0x080c, 0xbf73,
+	0x6023, 0x0001, 0x2900, 0x6016, 0x001e, 0x080c, 0x9e93, 0x9085,
+	0x0001, 0x012e, 0x00ce, 0x0005, 0x001e, 0x9006, 0x0cd0, 0x0016,
+	0x0026, 0x0036, 0x0046, 0x0056, 0x0066, 0x0096, 0x00e6, 0x00f6,
+	0x2071, 0x1800, 0x9186, 0x0015, 0x1568, 0x718c, 0x6014, 0x2048,
+	0xa814, 0x8003, 0x9106, 0x1530, 0x20e1, 0x0000, 0x2001, 0x1971,
+	0x2003, 0x0000, 0x6014, 0x2048, 0xa830, 0x20a8, 0x8906, 0x8006,
+	0x8007, 0x9094, 0x003f, 0x22e8, 0x9084, 0xffc0, 0x9080, 0x001b,
+	0x20a0, 0x2001, 0x1971, 0x0016, 0x200c, 0x080c, 0xc7b4, 0x001e,
+	0xa804, 0x9005, 0x0110, 0x2048, 0x0c38, 0x6014, 0x2048, 0xa867,
+	0x0103, 0x0010, 0x080c, 0xa7a7, 0x080c, 0x9e19, 0x00fe, 0x00ee,
+	0x009e, 0x006e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005,
+	0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x11b8,
+	0x708c, 0x9086, 0x0004, 0x1198, 0x6014, 0x2048, 0x2c78, 0x080c,
+	0x8b3b, 0x01a8, 0x7078, 0xaa74, 0x9206, 0x1130, 0x707c, 0xaa78,
+	0x9206, 0x1110, 0x080c, 0x2fd7, 0x080c, 0xa21c, 0x0020, 0x080c,
+	0xa7a7, 0x080c, 0x9e19, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x705c,
+	0xaa78, 0x9206, 0x0d78, 0x0c80, 0x0096, 0x00e6, 0x00f6, 0x2071,
+	0x1800, 0x9186, 0x0015, 0x1550, 0x708c, 0x9086, 0x0004, 0x1530,
+	0x6014, 0x2048, 0x2c78, 0x080c, 0x8b3b, 0x05f0, 0x7078, 0xaacc,
+	0x9206, 0x1180, 0x707c, 0xaad0, 0x9206, 0x1160, 0x080c, 0x2fd7,
+	0x0016, 0xa998, 0xaab0, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x5337,
+	0x001e, 0x0010, 0x080c, 0x5128, 0x080c, 0xbafe, 0x0508, 0xa87b,
+	0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x0080, 0x080c, 0xbafe,
+	0x01b8, 0x6014, 0x2048, 0x080c, 0x5128, 0x1d70, 0xa87b, 0x0030,
+	0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0x0126, 0x2091,
+	0x8000, 0xa867, 0x0139, 0x080c, 0x6885, 0x012e, 0x080c, 0x9e19,
+	0x00fe, 0x00ee, 0x009e, 0x0005, 0x705c, 0xaad0, 0x9206, 0x0930,
+	0x0888, 0x0016, 0x0026, 0xa87c, 0xd0ac, 0x0178, 0xa938, 0xaa34,
+	0x2100, 0x9205, 0x0150, 0xa890, 0x9106, 0x1118, 0xa88c, 0x9206,
+	0x0120, 0xa992, 0xaa8e, 0x9085, 0x0001, 0x002e, 0x001e, 0x0005,
+	0x00b6, 0x00d6, 0x0036, 0x080c, 0xbafe, 0x0904, 0xc12e, 0x0096,
+	0x6314, 0x2348, 0xa87a, 0xa982, 0x929e, 0x4000, 0x1580, 0x6310,
+	0x00c6, 0x2358, 0x2009, 0x0000, 0xa868, 0xd0f4, 0x1140, 0x080c,
+	0x6457, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xaa96,
+	0xa99a, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031,
+	0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c,
+	0x0f68, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8b8,
+	0x9080, 0x000a, 0x2098, 0x080c, 0x0f68, 0x00ce, 0x0090, 0xaa96,
+	0x3918, 0x9398, 0x0007, 0x231c, 0x6004, 0x9086, 0x0016, 0x0110,
+	0xa89b, 0x0004, 0xaba2, 0x6310, 0x2358, 0xb804, 0x9084, 0x00ff,
+	0xa89e, 0x080c, 0x6878, 0x6017, 0x0000, 0x009e, 0x003e, 0x00de,
+	0x00be, 0x0005, 0x0026, 0x0036, 0x0046, 0x00b6, 0x0096, 0x00f6,
+	0x6214, 0x2248, 0x6210, 0x2258, 0x2079, 0x0260, 0x9096, 0x0000,
+	0x11a0, 0xb814, 0x9084, 0x00ff, 0x900e, 0x080c, 0x2663, 0x2118,
+	0x831f, 0x939c, 0xff00, 0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c,
+	0x2011, 0x8018, 0x080c, 0x48d2, 0x00a8, 0x9096, 0x0001, 0x1148,
+	0x89ff, 0x0180, 0xa89b, 0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa,
+	0x0048, 0x9096, 0x0002, 0x1130, 0xa89b, 0x000d, 0x7838, 0xa8a6,
+	0x783c, 0xa8aa, 0x00fe, 0x009e, 0x00be, 0x004e, 0x003e, 0x002e,
+	0x0005, 0x00c6, 0x0026, 0x0016, 0x9186, 0x0035, 0x0110, 0x6a38,
+	0x0008, 0x6a2c, 0x080c, 0xbaec, 0x01f0, 0x2260, 0x6120, 0x9186,
+	0x0003, 0x0118, 0x9186, 0x0006, 0x1190, 0x6838, 0x9206, 0x0140,
+	0x683c, 0x9206, 0x1160, 0x6108, 0x6838, 0x9106, 0x1140, 0x0020,
+	0x6008, 0x693c, 0x9106, 0x1118, 0x6010, 0x6910, 0x9106, 0x001e,
+	0x002e, 0x00ce, 0x0005, 0x9085, 0x0001, 0x0cc8, 0xa974, 0xd1cc,
+	0x0188, 0x918c, 0x00ff, 0x918e, 0x0002, 0x1160, 0xa9a8, 0x918c,
+	0x0f00, 0x810f, 0x918e, 0x0001, 0x1128, 0xa834, 0xa938, 0x9115,
+	0x190c, 0xb20e, 0x0005, 0x0036, 0x2019, 0x0001, 0x0010, 0x0036,
+	0x901e, 0x0499, 0x01e0, 0x080c, 0xbafe, 0x01c8, 0x080c, 0xbce7,
+	0x6037, 0x4000, 0x6014, 0x6017, 0x0000, 0x0096, 0x2048, 0xa87c,
+	0x080c, 0xbd04, 0x1118, 0x080c, 0xa7a7, 0x0040, 0xa867, 0x0103,
+	0xa877, 0x0000, 0x83ff, 0x1129, 0x080c, 0x6885, 0x009e, 0x003e,
+	0x0005, 0xa880, 0xd0b4, 0x0128, 0xa87b, 0x0006, 0xc0ec, 0xa882,
+	0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005,
+	0x080c, 0xbdf3, 0xa877, 0x0000, 0x0005, 0x2001, 0x1810, 0x2004,
+	0xd0ec, 0x0005, 0x0006, 0x2001, 0x1810, 0x2004, 0xd0f4, 0x000e,
+	0x0005, 0x0006, 0x2001, 0x1810, 0x2004, 0xd0e4, 0x000e, 0x0005,
+	0x0036, 0x0046, 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021,
+	0x0007, 0x080c, 0x4a6f, 0x004e, 0x003e, 0x0005, 0x0c51, 0x1d81,
+	0x0005, 0x2001, 0x1957, 0x2004, 0x601a, 0x0005, 0x2001, 0x1959,
+	0x2004, 0x6042, 0x0005, 0x080c, 0x9e19, 0x0804, 0x894b, 0x00b6,
+	0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0db4, 0x001b, 0x006e,
+	0x00be, 0x0005, 0xc23a, 0xc911, 0xca6c, 0xc23a, 0xc23a, 0xc23a,
+	0xc23a, 0xc23a, 0xc271, 0xcaea, 0xc23a, 0xc23a, 0xc23a, 0xc23a,
+	0xc23a, 0xc23a, 0x080c, 0x0db4, 0x0066, 0x6000, 0x90b2, 0x0016,
+	0x1a0c, 0x0db4, 0x0013, 0x006e, 0x0005, 0xc255, 0xd052, 0xc255,
+	0xc255, 0xc255, 0xc255, 0xc255, 0xc255, 0xcfff, 0xd0a6, 0xc255,
+	0xd694, 0xd6ca, 0xd694, 0xd6ca, 0xc255, 0x080c, 0x0db4, 0x6000,
+	0x9082, 0x0016, 0x1a0c, 0x0db4, 0x6000, 0x000a, 0x0005, 0xc26f,
+	0xccc7, 0xcdb7, 0xcdd9, 0xce98, 0xc26f, 0xcf76, 0xcf20, 0xcaf6,
+	0xcfd5, 0xcfea, 0xc26f, 0xc26f, 0xc26f, 0xc26f, 0xc26f, 0x080c,
+	0x0db4, 0x91b2, 0x0053, 0x1a0c, 0x0db4, 0x2100, 0x91b2, 0x0040,
+	0x1a04, 0xc6b2, 0x0002, 0xc2bb, 0xc4a3, 0xc2bb, 0xc2bb, 0xc2bb,
+	0xc4ac, 0xc2bb, 0xc2bb, 0xc2bb, 0xc2bb, 0xc2bb, 0xc2bb, 0xc2bb,
+	0xc2bb, 0xc2bb, 0xc2bb, 0xc2bb, 0xc2bb, 0xc2bb, 0xc2bb, 0xc2bb,
+	0xc2bb, 0xc2bb, 0xc2bd, 0xc320, 0xc32f, 0xc393, 0xc3be, 0xc436,
+	0xc48e, 0xc2bb, 0xc2bb, 0xc4af, 0xc2bb, 0xc2bb, 0xc4c4, 0xc4d1,
+	0xc2bb, 0xc2bb, 0xc2bb, 0xc2bb, 0xc2bb, 0xc554, 0xc2bb, 0xc2bb,
+	0xc568, 0xc2bb, 0xc2bb, 0xc523, 0xc2bb, 0xc2bb, 0xc2bb, 0xc580,
+	0xc2bb, 0xc2bb, 0xc2bb, 0xc5fd, 0xc2bb, 0xc2bb, 0xc2bb, 0xc2bb,
+	0xc2bb, 0xc2bb, 0xc67a, 0x080c, 0x0db4, 0x080c, 0x6519, 0x1150,
+	0x2001, 0x1836, 0x2004, 0xd0cc, 0x1128, 0x9084, 0x0009, 0x9086,
+	0x0008, 0x1140, 0x6007, 0x0009, 0x602f, 0x0009, 0x6017, 0x0000,
+	0x0804, 0xc49c, 0x080c, 0x6502, 0x00e6, 0x00c6, 0x0036, 0x0026,
+	0x0016, 0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c,
+	0x8549, 0x0076, 0x903e, 0x080c, 0x8441, 0x2c08, 0x080c, 0xd27b,
+	0x007e, 0x001e, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x6610,
+	0x2658, 0x080c, 0x6246, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006,
+	0x1268, 0x0016, 0x0026, 0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be,
+	0x2c08, 0x080c, 0xd842, 0x002e, 0x001e, 0x1178, 0x080c, 0xd1ae,
+	0x1904, 0xc38b, 0x080c, 0xd14a, 0x1120, 0x6007, 0x0008, 0x0804,
+	0xc49c, 0x6007, 0x0009, 0x0804, 0xc49c, 0x080c, 0xd3a5, 0x0128,
+	0x080c, 0xd1ae, 0x0d78, 0x0804, 0xc38b, 0x6017, 0x1900, 0x0c88,
+	0x080c, 0x30f6, 0x1904, 0xc6af, 0x6106, 0x080c, 0xd101, 0x6007,
+	0x0006, 0x0804, 0xc49c, 0x6007, 0x0007, 0x0804, 0xc49c, 0x080c,
+	0xd706, 0x1904, 0xc6af, 0x080c, 0x30f6, 0x1904, 0xc6af, 0x00d6,
 	0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x1220,
-	0x2001, 0x0001, 0x080c, 0x5f2e, 0x96b4, 0xff00, 0x8637, 0x9686,
+	0x2001, 0x0001, 0x080c, 0x6174, 0x96b4, 0xff00, 0x8637, 0x9686,
 	0x0006, 0x0188, 0x9686, 0x0004, 0x0170, 0xbe04, 0x96b4, 0x00ff,
 	0x9686, 0x0006, 0x0140, 0x9686, 0x0004, 0x0128, 0x9686, 0x0005,
 	0x0110, 0x00de, 0x0480, 0x00e6, 0x2071, 0x0260, 0x7034, 0x9084,
 	0x0003, 0x1140, 0x7034, 0x9082, 0x0014, 0x0220, 0x7030, 0x9084,
 	0x0003, 0x0130, 0x00ee, 0x6017, 0x0000, 0x602f, 0x0007, 0x00b0,
-	0x00ee, 0x080c, 0xce8f, 0x1190, 0x9686, 0x0006, 0x1140, 0x0026,
-	0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x2ec4, 0x002e, 0x080c,
-	0x608c, 0x6007, 0x000a, 0x00de, 0x0804, 0xc11c, 0x6007, 0x000b,
-	0x00de, 0x0804, 0xc11c, 0x080c, 0x2e7f, 0x080c, 0xbe9b, 0x6007,
-	0x0001, 0x0804, 0xc11c, 0x080c, 0xd37f, 0x1904, 0xc32f, 0x080c,
-	0x2f9e, 0x1904, 0xc32f, 0x2071, 0x0260, 0x7034, 0x90b4, 0x0003,
+	0x00ee, 0x080c, 0xd211, 0x1190, 0x9686, 0x0006, 0x1140, 0x0026,
+	0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x301c, 0x002e, 0x080c,
+	0x62d2, 0x6007, 0x000a, 0x00de, 0x0804, 0xc49c, 0x6007, 0x000b,
+	0x00de, 0x0804, 0xc49c, 0x080c, 0x2fd7, 0x080c, 0xc20e, 0x6007,
+	0x0001, 0x0804, 0xc49c, 0x080c, 0xd706, 0x1904, 0xc6af, 0x080c,
+	0x30f6, 0x1904, 0xc6af, 0x2071, 0x0260, 0x7034, 0x90b4, 0x0003,
 	0x1948, 0x90b2, 0x0014, 0x0a30, 0x7030, 0x9084, 0x0003, 0x1910,
 	0x6610, 0x2658, 0xbe04, 0x9686, 0x0707, 0x09e8, 0x0026, 0x6210,
-	0x2258, 0xbaa0, 0x900e, 0x080c, 0x2ec4, 0x002e, 0x6007, 0x000c,
-	0x2001, 0x0001, 0x080c, 0xd49b, 0x0804, 0xc11c, 0x080c, 0x62d3,
+	0x2258, 0xbaa0, 0x900e, 0x080c, 0x301c, 0x002e, 0x6007, 0x000c,
+	0x2001, 0x0001, 0x080c, 0xd822, 0x0804, 0xc49c, 0x080c, 0x6519,
 	0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008,
-	0x1110, 0x0804, 0xbf57, 0x080c, 0x62bc, 0x6610, 0x2658, 0xbe04,
+	0x1110, 0x0804, 0xc2ca, 0x080c, 0x6502, 0x6610, 0x2658, 0xbe04,
 	0x9684, 0x00ff, 0x9082, 0x0006, 0x06c0, 0x1138, 0x0026, 0x2001,
-	0x0006, 0x080c, 0x5f6e, 0x002e, 0x0050, 0x96b4, 0xff00, 0x8637,
-	0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xc00b, 0x080c,
-	0xce9c, 0x1120, 0x6007, 0x000e, 0x0804, 0xc11c, 0x0046, 0x6410,
-	0x2458, 0xbca0, 0x0046, 0x080c, 0x2e7f, 0x080c, 0xbe9b, 0x004e,
+	0x0006, 0x080c, 0x61b4, 0x002e, 0x0050, 0x96b4, 0xff00, 0x8637,
+	0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xc38b, 0x080c,
+	0xd21e, 0x1120, 0x6007, 0x000e, 0x0804, 0xc49c, 0x0046, 0x6410,
+	0x2458, 0xbca0, 0x0046, 0x080c, 0x2fd7, 0x080c, 0xc20e, 0x004e,
 	0x0016, 0x9006, 0x2009, 0x1854, 0x210c, 0x0048, 0x2009, 0x0029,
-	0x080c, 0xd188, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e,
-	0x004e, 0x6007, 0x0001, 0x0804, 0xc11c, 0x2001, 0x0001, 0x080c,
-	0x5f2e, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019,
-	0x1805, 0x2011, 0x0270, 0x080c, 0xaa8f, 0x003e, 0x002e, 0x001e,
+	0x080c, 0xd50a, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e,
+	0x004e, 0x6007, 0x0001, 0x0804, 0xc49c, 0x2001, 0x0001, 0x080c,
+	0x6174, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019,
+	0x1805, 0x2011, 0x0270, 0x080c, 0xade0, 0x003e, 0x002e, 0x001e,
 	0x015e, 0x9005, 0x0168, 0x96b4, 0xff00, 0x8637, 0x9682, 0x0004,
-	0x0a04, 0xc00b, 0x9682, 0x0007, 0x0a04, 0xc067, 0x0804, 0xc00b,
-	0x6017, 0x1900, 0x6007, 0x0009, 0x0804, 0xc11c, 0x080c, 0x62d3,
+	0x0a04, 0xc38b, 0x9682, 0x0007, 0x0a04, 0xc3e7, 0x0804, 0xc38b,
+	0x6017, 0x1900, 0x6007, 0x0009, 0x0804, 0xc49c, 0x080c, 0x6519,
 	0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008,
-	0x1110, 0x0804, 0xbf57, 0x080c, 0x62bc, 0x6610, 0x2658, 0xbe04,
+	0x1110, 0x0804, 0xc2ca, 0x080c, 0x6502, 0x6610, 0x2658, 0xbe04,
 	0x9684, 0x00ff, 0x9082, 0x0006, 0x0688, 0x96b4, 0xff00, 0x8637,
-	0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xc00b, 0x080c,
-	0xceca, 0x1130, 0x080c, 0xcdc8, 0x1118, 0x6007, 0x0010, 0x04e0,
-	0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x2e7f, 0x080c,
-	0xbe9b, 0x004e, 0x0016, 0x9006, 0x2009, 0x1854, 0x210c, 0x0048,
-	0x2009, 0x0029, 0x080c, 0xd188, 0x6010, 0x2058, 0xb800, 0xc0e5,
-	0xb802, 0x001e, 0x004e, 0x6007, 0x0001, 0x00f0, 0x080c, 0xd023,
+	0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xc38b, 0x080c,
+	0xd24c, 0x1130, 0x080c, 0xd14a, 0x1118, 0x6007, 0x0010, 0x04e0,
+	0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x2fd7, 0x080c,
+	0xc20e, 0x004e, 0x0016, 0x9006, 0x2009, 0x1854, 0x210c, 0x0048,
+	0x2009, 0x0029, 0x080c, 0xd50a, 0x6010, 0x2058, 0xb800, 0xc0e5,
+	0xb802, 0x001e, 0x004e, 0x6007, 0x0001, 0x00f0, 0x080c, 0xd3a5,
 	0x0140, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0980, 0x0804,
-	0xc00b, 0x6017, 0x1900, 0x6007, 0x0009, 0x0070, 0x080c, 0x2f9e,
-	0x1904, 0xc32f, 0x080c, 0xd37f, 0x1904, 0xc32f, 0x080c, 0xc4cd,
-	0x1904, 0xc00b, 0x6007, 0x0012, 0x6003, 0x0001, 0x080c, 0x8154,
-	0x080c, 0x868e, 0x0005, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c,
-	0x8154, 0x080c, 0x868e, 0x0cb0, 0x6007, 0x0005, 0x0c68, 0x080c,
-	0xd37f, 0x1904, 0xc32f, 0x080c, 0x2f9e, 0x1904, 0xc32f, 0x080c,
-	0xc4cd, 0x1904, 0xc00b, 0x6007, 0x0020, 0x6003, 0x0001, 0x080c,
-	0x8154, 0x080c, 0x868e, 0x0005, 0x080c, 0x2f9e, 0x1904, 0xc32f,
-	0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x8154, 0x080c, 0x868e,
-	0x0005, 0x080c, 0xd37f, 0x1904, 0xc32f, 0x080c, 0x2f9e, 0x1904,
-	0xc32f, 0x080c, 0xc4cd, 0x1904, 0xc00b, 0x0016, 0x0026, 0x00e6,
+	0xc38b, 0x6017, 0x1900, 0x6007, 0x0009, 0x0070, 0x080c, 0x30f6,
+	0x1904, 0xc6af, 0x080c, 0xd706, 0x1904, 0xc6af, 0x080c, 0xc84f,
+	0x1904, 0xc38b, 0x6007, 0x0012, 0x6003, 0x0001, 0x080c, 0x8411,
+	0x080c, 0x894b, 0x0005, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c,
+	0x8411, 0x080c, 0x894b, 0x0cb0, 0x6007, 0x0005, 0x0c68, 0x080c,
+	0xd706, 0x1904, 0xc6af, 0x080c, 0x30f6, 0x1904, 0xc6af, 0x080c,
+	0xc84f, 0x1904, 0xc38b, 0x6007, 0x0020, 0x6003, 0x0001, 0x080c,
+	0x8411, 0x080c, 0x894b, 0x0005, 0x080c, 0x30f6, 0x1904, 0xc6af,
+	0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x8411, 0x080c, 0x894b,
+	0x0005, 0x080c, 0xd706, 0x1904, 0xc6af, 0x080c, 0x30f6, 0x1904,
+	0xc6af, 0x080c, 0xc84f, 0x1904, 0xc38b, 0x0016, 0x0026, 0x00e6,
 	0x2071, 0x0260, 0x7244, 0x9286, 0xffff, 0x0180, 0x2c08, 0x080c,
-	0xb781, 0x01b0, 0x2260, 0x7240, 0x6008, 0x9206, 0x1188, 0x6010,
+	0xbaec, 0x01b0, 0x2260, 0x7240, 0x6008, 0x9206, 0x1188, 0x6010,
 	0x9190, 0x0004, 0x2214, 0x9206, 0x01b8, 0x0050, 0x7240, 0x2c08,
-	0x9006, 0x080c, 0xd15a, 0x1180, 0x7244, 0x9286, 0xffff, 0x01b0,
+	0x9006, 0x080c, 0xd4dc, 0x1180, 0x7244, 0x9286, 0xffff, 0x01b0,
 	0x2160, 0x6007, 0x0026, 0x6017, 0x1700, 0x7214, 0x9296, 0xffff,
 	0x1180, 0x6007, 0x0025, 0x0068, 0x6020, 0x9086, 0x0007, 0x1d80,
-	0x6004, 0x9086, 0x0024, 0x1110, 0x080c, 0x9ac8, 0x2160, 0x6007,
-	0x0025, 0x6003, 0x0001, 0x080c, 0x8154, 0x080c, 0x868e, 0x00ee,
-	0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x5f2e, 0x0156,
+	0x6004, 0x9086, 0x0024, 0x1110, 0x080c, 0x9e19, 0x2160, 0x6007,
+	0x0025, 0x6003, 0x0001, 0x080c, 0x8411, 0x080c, 0x894b, 0x00ee,
+	0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x6174, 0x0156,
 	0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011,
-	0x0276, 0x080c, 0xaa8f, 0x003e, 0x002e, 0x001e, 0x015e, 0x0120,
-	0x6007, 0x0031, 0x0804, 0xc11c, 0x080c, 0xa6f7, 0x080c, 0x6d14,
-	0x1190, 0x0006, 0x0026, 0x0036, 0x080c, 0x6d2e, 0x1138, 0x080c,
-	0x6ff8, 0x080c, 0x5a94, 0x080c, 0x6c46, 0x0010, 0x080c, 0x6cec,
-	0x003e, 0x002e, 0x000e, 0x0005, 0x080c, 0x2f9e, 0x1904, 0xc32f,
-	0x080c, 0xc4cd, 0x1904, 0xc00b, 0x6106, 0x080c, 0xc4e9, 0x1120,
-	0x6007, 0x002b, 0x0804, 0xc11c, 0x6007, 0x002c, 0x0804, 0xc11c,
-	0x080c, 0xd37f, 0x1904, 0xc32f, 0x080c, 0x2f9e, 0x1904, 0xc32f,
-	0x080c, 0xc4cd, 0x1904, 0xc00b, 0x6106, 0x080c, 0xc4ee, 0x1120,
-	0x6007, 0x002e, 0x0804, 0xc11c, 0x6007, 0x002f, 0x0804, 0xc11c,
-	0x080c, 0x2f9e, 0x1904, 0xc32f, 0x00e6, 0x00d6, 0x00c6, 0x6010,
+	0x0276, 0x080c, 0xade0, 0x003e, 0x002e, 0x001e, 0x015e, 0x0120,
+	0x6007, 0x0031, 0x0804, 0xc49c, 0x080c, 0xaa48, 0x080c, 0x6fa7,
+	0x1190, 0x0006, 0x0026, 0x0036, 0x080c, 0x6fc1, 0x1138, 0x080c,
+	0x728b, 0x080c, 0x5cca, 0x080c, 0x6ed9, 0x0010, 0x080c, 0x6f7f,
+	0x003e, 0x002e, 0x000e, 0x0005, 0x080c, 0x30f6, 0x1904, 0xc6af,
+	0x080c, 0xc84f, 0x1904, 0xc38b, 0x6106, 0x080c, 0xc86b, 0x1120,
+	0x6007, 0x002b, 0x0804, 0xc49c, 0x6007, 0x002c, 0x0804, 0xc49c,
+	0x080c, 0xd706, 0x1904, 0xc6af, 0x080c, 0x30f6, 0x1904, 0xc6af,
+	0x080c, 0xc84f, 0x1904, 0xc38b, 0x6106, 0x080c, 0xc870, 0x1120,
+	0x6007, 0x002e, 0x0804, 0xc49c, 0x6007, 0x002f, 0x0804, 0xc49c,
+	0x080c, 0x30f6, 0x1904, 0xc6af, 0x00e6, 0x00d6, 0x00c6, 0x6010,
 	0x2058, 0xb904, 0x9184, 0x00ff, 0x9086, 0x0006, 0x0158, 0x9184,
 	0xff00, 0x8007, 0x9086, 0x0006, 0x0128, 0x00ce, 0x00de, 0x00ee,
-	0x0804, 0xc123, 0x080c, 0x5157, 0xd0e4, 0x0904, 0xc27a, 0x2071,
+	0x0804, 0xc4a3, 0x080c, 0x5383, 0xd0e4, 0x0904, 0xc5fa, 0x2071,
 	0x026c, 0x7010, 0x603a, 0x7014, 0x603e, 0x7108, 0x720c, 0x080c,
-	0x6311, 0x0140, 0x6010, 0x2058, 0xb810, 0x9106, 0x1118, 0xb814,
-	0x9206, 0x0510, 0x080c, 0x630d, 0x15b8, 0x2069, 0x1800, 0x687c,
-	0x9206, 0x1590, 0x6878, 0x9106, 0x1578, 0x7210, 0x080c, 0xb781,
-	0x0590, 0x080c, 0xc3ba, 0x0578, 0x080c, 0xd1ff, 0x0560, 0x622e,
-	0x6007, 0x0036, 0x6003, 0x0001, 0x080c, 0x810c, 0x080c, 0x868e,
+	0x6557, 0x0140, 0x6010, 0x2058, 0xb810, 0x9106, 0x1118, 0xb814,
+	0x9206, 0x0510, 0x080c, 0x6553, 0x15b8, 0x2069, 0x1800, 0x687c,
+	0x9206, 0x1590, 0x6878, 0x9106, 0x1578, 0x7210, 0x080c, 0xbaec,
+	0x0590, 0x080c, 0xc73a, 0x0578, 0x080c, 0xd586, 0x0560, 0x622e,
+	0x6007, 0x0036, 0x6003, 0x0001, 0x080c, 0x83c9, 0x080c, 0x894b,
 	0x00ce, 0x00de, 0x00ee, 0x0005, 0x7214, 0x9286, 0xffff, 0x0150,
-	0x080c, 0xb781, 0x01c0, 0x9280, 0x0002, 0x2004, 0x7110, 0x9106,
-	0x1190, 0x08e0, 0x7210, 0x2c08, 0x9085, 0x0001, 0x080c, 0xd15a,
+	0x080c, 0xbaec, 0x01c0, 0x9280, 0x0002, 0x2004, 0x7110, 0x9106,
+	0x1190, 0x08e0, 0x7210, 0x2c08, 0x9085, 0x0001, 0x080c, 0xd4dc,
 	0x2c10, 0x2160, 0x0140, 0x0890, 0x6007, 0x0037, 0x602f, 0x0009,
 	0x6017, 0x1500, 0x08b8, 0x6007, 0x0037, 0x602f, 0x0003, 0x6017,
-	0x1700, 0x0880, 0x6007, 0x0012, 0x0868, 0x080c, 0x2f9e, 0x1904,
-	0xc32f, 0x6010, 0x2058, 0xb804, 0x9084, 0xff00, 0x8007, 0x9086,
-	0x0006, 0x1904, 0xc123, 0x00e6, 0x00d6, 0x00c6, 0x080c, 0x5157,
-	0xd0e4, 0x0904, 0xc2f2, 0x2069, 0x1800, 0x2071, 0x026c, 0x7008,
+	0x1700, 0x0880, 0x6007, 0x0012, 0x0868, 0x080c, 0x30f6, 0x1904,
+	0xc6af, 0x6010, 0x2058, 0xb804, 0x9084, 0xff00, 0x8007, 0x9086,
+	0x0006, 0x1904, 0xc4a3, 0x00e6, 0x00d6, 0x00c6, 0x080c, 0x5383,
+	0xd0e4, 0x0904, 0xc672, 0x2069, 0x1800, 0x2071, 0x026c, 0x7008,
 	0x603a, 0x720c, 0x623e, 0x9286, 0xffff, 0x1150, 0x7208, 0x00c6,
-	0x2c08, 0x9085, 0x0001, 0x080c, 0xd15a, 0x2c10, 0x00ce, 0x05e8,
-	0x080c, 0xb781, 0x05d0, 0x7108, 0x9280, 0x0002, 0x2004, 0x9106,
-	0x15a0, 0x00c6, 0x0026, 0x2260, 0x080c, 0xb3d3, 0x002e, 0x00ce,
+	0x2c08, 0x9085, 0x0001, 0x080c, 0xd4dc, 0x2c10, 0x00ce, 0x05e8,
+	0x080c, 0xbaec, 0x05d0, 0x7108, 0x9280, 0x0002, 0x2004, 0x9106,
+	0x15a0, 0x00c6, 0x0026, 0x2260, 0x080c, 0xb724, 0x002e, 0x00ce,
 	0x7118, 0x918c, 0xff00, 0x810f, 0x9186, 0x0001, 0x0178, 0x9186,
 	0x0005, 0x0118, 0x9186, 0x0007, 0x1198, 0x9280, 0x0005, 0x2004,
-	0x9005, 0x0170, 0x080c, 0xc3ba, 0x0904, 0xc273, 0x0056, 0x7510,
-	0x7614, 0x080c, 0xd218, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005,
+	0x9005, 0x0170, 0x080c, 0xc73a, 0x0904, 0xc5f3, 0x0056, 0x7510,
+	0x7614, 0x080c, 0xd59f, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005,
 	0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, 0x0001,
-	0x080c, 0x810c, 0x080c, 0x868e, 0x0c78, 0x6007, 0x003b, 0x602f,
-	0x0003, 0x6017, 0x0300, 0x6003, 0x0001, 0x080c, 0x810c, 0x080c,
-	0x868e, 0x0c10, 0x6007, 0x003b, 0x602f, 0x000b, 0x6017, 0x0000,
-	0x0804, 0xc24a, 0x00e6, 0x0026, 0x080c, 0x62d3, 0x0550, 0x080c,
-	0x62bc, 0x080c, 0xd3f1, 0x1518, 0x2071, 0x1800, 0x70d8, 0x9085,
+	0x080c, 0x83c9, 0x080c, 0x894b, 0x0c78, 0x6007, 0x003b, 0x602f,
+	0x0003, 0x6017, 0x0300, 0x6003, 0x0001, 0x080c, 0x83c9, 0x080c,
+	0x894b, 0x0c10, 0x6007, 0x003b, 0x602f, 0x000b, 0x6017, 0x0000,
+	0x0804, 0xc5ca, 0x00e6, 0x0026, 0x080c, 0x6519, 0x0550, 0x080c,
+	0x6502, 0x080c, 0xd778, 0x1518, 0x2071, 0x1800, 0x70d8, 0x9085,
 	0x0003, 0x70da, 0x00f6, 0x2079, 0x0100, 0x72ac, 0x9284, 0x00ff,
 	0x707a, 0x78e6, 0x9284, 0xff00, 0x727c, 0x9205, 0x707e, 0x78ea,
-	0x00fe, 0x70e3, 0x0000, 0x080c, 0x6311, 0x0120, 0x2011, 0x19cf,
-	0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2c63, 0x0010, 0x080c,
-	0xd423, 0x002e, 0x00ee, 0x080c, 0x9ac8, 0x0804, 0xc122, 0x080c,
-	0x9ac8, 0x0005, 0x2600, 0x0002, 0xc346, 0xc346, 0xc346, 0xc346,
-	0xc346, 0xc348, 0xc346, 0xc346, 0xc346, 0xc346, 0xc365, 0xc346,
-	0xc346, 0xc346, 0xc377, 0xc384, 0xc3b5, 0xc346, 0x080c, 0x0db4,
-	0x080c, 0xd37f, 0x1d20, 0x080c, 0x2f9e, 0x1d08, 0x080c, 0xc4cd,
+	0x00fe, 0x70e3, 0x0000, 0x080c, 0x6557, 0x0120, 0x2011, 0x19d1,
+	0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2dbb, 0x0010, 0x080c,
+	0xd7aa, 0x002e, 0x00ee, 0x080c, 0x9e19, 0x0804, 0xc4a2, 0x080c,
+	0x9e19, 0x0005, 0x2600, 0x0002, 0xc6c6, 0xc6c6, 0xc6c6, 0xc6c6,
+	0xc6c6, 0xc6c8, 0xc6c6, 0xc6c6, 0xc6c6, 0xc6c6, 0xc6e5, 0xc6c6,
+	0xc6c6, 0xc6c6, 0xc6f7, 0xc704, 0xc735, 0xc6c6, 0x080c, 0x0db4,
+	0x080c, 0xd706, 0x1d20, 0x080c, 0x30f6, 0x1d08, 0x080c, 0xc84f,
 	0x1148, 0x7038, 0x6016, 0x6007, 0x0045, 0x6003, 0x0001, 0x080c,
-	0x8154, 0x0005, 0x080c, 0x2e7f, 0x080c, 0xbe9b, 0x6007, 0x0001,
-	0x6003, 0x0001, 0x080c, 0x8154, 0x0005, 0x080c, 0xd37f, 0x1938,
-	0x080c, 0x2f9e, 0x1920, 0x080c, 0xc4cd, 0x1d60, 0x703c, 0x6016,
-	0x6007, 0x004a, 0x6003, 0x0001, 0x080c, 0x8154, 0x0005, 0x080c,
-	0xc3d5, 0x0904, 0xc32f, 0x6007, 0x004e, 0x6003, 0x0001, 0x080c,
-	0x8154, 0x080c, 0x868e, 0x0005, 0x6007, 0x004f, 0x6017, 0x0000,
+	0x8411, 0x0005, 0x080c, 0x2fd7, 0x080c, 0xc20e, 0x6007, 0x0001,
+	0x6003, 0x0001, 0x080c, 0x8411, 0x0005, 0x080c, 0xd706, 0x1938,
+	0x080c, 0x30f6, 0x1920, 0x080c, 0xc84f, 0x1d60, 0x703c, 0x6016,
+	0x6007, 0x004a, 0x6003, 0x0001, 0x080c, 0x8411, 0x0005, 0x080c,
+	0xc757, 0x0904, 0xc6af, 0x6007, 0x004e, 0x6003, 0x0001, 0x080c,
+	0x8411, 0x080c, 0x894b, 0x0005, 0x6007, 0x004f, 0x6017, 0x0000,
 	0x7134, 0x918c, 0x00ff, 0x81ff, 0x0508, 0x9186, 0x0001, 0x1160,
-	0x7140, 0x2001, 0x198c, 0x2004, 0x9106, 0x11b0, 0x7144, 0x2001,
-	0x198d, 0x2004, 0x9106, 0x0190, 0x9186, 0x0002, 0x1168, 0x2011,
+	0x7140, 0x2001, 0x198e, 0x2004, 0x9106, 0x11b0, 0x7144, 0x2001,
+	0x198f, 0x2004, 0x9106, 0x0190, 0x9186, 0x0002, 0x1168, 0x2011,
 	0x0276, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x000a,
-	0x080c, 0xaaa3, 0x009e, 0x0110, 0x6017, 0x0001, 0x6003, 0x0001,
-	0x080c, 0x8154, 0x080c, 0x868e, 0x0005, 0x6007, 0x0050, 0x703c,
-	0x6016, 0x0ca0, 0x00e6, 0x2071, 0x0260, 0x00b6, 0x00c6, 0x2260,
-	0x6010, 0x2058, 0xb8bc, 0xd084, 0x0150, 0x7128, 0x6048, 0x9106,
-	0x1120, 0x712c, 0x6044, 0x9106, 0x0110, 0x9006, 0x0010, 0x9085,
-	0x0001, 0x00ce, 0x00be, 0x00ee, 0x0005, 0x0016, 0x0096, 0x0086,
-	0x00e6, 0x01c6, 0x01d6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800,
-	0x708c, 0x908a, 0x00f9, 0x16e8, 0x20e1, 0x0000, 0x2001, 0x196f,
-	0x2003, 0x0000, 0x080c, 0x1005, 0x05a0, 0x2900, 0x6016, 0x708c,
-	0x8004, 0xa816, 0x908a, 0x001e, 0x02d0, 0xa833, 0x001e, 0x20a9,
-	0x001e, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001,
-	0x196f, 0x0016, 0x200c, 0x0471, 0x001e, 0x2940, 0x080c, 0x1005,
-	0x01c0, 0x2900, 0xa006, 0x2100, 0x81ff, 0x0180, 0x0c18, 0xa832,
-	0x20a8, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001,
-	0x196f, 0x0016, 0x200c, 0x00b1, 0x001e, 0x0000, 0x9085, 0x0001,
-	0x0048, 0x2071, 0x1800, 0x708f, 0x0000, 0x6014, 0x2048, 0x080c,
-	0x0f9e, 0x9006, 0x012e, 0x01de, 0x01ce, 0x00ee, 0x008e, 0x009e,
-	0x001e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00c6, 0x918c,
-	0xffff, 0x11a8, 0x080c, 0x20e9, 0x2099, 0x026c, 0x2001, 0x0014,
-	0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x00f8, 0x20a8, 0x4003,
-	0x22a8, 0x8108, 0x080c, 0x20e9, 0x2099, 0x0260, 0x0ca8, 0x080c,
-	0x20e9, 0x2061, 0x196f, 0x6004, 0x2098, 0x6008, 0x3518, 0x9312,
-	0x1218, 0x23a8, 0x4003, 0x0048, 0x20a8, 0x4003, 0x22a8, 0x8108,
-	0x080c, 0x20e9, 0x2099, 0x0260, 0x0ca8, 0x2061, 0x196f, 0x2019,
-	0x0280, 0x3300, 0x931e, 0x0110, 0x6006, 0x0020, 0x2001, 0x0260,
-	0x6006, 0x8108, 0x2162, 0x9292, 0x0021, 0x9296, 0xffff, 0x620a,
-	0x00ce, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016,
-	0x0026, 0x0036, 0x00c6, 0x81ff, 0x11b8, 0x080c, 0x2101, 0x20a1,
-	0x024c, 0x2001, 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003,
-	0x0418, 0x20a8, 0x4003, 0x82ff, 0x01f8, 0x22a8, 0x8108, 0x080c,
-	0x2101, 0x20a1, 0x0240, 0x0c98, 0x080c, 0x2101, 0x2061, 0x1972,
-	0x6004, 0x20a0, 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003,
-	0x0058, 0x20a8, 0x4003, 0x82ff, 0x0138, 0x22a8, 0x8108, 0x080c,
-	0x2101, 0x20a1, 0x0240, 0x0c98, 0x2061, 0x1972, 0x2019, 0x0260,
-	0x3400, 0x931e, 0x0110, 0x6006, 0x0020, 0x2001, 0x0240, 0x6006,
-	0x8108, 0x2162, 0x9292, 0x0021, 0x9296, 0xffff, 0x620a, 0x00ce,
-	0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x00b6, 0x0066, 0x6610,
-	0x2658, 0xbe04, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0170,
-	0x9686, 0x0004, 0x0158, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006,
-	0x0128, 0x9686, 0x0004, 0x0110, 0x9085, 0x0001, 0x006e, 0x00be,
-	0x0005, 0x00d6, 0x080c, 0xc565, 0x00de, 0x0005, 0x00d6, 0x080c,
-	0xc572, 0x1520, 0x680c, 0x908c, 0xff00, 0x6820, 0x9084, 0x00ff,
-	0x9115, 0x6216, 0x6824, 0x602e, 0xd1e4, 0x0130, 0x9006, 0x080c,
-	0xd49b, 0x2009, 0x0001, 0x0078, 0xd1ec, 0x0180, 0x6920, 0x918c,
-	0x00ff, 0x6824, 0x080c, 0x250b, 0x1148, 0x2001, 0x0001, 0x080c,
-	0xd49b, 0x2110, 0x900e, 0x080c, 0x2ec4, 0x0018, 0x9085, 0x0001,
-	0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, 0x00c6, 0x080c, 0x9b15,
-	0x05a8, 0x0016, 0x0026, 0x00c6, 0x2011, 0x0263, 0x2204, 0x8211,
-	0x220c, 0x080c, 0x250b, 0x1578, 0x080c, 0x5f91, 0x1560, 0xbe12,
-	0xbd16, 0x00ce, 0x002e, 0x001e, 0x2b00, 0x6012, 0x080c, 0xd37f,
-	0x11d8, 0x080c, 0x2f9e, 0x11c0, 0x080c, 0xc4cd, 0x0510, 0x2001,
-	0x0007, 0x080c, 0x5f42, 0x2001, 0x0007, 0x080c, 0x5f6e, 0x6017,
-	0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c,
-	0x8154, 0x080c, 0x868e, 0x0010, 0x080c, 0x9ac8, 0x9085, 0x0001,
-	0x00ce, 0x00be, 0x0005, 0x080c, 0x9ac8, 0x00ce, 0x002e, 0x001e,
-	0x0ca8, 0x080c, 0x9ac8, 0x9006, 0x0c98, 0x2069, 0x026d, 0x6800,
-	0x9082, 0x0010, 0x1228, 0x6017, 0x0000, 0x9085, 0x0001, 0x0008,
-	0x9006, 0x0005, 0x6017, 0x0000, 0x2069, 0x026c, 0x6808, 0x9084,
-	0xff00, 0x9086, 0x0800, 0x1190, 0x6904, 0x9186, 0x0018, 0x0118,
-	0x9186, 0x0014, 0x1158, 0x810f, 0x6800, 0x9084, 0x00ff, 0x910d,
-	0x615a, 0x908e, 0x0014, 0x0110, 0x908e, 0x0010, 0x0005, 0x6004,
-	0x90b2, 0x0053, 0x1a0c, 0x0db4, 0x91b6, 0x0013, 0x1130, 0x2008,
-	0x91b2, 0x0040, 0x1a04, 0xc6ba, 0x0092, 0x91b6, 0x0027, 0x0120,
-	0x91b6, 0x0014, 0x190c, 0x0db4, 0x2001, 0x0007, 0x080c, 0x5f6e,
-	0x080c, 0x8589, 0x080c, 0x9af8, 0x080c, 0x868e, 0x0005, 0xc5ef,
-	0xc5f1, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5f1, 0xc600, 0xc6b3, 0xc652,
-	0xc6b3, 0xc664, 0xc6b3, 0xc600, 0xc6b3, 0xc6ab, 0xc6b3, 0xc6ab,
-	0xc6b3, 0xc6b3, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef,
-	0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5f1, 0xc5ef, 0xc6b3,
-	0xc5ef, 0xc5ef, 0xc6b3, 0xc5ef, 0xc6b0, 0xc6b3, 0xc5ef, 0xc5ef,
-	0xc5ef, 0xc5ef, 0xc6b3, 0xc6b3, 0xc5ef, 0xc6b3, 0xc6b3, 0xc5ef,
-	0xc5fb, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef, 0xc6af, 0xc6b3, 0xc5ef,
-	0xc5ef, 0xc6b3, 0xc6b3, 0xc5ef, 0xc5ef, 0xc5ef, 0xc5ef, 0x080c,
-	0x0db4, 0x080c, 0x8589, 0x080c, 0xbe9e, 0x6003, 0x0002, 0x080c,
-	0x868e, 0x0804, 0xc6b9, 0x9006, 0x080c, 0x5f2e, 0x0804, 0xc6b3,
-	0x080c, 0x630d, 0x1904, 0xc6b3, 0x9006, 0x080c, 0x5f2e, 0x6010,
-	0x2058, 0xb810, 0x9086, 0x00ff, 0x1140, 0x00f6, 0x2079, 0x1800,
-	0x78a4, 0x8000, 0x78a6, 0x00fe, 0x0428, 0x6010, 0x2058, 0xb8b0,
-	0x9005, 0x1178, 0x080c, 0xbe86, 0x1904, 0xc6b3, 0x0036, 0x0046,
-	0xbba0, 0x2021, 0x0007, 0x080c, 0x4856, 0x004e, 0x003e, 0x0804,
-	0xc6b3, 0x080c, 0x2fcf, 0x1904, 0xc6b3, 0x2001, 0x1800, 0x2004,
-	0x9086, 0x0002, 0x1138, 0x00f6, 0x2079, 0x1800, 0x78a4, 0x8000,
-	0x78a6, 0x00fe, 0x2001, 0x0002, 0x080c, 0x5f42, 0x080c, 0x8589,
-	0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8154,
-	0x080c, 0x868e, 0x6110, 0x2158, 0x2009, 0x0001, 0x080c, 0x7d64,
-	0x0804, 0xc6b9, 0x6610, 0x2658, 0xbe04, 0x96b4, 0xff00, 0x8637,
-	0x9686, 0x0006, 0x0904, 0xc6b3, 0x9686, 0x0004, 0x0904, 0xc6b3,
-	0x2001, 0x0004, 0x0804, 0xc6b1, 0x2001, 0x1800, 0x2004, 0x9086,
-	0x0003, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021,
-	0x0006, 0x080c, 0x4856, 0x004e, 0x003e, 0x2001, 0x0006, 0x080c,
-	0xc6d7, 0x6610, 0x2658, 0xbe04, 0x0066, 0x96b4, 0xff00, 0x8637,
-	0x9686, 0x0006, 0x006e, 0x0168, 0x2001, 0x0006, 0x080c, 0x5f6e,
-	0x9284, 0x00ff, 0x908e, 0x0007, 0x1120, 0x2001, 0x0006, 0x080c,
-	0x5f42, 0x080c, 0x630d, 0x11f8, 0x2001, 0x1836, 0x2004, 0xd0a4,
-	0x01d0, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, 0x01a0, 0x00f6,
-	0x2079, 0x1800, 0x78a4, 0x8000, 0x78a6, 0x00fe, 0x0804, 0xc63a,
-	0x2001, 0x0004, 0x0030, 0x2001, 0x0006, 0x0449, 0x0020, 0x0018,
-	0x0010, 0x080c, 0x5f6e, 0x080c, 0x8589, 0x080c, 0x9ac8, 0x080c,
-	0x868e, 0x0005, 0x2600, 0x0002, 0xc6ce, 0xc6ce, 0xc6ce, 0xc6ce,
-	0xc6ce, 0xc6d0, 0xc6ce, 0xc6ce, 0xc6ce, 0xc6ce, 0xc6d0, 0xc6ce,
-	0xc6ce, 0xc6ce, 0xc6d0, 0xc6d0, 0xc6d0, 0xc6d0, 0x080c, 0x0db4,
-	0x080c, 0x8589, 0x080c, 0x9ac8, 0x080c, 0x868e, 0x0005, 0x0016,
-	0x00b6, 0x00d6, 0x6110, 0x2158, 0xb900, 0xd184, 0x0138, 0x080c,
-	0x5f42, 0x9006, 0x080c, 0x5f2e, 0x080c, 0x2ea4, 0x00de, 0x00be,
-	0x001e, 0x0005, 0x6610, 0x2658, 0xb804, 0x9084, 0xff00, 0x8007,
-	0x90b2, 0x000c, 0x1a0c, 0x0db4, 0x91b6, 0x0015, 0x1110, 0x003b,
-	0x0028, 0x91b6, 0x0016, 0x190c, 0x0db4, 0x006b, 0x0005, 0xa537,
-	0xa537, 0xa537, 0xa537, 0xa537, 0xa537, 0xc752, 0xc717, 0xa537,
-	0xa537, 0xa537, 0xa537, 0xa537, 0xa537, 0xa537, 0xa537, 0xa537,
-	0xa537, 0xc752, 0xc759, 0xa537, 0xa537, 0xa537, 0xa537, 0x00f6,
-	0x080c, 0x630d, 0x11d8, 0x080c, 0xbe86, 0x11c0, 0x6010, 0x905d,
-	0x01a8, 0xb8b0, 0x9005, 0x0190, 0x9006, 0x080c, 0x5f2e, 0x2001,
-	0x0002, 0x080c, 0x5f42, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007,
-	0x0002, 0x080c, 0x8154, 0x080c, 0x868e, 0x00d0, 0x2011, 0x0263,
-	0x2204, 0x8211, 0x220c, 0x080c, 0x250b, 0x1190, 0x080c, 0x5ff1,
-	0x0118, 0x080c, 0x9ac8, 0x0060, 0xb810, 0x0006, 0xb814, 0x0006,
-	0x080c, 0x5aae, 0x000e, 0xb816, 0x000e, 0xb812, 0x080c, 0x9ac8,
-	0x00fe, 0x0005, 0x6604, 0x96b6, 0x001e, 0x1110, 0x080c, 0x9ac8,
-	0x0005, 0x080c, 0xa91b, 0x1148, 0x6003, 0x0001, 0x6007, 0x0001,
-	0x080c, 0x8154, 0x080c, 0x868e, 0x0010, 0x080c, 0x9ac8, 0x0005,
-	0x6004, 0x908a, 0x0053, 0x1a0c, 0x0db4, 0x080c, 0x8589, 0x080c,
-	0x9af8, 0x080c, 0x868e, 0x0005, 0x9182, 0x0040, 0x0002, 0xc78a,
-	0xc78a, 0xc78a, 0xc78a, 0xc78c, 0xc78a, 0xc78a, 0xc78a, 0xc78a,
-	0xc78a, 0xc78a, 0xc78a, 0xc78a, 0xc78a, 0xc78a, 0xc78a, 0xc78a,
-	0xc78a, 0xc78a, 0x080c, 0x0db4, 0x0096, 0x00b6, 0x00d6, 0x00e6,
-	0x00f6, 0x0046, 0x0026, 0x6210, 0x2258, 0xb8ac, 0x9005, 0x11a8,
-	0x6106, 0x2071, 0x0260, 0x7444, 0x94a4, 0xff00, 0x0904, 0xc7f2,
-	0x080c, 0xd48f, 0x1170, 0x9486, 0x2000, 0x1158, 0x2009, 0x0001,
-	0x2011, 0x0200, 0x080c, 0x7f4a, 0x0020, 0x9026, 0x080c, 0xd3c4,
-	0x0c38, 0x080c, 0x0fec, 0x090c, 0x0db4, 0x6003, 0x0007, 0xa867,
-	0x010d, 0x9006, 0xa802, 0xa86a, 0xac8a, 0x2c00, 0xa88e, 0x6008,
-	0xa8e2, 0x6010, 0x2058, 0xb8a0, 0x7130, 0xa97a, 0x0016, 0xa876,
-	0xa87f, 0x0000, 0xa883, 0x0000, 0xa887, 0x0036, 0x080c, 0x65f2,
-	0x001e, 0x080c, 0xd48f, 0x1904, 0xc852, 0x9486, 0x2000, 0x1130,
-	0x2019, 0x0017, 0x080c, 0xd104, 0x0804, 0xc852, 0x9486, 0x0200,
-	0x1120, 0x080c, 0xd0a0, 0x0804, 0xc852, 0x9486, 0x0400, 0x0120,
-	0x9486, 0x1000, 0x1904, 0xc852, 0x2019, 0x0002, 0x080c, 0xd0bb,
-	0x0804, 0xc852, 0x2069, 0x1a3e, 0x6a00, 0xd284, 0x0904, 0xc8bc,
-	0x9284, 0x0300, 0x1904, 0xc8b5, 0x6804, 0x9005, 0x0904, 0xc89d,
-	0x2d78, 0x6003, 0x0007, 0x080c, 0x1005, 0x0904, 0xc85e, 0x7800,
-	0xd08c, 0x1118, 0x7804, 0x8001, 0x7806, 0x6017, 0x0000, 0x2001,
-	0x180f, 0x2004, 0xd084, 0x1904, 0xc8c0, 0x9006, 0xa802, 0xa867,
-	0x0116, 0xa86a, 0x6008, 0xa8e2, 0x2c00, 0xa87a, 0x6010, 0x2058,
-	0xb8a0, 0x7130, 0xa9b6, 0xa876, 0xb928, 0xa9ba, 0xb92c, 0xa9be,
-	0xb930, 0xa9c2, 0xb934, 0xa9c6, 0xa883, 0x003d, 0x7044, 0x9084,
-	0x0003, 0x9080, 0xc85a, 0x2005, 0xa87e, 0x20a9, 0x000a, 0x2001,
-	0x0270, 0xaa5c, 0x9290, 0x0021, 0x2009, 0x0205, 0x200b, 0x0080,
-	0x20e1, 0x0000, 0xab60, 0x23e8, 0x2098, 0x22a0, 0x4003, 0x200b,
-	0x0000, 0x2001, 0x027a, 0x200c, 0xa9b2, 0x8000, 0x200c, 0xa9ae,
-	0x080c, 0x65f2, 0x002e, 0x004e, 0x00fe, 0x00ee, 0x00de, 0x00be,
-	0x009e, 0x0005, 0x0000, 0x0080, 0x0040, 0x0000, 0x2001, 0x1810,
-	0x2004, 0xd084, 0x0120, 0x080c, 0x0fec, 0x1904, 0xc807, 0x6017,
-	0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x810c, 0x080c,
-	0x868e, 0x0c00, 0x2069, 0x0260, 0x6848, 0x9084, 0xff00, 0x9086,
-	0x1200, 0x1198, 0x686c, 0x9084, 0x00ff, 0x0016, 0x6114, 0x918c,
-	0xf700, 0x910d, 0x6116, 0x001e, 0x6003, 0x0001, 0x6007, 0x0043,
-	0x080c, 0x810c, 0x080c, 0x868e, 0x0828, 0x6868, 0x602e, 0x686c,
-	0x6032, 0x6017, 0xf200, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c,
-	0x810c, 0x080c, 0x868e, 0x0804, 0xc852, 0x2001, 0x180e, 0x2004,
-	0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x46b9, 0x6017, 0xf300,
-	0x0010, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c,
-	0x810c, 0x080c, 0x868e, 0x0804, 0xc852, 0x6017, 0xf500, 0x0c98,
-	0x6017, 0xf600, 0x0804, 0xc872, 0x6017, 0xf200, 0x0804, 0xc872,
-	0xa867, 0x0146, 0xa86b, 0x0000, 0x6008, 0xa886, 0x2c00, 0xa87a,
-	0x7044, 0x9084, 0x0003, 0x9080, 0xc85a, 0x2005, 0xa87e, 0x2928,
-	0x6010, 0x2058, 0xb8a0, 0xa876, 0xb828, 0xa88a, 0xb82c, 0xa88e,
-	0xb830, 0xa892, 0xb834, 0xa896, 0xa883, 0x003d, 0x2009, 0x0205,
-	0x2104, 0x9085, 0x0080, 0x200a, 0x20e1, 0x0000, 0x2011, 0x0210,
-	0x2214, 0x9294, 0x0fff, 0xaaa2, 0x9282, 0x0111, 0x1a0c, 0x0db4,
-	0x8210, 0x821c, 0x2001, 0x026c, 0x2098, 0xa860, 0x20e8, 0xa85c,
-	0x9080, 0x0029, 0x20a0, 0x2011, 0xc93c, 0x2041, 0x0001, 0x223d,
-	0x9784, 0x00ff, 0x9322, 0x1208, 0x2300, 0x20a8, 0x4003, 0x931a,
-	0x0530, 0x8210, 0xd7fc, 0x1130, 0x8d68, 0x2d0a, 0x2001, 0x0260,
-	0x2098, 0x0c68, 0x2950, 0x080c, 0x1005, 0x0170, 0x2900, 0xb002,
-	0xa867, 0x0147, 0xa86b, 0x0000, 0xa860, 0x20e8, 0xa85c, 0x9080,
-	0x001b, 0x20a0, 0x8840, 0x08d8, 0x2548, 0xa800, 0x902d, 0x0118,
-	0x080c, 0x101e, 0x0cc8, 0x080c, 0x101e, 0x0804, 0xc85e, 0x2548,
-	0x8847, 0x9885, 0x0046, 0xa866, 0x2009, 0x0205, 0x200b, 0x0000,
-	0x080c, 0xd133, 0x0804, 0xc852, 0x8010, 0x0004, 0x801a, 0x0006,
-	0x8018, 0x0008, 0x8016, 0x000a, 0x8014, 0x9186, 0x0013, 0x1160,
-	0x6004, 0x908a, 0x0054, 0x1a0c, 0x0db4, 0x9082, 0x0040, 0x0a0c,
-	0x0db4, 0x2008, 0x0804, 0xc9ed, 0x9186, 0x0051, 0x0108, 0x00c0,
-	0x2001, 0x0109, 0x2004, 0xd084, 0x0904, 0xc99e, 0x0126, 0x2091,
-	0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x7ff8, 0x002e, 0x001e,
-	0x000e, 0x012e, 0x6000, 0x9086, 0x0002, 0x1580, 0x0804, 0xca35,
-	0x9186, 0x0027, 0x0530, 0x9186, 0x0048, 0x0128, 0x9186, 0x0014,
-	0x0500, 0x190c, 0x0db4, 0x2001, 0x0109, 0x2004, 0xd084, 0x01f0,
-	0x00c6, 0x0126, 0x2091, 0x2800, 0x00c6, 0x2061, 0x0100, 0x0006,
-	0x0016, 0x0026, 0x080c, 0x7ff8, 0x002e, 0x001e, 0x000e, 0x00ce,
-	0x012e, 0x00ce, 0x6000, 0x9086, 0x0004, 0x190c, 0x0db4, 0x0804,
-	0xcb16, 0x6004, 0x9082, 0x0040, 0x2008, 0x001a, 0x080c, 0x9b5d,
-	0x0005, 0xc9b4, 0xc9b6, 0xc9b6, 0xc9dd, 0xc9b4, 0xc9b4, 0xc9b4,
-	0xc9b4, 0xc9b4, 0xc9b4, 0xc9b4, 0xc9b4, 0xc9b4, 0xc9b4, 0xc9b4,
-	0xc9b4, 0xc9b4, 0xc9b4, 0xc9b4, 0x080c, 0x0db4, 0x080c, 0x8589,
-	0x080c, 0x868e, 0x0036, 0x0096, 0x6014, 0x904d, 0x01d8, 0x080c,
-	0xb793, 0x01c0, 0x6003, 0x0002, 0x6010, 0x00b6, 0x2058, 0xb800,
-	0x00be, 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c, 0xd133, 0x6017,
-	0x0000, 0x6018, 0x9005, 0x1120, 0x2001, 0x1956, 0x2004, 0x601a,
-	0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x0096, 0x080c, 0x8589,
-	0x080c, 0x868e, 0x080c, 0xb793, 0x0120, 0x6014, 0x2048, 0x080c,
-	0x101e, 0x080c, 0x9af8, 0x009e, 0x0005, 0x0002, 0xca01, 0xca18,
-	0xca03, 0xca2f, 0xca01, 0xca01, 0xca01, 0xca01, 0xca01, 0xca01,
-	0xca01, 0xca01, 0xca01, 0xca01, 0xca01, 0xca01, 0xca01, 0xca01,
-	0xca01, 0x080c, 0x0db4, 0x0096, 0x080c, 0x8589, 0x6014, 0x2048,
-	0xa87c, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, 0x0043, 0x080c,
-	0x9b42, 0x0010, 0x6003, 0x0004, 0x080c, 0x868e, 0x009e, 0x0005,
-	0x080c, 0x8589, 0x080c, 0xb793, 0x0138, 0x6114, 0x0096, 0x2148,
-	0xa97c, 0x009e, 0xd1ec, 0x1138, 0x080c, 0x7f1f, 0x080c, 0x9ac8,
-	0x080c, 0x868e, 0x0005, 0x080c, 0xd388, 0x0db0, 0x0cc8, 0x080c,
-	0x8589, 0x2009, 0x0041, 0x0804, 0xcb9e, 0x9182, 0x0040, 0x0002,
-	0xca4b, 0xca4d, 0xca4b, 0xca4b, 0xca4b, 0xca4b, 0xca4b, 0xca4b,
-	0xca4b, 0xca4b, 0xca4b, 0xca4b, 0xca4b, 0xca4b, 0xca4b, 0xca4b,
-	0xca4b, 0xca4e, 0xca4b, 0x080c, 0x0db4, 0x0005, 0x00d6, 0x080c,
-	0x7f1f, 0x00de, 0x080c, 0xd3e0, 0x080c, 0x9ac8, 0x0005, 0x9182,
-	0x0040, 0x0002, 0xca6d, 0xca6d, 0xca6d, 0xca6d, 0xca6d, 0xca6d,
-	0xca6d, 0xca6d, 0xca6d, 0xca6f, 0xcade, 0xca6d, 0xca6d, 0xca6d,
-	0xca6d, 0xcade, 0xca6d, 0xca6d, 0xca6d, 0x080c, 0x0db4, 0x2001,
-	0x0105, 0x2004, 0x9084, 0x1800, 0x01c8, 0x2001, 0x0132, 0x200c,
-	0x2001, 0x0131, 0x2004, 0x9105, 0x1904, 0xcade, 0x2009, 0x180c,
-	0x2104, 0xd0d4, 0x0904, 0xcade, 0xc0d4, 0x200a, 0x2009, 0x0105,
-	0x2104, 0x9084, 0xe7fd, 0x9085, 0x0010, 0x200a, 0x2001, 0x1873,
-	0x2004, 0xd0e4, 0x1528, 0x603b, 0x0000, 0x080c, 0x863e, 0x6014,
-	0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0188, 0x908c, 0x0003, 0x918e,
-	0x0002, 0x0508, 0x2001, 0x180c, 0x2004, 0xd0d4, 0x11e0, 0x080c,
-	0x8769, 0x2009, 0x0041, 0x009e, 0x0804, 0xcb9e, 0x080c, 0x8769,
-	0x6003, 0x0007, 0x601b, 0x0000, 0x080c, 0x7f1f, 0x009e, 0x0005,
-	0x2001, 0x0100, 0x2004, 0x9082, 0x0005, 0x0aa8, 0x2001, 0x011f,
-	0x2004, 0x603a, 0x0890, 0x2001, 0x180c, 0x200c, 0xc1d4, 0x2102,
-	0xd1cc, 0x0110, 0x080c, 0x291f, 0x080c, 0x8769, 0x6014, 0x2048,
-	0xa97c, 0xd1ec, 0x1130, 0x080c, 0x7f1f, 0x080c, 0x9ac8, 0x009e,
-	0x0005, 0x080c, 0xd388, 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c,
-	0x200c, 0xc1d4, 0x2102, 0x0036, 0x080c, 0x863e, 0x080c, 0x8769,
-	0x6014, 0x0096, 0x2048, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be,
-	0xd0bc, 0x0188, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x0140,
-	0xa8ac, 0x6330, 0x931a, 0x6332, 0xa8b0, 0x632c, 0x931b, 0x632e,
-	0x6003, 0x0002, 0x0080, 0x2019, 0x0004, 0x080c, 0xd133, 0x6018,
-	0x9005, 0x1128, 0x2001, 0x1956, 0x2004, 0x8003, 0x601a, 0x6017,
-	0x0000, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x9182, 0x0040,
-	0x0002, 0xcb2d, 0xcb2d, 0xcb2d, 0xcb2d, 0xcb2d, 0xcb2d, 0xcb2d,
-	0xcb2d, 0xcb2f, 0xcb2d, 0xcb2d, 0xcb2d, 0xcb2d, 0xcb2d, 0xcb2d,
-	0xcb2d, 0xcb2d, 0xcb2d, 0xcb2d, 0xcb7a, 0x080c, 0x0db4, 0x6014,
-	0x0096, 0x2048, 0xa834, 0xaa38, 0x6110, 0x00b6, 0x2058, 0xb900,
-	0x00be, 0xd1bc, 0x1190, 0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128,
-	0x2009, 0x0041, 0x009e, 0x0804, 0xcb9e, 0x6003, 0x0007, 0x601b,
-	0x0000, 0x080c, 0x7f1f, 0x009e, 0x0005, 0x6124, 0xd1f4, 0x1d58,
-	0x0006, 0x0046, 0xacac, 0x9422, 0xa9b0, 0x2200, 0x910b, 0x6030,
-	0x9420, 0x6432, 0x602c, 0x9109, 0x612e, 0x004e, 0x000e, 0x08d8,
-	0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1bc, 0x1178, 0x2009,
-	0x180e, 0x210c, 0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003,
-	0x0006, 0x00e9, 0x080c, 0x7f21, 0x009e, 0x0005, 0x6003, 0x0002,
-	0x009e, 0x0005, 0x6024, 0xd0f4, 0x0128, 0x080c, 0x14f3, 0x1904,
-	0xcb2f, 0x0005, 0x6014, 0x0096, 0x2048, 0xa834, 0xa938, 0x009e,
-	0x9105, 0x1120, 0x080c, 0x14f3, 0x1904, 0xcb2f, 0x0005, 0xd2fc,
-	0x0140, 0x8002, 0x8000, 0x8212, 0x9291, 0x0000, 0x2009, 0x0009,
-	0x0010, 0x2009, 0x0015, 0xaa9a, 0xa896, 0x0005, 0x9182, 0x0040,
-	0x0208, 0x0062, 0x9186, 0x0013, 0x0120, 0x9186, 0x0014, 0x190c,
-	0x0db4, 0x6024, 0xd0dc, 0x090c, 0x0db4, 0x0005, 0xcbc1, 0xcbcd,
-	0xcbd9, 0xcbe5, 0xcbc1, 0xcbc1, 0xcbc1, 0xcbc1, 0xcbc8, 0xcbc3,
-	0xcbc3, 0xcbc1, 0xcbc1, 0xcbc1, 0xcbc1, 0xcbc3, 0xcbc1, 0xcbc3,
-	0xcbc1, 0x080c, 0x0db4, 0x6024, 0xd0dc, 0x090c, 0x0db4, 0x0005,
-	0x6014, 0x9005, 0x190c, 0x0db4, 0x0005, 0x6003, 0x0001, 0x6106,
-	0x080c, 0x810c, 0x0126, 0x2091, 0x8000, 0x080c, 0x868e, 0x012e,
-	0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x810c, 0x0126, 0x2091,
-	0x8000, 0x080c, 0x868e, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106,
-	0x2c10, 0x080c, 0x19aa, 0x0126, 0x2091, 0x8000, 0x080c, 0x8171,
-	0x080c, 0x8769, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0036,
-	0x0096, 0x9182, 0x0040, 0x0023, 0x009e, 0x003e, 0x012e, 0x0005,
-	0xcc10, 0xcc12, 0xcc24, 0xcc3e, 0xcc10, 0xcc10, 0xcc10, 0xcc10,
-	0xcc10, 0xcc10, 0xcc10, 0xcc10, 0xcc10, 0xcc10, 0xcc10, 0xcc10,
-	0x080c, 0x0db4, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x01f8, 0x909c,
-	0x0003, 0x939e, 0x0003, 0x01d0, 0x6003, 0x0001, 0x6106, 0x080c,
-	0x810c, 0x080c, 0x868e, 0x0470, 0x6014, 0x2048, 0xa87c, 0xd0fc,
-	0x0168, 0x909c, 0x0003, 0x939e, 0x0003, 0x0140, 0x6003, 0x0001,
-	0x6106, 0x080c, 0x810c, 0x080c, 0x868e, 0x00e0, 0x901e, 0x6316,
-	0x631a, 0x2019, 0x0004, 0x080c, 0xd133, 0x00a0, 0x6014, 0x2048,
-	0xa87c, 0xd0fc, 0x0d98, 0x909c, 0x0003, 0x939e, 0x0003, 0x0d70,
-	0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, 0x19aa, 0x080c, 0x8171,
-	0x080c, 0x8769, 0x0005, 0x080c, 0x8589, 0x6114, 0x81ff, 0x0158,
-	0x0096, 0x2148, 0x080c, 0xd42c, 0x0036, 0x2019, 0x0029, 0x080c,
-	0xd133, 0x003e, 0x009e, 0x080c, 0x9af8, 0x080c, 0x868e, 0x0005,
-	0x080c, 0x863e, 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c,
-	0xd42c, 0x0036, 0x2019, 0x0029, 0x080c, 0xd133, 0x003e, 0x009e,
-	0x080c, 0x9af8, 0x080c, 0x8769, 0x0005, 0x9182, 0x0085, 0x0002,
-	0xcc8f, 0xcc8d, 0xcc8d, 0xcc9b, 0xcc8d, 0xcc8d, 0xcc8d, 0xcc8d,
-	0xcc8d, 0xcc8d, 0xcc8d, 0xcc8d, 0xcc8d, 0x080c, 0x0db4, 0x6003,
-	0x000b, 0x6106, 0x080c, 0x810c, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x868e, 0x012e, 0x0005, 0x0026, 0x00e6, 0x080c, 0xd37f, 0x0118,
-	0x080c, 0x9ac8, 0x0450, 0x2071, 0x0260, 0x7224, 0x6216, 0x2001,
-	0x180e, 0x2004, 0xd0e4, 0x0150, 0x6010, 0x00b6, 0x2058, 0xbca0,
-	0x00be, 0x2c00, 0x2011, 0x014e, 0x080c, 0x9de8, 0x7220, 0x080c,
-	0xcfd9, 0x0118, 0x6007, 0x0086, 0x0040, 0x6007, 0x0087, 0x7224,
-	0x9296, 0xffff, 0x1110, 0x6007, 0x0086, 0x6003, 0x0001, 0x080c,
-	0x810c, 0x080c, 0x868e, 0x080c, 0x8769, 0x00ee, 0x002e, 0x0005,
-	0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0db4,
-	0x908a, 0x0092, 0x1a0c, 0x0db4, 0x9082, 0x0085, 0x00a2, 0x9186,
-	0x0027, 0x0130, 0x9186, 0x0014, 0x0118, 0x080c, 0x9b5d, 0x0050,
-	0x2001, 0x0007, 0x080c, 0x5f6e, 0x080c, 0x8589, 0x080c, 0x9af8,
-	0x080c, 0x868e, 0x0005, 0xcd00, 0xcd02, 0xcd02, 0xcd00, 0xcd00,
-	0xcd00, 0xcd00, 0xcd00, 0xcd00, 0xcd00, 0xcd00, 0xcd00, 0xcd00,
-	0x080c, 0x0db4, 0x080c, 0x8589, 0x080c, 0x9af8, 0x080c, 0x868e,
-	0x0005, 0x9182, 0x0085, 0x0a0c, 0x0db4, 0x9182, 0x0092, 0x1a0c,
-	0x0db4, 0x9182, 0x0085, 0x0002, 0xcd21, 0xcd21, 0xcd21, 0xcd23,
-	0xcd21, 0xcd21, 0xcd21, 0xcd21, 0xcd21, 0xcd21, 0xcd21, 0xcd21,
-	0xcd21, 0x080c, 0x0db4, 0x0005, 0x9186, 0x0013, 0x0148, 0x9186,
-	0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0x9b5d, 0x0030,
-	0x080c, 0x8589, 0x080c, 0x9af8, 0x080c, 0x868e, 0x0005, 0x0036,
-	0x080c, 0xd3e0, 0x6043, 0x0000, 0x2019, 0x000b, 0x0031, 0x6023,
-	0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, 0x0036, 0x2091,
-	0x8000, 0x0086, 0x2c40, 0x0096, 0x904e, 0x080c, 0x9450, 0x009e,
-	0x008e, 0x1550, 0x0076, 0x2c38, 0x080c, 0x94fb, 0x007e, 0x1520,
-	0x6000, 0x9086, 0x0000, 0x0500, 0x6020, 0x9086, 0x0007, 0x01e0,
-	0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xd3e0, 0x080c, 0xbe9e,
-	0x080c, 0x185b, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, 0xb793,
-	0x0110, 0x080c, 0xd133, 0x009e, 0x6017, 0x0000, 0x080c, 0xd3e0,
-	0x6023, 0x0007, 0x080c, 0xbe9e, 0x003e, 0x012e, 0x0005, 0x00f6,
-	0x00c6, 0x00b6, 0x0036, 0x0156, 0x2079, 0x0260, 0x7938, 0x783c,
-	0x080c, 0x250b, 0x15b8, 0x0016, 0x00c6, 0x080c, 0x5ff1, 0x1580,
-	0x001e, 0x00c6, 0x2160, 0x080c, 0xbe9b, 0x00ce, 0x002e, 0x0026,
-	0x0016, 0x2019, 0x0029, 0x080c, 0x95bc, 0x080c, 0x828c, 0x0076,
-	0x903e, 0x080c, 0x8184, 0x007e, 0x001e, 0x0076, 0x903e, 0x080c,
-	0xcef9, 0x007e, 0x0026, 0xba04, 0x9294, 0xff00, 0x8217, 0x9286,
-	0x0006, 0x0118, 0x9286, 0x0004, 0x1118, 0xbaa0, 0x080c, 0x2f38,
-	0x002e, 0x001e, 0x080c, 0x5aae, 0xbe12, 0xbd16, 0x9006, 0x0010,
-	0x00ce, 0x001e, 0x015e, 0x003e, 0x00be, 0x00ce, 0x00fe, 0x0005,
-	0x00c6, 0x00d6, 0x00b6, 0x0016, 0x2009, 0x1823, 0x2104, 0x9086,
-	0x0074, 0x1904, 0xce21, 0x2069, 0x0260, 0x6944, 0x9182, 0x0100,
-	0x06e0, 0x6940, 0x9184, 0x8000, 0x0904, 0xce1e, 0x2001, 0x194d,
-	0x2004, 0x9005, 0x1140, 0x6010, 0x2058, 0xb8b0, 0x9005, 0x0118,
-	0x9184, 0x0800, 0x0598, 0x6948, 0x918a, 0x0001, 0x0648, 0x080c,
-	0xd494, 0x0118, 0x6978, 0xd1fc, 0x11b8, 0x2009, 0x0205, 0x200b,
-	0x0001, 0x693c, 0x81ff, 0x1198, 0x6944, 0x9182, 0x0100, 0x02a8,
-	0x6940, 0x81ff, 0x1178, 0x6948, 0x918a, 0x0001, 0x0288, 0x6950,
-	0x918a, 0x0001, 0x0298, 0x00d0, 0x6017, 0x0100, 0x00a0, 0x6017,
-	0x0300, 0x0088, 0x6017, 0x0500, 0x0070, 0x6017, 0x0700, 0x0058,
-	0x6017, 0x0900, 0x0040, 0x6017, 0x0b00, 0x0028, 0x6017, 0x0f00,
-	0x0010, 0x6017, 0x2d00, 0x9085, 0x0001, 0x0008, 0x9006, 0x001e,
-	0x00be, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00b6, 0x0026, 0x0036,
-	0x0156, 0x6210, 0x2258, 0xbb04, 0x9394, 0x00ff, 0x9286, 0x0006,
-	0x0180, 0x9286, 0x0004, 0x0168, 0x9394, 0xff00, 0x8217, 0x9286,
-	0x0006, 0x0138, 0x9286, 0x0004, 0x0120, 0x080c, 0x6000, 0x0804,
-	0xce88, 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019,
-	0x000a, 0x080c, 0xaaa3, 0x009e, 0x15a0, 0x2011, 0x027a, 0x20a9,
-	0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xaaa3, 0x009e,
-	0x1540, 0x0046, 0x0016, 0xbaa0, 0x2220, 0x9006, 0x2009, 0x1854,
-	0x210c, 0x0038, 0x2009, 0x0029, 0x080c, 0xd188, 0xb800, 0xc0e5,
-	0xb802, 0x2019, 0x0029, 0x080c, 0x828c, 0x0076, 0x2039, 0x0000,
-	0x080c, 0x8184, 0x2c08, 0x080c, 0xcef9, 0x007e, 0x2001, 0x0007,
-	0x080c, 0x5f6e, 0x2001, 0x0007, 0x080c, 0x5f42, 0x001e, 0x004e,
-	0x9006, 0x015e, 0x003e, 0x002e, 0x00be, 0x00ce, 0x0005, 0x00d6,
-	0x2069, 0x026e, 0x6800, 0x9086, 0x0800, 0x0118, 0x6017, 0x0000,
-	0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, 0x00f6, 0x0016, 0x0026,
-	0x0036, 0x0156, 0x2079, 0x026c, 0x7930, 0x7834, 0x080c, 0x250b,
-	0x11d0, 0x080c, 0x5ff1, 0x11b8, 0x2011, 0x0270, 0x20a9, 0x0004,
-	0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xaaa3, 0x009e, 0x1158,
-	0x2011, 0x0274, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006,
-	0x080c, 0xaaa3, 0x009e, 0x015e, 0x003e, 0x002e, 0x001e, 0x00fe,
-	0x00be, 0x0005, 0x00b6, 0x0006, 0x0016, 0x0026, 0x0036, 0x0156,
-	0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x250b, 0x11d0,
-	0x080c, 0x5ff1, 0x11b8, 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096,
-	0x2b48, 0x2019, 0x000a, 0x080c, 0xaaa3, 0x009e, 0x1158, 0x2011,
+	0x080c, 0xadf4, 0x009e, 0x0110, 0x6017, 0x0001, 0x6003, 0x0001,
+	0x080c, 0x8411, 0x080c, 0x894b, 0x0005, 0x6007, 0x0050, 0x703c,
+	0x6016, 0x0ca0, 0x0016, 0x00e6, 0x2071, 0x0260, 0x00b6, 0x00c6,
+	0x2260, 0x6010, 0x2058, 0xb8bc, 0xd084, 0x0150, 0x7128, 0x6048,
+	0x9106, 0x1120, 0x712c, 0x6044, 0x9106, 0x0110, 0x9006, 0x0010,
+	0x9085, 0x0001, 0x00ce, 0x00be, 0x00ee, 0x001e, 0x0005, 0x0016,
+	0x0096, 0x0086, 0x00e6, 0x01c6, 0x01d6, 0x0126, 0x2091, 0x8000,
+	0x2071, 0x1800, 0x708c, 0x908a, 0x00f9, 0x16e8, 0x20e1, 0x0000,
+	0x2001, 0x1971, 0x2003, 0x0000, 0x080c, 0x1004, 0x05a0, 0x2900,
+	0x6016, 0x708c, 0x8004, 0xa816, 0x908a, 0x001e, 0x02d0, 0xa833,
+	0x001e, 0x20a9, 0x001e, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b,
+	0x20a0, 0x2001, 0x1971, 0x0016, 0x200c, 0x0471, 0x001e, 0x2940,
+	0x080c, 0x1004, 0x01c0, 0x2900, 0xa006, 0x2100, 0x81ff, 0x0180,
+	0x0c18, 0xa832, 0x20a8, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b,
+	0x20a0, 0x2001, 0x1971, 0x0016, 0x200c, 0x00b1, 0x001e, 0x0000,
+	0x9085, 0x0001, 0x0048, 0x2071, 0x1800, 0x708f, 0x0000, 0x6014,
+	0x2048, 0x080c, 0x0f9d, 0x9006, 0x012e, 0x01de, 0x01ce, 0x00ee,
+	0x008e, 0x009e, 0x001e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036,
+	0x00c6, 0x918c, 0xffff, 0x11a8, 0x080c, 0x2241, 0x2099, 0x026c,
+	0x2001, 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x00f8,
+	0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, 0x2241, 0x2099, 0x0260,
+	0x0ca8, 0x080c, 0x2241, 0x2061, 0x1971, 0x6004, 0x2098, 0x6008,
+	0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0048, 0x20a8, 0x4003,
+	0x22a8, 0x8108, 0x080c, 0x2241, 0x2099, 0x0260, 0x0ca8, 0x2061,
+	0x1971, 0x2019, 0x0280, 0x3300, 0x931e, 0x0110, 0x6006, 0x0020,
+	0x2001, 0x0260, 0x6006, 0x8108, 0x2162, 0x9292, 0x0021, 0x9296,
+	0xffff, 0x620a, 0x00ce, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005,
+	0x0006, 0x0016, 0x0026, 0x0036, 0x00c6, 0x81ff, 0x11b8, 0x080c,
+	0x2259, 0x20a1, 0x024c, 0x2001, 0x0014, 0x3518, 0x9312, 0x1218,
+	0x23a8, 0x4003, 0x0418, 0x20a8, 0x4003, 0x82ff, 0x01f8, 0x22a8,
+	0x8108, 0x080c, 0x2259, 0x20a1, 0x0240, 0x0c98, 0x080c, 0x2259,
+	0x2061, 0x1974, 0x6004, 0x20a0, 0x6008, 0x3518, 0x9312, 0x1218,
+	0x23a8, 0x4003, 0x0058, 0x20a8, 0x4003, 0x82ff, 0x0138, 0x22a8,
+	0x8108, 0x080c, 0x2259, 0x20a1, 0x0240, 0x0c98, 0x2061, 0x1974,
+	0x2019, 0x0260, 0x3400, 0x931e, 0x0110, 0x6006, 0x0020, 0x2001,
+	0x0240, 0x6006, 0x8108, 0x2162, 0x9292, 0x0021, 0x9296, 0xffff,
+	0x620a, 0x00ce, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x00b6,
+	0x0066, 0x6610, 0x2658, 0xbe04, 0x96b4, 0xff00, 0x8637, 0x9686,
+	0x0006, 0x0170, 0x9686, 0x0004, 0x0158, 0xbe04, 0x96b4, 0x00ff,
+	0x9686, 0x0006, 0x0128, 0x9686, 0x0004, 0x0110, 0x9085, 0x0001,
+	0x006e, 0x00be, 0x0005, 0x00d6, 0x080c, 0xc8e7, 0x00de, 0x0005,
+	0x00d6, 0x080c, 0xc8f4, 0x1520, 0x680c, 0x908c, 0xff00, 0x6820,
+	0x9084, 0x00ff, 0x9115, 0x6216, 0x6824, 0x602e, 0xd1e4, 0x0130,
+	0x9006, 0x080c, 0xd822, 0x2009, 0x0001, 0x0078, 0xd1ec, 0x0180,
+	0x6920, 0x918c, 0x00ff, 0x6824, 0x080c, 0x2663, 0x1148, 0x2001,
+	0x0001, 0x080c, 0xd822, 0x2110, 0x900e, 0x080c, 0x301c, 0x0018,
+	0x9085, 0x0001, 0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, 0x00c6,
+	0x080c, 0x9e66, 0x05a8, 0x0016, 0x0026, 0x00c6, 0x2011, 0x0263,
+	0x2204, 0x8211, 0x220c, 0x080c, 0x2663, 0x1578, 0x080c, 0x61d7,
+	0x1560, 0xbe12, 0xbd16, 0x00ce, 0x002e, 0x001e, 0x2b00, 0x6012,
+	0x080c, 0xd706, 0x11d8, 0x080c, 0x30f6, 0x11c0, 0x080c, 0xc84f,
+	0x0510, 0x2001, 0x0007, 0x080c, 0x6188, 0x2001, 0x0007, 0x080c,
+	0x61b4, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003,
+	0x0001, 0x080c, 0x8411, 0x080c, 0x894b, 0x0010, 0x080c, 0x9e19,
+	0x9085, 0x0001, 0x00ce, 0x00be, 0x0005, 0x080c, 0x9e19, 0x00ce,
+	0x002e, 0x001e, 0x0ca8, 0x080c, 0x9e19, 0x9006, 0x0c98, 0x2069,
+	0x026d, 0x6800, 0x9082, 0x0010, 0x1228, 0x6017, 0x0000, 0x9085,
+	0x0001, 0x0008, 0x9006, 0x0005, 0x6017, 0x0000, 0x2069, 0x026c,
+	0x6808, 0x9084, 0xff00, 0x9086, 0x0800, 0x1190, 0x6904, 0x9186,
+	0x0018, 0x0118, 0x9186, 0x0014, 0x1158, 0x810f, 0x6800, 0x9084,
+	0x00ff, 0x910d, 0x615a, 0x908e, 0x0014, 0x0110, 0x908e, 0x0010,
+	0x0005, 0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0db4, 0x91b6, 0x0013,
+	0x1130, 0x2008, 0x91b2, 0x0040, 0x1a04, 0xca3c, 0x0092, 0x91b6,
+	0x0027, 0x0120, 0x91b6, 0x0014, 0x190c, 0x0db4, 0x2001, 0x0007,
+	0x080c, 0x61b4, 0x080c, 0x8846, 0x080c, 0x9e49, 0x080c, 0x894b,
+	0x0005, 0xc971, 0xc973, 0xc971, 0xc971, 0xc971, 0xc973, 0xc982,
+	0xca35, 0xc9d4, 0xca35, 0xc9e6, 0xca35, 0xc982, 0xca35, 0xca2d,
+	0xca35, 0xca2d, 0xca35, 0xca35, 0xc971, 0xc971, 0xc971, 0xc971,
+	0xc971, 0xc971, 0xc971, 0xc971, 0xc971, 0xc971, 0xc971, 0xc973,
+	0xc971, 0xca35, 0xc971, 0xc971, 0xca35, 0xc971, 0xca32, 0xca35,
+	0xc971, 0xc971, 0xc971, 0xc971, 0xca35, 0xca35, 0xc971, 0xca35,
+	0xca35, 0xc971, 0xc97d, 0xc971, 0xc971, 0xc971, 0xc971, 0xca31,
+	0xca35, 0xc971, 0xc971, 0xca35, 0xca35, 0xc971, 0xc971, 0xc971,
+	0xc971, 0x080c, 0x0db4, 0x080c, 0x8846, 0x080c, 0xc211, 0x6003,
+	0x0002, 0x080c, 0x894b, 0x0804, 0xca3b, 0x9006, 0x080c, 0x6174,
+	0x0804, 0xca35, 0x080c, 0x6553, 0x1904, 0xca35, 0x9006, 0x080c,
+	0x6174, 0x6010, 0x2058, 0xb810, 0x9086, 0x00ff, 0x1140, 0x00f6,
+	0x2079, 0x1800, 0x78a4, 0x8000, 0x78a6, 0x00fe, 0x0428, 0x6010,
+	0x2058, 0xb8b0, 0x9005, 0x1178, 0x080c, 0xc1f9, 0x1904, 0xca35,
+	0x0036, 0x0046, 0xbba0, 0x2021, 0x0007, 0x080c, 0x4a6f, 0x004e,
+	0x003e, 0x0804, 0xca35, 0x080c, 0x3127, 0x1904, 0xca35, 0x2001,
+	0x1800, 0x2004, 0x9086, 0x0002, 0x1138, 0x00f6, 0x2079, 0x1800,
+	0x78a4, 0x8000, 0x78a6, 0x00fe, 0x2001, 0x0002, 0x080c, 0x6188,
+	0x080c, 0x8846, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002,
+	0x080c, 0x8411, 0x080c, 0x894b, 0x6110, 0x2158, 0x2009, 0x0001,
+	0x080c, 0x801e, 0x0804, 0xca3b, 0x6610, 0x2658, 0xbe04, 0x96b4,
+	0xff00, 0x8637, 0x9686, 0x0006, 0x0904, 0xca35, 0x9686, 0x0004,
+	0x0904, 0xca35, 0x2001, 0x0004, 0x0804, 0xca33, 0x2001, 0x1800,
+	0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058,
+	0xbba0, 0x2021, 0x0006, 0x080c, 0x4a6f, 0x004e, 0x003e, 0x2001,
+	0x0006, 0x080c, 0xca59, 0x6610, 0x2658, 0xbe04, 0x0066, 0x96b4,
+	0xff00, 0x8637, 0x9686, 0x0006, 0x006e, 0x0168, 0x2001, 0x0006,
+	0x080c, 0x61b4, 0x9284, 0x00ff, 0x908e, 0x0007, 0x1120, 0x2001,
+	0x0006, 0x080c, 0x6188, 0x080c, 0x6553, 0x11f8, 0x2001, 0x1836,
+	0x2004, 0xd0a4, 0x01d0, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006,
+	0x01a0, 0x00f6, 0x2079, 0x1800, 0x78a4, 0x8000, 0x78a6, 0x00fe,
+	0x0804, 0xc9bc, 0x2001, 0x0004, 0x0030, 0x2001, 0x0006, 0x0449,
+	0x0020, 0x0018, 0x0010, 0x080c, 0x61b4, 0x080c, 0x8846, 0x080c,
+	0x9e19, 0x080c, 0x894b, 0x0005, 0x2600, 0x0002, 0xca50, 0xca50,
+	0xca50, 0xca50, 0xca50, 0xca52, 0xca50, 0xca50, 0xca50, 0xca50,
+	0xca52, 0xca50, 0xca50, 0xca50, 0xca52, 0xca52, 0xca52, 0xca52,
+	0x080c, 0x0db4, 0x080c, 0x8846, 0x080c, 0x9e19, 0x080c, 0x894b,
+	0x0005, 0x0016, 0x00b6, 0x00d6, 0x6110, 0x2158, 0xb900, 0xd184,
+	0x0138, 0x080c, 0x6188, 0x9006, 0x080c, 0x6174, 0x080c, 0x2ffc,
+	0x00de, 0x00be, 0x001e, 0x0005, 0x6610, 0x2658, 0xb804, 0x9084,
+	0xff00, 0x8007, 0x90b2, 0x000c, 0x1a0c, 0x0db4, 0x91b6, 0x0015,
+	0x1110, 0x003b, 0x0028, 0x91b6, 0x0016, 0x190c, 0x0db4, 0x006b,
+	0x0005, 0xa888, 0xa888, 0xa888, 0xa888, 0xa888, 0xa888, 0xcad4,
+	0xca99, 0xa888, 0xa888, 0xa888, 0xa888, 0xa888, 0xa888, 0xa888,
+	0xa888, 0xa888, 0xa888, 0xcad4, 0xcadb, 0xa888, 0xa888, 0xa888,
+	0xa888, 0x00f6, 0x080c, 0x6553, 0x11d8, 0x080c, 0xc1f9, 0x11c0,
+	0x6010, 0x905d, 0x01a8, 0xb8b0, 0x9005, 0x0190, 0x9006, 0x080c,
+	0x6174, 0x2001, 0x0002, 0x080c, 0x6188, 0x6023, 0x0001, 0x6003,
+	0x0001, 0x6007, 0x0002, 0x080c, 0x8411, 0x080c, 0x894b, 0x00d0,
+	0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x2663, 0x1190,
+	0x080c, 0x6237, 0x0118, 0x080c, 0x9e19, 0x0060, 0xb810, 0x0006,
+	0xb814, 0x0006, 0x080c, 0x5ce4, 0x000e, 0xb816, 0x000e, 0xb812,
+	0x080c, 0x9e19, 0x00fe, 0x0005, 0x6604, 0x96b6, 0x001e, 0x1110,
+	0x080c, 0x9e19, 0x0005, 0x080c, 0xac6c, 0x1148, 0x6003, 0x0001,
+	0x6007, 0x0001, 0x080c, 0x8411, 0x080c, 0x894b, 0x0010, 0x080c,
+	0x9e19, 0x0005, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0db4, 0x080c,
+	0x8846, 0x080c, 0x9e49, 0x080c, 0x894b, 0x0005, 0x9182, 0x0040,
+	0x0002, 0xcb0c, 0xcb0c, 0xcb0c, 0xcb0c, 0xcb0e, 0xcb0c, 0xcb0c,
+	0xcb0c, 0xcb0c, 0xcb0c, 0xcb0c, 0xcb0c, 0xcb0c, 0xcb0c, 0xcb0c,
+	0xcb0c, 0xcb0c, 0xcb0c, 0xcb0c, 0x080c, 0x0db4, 0x0096, 0x00b6,
+	0x00d6, 0x00e6, 0x00f6, 0x0046, 0x0026, 0x6210, 0x2258, 0xb8ac,
+	0x9005, 0x11a8, 0x6106, 0x2071, 0x0260, 0x7444, 0x94a4, 0xff00,
+	0x0904, 0xcb74, 0x080c, 0xd816, 0x1170, 0x9486, 0x2000, 0x1158,
+	0x2009, 0x0001, 0x2011, 0x0200, 0x080c, 0x8207, 0x0020, 0x9026,
+	0x080c, 0xd74b, 0x0c38, 0x080c, 0x0feb, 0x090c, 0x0db4, 0x6003,
+	0x0007, 0xa867, 0x010d, 0x9006, 0xa802, 0xa86a, 0xac8a, 0x2c00,
+	0xa88e, 0x6008, 0xa8e2, 0x6010, 0x2058, 0xb8a0, 0x7130, 0xa97a,
+	0x0016, 0xa876, 0xa87f, 0x0000, 0xa883, 0x0000, 0xa887, 0x0036,
+	0x080c, 0x6885, 0x001e, 0x080c, 0xd816, 0x1904, 0xcbd4, 0x9486,
+	0x2000, 0x1130, 0x2019, 0x0017, 0x080c, 0xd486, 0x0804, 0xcbd4,
+	0x9486, 0x0200, 0x1120, 0x080c, 0xd422, 0x0804, 0xcbd4, 0x9486,
+	0x0400, 0x0120, 0x9486, 0x1000, 0x1904, 0xcbd4, 0x2019, 0x0002,
+	0x080c, 0xd43d, 0x0804, 0xcbd4, 0x2069, 0x1a41, 0x6a00, 0xd284,
+	0x0904, 0xcc3e, 0x9284, 0x0300, 0x1904, 0xcc37, 0x6804, 0x9005,
+	0x0904, 0xcc1f, 0x2d78, 0x6003, 0x0007, 0x080c, 0x1004, 0x0904,
+	0xcbe0, 0x7800, 0xd08c, 0x1118, 0x7804, 0x8001, 0x7806, 0x6017,
+	0x0000, 0x2001, 0x180f, 0x2004, 0xd084, 0x1904, 0xcc42, 0x9006,
+	0xa802, 0xa867, 0x0116, 0xa86a, 0x6008, 0xa8e2, 0x2c00, 0xa87a,
+	0x6010, 0x2058, 0xb8a0, 0x7130, 0xa9b6, 0xa876, 0xb928, 0xa9ba,
+	0xb92c, 0xa9be, 0xb930, 0xa9c2, 0xb934, 0xa9c6, 0xa883, 0x003d,
+	0x7044, 0x9084, 0x0003, 0x9080, 0xcbdc, 0x2005, 0xa87e, 0x20a9,
+	0x000a, 0x2001, 0x0270, 0xaa5c, 0x9290, 0x0021, 0x2009, 0x0205,
+	0x200b, 0x0080, 0x20e1, 0x0000, 0xab60, 0x23e8, 0x2098, 0x22a0,
+	0x4003, 0x200b, 0x0000, 0x2001, 0x027a, 0x200c, 0xa9b2, 0x8000,
+	0x200c, 0xa9ae, 0x080c, 0x6885, 0x002e, 0x004e, 0x00fe, 0x00ee,
+	0x00de, 0x00be, 0x009e, 0x0005, 0x0000, 0x0080, 0x0040, 0x0000,
+	0x2001, 0x1810, 0x2004, 0xd084, 0x0120, 0x080c, 0x0feb, 0x1904,
+	0xcb89, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c,
+	0x83c9, 0x080c, 0x894b, 0x0c00, 0x2069, 0x0260, 0x6848, 0x9084,
+	0xff00, 0x9086, 0x1200, 0x1198, 0x686c, 0x9084, 0x00ff, 0x0016,
+	0x6114, 0x918c, 0xf700, 0x910d, 0x6116, 0x001e, 0x6003, 0x0001,
+	0x6007, 0x0043, 0x080c, 0x83c9, 0x080c, 0x894b, 0x0828, 0x6868,
+	0x602e, 0x686c, 0x6032, 0x6017, 0xf200, 0x6003, 0x0001, 0x6007,
+	0x0041, 0x080c, 0x83c9, 0x080c, 0x894b, 0x0804, 0xcbd4, 0x2001,
+	0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x48d2,
+	0x6017, 0xf300, 0x0010, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007,
+	0x0041, 0x080c, 0x83c9, 0x080c, 0x894b, 0x0804, 0xcbd4, 0x6017,
+	0xf500, 0x0c98, 0x6017, 0xf600, 0x0804, 0xcbf4, 0x6017, 0xf200,
+	0x0804, 0xcbf4, 0xa867, 0x0146, 0xa86b, 0x0000, 0x6008, 0xa886,
+	0x2c00, 0xa87a, 0x7044, 0x9084, 0x0003, 0x9080, 0xcbdc, 0x2005,
+	0xa87e, 0x2928, 0x6010, 0x2058, 0xb8a0, 0xa876, 0xb828, 0xa88a,
+	0xb82c, 0xa88e, 0xb830, 0xa892, 0xb834, 0xa896, 0xa883, 0x003d,
+	0x2009, 0x0205, 0x2104, 0x9085, 0x0080, 0x200a, 0x20e1, 0x0000,
+	0x2011, 0x0210, 0x2214, 0x9294, 0x0fff, 0xaaa2, 0x9282, 0x0111,
+	0x1a0c, 0x0db4, 0x8210, 0x821c, 0x2001, 0x026c, 0x2098, 0xa860,
+	0x20e8, 0xa85c, 0x9080, 0x0029, 0x20a0, 0x2011, 0xccbe, 0x2041,
+	0x0001, 0x223d, 0x9784, 0x00ff, 0x9322, 0x1208, 0x2300, 0x20a8,
+	0x4003, 0x931a, 0x0530, 0x8210, 0xd7fc, 0x1130, 0x8d68, 0x2d0a,
+	0x2001, 0x0260, 0x2098, 0x0c68, 0x2950, 0x080c, 0x1004, 0x0170,
+	0x2900, 0xb002, 0xa867, 0x0147, 0xa86b, 0x0000, 0xa860, 0x20e8,
+	0xa85c, 0x9080, 0x001b, 0x20a0, 0x8840, 0x08d8, 0x2548, 0xa800,
+	0x902d, 0x0118, 0x080c, 0x101d, 0x0cc8, 0x080c, 0x101d, 0x0804,
+	0xcbe0, 0x2548, 0x8847, 0x9885, 0x0046, 0xa866, 0x2009, 0x0205,
+	0x200b, 0x0000, 0x080c, 0xd4b5, 0x0804, 0xcbd4, 0x8010, 0x0004,
+	0x801a, 0x0006, 0x8018, 0x0008, 0x8016, 0x000a, 0x8014, 0x9186,
+	0x0013, 0x1160, 0x6004, 0x908a, 0x0054, 0x1a0c, 0x0db4, 0x9082,
+	0x0040, 0x0a0c, 0x0db4, 0x2008, 0x0804, 0xcd6f, 0x9186, 0x0051,
+	0x0108, 0x00c0, 0x2001, 0x0109, 0x2004, 0xd084, 0x0904, 0xcd20,
+	0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x82b5,
+	0x002e, 0x001e, 0x000e, 0x012e, 0x6000, 0x9086, 0x0002, 0x1580,
+	0x0804, 0xcdb7, 0x9186, 0x0027, 0x0530, 0x9186, 0x0048, 0x0128,
+	0x9186, 0x0014, 0x0500, 0x190c, 0x0db4, 0x2001, 0x0109, 0x2004,
+	0xd084, 0x01f0, 0x00c6, 0x0126, 0x2091, 0x2800, 0x00c6, 0x2061,
+	0x0100, 0x0006, 0x0016, 0x0026, 0x080c, 0x82b5, 0x002e, 0x001e,
+	0x000e, 0x00ce, 0x012e, 0x00ce, 0x6000, 0x9086, 0x0004, 0x190c,
+	0x0db4, 0x0804, 0xce98, 0x6004, 0x9082, 0x0040, 0x2008, 0x001a,
+	0x080c, 0x9eae, 0x0005, 0xcd36, 0xcd38, 0xcd38, 0xcd5f, 0xcd36,
+	0xcd36, 0xcd36, 0xcd36, 0xcd36, 0xcd36, 0xcd36, 0xcd36, 0xcd36,
+	0xcd36, 0xcd36, 0xcd36, 0xcd36, 0xcd36, 0xcd36, 0x080c, 0x0db4,
+	0x080c, 0x8846, 0x080c, 0x894b, 0x0036, 0x0096, 0x6014, 0x904d,
+	0x01d8, 0x080c, 0xbafe, 0x01c0, 0x6003, 0x0002, 0x6010, 0x00b6,
+	0x2058, 0xb800, 0x00be, 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c,
+	0xd4b5, 0x6017, 0x0000, 0x6018, 0x9005, 0x1120, 0x2001, 0x1958,
+	0x2004, 0x601a, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x0096,
+	0x080c, 0x8846, 0x080c, 0x894b, 0x080c, 0xbafe, 0x0120, 0x6014,
+	0x2048, 0x080c, 0x101d, 0x080c, 0x9e49, 0x009e, 0x0005, 0x0002,
+	0xcd83, 0xcd9a, 0xcd85, 0xcdb1, 0xcd83, 0xcd83, 0xcd83, 0xcd83,
+	0xcd83, 0xcd83, 0xcd83, 0xcd83, 0xcd83, 0xcd83, 0xcd83, 0xcd83,
+	0xcd83, 0xcd83, 0xcd83, 0x080c, 0x0db4, 0x0096, 0x080c, 0x8846,
+	0x6014, 0x2048, 0xa87c, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009,
+	0x0043, 0x080c, 0x9e93, 0x0010, 0x6003, 0x0004, 0x080c, 0x894b,
+	0x009e, 0x0005, 0x080c, 0x8846, 0x080c, 0xbafe, 0x0138, 0x6114,
+	0x0096, 0x2148, 0xa97c, 0x009e, 0xd1ec, 0x1138, 0x080c, 0x81dc,
+	0x080c, 0x9e19, 0x080c, 0x894b, 0x0005, 0x080c, 0xd70f, 0x0db0,
+	0x0cc8, 0x080c, 0x8846, 0x2009, 0x0041, 0x0804, 0xcf20, 0x9182,
+	0x0040, 0x0002, 0xcdcd, 0xcdcf, 0xcdcd, 0xcdcd, 0xcdcd, 0xcdcd,
+	0xcdcd, 0xcdcd, 0xcdcd, 0xcdcd, 0xcdcd, 0xcdcd, 0xcdcd, 0xcdcd,
+	0xcdcd, 0xcdcd, 0xcdcd, 0xcdd0, 0xcdcd, 0x080c, 0x0db4, 0x0005,
+	0x00d6, 0x080c, 0x81dc, 0x00de, 0x080c, 0xd767, 0x080c, 0x9e19,
+	0x0005, 0x9182, 0x0040, 0x0002, 0xcdef, 0xcdef, 0xcdef, 0xcdef,
+	0xcdef, 0xcdef, 0xcdef, 0xcdef, 0xcdef, 0xcdf1, 0xce60, 0xcdef,
+	0xcdef, 0xcdef, 0xcdef, 0xce60, 0xcdef, 0xcdef, 0xcdef, 0x080c,
+	0x0db4, 0x2001, 0x0105, 0x2004, 0x9084, 0x1800, 0x01c8, 0x2001,
+	0x0132, 0x200c, 0x2001, 0x0131, 0x2004, 0x9105, 0x1904, 0xce60,
+	0x2009, 0x180c, 0x2104, 0xd0d4, 0x0904, 0xce60, 0xc0d4, 0x200a,
+	0x2009, 0x0105, 0x2104, 0x9084, 0xe7fd, 0x9085, 0x0010, 0x200a,
+	0x2001, 0x1873, 0x2004, 0xd0e4, 0x1528, 0x603b, 0x0000, 0x080c,
+	0x88fb, 0x6014, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0188, 0x908c,
+	0x0003, 0x918e, 0x0002, 0x0508, 0x2001, 0x180c, 0x2004, 0xd0d4,
+	0x11e0, 0x080c, 0x8a26, 0x2009, 0x0041, 0x009e, 0x0804, 0xcf20,
+	0x080c, 0x8a26, 0x6003, 0x0007, 0x601b, 0x0000, 0x080c, 0x81dc,
+	0x009e, 0x0005, 0x2001, 0x0100, 0x2004, 0x9082, 0x0005, 0x0aa8,
+	0x2001, 0x011f, 0x2004, 0x603a, 0x0890, 0x2001, 0x180c, 0x200c,
+	0xc1d4, 0x2102, 0xd1cc, 0x0110, 0x080c, 0x2a77, 0x080c, 0x8a26,
+	0x6014, 0x2048, 0xa97c, 0xd1ec, 0x1130, 0x080c, 0x81dc, 0x080c,
+	0x9e19, 0x009e, 0x0005, 0x080c, 0xd70f, 0x0db8, 0x009e, 0x0005,
+	0x2001, 0x180c, 0x200c, 0xc1d4, 0x2102, 0x0036, 0x080c, 0x88fb,
+	0x080c, 0x8a26, 0x6014, 0x0096, 0x2048, 0x6010, 0x00b6, 0x2058,
+	0xb800, 0x00be, 0xd0bc, 0x0188, 0xa87c, 0x9084, 0x0003, 0x9086,
+	0x0002, 0x0140, 0xa8ac, 0x6330, 0x931a, 0x6332, 0xa8b0, 0x632c,
+	0x931b, 0x632e, 0x6003, 0x0002, 0x0080, 0x2019, 0x0004, 0x080c,
+	0xd4b5, 0x6018, 0x9005, 0x1128, 0x2001, 0x1958, 0x2004, 0x8003,
+	0x601a, 0x6017, 0x0000, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005,
+	0x9182, 0x0040, 0x0002, 0xceaf, 0xceaf, 0xceaf, 0xceaf, 0xceaf,
+	0xceaf, 0xceaf, 0xceaf, 0xceb1, 0xceaf, 0xceaf, 0xceaf, 0xceaf,
+	0xceaf, 0xceaf, 0xceaf, 0xceaf, 0xceaf, 0xceaf, 0xcefc, 0x080c,
+	0x0db4, 0x6014, 0x0096, 0x2048, 0xa834, 0xaa38, 0x6110, 0x00b6,
+	0x2158, 0xb900, 0x00be, 0xd1bc, 0x1190, 0x920d, 0x1518, 0xa87c,
+	0xd0fc, 0x0128, 0x2009, 0x0041, 0x009e, 0x0804, 0xcf20, 0x6003,
+	0x0007, 0x601b, 0x0000, 0x080c, 0x81dc, 0x009e, 0x0005, 0x6124,
+	0xd1f4, 0x1d58, 0x0006, 0x0046, 0xacac, 0x9422, 0xa9b0, 0x2200,
+	0x910b, 0x6030, 0x9420, 0x6432, 0x602c, 0x9109, 0x612e, 0x004e,
+	0x000e, 0x08d8, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1bc,
+	0x1178, 0x2009, 0x180e, 0x210c, 0xd19c, 0x0118, 0x6003, 0x0007,
+	0x0010, 0x6003, 0x0006, 0x00e9, 0x080c, 0x81de, 0x009e, 0x0005,
+	0x6003, 0x0002, 0x009e, 0x0005, 0x6024, 0xd0f4, 0x0128, 0x080c,
+	0x150f, 0x1904, 0xceb1, 0x0005, 0x6014, 0x0096, 0x2048, 0xa834,
+	0xa938, 0x009e, 0x9105, 0x1120, 0x080c, 0x150f, 0x1904, 0xceb1,
+	0x0005, 0xd2fc, 0x0140, 0x8002, 0x8000, 0x8212, 0x9291, 0x0000,
+	0x2009, 0x0009, 0x0010, 0x2009, 0x0015, 0xaa9a, 0xa896, 0x0005,
+	0x9182, 0x0040, 0x0208, 0x0062, 0x9186, 0x0013, 0x0120, 0x9186,
+	0x0014, 0x190c, 0x0db4, 0x6024, 0xd0dc, 0x090c, 0x0db4, 0x0005,
+	0xcf43, 0xcf4f, 0xcf5b, 0xcf67, 0xcf43, 0xcf43, 0xcf43, 0xcf43,
+	0xcf4a, 0xcf45, 0xcf45, 0xcf43, 0xcf43, 0xcf43, 0xcf43, 0xcf45,
+	0xcf43, 0xcf45, 0xcf43, 0x080c, 0x0db4, 0x6024, 0xd0dc, 0x090c,
+	0x0db4, 0x0005, 0x6014, 0x9005, 0x190c, 0x0db4, 0x0005, 0x6003,
+	0x0001, 0x6106, 0x080c, 0x83c9, 0x0126, 0x2091, 0x8000, 0x080c,
+	0x894b, 0x012e, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x83c9,
+	0x0126, 0x2091, 0x8000, 0x080c, 0x894b, 0x012e, 0x0005, 0x6003,
+	0x0003, 0x6106, 0x2c10, 0x080c, 0x1a5c, 0x0126, 0x2091, 0x8000,
+	0x080c, 0x842e, 0x080c, 0x8a26, 0x012e, 0x0005, 0x0126, 0x2091,
+	0x8000, 0x0036, 0x0096, 0x9182, 0x0040, 0x0023, 0x009e, 0x003e,
+	0x012e, 0x0005, 0xcf92, 0xcf94, 0xcfa6, 0xcfc0, 0xcf92, 0xcf92,
+	0xcf92, 0xcf92, 0xcf92, 0xcf92, 0xcf92, 0xcf92, 0xcf92, 0xcf92,
+	0xcf92, 0xcf92, 0x080c, 0x0db4, 0x6014, 0x2048, 0xa87c, 0xd0fc,
+	0x01f8, 0x909c, 0x0003, 0x939e, 0x0003, 0x01d0, 0x6003, 0x0001,
+	0x6106, 0x080c, 0x83c9, 0x080c, 0x894b, 0x0470, 0x6014, 0x2048,
+	0xa87c, 0xd0fc, 0x0168, 0x909c, 0x0003, 0x939e, 0x0003, 0x0140,
+	0x6003, 0x0001, 0x6106, 0x080c, 0x83c9, 0x080c, 0x894b, 0x00e0,
+	0x901e, 0x6316, 0x631a, 0x2019, 0x0004, 0x080c, 0xd4b5, 0x00a0,
+	0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0d98, 0x909c, 0x0003, 0x939e,
+	0x0003, 0x0d70, 0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, 0x1a5c,
+	0x080c, 0x842e, 0x080c, 0x8a26, 0x0005, 0x080c, 0x8846, 0x6114,
+	0x81ff, 0x0158, 0x0096, 0x2148, 0x080c, 0xd7b3, 0x0036, 0x2019,
+	0x0029, 0x080c, 0xd4b5, 0x003e, 0x009e, 0x080c, 0x9e49, 0x080c,
+	0x894b, 0x0005, 0x080c, 0x88fb, 0x6114, 0x81ff, 0x0158, 0x0096,
+	0x2148, 0x080c, 0xd7b3, 0x0036, 0x2019, 0x0029, 0x080c, 0xd4b5,
+	0x003e, 0x009e, 0x080c, 0x9e49, 0x080c, 0x8a26, 0x0005, 0x9182,
+	0x0085, 0x0002, 0xd011, 0xd00f, 0xd00f, 0xd01d, 0xd00f, 0xd00f,
+	0xd00f, 0xd00f, 0xd00f, 0xd00f, 0xd00f, 0xd00f, 0xd00f, 0x080c,
+	0x0db4, 0x6003, 0x000b, 0x6106, 0x080c, 0x83c9, 0x0126, 0x2091,
+	0x8000, 0x080c, 0x894b, 0x012e, 0x0005, 0x0026, 0x00e6, 0x080c,
+	0xd706, 0x0118, 0x080c, 0x9e19, 0x0450, 0x2071, 0x0260, 0x7224,
+	0x6216, 0x2001, 0x180e, 0x2004, 0xd0e4, 0x0150, 0x6010, 0x00b6,
+	0x2058, 0xbca0, 0x00be, 0x2c00, 0x2011, 0x014e, 0x080c, 0xa139,
+	0x7220, 0x080c, 0xd35b, 0x0118, 0x6007, 0x0086, 0x0040, 0x6007,
+	0x0087, 0x7224, 0x9296, 0xffff, 0x1110, 0x6007, 0x0086, 0x6003,
+	0x0001, 0x080c, 0x83c9, 0x080c, 0x894b, 0x080c, 0x8a26, 0x00ee,
+	0x002e, 0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085,
+	0x0a0c, 0x0db4, 0x908a, 0x0092, 0x1a0c, 0x0db4, 0x9082, 0x0085,
+	0x00a2, 0x9186, 0x0027, 0x0130, 0x9186, 0x0014, 0x0118, 0x080c,
+	0x9eae, 0x0050, 0x2001, 0x0007, 0x080c, 0x61b4, 0x080c, 0x8846,
+	0x080c, 0x9e49, 0x080c, 0x894b, 0x0005, 0xd082, 0xd084, 0xd084,
+	0xd082, 0xd082, 0xd082, 0xd082, 0xd082, 0xd082, 0xd082, 0xd082,
+	0xd082, 0xd082, 0x080c, 0x0db4, 0x080c, 0x8846, 0x080c, 0x9e49,
+	0x080c, 0x894b, 0x0005, 0x9182, 0x0085, 0x0a0c, 0x0db4, 0x9182,
+	0x0092, 0x1a0c, 0x0db4, 0x9182, 0x0085, 0x0002, 0xd0a3, 0xd0a3,
+	0xd0a3, 0xd0a5, 0xd0a3, 0xd0a3, 0xd0a3, 0xd0a3, 0xd0a3, 0xd0a3,
+	0xd0a3, 0xd0a3, 0xd0a3, 0x080c, 0x0db4, 0x0005, 0x9186, 0x0013,
+	0x0148, 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c,
+	0x9eae, 0x0030, 0x080c, 0x8846, 0x080c, 0x9e49, 0x080c, 0x894b,
+	0x0005, 0x0036, 0x080c, 0xd767, 0x6043, 0x0000, 0x2019, 0x000b,
+	0x0031, 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x0126,
+	0x0036, 0x2091, 0x8000, 0x0086, 0x2c40, 0x0096, 0x904e, 0x080c,
+	0x97a1, 0x009e, 0x008e, 0x1550, 0x0076, 0x2c38, 0x080c, 0x984c,
+	0x007e, 0x1520, 0x6000, 0x9086, 0x0000, 0x0500, 0x6020, 0x9086,
+	0x0007, 0x01e0, 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xd767,
+	0x080c, 0xc211, 0x080c, 0x190d, 0x6023, 0x0007, 0x6014, 0x2048,
+	0x080c, 0xbafe, 0x0110, 0x080c, 0xd4b5, 0x009e, 0x6017, 0x0000,
+	0x080c, 0xd767, 0x6023, 0x0007, 0x080c, 0xc211, 0x003e, 0x012e,
+	0x0005, 0x00f6, 0x00c6, 0x00b6, 0x0036, 0x0156, 0x2079, 0x0260,
+	0x7938, 0x783c, 0x080c, 0x2663, 0x15b8, 0x0016, 0x00c6, 0x080c,
+	0x6237, 0x1580, 0x001e, 0x00c6, 0x2160, 0x080c, 0xc20e, 0x00ce,
+	0x002e, 0x0026, 0x0016, 0x2019, 0x0029, 0x080c, 0x990d, 0x080c,
+	0x8549, 0x0076, 0x903e, 0x080c, 0x8441, 0x007e, 0x001e, 0x0076,
+	0x903e, 0x080c, 0xd27b, 0x007e, 0x0026, 0xba04, 0x9294, 0xff00,
+	0x8217, 0x9286, 0x0006, 0x0118, 0x9286, 0x0004, 0x1118, 0xbaa0,
+	0x080c, 0x3090, 0x002e, 0x001e, 0x080c, 0x5ce4, 0xbe12, 0xbd16,
+	0x9006, 0x0010, 0x00ce, 0x001e, 0x015e, 0x003e, 0x00be, 0x00ce,
+	0x00fe, 0x0005, 0x00c6, 0x00d6, 0x00b6, 0x0016, 0x2009, 0x1823,
+	0x2104, 0x9086, 0x0074, 0x1904, 0xd1a3, 0x2069, 0x0260, 0x6944,
+	0x9182, 0x0100, 0x06e0, 0x6940, 0x9184, 0x8000, 0x0904, 0xd1a0,
+	0x2001, 0x194d, 0x2004, 0x9005, 0x1140, 0x6010, 0x2058, 0xb8b0,
+	0x9005, 0x0118, 0x9184, 0x0800, 0x0598, 0x6948, 0x918a, 0x0001,
+	0x0648, 0x080c, 0xd81b, 0x0118, 0x6978, 0xd1fc, 0x11b8, 0x2009,
+	0x0205, 0x200b, 0x0001, 0x693c, 0x81ff, 0x1198, 0x6944, 0x9182,
+	0x0100, 0x02a8, 0x6940, 0x81ff, 0x1178, 0x6948, 0x918a, 0x0001,
+	0x0288, 0x6950, 0x918a, 0x0001, 0x0298, 0x00d0, 0x6017, 0x0100,
+	0x00a0, 0x6017, 0x0300, 0x0088, 0x6017, 0x0500, 0x0070, 0x6017,
+	0x0700, 0x0058, 0x6017, 0x0900, 0x0040, 0x6017, 0x0b00, 0x0028,
+	0x6017, 0x0f00, 0x0010, 0x6017, 0x2d00, 0x9085, 0x0001, 0x0008,
+	0x9006, 0x001e, 0x00be, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00b6,
+	0x0026, 0x0036, 0x0156, 0x6210, 0x2258, 0xbb04, 0x9394, 0x00ff,
+	0x9286, 0x0006, 0x0180, 0x9286, 0x0004, 0x0168, 0x9394, 0xff00,
+	0x8217, 0x9286, 0x0006, 0x0138, 0x9286, 0x0004, 0x0120, 0x080c,
+	0x6246, 0x0804, 0xd20a, 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096,
+	0x2b48, 0x2019, 0x000a, 0x080c, 0xadf4, 0x009e, 0x15a0, 0x2011,
 	0x027a, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c,
-	0xaaa3, 0x009e, 0x015e, 0x003e, 0x002e, 0x001e, 0x000e, 0x00be,
-	0x0005, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x0056, 0x0046,
-	0x0026, 0x0126, 0x2091, 0x8000, 0x2740, 0x2029, 0x19bf, 0x252c,
-	0x2021, 0x19c5, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x7650,
-	0x7070, 0x81ff, 0x0150, 0x0006, 0x9186, 0x1a77, 0x000e, 0x0128,
-	0x8001, 0x9602, 0x1a04, 0xcf92, 0x0018, 0x9606, 0x0904, 0xcf92,
-	0x2100, 0x9c06, 0x0904, 0xcf89, 0x080c, 0xd1c4, 0x1904, 0xcf89,
-	0x080c, 0xd4b1, 0x0904, 0xcf89, 0x080c, 0xd1b4, 0x0904, 0xcf89,
-	0x6720, 0x9786, 0x0001, 0x1148, 0x080c, 0x2fcf, 0x0904, 0xcfad,
-	0x6004, 0x9086, 0x0000, 0x1904, 0xcfad, 0x9786, 0x0004, 0x0904,
-	0xcfad, 0x9786, 0x0007, 0x0904, 0xcf89, 0x2500, 0x9c06, 0x0904,
-	0xcf89, 0x2400, 0x9c06, 0x05e8, 0x88ff, 0x0118, 0x6054, 0x9906,
-	0x15c0, 0x0096, 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c,
-	0x185b, 0x001e, 0x9786, 0x000a, 0x0148, 0x080c, 0xb992, 0x1130,
-	0x080c, 0xa456, 0x009e, 0x080c, 0x9af8, 0x0418, 0x6014, 0x2048,
-	0x080c, 0xb793, 0x01d8, 0x9786, 0x0003, 0x1570, 0xa867, 0x0103,
-	0xab7a, 0xa877, 0x0000, 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878,
-	0x2048, 0x080c, 0x0f9e, 0x009e, 0x080c, 0xd42c, 0x0016, 0x080c,
-	0xba7b, 0x080c, 0x65e5, 0x001e, 0x080c, 0xb975, 0x009e, 0x080c,
-	0x9af8, 0x9ce0, 0x0018, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1210,
-	0x0804, 0xcf0d, 0x012e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e,
-	0x008e, 0x00ce, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1150, 0x9386,
-	0x0005, 0x0128, 0x080c, 0xd42c, 0x080c, 0xd133, 0x08f8, 0x009e,
-	0x0c00, 0x9786, 0x000a, 0x0920, 0x0808, 0x81ff, 0x09d0, 0x9180,
-	0x0001, 0x2004, 0x9086, 0x0018, 0x0130, 0x9180, 0x0001, 0x2004,
-	0x9086, 0x002d, 0x1970, 0x6000, 0x9086, 0x0002, 0x1950, 0x080c,
-	0xb981, 0x0130, 0x080c, 0xb992, 0x1920, 0x080c, 0xa456, 0x0038,
-	0x080c, 0x2ea4, 0x080c, 0xb992, 0x1110, 0x080c, 0xa456, 0x080c,
-	0x9af8, 0x0804, 0xcf89, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039,
-	0x0005, 0x00c6, 0x00e6, 0x0016, 0x2c08, 0x2170, 0x9006, 0x080c,
-	0xd15a, 0x001e, 0x0120, 0x6020, 0x9084, 0x000f, 0x001b, 0x00ee,
-	0x00ce, 0x0005, 0xcff8, 0xcff8, 0xcff8, 0xcff8, 0xcff8, 0xcff8,
-	0xcffa, 0xcff8, 0xcff8, 0xcff8, 0xcff8, 0x9af8, 0x9af8, 0xcff8,
-	0x9006, 0x0005, 0x0036, 0x0046, 0x0016, 0x7010, 0x00b6, 0x2058,
-	0xbca0, 0x00be, 0x2c00, 0x2009, 0x0020, 0x080c, 0xd188, 0x001e,
-	0x004e, 0x2019, 0x0002, 0x080c, 0xcd45, 0x003e, 0x9085, 0x0001,
-	0x0005, 0x0096, 0x080c, 0xb793, 0x0140, 0x6014, 0x904d, 0x080c,
-	0xb3e0, 0x687b, 0x0005, 0x080c, 0x65f2, 0x009e, 0x080c, 0x9af8,
-	0x9085, 0x0001, 0x0005, 0x2001, 0x0001, 0x080c, 0x5f2e, 0x0156,
-	0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011,
-	0x0276, 0x080c, 0xaa8f, 0x003e, 0x002e, 0x001e, 0x015e, 0x9005,
-	0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x00b6,
-	0x0126, 0x2091, 0x8000, 0x2740, 0x2061, 0x1cd0, 0x2079, 0x0001,
-	0x8fff, 0x0904, 0xd093, 0x2071, 0x1800, 0x7650, 0x7070, 0x8001,
-	0x9602, 0x1a04, 0xd093, 0x88ff, 0x0120, 0x2800, 0x9c06, 0x1590,
-	0x2078, 0x080c, 0xd1b4, 0x0570, 0x2400, 0x9c06, 0x0558, 0x6720,
-	0x9786, 0x0006, 0x1538, 0x9786, 0x0007, 0x0520, 0x88ff, 0x1140,
-	0x6010, 0x9b06, 0x11f8, 0x85ff, 0x0118, 0x6054, 0x9106, 0x11d0,
-	0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xd3e0, 0x080c, 0xbe9e,
-	0x080c, 0x185b, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, 0xb793,
-	0x0120, 0x0046, 0x080c, 0xd133, 0x004e, 0x009e, 0x080c, 0x9af8,
-	0x88ff, 0x1198, 0x9ce0, 0x0018, 0x2001, 0x1819, 0x2004, 0x9c02,
-	0x1210, 0x0804, 0xd048, 0x9006, 0x012e, 0x00be, 0x006e, 0x007e,
-	0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x98c5, 0x0001, 0x0ca0,
-	0x00b6, 0x0076, 0x0056, 0x0086, 0x9046, 0x2029, 0x0001, 0x2c20,
-	0x2019, 0x0002, 0x6210, 0x2258, 0x0096, 0x904e, 0x080c, 0x9450,
-	0x009e, 0x008e, 0x903e, 0x080c, 0x94fb, 0x080c, 0xd039, 0x005e,
-	0x007e, 0x00be, 0x0005, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6,
-	0x0156, 0x2c20, 0x2128, 0x20a9, 0x007f, 0x900e, 0x0016, 0x0036,
-	0x080c, 0x5ff1, 0x1190, 0x0056, 0x0086, 0x9046, 0x2508, 0x2029,
-	0x0001, 0x0096, 0x904e, 0x080c, 0x9450, 0x009e, 0x008e, 0x903e,
-	0x080c, 0x94fb, 0x080c, 0xd039, 0x005e, 0x003e, 0x001e, 0x8108,
-	0x1f04, 0xd0c6, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be,
-	0x0005, 0x00b6, 0x0076, 0x0056, 0x6210, 0x2258, 0x0086, 0x9046,
-	0x2029, 0x0001, 0x2019, 0x0048, 0x0096, 0x904e, 0x080c, 0x9450,
-	0x009e, 0x008e, 0x903e, 0x080c, 0x94fb, 0x2c20, 0x080c, 0xd039,
-	0x005e, 0x007e, 0x00be, 0x0005, 0x00b6, 0x0046, 0x0056, 0x0076,
-	0x00c6, 0x0156, 0x2c20, 0x20a9, 0x0800, 0x900e, 0x0016, 0x0036,
-	0x080c, 0x5ff1, 0x11a0, 0x0086, 0x9046, 0x2828, 0x0046, 0x2021,
-	0x0001, 0x080c, 0xd3c4, 0x004e, 0x0096, 0x904e, 0x080c, 0x9450,
-	0x009e, 0x008e, 0x903e, 0x080c, 0x94fb, 0x080c, 0xd039, 0x003e,
-	0x001e, 0x8108, 0x1f04, 0xd10e, 0x015e, 0x00ce, 0x007e, 0x005e,
-	0x004e, 0x00be, 0x0005, 0x0016, 0x00f6, 0x080c, 0xb791, 0x0198,
-	0xa864, 0x9084, 0x00ff, 0x9086, 0x0046, 0x0180, 0xa800, 0x907d,
-	0x0138, 0xa803, 0x0000, 0xab82, 0x080c, 0x65f2, 0x2f48, 0x0cb0,
-	0xab82, 0x080c, 0x65f2, 0x00fe, 0x001e, 0x0005, 0xa800, 0x907d,
-	0x0130, 0xa803, 0x0000, 0x080c, 0x65f2, 0x2f48, 0x0cb8, 0x080c,
-	0x65f2, 0x0c88, 0x00e6, 0x0046, 0x0036, 0x2061, 0x1cd0, 0x9005,
-	0x1138, 0x2071, 0x1800, 0x7450, 0x7070, 0x8001, 0x9402, 0x12d8,
-	0x2100, 0x9c06, 0x0168, 0x6000, 0x9086, 0x0000, 0x0148, 0x6008,
-	0x9206, 0x1130, 0x6010, 0x91a0, 0x0004, 0x2424, 0x9406, 0x0140,
-	0x9ce0, 0x0018, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1220, 0x0c40,
-	0x9085, 0x0001, 0x0008, 0x9006, 0x003e, 0x004e, 0x00ee, 0x0005,
-	0x0096, 0x0006, 0x080c, 0x0fec, 0x000e, 0x090c, 0x0db4, 0xa867,
-	0x010d, 0xa88e, 0x0026, 0x2010, 0x080c, 0xb781, 0x2001, 0x0000,
-	0x0120, 0x2200, 0x9080, 0x0015, 0x2004, 0x002e, 0xa87a, 0xa986,
-	0xac76, 0xa87f, 0x0000, 0x2001, 0x195d, 0x2004, 0xa882, 0x9006,
-	0xa8e2, 0xa802, 0xa86a, 0xa88a, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x65f2, 0x012e, 0x009e, 0x0005, 0x6700, 0x9786, 0x0000, 0x0158,
-	0x9786, 0x0001, 0x0140, 0x9786, 0x000a, 0x0128, 0x9786, 0x0009,
-	0x0110, 0x9085, 0x0001, 0x0005, 0x00e6, 0x6010, 0x9075, 0x0138,
-	0x00b6, 0x2058, 0xb8a0, 0x00be, 0x9206, 0x00ee, 0x0005, 0x9085,
-	0x0001, 0x0cd8, 0x0016, 0x6004, 0x908e, 0x001e, 0x11a0, 0x8007,
-	0x6134, 0x918c, 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, 0x6003,
-	0x000b, 0x6023, 0x0005, 0x2001, 0x1956, 0x2004, 0x601a, 0x080c,
-	0x810c, 0x080c, 0x868e, 0x001e, 0x0005, 0xa001, 0xa001, 0x0005,
-	0x6024, 0xd0e4, 0x0158, 0xd0cc, 0x0118, 0x080c, 0xbabf, 0x0030,
-	0x080c, 0xd3e0, 0x080c, 0x7f1f, 0x080c, 0x9ac8, 0x0005, 0x9280,
-	0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xd213, 0xd213, 0xd213,
-	0xd215, 0xd213, 0xd215, 0xd215, 0xd213, 0xd215, 0xd213, 0xd213,
-	0xd213, 0xd213, 0xd213, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005,
-	0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xd22c, 0xd22c,
-	0xd22c, 0xd22c, 0xd22c, 0xd22c, 0xd239, 0xd22c, 0xd22c, 0xd22c,
-	0xd22c, 0xd22c, 0xd22c, 0xd22c, 0x6007, 0x003b, 0x602f, 0x0009,
-	0x6017, 0x2a00, 0x6003, 0x0001, 0x080c, 0x810c, 0x080c, 0x868e,
-	0x0005, 0x0096, 0x00c6, 0x2260, 0x080c, 0xd3e0, 0x6043, 0x0000,
-	0x6024, 0xc0f4, 0xc0e4, 0x6026, 0x603b, 0x0000, 0x00ce, 0x00d6,
-	0x2268, 0x9186, 0x0007, 0x1904, 0xd292, 0x6814, 0x9005, 0x0138,
-	0x2048, 0xa87c, 0xd0fc, 0x1118, 0x00de, 0x009e, 0x08a8, 0x6007,
-	0x003a, 0x6003, 0x0001, 0x080c, 0x810c, 0x080c, 0x868e, 0x00c6,
-	0x2d60, 0x6100, 0x9186, 0x0002, 0x1904, 0xd309, 0x6014, 0x9005,
-	0x1138, 0x6000, 0x9086, 0x0007, 0x190c, 0x0db4, 0x0804, 0xd309,
-	0x2048, 0x080c, 0xb793, 0x1130, 0x0028, 0x2048, 0xa800, 0x9005,
-	0x1de0, 0x2900, 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002,
-	0x1168, 0xa87c, 0xc0dc, 0xc0f4, 0xa87e, 0xa880, 0xc0fc, 0xa882,
-	0x2009, 0x0043, 0x080c, 0xcb9e, 0x0804, 0xd309, 0x2009, 0x0041,
-	0x0804, 0xd303, 0x9186, 0x0005, 0x15a0, 0x6814, 0x2048, 0xa87c,
-	0xd0bc, 0x1120, 0x00de, 0x009e, 0x0804, 0xd22c, 0xd0b4, 0x0128,
-	0xd0fc, 0x090c, 0x0db4, 0x0804, 0xd24d, 0x6007, 0x003a, 0x6003,
-	0x0001, 0x080c, 0x810c, 0x080c, 0x868e, 0x00c6, 0x2d60, 0x6100,
-	0x9186, 0x0002, 0x0120, 0x9186, 0x0004, 0x1904, 0xd309, 0x6814,
-	0x2048, 0xa97c, 0xc1f4, 0xc1dc, 0xa97e, 0xa980, 0xc1fc, 0xc1bc,
-	0xa982, 0x00f6, 0x2c78, 0x080c, 0x15ad, 0x00fe, 0x2009, 0x0042,
-	0x04d0, 0x0036, 0x080c, 0x0fec, 0x090c, 0x0db4, 0xa867, 0x010d,
-	0x9006, 0xa802, 0xa86a, 0xa88a, 0x2d18, 0xab8e, 0xa887, 0x0045,
-	0x2c00, 0xa892, 0x6038, 0xa8a2, 0x2360, 0x6024, 0xc0dd, 0x6026,
-	0x6010, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x2004, 0x6354, 0xab7a,
-	0xa876, 0x9006, 0xa87e, 0xa882, 0xad9a, 0xae96, 0xa89f, 0x0001,
-	0x080c, 0x65f2, 0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xcd45,
-	0x2d00, 0x600a, 0x6023, 0x0006, 0x6003, 0x0007, 0x901e, 0x631a,
-	0x6342, 0x003e, 0x0038, 0x6043, 0x0000, 0x6003, 0x0007, 0x080c,
-	0xcb9e, 0x00ce, 0x00de, 0x009e, 0x0005, 0x9186, 0x0013, 0x1128,
-	0x6004, 0x9082, 0x0085, 0x2008, 0x00c2, 0x9186, 0x0027, 0x1178,
-	0x080c, 0x8589, 0x0036, 0x0096, 0x6014, 0x2048, 0x2019, 0x0004,
-	0x080c, 0xd133, 0x009e, 0x003e, 0x080c, 0x868e, 0x0005, 0x9186,
-	0x0014, 0x0d70, 0x080c, 0x9b5d, 0x0005, 0xd33c, 0xd33a, 0xd33a,
-	0xd33a, 0xd33a, 0xd33a, 0xd33c, 0xd33a, 0xd33a, 0xd33a, 0xd33a,
-	0xd33a, 0xd33a, 0x080c, 0x0db4, 0x080c, 0x8589, 0x6003, 0x000c,
-	0x080c, 0x868e, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085,
-	0x0208, 0x001a, 0x080c, 0x9b5d, 0x0005, 0xd35a, 0xd35a, 0xd35a,
-	0xd35a, 0xd35c, 0xd37c, 0xd35a, 0xd35a, 0xd35a, 0xd35a, 0xd35a,
-	0xd35a, 0xd35a, 0x080c, 0x0db4, 0x00d6, 0x2c68, 0x080c, 0x9a72,
-	0x01b0, 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0x026e, 0x210c,
-	0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x600b, 0xffff, 0x6910,
-	0x6112, 0x6023, 0x0004, 0x080c, 0x810c, 0x080c, 0x868e, 0x2d60,
-	0x080c, 0x9ac8, 0x00de, 0x0005, 0x080c, 0x9ac8, 0x0005, 0x00e6,
-	0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ec, 0x00ee, 0x0005,
-	0x2009, 0x1873, 0x210c, 0xd1ec, 0x05b0, 0x6003, 0x0002, 0x6024,
-	0xc0e5, 0x6026, 0xd0cc, 0x0150, 0x2001, 0x1957, 0x2004, 0x6042,
-	0x2009, 0x1873, 0x210c, 0xd1f4, 0x1520, 0x00a0, 0x2009, 0x1873,
-	0x210c, 0xd1f4, 0x0128, 0x6024, 0xc0e4, 0x6026, 0x9006, 0x00d8,
-	0x2001, 0x1957, 0x200c, 0x2001, 0x1955, 0x2004, 0x9100, 0x9080,
-	0x000a, 0x6042, 0x6010, 0x00b6, 0x2058, 0xb8ac, 0x00be, 0x0008,
-	0x2104, 0x9005, 0x0118, 0x9088, 0x0003, 0x0cd0, 0x2c0a, 0x600f,
-	0x0000, 0x9085, 0x0001, 0x0005, 0x0016, 0x00c6, 0x00e6, 0x6154,
-	0xb8ac, 0x2060, 0x8cff, 0x0180, 0x84ff, 0x1118, 0x6054, 0x9106,
-	0x1138, 0x600c, 0x2072, 0x080c, 0x7f1f, 0x080c, 0x9ac8, 0x0010,
-	0x9cf0, 0x0003, 0x2e64, 0x0c70, 0x00ee, 0x00ce, 0x001e, 0x0005,
-	0x00d6, 0x00b6, 0x6010, 0x2058, 0xb8ac, 0x2068, 0x9005, 0x0130,
-	0x9c06, 0x0110, 0x680c, 0x0cd0, 0x600c, 0x680e, 0x00be, 0x00de,
-	0x0005, 0x0026, 0x0036, 0x0156, 0x2011, 0x182b, 0x2204, 0x9084,
-	0x00ff, 0x2019, 0x026e, 0x2334, 0x9636, 0x1508, 0x8318, 0x2334,
-	0x2204, 0x9084, 0xff00, 0x9636, 0x11d0, 0x2011, 0x0270, 0x20a9,
-	0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xaaa3,
-	0x009e, 0x1168, 0x2011, 0x0274, 0x20a9, 0x0004, 0x6010, 0x0096,
-	0x2048, 0x2019, 0x0006, 0x080c, 0xaaa3, 0x009e, 0x1100, 0x015e,
-	0x003e, 0x002e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5a27,
-	0x080c, 0x2c63, 0x00ee, 0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058,
-	0xb800, 0x00be, 0xd0fc, 0x0108, 0x0011, 0x00ee, 0x0005, 0xa880,
-	0xc0e5, 0xa882, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066,
-	0x0056, 0x0046, 0x0026, 0x0016, 0x0126, 0x2091, 0x8000, 0x2029,
-	0x19bf, 0x252c, 0x2021, 0x19c5, 0x2424, 0x2061, 0x1cd0, 0x2071,
-	0x1800, 0x7650, 0x7070, 0x9606, 0x0578, 0x6720, 0x9786, 0x0001,
-	0x0118, 0x9786, 0x0008, 0x1500, 0x2500, 0x9c06, 0x01e8, 0x2400,
-	0x9c06, 0x01d0, 0x080c, 0xd1b4, 0x01b8, 0x080c, 0xd1c4, 0x11a0,
-	0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x185b, 0x001e,
-	0x080c, 0xb981, 0x1110, 0x080c, 0x2ea4, 0x080c, 0xb992, 0x1110,
-	0x080c, 0xa456, 0x080c, 0x9af8, 0x9ce0, 0x0018, 0x2001, 0x1819,
-	0x2004, 0x9c02, 0x1208, 0x0858, 0x012e, 0x001e, 0x002e, 0x004e,
-	0x005e, 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x2001,
-	0x1810, 0x2004, 0xd0dc, 0x0005, 0x0006, 0x2001, 0x1836, 0x2004,
-	0xd09c, 0x000e, 0x0005, 0x0006, 0x0036, 0x0046, 0x080c, 0xbe86,
-	0x0168, 0x2019, 0xffff, 0x9005, 0x0128, 0x6010, 0x00b6, 0x2058,
-	0xbba0, 0x00be, 0x2021, 0x0004, 0x080c, 0x4856, 0x004e, 0x003e,
-	0x000e, 0x6004, 0x9086, 0x0001, 0x1128, 0x080c, 0x95bc, 0x080c,
-	0x9af8, 0x9006, 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091,
-	0x8000, 0x2071, 0x1840, 0xd5a4, 0x0118, 0x7034, 0x8000, 0x7036,
-	0xd5b4, 0x0118, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0178, 0x2500,
-	0x9084, 0x0007, 0x908e, 0x0003, 0x0148, 0x908e, 0x0004, 0x0130,
-	0x908e, 0x0005, 0x0118, 0x2071, 0x184a, 0x0089, 0x001e, 0x00ee,
-	0x000e, 0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000,
-	0x2071, 0x1842, 0x0021, 0x00ee, 0x000e, 0x012e, 0x0005, 0x2e04,
-	0x8000, 0x2072, 0x1220, 0x8e70, 0x2e04, 0x8000, 0x2072, 0x0005,
-	0x00e6, 0x2071, 0x1840, 0x0c99, 0x00ee, 0x0005, 0x00e6, 0x2071,
-	0x1844, 0x0c69, 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091,
-	0x8000, 0x2071, 0x1840, 0x7044, 0x8000, 0x7046, 0x00ee, 0x000e,
-	0x012e, 0x0005, 0x0003, 0x000b, 0x04a6, 0x0000, 0xc000, 0x0001,
-	0x8064, 0x0008, 0x0010, 0x0000, 0x8066, 0x0000, 0x0101, 0x0008,
-	0x4407, 0x0003, 0x8060, 0x0000, 0x0400, 0x0000, 0x580d, 0x000b,
-	0x798e, 0x0003, 0x50db, 0x000b, 0x4c0a, 0x0003, 0xbac0, 0x0009,
-	0x008a, 0x0000, 0x0c0a, 0x000b, 0x15fe, 0x0008, 0x340a, 0x0003,
-	0xc4c0, 0x0009, 0x7000, 0x0000, 0xffa0, 0x0001, 0x2000, 0x0000,
-	0x1627, 0x0003, 0x808c, 0x0008, 0x0001, 0x0000, 0x0000, 0x0007,
-	0x4047, 0x000a, 0x808c, 0x0008, 0x0002, 0x0000, 0x0821, 0x0003,
-	0x4022, 0x0000, 0x0022, 0x000b, 0x4122, 0x0008, 0x4447, 0x0002,
-	0x0e4f, 0x000b, 0x0bfe, 0x0008, 0x11a0, 0x0001, 0x122d, 0x000b,
-	0x0ca0, 0x0001, 0x122d, 0x000b, 0x9180, 0x0001, 0x0004, 0x0000,
-	0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000,
-	0x0009, 0x0008, 0x4430, 0x000b, 0x808c, 0x0008, 0x0000, 0x0008,
-	0x0060, 0x0008, 0x8062, 0x0008, 0x0004, 0x0000, 0x8066, 0x0000,
-	0x0411, 0x0000, 0x4438, 0x0003, 0x03fe, 0x0000, 0x43e0, 0x0001,
-	0x0e2a, 0x000b, 0xc2c0, 0x0009, 0x00ff, 0x0008, 0x02e0, 0x0001,
-	0x0e2a, 0x000b, 0x9180, 0x0001, 0x0005, 0x0008, 0x8060, 0x0000,
-	0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0019, 0x0000,
-	0x4447, 0x000b, 0x0240, 0x0002, 0x0a27, 0x000b, 0x00fe, 0x0000,
-	0x322a, 0x000b, 0x112a, 0x0000, 0x002e, 0x0008, 0x022c, 0x0008,
-	0x3a44, 0x0002, 0x0c0a, 0x000b, 0x808c, 0x0008, 0x0002, 0x0000,
-	0x1760, 0x0008, 0x8062, 0x0008, 0x000f, 0x0008, 0x8066, 0x0000,
-	0x0011, 0x0008, 0x4458, 0x0003, 0x01fe, 0x0008, 0x42e0, 0x0009,
-	0x0e1d, 0x0003, 0x00fe, 0x0000, 0x43e0, 0x0001, 0x0e1d, 0x0003,
-	0x1734, 0x0000, 0x1530, 0x0000, 0x1632, 0x0008, 0x0d2a, 0x0008,
-	0x9880, 0x0001, 0x0010, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000,
-	0x7f62, 0x0008, 0x8066, 0x0000, 0x1e0a, 0x0008, 0x446a, 0x000b,
-	0x808a, 0x0008, 0x0003, 0x0008, 0x1a60, 0x0000, 0x8062, 0x0008,
-	0x0002, 0x0000, 0x5870, 0x000b, 0x8066, 0x0000, 0x3679, 0x0000,
-	0x4473, 0x0003, 0x5874, 0x0003, 0x3efe, 0x0008, 0x7f4f, 0x0002,
-	0x087a, 0x000b, 0x0d00, 0x0000, 0x0082, 0x0004, 0x8054, 0x0008,
-	0x0011, 0x0008, 0x8074, 0x0000, 0x1010, 0x0008, 0x1efe, 0x0000,
-	0x300a, 0x000b, 0x00b8, 0x0004, 0x000a, 0x000b, 0x00fe, 0x0000,
-	0x348a, 0x000b, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0007, 0x0000,
-	0x8066, 0x0000, 0x0231, 0x0008, 0x4489, 0x0003, 0x03fe, 0x0000,
-	0x04d0, 0x0001, 0x0cb0, 0x0003, 0x82c0, 0x0001, 0x1f00, 0x0000,
-	0xffa0, 0x0001, 0x0400, 0x0000, 0x089f, 0x0003, 0x14b0, 0x0003,
-	0x01fe, 0x0008, 0x0580, 0x0009, 0x7f06, 0x0000, 0x02fe, 0x0008,
-	0xffc0, 0x0001, 0x00ff, 0x0008, 0x0690, 0x0001, 0x109f, 0x0003,
-	0x7f08, 0x0008, 0x84c0, 0x0001, 0xff00, 0x0008, 0x08b0, 0x000b,
-	0x00fe, 0x0000, 0x34a6, 0x0003, 0x8072, 0x0000, 0x1010, 0x0008,
-	0x3944, 0x0002, 0x08a1, 0x000b, 0x00aa, 0x000b, 0x8072, 0x0000,
-	0x2020, 0x0008, 0x3945, 0x000a, 0x08a6, 0x0003, 0x3946, 0x000a,
-	0x0cb7, 0x000b, 0x0000, 0x0007, 0x3943, 0x000a, 0x08b7, 0x0003,
-	0x00aa, 0x000b, 0x00fe, 0x0000, 0x34b5, 0x000b, 0x8072, 0x0000,
-	0x1000, 0x0000, 0x00b7, 0x000b, 0x8072, 0x0000, 0x2000, 0x0000,
-	0x4000, 0x000f, 0x1c60, 0x0000, 0x1b62, 0x0000, 0x8066, 0x0000,
-	0x0231, 0x0008, 0x44bc, 0x0003, 0x58bd, 0x0003, 0x0140, 0x0008,
-	0x0242, 0x0000, 0x1f43, 0x0002, 0x0ccb, 0x0003, 0x0d44, 0x0000,
-	0x0d46, 0x0008, 0x0348, 0x0008, 0x044a, 0x0008, 0x030a, 0x0008,
-	0x040c, 0x0000, 0x0d06, 0x0000, 0x0d08, 0x0008, 0x00cf, 0x000b,
-	0x0344, 0x0008, 0x0446, 0x0008, 0x0548, 0x0008, 0x064a, 0x0000,
-	0x58cf, 0x0003, 0x3efe, 0x0008, 0x7f4f, 0x0002, 0x08d6, 0x000b,
-	0x8000, 0x0000, 0x0001, 0x0000, 0x0082, 0x0004, 0x8054, 0x0008,
-	0x0001, 0x0000, 0x8074, 0x0000, 0x2020, 0x0008, 0x4000, 0x000f,
-	0x3a40, 0x000a, 0x0c0d, 0x0003, 0x2b24, 0x0008, 0x2b24, 0x0008,
-	0x58df, 0x000b, 0x8054, 0x0008, 0x0002, 0x0000, 0x1242, 0x0002,
-	0x092d, 0x000b, 0x3a45, 0x000a, 0x091c, 0x0003, 0x8072, 0x0000,
-	0x1000, 0x0000, 0x3945, 0x000a, 0x08ec, 0x000b, 0x8072, 0x0000,
-	0x3010, 0x0000, 0x1e10, 0x000a, 0x7f3c, 0x0000, 0x0917, 0x000b,
-	0x1d00, 0x0002, 0x7f3a, 0x0000, 0x0d60, 0x0000, 0x7f62, 0x0008,
-	0x8066, 0x0000, 0x0009, 0x0008, 0x44f5, 0x000b, 0x00fe, 0x0000,
-	0x3514, 0x000b, 0x1c60, 0x0000, 0x8062, 0x0008, 0x0001, 0x0000,
-	0x8066, 0x0000, 0x0009, 0x0008, 0x44fd, 0x0003, 0x00fe, 0x0000,
-	0x3204, 0x000b, 0x0038, 0x0000, 0x0060, 0x0008, 0x8062, 0x0008,
-	0x0019, 0x0000, 0x8066, 0x0000, 0x0009, 0x0008, 0x4506, 0x0003,
-	0x80c0, 0x0009, 0x00ff, 0x0008, 0x7f3e, 0x0008, 0x0d60, 0x0000,
-	0x0efe, 0x0008, 0x1f80, 0x0001, 0x7f62, 0x0008, 0x8066, 0x0000,
-	0x0009, 0x0008, 0x4510, 0x000b, 0x003a, 0x0008, 0x1dfe, 0x0000,
-	0x00f1, 0x0003, 0x0036, 0x0008, 0x00b8, 0x0004, 0x012d, 0x0003,
-	0x8074, 0x0000, 0x2000, 0x0000, 0x8072, 0x0000, 0x2000, 0x0000,
-	0x012d, 0x0003, 0x3a44, 0x0002, 0x0a30, 0x000b, 0x8074, 0x0000,
-	0x1000, 0x0000, 0x8072, 0x0000, 0x1000, 0x0000, 0x2d0e, 0x0000,
-	0x2d0e, 0x0000, 0x3601, 0x0003, 0x26fe, 0x0008, 0x26fe, 0x0008,
-	0x2700, 0x0008, 0x2700, 0x0008, 0x00d0, 0x0009, 0x0d3f, 0x0003,
-	0x8074, 0x0000, 0x4040, 0x0008, 0x592d, 0x000b, 0x50db, 0x000b,
-	0x3a46, 0x000a, 0x0d3f, 0x0003, 0x3a47, 0x0002, 0x093a, 0x000b,
-	0x8054, 0x0008, 0x0004, 0x0000, 0x8074, 0x0000, 0x8000, 0x0000,
-	0x8072, 0x0000, 0x3000, 0x0008, 0x0182, 0x0003, 0x92c0, 0x0009,
-	0x0fc8, 0x0000, 0x080a, 0x0003, 0x1246, 0x000a, 0x0dfb, 0x000b,
-	0x1a60, 0x0000, 0x8062, 0x0008, 0x0002, 0x0000, 0x8066, 0x0000,
-	0x362a, 0x0000, 0x4544, 0x0003, 0x2000, 0x0000, 0x2000, 0x0000,
-	0x2102, 0x0000, 0x2102, 0x0000, 0x2204, 0x0000, 0x2204, 0x0000,
-	0x2306, 0x0000, 0x2306, 0x0000, 0x2408, 0x0000, 0x2408, 0x0000,
-	0x250a, 0x0000, 0x250a, 0x0000, 0x260c, 0x0000, 0x260c, 0x0000,
-	0x270e, 0x0000, 0x270e, 0x0000, 0x2810, 0x0000, 0x2810, 0x0000,
-	0x2912, 0x0000, 0x2912, 0x0000, 0x1a60, 0x0000, 0x8062, 0x0008,
-	0x0007, 0x0000, 0x8066, 0x0000, 0x0052, 0x0000, 0x455e, 0x000b,
-	0x92c0, 0x0009, 0x0780, 0x0008, 0x0e17, 0x0003, 0x124b, 0x0002,
-	0x0967, 0x0003, 0x2e4d, 0x0002, 0x2e4d, 0x0002, 0x0a01, 0x0003,
-	0x3a46, 0x000a, 0x0d74, 0x0003, 0x5969, 0x000b, 0x8054, 0x0008,
-	0x0004, 0x0000, 0x1243, 0x000a, 0x097e, 0x000b, 0x8010, 0x0008,
-	0x000d, 0x0000, 0x01ef, 0x0004, 0x1810, 0x0000, 0x01ef, 0x0004,
-	0x017e, 0x0003, 0x194d, 0x000a, 0x0978, 0x000b, 0x1243, 0x000a,
-	0x0a0b, 0x0003, 0x5978, 0x000b, 0x8054, 0x0008, 0x0004, 0x0000,
-	0x01e4, 0x000c, 0x1810, 0x0000, 0x01ef, 0x0004, 0x8074, 0x0000,
-	0xf000, 0x0008, 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30, 0x0000,
-	0x3a42, 0x0002, 0x0d88, 0x0003, 0x15fe, 0x0008, 0x3451, 0x000b,
-	0x000a, 0x000b, 0x8074, 0x0000, 0x0501, 0x0000, 0x8010, 0x0008,
-	0x000c, 0x0008, 0x01ef, 0x0004, 0x000a, 0x000b, 0xbbe0, 0x0009,
-	0x0030, 0x0008, 0x0d9e, 0x000b, 0x18fe, 0x0000, 0x3ce0, 0x0009,
-	0x099b, 0x0003, 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x099b, 0x0003,
-	0x01df, 0x0004, 0x8076, 0x0008, 0x0040, 0x0000, 0x01dc, 0x000b,
-	0x8076, 0x0008, 0x0041, 0x0008, 0x01dc, 0x000b, 0xbbe0, 0x0009,
-	0x0032, 0x0000, 0x0da3, 0x0003, 0x3c1e, 0x0008, 0x01dc, 0x000b,
-	0xbbe0, 0x0009, 0x0037, 0x0000, 0x0dc1, 0x000b, 0x18fe, 0x0000,
-	0x3ce0, 0x0009, 0x0d9b, 0x000b, 0x8076, 0x0008, 0x0040, 0x0000,
-	0x1a60, 0x0000, 0x8062, 0x0008, 0x000d, 0x0000, 0x2604, 0x0008,
-	0x2604, 0x0008, 0x2706, 0x0008, 0x2706, 0x0008, 0x2808, 0x0000,
-	0x2808, 0x0000, 0x290a, 0x0000, 0x290a, 0x0000, 0x8066, 0x0000,
-	0x0422, 0x0000, 0x45b8, 0x0003, 0x01e4, 0x000c, 0x8054, 0x0008,
-	0x0004, 0x0000, 0x8074, 0x0000, 0xf000, 0x0008, 0x8072, 0x0000,
-	0xb000, 0x0000, 0x0182, 0x0003, 0xbbe0, 0x0009, 0x0038, 0x0000,
-	0x0dd3, 0x000b, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x09d0, 0x0003,
-	0x15fe, 0x0008, 0x3ce0, 0x0009, 0x0d97, 0x000b, 0x01df, 0x0004,
-	0x8076, 0x0008, 0x0040, 0x0000, 0x8072, 0x0000, 0x8000, 0x0000,
-	0x0227, 0x0003, 0x8076, 0x0008, 0x0042, 0x0008, 0x01dc, 0x000b,
-	0xbbe0, 0x0009, 0x0016, 0x0000, 0x0ddc, 0x000b, 0x3a44, 0x0002,
-	0x0c0c, 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, 0x8000, 0x000f,
-	0x000a, 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, 0x000a, 0x000b,
-	0x3d30, 0x000a, 0x7f00, 0x0000, 0xbc80, 0x0001, 0x0007, 0x0000,
-	0x01e8, 0x0003, 0x1930, 0x000a, 0x7f00, 0x0000, 0x9880, 0x0001,
-	0x0007, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008,
-	0x8066, 0x0000, 0x000a, 0x0008, 0x45ed, 0x0003, 0x4000, 0x000f,
-	0x21ef, 0x0003, 0x0870, 0x0008, 0x4000, 0x000f, 0xbac0, 0x0009,
-	0x0090, 0x0008, 0x09f8, 0x0003, 0x8074, 0x0000, 0x0706, 0x0000,
-	0x01fa, 0x0003, 0x8074, 0x0000, 0x0703, 0x0000, 0x4000, 0x000f,
-	0x8010, 0x0008, 0x0023, 0x0000, 0x0235, 0x0003, 0x8010, 0x0008,
-	0x0008, 0x0000, 0x0235, 0x0003, 0x8010, 0x0008, 0x0022, 0x0008,
-	0x0235, 0x0003, 0x01e4, 0x000c, 0x8010, 0x0008, 0x0007, 0x0000,
-	0x01ef, 0x0004, 0x1810, 0x0000, 0x01ef, 0x0004, 0x0241, 0x0003,
-	0x01e4, 0x000c, 0x8010, 0x0008, 0x001b, 0x0008, 0x01ef, 0x0004,
-	0x1810, 0x0000, 0x01ef, 0x0004, 0x8074, 0x0000, 0xf080, 0x0000,
-	0x8072, 0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, 0x000a, 0x000b,
-	0x8010, 0x0008, 0x0009, 0x0008, 0x0235, 0x0003, 0x8010, 0x0008,
-	0x0005, 0x0008, 0x0235, 0x0003, 0x808c, 0x0008, 0x0001, 0x0000,
-	0x8010, 0x0008, 0x0004, 0x0000, 0x4143, 0x000a, 0x085f, 0x0003,
-	0x3a44, 0x0002, 0x0c0a, 0x000b, 0x0d2a, 0x0008, 0x0235, 0x0003,
-	0x8010, 0x0008, 0x0003, 0x0008, 0x0239, 0x0003, 0x8010, 0x0008,
-	0x000b, 0x0000, 0x0239, 0x0003, 0x8010, 0x0008, 0x0002, 0x0000,
-	0x0239, 0x0003, 0x3a47, 0x0002, 0x0d2d, 0x0003, 0x8010, 0x0008,
-	0x0006, 0x0008, 0x0239, 0x0003, 0x8074, 0x0000, 0xf000, 0x0008,
-	0x8072, 0x0000, 0x3000, 0x0008, 0x01ef, 0x0004, 0x01f2, 0x0004,
-	0x3a40, 0x000a, 0x080a, 0x0003, 0x8010, 0x0008, 0x000c, 0x0008,
-	0x01ef, 0x0004, 0x000a, 0x000b, 0x8074, 0x0000, 0xf080, 0x0000,
-	0x8072, 0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, 0x2e4d, 0x0002,
-	0x2e4d, 0x0002, 0x0a4c, 0x0003, 0x8054, 0x0008, 0x0019, 0x0000,
-	0x000a, 0x000b, 0x8054, 0x0008, 0x0009, 0x0008, 0x000a, 0x000b,
-	0x3a44, 0x0002, 0x0c0a, 0x000b, 0x022a, 0x000b, 0x15b6, 0xf4ac,
-	0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
-	0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000,
-	0x9298
+	0xadf4, 0x009e, 0x1540, 0x0046, 0x0016, 0xbaa0, 0x2220, 0x9006,
+	0x2009, 0x1854, 0x210c, 0x0038, 0x2009, 0x0029, 0x080c, 0xd50a,
+	0xb800, 0xc0e5, 0xb802, 0x2019, 0x0029, 0x080c, 0x8549, 0x0076,
+	0x2039, 0x0000, 0x080c, 0x8441, 0x2c08, 0x080c, 0xd27b, 0x007e,
+	0x2001, 0x0007, 0x080c, 0x61b4, 0x2001, 0x0007, 0x080c, 0x6188,
+	0x001e, 0x004e, 0x9006, 0x015e, 0x003e, 0x002e, 0x00be, 0x00ce,
+	0x0005, 0x00d6, 0x2069, 0x026e, 0x6800, 0x9086, 0x0800, 0x0118,
+	0x6017, 0x0000, 0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, 0x00f6,
+	0x0016, 0x0026, 0x0036, 0x0156, 0x2079, 0x026c, 0x7930, 0x7834,
+	0x080c, 0x2663, 0x11d0, 0x080c, 0x6237, 0x11b8, 0x2011, 0x0270,
+	0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xadf4,
+	0x009e, 0x1158, 0x2011, 0x0274, 0x20a9, 0x0004, 0x0096, 0x2b48,
+	0x2019, 0x0006, 0x080c, 0xadf4, 0x009e, 0x015e, 0x003e, 0x002e,
+	0x001e, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x0006, 0x0016, 0x0026,
+	0x0036, 0x0156, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c,
+	0x2663, 0x11d0, 0x080c, 0x6237, 0x11b8, 0x2011, 0x0276, 0x20a9,
+	0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xadf4, 0x009e,
+	0x1158, 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019,
+	0x0006, 0x080c, 0xadf4, 0x009e, 0x015e, 0x003e, 0x002e, 0x001e,
+	0x000e, 0x00be, 0x0005, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066,
+	0x0056, 0x0046, 0x0026, 0x0126, 0x2091, 0x8000, 0x2740, 0x2029,
+	0x19c1, 0x252c, 0x2021, 0x19c7, 0x2424, 0x2061, 0x1cd0, 0x2071,
+	0x1800, 0x7650, 0x7070, 0x81ff, 0x0150, 0x0006, 0x9186, 0x1a80,
+	0x000e, 0x0128, 0x8001, 0x9602, 0x1a04, 0xd314, 0x0018, 0x9606,
+	0x0904, 0xd314, 0x2100, 0x9c06, 0x0904, 0xd30b, 0x080c, 0xd54b,
+	0x1904, 0xd30b, 0x080c, 0xd838, 0x0904, 0xd30b, 0x080c, 0xd53b,
+	0x0904, 0xd30b, 0x6720, 0x9786, 0x0001, 0x1148, 0x080c, 0x3127,
+	0x0904, 0xd32f, 0x6004, 0x9086, 0x0000, 0x1904, 0xd32f, 0x9786,
+	0x0004, 0x0904, 0xd32f, 0x9786, 0x0007, 0x0904, 0xd30b, 0x2500,
+	0x9c06, 0x0904, 0xd30b, 0x2400, 0x9c06, 0x05e8, 0x88ff, 0x0118,
+	0x6054, 0x9906, 0x15c0, 0x0096, 0x6000, 0x9086, 0x0004, 0x1120,
+	0x0016, 0x080c, 0x190d, 0x001e, 0x9786, 0x000a, 0x0148, 0x080c,
+	0xbd04, 0x1130, 0x080c, 0xa7a7, 0x009e, 0x080c, 0x9e49, 0x0418,
+	0x6014, 0x2048, 0x080c, 0xbafe, 0x01d8, 0x9786, 0x0003, 0x1570,
+	0xa867, 0x0103, 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878, 0x2048,
+	0x080c, 0x0f9d, 0x009e, 0xab7a, 0xa877, 0x0000, 0x080c, 0xd7b3,
+	0x0016, 0x080c, 0xbded, 0x080c, 0x6878, 0x001e, 0x080c, 0xbce7,
+	0x009e, 0x080c, 0x9e49, 0x9ce0, 0x0018, 0x2001, 0x1819, 0x2004,
+	0x9c02, 0x1210, 0x0804, 0xd28f, 0x012e, 0x002e, 0x004e, 0x005e,
+	0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, 0x0005, 0x9786, 0x0006,
+	0x1150, 0x9386, 0x0005, 0x0128, 0x080c, 0xd7b3, 0x080c, 0xd4b5,
+	0x08f8, 0x009e, 0x0c00, 0x9786, 0x000a, 0x0920, 0x0808, 0x81ff,
+	0x09d0, 0x9180, 0x0001, 0x2004, 0x9086, 0x0018, 0x0130, 0x9180,
+	0x0001, 0x2004, 0x9086, 0x002d, 0x1970, 0x6000, 0x9086, 0x0002,
+	0x1950, 0x080c, 0xbcf3, 0x0130, 0x080c, 0xbd04, 0x1920, 0x080c,
+	0xa7a7, 0x0038, 0x080c, 0x2ffc, 0x080c, 0xbd04, 0x1110, 0x080c,
+	0xa7a7, 0x080c, 0x9e49, 0x0804, 0xd30b, 0xa864, 0x9084, 0x00ff,
+	0x9086, 0x0039, 0x0005, 0x00c6, 0x00e6, 0x0016, 0x2c08, 0x2170,
+	0x9006, 0x080c, 0xd4dc, 0x001e, 0x0120, 0x6020, 0x9084, 0x000f,
+	0x001b, 0x00ee, 0x00ce, 0x0005, 0xd37a, 0xd37a, 0xd37a, 0xd37a,
+	0xd37a, 0xd37a, 0xd37c, 0xd37a, 0xd37a, 0xd37a, 0xd37a, 0x9e49,
+	0x9e49, 0xd37a, 0x9006, 0x0005, 0x0036, 0x0046, 0x0016, 0x7010,
+	0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x2009, 0x0020, 0x080c,
+	0xd50a, 0x001e, 0x004e, 0x2019, 0x0002, 0x080c, 0xd0c7, 0x003e,
+	0x9085, 0x0001, 0x0005, 0x0096, 0x080c, 0xbafe, 0x0140, 0x6014,
+	0x904d, 0x080c, 0xb731, 0x687b, 0x0005, 0x080c, 0x6885, 0x009e,
+	0x080c, 0x9e49, 0x9085, 0x0001, 0x0005, 0x2001, 0x0001, 0x080c,
+	0x6174, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019,
+	0x1805, 0x2011, 0x0276, 0x080c, 0xade0, 0x003e, 0x002e, 0x001e,
+	0x015e, 0x9005, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x0076,
+	0x0066, 0x00b6, 0x0126, 0x2091, 0x8000, 0x2740, 0x2061, 0x1cd0,
+	0x2079, 0x0001, 0x8fff, 0x0904, 0xd415, 0x2071, 0x1800, 0x7650,
+	0x7070, 0x8001, 0x9602, 0x1a04, 0xd415, 0x88ff, 0x0120, 0x2800,
+	0x9c06, 0x1590, 0x2078, 0x080c, 0xd53b, 0x0570, 0x2400, 0x9c06,
+	0x0558, 0x6720, 0x9786, 0x0006, 0x1538, 0x9786, 0x0007, 0x0520,
+	0x88ff, 0x1140, 0x6010, 0x9b06, 0x11f8, 0x85ff, 0x0118, 0x6054,
+	0x9106, 0x11d0, 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xd767,
+	0x080c, 0xc211, 0x080c, 0x190d, 0x6023, 0x0007, 0x6014, 0x2048,
+	0x080c, 0xbafe, 0x0120, 0x0046, 0x080c, 0xd4b5, 0x004e, 0x009e,
+	0x080c, 0x9e49, 0x88ff, 0x1198, 0x9ce0, 0x0018, 0x2001, 0x1819,
+	0x2004, 0x9c02, 0x1210, 0x0804, 0xd3ca, 0x9006, 0x012e, 0x00be,
+	0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x98c5,
+	0x0001, 0x0ca0, 0x00b6, 0x0076, 0x0056, 0x0086, 0x9046, 0x2029,
+	0x0001, 0x2c20, 0x2019, 0x0002, 0x6210, 0x2258, 0x0096, 0x904e,
+	0x080c, 0x97a1, 0x009e, 0x008e, 0x903e, 0x080c, 0x984c, 0x080c,
+	0xd3bb, 0x005e, 0x007e, 0x00be, 0x0005, 0x00b6, 0x0046, 0x0056,
+	0x0076, 0x00c6, 0x0156, 0x2c20, 0x2128, 0x20a9, 0x007f, 0x900e,
+	0x0016, 0x0036, 0x080c, 0x6237, 0x1190, 0x0056, 0x0086, 0x9046,
+	0x2508, 0x2029, 0x0001, 0x0096, 0x904e, 0x080c, 0x97a1, 0x009e,
+	0x008e, 0x903e, 0x080c, 0x984c, 0x080c, 0xd3bb, 0x005e, 0x003e,
+	0x001e, 0x8108, 0x1f04, 0xd448, 0x015e, 0x00ce, 0x007e, 0x005e,
+	0x004e, 0x00be, 0x0005, 0x00b6, 0x0076, 0x0056, 0x6210, 0x2258,
+	0x0086, 0x9046, 0x2029, 0x0001, 0x2019, 0x0048, 0x0096, 0x904e,
+	0x080c, 0x97a1, 0x009e, 0x008e, 0x903e, 0x080c, 0x984c, 0x2c20,
+	0x080c, 0xd3bb, 0x005e, 0x007e, 0x00be, 0x0005, 0x00b6, 0x0046,
+	0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x20a9, 0x0800, 0x900e,
+	0x0016, 0x0036, 0x080c, 0x6237, 0x11a0, 0x0086, 0x9046, 0x2828,
+	0x0046, 0x2021, 0x0001, 0x080c, 0xd74b, 0x004e, 0x0096, 0x904e,
+	0x080c, 0x97a1, 0x009e, 0x008e, 0x903e, 0x080c, 0x984c, 0x080c,
+	0xd3bb, 0x003e, 0x001e, 0x8108, 0x1f04, 0xd490, 0x015e, 0x00ce,
+	0x007e, 0x005e, 0x004e, 0x00be, 0x0005, 0x0016, 0x00f6, 0x080c,
+	0xbafc, 0x0198, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0046, 0x0180,
+	0xa800, 0x907d, 0x0138, 0xa803, 0x0000, 0xab82, 0x080c, 0x6885,
+	0x2f48, 0x0cb0, 0xab82, 0x080c, 0x6885, 0x00fe, 0x001e, 0x0005,
+	0xa800, 0x907d, 0x0130, 0xa803, 0x0000, 0x080c, 0x6885, 0x2f48,
+	0x0cb8, 0x080c, 0x6885, 0x0c88, 0x00e6, 0x0046, 0x0036, 0x2061,
+	0x1cd0, 0x9005, 0x1138, 0x2071, 0x1800, 0x7450, 0x7070, 0x8001,
+	0x9402, 0x12d8, 0x2100, 0x9c06, 0x0168, 0x6000, 0x9086, 0x0000,
+	0x0148, 0x6008, 0x9206, 0x1130, 0x6010, 0x91a0, 0x0004, 0x2424,
+	0x9406, 0x0140, 0x9ce0, 0x0018, 0x2001, 0x1819, 0x2004, 0x9c02,
+	0x1220, 0x0c40, 0x9085, 0x0001, 0x0008, 0x9006, 0x003e, 0x004e,
+	0x00ee, 0x0005, 0x0096, 0x0006, 0x080c, 0x0feb, 0x000e, 0x090c,
+	0x0db4, 0xaae2, 0xa867, 0x010d, 0xa88e, 0x0026, 0x2010, 0x080c,
+	0xbaec, 0x2001, 0x0000, 0x0120, 0x2200, 0x9080, 0x0015, 0x2004,
+	0x002e, 0xa87a, 0x9186, 0x0020, 0x0110, 0xa8e3, 0xffff, 0xa986,
+	0xac76, 0xa87f, 0x0000, 0x2001, 0x195f, 0x2004, 0xa882, 0x9006,
+	0xa802, 0xa86a, 0xa88a, 0x0126, 0x2091, 0x8000, 0x080c, 0x6885,
+	0x012e, 0x009e, 0x0005, 0x6700, 0x9786, 0x0000, 0x0158, 0x9786,
+	0x0001, 0x0140, 0x9786, 0x000a, 0x0128, 0x9786, 0x0009, 0x0110,
+	0x9085, 0x0001, 0x0005, 0x00e6, 0x6010, 0x9075, 0x0138, 0x00b6,
+	0x2058, 0xb8a0, 0x00be, 0x9206, 0x00ee, 0x0005, 0x9085, 0x0001,
+	0x0cd8, 0x0016, 0x6004, 0x908e, 0x001e, 0x11a0, 0x8007, 0x6134,
+	0x918c, 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b,
+	0x6023, 0x0005, 0x2001, 0x1958, 0x2004, 0x601a, 0x080c, 0x83c9,
+	0x080c, 0x894b, 0x001e, 0x0005, 0xa001, 0xa001, 0x0005, 0x6024,
+	0xd0e4, 0x0158, 0xd0cc, 0x0118, 0x080c, 0xbe31, 0x0030, 0x080c,
+	0xd767, 0x080c, 0x81dc, 0x080c, 0x9e19, 0x0005, 0x9280, 0x0008,
+	0x2004, 0x9084, 0x000f, 0x0002, 0xd59a, 0xd59a, 0xd59a, 0xd59c,
+	0xd59a, 0xd59c, 0xd59c, 0xd59a, 0xd59c, 0xd59a, 0xd59a, 0xd59a,
+	0xd59a, 0xd59a, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x9280,
+	0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xd5b3, 0xd5b3, 0xd5b3,
+	0xd5b3, 0xd5b3, 0xd5b3, 0xd5c0, 0xd5b3, 0xd5b3, 0xd5b3, 0xd5b3,
+	0xd5b3, 0xd5b3, 0xd5b3, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017,
+	0x2a00, 0x6003, 0x0001, 0x080c, 0x83c9, 0x080c, 0x894b, 0x0005,
+	0x0096, 0x00c6, 0x2260, 0x080c, 0xd767, 0x6043, 0x0000, 0x6024,
+	0xc0f4, 0xc0e4, 0x6026, 0x603b, 0x0000, 0x00ce, 0x00d6, 0x2268,
+	0x9186, 0x0007, 0x1904, 0xd619, 0x6814, 0x9005, 0x0138, 0x2048,
+	0xa87c, 0xd0fc, 0x1118, 0x00de, 0x009e, 0x08a8, 0x6007, 0x003a,
+	0x6003, 0x0001, 0x080c, 0x83c9, 0x080c, 0x894b, 0x00c6, 0x2d60,
+	0x6100, 0x9186, 0x0002, 0x1904, 0xd690, 0x6014, 0x9005, 0x1138,
+	0x6000, 0x9086, 0x0007, 0x190c, 0x0db4, 0x0804, 0xd690, 0x2048,
+	0x080c, 0xbafe, 0x1130, 0x0028, 0x2048, 0xa800, 0x9005, 0x1de0,
+	0x2900, 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x1168,
+	0xa87c, 0xc0dc, 0xc0f4, 0xa87e, 0xa880, 0xc0fc, 0xa882, 0x2009,
+	0x0043, 0x080c, 0xcf20, 0x0804, 0xd690, 0x2009, 0x0041, 0x0804,
+	0xd68a, 0x9186, 0x0005, 0x15a0, 0x6814, 0x2048, 0xa87c, 0xd0bc,
+	0x1120, 0x00de, 0x009e, 0x0804, 0xd5b3, 0xd0b4, 0x0128, 0xd0fc,
+	0x090c, 0x0db4, 0x0804, 0xd5d4, 0x6007, 0x003a, 0x6003, 0x0001,
+	0x080c, 0x83c9, 0x080c, 0x894b, 0x00c6, 0x2d60, 0x6100, 0x9186,
+	0x0002, 0x0120, 0x9186, 0x0004, 0x1904, 0xd690, 0x6814, 0x2048,
+	0xa97c, 0xc1f4, 0xc1dc, 0xa97e, 0xa980, 0xc1fc, 0xc1bc, 0xa982,
+	0x00f6, 0x2c78, 0x080c, 0x1648, 0x00fe, 0x2009, 0x0042, 0x04d0,
+	0x0036, 0x080c, 0x0feb, 0x090c, 0x0db4, 0xa867, 0x010d, 0x9006,
+	0xa802, 0xa86a, 0xa88a, 0x2d18, 0xab8e, 0xa887, 0x0045, 0x2c00,
+	0xa892, 0x6038, 0xa8a2, 0x2360, 0x6024, 0xc0dd, 0x6026, 0x6010,
+	0x00b6, 0x2058, 0xb8a0, 0x00be, 0x2004, 0x6354, 0xab7a, 0xa876,
+	0x9006, 0xa87e, 0xa882, 0xad9a, 0xae96, 0xa89f, 0x0001, 0x080c,
+	0x6885, 0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xd0c7, 0x2d00,
+	0x600a, 0x6023, 0x0006, 0x6003, 0x0007, 0x901e, 0x631a, 0x6342,
+	0x003e, 0x0038, 0x6043, 0x0000, 0x6003, 0x0007, 0x080c, 0xcf20,
+	0x00ce, 0x00de, 0x009e, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004,
+	0x9082, 0x0085, 0x2008, 0x00c2, 0x9186, 0x0027, 0x1178, 0x080c,
+	0x8846, 0x0036, 0x0096, 0x6014, 0x2048, 0x2019, 0x0004, 0x080c,
+	0xd4b5, 0x009e, 0x003e, 0x080c, 0x894b, 0x0005, 0x9186, 0x0014,
+	0x0d70, 0x080c, 0x9eae, 0x0005, 0xd6c3, 0xd6c1, 0xd6c1, 0xd6c1,
+	0xd6c1, 0xd6c1, 0xd6c3, 0xd6c1, 0xd6c1, 0xd6c1, 0xd6c1, 0xd6c1,
+	0xd6c1, 0x080c, 0x0db4, 0x080c, 0x8846, 0x6003, 0x000c, 0x080c,
+	0x894b, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208,
+	0x001a, 0x080c, 0x9eae, 0x0005, 0xd6e1, 0xd6e1, 0xd6e1, 0xd6e1,
+	0xd6e3, 0xd703, 0xd6e1, 0xd6e1, 0xd6e1, 0xd6e1, 0xd6e1, 0xd6e1,
+	0xd6e1, 0x080c, 0x0db4, 0x00d6, 0x2c68, 0x080c, 0x9dc3, 0x01b0,
+	0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0x026e, 0x210c, 0x613a,
+	0x2009, 0x026f, 0x210c, 0x613e, 0x600b, 0xffff, 0x6910, 0x6112,
+	0x6023, 0x0004, 0x080c, 0x83c9, 0x080c, 0x894b, 0x2d60, 0x080c,
+	0x9e19, 0x00de, 0x0005, 0x080c, 0x9e19, 0x0005, 0x00e6, 0x6010,
+	0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ec, 0x00ee, 0x0005, 0x2009,
+	0x1873, 0x210c, 0xd1ec, 0x05b0, 0x6003, 0x0002, 0x6024, 0xc0e5,
+	0x6026, 0xd0cc, 0x0150, 0x2001, 0x1959, 0x2004, 0x6042, 0x2009,
+	0x1873, 0x210c, 0xd1f4, 0x1520, 0x00a0, 0x2009, 0x1873, 0x210c,
+	0xd1f4, 0x0128, 0x6024, 0xc0e4, 0x6026, 0x9006, 0x00d8, 0x2001,
+	0x1959, 0x200c, 0x2001, 0x1957, 0x2004, 0x9100, 0x9080, 0x000a,
+	0x6042, 0x6010, 0x00b6, 0x2058, 0xb8ac, 0x00be, 0x0008, 0x2104,
+	0x9005, 0x0118, 0x9088, 0x0003, 0x0cd0, 0x2c0a, 0x600f, 0x0000,
+	0x9085, 0x0001, 0x0005, 0x0016, 0x00c6, 0x00e6, 0x6154, 0xb8ac,
+	0x2060, 0x8cff, 0x0180, 0x84ff, 0x1118, 0x6054, 0x9106, 0x1138,
+	0x600c, 0x2072, 0x080c, 0x81dc, 0x080c, 0x9e19, 0x0010, 0x9cf0,
+	0x0003, 0x2e64, 0x0c70, 0x00ee, 0x00ce, 0x001e, 0x0005, 0x00d6,
+	0x00b6, 0x6010, 0x2058, 0xb8ac, 0x2068, 0x9005, 0x0130, 0x9c06,
+	0x0110, 0x680c, 0x0cd0, 0x600c, 0x680e, 0x00be, 0x00de, 0x0005,
+	0x0026, 0x0036, 0x0156, 0x2011, 0x182b, 0x2204, 0x9084, 0x00ff,
+	0x2019, 0x026e, 0x2334, 0x9636, 0x1508, 0x8318, 0x2334, 0x2204,
+	0x9084, 0xff00, 0x9636, 0x11d0, 0x2011, 0x0270, 0x20a9, 0x0004,
+	0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xadf4, 0x009e,
+	0x1168, 0x2011, 0x0274, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048,
+	0x2019, 0x0006, 0x080c, 0xadf4, 0x009e, 0x1100, 0x015e, 0x003e,
+	0x002e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5c5d, 0x080c,
+	0x2dbb, 0x00ee, 0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800,
+	0x00be, 0xd0fc, 0x0108, 0x0011, 0x00ee, 0x0005, 0xa880, 0xc0e5,
+	0xa882, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0056,
+	0x0046, 0x0026, 0x0016, 0x0126, 0x2091, 0x8000, 0x2029, 0x19c1,
+	0x252c, 0x2021, 0x19c7, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800,
+	0x7650, 0x7070, 0x9606, 0x0578, 0x6720, 0x9786, 0x0001, 0x0118,
+	0x9786, 0x0008, 0x1500, 0x2500, 0x9c06, 0x01e8, 0x2400, 0x9c06,
+	0x01d0, 0x080c, 0xd53b, 0x01b8, 0x080c, 0xd54b, 0x11a0, 0x6000,
+	0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x190d, 0x001e, 0x080c,
+	0xbcf3, 0x1110, 0x080c, 0x2ffc, 0x080c, 0xbd04, 0x1110, 0x080c,
+	0xa7a7, 0x080c, 0x9e49, 0x9ce0, 0x0018, 0x2001, 0x1819, 0x2004,
+	0x9c02, 0x1208, 0x0858, 0x012e, 0x001e, 0x002e, 0x004e, 0x005e,
+	0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x2001, 0x1810,
+	0x2004, 0xd0dc, 0x0005, 0x0006, 0x2001, 0x1836, 0x2004, 0xd09c,
+	0x000e, 0x0005, 0x0006, 0x0036, 0x0046, 0x080c, 0xc1f9, 0x0168,
+	0x2019, 0xffff, 0x9005, 0x0128, 0x6010, 0x00b6, 0x2058, 0xbba0,
+	0x00be, 0x2021, 0x0004, 0x080c, 0x4a6f, 0x004e, 0x003e, 0x000e,
+	0x6004, 0x9086, 0x0001, 0x1128, 0x080c, 0x990d, 0x080c, 0x9e49,
+	0x9006, 0x0005, 0x00e6, 0x00c6, 0x00b6, 0x0046, 0x2061, 0x1cd0,
+	0x2071, 0x1800, 0x7450, 0x7070, 0x8001, 0x9402, 0x12b8, 0x2100,
+	0x9c06, 0x0148, 0x6000, 0x9086, 0x0000, 0x0128, 0x6010, 0x2058,
+	0xb8a0, 0x9206, 0x0140, 0x9ce0, 0x0018, 0x2001, 0x1819, 0x2004,
+	0x9c02, 0x1220, 0x0c60, 0x9085, 0x0001, 0x0008, 0x9006, 0x004e,
+	0x00be, 0x00ce, 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016,
+	0x2091, 0x8000, 0x2071, 0x1840, 0xd5a4, 0x0118, 0x7034, 0x8000,
+	0x7036, 0xd5b4, 0x0118, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0178,
+	0x2500, 0x9084, 0x0007, 0x908e, 0x0003, 0x0148, 0x908e, 0x0004,
+	0x0130, 0x908e, 0x0005, 0x0118, 0x2071, 0x184a, 0x0089, 0x001e,
+	0x00ee, 0x000e, 0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091,
+	0x8000, 0x2071, 0x1842, 0x0021, 0x00ee, 0x000e, 0x012e, 0x0005,
+	0x2e04, 0x8000, 0x2072, 0x1220, 0x8e70, 0x2e04, 0x8000, 0x2072,
+	0x0005, 0x00e6, 0x2071, 0x1840, 0x0c99, 0x00ee, 0x0005, 0x00e6,
+	0x2071, 0x1844, 0x0c69, 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6,
+	0x2091, 0x8000, 0x2071, 0x1840, 0x7044, 0x8000, 0x7046, 0x00ee,
+	0x000e, 0x012e, 0x0005, 0x0003, 0x000b, 0x04a6, 0x0000, 0xc000,
+	0x0001, 0x8064, 0x0008, 0x0010, 0x0000, 0x8066, 0x0000, 0x0101,
+	0x0008, 0x4407, 0x0003, 0x8060, 0x0000, 0x0400, 0x0000, 0x580d,
+	0x000b, 0x798e, 0x0003, 0x50db, 0x000b, 0x4c0a, 0x0003, 0xbac0,
+	0x0009, 0x008a, 0x0000, 0x0c0a, 0x000b, 0x15fe, 0x0008, 0x340a,
+	0x0003, 0xc4c0, 0x0009, 0x7000, 0x0000, 0xffa0, 0x0001, 0x2000,
+	0x0000, 0x1627, 0x0003, 0x808c, 0x0008, 0x0001, 0x0000, 0x0000,
+	0x0007, 0x4047, 0x000a, 0x808c, 0x0008, 0x0002, 0x0000, 0x0821,
+	0x0003, 0x4022, 0x0000, 0x0022, 0x000b, 0x4122, 0x0008, 0x4447,
+	0x0002, 0x0e4f, 0x000b, 0x0bfe, 0x0008, 0x11a0, 0x0001, 0x122d,
+	0x000b, 0x0ca0, 0x0001, 0x122d, 0x000b, 0x9180, 0x0001, 0x0004,
+	0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066,
+	0x0000, 0x0009, 0x0008, 0x4430, 0x000b, 0x808c, 0x0008, 0x0000,
+	0x0008, 0x0060, 0x0008, 0x8062, 0x0008, 0x0004, 0x0000, 0x8066,
+	0x0000, 0x0411, 0x0000, 0x4438, 0x0003, 0x03fe, 0x0000, 0x43e0,
+	0x0001, 0x0e2a, 0x000b, 0xc2c0, 0x0009, 0x00ff, 0x0008, 0x02e0,
+	0x0001, 0x0e2a, 0x000b, 0x9180, 0x0001, 0x0005, 0x0008, 0x8060,
+	0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0019,
+	0x0000, 0x4447, 0x000b, 0x0240, 0x0002, 0x0a27, 0x000b, 0x00fe,
+	0x0000, 0x322a, 0x000b, 0x112a, 0x0000, 0x002e, 0x0008, 0x022c,
+	0x0008, 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x808c, 0x0008, 0x0002,
+	0x0000, 0x1760, 0x0008, 0x8062, 0x0008, 0x000f, 0x0008, 0x8066,
+	0x0000, 0x0011, 0x0008, 0x4458, 0x0003, 0x01fe, 0x0008, 0x42e0,
+	0x0009, 0x0e1d, 0x0003, 0x00fe, 0x0000, 0x43e0, 0x0001, 0x0e1d,
+	0x0003, 0x1734, 0x0000, 0x1530, 0x0000, 0x1632, 0x0008, 0x0d2a,
+	0x0008, 0x9880, 0x0001, 0x0010, 0x0000, 0x8060, 0x0000, 0x0400,
+	0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x1e0a, 0x0008, 0x446a,
+	0x000b, 0x808a, 0x0008, 0x0003, 0x0008, 0x1a60, 0x0000, 0x8062,
+	0x0008, 0x0002, 0x0000, 0x5870, 0x000b, 0x8066, 0x0000, 0x3679,
+	0x0000, 0x4473, 0x0003, 0x5874, 0x0003, 0x3efe, 0x0008, 0x7f4f,
+	0x0002, 0x087a, 0x000b, 0x0d00, 0x0000, 0x0082, 0x0004, 0x8054,
+	0x0008, 0x0011, 0x0008, 0x8074, 0x0000, 0x1010, 0x0008, 0x1efe,
+	0x0000, 0x300a, 0x000b, 0x00b8, 0x0004, 0x000a, 0x000b, 0x00fe,
+	0x0000, 0x348a, 0x000b, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0007,
+	0x0000, 0x8066, 0x0000, 0x0231, 0x0008, 0x4489, 0x0003, 0x03fe,
+	0x0000, 0x04d0, 0x0001, 0x0cb0, 0x0003, 0x82c0, 0x0001, 0x1f00,
+	0x0000, 0xffa0, 0x0001, 0x0400, 0x0000, 0x089f, 0x0003, 0x14b0,
+	0x0003, 0x01fe, 0x0008, 0x0580, 0x0009, 0x7f06, 0x0000, 0x02fe,
+	0x0008, 0xffc0, 0x0001, 0x00ff, 0x0008, 0x0690, 0x0001, 0x109f,
+	0x0003, 0x7f08, 0x0008, 0x84c0, 0x0001, 0xff00, 0x0008, 0x08b0,
+	0x000b, 0x00fe, 0x0000, 0x34a6, 0x0003, 0x8072, 0x0000, 0x1010,
+	0x0008, 0x3944, 0x0002, 0x08a1, 0x000b, 0x00aa, 0x000b, 0x8072,
+	0x0000, 0x2020, 0x0008, 0x3945, 0x000a, 0x08a6, 0x0003, 0x3946,
+	0x000a, 0x0cb7, 0x000b, 0x0000, 0x0007, 0x3943, 0x000a, 0x08b7,
+	0x0003, 0x00aa, 0x000b, 0x00fe, 0x0000, 0x34b5, 0x000b, 0x8072,
+	0x0000, 0x1000, 0x0000, 0x00b7, 0x000b, 0x8072, 0x0000, 0x2000,
+	0x0000, 0x4000, 0x000f, 0x1c60, 0x0000, 0x1b62, 0x0000, 0x8066,
+	0x0000, 0x0231, 0x0008, 0x44bc, 0x0003, 0x58bd, 0x0003, 0x0140,
+	0x0008, 0x0242, 0x0000, 0x1f43, 0x0002, 0x0ccb, 0x0003, 0x0d44,
+	0x0000, 0x0d46, 0x0008, 0x0348, 0x0008, 0x044a, 0x0008, 0x030a,
+	0x0008, 0x040c, 0x0000, 0x0d06, 0x0000, 0x0d08, 0x0008, 0x00cf,
+	0x000b, 0x0344, 0x0008, 0x0446, 0x0008, 0x0548, 0x0008, 0x064a,
+	0x0000, 0x58cf, 0x0003, 0x3efe, 0x0008, 0x7f4f, 0x0002, 0x08d6,
+	0x000b, 0x8000, 0x0000, 0x0001, 0x0000, 0x0082, 0x0004, 0x8054,
+	0x0008, 0x0001, 0x0000, 0x8074, 0x0000, 0x2020, 0x0008, 0x4000,
+	0x000f, 0x3a40, 0x000a, 0x0c0d, 0x0003, 0x2b24, 0x0008, 0x2b24,
+	0x0008, 0x58df, 0x000b, 0x8054, 0x0008, 0x0002, 0x0000, 0x1242,
+	0x0002, 0x092d, 0x000b, 0x3a45, 0x000a, 0x091c, 0x0003, 0x8072,
+	0x0000, 0x1000, 0x0000, 0x3945, 0x000a, 0x08ec, 0x000b, 0x8072,
+	0x0000, 0x3010, 0x0000, 0x1e10, 0x000a, 0x7f3c, 0x0000, 0x0917,
+	0x000b, 0x1d00, 0x0002, 0x7f3a, 0x0000, 0x0d60, 0x0000, 0x7f62,
+	0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x44f5, 0x000b, 0x00fe,
+	0x0000, 0x3514, 0x000b, 0x1c60, 0x0000, 0x8062, 0x0008, 0x0001,
+	0x0000, 0x8066, 0x0000, 0x0009, 0x0008, 0x44fd, 0x0003, 0x00fe,
+	0x0000, 0x3204, 0x000b, 0x0038, 0x0000, 0x0060, 0x0008, 0x8062,
+	0x0008, 0x0019, 0x0000, 0x8066, 0x0000, 0x0009, 0x0008, 0x4506,
+	0x0003, 0x80c0, 0x0009, 0x00ff, 0x0008, 0x7f3e, 0x0008, 0x0d60,
+	0x0000, 0x0efe, 0x0008, 0x1f80, 0x0001, 0x7f62, 0x0008, 0x8066,
+	0x0000, 0x0009, 0x0008, 0x4510, 0x000b, 0x003a, 0x0008, 0x1dfe,
+	0x0000, 0x00f1, 0x0003, 0x0036, 0x0008, 0x00b8, 0x0004, 0x012d,
+	0x0003, 0x8074, 0x0000, 0x2000, 0x0000, 0x8072, 0x0000, 0x2000,
+	0x0000, 0x012d, 0x0003, 0x3a44, 0x0002, 0x0a30, 0x000b, 0x8074,
+	0x0000, 0x1000, 0x0000, 0x8072, 0x0000, 0x1000, 0x0000, 0x2d0e,
+	0x0000, 0x2d0e, 0x0000, 0x3601, 0x0003, 0x26fe, 0x0008, 0x26fe,
+	0x0008, 0x2700, 0x0008, 0x2700, 0x0008, 0x00d0, 0x0009, 0x0d3f,
+	0x0003, 0x8074, 0x0000, 0x4040, 0x0008, 0x592d, 0x000b, 0x50db,
+	0x000b, 0x3a46, 0x000a, 0x0d3f, 0x0003, 0x3a47, 0x0002, 0x093a,
+	0x000b, 0x8054, 0x0008, 0x0004, 0x0000, 0x8074, 0x0000, 0x8000,
+	0x0000, 0x8072, 0x0000, 0x3000, 0x0008, 0x0182, 0x0003, 0x92c0,
+	0x0009, 0x0fc8, 0x0000, 0x080a, 0x0003, 0x1246, 0x000a, 0x0dfb,
+	0x000b, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0002, 0x0000, 0x8066,
+	0x0000, 0x362a, 0x0000, 0x4544, 0x0003, 0x2000, 0x0000, 0x2000,
+	0x0000, 0x2102, 0x0000, 0x2102, 0x0000, 0x2204, 0x0000, 0x2204,
+	0x0000, 0x2306, 0x0000, 0x2306, 0x0000, 0x2408, 0x0000, 0x2408,
+	0x0000, 0x250a, 0x0000, 0x250a, 0x0000, 0x260c, 0x0000, 0x260c,
+	0x0000, 0x270e, 0x0000, 0x270e, 0x0000, 0x2810, 0x0000, 0x2810,
+	0x0000, 0x2912, 0x0000, 0x2912, 0x0000, 0x1a60, 0x0000, 0x8062,
+	0x0008, 0x0007, 0x0000, 0x8066, 0x0000, 0x0052, 0x0000, 0x455e,
+	0x000b, 0x92c0, 0x0009, 0x0780, 0x0008, 0x0e17, 0x0003, 0x124b,
+	0x0002, 0x0967, 0x0003, 0x2e4d, 0x0002, 0x2e4d, 0x0002, 0x0a01,
+	0x0003, 0x3a46, 0x000a, 0x0d74, 0x0003, 0x5969, 0x000b, 0x8054,
+	0x0008, 0x0004, 0x0000, 0x1243, 0x000a, 0x097e, 0x000b, 0x8010,
+	0x0008, 0x000d, 0x0000, 0x01ef, 0x0004, 0x1810, 0x0000, 0x01ef,
+	0x0004, 0x017e, 0x0003, 0x194d, 0x000a, 0x0978, 0x000b, 0x1243,
+	0x000a, 0x0a0b, 0x0003, 0x5978, 0x000b, 0x8054, 0x0008, 0x0004,
+	0x0000, 0x01e4, 0x000c, 0x1810, 0x0000, 0x01ef, 0x0004, 0x8074,
+	0x0000, 0xf000, 0x0008, 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30,
+	0x0000, 0x3a42, 0x0002, 0x0d88, 0x0003, 0x15fe, 0x0008, 0x3451,
+	0x000b, 0x000a, 0x000b, 0x8074, 0x0000, 0x0501, 0x0000, 0x8010,
+	0x0008, 0x000c, 0x0008, 0x01ef, 0x0004, 0x000a, 0x000b, 0xbbe0,
+	0x0009, 0x0030, 0x0008, 0x0d9e, 0x000b, 0x18fe, 0x0000, 0x3ce0,
+	0x0009, 0x099b, 0x0003, 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x099b,
+	0x0003, 0x01df, 0x0004, 0x8076, 0x0008, 0x0040, 0x0000, 0x01dc,
+	0x000b, 0x8076, 0x0008, 0x0041, 0x0008, 0x01dc, 0x000b, 0xbbe0,
+	0x0009, 0x0032, 0x0000, 0x0da3, 0x0003, 0x3c1e, 0x0008, 0x01dc,
+	0x000b, 0xbbe0, 0x0009, 0x0037, 0x0000, 0x0dc1, 0x000b, 0x18fe,
+	0x0000, 0x3ce0, 0x0009, 0x0d9b, 0x000b, 0x8076, 0x0008, 0x0040,
+	0x0000, 0x1a60, 0x0000, 0x8062, 0x0008, 0x000d, 0x0000, 0x2604,
+	0x0008, 0x2604, 0x0008, 0x2706, 0x0008, 0x2706, 0x0008, 0x2808,
+	0x0000, 0x2808, 0x0000, 0x290a, 0x0000, 0x290a, 0x0000, 0x8066,
+	0x0000, 0x0422, 0x0000, 0x45b8, 0x0003, 0x01e4, 0x000c, 0x8054,
+	0x0008, 0x0004, 0x0000, 0x8074, 0x0000, 0xf000, 0x0008, 0x8072,
+	0x0000, 0xb000, 0x0000, 0x0182, 0x0003, 0xbbe0, 0x0009, 0x0038,
+	0x0000, 0x0dd3, 0x000b, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x09d0,
+	0x0003, 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x0d97, 0x000b, 0x01df,
+	0x0004, 0x8076, 0x0008, 0x0040, 0x0000, 0x8072, 0x0000, 0x8000,
+	0x0000, 0x0227, 0x0003, 0x8076, 0x0008, 0x0042, 0x0008, 0x01dc,
+	0x000b, 0xbbe0, 0x0009, 0x0016, 0x0000, 0x0ddc, 0x000b, 0x3a44,
+	0x0002, 0x0c0c, 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, 0x8000,
+	0x000f, 0x000a, 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, 0x000a,
+	0x000b, 0x3d30, 0x000a, 0x7f00, 0x0000, 0xbc80, 0x0001, 0x0007,
+	0x0000, 0x01e8, 0x0003, 0x1930, 0x000a, 0x7f00, 0x0000, 0x9880,
+	0x0001, 0x0007, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62,
+	0x0008, 0x8066, 0x0000, 0x000a, 0x0008, 0x45ed, 0x0003, 0x4000,
+	0x000f, 0x21ef, 0x0003, 0x0870, 0x0008, 0x4000, 0x000f, 0xbac0,
+	0x0009, 0x0090, 0x0008, 0x09f8, 0x0003, 0x8074, 0x0000, 0x0706,
+	0x0000, 0x01fa, 0x0003, 0x8074, 0x0000, 0x0703, 0x0000, 0x4000,
+	0x000f, 0x8010, 0x0008, 0x0023, 0x0000, 0x0235, 0x0003, 0x8010,
+	0x0008, 0x0008, 0x0000, 0x0235, 0x0003, 0x8010, 0x0008, 0x0022,
+	0x0008, 0x0235, 0x0003, 0x01e4, 0x000c, 0x8010, 0x0008, 0x0007,
+	0x0000, 0x01ef, 0x0004, 0x1810, 0x0000, 0x01ef, 0x0004, 0x0241,
+	0x0003, 0x01e4, 0x000c, 0x8010, 0x0008, 0x001b, 0x0008, 0x01ef,
+	0x0004, 0x1810, 0x0000, 0x01ef, 0x0004, 0x8074, 0x0000, 0xf080,
+	0x0000, 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, 0x000a,
+	0x000b, 0x8010, 0x0008, 0x0009, 0x0008, 0x0235, 0x0003, 0x8010,
+	0x0008, 0x0005, 0x0008, 0x0235, 0x0003, 0x808c, 0x0008, 0x0001,
+	0x0000, 0x8010, 0x0008, 0x0004, 0x0000, 0x4143, 0x000a, 0x085f,
+	0x0003, 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x0d2a, 0x0008, 0x0235,
+	0x0003, 0x8010, 0x0008, 0x0003, 0x0008, 0x0239, 0x0003, 0x8010,
+	0x0008, 0x000b, 0x0000, 0x0239, 0x0003, 0x8010, 0x0008, 0x0002,
+	0x0000, 0x0239, 0x0003, 0x3a47, 0x0002, 0x0d2d, 0x0003, 0x8010,
+	0x0008, 0x0006, 0x0008, 0x0239, 0x0003, 0x8074, 0x0000, 0xf000,
+	0x0008, 0x8072, 0x0000, 0x3000, 0x0008, 0x01ef, 0x0004, 0x01f2,
+	0x0004, 0x3a40, 0x000a, 0x080a, 0x0003, 0x8010, 0x0008, 0x000c,
+	0x0008, 0x01ef, 0x0004, 0x000a, 0x000b, 0x8074, 0x0000, 0xf080,
+	0x0000, 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, 0x2e4d,
+	0x0002, 0x2e4d, 0x0002, 0x0a4c, 0x0003, 0x8054, 0x0008, 0x0019,
+	0x0000, 0x000a, 0x000b, 0x8054, 0x0008, 0x0009, 0x0008, 0x000a,
+	0x000b, 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x022a, 0x000b, 0x15b6,
+	0xf4ac, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040,
+	0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000,
+	0x8000, 0xbd16
 };
 #ifdef UNIQUE_FW_NAME
-unsigned short fw2300flx_length01 = 0xd1c9;
+unsigned short fw2300flx_length01 = 0xd57a;
 #else
-unsigned short risc_code_length01 = 0xd1c9;
+unsigned short risc_code_length01 = 0xd57a;
 #endif
 
--- diff/drivers/scsi/qla2xxx/ql6322.c	2004-02-18 08:54:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/ql6322.c	2004-04-21 10:45:34.857404368 +0100
@@ -1,6 +1,6 @@
 /*
  * QLogic ISP6322 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation (www.qlogic.com)
+ * Copyright (C) 2003-2004 QLogic Corporation (www.qlogic.com)
  *
  * Released under GPL v2.
  */
--- diff/drivers/scsi/qla2xxx/ql6322_fw.c	2004-02-18 08:54:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/ql6322_fw.c	2004-04-21 10:45:34.888399656 +0100
@@ -2,7 +2,7 @@
  *                  QLOGIC LINUX SOFTWARE
  *
  * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation
+ * Copyright (C) 2003-2004 QLogic Corporation
  * (www.qlogic.com)
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -18,7 +18,7 @@
  *************************************************************************/
 
 /*
- *	Firmware Version 3.02.21 (16:27 Jan 19, 2004)
+ *	Firmware Version 3.02.26 (08:08 Mar 11, 2004)
  */
 
 #ifdef UNIQUE_FW_NAME
@@ -28,15 +28,15 @@ unsigned short risc_code_version = 3*102
 #endif
 
 #ifdef UNIQUE_FW_NAME
-unsigned char fw2322flx_version_str[] = {3, 2,21};
+unsigned char fw2322flx_version_str[] = {3, 2,26};
 #else
-unsigned char firmware_version[] = {3, 2,21};
+unsigned char firmware_version[] = {3, 2,26};
 #endif
 
 #ifdef UNIQUE_FW_NAME
-#define fw2322flx_VERSION_STRING "3.02.21"
+#define fw2322flx_VERSION_STRING "3.02.26"
 #else
-#define FW_VERSION_STRING "3.02.21"
+#define FW_VERSION_STRING "3.02.26"
 #endif
 
 #ifdef UNIQUE_FW_NAME
@@ -50,12 +50,12 @@ unsigned short fw2322flx_code01[] = { 
 #else
 unsigned short risc_code01[] = { 
 #endif
-	0x0470, 0x0000, 0x0000, 0xcc67, 0x0000, 0x0003, 0x0002, 0x0015,
+	0x0470, 0x0000, 0x0000, 0xce19, 0x0000, 0x0003, 0x0002, 0x001a,
 	0x0317, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2032, 0x3030,
 	0x3120, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241,
 	0x5449, 0x4f4e, 0x2049, 0x5350, 0x3233, 0x3030, 0x2046, 0x6972,
 	0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030,
-	0x332e, 0x3032, 0x2e32, 0x3120, 0x2020, 0x2020, 0x2400, 0x20a9,
+	0x332e, 0x3032, 0x2e32, 0x3620, 0x2020, 0x2020, 0x2400, 0x20a9,
 	0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2200, 0x20a9, 0x000f,
 	0x2001, 0x0000, 0x400f, 0x2091, 0x2400, 0x20a9, 0x000f, 0x2001,
 	0x0000, 0x400f, 0x2091, 0x2600, 0x20a9, 0x000f, 0x2001, 0x0000,
@@ -64,161 +64,161 @@ unsigned short risc_code01[] = { 
 	0x2c00, 0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2e00,
 	0x20a9, 0x000f, 0x2001, 0x0000, 0x400f, 0x2091, 0x2000, 0x2001,
 	0x0000, 0x20c1, 0x0004, 0x20c9, 0x1cff, 0x2059, 0x0000, 0x2b78,
-	0x7883, 0x0004, 0x2089, 0x289c, 0x2051, 0x1800, 0x2a70, 0x20e1,
+	0x7883, 0x0004, 0x2089, 0x28de, 0x2051, 0x1800, 0x2a70, 0x20e1,
 	0x0001, 0x20e9, 0x0001, 0x2009, 0x0000, 0x080c, 0x0e3d, 0x00f6,
-	0x7888, 0x9005, 0x11f8, 0x2061, 0xc000, 0x080c, 0x1ec7, 0x1170,
-	0x2079, 0x0300, 0x080c, 0x1edd, 0x2061, 0xe000, 0x080c, 0x1ec7,
-	0x1128, 0x2079, 0x0380, 0x080c, 0x1edd, 0x0060, 0x00fe, 0x7883,
+	0x7888, 0x9005, 0x11f8, 0x2061, 0xc000, 0x080c, 0x1efc, 0x1170,
+	0x2079, 0x0300, 0x080c, 0x1f12, 0x2061, 0xe000, 0x080c, 0x1efc,
+	0x1128, 0x2079, 0x0380, 0x080c, 0x1f12, 0x0060, 0x00fe, 0x7883,
 	0x4010, 0x7837, 0x4010, 0x7833, 0x0010, 0x2091, 0x5000, 0x2091,
 	0x4080, 0x0cf8, 0x00fe, 0x2029, 0x26c0, 0x2031, 0xffff, 0x2039,
 	0x269c, 0x2021, 0x0050, 0x20e9, 0x0001, 0x20a1, 0x0000, 0x20a9,
 	0x0800, 0x900e, 0x4104, 0x20e9, 0x0001, 0x20a1, 0x1000, 0x900e,
 	0x2001, 0x0dc1, 0x9084, 0x0fff, 0x20a8, 0x4104, 0x2001, 0x0000,
 	0x9086, 0x0000, 0x0120, 0x21a8, 0x4104, 0x8001, 0x1de0, 0x756a,
-	0x766e, 0x7766, 0x7472, 0x7476, 0x00e6, 0x2071, 0x1b1c, 0x2472,
+	0x766e, 0x7766, 0x7472, 0x7476, 0x00e6, 0x2071, 0x1b1e, 0x2472,
 	0x00ee, 0x20a1, 0x1ddc, 0x716c, 0x810d, 0x810d, 0x810d, 0x810d,
 	0x918c, 0x000f, 0x2001, 0x0001, 0x9112, 0x900e, 0x21a8, 0x4104,
 	0x8211, 0x1de0, 0x716c, 0x3400, 0x8001, 0x9102, 0x0120, 0x0218,
 	0x20a8, 0x900e, 0x4104, 0x2009, 0x1800, 0x810d, 0x810d, 0x810d,
 	0x810d, 0x810d, 0x918c, 0x001f, 0x2001, 0x0001, 0x9112, 0x20e9,
 	0x0001, 0x20a1, 0x0800, 0x900e, 0x20a9, 0x0800, 0x4104, 0x8211,
-	0x1dd8, 0x080c, 0x0f3b, 0x080c, 0x5bf0, 0x080c, 0x99fb, 0x080c,
-	0x10f2, 0x080c, 0x12cd, 0x080c, 0x1a3a, 0x080c, 0x829d, 0x080c,
-	0x0cf7, 0x080c, 0x1077, 0x080c, 0x3242, 0x080c, 0x7270, 0x080c,
-	0x65cb, 0x080c, 0x7eec, 0x080c, 0x20a8, 0x080c, 0x78ea, 0x080c,
-	0x1ef6, 0x080c, 0x2030, 0x080c, 0x209d, 0x2091, 0x3009, 0x7883,
+	0x1dd8, 0x080c, 0x0f3a, 0x080c, 0x5ce3, 0x080c, 0x9b62, 0x080c,
+	0x10f1, 0x080c, 0x12d6, 0x080c, 0x1a5a, 0x080c, 0x8418, 0x080c,
+	0x0cf7, 0x080c, 0x1076, 0x080c, 0x3284, 0x080c, 0x73c0, 0x080c,
+	0x671b, 0x080c, 0x8062, 0x080c, 0x20dd, 0x080c, 0x7a54, 0x080c,
+	0x1f2b, 0x080c, 0x2065, 0x080c, 0x20d2, 0x2091, 0x3009, 0x7883,
 	0x0000, 0x1004, 0x0941, 0x7880, 0x9086, 0x0002, 0x1190, 0x7883,
 	0x4000, 0x7837, 0x4000, 0x7833, 0x0010, 0x0e04, 0x0935, 0x2091,
 	0x5000, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c,
-	0x11b5, 0x2071, 0x1800, 0x7003, 0x0000, 0x2071, 0x1800, 0x7000,
-	0x908e, 0x0003, 0x1158, 0x080c, 0x48c0, 0x080c, 0x3269, 0x080c,
-	0x72d8, 0x080c, 0x6a73, 0x080c, 0x7f15, 0x0c78, 0x000b, 0x0c98,
+	0x11be, 0x2071, 0x1800, 0x7003, 0x0000, 0x2071, 0x1800, 0x7000,
+	0x908e, 0x0003, 0x1158, 0x080c, 0x4996, 0x080c, 0x32ab, 0x080c,
+	0x7428, 0x080c, 0x6bc3, 0x080c, 0x808b, 0x0c78, 0x000b, 0x0c98,
 	0x0962, 0x0963, 0x0afa, 0x0960, 0x0bab, 0x0cf6, 0x0cf6, 0x0cf6,
 	0x080c, 0x0d65, 0x0005, 0x0126, 0x00f6, 0x2091, 0x8000, 0x7000,
-	0x9086, 0x0001, 0x1904, 0x0acd, 0x080c, 0x0e8d, 0x080c, 0x6f5c,
-	0x0150, 0x080c, 0x6f7f, 0x15b0, 0x2079, 0x0100, 0x7828, 0x9085,
-	0x1800, 0x782a, 0x0478, 0x080c, 0x6e8d, 0x7000, 0x9086, 0x0001,
+	0x9086, 0x0001, 0x1904, 0x0acd, 0x080c, 0x0e8d, 0x080c, 0x70ac,
+	0x0150, 0x080c, 0x70cf, 0x15b0, 0x2079, 0x0100, 0x7828, 0x9085,
+	0x1800, 0x782a, 0x0478, 0x080c, 0x6fdd, 0x7000, 0x9086, 0x0001,
 	0x1904, 0x0acd, 0x7094, 0x9086, 0x0028, 0x1904, 0x0acd, 0x080c,
-	0x7ee4, 0x080c, 0x7ed6, 0x2001, 0x0161, 0x2003, 0x0001, 0x2079,
-	0x0100, 0x2011, 0xffff, 0x080c, 0x282b, 0x7a28, 0x9295, 0x5e2c,
-	0x7a2a, 0x2011, 0x6dd2, 0x080c, 0x7fbb, 0x2011, 0x6dc5, 0x080c,
-	0x80bc, 0x2011, 0x5a47, 0x080c, 0x7fbb, 0x2011, 0x8030, 0x901e,
-	0x7392, 0x04d0, 0x080c, 0x52f4, 0x2079, 0x0100, 0x7844, 0x9005,
-	0x1904, 0x0acd, 0x2011, 0x5a47, 0x080c, 0x7fbb, 0x2011, 0x6dd2,
-	0x080c, 0x7fbb, 0x2011, 0x6dc5, 0x080c, 0x80bc, 0x2001, 0x0265,
+	0x805a, 0x080c, 0x804c, 0x2001, 0x0161, 0x2003, 0x0001, 0x2079,
+	0x0100, 0x2011, 0xffff, 0x080c, 0x286d, 0x7a28, 0x9295, 0x5e2c,
+	0x7a2a, 0x2011, 0x6f22, 0x080c, 0x8131, 0x2011, 0x6f15, 0x080c,
+	0x8237, 0x2011, 0x5b3a, 0x080c, 0x8131, 0x2011, 0x8030, 0x901e,
+	0x7392, 0x04d0, 0x080c, 0x53e7, 0x2079, 0x0100, 0x7844, 0x9005,
+	0x1904, 0x0acd, 0x2011, 0x5b3a, 0x080c, 0x8131, 0x2011, 0x6f22,
+	0x080c, 0x8131, 0x2011, 0x6f15, 0x080c, 0x8237, 0x2001, 0x0265,
 	0x2001, 0x0205, 0x2003, 0x0000, 0x7840, 0x9084, 0xfffb, 0x7842,
-	0x2001, 0x1975, 0x2004, 0x9005, 0x1140, 0x00c6, 0x2061, 0x0100,
-	0x080c, 0x5b98, 0x00ce, 0x0804, 0x0acd, 0x780f, 0x006b, 0x7a28,
-	0x080c, 0x6f64, 0x0118, 0x9295, 0x5e2c, 0x0010, 0x9295, 0x402c,
-	0x7a2a, 0x2011, 0x8010, 0x73d4, 0x2001, 0x1976, 0x2003, 0x0001,
-	0x080c, 0x270a, 0x080c, 0x47fb, 0x7244, 0xc284, 0x7246, 0x2001,
+	0x2001, 0x1977, 0x2004, 0x9005, 0x1140, 0x00c6, 0x2061, 0x0100,
+	0x080c, 0x5c8b, 0x00ce, 0x0804, 0x0acd, 0x780f, 0x006b, 0x7a28,
+	0x080c, 0x70b4, 0x0118, 0x9295, 0x5e2c, 0x0010, 0x9295, 0x402c,
+	0x7a2a, 0x2011, 0x8010, 0x73d4, 0x2001, 0x1978, 0x2003, 0x0001,
+	0x080c, 0x273f, 0x080c, 0x48d1, 0x7244, 0xc284, 0x7246, 0x2001,
 	0x180c, 0x200c, 0xc1ac, 0xc1cc, 0x2102, 0x2001, 0x0390, 0x2003,
-	0x0400, 0x080c, 0x9746, 0x080c, 0x904b, 0x2011, 0x0004, 0x080c,
-	0xb6d5, 0x080c, 0x9762, 0x080c, 0x6458, 0x080c, 0x6f5c, 0x1120,
-	0x080c, 0x2758, 0x0600, 0x0420, 0x080c, 0x5b9f, 0x0140, 0x7093,
-	0x0001, 0x70cf, 0x0000, 0x080c, 0x54c1, 0x0804, 0x0acd, 0x080c,
-	0x529d, 0xd094, 0x01a8, 0x2001, 0x0390, 0x2003, 0x0404, 0x2011,
-	0x180c, 0x2204, 0xc0cd, 0x2012, 0x080c, 0x52a1, 0xd0d4, 0x1118,
-	0x080c, 0x2758, 0x1270, 0x2011, 0x180c, 0x2204, 0xc0bc, 0x0088,
-	0x080c, 0x52a1, 0xd0d4, 0x1db8, 0x2011, 0x180c, 0x2204, 0xc0bd,
-	0x0040, 0x2011, 0x180c, 0x2204, 0xc0bd, 0x2012, 0x080c, 0x6555,
-	0x0008, 0x2012, 0x080c, 0x651b, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e,
-	0x00a8, 0x707b, 0x0000, 0x080c, 0x6f5c, 0x1130, 0x70ac, 0x9005,
-	0x1168, 0x080c, 0xbb25, 0x0050, 0x080c, 0xbb25, 0x70d8, 0xd09c,
-	0x1128, 0x70ac, 0x9005, 0x0110, 0x080c, 0x5b75, 0x70e3, 0x0000,
-	0x70df, 0x0000, 0x70a3, 0x0000, 0x080c, 0x2760, 0x0228, 0x2011,
-	0x0101, 0x2204, 0xc0c4, 0x2012, 0x72d8, 0x080c, 0x6f5c, 0x1178,
+	0x0400, 0x080c, 0x98ad, 0x080c, 0x91c6, 0x2011, 0x0004, 0x080c,
+	0xb83c, 0x080c, 0x98c9, 0x080c, 0x655b, 0x080c, 0x70ac, 0x1120,
+	0x080c, 0x279a, 0x0600, 0x0420, 0x080c, 0x5c92, 0x0140, 0x7093,
+	0x0001, 0x70cf, 0x0000, 0x080c, 0x55b4, 0x0804, 0x0acd, 0x080c,
+	0x5386, 0xd094, 0x01a8, 0x2001, 0x0390, 0x2003, 0x0404, 0x2011,
+	0x180c, 0x2204, 0xc0cd, 0x2012, 0x080c, 0x538a, 0xd0d4, 0x1118,
+	0x080c, 0x279a, 0x1270, 0x2011, 0x180c, 0x2204, 0xc0bc, 0x0088,
+	0x080c, 0x538a, 0xd0d4, 0x1db8, 0x2011, 0x180c, 0x2204, 0xc0bd,
+	0x0040, 0x2011, 0x180c, 0x2204, 0xc0bd, 0x2012, 0x080c, 0x6658,
+	0x0008, 0x2012, 0x080c, 0x661e, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e,
+	0x00a8, 0x707b, 0x0000, 0x080c, 0x70ac, 0x1130, 0x70ac, 0x9005,
+	0x1168, 0x080c, 0xbc93, 0x0050, 0x080c, 0xbc93, 0x70d8, 0xd09c,
+	0x1128, 0x70ac, 0x9005, 0x0110, 0x080c, 0x5c68, 0x70e3, 0x0000,
+	0x70df, 0x0000, 0x70a3, 0x0000, 0x080c, 0x27a2, 0x0228, 0x2011,
+	0x0101, 0x2204, 0xc0c4, 0x2012, 0x72d8, 0x080c, 0x70ac, 0x1178,
 	0x9016, 0x0016, 0x2009, 0x0002, 0x2019, 0x193e, 0x211a, 0x001e,
 	0x705b, 0xffff, 0x705f, 0x00ef, 0x707f, 0x0000, 0x0020, 0x2019,
 	0x193e, 0x201b, 0x0000, 0x2079, 0x1853, 0x7804, 0xd0ac, 0x0108,
-	0xc295, 0x72da, 0x080c, 0x6f5c, 0x0118, 0x9296, 0x0004, 0x0518,
-	0x2011, 0x0001, 0x080c, 0xb6d5, 0x70a7, 0x0000, 0x70ab, 0xffff,
-	0x7003, 0x0002, 0x00fe, 0x080c, 0x2d99, 0x080c, 0x9746, 0x2011,
-	0x0005, 0x080c, 0x91a3, 0x080c, 0x9762, 0x080c, 0x6f5c, 0x0148,
+	0xc295, 0x72da, 0x080c, 0x70ac, 0x0118, 0x9296, 0x0004, 0x0518,
+	0x2011, 0x0001, 0x080c, 0xb83c, 0x70a7, 0x0000, 0x70ab, 0xffff,
+	0x7003, 0x0002, 0x00fe, 0x080c, 0x2ddb, 0x080c, 0x98ad, 0x2011,
+	0x0005, 0x080c, 0x931e, 0x080c, 0x98c9, 0x080c, 0x70ac, 0x0148,
 	0x00c6, 0x2061, 0x0100, 0x0016, 0x2009, 0x0002, 0x61e2, 0x001e,
 	0x00ce, 0x012e, 0x00e0, 0x70a7, 0x0000, 0x70ab, 0xffff, 0x7003,
-	0x0002, 0x080c, 0x9746, 0x2011, 0x0005, 0x080c, 0x91a3, 0x080c,
-	0x9762, 0x080c, 0x6f5c, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016,
+	0x0002, 0x080c, 0x98ad, 0x2011, 0x0005, 0x080c, 0x931e, 0x080c,
+	0x98c9, 0x080c, 0x70ac, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016,
 	0x2009, 0x0002, 0x61e2, 0x001e, 0x00ce, 0x00fe, 0x012e, 0x0005,
-	0x00c6, 0x00b6, 0x080c, 0x6f5c, 0x1118, 0x20a9, 0x0800, 0x0010,
-	0x20a9, 0x0782, 0x080c, 0x6f5c, 0x1110, 0x900e, 0x0010, 0x2009,
+	0x00c6, 0x00b6, 0x080c, 0x70ac, 0x1118, 0x20a9, 0x0800, 0x0010,
+	0x20a9, 0x0782, 0x080c, 0x70ac, 0x1110, 0x900e, 0x0010, 0x2009,
 	0x007e, 0x86ff, 0x0138, 0x9180, 0x1000, 0x2004, 0x905d, 0x0110,
-	0xb800, 0xd0bc, 0x090c, 0x30d1, 0x8108, 0x1f04, 0x0ae1, 0x707b,
+	0xb800, 0xd0bc, 0x090c, 0x3113, 0x8108, 0x1f04, 0x0ae1, 0x707b,
 	0x0000, 0x707c, 0x9084, 0x00ff, 0x707e, 0x70af, 0x0000, 0x00be,
 	0x00ce, 0x0005, 0x00b6, 0x0126, 0x2091, 0x8000, 0x7000, 0x9086,
 	0x0002, 0x1904, 0x0ba8, 0x70a8, 0x9086, 0xffff, 0x0120, 0x080c,
-	0x2d99, 0x0804, 0x0ba8, 0x70d8, 0xd0ac, 0x1110, 0xd09c, 0x0520,
+	0x2ddb, 0x0804, 0x0ba8, 0x70d8, 0xd0ac, 0x1110, 0xd09c, 0x0520,
 	0xd084, 0x0510, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, 0x000e,
-	0xd08c, 0x01d0, 0x70dc, 0x9086, 0xffff, 0x0190, 0x080c, 0x2f21,
-	0x70d8, 0xd094, 0x1904, 0x0ba8, 0x2011, 0x0001, 0x080c, 0xbdd7,
-	0x0110, 0x2011, 0x0003, 0x901e, 0x080c, 0x2f5b, 0x0804, 0x0ba8,
+	0xd08c, 0x01d0, 0x70dc, 0x9086, 0xffff, 0x0190, 0x080c, 0x2f63,
+	0x70d8, 0xd094, 0x1904, 0x0ba8, 0x2011, 0x0001, 0x080c, 0xbf46,
+	0x0110, 0x2011, 0x0003, 0x901e, 0x080c, 0x2f9d, 0x0804, 0x0ba8,
 	0x70e0, 0x9005, 0x1904, 0x0ba8, 0x70a4, 0x9005, 0x1904, 0x0ba8,
-	0x70d8, 0xd0a4, 0x0118, 0xd0b4, 0x0904, 0x0ba8, 0x080c, 0x651b,
-	0x1904, 0x0ba8, 0x080c, 0x656e, 0x1904, 0x0ba8, 0x080c, 0x6555,
+	0x70d8, 0xd0a4, 0x0118, 0xd0b4, 0x0904, 0x0ba8, 0x080c, 0x661e,
+	0x1904, 0x0ba8, 0x080c, 0x6671, 0x1904, 0x0ba8, 0x080c, 0x6658,
 	0x01c0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c,
-	0x6166, 0x1118, 0xb800, 0xd0ec, 0x1138, 0x001e, 0x8108, 0x1f04,
+	0x6269, 0x1118, 0xb800, 0xd0ec, 0x1138, 0x001e, 0x8108, 0x1f04,
 	0x0b4e, 0x00ce, 0x015e, 0x0028, 0x001e, 0x00ce, 0x015e, 0x0804,
 	0x0ba8, 0x0006, 0x2001, 0x0103, 0x2003, 0x006b, 0x000e, 0x2011,
-	0x1982, 0x080c, 0x0fab, 0x2011, 0x199c, 0x080c, 0x0fab, 0x7030,
+	0x1984, 0x080c, 0x0faa, 0x2011, 0x199e, 0x080c, 0x0faa, 0x7030,
 	0xc08c, 0x7032, 0x7003, 0x0003, 0x70ab, 0xffff, 0x080c, 0x0e61,
-	0x9006, 0x080c, 0x2394, 0x0036, 0x0046, 0x2019, 0xffff, 0x2021,
-	0x0006, 0x080c, 0x4998, 0x004e, 0x003e, 0x00f6, 0x2079, 0x0100,
-	0x080c, 0x6f7f, 0x0150, 0x080c, 0x6f5c, 0x7828, 0x0118, 0x9084,
-	0xe1ff, 0x0010, 0x9084, 0xffdf, 0x782a, 0x00fe, 0x080c, 0x9746,
-	0x2001, 0x19b7, 0x2004, 0x9086, 0x0005, 0x1120, 0x2011, 0x0000,
-	0x080c, 0x91a3, 0x2011, 0x0000, 0x080c, 0x91ad, 0x080c, 0x9762,
+	0x9006, 0x080c, 0x23c9, 0x0036, 0x0046, 0x2019, 0xffff, 0x2021,
+	0x0006, 0x080c, 0x4a6e, 0x004e, 0x003e, 0x00f6, 0x2079, 0x0100,
+	0x080c, 0x70cf, 0x0150, 0x080c, 0x70ac, 0x7828, 0x0118, 0x9084,
+	0xe1ff, 0x0010, 0x9084, 0xffdf, 0x782a, 0x00fe, 0x080c, 0x98ad,
+	0x2001, 0x19b9, 0x2004, 0x9086, 0x0005, 0x1120, 0x2011, 0x0000,
+	0x080c, 0x931e, 0x2011, 0x0000, 0x080c, 0x9328, 0x080c, 0x98c9,
 	0x012e, 0x00be, 0x0005, 0x0016, 0x0026, 0x0046, 0x00f6, 0x0126,
 	0x2091, 0x8000, 0x2079, 0x0100, 0x7904, 0x918c, 0xfffd, 0x7906,
-	0x2009, 0x00f7, 0x080c, 0x5b5e, 0x7940, 0x918c, 0x0010, 0x7942,
-	0x7924, 0xd1b4, 0x0120, 0x2011, 0x0040, 0x080c, 0x282b, 0xd19c,
-	0x0120, 0x2011, 0x0008, 0x080c, 0x282b, 0x0006, 0x0036, 0x0156,
-	0x0000, 0x2001, 0x1976, 0x2004, 0x9005, 0x1518, 0x080c, 0x27bf,
-	0x1148, 0x2001, 0x0001, 0x080c, 0x2739, 0x2001, 0x0001, 0x080c,
-	0x271c, 0x00b8, 0x080c, 0x27c7, 0x1138, 0x9006, 0x080c, 0x2739,
-	0x9006, 0x080c, 0x271c, 0x0068, 0x080c, 0x27cf, 0x1d50, 0x2001,
-	0x1967, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, 0x2533, 0x0804,
-	0x0ca9, 0x080c, 0x284e, 0x080c, 0x2892, 0x20a9, 0x003a, 0x1d04,
-	0x0bff, 0x080c, 0x809c, 0x1f04, 0x0bff, 0x080c, 0x6f6d, 0x0148,
-	0x080c, 0x6f7f, 0x1118, 0x080c, 0x726b, 0x0050, 0x080c, 0x6f64,
-	0x0dd0, 0x080c, 0x7266, 0x080c, 0x725c, 0x080c, 0x6e8d, 0x0020,
-	0x2009, 0x00f8, 0x080c, 0x5b5e, 0x7850, 0xc0e5, 0x7852, 0x080c,
-	0x6f5c, 0x0120, 0x7843, 0x0090, 0x7843, 0x0010, 0x2021, 0xe678,
-	0x2019, 0xea60, 0x0d0c, 0x809c, 0x7820, 0xd09c, 0x15a0, 0x080c,
-	0x6f5c, 0x0904, 0x0c8b, 0x7824, 0xd0ac, 0x1904, 0x0cae, 0x080c,
-	0x6f7f, 0x1548, 0x0046, 0x2021, 0x0320, 0x8421, 0x1df0, 0x004e,
-	0x2011, 0x1800, 0x080c, 0x282b, 0x080c, 0x27d7, 0x7824, 0x9084,
+	0x2009, 0x00f7, 0x080c, 0x5c51, 0x7940, 0x918c, 0x0010, 0x7942,
+	0x7924, 0xd1b4, 0x0120, 0x2011, 0x0040, 0x080c, 0x286d, 0xd19c,
+	0x0120, 0x2011, 0x0008, 0x080c, 0x286d, 0x0006, 0x0036, 0x0156,
+	0x0000, 0x2001, 0x1978, 0x2004, 0x9005, 0x1518, 0x080c, 0x2801,
+	0x1148, 0x2001, 0x0001, 0x080c, 0x276e, 0x2001, 0x0001, 0x080c,
+	0x2751, 0x00b8, 0x080c, 0x2809, 0x1138, 0x9006, 0x080c, 0x276e,
+	0x9006, 0x080c, 0x2751, 0x0068, 0x080c, 0x2811, 0x1d50, 0x2001,
+	0x1969, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, 0x2568, 0x0804,
+	0x0ca9, 0x080c, 0x2890, 0x080c, 0x28d4, 0x20a9, 0x003a, 0x1d04,
+	0x0bff, 0x080c, 0x8217, 0x1f04, 0x0bff, 0x080c, 0x70bd, 0x0148,
+	0x080c, 0x70cf, 0x1118, 0x080c, 0x73bb, 0x0050, 0x080c, 0x70b4,
+	0x0dd0, 0x080c, 0x73b6, 0x080c, 0x73ac, 0x080c, 0x6fdd, 0x0020,
+	0x2009, 0x00f8, 0x080c, 0x5c51, 0x7850, 0xc0e5, 0x7852, 0x080c,
+	0x70ac, 0x0120, 0x7843, 0x0090, 0x7843, 0x0010, 0x2021, 0xe678,
+	0x2019, 0xea60, 0x0d0c, 0x8217, 0x7820, 0xd09c, 0x15a0, 0x080c,
+	0x70ac, 0x0904, 0x0c8b, 0x7824, 0xd0ac, 0x1904, 0x0cae, 0x080c,
+	0x70cf, 0x1548, 0x0046, 0x2021, 0x0320, 0x8421, 0x1df0, 0x004e,
+	0x2011, 0x1800, 0x080c, 0x286d, 0x080c, 0x2819, 0x7824, 0x9084,
 	0x1800, 0x1168, 0x9484, 0x0fff, 0x1140, 0x2001, 0x1810, 0x2004,
 	0x9084, 0x9000, 0x0110, 0x080c, 0x0cd1, 0x8421, 0x1160, 0x1d04,
-	0x0c5b, 0x080c, 0x809c, 0x080c, 0x7266, 0x080c, 0x725c, 0x7003,
+	0x0c5b, 0x080c, 0x8217, 0x080c, 0x73b6, 0x080c, 0x73ac, 0x7003,
 	0x0001, 0x0804, 0x0cae, 0x8319, 0x1928, 0x2001, 0x1810, 0x2004,
 	0x9084, 0x9000, 0x0110, 0x080c, 0x0cd1, 0x1d04, 0x0c71, 0x080c,
-	0x809c, 0x2009, 0x196a, 0x2104, 0x9005, 0x0118, 0x8001, 0x200a,
-	0x1188, 0x200b, 0x000a, 0x2011, 0x0048, 0x080c, 0x282b, 0x20a9,
-	0x0002, 0x080c, 0x27b8, 0x7924, 0x080c, 0x27d7, 0xd19c, 0x0110,
-	0x080c, 0x270a, 0x00f0, 0x080c, 0x6f6d, 0x1140, 0x94a2, 0x03e8,
-	0x1128, 0x080c, 0x6f30, 0x7003, 0x0001, 0x00c0, 0x2011, 0x1800,
-	0x080c, 0x282b, 0x080c, 0x27d7, 0x7824, 0x080c, 0x6f76, 0x0110,
+	0x8217, 0x2009, 0x196c, 0x2104, 0x9005, 0x0118, 0x8001, 0x200a,
+	0x1188, 0x200b, 0x000a, 0x2011, 0x0048, 0x080c, 0x286d, 0x20a9,
+	0x0002, 0x080c, 0x27fa, 0x7924, 0x080c, 0x2819, 0xd19c, 0x0110,
+	0x080c, 0x273f, 0x00f0, 0x080c, 0x70bd, 0x1140, 0x94a2, 0x03e8,
+	0x1128, 0x080c, 0x7080, 0x7003, 0x0001, 0x00c0, 0x2011, 0x1800,
+	0x080c, 0x286d, 0x080c, 0x2819, 0x7824, 0x080c, 0x70c6, 0x0110,
 	0xd0ac, 0x1160, 0x9084, 0x1800, 0x0904, 0x0c63, 0x7003, 0x0001,
-	0x0028, 0x2001, 0x0001, 0x080c, 0x2394, 0x00a0, 0x7850, 0xc0e4,
+	0x0028, 0x2001, 0x0001, 0x080c, 0x23c9, 0x00a0, 0x7850, 0xc0e4,
 	0x7852, 0x2009, 0x180c, 0x210c, 0xd19c, 0x1120, 0x7904, 0x918d,
-	0x0002, 0x7906, 0x2011, 0x0048, 0x080c, 0x282b, 0x7828, 0x9085,
-	0x0028, 0x782a, 0x2001, 0x1976, 0x2003, 0x0000, 0x9006, 0x78f2,
+	0x0002, 0x7906, 0x2011, 0x0048, 0x080c, 0x286d, 0x7828, 0x9085,
+	0x0028, 0x782a, 0x2001, 0x1978, 0x2003, 0x0000, 0x9006, 0x78f2,
 	0x015e, 0x003e, 0x000e, 0x012e, 0x00fe, 0x004e, 0x002e, 0x001e,
 	0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x0046, 0x00b6, 0x00c6,
-	0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0071, 0x0d0c, 0x809c, 0x015e,
+	0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0071, 0x0d0c, 0x8217, 0x015e,
 	0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x004e, 0x003e, 0x002e,
 	0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x1894, 0x7004, 0x9086,
-	0x0001, 0x1110, 0x080c, 0x3269, 0x00ee, 0x0005, 0x0005, 0x2a70,
-	0x2061, 0x197a, 0x2063, 0x0003, 0x6007, 0x0002, 0x600b, 0x0015,
+	0x0001, 0x1110, 0x080c, 0x32ab, 0x00ee, 0x0005, 0x0005, 0x2a70,
+	0x2061, 0x197c, 0x2063, 0x0003, 0x6007, 0x0002, 0x600b, 0x001a,
 	0x600f, 0x0317, 0x2001, 0x194d, 0x900e, 0x2102, 0x7192, 0x2001,
 	0x0100, 0x2004, 0x9082, 0x0002, 0x0218, 0x705b, 0xffff, 0x0008,
-	0x715a, 0x7063, 0xffff, 0x717a, 0x717e, 0x080c, 0xbb25, 0x70eb,
+	0x715a, 0x7063, 0xffff, 0x717a, 0x717e, 0x080c, 0xbc93, 0x70eb,
 	0x00c0, 0x2061, 0x193d, 0x6003, 0x0909, 0x6106, 0x600b, 0x8800,
 	0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x000f, 0x611a, 0x601f,
 	0x07d0, 0x2061, 0x1945, 0x6003, 0x8000, 0x6106, 0x610a, 0x600f,
 	0x0200, 0x6013, 0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, 0x2061,
-	0x1958, 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f,
-	0x2020, 0x2001, 0x182b, 0x2102, 0x0005, 0x9016, 0x080c, 0x6166,
+	0x195a, 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f,
+	0x2020, 0x2001, 0x182b, 0x2102, 0x0005, 0x9016, 0x080c, 0x6269,
 	0x1178, 0xb804, 0x90c4, 0x00ff, 0x98c6, 0x0006, 0x0128, 0x90c4,
 	0xff00, 0x98c6, 0x0600, 0x1120, 0x9186, 0x0080, 0x0108, 0x8210,
 	0x8108, 0x9186, 0x0800, 0x1d50, 0x2208, 0x0005, 0x2091, 0x8000,
@@ -226,29 +226,29 @@ unsigned short risc_code01[] = { 
 	0x0d67, 0x0006, 0x0016, 0x2001, 0x8002, 0x0006, 0x2079, 0x0000,
 	0x000e, 0x7882, 0x7836, 0x001e, 0x798e, 0x000e, 0x788a, 0x000e,
 	0x7886, 0x3900, 0x789a, 0x7833, 0x0012, 0x2091, 0x5000, 0x0156,
-	0x00d6, 0x0036, 0x0026, 0x2079, 0x0300, 0x2069, 0x1af2, 0x7a08,
-	0x226a, 0x2069, 0x1af3, 0x7a18, 0x226a, 0x8d68, 0x7a1c, 0x226a,
-	0x782c, 0x2019, 0x1b00, 0x201a, 0x2019, 0x1b03, 0x9016, 0x7808,
-	0xd09c, 0x0168, 0x7820, 0x201a, 0x8210, 0x8318, 0x9386, 0x1b1c,
+	0x00d6, 0x0036, 0x0026, 0x2079, 0x0300, 0x2069, 0x1af4, 0x7a08,
+	0x226a, 0x2069, 0x1af5, 0x7a18, 0x226a, 0x8d68, 0x7a1c, 0x226a,
+	0x782c, 0x2019, 0x1b02, 0x201a, 0x2019, 0x1b05, 0x9016, 0x7808,
+	0xd09c, 0x0168, 0x7820, 0x201a, 0x8210, 0x8318, 0x9386, 0x1b1e,
 	0x0108, 0x0ca8, 0x7808, 0xd09c, 0x0110, 0x2011, 0xdead, 0x2019,
-	0x1b01, 0x782c, 0x201a, 0x8318, 0x221a, 0x7803, 0x0000, 0x2069,
-	0x1a48, 0x901e, 0x20a9, 0x0020, 0x7b26, 0x7a28, 0x226a, 0x8d68,
+	0x1b03, 0x782c, 0x201a, 0x8318, 0x221a, 0x7803, 0x0000, 0x2069,
+	0x1a4a, 0x901e, 0x20a9, 0x0020, 0x7b26, 0x7a28, 0x226a, 0x8d68,
 	0x8318, 0x1f04, 0x0db4, 0x0491, 0x002e, 0x003e, 0x00de, 0x015e,
 	0x2079, 0x1800, 0x7803, 0x0005, 0x2091, 0x4080, 0x2001, 0x0089,
-	0x2004, 0xd084, 0x0180, 0x2001, 0x19f1, 0x2004, 0x9005, 0x0128,
+	0x2004, 0xd084, 0x0180, 0x2001, 0x19f3, 0x2004, 0x9005, 0x0128,
 	0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003,
-	0x0002, 0x2003, 0x1001, 0x080c, 0x52ac, 0x1170, 0x080c, 0x0efb,
-	0x0110, 0x080c, 0x0e4e, 0x080c, 0x52ac, 0x1130, 0x2071, 0x1800,
+	0x0002, 0x2003, 0x1001, 0x080c, 0x5395, 0x1170, 0x080c, 0x0efb,
+	0x0110, 0x080c, 0x0e4e, 0x080c, 0x5395, 0x1130, 0x2071, 0x1800,
 	0x2011, 0x8000, 0x080c, 0x0f0f, 0x0c70, 0x0005, 0x2001, 0x0382,
 	0x2004, 0x9084, 0x0007, 0x9086, 0x0001, 0x1120, 0x2001, 0x0015,
-	0x080c, 0x9737, 0x2079, 0x0380, 0x2069, 0x1ad2, 0x7818, 0x6802,
+	0x080c, 0x989e, 0x2079, 0x0380, 0x2069, 0x1ad4, 0x7818, 0x6802,
 	0x781c, 0x6806, 0x7840, 0x680a, 0x7844, 0x680e, 0x782c, 0x6812,
-	0x2019, 0x1add, 0x9016, 0x7808, 0xd09c, 0x0150, 0x7820, 0x201a,
+	0x2019, 0x1adf, 0x9016, 0x7808, 0xd09c, 0x0150, 0x7820, 0x201a,
 	0x8210, 0x8318, 0x8210, 0x9282, 0x0011, 0x0ea8, 0x2011, 0xdead,
 	0x6a2a, 0x7830, 0x681a, 0x7834, 0x681e, 0x7838, 0x6822, 0x783c,
-	0x6826, 0x7803, 0x0000, 0x2069, 0x1a92, 0x901e, 0x20a9, 0x0020,
+	0x6826, 0x7803, 0x0000, 0x2069, 0x1a94, 0x901e, 0x20a9, 0x0020,
 	0x7b26, 0x7828, 0x206a, 0x8d68, 0x8318, 0x1f04, 0x0e28, 0x2069,
-	0x1ab2, 0x2019, 0x00b0, 0x20a9, 0x0020, 0x7b26, 0x7828, 0x206a,
+	0x1ab4, 0x2019, 0x00b0, 0x20a9, 0x0020, 0x7b26, 0x7828, 0x206a,
 	0x8d68, 0x8318, 0x1f04, 0x0e35, 0x0005, 0x918c, 0x03ff, 0x2001,
 	0x0003, 0x2004, 0x9084, 0x0600, 0x1118, 0x918d, 0x6c00, 0x0010,
 	0x918d, 0x6400, 0x2001, 0x017f, 0x2102, 0x0005, 0x0026, 0x0126,
@@ -263,7 +263,7 @@ unsigned short risc_code01[] = { 
 	0x0148, 0xd0a4, 0x1138, 0x2011, 0xcdd5, 0x0010, 0x2011, 0x0080,
 	0x080c, 0x0f00, 0x002e, 0x0005, 0x0026, 0x70ef, 0x0000, 0x080c,
 	0x0efb, 0x1130, 0x2011, 0x8040, 0x080c, 0x0f0f, 0x002e, 0x0005,
-	0x080c, 0x27cf, 0x1118, 0x2011, 0xcdc5, 0x0010, 0x2011, 0xcac2,
+	0x080c, 0x2811, 0x1118, 0x2011, 0xcdc5, 0x0010, 0x2011, 0xcac2,
 	0x080c, 0x0f00, 0x002e, 0x0005, 0x00e6, 0x0016, 0x0006, 0x2071,
 	0x1800, 0xd0b4, 0x70e8, 0x71e4, 0x1118, 0xc0e4, 0xc1f4, 0x0050,
 	0x0006, 0x3b00, 0x9084, 0xff3e, 0x20d8, 0x000e, 0x70ef, 0x0000,
@@ -281,2946 +281,2988 @@ unsigned short risc_code01[] = { 
 	0x00c1, 0x0861, 0x0005, 0x1d04, 0x0f23, 0x2091, 0x6000, 0x1f04,
 	0x0f23, 0x0005, 0x890e, 0x810e, 0x810f, 0x9194, 0x003f, 0x918c,
 	0xffc0, 0x0005, 0x0006, 0x2200, 0x914d, 0x894f, 0x894d, 0x894d,
-	0x000e, 0x000e, 0x0005, 0x01d6, 0x0146, 0x0036, 0x0096, 0x2061,
-	0x1883, 0x600b, 0x0000, 0x600f, 0x0000, 0x6003, 0x0000, 0x6007,
-	0x0000, 0x2009, 0xffc0, 0x2105, 0x0006, 0x2001, 0xaaaa, 0x200f,
-	0x2019, 0x5555, 0x9016, 0x2049, 0x0bff, 0xab02, 0xa001, 0xa001,
-	0xa800, 0x9306, 0x1138, 0x2105, 0x9306, 0x0120, 0x8210, 0x99c8,
-	0x0400, 0x0c98, 0x000e, 0x200f, 0x2001, 0x1893, 0x928a, 0x000e,
-	0x1638, 0x928a, 0x0006, 0x2011, 0x0006, 0x1210, 0x2011, 0x0000,
-	0x2202, 0x9006, 0x2008, 0x82ff, 0x01b0, 0x8200, 0x600a, 0x600f,
-	0xffff, 0x6003, 0x0002, 0x6007, 0x0000, 0x0026, 0x2019, 0x0010,
-	0x9280, 0x0001, 0x20e8, 0x21a0, 0x21a8, 0x4104, 0x8319, 0x1de0,
-	0x8211, 0x1da0, 0x002e, 0x009e, 0x003e, 0x014e, 0x01de, 0x0005,
-	0x2011, 0x000e, 0x08e8, 0x0016, 0x0026, 0x0096, 0x3348, 0x080c,
-	0x0f2a, 0x2100, 0x9300, 0x2098, 0x22e0, 0x009e, 0x002e, 0x001e,
-	0x0036, 0x3518, 0x20a9, 0x0001, 0x4002, 0x8007, 0x4004, 0x8319,
-	0x1dd8, 0x003e, 0x0005, 0x20e9, 0x0001, 0x71b4, 0x81ff, 0x11c0,
-	0x9006, 0x2009, 0x0200, 0x20a9, 0x0002, 0x9298, 0x0018, 0x23a0,
-	0x4001, 0x2009, 0x0700, 0x20a9, 0x0002, 0x9298, 0x0008, 0x23a0,
-	0x4001, 0x7078, 0x8007, 0x717c, 0x810f, 0x20a9, 0x0002, 0x4001,
-	0x9298, 0x000c, 0x23a0, 0x900e, 0x080c, 0x0d45, 0x2001, 0x0000,
-	0x810f, 0x20a9, 0x0002, 0x4001, 0x0005, 0x89ff, 0x0140, 0xa804,
-	0xa807, 0x0000, 0x0006, 0x080c, 0x1055, 0x009e, 0x0cb0, 0x0005,
-	0x00e6, 0x2071, 0x1800, 0x080c, 0x10ce, 0x090c, 0x0d65, 0x00ee,
-	0x0005, 0x0086, 0x00e6, 0x0006, 0x0026, 0x0036, 0x0126, 0x2091,
-	0x8000, 0x00c9, 0x2071, 0x1800, 0x73bc, 0x702c, 0x9016, 0x9045,
-	0x0158, 0x8210, 0x9906, 0x090c, 0x0d65, 0x2300, 0x9202, 0x0120,
-	0x1a0c, 0x0d65, 0xa000, 0x0c98, 0x012e, 0x003e, 0x002e, 0x000e,
-	0x00ee, 0x008e, 0x0005, 0x0086, 0x00e6, 0x0006, 0x0126, 0x2091,
-	0x8000, 0x2071, 0x1906, 0x7010, 0x9005, 0x0140, 0x7018, 0x9045,
-	0x0128, 0x9906, 0x090c, 0x0d65, 0xa000, 0x0cc8, 0x012e, 0x000e,
-	0x00ee, 0x008e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x0126, 0x2091,
-	0x8000, 0x70bc, 0x8001, 0x0270, 0x70be, 0x702c, 0x2048, 0x9085,
-	0x0001, 0xa800, 0x702e, 0xa803, 0x0000, 0xa807, 0x0000, 0x012e,
+	0x000e, 0x0005, 0x01d6, 0x0146, 0x0036, 0x0096, 0x2061, 0x1883,
+	0x600b, 0x0000, 0x600f, 0x0000, 0x6003, 0x0000, 0x6007, 0x0000,
+	0x2009, 0xffc0, 0x2105, 0x0006, 0x2001, 0xaaaa, 0x200f, 0x2019,
+	0x5555, 0x9016, 0x2049, 0x0bff, 0xab02, 0xa001, 0xa001, 0xa800,
+	0x9306, 0x1138, 0x2105, 0x9306, 0x0120, 0x8210, 0x99c8, 0x0400,
+	0x0c98, 0x000e, 0x200f, 0x2001, 0x1893, 0x928a, 0x000e, 0x1638,
+	0x928a, 0x0006, 0x2011, 0x0006, 0x1210, 0x2011, 0x0000, 0x2202,
+	0x9006, 0x2008, 0x82ff, 0x01b0, 0x8200, 0x600a, 0x600f, 0xffff,
+	0x6003, 0x0002, 0x6007, 0x0000, 0x0026, 0x2019, 0x0010, 0x9280,
+	0x0001, 0x20e8, 0x21a0, 0x21a8, 0x4104, 0x8319, 0x1de0, 0x8211,
+	0x1da0, 0x002e, 0x009e, 0x003e, 0x014e, 0x01de, 0x0005, 0x2011,
+	0x000e, 0x08e8, 0x0016, 0x0026, 0x0096, 0x3348, 0x080c, 0x0f2a,
+	0x2100, 0x9300, 0x2098, 0x22e0, 0x009e, 0x002e, 0x001e, 0x0036,
+	0x3518, 0x20a9, 0x0001, 0x4002, 0x8007, 0x4004, 0x8319, 0x1dd8,
+	0x003e, 0x0005, 0x20e9, 0x0001, 0x71b4, 0x81ff, 0x11c0, 0x9006,
+	0x2009, 0x0200, 0x20a9, 0x0002, 0x9298, 0x0018, 0x23a0, 0x4001,
+	0x2009, 0x0700, 0x20a9, 0x0002, 0x9298, 0x0008, 0x23a0, 0x4001,
+	0x7078, 0x8007, 0x717c, 0x810f, 0x20a9, 0x0002, 0x4001, 0x9298,
+	0x000c, 0x23a0, 0x900e, 0x080c, 0x0d45, 0x2001, 0x0000, 0x810f,
+	0x20a9, 0x0002, 0x4001, 0x0005, 0x89ff, 0x0140, 0xa804, 0xa807,
+	0x0000, 0x0006, 0x080c, 0x1054, 0x009e, 0x0cb0, 0x0005, 0x00e6,
+	0x2071, 0x1800, 0x080c, 0x10cd, 0x090c, 0x0d65, 0x00ee, 0x0005,
+	0x0086, 0x00e6, 0x0006, 0x0026, 0x0036, 0x0126, 0x2091, 0x8000,
+	0x00c9, 0x2071, 0x1800, 0x73bc, 0x702c, 0x9016, 0x9045, 0x0158,
+	0x8210, 0x9906, 0x090c, 0x0d65, 0x2300, 0x9202, 0x0120, 0x1a0c,
+	0x0d65, 0xa000, 0x0c98, 0x012e, 0x003e, 0x002e, 0x000e, 0x00ee,
+	0x008e, 0x0005, 0x0086, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000,
+	0x2071, 0x1906, 0x7010, 0x9005, 0x0140, 0x7018, 0x9045, 0x0128,
+	0x9906, 0x090c, 0x0d65, 0xa000, 0x0cc8, 0x012e, 0x000e, 0x00ee,
+	0x008e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x0126, 0x2091, 0x8000,
+	0x70bc, 0x8001, 0x0270, 0x70be, 0x702c, 0x2048, 0x9085, 0x0001,
+	0xa800, 0x702e, 0xa803, 0x0000, 0xa807, 0x0000, 0x012e, 0x00ee,
+	0x0005, 0x904e, 0x0cd8, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071,
+	0x1800, 0x70bc, 0x90ca, 0x0040, 0x0268, 0x8001, 0x70be, 0x702c,
+	0x2048, 0xa800, 0x702e, 0xa803, 0x0000, 0xa807, 0x0000, 0x012e,
 	0x00ee, 0x0005, 0x904e, 0x0cd8, 0x00e6, 0x0126, 0x2091, 0x8000,
-	0x2071, 0x1800, 0x70bc, 0x90ca, 0x0040, 0x0268, 0x8001, 0x70be,
-	0x702c, 0x2048, 0xa800, 0x702e, 0xa803, 0x0000, 0xa807, 0x0000,
-	0x012e, 0x00ee, 0x0005, 0x904e, 0x0cd8, 0x00e6, 0x0126, 0x2091,
-	0x8000, 0x0016, 0x890e, 0x810e, 0x810f, 0x9184, 0x003f, 0xa862,
-	0x9184, 0xffc0, 0xa85e, 0x001e, 0x0020, 0x00e6, 0x0126, 0x2091,
-	0x8000, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc,
-	0x8000, 0x70be, 0x080c, 0x7ed6, 0x012e, 0x00ee, 0x0005, 0x2071,
-	0x1800, 0x9026, 0x2009, 0x0000, 0x2049, 0x0400, 0x2900, 0x702e,
+	0x0016, 0x890e, 0x810e, 0x810f, 0x9184, 0x003f, 0xa862, 0x9184,
+	0xffc0, 0xa85e, 0x001e, 0x0020, 0x00e6, 0x0126, 0x2091, 0x8000,
+	0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000,
+	0x70be, 0x080c, 0x804c, 0x012e, 0x00ee, 0x0005, 0x2071, 0x1800,
+	0x9026, 0x2009, 0x0000, 0x2049, 0x0400, 0x2900, 0x702e, 0x8940,
+	0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420, 0x9886, 0x0440,
+	0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, 0x1883, 0x7000,
+	0x9005, 0x11a0, 0x2001, 0x049b, 0xa802, 0x2048, 0x2009, 0x26c0,
 	0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420, 0x9886,
-	0x0440, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, 0x1883,
-	0x7000, 0x9005, 0x11a0, 0x2001, 0x049b, 0xa802, 0x2048, 0x2009,
-	0x26c0, 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420,
-	0x9886, 0x0800, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071,
-	0x1883, 0x7104, 0x7200, 0x82ff, 0x01d0, 0x7308, 0x8318, 0x831f,
-	0x831b, 0x831b, 0x7312, 0x8319, 0x2001, 0x0800, 0xa802, 0x2048,
-	0x8900, 0xa802, 0x2040, 0xa95e, 0xaa62, 0x8420, 0x2300, 0x9906,
-	0x0130, 0x2848, 0x9188, 0x0040, 0x9291, 0x0000, 0x0c88, 0xa803,
-	0x0000, 0x2071, 0x1800, 0x74ba, 0x74be, 0x0005, 0x00e6, 0x0016,
-	0x9984, 0xfc00, 0x01e8, 0x908c, 0xf800, 0x1168, 0x9982, 0x0400,
-	0x02b8, 0x9982, 0x0440, 0x0278, 0x9982, 0x049b, 0x0288, 0x9982,
-	0x0800, 0x1270, 0x0040, 0x9982, 0x0800, 0x0250, 0x2071, 0x1883,
-	0x7010, 0x9902, 0x1228, 0x9085, 0x0001, 0x001e, 0x00ee, 0x0005,
-	0x9006, 0x0cd8, 0x00e6, 0x2071, 0x19f0, 0x7007, 0x0000, 0x9006,
-	0x701e, 0x7022, 0x7002, 0x2071, 0x0000, 0x7010, 0x9085, 0x8044,
-	0x7012, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0xa06f,
-	0x0000, 0x2071, 0x19f0, 0x701c, 0x9088, 0x19fa, 0x280a, 0x8000,
-	0x9084, 0x003f, 0x701e, 0x7120, 0x9106, 0x090c, 0x0d65, 0x7004,
-	0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x00a9, 0x00fe, 0x00ee,
-	0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0x2071, 0x19f0,
-	0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x0021, 0x00fe,
-	0x00ee, 0x012e, 0x0005, 0x7004, 0x9086, 0x0000, 0x1110, 0x7007,
-	0x0006, 0x7000, 0x0002, 0x1145, 0x1143, 0x1143, 0x1143, 0x12bc,
-	0x12bc, 0x12bc, 0x12bc, 0x080c, 0x0d65, 0x701c, 0x7120, 0x9106,
-	0x1148, 0x792c, 0x9184, 0x0001, 0x1120, 0xd1fc, 0x1110, 0x7007,
-	0x0000, 0x0005, 0x0096, 0x9180, 0x19fa, 0x2004, 0x700a, 0x2048,
-	0x8108, 0x918c, 0x003f, 0x7122, 0x782b, 0x0026, 0xa88c, 0x7802,
-	0xa890, 0x7806, 0xa894, 0x780a, 0xa898, 0x780e, 0xa878, 0x700e,
-	0xa870, 0x7016, 0xa874, 0x701a, 0xa868, 0x009e, 0xd084, 0x0120,
-	0x7007, 0x0001, 0x0029, 0x0005, 0x7007, 0x0002, 0x00b1, 0x0005,
-	0x0016, 0x0026, 0x710c, 0x2011, 0x0040, 0x9182, 0x0040, 0x1210,
-	0x2110, 0x9006, 0x700e, 0x7212, 0x8203, 0x7812, 0x782b, 0x0020,
-	0x782b, 0x0041, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x0136,
-	0x0146, 0x0156, 0x7014, 0x20e0, 0x7018, 0x2098, 0x20e9, 0x0000,
-	0x20a1, 0x0088, 0x782b, 0x0026, 0x710c, 0x2011, 0x0040, 0x9182,
-	0x0040, 0x1210, 0x2110, 0x9006, 0x700e, 0x22a8, 0x4006, 0x8203,
-	0x7812, 0x782b, 0x0020, 0x3300, 0x701a, 0x782b, 0x0001, 0x015e,
-	0x014e, 0x013e, 0x002e, 0x001e, 0x0005, 0x2009, 0x19f0, 0x2104,
-	0xc095, 0x200a, 0x080c, 0x1122, 0x0005, 0x0016, 0x00e6, 0x2071,
-	0x19f0, 0x00f6, 0x2079, 0x0080, 0x792c, 0xd1bc, 0x190c, 0x0d5e,
-	0x782b, 0x0002, 0xd1fc, 0x0120, 0x918c, 0x0700, 0x7004, 0x0023,
-	0x00fe, 0x00ee, 0x001e, 0x0005, 0x1133, 0x11db, 0x120f, 0x0d65,
-	0x0d65, 0x12c8, 0x0d65, 0x918c, 0x0700, 0x1550, 0x0136, 0x0146,
-	0x0156, 0x7014, 0x20e8, 0x7018, 0x20a0, 0x20e1, 0x0000, 0x2099,
-	0x0088, 0x782b, 0x0040, 0x7010, 0x20a8, 0x4005, 0x3400, 0x701a,
-	0x015e, 0x014e, 0x013e, 0x700c, 0x9005, 0x0578, 0x7800, 0x7802,
-	0x7804, 0x7806, 0x080c, 0x1178, 0x0005, 0x7008, 0x0096, 0x2048,
-	0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x080c, 0x1133, 0x0005,
-	0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e, 0x0ca0, 0x918c,
-	0x0700, 0x1150, 0x700c, 0x9005, 0x0180, 0x7800, 0x7802, 0x7804,
-	0x7806, 0x080c, 0x118d, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f,
-	0x0200, 0x009e, 0x7007, 0x0000, 0x0080, 0x0096, 0x7008, 0x2048,
-	0x7800, 0xa88e, 0x7804, 0xa892, 0x7808, 0xa896, 0x780c, 0xa89a,
-	0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x0096, 0x00d6, 0x7008,
-	0x2048, 0x2001, 0x18af, 0x2004, 0x9906, 0x1128, 0xa89c, 0x080f,
-	0x00de, 0x009e, 0x00a0, 0x00de, 0x009e, 0x0096, 0x00d6, 0x7008,
-	0x2048, 0x0081, 0x0150, 0xa89c, 0x0086, 0x2940, 0x080f, 0x008e,
-	0x00de, 0x009e, 0x080c, 0x1122, 0x0005, 0x00de, 0x009e, 0x080c,
-	0x1122, 0x0005, 0xa8a8, 0xd08c, 0x0005, 0x0096, 0xa0a0, 0x904d,
-	0x090c, 0x0d65, 0xa06c, 0x908e, 0x0100, 0x0130, 0xa87b, 0x0030,
-	0xa883, 0x0000, 0xa897, 0x4002, 0x080c, 0x6833, 0xa09f, 0x0000,
-	0xa0a3, 0x0000, 0x2848, 0x080c, 0x1055, 0x009e, 0x0005, 0x00a6,
-	0xa0a0, 0x904d, 0x090c, 0x0d65, 0xa06c, 0x908e, 0x0100, 0x0128,
-	0xa87b, 0x0001, 0xa883, 0x0000, 0x00c0, 0xa80c, 0x2050, 0xb004,
-	0x9005, 0x0198, 0xa80e, 0x2050, 0x8006, 0x8006, 0x8007, 0x908c,
-	0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0xa076, 0xa172, 0xb000,
-	0xa07a, 0x2810, 0x080c, 0x1103, 0x00e8, 0xa97c, 0xa894, 0x0016,
-	0x0006, 0x080c, 0x6833, 0x000e, 0x001e, 0xd1fc, 0x1138, 0xd1f4,
-	0x0128, 0x00c6, 0x2060, 0x080c, 0x9a65, 0x00ce, 0x7008, 0x2048,
-	0xa89f, 0x0000, 0xa8a3, 0x0000, 0x080c, 0x1055, 0x7007, 0x0000,
-	0x080c, 0x1122, 0x00ae, 0x0005, 0x0126, 0x2091, 0x8000, 0x782b,
-	0x1001, 0x7007, 0x0005, 0x7000, 0xc094, 0x7002, 0x012e, 0x0005,
-	0x7007, 0x0000, 0x080c, 0x1133, 0x0005, 0x0126, 0x2091, 0x2200,
-	0x2079, 0x0300, 0x2071, 0x1a3a, 0x7003, 0x0000, 0x78bf, 0x00f6,
-	0x0041, 0x7807, 0x0007, 0x7803, 0x0000, 0x7803, 0x0001, 0x012e,
-	0x0005, 0x00c6, 0x7803, 0x0000, 0x2001, 0x0165, 0x2003, 0x4198,
-	0x7808, 0xd09c, 0x0110, 0x7820, 0x0cd8, 0x2001, 0x1a3b, 0x2003,
-	0x0000, 0x78ab, 0x0004, 0x78ac, 0xd0ac, 0x1de8, 0x78ab, 0x0002,
-	0x7807, 0x0007, 0x7827, 0x0030, 0x782b, 0x0400, 0x7827, 0x0031,
-	0x782b, 0x1a48, 0x781f, 0xff00, 0x781b, 0xff00, 0x2001, 0x0200,
-	0x2004, 0xd0dc, 0x0110, 0x781f, 0x0303, 0x2061, 0x1a48, 0x602f,
-	0x1ddc, 0x2001, 0x1819, 0x2004, 0x9082, 0x1ddc, 0x6032, 0x603b,
-	0x1cca, 0x602b, 0x1a88, 0x6007, 0x1a68, 0x2061, 0x1a68, 0x00ce,
-	0x0005, 0x0126, 0x2091, 0x2200, 0x7908, 0x9184, 0x0070, 0x190c,
-	0x0d5e, 0xd19c, 0x05a0, 0x7820, 0x908c, 0xf000, 0x0540, 0x2060,
-	0x6020, 0x9086, 0x0003, 0x1550, 0x6000, 0x9086, 0x0004, 0x1530,
-	0x6114, 0x2148, 0xa876, 0xa87a, 0xa867, 0x0103, 0x080c, 0x6655,
-	0x00b6, 0x6010, 0x2058, 0xba3c, 0x8211, 0x0208, 0xba3e, 0xb8c0,
-	0x9005, 0x190c, 0x6291, 0x00be, 0x6044, 0xd0fc, 0x190c, 0x976f,
-	0x080c, 0x9a8d, 0x7808, 0xd09c, 0x19b0, 0x012e, 0x0005, 0x908a,
-	0x0024, 0x1a0c, 0x0d65, 0x002b, 0x012e, 0x0005, 0x04b0, 0x012e,
-	0x0005, 0x1385, 0x13ab, 0x13db, 0x13e0, 0x13e4, 0x13e9, 0x1411,
-	0x1415, 0x1423, 0x1427, 0x1385, 0x14b1, 0x14b5, 0x1518, 0x1385,
-	0x1385, 0x1385, 0x1385, 0x1385, 0x1385, 0x1385, 0x1385, 0x1385,
-	0x1385, 0x1385, 0x1385, 0x1385, 0x13eb, 0x1385, 0x13b3, 0x13d8,
-	0x139f, 0x1385, 0x13bf, 0x1389, 0x1387, 0x080c, 0x0d65, 0x080c,
-	0x0d5e, 0x080c, 0x151f, 0x2009, 0x1a47, 0x2104, 0x8000, 0x200a,
-	0x080c, 0x799d, 0x080c, 0x193f, 0x0005, 0x6044, 0xd0fc, 0x190c,
-	0x976f, 0x2009, 0x0055, 0x080c, 0x9b03, 0x012e, 0x0005, 0x080c,
-	0x151f, 0x2060, 0x6044, 0xd0fc, 0x190c, 0x976f, 0x2009, 0x0055,
-	0x080c, 0x9b03, 0x0005, 0x2009, 0x0048, 0x080c, 0x151f, 0x2060,
-	0x080c, 0x9b03, 0x0005, 0x2009, 0x0054, 0x080c, 0x151f, 0x2060,
-	0x6044, 0xd0fc, 0x190c, 0x976f, 0x080c, 0x9b03, 0x0005, 0x080c,
-	0x151f, 0x2060, 0x0056, 0x0066, 0x080c, 0x151f, 0x2028, 0x080c,
-	0x151f, 0x2030, 0x0036, 0x0046, 0x2021, 0x0000, 0x2418, 0x2009,
-	0x0056, 0x080c, 0x9b03, 0x004e, 0x003e, 0x006e, 0x005e, 0x0005,
-	0x080c, 0x151f, 0x0005, 0x7004, 0xc085, 0xc0b5, 0x7006, 0x0005,
-	0x7004, 0xc085, 0x7006, 0x0005, 0x080c, 0x151f, 0x080c, 0x15dc,
-	0x0005, 0x080c, 0x0d65, 0x080c, 0x151f, 0x2060, 0x6014, 0x0096,
-	0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c, 0x9b03,
-	0x2001, 0x015d, 0x2003, 0x0000, 0x2009, 0x03e8, 0x8109, 0x0160,
-	0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004,
-	0xd0ec, 0x1110, 0x080c, 0x1524, 0x2001, 0x0307, 0x2003, 0x8000,
-	0x0005, 0x7004, 0xc095, 0x7006, 0x0005, 0x080c, 0x151f, 0x2060,
-	0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048,
-	0x080c, 0x9b03, 0x0005, 0x080c, 0x151f, 0x080c, 0x0d65, 0x080c,
-	0x151f, 0x080c, 0x149c, 0x7827, 0x0018, 0x79ac, 0xd1dc, 0x0540,
-	0x7827, 0x0015, 0x7828, 0x782b, 0x0000, 0x9065, 0x0138, 0x2001,
-	0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0400, 0x7004, 0x9005,
-	0x1180, 0x78ab, 0x0004, 0x7827, 0x0018, 0x782b, 0x0000, 0xd1bc,
-	0x090c, 0x0d65, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020,
-	0x0480, 0x78ab, 0x0004, 0x7803, 0x0001, 0x080c, 0x14b5, 0x0005,
-	0x7828, 0x782b, 0x0000, 0x9065, 0x090c, 0x0d65, 0x6014, 0x2048,
-	0x78ab, 0x0004, 0x918c, 0x0700, 0x0198, 0x080c, 0x799d, 0x080c,
-	0x193f, 0x080c, 0xb6c5, 0x0158, 0xa9ac, 0xa936, 0xa9b0, 0xa93a,
-	0xa83f, 0xffff, 0xa843, 0xffff, 0xa880, 0xc0bd, 0xa882, 0x0005,
-	0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x6024, 0x190c,
-	0xbaba, 0x2029, 0x00c8, 0x8529, 0x0128, 0x2001, 0x0201, 0x2004,
-	0x9005, 0x0dc8, 0x7dbc, 0x080c, 0xd3ff, 0xd5a4, 0x1118, 0x080c,
-	0x1524, 0x0005, 0x080c, 0x799d, 0x080c, 0x193f, 0x0005, 0x781f,
-	0x0300, 0x7803, 0x0001, 0x0005, 0x0016, 0x0066, 0x0076, 0x00f6,
-	0x2079, 0x0300, 0x7908, 0x918c, 0x0007, 0x9186, 0x0003, 0x0120,
-	0x2001, 0x0016, 0x080c, 0x1595, 0x00fe, 0x007e, 0x006e, 0x001e,
-	0x0005, 0x7004, 0xc09d, 0x7006, 0x0005, 0x7104, 0x9184, 0x0004,
-	0x190c, 0x0d65, 0xd184, 0x1189, 0xd19c, 0x0158, 0xc19c, 0x7106,
-	0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x080c, 0x1524,
-	0x0005, 0x81ff, 0x190c, 0x0d65, 0x0005, 0xc184, 0xd1b4, 0xc1b4,
-	0x7106, 0x0016, 0x00e6, 0x15e0, 0x2071, 0x0200, 0x080c, 0x15d0,
-	0x6014, 0x9005, 0x05a8, 0x0096, 0x2048, 0xa864, 0x009e, 0x9084,
-	0x00ff, 0x908e, 0x0029, 0x0160, 0x908e, 0x0048, 0x1548, 0x601c,
-	0xd084, 0x11d8, 0x00f6, 0x2c78, 0x080c, 0x1646, 0x00fe, 0x00a8,
-	0x00f6, 0x2c78, 0x080c, 0x1783, 0x00fe, 0x2009, 0x01f4, 0x8109,
+	0x0800, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, 0x1883,
+	0x7104, 0x7200, 0x82ff, 0x01d0, 0x7308, 0x8318, 0x831f, 0x831b,
+	0x831b, 0x7312, 0x8319, 0x2001, 0x0800, 0xa802, 0x2048, 0x8900,
+	0xa802, 0x2040, 0xa95e, 0xaa62, 0x8420, 0x2300, 0x9906, 0x0130,
+	0x2848, 0x9188, 0x0040, 0x9291, 0x0000, 0x0c88, 0xa803, 0x0000,
+	0x2071, 0x1800, 0x74ba, 0x74be, 0x0005, 0x00e6, 0x0016, 0x9984,
+	0xfc00, 0x01e8, 0x908c, 0xf800, 0x1168, 0x9982, 0x0400, 0x02b8,
+	0x9982, 0x0440, 0x0278, 0x9982, 0x049b, 0x0288, 0x9982, 0x0800,
+	0x1270, 0x0040, 0x9982, 0x0800, 0x0250, 0x2071, 0x1883, 0x7010,
+	0x9902, 0x1228, 0x9085, 0x0001, 0x001e, 0x00ee, 0x0005, 0x9006,
+	0x0cd8, 0x00e6, 0x2071, 0x19f2, 0x7007, 0x0000, 0x9006, 0x701e,
+	0x7022, 0x7002, 0x2071, 0x0000, 0x7010, 0x9085, 0x8044, 0x7012,
+	0x2071, 0x0080, 0x9006, 0x20a9, 0x0040, 0x7022, 0x1f04, 0x1105,
+	0x702b, 0x0020, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6,
+	0xa06f, 0x0000, 0x2071, 0x19f2, 0x701c, 0x9088, 0x19fc, 0x280a,
+	0x8000, 0x9084, 0x003f, 0x701e, 0x7120, 0x9106, 0x090c, 0x0d65,
+	0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x00a9, 0x00fe,
+	0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0x2071,
+	0x19f2, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x0021,
+	0x00fe, 0x00ee, 0x012e, 0x0005, 0x7004, 0x9086, 0x0000, 0x1110,
+	0x7007, 0x0006, 0x7000, 0x0002, 0x114e, 0x114c, 0x114c, 0x114c,
+	0x12c5, 0x12c5, 0x12c5, 0x12c5, 0x080c, 0x0d65, 0x701c, 0x7120,
+	0x9106, 0x1148, 0x792c, 0x9184, 0x0001, 0x1120, 0xd1fc, 0x1110,
+	0x7007, 0x0000, 0x0005, 0x0096, 0x9180, 0x19fc, 0x2004, 0x700a,
+	0x2048, 0x8108, 0x918c, 0x003f, 0x7122, 0x782b, 0x0026, 0xa88c,
+	0x7802, 0xa890, 0x7806, 0xa894, 0x780a, 0xa898, 0x780e, 0xa878,
+	0x700e, 0xa870, 0x7016, 0xa874, 0x701a, 0xa868, 0x009e, 0xd084,
+	0x0120, 0x7007, 0x0001, 0x0029, 0x0005, 0x7007, 0x0002, 0x00b1,
+	0x0005, 0x0016, 0x0026, 0x710c, 0x2011, 0x0040, 0x9182, 0x0040,
+	0x1210, 0x2110, 0x9006, 0x700e, 0x7212, 0x8203, 0x7812, 0x782b,
+	0x0020, 0x782b, 0x0041, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026,
+	0x0136, 0x0146, 0x0156, 0x7014, 0x20e0, 0x7018, 0x2098, 0x20e9,
+	0x0000, 0x20a1, 0x0088, 0x782b, 0x0026, 0x710c, 0x2011, 0x0040,
+	0x9182, 0x0040, 0x1210, 0x2110, 0x9006, 0x700e, 0x22a8, 0x4006,
+	0x8203, 0x7812, 0x782b, 0x0020, 0x3300, 0x701a, 0x782b, 0x0001,
+	0x015e, 0x014e, 0x013e, 0x002e, 0x001e, 0x0005, 0x2009, 0x19f2,
+	0x2104, 0xc095, 0x200a, 0x080c, 0x112b, 0x0005, 0x0016, 0x00e6,
+	0x2071, 0x19f2, 0x00f6, 0x2079, 0x0080, 0x792c, 0xd1bc, 0x190c,
+	0x0d5e, 0x782b, 0x0002, 0xd1fc, 0x0120, 0x918c, 0x0700, 0x7004,
+	0x0023, 0x00fe, 0x00ee, 0x001e, 0x0005, 0x113c, 0x11e4, 0x1218,
+	0x0d65, 0x0d65, 0x12d1, 0x0d65, 0x918c, 0x0700, 0x1550, 0x0136,
+	0x0146, 0x0156, 0x7014, 0x20e8, 0x7018, 0x20a0, 0x20e1, 0x0000,
+	0x2099, 0x0088, 0x782b, 0x0040, 0x7010, 0x20a8, 0x4005, 0x3400,
+	0x701a, 0x015e, 0x014e, 0x013e, 0x700c, 0x9005, 0x0578, 0x7800,
+	0x7802, 0x7804, 0x7806, 0x080c, 0x1181, 0x0005, 0x7008, 0x0096,
+	0x2048, 0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x080c, 0x113c,
+	0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e, 0x0ca0,
+	0x918c, 0x0700, 0x1150, 0x700c, 0x9005, 0x0180, 0x7800, 0x7802,
+	0x7804, 0x7806, 0x080c, 0x1196, 0x0005, 0x7008, 0x0096, 0x2048,
+	0xa86f, 0x0200, 0x009e, 0x7007, 0x0000, 0x0080, 0x0096, 0x7008,
+	0x2048, 0x7800, 0xa88e, 0x7804, 0xa892, 0x7808, 0xa896, 0x780c,
+	0xa89a, 0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x0096, 0x00d6,
+	0x7008, 0x2048, 0x2001, 0x18af, 0x2004, 0x9906, 0x1128, 0xa89c,
+	0x080f, 0x00de, 0x009e, 0x00a0, 0x00de, 0x009e, 0x0096, 0x00d6,
+	0x7008, 0x2048, 0x0081, 0x0150, 0xa89c, 0x0086, 0x2940, 0x080f,
+	0x008e, 0x00de, 0x009e, 0x080c, 0x112b, 0x0005, 0x00de, 0x009e,
+	0x080c, 0x112b, 0x0005, 0xa8a8, 0xd08c, 0x0005, 0x0096, 0xa0a0,
+	0x904d, 0x090c, 0x0d65, 0xa06c, 0x908e, 0x0100, 0x0130, 0xa87b,
+	0x0030, 0xa883, 0x0000, 0xa897, 0x4002, 0x080c, 0x6983, 0xa09f,
+	0x0000, 0xa0a3, 0x0000, 0x2848, 0x080c, 0x1054, 0x009e, 0x0005,
+	0x00a6, 0xa0a0, 0x904d, 0x090c, 0x0d65, 0xa06c, 0x908e, 0x0100,
+	0x0128, 0xa87b, 0x0001, 0xa883, 0x0000, 0x00c0, 0xa80c, 0x2050,
+	0xb004, 0x9005, 0x0198, 0xa80e, 0x2050, 0x8006, 0x8006, 0x8007,
+	0x908c, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0xa076, 0xa172,
+	0xb000, 0xa07a, 0x2810, 0x080c, 0x110c, 0x00e8, 0xa97c, 0xa894,
+	0x0016, 0x0006, 0x080c, 0x6983, 0x000e, 0x001e, 0xd1fc, 0x1138,
+	0xd1f4, 0x0128, 0x00c6, 0x2060, 0x080c, 0x9bcc, 0x00ce, 0x7008,
+	0x2048, 0xa89f, 0x0000, 0xa8a3, 0x0000, 0x080c, 0x1054, 0x7007,
+	0x0000, 0x080c, 0x112b, 0x00ae, 0x0005, 0x0126, 0x2091, 0x8000,
+	0x782b, 0x1001, 0x7007, 0x0005, 0x7000, 0xc094, 0x7002, 0x012e,
+	0x0005, 0x7007, 0x0000, 0x080c, 0x113c, 0x0005, 0x0126, 0x2091,
+	0x2200, 0x2079, 0x0300, 0x2071, 0x1a3c, 0x7003, 0x0000, 0x78bf,
+	0x00f6, 0x0041, 0x7807, 0x0007, 0x7803, 0x0000, 0x7803, 0x0001,
+	0x012e, 0x0005, 0x00c6, 0x7803, 0x0000, 0x2001, 0x0165, 0x2003,
+	0x4198, 0x7808, 0xd09c, 0x0110, 0x7820, 0x0cd8, 0x2001, 0x1a3d,
+	0x2003, 0x0000, 0x78ab, 0x0004, 0x78ac, 0xd0ac, 0x1de8, 0x78ab,
+	0x0002, 0x7807, 0x0007, 0x7827, 0x0030, 0x782b, 0x0400, 0x7827,
+	0x0031, 0x782b, 0x1a4a, 0x781f, 0xff00, 0x781b, 0xff00, 0x2001,
+	0x0200, 0x2004, 0xd0dc, 0x0110, 0x781f, 0x0303, 0x2061, 0x1a4a,
+	0x602f, 0x1ddc, 0x2001, 0x1819, 0x2004, 0x9082, 0x1ddc, 0x6032,
+	0x603b, 0x1cf7, 0x602b, 0x1a8a, 0x6007, 0x1a6a, 0x2061, 0x1a6a,
+	0x00ce, 0x0005, 0x0126, 0x2091, 0x2200, 0x7908, 0x9184, 0x0070,
+	0x190c, 0x0d5e, 0xd19c, 0x05a0, 0x7820, 0x908c, 0xf000, 0x0540,
+	0x2060, 0x6020, 0x9086, 0x0003, 0x1550, 0x6000, 0x9086, 0x0004,
+	0x1530, 0x6114, 0x2148, 0xa876, 0xa87a, 0xa867, 0x0103, 0x080c,
+	0x67a5, 0x00b6, 0x6010, 0x2058, 0xba3c, 0x8211, 0x0208, 0xba3e,
+	0xb8c0, 0x9005, 0x190c, 0x6394, 0x00be, 0x6044, 0xd0fc, 0x190c,
+	0x98d6, 0x080c, 0x9bf4, 0x7808, 0xd09c, 0x19b0, 0x012e, 0x0005,
+	0x908a, 0x0024, 0x1a0c, 0x0d65, 0x002b, 0x012e, 0x0005, 0x04b0,
+	0x012e, 0x0005, 0x138e, 0x13b4, 0x13e4, 0x13e9, 0x13ed, 0x13f2,
+	0x141a, 0x141e, 0x142c, 0x1430, 0x138e, 0x14ba, 0x14be, 0x1521,
+	0x138e, 0x138e, 0x138e, 0x138e, 0x138e, 0x138e, 0x138e, 0x138e,
+	0x138e, 0x138e, 0x138e, 0x138e, 0x138e, 0x13f4, 0x138e, 0x13bc,
+	0x13e1, 0x13a8, 0x138e, 0x13c8, 0x1392, 0x1390, 0x080c, 0x0d65,
+	0x080c, 0x0d5e, 0x080c, 0x1528, 0x2009, 0x1a49, 0x2104, 0x8000,
+	0x200a, 0x080c, 0x7b17, 0x080c, 0x195f, 0x0005, 0x6044, 0xd0fc,
+	0x190c, 0x98d6, 0x2009, 0x0055, 0x080c, 0x9c6a, 0x012e, 0x0005,
+	0x080c, 0x1528, 0x2060, 0x6044, 0xd0fc, 0x190c, 0x98d6, 0x2009,
+	0x0055, 0x080c, 0x9c6a, 0x0005, 0x2009, 0x0048, 0x080c, 0x1528,
+	0x2060, 0x080c, 0x9c6a, 0x0005, 0x2009, 0x0054, 0x080c, 0x1528,
+	0x2060, 0x6044, 0xd0fc, 0x190c, 0x98d6, 0x080c, 0x9c6a, 0x0005,
+	0x080c, 0x1528, 0x2060, 0x0056, 0x0066, 0x080c, 0x1528, 0x2028,
+	0x080c, 0x1528, 0x2030, 0x0036, 0x0046, 0x2021, 0x0000, 0x2418,
+	0x2009, 0x0056, 0x080c, 0x9c6a, 0x004e, 0x003e, 0x006e, 0x005e,
+	0x0005, 0x080c, 0x1528, 0x0005, 0x7004, 0xc085, 0xc0b5, 0x7006,
+	0x0005, 0x7004, 0xc085, 0x7006, 0x0005, 0x080c, 0x1528, 0x080c,
+	0x15e5, 0x0005, 0x080c, 0x0d65, 0x080c, 0x1528, 0x2060, 0x6014,
+	0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c,
+	0x9c6a, 0x2001, 0x015d, 0x2003, 0x0000, 0x2009, 0x03e8, 0x8109,
 	0x0160, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218,
-	0x2004, 0xd0ec, 0x1110, 0x0401, 0x0040, 0x2001, 0x020d, 0x2003,
-	0x0020, 0x080c, 0x12e1, 0x7803, 0x0001, 0x00ee, 0x001e, 0x0005,
-	0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0069, 0x0ca8,
-	0x0031, 0x2060, 0x2009, 0x0053, 0x080c, 0x9b03, 0x0005, 0x7808,
-	0xd09c, 0x0de8, 0x7820, 0x0005, 0x080c, 0x149c, 0x00d6, 0x2069,
-	0x0200, 0x2009, 0x01f4, 0x8109, 0x0510, 0x6804, 0x9005, 0x0dd8,
-	0x2001, 0x015d, 0x2003, 0x0000, 0x79bc, 0xd1a4, 0x1528, 0x79b8,
-	0x918c, 0x0fff, 0x0180, 0x9182, 0x0841, 0x1268, 0x9188, 0x0007,
-	0x918c, 0x0ff8, 0x810c, 0x810c, 0x810c, 0x080c, 0x1587, 0x6827,
-	0x0001, 0x8109, 0x1dd0, 0x04d9, 0x6827, 0x0002, 0x04c1, 0x6804,
-	0x9005, 0x1130, 0x682c, 0xd0e4, 0x1500, 0x6804, 0x9005, 0x0de8,
-	0x79b8, 0xd1ec, 0x1130, 0x08c0, 0x080c, 0x799d, 0x080c, 0x193f,
-	0x0090, 0x7827, 0x0015, 0x782b, 0x0000, 0x7827, 0x0018, 0x782b,
-	0x0000, 0x2001, 0x020d, 0x2003, 0x0020, 0x2001, 0x0307, 0x2003,
-	0x0300, 0x7803, 0x0001, 0x00de, 0x0005, 0x682c, 0x9084, 0x5400,
-	0x9086, 0x5400, 0x0d30, 0x7827, 0x0015, 0x782b, 0x0000, 0x7803,
-	0x0001, 0x6800, 0x9085, 0x1800, 0x6802, 0x00de, 0x0005, 0x6824,
-	0x9084, 0x0003, 0x1de0, 0x0005, 0x2001, 0x0030, 0x2c08, 0x621c,
-	0x0021, 0x7830, 0x9086, 0x0041, 0x0005, 0x00f6, 0x2079, 0x0300,
-	0x0006, 0x7808, 0xd09c, 0x0140, 0x0016, 0x0026, 0x00c6, 0x080c,
-	0x1321, 0x00ce, 0x002e, 0x001e, 0x000e, 0x0006, 0x7832, 0x7936,
-	0x7a3a, 0x781b, 0x8080, 0x0059, 0x1118, 0x000e, 0x00fe, 0x0005,
-	0x000e, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c, 0x0d65, 0x2009,
-	0xff00, 0x8109, 0x0120, 0x7818, 0xd0bc, 0x1dd8, 0x0005, 0x9085,
-	0x0001, 0x0005, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x0c79,
-	0x1108, 0x0005, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c, 0x0d65,
-	0x7037, 0x0001, 0x7150, 0x7037, 0x0002, 0x7050, 0x2060, 0xd1bc,
-	0x1110, 0x7054, 0x2060, 0x0005, 0x00e6, 0x0016, 0x2071, 0x0200,
-	0x0c79, 0x6124, 0xd1dc, 0x01f8, 0x701c, 0xd08c, 0x0904, 0x163b,
-	0x7017, 0x0000, 0x2001, 0x0264, 0x2004, 0xd0bc, 0x0904, 0x163b,
-	0x2001, 0x0268, 0x00c6, 0x2064, 0x6104, 0x6038, 0x00ce, 0x918e,
-	0x0039, 0x1904, 0x163b, 0x9c06, 0x15f0, 0x0126, 0x2091, 0x2600,
-	0x080c, 0x7905, 0x012e, 0x7358, 0x745c, 0x6014, 0x905d, 0x0598,
-	0x2b48, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x190c,
-	0xba95, 0xab42, 0xac3e, 0x2001, 0x1875, 0x2004, 0xd0b4, 0x1170,
-	0x601c, 0xd0e4, 0x1158, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be,
-	0xd0bc, 0x1120, 0xa83b, 0x7fff, 0xa837, 0xffff, 0x080c, 0x1cea,
-	0x1190, 0x080c, 0x17d2, 0x2a00, 0xa816, 0x0130, 0x2800, 0xa80e,
-	0x2c05, 0xa80a, 0x2c00, 0xa812, 0x7037, 0x0020, 0x781f, 0x0300,
-	0x001e, 0x00ee, 0x0005, 0x7037, 0x0050, 0x7037, 0x0020, 0x001e,
-	0x00ee, 0x080c, 0x1524, 0x0005, 0x080c, 0x0d65, 0x0016, 0x2009,
-	0x00a0, 0x8109, 0xa001, 0xa001, 0xa001, 0x1dd8, 0x001e, 0x2cf0,
-	0x0126, 0x2091, 0x2200, 0x3e60, 0x6014, 0x2048, 0x2940, 0x903e,
-	0x2730, 0xa864, 0x2068, 0xa81a, 0x9d84, 0x000f, 0x9088, 0x1cca,
-	0x2165, 0x0002, 0x1679, 0x16c6, 0x1679, 0x1679, 0x1679, 0x16a8,
-	0x1679, 0x167d, 0x1672, 0x16bd, 0x1679, 0x1679, 0x1679, 0x1781,
-	0x1691, 0x1687, 0xa964, 0x918c, 0x00ff, 0x918e, 0x0048, 0x0904,
-	0x16bd, 0x9085, 0x0001, 0x0804, 0x1779, 0xa87c, 0xd0bc, 0x0dc8,
-	0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, 0x16cd, 0xa87c,
-	0xd0bc, 0x0d78, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804,
-	0x171c, 0xa87c, 0xd0bc, 0x0d28, 0xa890, 0xa842, 0xa88c, 0xa83e,
-	0xa804, 0x9045, 0x090c, 0x0d65, 0xa164, 0xa91a, 0x91ec, 0x000f,
-	0x9d80, 0x1cca, 0x2065, 0xa888, 0xd19c, 0x1904, 0x171c, 0x0428,
-	0xa87c, 0xd0ac, 0x0970, 0xa804, 0x9045, 0x090c, 0x0d65, 0xa164,
-	0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1cca, 0x2065, 0x9006, 0xa842,
-	0xa83e, 0xd19c, 0x1904, 0x171c, 0x0080, 0xa87c, 0xd0ac, 0x0904,
-	0x1679, 0x9006, 0xa842, 0xa83e, 0x0804, 0x171c, 0xa87c, 0xd0ac,
-	0x0904, 0x1679, 0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0036,
-	0x1a0c, 0x0d65, 0x9082, 0x001b, 0x0002, 0x16f0, 0x16f0, 0x16f2,
-	0x16f0, 0x16f0, 0x16f0, 0x16f8, 0x16f0, 0x16f0, 0x16f0, 0x16fe,
-	0x16f0, 0x16f0, 0x16f0, 0x1704, 0x16f0, 0x16f0, 0x16f0, 0x170a,
-	0x16f0, 0x16f0, 0x16f0, 0x1710, 0x16f0, 0x16f0, 0x16f0, 0x1716,
-	0x080c, 0x0d65, 0xa574, 0xa478, 0xa37c, 0xa280, 0x0804, 0x1761,
-	0xa584, 0xa488, 0xa38c, 0xa290, 0x0804, 0x1761, 0xa594, 0xa498,
-	0xa39c, 0xa2a0, 0x0804, 0x1761, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0,
-	0x0804, 0x1761, 0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x1761,
-	0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, 0x1761, 0xa5d4, 0xa4d8,
-	0xa3dc, 0xa2e0, 0x0804, 0x1761, 0x2c05, 0x908a, 0x0034, 0x1a0c,
-	0x0d65, 0x9082, 0x001b, 0x0002, 0x173f, 0x173d, 0x173d, 0x173d,
-	0x173d, 0x173d, 0x1746, 0x173d, 0x173d, 0x173d, 0x173d, 0x173d,
-	0x174d, 0x173d, 0x173d, 0x173d, 0x173d, 0x173d, 0x1754, 0x173d,
-	0x173d, 0x173d, 0x173d, 0x173d, 0x175b, 0x080c, 0x0d65, 0xa56c,
-	0xa470, 0xa774, 0xa678, 0xa37c, 0xa280, 0x00d8, 0xa584, 0xa488,
-	0xa78c, 0xa690, 0xa394, 0xa298, 0x00a0, 0xa59c, 0xa4a0, 0xa7a4,
-	0xa6a8, 0xa3ac, 0xa2b0, 0x0068, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0,
-	0xa3c4, 0xa2c8, 0x0030, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc,
-	0xa2e0, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa988,
-	0x8c60, 0x2c1d, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x8109, 0xa916,
-	0x1150, 0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c, 0xc0dd, 0xa87e,
-	0x9006, 0x012e, 0x0005, 0x2800, 0xa80e, 0xab0a, 0x2c00, 0xa812,
-	0x0c80, 0x0804, 0x1679, 0x2ff0, 0x0126, 0x2091, 0x2200, 0x3e60,
-	0x6014, 0x2048, 0x2940, 0xa80e, 0x2061, 0x1cc5, 0xa813, 0x1cc5,
-	0x2c05, 0xa80a, 0xa964, 0xa91a, 0xa87c, 0xd0ac, 0x090c, 0x0d65,
-	0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d65,
-	0xadcc, 0xacd0, 0xafd4, 0xaed8, 0xabdc, 0xaae0, 0xab2e, 0xaa32,
-	0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa8ac, 0xaab0, 0xa836, 0xaa3a,
-	0xa988, 0x918a, 0x0002, 0xa916, 0x1150, 0x3e60, 0x601c, 0xc085,
-	0x601e, 0xa87c, 0xc0dd, 0xa87e, 0x9006, 0x012e, 0x0005, 0xa804,
+	0x2004, 0xd0ec, 0x1110, 0x080c, 0x152d, 0x2001, 0x0307, 0x2003,
+	0x8000, 0x0005, 0x7004, 0xc095, 0x7006, 0x0005, 0x080c, 0x1528,
+	0x2060, 0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009,
+	0x0048, 0x080c, 0x9c6a, 0x0005, 0x080c, 0x1528, 0x080c, 0x0d65,
+	0x080c, 0x1528, 0x080c, 0x14a5, 0x7827, 0x0018, 0x79ac, 0xd1dc,
+	0x0540, 0x7827, 0x0015, 0x7828, 0x782b, 0x0000, 0x9065, 0x0138,
+	0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0400, 0x7004,
+	0x9005, 0x1180, 0x78ab, 0x0004, 0x7827, 0x0018, 0x782b, 0x0000,
+	0xd1bc, 0x090c, 0x0d65, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003,
+	0x0020, 0x0480, 0x78ab, 0x0004, 0x7803, 0x0001, 0x080c, 0x14be,
+	0x0005, 0x7828, 0x782b, 0x0000, 0x9065, 0x090c, 0x0d65, 0x6014,
+	0x2048, 0x78ab, 0x0004, 0x918c, 0x0700, 0x0198, 0x080c, 0x7b17,
+	0x080c, 0x195f, 0x080c, 0xb82c, 0x0158, 0xa9ac, 0xa936, 0xa9b0,
+	0xa93a, 0xa83f, 0xffff, 0xa843, 0xffff, 0xa880, 0xc0bd, 0xa882,
+	0x0005, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x6024,
+	0x190c, 0xbc28, 0x2029, 0x00c8, 0x8529, 0x0128, 0x2001, 0x0201,
+	0x2004, 0x9005, 0x0dc8, 0x7dbc, 0x080c, 0xd5b1, 0xd5a4, 0x1118,
+	0x080c, 0x152d, 0x0005, 0x080c, 0x7b17, 0x080c, 0x195f, 0x0005,
+	0x781f, 0x0300, 0x7803, 0x0001, 0x0005, 0x0016, 0x0066, 0x0076,
+	0x00f6, 0x2079, 0x0300, 0x7908, 0x918c, 0x0007, 0x9186, 0x0003,
+	0x0120, 0x2001, 0x0016, 0x080c, 0x159e, 0x00fe, 0x007e, 0x006e,
+	0x001e, 0x0005, 0x7004, 0xc09d, 0x7006, 0x0005, 0x7104, 0x9184,
+	0x0004, 0x190c, 0x0d65, 0xd184, 0x1189, 0xd19c, 0x0158, 0xc19c,
+	0x7106, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x080c,
+	0x152d, 0x0005, 0x81ff, 0x190c, 0x0d65, 0x0005, 0xc184, 0xd1b4,
+	0xc1b4, 0x7106, 0x0016, 0x00e6, 0x15e0, 0x2071, 0x0200, 0x080c,
+	0x15d9, 0x6014, 0x9005, 0x05a8, 0x0096, 0x2048, 0xa864, 0x009e,
+	0x9084, 0x00ff, 0x908e, 0x0029, 0x0160, 0x908e, 0x0048, 0x1548,
+	0x601c, 0xd084, 0x11d8, 0x00f6, 0x2c78, 0x080c, 0x164f, 0x00fe,
+	0x00a8, 0x00f6, 0x2c78, 0x080c, 0x1797, 0x00fe, 0x2009, 0x01f4,
+	0x8109, 0x0160, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001,
+	0x0218, 0x2004, 0xd0ec, 0x1110, 0x0401, 0x0040, 0x2001, 0x020d,
+	0x2003, 0x0020, 0x080c, 0x12ea, 0x7803, 0x0001, 0x00ee, 0x001e,
+	0x0005, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0069,
+	0x0ca8, 0x0031, 0x2060, 0x2009, 0x0053, 0x080c, 0x9c6a, 0x0005,
+	0x7808, 0xd09c, 0x0de8, 0x7820, 0x0005, 0x080c, 0x14a5, 0x00d6,
+	0x2069, 0x0200, 0x2009, 0x01f4, 0x8109, 0x0510, 0x6804, 0x9005,
+	0x0dd8, 0x2001, 0x015d, 0x2003, 0x0000, 0x79bc, 0xd1a4, 0x1528,
+	0x79b8, 0x918c, 0x0fff, 0x0180, 0x9182, 0x0841, 0x1268, 0x9188,
+	0x0007, 0x918c, 0x0ff8, 0x810c, 0x810c, 0x810c, 0x080c, 0x1590,
+	0x6827, 0x0001, 0x8109, 0x1dd0, 0x04d9, 0x6827, 0x0002, 0x04c1,
+	0x6804, 0x9005, 0x1130, 0x682c, 0xd0e4, 0x1500, 0x6804, 0x9005,
+	0x0de8, 0x79b8, 0xd1ec, 0x1130, 0x08c0, 0x080c, 0x7b17, 0x080c,
+	0x195f, 0x0090, 0x7827, 0x0015, 0x782b, 0x0000, 0x7827, 0x0018,
+	0x782b, 0x0000, 0x2001, 0x020d, 0x2003, 0x0020, 0x2001, 0x0307,
+	0x2003, 0x0300, 0x7803, 0x0001, 0x00de, 0x0005, 0x682c, 0x9084,
+	0x5400, 0x9086, 0x5400, 0x0d30, 0x7827, 0x0015, 0x782b, 0x0000,
+	0x7803, 0x0001, 0x6800, 0x9085, 0x1800, 0x6802, 0x00de, 0x0005,
+	0x6824, 0x9084, 0x0003, 0x1de0, 0x0005, 0x2001, 0x0030, 0x2c08,
+	0x621c, 0x0021, 0x7830, 0x9086, 0x0041, 0x0005, 0x00f6, 0x2079,
+	0x0300, 0x0006, 0x7808, 0xd09c, 0x0140, 0x0016, 0x0026, 0x00c6,
+	0x080c, 0x132a, 0x00ce, 0x002e, 0x001e, 0x000e, 0x0006, 0x7832,
+	0x7936, 0x7a3a, 0x781b, 0x8080, 0x0059, 0x1118, 0x000e, 0x00fe,
+	0x0005, 0x000e, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c, 0x0d65,
+	0x2009, 0xff00, 0x8109, 0x0120, 0x7818, 0xd0bc, 0x1dd8, 0x0005,
+	0x9085, 0x0001, 0x0005, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080,
+	0x0c79, 0x1108, 0x0005, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c,
+	0x0d65, 0x7037, 0x0001, 0x7150, 0x7037, 0x0002, 0x7050, 0x2060,
+	0xd1bc, 0x1110, 0x7054, 0x2060, 0x0005, 0x00e6, 0x0016, 0x2071,
+	0x0200, 0x0c79, 0x6124, 0xd1dc, 0x01f8, 0x701c, 0xd08c, 0x0904,
+	0x1644, 0x7017, 0x0000, 0x2001, 0x0264, 0x2004, 0xd0bc, 0x0904,
+	0x1644, 0x2001, 0x0268, 0x00c6, 0x2064, 0x6104, 0x6038, 0x00ce,
+	0x918e, 0x0039, 0x1904, 0x1644, 0x9c06, 0x15f0, 0x0126, 0x2091,
+	0x2600, 0x080c, 0x7a6f, 0x012e, 0x7358, 0x745c, 0x6014, 0x905d,
+	0x0598, 0x2b48, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc,
+	0x190c, 0xbc03, 0xab42, 0xac3e, 0x2001, 0x1875, 0x2004, 0xd0b4,
+	0x1170, 0x601c, 0xd0e4, 0x1158, 0x6010, 0x00b6, 0x2058, 0xb800,
+	0x00be, 0xd0bc, 0x1120, 0xa83b, 0x7fff, 0xa837, 0xffff, 0x080c,
+	0x1d17, 0x1190, 0x080c, 0x17f2, 0x2a00, 0xa816, 0x0130, 0x2800,
+	0xa80e, 0x2c05, 0xa80a, 0x2c00, 0xa812, 0x7037, 0x0020, 0x781f,
+	0x0300, 0x001e, 0x00ee, 0x0005, 0x7037, 0x0050, 0x7037, 0x0020,
+	0x001e, 0x00ee, 0x080c, 0x152d, 0x0005, 0x080c, 0x0d65, 0x0016,
+	0x2009, 0x00a0, 0x8109, 0xa001, 0xa001, 0xa001, 0x1dd8, 0x001e,
+	0x2cf0, 0x0126, 0x2091, 0x2200, 0x00c6, 0x3e60, 0x6014, 0x2048,
+	0x2940, 0x903e, 0x2730, 0xa864, 0x2068, 0xa81a, 0x9d84, 0x000f,
+	0x9088, 0x1cf7, 0x2165, 0x0002, 0x1683, 0x16d0, 0x1683, 0x1683,
+	0x1683, 0x16b2, 0x1683, 0x1687, 0x167c, 0x16c7, 0x1683, 0x1683,
+	0x1683, 0x178c, 0x169b, 0x1691, 0xa964, 0x918c, 0x00ff, 0x918e,
+	0x0048, 0x0904, 0x16c7, 0x9085, 0x0001, 0x0804, 0x1783, 0xa87c,
+	0xd0bc, 0x0dc8, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804,
+	0x16d7, 0xa87c, 0xd0bc, 0x0d78, 0xa890, 0xa842, 0xa88c, 0xa83e,
+	0xa888, 0x0804, 0x1726, 0xa87c, 0xd0bc, 0x0d28, 0xa890, 0xa842,
+	0xa88c, 0xa83e, 0xa804, 0x9045, 0x090c, 0x0d65, 0xa164, 0xa91a,
+	0x91ec, 0x000f, 0x9d80, 0x1cf7, 0x2065, 0xa888, 0xd19c, 0x1904,
+	0x1726, 0x0428, 0xa87c, 0xd0ac, 0x0970, 0xa804, 0x9045, 0x090c,
+	0x0d65, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1cf7, 0x2065,
+	0x9006, 0xa842, 0xa83e, 0xd19c, 0x1904, 0x1726, 0x0080, 0xa87c,
+	0xd0ac, 0x0904, 0x1683, 0x9006, 0xa842, 0xa83e, 0x0804, 0x1726,
+	0xa87c, 0xd0ac, 0x0904, 0x1683, 0x9006, 0xa842, 0xa83e, 0x2c05,
+	0x908a, 0x0036, 0x1a0c, 0x0d65, 0x9082, 0x001b, 0x0002, 0x16fa,
+	0x16fa, 0x16fc, 0x16fa, 0x16fa, 0x16fa, 0x1702, 0x16fa, 0x16fa,
+	0x16fa, 0x1708, 0x16fa, 0x16fa, 0x16fa, 0x170e, 0x16fa, 0x16fa,
+	0x16fa, 0x1714, 0x16fa, 0x16fa, 0x16fa, 0x171a, 0x16fa, 0x16fa,
+	0x16fa, 0x1720, 0x080c, 0x0d65, 0xa574, 0xa478, 0xa37c, 0xa280,
+	0x0804, 0x176b, 0xa584, 0xa488, 0xa38c, 0xa290, 0x0804, 0x176b,
+	0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x176b, 0xa5a4, 0xa4a8,
+	0xa3ac, 0xa2b0, 0x0804, 0x176b, 0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0,
+	0x0804, 0x176b, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, 0x176b,
+	0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x176b, 0x2c05, 0x908a,
+	0x0034, 0x1a0c, 0x0d65, 0x9082, 0x001b, 0x0002, 0x1749, 0x1747,
+	0x1747, 0x1747, 0x1747, 0x1747, 0x1750, 0x1747, 0x1747, 0x1747,
+	0x1747, 0x1747, 0x1757, 0x1747, 0x1747, 0x1747, 0x1747, 0x1747,
+	0x175e, 0x1747, 0x1747, 0x1747, 0x1747, 0x1747, 0x1765, 0x080c,
+	0x0d65, 0xa56c, 0xa470, 0xa774, 0xa678, 0xa37c, 0xa280, 0x00d8,
+	0xa584, 0xa488, 0xa78c, 0xa690, 0xa394, 0xa298, 0x00a0, 0xa59c,
+	0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, 0xa2b0, 0x0068, 0xa5b4, 0xa4b8,
+	0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8, 0x0030, 0xa5cc, 0xa4d0, 0xa7d4,
+	0xa6d8, 0xa3dc, 0xa2e0, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26,
+	0xae2a, 0xa988, 0x8c60, 0x2c1d, 0xa8ac, 0xaab0, 0xa836, 0xaa3a,
+	0x8109, 0xa916, 0x1158, 0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c,
+	0xc0dd, 0xa87e, 0x9006, 0x00ce, 0x012e, 0x0005, 0x2800, 0xa80e,
+	0xab0a, 0x2c00, 0xa812, 0x0c78, 0x0804, 0x1683, 0x0016, 0x2009,
+	0x00a0, 0x8109, 0xa001, 0xa001, 0xa001, 0x1dd8, 0x001e, 0x2ff0,
+	0x0126, 0x2091, 0x2200, 0x00c6, 0x3e60, 0x6014, 0x2048, 0x2940,
+	0xa80e, 0x2061, 0x1cf2, 0xa813, 0x1cf2, 0x2c05, 0xa80a, 0xa964,
+	0xa91a, 0xa87c, 0xd0ac, 0x090c, 0x0d65, 0x9006, 0xa842, 0xa83e,
+	0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d65, 0xadcc, 0xacd0, 0xafd4,
+	0xaed8, 0xabdc, 0xaae0, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26,
+	0xae2a, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0xa988, 0xa864, 0x9084,
+	0x00ff, 0x9086, 0x0008, 0x1120, 0x8109, 0xa916, 0x0128, 0x0078,
+	0x918a, 0x0002, 0xa916, 0x1158, 0x3e60, 0x601c, 0xc085, 0x601e,
+	0xa87c, 0xc0dd, 0xa87e, 0x9006, 0x00ce, 0x012e, 0x0005, 0xa804,
 	0x9045, 0x090c, 0x0d65, 0xa80e, 0xa064, 0xa81a, 0x9084, 0x000f,
-	0x9080, 0x1cca, 0x2015, 0x82ff, 0x090c, 0x0d65, 0xaa12, 0x2205,
-	0xa80a, 0x0c18, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00,
-	0x0002, 0x18c7, 0x1829, 0x1829, 0x18c7, 0x18c7, 0x18c1, 0x18c7,
-	0x1829, 0x18c7, 0x1878, 0x1878, 0x18c7, 0x18c7, 0x18c7, 0x18be,
-	0x1878, 0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20, 0xdd9c,
-	0x0904, 0x18c9, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d65, 0x9082,
-	0x001b, 0x0002, 0x1815, 0x1813, 0x1813, 0x1813, 0x1813, 0x1813,
-	0x1819, 0x1813, 0x1813, 0x1813, 0x1813, 0x1813, 0x181d, 0x1813,
-	0x1813, 0x1813, 0x1813, 0x1813, 0x1821, 0x1813, 0x1813, 0x1813,
-	0x1813, 0x1813, 0x1825, 0x080c, 0x0d65, 0xa774, 0xa678, 0x0804,
-	0x18c9, 0xa78c, 0xa690, 0x0804, 0x18c9, 0xa7a4, 0xa6a8, 0x0804,
-	0x18c9, 0xa7bc, 0xa6c0, 0x0804, 0x18c9, 0xa7d4, 0xa6d8, 0x0804,
-	0x18c9, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0d65, 0x9082, 0x001b,
-	0x0002, 0x184c, 0x184c, 0x184e, 0x184c, 0x184c, 0x184c, 0x1854,
-	0x184c, 0x184c, 0x184c, 0x185a, 0x184c, 0x184c, 0x184c, 0x1860,
-	0x184c, 0x184c, 0x184c, 0x1866, 0x184c, 0x184c, 0x184c, 0x186c,
-	0x184c, 0x184c, 0x184c, 0x1872, 0x080c, 0x0d65, 0xa574, 0xa478,
-	0xa37c, 0xa280, 0x0804, 0x18c9, 0xa584, 0xa488, 0xa38c, 0xa290,
-	0x0804, 0x18c9, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x18c9,
-	0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x18c9, 0xa5b4, 0xa4b8,
-	0xa3bc, 0xa2c0, 0x0804, 0x18c9, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0,
-	0x0804, 0x18c9, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x18c9,
+	0x9080, 0x1cf7, 0x2015, 0x82ff, 0x090c, 0x0d65, 0xaa12, 0x2205,
+	0xa80a, 0x0c10, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00,
+	0x0002, 0x18e7, 0x1849, 0x1849, 0x18e7, 0x18e7, 0x18e1, 0x18e7,
+	0x1849, 0x1898, 0x1898, 0x1898, 0x18e7, 0x18e7, 0x18e7, 0x18de,
+	0x1898, 0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20, 0xdd9c,
+	0x0904, 0x18e9, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d65, 0x9082,
+	0x001b, 0x0002, 0x1835, 0x1833, 0x1833, 0x1833, 0x1833, 0x1833,
+	0x1839, 0x1833, 0x1833, 0x1833, 0x1833, 0x1833, 0x183d, 0x1833,
+	0x1833, 0x1833, 0x1833, 0x1833, 0x1841, 0x1833, 0x1833, 0x1833,
+	0x1833, 0x1833, 0x1845, 0x080c, 0x0d65, 0xa774, 0xa678, 0x0804,
+	0x18e9, 0xa78c, 0xa690, 0x0804, 0x18e9, 0xa7a4, 0xa6a8, 0x0804,
+	0x18e9, 0xa7bc, 0xa6c0, 0x0804, 0x18e9, 0xa7d4, 0xa6d8, 0x0804,
+	0x18e9, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0d65, 0x9082, 0x001b,
+	0x0002, 0x186c, 0x186c, 0x186e, 0x186c, 0x186c, 0x186c, 0x1874,
+	0x186c, 0x186c, 0x186c, 0x187a, 0x186c, 0x186c, 0x186c, 0x1880,
+	0x186c, 0x186c, 0x186c, 0x1886, 0x186c, 0x186c, 0x186c, 0x188c,
+	0x186c, 0x186c, 0x186c, 0x1892, 0x080c, 0x0d65, 0xa574, 0xa478,
+	0xa37c, 0xa280, 0x0804, 0x18e9, 0xa584, 0xa488, 0xa38c, 0xa290,
+	0x0804, 0x18e9, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x18e9,
+	0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x18e9, 0xa5b4, 0xa4b8,
+	0xa3bc, 0xa2c0, 0x0804, 0x18e9, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0,
+	0x0804, 0x18e9, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x18e9,
 	0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d65, 0x9082, 0x001b, 0x0002,
-	0x189b, 0x1899, 0x1899, 0x1899, 0x1899, 0x1899, 0x18a2, 0x1899,
-	0x1899, 0x1899, 0x1899, 0x1899, 0x18a9, 0x1899, 0x1899, 0x1899,
-	0x1899, 0x1899, 0x18b0, 0x1899, 0x1899, 0x1899, 0x1899, 0x1899,
-	0x18b7, 0x080c, 0x0d65, 0xa56c, 0xa470, 0xa774, 0xa678, 0xa37c,
+	0x18bb, 0x18b9, 0x18b9, 0x18b9, 0x18b9, 0x18b9, 0x18c2, 0x18b9,
+	0x18b9, 0x18b9, 0x18b9, 0x18b9, 0x18c9, 0x18b9, 0x18b9, 0x18b9,
+	0x18b9, 0x18b9, 0x18d0, 0x18b9, 0x18b9, 0x18b9, 0x18b9, 0x18b9,
+	0x18d7, 0x080c, 0x0d65, 0xa56c, 0xa470, 0xa774, 0xa678, 0xa37c,
 	0xa280, 0x0438, 0xa584, 0xa488, 0xa78c, 0xa690, 0xa394, 0xa298,
 	0x0400, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, 0xa2b0, 0x00c8,
 	0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8, 0x0090, 0xa5cc,
 	0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, 0x0058, 0x9d86, 0x000e,
-	0x1130, 0x080c, 0x1ca0, 0x1904, 0x17d2, 0x900e, 0x0050, 0x080c,
+	0x1130, 0x080c, 0x1ccd, 0x1904, 0x17f2, 0x900e, 0x0050, 0x080c,
 	0x0d65, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0x080c,
-	0x1ca0, 0x0005, 0x6014, 0x2048, 0x6118, 0x810c, 0x810c, 0x810c,
+	0x1ccd, 0x0005, 0x6014, 0x2048, 0x6118, 0x810c, 0x810c, 0x810c,
 	0x81ff, 0x1118, 0xa887, 0x0001, 0x0008, 0xa986, 0x601b, 0x0002,
 	0xa974, 0xd1dc, 0x1108, 0x0005, 0xa934, 0xa88c, 0x9106, 0x1158,
 	0xa938, 0xa890, 0x9106, 0x1138, 0x601c, 0xc084, 0x601e, 0x2009,
-	0x0048, 0x0804, 0x9b03, 0x0005, 0x0126, 0x00c6, 0x2091, 0x2200,
+	0x0048, 0x0804, 0x9c6a, 0x0005, 0x0126, 0x00c6, 0x2091, 0x2200,
 	0x00ce, 0x7908, 0x918c, 0x0007, 0x9186, 0x0000, 0x05b0, 0x9186,
 	0x0003, 0x0598, 0x6020, 0x6023, 0x0000, 0x0006, 0x2031, 0x0008,
-	0x00c6, 0x781f, 0x0808, 0x7808, 0xd09c, 0x0120, 0x080c, 0x1321,
+	0x00c6, 0x781f, 0x0808, 0x7808, 0xd09c, 0x0120, 0x080c, 0x132a,
 	0x8631, 0x1db8, 0x00ce, 0x781f, 0x0800, 0x2031, 0x0168, 0x00c6,
-	0x7808, 0xd09c, 0x190c, 0x1321, 0x00ce, 0x2001, 0x0038, 0x080c,
-	0x19cc, 0x7930, 0x9186, 0x0040, 0x0160, 0x9186, 0x0042, 0x190c,
+	0x7808, 0xd09c, 0x190c, 0x132a, 0x00ce, 0x2001, 0x0038, 0x080c,
+	0x19ec, 0x7930, 0x9186, 0x0040, 0x0160, 0x9186, 0x0042, 0x190c,
 	0x0d65, 0x2001, 0x001e, 0x8001, 0x1df0, 0x8631, 0x1d40, 0x080c,
-	0x19db, 0x000e, 0x6022, 0x012e, 0x0005, 0x080c, 0x19c8, 0x7827,
+	0x19fb, 0x000e, 0x6022, 0x012e, 0x0005, 0x080c, 0x19e8, 0x7827,
 	0x0015, 0x7828, 0x9c06, 0x1db8, 0x782b, 0x0000, 0x0ca0, 0x00f6,
 	0x2079, 0x0300, 0x7803, 0x0000, 0x78ab, 0x0004, 0x00fe, 0x080c,
-	0x6f5c, 0x11b0, 0x2001, 0x0138, 0x2003, 0x0000, 0x2001, 0x0160,
+	0x70ac, 0x11b0, 0x2001, 0x0138, 0x2003, 0x0000, 0x2001, 0x0160,
 	0x2003, 0x0000, 0x2011, 0x012c, 0xa001, 0xa001, 0x8211, 0x1de0,
-	0x0081, 0x2001, 0x0386, 0x2003, 0x2020, 0x080c, 0x6ffd, 0x0005,
+	0x0081, 0x2001, 0x0386, 0x2003, 0x2020, 0x080c, 0x714d, 0x0005,
 	0x0479, 0x0039, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202,
-	0x0005, 0x00e6, 0x2071, 0x0200, 0x080c, 0x27e3, 0x2009, 0x003c,
-	0x080c, 0x201d, 0x2001, 0x015d, 0x2003, 0x0000, 0x7000, 0x9084,
-	0x003c, 0x1de0, 0x080c, 0x7ed6, 0x70a0, 0x70a2, 0x7098, 0x709a,
+	0x0005, 0x00e6, 0x2071, 0x0200, 0x080c, 0x2825, 0x2009, 0x003c,
+	0x080c, 0x2052, 0x2001, 0x015d, 0x2003, 0x0000, 0x7000, 0x9084,
+	0x003c, 0x1de0, 0x080c, 0x804c, 0x70a0, 0x70a2, 0x7098, 0x709a,
 	0x709c, 0x709e, 0x2001, 0x020d, 0x2003, 0x0020, 0x00f6, 0x2079,
-	0x0300, 0x080c, 0x12e1, 0x7803, 0x0001, 0x00fe, 0x00ee, 0x0005,
+	0x0300, 0x080c, 0x12ea, 0x7803, 0x0001, 0x00fe, 0x00ee, 0x0005,
 	0x2001, 0x0138, 0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c,
-	0x2003, 0x0000, 0x080c, 0x6f5c, 0x1108, 0x0005, 0x2021, 0x0260,
+	0x2003, 0x0000, 0x080c, 0x70ac, 0x1108, 0x0005, 0x2021, 0x0260,
 	0x2001, 0x0141, 0x201c, 0xd3dc, 0x1168, 0x2001, 0x0109, 0x201c,
 	0x939c, 0x0048, 0x1160, 0x2001, 0x0111, 0x201c, 0x83ff, 0x1110,
 	0x8421, 0x1d70, 0x2001, 0x015d, 0x2003, 0x0000, 0x0005, 0x0046,
 	0x2021, 0x0019, 0x2003, 0x0048, 0xa001, 0xa001, 0x201c, 0x939c,
 	0x0048, 0x0120, 0x8421, 0x1db0, 0x004e, 0x0c60, 0x004e, 0x0c40,
-	0x601c, 0xc084, 0x601e, 0x0005, 0x2c08, 0x621c, 0x080c, 0x1595,
-	0x7930, 0x0005, 0x2c08, 0x621c, 0x080c, 0x15c2, 0x7930, 0x0005,
+	0x601c, 0xc084, 0x601e, 0x0005, 0x2c08, 0x621c, 0x080c, 0x159e,
+	0x7930, 0x0005, 0x2c08, 0x621c, 0x080c, 0x15cb, 0x7930, 0x0005,
 	0x8001, 0x1df0, 0x0005, 0x2031, 0x0005, 0x781c, 0x9084, 0x0007,
-	0x0170, 0x2001, 0x0038, 0x0c41, 0x9186, 0x0040, 0x0904, 0x1a39,
+	0x0170, 0x2001, 0x0038, 0x0c41, 0x9186, 0x0040, 0x0904, 0x1a59,
 	0x2001, 0x001e, 0x0c69, 0x8631, 0x1d80, 0x080c, 0x0d65, 0x781f,
 	0x0202, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001, 0x0b10, 0x0c01,
 	0x781c, 0xd084, 0x0110, 0x0861, 0x04e0, 0x2001, 0x0030, 0x0891,
 	0x9186, 0x0040, 0x0568, 0x781c, 0xd084, 0x1da8, 0x781f, 0x0101,
 	0x2001, 0x0014, 0x0869, 0x2001, 0x0037, 0x0821, 0x9186, 0x0040,
-	0x0140, 0x2001, 0x0030, 0x080c, 0x19d2, 0x9186, 0x0040, 0x190c,
+	0x0140, 0x2001, 0x0030, 0x080c, 0x19f2, 0x9186, 0x0040, 0x190c,
 	0x0d65, 0x00d6, 0x2069, 0x0200, 0x692c, 0xd1f4, 0x1170, 0xd1c4,
 	0x0160, 0xd19c, 0x0130, 0x6800, 0x9085, 0x1800, 0x6802, 0x00de,
 	0x0080, 0x6908, 0x9184, 0x0007, 0x1db0, 0x00de, 0x781f, 0x0100,
 	0x791c, 0x9184, 0x0007, 0x090c, 0x0d65, 0xa001, 0xa001, 0x781f,
 	0x0200, 0x0005, 0x0126, 0x2091, 0x2400, 0x2079, 0x0380, 0x2001,
-	0x19b6, 0x2070, 0x012e, 0x0005, 0x2cf0, 0x0126, 0x2091, 0x2400,
+	0x19b8, 0x2070, 0x012e, 0x0005, 0x2cf0, 0x0126, 0x2091, 0x2400,
 	0x3e60, 0x6014, 0x2048, 0xa964, 0xa91a, 0x918c, 0x00ff, 0x9184,
-	0x000f, 0x0002, 0x1a62, 0x1a62, 0x1a62, 0x1a62, 0x1a62, 0x1a62,
-	0x1a62, 0x1a62, 0x1a62, 0x1a64, 0x1a62, 0x1a62, 0x1a62, 0x1a62,
-	0x1a62, 0x1a62, 0x080c, 0x0d65, 0xa87c, 0xd0b4, 0x0904, 0x1bd3,
-	0x9184, 0x000f, 0x9080, 0x1cca, 0x2015, 0x2205, 0xab88, 0x2908,
-	0xa80a, 0xa90e, 0xaa12, 0xab16, 0x9006, 0xa842, 0xa83e, 0x012e,
-	0x0005, 0x2cf0, 0x0126, 0x2091, 0x2400, 0x3e60, 0x6014, 0x2048,
-	0xa88c, 0xa990, 0xaaac, 0xabb0, 0xaa36, 0xab3a, 0xa83e, 0xa942,
-	0xa846, 0xa94a, 0xa964, 0x918c, 0x00ff, 0x9186, 0x001e, 0x0190,
-	0x2940, 0xa064, 0xa81a, 0x90ec, 0x000f, 0x9d80, 0x1cca, 0x2065,
-	0x2c05, 0x2808, 0x2c10, 0xab88, 0xa80a, 0xa90e, 0xaa12, 0xab16,
-	0x012e, 0x0005, 0xa804, 0x2040, 0x0c60, 0x2cf0, 0x0126, 0x2091,
-	0x2400, 0x3e60, 0x6014, 0x2048, 0xa97c, 0x2950, 0xd1dc, 0x1904,
-	0x1b9d, 0xc1dd, 0xa97e, 0x9006, 0xa842, 0xa83e, 0xa988, 0x8109,
-	0xa916, 0xa964, 0xa91a, 0x9184, 0x000f, 0x9088, 0x1cca, 0x2145,
-	0x0002, 0x1ad1, 0x1adf, 0x1ad1, 0x1ad1, 0x1ad1, 0x1ad3, 0x1ad1,
-	0x1ad1, 0x1b34, 0x1b34, 0x1ad1, 0x1ad1, 0x1ad1, 0x1b32, 0x1ad1,
-	0x1ad1, 0x080c, 0x0d65, 0xa804, 0x2050, 0xb164, 0xa91a, 0x9184,
-	0x000f, 0x9080, 0x1cca, 0x2045, 0xd19c, 0x1904, 0x1b34, 0x9036,
-	0x2638, 0x2805, 0x908a, 0x0036, 0x1a0c, 0x0d65, 0x9082, 0x001b,
-	0x0002, 0x1b04, 0x1b04, 0x1b06, 0x1b04, 0x1b04, 0x1b04, 0x1b0c,
-	0x1b04, 0x1b04, 0x1b04, 0x1b12, 0x1b04, 0x1b04, 0x1b04, 0x1b18,
-	0x1b04, 0x1b04, 0x1b04, 0x1b1e, 0x1b04, 0x1b04, 0x1b04, 0x1b24,
-	0x1b04, 0x1b04, 0x1b04, 0x1b2a, 0x080c, 0x0d65, 0xb574, 0xb478,
-	0xb37c, 0xb280, 0x0804, 0x1b79, 0xb584, 0xb488, 0xb38c, 0xb290,
-	0x0804, 0x1b79, 0xb594, 0xb498, 0xb39c, 0xb2a0, 0x0804, 0x1b79,
-	0xb5a4, 0xb4a8, 0xb3ac, 0xb2b0, 0x0804, 0x1b79, 0xb5b4, 0xb4b8,
-	0xb3bc, 0xb2c0, 0x0804, 0x1b79, 0xb5c4, 0xb4c8, 0xb3cc, 0xb2d0,
-	0x0804, 0x1b79, 0xb5d4, 0xb4d8, 0xb3dc, 0xb2e0, 0x0804, 0x1b79,
-	0x0804, 0x1b79, 0x080c, 0x0d65, 0x2805, 0x908a, 0x0034, 0x1a0c,
-	0x0d65, 0x9082, 0x001b, 0x0002, 0x1b57, 0x1b55, 0x1b55, 0x1b55,
-	0x1b55, 0x1b55, 0x1b5e, 0x1b55, 0x1b55, 0x1b55, 0x1b55, 0x1b55,
-	0x1b65, 0x1b55, 0x1b55, 0x1b55, 0x1b55, 0x1b55, 0x1b6c, 0x1b55,
-	0x1b55, 0x1b55, 0x1b55, 0x1b55, 0x1b73, 0x080c, 0x0d65, 0xb56c,
-	0xb470, 0xb774, 0xb678, 0xb37c, 0xb280, 0x00d8, 0xb584, 0xb488,
-	0xb78c, 0xb690, 0xb394, 0xb298, 0x00a0, 0xb59c, 0xb4a0, 0xb7a4,
-	0xb6a8, 0xb3ac, 0xb2b0, 0x0068, 0xb5b4, 0xb4b8, 0xb7bc, 0xb6c0,
-	0xb3c4, 0xb2c8, 0x0030, 0xb5cc, 0xb4d0, 0xb7d4, 0xb6d8, 0xb3dc,
-	0xb2e0, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa988,
-	0x8109, 0xa916, 0x1118, 0x9006, 0x012e, 0x0005, 0x8840, 0x2805,
-	0x9005, 0x1168, 0xb004, 0x9005, 0x090c, 0x0d65, 0x2050, 0xb164,
-	0xa91a, 0x9184, 0x000f, 0x9080, 0x1cca, 0x2045, 0x2805, 0x2810,
-	0x2a08, 0xa80a, 0xa90e, 0xaa12, 0x0c30, 0x3e60, 0x6344, 0xd3fc,
-	0x190c, 0x0d65, 0xa93c, 0xaa40, 0xa844, 0x9106, 0x1118, 0xa848,
-	0x9206, 0x0508, 0x2958, 0xab48, 0xac44, 0x2940, 0x080c, 0x1cea,
-	0x1998, 0x2850, 0x2c40, 0xab14, 0xa880, 0xd0fc, 0x1140, 0xa810,
-	0x2005, 0xa80a, 0x2a00, 0xa80e, 0x2009, 0x8015, 0x0070, 0x00c6,
-	0x3e60, 0x6044, 0xc0a4, 0x9085, 0x8005, 0x6046, 0x00ce, 0x8319,
-	0xab16, 0x1904, 0x1b86, 0x2009, 0x8005, 0x3e60, 0x6044, 0x9105,
-	0x6046, 0x0804, 0x1b83, 0x080c, 0x0d65, 0x00f6, 0x00e6, 0x0096,
-	0x00c6, 0x0026, 0x704c, 0x9c06, 0x190c, 0x0d65, 0x2079, 0x0090,
-	0x2001, 0x0105, 0x2003, 0x0010, 0x782b, 0x0004, 0x7057, 0x0000,
-	0x6014, 0x2048, 0x080c, 0xb6c5, 0x0118, 0xa880, 0xc0bd, 0xa882,
-	0x6020, 0x9086, 0x0006, 0x1170, 0x2061, 0x0100, 0x62c8, 0x2001,
-	0x00fa, 0x8001, 0x1df0, 0x60c8, 0x9206, 0x1dc0, 0x60c4, 0xa89a,
-	0x60c8, 0xa896, 0x704c, 0x2060, 0x00c6, 0x080c, 0xb2d0, 0x080c,
-	0x9746, 0x00ce, 0x704c, 0x9c06, 0x1150, 0x2009, 0x0040, 0x080c,
-	0x201d, 0x080c, 0x9336, 0x2011, 0x0000, 0x080c, 0x91ad, 0x002e,
-	0x00ce, 0x009e, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0090,
-	0x781c, 0x0006, 0x7818, 0x0006, 0x2079, 0x0100, 0x7a14, 0x9284,
-	0x1984, 0x9085, 0x0012, 0x7816, 0x2019, 0x1000, 0x8319, 0x090c,
-	0x0d65, 0x7820, 0xd0bc, 0x1dd0, 0x79c8, 0x000e, 0x9102, 0x001e,
-	0x0006, 0x0016, 0x79c4, 0x000e, 0x9103, 0x78c6, 0x000e, 0x78ca,
-	0x9284, 0x1984, 0x9085, 0x0012, 0x7816, 0x2079, 0x0090, 0x782b,
-	0x0008, 0x7057, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x2071,
-	0x19b6, 0x7054, 0x9086, 0x0000, 0x0904, 0x1c9b, 0x2079, 0x0090,
-	0x2009, 0x0207, 0x210c, 0xd194, 0x01b8, 0x2009, 0x020c, 0x210c,
-	0x9184, 0x0003, 0x0188, 0x080c, 0xd448, 0x2001, 0x0133, 0x2004,
-	0x9005, 0x090c, 0x0d65, 0x0016, 0x2009, 0x0040, 0x080c, 0x201d,
-	0x001e, 0x2001, 0x020c, 0x2102, 0x2009, 0x0206, 0x2104, 0x2009,
-	0x0203, 0x210c, 0x9106, 0x1120, 0x2009, 0x0040, 0x080c, 0x201d,
-	0x782c, 0xd0fc, 0x09a8, 0x080c, 0x9762, 0x782c, 0xd0fc, 0x1de8,
-	0x080c, 0x9746, 0x7054, 0x9086, 0x0000, 0x1950, 0x782b, 0x0004,
-	0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x201d, 0x782b,
-	0x0002, 0x7057, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x080c, 0x0d65,
-	0x8c60, 0x2c05, 0x9005, 0x0110, 0x8a51, 0x0005, 0xa004, 0x9005,
-	0x0168, 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, 0x1cca,
-	0x2065, 0x8cff, 0x090c, 0x0d65, 0x8a51, 0x0005, 0x2050, 0x0005,
-	0x0000, 0x001d, 0x0021, 0x0025, 0x0029, 0x002d, 0x0031, 0x0035,
-	0x0000, 0x001b, 0x0021, 0x0027, 0x002d, 0x0033, 0x0000, 0x0000,
-	0x0023, 0x0000, 0x0000, 0x1cbd, 0x1cb9, 0x0000, 0x0000, 0x1cc7,
-	0x0000, 0x1cbd, 0x1cc4, 0x1cc4, 0x1cc1, 0x0000, 0x0000, 0x0000,
-	0x1cc7, 0x1cc4, 0x0000, 0x1cbf, 0x1cbf, 0x0000, 0x0000, 0x1cc7,
-	0x0000, 0x1cbf, 0x1cc5, 0x1cc5, 0x1cc5, 0x0000, 0x0000, 0x0000,
-	0x1cc7, 0x1cc5, 0x00c6, 0x00d6, 0x0086, 0xab42, 0xac3e, 0xa888,
-	0x9055, 0x0904, 0x1ec1, 0x2940, 0xa064, 0x90ec, 0x000f, 0x9de0,
-	0x1cca, 0x9d86, 0x0007, 0x0130, 0x9d86, 0x000e, 0x0118, 0x9d86,
-	0x000f, 0x1120, 0xa08c, 0x9422, 0xa090, 0x931b, 0x2c05, 0x9065,
-	0x1140, 0x0310, 0x0804, 0x1ec1, 0xa004, 0x9045, 0x0904, 0x1ec1,
-	0x0c18, 0x2c05, 0x9005, 0x0904, 0x1da9, 0xdd9c, 0x1904, 0x1d65,
-	0x908a, 0x0036, 0x1a0c, 0x0d65, 0x9082, 0x001b, 0x0002, 0x1d3a,
-	0x1d3a, 0x1d3c, 0x1d3a, 0x1d3a, 0x1d3a, 0x1d42, 0x1d3a, 0x1d3a,
-	0x1d3a, 0x1d48, 0x1d3a, 0x1d3a, 0x1d3a, 0x1d4e, 0x1d3a, 0x1d3a,
-	0x1d3a, 0x1d54, 0x1d3a, 0x1d3a, 0x1d3a, 0x1d5a, 0x1d3a, 0x1d3a,
-	0x1d3a, 0x1d60, 0x080c, 0x0d65, 0xa07c, 0x9422, 0xa080, 0x931b,
-	0x0804, 0x1d9f, 0xa08c, 0x9422, 0xa090, 0x931b, 0x0804, 0x1d9f,
-	0xa09c, 0x9422, 0xa0a0, 0x931b, 0x0804, 0x1d9f, 0xa0ac, 0x9422,
-	0xa0b0, 0x931b, 0x0804, 0x1d9f, 0xa0bc, 0x9422, 0xa0c0, 0x931b,
-	0x0804, 0x1d9f, 0xa0cc, 0x9422, 0xa0d0, 0x931b, 0x0804, 0x1d9f,
-	0xa0dc, 0x9422, 0xa0e0, 0x931b, 0x04d0, 0x908a, 0x0034, 0x1a0c,
-	0x0d65, 0x9082, 0x001b, 0x0002, 0x1d87, 0x1d85, 0x1d85, 0x1d85,
-	0x1d85, 0x1d85, 0x1d8c, 0x1d85, 0x1d85, 0x1d85, 0x1d85, 0x1d85,
-	0x1d91, 0x1d85, 0x1d85, 0x1d85, 0x1d85, 0x1d85, 0x1d96, 0x1d85,
-	0x1d85, 0x1d85, 0x1d85, 0x1d85, 0x1d9b, 0x080c, 0x0d65, 0xa07c,
-	0x9422, 0xa080, 0x931b, 0x0098, 0xa094, 0x9422, 0xa098, 0x931b,
-	0x0070, 0xa0ac, 0x9422, 0xa0b0, 0x931b, 0x0048, 0xa0c4, 0x9422,
-	0xa0c8, 0x931b, 0x0020, 0xa0dc, 0x9422, 0xa0e0, 0x931b, 0x0630,
-	0x2300, 0x9405, 0x0160, 0x8a51, 0x0904, 0x1ec1, 0x8c60, 0x0804,
-	0x1d11, 0xa004, 0x9045, 0x0904, 0x1ec1, 0x0804, 0x1cf4, 0x8a51,
-	0x0904, 0x1ec1, 0x8c60, 0x2c05, 0x9005, 0x1158, 0xa004, 0x9045,
-	0x0904, 0x1ec1, 0xa064, 0x90ec, 0x000f, 0x9de0, 0x1cca, 0x2c05,
-	0x2060, 0xa880, 0xc0fc, 0xa882, 0x0804, 0x1eb6, 0x2c05, 0x8422,
-	0x8420, 0x831a, 0x9399, 0x0000, 0xac2e, 0xab32, 0xdd9c, 0x1904,
-	0x1e53, 0x9082, 0x001b, 0x0002, 0x1def, 0x1def, 0x1df1, 0x1def,
-	0x1def, 0x1def, 0x1dff, 0x1def, 0x1def, 0x1def, 0x1e0d, 0x1def,
-	0x1def, 0x1def, 0x1e1b, 0x1def, 0x1def, 0x1def, 0x1e29, 0x1def,
-	0x1def, 0x1def, 0x1e37, 0x1def, 0x1def, 0x1def, 0x1e45, 0x080c,
-	0x0d65, 0xa17c, 0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c,
-	0x0d65, 0xa074, 0x9420, 0xa078, 0x9319, 0x0804, 0x1eb1, 0xa18c,
-	0x2400, 0x9122, 0xa190, 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa084,
-	0x9420, 0xa088, 0x9319, 0x0804, 0x1eb1, 0xa19c, 0x2400, 0x9122,
-	0xa1a0, 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa094, 0x9420, 0xa098,
-	0x9319, 0x0804, 0x1eb1, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300,
-	0x911b, 0x0a0c, 0x0d65, 0xa0a4, 0x9420, 0xa0a8, 0x9319, 0x0804,
-	0x1eb1, 0xa1bc, 0x2400, 0x9122, 0xa1c0, 0x2300, 0x911b, 0x0a0c,
-	0x0d65, 0xa0b4, 0x9420, 0xa0b8, 0x9319, 0x0804, 0x1eb1, 0xa1cc,
-	0x2400, 0x9122, 0xa1d0, 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa0c4,
-	0x9420, 0xa0c8, 0x9319, 0x0804, 0x1eb1, 0xa1dc, 0x2400, 0x9122,
-	0xa1e0, 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa0d4, 0x9420, 0xa0d8,
-	0x9319, 0x0804, 0x1eb1, 0x9082, 0x001b, 0x0002, 0x1e71, 0x1e6f,
-	0x1e6f, 0x1e6f, 0x1e6f, 0x1e6f, 0x1e7e, 0x1e6f, 0x1e6f, 0x1e6f,
-	0x1e6f, 0x1e6f, 0x1e8b, 0x1e6f, 0x1e6f, 0x1e6f, 0x1e6f, 0x1e6f,
-	0x1e98, 0x1e6f, 0x1e6f, 0x1e6f, 0x1e6f, 0x1e6f, 0x1ea5, 0x080c,
-	0x0d65, 0xa17c, 0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c,
-	0x0d65, 0xa06c, 0x9420, 0xa070, 0x9319, 0x0498, 0xa194, 0x2400,
-	0x9122, 0xa198, 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa084, 0x9420,
-	0xa088, 0x9319, 0x0430, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300,
-	0x911b, 0x0a0c, 0x0d65, 0xa09c, 0x9420, 0xa0a0, 0x9319, 0x00c8,
-	0xa1c4, 0x2400, 0x9122, 0xa1c8, 0x2300, 0x911b, 0x0a0c, 0x0d65,
-	0xa0b4, 0x9420, 0xa0b8, 0x9319, 0x0060, 0xa1dc, 0x2400, 0x9122,
-	0xa1e0, 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa0cc, 0x9420, 0xa0d0,
-	0x9319, 0xac1e, 0xab22, 0xa880, 0xc0fd, 0xa882, 0x2800, 0xa85a,
-	0x2c00, 0xa812, 0x2a00, 0xa816, 0x000e, 0x000e, 0x000e, 0x9006,
-	0x0028, 0x008e, 0x00de, 0x00ce, 0x9085, 0x0001, 0x0005, 0x00c6,
-	0x610c, 0x0016, 0x9026, 0x2410, 0x6004, 0x9420, 0x9291, 0x0000,
-	0x2c04, 0x9210, 0x9ce0, 0x0002, 0x918a, 0x0002, 0x1da8, 0x9284,
-	0x000f, 0x9405, 0x001e, 0x00ce, 0x0005, 0x7803, 0x0003, 0x780f,
-	0x0000, 0x6004, 0x7812, 0x2c04, 0x7816, 0x9ce0, 0x0002, 0x918a,
-	0x0002, 0x1db8, 0x0005, 0x2001, 0x0005, 0x2004, 0xd0bc, 0x190c,
-	0x0d5e, 0xd094, 0x0110, 0x080c, 0x11bd, 0x0005, 0x0126, 0x2091,
-	0x2600, 0x2079, 0x0200, 0x2071, 0x0260, 0x2069, 0x1800, 0x7817,
-	0x0000, 0x789b, 0x0814, 0x78a3, 0x0406, 0x789f, 0x0410, 0x2009,
-	0x013b, 0x200b, 0x0400, 0x781b, 0x0002, 0x783b, 0x001f, 0x7837,
-	0x0020, 0x7803, 0x1600, 0x012e, 0x0005, 0x2091, 0x2600, 0x781c,
-	0xd0a4, 0x190c, 0x201a, 0x7900, 0xd1dc, 0x1118, 0x9084, 0x0006,
-	0x001a, 0x9084, 0x000e, 0x0002, 0x1f3c, 0x1f34, 0x7905, 0x1f34,
-	0x1f36, 0x1f36, 0x1f36, 0x1f36, 0x78eb, 0x1f34, 0x1f38, 0x1f34,
-	0x1f36, 0x1f34, 0x1f36, 0x1f34, 0x080c, 0x0d65, 0x0031, 0x0020,
-	0x080c, 0x78eb, 0x080c, 0x7905, 0x0005, 0x0006, 0x0016, 0x0026,
-	0x080c, 0xd448, 0x7930, 0x9184, 0x0003, 0x01f0, 0x080c, 0x9746,
-	0x2001, 0x19c9, 0x2004, 0x9005, 0x0180, 0x2001, 0x0133, 0x2004,
-	0x9005, 0x090c, 0x0d65, 0x00c6, 0x2001, 0x19c9, 0x2064, 0x080c,
-	0x9762, 0x080c, 0xb2d0, 0x00ce, 0x0408, 0x2009, 0x0040, 0x080c,
-	0x201d, 0x080c, 0x9762, 0x00d0, 0x9184, 0x0014, 0x01a0, 0x6a00,
-	0x9286, 0x0003, 0x0160, 0x080c, 0x6f5c, 0x1138, 0x080c, 0x725c,
-	0x080c, 0x5be2, 0x080c, 0x6e8d, 0x0010, 0x080c, 0x5a9d, 0x080c,
-	0x7993, 0x0041, 0x0018, 0x9184, 0x9540, 0x1dc8, 0x002e, 0x001e,
-	0x000e, 0x0005, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a3a,
-	0x080c, 0x193f, 0x005e, 0x004e, 0x003e, 0x00ee, 0x0005, 0x0126,
-	0x2091, 0x2e00, 0x2071, 0x1800, 0x7128, 0x2001, 0x1940, 0x2102,
-	0x2001, 0x1948, 0x2102, 0x2001, 0x013b, 0x2102, 0x2079, 0x0200,
-	0x2001, 0x0201, 0x789e, 0x78a3, 0x0200, 0x9198, 0x0007, 0x831c,
-	0x831c, 0x831c, 0x9398, 0x0005, 0x2320, 0x9182, 0x0204, 0x1230,
-	0x2011, 0x0008, 0x8423, 0x8423, 0x8423, 0x0488, 0x9182, 0x024c,
-	0x1240, 0x2011, 0x0007, 0x8403, 0x8003, 0x9400, 0x9400, 0x9420,
-	0x0430, 0x9182, 0x02bc, 0x1238, 0x2011, 0x0006, 0x8403, 0x8003,
-	0x9400, 0x9420, 0x00e0, 0x9182, 0x034c, 0x1230, 0x2011, 0x0005,
-	0x8403, 0x8003, 0x9420, 0x0098, 0x9182, 0x042c, 0x1228, 0x2011,
-	0x0004, 0x8423, 0x8423, 0x0058, 0x9182, 0x059c, 0x1228, 0x2011,
-	0x0003, 0x8403, 0x9420, 0x0018, 0x2011, 0x0002, 0x8423, 0x9482,
-	0x0228, 0x8002, 0x8020, 0x8301, 0x9402, 0x0110, 0x0208, 0x8321,
-	0x8217, 0x8203, 0x9405, 0x789a, 0x012e, 0x0005, 0x0006, 0x00d6,
-	0x2069, 0x0200, 0x6814, 0x9084, 0xffc0, 0x910d, 0x6916, 0x00de,
-	0x000e, 0x0005, 0x00d6, 0x2069, 0x0200, 0x9005, 0x6810, 0x0110,
-	0xc0a5, 0x0008, 0xc0a4, 0x6812, 0x00de, 0x0005, 0x0006, 0x00d6,
-	0x2069, 0x0200, 0x6810, 0x9084, 0xfff8, 0x910d, 0x6912, 0x00de,
-	0x000e, 0x0005, 0x7938, 0x080c, 0x0d5e, 0x00f6, 0x2079, 0x0200,
-	0x7902, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x7902,
-	0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x00fe, 0x0005,
-	0x0126, 0x2091, 0x2800, 0x2061, 0x0100, 0x2071, 0x1800, 0x2009,
-	0x0000, 0x080c, 0x27dd, 0x080c, 0x270a, 0x080c, 0x284e, 0x9006,
-	0x080c, 0x2739, 0x9006, 0x080c, 0x271c, 0x20a9, 0x0012, 0x1d04,
-	0x2047, 0x2091, 0x6000, 0x1f04, 0x2047, 0x602f, 0x0100, 0x602f,
-	0x0000, 0x6050, 0x9085, 0x0400, 0x9084, 0xdfff, 0x6052, 0x6224,
-	0x080c, 0x282b, 0x080c, 0x2428, 0x2009, 0x00ef, 0x6132, 0x6136,
-	0x080c, 0x2438, 0x60e7, 0x0000, 0x61ea, 0x60e3, 0x0002, 0x604b,
-	0xf7f7, 0x6043, 0x0000, 0x602f, 0x0080, 0x602f, 0x0000, 0x6007,
-	0x149f, 0x00c6, 0x2061, 0x0140, 0x608b, 0x000b, 0x608f, 0x10b8,
-	0x6093, 0x0000, 0x6097, 0x0198, 0x00ce, 0x6004, 0x9085, 0x8000,
-	0x6006, 0x60bb, 0x0000, 0x20a9, 0x0018, 0x60bf, 0x0000, 0x1f04,
-	0x2085, 0x60bb, 0x0000, 0x60bf, 0x0108, 0x60bf, 0x0012, 0x60bf,
-	0x0320, 0x60bf, 0x0018, 0x601b, 0x00f0, 0x601f, 0x001e, 0x600f,
-	0x006b, 0x602b, 0x402c, 0x012e, 0x0005, 0x00f6, 0x2079, 0x0140,
-	0x78c3, 0x0080, 0x78c3, 0x0083, 0x78c3, 0x0000, 0x00fe, 0x0005,
-	0x2001, 0x1834, 0x2003, 0x0000, 0x2001, 0x1833, 0x2003, 0x0001,
-	0x0005, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x6124,
-	0x6028, 0x910c, 0x9184, 0x5e2c, 0x1118, 0x9184, 0x0007, 0x002a,
-	0x9195, 0x0004, 0x9284, 0x0007, 0x0002, 0x20d0, 0x20cd, 0x20cd,
-	0x20cd, 0x20cf, 0x20cd, 0x20cd, 0x20cd, 0x080c, 0x0d65, 0x0029,
-	0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x00a6, 0x6124, 0x6028,
-	0xd09c, 0x0118, 0xd19c, 0x1904, 0x232f, 0xd1f4, 0x190c, 0x0d5e,
-	0x080c, 0x6f5c, 0x0904, 0x212d, 0x080c, 0xbdd7, 0x1120, 0x7000,
-	0x9086, 0x0003, 0x0580, 0x6024, 0x9084, 0x1800, 0x0560, 0x080c,
-	0x6f7f, 0x0118, 0x080c, 0x6f6d, 0x1530, 0x2011, 0x0020, 0x080c,
-	0x282b, 0x6043, 0x0000, 0x080c, 0xbdd7, 0x0168, 0x080c, 0x6f7f,
-	0x1150, 0x2001, 0x1976, 0x2003, 0x0001, 0x6027, 0x1800, 0x080c,
-	0x6dd2, 0x0804, 0x2332, 0x70a0, 0x9005, 0x1150, 0x70a3, 0x0001,
-	0x00d6, 0x2069, 0x0140, 0x080c, 0x6fb3, 0x00de, 0x1904, 0x2332,
-	0x080c, 0x7266, 0x0428, 0x080c, 0x6f7f, 0x1590, 0x6024, 0x9084,
-	0x1800, 0x1108, 0x0468, 0x080c, 0x7266, 0x080c, 0x725c, 0x080c,
-	0x5be2, 0x080c, 0x6e8d, 0x0804, 0x232f, 0xd1ac, 0x1508, 0x6024,
-	0xd0dc, 0x1170, 0xd0e4, 0x1178, 0xd0d4, 0x1190, 0xd0cc, 0x0130,
-	0x7094, 0x9086, 0x0028, 0x1110, 0x080c, 0x713f, 0x0804, 0x232f,
-	0x080c, 0x7261, 0x0048, 0x2001, 0x194e, 0x2003, 0x0002, 0x0020,
-	0x080c, 0x709d, 0x0804, 0x232f, 0x080c, 0x71e1, 0x0804, 0x232f,
-	0xd1ac, 0x0904, 0x2249, 0x080c, 0x6f5c, 0x11d0, 0x2011, 0x0020,
-	0x080c, 0x282b, 0x0006, 0x0026, 0x0036, 0x080c, 0x6f76, 0x1158,
-	0x080c, 0x725c, 0x080c, 0x5be2, 0x080c, 0x6e8d, 0x003e, 0x002e,
-	0x000e, 0x00ae, 0x0005, 0x003e, 0x002e, 0x000e, 0x080c, 0x6f30,
-	0x0016, 0x0046, 0x00c6, 0x644c, 0x9486, 0xf0f0, 0x1138, 0x2061,
-	0x0100, 0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74d6, 0x948c,
-	0xff00, 0x7038, 0xd084, 0x0178, 0x9186, 0xf800, 0x1160, 0x7044,
-	0xd084, 0x1148, 0xc085, 0x7046, 0x0036, 0x2418, 0x2011, 0x8016,
-	0x080c, 0x47fb, 0x003e, 0x080c, 0xbdd0, 0x1904, 0x2220, 0x9196,
-	0xff00, 0x05a8, 0x705c, 0x9084, 0x00ff, 0x810f, 0x81ff, 0x0110,
-	0x9116, 0x0568, 0x7130, 0xd184, 0x1550, 0x080c, 0x313d, 0x0128,
-	0xc18d, 0x7132, 0x080c, 0x6555, 0x1510, 0x6240, 0x9294, 0x0010,
-	0x0130, 0x6248, 0x9294, 0xff00, 0x9296, 0xff00, 0x01c0, 0x7030,
-	0xd08c, 0x0904, 0x2220, 0x7038, 0xd08c, 0x1140, 0x2001, 0x180c,
-	0x200c, 0xd1ac, 0x1904, 0x2220, 0xc1ad, 0x2102, 0x0036, 0x73d4,
-	0x2011, 0x8013, 0x080c, 0x47fb, 0x003e, 0x0804, 0x2220, 0x7038,
-	0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, 0x2220,
-	0xc1ad, 0x2102, 0x0036, 0x73d4, 0x2011, 0x8013, 0x080c, 0x47fb,
-	0x003e, 0x7130, 0xc185, 0x7132, 0x2011, 0x1854, 0x220c, 0x00f0,
-	0x0016, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x8248, 0x2019,
-	0x000e, 0x00c6, 0x2061, 0x0000, 0x080c, 0xd046, 0x00ce, 0x9484,
-	0x00ff, 0x9080, 0x3142, 0x200d, 0x918c, 0xff00, 0x810f, 0x2120,
-	0x9006, 0x2009, 0x000e, 0x080c, 0xd0ce, 0x001e, 0xd1ac, 0x1148,
-	0x0016, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x2f80, 0x001e,
-	0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x6166,
-	0x1110, 0x080c, 0x5bfc, 0x8108, 0x1f04, 0x2216, 0x00be, 0x015e,
-	0x00ce, 0x004e, 0x080c, 0x9746, 0x080c, 0x99eb, 0x080c, 0x9762,
-	0x60e3, 0x0000, 0x001e, 0x2001, 0x1800, 0x2014, 0x9296, 0x0004,
-	0x1170, 0xd19c, 0x11b0, 0x2011, 0x180c, 0x2214, 0xd29c, 0x1120,
-	0x6204, 0x9295, 0x0002, 0x6206, 0x6228, 0xc29d, 0x622a, 0x2003,
-	0x0001, 0x2001, 0x1825, 0x2003, 0x0000, 0x2011, 0x0020, 0x080c,
-	0x282b, 0xd194, 0x0904, 0x232f, 0x0016, 0x080c, 0x9746, 0x6220,
-	0xd2b4, 0x0904, 0x22d7, 0x080c, 0x8068, 0x080c, 0x8e21, 0x2011,
-	0x0004, 0x080c, 0x282b, 0x00f6, 0x2019, 0x19c2, 0x2304, 0x907d,
-	0x0904, 0x22a4, 0x7804, 0x9086, 0x0032, 0x15f0, 0x00d6, 0x00c6,
-	0x00e6, 0x0096, 0x2069, 0x0140, 0x782c, 0x685e, 0x7808, 0x685a,
-	0x6043, 0x0002, 0x2001, 0x0003, 0x8001, 0x1df0, 0x6043, 0x0000,
-	0x2001, 0x003c, 0x8001, 0x1df0, 0x080c, 0x2801, 0x2001, 0x001e,
-	0x8001, 0x0240, 0x20a9, 0x0009, 0x080c, 0x27b8, 0x6904, 0xd1dc,
-	0x1140, 0x0cb0, 0x2001, 0x0100, 0x080c, 0x27f1, 0x9006, 0x080c,
-	0x27f1, 0x080c, 0x86d1, 0x080c, 0x9762, 0x7814, 0x2048, 0xa867,
-	0x0103, 0x2f60, 0x080c, 0x9a65, 0x009e, 0x00ee, 0x00ce, 0x00de,
-	0x00fe, 0x001e, 0x00ae, 0x0005, 0x00fe, 0x00d6, 0x2069, 0x0140,
-	0x6804, 0x9084, 0x4000, 0x0110, 0x080c, 0x2801, 0x00de, 0x00c6,
-	0x2061, 0x19b6, 0x6034, 0x080c, 0xbdd7, 0x0120, 0x909a, 0x0003,
-	0x1258, 0x0018, 0x909a, 0x00c8, 0x1238, 0x8000, 0x6036, 0x00ce,
-	0x080c, 0x8df9, 0x0804, 0x232c, 0x2061, 0x0100, 0x62c0, 0x080c,
-	0x967c, 0x2019, 0x19c2, 0x2304, 0x9065, 0x0130, 0x6003, 0x0001,
-	0x2009, 0x0027, 0x080c, 0x9b03, 0x00ce, 0x0804, 0x232c, 0xd2bc,
-	0x05e0, 0x080c, 0x8075, 0x2011, 0x0004, 0x080c, 0x282b, 0x00d6,
-	0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0110, 0x080c, 0x2801,
-	0x00de, 0x00c6, 0x2061, 0x19b6, 0x6050, 0x080c, 0xbdd7, 0x0120,
-	0x909a, 0x0003, 0x1638, 0x0018, 0x909a, 0x00c8, 0x1618, 0x8000,
-	0x6052, 0x604c, 0x00ce, 0x9005, 0x0578, 0x2009, 0x07d0, 0x080c,
-	0x806d, 0x9080, 0x0008, 0x2004, 0x9086, 0x0006, 0x1138, 0x2009,
-	0x1984, 0x2011, 0x0012, 0x080c, 0x283a, 0x00f0, 0x2009, 0x1984,
-	0x2011, 0x0016, 0x080c, 0x283a, 0x00b8, 0x2011, 0x0004, 0x080c,
-	0x282b, 0x0090, 0x0036, 0x2019, 0x0001, 0x080c, 0x90f0, 0x003e,
-	0x2019, 0x19c9, 0x2304, 0x9065, 0x0130, 0x2009, 0x004f, 0x6003,
-	0x0003, 0x080c, 0x9b03, 0x00ce, 0x080c, 0x9762, 0x001e, 0xd19c,
-	0x0904, 0x238d, 0x7038, 0xd0ac, 0x1538, 0x0016, 0x0156, 0x2011,
-	0x0008, 0x080c, 0x282b, 0x6050, 0xc0e5, 0x6052, 0x20a9, 0x0367,
-	0x1f04, 0x235a, 0x1d04, 0x2342, 0x080c, 0x809c, 0x6020, 0xd09c,
-	0x1db8, 0x00f6, 0x2079, 0x0100, 0x080c, 0x2768, 0x00fe, 0x1d80,
-	0x6050, 0xc0e4, 0x6052, 0x2011, 0x0008, 0x080c, 0x282b, 0x015e,
-	0x001e, 0x0498, 0x015e, 0x001e, 0x0016, 0x6028, 0xc09c, 0x602a,
-	0x080c, 0x9746, 0x080c, 0x99eb, 0x080c, 0x9762, 0x60e3, 0x0000,
-	0x080c, 0xd427, 0x080c, 0xd442, 0x080c, 0x52a1, 0xd0fc, 0x1138,
-	0x080c, 0xbdd0, 0x1120, 0x9085, 0x0001, 0x080c, 0x6fa3, 0x9006,
-	0x080c, 0x27f1, 0x2009, 0x0002, 0x080c, 0x27dd, 0x00e6, 0x2071,
-	0x1800, 0x7003, 0x0004, 0x080c, 0x0e9c, 0x00ee, 0x2011, 0x0008,
-	0x080c, 0x282b, 0x080c, 0x0bab, 0x001e, 0x918c, 0xffd0, 0x2110,
-	0x080c, 0x282b, 0x00ae, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036,
-	0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x71cc,
-	0x70ce, 0x9116, 0x0904, 0x23e7, 0x81ff, 0x01a0, 0x2009, 0x0000,
-	0x080c, 0x27dd, 0x2011, 0x8011, 0x2019, 0x010e, 0x231c, 0x939e,
-	0x0007, 0x1118, 0x2019, 0x0001, 0x0010, 0x2019, 0x0000, 0x080c,
-	0x47fb, 0x0468, 0x2001, 0x1977, 0x200c, 0x81ff, 0x1140, 0x2001,
-	0x0109, 0x2004, 0xd0b4, 0x0118, 0x2019, 0x0003, 0x0008, 0x2118,
-	0x2011, 0x8012, 0x080c, 0x47fb, 0x080c, 0x0e9c, 0x080c, 0x52a1,
-	0xd0fc, 0x11a8, 0x080c, 0xbdd0, 0x1190, 0x00c6, 0x080c, 0x2483,
-	0x080c, 0x9746, 0x080c, 0x904b, 0x080c, 0x9762, 0x2061, 0x0100,
-	0x2019, 0x0028, 0x2009, 0x0002, 0x080c, 0x2f80, 0x00ce, 0x012e,
-	0x00fe, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x2028,
-	0x918c, 0x00ff, 0x2130, 0x9094, 0xff00, 0x11f0, 0x2011, 0x1836,
-	0x2214, 0xd2ac, 0x11c8, 0x81ff, 0x01e8, 0x2011, 0x181e, 0x2204,
-	0x9106, 0x1190, 0x2011, 0x181f, 0x2214, 0x9294, 0xff00, 0x9584,
-	0xff00, 0x9206, 0x1148, 0x2011, 0x181f, 0x2214, 0x9294, 0x00ff,
-	0x9584, 0x00ff, 0x9206, 0x1120, 0x2500, 0x080c, 0x7bd2, 0x0048,
-	0x9584, 0x00ff, 0x9080, 0x3142, 0x200d, 0x918c, 0xff00, 0x810f,
-	0x9006, 0x0005, 0x9080, 0x3142, 0x200d, 0x918c, 0x00ff, 0x0005,
-	0x00d6, 0x2069, 0x0140, 0x2001, 0x1817, 0x2003, 0x00ef, 0x20a9,
-	0x0010, 0x9006, 0x6852, 0x6856, 0x1f04, 0x2433, 0x00de, 0x0005,
-	0x0006, 0x00d6, 0x0026, 0x2069, 0x0140, 0x2001, 0x1817, 0x2102,
-	0x8114, 0x8214, 0x8214, 0x8214, 0x20a9, 0x0010, 0x6853, 0x0000,
-	0x9006, 0x82ff, 0x1128, 0x9184, 0x000f, 0x9080, 0xd456, 0x2005,
-	0x6856, 0x8211, 0x1f04, 0x2448, 0x002e, 0x00de, 0x000e, 0x0005,
-	0x00c6, 0x2061, 0x1800, 0x6030, 0x0110, 0xc09d, 0x0008, 0xc09c,
-	0x6032, 0x00ce, 0x0005, 0x0156, 0x00d6, 0x0026, 0x0016, 0x0006,
-	0x2069, 0x0140, 0x6980, 0x9116, 0x0180, 0x9112, 0x1230, 0x8212,
-	0x8210, 0x22a8, 0x2001, 0x0402, 0x0018, 0x22a8, 0x2001, 0x0404,
-	0x680e, 0x1f04, 0x2478, 0x680f, 0x0000, 0x000e, 0x001e, 0x002e,
-	0x00de, 0x015e, 0x0005, 0x080c, 0x529d, 0xd0c4, 0x0150, 0xd0a4,
-	0x0140, 0x9006, 0x0046, 0x2020, 0x2009, 0x002e, 0x080c, 0xd0ce,
-	0x004e, 0x0005, 0x00f6, 0x0016, 0x0026, 0x2079, 0x0140, 0x78c4,
-	0xd0dc, 0x0904, 0x24ef, 0x080c, 0x2758, 0x0660, 0x9084, 0x0700,
-	0x908e, 0x0600, 0x1120, 0x2011, 0x4000, 0x900e, 0x0458, 0x908e,
-	0x0500, 0x1120, 0x2011, 0x8000, 0x900e, 0x0420, 0x908e, 0x0400,
-	0x1120, 0x9016, 0x2009, 0x0001, 0x00e8, 0x908e, 0x0300, 0x1120,
-	0x9016, 0x2009, 0x0002, 0x00b0, 0x908e, 0x0200, 0x1120, 0x9016,
-	0x2009, 0x0004, 0x0078, 0x908e, 0x0100, 0x1548, 0x9016, 0x2009,
-	0x0008, 0x0040, 0x9084, 0x0700, 0x908e, 0x0300, 0x1500, 0x2011,
-	0x0030, 0x0058, 0x2300, 0x9080, 0x0020, 0x2018, 0x080c, 0x8276,
-	0x928c, 0xff00, 0x0110, 0x2011, 0x00ff, 0x2200, 0x8007, 0x9085,
-	0x004c, 0x78c2, 0x2009, 0x0138, 0x220a, 0x080c, 0x6f5c, 0x1118,
-	0x2009, 0x193e, 0x220a, 0x002e, 0x001e, 0x00fe, 0x0005, 0x78c3,
-	0x0000, 0x0cc8, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026,
-	0x2001, 0x0170, 0x200c, 0x8000, 0x2014, 0x9184, 0x0003, 0x0110,
-	0x080c, 0x0d5e, 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x2001,
-	0x0171, 0x2004, 0xd0dc, 0x0168, 0x2001, 0x0170, 0x200c, 0x918c,
-	0x00ff, 0x918e, 0x004c, 0x1128, 0x200c, 0x918c, 0xff00, 0x810f,
-	0x0005, 0x900e, 0x2001, 0x0227, 0x2004, 0x8007, 0x9084, 0x00ff,
-	0x8004, 0x9108, 0x2001, 0x0226, 0x2004, 0x8007, 0x9084, 0x00ff,
-	0x8004, 0x9108, 0x0005, 0x0018, 0x000c, 0x0018, 0x0020, 0x1000,
-	0x0800, 0x1000, 0x1800, 0x0156, 0x0006, 0x0016, 0x0026, 0x00e6,
-	0x2001, 0x195f, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0d65, 0x0033,
-	0x00ee, 0x002e, 0x001e, 0x000e, 0x015e, 0x0005, 0x254d, 0x256b,
-	0x258f, 0x2591, 0x25ba, 0x25bc, 0x25be, 0x2001, 0x0001, 0x080c,
-	0x2394, 0x080c, 0x27a2, 0x2001, 0x1961, 0x2003, 0x0000, 0x7828,
-	0x9084, 0xe1d7, 0x782a, 0x9006, 0x20a9, 0x0009, 0x080c, 0x2774,
-	0x2001, 0x195f, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x25bf,
-	0x080c, 0x807a, 0x0005, 0x2009, 0x1964, 0x200b, 0x0000, 0x2001,
-	0x1969, 0x2003, 0x0036, 0x2001, 0x1968, 0x2003, 0x002a, 0x2001,
-	0x1961, 0x2003, 0x0001, 0x9006, 0x080c, 0x271c, 0x2001, 0xffff,
-	0x20a9, 0x0009, 0x080c, 0x2774, 0x2001, 0x195f, 0x2003, 0x0006,
-	0x2009, 0x001e, 0x2011, 0x25bf, 0x080c, 0x807a, 0x0005, 0x080c,
-	0x0d65, 0x2001, 0x1969, 0x2003, 0x0036, 0x2001, 0x1961, 0x2003,
-	0x0003, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0x9006,
-	0x0010, 0x2001, 0x0001, 0x080c, 0x271c, 0x2001, 0x1965, 0x2003,
-	0x0000, 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, 0x2774, 0x2001,
-	0x195f, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x25bf, 0x080c,
-	0x807a, 0x0005, 0x080c, 0x0d65, 0x080c, 0x0d65, 0x0005, 0x0006,
-	0x0016, 0x0026, 0x00e6, 0x00f6, 0x0156, 0x0126, 0x2091, 0x8000,
-	0x2079, 0x0100, 0x2001, 0x1961, 0x2004, 0x908a, 0x0007, 0x1a0c,
-	0x0d65, 0x0043, 0x012e, 0x015e, 0x00fe, 0x00ee, 0x002e, 0x001e,
-	0x000e, 0x0005, 0x25e1, 0x2601, 0x2641, 0x2671, 0x2695, 0x26a5,
-	0x26a7, 0x080c, 0x2768, 0x11b0, 0x7850, 0x9084, 0xefff, 0x7852,
-	0x2009, 0x1967, 0x2104, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004,
-	0x0110, 0xc08d, 0x0008, 0xc085, 0x200a, 0x2001, 0x195f, 0x2003,
-	0x0001, 0x0030, 0x080c, 0x26cb, 0x2001, 0xffff, 0x080c, 0x255c,
-	0x0005, 0x080c, 0x26a9, 0x05e0, 0x2009, 0x1968, 0x2104, 0x8001,
-	0x200a, 0x080c, 0x2768, 0x1178, 0x7850, 0x9084, 0xefff, 0x7852,
-	0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0518, 0x2009, 0x1967,
-	0x2104, 0xc085, 0x200a, 0x2009, 0x1964, 0x2104, 0x8000, 0x200a,
-	0x9086, 0x0005, 0x0118, 0x080c, 0x26b1, 0x00c0, 0x200b, 0x0000,
-	0x7a38, 0x9294, 0x0006, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010,
-	0x2001, 0x0001, 0x080c, 0x2739, 0x2001, 0x1961, 0x2003, 0x0002,
-	0x0028, 0x2001, 0x195f, 0x2003, 0x0003, 0x0010, 0x080c, 0x257e,
-	0x0005, 0x080c, 0x26a9, 0x0560, 0x2009, 0x1968, 0x2104, 0x8001,
-	0x200a, 0x080c, 0x2768, 0x1168, 0x7850, 0x9084, 0xefff, 0x7852,
-	0x2001, 0x195f, 0x2003, 0x0003, 0x2001, 0x1960, 0x2003, 0x0000,
-	0x00b8, 0x2009, 0x1968, 0x2104, 0x9005, 0x1118, 0x080c, 0x26ee,
-	0x0010, 0x080c, 0x26be, 0x080c, 0x26b1, 0x2009, 0x1964, 0x200b,
-	0x0000, 0x2001, 0x1961, 0x2003, 0x0001, 0x080c, 0x257e, 0x0000,
-	0x0005, 0x04b9, 0x0508, 0x080c, 0x2768, 0x11b8, 0x7850, 0x9084,
-	0xefff, 0x7852, 0x2009, 0x1965, 0x2104, 0x8000, 0x200a, 0x9086,
-	0x0007, 0x0108, 0x0078, 0x2001, 0x196a, 0x2003, 0x000a, 0x2009,
-	0x1967, 0x2104, 0xc0fd, 0x200a, 0x0038, 0x0419, 0x2001, 0x1961,
-	0x2003, 0x0004, 0x080c, 0x25a9, 0x0005, 0x0099, 0x0168, 0x080c,
-	0x2768, 0x1138, 0x7850, 0x9084, 0xefff, 0x7852, 0x080c, 0x2595,
-	0x0018, 0x0079, 0x080c, 0x25a9, 0x0005, 0x080c, 0x0d65, 0x080c,
-	0x0d65, 0x2009, 0x1969, 0x2104, 0x8001, 0x200a, 0x090c, 0x270a,
-	0x0005, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006,
-	0x0010, 0x2001, 0x0001, 0x080c, 0x2739, 0x0005, 0x7a38, 0x9294,
-	0x0006, 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001,
-	0x080c, 0x271c, 0x0005, 0x2009, 0x1964, 0x2104, 0x8000, 0x200a,
-	0x9086, 0x0005, 0x0108, 0x0068, 0x200b, 0x0000, 0x7a38, 0x9294,
-	0x0006, 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001,
-	0x04d9, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006,
-	0x0010, 0x2001, 0x0001, 0x080c, 0x2739, 0x0005, 0x0086, 0x2001,
-	0x1967, 0x2004, 0x9084, 0x7fff, 0x090c, 0x0d65, 0x2009, 0x1966,
-	0x2144, 0x8846, 0x280a, 0x9844, 0x0dd8, 0xd08c, 0x1120, 0xd084,
-	0x1120, 0x080c, 0x0d65, 0x9006, 0x0010, 0x2001, 0x0001, 0x00a1,
-	0x008e, 0x0005, 0x0006, 0x0156, 0x2001, 0x195f, 0x20a9, 0x0009,
-	0x2003, 0x0000, 0x8000, 0x1f04, 0x2710, 0x2001, 0x1966, 0x2003,
-	0x8000, 0x015e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085,
-	0x0000, 0x0158, 0x7838, 0x9084, 0xfff9, 0x9085, 0x0004, 0x783a,
-	0x2009, 0x196c, 0x210c, 0x795a, 0x0050, 0x7838, 0x9084, 0xfffb,
-	0x9085, 0x0006, 0x783a, 0x2009, 0x196d, 0x210c, 0x795a, 0x00fe,
+	0x000f, 0x0002, 0x1a8e, 0x1a8e, 0x1a8e, 0x1a8e, 0x1a8e, 0x1a8e,
+	0x1a8e, 0x1a8e, 0x1a82, 0x1a90, 0x1a8e, 0x1a8e, 0x1a8e, 0x1a8e,
+	0x1a8e, 0x1a8e, 0x9086, 0x0008, 0x1148, 0xa87c, 0xd0b4, 0x0904,
+	0x1c00, 0x2011, 0x1cf2, 0x2205, 0xab88, 0x0068, 0x080c, 0x0d65,
+	0xa87c, 0xd0b4, 0x0904, 0x1c00, 0x9184, 0x000f, 0x9080, 0x1cf7,
+	0x2015, 0x2205, 0xab88, 0x2908, 0xa80a, 0xa90e, 0xaa12, 0xab16,
+	0x9006, 0xa842, 0xa83e, 0x012e, 0x0005, 0x2cf0, 0x0126, 0x2091,
+	0x2400, 0x3e60, 0x6014, 0x2048, 0xa88c, 0xa990, 0xaaac, 0xabb0,
+	0xaa36, 0xab3a, 0xa83e, 0xa942, 0xa846, 0xa94a, 0xa964, 0x918c,
+	0x00ff, 0x9186, 0x001e, 0x0198, 0x2940, 0xa064, 0xa81a, 0x90ec,
+	0x000f, 0x9d80, 0x1cf7, 0x2065, 0x2c05, 0x2808, 0x2c10, 0xab88,
+	0xa80a, 0xa90e, 0xaa12, 0xab16, 0x012e, 0x3e60, 0x0005, 0xa804,
+	0x2040, 0x0c58, 0x2cf0, 0x0126, 0x2091, 0x2400, 0x3e60, 0x6014,
+	0x2048, 0xa97c, 0x2950, 0xd1dc, 0x1904, 0x1bca, 0xc1dd, 0xa97e,
+	0x9006, 0xa842, 0xa83e, 0xa988, 0x8109, 0xa916, 0xa964, 0xa91a,
+	0x9184, 0x000f, 0x9088, 0x1cf7, 0x2145, 0x0002, 0x1afe, 0x1b0c,
+	0x1afe, 0x1afe, 0x1afe, 0x1b00, 0x1afe, 0x1afe, 0x1b61, 0x1b61,
+	0x1afe, 0x1afe, 0x1afe, 0x1b5f, 0x1afe, 0x1afe, 0x080c, 0x0d65,
+	0xa804, 0x2050, 0xb164, 0xa91a, 0x9184, 0x000f, 0x9080, 0x1cf7,
+	0x2045, 0xd19c, 0x1904, 0x1b61, 0x9036, 0x2638, 0x2805, 0x908a,
+	0x0036, 0x1a0c, 0x0d65, 0x9082, 0x001b, 0x0002, 0x1b31, 0x1b31,
+	0x1b33, 0x1b31, 0x1b31, 0x1b31, 0x1b39, 0x1b31, 0x1b31, 0x1b31,
+	0x1b3f, 0x1b31, 0x1b31, 0x1b31, 0x1b45, 0x1b31, 0x1b31, 0x1b31,
+	0x1b4b, 0x1b31, 0x1b31, 0x1b31, 0x1b51, 0x1b31, 0x1b31, 0x1b31,
+	0x1b57, 0x080c, 0x0d65, 0xb574, 0xb478, 0xb37c, 0xb280, 0x0804,
+	0x1ba6, 0xb584, 0xb488, 0xb38c, 0xb290, 0x0804, 0x1ba6, 0xb594,
+	0xb498, 0xb39c, 0xb2a0, 0x0804, 0x1ba6, 0xb5a4, 0xb4a8, 0xb3ac,
+	0xb2b0, 0x0804, 0x1ba6, 0xb5b4, 0xb4b8, 0xb3bc, 0xb2c0, 0x0804,
+	0x1ba6, 0xb5c4, 0xb4c8, 0xb3cc, 0xb2d0, 0x0804, 0x1ba6, 0xb5d4,
+	0xb4d8, 0xb3dc, 0xb2e0, 0x0804, 0x1ba6, 0x0804, 0x1ba6, 0x080c,
+	0x0d65, 0x2805, 0x908a, 0x0034, 0x1a0c, 0x0d65, 0x9082, 0x001b,
+	0x0002, 0x1b84, 0x1b82, 0x1b82, 0x1b82, 0x1b82, 0x1b82, 0x1b8b,
+	0x1b82, 0x1b82, 0x1b82, 0x1b82, 0x1b82, 0x1b92, 0x1b82, 0x1b82,
+	0x1b82, 0x1b82, 0x1b82, 0x1b99, 0x1b82, 0x1b82, 0x1b82, 0x1b82,
+	0x1b82, 0x1ba0, 0x080c, 0x0d65, 0xb56c, 0xb470, 0xb774, 0xb678,
+	0xb37c, 0xb280, 0x00d8, 0xb584, 0xb488, 0xb78c, 0xb690, 0xb394,
+	0xb298, 0x00a0, 0xb59c, 0xb4a0, 0xb7a4, 0xb6a8, 0xb3ac, 0xb2b0,
+	0x0068, 0xb5b4, 0xb4b8, 0xb7bc, 0xb6c0, 0xb3c4, 0xb2c8, 0x0030,
+	0xb5cc, 0xb4d0, 0xb7d4, 0xb6d8, 0xb3dc, 0xb2e0, 0xab2e, 0xaa32,
+	0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa988, 0x8109, 0xa916, 0x1118,
+	0x9006, 0x012e, 0x0005, 0x8840, 0x2805, 0x9005, 0x1168, 0xb004,
+	0x9005, 0x090c, 0x0d65, 0x2050, 0xb164, 0xa91a, 0x9184, 0x000f,
+	0x9080, 0x1cf7, 0x2045, 0x2805, 0x2810, 0x2a08, 0xa80a, 0xa90e,
+	0xaa12, 0x0c30, 0x3e60, 0x6344, 0xd3fc, 0x190c, 0x0d65, 0xa93c,
+	0xaa40, 0xa844, 0x9106, 0x1118, 0xa848, 0x9206, 0x0508, 0x2958,
+	0xab48, 0xac44, 0x2940, 0x080c, 0x1d17, 0x1998, 0x2850, 0x2c40,
+	0xab14, 0xa880, 0xd0fc, 0x1140, 0xa810, 0x2005, 0xa80a, 0x2a00,
+	0xa80e, 0x2009, 0x8015, 0x0070, 0x00c6, 0x3e60, 0x6044, 0xc0a4,
+	0x9085, 0x8005, 0x6046, 0x00ce, 0x8319, 0xab16, 0x1904, 0x1bb3,
+	0x2009, 0x8005, 0x3e60, 0x6044, 0x9105, 0x6046, 0x0804, 0x1bb0,
+	0x080c, 0x0d65, 0x00f6, 0x00e6, 0x0096, 0x00c6, 0x0026, 0x704c,
+	0x9c06, 0x190c, 0x0d65, 0x2079, 0x0090, 0x2001, 0x0105, 0x2003,
+	0x0010, 0x782b, 0x0004, 0x7057, 0x0000, 0x6014, 0x2048, 0x080c,
+	0xb82c, 0x0118, 0xa880, 0xc0bd, 0xa882, 0x6020, 0x9086, 0x0006,
+	0x1170, 0x2061, 0x0100, 0x62c8, 0x2001, 0x00fa, 0x8001, 0x1df0,
+	0x60c8, 0x9206, 0x1dc0, 0x60c4, 0xa89a, 0x60c8, 0xa896, 0x704c,
+	0x2060, 0x00c6, 0x080c, 0xb437, 0x080c, 0x98ad, 0x00ce, 0x704c,
+	0x9c06, 0x1150, 0x2009, 0x0040, 0x080c, 0x2052, 0x080c, 0x949d,
+	0x2011, 0x0000, 0x080c, 0x9328, 0x002e, 0x00ce, 0x009e, 0x00ee,
+	0x00fe, 0x0005, 0x00f6, 0x2079, 0x0090, 0x781c, 0x0006, 0x7818,
+	0x0006, 0x2079, 0x0100, 0x7a14, 0x9284, 0x1984, 0x9085, 0x0012,
+	0x7816, 0x2019, 0x1000, 0x8319, 0x090c, 0x0d65, 0x7820, 0xd0bc,
+	0x1dd0, 0x79c8, 0x000e, 0x9102, 0x001e, 0x0006, 0x0016, 0x79c4,
+	0x000e, 0x9103, 0x78c6, 0x000e, 0x78ca, 0x9284, 0x1984, 0x9085,
+	0x0012, 0x7816, 0x2079, 0x0090, 0x782b, 0x0008, 0x7057, 0x0000,
+	0x00fe, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x19b8, 0x7054, 0x9086,
+	0x0000, 0x0904, 0x1cc8, 0x2079, 0x0090, 0x2009, 0x0207, 0x210c,
+	0xd194, 0x01b8, 0x2009, 0x020c, 0x210c, 0x9184, 0x0003, 0x0188,
+	0x080c, 0xd5fa, 0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0d65,
+	0x0016, 0x2009, 0x0040, 0x080c, 0x2052, 0x001e, 0x2001, 0x020c,
+	0x2102, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106,
+	0x1120, 0x2009, 0x0040, 0x080c, 0x2052, 0x782c, 0xd0fc, 0x09a8,
+	0x080c, 0x98c9, 0x782c, 0xd0fc, 0x1de8, 0x080c, 0x98ad, 0x7054,
+	0x9086, 0x0000, 0x1950, 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8,
+	0x2009, 0x0040, 0x080c, 0x2052, 0x782b, 0x0002, 0x7057, 0x0000,
+	0x00ee, 0x00fe, 0x0005, 0x080c, 0x0d65, 0x8c60, 0x2c05, 0x9005,
+	0x0110, 0x8a51, 0x0005, 0xa004, 0x9005, 0x0168, 0xa85a, 0x2040,
+	0xa064, 0x9084, 0x000f, 0x9080, 0x1cf7, 0x2065, 0x8cff, 0x090c,
+	0x0d65, 0x8a51, 0x0005, 0x2050, 0x0005, 0x0000, 0x001d, 0x0021,
+	0x0025, 0x0029, 0x002d, 0x0031, 0x0035, 0x0000, 0x001b, 0x0021,
+	0x0027, 0x002d, 0x0033, 0x0000, 0x0000, 0x0023, 0x0000, 0x0000,
+	0x1cea, 0x1ce6, 0x0000, 0x0000, 0x1cf4, 0x0000, 0x1cea, 0x1cf1,
+	0x1cf1, 0x1cee, 0x0000, 0x0000, 0x0000, 0x1cf4, 0x1cf1, 0x0000,
+	0x1cec, 0x1cec, 0x0000, 0x0000, 0x1cf4, 0x0000, 0x1cec, 0x1cf2,
+	0x1cf2, 0x1cf2, 0x0000, 0x0000, 0x0000, 0x1cf4, 0x1cf2, 0x00c6,
+	0x00d6, 0x0086, 0xab42, 0xac3e, 0xa888, 0x9055, 0x0904, 0x1ef6,
+	0x2940, 0xa064, 0x90ec, 0x000f, 0x9084, 0x00ff, 0x9086, 0x0008,
+	0x1118, 0x2061, 0x1cf2, 0x00d0, 0x9de0, 0x1cf7, 0x9d86, 0x0007,
+	0x0130, 0x9d86, 0x000e, 0x0118, 0x9d86, 0x000f, 0x1120, 0xa08c,
+	0x9422, 0xa090, 0x931b, 0x2c05, 0x9065, 0x1140, 0x0310, 0x0804,
+	0x1ef6, 0xa004, 0x9045, 0x0904, 0x1ef6, 0x08d8, 0x2c05, 0x9005,
+	0x0904, 0x1dde, 0xdd9c, 0x1904, 0x1d9a, 0x908a, 0x0036, 0x1a0c,
+	0x0d65, 0x9082, 0x001b, 0x0002, 0x1d6f, 0x1d6f, 0x1d71, 0x1d6f,
+	0x1d6f, 0x1d6f, 0x1d77, 0x1d6f, 0x1d6f, 0x1d6f, 0x1d7d, 0x1d6f,
+	0x1d6f, 0x1d6f, 0x1d83, 0x1d6f, 0x1d6f, 0x1d6f, 0x1d89, 0x1d6f,
+	0x1d6f, 0x1d6f, 0x1d8f, 0x1d6f, 0x1d6f, 0x1d6f, 0x1d95, 0x080c,
+	0x0d65, 0xa07c, 0x9422, 0xa080, 0x931b, 0x0804, 0x1dd4, 0xa08c,
+	0x9422, 0xa090, 0x931b, 0x0804, 0x1dd4, 0xa09c, 0x9422, 0xa0a0,
+	0x931b, 0x0804, 0x1dd4, 0xa0ac, 0x9422, 0xa0b0, 0x931b, 0x0804,
+	0x1dd4, 0xa0bc, 0x9422, 0xa0c0, 0x931b, 0x0804, 0x1dd4, 0xa0cc,
+	0x9422, 0xa0d0, 0x931b, 0x0804, 0x1dd4, 0xa0dc, 0x9422, 0xa0e0,
+	0x931b, 0x04d0, 0x908a, 0x0034, 0x1a0c, 0x0d65, 0x9082, 0x001b,
+	0x0002, 0x1dbc, 0x1dba, 0x1dba, 0x1dba, 0x1dba, 0x1dba, 0x1dc1,
+	0x1dba, 0x1dba, 0x1dba, 0x1dba, 0x1dba, 0x1dc6, 0x1dba, 0x1dba,
+	0x1dba, 0x1dba, 0x1dba, 0x1dcb, 0x1dba, 0x1dba, 0x1dba, 0x1dba,
+	0x1dba, 0x1dd0, 0x080c, 0x0d65, 0xa07c, 0x9422, 0xa080, 0x931b,
+	0x0098, 0xa094, 0x9422, 0xa098, 0x931b, 0x0070, 0xa0ac, 0x9422,
+	0xa0b0, 0x931b, 0x0048, 0xa0c4, 0x9422, 0xa0c8, 0x931b, 0x0020,
+	0xa0dc, 0x9422, 0xa0e0, 0x931b, 0x0630, 0x2300, 0x9405, 0x0160,
+	0x8a51, 0x0904, 0x1ef6, 0x8c60, 0x0804, 0x1d46, 0xa004, 0x9045,
+	0x0904, 0x1ef6, 0x0804, 0x1d21, 0x8a51, 0x0904, 0x1ef6, 0x8c60,
+	0x2c05, 0x9005, 0x1158, 0xa004, 0x9045, 0x0904, 0x1ef6, 0xa064,
+	0x90ec, 0x000f, 0x9de0, 0x1cf7, 0x2c05, 0x2060, 0xa880, 0xc0fc,
+	0xa882, 0x0804, 0x1eeb, 0x2c05, 0x8422, 0x8420, 0x831a, 0x9399,
+	0x0000, 0xac2e, 0xab32, 0xdd9c, 0x1904, 0x1e88, 0x9082, 0x001b,
+	0x0002, 0x1e24, 0x1e24, 0x1e26, 0x1e24, 0x1e24, 0x1e24, 0x1e34,
+	0x1e24, 0x1e24, 0x1e24, 0x1e42, 0x1e24, 0x1e24, 0x1e24, 0x1e50,
+	0x1e24, 0x1e24, 0x1e24, 0x1e5e, 0x1e24, 0x1e24, 0x1e24, 0x1e6c,
+	0x1e24, 0x1e24, 0x1e24, 0x1e7a, 0x080c, 0x0d65, 0xa17c, 0x2400,
+	0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa074, 0x9420,
+	0xa078, 0x9319, 0x0804, 0x1ee6, 0xa18c, 0x2400, 0x9122, 0xa190,
+	0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa084, 0x9420, 0xa088, 0x9319,
+	0x0804, 0x1ee6, 0xa19c, 0x2400, 0x9122, 0xa1a0, 0x2300, 0x911b,
+	0x0a0c, 0x0d65, 0xa094, 0x9420, 0xa098, 0x9319, 0x0804, 0x1ee6,
+	0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0d65,
+	0xa0a4, 0x9420, 0xa0a8, 0x9319, 0x0804, 0x1ee6, 0xa1bc, 0x2400,
+	0x9122, 0xa1c0, 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa0b4, 0x9420,
+	0xa0b8, 0x9319, 0x0804, 0x1ee6, 0xa1cc, 0x2400, 0x9122, 0xa1d0,
+	0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa0c4, 0x9420, 0xa0c8, 0x9319,
+	0x0804, 0x1ee6, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b,
+	0x0a0c, 0x0d65, 0xa0d4, 0x9420, 0xa0d8, 0x9319, 0x0804, 0x1ee6,
+	0x9082, 0x001b, 0x0002, 0x1ea6, 0x1ea4, 0x1ea4, 0x1ea4, 0x1ea4,
+	0x1ea4, 0x1eb3, 0x1ea4, 0x1ea4, 0x1ea4, 0x1ea4, 0x1ea4, 0x1ec0,
+	0x1ea4, 0x1ea4, 0x1ea4, 0x1ea4, 0x1ea4, 0x1ecd, 0x1ea4, 0x1ea4,
+	0x1ea4, 0x1ea4, 0x1ea4, 0x1eda, 0x080c, 0x0d65, 0xa17c, 0x2400,
+	0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa06c, 0x9420,
+	0xa070, 0x9319, 0x0498, 0xa194, 0x2400, 0x9122, 0xa198, 0x2300,
+	0x911b, 0x0a0c, 0x0d65, 0xa084, 0x9420, 0xa088, 0x9319, 0x0430,
+	0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0d65,
+	0xa09c, 0x9420, 0xa0a0, 0x9319, 0x00c8, 0xa1c4, 0x2400, 0x9122,
+	0xa1c8, 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa0b4, 0x9420, 0xa0b8,
+	0x9319, 0x0060, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b,
+	0x0a0c, 0x0d65, 0xa0cc, 0x9420, 0xa0d0, 0x9319, 0xac1e, 0xab22,
+	0xa880, 0xc0fd, 0xa882, 0x2800, 0xa85a, 0x2c00, 0xa812, 0x2a00,
+	0xa816, 0x000e, 0x000e, 0x000e, 0x9006, 0x0028, 0x008e, 0x00de,
+	0x00ce, 0x9085, 0x0001, 0x0005, 0x00c6, 0x610c, 0x0016, 0x9026,
+	0x2410, 0x6004, 0x9420, 0x9291, 0x0000, 0x2c04, 0x9210, 0x9ce0,
+	0x0002, 0x918a, 0x0002, 0x1da8, 0x9284, 0x000f, 0x9405, 0x001e,
+	0x00ce, 0x0005, 0x7803, 0x0003, 0x780f, 0x0000, 0x6004, 0x7812,
+	0x2c04, 0x7816, 0x9ce0, 0x0002, 0x918a, 0x0002, 0x1db8, 0x0005,
+	0x2001, 0x0005, 0x2004, 0xd0bc, 0x190c, 0x0d5e, 0xd094, 0x0110,
+	0x080c, 0x11c6, 0x0005, 0x0126, 0x2091, 0x2600, 0x2079, 0x0200,
+	0x2071, 0x0260, 0x2069, 0x1800, 0x7817, 0x0000, 0x789b, 0x0814,
+	0x78a3, 0x0406, 0x789f, 0x0410, 0x2009, 0x013b, 0x200b, 0x0400,
+	0x781b, 0x0002, 0x783b, 0x001f, 0x7837, 0x0020, 0x7803, 0x1600,
+	0x012e, 0x0005, 0x2091, 0x2600, 0x781c, 0xd0a4, 0x190c, 0x204f,
+	0x7900, 0xd1dc, 0x1118, 0x9084, 0x0006, 0x001a, 0x9084, 0x000e,
+	0x0002, 0x1f71, 0x1f69, 0x7a6f, 0x1f69, 0x1f6b, 0x1f6b, 0x1f6b,
+	0x1f6b, 0x7a55, 0x1f69, 0x1f6d, 0x1f69, 0x1f6b, 0x1f69, 0x1f6b,
+	0x1f69, 0x080c, 0x0d65, 0x0031, 0x0020, 0x080c, 0x7a55, 0x080c,
+	0x7a6f, 0x0005, 0x0006, 0x0016, 0x0026, 0x080c, 0xd5fa, 0x7930,
+	0x9184, 0x0003, 0x01f0, 0x080c, 0x98ad, 0x2001, 0x19cb, 0x2004,
+	0x9005, 0x0180, 0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0d65,
+	0x00c6, 0x2001, 0x19cb, 0x2064, 0x080c, 0x98c9, 0x080c, 0xb437,
+	0x00ce, 0x0408, 0x2009, 0x0040, 0x080c, 0x2052, 0x080c, 0x98c9,
+	0x00d0, 0x9184, 0x0014, 0x01a0, 0x6a00, 0x9286, 0x0003, 0x0160,
+	0x080c, 0x70ac, 0x1138, 0x080c, 0x73ac, 0x080c, 0x5cd5, 0x080c,
+	0x6fdd, 0x0010, 0x080c, 0x5b90, 0x080c, 0x7b0d, 0x0041, 0x0018,
+	0x9184, 0x9540, 0x1dc8, 0x002e, 0x001e, 0x000e, 0x0005, 0x00e6,
+	0x0036, 0x0046, 0x0056, 0x2071, 0x1a3c, 0x080c, 0x195f, 0x005e,
+	0x004e, 0x003e, 0x00ee, 0x0005, 0x0126, 0x2091, 0x2e00, 0x2071,
+	0x1800, 0x7128, 0x2001, 0x1940, 0x2102, 0x2001, 0x1948, 0x2102,
+	0x2001, 0x013b, 0x2102, 0x2079, 0x0200, 0x2001, 0x0201, 0x789e,
+	0x78a3, 0x0200, 0x9198, 0x0007, 0x831c, 0x831c, 0x831c, 0x9398,
+	0x0005, 0x2320, 0x9182, 0x0204, 0x1230, 0x2011, 0x0008, 0x8423,
+	0x8423, 0x8423, 0x0488, 0x9182, 0x024c, 0x1240, 0x2011, 0x0007,
+	0x8403, 0x8003, 0x9400, 0x9400, 0x9420, 0x0430, 0x9182, 0x02bc,
+	0x1238, 0x2011, 0x0006, 0x8403, 0x8003, 0x9400, 0x9420, 0x00e0,
+	0x9182, 0x034c, 0x1230, 0x2011, 0x0005, 0x8403, 0x8003, 0x9420,
+	0x0098, 0x9182, 0x042c, 0x1228, 0x2011, 0x0004, 0x8423, 0x8423,
+	0x0058, 0x9182, 0x059c, 0x1228, 0x2011, 0x0003, 0x8403, 0x9420,
+	0x0018, 0x2011, 0x0002, 0x8423, 0x9482, 0x0228, 0x8002, 0x8020,
+	0x8301, 0x9402, 0x0110, 0x0208, 0x8321, 0x8217, 0x8203, 0x9405,
+	0x789a, 0x012e, 0x0005, 0x0006, 0x00d6, 0x2069, 0x0200, 0x6814,
+	0x9084, 0xffc0, 0x910d, 0x6916, 0x00de, 0x000e, 0x0005, 0x00d6,
+	0x2069, 0x0200, 0x9005, 0x6810, 0x0110, 0xc0a5, 0x0008, 0xc0a4,
+	0x6812, 0x00de, 0x0005, 0x0006, 0x00d6, 0x2069, 0x0200, 0x6810,
+	0x9084, 0xfff8, 0x910d, 0x6912, 0x00de, 0x000e, 0x0005, 0x7938,
+	0x080c, 0x0d5e, 0x00f6, 0x2079, 0x0200, 0x7902, 0xa001, 0xa001,
+	0xa001, 0xa001, 0xa001, 0xa001, 0x7902, 0xa001, 0xa001, 0xa001,
+	0xa001, 0xa001, 0xa001, 0x00fe, 0x0005, 0x0126, 0x2091, 0x2800,
+	0x2061, 0x0100, 0x2071, 0x1800, 0x2009, 0x0000, 0x080c, 0x281f,
+	0x080c, 0x273f, 0x080c, 0x2890, 0x9006, 0x080c, 0x276e, 0x9006,
+	0x080c, 0x2751, 0x20a9, 0x0012, 0x1d04, 0x207c, 0x2091, 0x6000,
+	0x1f04, 0x207c, 0x602f, 0x0100, 0x602f, 0x0000, 0x6050, 0x9085,
+	0x0400, 0x9084, 0xdfff, 0x6052, 0x6224, 0x080c, 0x286d, 0x080c,
+	0x245d, 0x2009, 0x00ef, 0x6132, 0x6136, 0x080c, 0x246d, 0x60e7,
+	0x0000, 0x61ea, 0x60e3, 0x0002, 0x604b, 0xf7f7, 0x6043, 0x0000,
+	0x602f, 0x0080, 0x602f, 0x0000, 0x6007, 0x149f, 0x00c6, 0x2061,
+	0x0140, 0x608b, 0x000b, 0x608f, 0x10b8, 0x6093, 0x0000, 0x6097,
+	0x0198, 0x00ce, 0x6004, 0x9085, 0x8000, 0x6006, 0x60bb, 0x0000,
+	0x20a9, 0x0018, 0x60bf, 0x0000, 0x1f04, 0x20ba, 0x60bb, 0x0000,
+	0x60bf, 0x0108, 0x60bf, 0x0012, 0x60bf, 0x0320, 0x60bf, 0x0018,
+	0x601b, 0x00f0, 0x601f, 0x001e, 0x600f, 0x006b, 0x602b, 0x402c,
+	0x012e, 0x0005, 0x00f6, 0x2079, 0x0140, 0x78c3, 0x0080, 0x78c3,
+	0x0083, 0x78c3, 0x0000, 0x00fe, 0x0005, 0x2001, 0x1834, 0x2003,
+	0x0000, 0x2001, 0x1833, 0x2003, 0x0001, 0x0005, 0x0126, 0x2091,
+	0x2800, 0x0006, 0x0016, 0x0026, 0x6124, 0x6028, 0x910c, 0x9184,
+	0x5e2c, 0x1118, 0x9184, 0x0007, 0x002a, 0x9195, 0x0004, 0x9284,
+	0x0007, 0x0002, 0x2105, 0x2102, 0x2102, 0x2102, 0x2104, 0x2102,
+	0x2102, 0x2102, 0x080c, 0x0d65, 0x0029, 0x002e, 0x001e, 0x000e,
+	0x012e, 0x0005, 0x00a6, 0x6124, 0x6028, 0xd09c, 0x0118, 0xd19c,
+	0x1904, 0x2364, 0xd1f4, 0x190c, 0x0d5e, 0x080c, 0x70ac, 0x0904,
+	0x2162, 0x080c, 0xbf46, 0x1120, 0x7000, 0x9086, 0x0003, 0x0580,
+	0x6024, 0x9084, 0x1800, 0x0560, 0x080c, 0x70cf, 0x0118, 0x080c,
+	0x70bd, 0x1530, 0x2011, 0x0020, 0x080c, 0x286d, 0x6043, 0x0000,
+	0x080c, 0xbf46, 0x0168, 0x080c, 0x70cf, 0x1150, 0x2001, 0x1978,
+	0x2003, 0x0001, 0x6027, 0x1800, 0x080c, 0x6f22, 0x0804, 0x2367,
+	0x70a0, 0x9005, 0x1150, 0x70a3, 0x0001, 0x00d6, 0x2069, 0x0140,
+	0x080c, 0x7103, 0x00de, 0x1904, 0x2367, 0x080c, 0x73b6, 0x0428,
+	0x080c, 0x70cf, 0x1590, 0x6024, 0x9084, 0x1800, 0x1108, 0x0468,
+	0x080c, 0x73b6, 0x080c, 0x73ac, 0x080c, 0x5cd5, 0x080c, 0x6fdd,
+	0x0804, 0x2364, 0xd1ac, 0x1508, 0x6024, 0xd0dc, 0x1170, 0xd0e4,
+	0x1178, 0xd0d4, 0x1190, 0xd0cc, 0x0130, 0x7094, 0x9086, 0x0028,
+	0x1110, 0x080c, 0x728f, 0x0804, 0x2364, 0x080c, 0x73b1, 0x0048,
+	0x2001, 0x194e, 0x2003, 0x0002, 0x0020, 0x080c, 0x71ed, 0x0804,
+	0x2364, 0x080c, 0x7331, 0x0804, 0x2364, 0xd1ac, 0x0904, 0x227e,
+	0x080c, 0x70ac, 0x11d0, 0x2011, 0x0020, 0x080c, 0x286d, 0x0006,
+	0x0026, 0x0036, 0x080c, 0x70c6, 0x1158, 0x080c, 0x73ac, 0x080c,
+	0x5cd5, 0x080c, 0x6fdd, 0x003e, 0x002e, 0x000e, 0x00ae, 0x0005,
+	0x003e, 0x002e, 0x000e, 0x080c, 0x7080, 0x0016, 0x0046, 0x00c6,
+	0x644c, 0x9486, 0xf0f0, 0x1138, 0x2061, 0x0100, 0x644a, 0x6043,
+	0x0090, 0x6043, 0x0010, 0x74d6, 0x948c, 0xff00, 0x7038, 0xd084,
+	0x0178, 0x9186, 0xf800, 0x1160, 0x7044, 0xd084, 0x1148, 0xc085,
+	0x7046, 0x0036, 0x2418, 0x2011, 0x8016, 0x080c, 0x48d1, 0x003e,
+	0x080c, 0xbf3f, 0x1904, 0x2255, 0x9196, 0xff00, 0x05a8, 0x705c,
+	0x9084, 0x00ff, 0x810f, 0x81ff, 0x0110, 0x9116, 0x0568, 0x7130,
+	0xd184, 0x1550, 0x080c, 0x317f, 0x0128, 0xc18d, 0x7132, 0x080c,
+	0x6658, 0x1510, 0x6240, 0x9294, 0x0010, 0x0130, 0x6248, 0x9294,
+	0xff00, 0x9296, 0xff00, 0x01c0, 0x7030, 0xd08c, 0x0904, 0x2255,
+	0x7038, 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904,
+	0x2255, 0xc1ad, 0x2102, 0x0036, 0x73d4, 0x2011, 0x8013, 0x080c,
+	0x48d1, 0x003e, 0x0804, 0x2255, 0x7038, 0xd08c, 0x1140, 0x2001,
+	0x180c, 0x200c, 0xd1ac, 0x1904, 0x2255, 0xc1ad, 0x2102, 0x0036,
+	0x73d4, 0x2011, 0x8013, 0x080c, 0x48d1, 0x003e, 0x7130, 0xc185,
+	0x7132, 0x2011, 0x1854, 0x220c, 0x00f0, 0x0016, 0x2009, 0x0001,
+	0x2011, 0x0100, 0x080c, 0x83c3, 0x2019, 0x000e, 0x00c6, 0x2061,
+	0x0000, 0x080c, 0xd1c9, 0x00ce, 0x9484, 0x00ff, 0x9080, 0x3184,
+	0x200d, 0x918c, 0xff00, 0x810f, 0x2120, 0x9006, 0x2009, 0x000e,
+	0x080c, 0xd251, 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0002,
+	0x2019, 0x0004, 0x080c, 0x2fc2, 0x001e, 0x0078, 0x0156, 0x00b6,
+	0x20a9, 0x007f, 0x900e, 0x080c, 0x6269, 0x1110, 0x080c, 0x5cef,
+	0x8108, 0x1f04, 0x224b, 0x00be, 0x015e, 0x00ce, 0x004e, 0x080c,
+	0x98ad, 0x080c, 0x9b52, 0x080c, 0x98c9, 0x60e3, 0x0000, 0x001e,
+	0x2001, 0x1800, 0x2014, 0x9296, 0x0004, 0x1170, 0xd19c, 0x11b0,
+	0x2011, 0x180c, 0x2214, 0xd29c, 0x1120, 0x6204, 0x9295, 0x0002,
+	0x6206, 0x6228, 0xc29d, 0x622a, 0x2003, 0x0001, 0x2001, 0x1825,
+	0x2003, 0x0000, 0x2011, 0x0020, 0x080c, 0x286d, 0xd194, 0x0904,
+	0x2364, 0x0016, 0x080c, 0x98ad, 0x6220, 0xd2b4, 0x0904, 0x230c,
+	0x080c, 0x81e3, 0x080c, 0x8f9c, 0x2011, 0x0004, 0x080c, 0x286d,
+	0x00f6, 0x2019, 0x19c4, 0x2304, 0x907d, 0x0904, 0x22d9, 0x7804,
+	0x9086, 0x0032, 0x15f0, 0x00d6, 0x00c6, 0x00e6, 0x0096, 0x2069,
+	0x0140, 0x782c, 0x685e, 0x7808, 0x685a, 0x6043, 0x0002, 0x2001,
+	0x0003, 0x8001, 0x1df0, 0x6043, 0x0000, 0x2001, 0x003c, 0x8001,
+	0x1df0, 0x080c, 0x2843, 0x2001, 0x001e, 0x8001, 0x0240, 0x20a9,
+	0x0009, 0x080c, 0x27fa, 0x6904, 0xd1dc, 0x1140, 0x0cb0, 0x2001,
+	0x0100, 0x080c, 0x2833, 0x9006, 0x080c, 0x2833, 0x080c, 0x884c,
+	0x080c, 0x98c9, 0x7814, 0x2048, 0xa867, 0x0103, 0x2f60, 0x080c,
+	0x9bcc, 0x009e, 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x00ae,
+	0x0005, 0x00fe, 0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, 0x4000,
+	0x0110, 0x080c, 0x2843, 0x00de, 0x00c6, 0x2061, 0x19b8, 0x6034,
+	0x080c, 0xbf46, 0x0120, 0x909a, 0x0003, 0x1258, 0x0018, 0x909a,
+	0x00c8, 0x1238, 0x8000, 0x6036, 0x00ce, 0x080c, 0x8f74, 0x0804,
+	0x2361, 0x2061, 0x0100, 0x62c0, 0x080c, 0x97e3, 0x2019, 0x19c4,
+	0x2304, 0x9065, 0x0130, 0x6003, 0x0001, 0x2009, 0x0027, 0x080c,
+	0x9c6a, 0x00ce, 0x0804, 0x2361, 0xd2bc, 0x05e0, 0x080c, 0x81f0,
+	0x2011, 0x0004, 0x080c, 0x286d, 0x00d6, 0x2069, 0x0140, 0x6804,
+	0x9084, 0x4000, 0x0110, 0x080c, 0x2843, 0x00de, 0x00c6, 0x2061,
+	0x19b8, 0x6050, 0x080c, 0xbf46, 0x0120, 0x909a, 0x0003, 0x1638,
+	0x0018, 0x909a, 0x00c8, 0x1618, 0x8000, 0x6052, 0x604c, 0x00ce,
+	0x9005, 0x0578, 0x2009, 0x07d0, 0x080c, 0x81e8, 0x9080, 0x0008,
+	0x2004, 0x9086, 0x0006, 0x1138, 0x2009, 0x1984, 0x2011, 0x0012,
+	0x080c, 0x287c, 0x00f0, 0x2009, 0x1984, 0x2011, 0x0016, 0x080c,
+	0x287c, 0x00b8, 0x2011, 0x0004, 0x080c, 0x286d, 0x0090, 0x0036,
+	0x2019, 0x0001, 0x080c, 0x926b, 0x003e, 0x2019, 0x19cb, 0x2304,
+	0x9065, 0x0130, 0x2009, 0x004f, 0x6003, 0x0003, 0x080c, 0x9c6a,
+	0x00ce, 0x080c, 0x98c9, 0x001e, 0xd19c, 0x0904, 0x23c2, 0x7038,
+	0xd0ac, 0x1538, 0x0016, 0x0156, 0x2011, 0x0008, 0x080c, 0x286d,
+	0x6050, 0xc0e5, 0x6052, 0x20a9, 0x0367, 0x1f04, 0x238f, 0x1d04,
+	0x2377, 0x080c, 0x8217, 0x6020, 0xd09c, 0x1db8, 0x00f6, 0x2079,
+	0x0100, 0x080c, 0x27aa, 0x00fe, 0x1d80, 0x6050, 0xc0e4, 0x6052,
+	0x2011, 0x0008, 0x080c, 0x286d, 0x015e, 0x001e, 0x0498, 0x015e,
+	0x001e, 0x0016, 0x6028, 0xc09c, 0x602a, 0x080c, 0x98ad, 0x080c,
+	0x9b52, 0x080c, 0x98c9, 0x60e3, 0x0000, 0x080c, 0xd5d9, 0x080c,
+	0xd5f4, 0x080c, 0x538a, 0xd0fc, 0x1138, 0x080c, 0xbf3f, 0x1120,
+	0x9085, 0x0001, 0x080c, 0x70f3, 0x9006, 0x080c, 0x2833, 0x2009,
+	0x0002, 0x080c, 0x281f, 0x00e6, 0x2071, 0x1800, 0x7003, 0x0004,
+	0x080c, 0x0e9c, 0x00ee, 0x2011, 0x0008, 0x080c, 0x286d, 0x080c,
+	0x0bab, 0x001e, 0x918c, 0xffd0, 0x2110, 0x080c, 0x286d, 0x00ae,
+	0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, 0x00f6, 0x0126,
+	0x2091, 0x8000, 0x2071, 0x1800, 0x71cc, 0x70ce, 0x9116, 0x0904,
+	0x241c, 0x81ff, 0x01a0, 0x2009, 0x0000, 0x080c, 0x281f, 0x2011,
+	0x8011, 0x2019, 0x010e, 0x231c, 0x939e, 0x0007, 0x1118, 0x2019,
+	0x0001, 0x0010, 0x2019, 0x0000, 0x080c, 0x48d1, 0x0468, 0x2001,
+	0x1979, 0x200c, 0x81ff, 0x1140, 0x2001, 0x0109, 0x2004, 0xd0b4,
+	0x0118, 0x2019, 0x0003, 0x0008, 0x2118, 0x2011, 0x8012, 0x080c,
+	0x48d1, 0x080c, 0x0e9c, 0x080c, 0x538a, 0xd0fc, 0x11a8, 0x080c,
+	0xbf3f, 0x1190, 0x00c6, 0x080c, 0x24b8, 0x080c, 0x98ad, 0x080c,
+	0x91c6, 0x080c, 0x98c9, 0x2061, 0x0100, 0x2019, 0x0028, 0x2009,
+	0x0002, 0x080c, 0x2fc2, 0x00ce, 0x012e, 0x00fe, 0x00ee, 0x003e,
+	0x002e, 0x001e, 0x000e, 0x0005, 0x2028, 0x918c, 0x00ff, 0x2130,
+	0x9094, 0xff00, 0x11f0, 0x2011, 0x1836, 0x2214, 0xd2ac, 0x11c8,
+	0x81ff, 0x01e8, 0x2011, 0x181e, 0x2204, 0x9106, 0x1190, 0x2011,
+	0x181f, 0x2214, 0x9294, 0xff00, 0x9584, 0xff00, 0x9206, 0x1148,
+	0x2011, 0x181f, 0x2214, 0x9294, 0x00ff, 0x9584, 0x00ff, 0x9206,
+	0x1120, 0x2500, 0x080c, 0x7d48, 0x0048, 0x9584, 0x00ff, 0x9080,
+	0x3184, 0x200d, 0x918c, 0xff00, 0x810f, 0x9006, 0x0005, 0x9080,
+	0x3184, 0x200d, 0x918c, 0x00ff, 0x0005, 0x00d6, 0x2069, 0x0140,
+	0x2001, 0x1817, 0x2003, 0x00ef, 0x20a9, 0x0010, 0x9006, 0x6852,
+	0x6856, 0x1f04, 0x2468, 0x00de, 0x0005, 0x0006, 0x00d6, 0x0026,
+	0x2069, 0x0140, 0x2001, 0x1817, 0x2102, 0x8114, 0x8214, 0x8214,
+	0x8214, 0x20a9, 0x0010, 0x6853, 0x0000, 0x9006, 0x82ff, 0x1128,
+	0x9184, 0x000f, 0x9080, 0xd608, 0x2005, 0x6856, 0x8211, 0x1f04,
+	0x247d, 0x002e, 0x00de, 0x000e, 0x0005, 0x00c6, 0x2061, 0x1800,
+	0x6030, 0x0110, 0xc09d, 0x0008, 0xc09c, 0x6032, 0x00ce, 0x0005,
+	0x0156, 0x00d6, 0x0026, 0x0016, 0x0006, 0x2069, 0x0140, 0x6980,
+	0x9116, 0x0180, 0x9112, 0x1230, 0x8212, 0x8210, 0x22a8, 0x2001,
+	0x0402, 0x0018, 0x22a8, 0x2001, 0x0404, 0x680e, 0x1f04, 0x24ad,
+	0x680f, 0x0000, 0x000e, 0x001e, 0x002e, 0x00de, 0x015e, 0x0005,
+	0x080c, 0x5386, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006, 0x0046,
+	0x2020, 0x2009, 0x002e, 0x080c, 0xd251, 0x004e, 0x0005, 0x00f6,
+	0x0016, 0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, 0x0904, 0x2524,
+	0x080c, 0x279a, 0x0660, 0x9084, 0x0700, 0x908e, 0x0600, 0x1120,
+	0x2011, 0x4000, 0x900e, 0x0458, 0x908e, 0x0500, 0x1120, 0x2011,
+	0x8000, 0x900e, 0x0420, 0x908e, 0x0400, 0x1120, 0x9016, 0x2009,
+	0x0001, 0x00e8, 0x908e, 0x0300, 0x1120, 0x9016, 0x2009, 0x0002,
+	0x00b0, 0x908e, 0x0200, 0x1120, 0x9016, 0x2009, 0x0004, 0x0078,
+	0x908e, 0x0100, 0x1548, 0x9016, 0x2009, 0x0008, 0x0040, 0x9084,
+	0x0700, 0x908e, 0x0300, 0x1500, 0x2011, 0x0030, 0x0058, 0x2300,
+	0x9080, 0x0020, 0x2018, 0x080c, 0x83f1, 0x928c, 0xff00, 0x0110,
+	0x2011, 0x00ff, 0x2200, 0x8007, 0x9085, 0x004c, 0x78c2, 0x2009,
+	0x0138, 0x220a, 0x080c, 0x70ac, 0x1118, 0x2009, 0x193e, 0x220a,
+	0x002e, 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, 0x0cc8, 0x0126,
+	0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x2001, 0x0170, 0x200c,
+	0x8000, 0x2014, 0x9184, 0x0003, 0x0110, 0x080c, 0x0d5e, 0x002e,
+	0x001e, 0x000e, 0x012e, 0x0005, 0x2001, 0x0171, 0x2004, 0xd0dc,
+	0x0168, 0x2001, 0x0170, 0x200c, 0x918c, 0x00ff, 0x918e, 0x004c,
+	0x1128, 0x200c, 0x918c, 0xff00, 0x810f, 0x0005, 0x900e, 0x2001,
+	0x0227, 0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9108, 0x2001,
+	0x0226, 0x2004, 0x8007, 0x9084, 0x00ff, 0x8004, 0x9108, 0x0005,
+	0x0018, 0x000c, 0x0018, 0x0020, 0x1000, 0x0800, 0x1000, 0x1800,
+	0x0156, 0x0006, 0x0016, 0x0026, 0x00e6, 0x2001, 0x1961, 0x2004,
+	0x908a, 0x0007, 0x1a0c, 0x0d65, 0x0033, 0x00ee, 0x002e, 0x001e,
+	0x000e, 0x015e, 0x0005, 0x2582, 0x25a0, 0x25c4, 0x25c6, 0x25ef,
+	0x25f1, 0x25f3, 0x2001, 0x0001, 0x080c, 0x23c9, 0x080c, 0x27e4,
+	0x2001, 0x1963, 0x2003, 0x0000, 0x7828, 0x9084, 0xe1d7, 0x782a,
+	0x9006, 0x20a9, 0x0009, 0x080c, 0x27b6, 0x2001, 0x1961, 0x2003,
+	0x0006, 0x2009, 0x001e, 0x2011, 0x25f4, 0x080c, 0x81f5, 0x0005,
+	0x2009, 0x1966, 0x200b, 0x0000, 0x2001, 0x196b, 0x2003, 0x0036,
+	0x2001, 0x196a, 0x2003, 0x002a, 0x2001, 0x1963, 0x2003, 0x0001,
+	0x9006, 0x080c, 0x2751, 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c,
+	0x27b6, 0x2001, 0x1961, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011,
+	0x25f4, 0x080c, 0x81f5, 0x0005, 0x080c, 0x0d65, 0x2001, 0x196b,
+	0x2003, 0x0036, 0x2001, 0x1963, 0x2003, 0x0003, 0x7a38, 0x9294,
+	0x0005, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001,
+	0x080c, 0x2751, 0x2001, 0x1967, 0x2003, 0x0000, 0x2001, 0xffff,
+	0x20a9, 0x0009, 0x080c, 0x27b6, 0x2001, 0x1961, 0x2003, 0x0006,
+	0x2009, 0x001e, 0x2011, 0x25f4, 0x080c, 0x81f5, 0x0005, 0x080c,
+	0x0d65, 0x080c, 0x0d65, 0x0005, 0x0006, 0x0016, 0x0026, 0x00e6,
+	0x00f6, 0x0156, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, 0x2001,
+	0x1963, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0d65, 0x0043, 0x012e,
+	0x015e, 0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, 0x0005, 0x2616,
+	0x2636, 0x2676, 0x26a6, 0x26ca, 0x26da, 0x26dc, 0x080c, 0x27aa,
+	0x11b0, 0x7850, 0x9084, 0xefff, 0x7852, 0x2009, 0x1969, 0x2104,
+	0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0xc08d, 0x0008,
+	0xc085, 0x200a, 0x2001, 0x1961, 0x2003, 0x0001, 0x0030, 0x080c,
+	0x2700, 0x2001, 0xffff, 0x080c, 0x2591, 0x0005, 0x080c, 0x26de,
+	0x05e0, 0x2009, 0x196a, 0x2104, 0x8001, 0x200a, 0x080c, 0x27aa,
+	0x1178, 0x7850, 0x9084, 0xefff, 0x7852, 0x7a38, 0x9294, 0x0005,
+	0x9296, 0x0005, 0x0518, 0x2009, 0x1969, 0x2104, 0xc085, 0x200a,
+	0x2009, 0x1966, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005, 0x0118,
+	0x080c, 0x26e6, 0x00c0, 0x200b, 0x0000, 0x7a38, 0x9294, 0x0006,
+	0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c,
+	0x276e, 0x2001, 0x1963, 0x2003, 0x0002, 0x0028, 0x2001, 0x1961,
+	0x2003, 0x0003, 0x0010, 0x080c, 0x25b3, 0x0005, 0x080c, 0x26de,
+	0x0560, 0x2009, 0x196a, 0x2104, 0x8001, 0x200a, 0x080c, 0x27aa,
+	0x1168, 0x7850, 0x9084, 0xefff, 0x7852, 0x2001, 0x1961, 0x2003,
+	0x0003, 0x2001, 0x1962, 0x2003, 0x0000, 0x00b8, 0x2009, 0x196a,
+	0x2104, 0x9005, 0x1118, 0x080c, 0x2723, 0x0010, 0x080c, 0x26f3,
+	0x080c, 0x26e6, 0x2009, 0x1966, 0x200b, 0x0000, 0x2001, 0x1963,
+	0x2003, 0x0001, 0x080c, 0x25b3, 0x0000, 0x0005, 0x04b9, 0x0508,
+	0x080c, 0x27aa, 0x11b8, 0x7850, 0x9084, 0xefff, 0x7852, 0x2009,
+	0x1967, 0x2104, 0x8000, 0x200a, 0x9086, 0x0007, 0x0108, 0x0078,
+	0x2001, 0x196c, 0x2003, 0x000a, 0x2009, 0x1969, 0x2104, 0xc0fd,
+	0x200a, 0x0038, 0x0419, 0x2001, 0x1963, 0x2003, 0x0004, 0x080c,
+	0x25de, 0x0005, 0x0099, 0x0168, 0x080c, 0x27aa, 0x1138, 0x7850,
+	0x9084, 0xefff, 0x7852, 0x080c, 0x25ca, 0x0018, 0x0079, 0x080c,
+	0x25de, 0x0005, 0x080c, 0x0d65, 0x080c, 0x0d65, 0x2009, 0x196b,
+	0x2104, 0x8001, 0x200a, 0x090c, 0x273f, 0x0005, 0x7a38, 0x9294,
+	0x0005, 0x9296, 0x0005, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001,
+	0x080c, 0x276e, 0x0005, 0x7a38, 0x9294, 0x0006, 0x9296, 0x0006,
+	0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2751, 0x0005,
+	0x2009, 0x1966, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005, 0x0108,
+	0x0068, 0x200b, 0x0000, 0x7a38, 0x9294, 0x0006, 0x9296, 0x0006,
+	0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x04d9, 0x7a38, 0x9294,
+	0x0005, 0x9296, 0x0005, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001,
+	0x080c, 0x276e, 0x0005, 0x0086, 0x2001, 0x1969, 0x2004, 0x9084,
+	0x7fff, 0x090c, 0x0d65, 0x2009, 0x1968, 0x2144, 0x8846, 0x280a,
+	0x9844, 0x0dd8, 0xd08c, 0x1120, 0xd084, 0x1120, 0x080c, 0x0d65,
+	0x9006, 0x0010, 0x2001, 0x0001, 0x00a1, 0x008e, 0x0005, 0x0006,
+	0x0156, 0x2001, 0x1961, 0x20a9, 0x0009, 0x2003, 0x0000, 0x8000,
+	0x1f04, 0x2745, 0x2001, 0x1968, 0x2003, 0x8000, 0x015e, 0x000e,
 	0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0158, 0x7838,
-	0x9084, 0xfffa, 0x9085, 0x0004, 0x783a, 0x7850, 0x9084, 0xfff0,
-	0x7852, 0x0060, 0x7838, 0x9084, 0xfffb, 0x9085, 0x0005, 0x783a,
-	0x7850, 0x9084, 0xfff0, 0x9085, 0x0000, 0x7852, 0x00fe, 0x0005,
-	0x0006, 0x2001, 0x0100, 0x2004, 0x9082, 0x0007, 0x000e, 0x0005,
-	0x0006, 0x2001, 0x0100, 0x2004, 0x9082, 0x0009, 0x000e, 0x0005,
-	0x0156, 0x20a9, 0x0064, 0x7820, 0x080c, 0x27d7, 0xd09c, 0x1110,
-	0x1f04, 0x276b, 0x015e, 0x0005, 0x0126, 0x0016, 0x0006, 0x2091,
-	0x8000, 0x000e, 0x2008, 0x9186, 0x0000, 0x1118, 0x783b, 0x0007,
-	0x0090, 0x9186, 0x0001, 0x1118, 0x783b, 0x0006, 0x0060, 0x9186,
-	0x0002, 0x1118, 0x783b, 0x0005, 0x0030, 0x9186, 0x0003, 0x1118,
-	0x783b, 0x0004, 0x0000, 0x0006, 0x1d04, 0x2794, 0x080c, 0x809c,
-	0x1f04, 0x2794, 0x7850, 0x9085, 0x1000, 0x7852, 0x000e, 0x001e,
-	0x012e, 0x0005, 0x080c, 0x2892, 0x0005, 0x0006, 0x0156, 0x00f6,
-	0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd0ac, 0x1100, 0x7854,
-	0xd08c, 0x1110, 0x1f04, 0x27af, 0x00fe, 0x015e, 0x000e, 0x0005,
-	0x1d04, 0x27b8, 0x080c, 0x809c, 0x1f04, 0x27b8, 0x0005, 0x0006,
-	0x2001, 0x196b, 0x2004, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006,
-	0x2001, 0x196b, 0x2004, 0x9086, 0x0001, 0x000e, 0x0005, 0x0006,
-	0x2001, 0x196b, 0x2004, 0x9086, 0x0002, 0x000e, 0x0005, 0xa001,
-	0xa001, 0xa001, 0xa001, 0xa001, 0x0005, 0x0006, 0x2001, 0x1977,
-	0x2102, 0x000e, 0x0005, 0x2009, 0x0171, 0x2104, 0xd0dc, 0x0140,
-	0x2009, 0x0170, 0x2104, 0x200b, 0x0080, 0xa001, 0xa001, 0x200a,
-	0x0005, 0x0016, 0x0026, 0x080c, 0x6f76, 0x0108, 0xc0bc, 0x2009,
-	0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a, 0x002e, 0x001e,
+	0x9084, 0xfff9, 0x9085, 0x0004, 0x783a, 0x2009, 0x196e, 0x210c,
+	0x795a, 0x0050, 0x7838, 0x9084, 0xfffb, 0x9085, 0x0006, 0x783a,
+	0x2009, 0x196f, 0x210c, 0x795a, 0x00fe, 0x0005, 0x00f6, 0x2079,
+	0x0100, 0x9085, 0x0000, 0x0158, 0x7838, 0x9084, 0xfffa, 0x9085,
+	0x0004, 0x783a, 0x7850, 0x9084, 0xfff0, 0x7852, 0x00c8, 0x7838,
+	0x9084, 0xfffb, 0x9085, 0x0005, 0x783a, 0x7850, 0x9084, 0xfff0,
+	0x0016, 0x2009, 0x0003, 0x210c, 0x918c, 0x0600, 0x918e, 0x0400,
+	0x0118, 0x9085, 0x000a, 0x0010, 0x9085, 0x0000, 0x001e, 0x7852,
+	0x00fe, 0x0005, 0x0006, 0x2001, 0x0100, 0x2004, 0x9082, 0x0007,
+	0x000e, 0x0005, 0x0006, 0x2001, 0x0100, 0x2004, 0x9082, 0x0009,
+	0x000e, 0x0005, 0x0156, 0x20a9, 0x0064, 0x7820, 0x080c, 0x2819,
+	0xd09c, 0x1110, 0x1f04, 0x27ad, 0x015e, 0x0005, 0x0126, 0x0016,
+	0x0006, 0x2091, 0x8000, 0x000e, 0x2008, 0x9186, 0x0000, 0x1118,
+	0x783b, 0x0007, 0x0090, 0x9186, 0x0001, 0x1118, 0x783b, 0x0006,
+	0x0060, 0x9186, 0x0002, 0x1118, 0x783b, 0x0005, 0x0030, 0x9186,
+	0x0003, 0x1118, 0x783b, 0x0004, 0x0000, 0x0006, 0x1d04, 0x27d6,
+	0x080c, 0x8217, 0x1f04, 0x27d6, 0x7850, 0x9085, 0x1000, 0x7852,
+	0x000e, 0x001e, 0x012e, 0x0005, 0x080c, 0x28d4, 0x0005, 0x0006,
+	0x0156, 0x00f6, 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd0ac,
+	0x1100, 0x7854, 0xd08c, 0x1110, 0x1f04, 0x27f1, 0x00fe, 0x015e,
+	0x000e, 0x0005, 0x1d04, 0x27fa, 0x080c, 0x8217, 0x1f04, 0x27fa,
+	0x0005, 0x0006, 0x2001, 0x196d, 0x2004, 0x9086, 0x0000, 0x000e,
+	0x0005, 0x0006, 0x2001, 0x196d, 0x2004, 0x9086, 0x0001, 0x000e,
+	0x0005, 0x0006, 0x2001, 0x196d, 0x2004, 0x9086, 0x0002, 0x000e,
+	0x0005, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x0005, 0x0006,
+	0x2001, 0x1979, 0x2102, 0x000e, 0x0005, 0x2009, 0x0171, 0x2104,
+	0xd0dc, 0x0140, 0x2009, 0x0170, 0x2104, 0x200b, 0x0080, 0xa001,
+	0xa001, 0x200a, 0x0005, 0x0016, 0x0026, 0x080c, 0x70c6, 0x0108,
+	0xc0bc, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a,
+	0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x2009, 0x0140, 0x2114,
+	0x9294, 0x0001, 0x9285, 0x1000, 0x200a, 0x220a, 0x002e, 0x001e,
 	0x0005, 0x0016, 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001,
-	0x9285, 0x1000, 0x200a, 0x220a, 0x002e, 0x001e, 0x0005, 0x0016,
-	0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a,
-	0x002e, 0x001e, 0x0005, 0x0006, 0x0016, 0x2009, 0x0140, 0x2104,
-	0x1128, 0x080c, 0x6f76, 0x0110, 0xc0bc, 0x0008, 0xc0bd, 0x200a,
-	0x001e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0380, 0x7843, 0x0101,
-	0x7844, 0xd084, 0x1de8, 0x2001, 0x0109, 0x2202, 0x7843, 0x0100,
-	0x00fe, 0x0005, 0x00f6, 0x2079, 0x0380, 0x7843, 0x0202, 0x7844,
-	0xd08c, 0x1de8, 0x2079, 0x0100, 0x7814, 0x9104, 0x9205, 0x7a16,
-	0x2079, 0x0380, 0x7843, 0x0200, 0x00fe, 0x0005, 0x0016, 0x0026,
-	0x0036, 0x00c6, 0x2061, 0x0100, 0x6050, 0x9084, 0xfbff, 0x9085,
-	0x0040, 0x6052, 0x20a9, 0x0002, 0x080c, 0x27b8, 0x6050, 0x9085,
-	0x0400, 0x9084, 0xff9f, 0x6052, 0x20a9, 0x0005, 0x080c, 0x27b8,
-	0x6054, 0xd0bc, 0x090c, 0x0d65, 0x20a9, 0x0005, 0x080c, 0x27b8,
-	0x6054, 0xd0ac, 0x090c, 0x0d65, 0x2009, 0x197e, 0x9084, 0x7e00,
-	0x8007, 0x8004, 0x8004, 0x200a, 0x9085, 0x0000, 0x605a, 0x2009,
-	0x196c, 0x2011, 0x196d, 0x6358, 0x939c, 0x38df, 0x2320, 0x939d,
-	0x0000, 0x94a5, 0x0000, 0x230a, 0x2412, 0x00ce, 0x003e, 0x002e,
-	0x001e, 0x0005, 0x0006, 0x00c6, 0x2061, 0x0100, 0x6050, 0xc0cd,
-	0x6052, 0x00ce, 0x000e, 0x0005, 0x2d98, 0x2d98, 0x299c, 0x299c,
-	0x29a8, 0x29a8, 0x29b4, 0x29b4, 0x29c2, 0x29c2, 0x29ce, 0x29ce,
-	0x29dc, 0x29dc, 0x29ea, 0x29ea, 0x29fc, 0x29fc, 0x2a08, 0x2a08,
-	0x2a16, 0x2a16, 0x2a34, 0x2a34, 0x2a54, 0x2a54, 0x2a24, 0x2a24,
-	0x2a44, 0x2a44, 0x2a62, 0x2a62, 0x29fa, 0x29fa, 0x29fa, 0x29fa,
-	0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa,
-	0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa,
-	0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa,
-	0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x2a74, 0x2a74, 0x2a80, 0x2a80,
-	0x2a8e, 0x2a8e, 0x2a9c, 0x2a9c, 0x2aac, 0x2aac, 0x2aba, 0x2aba,
-	0x2aca, 0x2aca, 0x2ada, 0x2ada, 0x2aec, 0x2aec, 0x2afa, 0x2afa,
-	0x2b0a, 0x2b0a, 0x2b2c, 0x2b2c, 0x2b50, 0x2b50, 0x2b1a, 0x2b1a,
-	0x2b3e, 0x2b3e, 0x2b60, 0x2b60, 0x29fa, 0x29fa, 0x29fa, 0x29fa,
-	0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa,
-	0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa,
-	0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa,
-	0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x2b74, 0x2b74, 0x2b80, 0x2b80,
-	0x2b8e, 0x2b8e, 0x2b9c, 0x2b9c, 0x2bac, 0x2bac, 0x2bba, 0x2bba,
-	0x2bca, 0x2bca, 0x2bda, 0x2bda, 0x2bec, 0x2bec, 0x2bfa, 0x2bfa,
-	0x2c0a, 0x2c0a, 0x2c1a, 0x2c1a, 0x2c2c, 0x2c2c, 0x2c3c, 0x2c3c,
-	0x2c4e, 0x2c4e, 0x2c60, 0x2c60, 0x29fa, 0x29fa, 0x29fa, 0x29fa,
-	0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa,
-	0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa,
-	0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa,
-	0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x2c74, 0x2c74, 0x2c82, 0x2c82,
-	0x2c92, 0x2c92, 0x2ca2, 0x2ca2, 0x2cb4, 0x2cb4, 0x2cc4, 0x2cc4,
-	0x2cd6, 0x2cd6, 0x2ce8, 0x2ce8, 0x2cfc, 0x2cfc, 0x2d0c, 0x2d0c,
-	0x2d1e, 0x2d1e, 0x2d30, 0x2d30, 0x2d44, 0x2d44, 0x2d55, 0x2d55,
-	0x2d68, 0x2d68, 0x2d7b, 0x2d7b, 0x29fa, 0x29fa, 0x29fa, 0x29fa,
-	0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa,
-	0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa,
-	0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x29fa,
-	0x29fa, 0x29fa, 0x29fa, 0x29fa, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20b1, 0x0804, 0x2d90,
-	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x1eeb, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x20b1,
-	0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20b1,
-	0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x1f15,
-	0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x20b1, 0x080c, 0x1f15,
-	0x0804, 0x2d90, 0xa001, 0x0cf0, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1321, 0x0804, 0x2d90,
-	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x20b1, 0x080c, 0x1321, 0x0804, 0x2d90, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1eeb,
-	0x080c, 0x1321, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20b1, 0x080c, 0x1321,
-	0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x20b1,
-	0x080c, 0x1321, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x1321,
-	0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1321, 0x080c, 0x1f15,
-	0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x20b1, 0x080c, 0x1321,
-	0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x0804, 0x2d90,
+	0x9215, 0x220a, 0x002e, 0x001e, 0x0005, 0x0006, 0x0016, 0x2009,
+	0x0140, 0x2104, 0x1128, 0x080c, 0x70c6, 0x0110, 0xc0bc, 0x0008,
+	0xc0bd, 0x200a, 0x001e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0380,
+	0x7843, 0x0101, 0x7844, 0xd084, 0x1de8, 0x2001, 0x0109, 0x2202,
+	0x7843, 0x0100, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0380, 0x7843,
+	0x0202, 0x7844, 0xd08c, 0x1de8, 0x2079, 0x0100, 0x7814, 0x9104,
+	0x9205, 0x7a16, 0x2079, 0x0380, 0x7843, 0x0200, 0x00fe, 0x0005,
+	0x0016, 0x0026, 0x0036, 0x00c6, 0x2061, 0x0100, 0x6050, 0x9084,
+	0xfbff, 0x9085, 0x0040, 0x6052, 0x20a9, 0x0002, 0x080c, 0x27fa,
+	0x6050, 0x9085, 0x0400, 0x9084, 0xff9f, 0x6052, 0x20a9, 0x0005,
+	0x080c, 0x27fa, 0x6054, 0xd0bc, 0x090c, 0x0d65, 0x20a9, 0x0005,
+	0x080c, 0x27fa, 0x6054, 0xd0ac, 0x090c, 0x0d65, 0x2009, 0x1980,
+	0x9084, 0x7e00, 0x8007, 0x8004, 0x8004, 0x200a, 0x9085, 0x0000,
+	0x605a, 0x2009, 0x196e, 0x2011, 0x196f, 0x6358, 0x939c, 0x38df,
+	0x2320, 0x939d, 0x0000, 0x94a5, 0x0000, 0x230a, 0x2412, 0x00ce,
+	0x003e, 0x002e, 0x001e, 0x0005, 0x0006, 0x00c6, 0x2061, 0x0100,
+	0x6050, 0xc0cd, 0x6052, 0x00ce, 0x000e, 0x0005, 0x2dda, 0x2dda,
+	0x29de, 0x29de, 0x29ea, 0x29ea, 0x29f6, 0x29f6, 0x2a04, 0x2a04,
+	0x2a10, 0x2a10, 0x2a1e, 0x2a1e, 0x2a2c, 0x2a2c, 0x2a3e, 0x2a3e,
+	0x2a4a, 0x2a4a, 0x2a58, 0x2a58, 0x2a76, 0x2a76, 0x2a96, 0x2a96,
+	0x2a66, 0x2a66, 0x2a86, 0x2a86, 0x2aa4, 0x2aa4, 0x2a3c, 0x2a3c,
+	0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c,
+	0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c,
+	0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c,
+	0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2ab6, 0x2ab6,
+	0x2ac2, 0x2ac2, 0x2ad0, 0x2ad0, 0x2ade, 0x2ade, 0x2aee, 0x2aee,
+	0x2afc, 0x2afc, 0x2b0c, 0x2b0c, 0x2b1c, 0x2b1c, 0x2b2e, 0x2b2e,
+	0x2b3c, 0x2b3c, 0x2b4c, 0x2b4c, 0x2b6e, 0x2b6e, 0x2b92, 0x2b92,
+	0x2b5c, 0x2b5c, 0x2b80, 0x2b80, 0x2ba2, 0x2ba2, 0x2a3c, 0x2a3c,
+	0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c,
+	0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c,
+	0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c,
+	0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2bb6, 0x2bb6,
+	0x2bc2, 0x2bc2, 0x2bd0, 0x2bd0, 0x2bde, 0x2bde, 0x2bee, 0x2bee,
+	0x2bfc, 0x2bfc, 0x2c0c, 0x2c0c, 0x2c1c, 0x2c1c, 0x2c2e, 0x2c2e,
+	0x2c3c, 0x2c3c, 0x2c4c, 0x2c4c, 0x2c5c, 0x2c5c, 0x2c6e, 0x2c6e,
+	0x2c7e, 0x2c7e, 0x2c90, 0x2c90, 0x2ca2, 0x2ca2, 0x2a3c, 0x2a3c,
+	0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c,
+	0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c,
+	0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c,
+	0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2cb6, 0x2cb6,
+	0x2cc4, 0x2cc4, 0x2cd4, 0x2cd4, 0x2ce4, 0x2ce4, 0x2cf6, 0x2cf6,
+	0x2d06, 0x2d06, 0x2d18, 0x2d18, 0x2d2a, 0x2d2a, 0x2d3e, 0x2d3e,
+	0x2d4e, 0x2d4e, 0x2d60, 0x2d60, 0x2d72, 0x2d72, 0x2d86, 0x2d86,
+	0x2d97, 0x2d97, 0x2daa, 0x2daa, 0x2dbd, 0x2dbd, 0x2a3c, 0x2a3c,
+	0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c,
+	0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c,
+	0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c,
+	0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20e6,
+	0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
+	0x0146, 0x0156, 0x080c, 0x1f20, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20,
+	0x080c, 0x20e6, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f4a, 0x0804, 0x2dd2,
 	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x24f2, 0x080c, 0x20b1, 0x0804, 0x2d90, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2,
-	0x080c, 0x1eeb, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x1eeb,
-	0x080c, 0x20b1, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x1f15,
-	0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x20b1, 0x080c, 0x1f15,
-	0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x1eeb, 0x080c, 0x1f15,
-	0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x1eeb, 0x080c, 0x20b1,
-	0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x1321,
-	0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x20b1, 0x080c, 0x1321,
-	0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x1eeb, 0x080c, 0x1321,
-	0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x20b1, 0x080c, 0x1321,
-	0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x1eeb,
-	0x080c, 0x20b1, 0x080c, 0x1321, 0x0804, 0x2d90, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2,
-	0x080c, 0x1eeb, 0x080c, 0x1321, 0x080c, 0x1f15, 0x0804, 0x2d90,
+	0x080c, 0x20e6, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20,
+	0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20, 0x080c, 0x20e6,
+	0x080c, 0x1f4a, 0x0804, 0x2dd2, 0xa001, 0x0cf0, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x132a,
+	0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
+	0x0146, 0x0156, 0x080c, 0x20e6, 0x080c, 0x132a, 0x0804, 0x2dd2,
 	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x24f2, 0x080c, 0x1321, 0x080c, 0x1f15, 0x0804, 0x2d90,
+	0x080c, 0x1f20, 0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20e6,
+	0x080c, 0x132a, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20,
+	0x080c, 0x20e6, 0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20,
+	0x080c, 0x132a, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x132a,
+	0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20, 0x080c, 0x20e6,
+	0x080c, 0x132a, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527,
+	0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
+	0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x20e6, 0x0804, 0x2dd2,
 	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x24f2, 0x080c, 0x1eeb, 0x080c, 0x20b1, 0x080c, 0x1321,
-	0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x97ac, 0x0804, 0x2d90,
+	0x080c, 0x2527, 0x080c, 0x1f20, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527,
+	0x080c, 0x1f20, 0x080c, 0x20e6, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527,
+	0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x20e6,
+	0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x1f20,
+	0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x1f20,
+	0x080c, 0x20e6, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527,
+	0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x20e6,
+	0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x1f20,
+	0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x20e6,
+	0x080c, 0x132a, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527,
+	0x080c, 0x1f20, 0x080c, 0x20e6, 0x080c, 0x132a, 0x0804, 0x2dd2,
 	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x97ac, 0x080c, 0x20b1, 0x0804, 0x2d90, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1eeb,
-	0x080c, 0x97ac, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x97ac,
-	0x080c, 0x20b1, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x97ac, 0x080c, 0x1f15,
-	0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x97ac, 0x080c, 0x20b1, 0x080c, 0x1f15,
-	0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x97ac, 0x080c, 0x1f15,
-	0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x97ac, 0x080c, 0x20b1,
-	0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x97ac, 0x080c, 0x1321,
-	0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x97ac, 0x080c, 0x20b1, 0x080c, 0x1321,
-	0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x97ac, 0x080c, 0x1321,
-	0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x1eeb, 0x080c, 0x97ac, 0x080c, 0x20b1,
-	0x080c, 0x1321, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x97ac, 0x080c, 0x1321,
-	0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x97ac, 0x080c, 0x20b1,
-	0x080c, 0x1321, 0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1eeb,
-	0x080c, 0x97ac, 0x080c, 0x1321, 0x080c, 0x1f15, 0x0804, 0x2d90,
+	0x080c, 0x2527, 0x080c, 0x1f20, 0x080c, 0x132a, 0x080c, 0x1f4a,
+	0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
+	0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x132a, 0x080c, 0x1f4a,
+	0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
+	0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x1f20, 0x080c, 0x20e6,
+	0x080c, 0x132a, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x9913,
+	0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
+	0x0146, 0x0156, 0x080c, 0x9913, 0x080c, 0x20e6, 0x0804, 0x2dd2,
 	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x1eeb, 0x080c, 0x97ac, 0x080c, 0x20b1, 0x080c, 0x1321,
-	0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x97ac,
-	0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x97ac, 0x080c, 0x20b1,
-	0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x1eeb, 0x080c, 0x97ac,
-	0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x1eeb, 0x080c, 0x97ac,
-	0x080c, 0x20b1, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x97ac,
-	0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x97ac,
-	0x080c, 0x20b1, 0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2,
-	0x080c, 0x1eeb, 0x080c, 0x97ac, 0x080c, 0x1f15, 0x0804, 0x2d90,
+	0x080c, 0x1f20, 0x080c, 0x9913, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20,
+	0x080c, 0x9913, 0x080c, 0x20e6, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x9913,
+	0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x9913, 0x080c, 0x20e6,
+	0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20, 0x080c, 0x9913,
+	0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20, 0x080c, 0x9913,
+	0x080c, 0x20e6, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x9913,
+	0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x9913, 0x080c, 0x20e6,
+	0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20, 0x080c, 0x9913,
+	0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20, 0x080c, 0x9913,
+	0x080c, 0x20e6, 0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x9913,
+	0x080c, 0x132a, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x9913,
+	0x080c, 0x20e6, 0x080c, 0x132a, 0x080c, 0x1f4a, 0x0804, 0x2dd2,
 	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x24f2, 0x080c, 0x1eeb, 0x080c, 0x97ac, 0x080c, 0x20b1,
-	0x080c, 0x1f15, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x97ac,
-	0x080c, 0x1321, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x97ac,
-	0x080c, 0x20b1, 0x080c, 0x1321, 0x0804, 0x2d90, 0x0106, 0x0006,
-	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2,
-	0x080c, 0x1eeb, 0x080c, 0x97ac, 0x080c, 0x1321, 0x0804, 0x2d90,
+	0x080c, 0x1f20, 0x080c, 0x9913, 0x080c, 0x132a, 0x080c, 0x1f4a,
+	0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
+	0x0146, 0x0156, 0x080c, 0x1f20, 0x080c, 0x9913, 0x080c, 0x20e6,
+	0x080c, 0x132a, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527,
+	0x080c, 0x9913, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x9913,
+	0x080c, 0x20e6, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x1f20,
+	0x080c, 0x9913, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6,
+	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x1f20,
+	0x080c, 0x9913, 0x080c, 0x20e6, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527,
+	0x080c, 0x9913, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527,
+	0x080c, 0x9913, 0x080c, 0x20e6, 0x080c, 0x1f4a, 0x0804, 0x2dd2,
 	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x24f2, 0x080c, 0x1eeb, 0x080c, 0x97ac, 0x080c, 0x20b1,
-	0x080c, 0x1321, 0x0804, 0x2d90, 0x0106, 0x0006, 0x0126, 0x01c6,
-	0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x97ac,
-	0x080c, 0x1321, 0x080c, 0x1f15, 0x04d8, 0x0106, 0x0006, 0x0126,
-	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c,
-	0x97ac, 0x080c, 0x20b1, 0x080c, 0x1321, 0x080c, 0x1f15, 0x0440,
+	0x080c, 0x2527, 0x080c, 0x1f20, 0x080c, 0x9913, 0x080c, 0x1f4a,
+	0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
+	0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x1f20, 0x080c, 0x9913,
+	0x080c, 0x20e6, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527,
+	0x080c, 0x9913, 0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527,
+	0x080c, 0x9913, 0x080c, 0x20e6, 0x080c, 0x132a, 0x0804, 0x2dd2,
 	0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156,
-	0x080c, 0x24f2, 0x080c, 0x1eeb, 0x080c, 0x1321, 0x080c, 0x97ac,
-	0x080c, 0x1f15, 0x00a8, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6,
-	0x0136, 0x0146, 0x0156, 0x080c, 0x24f2, 0x080c, 0x1eeb, 0x080c,
-	0x97ac, 0x080c, 0x20b1, 0x080c, 0x1321, 0x080c, 0x1f15, 0x0000,
-	0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e, 0x000e, 0x010e,
-	0x000d, 0x00b6, 0x00c6, 0x0026, 0x0046, 0x9026, 0x080c, 0x651b,
-	0x1904, 0x2e9c, 0x72d8, 0x2001, 0x194d, 0x2004, 0x9005, 0x1110,
-	0xd29c, 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, 0x2e9c, 0x080c,
-	0x2ea1, 0x0804, 0x2e9c, 0xd2cc, 0x1904, 0x2e9c, 0x080c, 0x6f5c,
-	0x1120, 0x70ab, 0xffff, 0x0804, 0x2e9c, 0xd294, 0x0120, 0x70ab,
-	0xffff, 0x0804, 0x2e9c, 0x080c, 0x3138, 0x0160, 0x080c, 0xbdd7,
-	0x0128, 0x2001, 0x1817, 0x203c, 0x0804, 0x2e2e, 0x70ab, 0xffff,
-	0x0804, 0x2e9c, 0x2001, 0x1817, 0x203c, 0x7290, 0xd284, 0x0904,
-	0x2e2e, 0xd28c, 0x1904, 0x2e2e, 0x0036, 0x73a8, 0x938e, 0xffff,
-	0x1110, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1d80, 0x2c04, 0x938c,
-	0x0001, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff,
-	0x970e, 0x0590, 0x908e, 0x0000, 0x0578, 0x908e, 0x00ff, 0x1150,
-	0x7230, 0xd284, 0x1570, 0x7290, 0xc28d, 0x7292, 0x70ab, 0xffff,
-	0x003e, 0x0460, 0x0026, 0x2011, 0x0010, 0x080c, 0x6581, 0x002e,
-	0x0118, 0x70ab, 0xffff, 0x00f8, 0x900e, 0x080c, 0x23ef, 0x080c,
-	0x6106, 0x11a8, 0x080c, 0x655d, 0x1150, 0x7030, 0xd08c, 0x0118,
-	0xb800, 0xd0bc, 0x0120, 0x080c, 0x2eba, 0x0148, 0x0028, 0x080c,
-	0x300e, 0x080c, 0x2ee6, 0x0118, 0x8318, 0x0804, 0x2de3, 0x73aa,
-	0x0010, 0x70ab, 0xffff, 0x003e, 0x0804, 0x2e9c, 0x9780, 0x3142,
-	0x203d, 0x97bc, 0xff00, 0x873f, 0x2041, 0x007e, 0x70a8, 0x9096,
-	0xffff, 0x1118, 0x900e, 0x28a8, 0x0050, 0x9812, 0x0220, 0x2008,
-	0x9802, 0x20a8, 0x0020, 0x70ab, 0xffff, 0x0804, 0x2e9c, 0x2700,
-	0x0156, 0x0016, 0x9106, 0x0904, 0x2e91, 0x0026, 0x2011, 0x0010,
-	0x080c, 0x6581, 0x002e, 0x0120, 0x2009, 0xffff, 0x0804, 0x2e99,
-	0xc484, 0x080c, 0x6166, 0x0138, 0x080c, 0xbdd7, 0x1590, 0x080c,
-	0x6106, 0x15b8, 0x0008, 0xc485, 0x080c, 0x655d, 0x1130, 0x7030,
-	0xd08c, 0x01f8, 0xb800, 0xd0bc, 0x11e0, 0x7290, 0xd28c, 0x0180,
-	0x080c, 0x655d, 0x9082, 0x0006, 0x02e0, 0xd484, 0x1118, 0x080c,
-	0x612a, 0x0028, 0x080c, 0x30a6, 0x01a0, 0x080c, 0x30d1, 0x0088,
-	0x080c, 0x300e, 0x080c, 0xbdd7, 0x1160, 0x080c, 0x2ee6, 0x0188,
-	0x0040, 0x080c, 0xbdd7, 0x1118, 0x080c, 0x30a6, 0x0110, 0x0451,
-	0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, 0x2e47, 0x70ab, 0xffff,
-	0x0018, 0x001e, 0x015e, 0x71aa, 0x004e, 0x002e, 0x00ce, 0x00be,
-	0x0005, 0x00c6, 0x0016, 0x70ab, 0x0001, 0x2009, 0x007e, 0x080c,
-	0x6106, 0x1168, 0xb813, 0x00ff, 0xb817, 0xfffe, 0x080c, 0x300e,
-	0x04a9, 0x0128, 0x70d8, 0xc0bd, 0x70da, 0x080c, 0xbb25, 0x001e,
-	0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, 0x1858,
-	0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0x9ad6, 0x01d0, 0x2b00,
-	0x6012, 0x080c, 0xbb52, 0x6023, 0x0001, 0x9006, 0x080c, 0x60a3,
-	0x2001, 0x0000, 0x080c, 0x60b7, 0x0126, 0x2091, 0x8000, 0x70a4,
-	0x8000, 0x70a6, 0x012e, 0x2009, 0x0004, 0x080c, 0x9b03, 0x9085,
-	0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x0016, 0x0076,
-	0x00d6, 0x00c6, 0x2001, 0x1858, 0x2004, 0x9084, 0x00ff, 0xb842,
-	0x080c, 0x9ad6, 0x0548, 0x2b00, 0x6012, 0xb800, 0xc0c4, 0xb802,
-	0xb8a0, 0x9086, 0x007e, 0x0140, 0xb804, 0x9084, 0x00ff, 0x9086,
-	0x0006, 0x1110, 0x080c, 0x2fc1, 0x080c, 0xbb52, 0x6023, 0x0001,
-	0x9006, 0x080c, 0x60a3, 0x2001, 0x0002, 0x080c, 0x60b7, 0x0126,
-	0x2091, 0x8000, 0x70a4, 0x8000, 0x70a6, 0x012e, 0x2009, 0x0002,
-	0x080c, 0x9b03, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e,
-	0x0005, 0x00b6, 0x00c6, 0x0026, 0x2009, 0x0080, 0x080c, 0x6106,
-	0x1140, 0xb813, 0x00ff, 0xb817, 0xfffc, 0x0039, 0x0110, 0x70df,
-	0xffff, 0x002e, 0x00ce, 0x00be, 0x0005, 0x0016, 0x0076, 0x00d6,
-	0x00c6, 0x080c, 0x9a0f, 0x01d0, 0x2b00, 0x6012, 0x080c, 0xbb52,
-	0x6023, 0x0001, 0x9006, 0x080c, 0x60a3, 0x2001, 0x0002, 0x080c,
-	0x60b7, 0x0126, 0x2091, 0x8000, 0x70e0, 0x8000, 0x70e2, 0x012e,
-	0x2009, 0x0002, 0x080c, 0x9b03, 0x9085, 0x0001, 0x00ce, 0x00de,
-	0x007e, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0126, 0x2091, 0x8000,
-	0x2009, 0x007f, 0x080c, 0x6106, 0x11b8, 0xb813, 0x00ff, 0xb817,
-	0xfffd, 0xb8c7, 0x0004, 0x080c, 0x9a0f, 0x0170, 0x2b00, 0x6012,
-	0x6316, 0x6023, 0x0001, 0x620a, 0x080c, 0xbb52, 0x2009, 0x0022,
-	0x080c, 0x9b03, 0x9085, 0x0001, 0x012e, 0x00de, 0x00ce, 0x0005,
-	0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x00b6, 0x21f0, 0x9036,
-	0x080c, 0x9746, 0x1110, 0x2031, 0x0001, 0x0066, 0x080c, 0x84a3,
-	0x080c, 0x8423, 0x080c, 0x969c, 0x080c, 0xa9c4, 0x006e, 0x86ff,
-	0x0110, 0x080c, 0x9762, 0x3e08, 0x2130, 0x81ff, 0x0120, 0x20a9,
-	0x007e, 0x900e, 0x0018, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c,
-	0x6166, 0x1140, 0x9686, 0x0002, 0x1118, 0xb800, 0xd0bc, 0x1110,
-	0x080c, 0x5bfc, 0x001e, 0x8108, 0x1f04, 0x2fa6, 0x9686, 0x0001,
-	0x190c, 0x310c, 0x00be, 0x002e, 0x003e, 0x006e, 0x00ce, 0x00ee,
-	0x0005, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x00b6, 0x9016,
-	0x080c, 0x9746, 0x1110, 0x2011, 0x0001, 0x0026, 0x6210, 0x2258,
-	0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0x8498, 0x0076, 0x2039,
-	0x0000, 0x080c, 0x8387, 0x2c08, 0x080c, 0xce23, 0x007e, 0x001e,
-	0x002e, 0x82ff, 0x0110, 0x080c, 0x9762, 0xba10, 0xbb14, 0x080c,
-	0x5bfc, 0xba12, 0xbb16, 0x00be, 0x001e, 0x002e, 0x003e, 0x00ce,
-	0x00ee, 0x0005, 0x00e6, 0x0006, 0x00b6, 0x6010, 0x2058, 0xb8a0,
-	0x00be, 0x9086, 0x0080, 0x0150, 0x2071, 0x1800, 0x70a4, 0x9005,
-	0x0110, 0x8001, 0x70a6, 0x000e, 0x00ee, 0x0005, 0x2071, 0x1800,
-	0x70e0, 0x9005, 0x0dc0, 0x8001, 0x70e2, 0x0ca8, 0xb800, 0xc08c,
-	0xb802, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x00b6, 0x0036, 0x0026,
-	0x0016, 0x0156, 0x2178, 0x9016, 0x080c, 0x9746, 0x1110, 0x2011,
-	0x0001, 0x0026, 0x81ff, 0x1118, 0x20a9, 0x0001, 0x0080, 0x080c,
-	0x529d, 0xd0c4, 0x0148, 0x0040, 0x9006, 0x0046, 0x2020, 0x2009,
-	0x002d, 0x080c, 0xd0ce, 0x004e, 0x20a9, 0x0800, 0x9016, 0x0026,
-	0x928e, 0x007e, 0x0904, 0x3081, 0x928e, 0x007f, 0x0904, 0x3081,
-	0x928e, 0x0080, 0x05f0, 0x9288, 0x1000, 0x210c, 0x81ff, 0x05c8,
-	0x8fff, 0x1150, 0x2001, 0x195d, 0x0006, 0x2003, 0x0001, 0x080c,
-	0x3093, 0x000e, 0x2003, 0x0000, 0x00b6, 0x00c6, 0x2158, 0x2001,
-	0x0001, 0x080c, 0x6527, 0x00ce, 0x00be, 0x2019, 0x0029, 0x080c,
-	0x8498, 0x0076, 0x2039, 0x0000, 0x080c, 0x8387, 0x00b6, 0x00c6,
-	0x0026, 0x2158, 0xba04, 0x9294, 0x00ff, 0x9286, 0x0006, 0x1118,
-	0xb807, 0x0404, 0x0028, 0x2001, 0x0004, 0x8007, 0x9215, 0xba06,
-	0x002e, 0x00ce, 0x00be, 0x0016, 0x2c08, 0x080c, 0xce23, 0x001e,
-	0x007e, 0x002e, 0x8210, 0x1f04, 0x3037, 0x002e, 0x82ff, 0x0110,
-	0x080c, 0x9762, 0x015e, 0x001e, 0x002e, 0x003e, 0x00be, 0x00ce,
-	0x00ee, 0x00fe, 0x0005, 0x0046, 0x0026, 0x0016, 0x080c, 0x529d,
-	0xd0c4, 0x0140, 0xd0a4, 0x0130, 0x9006, 0x2220, 0x2009, 0x0029,
-	0x080c, 0xd0ce, 0x001e, 0x002e, 0x004e, 0x0005, 0x0016, 0x0026,
-	0x0036, 0x00c6, 0x7290, 0x82ff, 0x01e8, 0x080c, 0x6555, 0x11d0,
-	0x2100, 0x080c, 0x2422, 0x81ff, 0x01b8, 0x2019, 0x0001, 0x8314,
-	0x92e0, 0x1d80, 0x2c04, 0xd384, 0x0120, 0x9084, 0xff00, 0x8007,
-	0x0010, 0x9084, 0x00ff, 0x9116, 0x0138, 0x9096, 0x00ff, 0x0110,
-	0x8318, 0x0c68, 0x9085, 0x0001, 0x00ce, 0x003e, 0x002e, 0x001e,
-	0x0005, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0066, 0x9036,
-	0x080c, 0x9746, 0x1110, 0x2031, 0x0001, 0x0066, 0x0036, 0x2019,
-	0x0029, 0x00d9, 0x003e, 0x006e, 0x86ff, 0x0110, 0x080c, 0x9762,
-	0x006e, 0x9180, 0x1000, 0x2004, 0x9065, 0x0158, 0x0016, 0x00c6,
-	0x2061, 0x1b00, 0x001e, 0x6112, 0x080c, 0x2fc1, 0x001e, 0x080c,
-	0x612a, 0x012e, 0x00ce, 0x001e, 0x0005, 0x0016, 0x0026, 0x2110,
-	0x080c, 0x9372, 0x080c, 0xd37f, 0x002e, 0x001e, 0x0005, 0x2001,
-	0x1836, 0x2004, 0xd0cc, 0x0005, 0x00c6, 0x00b6, 0x080c, 0x6f5c,
-	0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c, 0x6f5c,
-	0x1110, 0x900e, 0x0010, 0x2009, 0x007e, 0x9180, 0x1000, 0x2004,
-	0x905d, 0x0130, 0x86ff, 0x0110, 0xb800, 0xd0bc, 0x090c, 0x612a,
-	0x8108, 0x1f04, 0x311d, 0x2061, 0x1800, 0x607b, 0x0000, 0x607c,
-	0x9084, 0x00ff, 0x607e, 0x60af, 0x0000, 0x00be, 0x00ce, 0x0005,
-	0x2001, 0x1875, 0x2004, 0xd0bc, 0x0005, 0x2011, 0x1854, 0x2214,
-	0xd2ec, 0x0005, 0x7eef, 0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0,
-	0x80dc, 0x80da, 0x7ad9, 0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2,
-	0x80d1, 0x79ce, 0x78cd, 0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7,
-	0x80c6, 0x77c5, 0x76c3, 0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5,
-	0x73b4, 0x72b3, 0x80b2, 0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab,
-	0x6faa, 0x6ea9, 0x80a7, 0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e,
-	0x689d, 0x809b, 0x8098, 0x6797, 0x6690, 0x658f, 0x6488, 0x6384,
-	0x6282, 0x8081, 0x8080, 0x617c, 0x607a, 0x8079, 0x5f76, 0x8075,
-	0x8074, 0x8073, 0x8072, 0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b,
-	0x5c6a, 0x5b69, 0x8067, 0x5a66, 0x5965, 0x5863, 0x575c, 0x565a,
-	0x5559, 0x8056, 0x8055, 0x5454, 0x5353, 0x5252, 0x5151, 0x504e,
-	0x4f4d, 0x804c, 0x804b, 0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045,
-	0x8043, 0x803c, 0x803a, 0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33,
-	0x4932, 0x4831, 0x802e, 0x472d, 0x462c, 0x452b, 0x442a, 0x4329,
-	0x4227, 0x8026, 0x8025, 0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b,
-	0x3c18, 0x8017, 0x8010, 0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001,
-	0x8000, 0x8000, 0x3800, 0x3700, 0x3600, 0x8000, 0x3500, 0x8000,
-	0x8000, 0x8000, 0x3400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
-	0x8000, 0x3300, 0x3200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
-	0x8000, 0x3100, 0x3000, 0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00,
-	0x2d00, 0x2c00, 0x8000, 0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00,
-	0x2900, 0x2800, 0x8000, 0x2700, 0x2600, 0x2500, 0x2400, 0x2300,
-	0x2200, 0x8000, 0x8000, 0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00,
-	0x1c00, 0x8000, 0x8000, 0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000,
-	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x1800, 0x8000, 0x1700,
-	0x1600, 0x1500, 0x8000, 0x1400, 0x1300, 0x1200, 0x1100, 0x1000,
-	0x0f00, 0x8000, 0x8000, 0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00,
-	0x0900, 0x8000, 0x8000, 0x0800, 0x0700, 0x8000, 0x0600, 0x8000,
-	0x8000, 0x8000, 0x0500, 0x0400, 0x0300, 0x8000, 0x0200, 0x8000,
-	0x8000, 0x8000, 0x0100, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
-	0x8000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+	0x080c, 0x2527, 0x080c, 0x1f20, 0x080c, 0x9913, 0x080c, 0x132a,
+	0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
+	0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x1f20, 0x080c, 0x9913,
+	0x080c, 0x20e6, 0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006,
+	0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527,
+	0x080c, 0x9913, 0x080c, 0x132a, 0x080c, 0x1f4a, 0x04d8, 0x0106,
+	0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c,
+	0x2527, 0x080c, 0x9913, 0x080c, 0x20e6, 0x080c, 0x132a, 0x080c,
+	0x1f4a, 0x0440, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136,
+	0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x1f20, 0x080c, 0x132a,
+	0x080c, 0x9913, 0x080c, 0x1f4a, 0x00a8, 0x0106, 0x0006, 0x0126,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, 0x080c,
+	0x1f20, 0x080c, 0x9913, 0x080c, 0x20e6, 0x080c, 0x132a, 0x080c,
+	0x1f4a, 0x0000, 0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e,
+	0x000e, 0x010e, 0x000d, 0x00b6, 0x00c6, 0x0026, 0x0046, 0x9026,
+	0x080c, 0x661e, 0x1904, 0x2ede, 0x72d8, 0x2001, 0x194d, 0x2004,
+	0x9005, 0x1110, 0xd29c, 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904,
+	0x2ede, 0x080c, 0x2ee3, 0x0804, 0x2ede, 0xd2cc, 0x1904, 0x2ede,
+	0x080c, 0x70ac, 0x1120, 0x70ab, 0xffff, 0x0804, 0x2ede, 0xd294,
+	0x0120, 0x70ab, 0xffff, 0x0804, 0x2ede, 0x080c, 0x317a, 0x0160,
+	0x080c, 0xbf46, 0x0128, 0x2001, 0x1817, 0x203c, 0x0804, 0x2e70,
+	0x70ab, 0xffff, 0x0804, 0x2ede, 0x2001, 0x1817, 0x203c, 0x7290,
+	0xd284, 0x0904, 0x2e70, 0xd28c, 0x1904, 0x2e70, 0x0036, 0x73a8,
+	0x938e, 0xffff, 0x1110, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1d80,
+	0x2c04, 0x938c, 0x0001, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010,
+	0x9084, 0x00ff, 0x970e, 0x0590, 0x908e, 0x0000, 0x0578, 0x908e,
+	0x00ff, 0x1150, 0x7230, 0xd284, 0x1570, 0x7290, 0xc28d, 0x7292,
+	0x70ab, 0xffff, 0x003e, 0x0460, 0x0026, 0x2011, 0x0010, 0x080c,
+	0x6684, 0x002e, 0x0118, 0x70ab, 0xffff, 0x00f8, 0x900e, 0x080c,
+	0x2424, 0x080c, 0x6209, 0x11a8, 0x080c, 0x6660, 0x1150, 0x7030,
+	0xd08c, 0x0118, 0xb800, 0xd0bc, 0x0120, 0x080c, 0x2efc, 0x0148,
+	0x0028, 0x080c, 0x3050, 0x080c, 0x2f28, 0x0118, 0x8318, 0x0804,
+	0x2e25, 0x73aa, 0x0010, 0x70ab, 0xffff, 0x003e, 0x0804, 0x2ede,
+	0x9780, 0x3184, 0x203d, 0x97bc, 0xff00, 0x873f, 0x2041, 0x007e,
+	0x70a8, 0x9096, 0xffff, 0x1118, 0x900e, 0x28a8, 0x0050, 0x9812,
+	0x0220, 0x2008, 0x9802, 0x20a8, 0x0020, 0x70ab, 0xffff, 0x0804,
+	0x2ede, 0x2700, 0x0156, 0x0016, 0x9106, 0x0904, 0x2ed3, 0x0026,
+	0x2011, 0x0010, 0x080c, 0x6684, 0x002e, 0x0120, 0x2009, 0xffff,
+	0x0804, 0x2edb, 0xc484, 0x080c, 0x6269, 0x0138, 0x080c, 0xbf46,
+	0x1590, 0x080c, 0x6209, 0x15b8, 0x0008, 0xc485, 0x080c, 0x6660,
+	0x1130, 0x7030, 0xd08c, 0x01f8, 0xb800, 0xd0bc, 0x11e0, 0x7290,
+	0xd28c, 0x0180, 0x080c, 0x6660, 0x9082, 0x0006, 0x02e0, 0xd484,
+	0x1118, 0x080c, 0x622d, 0x0028, 0x080c, 0x30e8, 0x01a0, 0x080c,
+	0x3113, 0x0088, 0x080c, 0x3050, 0x080c, 0xbf46, 0x1160, 0x080c,
+	0x2f28, 0x0188, 0x0040, 0x080c, 0xbf46, 0x1118, 0x080c, 0x30e8,
+	0x0110, 0x0451, 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, 0x2e89,
+	0x70ab, 0xffff, 0x0018, 0x001e, 0x015e, 0x71aa, 0x004e, 0x002e,
+	0x00ce, 0x00be, 0x0005, 0x00c6, 0x0016, 0x70ab, 0x0001, 0x2009,
+	0x007e, 0x080c, 0x6209, 0x1168, 0xb813, 0x00ff, 0xb817, 0xfffe,
+	0x080c, 0x3050, 0x04a9, 0x0128, 0x70d8, 0xc0bd, 0x70da, 0x080c,
+	0xbc93, 0x001e, 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6,
+	0x2001, 0x1858, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0x9c3d,
+	0x01d0, 0x2b00, 0x6012, 0x080c, 0xbcc0, 0x6023, 0x0001, 0x9006,
+	0x080c, 0x61a6, 0x2001, 0x0000, 0x080c, 0x61ba, 0x0126, 0x2091,
+	0x8000, 0x70a4, 0x8000, 0x70a6, 0x012e, 0x2009, 0x0004, 0x080c,
+	0x9c6a, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005,
+	0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, 0x1858, 0x2004, 0x9084,
+	0x00ff, 0xb842, 0x080c, 0x9c3d, 0x0548, 0x2b00, 0x6012, 0xb800,
+	0xc0c4, 0xb802, 0xb8a0, 0x9086, 0x007e, 0x0140, 0xb804, 0x9084,
+	0x00ff, 0x9086, 0x0006, 0x1110, 0x080c, 0x3003, 0x080c, 0xbcc0,
+	0x6023, 0x0001, 0x9006, 0x080c, 0x61a6, 0x2001, 0x0002, 0x080c,
+	0x61ba, 0x0126, 0x2091, 0x8000, 0x70a4, 0x8000, 0x70a6, 0x012e,
+	0x2009, 0x0002, 0x080c, 0x9c6a, 0x9085, 0x0001, 0x00ce, 0x00de,
+	0x007e, 0x001e, 0x0005, 0x00b6, 0x00c6, 0x0026, 0x2009, 0x0080,
+	0x080c, 0x6209, 0x1140, 0xb813, 0x00ff, 0xb817, 0xfffc, 0x0039,
+	0x0110, 0x70df, 0xffff, 0x002e, 0x00ce, 0x00be, 0x0005, 0x0016,
+	0x0076, 0x00d6, 0x00c6, 0x080c, 0x9b76, 0x01d0, 0x2b00, 0x6012,
+	0x080c, 0xbcc0, 0x6023, 0x0001, 0x9006, 0x080c, 0x61a6, 0x2001,
+	0x0002, 0x080c, 0x61ba, 0x0126, 0x2091, 0x8000, 0x70e0, 0x8000,
+	0x70e2, 0x012e, 0x2009, 0x0002, 0x080c, 0x9c6a, 0x9085, 0x0001,
+	0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0126,
+	0x2091, 0x8000, 0x2009, 0x007f, 0x080c, 0x6209, 0x11b8, 0xb813,
+	0x00ff, 0xb817, 0xfffd, 0xb8c7, 0x0004, 0x080c, 0x9b76, 0x0170,
+	0x2b00, 0x6012, 0x6316, 0x6023, 0x0001, 0x620a, 0x080c, 0xbcc0,
+	0x2009, 0x0022, 0x080c, 0x9c6a, 0x9085, 0x0001, 0x012e, 0x00de,
+	0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x00b6,
+	0x21f0, 0x9036, 0x080c, 0x98ad, 0x1110, 0x2031, 0x0001, 0x0066,
+	0x080c, 0x861e, 0x080c, 0x859e, 0x080c, 0x9803, 0x080c, 0xab2b,
+	0x006e, 0x86ff, 0x0110, 0x080c, 0x98c9, 0x3e08, 0x2130, 0x81ff,
+	0x0120, 0x20a9, 0x007e, 0x900e, 0x0018, 0x20a9, 0x007f, 0x900e,
+	0x0016, 0x080c, 0x6269, 0x1140, 0x9686, 0x0002, 0x1118, 0xb800,
+	0xd0bc, 0x1110, 0x080c, 0x5cef, 0x001e, 0x8108, 0x1f04, 0x2fe8,
+	0x9686, 0x0001, 0x190c, 0x314e, 0x00be, 0x002e, 0x003e, 0x006e,
+	0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016,
+	0x00b6, 0x9016, 0x080c, 0x98ad, 0x1110, 0x2011, 0x0001, 0x0026,
+	0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0x8613,
+	0x0076, 0x2039, 0x0000, 0x080c, 0x8502, 0x2c08, 0x080c, 0xcfa6,
+	0x007e, 0x001e, 0x002e, 0x82ff, 0x0110, 0x080c, 0x98c9, 0xba10,
+	0xbb14, 0x080c, 0x5cef, 0xba12, 0xbb16, 0x00be, 0x001e, 0x002e,
+	0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x00b6, 0x6010,
+	0x2058, 0xb8a0, 0x00be, 0x9086, 0x0080, 0x0150, 0x2071, 0x1800,
+	0x70a4, 0x9005, 0x0110, 0x8001, 0x70a6, 0x000e, 0x00ee, 0x0005,
+	0x2071, 0x1800, 0x70e0, 0x9005, 0x0dc0, 0x8001, 0x70e2, 0x0ca8,
+	0xb800, 0xc08c, 0xb802, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x00b6,
+	0x0036, 0x0026, 0x0016, 0x0156, 0x2178, 0x9016, 0x080c, 0x98ad,
+	0x1110, 0x2011, 0x0001, 0x0026, 0x81ff, 0x1118, 0x20a9, 0x0001,
+	0x0080, 0x080c, 0x5386, 0xd0c4, 0x0148, 0x0040, 0x9006, 0x0046,
+	0x2020, 0x2009, 0x002d, 0x080c, 0xd251, 0x004e, 0x20a9, 0x0800,
+	0x9016, 0x0026, 0x928e, 0x007e, 0x0904, 0x30c3, 0x928e, 0x007f,
+	0x0904, 0x30c3, 0x928e, 0x0080, 0x05f0, 0x9288, 0x1000, 0x210c,
+	0x81ff, 0x05c8, 0x8fff, 0x1150, 0x2001, 0x195f, 0x0006, 0x2003,
+	0x0001, 0x080c, 0x30d5, 0x000e, 0x2003, 0x0000, 0x00b6, 0x00c6,
+	0x2158, 0x2001, 0x0001, 0x080c, 0x662a, 0x00ce, 0x00be, 0x2019,
+	0x0029, 0x080c, 0x8613, 0x0076, 0x2039, 0x0000, 0x080c, 0x8502,
+	0x00b6, 0x00c6, 0x0026, 0x2158, 0xba04, 0x9294, 0x00ff, 0x9286,
+	0x0006, 0x1118, 0xb807, 0x0404, 0x0028, 0x2001, 0x0004, 0x8007,
+	0x9215, 0xba06, 0x002e, 0x00ce, 0x00be, 0x0016, 0x2c08, 0x080c,
+	0xcfa6, 0x001e, 0x007e, 0x002e, 0x8210, 0x1f04, 0x3079, 0x002e,
+	0x82ff, 0x0110, 0x080c, 0x98c9, 0x015e, 0x001e, 0x002e, 0x003e,
+	0x00be, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0046, 0x0026, 0x0016,
+	0x080c, 0x5386, 0xd0c4, 0x0140, 0xd0a4, 0x0130, 0x9006, 0x2220,
+	0x2009, 0x0029, 0x080c, 0xd251, 0x001e, 0x002e, 0x004e, 0x0005,
+	0x0016, 0x0026, 0x0036, 0x00c6, 0x7290, 0x82ff, 0x01e8, 0x080c,
+	0x6658, 0x11d0, 0x2100, 0x080c, 0x2457, 0x81ff, 0x01b8, 0x2019,
+	0x0001, 0x8314, 0x92e0, 0x1d80, 0x2c04, 0xd384, 0x0120, 0x9084,
+	0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, 0x9116, 0x0138, 0x9096,
+	0x00ff, 0x0110, 0x8318, 0x0c68, 0x9085, 0x0001, 0x00ce, 0x003e,
+	0x002e, 0x001e, 0x0005, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000,
+	0x0066, 0x9036, 0x080c, 0x98ad, 0x1110, 0x2031, 0x0001, 0x0066,
+	0x0036, 0x2019, 0x0029, 0x00d9, 0x003e, 0x006e, 0x86ff, 0x0110,
+	0x080c, 0x98c9, 0x006e, 0x9180, 0x1000, 0x2004, 0x9065, 0x0158,
+	0x0016, 0x00c6, 0x2061, 0x1b02, 0x001e, 0x6112, 0x080c, 0x3003,
+	0x001e, 0x080c, 0x622d, 0x012e, 0x00ce, 0x001e, 0x0005, 0x0016,
+	0x0026, 0x2110, 0x080c, 0x94d9, 0x080c, 0xd507, 0x002e, 0x001e,
+	0x0005, 0x2001, 0x1836, 0x2004, 0xd0cc, 0x0005, 0x00c6, 0x00b6,
+	0x080c, 0x70ac, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782,
+	0x080c, 0x70ac, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, 0x9180,
+	0x1000, 0x2004, 0x905d, 0x0130, 0x86ff, 0x0110, 0xb800, 0xd0bc,
+	0x090c, 0x622d, 0x8108, 0x1f04, 0x315f, 0x2061, 0x1800, 0x607b,
+	0x0000, 0x607c, 0x9084, 0x00ff, 0x607e, 0x60af, 0x0000, 0x00be,
+	0x00ce, 0x0005, 0x2001, 0x1875, 0x2004, 0xd0bc, 0x0005, 0x2011,
+	0x1854, 0x2214, 0xd2ec, 0x0005, 0x7eef, 0x7de8, 0x7ce4, 0x80e2,
+	0x7be1, 0x80e0, 0x80dc, 0x80da, 0x7ad9, 0x80d6, 0x80d5, 0x80d4,
+	0x80d3, 0x80d2, 0x80d1, 0x79ce, 0x78cd, 0x80cc, 0x80cb, 0x80ca,
+	0x80c9, 0x80c7, 0x80c6, 0x77c5, 0x76c3, 0x80bc, 0x80ba, 0x75b9,
+	0x80b6, 0x74b5, 0x73b4, 0x72b3, 0x80b2, 0x80b1, 0x80ae, 0x71ad,
+	0x80ac, 0x70ab, 0x6faa, 0x6ea9, 0x80a7, 0x6da6, 0x6ca5, 0x6ba3,
+	0x6a9f, 0x699e, 0x689d, 0x809b, 0x8098, 0x6797, 0x6690, 0x658f,
+	0x6488, 0x6384, 0x6282, 0x8081, 0x8080, 0x617c, 0x607a, 0x8079,
+	0x5f76, 0x8075, 0x8074, 0x8073, 0x8072, 0x8071, 0x806e, 0x5e6d,
+	0x806c, 0x5d6b, 0x5c6a, 0x5b69, 0x8067, 0x5a66, 0x5965, 0x5863,
+	0x575c, 0x565a, 0x5559, 0x8056, 0x8055, 0x5454, 0x5353, 0x5252,
+	0x5151, 0x504e, 0x4f4d, 0x804c, 0x804b, 0x4e4a, 0x4d49, 0x8047,
+	0x4c46, 0x8045, 0x8043, 0x803c, 0x803a, 0x8039, 0x8036, 0x4b35,
+	0x8034, 0x4a33, 0x4932, 0x4831, 0x802e, 0x472d, 0x462c, 0x452b,
+	0x442a, 0x4329, 0x4227, 0x8026, 0x8025, 0x4123, 0x401f, 0x3f1e,
+	0x3e1d, 0x3d1b, 0x3c18, 0x8017, 0x8010, 0x3b0f, 0x3a08, 0x8004,
+	0x3902, 0x8001, 0x8000, 0x8000, 0x3800, 0x3700, 0x3600, 0x8000,
+	0x3500, 0x8000, 0x8000, 0x8000, 0x3400, 0x8000, 0x8000, 0x8000,
+	0x8000, 0x8000, 0x8000, 0x3300, 0x3200, 0x8000, 0x8000, 0x8000,
+	0x8000, 0x8000, 0x8000, 0x3100, 0x3000, 0x8000, 0x8000, 0x2f00,
+	0x8000, 0x2e00, 0x2d00, 0x2c00, 0x8000, 0x8000, 0x8000, 0x2b00,
+	0x8000, 0x2a00, 0x2900, 0x2800, 0x8000, 0x2700, 0x2600, 0x2500,
+	0x2400, 0x2300, 0x2200, 0x8000, 0x8000, 0x2100, 0x2000, 0x1f00,
+	0x1e00, 0x1d00, 0x1c00, 0x8000, 0x8000, 0x1b00, 0x1a00, 0x8000,
+	0x1900, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x1800,
+	0x8000, 0x1700, 0x1600, 0x1500, 0x8000, 0x1400, 0x1300, 0x1200,
+	0x1100, 0x1000, 0x0f00, 0x8000, 0x8000, 0x0e00, 0x0d00, 0x0c00,
+	0x0b00, 0x0a00, 0x0900, 0x8000, 0x8000, 0x0800, 0x0700, 0x8000,
+	0x0600, 0x8000, 0x8000, 0x8000, 0x0500, 0x0400, 0x0300, 0x8000,
+	0x0200, 0x8000, 0x8000, 0x8000, 0x0100, 0x8000, 0x8000, 0x8000,
+	0x8000, 0x8000, 0x8000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000,
 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
-	0x8000, 0x8000, 0x2071, 0x1894, 0x7003, 0x0002, 0x9006, 0x7016,
-	0x701a, 0x704a, 0x704e, 0x700e, 0x7042, 0x7046, 0x703b, 0x18b0,
-	0x703f, 0x18b0, 0x7007, 0x0001, 0x080c, 0x103c, 0x090c, 0x0d65,
-	0x2900, 0x706a, 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x080c, 0x103c,
-	0x090c, 0x0d65, 0x2900, 0x706e, 0xa867, 0x0002, 0xa8ab, 0xdcb0,
-	0x0005, 0x2071, 0x1894, 0x7004, 0x0002, 0x3271, 0x3272, 0x3285,
-	0x3299, 0x0005, 0x1004, 0x3282, 0x0e04, 0x3282, 0x2079, 0x0000,
-	0x0126, 0x2091, 0x8000, 0x700c, 0x9005, 0x1128, 0x700f, 0x0001,
-	0x012e, 0x0468, 0x0005, 0x012e, 0x0ce8, 0x2079, 0x0000, 0x2061,
-	0x18ae, 0x2c4c, 0xa86c, 0x908e, 0x0100, 0x0128, 0x9086, 0x0200,
-	0x0904, 0x336d, 0x0005, 0x7018, 0x2048, 0x2061, 0x1800, 0x701c,
-	0x0807, 0x7014, 0x2048, 0xa864, 0x9094, 0x00ff, 0x9296, 0x0029,
-	0x1120, 0xaa78, 0xd2fc, 0x0128, 0x0005, 0x9086, 0x0103, 0x0108,
-	0x0005, 0x2079, 0x0000, 0x2061, 0x1800, 0x701c, 0x0807, 0x2061,
-	0x1800, 0x7880, 0x908a, 0x0040, 0x1210, 0x61cc, 0x0042, 0x2100,
-	0x908a, 0x003f, 0x1a04, 0x336a, 0x61cc, 0x0804, 0x32ff, 0x3341,
-	0x3379, 0x3383, 0x3387, 0x3391, 0x3397, 0x339b, 0x33ab, 0x33ae,
-	0x33b8, 0x33bd, 0x33c2, 0x33cd, 0x33d8, 0x33e7, 0x33f6, 0x3404,
-	0x341b, 0x3436, 0x336a, 0x34df, 0x351d, 0x35c2, 0x35d3, 0x35f6,
-	0x336a, 0x336a, 0x336a, 0x362e, 0x364e, 0x3657, 0x3683, 0x3689,
-	0x336a, 0x36cf, 0x336a, 0x336a, 0x336a, 0x336a, 0x336a, 0x36da,
-	0x36e3, 0x36eb, 0x36ed, 0x336a, 0x336a, 0x336a, 0x336a, 0x336a,
-	0x336a, 0x371d, 0x336a, 0x336a, 0x336a, 0x336a, 0x336a, 0x373a,
-	0x3795, 0x336a, 0x336a, 0x336a, 0x336a, 0x336a, 0x336a, 0x0002,
-	0x37bf, 0x37c2, 0x3821, 0x383a, 0x386a, 0x3b0c, 0x336a, 0x4e6e,
-	0x336a, 0x336a, 0x336a, 0x336a, 0x336a, 0x336a, 0x336a, 0x336a,
-	0x33b8, 0x33bd, 0x400b, 0x52c1, 0x4021, 0x4efd, 0x4f4e, 0x5051,
-	0x336a, 0x50b3, 0x50ef, 0x5120, 0x522c, 0x514d, 0x51ac, 0x336a,
-	0x4025, 0x41b5, 0x41cb, 0x41f0, 0x4255, 0x42c9, 0x42e9, 0x4360,
-	0x4371, 0x4389, 0x438c, 0x43b1, 0x4424, 0x448e, 0x4496, 0x45c8,
-	0x4725, 0x4759, 0x49a3, 0x336a, 0x49c1, 0x4a80, 0x4b56, 0x336a,
-	0x336a, 0x336a, 0x336a, 0x4bbc, 0x4bd7, 0x4496, 0x4e1d, 0x714c,
-	0x0000, 0x2021, 0x4000, 0x080c, 0x47d7, 0x0126, 0x2091, 0x8000,
-	0x0e04, 0x334b, 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000,
-	0x0118, 0x7833, 0x0011, 0x0010, 0x7833, 0x0010, 0x7c82, 0x7986,
-	0x7a8a, 0x7b8e, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084,
-	0x190c, 0x11b5, 0x7007, 0x0001, 0x2091, 0x5000, 0x700f, 0x0000,
-	0x012e, 0x0005, 0x2021, 0x4001, 0x08b0, 0x2021, 0x4002, 0x0898,
-	0x2021, 0x4003, 0x0880, 0x2021, 0x4005, 0x0868, 0x2021, 0x4006,
-	0x0850, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884,
-	0x7990, 0x0804, 0x47e4, 0x7883, 0x0004, 0x7884, 0x0807, 0x2039,
-	0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804,
-	0x47e7, 0x7984, 0x7888, 0x2114, 0x200a, 0x0804, 0x3341, 0x7984,
-	0x2114, 0x0804, 0x3341, 0x20e1, 0x0000, 0x2099, 0x0021, 0x20e9,
-	0x0000, 0x20a1, 0x0021, 0x20a9, 0x001f, 0x4003, 0x7984, 0x7a88,
-	0x7b8c, 0x0804, 0x3341, 0x7884, 0x2060, 0x04d8, 0x2009, 0x0003,
-	0x2011, 0x0002, 0x2019, 0x0015, 0x789b, 0x0317, 0x0804, 0x3341,
-	0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0800, 0x2039, 0x0001, 0x7d98,
-	0x7c9c, 0x0848, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3376,
-	0x2138, 0x7d98, 0x7c9c, 0x0804, 0x337d, 0x79a0, 0x9182, 0x0040,
-	0x0210, 0x0804, 0x3376, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x338b,
-	0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3376, 0x21e8, 0x7984,
-	0x7888, 0x20a9, 0x0001, 0x21a0, 0x4004, 0x0804, 0x3341, 0x2061,
-	0x0800, 0xe10c, 0x9006, 0x2c15, 0x9200, 0x8c60, 0x8109, 0x1dd8,
-	0x2010, 0x9005, 0x0904, 0x3341, 0x0804, 0x3370, 0x79a0, 0x9182,
-	0x0040, 0x0210, 0x0804, 0x3376, 0x21e0, 0x20a9, 0x0001, 0x7984,
-	0x2198, 0x4012, 0x0804, 0x3341, 0x2069, 0x1853, 0x7884, 0x7990,
-	0x911a, 0x1a04, 0x3376, 0x8019, 0x0904, 0x3376, 0x684a, 0x6942,
-	0x788c, 0x6852, 0x7888, 0x6856, 0x9006, 0x685a, 0x685e, 0x080c,
-	0x728d, 0x0804, 0x3341, 0x2069, 0x1853, 0x7884, 0x7994, 0x911a,
-	0x1a04, 0x3376, 0x8019, 0x0904, 0x3376, 0x684e, 0x6946, 0x788c,
-	0x6862, 0x7888, 0x6866, 0x9006, 0x686a, 0x686e, 0x0126, 0x2091,
-	0x8000, 0x080c, 0x6612, 0x012e, 0x0804, 0x3341, 0x902e, 0x2520,
-	0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3373, 0x7984, 0x7b88,
-	0x7a8c, 0x20a9, 0x0005, 0x20e9, 0x0001, 0x20a1, 0x189c, 0x4101,
-	0x080c, 0x479b, 0x1120, 0x2009, 0x0002, 0x0804, 0x3373, 0x2009,
-	0x0020, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x47e4, 0x701f,
-	0x345a, 0x0005, 0xa864, 0x2008, 0x9084, 0x00ff, 0x9096, 0x0011,
-	0x0168, 0x9096, 0x0019, 0x0150, 0x9096, 0x0015, 0x0138, 0x9096,
-	0x0048, 0x0120, 0x9096, 0x0029, 0x1904, 0x3373, 0x810f, 0x918c,
-	0x00ff, 0x0904, 0x3373, 0x7112, 0x7010, 0x8001, 0x0560, 0x7012,
-	0x080c, 0x479b, 0x1120, 0x2009, 0x0002, 0x0804, 0x3373, 0x2009,
-	0x0020, 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494, 0xa598, 0x9290,
-	0x0040, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, 0xa85c,
-	0x9080, 0x0019, 0xaf60, 0x080c, 0x47e4, 0x701f, 0x3498, 0x0005,
-	0xa864, 0x9084, 0x00ff, 0x9096, 0x0002, 0x0120, 0x9096, 0x000a,
-	0x1904, 0x3373, 0x0888, 0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a,
-	0xa864, 0x9084, 0x00ff, 0x9096, 0x0029, 0x1160, 0xc2fd, 0xaa7a,
-	0x080c, 0x5cea, 0x0150, 0x0126, 0x2091, 0x8000, 0xa87a, 0xa982,
-	0x012e, 0x0050, 0x080c, 0x5ff1, 0x1128, 0x7007, 0x0003, 0x701f,
-	0x34c4, 0x0005, 0x080c, 0x6a5c, 0x0126, 0x2091, 0x8000, 0x20a9,
-	0x0005, 0x20e1, 0x0001, 0x2099, 0x189c, 0x400a, 0x2100, 0x9210,
-	0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, 0xa85c, 0x9080,
-	0x0019, 0x2009, 0x0020, 0x012e, 0xaf60, 0x0804, 0x47e7, 0x2091,
-	0x8000, 0x7837, 0x4000, 0x7833, 0x0010, 0x7883, 0x4000, 0x7887,
-	0x4953, 0x788b, 0x5020, 0x788f, 0x2020, 0x2009, 0x017f, 0x2104,
-	0x7892, 0x3f00, 0x7896, 0x2061, 0x0100, 0x6200, 0x2061, 0x0200,
-	0x603c, 0x8007, 0x9205, 0x789a, 0x2009, 0x04fd, 0x2104, 0x789e,
-	0x2091, 0x5000, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084,
-	0x0180, 0x2001, 0x19f1, 0x2004, 0x9005, 0x0128, 0x2001, 0x008b,
-	0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, 0x2003,
-	0x1001, 0x2071, 0x0080, 0x0804, 0x0427, 0x81ff, 0x1904, 0x3373,
-	0x7984, 0x080c, 0x6166, 0x1904, 0x3376, 0x7e98, 0x9684, 0x3fff,
-	0x9082, 0x4000, 0x1a04, 0x3376, 0x7c88, 0x7d8c, 0x080c, 0x6398,
-	0x080c, 0x6329, 0x1518, 0x2061, 0x1ddc, 0x0126, 0x2091, 0x8000,
+	0x8000, 0x8000, 0x8000, 0x8000, 0x2071, 0x1894, 0x7003, 0x0002,
+	0x9006, 0x7016, 0x701a, 0x704a, 0x704e, 0x700e, 0x7042, 0x7046,
+	0x703b, 0x18b0, 0x703f, 0x18b0, 0x7007, 0x0001, 0x080c, 0x103b,
+	0x090c, 0x0d65, 0x2900, 0x706a, 0xa867, 0x0002, 0xa8ab, 0xdcb0,
+	0x080c, 0x103b, 0x090c, 0x0d65, 0x2900, 0x706e, 0xa867, 0x0002,
+	0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x1894, 0x7004, 0x0002, 0x32b3,
+	0x32b4, 0x32c7, 0x32db, 0x0005, 0x1004, 0x32c4, 0x0e04, 0x32c4,
+	0x2079, 0x0000, 0x0126, 0x2091, 0x8000, 0x700c, 0x9005, 0x1128,
+	0x700f, 0x0001, 0x012e, 0x0468, 0x0005, 0x012e, 0x0ce8, 0x2079,
+	0x0000, 0x2061, 0x18ae, 0x2c4c, 0xa86c, 0x908e, 0x0100, 0x0128,
+	0x9086, 0x0200, 0x0904, 0x33af, 0x0005, 0x7018, 0x2048, 0x2061,
+	0x1800, 0x701c, 0x0807, 0x7014, 0x2048, 0xa864, 0x9094, 0x00ff,
+	0x9296, 0x0029, 0x1120, 0xaa78, 0xd2fc, 0x0128, 0x0005, 0x9086,
+	0x0103, 0x0108, 0x0005, 0x2079, 0x0000, 0x2061, 0x1800, 0x701c,
+	0x0807, 0x2061, 0x1800, 0x7880, 0x908a, 0x0040, 0x1210, 0x61cc,
+	0x0042, 0x2100, 0x908a, 0x003f, 0x1a04, 0x33ac, 0x61cc, 0x0804,
+	0x3341, 0x3383, 0x33bb, 0x33c5, 0x33c9, 0x33d3, 0x33d9, 0x33dd,
+	0x33ed, 0x33f0, 0x33fa, 0x33ff, 0x3404, 0x340f, 0x341a, 0x3429,
+	0x3438, 0x3446, 0x345d, 0x3478, 0x33ac, 0x3521, 0x355f, 0x3604,
+	0x3615, 0x3638, 0x33ac, 0x33ac, 0x33ac, 0x3670, 0x3690, 0x3699,
+	0x36c5, 0x36cb, 0x33ac, 0x3711, 0x33ac, 0x33ac, 0x33ac, 0x33ac,
+	0x33ac, 0x371c, 0x3725, 0x372d, 0x372f, 0x33ac, 0x33ac, 0x33ac,
+	0x33ac, 0x33ac, 0x33ac, 0x375f, 0x33ac, 0x33ac, 0x33ac, 0x33ac,
+	0x33ac, 0x377c, 0x37d7, 0x33ac, 0x33ac, 0x33ac, 0x33ac, 0x33ac,
+	0x33ac, 0x0002, 0x3801, 0x3804, 0x3863, 0x387c, 0x38ac, 0x3b4e,
+	0x33ac, 0x4f57, 0x33ac, 0x33ac, 0x33ac, 0x33ac, 0x33ac, 0x33ac,
+	0x33ac, 0x33ac, 0x33fa, 0x33ff, 0x404d, 0x53aa, 0x4063, 0x4fe6,
+	0x5037, 0x513a, 0x33ac, 0x519c, 0x51d8, 0x5209, 0x5315, 0x5236,
+	0x5295, 0x33ac, 0x4067, 0x41f7, 0x420d, 0x4232, 0x4297, 0x430b,
+	0x432b, 0x43a2, 0x43fe, 0x445a, 0x445d, 0x4482, 0x44f5, 0x455f,
+	0x4567, 0x4699, 0x47fb, 0x482f, 0x4a79, 0x33ac, 0x4a97, 0x4b5a,
+	0x4c30, 0x33ac, 0x33ac, 0x33ac, 0x33ac, 0x4c96, 0x4cb1, 0x4567,
+	0x4ef7, 0x714c, 0x0000, 0x2021, 0x4000, 0x080c, 0x48ad, 0x0126,
+	0x2091, 0x8000, 0x0e04, 0x338d, 0x0010, 0x012e, 0x0cc0, 0x7c36,
+	0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, 0x0010,
+	0x7c82, 0x7986, 0x7a8a, 0x7b8e, 0x2091, 0x4080, 0x2001, 0x0089,
+	0x2004, 0xd084, 0x190c, 0x11be, 0x7007, 0x0001, 0x2091, 0x5000,
+	0x700f, 0x0000, 0x012e, 0x0005, 0x2021, 0x4001, 0x08b0, 0x2021,
+	0x4002, 0x0898, 0x2021, 0x4003, 0x0880, 0x2021, 0x4005, 0x0868,
+	0x2021, 0x4006, 0x0850, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88,
+	0x7a8c, 0x7884, 0x7990, 0x0804, 0x48ba, 0x7883, 0x0004, 0x7884,
+	0x0807, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884,
+	0x7990, 0x0804, 0x48bd, 0x7984, 0x7888, 0x2114, 0x200a, 0x0804,
+	0x3383, 0x7984, 0x2114, 0x0804, 0x3383, 0x20e1, 0x0000, 0x2099,
+	0x0021, 0x20e9, 0x0000, 0x20a1, 0x0021, 0x20a9, 0x001f, 0x4003,
+	0x7984, 0x7a88, 0x7b8c, 0x0804, 0x3383, 0x7884, 0x2060, 0x04d8,
+	0x2009, 0x0003, 0x2011, 0x0002, 0x2019, 0x001a, 0x789b, 0x0317,
+	0x0804, 0x3383, 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0800, 0x2039,
+	0x0001, 0x7d98, 0x7c9c, 0x0848, 0x79a0, 0x9182, 0x0040, 0x0210,
+	0x0804, 0x33b8, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x33bf, 0x79a0,
+	0x9182, 0x0040, 0x0210, 0x0804, 0x33b8, 0x2138, 0x7d98, 0x7c9c,
+	0x0804, 0x33cd, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x33b8,
+	0x21e8, 0x7984, 0x7888, 0x20a9, 0x0001, 0x21a0, 0x4004, 0x0804,
+	0x3383, 0x2061, 0x0800, 0xe10c, 0x9006, 0x2c15, 0x9200, 0x8c60,
+	0x8109, 0x1dd8, 0x2010, 0x9005, 0x0904, 0x3383, 0x0804, 0x33b2,
+	0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x33b8, 0x21e0, 0x20a9,
+	0x0001, 0x7984, 0x2198, 0x4012, 0x0804, 0x3383, 0x2069, 0x1853,
+	0x7884, 0x7990, 0x911a, 0x1a04, 0x33b8, 0x8019, 0x0904, 0x33b8,
+	0x684a, 0x6942, 0x788c, 0x6852, 0x7888, 0x6856, 0x9006, 0x685a,
+	0x685e, 0x080c, 0x73dd, 0x0804, 0x3383, 0x2069, 0x1853, 0x7884,
+	0x7994, 0x911a, 0x1a04, 0x33b8, 0x8019, 0x0904, 0x33b8, 0x684e,
+	0x6946, 0x788c, 0x6862, 0x7888, 0x6866, 0x9006, 0x686a, 0x686e,
+	0x0126, 0x2091, 0x8000, 0x080c, 0x6762, 0x012e, 0x0804, 0x3383,
+	0x902e, 0x2520, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x33b5,
+	0x7984, 0x7b88, 0x7a8c, 0x20a9, 0x0005, 0x20e9, 0x0001, 0x20a1,
+	0x189c, 0x4101, 0x080c, 0x4871, 0x1120, 0x2009, 0x0002, 0x0804,
+	0x33b5, 0x2009, 0x0020, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c,
+	0x48ba, 0x701f, 0x349c, 0x0005, 0xa864, 0x2008, 0x9084, 0x00ff,
+	0x9096, 0x0011, 0x0168, 0x9096, 0x0019, 0x0150, 0x9096, 0x0015,
+	0x0138, 0x9096, 0x0048, 0x0120, 0x9096, 0x0029, 0x1904, 0x33b5,
+	0x810f, 0x918c, 0x00ff, 0x0904, 0x33b5, 0x7112, 0x7010, 0x8001,
+	0x0560, 0x7012, 0x080c, 0x4871, 0x1120, 0x2009, 0x0002, 0x0804,
+	0x33b5, 0x2009, 0x0020, 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494,
+	0xa598, 0x9290, 0x0040, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9,
+	0x0000, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x48ba, 0x701f,
+	0x34da, 0x0005, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0002, 0x0120,
+	0x9096, 0x000a, 0x1904, 0x33b5, 0x0888, 0x7014, 0x2048, 0xa868,
+	0xc0fd, 0xa86a, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0029, 0x1160,
+	0xc2fd, 0xaa7a, 0x080c, 0x5ddd, 0x0150, 0x0126, 0x2091, 0x8000,
+	0xa87a, 0xa982, 0x012e, 0x0050, 0x080c, 0x60f4, 0x1128, 0x7007,
+	0x0003, 0x701f, 0x3506, 0x0005, 0x080c, 0x6bac, 0x0126, 0x2091,
+	0x8000, 0x20a9, 0x0005, 0x20e1, 0x0001, 0x2099, 0x189c, 0x400a,
+	0x2100, 0x9210, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000,
+	0xa85c, 0x9080, 0x0019, 0x2009, 0x0020, 0x012e, 0xaf60, 0x0804,
+	0x48bd, 0x2091, 0x8000, 0x7837, 0x4000, 0x7833, 0x0010, 0x7883,
+	0x4000, 0x7887, 0x4953, 0x788b, 0x5020, 0x788f, 0x2020, 0x2009,
+	0x017f, 0x2104, 0x7892, 0x3f00, 0x7896, 0x2061, 0x0100, 0x6200,
+	0x2061, 0x0200, 0x603c, 0x8007, 0x9205, 0x789a, 0x2009, 0x04fd,
+	0x2104, 0x789e, 0x2091, 0x5000, 0x2091, 0x4080, 0x2001, 0x0089,
+	0x2004, 0xd084, 0x0180, 0x2001, 0x19f3, 0x2004, 0x9005, 0x0128,
+	0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003,
+	0x0002, 0x2003, 0x1001, 0x2071, 0x0080, 0x0804, 0x0427, 0x81ff,
+	0x1904, 0x33b5, 0x7984, 0x080c, 0x6269, 0x1904, 0x33b8, 0x7e98,
+	0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x33b8, 0x7c88, 0x7d8c,
+	0x080c, 0x649b, 0x080c, 0x642c, 0x1518, 0x2061, 0x1ddc, 0x0126,
+	0x2091, 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d,
+	0x0130, 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0150, 0x012e,
+	0x9ce0, 0x001c, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1a04, 0x33b5,
+	0x0c30, 0x080c, 0xb437, 0x012e, 0x0904, 0x33b5, 0x0804, 0x3383,
+	0x900e, 0x2001, 0x0005, 0x080c, 0x6bac, 0x0126, 0x2091, 0x8000,
+	0x080c, 0xbb30, 0x080c, 0x698f, 0x012e, 0x0804, 0x3383, 0x00a6,
+	0x2950, 0xb198, 0x080c, 0x6269, 0x1904, 0x35f1, 0xb6a4, 0x9684,
+	0x3fff, 0x9082, 0x4000, 0x16e8, 0xb49c, 0xb5a0, 0x080c, 0x649b,
+	0x080c, 0x6446, 0x1520, 0x2061, 0x1ddc, 0x0126, 0x2091, 0x8000,
 	0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, 0x0130, 0xa86c,
-	0x9406, 0x1118, 0xa870, 0x9506, 0x0150, 0x012e, 0x9ce0, 0x001c,
-	0x2001, 0x1819, 0x2004, 0x9c02, 0x1a04, 0x3373, 0x0c30, 0x080c,
-	0xb2d0, 0x012e, 0x0904, 0x3373, 0x0804, 0x3341, 0x900e, 0x2001,
-	0x0005, 0x080c, 0x6a5c, 0x0126, 0x2091, 0x8000, 0x080c, 0xb9c2,
-	0x080c, 0x683f, 0x012e, 0x0804, 0x3341, 0x00a6, 0x2950, 0xb198,
-	0x080c, 0x6166, 0x1904, 0x35af, 0xb6a4, 0x9684, 0x3fff, 0x9082,
-	0x4000, 0x16e8, 0xb49c, 0xb5a0, 0x080c, 0x6398, 0x080c, 0x6343,
-	0x1520, 0x2061, 0x1ddc, 0x0126, 0x2091, 0x8000, 0x6000, 0x9086,
-	0x0000, 0x0148, 0x6014, 0x904d, 0x0130, 0xa86c, 0x9406, 0x1118,
-	0xa870, 0x9506, 0x0158, 0x012e, 0x9ce0, 0x001c, 0x2001, 0x1819,
-	0x2004, 0x9c02, 0x2009, 0x000d, 0x12b0, 0x0c28, 0x080c, 0xb2d0,
-	0x012e, 0x2009, 0x0003, 0x0178, 0x00e0, 0x900e, 0x2001, 0x0005,
-	0x080c, 0x6a5c, 0x0126, 0x2091, 0x8000, 0x080c, 0xb9c2, 0x080c,
-	0x6833, 0x012e, 0x0070, 0xb097, 0x4005, 0xb19a, 0x0010, 0xb097,
-	0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x2a48, 0x00ae,
-	0x0005, 0xb097, 0x4000, 0x9006, 0x918d, 0x0001, 0x2008, 0x2a48,
-	0x00ae, 0x0005, 0x81ff, 0x1904, 0x3373, 0x080c, 0x47b2, 0x0904,
-	0x3376, 0x080c, 0x622d, 0x0904, 0x3373, 0x080c, 0x639e, 0x0904,
-	0x3373, 0x0804, 0x42e0, 0x81ff, 0x1904, 0x3373, 0x080c, 0x47ce,
-	0x0904, 0x3376, 0x080c, 0x642c, 0x0904, 0x3373, 0x2019, 0x0005,
-	0x79a8, 0x080c, 0x63b9, 0x0904, 0x3373, 0x7888, 0x908a, 0x1000,
-	0x1a04, 0x3376, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x7fc9,
-	0x7984, 0xd184, 0x1904, 0x3341, 0x0804, 0x42e0, 0x0126, 0x2091,
-	0x8000, 0x81ff, 0x0118, 0x2009, 0x0001, 0x0450, 0x2029, 0x07ff,
-	0x6458, 0x2400, 0x9506, 0x01f8, 0x2508, 0x080c, 0x6166, 0x11d8,
-	0x080c, 0x642c, 0x1128, 0x2009, 0x0002, 0x62bc, 0x2518, 0x00c0,
-	0x2019, 0x0004, 0x900e, 0x080c, 0x63b9, 0x1118, 0x2009, 0x0006,
-	0x0078, 0x7884, 0x908a, 0x1000, 0x1270, 0x8003, 0x800b, 0x810b,
-	0x9108, 0x080c, 0x7fc9, 0x8529, 0x1ae0, 0x012e, 0x0804, 0x3341,
-	0x012e, 0x0804, 0x3373, 0x012e, 0x0804, 0x3376, 0x080c, 0x47b2,
-	0x0904, 0x3376, 0x080c, 0x622d, 0x0904, 0x3373, 0x080c, 0x9746,
-	0xbaa0, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c, 0x8498, 0x0076,
-	0x903e, 0x080c, 0x8387, 0x900e, 0x080c, 0xce23, 0x007e, 0x00ce,
-	0x080c, 0x9762, 0x080c, 0x6398, 0x0804, 0x3341, 0x080c, 0x47b2,
-	0x0904, 0x3376, 0x080c, 0x6398, 0x2208, 0x0804, 0x3341, 0x0156,
-	0x00d6, 0x00e6, 0x00c6, 0x2069, 0x1906, 0x6810, 0x6914, 0x910a,
-	0x1208, 0x900e, 0x6816, 0x9016, 0x901e, 0x2071, 0x19b6, 0x7028,
-	0x9065, 0x0118, 0x8210, 0x600c, 0x0cd8, 0x2300, 0x9218, 0x00ce,
-	0x00ee, 0x00de, 0x015e, 0x0804, 0x3341, 0x00f6, 0x0016, 0x907d,
-	0x0138, 0x9006, 0x8000, 0x2f0c, 0x81ff, 0x0110, 0x2178, 0x0cd0,
-	0x001e, 0x00fe, 0x0005, 0x2069, 0x1906, 0x6910, 0x62b8, 0x0804,
-	0x3341, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3373, 0x0126,
-	0x2091, 0x8000, 0x080c, 0x52b1, 0x0128, 0x2009, 0x0007, 0x012e,
-	0x0804, 0x3373, 0x012e, 0x6158, 0x9190, 0x3142, 0x2215, 0x9294,
-	0x00ff, 0x6378, 0x83ff, 0x0108, 0x627c, 0x67d8, 0x97c4, 0x000a,
-	0x98c6, 0x000a, 0x1118, 0x2031, 0x0001, 0x00e8, 0x97c4, 0x0022,
-	0x98c6, 0x0022, 0x1118, 0x2031, 0x0003, 0x00a8, 0x97c4, 0x0012,
-	0x98c6, 0x0012, 0x1118, 0x2031, 0x0002, 0x0068, 0x080c, 0x6f5c,
-	0x1118, 0x2031, 0x0004, 0x0038, 0xd79c, 0x0120, 0x2009, 0x0005,
-	0x0804, 0x3373, 0x9036, 0x7e9a, 0x7f9e, 0x0804, 0x3341, 0x6148,
-	0x624c, 0x2019, 0x1955, 0x231c, 0x2001, 0x1956, 0x2004, 0x789a,
-	0x0804, 0x3341, 0x0126, 0x2091, 0x8000, 0x6138, 0x623c, 0x6340,
-	0x012e, 0x0804, 0x3341, 0x080c, 0x47ce, 0x0904, 0x3376, 0xba44,
-	0xbb38, 0x0804, 0x3341, 0x080c, 0x0d65, 0x080c, 0x47ce, 0x2110,
-	0x0904, 0x3376, 0xb804, 0x908c, 0x00ff, 0x918e, 0x0006, 0x0140,
-	0x9084, 0xff00, 0x9086, 0x0600, 0x2009, 0x0009, 0x1904, 0x3373,
-	0x0126, 0x2091, 0x8000, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c,
-	0x9746, 0x080c, 0x9372, 0x080c, 0x8498, 0x0076, 0x903e, 0x080c,
-	0x8387, 0x900e, 0x080c, 0xce23, 0x007e, 0x00ce, 0x080c, 0x9762,
-	0xb807, 0x0407, 0x012e, 0x0804, 0x3341, 0x6148, 0x624c, 0x7884,
-	0x604a, 0x7b88, 0x634e, 0x2069, 0x1853, 0x831f, 0x9305, 0x6816,
-	0x788c, 0x2069, 0x1955, 0x2d1c, 0x206a, 0x7e98, 0x9682, 0x0014,
-	0x1210, 0x2031, 0x07d0, 0x2069, 0x1956, 0x2d04, 0x266a, 0x789a,
-	0x0804, 0x3341, 0x0126, 0x2091, 0x8000, 0x6138, 0x7884, 0x603a,
-	0x910e, 0xd1b4, 0x190c, 0x0eb4, 0xd0c4, 0x01a8, 0x00d6, 0x78a8,
-	0x2009, 0x196c, 0x200a, 0x78ac, 0x2011, 0x196d, 0x2012, 0x2069,
-	0x0100, 0x6838, 0x9086, 0x0007, 0x1118, 0x2214, 0x6a5a, 0x0010,
-	0x210c, 0x695a, 0x00de, 0x7888, 0x603e, 0x2011, 0x0116, 0x220c,
-	0x7888, 0xd08c, 0x0118, 0x918d, 0x0040, 0x0010, 0x918c, 0xff7f,
-	0x2112, 0x6140, 0x788c, 0x6042, 0x910e, 0xd1e4, 0x190c, 0x0ecf,
-	0x6040, 0xd0cc, 0x0120, 0x78b0, 0x2011, 0x0114, 0x2012, 0x012e,
-	0x0804, 0x3341, 0x00f6, 0x2079, 0x1800, 0x7a38, 0xa898, 0x9084,
-	0xfebf, 0x9215, 0xa89c, 0x9084, 0xfebf, 0x8002, 0x9214, 0x7838,
-	0x9084, 0x0140, 0x9215, 0x7a3a, 0xa897, 0x4000, 0x900e, 0x9085,
-	0x0001, 0x2001, 0x0000, 0x00fe, 0x0005, 0x7898, 0x9005, 0x01a8,
-	0x7888, 0x9025, 0x0904, 0x3376, 0x788c, 0x902d, 0x0904, 0x3376,
-	0x900e, 0x080c, 0x6166, 0x1120, 0xba44, 0xbb38, 0xbc46, 0xbd3a,
-	0x9186, 0x07ff, 0x0190, 0x8108, 0x0ca0, 0x080c, 0x47ce, 0x0904,
-	0x3376, 0x7888, 0x900d, 0x0904, 0x3376, 0x788c, 0x9005, 0x0904,
-	0x3376, 0xba44, 0xb946, 0xbb38, 0xb83a, 0x0804, 0x3341, 0x2011,
-	0xbc09, 0x0010, 0x2011, 0xbc05, 0x080c, 0x52b1, 0x1904, 0x3373,
-	0x00c6, 0x2061, 0x0100, 0x7984, 0x9186, 0x00ff, 0x1130, 0x2001,
-	0x1817, 0x2004, 0x9085, 0xff00, 0x0088, 0x9182, 0x007f, 0x16e0,
-	0x9188, 0x3142, 0x210d, 0x918c, 0x00ff, 0x2001, 0x1817, 0x2004,
-	0x0026, 0x9116, 0x002e, 0x0580, 0x810f, 0x9105, 0x0126, 0x2091,
-	0x8000, 0x0006, 0x080c, 0x9a0f, 0x000e, 0x0510, 0x602e, 0x620a,
-	0x7984, 0x00b6, 0x080c, 0x610c, 0x2b08, 0x00be, 0x1500, 0x6112,
-	0x6023, 0x0001, 0x080c, 0x479b, 0x01d0, 0x9006, 0xa866, 0x7007,
-	0x0003, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x701f, 0x381a, 0x2900,
-	0x6016, 0x2009, 0x0032, 0x080c, 0x9b03, 0x012e, 0x00ce, 0x0005,
-	0x012e, 0x00ce, 0x0804, 0x3373, 0x00ce, 0x0804, 0x3376, 0x080c,
-	0x9a65, 0x0cb0, 0xa830, 0x9086, 0x0100, 0x0904, 0x3373, 0x0804,
-	0x3341, 0x2061, 0x1a3d, 0x0126, 0x2091, 0x8000, 0x6000, 0xd084,
-	0x0170, 0x6104, 0x6208, 0x2061, 0x1800, 0x6350, 0x6070, 0x789a,
-	0x60bc, 0x789e, 0x60b8, 0x78aa, 0x012e, 0x0804, 0x3341, 0x900e,
-	0x2110, 0x0c88, 0x81ff, 0x1904, 0x3373, 0x080c, 0x6f5c, 0x0904,
-	0x3373, 0x0126, 0x2091, 0x8000, 0x6250, 0x6070, 0x9202, 0x0248,
-	0x9085, 0x0001, 0x080c, 0x2458, 0x080c, 0x54c1, 0x012e, 0x0804,
-	0x3341, 0x012e, 0x0804, 0x3376, 0x0006, 0x0016, 0x00c6, 0x00e6,
-	0x2001, 0x1978, 0x2070, 0x2061, 0x1853, 0x6008, 0x2072, 0x900e,
-	0x2011, 0x1400, 0x080c, 0x8276, 0x7206, 0x00ee, 0x00ce, 0x001e,
-	0x000e, 0x0005, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0128, 0x012e,
-	0x2021, 0x400b, 0x0804, 0x3343, 0x7884, 0xd0fc, 0x0148, 0x2001,
-	0x002a, 0x2004, 0x9082, 0x00e1, 0x0288, 0x012e, 0x0804, 0x3376,
-	0x2001, 0x002a, 0x2004, 0x2069, 0x1853, 0x6908, 0x9102, 0x1230,
-	0x012e, 0x0804, 0x3376, 0x012e, 0x0804, 0x3373, 0x080c, 0x99e4,
-	0x0dd0, 0x7884, 0xd0fc, 0x0904, 0x38e5, 0x00c6, 0x080c, 0x479b,
-	0x00ce, 0x0d88, 0xa867, 0x0000, 0x7884, 0xa80a, 0x7898, 0xa80e,
-	0x789c, 0xa812, 0x2001, 0x002e, 0x2004, 0xa81a, 0x2001, 0x002f,
-	0x2004, 0xa81e, 0x2001, 0x0030, 0x2004, 0xa822, 0x2001, 0x0031,
-	0x2004, 0xa826, 0x2001, 0x0034, 0x2004, 0xa82a, 0x2001, 0x0035,
-	0x2004, 0xa82e, 0x2001, 0x002a, 0x2004, 0x9080, 0x0003, 0x9084,
-	0x00fc, 0x8004, 0xa816, 0x080c, 0x3a6f, 0x0928, 0x7014, 0x2048,
-	0xad2c, 0xac28, 0xab1c, 0xaa18, 0xa930, 0xa808, 0xd0b4, 0x1120,
-	0x2029, 0x0000, 0x2021, 0x0000, 0x8906, 0x8006, 0x8007, 0x90bc,
-	0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x080c, 0x47e4, 0x701f,
-	0x39ac, 0x7023, 0x0001, 0x012e, 0x0005, 0x080c, 0x9746, 0x0046,
-	0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6,
-	0x080c, 0x3854, 0x2001, 0x196e, 0x2003, 0x0000, 0x2021, 0x000a,
-	0x2061, 0x0100, 0x6104, 0x0016, 0x60bb, 0x0000, 0x60bf, 0x32e1,
-	0x60bf, 0x0012, 0x080c, 0x3ade, 0x080c, 0x3a9d, 0x00f6, 0x00e6,
-	0x0086, 0x2940, 0x2071, 0x19b6, 0x2079, 0x0090, 0x00d6, 0x2069,
-	0x0000, 0x6884, 0xd0b4, 0x0140, 0x2001, 0x0035, 0x2004, 0x780e,
-	0x2001, 0x0034, 0x2004, 0x780a, 0x00de, 0x2011, 0x0001, 0x080c,
-	0x3e4f, 0x008e, 0x00ee, 0x00fe, 0x080c, 0x3d7c, 0x080c, 0x3ca9,
-	0x05b8, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, 0x1db8, 0x080c,
-	0x3ec3, 0x00f6, 0x2079, 0x0300, 0x78bc, 0x00fe, 0x908c, 0x0070,
-	0x1560, 0x2071, 0x0200, 0x7037, 0x0000, 0x7050, 0x9084, 0xff00,
-	0x9086, 0x3200, 0x1510, 0x7037, 0x0001, 0x7050, 0x9084, 0xff00,
-	0x9086, 0xe100, 0x11d0, 0x7037, 0x0000, 0x7054, 0x7037, 0x0000,
-	0x715c, 0x9106, 0x1190, 0x2001, 0x181f, 0x2004, 0x9106, 0x1168,
-	0x00c6, 0x2061, 0x0100, 0x6024, 0x9084, 0x1e00, 0x00ce, 0x0138,
-	0x080c, 0x3cb3, 0x080c, 0x3a98, 0x0058, 0x080c, 0x3a98, 0x080c,
-	0x3de7, 0x080c, 0x3d72, 0x2001, 0x020b, 0x2004, 0xd0e4, 0x0dd8,
-	0x2001, 0x032a, 0x2003, 0x0004, 0x2061, 0x0100, 0x6027, 0x0002,
-	0x001e, 0x6106, 0x2011, 0x020d, 0x2013, 0x0020, 0x60bb, 0x0000,
-	0x60bf, 0x0108, 0x60bf, 0x0012, 0x2001, 0x0004, 0x200c, 0x918c,
-	0xfffd, 0x2102, 0x080c, 0x12cd, 0x2009, 0x0028, 0x080c, 0x201d,
-	0x2001, 0x0227, 0x200c, 0x2102, 0x080c, 0x9762, 0x00fe, 0x00ee,
-	0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x004e, 0x2001,
-	0x196e, 0x2004, 0x9005, 0x1118, 0x012e, 0x0804, 0x3341, 0x012e,
-	0x2021, 0x400c, 0x0804, 0x3343, 0x0016, 0x0026, 0x0036, 0x0046,
-	0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, 0x0156, 0x7014, 0x2048,
-	0x7020, 0x20a8, 0x8000, 0x7022, 0xa804, 0x9005, 0x0904, 0x3a08,
-	0x2048, 0x1f04, 0x39bc, 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494,
-	0xa598, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021,
-	0x0000, 0x0096, 0x7014, 0x2048, 0xa864, 0x009e, 0x9086, 0x0103,
-	0x0170, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0,
-	0x9080, 0x001b, 0x080c, 0x47e4, 0x701f, 0x39ac, 0x00b0, 0x8906,
-	0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b,
-	0x21a8, 0x27e0, 0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c, 0x0fa0,
-	0x000e, 0x080c, 0x47e7, 0x701f, 0x39ac, 0x015e, 0x00de, 0x009e,
-	0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005,
-	0x7014, 0x2048, 0xa864, 0x9086, 0x0103, 0x1118, 0x701f, 0x3a6d,
-	0x0450, 0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a, 0x2009, 0x007f,
-	0x080c, 0x6106, 0x0110, 0x9006, 0x0030, 0xb813, 0x00ff, 0xb817,
-	0xfffd, 0x080c, 0xbba1, 0x015e, 0x00de, 0x009e, 0x008e, 0x007e,
-	0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0904, 0x3373, 0x0016,
-	0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6,
-	0x0156, 0x701f, 0x3a3f, 0x7007, 0x0003, 0x0804, 0x39fd, 0xa830,
-	0x9086, 0x0100, 0x2021, 0x400c, 0x0904, 0x3343, 0x0076, 0xad10,
-	0xac0c, 0xab24, 0xaa20, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029,
-	0x0000, 0x2021, 0x0000, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f,
-	0x9084, 0xffc0, 0x9080, 0x001b, 0x21a8, 0x27e0, 0x2098, 0x27e8,
-	0x20a0, 0x0006, 0x080c, 0x0fa0, 0x000e, 0x080c, 0x47e7, 0x007e,
-	0x701f, 0x39ac, 0x7023, 0x0001, 0x0005, 0x0804, 0x3341, 0x0156,
-	0x00c6, 0xa814, 0x908a, 0x001e, 0x0218, 0xa833, 0x001e, 0x0010,
-	0xa832, 0x0078, 0x81ff, 0x0168, 0x0016, 0x080c, 0x479b, 0x001e,
-	0x0130, 0xa800, 0x2040, 0xa008, 0xa80a, 0x2100, 0x0c58, 0x9006,
-	0x0010, 0x9085, 0x0001, 0x00ce, 0x015e, 0x0005, 0x0006, 0x00f6,
-	0x2079, 0x0000, 0x7880, 0x9086, 0x0044, 0x00fe, 0x000e, 0x0005,
-	0x2001, 0x196e, 0x2003, 0x0001, 0x0005, 0x00f6, 0x00e6, 0x00c6,
-	0x2061, 0x0200, 0x2001, 0x1979, 0x2004, 0x601a, 0x2061, 0x0100,
-	0x2001, 0x1978, 0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x080c,
-	0x479b, 0xa813, 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, 0x2001,
-	0x002e, 0x2004, 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, 0x2061,
-	0x0090, 0x2079, 0x0100, 0x2001, 0x1978, 0x2004, 0x6036, 0x2009,
-	0x0040, 0x080c, 0x201d, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8,
-	0xa86e, 0x601a, 0xa873, 0x0000, 0x601f, 0x0000, 0x78ca, 0x9006,
-	0x600a, 0x600e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, 0x080c,
-	0x479b, 0x2940, 0xa013, 0x0019, 0xa017, 0x0001, 0x2800, 0xa05a,
-	0x2001, 0x0030, 0x2004, 0xa866, 0x2001, 0x0031, 0x2004, 0xa86a,
-	0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, 0xa873, 0x0000,
-	0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x0300, 0x2003, 0x0000,
-	0x2001, 0x020d, 0x2003, 0x0000, 0x2001, 0x0004, 0x200c, 0x918d,
-	0x0002, 0x2102, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x81ff,
-	0x0148, 0x080c, 0x27cf, 0x1130, 0x9006, 0x080c, 0x2739, 0x9006,
-	0x080c, 0x271c, 0x7884, 0x9084, 0x0007, 0x0002, 0x3b29, 0x3b32,
-	0x3b3b, 0x3b26, 0x3b26, 0x3b26, 0x3b26, 0x3b26, 0x012e, 0x0804,
-	0x3376, 0x2009, 0x0114, 0x2104, 0x9085, 0x0800, 0x200a, 0x080c,
-	0x3cfd, 0x00c0, 0x2009, 0x0114, 0x2104, 0x9085, 0x4000, 0x200a,
-	0x080c, 0x3cfd, 0x0078, 0x080c, 0x6f5c, 0x1128, 0x012e, 0x2009,
-	0x0016, 0x0804, 0x3373, 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b,
-	0x0804, 0x3343, 0x080c, 0x9746, 0x0086, 0x0096, 0x00a6, 0x00b6,
-	0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3854, 0x2009, 0x0101,
-	0x210c, 0x0016, 0x7ec8, 0x7dcc, 0x9006, 0x2068, 0x2060, 0x2058,
-	0x080c, 0x3f9e, 0x080c, 0x3eee, 0x903e, 0x2720, 0x00f6, 0x00e6,
-	0x0086, 0x2940, 0x2071, 0x19b6, 0x2079, 0x0090, 0x00d6, 0x2069,
-	0x0000, 0x6884, 0xd0b4, 0x0120, 0x68d4, 0x780e, 0x68d0, 0x780a,
-	0x00de, 0x2011, 0x0001, 0x080c, 0x3e4f, 0x080c, 0x27d7, 0x080c,
-	0x27d7, 0x080c, 0x27d7, 0x080c, 0x27d7, 0x080c, 0x3e4f, 0x008e,
-	0x00ee, 0x00fe, 0x080c, 0x3d7c, 0x2009, 0x9c40, 0x8109, 0x11b0,
-	0x080c, 0x3cb3, 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102,
-	0x001e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e,
-	0x008e, 0x2009, 0x0017, 0x080c, 0x3373, 0x0cf8, 0x2001, 0x020b,
-	0x2004, 0x9084, 0x0140, 0x1d10, 0x00f6, 0x2079, 0x0000, 0x7884,
-	0x00fe, 0xd0bc, 0x0178, 0x2001, 0x0201, 0x200c, 0x81ff, 0x0150,
-	0x080c, 0x3d5a, 0x2d00, 0x9c05, 0x9b05, 0x0120, 0x080c, 0x3cb3,
-	0x0804, 0x3c5c, 0x080c, 0x3ec3, 0x080c, 0x3de7, 0x080c, 0x3d3d,
-	0x080c, 0x3d72, 0x00f6, 0x2079, 0x0100, 0x7824, 0xd0ac, 0x0130,
-	0x8b58, 0x080c, 0x3cb3, 0x00fe, 0x0804, 0x3c5c, 0x00fe, 0x080c,
-	0x3ca9, 0x1150, 0x8d68, 0x2001, 0x0032, 0x2602, 0x2001, 0x0033,
-	0x2502, 0x080c, 0x3cb3, 0x0080, 0x87ff, 0x0138, 0x2001, 0x0201,
-	0x2004, 0x9005, 0x1908, 0x8739, 0x0038, 0x2001, 0x1a3a, 0x2004,
-	0x9086, 0x0000, 0x1904, 0x3bac, 0x2001, 0x032f, 0x2003, 0x00f6,
-	0x8631, 0x1208, 0x8529, 0x2500, 0x9605, 0x0904, 0x3c5c, 0x7884,
-	0xd0bc, 0x0128, 0x2d00, 0x9c05, 0x9b05, 0x1904, 0x3c5c, 0xa013,
-	0x0019, 0x2001, 0x032a, 0x2003, 0x0004, 0x7884, 0xd0ac, 0x1148,
-	0x2001, 0x1a3a, 0x2003, 0x0003, 0x2001, 0x032a, 0x2003, 0x0009,
-	0x0030, 0xa017, 0x0001, 0x78b4, 0x9005, 0x0108, 0xa016, 0x2800,
-	0xa05a, 0x2009, 0x0040, 0x080c, 0x201d, 0x2900, 0xa85a, 0xa813,
-	0x0019, 0x7884, 0xd0a4, 0x1180, 0xa817, 0x0000, 0x00c6, 0x20a9,
-	0x0004, 0x2061, 0x0090, 0x602b, 0x0008, 0x2001, 0x0203, 0x2004,
-	0x1f04, 0x3c33, 0x00ce, 0x0030, 0xa817, 0x0001, 0x78b0, 0x9005,
-	0x0108, 0xa816, 0x00f6, 0x00c6, 0x2079, 0x0100, 0x2061, 0x0090,
-	0x7827, 0x0002, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0x601a,
-	0x0006, 0x2001, 0x002b, 0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca,
-	0x00ce, 0x00fe, 0x0804, 0x3b66, 0x001e, 0x00c6, 0x2001, 0x032a,
-	0x2003, 0x0004, 0x2061, 0x0100, 0x6027, 0x0002, 0x6106, 0x2011,
-	0x020d, 0x2013, 0x0020, 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd,
-	0x2102, 0x080c, 0x12cd, 0x7884, 0x9084, 0x0003, 0x9086, 0x0002,
-	0x01b0, 0x2009, 0x0028, 0x080c, 0x201d, 0x2001, 0x0227, 0x200c,
-	0x2102, 0x6050, 0x9084, 0xb7ff, 0x080c, 0x2892, 0x6052, 0x602f,
-	0x0000, 0x604b, 0xf7f7, 0x6043, 0x0090, 0x6043, 0x0010, 0x080c,
-	0x9762, 0x00ce, 0x2d08, 0x2c10, 0x2b18, 0x2b00, 0x9c05, 0x9d05,
+	0x9406, 0x1118, 0xa870, 0x9506, 0x0158, 0x012e, 0x9ce0, 0x001c,
+	0x2001, 0x1819, 0x2004, 0x9c02, 0x2009, 0x000d, 0x12b0, 0x0c28,
+	0x080c, 0xb437, 0x012e, 0x2009, 0x0003, 0x0178, 0x00e0, 0x900e,
+	0x2001, 0x0005, 0x080c, 0x6bac, 0x0126, 0x2091, 0x8000, 0x080c,
+	0xbb30, 0x080c, 0x6983, 0x012e, 0x0070, 0xb097, 0x4005, 0xb19a,
+	0x0010, 0xb097, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030,
+	0x2a48, 0x00ae, 0x0005, 0xb097, 0x4000, 0x9006, 0x918d, 0x0001,
+	0x2008, 0x2a48, 0x00ae, 0x0005, 0x81ff, 0x1904, 0x33b5, 0x080c,
+	0x4888, 0x0904, 0x33b8, 0x080c, 0x6330, 0x0904, 0x33b5, 0x080c,
+	0x64a1, 0x0904, 0x33b5, 0x0804, 0x4322, 0x81ff, 0x1904, 0x33b5,
+	0x080c, 0x48a4, 0x0904, 0x33b8, 0x080c, 0x652f, 0x0904, 0x33b5,
+	0x2019, 0x0005, 0x79a8, 0x080c, 0x64bc, 0x0904, 0x33b5, 0x7888,
+	0x908a, 0x1000, 0x1a04, 0x33b8, 0x8003, 0x800b, 0x810b, 0x9108,
+	0x080c, 0x813f, 0x7984, 0xd184, 0x1904, 0x3383, 0x0804, 0x4322,
+	0x0126, 0x2091, 0x8000, 0x81ff, 0x0118, 0x2009, 0x0001, 0x0450,
+	0x2029, 0x07ff, 0x6458, 0x2400, 0x9506, 0x01f8, 0x2508, 0x080c,
+	0x6269, 0x11d8, 0x080c, 0x652f, 0x1128, 0x2009, 0x0002, 0x62bc,
+	0x2518, 0x00c0, 0x2019, 0x0004, 0x900e, 0x080c, 0x64bc, 0x1118,
+	0x2009, 0x0006, 0x0078, 0x7884, 0x908a, 0x1000, 0x1270, 0x8003,
+	0x800b, 0x810b, 0x9108, 0x080c, 0x813f, 0x8529, 0x1ae0, 0x012e,
+	0x0804, 0x3383, 0x012e, 0x0804, 0x33b5, 0x012e, 0x0804, 0x33b8,
+	0x080c, 0x4888, 0x0904, 0x33b8, 0x080c, 0x6330, 0x0904, 0x33b5,
+	0x080c, 0x98ad, 0xbaa0, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c,
+	0x8613, 0x0076, 0x903e, 0x080c, 0x8502, 0x900e, 0x080c, 0xcfa6,
+	0x007e, 0x00ce, 0x080c, 0x98c9, 0x080c, 0x649b, 0x0804, 0x3383,
+	0x080c, 0x4888, 0x0904, 0x33b8, 0x080c, 0x649b, 0x2208, 0x0804,
+	0x3383, 0x0156, 0x00d6, 0x00e6, 0x00c6, 0x2069, 0x1906, 0x6810,
+	0x6914, 0x910a, 0x1208, 0x900e, 0x6816, 0x9016, 0x901e, 0x2071,
+	0x19b8, 0x7028, 0x9065, 0x0118, 0x8210, 0x600c, 0x0cd8, 0x2300,
+	0x9218, 0x00ce, 0x00ee, 0x00de, 0x015e, 0x0804, 0x3383, 0x00f6,
+	0x0016, 0x907d, 0x0138, 0x9006, 0x8000, 0x2f0c, 0x81ff, 0x0110,
+	0x2178, 0x0cd0, 0x001e, 0x00fe, 0x0005, 0x2069, 0x1906, 0x6910,
+	0x62b8, 0x0804, 0x3383, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804,
+	0x33b5, 0x0126, 0x2091, 0x8000, 0x080c, 0x539a, 0x0128, 0x2009,
+	0x0007, 0x012e, 0x0804, 0x33b5, 0x012e, 0x6158, 0x9190, 0x3184,
+	0x2215, 0x9294, 0x00ff, 0x6378, 0x83ff, 0x0108, 0x627c, 0x67d8,
+	0x97c4, 0x000a, 0x98c6, 0x000a, 0x1118, 0x2031, 0x0001, 0x00e8,
+	0x97c4, 0x0022, 0x98c6, 0x0022, 0x1118, 0x2031, 0x0003, 0x00a8,
+	0x97c4, 0x0012, 0x98c6, 0x0012, 0x1118, 0x2031, 0x0002, 0x0068,
+	0x080c, 0x70ac, 0x1118, 0x2031, 0x0004, 0x0038, 0xd79c, 0x0120,
+	0x2009, 0x0005, 0x0804, 0x33b5, 0x9036, 0x7e9a, 0x7f9e, 0x0804,
+	0x3383, 0x6148, 0x624c, 0x2019, 0x1957, 0x231c, 0x2001, 0x1958,
+	0x2004, 0x789a, 0x0804, 0x3383, 0x0126, 0x2091, 0x8000, 0x6138,
+	0x623c, 0x6340, 0x012e, 0x0804, 0x3383, 0x080c, 0x48a4, 0x0904,
+	0x33b8, 0xba44, 0xbb38, 0x0804, 0x3383, 0x080c, 0x0d65, 0x080c,
+	0x48a4, 0x2110, 0x0904, 0x33b8, 0xb804, 0x908c, 0x00ff, 0x918e,
+	0x0006, 0x0140, 0x9084, 0xff00, 0x9086, 0x0600, 0x2009, 0x0009,
+	0x1904, 0x33b5, 0x0126, 0x2091, 0x8000, 0x2019, 0x0005, 0x00c6,
+	0x9066, 0x080c, 0x98ad, 0x080c, 0x94d9, 0x080c, 0x8613, 0x0076,
+	0x903e, 0x080c, 0x8502, 0x900e, 0x080c, 0xcfa6, 0x007e, 0x00ce,
+	0x080c, 0x98c9, 0xb807, 0x0407, 0x012e, 0x0804, 0x3383, 0x6148,
+	0x624c, 0x7884, 0x604a, 0x7b88, 0x634e, 0x2069, 0x1853, 0x831f,
+	0x9305, 0x6816, 0x788c, 0x2069, 0x1957, 0x2d1c, 0x206a, 0x7e98,
+	0x9682, 0x0014, 0x1210, 0x2031, 0x07d0, 0x2069, 0x1958, 0x2d04,
+	0x266a, 0x789a, 0x0804, 0x3383, 0x0126, 0x2091, 0x8000, 0x6138,
+	0x7884, 0x603a, 0x910e, 0xd1b4, 0x190c, 0x0eb4, 0xd0c4, 0x01a8,
+	0x00d6, 0x78a8, 0x2009, 0x196e, 0x200a, 0x78ac, 0x2011, 0x196f,
+	0x2012, 0x2069, 0x0100, 0x6838, 0x9086, 0x0007, 0x1118, 0x2214,
+	0x6a5a, 0x0010, 0x210c, 0x695a, 0x00de, 0x7888, 0x603e, 0x2011,
+	0x0116, 0x220c, 0x7888, 0xd08c, 0x0118, 0x918d, 0x0040, 0x0010,
+	0x918c, 0xff7f, 0x2112, 0x6140, 0x788c, 0x6042, 0x910e, 0xd1e4,
+	0x190c, 0x0ecf, 0x6040, 0xd0cc, 0x0120, 0x78b0, 0x2011, 0x0114,
+	0x2012, 0x012e, 0x0804, 0x3383, 0x00f6, 0x2079, 0x1800, 0x7a38,
+	0xa898, 0x9084, 0xfebf, 0x9215, 0xa89c, 0x9084, 0xfebf, 0x8002,
+	0x9214, 0x7838, 0x9084, 0x0140, 0x9215, 0x7a3a, 0xa897, 0x4000,
+	0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x00fe, 0x0005, 0x7898,
+	0x9005, 0x01a8, 0x7888, 0x9025, 0x0904, 0x33b8, 0x788c, 0x902d,
+	0x0904, 0x33b8, 0x900e, 0x080c, 0x6269, 0x1120, 0xba44, 0xbb38,
+	0xbc46, 0xbd3a, 0x9186, 0x07ff, 0x0190, 0x8108, 0x0ca0, 0x080c,
+	0x48a4, 0x0904, 0x33b8, 0x7888, 0x900d, 0x0904, 0x33b8, 0x788c,
+	0x9005, 0x0904, 0x33b8, 0xba44, 0xb946, 0xbb38, 0xb83a, 0x0804,
+	0x3383, 0x2011, 0xbc09, 0x0010, 0x2011, 0xbc05, 0x080c, 0x539a,
+	0x1904, 0x33b5, 0x00c6, 0x2061, 0x0100, 0x7984, 0x9186, 0x00ff,
+	0x1130, 0x2001, 0x1817, 0x2004, 0x9085, 0xff00, 0x0088, 0x9182,
+	0x007f, 0x16e0, 0x9188, 0x3184, 0x210d, 0x918c, 0x00ff, 0x2001,
+	0x1817, 0x2004, 0x0026, 0x9116, 0x002e, 0x0580, 0x810f, 0x9105,
+	0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0x9b76, 0x000e, 0x0510,
+	0x602e, 0x620a, 0x7984, 0x00b6, 0x080c, 0x620f, 0x2b08, 0x00be,
+	0x1500, 0x6112, 0x6023, 0x0001, 0x080c, 0x4871, 0x01d0, 0x9006,
+	0xa866, 0x7007, 0x0003, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x701f,
+	0x385c, 0x2900, 0x6016, 0x2009, 0x0032, 0x080c, 0x9c6a, 0x012e,
+	0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x33b5, 0x00ce, 0x0804,
+	0x33b8, 0x080c, 0x9bcc, 0x0cb0, 0xa830, 0x9086, 0x0100, 0x0904,
+	0x33b5, 0x0804, 0x3383, 0x2061, 0x1a3f, 0x0126, 0x2091, 0x8000,
+	0x6000, 0xd084, 0x0170, 0x6104, 0x6208, 0x2061, 0x1800, 0x6350,
+	0x6070, 0x789a, 0x60bc, 0x789e, 0x60b8, 0x78aa, 0x012e, 0x0804,
+	0x3383, 0x900e, 0x2110, 0x0c88, 0x81ff, 0x1904, 0x33b5, 0x080c,
+	0x70ac, 0x0904, 0x33b5, 0x0126, 0x2091, 0x8000, 0x6250, 0x6070,
+	0x9202, 0x0248, 0x9085, 0x0001, 0x080c, 0x248d, 0x080c, 0x55b4,
+	0x012e, 0x0804, 0x3383, 0x012e, 0x0804, 0x33b8, 0x0006, 0x0016,
+	0x00c6, 0x00e6, 0x2001, 0x197a, 0x2070, 0x2061, 0x1853, 0x6008,
+	0x2072, 0x900e, 0x2011, 0x1400, 0x080c, 0x83f1, 0x7206, 0x00ee,
+	0x00ce, 0x001e, 0x000e, 0x0005, 0x0126, 0x2091, 0x8000, 0x81ff,
+	0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x3385, 0x7884, 0xd0fc,
+	0x0148, 0x2001, 0x002a, 0x2004, 0x9082, 0x00e1, 0x0288, 0x012e,
+	0x0804, 0x33b8, 0x2001, 0x002a, 0x2004, 0x2069, 0x1853, 0x6908,
+	0x9102, 0x1230, 0x012e, 0x0804, 0x33b8, 0x012e, 0x0804, 0x33b5,
+	0x080c, 0x9b4b, 0x0dd0, 0x7884, 0xd0fc, 0x0904, 0x3927, 0x00c6,
+	0x080c, 0x4871, 0x00ce, 0x0d88, 0xa867, 0x0000, 0x7884, 0xa80a,
+	0x7898, 0xa80e, 0x789c, 0xa812, 0x2001, 0x002e, 0x2004, 0xa81a,
+	0x2001, 0x002f, 0x2004, 0xa81e, 0x2001, 0x0030, 0x2004, 0xa822,
+	0x2001, 0x0031, 0x2004, 0xa826, 0x2001, 0x0034, 0x2004, 0xa82a,
+	0x2001, 0x0035, 0x2004, 0xa82e, 0x2001, 0x002a, 0x2004, 0x9080,
+	0x0003, 0x9084, 0x00fc, 0x8004, 0xa816, 0x080c, 0x3ab1, 0x0928,
+	0x7014, 0x2048, 0xad2c, 0xac28, 0xab1c, 0xaa18, 0xa930, 0xa808,
+	0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, 0x0000, 0x8906, 0x8006,
+	0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x080c,
+	0x48ba, 0x701f, 0x39ee, 0x7023, 0x0001, 0x012e, 0x0005, 0x080c,
+	0x98ad, 0x0046, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6,
+	0x00e6, 0x00f6, 0x080c, 0x3896, 0x2001, 0x1970, 0x2003, 0x0000,
+	0x2021, 0x000a, 0x2061, 0x0100, 0x6104, 0x0016, 0x60bb, 0x0000,
+	0x60bf, 0x32e1, 0x60bf, 0x0012, 0x080c, 0x3b20, 0x080c, 0x3adf,
+	0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x19b8, 0x2079, 0x0090,
+	0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0140, 0x2001, 0x0035,
+	0x2004, 0x780e, 0x2001, 0x0034, 0x2004, 0x780a, 0x00de, 0x2011,
+	0x0001, 0x080c, 0x3e91, 0x008e, 0x00ee, 0x00fe, 0x080c, 0x3dbe,
+	0x080c, 0x3ceb, 0x05b8, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140,
+	0x1db8, 0x080c, 0x3f05, 0x00f6, 0x2079, 0x0300, 0x78bc, 0x00fe,
+	0x908c, 0x0070, 0x1560, 0x2071, 0x0200, 0x7037, 0x0000, 0x7050,
+	0x9084, 0xff00, 0x9086, 0x3200, 0x1510, 0x7037, 0x0001, 0x7050,
+	0x9084, 0xff00, 0x9086, 0xe100, 0x11d0, 0x7037, 0x0000, 0x7054,
+	0x7037, 0x0000, 0x715c, 0x9106, 0x1190, 0x2001, 0x181f, 0x2004,
+	0x9106, 0x1168, 0x00c6, 0x2061, 0x0100, 0x6024, 0x9084, 0x1e00,
+	0x00ce, 0x0138, 0x080c, 0x3cf5, 0x080c, 0x3ada, 0x0058, 0x080c,
+	0x3ada, 0x080c, 0x3e29, 0x080c, 0x3db4, 0x2001, 0x020b, 0x2004,
+	0xd0e4, 0x0dd8, 0x2001, 0x032a, 0x2003, 0x0004, 0x2061, 0x0100,
+	0x6027, 0x0002, 0x001e, 0x6106, 0x2011, 0x020d, 0x2013, 0x0020,
+	0x60bb, 0x0000, 0x60bf, 0x0108, 0x60bf, 0x0012, 0x2001, 0x0004,
+	0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, 0x12d6, 0x2009, 0x0028,
+	0x080c, 0x2052, 0x2001, 0x0227, 0x200c, 0x2102, 0x080c, 0x98c9,
 	0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e,
-	0x1118, 0x012e, 0x0804, 0x3341, 0x012e, 0x2021, 0x400c, 0x0804,
-	0x3343, 0x9085, 0x0001, 0x1d04, 0x3cb2, 0x2091, 0x6000, 0x8420,
-	0x9486, 0x0064, 0x0005, 0x2001, 0x0105, 0x2003, 0x0010, 0x2001,
-	0x032a, 0x2003, 0x0004, 0x2001, 0x1a3a, 0x2003, 0x0000, 0x0071,
-	0x2009, 0x0048, 0x080c, 0x201d, 0x2001, 0x0227, 0x2024, 0x2402,
-	0x2001, 0x0109, 0x2003, 0x4000, 0x9026, 0x0005, 0x00f6, 0x00e6,
-	0x2071, 0x19b6, 0x7054, 0x9086, 0x0000, 0x0520, 0x2079, 0x0090,
-	0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, 0x1120,
-	0x2009, 0x0040, 0x080c, 0x201d, 0x782c, 0xd0fc, 0x0d88, 0x080c,
-	0x3ec3, 0x7054, 0x9086, 0x0000, 0x1d58, 0x782b, 0x0004, 0x782c,
-	0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x201d, 0x782b, 0x0002,
-	0x7057, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100,
-	0x2001, 0x1817, 0x200c, 0x7932, 0x7936, 0x080c, 0x2438, 0x080c,
-	0x284e, 0x080c, 0x2892, 0x784b, 0xf7f7, 0x7843, 0x0090, 0x7843,
-	0x0010, 0x7850, 0xc0e5, 0x7852, 0x2019, 0x61a8, 0x7820, 0xd09c,
-	0x0110, 0x8319, 0x1dd8, 0x7850, 0xc0e4, 0x7852, 0x2011, 0x0048,
-	0x080c, 0x282b, 0x7843, 0x0040, 0x2019, 0x01f4, 0xa001, 0xa001,
-	0x8319, 0x1de0, 0x2001, 0x0100, 0x080c, 0x27f1, 0x2011, 0x0020,
-	0x080c, 0x282b, 0x7843, 0x0000, 0x9006, 0x080c, 0x27f1, 0x2011,
-	0x0048, 0x080c, 0x282b, 0x00fe, 0x0005, 0x7884, 0xd0ac, 0x11c8,
-	0x00f6, 0x00e6, 0x2071, 0x1a3a, 0x2079, 0x0320, 0x2001, 0x0201,
-	0x2004, 0x9005, 0x0160, 0x7000, 0x9086, 0x0000, 0x1140, 0x0051,
-	0xd0bc, 0x0108, 0x8738, 0x7003, 0x0003, 0x782b, 0x0019, 0x00ee,
-	0x00fe, 0x0005, 0x00f6, 0x2079, 0x0300, 0x78bc, 0x00fe, 0x908c,
-	0x0070, 0x0178, 0x2009, 0x0032, 0x260a, 0x2009, 0x0033, 0x250a,
-	0xd0b4, 0x0108, 0x8c60, 0xd0ac, 0x0108, 0x8d68, 0xd0a4, 0x0108,
-	0x8b58, 0x0005, 0x00f6, 0x2079, 0x0200, 0x781c, 0xd084, 0x0110,
-	0x7837, 0x0050, 0x00fe, 0x0005, 0x00e6, 0x2071, 0x0100, 0x2001,
-	0x1979, 0x2004, 0x70e2, 0x080c, 0x3a8e, 0x1188, 0x2001, 0x181f,
-	0x2004, 0x2009, 0x181e, 0x210c, 0x918c, 0x00ff, 0x706e, 0x716a,
-	0x7066, 0x918d, 0x3200, 0x7162, 0x7073, 0xe109, 0x0080, 0x702c,
-	0x9085, 0x0002, 0x702e, 0x2009, 0x1817, 0x210c, 0x716e, 0x7063,
-	0x0100, 0x7166, 0x719e, 0x706b, 0x0000, 0x7073, 0x0809, 0x7077,
-	0x0008, 0x7078, 0x9080, 0x0100, 0x707a, 0x7080, 0x8000, 0x7082,
-	0x7087, 0xaaaa, 0x9006, 0x708a, 0x708e, 0x707e, 0x70d6, 0x70ab,
-	0x0036, 0x70af, 0x95d5, 0x7014, 0x9084, 0x1984, 0x9085, 0x0092,
-	0x7016, 0x080c, 0x3ec3, 0x00f6, 0x2071, 0x1a3a, 0x2079, 0x0320,
-	0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120, 0x689c, 0x780e,
-	0x6898, 0x780a, 0x00de, 0x2009, 0x03e8, 0x8109, 0x1df0, 0x792c,
-	0xd1fc, 0x0110, 0x782b, 0x0004, 0x2011, 0x0011, 0x080c, 0x3e4f,
-	0x2011, 0x0001, 0x080c, 0x3e4f, 0x00fe, 0x00ee, 0x0005, 0x00f6,
-	0x00e6, 0x2071, 0x1a3a, 0x2079, 0x0320, 0x792c, 0xd1fc, 0x0904,
-	0x3e4c, 0x782b, 0x0002, 0x9026, 0xd19c, 0x1904, 0x3e48, 0x7000,
-	0x0002, 0x3e4c, 0x3dfd, 0x3e2d, 0x3e48, 0xd1bc, 0x1170, 0xd1dc,
-	0x1190, 0x8001, 0x7002, 0x2011, 0x0001, 0x080c, 0x3e4f, 0x0904,
-	0x3e4c, 0x080c, 0x3e4f, 0x0804, 0x3e4c, 0x00f6, 0x2079, 0x0300,
-	0x78bf, 0x0000, 0x00fe, 0x7810, 0x7914, 0x782b, 0x0004, 0x7812,
-	0x7916, 0x2001, 0x0201, 0x200c, 0x81ff, 0x0de8, 0x080c, 0x3d5a,
-	0x2009, 0x0001, 0x00f6, 0x2079, 0x0300, 0x78b8, 0x00fe, 0xd0ec,
-	0x0110, 0x2009, 0x0011, 0x792a, 0x00f8, 0x8001, 0x7002, 0x9184,
-	0x0880, 0x1140, 0x782c, 0xd0fc, 0x1904, 0x3df1, 0x2011, 0x0001,
-	0x00b1, 0x0090, 0xa010, 0x9092, 0x0004, 0x9086, 0x0015, 0x1120,
-	0xa000, 0xa05a, 0x2011, 0x0031, 0xa212, 0xd1dc, 0x1960, 0x0828,
-	0x782b, 0x0004, 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005, 0xa014,
-	0x9005, 0x0550, 0x8001, 0x0036, 0x0096, 0xa016, 0xa058, 0x2048,
-	0xa010, 0x2009, 0x0031, 0x911a, 0x831c, 0x831c, 0x938a, 0x0007,
-	0x1a0c, 0x0d65, 0x9398, 0x3e7d, 0x231d, 0x083f, 0x9080, 0x0004,
-	0x7a2a, 0x7100, 0x8108, 0x7102, 0x009e, 0x003e, 0x908a, 0x0035,
-	0x1140, 0x0096, 0xa058, 0x2048, 0xa804, 0xa05a, 0x2001, 0x0019,
-	0x009e, 0xa012, 0x9085, 0x0001, 0x0005, 0x3eba, 0x3eb1, 0x3ea8,
-	0x3e9f, 0x3e96, 0x3e8d, 0x3e84, 0xa964, 0x7902, 0xa968, 0x7906,
-	0xa96c, 0x7912, 0xa970, 0x7916, 0x0005, 0xa974, 0x7902, 0xa978,
-	0x7906, 0xa97c, 0x7912, 0xa980, 0x7916, 0x0005, 0xa984, 0x7902,
-	0xa988, 0x7906, 0xa98c, 0x7912, 0xa990, 0x7916, 0x0005, 0xa994,
-	0x7902, 0xa998, 0x7906, 0xa99c, 0x7912, 0xa9a0, 0x7916, 0x0005,
-	0xa9a4, 0x7902, 0xa9a8, 0x7906, 0xa9ac, 0x7912, 0xa9b0, 0x7916,
-	0x0005, 0xa9b4, 0x7902, 0xa9b8, 0x7906, 0xa9bc, 0x7912, 0xa9c0,
-	0x7916, 0x0005, 0xa9c4, 0x7902, 0xa9c8, 0x7906, 0xa9cc, 0x7912,
-	0xa9d0, 0x7916, 0x0005, 0x00f6, 0x00e6, 0x0086, 0x2071, 0x19b6,
-	0x2079, 0x0090, 0x792c, 0xd1fc, 0x01e8, 0x782b, 0x0002, 0x2940,
-	0x9026, 0x7054, 0x0002, 0x3eea, 0x3ed6, 0x3ee1, 0x8001, 0x7056,
-	0xd19c, 0x1180, 0x2011, 0x0001, 0x080c, 0x3e4f, 0x190c, 0x3e4f,
-	0x0048, 0x8001, 0x7056, 0x782c, 0xd0fc, 0x1d38, 0x2011, 0x0001,
-	0x080c, 0x3e4f, 0x008e, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x00e6,
-	0x00c6, 0x0086, 0x2061, 0x0200, 0x2001, 0x1979, 0x2004, 0x601a,
-	0x2061, 0x0100, 0x2001, 0x1978, 0x2004, 0x60ce, 0x6104, 0xc1ac,
-	0x6106, 0x2001, 0x002c, 0x2004, 0x9005, 0x0520, 0x2038, 0x2001,
-	0x002e, 0x2024, 0x2001, 0x002f, 0x201c, 0x080c, 0x479b, 0xa813,
-	0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, 0x0220, 0x2138,
-	0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, 0xa858, 0x2048,
-	0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x3f66, 0x1d68, 0x2900,
-	0xa85a, 0x00d0, 0x080c, 0x479b, 0xa813, 0x0019, 0xa817, 0x0001,
-	0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, 0xa866, 0x2001, 0x002f,
+	0x004e, 0x2001, 0x1970, 0x2004, 0x9005, 0x1118, 0x012e, 0x0804,
+	0x3383, 0x012e, 0x2021, 0x400c, 0x0804, 0x3385, 0x0016, 0x0026,
+	0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, 0x0156,
+	0x7014, 0x2048, 0x7020, 0x20a8, 0x8000, 0x7022, 0xa804, 0x9005,
+	0x0904, 0x3a4a, 0x2048, 0x1f04, 0x39fe, 0x7068, 0x2040, 0xa28c,
+	0xa390, 0xa494, 0xa598, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029,
+	0x0000, 0x2021, 0x0000, 0x0096, 0x7014, 0x2048, 0xa864, 0x009e,
+	0x9086, 0x0103, 0x0170, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f,
+	0x9084, 0xffc0, 0x9080, 0x001b, 0x080c, 0x48ba, 0x701f, 0x39ee,
+	0x00b0, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0,
+	0x9080, 0x001b, 0x21a8, 0x27e0, 0x2098, 0x27e8, 0x20a0, 0x0006,
+	0x080c, 0x0f9f, 0x000e, 0x080c, 0x48bd, 0x701f, 0x39ee, 0x015e,
+	0x00de, 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e,
+	0x001e, 0x0005, 0x7014, 0x2048, 0xa864, 0x9086, 0x0103, 0x1118,
+	0x701f, 0x3aaf, 0x0450, 0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a,
+	0x2009, 0x007f, 0x080c, 0x6209, 0x0110, 0x9006, 0x0030, 0xb813,
+	0x00ff, 0xb817, 0xfffd, 0x080c, 0xbd0f, 0x015e, 0x00de, 0x009e,
+	0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0904,
+	0x33b5, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x0086,
+	0x0096, 0x00d6, 0x0156, 0x701f, 0x3a81, 0x7007, 0x0003, 0x0804,
+	0x3a3f, 0xa830, 0x9086, 0x0100, 0x2021, 0x400c, 0x0904, 0x3385,
+	0x0076, 0xad10, 0xac0c, 0xab24, 0xaa20, 0xa930, 0xa808, 0xd0b4,
+	0x1120, 0x2029, 0x0000, 0x2021, 0x0000, 0x8906, 0x8006, 0x8007,
+	0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x21a8, 0x27e0,
+	0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c, 0x0f9f, 0x000e, 0x080c,
+	0x48bd, 0x007e, 0x701f, 0x39ee, 0x7023, 0x0001, 0x0005, 0x0804,
+	0x3383, 0x0156, 0x00c6, 0xa814, 0x908a, 0x001e, 0x0218, 0xa833,
+	0x001e, 0x0010, 0xa832, 0x0078, 0x81ff, 0x0168, 0x0016, 0x080c,
+	0x4871, 0x001e, 0x0130, 0xa800, 0x2040, 0xa008, 0xa80a, 0x2100,
+	0x0c58, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce, 0x015e, 0x0005,
+	0x0006, 0x00f6, 0x2079, 0x0000, 0x7880, 0x9086, 0x0044, 0x00fe,
+	0x000e, 0x0005, 0x2001, 0x1970, 0x2003, 0x0001, 0x0005, 0x00f6,
+	0x00e6, 0x00c6, 0x2061, 0x0200, 0x2001, 0x197b, 0x2004, 0x601a,
+	0x2061, 0x0100, 0x2001, 0x197a, 0x2004, 0x60ce, 0x6104, 0xc1ac,
+	0x6106, 0x080c, 0x4871, 0xa813, 0x0019, 0xa817, 0x0001, 0x2900,
+	0xa85a, 0x2001, 0x002e, 0x2004, 0xa866, 0x2001, 0x002f, 0x2004,
+	0xa86a, 0x2061, 0x0090, 0x2079, 0x0100, 0x2001, 0x197a, 0x2004,
+	0x6036, 0x2009, 0x0040, 0x080c, 0x2052, 0x2001, 0x002a, 0x2004,
+	0x9084, 0xfff8, 0xa86e, 0x601a, 0xa873, 0x0000, 0x601f, 0x0000,
+	0x78ca, 0x9006, 0x600a, 0x600e, 0x00ce, 0x00ee, 0x00fe, 0x0005,
+	0x00e6, 0x080c, 0x4871, 0x2940, 0xa013, 0x0019, 0xa017, 0x0001,
+	0x2800, 0xa05a, 0x2001, 0x0030, 0x2004, 0xa866, 0x2001, 0x0031,
 	0x2004, 0xa86a, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e,
-	0x2001, 0x002b, 0x2004, 0xa872, 0x2061, 0x0090, 0x2079, 0x0100,
-	0x2001, 0x1978, 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, 0x201d,
-	0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0x601a, 0x0006, 0x2001,
-	0x002b, 0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca, 0x9006, 0x600a,
-	0x600e, 0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, 0x2071,
-	0x0080, 0xaa60, 0x22e8, 0x20a0, 0x20e1, 0x0000, 0x2099, 0x0088,
-	0x702b, 0x0026, 0x7402, 0x7306, 0x9006, 0x700a, 0x700e, 0x810b,
-	0x810b, 0x21a8, 0x810b, 0x7112, 0x702b, 0x0041, 0x702c, 0xd0fc,
-	0x0de8, 0x702b, 0x0002, 0x702b, 0x0040, 0x4005, 0x7400, 0x7304,
-	0x87ff, 0x0190, 0x0086, 0x0096, 0x2940, 0x0086, 0x080c, 0x479b,
-	0x008e, 0xa058, 0x00a6, 0x2050, 0x2900, 0xb006, 0xa05a, 0x00ae,
-	0x009e, 0x008e, 0x9085, 0x0001, 0x00ee, 0x0005, 0x00e6, 0x2001,
-	0x002d, 0x2004, 0x9005, 0x0528, 0x2038, 0x2001, 0x0030, 0x2024,
-	0x2001, 0x0031, 0x201c, 0x080c, 0x479b, 0x2940, 0xa813, 0x0019,
-	0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, 0x0220, 0x2138, 0x2009,
-	0x0007, 0x0010, 0x2708, 0x903e, 0x0096, 0xa858, 0x2048, 0xa85c,
-	0x9080, 0x0019, 0x009e, 0x080c, 0x3f66, 0x1d68, 0x2900, 0xa85a,
-	0x00d8, 0x080c, 0x479b, 0x2940, 0xa013, 0x0019, 0xa017, 0x0001,
-	0x2800, 0xa05a, 0x2001, 0x0030, 0x2004, 0xa066, 0x2001, 0x0031,
-	0x2004, 0xa06a, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa06e,
-	0x2001, 0x002b, 0x2004, 0xa072, 0x2001, 0x032a, 0x2003, 0x0004,
-	0x7884, 0xd0ac, 0x1180, 0x2001, 0x0101, 0x200c, 0x918d, 0x0200,
-	0x2102, 0xa017, 0x0000, 0x2001, 0x1a3a, 0x2003, 0x0003, 0x2001,
-	0x032a, 0x2003, 0x0009, 0x2001, 0x0300, 0x2003, 0x0000, 0x2001,
-	0x020d, 0x2003, 0x0000, 0x2001, 0x0004, 0x200c, 0x918d, 0x0002,
-	0x2102, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0013,
-	0x20a1, 0x1840, 0x20e9, 0x0001, 0x9006, 0x4004, 0x2009, 0x013c,
-	0x200a, 0x012e, 0x7880, 0x9086, 0x0052, 0x0108, 0x0005, 0x0804,
-	0x3341, 0x7d98, 0x7c9c, 0x0804, 0x3438, 0x080c, 0x6f5c, 0x190c,
-	0x5ba7, 0x2069, 0x1853, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88,
-	0x7c9c, 0x7d98, 0x2039, 0x0001, 0x080c, 0x47e4, 0x701f, 0x4039,
-	0x0005, 0x080c, 0x52ac, 0x1130, 0x3b00, 0x3a08, 0xc194, 0xc095,
-	0x20d8, 0x21d0, 0x2069, 0x1853, 0x6800, 0x9005, 0x0904, 0x3376,
-	0x6804, 0xd094, 0x00c6, 0x2061, 0x0100, 0x6104, 0x0138, 0x6200,
-	0x9292, 0x0005, 0x0218, 0x918c, 0xffdf, 0x0010, 0x918d, 0x0020,
-	0x6106, 0x00ce, 0xd08c, 0x00c6, 0x2061, 0x0100, 0x6104, 0x0118,
-	0x918d, 0x0010, 0x0010, 0x918c, 0xffef, 0x6106, 0x00ce, 0xd084,
-	0x0158, 0x6a28, 0x928a, 0x007f, 0x1a04, 0x3376, 0x9288, 0x3142,
-	0x210d, 0x918c, 0x00ff, 0x6162, 0xd0dc, 0x0130, 0x6828, 0x908a,
-	0x007f, 0x1a04, 0x3376, 0x605a, 0x6888, 0x9084, 0x0030, 0x8004,
-	0x8004, 0x8004, 0x8004, 0x0006, 0x2009, 0x1980, 0x9080, 0x252b,
-	0x2005, 0x200a, 0x2008, 0x2001, 0x0018, 0x080c, 0x9737, 0x2009,
-	0x0390, 0x200b, 0x0400, 0x000e, 0x2009, 0x1981, 0x9080, 0x252f,
-	0x2005, 0x200a, 0x6808, 0x908a, 0x0100, 0x0a04, 0x3376, 0x908a,
-	0x0841, 0x1a04, 0x3376, 0x9084, 0x0007, 0x1904, 0x3376, 0x680c,
-	0x9005, 0x0904, 0x3376, 0x6810, 0x9005, 0x0904, 0x3376, 0x6848,
-	0x6940, 0x910a, 0x1a04, 0x3376, 0x8001, 0x0904, 0x3376, 0x684c,
-	0x6944, 0x910a, 0x1a04, 0x3376, 0x8001, 0x0904, 0x3376, 0x6814,
-	0x908c, 0x00ff, 0x614a, 0x8007, 0x9084, 0x00ff, 0x604e, 0x080c,
-	0x728d, 0x080c, 0x65dd, 0x080c, 0x6612, 0x6808, 0x602a, 0x080c,
-	0x1f8f, 0x2009, 0x0170, 0x200b, 0x0080, 0xa001, 0xa001, 0x200b,
-	0x0000, 0x0036, 0x6b08, 0x080c, 0x2492, 0x003e, 0x6000, 0x9086,
-	0x0000, 0x1904, 0x41a5, 0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007,
-	0x810f, 0x8217, 0x831f, 0x6016, 0x611a, 0x621e, 0x6322, 0x6c04,
-	0xd4f4, 0x0148, 0x6830, 0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f,
-	0x8217, 0x831f, 0x0010, 0x9084, 0xf0ff, 0x6006, 0x610a, 0x620e,
-	0x6312, 0x8007, 0x810f, 0x8217, 0x831f, 0x20a9, 0x0004, 0x20a1,
-	0x1982, 0x20e9, 0x0001, 0x4001, 0x20a9, 0x0004, 0x20a1, 0x199c,
-	0x20e9, 0x0001, 0x4001, 0x080c, 0x812d, 0x00c6, 0x900e, 0x20a9,
-	0x0001, 0x6b70, 0xd384, 0x01c8, 0x0020, 0x839d, 0x12b0, 0x3508,
-	0x8109, 0x080c, 0x784e, 0x6878, 0x6016, 0x6874, 0x2008, 0x9084,
-	0xff00, 0x8007, 0x600a, 0x9184, 0x00ff, 0x6006, 0x8108, 0x1118,
-	0x6003, 0x0003, 0x0010, 0x6003, 0x0001, 0x1f04, 0x411d, 0x00ce,
-	0x00c6, 0x2061, 0x196b, 0x2063, 0x0001, 0x9006, 0x080c, 0x2739,
-	0x9006, 0x080c, 0x271c, 0x0000, 0x00ce, 0x00e6, 0x2c70, 0x080c,
-	0x0e9c, 0x00ee, 0x6888, 0xd0ec, 0x0130, 0x2011, 0x0114, 0x2204,
-	0x9085, 0x0180, 0x2012, 0x6a80, 0x9284, 0x0030, 0x9086, 0x0030,
-	0x1128, 0x9294, 0xffcf, 0x9295, 0x0020, 0x6a82, 0x2001, 0x194d,
-	0x6a80, 0x9294, 0x0030, 0x928e, 0x0000, 0x0170, 0x928e, 0x0010,
-	0x0118, 0x928e, 0x0020, 0x0140, 0x2003, 0xaaaa, 0x080c, 0x2507,
-	0x2001, 0x193e, 0x2102, 0x0008, 0x2102, 0x00c6, 0x2061, 0x0100,
-	0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, 0x6f5c, 0x0128,
-	0x080c, 0x4bb0, 0x0110, 0x080c, 0x2458, 0x60d0, 0x9005, 0x01c0,
-	0x6003, 0x0001, 0x2009, 0x418d, 0x00d0, 0x080c, 0x6f5c, 0x1168,
-	0x2011, 0x6dd2, 0x080c, 0x7fbb, 0x2011, 0x6dc5, 0x080c, 0x80bc,
-	0x080c, 0x7261, 0x080c, 0x6e8d, 0x0040, 0x080c, 0x5a9d, 0x0028,
-	0x6003, 0x0004, 0x2009, 0x41a5, 0x0010, 0x0804, 0x3341, 0x2001,
-	0x0170, 0x2004, 0x9084, 0x00ff, 0x9086, 0x004c, 0x1118, 0x2091,
-	0x31bd, 0x0817, 0x2091, 0x313d, 0x0817, 0x6000, 0x9086, 0x0000,
-	0x0904, 0x3373, 0x2069, 0x1853, 0x7890, 0x6842, 0x7894, 0x6846,
-	0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039,
-	0x0001, 0x0804, 0x47e7, 0x9006, 0x080c, 0x2458, 0x81ff, 0x1904,
-	0x3373, 0x080c, 0x6f5c, 0x11b0, 0x080c, 0x725c, 0x080c, 0x5be2,
-	0x080c, 0x313d, 0x0118, 0x6130, 0xc18d, 0x6132, 0x080c, 0xbdd7,
-	0x0130, 0x080c, 0x6f7f, 0x1118, 0x080c, 0x6f30, 0x0038, 0x080c,
-	0x6e8d, 0x0020, 0x080c, 0x5ba7, 0x080c, 0x5a9d, 0x0804, 0x3341,
-	0x81ff, 0x1904, 0x3373, 0x080c, 0x6f5c, 0x1110, 0x0804, 0x3373,
-	0x6190, 0x81ff, 0x01a8, 0x704f, 0x0000, 0x2001, 0x1d80, 0x2009,
-	0x0040, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0126, 0x2091, 0x8000,
-	0x2039, 0x0001, 0x080c, 0x47e7, 0x701f, 0x333f, 0x012e, 0x0005,
-	0x704f, 0x0001, 0x00d6, 0x2069, 0x1d80, 0x20a9, 0x0040, 0x20e9,
-	0x0001, 0x20a1, 0x1d80, 0x2019, 0xffff, 0x4304, 0x6558, 0x9588,
-	0x3142, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e, 0x2011, 0x0002,
-	0x2100, 0x9506, 0x01a8, 0x080c, 0x6166, 0x1190, 0xb814, 0x821c,
-	0x0238, 0x9398, 0x1d80, 0x9085, 0xff00, 0x8007, 0x201a, 0x0038,
-	0x9398, 0x1d80, 0x2324, 0x94a4, 0xff00, 0x9405, 0x201a, 0x8210,
-	0x8108, 0x9182, 0x0080, 0x1208, 0x0c18, 0x8201, 0x8007, 0x2d0c,
-	0x9105, 0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1, 0x1d80, 0x2099,
-	0x1d80, 0x080c, 0x5b32, 0x0804, 0x41fd, 0x080c, 0x47ce, 0x0904,
-	0x3376, 0x080c, 0x479b, 0x1120, 0x2009, 0x0002, 0x0804, 0x3373,
-	0x080c, 0x529d, 0xd0b4, 0x0558, 0x7884, 0x908e, 0x007e, 0x0538,
-	0x908e, 0x007f, 0x0520, 0x908e, 0x0080, 0x0508, 0x080c, 0x3138,
-	0x1148, 0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084, 0x00ff, 0x9086,
-	0x0006, 0x11a8, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c,
-	0xb88d, 0x1120, 0x2009, 0x0003, 0x0804, 0x3373, 0x7007, 0x0003,
-	0x701f, 0x428b, 0x0005, 0x080c, 0x47ce, 0x0904, 0x3376, 0x20a9,
-	0x002b, 0xb8b4, 0x20e0, 0xb8b8, 0x2098, 0xa860, 0x20e8, 0xa85c,
-	0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080, 0x0006,
-	0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c,
-	0x0fa0, 0x0070, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x000a, 0x20a0,
-	0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0fa0,
-	0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080,
-	0x0002, 0x2009, 0x002b, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804,
-	0x47e7, 0x81ff, 0x1904, 0x3373, 0x080c, 0x47b2, 0x0904, 0x3376,
-	0x080c, 0x63a7, 0x0904, 0x3373, 0x0058, 0xa878, 0x9005, 0x0120,
-	0x2009, 0x0004, 0x0804, 0x3373, 0xa974, 0xaa94, 0x0804, 0x3341,
-	0x080c, 0x52a5, 0x0904, 0x3341, 0x701f, 0x42d5, 0x7007, 0x0003,
-	0x0005, 0x81ff, 0x1904, 0x3373, 0x7888, 0x908a, 0x1000, 0x1a04,
-	0x3376, 0x080c, 0x47ce, 0x0904, 0x3376, 0x080c, 0x655d, 0x0120,
-	0x080c, 0x6565, 0x1904, 0x3376, 0x080c, 0x642c, 0x0904, 0x3373,
-	0x2019, 0x0004, 0x900e, 0x080c, 0x63b9, 0x0904, 0x3373, 0x7984,
-	0x7a88, 0x04c9, 0x08a8, 0xa89c, 0x908a, 0x1000, 0x12f8, 0x080c,
-	0x47cc, 0x01e0, 0x080c, 0x655d, 0x0118, 0x080c, 0x6565, 0x11b0,
-	0x080c, 0x642c, 0x2009, 0x0002, 0x0168, 0x2009, 0x0002, 0x2019,
-	0x0004, 0x080c, 0x63b9, 0x2009, 0x0003, 0x0120, 0xa998, 0xaa9c,
-	0x00d1, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006,
-	0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000,
-	0x080c, 0x52a5, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, 0x0001,
-	0x2001, 0x0000, 0x0005, 0x9186, 0x00ff, 0x0110, 0x0071, 0x0060,
-	0x2029, 0x007e, 0x2061, 0x1800, 0x6458, 0x2400, 0x9506, 0x0110,
-	0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c, 0x6166, 0x1138,
-	0x2200, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x7fc9, 0x0005,
-	0x81ff, 0x1904, 0x3373, 0x080c, 0x47b2, 0x0904, 0x3376, 0x080c,
-	0x622d, 0x0904, 0x3373, 0x080c, 0x63b0, 0x0904, 0x3373, 0x0804,
-	0x42e0, 0x81ff, 0x1904, 0x3373, 0x080c, 0x47b2, 0x0904, 0x3376,
-	0x080c, 0x655d, 0x0120, 0x080c, 0x6565, 0x1904, 0x3376, 0x080c,
-	0x622d, 0x0904, 0x3373, 0x080c, 0x639e, 0x0904, 0x3373, 0x0804,
-	0x42e0, 0x6100, 0x0804, 0x3341, 0x080c, 0x47ce, 0x0904, 0x3376,
-	0x080c, 0x52b1, 0x1904, 0x3373, 0x79a8, 0xd184, 0x1158, 0xb834,
-	0x8007, 0x789e, 0xb830, 0x8007, 0x789a, 0xbb2c, 0x831f, 0xba28,
-	0x8217, 0x0050, 0xb824, 0x8007, 0x789e, 0xb820, 0x8007, 0x789a,
-	0xbb1c, 0x831f, 0xba18, 0x8217, 0xb900, 0x918c, 0x0200, 0x0804,
-	0x3341, 0x78a8, 0x909c, 0x0003, 0xd0b4, 0x1140, 0x939a, 0x0003,
-	0x1a04, 0x3373, 0x6258, 0x7884, 0x9206, 0x1560, 0x2031, 0x1848,
-	0x2009, 0x013c, 0x2136, 0x2001, 0x1840, 0x2009, 0x000c, 0x7a8c,
-	0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x0006, 0x78a8, 0x9084,
-	0x0080, 0x1118, 0x000e, 0x0804, 0x47e7, 0x000e, 0x2031, 0x0000,
-	0x2061, 0x18ae, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e,
-	0xa392, 0xa496, 0xa59a, 0x080c, 0x1103, 0x7007, 0x0002, 0x701f,
-	0x440a, 0x0005, 0x81ff, 0x1904, 0x3373, 0x080c, 0x47ce, 0x0904,
-	0x3376, 0x080c, 0x655d, 0x1904, 0x3373, 0x00c6, 0x080c, 0x479b,
-	0x00ce, 0x0904, 0x3373, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a,
-	0x7ea8, 0x080c, 0xb833, 0x0904, 0x3373, 0x7007, 0x0003, 0x701f,
-	0x440e, 0x0005, 0x080c, 0x400b, 0x0804, 0x3341, 0xa830, 0x9086,
-	0x0100, 0x0904, 0x3373, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f,
-	0x9084, 0xffc0, 0x9080, 0x001b, 0x2009, 0x000c, 0x7a8c, 0x7b88,
-	0x7c9c, 0x7d98, 0x0804, 0x47e7, 0x9006, 0x080c, 0x2458, 0x78a8,
-	0x9084, 0x00ff, 0x9086, 0x00ff, 0x0118, 0x81ff, 0x1904, 0x3373,
-	0x080c, 0x6f5c, 0x0110, 0x080c, 0x5ba7, 0x7888, 0x908a, 0x1000,
-	0x1a04, 0x3376, 0x7984, 0x9186, 0x00ff, 0x0138, 0x9182, 0x007f,
-	0x1a04, 0x3376, 0x2100, 0x080c, 0x2422, 0x0026, 0x00c6, 0x0126,
-	0x2091, 0x8000, 0x2061, 0x19d2, 0x601b, 0x0000, 0x601f, 0x0000,
-	0x6073, 0x0000, 0x6077, 0x0000, 0x080c, 0x6f5c, 0x1158, 0x080c,
-	0x725c, 0x080c, 0x5be2, 0x9085, 0x0001, 0x080c, 0x6fa3, 0x080c,
-	0x6e8d, 0x00f0, 0x080c, 0x9746, 0x080c, 0x99eb, 0x080c, 0x9762,
-	0x2061, 0x0100, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x810f,
-	0x9105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x1968,
-	0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x5acd, 0x080c, 0x807a,
-	0x7984, 0x080c, 0x6f5c, 0x1110, 0x2009, 0x00ff, 0x7a88, 0x080c,
-	0x4343, 0x012e, 0x00ce, 0x002e, 0x0804, 0x3341, 0x7984, 0x080c,
-	0x6106, 0x2b08, 0x1904, 0x3376, 0x0804, 0x3341, 0x81ff, 0x0120,
-	0x2009, 0x0001, 0x0804, 0x3373, 0x60d8, 0xd0ac, 0x1130, 0xd09c,
-	0x1120, 0x2009, 0x0005, 0x0804, 0x3373, 0x080c, 0x479b, 0x1120,
-	0x2009, 0x0002, 0x0804, 0x3373, 0x7984, 0x9192, 0x0021, 0x1a04,
-	0x3376, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019,
-	0x702a, 0xaf60, 0x7736, 0x080c, 0x47e4, 0x701f, 0x44c6, 0x7880,
-	0x9086, 0x006e, 0x0110, 0x701f, 0x4d62, 0x0005, 0x2009, 0x0080,
-	0x080c, 0x6166, 0x1118, 0x080c, 0x655d, 0x0120, 0x2021, 0x400a,
-	0x0804, 0x3343, 0x00d6, 0x0096, 0xa964, 0xaa6c, 0xab70, 0xac74,
-	0xad78, 0xae7c, 0xa884, 0x90be, 0x0100, 0x0904, 0x455f, 0x90be,
-	0x0112, 0x0904, 0x455f, 0x90be, 0x0113, 0x0904, 0x455f, 0x90be,
-	0x0114, 0x0904, 0x455f, 0x90be, 0x0117, 0x0904, 0x455f, 0x90be,
-	0x011a, 0x0904, 0x455f, 0x90be, 0x011c, 0x0904, 0x455f, 0x90be,
-	0x0121, 0x0904, 0x4546, 0x90be, 0x0131, 0x0904, 0x4546, 0x90be,
-	0x0171, 0x0904, 0x455f, 0x90be, 0x0173, 0x0904, 0x455f, 0x90be,
-	0x01a1, 0x1128, 0xa894, 0x8007, 0xa896, 0x0804, 0x456a, 0x90be,
-	0x0212, 0x0904, 0x4553, 0x90be, 0x0213, 0x05e8, 0x90be, 0x0214,
-	0x0500, 0x90be, 0x0217, 0x0188, 0x90be, 0x021a, 0x1120, 0xa89c,
-	0x8007, 0xa89e, 0x04e0, 0x90be, 0x021f, 0x05c8, 0x90be, 0x0300,
-	0x05b0, 0x009e, 0x00de, 0x0804, 0x3376, 0x7028, 0x9080, 0x0010,
-	0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0007, 0x080c,
-	0x45a8, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0, 0x7034, 0x20e0,
-	0x20e8, 0x20a9, 0x0001, 0x080c, 0x45a8, 0x00c8, 0x7028, 0x9080,
-	0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001,
-	0x080c, 0x45b5, 0x00b8, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0,
-	0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x45b5, 0x7028,
-	0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9,
-	0x0001, 0x04f1, 0x00c6, 0x080c, 0x479b, 0x0550, 0xa868, 0xc0fd,
-	0xa86a, 0xa867, 0x0119, 0x9006, 0xa882, 0xa87f, 0x0020, 0xa88b,
-	0x0001, 0x810b, 0xa9ae, 0xa8b2, 0xaab6, 0xabba, 0xacbe, 0xadc2,
-	0xa9c6, 0xa8ca, 0x00ce, 0x009e, 0x00de, 0xa866, 0xa822, 0xa868,
-	0xc0fd, 0xa86a, 0xa804, 0x2048, 0x080c, 0xb84e, 0x1120, 0x2009,
-	0x0003, 0x0804, 0x3373, 0x7007, 0x0003, 0x701f, 0x459f, 0x0005,
-	0x00ce, 0x009e, 0x00de, 0x2009, 0x0002, 0x0804, 0x3373, 0xa820,
-	0x9086, 0x8001, 0x1904, 0x3341, 0x2009, 0x0004, 0x0804, 0x3373,
-	0x0016, 0x0026, 0x3510, 0x20a9, 0x0002, 0x4002, 0x4104, 0x4004,
-	0x8211, 0x1dc8, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x0036,
-	0x0046, 0x3520, 0x20a9, 0x0004, 0x4002, 0x4304, 0x4204, 0x4104,
-	0x4004, 0x8421, 0x1db8, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005,
-	0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3373, 0x60d8, 0xd0ac,
-	0x1160, 0xd09c, 0x0120, 0x2009, 0x0016, 0x0804, 0x3373, 0xd09c,
-	0x1120, 0x2009, 0x0005, 0x0804, 0x3373, 0x7984, 0x78a8, 0x2040,
-	0x080c, 0x99e4, 0x1120, 0x9182, 0x007f, 0x0a04, 0x3376, 0x9186,
-	0x00ff, 0x0904, 0x3376, 0x9182, 0x0800, 0x1a04, 0x3376, 0x7a8c,
-	0x7b88, 0x6078, 0x9306, 0x1140, 0x607c, 0x924e, 0x0904, 0x3376,
-	0x99cc, 0xff00, 0x0904, 0x3376, 0x0126, 0x2091, 0x8000, 0x0026,
-	0x2011, 0x8008, 0x080c, 0x6581, 0x002e, 0x0118, 0x2001, 0x4009,
-	0x0458, 0x080c, 0x46b5, 0x0560, 0x90c6, 0x4000, 0x1170, 0x00c6,
-	0x0006, 0x900e, 0x080c, 0x6455, 0x1108, 0xc185, 0xb800, 0xd0bc,
-	0x0108, 0xc18d, 0x000e, 0x00ce, 0x00b8, 0x90c6, 0x4007, 0x1110,
-	0x2408, 0x0090, 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0060,
-	0x90c6, 0x4009, 0x1108, 0x0040, 0x90c6, 0x4006, 0x1108, 0x0020,
-	0x2001, 0x4005, 0x2009, 0x000a, 0x2020, 0x012e, 0x0804, 0x3343,
-	0x2b00, 0x7026, 0x0016, 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c,
-	0x9ad6, 0x0904, 0x4682, 0x2b00, 0x6012, 0x080c, 0xbb52, 0x2e58,
-	0x00ee, 0x00e6, 0x00c6, 0x080c, 0x479b, 0x00ce, 0x2b70, 0x1158,
-	0x080c, 0x9a65, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x2009,
-	0x0002, 0x0804, 0x3373, 0x900e, 0xa966, 0xa96a, 0x2900, 0x6016,
-	0xa932, 0xa868, 0xc0fd, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0x080c,
-	0x2fc1, 0x6023, 0x0001, 0x9006, 0x080c, 0x60a3, 0x2001, 0x0002,
-	0x080c, 0x60b7, 0x2009, 0x0002, 0x080c, 0x9b03, 0x78a8, 0xd094,
-	0x0138, 0x00ee, 0x7024, 0x00e6, 0x2058, 0xb8c4, 0xc08d, 0xb8c6,
-	0x9085, 0x0001, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x1120,
-	0x2009, 0x0003, 0x0804, 0x3373, 0x7007, 0x0003, 0x701f, 0x4691,
-	0x0005, 0xa830, 0x2008, 0x918e, 0xdead, 0x1120, 0x2021, 0x4009,
-	0x0804, 0x3343, 0x9086, 0x0100, 0x7024, 0x2058, 0x1138, 0x2009,
-	0x0004, 0xba04, 0x9294, 0x00ff, 0x0804, 0x51fa, 0x900e, 0xa868,
-	0xd0f4, 0x1904, 0x3341, 0x080c, 0x6455, 0x1108, 0xc185, 0xb800,
-	0xd0bc, 0x0108, 0xc18d, 0x0804, 0x3341, 0x00e6, 0x00d6, 0x0096,
-	0x83ff, 0x0904, 0x46fd, 0x902e, 0x080c, 0x99e4, 0x0130, 0x9026,
-	0x20a9, 0x0800, 0x2071, 0x1000, 0x0030, 0x2021, 0x007f, 0x20a9,
-	0x0781, 0x2071, 0x107f, 0x2e04, 0x9005, 0x11b0, 0x2100, 0x9406,
-	0x15e8, 0x2428, 0x94ce, 0x007f, 0x1120, 0x92ce, 0xfffd, 0x1528,
-	0x0030, 0x94ce, 0x0080, 0x1130, 0x92ce, 0xfffc, 0x11f0, 0x93ce,
-	0x00ff, 0x11d8, 0xc5fd, 0x0450, 0x2058, 0xbf10, 0x2700, 0x9306,
-	0x11b8, 0xbe14, 0x2600, 0x9206, 0x1198, 0x2400, 0x9106, 0x1150,
-	0xd884, 0x0568, 0xd894, 0x1558, 0x080c, 0x655d, 0x1540, 0x2001,
-	0x4000, 0x0430, 0x2001, 0x4007, 0x0418, 0x2001, 0x4006, 0x0400,
-	0x2400, 0x9106, 0x1158, 0xbe14, 0x87ff, 0x1128, 0x86ff, 0x0948,
-	0x080c, 0x99e4, 0x1930, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70,
-	0x1f04, 0x46cb, 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001,
-	0x0001, 0x0030, 0x080c, 0x6106, 0x1dd0, 0xbb12, 0xba16, 0x9006,
-	0x9005, 0x009e, 0x00de, 0x00ee, 0x0005, 0x81ff, 0x0120, 0x2009,
-	0x0001, 0x0804, 0x3373, 0x080c, 0x479b, 0x1120, 0x2009, 0x0002,
-	0x0804, 0x3373, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7884,
-	0x9005, 0x0904, 0x3376, 0x9096, 0x00ff, 0x0120, 0x9092, 0x0004,
-	0x1a04, 0x3376, 0x2010, 0x2918, 0x080c, 0x2f5b, 0x1120, 0x2009,
-	0x0003, 0x0804, 0x3373, 0x7007, 0x0003, 0x701f, 0x4750, 0x0005,
-	0xa830, 0x9086, 0x0100, 0x1904, 0x3341, 0x2009, 0x0004, 0x0804,
-	0x3373, 0x7984, 0x080c, 0x99e4, 0x1120, 0x9182, 0x007f, 0x0a04,
-	0x3376, 0x9186, 0x00ff, 0x0904, 0x3376, 0x9182, 0x0800, 0x1a04,
-	0x3376, 0x2001, 0x9000, 0x080c, 0x5255, 0x1904, 0x3373, 0x0804,
-	0x3341, 0xa998, 0x080c, 0x99e4, 0x1118, 0x9182, 0x007f, 0x0280,
-	0x9186, 0x00ff, 0x0168, 0x9182, 0x0800, 0x1250, 0x2001, 0x9000,
-	0x080c, 0x5255, 0x11a8, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010,
+	0xa873, 0x0000, 0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x0300,
+	0x2003, 0x0000, 0x2001, 0x020d, 0x2003, 0x0000, 0x2001, 0x0004,
+	0x200c, 0x918d, 0x0002, 0x2102, 0x00ee, 0x0005, 0x0126, 0x2091,
+	0x8000, 0x81ff, 0x0148, 0x080c, 0x2811, 0x1130, 0x9006, 0x080c,
+	0x276e, 0x9006, 0x080c, 0x2751, 0x7884, 0x9084, 0x0007, 0x0002,
+	0x3b6b, 0x3b74, 0x3b7d, 0x3b68, 0x3b68, 0x3b68, 0x3b68, 0x3b68,
+	0x012e, 0x0804, 0x33b8, 0x2009, 0x0114, 0x2104, 0x9085, 0x0800,
+	0x200a, 0x080c, 0x3d3f, 0x00c0, 0x2009, 0x0114, 0x2104, 0x9085,
+	0x4000, 0x200a, 0x080c, 0x3d3f, 0x0078, 0x080c, 0x70ac, 0x1128,
+	0x012e, 0x2009, 0x0016, 0x0804, 0x33b5, 0x81ff, 0x0128, 0x012e,
+	0x2021, 0x400b, 0x0804, 0x3385, 0x080c, 0x98ad, 0x0086, 0x0096,
+	0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3896,
+	0x2009, 0x0101, 0x210c, 0x0016, 0x7ec8, 0x7dcc, 0x9006, 0x2068,
+	0x2060, 0x2058, 0x080c, 0x3fe0, 0x080c, 0x3f30, 0x903e, 0x2720,
+	0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x19b8, 0x2079, 0x0090,
+	0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120, 0x68d4, 0x780e,
+	0x68d0, 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, 0x3e91, 0x080c,
+	0x2819, 0x080c, 0x2819, 0x080c, 0x2819, 0x080c, 0x2819, 0x080c,
+	0x3e91, 0x008e, 0x00ee, 0x00fe, 0x080c, 0x3dbe, 0x2009, 0x9c40,
+	0x8109, 0x11b0, 0x080c, 0x3cf5, 0x2001, 0x0004, 0x200c, 0x918c,
+	0xfffd, 0x2102, 0x001e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be,
+	0x00ae, 0x009e, 0x008e, 0x2009, 0x0017, 0x080c, 0x33b5, 0x0cf8,
+	0x2001, 0x020b, 0x2004, 0x9084, 0x0140, 0x1d10, 0x00f6, 0x2079,
+	0x0000, 0x7884, 0x00fe, 0xd0bc, 0x0178, 0x2001, 0x0201, 0x200c,
+	0x81ff, 0x0150, 0x080c, 0x3d9c, 0x2d00, 0x9c05, 0x9b05, 0x0120,
+	0x080c, 0x3cf5, 0x0804, 0x3c9e, 0x080c, 0x3f05, 0x080c, 0x3e29,
+	0x080c, 0x3d7f, 0x080c, 0x3db4, 0x00f6, 0x2079, 0x0100, 0x7824,
+	0xd0ac, 0x0130, 0x8b58, 0x080c, 0x3cf5, 0x00fe, 0x0804, 0x3c9e,
+	0x00fe, 0x080c, 0x3ceb, 0x1150, 0x8d68, 0x2001, 0x0032, 0x2602,
+	0x2001, 0x0033, 0x2502, 0x080c, 0x3cf5, 0x0080, 0x87ff, 0x0138,
+	0x2001, 0x0201, 0x2004, 0x9005, 0x1908, 0x8739, 0x0038, 0x2001,
+	0x1a3c, 0x2004, 0x9086, 0x0000, 0x1904, 0x3bee, 0x2001, 0x032f,
+	0x2003, 0x00f6, 0x8631, 0x1208, 0x8529, 0x2500, 0x9605, 0x0904,
+	0x3c9e, 0x7884, 0xd0bc, 0x0128, 0x2d00, 0x9c05, 0x9b05, 0x1904,
+	0x3c9e, 0xa013, 0x0019, 0x2001, 0x032a, 0x2003, 0x0004, 0x7884,
+	0xd0ac, 0x1148, 0x2001, 0x1a3c, 0x2003, 0x0003, 0x2001, 0x032a,
+	0x2003, 0x0009, 0x0030, 0xa017, 0x0001, 0x78b4, 0x9005, 0x0108,
+	0xa016, 0x2800, 0xa05a, 0x2009, 0x0040, 0x080c, 0x2052, 0x2900,
+	0xa85a, 0xa813, 0x0019, 0x7884, 0xd0a4, 0x1180, 0xa817, 0x0000,
+	0x00c6, 0x20a9, 0x0004, 0x2061, 0x0090, 0x602b, 0x0008, 0x2001,
+	0x0203, 0x2004, 0x1f04, 0x3c75, 0x00ce, 0x0030, 0xa817, 0x0001,
+	0x78b0, 0x9005, 0x0108, 0xa816, 0x00f6, 0x00c6, 0x2079, 0x0100,
+	0x2061, 0x0090, 0x7827, 0x0002, 0x2001, 0x002a, 0x2004, 0x9084,
+	0xfff8, 0x601a, 0x0006, 0x2001, 0x002b, 0x2004, 0x601e, 0x78c6,
+	0x000e, 0x78ca, 0x00ce, 0x00fe, 0x0804, 0x3ba8, 0x001e, 0x00c6,
+	0x2001, 0x032a, 0x2003, 0x0004, 0x2061, 0x0100, 0x6027, 0x0002,
+	0x6106, 0x2011, 0x020d, 0x2013, 0x0020, 0x2001, 0x0004, 0x200c,
+	0x918c, 0xfffd, 0x2102, 0x080c, 0x12d6, 0x7884, 0x9084, 0x0003,
+	0x9086, 0x0002, 0x01b0, 0x2009, 0x0028, 0x080c, 0x2052, 0x2001,
+	0x0227, 0x200c, 0x2102, 0x6050, 0x9084, 0xb7ff, 0x080c, 0x28d4,
+	0x6052, 0x602f, 0x0000, 0x604b, 0xf7f7, 0x6043, 0x0090, 0x6043,
+	0x0010, 0x080c, 0x98c9, 0x00ce, 0x2d08, 0x2c10, 0x2b18, 0x2b00,
+	0x9c05, 0x9d05, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae,
+	0x009e, 0x008e, 0x1118, 0x012e, 0x0804, 0x3383, 0x012e, 0x2021,
+	0x400c, 0x0804, 0x3385, 0x9085, 0x0001, 0x1d04, 0x3cf4, 0x2091,
+	0x6000, 0x8420, 0x9486, 0x0064, 0x0005, 0x2001, 0x0105, 0x2003,
+	0x0010, 0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x1a3c, 0x2003,
+	0x0000, 0x0071, 0x2009, 0x0048, 0x080c, 0x2052, 0x2001, 0x0227,
+	0x2024, 0x2402, 0x2001, 0x0109, 0x2003, 0x4000, 0x9026, 0x0005,
+	0x00f6, 0x00e6, 0x2071, 0x19b8, 0x7054, 0x9086, 0x0000, 0x0520,
+	0x2079, 0x0090, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c,
+	0x9106, 0x1120, 0x2009, 0x0040, 0x080c, 0x2052, 0x782c, 0xd0fc,
+	0x0d88, 0x080c, 0x3f05, 0x7054, 0x9086, 0x0000, 0x1d58, 0x782b,
+	0x0004, 0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x2052,
+	0x782b, 0x0002, 0x7057, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x00f6,
+	0x2079, 0x0100, 0x2001, 0x1817, 0x200c, 0x7932, 0x7936, 0x080c,
+	0x246d, 0x080c, 0x2890, 0x080c, 0x28d4, 0x784b, 0xf7f7, 0x7843,
+	0x0090, 0x7843, 0x0010, 0x7850, 0xc0e5, 0x7852, 0x2019, 0x61a8,
+	0x7820, 0xd09c, 0x0110, 0x8319, 0x1dd8, 0x7850, 0xc0e4, 0x7852,
+	0x2011, 0x0048, 0x080c, 0x286d, 0x7843, 0x0040, 0x2019, 0x01f4,
+	0xa001, 0xa001, 0x8319, 0x1de0, 0x2001, 0x0100, 0x080c, 0x2833,
+	0x2011, 0x0020, 0x080c, 0x286d, 0x7843, 0x0000, 0x9006, 0x080c,
+	0x2833, 0x2011, 0x0048, 0x080c, 0x286d, 0x00fe, 0x0005, 0x7884,
+	0xd0ac, 0x11c8, 0x00f6, 0x00e6, 0x2071, 0x1a3c, 0x2079, 0x0320,
+	0x2001, 0x0201, 0x2004, 0x9005, 0x0160, 0x7000, 0x9086, 0x0000,
+	0x1140, 0x0051, 0xd0bc, 0x0108, 0x8738, 0x7003, 0x0003, 0x782b,
+	0x0019, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0300, 0x78bc,
+	0x00fe, 0x908c, 0x0070, 0x0178, 0x2009, 0x0032, 0x260a, 0x2009,
+	0x0033, 0x250a, 0xd0b4, 0x0108, 0x8c60, 0xd0ac, 0x0108, 0x8d68,
+	0xd0a4, 0x0108, 0x8b58, 0x0005, 0x00f6, 0x2079, 0x0200, 0x781c,
+	0xd084, 0x0110, 0x7837, 0x0050, 0x00fe, 0x0005, 0x00e6, 0x2071,
+	0x0100, 0x2001, 0x197b, 0x2004, 0x70e2, 0x080c, 0x3ad0, 0x1188,
+	0x2001, 0x181f, 0x2004, 0x2009, 0x181e, 0x210c, 0x918c, 0x00ff,
+	0x706e, 0x716a, 0x7066, 0x918d, 0x3200, 0x7162, 0x7073, 0xe109,
+	0x0080, 0x702c, 0x9085, 0x0002, 0x702e, 0x2009, 0x1817, 0x210c,
+	0x716e, 0x7063, 0x0100, 0x7166, 0x719e, 0x706b, 0x0000, 0x7073,
+	0x0809, 0x7077, 0x0008, 0x7078, 0x9080, 0x0100, 0x707a, 0x7080,
+	0x8000, 0x7082, 0x7087, 0xaaaa, 0x9006, 0x708a, 0x708e, 0x707e,
+	0x70d6, 0x70ab, 0x0036, 0x70af, 0x95d5, 0x7014, 0x9084, 0x1984,
+	0x9085, 0x0092, 0x7016, 0x080c, 0x3f05, 0x00f6, 0x2071, 0x1a3c,
+	0x2079, 0x0320, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120,
+	0x689c, 0x780e, 0x6898, 0x780a, 0x00de, 0x2009, 0x03e8, 0x8109,
+	0x1df0, 0x792c, 0xd1fc, 0x0110, 0x782b, 0x0004, 0x2011, 0x0011,
+	0x080c, 0x3e91, 0x2011, 0x0001, 0x080c, 0x3e91, 0x00fe, 0x00ee,
+	0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a3c, 0x2079, 0x0320, 0x792c,
+	0xd1fc, 0x0904, 0x3e8e, 0x782b, 0x0002, 0x9026, 0xd19c, 0x1904,
+	0x3e8a, 0x7000, 0x0002, 0x3e8e, 0x3e3f, 0x3e6f, 0x3e8a, 0xd1bc,
+	0x1170, 0xd1dc, 0x1190, 0x8001, 0x7002, 0x2011, 0x0001, 0x080c,
+	0x3e91, 0x0904, 0x3e8e, 0x080c, 0x3e91, 0x0804, 0x3e8e, 0x00f6,
+	0x2079, 0x0300, 0x78bf, 0x0000, 0x00fe, 0x7810, 0x7914, 0x782b,
+	0x0004, 0x7812, 0x7916, 0x2001, 0x0201, 0x200c, 0x81ff, 0x0de8,
+	0x080c, 0x3d9c, 0x2009, 0x0001, 0x00f6, 0x2079, 0x0300, 0x78b8,
+	0x00fe, 0xd0ec, 0x0110, 0x2009, 0x0011, 0x792a, 0x00f8, 0x8001,
+	0x7002, 0x9184, 0x0880, 0x1140, 0x782c, 0xd0fc, 0x1904, 0x3e33,
+	0x2011, 0x0001, 0x00b1, 0x0090, 0xa010, 0x9092, 0x0004, 0x9086,
+	0x0015, 0x1120, 0xa000, 0xa05a, 0x2011, 0x0031, 0xa212, 0xd1dc,
+	0x1960, 0x0828, 0x782b, 0x0004, 0x7003, 0x0000, 0x00ee, 0x00fe,
+	0x0005, 0xa014, 0x9005, 0x0550, 0x8001, 0x0036, 0x0096, 0xa016,
+	0xa058, 0x2048, 0xa010, 0x2009, 0x0031, 0x911a, 0x831c, 0x831c,
+	0x938a, 0x0007, 0x1a0c, 0x0d65, 0x9398, 0x3ebf, 0x231d, 0x083f,
+	0x9080, 0x0004, 0x7a2a, 0x7100, 0x8108, 0x7102, 0x009e, 0x003e,
+	0x908a, 0x0035, 0x1140, 0x0096, 0xa058, 0x2048, 0xa804, 0xa05a,
+	0x2001, 0x0019, 0x009e, 0xa012, 0x9085, 0x0001, 0x0005, 0x3efc,
+	0x3ef3, 0x3eea, 0x3ee1, 0x3ed8, 0x3ecf, 0x3ec6, 0xa964, 0x7902,
+	0xa968, 0x7906, 0xa96c, 0x7912, 0xa970, 0x7916, 0x0005, 0xa974,
+	0x7902, 0xa978, 0x7906, 0xa97c, 0x7912, 0xa980, 0x7916, 0x0005,
+	0xa984, 0x7902, 0xa988, 0x7906, 0xa98c, 0x7912, 0xa990, 0x7916,
+	0x0005, 0xa994, 0x7902, 0xa998, 0x7906, 0xa99c, 0x7912, 0xa9a0,
+	0x7916, 0x0005, 0xa9a4, 0x7902, 0xa9a8, 0x7906, 0xa9ac, 0x7912,
+	0xa9b0, 0x7916, 0x0005, 0xa9b4, 0x7902, 0xa9b8, 0x7906, 0xa9bc,
+	0x7912, 0xa9c0, 0x7916, 0x0005, 0xa9c4, 0x7902, 0xa9c8, 0x7906,
+	0xa9cc, 0x7912, 0xa9d0, 0x7916, 0x0005, 0x00f6, 0x00e6, 0x0086,
+	0x2071, 0x19b8, 0x2079, 0x0090, 0x792c, 0xd1fc, 0x01e8, 0x782b,
+	0x0002, 0x2940, 0x9026, 0x7054, 0x0002, 0x3f2c, 0x3f18, 0x3f23,
+	0x8001, 0x7056, 0xd19c, 0x1180, 0x2011, 0x0001, 0x080c, 0x3e91,
+	0x190c, 0x3e91, 0x0048, 0x8001, 0x7056, 0x782c, 0xd0fc, 0x1d38,
+	0x2011, 0x0001, 0x080c, 0x3e91, 0x008e, 0x00ee, 0x00fe, 0x0005,
+	0x00f6, 0x00e6, 0x00c6, 0x0086, 0x2061, 0x0200, 0x2001, 0x197b,
+	0x2004, 0x601a, 0x2061, 0x0100, 0x2001, 0x197a, 0x2004, 0x60ce,
+	0x6104, 0xc1ac, 0x6106, 0x2001, 0x002c, 0x2004, 0x9005, 0x0520,
+	0x2038, 0x2001, 0x002e, 0x2024, 0x2001, 0x002f, 0x201c, 0x080c,
+	0x4871, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007,
+	0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096,
+	0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x3fa8,
+	0x1d68, 0x2900, 0xa85a, 0x00d0, 0x080c, 0x4871, 0xa813, 0x0019,
+	0xa817, 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, 0xa866,
+	0x2001, 0x002f, 0x2004, 0xa86a, 0x2001, 0x002a, 0x2004, 0x9084,
+	0xfff8, 0xa86e, 0x2001, 0x002b, 0x2004, 0xa872, 0x2061, 0x0090,
+	0x2079, 0x0100, 0x2001, 0x197a, 0x2004, 0x6036, 0x2009, 0x0040,
+	0x080c, 0x2052, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0x601a,
+	0x0006, 0x2001, 0x002b, 0x2004, 0x601e, 0x78c6, 0x000e, 0x78ca,
+	0x9006, 0x600a, 0x600e, 0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005,
+	0x00e6, 0x2071, 0x0080, 0xaa60, 0x22e8, 0x20a0, 0x20e1, 0x0000,
+	0x2099, 0x0088, 0x702b, 0x0026, 0x7402, 0x7306, 0x9006, 0x700a,
+	0x700e, 0x810b, 0x810b, 0x21a8, 0x810b, 0x7112, 0x702b, 0x0041,
+	0x702c, 0xd0fc, 0x0de8, 0x702b, 0x0002, 0x702b, 0x0040, 0x4005,
+	0x7400, 0x7304, 0x87ff, 0x0190, 0x0086, 0x0096, 0x2940, 0x0086,
+	0x080c, 0x4871, 0x008e, 0xa058, 0x00a6, 0x2050, 0x2900, 0xb006,
+	0xa05a, 0x00ae, 0x009e, 0x008e, 0x9085, 0x0001, 0x00ee, 0x0005,
+	0x00e6, 0x2001, 0x002d, 0x2004, 0x9005, 0x0528, 0x2038, 0x2001,
+	0x0030, 0x2024, 0x2001, 0x0031, 0x201c, 0x080c, 0x4871, 0x2940,
+	0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, 0x0220,
+	0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, 0xa858,
+	0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x3fa8, 0x1d68,
+	0x2900, 0xa85a, 0x00d8, 0x080c, 0x4871, 0x2940, 0xa013, 0x0019,
+	0xa017, 0x0001, 0x2800, 0xa05a, 0x2001, 0x0030, 0x2004, 0xa066,
+	0x2001, 0x0031, 0x2004, 0xa06a, 0x2001, 0x002a, 0x2004, 0x9084,
+	0xfff8, 0xa06e, 0x2001, 0x002b, 0x2004, 0xa072, 0x2001, 0x032a,
+	0x2003, 0x0004, 0x7884, 0xd0ac, 0x1180, 0x2001, 0x0101, 0x200c,
+	0x918d, 0x0200, 0x2102, 0xa017, 0x0000, 0x2001, 0x1a3c, 0x2003,
+	0x0003, 0x2001, 0x032a, 0x2003, 0x0009, 0x2001, 0x0300, 0x2003,
+	0x0000, 0x2001, 0x020d, 0x2003, 0x0000, 0x2001, 0x0004, 0x200c,
+	0x918d, 0x0002, 0x2102, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000,
+	0x20a9, 0x0013, 0x20a1, 0x1840, 0x20e9, 0x0001, 0x9006, 0x4004,
+	0x2009, 0x013c, 0x200a, 0x012e, 0x7880, 0x9086, 0x0052, 0x0108,
+	0x0005, 0x0804, 0x3383, 0x7d98, 0x7c9c, 0x0804, 0x347a, 0x080c,
+	0x70ac, 0x190c, 0x5c9a, 0x2069, 0x1853, 0x2d00, 0x2009, 0x0030,
+	0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x080c, 0x48ba,
+	0x701f, 0x407b, 0x0005, 0x080c, 0x5395, 0x1130, 0x3b00, 0x3a08,
+	0xc194, 0xc095, 0x20d8, 0x21d0, 0x2069, 0x1853, 0x6800, 0x9005,
+	0x0904, 0x33b8, 0x6804, 0xd094, 0x00c6, 0x2061, 0x0100, 0x6104,
+	0x0138, 0x6200, 0x9292, 0x0005, 0x0218, 0x918c, 0xffdf, 0x0010,
+	0x918d, 0x0020, 0x6106, 0x00ce, 0xd08c, 0x00c6, 0x2061, 0x0100,
+	0x6104, 0x0118, 0x918d, 0x0010, 0x0010, 0x918c, 0xffef, 0x6106,
+	0x00ce, 0xd084, 0x0158, 0x6a28, 0x928a, 0x007f, 0x1a04, 0x33b8,
+	0x9288, 0x3184, 0x210d, 0x918c, 0x00ff, 0x6162, 0xd0dc, 0x0130,
+	0x6828, 0x908a, 0x007f, 0x1a04, 0x33b8, 0x605a, 0x6888, 0x9084,
+	0x0030, 0x8004, 0x8004, 0x8004, 0x8004, 0x0006, 0x2009, 0x1982,
+	0x9080, 0x2560, 0x2005, 0x200a, 0x2008, 0x2001, 0x0018, 0x080c,
+	0x989e, 0x2009, 0x0390, 0x200b, 0x0400, 0x000e, 0x2009, 0x1983,
+	0x9080, 0x2564, 0x2005, 0x200a, 0x6808, 0x908a, 0x0100, 0x0a04,
+	0x33b8, 0x908a, 0x0841, 0x1a04, 0x33b8, 0x9084, 0x0007, 0x1904,
+	0x33b8, 0x680c, 0x9005, 0x0904, 0x33b8, 0x6810, 0x9005, 0x0904,
+	0x33b8, 0x6848, 0x6940, 0x910a, 0x1a04, 0x33b8, 0x8001, 0x0904,
+	0x33b8, 0x684c, 0x6944, 0x910a, 0x1a04, 0x33b8, 0x8001, 0x0904,
+	0x33b8, 0x6814, 0x908c, 0x00ff, 0x614a, 0x8007, 0x9084, 0x00ff,
+	0x604e, 0x080c, 0x73dd, 0x080c, 0x672d, 0x080c, 0x6762, 0x6808,
+	0x602a, 0x080c, 0x1fc4, 0x2009, 0x0170, 0x200b, 0x0080, 0xa001,
+	0xa001, 0x200b, 0x0000, 0x0036, 0x6b08, 0x080c, 0x24c7, 0x003e,
+	0x6000, 0x9086, 0x0000, 0x1904, 0x41e7, 0x6818, 0x691c, 0x6a20,
+	0x6b24, 0x8007, 0x810f, 0x8217, 0x831f, 0x6016, 0x611a, 0x621e,
+	0x6322, 0x6c04, 0xd4f4, 0x0148, 0x6830, 0x6934, 0x6a38, 0x6b3c,
+	0x8007, 0x810f, 0x8217, 0x831f, 0x0010, 0x9084, 0xf0ff, 0x6006,
+	0x610a, 0x620e, 0x6312, 0x8007, 0x810f, 0x8217, 0x831f, 0x20a9,
+	0x0004, 0x20a1, 0x1984, 0x20e9, 0x0001, 0x4001, 0x20a9, 0x0004,
+	0x20a1, 0x199e, 0x20e9, 0x0001, 0x4001, 0x080c, 0x82a8, 0x00c6,
+	0x900e, 0x20a9, 0x0001, 0x6b70, 0xd384, 0x01c8, 0x0020, 0x839d,
+	0x12b0, 0x3508, 0x8109, 0x080c, 0x79b3, 0x6878, 0x6016, 0x6874,
+	0x2008, 0x9084, 0xff00, 0x8007, 0x600a, 0x9184, 0x00ff, 0x6006,
+	0x8108, 0x1118, 0x6003, 0x0003, 0x0010, 0x6003, 0x0001, 0x1f04,
+	0x415f, 0x00ce, 0x00c6, 0x2061, 0x196d, 0x2063, 0x0001, 0x9006,
+	0x080c, 0x276e, 0x9006, 0x080c, 0x2751, 0x0000, 0x00ce, 0x00e6,
+	0x2c70, 0x080c, 0x0e9c, 0x00ee, 0x6888, 0xd0ec, 0x0130, 0x2011,
+	0x0114, 0x2204, 0x9085, 0x0180, 0x2012, 0x6a80, 0x9284, 0x0030,
+	0x9086, 0x0030, 0x1128, 0x9294, 0xffcf, 0x9295, 0x0020, 0x6a82,
+	0x2001, 0x194d, 0x6a80, 0x9294, 0x0030, 0x928e, 0x0000, 0x0170,
+	0x928e, 0x0010, 0x0118, 0x928e, 0x0020, 0x0140, 0x2003, 0xaaaa,
+	0x080c, 0x253c, 0x2001, 0x193e, 0x2102, 0x0008, 0x2102, 0x00c6,
+	0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c,
+	0x70ac, 0x0128, 0x080c, 0x4c8a, 0x0110, 0x080c, 0x248d, 0x60d0,
+	0x9005, 0x01c0, 0x6003, 0x0001, 0x2009, 0x41cf, 0x00d0, 0x080c,
+	0x70ac, 0x1168, 0x2011, 0x6f22, 0x080c, 0x8131, 0x2011, 0x6f15,
+	0x080c, 0x8237, 0x080c, 0x73b1, 0x080c, 0x6fdd, 0x0040, 0x080c,
+	0x5b90, 0x0028, 0x6003, 0x0004, 0x2009, 0x41e7, 0x0010, 0x0804,
+	0x3383, 0x2001, 0x0170, 0x2004, 0x9084, 0x00ff, 0x9086, 0x004c,
+	0x1118, 0x2091, 0x31bd, 0x0817, 0x2091, 0x313d, 0x0817, 0x6000,
+	0x9086, 0x0000, 0x0904, 0x33b5, 0x2069, 0x1853, 0x7890, 0x6842,
+	0x7894, 0x6846, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c,
+	0x7d98, 0x2039, 0x0001, 0x0804, 0x48bd, 0x9006, 0x080c, 0x248d,
+	0x81ff, 0x1904, 0x33b5, 0x080c, 0x70ac, 0x11b0, 0x080c, 0x73ac,
+	0x080c, 0x5cd5, 0x080c, 0x317f, 0x0118, 0x6130, 0xc18d, 0x6132,
+	0x080c, 0xbf46, 0x0130, 0x080c, 0x70cf, 0x1118, 0x080c, 0x7080,
+	0x0038, 0x080c, 0x6fdd, 0x0020, 0x080c, 0x5c9a, 0x080c, 0x5b90,
+	0x0804, 0x3383, 0x81ff, 0x1904, 0x33b5, 0x080c, 0x70ac, 0x1110,
+	0x0804, 0x33b5, 0x6190, 0x81ff, 0x01a8, 0x704f, 0x0000, 0x2001,
+	0x1d80, 0x2009, 0x0040, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0126,
+	0x2091, 0x8000, 0x2039, 0x0001, 0x080c, 0x48bd, 0x701f, 0x3381,
+	0x012e, 0x0005, 0x704f, 0x0001, 0x00d6, 0x2069, 0x1d80, 0x20a9,
+	0x0040, 0x20e9, 0x0001, 0x20a1, 0x1d80, 0x2019, 0xffff, 0x4304,
+	0x6558, 0x9588, 0x3184, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e,
+	0x2011, 0x0002, 0x2100, 0x9506, 0x01a8, 0x080c, 0x6269, 0x1190,
+	0xb814, 0x821c, 0x0238, 0x9398, 0x1d80, 0x9085, 0xff00, 0x8007,
+	0x201a, 0x0038, 0x9398, 0x1d80, 0x2324, 0x94a4, 0xff00, 0x9405,
+	0x201a, 0x8210, 0x8108, 0x9182, 0x0080, 0x1208, 0x0c18, 0x8201,
+	0x8007, 0x2d0c, 0x9105, 0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1,
+	0x1d80, 0x2099, 0x1d80, 0x080c, 0x5c25, 0x0804, 0x423f, 0x080c,
+	0x48a4, 0x0904, 0x33b8, 0x080c, 0x4871, 0x1120, 0x2009, 0x0002,
+	0x0804, 0x33b5, 0x080c, 0x5386, 0xd0b4, 0x0558, 0x7884, 0x908e,
+	0x007e, 0x0538, 0x908e, 0x007f, 0x0520, 0x908e, 0x0080, 0x0508,
+	0x080c, 0x317a, 0x1148, 0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084,
+	0x00ff, 0x9086, 0x0006, 0x11a8, 0xa867, 0x0000, 0xa868, 0xc0fd,
+	0xa86a, 0x080c, 0xb9fb, 0x1120, 0x2009, 0x0003, 0x0804, 0x33b5,
+	0x7007, 0x0003, 0x701f, 0x42cd, 0x0005, 0x080c, 0x48a4, 0x0904,
+	0x33b8, 0x20a9, 0x002b, 0xb8b4, 0x20e0, 0xb8b8, 0x2098, 0xa860,
+	0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008,
+	0x9080, 0x0006, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006,
+	0x2098, 0x080c, 0x0f9f, 0x0070, 0x20a9, 0x0004, 0xa85c, 0x9080,
+	0x000a, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098,
+	0x080c, 0x0f9f, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084,
+	0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0x7a8c, 0x7b88, 0x7c9c,
+	0x7d98, 0x0804, 0x48bd, 0x81ff, 0x1904, 0x33b5, 0x080c, 0x4888,
+	0x0904, 0x33b8, 0x080c, 0x64aa, 0x0904, 0x33b5, 0x0058, 0xa878,
+	0x9005, 0x0120, 0x2009, 0x0004, 0x0804, 0x33b5, 0xa974, 0xaa94,
+	0x0804, 0x3383, 0x080c, 0x538e, 0x0904, 0x3383, 0x701f, 0x4317,
+	0x7007, 0x0003, 0x0005, 0x81ff, 0x1904, 0x33b5, 0x7888, 0x908a,
+	0x1000, 0x1a04, 0x33b8, 0x080c, 0x48a4, 0x0904, 0x33b8, 0x080c,
+	0x6660, 0x0120, 0x080c, 0x6668, 0x1904, 0x33b8, 0x080c, 0x652f,
+	0x0904, 0x33b5, 0x2019, 0x0004, 0x900e, 0x080c, 0x64bc, 0x0904,
+	0x33b5, 0x7984, 0x7a88, 0x04c9, 0x08a8, 0xa89c, 0x908a, 0x1000,
+	0x12f8, 0x080c, 0x48a2, 0x01e0, 0x080c, 0x6660, 0x0118, 0x080c,
+	0x6668, 0x11b0, 0x080c, 0x652f, 0x2009, 0x0002, 0x0168, 0x2009,
+	0x0002, 0x2019, 0x0004, 0x080c, 0x64bc, 0x2009, 0x0003, 0x0120,
+	0xa998, 0xaa9c, 0x00d1, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010,
+	0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005,
+	0xa897, 0x4000, 0x080c, 0x538e, 0x0110, 0x9006, 0x0018, 0x900e,
+	0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x9186, 0x00ff, 0x0110,
+	0x0071, 0x0060, 0x2029, 0x007e, 0x2061, 0x1800, 0x6458, 0x2400,
+	0x9506, 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c,
+	0x6269, 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c,
+	0x813f, 0x0005, 0x81ff, 0x1904, 0x33b5, 0x798c, 0x2001, 0x1951,
+	0x918c, 0x8000, 0x2102, 0x080c, 0x4888, 0x0904, 0x33b8, 0x080c,
+	0x6660, 0x0120, 0x080c, 0x6668, 0x1904, 0x33b8, 0x080c, 0x6330,
+	0x0904, 0x33b5, 0x080c, 0x64b3, 0x0904, 0x33b5, 0x2001, 0x1951,
+	0x2004, 0xd0fc, 0x1904, 0x3383, 0x0804, 0x4322, 0xa9a0, 0x2001,
+	0x1951, 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, 0x4895, 0x01a0,
+	0x080c, 0x6660, 0x0118, 0x080c, 0x6668, 0x1170, 0x080c, 0x6330,
+	0x2009, 0x0002, 0x0128, 0x080c, 0x64b3, 0x1170, 0x2009, 0x0003,
+	0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085,
+	0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x2001, 0x1951,
+	0x2004, 0xd0fc, 0x1128, 0x080c, 0x538e, 0x0110, 0x9006, 0x0018,
+	0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x81ff, 0x1904,
+	0x33b5, 0x798c, 0x2001, 0x1950, 0x918c, 0x8000, 0x2102, 0x080c,
+	0x4888, 0x0904, 0x33b8, 0x080c, 0x6660, 0x0120, 0x080c, 0x6668,
+	0x1904, 0x33b8, 0x080c, 0x6330, 0x0904, 0x33b5, 0x080c, 0x64a1,
+	0x0904, 0x33b5, 0x2001, 0x1950, 0x2004, 0xd0fc, 0x1904, 0x3383,
+	0x0804, 0x4322, 0xa9a0, 0x2001, 0x1950, 0x918c, 0x8000, 0xc18d,
+	0x2102, 0x080c, 0x4895, 0x01a0, 0x080c, 0x6660, 0x0118, 0x080c,
+	0x6668, 0x1170, 0x080c, 0x6330, 0x2009, 0x0002, 0x0128, 0x080c,
+	0x64a1, 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010,
 	0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005,
-	0xa897, 0x4000, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005,
-	0x2009, 0x000a, 0x0c48, 0x080c, 0x1023, 0x0198, 0x9006, 0xa802,
-	0x7014, 0x9005, 0x1120, 0x2900, 0x7016, 0x701a, 0x0040, 0x7018,
-	0xa802, 0x0086, 0x2040, 0x2900, 0xa006, 0x701a, 0x008e, 0x9085,
-	0x0001, 0x0005, 0x7984, 0x080c, 0x6166, 0x1130, 0x7e88, 0x9684,
-	0x3fff, 0x9082, 0x4000, 0x0208, 0x905e, 0x8bff, 0x0005, 0xa998,
-	0x080c, 0x6166, 0x1130, 0xae9c, 0x9684, 0x3fff, 0x9082, 0x4000,
-	0x0208, 0x905e, 0x8bff, 0x0005, 0xae98, 0x0008, 0x7e84, 0x2608,
-	0x080c, 0x6166, 0x1108, 0x0008, 0x905e, 0x8bff, 0x0005, 0x0016,
-	0x7114, 0x81ff, 0x0128, 0x2148, 0xa904, 0x080c, 0x1055, 0x0cc8,
-	0x7116, 0x711a, 0x001e, 0x0005, 0x2031, 0x0001, 0x0010, 0x2031,
+	0xa897, 0x4000, 0x2001, 0x1950, 0x2004, 0xd0fc, 0x1128, 0x080c,
+	0x538e, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001,
+	0x0000, 0x0005, 0x6100, 0x0804, 0x3383, 0x080c, 0x48a4, 0x0904,
+	0x33b8, 0x080c, 0x539a, 0x1904, 0x33b5, 0x79a8, 0xd184, 0x1158,
+	0xb834, 0x8007, 0x789e, 0xb830, 0x8007, 0x789a, 0xbb2c, 0x831f,
+	0xba28, 0x8217, 0x0050, 0xb824, 0x8007, 0x789e, 0xb820, 0x8007,
+	0x789a, 0xbb1c, 0x831f, 0xba18, 0x8217, 0xb900, 0x918c, 0x0200,
+	0x0804, 0x3383, 0x78a8, 0x909c, 0x0003, 0xd0b4, 0x1140, 0x939a,
+	0x0003, 0x1a04, 0x33b5, 0x6258, 0x7884, 0x9206, 0x1560, 0x2031,
+	0x1848, 0x2009, 0x013c, 0x2136, 0x2001, 0x1840, 0x2009, 0x000c,
+	0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x0006, 0x78a8,
+	0x9084, 0x0080, 0x1118, 0x000e, 0x0804, 0x48bd, 0x000e, 0x2031,
 	0x0000, 0x2061, 0x18ae, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076,
-	0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x1103, 0x7007, 0x0002,
-	0x701f, 0x3341, 0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079,
-	0x0000, 0x2001, 0x18a6, 0x2004, 0x9005, 0x1190, 0x0e04, 0x4818,
-	0x7a36, 0x7833, 0x0012, 0x7a82, 0x7b86, 0x7c8a, 0x2091, 0x4080,
-	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11b5, 0x0804, 0x487e,
-	0x0016, 0x0086, 0x0096, 0x00c6, 0x00e6, 0x2071, 0x1894, 0x7044,
-	0x9005, 0x1540, 0x7148, 0x9182, 0x0010, 0x0288, 0x7038, 0x2060,
-	0x080c, 0x1023, 0x0904, 0x4876, 0xa84b, 0x0000, 0x2900, 0x7046,
-	0x2001, 0x0002, 0x9080, 0x1cca, 0x2005, 0xa846, 0x0098, 0x7038,
-	0x90e0, 0x0004, 0x2001, 0x18b0, 0x9c82, 0x18f0, 0x0210, 0x2061,
-	0x18b0, 0x2c00, 0x703a, 0x7148, 0x81ff, 0x1108, 0x703e, 0x8108,
-	0x714a, 0x0460, 0x7148, 0x8108, 0x714a, 0x7044, 0x2040, 0xa144,
+	0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x110c, 0x7007, 0x0002,
+	0x701f, 0x44db, 0x0005, 0x81ff, 0x1904, 0x33b5, 0x080c, 0x48a4,
+	0x0904, 0x33b8, 0x080c, 0x6660, 0x1904, 0x33b5, 0x00c6, 0x080c,
+	0x4871, 0x00ce, 0x0904, 0x33b5, 0xa867, 0x0000, 0xa868, 0xc0fd,
+	0xa86a, 0x7ea8, 0x080c, 0xb9a1, 0x0904, 0x33b5, 0x7007, 0x0003,
+	0x701f, 0x44df, 0x0005, 0x080c, 0x404d, 0x0804, 0x3383, 0xa830,
+	0x9086, 0x0100, 0x0904, 0x33b5, 0x8906, 0x8006, 0x8007, 0x90bc,
+	0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x2009, 0x000c, 0x7a8c,
+	0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x48bd, 0x9006, 0x080c, 0x248d,
+	0x78a8, 0x9084, 0x00ff, 0x9086, 0x00ff, 0x0118, 0x81ff, 0x1904,
+	0x33b5, 0x080c, 0x70ac, 0x0110, 0x080c, 0x5c9a, 0x7888, 0x908a,
+	0x1000, 0x1a04, 0x33b8, 0x7984, 0x9186, 0x00ff, 0x0138, 0x9182,
+	0x007f, 0x1a04, 0x33b8, 0x2100, 0x080c, 0x2457, 0x0026, 0x00c6,
+	0x0126, 0x2091, 0x8000, 0x2061, 0x19d4, 0x601b, 0x0000, 0x601f,
+	0x0000, 0x6073, 0x0000, 0x6077, 0x0000, 0x080c, 0x70ac, 0x1158,
+	0x080c, 0x73ac, 0x080c, 0x5cd5, 0x9085, 0x0001, 0x080c, 0x70f3,
+	0x080c, 0x6fdd, 0x00f0, 0x080c, 0x98ad, 0x080c, 0x9b52, 0x080c,
+	0x98c9, 0x2061, 0x0100, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff,
+	0x810f, 0x9105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009,
+	0x196a, 0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x5bc0, 0x080c,
+	0x81f5, 0x7984, 0x080c, 0x70ac, 0x1110, 0x2009, 0x00ff, 0x7a88,
+	0x080c, 0x4385, 0x012e, 0x00ce, 0x002e, 0x0804, 0x3383, 0x7984,
+	0x080c, 0x6209, 0x2b08, 0x1904, 0x33b8, 0x0804, 0x3383, 0x81ff,
+	0x0120, 0x2009, 0x0001, 0x0804, 0x33b5, 0x60d8, 0xd0ac, 0x1130,
+	0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x33b5, 0x080c, 0x4871,
+	0x1120, 0x2009, 0x0002, 0x0804, 0x33b5, 0x7984, 0x9192, 0x0021,
+	0x1a04, 0x33b8, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080,
+	0x0019, 0x702a, 0xaf60, 0x7736, 0x080c, 0x48ba, 0x701f, 0x4597,
+	0x7880, 0x9086, 0x006e, 0x0110, 0x701f, 0x4e3c, 0x0005, 0x2009,
+	0x0080, 0x080c, 0x6269, 0x1118, 0x080c, 0x6660, 0x0120, 0x2021,
+	0x400a, 0x0804, 0x3385, 0x00d6, 0x0096, 0xa964, 0xaa6c, 0xab70,
+	0xac74, 0xad78, 0xae7c, 0xa884, 0x90be, 0x0100, 0x0904, 0x4630,
+	0x90be, 0x0112, 0x0904, 0x4630, 0x90be, 0x0113, 0x0904, 0x4630,
+	0x90be, 0x0114, 0x0904, 0x4630, 0x90be, 0x0117, 0x0904, 0x4630,
+	0x90be, 0x011a, 0x0904, 0x4630, 0x90be, 0x011c, 0x0904, 0x4630,
+	0x90be, 0x0121, 0x0904, 0x4617, 0x90be, 0x0131, 0x0904, 0x4617,
+	0x90be, 0x0171, 0x0904, 0x4630, 0x90be, 0x0173, 0x0904, 0x4630,
+	0x90be, 0x01a1, 0x1128, 0xa894, 0x8007, 0xa896, 0x0804, 0x463b,
+	0x90be, 0x0212, 0x0904, 0x4624, 0x90be, 0x0213, 0x05e8, 0x90be,
+	0x0214, 0x0500, 0x90be, 0x0217, 0x0188, 0x90be, 0x021a, 0x1120,
+	0xa89c, 0x8007, 0xa89e, 0x04e0, 0x90be, 0x021f, 0x05c8, 0x90be,
+	0x0300, 0x05b0, 0x009e, 0x00de, 0x0804, 0x33b8, 0x7028, 0x9080,
+	0x0010, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0007,
+	0x080c, 0x4679, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0, 0x7034,
+	0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x4679, 0x00c8, 0x7028,
+	0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9,
+	0x0001, 0x080c, 0x4686, 0x00b8, 0x7028, 0x9080, 0x000e, 0x2098,
+	0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x4686,
+	0x7028, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8,
+	0x20a9, 0x0001, 0x04f1, 0x00c6, 0x080c, 0x4871, 0x0550, 0xa868,
+	0xc0fd, 0xa86a, 0xa867, 0x0119, 0x9006, 0xa882, 0xa87f, 0x0020,
+	0xa88b, 0x0001, 0x810b, 0xa9ae, 0xa8b2, 0xaab6, 0xabba, 0xacbe,
+	0xadc2, 0xa9c6, 0xa8ca, 0x00ce, 0x009e, 0x00de, 0xa866, 0xa822,
+	0xa868, 0xc0fd, 0xa86a, 0xa804, 0x2048, 0x080c, 0xb9bc, 0x1120,
+	0x2009, 0x0003, 0x0804, 0x33b5, 0x7007, 0x0003, 0x701f, 0x4670,
+	0x0005, 0x00ce, 0x009e, 0x00de, 0x2009, 0x0002, 0x0804, 0x33b5,
+	0xa820, 0x9086, 0x8001, 0x1904, 0x3383, 0x2009, 0x0004, 0x0804,
+	0x33b5, 0x0016, 0x0026, 0x3510, 0x20a9, 0x0002, 0x4002, 0x4104,
+	0x4004, 0x8211, 0x1dc8, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026,
+	0x0036, 0x0046, 0x3520, 0x20a9, 0x0004, 0x4002, 0x4304, 0x4204,
+	0x4104, 0x4004, 0x8421, 0x1db8, 0x004e, 0x003e, 0x002e, 0x001e,
+	0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x33b5, 0x60d8,
+	0xd0ac, 0x1160, 0xd09c, 0x0120, 0x2009, 0x0016, 0x0804, 0x33b5,
+	0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x33b5, 0x7984, 0x78a8,
+	0x2040, 0x080c, 0x9b4b, 0x1120, 0x9182, 0x007f, 0x0a04, 0x33b8,
+	0x9186, 0x00ff, 0x0904, 0x33b8, 0x9182, 0x0800, 0x1a04, 0x33b8,
+	0x7a8c, 0x7b88, 0x6078, 0x9306, 0x1140, 0x607c, 0x924e, 0x0904,
+	0x33b8, 0x99cc, 0xff00, 0x0904, 0x33b8, 0x0126, 0x2091, 0x8000,
+	0x0026, 0x2011, 0x8008, 0x080c, 0x6684, 0x002e, 0x0140, 0x918d,
+	0x8000, 0x080c, 0x66ce, 0x1118, 0x2001, 0x4009, 0x0458, 0x080c,
+	0x478b, 0x0560, 0x90c6, 0x4000, 0x1170, 0x00c6, 0x0006, 0x900e,
+	0x080c, 0x6558, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d,
+	0x000e, 0x00ce, 0x00b8, 0x90c6, 0x4007, 0x1110, 0x2408, 0x0090,
+	0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0060, 0x90c6, 0x4009,
+	0x1108, 0x0040, 0x90c6, 0x4006, 0x1108, 0x0020, 0x2001, 0x4005,
+	0x2009, 0x000a, 0x2020, 0x012e, 0x0804, 0x3385, 0x2b00, 0x7026,
+	0x0016, 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c, 0x9c3d, 0x0904,
+	0x4758, 0x2b00, 0x6012, 0x080c, 0xbcc0, 0x2e58, 0x00ee, 0x00e6,
+	0x00c6, 0x080c, 0x4871, 0x00ce, 0x2b70, 0x1158, 0x080c, 0x9bcc,
+	0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x2009, 0x0002, 0x0804,
+	0x33b5, 0x900e, 0xa966, 0xa96a, 0x2900, 0x6016, 0xa932, 0xa868,
+	0xc0fd, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0x080c, 0x3003, 0x6023,
+	0x0001, 0x9006, 0x080c, 0x61a6, 0x2001, 0x0002, 0x080c, 0x61ba,
+	0x2009, 0x0002, 0x080c, 0x9c6a, 0x78a8, 0xd094, 0x0138, 0x00ee,
+	0x7024, 0x00e6, 0x2058, 0xb8c4, 0xc08d, 0xb8c6, 0x9085, 0x0001,
+	0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x1120, 0x2009, 0x0003,
+	0x0804, 0x33b5, 0x7007, 0x0003, 0x701f, 0x4767, 0x0005, 0xa830,
+	0x2008, 0x918e, 0xdead, 0x1120, 0x2021, 0x4009, 0x0804, 0x3385,
+	0x9086, 0x0100, 0x7024, 0x2058, 0x1138, 0x2009, 0x0004, 0xba04,
+	0x9294, 0x00ff, 0x0804, 0x52e3, 0x900e, 0xa868, 0xd0f4, 0x1904,
+	0x3383, 0x080c, 0x6558, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108,
+	0xc18d, 0x0804, 0x3383, 0x00e6, 0x00d6, 0x0096, 0x83ff, 0x0904,
+	0x47d3, 0x902e, 0x080c, 0x9b4b, 0x0130, 0x9026, 0x20a9, 0x0800,
+	0x2071, 0x1000, 0x0030, 0x2021, 0x007f, 0x20a9, 0x0781, 0x2071,
+	0x107f, 0x2e04, 0x9005, 0x11b0, 0x2100, 0x9406, 0x15e8, 0x2428,
+	0x94ce, 0x007f, 0x1120, 0x92ce, 0xfffd, 0x1528, 0x0030, 0x94ce,
+	0x0080, 0x1130, 0x92ce, 0xfffc, 0x11f0, 0x93ce, 0x00ff, 0x11d8,
+	0xc5fd, 0x0450, 0x2058, 0xbf10, 0x2700, 0x9306, 0x11b8, 0xbe14,
+	0x2600, 0x9206, 0x1198, 0x2400, 0x9106, 0x1150, 0xd884, 0x0568,
+	0xd894, 0x1558, 0x080c, 0x6660, 0x1540, 0x2001, 0x4000, 0x0430,
+	0x2001, 0x4007, 0x0418, 0x2001, 0x4006, 0x0400, 0x2400, 0x9106,
+	0x1158, 0xbe14, 0x87ff, 0x1128, 0x86ff, 0x0948, 0x080c, 0x9b4b,
+	0x1930, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, 0x47a1,
+	0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, 0x0001, 0x0030,
+	0x080c, 0x6209, 0x1dd0, 0xbb12, 0xba16, 0x9006, 0x9005, 0x009e,
+	0x00de, 0x00ee, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804,
+	0x33b5, 0x080c, 0x4871, 0x1120, 0x2009, 0x0002, 0x0804, 0x33b5,
+	0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7884, 0x9005, 0x0904,
+	0x33b8, 0x9096, 0x00ff, 0x0120, 0x9092, 0x0004, 0x1a04, 0x33b8,
+	0x2010, 0x2918, 0x080c, 0x2f9d, 0x1120, 0x2009, 0x0003, 0x0804,
+	0x33b5, 0x7007, 0x0003, 0x701f, 0x4826, 0x0005, 0xa830, 0x9086,
+	0x0100, 0x1904, 0x3383, 0x2009, 0x0004, 0x0804, 0x33b5, 0x7984,
+	0x080c, 0x9b4b, 0x1120, 0x9182, 0x007f, 0x0a04, 0x33b8, 0x9186,
+	0x00ff, 0x0904, 0x33b8, 0x9182, 0x0800, 0x1a04, 0x33b8, 0x2001,
+	0x9000, 0x080c, 0x533e, 0x1904, 0x33b5, 0x0804, 0x3383, 0xa998,
+	0x080c, 0x9b4b, 0x1118, 0x9182, 0x007f, 0x0280, 0x9186, 0x00ff,
+	0x0168, 0x9182, 0x0800, 0x1250, 0x2001, 0x9000, 0x080c, 0x533e,
+	0x11a8, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006,
+	0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000,
+	0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x2009, 0x000a,
+	0x0c48, 0x080c, 0x1022, 0x0198, 0x9006, 0xa802, 0x7014, 0x9005,
+	0x1120, 0x2900, 0x7016, 0x701a, 0x0040, 0x7018, 0xa802, 0x0086,
+	0x2040, 0x2900, 0xa006, 0x701a, 0x008e, 0x9085, 0x0001, 0x0005,
+	0x7984, 0x080c, 0x6269, 0x1130, 0x7e88, 0x9684, 0x3fff, 0x9082,
+	0x4000, 0x0208, 0x905e, 0x8bff, 0x0005, 0xa998, 0x080c, 0x6269,
+	0x1130, 0xae9c, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, 0x905e,
+	0x8bff, 0x0005, 0xae98, 0x0008, 0x7e84, 0x2608, 0x080c, 0x6269,
+	0x1108, 0x0008, 0x905e, 0x8bff, 0x0005, 0x0016, 0x7114, 0x81ff,
+	0x0128, 0x2148, 0xa904, 0x080c, 0x1054, 0x0cc8, 0x7116, 0x711a,
+	0x001e, 0x0005, 0x2031, 0x0001, 0x0010, 0x2031, 0x0000, 0x2061,
+	0x18ae, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392,
+	0xa496, 0xa59a, 0x080c, 0x110c, 0x7007, 0x0002, 0x701f, 0x3383,
+	0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0000, 0x2001,
+	0x18a6, 0x2004, 0x9005, 0x1190, 0x0e04, 0x48ee, 0x7a36, 0x7833,
+	0x0012, 0x7a82, 0x7b86, 0x7c8a, 0x2091, 0x4080, 0x2001, 0x0089,
+	0x2004, 0xd084, 0x190c, 0x11be, 0x0804, 0x4954, 0x0016, 0x0086,
+	0x0096, 0x00c6, 0x00e6, 0x2071, 0x1894, 0x7044, 0x9005, 0x1540,
+	0x7148, 0x9182, 0x0010, 0x0288, 0x7038, 0x2060, 0x080c, 0x1022,
+	0x0904, 0x494c, 0xa84b, 0x0000, 0x2900, 0x7046, 0x2001, 0x0002,
+	0x9080, 0x1cf7, 0x2005, 0xa846, 0x0098, 0x7038, 0x90e0, 0x0004,
+	0x2001, 0x18b0, 0x9c82, 0x18f0, 0x0210, 0x2061, 0x18b0, 0x2c00,
+	0x703a, 0x7148, 0x81ff, 0x1108, 0x703e, 0x8108, 0x714a, 0x0460,
+	0x7148, 0x8108, 0x714a, 0x7044, 0x2040, 0xa144, 0x2105, 0x0016,
+	0x908a, 0x0036, 0x1a0c, 0x0d65, 0x2060, 0x001e, 0x8108, 0x2105,
+	0x9005, 0xa146, 0x1520, 0x080c, 0x1022, 0x1130, 0x8109, 0xa946,
+	0x7148, 0x8109, 0x714a, 0x00d8, 0x9006, 0xa806, 0xa84a, 0xa046,
+	0x2800, 0xa802, 0x2900, 0xa006, 0x7046, 0x2001, 0x0002, 0x9080,
+	0x1cf7, 0x2005, 0xa846, 0x0058, 0x2262, 0x6306, 0x640a, 0x00ee,
+	0x00ce, 0x009e, 0x008e, 0x001e, 0x012e, 0x00fe, 0x0005, 0x2c00,
+	0x9082, 0x001b, 0x0002, 0x4976, 0x4976, 0x4978, 0x4976, 0x4976,
+	0x4976, 0x497c, 0x4976, 0x4976, 0x4976, 0x4980, 0x4976, 0x4976,
+	0x4976, 0x4984, 0x4976, 0x4976, 0x4976, 0x4988, 0x4976, 0x4976,
+	0x4976, 0x498c, 0x4976, 0x4976, 0x4976, 0x4991, 0x080c, 0x0d65,
+	0xa276, 0xa37a, 0xa47e, 0x0898, 0xa286, 0xa38a, 0xa48e, 0x0878,
+	0xa296, 0xa39a, 0xa49e, 0x0858, 0xa2a6, 0xa3aa, 0xa4ae, 0x0838,
+	0xa2b6, 0xa3ba, 0xa4be, 0x0818, 0xa2c6, 0xa3ca, 0xa4ce, 0x0804,
+	0x494f, 0xa2d6, 0xa3da, 0xa4de, 0x0804, 0x494f, 0x00e6, 0x2071,
+	0x1894, 0x7048, 0x9005, 0x0904, 0x4a28, 0x0126, 0x2091, 0x8000,
+	0x0e04, 0x4a27, 0x00f6, 0x2079, 0x0000, 0x00c6, 0x0096, 0x0086,
+	0x0076, 0x9006, 0x2038, 0x7040, 0x2048, 0x9005, 0x0500, 0xa948,
 	0x2105, 0x0016, 0x908a, 0x0036, 0x1a0c, 0x0d65, 0x2060, 0x001e,
-	0x8108, 0x2105, 0x9005, 0xa146, 0x1520, 0x080c, 0x1023, 0x1130,
-	0x8109, 0xa946, 0x7148, 0x8109, 0x714a, 0x00d8, 0x9006, 0xa806,
-	0xa84a, 0xa046, 0x2800, 0xa802, 0x2900, 0xa006, 0x7046, 0x2001,
-	0x0002, 0x9080, 0x1cca, 0x2005, 0xa846, 0x0058, 0x2262, 0x6306,
-	0x640a, 0x00ee, 0x00ce, 0x009e, 0x008e, 0x001e, 0x012e, 0x00fe,
-	0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, 0x48a0, 0x48a0, 0x48a2,
-	0x48a0, 0x48a0, 0x48a0, 0x48a6, 0x48a0, 0x48a0, 0x48a0, 0x48aa,
-	0x48a0, 0x48a0, 0x48a0, 0x48ae, 0x48a0, 0x48a0, 0x48a0, 0x48b2,
-	0x48a0, 0x48a0, 0x48a0, 0x48b6, 0x48a0, 0x48a0, 0x48a0, 0x48bb,
-	0x080c, 0x0d65, 0xa276, 0xa37a, 0xa47e, 0x0898, 0xa286, 0xa38a,
-	0xa48e, 0x0878, 0xa296, 0xa39a, 0xa49e, 0x0858, 0xa2a6, 0xa3aa,
-	0xa4ae, 0x0838, 0xa2b6, 0xa3ba, 0xa4be, 0x0818, 0xa2c6, 0xa3ca,
-	0xa4ce, 0x0804, 0x4879, 0xa2d6, 0xa3da, 0xa4de, 0x0804, 0x4879,
-	0x00e6, 0x2071, 0x1894, 0x7048, 0x9005, 0x0904, 0x4952, 0x0126,
-	0x2091, 0x8000, 0x0e04, 0x4951, 0x00f6, 0x2079, 0x0000, 0x00c6,
-	0x0096, 0x0086, 0x0076, 0x9006, 0x2038, 0x7040, 0x2048, 0x9005,
-	0x0500, 0xa948, 0x2105, 0x0016, 0x908a, 0x0036, 0x1a0c, 0x0d65,
-	0x2060, 0x001e, 0x8108, 0x2105, 0x9005, 0xa94a, 0x1904, 0x4954,
-	0xa804, 0x9005, 0x090c, 0x0d65, 0x7042, 0x2938, 0x2040, 0xa003,
-	0x0000, 0x2001, 0x0002, 0x9080, 0x1cca, 0x2005, 0xa04a, 0x0804,
-	0x4954, 0x703c, 0x2060, 0x2c14, 0x6304, 0x6408, 0x650c, 0x2200,
-	0x7836, 0x7833, 0x0012, 0x7882, 0x2300, 0x7886, 0x2400, 0x788a,
-	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11b5,
-	0x87ff, 0x0118, 0x2748, 0x080c, 0x1055, 0x7048, 0x8001, 0x704a,
-	0x9005, 0x1170, 0x7040, 0x2048, 0x9005, 0x0128, 0x080c, 0x1055,
-	0x9006, 0x7042, 0x7046, 0x703b, 0x18b0, 0x703f, 0x18b0, 0x0420,
-	0x7040, 0x9005, 0x1508, 0x7238, 0x2c00, 0x9206, 0x0148, 0x9c80,
-	0x0004, 0x90fa, 0x18f0, 0x0210, 0x2001, 0x18b0, 0x703e, 0x00a0,
-	0x9006, 0x703e, 0x703a, 0x7044, 0x9005, 0x090c, 0x0d65, 0x2048,
-	0xa800, 0x9005, 0x1de0, 0x2900, 0x7042, 0x2001, 0x0002, 0x9080,
-	0x1cca, 0x2005, 0xa84a, 0x0000, 0x007e, 0x008e, 0x009e, 0x00ce,
-	0x00fe, 0x012e, 0x00ee, 0x0005, 0x2c00, 0x9082, 0x001b, 0x0002,
-	0x4973, 0x4973, 0x4975, 0x4973, 0x4973, 0x4973, 0x497a, 0x4973,
-	0x4973, 0x4973, 0x497f, 0x4973, 0x4973, 0x4973, 0x4984, 0x4973,
-	0x4973, 0x4973, 0x4989, 0x4973, 0x4973, 0x4973, 0x498e, 0x4973,
-	0x4973, 0x4973, 0x4993, 0x080c, 0x0d65, 0xaa74, 0xab78, 0xac7c,
-	0x0804, 0x48ff, 0xaa84, 0xab88, 0xac8c, 0x0804, 0x48ff, 0xaa94,
-	0xab98, 0xac9c, 0x0804, 0x48ff, 0xaaa4, 0xaba8, 0xacac, 0x0804,
-	0x48ff, 0xaab4, 0xabb8, 0xacbc, 0x0804, 0x48ff, 0xaac4, 0xabc8,
-	0xaccc, 0x0804, 0x48ff, 0xaad4, 0xabd8, 0xacdc, 0x0804, 0x48ff,
-	0x0026, 0x080c, 0x529d, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c,
-	0x47fb, 0x002e, 0x0005, 0x81ff, 0x1904, 0x3373, 0x0126, 0x2091,
-	0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x6f5c,
-	0x1158, 0x080c, 0x725c, 0x080c, 0x5be2, 0x9085, 0x0001, 0x080c,
-	0x6fa3, 0x080c, 0x6e8d, 0x0010, 0x080c, 0x5a9d, 0x012e, 0x0804,
-	0x3341, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3373, 0x080c,
-	0x52b1, 0x0120, 0x2009, 0x0007, 0x0804, 0x3373, 0x080c, 0x6555,
-	0x0120, 0x2009, 0x0008, 0x0804, 0x3373, 0x0026, 0x2011, 0x0010,
-	0x080c, 0x6581, 0x002e, 0x0120, 0x2009, 0x4009, 0x0804, 0x3373,
-	0x080c, 0x3138, 0x0128, 0x7984, 0x080c, 0x6106, 0x1904, 0x3376,
-	0x080c, 0x47ce, 0x0904, 0x3376, 0x2b00, 0x7026, 0x080c, 0x655d,
-	0x7888, 0x1170, 0x9084, 0x0005, 0x1158, 0x900e, 0x080c, 0x6455,
-	0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x3341,
-	0x080c, 0x479b, 0x0904, 0x3373, 0x9006, 0xa866, 0xa832, 0xa868,
-	0xc0fd, 0xa86a, 0x080c, 0xb8f0, 0x0904, 0x3373, 0x7888, 0xd094,
-	0x0118, 0xb8c4, 0xc08d, 0xb8c6, 0x7007, 0x0003, 0x701f, 0x4a65,
-	0x0005, 0x2061, 0x1800, 0x080c, 0x52b1, 0x2009, 0x0007, 0x1578,
-	0x080c, 0x6555, 0x0118, 0x2009, 0x0008, 0x0448, 0x080c, 0x3138,
-	0x0120, 0xa998, 0x080c, 0x6106, 0x1530, 0x080c, 0x47cc, 0x0518,
-	0x080c, 0x655d, 0xa89c, 0x1168, 0x9084, 0x0005, 0x1150, 0x900e,
-	0x080c, 0x6455, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d,
-	0x00d0, 0xa868, 0xc0fc, 0xa86a, 0x080c, 0xb8f0, 0x11e0, 0xa89c,
-	0xd094, 0x0118, 0xb8c4, 0xc08d, 0xb8c6, 0x2009, 0x0003, 0xa897,
-	0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001,
-	0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0xa99a, 0x9006, 0x918d,
-	0x0001, 0x2008, 0x0005, 0x9006, 0x0005, 0xa830, 0x2008, 0x918e,
-	0xdead, 0x1120, 0x2021, 0x4009, 0x0804, 0x3343, 0x9086, 0x0100,
-	0x7024, 0x2058, 0x1110, 0x0804, 0x51fa, 0x900e, 0x080c, 0x6455,
-	0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x3341,
-	0x080c, 0x52b1, 0x0120, 0x2009, 0x0007, 0x0804, 0x3373, 0x7f84,
-	0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x479b, 0x1120, 0x2009,
-	0x0002, 0x0804, 0x3373, 0x900e, 0x2130, 0x7126, 0x7132, 0xa860,
-	0x20e8, 0x7036, 0xa85c, 0x9080, 0x0005, 0x702a, 0x20a0, 0x080c,
-	0x6166, 0x1904, 0x4b03, 0x080c, 0x655d, 0x0120, 0x080c, 0x6565,
-	0x1904, 0x4b03, 0x080c, 0x6555, 0x1130, 0x080c, 0x6455, 0x1118,
-	0xd79c, 0x0904, 0x4b03, 0xd794, 0x1110, 0xd784, 0x01a8, 0xb8b4,
-	0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x3400, 0xd794, 0x0160,
-	0x20a9, 0x0008, 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x20a9,
-	0x0002, 0x080c, 0x45b5, 0x0048, 0x20a9, 0x0004, 0x4003, 0x2098,
-	0x20a0, 0x3d00, 0x20e0, 0x080c, 0x45b5, 0x4104, 0xd794, 0x0528,
-	0xb8b4, 0x20e0, 0xb8b8, 0x2060, 0x9c80, 0x0000, 0x2098, 0x20a9,
-	0x0002, 0x4003, 0x9c80, 0x0003, 0x2098, 0x20a9, 0x0001, 0x4005,
-	0x9c80, 0x0004, 0x2098, 0x3400, 0x20a9, 0x0002, 0x4003, 0x2098,
-	0x20a0, 0x3d00, 0x20e0, 0x080c, 0x45a8, 0x9c80, 0x0026, 0x2098,
-	0xb8b4, 0x20e0, 0x20a9, 0x0002, 0x4003, 0xd794, 0x0110, 0x96b0,
-	0x000b, 0x96b0, 0x0005, 0x8108, 0x080c, 0x99e4, 0x0118, 0x9186,
-	0x0800, 0x0040, 0xd78c, 0x0120, 0x9186, 0x0800, 0x0170, 0x0018,
-	0x9186, 0x007e, 0x0150, 0xd794, 0x0118, 0x9686, 0x0020, 0x0010,
-	0x9686, 0x0028, 0x0150, 0x0804, 0x4a9f, 0x86ff, 0x1120, 0x7124,
-	0x810b, 0x0804, 0x3341, 0x7033, 0x0001, 0x7122, 0x7024, 0x9600,
-	0x7026, 0x772e, 0x2061, 0x18ae, 0x2c44, 0xa06b, 0x0000, 0xa67a,
-	0x7034, 0xa072, 0x7028, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a,
-	0x080c, 0x1103, 0x7007, 0x0002, 0x701f, 0x4b3f, 0x0005, 0x7030,
-	0x9005, 0x1180, 0x7120, 0x7028, 0x20a0, 0x772c, 0x9036, 0x7034,
-	0x20e8, 0x2061, 0x18ae, 0x2c44, 0xa28c, 0xa390, 0xa494, 0xa598,
-	0x0804, 0x4a9f, 0x7124, 0x810b, 0x0804, 0x3341, 0x2029, 0x007e,
-	0x7984, 0x7a88, 0x7b8c, 0x7c98, 0x9184, 0xff00, 0x8007, 0x90e2,
-	0x0020, 0x0a04, 0x3376, 0x9502, 0x0a04, 0x3376, 0x9184, 0x00ff,
-	0x90e2, 0x0020, 0x0a04, 0x3376, 0x9502, 0x0a04, 0x3376, 0x9284,
-	0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3376, 0x9502, 0x0a04,
-	0x3376, 0x9284, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3376, 0x9502,
-	0x0a04, 0x3376, 0x9384, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04,
-	0x3376, 0x9502, 0x0a04, 0x3376, 0x9384, 0x00ff, 0x90e2, 0x0020,
-	0x0a04, 0x3376, 0x9502, 0x0a04, 0x3376, 0x9484, 0xff00, 0x8007,
-	0x90e2, 0x0020, 0x0a04, 0x3376, 0x9502, 0x0a04, 0x3376, 0x9484,
-	0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3376, 0x9502, 0x0a04, 0x3376,
-	0x2061, 0x1958, 0x6102, 0x6206, 0x630a, 0x640e, 0x0804, 0x3341,
-	0x0006, 0x080c, 0x529d, 0xd0cc, 0x000e, 0x0005, 0x0006, 0x080c,
-	0x52a1, 0xd0bc, 0x000e, 0x0005, 0x6170, 0x7a84, 0x6300, 0x82ff,
-	0x1118, 0x7986, 0x0804, 0x3341, 0x83ff, 0x1904, 0x3376, 0x2001,
-	0xfff0, 0x9200, 0x1a04, 0x3376, 0x2019, 0xffff, 0x6074, 0x9302,
-	0x9200, 0x0a04, 0x3376, 0x7986, 0x6272, 0x0804, 0x3341, 0x080c,
-	0x52b1, 0x1904, 0x3373, 0x7c88, 0x7d84, 0x7e98, 0x7f8c, 0x080c,
-	0x479b, 0x0904, 0x3373, 0x900e, 0x901e, 0x7326, 0x7332, 0xa860,
-	0x20e8, 0x7036, 0xa85c, 0x9080, 0x0003, 0x702a, 0x20a0, 0x91d8,
-	0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x655d, 0x0118, 0x080c,
-	0x6565, 0x1148, 0x20a9, 0x0001, 0xb814, 0x4004, 0xb810, 0x4004,
-	0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386,
-	0x003c, 0x0170, 0x0c20, 0x83ff, 0x1148, 0x7224, 0x900e, 0x2001,
-	0x0003, 0x080c, 0x8276, 0x2208, 0x0804, 0x3341, 0x7033, 0x0001,
-	0x7122, 0x7024, 0x9300, 0x7026, 0x2061, 0x18ae, 0x2c44, 0xa06b,
-	0x0000, 0xa37a, 0x7028, 0xa076, 0x7034, 0xa072, 0xa48e, 0xa592,
-	0xa696, 0xa79a, 0x080c, 0x1103, 0x7007, 0x0002, 0x701f, 0x4c31,
-	0x0005, 0x7030, 0x9005, 0x1178, 0x7120, 0x7028, 0x20a0, 0x901e,
-	0x7034, 0x20e8, 0x2061, 0x18ae, 0x2c44, 0xa48c, 0xa590, 0xa694,
-	0xa798, 0x0804, 0x4bef, 0x7224, 0x900e, 0x2001, 0x0003, 0x080c,
-	0x8276, 0x2208, 0x0804, 0x3341, 0x00f6, 0x00e6, 0x080c, 0x52b1,
-	0x2009, 0x0007, 0x1904, 0x4cc4, 0x2071, 0x1894, 0x745c, 0x84ff,
-	0x2009, 0x000e, 0x1904, 0x4cc4, 0xac9c, 0xad98, 0xaea4, 0xafa0,
-	0x0096, 0x080c, 0x103c, 0x2009, 0x0002, 0x0904, 0x4cc4, 0x2900,
-	0x705e, 0x900e, 0x901e, 0x7356, 0x7362, 0xa860, 0x7066, 0xa85c,
-	0x9080, 0x0003, 0x705a, 0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff,
-	0x0178, 0x080c, 0x655d, 0x0118, 0x080c, 0x6565, 0x1148, 0xb814,
-	0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, 0x4104, 0x9398, 0x0003,
-	0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, 0x01e8, 0x0c20,
-	0x83ff, 0x11c0, 0x7254, 0x900e, 0x2001, 0x0003, 0x080c, 0x8276,
-	0x2208, 0x009e, 0xa897, 0x4000, 0xa99a, 0x715c, 0x81ff, 0x090c,
-	0x0d65, 0x2148, 0x080c, 0x1055, 0x9006, 0x705e, 0x918d, 0x0001,
-	0x2008, 0x0418, 0x7063, 0x0001, 0x7152, 0x7054, 0x9300, 0x7056,
-	0x2061, 0x18af, 0x2c44, 0xa37a, 0x7058, 0xa076, 0x7064, 0xa072,
-	0xa48e, 0xa592, 0xa696, 0xa79a, 0xa09f, 0x4cd0, 0x000e, 0xa0a2,
-	0x080c, 0x1103, 0x9006, 0x0048, 0x009e, 0xa897, 0x4005, 0xa99a,
-	0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x00ee, 0x00fe, 0x0005,
-	0x00f6, 0xa0a0, 0x904d, 0x090c, 0x0d65, 0x00e6, 0x2071, 0x1894,
-	0xa06c, 0x908e, 0x0100, 0x0138, 0xa87b, 0x0030, 0xa883, 0x0000,
-	0xa897, 0x4002, 0x00d8, 0x7060, 0x9005, 0x1158, 0x7150, 0x7058,
-	0x20a0, 0x901e, 0x7064, 0x20e8, 0xa48c, 0xa590, 0xa694, 0xa798,
-	0x0428, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x7254,
-	0x900e, 0x2001, 0x0003, 0x080c, 0x8276, 0xaa9a, 0x715c, 0x81ff,
-	0x090c, 0x0d65, 0x2148, 0x080c, 0x1055, 0x705f, 0x0000, 0xa0a0,
-	0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x683f, 0x012e, 0xa09f,
-	0x0000, 0xa0a3, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x91d8, 0x1000,
-	0x2b5c, 0x8bff, 0x0178, 0x080c, 0x655d, 0x0118, 0x080c, 0x6565,
+	0x8108, 0x2105, 0x9005, 0xa94a, 0x1904, 0x4a2a, 0xa804, 0x9005,
+	0x090c, 0x0d65, 0x7042, 0x2938, 0x2040, 0xa003, 0x0000, 0x2001,
+	0x0002, 0x9080, 0x1cf7, 0x2005, 0xa04a, 0x0804, 0x4a2a, 0x703c,
+	0x2060, 0x2c14, 0x6304, 0x6408, 0x650c, 0x2200, 0x7836, 0x7833,
+	0x0012, 0x7882, 0x2300, 0x7886, 0x2400, 0x788a, 0x2091, 0x4080,
+	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11be, 0x87ff, 0x0118,
+	0x2748, 0x080c, 0x1054, 0x7048, 0x8001, 0x704a, 0x9005, 0x1170,
+	0x7040, 0x2048, 0x9005, 0x0128, 0x080c, 0x1054, 0x9006, 0x7042,
+	0x7046, 0x703b, 0x18b0, 0x703f, 0x18b0, 0x0420, 0x7040, 0x9005,
+	0x1508, 0x7238, 0x2c00, 0x9206, 0x0148, 0x9c80, 0x0004, 0x90fa,
+	0x18f0, 0x0210, 0x2001, 0x18b0, 0x703e, 0x00a0, 0x9006, 0x703e,
+	0x703a, 0x7044, 0x9005, 0x090c, 0x0d65, 0x2048, 0xa800, 0x9005,
+	0x1de0, 0x2900, 0x7042, 0x2001, 0x0002, 0x9080, 0x1cf7, 0x2005,
+	0xa84a, 0x0000, 0x007e, 0x008e, 0x009e, 0x00ce, 0x00fe, 0x012e,
+	0x00ee, 0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, 0x4a49, 0x4a49,
+	0x4a4b, 0x4a49, 0x4a49, 0x4a49, 0x4a50, 0x4a49, 0x4a49, 0x4a49,
+	0x4a55, 0x4a49, 0x4a49, 0x4a49, 0x4a5a, 0x4a49, 0x4a49, 0x4a49,
+	0x4a5f, 0x4a49, 0x4a49, 0x4a49, 0x4a64, 0x4a49, 0x4a49, 0x4a49,
+	0x4a69, 0x080c, 0x0d65, 0xaa74, 0xab78, 0xac7c, 0x0804, 0x49d5,
+	0xaa84, 0xab88, 0xac8c, 0x0804, 0x49d5, 0xaa94, 0xab98, 0xac9c,
+	0x0804, 0x49d5, 0xaaa4, 0xaba8, 0xacac, 0x0804, 0x49d5, 0xaab4,
+	0xabb8, 0xacbc, 0x0804, 0x49d5, 0xaac4, 0xabc8, 0xaccc, 0x0804,
+	0x49d5, 0xaad4, 0xabd8, 0xacdc, 0x0804, 0x49d5, 0x0026, 0x080c,
+	0x5386, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, 0x48d1, 0x002e,
+	0x0005, 0x81ff, 0x1904, 0x33b5, 0x0126, 0x2091, 0x8000, 0x6030,
+	0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x70ac, 0x1158, 0x080c,
+	0x73ac, 0x080c, 0x5cd5, 0x9085, 0x0001, 0x080c, 0x70f3, 0x080c,
+	0x6fdd, 0x0010, 0x080c, 0x5b90, 0x012e, 0x0804, 0x3383, 0x81ff,
+	0x0120, 0x2009, 0x0001, 0x0804, 0x33b5, 0x080c, 0x539a, 0x0120,
+	0x2009, 0x0007, 0x0804, 0x33b5, 0x080c, 0x6658, 0x0120, 0x2009,
+	0x0008, 0x0804, 0x33b5, 0x0026, 0x2011, 0x0010, 0x080c, 0x6684,
+	0x002e, 0x0140, 0x7984, 0x080c, 0x66ce, 0x1120, 0x2009, 0x4009,
+	0x0804, 0x33b5, 0x080c, 0x317a, 0x0128, 0x7984, 0x080c, 0x6209,
+	0x1904, 0x33b8, 0x080c, 0x48a4, 0x0904, 0x33b8, 0x2b00, 0x7026,
+	0x080c, 0x6660, 0x7888, 0x1170, 0x9084, 0x0005, 0x1158, 0x900e,
+	0x080c, 0x6558, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d,
+	0x0804, 0x3383, 0x080c, 0x4871, 0x0904, 0x33b5, 0x9006, 0xa866,
+	0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xba5e, 0x0904, 0x33b5,
+	0x7888, 0xd094, 0x0118, 0xb8c4, 0xc08d, 0xb8c6, 0x7007, 0x0003,
+	0x701f, 0x4b3f, 0x0005, 0x2061, 0x1800, 0x080c, 0x539a, 0x2009,
+	0x0007, 0x1578, 0x080c, 0x6658, 0x0118, 0x2009, 0x0008, 0x0448,
+	0x080c, 0x317a, 0x0120, 0xa998, 0x080c, 0x6209, 0x1530, 0x080c,
+	0x48a2, 0x0518, 0x080c, 0x6660, 0xa89c, 0x1168, 0x9084, 0x0005,
+	0x1150, 0x900e, 0x080c, 0x6558, 0x1108, 0xc185, 0xb800, 0xd0bc,
+	0x0108, 0xc18d, 0x00d0, 0xa868, 0xc0fc, 0xa86a, 0x080c, 0xba5e,
+	0x11e0, 0xa89c, 0xd094, 0x0118, 0xb8c4, 0xc08d, 0xb8c6, 0x2009,
+	0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e,
+	0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0xa99a,
+	0x9006, 0x918d, 0x0001, 0x2008, 0x0005, 0x9006, 0x0005, 0xa830,
+	0x2008, 0x918e, 0xdead, 0x1120, 0x2021, 0x4009, 0x0804, 0x3385,
+	0x9086, 0x0100, 0x7024, 0x2058, 0x1110, 0x0804, 0x52e3, 0x900e,
+	0x080c, 0x6558, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d,
+	0x0804, 0x3383, 0x080c, 0x539a, 0x0120, 0x2009, 0x0007, 0x0804,
+	0x33b5, 0x7f84, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x4871,
+	0x1120, 0x2009, 0x0002, 0x0804, 0x33b5, 0x900e, 0x2130, 0x7126,
+	0x7132, 0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0005, 0x702a,
+	0x20a0, 0x080c, 0x6269, 0x1904, 0x4bdd, 0x080c, 0x6660, 0x0120,
+	0x080c, 0x6668, 0x1904, 0x4bdd, 0x080c, 0x6658, 0x1130, 0x080c,
+	0x6558, 0x1118, 0xd79c, 0x0904, 0x4bdd, 0xd794, 0x1110, 0xd784,
+	0x01a8, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x3400,
+	0xd794, 0x0160, 0x20a9, 0x0008, 0x4003, 0x2098, 0x20a0, 0x3d00,
+	0x20e0, 0x20a9, 0x0002, 0x080c, 0x4686, 0x0048, 0x20a9, 0x0004,
+	0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x4686, 0x4104,
+	0xd794, 0x0528, 0xb8b4, 0x20e0, 0xb8b8, 0x2060, 0x9c80, 0x0000,
+	0x2098, 0x20a9, 0x0002, 0x4003, 0x9c80, 0x0003, 0x2098, 0x20a9,
+	0x0001, 0x4005, 0x9c80, 0x0004, 0x2098, 0x3400, 0x20a9, 0x0002,
+	0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x4679, 0x9c80,
+	0x0026, 0x2098, 0xb8b4, 0x20e0, 0x20a9, 0x0002, 0x4003, 0xd794,
+	0x0110, 0x96b0, 0x000b, 0x96b0, 0x0005, 0x8108, 0x080c, 0x9b4b,
+	0x0118, 0x9186, 0x0800, 0x0040, 0xd78c, 0x0120, 0x9186, 0x0800,
+	0x0170, 0x0018, 0x9186, 0x007e, 0x0150, 0xd794, 0x0118, 0x9686,
+	0x0020, 0x0010, 0x9686, 0x0028, 0x0150, 0x0804, 0x4b79, 0x86ff,
+	0x1120, 0x7124, 0x810b, 0x0804, 0x3383, 0x7033, 0x0001, 0x7122,
+	0x7024, 0x9600, 0x7026, 0x772e, 0x2061, 0x18ae, 0x2c44, 0xa06b,
+	0x0000, 0xa67a, 0x7034, 0xa072, 0x7028, 0xa076, 0xa28e, 0xa392,
+	0xa496, 0xa59a, 0x080c, 0x110c, 0x7007, 0x0002, 0x701f, 0x4c19,
+	0x0005, 0x7030, 0x9005, 0x1180, 0x7120, 0x7028, 0x20a0, 0x772c,
+	0x9036, 0x7034, 0x20e8, 0x2061, 0x18ae, 0x2c44, 0xa28c, 0xa390,
+	0xa494, 0xa598, 0x0804, 0x4b79, 0x7124, 0x810b, 0x0804, 0x3383,
+	0x2029, 0x007e, 0x7984, 0x7a88, 0x7b8c, 0x7c98, 0x9184, 0xff00,
+	0x8007, 0x90e2, 0x0020, 0x0a04, 0x33b8, 0x9502, 0x0a04, 0x33b8,
+	0x9184, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x33b8, 0x9502, 0x0a04,
+	0x33b8, 0x9284, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x33b8,
+	0x9502, 0x0a04, 0x33b8, 0x9284, 0x00ff, 0x90e2, 0x0020, 0x0a04,
+	0x33b8, 0x9502, 0x0a04, 0x33b8, 0x9384, 0xff00, 0x8007, 0x90e2,
+	0x0020, 0x0a04, 0x33b8, 0x9502, 0x0a04, 0x33b8, 0x9384, 0x00ff,
+	0x90e2, 0x0020, 0x0a04, 0x33b8, 0x9502, 0x0a04, 0x33b8, 0x9484,
+	0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x33b8, 0x9502, 0x0a04,
+	0x33b8, 0x9484, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x33b8, 0x9502,
+	0x0a04, 0x33b8, 0x2061, 0x195a, 0x6102, 0x6206, 0x630a, 0x640e,
+	0x0804, 0x3383, 0x0006, 0x080c, 0x5386, 0xd0cc, 0x000e, 0x0005,
+	0x0006, 0x080c, 0x538a, 0xd0bc, 0x000e, 0x0005, 0x6170, 0x7a84,
+	0x6300, 0x82ff, 0x1118, 0x7986, 0x0804, 0x3383, 0x83ff, 0x1904,
+	0x33b8, 0x2001, 0xfff0, 0x9200, 0x1a04, 0x33b8, 0x2019, 0xffff,
+	0x6074, 0x9302, 0x9200, 0x0a04, 0x33b8, 0x7986, 0x6272, 0x0804,
+	0x3383, 0x080c, 0x539a, 0x1904, 0x33b5, 0x7c88, 0x7d84, 0x7e98,
+	0x7f8c, 0x080c, 0x4871, 0x0904, 0x33b5, 0x900e, 0x901e, 0x7326,
+	0x7332, 0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0003, 0x702a,
+	0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6660,
+	0x0118, 0x080c, 0x6668, 0x1148, 0x20a9, 0x0001, 0xb814, 0x4004,
+	0xb810, 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800,
+	0x0120, 0x9386, 0x003c, 0x0170, 0x0c20, 0x83ff, 0x1148, 0x7224,
+	0x900e, 0x2001, 0x0003, 0x080c, 0x83f1, 0x2208, 0x0804, 0x3383,
+	0x7033, 0x0001, 0x7122, 0x7024, 0x9300, 0x7026, 0x2061, 0x18ae,
+	0x2c44, 0xa06b, 0x0000, 0xa37a, 0x7028, 0xa076, 0x7034, 0xa072,
+	0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, 0x110c, 0x7007, 0x0002,
+	0x701f, 0x4d0b, 0x0005, 0x7030, 0x9005, 0x1178, 0x7120, 0x7028,
+	0x20a0, 0x901e, 0x7034, 0x20e8, 0x2061, 0x18ae, 0x2c44, 0xa48c,
+	0xa590, 0xa694, 0xa798, 0x0804, 0x4cc9, 0x7224, 0x900e, 0x2001,
+	0x0003, 0x080c, 0x83f1, 0x2208, 0x0804, 0x3383, 0x00f6, 0x00e6,
+	0x080c, 0x539a, 0x2009, 0x0007, 0x1904, 0x4d9e, 0x2071, 0x1894,
+	0x745c, 0x84ff, 0x2009, 0x000e, 0x1904, 0x4d9e, 0xac9c, 0xad98,
+	0xaea4, 0xafa0, 0x0096, 0x080c, 0x103b, 0x2009, 0x0002, 0x0904,
+	0x4d9e, 0x2900, 0x705e, 0x900e, 0x901e, 0x7356, 0x7362, 0xa860,
+	0x7066, 0xa85c, 0x9080, 0x0003, 0x705a, 0x20a0, 0x91d8, 0x1000,
+	0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6660, 0x0118, 0x080c, 0x6668,
 	0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, 0x4104,
 	0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c,
-	0x0518, 0x0c20, 0x83ff, 0x11f0, 0x7154, 0x810c, 0xa99a, 0xa897,
-	0x4000, 0x715c, 0x81ff, 0x090c, 0x0d65, 0x2148, 0x080c, 0x1055,
-	0x9006, 0x705e, 0x918d, 0x0001, 0x2008, 0xa0a0, 0x2048, 0x0126,
-	0x2091, 0x8000, 0x080c, 0x683f, 0x012e, 0xa09f, 0x0000, 0xa0a3,
-	0x0000, 0x0070, 0x7063, 0x0001, 0x7152, 0x7054, 0x9300, 0x7056,
-	0xa37a, 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, 0x1103, 0x9006,
-	0x00ee, 0x0005, 0x0096, 0xa88c, 0x90be, 0x7000, 0x0148, 0x90be,
-	0x7100, 0x0130, 0x90be, 0x7200, 0x0118, 0x009e, 0x0804, 0x3376,
-	0xa884, 0xa988, 0x080c, 0x23ef, 0x1518, 0x080c, 0x6106, 0x1500,
-	0x7126, 0xbe12, 0xbd16, 0xae7c, 0x080c, 0x479b, 0x01c8, 0x080c,
-	0x479b, 0x01b0, 0x009e, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a,
-	0xa823, 0x0000, 0xa804, 0x2048, 0x080c, 0xb86e, 0x1120, 0x2009,
-	0x0003, 0x0804, 0x3373, 0x7007, 0x0003, 0x701f, 0x4d9d, 0x0005,
-	0x009e, 0x2009, 0x0002, 0x0804, 0x3373, 0x7124, 0x080c, 0x30d1,
-	0xa820, 0x9086, 0x8001, 0x1120, 0x2009, 0x0004, 0x0804, 0x3373,
-	0x2900, 0x7022, 0xa804, 0x0096, 0x2048, 0x8906, 0x8006, 0x8007,
-	0x90bc, 0x003f, 0x9084, 0xffc0, 0x009e, 0x9080, 0x0002, 0x0076,
-	0x0006, 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c,
-	0x0fa0, 0xaa6c, 0xab70, 0xac74, 0xad78, 0x2061, 0x18ae, 0x2c44,
-	0xa06b, 0x0000, 0xae64, 0xaf8c, 0x97c6, 0x7000, 0x0118, 0x97c6,
-	0x7100, 0x1148, 0x96c2, 0x0004, 0x0600, 0x2009, 0x0004, 0x000e,
-	0x007e, 0x0804, 0x47e7, 0x97c6, 0x7200, 0x11b8, 0x96c2, 0x0054,
-	0x02a0, 0x000e, 0x007e, 0x2061, 0x18ae, 0x2c44, 0xa076, 0xa772,
-	0xa07b, 0x002a, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x1103,
-	0x7007, 0x0002, 0x701f, 0x4df9, 0x0005, 0x000e, 0x007e, 0x0804,
-	0x3376, 0x7020, 0x2048, 0xa804, 0x2048, 0xa804, 0x2048, 0x8906,
-	0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002,
-	0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, 0x0fa0,
-	0x2100, 0x2238, 0x2061, 0x18ae, 0x2c44, 0xa28c, 0xa390, 0xa494,
-	0xa598, 0x2009, 0x002a, 0x0804, 0x47e7, 0x81ff, 0x1904, 0x3373,
-	0x798c, 0x2001, 0x194f, 0x2102, 0x080c, 0x47b2, 0x0904, 0x3376,
-	0x080c, 0x655d, 0x0120, 0x080c, 0x6565, 0x1904, 0x3376, 0x080c,
-	0x622d, 0x0904, 0x3373, 0x0126, 0x2091, 0x8000, 0x080c, 0x63c2,
-	0x012e, 0x0904, 0x3373, 0x0804, 0x42e0, 0xa9a0, 0x2001, 0x194f,
-	0xc18d, 0x2102, 0x080c, 0x47bf, 0x01a0, 0x080c, 0x655d, 0x0118,
-	0x080c, 0x6565, 0x1170, 0x080c, 0x622d, 0x2009, 0x0002, 0x0128,
-	0x080c, 0x63c2, 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a,
-	0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030,
-	0x0005, 0xa897, 0x4000, 0x080c, 0x52a5, 0x0110, 0x9006, 0x0018,
-	0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x78a8, 0xd08c,
-	0x1118, 0xd084, 0x0904, 0x4255, 0x080c, 0x47ce, 0x0904, 0x3376,
-	0x080c, 0x479b, 0x1120, 0x2009, 0x0002, 0x0804, 0x3373, 0x080c,
-	0x655d, 0x0130, 0x908e, 0x0004, 0x0118, 0x908e, 0x0005, 0x15a0,
-	0x78a8, 0xd08c, 0x0120, 0xb800, 0xc08c, 0xb802, 0x0028, 0x080c,
-	0x529d, 0xd0b4, 0x0904, 0x428f, 0x7884, 0x908e, 0x007e, 0x0904,
-	0x428f, 0x908e, 0x007f, 0x0904, 0x428f, 0x908e, 0x0080, 0x0904,
-	0x428f, 0xb800, 0xd08c, 0x1904, 0x428f, 0xa867, 0x0000, 0xa868,
-	0xc0fd, 0xa86a, 0x080c, 0xb88d, 0x1120, 0x2009, 0x0003, 0x0804,
-	0x3373, 0x7007, 0x0003, 0x701f, 0x4eb6, 0x0005, 0x080c, 0x47ce,
-	0x0904, 0x3376, 0x0804, 0x428f, 0x080c, 0x3138, 0x0108, 0x0005,
-	0x2009, 0x1833, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804,
-	0x3373, 0x080c, 0x52b1, 0x0120, 0x2009, 0x0007, 0x0804, 0x3373,
-	0x080c, 0x6555, 0x0120, 0x2009, 0x0008, 0x0804, 0x3373, 0xb89c,
-	0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x428f, 0x9006, 0xa866, 0xa832,
-	0xa868, 0xc0fd, 0xa86a, 0x080c, 0xb8f0, 0x1120, 0x2009, 0x0003,
-	0x0804, 0x3373, 0x7007, 0x0003, 0x701f, 0x4eef, 0x0005, 0xa830,
-	0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x51fa, 0x080c,
-	0x47ce, 0x0904, 0x3376, 0x0804, 0x4e88, 0x81ff, 0x2009, 0x0001,
-	0x1904, 0x3373, 0x080c, 0x52b1, 0x2009, 0x0007, 0x1904, 0x3373,
-	0x080c, 0x6555, 0x0120, 0x2009, 0x0008, 0x0804, 0x3373, 0x080c,
-	0x47ce, 0x0904, 0x3376, 0x080c, 0x655d, 0x2009, 0x0009, 0x1904,
-	0x3373, 0x080c, 0x479b, 0x2009, 0x0002, 0x0904, 0x3373, 0x9006,
-	0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x7988, 0x9194, 0xff00,
-	0x918c, 0x00ff, 0x9006, 0x82ff, 0x1128, 0xc0ed, 0xa952, 0x798c,
-	0xa956, 0x0038, 0x928e, 0x0100, 0x1904, 0x3376, 0xc0e5, 0xa952,
-	0xa956, 0xa83e, 0x080c, 0xbb53, 0x2009, 0x0003, 0x0904, 0x3373,
-	0x7007, 0x0003, 0x701f, 0x4f45, 0x0005, 0xa830, 0x9086, 0x0100,
-	0x2009, 0x0004, 0x0904, 0x3373, 0x0804, 0x3341, 0x7aa8, 0x9284,
-	0xc000, 0x0148, 0xd2ec, 0x01a0, 0x080c, 0x52b1, 0x1188, 0x2009,
-	0x0014, 0x0804, 0x3373, 0xd2dc, 0x1568, 0x81ff, 0x2009, 0x0001,
-	0x1904, 0x3373, 0x080c, 0x52b1, 0x2009, 0x0007, 0x1904, 0x3373,
-	0xd2f4, 0x0130, 0x9284, 0x5000, 0x080c, 0x5278, 0x0804, 0x3341,
-	0xd2fc, 0x0158, 0x080c, 0x47ce, 0x0904, 0x3376, 0x7984, 0x9284,
-	0x9000, 0x080c, 0x5255, 0x0804, 0x3341, 0x080c, 0x47ce, 0x0904,
-	0x3376, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x2009, 0x0009,
-	0x1904, 0x502e, 0x080c, 0x479b, 0x2009, 0x0002, 0x0904, 0x502e,
-	0xa85c, 0x9080, 0x001b, 0xaf60, 0x2009, 0x0008, 0x7a8c, 0x7b88,
-	0x7c9c, 0x7d98, 0x080c, 0x47e4, 0x701f, 0x4f9f, 0x0005, 0xa86c,
-	0x9086, 0x0500, 0x1138, 0xa870, 0x9005, 0x1120, 0xa874, 0x9084,
-	0xff00, 0x0110, 0x1904, 0x3376, 0xa866, 0xa832, 0xa868, 0xc0fd,
-	0xa86a, 0x080c, 0x47ce, 0x1110, 0x0804, 0x3376, 0x2009, 0x0043,
-	0x080c, 0xbbbb, 0x2009, 0x0003, 0x0904, 0x502e, 0x7007, 0x0003,
-	0x701f, 0x4fc3, 0x0005, 0xa830, 0x9086, 0x0100, 0x2009, 0x0004,
-	0x0904, 0x502e, 0x7984, 0x7aa8, 0x9284, 0x1000, 0x080c, 0x5255,
-	0x0804, 0x3341, 0x00c6, 0xaab0, 0x9284, 0xc000, 0x0140, 0xd2ec,
-	0x0168, 0x080c, 0x52b1, 0x1150, 0x2009, 0x0014, 0x04f0, 0x2061,
-	0x1800, 0x080c, 0x52b1, 0x2009, 0x0007, 0x15b8, 0xd2f4, 0x0128,
-	0x9284, 0x5000, 0x080c, 0x5278, 0x0050, 0xd2fc, 0x0178, 0x080c,
-	0x47cc, 0x0588, 0xa998, 0x9284, 0x9000, 0x080c, 0x5255, 0xa87b,
-	0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x0438, 0x080c, 0x47cc,
-	0x0510, 0x080c, 0x655d, 0x2009, 0x0009, 0x11b8, 0xa8c4, 0x9086,
-	0x0500, 0x11c8, 0xa8c8, 0x9005, 0x11b0, 0xa8cc, 0x9084, 0xff00,
-	0x1190, 0x080c, 0x47cc, 0x1108, 0x0070, 0x2009, 0x004b, 0x080c,
-	0xbbbb, 0x2009, 0x0003, 0x0108, 0x0078, 0x0429, 0x19c0, 0xa897,
-	0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001,
-	0x2001, 0x0030, 0x00ce, 0x0005, 0x9006, 0x0ce0, 0x7aa8, 0xd2dc,
-	0x0904, 0x3373, 0x0016, 0x7984, 0x9284, 0x1000, 0xc0fd, 0x080c,
-	0x5255, 0x001e, 0x1904, 0x3373, 0x0804, 0x3341, 0x00f6, 0x2d78,
-	0x0011, 0x00fe, 0x0005, 0xaab0, 0xd2dc, 0x0150, 0x0016, 0xa998,
-	0x9284, 0x1000, 0xc0fd, 0x080c, 0x5255, 0x001e, 0x9085, 0x0001,
-	0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3373, 0x080c,
-	0x52b1, 0x0120, 0x2009, 0x0007, 0x0804, 0x3373, 0x7984, 0x7ea8,
-	0x96b4, 0x00ff, 0x080c, 0x6166, 0x1904, 0x3376, 0x9186, 0x007f,
-	0x0138, 0x080c, 0x655d, 0x0120, 0x2009, 0x0009, 0x0804, 0x3373,
-	0x080c, 0x479b, 0x1120, 0x2009, 0x0002, 0x0804, 0x3373, 0xa867,
-	0x0000, 0xa868, 0xc0fd, 0xa86a, 0x2001, 0x0100, 0x8007, 0xa80a,
-	0x080c, 0xb8a7, 0x1120, 0x2009, 0x0003, 0x0804, 0x3373, 0x7007,
-	0x0003, 0x701f, 0x508c, 0x0005, 0xa808, 0x8007, 0x9086, 0x0100,
-	0x1120, 0x2009, 0x0004, 0x0804, 0x3373, 0xa8e0, 0xa866, 0xa810,
-	0x8007, 0x9084, 0x00ff, 0x800c, 0xa814, 0x8007, 0x9084, 0x00ff,
-	0x8004, 0x9080, 0x0002, 0x9108, 0x8906, 0x8006, 0x8007, 0x90bc,
-	0x003f, 0x9084, 0xffc0, 0x9080, 0x0004, 0x7a8c, 0x7b88, 0x7c9c,
-	0x7d98, 0x0804, 0x47e7, 0x080c, 0x479b, 0x1120, 0x2009, 0x0002,
-	0x0804, 0x3373, 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217,
-	0x82ff, 0x1118, 0x7023, 0x1982, 0x0040, 0x92c6, 0x0001, 0x1118,
-	0x7023, 0x199c, 0x0010, 0x0804, 0x3376, 0x2009, 0x001a, 0x7a8c,
-	0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c,
-	0x47e4, 0x701f, 0x50dc, 0x0005, 0x2001, 0x182d, 0x2003, 0x0001,
-	0xa85c, 0x9080, 0x0019, 0x2098, 0xa860, 0x20e0, 0x20a9, 0x001a,
-	0x7020, 0x20a0, 0x20e9, 0x0001, 0x4003, 0x0804, 0x3341, 0x080c,
-	0x479b, 0x1120, 0x2009, 0x0002, 0x0804, 0x3373, 0x7984, 0x9194,
-	0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118, 0x2099, 0x1982,
-	0x0040, 0x92c6, 0x0001, 0x1118, 0x2099, 0x199c, 0x0010, 0x0804,
-	0x3376, 0xa85c, 0x9080, 0x0019, 0x20a0, 0xa860, 0x20e8, 0x20a9,
-	0x001a, 0x20e1, 0x0001, 0x4003, 0x2009, 0x001a, 0x7a8c, 0x7b88,
-	0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x0804, 0x47e7,
-	0x7884, 0x908a, 0x1000, 0x1a04, 0x3376, 0x0126, 0x2091, 0x8000,
-	0x8003, 0x800b, 0x810b, 0x9108, 0x00c6, 0x2061, 0x19d2, 0x6142,
-	0x00ce, 0x012e, 0x0804, 0x3341, 0x00c6, 0x080c, 0x6f5c, 0x1160,
-	0x080c, 0x725c, 0x080c, 0x5be2, 0x9085, 0x0001, 0x080c, 0x6fa3,
-	0x080c, 0x6e8d, 0x080c, 0x0d65, 0x2061, 0x1800, 0x6030, 0xc09d,
-	0x6032, 0x080c, 0x5a9d, 0x00ce, 0x0005, 0x00c6, 0x2001, 0x1800,
-	0x2004, 0x908e, 0x0000, 0x0904, 0x3373, 0x7884, 0x9005, 0x0188,
-	0x7888, 0x2061, 0x196b, 0x2c0c, 0x2062, 0x080c, 0x27bf, 0x01a0,
-	0x080c, 0x27c7, 0x0188, 0x080c, 0x27cf, 0x0170, 0x2162, 0x0804,
-	0x3376, 0x2061, 0x0100, 0x6038, 0x9086, 0x0007, 0x1118, 0x2009,
-	0x0001, 0x0010, 0x2009, 0x0000, 0x7884, 0x9086, 0x0002, 0x1588,
-	0x2061, 0x0100, 0x6028, 0xc09c, 0x602a, 0x080c, 0x9746, 0x0026,
-	0x2011, 0x0003, 0x080c, 0x91a3, 0x2011, 0x0002, 0x080c, 0x91ad,
-	0x002e, 0x080c, 0x9070, 0x0036, 0x901e, 0x080c, 0x90f0, 0x003e,
-	0x080c, 0x9762, 0x60e3, 0x0000, 0x080c, 0xd427, 0x080c, 0xd442,
-	0x9085, 0x0001, 0x080c, 0x6fa3, 0x9006, 0x080c, 0x27f1, 0x2001,
-	0x1800, 0x2003, 0x0004, 0x0026, 0x2011, 0x0008, 0x080c, 0x282b,
-	0x002e, 0x00ce, 0x0804, 0x3341, 0x81ff, 0x0120, 0x2009, 0x0001,
-	0x0804, 0x3373, 0x080c, 0x52b1, 0x0120, 0x2009, 0x0007, 0x0804,
-	0x3373, 0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x6166, 0x1904,
-	0x3376, 0x9186, 0x007f, 0x0138, 0x080c, 0x655d, 0x0120, 0x2009,
-	0x0009, 0x0804, 0x3373, 0x080c, 0x479b, 0x1120, 0x2009, 0x0002,
-	0x0804, 0x3373, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c,
-	0xb8aa, 0x1120, 0x2009, 0x0003, 0x0804, 0x3373, 0x7007, 0x0003,
-	0x701f, 0x51e3, 0x0005, 0xa830, 0x9086, 0x0100, 0x1120, 0x2009,
-	0x0004, 0x0804, 0x3373, 0xa8e0, 0xa866, 0xa834, 0x8007, 0x800c,
-	0xa85c, 0x9080, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xaf60,
-	0x0804, 0x47e7, 0xa898, 0x9086, 0x000d, 0x1904, 0x3373, 0x2021,
-	0x4005, 0x0126, 0x2091, 0x8000, 0x0e04, 0x5207, 0x0010, 0x012e,
-	0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010,
-	0x7833, 0x0010, 0x7883, 0x4005, 0xa998, 0x7986, 0xa9a4, 0x799a,
-	0xa9a8, 0x799e, 0x080c, 0x47d7, 0x2091, 0x4080, 0x2001, 0x0089,
-	0x2004, 0xd084, 0x190c, 0x11b5, 0x7007, 0x0001, 0x2091, 0x5000,
-	0x700f, 0x0000, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6,
-	0x2061, 0x19d2, 0x7984, 0x6152, 0x614e, 0x6057, 0x0000, 0x604b,
-	0x0009, 0x7898, 0x606a, 0x789c, 0x6066, 0x7888, 0x6062, 0x788c,
-	0x605e, 0x2001, 0x19e0, 0x2044, 0x2001, 0x19e7, 0xa076, 0xa060,
-	0xa072, 0xa07b, 0x0001, 0xa07f, 0x0002, 0xa06b, 0x0000, 0xa09f,
-	0x0000, 0x00ce, 0x012e, 0x0804, 0x3341, 0x0126, 0x2091, 0x8000,
-	0x00b6, 0x00c6, 0x90e4, 0xc000, 0x0128, 0x0006, 0x080c, 0xb712,
-	0x000e, 0x1198, 0xd0e4, 0x0160, 0x9180, 0x1000, 0x2004, 0x905d,
-	0x0160, 0x080c, 0x5bfc, 0x080c, 0x99e4, 0x0110, 0xb817, 0x0000,
-	0x9006, 0x00ce, 0x00be, 0x012e, 0x0005, 0x9085, 0x0001, 0x0cc8,
-	0x0126, 0x2091, 0x8000, 0x0156, 0x2010, 0x900e, 0x20a9, 0x0800,
-	0x0016, 0x9180, 0x1000, 0x2004, 0x9005, 0x0180, 0x9186, 0x007e,
-	0x0168, 0x9186, 0x007f, 0x0150, 0x9186, 0x0080, 0x0138, 0x9186,
-	0x00ff, 0x0120, 0x0026, 0x2200, 0x0801, 0x002e, 0x001e, 0x8108,
-	0x1f04, 0x5280, 0x015e, 0x012e, 0x0005, 0x2001, 0x1854, 0x2004,
-	0x0005, 0x2001, 0x1873, 0x2004, 0x0005, 0x0006, 0x2001, 0x1810,
-	0x2004, 0xd0d4, 0x000e, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0b4,
-	0x0005, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x0005, 0x0016,
-	0x00e6, 0x2071, 0x1894, 0x7108, 0x910d, 0x710a, 0x00ee, 0x001e,
-	0x0005, 0x080c, 0x479b, 0x080c, 0x0f2a, 0x2100, 0x2238, 0x7d84,
-	0x7c88, 0x7b8c, 0x7a90, 0x79a4, 0x9182, 0x0081, 0x1a04, 0x3376,
-	0x810c, 0x080c, 0x47e4, 0x701f, 0x52d6, 0x0005, 0x2079, 0x0000,
-	0x7d94, 0x7c98, 0x7ba8, 0x7aac, 0x79a4, 0x810c, 0x2061, 0x18ae,
-	0x2c44, 0xa770, 0xa074, 0x2071, 0x1894, 0x080c, 0x47e7, 0x701f,
-	0x52ea, 0x0005, 0x2061, 0x18ae, 0x2c44, 0xa074, 0x2048, 0x9006,
-	0xa802, 0xa806, 0x0804, 0x3341, 0x0126, 0x0156, 0x0136, 0x0146,
-	0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2061, 0x0100,
-	0x2069, 0x0200, 0x2071, 0x1800, 0x6044, 0xd0a4, 0x11e8, 0xd084,
-	0x0118, 0x080c, 0x549d, 0x0068, 0xd08c, 0x0118, 0x080c, 0x53a6,
-	0x0040, 0xd094, 0x0118, 0x080c, 0x5376, 0x0018, 0xd09c, 0x0108,
-	0x0099, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e,
-	0x013e, 0x015e, 0x012e, 0x0005, 0x0016, 0x6128, 0xd19c, 0x1110,
-	0xc19d, 0x612a, 0x001e, 0x0c68, 0x0006, 0x7094, 0x9005, 0x000e,
-	0x0120, 0x7097, 0x0000, 0x708f, 0x0000, 0x624c, 0x9286, 0xf0f0,
-	0x1150, 0x6048, 0x9086, 0xf0f0, 0x0130, 0x624a, 0x6043, 0x0090,
-	0x6043, 0x0010, 0x0490, 0x9294, 0xff00, 0x9296, 0xf700, 0x0178,
-	0x7138, 0xd1a4, 0x1160, 0x6240, 0x9295, 0x0100, 0x6242, 0x9294,
-	0x0010, 0x0128, 0x2009, 0x00f7, 0x080c, 0x5b5e, 0x00f0, 0x6040,
-	0x9084, 0x0010, 0x9085, 0x0140, 0x6042, 0x6043, 0x0000, 0x7083,
-	0x0000, 0x709f, 0x0001, 0x70c3, 0x0000, 0x70db, 0x0000, 0x2009,
-	0x1d80, 0x200b, 0x0000, 0x7093, 0x0000, 0x7087, 0x000f, 0x2009,
-	0x000f, 0x2011, 0x5a40, 0x080c, 0x807a, 0x0005, 0x2001, 0x1875,
-	0x2004, 0xd08c, 0x0110, 0x705b, 0xffff, 0x7084, 0x9005, 0x1528,
-	0x2011, 0x5a40, 0x080c, 0x7fbb, 0x6040, 0x9094, 0x0010, 0x9285,
-	0x0020, 0x6042, 0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04,
-	0x538c, 0x6242, 0x7097, 0x0000, 0x6040, 0x9094, 0x0010, 0x9285,
-	0x0080, 0x6042, 0x6242, 0x0048, 0x6242, 0x7097, 0x0000, 0x708b,
-	0x0000, 0x9006, 0x080c, 0x5be7, 0x0000, 0x0005, 0x7088, 0x908a,
-	0x0003, 0x1a0c, 0x0d65, 0x000b, 0x0005, 0x53b0, 0x5401, 0x549c,
-	0x00f6, 0x0016, 0x6900, 0x918c, 0x0800, 0x708b, 0x0001, 0x2001,
-	0x015d, 0x2003, 0x0000, 0x6803, 0x00fc, 0x20a9, 0x0004, 0x6800,
-	0x9084, 0x00fc, 0x0120, 0x1f04, 0x53bf, 0x080c, 0x0d65, 0x68a0,
-	0x68a2, 0x689c, 0x689e, 0x6898, 0x689a, 0xa001, 0x918d, 0x1600,
-	0x6902, 0x001e, 0x6837, 0x0020, 0x080c, 0x5bc3, 0x2079, 0x1d00,
-	0x7833, 0x1101, 0x7837, 0x0000, 0x20e1, 0x0001, 0x2099, 0x1805,
-	0x20e9, 0x0001, 0x20a1, 0x1d0e, 0x20a9, 0x0004, 0x4003, 0x080c,
-	0x9678, 0x20e1, 0x0001, 0x2099, 0x1d00, 0x20e9, 0x0000, 0x20a1,
-	0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x600f, 0x0000,
-	0x080c, 0x5a71, 0x00fe, 0x9006, 0x708e, 0x6043, 0x0008, 0x6042,
-	0x0005, 0x00f6, 0x708c, 0x708f, 0x0000, 0x9025, 0x0904, 0x5479,
-	0x6020, 0xd0b4, 0x1904, 0x5477, 0x719c, 0x81ff, 0x0904, 0x5465,
-	0x9486, 0x000c, 0x1904, 0x5472, 0x9480, 0x0018, 0x8004, 0x20a8,
-	0x080c, 0x5bbc, 0x2011, 0x0260, 0x2019, 0x1d00, 0x220c, 0x2304,
-	0x9106, 0x11e8, 0x8210, 0x8318, 0x1f04, 0x541e, 0x6043, 0x0004,
-	0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100,
-	0x6043, 0x0006, 0x708b, 0x0002, 0x7097, 0x0002, 0x2009, 0x07d0,
-	0x2011, 0x5a47, 0x080c, 0x807a, 0x080c, 0x5bc3, 0x04c0, 0x080c,
-	0x5bbc, 0x2079, 0x0260, 0x7930, 0x918e, 0x1101, 0x1558, 0x7834,
-	0x9005, 0x1540, 0x7900, 0x918c, 0x00ff, 0x1118, 0x7804, 0x9005,
-	0x0190, 0x080c, 0x5bbc, 0x2011, 0x026e, 0x2019, 0x1805, 0x20a9,
-	0x0004, 0x220c, 0x2304, 0x9102, 0x0230, 0x11a0, 0x8210, 0x8318,
-	0x1f04, 0x5459, 0x0078, 0x709f, 0x0000, 0x080c, 0x5bbc, 0x20e1,
-	0x0000, 0x2099, 0x0260, 0x20e9, 0x0001, 0x20a1, 0x1d00, 0x20a9,
-	0x0014, 0x4003, 0x6043, 0x0008, 0x6043, 0x0000, 0x0010, 0x00fe,
-	0x0005, 0x6040, 0x9085, 0x0100, 0x6042, 0x6020, 0xd0b4, 0x1db8,
-	0x080c, 0x9678, 0x20e1, 0x0001, 0x2099, 0x1d00, 0x20e9, 0x0000,
-	0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x2011,
-	0x19c3, 0x2013, 0x0000, 0x708f, 0x0000, 0x60a3, 0x0056, 0x60a7,
-	0x9575, 0x080c, 0x8e14, 0x08d8, 0x0005, 0x7094, 0x908a, 0x001d,
-	0x1a0c, 0x0d65, 0x000b, 0x0005, 0x54ce, 0x54e1, 0x550a, 0x552a,
-	0x5550, 0x557f, 0x55a5, 0x55dd, 0x5603, 0x5631, 0x566c, 0x56a4,
-	0x56c2, 0x56ed, 0x570f, 0x572a, 0x5734, 0x5768, 0x578e, 0x57bd,
-	0x57e3, 0x581b, 0x585f, 0x589c, 0x58bd, 0x5916, 0x5938, 0x5966,
-	0x5966, 0x00c6, 0x2061, 0x1800, 0x6003, 0x0007, 0x2061, 0x0100,
-	0x6004, 0x9084, 0xfff9, 0x6006, 0x00ce, 0x0005, 0x2061, 0x0140,
-	0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0002,
-	0x7097, 0x0001, 0x2009, 0x07d0, 0x2011, 0x5a47, 0x080c, 0x807a,
-	0x0005, 0x00f6, 0x708c, 0x9086, 0x0014, 0x1510, 0x6042, 0x6020,
-	0xd0b4, 0x11f0, 0x080c, 0x5bbc, 0x2079, 0x0260, 0x7a30, 0x9296,
-	0x1102, 0x11a0, 0x7834, 0x9005, 0x1188, 0x7a38, 0xd2fc, 0x0128,
-	0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x2011, 0x5a47, 0x080c,
-	0x7fbb, 0x7097, 0x0010, 0x080c, 0x5734, 0x0010, 0x708f, 0x0000,
-	0x00fe, 0x0005, 0x00f6, 0x7097, 0x0003, 0x6043, 0x0004, 0x2011,
-	0x5a47, 0x080c, 0x7fbb, 0x080c, 0x5b40, 0x2079, 0x0240, 0x7833,
-	0x1102, 0x7837, 0x0000, 0x20a9, 0x0008, 0x9f88, 0x000e, 0x200b,
-	0x0000, 0x8108, 0x1f04, 0x551f, 0x60c3, 0x0014, 0x080c, 0x5a71,
-	0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, 0x5a47,
-	0x080c, 0x7fbb, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5bbc, 0x2079,
-	0x0260, 0x7a30, 0x9296, 0x1102, 0x1178, 0x7834, 0x9005, 0x1160,
+	0x01e8, 0x0c20, 0x83ff, 0x11c0, 0x7254, 0x900e, 0x2001, 0x0003,
+	0x080c, 0x83f1, 0x2208, 0x009e, 0xa897, 0x4000, 0xa99a, 0x715c,
+	0x81ff, 0x090c, 0x0d65, 0x2148, 0x080c, 0x1054, 0x9006, 0x705e,
+	0x918d, 0x0001, 0x2008, 0x0418, 0x7063, 0x0001, 0x7152, 0x7054,
+	0x9300, 0x7056, 0x2061, 0x18af, 0x2c44, 0xa37a, 0x7058, 0xa076,
+	0x7064, 0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a, 0xa09f, 0x4daa,
+	0x000e, 0xa0a2, 0x080c, 0x110c, 0x9006, 0x0048, 0x009e, 0xa897,
+	0x4005, 0xa99a, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x00ee,
+	0x00fe, 0x0005, 0x00f6, 0xa0a0, 0x904d, 0x090c, 0x0d65, 0x00e6,
+	0x2071, 0x1894, 0xa06c, 0x908e, 0x0100, 0x0138, 0xa87b, 0x0030,
+	0xa883, 0x0000, 0xa897, 0x4002, 0x00d8, 0x7060, 0x9005, 0x1158,
+	0x7150, 0x7058, 0x20a0, 0x901e, 0x7064, 0x20e8, 0xa48c, 0xa590,
+	0xa694, 0xa798, 0x0428, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897,
+	0x4000, 0x7254, 0x900e, 0x2001, 0x0003, 0x080c, 0x83f1, 0xaa9a,
+	0x715c, 0x81ff, 0x090c, 0x0d65, 0x2148, 0x080c, 0x1054, 0x705f,
+	0x0000, 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x698f,
+	0x012e, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x00ee, 0x00fe, 0x0005,
+	0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6660, 0x0118,
+	0x080c, 0x6668, 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810,
+	0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120,
+	0x9386, 0x003c, 0x0518, 0x0c20, 0x83ff, 0x11f0, 0x7154, 0x810c,
+	0xa99a, 0xa897, 0x4000, 0x715c, 0x81ff, 0x090c, 0x0d65, 0x2148,
+	0x080c, 0x1054, 0x9006, 0x705e, 0x918d, 0x0001, 0x2008, 0xa0a0,
+	0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x698f, 0x012e, 0xa09f,
+	0x0000, 0xa0a3, 0x0000, 0x0070, 0x7063, 0x0001, 0x7152, 0x7054,
+	0x9300, 0x7056, 0xa37a, 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c,
+	0x110c, 0x9006, 0x00ee, 0x0005, 0x0096, 0xa88c, 0x90be, 0x7000,
+	0x0148, 0x90be, 0x7100, 0x0130, 0x90be, 0x7200, 0x0118, 0x009e,
+	0x0804, 0x33b8, 0xa884, 0xa988, 0x080c, 0x2424, 0x1518, 0x080c,
+	0x6209, 0x1500, 0x7126, 0xbe12, 0xbd16, 0xae7c, 0x080c, 0x4871,
+	0x01c8, 0x080c, 0x4871, 0x01b0, 0x009e, 0xa867, 0x0000, 0xa868,
+	0xc0fd, 0xa86a, 0xa823, 0x0000, 0xa804, 0x2048, 0x080c, 0xb9dc,
+	0x1120, 0x2009, 0x0003, 0x0804, 0x33b5, 0x7007, 0x0003, 0x701f,
+	0x4e77, 0x0005, 0x009e, 0x2009, 0x0002, 0x0804, 0x33b5, 0x7124,
+	0x080c, 0x3113, 0xa820, 0x9086, 0x8001, 0x1120, 0x2009, 0x0004,
+	0x0804, 0x33b5, 0x2900, 0x7022, 0xa804, 0x0096, 0x2048, 0x8906,
+	0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x009e, 0x9080,
+	0x0002, 0x0076, 0x0006, 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9,
+	0x002a, 0x080c, 0x0f9f, 0xaa6c, 0xab70, 0xac74, 0xad78, 0x2061,
+	0x18ae, 0x2c44, 0xa06b, 0x0000, 0xae64, 0xaf8c, 0x97c6, 0x7000,
+	0x0118, 0x97c6, 0x7100, 0x1148, 0x96c2, 0x0004, 0x0600, 0x2009,
+	0x0004, 0x000e, 0x007e, 0x0804, 0x48bd, 0x97c6, 0x7200, 0x11b8,
+	0x96c2, 0x0054, 0x02a0, 0x000e, 0x007e, 0x2061, 0x18ae, 0x2c44,
+	0xa076, 0xa772, 0xa07b, 0x002a, 0xa28e, 0xa392, 0xa496, 0xa59a,
+	0x080c, 0x110c, 0x7007, 0x0002, 0x701f, 0x4ed3, 0x0005, 0x000e,
+	0x007e, 0x0804, 0x33b8, 0x7020, 0x2048, 0xa804, 0x2048, 0xa804,
+	0x2048, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0,
+	0x9080, 0x0002, 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a,
+	0x080c, 0x0f9f, 0x2100, 0x2238, 0x2061, 0x18ae, 0x2c44, 0xa28c,
+	0xa390, 0xa494, 0xa598, 0x2009, 0x002a, 0x0804, 0x48bd, 0x81ff,
+	0x1904, 0x33b5, 0x798c, 0x2001, 0x194f, 0x918c, 0x8000, 0x2102,
+	0x080c, 0x4888, 0x0904, 0x33b8, 0x080c, 0x6660, 0x0120, 0x080c,
+	0x6668, 0x1904, 0x33b8, 0x080c, 0x6330, 0x0904, 0x33b5, 0x0126,
+	0x2091, 0x8000, 0x080c, 0x64c5, 0x012e, 0x0904, 0x33b5, 0x2001,
+	0x194f, 0x2004, 0xd0fc, 0x1904, 0x3383, 0x0804, 0x4322, 0xa9a0,
+	0x2001, 0x194f, 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, 0x4895,
+	0x01a0, 0x080c, 0x6660, 0x0118, 0x080c, 0x6668, 0x1170, 0x080c,
+	0x6330, 0x2009, 0x0002, 0x0128, 0x080c, 0x64c5, 0x1170, 0x2009,
+	0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e,
+	0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x2001,
+	0x194f, 0x2004, 0xd0fc, 0x1128, 0x080c, 0x538e, 0x0110, 0x9006,
+	0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x78a8,
+	0xd08c, 0x1118, 0xd084, 0x0904, 0x4297, 0x080c, 0x48a4, 0x0904,
+	0x33b8, 0x080c, 0x4871, 0x1120, 0x2009, 0x0002, 0x0804, 0x33b5,
+	0x080c, 0x6660, 0x0130, 0x908e, 0x0004, 0x0118, 0x908e, 0x0005,
+	0x15a0, 0x78a8, 0xd08c, 0x0120, 0xb800, 0xc08c, 0xb802, 0x0028,
+	0x080c, 0x5386, 0xd0b4, 0x0904, 0x42d1, 0x7884, 0x908e, 0x007e,
+	0x0904, 0x42d1, 0x908e, 0x007f, 0x0904, 0x42d1, 0x908e, 0x0080,
+	0x0904, 0x42d1, 0xb800, 0xd08c, 0x1904, 0x42d1, 0xa867, 0x0000,
+	0xa868, 0xc0fd, 0xa86a, 0x080c, 0xb9fb, 0x1120, 0x2009, 0x0003,
+	0x0804, 0x33b5, 0x7007, 0x0003, 0x701f, 0x4f9f, 0x0005, 0x080c,
+	0x48a4, 0x0904, 0x33b8, 0x0804, 0x42d1, 0x080c, 0x317a, 0x0108,
+	0x0005, 0x2009, 0x1833, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001,
+	0x0804, 0x33b5, 0x080c, 0x539a, 0x0120, 0x2009, 0x0007, 0x0804,
+	0x33b5, 0x080c, 0x6658, 0x0120, 0x2009, 0x0008, 0x0804, 0x33b5,
+	0xb89c, 0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x42d1, 0x9006, 0xa866,
+	0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xba5e, 0x1120, 0x2009,
+	0x0003, 0x0804, 0x33b5, 0x7007, 0x0003, 0x701f, 0x4fd8, 0x0005,
+	0xa830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x52e3,
+	0x080c, 0x48a4, 0x0904, 0x33b8, 0x0804, 0x4f71, 0x81ff, 0x2009,
+	0x0001, 0x1904, 0x33b5, 0x080c, 0x539a, 0x2009, 0x0007, 0x1904,
+	0x33b5, 0x080c, 0x6658, 0x0120, 0x2009, 0x0008, 0x0804, 0x33b5,
+	0x080c, 0x48a4, 0x0904, 0x33b8, 0x080c, 0x6660, 0x2009, 0x0009,
+	0x1904, 0x33b5, 0x080c, 0x4871, 0x2009, 0x0002, 0x0904, 0x33b5,
+	0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x7988, 0x9194,
+	0xff00, 0x918c, 0x00ff, 0x9006, 0x82ff, 0x1128, 0xc0ed, 0xa952,
+	0x798c, 0xa956, 0x0038, 0x928e, 0x0100, 0x1904, 0x33b8, 0xc0e5,
+	0xa952, 0xa956, 0xa83e, 0x080c, 0xbcc1, 0x2009, 0x0003, 0x0904,
+	0x33b5, 0x7007, 0x0003, 0x701f, 0x502e, 0x0005, 0xa830, 0x9086,
+	0x0100, 0x2009, 0x0004, 0x0904, 0x33b5, 0x0804, 0x3383, 0x7aa8,
+	0x9284, 0xc000, 0x0148, 0xd2ec, 0x01a0, 0x080c, 0x539a, 0x1188,
+	0x2009, 0x0014, 0x0804, 0x33b5, 0xd2dc, 0x1568, 0x81ff, 0x2009,
+	0x0001, 0x1904, 0x33b5, 0x080c, 0x539a, 0x2009, 0x0007, 0x1904,
+	0x33b5, 0xd2f4, 0x0130, 0x9284, 0x5000, 0x080c, 0x5361, 0x0804,
+	0x3383, 0xd2fc, 0x0158, 0x080c, 0x48a4, 0x0904, 0x33b8, 0x7984,
+	0x9284, 0x9000, 0x080c, 0x533e, 0x0804, 0x3383, 0x080c, 0x48a4,
+	0x0904, 0x33b8, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x2009,
+	0x0009, 0x1904, 0x5117, 0x080c, 0x4871, 0x2009, 0x0002, 0x0904,
+	0x5117, 0xa85c, 0x9080, 0x001b, 0xaf60, 0x2009, 0x0008, 0x7a8c,
+	0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x48ba, 0x701f, 0x5088, 0x0005,
+	0xa86c, 0x9086, 0x0500, 0x1138, 0xa870, 0x9005, 0x1120, 0xa874,
+	0x9084, 0xff00, 0x0110, 0x1904, 0x33b8, 0xa866, 0xa832, 0xa868,
+	0xc0fd, 0xa86a, 0x080c, 0x48a4, 0x1110, 0x0804, 0x33b8, 0x2009,
+	0x0043, 0x080c, 0xbd29, 0x2009, 0x0003, 0x0904, 0x5117, 0x7007,
+	0x0003, 0x701f, 0x50ac, 0x0005, 0xa830, 0x9086, 0x0100, 0x2009,
+	0x0004, 0x0904, 0x5117, 0x7984, 0x7aa8, 0x9284, 0x1000, 0x080c,
+	0x533e, 0x0804, 0x3383, 0x00c6, 0xaab0, 0x9284, 0xc000, 0x0140,
+	0xd2ec, 0x0168, 0x080c, 0x539a, 0x1150, 0x2009, 0x0014, 0x04f0,
+	0x2061, 0x1800, 0x080c, 0x539a, 0x2009, 0x0007, 0x15b8, 0xd2f4,
+	0x0128, 0x9284, 0x5000, 0x080c, 0x5361, 0x0050, 0xd2fc, 0x0178,
+	0x080c, 0x48a2, 0x0588, 0xa998, 0x9284, 0x9000, 0x080c, 0x533e,
+	0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x0438, 0x080c,
+	0x48a2, 0x0510, 0x080c, 0x6660, 0x2009, 0x0009, 0x11b8, 0xa8c4,
+	0x9086, 0x0500, 0x11c8, 0xa8c8, 0x9005, 0x11b0, 0xa8cc, 0x9084,
+	0xff00, 0x1190, 0x080c, 0x48a2, 0x1108, 0x0070, 0x2009, 0x004b,
+	0x080c, 0xbd29, 0x2009, 0x0003, 0x0108, 0x0078, 0x0429, 0x19c0,
+	0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085,
+	0x0001, 0x2001, 0x0030, 0x00ce, 0x0005, 0x9006, 0x0ce0, 0x7aa8,
+	0xd2dc, 0x0904, 0x33b5, 0x0016, 0x7984, 0x9284, 0x1000, 0xc0fd,
+	0x080c, 0x533e, 0x001e, 0x1904, 0x33b5, 0x0804, 0x3383, 0x00f6,
+	0x2d78, 0x0011, 0x00fe, 0x0005, 0xaab0, 0xd2dc, 0x0150, 0x0016,
+	0xa998, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x533e, 0x001e, 0x9085,
+	0x0001, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x33b5,
+	0x080c, 0x539a, 0x0120, 0x2009, 0x0007, 0x0804, 0x33b5, 0x7984,
+	0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x6269, 0x1904, 0x33b8, 0x9186,
+	0x007f, 0x0138, 0x080c, 0x6660, 0x0120, 0x2009, 0x0009, 0x0804,
+	0x33b5, 0x080c, 0x4871, 0x1120, 0x2009, 0x0002, 0x0804, 0x33b5,
+	0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x2001, 0x0100, 0x8007,
+	0xa80a, 0x080c, 0xba15, 0x1120, 0x2009, 0x0003, 0x0804, 0x33b5,
+	0x7007, 0x0003, 0x701f, 0x5175, 0x0005, 0xa808, 0x8007, 0x9086,
+	0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x33b5, 0xa8e0, 0xa866,
+	0xa810, 0x8007, 0x9084, 0x00ff, 0x800c, 0xa814, 0x8007, 0x9084,
+	0x00ff, 0x8004, 0x9080, 0x0002, 0x9108, 0x8906, 0x8006, 0x8007,
+	0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0004, 0x7a8c, 0x7b88,
+	0x7c9c, 0x7d98, 0x0804, 0x48bd, 0x080c, 0x4871, 0x1120, 0x2009,
+	0x0002, 0x0804, 0x33b5, 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff,
+	0x8217, 0x82ff, 0x1118, 0x7023, 0x1984, 0x0040, 0x92c6, 0x0001,
+	0x1118, 0x7023, 0x199e, 0x0010, 0x0804, 0x33b8, 0x2009, 0x001a,
+	0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60,
+	0x080c, 0x48ba, 0x701f, 0x51c5, 0x0005, 0x2001, 0x182d, 0x2003,
+	0x0001, 0xa85c, 0x9080, 0x0019, 0x2098, 0xa860, 0x20e0, 0x20a9,
+	0x001a, 0x7020, 0x20a0, 0x20e9, 0x0001, 0x4003, 0x0804, 0x3383,
+	0x080c, 0x4871, 0x1120, 0x2009, 0x0002, 0x0804, 0x33b5, 0x7984,
+	0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118, 0x2099,
+	0x1984, 0x0040, 0x92c6, 0x0001, 0x1118, 0x2099, 0x199e, 0x0010,
+	0x0804, 0x33b8, 0xa85c, 0x9080, 0x0019, 0x20a0, 0xa860, 0x20e8,
+	0x20a9, 0x001a, 0x20e1, 0x0001, 0x4003, 0x2009, 0x001a, 0x7a8c,
+	0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x0804,
+	0x48bd, 0x7884, 0x908a, 0x1000, 0x1a04, 0x33b8, 0x0126, 0x2091,
+	0x8000, 0x8003, 0x800b, 0x810b, 0x9108, 0x00c6, 0x2061, 0x19d4,
+	0x6142, 0x00ce, 0x012e, 0x0804, 0x3383, 0x00c6, 0x080c, 0x70ac,
+	0x1160, 0x080c, 0x73ac, 0x080c, 0x5cd5, 0x9085, 0x0001, 0x080c,
+	0x70f3, 0x080c, 0x6fdd, 0x080c, 0x0d65, 0x2061, 0x1800, 0x6030,
+	0xc09d, 0x6032, 0x080c, 0x5b90, 0x00ce, 0x0005, 0x00c6, 0x2001,
+	0x1800, 0x2004, 0x908e, 0x0000, 0x0904, 0x33b5, 0x7884, 0x9005,
+	0x0188, 0x7888, 0x2061, 0x196d, 0x2c0c, 0x2062, 0x080c, 0x2801,
+	0x01a0, 0x080c, 0x2809, 0x0188, 0x080c, 0x2811, 0x0170, 0x2162,
+	0x0804, 0x33b8, 0x2061, 0x0100, 0x6038, 0x9086, 0x0007, 0x1118,
+	0x2009, 0x0001, 0x0010, 0x2009, 0x0000, 0x7884, 0x9086, 0x0002,
+	0x1588, 0x2061, 0x0100, 0x6028, 0xc09c, 0x602a, 0x080c, 0x98ad,
+	0x0026, 0x2011, 0x0003, 0x080c, 0x931e, 0x2011, 0x0002, 0x080c,
+	0x9328, 0x002e, 0x080c, 0x91eb, 0x0036, 0x901e, 0x080c, 0x926b,
+	0x003e, 0x080c, 0x98c9, 0x60e3, 0x0000, 0x080c, 0xd5d9, 0x080c,
+	0xd5f4, 0x9085, 0x0001, 0x080c, 0x70f3, 0x9006, 0x080c, 0x2833,
+	0x2001, 0x1800, 0x2003, 0x0004, 0x0026, 0x2011, 0x0008, 0x080c,
+	0x286d, 0x002e, 0x00ce, 0x0804, 0x3383, 0x81ff, 0x0120, 0x2009,
+	0x0001, 0x0804, 0x33b5, 0x080c, 0x539a, 0x0120, 0x2009, 0x0007,
+	0x0804, 0x33b5, 0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x6269,
+	0x1904, 0x33b8, 0x9186, 0x007f, 0x0138, 0x080c, 0x6660, 0x0120,
+	0x2009, 0x0009, 0x0804, 0x33b5, 0x080c, 0x4871, 0x1120, 0x2009,
+	0x0002, 0x0804, 0x33b5, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a,
+	0x080c, 0xba18, 0x1120, 0x2009, 0x0003, 0x0804, 0x33b5, 0x7007,
+	0x0003, 0x701f, 0x52cc, 0x0005, 0xa830, 0x9086, 0x0100, 0x1120,
+	0x2009, 0x0004, 0x0804, 0x33b5, 0xa8e0, 0xa866, 0xa834, 0x8007,
+	0x800c, 0xa85c, 0x9080, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98,
+	0xaf60, 0x0804, 0x48bd, 0xa898, 0x9086, 0x000d, 0x1904, 0x33b5,
+	0x2021, 0x4005, 0x0126, 0x2091, 0x8000, 0x0e04, 0x52f0, 0x0010,
+	0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, 0x0011,
+	0x0010, 0x7833, 0x0010, 0x7883, 0x4005, 0xa998, 0x7986, 0xa9a4,
+	0x799a, 0xa9a8, 0x799e, 0x080c, 0x48ad, 0x2091, 0x4080, 0x2001,
+	0x0089, 0x2004, 0xd084, 0x190c, 0x11be, 0x7007, 0x0001, 0x2091,
+	0x5000, 0x700f, 0x0000, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000,
+	0x00c6, 0x2061, 0x19d4, 0x7984, 0x6152, 0x614e, 0x6057, 0x0000,
+	0x604b, 0x0009, 0x7898, 0x606a, 0x789c, 0x6066, 0x7888, 0x6062,
+	0x788c, 0x605e, 0x2001, 0x19e2, 0x2044, 0x2001, 0x19e9, 0xa076,
+	0xa060, 0xa072, 0xa07b, 0x0001, 0xa07f, 0x0002, 0xa06b, 0x0000,
+	0xa09f, 0x0000, 0x00ce, 0x012e, 0x0804, 0x3383, 0x0126, 0x2091,
+	0x8000, 0x00b6, 0x00c6, 0x90e4, 0xc000, 0x0128, 0x0006, 0x080c,
+	0xb879, 0x000e, 0x1198, 0xd0e4, 0x0160, 0x9180, 0x1000, 0x2004,
+	0x905d, 0x0160, 0x080c, 0x5cef, 0x080c, 0x9b4b, 0x0110, 0xb817,
+	0x0000, 0x9006, 0x00ce, 0x00be, 0x012e, 0x0005, 0x9085, 0x0001,
+	0x0cc8, 0x0126, 0x2091, 0x8000, 0x0156, 0x2010, 0x900e, 0x20a9,
+	0x0800, 0x0016, 0x9180, 0x1000, 0x2004, 0x9005, 0x0180, 0x9186,
+	0x007e, 0x0168, 0x9186, 0x007f, 0x0150, 0x9186, 0x0080, 0x0138,
+	0x9186, 0x00ff, 0x0120, 0x0026, 0x2200, 0x0801, 0x002e, 0x001e,
+	0x8108, 0x1f04, 0x5369, 0x015e, 0x012e, 0x0005, 0x2001, 0x1854,
+	0x2004, 0x0005, 0x2001, 0x1873, 0x2004, 0x0005, 0x0006, 0x2001,
+	0x1810, 0x2004, 0xd0d4, 0x000e, 0x0005, 0x2001, 0x180e, 0x2004,
+	0xd0b4, 0x0005, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x0005,
+	0x0016, 0x00e6, 0x2071, 0x1894, 0x7108, 0x910d, 0x710a, 0x00ee,
+	0x001e, 0x0005, 0x79a4, 0x9182, 0x0081, 0x1a04, 0x33b8, 0x810c,
+	0x0016, 0x080c, 0x4871, 0x080c, 0x0f2a, 0x2100, 0x2238, 0x7d84,
+	0x7c88, 0x7b8c, 0x7a90, 0x001e, 0x080c, 0x48ba, 0x701f, 0x53c1,
+	0x0005, 0x2079, 0x0000, 0x7d94, 0x7c98, 0x7ba8, 0x7aac, 0x79a4,
+	0x810c, 0x2061, 0x18ae, 0x2c44, 0xa770, 0xa074, 0x2071, 0x1894,
+	0x080c, 0x48bd, 0x701f, 0x53d5, 0x0005, 0x2061, 0x18ae, 0x2c44,
+	0x0016, 0x0026, 0xa270, 0xa174, 0x080c, 0x0f32, 0x002e, 0x001e,
+	0x080c, 0x0fdf, 0x9006, 0xa802, 0xa806, 0x0804, 0x3383, 0x0126,
+	0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6,
+	0x00f6, 0x2061, 0x0100, 0x2069, 0x0200, 0x2071, 0x1800, 0x6044,
+	0xd0a4, 0x11e8, 0xd084, 0x0118, 0x080c, 0x5590, 0x0068, 0xd08c,
+	0x0118, 0x080c, 0x5499, 0x0040, 0xd094, 0x0118, 0x080c, 0x5469,
+	0x0018, 0xd09c, 0x0108, 0x0099, 0x00fe, 0x00ee, 0x00de, 0x00ce,
+	0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x012e, 0x0005, 0x0016,
+	0x6128, 0xd19c, 0x1110, 0xc19d, 0x612a, 0x001e, 0x0c68, 0x0006,
+	0x7094, 0x9005, 0x000e, 0x0120, 0x7097, 0x0000, 0x708f, 0x0000,
+	0x624c, 0x9286, 0xf0f0, 0x1150, 0x6048, 0x9086, 0xf0f0, 0x0130,
+	0x624a, 0x6043, 0x0090, 0x6043, 0x0010, 0x0490, 0x9294, 0xff00,
+	0x9296, 0xf700, 0x0178, 0x7138, 0xd1a4, 0x1160, 0x6240, 0x9295,
+	0x0100, 0x6242, 0x9294, 0x0010, 0x0128, 0x2009, 0x00f7, 0x080c,
+	0x5c51, 0x00f0, 0x6040, 0x9084, 0x0010, 0x9085, 0x0140, 0x6042,
+	0x6043, 0x0000, 0x7083, 0x0000, 0x709f, 0x0001, 0x70c3, 0x0000,
+	0x70db, 0x0000, 0x2009, 0x1d80, 0x200b, 0x0000, 0x7093, 0x0000,
+	0x7087, 0x000f, 0x2009, 0x000f, 0x2011, 0x5b33, 0x080c, 0x81f5,
+	0x0005, 0x2001, 0x1875, 0x2004, 0xd08c, 0x0110, 0x705b, 0xffff,
+	0x7084, 0x9005, 0x1528, 0x2011, 0x5b33, 0x080c, 0x8131, 0x6040,
+	0x9094, 0x0010, 0x9285, 0x0020, 0x6042, 0x20a9, 0x00c8, 0x6044,
+	0xd08c, 0x1168, 0x1f04, 0x547f, 0x6242, 0x7097, 0x0000, 0x6040,
+	0x9094, 0x0010, 0x9285, 0x0080, 0x6042, 0x6242, 0x0048, 0x6242,
+	0x7097, 0x0000, 0x708b, 0x0000, 0x9006, 0x080c, 0x5cda, 0x0000,
+	0x0005, 0x7088, 0x908a, 0x0003, 0x1a0c, 0x0d65, 0x000b, 0x0005,
+	0x54a3, 0x54f4, 0x558f, 0x00f6, 0x0016, 0x6900, 0x918c, 0x0800,
+	0x708b, 0x0001, 0x2001, 0x015d, 0x2003, 0x0000, 0x6803, 0x00fc,
+	0x20a9, 0x0004, 0x6800, 0x9084, 0x00fc, 0x0120, 0x1f04, 0x54b2,
+	0x080c, 0x0d65, 0x68a0, 0x68a2, 0x689c, 0x689e, 0x6898, 0x689a,
+	0xa001, 0x918d, 0x1600, 0x6902, 0x001e, 0x6837, 0x0020, 0x080c,
+	0x5cb6, 0x2079, 0x1d00, 0x7833, 0x1101, 0x7837, 0x0000, 0x20e1,
+	0x0001, 0x2099, 0x1805, 0x20e9, 0x0001, 0x20a1, 0x1d0e, 0x20a9,
+	0x0004, 0x4003, 0x080c, 0x97df, 0x20e1, 0x0001, 0x2099, 0x1d00,
+	0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3,
+	0x000c, 0x600f, 0x0000, 0x080c, 0x5b64, 0x00fe, 0x9006, 0x708e,
+	0x6043, 0x0008, 0x6042, 0x0005, 0x00f6, 0x708c, 0x708f, 0x0000,
+	0x9025, 0x0904, 0x556c, 0x6020, 0xd0b4, 0x1904, 0x556a, 0x719c,
+	0x81ff, 0x0904, 0x5558, 0x9486, 0x000c, 0x1904, 0x5565, 0x9480,
+	0x0018, 0x8004, 0x20a8, 0x080c, 0x5caf, 0x2011, 0x0260, 0x2019,
+	0x1d00, 0x220c, 0x2304, 0x9106, 0x11e8, 0x8210, 0x8318, 0x1f04,
+	0x5511, 0x6043, 0x0004, 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f,
+	0xf0f0, 0x2061, 0x0100, 0x6043, 0x0006, 0x708b, 0x0002, 0x7097,
+	0x0002, 0x2009, 0x07d0, 0x2011, 0x5b3a, 0x080c, 0x81f5, 0x080c,
+	0x5cb6, 0x04c0, 0x080c, 0x5caf, 0x2079, 0x0260, 0x7930, 0x918e,
+	0x1101, 0x1558, 0x7834, 0x9005, 0x1540, 0x7900, 0x918c, 0x00ff,
+	0x1118, 0x7804, 0x9005, 0x0190, 0x080c, 0x5caf, 0x2011, 0x026e,
+	0x2019, 0x1805, 0x20a9, 0x0004, 0x220c, 0x2304, 0x9102, 0x0230,
+	0x11a0, 0x8210, 0x8318, 0x1f04, 0x554c, 0x0078, 0x709f, 0x0000,
+	0x080c, 0x5caf, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0001,
+	0x20a1, 0x1d00, 0x20a9, 0x0014, 0x4003, 0x6043, 0x0008, 0x6043,
+	0x0000, 0x0010, 0x00fe, 0x0005, 0x6040, 0x9085, 0x0100, 0x6042,
+	0x6020, 0xd0b4, 0x1db8, 0x080c, 0x97df, 0x20e1, 0x0001, 0x2099,
+	0x1d00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003,
+	0x60c3, 0x000c, 0x2011, 0x19c5, 0x2013, 0x0000, 0x708f, 0x0000,
+	0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x8f8f, 0x08d8, 0x0005,
+	0x7094, 0x908a, 0x001d, 0x1a0c, 0x0d65, 0x000b, 0x0005, 0x55c1,
+	0x55d4, 0x55fd, 0x561d, 0x5643, 0x5672, 0x5698, 0x56d0, 0x56f6,
+	0x5724, 0x575f, 0x5797, 0x57b5, 0x57e0, 0x5802, 0x581d, 0x5827,
+	0x585b, 0x5881, 0x58b0, 0x58d6, 0x590e, 0x5952, 0x598f, 0x59b0,
+	0x5a09, 0x5a2b, 0x5a59, 0x5a59, 0x00c6, 0x2061, 0x1800, 0x6003,
+	0x0007, 0x2061, 0x0100, 0x6004, 0x9084, 0xfff9, 0x6006, 0x00ce,
+	0x0005, 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061,
+	0x0100, 0x6043, 0x0002, 0x7097, 0x0001, 0x2009, 0x07d0, 0x2011,
+	0x5b3a, 0x080c, 0x81f5, 0x0005, 0x00f6, 0x708c, 0x9086, 0x0014,
+	0x1510, 0x6042, 0x6020, 0xd0b4, 0x11f0, 0x080c, 0x5caf, 0x2079,
+	0x0260, 0x7a30, 0x9296, 0x1102, 0x11a0, 0x7834, 0x9005, 0x1188,
 	0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001,
-	0x7097, 0x0004, 0x0029, 0x0010, 0x080c, 0x5b98, 0x00fe, 0x0005,
-	0x00f6, 0x7097, 0x0005, 0x080c, 0x5b40, 0x2079, 0x0240, 0x7833,
-	0x1103, 0x7837, 0x0000, 0x080c, 0x5bbc, 0x080c, 0x5b9f, 0x1170,
-	0x7080, 0x9005, 0x1158, 0x7158, 0x9186, 0xffff, 0x0138, 0x2011,
-	0x0008, 0x080c, 0x59f4, 0x0168, 0x080c, 0x5b75, 0x20a9, 0x0008,
-	0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e,
-	0x4003, 0x60c3, 0x0014, 0x080c, 0x5a71, 0x00fe, 0x0005, 0x00f6,
-	0x708c, 0x9005, 0x0500, 0x2011, 0x5a47, 0x080c, 0x7fbb, 0x9086,
-	0x0014, 0x11b8, 0x080c, 0x5bbc, 0x2079, 0x0260, 0x7a30, 0x9296,
-	0x1103, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128,
-	0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x0006, 0x0029,
-	0x0010, 0x080c, 0x5b98, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0007,
-	0x080c, 0x5b40, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000,
-	0x080c, 0x5bbc, 0x080c, 0x5b9f, 0x11b8, 0x7080, 0x9005, 0x11a0,
-	0x7160, 0x9186, 0xffff, 0x0180, 0x9180, 0x3142, 0x200d, 0x918c,
-	0xff00, 0x810f, 0x2011, 0x0008, 0x080c, 0x59f4, 0x0180, 0x080c,
-	0x4bb6, 0x0110, 0x080c, 0x2458, 0x20a9, 0x0008, 0x20e1, 0x0000,
-	0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3,
-	0x0014, 0x080c, 0x5a71, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005,
-	0x0500, 0x2011, 0x5a47, 0x080c, 0x7fbb, 0x9086, 0x0014, 0x11b8,
-	0x080c, 0x5bbc, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178,
+	0x2011, 0x5b3a, 0x080c, 0x8131, 0x7097, 0x0010, 0x080c, 0x5827,
+	0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0003,
+	0x6043, 0x0004, 0x2011, 0x5b3a, 0x080c, 0x8131, 0x080c, 0x5c33,
+	0x2079, 0x0240, 0x7833, 0x1102, 0x7837, 0x0000, 0x20a9, 0x0008,
+	0x9f88, 0x000e, 0x200b, 0x0000, 0x8108, 0x1f04, 0x5612, 0x60c3,
+	0x0014, 0x080c, 0x5b64, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005,
+	0x0500, 0x2011, 0x5b3a, 0x080c, 0x8131, 0x9086, 0x0014, 0x11b8,
+	0x080c, 0x5caf, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, 0x1178,
 	0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005,
-	0x1110, 0x70c3, 0x0001, 0x7097, 0x0008, 0x0029, 0x0010, 0x080c,
-	0x5b98, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0009, 0x080c, 0x5b40,
-	0x2079, 0x0240, 0x7833, 0x1105, 0x7837, 0x0100, 0x080c, 0x5b9f,
-	0x1150, 0x7080, 0x9005, 0x1138, 0x080c, 0x5967, 0x1188, 0x9085,
-	0x0001, 0x080c, 0x2458, 0x20a9, 0x0008, 0x080c, 0x5bbc, 0x20e1,
-	0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003,
-	0x60c3, 0x0014, 0x080c, 0x5a71, 0x0010, 0x080c, 0x54c1, 0x00fe,
-	0x0005, 0x00f6, 0x708c, 0x9005, 0x05a8, 0x2011, 0x5a47, 0x080c,
-	0x7fbb, 0x9086, 0x0014, 0x1560, 0x080c, 0x5bbc, 0x2079, 0x0260,
-	0x7a30, 0x9296, 0x1105, 0x1520, 0x7834, 0x9084, 0x0100, 0x2011,
-	0x0100, 0x921e, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005,
-	0x1110, 0x70c3, 0x0001, 0x7097, 0x000a, 0x00b1, 0x0098, 0x9005,
-	0x1178, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3,
-	0x0001, 0x7093, 0x0000, 0x7097, 0x000e, 0x080c, 0x570f, 0x0010,
-	0x080c, 0x5b98, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x000b, 0x2011,
-	0x1d0e, 0x20e9, 0x0001, 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff,
-	0x4304, 0x080c, 0x5b40, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837,
-	0x0000, 0x080c, 0x5b9f, 0x0118, 0x2013, 0x0000, 0x0020, 0x705c,
-	0x9085, 0x0100, 0x2012, 0x20a9, 0x0040, 0x2009, 0x024e, 0x2011,
-	0x1d0e, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810,
-	0x8000, 0x6812, 0x2009, 0x0240, 0x1f04, 0x5691, 0x60c3, 0x0084,
-	0x080c, 0x5a71, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x01c0,
-	0x2011, 0x5a47, 0x080c, 0x7fbb, 0x9086, 0x0084, 0x1178, 0x080c,
-	0x5bbc, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1138, 0x7834,
-	0x9005, 0x1120, 0x7097, 0x000c, 0x0029, 0x0010, 0x080c, 0x5b98,
-	0x00fe, 0x0005, 0x00f6, 0x7097, 0x000d, 0x080c, 0x5b40, 0x2079,
-	0x0240, 0x7833, 0x1107, 0x7837, 0x0000, 0x080c, 0x5bbc, 0x20a9,
-	0x0040, 0x2011, 0x026e, 0x2009, 0x024e, 0x220e, 0x8210, 0x8108,
-	0x9186, 0x0260, 0x1150, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240,
-	0x6814, 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, 0x56d5, 0x60c3,
-	0x0084, 0x080c, 0x5a71, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005,
-	0x01e0, 0x2011, 0x5a47, 0x080c, 0x7fbb, 0x9086, 0x0084, 0x1198,
-	0x080c, 0x5bbc, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158,
-	0x7834, 0x9005, 0x1140, 0x7093, 0x0001, 0x080c, 0x5b12, 0x7097,
-	0x000e, 0x0029, 0x0010, 0x080c, 0x5b98, 0x00fe, 0x0005, 0x918d,
-	0x0001, 0x080c, 0x5be7, 0x7097, 0x000f, 0x708f, 0x0000, 0x2061,
-	0x0140, 0x605b, 0xbc85, 0x605f, 0xb5b5, 0x2061, 0x0100, 0x6043,
-	0x0005, 0x6043, 0x0004, 0x2009, 0x07d0, 0x2011, 0x5a47, 0x080c,
-	0x7faf, 0x0005, 0x708c, 0x9005, 0x0130, 0x2011, 0x5a47, 0x080c,
-	0x7fbb, 0x7097, 0x0000, 0x0005, 0x7097, 0x0011, 0x080c, 0x9678,
-	0x080c, 0x5bbc, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000,
-	0x20a1, 0x0240, 0x748c, 0x9480, 0x0018, 0x9080, 0x0007, 0x9084,
-	0x03f8, 0x8004, 0x20a8, 0x4003, 0x080c, 0x5b9f, 0x11a0, 0x7178,
-	0x81ff, 0x0188, 0x900e, 0x707c, 0x9084, 0x00ff, 0x0160, 0x080c,
-	0x23ef, 0x9186, 0x007e, 0x0138, 0x9186, 0x0080, 0x0120, 0x2011,
-	0x0008, 0x080c, 0x59f4, 0x60c3, 0x0014, 0x080c, 0x5a71, 0x0005,
-	0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, 0x5a47, 0x080c, 0x7fbb,
-	0x9086, 0x0014, 0x11b8, 0x080c, 0x5bbc, 0x2079, 0x0260, 0x7a30,
-	0x9296, 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc,
-	0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x0012,
+	0x1110, 0x70c3, 0x0001, 0x7097, 0x0004, 0x0029, 0x0010, 0x080c,
+	0x5c8b, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0005, 0x080c, 0x5c33,
+	0x2079, 0x0240, 0x7833, 0x1103, 0x7837, 0x0000, 0x080c, 0x5caf,
+	0x080c, 0x5c92, 0x1170, 0x7080, 0x9005, 0x1158, 0x7158, 0x9186,
+	0xffff, 0x0138, 0x2011, 0x0008, 0x080c, 0x5ae7, 0x0168, 0x080c,
+	0x5c68, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9,
+	0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5b64,
+	0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, 0x5b3a,
+	0x080c, 0x8131, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5caf, 0x2079,
+	0x0260, 0x7a30, 0x9296, 0x1103, 0x1178, 0x7834, 0x9005, 0x1160,
+	0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001,
+	0x7097, 0x0006, 0x0029, 0x0010, 0x080c, 0x5c8b, 0x00fe, 0x0005,
+	0x00f6, 0x7097, 0x0007, 0x080c, 0x5c33, 0x2079, 0x0240, 0x7833,
+	0x1104, 0x7837, 0x0000, 0x080c, 0x5caf, 0x080c, 0x5c92, 0x11b8,
+	0x7080, 0x9005, 0x11a0, 0x7160, 0x9186, 0xffff, 0x0180, 0x9180,
+	0x3184, 0x200d, 0x918c, 0xff00, 0x810f, 0x2011, 0x0008, 0x080c,
+	0x5ae7, 0x0180, 0x080c, 0x4c90, 0x0110, 0x080c, 0x248d, 0x20a9,
+	0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1,
+	0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5b64, 0x00fe, 0x0005,
+	0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, 0x5b3a, 0x080c, 0x8131,
+	0x9086, 0x0014, 0x11b8, 0x080c, 0x5caf, 0x2079, 0x0260, 0x7a30,
+	0x9296, 0x1104, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc,
+	0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x0008,
+	0x0029, 0x0010, 0x080c, 0x5c8b, 0x00fe, 0x0005, 0x00f6, 0x7097,
+	0x0009, 0x080c, 0x5c33, 0x2079, 0x0240, 0x7833, 0x1105, 0x7837,
+	0x0100, 0x080c, 0x5c92, 0x1150, 0x7080, 0x9005, 0x1138, 0x080c,
+	0x5a5a, 0x1188, 0x9085, 0x0001, 0x080c, 0x248d, 0x20a9, 0x0008,
+	0x080c, 0x5caf, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000,
+	0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5b64, 0x0010,
+	0x080c, 0x55b4, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x05a8,
+	0x2011, 0x5b3a, 0x080c, 0x8131, 0x9086, 0x0014, 0x1560, 0x080c,
+	0x5caf, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, 0x1520, 0x7834,
+	0x9084, 0x0100, 0x2011, 0x0100, 0x921e, 0x1160, 0x7a38, 0xd2fc,
+	0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x000a,
+	0x00b1, 0x0098, 0x9005, 0x1178, 0x7a38, 0xd2fc, 0x0128, 0x70c0,
+	0x9005, 0x1110, 0x70c3, 0x0001, 0x7093, 0x0000, 0x7097, 0x000e,
+	0x080c, 0x5802, 0x0010, 0x080c, 0x5c8b, 0x00fe, 0x0005, 0x00f6,
+	0x7097, 0x000b, 0x2011, 0x1d0e, 0x20e9, 0x0001, 0x22a0, 0x20a9,
+	0x0040, 0x2019, 0xffff, 0x4304, 0x080c, 0x5c33, 0x2079, 0x0240,
+	0x7833, 0x1106, 0x7837, 0x0000, 0x080c, 0x5c92, 0x0118, 0x2013,
+	0x0000, 0x0020, 0x705c, 0x9085, 0x0100, 0x2012, 0x20a9, 0x0040,
+	0x2009, 0x024e, 0x2011, 0x1d0e, 0x220e, 0x8210, 0x8108, 0x9186,
+	0x0260, 0x1128, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x1f04,
+	0x5784, 0x60c3, 0x0084, 0x080c, 0x5b64, 0x00fe, 0x0005, 0x00f6,
+	0x708c, 0x9005, 0x01c0, 0x2011, 0x5b3a, 0x080c, 0x8131, 0x9086,
+	0x0084, 0x1178, 0x080c, 0x5caf, 0x2079, 0x0260, 0x7a30, 0x9296,
+	0x1106, 0x1138, 0x7834, 0x9005, 0x1120, 0x7097, 0x000c, 0x0029,
+	0x0010, 0x080c, 0x5c8b, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x000d,
+	0x080c, 0x5c33, 0x2079, 0x0240, 0x7833, 0x1107, 0x7837, 0x0000,
+	0x080c, 0x5caf, 0x20a9, 0x0040, 0x2011, 0x026e, 0x2009, 0x024e,
+	0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1150, 0x6810, 0x8000,
+	0x6812, 0x2009, 0x0240, 0x6814, 0x8000, 0x6816, 0x2011, 0x0260,
+	0x1f04, 0x57c8, 0x60c3, 0x0084, 0x080c, 0x5b64, 0x00fe, 0x0005,
+	0x00f6, 0x708c, 0x9005, 0x01e0, 0x2011, 0x5b3a, 0x080c, 0x8131,
+	0x9086, 0x0084, 0x1198, 0x080c, 0x5caf, 0x2079, 0x0260, 0x7a30,
+	0x9296, 0x1107, 0x1158, 0x7834, 0x9005, 0x1140, 0x7093, 0x0001,
+	0x080c, 0x5c05, 0x7097, 0x000e, 0x0029, 0x0010, 0x080c, 0x5c8b,
+	0x00fe, 0x0005, 0x918d, 0x0001, 0x080c, 0x5cda, 0x7097, 0x000f,
+	0x708f, 0x0000, 0x2061, 0x0140, 0x605b, 0xbc85, 0x605f, 0xb5b5,
+	0x2061, 0x0100, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009, 0x07d0,
+	0x2011, 0x5b3a, 0x080c, 0x8125, 0x0005, 0x708c, 0x9005, 0x0130,
+	0x2011, 0x5b3a, 0x080c, 0x8131, 0x7097, 0x0000, 0x0005, 0x7097,
+	0x0011, 0x080c, 0x97df, 0x080c, 0x5caf, 0x20e1, 0x0000, 0x2099,
+	0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x748c, 0x9480, 0x0018,
+	0x9080, 0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, 0x4003, 0x080c,
+	0x5c92, 0x11a0, 0x7178, 0x81ff, 0x0188, 0x900e, 0x707c, 0x9084,
+	0x00ff, 0x0160, 0x080c, 0x2424, 0x9186, 0x007e, 0x0138, 0x9186,
+	0x0080, 0x0120, 0x2011, 0x0008, 0x080c, 0x5ae7, 0x60c3, 0x0014,
+	0x080c, 0x5b64, 0x0005, 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011,
+	0x5b3a, 0x080c, 0x8131, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5caf,
+	0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178, 0x7834, 0x9005,
+	0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3,
+	0x0001, 0x7097, 0x0012, 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe,
+	0x0005, 0x00f6, 0x7097, 0x0013, 0x080c, 0x5c41, 0x2079, 0x0240,
+	0x7833, 0x1103, 0x7837, 0x0000, 0x080c, 0x5caf, 0x080c, 0x5c92,
+	0x1170, 0x7080, 0x9005, 0x1158, 0x7158, 0x9186, 0xffff, 0x0138,
+	0x2011, 0x0008, 0x080c, 0x5ae7, 0x0168, 0x080c, 0x5c68, 0x20a9,
+	0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1,
+	0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5b64, 0x00fe, 0x0005,
+	0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, 0x5b3a, 0x080c, 0x8131,
+	0x9086, 0x0014, 0x11b8, 0x080c, 0x5caf, 0x2079, 0x0260, 0x7a30,
+	0x9296, 0x1104, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc,
+	0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x0014,
 	0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7097,
-	0x0013, 0x080c, 0x5b4e, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837,
-	0x0000, 0x080c, 0x5bbc, 0x080c, 0x5b9f, 0x1170, 0x7080, 0x9005,
-	0x1158, 0x7158, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c,
-	0x59f4, 0x0168, 0x080c, 0x5b75, 0x20a9, 0x0008, 0x20e1, 0x0000,
+	0x0015, 0x080c, 0x5c41, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837,
+	0x0000, 0x080c, 0x5caf, 0x080c, 0x5c92, 0x11b8, 0x7080, 0x9005,
+	0x11a0, 0x7160, 0x9186, 0xffff, 0x0180, 0x9180, 0x3184, 0x200d,
+	0x918c, 0xff00, 0x810f, 0x2011, 0x0008, 0x080c, 0x5ae7, 0x0180,
+	0x080c, 0x4c90, 0x0110, 0x080c, 0x248d, 0x20a9, 0x0008, 0x20e1,
+	0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003,
+	0x60c3, 0x0014, 0x080c, 0x5b64, 0x00fe, 0x0005, 0x00f6, 0x708c,
+	0x9005, 0x05f0, 0x2011, 0x5b3a, 0x080c, 0x8131, 0x9086, 0x0014,
+	0x15a8, 0x080c, 0x5caf, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105,
+	0x1568, 0x7834, 0x9084, 0x0100, 0x2011, 0x0100, 0x921e, 0x1168,
+	0x9085, 0x0001, 0x080c, 0x5cda, 0x7a38, 0xd2fc, 0x0128, 0x70c0,
+	0x9005, 0x1110, 0x70c3, 0x0001, 0x0080, 0x9005, 0x11b8, 0x7a38,
+	0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x9085,
+	0x0001, 0x080c, 0x5cda, 0x7093, 0x0000, 0x7a38, 0xd2f4, 0x0110,
+	0x70db, 0x0008, 0x7097, 0x0016, 0x0029, 0x0010, 0x708f, 0x0000,
+	0x00fe, 0x0005, 0x080c, 0x97df, 0x080c, 0x5caf, 0x20e1, 0x0000,
+	0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000e,
+	0x4003, 0x2011, 0x026d, 0x2204, 0x9084, 0x0100, 0x2011, 0x024d,
+	0x2012, 0x2011, 0x026e, 0x7097, 0x0017, 0x080c, 0x5c92, 0x1150,
+	0x7080, 0x9005, 0x1138, 0x080c, 0x5a5a, 0x1188, 0x9085, 0x0001,
+	0x080c, 0x248d, 0x20a9, 0x0008, 0x080c, 0x5caf, 0x20e1, 0x0000,
 	0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3,
-	0x0014, 0x080c, 0x5a71, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005,
-	0x0500, 0x2011, 0x5a47, 0x080c, 0x7fbb, 0x9086, 0x0014, 0x11b8,
-	0x080c, 0x5bbc, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178,
-	0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005,
-	0x1110, 0x70c3, 0x0001, 0x7097, 0x0014, 0x0029, 0x0010, 0x708f,
-	0x0000, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0015, 0x080c, 0x5b4e,
-	0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x5bbc,
-	0x080c, 0x5b9f, 0x11b8, 0x7080, 0x9005, 0x11a0, 0x7160, 0x9186,
-	0xffff, 0x0180, 0x9180, 0x3142, 0x200d, 0x918c, 0xff00, 0x810f,
-	0x2011, 0x0008, 0x080c, 0x59f4, 0x0180, 0x080c, 0x4bb6, 0x0110,
-	0x080c, 0x2458, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e,
-	0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c,
-	0x5a71, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x05f0, 0x2011,
-	0x5a47, 0x080c, 0x7fbb, 0x9086, 0x0014, 0x15a8, 0x080c, 0x5bbc,
-	0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, 0x1568, 0x7834, 0x9084,
-	0x0100, 0x2011, 0x0100, 0x921e, 0x1168, 0x9085, 0x0001, 0x080c,
-	0x5be7, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3,
-	0x0001, 0x0080, 0x9005, 0x11b8, 0x7a38, 0xd2fc, 0x0128, 0x70c0,
-	0x9005, 0x1110, 0x70c3, 0x0001, 0x9085, 0x0001, 0x080c, 0x5be7,
-	0x7093, 0x0000, 0x7a38, 0xd2f4, 0x0110, 0x70db, 0x0008, 0x7097,
-	0x0016, 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, 0x080c,
-	0x9678, 0x080c, 0x5bbc, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9,
-	0x0000, 0x20a1, 0x0240, 0x20a9, 0x000e, 0x4003, 0x2011, 0x026d,
-	0x2204, 0x9084, 0x0100, 0x2011, 0x024d, 0x2012, 0x2011, 0x026e,
-	0x7097, 0x0017, 0x080c, 0x5b9f, 0x1150, 0x7080, 0x9005, 0x1138,
-	0x080c, 0x5967, 0x1188, 0x9085, 0x0001, 0x080c, 0x2458, 0x20a9,
-	0x0008, 0x080c, 0x5bbc, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9,
-	0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5a71,
-	0x0010, 0x080c, 0x54c1, 0x0005, 0x00f6, 0x708c, 0x9005, 0x01d8,
-	0x2011, 0x5a47, 0x080c, 0x7fbb, 0x9086, 0x0084, 0x1190, 0x080c,
-	0x5bbc, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1150, 0x7834,
-	0x9005, 0x1138, 0x9006, 0x080c, 0x5be7, 0x7097, 0x0018, 0x0029,
-	0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0019,
-	0x080c, 0x5b4e, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000,
-	0x080c, 0x5bbc, 0x2009, 0x026e, 0x2039, 0x1d0e, 0x20a9, 0x0040,
-	0x213e, 0x8738, 0x8108, 0x9186, 0x0280, 0x1128, 0x6814, 0x8000,
-	0x6816, 0x2009, 0x0260, 0x1f04, 0x58d0, 0x2039, 0x1d0e, 0x080c,
-	0x5b9f, 0x11e8, 0x2728, 0x2514, 0x8207, 0x9084, 0x00ff, 0x8000,
-	0x2018, 0x9294, 0x00ff, 0x8007, 0x9205, 0x202a, 0x705c, 0x2310,
-	0x8214, 0x92a0, 0x1d0e, 0x2414, 0x938c, 0x0001, 0x0118, 0x9294,
-	0xff00, 0x0018, 0x9294, 0x00ff, 0x8007, 0x9215, 0x2222, 0x20a9,
-	0x0040, 0x2009, 0x024e, 0x270e, 0x8738, 0x8108, 0x9186, 0x0260,
-	0x1128, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x1f04, 0x5903,
-	0x60c3, 0x0084, 0x080c, 0x5a71, 0x00fe, 0x0005, 0x00f6, 0x708c,
-	0x9005, 0x01e0, 0x2011, 0x5a47, 0x080c, 0x7fbb, 0x9086, 0x0084,
-	0x1198, 0x080c, 0x5bbc, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107,
-	0x1158, 0x7834, 0x9005, 0x1140, 0x7093, 0x0001, 0x080c, 0x5b12,
-	0x7097, 0x001a, 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005,
-	0x9085, 0x0001, 0x080c, 0x5be7, 0x7097, 0x001b, 0x080c, 0x9678,
-	0x080c, 0x5bbc, 0x2011, 0x0260, 0x2009, 0x0240, 0x748c, 0x9480,
-	0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, 0x220e,
-	0x8210, 0x8108, 0x9186, 0x0260, 0x1150, 0x6810, 0x8000, 0x6812,
-	0x2009, 0x0240, 0x6814, 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04,
-	0x594f, 0x60c3, 0x0084, 0x080c, 0x5a71, 0x0005, 0x0005, 0x0086,
-	0x0096, 0x2029, 0x1854, 0x252c, 0x20a9, 0x0008, 0x2041, 0x1d0e,
-	0x20e9, 0x0001, 0x28a0, 0x080c, 0x5bbc, 0x20e1, 0x0000, 0x2099,
-	0x026e, 0x4003, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0108,
-	0x9016, 0x2800, 0x9200, 0x200c, 0x91a6, 0xffff, 0x1148, 0xd5d4,
-	0x0110, 0x8210, 0x0008, 0x8211, 0x1f04, 0x5981, 0x0804, 0x59f0,
-	0x82ff, 0x1160, 0xd5d4, 0x0120, 0x91a6, 0x3fff, 0x0d90, 0x0020,
-	0x91a6, 0x3fff, 0x0904, 0x59f0, 0x918d, 0xc000, 0x20a9, 0x0010,
-	0x2019, 0x0001, 0xd5d4, 0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4,
-	0x0110, 0x8423, 0x0008, 0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319,
-	0x0008, 0x8318, 0x1f04, 0x59a7, 0x04d8, 0x23a8, 0x2021, 0x0001,
-	0x8426, 0x8425, 0x1f04, 0x59b9, 0x2328, 0x8529, 0x92be, 0x0007,
-	0x0158, 0x0006, 0x2039, 0x0007, 0x2200, 0x973a, 0x000e, 0x27a8,
-	0x95a8, 0x0010, 0x1f04, 0x59c8, 0x755a, 0x95c8, 0x3142, 0x292d,
-	0x95ac, 0x00ff, 0x757e, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c,
-	0x2438, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x2018, 0x2304, 0x9405,
-	0x201a, 0x7083, 0x0001, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x20e1,
-	0x0001, 0x2898, 0x20a9, 0x0008, 0x4003, 0x9085, 0x0001, 0x0008,
-	0x9006, 0x009e, 0x008e, 0x0005, 0x0156, 0x01c6, 0x01d6, 0x0136,
-	0x0146, 0x22a8, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000,
-	0x2011, 0x024e, 0x22a0, 0x4003, 0x014e, 0x013e, 0x01de, 0x01ce,
-	0x015e, 0x2118, 0x9026, 0x2001, 0x0007, 0x939a, 0x0010, 0x0218,
-	0x8420, 0x8001, 0x0cd0, 0x2118, 0x84ff, 0x0120, 0x939a, 0x0010,
-	0x8421, 0x1de0, 0x2021, 0x0001, 0x83ff, 0x0118, 0x8423, 0x8319,
-	0x1de8, 0x9238, 0x2029, 0x026e, 0x9528, 0x2504, 0x942c, 0x11b8,
-	0x9405, 0x203a, 0x715a, 0x91a0, 0x3142, 0x242d, 0x95ac, 0x00ff,
-	0x757e, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x2438, 0x001e,
-	0x60e7, 0x0000, 0x65ea, 0x7083, 0x0001, 0x9084, 0x0000, 0x0005,
-	0x00e6, 0x2071, 0x1800, 0x7087, 0x0000, 0x00ee, 0x0005, 0x00e6,
-	0x00f6, 0x2079, 0x0100, 0x2071, 0x0140, 0x080c, 0x5b01, 0x080c,
-	0x8e21, 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, 0x2801, 0x0126,
-	0x2091, 0x8000, 0x2071, 0x1825, 0x2073, 0x0000, 0x7840, 0x0026,
-	0x0016, 0x2009, 0x00f7, 0x080c, 0x5b5e, 0x001e, 0x9094, 0x0010,
-	0x9285, 0x0080, 0x7842, 0x7a42, 0x002e, 0x012e, 0x00fe, 0x00ee,
-	0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x2760, 0x0228, 0x2011,
-	0x0101, 0x2204, 0xc0c5, 0x2012, 0x2011, 0x19c3, 0x2013, 0x0000,
-	0x708f, 0x0000, 0x012e, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c,
-	0x8e14, 0x6144, 0xd184, 0x0120, 0x7194, 0x918d, 0x2000, 0x0018,
-	0x7188, 0x918d, 0x1000, 0x2011, 0x1968, 0x2112, 0x2009, 0x07d0,
-	0x2011, 0x5a47, 0x080c, 0x807a, 0x0005, 0x0016, 0x0026, 0x00c6,
-	0x0126, 0x2091, 0x8000, 0x080c, 0x9746, 0x080c, 0x99eb, 0x080c,
-	0x9762, 0x2009, 0x00f7, 0x080c, 0x5b5e, 0x2061, 0x19d2, 0x900e,
-	0x611a, 0x611e, 0x6172, 0x6176, 0x2061, 0x1800, 0x6003, 0x0001,
-	0x2061, 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x1968,
-	0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x5acd, 0x080c, 0x7faf,
-	0x012e, 0x00ce, 0x002e, 0x001e, 0x0005, 0x00e6, 0x0006, 0x0126,
-	0x2091, 0x8000, 0x0471, 0x2071, 0x0100, 0x080c, 0x8e21, 0x2071,
-	0x0140, 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, 0x2801, 0x080c,
-	0x6f64, 0x0188, 0x080c, 0x6f7f, 0x1170, 0x080c, 0x7266, 0x0016,
-	0x080c, 0x2507, 0x2001, 0x193e, 0x2102, 0x001e, 0x080c, 0x7261,
-	0x080c, 0x6e8d, 0x0050, 0x2009, 0x0001, 0x080c, 0x27dd, 0x2001,
-	0x0001, 0x080c, 0x2394, 0x080c, 0x5a9d, 0x012e, 0x000e, 0x00ee,
-	0x0005, 0x2001, 0x180e, 0x2004, 0xd0bc, 0x0158, 0x0026, 0x0036,
-	0x2011, 0x8017, 0x2001, 0x1968, 0x201c, 0x080c, 0x47fb, 0x003e,
-	0x002e, 0x0005, 0x20a9, 0x0012, 0x20e9, 0x0001, 0x20a1, 0x1d80,
-	0x080c, 0x5bbc, 0x20e9, 0x0000, 0x2099, 0x026e, 0x0099, 0x20a9,
-	0x0020, 0x080c, 0x5bb6, 0x2099, 0x0260, 0x20a1, 0x1d92, 0x0051,
-	0x20a9, 0x000e, 0x080c, 0x5bb9, 0x2099, 0x0260, 0x20a1, 0x1db2,
-	0x0009, 0x0005, 0x0016, 0x0026, 0x3410, 0x3308, 0x2104, 0x8007,
-	0x2012, 0x8108, 0x8210, 0x1f04, 0x5b36, 0x002e, 0x001e, 0x0005,
-	0x080c, 0x9678, 0x20e1, 0x0001, 0x2099, 0x1d00, 0x20e9, 0x0000,
-	0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x080c, 0x9678,
-	0x080c, 0x5bbc, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000,
-	0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x00c6, 0x0006,
-	0x2061, 0x0100, 0x810f, 0x2001, 0x1833, 0x2004, 0x9005, 0x1138,
-	0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x9105, 0x0010, 0x9185,
-	0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005, 0x0016, 0x0046, 0x080c,
-	0x6559, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xd0ce,
-	0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x900e,
-	0x080c, 0x2f80, 0x080c, 0xbdd7, 0x0140, 0x0036, 0x2019, 0xffff,
-	0x2021, 0x0007, 0x080c, 0x4998, 0x003e, 0x004e, 0x001e, 0x0005,
-	0x080c, 0x5a9d, 0x7097, 0x0000, 0x708f, 0x0000, 0x0005, 0x0006,
-	0x2001, 0x180c, 0x2004, 0xd09c, 0x0100, 0x000e, 0x0005, 0x0006,
-	0x0016, 0x0126, 0x2091, 0x8000, 0x2001, 0x0101, 0x200c, 0x918d,
-	0x0006, 0x2102, 0x012e, 0x001e, 0x000e, 0x0005, 0x2009, 0x0001,
-	0x0020, 0x2009, 0x0002, 0x0008, 0x900e, 0x6814, 0x9084, 0xffc0,
-	0x910d, 0x6916, 0x0005, 0x00f6, 0x0156, 0x0146, 0x01d6, 0x9006,
-	0x20a9, 0x0080, 0x20e9, 0x0001, 0x20a1, 0x1d00, 0x4004, 0x2079,
-	0x1d00, 0x7803, 0x2200, 0x7807, 0x00ef, 0x780f, 0x00ef, 0x7813,
-	0x0138, 0x7823, 0xffff, 0x7827, 0xffff, 0x01de, 0x014e, 0x015e,
-	0x00fe, 0x0005, 0x2001, 0x1800, 0x2003, 0x0001, 0x0005, 0x2001,
-	0x1975, 0x0118, 0x2003, 0x0001, 0x0010, 0x2003, 0x0000, 0x0005,
-	0x0156, 0x20a9, 0x0800, 0x2009, 0x1000, 0x9006, 0x200a, 0x8108,
-	0x1f04, 0x5bf6, 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156, 0x0136,
-	0x0146, 0x2069, 0x1853, 0x9006, 0xb802, 0xb8c6, 0xb807, 0x0707,
-	0xb80a, 0xb80e, 0xb812, 0x9198, 0x3142, 0x231d, 0x939c, 0x00ff,
-	0xbb16, 0x0016, 0x0026, 0xb886, 0x080c, 0x99e4, 0x1120, 0x9192,
-	0x007e, 0x1208, 0xbb86, 0x20a9, 0x0004, 0xb8b4, 0x20e8, 0xb9b8,
-	0x9198, 0x0006, 0x9006, 0x23a0, 0x4004, 0x20a9, 0x0004, 0x9198,
-	0x000a, 0x23a0, 0x4004, 0x002e, 0x001e, 0xb83e, 0xb842, 0xb8be,
-	0xb8c2, 0xb85e, 0xb862, 0xb866, 0xb86a, 0xb86f, 0x0100, 0xb872,
-	0xb876, 0xb87a, 0xb88a, 0xb88e, 0xb893, 0x0008, 0xb896, 0xb89a,
-	0xb89e, 0xb8ae, 0xb9a2, 0x0096, 0xb8a4, 0x904d, 0x0110, 0x080c,
-	0x1055, 0xb8a7, 0x0000, 0x009e, 0x9006, 0xb84a, 0x6810, 0xb83a,
-	0x680c, 0xb846, 0x6814, 0x9084, 0x00ff, 0xb842, 0x014e, 0x013e,
-	0x015e, 0x003e, 0x00de, 0x0005, 0x0126, 0x2091, 0x8000, 0xa974,
-	0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x5cba, 0x9182,
-	0x0800, 0x1a04, 0x5cbe, 0x2001, 0x180c, 0x2004, 0x9084, 0x0003,
-	0x1904, 0x5cc4, 0x9188, 0x1000, 0x2104, 0x905d, 0x0198, 0xb804,
-	0x9084, 0x00ff, 0x908e, 0x0006, 0x1188, 0xb8a4, 0x900d, 0x1904,
-	0x5cd6, 0x080c, 0x6020, 0x9006, 0x012e, 0x0005, 0x2001, 0x0005,
-	0x900e, 0x04b8, 0x2001, 0x0028, 0x900e, 0x0498, 0x9082, 0x0006,
-	0x1290, 0x080c, 0x99e4, 0x1160, 0xb8a0, 0x9084, 0xff80, 0x1140,
-	0xb900, 0xd1fc, 0x0d10, 0x2001, 0x0029, 0x2009, 0x1000, 0x0408,
-	0x2001, 0x0028, 0x00a8, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118,
-	0x2001, 0x0004, 0x0068, 0xd184, 0x0118, 0x2001, 0x0004, 0x0040,
-	0x2001, 0x0029, 0xb900, 0xd1fc, 0x0118, 0x2009, 0x1000, 0x0048,
-	0x900e, 0x0038, 0x2001, 0x0029, 0x900e, 0x0018, 0x2001, 0x0029,
-	0x900e, 0x9005, 0x012e, 0x0005, 0x2001, 0x180c, 0x2004, 0xd084,
-	0x19d0, 0x9188, 0x1000, 0x2104, 0x9065, 0x09a8, 0x080c, 0x655d,
-	0x1990, 0xb800, 0xd0bc, 0x0978, 0x0804, 0x5c7d, 0x080c, 0x63d1,
-	0x0904, 0x5c86, 0x0804, 0x5c81, 0x00e6, 0x2071, 0x19b6, 0x7004,
-	0x9086, 0x0002, 0x1128, 0x7030, 0x9080, 0x0004, 0x2004, 0x9b06,
-	0x00ee, 0x0005, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0xa974,
-	0x9182, 0x0800, 0x1a04, 0x5d65, 0x9188, 0x1000, 0x2104, 0x905d,
-	0x0904, 0x5d3d, 0xb8a0, 0x9086, 0x007f, 0x0178, 0x080c, 0x6565,
-	0x0160, 0xa994, 0x81ff, 0x0130, 0x908e, 0x0004, 0x0130, 0x908e,
-	0x0005, 0x0118, 0x080c, 0x655d, 0x1598, 0xa87c, 0xd0fc, 0x01e0,
-	0xa894, 0x9005, 0x01c8, 0x2060, 0x0026, 0x2010, 0x080c, 0xb6b3,
-	0x002e, 0x1120, 0x2001, 0x0008, 0x0804, 0x5d67, 0x6020, 0x9086,
-	0x000a, 0x0120, 0x2001, 0x0008, 0x0804, 0x5d67, 0x601a, 0x6003,
-	0x0008, 0x2900, 0x6016, 0x0058, 0x080c, 0x9a0f, 0x05e8, 0x2b00,
-	0x6012, 0x2900, 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, 0x2009,
-	0x0003, 0x080c, 0x9b03, 0x9006, 0x0458, 0x2001, 0x0028, 0x0438,
-	0x9082, 0x0006, 0x1290, 0x080c, 0x99e4, 0x1160, 0xb8a0, 0x9084,
-	0xff80, 0x1140, 0xb900, 0xd1fc, 0x0900, 0x2001, 0x0029, 0x2009,
-	0x1000, 0x00a8, 0x2001, 0x0028, 0x0090, 0x2009, 0x180c, 0x210c,
-	0xd18c, 0x0118, 0x2001, 0x0004, 0x0050, 0xd184, 0x0118, 0x2001,
-	0x0004, 0x0028, 0x2001, 0x0029, 0x0010, 0x2001, 0x0029, 0x9005,
-	0x012e, 0x00ee, 0x00be, 0x0005, 0x2001, 0x002c, 0x0cc0, 0x00f6,
-	0x00b6, 0x0126, 0x2091, 0x8000, 0xa8e0, 0x9005, 0x1550, 0xa8dc,
-	0x9082, 0x0101, 0x1630, 0xa8c8, 0x9005, 0x1518, 0xa8c4, 0x9082,
-	0x0101, 0x12f8, 0xa974, 0x2079, 0x1800, 0x9182, 0x0800, 0x12e8,
-	0x7830, 0x9084, 0x0003, 0x1130, 0xaa98, 0xab94, 0xa878, 0x9084,
-	0x0007, 0x00ea, 0x7930, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038,
-	0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x900e,
-	0x0038, 0x2001, 0x002c, 0x900e, 0x0018, 0x2001, 0x0029, 0x900e,
-	0x9006, 0x0008, 0x9005, 0x012e, 0x00be, 0x00fe, 0x0005, 0x5dfc,
-	0x5db7, 0x5dce, 0x5dfc, 0x5dfc, 0x5dfc, 0x5dfc, 0x5dfc, 0x2100,
-	0x9082, 0x007e, 0x1278, 0x080c, 0x6106, 0x0148, 0x9046, 0xb810,
-	0x9306, 0x1904, 0x5e04, 0xb814, 0x9206, 0x15f0, 0x0028, 0xbb12,
-	0xba16, 0x0010, 0x080c, 0x46b5, 0x0150, 0x04b0, 0x080c, 0x6166,
-	0x1598, 0xb810, 0x9306, 0x1580, 0xb814, 0x9206, 0x1568, 0x080c,
-	0x9a0f, 0x0530, 0x2b00, 0x6012, 0x080c, 0xbb52, 0x2900, 0x6016,
-	0x600b, 0xffff, 0x6023, 0x000a, 0xa878, 0x9086, 0x0001, 0x1170,
-	0x080c, 0x2fc1, 0x9006, 0x080c, 0x60a3, 0x2001, 0x0002, 0x080c,
-	0x60b7, 0x2001, 0x0200, 0xb86e, 0xb893, 0x0002, 0x2009, 0x0003,
-	0x080c, 0x9b03, 0x9006, 0x0068, 0x2001, 0x0001, 0x900e, 0x0038,
-	0x2001, 0x002c, 0x900e, 0x0018, 0x2001, 0x0028, 0x900e, 0x9005,
-	0x0000, 0x012e, 0x00be, 0x00fe, 0x0005, 0x00b6, 0x00f6, 0x00e6,
-	0x0126, 0x2091, 0x8000, 0xa894, 0x90c6, 0x0015, 0x0904, 0x5fd1,
-	0x90c6, 0x0056, 0x0904, 0x5fd5, 0x90c6, 0x0066, 0x0904, 0x5fd9,
-	0x90c6, 0x0071, 0x0904, 0x5fdd, 0x90c6, 0x0074, 0x0904, 0x5fe1,
-	0x90c6, 0x007c, 0x0904, 0x5fe5, 0x90c6, 0x007e, 0x0904, 0x5fe9,
-	0x90c6, 0x0037, 0x0904, 0x5fed, 0x9016, 0x2079, 0x1800, 0xa974,
-	0x9186, 0x00ff, 0x0904, 0x5fcc, 0x9182, 0x0800, 0x1a04, 0x5fcc,
-	0x080c, 0x6166, 0x1198, 0xb804, 0x9084, 0x00ff, 0x9082, 0x0006,
-	0x1268, 0xa894, 0x90c6, 0x006f, 0x0148, 0x080c, 0x99e4, 0x1904,
-	0x5fb5, 0xb8a0, 0x9084, 0xff80, 0x1904, 0x5fb5, 0xa894, 0x90c6,
-	0x006f, 0x0158, 0x90c6, 0x005e, 0x0904, 0x5f15, 0x90c6, 0x0064,
-	0x0904, 0x5f3e, 0x2008, 0x0804, 0x5ed8, 0xa998, 0xa8b0, 0x2040,
-	0x080c, 0x99e4, 0x1120, 0x9182, 0x007f, 0x0a04, 0x5ed8, 0x9186,
-	0x00ff, 0x0904, 0x5ed8, 0x9182, 0x0800, 0x1a04, 0x5ed8, 0xaaa0,
-	0xab9c, 0x7878, 0x9306, 0x1188, 0x787c, 0x0096, 0x924e, 0x1128,
-	0x2208, 0x2310, 0x009e, 0x0804, 0x5ed8, 0x99cc, 0xff00, 0x009e,
-	0x1120, 0x2208, 0x2310, 0x0804, 0x5ed8, 0x080c, 0x46b5, 0x0904,
-	0x5ee1, 0x900e, 0x9016, 0x90c6, 0x4000, 0x1558, 0x0006, 0x080c,
-	0x6455, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x20a9,
-	0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8b4,
-	0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0fa0, 0x20a9,
-	0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8b4,
-	0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0fa0, 0x000e,
-	0x00c8, 0x90c6, 0x4007, 0x1110, 0x2408, 0x00a0, 0x90c6, 0x4008,
-	0x1118, 0x2708, 0x2610, 0x0070, 0x90c6, 0x4009, 0x1108, 0x0050,
-	0x90c6, 0x4006, 0x0138, 0x2001, 0x4005, 0x2009, 0x000a, 0x0010,
-	0x2001, 0x4006, 0xa896, 0xa99a, 0xaa9e, 0x2001, 0x0030, 0x900e,
-	0x0470, 0x080c, 0x9a0f, 0x1130, 0x2001, 0x4005, 0x2009, 0x0003,
-	0x9016, 0x0c80, 0x2b00, 0x6012, 0x080c, 0xbb52, 0x2900, 0x6016,
-	0x6023, 0x0001, 0xa868, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0x0126,
-	0x2091, 0x8000, 0x080c, 0x2fc1, 0x012e, 0x9006, 0x080c, 0x60a3,
-	0x2001, 0x0002, 0x080c, 0x60b7, 0x2009, 0x0002, 0x080c, 0x9b03,
-	0xa8b0, 0xd094, 0x0118, 0xb8c4, 0xc08d, 0xb8c6, 0x9006, 0x9005,
-	0x012e, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x080c, 0x52b1, 0x0118,
-	0x2009, 0x0007, 0x00f8, 0xa998, 0xaeb0, 0x080c, 0x6166, 0x1904,
-	0x5ed3, 0x9186, 0x007f, 0x0130, 0x080c, 0x655d, 0x0118, 0x2009,
-	0x0009, 0x0080, 0x0096, 0x080c, 0x1023, 0x1120, 0x009e, 0x2009,
-	0x0002, 0x0040, 0x2900, 0x009e, 0xa806, 0x080c, 0xb8aa, 0x19b0,
-	0x2009, 0x0003, 0x2001, 0x4005, 0x0804, 0x5eda, 0xa998, 0xaeb0,
-	0x080c, 0x6166, 0x1904, 0x5ed3, 0x0096, 0x080c, 0x1023, 0x1128,
-	0x009e, 0x2009, 0x0002, 0x0804, 0x5f92, 0x2900, 0x009e, 0xa806,
-	0x0096, 0x2048, 0x20a9, 0x002b, 0xb8b4, 0x20e0, 0xb8b8, 0x2098,
-	0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9,
-	0x0008, 0x9080, 0x0006, 0x20a0, 0xbbb8, 0x9398, 0x0006, 0x2398,
-	0x080c, 0x0fa0, 0x009e, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897,
-	0x4000, 0xd684, 0x1168, 0x080c, 0x529d, 0xd0b4, 0x1118, 0xa89b,
-	0x000b, 0x00e0, 0xb800, 0xd08c, 0x0118, 0xa89b, 0x000c, 0x00b0,
-	0x080c, 0x655d, 0x0118, 0xa89b, 0x0009, 0x0080, 0x080c, 0x52b1,
-	0x0118, 0xa89b, 0x0007, 0x0050, 0x080c, 0xb88d, 0x1904, 0x5f0e,
-	0x2009, 0x0003, 0x2001, 0x4005, 0x0804, 0x5eda, 0xa87b, 0x0030,
-	0xa897, 0x4005, 0xa804, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f,
-	0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c,
-	0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x125d, 0x080c, 0x9f73,
-	0x1904, 0x5f0e, 0x2009, 0x0002, 0x08e8, 0x2001, 0x0028, 0x900e,
-	0x0804, 0x5f0f, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001,
-	0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001,
-	0x0029, 0x900e, 0x0804, 0x5f0f, 0x2001, 0x0029, 0x900e, 0x0804,
-	0x5f0f, 0x080c, 0x3565, 0x0804, 0x5f10, 0x080c, 0x4fd2, 0x0804,
-	0x5f10, 0x080c, 0x430b, 0x0804, 0x5f10, 0x080c, 0x4771, 0x0804,
-	0x5f10, 0x080c, 0x4a19, 0x0804, 0x5f10, 0x080c, 0x4c4c, 0x0804,
-	0x5f10, 0x080c, 0x4e3d, 0x0804, 0x5f10, 0x080c, 0x377a, 0x0804,
-	0x5f10, 0x00b6, 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000,
-	0x1608, 0x9182, 0x0800, 0x1258, 0x9188, 0x1000, 0x2104, 0x905d,
-	0x0130, 0x080c, 0x655d, 0x1138, 0x00d9, 0x9006, 0x00b0, 0x2001,
-	0x0028, 0x900e, 0x0090, 0x9082, 0x0006, 0x1240, 0xb900, 0xd1fc,
-	0x0d98, 0x2001, 0x0029, 0x2009, 0x1000, 0x0038, 0x2001, 0x0029,
-	0x900e, 0x0018, 0x2001, 0x0029, 0x900e, 0x9005, 0x00be, 0x0005,
-	0xa877, 0x0000, 0xb8c0, 0x9005, 0x1904, 0x6097, 0xb888, 0x9005,
-	0x1904, 0x6097, 0xb838, 0xb93c, 0x9102, 0x1a04, 0x6097, 0x2b10,
-	0x080c, 0x9a3c, 0x0904, 0x6093, 0x8108, 0xb93e, 0x6212, 0x2900,
-	0x6016, 0x6023, 0x0003, 0x600b, 0xffff, 0x6007, 0x0040, 0xa878,
-	0x605e, 0xa880, 0x9084, 0x00ff, 0x6066, 0xa883, 0x0000, 0xa87c,
-	0xd0ac, 0x05c0, 0xc0dd, 0xa87e, 0xa888, 0x8001, 0x1568, 0x2001,
-	0x00f8, 0x8001, 0xa001, 0xa001, 0xa001, 0x1dd8, 0xa816, 0xa864,
-	0x9094, 0x00f7, 0x9296, 0x0011, 0x11f8, 0x9084, 0x00ff, 0xc0bd,
-	0x601e, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x2001, 0x000f, 0x8001,
-	0x1df0, 0x2001, 0x8004, 0x6003, 0x0004, 0x6046, 0x00f6, 0x2079,
-	0x0380, 0x7818, 0xd0bc, 0x1de8, 0x7833, 0x0010, 0x2c00, 0x7836,
-	0x781b, 0x8080, 0x00fe, 0x0005, 0x080c, 0x1646, 0x601c, 0xc0bd,
-	0x601e, 0x0c38, 0x0006, 0x2001, 0x00e8, 0x8001, 0xa001, 0xa001,
-	0xa001, 0x1dd8, 0x000e, 0xd0b4, 0x190c, 0x1aa5, 0x2001, 0x8004,
-	0x6003, 0x0002, 0x08d0, 0x81ff, 0x1110, 0xb88b, 0x0001, 0x2908,
-	0xb8bc, 0xb9be, 0x9005, 0x1110, 0xb9c2, 0x0020, 0x0096, 0x2048,
-	0xa902, 0x009e, 0x0005, 0x00b6, 0x0126, 0x00c6, 0x0026, 0x2091,
-	0x8000, 0x6210, 0x2258, 0xba00, 0x9005, 0x0110, 0xc285, 0x0008,
-	0xc284, 0xba02, 0x002e, 0x00ce, 0x012e, 0x00be, 0x0005, 0x00b6,
-	0x0126, 0x00c6, 0x2091, 0x8000, 0x6210, 0x2258, 0xba04, 0x0006,
-	0x9086, 0x0006, 0x1170, 0xb89c, 0xd0ac, 0x0158, 0x080c, 0x6559,
-	0x0140, 0x9284, 0xff00, 0x8007, 0x9086, 0x0007, 0x1110, 0x2011,
-	0x0600, 0x000e, 0x9294, 0xff00, 0x9215, 0xba06, 0x0006, 0x9086,
-	0x0006, 0x1120, 0xba90, 0x82ff, 0x090c, 0x0d65, 0x000e, 0x00ce,
-	0x012e, 0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000,
-	0x6210, 0x2258, 0xba04, 0x0006, 0x9086, 0x0006, 0x1168, 0xb89c,
-	0xd0a4, 0x0150, 0x080c, 0x6555, 0x1138, 0x9284, 0x00ff, 0x9086,
-	0x0007, 0x1110, 0x2011, 0x0006, 0x000e, 0x9294, 0x00ff, 0x8007,
-	0x9215, 0xba06, 0x00ce, 0x012e, 0x00be, 0x0005, 0x9182, 0x0800,
-	0x0218, 0x9085, 0x0001, 0x0005, 0x00d6, 0x0026, 0x9190, 0x1000,
-	0x2204, 0x905d, 0x1180, 0x0096, 0x080c, 0x1023, 0x2958, 0x009e,
-	0x0160, 0x2b00, 0x2012, 0xb85c, 0xb8ba, 0xb860, 0xb8b6, 0x9006,
-	0xb8a6, 0x080c, 0x5bfc, 0x9006, 0x0010, 0x9085, 0x0001, 0x002e,
-	0x00de, 0x0005, 0x00b6, 0x0096, 0x0126, 0x2091, 0x8000, 0x0026,
-	0x9182, 0x0800, 0x0218, 0x9085, 0x0001, 0x0458, 0x00d6, 0x9190,
-	0x1000, 0x2204, 0x905d, 0x0518, 0x2013, 0x0000, 0xb8a4, 0x904d,
-	0x0110, 0x080c, 0x1055, 0x00d6, 0x00c6, 0xb8ac, 0x2060, 0x8cff,
-	0x0168, 0x600c, 0x0006, 0x6014, 0x2048, 0x080c, 0xb6c5, 0x0110,
-	0x080c, 0x0fd5, 0x080c, 0x9a65, 0x00ce, 0x0c88, 0x00ce, 0x00de,
-	0x2b48, 0xb8b8, 0xb85e, 0xb8b4, 0xb862, 0x080c, 0x1065, 0x00de,
-	0x9006, 0x002e, 0x012e, 0x009e, 0x00be, 0x0005, 0x0016, 0x9182,
-	0x0800, 0x0218, 0x9085, 0x0001, 0x0030, 0x9188, 0x1000, 0x2104,
-	0x905d, 0x0dc0, 0x9006, 0x001e, 0x0005, 0x00d6, 0x0156, 0x0136,
-	0x0146, 0x9006, 0xb80a, 0xb80e, 0xb800, 0xc08c, 0xb802, 0x080c,
-	0x6f5c, 0x1510, 0xb8a0, 0x9086, 0x007e, 0x0120, 0x080c, 0x99e4,
-	0x11d8, 0x0078, 0x7040, 0xd0e4, 0x01b8, 0x00c6, 0x2061, 0x1951,
-	0x7048, 0x2062, 0x704c, 0x6006, 0x7050, 0x600a, 0x7054, 0x600e,
-	0x00ce, 0x703c, 0x2069, 0x0140, 0x9005, 0x1110, 0x2001, 0x0001,
-	0x6886, 0x2069, 0x1800, 0x68b2, 0x7040, 0xb85e, 0x7048, 0xb862,
-	0x704c, 0xb866, 0x20e1, 0x0000, 0x2099, 0x0276, 0xb8b4, 0x20e8,
-	0xb8b8, 0x9088, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2099,
-	0x027a, 0x9088, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x4003, 0x2069,
-	0x0200, 0x6817, 0x0001, 0x7040, 0xb86a, 0x7144, 0xb96e, 0x7048,
-	0xb872, 0x7050, 0xb876, 0x2069, 0x0200, 0x6817, 0x0000, 0xb8a0,
-	0x9086, 0x007e, 0x1110, 0x7144, 0xb96e, 0x9182, 0x0211, 0x1218,
-	0x2009, 0x0008, 0x0400, 0x9182, 0x0259, 0x1218, 0x2009, 0x0007,
-	0x00d0, 0x9182, 0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0, 0x9182,
-	0x0349, 0x1218, 0x2009, 0x0005, 0x0070, 0x9182, 0x0421, 0x1218,
-	0x2009, 0x0004, 0x0040, 0x9182, 0x0581, 0x1218, 0x2009, 0x0003,
-	0x0010, 0x2009, 0x0002, 0xb992, 0x014e, 0x013e, 0x015e, 0x00de,
-	0x0005, 0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, 0x7034, 0xb896,
-	0x703c, 0xb89a, 0x7054, 0xb89e, 0x0036, 0xbbc4, 0xc384, 0xba00,
-	0x2009, 0x1873, 0x210c, 0xd0bc, 0x0120, 0xd1ec, 0x0110, 0xc2ad,
-	0x0008, 0xc2ac, 0xd0c4, 0x0148, 0xd1e4, 0x0138, 0xc2bd, 0xd0cc,
-	0x0128, 0xd38c, 0x1108, 0xc385, 0x0008, 0xc2bc, 0xba02, 0xbbc6,
-	0x003e, 0x00ee, 0x002e, 0x001e, 0x0005, 0x0096, 0x0126, 0x2091,
-	0x8000, 0xb8a4, 0x904d, 0x0578, 0xa900, 0x81ff, 0x15c0, 0xaa04,
-	0x9282, 0x0010, 0x16c8, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x8906,
-	0x8006, 0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9080,
-	0x0004, 0x2098, 0x2009, 0x0010, 0x20a9, 0x0001, 0x4002, 0x9086,
-	0xffff, 0x0120, 0x8109, 0x1dd0, 0x080c, 0x0d65, 0x3c00, 0x20e8,
-	0x3300, 0x8001, 0x20a0, 0x4604, 0x8210, 0xaa06, 0x01de, 0x01ce,
-	0x014e, 0x013e, 0x0060, 0x080c, 0x1023, 0x0170, 0x2900, 0xb8a6,
-	0xa803, 0x0000, 0x080c, 0x63f1, 0xa807, 0x0001, 0xae12, 0x9085,
-	0x0001, 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0126, 0x2091,
-	0x8000, 0x0096, 0xb8a4, 0x904d, 0x0188, 0xa800, 0x9005, 0x1150,
-	0x080c, 0x6400, 0x1158, 0xa804, 0x908a, 0x0002, 0x0218, 0x8001,
-	0xa806, 0x0020, 0x080c, 0x1055, 0xb8a7, 0x0000, 0x009e, 0x012e,
-	0x0005, 0x0096, 0x00c6, 0xb888, 0x9005, 0x1904, 0x62ea, 0xb8c0,
-	0x904d, 0x0904, 0x62ea, 0x080c, 0x9a3c, 0x0904, 0x62e6, 0x8210,
-	0xba3e, 0xa800, 0xb8c2, 0x9005, 0x1108, 0xb8be, 0x2b00, 0x6012,
-	0x2900, 0x6016, 0x6023, 0x0003, 0x600b, 0xffff, 0x6007, 0x0040,
-	0xa878, 0x605e, 0xa880, 0x9084, 0x00ff, 0x6066, 0xa883, 0x0000,
-	0xa87c, 0xd0ac, 0x01c8, 0xc0dd, 0xa87e, 0xa888, 0x8001, 0x1568,
-	0xa816, 0xa864, 0x9094, 0x00f7, 0x9296, 0x0011, 0x1530, 0x9084,
-	0x00ff, 0xc0bd, 0x601e, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x2001,
-	0x8004, 0x6003, 0x0004, 0x0030, 0x080c, 0x1aa5, 0x2001, 0x8004,
-	0x6003, 0x0002, 0x6046, 0x2001, 0x0010, 0x2c08, 0x080c, 0x9737,
-	0xb838, 0xba3c, 0x9202, 0x0a04, 0x6297, 0x0020, 0x82ff, 0x1110,
-	0xb88b, 0x0001, 0x00ce, 0x009e, 0x0005, 0x080c, 0x1646, 0x601c,
-	0xc0bd, 0x601e, 0x08e0, 0x00b6, 0x0096, 0x0016, 0x20a9, 0x0800,
-	0x900e, 0x0016, 0x080c, 0x6166, 0x1158, 0xb8c0, 0x904d, 0x0140,
-	0x3e00, 0x9086, 0x0002, 0x1118, 0xb800, 0xd0bc, 0x1108, 0x0041,
-	0x001e, 0x8108, 0x1f04, 0x62f9, 0x001e, 0x00be, 0x009e, 0x0005,
-	0x0096, 0x0016, 0xb8c0, 0x904d, 0x0188, 0xa800, 0xb8c2, 0x9005,
-	0x1108, 0xb8be, 0x9006, 0xa802, 0xa867, 0x0103, 0xab7a, 0xa877,
-	0x0000, 0x080c, 0xb9bc, 0x080c, 0x683f, 0x0c60, 0x001e, 0x009e,
-	0x0005, 0x0086, 0x9046, 0xb8c0, 0x904d, 0x0198, 0xa86c, 0x9406,
-	0x1118, 0xa870, 0x9506, 0x0128, 0x2940, 0xa800, 0x904d, 0x0148,
-	0x0ca8, 0xa800, 0x88ff, 0x1110, 0xb8c2, 0x0008, 0xa002, 0xa803,
-	0x0000, 0x008e, 0x0005, 0x901e, 0x0010, 0x2019, 0x0001, 0x00e6,
-	0x0096, 0x00c6, 0x0086, 0x0026, 0x0126, 0x2091, 0x8000, 0x2071,
-	0x19b6, 0x9046, 0x7028, 0x9065, 0x01e8, 0x6014, 0x2068, 0x83ff,
-	0x0120, 0x605c, 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, 0x1118,
-	0xa870, 0x9506, 0x0120, 0x2c40, 0x600c, 0x2060, 0x0c60, 0x600c,
-	0x0006, 0x0066, 0x2830, 0x080c, 0x8f7a, 0x006e, 0x000e, 0x83ff,
-	0x0508, 0x0c08, 0x9046, 0xb8c0, 0x904d, 0x01e0, 0x83ff, 0x0120,
-	0xa878, 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, 0x1118, 0xa870,
-	0x9506, 0x0120, 0x2940, 0xa800, 0x2048, 0x0c70, 0xb8c0, 0xaa00,
-	0x0026, 0x9906, 0x1110, 0xbac2, 0x0008, 0xa202, 0x000e, 0x83ff,
-	0x0108, 0x0c10, 0x002e, 0x008e, 0x00ce, 0x009e, 0x00ee, 0x0005,
-	0x9016, 0x0489, 0x1110, 0x2011, 0x0001, 0x0005, 0x080c, 0x6455,
-	0x0128, 0x080c, 0xb791, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c,
-	0x6455, 0x0128, 0x080c, 0xb727, 0x0010, 0x9085, 0x0001, 0x0005,
-	0x080c, 0x6455, 0x0128, 0x080c, 0xb78e, 0x0010, 0x9085, 0x0001,
-	0x0005, 0x080c, 0x6455, 0x0128, 0x080c, 0xb74b, 0x0010, 0x9085,
-	0x0001, 0x0005, 0x080c, 0x6455, 0x0128, 0x080c, 0xb7bb, 0x0010,
-	0x9085, 0x0001, 0x0005, 0xb8a4, 0x900d, 0x1118, 0x9085, 0x0001,
-	0x0005, 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e,
-	0x810f, 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004,
-	0x2098, 0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128,
-	0x8109, 0x1dd8, 0x9085, 0x0001, 0x0008, 0x9006, 0x01ce, 0x013e,
-	0x0005, 0x0146, 0x01d6, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0004,
-	0x20a0, 0x20a9, 0x0010, 0x2009, 0xffff, 0x4104, 0x01de, 0x014e,
-	0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8, 0x890e, 0x810e, 0x810f,
-	0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0, 0x9080, 0x0004, 0x2098,
-	0x20a9, 0x0001, 0x2009, 0x0010, 0x4002, 0x9606, 0x0128, 0x8109,
-	0x1dd8, 0x9085, 0x0001, 0x0068, 0x0146, 0x01d6, 0x3300, 0x8001,
-	0x20a0, 0x3c00, 0x20e8, 0x2001, 0xffff, 0x4004, 0x01de, 0x014e,
-	0x9006, 0x01ce, 0x013e, 0x0005, 0x0096, 0x0126, 0x2091, 0x8000,
-	0xb8a4, 0x904d, 0x1128, 0x080c, 0x1023, 0x0168, 0x2900, 0xb8a6,
-	0x080c, 0x63f1, 0xa803, 0x0001, 0xa807, 0x0000, 0x9085, 0x0001,
-	0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x0126, 0x2091,
-	0x8000, 0xb8a4, 0x904d, 0x0130, 0xb8a7, 0x0000, 0x080c, 0x1055,
-	0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0xb89c, 0xd0a4, 0x0005,
-	0x00b6, 0x00f6, 0x080c, 0x6f5c, 0x01b0, 0x71c0, 0x81ff, 0x1198,
-	0x71d8, 0xd19c, 0x0180, 0x2001, 0x007e, 0x9080, 0x1000, 0x2004,
-	0x905d, 0x0148, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1118,
-	0xb800, 0xc0ed, 0xb802, 0x2079, 0x1853, 0x7804, 0x00d0, 0x0156,
-	0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x6166, 0x1168, 0xb804,
-	0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118, 0x9086, 0x0006,
-	0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e, 0x8108, 0x1f04, 0x647b,
-	0x015e, 0x080c, 0x651b, 0x0120, 0x2001, 0x1954, 0x200c, 0x0030,
-	0x2079, 0x1853, 0x7804, 0x0030, 0x2009, 0x07d0, 0x2011, 0x64a5,
-	0x080c, 0x807a, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x2011, 0x64a5,
-	0x080c, 0x7fbb, 0x080c, 0x651b, 0x01d8, 0x2001, 0x107e, 0x2004,
-	0x2058, 0xb900, 0xc1ec, 0xb902, 0x080c, 0x6559, 0x0130, 0x2009,
-	0x07d0, 0x2011, 0x64a5, 0x080c, 0x807a, 0x00e6, 0x2071, 0x1800,
-	0x9006, 0x707a, 0x705c, 0x707e, 0x080c, 0x2d99, 0x00ee, 0x04d0,
-	0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x6166,
-	0x1558, 0xb800, 0xd0ec, 0x0540, 0x0046, 0xbaa0, 0x2220, 0x9006,
-	0x2009, 0x0029, 0x080c, 0xd0ce, 0xb800, 0xc0e5, 0xc0ec, 0xb802,
-	0x080c, 0x6555, 0x2001, 0x0707, 0x1128, 0xb804, 0x9084, 0x00ff,
-	0x9085, 0x0700, 0xb806, 0x080c, 0x9746, 0x2019, 0x0029, 0x080c,
-	0x8498, 0x0076, 0x903e, 0x080c, 0x8387, 0x900e, 0x080c, 0xce23,
-	0x007e, 0x004e, 0x080c, 0x9762, 0x001e, 0x8108, 0x1f04, 0x64cd,
-	0x00ce, 0x015e, 0x00be, 0x0005, 0x00b6, 0x6010, 0x2058, 0xb800,
-	0xc0ec, 0xb802, 0x00be, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb800,
-	0x00be, 0xd0ac, 0x0005, 0x6010, 0x00b6, 0x905d, 0x0108, 0xb800,
-	0x00be, 0xd0bc, 0x0005, 0x00b6, 0x00f6, 0x2001, 0x107e, 0x2004,
-	0x905d, 0x0110, 0xb800, 0xd0ec, 0x00fe, 0x00be, 0x0005, 0x0126,
-	0x0026, 0x2091, 0x8000, 0x0006, 0xbaa0, 0x9290, 0x1000, 0x2204,
-	0x9b06, 0x190c, 0x0d65, 0x000e, 0xba00, 0x9005, 0x0110, 0xc2fd,
-	0x0008, 0xc2fc, 0xba02, 0x002e, 0x012e, 0x0005, 0x2011, 0x1836,
-	0x2204, 0xd0cc, 0x0138, 0x2001, 0x1952, 0x200c, 0x2011, 0x654b,
-	0x080c, 0x807a, 0x0005, 0x2011, 0x654b, 0x080c, 0x7fbb, 0x2011,
-	0x1836, 0x2204, 0xc0cc, 0x2012, 0x0005, 0x080c, 0x529d, 0xd0ac,
-	0x0005, 0x080c, 0x529d, 0xd0a4, 0x0005, 0x0016, 0xb904, 0x9184,
-	0x00ff, 0x908e, 0x0006, 0x001e, 0x0005, 0x0016, 0xb904, 0x9184,
-	0xff00, 0x8007, 0x908e, 0x0006, 0x001e, 0x0005, 0x00b6, 0x00f6,
-	0x080c, 0xbdd7, 0x0158, 0x70d8, 0x9084, 0x0028, 0x0138, 0x2001,
-	0x107f, 0x2004, 0x905d, 0x0110, 0xb8c4, 0xd094, 0x00fe, 0x00be,
-	0x0005, 0x0006, 0x0016, 0x0036, 0x0046, 0x0076, 0x00b6, 0x2001,
-	0x1817, 0x203c, 0x9780, 0x3142, 0x203d, 0x97bc, 0xff00, 0x873f,
-	0x9006, 0x2018, 0x2008, 0x9284, 0x8000, 0x0110, 0x2019, 0x0001,
-	0x9294, 0x7fff, 0x2100, 0x9706, 0x0190, 0x91a0, 0x1000, 0x2404,
-	0x905d, 0x0168, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1138,
-	0x83ff, 0x0118, 0xb89c, 0xd0a4, 0x0110, 0x8211, 0x0158, 0x8108,
-	0x83ff, 0x0120, 0x9182, 0x0800, 0x0e28, 0x0068, 0x9182, 0x007e,
-	0x0e08, 0x0048, 0x00be, 0x007e, 0x004e, 0x003e, 0x001e, 0x9085,
-	0x0001, 0x000e, 0x0005, 0x00be, 0x007e, 0x004e, 0x003e, 0x001e,
-	0x9006, 0x000e, 0x0005, 0x2071, 0x1906, 0x7003, 0x0001, 0x7007,
+	0x0014, 0x080c, 0x5b64, 0x0010, 0x080c, 0x55b4, 0x0005, 0x00f6,
+	0x708c, 0x9005, 0x01d8, 0x2011, 0x5b3a, 0x080c, 0x8131, 0x9086,
+	0x0084, 0x1190, 0x080c, 0x5caf, 0x2079, 0x0260, 0x7a30, 0x9296,
+	0x1106, 0x1150, 0x7834, 0x9005, 0x1138, 0x9006, 0x080c, 0x5cda,
+	0x7097, 0x0018, 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005,
+	0x00f6, 0x7097, 0x0019, 0x080c, 0x5c41, 0x2079, 0x0240, 0x7833,
+	0x1106, 0x7837, 0x0000, 0x080c, 0x5caf, 0x2009, 0x026e, 0x2039,
+	0x1d0e, 0x20a9, 0x0040, 0x213e, 0x8738, 0x8108, 0x9186, 0x0280,
+	0x1128, 0x6814, 0x8000, 0x6816, 0x2009, 0x0260, 0x1f04, 0x59c3,
+	0x2039, 0x1d0e, 0x080c, 0x5c92, 0x11e8, 0x2728, 0x2514, 0x8207,
+	0x9084, 0x00ff, 0x8000, 0x2018, 0x9294, 0x00ff, 0x8007, 0x9205,
+	0x202a, 0x705c, 0x2310, 0x8214, 0x92a0, 0x1d0e, 0x2414, 0x938c,
+	0x0001, 0x0118, 0x9294, 0xff00, 0x0018, 0x9294, 0x00ff, 0x8007,
+	0x9215, 0x2222, 0x20a9, 0x0040, 0x2009, 0x024e, 0x270e, 0x8738,
+	0x8108, 0x9186, 0x0260, 0x1128, 0x6810, 0x8000, 0x6812, 0x2009,
+	0x0240, 0x1f04, 0x59f6, 0x60c3, 0x0084, 0x080c, 0x5b64, 0x00fe,
+	0x0005, 0x00f6, 0x708c, 0x9005, 0x01e0, 0x2011, 0x5b3a, 0x080c,
+	0x8131, 0x9086, 0x0084, 0x1198, 0x080c, 0x5caf, 0x2079, 0x0260,
+	0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, 0x1140, 0x7093,
+	0x0001, 0x080c, 0x5c05, 0x7097, 0x001a, 0x0029, 0x0010, 0x708f,
+	0x0000, 0x00fe, 0x0005, 0x9085, 0x0001, 0x080c, 0x5cda, 0x7097,
+	0x001b, 0x080c, 0x97df, 0x080c, 0x5caf, 0x2011, 0x0260, 0x2009,
+	0x0240, 0x748c, 0x9480, 0x0018, 0x9080, 0x0007, 0x9084, 0x03f8,
+	0x8004, 0x20a8, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1150,
+	0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x6814, 0x8000, 0x6816,
+	0x2011, 0x0260, 0x1f04, 0x5a42, 0x60c3, 0x0084, 0x080c, 0x5b64,
+	0x0005, 0x0005, 0x0086, 0x0096, 0x2029, 0x1854, 0x252c, 0x20a9,
+	0x0008, 0x2041, 0x1d0e, 0x20e9, 0x0001, 0x28a0, 0x080c, 0x5caf,
+	0x20e1, 0x0000, 0x2099, 0x026e, 0x4003, 0x20a9, 0x0008, 0x2011,
+	0x0007, 0xd5d4, 0x0108, 0x9016, 0x2800, 0x9200, 0x200c, 0x91a6,
+	0xffff, 0x1148, 0xd5d4, 0x0110, 0x8210, 0x0008, 0x8211, 0x1f04,
+	0x5a74, 0x0804, 0x5ae3, 0x82ff, 0x1160, 0xd5d4, 0x0120, 0x91a6,
+	0x3fff, 0x0d90, 0x0020, 0x91a6, 0x3fff, 0x0904, 0x5ae3, 0x918d,
+	0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4, 0x0110, 0x2019,
+	0x0010, 0x2120, 0xd5d4, 0x0110, 0x8423, 0x0008, 0x8424, 0x1240,
+	0xd5d4, 0x0110, 0x8319, 0x0008, 0x8318, 0x1f04, 0x5a9a, 0x04d8,
+	0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, 0x1f04, 0x5aac, 0x2328,
+	0x8529, 0x92be, 0x0007, 0x0158, 0x0006, 0x2039, 0x0007, 0x2200,
+	0x973a, 0x000e, 0x27a8, 0x95a8, 0x0010, 0x1f04, 0x5abb, 0x755a,
+	0x95c8, 0x3184, 0x292d, 0x95ac, 0x00ff, 0x757e, 0x6532, 0x6536,
+	0x0016, 0x2508, 0x080c, 0x246d, 0x001e, 0x60e7, 0x0000, 0x65ea,
+	0x2018, 0x2304, 0x9405, 0x201a, 0x7083, 0x0001, 0x20e9, 0x0000,
+	0x20a1, 0x024e, 0x20e1, 0x0001, 0x2898, 0x20a9, 0x0008, 0x4003,
+	0x9085, 0x0001, 0x0008, 0x9006, 0x009e, 0x008e, 0x0005, 0x0156,
+	0x01c6, 0x01d6, 0x0136, 0x0146, 0x22a8, 0x20e1, 0x0000, 0x2099,
+	0x026e, 0x20e9, 0x0000, 0x2011, 0x024e, 0x22a0, 0x4003, 0x014e,
+	0x013e, 0x01de, 0x01ce, 0x015e, 0x2118, 0x9026, 0x2001, 0x0007,
+	0x939a, 0x0010, 0x0218, 0x8420, 0x8001, 0x0cd0, 0x2118, 0x84ff,
+	0x0120, 0x939a, 0x0010, 0x8421, 0x1de0, 0x2021, 0x0001, 0x83ff,
+	0x0118, 0x8423, 0x8319, 0x1de8, 0x9238, 0x2029, 0x026e, 0x9528,
+	0x2504, 0x942c, 0x11b8, 0x9405, 0x203a, 0x715a, 0x91a0, 0x3184,
+	0x242d, 0x95ac, 0x00ff, 0x757e, 0x6532, 0x6536, 0x0016, 0x2508,
+	0x080c, 0x246d, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x7083, 0x0001,
+	0x9084, 0x0000, 0x0005, 0x00e6, 0x2071, 0x1800, 0x7087, 0x0000,
+	0x00ee, 0x0005, 0x00e6, 0x00f6, 0x2079, 0x0100, 0x2071, 0x0140,
+	0x080c, 0x5bf4, 0x080c, 0x8f9c, 0x7004, 0x9084, 0x4000, 0x0110,
+	0x080c, 0x2843, 0x0126, 0x2091, 0x8000, 0x2071, 0x1825, 0x2073,
+	0x0000, 0x7840, 0x0026, 0x0016, 0x2009, 0x00f7, 0x080c, 0x5c51,
+	0x001e, 0x9094, 0x0010, 0x9285, 0x0080, 0x7842, 0x7a42, 0x002e,
+	0x012e, 0x00fe, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c,
+	0x27a2, 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x2011,
+	0x19c5, 0x2013, 0x0000, 0x708f, 0x0000, 0x012e, 0x60a3, 0x0056,
+	0x60a7, 0x9575, 0x080c, 0x8f8f, 0x6144, 0xd184, 0x0120, 0x7194,
+	0x918d, 0x2000, 0x0018, 0x7188, 0x918d, 0x1000, 0x2011, 0x196a,
+	0x2112, 0x2009, 0x07d0, 0x2011, 0x5b3a, 0x080c, 0x81f5, 0x0005,
+	0x0016, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x98ad,
+	0x080c, 0x9b52, 0x080c, 0x98c9, 0x2009, 0x00f7, 0x080c, 0x5c51,
+	0x2061, 0x19d4, 0x900e, 0x611a, 0x611e, 0x6172, 0x6176, 0x2061,
+	0x1800, 0x6003, 0x0001, 0x2061, 0x0100, 0x6043, 0x0090, 0x6043,
+	0x0010, 0x2009, 0x196a, 0x200b, 0x0000, 0x2009, 0x002d, 0x2011,
+	0x5bc0, 0x080c, 0x8125, 0x012e, 0x00ce, 0x002e, 0x001e, 0x0005,
+	0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x0471, 0x2071, 0x0100,
+	0x080c, 0x8f9c, 0x2071, 0x0140, 0x7004, 0x9084, 0x4000, 0x0110,
+	0x080c, 0x2843, 0x080c, 0x70b4, 0x0188, 0x080c, 0x70cf, 0x1170,
+	0x080c, 0x73b6, 0x0016, 0x080c, 0x253c, 0x2001, 0x193e, 0x2102,
+	0x001e, 0x080c, 0x73b1, 0x080c, 0x6fdd, 0x0050, 0x2009, 0x0001,
+	0x080c, 0x281f, 0x2001, 0x0001, 0x080c, 0x23c9, 0x080c, 0x5b90,
+	0x012e, 0x000e, 0x00ee, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0bc,
+	0x0158, 0x0026, 0x0036, 0x2011, 0x8017, 0x2001, 0x196a, 0x201c,
+	0x080c, 0x48d1, 0x003e, 0x002e, 0x0005, 0x20a9, 0x0012, 0x20e9,
+	0x0001, 0x20a1, 0x1d80, 0x080c, 0x5caf, 0x20e9, 0x0000, 0x2099,
+	0x026e, 0x0099, 0x20a9, 0x0020, 0x080c, 0x5ca9, 0x2099, 0x0260,
+	0x20a1, 0x1d92, 0x0051, 0x20a9, 0x000e, 0x080c, 0x5cac, 0x2099,
+	0x0260, 0x20a1, 0x1db2, 0x0009, 0x0005, 0x0016, 0x0026, 0x3410,
+	0x3308, 0x2104, 0x8007, 0x2012, 0x8108, 0x8210, 0x1f04, 0x5c29,
+	0x002e, 0x001e, 0x0005, 0x080c, 0x97df, 0x20e1, 0x0001, 0x2099,
+	0x1d00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003,
+	0x0005, 0x080c, 0x97df, 0x080c, 0x5caf, 0x20e1, 0x0000, 0x2099,
+	0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003,
+	0x0005, 0x00c6, 0x0006, 0x2061, 0x0100, 0x810f, 0x2001, 0x1833,
+	0x2004, 0x9005, 0x1138, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff,
+	0x9105, 0x0010, 0x9185, 0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005,
+	0x0016, 0x0046, 0x080c, 0x665c, 0x0158, 0x9006, 0x2020, 0x2009,
+	0x002a, 0x080c, 0xd251, 0x2001, 0x180c, 0x200c, 0xc195, 0x2102,
+	0x2019, 0x002a, 0x900e, 0x080c, 0x2fc2, 0x080c, 0xbf46, 0x0140,
+	0x0036, 0x2019, 0xffff, 0x2021, 0x0007, 0x080c, 0x4a6e, 0x003e,
+	0x004e, 0x001e, 0x0005, 0x080c, 0x5b90, 0x7097, 0x0000, 0x708f,
+	0x0000, 0x0005, 0x0006, 0x2001, 0x180c, 0x2004, 0xd09c, 0x0100,
+	0x000e, 0x0005, 0x0006, 0x0016, 0x0126, 0x2091, 0x8000, 0x2001,
+	0x0101, 0x200c, 0x918d, 0x0006, 0x2102, 0x012e, 0x001e, 0x000e,
+	0x0005, 0x2009, 0x0001, 0x0020, 0x2009, 0x0002, 0x0008, 0x900e,
+	0x6814, 0x9084, 0xffc0, 0x910d, 0x6916, 0x0005, 0x00f6, 0x0156,
+	0x0146, 0x01d6, 0x9006, 0x20a9, 0x0080, 0x20e9, 0x0001, 0x20a1,
+	0x1d00, 0x4004, 0x2079, 0x1d00, 0x7803, 0x2200, 0x7807, 0x00ef,
+	0x780f, 0x00ef, 0x7813, 0x0138, 0x7823, 0xffff, 0x7827, 0xffff,
+	0x01de, 0x014e, 0x015e, 0x00fe, 0x0005, 0x2001, 0x1800, 0x2003,
+	0x0001, 0x0005, 0x2001, 0x1977, 0x0118, 0x2003, 0x0001, 0x0010,
+	0x2003, 0x0000, 0x0005, 0x0156, 0x20a9, 0x0800, 0x2009, 0x1000,
+	0x9006, 0x200a, 0x8108, 0x1f04, 0x5ce9, 0x015e, 0x0005, 0x00d6,
+	0x0036, 0x0156, 0x0136, 0x0146, 0x2069, 0x1853, 0x9006, 0xb802,
+	0xb8c6, 0xb807, 0x0707, 0xb80a, 0xb80e, 0xb812, 0x9198, 0x3184,
+	0x231d, 0x939c, 0x00ff, 0xbb16, 0x0016, 0x0026, 0xb886, 0x080c,
+	0x9b4b, 0x1120, 0x9192, 0x007e, 0x1208, 0xbb86, 0x20a9, 0x0004,
+	0xb8b4, 0x20e8, 0xb9b8, 0x9198, 0x0006, 0x9006, 0x23a0, 0x4004,
+	0x20a9, 0x0004, 0x9198, 0x000a, 0x23a0, 0x4004, 0x002e, 0x001e,
+	0xb83e, 0xb842, 0xb8be, 0xb8c2, 0xb85e, 0xb862, 0xb866, 0xb86a,
+	0xb86f, 0x0100, 0xb872, 0xb876, 0xb87a, 0xb88a, 0xb88e, 0xb893,
+	0x0008, 0xb896, 0xb89a, 0xb89e, 0xb8ae, 0xb9a2, 0x0096, 0xb8a4,
+	0x904d, 0x0110, 0x080c, 0x1054, 0xb8a7, 0x0000, 0x009e, 0x9006,
+	0xb84a, 0x6810, 0xb83a, 0x680c, 0xb846, 0x6814, 0x9084, 0x00ff,
+	0xb842, 0x014e, 0x013e, 0x015e, 0x003e, 0x00de, 0x0005, 0x0126,
+	0x2091, 0x8000, 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000,
+	0x1a04, 0x5dad, 0x9182, 0x0800, 0x1a04, 0x5db1, 0x2001, 0x180c,
+	0x2004, 0x9084, 0x0003, 0x1904, 0x5db7, 0x9188, 0x1000, 0x2104,
+	0x905d, 0x0198, 0xb804, 0x9084, 0x00ff, 0x908e, 0x0006, 0x1188,
+	0xb8a4, 0x900d, 0x1904, 0x5dc9, 0x080c, 0x6123, 0x9006, 0x012e,
+	0x0005, 0x2001, 0x0005, 0x900e, 0x04b8, 0x2001, 0x0028, 0x900e,
+	0x0498, 0x9082, 0x0006, 0x1290, 0x080c, 0x9b4b, 0x1160, 0xb8a0,
+	0x9084, 0xff80, 0x1140, 0xb900, 0xd1fc, 0x0d10, 0x2001, 0x0029,
+	0x2009, 0x1000, 0x0408, 0x2001, 0x0028, 0x00a8, 0x2009, 0x180c,
+	0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0068, 0xd184, 0x0118,
+	0x2001, 0x0004, 0x0040, 0x2001, 0x0029, 0xb900, 0xd1fc, 0x0118,
+	0x2009, 0x1000, 0x0048, 0x900e, 0x0038, 0x2001, 0x0029, 0x900e,
+	0x0018, 0x2001, 0x0029, 0x900e, 0x9005, 0x012e, 0x0005, 0x2001,
+	0x180c, 0x2004, 0xd084, 0x19d0, 0x9188, 0x1000, 0x2104, 0x9065,
+	0x09a8, 0x080c, 0x6660, 0x1990, 0xb800, 0xd0bc, 0x0978, 0x0804,
+	0x5d70, 0x080c, 0x64d4, 0x0904, 0x5d79, 0x0804, 0x5d74, 0x00e6,
+	0x2071, 0x19b8, 0x7004, 0x9086, 0x0002, 0x1128, 0x7030, 0x9080,
+	0x0004, 0x2004, 0x9b06, 0x00ee, 0x0005, 0x00b6, 0x00e6, 0x0126,
+	0x2091, 0x8000, 0xa974, 0x9182, 0x0800, 0x1a04, 0x5e58, 0x9188,
+	0x1000, 0x2104, 0x905d, 0x0904, 0x5e30, 0xb8a0, 0x9086, 0x007f,
+	0x0178, 0x080c, 0x6668, 0x0160, 0xa994, 0x81ff, 0x0130, 0x908e,
+	0x0004, 0x0130, 0x908e, 0x0005, 0x0118, 0x080c, 0x6660, 0x1598,
+	0xa87c, 0xd0fc, 0x01e0, 0xa894, 0x9005, 0x01c8, 0x2060, 0x0026,
+	0x2010, 0x080c, 0xb81a, 0x002e, 0x1120, 0x2001, 0x0008, 0x0804,
+	0x5e5a, 0x6020, 0x9086, 0x000a, 0x0120, 0x2001, 0x0008, 0x0804,
+	0x5e5a, 0x601a, 0x6003, 0x0008, 0x2900, 0x6016, 0x0058, 0x080c,
+	0x9b76, 0x05e8, 0x2b00, 0x6012, 0x2900, 0x6016, 0x600b, 0xffff,
+	0x6023, 0x000a, 0x2009, 0x0003, 0x080c, 0x9c6a, 0x9006, 0x0458,
+	0x2001, 0x0028, 0x0438, 0x9082, 0x0006, 0x1290, 0x080c, 0x9b4b,
+	0x1160, 0xb8a0, 0x9084, 0xff80, 0x1140, 0xb900, 0xd1fc, 0x0900,
+	0x2001, 0x0029, 0x2009, 0x1000, 0x00a8, 0x2001, 0x0028, 0x0090,
+	0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0050,
+	0xd184, 0x0118, 0x2001, 0x0004, 0x0028, 0x2001, 0x0029, 0x0010,
+	0x2001, 0x0029, 0x9005, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2001,
+	0x002c, 0x0cc0, 0x00f6, 0x00b6, 0x0126, 0x2091, 0x8000, 0xa8e0,
+	0x9005, 0x1550, 0xa8dc, 0x9082, 0x0101, 0x1630, 0xa8c8, 0x9005,
+	0x1518, 0xa8c4, 0x9082, 0x0101, 0x12f8, 0xa974, 0x2079, 0x1800,
+	0x9182, 0x0800, 0x12e8, 0x7830, 0x9084, 0x0003, 0x1130, 0xaa98,
+	0xab94, 0xa878, 0x9084, 0x0007, 0x00ea, 0x7930, 0xd18c, 0x0118,
+	0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010,
+	0x2001, 0x0029, 0x900e, 0x0038, 0x2001, 0x002c, 0x900e, 0x0018,
+	0x2001, 0x0029, 0x900e, 0x9006, 0x0008, 0x9005, 0x012e, 0x00be,
+	0x00fe, 0x0005, 0x5eef, 0x5eaa, 0x5ec1, 0x5eef, 0x5eef, 0x5eef,
+	0x5eef, 0x5eef, 0x2100, 0x9082, 0x007e, 0x1278, 0x080c, 0x6209,
+	0x0148, 0x9046, 0xb810, 0x9306, 0x1904, 0x5ef7, 0xb814, 0x9206,
+	0x15f0, 0x0028, 0xbb12, 0xba16, 0x0010, 0x080c, 0x478b, 0x0150,
+	0x04b0, 0x080c, 0x6269, 0x1598, 0xb810, 0x9306, 0x1580, 0xb814,
+	0x9206, 0x1568, 0x080c, 0x9b76, 0x0530, 0x2b00, 0x6012, 0x080c,
+	0xbcc0, 0x2900, 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, 0xa878,
+	0x9086, 0x0001, 0x1170, 0x080c, 0x3003, 0x9006, 0x080c, 0x61a6,
+	0x2001, 0x0002, 0x080c, 0x61ba, 0x2001, 0x0200, 0xb86e, 0xb893,
+	0x0002, 0x2009, 0x0003, 0x080c, 0x9c6a, 0x9006, 0x0068, 0x2001,
+	0x0001, 0x900e, 0x0038, 0x2001, 0x002c, 0x900e, 0x0018, 0x2001,
+	0x0028, 0x900e, 0x9005, 0x0000, 0x012e, 0x00be, 0x00fe, 0x0005,
+	0x00b6, 0x00f6, 0x00e6, 0x0126, 0x2091, 0x8000, 0xa894, 0x90c6,
+	0x0015, 0x0904, 0x60cc, 0x90c6, 0x0056, 0x0904, 0x60d0, 0x90c6,
+	0x0066, 0x0904, 0x60d4, 0x90c6, 0x0067, 0x0904, 0x60d8, 0x90c6,
+	0x0068, 0x0904, 0x60dc, 0x90c6, 0x0071, 0x0904, 0x60e0, 0x90c6,
+	0x0074, 0x0904, 0x60e4, 0x90c6, 0x007c, 0x0904, 0x60e8, 0x90c6,
+	0x007e, 0x0904, 0x60ec, 0x90c6, 0x0037, 0x0904, 0x60f0, 0x9016,
+	0x2079, 0x1800, 0xa974, 0x9186, 0x00ff, 0x0904, 0x60c7, 0x9182,
+	0x0800, 0x1a04, 0x60c7, 0x080c, 0x6269, 0x1198, 0xb804, 0x9084,
+	0x00ff, 0x9082, 0x0006, 0x1268, 0xa894, 0x90c6, 0x006f, 0x0148,
+	0x080c, 0x9b4b, 0x1904, 0x60b0, 0xb8a0, 0x9084, 0xff80, 0x1904,
+	0x60b0, 0xa894, 0x90c6, 0x006f, 0x0158, 0x90c6, 0x005e, 0x0904,
+	0x6010, 0x90c6, 0x0064, 0x0904, 0x6039, 0x2008, 0x0804, 0x5fd3,
+	0xa998, 0xa8b0, 0x2040, 0x080c, 0x9b4b, 0x1120, 0x9182, 0x007f,
+	0x0a04, 0x5fd3, 0x9186, 0x00ff, 0x0904, 0x5fd3, 0x9182, 0x0800,
+	0x1a04, 0x5fd3, 0xaaa0, 0xab9c, 0x7878, 0x9306, 0x1188, 0x787c,
+	0x0096, 0x924e, 0x1128, 0x2208, 0x2310, 0x009e, 0x0804, 0x5fd3,
+	0x99cc, 0xff00, 0x009e, 0x1120, 0x2208, 0x2310, 0x0804, 0x5fd3,
+	0x080c, 0x478b, 0x0904, 0x5fdc, 0x900e, 0x9016, 0x90c6, 0x4000,
+	0x1558, 0x0006, 0x080c, 0x6558, 0x1108, 0xc185, 0xb800, 0xd0bc,
+	0x0108, 0xc18d, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080,
+	0x0031, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098,
+	0x080c, 0x0f9f, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080,
+	0x0035, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098,
+	0x080c, 0x0f9f, 0x000e, 0x00c8, 0x90c6, 0x4007, 0x1110, 0x2408,
+	0x00a0, 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0070, 0x90c6,
+	0x4009, 0x1108, 0x0050, 0x90c6, 0x4006, 0x0138, 0x2001, 0x4005,
+	0x2009, 0x000a, 0x0010, 0x2001, 0x4006, 0xa896, 0xa99a, 0xaa9e,
+	0x2001, 0x0030, 0x900e, 0x0470, 0x080c, 0x9b76, 0x1130, 0x2001,
+	0x4005, 0x2009, 0x0003, 0x9016, 0x0c80, 0x2b00, 0x6012, 0x080c,
+	0xbcc0, 0x2900, 0x6016, 0x6023, 0x0001, 0xa868, 0xd88c, 0x0108,
+	0xc0f5, 0xa86a, 0x0126, 0x2091, 0x8000, 0x080c, 0x3003, 0x012e,
+	0x9006, 0x080c, 0x61a6, 0x2001, 0x0002, 0x080c, 0x61ba, 0x2009,
+	0x0002, 0x080c, 0x9c6a, 0xa8b0, 0xd094, 0x0118, 0xb8c4, 0xc08d,
+	0xb8c6, 0x9006, 0x9005, 0x012e, 0x00ee, 0x00fe, 0x00be, 0x0005,
+	0x080c, 0x539a, 0x0118, 0x2009, 0x0007, 0x00f8, 0xa998, 0xaeb0,
+	0x080c, 0x6269, 0x1904, 0x5fce, 0x9186, 0x007f, 0x0130, 0x080c,
+	0x6660, 0x0118, 0x2009, 0x0009, 0x0080, 0x0096, 0x080c, 0x1022,
+	0x1120, 0x009e, 0x2009, 0x0002, 0x0040, 0x2900, 0x009e, 0xa806,
+	0x080c, 0xba18, 0x19b0, 0x2009, 0x0003, 0x2001, 0x4005, 0x0804,
+	0x5fd5, 0xa998, 0xaeb0, 0x080c, 0x6269, 0x1904, 0x5fce, 0x0096,
+	0x080c, 0x1022, 0x1128, 0x009e, 0x2009, 0x0002, 0x0804, 0x608d,
+	0x2900, 0x009e, 0xa806, 0x0096, 0x2048, 0x20a9, 0x002b, 0xb8b4,
+	0x20e0, 0xb8b8, 0x2098, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002,
+	0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080, 0x0006, 0x20a0, 0xbbb8,
+	0x9398, 0x0006, 0x2398, 0x080c, 0x0f9f, 0x009e, 0xa87b, 0x0000,
+	0xa883, 0x0000, 0xa897, 0x4000, 0xd684, 0x1168, 0x080c, 0x5386,
+	0xd0b4, 0x1118, 0xa89b, 0x000b, 0x00e0, 0xb800, 0xd08c, 0x0118,
+	0xa89b, 0x000c, 0x00b0, 0x080c, 0x6660, 0x0118, 0xa89b, 0x0009,
+	0x0080, 0x080c, 0x539a, 0x0118, 0xa89b, 0x0007, 0x0050, 0x080c,
+	0xb9fb, 0x1904, 0x6009, 0x2009, 0x0003, 0x2001, 0x4005, 0x0804,
+	0x5fd5, 0xa87b, 0x0030, 0xa897, 0x4005, 0xa804, 0x8006, 0x8006,
+	0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009,
+	0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041,
+	0x1266, 0x080c, 0xa0da, 0x1904, 0x6009, 0x2009, 0x0002, 0x08e8,
+	0x2001, 0x0028, 0x900e, 0x0804, 0x600a, 0x2009, 0x180c, 0x210c,
+	0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001,
+	0x0004, 0x0010, 0x2001, 0x0029, 0x900e, 0x0804, 0x600a, 0x2001,
+	0x0029, 0x900e, 0x0804, 0x600a, 0x080c, 0x35a7, 0x0804, 0x600b,
+	0x080c, 0x50bb, 0x0804, 0x600b, 0x080c, 0x434d, 0x0804, 0x600b,
+	0x080c, 0x43c6, 0x0804, 0x600b, 0x080c, 0x4422, 0x0804, 0x600b,
+	0x080c, 0x4847, 0x0804, 0x600b, 0x080c, 0x4af3, 0x0804, 0x600b,
+	0x080c, 0x4d26, 0x0804, 0x600b, 0x080c, 0x4f1f, 0x0804, 0x600b,
+	0x080c, 0x37bc, 0x0804, 0x600b, 0x00b6, 0xa974, 0xae78, 0x9684,
+	0x3fff, 0x9082, 0x4000, 0x1608, 0x9182, 0x0800, 0x1258, 0x9188,
+	0x1000, 0x2104, 0x905d, 0x0130, 0x080c, 0x6660, 0x1138, 0x00d9,
+	0x9006, 0x00b0, 0x2001, 0x0028, 0x900e, 0x0090, 0x9082, 0x0006,
+	0x1240, 0xb900, 0xd1fc, 0x0d98, 0x2001, 0x0029, 0x2009, 0x1000,
+	0x0038, 0x2001, 0x0029, 0x900e, 0x0018, 0x2001, 0x0029, 0x900e,
+	0x9005, 0x00be, 0x0005, 0xa877, 0x0000, 0xb8c0, 0x9005, 0x1904,
+	0x619a, 0xb888, 0x9005, 0x1904, 0x619a, 0xb838, 0xb93c, 0x9102,
+	0x1a04, 0x619a, 0x2b10, 0x080c, 0x9ba3, 0x0904, 0x6196, 0x8108,
+	0xb93e, 0x6212, 0x2900, 0x6016, 0x6023, 0x0003, 0x600b, 0xffff,
+	0x6007, 0x0040, 0xa878, 0x605e, 0xa880, 0x9084, 0x00ff, 0x6066,
+	0xa883, 0x0000, 0xa87c, 0xd0ac, 0x05c0, 0xc0dd, 0xa87e, 0xa888,
+	0x8001, 0x1568, 0x2001, 0x00f8, 0x8001, 0xa001, 0xa001, 0xa001,
+	0x1dd8, 0xa816, 0xa864, 0x9094, 0x00f7, 0x9296, 0x0011, 0x11f8,
+	0x9084, 0x00ff, 0xc0bd, 0x601e, 0xa8ac, 0xaab0, 0xa836, 0xaa3a,
+	0x2001, 0x000f, 0x8001, 0x1df0, 0x2001, 0x8004, 0x6003, 0x0004,
+	0x6046, 0x00f6, 0x2079, 0x0380, 0x7818, 0xd0bc, 0x1de8, 0x7833,
+	0x0010, 0x2c00, 0x7836, 0x781b, 0x8080, 0x00fe, 0x0005, 0x080c,
+	0x164f, 0x601c, 0xc0bd, 0x601e, 0x0c38, 0x0006, 0x2001, 0x00e8,
+	0x8001, 0xa001, 0xa001, 0xa001, 0x1dd8, 0x000e, 0xd0b4, 0x190c,
+	0x1ad2, 0x2001, 0x8004, 0x6003, 0x0002, 0x08d0, 0x81ff, 0x1110,
+	0xb88b, 0x0001, 0x2908, 0xb8bc, 0xb9be, 0x9005, 0x1110, 0xb9c2,
+	0x0020, 0x0096, 0x2048, 0xa902, 0x009e, 0x0005, 0x00b6, 0x0126,
+	0x00c6, 0x0026, 0x2091, 0x8000, 0x6210, 0x2258, 0xba00, 0x9005,
+	0x0110, 0xc285, 0x0008, 0xc284, 0xba02, 0x002e, 0x00ce, 0x012e,
+	0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6210,
+	0x2258, 0xba04, 0x0006, 0x9086, 0x0006, 0x1170, 0xb89c, 0xd0ac,
+	0x0158, 0x080c, 0x665c, 0x0140, 0x9284, 0xff00, 0x8007, 0x9086,
+	0x0007, 0x1110, 0x2011, 0x0600, 0x000e, 0x9294, 0xff00, 0x9215,
+	0xba06, 0x0006, 0x9086, 0x0006, 0x1120, 0xba90, 0x82ff, 0x090c,
+	0x0d65, 0x000e, 0x00ce, 0x012e, 0x00be, 0x0005, 0x00b6, 0x0126,
+	0x00c6, 0x2091, 0x8000, 0x6210, 0x2258, 0xba04, 0x0006, 0x9086,
+	0x0006, 0x1168, 0xb89c, 0xd0a4, 0x0150, 0x080c, 0x6658, 0x1138,
+	0x9284, 0x00ff, 0x9086, 0x0007, 0x1110, 0x2011, 0x0006, 0x000e,
+	0x9294, 0x00ff, 0x8007, 0x9215, 0xba06, 0x00ce, 0x012e, 0x00be,
+	0x0005, 0x9182, 0x0800, 0x0218, 0x9085, 0x0001, 0x0005, 0x00d6,
+	0x0026, 0x9190, 0x1000, 0x2204, 0x905d, 0x1180, 0x0096, 0x080c,
+	0x1022, 0x2958, 0x009e, 0x0160, 0x2b00, 0x2012, 0xb85c, 0xb8ba,
+	0xb860, 0xb8b6, 0x9006, 0xb8a6, 0x080c, 0x5cef, 0x9006, 0x0010,
+	0x9085, 0x0001, 0x002e, 0x00de, 0x0005, 0x00b6, 0x0096, 0x0126,
+	0x2091, 0x8000, 0x0026, 0x9182, 0x0800, 0x0218, 0x9085, 0x0001,
+	0x0458, 0x00d6, 0x9190, 0x1000, 0x2204, 0x905d, 0x0518, 0x2013,
+	0x0000, 0xb8a4, 0x904d, 0x0110, 0x080c, 0x1054, 0x00d6, 0x00c6,
+	0xb8ac, 0x2060, 0x8cff, 0x0168, 0x600c, 0x0006, 0x6014, 0x2048,
+	0x080c, 0xb82c, 0x0110, 0x080c, 0x0fd4, 0x080c, 0x9bcc, 0x00ce,
+	0x0c88, 0x00ce, 0x00de, 0x2b48, 0xb8b8, 0xb85e, 0xb8b4, 0xb862,
+	0x080c, 0x1064, 0x00de, 0x9006, 0x002e, 0x012e, 0x009e, 0x00be,
+	0x0005, 0x0016, 0x9182, 0x0800, 0x0218, 0x9085, 0x0001, 0x0030,
+	0x9188, 0x1000, 0x2104, 0x905d, 0x0dc0, 0x9006, 0x001e, 0x0005,
+	0x00d6, 0x0156, 0x0136, 0x0146, 0x9006, 0xb80a, 0xb80e, 0xb800,
+	0xc08c, 0xb802, 0x080c, 0x70ac, 0x1510, 0xb8a0, 0x9086, 0x007e,
+	0x0120, 0x080c, 0x9b4b, 0x11d8, 0x0078, 0x7040, 0xd0e4, 0x01b8,
+	0x00c6, 0x2061, 0x1953, 0x7048, 0x2062, 0x704c, 0x6006, 0x7050,
+	0x600a, 0x7054, 0x600e, 0x00ce, 0x703c, 0x2069, 0x0140, 0x9005,
+	0x1110, 0x2001, 0x0001, 0x6886, 0x2069, 0x1800, 0x68b2, 0x7040,
+	0xb85e, 0x7048, 0xb862, 0x704c, 0xb866, 0x20e1, 0x0000, 0x2099,
+	0x0276, 0xb8b4, 0x20e8, 0xb8b8, 0x9088, 0x000a, 0x21a0, 0x20a9,
+	0x0004, 0x4003, 0x2099, 0x027a, 0x9088, 0x0006, 0x21a0, 0x20a9,
+	0x0004, 0x4003, 0x2069, 0x0200, 0x6817, 0x0001, 0x7040, 0xb86a,
+	0x7144, 0xb96e, 0x7048, 0xb872, 0x7050, 0xb876, 0x2069, 0x0200,
+	0x6817, 0x0000, 0xb8a0, 0x9086, 0x007e, 0x1110, 0x7144, 0xb96e,
+	0x9182, 0x0211, 0x1218, 0x2009, 0x0008, 0x0400, 0x9182, 0x0259,
+	0x1218, 0x2009, 0x0007, 0x00d0, 0x9182, 0x02c1, 0x1218, 0x2009,
+	0x0006, 0x00a0, 0x9182, 0x0349, 0x1218, 0x2009, 0x0005, 0x0070,
+	0x9182, 0x0421, 0x1218, 0x2009, 0x0004, 0x0040, 0x9182, 0x0581,
+	0x1218, 0x2009, 0x0003, 0x0010, 0x2009, 0x0002, 0xb992, 0x014e,
+	0x013e, 0x015e, 0x00de, 0x0005, 0x0016, 0x0026, 0x00e6, 0x2071,
+	0x0260, 0x7034, 0xb896, 0x703c, 0xb89a, 0x7054, 0xb89e, 0x0036,
+	0xbbc4, 0xc384, 0xba00, 0x2009, 0x1873, 0x210c, 0xd0bc, 0x0120,
+	0xd1ec, 0x0110, 0xc2ad, 0x0008, 0xc2ac, 0xd0c4, 0x0148, 0xd1e4,
+	0x0138, 0xc2bd, 0xd0cc, 0x0128, 0xd38c, 0x1108, 0xc385, 0x0008,
+	0xc2bc, 0xba02, 0xbbc6, 0x003e, 0x00ee, 0x002e, 0x001e, 0x0005,
+	0x0096, 0x0126, 0x2091, 0x8000, 0xb8a4, 0x904d, 0x0578, 0xa900,
+	0x81ff, 0x15c0, 0xaa04, 0x9282, 0x0010, 0x16c8, 0x0136, 0x0146,
+	0x01c6, 0x01d6, 0x8906, 0x8006, 0x8007, 0x908c, 0x003f, 0x21e0,
+	0x9084, 0xffc0, 0x9080, 0x0004, 0x2098, 0x2009, 0x0010, 0x20a9,
+	0x0001, 0x4002, 0x9086, 0xffff, 0x0120, 0x8109, 0x1dd0, 0x080c,
+	0x0d65, 0x3c00, 0x20e8, 0x3300, 0x8001, 0x20a0, 0x4604, 0x8210,
+	0xaa06, 0x01de, 0x01ce, 0x014e, 0x013e, 0x0060, 0x080c, 0x1022,
+	0x0170, 0x2900, 0xb8a6, 0xa803, 0x0000, 0x080c, 0x64f4, 0xa807,
+	0x0001, 0xae12, 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0x9006,
+	0x0cd8, 0x0126, 0x2091, 0x8000, 0x0096, 0xb8a4, 0x904d, 0x0188,
+	0xa800, 0x9005, 0x1150, 0x080c, 0x6503, 0x1158, 0xa804, 0x908a,
+	0x0002, 0x0218, 0x8001, 0xa806, 0x0020, 0x080c, 0x1054, 0xb8a7,
+	0x0000, 0x009e, 0x012e, 0x0005, 0x0096, 0x00c6, 0xb888, 0x9005,
+	0x1904, 0x63ed, 0xb8c0, 0x904d, 0x0904, 0x63ed, 0x080c, 0x9ba3,
+	0x0904, 0x63e9, 0x8210, 0xba3e, 0xa800, 0xb8c2, 0x9005, 0x1108,
+	0xb8be, 0x2b00, 0x6012, 0x2900, 0x6016, 0x6023, 0x0003, 0x600b,
+	0xffff, 0x6007, 0x0040, 0xa878, 0x605e, 0xa880, 0x9084, 0x00ff,
+	0x6066, 0xa883, 0x0000, 0xa87c, 0xd0ac, 0x01c8, 0xc0dd, 0xa87e,
+	0xa888, 0x8001, 0x1568, 0xa816, 0xa864, 0x9094, 0x00f7, 0x9296,
+	0x0011, 0x1530, 0x9084, 0x00ff, 0xc0bd, 0x601e, 0xa8ac, 0xaab0,
+	0xa836, 0xaa3a, 0x2001, 0x8004, 0x6003, 0x0004, 0x0030, 0x080c,
+	0x1ad2, 0x2001, 0x8004, 0x6003, 0x0002, 0x6046, 0x2001, 0x0010,
+	0x2c08, 0x080c, 0x989e, 0xb838, 0xba3c, 0x9202, 0x0a04, 0x639a,
+	0x0020, 0x82ff, 0x1110, 0xb88b, 0x0001, 0x00ce, 0x009e, 0x0005,
+	0x080c, 0x164f, 0x601c, 0xc0bd, 0x601e, 0x08e0, 0x00b6, 0x0096,
+	0x0016, 0x20a9, 0x0800, 0x900e, 0x0016, 0x080c, 0x6269, 0x1158,
+	0xb8c0, 0x904d, 0x0140, 0x3e00, 0x9086, 0x0002, 0x1118, 0xb800,
+	0xd0bc, 0x1108, 0x0041, 0x001e, 0x8108, 0x1f04, 0x63fc, 0x001e,
+	0x00be, 0x009e, 0x0005, 0x0096, 0x0016, 0xb8c0, 0x904d, 0x0188,
+	0xa800, 0xb8c2, 0x9005, 0x1108, 0xb8be, 0x9006, 0xa802, 0xa867,
+	0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xbb2a, 0x080c, 0x698f,
+	0x0c60, 0x001e, 0x009e, 0x0005, 0x0086, 0x9046, 0xb8c0, 0x904d,
+	0x0198, 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0128, 0x2940,
+	0xa800, 0x904d, 0x0148, 0x0ca8, 0xa800, 0x88ff, 0x1110, 0xb8c2,
+	0x0008, 0xa002, 0xa803, 0x0000, 0x008e, 0x0005, 0x901e, 0x0010,
+	0x2019, 0x0001, 0x00e6, 0x0096, 0x00c6, 0x0086, 0x0026, 0x0126,
+	0x2091, 0x8000, 0x2071, 0x19b8, 0x9046, 0x7028, 0x9065, 0x01e8,
+	0x6014, 0x2068, 0x83ff, 0x0120, 0x605c, 0x9606, 0x0158, 0x0030,
+	0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0120, 0x2c40, 0x600c,
+	0x2060, 0x0c60, 0x600c, 0x0006, 0x0066, 0x2830, 0x080c, 0x90f5,
+	0x006e, 0x000e, 0x83ff, 0x0508, 0x0c08, 0x9046, 0xb8c0, 0x904d,
+	0x01e0, 0x83ff, 0x0120, 0xa878, 0x9606, 0x0158, 0x0030, 0xa86c,
+	0x9406, 0x1118, 0xa870, 0x9506, 0x0120, 0x2940, 0xa800, 0x2048,
+	0x0c70, 0xb8c0, 0xaa00, 0x0026, 0x9906, 0x1110, 0xbac2, 0x0008,
+	0xa202, 0x000e, 0x83ff, 0x0108, 0x0c10, 0x002e, 0x008e, 0x00ce,
+	0x009e, 0x00ee, 0x0005, 0x9016, 0x0489, 0x1110, 0x2011, 0x0001,
+	0x0005, 0x080c, 0x6558, 0x0128, 0x080c, 0xb8ed, 0x0010, 0x9085,
+	0x0001, 0x0005, 0x080c, 0x6558, 0x0128, 0x080c, 0xb88e, 0x0010,
+	0x9085, 0x0001, 0x0005, 0x080c, 0x6558, 0x0128, 0x080c, 0xb8ea,
+	0x0010, 0x9085, 0x0001, 0x0005, 0x080c, 0x6558, 0x0128, 0x080c,
+	0xb8ad, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, 0x6558, 0x0128,
+	0x080c, 0xb92e, 0x0010, 0x9085, 0x0001, 0x0005, 0xb8a4, 0x900d,
+	0x1118, 0x9085, 0x0001, 0x0005, 0x0136, 0x01c6, 0xa800, 0x9005,
+	0x11b8, 0x890e, 0x810e, 0x810f, 0x9184, 0x003f, 0x20e0, 0x9184,
+	0xffc0, 0x9080, 0x0004, 0x2098, 0x20a9, 0x0001, 0x2009, 0x0010,
+	0x4002, 0x9606, 0x0128, 0x8109, 0x1dd8, 0x9085, 0x0001, 0x0008,
+	0x9006, 0x01ce, 0x013e, 0x0005, 0x0146, 0x01d6, 0xa860, 0x20e8,
+	0xa85c, 0x9080, 0x0004, 0x20a0, 0x20a9, 0x0010, 0x2009, 0xffff,
+	0x4104, 0x01de, 0x014e, 0x0136, 0x01c6, 0xa800, 0x9005, 0x11b8,
+	0x890e, 0x810e, 0x810f, 0x9184, 0x003f, 0x20e0, 0x9184, 0xffc0,
+	0x9080, 0x0004, 0x2098, 0x20a9, 0x0001, 0x2009, 0x0010, 0x4002,
+	0x9606, 0x0128, 0x8109, 0x1dd8, 0x9085, 0x0001, 0x0068, 0x0146,
+	0x01d6, 0x3300, 0x8001, 0x20a0, 0x3c00, 0x20e8, 0x2001, 0xffff,
+	0x4004, 0x01de, 0x014e, 0x9006, 0x01ce, 0x013e, 0x0005, 0x0096,
+	0x0126, 0x2091, 0x8000, 0xb8a4, 0x904d, 0x1128, 0x080c, 0x1022,
+	0x0168, 0x2900, 0xb8a6, 0x080c, 0x64f4, 0xa803, 0x0001, 0xa807,
+	0x0000, 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8,
+	0x0096, 0x0126, 0x2091, 0x8000, 0xb8a4, 0x904d, 0x0130, 0xb8a7,
+	0x0000, 0x080c, 0x1054, 0x9085, 0x0001, 0x012e, 0x009e, 0x0005,
+	0xb89c, 0xd0a4, 0x0005, 0x00b6, 0x00f6, 0x080c, 0x70ac, 0x01b0,
+	0x71c0, 0x81ff, 0x1198, 0x71d8, 0xd19c, 0x0180, 0x2001, 0x007e,
+	0x9080, 0x1000, 0x2004, 0x905d, 0x0148, 0xb804, 0x9084, 0x00ff,
+	0x9086, 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x2079, 0x1853,
+	0x7804, 0x00d0, 0x0156, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c,
+	0x6269, 0x1168, 0xb804, 0x9084, 0xff00, 0x8007, 0x9096, 0x0004,
+	0x0118, 0x9086, 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e,
+	0x8108, 0x1f04, 0x657e, 0x015e, 0x080c, 0x661e, 0x0120, 0x2001,
+	0x1956, 0x200c, 0x0030, 0x2079, 0x1853, 0x7804, 0x0030, 0x2009,
+	0x07d0, 0x2011, 0x65a8, 0x080c, 0x81f5, 0x00fe, 0x00be, 0x0005,
+	0x00b6, 0x2011, 0x65a8, 0x080c, 0x8131, 0x080c, 0x661e, 0x01d8,
+	0x2001, 0x107e, 0x2004, 0x2058, 0xb900, 0xc1ec, 0xb902, 0x080c,
+	0x665c, 0x0130, 0x2009, 0x07d0, 0x2011, 0x65a8, 0x080c, 0x81f5,
+	0x00e6, 0x2071, 0x1800, 0x9006, 0x707a, 0x705c, 0x707e, 0x080c,
+	0x2ddb, 0x00ee, 0x04d0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e,
+	0x0016, 0x080c, 0x6269, 0x1558, 0xb800, 0xd0ec, 0x0540, 0x0046,
+	0xbaa0, 0x2220, 0x9006, 0x2009, 0x0029, 0x080c, 0xd251, 0xb800,
+	0xc0e5, 0xc0ec, 0xb802, 0x080c, 0x6658, 0x2001, 0x0707, 0x1128,
+	0xb804, 0x9084, 0x00ff, 0x9085, 0x0700, 0xb806, 0x080c, 0x98ad,
+	0x2019, 0x0029, 0x080c, 0x8613, 0x0076, 0x903e, 0x080c, 0x8502,
+	0x900e, 0x080c, 0xcfa6, 0x007e, 0x004e, 0x080c, 0x98c9, 0x001e,
+	0x8108, 0x1f04, 0x65d0, 0x00ce, 0x015e, 0x00be, 0x0005, 0x00b6,
+	0x6010, 0x2058, 0xb800, 0xc0ec, 0xb802, 0x00be, 0x0005, 0x7810,
+	0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ac, 0x0005, 0x6010, 0x00b6,
+	0x905d, 0x0108, 0xb800, 0x00be, 0xd0bc, 0x0005, 0x00b6, 0x00f6,
+	0x2001, 0x107e, 0x2004, 0x905d, 0x0110, 0xb800, 0xd0ec, 0x00fe,
+	0x00be, 0x0005, 0x0126, 0x0026, 0x2091, 0x8000, 0x0006, 0xbaa0,
+	0x9290, 0x1000, 0x2204, 0x9b06, 0x190c, 0x0d65, 0x000e, 0xba00,
+	0x9005, 0x0110, 0xc2fd, 0x0008, 0xc2fc, 0xba02, 0x002e, 0x012e,
+	0x0005, 0x2011, 0x1836, 0x2204, 0xd0cc, 0x0138, 0x2001, 0x1954,
+	0x200c, 0x2011, 0x664e, 0x080c, 0x81f5, 0x0005, 0x2011, 0x664e,
+	0x080c, 0x8131, 0x2011, 0x1836, 0x2204, 0xc0cc, 0x2012, 0x0005,
+	0x080c, 0x5386, 0xd0ac, 0x0005, 0x080c, 0x5386, 0xd0a4, 0x0005,
+	0x0016, 0xb904, 0x9184, 0x00ff, 0x908e, 0x0006, 0x001e, 0x0005,
+	0x0016, 0xb904, 0x9184, 0xff00, 0x8007, 0x908e, 0x0006, 0x001e,
+	0x0005, 0x00b6, 0x00f6, 0x080c, 0xbf46, 0x0158, 0x70d8, 0x9084,
+	0x0028, 0x0138, 0x2001, 0x107f, 0x2004, 0x905d, 0x0110, 0xb8c4,
+	0xd094, 0x00fe, 0x00be, 0x0005, 0x0006, 0x0016, 0x0036, 0x0046,
+	0x0076, 0x00b6, 0x2001, 0x1817, 0x203c, 0x9780, 0x3184, 0x203d,
+	0x97bc, 0xff00, 0x873f, 0x9006, 0x2018, 0x2008, 0x9284, 0x8000,
+	0x0110, 0x2019, 0x0001, 0x9294, 0x7fff, 0x2100, 0x9706, 0x0190,
+	0x91a0, 0x1000, 0x2404, 0x905d, 0x0168, 0xb804, 0x9084, 0x00ff,
+	0x9086, 0x0006, 0x1138, 0x83ff, 0x0118, 0xb89c, 0xd0a4, 0x0110,
+	0x8211, 0x0158, 0x8108, 0x83ff, 0x0120, 0x9182, 0x0800, 0x0e28,
+	0x0068, 0x9182, 0x007e, 0x0e08, 0x0048, 0x00be, 0x007e, 0x004e,
+	0x003e, 0x001e, 0x9085, 0x0001, 0x000e, 0x0005, 0x00be, 0x007e,
+	0x004e, 0x003e, 0x001e, 0x9006, 0x000e, 0x0005, 0x0046, 0x0056,
+	0x0076, 0x00b6, 0x2100, 0x9084, 0x7fff, 0x9080, 0x1000, 0x2004,
+	0x905d, 0x0130, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x0550,
+	0x9184, 0x8000, 0x0580, 0x2001, 0x1817, 0x203c, 0x9780, 0x3184,
+	0x203d, 0x97bc, 0xff00, 0x873f, 0x9006, 0x2020, 0x2400, 0x9706,
+	0x01a0, 0x94a8, 0x1000, 0x2504, 0x905d, 0x0178, 0xb804, 0x9084,
+	0x00ff, 0x9086, 0x0006, 0x1148, 0xb89c, 0xd0a4, 0x0130, 0xb814,
+	0x9206, 0x1118, 0xb810, 0x9306, 0x0128, 0x8420, 0x9482, 0x0800,
+	0x0e28, 0x0048, 0x918c, 0x7fff, 0x00be, 0x007e, 0x005e, 0x004e,
+	0x9085, 0x0001, 0x0005, 0x918c, 0x7fff, 0x00be, 0x007e, 0x005e,
+	0x004e, 0x9006, 0x0005, 0x2071, 0x1906, 0x7003, 0x0001, 0x7007,
 	0x0000, 0x9006, 0x7012, 0x7016, 0x701a, 0x701e, 0x700a, 0x7046,
 	0x2001, 0x1919, 0x2003, 0x0000, 0x0005, 0x0016, 0x00e6, 0x2071,
-	0x191a, 0x900e, 0x710a, 0x080c, 0x529d, 0xd0fc, 0x1140, 0x080c,
-	0x529d, 0x900e, 0xd09c, 0x0108, 0x8108, 0x7102, 0x0400, 0x2001,
-	0x1873, 0x200c, 0x9184, 0x0007, 0x9006, 0x0002, 0x65e7, 0x65e7,
-	0x65e7, 0x65e7, 0x65e7, 0x65fe, 0x660c, 0x65e7, 0x7003, 0x0003,
+	0x191a, 0x900e, 0x710a, 0x080c, 0x5386, 0xd0fc, 0x1140, 0x080c,
+	0x5386, 0x900e, 0xd09c, 0x0108, 0x8108, 0x7102, 0x0400, 0x2001,
+	0x1873, 0x200c, 0x9184, 0x0007, 0x9006, 0x0002, 0x6737, 0x6737,
+	0x6737, 0x6737, 0x6737, 0x674e, 0x675c, 0x6737, 0x7003, 0x0003,
 	0x2009, 0x1874, 0x210c, 0x9184, 0xff00, 0x8007, 0x9005, 0x1110,
 	0x2001, 0x0002, 0x7006, 0x0018, 0x7003, 0x0005, 0x0c88, 0x00ee,
 	0x001e, 0x0005, 0x00e6, 0x2071, 0x0050, 0x684c, 0x9005, 0x1150,
 	0x00e6, 0x2071, 0x1906, 0x7028, 0xc085, 0x702a, 0x00ee, 0x9085,
-	0x0001, 0x0488, 0x6844, 0x9005, 0x0158, 0x080c, 0x72ce, 0x6a60,
+	0x0001, 0x0488, 0x6844, 0x9005, 0x0158, 0x080c, 0x741e, 0x6a60,
 	0x9200, 0x7002, 0x6864, 0x9101, 0x7006, 0x9006, 0x7012, 0x7016,
 	0x6860, 0x7002, 0x6864, 0x7006, 0x6868, 0x700a, 0x686c, 0x700e,
 	0x6844, 0x9005, 0x1110, 0x7012, 0x7016, 0x684c, 0x701a, 0x701c,
 	0x9085, 0x0040, 0x701e, 0x7037, 0x0019, 0x702b, 0x0001, 0x00e6,
 	0x2071, 0x1906, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0x700b,
 	0x0000, 0x00ee, 0x9006, 0x00ee, 0x0005, 0xa868, 0xd0fc, 0x11d8,
-	0x00e6, 0x0026, 0x2001, 0x191a, 0x2004, 0x9005, 0x0904, 0x6844,
-	0xa87c, 0xd0bc, 0x1904, 0x6844, 0xa978, 0xa874, 0x9105, 0x1904,
-	0x6844, 0x2001, 0x191a, 0x2004, 0x0002, 0x6844, 0x6698, 0x66d4,
-	0x66d4, 0x6844, 0x66d4, 0x0005, 0xa868, 0xd0fc, 0x1500, 0x00e6,
-	0x0026, 0x2009, 0x191a, 0x210c, 0x81ff, 0x0904, 0x6844, 0xa87c,
-	0xd0cc, 0x0904, 0x6844, 0xa880, 0x9084, 0x00ff, 0x9086, 0x0001,
-	0x1904, 0x6844, 0x9186, 0x0003, 0x0904, 0x66d4, 0x9186, 0x0005,
-	0x0904, 0x66d4, 0xa84f, 0x8021, 0xa853, 0x0017, 0x0028, 0x0005,
+	0x00e6, 0x0026, 0x2001, 0x191a, 0x2004, 0x9005, 0x0904, 0x6994,
+	0xa87c, 0xd0bc, 0x1904, 0x6994, 0xa978, 0xa874, 0x9105, 0x1904,
+	0x6994, 0x2001, 0x191a, 0x2004, 0x0002, 0x6994, 0x67e8, 0x6824,
+	0x6824, 0x6994, 0x6824, 0x0005, 0xa868, 0xd0fc, 0x1500, 0x00e6,
+	0x0026, 0x2009, 0x191a, 0x210c, 0x81ff, 0x0904, 0x6994, 0xa87c,
+	0xd0cc, 0x0904, 0x6994, 0xa880, 0x9084, 0x00ff, 0x9086, 0x0001,
+	0x1904, 0x6994, 0x9186, 0x0003, 0x0904, 0x6824, 0x9186, 0x0005,
+	0x0904, 0x6824, 0xa84f, 0x8021, 0xa853, 0x0017, 0x0028, 0x0005,
 	0xa84f, 0x8020, 0xa853, 0x0016, 0x2071, 0x1906, 0x701c, 0x9005,
-	0x1904, 0x69e7, 0x0e04, 0x6a32, 0x2071, 0x0000, 0xa84c, 0x7082,
+	0x1904, 0x6b37, 0x0e04, 0x6b82, 0x2071, 0x0000, 0xa84c, 0x7082,
 	0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091,
-	0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11b5, 0x2071,
+	0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11be, 0x2071,
 	0x1800, 0x2011, 0x0001, 0xa804, 0x900d, 0x702c, 0x1158, 0xa802,
-	0x2900, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7ed6, 0x002e,
+	0x2900, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x804c, 0x002e,
 	0x00ee, 0x0005, 0x0096, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900,
 	0x81ff, 0x1dc8, 0x009e, 0x0c58, 0xa84f, 0x0000, 0x00f6, 0x2079,
 	0x0050, 0x2071, 0x1906, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904,
-	0x67c9, 0x782c, 0x908c, 0x0780, 0x190c, 0x6b59, 0x8004, 0x8004,
-	0x8004, 0x9084, 0x0003, 0x0002, 0x66f2, 0x67c9, 0x6717, 0x6764,
+	0x6919, 0x782c, 0x908c, 0x0780, 0x190c, 0x6ca9, 0x8004, 0x8004,
+	0x8004, 0x9084, 0x0003, 0x0002, 0x6842, 0x6919, 0x6867, 0x68b4,
 	0x080c, 0x0d65, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d,
-	0x1170, 0x2071, 0x19d2, 0x703c, 0x9005, 0x1328, 0x2001, 0x191b,
+	0x1170, 0x2071, 0x19d4, 0x703c, 0x9005, 0x1328, 0x2001, 0x191b,
 	0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016,
 	0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8,
-	0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7ed6, 0x0c10, 0x2071,
+	0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x804c, 0x0c10, 0x2071,
 	0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x15a8, 0x7824, 0x00e6,
 	0x2071, 0x0040, 0x712c, 0xd19c, 0x1170, 0x2009, 0x182f, 0x210c,
 	0x918a, 0x0040, 0x0240, 0x7022, 0x2001, 0x1dc0, 0x200c, 0x8108,
 	0x2102, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900,
-	0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x7ed6, 0x782c, 0x9094,
-	0x0780, 0x190c, 0x6b59, 0xd0a4, 0x19c8, 0x2071, 0x19d2, 0x703c,
+	0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x804c, 0x782c, 0x9094,
+	0x0780, 0x190c, 0x6ca9, 0xd0a4, 0x19c8, 0x2071, 0x19d4, 0x703c,
 	0x9005, 0x1328, 0x2001, 0x191b, 0x2004, 0x8005, 0x703e, 0x00fe,
 	0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802,
 	0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be,
-	0x080c, 0x7ed6, 0x0804, 0x671e, 0x0096, 0x00e6, 0x7824, 0x2048,
+	0x080c, 0x804c, 0x0804, 0x686e, 0x0096, 0x00e6, 0x7824, 0x2048,
 	0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000,
-	0x70be, 0x080c, 0x7ed6, 0x782c, 0x9094, 0x0780, 0x190c, 0x6b59,
-	0xd0a4, 0x1d60, 0x00ee, 0x782c, 0x9094, 0x0780, 0x190c, 0x6b59,
+	0x70be, 0x080c, 0x804c, 0x782c, 0x9094, 0x0780, 0x190c, 0x6ca9,
+	0xd0a4, 0x1d60, 0x00ee, 0x782c, 0x9094, 0x0780, 0x190c, 0x6ca9,
 	0xd09c, 0x11a0, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x1560,
-	0x2071, 0x19d2, 0x703c, 0x9005, 0x1328, 0x2001, 0x191b, 0x2004,
+	0x2071, 0x19d4, 0x703c, 0x9005, 0x1328, 0x2001, 0x191b, 0x2004,
 	0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x009e, 0x2908,
 	0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902,
-	0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1170, 0x2071, 0x19d2,
+	0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1170, 0x2071, 0x19d4,
 	0x703c, 0x9005, 0x1328, 0x2001, 0x191b, 0x2004, 0x8005, 0x703e,
 	0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c,
 	0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e,
-	0x70bc, 0x9200, 0x70be, 0x080c, 0x7ed6, 0x00fe, 0x002e, 0x00ee,
+	0x70bc, 0x9200, 0x70be, 0x080c, 0x804c, 0x00fe, 0x002e, 0x00ee,
 	0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a,
 	0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904,
-	0x681e, 0x782c, 0x9094, 0x0780, 0x190c, 0x6b59, 0xd09c, 0x1198,
+	0x696e, 0x782c, 0x9094, 0x0780, 0x190c, 0x6ca9, 0xd09c, 0x1198,
 	0x701c, 0x904d, 0x0180, 0x7010, 0x8001, 0x7012, 0x1108, 0x701a,
 	0xa800, 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, 0x0780, 0x190c,
-	0x6b59, 0xd09c, 0x0d68, 0x782c, 0x9094, 0x0780, 0x190c, 0x6b59,
+	0x6ca9, 0xd09c, 0x0d68, 0x782c, 0x9094, 0x0780, 0x190c, 0x6ca9,
 	0xd0a4, 0x01b0, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c,
-	0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x7ed6,
-	0x782c, 0x9094, 0x0780, 0x190c, 0x6b59, 0xd0a4, 0x1d60, 0x00ee,
-	0x2071, 0x19d2, 0x703c, 0x9005, 0x1328, 0x2001, 0x191b, 0x2004,
+	0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x804c,
+	0x782c, 0x9094, 0x0780, 0x190c, 0x6ca9, 0xd0a4, 0x1d60, 0x00ee,
+	0x2071, 0x19d4, 0x703c, 0x9005, 0x1328, 0x2001, 0x191b, 0x2004,
 	0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x00e6, 0x2071,
 	0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900,
-	0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7ed6,
-	0x00ee, 0x0804, 0x67d9, 0xa868, 0xd0fc, 0x1560, 0x0096, 0xa804,
-	0xa807, 0x0000, 0x904d, 0x190c, 0x0fd5, 0x009e, 0x0018, 0xa868,
+	0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x804c,
+	0x00ee, 0x0804, 0x6929, 0xa868, 0xd0fc, 0x1560, 0x0096, 0xa804,
+	0xa807, 0x0000, 0x904d, 0x190c, 0x0fd4, 0x009e, 0x0018, 0xa868,
 	0xd0fc, 0x1500, 0x00e6, 0x0026, 0xa84f, 0x0000, 0x00f6, 0x2079,
 	0x0050, 0x2071, 0x1906, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904,
-	0x6961, 0x782c, 0x908c, 0x0780, 0x190c, 0x6b59, 0x8004, 0x8004,
-	0x8004, 0x9084, 0x0003, 0x0002, 0x6863, 0x6961, 0x687e, 0x68f0,
+	0x6ab1, 0x782c, 0x908c, 0x0780, 0x190c, 0x6ca9, 0x8004, 0x8004,
+	0x8004, 0x9084, 0x0003, 0x0002, 0x69b3, 0x6ab1, 0x69ce, 0x6a40,
 	0x080c, 0x0d65, 0x0005, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804,
 	0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c,
 	0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e,
-	0x70bc, 0x9200, 0x70be, 0x080c, 0x7ed6, 0x0c60, 0x2071, 0x1800,
-	0x2900, 0x7822, 0xa804, 0x900d, 0x1904, 0x68df, 0x7830, 0xd0dc,
+	0x70bc, 0x9200, 0x70be, 0x080c, 0x804c, 0x0c60, 0x2071, 0x1800,
+	0x2900, 0x7822, 0xa804, 0x900d, 0x1904, 0x6a2f, 0x7830, 0xd0dc,
 	0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7824, 0x00e6, 0x2071,
 	0x0040, 0x712c, 0xd19c, 0x1170, 0x2009, 0x182f, 0x210c, 0x918a,
 	0x0040, 0x0240, 0x7022, 0x2001, 0x1dc0, 0x200c, 0x8108, 0x2102,
 	0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e,
-	0x70bc, 0x8000, 0x70be, 0x080c, 0x7ed6, 0x782c, 0x9094, 0x0780,
-	0x190c, 0x6b59, 0xd0a4, 0x19c8, 0x0e04, 0x68d6, 0x7838, 0x7938,
+	0x70bc, 0x8000, 0x70be, 0x080c, 0x804c, 0x782c, 0x9094, 0x0780,
+	0x190c, 0x6ca9, 0xd0a4, 0x19c8, 0x0e04, 0x6a26, 0x7838, 0x7938,
 	0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013,
 	0x00de, 0x2001, 0x1917, 0x200c, 0xc184, 0x2102, 0x2091, 0x4080,
-	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11b5, 0x2009, 0x1919,
+	0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11be, 0x2009, 0x1919,
 	0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2001, 0x1917,
 	0x200c, 0xc185, 0x2102, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016,
 	0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8,
-	0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7ed6, 0x0804, 0x688d,
+	0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x804c, 0x0804, 0x69dd,
 	0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802,
-	0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x7ed6, 0x782c,
-	0x9094, 0x0780, 0x190c, 0x6b59, 0xd0a4, 0x1d60, 0x00ee, 0x0e04,
-	0x6934, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000,
+	0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x804c, 0x782c,
+	0x9094, 0x0780, 0x190c, 0x6ca9, 0xd0a4, 0x1d60, 0x00ee, 0x0e04,
+	0x6a84, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000,
 	0x6836, 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, 0x7046, 0x2091,
-	0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11b5, 0x2009,
-	0x1919, 0x200b, 0x0000, 0x782c, 0x9094, 0x0780, 0x190c, 0x6b59,
+	0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11be, 0x2009,
+	0x1919, 0x200b, 0x0000, 0x782c, 0x9094, 0x0780, 0x190c, 0x6ca9,
 	0xd09c, 0x1170, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x11e0,
 	0x00fe, 0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x0c58,
 	0x009e, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a,
 	0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1120,
 	0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c,
 	0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e,
-	0x70bc, 0x9200, 0x70be, 0x080c, 0x7ed6, 0x00fe, 0x002e, 0x00ee,
+	0x70bc, 0x9200, 0x70be, 0x080c, 0x804c, 0x00fe, 0x002e, 0x00ee,
 	0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a,
 	0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904,
-	0x69d2, 0x782c, 0x9094, 0x0780, 0x190c, 0x6b59, 0xd09c, 0x11b0,
+	0x6b22, 0x782c, 0x9094, 0x0780, 0x190c, 0x6ca9, 0xd09c, 0x11b0,
 	0x701c, 0x904d, 0x0198, 0xa84c, 0x9005, 0x1180, 0x7010, 0x8001,
 	0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c,
-	0x9094, 0x0780, 0x190c, 0x6b59, 0xd09c, 0x0d50, 0x782c, 0x9094,
-	0x0780, 0x190c, 0x6b59, 0xd0a4, 0x05c8, 0x00e6, 0x7824, 0x2048,
+	0x9094, 0x0780, 0x190c, 0x6ca9, 0xd09c, 0x0d50, 0x782c, 0x9094,
+	0x0780, 0x190c, 0x6ca9, 0xd0a4, 0x05c8, 0x00e6, 0x7824, 0x2048,
 	0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000,
-	0x70be, 0x080c, 0x7ed6, 0x782c, 0x9094, 0x0780, 0x190c, 0x6b59,
-	0xd0a4, 0x1d60, 0x00ee, 0x0e04, 0x69cb, 0x7838, 0x7938, 0x910e,
+	0x70be, 0x080c, 0x804c, 0x782c, 0x9094, 0x0780, 0x190c, 0x6ca9,
+	0xd0a4, 0x1d60, 0x00ee, 0x0e04, 0x6b1b, 0x7838, 0x7938, 0x910e,
 	0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de,
 	0x7044, 0xc084, 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
-	0xd084, 0x190c, 0x11b5, 0x2009, 0x1919, 0x200b, 0x0000, 0x00fe,
+	0xd084, 0x190c, 0x11be, 0x2009, 0x1919, 0x200b, 0x0000, 0x00fe,
 	0x002e, 0x00ee, 0x0005, 0x7044, 0xc085, 0x7046, 0x00fe, 0x002e,
 	0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148,
 	0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc,
-	0x9200, 0x70be, 0x080c, 0x7ed6, 0x00ee, 0x0804, 0x6971, 0x2071,
+	0x9200, 0x70be, 0x080c, 0x804c, 0x00ee, 0x0804, 0x6ac1, 0x2071,
 	0x1906, 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018,
 	0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804,
-	0x900d, 0x1128, 0x1e04, 0x6a12, 0x002e, 0x00ee, 0x0005, 0x2071,
+	0x900d, 0x1128, 0x1e04, 0x6b62, 0x002e, 0x00ee, 0x0005, 0x2071,
 	0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900,
-	0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7ed6,
-	0x0e04, 0x69fc, 0x2071, 0x1906, 0x701c, 0x2048, 0xa84c, 0x900d,
+	0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x804c,
+	0x0e04, 0x6b4c, 0x2071, 0x1906, 0x701c, 0x2048, 0xa84c, 0x900d,
 	0x0d18, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086,
 	0x7036, 0xa870, 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004,
-	0xd084, 0x190c, 0x11b5, 0x2071, 0x1906, 0x080c, 0x6b45, 0x002e,
+	0xd084, 0x190c, 0x11be, 0x2071, 0x1906, 0x080c, 0x6c95, 0x002e,
 	0x00ee, 0x0005, 0x2071, 0x1906, 0xa803, 0x0000, 0x2908, 0x7010,
 	0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008,
 	0x711e, 0x2148, 0xa804, 0x900d, 0x1118, 0x002e, 0x00ee, 0x0005,
 	0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210,
 	0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c,
-	0x7ed6, 0x002e, 0x00ee, 0x0005, 0x0006, 0xa87c, 0x0006, 0xa867,
+	0x804c, 0x002e, 0x00ee, 0x0005, 0x0006, 0xa87c, 0x0006, 0xa867,
 	0x0103, 0x20a9, 0x001c, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001d,
 	0x20a0, 0x9006, 0x4004, 0x000e, 0x9084, 0x00ff, 0xa87e, 0x000e,
-	0xa87a, 0xa982, 0x0005, 0x2071, 0x1906, 0x7004, 0x0002, 0x6a7d,
-	0x6a7e, 0x6b44, 0x6a7e, 0x0d65, 0x6b44, 0x0005, 0x2001, 0x191a,
-	0x2004, 0x0002, 0x6a88, 0x6a88, 0x6add, 0x6ade, 0x6a88, 0x6ade,
-	0x0126, 0x2091, 0x8000, 0x1e0c, 0x6b64, 0x701c, 0x904d, 0x01e0,
-	0xa84c, 0x9005, 0x01d8, 0x0e04, 0x6aac, 0xa94c, 0x2071, 0x0000,
+	0xa87a, 0xa982, 0x0005, 0x2071, 0x1906, 0x7004, 0x0002, 0x6bcd,
+	0x6bce, 0x6c94, 0x6bce, 0x0d65, 0x6c94, 0x0005, 0x2001, 0x191a,
+	0x2004, 0x0002, 0x6bd8, 0x6bd8, 0x6c2d, 0x6c2e, 0x6bd8, 0x6c2e,
+	0x0126, 0x2091, 0x8000, 0x1e0c, 0x6cb4, 0x701c, 0x904d, 0x01e0,
+	0xa84c, 0x9005, 0x01d8, 0x0e04, 0x6bfc, 0xa94c, 0x2071, 0x0000,
 	0x7182, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a,
-	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11b5,
-	0x2071, 0x1906, 0x080c, 0x6b45, 0x012e, 0x0470, 0x2001, 0x005b,
-	0x2004, 0x9094, 0x0780, 0x190c, 0x6b59, 0xd09c, 0x2071, 0x1906,
+	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11be,
+	0x2071, 0x1906, 0x080c, 0x6c95, 0x012e, 0x0470, 0x2001, 0x005b,
+	0x2004, 0x9094, 0x0780, 0x190c, 0x6ca9, 0xd09c, 0x2071, 0x1906,
 	0x1510, 0x2071, 0x1906, 0x700f, 0x0001, 0xa964, 0x9184, 0x00ff,
 	0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108,
 	0x710e, 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, 0x2071,
 	0x1906, 0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e,
 	0x9005, 0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x00d6, 0x2008,
-	0x2069, 0x19d2, 0x683c, 0x9005, 0x0760, 0x0158, 0x9186, 0x0003,
-	0x0540, 0x2001, 0x1814, 0x2004, 0x2009, 0x1b1c, 0x210c, 0x9102,
+	0x2069, 0x19d4, 0x683c, 0x9005, 0x0760, 0x0158, 0x9186, 0x0003,
+	0x0540, 0x2001, 0x1814, 0x2004, 0x2009, 0x1b1e, 0x210c, 0x9102,
 	0x1500, 0x0126, 0x2091, 0x8000, 0x2069, 0x0050, 0x693c, 0x6838,
-	0x9106, 0x0190, 0x0e04, 0x6b10, 0x2069, 0x0000, 0x6837, 0x8040,
+	0x9106, 0x0190, 0x0e04, 0x6c60, 0x2069, 0x0000, 0x6837, 0x8040,
 	0x6833, 0x0012, 0x6883, 0x8040, 0x2091, 0x4080, 0x2001, 0x0089,
-	0x2004, 0xd084, 0x190c, 0x11b5, 0x2069, 0x19d2, 0x683f, 0xffff,
-	0x012e, 0x00de, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x6bda, 0x701c,
+	0x2004, 0xd084, 0x190c, 0x11be, 0x2069, 0x19d4, 0x683f, 0xffff,
+	0x012e, 0x00de, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x6d2a, 0x701c,
 	0x904d, 0x0540, 0x2001, 0x005b, 0x2004, 0x9094, 0x0780, 0x15c9,
 	0xd09c, 0x1500, 0x2071, 0x1906, 0x700f, 0x0001, 0xa964, 0x9184,
 	0x00ff, 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101,
@@ -3228,236 +3270,236 @@ unsigned short risc_code01[] = { 
 	0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005,
 	0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x0126, 0x2091, 0x8000,
 	0x701c, 0x904d, 0x0160, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e,
-	0x9005, 0x1108, 0x701a, 0x012e, 0x080c, 0x1055, 0x0005, 0x012e,
-	0x0005, 0x2091, 0x8000, 0x0e04, 0x6b5b, 0x0006, 0x0016, 0x2001,
+	0x9005, 0x1108, 0x701a, 0x012e, 0x080c, 0x1054, 0x0005, 0x012e,
+	0x0005, 0x2091, 0x8000, 0x0e04, 0x6cab, 0x0006, 0x0016, 0x2001,
 	0x8004, 0x0006, 0x0804, 0x0d6e, 0x0096, 0x00f6, 0x2079, 0x0050,
 	0x7044, 0xd084, 0x01e0, 0xc084, 0x7046, 0x7838, 0x7938, 0x910e,
 	0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de,
-	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11b5,
+	0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11be,
 	0x2009, 0x1919, 0x200b, 0x0000, 0x00fe, 0x009e, 0x0005, 0x782c,
 	0x9094, 0x0780, 0x1971, 0xd0a4, 0x0db8, 0x2009, 0x1919, 0x2104,
 	0x8000, 0x200a, 0x9082, 0x000f, 0x0e78, 0x00e6, 0x2071, 0x1800,
 	0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1170, 0x2009,
 	0x182f, 0x210c, 0x918a, 0x0040, 0x0240, 0x7022, 0x2001, 0x1dc0,
 	0x200c, 0x8108, 0x2102, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c,
-	0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x7ed6,
-	0x782c, 0x9094, 0x0780, 0x190c, 0x6b59, 0xd0a4, 0x19c8, 0x7838,
+	0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x804c,
+	0x782c, 0x9094, 0x0780, 0x190c, 0x6ca9, 0xd0a4, 0x19c8, 0x7838,
 	0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833,
 	0x0013, 0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084,
-	0x190c, 0x11b5, 0x2009, 0x1919, 0x200b, 0x0000, 0x00ee, 0x00fe,
+	0x190c, 0x11be, 0x2009, 0x1919, 0x200b, 0x0000, 0x00ee, 0x00fe,
 	0x009e, 0x0005, 0x00f6, 0x2079, 0x0050, 0x7044, 0xd084, 0x01b8,
 	0xc084, 0x7046, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069,
 	0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001,
-	0x0089, 0x2004, 0xd084, 0x190c, 0x11b5, 0x00fe, 0x0005, 0x782c,
-	0x9094, 0x0780, 0x190c, 0x6b59, 0xd0a4, 0x0db8, 0x00e6, 0x2071,
+	0x0089, 0x2004, 0xd084, 0x190c, 0x11be, 0x00fe, 0x0005, 0x782c,
+	0x9094, 0x0780, 0x190c, 0x6ca9, 0xd0a4, 0x0db8, 0x00e6, 0x2071,
 	0x1800, 0x7824, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc,
-	0x8000, 0x70be, 0x080c, 0x7ed6, 0x782c, 0x9094, 0x0780, 0x190c,
-	0x6b59, 0xd0a4, 0x1d70, 0x00d6, 0x2069, 0x0050, 0x693c, 0x2069,
-	0x191a, 0x6808, 0x690a, 0x2069, 0x19d2, 0x9102, 0x1118, 0x683c,
+	0x8000, 0x70be, 0x080c, 0x804c, 0x782c, 0x9094, 0x0780, 0x190c,
+	0x6ca9, 0xd0a4, 0x1d70, 0x00d6, 0x2069, 0x0050, 0x693c, 0x2069,
+	0x191a, 0x6808, 0x690a, 0x2069, 0x19d4, 0x9102, 0x1118, 0x683c,
 	0x9005, 0x1328, 0x2001, 0x191b, 0x200c, 0x810d, 0x693e, 0x00de,
 	0x00ee, 0x00fe, 0x0005, 0x7094, 0x908a, 0x0029, 0x1a0c, 0x0d65,
-	0x9082, 0x001d, 0x003b, 0x0026, 0x2011, 0x1e00, 0x080c, 0x282b,
-	0x002e, 0x0005, 0x6d02, 0x6c8c, 0x6ca8, 0x6cd0, 0x6cf1, 0x6d31,
-	0x6d43, 0x6ca8, 0x6d19, 0x6c47, 0x6c75, 0x6c46, 0x0005, 0x00d6,
+	0x9082, 0x001d, 0x003b, 0x0026, 0x2011, 0x1e00, 0x080c, 0x286d,
+	0x002e, 0x0005, 0x6e52, 0x6ddc, 0x6df8, 0x6e20, 0x6e41, 0x6e81,
+	0x6e93, 0x6df8, 0x6e69, 0x6d97, 0x6dc5, 0x6d96, 0x0005, 0x00d6,
 	0x2069, 0x0200, 0x6804, 0x9005, 0x1180, 0x6808, 0x9005, 0x1518,
-	0x7097, 0x0028, 0x2069, 0x195e, 0x2d04, 0x7002, 0x080c, 0x709d,
+	0x7097, 0x0028, 0x2069, 0x1960, 0x2d04, 0x7002, 0x080c, 0x71ed,
 	0x6028, 0x9085, 0x0600, 0x602a, 0x00b0, 0x7097, 0x0028, 0x2069,
-	0x195e, 0x2d04, 0x7002, 0x6028, 0x9085, 0x0600, 0x602a, 0x00e6,
-	0x0036, 0x0046, 0x0056, 0x2071, 0x1a3a, 0x080c, 0x193f, 0x005e,
+	0x1960, 0x2d04, 0x7002, 0x6028, 0x9085, 0x0600, 0x602a, 0x00e6,
+	0x0036, 0x0046, 0x0056, 0x2071, 0x1a3c, 0x080c, 0x195f, 0x005e,
 	0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, 0x2069, 0x0200,
 	0x6804, 0x9005, 0x1178, 0x6808, 0x9005, 0x1160, 0x7097, 0x0028,
-	0x2069, 0x195e, 0x2d04, 0x7002, 0x080c, 0x713f, 0x6028, 0x9085,
+	0x2069, 0x1960, 0x2d04, 0x7002, 0x080c, 0x728f, 0x6028, 0x9085,
 	0x0600, 0x602a, 0x00de, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c,
-	0x27f1, 0x000e, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x6db4, 0xd1d4,
+	0x2833, 0x000e, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x6f04, 0xd1d4,
 	0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x7097, 0x0020, 0x080c,
-	0x6db4, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, 0x001f, 0x0005,
-	0x2001, 0x0088, 0x080c, 0x27f1, 0x6124, 0xd1cc, 0x11d8, 0xd1dc,
+	0x6f04, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, 0x001f, 0x0005,
+	0x2001, 0x0088, 0x080c, 0x2833, 0x6124, 0xd1cc, 0x11d8, 0xd1dc,
 	0x11b0, 0xd1e4, 0x1188, 0x9184, 0x1e00, 0x11c8, 0x60e3, 0x0001,
-	0x600c, 0xc0b4, 0x600e, 0x080c, 0x6f88, 0x2001, 0x0080, 0x080c,
-	0x27f1, 0x7097, 0x0028, 0x0058, 0x7097, 0x001e, 0x0040, 0x7097,
+	0x600c, 0xc0b4, 0x600e, 0x080c, 0x70d8, 0x2001, 0x0080, 0x080c,
+	0x2833, 0x7097, 0x0028, 0x0058, 0x7097, 0x001e, 0x0040, 0x7097,
 	0x001d, 0x0028, 0x7097, 0x0020, 0x0010, 0x7097, 0x001f, 0x0005,
-	0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x6f88, 0x2001,
-	0x0080, 0x080c, 0x27f1, 0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158,
+	0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x70d8, 0x2001,
+	0x0080, 0x080c, 0x2833, 0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158,
 	0xd1e4, 0x1130, 0x9184, 0x1e00, 0x1158, 0x7097, 0x0028, 0x0040,
 	0x7097, 0x001e, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, 0x001f,
-	0x0005, 0x2001, 0x00a0, 0x080c, 0x27f1, 0x6124, 0xd1dc, 0x1138,
-	0xd1e4, 0x0138, 0x080c, 0x1969, 0x7097, 0x001e, 0x0010, 0x7097,
-	0x001d, 0x0005, 0x080c, 0x6e3d, 0x6124, 0xd1dc, 0x1188, 0x080c,
-	0x6db4, 0x0016, 0x080c, 0x1969, 0x001e, 0xd1d4, 0x1128, 0xd1e4,
-	0x0138, 0x7097, 0x001e, 0x0020, 0x7097, 0x001f, 0x080c, 0x6db4,
-	0x0005, 0x0006, 0x2001, 0x00a0, 0x080c, 0x27f1, 0x000e, 0x6124,
+	0x0005, 0x2001, 0x00a0, 0x080c, 0x2833, 0x6124, 0xd1dc, 0x1138,
+	0xd1e4, 0x0138, 0x080c, 0x1989, 0x7097, 0x001e, 0x0010, 0x7097,
+	0x001d, 0x0005, 0x080c, 0x6f8d, 0x6124, 0xd1dc, 0x1188, 0x080c,
+	0x6f04, 0x0016, 0x080c, 0x1989, 0x001e, 0xd1d4, 0x1128, 0xd1e4,
+	0x0138, 0x7097, 0x001e, 0x0020, 0x7097, 0x001f, 0x080c, 0x6f04,
+	0x0005, 0x0006, 0x2001, 0x00a0, 0x080c, 0x2833, 0x000e, 0x6124,
 	0xd1d4, 0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140,
 	0x7097, 0x001e, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, 0x0021,
-	0x0005, 0x080c, 0x6e3d, 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128,
+	0x0005, 0x080c, 0x6f8d, 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128,
 	0xd1e4, 0x0140, 0x7097, 0x001e, 0x0028, 0x7097, 0x001d, 0x0010,
-	0x7097, 0x001f, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, 0x27f1,
+	0x7097, 0x001f, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, 0x2833,
 	0x000e, 0x6124, 0xd1d4, 0x1178, 0xd1cc, 0x1150, 0xd1dc, 0x1128,
 	0xd1e4, 0x0158, 0x7097, 0x001e, 0x0040, 0x7097, 0x001d, 0x0028,
 	0x7097, 0x0020, 0x0010, 0x7097, 0x001f, 0x0005, 0x0016, 0x00c6,
 	0x00d6, 0x00e6, 0x0126, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071,
-	0x1800, 0x2091, 0x8000, 0x080c, 0x6f5c, 0x11f8, 0x2001, 0x180c,
+	0x1800, 0x2091, 0x8000, 0x080c, 0x70ac, 0x11f8, 0x2001, 0x180c,
 	0x200c, 0xd1b4, 0x01d0, 0xc1b4, 0x2102, 0x0026, 0x2011, 0x0200,
-	0x080c, 0x282b, 0x002e, 0x080c, 0x27d7, 0x6024, 0xd0cc, 0x0148,
-	0x2001, 0x00a0, 0x080c, 0x27f1, 0x080c, 0x725c, 0x080c, 0x5be2,
-	0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x6f76, 0x0150,
-	0x080c, 0x6f6d, 0x1138, 0x2001, 0x0001, 0x080c, 0x2394, 0x080c,
-	0x6f30, 0x00a0, 0x080c, 0x6e3a, 0x0178, 0x2001, 0x0001, 0x080c,
-	0x2394, 0x7094, 0x9086, 0x001e, 0x0120, 0x7094, 0x9086, 0x0022,
+	0x080c, 0x286d, 0x002e, 0x080c, 0x2819, 0x6024, 0xd0cc, 0x0148,
+	0x2001, 0x00a0, 0x080c, 0x2833, 0x080c, 0x73ac, 0x080c, 0x5cd5,
+	0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x70c6, 0x0150,
+	0x080c, 0x70bd, 0x1138, 0x2001, 0x0001, 0x080c, 0x23c9, 0x080c,
+	0x7080, 0x00a0, 0x080c, 0x6f8a, 0x0178, 0x2001, 0x0001, 0x080c,
+	0x23c9, 0x7094, 0x9086, 0x001e, 0x0120, 0x7094, 0x9086, 0x0022,
 	0x1118, 0x7097, 0x0025, 0x0010, 0x7097, 0x0021, 0x012e, 0x00ee,
-	0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x6dc5, 0x080c,
-	0x80bc, 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011, 0x6dc5,
-	0x080c, 0x80b3, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, 0x0016,
-	0x080c, 0x8e21, 0x2071, 0x1800, 0x080c, 0x6d5e, 0x001e, 0x00fe,
+	0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x6f15, 0x080c,
+	0x8237, 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011, 0x6f15,
+	0x080c, 0x822e, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, 0x0016,
+	0x080c, 0x8f9c, 0x2071, 0x1800, 0x080c, 0x6eae, 0x001e, 0x00fe,
 	0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6,
-	0x00f6, 0x0126, 0x080c, 0x8e21, 0x2061, 0x0100, 0x2069, 0x0140,
+	0x00f6, 0x0126, 0x080c, 0x8f9c, 0x2061, 0x0100, 0x2069, 0x0140,
 	0x2071, 0x1800, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a, 0x080c,
-	0x9746, 0x2011, 0x0003, 0x080c, 0x91a3, 0x2011, 0x0002, 0x080c,
-	0x91ad, 0x080c, 0x9070, 0x080c, 0x8068, 0x0036, 0x901e, 0x080c,
-	0x90f0, 0x003e, 0x080c, 0x9762, 0x60e3, 0x0000, 0x080c, 0xd427,
-	0x080c, 0xd442, 0x2009, 0x0004, 0x080c, 0x27dd, 0x080c, 0x270a,
-	0x2001, 0x1800, 0x2003, 0x0004, 0x2011, 0x0008, 0x080c, 0x282b,
-	0x2011, 0x6dc5, 0x080c, 0x80bc, 0x080c, 0x6f76, 0x0118, 0x9006,
-	0x080c, 0x27f1, 0x080c, 0x0bab, 0x2001, 0x0001, 0x080c, 0x2394,
+	0x98ad, 0x2011, 0x0003, 0x080c, 0x931e, 0x2011, 0x0002, 0x080c,
+	0x9328, 0x080c, 0x91eb, 0x080c, 0x81e3, 0x0036, 0x901e, 0x080c,
+	0x926b, 0x003e, 0x080c, 0x98c9, 0x60e3, 0x0000, 0x080c, 0xd5d9,
+	0x080c, 0xd5f4, 0x2009, 0x0004, 0x080c, 0x281f, 0x080c, 0x273f,
+	0x2001, 0x1800, 0x2003, 0x0004, 0x2011, 0x0008, 0x080c, 0x286d,
+	0x2011, 0x6f15, 0x080c, 0x8237, 0x080c, 0x70c6, 0x0118, 0x9006,
+	0x080c, 0x2833, 0x080c, 0x0bab, 0x2001, 0x0001, 0x080c, 0x23c9,
 	0x012e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e,
-	0x0005, 0x0026, 0x00e6, 0x2011, 0x6dd2, 0x2071, 0x19d2, 0x701c,
+	0x0005, 0x0026, 0x00e6, 0x2011, 0x6f22, 0x2071, 0x19d4, 0x701c,
 	0x9206, 0x1118, 0x7018, 0x9005, 0x0110, 0x9085, 0x0001, 0x00ee,
 	0x002e, 0x0005, 0x6020, 0xd09c, 0x0005, 0x6800, 0x9084, 0xfffe,
-	0x9086, 0x00c0, 0x01b8, 0x2001, 0x00c0, 0x080c, 0x27f1, 0x0156,
-	0x20a9, 0x002d, 0x1d04, 0x6e4a, 0x2091, 0x6000, 0x1f04, 0x6e4a,
+	0x9086, 0x00c0, 0x01b8, 0x2001, 0x00c0, 0x080c, 0x2833, 0x0156,
+	0x20a9, 0x002d, 0x1d04, 0x6f9a, 0x2091, 0x6000, 0x1f04, 0x6f9a,
 	0x015e, 0x00d6, 0x2069, 0x1800, 0x6898, 0x8001, 0x0220, 0x0118,
 	0x689a, 0x00de, 0x0005, 0x689b, 0x0014, 0x68e8, 0xd0dc, 0x0dc8,
-	0x6800, 0x9086, 0x0001, 0x1da8, 0x080c, 0x80c8, 0x0c90, 0x00c6,
+	0x6800, 0x9086, 0x0001, 0x1da8, 0x080c, 0x8243, 0x0c90, 0x00c6,
 	0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800,
-	0x080c, 0x726b, 0x2001, 0x193e, 0x2003, 0x0000, 0x9006, 0x7096,
-	0x60e2, 0x6886, 0x080c, 0x2463, 0x9006, 0x080c, 0x27f1, 0x080c,
-	0x5a9d, 0x0026, 0x2011, 0xffff, 0x080c, 0x282b, 0x002e, 0x602b,
+	0x080c, 0x73bb, 0x2001, 0x193e, 0x2003, 0x0000, 0x9006, 0x7096,
+	0x60e2, 0x6886, 0x080c, 0x2498, 0x9006, 0x080c, 0x2833, 0x080c,
+	0x5b90, 0x0026, 0x2011, 0xffff, 0x080c, 0x286d, 0x002e, 0x602b,
 	0x182c, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6,
 	0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2001, 0x194e,
 	0x200c, 0x9186, 0x0000, 0x0158, 0x9186, 0x0001, 0x0158, 0x9186,
-	0x0002, 0x0158, 0x9186, 0x0003, 0x0158, 0x0804, 0x6f20, 0x7097,
+	0x0002, 0x0158, 0x9186, 0x0003, 0x0158, 0x0804, 0x7070, 0x7097,
 	0x0022, 0x0040, 0x7097, 0x0021, 0x0028, 0x7097, 0x0023, 0x0010,
 	0x7097, 0x0024, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001,
-	0x080c, 0x2463, 0x080c, 0x9746, 0x0026, 0x080c, 0x99eb, 0x002e,
-	0x080c, 0x9762, 0x7000, 0x908e, 0x0004, 0x0118, 0x602b, 0x0028,
+	0x080c, 0x2498, 0x080c, 0x98ad, 0x0026, 0x080c, 0x9b52, 0x002e,
+	0x080c, 0x98c9, 0x7000, 0x908e, 0x0004, 0x0118, 0x602b, 0x0028,
 	0x0010, 0x602b, 0x0020, 0x0156, 0x0126, 0x2091, 0x8000, 0x20a9,
-	0x0005, 0x6024, 0xd0ac, 0x0150, 0x012e, 0x015e, 0x080c, 0xbdd7,
-	0x0118, 0x9006, 0x080c, 0x281b, 0x0804, 0x6f2c, 0x6800, 0x9084,
-	0x00a1, 0xc0bd, 0x6802, 0x080c, 0x27d7, 0x6904, 0xd1d4, 0x1140,
-	0x2001, 0x0100, 0x080c, 0x27f1, 0x1f04, 0x6ed1, 0x080c, 0x6fb3,
-	0x012e, 0x015e, 0x080c, 0x6f6d, 0x0170, 0x6044, 0x9005, 0x0130,
-	0x080c, 0x6fb3, 0x9006, 0x8001, 0x1df0, 0x0028, 0x6804, 0xd0d4,
-	0x1110, 0x080c, 0x6fb3, 0x080c, 0xbdd7, 0x0118, 0x9006, 0x080c,
-	0x281b, 0x0016, 0x0026, 0x7000, 0x908e, 0x0004, 0x0130, 0x2009,
-	0x00c8, 0x2011, 0x6dd2, 0x080c, 0x807a, 0x002e, 0x001e, 0x080c,
-	0x7ecd, 0x7034, 0xc085, 0x7036, 0x2001, 0x194e, 0x2003, 0x0004,
-	0x080c, 0x6c2b, 0x080c, 0x6f6d, 0x0138, 0x6804, 0xd0d4, 0x1120,
-	0xd0dc, 0x1100, 0x080c, 0x7261, 0x00ee, 0x00de, 0x00ce, 0x0005,
+	0x0005, 0x6024, 0xd0ac, 0x0150, 0x012e, 0x015e, 0x080c, 0xbf46,
+	0x0118, 0x9006, 0x080c, 0x285d, 0x0804, 0x707c, 0x6800, 0x9084,
+	0x00a1, 0xc0bd, 0x6802, 0x080c, 0x2819, 0x6904, 0xd1d4, 0x1140,
+	0x2001, 0x0100, 0x080c, 0x2833, 0x1f04, 0x7021, 0x080c, 0x7103,
+	0x012e, 0x015e, 0x080c, 0x70bd, 0x0170, 0x6044, 0x9005, 0x0130,
+	0x080c, 0x7103, 0x9006, 0x8001, 0x1df0, 0x0028, 0x6804, 0xd0d4,
+	0x1110, 0x080c, 0x7103, 0x080c, 0xbf46, 0x0118, 0x9006, 0x080c,
+	0x285d, 0x0016, 0x0026, 0x7000, 0x908e, 0x0004, 0x0130, 0x2009,
+	0x00c8, 0x2011, 0x6f22, 0x080c, 0x81f5, 0x002e, 0x001e, 0x080c,
+	0x8043, 0x7034, 0xc085, 0x7036, 0x2001, 0x194e, 0x2003, 0x0004,
+	0x080c, 0x6d7b, 0x080c, 0x70bd, 0x0138, 0x6804, 0xd0d4, 0x1120,
+	0xd0dc, 0x1100, 0x080c, 0x73b1, 0x00ee, 0x00de, 0x00ce, 0x0005,
 	0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071,
-	0x1800, 0x080c, 0x7ee4, 0x080c, 0x7ed6, 0x080c, 0x726b, 0x2001,
+	0x1800, 0x080c, 0x805a, 0x080c, 0x804c, 0x080c, 0x73bb, 0x2001,
 	0x193e, 0x2003, 0x0000, 0x9006, 0x7096, 0x60e2, 0x6886, 0x080c,
-	0x2463, 0x9006, 0x080c, 0x27f1, 0x6043, 0x0090, 0x6043, 0x0010,
-	0x0026, 0x2011, 0xffff, 0x080c, 0x282b, 0x002e, 0x602b, 0x182c,
+	0x2498, 0x9006, 0x080c, 0x2833, 0x6043, 0x0090, 0x6043, 0x0010,
+	0x0026, 0x2011, 0xffff, 0x080c, 0x286d, 0x002e, 0x602b, 0x182c,
 	0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, 0x2001, 0x194d, 0x2004,
-	0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006, 0x080c, 0x52a1, 0x9084,
-	0x0030, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, 0x080c, 0x52a1,
+	0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006, 0x080c, 0x538a, 0x9084,
+	0x0030, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, 0x080c, 0x538a,
 	0x9084, 0x0030, 0x9086, 0x0030, 0x000e, 0x0005, 0x0006, 0x080c,
-	0x52a1, 0x9084, 0x0030, 0x9086, 0x0010, 0x000e, 0x0005, 0x0006,
-	0x080c, 0x52a1, 0x9084, 0x0030, 0x9086, 0x0020, 0x000e, 0x0005,
+	0x538a, 0x9084, 0x0030, 0x9086, 0x0010, 0x000e, 0x0005, 0x0006,
+	0x080c, 0x538a, 0x9084, 0x0030, 0x9086, 0x0020, 0x000e, 0x0005,
 	0x0036, 0x0016, 0x2001, 0x180c, 0x2004, 0x908c, 0x0013, 0x0180,
-	0x0020, 0x080c, 0x2483, 0x900e, 0x0028, 0x080c, 0x6555, 0x1dc8,
-	0x2009, 0x0002, 0x2019, 0x0028, 0x080c, 0x2f80, 0x9006, 0x0019,
+	0x0020, 0x080c, 0x24b8, 0x900e, 0x0028, 0x080c, 0x6658, 0x1dc8,
+	0x2009, 0x0002, 0x2019, 0x0028, 0x080c, 0x2fc2, 0x9006, 0x0019,
 	0x001e, 0x003e, 0x0005, 0x00e6, 0x2071, 0x180c, 0x2e04, 0x0130,
-	0x080c, 0xbdd0, 0x1128, 0x9085, 0x0010, 0x0010, 0x9084, 0xffef,
+	0x080c, 0xbf3f, 0x1128, 0x9085, 0x0010, 0x0010, 0x9084, 0xffef,
 	0x2072, 0x00ee, 0x0005, 0x6050, 0x0006, 0x60ec, 0x0006, 0x600c,
 	0x0006, 0x6004, 0x0006, 0x6028, 0x0006, 0x602f, 0x0100, 0x602f,
 	0x0000, 0x602f, 0x0040, 0x602f, 0x0000, 0x20a9, 0x0002, 0x080c,
-	0x27b8, 0x0026, 0x2011, 0x0040, 0x080c, 0x282b, 0x002e, 0x000e,
+	0x27fa, 0x0026, 0x2011, 0x0040, 0x080c, 0x286d, 0x002e, 0x000e,
 	0x602a, 0x000e, 0x6006, 0x000e, 0x600e, 0x000e, 0x60ee, 0x60e3,
-	0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x2463, 0x2001,
-	0x00a0, 0x0006, 0x080c, 0xbdd7, 0x000e, 0x0130, 0x080c, 0x280f,
-	0x9006, 0x080c, 0x281b, 0x0010, 0x080c, 0x27f1, 0x000e, 0x6052,
+	0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x2498, 0x2001,
+	0x00a0, 0x0006, 0x080c, 0xbf46, 0x000e, 0x0130, 0x080c, 0x2851,
+	0x9006, 0x080c, 0x285d, 0x0010, 0x080c, 0x2833, 0x000e, 0x6052,
 	0x6050, 0x0006, 0xc0e5, 0x6052, 0x00f6, 0x2079, 0x0100, 0x080c,
-	0x2768, 0x00fe, 0x000e, 0x6052, 0x0005, 0x0156, 0x0016, 0x0026,
+	0x27aa, 0x00fe, 0x000e, 0x6052, 0x0005, 0x0156, 0x0016, 0x0026,
 	0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140,
-	0x2071, 0x1800, 0x080c, 0x97a4, 0x0158, 0x2001, 0x0386, 0x2004,
-	0xd0b4, 0x1130, 0x2001, 0x0016, 0x080c, 0x9737, 0x0804, 0x708f,
+	0x2071, 0x1800, 0x080c, 0x990b, 0x0158, 0x2001, 0x0386, 0x2004,
+	0xd0b4, 0x1130, 0x2001, 0x0016, 0x080c, 0x989e, 0x0804, 0x71df,
 	0x2001, 0x180c, 0x200c, 0xc1c4, 0x2102, 0x6028, 0x9084, 0xe1ff,
-	0x602a, 0x2011, 0x0200, 0x080c, 0x282b, 0x2001, 0x0090, 0x080c,
-	0x27f1, 0x20a9, 0x0366, 0x6024, 0xd0cc, 0x1558, 0x1d04, 0x702b,
-	0x2091, 0x6000, 0x1f04, 0x702b, 0x080c, 0x9746, 0x2011, 0x0003,
-	0x080c, 0x91a3, 0x2011, 0x0002, 0x080c, 0x91ad, 0x080c, 0x9070,
-	0x901e, 0x080c, 0x90f0, 0x2001, 0x0386, 0x2003, 0x7000, 0x080c,
-	0x9762, 0x2001, 0x00a0, 0x080c, 0x27f1, 0x080c, 0x725c, 0x080c,
-	0x5be2, 0x080c, 0xbdd7, 0x0110, 0x080c, 0x0cd1, 0x9085, 0x0001,
-	0x04e0, 0x2001, 0x0386, 0x2004, 0xd0ac, 0x0110, 0x080c, 0x1969,
-	0x60e3, 0x0000, 0x2001, 0x0002, 0x080c, 0x2463, 0x60e2, 0x2001,
-	0x0080, 0x080c, 0x27f1, 0x20a9, 0x0366, 0x2011, 0x1e00, 0x080c,
-	0x282b, 0x2009, 0x1e00, 0x080c, 0x27d7, 0x6024, 0x910c, 0x0140,
-	0x1d04, 0x706d, 0x2091, 0x6000, 0x1f04, 0x706d, 0x0804, 0x7034,
+	0x602a, 0x2011, 0x0200, 0x080c, 0x286d, 0x2001, 0x0090, 0x080c,
+	0x2833, 0x20a9, 0x0366, 0x6024, 0xd0cc, 0x1558, 0x1d04, 0x717b,
+	0x2091, 0x6000, 0x1f04, 0x717b, 0x080c, 0x98ad, 0x2011, 0x0003,
+	0x080c, 0x931e, 0x2011, 0x0002, 0x080c, 0x9328, 0x080c, 0x91eb,
+	0x901e, 0x080c, 0x926b, 0x2001, 0x0386, 0x2003, 0x7000, 0x080c,
+	0x98c9, 0x2001, 0x00a0, 0x080c, 0x2833, 0x080c, 0x73ac, 0x080c,
+	0x5cd5, 0x080c, 0xbf46, 0x0110, 0x080c, 0x0cd1, 0x9085, 0x0001,
+	0x04e0, 0x2001, 0x0386, 0x2004, 0xd0ac, 0x0110, 0x080c, 0x1989,
+	0x60e3, 0x0000, 0x2001, 0x0002, 0x080c, 0x2498, 0x60e2, 0x2001,
+	0x0080, 0x080c, 0x2833, 0x20a9, 0x0366, 0x2011, 0x1e00, 0x080c,
+	0x286d, 0x2009, 0x1e00, 0x080c, 0x2819, 0x6024, 0x910c, 0x0140,
+	0x1d04, 0x71bd, 0x2091, 0x6000, 0x1f04, 0x71bd, 0x0804, 0x7184,
 	0x2001, 0x0386, 0x2003, 0x7000, 0x6028, 0x9085, 0x1e00, 0x602a,
 	0x70b0, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x080c,
-	0xbdd7, 0x0110, 0x080c, 0x0cd1, 0x9006, 0x00ee, 0x00de, 0x00ce,
+	0xbf46, 0x0110, 0x080c, 0x0cd1, 0x9006, 0x00ee, 0x00de, 0x00ce,
 	0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026,
 	0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800,
 	0x7000, 0x9086, 0x0003, 0x1168, 0x2001, 0x020b, 0x2004, 0x9084,
-	0x5540, 0x9086, 0x5540, 0x1128, 0x2069, 0x1a45, 0x2d04, 0x8000,
+	0x5540, 0x9086, 0x5540, 0x1128, 0x2069, 0x1a47, 0x2d04, 0x8000,
 	0x206a, 0x2069, 0x0140, 0x6020, 0x9084, 0x00c0, 0x0120, 0x6884,
-	0x9005, 0x1904, 0x7106, 0x2001, 0x0088, 0x080c, 0x27f1, 0x9006,
-	0x60e2, 0x6886, 0x080c, 0x2463, 0x2069, 0x0200, 0x6804, 0x9005,
+	0x9005, 0x1904, 0x7256, 0x2001, 0x0088, 0x080c, 0x2833, 0x9006,
+	0x60e2, 0x6886, 0x080c, 0x2498, 0x2069, 0x0200, 0x6804, 0x9005,
 	0x1118, 0x6808, 0x9005, 0x01d0, 0x6028, 0x9084, 0xfbff, 0x602a,
-	0x2011, 0x0400, 0x080c, 0x282b, 0x2069, 0x195e, 0x7000, 0x206a,
-	0x7097, 0x0026, 0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04, 0x70e6,
-	0x2091, 0x6000, 0x1f04, 0x70e6, 0x0804, 0x7137, 0x2069, 0x0140,
-	0x20a9, 0x0384, 0x2011, 0x1e00, 0x080c, 0x282b, 0x2009, 0x1e00,
-	0x080c, 0x27d7, 0x6024, 0x910c, 0x0528, 0x9084, 0x1a00, 0x1510,
-	0x1d04, 0x70f2, 0x2091, 0x6000, 0x1f04, 0x70f2, 0x080c, 0x9746,
-	0x2011, 0x0003, 0x080c, 0x91a3, 0x2011, 0x0002, 0x080c, 0x91ad,
-	0x080c, 0x9070, 0x901e, 0x080c, 0x90f0, 0x080c, 0x9762, 0x2001,
-	0x00a0, 0x080c, 0x27f1, 0x080c, 0x725c, 0x080c, 0x5be2, 0x9085,
-	0x0001, 0x00a8, 0x2001, 0x0080, 0x080c, 0x27f1, 0x2069, 0x0140,
+	0x2011, 0x0400, 0x080c, 0x286d, 0x2069, 0x1960, 0x7000, 0x206a,
+	0x7097, 0x0026, 0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04, 0x7236,
+	0x2091, 0x6000, 0x1f04, 0x7236, 0x0804, 0x7287, 0x2069, 0x0140,
+	0x20a9, 0x0384, 0x2011, 0x1e00, 0x080c, 0x286d, 0x2009, 0x1e00,
+	0x080c, 0x2819, 0x6024, 0x910c, 0x0528, 0x9084, 0x1a00, 0x1510,
+	0x1d04, 0x7242, 0x2091, 0x6000, 0x1f04, 0x7242, 0x080c, 0x98ad,
+	0x2011, 0x0003, 0x080c, 0x931e, 0x2011, 0x0002, 0x080c, 0x9328,
+	0x080c, 0x91eb, 0x901e, 0x080c, 0x926b, 0x080c, 0x98c9, 0x2001,
+	0x00a0, 0x080c, 0x2833, 0x080c, 0x73ac, 0x080c, 0x5cd5, 0x9085,
+	0x0001, 0x00a8, 0x2001, 0x0080, 0x080c, 0x2833, 0x2069, 0x0140,
 	0x60e3, 0x0000, 0x70b0, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008,
-	0x6886, 0x2001, 0x0002, 0x080c, 0x2463, 0x60e2, 0x9006, 0x00ee,
+	0x6886, 0x2001, 0x0002, 0x080c, 0x2498, 0x60e2, 0x9006, 0x00ee,
 	0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156,
 	0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100,
-	0x2071, 0x1800, 0x6020, 0x9084, 0x00c0, 0x01e8, 0x080c, 0x9746,
-	0x2011, 0x0003, 0x080c, 0x91a3, 0x2011, 0x0002, 0x080c, 0x91ad,
-	0x080c, 0x9070, 0x901e, 0x080c, 0x90f0, 0x080c, 0x9762, 0x2069,
-	0x0140, 0x2001, 0x00a0, 0x080c, 0x27f1, 0x080c, 0x725c, 0x080c,
-	0x5be2, 0x0804, 0x71d9, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x1160,
-	0xc1b5, 0x2102, 0x080c, 0x6dba, 0x2069, 0x0140, 0x2001, 0x0080,
-	0x080c, 0x27f1, 0x60e3, 0x0000, 0x2069, 0x0200, 0x6804, 0x9005,
+	0x2071, 0x1800, 0x6020, 0x9084, 0x00c0, 0x01e8, 0x080c, 0x98ad,
+	0x2011, 0x0003, 0x080c, 0x931e, 0x2011, 0x0002, 0x080c, 0x9328,
+	0x080c, 0x91eb, 0x901e, 0x080c, 0x926b, 0x080c, 0x98c9, 0x2069,
+	0x0140, 0x2001, 0x00a0, 0x080c, 0x2833, 0x080c, 0x73ac, 0x080c,
+	0x5cd5, 0x0804, 0x7329, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x1160,
+	0xc1b5, 0x2102, 0x080c, 0x6f0a, 0x2069, 0x0140, 0x2001, 0x0080,
+	0x080c, 0x2833, 0x60e3, 0x0000, 0x2069, 0x0200, 0x6804, 0x9005,
 	0x1118, 0x6808, 0x9005, 0x0190, 0x6028, 0x9084, 0xfdff, 0x602a,
-	0x2011, 0x0200, 0x080c, 0x282b, 0x2069, 0x195e, 0x7000, 0x206a,
-	0x7097, 0x0027, 0x7003, 0x0001, 0x0804, 0x71d9, 0x2011, 0x1e00,
-	0x080c, 0x282b, 0x2009, 0x1e00, 0x080c, 0x27d7, 0x6024, 0x910c,
-	0x01c8, 0x9084, 0x1c00, 0x11b0, 0x1d04, 0x7196, 0x0006, 0x0016,
-	0x00c6, 0x00d6, 0x00e6, 0x080c, 0x7f15, 0x00ee, 0x00de, 0x00ce,
-	0x001e, 0x000e, 0x00e6, 0x2071, 0x19d2, 0x7018, 0x00ee, 0x9005,
-	0x19e8, 0x01f8, 0x0026, 0x2011, 0x6dd2, 0x080c, 0x7fbb, 0x2011,
-	0x6dc5, 0x080c, 0x80bc, 0x002e, 0x2069, 0x0140, 0x60e3, 0x0000,
+	0x2011, 0x0200, 0x080c, 0x286d, 0x2069, 0x1960, 0x7000, 0x206a,
+	0x7097, 0x0027, 0x7003, 0x0001, 0x0804, 0x7329, 0x2011, 0x1e00,
+	0x080c, 0x286d, 0x2009, 0x1e00, 0x080c, 0x2819, 0x6024, 0x910c,
+	0x01c8, 0x9084, 0x1c00, 0x11b0, 0x1d04, 0x72e6, 0x0006, 0x0016,
+	0x00c6, 0x00d6, 0x00e6, 0x080c, 0x808b, 0x00ee, 0x00de, 0x00ce,
+	0x001e, 0x000e, 0x00e6, 0x2071, 0x19d4, 0x7018, 0x00ee, 0x9005,
+	0x19e8, 0x01f8, 0x0026, 0x2011, 0x6f22, 0x080c, 0x8131, 0x2011,
+	0x6f15, 0x080c, 0x8237, 0x002e, 0x2069, 0x0140, 0x60e3, 0x0000,
 	0x70b0, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001,
-	0x0002, 0x080c, 0x2463, 0x60e2, 0x2001, 0x180c, 0x200c, 0xc1b4,
+	0x0002, 0x080c, 0x2498, 0x60e2, 0x2001, 0x180c, 0x200c, 0xc1b4,
 	0x2102, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e,
 	0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x0046, 0x00c6, 0x00e6,
-	0x2061, 0x0100, 0x2071, 0x1800, 0x080c, 0xbdd0, 0x1904, 0x7246,
-	0x7130, 0xd184, 0x1170, 0x080c, 0x313d, 0x0138, 0xc18d, 0x7132,
+	0x2061, 0x0100, 0x2071, 0x1800, 0x080c, 0xbf3f, 0x1904, 0x7396,
+	0x7130, 0xd184, 0x1170, 0x080c, 0x317f, 0x0138, 0xc18d, 0x7132,
 	0x2011, 0x1854, 0x2214, 0xd2ac, 0x1120, 0x7030, 0xd08c, 0x0904,
-	0x7246, 0x2011, 0x1854, 0x220c, 0x0438, 0x0016, 0x2019, 0x000e,
-	0x080c, 0xd046, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x9186,
-	0x007e, 0x01a0, 0x9186, 0x0080, 0x0188, 0x080c, 0x6166, 0x1170,
-	0x2120, 0x9006, 0x0016, 0x2009, 0x000e, 0x080c, 0xd0ce, 0x2009,
-	0x0001, 0x2011, 0x0100, 0x080c, 0x8248, 0x001e, 0x8108, 0x1f04,
-	0x720f, 0x00be, 0x015e, 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009,
-	0x0002, 0x2019, 0x0004, 0x080c, 0x2f80, 0x001e, 0x0078, 0x0156,
-	0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x6166, 0x1110, 0x080c,
-	0x5bfc, 0x8108, 0x1f04, 0x723c, 0x00be, 0x015e, 0x080c, 0x1969,
-	0x080c, 0x9746, 0x080c, 0x99eb, 0x080c, 0x9762, 0x60e3, 0x0000,
-	0x080c, 0x5be2, 0x080c, 0x6e8d, 0x00ee, 0x00ce, 0x004e, 0x003e,
+	0x7396, 0x2011, 0x1854, 0x220c, 0x0438, 0x0016, 0x2019, 0x000e,
+	0x080c, 0xd1c9, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x9186,
+	0x007e, 0x01a0, 0x9186, 0x0080, 0x0188, 0x080c, 0x6269, 0x1170,
+	0x2120, 0x9006, 0x0016, 0x2009, 0x000e, 0x080c, 0xd251, 0x2009,
+	0x0001, 0x2011, 0x0100, 0x080c, 0x83c3, 0x001e, 0x8108, 0x1f04,
+	0x735f, 0x00be, 0x015e, 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009,
+	0x0002, 0x2019, 0x0004, 0x080c, 0x2fc2, 0x001e, 0x0078, 0x0156,
+	0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x6269, 0x1110, 0x080c,
+	0x5cef, 0x8108, 0x1f04, 0x738c, 0x00be, 0x015e, 0x080c, 0x1989,
+	0x080c, 0x98ad, 0x080c, 0x9b52, 0x080c, 0x98c9, 0x60e3, 0x0000,
+	0x080c, 0x5cd5, 0x080c, 0x6fdd, 0x00ee, 0x00ce, 0x004e, 0x003e,
 	0x002e, 0x001e, 0x015e, 0x0005, 0x2001, 0x194e, 0x2003, 0x0001,
 	0x0005, 0x2001, 0x194e, 0x2003, 0x0000, 0x0005, 0x2001, 0x194d,
 	0x2003, 0xaaaa, 0x0005, 0x2001, 0x194d, 0x2003, 0x0000, 0x0005,
-	0x2071, 0x18f0, 0x7003, 0x0000, 0x7007, 0x0000, 0x080c, 0x103c,
-	0x090c, 0x0d65, 0xa8ab, 0xdcb0, 0x2900, 0x704e, 0x080c, 0x103c,
+	0x2071, 0x18f0, 0x7003, 0x0000, 0x7007, 0x0000, 0x080c, 0x103b,
+	0x090c, 0x0d65, 0xa8ab, 0xdcb0, 0x2900, 0x704e, 0x080c, 0x103b,
 	0x090c, 0x0d65, 0xa8ab, 0xdcb0, 0x2900, 0x7052, 0xa867, 0x0000,
 	0xa86b, 0x0001, 0xa89f, 0x0000, 0x0005, 0x00e6, 0x2071, 0x0040,
 	0x6848, 0x9005, 0x1118, 0x9085, 0x0001, 0x04b0, 0x6840, 0x9005,
@@ -3467,3135 +3509,3148 @@ unsigned short risc_code01[] = { 
 	0x6848, 0x701a, 0x701c, 0x9085, 0x0040, 0x701e, 0x2001, 0x0019,
 	0x7036, 0x702b, 0x0001, 0x2001, 0x0004, 0x200c, 0x918c, 0xfff7,
 	0x918d, 0x8000, 0x2102, 0x00d6, 0x2069, 0x18f0, 0x6807, 0x0001,
-	0x00de, 0x080c, 0x7853, 0x9006, 0x00ee, 0x0005, 0x900e, 0x0156,
-	0x20a9, 0x0006, 0x8003, 0x818d, 0x1f04, 0x72d2, 0x015e, 0x0005,
-	0x2079, 0x0040, 0x2071, 0x18f0, 0x7004, 0x0002, 0x72e8, 0x72e9,
-	0x7334, 0x738f, 0x74bb, 0x72e6, 0x72e6, 0x74e5, 0x080c, 0x0d65,
+	0x00de, 0x080c, 0x79b8, 0x9006, 0x00ee, 0x0005, 0x900e, 0x0156,
+	0x20a9, 0x0006, 0x8003, 0x818d, 0x1f04, 0x7422, 0x015e, 0x0005,
+	0x2079, 0x0040, 0x2071, 0x18f0, 0x7004, 0x0002, 0x7438, 0x7439,
+	0x7484, 0x74df, 0x7620, 0x7436, 0x7436, 0x764a, 0x080c, 0x0d65,
 	0x0005, 0x2079, 0x0040, 0x2001, 0x1dc0, 0x2003, 0x0000, 0x782c,
-	0x908c, 0x0780, 0x190c, 0x78df, 0xd0a4, 0x0570, 0x2001, 0x1dc0,
-	0x2004, 0x9082, 0x0080, 0x1640, 0x1d04, 0x7306, 0x2001, 0x19d5,
+	0x908c, 0x0780, 0x190c, 0x7a44, 0xd0a4, 0x0570, 0x2001, 0x1dc0,
+	0x2004, 0x9082, 0x0080, 0x1640, 0x1d04, 0x7456, 0x2001, 0x19d7,
 	0x200c, 0x8109, 0x0508, 0x2091, 0x6000, 0x2102, 0x7824, 0x2048,
 	0x9006, 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a, 0x0040,
 	0x0608, 0x00b8, 0x2001, 0x1800, 0x200c, 0x9186, 0x0003, 0x1160,
 	0x7104, 0x9186, 0x0004, 0x0140, 0x9186, 0x0007, 0x0128, 0x9186,
-	0x0003, 0x1968, 0x080c, 0x738f, 0x782c, 0xd09c, 0x090c, 0x7853,
+	0x0003, 0x1968, 0x080c, 0x74df, 0x782c, 0xd09c, 0x090c, 0x79b8,
 	0x0005, 0x9082, 0x005a, 0x1218, 0x2100, 0x003b, 0x0c18, 0x080c,
-	0x73c5, 0x0c90, 0x00e3, 0x08f0, 0x0005, 0x73c5, 0x73c5, 0x73c5,
-	0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73e7, 0x73c5, 0x73c5,
-	0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5,
-	0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5,
-	0x73c5, 0x73d1, 0x73c5, 0x75ba, 0x73c5, 0x73c5, 0x73c5, 0x73c5,
-	0x73c5, 0x73d1, 0x75fb, 0x763c, 0x7683, 0x7697, 0x73c5, 0x73c5,
-	0x73e7, 0x73d1, 0x73c5, 0x73c5, 0x748f, 0x7742, 0x775d, 0x73c5,
-	0x73e7, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x7485, 0x775d, 0x73c5,
-	0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5,
-	0x73fb, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5,
-	0x73c5, 0x73c5, 0x7883, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5,
-	0x740f, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x73c5, 0x2079,
-	0x0040, 0x7004, 0x9086, 0x0003, 0x1198, 0x782c, 0x080c, 0x787c,
+	0x7515, 0x0c90, 0x00e3, 0x08f0, 0x0005, 0x7515, 0x7515, 0x7515,
+	0x7515, 0x7515, 0x7515, 0x7515, 0x7515, 0x7537, 0x7515, 0x7515,
+	0x7515, 0x7515, 0x7515, 0x7515, 0x7515, 0x7515, 0x7515, 0x7515,
+	0x7515, 0x7515, 0x7515, 0x7515, 0x7515, 0x7515, 0x7515, 0x7515,
+	0x7515, 0x7521, 0x7515, 0x771f, 0x7515, 0x7515, 0x7515, 0x7537,
+	0x7515, 0x7521, 0x7760, 0x77a1, 0x77e8, 0x77fc, 0x7515, 0x7515,
+	0x7537, 0x7521, 0x7515, 0x7515, 0x75f4, 0x78a7, 0x78c2, 0x7515,
+	0x7537, 0x7515, 0x7515, 0x7515, 0x7515, 0x75ea, 0x78c2, 0x7515,
+	0x7515, 0x7515, 0x7515, 0x7515, 0x7515, 0x7515, 0x7515, 0x7515,
+	0x754b, 0x7515, 0x7515, 0x7515, 0x7515, 0x7515, 0x7515, 0x7515,
+	0x7515, 0x7515, 0x79e8, 0x7515, 0x7515, 0x7515, 0x7515, 0x7515,
+	0x755f, 0x7515, 0x7515, 0x7515, 0x7515, 0x7515, 0x7515, 0x2079,
+	0x0040, 0x7004, 0x9086, 0x0003, 0x1198, 0x782c, 0x080c, 0x79e1,
 	0xd0a4, 0x0170, 0x7824, 0x2048, 0x9006, 0xa802, 0xa806, 0xa864,
 	0x9084, 0x00ff, 0x908a, 0x001a, 0x1210, 0x002b, 0x0c50, 0x00e9,
-	0x080c, 0x7853, 0x0005, 0x73c5, 0x73d1, 0x75a6, 0x73c5, 0x73d1,
-	0x73c5, 0x73d1, 0x73d1, 0x73c5, 0x73d1, 0x75a6, 0x73d1, 0x73d1,
-	0x73d1, 0x73d1, 0x73d1, 0x73c5, 0x73d1, 0x75a6, 0x73c5, 0x73c5,
-	0x73d1, 0x73c5, 0x73c5, 0x73c5, 0x73d1, 0x00e6, 0x2071, 0x18f0,
+	0x080c, 0x79b8, 0x0005, 0x7515, 0x7521, 0x770b, 0x7515, 0x7521,
+	0x7515, 0x7521, 0x7521, 0x7515, 0x7521, 0x770b, 0x7521, 0x7521,
+	0x7521, 0x7521, 0x7521, 0x7515, 0x7521, 0x770b, 0x7515, 0x7515,
+	0x7521, 0x7515, 0x7515, 0x7515, 0x7521, 0x00e6, 0x2071, 0x18f0,
 	0x2009, 0x0400, 0x0071, 0x00ee, 0x0005, 0x2009, 0x1000, 0x0049,
 	0x0005, 0x2009, 0x2000, 0x0029, 0x0005, 0x2009, 0x0800, 0x0009,
 	0x0005, 0x7007, 0x0001, 0xa868, 0x9084, 0x00ff, 0x9105, 0xa86a,
-	0x0126, 0x2091, 0x8000, 0x080c, 0x683f, 0x012e, 0x0005, 0xa864,
+	0x0126, 0x2091, 0x8000, 0x080c, 0x698f, 0x012e, 0x0005, 0xa864,
 	0x8007, 0x9084, 0x00ff, 0x0d08, 0x8001, 0x1120, 0x7007, 0x0001,
-	0x0804, 0x7564, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a,
-	0x704b, 0x7564, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0968,
-	0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x757f, 0x7007, 0x0003,
-	0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x757f, 0x0005, 0xa864,
-	0x8007, 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x73cd, 0x7007,
-	0x0001, 0x2009, 0x1833, 0x210c, 0x81ff, 0x15f0, 0xa994, 0x9186,
-	0x006f, 0x0158, 0x9186, 0x0074, 0x1510, 0x0026, 0x2011, 0x0010,
-	0x080c, 0x6581, 0x002e, 0x01d8, 0x0090, 0x080c, 0x6f5c, 0x0140,
-	0xa897, 0x4005, 0xa89b, 0x0016, 0x2001, 0x0030, 0x900e, 0x00c8,
-	0x0026, 0x2011, 0x8008, 0x080c, 0x6581, 0x002e, 0x0140, 0xa897,
-	0x4005, 0xa89b, 0x4009, 0x2001, 0x0030, 0x900e, 0x0050, 0xa868,
-	0x9084, 0x00ff, 0xa86a, 0xa883, 0x0000, 0x080c, 0x5e0d, 0x1108,
-	0x0005, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, 0xa87a, 0xa982,
-	0x080c, 0x683f, 0x012e, 0x0ca0, 0xa994, 0x9186, 0x0071, 0x0904,
-	0x741e, 0x9186, 0x0064, 0x0904, 0x741e, 0x9186, 0x007c, 0x0904,
-	0x741e, 0x9186, 0x0028, 0x0904, 0x741e, 0x9186, 0x0038, 0x0904,
-	0x741e, 0x9186, 0x0078, 0x0904, 0x741e, 0x9186, 0x005f, 0x0904,
-	0x741e, 0x9186, 0x0056, 0x0904, 0x741e, 0xa897, 0x4005, 0xa89b,
-	0x0001, 0x2001, 0x0030, 0x900e, 0x0860, 0xa87c, 0x9084, 0x00c0,
-	0x9086, 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, 0x7774, 0x2900,
-	0x7016, 0x701a, 0x20a9, 0x0004, 0xa860, 0x20e0, 0xa85c, 0x9080,
-	0x0030, 0x2098, 0x7050, 0x2040, 0xa060, 0x20e8, 0xa05c, 0x9080,
-	0x0023, 0x20a0, 0x4003, 0xa888, 0x7012, 0x9082, 0x0401, 0x1a04,
-	0x73d5, 0xaab4, 0x928a, 0x0002, 0x1a04, 0x73d5, 0x82ff, 0x1138,
-	0xa8b8, 0xa9bc, 0x9105, 0x0118, 0x2001, 0x7522, 0x0018, 0x9280,
-	0x7518, 0x2005, 0x7056, 0x7010, 0x9015, 0x0904, 0x7503, 0x080c,
-	0x103c, 0x1118, 0x7007, 0x0004, 0x0005, 0x2900, 0x7022, 0x7054,
-	0x2060, 0xe000, 0xa866, 0x7050, 0x2040, 0xa95c, 0xe004, 0x9100,
-	0xa076, 0xa860, 0xa072, 0xe008, 0x920a, 0x1210, 0x900e, 0x2200,
-	0x7112, 0xe20c, 0x8003, 0x800b, 0x9296, 0x0004, 0x0108, 0x9108,
-	0xa17a, 0x810b, 0xa17e, 0x080c, 0x1103, 0xa06c, 0x908e, 0x0100,
-	0x0170, 0x9086, 0x0200, 0x0118, 0x7007, 0x0007, 0x0005, 0x7020,
-	0x2048, 0x080c, 0x1055, 0x7014, 0x2048, 0x0804, 0x73d5, 0x7020,
-	0x2048, 0x7018, 0xa802, 0xa807, 0x0000, 0x2908, 0x2048, 0xa906,
-	0x711a, 0x0804, 0x74bb, 0x7014, 0x2048, 0x7007, 0x0001, 0xa8b4,
-	0x9005, 0x1128, 0xa8b8, 0xa9bc, 0x9105, 0x0108, 0x00b9, 0xa864,
-	0x9084, 0x00ff, 0x9086, 0x001e, 0x0904, 0x7774, 0x0804, 0x7564,
-	0x751a, 0x751e, 0x0002, 0x001d, 0x0007, 0x0004, 0x000a, 0x001b,
-	0x0005, 0x0006, 0x000a, 0x001d, 0x0005, 0x0004, 0x0076, 0x0066,
-	0xafb8, 0xaebc, 0xa804, 0x2050, 0xb0c0, 0xb0e2, 0xb0bc, 0xb0de,
-	0xb0b8, 0xb0d2, 0xb0b4, 0xb0ce, 0xb6da, 0xb7d6, 0xb0b0, 0xb0ca,
-	0xb0ac, 0xb0c6, 0xb0a8, 0xb0ba, 0xb0a4, 0xb0b6, 0xb6c2, 0xb7be,
-	0xb0a0, 0xb0b2, 0xb09c, 0xb0ae, 0xb098, 0xb0a2, 0xb094, 0xb09e,
-	0xb6aa, 0xb7a6, 0xb090, 0xb09a, 0xb08c, 0xb096, 0xb088, 0xb08a,
-	0xb084, 0xb086, 0xb692, 0xb78e, 0xb080, 0xb082, 0xb07c, 0xb07e,
-	0xb078, 0xb072, 0xb074, 0xb06e, 0xb67a, 0xb776, 0xb004, 0x9055,
-	0x1958, 0x006e, 0x007e, 0x0005, 0x2009, 0x1833, 0x210c, 0x81ff,
-	0x1178, 0x080c, 0x5c5c, 0x1108, 0x0005, 0x080c, 0x6a5c, 0x0126,
-	0x2091, 0x8000, 0x080c, 0xb9bc, 0x080c, 0x683f, 0x012e, 0x0ca0,
-	0x080c, 0xbdd0, 0x1d70, 0x2001, 0x0028, 0x900e, 0x0c70, 0x2009,
-	0x1833, 0x210c, 0x81ff, 0x11d8, 0xa888, 0x9005, 0x01e0, 0xa883,
-	0x0000, 0xa87c, 0xd0f4, 0x0120, 0x080c, 0x5d6f, 0x1138, 0x0005,
-	0x9006, 0xa87a, 0x080c, 0x5cea, 0x1108, 0x0005, 0x0126, 0x2091,
-	0x8000, 0xa87a, 0xa982, 0x080c, 0x683f, 0x012e, 0x0cb0, 0x2001,
-	0x0028, 0x900e, 0x0c98, 0x2001, 0x0000, 0x0c80, 0x7018, 0xa802,
-	0x2908, 0x2048, 0xa906, 0x711a, 0x7010, 0x8001, 0x7012, 0x0118,
-	0x7007, 0x0003, 0x0030, 0x7014, 0x2048, 0x7007, 0x0001, 0x7048,
-	0x080f, 0x0005, 0x00b6, 0x7007, 0x0001, 0xa974, 0xa878, 0x9084,
-	0x00ff, 0x9096, 0x0004, 0x0540, 0x20a9, 0x0001, 0x9096, 0x0001,
-	0x0190, 0x900e, 0x20a9, 0x0800, 0x9096, 0x0002, 0x0160, 0x9005,
-	0x11d8, 0xa974, 0x080c, 0x6166, 0x11b8, 0x0066, 0xae80, 0x080c,
-	0x6276, 0x006e, 0x0088, 0x0046, 0x2011, 0x180c, 0x2224, 0xc484,
-	0x2412, 0x004e, 0x00c6, 0x080c, 0x6166, 0x1110, 0x080c, 0x6445,
-	0x8108, 0x1f04, 0x75e3, 0x00ce, 0xa87c, 0xd084, 0x1120, 0x080c,
-	0x1055, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x683f,
-	0x012e, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001,
-	0x080c, 0x6559, 0x0580, 0x2061, 0x1a3d, 0x6100, 0xd184, 0x0178,
-	0xa888, 0x9084, 0x00ff, 0x1550, 0x6000, 0xd084, 0x0520, 0x6004,
-	0x9005, 0x1538, 0x6003, 0x0000, 0x600b, 0x0000, 0x00c8, 0x2011,
-	0x0001, 0xa890, 0x9005, 0x1110, 0x2001, 0x001e, 0x8000, 0x6016,
-	0xa888, 0x9084, 0x00ff, 0x0178, 0x6006, 0xa888, 0x8007, 0x9084,
-	0x00ff, 0x0148, 0x600a, 0xa888, 0x8000, 0x1108, 0xc28d, 0x6202,
-	0x012e, 0x0804, 0x783d, 0x012e, 0x0804, 0x7837, 0x012e, 0x0804,
-	0x7831, 0x012e, 0x0804, 0x7834, 0x0126, 0x2091, 0x8000, 0x7007,
-	0x0001, 0x080c, 0x6559, 0x05e0, 0x2061, 0x1a3d, 0x6000, 0xd084,
-	0x05b8, 0x6204, 0x6308, 0xd08c, 0x1530, 0xac78, 0x9484, 0x0003,
-	0x0170, 0xa988, 0x918c, 0x00ff, 0x8001, 0x1120, 0x2100, 0x9210,
-	0x0620, 0x0028, 0x8001, 0x1508, 0x2100, 0x9212, 0x02f0, 0x9484,
-	0x000c, 0x0188, 0xa988, 0x810f, 0x918c, 0x00ff, 0x9082, 0x0004,
-	0x1120, 0x2100, 0x9318, 0x0288, 0x0030, 0x9082, 0x0004, 0x1168,
-	0x2100, 0x931a, 0x0250, 0xa890, 0x9005, 0x0110, 0x8000, 0x6016,
-	0x6206, 0x630a, 0x012e, 0x0804, 0x783d, 0x012e, 0x0804, 0x783a,
-	0x012e, 0x0804, 0x7837, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001,
-	0x2061, 0x1a3d, 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318, 0x0220,
-	0x630a, 0x012e, 0x0804, 0x784b, 0x012e, 0x0804, 0x783a, 0x00b6,
-	0x0126, 0x00c6, 0x2091, 0x8000, 0x7007, 0x0001, 0xa87c, 0xd0ac,
-	0x0148, 0x00c6, 0x2061, 0x1a3d, 0x6000, 0x9084, 0xfcff, 0x6002,
-	0x00ce, 0x0440, 0xa888, 0x9005, 0x05d8, 0xa88c, 0x9065, 0x0598,
-	0x2001, 0x1833, 0x2004, 0x9005, 0x0118, 0x080c, 0x9a9f, 0x0068,
-	0x6017, 0xf400, 0x6063, 0x0000, 0xa97c, 0xd1a4, 0x0110, 0xa980,
-	0x6162, 0x2009, 0x0041, 0x080c, 0x9b03, 0xa988, 0x918c, 0xff00,
-	0x9186, 0x2000, 0x1138, 0x0026, 0x900e, 0x2011, 0xfdff, 0x080c,
-	0x8248, 0x002e, 0xa87c, 0xd0c4, 0x0148, 0x2061, 0x1a3d, 0x6000,
-	0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce, 0x012e,
-	0x00be, 0x0804, 0x783d, 0x00ce, 0x012e, 0x00be, 0x0804, 0x7837,
-	0xa984, 0x9186, 0x002e, 0x0d30, 0x9186, 0x002d, 0x0d18, 0x9186,
-	0x0045, 0x0510, 0x9186, 0x002a, 0x1130, 0x2001, 0x180c, 0x200c,
-	0xc194, 0x2102, 0x08b8, 0x9186, 0x0020, 0x0158, 0x9186, 0x0029,
-	0x1d10, 0xa974, 0x080c, 0x6166, 0x1968, 0xb800, 0xc0e4, 0xb802,
-	0x0848, 0xa88c, 0x9065, 0x09b8, 0x6007, 0x0024, 0x2001, 0x1955,
-	0x2004, 0x601a, 0x0804, 0x76d2, 0xa88c, 0x9065, 0x0960, 0x00e6,
-	0xa890, 0x9075, 0x2001, 0x1833, 0x2004, 0x9005, 0x0150, 0x080c,
-	0x9a9f, 0x8eff, 0x0118, 0x2e60, 0x080c, 0x9a9f, 0x00ee, 0x0804,
-	0x76d2, 0x6024, 0xc0dc, 0xc0d5, 0x6026, 0x2e60, 0x6007, 0x003a,
-	0xa8a0, 0x9005, 0x0130, 0x6007, 0x003b, 0xa8a4, 0x602e, 0xa8a8,
-	0x6016, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x832e, 0x00ee,
-	0x0804, 0x76d2, 0x2061, 0x1a3d, 0x6000, 0xd084, 0x0190, 0xd08c,
-	0x1904, 0x784b, 0x0126, 0x2091, 0x8000, 0x6204, 0x8210, 0x0220,
-	0x6206, 0x012e, 0x0804, 0x784b, 0x012e, 0xa883, 0x0016, 0x0804,
-	0x7844, 0xa883, 0x0007, 0x0804, 0x7844, 0xa864, 0x8007, 0x9084,
-	0x00ff, 0x0130, 0x8001, 0x1138, 0x7007, 0x0001, 0x0069, 0x0005,
-	0x080c, 0x73cd, 0x0040, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016,
-	0x701a, 0x704b, 0x7774, 0x0005, 0x00b6, 0x00e6, 0x0126, 0x2091,
-	0x8000, 0x903e, 0x2061, 0x1800, 0x61cc, 0x81ff, 0x1904, 0x77f6,
-	0x6130, 0xd194, 0x1904, 0x7820, 0xa878, 0x2070, 0x9e82, 0x1ddc,
-	0x0a04, 0x77ea, 0x6064, 0x9e02, 0x1a04, 0x77ea, 0x7120, 0x9186,
-	0x0006, 0x1904, 0x77dc, 0x7010, 0x905d, 0x0904, 0x77f6, 0xb800,
-	0xd0e4, 0x1904, 0x781a, 0x2061, 0x1a3d, 0x6100, 0x9184, 0x0301,
-	0x9086, 0x0001, 0x15a0, 0x7024, 0xd0dc, 0x1904, 0x7823, 0xa883,
-	0x0000, 0xa803, 0x0000, 0x2908, 0x7014, 0x9005, 0x1198, 0x7116,
-	0xa87c, 0xd0f4, 0x1904, 0x7826, 0x080c, 0x529d, 0xd09c, 0x1118,
-	0xa87c, 0xc0cc, 0xa87e, 0x2e60, 0x080c, 0x813b, 0x012e, 0x00ee,
-	0x00be, 0x0005, 0x2048, 0xa800, 0x9005, 0x1de0, 0xa902, 0x2148,
-	0xa87c, 0xd0f4, 0x1904, 0x7826, 0x012e, 0x00ee, 0x00be, 0x0005,
-	0x012e, 0x00ee, 0xa883, 0x0006, 0x00be, 0x0804, 0x7844, 0xd184,
-	0x0db8, 0xd1c4, 0x1190, 0x00a0, 0xa974, 0x080c, 0x6166, 0x15d0,
-	0xb800, 0xd0e4, 0x15b8, 0x7120, 0x9186, 0x0007, 0x1118, 0xa883,
-	0x0002, 0x0490, 0xa883, 0x0008, 0x0478, 0xa883, 0x000e, 0x0460,
-	0xa883, 0x0017, 0x0448, 0xa883, 0x0035, 0x0430, 0x080c, 0x52a1,
-	0xd0fc, 0x01e8, 0xa878, 0x2070, 0x9e82, 0x1ddc, 0x02c0, 0x6064,
-	0x9e02, 0x12a8, 0x7120, 0x9186, 0x0006, 0x1188, 0x7010, 0x905d,
-	0x0170, 0xb800, 0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000, 0x9086,
-	0x0007, 0x1904, 0x7780, 0x7003, 0x0002, 0x0804, 0x7780, 0xa883,
-	0x0028, 0x0010, 0xa883, 0x0029, 0x012e, 0x00ee, 0x00be, 0x0420,
-	0xa883, 0x002a, 0x0cc8, 0xa883, 0x0045, 0x0cb0, 0x2e60, 0x2019,
-	0x0002, 0x601b, 0x0014, 0x080c, 0xcc56, 0x012e, 0x00ee, 0x00be,
-	0x0005, 0x2009, 0x003e, 0x0058, 0x2009, 0x0004, 0x0040, 0x2009,
-	0x0006, 0x0028, 0x2009, 0x0016, 0x0010, 0x2009, 0x0001, 0xa884,
-	0x9084, 0xff00, 0x9105, 0xa886, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x683f, 0x012e, 0x0005, 0x080c, 0x1055, 0x0005, 0x00d6, 0x080c,
-	0x8132, 0x00de, 0x0005, 0x00d6, 0x00e6, 0x0126, 0x2091, 0x8000,
-	0x2071, 0x0040, 0x702c, 0xd084, 0x01d8, 0x908c, 0x0780, 0x190c,
-	0x78df, 0xd09c, 0x11a8, 0x2071, 0x1800, 0x70bc, 0x90ea, 0x0040,
-	0x0278, 0x8001, 0x70be, 0x702c, 0x2048, 0xa800, 0x702e, 0x9006,
-	0xa802, 0xa806, 0x2071, 0x0040, 0x2900, 0x7022, 0x702c, 0x0c28,
-	0x012e, 0x00ee, 0x00de, 0x0005, 0x0006, 0x9084, 0x0780, 0x190c,
-	0x78df, 0x000e, 0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026, 0x0016,
-	0x00b6, 0x7007, 0x0001, 0xaa74, 0x9282, 0x0004, 0x1a04, 0x78d0,
-	0xa97c, 0x9188, 0x1000, 0x2104, 0x905d, 0xb804, 0xd284, 0x0140,
-	0x05e8, 0x8007, 0x9084, 0x00ff, 0x9084, 0x0006, 0x1108, 0x04b0,
-	0x2b10, 0x080c, 0x9a0f, 0x1118, 0x080c, 0x9ad6, 0x05a8, 0x6212,
-	0xa874, 0x0002, 0x78ae, 0x78b3, 0x78b6, 0x78bc, 0x2019, 0x0002,
-	0x080c, 0xd046, 0x0060, 0x080c, 0xcfd6, 0x0048, 0x2019, 0x0002,
-	0xa980, 0x080c, 0xcff5, 0x0018, 0xa980, 0x080c, 0xcfd6, 0x080c,
-	0x9a65, 0xa887, 0x0000, 0x0126, 0x2091, 0x8000, 0x080c, 0x683f,
-	0x012e, 0x00be, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00de, 0x0005,
-	0xa887, 0x0006, 0x0c80, 0xa887, 0x0002, 0x0c68, 0xa887, 0x0005,
-	0x0c50, 0xa887, 0x0004, 0x0c38, 0xa887, 0x0007, 0x0c20, 0x2091,
-	0x8000, 0x0e04, 0x78e1, 0x0006, 0x0016, 0x2001, 0x8003, 0x0006,
-	0x0804, 0x0d6e, 0x0005, 0x00f6, 0x2079, 0x0300, 0x2001, 0x0200,
-	0x200c, 0xc1e5, 0xc1dc, 0x2102, 0x2009, 0x0218, 0x210c, 0xd1ec,
-	0x1120, 0x080c, 0x1524, 0x00fe, 0x0005, 0x2001, 0x020d, 0x2003,
-	0x0020, 0x781f, 0x0300, 0x00fe, 0x0005, 0x781c, 0xd08c, 0x0904,
-	0x794d, 0x68bc, 0x90aa, 0x0005, 0x0a04, 0x7ecd, 0x7d44, 0x7c40,
-	0xd59c, 0x190c, 0x0d65, 0x9584, 0x00f6, 0x1508, 0x9484, 0x7000,
-	0x0138, 0x908a, 0x2000, 0x1258, 0x9584, 0x0700, 0x8007, 0x0470,
-	0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x0db0, 0x00b0, 0x9484,
-	0x0fff, 0x1130, 0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x11c0,
-	0x080c, 0xd3ff, 0x080c, 0x7e14, 0x7817, 0x0140, 0x00a8, 0x9584,
-	0x0076, 0x1118, 0x080c, 0x7e70, 0x19c8, 0xd5a4, 0x0148, 0x0046,
-	0x0056, 0x080c, 0x799d, 0x080c, 0x1f82, 0x005e, 0x004e, 0x0020,
-	0x080c, 0xd3ff, 0x7817, 0x0140, 0x0489, 0x0005, 0x0002, 0x795a,
-	0x7c36, 0x7957, 0x7957, 0x7957, 0x7957, 0x7957, 0x7957, 0x7817,
-	0x0140, 0x0005, 0x7000, 0x908c, 0xff00, 0x9194, 0xf000, 0x810f,
-	0x9484, 0x0fff, 0x688e, 0x9286, 0x2000, 0x1150, 0x6800, 0x9086,
-	0x0001, 0x1118, 0x080c, 0x52f4, 0x0070, 0x080c, 0x79bd, 0x0058,
-	0x9286, 0x3000, 0x1118, 0x080c, 0x7b73, 0x0028, 0x9286, 0x8000,
-	0x1110, 0x080c, 0x7d4a, 0x7817, 0x0140, 0x0005, 0x2001, 0x1810,
-	0x2004, 0xd08c, 0x0178, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003,
-	0x1148, 0x0026, 0x0036, 0x2011, 0x8048, 0x2518, 0x080c, 0x47fb,
-	0x003e, 0x002e, 0x0005, 0x0036, 0x0046, 0x0056, 0x00f6, 0x2079,
-	0x0200, 0x2019, 0xfffe, 0x7c30, 0x0050, 0x0036, 0x0046, 0x0056,
-	0x00f6, 0x2079, 0x0200, 0x7d44, 0x7c40, 0x2019, 0xffff, 0x2001,
-	0x1810, 0x2004, 0xd08c, 0x0160, 0x2001, 0x1800, 0x2004, 0x9086,
-	0x0003, 0x1130, 0x0026, 0x2011, 0x8048, 0x080c, 0x47fb, 0x002e,
-	0x00fe, 0x005e, 0x004e, 0x003e, 0x0005, 0x00b6, 0x00c6, 0x7010,
-	0x9084, 0xff00, 0x8007, 0x9096, 0x0001, 0x0120, 0x9096, 0x0023,
-	0x1904, 0x7b44, 0x9186, 0x0023, 0x15c0, 0x080c, 0x7ddf, 0x0904,
-	0x7b44, 0x6120, 0x9186, 0x0001, 0x0150, 0x9186, 0x0004, 0x0138,
-	0x9186, 0x0008, 0x0120, 0x9186, 0x000a, 0x1904, 0x7b44, 0x7124,
-	0x610a, 0x7030, 0x908e, 0x0200, 0x1130, 0x2009, 0x0015, 0x080c,
-	0x9b03, 0x0804, 0x7b44, 0x908e, 0x0214, 0x0118, 0x908e, 0x0210,
-	0x1130, 0x2009, 0x0015, 0x080c, 0x9b03, 0x0804, 0x7b44, 0x908e,
-	0x0100, 0x1904, 0x7b44, 0x7034, 0x9005, 0x1904, 0x7b44, 0x2009,
-	0x0016, 0x080c, 0x9b03, 0x0804, 0x7b44, 0x9186, 0x0022, 0x1904,
-	0x7b44, 0x7030, 0x908e, 0x0300, 0x1580, 0x68d8, 0xd0a4, 0x0528,
-	0xc0b5, 0x68da, 0x7100, 0x918c, 0x00ff, 0x697a, 0x7004, 0x687e,
-	0x00f6, 0x2079, 0x0100, 0x79e6, 0x78ea, 0x0006, 0x9084, 0x00ff,
-	0x0016, 0x2008, 0x080c, 0x2438, 0x7932, 0x7936, 0x001e, 0x000e,
-	0x00fe, 0x080c, 0x23ef, 0x695a, 0x703c, 0x00e6, 0x2071, 0x0140,
-	0x7086, 0x2071, 0x1800, 0x70b2, 0x00ee, 0x7034, 0x9005, 0x1904,
-	0x7b44, 0x2009, 0x0017, 0x0804, 0x7b11, 0x908e, 0x0400, 0x1190,
-	0x7034, 0x9005, 0x1904, 0x7b44, 0x080c, 0x6f5c, 0x0120, 0x2009,
-	0x001d, 0x0804, 0x7b11, 0x68d8, 0xc0a5, 0x68da, 0x2009, 0x0030,
-	0x0804, 0x7b11, 0x908e, 0x0500, 0x1140, 0x7034, 0x9005, 0x1904,
-	0x7b44, 0x2009, 0x0018, 0x0804, 0x7b11, 0x908e, 0x2010, 0x1120,
-	0x2009, 0x0019, 0x0804, 0x7b11, 0x908e, 0x2110, 0x1120, 0x2009,
-	0x001a, 0x0804, 0x7b11, 0x908e, 0x5200, 0x1140, 0x7034, 0x9005,
-	0x1904, 0x7b44, 0x2009, 0x001b, 0x0804, 0x7b11, 0x908e, 0x5000,
-	0x1140, 0x7034, 0x9005, 0x1904, 0x7b44, 0x2009, 0x001c, 0x0804,
-	0x7b11, 0x908e, 0x1300, 0x1120, 0x2009, 0x0034, 0x0804, 0x7b11,
-	0x908e, 0x1200, 0x1140, 0x7034, 0x9005, 0x1904, 0x7b44, 0x2009,
-	0x0024, 0x0804, 0x7b11, 0x908c, 0xff00, 0x918e, 0x2400, 0x1170,
-	0x2009, 0x002d, 0x2001, 0x1810, 0x2004, 0xd09c, 0x0904, 0x7b11,
-	0x080c, 0xc495, 0x1904, 0x7b44, 0x0804, 0x7b0f, 0x908c, 0xff00,
-	0x918e, 0x5300, 0x1120, 0x2009, 0x002a, 0x0804, 0x7b11, 0x908e,
-	0x0f00, 0x1120, 0x2009, 0x0020, 0x0804, 0x7b11, 0x908e, 0x5300,
-	0x1108, 0x0440, 0x908e, 0x6104, 0x1528, 0x2029, 0x0205, 0x2011,
-	0x026d, 0x8208, 0x2204, 0x9082, 0x0004, 0x8004, 0x8004, 0x20a8,
-	0x2011, 0x8015, 0x211c, 0x8108, 0x0046, 0x2124, 0x080c, 0x47fb,
-	0x004e, 0x8108, 0x0f04, 0x7add, 0x9186, 0x0280, 0x1d88, 0x2504,
-	0x8000, 0x202a, 0x2009, 0x0260, 0x0c58, 0x202b, 0x0000, 0x2009,
-	0x0023, 0x0478, 0x908e, 0x6000, 0x1118, 0x2009, 0x003f, 0x0448,
-	0x908e, 0x7800, 0x1118, 0x2009, 0x0045, 0x0418, 0x908e, 0x1000,
-	0x1118, 0x2009, 0x004e, 0x00e8, 0x908e, 0x6300, 0x1118, 0x2009,
-	0x004a, 0x00b8, 0x908c, 0xff00, 0x918e, 0x5600, 0x1118, 0x2009,
-	0x004f, 0x0078, 0x908c, 0xff00, 0x918e, 0x5700, 0x1118, 0x2009,
-	0x0050, 0x0038, 0x2009, 0x001d, 0x6838, 0xd0d4, 0x0110, 0x2009,
-	0x004c, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c,
-	0x23ef, 0x1568, 0x080c, 0x6106, 0x1550, 0xbe12, 0xbd16, 0x001e,
-	0x0016, 0xb884, 0x9005, 0x1168, 0x9186, 0x0046, 0x1150, 0x6878,
-	0x9606, 0x1138, 0x687c, 0x9506, 0x9084, 0xff00, 0x1110, 0x001e,
-	0x0098, 0x080c, 0x9a0f, 0x01a8, 0x2b08, 0x6112, 0x6023, 0x0004,
-	0x7120, 0x610a, 0x001e, 0x9186, 0x004c, 0x1110, 0x6023, 0x000a,
-	0x0016, 0x001e, 0x080c, 0x9b03, 0x00ce, 0x00be, 0x0005, 0x001e,
-	0x0cd8, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049,
-	0x080c, 0x47fb, 0x080c, 0x9ad6, 0x0d90, 0x2b08, 0x6112, 0x6023,
-	0x0004, 0x7120, 0x610a, 0x001e, 0x0016, 0x9186, 0x0017, 0x0118,
-	0x9186, 0x0030, 0x1128, 0x6007, 0x0009, 0x6017, 0x2900, 0x0020,
-	0x6007, 0x0051, 0x6017, 0x0000, 0x602f, 0x0009, 0x6003, 0x0001,
-	0x080c, 0x8335, 0x08a0, 0x080c, 0x3107, 0x1140, 0x7010, 0x9084,
-	0xff00, 0x8007, 0x908e, 0x0008, 0x1108, 0x0009, 0x0005, 0x00b6,
-	0x00c6, 0x0046, 0x7000, 0x908c, 0xff00, 0x810f, 0x9186, 0x0033,
-	0x11e8, 0x080c, 0x7ddf, 0x0904, 0x7bce, 0x7124, 0x610a, 0x7030,
-	0x908e, 0x0200, 0x1140, 0x7034, 0x9005, 0x15c0, 0x2009, 0x0015,
-	0x080c, 0x9b03, 0x0498, 0x908e, 0x0100, 0x1580, 0x7034, 0x9005,
-	0x1568, 0x2009, 0x0016, 0x080c, 0x9b03, 0x0440, 0x9186, 0x0032,
-	0x1528, 0x7030, 0x908e, 0x1400, 0x1508, 0x2009, 0x0038, 0x0016,
-	0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x23ef, 0x11a8,
-	0x080c, 0x6106, 0x1190, 0xbe12, 0xbd16, 0x080c, 0x9a0f, 0x0168,
-	0x2b08, 0x6112, 0x080c, 0xbb52, 0x6023, 0x0004, 0x7120, 0x610a,
-	0x001e, 0x080c, 0x9b03, 0x0010, 0x00ce, 0x001e, 0x004e, 0x00ce,
-	0x00be, 0x0005, 0x00b6, 0x0046, 0x00e6, 0x00d6, 0x2028, 0x2130,
-	0x9696, 0x00ff, 0x11b8, 0x9592, 0xfffc, 0x02a0, 0x9596, 0xfffd,
-	0x1120, 0x2009, 0x007f, 0x0804, 0x7c30, 0x9596, 0xfffe, 0x1120,
-	0x2009, 0x007e, 0x0804, 0x7c30, 0x9596, 0xfffc, 0x1118, 0x2009,
-	0x0080, 0x04f0, 0x2011, 0x0000, 0x2019, 0x1836, 0x231c, 0xd3ac,
-	0x0130, 0x9026, 0x20a9, 0x0800, 0x2071, 0x1000, 0x0030, 0x2021,
-	0x0081, 0x20a9, 0x077f, 0x2071, 0x1081, 0x2e1c, 0x93dd, 0x0000,
-	0x1140, 0x82ff, 0x11d0, 0x9496, 0x00ff, 0x01b8, 0x2410, 0xc2fd,
-	0x00a0, 0xbf10, 0x2600, 0x9706, 0xb814, 0x1120, 0x9546, 0x1110,
-	0x2408, 0x00b0, 0x9745, 0x1148, 0x94c6, 0x007e, 0x0130, 0x94c6,
-	0x007f, 0x0118, 0x94c6, 0x0080, 0x1d20, 0x8420, 0x8e70, 0x1f04,
-	0x7c05, 0x82ff, 0x1118, 0x9085, 0x0001, 0x0018, 0xc2fc, 0x2208,
-	0x9006, 0x00de, 0x00ee, 0x004e, 0x00be, 0x0005, 0x7000, 0x908c,
-	0xff00, 0x810f, 0x9184, 0x000f, 0x0002, 0x7c4d, 0x7c4d, 0x7c4d,
-	0x7df1, 0x7c4d, 0x7c50, 0x7c75, 0x7cfe, 0x7c4d, 0x7c4d, 0x7c4d,
-	0x7c4d, 0x7c4d, 0x7c4d, 0x7c4d, 0x7c4d, 0x7817, 0x0140, 0x0005,
-	0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7120, 0x2160, 0x9c8c, 0x0003,
-	0x11c0, 0x9c8a, 0x1ddc, 0x02a8, 0x6864, 0x9c02, 0x1290, 0x7008,
-	0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1150, 0x700c,
-	0xb914, 0x9106, 0x1130, 0x7124, 0x610a, 0x2009, 0x0046, 0x080c,
-	0x9b03, 0x7817, 0x0140, 0x00be, 0x0005, 0x00b6, 0x00c6, 0x9484,
-	0x0fff, 0x0904, 0x7cda, 0x7110, 0xd1bc, 0x1904, 0x7cda, 0x7108,
-	0x700c, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, 0xff00, 0x15c8,
-	0x81ff, 0x15b8, 0x9080, 0x3142, 0x200d, 0x918c, 0xff00, 0x810f,
-	0x2001, 0x0080, 0x9106, 0x0904, 0x7cda, 0x9182, 0x0801, 0x1a04,
-	0x7cda, 0x9190, 0x1000, 0x2204, 0x905d, 0x05e0, 0xbe12, 0xbd16,
-	0xb800, 0xd0ec, 0x15b8, 0xba04, 0x9294, 0xff00, 0x9286, 0x0600,
-	0x1190, 0x080c, 0x9a0f, 0x0598, 0x2b08, 0x7028, 0x6052, 0x702c,
-	0x604e, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a, 0x7130, 0x615e,
-	0x080c, 0xc6f5, 0x00f8, 0x080c, 0x655d, 0x1138, 0xb807, 0x0606,
-	0x0c40, 0x190c, 0x7bd2, 0x11b0, 0x0880, 0x080c, 0x9a0f, 0x2b08,
-	0x0188, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x9286, 0x0400,
-	0x1118, 0x6007, 0x0005, 0x0010, 0x6007, 0x0001, 0x6003, 0x0001,
-	0x080c, 0x8335, 0x7817, 0x0140, 0x00ce, 0x00be, 0x0005, 0x2001,
-	0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x47fb,
-	0x080c, 0x9ad6, 0x0d78, 0x2b08, 0x6112, 0x6023, 0x0006, 0x7120,
-	0x610a, 0x7130, 0x615e, 0x6017, 0xf300, 0x6003, 0x0001, 0x6007,
-	0x0041, 0x2009, 0xa022, 0x080c, 0x832e, 0x08e0, 0x00b6, 0x7110,
-	0xd1bc, 0x05d0, 0x7020, 0x2060, 0x9c84, 0x0003, 0x15a8, 0x9c82,
-	0x1ddc, 0x0690, 0x6864, 0x9c02, 0x1678, 0x9484, 0x0fff, 0x9082,
-	0x000c, 0x0650, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910,
-	0x9106, 0x1510, 0x700c, 0xb914, 0x9106, 0x11f0, 0x7124, 0x610a,
-	0x601c, 0xd0fc, 0x11c8, 0x2001, 0x0271, 0x2004, 0x9005, 0x1180,
-	0x9484, 0x0fff, 0x9082, 0x000c, 0x0158, 0x0066, 0x2031, 0x0100,
-	0xa001, 0xa001, 0x8631, 0x1de0, 0x006e, 0x601c, 0xd0fc, 0x1120,
-	0x2009, 0x0045, 0x080c, 0x9b03, 0x7817, 0x0140, 0x00be, 0x0005,
-	0x6120, 0x9186, 0x0002, 0x0128, 0x9186, 0x0005, 0x0110, 0x9085,
-	0x0001, 0x0005, 0x080c, 0x3107, 0x1168, 0x7010, 0x9084, 0xff00,
-	0x8007, 0x9086, 0x0000, 0x1130, 0x9184, 0x000f, 0x908a, 0x0006,
-	0x1208, 0x000b, 0x0005, 0x7d61, 0x7d62, 0x7d61, 0x7d61, 0x7dc1,
-	0x7dd0, 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084,
-	0x0904, 0x7dbf, 0x700c, 0x7108, 0x080c, 0x23ef, 0x1904, 0x7dbf,
-	0x080c, 0x6106, 0x1904, 0x7dbf, 0xbe12, 0xbd16, 0x7110, 0xd1bc,
-	0x01d8, 0x080c, 0x655d, 0x0118, 0x9086, 0x0004, 0x1588, 0x00c6,
-	0x080c, 0x7ddf, 0x00ce, 0x05d8, 0x080c, 0x9a0f, 0x2b08, 0x05b8,
-	0x6112, 0x080c, 0xbb52, 0x6023, 0x0002, 0x7120, 0x610a, 0x2009,
-	0x0088, 0x080c, 0x9b03, 0x0458, 0x080c, 0x655d, 0x0148, 0x9086,
-	0x0004, 0x0130, 0x080c, 0x6565, 0x0118, 0x9086, 0x0004, 0x1180,
-	0x080c, 0x9a0f, 0x2b08, 0x01d8, 0x6112, 0x080c, 0xbb52, 0x6023,
-	0x0005, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0x9b03, 0x0078,
-	0x080c, 0x9a0f, 0x2b08, 0x0158, 0x6112, 0x080c, 0xbb52, 0x6023,
-	0x0004, 0x7120, 0x610a, 0x2009, 0x0001, 0x080c, 0x9b03, 0x00be,
-	0x0005, 0x7110, 0xd1bc, 0x0158, 0x00d1, 0x0148, 0x080c, 0x7d40,
-	0x1130, 0x7124, 0x610a, 0x2009, 0x0089, 0x080c, 0x9b03, 0x0005,
-	0x7110, 0xd1bc, 0x0158, 0x0059, 0x0148, 0x080c, 0x7d40, 0x1130,
-	0x7124, 0x610a, 0x2009, 0x008a, 0x080c, 0x9b03, 0x0005, 0x7020,
-	0x2060, 0x9c84, 0x0003, 0x1158, 0x9c82, 0x1ddc, 0x0240, 0x2001,
-	0x1819, 0x2004, 0x9c02, 0x1218, 0x9085, 0x0001, 0x0005, 0x9006,
-	0x0ce8, 0x00b6, 0x7110, 0xd1bc, 0x11d8, 0x7024, 0x2060, 0x9c84,
-	0x0003, 0x11b0, 0x9c82, 0x1ddc, 0x0298, 0x6864, 0x9c02, 0x1280,
-	0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1140,
-	0x700c, 0xb914, 0x9106, 0x1120, 0x2009, 0x0051, 0x080c, 0x9b03,
-	0x7817, 0x0140, 0x00be, 0x0005, 0x2031, 0x0105, 0x0069, 0x0005,
-	0x2031, 0x0206, 0x0049, 0x0005, 0x2031, 0x0207, 0x0029, 0x0005,
-	0x2031, 0x0213, 0x0009, 0x0005, 0x00c6, 0x0096, 0x00f6, 0x7000,
-	0x9084, 0xf000, 0x9086, 0xc000, 0x05c0, 0x080c, 0x9a0f, 0x05a8,
-	0x0066, 0x00c6, 0x0046, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c,
-	0x080c, 0x23ef, 0x1590, 0x080c, 0x6106, 0x1578, 0xbe12, 0xbd16,
-	0x2b00, 0x004e, 0x00ce, 0x6012, 0x080c, 0xbb52, 0x080c, 0x1023,
-	0x0500, 0x2900, 0x6062, 0x9006, 0xa802, 0xa866, 0xac6a, 0xa85c,
-	0x90f8, 0x001b, 0x20a9, 0x000e, 0xa860, 0x20e8, 0x20e1, 0x0000,
-	0x2fa0, 0x2e98, 0x4003, 0x006e, 0x6616, 0x6007, 0x003e, 0x6023,
-	0x0001, 0x6003, 0x0001, 0x080c, 0x8335, 0x00fe, 0x009e, 0x00ce,
-	0x0005, 0x080c, 0x9a65, 0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8,
-	0x00c6, 0x7000, 0x908c, 0xff00, 0x9184, 0xf000, 0x810f, 0x9086,
-	0x2000, 0x1904, 0x7ec7, 0x9186, 0x0022, 0x15f0, 0x2001, 0x0111,
-	0x2004, 0x9005, 0x1904, 0x7ec9, 0x7030, 0x908e, 0x0400, 0x0904,
-	0x7ec9, 0x908e, 0x6000, 0x05e8, 0x908e, 0x5400, 0x05d0, 0x908e,
-	0x0300, 0x11d8, 0x2009, 0x1836, 0x210c, 0xd18c, 0x1590, 0xd1a4,
-	0x1580, 0x080c, 0x651b, 0x0558, 0x68ac, 0x9084, 0x00ff, 0x7100,
-	0x918c, 0x00ff, 0x9106, 0x1518, 0x687c, 0x69ac, 0x918c, 0xff00,
-	0x9105, 0x7104, 0x9106, 0x11d8, 0x00e0, 0x2009, 0x0103, 0x210c,
-	0xd1b4, 0x11a8, 0x908e, 0x5200, 0x09e8, 0x908e, 0x0500, 0x09d0,
-	0x908e, 0x5000, 0x09b8, 0x0058, 0x9186, 0x0023, 0x1140, 0x080c,
-	0x7ddf, 0x0128, 0x6004, 0x9086, 0x0002, 0x0118, 0x0000, 0x9006,
-	0x0010, 0x9085, 0x0001, 0x00ce, 0x0005, 0x00f6, 0x2079, 0x0200,
-	0x7800, 0xc0e5, 0xc0cc, 0x7802, 0x00fe, 0x0005, 0x00f6, 0x2079,
-	0x1800, 0x7834, 0xd084, 0x1130, 0x2079, 0x0200, 0x7800, 0x9085,
-	0x1200, 0x7802, 0x00fe, 0x0005, 0x00e6, 0x2071, 0x1800, 0x7034,
-	0xc084, 0x7036, 0x00ee, 0x0005, 0x2071, 0x19d2, 0x7003, 0x0003,
-	0x700f, 0x0361, 0x9006, 0x701a, 0x7072, 0x7012, 0x7017, 0x1ddc,
-	0x7007, 0x0000, 0x7026, 0x702b, 0x8e43, 0x7032, 0x7037, 0x8ec0,
-	0x703f, 0xffff, 0x7042, 0x7047, 0x5134, 0x704a, 0x705b, 0x8083,
-	0x080c, 0x103c, 0x090c, 0x0d65, 0x2900, 0x703a, 0xa867, 0x0003,
-	0xa86f, 0x0100, 0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x19d2, 0x1d04,
-	0x7faa, 0x2091, 0x6000, 0x700c, 0x8001, 0x700e, 0x1560, 0x2001,
-	0x1875, 0x2004, 0xd0c4, 0x0158, 0x3a00, 0xd08c, 0x1140, 0x20d1,
-	0x0000, 0x20d1, 0x0001, 0x20d1, 0x0000, 0x080c, 0x0d65, 0x700f,
-	0x0361, 0x7007, 0x0001, 0x0126, 0x2091, 0x8000, 0x2069, 0x1800,
-	0x69e8, 0xd1e4, 0x1138, 0xd1dc, 0x1118, 0x080c, 0x80f1, 0x0010,
-	0x080c, 0x80c8, 0x7040, 0x900d, 0x0148, 0x8109, 0x7142, 0x1130,
-	0x7044, 0x080f, 0x0018, 0x0126, 0x2091, 0x8000, 0x7024, 0x900d,
-	0x0188, 0x7020, 0x8001, 0x7022, 0x1168, 0x7023, 0x0009, 0x8109,
-	0x7126, 0x9186, 0x03e8, 0x1110, 0x7028, 0x080f, 0x81ff, 0x1110,
-	0x7028, 0x080f, 0x7030, 0x900d, 0x0180, 0x702c, 0x8001, 0x702e,
-	0x1160, 0x702f, 0x0009, 0x8109, 0x7132, 0x0128, 0x9184, 0x007f,
-	0x090c, 0x8f48, 0x0010, 0x7034, 0x080f, 0x703c, 0x9005, 0x0118,
-	0x0310, 0x8001, 0x703e, 0x704c, 0x900d, 0x0168, 0x7048, 0x8001,
-	0x704a, 0x1148, 0x704b, 0x0009, 0x8109, 0x714e, 0x1120, 0x7150,
-	0x714e, 0x7058, 0x080f, 0x7018, 0x900d, 0x01d8, 0x0016, 0x7070,
-	0x900d, 0x0158, 0x706c, 0x8001, 0x706e, 0x1138, 0x706f, 0x0009,
-	0x8109, 0x7172, 0x1110, 0x7074, 0x080f, 0x001e, 0x7008, 0x8001,
-	0x700a, 0x1138, 0x700b, 0x0009, 0x8109, 0x711a, 0x1110, 0x701c,
-	0x080f, 0x012e, 0x7004, 0x0002, 0x7fd2, 0x7fd3, 0x7ffd, 0x00e6,
-	0x2071, 0x19d2, 0x7018, 0x9005, 0x1120, 0x711a, 0x721e, 0x700b,
-	0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x19d2, 0x701c,
-	0x9206, 0x1120, 0x701a, 0x701e, 0x7072, 0x7076, 0x000e, 0x00ee,
-	0x0005, 0x00e6, 0x2071, 0x19d2, 0xb888, 0x9102, 0x0208, 0xb98a,
-	0x00ee, 0x0005, 0x0005, 0x00b6, 0x2031, 0x0010, 0x7110, 0x080c,
-	0x6166, 0x11a8, 0xb888, 0x8001, 0x0290, 0xb88a, 0x1180, 0x0126,
-	0x2091, 0x8000, 0x0066, 0xb8c0, 0x9005, 0x0138, 0x0026, 0xba3c,
-	0x0016, 0x080c, 0x6291, 0x001e, 0x002e, 0x006e, 0x012e, 0x8108,
-	0x9182, 0x0800, 0x1220, 0x8631, 0x0128, 0x7112, 0x0c00, 0x900e,
-	0x7007, 0x0002, 0x7112, 0x00be, 0x0005, 0x2031, 0x0010, 0x7014,
-	0x2060, 0x0126, 0x2091, 0x8000, 0x6048, 0x9005, 0x0128, 0x8001,
-	0x604a, 0x1110, 0x080c, 0xb9d3, 0x6018, 0x9005, 0x05d8, 0x00f6,
-	0x2079, 0x0300, 0x7918, 0xd1b4, 0x1904, 0x805d, 0x781b, 0x2020,
-	0xa001, 0x7918, 0xd1b4, 0x0118, 0x781b, 0x2000, 0x04f0, 0x8001,
+	0x0804, 0x76c9, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a,
+	0x704b, 0x76c9, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0968,
+	0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x76e4, 0x7007, 0x0003,
+	0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x76e4, 0x0005, 0xa864,
+	0x8007, 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x751d, 0x7007,
+	0x0001, 0x2009, 0x1833, 0x210c, 0x81ff, 0x1904, 0x75c1, 0xa994,
+	0x9186, 0x006f, 0x0188, 0x9186, 0x0074, 0x15b0, 0x0026, 0x2011,
+	0x0010, 0x080c, 0x6684, 0x002e, 0x0578, 0x0016, 0xa998, 0x080c,
+	0x66ce, 0x001e, 0x1548, 0x0400, 0x080c, 0x70ac, 0x0140, 0xa897,
+	0x4005, 0xa89b, 0x0016, 0x2001, 0x0030, 0x900e, 0x0438, 0x0026,
+	0x2011, 0x8008, 0x080c, 0x6684, 0x002e, 0x01b0, 0x0016, 0x0026,
+	0x0036, 0xa998, 0xaaa0, 0xab9c, 0x918d, 0x8000, 0x080c, 0x66ce,
+	0x003e, 0x002e, 0x001e, 0x1140, 0xa897, 0x4005, 0xa89b, 0x4009,
+	0x2001, 0x0030, 0x900e, 0x0050, 0xa868, 0x9084, 0x00ff, 0xa86a,
+	0xa883, 0x0000, 0x080c, 0x5f00, 0x1108, 0x0005, 0x0126, 0x2091,
+	0x8000, 0xa867, 0x0139, 0xa87a, 0xa982, 0x080c, 0x698f, 0x012e,
+	0x0ca0, 0xa994, 0x9186, 0x0071, 0x0904, 0x756f, 0x9186, 0x0064,
+	0x0904, 0x756f, 0x9186, 0x007c, 0x0904, 0x756f, 0x9186, 0x0028,
+	0x0904, 0x756f, 0x9186, 0x0038, 0x0904, 0x756f, 0x9186, 0x0078,
+	0x0904, 0x756f, 0x9186, 0x005f, 0x0904, 0x756f, 0x9186, 0x0056,
+	0x0904, 0x756f, 0xa897, 0x4005, 0xa89b, 0x0001, 0x2001, 0x0030,
+	0x900e, 0x0860, 0xa87c, 0x9084, 0x00c0, 0x9086, 0x00c0, 0x1120,
+	0x7007, 0x0001, 0x0804, 0x78d9, 0x2900, 0x7016, 0x701a, 0x20a9,
+	0x0004, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0030, 0x2098, 0x7050,
+	0x2040, 0xa060, 0x20e8, 0xa05c, 0x9080, 0x0023, 0x20a0, 0x4003,
+	0xa888, 0x7012, 0x9082, 0x0401, 0x1a04, 0x7525, 0xaab4, 0x928a,
+	0x0002, 0x1a04, 0x7525, 0x82ff, 0x1138, 0xa8b8, 0xa9bc, 0x9105,
+	0x0118, 0x2001, 0x7687, 0x0018, 0x9280, 0x767d, 0x2005, 0x7056,
+	0x7010, 0x9015, 0x0904, 0x7668, 0x080c, 0x103b, 0x1118, 0x7007,
+	0x0004, 0x0005, 0x2900, 0x7022, 0x7054, 0x2060, 0xe000, 0xa866,
+	0x7050, 0x2040, 0xa95c, 0xe004, 0x9100, 0xa076, 0xa860, 0xa072,
+	0xe008, 0x920a, 0x1210, 0x900e, 0x2200, 0x7112, 0xe20c, 0x8003,
+	0x800b, 0x9296, 0x0004, 0x0108, 0x9108, 0xa17a, 0x810b, 0xa17e,
+	0x080c, 0x110c, 0xa06c, 0x908e, 0x0100, 0x0170, 0x9086, 0x0200,
+	0x0118, 0x7007, 0x0007, 0x0005, 0x7020, 0x2048, 0x080c, 0x1054,
+	0x7014, 0x2048, 0x0804, 0x7525, 0x7020, 0x2048, 0x7018, 0xa802,
+	0xa807, 0x0000, 0x2908, 0x2048, 0xa906, 0x711a, 0x0804, 0x7620,
+	0x7014, 0x2048, 0x7007, 0x0001, 0xa8b4, 0x9005, 0x1128, 0xa8b8,
+	0xa9bc, 0x9105, 0x0108, 0x00b9, 0xa864, 0x9084, 0x00ff, 0x9086,
+	0x001e, 0x0904, 0x78d9, 0x0804, 0x76c9, 0x767f, 0x7683, 0x0002,
+	0x001d, 0x0007, 0x0004, 0x000a, 0x001b, 0x0005, 0x0006, 0x000a,
+	0x001d, 0x0005, 0x0004, 0x0076, 0x0066, 0xafb8, 0xaebc, 0xa804,
+	0x2050, 0xb0c0, 0xb0e2, 0xb0bc, 0xb0de, 0xb0b8, 0xb0d2, 0xb0b4,
+	0xb0ce, 0xb6da, 0xb7d6, 0xb0b0, 0xb0ca, 0xb0ac, 0xb0c6, 0xb0a8,
+	0xb0ba, 0xb0a4, 0xb0b6, 0xb6c2, 0xb7be, 0xb0a0, 0xb0b2, 0xb09c,
+	0xb0ae, 0xb098, 0xb0a2, 0xb094, 0xb09e, 0xb6aa, 0xb7a6, 0xb090,
+	0xb09a, 0xb08c, 0xb096, 0xb088, 0xb08a, 0xb084, 0xb086, 0xb692,
+	0xb78e, 0xb080, 0xb082, 0xb07c, 0xb07e, 0xb078, 0xb072, 0xb074,
+	0xb06e, 0xb67a, 0xb776, 0xb004, 0x9055, 0x1958, 0x006e, 0x007e,
+	0x0005, 0x2009, 0x1833, 0x210c, 0x81ff, 0x1178, 0x080c, 0x5d4f,
+	0x1108, 0x0005, 0x080c, 0x6bac, 0x0126, 0x2091, 0x8000, 0x080c,
+	0xbb2a, 0x080c, 0x698f, 0x012e, 0x0ca0, 0x080c, 0xbf3f, 0x1d70,
+	0x2001, 0x0028, 0x900e, 0x0c70, 0x2009, 0x1833, 0x210c, 0x81ff,
+	0x11d8, 0xa888, 0x9005, 0x01e0, 0xa883, 0x0000, 0xa87c, 0xd0f4,
+	0x0120, 0x080c, 0x5e62, 0x1138, 0x0005, 0x9006, 0xa87a, 0x080c,
+	0x5ddd, 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0xa87a, 0xa982,
+	0x080c, 0x698f, 0x012e, 0x0cb0, 0x2001, 0x0028, 0x900e, 0x0c98,
+	0x2001, 0x0000, 0x0c80, 0x7018, 0xa802, 0x2908, 0x2048, 0xa906,
+	0x711a, 0x7010, 0x8001, 0x7012, 0x0118, 0x7007, 0x0003, 0x0030,
+	0x7014, 0x2048, 0x7007, 0x0001, 0x7048, 0x080f, 0x0005, 0x00b6,
+	0x7007, 0x0001, 0xa974, 0xa878, 0x9084, 0x00ff, 0x9096, 0x0004,
+	0x0540, 0x20a9, 0x0001, 0x9096, 0x0001, 0x0190, 0x900e, 0x20a9,
+	0x0800, 0x9096, 0x0002, 0x0160, 0x9005, 0x11d8, 0xa974, 0x080c,
+	0x6269, 0x11b8, 0x0066, 0xae80, 0x080c, 0x6379, 0x006e, 0x0088,
+	0x0046, 0x2011, 0x180c, 0x2224, 0xc484, 0x2412, 0x004e, 0x00c6,
+	0x080c, 0x6269, 0x1110, 0x080c, 0x6548, 0x8108, 0x1f04, 0x7748,
+	0x00ce, 0xa87c, 0xd084, 0x1120, 0x080c, 0x1054, 0x00be, 0x0005,
+	0x0126, 0x2091, 0x8000, 0x080c, 0x698f, 0x012e, 0x00be, 0x0005,
+	0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x665c, 0x0580,
+	0x2061, 0x1a3f, 0x6100, 0xd184, 0x0178, 0xa888, 0x9084, 0x00ff,
+	0x1550, 0x6000, 0xd084, 0x0520, 0x6004, 0x9005, 0x1538, 0x6003,
+	0x0000, 0x600b, 0x0000, 0x00c8, 0x2011, 0x0001, 0xa890, 0x9005,
+	0x1110, 0x2001, 0x001e, 0x8000, 0x6016, 0xa888, 0x9084, 0x00ff,
+	0x0178, 0x6006, 0xa888, 0x8007, 0x9084, 0x00ff, 0x0148, 0x600a,
+	0xa888, 0x8000, 0x1108, 0xc28d, 0x6202, 0x012e, 0x0804, 0x79a2,
+	0x012e, 0x0804, 0x799c, 0x012e, 0x0804, 0x7996, 0x012e, 0x0804,
+	0x7999, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x665c,
+	0x05e0, 0x2061, 0x1a3f, 0x6000, 0xd084, 0x05b8, 0x6204, 0x6308,
+	0xd08c, 0x1530, 0xac78, 0x9484, 0x0003, 0x0170, 0xa988, 0x918c,
+	0x00ff, 0x8001, 0x1120, 0x2100, 0x9210, 0x0620, 0x0028, 0x8001,
+	0x1508, 0x2100, 0x9212, 0x02f0, 0x9484, 0x000c, 0x0188, 0xa988,
+	0x810f, 0x918c, 0x00ff, 0x9082, 0x0004, 0x1120, 0x2100, 0x9318,
+	0x0288, 0x0030, 0x9082, 0x0004, 0x1168, 0x2100, 0x931a, 0x0250,
+	0xa890, 0x9005, 0x0110, 0x8000, 0x6016, 0x6206, 0x630a, 0x012e,
+	0x0804, 0x79a2, 0x012e, 0x0804, 0x799f, 0x012e, 0x0804, 0x799c,
+	0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x2061, 0x1a3f, 0x6300,
+	0xd38c, 0x1120, 0x6308, 0x8318, 0x0220, 0x630a, 0x012e, 0x0804,
+	0x79b0, 0x012e, 0x0804, 0x799f, 0x00b6, 0x0126, 0x00c6, 0x2091,
+	0x8000, 0x7007, 0x0001, 0xa87c, 0xd0ac, 0x0148, 0x00c6, 0x2061,
+	0x1a3f, 0x6000, 0x9084, 0xfcff, 0x6002, 0x00ce, 0x0440, 0xa888,
+	0x9005, 0x05d8, 0xa88c, 0x9065, 0x0598, 0x2001, 0x1833, 0x2004,
+	0x9005, 0x0118, 0x080c, 0x9c06, 0x0068, 0x6017, 0xf400, 0x6063,
+	0x0000, 0xa97c, 0xd1a4, 0x0110, 0xa980, 0x6162, 0x2009, 0x0041,
+	0x080c, 0x9c6a, 0xa988, 0x918c, 0xff00, 0x9186, 0x2000, 0x1138,
+	0x0026, 0x900e, 0x2011, 0xfdff, 0x080c, 0x83c3, 0x002e, 0xa87c,
+	0xd0c4, 0x0148, 0x2061, 0x1a3f, 0x6000, 0xd08c, 0x1120, 0x6008,
+	0x8000, 0x0208, 0x600a, 0x00ce, 0x012e, 0x00be, 0x0804, 0x79a2,
+	0x00ce, 0x012e, 0x00be, 0x0804, 0x799c, 0xa984, 0x9186, 0x002e,
+	0x0d30, 0x9186, 0x002d, 0x0d18, 0x9186, 0x0045, 0x0510, 0x9186,
+	0x002a, 0x1130, 0x2001, 0x180c, 0x200c, 0xc194, 0x2102, 0x08b8,
+	0x9186, 0x0020, 0x0158, 0x9186, 0x0029, 0x1d10, 0xa974, 0x080c,
+	0x6269, 0x1968, 0xb800, 0xc0e4, 0xb802, 0x0848, 0xa88c, 0x9065,
+	0x09b8, 0x6007, 0x0024, 0x2001, 0x1957, 0x2004, 0x601a, 0x0804,
+	0x7837, 0xa88c, 0x9065, 0x0960, 0x00e6, 0xa890, 0x9075, 0x2001,
+	0x1833, 0x2004, 0x9005, 0x0150, 0x080c, 0x9c06, 0x8eff, 0x0118,
+	0x2e60, 0x080c, 0x9c06, 0x00ee, 0x0804, 0x7837, 0x6024, 0xc0dc,
+	0xc0d5, 0x6026, 0x2e60, 0x6007, 0x003a, 0xa8a0, 0x9005, 0x0130,
+	0x6007, 0x003b, 0xa8a4, 0x602e, 0xa8a8, 0x6016, 0x6003, 0x0001,
+	0x2009, 0x8020, 0x080c, 0x84a9, 0x00ee, 0x0804, 0x7837, 0x2061,
+	0x1a3f, 0x6000, 0xd084, 0x0190, 0xd08c, 0x1904, 0x79b0, 0x0126,
+	0x2091, 0x8000, 0x6204, 0x8210, 0x0220, 0x6206, 0x012e, 0x0804,
+	0x79b0, 0x012e, 0xa883, 0x0016, 0x0804, 0x79a9, 0xa883, 0x0007,
+	0x0804, 0x79a9, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0130, 0x8001,
+	0x1138, 0x7007, 0x0001, 0x0069, 0x0005, 0x080c, 0x751d, 0x0040,
+	0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x78d9,
+	0x0005, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x903e, 0x2061,
+	0x1800, 0x61cc, 0x81ff, 0x1904, 0x795b, 0x6130, 0xd194, 0x1904,
+	0x7985, 0xa878, 0x2070, 0x9e82, 0x1ddc, 0x0a04, 0x794f, 0x6064,
+	0x9e02, 0x1a04, 0x794f, 0x7120, 0x9186, 0x0006, 0x1904, 0x7941,
+	0x7010, 0x905d, 0x0904, 0x795b, 0xb800, 0xd0e4, 0x1904, 0x797f,
+	0x2061, 0x1a3f, 0x6100, 0x9184, 0x0301, 0x9086, 0x0001, 0x15a0,
+	0x7024, 0xd0dc, 0x1904, 0x7988, 0xa883, 0x0000, 0xa803, 0x0000,
+	0x2908, 0x7014, 0x9005, 0x1198, 0x7116, 0xa87c, 0xd0f4, 0x1904,
+	0x798b, 0x080c, 0x5386, 0xd09c, 0x1118, 0xa87c, 0xc0cc, 0xa87e,
+	0x2e60, 0x080c, 0x82b6, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2048,
+	0xa800, 0x9005, 0x1de0, 0xa902, 0x2148, 0xa87c, 0xd0f4, 0x1904,
+	0x798b, 0x012e, 0x00ee, 0x00be, 0x0005, 0x012e, 0x00ee, 0xa883,
+	0x0006, 0x00be, 0x0804, 0x79a9, 0xd184, 0x0db8, 0xd1c4, 0x1190,
+	0x00a0, 0xa974, 0x080c, 0x6269, 0x15d0, 0xb800, 0xd0e4, 0x15b8,
+	0x7120, 0x9186, 0x0007, 0x1118, 0xa883, 0x0002, 0x0490, 0xa883,
+	0x0008, 0x0478, 0xa883, 0x000e, 0x0460, 0xa883, 0x0017, 0x0448,
+	0xa883, 0x0035, 0x0430, 0x080c, 0x538a, 0xd0fc, 0x01e8, 0xa878,
+	0x2070, 0x9e82, 0x1ddc, 0x02c0, 0x6064, 0x9e02, 0x12a8, 0x7120,
+	0x9186, 0x0006, 0x1188, 0x7010, 0x905d, 0x0170, 0xb800, 0xd0bc,
+	0x0158, 0x2039, 0x0001, 0x7000, 0x9086, 0x0007, 0x1904, 0x78e5,
+	0x7003, 0x0002, 0x0804, 0x78e5, 0xa883, 0x0028, 0x0010, 0xa883,
+	0x0029, 0x012e, 0x00ee, 0x00be, 0x0420, 0xa883, 0x002a, 0x0cc8,
+	0xa883, 0x0045, 0x0cb0, 0x2e60, 0x2019, 0x0002, 0x601b, 0x0014,
+	0x080c, 0xcdd9, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2009, 0x003e,
+	0x0058, 0x2009, 0x0004, 0x0040, 0x2009, 0x0006, 0x0028, 0x2009,
+	0x0016, 0x0010, 0x2009, 0x0001, 0xa884, 0x9084, 0xff00, 0x9105,
+	0xa886, 0x0126, 0x2091, 0x8000, 0x080c, 0x698f, 0x012e, 0x0005,
+	0x080c, 0x1054, 0x0005, 0x00d6, 0x080c, 0x82ad, 0x00de, 0x0005,
+	0x00d6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x0040, 0x702c,
+	0xd084, 0x01d8, 0x908c, 0x0780, 0x190c, 0x7a44, 0xd09c, 0x11a8,
+	0x2071, 0x1800, 0x70bc, 0x90ea, 0x0040, 0x0278, 0x8001, 0x70be,
+	0x702c, 0x2048, 0xa800, 0x702e, 0x9006, 0xa802, 0xa806, 0x2071,
+	0x0040, 0x2900, 0x7022, 0x702c, 0x0c28, 0x012e, 0x00ee, 0x00de,
+	0x0005, 0x0006, 0x9084, 0x0780, 0x190c, 0x7a44, 0x000e, 0x0005,
+	0x00d6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x00b6, 0x7007, 0x0001,
+	0xaa74, 0x9282, 0x0004, 0x1a04, 0x7a35, 0xa97c, 0x9188, 0x1000,
+	0x2104, 0x905d, 0xb804, 0xd284, 0x0140, 0x05e8, 0x8007, 0x9084,
+	0x00ff, 0x9084, 0x0006, 0x1108, 0x04b0, 0x2b10, 0x080c, 0x9b76,
+	0x1118, 0x080c, 0x9c3d, 0x05a8, 0x6212, 0xa874, 0x0002, 0x7a13,
+	0x7a18, 0x7a1b, 0x7a21, 0x2019, 0x0002, 0x080c, 0xd1c9, 0x0060,
+	0x080c, 0xd159, 0x0048, 0x2019, 0x0002, 0xa980, 0x080c, 0xd178,
+	0x0018, 0xa980, 0x080c, 0xd159, 0x080c, 0x9bcc, 0xa887, 0x0000,
+	0x0126, 0x2091, 0x8000, 0x080c, 0x698f, 0x012e, 0x00be, 0x001e,
+	0x002e, 0x003e, 0x00ce, 0x00de, 0x0005, 0xa887, 0x0006, 0x0c80,
+	0xa887, 0x0002, 0x0c68, 0xa887, 0x0005, 0x0c50, 0xa887, 0x0004,
+	0x0c38, 0xa887, 0x0007, 0x0c20, 0x2091, 0x8000, 0x0e04, 0x7a46,
+	0x0006, 0x0016, 0x2001, 0x8003, 0x0006, 0x0804, 0x0d6e, 0x2001,
+	0x1833, 0x2004, 0x9005, 0x0005, 0x0005, 0x00f6, 0x2079, 0x0300,
+	0x2001, 0x0200, 0x200c, 0xc1e5, 0xc1dc, 0x2102, 0x2009, 0x0218,
+	0x210c, 0xd1ec, 0x1120, 0x080c, 0x152d, 0x00fe, 0x0005, 0x2001,
+	0x020d, 0x2003, 0x0020, 0x781f, 0x0300, 0x00fe, 0x0005, 0x781c,
+	0xd08c, 0x0904, 0x7ac7, 0x68bc, 0x90aa, 0x0005, 0x0a04, 0x8043,
+	0x7d44, 0x7c40, 0xd59c, 0x190c, 0x0d65, 0x9584, 0x00f6, 0x1508,
+	0x9484, 0x7000, 0x0138, 0x908a, 0x2000, 0x1258, 0x9584, 0x0700,
+	0x8007, 0x04f0, 0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x0db0,
+	0x00b0, 0x9484, 0x0fff, 0x1130, 0x7000, 0x9084, 0xff00, 0x9086,
+	0x8100, 0x11c0, 0x080c, 0xd5b1, 0x080c, 0x7f8a, 0x7817, 0x0140,
+	0x00a8, 0x9584, 0x0076, 0x1118, 0x080c, 0x7fe6, 0x19c8, 0xd5a4,
+	0x0148, 0x0046, 0x0056, 0x080c, 0x7b17, 0x080c, 0x1fb7, 0x005e,
+	0x004e, 0x0020, 0x080c, 0xd5b1, 0x7817, 0x0140, 0x080c, 0x70ac,
+	0x0168, 0x2001, 0x0111, 0x2004, 0xd08c, 0x0140, 0x688f, 0x0000,
+	0x2001, 0x0110, 0x2003, 0x0008, 0x2003, 0x0000, 0x0489, 0x0005,
+	0x0002, 0x7ad4, 0x7dac, 0x7ad1, 0x7ad1, 0x7ad1, 0x7ad1, 0x7ad1,
+	0x7ad1, 0x7817, 0x0140, 0x0005, 0x7000, 0x908c, 0xff00, 0x9194,
+	0xf000, 0x810f, 0x9484, 0x0fff, 0x688e, 0x9286, 0x2000, 0x1150,
+	0x6800, 0x9086, 0x0001, 0x1118, 0x080c, 0x53e7, 0x0070, 0x080c,
+	0x7b37, 0x0058, 0x9286, 0x3000, 0x1118, 0x080c, 0x7ce9, 0x0028,
+	0x9286, 0x8000, 0x1110, 0x080c, 0x7ec0, 0x7817, 0x0140, 0x0005,
+	0x2001, 0x1810, 0x2004, 0xd08c, 0x0178, 0x2001, 0x1800, 0x2004,
+	0x9086, 0x0003, 0x1148, 0x0026, 0x0036, 0x2011, 0x8048, 0x2518,
+	0x080c, 0x48d1, 0x003e, 0x002e, 0x0005, 0x0036, 0x0046, 0x0056,
+	0x00f6, 0x2079, 0x0200, 0x2019, 0xfffe, 0x7c30, 0x0050, 0x0036,
+	0x0046, 0x0056, 0x00f6, 0x2079, 0x0200, 0x7d44, 0x7c40, 0x2019,
+	0xffff, 0x2001, 0x1810, 0x2004, 0xd08c, 0x0160, 0x2001, 0x1800,
+	0x2004, 0x9086, 0x0003, 0x1130, 0x0026, 0x2011, 0x8048, 0x080c,
+	0x48d1, 0x002e, 0x00fe, 0x005e, 0x004e, 0x003e, 0x0005, 0x00b6,
+	0x00c6, 0x7010, 0x9084, 0xff00, 0x8007, 0x9096, 0x0001, 0x0120,
+	0x9096, 0x0023, 0x1904, 0x7cba, 0x9186, 0x0023, 0x15c0, 0x080c,
+	0x7f55, 0x0904, 0x7cba, 0x6120, 0x9186, 0x0001, 0x0150, 0x9186,
+	0x0004, 0x0138, 0x9186, 0x0008, 0x0120, 0x9186, 0x000a, 0x1904,
+	0x7cba, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1130, 0x2009,
+	0x0015, 0x080c, 0x9c6a, 0x0804, 0x7cba, 0x908e, 0x0214, 0x0118,
+	0x908e, 0x0210, 0x1130, 0x2009, 0x0015, 0x080c, 0x9c6a, 0x0804,
+	0x7cba, 0x908e, 0x0100, 0x1904, 0x7cba, 0x7034, 0x9005, 0x1904,
+	0x7cba, 0x2009, 0x0016, 0x080c, 0x9c6a, 0x0804, 0x7cba, 0x9186,
+	0x0022, 0x1904, 0x7cba, 0x7030, 0x908e, 0x0300, 0x1580, 0x68d8,
+	0xd0a4, 0x0528, 0xc0b5, 0x68da, 0x7100, 0x918c, 0x00ff, 0x697a,
+	0x7004, 0x687e, 0x00f6, 0x2079, 0x0100, 0x79e6, 0x78ea, 0x0006,
+	0x9084, 0x00ff, 0x0016, 0x2008, 0x080c, 0x246d, 0x7932, 0x7936,
+	0x001e, 0x000e, 0x00fe, 0x080c, 0x2424, 0x695a, 0x703c, 0x00e6,
+	0x2071, 0x0140, 0x7086, 0x2071, 0x1800, 0x70b2, 0x00ee, 0x7034,
+	0x9005, 0x1904, 0x7cba, 0x2009, 0x0017, 0x0804, 0x7c87, 0x908e,
+	0x0400, 0x1190, 0x7034, 0x9005, 0x1904, 0x7cba, 0x080c, 0x70ac,
+	0x0120, 0x2009, 0x001d, 0x0804, 0x7c87, 0x68d8, 0xc0a5, 0x68da,
+	0x2009, 0x0030, 0x0804, 0x7c87, 0x908e, 0x0500, 0x1140, 0x7034,
+	0x9005, 0x1904, 0x7cba, 0x2009, 0x0018, 0x0804, 0x7c87, 0x908e,
+	0x2010, 0x1120, 0x2009, 0x0019, 0x0804, 0x7c87, 0x908e, 0x2110,
+	0x1120, 0x2009, 0x001a, 0x0804, 0x7c87, 0x908e, 0x5200, 0x1140,
+	0x7034, 0x9005, 0x1904, 0x7cba, 0x2009, 0x001b, 0x0804, 0x7c87,
+	0x908e, 0x5000, 0x1140, 0x7034, 0x9005, 0x1904, 0x7cba, 0x2009,
+	0x001c, 0x0804, 0x7c87, 0x908e, 0x1300, 0x1120, 0x2009, 0x0034,
+	0x0804, 0x7c87, 0x908e, 0x1200, 0x1140, 0x7034, 0x9005, 0x1904,
+	0x7cba, 0x2009, 0x0024, 0x0804, 0x7c87, 0x908c, 0xff00, 0x918e,
+	0x2400, 0x1170, 0x2009, 0x002d, 0x2001, 0x1810, 0x2004, 0xd09c,
+	0x0904, 0x7c87, 0x080c, 0xc613, 0x1904, 0x7cba, 0x0804, 0x7c85,
+	0x908c, 0xff00, 0x918e, 0x5300, 0x1120, 0x2009, 0x002a, 0x0804,
+	0x7c87, 0x908e, 0x0f00, 0x1120, 0x2009, 0x0020, 0x0804, 0x7c87,
+	0x908e, 0x6104, 0x1528, 0x2029, 0x0205, 0x2011, 0x026d, 0x8208,
+	0x2204, 0x9082, 0x0004, 0x8004, 0x8004, 0x20a8, 0x2011, 0x8015,
+	0x211c, 0x8108, 0x0046, 0x2124, 0x080c, 0x48d1, 0x004e, 0x8108,
+	0x0f04, 0x7c53, 0x9186, 0x0280, 0x1d88, 0x2504, 0x8000, 0x202a,
+	0x2009, 0x0260, 0x0c58, 0x202b, 0x0000, 0x2009, 0x0023, 0x0478,
+	0x908e, 0x6000, 0x1118, 0x2009, 0x003f, 0x0448, 0x908e, 0x7800,
+	0x1118, 0x2009, 0x0045, 0x0418, 0x908e, 0x1000, 0x1118, 0x2009,
+	0x004e, 0x00e8, 0x908e, 0x6300, 0x1118, 0x2009, 0x004a, 0x00b8,
+	0x908c, 0xff00, 0x918e, 0x5600, 0x1118, 0x2009, 0x004f, 0x0078,
+	0x908c, 0xff00, 0x918e, 0x5700, 0x1118, 0x2009, 0x0050, 0x0038,
+	0x2009, 0x001d, 0x6838, 0xd0d4, 0x0110, 0x2009, 0x004c, 0x0016,
+	0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x2424, 0x1568,
+	0x080c, 0x6209, 0x1550, 0xbe12, 0xbd16, 0x001e, 0x0016, 0xb884,
+	0x9005, 0x1168, 0x9186, 0x0046, 0x1150, 0x6878, 0x9606, 0x1138,
+	0x687c, 0x9506, 0x9084, 0xff00, 0x1110, 0x001e, 0x0098, 0x080c,
+	0x9b76, 0x01a8, 0x2b08, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a,
+	0x001e, 0x9186, 0x004c, 0x1110, 0x6023, 0x000a, 0x0016, 0x001e,
+	0x080c, 0x9c6a, 0x00ce, 0x00be, 0x0005, 0x001e, 0x0cd8, 0x2001,
+	0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x48d1,
+	0x080c, 0x9c3d, 0x0d90, 0x2b08, 0x6112, 0x6023, 0x0004, 0x7120,
+	0x610a, 0x001e, 0x0016, 0x9186, 0x0017, 0x0118, 0x9186, 0x0030,
+	0x1128, 0x6007, 0x0009, 0x6017, 0x2900, 0x0020, 0x6007, 0x0051,
+	0x6017, 0x0000, 0x602f, 0x0009, 0x6003, 0x0001, 0x080c, 0x84b0,
+	0x08a0, 0x080c, 0x3149, 0x1140, 0x7010, 0x9084, 0xff00, 0x8007,
+	0x908e, 0x0008, 0x1108, 0x0009, 0x0005, 0x00b6, 0x00c6, 0x0046,
+	0x7000, 0x908c, 0xff00, 0x810f, 0x9186, 0x0033, 0x11e8, 0x080c,
+	0x7f55, 0x0904, 0x7d44, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200,
+	0x1140, 0x7034, 0x9005, 0x15c0, 0x2009, 0x0015, 0x080c, 0x9c6a,
+	0x0498, 0x908e, 0x0100, 0x1580, 0x7034, 0x9005, 0x1568, 0x2009,
+	0x0016, 0x080c, 0x9c6a, 0x0440, 0x9186, 0x0032, 0x1528, 0x7030,
+	0x908e, 0x1400, 0x1508, 0x2009, 0x0038, 0x0016, 0x2011, 0x0263,
+	0x2204, 0x8211, 0x220c, 0x080c, 0x2424, 0x11a8, 0x080c, 0x6209,
+	0x1190, 0xbe12, 0xbd16, 0x080c, 0x9b76, 0x0168, 0x2b08, 0x6112,
+	0x080c, 0xbcc0, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x080c,
+	0x9c6a, 0x0010, 0x00ce, 0x001e, 0x004e, 0x00ce, 0x00be, 0x0005,
+	0x00b6, 0x0046, 0x00e6, 0x00d6, 0x2028, 0x2130, 0x9696, 0x00ff,
+	0x11b8, 0x9592, 0xfffc, 0x02a0, 0x9596, 0xfffd, 0x1120, 0x2009,
+	0x007f, 0x0804, 0x7da6, 0x9596, 0xfffe, 0x1120, 0x2009, 0x007e,
+	0x0804, 0x7da6, 0x9596, 0xfffc, 0x1118, 0x2009, 0x0080, 0x04f0,
+	0x2011, 0x0000, 0x2019, 0x1836, 0x231c, 0xd3ac, 0x0130, 0x9026,
+	0x20a9, 0x0800, 0x2071, 0x1000, 0x0030, 0x2021, 0x0081, 0x20a9,
+	0x077f, 0x2071, 0x1081, 0x2e1c, 0x93dd, 0x0000, 0x1140, 0x82ff,
+	0x11d0, 0x9496, 0x00ff, 0x01b8, 0x2410, 0xc2fd, 0x00a0, 0xbf10,
+	0x2600, 0x9706, 0xb814, 0x1120, 0x9546, 0x1110, 0x2408, 0x00b0,
+	0x9745, 0x1148, 0x94c6, 0x007e, 0x0130, 0x94c6, 0x007f, 0x0118,
+	0x94c6, 0x0080, 0x1d20, 0x8420, 0x8e70, 0x1f04, 0x7d7b, 0x82ff,
+	0x1118, 0x9085, 0x0001, 0x0018, 0xc2fc, 0x2208, 0x9006, 0x00de,
+	0x00ee, 0x004e, 0x00be, 0x0005, 0x7000, 0x908c, 0xff00, 0x810f,
+	0x9184, 0x000f, 0x0002, 0x7dc3, 0x7dc3, 0x7dc3, 0x7f67, 0x7dc3,
+	0x7dc6, 0x7deb, 0x7e74, 0x7dc3, 0x7dc3, 0x7dc3, 0x7dc3, 0x7dc3,
+	0x7dc3, 0x7dc3, 0x7dc3, 0x7817, 0x0140, 0x0005, 0x00b6, 0x7110,
+	0xd1bc, 0x01e8, 0x7120, 0x2160, 0x9c8c, 0x0003, 0x11c0, 0x9c8a,
+	0x1ddc, 0x02a8, 0x6864, 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff,
+	0x6110, 0x2158, 0xb910, 0x9106, 0x1150, 0x700c, 0xb914, 0x9106,
+	0x1130, 0x7124, 0x610a, 0x2009, 0x0046, 0x080c, 0x9c6a, 0x7817,
+	0x0140, 0x00be, 0x0005, 0x00b6, 0x00c6, 0x9484, 0x0fff, 0x0904,
+	0x7e50, 0x7110, 0xd1bc, 0x1904, 0x7e50, 0x7108, 0x700c, 0x2028,
+	0x918c, 0x00ff, 0x2130, 0x9094, 0xff00, 0x15c8, 0x81ff, 0x15b8,
+	0x9080, 0x3184, 0x200d, 0x918c, 0xff00, 0x810f, 0x2001, 0x0080,
+	0x9106, 0x0904, 0x7e50, 0x9182, 0x0801, 0x1a04, 0x7e50, 0x9190,
+	0x1000, 0x2204, 0x905d, 0x05e0, 0xbe12, 0xbd16, 0xb800, 0xd0ec,
+	0x15b8, 0xba04, 0x9294, 0xff00, 0x9286, 0x0600, 0x1190, 0x080c,
+	0x9b76, 0x0598, 0x2b08, 0x7028, 0x6052, 0x702c, 0x604e, 0x6112,
+	0x6023, 0x0006, 0x7120, 0x610a, 0x7130, 0x615e, 0x080c, 0xc873,
+	0x00f8, 0x080c, 0x6660, 0x1138, 0xb807, 0x0606, 0x0c40, 0x190c,
+	0x7d48, 0x11b0, 0x0880, 0x080c, 0x9b76, 0x2b08, 0x0188, 0x6112,
+	0x6023, 0x0004, 0x7120, 0x610a, 0x9286, 0x0400, 0x1118, 0x6007,
+	0x0005, 0x0010, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x84b0,
+	0x7817, 0x0140, 0x00ce, 0x00be, 0x0005, 0x2001, 0x180e, 0x2004,
+	0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x48d1, 0x080c, 0x9c3d,
+	0x0d78, 0x2b08, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a, 0x7130,
+	0x615e, 0x6017, 0xf300, 0x6003, 0x0001, 0x6007, 0x0041, 0x2009,
+	0xa022, 0x080c, 0x84a9, 0x08e0, 0x00b6, 0x7110, 0xd1bc, 0x05d0,
+	0x7020, 0x2060, 0x9c84, 0x0003, 0x15a8, 0x9c82, 0x1ddc, 0x0690,
+	0x6864, 0x9c02, 0x1678, 0x9484, 0x0fff, 0x9082, 0x000c, 0x0650,
+	0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1510,
+	0x700c, 0xb914, 0x9106, 0x11f0, 0x7124, 0x610a, 0x601c, 0xd0fc,
+	0x11c8, 0x2001, 0x0271, 0x2004, 0x9005, 0x1180, 0x9484, 0x0fff,
+	0x9082, 0x000c, 0x0158, 0x0066, 0x2031, 0x0100, 0xa001, 0xa001,
+	0x8631, 0x1de0, 0x006e, 0x601c, 0xd0fc, 0x1120, 0x2009, 0x0045,
+	0x080c, 0x9c6a, 0x7817, 0x0140, 0x00be, 0x0005, 0x6120, 0x9186,
+	0x0002, 0x0128, 0x9186, 0x0005, 0x0110, 0x9085, 0x0001, 0x0005,
+	0x080c, 0x3149, 0x1168, 0x7010, 0x9084, 0xff00, 0x8007, 0x9086,
+	0x0000, 0x1130, 0x9184, 0x000f, 0x908a, 0x0006, 0x1208, 0x000b,
+	0x0005, 0x7ed7, 0x7ed8, 0x7ed7, 0x7ed7, 0x7f37, 0x7f46, 0x0005,
+	0x00b6, 0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084, 0x0904, 0x7f35,
+	0x700c, 0x7108, 0x080c, 0x2424, 0x1904, 0x7f35, 0x080c, 0x6209,
+	0x1904, 0x7f35, 0xbe12, 0xbd16, 0x7110, 0xd1bc, 0x01d8, 0x080c,
+	0x6660, 0x0118, 0x9086, 0x0004, 0x1588, 0x00c6, 0x080c, 0x7f55,
+	0x00ce, 0x05d8, 0x080c, 0x9b76, 0x2b08, 0x05b8, 0x6112, 0x080c,
+	0xbcc0, 0x6023, 0x0002, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c,
+	0x9c6a, 0x0458, 0x080c, 0x6660, 0x0148, 0x9086, 0x0004, 0x0130,
+	0x080c, 0x6668, 0x0118, 0x9086, 0x0004, 0x1180, 0x080c, 0x9b76,
+	0x2b08, 0x01d8, 0x6112, 0x080c, 0xbcc0, 0x6023, 0x0005, 0x7120,
+	0x610a, 0x2009, 0x0088, 0x080c, 0x9c6a, 0x0078, 0x080c, 0x9b76,
+	0x2b08, 0x0158, 0x6112, 0x080c, 0xbcc0, 0x6023, 0x0004, 0x7120,
+	0x610a, 0x2009, 0x0001, 0x080c, 0x9c6a, 0x00be, 0x0005, 0x7110,
+	0xd1bc, 0x0158, 0x00d1, 0x0148, 0x080c, 0x7eb6, 0x1130, 0x7124,
+	0x610a, 0x2009, 0x0089, 0x080c, 0x9c6a, 0x0005, 0x7110, 0xd1bc,
+	0x0158, 0x0059, 0x0148, 0x080c, 0x7eb6, 0x1130, 0x7124, 0x610a,
+	0x2009, 0x008a, 0x080c, 0x9c6a, 0x0005, 0x7020, 0x2060, 0x9c84,
+	0x0003, 0x1158, 0x9c82, 0x1ddc, 0x0240, 0x2001, 0x1819, 0x2004,
+	0x9c02, 0x1218, 0x9085, 0x0001, 0x0005, 0x9006, 0x0ce8, 0x00b6,
+	0x7110, 0xd1bc, 0x11d8, 0x7024, 0x2060, 0x9c84, 0x0003, 0x11b0,
+	0x9c82, 0x1ddc, 0x0298, 0x6864, 0x9c02, 0x1280, 0x7008, 0x9084,
+	0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1140, 0x700c, 0xb914,
+	0x9106, 0x1120, 0x2009, 0x0051, 0x080c, 0x9c6a, 0x7817, 0x0140,
+	0x00be, 0x0005, 0x2031, 0x0105, 0x0069, 0x0005, 0x2031, 0x0206,
+	0x0049, 0x0005, 0x2031, 0x0207, 0x0029, 0x0005, 0x2031, 0x0213,
+	0x0009, 0x0005, 0x00c6, 0x0096, 0x00f6, 0x7000, 0x9084, 0xf000,
+	0x9086, 0xc000, 0x05c0, 0x080c, 0x9b76, 0x05a8, 0x0066, 0x00c6,
+	0x0046, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x2424,
+	0x1590, 0x080c, 0x6209, 0x1578, 0xbe12, 0xbd16, 0x2b00, 0x004e,
+	0x00ce, 0x6012, 0x080c, 0xbcc0, 0x080c, 0x1022, 0x0500, 0x2900,
+	0x6062, 0x9006, 0xa802, 0xa866, 0xac6a, 0xa85c, 0x90f8, 0x001b,
+	0x20a9, 0x000e, 0xa860, 0x20e8, 0x20e1, 0x0000, 0x2fa0, 0x2e98,
+	0x4003, 0x006e, 0x6616, 0x6007, 0x003e, 0x6023, 0x0001, 0x6003,
+	0x0001, 0x080c, 0x84b0, 0x00fe, 0x009e, 0x00ce, 0x0005, 0x080c,
+	0x9bcc, 0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8, 0x00c6, 0x7000,
+	0x908c, 0xff00, 0x9184, 0xf000, 0x810f, 0x9086, 0x2000, 0x1904,
+	0x803d, 0x9186, 0x0022, 0x15f0, 0x2001, 0x0111, 0x2004, 0x9005,
+	0x1904, 0x803f, 0x7030, 0x908e, 0x0400, 0x0904, 0x803f, 0x908e,
+	0x6000, 0x05e8, 0x908e, 0x5400, 0x05d0, 0x908e, 0x0300, 0x11d8,
+	0x2009, 0x1836, 0x210c, 0xd18c, 0x1590, 0xd1a4, 0x1580, 0x080c,
+	0x661e, 0x0558, 0x68ac, 0x9084, 0x00ff, 0x7100, 0x918c, 0x00ff,
+	0x9106, 0x1518, 0x687c, 0x69ac, 0x918c, 0xff00, 0x9105, 0x7104,
+	0x9106, 0x11d8, 0x00e0, 0x2009, 0x0103, 0x210c, 0xd1b4, 0x11a8,
+	0x908e, 0x5200, 0x09e8, 0x908e, 0x0500, 0x09d0, 0x908e, 0x5000,
+	0x09b8, 0x0058, 0x9186, 0x0023, 0x1140, 0x080c, 0x7f55, 0x0128,
+	0x6004, 0x9086, 0x0002, 0x0118, 0x0000, 0x9006, 0x0010, 0x9085,
+	0x0001, 0x00ce, 0x0005, 0x00f6, 0x2079, 0x0200, 0x7800, 0xc0e5,
+	0xc0cc, 0x7802, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x1800, 0x7834,
+	0xd084, 0x1130, 0x2079, 0x0200, 0x7800, 0x9085, 0x1200, 0x7802,
+	0x00fe, 0x0005, 0x00e6, 0x2071, 0x1800, 0x7034, 0xc084, 0x7036,
+	0x00ee, 0x0005, 0x2071, 0x19d4, 0x7003, 0x0003, 0x700f, 0x0361,
+	0x9006, 0x701a, 0x7072, 0x7012, 0x7017, 0x1ddc, 0x7007, 0x0000,
+	0x7026, 0x702b, 0x8fbe, 0x7032, 0x7037, 0x903b, 0x703f, 0xffff,
+	0x7042, 0x7047, 0x521d, 0x704a, 0x705b, 0x81fe, 0x080c, 0x103b,
+	0x090c, 0x0d65, 0x2900, 0x703a, 0xa867, 0x0003, 0xa86f, 0x0100,
+	0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x19d4, 0x1d04, 0x8120, 0x2091,
+	0x6000, 0x700c, 0x8001, 0x700e, 0x1560, 0x2001, 0x1875, 0x2004,
+	0xd0c4, 0x0158, 0x3a00, 0xd08c, 0x1140, 0x20d1, 0x0000, 0x20d1,
+	0x0001, 0x20d1, 0x0000, 0x080c, 0x0d65, 0x700f, 0x0361, 0x7007,
+	0x0001, 0x0126, 0x2091, 0x8000, 0x2069, 0x1800, 0x69e8, 0xd1e4,
+	0x1138, 0xd1dc, 0x1118, 0x080c, 0x826c, 0x0010, 0x080c, 0x8243,
+	0x7040, 0x900d, 0x0148, 0x8109, 0x7142, 0x1130, 0x7044, 0x080f,
+	0x0018, 0x0126, 0x2091, 0x8000, 0x7024, 0x900d, 0x0188, 0x7020,
+	0x8001, 0x7022, 0x1168, 0x7023, 0x0009, 0x8109, 0x7126, 0x9186,
+	0x03e8, 0x1110, 0x7028, 0x080f, 0x81ff, 0x1110, 0x7028, 0x080f,
+	0x7030, 0x900d, 0x0180, 0x702c, 0x8001, 0x702e, 0x1160, 0x702f,
+	0x0009, 0x8109, 0x7132, 0x0128, 0x9184, 0x007f, 0x090c, 0x90c3,
+	0x0010, 0x7034, 0x080f, 0x703c, 0x9005, 0x0118, 0x0310, 0x8001,
+	0x703e, 0x704c, 0x900d, 0x0168, 0x7048, 0x8001, 0x704a, 0x1148,
+	0x704b, 0x0009, 0x8109, 0x714e, 0x1120, 0x7150, 0x714e, 0x7058,
+	0x080f, 0x7018, 0x900d, 0x01d8, 0x0016, 0x7070, 0x900d, 0x0158,
+	0x706c, 0x8001, 0x706e, 0x1138, 0x706f, 0x0009, 0x8109, 0x7172,
+	0x1110, 0x7074, 0x080f, 0x001e, 0x7008, 0x8001, 0x700a, 0x1138,
+	0x700b, 0x0009, 0x8109, 0x711a, 0x1110, 0x701c, 0x080f, 0x012e,
+	0x7004, 0x0002, 0x8148, 0x8149, 0x8173, 0x00e6, 0x2071, 0x19d4,
+	0x7018, 0x9005, 0x1120, 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee,
+	0x0005, 0x00e6, 0x0006, 0x2071, 0x19d4, 0x701c, 0x9206, 0x1120,
+	0x701a, 0x701e, 0x7072, 0x7076, 0x000e, 0x00ee, 0x0005, 0x00e6,
+	0x2071, 0x19d4, 0xb888, 0x9102, 0x0208, 0xb98a, 0x00ee, 0x0005,
+	0x0005, 0x00b6, 0x2031, 0x0010, 0x7110, 0x080c, 0x6269, 0x11a8,
+	0xb888, 0x8001, 0x0290, 0xb88a, 0x1180, 0x0126, 0x2091, 0x8000,
+	0x0066, 0xb8c0, 0x9005, 0x0138, 0x0026, 0xba3c, 0x0016, 0x080c,
+	0x6394, 0x001e, 0x002e, 0x006e, 0x012e, 0x8108, 0x9182, 0x0800,
+	0x1220, 0x8631, 0x0128, 0x7112, 0x0c00, 0x900e, 0x7007, 0x0002,
+	0x7112, 0x00be, 0x0005, 0x2031, 0x0010, 0x7014, 0x2060, 0x0126,
+	0x2091, 0x8000, 0x6048, 0x9005, 0x0128, 0x8001, 0x604a, 0x1110,
+	0x080c, 0xbb41, 0x6018, 0x9005, 0x0904, 0x81c5, 0x00f6, 0x2079,
+	0x0300, 0x7918, 0xd1b4, 0x1904, 0x81d8, 0x781b, 0x2020, 0xa001,
+	0x7918, 0xd1b4, 0x0120, 0x781b, 0x2000, 0x0804, 0x81d8, 0x8001,
 	0x601a, 0x0106, 0x781b, 0x2000, 0xa001, 0x7918, 0xd1ac, 0x1dd0,
-	0x010e, 0x00fe, 0x11f8, 0x6120, 0x9186, 0x0003, 0x0118, 0x9186,
-	0x0006, 0x11b0, 0x6014, 0x2048, 0xa884, 0x908a, 0x199a, 0x0280,
-	0x9082, 0x1999, 0xa886, 0x908a, 0x199a, 0x0210, 0x2001, 0x1999,
-	0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0x080c, 0xbe03, 0x0110,
-	0x080c, 0xb3c3, 0x012e, 0x9c88, 0x001c, 0x7116, 0x2001, 0x1819,
-	0x2004, 0x9102, 0x1228, 0x8631, 0x0138, 0x2160, 0x0804, 0x8001,
-	0x7017, 0x1ddc, 0x7007, 0x0000, 0x0005, 0x00fe, 0x0c58, 0x00e6,
-	0x2071, 0x19d2, 0x7027, 0x07d0, 0x7023, 0x0009, 0x00ee, 0x0005,
-	0x2001, 0x19db, 0x2003, 0x0000, 0x0005, 0x00e6, 0x2071, 0x19d2,
-	0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, 0x2011, 0x19de, 0x2013,
-	0x0000, 0x0005, 0x00e6, 0x2071, 0x19d2, 0x711a, 0x721e, 0x700b,
-	0x0009, 0x00ee, 0x0005, 0x0086, 0x0026, 0x7054, 0x8000, 0x7056,
-	0x2001, 0x19e0, 0x2044, 0xa06c, 0x9086, 0x0000, 0x0150, 0x7068,
-	0xa09a, 0x7064, 0xa096, 0x7060, 0xa092, 0x705c, 0xa08e, 0x080c,
-	0x1103, 0x002e, 0x008e, 0x0005, 0x0006, 0x0016, 0x0096, 0x00a6,
-	0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x080c, 0x7f15,
-	0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e,
-	0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x19d2, 0x7172, 0x7276,
-	0x706f, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x19d2,
-	0x7074, 0x9206, 0x1110, 0x7072, 0x7076, 0x000e, 0x00ee, 0x0005,
-	0x2069, 0x1800, 0x69e8, 0xd1e4, 0x1518, 0x0026, 0xd1ec, 0x0140,
-	0x6a50, 0x6870, 0x9202, 0x0288, 0x8117, 0x9294, 0x00c1, 0x0088,
-	0x9184, 0x0007, 0x01a0, 0x8109, 0x9184, 0x0007, 0x0110, 0x69ea,
-	0x0070, 0x8107, 0x9084, 0x0007, 0x910d, 0x8107, 0x9106, 0x9094,
-	0x00c1, 0x9184, 0xff3e, 0x9205, 0x68ea, 0x080c, 0x0eed, 0x002e,
-	0x0005, 0x69e4, 0x9184, 0x003f, 0x05b8, 0x8109, 0x9184, 0x003f,
-	0x01a8, 0x6a50, 0x6870, 0x9202, 0x0220, 0xd1bc, 0x0168, 0xc1bc,
-	0x0018, 0xd1bc, 0x1148, 0xc1bd, 0x2110, 0x00e6, 0x2071, 0x1800,
-	0x080c, 0x0f0f, 0x00ee, 0x0400, 0x69e6, 0x00f0, 0x0026, 0x8107,
-	0x9094, 0x0007, 0x0128, 0x8001, 0x8007, 0x9085, 0x0007, 0x0050,
-	0x2010, 0x8004, 0x8004, 0x8004, 0x9084, 0x0007, 0x9205, 0x8007,
-	0x9085, 0x0028, 0x9086, 0x0040, 0x2010, 0x00e6, 0x2071, 0x1800,
-	0x080c, 0x0f0f, 0x00ee, 0x002e, 0x0005, 0x00c6, 0x2061, 0x1a3d,
-	0x00ce, 0x0005, 0x9184, 0x000f, 0x8003, 0x8003, 0x8003, 0x9080,
-	0x1a3d, 0x2060, 0x0005, 0xa884, 0x908a, 0x199a, 0x1638, 0x9005,
-	0x1150, 0x00c6, 0x2061, 0x1a3d, 0x6014, 0x00ce, 0x9005, 0x1130,
-	0x2001, 0x001e, 0x0018, 0x908e, 0xffff, 0x01b0, 0x8003, 0x800b,
-	0x810b, 0x9108, 0x611a, 0xa87c, 0x908c, 0x00c0, 0x918e, 0x00c0,
-	0x0904, 0x81f2, 0xd0b4, 0x1168, 0xd0bc, 0x1904, 0x81cb, 0x2009,
-	0x0006, 0x080c, 0x821f, 0x0005, 0x900e, 0x0c60, 0x2001, 0x1999,
-	0x08b0, 0xd0fc, 0x05c8, 0x908c, 0x2023, 0x1550, 0x87ff, 0x1540,
-	0x6124, 0x918c, 0x0500, 0x1520, 0x6100, 0x918e, 0x0007, 0x1500,
-	0x2009, 0x1875, 0x210c, 0xd184, 0x11d8, 0x6003, 0x0003, 0x6007,
-	0x0043, 0x6047, 0xb035, 0x080c, 0x1a79, 0xa87c, 0xc0dd, 0xa87e,
-	0x600f, 0x0000, 0x00f6, 0x2079, 0x0380, 0x7818, 0xd0bc, 0x1de8,
-	0x7833, 0x0013, 0x2c00, 0x7836, 0x781b, 0x8080, 0x00fe, 0x0005,
-	0x908c, 0x0003, 0x0120, 0x918e, 0x0003, 0x1904, 0x8219, 0x908c,
-	0x2020, 0x918e, 0x2020, 0x01a8, 0x6024, 0xd0d4, 0x11e8, 0x2009,
-	0x1875, 0x2104, 0xd084, 0x1138, 0x87ff, 0x1120, 0x2009, 0x0043,
-	0x0804, 0x9b03, 0x0005, 0x87ff, 0x1de8, 0x2009, 0x0042, 0x0804,
-	0x9b03, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d20,
-	0x6024, 0xc0cd, 0x6026, 0x0c00, 0xc0d4, 0x6026, 0xa890, 0x602e,
-	0xa88c, 0x6032, 0x08e0, 0xd0fc, 0x0160, 0x908c, 0x0003, 0x0120,
-	0x918e, 0x0003, 0x1904, 0x8219, 0x908c, 0x2020, 0x918e, 0x2020,
-	0x0170, 0x0076, 0x00f6, 0x2c78, 0x080c, 0x1646, 0x00fe, 0x007e,
-	0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, 0x9b03, 0x0005, 0x6110,
-	0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d58, 0x6124, 0xc1cd,
-	0x6126, 0x0c38, 0xd0fc, 0x0188, 0x908c, 0x2020, 0x918e, 0x2020,
-	0x01a8, 0x9084, 0x0003, 0x908e, 0x0002, 0x0148, 0x87ff, 0x1120,
-	0x2009, 0x0041, 0x080c, 0x9b03, 0x0005, 0x00b9, 0x0ce8, 0x87ff,
-	0x1dd8, 0x2009, 0x0043, 0x080c, 0x9b03, 0x0cb0, 0x6110, 0x00b6,
-	0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d20, 0x6124, 0xc1cd, 0x6126,
-	0x0c00, 0x2009, 0x0004, 0x0019, 0x0005, 0x2009, 0x0001, 0x0096,
-	0x080c, 0xb6c5, 0x0518, 0x6014, 0x2048, 0xa982, 0xa800, 0x6016,
-	0x9186, 0x0001, 0x1188, 0xa97c, 0x918c, 0x8100, 0x918e, 0x8100,
-	0x1158, 0x00c6, 0x2061, 0x1a3d, 0x6200, 0xd28c, 0x1120, 0x6204,
-	0x8210, 0x0208, 0x6206, 0x00ce, 0x080c, 0x6674, 0x6014, 0x904d,
-	0x0076, 0x2039, 0x0000, 0x190c, 0x813b, 0x007e, 0x009e, 0x0005,
-	0x0156, 0x00c6, 0x2061, 0x1a3d, 0x6000, 0x81ff, 0x0110, 0x9205,
-	0x0008, 0x9204, 0x6002, 0x00ce, 0x015e, 0x0005, 0x6800, 0xd08c,
-	0x1138, 0x6808, 0x9005, 0x0120, 0x8001, 0x680a, 0x9085, 0x0001,
-	0x0005, 0x0126, 0x2091, 0x8000, 0x0036, 0x0046, 0x20a9, 0x0010,
-	0x9006, 0x8004, 0x8086, 0x818e, 0x1208, 0x9200, 0x1f04, 0x826a,
-	0x8086, 0x818e, 0x004e, 0x003e, 0x012e, 0x0005, 0x0126, 0x2091,
-	0x8000, 0x0076, 0x0156, 0x20a9, 0x0010, 0x9005, 0x01c8, 0x911a,
-	0x12b8, 0x8213, 0x818d, 0x0228, 0x911a, 0x1220, 0x1f04, 0x8281,
-	0x0028, 0x911a, 0x2308, 0x8210, 0x1f04, 0x8281, 0x0006, 0x3200,
-	0x9084, 0xefff, 0x2080, 0x000e, 0x015e, 0x007e, 0x012e, 0x0005,
-	0x0006, 0x3200, 0x9085, 0x1000, 0x0ca8, 0x0126, 0x2091, 0x2800,
-	0x2079, 0x19b6, 0x012e, 0x00d6, 0x2069, 0x19b6, 0x6803, 0x0005,
-	0x0156, 0x0146, 0x01d6, 0x20e9, 0x0000, 0x2069, 0x0200, 0x080c,
-	0x9678, 0x04a9, 0x080c, 0x9663, 0x0491, 0x080c, 0x9666, 0x0479,
-	0x080c, 0x9669, 0x0461, 0x080c, 0x966c, 0x0449, 0x080c, 0x966f,
-	0x0431, 0x080c, 0x9672, 0x0419, 0x080c, 0x9675, 0x0401, 0x01de,
-	0x014e, 0x015e, 0x6857, 0x0000, 0x00f6, 0x2079, 0x0380, 0x00f9,
-	0x7807, 0x0003, 0x7803, 0x0000, 0x7803, 0x0001, 0x2069, 0x0004,
-	0x2d04, 0x9084, 0xfffe, 0x9085, 0x8000, 0x206a, 0x2069, 0x0100,
-	0x6828, 0x9084, 0xfffc, 0x682a, 0x00fe, 0x00de, 0x0005, 0x20a9,
-	0x0020, 0x20a1, 0x0240, 0x2001, 0x0000, 0x4004, 0x0005, 0x00c6,
-	0x7803, 0x0000, 0x9006, 0x7827, 0x0030, 0x782b, 0x0400, 0x7827,
-	0x0031, 0x782b, 0x1abd, 0x781f, 0xff00, 0x781b, 0xff00, 0x2061,
-	0x1ab2, 0x602f, 0x19b6, 0x6033, 0x1800, 0x6037, 0x19d2, 0x603b,
-	0x1cca, 0x603f, 0x1cda, 0x6042, 0x6047, 0x1a88, 0x00ce, 0x0005,
-	0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, 0x0001, 0x01b0,
-	0x00c6, 0x6146, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19b6, 0x602c,
-	0x8000, 0x602e, 0x601c, 0x9005, 0x0130, 0x9080, 0x0003, 0x2102,
-	0x611e, 0x00ce, 0x0005, 0x6122, 0x611e, 0x0cd8, 0x6146, 0x2c08,
-	0x2001, 0x0012, 0x080c, 0x9737, 0x0005, 0x0016, 0x2009, 0x8020,
-	0x6146, 0x2c08, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086,
-	0x0001, 0x1128, 0x2001, 0x0019, 0x080c, 0x9737, 0x0088, 0x00c6,
-	0x2061, 0x19b6, 0x602c, 0x8000, 0x602e, 0x600c, 0x9005, 0x0128,
-	0x9080, 0x0003, 0x2102, 0x610e, 0x0010, 0x6112, 0x610e, 0x00ce,
-	0x001e, 0x0005, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086,
-	0x0001, 0x0198, 0x00c6, 0x6146, 0x600f, 0x0000, 0x2c08, 0x2061,
-	0x19b6, 0x6044, 0x9005, 0x0130, 0x9080, 0x0003, 0x2102, 0x6146,
-	0x00ce, 0x0005, 0x614a, 0x6146, 0x0cd8, 0x6146, 0x600f, 0x0000,
-	0x2c08, 0x2001, 0x0013, 0x080c, 0x9737, 0x0005, 0x6044, 0xd0dc,
-	0x0128, 0x9006, 0x7007, 0x0000, 0x700a, 0x7032, 0x0005, 0x00f6,
-	0x00e6, 0x00d6, 0x00c6, 0x00b6, 0x0096, 0x0076, 0x0066, 0x0056,
-	0x0036, 0x0026, 0x0016, 0x0006, 0x0126, 0x902e, 0x2071, 0x19b6,
-	0x7648, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0904, 0x8400,
-	0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x83fb, 0x87ff, 0x0120,
-	0x605c, 0x9106, 0x1904, 0x83fb, 0x704c, 0x9c06, 0x1178, 0x0036,
-	0x2019, 0x0001, 0x080c, 0x90f0, 0x703f, 0x0000, 0x9006, 0x704e,
-	0x706a, 0x7052, 0x706e, 0x003e, 0x2029, 0x0001, 0x080c, 0x837e,
-	0x7048, 0x9c36, 0x1110, 0x660c, 0x764a, 0x7044, 0x9c36, 0x1140,
-	0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7046, 0x0010, 0x7047, 0x0000,
-	0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678,
-	0x600f, 0x0000, 0x080c, 0xb6c5, 0x01c8, 0x6014, 0x2048, 0x6020,
-	0x9086, 0x0003, 0x1560, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000,
-	0x0016, 0x0036, 0x0076, 0x080c, 0xb9bc, 0x080c, 0xd370, 0x080c,
-	0x683f, 0x007e, 0x003e, 0x001e, 0x080c, 0xb8ad, 0x080c, 0x9a9f,
-	0x00ce, 0x0804, 0x839d, 0x2c78, 0x600c, 0x2060, 0x0804, 0x839d,
-	0x012e, 0x000e, 0x001e, 0x002e, 0x003e, 0x005e, 0x006e, 0x007e,
-	0x009e, 0x00be, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020,
-	0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0076, 0x080c, 0xd370,
-	0x080c, 0xd079, 0x007e, 0x003e, 0x001e, 0x08c0, 0x6020, 0x9086,
-	0x000a, 0x0918, 0x0800, 0x0006, 0x0066, 0x0096, 0x00c6, 0x00d6,
-	0x00f6, 0x9036, 0x0126, 0x2091, 0x8000, 0x2079, 0x19b6, 0x7848,
-	0x9065, 0x0904, 0x8482, 0x600c, 0x0006, 0x600f, 0x0000, 0x784c,
-	0x9c06, 0x11a0, 0x0036, 0x2019, 0x0001, 0x080c, 0x90f0, 0x783f,
-	0x0000, 0x901e, 0x7b4e, 0x7b6a, 0x7b52, 0x7b6e, 0x003e, 0x000e,
-	0x9005, 0x1118, 0x600c, 0x600f, 0x0000, 0x0006, 0x00e6, 0x2f70,
-	0x080c, 0x837e, 0x00ee, 0x080c, 0xb6c5, 0x0520, 0x6014, 0x2048,
-	0x6020, 0x9086, 0x0003, 0x1580, 0x3e08, 0x918e, 0x0002, 0x1188,
-	0x6010, 0x9005, 0x0170, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc,
-	0x0140, 0x6048, 0x9005, 0x1198, 0x2001, 0x1957, 0x2004, 0x604a,
-	0x0070, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6833,
-	0x080c, 0xb8ad, 0x6044, 0xc0fc, 0x6046, 0x080c, 0x9a9f, 0x000e,
-	0x0804, 0x8430, 0x7e4a, 0x7e46, 0x012e, 0x00fe, 0x00de, 0x00ce,
-	0x009e, 0x006e, 0x000e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1118,
-	0x080c, 0xd079, 0x0c38, 0x6020, 0x9086, 0x000a, 0x09e0, 0x08c8,
-	0x0016, 0x0026, 0x0086, 0x9046, 0x00a9, 0x080c, 0x8589, 0x008e,
-	0x002e, 0x001e, 0x0005, 0x00f6, 0x0126, 0x2079, 0x19b6, 0x2091,
-	0x8000, 0x080c, 0x85d2, 0x080c, 0x8666, 0x080c, 0x62f3, 0x012e,
-	0x00fe, 0x0005, 0x00b6, 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6,
-	0x0066, 0x0016, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b6,
-	0x7620, 0x2660, 0x2678, 0x8cff, 0x0904, 0x854e, 0x6010, 0x2058,
-	0xb8a0, 0x9206, 0x1904, 0x8549, 0x88ff, 0x0120, 0x605c, 0x9106,
-	0x1904, 0x8549, 0x7030, 0x9c06, 0x1570, 0x2069, 0x0100, 0x6820,
-	0xd0a4, 0x1508, 0x080c, 0x8068, 0x080c, 0x8e21, 0x68c3, 0x0000,
-	0x080c, 0x9320, 0x7033, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04,
-	0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x27f1, 0x9006,
-	0x080c, 0x27f1, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827,
-	0x0001, 0x003e, 0x0040, 0x7008, 0xc0ad, 0x700a, 0x6003, 0x0009,
-	0x630a, 0x0804, 0x8549, 0x7020, 0x9c36, 0x1110, 0x660c, 0x7622,
-	0x701c, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x701e,
-	0x0010, 0x701f, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110,
-	0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x6044, 0xc0fc, 0x6046,
-	0x6014, 0x2048, 0x080c, 0xb6c5, 0x01e8, 0x6020, 0x9086, 0x0003,
-	0x1580, 0x080c, 0xb8d3, 0x1118, 0x080c, 0xa40d, 0x0098, 0xa867,
-	0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, 0x0086, 0x080c,
-	0xb9bc, 0x080c, 0xd370, 0x080c, 0x683f, 0x008e, 0x003e, 0x001e,
-	0x080c, 0xb8ad, 0x080c, 0x9a9f, 0x080c, 0x91f6, 0x00ce, 0x0804,
-	0x84c3, 0x2c78, 0x600c, 0x2060, 0x0804, 0x84c3, 0x012e, 0x000e,
-	0x001e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, 0x00be,
-	0x0005, 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0086,
-	0x080c, 0xd370, 0x080c, 0xd079, 0x008e, 0x003e, 0x001e, 0x08d0,
-	0x080c, 0xa40d, 0x6020, 0x9086, 0x0002, 0x1160, 0x6004, 0x0006,
-	0x9086, 0x0085, 0x000e, 0x0904, 0x852f, 0x9086, 0x008b, 0x0904,
-	0x852f, 0x0840, 0x6020, 0x9086, 0x0005, 0x1920, 0x6004, 0x0006,
-	0x9086, 0x0085, 0x000e, 0x09c8, 0x9086, 0x008b, 0x09b0, 0x0804,
-	0x8542, 0x0006, 0x00f6, 0x00e6, 0x0096, 0x00b6, 0x00c6, 0x0066,
-	0x0016, 0x0126, 0x2091, 0x8000, 0x9280, 0x1000, 0x2004, 0x905d,
-	0x2079, 0x19b6, 0x9036, 0x7828, 0x2060, 0x8cff, 0x0538, 0x6010,
-	0x9b06, 0x1500, 0x6043, 0xffff, 0x080c, 0x9902, 0x01d8, 0x610c,
-	0x0016, 0x080c, 0x8f7a, 0x6014, 0x2048, 0xa867, 0x0103, 0xab7a,
-	0xa877, 0x0000, 0x0016, 0x0036, 0x0086, 0x080c, 0xb9bc, 0x080c,
-	0xd370, 0x080c, 0x683f, 0x008e, 0x003e, 0x001e, 0x080c, 0x9a9f,
-	0x00ce, 0x08d8, 0x2c30, 0x600c, 0x2060, 0x08b8, 0x080c, 0x6310,
-	0x012e, 0x001e, 0x006e, 0x00ce, 0x00be, 0x009e, 0x00ee, 0x00fe,
-	0x000e, 0x0005, 0x0096, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x9036,
-	0x7820, 0x9065, 0x0904, 0x8639, 0x600c, 0x0006, 0x6044, 0xc0fc,
-	0x6046, 0x600f, 0x0000, 0x7830, 0x9c06, 0x1588, 0x2069, 0x0100,
-	0x6820, 0xd0a4, 0x1508, 0x080c, 0x8068, 0x080c, 0x8e21, 0x68c3,
-	0x0000, 0x080c, 0x9320, 0x7833, 0x0000, 0x0036, 0x2069, 0x0140,
-	0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x27f1,
-	0x9006, 0x080c, 0x27f1, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110,
-	0x6827, 0x0001, 0x003e, 0x0058, 0x080c, 0x6513, 0x1538, 0x6003,
-	0x0009, 0x630a, 0x7808, 0xc0ad, 0x780a, 0x2c30, 0x00f8, 0x6014,
-	0x2048, 0x080c, 0xb6c3, 0x01b0, 0x6020, 0x9086, 0x0003, 0x1508,
-	0x080c, 0xb8d3, 0x1118, 0x080c, 0xa40d, 0x0060, 0x080c, 0x6513,
-	0x1168, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x683f,
-	0x080c, 0xb8ad, 0x080c, 0x9a9f, 0x080c, 0x91f6, 0x000e, 0x0804,
-	0x85d9, 0x7e22, 0x7e1e, 0x00de, 0x00ce, 0x006e, 0x000e, 0x009e,
-	0x0005, 0x6020, 0x9086, 0x0006, 0x1118, 0x080c, 0xd079, 0x0c50,
-	0x080c, 0xa40d, 0x6020, 0x9086, 0x0002, 0x1150, 0x6004, 0x0006,
-	0x9086, 0x0085, 0x000e, 0x0990, 0x9086, 0x008b, 0x0978, 0x08d0,
-	0x6020, 0x9086, 0x0005, 0x19b0, 0x6004, 0x0006, 0x9086, 0x0085,
-	0x000e, 0x0d18, 0x9086, 0x008b, 0x0d00, 0x0860, 0x0006, 0x0096,
-	0x00b6, 0x00c6, 0x0066, 0x9036, 0x7828, 0x9065, 0x0510, 0x6010,
-	0x2058, 0x600c, 0x0006, 0x3e08, 0x918e, 0x0002, 0x1118, 0xb800,
-	0xd0bc, 0x11a8, 0x6043, 0xffff, 0x080c, 0x9902, 0x0180, 0x610c,
-	0x080c, 0x8f7a, 0x6014, 0x2048, 0xa867, 0x0103, 0xab7a, 0xa877,
-	0x0000, 0x080c, 0x683f, 0x080c, 0x9a9f, 0x000e, 0x08f0, 0x2c30,
-	0x0ce0, 0x006e, 0x00ce, 0x00be, 0x009e, 0x000e, 0x0005, 0x00e6,
-	0x00d6, 0x0096, 0x0066, 0x080c, 0x5cdc, 0x11b0, 0x2071, 0x19b6,
-	0x7030, 0x9080, 0x0005, 0x2004, 0x904d, 0x0170, 0xa878, 0x9606,
-	0x1158, 0x2071, 0x19b6, 0x7030, 0x9035, 0x0130, 0x9080, 0x0005,
-	0x2004, 0x9906, 0x1108, 0x0029, 0x006e, 0x009e, 0x00de, 0x00ee,
-	0x0005, 0x00c6, 0x2660, 0x6043, 0xffff, 0x080c, 0x9902, 0x0178,
-	0x080c, 0x8f7a, 0x6014, 0x2048, 0xa867, 0x0103, 0xab7a, 0xa877,
-	0x0000, 0x080c, 0xb9bc, 0x080c, 0x683f, 0x080c, 0x9a9f, 0x00ce,
-	0x0005, 0x00b6, 0x00e6, 0x00c6, 0x080c, 0x97a4, 0x0106, 0x190c,
-	0x9746, 0x2071, 0x0101, 0x2e04, 0xc0c4, 0x2072, 0x6044, 0xd0fc,
-	0x1138, 0x010e, 0x190c, 0x9762, 0x00ce, 0x00ee, 0x00be, 0x0005,
-	0x2071, 0x19b6, 0x7030, 0x9005, 0x0da0, 0x9c06, 0x190c, 0x0d65,
-	0x7036, 0x080c, 0x8068, 0x7004, 0x9084, 0x0007, 0x0002, 0x8701,
-	0x8703, 0x870a, 0x8714, 0x8722, 0x8701, 0x870a, 0x86ff, 0x080c,
-	0x0d65, 0x0428, 0x0005, 0x080c, 0x98ed, 0x7007, 0x0000, 0x7033,
-	0x0000, 0x00e8, 0x0066, 0x9036, 0x080c, 0x8f7a, 0x006e, 0x7007,
-	0x0000, 0x7033, 0x0000, 0x0098, 0x080c, 0x98d8, 0x0140, 0x080c,
-	0x98ed, 0x0128, 0x0066, 0x9036, 0x080c, 0x8f7a, 0x006e, 0x7033,
-	0x0000, 0x0028, 0x080c, 0x98d8, 0x080c, 0x9320, 0x0000, 0x010e,
-	0x190c, 0x9762, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x00d6, 0x00c6,
-	0x080c, 0x97a4, 0x0106, 0x190c, 0x9746, 0x6044, 0xd0fc, 0x1130,
-	0x010e, 0x190c, 0x9762, 0x00ce, 0x00de, 0x0005, 0x2069, 0x19b6,
-	0x684c, 0x9005, 0x0da8, 0x9c06, 0x190c, 0x0d65, 0x6852, 0x00e6,
-	0x2d70, 0x080c, 0x837e, 0x00ee, 0x080c, 0x8075, 0x0016, 0x2009,
-	0x0040, 0x080c, 0x201d, 0x001e, 0x683c, 0x9084, 0x0003, 0x0002,
-	0x875e, 0x875f, 0x877d, 0x875c, 0x080c, 0x0d65, 0x0460, 0x6868,
-	0x9086, 0x0001, 0x0190, 0x600c, 0x9015, 0x0160, 0x6a4a, 0x600f,
-	0x0000, 0x6044, 0xc0fc, 0x6046, 0x9006, 0x7042, 0x684e, 0x683f,
-	0x0000, 0x00c8, 0x684a, 0x6846, 0x0ca0, 0x686b, 0x0000, 0x6848,
-	0x9065, 0x0d78, 0x6003, 0x0002, 0x0c60, 0x9006, 0x686a, 0x6852,
-	0x686e, 0x600c, 0x9015, 0x0120, 0x6a4a, 0x600f, 0x0000, 0x0018,
-	0x684e, 0x684a, 0x6846, 0x684f, 0x0000, 0x010e, 0x190c, 0x9762,
-	0x00ce, 0x00de, 0x0005, 0x0005, 0x6020, 0x9084, 0x000f, 0x000b,
-	0x0005, 0x87a9, 0x87ac, 0x8c05, 0x8c94, 0x87ac, 0x8c05, 0x8c94,
-	0x87a9, 0x87ac, 0x87a9, 0x87a9, 0x87a9, 0x87a9, 0x87a9, 0x87a9,
-	0x87a9, 0x080c, 0x86d1, 0x0005, 0x00b6, 0x0156, 0x0136, 0x0146,
-	0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200,
-	0x2071, 0x0240, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0d65, 0x6110,
-	0x2158, 0xb984, 0x2c78, 0x2061, 0x0100, 0x619a, 0x908a, 0x0040,
-	0x1a04, 0x8818, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de,
-	0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0x898f, 0x89ca,
-	0x89f3, 0x8a96, 0x8ab7, 0x8abd, 0x8aca, 0x8ad2, 0x8ade, 0x8ae4,
-	0x8af5, 0x8ae4, 0x8b4c, 0x8ad2, 0x8b58, 0x8b5e, 0x8ade, 0x8b5e,
-	0x8b6a, 0x8816, 0x8816, 0x8816, 0x8816, 0x8816, 0x8816, 0x8816,
-	0x8816, 0x8816, 0x8816, 0x8816, 0x8f9b, 0x8fbe, 0x8fcf, 0x8fef,
-	0x9021, 0x8aca, 0x8816, 0x8aca, 0x8ae4, 0x8816, 0x89f3, 0x8a96,
-	0x8816, 0x9413, 0x8ae4, 0x8816, 0x942f, 0x8ae4, 0x8816, 0x8ade,
-	0x8989, 0x8839, 0x8816, 0x944b, 0x94b8, 0x9598, 0x8816, 0x95a5,
-	0x8ac7, 0x95d0, 0x8816, 0x902b, 0x95dc, 0x8816, 0x080c, 0x0d65,
-	0x2100, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce,
-	0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0x8837, 0x8837, 0x8837,
-	0x8860, 0x890c, 0x8917, 0x8837, 0x8837, 0x8837, 0x895e, 0x896a,
-	0x887b, 0x8837, 0x8896, 0x88ca, 0x9958, 0x999d, 0x8ae4, 0x080c,
-	0x0d65, 0x00d6, 0x0096, 0x080c, 0x8b7d, 0x7003, 0x2414, 0x7007,
-	0x0018, 0x700b, 0x0800, 0x7814, 0x2048, 0xa83c, 0x700e, 0xa850,
-	0x7022, 0xa854, 0x7026, 0x60c3, 0x0018, 0x080c, 0x8df1, 0x009e,
-	0x00de, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x080c,
-	0x99e4, 0x1118, 0x9084, 0xff80, 0x0110, 0x9085, 0x0001, 0x0005,
-	0x00d6, 0x0096, 0x080c, 0x8b7d, 0x7003, 0x0500, 0x7814, 0x2048,
-	0xa874, 0x700a, 0xa878, 0x700e, 0xa87c, 0x7012, 0xa880, 0x7016,
-	0xa884, 0x701a, 0xa888, 0x701e, 0x60c3, 0x0010, 0x080c, 0x8df1,
-	0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x080c, 0x8b7d, 0x7003,
-	0x0500, 0x7814, 0x2048, 0xa8cc, 0x700a, 0xa8d0, 0x700e, 0xa8d4,
-	0x7012, 0xa8d8, 0x7016, 0xa8dc, 0x701a, 0xa8e0, 0x701e, 0x60c3,
-	0x0010, 0x080c, 0x8df1, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096,
-	0x0126, 0x2091, 0x8000, 0x080c, 0x8b7d, 0x20e9, 0x0000, 0x2001,
-	0x1972, 0x2003, 0x0000, 0x7814, 0x2048, 0xa814, 0x8003, 0x60c2,
-	0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098,
-	0x2001, 0x1972, 0x0016, 0x200c, 0x2001, 0x0001, 0x080c, 0x2002,
-	0x080c, 0xc3f7, 0x9006, 0x080c, 0x2002, 0x001e, 0xa804, 0x9005,
-	0x0110, 0x2048, 0x0c28, 0x04d9, 0x080c, 0x8df1, 0x012e, 0x009e,
-	0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x8bc8, 0x20e9, 0x0000, 0x2001, 0x1972, 0x2003, 0x0000, 0x7814,
-	0x2048, 0xa86f, 0x0200, 0xa873, 0x0000, 0xa814, 0x8003, 0x60c2,
-	0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098,
-	0x2001, 0x1972, 0x0016, 0x200c, 0x080c, 0xc3f7, 0x001e, 0xa804,
-	0x9005, 0x0110, 0x2048, 0x0c60, 0x0051, 0x7814, 0x2048, 0x080c,
-	0x0fd5, 0x080c, 0x8df1, 0x012e, 0x009e, 0x00de, 0x0005, 0x60c0,
-	0x8004, 0x9084, 0x0003, 0x9005, 0x0130, 0x9082, 0x0004, 0x20a3,
-	0x0000, 0x8000, 0x1de0, 0x0005, 0x080c, 0x8b7d, 0x7003, 0x7800,
-	0x7808, 0x8007, 0x700a, 0x60c3, 0x0008, 0x0804, 0x8df1, 0x00d6,
-	0x00e6, 0x080c, 0x8bc8, 0x7814, 0x9084, 0xff00, 0x2073, 0x0200,
-	0x8e70, 0x8e70, 0x9095, 0x0010, 0x2272, 0x8e70, 0x2073, 0x0034,
-	0x8e70, 0x2069, 0x1805, 0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70,
-	0x1f04, 0x892d, 0x2069, 0x1801, 0x20a9, 0x0004, 0x2d76, 0x8d68,
-	0x8e70, 0x1f04, 0x8936, 0x2069, 0x1982, 0x9086, 0xdf00, 0x0110,
-	0x2069, 0x199c, 0x20a9, 0x001a, 0x9e86, 0x0260, 0x1148, 0x00c6,
-	0x2061, 0x0200, 0x6010, 0x8000, 0x6012, 0x00ce, 0x2071, 0x0240,
-	0x2d04, 0x8007, 0x2072, 0x8d68, 0x8e70, 0x1f04, 0x8944, 0x60c3,
-	0x004c, 0x080c, 0x8df1, 0x00ee, 0x00de, 0x0005, 0x080c, 0x8b7d,
-	0x7003, 0x6300, 0x7007, 0x0028, 0x7808, 0x700e, 0x60c3, 0x0008,
-	0x0804, 0x8df1, 0x00d6, 0x0026, 0x0016, 0x080c, 0x8bc8, 0x7003,
-	0x0200, 0x7814, 0x700e, 0x00e6, 0x9ef0, 0x0004, 0x2009, 0x0001,
-	0x2011, 0x000c, 0x2073, 0x0800, 0x8e70, 0x2073, 0x0000, 0x00ee,
-	0x7206, 0x710a, 0x62c2, 0x080c, 0x8df1, 0x001e, 0x002e, 0x00de,
-	0x0005, 0x2001, 0x1817, 0x2004, 0x609a, 0x0804, 0x8df1, 0x080c,
-	0x8b7d, 0x7003, 0x5200, 0x2069, 0x1853, 0x6804, 0xd084, 0x0130,
-	0x6828, 0x0016, 0x080c, 0x2422, 0x710e, 0x001e, 0x20a9, 0x0004,
-	0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0250,
-	0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, 0x0254, 0x4003,
-	0x080c, 0x99e4, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001,
-	0x181e, 0x2004, 0x7032, 0x2001, 0x181f, 0x2004, 0x7036, 0x0030,
-	0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x7036, 0x60c3, 0x001c,
-	0x0804, 0x8df1, 0x080c, 0x8b7d, 0x7003, 0x0500, 0x080c, 0x99e4,
-	0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, 0x181e, 0x2004,
-	0x700a, 0x2001, 0x181f, 0x2004, 0x700e, 0x0030, 0x2001, 0x1817,
-	0x2004, 0x9084, 0x00ff, 0x700e, 0x20a9, 0x0004, 0x20e1, 0x0001,
-	0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x4003, 0x60c3,
-	0x0010, 0x0804, 0x8df1, 0x080c, 0x8b7d, 0x9006, 0x080c, 0x6527,
-	0xb8a0, 0x9086, 0x007e, 0x1130, 0x7003, 0x0400, 0x620c, 0xc2b4,
-	0x620e, 0x0058, 0x7814, 0x0096, 0x904d, 0x0120, 0x9006, 0xa89a,
-	0xa8a6, 0xa8aa, 0x009e, 0x7003, 0x0300, 0xb8a0, 0x9086, 0x007e,
-	0x1904, 0x8a5e, 0x00d6, 0x2069, 0x193d, 0x2001, 0x1836, 0x2004,
-	0xd0a4, 0x0178, 0x6800, 0x700a, 0x6808, 0x9084, 0x2000, 0x7012,
-	0x680c, 0x7016, 0x701f, 0x2710, 0x6818, 0x7022, 0x681c, 0x7026,
-	0x0080, 0x6800, 0x700a, 0x6804, 0x700e, 0x6808, 0x080c, 0x6f5c,
-	0x1118, 0x9084, 0x37ff, 0x0010, 0x9084, 0x3fff, 0x7012, 0x680c,
-	0x7016, 0x00de, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805,
-	0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099,
-	0x1801, 0x20a1, 0x025a, 0x4003, 0x00d6, 0x080c, 0x9663, 0x2069,
-	0x1945, 0x2071, 0x024e, 0x6800, 0xc0dd, 0x7002, 0x080c, 0x52a1,
-	0xd0e4, 0x0110, 0x680c, 0x700e, 0x00de, 0x04a0, 0x2001, 0x1836,
-	0x2004, 0xd0a4, 0x0168, 0x0016, 0x2009, 0x0002, 0x60e0, 0x9106,
-	0x0130, 0x2100, 0x60e3, 0x0000, 0x080c, 0x2463, 0x61e2, 0x001e,
-	0x20e1, 0x0001, 0x2099, 0x193d, 0x20e9, 0x0000, 0x20a1, 0x024e,
-	0x20a9, 0x0008, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1805, 0x20a1,
-	0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, 0x025a,
-	0x4003, 0x080c, 0x9663, 0x20a1, 0x024e, 0x20a9, 0x0008, 0x2099,
-	0x1945, 0x4003, 0x60c3, 0x0074, 0x0804, 0x8df1, 0x080c, 0x8b7d,
-	0x7003, 0x2010, 0x7007, 0x0014, 0x700b, 0x0800, 0x700f, 0x2000,
-	0x9006, 0x00f6, 0x2079, 0x1853, 0x7904, 0x00fe, 0xd1ac, 0x1110,
-	0x9085, 0x0020, 0x0010, 0x9085, 0x0010, 0x9085, 0x0002, 0x00d6,
-	0x0804, 0x8b2d, 0x7026, 0x60c3, 0x0014, 0x0804, 0x8df1, 0x080c,
-	0x8b7d, 0x7003, 0x5000, 0x0804, 0x8a0d, 0x080c, 0x8b7d, 0x7003,
-	0x2110, 0x7007, 0x0014, 0x60c3, 0x0014, 0x0804, 0x8df1, 0x080c,
-	0x8bbf, 0x0010, 0x080c, 0x8bc8, 0x7003, 0x0200, 0x60c3, 0x0004,
-	0x0804, 0x8df1, 0x080c, 0x8bc8, 0x7003, 0x0100, 0x700b, 0x0003,
-	0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0x8df1, 0x080c, 0x8bc8,
-	0x7003, 0x0200, 0x0804, 0x8a0d, 0x080c, 0x8bc8, 0x7003, 0x0100,
-	0x782c, 0x9005, 0x0110, 0x700a, 0x0010, 0x700b, 0x0003, 0x7814,
-	0x700e, 0x60c3, 0x0008, 0x0804, 0x8df1, 0x00d6, 0x080c, 0x8bc8,
-	0x7003, 0x0210, 0x7007, 0x0014, 0x700b, 0x0800, 0xb894, 0x9086,
-	0x0014, 0x1198, 0xb99c, 0x9184, 0x0030, 0x0190, 0xb998, 0x9184,
-	0xc000, 0x1140, 0xd1ec, 0x0118, 0x700f, 0x2100, 0x0058, 0x700f,
-	0x0100, 0x0040, 0x700f, 0x0400, 0x0028, 0x700f, 0x0700, 0x0010,
-	0x700f, 0x0800, 0x00f6, 0x2079, 0x1853, 0x7904, 0x00fe, 0xd1ac,
-	0x1110, 0x9085, 0x0020, 0x0010, 0x9085, 0x0010, 0x2009, 0x1875,
-	0x210c, 0xd184, 0x1110, 0x9085, 0x0002, 0x0026, 0x2009, 0x1873,
-	0x210c, 0xd1e4, 0x0150, 0xc0c5, 0xbac4, 0xd28c, 0x1108, 0xc0cd,
-	0x9094, 0x0030, 0x9296, 0x0010, 0x0140, 0xd1ec, 0x0130, 0x9094,
-	0x0030, 0x9296, 0x0010, 0x0108, 0xc0bd, 0x002e, 0x7026, 0x60c3,
-	0x0014, 0x00de, 0x0804, 0x8df1, 0x080c, 0x8bc8, 0x7003, 0x0210,
-	0x7007, 0x0014, 0x700f, 0x0100, 0x60c3, 0x0014, 0x0804, 0x8df1,
-	0x080c, 0x8bc8, 0x7003, 0x0200, 0x0804, 0x8993, 0x080c, 0x8bc8,
-	0x7003, 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008,
-	0x0804, 0x8df1, 0x080c, 0x8bc8, 0x7003, 0x0100, 0x700b, 0x000b,
-	0x60c3, 0x0008, 0x0804, 0x8df1, 0x0026, 0x00d6, 0x0036, 0x0046,
-	0x2019, 0x3200, 0x2021, 0x0800, 0x0040, 0x0026, 0x00d6, 0x0036,
-	0x0046, 0x2019, 0x2200, 0x2021, 0x0100, 0x080c, 0x9678, 0xb810,
-	0x9305, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, 0x700a,
-	0x687c, 0x700e, 0x9485, 0x0029, 0x7012, 0x004e, 0x003e, 0x00de,
-	0x080c, 0x8de5, 0x721a, 0x9f95, 0x0000, 0x7222, 0x7027, 0xffff,
-	0x2071, 0x024c, 0x002e, 0x0005, 0x0026, 0x080c, 0x9678, 0x7003,
-	0x02ff, 0x7007, 0xfffc, 0x00d6, 0x2069, 0x1800, 0x6878, 0x700a,
-	0x687c, 0x700e, 0x00de, 0x7013, 0x2029, 0x0c10, 0x7003, 0x0100,
-	0x7007, 0x0000, 0x700b, 0xfc02, 0x700f, 0x0000, 0x0005, 0x0026,
-	0x00d6, 0x0036, 0x0046, 0x2019, 0x3300, 0x2021, 0x0800, 0x0040,
-	0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x2300, 0x2021, 0x0100,
-	0x080c, 0x9678, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006, 0x2069,
-	0x1800, 0xb810, 0x9005, 0x1140, 0xb814, 0x9005, 0x1128, 0x700b,
-	0x00ff, 0x700f, 0xfffe, 0x0020, 0x6878, 0x700a, 0x687c, 0x700e,
-	0x0000, 0x9485, 0x0098, 0x7012, 0x004e, 0x003e, 0x00de, 0x080c,
-	0x8de5, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071, 0x024c,
-	0x002e, 0x0005, 0x080c, 0x8de5, 0x721a, 0x7a08, 0x7222, 0x7814,
-	0x7026, 0x2071, 0x024c, 0x002e, 0x0005, 0x00b6, 0x00c6, 0x00d6,
-	0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004, 0x908a,
-	0x0085, 0x0a0c, 0x0d65, 0x908a, 0x0092, 0x1a0c, 0x0d65, 0x6110,
-	0x2158, 0xb984, 0x2c78, 0x2061, 0x0100, 0x619a, 0x9082, 0x0085,
-	0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x0005, 0x8c36,
-	0x8c45, 0x8c50, 0x8c34, 0x8c34, 0x8c34, 0x8c36, 0x8c34, 0x8c34,
-	0x8c34, 0x8c34, 0x8c34, 0x8c34, 0x080c, 0x0d65, 0x0411, 0x60c3,
-	0x0000, 0x0026, 0x080c, 0x2760, 0x0228, 0x2011, 0x0101, 0x2204,
-	0xc0c5, 0x2012, 0x002e, 0x0804, 0x8df1, 0x0431, 0x7808, 0x700a,
-	0x7814, 0x700e, 0x7017, 0xffff, 0x60c3, 0x000c, 0x0804, 0x8df1,
-	0x0479, 0x7003, 0x0003, 0x7007, 0x0300, 0x60c3, 0x0004, 0x0804,
-	0x8df1, 0x0026, 0x080c, 0x9678, 0xb810, 0x9085, 0x8100, 0x7002,
-	0xb814, 0x7006, 0x2069, 0x1800, 0x6878, 0x700a, 0x687c, 0x700e,
-	0x7013, 0x0009, 0x0804, 0x8b98, 0x0026, 0x080c, 0x9678, 0xb810,
-	0x9085, 0x8400, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878,
-	0x700a, 0x687c, 0x700e, 0x2001, 0x0099, 0x7012, 0x0804, 0x8bfa,
-	0x0026, 0x080c, 0x9678, 0xb810, 0x9085, 0x8500, 0x7002, 0xb814,
-	0x7006, 0x2069, 0x1800, 0x6878, 0x700a, 0x687c, 0x700e, 0x2001,
-	0x0099, 0x7012, 0x0804, 0x8bfa, 0x00b6, 0x00c6, 0x00d6, 0x00e6,
-	0x00f6, 0x2c78, 0x2069, 0x0200, 0x2071, 0x0240, 0x7804, 0x908a,
-	0x0040, 0x0a0c, 0x0d65, 0x908a, 0x0057, 0x1a0c, 0x0d65, 0x7910,
-	0x2158, 0xb984, 0x2061, 0x0100, 0x619a, 0x9082, 0x0040, 0x0033,
-	0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x0005, 0x8cc9, 0x8cc9,
-	0x8cc9, 0x8ced, 0x8cc9, 0x8cc9, 0x8cc9, 0x8cc9, 0x8cc9, 0x8cc9,
-	0x8cc9, 0x91c3, 0x91cf, 0x91db, 0x91e7, 0x8cc9, 0x8cc9, 0x8cc9,
-	0x91b7, 0x080c, 0x0d65, 0x6813, 0x0008, 0xba8c, 0x8210, 0xb8c4,
-	0xd084, 0x0128, 0x7a4e, 0x7b14, 0x7b52, 0x722e, 0x732a, 0x9294,
-	0x00ff, 0xba8e, 0x8217, 0x721a, 0xba10, 0x9295, 0x0600, 0x7202,
-	0xba14, 0x7206, 0x6a78, 0x720a, 0x6a7c, 0x720e, 0x7013, 0x0829,
-	0x2f10, 0x7222, 0x7027, 0xffff, 0x0005, 0x0016, 0x7814, 0x9084,
-	0x0700, 0x8007, 0x0013, 0x001e, 0x0005, 0x8cfd, 0x8cfd, 0x8cff,
-	0x8cfd, 0x8cfd, 0x8cfd, 0x8d19, 0x8cfd, 0x080c, 0x0d65, 0x7914,
-	0x918c, 0x08ff, 0x918d, 0xf600, 0x7916, 0x2009, 0x0003, 0x00b9,
-	0x2069, 0x1853, 0x6804, 0xd0bc, 0x0130, 0x682c, 0x9084, 0x00ff,
-	0x8007, 0x7032, 0x0010, 0x7033, 0x3f00, 0x60c3, 0x0001, 0x0804,
-	0x8df1, 0x2009, 0x0003, 0x0019, 0x7033, 0x7f00, 0x0cb0, 0x0016,
-	0x080c, 0x9678, 0x001e, 0xb810, 0x9085, 0x0100, 0x7002, 0xb814,
-	0x7006, 0x2069, 0x1800, 0x6a78, 0x720a, 0x6a7c, 0x720e, 0x7013,
-	0x0888, 0x918d, 0x0008, 0x7116, 0x080c, 0x8de5, 0x721a, 0x7a08,
-	0x7222, 0x2f10, 0x7226, 0x0005, 0x00b6, 0x0096, 0x00e6, 0x00d6,
-	0x00c6, 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0x1800,
-	0x7810, 0x2058, 0xb8a0, 0x2028, 0xb910, 0xba14, 0x7378, 0x747c,
-	0x7820, 0x0002, 0x8d61, 0x8d61, 0x8d61, 0x8d61, 0x8d61, 0x8d61,
-	0x8d61, 0x8d61, 0x8d61, 0x8d61, 0x8d63, 0x8d61, 0x8d61, 0x8d61,
-	0x8d61, 0x080c, 0x0d65, 0x609f, 0x0000, 0x7814, 0x2048, 0xa87c,
-	0xd0fc, 0x05d0, 0xaf90, 0x9784, 0xff00, 0x9105, 0x6062, 0x873f,
-	0x9784, 0xff00, 0x0006, 0x7814, 0x2048, 0xa878, 0xc0fc, 0x9005,
-	0x000e, 0x1160, 0xaf94, 0x87ff, 0x0510, 0x2039, 0x0098, 0x9705,
-	0x6072, 0x7808, 0x6082, 0x2f00, 0x6086, 0x0038, 0x9185, 0x2200,
-	0x6062, 0x6073, 0x0129, 0x6077, 0x0000, 0x609f, 0x0000, 0x2001,
-	0x1836, 0x2004, 0xd0ac, 0x11a8, 0xd09c, 0x0130, 0x7814, 0x2048,
-	0xa874, 0x9082, 0x0080, 0x1268, 0xb814, 0x609e, 0x0050, 0x2039,
-	0x0029, 0x9705, 0x6072, 0x0c48, 0x9185, 0x0200, 0x6062, 0x6073,
-	0x2029, 0xa87c, 0xd0fc, 0x0118, 0xaf94, 0x87ff, 0x1120, 0x2f00,
-	0x6082, 0x7808, 0x6086, 0x6266, 0x636a, 0x646e, 0x6077, 0x0000,
-	0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x607a, 0x607f,
-	0x0000, 0xa848, 0x608a, 0xa844, 0x608e, 0xa838, 0x60c6, 0xa834,
-	0x60ca, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0x080c,
-	0x9658, 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110,
-	0x2009, 0x1b58, 0x080c, 0x806d, 0x003e, 0x004e, 0x005e, 0x00ce,
-	0x00de, 0x00ee, 0x009e, 0x00be, 0x0005, 0x7a40, 0x9294, 0x00ff,
-	0x8217, 0x0005, 0x00d6, 0x2069, 0x19b6, 0x686b, 0x0001, 0x00de,
-	0x0005, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x00f1, 0x080c, 0x805f,
-	0x0005, 0x0016, 0x2001, 0x180c, 0x200c, 0x9184, 0x0600, 0x9086,
-	0x0600, 0x0128, 0x0089, 0x080c, 0x805f, 0x001e, 0x0005, 0xc1e5,
-	0x2001, 0x180c, 0x2102, 0x2001, 0x19b7, 0x2003, 0x0000, 0x2001,
-	0x19c2, 0x2003, 0x0000, 0x0c88, 0x0006, 0x0016, 0x0026, 0x2009,
-	0x1804, 0x2011, 0x0009, 0x080c, 0x283a, 0x002e, 0x001e, 0x000e,
-	0x0005, 0x0016, 0x00c6, 0x0006, 0x080c, 0x97a4, 0x0106, 0x190c,
-	0x9746, 0x2061, 0x0100, 0x61a4, 0x60a7, 0x95f5, 0x0016, 0x0026,
-	0x2009, 0x1804, 0x2011, 0x0008, 0x080c, 0x283a, 0x002e, 0x001e,
-	0x010e, 0x190c, 0x9762, 0x000e, 0xa001, 0xa001, 0xa001, 0x61a6,
-	0x00ce, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0016, 0x0026, 0x2061,
-	0x0100, 0x2069, 0x0140, 0x080c, 0x6f5c, 0x1510, 0x2001, 0x19db,
-	0x2004, 0x9005, 0x1904, 0x8ea2, 0x080c, 0x6ffd, 0x11a8, 0x2069,
-	0x0380, 0x6843, 0x0101, 0x6844, 0xd084, 0x1de8, 0x2061, 0x0100,
-	0x6020, 0xd0b4, 0x1120, 0x6024, 0xd084, 0x090c, 0x0d65, 0x6843,
-	0x0100, 0x080c, 0x805f, 0x04b0, 0x00c6, 0x2061, 0x19b6, 0x00f0,
-	0x6904, 0x9194, 0x4000, 0x0598, 0x080c, 0x8e21, 0x080c, 0x2801,
-	0x00c6, 0x2061, 0x19b6, 0x6134, 0x9192, 0x0008, 0x1278, 0x8108,
-	0x6136, 0x080c, 0x9746, 0x6130, 0x080c, 0x9762, 0x00ce, 0x81ff,
-	0x01c8, 0x080c, 0x805f, 0x080c, 0x8e14, 0x00a0, 0x080c, 0x9746,
-	0x6130, 0x91e5, 0x0000, 0x0150, 0x080c, 0xd43c, 0x080c, 0x8068,
-	0x6003, 0x0001, 0x2009, 0x0014, 0x080c, 0x9b03, 0x080c, 0x9762,
-	0x00ce, 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001,
-	0x19db, 0x2004, 0x9005, 0x1db0, 0x00c6, 0x2061, 0x19b6, 0x6134,
-	0x9192, 0x0003, 0x1ad8, 0x8108, 0x6136, 0x00ce, 0x080c, 0x805f,
-	0x080c, 0x5a9d, 0x2009, 0x1852, 0x2114, 0x8210, 0x220a, 0x0c10,
-	0x0096, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026, 0x080c, 0x8075,
-	0x080c, 0x9746, 0x2001, 0x0387, 0x2003, 0x0202, 0x2071, 0x19b6,
-	0x714c, 0x81ff, 0x0904, 0x8f36, 0x2061, 0x0100, 0x2069, 0x0140,
-	0x080c, 0x6f5c, 0x11c0, 0x0036, 0x2019, 0x0002, 0x080c, 0x90f0,
-	0x003e, 0x714c, 0x2160, 0x080c, 0xd43c, 0x2009, 0x004a, 0x6003,
-	0x0003, 0x080c, 0x9b03, 0x2001, 0x0386, 0x2003, 0x5040, 0x080c,
-	0x6ffd, 0x0804, 0x8f36, 0x6904, 0xd1f4, 0x0904, 0x8f43, 0x080c,
-	0x2801, 0x00c6, 0x704c, 0x9065, 0x090c, 0x0d65, 0x6020, 0x00ce,
-	0x9086, 0x0006, 0x1518, 0x61c8, 0x60c4, 0x9105, 0x11f8, 0x2009,
-	0x180c, 0x2104, 0xd0d4, 0x01d0, 0x6214, 0x9294, 0x1800, 0x1128,
-	0x6224, 0x9294, 0x0002, 0x1510, 0x0010, 0xc0d4, 0x200a, 0x6014,
-	0x9084, 0xe7fd, 0x9085, 0x0010, 0x6016, 0x704c, 0x2060, 0x080c,
-	0x872e, 0x2009, 0x0049, 0x080c, 0x9b03, 0x0080, 0x0036, 0x2019,
-	0x0001, 0x080c, 0x90f0, 0x003e, 0x714c, 0x2160, 0x080c, 0xd43c,
-	0x2009, 0x004a, 0x6003, 0x0003, 0x080c, 0x9b03, 0x2001, 0x0387,
-	0x2003, 0x0200, 0x080c, 0x9762, 0x002e, 0x001e, 0x00ee, 0x00de,
-	0x00ce, 0x009e, 0x0005, 0xd1ec, 0x1904, 0x8ef7, 0x0804, 0x8ef9,
-	0x0026, 0x00e6, 0x2071, 0x19b6, 0x706c, 0xd084, 0x01d0, 0xc084,
-	0x706e, 0x714c, 0x81ff, 0x01a8, 0x2071, 0x0100, 0x9188, 0x0008,
-	0x2114, 0x928e, 0x0006, 0x1138, 0x2009, 0x1984, 0x2011, 0x0012,
-	0x080c, 0x283a, 0x0030, 0x2009, 0x1984, 0x2011, 0x0016, 0x080c,
-	0x283a, 0x00ee, 0x002e, 0x0005, 0x9036, 0x2001, 0x19c0, 0x2004,
-	0x9005, 0x0128, 0x9c06, 0x0128, 0x2c30, 0x600c, 0x0cc8, 0x9085,
-	0x0001, 0x0005, 0x00f6, 0x2079, 0x19b6, 0x610c, 0x9006, 0x600e,
-	0x6044, 0xc0fc, 0x6046, 0x86ff, 0x1140, 0x7824, 0x9c06, 0x1118,
-	0x7826, 0x782a, 0x0050, 0x792a, 0x0040, 0x00c6, 0x2660, 0x610e,
-	0x00ce, 0x7824, 0x9c06, 0x1108, 0x7e26, 0x080c, 0x91f6, 0x080c,
-	0xb8ad, 0x00fe, 0x0005, 0x080c, 0x8b7d, 0x7003, 0x1200, 0x7838,
-	0x7012, 0x783c, 0x7016, 0x00c6, 0x7820, 0x9086, 0x0004, 0x1148,
-	0x7810, 0x9005, 0x0130, 0x00b6, 0x2058, 0xb810, 0xb914, 0x00be,
-	0x0020, 0x2061, 0x1800, 0x6078, 0x617c, 0x9084, 0x00ff, 0x700a,
-	0x710e, 0x00ce, 0x60c3, 0x002c, 0x0804, 0x8df1, 0x080c, 0x8b7d,
-	0x7003, 0x0f00, 0x7808, 0xd09c, 0x0128, 0xb810, 0x9084, 0x00ff,
-	0x700a, 0xb814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x8df1, 0x0156,
-	0x080c, 0x8bc8, 0x7003, 0x0200, 0x2011, 0x1848, 0x63f0, 0x2312,
-	0x20a9, 0x0006, 0x2011, 0x1840, 0x2019, 0x1841, 0x9ef0, 0x0002,
-	0x2376, 0x8e70, 0x2276, 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002,
-	0x1f04, 0x8fe0, 0x60c3, 0x001c, 0x015e, 0x0804, 0x8df1, 0x0016,
-	0x0026, 0x080c, 0x8ba4, 0x080c, 0x8bb6, 0x9e80, 0x0004, 0x20e9,
-	0x0000, 0x20a0, 0x7814, 0x0096, 0x2048, 0xa800, 0x2048, 0xa860,
-	0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, 0x009e, 0x7808, 0x9088,
-	0x0002, 0x21a8, 0x9192, 0x0010, 0x1250, 0x4003, 0x9080, 0x0004,
-	0x8003, 0x60c2, 0x080c, 0x8df1, 0x002e, 0x001e, 0x0005, 0x20a9,
-	0x0010, 0x4003, 0x080c, 0x9663, 0x20a1, 0x0240, 0x22a8, 0x4003,
-	0x0c68, 0x080c, 0x8b7d, 0x7003, 0x6200, 0x7808, 0x700e, 0x60c3,
-	0x0008, 0x0804, 0x8df1, 0x0016, 0x0026, 0x080c, 0x8b7d, 0x20e9,
-	0x0000, 0x20a1, 0x024c, 0x7814, 0x0096, 0x2048, 0xa800, 0x2048,
-	0xa860, 0x20e0, 0xa85c, 0x9080, 0x0023, 0x2098, 0x009e, 0x7808,
-	0x9088, 0x0002, 0x21a8, 0x4003, 0x8003, 0x60c2, 0x080c, 0x8df1,
-	0x002e, 0x001e, 0x0005, 0x00e6, 0x00c6, 0x0006, 0x0126, 0x2091,
-	0x8000, 0x2071, 0x19b6, 0x7010, 0x2060, 0x8cff, 0x0188, 0x080c,
-	0xb8d3, 0x1110, 0x080c, 0xa40d, 0x600c, 0x0006, 0x080c, 0xbb4a,
-	0x600f, 0x0000, 0x080c, 0x9a65, 0x080c, 0x91f6, 0x00ce, 0x0c68,
-	0x2c00, 0x7012, 0x700e, 0x012e, 0x000e, 0x00ce, 0x00ee, 0x0005,
-	0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026,
-	0x0016, 0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c,
-	0xe7ff, 0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x19b6,
-	0x7030, 0x2060, 0x8cff, 0x0548, 0x080c, 0x8e21, 0x6ac0, 0x68c3,
-	0x0000, 0x080c, 0x8068, 0x00c6, 0x2061, 0x0100, 0x080c, 0x967c,
-	0x00ce, 0x20a9, 0x01f4, 0x04b1, 0x080c, 0x86d1, 0x6044, 0xd0ac,
-	0x1128, 0x2001, 0x1957, 0x2004, 0x604a, 0x0020, 0x2009, 0x0013,
-	0x080c, 0x9b03, 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de,
-	0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x2001, 0x1800, 0x2004,
-	0x9096, 0x0001, 0x0d78, 0x9096, 0x0004, 0x0d60, 0x080c, 0x8068,
-	0x6814, 0x9084, 0x0001, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008,
-	0x68c3, 0x0000, 0x2011, 0x5a47, 0x080c, 0x7fbb, 0x20a9, 0x01f4,
-	0x0009, 0x08c0, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, 0x7804,
-	0x9084, 0x4000, 0x190c, 0x2801, 0x0090, 0xd084, 0x0118, 0x6827,
-	0x0001, 0x0010, 0x1f04, 0x90d2, 0x7804, 0x9084, 0x1000, 0x0138,
-	0x2001, 0x0100, 0x080c, 0x27f1, 0x9006, 0x080c, 0x27f1, 0x0005,
-	0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026,
-	0x0016, 0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c,
-	0xdbff, 0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x0380,
-	0x701c, 0x0006, 0x701f, 0x0202, 0x2071, 0x19b6, 0x704c, 0x2060,
-	0x8cff, 0x0904, 0x9191, 0x9386, 0x0002, 0x1128, 0x6814, 0x9084,
-	0x0002, 0x0904, 0x9191, 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009,
-	0x00fa, 0x8109, 0x1df0, 0x69c6, 0x68cb, 0x0008, 0x080c, 0x8075,
-	0x080c, 0x1c4d, 0x0046, 0x2009, 0x00a5, 0x080c, 0x0e3d, 0x2021,
-	0x0169, 0x2404, 0x9084, 0x000f, 0x9086, 0x0004, 0x11f8, 0x68af,
-	0x95f5, 0x68c6, 0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079, 0x0090,
-	0x2071, 0x19b6, 0x6814, 0x9084, 0x1984, 0x9085, 0x0012, 0x6816,
-	0x782b, 0x0008, 0x7057, 0x0000, 0x00fe, 0x00ee, 0x9386, 0x0002,
-	0x1128, 0x7884, 0x9005, 0x1110, 0x7887, 0x0001, 0x0016, 0x2009,
-	0x0040, 0x080c, 0x201d, 0x001e, 0x2009, 0x0000, 0x080c, 0x0e3d,
-	0x004e, 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004,
-	0x7804, 0x9084, 0x4000, 0x190c, 0x2801, 0x0090, 0xd08c, 0x0118,
-	0x6827, 0x0002, 0x0010, 0x1f04, 0x9163, 0x7804, 0x9084, 0x1000,
-	0x0138, 0x2001, 0x0100, 0x080c, 0x27f1, 0x9006, 0x080c, 0x27f1,
-	0x6827, 0x4000, 0x6824, 0x83ff, 0x1160, 0x2009, 0x0049, 0x080c,
-	0x872e, 0x6044, 0xd0ac, 0x1118, 0x6003, 0x0002, 0x0010, 0x080c,
-	0x9b03, 0x000e, 0x2071, 0x0380, 0xd08c, 0x1110, 0x701f, 0x0200,
-	0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe,
-	0x015e, 0x012e, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069,
-	0x19b6, 0x6a06, 0x012e, 0x00de, 0x0005, 0x00d6, 0x0126, 0x2091,
-	0x8000, 0x2069, 0x19b6, 0x6a3e, 0x012e, 0x00de, 0x0005, 0x080c,
-	0x8ccb, 0x7814, 0x080c, 0x52a5, 0x0108, 0x782c, 0x7032, 0x7042,
-	0x7047, 0x1000, 0x0478, 0x080c, 0x8ccb, 0x7814, 0x080c, 0x52a5,
-	0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x4000, 0x0418, 0x080c,
-	0x8ccb, 0x7814, 0x080c, 0x52a5, 0x0108, 0x782c, 0x7032, 0x7042,
-	0x7047, 0x2000, 0x00b8, 0x080c, 0x8ccb, 0x7814, 0x080c, 0x52a5,
-	0x0108, 0x782c, 0x7032, 0x7042, 0x7047, 0x0400, 0x0058, 0x080c,
-	0x8ccb, 0x7814, 0x080c, 0x52a5, 0x0108, 0x782c, 0x7032, 0x7042,
-	0x7047, 0x0200, 0x60c3, 0x0020, 0x0804, 0x8df1, 0x00e6, 0x2071,
-	0x19b6, 0x702c, 0x9005, 0x0110, 0x8001, 0x702e, 0x00ee, 0x0005,
-	0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, 0x0126,
-	0x2091, 0x8000, 0x2071, 0x19b6, 0x7620, 0x2660, 0x2678, 0x2039,
-	0x0001, 0x87ff, 0x0904, 0x929b, 0x8cff, 0x0904, 0x929b, 0x6020,
-	0x9086, 0x0006, 0x1904, 0x9296, 0x88ff, 0x0138, 0x2800, 0x9c06,
-	0x1904, 0x9296, 0x2039, 0x0000, 0x0050, 0x6010, 0x9b06, 0x1904,
-	0x9296, 0x85ff, 0x0120, 0x605c, 0x9106, 0x1904, 0x9296, 0x7030,
-	0x9c06, 0x15b0, 0x2069, 0x0100, 0x68c0, 0x9005, 0x1160, 0x6824,
-	0xd084, 0x0148, 0x6827, 0x0001, 0x080c, 0x8068, 0x080c, 0x9320,
-	0x7033, 0x0000, 0x0428, 0x080c, 0x8068, 0x6820, 0xd0b4, 0x0110,
-	0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x080c, 0x9320,
-	0x7033, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000,
-	0x0138, 0x2001, 0x0100, 0x080c, 0x27f1, 0x9006, 0x080c, 0x27f1,
-	0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e,
-	0x7020, 0x9c36, 0x1110, 0x660c, 0x7622, 0x701c, 0x9c36, 0x1140,
-	0x2c00, 0x9f36, 0x0118, 0x2f00, 0x701e, 0x0010, 0x701f, 0x0000,
-	0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678,
-	0x89ff, 0x1168, 0x600f, 0x0000, 0x6014, 0x0096, 0x2048, 0x080c,
-	0xb6c3, 0x0110, 0x080c, 0xd079, 0x009e, 0x080c, 0x9a9f, 0x080c,
-	0x91f6, 0x88ff, 0x1190, 0x00ce, 0x0804, 0x9211, 0x2c78, 0x600c,
-	0x2060, 0x0804, 0x9211, 0x9006, 0x012e, 0x000e, 0x006e, 0x007e,
-	0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce,
-	0x98c5, 0x0001, 0x0c88, 0x00f6, 0x00e6, 0x00d6, 0x0096, 0x00c6,
-	0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b6,
-	0x7648, 0x2660, 0x2678, 0x8cff, 0x0904, 0x930f, 0x6020, 0x9086,
-	0x0006, 0x1904, 0x930a, 0x87ff, 0x0128, 0x2700, 0x9c06, 0x1904,
-	0x930a, 0x0040, 0x6010, 0x9b06, 0x15e8, 0x85ff, 0x0118, 0x605c,
-	0x9106, 0x15c0, 0x704c, 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001,
-	0x080c, 0x90f0, 0x703f, 0x0000, 0x9006, 0x704e, 0x706a, 0x7052,
-	0x706e, 0x003e, 0x7048, 0x9c36, 0x1110, 0x660c, 0x764a, 0x7044,
-	0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7046, 0x0010,
-	0x7047, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e,
-	0x0008, 0x2678, 0x600f, 0x0000, 0x6014, 0x2048, 0x080c, 0xb6c3,
-	0x0110, 0x080c, 0xd079, 0x080c, 0x9a9f, 0x87ff, 0x1198, 0x00ce,
-	0x0804, 0x92bb, 0x2c78, 0x600c, 0x2060, 0x0804, 0x92bb, 0x9006,
-	0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x009e, 0x00de, 0x00ee,
-	0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x97bd, 0x0001, 0x0c80,
-	0x00e6, 0x2071, 0x19b6, 0x7033, 0x0000, 0x7004, 0x9086, 0x0003,
-	0x0158, 0x2001, 0x1800, 0x2004, 0x9086, 0x0002, 0x1118, 0x7007,
-	0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, 0x0005, 0x00f6, 0x00e6,
-	0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071,
-	0x19b6, 0x2c10, 0x7648, 0x2660, 0x2678, 0x8cff, 0x0518, 0x2200,
-	0x9c06, 0x11e0, 0x7048, 0x9c36, 0x1110, 0x660c, 0x764a, 0x7044,
-	0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7046, 0x0010,
-	0x7047, 0x0000, 0x660c, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008,
-	0x2678, 0x600f, 0x0000, 0x9085, 0x0001, 0x0020, 0x2c78, 0x600c,
-	0x2060, 0x08d8, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00ee,
-	0x00fe, 0x0005, 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066,
-	0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b6, 0x7610,
-	0x2660, 0x2678, 0x8cff, 0x0904, 0x9402, 0x6010, 0x00b6, 0x2058,
-	0xb8a0, 0x00be, 0x9206, 0x1904, 0x93fd, 0x7030, 0x9c06, 0x1520,
-	0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x93d9, 0x080c, 0x8e21,
-	0x68c3, 0x0000, 0x080c, 0x9320, 0x7033, 0x0000, 0x0036, 0x2069,
+	0x010e, 0x00fe, 0x1510, 0x6120, 0x9186, 0x0003, 0x0118, 0x9186,
+	0x0006, 0x11c8, 0x080c, 0xb82c, 0x01b0, 0x6014, 0x2048, 0xa884,
+	0x908a, 0x199a, 0x0280, 0x9082, 0x1999, 0xa886, 0x908a, 0x199a,
+	0x0210, 0x2001, 0x1999, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a,
+	0x080c, 0xbf72, 0x0110, 0x080c, 0xb52a, 0x012e, 0x9c88, 0x001c,
+	0x7116, 0x2001, 0x1819, 0x2004, 0x9102, 0x1228, 0x8631, 0x0138,
+	0x2160, 0x0804, 0x8177, 0x7017, 0x1ddc, 0x7007, 0x0000, 0x0005,
+	0x00fe, 0x0c58, 0x00e6, 0x2071, 0x19d4, 0x7027, 0x07d0, 0x7023,
+	0x0009, 0x00ee, 0x0005, 0x2001, 0x19dd, 0x2003, 0x0000, 0x0005,
+	0x00e6, 0x2071, 0x19d4, 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005,
+	0x2011, 0x19e0, 0x2013, 0x0000, 0x0005, 0x00e6, 0x2071, 0x19d4,
+	0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x0086, 0x0026,
+	0x7054, 0x8000, 0x7056, 0x2001, 0x19e2, 0x2044, 0xa06c, 0x9086,
+	0x0000, 0x0150, 0x7068, 0xa09a, 0x7064, 0xa096, 0x7060, 0xa092,
+	0x705c, 0xa08e, 0x080c, 0x110c, 0x002e, 0x008e, 0x0005, 0x0006,
+	0x0016, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6,
+	0x0156, 0x080c, 0x808b, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce,
+	0x00be, 0x00ae, 0x009e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071,
+	0x19d4, 0x7172, 0x7276, 0x706f, 0x0009, 0x00ee, 0x0005, 0x00e6,
+	0x0006, 0x2071, 0x19d4, 0x7074, 0x9206, 0x1110, 0x7072, 0x7076,
+	0x000e, 0x00ee, 0x0005, 0x2069, 0x1800, 0x69e8, 0xd1e4, 0x1518,
+	0x0026, 0xd1ec, 0x0140, 0x6a50, 0x6870, 0x9202, 0x0288, 0x8117,
+	0x9294, 0x00c1, 0x0088, 0x9184, 0x0007, 0x01a0, 0x8109, 0x9184,
+	0x0007, 0x0110, 0x69ea, 0x0070, 0x8107, 0x9084, 0x0007, 0x910d,
+	0x8107, 0x9106, 0x9094, 0x00c1, 0x9184, 0xff3e, 0x9205, 0x68ea,
+	0x080c, 0x0eed, 0x002e, 0x0005, 0x69e4, 0x9184, 0x003f, 0x05b8,
+	0x8109, 0x9184, 0x003f, 0x01a8, 0x6a50, 0x6870, 0x9202, 0x0220,
+	0xd1bc, 0x0168, 0xc1bc, 0x0018, 0xd1bc, 0x1148, 0xc1bd, 0x2110,
+	0x00e6, 0x2071, 0x1800, 0x080c, 0x0f0f, 0x00ee, 0x0400, 0x69e6,
+	0x00f0, 0x0026, 0x8107, 0x9094, 0x0007, 0x0128, 0x8001, 0x8007,
+	0x9085, 0x0007, 0x0050, 0x2010, 0x8004, 0x8004, 0x8004, 0x9084,
+	0x0007, 0x9205, 0x8007, 0x9085, 0x0028, 0x9086, 0x0040, 0x2010,
+	0x00e6, 0x2071, 0x1800, 0x080c, 0x0f0f, 0x00ee, 0x002e, 0x0005,
+	0x00c6, 0x2061, 0x1a3f, 0x00ce, 0x0005, 0x9184, 0x000f, 0x8003,
+	0x8003, 0x8003, 0x9080, 0x1a3f, 0x2060, 0x0005, 0xa884, 0x908a,
+	0x199a, 0x1638, 0x9005, 0x1150, 0x00c6, 0x2061, 0x1a3f, 0x6014,
+	0x00ce, 0x9005, 0x1130, 0x2001, 0x001e, 0x0018, 0x908e, 0xffff,
+	0x01b0, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, 0x908c,
+	0x00c0, 0x918e, 0x00c0, 0x0904, 0x836d, 0xd0b4, 0x1168, 0xd0bc,
+	0x1904, 0x8346, 0x2009, 0x0006, 0x080c, 0x839a, 0x0005, 0x900e,
+	0x0c60, 0x2001, 0x1999, 0x08b0, 0xd0fc, 0x05c8, 0x908c, 0x2023,
+	0x1550, 0x87ff, 0x1540, 0x6124, 0x918c, 0x0500, 0x1520, 0x6100,
+	0x918e, 0x0007, 0x1500, 0x2009, 0x1875, 0x210c, 0xd184, 0x11d8,
+	0x6003, 0x0003, 0x6007, 0x0043, 0x6047, 0xb035, 0x080c, 0x1aa5,
+	0xa87c, 0xc0dd, 0xa87e, 0x600f, 0x0000, 0x00f6, 0x2079, 0x0380,
+	0x7818, 0xd0bc, 0x1de8, 0x7833, 0x0013, 0x2c00, 0x7836, 0x781b,
+	0x8080, 0x00fe, 0x0005, 0x908c, 0x0003, 0x0120, 0x918e, 0x0003,
+	0x1904, 0x8394, 0x908c, 0x2020, 0x918e, 0x2020, 0x01a8, 0x6024,
+	0xd0d4, 0x11e8, 0x2009, 0x1875, 0x2104, 0xd084, 0x1138, 0x87ff,
+	0x1120, 0x2009, 0x0043, 0x0804, 0x9c6a, 0x0005, 0x87ff, 0x1de8,
+	0x2009, 0x0042, 0x0804, 0x9c6a, 0x6110, 0x00b6, 0x2158, 0xb900,
+	0x00be, 0xd1ac, 0x0d20, 0x6024, 0xc0cd, 0x6026, 0x0c00, 0xc0d4,
+	0x6026, 0xa890, 0x602e, 0xa88c, 0x6032, 0x08e0, 0xd0fc, 0x0160,
+	0x908c, 0x0003, 0x0120, 0x918e, 0x0003, 0x1904, 0x8394, 0x908c,
+	0x2020, 0x918e, 0x2020, 0x0170, 0x0076, 0x00f6, 0x2c78, 0x080c,
+	0x164f, 0x00fe, 0x007e, 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c,
+	0x9c6a, 0x0005, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac,
+	0x0d58, 0x6124, 0xc1cd, 0x6126, 0x0c38, 0xd0fc, 0x0188, 0x908c,
+	0x2020, 0x918e, 0x2020, 0x01a8, 0x9084, 0x0003, 0x908e, 0x0002,
+	0x0148, 0x87ff, 0x1120, 0x2009, 0x0041, 0x080c, 0x9c6a, 0x0005,
+	0x00b9, 0x0ce8, 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, 0x9c6a,
+	0x0cb0, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d20,
+	0x6124, 0xc1cd, 0x6126, 0x0c00, 0x2009, 0x0004, 0x0019, 0x0005,
+	0x2009, 0x0001, 0x0096, 0x080c, 0xb82c, 0x0518, 0x6014, 0x2048,
+	0xa982, 0xa800, 0x6016, 0x9186, 0x0001, 0x1188, 0xa97c, 0x918c,
+	0x8100, 0x918e, 0x8100, 0x1158, 0x00c6, 0x2061, 0x1a3f, 0x6200,
+	0xd28c, 0x1120, 0x6204, 0x8210, 0x0208, 0x6206, 0x00ce, 0x080c,
+	0x67c4, 0x6014, 0x904d, 0x0076, 0x2039, 0x0000, 0x190c, 0x82b6,
+	0x007e, 0x009e, 0x0005, 0x0156, 0x00c6, 0x2061, 0x1a3f, 0x6000,
+	0x81ff, 0x0110, 0x9205, 0x0008, 0x9204, 0x6002, 0x00ce, 0x015e,
+	0x0005, 0x6800, 0xd08c, 0x1138, 0x6808, 0x9005, 0x0120, 0x8001,
+	0x680a, 0x9085, 0x0001, 0x0005, 0x0126, 0x2091, 0x8000, 0x0036,
+	0x0046, 0x20a9, 0x0010, 0x9006, 0x8004, 0x8086, 0x818e, 0x1208,
+	0x9200, 0x1f04, 0x83e5, 0x8086, 0x818e, 0x004e, 0x003e, 0x012e,
+	0x0005, 0x0126, 0x2091, 0x8000, 0x0076, 0x0156, 0x20a9, 0x0010,
+	0x9005, 0x01c8, 0x911a, 0x12b8, 0x8213, 0x818d, 0x0228, 0x911a,
+	0x1220, 0x1f04, 0x83fc, 0x0028, 0x911a, 0x2308, 0x8210, 0x1f04,
+	0x83fc, 0x0006, 0x3200, 0x9084, 0xefff, 0x2080, 0x000e, 0x015e,
+	0x007e, 0x012e, 0x0005, 0x0006, 0x3200, 0x9085, 0x1000, 0x0ca8,
+	0x0126, 0x2091, 0x2800, 0x2079, 0x19b8, 0x012e, 0x00d6, 0x2069,
+	0x19b8, 0x6803, 0x0005, 0x0156, 0x0146, 0x01d6, 0x20e9, 0x0000,
+	0x2069, 0x0200, 0x080c, 0x97df, 0x04a9, 0x080c, 0x97ca, 0x0491,
+	0x080c, 0x97cd, 0x0479, 0x080c, 0x97d0, 0x0461, 0x080c, 0x97d3,
+	0x0449, 0x080c, 0x97d6, 0x0431, 0x080c, 0x97d9, 0x0419, 0x080c,
+	0x97dc, 0x0401, 0x01de, 0x014e, 0x015e, 0x6857, 0x0000, 0x00f6,
+	0x2079, 0x0380, 0x00f9, 0x7807, 0x0003, 0x7803, 0x0000, 0x7803,
+	0x0001, 0x2069, 0x0004, 0x2d04, 0x9084, 0xfffe, 0x9085, 0x8000,
+	0x206a, 0x2069, 0x0100, 0x6828, 0x9084, 0xfffc, 0x682a, 0x00fe,
+	0x00de, 0x0005, 0x20a9, 0x0020, 0x20a1, 0x0240, 0x2001, 0x0000,
+	0x4004, 0x0005, 0x00c6, 0x7803, 0x0000, 0x9006, 0x7827, 0x0030,
+	0x782b, 0x0400, 0x7827, 0x0031, 0x782b, 0x1abf, 0x781f, 0xff00,
+	0x781b, 0xff00, 0x2061, 0x1ab4, 0x602f, 0x19b8, 0x6033, 0x1800,
+	0x6037, 0x19d4, 0x603b, 0x1cf7, 0x603f, 0x1d07, 0x6042, 0x6047,
+	0x1a8a, 0x00ce, 0x0005, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007,
+	0x9086, 0x0001, 0x01b0, 0x00c6, 0x6146, 0x600f, 0x0000, 0x2c08,
+	0x2061, 0x19b8, 0x602c, 0x8000, 0x602e, 0x601c, 0x9005, 0x0130,
+	0x9080, 0x0003, 0x2102, 0x611e, 0x00ce, 0x0005, 0x6122, 0x611e,
+	0x0cd8, 0x6146, 0x2c08, 0x2001, 0x0012, 0x080c, 0x989e, 0x0005,
+	0x0016, 0x2009, 0x8020, 0x6146, 0x2c08, 0x2001, 0x0382, 0x2004,
+	0x9084, 0x0007, 0x9086, 0x0001, 0x1128, 0x2001, 0x0019, 0x080c,
+	0x989e, 0x0088, 0x00c6, 0x2061, 0x19b8, 0x602c, 0x8000, 0x602e,
+	0x600c, 0x9005, 0x0128, 0x9080, 0x0003, 0x2102, 0x610e, 0x0010,
+	0x6112, 0x610e, 0x00ce, 0x001e, 0x0005, 0x2001, 0x0382, 0x2004,
+	0x9084, 0x0007, 0x9086, 0x0001, 0x0198, 0x00c6, 0x6146, 0x600f,
+	0x0000, 0x2c08, 0x2061, 0x19b8, 0x6044, 0x9005, 0x0130, 0x9080,
+	0x0003, 0x2102, 0x6146, 0x00ce, 0x0005, 0x614a, 0x6146, 0x0cd8,
+	0x6146, 0x600f, 0x0000, 0x2c08, 0x2001, 0x0013, 0x080c, 0x989e,
+	0x0005, 0x6044, 0xd0dc, 0x0128, 0x9006, 0x7007, 0x0000, 0x700a,
+	0x7032, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x00b6, 0x0096,
+	0x0076, 0x0066, 0x0056, 0x0036, 0x0026, 0x0016, 0x0006, 0x0126,
+	0x902e, 0x2071, 0x19b8, 0x7648, 0x2660, 0x2678, 0x2091, 0x8000,
+	0x8cff, 0x0904, 0x857b, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904,
+	0x8576, 0x87ff, 0x0120, 0x605c, 0x9106, 0x1904, 0x8576, 0x704c,
+	0x9c06, 0x1178, 0x0036, 0x2019, 0x0001, 0x080c, 0x926b, 0x703f,
+	0x0000, 0x9006, 0x704e, 0x706a, 0x7052, 0x706e, 0x003e, 0x2029,
+	0x0001, 0x080c, 0x84f9, 0x7048, 0x9c36, 0x1110, 0x660c, 0x764a,
+	0x7044, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7046,
+	0x0010, 0x7047, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110,
+	0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xb82c, 0x01c8,
+	0x6014, 0x2048, 0x6020, 0x9086, 0x0003, 0x1560, 0xa867, 0x0103,
+	0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, 0x0076, 0x080c, 0xbb2a,
+	0x080c, 0xd4f8, 0x080c, 0x698f, 0x007e, 0x003e, 0x001e, 0x080c,
+	0xba1b, 0x080c, 0x9c06, 0x00ce, 0x0804, 0x8518, 0x2c78, 0x600c,
+	0x2060, 0x0804, 0x8518, 0x012e, 0x000e, 0x001e, 0x002e, 0x003e,
+	0x005e, 0x006e, 0x007e, 0x009e, 0x00be, 0x00ce, 0x00de, 0x00ee,
+	0x00fe, 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, 0x0036,
+	0x0076, 0x080c, 0xd4f8, 0x080c, 0xd1fc, 0x007e, 0x003e, 0x001e,
+	0x08c0, 0x6020, 0x9086, 0x000a, 0x0918, 0x0800, 0x0006, 0x0066,
+	0x0096, 0x00c6, 0x00d6, 0x00f6, 0x9036, 0x0126, 0x2091, 0x8000,
+	0x2079, 0x19b8, 0x7848, 0x9065, 0x0904, 0x85fd, 0x600c, 0x0006,
+	0x600f, 0x0000, 0x784c, 0x9c06, 0x11a0, 0x0036, 0x2019, 0x0001,
+	0x080c, 0x926b, 0x783f, 0x0000, 0x901e, 0x7b4e, 0x7b6a, 0x7b52,
+	0x7b6e, 0x003e, 0x000e, 0x9005, 0x1118, 0x600c, 0x600f, 0x0000,
+	0x0006, 0x00e6, 0x2f70, 0x080c, 0x84f9, 0x00ee, 0x080c, 0xb82c,
+	0x0520, 0x6014, 0x2048, 0x6020, 0x9086, 0x0003, 0x1580, 0x3e08,
+	0x918e, 0x0002, 0x1188, 0x6010, 0x9005, 0x0170, 0x00b6, 0x2058,
+	0xb800, 0x00be, 0xd0bc, 0x0140, 0x6048, 0x9005, 0x1198, 0x2001,
+	0x1959, 0x2004, 0x604a, 0x0070, 0xa867, 0x0103, 0xab7a, 0xa877,
+	0x0000, 0x080c, 0x6983, 0x080c, 0xba1b, 0x6044, 0xc0fc, 0x6046,
+	0x080c, 0x9c06, 0x000e, 0x0804, 0x85ab, 0x7e4a, 0x7e46, 0x012e,
+	0x00fe, 0x00de, 0x00ce, 0x009e, 0x006e, 0x000e, 0x0005, 0x6020,
+	0x9086, 0x0006, 0x1118, 0x080c, 0xd1fc, 0x0c38, 0x6020, 0x9086,
+	0x000a, 0x09e0, 0x08c8, 0x0016, 0x0026, 0x0086, 0x9046, 0x00a9,
+	0x080c, 0x8704, 0x008e, 0x002e, 0x001e, 0x0005, 0x00f6, 0x0126,
+	0x2079, 0x19b8, 0x2091, 0x8000, 0x080c, 0x874d, 0x080c, 0x87e1,
+	0x080c, 0x63f6, 0x012e, 0x00fe, 0x0005, 0x00b6, 0x0096, 0x00f6,
+	0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126, 0x2091,
+	0x8000, 0x2071, 0x19b8, 0x7620, 0x2660, 0x2678, 0x8cff, 0x0904,
+	0x86c9, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x86c4, 0x88ff,
+	0x0120, 0x605c, 0x9106, 0x1904, 0x86c4, 0x7030, 0x9c06, 0x1570,
+	0x2069, 0x0100, 0x6820, 0xd0a4, 0x1508, 0x080c, 0x81e3, 0x080c,
+	0x8f9c, 0x68c3, 0x0000, 0x080c, 0x9487, 0x7033, 0x0000, 0x0036,
+	0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100,
+	0x080c, 0x2833, 0x9006, 0x080c, 0x2833, 0x2069, 0x0100, 0x6824,
+	0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0040, 0x7008, 0xc0ad,
+	0x700a, 0x6003, 0x0009, 0x630a, 0x0804, 0x86c4, 0x7020, 0x9c36,
+	0x1110, 0x660c, 0x7622, 0x701c, 0x9c36, 0x1140, 0x2c00, 0x9f36,
+	0x0118, 0x2f00, 0x701e, 0x0010, 0x701f, 0x0000, 0x660c, 0x0066,
+	0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000,
+	0x6044, 0xc0fc, 0x6046, 0x6014, 0x2048, 0x080c, 0xb82c, 0x01e8,
+	0x6020, 0x9086, 0x0003, 0x1580, 0x080c, 0xba41, 0x1118, 0x080c,
+	0xa574, 0x0098, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016,
+	0x0036, 0x0086, 0x080c, 0xbb2a, 0x080c, 0xd4f8, 0x080c, 0x698f,
+	0x008e, 0x003e, 0x001e, 0x080c, 0xba1b, 0x080c, 0x9c06, 0x080c,
+	0x935d, 0x00ce, 0x0804, 0x863e, 0x2c78, 0x600c, 0x2060, 0x0804,
+	0x863e, 0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, 0x00de, 0x00ee,
+	0x00fe, 0x009e, 0x00be, 0x0005, 0x6020, 0x9086, 0x0006, 0x1158,
+	0x0016, 0x0036, 0x0086, 0x080c, 0xd4f8, 0x080c, 0xd1fc, 0x008e,
+	0x003e, 0x001e, 0x08d0, 0x080c, 0xa574, 0x6020, 0x9086, 0x0002,
+	0x1160, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0904, 0x86aa,
+	0x9086, 0x008b, 0x0904, 0x86aa, 0x0840, 0x6020, 0x9086, 0x0005,
+	0x1920, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x09c8, 0x9086,
+	0x008b, 0x09b0, 0x0804, 0x86bd, 0x0006, 0x00f6, 0x00e6, 0x0096,
+	0x00b6, 0x00c6, 0x0066, 0x0016, 0x0126, 0x2091, 0x8000, 0x9280,
+	0x1000, 0x2004, 0x905d, 0x2079, 0x19b8, 0x9036, 0x7828, 0x2060,
+	0x8cff, 0x0538, 0x6010, 0x9b06, 0x1500, 0x6043, 0xffff, 0x080c,
+	0x9a69, 0x01d8, 0x610c, 0x0016, 0x080c, 0x90f5, 0x6014, 0x2048,
+	0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, 0x0086,
+	0x080c, 0xbb2a, 0x080c, 0xd4f8, 0x080c, 0x698f, 0x008e, 0x003e,
+	0x001e, 0x080c, 0x9c06, 0x00ce, 0x08d8, 0x2c30, 0x600c, 0x2060,
+	0x08b8, 0x080c, 0x6413, 0x012e, 0x001e, 0x006e, 0x00ce, 0x00be,
+	0x009e, 0x00ee, 0x00fe, 0x000e, 0x0005, 0x0096, 0x0006, 0x0066,
+	0x00c6, 0x00d6, 0x9036, 0x7820, 0x9065, 0x0904, 0x87b4, 0x600c,
+	0x0006, 0x6044, 0xc0fc, 0x6046, 0x600f, 0x0000, 0x7830, 0x9c06,
+	0x1588, 0x2069, 0x0100, 0x6820, 0xd0a4, 0x1508, 0x080c, 0x81e3,
+	0x080c, 0x8f9c, 0x68c3, 0x0000, 0x080c, 0x9487, 0x7833, 0x0000,
+	0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001,
+	0x0100, 0x080c, 0x2833, 0x9006, 0x080c, 0x2833, 0x2069, 0x0100,
+	0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0058, 0x080c,
+	0x6616, 0x1538, 0x6003, 0x0009, 0x630a, 0x7808, 0xc0ad, 0x780a,
+	0x2c30, 0x00f8, 0x6014, 0x2048, 0x080c, 0xb82a, 0x01b0, 0x6020,
+	0x9086, 0x0003, 0x1508, 0x080c, 0xba41, 0x1118, 0x080c, 0xa574,
+	0x0060, 0x080c, 0x6616, 0x1168, 0xa867, 0x0103, 0xab7a, 0xa877,
+	0x0000, 0x080c, 0x698f, 0x080c, 0xba1b, 0x080c, 0x9c06, 0x080c,
+	0x935d, 0x000e, 0x0804, 0x8754, 0x7e22, 0x7e1e, 0x00de, 0x00ce,
+	0x006e, 0x000e, 0x009e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1118,
+	0x080c, 0xd1fc, 0x0c50, 0x080c, 0xa574, 0x6020, 0x9086, 0x0002,
+	0x1150, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0990, 0x9086,
+	0x008b, 0x0978, 0x08d0, 0x6020, 0x9086, 0x0005, 0x19b0, 0x6004,
+	0x0006, 0x9086, 0x0085, 0x000e, 0x0d18, 0x9086, 0x008b, 0x0d00,
+	0x0860, 0x0006, 0x0096, 0x00b6, 0x00c6, 0x0066, 0x9036, 0x7828,
+	0x9065, 0x0510, 0x6010, 0x2058, 0x600c, 0x0006, 0x3e08, 0x918e,
+	0x0002, 0x1118, 0xb800, 0xd0bc, 0x11a8, 0x6043, 0xffff, 0x080c,
+	0x9a69, 0x0180, 0x610c, 0x080c, 0x90f5, 0x6014, 0x2048, 0xa867,
+	0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x698f, 0x080c, 0x9c06,
+	0x000e, 0x08f0, 0x2c30, 0x0ce0, 0x006e, 0x00ce, 0x00be, 0x009e,
+	0x000e, 0x0005, 0x00e6, 0x00d6, 0x0096, 0x0066, 0x080c, 0x5dcf,
+	0x11b0, 0x2071, 0x19b8, 0x7030, 0x9080, 0x0005, 0x2004, 0x904d,
+	0x0170, 0xa878, 0x9606, 0x1158, 0x2071, 0x19b8, 0x7030, 0x9035,
+	0x0130, 0x9080, 0x0005, 0x2004, 0x9906, 0x1108, 0x0029, 0x006e,
+	0x009e, 0x00de, 0x00ee, 0x0005, 0x00c6, 0x2660, 0x6043, 0xffff,
+	0x080c, 0x9a69, 0x0178, 0x080c, 0x90f5, 0x6014, 0x2048, 0xa867,
+	0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xbb2a, 0x080c, 0x698f,
+	0x080c, 0x9c06, 0x00ce, 0x0005, 0x00b6, 0x00e6, 0x00c6, 0x080c,
+	0x990b, 0x0106, 0x190c, 0x98ad, 0x2071, 0x0101, 0x2e04, 0xc0c4,
+	0x2072, 0x6044, 0xd0fc, 0x1138, 0x010e, 0x190c, 0x98c9, 0x00ce,
+	0x00ee, 0x00be, 0x0005, 0x2071, 0x19b8, 0x7030, 0x9005, 0x0da0,
+	0x9c06, 0x190c, 0x0d65, 0x7036, 0x080c, 0x81e3, 0x7004, 0x9084,
+	0x0007, 0x0002, 0x887c, 0x887e, 0x8885, 0x888f, 0x889d, 0x887c,
+	0x8885, 0x887a, 0x080c, 0x0d65, 0x0428, 0x0005, 0x080c, 0x9a54,
+	0x7007, 0x0000, 0x7033, 0x0000, 0x00e8, 0x0066, 0x9036, 0x080c,
+	0x90f5, 0x006e, 0x7007, 0x0000, 0x7033, 0x0000, 0x0098, 0x080c,
+	0x9a3f, 0x0140, 0x080c, 0x9a54, 0x0128, 0x0066, 0x9036, 0x080c,
+	0x90f5, 0x006e, 0x7033, 0x0000, 0x0028, 0x080c, 0x9a3f, 0x080c,
+	0x9487, 0x0000, 0x010e, 0x190c, 0x98c9, 0x00ce, 0x00ee, 0x00be,
+	0x0005, 0x00d6, 0x00c6, 0x080c, 0x990b, 0x0106, 0x190c, 0x98ad,
+	0x6044, 0xd0fc, 0x1130, 0x010e, 0x190c, 0x98c9, 0x00ce, 0x00de,
+	0x0005, 0x2069, 0x19b8, 0x684c, 0x9005, 0x0da8, 0x9c06, 0x190c,
+	0x0d65, 0x6852, 0x00e6, 0x2d70, 0x080c, 0x84f9, 0x00ee, 0x080c,
+	0x81f0, 0x0016, 0x2009, 0x0040, 0x080c, 0x2052, 0x001e, 0x683c,
+	0x9084, 0x0003, 0x0002, 0x88d9, 0x88da, 0x88f8, 0x88d7, 0x080c,
+	0x0d65, 0x0460, 0x6868, 0x9086, 0x0001, 0x0190, 0x600c, 0x9015,
+	0x0160, 0x6a4a, 0x600f, 0x0000, 0x6044, 0xc0fc, 0x6046, 0x9006,
+	0x7042, 0x684e, 0x683f, 0x0000, 0x00c8, 0x684a, 0x6846, 0x0ca0,
+	0x686b, 0x0000, 0x6848, 0x9065, 0x0d78, 0x6003, 0x0002, 0x0c60,
+	0x9006, 0x686a, 0x6852, 0x686e, 0x600c, 0x9015, 0x0120, 0x6a4a,
+	0x600f, 0x0000, 0x0018, 0x684e, 0x684a, 0x6846, 0x684f, 0x0000,
+	0x010e, 0x190c, 0x98c9, 0x00ce, 0x00de, 0x0005, 0x0005, 0x6020,
+	0x9084, 0x000f, 0x000b, 0x0005, 0x8924, 0x8927, 0x8d80, 0x8e0f,
+	0x8927, 0x8d80, 0x8e0f, 0x8924, 0x8927, 0x8924, 0x8924, 0x8924,
+	0x8924, 0x8924, 0x8924, 0x8924, 0x080c, 0x884c, 0x0005, 0x00b6,
+	0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6,
+	0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004, 0x908a, 0x0053,
+	0x1a0c, 0x0d65, 0x6110, 0x2158, 0xb984, 0x2c78, 0x2061, 0x0100,
+	0x619a, 0x908a, 0x0040, 0x1a04, 0x8993, 0x005b, 0x00fe, 0x00ee,
+	0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be,
+	0x0005, 0x8b0a, 0x8b45, 0x8b6e, 0x8c11, 0x8c32, 0x8c38, 0x8c45,
+	0x8c4d, 0x8c59, 0x8c5f, 0x8c70, 0x8c5f, 0x8cc7, 0x8c4d, 0x8cd3,
+	0x8cd9, 0x8c59, 0x8cd9, 0x8ce5, 0x8991, 0x8991, 0x8991, 0x8991,
+	0x8991, 0x8991, 0x8991, 0x8991, 0x8991, 0x8991, 0x8991, 0x9116,
+	0x9139, 0x914a, 0x916a, 0x919c, 0x8c45, 0x8991, 0x8c45, 0x8c5f,
+	0x8991, 0x8b6e, 0x8c11, 0x8991, 0x957a, 0x8c5f, 0x8991, 0x9596,
+	0x8c5f, 0x8991, 0x8c59, 0x8b04, 0x89b4, 0x8991, 0x95b2, 0x961f,
+	0x96ff, 0x8991, 0x970c, 0x8c42, 0x9737, 0x8991, 0x91a6, 0x9743,
+	0x8991, 0x080c, 0x0d65, 0x2100, 0x005b, 0x00fe, 0x00ee, 0x00de,
+	0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, 0x0005,
+	0x89b2, 0x89b2, 0x89b2, 0x89db, 0x8a87, 0x8a92, 0x89b2, 0x89b2,
+	0x89b2, 0x8ad9, 0x8ae5, 0x89f6, 0x89b2, 0x8a11, 0x8a45, 0x9abf,
+	0x9b04, 0x8c5f, 0x080c, 0x0d65, 0x00d6, 0x0096, 0x080c, 0x8cf8,
+	0x7003, 0x2414, 0x7007, 0x0018, 0x700b, 0x0800, 0x7814, 0x2048,
+	0xa83c, 0x700e, 0xa850, 0x7022, 0xa854, 0x7026, 0x60c3, 0x0018,
+	0x080c, 0x8f6c, 0x009e, 0x00de, 0x0005, 0x7810, 0x00b6, 0x2058,
+	0xb8a0, 0x00be, 0x080c, 0x9b4b, 0x1118, 0x9084, 0xff80, 0x0110,
+	0x9085, 0x0001, 0x0005, 0x00d6, 0x0096, 0x080c, 0x8cf8, 0x7003,
+	0x0500, 0x7814, 0x2048, 0xa874, 0x700a, 0xa878, 0x700e, 0xa87c,
+	0x7012, 0xa880, 0x7016, 0xa884, 0x701a, 0xa888, 0x701e, 0x60c3,
+	0x0010, 0x080c, 0x8f6c, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096,
+	0x080c, 0x8cf8, 0x7003, 0x0500, 0x7814, 0x2048, 0xa8cc, 0x700a,
+	0xa8d0, 0x700e, 0xa8d4, 0x7012, 0xa8d8, 0x7016, 0xa8dc, 0x701a,
+	0xa8e0, 0x701e, 0x60c3, 0x0010, 0x080c, 0x8f6c, 0x009e, 0x00de,
+	0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, 0x080c, 0x8cf8,
+	0x20e9, 0x0000, 0x2001, 0x1974, 0x2003, 0x0000, 0x7814, 0x2048,
+	0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c,
+	0x9080, 0x001b, 0x2098, 0x2001, 0x1974, 0x0016, 0x200c, 0x2001,
+	0x0001, 0x080c, 0x2037, 0x080c, 0xc575, 0x9006, 0x080c, 0x2037,
+	0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c28, 0x04d9, 0x080c,
+	0x8f6c, 0x012e, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x0126,
+	0x2091, 0x8000, 0x080c, 0x8d43, 0x20e9, 0x0000, 0x2001, 0x1974,
+	0x2003, 0x0000, 0x7814, 0x2048, 0xa86f, 0x0200, 0xa873, 0x0000,
+	0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c,
+	0x9080, 0x001b, 0x2098, 0x2001, 0x1974, 0x0016, 0x200c, 0x080c,
+	0xc575, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c60, 0x0051,
+	0x7814, 0x2048, 0x080c, 0x0fd4, 0x080c, 0x8f6c, 0x012e, 0x009e,
+	0x00de, 0x0005, 0x60c0, 0x8004, 0x9084, 0x0003, 0x9005, 0x0130,
+	0x9082, 0x0004, 0x20a3, 0x0000, 0x8000, 0x1de0, 0x0005, 0x080c,
+	0x8cf8, 0x7003, 0x7800, 0x7808, 0x8007, 0x700a, 0x60c3, 0x0008,
+	0x0804, 0x8f6c, 0x00d6, 0x00e6, 0x080c, 0x8d43, 0x7814, 0x9084,
+	0xff00, 0x2073, 0x0200, 0x8e70, 0x8e70, 0x9095, 0x0010, 0x2272,
+	0x8e70, 0x2073, 0x0034, 0x8e70, 0x2069, 0x1805, 0x20a9, 0x0004,
+	0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x8aa8, 0x2069, 0x1801, 0x20a9,
+	0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x8ab1, 0x2069, 0x1984,
+	0x9086, 0xdf00, 0x0110, 0x2069, 0x199e, 0x20a9, 0x001a, 0x9e86,
+	0x0260, 0x1148, 0x00c6, 0x2061, 0x0200, 0x6010, 0x8000, 0x6012,
+	0x00ce, 0x2071, 0x0240, 0x2d04, 0x8007, 0x2072, 0x8d68, 0x8e70,
+	0x1f04, 0x8abf, 0x60c3, 0x004c, 0x080c, 0x8f6c, 0x00ee, 0x00de,
+	0x0005, 0x080c, 0x8cf8, 0x7003, 0x6300, 0x7007, 0x0028, 0x7808,
+	0x700e, 0x60c3, 0x0008, 0x0804, 0x8f6c, 0x00d6, 0x0026, 0x0016,
+	0x080c, 0x8d43, 0x7003, 0x0200, 0x7814, 0x700e, 0x00e6, 0x9ef0,
+	0x0004, 0x2009, 0x0001, 0x2011, 0x000c, 0x2073, 0x0800, 0x8e70,
+	0x2073, 0x0000, 0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c, 0x8f6c,
+	0x001e, 0x002e, 0x00de, 0x0005, 0x2001, 0x1817, 0x2004, 0x609a,
+	0x0804, 0x8f6c, 0x080c, 0x8cf8, 0x7003, 0x5200, 0x2069, 0x1853,
+	0x6804, 0xd084, 0x0130, 0x6828, 0x0016, 0x080c, 0x2457, 0x710e,
+	0x001e, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9,
+	0x0000, 0x20a1, 0x0250, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801,
+	0x20a1, 0x0254, 0x4003, 0x080c, 0x9b4b, 0x1120, 0xb8a0, 0x9082,
+	0x007f, 0x0248, 0x2001, 0x181e, 0x2004, 0x7032, 0x2001, 0x181f,
+	0x2004, 0x7036, 0x0030, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff,
+	0x7036, 0x60c3, 0x001c, 0x0804, 0x8f6c, 0x080c, 0x8cf8, 0x7003,
+	0x0500, 0x080c, 0x9b4b, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248,
+	0x2001, 0x181e, 0x2004, 0x700a, 0x2001, 0x181f, 0x2004, 0x700e,
+	0x0030, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x700e, 0x20a9,
+	0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1,
+	0x0250, 0x4003, 0x60c3, 0x0010, 0x0804, 0x8f6c, 0x080c, 0x8cf8,
+	0x9006, 0x080c, 0x662a, 0xb8a0, 0x9086, 0x007e, 0x1130, 0x7003,
+	0x0400, 0x620c, 0xc2b4, 0x620e, 0x0058, 0x7814, 0x0096, 0x904d,
+	0x0120, 0x9006, 0xa89a, 0xa8a6, 0xa8aa, 0x009e, 0x7003, 0x0300,
+	0xb8a0, 0x9086, 0x007e, 0x1904, 0x8bd9, 0x00d6, 0x2069, 0x193d,
+	0x2001, 0x1836, 0x2004, 0xd0a4, 0x0178, 0x6800, 0x700a, 0x6808,
+	0x9084, 0x2000, 0x7012, 0x680c, 0x7016, 0x701f, 0x2710, 0x6818,
+	0x7022, 0x681c, 0x7026, 0x0080, 0x6800, 0x700a, 0x6804, 0x700e,
+	0x6808, 0x080c, 0x70ac, 0x1118, 0x9084, 0x37ff, 0x0010, 0x9084,
+	0x3fff, 0x7012, 0x680c, 0x7016, 0x00de, 0x20a9, 0x0004, 0x20e1,
+	0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003,
+	0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, 0x025a, 0x4003, 0x00d6,
+	0x080c, 0x97ca, 0x2069, 0x1945, 0x2071, 0x024e, 0x6800, 0xc0dd,
+	0x7002, 0x080c, 0x538a, 0xd0e4, 0x0110, 0x680c, 0x700e, 0x00de,
+	0x04a0, 0x2001, 0x1836, 0x2004, 0xd0a4, 0x0168, 0x0016, 0x2009,
+	0x0002, 0x60e0, 0x9106, 0x0130, 0x2100, 0x60e3, 0x0000, 0x080c,
+	0x2498, 0x61e2, 0x001e, 0x20e1, 0x0001, 0x2099, 0x193d, 0x20e9,
+	0x0000, 0x20a1, 0x024e, 0x20a9, 0x0008, 0x4003, 0x20a9, 0x0004,
+	0x2099, 0x1805, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099,
+	0x1801, 0x20a1, 0x025a, 0x4003, 0x080c, 0x97ca, 0x20a1, 0x024e,
+	0x20a9, 0x0008, 0x2099, 0x1945, 0x4003, 0x60c3, 0x0074, 0x0804,
+	0x8f6c, 0x080c, 0x8cf8, 0x7003, 0x2010, 0x7007, 0x0014, 0x700b,
+	0x0800, 0x700f, 0x2000, 0x9006, 0x00f6, 0x2079, 0x1853, 0x7904,
+	0x00fe, 0xd1ac, 0x1110, 0x9085, 0x0020, 0x0010, 0x9085, 0x0010,
+	0x9085, 0x0002, 0x00d6, 0x0804, 0x8ca8, 0x7026, 0x60c3, 0x0014,
+	0x0804, 0x8f6c, 0x080c, 0x8cf8, 0x7003, 0x5000, 0x0804, 0x8b88,
+	0x080c, 0x8cf8, 0x7003, 0x2110, 0x7007, 0x0014, 0x60c3, 0x0014,
+	0x0804, 0x8f6c, 0x080c, 0x8d3a, 0x0010, 0x080c, 0x8d43, 0x7003,
+	0x0200, 0x60c3, 0x0004, 0x0804, 0x8f6c, 0x080c, 0x8d43, 0x7003,
+	0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804,
+	0x8f6c, 0x080c, 0x8d43, 0x7003, 0x0200, 0x0804, 0x8b88, 0x080c,
+	0x8d43, 0x7003, 0x0100, 0x782c, 0x9005, 0x0110, 0x700a, 0x0010,
+	0x700b, 0x0003, 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x8f6c,
+	0x00d6, 0x080c, 0x8d43, 0x7003, 0x0210, 0x7007, 0x0014, 0x700b,
+	0x0800, 0xb894, 0x9086, 0x0014, 0x1198, 0xb99c, 0x9184, 0x0030,
+	0x0190, 0xb998, 0x9184, 0xc000, 0x1140, 0xd1ec, 0x0118, 0x700f,
+	0x2100, 0x0058, 0x700f, 0x0100, 0x0040, 0x700f, 0x0400, 0x0028,
+	0x700f, 0x0700, 0x0010, 0x700f, 0x0800, 0x00f6, 0x2079, 0x1853,
+	0x7904, 0x00fe, 0xd1ac, 0x1110, 0x9085, 0x0020, 0x0010, 0x9085,
+	0x0010, 0x2009, 0x1875, 0x210c, 0xd184, 0x1110, 0x9085, 0x0002,
+	0x0026, 0x2009, 0x1873, 0x210c, 0xd1e4, 0x0150, 0xc0c5, 0xbac4,
+	0xd28c, 0x1108, 0xc0cd, 0x9094, 0x0030, 0x9296, 0x0010, 0x0140,
+	0xd1ec, 0x0130, 0x9094, 0x0030, 0x9296, 0x0010, 0x0108, 0xc0bd,
+	0x002e, 0x7026, 0x60c3, 0x0014, 0x00de, 0x0804, 0x8f6c, 0x080c,
+	0x8d43, 0x7003, 0x0210, 0x7007, 0x0014, 0x700f, 0x0100, 0x60c3,
+	0x0014, 0x0804, 0x8f6c, 0x080c, 0x8d43, 0x7003, 0x0200, 0x0804,
+	0x8b0e, 0x080c, 0x8d43, 0x7003, 0x0100, 0x700b, 0x0003, 0x700f,
+	0x2a00, 0x60c3, 0x0008, 0x0804, 0x8f6c, 0x080c, 0x8d43, 0x7003,
+	0x0100, 0x700b, 0x000b, 0x60c3, 0x0008, 0x0804, 0x8f6c, 0x0026,
+	0x00d6, 0x0036, 0x0046, 0x2019, 0x3200, 0x2021, 0x0800, 0x0040,
+	0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x2200, 0x2021, 0x0100,
+	0x080c, 0x97df, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006, 0x2069,
+	0x1800, 0x6878, 0x700a, 0x687c, 0x700e, 0x9485, 0x0029, 0x7012,
+	0x004e, 0x003e, 0x00de, 0x080c, 0x8f60, 0x721a, 0x9f95, 0x0000,
+	0x7222, 0x7027, 0xffff, 0x2071, 0x024c, 0x002e, 0x0005, 0x0026,
+	0x080c, 0x97df, 0x7003, 0x02ff, 0x7007, 0xfffc, 0x00d6, 0x2069,
+	0x1800, 0x6878, 0x700a, 0x687c, 0x700e, 0x00de, 0x7013, 0x2029,
+	0x0c10, 0x7003, 0x0100, 0x7007, 0x0000, 0x700b, 0xfc02, 0x700f,
+	0x0000, 0x0005, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x3300,
+	0x2021, 0x0800, 0x0040, 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019,
+	0x2300, 0x2021, 0x0100, 0x080c, 0x97df, 0xb810, 0x9305, 0x7002,
+	0xb814, 0x7006, 0x2069, 0x1800, 0xb810, 0x9005, 0x1140, 0xb814,
+	0x9005, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, 0x0020, 0x6878,
+	0x700a, 0x687c, 0x700e, 0x0000, 0x9485, 0x0098, 0x7012, 0x004e,
+	0x003e, 0x00de, 0x080c, 0x8f60, 0x721a, 0x7a08, 0x7222, 0x2f10,
+	0x7226, 0x2071, 0x024c, 0x002e, 0x0005, 0x080c, 0x8f60, 0x721a,
+	0x7a08, 0x7222, 0x7814, 0x7026, 0x2071, 0x024c, 0x002e, 0x0005,
+	0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071,
+	0x0240, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d65, 0x908a, 0x0092,
+	0x1a0c, 0x0d65, 0x6110, 0x2158, 0xb984, 0x2c78, 0x2061, 0x0100,
+	0x619a, 0x9082, 0x0085, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce,
+	0x00be, 0x0005, 0x8db1, 0x8dc0, 0x8dcb, 0x8daf, 0x8daf, 0x8daf,
+	0x8db1, 0x8daf, 0x8daf, 0x8daf, 0x8daf, 0x8daf, 0x8daf, 0x080c,
+	0x0d65, 0x0411, 0x60c3, 0x0000, 0x0026, 0x080c, 0x27a2, 0x0228,
+	0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x0804, 0x8f6c,
+	0x0431, 0x7808, 0x700a, 0x7814, 0x700e, 0x7017, 0xffff, 0x60c3,
+	0x000c, 0x0804, 0x8f6c, 0x0479, 0x7003, 0x0003, 0x7007, 0x0300,
+	0x60c3, 0x0004, 0x0804, 0x8f6c, 0x0026, 0x080c, 0x97df, 0xb810,
+	0x9085, 0x8100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878,
+	0x700a, 0x687c, 0x700e, 0x7013, 0x0009, 0x0804, 0x8d13, 0x0026,
+	0x080c, 0x97df, 0xb810, 0x9085, 0x8400, 0x7002, 0xb814, 0x7006,
+	0x2069, 0x1800, 0x6878, 0x700a, 0x687c, 0x700e, 0x2001, 0x0099,
+	0x7012, 0x0804, 0x8d75, 0x0026, 0x080c, 0x97df, 0xb810, 0x9085,
+	0x8500, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, 0x700a,
+	0x687c, 0x700e, 0x2001, 0x0099, 0x7012, 0x0804, 0x8d75, 0x00b6,
+	0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2c78, 0x2069, 0x0200, 0x2071,
+	0x0240, 0x7804, 0x908a, 0x0040, 0x0a0c, 0x0d65, 0x908a, 0x0057,
+	0x1a0c, 0x0d65, 0x7910, 0x2158, 0xb984, 0x2061, 0x0100, 0x619a,
+	0x9082, 0x0040, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be,
+	0x0005, 0x8e44, 0x8e44, 0x8e44, 0x8e68, 0x8e44, 0x8e44, 0x8e44,
+	0x8e44, 0x8e44, 0x8e44, 0x8e44, 0x933a, 0x9342, 0x934a, 0x9352,
+	0x8e44, 0x8e44, 0x8e44, 0x9332, 0x080c, 0x0d65, 0x6813, 0x0008,
+	0xba8c, 0x8210, 0xb8c4, 0xd084, 0x0128, 0x7a4e, 0x7b14, 0x7b52,
+	0x722e, 0x732a, 0x9294, 0x00ff, 0xba8e, 0x8217, 0x721a, 0xba10,
+	0x9295, 0x0600, 0x7202, 0xba14, 0x7206, 0x6a78, 0x720a, 0x6a7c,
+	0x720e, 0x7013, 0x0829, 0x2f10, 0x7222, 0x7027, 0xffff, 0x0005,
+	0x0016, 0x7814, 0x9084, 0x0700, 0x8007, 0x0013, 0x001e, 0x0005,
+	0x8e78, 0x8e78, 0x8e7a, 0x8e78, 0x8e78, 0x8e78, 0x8e94, 0x8e78,
+	0x080c, 0x0d65, 0x7914, 0x918c, 0x08ff, 0x918d, 0xf600, 0x7916,
+	0x2009, 0x0003, 0x00b9, 0x2069, 0x1853, 0x6804, 0xd0bc, 0x0130,
+	0x682c, 0x9084, 0x00ff, 0x8007, 0x7032, 0x0010, 0x7033, 0x3f00,
+	0x60c3, 0x0001, 0x0804, 0x8f6c, 0x2009, 0x0003, 0x0019, 0x7033,
+	0x7f00, 0x0cb0, 0x0016, 0x080c, 0x97df, 0x001e, 0xb810, 0x9085,
+	0x0100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6a78, 0x720a,
+	0x6a7c, 0x720e, 0x7013, 0x0888, 0x918d, 0x0008, 0x7116, 0x080c,
+	0x8f60, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x0005, 0x00b6,
+	0x0096, 0x00e6, 0x00d6, 0x00c6, 0x0056, 0x0046, 0x0036, 0x2061,
+	0x0100, 0x2071, 0x1800, 0x7810, 0x2058, 0xb8a0, 0x2028, 0xb910,
+	0xba14, 0x7378, 0x747c, 0x7820, 0x0002, 0x8edc, 0x8edc, 0x8edc,
+	0x8edc, 0x8edc, 0x8edc, 0x8edc, 0x8edc, 0x8edc, 0x8edc, 0x8ede,
+	0x8edc, 0x8edc, 0x8edc, 0x8edc, 0x080c, 0x0d65, 0x609f, 0x0000,
+	0x7814, 0x2048, 0xa87c, 0xd0fc, 0x05d0, 0xaf90, 0x9784, 0xff00,
+	0x9105, 0x6062, 0x873f, 0x9784, 0xff00, 0x0006, 0x7814, 0x2048,
+	0xa878, 0xc0fc, 0x9005, 0x000e, 0x1160, 0xaf94, 0x87ff, 0x0510,
+	0x2039, 0x0098, 0x9705, 0x6072, 0x7808, 0x6082, 0x2f00, 0x6086,
+	0x0038, 0x9185, 0x2200, 0x6062, 0x6073, 0x0129, 0x6077, 0x0000,
+	0x609f, 0x0000, 0x2001, 0x1836, 0x2004, 0xd0ac, 0x11a8, 0xd09c,
+	0x0130, 0x7814, 0x2048, 0xa874, 0x9082, 0x0080, 0x1268, 0xb814,
+	0x609e, 0x0050, 0x2039, 0x0029, 0x9705, 0x6072, 0x0c48, 0x9185,
+	0x0200, 0x6062, 0x6073, 0x2029, 0xa87c, 0xd0fc, 0x0118, 0xaf94,
+	0x87ff, 0x1120, 0x2f00, 0x6082, 0x7808, 0x6086, 0x6266, 0x636a,
+	0x646e, 0x6077, 0x0000, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e,
+	0x8007, 0x607a, 0x607f, 0x0000, 0xa848, 0x608a, 0xa844, 0x608e,
+	0xa838, 0x60c6, 0xa834, 0x60ca, 0xb86c, 0x60ce, 0x60af, 0x95d5,
+	0x60d7, 0x0000, 0x080c, 0x97bf, 0x2009, 0x07d0, 0x60c4, 0x9084,
+	0xfff0, 0x9005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x81e8, 0x003e,
+	0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x009e, 0x00be, 0x0005,
+	0x7a40, 0x9294, 0x00ff, 0x8217, 0x0005, 0x00d6, 0x2069, 0x19b8,
+	0x686b, 0x0001, 0x00de, 0x0005, 0x60a3, 0x0056, 0x60a7, 0x9575,
+	0x00f1, 0x080c, 0x81da, 0x0005, 0x0016, 0x2001, 0x180c, 0x200c,
+	0x9184, 0x0600, 0x9086, 0x0600, 0x0128, 0x0089, 0x080c, 0x81da,
+	0x001e, 0x0005, 0xc1e5, 0x2001, 0x180c, 0x2102, 0x2001, 0x19b9,
+	0x2003, 0x0000, 0x2001, 0x19c4, 0x2003, 0x0000, 0x0c88, 0x0006,
+	0x0016, 0x0026, 0x2009, 0x1804, 0x2011, 0x0009, 0x080c, 0x287c,
+	0x002e, 0x001e, 0x000e, 0x0005, 0x0016, 0x00c6, 0x0006, 0x080c,
+	0x990b, 0x0106, 0x190c, 0x98ad, 0x2061, 0x0100, 0x61a4, 0x60a7,
+	0x95f5, 0x0016, 0x0026, 0x2009, 0x1804, 0x2011, 0x0008, 0x080c,
+	0x287c, 0x002e, 0x001e, 0x010e, 0x190c, 0x98c9, 0x000e, 0xa001,
+	0xa001, 0xa001, 0x61a6, 0x00ce, 0x001e, 0x0005, 0x00c6, 0x00d6,
+	0x0016, 0x0026, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c, 0x70ac,
+	0x1510, 0x2001, 0x19dd, 0x2004, 0x9005, 0x1904, 0x901d, 0x080c,
+	0x714d, 0x11a8, 0x2069, 0x0380, 0x6843, 0x0101, 0x6844, 0xd084,
+	0x1de8, 0x2061, 0x0100, 0x6020, 0xd0b4, 0x1120, 0x6024, 0xd084,
+	0x090c, 0x0d65, 0x6843, 0x0100, 0x080c, 0x81da, 0x04b0, 0x00c6,
+	0x2061, 0x19b8, 0x00f0, 0x6904, 0x9194, 0x4000, 0x0598, 0x080c,
+	0x8f9c, 0x080c, 0x2843, 0x00c6, 0x2061, 0x19b8, 0x6134, 0x9192,
+	0x0008, 0x1278, 0x8108, 0x6136, 0x080c, 0x98ad, 0x6130, 0x080c,
+	0x98c9, 0x00ce, 0x81ff, 0x01c8, 0x080c, 0x81da, 0x080c, 0x8f8f,
+	0x00a0, 0x080c, 0x98ad, 0x6130, 0x91e5, 0x0000, 0x0150, 0x080c,
+	0xd5ee, 0x080c, 0x81e3, 0x6003, 0x0001, 0x2009, 0x0014, 0x080c,
+	0x9c6a, 0x080c, 0x98c9, 0x00ce, 0x0000, 0x002e, 0x001e, 0x00de,
+	0x00ce, 0x0005, 0x2001, 0x19dd, 0x2004, 0x9005, 0x1db0, 0x00c6,
+	0x2061, 0x19b8, 0x6134, 0x9192, 0x0003, 0x1ad8, 0x8108, 0x6136,
+	0x00ce, 0x080c, 0x81da, 0x080c, 0x5b90, 0x2009, 0x1852, 0x2114,
+	0x8210, 0x220a, 0x0c10, 0x0096, 0x00c6, 0x00d6, 0x00e6, 0x0016,
+	0x0026, 0x080c, 0x81f0, 0x080c, 0x98ad, 0x2001, 0x0387, 0x2003,
+	0x0202, 0x2071, 0x19b8, 0x714c, 0x81ff, 0x0904, 0x90b1, 0x2061,
+	0x0100, 0x2069, 0x0140, 0x080c, 0x70ac, 0x11c0, 0x0036, 0x2019,
+	0x0002, 0x080c, 0x926b, 0x003e, 0x714c, 0x2160, 0x080c, 0xd5ee,
+	0x2009, 0x004a, 0x6003, 0x0003, 0x080c, 0x9c6a, 0x2001, 0x0386,
+	0x2003, 0x5040, 0x080c, 0x714d, 0x0804, 0x90b1, 0x6904, 0xd1f4,
+	0x0904, 0x90be, 0x080c, 0x2843, 0x00c6, 0x704c, 0x9065, 0x090c,
+	0x0d65, 0x6020, 0x00ce, 0x9086, 0x0006, 0x1518, 0x61c8, 0x60c4,
+	0x9105, 0x11f8, 0x2009, 0x180c, 0x2104, 0xd0d4, 0x01d0, 0x6214,
+	0x9294, 0x1800, 0x1128, 0x6224, 0x9294, 0x0002, 0x1510, 0x0010,
+	0xc0d4, 0x200a, 0x6014, 0x9084, 0xe7fd, 0x9085, 0x0010, 0x6016,
+	0x704c, 0x2060, 0x080c, 0x88a9, 0x2009, 0x0049, 0x080c, 0x9c6a,
+	0x0080, 0x0036, 0x2019, 0x0001, 0x080c, 0x926b, 0x003e, 0x714c,
+	0x2160, 0x080c, 0xd5ee, 0x2009, 0x004a, 0x6003, 0x0003, 0x080c,
+	0x9c6a, 0x2001, 0x0387, 0x2003, 0x0200, 0x080c, 0x98c9, 0x002e,
+	0x001e, 0x00ee, 0x00de, 0x00ce, 0x009e, 0x0005, 0xd1ec, 0x1904,
+	0x9072, 0x0804, 0x9074, 0x0026, 0x00e6, 0x2071, 0x19b8, 0x706c,
+	0xd084, 0x01d0, 0xc084, 0x706e, 0x714c, 0x81ff, 0x01a8, 0x2071,
+	0x0100, 0x9188, 0x0008, 0x2114, 0x928e, 0x0006, 0x1138, 0x2009,
+	0x1984, 0x2011, 0x0012, 0x080c, 0x287c, 0x0030, 0x2009, 0x1984,
+	0x2011, 0x0016, 0x080c, 0x287c, 0x00ee, 0x002e, 0x0005, 0x9036,
+	0x2001, 0x19c2, 0x2004, 0x9005, 0x0128, 0x9c06, 0x0128, 0x2c30,
+	0x600c, 0x0cc8, 0x9085, 0x0001, 0x0005, 0x00f6, 0x2079, 0x19b8,
+	0x610c, 0x9006, 0x600e, 0x6044, 0xc0fc, 0x6046, 0x86ff, 0x1140,
+	0x7824, 0x9c06, 0x1118, 0x7826, 0x782a, 0x0050, 0x792a, 0x0040,
+	0x00c6, 0x2660, 0x610e, 0x00ce, 0x7824, 0x9c06, 0x1108, 0x7e26,
+	0x080c, 0x935d, 0x080c, 0xba1b, 0x00fe, 0x0005, 0x080c, 0x8cf8,
+	0x7003, 0x1200, 0x7838, 0x7012, 0x783c, 0x7016, 0x00c6, 0x7820,
+	0x9086, 0x0004, 0x1148, 0x7810, 0x9005, 0x0130, 0x00b6, 0x2058,
+	0xb810, 0xb914, 0x00be, 0x0020, 0x2061, 0x1800, 0x6078, 0x617c,
+	0x9084, 0x00ff, 0x700a, 0x710e, 0x00ce, 0x60c3, 0x002c, 0x0804,
+	0x8f6c, 0x080c, 0x8cf8, 0x7003, 0x0f00, 0x7808, 0xd09c, 0x0128,
+	0xb810, 0x9084, 0x00ff, 0x700a, 0xb814, 0x700e, 0x60c3, 0x0008,
+	0x0804, 0x8f6c, 0x0156, 0x080c, 0x8d43, 0x7003, 0x0200, 0x2011,
+	0x1848, 0x63f0, 0x2312, 0x20a9, 0x0006, 0x2011, 0x1840, 0x2019,
+	0x1841, 0x9ef0, 0x0002, 0x2376, 0x8e70, 0x2276, 0x8e70, 0x9398,
+	0x0002, 0x9290, 0x0002, 0x1f04, 0x915b, 0x60c3, 0x001c, 0x015e,
+	0x0804, 0x8f6c, 0x0016, 0x0026, 0x080c, 0x8d1f, 0x080c, 0x8d31,
+	0x9e80, 0x0004, 0x20e9, 0x0000, 0x20a0, 0x7814, 0x0096, 0x2048,
+	0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098,
+	0x009e, 0x7808, 0x9088, 0x0002, 0x21a8, 0x9192, 0x0010, 0x1250,
+	0x4003, 0x9080, 0x0004, 0x8003, 0x60c2, 0x080c, 0x8f6c, 0x002e,
+	0x001e, 0x0005, 0x20a9, 0x0010, 0x4003, 0x080c, 0x97ca, 0x20a1,
+	0x0240, 0x22a8, 0x4003, 0x0c68, 0x080c, 0x8cf8, 0x7003, 0x6200,
+	0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0x8f6c, 0x0016, 0x0026,
+	0x080c, 0x8cf8, 0x20e9, 0x0000, 0x20a1, 0x024c, 0x7814, 0x0096,
+	0x2048, 0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0023,
+	0x2098, 0x009e, 0x7808, 0x9088, 0x0002, 0x21a8, 0x4003, 0x8003,
+	0x60c2, 0x080c, 0x8f6c, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00c6,
+	0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b8, 0x7010, 0x2060,
+	0x8cff, 0x0188, 0x080c, 0xba41, 0x1110, 0x080c, 0xa574, 0x600c,
+	0x0006, 0x080c, 0xbcb8, 0x600f, 0x0000, 0x080c, 0x9bcc, 0x080c,
+	0x935d, 0x00ce, 0x0c68, 0x2c00, 0x7012, 0x700e, 0x012e, 0x000e,
+	0x00ce, 0x00ee, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6,
+	0x00c6, 0x0066, 0x0026, 0x0016, 0x0006, 0x2091, 0x8000, 0x2001,
+	0x180c, 0x200c, 0x918c, 0xe7ff, 0x2102, 0x2069, 0x0100, 0x2079,
+	0x0140, 0x2071, 0x19b8, 0x7030, 0x2060, 0x8cff, 0x0548, 0x080c,
+	0x8f9c, 0x6ac0, 0x68c3, 0x0000, 0x080c, 0x81e3, 0x00c6, 0x2061,
+	0x0100, 0x080c, 0x97e3, 0x00ce, 0x20a9, 0x01f4, 0x04b1, 0x080c,
+	0x884c, 0x6044, 0xd0ac, 0x1128, 0x2001, 0x1959, 0x2004, 0x604a,
+	0x0020, 0x2009, 0x0013, 0x080c, 0x9c6a, 0x000e, 0x001e, 0x002e,
+	0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005,
+	0x2001, 0x1800, 0x2004, 0x9096, 0x0001, 0x0d78, 0x9096, 0x0004,
+	0x0d60, 0x080c, 0x81e3, 0x6814, 0x9084, 0x0001, 0x0110, 0x68a7,
+	0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x5b3a, 0x080c,
+	0x8131, 0x20a9, 0x01f4, 0x0009, 0x08c0, 0x6824, 0xd094, 0x0140,
+	0x6827, 0x0004, 0x7804, 0x9084, 0x4000, 0x190c, 0x2843, 0x0090,
+	0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, 0x924d, 0x7804,
+	0x9084, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2833, 0x9006,
+	0x080c, 0x2833, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6,
+	0x00c6, 0x0066, 0x0026, 0x0016, 0x0006, 0x2091, 0x8000, 0x2001,
+	0x180c, 0x200c, 0x918c, 0xdbff, 0x2102, 0x2069, 0x0100, 0x2079,
+	0x0140, 0x2071, 0x0380, 0x701c, 0x0006, 0x701f, 0x0202, 0x2071,
+	0x19b8, 0x704c, 0x2060, 0x8cff, 0x0904, 0x930c, 0x9386, 0x0002,
+	0x1128, 0x6814, 0x9084, 0x0002, 0x0904, 0x930c, 0x68af, 0x95f5,
+	0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, 0x1df0, 0x69c6, 0x68cb,
+	0x0008, 0x080c, 0x81f0, 0x080c, 0x1c7a, 0x0046, 0x2009, 0x00a5,
+	0x080c, 0x0e3d, 0x2021, 0x0169, 0x2404, 0x9084, 0x000f, 0x9086,
+	0x0004, 0x11f8, 0x68af, 0x95f5, 0x68c6, 0x68cb, 0x0008, 0x00e6,
+	0x00f6, 0x2079, 0x0090, 0x2071, 0x19b8, 0x6814, 0x9084, 0x1984,
+	0x9085, 0x0012, 0x6816, 0x782b, 0x0008, 0x7057, 0x0000, 0x00fe,
+	0x00ee, 0x9386, 0x0002, 0x1128, 0x7884, 0x9005, 0x1110, 0x7887,
+	0x0001, 0x0016, 0x2009, 0x0040, 0x080c, 0x2052, 0x001e, 0x2009,
+	0x0000, 0x080c, 0x0e3d, 0x004e, 0x20a9, 0x03e8, 0x6824, 0xd094,
+	0x0140, 0x6827, 0x0004, 0x7804, 0x9084, 0x4000, 0x190c, 0x2843,
+	0x0090, 0xd08c, 0x0118, 0x6827, 0x0002, 0x0010, 0x1f04, 0x92de,
+	0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2833,
+	0x9006, 0x080c, 0x2833, 0x6827, 0x4000, 0x6824, 0x83ff, 0x1160,
+	0x2009, 0x0049, 0x080c, 0x88a9, 0x6044, 0xd0ac, 0x1118, 0x6003,
+	0x0002, 0x0010, 0x080c, 0x9c6a, 0x000e, 0x2071, 0x0380, 0xd08c,
+	0x1110, 0x701f, 0x0200, 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce,
+	0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x00d6, 0x0126,
+	0x2091, 0x8000, 0x2069, 0x19b8, 0x6a06, 0x012e, 0x00de, 0x0005,
+	0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0x19b8, 0x6a3e, 0x012e,
+	0x00de, 0x0005, 0x080c, 0x8e46, 0x785c, 0x7032, 0x7042, 0x7047,
+	0x1000, 0x00f8, 0x080c, 0x8e46, 0x785c, 0x7032, 0x7042, 0x7047,
+	0x4000, 0x00b8, 0x080c, 0x8e46, 0x785c, 0x7032, 0x7042, 0x7047,
+	0x2000, 0x0078, 0x080c, 0x8e46, 0x785c, 0x7032, 0x7042, 0x7047,
+	0x0400, 0x0038, 0x080c, 0x8e46, 0x785c, 0x7032, 0x7042, 0x7047,
+	0x0200, 0x60c3, 0x0020, 0x0804, 0x8f6c, 0x00e6, 0x2071, 0x19b8,
+	0x702c, 0x9005, 0x0110, 0x8001, 0x702e, 0x00ee, 0x0005, 0x00f6,
+	0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, 0x0126, 0x2091,
+	0x8000, 0x2071, 0x19b8, 0x7620, 0x2660, 0x2678, 0x2039, 0x0001,
+	0x87ff, 0x0904, 0x9402, 0x8cff, 0x0904, 0x9402, 0x6020, 0x9086,
+	0x0006, 0x1904, 0x93fd, 0x88ff, 0x0138, 0x2800, 0x9c06, 0x1904,
+	0x93fd, 0x2039, 0x0000, 0x0050, 0x6010, 0x9b06, 0x1904, 0x93fd,
+	0x85ff, 0x0120, 0x605c, 0x9106, 0x1904, 0x93fd, 0x7030, 0x9c06,
+	0x15b0, 0x2069, 0x0100, 0x68c0, 0x9005, 0x1160, 0x6824, 0xd084,
+	0x0148, 0x6827, 0x0001, 0x080c, 0x81e3, 0x080c, 0x9487, 0x7033,
+	0x0000, 0x0428, 0x080c, 0x81e3, 0x6820, 0xd0b4, 0x0110, 0x68a7,
+	0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x080c, 0x9487, 0x7033,
+	0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138,
+	0x2001, 0x0100, 0x080c, 0x2833, 0x9006, 0x080c, 0x2833, 0x2069,
+	0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x7020,
+	0x9c36, 0x1110, 0x660c, 0x7622, 0x701c, 0x9c36, 0x1140, 0x2c00,
+	0x9f36, 0x0118, 0x2f00, 0x701e, 0x0010, 0x701f, 0x0000, 0x660c,
+	0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x89ff,
+	0x1168, 0x600f, 0x0000, 0x6014, 0x0096, 0x2048, 0x080c, 0xb82a,
+	0x0110, 0x080c, 0xd1fc, 0x009e, 0x080c, 0x9c06, 0x080c, 0x935d,
+	0x88ff, 0x1190, 0x00ce, 0x0804, 0x9378, 0x2c78, 0x600c, 0x2060,
+	0x0804, 0x9378, 0x9006, 0x012e, 0x000e, 0x006e, 0x007e, 0x00ce,
+	0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x98c5,
+	0x0001, 0x0c88, 0x00f6, 0x00e6, 0x00d6, 0x0096, 0x00c6, 0x0066,
+	0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b8, 0x7648,
+	0x2660, 0x2678, 0x8cff, 0x0904, 0x9476, 0x6020, 0x9086, 0x0006,
+	0x1904, 0x9471, 0x87ff, 0x0128, 0x2700, 0x9c06, 0x1904, 0x9471,
+	0x0040, 0x6010, 0x9b06, 0x15e8, 0x85ff, 0x0118, 0x605c, 0x9106,
+	0x15c0, 0x704c, 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001, 0x080c,
+	0x926b, 0x703f, 0x0000, 0x9006, 0x704e, 0x706a, 0x7052, 0x706e,
+	0x003e, 0x7048, 0x9c36, 0x1110, 0x660c, 0x764a, 0x7044, 0x9c36,
+	0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7046, 0x0010, 0x7047,
+	0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008,
+	0x2678, 0x600f, 0x0000, 0x6014, 0x2048, 0x080c, 0xb82a, 0x0110,
+	0x080c, 0xd1fc, 0x080c, 0x9c06, 0x87ff, 0x1198, 0x00ce, 0x0804,
+	0x9422, 0x2c78, 0x600c, 0x2060, 0x0804, 0x9422, 0x9006, 0x012e,
+	0x000e, 0x002e, 0x006e, 0x00ce, 0x009e, 0x00de, 0x00ee, 0x00fe,
+	0x0005, 0x601b, 0x0000, 0x00ce, 0x97bd, 0x0001, 0x0c80, 0x00e6,
+	0x2071, 0x19b8, 0x7033, 0x0000, 0x7004, 0x9086, 0x0003, 0x0158,
+	0x2001, 0x1800, 0x2004, 0x9086, 0x0002, 0x1118, 0x7007, 0x0005,
+	0x0010, 0x7007, 0x0000, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x00c6,
+	0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b8,
+	0x2c10, 0x7648, 0x2660, 0x2678, 0x8cff, 0x0518, 0x2200, 0x9c06,
+	0x11e0, 0x7048, 0x9c36, 0x1110, 0x660c, 0x764a, 0x7044, 0x9c36,
+	0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7046, 0x0010, 0x7047,
+	0x0000, 0x660c, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678,
+	0x600f, 0x0000, 0x9085, 0x0001, 0x0020, 0x2c78, 0x600c, 0x2060,
+	0x08d8, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00ee, 0x00fe,
+	0x0005, 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026,
+	0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b8, 0x7610, 0x2660,
+	0x2678, 0x8cff, 0x0904, 0x9569, 0x6010, 0x00b6, 0x2058, 0xb8a0,
+	0x00be, 0x9206, 0x1904, 0x9564, 0x7030, 0x9c06, 0x1520, 0x2069,
+	0x0100, 0x68c0, 0x9005, 0x0904, 0x9540, 0x080c, 0x8f9c, 0x68c3,
+	0x0000, 0x080c, 0x9487, 0x7033, 0x0000, 0x0036, 0x2069, 0x0140,
+	0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2833,
+	0x9006, 0x080c, 0x2833, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110,
+	0x6827, 0x0001, 0x003e, 0x7010, 0x9c36, 0x1110, 0x660c, 0x7612,
+	0x700c, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x700e,
+	0x0010, 0x700f, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110,
+	0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xba30, 0x1158,
+	0x080c, 0x3034, 0x080c, 0xba41, 0x11f0, 0x080c, 0xa574, 0x00d8,
+	0x080c, 0x9487, 0x08c0, 0x080c, 0xba41, 0x1118, 0x080c, 0xa574,
+	0x0090, 0x6014, 0x2048, 0x080c, 0xb82a, 0x0168, 0x6020, 0x9086,
+	0x0003, 0x1508, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c,
+	0x6983, 0x080c, 0xba1b, 0x080c, 0xbcb8, 0x080c, 0x9c06, 0x080c,
+	0x935d, 0x00ce, 0x0804, 0x94e9, 0x2c78, 0x600c, 0x2060, 0x0804,
+	0x94e9, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee,
+	0x00fe, 0x009e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1d20, 0x080c,
+	0xd1fc, 0x0c08, 0x00d6, 0x080c, 0x8d43, 0x7003, 0x0200, 0x7007,
+	0x0014, 0x60c3, 0x0014, 0x20e1, 0x0001, 0x2099, 0x195a, 0x20e9,
+	0x0000, 0x20a1, 0x0250, 0x20a9, 0x0004, 0x4003, 0x7023, 0x0004,
+	0x7027, 0x7878, 0x080c, 0x8f6c, 0x00de, 0x0005, 0x080c, 0x8d43,
+	0x700b, 0x0800, 0x7814, 0x9084, 0xff00, 0x700e, 0x7814, 0x9084,
+	0x00ff, 0x7022, 0x782c, 0x7026, 0x7860, 0x9084, 0x00ff, 0x9085,
+	0x0200, 0x7002, 0x7860, 0x9084, 0xff00, 0x8007, 0x7006, 0x60c2,
+	0x0804, 0x8f6c, 0x00b6, 0x00d6, 0x0016, 0x00d6, 0x2f68, 0x2009,
+	0x0035, 0x080c, 0xbebe, 0x00de, 0x1904, 0x9617, 0x080c, 0x8cf8,
+	0x7003, 0x1300, 0x782c, 0x080c, 0x9722, 0x2068, 0x6820, 0x9086,
+	0x0003, 0x0560, 0x7810, 0x2058, 0xbaa0, 0x080c, 0x9b4b, 0x11d8,
+	0x9286, 0x007e, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, 0x0498,
+	0x9286, 0x007f, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffd, 0x0458,
+	0x9284, 0xff80, 0x0180, 0x9286, 0x0080, 0x1128, 0x700b, 0x00ff,
+	0x700f, 0xfffc, 0x0400, 0x92d8, 0x1000, 0x2b5c, 0xb810, 0x700a,
+	0xb814, 0x700e, 0x00c0, 0xb884, 0x700e, 0x00a8, 0x080c, 0x9b4b,
+	0x1130, 0x7810, 0x2058, 0xb8a0, 0x9082, 0x007e, 0x0250, 0x00d6,
+	0x2069, 0x181e, 0x2d04, 0x700a, 0x8d68, 0x2d04, 0x700e, 0x00de,
+	0x0010, 0x6034, 0x700e, 0x7838, 0x7012, 0x783c, 0x7016, 0x60c3,
+	0x000c, 0x001e, 0x00de, 0x080c, 0x8f6c, 0x00be, 0x0005, 0x781b,
+	0x0001, 0x7803, 0x0006, 0x001e, 0x00de, 0x00be, 0x0005, 0x792c,
+	0x9180, 0x0008, 0x200c, 0x9186, 0x0006, 0x01c0, 0x9186, 0x0003,
+	0x0904, 0x9695, 0x9186, 0x0005, 0x0904, 0x967d, 0x9186, 0x0004,
+	0x05f0, 0x9186, 0x0008, 0x0904, 0x9686, 0x7807, 0x0037, 0x782f,
+	0x0003, 0x7817, 0x1700, 0x080c, 0x96ff, 0x0005, 0x080c, 0x96c0,
+	0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x6800, 0x6a44,
+	0xd2fc, 0x11f8, 0x0002, 0x965e, 0x9669, 0x9660, 0x9669, 0x9665,
+	0x965e, 0x965e, 0x9669, 0x9669, 0x9669, 0x9669, 0x965e, 0x965e,
+	0x965e, 0x965e, 0x965e, 0x9669, 0x965e, 0x9669, 0x080c, 0x0d65,
+	0x6824, 0xd0e4, 0x0110, 0xd0cc, 0x0110, 0x900e, 0x0010, 0x2009,
+	0x2000, 0x682c, 0x7022, 0x6830, 0x7026, 0x0804, 0x96b9, 0x080c,
+	0x96c0, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x6a00,
+	0x9286, 0x0002, 0x1108, 0x900e, 0x04e0, 0x080c, 0x96c0, 0x00d6,
+	0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x0498, 0x04c9, 0x00d6,
+	0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x9286, 0x0005, 0x0118,
+	0x9286, 0x0002, 0x1108, 0x900e, 0x0420, 0x0451, 0x00d6, 0x0026,
+	0x792c, 0x2168, 0x6814, 0x0096, 0x2048, 0xa9ac, 0xa834, 0x9112,
+	0xa9b0, 0xa838, 0x009e, 0x9103, 0x7022, 0x7226, 0x792c, 0x9180,
+	0x0011, 0x2004, 0xd0fc, 0x1148, 0x9180, 0x0000, 0x2004, 0x908e,
+	0x0002, 0x0130, 0x908e, 0x0004, 0x0118, 0x2009, 0x4000, 0x0008,
+	0x900e, 0x712a, 0x60c3, 0x0018, 0x002e, 0x00de, 0x0804, 0x8f6c,
+	0x00b6, 0x0036, 0x0046, 0x0056, 0x0066, 0x080c, 0x8d43, 0x9006,
+	0x7003, 0x0200, 0x7938, 0x710a, 0x793c, 0x710e, 0x7810, 0x2058,
+	0xb8a0, 0x080c, 0x9b4b, 0x1118, 0x9092, 0x007e, 0x0268, 0x00d6,
+	0x2069, 0x181e, 0x2d2c, 0x8d68, 0x2d34, 0x90d8, 0x1000, 0x2b5c,
+	0xbb10, 0xbc14, 0x00de, 0x0028, 0x901e, 0xbc84, 0x2029, 0x0000,
+	0x6634, 0x782c, 0x9080, 0x0008, 0x2004, 0x9086, 0x0003, 0x1128,
+	0x7512, 0x7616, 0x731a, 0x741e, 0x0020, 0x7312, 0x7416, 0x751a,
+	0x761e, 0x006e, 0x005e, 0x004e, 0x003e, 0x00be, 0x0005, 0x080c,
+	0x8d43, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, 0x700e, 0x700e,
+	0x60c3, 0x0008, 0x0804, 0x8f6c, 0x080c, 0x8cef, 0x7003, 0x1400,
+	0x7838, 0x700a, 0x0079, 0x783c, 0x700e, 0x782c, 0x7012, 0x7830,
+	0x7016, 0x7834, 0x9084, 0x00ff, 0x8007, 0x701a, 0x60c3, 0x0010,
+	0x0804, 0x8f6c, 0x00e6, 0x2071, 0x0240, 0x0006, 0x00f6, 0x2078,
+	0x7810, 0x00b6, 0x2058, 0xb8c4, 0xd084, 0x0120, 0x7850, 0x702a,
+	0x784c, 0x702e, 0x00be, 0x00fe, 0x000e, 0x00ee, 0x0005, 0x080c,
+	0x8d3a, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, 0x700e, 0x60c3,
+	0x0008, 0x0804, 0x8f6c, 0x00a9, 0x7914, 0x712a, 0x60c3, 0x0000,
+	0x60a7, 0x9575, 0x0026, 0x080c, 0x27a2, 0x0228, 0x2011, 0x0101,
+	0x2204, 0xc0c5, 0x2012, 0x002e, 0x080c, 0x8f8f, 0x080c, 0x81da,
+	0x0005, 0x0036, 0x0096, 0x00d6, 0x00e6, 0x7860, 0x2048, 0xaa7c,
+	0x9296, 0x00c0, 0x9294, 0xfffd, 0xaa7e, 0xaa80, 0x9294, 0x0300,
+	0xaa82, 0xa96c, 0x9194, 0x00ff, 0xab74, 0x9384, 0x00ff, 0x908d,
+	0xc200, 0xa96e, 0x9384, 0xff00, 0x9215, 0xaa76, 0xa870, 0xaa78,
+	0xa87a, 0xaa72, 0x00d6, 0x2069, 0x0200, 0x080c, 0x97df, 0x00de,
+	0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000a, 0xa860, 0x20e0,
+	0xa85c, 0x9080, 0x001b, 0x2098, 0x4003, 0x60a3, 0x0035, 0xaa68,
+	0x9294, 0x7000, 0x9286, 0x3000, 0x0110, 0x60a3, 0x0037, 0x00ee,
+	0x00de, 0x009e, 0x003e, 0x0005, 0x900e, 0x7814, 0x0096, 0x2048,
+	0xa87c, 0xd0fc, 0x01c0, 0x9084, 0x0003, 0x11a8, 0x2001, 0x180c,
+	0x2004, 0xd0bc, 0x0180, 0x7824, 0xd0cc, 0x1168, 0xd0c4, 0x1158,
+	0xa8a8, 0x9005, 0x1140, 0x2001, 0x180c, 0x200c, 0xc1d5, 0x2102,
+	0x2009, 0x1983, 0x210c, 0x009e, 0x918d, 0x0092, 0x0010, 0x2009,
+	0x0096, 0x60ab, 0x0036, 0x0026, 0x2110, 0x900e, 0x080c, 0x287c,
+	0x002e, 0x0005, 0x2009, 0x0009, 0x00a0, 0x2009, 0x000a, 0x0088,
+	0x2009, 0x000b, 0x0070, 0x2009, 0x000c, 0x0058, 0x2009, 0x000d,
+	0x0040, 0x2009, 0x000e, 0x0028, 0x2009, 0x000f, 0x0010, 0x2009,
+	0x0008, 0x6912, 0x0005, 0x00d6, 0x9290, 0x0018, 0x8214, 0x20e9,
+	0x0000, 0x2069, 0x0200, 0x6813, 0x0000, 0x22a8, 0x9284, 0x00e0,
+	0x0128, 0x20a9, 0x0020, 0x9292, 0x0020, 0x0008, 0x9016, 0x20a1,
+	0x0240, 0x9006, 0x4004, 0x82ff, 0x0120, 0x6810, 0x8000, 0x6812,
+	0x0c60, 0x00de, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x00a6,
+	0x0096, 0x0066, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b8, 0x7610,
+	0x2660, 0x2678, 0x8cff, 0x0904, 0x988a, 0x7030, 0x9c06, 0x1520,
+	0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x9861, 0x080c, 0x8f9c,
+	0x68c3, 0x0000, 0x080c, 0x9487, 0x7033, 0x0000, 0x0036, 0x2069,
 	0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c,
-	0x27f1, 0x9006, 0x080c, 0x27f1, 0x2069, 0x0100, 0x6824, 0xd084,
+	0x2833, 0x9006, 0x080c, 0x2833, 0x2069, 0x0100, 0x6824, 0xd084,
 	0x0110, 0x6827, 0x0001, 0x003e, 0x7010, 0x9c36, 0x1110, 0x660c,
 	0x7612, 0x700c, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00,
 	0x700e, 0x0010, 0x700f, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06,
-	0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xb8c2,
-	0x1158, 0x080c, 0x2ff2, 0x080c, 0xb8d3, 0x11f0, 0x080c, 0xa40d,
-	0x00d8, 0x080c, 0x9320, 0x08c0, 0x080c, 0xb8d3, 0x1118, 0x080c,
-	0xa40d, 0x0090, 0x6014, 0x2048, 0x080c, 0xb6c3, 0x0168, 0x6020,
-	0x9086, 0x0003, 0x1508, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000,
-	0x080c, 0x6833, 0x080c, 0xb8ad, 0x080c, 0xbb4a, 0x080c, 0x9a9f,
-	0x080c, 0x91f6, 0x00ce, 0x0804, 0x9382, 0x2c78, 0x600c, 0x2060,
-	0x0804, 0x9382, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00de,
-	0x00ee, 0x00fe, 0x009e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1d20,
-	0x080c, 0xd079, 0x0c08, 0x00d6, 0x080c, 0x8bc8, 0x7003, 0x0200,
-	0x7007, 0x0014, 0x60c3, 0x0014, 0x20e1, 0x0001, 0x2099, 0x1958,
-	0x20e9, 0x0000, 0x20a1, 0x0250, 0x20a9, 0x0004, 0x4003, 0x7023,
-	0x0004, 0x7027, 0x7878, 0x080c, 0x8df1, 0x00de, 0x0005, 0x080c,
-	0x8bc8, 0x700b, 0x0800, 0x7814, 0x9084, 0xff00, 0x700e, 0x7814,
-	0x9084, 0x00ff, 0x7022, 0x782c, 0x7026, 0x7860, 0x9084, 0x00ff,
-	0x9085, 0x0200, 0x7002, 0x7860, 0x9084, 0xff00, 0x8007, 0x7006,
-	0x60c2, 0x0804, 0x8df1, 0x00b6, 0x00d6, 0x0016, 0x00d6, 0x2f68,
-	0x2009, 0x0035, 0x080c, 0xbd4f, 0x00de, 0x1904, 0x94b0, 0x080c,
-	0x8b7d, 0x7003, 0x1300, 0x782c, 0x080c, 0x95bb, 0x2068, 0x6820,
-	0x9086, 0x0003, 0x0560, 0x7810, 0x2058, 0xbaa0, 0x080c, 0x99e4,
-	0x11d8, 0x9286, 0x007e, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe,
-	0x0498, 0x9286, 0x007f, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffd,
-	0x0458, 0x9284, 0xff80, 0x0180, 0x9286, 0x0080, 0x1128, 0x700b,
-	0x00ff, 0x700f, 0xfffc, 0x0400, 0x92d8, 0x1000, 0x2b5c, 0xb810,
-	0x700a, 0xb814, 0x700e, 0x00c0, 0xb884, 0x700e, 0x00a8, 0x080c,
-	0x99e4, 0x1130, 0x7810, 0x2058, 0xb8a0, 0x9082, 0x007e, 0x0250,
-	0x00d6, 0x2069, 0x181e, 0x2d04, 0x700a, 0x8d68, 0x2d04, 0x700e,
-	0x00de, 0x0010, 0x6034, 0x700e, 0x7838, 0x7012, 0x783c, 0x7016,
-	0x60c3, 0x000c, 0x001e, 0x00de, 0x080c, 0x8df1, 0x00be, 0x0005,
-	0x781b, 0x0001, 0x7803, 0x0006, 0x001e, 0x00de, 0x00be, 0x0005,
-	0x792c, 0x9180, 0x0008, 0x200c, 0x9186, 0x0006, 0x01c0, 0x9186,
-	0x0003, 0x0904, 0x952e, 0x9186, 0x0005, 0x0904, 0x9516, 0x9186,
-	0x0004, 0x05f0, 0x9186, 0x0008, 0x0904, 0x951f, 0x7807, 0x0037,
-	0x782f, 0x0003, 0x7817, 0x1700, 0x080c, 0x9598, 0x0005, 0x080c,
-	0x9559, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x6800,
-	0x6a44, 0xd2fc, 0x11f8, 0x0002, 0x94f7, 0x9502, 0x94f9, 0x9502,
-	0x94fe, 0x94f7, 0x94f7, 0x9502, 0x9502, 0x9502, 0x9502, 0x94f7,
-	0x94f7, 0x94f7, 0x94f7, 0x94f7, 0x9502, 0x94f7, 0x9502, 0x080c,
-	0x0d65, 0x6824, 0xd0e4, 0x0110, 0xd0cc, 0x0110, 0x900e, 0x0010,
-	0x2009, 0x2000, 0x682c, 0x7022, 0x6830, 0x7026, 0x0804, 0x9552,
-	0x080c, 0x9559, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000,
-	0x6a00, 0x9286, 0x0002, 0x1108, 0x900e, 0x04e0, 0x080c, 0x9559,
-	0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x0498, 0x04c9,
-	0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x9286, 0x0005,
-	0x0118, 0x9286, 0x0002, 0x1108, 0x900e, 0x0420, 0x0451, 0x00d6,
-	0x0026, 0x792c, 0x2168, 0x6814, 0x0096, 0x2048, 0xa9ac, 0xa834,
-	0x9112, 0xa9b0, 0xa838, 0x009e, 0x9103, 0x7022, 0x7226, 0x792c,
-	0x9180, 0x0011, 0x2004, 0xd0fc, 0x1148, 0x9180, 0x0000, 0x2004,
-	0x908e, 0x0002, 0x0130, 0x908e, 0x0004, 0x0118, 0x2009, 0x4000,
-	0x0008, 0x900e, 0x712a, 0x60c3, 0x0018, 0x002e, 0x00de, 0x0804,
-	0x8df1, 0x00b6, 0x0036, 0x0046, 0x0056, 0x0066, 0x080c, 0x8bc8,
-	0x9006, 0x7003, 0x0200, 0x7938, 0x710a, 0x793c, 0x710e, 0x7810,
-	0x2058, 0xb8a0, 0x080c, 0x99e4, 0x1118, 0x9092, 0x007e, 0x0268,
-	0x00d6, 0x2069, 0x181e, 0x2d2c, 0x8d68, 0x2d34, 0x90d8, 0x1000,
-	0x2b5c, 0xbb10, 0xbc14, 0x00de, 0x0028, 0x901e, 0xbc84, 0x2029,
-	0x0000, 0x6634, 0x782c, 0x9080, 0x0008, 0x2004, 0x9086, 0x0003,
-	0x1128, 0x7512, 0x7616, 0x731a, 0x741e, 0x0020, 0x7312, 0x7416,
-	0x751a, 0x761e, 0x006e, 0x005e, 0x004e, 0x003e, 0x00be, 0x0005,
-	0x080c, 0x8bc8, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, 0x700e,
-	0x700e, 0x60c3, 0x0008, 0x0804, 0x8df1, 0x080c, 0x8b74, 0x7003,
-	0x1400, 0x7838, 0x700a, 0x0079, 0x783c, 0x700e, 0x782c, 0x7012,
-	0x7830, 0x7016, 0x7834, 0x9084, 0x00ff, 0x8007, 0x701a, 0x60c3,
-	0x0010, 0x0804, 0x8df1, 0x00e6, 0x2071, 0x0240, 0x0006, 0x00f6,
-	0x2078, 0x7810, 0x00b6, 0x2058, 0xb8c4, 0xd084, 0x0120, 0x7850,
-	0x702a, 0x784c, 0x702e, 0x00be, 0x00fe, 0x000e, 0x00ee, 0x0005,
-	0x080c, 0x8bbf, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, 0x700e,
-	0x60c3, 0x0008, 0x0804, 0x8df1, 0x00a9, 0x7914, 0x712a, 0x60c3,
-	0x0000, 0x60a7, 0x9575, 0x0026, 0x080c, 0x2760, 0x0228, 0x2011,
-	0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x080c, 0x8e14, 0x080c,
-	0x805f, 0x0005, 0x0036, 0x0096, 0x00d6, 0x00e6, 0x7860, 0x2048,
-	0xaa7c, 0x9296, 0x00c0, 0x9294, 0xfffd, 0xaa7e, 0xaa80, 0x9294,
-	0x0300, 0xaa82, 0xa96c, 0x9194, 0x00ff, 0xab74, 0x9384, 0x00ff,
-	0x908d, 0xc200, 0xa96e, 0x9384, 0xff00, 0x9215, 0xaa76, 0xa870,
-	0xaa78, 0xa87a, 0xaa72, 0x00d6, 0x2069, 0x0200, 0x080c, 0x9678,
-	0x00de, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000a, 0xa860,
-	0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x4003, 0x60a3, 0x0035,
-	0xaa68, 0x9294, 0x7000, 0x9286, 0x3000, 0x0110, 0x60a3, 0x0037,
-	0x00ee, 0x00de, 0x009e, 0x003e, 0x0005, 0x900e, 0x7814, 0x0096,
-	0x2048, 0xa87c, 0xd0fc, 0x01c0, 0x9084, 0x0003, 0x11a8, 0x2001,
-	0x180c, 0x2004, 0xd0bc, 0x0180, 0x7824, 0xd0cc, 0x1168, 0xd0c4,
-	0x1158, 0xa8a8, 0x9005, 0x1140, 0x2001, 0x180c, 0x200c, 0xc1d5,
-	0x2102, 0x2009, 0x1981, 0x210c, 0x009e, 0x918d, 0x0092, 0x0010,
-	0x2009, 0x0096, 0x60ab, 0x0036, 0x0026, 0x2110, 0x900e, 0x080c,
-	0x283a, 0x002e, 0x0005, 0x2009, 0x0009, 0x00a0, 0x2009, 0x000a,
-	0x0088, 0x2009, 0x000b, 0x0070, 0x2009, 0x000c, 0x0058, 0x2009,
-	0x000d, 0x0040, 0x2009, 0x000e, 0x0028, 0x2009, 0x000f, 0x0010,
-	0x2009, 0x0008, 0x6912, 0x0005, 0x00d6, 0x9290, 0x0018, 0x8214,
-	0x20e9, 0x0000, 0x2069, 0x0200, 0x6813, 0x0000, 0x22a8, 0x9284,
-	0x00e0, 0x0128, 0x20a9, 0x0020, 0x9292, 0x0020, 0x0008, 0x9016,
-	0x20a1, 0x0240, 0x9006, 0x4004, 0x82ff, 0x0120, 0x6810, 0x8000,
-	0x6812, 0x0c60, 0x00de, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6,
-	0x00a6, 0x0096, 0x0066, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b6,
-	0x7610, 0x2660, 0x2678, 0x8cff, 0x0904, 0x9723, 0x7030, 0x9c06,
-	0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x96fa, 0x080c,
-	0x8e21, 0x68c3, 0x0000, 0x080c, 0x9320, 0x7033, 0x0000, 0x0036,
-	0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100,
-	0x080c, 0x27f1, 0x9006, 0x080c, 0x27f1, 0x2069, 0x0100, 0x6824,
-	0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x7010, 0x9c36, 0x1110,
-	0x660c, 0x7612, 0x700c, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118,
-	0x2f00, 0x700e, 0x0010, 0x700f, 0x0000, 0x660c, 0x0066, 0x2c00,
-	0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c,
-	0xb8c2, 0x1158, 0x080c, 0x2ff2, 0x080c, 0xb8d3, 0x11f0, 0x080c,
-	0xa40d, 0x00d8, 0x080c, 0x9320, 0x08c0, 0x080c, 0xb8d3, 0x1118,
-	0x080c, 0xa40d, 0x0090, 0x6014, 0x2048, 0x080c, 0xb6c3, 0x0168,
-	0x6020, 0x9086, 0x0003, 0x1520, 0xa867, 0x0103, 0xab7a, 0xa877,
-	0x0000, 0x080c, 0x683f, 0x080c, 0xb8ad, 0x080c, 0xbb4a, 0x080c,
-	0x9a9f, 0x080c, 0x91f6, 0x00ce, 0x0804, 0x96ab, 0x2c78, 0x600c,
-	0x2060, 0x0804, 0x96ab, 0x7013, 0x0000, 0x700f, 0x0000, 0x012e,
-	0x006e, 0x009e, 0x00ae, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005,
-	0x6020, 0x9086, 0x0006, 0x1d08, 0x080c, 0xd079, 0x08f0, 0x00f6,
-	0x0036, 0x2079, 0x0380, 0x7b18, 0xd3bc, 0x1de8, 0x7832, 0x7936,
-	0x7a3a, 0x781b, 0x8080, 0x003e, 0x00fe, 0x0005, 0x0016, 0x2001,
-	0x0382, 0x2004, 0x9084, 0x0007, 0x9086, 0x0001, 0x1188, 0x2001,
-	0x0015, 0x0c29, 0x2009, 0x1000, 0x2001, 0x0382, 0x2004, 0x9084,
-	0x0007, 0x9086, 0x0003, 0x0120, 0x8109, 0x1db0, 0x080c, 0x0d65,
-	0x001e, 0x0005, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086,
-	0x0003, 0x1120, 0x2001, 0x0380, 0x2003, 0x0001, 0x0005, 0x0156,
-	0x0016, 0x0026, 0x00e6, 0x900e, 0x2071, 0x19b6, 0x0469, 0x0106,
-	0x0190, 0x7004, 0x9086, 0x0003, 0x0148, 0x20a9, 0x1000, 0x6044,
-	0xd0fc, 0x01d8, 0x1f04, 0x977f, 0x080c, 0x0d65, 0x080c, 0x9746,
-	0x6044, 0xd0fc, 0x0190, 0x7030, 0x9c06, 0x1148, 0x080c, 0x86d1,
-	0x6044, 0xd0dc, 0x0150, 0xc0dc, 0x6046, 0x700a, 0x7042, 0x704c,
-	0x9c06, 0x190c, 0x0d65, 0x080c, 0x872e, 0x010e, 0x1919, 0x00ee,
-	0x002e, 0x001e, 0x015e, 0x0005, 0x2001, 0x0382, 0x2004, 0x9084,
-	0x0007, 0x9086, 0x0003, 0x0005, 0x0126, 0x2091, 0x2400, 0x7808,
-	0xd0a4, 0x190c, 0x0d5e, 0xd09c, 0x0128, 0x7820, 0x908c, 0xf000,
-	0x11b8, 0x0012, 0x012e, 0x0005, 0x97cc, 0x980a, 0x9831, 0x9861,
-	0x9871, 0x9882, 0x9891, 0x989f, 0x98b0, 0x98b4, 0x97cc, 0x97cc,
-	0x97cc, 0x97cc, 0x97cc, 0x97cc, 0x080c, 0x0d65, 0x012e, 0x0005,
-	0x2060, 0x6044, 0xd0bc, 0x0140, 0xc0bc, 0x6046, 0x6000, 0x908a,
-	0x0016, 0x1a0c, 0x0d65, 0x0012, 0x012e, 0x0005, 0x97f1, 0x97f3,
-	0x97f1, 0x97f9, 0x97f1, 0x97f1, 0x97f1, 0x97f1, 0x97f1, 0x97f3,
-	0x97f1, 0x97f3, 0x97f1, 0x97f3, 0x97f1, 0x97f1, 0x97f1, 0x97f3,
-	0x97f1, 0x080c, 0x0d65, 0x2009, 0x0013, 0x080c, 0x9b03, 0x012e,
-	0x0005, 0x6014, 0x2048, 0xa87c, 0xd0dc, 0x0130, 0x080c, 0x821d,
-	0x080c, 0x9a65, 0x012e, 0x0005, 0x2009, 0x0049, 0x080c, 0x9b03,
-	0x012e, 0x0005, 0x080c, 0x9746, 0x2001, 0x19db, 0x2003, 0x0000,
-	0x7030, 0x9065, 0x090c, 0x0d65, 0x7034, 0x9092, 0x00c8, 0x1258,
-	0x8000, 0x7036, 0x7004, 0x9086, 0x0003, 0x0110, 0x7007, 0x0000,
-	0x781f, 0x0808, 0x0040, 0x080c, 0xd43c, 0x6003, 0x0001, 0x2009,
-	0x0014, 0x080c, 0x9b03, 0x781f, 0x0100, 0x080c, 0x9762, 0x012e,
-	0x0005, 0x080c, 0x9746, 0x714c, 0x81ff, 0x1128, 0x2011, 0x19de,
-	0x2013, 0x0000, 0x0400, 0x2061, 0x0100, 0x7150, 0x9192, 0x7530,
-	0x12b8, 0x8108, 0x7152, 0x714c, 0x9188, 0x0008, 0x210c, 0x918e,
-	0x0006, 0x1138, 0x6014, 0x9084, 0x1984, 0x9085, 0x0012, 0x6016,
-	0x0050, 0x6014, 0x9084, 0x1984, 0x9085, 0x0016, 0x6016, 0x0018,
-	0x706c, 0xc085, 0x706e, 0x781f, 0x0200, 0x080c, 0x9762, 0x012e,
-	0x0005, 0x080c, 0x9746, 0x714c, 0x2160, 0x6003, 0x0003, 0x2009,
-	0x004a, 0x080c, 0x9b03, 0x781f, 0x0200, 0x080c, 0x9762, 0x012e,
-	0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x2060, 0x6003, 0x0003,
-	0x080c, 0x9746, 0x080c, 0x1bd5, 0x781f, 0x0400, 0x080c, 0x9762,
-	0x012e, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x2060, 0x080c,
-	0x9746, 0x080c, 0x1c1d, 0x781f, 0x0400, 0x080c, 0x9762, 0x012e,
-	0x0005, 0x7030, 0x9065, 0x0148, 0x6044, 0xc0bc, 0x6046, 0x7104,
-	0x9186, 0x0003, 0x0110, 0x080c, 0x8794, 0x012e, 0x0005, 0x00f6,
-	0x703c, 0x9086, 0x0002, 0x0148, 0x704c, 0x907d, 0x0130, 0x7844,
-	0xc0bc, 0x7846, 0x080c, 0x8d3c, 0x0000, 0x00fe, 0x012e, 0x0005,
-	0x080c, 0x6ffd, 0x012e, 0x0005, 0x080c, 0x0d65, 0x0005, 0x00e6,
-	0x2071, 0x19b6, 0x6044, 0xc0bc, 0x6046, 0xd0fc, 0x01b8, 0x704c,
-	0x9c06, 0x1190, 0x2019, 0x0001, 0x080c, 0x90f0, 0x704f, 0x0000,
-	0x2001, 0x0109, 0x2004, 0xd08c, 0x1138, 0x2001, 0x0108, 0x2004,
-	0xd0bc, 0x1110, 0x703f, 0x0000, 0x080c, 0x9336, 0x00ee, 0x0005,
-	0x0026, 0x7010, 0x9c06, 0x1178, 0x080c, 0x91f6, 0x6044, 0xc0fc,
-	0x6046, 0x600c, 0x9015, 0x0120, 0x7212, 0x600f, 0x0000, 0x0010,
-	0x7212, 0x720e, 0x9006, 0x002e, 0x0005, 0x0026, 0x7020, 0x9c06,
-	0x1178, 0x080c, 0x91f6, 0x6044, 0xc0fc, 0x6046, 0x600c, 0x9015,
-	0x0120, 0x7222, 0x600f, 0x0000, 0x0010, 0x7222, 0x721e, 0x9006,
-	0x002e, 0x0005, 0x00d6, 0x0036, 0x7830, 0x9c06, 0x1558, 0x2069,
-	0x0100, 0x68c0, 0x9005, 0x01f8, 0x080c, 0x8068, 0x080c, 0x8e21,
-	0x68c3, 0x0000, 0x080c, 0x9320, 0x2069, 0x0140, 0x6b04, 0x9384,
-	0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x27f1, 0x9006, 0x080c,
-	0x27f1, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001,
-	0x9085, 0x0001, 0x0038, 0x7808, 0xc0ad, 0x780a, 0x6003, 0x0009,
-	0x630a, 0x9006, 0x003e, 0x00de, 0x0005, 0x0016, 0x0026, 0x0036,
-	0x6100, 0x2019, 0x0100, 0x2001, 0x0382, 0x2004, 0xd09c, 0x0190,
-	0x00c6, 0x0126, 0x2091, 0x2800, 0x0016, 0x0036, 0x080c, 0x97ac,
-	0x003e, 0x001e, 0x012e, 0x00ce, 0x6200, 0x2200, 0x9106, 0x0d58,
-	0x2200, 0x0010, 0x8319, 0x1d38, 0x003e, 0x002e, 0x001e, 0x0005,
-	0x00d6, 0x0156, 0x080c, 0x8bc8, 0x7a14, 0x82ff, 0x0138, 0x7003,
-	0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x0490, 0x7003, 0x0200,
-	0x7007, 0x0000, 0x2069, 0x1800, 0x901e, 0x6800, 0x9086, 0x0004,
-	0x1110, 0xc38d, 0x0060, 0x080c, 0x6f5c, 0x1110, 0xc3ad, 0x0008,
-	0xc3a5, 0x6ad8, 0xd29c, 0x1110, 0xd2ac, 0x0108, 0xc39d, 0x730e,
-	0x2011, 0x1848, 0x63f0, 0x2312, 0x20a9, 0x0006, 0x2011, 0x1840,
-	0x2019, 0x1841, 0x2071, 0x0250, 0x2376, 0x8e70, 0x2276, 0x8e70,
-	0x9398, 0x0002, 0x9290, 0x0002, 0x1f04, 0x998c, 0x60c3, 0x0020,
-	0x080c, 0x8df1, 0x015e, 0x00de, 0x0005, 0x0156, 0x080c, 0x8bc8,
-	0x7a14, 0x82ff, 0x0168, 0x9286, 0xffff, 0x0118, 0x9282, 0x000e,
-	0x1238, 0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x0488,
-	0x7003, 0x0200, 0x7007, 0x001c, 0x700f, 0x0001, 0x2011, 0x198c,
-	0x2204, 0x8007, 0x701a, 0x8210, 0x2204, 0x8007, 0x701e, 0x0421,
-	0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, 0x181e, 0x2004,
-	0x7022, 0x2001, 0x181f, 0x2004, 0x7026, 0x0030, 0x2001, 0x1817,
-	0x2004, 0x9084, 0x00ff, 0x7026, 0x20a9, 0x0004, 0x20e1, 0x0001,
-	0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x60c3,
-	0x001c, 0x015e, 0x0804, 0x8df1, 0x0006, 0x2001, 0x1836, 0x2004,
-	0xd0ac, 0x000e, 0x0005, 0x2011, 0x0003, 0x080c, 0x91a3, 0x2011,
-	0x0002, 0x080c, 0x91ad, 0x080c, 0x9070, 0x0036, 0x901e, 0x080c,
-	0x90f0, 0x003e, 0x0005, 0x2071, 0x1883, 0x7000, 0x9005, 0x0140,
-	0x2001, 0x0812, 0x2071, 0x1800, 0x7072, 0x7076, 0x7067, 0xffd4,
-	0x2071, 0x1800, 0x7070, 0x7052, 0x7057, 0x1ddc, 0x0005, 0x00e6,
-	0x0126, 0x2071, 0x1800, 0x2091, 0x8000, 0x7550, 0x9582, 0x0010,
-	0x0608, 0x7054, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0,
-	0x001c, 0x7064, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1ddc, 0x0c98,
-	0x6003, 0x0008, 0x8529, 0x7552, 0x9ca8, 0x001c, 0x7064, 0x9502,
-	0x1230, 0x7556, 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x7057,
-	0x1ddc, 0x0cc0, 0x9006, 0x0cc0, 0x00e6, 0x2071, 0x1800, 0x7550,
-	0x9582, 0x0010, 0x0600, 0x7054, 0x2060, 0x6000, 0x9086, 0x0000,
-	0x0148, 0x9ce0, 0x001c, 0x7064, 0x9c02, 0x1208, 0x0cb0, 0x2061,
-	0x1ddc, 0x0c98, 0x6003, 0x0008, 0x8529, 0x7552, 0x9ca8, 0x001c,
-	0x7064, 0x9502, 0x1228, 0x7556, 0x9085, 0x0001, 0x00ee, 0x0005,
-	0x7057, 0x1ddc, 0x0cc8, 0x9006, 0x0cc8, 0x9c82, 0x1ddc, 0x0a0c,
-	0x0d65, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1a0c, 0x0d65, 0x9006,
-	0x6006, 0x600a, 0x600e, 0x6016, 0x601a, 0x6012, 0x6023, 0x0000,
-	0x6003, 0x0000, 0x601e, 0x605e, 0x6062, 0x6026, 0x602a, 0x602e,
-	0x6032, 0x6036, 0x603a, 0x603e, 0x604a, 0x6046, 0x6042, 0x2061,
-	0x1800, 0x6050, 0x8000, 0x6052, 0x0005, 0x9006, 0x600e, 0x6016,
-	0x601a, 0x6012, 0x6022, 0x6002, 0x601e, 0x605e, 0x6062, 0x604a,
-	0x6046, 0x2061, 0x1800, 0x6050, 0x8000, 0x6052, 0x0005, 0x0006,
-	0x6000, 0x9086, 0x0000, 0x01d0, 0x601c, 0xd084, 0x190c, 0x18f4,
-	0x6023, 0x0007, 0x2001, 0x1955, 0x2004, 0x0006, 0x9082, 0x0051,
-	0x000e, 0x0208, 0x8004, 0x601a, 0x080c, 0xd324, 0x604b, 0x0000,
-	0x6044, 0xd0fc, 0x1129, 0x9006, 0x6046, 0x6016, 0x000e, 0x0005,
-	0x080c, 0x97a4, 0x0106, 0x190c, 0x9746, 0x2001, 0x19c9, 0x2004,
-	0x9c06, 0x1130, 0x0036, 0x2019, 0x0001, 0x080c, 0x90f0, 0x003e,
-	0x080c, 0x9336, 0x010e, 0x190c, 0x9762, 0x0005, 0x00e6, 0x0126,
-	0x2071, 0x1800, 0x2091, 0x8000, 0x7550, 0x9582, 0x0001, 0x0608,
+	0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xba30,
+	0x1158, 0x080c, 0x3034, 0x080c, 0xba41, 0x11f0, 0x080c, 0xa574,
+	0x00d8, 0x080c, 0x9487, 0x08c0, 0x080c, 0xba41, 0x1118, 0x080c,
+	0xa574, 0x0090, 0x6014, 0x2048, 0x080c, 0xb82a, 0x0168, 0x6020,
+	0x9086, 0x0003, 0x1520, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000,
+	0x080c, 0x698f, 0x080c, 0xba1b, 0x080c, 0xbcb8, 0x080c, 0x9c06,
+	0x080c, 0x935d, 0x00ce, 0x0804, 0x9812, 0x2c78, 0x600c, 0x2060,
+	0x0804, 0x9812, 0x7013, 0x0000, 0x700f, 0x0000, 0x012e, 0x006e,
+	0x009e, 0x00ae, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020,
+	0x9086, 0x0006, 0x1d08, 0x080c, 0xd1fc, 0x08f0, 0x00f6, 0x0036,
+	0x2079, 0x0380, 0x7b18, 0xd3bc, 0x1de8, 0x7832, 0x7936, 0x7a3a,
+	0x781b, 0x8080, 0x003e, 0x00fe, 0x0005, 0x0016, 0x2001, 0x0382,
+	0x2004, 0x9084, 0x0007, 0x9086, 0x0001, 0x1188, 0x2001, 0x0015,
+	0x0c29, 0x2009, 0x1000, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007,
+	0x9086, 0x0003, 0x0120, 0x8109, 0x1db0, 0x080c, 0x0d65, 0x001e,
+	0x0005, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, 0x0003,
+	0x1120, 0x2001, 0x0380, 0x2003, 0x0001, 0x0005, 0x0156, 0x0016,
+	0x0026, 0x00e6, 0x900e, 0x2071, 0x19b8, 0x0469, 0x0106, 0x0190,
+	0x7004, 0x9086, 0x0003, 0x0148, 0x20a9, 0x1000, 0x6044, 0xd0fc,
+	0x01d8, 0x1f04, 0x98e6, 0x080c, 0x0d65, 0x080c, 0x98ad, 0x6044,
+	0xd0fc, 0x0190, 0x7030, 0x9c06, 0x1148, 0x080c, 0x884c, 0x6044,
+	0xd0dc, 0x0150, 0xc0dc, 0x6046, 0x700a, 0x7042, 0x704c, 0x9c06,
+	0x190c, 0x0d65, 0x080c, 0x88a9, 0x010e, 0x1919, 0x00ee, 0x002e,
+	0x001e, 0x015e, 0x0005, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007,
+	0x9086, 0x0003, 0x0005, 0x0126, 0x2091, 0x2400, 0x7808, 0xd0a4,
+	0x190c, 0x0d5e, 0xd09c, 0x0128, 0x7820, 0x908c, 0xf000, 0x11b8,
+	0x0012, 0x012e, 0x0005, 0x9933, 0x9971, 0x9998, 0x99c8, 0x99d8,
+	0x99e9, 0x99f8, 0x9a06, 0x9a17, 0x9a1b, 0x9933, 0x9933, 0x9933,
+	0x9933, 0x9933, 0x9933, 0x080c, 0x0d65, 0x012e, 0x0005, 0x2060,
+	0x6044, 0xd0bc, 0x0140, 0xc0bc, 0x6046, 0x6000, 0x908a, 0x0016,
+	0x1a0c, 0x0d65, 0x0012, 0x012e, 0x0005, 0x9958, 0x995a, 0x9958,
+	0x9960, 0x9958, 0x9958, 0x9958, 0x9958, 0x9958, 0x995a, 0x9958,
+	0x995a, 0x9958, 0x995a, 0x9958, 0x9958, 0x9958, 0x995a, 0x9958,
+	0x080c, 0x0d65, 0x2009, 0x0013, 0x080c, 0x9c6a, 0x012e, 0x0005,
+	0x6014, 0x2048, 0xa87c, 0xd0dc, 0x0130, 0x080c, 0x8398, 0x080c,
+	0x9bcc, 0x012e, 0x0005, 0x2009, 0x0049, 0x080c, 0x9c6a, 0x012e,
+	0x0005, 0x080c, 0x98ad, 0x2001, 0x19dd, 0x2003, 0x0000, 0x7030,
+	0x9065, 0x090c, 0x0d65, 0x7034, 0x9092, 0x00c8, 0x1258, 0x8000,
+	0x7036, 0x7004, 0x9086, 0x0003, 0x0110, 0x7007, 0x0000, 0x781f,
+	0x0808, 0x0040, 0x080c, 0xd5ee, 0x6003, 0x0001, 0x2009, 0x0014,
+	0x080c, 0x9c6a, 0x781f, 0x0100, 0x080c, 0x98c9, 0x012e, 0x0005,
+	0x080c, 0x98ad, 0x714c, 0x81ff, 0x1128, 0x2011, 0x19e0, 0x2013,
+	0x0000, 0x0400, 0x2061, 0x0100, 0x7150, 0x9192, 0x7530, 0x12b8,
+	0x8108, 0x7152, 0x714c, 0x9188, 0x0008, 0x210c, 0x918e, 0x0006,
+	0x1138, 0x6014, 0x9084, 0x1984, 0x9085, 0x0012, 0x6016, 0x0050,
+	0x6014, 0x9084, 0x1984, 0x9085, 0x0016, 0x6016, 0x0018, 0x706c,
+	0xc085, 0x706e, 0x781f, 0x0200, 0x080c, 0x98c9, 0x012e, 0x0005,
+	0x080c, 0x98ad, 0x714c, 0x2160, 0x6003, 0x0003, 0x2009, 0x004a,
+	0x080c, 0x9c6a, 0x781f, 0x0200, 0x080c, 0x98c9, 0x012e, 0x0005,
+	0x7808, 0xd09c, 0x0de8, 0x7820, 0x2060, 0x6003, 0x0003, 0x080c,
+	0x98ad, 0x080c, 0x1c02, 0x781f, 0x0400, 0x080c, 0x98c9, 0x012e,
+	0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x2060, 0x080c, 0x98ad,
+	0x080c, 0x1c4a, 0x781f, 0x0400, 0x080c, 0x98c9, 0x012e, 0x0005,
+	0x7030, 0x9065, 0x0148, 0x6044, 0xc0bc, 0x6046, 0x7104, 0x9186,
+	0x0003, 0x0110, 0x080c, 0x890f, 0x012e, 0x0005, 0x00f6, 0x703c,
+	0x9086, 0x0002, 0x0148, 0x704c, 0x907d, 0x0130, 0x7844, 0xc0bc,
+	0x7846, 0x080c, 0x8eb7, 0x0000, 0x00fe, 0x012e, 0x0005, 0x080c,
+	0x714d, 0x012e, 0x0005, 0x080c, 0x0d65, 0x0005, 0x00e6, 0x2071,
+	0x19b8, 0x6044, 0xc0bc, 0x6046, 0xd0fc, 0x01b8, 0x704c, 0x9c06,
+	0x1190, 0x2019, 0x0001, 0x080c, 0x926b, 0x704f, 0x0000, 0x2001,
+	0x0109, 0x2004, 0xd08c, 0x1138, 0x2001, 0x0108, 0x2004, 0xd0bc,
+	0x1110, 0x703f, 0x0000, 0x080c, 0x949d, 0x00ee, 0x0005, 0x0026,
+	0x7010, 0x9c06, 0x1178, 0x080c, 0x935d, 0x6044, 0xc0fc, 0x6046,
+	0x600c, 0x9015, 0x0120, 0x7212, 0x600f, 0x0000, 0x0010, 0x7212,
+	0x720e, 0x9006, 0x002e, 0x0005, 0x0026, 0x7020, 0x9c06, 0x1178,
+	0x080c, 0x935d, 0x6044, 0xc0fc, 0x6046, 0x600c, 0x9015, 0x0120,
+	0x7222, 0x600f, 0x0000, 0x0010, 0x7222, 0x721e, 0x9006, 0x002e,
+	0x0005, 0x00d6, 0x0036, 0x7830, 0x9c06, 0x1558, 0x2069, 0x0100,
+	0x68c0, 0x9005, 0x01f8, 0x080c, 0x81e3, 0x080c, 0x8f9c, 0x68c3,
+	0x0000, 0x080c, 0x9487, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000,
+	0x0138, 0x2001, 0x0100, 0x080c, 0x2833, 0x9006, 0x080c, 0x2833,
+	0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x9085,
+	0x0001, 0x0038, 0x7808, 0xc0ad, 0x780a, 0x6003, 0x0009, 0x630a,
+	0x9006, 0x003e, 0x00de, 0x0005, 0x0016, 0x0026, 0x0036, 0x6100,
+	0x2019, 0x0100, 0x2001, 0x0382, 0x2004, 0xd09c, 0x0190, 0x00c6,
+	0x0126, 0x2091, 0x2800, 0x0016, 0x0036, 0x080c, 0x9913, 0x003e,
+	0x001e, 0x012e, 0x00ce, 0x6200, 0x2200, 0x9106, 0x0d58, 0x2200,
+	0x0010, 0x8319, 0x1d38, 0x003e, 0x002e, 0x001e, 0x0005, 0x00d6,
+	0x0156, 0x080c, 0x8d43, 0x7a14, 0x82ff, 0x0138, 0x7003, 0x0100,
+	0x700b, 0x0003, 0x60c3, 0x0008, 0x0490, 0x7003, 0x0200, 0x7007,
+	0x0000, 0x2069, 0x1800, 0x901e, 0x6800, 0x9086, 0x0004, 0x1110,
+	0xc38d, 0x0060, 0x080c, 0x70ac, 0x1110, 0xc3ad, 0x0008, 0xc3a5,
+	0x6ad8, 0xd29c, 0x1110, 0xd2ac, 0x0108, 0xc39d, 0x730e, 0x2011,
+	0x1848, 0x63f0, 0x2312, 0x20a9, 0x0006, 0x2011, 0x1840, 0x2019,
+	0x1841, 0x2071, 0x0250, 0x2376, 0x8e70, 0x2276, 0x8e70, 0x9398,
+	0x0002, 0x9290, 0x0002, 0x1f04, 0x9af3, 0x60c3, 0x0020, 0x080c,
+	0x8f6c, 0x015e, 0x00de, 0x0005, 0x0156, 0x080c, 0x8d43, 0x7a14,
+	0x82ff, 0x0168, 0x9286, 0xffff, 0x0118, 0x9282, 0x000e, 0x1238,
+	0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x0488, 0x7003,
+	0x0200, 0x7007, 0x001c, 0x700f, 0x0001, 0x2011, 0x198e, 0x2204,
+	0x8007, 0x701a, 0x8210, 0x2204, 0x8007, 0x701e, 0x0421, 0x1120,
+	0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, 0x181e, 0x2004, 0x7022,
+	0x2001, 0x181f, 0x2004, 0x7026, 0x0030, 0x2001, 0x1817, 0x2004,
+	0x9084, 0x00ff, 0x7026, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099,
+	0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x60c3, 0x001c,
+	0x015e, 0x0804, 0x8f6c, 0x0006, 0x2001, 0x1836, 0x2004, 0xd0ac,
+	0x000e, 0x0005, 0x2011, 0x0003, 0x080c, 0x931e, 0x2011, 0x0002,
+	0x080c, 0x9328, 0x080c, 0x91eb, 0x0036, 0x901e, 0x080c, 0x926b,
+	0x003e, 0x0005, 0x2071, 0x1883, 0x7000, 0x9005, 0x0140, 0x2001,
+	0x0812, 0x2071, 0x1800, 0x7072, 0x7076, 0x7067, 0xffd4, 0x2071,
+	0x1800, 0x7070, 0x7052, 0x7057, 0x1ddc, 0x0005, 0x00e6, 0x0126,
+	0x2071, 0x1800, 0x2091, 0x8000, 0x7550, 0x9582, 0x0010, 0x0608,
 	0x7054, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x001c,
 	0x7064, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1ddc, 0x0c98, 0x6003,
 	0x0008, 0x8529, 0x7552, 0x9ca8, 0x001c, 0x7064, 0x9502, 0x1230,
 	0x7556, 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x7057, 0x1ddc,
-	0x0cc0, 0x9006, 0x0cc0, 0x6020, 0x9084, 0x000f, 0x0002, 0x9b17,
-	0x9b21, 0x9b3c, 0x9b57, 0xbe21, 0xbe3e, 0xbe59, 0x9b17, 0x9b21,
-	0x9b17, 0x9b73, 0x9b17, 0x9b17, 0x9b17, 0x9b17, 0x9b17, 0x9186,
-	0x0013, 0x1130, 0x6044, 0xd0fc, 0x0110, 0x080c, 0x86d1, 0x0005,
-	0x0005, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d65, 0x0013,
-	0x006e, 0x0005, 0x9b3a, 0xa282, 0xa454, 0x9b3a, 0xa4e2, 0x9e3c,
-	0x9b3a, 0x9b3a, 0xa204, 0xaa87, 0x9b3a, 0x9b3a, 0x9b3a, 0x9b3a,
-	0x9b3a, 0x9b3a, 0x080c, 0x0d65, 0x0066, 0x6000, 0x90b2, 0x0016,
-	0x1a0c, 0x0d65, 0x0013, 0x006e, 0x0005, 0x9b55, 0xb092, 0x9b55,
-	0x9b55, 0x9b55, 0x9b55, 0x9b55, 0x9b55, 0xb037, 0xb215, 0x9b55,
-	0xb0cf, 0xb153, 0xb0cf, 0xb153, 0x9b55, 0x080c, 0x0d65, 0x6000,
-	0x9082, 0x0016, 0x1a0c, 0x0d65, 0x6000, 0x0002, 0x9b71, 0xaad1,
-	0xab68, 0xace8, 0xad57, 0x9b71, 0x9b71, 0x9b71, 0xaaa0, 0xafb8,
-	0xafbb, 0x9b71, 0x9b71, 0x9b71, 0x9b71, 0xafeb, 0x9b71, 0x9b71,
-	0x9b71, 0x080c, 0x0d65, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c,
-	0x0d65, 0x0013, 0x006e, 0x0005, 0x9b8c, 0x9b8c, 0x9bca, 0x9c69,
-	0x9ce9, 0x9b8c, 0x9b8c, 0x9b8c, 0x9b8e, 0x9b8c, 0x9b8c, 0x9b8c,
-	0x9b8c, 0x9b8c, 0x9b8c, 0x9b8c, 0x080c, 0x0d65, 0x9186, 0x004c,
-	0x0560, 0x9186, 0x0003, 0x190c, 0x0d65, 0x0096, 0x601c, 0xc0ed,
-	0x601e, 0x6003, 0x0003, 0x6106, 0x6014, 0x2048, 0xa87c, 0x9084,
-	0xa000, 0xc0b5, 0xa87e, 0xa8ac, 0xa836, 0xa8b0, 0xa83a, 0x9006,
-	0xa846, 0xa84a, 0xa884, 0x9092, 0x199a, 0x0210, 0x2001, 0x1999,
-	0x8003, 0x8013, 0x8213, 0x9210, 0x621a, 0x009e, 0x080c, 0x1a44,
-	0x2009, 0x8030, 0x080c, 0x8375, 0x0005, 0x6010, 0x00b6, 0x2058,
-	0xbca0, 0x00be, 0x2c00, 0x080c, 0x9d0b, 0x080c, 0xbdef, 0x6003,
-	0x0007, 0x0005, 0x00d6, 0x0096, 0x00f6, 0x2079, 0x1800, 0x7a8c,
-	0x6014, 0x2048, 0xa87c, 0xd0ec, 0x1110, 0x9290, 0x0018, 0xac78,
-	0xc4fc, 0x0046, 0xa8e0, 0x9005, 0x1140, 0xa8dc, 0x921a, 0x0140,
-	0x0220, 0xa87b, 0x0007, 0x2010, 0x0028, 0xa87b, 0x0015, 0x0010,
-	0xa87b, 0x0000, 0x8214, 0xa883, 0x0000, 0xaa02, 0x0006, 0x0016,
-	0x0026, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2400, 0x9005, 0x1108,
-	0x009a, 0x2100, 0x9086, 0x0015, 0x1118, 0x2001, 0x0001, 0x0038,
-	0x2100, 0x9086, 0x0016, 0x0118, 0x2001, 0x0001, 0x002a, 0x94a4,
-	0x0007, 0x8423, 0x9405, 0x0002, 0x9c31, 0x9c31, 0x9c2c, 0x9c2f,
-	0x9c31, 0x9c29, 0x9c1c, 0x9c1c, 0x9c1c, 0x9c1c, 0x9c1c, 0x9c1c,
-	0x9c1c, 0x9c1c, 0x9c1c, 0x9c1c, 0x00fe, 0x00ee, 0x00de, 0x00ce,
-	0x002e, 0x001e, 0x000e, 0x004e, 0x00fe, 0x009e, 0x00de, 0x080c,
-	0x0d65, 0x080c, 0xa6c3, 0x0028, 0x080c, 0xa7e6, 0x0010, 0x080c,
-	0xa8d5, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x2c00,
-	0xa896, 0x000e, 0x080c, 0x9dc9, 0x0530, 0xa804, 0xa80e, 0x00a6,
-	0x2050, 0xb100, 0x00ae, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f,
-	0x9084, 0xffc0, 0x9080, 0x0002, 0xaacc, 0xabd0, 0xacd4, 0xadd8,
-	0x2031, 0x0000, 0x2041, 0x1277, 0x080c, 0x9f73, 0x0160, 0x000e,
-	0x9005, 0x0120, 0x00fe, 0x009e, 0x00de, 0x0005, 0x00fe, 0x009e,
-	0x00de, 0x0804, 0x9a65, 0x2001, 0x002c, 0x900e, 0x080c, 0x9e2f,
-	0x0c70, 0x91b6, 0x0015, 0x0170, 0x91b6, 0x0016, 0x0158, 0x91b2,
-	0x0047, 0x0a0c, 0x0d65, 0x91b2, 0x0050, 0x1a0c, 0x0d65, 0x9182,
-	0x0047, 0x0042, 0x080c, 0x9935, 0x0120, 0x9086, 0x0002, 0x0904,
-	0x9bca, 0x0005, 0x9c8b, 0x9c8b, 0x9c8d, 0x9cbf, 0x9c8b, 0x9c8b,
-	0x9c8b, 0x9c8b, 0x9cd2, 0x080c, 0x0d65, 0x00d6, 0x0016, 0x0096,
-	0x6003, 0x0004, 0x6114, 0x2148, 0xa87c, 0xd0fc, 0x01c0, 0xa878,
-	0xc0fc, 0x9005, 0x1158, 0xa894, 0x9005, 0x0140, 0x2001, 0x0000,
-	0x900e, 0x080c, 0x9e2f, 0x080c, 0x9a65, 0x00a8, 0x6003, 0x0002,
-	0xa8a4, 0xa9a8, 0x9105, 0x1178, 0xa8ae, 0xa8b2, 0x0c78, 0xa87f,
-	0x0020, 0xa88c, 0xa88a, 0xa8a4, 0xa8ae, 0xa8a8, 0xa8b2, 0xa8c7,
-	0x0000, 0xa8cb, 0x0000, 0x009e, 0x001e, 0x00de, 0x0005, 0x080c,
-	0x872e, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, 0xb6c5, 0x0120,
-	0xa87b, 0x0006, 0x080c, 0x683f, 0x009e, 0x00de, 0x080c, 0x9a65,
-	0x0804, 0x8793, 0x080c, 0x872e, 0x080c, 0x2fc1, 0x080c, 0xbdec,
-	0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, 0xb6c5, 0x0120, 0xa87b,
-	0x0029, 0x080c, 0x683f, 0x009e, 0x00de, 0x080c, 0x9a65, 0x0804,
-	0x8793, 0x9182, 0x0047, 0x0002, 0x9cf9, 0x9cfb, 0x9cf9, 0x9cf9,
-	0x9cf9, 0x9cf9, 0x9cf9, 0x9cf9, 0x9cf9, 0x9cf9, 0x9cf9, 0x9cf9,
-	0x9cfb, 0x080c, 0x0d65, 0x00d6, 0x0096, 0x080c, 0x158c, 0x6114,
-	0x2148, 0xa87b, 0x0000, 0xa883, 0x0000, 0x080c, 0x683f, 0x009e,
-	0x00de, 0x0804, 0x9a65, 0x0026, 0x0036, 0x0056, 0x0066, 0x0096,
-	0x00a6, 0x00f6, 0x0006, 0x080c, 0x1023, 0x000e, 0x090c, 0x0d65,
-	0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e, 0x20a9,
-	0x0020, 0x4104, 0xa87a, 0x2079, 0x1800, 0x798c, 0x9188, 0x0018,
-	0x918c, 0x0fff, 0xa972, 0xac76, 0x2950, 0x00a6, 0x2001, 0x0205,
-	0x2003, 0x0000, 0x901e, 0x2029, 0x0001, 0x9182, 0x0034, 0x1228,
-	0x2011, 0x001f, 0x080c, 0xb298, 0x04c0, 0x2130, 0x2009, 0x0034,
-	0x2011, 0x001f, 0x080c, 0xb298, 0x96b2, 0x0034, 0xb004, 0x904d,
-	0x0110, 0x080c, 0x0fd5, 0x080c, 0x1023, 0x01d0, 0x8528, 0xa867,
-	0x0110, 0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, 0x1230,
-	0x2608, 0x2011, 0x001b, 0x080c, 0xb298, 0x00b8, 0x96b2, 0x003c,
-	0x2009, 0x003c, 0x2950, 0x2011, 0x001b, 0x080c, 0xb298, 0x0c18,
-	0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0050,
-	0xb566, 0xb070, 0xc0fd, 0xb072, 0x0048, 0x2001, 0x0205, 0x2003,
-	0x0000, 0x00ae, 0x852f, 0x95ad, 0x0050, 0xb566, 0x2a48, 0xa804,
-	0xa807, 0x0000, 0x0006, 0x080c, 0x683f, 0x000e, 0x2048, 0x9005,
-	0x1db0, 0x00fe, 0x00ae, 0x009e, 0x006e, 0x005e, 0x003e, 0x002e,
-	0x0005, 0x00d6, 0x00f6, 0x0096, 0x0006, 0x080c, 0x1023, 0x000e,
-	0x090c, 0x0d65, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0,
-	0x900e, 0x20a9, 0x0020, 0x4104, 0xaa66, 0xa87a, 0x2079, 0x1800,
-	0x798c, 0x810c, 0x9188, 0x000c, 0x9182, 0x001a, 0x0210, 0x2009,
-	0x001a, 0x21a8, 0x810b, 0xa972, 0xac76, 0x2e98, 0xa85c, 0x9080,
-	0x001f, 0x20a0, 0x2001, 0x0205, 0x200c, 0x918d, 0x0080, 0x2102,
-	0x4003, 0x2003, 0x0000, 0x080c, 0x683f, 0x009e, 0x00fe, 0x00de,
-	0x0005, 0x0016, 0x00d6, 0x00f6, 0x0096, 0x0016, 0x2001, 0x0205,
-	0x200c, 0x918d, 0x0080, 0x2102, 0x001e, 0x2079, 0x0200, 0x2e98,
-	0xa87c, 0xd0ec, 0x0118, 0x9e80, 0x000c, 0x2098, 0x2021, 0x003e,
-	0x901e, 0x9282, 0x0020, 0x0218, 0x2011, 0x0020, 0x2018, 0x9486,
-	0x003e, 0x1170, 0x0096, 0x080c, 0x1023, 0x2900, 0x009e, 0x05c0,
-	0xa806, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0,
-	0x3300, 0x908e, 0x0260, 0x0140, 0x2009, 0x0280, 0x9102, 0x920a,
-	0x0218, 0x2010, 0x2100, 0x9318, 0x2200, 0x9402, 0x1228, 0x2400,
-	0x9202, 0x2410, 0x9318, 0x9006, 0x2020, 0x22a8, 0xa800, 0x9200,
-	0xa802, 0x20e1, 0x0000, 0x4003, 0x83ff, 0x0180, 0x3300, 0x9086,
-	0x0280, 0x1130, 0x7814, 0x8000, 0x9085, 0x0080, 0x7816, 0x2e98,
-	0x2310, 0x84ff, 0x0904, 0x9dde, 0x0804, 0x9de0, 0x9085, 0x0001,
-	0x7817, 0x0000, 0x009e, 0x00fe, 0x00de, 0x001e, 0x0005, 0x00d6,
-	0x0036, 0x0096, 0x6314, 0x2348, 0xa87a, 0xa982, 0x080c, 0x6833,
-	0x009e, 0x003e, 0x00de, 0x0005, 0x91b6, 0x0015, 0x1118, 0x080c,
-	0x9a65, 0x0030, 0x91b6, 0x0016, 0x190c, 0x0d65, 0x080c, 0x9a65,
-	0x0005, 0x20a9, 0x000e, 0x20e1, 0x0000, 0x2e98, 0x6014, 0x0096,
-	0x2048, 0xa860, 0x20e8, 0xa85c, 0x20a0, 0x009e, 0x4003, 0x0136,
-	0x9080, 0x001b, 0x2011, 0x0006, 0x20a9, 0x0001, 0x3418, 0x8318,
-	0x23a0, 0x4003, 0x3318, 0x8318, 0x2398, 0x8211, 0x1db8, 0x2011,
-	0x0006, 0x013e, 0x20a0, 0x3318, 0x8318, 0x2398, 0x4003, 0x3418,
-	0x8318, 0x23a0, 0x8211, 0x1db8, 0x0096, 0x080c, 0xb6c5, 0x0130,
-	0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0x009e, 0x0804,
-	0x9a65, 0x0096, 0x00d6, 0x0036, 0x7330, 0x9386, 0x0200, 0x11a8,
-	0x6010, 0x00b6, 0x2058, 0xb8c7, 0x0000, 0x00be, 0x6014, 0x9005,
-	0x0130, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xab32, 0x080c,
-	0x9a65, 0x003e, 0x00de, 0x009e, 0x0005, 0x0011, 0x1d48, 0x0cc8,
-	0x0006, 0x0016, 0x080c, 0xbdd7, 0x0188, 0x6014, 0x9005, 0x1170,
-	0x600b, 0x0003, 0x601b, 0x0000, 0x604b, 0x0000, 0x2009, 0x0022,
-	0x080c, 0xa25a, 0x9006, 0x001e, 0x000e, 0x0005, 0x9085, 0x0001,
-	0x0cd0, 0x0096, 0x0016, 0x20a9, 0x0014, 0x9e80, 0x000c, 0x20e1,
-	0x0000, 0x2098, 0x6014, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080,
-	0x0002, 0x20a0, 0x4003, 0x2001, 0x0205, 0x2003, 0x0001, 0x2099,
-	0x0260, 0x20a9, 0x0016, 0x4003, 0x20a9, 0x000a, 0xa804, 0x2048,
-	0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x2001,
-	0x0205, 0x2003, 0x0002, 0x2099, 0x0260, 0x20a9, 0x0020, 0x4003,
-	0x2003, 0x0000, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103,
-	0x080c, 0x9a65, 0x001e, 0x009e, 0x0005, 0x0096, 0x0016, 0x900e,
-	0x7030, 0x9086, 0x0100, 0x0140, 0x7038, 0x9084, 0x00ff, 0x800c,
-	0x703c, 0x9084, 0x00ff, 0x8004, 0x9080, 0x0004, 0x9108, 0x810b,
-	0x2011, 0x0002, 0x2019, 0x000c, 0x6014, 0x2048, 0x080c, 0xb298,
-	0x080c, 0xb6c5, 0x0140, 0x6014, 0x2048, 0xa807, 0x0000, 0xa864,
-	0xa8e2, 0xa867, 0x0103, 0x080c, 0x9a65, 0x001e, 0x009e, 0x0005,
-	0x0016, 0x0096, 0x7030, 0x9086, 0x0100, 0x1118, 0x2009, 0x0004,
-	0x0010, 0x7034, 0x800c, 0x810b, 0x2011, 0x000c, 0x2019, 0x000c,
-	0x6014, 0x2048, 0xa804, 0x0096, 0x9005, 0x0108, 0x2048, 0x080c,
-	0xb298, 0x009e, 0x080c, 0xb6c5, 0x0148, 0xa804, 0x9005, 0x1158,
-	0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, 0x9a65,
-	0x009e, 0x001e, 0x0005, 0x0086, 0x2040, 0xa030, 0x8007, 0x9086,
-	0x0100, 0x1118, 0x080c, 0xa40d, 0x00e0, 0xa034, 0x8007, 0x800c,
-	0x8806, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080,
-	0x000c, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0xaaa0,
-	0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x125d, 0x0019,
-	0x0d08, 0x008e, 0x0898, 0x0096, 0x0006, 0x080c, 0x1023, 0x000e,
-	0x01b0, 0xa8ab, 0x0dcb, 0xa876, 0x000e, 0xa8a2, 0x0006, 0xae6a,
-	0x2800, 0xa89e, 0xa97a, 0xaf72, 0xaa8e, 0xab92, 0xac96, 0xad9a,
-	0x0086, 0x2940, 0x080c, 0x1103, 0x008e, 0x9085, 0x0001, 0x009e,
-	0x0005, 0x00e6, 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210,
-	0x00b6, 0x2258, 0xba10, 0x00be, 0x9206, 0x1520, 0x700c, 0x6210,
-	0x00b6, 0x2258, 0xba14, 0x00be, 0x9206, 0x11e0, 0x604b, 0x0000,
-	0x2c68, 0x0016, 0x2009, 0x0035, 0x080c, 0xbd4f, 0x001e, 0x1158,
-	0x622c, 0x2268, 0x2071, 0x026c, 0x6b20, 0x9386, 0x0003, 0x0130,
-	0x9386, 0x0006, 0x0128, 0x080c, 0x9a65, 0x0020, 0x0039, 0x0010,
-	0x080c, 0xa08f, 0x002e, 0x00de, 0x00ee, 0x0005, 0x0096, 0x6814,
-	0x2048, 0x9186, 0x0015, 0x0904, 0xa06e, 0x918e, 0x0016, 0x1904,
-	0xa08d, 0x700c, 0x908c, 0xff00, 0x9186, 0x1700, 0x0120, 0x9186,
-	0x0300, 0x1904, 0xa048, 0x89ff, 0x1138, 0x6800, 0x9086, 0x000f,
-	0x0904, 0xa02a, 0x0804, 0xa08b, 0x6808, 0x9086, 0xffff, 0x1904,
-	0xa070, 0xa87c, 0x9084, 0x0060, 0x9086, 0x0020, 0x1128, 0xa83c,
-	0xa940, 0x9105, 0x1904, 0xa070, 0x6824, 0xd0b4, 0x1904, 0xa070,
-	0x080c, 0xb8ad, 0x6864, 0xa882, 0xa87c, 0xc0dc, 0xc0f4, 0xc0d4,
-	0xa87e, 0x0026, 0x900e, 0x6a18, 0x2001, 0x000a, 0x080c, 0x8276,
-	0xa884, 0x920a, 0x0208, 0x8011, 0xaa86, 0x82ff, 0x002e, 0x1138,
-	0x00c6, 0x2d60, 0x080c, 0xb3eb, 0x00ce, 0x0804, 0xa08b, 0x00c6,
-	0xa868, 0xd0fc, 0x1118, 0x080c, 0x5c5c, 0x0010, 0x080c, 0x5ff1,
-	0x00ce, 0x1904, 0xa070, 0x00c6, 0x2d60, 0x080c, 0x9a65, 0x00ce,
-	0x0804, 0xa08b, 0x00c6, 0x080c, 0x9ad6, 0x0198, 0x6017, 0x0000,
-	0x6810, 0x6012, 0x080c, 0xbb52, 0x6023, 0x0003, 0x6904, 0x00c6,
-	0x2d60, 0x080c, 0x9a65, 0x00ce, 0x080c, 0x9b03, 0x00ce, 0x0804,
-	0xa08b, 0x2001, 0x1957, 0x2004, 0x684a, 0x00ce, 0x0804, 0xa08b,
-	0x7008, 0x9086, 0x000b, 0x11c8, 0x6010, 0x00b6, 0x2058, 0xb900,
-	0xc1bc, 0xb902, 0x00be, 0x00c6, 0x2d60, 0xa87b, 0x0003, 0x080c,
-	0xbd91, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x2009,
-	0x8020, 0x080c, 0x832e, 0x00ce, 0x0430, 0x700c, 0x9086, 0x2a00,
-	0x1138, 0x2001, 0x1957, 0x2004, 0x684a, 0x00e8, 0x04c1, 0x00e8,
-	0x89ff, 0x090c, 0x0d65, 0x00c6, 0x00d6, 0x2d60, 0xa867, 0x0103,
-	0xa87b, 0x0003, 0x080c, 0x6655, 0x080c, 0xb8ad, 0x080c, 0x9a9f,
-	0x0026, 0x6010, 0x00b6, 0x2058, 0xba3c, 0x080c, 0x6291, 0x00be,
-	0x002e, 0x00de, 0x00ce, 0x080c, 0x9a65, 0x009e, 0x0005, 0x9186,
-	0x0015, 0x1128, 0x2001, 0x1957, 0x2004, 0x684a, 0x0068, 0x918e,
-	0x0016, 0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c, 0xd324, 0x080c,
-	0x821d, 0x080c, 0x9a65, 0x00ce, 0x080c, 0x9a65, 0x0005, 0x0026,
-	0x0036, 0x0046, 0x7228, 0xacb0, 0xabac, 0xd2f4, 0x0130, 0x2001,
-	0x1957, 0x2004, 0x684a, 0x0804, 0xa109, 0x00c6, 0x2d60, 0x080c,
-	0xb2c3, 0x00ce, 0x6804, 0x9086, 0x0050, 0x1168, 0x00c6, 0x2d00,
-	0x2060, 0x6003, 0x0001, 0x6007, 0x0050, 0x2009, 0x8023, 0x080c,
-	0x832e, 0x00ce, 0x04f0, 0x6800, 0x9086, 0x000f, 0x01a8, 0x89ff,
-	0x090c, 0x0d65, 0x6800, 0x9086, 0x0004, 0x1190, 0xa87c, 0xd0ac,
-	0x0178, 0xa843, 0x0fff, 0xa83f, 0x0fff, 0xa880, 0xc0fc, 0xa882,
-	0x2001, 0x0001, 0x6832, 0x0400, 0x2001, 0x0007, 0x6832, 0x00e0,
-	0xa87c, 0xd0b4, 0x1150, 0xd0ac, 0x0db8, 0x6824, 0xd0f4, 0x1d48,
-	0xa838, 0xa934, 0x9105, 0x0d80, 0x0c20, 0xd2ec, 0x1d68, 0x7024,
-	0x9306, 0x1118, 0x7020, 0x9406, 0x0d38, 0x7020, 0x683e, 0x7024,
-	0x683a, 0x2001, 0x0005, 0x6832, 0x080c, 0xba3c, 0x080c, 0x8793,
-	0x0010, 0x080c, 0x9a65, 0x004e, 0x003e, 0x002e, 0x0005, 0x00e6,
-	0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258,
-	0xba10, 0x00be, 0x9206, 0x1904, 0xa174, 0x700c, 0x6210, 0x00b6,
-	0x2258, 0xba14, 0x00be, 0x9206, 0x1904, 0xa174, 0x6038, 0x2068,
-	0x6824, 0xc0dc, 0x6826, 0x6a20, 0x9286, 0x0007, 0x0904, 0xa174,
-	0x9286, 0x0002, 0x0904, 0xa174, 0x9286, 0x0000, 0x05e8, 0x6808,
-	0x633c, 0x9306, 0x15c8, 0x2071, 0x026c, 0x9186, 0x0015, 0x0570,
-	0x918e, 0x0016, 0x1100, 0x00c6, 0x6038, 0x2060, 0x6104, 0x9186,
-	0x004b, 0x01c0, 0x9186, 0x004c, 0x01a8, 0x9186, 0x004d, 0x0190,
-	0x9186, 0x004e, 0x0178, 0x9186, 0x0052, 0x0160, 0x6014, 0x0096,
-	0x2048, 0x080c, 0xb6c5, 0x090c, 0x0d65, 0xa87b, 0x0003, 0x009e,
-	0x080c, 0xbd91, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002,
-	0x2009, 0x8020, 0x080c, 0x832e, 0x00ce, 0x0030, 0x6038, 0x2070,
-	0x2001, 0x1957, 0x2004, 0x704a, 0x080c, 0x9a65, 0x002e, 0x00de,
-	0x00ee, 0x0005, 0x00b6, 0x0096, 0x00f6, 0x6014, 0x2048, 0x6010,
-	0x2058, 0x91b6, 0x0015, 0x0130, 0xba08, 0xbb0c, 0xbc00, 0xc48c,
-	0xbc02, 0x0460, 0x0096, 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90,
-	0x0010, 0x2019, 0x000a, 0x20a9, 0x0004, 0x080c, 0xaa5d, 0x002e,
-	0x003e, 0x015e, 0x009e, 0x1904, 0xa1e3, 0x0096, 0x0156, 0x0036,
-	0x0026, 0x2b48, 0x9e90, 0x0014, 0x2019, 0x0006, 0x20a9, 0x0004,
-	0x080c, 0xaa5d, 0x002e, 0x003e, 0x015e, 0x009e, 0x15a0, 0x7238,
-	0xba0a, 0x733c, 0xbb0e, 0xbc00, 0xc48d, 0xbc02, 0xa804, 0x9005,
-	0x1128, 0x00fe, 0x009e, 0x00be, 0x0804, 0x9e74, 0x0096, 0x2048,
-	0xaa12, 0xab16, 0xac0a, 0x009e, 0x8006, 0x8006, 0x8007, 0x90bc,
-	0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0,
-	0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x125d, 0x080c,
-	0x9f73, 0x0130, 0x00fe, 0x009e, 0x080c, 0x9a65, 0x00be, 0x0005,
-	0x080c, 0xa40d, 0x0cb8, 0x2b78, 0x00f6, 0x080c, 0x2fc1, 0x080c,
-	0xbdec, 0x00fe, 0x00c6, 0x080c, 0x9a0f, 0x2f00, 0x6012, 0x6017,
-	0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x2001,
-	0x0007, 0x080c, 0x60b7, 0x080c, 0x60e3, 0x080c, 0x8335, 0x080c,
-	0x8793, 0x00ce, 0x0804, 0xa1b6, 0x2100, 0x91b2, 0x0053, 0x1a0c,
-	0x0d65, 0x91b2, 0x0040, 0x1a04, 0xa26c, 0x0002, 0xa25a, 0xa25a,
-	0xa250, 0xa25a, 0xa25a, 0xa25a, 0xa24e, 0xa24e, 0xa24e, 0xa24e,
-	0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e,
-	0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e,
-	0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa25a, 0xa24e, 0xa25a,
-	0xa25a, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa250, 0xa24e,
-	0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e,
-	0xa25a, 0xa25a, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e, 0xa24e,
-	0xa24e, 0xa24e, 0xa24e, 0xa25a, 0xa24e, 0xa24e, 0x080c, 0x0d65,
-	0x0066, 0x00b6, 0x6610, 0x2658, 0xb8c4, 0xc08c, 0xb8c6, 0x00be,
-	0x006e, 0x0000, 0x6003, 0x0001, 0x6106, 0x9186, 0x0032, 0x0118,
-	0x080c, 0x8335, 0x0010, 0x080c, 0x832e, 0x0126, 0x2091, 0x8000,
-	0x080c, 0x8793, 0x012e, 0x0005, 0x2600, 0x0002, 0xa280, 0xa280,
-	0xa280, 0xa25a, 0xa25a, 0xa280, 0xa280, 0xa280, 0xa280, 0xa25a,
-	0xa280, 0xa25a, 0xa280, 0xa25a, 0xa280, 0xa280, 0xa280, 0xa280,
-	0x080c, 0x0d65, 0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0d65, 0x91b6,
-	0x0013, 0x0904, 0xa357, 0x91b6, 0x0027, 0x1904, 0xa303, 0x080c,
-	0x86d1, 0x6004, 0x080c, 0xb8c2, 0x01b0, 0x080c, 0xb8d3, 0x01a8,
-	0x908e, 0x0021, 0x0904, 0xa300, 0x908e, 0x0022, 0x1130, 0x080c,
-	0x9ea0, 0x0904, 0xa2fc, 0x0804, 0xa2fd, 0x908e, 0x003d, 0x0904,
-	0xa300, 0x0804, 0xa2f6, 0x080c, 0x2ff2, 0x2001, 0x0007, 0x080c,
-	0x60b7, 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, 0xa40d,
-	0x9186, 0x007e, 0x1148, 0x2001, 0x1836, 0x2014, 0xc285, 0x080c,
-	0x6f5c, 0x1108, 0xc2ad, 0x2202, 0x080c, 0x9746, 0x0036, 0x0026,
-	0x2019, 0x0028, 0x2110, 0x080c, 0xd37f, 0x002e, 0x003e, 0x0016,
-	0x0026, 0x0036, 0x2110, 0x2019, 0x0028, 0x080c, 0x8498, 0x0076,
-	0x903e, 0x080c, 0x8387, 0x6010, 0x00b6, 0x905d, 0x0100, 0x00be,
-	0x2c08, 0x080c, 0xce23, 0x007e, 0x003e, 0x002e, 0x001e, 0x080c,
-	0x9762, 0x080c, 0xbdec, 0x0016, 0x080c, 0xbb4a, 0x080c, 0x9a65,
-	0x001e, 0x080c, 0x30d1, 0x080c, 0x8793, 0x0030, 0x080c, 0xbb4a,
-	0x080c, 0x9a65, 0x080c, 0x8793, 0x0005, 0x080c, 0xa40d, 0x0cb0,
-	0x080c, 0xa449, 0x0c98, 0x9186, 0x0015, 0x0118, 0x9186, 0x0016,
-	0x1140, 0x080c, 0x9935, 0x0d80, 0x9086, 0x0002, 0x0904, 0xa454,
-	0x0c58, 0x9186, 0x0014, 0x1d40, 0x080c, 0x86d1, 0x6004, 0x908e,
-	0x0022, 0x1118, 0x080c, 0x9ea0, 0x09f8, 0x080c, 0x2fc1, 0x080c,
-	0xbdec, 0x080c, 0xb8c2, 0x1190, 0x080c, 0x2ff2, 0x6010, 0x00b6,
-	0x2058, 0xb9a0, 0x00be, 0x080c, 0xa40d, 0x9186, 0x007e, 0x1128,
-	0x2001, 0x1836, 0x200c, 0xc185, 0x2102, 0x0800, 0x080c, 0xb8d3,
-	0x1120, 0x080c, 0xa40d, 0x0804, 0xa2f6, 0x6004, 0x908e, 0x0032,
-	0x1160, 0x00e6, 0x00f6, 0x2071, 0x1894, 0x2079, 0x0000, 0x080c,
-	0x3373, 0x00fe, 0x00ee, 0x0804, 0xa2f6, 0x6004, 0x908e, 0x0021,
-	0x0d40, 0x908e, 0x0022, 0x090c, 0xa40d, 0x0804, 0xa2f6, 0x90b2,
-	0x0040, 0x1a04, 0xa3f6, 0x2008, 0x0002, 0xa39f, 0xa3a0, 0xa3a3,
-	0xa3a6, 0xa3a9, 0xa3ac, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d,
-	0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d,
-	0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d,
-	0xa39d, 0xa39d, 0xa39d, 0xa3af, 0xa3b8, 0xa39d, 0xa3b9, 0xa3b8,
-	0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa3b8, 0xa3b8, 0xa39d,
-	0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa39d, 0xa3e1,
-	0xa3b8, 0xa39d, 0xa3b4, 0xa39d, 0xa39d, 0xa39d, 0xa3b5, 0xa39d,
-	0xa39d, 0xa39d, 0xa3b8, 0xa3dc, 0xa39d, 0x080c, 0x0d65, 0x00c0,
-	0x2001, 0x000b, 0x00e8, 0x2001, 0x0003, 0x00d0, 0x2001, 0x0005,
-	0x00b8, 0x2001, 0x0001, 0x00a0, 0x2001, 0x0009, 0x0088, 0x6003,
-	0x0005, 0x080c, 0x8793, 0x0058, 0x0018, 0x0010, 0x080c, 0x60b7,
-	0x04b8, 0x080c, 0xbdef, 0x6003, 0x0004, 0x080c, 0x8793, 0x0005,
-	0x080c, 0x60b7, 0x6003, 0x0002, 0x0036, 0x2019, 0x185e, 0x2304,
-	0x9084, 0xff00, 0x1120, 0x2001, 0x1955, 0x201c, 0x0040, 0x8007,
-	0x909a, 0x0004, 0x0ec0, 0x8003, 0x801b, 0x831b, 0x9318, 0x631a,
-	0x003e, 0x080c, 0x8793, 0x0c18, 0x080c, 0xbb4a, 0x080c, 0x9a65,
-	0x08f0, 0x00e6, 0x00f6, 0x2071, 0x1894, 0x2079, 0x0000, 0x080c,
-	0x3373, 0x00fe, 0x00ee, 0x080c, 0x86d1, 0x080c, 0x9a65, 0x0878,
-	0x6003, 0x0002, 0x080c, 0xbdef, 0x0804, 0x8793, 0x2600, 0x2008,
-	0x0002, 0xa40b, 0xa40b, 0xa40b, 0xa3f0, 0xa3f0, 0xa40b, 0xa40b,
-	0xa40b, 0xa40b, 0xa3f0, 0xa40b, 0xa3f0, 0xa40b, 0xa3f0, 0xa40b,
-	0xa40b, 0xa40b, 0xa40b, 0x080c, 0x0d65, 0x00e6, 0x0096, 0x0026,
-	0x0016, 0x080c, 0xb6c5, 0x0568, 0x6014, 0x2048, 0xa864, 0x9086,
-	0x0139, 0x11a8, 0xa894, 0x9086, 0x0056, 0x1148, 0x080c, 0x503e,
-	0x0130, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x0028, 0x2001,
-	0x0030, 0x900e, 0x2011, 0x4005, 0x080c, 0xbcb6, 0x0090, 0xa868,
-	0xd0fc, 0x0178, 0xa807, 0x0000, 0x0016, 0x6004, 0x908e, 0x0021,
-	0x0168, 0x908e, 0x003d, 0x0150, 0x001e, 0xa867, 0x0103, 0xa833,
-	0x0100, 0x001e, 0x002e, 0x009e, 0x00ee, 0x0005, 0x001e, 0x0009,
-	0x0cc0, 0x0096, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103,
-	0xa823, 0x8001, 0x009e, 0x0005, 0x00b6, 0x6610, 0x2658, 0xb804,
-	0x9084, 0x00ff, 0x90b2, 0x000c, 0x1a0c, 0x0d65, 0x6604, 0x96b6,
-	0x004d, 0x1120, 0x080c, 0xbbd6, 0x0804, 0xa4d1, 0x6604, 0x96b6,
-	0x0043, 0x1120, 0x080c, 0xbc1f, 0x0804, 0xa4d1, 0x6604, 0x96b6,
-	0x004b, 0x1120, 0x080c, 0xbc4b, 0x0804, 0xa4d1, 0x6604, 0x96b6,
-	0x0033, 0x1120, 0x080c, 0xbb6c, 0x0804, 0xa4d1, 0x6604, 0x96b6,
-	0x0028, 0x1120, 0x080c, 0xb90c, 0x0804, 0xa4d1, 0x6604, 0x96b6,
-	0x0029, 0x1120, 0x080c, 0xb94d, 0x0804, 0xa4d1, 0x6604, 0x96b6,
-	0x001f, 0x1118, 0x080c, 0x9e49, 0x04e0, 0x6604, 0x96b6, 0x0000,
-	0x1118, 0x080c, 0xa17a, 0x04a8, 0x6604, 0x96b6, 0x0022, 0x1118,
-	0x080c, 0x9e81, 0x0470, 0x6604, 0x96b6, 0x0035, 0x1118, 0x080c,
-	0x9f91, 0x0438, 0x6604, 0x96b6, 0x0039, 0x1118, 0x080c, 0xa10f,
-	0x0400, 0x6604, 0x96b6, 0x003d, 0x1118, 0x080c, 0x9eb9, 0x00c8,
-	0x6604, 0x96b6, 0x0044, 0x1118, 0x080c, 0x9ef5, 0x0090, 0x6604,
-	0x96b6, 0x0049, 0x1118, 0x080c, 0x9f20, 0x0058, 0x91b6, 0x0015,
-	0x1110, 0x0063, 0x0030, 0x91b6, 0x0016, 0x1128, 0x00be, 0x0804,
-	0xa78f, 0x00be, 0x0005, 0x080c, 0x9b20, 0x0cd8, 0xa4ee, 0xa4f1,
-	0xa4ee, 0xa535, 0xa4ee, 0xa6c3, 0xa79c, 0xa4ee, 0xa4ee, 0xa769,
-	0xa4ee, 0xa77d, 0x0096, 0x080c, 0x158c, 0x6014, 0x2048, 0xa800,
-	0x2048, 0xa867, 0x0103, 0x009e, 0x0804, 0x9a65, 0xa001, 0xa001,
-	0x0005, 0x00e6, 0x2071, 0x1800, 0x708c, 0x9086, 0x0074, 0x1540,
-	0x080c, 0xcdf4, 0x11b0, 0x6010, 0x00b6, 0x2058, 0x7030, 0xd08c,
-	0x0128, 0xb800, 0xd0bc, 0x0110, 0xc0c5, 0xb802, 0x00e9, 0x00be,
-	0x2001, 0x0006, 0x080c, 0x60b7, 0x080c, 0x2ff2, 0x080c, 0x9a65,
-	0x0088, 0x2001, 0x000a, 0x080c, 0x60b7, 0x080c, 0x2ff2, 0x6003,
-	0x0001, 0x6007, 0x0001, 0x080c, 0x8335, 0x080c, 0x8793, 0x0010,
-	0x080c, 0xa6ae, 0x00ee, 0x0005, 0x00d6, 0xb800, 0xd084, 0x0158,
-	0x9006, 0x080c, 0x60a3, 0x2069, 0x1853, 0x6804, 0x0020, 0x2001,
-	0x0006, 0x080c, 0x60e3, 0x00de, 0x0005, 0x00b6, 0x0096, 0x00d6,
-	0x2011, 0x1823, 0x2204, 0x9086, 0x0074, 0x1904, 0xa687, 0x6010,
-	0x2058, 0xbaa0, 0x9286, 0x007e, 0x1120, 0x080c, 0xa8e0, 0x0804,
-	0xa5ec, 0x00d6, 0x080c, 0x6f5c, 0x0198, 0x0026, 0x2011, 0x0010,
-	0x080c, 0x6581, 0x002e, 0x05c8, 0x080c, 0x52b1, 0x1540, 0x6014,
-	0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, 0x00f8,
-	0x0026, 0x2011, 0x8008, 0x080c, 0x6581, 0x002e, 0x0530, 0x6014,
+	0x0cc0, 0x9006, 0x0cc0, 0x00e6, 0x2071, 0x1800, 0x7550, 0x9582,
+	0x0010, 0x0600, 0x7054, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148,
+	0x9ce0, 0x001c, 0x7064, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1ddc,
+	0x0c98, 0x6003, 0x0008, 0x8529, 0x7552, 0x9ca8, 0x001c, 0x7064,
+	0x9502, 0x1228, 0x7556, 0x9085, 0x0001, 0x00ee, 0x0005, 0x7057,
+	0x1ddc, 0x0cc8, 0x9006, 0x0cc8, 0x9c82, 0x1ddc, 0x0a0c, 0x0d65,
+	0x2001, 0x1819, 0x2004, 0x9c02, 0x1a0c, 0x0d65, 0x9006, 0x6006,
+	0x600a, 0x600e, 0x6016, 0x601a, 0x6012, 0x6023, 0x0000, 0x6003,
+	0x0000, 0x601e, 0x605e, 0x6062, 0x6026, 0x602a, 0x602e, 0x6032,
+	0x6036, 0x603a, 0x603e, 0x604a, 0x6046, 0x6042, 0x2061, 0x1800,
+	0x6050, 0x8000, 0x6052, 0x0005, 0x9006, 0x600e, 0x6016, 0x601a,
+	0x6012, 0x6022, 0x6002, 0x601e, 0x605e, 0x6062, 0x604a, 0x6046,
+	0x2061, 0x1800, 0x6050, 0x8000, 0x6052, 0x0005, 0x0006, 0x6000,
+	0x9086, 0x0000, 0x01d0, 0x601c, 0xd084, 0x190c, 0x1914, 0x6023,
+	0x0007, 0x2001, 0x1957, 0x2004, 0x0006, 0x9082, 0x0051, 0x000e,
+	0x0208, 0x8004, 0x601a, 0x080c, 0xd4ac, 0x604b, 0x0000, 0x6044,
+	0xd0fc, 0x1129, 0x9006, 0x6046, 0x6016, 0x000e, 0x0005, 0x080c,
+	0x990b, 0x0106, 0x190c, 0x98ad, 0x2001, 0x19cb, 0x2004, 0x9c06,
+	0x1130, 0x0036, 0x2019, 0x0001, 0x080c, 0x926b, 0x003e, 0x080c,
+	0x949d, 0x010e, 0x190c, 0x98c9, 0x0005, 0x00e6, 0x0126, 0x2071,
+	0x1800, 0x2091, 0x8000, 0x7550, 0x9582, 0x0001, 0x0608, 0x7054,
+	0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x001c, 0x7064,
+	0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1ddc, 0x0c98, 0x6003, 0x0008,
+	0x8529, 0x7552, 0x9ca8, 0x001c, 0x7064, 0x9502, 0x1230, 0x7556,
+	0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x7057, 0x1ddc, 0x0cc0,
+	0x9006, 0x0cc0, 0x6020, 0x9084, 0x000f, 0x0002, 0x9c7e, 0x9c88,
+	0x9ca3, 0x9cbe, 0xbf90, 0xbfad, 0xbfc8, 0x9c7e, 0x9c88, 0x9c7e,
+	0x9cda, 0x9c7e, 0x9c7e, 0x9c7e, 0x9c7e, 0x9c7e, 0x9186, 0x0013,
+	0x1130, 0x6044, 0xd0fc, 0x0110, 0x080c, 0x884c, 0x0005, 0x0005,
+	0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d65, 0x0013, 0x006e,
+	0x0005, 0x9ca1, 0xa3e9, 0xa5bb, 0x9ca1, 0xa649, 0x9fa3, 0x9ca1,
+	0x9ca1, 0xa36b, 0xabee, 0x9ca1, 0x9ca1, 0x9ca1, 0x9ca1, 0x9ca1,
+	0x9ca1, 0x080c, 0x0d65, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c,
+	0x0d65, 0x0013, 0x006e, 0x0005, 0x9cbc, 0xb1f9, 0x9cbc, 0x9cbc,
+	0x9cbc, 0x9cbc, 0x9cbc, 0x9cbc, 0xb19e, 0xb37c, 0x9cbc, 0xb236,
+	0xb2ba, 0xb236, 0xb2ba, 0x9cbc, 0x080c, 0x0d65, 0x6000, 0x9082,
+	0x0016, 0x1a0c, 0x0d65, 0x6000, 0x0002, 0x9cd8, 0xac38, 0xaccf,
+	0xae4f, 0xaebe, 0x9cd8, 0x9cd8, 0x9cd8, 0xac07, 0xb11f, 0xb122,
+	0x9cd8, 0x9cd8, 0x9cd8, 0x9cd8, 0xb152, 0x9cd8, 0x9cd8, 0x9cd8,
+	0x080c, 0x0d65, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d65,
+	0x0013, 0x006e, 0x0005, 0x9cf3, 0x9cf3, 0x9d31, 0x9dd0, 0x9e50,
+	0x9cf3, 0x9cf3, 0x9cf3, 0x9cf5, 0x9cf3, 0x9cf3, 0x9cf3, 0x9cf3,
+	0x9cf3, 0x9cf3, 0x9cf3, 0x080c, 0x0d65, 0x9186, 0x004c, 0x0560,
+	0x9186, 0x0003, 0x190c, 0x0d65, 0x0096, 0x601c, 0xc0ed, 0x601e,
+	0x6003, 0x0003, 0x6106, 0x6014, 0x2048, 0xa87c, 0x9084, 0xa000,
+	0xc0b5, 0xa87e, 0xa8ac, 0xa836, 0xa8b0, 0xa83a, 0x9006, 0xa846,
+	0xa84a, 0xa884, 0x9092, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003,
+	0x8013, 0x8213, 0x9210, 0x621a, 0x009e, 0x080c, 0x1a64, 0x2009,
+	0x8030, 0x080c, 0x84f0, 0x0005, 0x6010, 0x00b6, 0x2058, 0xbca0,
+	0x00be, 0x2c00, 0x080c, 0x9e72, 0x080c, 0xbf5e, 0x6003, 0x0007,
+	0x0005, 0x00d6, 0x0096, 0x00f6, 0x2079, 0x1800, 0x7a8c, 0x6014,
+	0x2048, 0xa87c, 0xd0ec, 0x1110, 0x9290, 0x0018, 0xac78, 0xc4fc,
+	0x0046, 0xa8e0, 0x9005, 0x1140, 0xa8dc, 0x921a, 0x0140, 0x0220,
+	0xa87b, 0x0007, 0x2010, 0x0028, 0xa87b, 0x0015, 0x0010, 0xa87b,
+	0x0000, 0x8214, 0xa883, 0x0000, 0xaa02, 0x0006, 0x0016, 0x0026,
+	0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2400, 0x9005, 0x1108, 0x009a,
+	0x2100, 0x9086, 0x0015, 0x1118, 0x2001, 0x0001, 0x0038, 0x2100,
+	0x9086, 0x0016, 0x0118, 0x2001, 0x0001, 0x002a, 0x94a4, 0x0007,
+	0x8423, 0x9405, 0x0002, 0x9d98, 0x9d98, 0x9d93, 0x9d96, 0x9d98,
+	0x9d90, 0x9d83, 0x9d83, 0x9d83, 0x9d83, 0x9d83, 0x9d83, 0x9d83,
+	0x9d83, 0x9d83, 0x9d83, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e,
+	0x001e, 0x000e, 0x004e, 0x00fe, 0x009e, 0x00de, 0x080c, 0x0d65,
+	0x080c, 0xa82a, 0x0028, 0x080c, 0xa94d, 0x0010, 0x080c, 0xaa3c,
+	0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x2c00, 0xa896,
+	0x000e, 0x080c, 0x9f30, 0x0530, 0xa804, 0xa80e, 0x00a6, 0x2050,
+	0xb100, 0x00ae, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084,
+	0xffc0, 0x9080, 0x0002, 0xaacc, 0xabd0, 0xacd4, 0xadd8, 0x2031,
+	0x0000, 0x2041, 0x1280, 0x080c, 0xa0da, 0x0160, 0x000e, 0x9005,
+	0x0120, 0x00fe, 0x009e, 0x00de, 0x0005, 0x00fe, 0x009e, 0x00de,
+	0x0804, 0x9bcc, 0x2001, 0x002c, 0x900e, 0x080c, 0x9f96, 0x0c70,
+	0x91b6, 0x0015, 0x0170, 0x91b6, 0x0016, 0x0158, 0x91b2, 0x0047,
+	0x0a0c, 0x0d65, 0x91b2, 0x0050, 0x1a0c, 0x0d65, 0x9182, 0x0047,
+	0x0042, 0x080c, 0x9a9c, 0x0120, 0x9086, 0x0002, 0x0904, 0x9d31,
+	0x0005, 0x9df2, 0x9df2, 0x9df4, 0x9e26, 0x9df2, 0x9df2, 0x9df2,
+	0x9df2, 0x9e39, 0x080c, 0x0d65, 0x00d6, 0x0016, 0x0096, 0x6003,
+	0x0004, 0x6114, 0x2148, 0xa87c, 0xd0fc, 0x01c0, 0xa878, 0xc0fc,
+	0x9005, 0x1158, 0xa894, 0x9005, 0x0140, 0x2001, 0x0000, 0x900e,
+	0x080c, 0x9f96, 0x080c, 0x9bcc, 0x00a8, 0x6003, 0x0002, 0xa8a4,
+	0xa9a8, 0x9105, 0x1178, 0xa8ae, 0xa8b2, 0x0c78, 0xa87f, 0x0020,
+	0xa88c, 0xa88a, 0xa8a4, 0xa8ae, 0xa8a8, 0xa8b2, 0xa8c7, 0x0000,
+	0xa8cb, 0x0000, 0x009e, 0x001e, 0x00de, 0x0005, 0x080c, 0x88a9,
+	0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, 0xb82c, 0x0120, 0xa87b,
+	0x0006, 0x080c, 0x698f, 0x009e, 0x00de, 0x080c, 0x9bcc, 0x0804,
+	0x890e, 0x080c, 0x88a9, 0x080c, 0x3003, 0x080c, 0xbf5b, 0x00d6,
+	0x0096, 0x6114, 0x2148, 0x080c, 0xb82c, 0x0120, 0xa87b, 0x0029,
+	0x080c, 0x698f, 0x009e, 0x00de, 0x080c, 0x9bcc, 0x0804, 0x890e,
+	0x9182, 0x0047, 0x0002, 0x9e60, 0x9e62, 0x9e60, 0x9e60, 0x9e60,
+	0x9e60, 0x9e60, 0x9e60, 0x9e60, 0x9e60, 0x9e60, 0x9e60, 0x9e62,
+	0x080c, 0x0d65, 0x00d6, 0x0096, 0x080c, 0x1595, 0x6114, 0x2148,
+	0xa87b, 0x0000, 0xa883, 0x0000, 0x080c, 0x698f, 0x009e, 0x00de,
+	0x0804, 0x9bcc, 0x0026, 0x0036, 0x0056, 0x0066, 0x0096, 0x00a6,
+	0x00f6, 0x0006, 0x080c, 0x1022, 0x000e, 0x090c, 0x0d65, 0xa960,
+	0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020,
+	0x4104, 0xa87a, 0x2079, 0x1800, 0x798c, 0x9188, 0x0018, 0x918c,
+	0x0fff, 0xa972, 0xac76, 0x2950, 0x00a6, 0x2001, 0x0205, 0x2003,
+	0x0000, 0x901e, 0x2029, 0x0001, 0x9182, 0x0034, 0x1228, 0x2011,
+	0x001f, 0x080c, 0xb3ff, 0x04c0, 0x2130, 0x2009, 0x0034, 0x2011,
+	0x001f, 0x080c, 0xb3ff, 0x96b2, 0x0034, 0xb004, 0x904d, 0x0110,
+	0x080c, 0x0fd4, 0x080c, 0x1022, 0x01d0, 0x8528, 0xa867, 0x0110,
+	0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, 0x1230, 0x2608,
+	0x2011, 0x001b, 0x080c, 0xb3ff, 0x00b8, 0x96b2, 0x003c, 0x2009,
+	0x003c, 0x2950, 0x2011, 0x001b, 0x080c, 0xb3ff, 0x0c18, 0x2001,
+	0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0050, 0xb566,
+	0xb070, 0xc0fd, 0xb072, 0x0048, 0x2001, 0x0205, 0x2003, 0x0000,
+	0x00ae, 0x852f, 0x95ad, 0x0050, 0xb566, 0x2a48, 0xa804, 0xa807,
+	0x0000, 0x0006, 0x080c, 0x698f, 0x000e, 0x2048, 0x9005, 0x1db0,
+	0x00fe, 0x00ae, 0x009e, 0x006e, 0x005e, 0x003e, 0x002e, 0x0005,
+	0x00d6, 0x00f6, 0x0096, 0x0006, 0x080c, 0x1022, 0x000e, 0x090c,
+	0x0d65, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e,
+	0x20a9, 0x0020, 0x4104, 0xaa66, 0xa87a, 0x2079, 0x1800, 0x798c,
+	0x810c, 0x9188, 0x000c, 0x9182, 0x001a, 0x0210, 0x2009, 0x001a,
+	0x21a8, 0x810b, 0xa972, 0xac76, 0x2e98, 0xa85c, 0x9080, 0x001f,
+	0x20a0, 0x2001, 0x0205, 0x200c, 0x918d, 0x0080, 0x2102, 0x4003,
+	0x2003, 0x0000, 0x080c, 0x698f, 0x009e, 0x00fe, 0x00de, 0x0005,
+	0x0016, 0x00d6, 0x00f6, 0x0096, 0x0016, 0x2001, 0x0205, 0x200c,
+	0x918d, 0x0080, 0x2102, 0x001e, 0x2079, 0x0200, 0x2e98, 0xa87c,
+	0xd0ec, 0x0118, 0x9e80, 0x000c, 0x2098, 0x2021, 0x003e, 0x901e,
+	0x9282, 0x0020, 0x0218, 0x2011, 0x0020, 0x2018, 0x9486, 0x003e,
+	0x1170, 0x0096, 0x080c, 0x1022, 0x2900, 0x009e, 0x05c0, 0xa806,
+	0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x3300,
+	0x908e, 0x0260, 0x0140, 0x2009, 0x0280, 0x9102, 0x920a, 0x0218,
+	0x2010, 0x2100, 0x9318, 0x2200, 0x9402, 0x1228, 0x2400, 0x9202,
+	0x2410, 0x9318, 0x9006, 0x2020, 0x22a8, 0xa800, 0x9200, 0xa802,
+	0x20e1, 0x0000, 0x4003, 0x83ff, 0x0180, 0x3300, 0x9086, 0x0280,
+	0x1130, 0x7814, 0x8000, 0x9085, 0x0080, 0x7816, 0x2e98, 0x2310,
+	0x84ff, 0x0904, 0x9f45, 0x0804, 0x9f47, 0x9085, 0x0001, 0x7817,
+	0x0000, 0x009e, 0x00fe, 0x00de, 0x001e, 0x0005, 0x00d6, 0x0036,
+	0x0096, 0x6314, 0x2348, 0xa87a, 0xa982, 0x080c, 0x6983, 0x009e,
+	0x003e, 0x00de, 0x0005, 0x91b6, 0x0015, 0x1118, 0x080c, 0x9bcc,
+	0x0030, 0x91b6, 0x0016, 0x190c, 0x0d65, 0x080c, 0x9bcc, 0x0005,
+	0x20a9, 0x000e, 0x20e1, 0x0000, 0x2e98, 0x6014, 0x0096, 0x2048,
+	0xa860, 0x20e8, 0xa85c, 0x20a0, 0x009e, 0x4003, 0x0136, 0x9080,
+	0x001b, 0x2011, 0x0006, 0x20a9, 0x0001, 0x3418, 0x8318, 0x23a0,
+	0x4003, 0x3318, 0x8318, 0x2398, 0x8211, 0x1db8, 0x2011, 0x0006,
+	0x013e, 0x20a0, 0x3318, 0x8318, 0x2398, 0x4003, 0x3418, 0x8318,
+	0x23a0, 0x8211, 0x1db8, 0x0096, 0x080c, 0xb82c, 0x0130, 0x6014,
+	0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0x009e, 0x0804, 0x9bcc,
+	0x0096, 0x00d6, 0x0036, 0x7330, 0x9386, 0x0200, 0x11a8, 0x6010,
+	0x00b6, 0x2058, 0xb8c7, 0x0000, 0x00be, 0x6014, 0x9005, 0x0130,
+	0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xab32, 0x080c, 0x9bcc,
+	0x003e, 0x00de, 0x009e, 0x0005, 0x0011, 0x1d48, 0x0cc8, 0x0006,
+	0x0016, 0x080c, 0xbf46, 0x0188, 0x6014, 0x9005, 0x1170, 0x600b,
+	0x0003, 0x601b, 0x0000, 0x604b, 0x0000, 0x2009, 0x0022, 0x080c,
+	0xa3c1, 0x9006, 0x001e, 0x000e, 0x0005, 0x9085, 0x0001, 0x0cd0,
+	0x0096, 0x0016, 0x20a9, 0x0014, 0x9e80, 0x000c, 0x20e1, 0x0000,
+	0x2098, 0x6014, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002,
+	0x20a0, 0x4003, 0x2001, 0x0205, 0x2003, 0x0001, 0x2099, 0x0260,
+	0x20a9, 0x0016, 0x4003, 0x20a9, 0x000a, 0xa804, 0x2048, 0xa860,
+	0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x2001, 0x0205,
+	0x2003, 0x0002, 0x2099, 0x0260, 0x20a9, 0x0020, 0x4003, 0x2003,
+	0x0000, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, 0x080c,
+	0x9bcc, 0x001e, 0x009e, 0x0005, 0x0096, 0x0016, 0x900e, 0x7030,
+	0x9086, 0x0100, 0x0140, 0x7038, 0x9084, 0x00ff, 0x800c, 0x703c,
+	0x9084, 0x00ff, 0x8004, 0x9080, 0x0004, 0x9108, 0x810b, 0x2011,
+	0x0002, 0x2019, 0x000c, 0x6014, 0x2048, 0x080c, 0xb3ff, 0x080c,
+	0xb82c, 0x0140, 0x6014, 0x2048, 0xa807, 0x0000, 0xa864, 0xa8e2,
+	0xa867, 0x0103, 0x080c, 0x9bcc, 0x001e, 0x009e, 0x0005, 0x0016,
+	0x0096, 0x7030, 0x9086, 0x0100, 0x1118, 0x2009, 0x0004, 0x0010,
+	0x7034, 0x800c, 0x810b, 0x2011, 0x000c, 0x2019, 0x000c, 0x6014,
+	0x2048, 0xa804, 0x0096, 0x9005, 0x0108, 0x2048, 0x080c, 0xb3ff,
+	0x009e, 0x080c, 0xb82c, 0x0148, 0xa804, 0x9005, 0x1158, 0xa807,
+	0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, 0x9bcc, 0x009e,
+	0x001e, 0x0005, 0x0086, 0x2040, 0xa030, 0x8007, 0x9086, 0x0100,
+	0x1118, 0x080c, 0xa574, 0x00e0, 0xa034, 0x8007, 0x800c, 0x8806,
+	0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x000c,
+	0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0xaaa0, 0xab9c,
+	0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x1266, 0x0019, 0x0d08,
+	0x008e, 0x0898, 0x0096, 0x0006, 0x080c, 0x1022, 0x000e, 0x01b0,
+	0xa8ab, 0x0dcb, 0xa876, 0x000e, 0xa8a2, 0x0006, 0xae6a, 0x2800,
+	0xa89e, 0xa97a, 0xaf72, 0xaa8e, 0xab92, 0xac96, 0xad9a, 0x0086,
+	0x2940, 0x080c, 0x110c, 0x008e, 0x9085, 0x0001, 0x009e, 0x0005,
+	0x00e6, 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6,
+	0x2258, 0xba10, 0x00be, 0x9206, 0x1520, 0x700c, 0x6210, 0x00b6,
+	0x2258, 0xba14, 0x00be, 0x9206, 0x11e0, 0x604b, 0x0000, 0x2c68,
+	0x0016, 0x2009, 0x0035, 0x080c, 0xbebe, 0x001e, 0x1158, 0x622c,
+	0x2268, 0x2071, 0x026c, 0x6b20, 0x9386, 0x0003, 0x0130, 0x9386,
+	0x0006, 0x0128, 0x080c, 0x9bcc, 0x0020, 0x0039, 0x0010, 0x080c,
+	0xa1f6, 0x002e, 0x00de, 0x00ee, 0x0005, 0x0096, 0x6814, 0x2048,
+	0x9186, 0x0015, 0x0904, 0xa1d5, 0x918e, 0x0016, 0x1904, 0xa1f4,
+	0x700c, 0x908c, 0xff00, 0x9186, 0x1700, 0x0120, 0x9186, 0x0300,
+	0x1904, 0xa1af, 0x89ff, 0x1138, 0x6800, 0x9086, 0x000f, 0x0904,
+	0xa191, 0x0804, 0xa1f2, 0x6808, 0x9086, 0xffff, 0x1904, 0xa1d7,
+	0xa87c, 0x9084, 0x0060, 0x9086, 0x0020, 0x1128, 0xa83c, 0xa940,
+	0x9105, 0x1904, 0xa1d7, 0x6824, 0xd0b4, 0x1904, 0xa1d7, 0x080c,
+	0xba1b, 0x6864, 0xa882, 0xa87c, 0xc0dc, 0xc0f4, 0xc0d4, 0xa87e,
+	0x0026, 0x900e, 0x6a18, 0x2001, 0x000a, 0x080c, 0x83f1, 0xa884,
+	0x920a, 0x0208, 0x8011, 0xaa86, 0x82ff, 0x002e, 0x1138, 0x00c6,
+	0x2d60, 0x080c, 0xb552, 0x00ce, 0x0804, 0xa1f2, 0x00c6, 0xa868,
+	0xd0fc, 0x1118, 0x080c, 0x5d4f, 0x0010, 0x080c, 0x60f4, 0x00ce,
+	0x1904, 0xa1d7, 0x00c6, 0x2d60, 0x080c, 0x9bcc, 0x00ce, 0x0804,
+	0xa1f2, 0x00c6, 0x080c, 0x9c3d, 0x0198, 0x6017, 0x0000, 0x6810,
+	0x6012, 0x080c, 0xbcc0, 0x6023, 0x0003, 0x6904, 0x00c6, 0x2d60,
+	0x080c, 0x9bcc, 0x00ce, 0x080c, 0x9c6a, 0x00ce, 0x0804, 0xa1f2,
+	0x2001, 0x1959, 0x2004, 0x684a, 0x00ce, 0x0804, 0xa1f2, 0x7008,
+	0x9086, 0x000b, 0x11c8, 0x6010, 0x00b6, 0x2058, 0xb900, 0xc1bc,
+	0xb902, 0x00be, 0x00c6, 0x2d60, 0xa87b, 0x0003, 0x080c, 0xbf00,
+	0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x2009, 0x8020,
+	0x080c, 0x84a9, 0x00ce, 0x0430, 0x700c, 0x9086, 0x2a00, 0x1138,
+	0x2001, 0x1959, 0x2004, 0x684a, 0x00e8, 0x04c1, 0x00e8, 0x89ff,
+	0x090c, 0x0d65, 0x00c6, 0x00d6, 0x2d60, 0xa867, 0x0103, 0xa87b,
+	0x0003, 0x080c, 0x67a5, 0x080c, 0xba1b, 0x080c, 0x9c06, 0x0026,
+	0x6010, 0x00b6, 0x2058, 0xba3c, 0x080c, 0x6394, 0x00be, 0x002e,
+	0x00de, 0x00ce, 0x080c, 0x9bcc, 0x009e, 0x0005, 0x9186, 0x0015,
+	0x1128, 0x2001, 0x1959, 0x2004, 0x684a, 0x0068, 0x918e, 0x0016,
+	0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c, 0xd4ac, 0x080c, 0x8398,
+	0x080c, 0x9bcc, 0x00ce, 0x080c, 0x9bcc, 0x0005, 0x0026, 0x0036,
+	0x0046, 0x7228, 0xacb0, 0xabac, 0xd2f4, 0x0130, 0x2001, 0x1959,
+	0x2004, 0x684a, 0x0804, 0xa270, 0x00c6, 0x2d60, 0x080c, 0xb42a,
+	0x00ce, 0x6804, 0x9086, 0x0050, 0x1168, 0x00c6, 0x2d00, 0x2060,
+	0x6003, 0x0001, 0x6007, 0x0050, 0x2009, 0x8023, 0x080c, 0x84a9,
+	0x00ce, 0x04f0, 0x6800, 0x9086, 0x000f, 0x01a8, 0x89ff, 0x090c,
+	0x0d65, 0x6800, 0x9086, 0x0004, 0x1190, 0xa87c, 0xd0ac, 0x0178,
+	0xa843, 0x0fff, 0xa83f, 0x0fff, 0xa880, 0xc0fc, 0xa882, 0x2001,
+	0x0001, 0x6832, 0x0400, 0x2001, 0x0007, 0x6832, 0x00e0, 0xa87c,
+	0xd0b4, 0x1150, 0xd0ac, 0x0db8, 0x6824, 0xd0f4, 0x1d48, 0xa838,
+	0xa934, 0x9105, 0x0d80, 0x0c20, 0xd2ec, 0x1d68, 0x7024, 0x9306,
+	0x1118, 0x7020, 0x9406, 0x0d38, 0x7020, 0x683e, 0x7024, 0x683a,
+	0x2001, 0x0005, 0x6832, 0x080c, 0xbbaa, 0x080c, 0x890e, 0x0010,
+	0x080c, 0x9bcc, 0x004e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x00d6,
+	0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, 0xba10,
+	0x00be, 0x9206, 0x1904, 0xa2db, 0x700c, 0x6210, 0x00b6, 0x2258,
+	0xba14, 0x00be, 0x9206, 0x1904, 0xa2db, 0x6038, 0x2068, 0x6824,
+	0xc0dc, 0x6826, 0x6a20, 0x9286, 0x0007, 0x0904, 0xa2db, 0x9286,
+	0x0002, 0x0904, 0xa2db, 0x9286, 0x0000, 0x05e8, 0x6808, 0x633c,
+	0x9306, 0x15c8, 0x2071, 0x026c, 0x9186, 0x0015, 0x0570, 0x918e,
+	0x0016, 0x1100, 0x00c6, 0x6038, 0x2060, 0x6104, 0x9186, 0x004b,
+	0x01c0, 0x9186, 0x004c, 0x01a8, 0x9186, 0x004d, 0x0190, 0x9186,
+	0x004e, 0x0178, 0x9186, 0x0052, 0x0160, 0x6014, 0x0096, 0x2048,
+	0x080c, 0xb82c, 0x090c, 0x0d65, 0xa87b, 0x0003, 0x009e, 0x080c,
+	0xbf00, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x2009,
+	0x8020, 0x080c, 0x84a9, 0x00ce, 0x0030, 0x6038, 0x2070, 0x2001,
+	0x1959, 0x2004, 0x704a, 0x080c, 0x9bcc, 0x002e, 0x00de, 0x00ee,
+	0x0005, 0x00b6, 0x0096, 0x00f6, 0x6014, 0x2048, 0x6010, 0x2058,
+	0x91b6, 0x0015, 0x0130, 0xba08, 0xbb0c, 0xbc00, 0xc48c, 0xbc02,
+	0x0460, 0x0096, 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, 0x0010,
+	0x2019, 0x000a, 0x20a9, 0x0004, 0x080c, 0xabc4, 0x002e, 0x003e,
+	0x015e, 0x009e, 0x1904, 0xa34a, 0x0096, 0x0156, 0x0036, 0x0026,
+	0x2b48, 0x9e90, 0x0014, 0x2019, 0x0006, 0x20a9, 0x0004, 0x080c,
+	0xabc4, 0x002e, 0x003e, 0x015e, 0x009e, 0x15a0, 0x7238, 0xba0a,
+	0x733c, 0xbb0e, 0xbc00, 0xc48d, 0xbc02, 0xa804, 0x9005, 0x1128,
+	0x00fe, 0x009e, 0x00be, 0x0804, 0x9fdb, 0x0096, 0x2048, 0xaa12,
+	0xab16, 0xac0a, 0x009e, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f,
+	0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c,
+	0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x1266, 0x080c, 0xa0da,
+	0x0130, 0x00fe, 0x009e, 0x080c, 0x9bcc, 0x00be, 0x0005, 0x080c,
+	0xa574, 0x0cb8, 0x2b78, 0x00f6, 0x080c, 0x3003, 0x080c, 0xbf5b,
+	0x00fe, 0x00c6, 0x080c, 0x9b76, 0x2f00, 0x6012, 0x6017, 0x0000,
+	0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007,
+	0x080c, 0x61ba, 0x080c, 0x61e6, 0x080c, 0x84b0, 0x080c, 0x890e,
+	0x00ce, 0x0804, 0xa31d, 0x2100, 0x91b2, 0x0053, 0x1a0c, 0x0d65,
+	0x91b2, 0x0040, 0x1a04, 0xa3d3, 0x0002, 0xa3c1, 0xa3c1, 0xa3b7,
+	0xa3c1, 0xa3c1, 0xa3c1, 0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5,
+	0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5,
+	0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5,
+	0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5, 0xa3c1, 0xa3b5, 0xa3c1, 0xa3c1,
+	0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5, 0xa3b7, 0xa3b5, 0xa3b5,
+	0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5, 0xa3c1,
+	0xa3c1, 0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5, 0xa3b5,
+	0xa3b5, 0xa3b5, 0xa3c1, 0xa3b5, 0xa3b5, 0x080c, 0x0d65, 0x0066,
+	0x00b6, 0x6610, 0x2658, 0xb8c4, 0xc08c, 0xb8c6, 0x00be, 0x006e,
+	0x0000, 0x6003, 0x0001, 0x6106, 0x9186, 0x0032, 0x0118, 0x080c,
+	0x84b0, 0x0010, 0x080c, 0x84a9, 0x0126, 0x2091, 0x8000, 0x080c,
+	0x890e, 0x012e, 0x0005, 0x2600, 0x0002, 0xa3e7, 0xa3e7, 0xa3e7,
+	0xa3c1, 0xa3c1, 0xa3e7, 0xa3e7, 0xa3e7, 0xa3e7, 0xa3c1, 0xa3e7,
+	0xa3c1, 0xa3e7, 0xa3c1, 0xa3e7, 0xa3e7, 0xa3e7, 0xa3e7, 0x080c,
+	0x0d65, 0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0d65, 0x91b6, 0x0013,
+	0x0904, 0xa4be, 0x91b6, 0x0027, 0x1904, 0xa46a, 0x080c, 0x884c,
+	0x6004, 0x080c, 0xba30, 0x01b0, 0x080c, 0xba41, 0x01a8, 0x908e,
+	0x0021, 0x0904, 0xa467, 0x908e, 0x0022, 0x1130, 0x080c, 0xa007,
+	0x0904, 0xa463, 0x0804, 0xa464, 0x908e, 0x003d, 0x0904, 0xa467,
+	0x0804, 0xa45d, 0x080c, 0x3034, 0x2001, 0x0007, 0x080c, 0x61ba,
+	0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, 0xa574, 0x9186,
+	0x007e, 0x1148, 0x2001, 0x1836, 0x2014, 0xc285, 0x080c, 0x70ac,
+	0x1108, 0xc2ad, 0x2202, 0x080c, 0x98ad, 0x0036, 0x0026, 0x2019,
+	0x0028, 0x2110, 0x080c, 0xd507, 0x002e, 0x003e, 0x0016, 0x0026,
+	0x0036, 0x2110, 0x2019, 0x0028, 0x080c, 0x8613, 0x0076, 0x903e,
+	0x080c, 0x8502, 0x6010, 0x00b6, 0x905d, 0x0100, 0x00be, 0x2c08,
+	0x080c, 0xcfa6, 0x007e, 0x003e, 0x002e, 0x001e, 0x080c, 0x98c9,
+	0x080c, 0xbf5b, 0x0016, 0x080c, 0xbcb8, 0x080c, 0x9bcc, 0x001e,
+	0x080c, 0x3113, 0x080c, 0x890e, 0x0030, 0x080c, 0xbcb8, 0x080c,
+	0x9bcc, 0x080c, 0x890e, 0x0005, 0x080c, 0xa574, 0x0cb0, 0x080c,
+	0xa5b0, 0x0c98, 0x9186, 0x0015, 0x0118, 0x9186, 0x0016, 0x1140,
+	0x080c, 0x9a9c, 0x0d80, 0x9086, 0x0002, 0x0904, 0xa5bb, 0x0c58,
+	0x9186, 0x0014, 0x1d40, 0x080c, 0x884c, 0x6004, 0x908e, 0x0022,
+	0x1118, 0x080c, 0xa007, 0x09f8, 0x080c, 0x3003, 0x080c, 0xbf5b,
+	0x080c, 0xba30, 0x1190, 0x080c, 0x3034, 0x6010, 0x00b6, 0x2058,
+	0xb9a0, 0x00be, 0x080c, 0xa574, 0x9186, 0x007e, 0x1128, 0x2001,
+	0x1836, 0x200c, 0xc185, 0x2102, 0x0800, 0x080c, 0xba41, 0x1120,
+	0x080c, 0xa574, 0x0804, 0xa45d, 0x6004, 0x908e, 0x0032, 0x1160,
+	0x00e6, 0x00f6, 0x2071, 0x1894, 0x2079, 0x0000, 0x080c, 0x33b5,
+	0x00fe, 0x00ee, 0x0804, 0xa45d, 0x6004, 0x908e, 0x0021, 0x0d40,
+	0x908e, 0x0022, 0x090c, 0xa574, 0x0804, 0xa45d, 0x90b2, 0x0040,
+	0x1a04, 0xa55d, 0x2008, 0x0002, 0xa506, 0xa507, 0xa50a, 0xa50d,
+	0xa510, 0xa513, 0xa504, 0xa504, 0xa504, 0xa504, 0xa504, 0xa504,
+	0xa504, 0xa504, 0xa504, 0xa504, 0xa504, 0xa504, 0xa504, 0xa504,
+	0xa504, 0xa504, 0xa504, 0xa504, 0xa504, 0xa504, 0xa504, 0xa504,
+	0xa504, 0xa504, 0xa516, 0xa51f, 0xa504, 0xa520, 0xa51f, 0xa504,
+	0xa504, 0xa504, 0xa504, 0xa504, 0xa51f, 0xa51f, 0xa504, 0xa504,
+	0xa504, 0xa504, 0xa504, 0xa504, 0xa504, 0xa504, 0xa548, 0xa51f,
+	0xa504, 0xa51b, 0xa504, 0xa504, 0xa504, 0xa51c, 0xa504, 0xa504,
+	0xa504, 0xa51f, 0xa543, 0xa504, 0x080c, 0x0d65, 0x00c0, 0x2001,
+	0x000b, 0x00e8, 0x2001, 0x0003, 0x00d0, 0x2001, 0x0005, 0x00b8,
+	0x2001, 0x0001, 0x00a0, 0x2001, 0x0009, 0x0088, 0x6003, 0x0005,
+	0x080c, 0x890e, 0x0058, 0x0018, 0x0010, 0x080c, 0x61ba, 0x04b8,
+	0x080c, 0xbf5e, 0x6003, 0x0004, 0x080c, 0x890e, 0x0005, 0x080c,
+	0x61ba, 0x6003, 0x0002, 0x0036, 0x2019, 0x185e, 0x2304, 0x9084,
+	0xff00, 0x1120, 0x2001, 0x1957, 0x201c, 0x0040, 0x8007, 0x909a,
+	0x0004, 0x0ec0, 0x8003, 0x801b, 0x831b, 0x9318, 0x631a, 0x003e,
+	0x080c, 0x890e, 0x0c18, 0x080c, 0xbcb8, 0x080c, 0x9bcc, 0x08f0,
+	0x00e6, 0x00f6, 0x2071, 0x1894, 0x2079, 0x0000, 0x080c, 0x33b5,
+	0x00fe, 0x00ee, 0x080c, 0x884c, 0x080c, 0x9bcc, 0x0878, 0x6003,
+	0x0002, 0x080c, 0xbf5e, 0x0804, 0x890e, 0x2600, 0x2008, 0x0002,
+	0xa572, 0xa572, 0xa572, 0xa557, 0xa557, 0xa572, 0xa572, 0xa572,
+	0xa572, 0xa557, 0xa572, 0xa557, 0xa572, 0xa557, 0xa572, 0xa572,
+	0xa572, 0xa572, 0x080c, 0x0d65, 0x00e6, 0x0096, 0x0026, 0x0016,
+	0x080c, 0xb82c, 0x0568, 0x6014, 0x2048, 0xa864, 0x9086, 0x0139,
+	0x11a8, 0xa894, 0x9086, 0x0056, 0x1148, 0x080c, 0x5127, 0x0130,
+	0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x0028, 0x2001, 0x0030,
+	0x900e, 0x2011, 0x4005, 0x080c, 0xbe25, 0x0090, 0xa868, 0xd0fc,
+	0x0178, 0xa807, 0x0000, 0x0016, 0x6004, 0x908e, 0x0021, 0x0168,
+	0x908e, 0x003d, 0x0150, 0x001e, 0xa867, 0x0103, 0xa833, 0x0100,
+	0x001e, 0x002e, 0x009e, 0x00ee, 0x0005, 0x001e, 0x0009, 0x0cc0,
+	0x0096, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, 0xa823,
+	0x8001, 0x009e, 0x0005, 0x00b6, 0x6610, 0x2658, 0xb804, 0x9084,
+	0x00ff, 0x90b2, 0x000c, 0x1a0c, 0x0d65, 0x6604, 0x96b6, 0x004d,
+	0x1120, 0x080c, 0xbd44, 0x0804, 0xa638, 0x6604, 0x96b6, 0x0043,
+	0x1120, 0x080c, 0xbd8d, 0x0804, 0xa638, 0x6604, 0x96b6, 0x004b,
+	0x1120, 0x080c, 0xbdb9, 0x0804, 0xa638, 0x6604, 0x96b6, 0x0033,
+	0x1120, 0x080c, 0xbcda, 0x0804, 0xa638, 0x6604, 0x96b6, 0x0028,
+	0x1120, 0x080c, 0xba7a, 0x0804, 0xa638, 0x6604, 0x96b6, 0x0029,
+	0x1120, 0x080c, 0xbabb, 0x0804, 0xa638, 0x6604, 0x96b6, 0x001f,
+	0x1118, 0x080c, 0x9fb0, 0x04e0, 0x6604, 0x96b6, 0x0000, 0x1118,
+	0x080c, 0xa2e1, 0x04a8, 0x6604, 0x96b6, 0x0022, 0x1118, 0x080c,
+	0x9fe8, 0x0470, 0x6604, 0x96b6, 0x0035, 0x1118, 0x080c, 0xa0f8,
+	0x0438, 0x6604, 0x96b6, 0x0039, 0x1118, 0x080c, 0xa276, 0x0400,
+	0x6604, 0x96b6, 0x003d, 0x1118, 0x080c, 0xa020, 0x00c8, 0x6604,
+	0x96b6, 0x0044, 0x1118, 0x080c, 0xa05c, 0x0090, 0x6604, 0x96b6,
+	0x0049, 0x1118, 0x080c, 0xa087, 0x0058, 0x91b6, 0x0015, 0x1110,
+	0x0063, 0x0030, 0x91b6, 0x0016, 0x1128, 0x00be, 0x0804, 0xa8f6,
+	0x00be, 0x0005, 0x080c, 0x9c87, 0x0cd8, 0xa655, 0xa658, 0xa655,
+	0xa69c, 0xa655, 0xa82a, 0xa903, 0xa655, 0xa655, 0xa8d0, 0xa655,
+	0xa8e4, 0x0096, 0x080c, 0x1595, 0x6014, 0x2048, 0xa800, 0x2048,
+	0xa867, 0x0103, 0x009e, 0x0804, 0x9bcc, 0xa001, 0xa001, 0x0005,
+	0x00e6, 0x2071, 0x1800, 0x708c, 0x9086, 0x0074, 0x1540, 0x080c,
+	0xcf77, 0x11b0, 0x6010, 0x00b6, 0x2058, 0x7030, 0xd08c, 0x0128,
+	0xb800, 0xd0bc, 0x0110, 0xc0c5, 0xb802, 0x00e9, 0x00be, 0x2001,
+	0x0006, 0x080c, 0x61ba, 0x080c, 0x3034, 0x080c, 0x9bcc, 0x0088,
+	0x2001, 0x000a, 0x080c, 0x61ba, 0x080c, 0x3034, 0x6003, 0x0001,
+	0x6007, 0x0001, 0x080c, 0x84b0, 0x080c, 0x890e, 0x0010, 0x080c,
+	0xa815, 0x00ee, 0x0005, 0x00d6, 0xb800, 0xd084, 0x0158, 0x9006,
+	0x080c, 0x61a6, 0x2069, 0x1853, 0x6804, 0x0020, 0x2001, 0x0006,
+	0x080c, 0x61e6, 0x00de, 0x0005, 0x00b6, 0x0096, 0x00d6, 0x2011,
+	0x1823, 0x2204, 0x9086, 0x0074, 0x1904, 0xa7ee, 0x6010, 0x2058,
+	0xbaa0, 0x9286, 0x007e, 0x1120, 0x080c, 0xaa47, 0x0804, 0xa753,
+	0x00d6, 0x080c, 0x70ac, 0x0198, 0x0026, 0x2011, 0x0010, 0x080c,
+	0x6684, 0x002e, 0x05c8, 0x080c, 0x539a, 0x1540, 0x6014, 0x2048,
+	0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, 0x00f8, 0x0026,
+	0x2011, 0x8008, 0x080c, 0x6684, 0x002e, 0x0530, 0x6014, 0x2048,
+	0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0030,
+	0x900e, 0x2011, 0x4009, 0x080c, 0xbe25, 0x0040, 0x6014, 0x2048,
+	0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, 0x6010, 0x2058,
+	0xb9a0, 0x0016, 0x080c, 0x3034, 0x080c, 0x9bcc, 0x001e, 0x080c,
+	0x3113, 0x00de, 0x0804, 0xa7ef, 0x00de, 0x080c, 0xaa3c, 0x6010,
+	0x2058, 0xbaa0, 0x9286, 0x0080, 0x1510, 0x6014, 0x9005, 0x01a8,
 	0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001,
-	0x0030, 0x900e, 0x2011, 0x4009, 0x080c, 0xbcb6, 0x0040, 0x6014,
-	0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, 0x6010,
-	0x2058, 0xb9a0, 0x0016, 0x080c, 0x2ff2, 0x080c, 0x9a65, 0x001e,
-	0x080c, 0x30d1, 0x00de, 0x0804, 0xa688, 0x00de, 0x080c, 0xa8d5,
-	0x6010, 0x2058, 0xbaa0, 0x9286, 0x0080, 0x1510, 0x6014, 0x9005,
-	0x01a8, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140,
-	0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xbcb6, 0x0030,
-	0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x2001, 0x0006,
-	0x080c, 0x60b7, 0x080c, 0x2ff2, 0x080c, 0x9a65, 0x0804, 0xa688,
-	0x080c, 0xa696, 0x6014, 0x9005, 0x0190, 0x2048, 0xa868, 0xd0f4,
-	0x01e8, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1d08, 0x2001,
-	0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xbcb6, 0x08f8, 0x080c,
-	0xa68c, 0x0160, 0x9006, 0x080c, 0x60a3, 0x2001, 0x0004, 0x080c,
-	0x60e3, 0x2001, 0x0007, 0x080c, 0x60b7, 0x08a0, 0x2001, 0x0004,
-	0x080c, 0x60b7, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x8335,
-	0x080c, 0x8793, 0x0804, 0xa688, 0xb85c, 0xd0e4, 0x01d0, 0x080c,
-	0xbae4, 0x080c, 0x6f5c, 0x0118, 0xd0dc, 0x1904, 0xa5ae, 0x2011,
-	0x1836, 0x2204, 0xc0ad, 0x2012, 0x2001, 0x0002, 0x00f6, 0x2079,
-	0x0100, 0x78e3, 0x0000, 0x080c, 0x2463, 0x78e2, 0x00fe, 0x0804,
-	0xa5ae, 0x080c, 0xbb25, 0x2011, 0x1836, 0x2204, 0xc0a5, 0x2012,
-	0x0006, 0x080c, 0xcf59, 0x000e, 0x1904, 0xa5ae, 0xc0b5, 0x2012,
-	0x2001, 0x0006, 0x080c, 0x60b7, 0x9006, 0x080c, 0x60a3, 0x00c6,
-	0x2001, 0x180f, 0x2004, 0xd09c, 0x0520, 0x00f6, 0x2079, 0x0100,
-	0x00e6, 0x2071, 0x1800, 0x700c, 0x9084, 0x00ff, 0x78e6, 0x707a,
-	0x7010, 0x78ea, 0x707e, 0x908c, 0x00ff, 0x00ee, 0x780c, 0xc0b5,
-	0x780e, 0x00fe, 0x080c, 0x2438, 0x00f6, 0x2100, 0x900e, 0x080c,
-	0x23ef, 0x795a, 0x00fe, 0x9186, 0x0081, 0x01d8, 0x2009, 0x0081,
-	0x00c8, 0x2009, 0x00ef, 0x00f6, 0x2079, 0x0100, 0x79ea, 0x7932,
-	0x7936, 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x2438, 0x00f6,
-	0x2079, 0x1800, 0x797e, 0x2100, 0x900e, 0x080c, 0x23ef, 0x795a,
-	0x00fe, 0x8108, 0x080c, 0x6106, 0x2b00, 0x00ce, 0x1904, 0xa5ae,
-	0x6012, 0x2009, 0x180f, 0x210c, 0xd19c, 0x0150, 0x2009, 0x027c,
-	0x210c, 0x918c, 0x00ff, 0xb912, 0x2009, 0x027d, 0x210c, 0xb916,
-	0x2001, 0x0002, 0x080c, 0x60b7, 0x6023, 0x0001, 0x6003, 0x0001,
-	0x6007, 0x0002, 0x080c, 0x8335, 0x080c, 0x8793, 0x0008, 0x0431,
-	0x00de, 0x009e, 0x00be, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0a4,
-	0x0120, 0x2001, 0x1854, 0x2004, 0xd0ac, 0x0005, 0x00e6, 0x080c,
-	0xd3d8, 0x0190, 0x2071, 0x0260, 0x7108, 0x720c, 0x918c, 0x00ff,
-	0x1118, 0x9284, 0xff00, 0x0140, 0x6010, 0x2058, 0xb8a0, 0x9084,
-	0xff80, 0x1110, 0xb912, 0xba16, 0x00ee, 0x0005, 0x2030, 0x2001,
-	0x0007, 0x080c, 0x60b7, 0x080c, 0x52b1, 0x1120, 0x2001, 0x0007,
-	0x080c, 0x60e3, 0x080c, 0x2ff2, 0x6020, 0x9086, 0x000a, 0x1108,
-	0x0005, 0x0804, 0x9a65, 0x00b6, 0x00e6, 0x0026, 0x0016, 0x2071,
-	0x1800, 0x708c, 0x9086, 0x0014, 0x1904, 0xa760, 0x00d6, 0x080c,
-	0x6f5c, 0x0198, 0x0026, 0x2011, 0x0010, 0x080c, 0x6581, 0x002e,
-	0x05c8, 0x080c, 0x52b1, 0x1540, 0x6014, 0x2048, 0xa807, 0x0000,
-	0xa867, 0x0103, 0xa833, 0xdead, 0x00f8, 0x0026, 0x2011, 0x8008,
-	0x080c, 0x6581, 0x002e, 0x0530, 0x6014, 0x2048, 0xa864, 0x9084,
-	0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0030, 0x900e, 0x2011,
-	0x4009, 0x080c, 0xbcb6, 0x0040, 0x6014, 0x2048, 0xa807, 0x0000,
-	0xa867, 0x0103, 0xa833, 0xdead, 0x6010, 0x2058, 0xb9a0, 0x0016,
-	0x080c, 0x2ff2, 0x080c, 0x9a65, 0x001e, 0x080c, 0x30d1, 0x00de,
-	0x0804, 0xa764, 0x00de, 0x080c, 0x52b1, 0x1170, 0x6014, 0x9005,
-	0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021, 0x0006,
-	0x080c, 0x4998, 0x004e, 0x003e, 0x00d6, 0x6010, 0x2058, 0x080c,
-	0x6201, 0x080c, 0xa524, 0x00de, 0x080c, 0xa9a6, 0x1588, 0x6010,
-	0x2058, 0xb890, 0x9005, 0x0560, 0x2001, 0x0006, 0x080c, 0x60b7,
-	0x0096, 0x6014, 0x904d, 0x01d0, 0xa864, 0x9084, 0x00ff, 0x9086,
-	0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c,
-	0xbcb6, 0x0060, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0029, 0x0130,
-	0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x009e, 0x080c,
-	0x2ff2, 0x6020, 0x9086, 0x000a, 0x0138, 0x080c, 0x9a65, 0x0020,
-	0x080c, 0xa40d, 0x080c, 0xa6ae, 0x001e, 0x002e, 0x00ee, 0x00be,
-	0x0005, 0x2011, 0x1823, 0x2204, 0x9086, 0x0014, 0x1160, 0x2001,
-	0x0002, 0x080c, 0x60b7, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c,
-	0x8335, 0x0804, 0x8793, 0x0804, 0xa6ae, 0x2030, 0x2011, 0x1823,
-	0x2204, 0x9086, 0x0004, 0x1148, 0x96b6, 0x000b, 0x1120, 0x2001,
-	0x0007, 0x080c, 0x60b7, 0x0804, 0x9a65, 0x0804, 0xa6ae, 0x0002,
-	0xa4ee, 0xa7a7, 0xa4ee, 0xa7e6, 0xa4ee, 0xa891, 0xa79c, 0xa4ee,
-	0xa4ee, 0xa8a4, 0xa4ee, 0xa8b4, 0x6604, 0x9686, 0x0003, 0x0904,
-	0xa6c3, 0x96b6, 0x001e, 0x1110, 0x080c, 0x9a65, 0x0005, 0x00b6,
-	0x00d6, 0x00c6, 0x080c, 0xa8c4, 0x11a0, 0x9006, 0x080c, 0x60a3,
-	0x080c, 0x2fc1, 0x080c, 0xbdec, 0x2001, 0x0002, 0x080c, 0x60b7,
-	0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8335, 0x080c, 0x8793,
-	0x0408, 0x2009, 0x026e, 0x2104, 0x9086, 0x0009, 0x1160, 0x6010,
-	0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0170, 0x8001, 0xb842,
-	0x601b, 0x000a, 0x0078, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00,
-	0x9086, 0x1900, 0x1108, 0x08a0, 0x080c, 0x2fc1, 0x080c, 0xbdec,
-	0x080c, 0xa6ae, 0x00ce, 0x00de, 0x00be, 0x0005, 0x0096, 0x00b6,
-	0x0026, 0x9016, 0x080c, 0xa8d2, 0x00d6, 0x2069, 0x194d, 0x2d04,
-	0x9005, 0x0168, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, 0x1138,
-	0x2069, 0x181f, 0x2d04, 0x8000, 0x206a, 0x00de, 0x0010, 0x00de,
-	0x0088, 0x9006, 0x080c, 0x60a3, 0x2001, 0x0002, 0x080c, 0x60b7,
-	0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8335, 0x080c, 0x8793,
-	0x0804, 0xa861, 0x080c, 0xb6c5, 0x01b0, 0x6014, 0x2048, 0xa864,
-	0x2010, 0x9086, 0x0139, 0x1138, 0x6007, 0x0016, 0x2001, 0x0002,
-	0x080c, 0xbd10, 0x00b0, 0x6014, 0x2048, 0xa864, 0xd0fc, 0x0118,
-	0x2001, 0x0001, 0x0ca8, 0x2001, 0x180e, 0x2004, 0xd0dc, 0x0148,
-	0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x1110, 0x9006,
-	0x0c38, 0x080c, 0xa40d, 0x2009, 0x026e, 0x2134, 0x96b4, 0x00ff,
-	0x9686, 0x0005, 0x0510, 0x9686, 0x000b, 0x01c8, 0x2009, 0x026f,
-	0x2104, 0x9084, 0xff00, 0x1118, 0x9686, 0x0009, 0x01b0, 0x9086,
-	0x1900, 0x1168, 0x9686, 0x0009, 0x0180, 0x2001, 0x0004, 0x080c,
-	0x60b7, 0x2001, 0x0028, 0x601a, 0x6007, 0x0052, 0x0010, 0x080c,
-	0xa6ae, 0x002e, 0x00be, 0x009e, 0x0005, 0x9286, 0x0139, 0x0160,
-	0x6014, 0x2048, 0x080c, 0xb6c5, 0x0140, 0xa864, 0x9086, 0x0139,
-	0x0118, 0xa868, 0xd0fc, 0x0108, 0x0c50, 0x6010, 0x2058, 0xb840,
-	0x9084, 0x00ff, 0x9005, 0x0138, 0x8001, 0xb842, 0x601b, 0x000a,
-	0x6007, 0x0016, 0x08f0, 0xb8a0, 0x9086, 0x007e, 0x1138, 0x00e6,
-	0x2071, 0x1800, 0x080c, 0x5b75, 0x00ee, 0x0010, 0x080c, 0x2fc1,
-	0x0870, 0x080c, 0xa8d2, 0x1160, 0x2001, 0x0004, 0x080c, 0x60b7,
-	0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x8335, 0x0804, 0x8793,
-	0x080c, 0xa40d, 0x0804, 0xa6ae, 0x0469, 0x1160, 0x2001, 0x0008,
-	0x080c, 0x60b7, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, 0x8335,
-	0x0804, 0x8793, 0x0804, 0xa6ae, 0x00e9, 0x1160, 0x2001, 0x000a,
-	0x080c, 0x60b7, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x8335,
-	0x0804, 0x8793, 0x0804, 0xa6ae, 0x2009, 0x026e, 0x2104, 0x9086,
-	0x0003, 0x1138, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x9086,
-	0x2a00, 0x0005, 0x9085, 0x0001, 0x0005, 0x00b6, 0x00c6, 0x0016,
-	0x6110, 0x2158, 0x080c, 0x6175, 0x001e, 0x00ce, 0x00be, 0x0005,
-	0x00b6, 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, 0x6010, 0x2058,
-	0x2009, 0x1836, 0x2104, 0x9085, 0x0003, 0x200a, 0x080c, 0xa978,
-	0x0560, 0x2009, 0x1836, 0x2104, 0xc0cd, 0x200a, 0x080c, 0x6559,
-	0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xd0ce, 0x2001,
-	0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0001,
-	0x080c, 0x2f80, 0x00e6, 0x2071, 0x1800, 0x080c, 0x2d99, 0x00ee,
-	0x00c6, 0x0156, 0x20a9, 0x0781, 0x2009, 0x007f, 0x080c, 0x30d1,
-	0x8108, 0x1f04, 0xa916, 0x015e, 0x00ce, 0x080c, 0xa8d5, 0x2071,
-	0x0260, 0x2079, 0x0200, 0x7817, 0x0001, 0x2001, 0x1836, 0x200c,
-	0xc1c5, 0x7018, 0xd0fc, 0x0110, 0xd0dc, 0x0118, 0x7038, 0xd0dc,
-	0x1108, 0xc1c4, 0x7817, 0x0000, 0x2001, 0x1836, 0x2102, 0x2079,
-	0x0100, 0x2e04, 0x9084, 0x00ff, 0x2069, 0x181e, 0x206a, 0x78e6,
-	0x0006, 0x8e70, 0x2e04, 0x2069, 0x181f, 0x206a, 0x78ea, 0x7832,
-	0x7836, 0x2010, 0x9084, 0xff00, 0x001e, 0x9105, 0x2009, 0x182b,
-	0x200a, 0x2200, 0x9084, 0x00ff, 0x2008, 0x080c, 0x2438, 0x080c,
-	0x6f5c, 0x0170, 0x2071, 0x0260, 0x2069, 0x1951, 0x7048, 0x206a,
-	0x704c, 0x6806, 0x7050, 0x680a, 0x7054, 0x680e, 0x080c, 0xbae4,
-	0x0040, 0x2001, 0x0006, 0x080c, 0x60b7, 0x080c, 0x2ff2, 0x080c,
-	0x9a65, 0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x00be, 0x0005,
-	0x0096, 0x0026, 0x0036, 0x00e6, 0x0156, 0x2019, 0x182b, 0x231c,
-	0x83ff, 0x01f0, 0x2071, 0x0260, 0x7200, 0x9294, 0x00ff, 0x7004,
-	0x9084, 0xff00, 0x9205, 0x9306, 0x1198, 0x2011, 0x0276, 0x20a9,
-	0x0004, 0x2b48, 0x2019, 0x000a, 0x080c, 0xaa5d, 0x1148, 0x2011,
-	0x027a, 0x20a9, 0x0004, 0x2019, 0x0006, 0x080c, 0xaa5d, 0x1100,
-	0x015e, 0x00ee, 0x003e, 0x002e, 0x009e, 0x0005, 0x00e6, 0x2071,
-	0x0260, 0x7034, 0x9086, 0x0014, 0x11a8, 0x7038, 0x9086, 0x0800,
-	0x1188, 0x703c, 0xd0ec, 0x0160, 0x9084, 0x0f00, 0x9086, 0x0100,
-	0x1138, 0x7054, 0xd0a4, 0x1110, 0xd0ac, 0x0110, 0x9006, 0x0010,
-	0x9085, 0x0001, 0x00ee, 0x0005, 0x00e6, 0x0096, 0x00c6, 0x0076,
-	0x0056, 0x0046, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2029,
-	0x19c2, 0x252c, 0x2021, 0x19c9, 0x2424, 0x2061, 0x1ddc, 0x2071,
-	0x1800, 0x7250, 0x7070, 0x9202, 0x1a04, 0xaa35, 0x080c, 0xd0fa,
-	0x0904, 0xaa2e, 0x6720, 0x9786, 0x0007, 0x0904, 0xaa2e, 0x2500,
-	0x9c06, 0x0904, 0xaa2e, 0x2400, 0x9c06, 0x0904, 0xaa2e, 0x3e08,
-	0x9186, 0x0002, 0x1148, 0x6010, 0x9005, 0x0130, 0x00b6, 0x2058,
-	0xb800, 0x00be, 0xd0bc, 0x1590, 0x00c6, 0x6043, 0xffff, 0x6000,
-	0x9086, 0x0004, 0x1110, 0x080c, 0x18f4, 0x9786, 0x000a, 0x0148,
-	0x080c, 0xb8d3, 0x1130, 0x00ce, 0x080c, 0xa40d, 0x080c, 0x9a9f,
-	0x00e8, 0x6014, 0x2048, 0x080c, 0xb6c5, 0x01a8, 0x9786, 0x0003,
-	0x1530, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0xa87c, 0xd0cc,
-	0x0130, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fd5, 0x009e, 0x080c,
-	0x6833, 0x080c, 0xb8ad, 0x080c, 0x9a9f, 0x00ce, 0x9ce0, 0x001c,
-	0x7064, 0x9c02, 0x1210, 0x0804, 0xa9d9, 0x012e, 0x000e, 0x002e,
-	0x004e, 0x005e, 0x007e, 0x00ce, 0x009e, 0x00ee, 0x0005, 0x9786,
-	0x0006, 0x1118, 0x080c, 0xd079, 0x0c30, 0x9786, 0x000a, 0x0998,
-	0x0880, 0x220c, 0x2304, 0x9106, 0x1130, 0x8210, 0x8318, 0x1f04,
-	0xaa49, 0x9006, 0x0005, 0x2304, 0x9102, 0x0218, 0x2001, 0x0001,
-	0x0008, 0x9006, 0x918d, 0x0001, 0x0005, 0x0136, 0x01c6, 0x0016,
-	0x8906, 0x8006, 0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0,
-	0x9300, 0x2098, 0x3518, 0x20a9, 0x0001, 0x220c, 0x4002, 0x910e,
-	0x1140, 0x8210, 0x8319, 0x1dc8, 0x9006, 0x001e, 0x01ce, 0x013e,
-	0x0005, 0x220c, 0x9102, 0x0218, 0x2001, 0x0001, 0x0010, 0x2001,
-	0x0000, 0x918d, 0x0001, 0x001e, 0x01ce, 0x013e, 0x0005, 0x6004,
-	0x908a, 0x0053, 0x1a0c, 0x0d65, 0x080c, 0xb8c2, 0x0120, 0x080c,
-	0xb8d3, 0x0158, 0x0028, 0x080c, 0x2ff2, 0x080c, 0xb8d3, 0x0128,
-	0x080c, 0x86d1, 0x080c, 0x9a65, 0x0005, 0x080c, 0xa40d, 0x0cc0,
-	0x9182, 0x0057, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005,
-	0xaabf, 0xaabf, 0xaabf, 0xaabf, 0xaabf, 0xaabf, 0xaabf, 0xaabf,
-	0xaabf, 0xaabf, 0xaabf, 0xaac1, 0xaac1, 0xaac1, 0xaac1, 0xaabf,
-	0xaabf, 0xaabf, 0xaac1, 0xaabf, 0xaabf, 0xaabf, 0xaabf, 0x080c,
-	0x0d65, 0x600b, 0xffff, 0x6003, 0x000f, 0x6106, 0x0126, 0x2091,
-	0x8000, 0x080c, 0xbdef, 0x2009, 0x8000, 0x080c, 0x832e, 0x012e,
-	0x0005, 0x9186, 0x0013, 0x1128, 0x6004, 0x9082, 0x0040, 0x0804,
-	0xab46, 0x9186, 0x0027, 0x1520, 0x080c, 0x86d1, 0x080c, 0x2fc1,
-	0x080c, 0xbdec, 0x0096, 0x6114, 0x2148, 0x080c, 0xb6c5, 0x0198,
-	0x080c, 0xb8d3, 0x1118, 0x080c, 0xa40d, 0x0068, 0xa867, 0x0103,
-	0xa87b, 0x0029, 0xa877, 0x0000, 0xa97c, 0xc1c5, 0xa97e, 0x080c,
-	0x683f, 0x080c, 0xb8ad, 0x009e, 0x080c, 0x9a65, 0x0804, 0x8793,
-	0x9186, 0x0014, 0x1120, 0x6004, 0x9082, 0x0040, 0x0018, 0x080c,
-	0x0d65, 0x0005, 0x0002, 0xab24, 0xab22, 0xab22, 0xab22, 0xab22,
-	0xab22, 0xab22, 0xab22, 0xab22, 0xab22, 0xab22, 0xab3d, 0xab3d,
-	0xab3d, 0xab3d, 0xab22, 0xab3d, 0xab22, 0xab3d, 0xab22, 0xab22,
-	0xab22, 0xab22, 0x080c, 0x0d65, 0x080c, 0x86d1, 0x0096, 0x6114,
-	0x2148, 0x080c, 0xb6c5, 0x0168, 0xa867, 0x0103, 0xa87b, 0x0006,
-	0xa877, 0x0000, 0xa880, 0xc0ec, 0xa882, 0x080c, 0x683f, 0x080c,
-	0xb8ad, 0x009e, 0x080c, 0x9a65, 0x0005, 0x080c, 0x86d1, 0x080c,
-	0xb8d3, 0x090c, 0xa40d, 0x080c, 0x9a65, 0x0005, 0x0002, 0xab60,
-	0xab5e, 0xab5e, 0xab5e, 0xab5e, 0xab5e, 0xab5e, 0xab5e, 0xab5e,
-	0xab5e, 0xab5e, 0xab62, 0xab62, 0xab62, 0xab62, 0xab5e, 0xab64,
-	0xab5e, 0xab62, 0xab5e, 0xab5e, 0xab5e, 0xab5e, 0x080c, 0x0d65,
-	0x080c, 0x0d65, 0x080c, 0x0d65, 0x080c, 0x9a65, 0x0804, 0x8793,
-	0x9182, 0x0057, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005,
-	0xab87, 0xab87, 0xab87, 0xab87, 0xab87, 0xabc0, 0xacaf, 0xab87,
-	0xacbb, 0xab87, 0xab87, 0xab87, 0xab87, 0xab87, 0xab87, 0xab87,
-	0xab87, 0xab87, 0xab87, 0xacbb, 0xab89, 0xab87, 0xacb9, 0x080c,
-	0x0d65, 0x00b6, 0x0096, 0x6114, 0x2148, 0x6010, 0x2058, 0xb800,
-	0xd0bc, 0x1508, 0xa87b, 0x0000, 0xa867, 0x0103, 0xa877, 0x0000,
-	0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xad40,
-	0x080c, 0x6655, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211,
-	0xba3e, 0xb8c0, 0x9005, 0x0110, 0x080c, 0x6291, 0x080c, 0x9a65,
-	0x009e, 0x00be, 0x0005, 0xa87c, 0xd0ac, 0x09e0, 0xa838, 0xa934,
-	0x9105, 0x09c0, 0xa880, 0xd0bc, 0x19a8, 0x080c, 0xba03, 0x0c80,
-	0x00b6, 0x0096, 0x6114, 0x2148, 0x601c, 0xd0fc, 0x1110, 0x7644,
-	0x0008, 0x9036, 0x96b4, 0x0fff, 0x86ff, 0x1590, 0x6010, 0x2058,
-	0xb800, 0xd0bc, 0x1904, 0xac9e, 0xa87b, 0x0000, 0xa867, 0x0103,
-	0xae76, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c,
-	0xad40, 0x080c, 0x6655, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110,
-	0x8211, 0xba3e, 0xb8c0, 0x9005, 0x0110, 0x080c, 0x6291, 0x601c,
-	0xd0fc, 0x1148, 0x7044, 0xd0e4, 0x1904, 0xac82, 0x080c, 0x9a65,
-	0x009e, 0x00be, 0x0005, 0x2009, 0x0211, 0x210c, 0x080c, 0x0d65,
-	0x968c, 0x0c00, 0x0150, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904,
-	0xac86, 0x7348, 0xab92, 0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186,
-	0x0002, 0x0508, 0x9186, 0x0028, 0x1118, 0xa87b, 0x001c, 0x00e8,
-	0xd6dc, 0x01a0, 0xa87b, 0x0015, 0xa87c, 0xd0ac, 0x0170, 0xa938,
-	0xaa34, 0x2100, 0x9205, 0x0148, 0x7048, 0x9106, 0x1118, 0x704c,
-	0x9206, 0x0118, 0xa992, 0xaa8e, 0xc6dc, 0x0038, 0xd6d4, 0x0118,
-	0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, 0xa867, 0x0103, 0xae76,
-	0x901e, 0xd6c4, 0x01d8, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005,
-	0x1118, 0xc6c4, 0x0804, 0xabcc, 0x735c, 0xab86, 0x83ff, 0x0170,
+	0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xbe25, 0x0030, 0xa807,
+	0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x2001, 0x0006, 0x080c,
+	0x61ba, 0x080c, 0x3034, 0x080c, 0x9bcc, 0x0804, 0xa7ef, 0x080c,
+	0xa7fd, 0x6014, 0x9005, 0x0190, 0x2048, 0xa868, 0xd0f4, 0x01e8,
+	0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1d08, 0x2001, 0x0000,
+	0x900e, 0x2011, 0x4000, 0x080c, 0xbe25, 0x08f8, 0x080c, 0xa7f3,
+	0x0160, 0x9006, 0x080c, 0x61a6, 0x2001, 0x0004, 0x080c, 0x61e6,
+	0x2001, 0x0007, 0x080c, 0x61ba, 0x08a0, 0x2001, 0x0004, 0x080c,
+	0x61ba, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x84b0, 0x080c,
+	0x890e, 0x0804, 0xa7ef, 0xb85c, 0xd0e4, 0x01d0, 0x080c, 0xbc52,
+	0x080c, 0x70ac, 0x0118, 0xd0dc, 0x1904, 0xa715, 0x2011, 0x1836,
+	0x2204, 0xc0ad, 0x2012, 0x2001, 0x0002, 0x00f6, 0x2079, 0x0100,
+	0x78e3, 0x0000, 0x080c, 0x2498, 0x78e2, 0x00fe, 0x0804, 0xa715,
+	0x080c, 0xbc93, 0x2011, 0x1836, 0x2204, 0xc0a5, 0x2012, 0x0006,
+	0x080c, 0xd0dc, 0x000e, 0x1904, 0xa715, 0xc0b5, 0x2012, 0x2001,
+	0x0006, 0x080c, 0x61ba, 0x9006, 0x080c, 0x61a6, 0x00c6, 0x2001,
+	0x180f, 0x2004, 0xd09c, 0x0520, 0x00f6, 0x2079, 0x0100, 0x00e6,
+	0x2071, 0x1800, 0x700c, 0x9084, 0x00ff, 0x78e6, 0x707a, 0x7010,
+	0x78ea, 0x707e, 0x908c, 0x00ff, 0x00ee, 0x780c, 0xc0b5, 0x780e,
+	0x00fe, 0x080c, 0x246d, 0x00f6, 0x2100, 0x900e, 0x080c, 0x2424,
+	0x795a, 0x00fe, 0x9186, 0x0081, 0x01d8, 0x2009, 0x0081, 0x00c8,
+	0x2009, 0x00ef, 0x00f6, 0x2079, 0x0100, 0x79ea, 0x7932, 0x7936,
+	0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x246d, 0x00f6, 0x2079,
+	0x1800, 0x797e, 0x2100, 0x900e, 0x080c, 0x2424, 0x795a, 0x00fe,
+	0x8108, 0x080c, 0x6209, 0x2b00, 0x00ce, 0x1904, 0xa715, 0x6012,
+	0x2009, 0x180f, 0x210c, 0xd19c, 0x0150, 0x2009, 0x027c, 0x210c,
+	0x918c, 0x00ff, 0xb912, 0x2009, 0x027d, 0x210c, 0xb916, 0x2001,
+	0x0002, 0x080c, 0x61ba, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007,
+	0x0002, 0x080c, 0x84b0, 0x080c, 0x890e, 0x0008, 0x0431, 0x00de,
+	0x009e, 0x00be, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0a4, 0x0120,
+	0x2001, 0x1854, 0x2004, 0xd0ac, 0x0005, 0x00e6, 0x080c, 0xd560,
+	0x0190, 0x2071, 0x0260, 0x7108, 0x720c, 0x918c, 0x00ff, 0x1118,
+	0x9284, 0xff00, 0x0140, 0x6010, 0x2058, 0xb8a0, 0x9084, 0xff80,
+	0x1110, 0xb912, 0xba16, 0x00ee, 0x0005, 0x2030, 0x2001, 0x0007,
+	0x080c, 0x61ba, 0x080c, 0x539a, 0x1120, 0x2001, 0x0007, 0x080c,
+	0x61e6, 0x080c, 0x3034, 0x6020, 0x9086, 0x000a, 0x1108, 0x0005,
+	0x0804, 0x9bcc, 0x00b6, 0x00e6, 0x0026, 0x0016, 0x2071, 0x1800,
+	0x708c, 0x9086, 0x0014, 0x1904, 0xa8c7, 0x00d6, 0x080c, 0x70ac,
+	0x0198, 0x0026, 0x2011, 0x0010, 0x080c, 0x6684, 0x002e, 0x05c8,
+	0x080c, 0x539a, 0x1540, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867,
+	0x0103, 0xa833, 0xdead, 0x00f8, 0x0026, 0x2011, 0x8008, 0x080c,
+	0x6684, 0x002e, 0x0530, 0x6014, 0x2048, 0xa864, 0x9084, 0x00ff,
+	0x9086, 0x0039, 0x1140, 0x2001, 0x0030, 0x900e, 0x2011, 0x4009,
+	0x080c, 0xbe25, 0x0040, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867,
+	0x0103, 0xa833, 0xdead, 0x6010, 0x2058, 0xb9a0, 0x0016, 0x080c,
+	0x3034, 0x080c, 0x9bcc, 0x001e, 0x080c, 0x3113, 0x00de, 0x0804,
+	0xa8cb, 0x00de, 0x080c, 0x539a, 0x1170, 0x6014, 0x9005, 0x1158,
+	0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021, 0x0006, 0x080c,
+	0x4a6e, 0x004e, 0x003e, 0x00d6, 0x6010, 0x2058, 0x080c, 0x6304,
+	0x080c, 0xa68b, 0x00de, 0x080c, 0xab0d, 0x1588, 0x6010, 0x2058,
+	0xb890, 0x9005, 0x0560, 0x2001, 0x0006, 0x080c, 0x61ba, 0x0096,
+	0x6014, 0x904d, 0x01d0, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039,
+	0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xbe25,
+	0x0060, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0029, 0x0130, 0xa807,
+	0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x009e, 0x080c, 0x3034,
+	0x6020, 0x9086, 0x000a, 0x0138, 0x080c, 0x9bcc, 0x0020, 0x080c,
+	0xa574, 0x080c, 0xa815, 0x001e, 0x002e, 0x00ee, 0x00be, 0x0005,
+	0x2011, 0x1823, 0x2204, 0x9086, 0x0014, 0x1160, 0x2001, 0x0002,
+	0x080c, 0x61ba, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x84b0,
+	0x0804, 0x890e, 0x0804, 0xa815, 0x2030, 0x2011, 0x1823, 0x2204,
+	0x9086, 0x0004, 0x1148, 0x96b6, 0x000b, 0x1120, 0x2001, 0x0007,
+	0x080c, 0x61ba, 0x0804, 0x9bcc, 0x0804, 0xa815, 0x0002, 0xa655,
+	0xa90e, 0xa655, 0xa94d, 0xa655, 0xa9f8, 0xa903, 0xa655, 0xa655,
+	0xaa0b, 0xa655, 0xaa1b, 0x6604, 0x9686, 0x0003, 0x0904, 0xa82a,
+	0x96b6, 0x001e, 0x1110, 0x080c, 0x9bcc, 0x0005, 0x00b6, 0x00d6,
+	0x00c6, 0x080c, 0xaa2b, 0x11a0, 0x9006, 0x080c, 0x61a6, 0x080c,
+	0x3003, 0x080c, 0xbf5b, 0x2001, 0x0002, 0x080c, 0x61ba, 0x6003,
+	0x0001, 0x6007, 0x0002, 0x080c, 0x84b0, 0x080c, 0x890e, 0x0408,
+	0x2009, 0x026e, 0x2104, 0x9086, 0x0009, 0x1160, 0x6010, 0x2058,
+	0xb840, 0x9084, 0x00ff, 0x9005, 0x0170, 0x8001, 0xb842, 0x601b,
+	0x000a, 0x0078, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x9086,
+	0x1900, 0x1108, 0x08a0, 0x080c, 0x3003, 0x080c, 0xbf5b, 0x080c,
+	0xa815, 0x00ce, 0x00de, 0x00be, 0x0005, 0x0096, 0x00b6, 0x0026,
+	0x9016, 0x080c, 0xaa39, 0x00d6, 0x2069, 0x194d, 0x2d04, 0x9005,
+	0x0168, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, 0x1138, 0x2069,
+	0x181f, 0x2d04, 0x8000, 0x206a, 0x00de, 0x0010, 0x00de, 0x0088,
+	0x9006, 0x080c, 0x61a6, 0x2001, 0x0002, 0x080c, 0x61ba, 0x6003,
+	0x0001, 0x6007, 0x0002, 0x080c, 0x84b0, 0x080c, 0x890e, 0x0804,
+	0xa9c8, 0x080c, 0xb82c, 0x01b0, 0x6014, 0x2048, 0xa864, 0x2010,
+	0x9086, 0x0139, 0x1138, 0x6007, 0x0016, 0x2001, 0x0002, 0x080c,
+	0xbe7f, 0x00b0, 0x6014, 0x2048, 0xa864, 0xd0fc, 0x0118, 0x2001,
+	0x0001, 0x0ca8, 0x2001, 0x180e, 0x2004, 0xd0dc, 0x0148, 0x6010,
+	0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x1110, 0x9006, 0x0c38,
+	0x080c, 0xa574, 0x2009, 0x026e, 0x2134, 0x96b4, 0x00ff, 0x9686,
+	0x0005, 0x0510, 0x9686, 0x000b, 0x01c8, 0x2009, 0x026f, 0x2104,
+	0x9084, 0xff00, 0x1118, 0x9686, 0x0009, 0x01b0, 0x9086, 0x1900,
+	0x1168, 0x9686, 0x0009, 0x0180, 0x2001, 0x0004, 0x080c, 0x61ba,
+	0x2001, 0x0028, 0x601a, 0x6007, 0x0052, 0x0010, 0x080c, 0xa815,
+	0x002e, 0x00be, 0x009e, 0x0005, 0x9286, 0x0139, 0x0160, 0x6014,
+	0x2048, 0x080c, 0xb82c, 0x0140, 0xa864, 0x9086, 0x0139, 0x0118,
+	0xa868, 0xd0fc, 0x0108, 0x0c50, 0x6010, 0x2058, 0xb840, 0x9084,
+	0x00ff, 0x9005, 0x0138, 0x8001, 0xb842, 0x601b, 0x000a, 0x6007,
+	0x0016, 0x08f0, 0xb8a0, 0x9086, 0x007e, 0x1138, 0x00e6, 0x2071,
+	0x1800, 0x080c, 0x5c68, 0x00ee, 0x0010, 0x080c, 0x3003, 0x0870,
+	0x080c, 0xaa39, 0x1160, 0x2001, 0x0004, 0x080c, 0x61ba, 0x6003,
+	0x0001, 0x6007, 0x0003, 0x080c, 0x84b0, 0x0804, 0x890e, 0x080c,
+	0xa574, 0x0804, 0xa815, 0x0469, 0x1160, 0x2001, 0x0008, 0x080c,
+	0x61ba, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, 0x84b0, 0x0804,
+	0x890e, 0x0804, 0xa815, 0x00e9, 0x1160, 0x2001, 0x000a, 0x080c,
+	0x61ba, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x84b0, 0x0804,
+	0x890e, 0x0804, 0xa815, 0x2009, 0x026e, 0x2104, 0x9086, 0x0003,
+	0x1138, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x9086, 0x2a00,
+	0x0005, 0x9085, 0x0001, 0x0005, 0x00b6, 0x00c6, 0x0016, 0x6110,
+	0x2158, 0x080c, 0x6278, 0x001e, 0x00ce, 0x00be, 0x0005, 0x00b6,
+	0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, 0x6010, 0x2058, 0x2009,
+	0x1836, 0x2104, 0x9085, 0x0003, 0x200a, 0x080c, 0xaadf, 0x0560,
+	0x2009, 0x1836, 0x2104, 0xc0cd, 0x200a, 0x080c, 0x665c, 0x0158,
+	0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xd251, 0x2001, 0x180c,
+	0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, 0x0001, 0x080c,
+	0x2fc2, 0x00e6, 0x2071, 0x1800, 0x080c, 0x2ddb, 0x00ee, 0x00c6,
+	0x0156, 0x20a9, 0x0781, 0x2009, 0x007f, 0x080c, 0x3113, 0x8108,
+	0x1f04, 0xaa7d, 0x015e, 0x00ce, 0x080c, 0xaa3c, 0x2071, 0x0260,
+	0x2079, 0x0200, 0x7817, 0x0001, 0x2001, 0x1836, 0x200c, 0xc1c5,
+	0x7018, 0xd0fc, 0x0110, 0xd0dc, 0x0118, 0x7038, 0xd0dc, 0x1108,
+	0xc1c4, 0x7817, 0x0000, 0x2001, 0x1836, 0x2102, 0x2079, 0x0100,
+	0x2e04, 0x9084, 0x00ff, 0x2069, 0x181e, 0x206a, 0x78e6, 0x0006,
+	0x8e70, 0x2e04, 0x2069, 0x181f, 0x206a, 0x78ea, 0x7832, 0x7836,
+	0x2010, 0x9084, 0xff00, 0x001e, 0x9105, 0x2009, 0x182b, 0x200a,
+	0x2200, 0x9084, 0x00ff, 0x2008, 0x080c, 0x246d, 0x080c, 0x70ac,
+	0x0170, 0x2071, 0x0260, 0x2069, 0x1953, 0x7048, 0x206a, 0x704c,
+	0x6806, 0x7050, 0x680a, 0x7054, 0x680e, 0x080c, 0xbc52, 0x0040,
+	0x2001, 0x0006, 0x080c, 0x61ba, 0x080c, 0x3034, 0x080c, 0x9bcc,
+	0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x0096,
+	0x0026, 0x0036, 0x00e6, 0x0156, 0x2019, 0x182b, 0x231c, 0x83ff,
+	0x01f0, 0x2071, 0x0260, 0x7200, 0x9294, 0x00ff, 0x7004, 0x9084,
+	0xff00, 0x9205, 0x9306, 0x1198, 0x2011, 0x0276, 0x20a9, 0x0004,
+	0x2b48, 0x2019, 0x000a, 0x080c, 0xabc4, 0x1148, 0x2011, 0x027a,
+	0x20a9, 0x0004, 0x2019, 0x0006, 0x080c, 0xabc4, 0x1100, 0x015e,
+	0x00ee, 0x003e, 0x002e, 0x009e, 0x0005, 0x00e6, 0x2071, 0x0260,
+	0x7034, 0x9086, 0x0014, 0x11a8, 0x7038, 0x9086, 0x0800, 0x1188,
+	0x703c, 0xd0ec, 0x0160, 0x9084, 0x0f00, 0x9086, 0x0100, 0x1138,
+	0x7054, 0xd0a4, 0x1110, 0xd0ac, 0x0110, 0x9006, 0x0010, 0x9085,
+	0x0001, 0x00ee, 0x0005, 0x00e6, 0x0096, 0x00c6, 0x0076, 0x0056,
+	0x0046, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2029, 0x19c4,
+	0x252c, 0x2021, 0x19cb, 0x2424, 0x2061, 0x1ddc, 0x2071, 0x1800,
+	0x7250, 0x7070, 0x9202, 0x1a04, 0xab9c, 0x080c, 0xd282, 0x0904,
+	0xab95, 0x6720, 0x9786, 0x0007, 0x0904, 0xab95, 0x2500, 0x9c06,
+	0x0904, 0xab95, 0x2400, 0x9c06, 0x0904, 0xab95, 0x3e08, 0x9186,
+	0x0002, 0x1148, 0x6010, 0x9005, 0x0130, 0x00b6, 0x2058, 0xb800,
+	0x00be, 0xd0bc, 0x1590, 0x00c6, 0x6043, 0xffff, 0x6000, 0x9086,
+	0x0004, 0x1110, 0x080c, 0x1914, 0x9786, 0x000a, 0x0148, 0x080c,
+	0xba41, 0x1130, 0x00ce, 0x080c, 0xa574, 0x080c, 0x9c06, 0x00e8,
+	0x6014, 0x2048, 0x080c, 0xb82c, 0x01a8, 0x9786, 0x0003, 0x1530,
+	0xa867, 0x0103, 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878, 0x2048,
+	0x080c, 0x0fd4, 0x009e, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6983,
+	0x080c, 0xba1b, 0x080c, 0x9c06, 0x00ce, 0x9ce0, 0x001c, 0x7064,
+	0x9c02, 0x1210, 0x0804, 0xab40, 0x012e, 0x000e, 0x002e, 0x004e,
+	0x005e, 0x007e, 0x00ce, 0x009e, 0x00ee, 0x0005, 0x9786, 0x0006,
+	0x1118, 0x080c, 0xd1fc, 0x0c30, 0x9786, 0x000a, 0x0998, 0x0880,
+	0x220c, 0x2304, 0x9106, 0x1130, 0x8210, 0x8318, 0x1f04, 0xabb0,
+	0x9006, 0x0005, 0x2304, 0x9102, 0x0218, 0x2001, 0x0001, 0x0008,
+	0x9006, 0x918d, 0x0001, 0x0005, 0x0136, 0x01c6, 0x0016, 0x8906,
+	0x8006, 0x8007, 0x908c, 0x003f, 0x21e0, 0x9084, 0xffc0, 0x9300,
+	0x2098, 0x3518, 0x20a9, 0x0001, 0x220c, 0x4002, 0x910e, 0x1140,
+	0x8210, 0x8319, 0x1dc8, 0x9006, 0x001e, 0x01ce, 0x013e, 0x0005,
+	0x220c, 0x9102, 0x0218, 0x2001, 0x0001, 0x0010, 0x2001, 0x0000,
+	0x918d, 0x0001, 0x001e, 0x01ce, 0x013e, 0x0005, 0x6004, 0x908a,
+	0x0053, 0x1a0c, 0x0d65, 0x080c, 0xba30, 0x0120, 0x080c, 0xba41,
+	0x0158, 0x0028, 0x080c, 0x3034, 0x080c, 0xba41, 0x0128, 0x080c,
+	0x884c, 0x080c, 0x9bcc, 0x0005, 0x080c, 0xa574, 0x0cc0, 0x9182,
+	0x0057, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xac26,
+	0xac26, 0xac26, 0xac26, 0xac26, 0xac26, 0xac26, 0xac26, 0xac26,
+	0xac26, 0xac26, 0xac28, 0xac28, 0xac28, 0xac28, 0xac26, 0xac26,
+	0xac26, 0xac28, 0xac26, 0xac26, 0xac26, 0xac26, 0x080c, 0x0d65,
+	0x600b, 0xffff, 0x6003, 0x000f, 0x6106, 0x0126, 0x2091, 0x8000,
+	0x080c, 0xbf5e, 0x2009, 0x8000, 0x080c, 0x84a9, 0x012e, 0x0005,
+	0x9186, 0x0013, 0x1128, 0x6004, 0x9082, 0x0040, 0x0804, 0xacad,
+	0x9186, 0x0027, 0x1520, 0x080c, 0x884c, 0x080c, 0x3003, 0x080c,
+	0xbf5b, 0x0096, 0x6114, 0x2148, 0x080c, 0xb82c, 0x0198, 0x080c,
+	0xba41, 0x1118, 0x080c, 0xa574, 0x0068, 0xa867, 0x0103, 0xa87b,
+	0x0029, 0xa877, 0x0000, 0xa97c, 0xc1c5, 0xa97e, 0x080c, 0x698f,
+	0x080c, 0xba1b, 0x009e, 0x080c, 0x9bcc, 0x0804, 0x890e, 0x9186,
+	0x0014, 0x1120, 0x6004, 0x9082, 0x0040, 0x0018, 0x080c, 0x0d65,
+	0x0005, 0x0002, 0xac8b, 0xac89, 0xac89, 0xac89, 0xac89, 0xac89,
+	0xac89, 0xac89, 0xac89, 0xac89, 0xac89, 0xaca4, 0xaca4, 0xaca4,
+	0xaca4, 0xac89, 0xaca4, 0xac89, 0xaca4, 0xac89, 0xac89, 0xac89,
+	0xac89, 0x080c, 0x0d65, 0x080c, 0x884c, 0x0096, 0x6114, 0x2148,
+	0x080c, 0xb82c, 0x0168, 0xa867, 0x0103, 0xa87b, 0x0006, 0xa877,
+	0x0000, 0xa880, 0xc0ec, 0xa882, 0x080c, 0x698f, 0x080c, 0xba1b,
+	0x009e, 0x080c, 0x9bcc, 0x0005, 0x080c, 0x884c, 0x080c, 0xba41,
+	0x090c, 0xa574, 0x080c, 0x9bcc, 0x0005, 0x0002, 0xacc7, 0xacc5,
+	0xacc5, 0xacc5, 0xacc5, 0xacc5, 0xacc5, 0xacc5, 0xacc5, 0xacc5,
+	0xacc5, 0xacc9, 0xacc9, 0xacc9, 0xacc9, 0xacc5, 0xaccb, 0xacc5,
+	0xacc9, 0xacc5, 0xacc5, 0xacc5, 0xacc5, 0x080c, 0x0d65, 0x080c,
+	0x0d65, 0x080c, 0x0d65, 0x080c, 0x9bcc, 0x0804, 0x890e, 0x9182,
+	0x0057, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xacee,
+	0xacee, 0xacee, 0xacee, 0xacee, 0xad27, 0xae16, 0xacee, 0xae22,
+	0xacee, 0xacee, 0xacee, 0xacee, 0xacee, 0xacee, 0xacee, 0xacee,
+	0xacee, 0xacee, 0xae22, 0xacf0, 0xacee, 0xae20, 0x080c, 0x0d65,
+	0x00b6, 0x0096, 0x6114, 0x2148, 0x6010, 0x2058, 0xb800, 0xd0bc,
+	0x1508, 0xa87b, 0x0000, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87c,
+	0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xaea7, 0x080c,
+	0x67a5, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e,
+	0xb8c0, 0x9005, 0x0110, 0x080c, 0x6394, 0x080c, 0x9bcc, 0x009e,
+	0x00be, 0x0005, 0xa87c, 0xd0ac, 0x09e0, 0xa838, 0xa934, 0x9105,
+	0x09c0, 0xa880, 0xd0bc, 0x19a8, 0x080c, 0xbb71, 0x0c80, 0x00b6,
+	0x0096, 0x6114, 0x2148, 0x601c, 0xd0fc, 0x1110, 0x7644, 0x0008,
+	0x9036, 0x96b4, 0x0fff, 0x86ff, 0x1590, 0x6010, 0x2058, 0xb800,
+	0xd0bc, 0x1904, 0xae05, 0xa87b, 0x0000, 0xa867, 0x0103, 0xae76,
+	0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xaea7,
+	0x080c, 0x67a5, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211,
+	0xba3e, 0xb8c0, 0x9005, 0x0110, 0x080c, 0x6394, 0x601c, 0xd0fc,
+	0x1148, 0x7044, 0xd0e4, 0x1904, 0xade9, 0x080c, 0x9bcc, 0x009e,
+	0x00be, 0x0005, 0x2009, 0x0211, 0x210c, 0x080c, 0x0d65, 0x968c,
+	0x0c00, 0x0150, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xaded,
+	0x7348, 0xab92, 0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186, 0x0002,
+	0x0508, 0x9186, 0x0028, 0x1118, 0xa87b, 0x001c, 0x00e8, 0xd6dc,
+	0x01a0, 0xa87b, 0x0015, 0xa87c, 0xd0ac, 0x0170, 0xa938, 0xaa34,
+	0x2100, 0x9205, 0x0148, 0x7048, 0x9106, 0x1118, 0x704c, 0x9206,
+	0x0118, 0xa992, 0xaa8e, 0xc6dc, 0x0038, 0xd6d4, 0x0118, 0xa87b,
+	0x0007, 0x0010, 0xa87b, 0x0000, 0xa867, 0x0103, 0xae76, 0x901e,
+	0xd6c4, 0x01d8, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118,
+	0xc6c4, 0x0804, 0xad33, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a,
+	0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0x0018,
+	0x2011, 0x0025, 0x080c, 0xb3ff, 0x003e, 0xd6cc, 0x0904, 0xad48,
+	0x7154, 0xa98a, 0x81ff, 0x0904, 0xad48, 0x9192, 0x0021, 0x1278,
+	0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xb3ff, 0x2011,
+	0x0205, 0x2013, 0x0000, 0x080c, 0xbeeb, 0x0804, 0xad48, 0xa868,
+	0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c50, 0x00a6, 0x2950,
+	0x080c, 0xb39e, 0x00ae, 0x080c, 0xbeeb, 0x080c, 0xb3ef, 0x0804,
+	0xad4a, 0x080c, 0xbb34, 0x0804, 0xad5f, 0xa87c, 0xd0ac, 0x0904,
+	0xad70, 0xa880, 0xd0bc, 0x1904, 0xad70, 0x7348, 0xa838, 0x9306,
+	0x11c8, 0x734c, 0xa834, 0x931e, 0x0904, 0xad70, 0xd6d4, 0x0190,
+	0xab38, 0x9305, 0x0904, 0xad70, 0x0068, 0xa87c, 0xd0ac, 0x0904,
+	0xad3b, 0xa838, 0xa934, 0x9105, 0x0904, 0xad3b, 0xa880, 0xd0bc,
+	0x1904, 0xad3b, 0x080c, 0xbb71, 0x0804, 0xad5f, 0x00f6, 0x2079,
+	0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x00fe, 0x0021, 0x0005,
+	0x0011, 0x0005, 0x0005, 0x0096, 0x6003, 0x0002, 0x6007, 0x0043,
+	0x6014, 0x2048, 0xa87c, 0xd0ac, 0x0128, 0x009e, 0x0005, 0x2130,
+	0x2228, 0x0058, 0x2400, 0xa9ac, 0x910a, 0x2300, 0xaab0, 0x9213,
+	0x2600, 0x9102, 0x2500, 0x9203, 0x0e90, 0xac46, 0xab4a, 0xae36,
+	0xad3a, 0x6044, 0xd0fc, 0x190c, 0x98d6, 0x604b, 0x0000, 0x080c,
+	0x1ad2, 0x1118, 0x6144, 0x080c, 0x84d5, 0x009e, 0x0005, 0x9182,
+	0x0057, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xae6e,
+	0xae6e, 0xae6e, 0xae6e, 0xae6e, 0xae6e, 0xae6e, 0xae6e, 0xae6e,
+	0xae6e, 0xae70, 0xae6e, 0xae6e, 0xae6e, 0xae6e, 0xae81, 0xae6e,
+	0xae6e, 0xae6e, 0xae6e, 0xaea5, 0xae6e, 0xae6e, 0x080c, 0x0d65,
+	0x6004, 0x9086, 0x0040, 0x1110, 0x080c, 0x884c, 0x2019, 0x0001,
+	0x080c, 0x926b, 0x6003, 0x0002, 0x080c, 0xbf63, 0x080c, 0x88a9,
+	0x0005, 0x6004, 0x9086, 0x0040, 0x1110, 0x080c, 0x884c, 0x2019,
+	0x0001, 0x080c, 0x926b, 0x080c, 0x88a9, 0x080c, 0x3003, 0x080c,
+	0xbf5b, 0x0096, 0x6114, 0x2148, 0x080c, 0xb82c, 0x0150, 0xa867,
+	0x0103, 0xa87b, 0x0029, 0xa877, 0x0000, 0x080c, 0x698f, 0x080c,
+	0xba1b, 0x009e, 0x080c, 0x9bcc, 0x0005, 0x080c, 0x0d65, 0xa87b,
+	0x0015, 0xd1fc, 0x0180, 0xa87b, 0x0007, 0x8002, 0x8000, 0x810a,
+	0x9189, 0x0000, 0x0006, 0x0016, 0x2009, 0x1a48, 0x2104, 0x8000,
+	0x200a, 0x001e, 0x000e, 0xa992, 0xa88e, 0x0005, 0x9182, 0x0057,
+	0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xaedd, 0xaedd,
+	0xaedd, 0xaedd, 0xaedd, 0xaedf, 0xaedd, 0xaedd, 0xaf9c, 0xaedd,
+	0xaedd, 0xaedd, 0xaedd, 0xaedd, 0xaedd, 0xaedd, 0xaedd, 0xaedd,
+	0xaedd, 0xb0e0, 0xaedd, 0xb0ea, 0xaedd, 0x080c, 0x0d65, 0x601c,
+	0xd0bc, 0x0178, 0xd084, 0x0168, 0xd0f4, 0x0120, 0xc084, 0x601e,
+	0x0804, 0xaccf, 0x6114, 0x0096, 0x2148, 0xa87c, 0xc0e5, 0xa87e,
+	0x009e, 0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260, 0x6114,
+	0x2150, 0x601c, 0xd0fc, 0x1110, 0x7644, 0x0008, 0x9036, 0xb676,
+	0x96b4, 0x0fff, 0xb77c, 0xc7e5, 0xb77e, 0x6210, 0x00b6, 0x2258,
+	0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0x00be, 0x86ff, 0x0904,
+	0xaf95, 0x9694, 0xff00, 0x9284, 0x0c00, 0x0120, 0x7048, 0xb092,
+	0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, 0xaf95, 0x9686, 0x0100,
+	0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4, 0xb676, 0x0c38, 0x080c,
+	0x1022, 0x090c, 0x0d65, 0x2900, 0xb07a, 0xb77c, 0x97bd, 0x0200,
+	0xb77e, 0xa867, 0x0103, 0xb068, 0xa86a, 0xb06c, 0xa86e, 0xb070,
+	0xa872, 0x7044, 0x9084, 0xf000, 0x9635, 0xae76, 0x968c, 0x0c00,
+	0x0120, 0x7348, 0xab92, 0x734c, 0xab8e, 0x968c, 0x00ff, 0x9186,
+	0x0002, 0x0180, 0x9186, 0x0028, 0x1118, 0xa87b, 0x001c, 0x0060,
+	0xd6dc, 0x0118, 0xa87b, 0x0015, 0x0038, 0xd6d4, 0x0118, 0xa87b,
+	0x0007, 0x0010, 0xa87b, 0x0000, 0xaf7e, 0xb080, 0xa882, 0xb084,
+	0xa886, 0x901e, 0xd6c4, 0x0190, 0x735c, 0xab86, 0x83ff, 0x0170,
 	0x938a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019,
-	0x0018, 0x2011, 0x0025, 0x080c, 0xb298, 0x003e, 0xd6cc, 0x0904,
-	0xabe1, 0x7154, 0xa98a, 0x81ff, 0x0904, 0xabe1, 0x9192, 0x0021,
-	0x1278, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xb298,
-	0x2011, 0x0205, 0x2013, 0x0000, 0x080c, 0xbd7c, 0x0804, 0xabe1,
-	0xa868, 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c50, 0x00a6,
-	0x2950, 0x080c, 0xb237, 0x00ae, 0x080c, 0xbd7c, 0x080c, 0xb288,
-	0x0804, 0xabe3, 0x080c, 0xb9c6, 0x0804, 0xabf8, 0xa87c, 0xd0ac,
-	0x0904, 0xac09, 0xa880, 0xd0bc, 0x1904, 0xac09, 0x7348, 0xa838,
-	0x9306, 0x11c8, 0x734c, 0xa834, 0x931e, 0x0904, 0xac09, 0xd6d4,
-	0x0190, 0xab38, 0x9305, 0x0904, 0xac09, 0x0068, 0xa87c, 0xd0ac,
-	0x0904, 0xabd4, 0xa838, 0xa934, 0x9105, 0x0904, 0xabd4, 0xa880,
-	0xd0bc, 0x1904, 0xabd4, 0x080c, 0xba03, 0x0804, 0xabf8, 0x00f6,
-	0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x00fe, 0x0021,
-	0x0005, 0x0011, 0x0005, 0x0005, 0x0096, 0x6003, 0x0002, 0x6007,
-	0x0043, 0x6014, 0x2048, 0xa87c, 0xd0ac, 0x0128, 0x009e, 0x0005,
-	0x2130, 0x2228, 0x0058, 0x2400, 0xa9ac, 0x910a, 0x2300, 0xaab0,
-	0x9213, 0x2600, 0x9102, 0x2500, 0x9203, 0x0e90, 0xac46, 0xab4a,
-	0xae36, 0xad3a, 0x6044, 0xd0fc, 0x190c, 0x976f, 0x604b, 0x0000,
-	0x080c, 0x1aa5, 0x1118, 0x6144, 0x080c, 0x835a, 0x009e, 0x0005,
-	0x9182, 0x0057, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005,
-	0xad07, 0xad07, 0xad07, 0xad07, 0xad07, 0xad07, 0xad07, 0xad07,
-	0xad07, 0xad07, 0xad09, 0xad07, 0xad07, 0xad07, 0xad07, 0xad1a,
-	0xad07, 0xad07, 0xad07, 0xad07, 0xad3e, 0xad07, 0xad07, 0x080c,
-	0x0d65, 0x6004, 0x9086, 0x0040, 0x1110, 0x080c, 0x86d1, 0x2019,
-	0x0001, 0x080c, 0x90f0, 0x6003, 0x0002, 0x080c, 0xbdf4, 0x080c,
-	0x872e, 0x0005, 0x6004, 0x9086, 0x0040, 0x1110, 0x080c, 0x86d1,
-	0x2019, 0x0001, 0x080c, 0x90f0, 0x080c, 0x872e, 0x080c, 0x2fc1,
-	0x080c, 0xbdec, 0x0096, 0x6114, 0x2148, 0x080c, 0xb6c5, 0x0150,
-	0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, 0x0000, 0x080c, 0x683f,
-	0x080c, 0xb8ad, 0x009e, 0x080c, 0x9a65, 0x0005, 0x080c, 0x0d65,
-	0xa87b, 0x0015, 0xd1fc, 0x0180, 0xa87b, 0x0007, 0x8002, 0x8000,
-	0x810a, 0x9189, 0x0000, 0x0006, 0x0016, 0x2009, 0x1a46, 0x2104,
-	0x8000, 0x200a, 0x001e, 0x000e, 0xa992, 0xa88e, 0x0005, 0x9182,
-	0x0057, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xad76,
-	0xad76, 0xad76, 0xad76, 0xad76, 0xad78, 0xad76, 0xad76, 0xae35,
-	0xad76, 0xad76, 0xad76, 0xad76, 0xad76, 0xad76, 0xad76, 0xad76,
-	0xad76, 0xad76, 0xaf79, 0xad76, 0xaf83, 0xad76, 0x080c, 0x0d65,
-	0x601c, 0xd0bc, 0x0178, 0xd084, 0x0168, 0xd0f4, 0x0120, 0xc084,
-	0x601e, 0x0804, 0xab68, 0x6114, 0x0096, 0x2148, 0xa87c, 0xc0e5,
-	0xa87e, 0x009e, 0x0076, 0x00a6, 0x00e6, 0x0096, 0x2071, 0x0260,
-	0x6114, 0x2150, 0x601c, 0xd0fc, 0x1110, 0x7644, 0x0008, 0x9036,
-	0xb676, 0x96b4, 0x0fff, 0xb77c, 0xc7e5, 0xb77e, 0x6210, 0x00b6,
-	0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0x00be, 0x86ff,
-	0x0904, 0xae2e, 0x9694, 0xff00, 0x9284, 0x0c00, 0x0120, 0x7048,
-	0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, 0xae2e, 0x9686,
-	0x0100, 0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4, 0xb676, 0x0c38,
-	0x080c, 0x1023, 0x090c, 0x0d65, 0x2900, 0xb07a, 0xb77c, 0x97bd,
-	0x0200, 0xb77e, 0xa867, 0x0103, 0xb068, 0xa86a, 0xb06c, 0xa86e,
-	0xb070, 0xa872, 0x7044, 0x9084, 0xf000, 0x9635, 0xae76, 0x968c,
-	0x0c00, 0x0120, 0x7348, 0xab92, 0x734c, 0xab8e, 0x968c, 0x00ff,
-	0x9186, 0x0002, 0x0180, 0x9186, 0x0028, 0x1118, 0xa87b, 0x001c,
-	0x0060, 0xd6dc, 0x0118, 0xa87b, 0x0015, 0x0038, 0xd6d4, 0x0118,
-	0xa87b, 0x0007, 0x0010, 0xa87b, 0x0000, 0xaf7e, 0xb080, 0xa882,
-	0xb084, 0xa886, 0x901e, 0xd6c4, 0x0190, 0x735c, 0xab86, 0x83ff,
-	0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308,
-	0x2019, 0x0018, 0x2011, 0x0025, 0x080c, 0xb298, 0x003e, 0xd6cc,
-	0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8, 0x9192, 0x0021, 0x1260,
-	0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xb298, 0x2011,
-	0x0205, 0x2013, 0x0000, 0x0050, 0xb068, 0xd0fc, 0x0120, 0x2009,
-	0x0020, 0xa98a, 0x0c68, 0x2950, 0x080c, 0xb237, 0x080c, 0x18d2,
-	0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005, 0x2001, 0x1957, 0x2004,
-	0x604a, 0x0096, 0x6114, 0x2148, 0xa83c, 0xa940, 0x9105, 0x1118,
-	0xa87c, 0xc0dc, 0xa87e, 0x6003, 0x0002, 0x080c, 0xbdfd, 0x0904,
-	0xaf74, 0x604b, 0x0000, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be,
-	0xd0bc, 0x1500, 0xd1cc, 0x0904, 0xaf33, 0xa978, 0xa868, 0xd0fc,
-	0x0904, 0xaef4, 0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, 0x00a6,
-	0x2150, 0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x0904, 0xaec2,
-	0x9086, 0x0028, 0x1904, 0xaeae, 0xa87b, 0x001c, 0xb07b, 0x001c,
-	0x0804, 0xaeca, 0x6024, 0xd0f4, 0x11d0, 0xa838, 0xaa34, 0x9205,
-	0x09c8, 0xa838, 0xaa90, 0x9206, 0x1120, 0xa88c, 0xaa34, 0x9206,
-	0x0988, 0x6024, 0xd0d4, 0x1148, 0xa9ac, 0xa834, 0x9102, 0x603a,
-	0xa9b0, 0xa838, 0x9103, 0x603e, 0x6024, 0xc0f5, 0x6026, 0x6010,
-	0x00b6, 0x2058, 0xb83c, 0x8000, 0xb83e, 0x00be, 0x601c, 0xc0fc,
-	0x601e, 0x9006, 0xa876, 0xa892, 0xa88e, 0xa87c, 0xc0e4, 0xa87e,
-	0xd0cc, 0x0140, 0xc0cc, 0xa87e, 0x0096, 0xa878, 0x2048, 0x080c,
-	0x0fd5, 0x009e, 0x080c, 0xba03, 0x0804, 0xaf74, 0xd1dc, 0x0158,
-	0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xbc9f, 0x0118, 0xb174,
-	0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b,
-	0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115,
-	0x190c, 0xad40, 0xa87c, 0xb07e, 0xa890, 0xb092, 0xa88c, 0xb08e,
-	0xa860, 0x20e8, 0xa85c, 0x9080, 0x0019, 0x20a0, 0x20a9, 0x0020,
-	0x8a06, 0x8006, 0x8007, 0x9094, 0x003f, 0x22e0, 0x9084, 0xffc0,
-	0x9080, 0x0019, 0x2098, 0x4003, 0x00ae, 0x000e, 0xa882, 0x000e,
-	0xa87e, 0x080c, 0xbd7c, 0x001e, 0xa874, 0x0006, 0x2148, 0x080c,
-	0x0fd5, 0x001e, 0x0804, 0xaf60, 0x0016, 0x00a6, 0x2150, 0xb174,
-	0x9184, 0x00ff, 0x90b6, 0x0002, 0x01e0, 0x9086, 0x0028, 0x1128,
-	0xa87b, 0x001c, 0xb07b, 0x001c, 0x00e0, 0xd1dc, 0x0158, 0xa87b,
-	0x0015, 0xb07b, 0x0015, 0x080c, 0xbc9f, 0x0118, 0xb174, 0xc1dc,
+	0x0018, 0x2011, 0x0025, 0x080c, 0xb3ff, 0x003e, 0xd6cc, 0x01e8,
+	0x7154, 0xa98a, 0x81ff, 0x01c8, 0x9192, 0x0021, 0x1260, 0x8304,
+	0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xb3ff, 0x2011, 0x0205,
+	0x2013, 0x0000, 0x0050, 0xb068, 0xd0fc, 0x0120, 0x2009, 0x0020,
+	0xa98a, 0x0c68, 0x2950, 0x080c, 0xb39e, 0x080c, 0x18f2, 0x009e,
+	0x00ee, 0x00ae, 0x007e, 0x0005, 0x2001, 0x1959, 0x2004, 0x604a,
+	0x0096, 0x6114, 0x2148, 0xa83c, 0xa940, 0x9105, 0x1118, 0xa87c,
+	0xc0dc, 0xa87e, 0x6003, 0x0002, 0x080c, 0xbf6c, 0x0904, 0xb0db,
+	0x604b, 0x0000, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc,
+	0x1500, 0xd1cc, 0x0904, 0xb09a, 0xa978, 0xa868, 0xd0fc, 0x0904,
+	0xb05b, 0x0016, 0xa87c, 0x0006, 0xa880, 0x0006, 0x00a6, 0x2150,
+	0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x0904, 0xb029, 0x9086,
+	0x0028, 0x1904, 0xb015, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x0804,
+	0xb031, 0x6024, 0xd0f4, 0x11d0, 0xa838, 0xaa34, 0x9205, 0x09c8,
+	0xa838, 0xaa90, 0x9206, 0x1120, 0xa88c, 0xaa34, 0x9206, 0x0988,
+	0x6024, 0xd0d4, 0x1148, 0xa9ac, 0xa834, 0x9102, 0x603a, 0xa9b0,
+	0xa838, 0x9103, 0x603e, 0x6024, 0xc0f5, 0x6026, 0x6010, 0x00b6,
+	0x2058, 0xb83c, 0x8000, 0xb83e, 0x00be, 0x601c, 0xc0fc, 0x601e,
+	0x9006, 0xa876, 0xa892, 0xa88e, 0xa87c, 0xc0e4, 0xa87e, 0xd0cc,
+	0x0140, 0xc0cc, 0xa87e, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fd4,
+	0x009e, 0x080c, 0xbb71, 0x0804, 0xb0db, 0xd1dc, 0x0158, 0xa87b,
+	0x0015, 0xb07b, 0x0015, 0x080c, 0xbe0e, 0x0118, 0xb174, 0xc1dc,
 	0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, 0x0007,
 	0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c,
-	0xad40, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa87c, 0xb07e, 0x00ae,
-	0x080c, 0x0fd5, 0x009e, 0x080c, 0xbd7c, 0xa974, 0x0016, 0x080c,
-	0xb288, 0x001e, 0x0468, 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff,
-	0x90b6, 0x0002, 0x01b0, 0x9086, 0x0028, 0x1118, 0xa87b, 0x001c,
-	0x00d0, 0xd1dc, 0x0148, 0xa87b, 0x0015, 0x080c, 0xbc9f, 0x0118,
-	0xa974, 0xc1dc, 0xa976, 0x0078, 0xd1d4, 0x0118, 0xa87b, 0x0007,
-	0x0050, 0xa87b, 0x0000, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938,
-	0x9115, 0x190c, 0xad40, 0xa974, 0x0016, 0x080c, 0x6655, 0x001e,
-	0x6010, 0x00b6, 0x2058, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e,
-	0xb8c0, 0x9005, 0x0120, 0x0016, 0x080c, 0x6291, 0x001e, 0x00be,
-	0xd1e4, 0x1120, 0x080c, 0x9a65, 0x009e, 0x0005, 0x080c, 0xb9c6,
-	0x0cd8, 0x6114, 0x0096, 0x2148, 0xa97c, 0x080c, 0xbdfd, 0x190c,
-	0x18e0, 0x009e, 0x0005, 0x0096, 0x6114, 0x2148, 0xa83c, 0xa940,
-	0x9105, 0x01e8, 0xa877, 0x0000, 0xa87b, 0x0000, 0xa867, 0x0103,
-	0x00b6, 0x6010, 0x2058, 0xa834, 0xa938, 0x9115, 0x11a0, 0x080c,
-	0x6655, 0xba3c, 0x8211, 0x0208, 0xba3e, 0xb8c0, 0x9005, 0x0110,
-	0x080c, 0x6291, 0x080c, 0x9a65, 0x00be, 0x009e, 0x0005, 0xa87c,
-	0xc0dc, 0xa87e, 0x08f8, 0xb800, 0xd0bc, 0x1120, 0xa834, 0x080c,
-	0xad40, 0x0c28, 0xa880, 0xd0bc, 0x1dc8, 0x080c, 0xba03, 0x0c60,
-	0x080c, 0x86d1, 0x0010, 0x080c, 0x872e, 0x601c, 0xd084, 0x0110,
-	0x080c, 0x18f4, 0x080c, 0xb6c5, 0x01f0, 0x0096, 0x6114, 0x2148,
-	0x080c, 0xb8d3, 0x1118, 0x080c, 0xa40d, 0x00a0, 0xa867, 0x0103,
-	0x2009, 0x180c, 0x210c, 0xd18c, 0x1198, 0xd184, 0x1170, 0x6108,
-	0xa97a, 0x918e, 0x0029, 0x1110, 0x080c, 0xd370, 0xa877, 0x0000,
-	0x080c, 0x683f, 0x009e, 0x0804, 0x9a9f, 0xa87b, 0x0004, 0x0cb0,
-	0xa87b, 0x0004, 0x0c98, 0x9182, 0x0057, 0x1220, 0x9182, 0x0040,
-	0x0208, 0x000a, 0x0005, 0xb00a, 0xb00a, 0xb00a, 0xb00a, 0xb00a,
-	0xb00c, 0xb00a, 0xb00a, 0xb00a, 0xb00a, 0xb00a, 0xb00a, 0xb00a,
-	0xb00a, 0xb00a, 0xb00a, 0xb00a, 0xb00a, 0xb00a, 0xb00a, 0xb030,
-	0xb00a, 0xb00a, 0x080c, 0x0d65, 0x080c, 0x52a5, 0x01f8, 0x6014,
-	0x7144, 0x918c, 0x0fff, 0x9016, 0xd1c4, 0x0118, 0x7264, 0x9294,
-	0x00ff, 0x0096, 0x904d, 0x0188, 0xa87b, 0x0000, 0xa864, 0x9086,
-	0x0139, 0x0128, 0xa867, 0x0103, 0xa976, 0xaa96, 0x0030, 0xa897,
-	0x4000, 0xa99a, 0xaa9e, 0x080c, 0x683f, 0x009e, 0x0804, 0x9a65,
-	0x080c, 0x52a5, 0x0dd8, 0x6014, 0x900e, 0x9016, 0x0c10, 0x9182,
-	0x0085, 0x0002, 0xb049, 0xb047, 0xb047, 0xb055, 0xb047, 0xb047,
-	0xb047, 0xb047, 0xb047, 0xb047, 0xb047, 0xb047, 0xb047, 0x080c,
-	0x0d65, 0x6003, 0x0001, 0x6106, 0x0126, 0x2091, 0x8000, 0x2009,
-	0x8020, 0x080c, 0x832e, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6,
-	0x00e6, 0x2071, 0x0260, 0x7224, 0x6216, 0x7220, 0x080c, 0xb6b3,
-	0x01a0, 0x2268, 0x6800, 0x9086, 0x0000, 0x0178, 0x6010, 0x6d10,
-	0x952e, 0x1158, 0x00c6, 0x2d60, 0x080c, 0xb2c3, 0x00ce, 0x0128,
-	0x6803, 0x0002, 0x6007, 0x0086, 0x0010, 0x6007, 0x0087, 0x6003,
-	0x0001, 0x2009, 0x8020, 0x080c, 0x832e, 0x9280, 0x0004, 0x00b6,
-	0x2058, 0xb800, 0x00be, 0xd0bc, 0x0140, 0x6824, 0xd0ec, 0x0128,
-	0x00c6, 0x2260, 0x080c, 0xba03, 0x00ce, 0x00ee, 0x00de, 0x005e,
-	0x002e, 0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085,
-	0x0a0c, 0x0d65, 0x908a, 0x0092, 0x1a0c, 0x0d65, 0x9082, 0x0085,
-	0x00e2, 0x9186, 0x0027, 0x0120, 0x9186, 0x0014, 0x190c, 0x0d65,
-	0x080c, 0x86d1, 0x0096, 0x6014, 0x2048, 0x080c, 0xb6c5, 0x0140,
-	0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x683f,
-	0x009e, 0x080c, 0x9a9f, 0x0804, 0x8793, 0xb0ca, 0xb0cc, 0xb0cc,
-	0xb0ca, 0xb0ca, 0xb0ca, 0xb0ca, 0xb0ca, 0xb0ca, 0xb0ca, 0xb0ca,
-	0xb0ca, 0xb0ca, 0x080c, 0x0d65, 0x080c, 0x9a9f, 0x0005, 0x9186,
-	0x0013, 0x1130, 0x6004, 0x9082, 0x0085, 0x2008, 0x0804, 0xb11b,
-	0x9186, 0x0027, 0x1558, 0x080c, 0x86d1, 0x080c, 0x2fc1, 0x080c,
-	0xbdec, 0x0096, 0x6014, 0x2048, 0x080c, 0xb6c5, 0x0150, 0xa867,
-	0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x683f, 0x080c,
-	0xb8ad, 0x009e, 0x080c, 0x9a65, 0x0005, 0x9186, 0x0089, 0x0118,
-	0x9186, 0x008a, 0x1140, 0x080c, 0x9935, 0x0128, 0x9086, 0x000c,
-	0x0904, 0xb153, 0x0000, 0x080c, 0x9b20, 0x0c70, 0x9186, 0x0014,
-	0x1d60, 0x080c, 0x86d1, 0x0096, 0x6014, 0x2048, 0x080c, 0xb6c5,
-	0x0d00, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0006, 0xa880,
-	0xc0ec, 0xa882, 0x0890, 0x0002, 0xb12b, 0xb129, 0xb129, 0xb129,
-	0xb129, 0xb129, 0xb13f, 0xb129, 0xb129, 0xb129, 0xb129, 0xb129,
-	0xb129, 0x080c, 0x0d65, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186,
-	0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1955, 0x0010,
-	0x2001, 0x1956, 0x2004, 0x601a, 0x6003, 0x000c, 0x0005, 0x6034,
-	0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035,
-	0x1118, 0x2001, 0x1955, 0x0010, 0x2001, 0x1956, 0x2004, 0x601a,
-	0x6003, 0x000e, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085,
-	0x0208, 0x0012, 0x0804, 0x9b20, 0xb169, 0xb169, 0xb169, 0xb169,
-	0xb16b, 0xb1b8, 0xb169, 0xb169, 0xb169, 0xb169, 0xb169, 0xb169,
-	0xb169, 0x080c, 0x0d65, 0x0096, 0x6010, 0x00b6, 0x2058, 0xb800,
-	0x00be, 0xd0bc, 0x0168, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186,
-	0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x009e, 0x0804, 0xb1cc,
-	0x080c, 0xb6c5, 0x1118, 0x080c, 0xb8ad, 0x0068, 0x6014, 0x2048,
-	0x080c, 0xbe03, 0x1110, 0x080c, 0xb8ad, 0xa867, 0x0103, 0x080c,
-	0xbdb7, 0x080c, 0x683f, 0x00d6, 0x2c68, 0x080c, 0x9a0f, 0x01d0,
-	0x6003, 0x0001, 0x6007, 0x001e, 0x600b, 0xffff, 0x2009, 0x026e,
-	0x210c, 0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x6910, 0x6112,
-	0x080c, 0xbb52, 0x695c, 0x615e, 0x6023, 0x0001, 0x2009, 0x8020,
-	0x080c, 0x832e, 0x2d60, 0x00de, 0x080c, 0x9a65, 0x009e, 0x0005,
-	0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x05a0, 0x6034,
-	0x908c, 0xff00, 0x810f, 0x9186, 0x0035, 0x0130, 0x9186, 0x001e,
-	0x0118, 0x9186, 0x0039, 0x1538, 0x00d6, 0x2c68, 0x080c, 0xbd4f,
-	0x11f0, 0x080c, 0x9a0f, 0x01d8, 0x6106, 0x6003, 0x0001, 0x6023,
-	0x0001, 0x6910, 0x6112, 0x692c, 0x612e, 0x6930, 0x6132, 0x6934,
-	0x918c, 0x00ff, 0x6136, 0x6938, 0x613a, 0x693c, 0x613e, 0x695c,
-	0x615e, 0x080c, 0xbb52, 0x2009, 0x8020, 0x080c, 0x832e, 0x2d60,
-	0x00de, 0x0804, 0x9a65, 0x0096, 0x6014, 0x2048, 0x080c, 0xb6c5,
-	0x01c8, 0xa867, 0x0103, 0xa880, 0xd0b4, 0x0128, 0xc0ec, 0xa882,
-	0xa87b, 0x0006, 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020,
-	0xa87b, 0x0005, 0x080c, 0xb9c2, 0xa877, 0x0000, 0x080c, 0x683f,
-	0x080c, 0xb8ad, 0x009e, 0x0804, 0x9a65, 0x0016, 0x0096, 0x6014,
-	0x2048, 0x080c, 0xb6c5, 0x0140, 0xa867, 0x0103, 0xa87b, 0x0028,
-	0xa877, 0x0000, 0x080c, 0x683f, 0x009e, 0x001e, 0x9186, 0x0013,
-	0x0158, 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c,
-	0x9b20, 0x0020, 0x080c, 0x86d1, 0x080c, 0x9a9f, 0x0005, 0x0056,
-	0x0066, 0x0096, 0x00a6, 0x2029, 0x0001, 0x9182, 0x0101, 0x1208,
-	0x0010, 0x2009, 0x0100, 0x2130, 0x8304, 0x9098, 0x0018, 0x2009,
-	0x0020, 0x2011, 0x0029, 0x080c, 0xb298, 0x96b2, 0x0020, 0xb004,
-	0x904d, 0x0110, 0x080c, 0x0fd5, 0x080c, 0x1023, 0x0520, 0x8528,
-	0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d,
-	0x1228, 0x2608, 0x2011, 0x001b, 0x0499, 0x00a8, 0x96b2, 0x003c,
-	0x2009, 0x003c, 0x2950, 0x2011, 0x001b, 0x0451, 0x0c28, 0x2001,
-	0x0205, 0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0003, 0xb566,
-	0x95ac, 0x0000, 0x0048, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae,
-	0x852f, 0x95ad, 0x0003, 0xb566, 0x009e, 0x006e, 0x005e, 0x0005,
-	0x00a6, 0x89ff, 0x0158, 0xa804, 0x9055, 0x0130, 0xa807, 0x0000,
-	0x080c, 0x683f, 0x2a48, 0x0cb8, 0x080c, 0x683f, 0x00ae, 0x0005,
-	0x00f6, 0x2079, 0x0200, 0x7814, 0x9085, 0x0080, 0x7816, 0xd184,
-	0x0108, 0x8108, 0x810c, 0x20a9, 0x0001, 0xa860, 0x20e8, 0xa85c,
-	0x9200, 0x20a0, 0x20e1, 0x0000, 0x2300, 0x9e00, 0x2098, 0x4003,
-	0x8318, 0x9386, 0x0020, 0x1148, 0x2018, 0x2300, 0x9e00, 0x2098,
-	0x7814, 0x8000, 0x9085, 0x0080, 0x7816, 0x8109, 0x1d80, 0x7817,
-	0x0000, 0x00fe, 0x0005, 0x0066, 0x0126, 0x2091, 0x8000, 0x2031,
-	0x0001, 0x6020, 0x9084, 0x000f, 0x0083, 0x012e, 0x006e, 0x0005,
-	0x0126, 0x2091, 0x8000, 0x0066, 0x2031, 0x0000, 0x6020, 0x9084,
-	0x000f, 0x001b, 0x006e, 0x012e, 0x0005, 0xb315, 0xb315, 0xb310,
-	0xb339, 0xb2ed, 0xb310, 0xb2ef, 0xb310, 0xb2ed, 0xb2ed, 0xb310,
-	0xb310, 0xb310, 0xb2ed, 0xb2ed, 0xb2ed, 0x080c, 0x0d65, 0x6010,
-	0x9080, 0x0000, 0x2004, 0xd0bc, 0x190c, 0xb339, 0x0036, 0x6014,
-	0x0096, 0x2048, 0xa880, 0x009e, 0xd0cc, 0x0118, 0x2019, 0x000c,
-	0x0038, 0xd094, 0x0118, 0x2019, 0x000d, 0x0010, 0x2019, 0x0010,
-	0x080c, 0xcc56, 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005,
-	0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x0096, 0x86ff, 0x11e8,
-	0x6014, 0x2048, 0x080c, 0xb6c5, 0x01d0, 0x6043, 0xffff, 0xa864,
-	0x9086, 0x0139, 0x1128, 0xa87b, 0x0005, 0xa883, 0x0000, 0x0028,
-	0x900e, 0x2001, 0x0005, 0x080c, 0x6a5c, 0x080c, 0xb9c2, 0x080c,
-	0x6833, 0x080c, 0x9a9f, 0x9085, 0x0001, 0x009e, 0x0005, 0x9006,
-	0x0ce0, 0x080c, 0x9746, 0x080c, 0xbe11, 0x6000, 0x908a, 0x0016,
-	0x1a0c, 0x0d65, 0x002b, 0x0106, 0x080c, 0x9762, 0x010e, 0x0005,
-	0xb358, 0xb386, 0xb35a, 0xb3ad, 0xb381, 0xb358, 0xb310, 0xb315,
-	0xb315, 0xb310, 0xb310, 0xb310, 0xb310, 0xb310, 0xb310, 0xb310,
-	0x080c, 0x0d65, 0x86ff, 0x1510, 0x6020, 0x9086, 0x0006, 0x01f0,
-	0x0096, 0x6014, 0x2048, 0x080c, 0xb6c5, 0x0158, 0xa87c, 0xd0cc,
-	0x0130, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fd5, 0x009e, 0x080c,
-	0xb9c2, 0x009e, 0x080c, 0xbd91, 0x6007, 0x0085, 0x6003, 0x000b,
-	0x6023, 0x0002, 0x2009, 0x8020, 0x080c, 0x8310, 0x9085, 0x0001,
-	0x0005, 0x0066, 0x080c, 0x18f4, 0x006e, 0x08a0, 0x00e6, 0x2071,
-	0x19b6, 0x7030, 0x9c06, 0x1120, 0x080c, 0x9070, 0x00ee, 0x0850,
-	0x6020, 0x9084, 0x000f, 0x9086, 0x0006, 0x1150, 0x0086, 0x0096,
-	0x2049, 0x0001, 0x2c40, 0x080c, 0x9200, 0x009e, 0x008e, 0x0040,
-	0x0066, 0x080c, 0x8f6c, 0x190c, 0x0d65, 0x080c, 0x8f7a, 0x006e,
-	0x00ee, 0x1904, 0xb35a, 0x0804, 0xb310, 0x0036, 0x00e6, 0x2071,
-	0x19b6, 0x704c, 0x9c06, 0x1138, 0x901e, 0x080c, 0x90f0, 0x00ee,
-	0x003e, 0x0804, 0xb35a, 0x080c, 0x9336, 0x00ee, 0x003e, 0x1904,
-	0xb35a, 0x0804, 0xb310, 0x00c6, 0x0066, 0x6020, 0x9084, 0x000f,
-	0x001b, 0x006e, 0x00ce, 0x0005, 0xb3e3, 0xb4a5, 0xb60c, 0xb3eb,
-	0x9a9f, 0xb3e3, 0xcc48, 0xbdf9, 0xb4a5, 0xb3dc, 0xb68b, 0xb3dc,
-	0xb3dc, 0xb3dc, 0xb3dc, 0xb3dc, 0x080c, 0x0d65, 0x080c, 0xb8d3,
-	0x1110, 0x080c, 0xa40d, 0x0005, 0x080c, 0x86d1, 0x0804, 0x9a65,
-	0x601b, 0x0001, 0x0005, 0x080c, 0xb6c5, 0x0130, 0x6014, 0x0096,
-	0x2048, 0x2c00, 0xa896, 0x009e, 0x080c, 0x9746, 0x080c, 0xbe11,
-	0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d65, 0x0013, 0x0804, 0x9762,
-	0xb410, 0xb412, 0xb43c, 0xb450, 0xb47b, 0xb410, 0xb3e3, 0xb3e3,
-	0xb3e3, 0xb457, 0xb457, 0xb410, 0xb410, 0xb410, 0xb410, 0xb461,
-	0x080c, 0x0d65, 0x00e6, 0x6014, 0x0096, 0x2048, 0xa880, 0xc0b5,
-	0xa882, 0x009e, 0x2071, 0x19b6, 0x7030, 0x9c06, 0x01d0, 0x0066,
-	0x080c, 0x8f6c, 0x190c, 0x0d65, 0x080c, 0x8f7a, 0x006e, 0x080c,
-	0xbd91, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x2001,
-	0x1956, 0x2004, 0x601a, 0x2009, 0x8020, 0x080c, 0x8310, 0x00ee,
-	0x0005, 0x601b, 0x0001, 0x0cd8, 0x0096, 0x6014, 0x2048, 0xa880,
-	0xc0b5, 0xa882, 0x009e, 0x080c, 0xbd91, 0x6007, 0x0085, 0x6003,
-	0x000b, 0x6023, 0x0002, 0x2009, 0x8020, 0x080c, 0x8310, 0x0005,
-	0x080c, 0x9746, 0x080c, 0x98b7, 0x080c, 0x9762, 0x0c28, 0x0096,
-	0x601b, 0x0001, 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e,
-	0x0005, 0x080c, 0x52a5, 0x01a8, 0x6014, 0x0096, 0x904d, 0x0180,
-	0xa864, 0xa867, 0x0103, 0xa87b, 0x0006, 0x9086, 0x0139, 0x1140,
-	0xa867, 0x0139, 0xa897, 0x4005, 0xa89b, 0x0004, 0x080c, 0x683f,
-	0x009e, 0x0804, 0x9a65, 0x6014, 0x0096, 0x904d, 0x0508, 0x080c,
-	0xbdfd, 0x01f0, 0x080c, 0x9762, 0x2001, 0x180f, 0x2004, 0xd0c4,
-	0x0110, 0x009e, 0x0005, 0xa884, 0x009e, 0x8003, 0x800b, 0x810b,
-	0x9108, 0x611a, 0x2001, 0x0037, 0x2c08, 0x080c, 0x1595, 0x6000,
-	0x9086, 0x0004, 0x1120, 0x2009, 0x0048, 0x080c, 0x9b03, 0x0005,
-	0x009e, 0x080c, 0x18f4, 0x0804, 0xb43c, 0x6000, 0x908a, 0x0016,
-	0x1a0c, 0x0d65, 0x000b, 0x0005, 0xb4bc, 0xb3e8, 0xb4be, 0xb4bc,
-	0xb4be, 0xb4be, 0xb3e4, 0xb4bc, 0xb3de, 0xb3de, 0xb4bc, 0xb4bc,
-	0xb4bc, 0xb4bc, 0xb4bc, 0xb4bc, 0x080c, 0x0d65, 0x6010, 0x00b6,
-	0x2058, 0xb804, 0x9084, 0x00ff, 0x00be, 0x908a, 0x000c, 0x1a0c,
-	0x0d65, 0x00b6, 0x0013, 0x00be, 0x0005, 0xb4d9, 0xb5a6, 0xb4db,
-	0xb51b, 0xb4db, 0xb51b, 0xb4db, 0xb4e9, 0xb4d9, 0xb51b, 0xb4d9,
-	0xb50a, 0x080c, 0x0d65, 0x6004, 0x908e, 0x0016, 0x05c0, 0x908e,
-	0x0004, 0x05a8, 0x908e, 0x0002, 0x0590, 0x908e, 0x0052, 0x0904,
-	0xb5a2, 0x6004, 0x080c, 0xb8d3, 0x0904, 0xb5bf, 0x908e, 0x0004,
-	0x1110, 0x080c, 0x2ff2, 0x908e, 0x0021, 0x0904, 0xb5c3, 0x908e,
-	0x0022, 0x0904, 0xb607, 0x908e, 0x003d, 0x0904, 0xb5c3, 0x908e,
-	0x0039, 0x0904, 0xb5c7, 0x908e, 0x0035, 0x0904, 0xb5c7, 0x908e,
-	0x001e, 0x0178, 0x908e, 0x0001, 0x1140, 0x6010, 0x2058, 0xb804,
-	0x9084, 0x00ff, 0x9086, 0x0006, 0x0110, 0x080c, 0x2fc1, 0x080c,
-	0xa40d, 0x0804, 0x9a9f, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016,
-	0x0904, 0xb593, 0x9186, 0x0002, 0x1904, 0xb568, 0x2001, 0x1836,
-	0x2004, 0xd08c, 0x11c8, 0x080c, 0x6f5c, 0x11b0, 0x080c, 0xbdd7,
-	0x0138, 0x080c, 0x6f7f, 0x1120, 0x080c, 0x6e67, 0x0804, 0xb5f0,
-	0x2001, 0x194e, 0x2003, 0x0001, 0x2001, 0x1800, 0x2003, 0x0001,
-	0x080c, 0x6e8d, 0x0804, 0xb5f0, 0x6010, 0x2058, 0x2001, 0x1836,
-	0x2004, 0xd0ac, 0x1904, 0xb5f0, 0xb8a0, 0x9084, 0xff80, 0x1904,
-	0xb5f0, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0190, 0x8001, 0xb842,
-	0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x604b, 0x0000,
-	0x080c, 0x9a0f, 0x0128, 0x2b00, 0x6012, 0x6023, 0x0001, 0x0458,
-	0x00de, 0x00ce, 0x6004, 0x908e, 0x0002, 0x11a0, 0x6010, 0x2058,
-	0xb8a0, 0x9086, 0x007e, 0x1170, 0x2009, 0x1836, 0x2104, 0xc085,
-	0x200a, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5b75, 0x00ee, 0x080c,
-	0xa40d, 0x0030, 0x080c, 0xa40d, 0x080c, 0x2fc1, 0x080c, 0xbdec,
-	0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2ff2, 0x012e, 0x00ee,
-	0x080c, 0x9a9f, 0x0005, 0x2001, 0x0002, 0x080c, 0x60b7, 0x6003,
-	0x0001, 0x6007, 0x0002, 0x080c, 0x8335, 0x080c, 0x8793, 0x00de,
-	0x00ce, 0x0c80, 0x080c, 0x2ff2, 0x0804, 0xb517, 0x00c6, 0x00d6,
-	0x6104, 0x9186, 0x0016, 0x0d38, 0x6010, 0x2058, 0xb840, 0x9084,
-	0x00ff, 0x9005, 0x0904, 0xb568, 0x8001, 0xb842, 0x6003, 0x0001,
-	0x080c, 0x8335, 0x080c, 0x8793, 0x00de, 0x00ce, 0x0898, 0x080c,
-	0xa40d, 0x0804, 0xb519, 0x080c, 0xa449, 0x0804, 0xb519, 0x00d6,
-	0x2c68, 0x6104, 0x080c, 0xbd4f, 0x00de, 0x0118, 0x080c, 0x9a65,
-	0x00f0, 0x6004, 0x8007, 0x6134, 0x918c, 0x00ff, 0x9105, 0x6036,
-	0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x603c, 0x600a,
-	0x2001, 0x1956, 0x2004, 0x601a, 0x602c, 0x2c08, 0x2060, 0x6024,
-	0xc0b5, 0x6026, 0x2160, 0x2009, 0x8020, 0x080c, 0x832e, 0x0005,
-	0x00de, 0x00ce, 0x080c, 0xa40d, 0x080c, 0x2fc1, 0x00e6, 0x0126,
-	0x2091, 0x8000, 0x080c, 0x2ff2, 0x6017, 0x0000, 0x6023, 0x0007,
-	0x601b, 0x0398, 0x604b, 0x0000, 0x012e, 0x00ee, 0x0005, 0x080c,
-	0x9ea0, 0x1904, 0xb5bf, 0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c,
-	0x0d65, 0x0096, 0x00d6, 0x001b, 0x00de, 0x009e, 0x0005, 0xb627,
-	0xb627, 0xb627, 0xb627, 0xb627, 0xb627, 0xb627, 0xb627, 0xb627,
-	0xb3e3, 0xb627, 0xb3e8, 0xb629, 0xb3e8, 0xb636, 0xb627, 0x080c,
-	0x0d65, 0x6004, 0x9086, 0x008b, 0x0148, 0x6007, 0x008b, 0x6003,
-	0x000d, 0x2009, 0x8020, 0x080c, 0x832e, 0x0005, 0x080c, 0xbdcb,
-	0x0118, 0x080c, 0xbdde, 0x0010, 0x080c, 0xbdec, 0x080c, 0xb8ad,
-	0x080c, 0xb6c5, 0x0570, 0x080c, 0x2fc1, 0x080c, 0xb6c5, 0x0168,
-	0x6014, 0x2048, 0xa867, 0x0103, 0xa87b, 0x0006, 0xa877, 0x0000,
-	0xa880, 0xc0ed, 0xa882, 0x080c, 0x683f, 0x2c68, 0x080c, 0x9a0f,
-	0x0150, 0x6810, 0x6012, 0x080c, 0xbb52, 0x00c6, 0x2d60, 0x080c,
-	0x9a9f, 0x00ce, 0x0008, 0x2d60, 0x6017, 0x0000, 0x6023, 0x0001,
-	0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x8335, 0x080c, 0x8793,
-	0x00c8, 0x080c, 0xbdcb, 0x0138, 0x6034, 0x9086, 0x4000, 0x1118,
-	0x080c, 0x2fc1, 0x08d0, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186,
-	0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x080c, 0x2fc1, 0x0868,
-	0x080c, 0x9a9f, 0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d65,
-	0x0002, 0xb6a1, 0xb6a1, 0xb6a3, 0xb6a3, 0xb6a3, 0xb6a1, 0xb6a1,
-	0x9a9f, 0xb6a1, 0xb6a1, 0xb6a1, 0xb6a1, 0xb6a1, 0xb6a1, 0xb6a1,
-	0xb6a1, 0x080c, 0x0d65, 0x080c, 0x9746, 0x080c, 0x98b7, 0x080c,
-	0x9762, 0x6114, 0x0096, 0x2148, 0xa87b, 0x0006, 0x080c, 0x683f,
-	0x009e, 0x0804, 0x9a65, 0x9284, 0x0003, 0x1158, 0x9282, 0x1ddc,
-	0x0240, 0x2001, 0x1819, 0x2004, 0x9202, 0x1218, 0x9085, 0x0001,
-	0x0005, 0x9006, 0x0ce8, 0x0096, 0x0028, 0x0096, 0x0006, 0x6014,
-	0x2048, 0x000e, 0x0006, 0x9984, 0xf000, 0x9086, 0xf000, 0x0110,
-	0x080c, 0x10ce, 0x000e, 0x009e, 0x0005, 0x00e6, 0x00c6, 0x0036,
-	0x0006, 0x0126, 0x2091, 0x8000, 0x2061, 0x1ddc, 0x2071, 0x1800,
-	0x7350, 0x7070, 0x9302, 0x1640, 0x6020, 0x9206, 0x11f8, 0x080c,
-	0xbdd7, 0x0180, 0x9286, 0x0001, 0x1168, 0x6004, 0x9086, 0x0004,
-	0x1148, 0x080c, 0x2fc1, 0x080c, 0xbdec, 0x00c6, 0x080c, 0x9a9f,
-	0x00ce, 0x0060, 0x080c, 0xbac4, 0x0148, 0x080c, 0xb8d3, 0x1110,
-	0x080c, 0xa40d, 0x00c6, 0x080c, 0x9a65, 0x00ce, 0x9ce0, 0x001c,
-	0x7064, 0x9c02, 0x1208, 0x08a0, 0x012e, 0x000e, 0x003e, 0x00ce,
-	0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000, 0x210c,
-	0x81ff, 0x0128, 0x2061, 0x1b00, 0x6112, 0x080c, 0x2fc1, 0x9006,
-	0x0010, 0x9085, 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6,
-	0x0126, 0x2091, 0x8000, 0x080c, 0x9a0f, 0x01d8, 0x080c, 0x52a5,
-	0x0110, 0x662e, 0x0008, 0x6616, 0x2b00, 0x6012, 0x080c, 0x52a5,
-	0x0118, 0x080c, 0xb7ef, 0x0168, 0x080c, 0xbb52, 0x6023, 0x0003,
-	0x2009, 0x004b, 0x080c, 0x9b03, 0x9085, 0x0001, 0x012e, 0x00ce,
-	0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0xbaa0,
-	0x080c, 0x9ad6, 0x05b0, 0x080c, 0x52a5, 0x0118, 0x602f, 0x0000,
-	0x0010, 0x6017, 0x0000, 0x2b00, 0x6012, 0x080c, 0xbb52, 0x6023,
-	0x0003, 0x0016, 0x080c, 0x9746, 0x080c, 0x8498, 0x0076, 0x903e,
-	0x080c, 0x8387, 0x2c08, 0x080c, 0xce23, 0x007e, 0x080c, 0x9762,
-	0x001e, 0xd184, 0x0128, 0x080c, 0x9a65, 0x9085, 0x0001, 0x0070,
-	0x080c, 0x52a5, 0x0128, 0xd18c, 0x1170, 0x080c, 0xb7ef, 0x0148,
-	0x2009, 0x004c, 0x080c, 0x9b03, 0x9085, 0x0001, 0x012e, 0x00ce,
-	0x0005, 0x9006, 0x0cd8, 0x2900, 0x6016, 0x0c90, 0x2009, 0x004d,
-	0x0010, 0x2009, 0x004e, 0x00f6, 0x00c6, 0x0046, 0x0016, 0x080c,
-	0x9a0f, 0x2c78, 0x01d8, 0x080c, 0x52a5, 0x0110, 0x7e2e, 0x0008,
-	0x7e16, 0x2b00, 0x7812, 0x7823, 0x0003, 0x2021, 0x0005, 0x080c,
-	0xb801, 0x2f60, 0x080c, 0x52a5, 0x0118, 0x080c, 0xb7ef, 0x0130,
-	0x001e, 0x0016, 0x080c, 0x9b03, 0x9085, 0x0001, 0x001e, 0x004e,
-	0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6, 0x0046, 0x080c, 0x9a0f,
-	0x2c78, 0x0530, 0x080c, 0x52a5, 0x0110, 0x7e2e, 0x0008, 0x7e16,
-	0x2b00, 0x7812, 0x7823, 0x0003, 0x0096, 0x2021, 0x0004, 0x0489,
-	0x009e, 0x2001, 0x194f, 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c,
-	0x9a65, 0x0060, 0x2f60, 0x080c, 0x52a5, 0x0120, 0xd18c, 0x1160,
-	0x0071, 0x0130, 0x2009, 0x0052, 0x080c, 0x9b03, 0x9085, 0x0001,
-	0x004e, 0x00ce, 0x00fe, 0x0005, 0x2900, 0x7816, 0x0c98, 0x00c6,
-	0x080c, 0x479b, 0x00ce, 0x1120, 0x080c, 0x9a65, 0x9006, 0x0005,
-	0xa867, 0x0000, 0xa86b, 0x8000, 0x2900, 0x6016, 0x9085, 0x0001,
-	0x0005, 0x0096, 0x0076, 0x0126, 0x2091, 0x8000, 0x080c, 0x9746,
-	0x080c, 0x6345, 0x0158, 0x2001, 0xb808, 0x0006, 0x900e, 0x2400,
-	0x080c, 0x6a5c, 0x080c, 0x683f, 0x000e, 0x0807, 0x2418, 0x080c,
-	0x8697, 0xbaa0, 0x0086, 0x2041, 0x0001, 0x2039, 0x0001, 0x2608,
-	0x080c, 0x84b2, 0x008e, 0x080c, 0x8387, 0x2f08, 0x2648, 0x080c,
-	0xce23, 0xb93c, 0x81ff, 0x090c, 0x8589, 0x080c, 0x9762, 0x012e,
-	0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x9a0f, 0x0190, 0x660a, 0x2b08, 0x6112, 0x080c, 0xbb52, 0x6023,
-	0x0001, 0x2900, 0x6016, 0x2009, 0x001f, 0x080c, 0x9b03, 0x9085,
-	0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126,
-	0x2091, 0x8000, 0x080c, 0x9ad6, 0x01b8, 0x660a, 0x2b08, 0x6112,
-	0x080c, 0xbb52, 0x6023, 0x0008, 0x2900, 0x6016, 0x00f6, 0x2c78,
-	0x080c, 0x1646, 0x00fe, 0x2009, 0x0021, 0x080c, 0x9b03, 0x9085,
-	0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, 0x003d,
-	0x00c6, 0x0126, 0x0016, 0x2091, 0x8000, 0x080c, 0x9a0f, 0x0198,
-	0x660a, 0x2b08, 0x6112, 0x080c, 0xbb52, 0x6023, 0x0001, 0x2900,
-	0x6016, 0x001e, 0x0016, 0x080c, 0x9b03, 0x9085, 0x0001, 0x001e,
-	0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd0, 0x00c6, 0x0126, 0x2091,
-	0x8000, 0x080c, 0x9ad6, 0x0188, 0x2b08, 0x6112, 0x080c, 0xbb52,
-	0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x0000, 0x080c, 0x9b03,
-	0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009,
-	0x0044, 0x0830, 0x2009, 0x0049, 0x0818, 0x0026, 0x00b6, 0x6210,
-	0x2258, 0xba3c, 0x82ff, 0x0118, 0x8211, 0xba3e, 0x1140, 0xb8c0,
-	0x9005, 0x0128, 0xb888, 0x9005, 0x1110, 0xb88b, 0x0001, 0x00be,
-	0x002e, 0x0005, 0x0006, 0x0016, 0x6004, 0x908e, 0x0002, 0x0140,
-	0x908e, 0x0003, 0x0128, 0x908e, 0x0004, 0x0110, 0x9085, 0x0001,
-	0x001e, 0x000e, 0x0005, 0x0006, 0x0096, 0x6020, 0x9086, 0x0004,
-	0x0190, 0x6014, 0x904d, 0x080c, 0xb6c5, 0x0168, 0xa864, 0x9086,
-	0x0139, 0x0158, 0x6020, 0x9086, 0x0003, 0x0128, 0xa868, 0xd0fc,
-	0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x009e, 0x000e, 0x0005,
-	0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9ad6, 0x0198, 0x2b08,
-	0x6112, 0x080c, 0xbb52, 0x6023, 0x0001, 0x2900, 0x6016, 0x080c,
-	0x2fc1, 0x2009, 0x0028, 0x080c, 0x9b03, 0x9085, 0x0001, 0x012e,
-	0x00ce, 0x0005, 0x9006, 0x0cd8, 0x9186, 0x0015, 0x11a8, 0x2011,
-	0x1823, 0x2204, 0x9086, 0x0074, 0x1178, 0x00b6, 0x080c, 0xa696,
-	0x00be, 0x080c, 0xa8d5, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c,
-	0x8335, 0x080c, 0x8793, 0x0078, 0x6014, 0x0096, 0x2048, 0xa868,
-	0x009e, 0xd0fc, 0x0148, 0x2001, 0x0001, 0x080c, 0xbd10, 0x080c,
-	0xa40d, 0x080c, 0x9a65, 0x0005, 0x0096, 0x6014, 0x904d, 0x090c,
-	0x0d65, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b,
-	0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x683f,
-	0x012e, 0x009e, 0x080c, 0x9a65, 0x0c30, 0x0096, 0x9186, 0x0016,
-	0x1128, 0x2001, 0x0004, 0x080c, 0x60b7, 0x00e8, 0x9186, 0x0015,
-	0x1510, 0x2011, 0x1823, 0x2204, 0x9086, 0x0014, 0x11e0, 0x6010,
-	0x00b6, 0x2058, 0x080c, 0x6201, 0x00be, 0x080c, 0xa9a6, 0x1198,
-	0x6010, 0x00b6, 0x2058, 0xb890, 0x00be, 0x9005, 0x0160, 0x2001,
-	0x0006, 0x080c, 0x60b7, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0170,
-	0x080c, 0x9e74, 0x0048, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0528,
-	0x080c, 0xa40d, 0x080c, 0x9a65, 0x009e, 0x0005, 0x6014, 0x6310,
-	0x2358, 0x904d, 0x090c, 0x0d65, 0xa87b, 0x0000, 0xa883, 0x0000,
-	0xa897, 0x4000, 0x900e, 0x080c, 0x6455, 0x1108, 0xc185, 0xb800,
-	0xd0bc, 0x0108, 0xc18d, 0xa99a, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x683f, 0x012e, 0x080c, 0x9a65, 0x08f8, 0x6014, 0x904d, 0x090c,
-	0x0d65, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b,
-	0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x683f,
-	0x012e, 0x080c, 0x9a65, 0x0840, 0xa878, 0x9086, 0x0005, 0x1108,
-	0x0009, 0x0005, 0xa880, 0xc0ad, 0xa882, 0x0005, 0x604b, 0x0000,
-	0x6017, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x2009, 0x8023,
-	0x080c, 0x832e, 0x0005, 0x00c6, 0x6010, 0x00b6, 0x2058, 0xb800,
-	0x00be, 0xd0bc, 0x0130, 0x0066, 0x6020, 0x9084, 0x000f, 0x001b,
-	0x006e, 0x00ce, 0x0005, 0xb3e3, 0xb9f5, 0xb9f5, 0xb9f8, 0xd118,
-	0xd133, 0xd136, 0xb3e3, 0xb3e3, 0xb3e3, 0xb3e3, 0xb3e3, 0xb3e3,
-	0xb3e3, 0xb3e3, 0xb3e3, 0x080c, 0x0d65, 0xa001, 0xa001, 0x0005,
-	0x0096, 0x6014, 0x904d, 0x0118, 0xa87c, 0xd0e4, 0x1110, 0x009e,
-	0x0010, 0x009e, 0x0005, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be,
-	0xd0bc, 0x0550, 0x2001, 0x1833, 0x2004, 0x9005, 0x1540, 0x00f6,
-	0x2c78, 0x080c, 0x9a0f, 0x0508, 0x7810, 0x6012, 0x080c, 0xbb52,
-	0x7820, 0x9086, 0x0003, 0x0128, 0x7808, 0x603a, 0x2f00, 0x603e,
-	0x0020, 0x7808, 0x603e, 0x2f00, 0x603a, 0x602e, 0x6023, 0x0001,
-	0x6007, 0x0035, 0x6003, 0x0001, 0x795c, 0x615e, 0x2009, 0x8020,
-	0x080c, 0x832e, 0x2f60, 0x00fe, 0x0005, 0x2f60, 0x00fe, 0x2001,
-	0x1957, 0x2004, 0x604a, 0x0005, 0x0016, 0x0096, 0x6814, 0x2048,
-	0x681c, 0xd0fc, 0xc0fc, 0x681e, 0xa87c, 0x1108, 0xd0e4, 0x0180,
-	0xc0e4, 0xa87e, 0xa877, 0x0000, 0xa893, 0x0000, 0xa88f, 0x0000,
-	0xd0cc, 0x0130, 0xc0cc, 0xa87e, 0xa878, 0x2048, 0x080c, 0x0fd5,
-	0x6830, 0x6036, 0x908e, 0x0001, 0x0148, 0x6803, 0x0002, 0x9086,
-	0x0005, 0x0170, 0x9006, 0x602e, 0x6032, 0x00d0, 0x681c, 0xc085,
-	0x681e, 0x6803, 0x0004, 0x6824, 0xc0f4, 0x9085, 0x0c00, 0x6826,
-	0x6814, 0x2048, 0xa8ac, 0x6938, 0x9102, 0xa8b0, 0x693c, 0x9103,
-	0x1e48, 0x683c, 0x602e, 0x6838, 0x9084, 0xfffc, 0x683a, 0x6032,
-	0x2d00, 0x603a, 0x6808, 0x603e, 0x6910, 0x6112, 0x695c, 0x615e,
-	0x6023, 0x0001, 0x6007, 0x0039, 0x6003, 0x0001, 0x2009, 0x8020,
-	0x080c, 0x832e, 0x009e, 0x001e, 0x0005, 0x6024, 0xd0d4, 0x0510,
-	0xd0f4, 0x11f8, 0x6038, 0x940a, 0x603c, 0x9303, 0x0230, 0x9105,
-	0x0120, 0x6024, 0xc0d4, 0xc0f5, 0x0098, 0x643a, 0x633e, 0xac3e,
-	0xab42, 0x0046, 0x0036, 0x2400, 0xacac, 0x9402, 0xa836, 0x2300,
-	0xabb0, 0x9303, 0xa83a, 0x003e, 0x004e, 0x6024, 0xc0d4, 0x0000,
-	0x6026, 0x0005, 0xd0f4, 0x1138, 0xa83c, 0x603a, 0xa840, 0x603e,
-	0x6024, 0xc0f5, 0x6026, 0x0005, 0x0006, 0x0016, 0x6004, 0x908e,
-	0x0034, 0x01b8, 0x908e, 0x0035, 0x01a0, 0x908e, 0x0036, 0x0188,
-	0x908e, 0x0037, 0x0170, 0x908e, 0x0038, 0x0158, 0x908e, 0x0039,
-	0x0140, 0x908e, 0x003a, 0x0128, 0x908e, 0x003b, 0x0110, 0x9085,
-	0x0001, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036,
-	0x00e6, 0x2001, 0x1951, 0x200c, 0x8000, 0x2014, 0x2001, 0x0032,
-	0x080c, 0x8276, 0x2001, 0x1955, 0x82ff, 0x1110, 0x2011, 0x0014,
-	0x2202, 0x2001, 0x1953, 0x200c, 0x8000, 0x2014, 0x2071, 0x193d,
-	0x711a, 0x721e, 0x2001, 0x0064, 0x080c, 0x8276, 0x2001, 0x1956,
-	0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, 0x1957, 0x9288,
-	0x000a, 0x2102, 0x2001, 0x0017, 0x080c, 0x9737, 0x2001, 0x1a57,
-	0x2102, 0x2001, 0x0032, 0x080c, 0x1595, 0x080c, 0x653e, 0x00ee,
-	0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x00e6,
-	0x2001, 0x1955, 0x2003, 0x0028, 0x2001, 0x1956, 0x2003, 0x0014,
-	0x2071, 0x193d, 0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, 0x1957,
-	0x2009, 0x001e, 0x2102, 0x2001, 0x0017, 0x080c, 0x9737, 0x2001,
-	0x1a57, 0x2102, 0x2001, 0x0032, 0x080c, 0x1595, 0x00ee, 0x001e,
-	0x000e, 0x0005, 0x0096, 0x6060, 0x904d, 0x0110, 0x080c, 0x1055,
-	0x009e, 0x0005, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c,
-	0x9a0f, 0x0180, 0x2b08, 0x6112, 0x0ca9, 0x6023, 0x0001, 0x2900,
-	0x6016, 0x2009, 0x0033, 0x080c, 0x9b03, 0x9085, 0x0001, 0x012e,
-	0x00ce, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x00e6, 0x00f6, 0x2071,
-	0x1800, 0x9186, 0x0015, 0x1500, 0x708c, 0x9086, 0x0018, 0x11e0,
-	0x6014, 0x2048, 0xaa3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x8852,
-	0x01d8, 0x7078, 0xaa50, 0x9206, 0x1160, 0x707c, 0xaa54, 0x9206,
-	0x1140, 0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x900e, 0x080c,
-	0x3012, 0x080c, 0x9e74, 0x0020, 0x080c, 0xa40d, 0x080c, 0x9a65,
-	0x00fe, 0x00ee, 0x009e, 0x0005, 0x705c, 0xaa54, 0x9206, 0x0d48,
-	0x0c80, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9a0f, 0x0188,
-	0x2b08, 0x6112, 0x080c, 0xbb52, 0x6023, 0x0001, 0x2900, 0x6016,
-	0x2009, 0x004d, 0x080c, 0x9b03, 0x9085, 0x0001, 0x012e, 0x00ce,
-	0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0016,
-	0x080c, 0x9a0f, 0x0180, 0x2b08, 0x6112, 0x080c, 0xbb52, 0x6023,
-	0x0001, 0x2900, 0x6016, 0x001e, 0x080c, 0x9b03, 0x9085, 0x0001,
-	0x012e, 0x00ce, 0x0005, 0x001e, 0x9006, 0x0cd0, 0x0016, 0x0026,
-	0x0036, 0x0046, 0x0056, 0x0066, 0x0096, 0x00e6, 0x00f6, 0x2071,
-	0x1800, 0x9186, 0x0015, 0x1568, 0x718c, 0x6014, 0x2048, 0xa814,
-	0x8003, 0x9106, 0x1530, 0x20e1, 0x0000, 0x2001, 0x196f, 0x2003,
-	0x0000, 0x6014, 0x2048, 0xa830, 0x20a8, 0x8906, 0x8006, 0x8007,
-	0x9094, 0x003f, 0x22e8, 0x9084, 0xffc0, 0x9080, 0x001b, 0x20a0,
-	0x2001, 0x196f, 0x0016, 0x200c, 0x080c, 0xc3ab, 0x001e, 0xa804,
-	0x9005, 0x0110, 0x2048, 0x0c38, 0x6014, 0x2048, 0xa867, 0x0103,
-	0x0010, 0x080c, 0xa40d, 0x080c, 0x9a65, 0x00fe, 0x00ee, 0x009e,
-	0x006e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x0096,
-	0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x11b8, 0x708c,
-	0x9086, 0x0004, 0x1198, 0x6014, 0x2048, 0x2c78, 0x080c, 0x8852,
-	0x01a8, 0x7078, 0xaa74, 0x9206, 0x1130, 0x707c, 0xaa78, 0x9206,
-	0x1110, 0x080c, 0x2fc1, 0x080c, 0x9e74, 0x0020, 0x080c, 0xa40d,
-	0x080c, 0x9a65, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x705c, 0xaa78,
-	0x9206, 0x0d78, 0x0c80, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800,
-	0x9186, 0x0015, 0x1550, 0x708c, 0x9086, 0x0004, 0x1530, 0x6014,
-	0x2048, 0x2c78, 0x080c, 0x8852, 0x05e8, 0x7078, 0xaacc, 0x9206,
-	0x1180, 0x707c, 0xaad0, 0x9206, 0x1160, 0x080c, 0x2fc1, 0x0016,
-	0xa998, 0xaab0, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x5255, 0x001e,
-	0x0010, 0x080c, 0x503e, 0x080c, 0xb6c5, 0x0500, 0xa87b, 0x0000,
-	0xa883, 0x0000, 0xa897, 0x4000, 0x0078, 0x080c, 0x503e, 0x080c,
-	0xb6c5, 0x01a0, 0x6014, 0x2048, 0xa87b, 0x0030, 0xa883, 0x0000,
-	0xa897, 0x4005, 0xa89b, 0x0004, 0x0126, 0x2091, 0x8000, 0xa867,
-	0x0139, 0x080c, 0x683f, 0x012e, 0x080c, 0x9a65, 0x00fe, 0x00ee,
-	0x009e, 0x0005, 0x705c, 0xaad0, 0x9206, 0x0938, 0x0890, 0x0016,
-	0x0026, 0xa87c, 0xd0ac, 0x0178, 0xa938, 0xaa34, 0x2100, 0x9205,
-	0x0150, 0xa890, 0x9106, 0x1118, 0xa88c, 0x9206, 0x0120, 0xa992,
-	0xaa8e, 0x9085, 0x0001, 0x002e, 0x001e, 0x0005, 0x00b6, 0x00d6,
-	0x0036, 0x080c, 0xb6c5, 0x0904, 0xbd0c, 0x0096, 0x6314, 0x2348,
-	0xa87a, 0xa982, 0x929e, 0x4000, 0x1580, 0x6310, 0x00c6, 0x2358,
-	0x2009, 0x0000, 0xa868, 0xd0f4, 0x1140, 0x080c, 0x6455, 0x1108,
-	0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xaa96, 0xa99a, 0x20a9,
-	0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8b4,
-	0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0fa0, 0x20a9,
-	0x0004, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8b8, 0x9080, 0x000a,
-	0x2098, 0x080c, 0x0fa0, 0x00ce, 0x0090, 0xaa96, 0x3918, 0x9398,
-	0x0007, 0x231c, 0x6004, 0x9086, 0x0016, 0x0110, 0xa89b, 0x0004,
-	0xaba2, 0x6310, 0x2358, 0xb804, 0x9084, 0x00ff, 0xa89e, 0x080c,
-	0x6833, 0x6017, 0x0000, 0x009e, 0x003e, 0x00de, 0x00be, 0x0005,
-	0x0026, 0x0036, 0x0046, 0x00b6, 0x0096, 0x00f6, 0x6214, 0x2248,
-	0x6210, 0x2258, 0x2079, 0x0260, 0x9096, 0x0000, 0x11a0, 0xb814,
-	0x9084, 0x00ff, 0x900e, 0x080c, 0x23ef, 0x2118, 0x831f, 0x939c,
-	0xff00, 0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c, 0x2011, 0x8018,
-	0x080c, 0x47fb, 0x00a8, 0x9096, 0x0001, 0x1148, 0x89ff, 0x0180,
-	0xa89b, 0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, 0x0048, 0x9096,
-	0x0002, 0x1130, 0xa89b, 0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa,
-	0x00fe, 0x009e, 0x00be, 0x004e, 0x003e, 0x002e, 0x0005, 0x00c6,
-	0x0026, 0x0016, 0x9186, 0x0035, 0x0110, 0x6a38, 0x0008, 0x6a2c,
-	0x080c, 0xb6b3, 0x01f0, 0x2260, 0x6120, 0x9186, 0x0003, 0x0118,
-	0x9186, 0x0006, 0x1190, 0x6838, 0x9206, 0x0140, 0x683c, 0x9206,
-	0x1160, 0x6108, 0x6838, 0x9106, 0x1140, 0x0020, 0x6008, 0x693c,
-	0x9106, 0x1118, 0x6010, 0x6910, 0x9106, 0x001e, 0x002e, 0x00ce,
-	0x0005, 0x9085, 0x0001, 0x0cc8, 0xa974, 0xd1cc, 0x0188, 0x918c,
-	0x00ff, 0x918e, 0x0002, 0x1160, 0xa9a8, 0x918c, 0x0f00, 0x810f,
-	0x918e, 0x0001, 0x1128, 0xa834, 0xa938, 0x9115, 0x190c, 0xad40,
-	0x0005, 0x0036, 0x2019, 0x0001, 0x0010, 0x0036, 0x901e, 0x0499,
-	0x01e0, 0x080c, 0xb6c5, 0x01c8, 0x080c, 0xb8ad, 0x6037, 0x4000,
-	0x6014, 0x6017, 0x0000, 0x0096, 0x2048, 0xa87c, 0x080c, 0xb8d3,
-	0x1118, 0x080c, 0xa40d, 0x0040, 0xa867, 0x0103, 0xa877, 0x0000,
-	0x83ff, 0x1129, 0x080c, 0x683f, 0x009e, 0x003e, 0x0005, 0xa880,
-	0xd0b4, 0x0128, 0xa87b, 0x0006, 0xc0ec, 0xa882, 0x0048, 0xd0bc,
-	0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, 0xb9c2,
-	0xa877, 0x0000, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0ec, 0x0005,
-	0x0006, 0x2001, 0x1810, 0x2004, 0xd0f4, 0x000e, 0x0005, 0x0006,
-	0x2001, 0x1810, 0x2004, 0xd0e4, 0x000e, 0x0005, 0x0036, 0x0046,
-	0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0007, 0x080c,
-	0x4998, 0x004e, 0x003e, 0x0005, 0x0c51, 0x1d81, 0x0005, 0x2001,
-	0x1955, 0x2004, 0x601a, 0x0005, 0x2001, 0x1957, 0x2004, 0x604a,
-	0x0005, 0x080c, 0x9a65, 0x0804, 0x8793, 0x611c, 0xd1fc, 0xa97c,
-	0x1108, 0xd1e4, 0x0005, 0x601c, 0xd0fc, 0xa87c, 0x1108, 0xd0e4,
-	0x0005, 0x601c, 0xd0fc, 0xc0fc, 0x601e, 0xa87c, 0x1108, 0xd0e4,
-	0x0005, 0x6044, 0xd0fc, 0x0160, 0xd0dc, 0x1128, 0x908c, 0x000f,
-	0x9186, 0x0005, 0x1118, 0x6003, 0x0003, 0x0010, 0x6003, 0x0001,
-	0x0005, 0x00b6, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d65,
-	0x001b, 0x006e, 0x00be, 0x0005, 0xbe3c, 0xc506, 0xc655, 0xbe3c,
-	0xbe3c, 0xbe3c, 0xbe3c, 0xbe3c, 0xbe73, 0xc6d3, 0xbe3c, 0xbe3c,
-	0xbe3c, 0xbe3c, 0xbe3c, 0xbe3c, 0x080c, 0x0d65, 0x0066, 0x6000,
-	0x90b2, 0x0016, 0x1a0c, 0x0d65, 0x0013, 0x006e, 0x0005, 0xbe57,
-	0xcbe5, 0xbe57, 0xbe57, 0xbe57, 0xbe57, 0xbe57, 0xbe57, 0xcb94,
-	0xcc37, 0xbe57, 0xd253, 0xd287, 0xd253, 0xd287, 0xbe57, 0x080c,
-	0x0d65, 0x6000, 0x9082, 0x0016, 0x1a0c, 0x0d65, 0x6000, 0x000a,
-	0x0005, 0xbe71, 0xc8af, 0xc978, 0xc99a, 0xca15, 0xbe71, 0xcb0b,
-	0xca9d, 0xc6dd, 0xcb6c, 0xcb81, 0xbe71, 0xbe71, 0xbe71, 0xbe71,
-	0xbe71, 0x080c, 0x0d65, 0x91b2, 0x0053, 0x1a0c, 0x0d65, 0x2100,
-	0x91b2, 0x0040, 0x1a04, 0xc2ab, 0x0002, 0xbebd, 0xc09c, 0xbebd,
-	0xbebd, 0xbebd, 0xc0a5, 0xbebd, 0xbebd, 0xbebd, 0xbebd, 0xbebd,
-	0xbebd, 0xbebd, 0xbebd, 0xbebd, 0xbebd, 0xbebd, 0xbebd, 0xbebd,
-	0xbebd, 0xbebd, 0xbebd, 0xbebd, 0xbebf, 0xbf19, 0xbf28, 0xbf8c,
-	0xbfb7, 0xc02f, 0xc087, 0xbebd, 0xbebd, 0xc0a8, 0xbebd, 0xbebd,
-	0xc0bd, 0xc0ca, 0xbebd, 0xbebd, 0xbebd, 0xbebd, 0xbebd, 0xc14d,
-	0xbebd, 0xbebd, 0xc161, 0xbebd, 0xbebd, 0xc11c, 0xbebd, 0xbebd,
-	0xbebd, 0xc179, 0xbebd, 0xbebd, 0xbebd, 0xc1f6, 0xbebd, 0xbebd,
-	0xbebd, 0xbebd, 0xbebd, 0xbebd, 0xc273, 0x080c, 0x0d65, 0x080c,
-	0x651b, 0x1150, 0x2001, 0x1836, 0x2004, 0xd0cc, 0x1128, 0x9084,
-	0x0009, 0x9086, 0x0008, 0x1140, 0x6007, 0x0009, 0x602f, 0x0009,
-	0x6017, 0x0000, 0x0804, 0xc095, 0x080c, 0x6504, 0x00e6, 0x00c6,
-	0x0036, 0x0026, 0x0016, 0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019,
-	0x0029, 0x080c, 0x9746, 0x080c, 0x8498, 0x0076, 0x903e, 0x080c,
-	0x8387, 0x2c08, 0x080c, 0xce23, 0x007e, 0x001e, 0x080c, 0x9762,
-	0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x6610, 0x2658, 0x080c,
-	0x6175, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x0278, 0x080c,
-	0xcd52, 0x1904, 0xbf84, 0x080c, 0xccee, 0x1120, 0x6007, 0x0008,
-	0x0804, 0xc095, 0x6007, 0x0009, 0x0804, 0xc095, 0x080c, 0xcf59,
-	0x0128, 0x080c, 0xcd52, 0x0d78, 0x0804, 0xbf84, 0x6017, 0x1900,
-	0x0c88, 0x080c, 0x3107, 0x1904, 0xc2a8, 0x6106, 0x080c, 0xcca1,
-	0x6007, 0x0006, 0x0804, 0xc095, 0x6007, 0x0007, 0x0804, 0xc095,
-	0x080c, 0xd2c3, 0x1904, 0xc2a8, 0x080c, 0x3107, 0x1904, 0xc2a8,
-	0x00d6, 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006,
-	0x1220, 0x2001, 0x0001, 0x080c, 0x60a3, 0x96b4, 0xff00, 0x8637,
-	0x9686, 0x0006, 0x0188, 0x9686, 0x0004, 0x0170, 0xbe04, 0x96b4,
-	0x00ff, 0x9686, 0x0006, 0x0140, 0x9686, 0x0004, 0x0128, 0x9686,
-	0x0005, 0x0110, 0x00de, 0x0480, 0x00e6, 0x2071, 0x0260, 0x7034,
-	0x9084, 0x0003, 0x1140, 0x7034, 0x9082, 0x0014, 0x0220, 0x7030,
-	0x9084, 0x0003, 0x0130, 0x00ee, 0x6017, 0x0000, 0x602f, 0x0007,
-	0x00b0, 0x00ee, 0x080c, 0xcdb9, 0x1190, 0x9686, 0x0006, 0x1140,
-	0x0026, 0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x3012, 0x002e,
-	0x080c, 0x6201, 0x6007, 0x000a, 0x00de, 0x0804, 0xc095, 0x6007,
-	0x000b, 0x00de, 0x0804, 0xc095, 0x080c, 0x2fc1, 0x080c, 0xbdec,
-	0x6007, 0x0001, 0x0804, 0xc095, 0x080c, 0xd2c3, 0x1904, 0xc2a8,
-	0x080c, 0x3107, 0x1904, 0xc2a8, 0x2071, 0x0260, 0x7034, 0x90b4,
-	0x0003, 0x1948, 0x90b2, 0x0014, 0x0a30, 0x7030, 0x9084, 0x0003,
-	0x1910, 0x6610, 0x2658, 0xbe04, 0x9686, 0x0707, 0x09e8, 0x0026,
-	0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x3012, 0x002e, 0x6007,
-	0x000c, 0x2001, 0x0001, 0x080c, 0xd3df, 0x0804, 0xc095, 0x080c,
-	0x651b, 0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009, 0x9086,
-	0x0008, 0x1110, 0x0804, 0xbecc, 0x080c, 0x6504, 0x6610, 0x2658,
-	0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x06c0, 0x1138, 0x0026,
-	0x2001, 0x0006, 0x080c, 0x60e3, 0x002e, 0x0050, 0x96b4, 0xff00,
-	0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xbf84,
-	0x080c, 0xcdc6, 0x1120, 0x6007, 0x000e, 0x0804, 0xc095, 0x0046,
-	0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x2fc1, 0x080c, 0xbdec,
-	0x004e, 0x0016, 0x9006, 0x2009, 0x1854, 0x210c, 0x0048, 0x2009,
-	0x0029, 0x080c, 0xd0ce, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802,
-	0x001e, 0x004e, 0x6007, 0x0001, 0x0804, 0xc095, 0x2001, 0x0001,
-	0x080c, 0x60a3, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004,
-	0x2019, 0x1805, 0x2011, 0x0270, 0x080c, 0xaa49, 0x003e, 0x002e,
-	0x001e, 0x015e, 0x9005, 0x0168, 0x96b4, 0xff00, 0x8637, 0x9682,
-	0x0004, 0x0a04, 0xbf84, 0x9682, 0x0007, 0x0a04, 0xbfe0, 0x0804,
-	0xbf84, 0x6017, 0x1900, 0x6007, 0x0009, 0x0804, 0xc095, 0x080c,
-	0x651b, 0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009, 0x9086,
-	0x0008, 0x1110, 0x0804, 0xbecc, 0x080c, 0x6504, 0x6610, 0x2658,
-	0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x0688, 0x96b4, 0xff00,
-	0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xbf84,
-	0x080c, 0xcdf4, 0x1130, 0x080c, 0xccee, 0x1118, 0x6007, 0x0010,
-	0x04e0, 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x2fc1,
-	0x080c, 0xbdec, 0x004e, 0x0016, 0x9006, 0x2009, 0x1854, 0x210c,
-	0x0048, 0x2009, 0x0029, 0x080c, 0xd0ce, 0x6010, 0x2058, 0xb800,
-	0xc0e5, 0xb802, 0x001e, 0x004e, 0x6007, 0x0001, 0x00f0, 0x080c,
-	0xcf59, 0x0140, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0980,
-	0x0804, 0xbf84, 0x6017, 0x1900, 0x6007, 0x0009, 0x0070, 0x080c,
-	0x3107, 0x1904, 0xc2a8, 0x080c, 0xd2c3, 0x1904, 0xc2a8, 0x080c,
-	0xc446, 0x1904, 0xbf84, 0x6007, 0x0012, 0x6003, 0x0001, 0x080c,
-	0x8335, 0x080c, 0x8793, 0x0005, 0x6007, 0x0001, 0x6003, 0x0001,
-	0x080c, 0x8335, 0x080c, 0x8793, 0x0cb0, 0x6007, 0x0005, 0x0c68,
-	0x080c, 0xd2c3, 0x1904, 0xc2a8, 0x080c, 0x3107, 0x1904, 0xc2a8,
-	0x080c, 0xc446, 0x1904, 0xbf84, 0x6007, 0x0020, 0x6003, 0x0001,
-	0x080c, 0x8335, 0x080c, 0x8793, 0x0005, 0x080c, 0x3107, 0x1904,
-	0xc2a8, 0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x8335, 0x080c,
-	0x8793, 0x0005, 0x080c, 0xd2c3, 0x1904, 0xc2a8, 0x080c, 0x3107,
-	0x1904, 0xc2a8, 0x080c, 0xc446, 0x1904, 0xbf84, 0x0016, 0x0026,
-	0x00e6, 0x2071, 0x0260, 0x7244, 0x9286, 0xffff, 0x0180, 0x2c08,
-	0x080c, 0xb6b3, 0x01b0, 0x2260, 0x7240, 0x6008, 0x9206, 0x1188,
-	0x6010, 0x9190, 0x0004, 0x2214, 0x9206, 0x01b8, 0x0050, 0x7240,
-	0x2c08, 0x9006, 0x080c, 0xd0a0, 0x1180, 0x7244, 0x9286, 0xffff,
-	0x01b0, 0x2160, 0x6007, 0x0026, 0x6017, 0x1700, 0x7214, 0x9296,
-	0xffff, 0x1180, 0x6007, 0x0025, 0x0068, 0x6020, 0x9086, 0x0007,
-	0x1d80, 0x6004, 0x9086, 0x0024, 0x1110, 0x080c, 0x9a65, 0x2160,
-	0x6007, 0x0025, 0x6003, 0x0001, 0x080c, 0x8335, 0x080c, 0x8793,
-	0x00ee, 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x60a3,
+	0xaea7, 0xa87c, 0xb07e, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa860,
+	0x20e8, 0xa85c, 0x9080, 0x0019, 0x20a0, 0x20a9, 0x0020, 0x8a06,
+	0x8006, 0x8007, 0x9094, 0x003f, 0x22e0, 0x9084, 0xffc0, 0x9080,
+	0x0019, 0x2098, 0x4003, 0x00ae, 0x000e, 0xa882, 0x000e, 0xa87e,
+	0x080c, 0xbeeb, 0x001e, 0xa874, 0x0006, 0x2148, 0x080c, 0x0fd4,
+	0x001e, 0x0804, 0xb0c7, 0x0016, 0x00a6, 0x2150, 0xb174, 0x9184,
+	0x00ff, 0x90b6, 0x0002, 0x01e0, 0x9086, 0x0028, 0x1128, 0xa87b,
+	0x001c, 0xb07b, 0x001c, 0x00e0, 0xd1dc, 0x0158, 0xa87b, 0x0015,
+	0xb07b, 0x0015, 0x080c, 0xbe0e, 0x0118, 0xb174, 0xc1dc, 0xb176,
+	0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, 0x0007, 0x0040,
+	0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xaea7,
+	0xa890, 0xb092, 0xa88c, 0xb08e, 0xa87c, 0xb07e, 0x00ae, 0x080c,
+	0x0fd4, 0x009e, 0x080c, 0xbeeb, 0xa974, 0x0016, 0x080c, 0xb3ef,
+	0x001e, 0x0468, 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff, 0x90b6,
+	0x0002, 0x01b0, 0x9086, 0x0028, 0x1118, 0xa87b, 0x001c, 0x00d0,
+	0xd1dc, 0x0148, 0xa87b, 0x0015, 0x080c, 0xbe0e, 0x0118, 0xa974,
+	0xc1dc, 0xa976, 0x0078, 0xd1d4, 0x0118, 0xa87b, 0x0007, 0x0050,
+	0xa87b, 0x0000, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115,
+	0x190c, 0xaea7, 0xa974, 0x0016, 0x080c, 0x67a5, 0x001e, 0x6010,
+	0x00b6, 0x2058, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0xb8c0,
+	0x9005, 0x0120, 0x0016, 0x080c, 0x6394, 0x001e, 0x00be, 0xd1e4,
+	0x1120, 0x080c, 0x9bcc, 0x009e, 0x0005, 0x080c, 0xbb34, 0x0cd8,
+	0x6114, 0x0096, 0x2148, 0xa97c, 0x080c, 0xbf6c, 0x190c, 0x1900,
+	0x009e, 0x0005, 0x0096, 0x6114, 0x2148, 0xa83c, 0xa940, 0x9105,
+	0x01e8, 0xa877, 0x0000, 0xa87b, 0x0000, 0xa867, 0x0103, 0x00b6,
+	0x6010, 0x2058, 0xa834, 0xa938, 0x9115, 0x11a0, 0x080c, 0x67a5,
+	0xba3c, 0x8211, 0x0208, 0xba3e, 0xb8c0, 0x9005, 0x0110, 0x080c,
+	0x6394, 0x080c, 0x9bcc, 0x00be, 0x009e, 0x0005, 0xa87c, 0xc0dc,
+	0xa87e, 0x08f8, 0xb800, 0xd0bc, 0x1120, 0xa834, 0x080c, 0xaea7,
+	0x0c28, 0xa880, 0xd0bc, 0x1dc8, 0x080c, 0xbb71, 0x0c60, 0x080c,
+	0x884c, 0x0010, 0x080c, 0x88a9, 0x601c, 0xd084, 0x0110, 0x080c,
+	0x1914, 0x080c, 0xb82c, 0x01f0, 0x0096, 0x6114, 0x2148, 0x080c,
+	0xba41, 0x1118, 0x080c, 0xa574, 0x00a0, 0xa867, 0x0103, 0x2009,
+	0x180c, 0x210c, 0xd18c, 0x1198, 0xd184, 0x1170, 0x6108, 0xa97a,
+	0x918e, 0x0029, 0x1110, 0x080c, 0xd4f8, 0xa877, 0x0000, 0x080c,
+	0x698f, 0x009e, 0x0804, 0x9c06, 0xa87b, 0x0004, 0x0cb0, 0xa87b,
+	0x0004, 0x0c98, 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, 0x0208,
+	0x000a, 0x0005, 0xb171, 0xb171, 0xb171, 0xb171, 0xb171, 0xb173,
+	0xb171, 0xb171, 0xb171, 0xb171, 0xb171, 0xb171, 0xb171, 0xb171,
+	0xb171, 0xb171, 0xb171, 0xb171, 0xb171, 0xb171, 0xb197, 0xb171,
+	0xb171, 0x080c, 0x0d65, 0x080c, 0x538e, 0x01f8, 0x6014, 0x7144,
+	0x918c, 0x0fff, 0x9016, 0xd1c4, 0x0118, 0x7264, 0x9294, 0x00ff,
+	0x0096, 0x904d, 0x0188, 0xa87b, 0x0000, 0xa864, 0x9086, 0x0139,
+	0x0128, 0xa867, 0x0103, 0xa976, 0xaa96, 0x0030, 0xa897, 0x4000,
+	0xa99a, 0xaa9e, 0x080c, 0x698f, 0x009e, 0x0804, 0x9bcc, 0x080c,
+	0x538e, 0x0dd8, 0x6014, 0x900e, 0x9016, 0x0c10, 0x9182, 0x0085,
+	0x0002, 0xb1b0, 0xb1ae, 0xb1ae, 0xb1bc, 0xb1ae, 0xb1ae, 0xb1ae,
+	0xb1ae, 0xb1ae, 0xb1ae, 0xb1ae, 0xb1ae, 0xb1ae, 0x080c, 0x0d65,
+	0x6003, 0x0001, 0x6106, 0x0126, 0x2091, 0x8000, 0x2009, 0x8020,
+	0x080c, 0x84a9, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6,
+	0x2071, 0x0260, 0x7224, 0x6216, 0x7220, 0x080c, 0xb81a, 0x01a0,
+	0x2268, 0x6800, 0x9086, 0x0000, 0x0178, 0x6010, 0x6d10, 0x952e,
+	0x1158, 0x00c6, 0x2d60, 0x080c, 0xb42a, 0x00ce, 0x0128, 0x6803,
+	0x0002, 0x6007, 0x0086, 0x0010, 0x6007, 0x0087, 0x6003, 0x0001,
+	0x2009, 0x8020, 0x080c, 0x84a9, 0x9280, 0x0004, 0x00b6, 0x2058,
+	0xb800, 0x00be, 0xd0bc, 0x0140, 0x6824, 0xd0ec, 0x0128, 0x00c6,
+	0x2260, 0x080c, 0xbb71, 0x00ce, 0x00ee, 0x00de, 0x005e, 0x002e,
+	0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c,
+	0x0d65, 0x908a, 0x0092, 0x1a0c, 0x0d65, 0x9082, 0x0085, 0x00e2,
+	0x9186, 0x0027, 0x0120, 0x9186, 0x0014, 0x190c, 0x0d65, 0x080c,
+	0x884c, 0x0096, 0x6014, 0x2048, 0x080c, 0xb82c, 0x0140, 0xa867,
+	0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x698f, 0x009e,
+	0x080c, 0x9c06, 0x0804, 0x890e, 0xb231, 0xb233, 0xb233, 0xb231,
+	0xb231, 0xb231, 0xb231, 0xb231, 0xb231, 0xb231, 0xb231, 0xb231,
+	0xb231, 0x080c, 0x0d65, 0x080c, 0x9c06, 0x0005, 0x9186, 0x0013,
+	0x1130, 0x6004, 0x9082, 0x0085, 0x2008, 0x0804, 0xb282, 0x9186,
+	0x0027, 0x1558, 0x080c, 0x884c, 0x080c, 0x3003, 0x080c, 0xbf5b,
+	0x0096, 0x6014, 0x2048, 0x080c, 0xb82c, 0x0150, 0xa867, 0x0103,
+	0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x698f, 0x080c, 0xba1b,
+	0x009e, 0x080c, 0x9bcc, 0x0005, 0x9186, 0x0089, 0x0118, 0x9186,
+	0x008a, 0x1140, 0x080c, 0x9a9c, 0x0128, 0x9086, 0x000c, 0x0904,
+	0xb2ba, 0x0000, 0x080c, 0x9c87, 0x0c70, 0x9186, 0x0014, 0x1d60,
+	0x080c, 0x884c, 0x0096, 0x6014, 0x2048, 0x080c, 0xb82c, 0x0d00,
+	0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0006, 0xa880, 0xc0ec,
+	0xa882, 0x0890, 0x0002, 0xb292, 0xb290, 0xb290, 0xb290, 0xb290,
+	0xb290, 0xb2a6, 0xb290, 0xb290, 0xb290, 0xb290, 0xb290, 0xb290,
+	0x080c, 0x0d65, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039,
+	0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1957, 0x0010, 0x2001,
+	0x1958, 0x2004, 0x601a, 0x6003, 0x000c, 0x0005, 0x6034, 0x908c,
+	0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118,
+	0x2001, 0x1957, 0x0010, 0x2001, 0x1958, 0x2004, 0x601a, 0x6003,
+	0x000e, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208,
+	0x0012, 0x0804, 0x9c87, 0xb2d0, 0xb2d0, 0xb2d0, 0xb2d0, 0xb2d2,
+	0xb31f, 0xb2d0, 0xb2d0, 0xb2d0, 0xb2d0, 0xb2d0, 0xb2d0, 0xb2d0,
+	0x080c, 0x0d65, 0x0096, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be,
+	0xd0bc, 0x0168, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039,
+	0x0118, 0x9186, 0x0035, 0x1118, 0x009e, 0x0804, 0xb333, 0x080c,
+	0xb82c, 0x1118, 0x080c, 0xba1b, 0x0068, 0x6014, 0x2048, 0x080c,
+	0xbf72, 0x1110, 0x080c, 0xba1b, 0xa867, 0x0103, 0x080c, 0xbf26,
+	0x080c, 0x698f, 0x00d6, 0x2c68, 0x080c, 0x9b76, 0x01d0, 0x6003,
+	0x0001, 0x6007, 0x001e, 0x600b, 0xffff, 0x2009, 0x026e, 0x210c,
+	0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x6910, 0x6112, 0x080c,
+	0xbcc0, 0x695c, 0x615e, 0x6023, 0x0001, 0x2009, 0x8020, 0x080c,
+	0x84a9, 0x2d60, 0x00de, 0x080c, 0x9bcc, 0x009e, 0x0005, 0x6010,
+	0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x05a0, 0x6034, 0x908c,
+	0xff00, 0x810f, 0x9186, 0x0035, 0x0130, 0x9186, 0x001e, 0x0118,
+	0x9186, 0x0039, 0x1538, 0x00d6, 0x2c68, 0x080c, 0xbebe, 0x11f0,
+	0x080c, 0x9b76, 0x01d8, 0x6106, 0x6003, 0x0001, 0x6023, 0x0001,
+	0x6910, 0x6112, 0x692c, 0x612e, 0x6930, 0x6132, 0x6934, 0x918c,
+	0x00ff, 0x6136, 0x6938, 0x613a, 0x693c, 0x613e, 0x695c, 0x615e,
+	0x080c, 0xbcc0, 0x2009, 0x8020, 0x080c, 0x84a9, 0x2d60, 0x00de,
+	0x0804, 0x9bcc, 0x0096, 0x6014, 0x2048, 0x080c, 0xb82c, 0x01c8,
+	0xa867, 0x0103, 0xa880, 0xd0b4, 0x0128, 0xc0ec, 0xa882, 0xa87b,
+	0x0006, 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b,
+	0x0005, 0x080c, 0xbb30, 0xa877, 0x0000, 0x080c, 0x698f, 0x080c,
+	0xba1b, 0x009e, 0x0804, 0x9bcc, 0x0016, 0x0096, 0x6014, 0x2048,
+	0x080c, 0xb82c, 0x0140, 0xa867, 0x0103, 0xa87b, 0x0028, 0xa877,
+	0x0000, 0x080c, 0x698f, 0x009e, 0x001e, 0x9186, 0x0013, 0x0158,
+	0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0x9c87,
+	0x0020, 0x080c, 0x884c, 0x080c, 0x9c06, 0x0005, 0x0056, 0x0066,
+	0x0096, 0x00a6, 0x2029, 0x0001, 0x9182, 0x0101, 0x1208, 0x0010,
+	0x2009, 0x0100, 0x2130, 0x8304, 0x9098, 0x0018, 0x2009, 0x0020,
+	0x2011, 0x0029, 0x080c, 0xb3ff, 0x96b2, 0x0020, 0xb004, 0x904d,
+	0x0110, 0x080c, 0x0fd4, 0x080c, 0x1022, 0x0520, 0x8528, 0xa867,
+	0x0110, 0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, 0x1228,
+	0x2608, 0x2011, 0x001b, 0x0499, 0x00a8, 0x96b2, 0x003c, 0x2009,
+	0x003c, 0x2950, 0x2011, 0x001b, 0x0451, 0x0c28, 0x2001, 0x0205,
+	0x2003, 0x0000, 0x00ae, 0x852f, 0x95ad, 0x0003, 0xb566, 0x95ac,
+	0x0000, 0x0048, 0x2001, 0x0205, 0x2003, 0x0000, 0x00ae, 0x852f,
+	0x95ad, 0x0003, 0xb566, 0x009e, 0x006e, 0x005e, 0x0005, 0x00a6,
+	0x89ff, 0x0158, 0xa804, 0x9055, 0x0130, 0xa807, 0x0000, 0x080c,
+	0x698f, 0x2a48, 0x0cb8, 0x080c, 0x698f, 0x00ae, 0x0005, 0x00f6,
+	0x2079, 0x0200, 0x7814, 0x9085, 0x0080, 0x7816, 0xd184, 0x0108,
+	0x8108, 0x810c, 0x20a9, 0x0001, 0xa860, 0x20e8, 0xa85c, 0x9200,
+	0x20a0, 0x20e1, 0x0000, 0x2300, 0x9e00, 0x2098, 0x4003, 0x8318,
+	0x9386, 0x0020, 0x1148, 0x2018, 0x2300, 0x9e00, 0x2098, 0x7814,
+	0x8000, 0x9085, 0x0080, 0x7816, 0x8109, 0x1d80, 0x7817, 0x0000,
+	0x00fe, 0x0005, 0x0066, 0x0126, 0x2091, 0x8000, 0x2031, 0x0001,
+	0x6020, 0x9084, 0x000f, 0x0083, 0x012e, 0x006e, 0x0005, 0x0126,
+	0x2091, 0x8000, 0x0066, 0x2031, 0x0000, 0x6020, 0x9084, 0x000f,
+	0x001b, 0x006e, 0x012e, 0x0005, 0xb47c, 0xb47c, 0xb477, 0xb4a0,
+	0xb454, 0xb477, 0xb456, 0xb477, 0xb454, 0xb454, 0xb477, 0xb477,
+	0xb477, 0xb454, 0xb454, 0xb454, 0x080c, 0x0d65, 0x6010, 0x9080,
+	0x0000, 0x2004, 0xd0bc, 0x190c, 0xb4a0, 0x0036, 0x6014, 0x0096,
+	0x2048, 0xa880, 0x009e, 0xd0cc, 0x0118, 0x2019, 0x000c, 0x0038,
+	0xd094, 0x0118, 0x2019, 0x000d, 0x0010, 0x2019, 0x0010, 0x080c,
+	0xcdd9, 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x9006,
+	0x0005, 0x9085, 0x0001, 0x0005, 0x0096, 0x86ff, 0x11e8, 0x6014,
+	0x2048, 0x080c, 0xb82c, 0x01d0, 0x6043, 0xffff, 0xa864, 0x9086,
+	0x0139, 0x1128, 0xa87b, 0x0005, 0xa883, 0x0000, 0x0028, 0x900e,
+	0x2001, 0x0005, 0x080c, 0x6bac, 0x080c, 0xbb30, 0x080c, 0x6983,
+	0x080c, 0x9c06, 0x9085, 0x0001, 0x009e, 0x0005, 0x9006, 0x0ce0,
+	0x080c, 0x98ad, 0x080c, 0xbf80, 0x6000, 0x908a, 0x0016, 0x1a0c,
+	0x0d65, 0x002b, 0x0106, 0x080c, 0x98c9, 0x010e, 0x0005, 0xb4bf,
+	0xb4ed, 0xb4c1, 0xb514, 0xb4e8, 0xb4bf, 0xb477, 0xb47c, 0xb47c,
+	0xb477, 0xb477, 0xb477, 0xb477, 0xb477, 0xb477, 0xb477, 0x080c,
+	0x0d65, 0x86ff, 0x1510, 0x6020, 0x9086, 0x0006, 0x01f0, 0x0096,
+	0x6014, 0x2048, 0x080c, 0xb82c, 0x0158, 0xa87c, 0xd0cc, 0x0130,
+	0x0096, 0xa878, 0x2048, 0x080c, 0x0fd4, 0x009e, 0x080c, 0xbb30,
+	0x009e, 0x080c, 0xbf00, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023,
+	0x0002, 0x2009, 0x8020, 0x080c, 0x848b, 0x9085, 0x0001, 0x0005,
+	0x0066, 0x080c, 0x1914, 0x006e, 0x08a0, 0x00e6, 0x2071, 0x19b8,
+	0x7030, 0x9c06, 0x1120, 0x080c, 0x91eb, 0x00ee, 0x0850, 0x6020,
+	0x9084, 0x000f, 0x9086, 0x0006, 0x1150, 0x0086, 0x0096, 0x2049,
+	0x0001, 0x2c40, 0x080c, 0x9367, 0x009e, 0x008e, 0x0040, 0x0066,
+	0x080c, 0x90e7, 0x190c, 0x0d65, 0x080c, 0x90f5, 0x006e, 0x00ee,
+	0x1904, 0xb4c1, 0x0804, 0xb477, 0x0036, 0x00e6, 0x2071, 0x19b8,
+	0x704c, 0x9c06, 0x1138, 0x901e, 0x080c, 0x926b, 0x00ee, 0x003e,
+	0x0804, 0xb4c1, 0x080c, 0x949d, 0x00ee, 0x003e, 0x1904, 0xb4c1,
+	0x0804, 0xb477, 0x00c6, 0x0066, 0x6020, 0x9084, 0x000f, 0x001b,
+	0x006e, 0x00ce, 0x0005, 0xb54a, 0xb60c, 0xb773, 0xb552, 0x9c06,
+	0xb54a, 0xcdcb, 0xbf68, 0xb60c, 0xb543, 0xb7f2, 0xb543, 0xb543,
+	0xb543, 0xb543, 0xb543, 0x080c, 0x0d65, 0x080c, 0xba41, 0x1110,
+	0x080c, 0xa574, 0x0005, 0x080c, 0x884c, 0x0804, 0x9bcc, 0x601b,
+	0x0001, 0x0005, 0x080c, 0xb82c, 0x0130, 0x6014, 0x0096, 0x2048,
+	0x2c00, 0xa896, 0x009e, 0x080c, 0x98ad, 0x080c, 0xbf80, 0x6000,
+	0x908a, 0x0016, 0x1a0c, 0x0d65, 0x0013, 0x0804, 0x98c9, 0xb577,
+	0xb579, 0xb5a3, 0xb5b7, 0xb5e2, 0xb577, 0xb54a, 0xb54a, 0xb54a,
+	0xb5be, 0xb5be, 0xb577, 0xb577, 0xb577, 0xb577, 0xb5c8, 0x080c,
+	0x0d65, 0x00e6, 0x6014, 0x0096, 0x2048, 0xa880, 0xc0b5, 0xa882,
+	0x009e, 0x2071, 0x19b8, 0x7030, 0x9c06, 0x01d0, 0x0066, 0x080c,
+	0x90e7, 0x190c, 0x0d65, 0x080c, 0x90f5, 0x006e, 0x080c, 0xbf00,
+	0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x2001, 0x1958,
+	0x2004, 0x601a, 0x2009, 0x8020, 0x080c, 0x848b, 0x00ee, 0x0005,
+	0x601b, 0x0001, 0x0cd8, 0x0096, 0x6014, 0x2048, 0xa880, 0xc0b5,
+	0xa882, 0x009e, 0x080c, 0xbf00, 0x6007, 0x0085, 0x6003, 0x000b,
+	0x6023, 0x0002, 0x2009, 0x8020, 0x080c, 0x848b, 0x0005, 0x080c,
+	0x98ad, 0x080c, 0x9a1e, 0x080c, 0x98c9, 0x0c28, 0x0096, 0x601b,
+	0x0001, 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x0005,
+	0x080c, 0x538e, 0x01a8, 0x6014, 0x0096, 0x904d, 0x0180, 0xa864,
+	0xa867, 0x0103, 0xa87b, 0x0006, 0x9086, 0x0139, 0x1140, 0xa867,
+	0x0139, 0xa897, 0x4005, 0xa89b, 0x0004, 0x080c, 0x698f, 0x009e,
+	0x0804, 0x9bcc, 0x6014, 0x0096, 0x904d, 0x0508, 0x080c, 0xbf6c,
+	0x01f0, 0x080c, 0x98c9, 0x2001, 0x180f, 0x2004, 0xd0c4, 0x0110,
+	0x009e, 0x0005, 0xa884, 0x009e, 0x8003, 0x800b, 0x810b, 0x9108,
+	0x611a, 0x2001, 0x0037, 0x2c08, 0x080c, 0x159e, 0x6000, 0x9086,
+	0x0004, 0x1120, 0x2009, 0x0048, 0x080c, 0x9c6a, 0x0005, 0x009e,
+	0x080c, 0x1914, 0x0804, 0xb5a3, 0x6000, 0x908a, 0x0016, 0x1a0c,
+	0x0d65, 0x000b, 0x0005, 0xb623, 0xb54f, 0xb625, 0xb623, 0xb625,
+	0xb625, 0xb54b, 0xb623, 0xb545, 0xb545, 0xb623, 0xb623, 0xb623,
+	0xb623, 0xb623, 0xb623, 0x080c, 0x0d65, 0x6010, 0x00b6, 0x2058,
+	0xb804, 0x9084, 0x00ff, 0x00be, 0x908a, 0x000c, 0x1a0c, 0x0d65,
+	0x00b6, 0x0013, 0x00be, 0x0005, 0xb640, 0xb70d, 0xb642, 0xb682,
+	0xb642, 0xb682, 0xb642, 0xb650, 0xb640, 0xb682, 0xb640, 0xb671,
+	0x080c, 0x0d65, 0x6004, 0x908e, 0x0016, 0x05c0, 0x908e, 0x0004,
+	0x05a8, 0x908e, 0x0002, 0x0590, 0x908e, 0x0052, 0x0904, 0xb709,
+	0x6004, 0x080c, 0xba41, 0x0904, 0xb726, 0x908e, 0x0004, 0x1110,
+	0x080c, 0x3034, 0x908e, 0x0021, 0x0904, 0xb72a, 0x908e, 0x0022,
+	0x0904, 0xb76e, 0x908e, 0x003d, 0x0904, 0xb72a, 0x908e, 0x0039,
+	0x0904, 0xb72e, 0x908e, 0x0035, 0x0904, 0xb72e, 0x908e, 0x001e,
+	0x0178, 0x908e, 0x0001, 0x1140, 0x6010, 0x2058, 0xb804, 0x9084,
+	0x00ff, 0x9086, 0x0006, 0x0110, 0x080c, 0x3003, 0x080c, 0xa574,
+	0x0804, 0x9c06, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0904,
+	0xb6fa, 0x9186, 0x0002, 0x1904, 0xb6cf, 0x2001, 0x1836, 0x2004,
+	0xd08c, 0x11c8, 0x080c, 0x70ac, 0x11b0, 0x080c, 0xbf46, 0x0138,
+	0x080c, 0x70cf, 0x1120, 0x080c, 0x6fb7, 0x0804, 0xb757, 0x2001,
+	0x194e, 0x2003, 0x0001, 0x2001, 0x1800, 0x2003, 0x0001, 0x080c,
+	0x6fdd, 0x0804, 0xb757, 0x6010, 0x2058, 0x2001, 0x1836, 0x2004,
+	0xd0ac, 0x1904, 0xb757, 0xb8a0, 0x9084, 0xff80, 0x1904, 0xb757,
+	0xb840, 0x9084, 0x00ff, 0x9005, 0x0190, 0x8001, 0xb842, 0x6017,
+	0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x604b, 0x0000, 0x080c,
+	0x9b76, 0x0128, 0x2b00, 0x6012, 0x6023, 0x0001, 0x0458, 0x00de,
+	0x00ce, 0x6004, 0x908e, 0x0002, 0x11a0, 0x6010, 0x2058, 0xb8a0,
+	0x9086, 0x007e, 0x1170, 0x2009, 0x1836, 0x2104, 0xc085, 0x200a,
+	0x00e6, 0x2071, 0x1800, 0x080c, 0x5c68, 0x00ee, 0x080c, 0xa574,
+	0x0030, 0x080c, 0xa574, 0x080c, 0x3003, 0x080c, 0xbf5b, 0x00e6,
+	0x0126, 0x2091, 0x8000, 0x080c, 0x3034, 0x012e, 0x00ee, 0x080c,
+	0x9c06, 0x0005, 0x2001, 0x0002, 0x080c, 0x61ba, 0x6003, 0x0001,
+	0x6007, 0x0002, 0x080c, 0x84b0, 0x080c, 0x890e, 0x00de, 0x00ce,
+	0x0c80, 0x080c, 0x3034, 0x0804, 0xb67e, 0x00c6, 0x00d6, 0x6104,
+	0x9186, 0x0016, 0x0d38, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff,
+	0x9005, 0x0904, 0xb6cf, 0x8001, 0xb842, 0x6003, 0x0001, 0x080c,
+	0x84b0, 0x080c, 0x890e, 0x00de, 0x00ce, 0x0898, 0x080c, 0xa574,
+	0x0804, 0xb680, 0x080c, 0xa5b0, 0x0804, 0xb680, 0x00d6, 0x2c68,
+	0x6104, 0x080c, 0xbebe, 0x00de, 0x0118, 0x080c, 0x9bcc, 0x00f0,
+	0x6004, 0x8007, 0x6134, 0x918c, 0x00ff, 0x9105, 0x6036, 0x6007,
+	0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x603c, 0x600a, 0x2001,
+	0x1958, 0x2004, 0x601a, 0x602c, 0x2c08, 0x2060, 0x6024, 0xc0b5,
+	0x6026, 0x2160, 0x2009, 0x8020, 0x080c, 0x84a9, 0x0005, 0x00de,
+	0x00ce, 0x080c, 0xa574, 0x080c, 0x3003, 0x00e6, 0x0126, 0x2091,
+	0x8000, 0x080c, 0x3034, 0x6017, 0x0000, 0x6023, 0x0007, 0x601b,
+	0x0398, 0x604b, 0x0000, 0x012e, 0x00ee, 0x0005, 0x080c, 0xa007,
+	0x1904, 0xb726, 0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d65,
+	0x0096, 0x00d6, 0x001b, 0x00de, 0x009e, 0x0005, 0xb78e, 0xb78e,
+	0xb78e, 0xb78e, 0xb78e, 0xb78e, 0xb78e, 0xb78e, 0xb78e, 0xb54a,
+	0xb78e, 0xb54f, 0xb790, 0xb54f, 0xb79d, 0xb78e, 0x080c, 0x0d65,
+	0x6004, 0x9086, 0x008b, 0x0148, 0x6007, 0x008b, 0x6003, 0x000d,
+	0x2009, 0x8020, 0x080c, 0x84a9, 0x0005, 0x080c, 0xbf3a, 0x0118,
+	0x080c, 0xbf4d, 0x0010, 0x080c, 0xbf5b, 0x080c, 0xba1b, 0x080c,
+	0xb82c, 0x0570, 0x080c, 0x3003, 0x080c, 0xb82c, 0x0168, 0x6014,
+	0x2048, 0xa867, 0x0103, 0xa87b, 0x0006, 0xa877, 0x0000, 0xa880,
+	0xc0ed, 0xa882, 0x080c, 0x698f, 0x2c68, 0x080c, 0x9b76, 0x0150,
+	0x6810, 0x6012, 0x080c, 0xbcc0, 0x00c6, 0x2d60, 0x080c, 0x9c06,
+	0x00ce, 0x0008, 0x2d60, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007,
+	0x0001, 0x6003, 0x0001, 0x080c, 0x84b0, 0x080c, 0x890e, 0x00c8,
+	0x080c, 0xbf3a, 0x0138, 0x6034, 0x9086, 0x4000, 0x1118, 0x080c,
+	0x3003, 0x08d0, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039,
+	0x0118, 0x9186, 0x0035, 0x1118, 0x080c, 0x3003, 0x0868, 0x080c,
+	0x9c06, 0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d65, 0x0002,
+	0xb808, 0xb808, 0xb80a, 0xb80a, 0xb80a, 0xb808, 0xb808, 0x9c06,
+	0xb808, 0xb808, 0xb808, 0xb808, 0xb808, 0xb808, 0xb808, 0xb808,
+	0x080c, 0x0d65, 0x080c, 0x98ad, 0x080c, 0x9a1e, 0x080c, 0x98c9,
+	0x6114, 0x0096, 0x2148, 0xa87b, 0x0006, 0x080c, 0x698f, 0x009e,
+	0x0804, 0x9bcc, 0x9284, 0x0003, 0x1158, 0x9282, 0x1ddc, 0x0240,
+	0x2001, 0x1819, 0x2004, 0x9202, 0x1218, 0x9085, 0x0001, 0x0005,
+	0x9006, 0x0ce8, 0x0096, 0x0028, 0x0096, 0x0006, 0x6014, 0x2048,
+	0x000e, 0x0006, 0x9984, 0xf000, 0x9086, 0xf000, 0x0110, 0x080c,
+	0x10cd, 0x000e, 0x009e, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0006,
+	0x0126, 0x2091, 0x8000, 0x2061, 0x1ddc, 0x2071, 0x1800, 0x7350,
+	0x7070, 0x9302, 0x1640, 0x6020, 0x9206, 0x11f8, 0x080c, 0xbf46,
+	0x0180, 0x9286, 0x0001, 0x1168, 0x6004, 0x9086, 0x0004, 0x1148,
+	0x080c, 0x3003, 0x080c, 0xbf5b, 0x00c6, 0x080c, 0x9c06, 0x00ce,
+	0x0060, 0x080c, 0xbc32, 0x0148, 0x080c, 0xba41, 0x1110, 0x080c,
+	0xa574, 0x00c6, 0x080c, 0x9bcc, 0x00ce, 0x9ce0, 0x001c, 0x7064,
+	0x9c02, 0x1208, 0x08a0, 0x012e, 0x000e, 0x003e, 0x00ce, 0x00ee,
+	0x0005, 0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000, 0x210c, 0x81ff,
+	0x0128, 0x2061, 0x1b02, 0x6112, 0x080c, 0x3003, 0x9006, 0x0010,
+	0x9085, 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6, 0x0126,
+	0x2091, 0x8000, 0x080c, 0x9b76, 0x01b0, 0x665e, 0x2b00, 0x6012,
+	0x080c, 0x538e, 0x0118, 0x080c, 0xb95d, 0x0168, 0x080c, 0xbcc0,
+	0x6023, 0x0003, 0x2009, 0x004b, 0x080c, 0x9c6a, 0x9085, 0x0001,
+	0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091,
+	0x8000, 0xbaa0, 0x080c, 0x9c3d, 0x0580, 0x605f, 0x0000, 0x2b00,
+	0x6012, 0x080c, 0xbcc0, 0x6023, 0x0003, 0x0016, 0x080c, 0x98ad,
+	0x080c, 0x8613, 0x0076, 0x903e, 0x080c, 0x8502, 0x2c08, 0x080c,
+	0xcfa6, 0x007e, 0x080c, 0x98c9, 0x001e, 0xd184, 0x0128, 0x080c,
+	0x9bcc, 0x9085, 0x0001, 0x0070, 0x080c, 0x538e, 0x0128, 0xd18c,
+	0x1170, 0x080c, 0xb95d, 0x0148, 0x2009, 0x004c, 0x080c, 0x9c6a,
+	0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2900,
+	0x6016, 0x0c90, 0x2009, 0x004d, 0x0010, 0x2009, 0x004e, 0x00f6,
+	0x00c6, 0x0046, 0x0016, 0x080c, 0x9b76, 0x2c78, 0x0590, 0x7e5e,
+	0x2b00, 0x7812, 0x7823, 0x0003, 0x2021, 0x0005, 0x080c, 0xb96f,
+	0x9186, 0x004d, 0x0118, 0x9186, 0x004e, 0x0148, 0x2001, 0x1951,
+	0x200c, 0xd1fc, 0x0168, 0x2f60, 0x080c, 0x9bcc, 0x00d0, 0x2001,
+	0x1950, 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, 0x9bcc, 0x0088,
+	0x2f60, 0x080c, 0x538e, 0x0138, 0xd18c, 0x1118, 0x04f1, 0x0148,
+	0x0010, 0x2900, 0x7816, 0x001e, 0x0016, 0x080c, 0x9c6a, 0x9085,
+	0x0001, 0x001e, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6,
+	0x0046, 0x080c, 0x9b76, 0x2c78, 0x0508, 0x7e5e, 0x2b00, 0x7812,
+	0x7823, 0x0003, 0x0096, 0x2021, 0x0004, 0x0489, 0x009e, 0x2001,
+	0x194f, 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, 0x9bcc, 0x0060,
+	0x2f60, 0x080c, 0x538e, 0x0120, 0xd18c, 0x1160, 0x0071, 0x0130,
+	0x2009, 0x0052, 0x080c, 0x9c6a, 0x9085, 0x0001, 0x004e, 0x00ce,
+	0x00fe, 0x0005, 0x2900, 0x7816, 0x0c98, 0x00c6, 0x080c, 0x4871,
+	0x00ce, 0x1120, 0x080c, 0x9bcc, 0x9006, 0x0005, 0xa867, 0x0000,
+	0xa86b, 0x8000, 0x2900, 0x6016, 0x9085, 0x0001, 0x0005, 0x0096,
+	0x0076, 0x0126, 0x2091, 0x8000, 0x080c, 0x98ad, 0x080c, 0x6448,
+	0x0158, 0x2001, 0xb976, 0x0006, 0x900e, 0x2400, 0x080c, 0x6bac,
+	0x080c, 0x698f, 0x000e, 0x0807, 0x2418, 0x080c, 0x8812, 0xbaa0,
+	0x0086, 0x2041, 0x0001, 0x2039, 0x0001, 0x2608, 0x080c, 0x862d,
+	0x008e, 0x080c, 0x8502, 0x2f08, 0x2648, 0x080c, 0xcfa6, 0xb93c,
+	0x81ff, 0x090c, 0x8704, 0x080c, 0x98c9, 0x012e, 0x007e, 0x009e,
+	0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9b76, 0x0190,
+	0x660a, 0x2b08, 0x6112, 0x080c, 0xbcc0, 0x6023, 0x0001, 0x2900,
+	0x6016, 0x2009, 0x001f, 0x080c, 0x9c6a, 0x9085, 0x0001, 0x012e,
+	0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000,
+	0x080c, 0x9c3d, 0x01b8, 0x660a, 0x2b08, 0x6112, 0x080c, 0xbcc0,
+	0x6023, 0x0008, 0x2900, 0x6016, 0x00f6, 0x2c78, 0x080c, 0x164f,
+	0x00fe, 0x2009, 0x0021, 0x080c, 0x9c6a, 0x9085, 0x0001, 0x012e,
+	0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, 0x003d, 0x00c6, 0x0126,
+	0x0016, 0x2091, 0x8000, 0x080c, 0x9b76, 0x0198, 0x660a, 0x2b08,
+	0x6112, 0x080c, 0xbcc0, 0x6023, 0x0001, 0x2900, 0x6016, 0x001e,
+	0x0016, 0x080c, 0x9c6a, 0x9085, 0x0001, 0x001e, 0x012e, 0x00ce,
+	0x0005, 0x9006, 0x0cd0, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c,
+	0x9c3d, 0x0188, 0x2b08, 0x6112, 0x080c, 0xbcc0, 0x6023, 0x0001,
+	0x2900, 0x6016, 0x2009, 0x0000, 0x080c, 0x9c6a, 0x9085, 0x0001,
+	0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, 0x0044, 0x0830,
+	0x2009, 0x0049, 0x0818, 0x0026, 0x00b6, 0x6210, 0x2258, 0xba3c,
+	0x82ff, 0x0118, 0x8211, 0xba3e, 0x1140, 0xb8c0, 0x9005, 0x0128,
+	0xb888, 0x9005, 0x1110, 0xb88b, 0x0001, 0x00be, 0x002e, 0x0005,
+	0x0006, 0x0016, 0x6004, 0x908e, 0x0002, 0x0140, 0x908e, 0x0003,
+	0x0128, 0x908e, 0x0004, 0x0110, 0x9085, 0x0001, 0x001e, 0x000e,
+	0x0005, 0x0006, 0x0096, 0x6020, 0x9086, 0x0004, 0x0190, 0x6014,
+	0x904d, 0x080c, 0xb82c, 0x0168, 0xa864, 0x9086, 0x0139, 0x0158,
+	0x6020, 0x9086, 0x0003, 0x0128, 0xa868, 0xd0fc, 0x0110, 0x9006,
+	0x0010, 0x9085, 0x0001, 0x009e, 0x000e, 0x0005, 0x00c6, 0x0126,
+	0x2091, 0x8000, 0x080c, 0x9c3d, 0x0198, 0x2b08, 0x6112, 0x080c,
+	0xbcc0, 0x6023, 0x0001, 0x2900, 0x6016, 0x080c, 0x3003, 0x2009,
+	0x0028, 0x080c, 0x9c6a, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005,
+	0x9006, 0x0cd8, 0x9186, 0x0015, 0x11a8, 0x2011, 0x1823, 0x2204,
+	0x9086, 0x0074, 0x1178, 0x00b6, 0x080c, 0xa7fd, 0x00be, 0x080c,
+	0xaa3c, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, 0x84b0, 0x080c,
+	0x890e, 0x0078, 0x6014, 0x0096, 0x2048, 0xa868, 0x009e, 0xd0fc,
+	0x0148, 0x2001, 0x0001, 0x080c, 0xbe7f, 0x080c, 0xa574, 0x080c,
+	0x9bcc, 0x0005, 0x0096, 0x6014, 0x904d, 0x090c, 0x0d65, 0xa87b,
+	0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0xa867,
+	0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x698f, 0x012e, 0x009e,
+	0x080c, 0x9bcc, 0x0c30, 0x0096, 0x9186, 0x0016, 0x1128, 0x2001,
+	0x0004, 0x080c, 0x61ba, 0x00e8, 0x9186, 0x0015, 0x1510, 0x2011,
+	0x1823, 0x2204, 0x9086, 0x0014, 0x11e0, 0x6010, 0x00b6, 0x2058,
+	0x080c, 0x6304, 0x00be, 0x080c, 0xab0d, 0x1198, 0x6010, 0x00b6,
+	0x2058, 0xb890, 0x00be, 0x9005, 0x0160, 0x2001, 0x0006, 0x080c,
+	0x61ba, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0170, 0x080c, 0x9fdb,
+	0x0048, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0528, 0x080c, 0xa574,
+	0x080c, 0x9bcc, 0x009e, 0x0005, 0x6014, 0x6310, 0x2358, 0x904d,
+	0x090c, 0x0d65, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000,
+	0x900e, 0x080c, 0x6558, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108,
+	0xc18d, 0xa99a, 0x0126, 0x2091, 0x8000, 0x080c, 0x698f, 0x012e,
+	0x080c, 0x9bcc, 0x08f8, 0x6014, 0x904d, 0x090c, 0x0d65, 0xa87b,
+	0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0xa867,
+	0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x698f, 0x012e, 0x080c,
+	0x9bcc, 0x0840, 0xa878, 0x9086, 0x0005, 0x1108, 0x0009, 0x0005,
+	0xa880, 0xc0ad, 0xa882, 0x0005, 0x604b, 0x0000, 0x6017, 0x0000,
+	0x6003, 0x0001, 0x6007, 0x0050, 0x2009, 0x8023, 0x080c, 0x84a9,
+	0x0005, 0x00c6, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc,
+	0x0130, 0x0066, 0x6020, 0x9084, 0x000f, 0x001b, 0x006e, 0x00ce,
+	0x0005, 0xb54a, 0xbb63, 0xbb63, 0xbb66, 0xd2a0, 0xd2bb, 0xd2be,
+	0xb54a, 0xb54a, 0xb54a, 0xb54a, 0xb54a, 0xb54a, 0xb54a, 0xb54a,
+	0xb54a, 0x080c, 0x0d65, 0xa001, 0xa001, 0x0005, 0x0096, 0x6014,
+	0x904d, 0x0118, 0xa87c, 0xd0e4, 0x1110, 0x009e, 0x0010, 0x009e,
+	0x0005, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0550,
+	0x2001, 0x1833, 0x2004, 0x9005, 0x1540, 0x00f6, 0x2c78, 0x080c,
+	0x9b76, 0x0508, 0x7810, 0x6012, 0x080c, 0xbcc0, 0x7820, 0x9086,
+	0x0003, 0x0128, 0x7808, 0x603a, 0x2f00, 0x603e, 0x0020, 0x7808,
+	0x603e, 0x2f00, 0x603a, 0x602e, 0x6023, 0x0001, 0x6007, 0x0035,
+	0x6003, 0x0001, 0x795c, 0x615e, 0x2009, 0x8020, 0x080c, 0x84a9,
+	0x2f60, 0x00fe, 0x0005, 0x2f60, 0x00fe, 0x2001, 0x1959, 0x2004,
+	0x604a, 0x0005, 0x0016, 0x0096, 0x6814, 0x2048, 0x681c, 0xd0fc,
+	0xc0fc, 0x681e, 0xa87c, 0x1108, 0xd0e4, 0x0180, 0xc0e4, 0xa87e,
+	0xa877, 0x0000, 0xa893, 0x0000, 0xa88f, 0x0000, 0xd0cc, 0x0130,
+	0xc0cc, 0xa87e, 0xa878, 0x2048, 0x080c, 0x0fd4, 0x6830, 0x6036,
+	0x908e, 0x0001, 0x0148, 0x6803, 0x0002, 0x9086, 0x0005, 0x0170,
+	0x9006, 0x602e, 0x6032, 0x00d0, 0x681c, 0xc085, 0x681e, 0x6803,
+	0x0004, 0x6824, 0xc0f4, 0x9085, 0x0c00, 0x6826, 0x6814, 0x2048,
+	0xa8ac, 0x6938, 0x9102, 0xa8b0, 0x693c, 0x9103, 0x1e48, 0x683c,
+	0x602e, 0x6838, 0x9084, 0xfffc, 0x683a, 0x6032, 0x2d00, 0x603a,
+	0x6808, 0x603e, 0x6910, 0x6112, 0x695c, 0x615e, 0x6023, 0x0001,
+	0x6007, 0x0039, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x84a9,
+	0x009e, 0x001e, 0x0005, 0x6024, 0xd0d4, 0x0510, 0xd0f4, 0x11f8,
+	0x6038, 0x940a, 0x603c, 0x9303, 0x0230, 0x9105, 0x0120, 0x6024,
+	0xc0d4, 0xc0f5, 0x0098, 0x643a, 0x633e, 0xac3e, 0xab42, 0x0046,
+	0x0036, 0x2400, 0xacac, 0x9402, 0xa836, 0x2300, 0xabb0, 0x9303,
+	0xa83a, 0x003e, 0x004e, 0x6024, 0xc0d4, 0x0000, 0x6026, 0x0005,
+	0xd0f4, 0x1138, 0xa83c, 0x603a, 0xa840, 0x603e, 0x6024, 0xc0f5,
+	0x6026, 0x0005, 0x0006, 0x0016, 0x6004, 0x908e, 0x0034, 0x01b8,
+	0x908e, 0x0035, 0x01a0, 0x908e, 0x0036, 0x0188, 0x908e, 0x0037,
+	0x0170, 0x908e, 0x0038, 0x0158, 0x908e, 0x0039, 0x0140, 0x908e,
+	0x003a, 0x0128, 0x908e, 0x003b, 0x0110, 0x9085, 0x0001, 0x001e,
+	0x000e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, 0x2001,
+	0x1953, 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, 0x080c, 0x83f1,
+	0x2001, 0x1957, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001,
+	0x1955, 0x200c, 0x8000, 0x2014, 0x2071, 0x193d, 0x711a, 0x721e,
+	0x2001, 0x0064, 0x080c, 0x83f1, 0x2001, 0x1958, 0x82ff, 0x1110,
+	0x2011, 0x0014, 0x2202, 0x2001, 0x1959, 0x9288, 0x000a, 0x2102,
+	0x2001, 0x0017, 0x080c, 0x989e, 0x2001, 0x1a59, 0x2102, 0x2001,
+	0x0032, 0x080c, 0x159e, 0x080c, 0x6641, 0x00ee, 0x003e, 0x002e,
+	0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x00e6, 0x2001, 0x1957,
+	0x2003, 0x0028, 0x2001, 0x1958, 0x2003, 0x0014, 0x2071, 0x193d,
+	0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, 0x1959, 0x2009, 0x001e,
+	0x2102, 0x2001, 0x0017, 0x080c, 0x989e, 0x2001, 0x1a59, 0x2102,
+	0x2001, 0x0032, 0x080c, 0x159e, 0x00ee, 0x001e, 0x000e, 0x0005,
+	0x0096, 0x6060, 0x904d, 0x0110, 0x080c, 0x1054, 0x009e, 0x0005,
+	0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9b76, 0x0180,
+	0x2b08, 0x6112, 0x0ca9, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009,
+	0x0033, 0x080c, 0x9c6a, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005,
+	0x9006, 0x0cd8, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186,
+	0x0015, 0x1500, 0x708c, 0x9086, 0x0018, 0x11e0, 0x6014, 0x2048,
+	0xaa3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x89cd, 0x01d8, 0x7078,
+	0xaa50, 0x9206, 0x1160, 0x707c, 0xaa54, 0x9206, 0x1140, 0x6210,
+	0x00b6, 0x2258, 0xbaa0, 0x00be, 0x900e, 0x080c, 0x3054, 0x080c,
+	0x9fdb, 0x0020, 0x080c, 0xa574, 0x080c, 0x9bcc, 0x00fe, 0x00ee,
+	0x009e, 0x0005, 0x705c, 0xaa54, 0x9206, 0x0d48, 0x0c80, 0x00c6,
+	0x0126, 0x2091, 0x8000, 0x080c, 0x9b76, 0x0188, 0x2b08, 0x6112,
+	0x080c, 0xbcc0, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x004d,
+	0x080c, 0x9c6a, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006,
+	0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0016, 0x080c, 0x9b76,
+	0x0180, 0x2b08, 0x6112, 0x080c, 0xbcc0, 0x6023, 0x0001, 0x2900,
+	0x6016, 0x001e, 0x080c, 0x9c6a, 0x9085, 0x0001, 0x012e, 0x00ce,
+	0x0005, 0x001e, 0x9006, 0x0cd0, 0x0016, 0x0026, 0x0036, 0x0046,
+	0x0056, 0x0066, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186,
+	0x0015, 0x1568, 0x718c, 0x6014, 0x2048, 0xa814, 0x8003, 0x9106,
+	0x1530, 0x20e1, 0x0000, 0x2001, 0x1971, 0x2003, 0x0000, 0x6014,
+	0x2048, 0xa830, 0x20a8, 0x8906, 0x8006, 0x8007, 0x9094, 0x003f,
+	0x22e8, 0x9084, 0xffc0, 0x9080, 0x001b, 0x20a0, 0x2001, 0x1971,
+	0x0016, 0x200c, 0x080c, 0xc529, 0x001e, 0xa804, 0x9005, 0x0110,
+	0x2048, 0x0c38, 0x6014, 0x2048, 0xa867, 0x0103, 0x0010, 0x080c,
+	0xa574, 0x080c, 0x9bcc, 0x00fe, 0x00ee, 0x009e, 0x006e, 0x005e,
+	0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x0096, 0x00e6, 0x00f6,
+	0x2071, 0x1800, 0x9186, 0x0015, 0x11b8, 0x708c, 0x9086, 0x0004,
+	0x1198, 0x6014, 0x2048, 0x2c78, 0x080c, 0x89cd, 0x01a8, 0x7078,
+	0xaa74, 0x9206, 0x1130, 0x707c, 0xaa78, 0x9206, 0x1110, 0x080c,
+	0x3003, 0x080c, 0x9fdb, 0x0020, 0x080c, 0xa574, 0x080c, 0x9bcc,
+	0x00fe, 0x00ee, 0x009e, 0x0005, 0x705c, 0xaa78, 0x9206, 0x0d78,
+	0x0c80, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015,
+	0x1550, 0x708c, 0x9086, 0x0004, 0x1530, 0x6014, 0x2048, 0x2c78,
+	0x080c, 0x89cd, 0x05f0, 0x7078, 0xaacc, 0x9206, 0x1180, 0x707c,
+	0xaad0, 0x9206, 0x1160, 0x080c, 0x3003, 0x0016, 0xa998, 0xaab0,
+	0x9284, 0x1000, 0xc0fd, 0x080c, 0x533e, 0x001e, 0x0010, 0x080c,
+	0x5127, 0x080c, 0xb82c, 0x0508, 0xa87b, 0x0000, 0xa883, 0x0000,
+	0xa897, 0x4000, 0x0080, 0x080c, 0xb82c, 0x01b8, 0x6014, 0x2048,
+	0x080c, 0x5127, 0x1d70, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897,
+	0x4005, 0xa89b, 0x0004, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139,
+	0x080c, 0x698f, 0x012e, 0x080c, 0x9bcc, 0x00fe, 0x00ee, 0x009e,
+	0x0005, 0x705c, 0xaad0, 0x9206, 0x0930, 0x0888, 0x0016, 0x0026,
+	0xa87c, 0xd0ac, 0x0178, 0xa938, 0xaa34, 0x2100, 0x9205, 0x0150,
+	0xa890, 0x9106, 0x1118, 0xa88c, 0x9206, 0x0120, 0xa992, 0xaa8e,
+	0x9085, 0x0001, 0x002e, 0x001e, 0x0005, 0x00b6, 0x00d6, 0x0036,
+	0x080c, 0xb82c, 0x0904, 0xbe7b, 0x0096, 0x6314, 0x2348, 0xa87a,
+	0xa982, 0x929e, 0x4000, 0x1580, 0x6310, 0x00c6, 0x2358, 0x2009,
+	0x0000, 0xa868, 0xd0f4, 0x1140, 0x080c, 0x6558, 0x1108, 0xc185,
+	0xb800, 0xd0bc, 0x0108, 0xc18d, 0xaa96, 0xa99a, 0x20a9, 0x0004,
+	0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0xb8b4, 0x20e0,
+	0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0f9f, 0x20a9, 0x0004,
+	0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8b8, 0x9080, 0x000a, 0x2098,
+	0x080c, 0x0f9f, 0x00ce, 0x0090, 0xaa96, 0x3918, 0x9398, 0x0007,
+	0x231c, 0x6004, 0x9086, 0x0016, 0x0110, 0xa89b, 0x0004, 0xaba2,
+	0x6310, 0x2358, 0xb804, 0x9084, 0x00ff, 0xa89e, 0x080c, 0x6983,
+	0x6017, 0x0000, 0x009e, 0x003e, 0x00de, 0x00be, 0x0005, 0x0026,
+	0x0036, 0x0046, 0x00b6, 0x0096, 0x00f6, 0x6214, 0x2248, 0x6210,
+	0x2258, 0x2079, 0x0260, 0x9096, 0x0000, 0x11a0, 0xb814, 0x9084,
+	0x00ff, 0x900e, 0x080c, 0x2424, 0x2118, 0x831f, 0x939c, 0xff00,
+	0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c, 0x2011, 0x8018, 0x080c,
+	0x48d1, 0x00a8, 0x9096, 0x0001, 0x1148, 0x89ff, 0x0180, 0xa89b,
+	0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, 0x0048, 0x9096, 0x0002,
+	0x1130, 0xa89b, 0x000d, 0x7838, 0xa8a6, 0x783c, 0xa8aa, 0x00fe,
+	0x009e, 0x00be, 0x004e, 0x003e, 0x002e, 0x0005, 0x00c6, 0x0026,
+	0x0016, 0x9186, 0x0035, 0x0110, 0x6a38, 0x0008, 0x6a2c, 0x080c,
+	0xb81a, 0x01f0, 0x2260, 0x6120, 0x9186, 0x0003, 0x0118, 0x9186,
+	0x0006, 0x1190, 0x6838, 0x9206, 0x0140, 0x683c, 0x9206, 0x1160,
+	0x6108, 0x6838, 0x9106, 0x1140, 0x0020, 0x6008, 0x693c, 0x9106,
+	0x1118, 0x6010, 0x6910, 0x9106, 0x001e, 0x002e, 0x00ce, 0x0005,
+	0x9085, 0x0001, 0x0cc8, 0xa974, 0xd1cc, 0x0188, 0x918c, 0x00ff,
+	0x918e, 0x0002, 0x1160, 0xa9a8, 0x918c, 0x0f00, 0x810f, 0x918e,
+	0x0001, 0x1128, 0xa834, 0xa938, 0x9115, 0x190c, 0xaea7, 0x0005,
+	0x0036, 0x2019, 0x0001, 0x0010, 0x0036, 0x901e, 0x0499, 0x01e0,
+	0x080c, 0xb82c, 0x01c8, 0x080c, 0xba1b, 0x6037, 0x4000, 0x6014,
+	0x6017, 0x0000, 0x0096, 0x2048, 0xa87c, 0x080c, 0xba41, 0x1118,
+	0x080c, 0xa574, 0x0040, 0xa867, 0x0103, 0xa877, 0x0000, 0x83ff,
+	0x1129, 0x080c, 0x698f, 0x009e, 0x003e, 0x0005, 0xa880, 0xd0b4,
+	0x0128, 0xa87b, 0x0006, 0xc0ec, 0xa882, 0x0048, 0xd0bc, 0x0118,
+	0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, 0xbb30, 0xa877,
+	0x0000, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0ec, 0x0005, 0x0006,
+	0x2001, 0x1810, 0x2004, 0xd0f4, 0x000e, 0x0005, 0x0006, 0x2001,
+	0x1810, 0x2004, 0xd0e4, 0x000e, 0x0005, 0x0036, 0x0046, 0x6010,
+	0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0007, 0x080c, 0x4a6e,
+	0x004e, 0x003e, 0x0005, 0x0c51, 0x1d81, 0x0005, 0x2001, 0x1957,
+	0x2004, 0x601a, 0x0005, 0x2001, 0x1959, 0x2004, 0x604a, 0x0005,
+	0x080c, 0x9bcc, 0x0804, 0x890e, 0x611c, 0xd1fc, 0xa97c, 0x1108,
+	0xd1e4, 0x0005, 0x601c, 0xd0fc, 0xa87c, 0x1108, 0xd0e4, 0x0005,
+	0x601c, 0xd0fc, 0xc0fc, 0x601e, 0xa87c, 0x1108, 0xd0e4, 0x0005,
+	0x6044, 0xd0fc, 0x0160, 0xd0dc, 0x1128, 0x908c, 0x000f, 0x9186,
+	0x0005, 0x1118, 0x6003, 0x0003, 0x0010, 0x6003, 0x0001, 0x0005,
+	0x00b6, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d65, 0x001b,
+	0x006e, 0x00be, 0x0005, 0xbfab, 0xc684, 0xc7d3, 0xbfab, 0xbfab,
+	0xbfab, 0xbfab, 0xbfab, 0xbfe2, 0xc851, 0xbfab, 0xbfab, 0xbfab,
+	0xbfab, 0xbfab, 0xbfab, 0x080c, 0x0d65, 0x0066, 0x6000, 0x90b2,
+	0x0016, 0x1a0c, 0x0d65, 0x0013, 0x006e, 0x0005, 0xbfc6, 0xcd68,
+	0xbfc6, 0xbfc6, 0xbfc6, 0xbfc6, 0xbfc6, 0xbfc6, 0xcd17, 0xcdba,
+	0xbfc6, 0xd3db, 0xd40f, 0xd3db, 0xd40f, 0xbfc6, 0x080c, 0x0d65,
+	0x6000, 0x9082, 0x0016, 0x1a0c, 0x0d65, 0x6000, 0x000a, 0x0005,
+	0xbfe0, 0xca2d, 0xcaf6, 0xcb18, 0xcb93, 0xbfe0, 0xcc8d, 0xcc1b,
+	0xc85b, 0xccef, 0xcd04, 0xbfe0, 0xbfe0, 0xbfe0, 0xbfe0, 0xbfe0,
+	0x080c, 0x0d65, 0x91b2, 0x0053, 0x1a0c, 0x0d65, 0x2100, 0x91b2,
+	0x0040, 0x1a04, 0xc427, 0x0002, 0xc02c, 0xc218, 0xc02c, 0xc02c,
+	0xc02c, 0xc221, 0xc02c, 0xc02c, 0xc02c, 0xc02c, 0xc02c, 0xc02c,
+	0xc02c, 0xc02c, 0xc02c, 0xc02c, 0xc02c, 0xc02c, 0xc02c, 0xc02c,
+	0xc02c, 0xc02c, 0xc02c, 0xc02e, 0xc095, 0xc0a4, 0xc108, 0xc133,
+	0xc1ab, 0xc203, 0xc02c, 0xc02c, 0xc224, 0xc02c, 0xc02c, 0xc239,
+	0xc246, 0xc02c, 0xc02c, 0xc02c, 0xc02c, 0xc02c, 0xc2c9, 0xc02c,
+	0xc02c, 0xc2dd, 0xc02c, 0xc02c, 0xc298, 0xc02c, 0xc02c, 0xc02c,
+	0xc2f5, 0xc02c, 0xc02c, 0xc02c, 0xc372, 0xc02c, 0xc02c, 0xc02c,
+	0xc02c, 0xc02c, 0xc02c, 0xc3ef, 0x080c, 0x0d65, 0x080c, 0x661e,
+	0x1150, 0x2001, 0x1836, 0x2004, 0xd0cc, 0x1128, 0x9084, 0x0009,
+	0x9086, 0x0008, 0x1140, 0x6007, 0x0009, 0x602f, 0x0009, 0x6017,
+	0x0000, 0x0804, 0xc211, 0x080c, 0x6607, 0x00e6, 0x00c6, 0x0036,
+	0x0026, 0x0016, 0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029,
+	0x080c, 0x98ad, 0x080c, 0x8613, 0x0076, 0x903e, 0x080c, 0x8502,
+	0x2c08, 0x080c, 0xcfa6, 0x007e, 0x001e, 0x080c, 0x98c9, 0x001e,
+	0x002e, 0x003e, 0x00ce, 0x00ee, 0x6610, 0x2658, 0x080c, 0x6278,
+	0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x1268, 0x0016, 0x0026,
+	0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x2c08, 0x080c, 0xd587,
+	0x002e, 0x001e, 0x1178, 0x080c, 0xced5, 0x1904, 0xc100, 0x080c,
+	0xce71, 0x1120, 0x6007, 0x0008, 0x0804, 0xc211, 0x6007, 0x0009,
+	0x0804, 0xc211, 0x080c, 0xd0dc, 0x0128, 0x080c, 0xced5, 0x0d78,
+	0x0804, 0xc100, 0x6017, 0x1900, 0x0c88, 0x080c, 0x3149, 0x1904,
+	0xc424, 0x6106, 0x080c, 0xce24, 0x6007, 0x0006, 0x0804, 0xc211,
+	0x6007, 0x0007, 0x0804, 0xc211, 0x080c, 0xd44b, 0x1904, 0xc424,
+	0x080c, 0x3149, 0x1904, 0xc424, 0x00d6, 0x6610, 0x2658, 0xbe04,
+	0x9684, 0x00ff, 0x9082, 0x0006, 0x1220, 0x2001, 0x0001, 0x080c,
+	0x61a6, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0188, 0x9686,
+	0x0004, 0x0170, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, 0x0140,
+	0x9686, 0x0004, 0x0128, 0x9686, 0x0005, 0x0110, 0x00de, 0x0480,
+	0x00e6, 0x2071, 0x0260, 0x7034, 0x9084, 0x0003, 0x1140, 0x7034,
+	0x9082, 0x0014, 0x0220, 0x7030, 0x9084, 0x0003, 0x0130, 0x00ee,
+	0x6017, 0x0000, 0x602f, 0x0007, 0x00b0, 0x00ee, 0x080c, 0xcf3c,
+	0x1190, 0x9686, 0x0006, 0x1140, 0x0026, 0x6210, 0x2258, 0xbaa0,
+	0x900e, 0x080c, 0x3054, 0x002e, 0x080c, 0x6304, 0x6007, 0x000a,
+	0x00de, 0x0804, 0xc211, 0x6007, 0x000b, 0x00de, 0x0804, 0xc211,
+	0x080c, 0x3003, 0x080c, 0xbf5b, 0x6007, 0x0001, 0x0804, 0xc211,
+	0x080c, 0xd44b, 0x1904, 0xc424, 0x080c, 0x3149, 0x1904, 0xc424,
+	0x2071, 0x0260, 0x7034, 0x90b4, 0x0003, 0x1948, 0x90b2, 0x0014,
+	0x0a30, 0x7030, 0x9084, 0x0003, 0x1910, 0x6610, 0x2658, 0xbe04,
+	0x9686, 0x0707, 0x09e8, 0x0026, 0x6210, 0x2258, 0xbaa0, 0x900e,
+	0x080c, 0x3054, 0x002e, 0x6007, 0x000c, 0x2001, 0x0001, 0x080c,
+	0xd567, 0x0804, 0xc211, 0x080c, 0x661e, 0x1140, 0x2001, 0x1836,
+	0x2004, 0x9084, 0x0009, 0x9086, 0x0008, 0x1110, 0x0804, 0xc03b,
+	0x080c, 0x6607, 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082,
+	0x0006, 0x06c0, 0x1138, 0x0026, 0x2001, 0x0006, 0x080c, 0x61e6,
+	0x002e, 0x0050, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0004, 0x0120,
+	0x9686, 0x0006, 0x1904, 0xc100, 0x080c, 0xcf49, 0x1120, 0x6007,
+	0x000e, 0x0804, 0xc211, 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046,
+	0x080c, 0x3003, 0x080c, 0xbf5b, 0x004e, 0x0016, 0x9006, 0x2009,
+	0x1854, 0x210c, 0x0048, 0x2009, 0x0029, 0x080c, 0xd251, 0x6010,
+	0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e, 0x004e, 0x6007, 0x0001,
+	0x0804, 0xc211, 0x2001, 0x0001, 0x080c, 0x61a6, 0x0156, 0x0016,
+	0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0270,
+	0x080c, 0xabb0, 0x003e, 0x002e, 0x001e, 0x015e, 0x9005, 0x0168,
+	0x96b4, 0xff00, 0x8637, 0x9682, 0x0004, 0x0a04, 0xc100, 0x9682,
+	0x0007, 0x0a04, 0xc15c, 0x0804, 0xc100, 0x6017, 0x1900, 0x6007,
+	0x0009, 0x0804, 0xc211, 0x080c, 0x661e, 0x1140, 0x2001, 0x1836,
+	0x2004, 0x9084, 0x0009, 0x9086, 0x0008, 0x1110, 0x0804, 0xc03b,
+	0x080c, 0x6607, 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082,
+	0x0006, 0x0688, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0004, 0x0120,
+	0x9686, 0x0006, 0x1904, 0xc100, 0x080c, 0xcf77, 0x1130, 0x080c,
+	0xce71, 0x1118, 0x6007, 0x0010, 0x04e0, 0x0046, 0x6410, 0x2458,
+	0xbca0, 0x0046, 0x080c, 0x3003, 0x080c, 0xbf5b, 0x004e, 0x0016,
+	0x9006, 0x2009, 0x1854, 0x210c, 0x0048, 0x2009, 0x0029, 0x080c,
+	0xd251, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e, 0x004e,
+	0x6007, 0x0001, 0x00f0, 0x080c, 0xd0dc, 0x0140, 0x96b4, 0xff00,
+	0x8637, 0x9686, 0x0006, 0x0980, 0x0804, 0xc100, 0x6017, 0x1900,
+	0x6007, 0x0009, 0x0070, 0x080c, 0x3149, 0x1904, 0xc424, 0x080c,
+	0xd44b, 0x1904, 0xc424, 0x080c, 0xc5c4, 0x1904, 0xc100, 0x6007,
+	0x0012, 0x6003, 0x0001, 0x080c, 0x84b0, 0x080c, 0x890e, 0x0005,
+	0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x84b0, 0x080c, 0x890e,
+	0x0cb0, 0x6007, 0x0005, 0x0c68, 0x080c, 0xd44b, 0x1904, 0xc424,
+	0x080c, 0x3149, 0x1904, 0xc424, 0x080c, 0xc5c4, 0x1904, 0xc100,
+	0x6007, 0x0020, 0x6003, 0x0001, 0x080c, 0x84b0, 0x080c, 0x890e,
+	0x0005, 0x080c, 0x3149, 0x1904, 0xc424, 0x6007, 0x0023, 0x6003,
+	0x0001, 0x080c, 0x84b0, 0x080c, 0x890e, 0x0005, 0x080c, 0xd44b,
+	0x1904, 0xc424, 0x080c, 0x3149, 0x1904, 0xc424, 0x080c, 0xc5c4,
+	0x1904, 0xc100, 0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, 0x7244,
+	0x9286, 0xffff, 0x0180, 0x2c08, 0x080c, 0xb81a, 0x01b0, 0x2260,
+	0x7240, 0x6008, 0x9206, 0x1188, 0x6010, 0x9190, 0x0004, 0x2214,
+	0x9206, 0x01b8, 0x0050, 0x7240, 0x2c08, 0x9006, 0x080c, 0xd223,
+	0x1180, 0x7244, 0x9286, 0xffff, 0x01b0, 0x2160, 0x6007, 0x0026,
+	0x6017, 0x1700, 0x7214, 0x9296, 0xffff, 0x1180, 0x6007, 0x0025,
+	0x0068, 0x6020, 0x9086, 0x0007, 0x1d80, 0x6004, 0x9086, 0x0024,
+	0x1110, 0x080c, 0x9bcc, 0x2160, 0x6007, 0x0025, 0x6003, 0x0001,
+	0x080c, 0x84b0, 0x080c, 0x890e, 0x00ee, 0x002e, 0x001e, 0x0005,
+	0x2001, 0x0001, 0x080c, 0x61a6, 0x0156, 0x0016, 0x0026, 0x0036,
+	0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0276, 0x080c, 0xabb0,
+	0x003e, 0x002e, 0x001e, 0x015e, 0x0120, 0x6007, 0x0031, 0x0804,
+	0xc211, 0x080c, 0xa815, 0x080c, 0x70ac, 0x1190, 0x0006, 0x0026,
+	0x0036, 0x080c, 0x70c6, 0x1138, 0x080c, 0x73ac, 0x080c, 0x5cd5,
+	0x080c, 0x6fdd, 0x0010, 0x080c, 0x7080, 0x003e, 0x002e, 0x000e,
+	0x0005, 0x080c, 0x3149, 0x1904, 0xc424, 0x080c, 0xc5c4, 0x1904,
+	0xc100, 0x6106, 0x080c, 0xc5e0, 0x1120, 0x6007, 0x002b, 0x0804,
+	0xc211, 0x6007, 0x002c, 0x0804, 0xc211, 0x080c, 0xd44b, 0x1904,
+	0xc424, 0x080c, 0x3149, 0x1904, 0xc424, 0x080c, 0xc5c4, 0x1904,
+	0xc100, 0x6106, 0x080c, 0xc5e5, 0x1120, 0x6007, 0x002e, 0x0804,
+	0xc211, 0x6007, 0x002f, 0x0804, 0xc211, 0x080c, 0x3149, 0x1904,
+	0xc424, 0x00e6, 0x00d6, 0x00c6, 0x6010, 0x2058, 0xb904, 0x9184,
+	0x00ff, 0x9086, 0x0006, 0x0158, 0x9184, 0xff00, 0x8007, 0x9086,
+	0x0006, 0x0128, 0x00ce, 0x00de, 0x00ee, 0x0804, 0xc218, 0x080c,
+	0x538a, 0xd0e4, 0x0904, 0xc36f, 0x2071, 0x026c, 0x7010, 0x603a,
+	0x7014, 0x603e, 0x7108, 0x720c, 0x080c, 0x665c, 0x0140, 0x6010,
+	0x2058, 0xb810, 0x9106, 0x1118, 0xb814, 0x9206, 0x0510, 0x080c,
+	0x6658, 0x15b8, 0x2069, 0x1800, 0x687c, 0x9206, 0x1590, 0x6878,
+	0x9106, 0x1578, 0x7210, 0x080c, 0xb81a, 0x0590, 0x080c, 0xc4af,
+	0x0578, 0x080c, 0xd2cd, 0x0560, 0x622e, 0x6007, 0x0036, 0x6003,
+	0x0001, 0x2009, 0x8020, 0x080c, 0x84a9, 0x00ce, 0x00de, 0x00ee,
+	0x0005, 0x7214, 0x9286, 0xffff, 0x0150, 0x080c, 0xb81a, 0x01c0,
+	0x9280, 0x0002, 0x2004, 0x7110, 0x9106, 0x1190, 0x08e0, 0x7210,
+	0x2c08, 0x9085, 0x0001, 0x080c, 0xd223, 0x2c10, 0x2160, 0x0140,
+	0x0890, 0x6007, 0x0037, 0x602f, 0x0009, 0x6017, 0x1500, 0x08b8,
+	0x6007, 0x0037, 0x602f, 0x0003, 0x6017, 0x1700, 0x0880, 0x6007,
+	0x0012, 0x0868, 0x080c, 0x3149, 0x1904, 0xc424, 0x6010, 0x2058,
+	0xb804, 0x9084, 0xff00, 0x8007, 0x9086, 0x0006, 0x1904, 0xc218,
+	0x00e6, 0x00d6, 0x00c6, 0x080c, 0x538a, 0xd0e4, 0x0904, 0xc3e7,
+	0x2069, 0x1800, 0x2071, 0x026c, 0x7008, 0x603a, 0x720c, 0x623e,
+	0x9286, 0xffff, 0x1150, 0x7208, 0x00c6, 0x2c08, 0x9085, 0x0001,
+	0x080c, 0xd223, 0x2c10, 0x00ce, 0x05e8, 0x080c, 0xb81a, 0x05d0,
+	0x7108, 0x9280, 0x0002, 0x2004, 0x9106, 0x15a0, 0x00c6, 0x0026,
+	0x2260, 0x080c, 0xb42a, 0x002e, 0x00ce, 0x7118, 0x918c, 0xff00,
+	0x810f, 0x9186, 0x0001, 0x0178, 0x9186, 0x0005, 0x0118, 0x9186,
+	0x0007, 0x1198, 0x9280, 0x0005, 0x2004, 0x9005, 0x0170, 0x080c,
+	0xc4af, 0x0904, 0xc368, 0x0056, 0x7510, 0x7614, 0x080c, 0xd2e6,
+	0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x6007, 0x003b, 0x602f,
+	0x0009, 0x6017, 0x2a00, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c,
+	0x84a9, 0x0c78, 0x6007, 0x003b, 0x602f, 0x0003, 0x6017, 0x0300,
+	0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x84a9, 0x0c10, 0x6007,
+	0x003b, 0x602f, 0x000b, 0x6017, 0x0000, 0x0804, 0xc33f, 0x00e6,
+	0x0026, 0x080c, 0x661e, 0x0550, 0x080c, 0x6607, 0x080c, 0xd4bd,
+	0x1518, 0x2071, 0x1800, 0x70d8, 0x9085, 0x0003, 0x70da, 0x00f6,
+	0x2079, 0x0100, 0x72ac, 0x9284, 0x00ff, 0x707a, 0x78e6, 0x9284,
+	0xff00, 0x727c, 0x9205, 0x707e, 0x78ea, 0x00fe, 0x70e3, 0x0000,
+	0x080c, 0x665c, 0x0120, 0x2011, 0x19da, 0x2013, 0x07d0, 0xd0ac,
+	0x1128, 0x080c, 0x2ddb, 0x0010, 0x080c, 0xd4ef, 0x002e, 0x00ee,
+	0x080c, 0x9bcc, 0x0804, 0xc217, 0x080c, 0x9bcc, 0x0005, 0x2600,
+	0x0002, 0xc43b, 0xc43b, 0xc43b, 0xc43b, 0xc43b, 0xc43d, 0xc43b,
+	0xc43b, 0xc43b, 0xc43b, 0xc45a, 0xc43b, 0xc43b, 0xc43b, 0xc46c,
+	0xc479, 0xc4aa, 0xc43b, 0x080c, 0x0d65, 0x080c, 0xd44b, 0x1d20,
+	0x080c, 0x3149, 0x1d08, 0x080c, 0xc5c4, 0x1148, 0x7038, 0x6016,
+	0x6007, 0x0045, 0x6003, 0x0001, 0x080c, 0x84b0, 0x0005, 0x080c,
+	0x3003, 0x080c, 0xbf5b, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c,
+	0x84b0, 0x0005, 0x080c, 0xd44b, 0x1938, 0x080c, 0x3149, 0x1920,
+	0x080c, 0xc5c4, 0x1d60, 0x703c, 0x6016, 0x6007, 0x004a, 0x6003,
+	0x0001, 0x080c, 0x84b0, 0x0005, 0x080c, 0xc4cc, 0x0904, 0xc424,
+	0x6007, 0x004e, 0x6003, 0x0001, 0x080c, 0x84b0, 0x080c, 0x890e,
+	0x0005, 0x6007, 0x004f, 0x6017, 0x0000, 0x7134, 0x918c, 0x00ff,
+	0x81ff, 0x0508, 0x9186, 0x0001, 0x1160, 0x7140, 0x2001, 0x198e,
+	0x2004, 0x9106, 0x11b0, 0x7144, 0x2001, 0x198f, 0x2004, 0x9106,
+	0x0190, 0x9186, 0x0002, 0x1168, 0x2011, 0x0276, 0x20a9, 0x0004,
+	0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, 0xabc4, 0x009e,
+	0x0110, 0x6017, 0x0001, 0x6003, 0x0001, 0x080c, 0x84b0, 0x080c,
+	0x890e, 0x0005, 0x6007, 0x0050, 0x703c, 0x6016, 0x0ca0, 0x0016,
+	0x00e6, 0x2071, 0x0260, 0x00b6, 0x00c6, 0x2260, 0x6010, 0x2058,
+	0xb8c4, 0xd084, 0x0150, 0x7128, 0x6050, 0x9106, 0x1120, 0x712c,
+	0x604c, 0x9106, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x00ce,
+	0x00be, 0x00ee, 0x001e, 0x0005, 0x0016, 0x0096, 0x0086, 0x00e6,
+	0x01c6, 0x01d6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x708c,
+	0x908a, 0x00f9, 0x16e8, 0x20e1, 0x0000, 0x2001, 0x1971, 0x2003,
+	0x0000, 0x080c, 0x103b, 0x05a0, 0x2900, 0x6016, 0x708c, 0x8004,
+	0xa816, 0x908a, 0x001e, 0x02d0, 0xa833, 0x001e, 0x20a9, 0x001e,
+	0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, 0x1971,
+	0x0016, 0x200c, 0x0471, 0x001e, 0x2940, 0x080c, 0x103b, 0x01c0,
+	0x2900, 0xa006, 0x2100, 0x81ff, 0x0180, 0x0c18, 0xa832, 0x20a8,
+	0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, 0x2001, 0x1971,
+	0x0016, 0x200c, 0x00b1, 0x001e, 0x0000, 0x9085, 0x0001, 0x0048,
+	0x2071, 0x1800, 0x708f, 0x0000, 0x6014, 0x2048, 0x080c, 0x0fd4,
+	0x9006, 0x012e, 0x01de, 0x01ce, 0x00ee, 0x008e, 0x009e, 0x001e,
+	0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00c6, 0x918c, 0xffff,
+	0x11a8, 0x080c, 0x202b, 0x2099, 0x026c, 0x2001, 0x0014, 0x3518,
+	0x9312, 0x1218, 0x23a8, 0x4003, 0x00f8, 0x20a8, 0x4003, 0x22a8,
+	0x8108, 0x080c, 0x202b, 0x2099, 0x0260, 0x0ca8, 0x080c, 0x202b,
+	0x2061, 0x1971, 0x6004, 0x2098, 0x6008, 0x3518, 0x9312, 0x1218,
+	0x23a8, 0x4003, 0x0048, 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c,
+	0x202b, 0x2099, 0x0260, 0x0ca8, 0x2061, 0x1971, 0x2019, 0x0280,
+	0x3300, 0x931e, 0x0110, 0x6006, 0x0020, 0x2001, 0x0260, 0x6006,
+	0x8108, 0x2162, 0x9292, 0x0021, 0x9296, 0xffff, 0x620a, 0x00ce,
+	0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x0026,
+	0x0036, 0x00c6, 0x81ff, 0x11b8, 0x080c, 0x2043, 0x20a1, 0x024c,
+	0x2001, 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0418,
+	0x20a8, 0x4003, 0x82ff, 0x01f8, 0x22a8, 0x8108, 0x080c, 0x2043,
+	0x20a1, 0x0240, 0x0c98, 0x080c, 0x2043, 0x2061, 0x1974, 0x6004,
+	0x20a0, 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0058,
+	0x20a8, 0x4003, 0x82ff, 0x0138, 0x22a8, 0x8108, 0x080c, 0x2043,
+	0x20a1, 0x0240, 0x0c98, 0x2061, 0x1974, 0x2019, 0x0260, 0x3400,
+	0x931e, 0x0110, 0x6006, 0x0020, 0x2001, 0x0240, 0x6006, 0x8108,
+	0x2162, 0x9292, 0x0021, 0x9296, 0xffff, 0x620a, 0x00ce, 0x003e,
+	0x002e, 0x001e, 0x000e, 0x0005, 0x00b6, 0x0066, 0x6610, 0x2658,
+	0xbe04, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0170, 0x9686,
+	0x0004, 0x0158, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, 0x0128,
+	0x9686, 0x0004, 0x0110, 0x9085, 0x0001, 0x006e, 0x00be, 0x0005,
+	0x00d6, 0x080c, 0xc65a, 0x00de, 0x0005, 0x00d6, 0x080c, 0xc667,
+	0x1520, 0x680c, 0x908c, 0xff00, 0x6820, 0x9084, 0x00ff, 0x9115,
+	0x6216, 0x6824, 0x602e, 0xd1e4, 0x0130, 0x9006, 0x080c, 0xd567,
+	0x2009, 0x0001, 0x0078, 0xd1ec, 0x0180, 0x6920, 0x918c, 0x00ff,
+	0x6824, 0x080c, 0x2424, 0x1148, 0x2001, 0x0001, 0x080c, 0xd567,
+	0x2110, 0x900e, 0x080c, 0x3054, 0x0018, 0x9085, 0x0001, 0x0008,
+	0x9006, 0x00de, 0x0005, 0x00b6, 0x00c6, 0x080c, 0x9c3d, 0x0598,
+	0x0016, 0x0026, 0x00c6, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c,
+	0x080c, 0x2424, 0x1568, 0x080c, 0x6209, 0x1550, 0xbe12, 0xbd16,
+	0x00ce, 0x002e, 0x001e, 0x2b00, 0x6012, 0x080c, 0xd44b, 0x11c8,
+	0x080c, 0x3149, 0x11b0, 0x080c, 0xc5c4, 0x0500, 0x2001, 0x0007,
+	0x080c, 0x61ba, 0x2001, 0x0007, 0x080c, 0x61e6, 0x6017, 0x0000,
+	0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x84b0,
+	0x0010, 0x080c, 0x9bcc, 0x9085, 0x0001, 0x00ce, 0x00be, 0x0005,
+	0x080c, 0x9bcc, 0x00ce, 0x002e, 0x001e, 0x0ca8, 0x080c, 0x9bcc,
+	0x9006, 0x0c98, 0x2069, 0x026d, 0x6800, 0x9082, 0x0010, 0x1228,
+	0x6017, 0x0000, 0x9085, 0x0001, 0x0008, 0x9006, 0x0005, 0x6017,
+	0x0000, 0x2069, 0x026c, 0x6808, 0x9084, 0xff00, 0x9086, 0x0800,
+	0x1190, 0x6904, 0x9186, 0x0018, 0x0118, 0x9186, 0x0014, 0x1158,
+	0x810f, 0x6800, 0x9084, 0x00ff, 0x910d, 0x6162, 0x908e, 0x0014,
+	0x0110, 0x908e, 0x0010, 0x0005, 0x6004, 0x90b2, 0x0053, 0x1a0c,
+	0x0d65, 0x91b6, 0x0013, 0x1130, 0x2008, 0x91b2, 0x0040, 0x1a04,
+	0xc7a7, 0x0092, 0x91b6, 0x0027, 0x0120, 0x91b6, 0x0014, 0x190c,
+	0x0d65, 0x2001, 0x0007, 0x080c, 0x61e6, 0x080c, 0x884c, 0x080c,
+	0x9c06, 0x080c, 0x890e, 0x0005, 0xc6e4, 0xc6e6, 0xc6e4, 0xc6e4,
+	0xc6e4, 0xc6e6, 0xc6f3, 0xc7a4, 0xc743, 0xc7a4, 0xc755, 0xc7a4,
+	0xc6f3, 0xc7a4, 0xc79c, 0xc7a4, 0xc79c, 0xc7a4, 0xc7a4, 0xc6e4,
+	0xc6e4, 0xc6e4, 0xc6e4, 0xc6e4, 0xc6e4, 0xc6e4, 0xc6e4, 0xc6e4,
+	0xc6e4, 0xc6e4, 0xc6e6, 0xc6e4, 0xc7a4, 0xc6e4, 0xc6e4, 0xc7a4,
+	0xc6e4, 0xc7a1, 0xc7a4, 0xc6e4, 0xc6e4, 0xc6e4, 0xc6e4, 0xc7a4,
+	0xc7a4, 0xc6e4, 0xc7a4, 0xc7a4, 0xc6e4, 0xc6ee, 0xc6e4, 0xc6e4,
+	0xc6e4, 0xc6e4, 0xc7a0, 0xc7a4, 0xc6e4, 0xc6e4, 0xc7a4, 0xc7a4,
+	0xc6e4, 0xc6e4, 0xc6e4, 0xc6e4, 0x080c, 0x0d65, 0x080c, 0xbf5e,
+	0x6003, 0x0002, 0x080c, 0x890e, 0x0804, 0xc7a6, 0x9006, 0x080c,
+	0x61a6, 0x0804, 0xc7a4, 0x080c, 0x6658, 0x1904, 0xc7a4, 0x9006,
+	0x080c, 0x61a6, 0x6010, 0x2058, 0xb810, 0x9086, 0x00ff, 0x1140,
+	0x00f6, 0x2079, 0x1800, 0x78a4, 0x8000, 0x78a6, 0x00fe, 0x0428,
+	0x6010, 0x2058, 0xb884, 0x9005, 0x1178, 0x080c, 0xbf46, 0x1904,
+	0xc7a4, 0x0036, 0x0046, 0xbba0, 0x2021, 0x0007, 0x080c, 0x4a6e,
+	0x004e, 0x003e, 0x0804, 0xc7a4, 0x080c, 0x317a, 0x1904, 0xc7a4,
+	0x2001, 0x1800, 0x2004, 0x9086, 0x0002, 0x1138, 0x00f6, 0x2079,
+	0x1800, 0x78a4, 0x8000, 0x78a6, 0x00fe, 0x2001, 0x0002, 0x080c,
+	0x61ba, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c,
+	0x84b0, 0x080c, 0x890e, 0x6110, 0x2158, 0x2009, 0x0001, 0x080c,
+	0x813f, 0x0804, 0xc7a6, 0x6610, 0x2658, 0xbe04, 0x96b4, 0xff00,
+	0x8637, 0x9686, 0x0006, 0x0904, 0xc7a4, 0x9686, 0x0004, 0x0904,
+	0xc7a4, 0x2001, 0x0004, 0x0804, 0xc7a2, 0x2001, 0x1800, 0x2004,
+	0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0,
+	0x2021, 0x0006, 0x080c, 0x4a6e, 0x004e, 0x003e, 0x2001, 0x0006,
+	0x080c, 0xc7c0, 0x6610, 0x2658, 0xbe04, 0x0066, 0x96b4, 0xff00,
+	0x8637, 0x9686, 0x0006, 0x006e, 0x0168, 0x2001, 0x0006, 0x080c,
+	0x61e6, 0x9284, 0x00ff, 0x908e, 0x0007, 0x1120, 0x2001, 0x0006,
+	0x080c, 0x61ba, 0x080c, 0x6658, 0x11f8, 0x2001, 0x1836, 0x2004,
+	0xd0a4, 0x01d0, 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, 0x01a0,
+	0x00f6, 0x2079, 0x1800, 0x78a4, 0x8000, 0x78a6, 0x00fe, 0x0804,
+	0xc72d, 0x2001, 0x0004, 0x0030, 0x2001, 0x0006, 0x0409, 0x0020,
+	0x0018, 0x0010, 0x080c, 0x61e6, 0x080c, 0x9bcc, 0x0005, 0x2600,
+	0x0002, 0xc7bb, 0xc7bb, 0xc7bb, 0xc7bb, 0xc7bb, 0xc7bd, 0xc7bb,
+	0xc7bb, 0xc7bb, 0xc7bb, 0xc7bd, 0xc7bb, 0xc7bb, 0xc7bb, 0xc7bd,
+	0xc7bd, 0xc7bd, 0xc7bd, 0x080c, 0x0d65, 0x080c, 0x9bcc, 0x0005,
+	0x0016, 0x00b6, 0x00d6, 0x6110, 0x2158, 0xb900, 0xd184, 0x0138,
+	0x080c, 0x61ba, 0x9006, 0x080c, 0x61a6, 0x080c, 0x3034, 0x00de,
+	0x00be, 0x001e, 0x0005, 0x6610, 0x2658, 0xb804, 0x9084, 0xff00,
+	0x8007, 0x90b2, 0x000c, 0x1a0c, 0x0d65, 0x91b6, 0x0015, 0x1110,
+	0x003b, 0x0028, 0x91b6, 0x0016, 0x190c, 0x0d65, 0x006b, 0x0005,
+	0xa655, 0xa655, 0xa655, 0xa655, 0xa655, 0xa655, 0xc83b, 0xc800,
+	0xa655, 0xa655, 0xa655, 0xa655, 0xa655, 0xa655, 0xa655, 0xa655,
+	0xa655, 0xa655, 0xc83b, 0xc842, 0xa655, 0xa655, 0xa655, 0xa655,
+	0x00f6, 0x080c, 0x6658, 0x11d8, 0x080c, 0xbf46, 0x11c0, 0x6010,
+	0x905d, 0x01a8, 0xb884, 0x9005, 0x0190, 0x9006, 0x080c, 0x61a6,
+	0x2001, 0x0002, 0x080c, 0x61ba, 0x6023, 0x0001, 0x6003, 0x0001,
+	0x6007, 0x0002, 0x080c, 0x84b0, 0x080c, 0x890e, 0x00d0, 0x2011,
+	0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x2424, 0x1190, 0x080c,
+	0x6269, 0x0118, 0x080c, 0x9bcc, 0x0060, 0xb810, 0x0006, 0xb814,
+	0x0006, 0x080c, 0x5cef, 0x000e, 0xb816, 0x000e, 0xb812, 0x080c,
+	0x9bcc, 0x00fe, 0x0005, 0x6604, 0x96b6, 0x001e, 0x1110, 0x080c,
+	0x9bcc, 0x0005, 0x080c, 0xaa39, 0x1148, 0x6003, 0x0001, 0x6007,
+	0x0001, 0x080c, 0x84b0, 0x080c, 0x890e, 0x0010, 0x080c, 0x9bcc,
+	0x0005, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0d65, 0x080c, 0x884c,
+	0x080c, 0x9c06, 0x0005, 0x9182, 0x0040, 0x0002, 0xc871, 0xc871,
+	0xc871, 0xc871, 0xc873, 0xc871, 0xc871, 0xc871, 0xc871, 0xc871,
+	0xc871, 0xc871, 0xc871, 0xc871, 0xc871, 0xc871, 0xc871, 0xc871,
+	0xc871, 0x080c, 0x0d65, 0x0096, 0x00b6, 0x00d6, 0x00e6, 0x00f6,
+	0x0046, 0x0026, 0x6210, 0x2258, 0xb8ac, 0x9005, 0x11b0, 0x6007,
+	0x0044, 0x2071, 0x0260, 0x7444, 0x94a4, 0xff00, 0x0904, 0xc8da,
+	0x080c, 0xd55b, 0x1170, 0x9486, 0x2000, 0x1158, 0x2009, 0x0001,
+	0x2011, 0x0200, 0x080c, 0x83c3, 0x0020, 0x9026, 0x080c, 0xd490,
+	0x0c30, 0x080c, 0x1022, 0x090c, 0x0d65, 0x6003, 0x0007, 0xa867,
+	0x010d, 0x9006, 0xa802, 0xa86a, 0xac8a, 0x2c00, 0xa88e, 0x6008,
+	0xa8e2, 0x6010, 0x2058, 0xb8a0, 0x7130, 0xa97a, 0x0016, 0xa876,
+	0xa87f, 0x0000, 0xa883, 0x0000, 0xa887, 0x0036, 0x080c, 0x698f,
+	0x001e, 0x080c, 0xd55b, 0x1904, 0xc93a, 0x9486, 0x2000, 0x1130,
+	0x2019, 0x0017, 0x080c, 0xd1c9, 0x0804, 0xc93a, 0x9486, 0x0200,
+	0x1120, 0x080c, 0xd159, 0x0804, 0xc93a, 0x9486, 0x0400, 0x0120,
+	0x9486, 0x1000, 0x1904, 0xc93a, 0x2019, 0x0002, 0x080c, 0xd178,
+	0x0804, 0xc93a, 0x2069, 0x1a3f, 0x6a00, 0xd284, 0x0904, 0xc9a4,
+	0x9284, 0x0300, 0x1904, 0xc99d, 0x6804, 0x9005, 0x0904, 0xc985,
+	0x2d78, 0x6003, 0x0007, 0x080c, 0x103b, 0x0904, 0xc946, 0x7800,
+	0xd08c, 0x1118, 0x7804, 0x8001, 0x7806, 0x6017, 0x0000, 0x2001,
+	0x180f, 0x2004, 0xd084, 0x1904, 0xc9a8, 0x9006, 0xa802, 0xa867,
+	0x0116, 0xa86a, 0x6008, 0xa8e2, 0x2c00, 0xa87a, 0x6010, 0x2058,
+	0xb8a0, 0x7130, 0xa9b6, 0xa876, 0xb928, 0xa9ba, 0xb92c, 0xa9be,
+	0xb930, 0xa9c2, 0xb934, 0xa9c6, 0xa883, 0x003d, 0x7044, 0x9084,
+	0x0003, 0x9080, 0xc942, 0x2005, 0xa87e, 0x20a9, 0x000a, 0x2001,
+	0x0270, 0xaa5c, 0x9290, 0x0021, 0x2009, 0x0205, 0x200b, 0x0080,
+	0x20e1, 0x0000, 0xab60, 0x23e8, 0x2098, 0x22a0, 0x4003, 0x200b,
+	0x0000, 0x2001, 0x027a, 0x200c, 0xa9b2, 0x8000, 0x200c, 0xa9ae,
+	0x080c, 0x6992, 0x002e, 0x004e, 0x00fe, 0x00ee, 0x00de, 0x00be,
+	0x009e, 0x0005, 0x0000, 0x0080, 0x0040, 0x0000, 0x2001, 0x1810,
+	0x2004, 0xd084, 0x0120, 0x080c, 0x1022, 0x1904, 0xc8ef, 0x6017,
+	0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x2009, 0xa022, 0x080c,
+	0x84a9, 0x0c00, 0x2069, 0x0260, 0x6848, 0x9084, 0xff00, 0x9086,
+	0x1200, 0x1198, 0x686c, 0x9084, 0x00ff, 0x0016, 0x6114, 0x918c,
+	0xf700, 0x910d, 0x6116, 0x001e, 0x6003, 0x0001, 0x6007, 0x0043,
+	0x2009, 0xa025, 0x080c, 0x84a9, 0x0828, 0x6868, 0x602e, 0x686c,
+	0x6032, 0x6017, 0xf200, 0x6003, 0x0001, 0x6007, 0x0041, 0x2009,
+	0xa022, 0x080c, 0x84a9, 0x0804, 0xc93a, 0x2001, 0x180e, 0x2004,
+	0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x48d1, 0x6017, 0xf300,
+	0x0010, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x2009,
+	0xa022, 0x080c, 0x84a9, 0x0804, 0xc93a, 0x6017, 0xf500, 0x0c98,
+	0x6017, 0xf600, 0x0804, 0xc95a, 0x6017, 0xf200, 0x0804, 0xc95a,
+	0xa867, 0x0146, 0xa86b, 0x0000, 0x6008, 0xa886, 0x2c00, 0xa87a,
+	0x7044, 0x9084, 0x0003, 0x9080, 0xc942, 0x2005, 0xa87e, 0x2928,
+	0x6010, 0x2058, 0xb8a0, 0xa876, 0xb828, 0xa88a, 0xb82c, 0xa88e,
+	0xb830, 0xa892, 0xb834, 0xa896, 0xa883, 0x003d, 0x2009, 0x0205,
+	0x2104, 0x9085, 0x0080, 0x200a, 0x20e1, 0x0000, 0x2011, 0x0210,
+	0x2214, 0x9294, 0x0fff, 0xaaa2, 0x9282, 0x0111, 0x1a0c, 0x0d65,
+	0x8210, 0x821c, 0x2001, 0x026c, 0x2098, 0xa860, 0x20e8, 0xa85c,
+	0x9080, 0x0029, 0x20a0, 0x2011, 0xca24, 0x2041, 0x0001, 0x223d,
+	0x9784, 0x00ff, 0x9322, 0x1208, 0x2300, 0x20a8, 0x4003, 0x931a,
+	0x0530, 0x8210, 0xd7fc, 0x1130, 0x8d68, 0x2d0a, 0x2001, 0x0260,
+	0x2098, 0x0c68, 0x2950, 0x080c, 0x103b, 0x0170, 0x2900, 0xb002,
+	0xa867, 0x0147, 0xa86b, 0x0000, 0xa860, 0x20e8, 0xa85c, 0x9080,
+	0x001b, 0x20a0, 0x8840, 0x08d8, 0x2548, 0xa800, 0x902d, 0x0118,
+	0x080c, 0x1054, 0x0cc8, 0x080c, 0x1054, 0x0804, 0xc946, 0x2548,
+	0x8847, 0x9885, 0x0046, 0xa866, 0x2009, 0x0205, 0x200b, 0x0000,
+	0x080c, 0xd1fc, 0x0804, 0xc93a, 0x8010, 0x0004, 0x801a, 0x0006,
+	0x8018, 0x0008, 0x8016, 0x000a, 0x8014, 0x9186, 0x0013, 0x1160,
+	0x6004, 0x908a, 0x0057, 0x1a0c, 0x0d65, 0x9082, 0x0040, 0x0a0c,
+	0x0d65, 0x2008, 0x0804, 0xcaaf, 0x9186, 0x0051, 0x0108, 0x0040,
+	0x080c, 0x9a9c, 0x01e8, 0x9086, 0x0002, 0x0904, 0xcaf6, 0x00c0,
+	0x9186, 0x0027, 0x0180, 0x9186, 0x0048, 0x0128, 0x9186, 0x0014,
+	0x0150, 0x190c, 0x0d65, 0x080c, 0x9a9c, 0x0150, 0x9086, 0x0004,
+	0x0904, 0xcb93, 0x0028, 0x6004, 0x9082, 0x0040, 0x2008, 0x001a,
+	0x080c, 0x9c87, 0x0005, 0xca76, 0xca78, 0xca78, 0xca9f, 0xca76,
+	0xca76, 0xca76, 0xca76, 0xca76, 0xca76, 0xca76, 0xca76, 0xca76,
+	0xca76, 0xca76, 0xca76, 0xca76, 0xca76, 0xca76, 0x080c, 0x0d65,
+	0x080c, 0x884c, 0x080c, 0x890e, 0x0036, 0x0096, 0x6014, 0x904d,
+	0x01d8, 0x080c, 0xb82c, 0x01c0, 0x6003, 0x0002, 0x6010, 0x00b6,
+	0x2058, 0xb800, 0x00be, 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c,
+	0xd1fc, 0x6017, 0x0000, 0x6018, 0x9005, 0x1120, 0x2001, 0x1958,
+	0x2004, 0x601a, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x0096,
+	0x080c, 0x884c, 0x080c, 0x890e, 0x080c, 0xb82c, 0x0120, 0x6014,
+	0x2048, 0x080c, 0x1054, 0x080c, 0x9c06, 0x009e, 0x0005, 0x0002,
+	0xcac3, 0xcad8, 0xcac5, 0xcaed, 0xcac3, 0xcac3, 0xcac3, 0xcac3,
+	0xcac3, 0xcac3, 0xcac3, 0xcac3, 0xcac3, 0xcac3, 0xcac3, 0xcac3,
+	0xcac3, 0xcac3, 0xcac3, 0x080c, 0x0d65, 0x0096, 0x6014, 0x2048,
+	0xa87c, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, 0x0043, 0x080c,
+	0x9c6a, 0x0010, 0x6003, 0x0004, 0x080c, 0x890e, 0x009e, 0x0005,
+	0x080c, 0xb82c, 0x0138, 0x6114, 0x0096, 0x2148, 0xa97c, 0x009e,
+	0xd1ec, 0x1138, 0x080c, 0x8398, 0x080c, 0x9bcc, 0x080c, 0x890e,
+	0x0005, 0x080c, 0xd454, 0x0db0, 0x0cc8, 0x6003, 0x0001, 0x6007,
+	0x0041, 0x2009, 0xa022, 0x080c, 0x84a9, 0x0005, 0x9182, 0x0040,
+	0x0002, 0xcb0c, 0xcb0e, 0xcb0c, 0xcb0c, 0xcb0c, 0xcb0c, 0xcb0c,
+	0xcb0c, 0xcb0c, 0xcb0c, 0xcb0c, 0xcb0c, 0xcb0c, 0xcb0c, 0xcb0c,
+	0xcb0c, 0xcb0c, 0xcb0f, 0xcb0c, 0x080c, 0x0d65, 0x0005, 0x00d6,
+	0x080c, 0x8398, 0x00de, 0x080c, 0xd4ac, 0x080c, 0x9bcc, 0x0005,
+	0x9182, 0x0040, 0x0002, 0xcb2e, 0xcb2e, 0xcb2e, 0xcb2e, 0xcb2e,
+	0xcb2e, 0xcb2e, 0xcb2e, 0xcb2e, 0xcb30, 0xcb5b, 0xcb2e, 0xcb2e,
+	0xcb2e, 0xcb2e, 0xcb5b, 0xcb2e, 0xcb2e, 0xcb2e, 0x080c, 0x0d65,
+	0x6014, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0168, 0x908c, 0x0003,
+	0x918e, 0x0002, 0x0180, 0x6144, 0xd1e4, 0x1168, 0x2009, 0x0041,
+	0x009e, 0x0804, 0xcc1b, 0x6003, 0x0007, 0x601b, 0x0000, 0x080c,
+	0x8398, 0x009e, 0x0005, 0x6014, 0x2048, 0xa97c, 0xd1ec, 0x1130,
+	0x080c, 0x8398, 0x080c, 0x9bcc, 0x009e, 0x0005, 0x080c, 0xd454,
+	0x0db8, 0x009e, 0x0005, 0x2001, 0x180c, 0x200c, 0xc1d4, 0x2102,
+	0x0036, 0x080c, 0x88a9, 0x080c, 0x890e, 0x6014, 0x0096, 0x2048,
+	0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0188, 0xa87c,
+	0x9084, 0x0003, 0x9086, 0x0002, 0x0140, 0xa8ac, 0x6330, 0x931a,
+	0x6332, 0xa8b0, 0x632c, 0x931b, 0x632e, 0x6003, 0x0002, 0x0080,
+	0x2019, 0x0004, 0x080c, 0xd1fc, 0x6018, 0x9005, 0x1128, 0x2001,
+	0x1958, 0x2004, 0x8003, 0x601a, 0x6017, 0x0000, 0x6003, 0x0007,
+	0x009e, 0x003e, 0x0005, 0x9182, 0x0040, 0x0002, 0xcbaa, 0xcbaa,
+	0xcbaa, 0xcbaa, 0xcbaa, 0xcbaa, 0xcbaa, 0xcbaa, 0xcbac, 0xcbaa,
+	0xcbaa, 0xcbaa, 0xcbaa, 0xcbaa, 0xcbaa, 0xcbaa, 0xcbaa, 0xcbaa,
+	0xcbaa, 0xcbf7, 0x080c, 0x0d65, 0x6014, 0x0096, 0x2048, 0xa834,
+	0xaa38, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1bc, 0x1190,
+	0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128, 0x2009, 0x0041, 0x009e,
+	0x0804, 0xcc1b, 0x6003, 0x0007, 0x601b, 0x0000, 0x080c, 0x8398,
+	0x009e, 0x0005, 0x6124, 0xd1f4, 0x1d58, 0x0006, 0x0046, 0xacac,
+	0x9422, 0xa9b0, 0x2200, 0x910b, 0x6030, 0x9420, 0x6432, 0x602c,
+	0x9109, 0x612e, 0x004e, 0x000e, 0x08d8, 0x6110, 0x00b6, 0x2158,
+	0xb900, 0x00be, 0xd1bc, 0x1178, 0x2009, 0x180e, 0x210c, 0xd19c,
+	0x0118, 0x6003, 0x0007, 0x0010, 0x6003, 0x0006, 0x00e9, 0x080c,
+	0x839a, 0x009e, 0x0005, 0x6003, 0x0002, 0x009e, 0x0005, 0x6024,
+	0xd0f4, 0x0128, 0x080c, 0x1595, 0x1904, 0xcbac, 0x0005, 0x6014,
+	0x0096, 0x2048, 0xa834, 0xa938, 0x009e, 0x9105, 0x1120, 0x080c,
+	0x1595, 0x1904, 0xcbac, 0x0005, 0xd2fc, 0x0140, 0x8002, 0x8000,
+	0x8212, 0x9291, 0x0000, 0x2009, 0x0009, 0x0010, 0x2009, 0x0015,
+	0xaa9a, 0xa896, 0x0005, 0x9182, 0x0040, 0x0208, 0x0062, 0x9186,
+	0x0013, 0x0120, 0x9186, 0x0014, 0x190c, 0x0d65, 0x6024, 0xd0dc,
+	0x090c, 0x0d65, 0x0005, 0xcc3e, 0xcc4a, 0xcc56, 0xcc62, 0xcc3e,
+	0xcc3e, 0xcc3e, 0xcc3e, 0xcc45, 0xcc40, 0xcc40, 0xcc3e, 0xcc3e,
+	0xcc3e, 0xcc3e, 0xcc40, 0xcc3e, 0xcc40, 0xcc3e, 0x080c, 0x0d65,
+	0x6024, 0xd0dc, 0x090c, 0x0d65, 0x0005, 0x6014, 0x9005, 0x190c,
+	0x0d65, 0x0005, 0x6003, 0x0001, 0x6106, 0x0126, 0x2091, 0x8000,
+	0x2009, 0xa022, 0x080c, 0x848b, 0x012e, 0x0005, 0x6003, 0x0004,
+	0x6106, 0x0126, 0x2091, 0x8000, 0x2009, 0xa001, 0x080c, 0x84a9,
+	0x012e, 0x0005, 0x6003, 0x0003, 0x6106, 0x080c, 0x1aa5, 0x0126,
+	0x2091, 0x8000, 0x6014, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0188,
+	0x9084, 0x0003, 0x9086, 0x0002, 0x01a0, 0x6024, 0xd0cc, 0x1148,
+	0xd0c4, 0x1138, 0xa8a8, 0x9005, 0x1120, 0x6144, 0x918d, 0xb035,
+	0x0018, 0x6144, 0x918d, 0xa035, 0x009e, 0x080c, 0x84f0, 0x012e,
+	0x0005, 0x6144, 0x918d, 0xa032, 0x0cb8, 0x0126, 0x2091, 0x8000,
+	0x0036, 0x0096, 0x9182, 0x0040, 0x0023, 0x009e, 0x003e, 0x012e,
+	0x0005, 0xcca9, 0xccab, 0xccc0, 0xccda, 0xcca9, 0xcca9, 0xcca9,
+	0xcca9, 0xcca9, 0xcca9, 0xcca9, 0xcca9, 0xcca9, 0xcca9, 0xcca9,
+	0xcca9, 0x080c, 0x0d65, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0510,
+	0x909c, 0x0003, 0x939e, 0x0003, 0x01e8, 0x6003, 0x0001, 0x6106,
+	0x0126, 0x2091, 0x8000, 0x2009, 0xa022, 0x080c, 0x84a9, 0x0470,
+	0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0168, 0x909c, 0x0003, 0x939e,
+	0x0003, 0x0140, 0x6003, 0x0001, 0x6106, 0x2009, 0xa001, 0x080c,
+	0x84a9, 0x00e0, 0x901e, 0x6316, 0x631a, 0x2019, 0x0004, 0x080c,
+	0xd1fc, 0x00a0, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0d98, 0x909c,
+	0x0003, 0x939e, 0x0003, 0x0d70, 0x6003, 0x0003, 0x6106, 0x080c,
+	0x1aa5, 0x6144, 0x918d, 0xa035, 0x080c, 0x84f0, 0x0005, 0x080c,
+	0x884c, 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c, 0xd4f8,
+	0x0036, 0x2019, 0x0029, 0x080c, 0xd1fc, 0x003e, 0x009e, 0x080c,
+	0x9c06, 0x080c, 0x890e, 0x0005, 0x080c, 0x88a9, 0x6114, 0x81ff,
+	0x0158, 0x0096, 0x2148, 0x080c, 0xd4f8, 0x0036, 0x2019, 0x0029,
+	0x080c, 0xd1fc, 0x003e, 0x009e, 0x080c, 0x9c06, 0x0005, 0x9182,
+	0x0085, 0x0002, 0xcd29, 0xcd27, 0xcd27, 0xcd35, 0xcd27, 0xcd27,
+	0xcd27, 0xcd27, 0xcd27, 0xcd27, 0xcd27, 0xcd27, 0xcd27, 0x080c,
+	0x0d65, 0x6003, 0x000b, 0x6106, 0x0126, 0x2091, 0x8000, 0x2009,
+	0x8020, 0x080c, 0x84a9, 0x012e, 0x0005, 0x0026, 0x00e6, 0x080c,
+	0xd44b, 0x0118, 0x080c, 0x9bcc, 0x0440, 0x2071, 0x0260, 0x7224,
+	0x6216, 0x2001, 0x180e, 0x2004, 0xd0e4, 0x0150, 0x6010, 0x00b6,
+	0x2058, 0xbca0, 0x00be, 0x2c00, 0x2011, 0x014e, 0x080c, 0x9ef8,
+	0x7220, 0x080c, 0xd092, 0x0118, 0x6007, 0x0086, 0x0040, 0x6007,
+	0x0087, 0x7224, 0x9296, 0xffff, 0x1110, 0x6007, 0x0086, 0x6003,
+	0x0001, 0x2009, 0x8020, 0x080c, 0x84a9, 0x00ee, 0x002e, 0x0005,
+	0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d65,
+	0x908a, 0x0092, 0x1a0c, 0x0d65, 0x9082, 0x0085, 0x00a2, 0x9186,
+	0x0027, 0x0130, 0x9186, 0x0014, 0x0118, 0x080c, 0x9c87, 0x0050,
+	0x2001, 0x0007, 0x080c, 0x61e6, 0x080c, 0x884c, 0x080c, 0x9c06,
+	0x080c, 0x890e, 0x0005, 0xcd98, 0xcd9a, 0xcd9a, 0xcd98, 0xcd98,
+	0xcd98, 0xcd98, 0xcd98, 0xcd98, 0xcd98, 0xcd98, 0xcd98, 0xcd98,
+	0x080c, 0x0d65, 0x080c, 0x9c06, 0x080c, 0x890e, 0x0005, 0x9182,
+	0x0085, 0x0a0c, 0x0d65, 0x9182, 0x0092, 0x1a0c, 0x0d65, 0x9182,
+	0x0085, 0x0002, 0xcdb7, 0xcdb7, 0xcdb7, 0xcdb9, 0xcdb7, 0xcdb7,
+	0xcdb7, 0xcdb7, 0xcdb7, 0xcdb7, 0xcdb7, 0xcdb7, 0xcdb7, 0x080c,
+	0x0d65, 0x0005, 0x9186, 0x0013, 0x0148, 0x9186, 0x0014, 0x0130,
+	0x9186, 0x0027, 0x0118, 0x080c, 0x9c87, 0x0020, 0x080c, 0x884c,
+	0x080c, 0x9c06, 0x0005, 0x0036, 0x080c, 0xd4ac, 0x604b, 0x0000,
+	0x2019, 0x000b, 0x0031, 0x6023, 0x0006, 0x6003, 0x0007, 0x003e,
+	0x0005, 0x0126, 0x0036, 0x2091, 0x8000, 0x2001, 0x0382, 0x2004,
+	0x9084, 0x0007, 0x0006, 0x9086, 0x0003, 0x0110, 0x080c, 0x98ad,
+	0x0086, 0x2c40, 0x0096, 0x904e, 0x080c, 0x9367, 0x009e, 0x008e,
+	0x1550, 0x0076, 0x2c38, 0x080c, 0x9412, 0x007e, 0x1520, 0x6000,
+	0x9086, 0x0000, 0x0500, 0x6020, 0x9086, 0x0007, 0x01e0, 0x0096,
+	0x601c, 0xd084, 0x0140, 0x080c, 0xd4ac, 0x080c, 0xbf5e, 0x080c,
+	0x1914, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, 0xb82c, 0x0110,
+	0x080c, 0xd1fc, 0x009e, 0x6017, 0x0000, 0x080c, 0xd4ac, 0x6023,
+	0x0007, 0x080c, 0xbf5e, 0x000e, 0x9086, 0x0003, 0x0110, 0x080c,
+	0x98c9, 0x003e, 0x012e, 0x0005, 0x00f6, 0x00c6, 0x00b6, 0x0036,
+	0x0156, 0x2079, 0x0260, 0x7938, 0x783c, 0x080c, 0x2424, 0x15d8,
+	0x0016, 0x00c6, 0x080c, 0x6269, 0x15a0, 0x001e, 0x00c6, 0x2160,
+	0x080c, 0xbf5b, 0x00ce, 0x002e, 0x0026, 0x0016, 0x080c, 0x98ad,
+	0x2019, 0x0029, 0x080c, 0x94d9, 0x080c, 0x8613, 0x0076, 0x903e,
+	0x080c, 0x8502, 0x007e, 0x001e, 0x0076, 0x903e, 0x080c, 0xcfa6,
+	0x007e, 0x080c, 0x98c9, 0x0026, 0xba04, 0x9294, 0xff00, 0x8217,
+	0x9286, 0x0006, 0x0118, 0x9286, 0x0004, 0x1118, 0xbaa0, 0x080c,
+	0x30d5, 0x002e, 0x001e, 0x080c, 0x5cef, 0xbe12, 0xbd16, 0x9006,
+	0x0010, 0x00ce, 0x001e, 0x015e, 0x003e, 0x00be, 0x00ce, 0x00fe,
+	0x0005, 0x00c6, 0x00d6, 0x00b6, 0x0016, 0x2009, 0x1823, 0x2104,
+	0x9086, 0x0074, 0x1904, 0xceca, 0x2069, 0x0260, 0x6944, 0x9182,
+	0x0100, 0x06e0, 0x6940, 0x9184, 0x8000, 0x0904, 0xcec7, 0x2001,
+	0x194d, 0x2004, 0x9005, 0x1140, 0x6010, 0x2058, 0xb884, 0x9005,
+	0x0118, 0x9184, 0x0800, 0x0598, 0x6948, 0x918a, 0x0001, 0x0648,
+	0x080c, 0xd560, 0x0118, 0x6978, 0xd1fc, 0x11b8, 0x2009, 0x0205,
+	0x200b, 0x0001, 0x693c, 0x81ff, 0x1198, 0x6944, 0x9182, 0x0100,
+	0x02a8, 0x6940, 0x81ff, 0x1178, 0x6948, 0x918a, 0x0001, 0x0288,
+	0x6950, 0x918a, 0x0001, 0x0298, 0x00d0, 0x6017, 0x0100, 0x00a0,
+	0x6017, 0x0300, 0x0088, 0x6017, 0x0500, 0x0070, 0x6017, 0x0700,
+	0x0058, 0x6017, 0x0900, 0x0040, 0x6017, 0x0b00, 0x0028, 0x6017,
+	0x0f00, 0x0010, 0x6017, 0x2d00, 0x9085, 0x0001, 0x0008, 0x9006,
+	0x001e, 0x00be, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00b6, 0x0026,
+	0x0036, 0x0156, 0x6210, 0x2258, 0xbb04, 0x9394, 0x00ff, 0x9286,
+	0x0006, 0x0180, 0x9286, 0x0004, 0x0168, 0x9394, 0xff00, 0x8217,
+	0x9286, 0x0006, 0x0138, 0x9286, 0x0004, 0x0120, 0x080c, 0x6278,
+	0x0804, 0xcf35, 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48,
+	0x2019, 0x000a, 0x080c, 0xabc4, 0x009e, 0x15c0, 0x2011, 0x027a,
+	0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xabc4,
+	0x009e, 0x1560, 0x0046, 0x0016, 0xbaa0, 0x2220, 0x9006, 0x2009,
+	0x1854, 0x210c, 0x0038, 0x2009, 0x0029, 0x080c, 0xd251, 0xb800,
+	0xc0e5, 0xb802, 0x080c, 0x98ad, 0x2019, 0x0029, 0x080c, 0x8613,
+	0x0076, 0x2039, 0x0000, 0x080c, 0x8502, 0x2c08, 0x080c, 0xcfa6,
+	0x007e, 0x080c, 0x98c9, 0x2001, 0x0007, 0x080c, 0x61e6, 0x2001,
+	0x0007, 0x080c, 0x61ba, 0x001e, 0x004e, 0x9006, 0x015e, 0x003e,
+	0x002e, 0x00be, 0x00ce, 0x0005, 0x00d6, 0x2069, 0x026e, 0x6800,
+	0x9086, 0x0800, 0x0118, 0x6017, 0x0000, 0x0008, 0x9006, 0x00de,
+	0x0005, 0x00b6, 0x00f6, 0x0016, 0x0026, 0x0036, 0x0156, 0x2079,
+	0x026c, 0x7930, 0x7834, 0x080c, 0x2424, 0x11d0, 0x080c, 0x6269,
+	0x11b8, 0x2011, 0x0270, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019,
+	0x000a, 0x080c, 0xabc4, 0x009e, 0x1158, 0x2011, 0x0274, 0x20a9,
+	0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xabc4, 0x009e,
+	0x015e, 0x003e, 0x002e, 0x001e, 0x00fe, 0x00be, 0x0005, 0x00b6,
+	0x0006, 0x0016, 0x0026, 0x0036, 0x0156, 0x2011, 0x0263, 0x2204,
+	0x8211, 0x220c, 0x080c, 0x2424, 0x11d0, 0x080c, 0x6269, 0x11b8,
+	0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a,
+	0x080c, 0xabc4, 0x009e, 0x1158, 0x2011, 0x027a, 0x20a9, 0x0004,
+	0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xabc4, 0x009e, 0x015e,
+	0x003e, 0x002e, 0x001e, 0x000e, 0x00be, 0x0005, 0x00e6, 0x00c6,
+	0x0086, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0126, 0x2091,
+	0x8000, 0x080c, 0x990b, 0x0106, 0x190c, 0x98ad, 0x2740, 0x2029,
+	0x19c4, 0x252c, 0x2021, 0x19cb, 0x2424, 0x2061, 0x1ddc, 0x2071,
+	0x1800, 0x7650, 0x7070, 0x81ff, 0x0150, 0x0006, 0x9186, 0x1b02,
+	0x000e, 0x0128, 0x8001, 0x9602, 0x1a04, 0xd047, 0x0018, 0x9606,
+	0x0904, 0xd047, 0x2100, 0x9c06, 0x0904, 0xd03e, 0x080c, 0xd292,
+	0x1904, 0xd03e, 0x080c, 0xd57d, 0x0904, 0xd03e, 0x080c, 0xd282,
+	0x0904, 0xd03e, 0x6720, 0x9786, 0x0001, 0x1148, 0x080c, 0x317a,
+	0x0904, 0xd066, 0x6004, 0x9086, 0x0000, 0x1904, 0xd066, 0x9786,
+	0x0004, 0x0904, 0xd066, 0x9786, 0x0007, 0x0904, 0xd03e, 0x2500,
+	0x9c06, 0x0904, 0xd03e, 0x2400, 0x9c06, 0x0904, 0xd03e, 0x88ff,
+	0x0118, 0x605c, 0x9906, 0x15d0, 0x0096, 0x6043, 0xffff, 0x6000,
+	0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1914, 0x001e, 0x9786,
+	0x000a, 0x0148, 0x080c, 0xba41, 0x1130, 0x080c, 0xa574, 0x009e,
+	0x080c, 0x9c06, 0x0418, 0x6014, 0x2048, 0x080c, 0xb82c, 0x01d8,
+	0x9786, 0x0003, 0x1588, 0xa867, 0x0103, 0xa87c, 0xd0cc, 0x0130,
+	0x0096, 0xa878, 0x2048, 0x080c, 0x0fd4, 0x009e, 0xab7a, 0xa877,
+	0x0000, 0x080c, 0xd4f8, 0x0016, 0x080c, 0xbb2a, 0x080c, 0x6983,
+	0x001e, 0x080c, 0xba1b, 0x009e, 0x080c, 0x9c06, 0x9ce0, 0x001c,
+	0x2001, 0x1819, 0x2004, 0x9c02, 0x1210, 0x0804, 0xcfbf, 0x010e,
+	0x190c, 0x98c9, 0x012e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e,
+	0x008e, 0x00ce, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1150, 0x9386,
+	0x0005, 0x0128, 0x080c, 0xd4f8, 0x080c, 0xd1fc, 0x08e0, 0x009e,
+	0x08e8, 0x9786, 0x000a, 0x0908, 0x0804, 0xd023, 0x81ff, 0x09b0,
+	0x9180, 0x0001, 0x2004, 0x9086, 0x0018, 0x0130, 0x9180, 0x0001,
+	0x2004, 0x9086, 0x002d, 0x1950, 0x6000, 0x9086, 0x0002, 0x1930,
+	0x080c, 0xba30, 0x0130, 0x080c, 0xba41, 0x1900, 0x080c, 0xa574,
+	0x0038, 0x080c, 0x3034, 0x080c, 0xba41, 0x1110, 0x080c, 0xa574,
+	0x080c, 0x9c06, 0x0804, 0xd03e, 0xa864, 0x9084, 0x00ff, 0x9086,
+	0x0039, 0x0005, 0x00c6, 0x00e6, 0x0016, 0x2c08, 0x2170, 0x9006,
+	0x080c, 0xd223, 0x001e, 0x0120, 0x6020, 0x9084, 0x000f, 0x001b,
+	0x00ee, 0x00ce, 0x0005, 0xd0b1, 0xd0b1, 0xd0b1, 0xd0b1, 0xd0b1,
+	0xd0b1, 0xd0b3, 0xd0b1, 0xd0b1, 0xd0b1, 0xd0b1, 0x9c06, 0x9c06,
+	0xd0b1, 0x9006, 0x0005, 0x0036, 0x0046, 0x0016, 0x7010, 0x00b6,
+	0x2058, 0xbca0, 0x00be, 0x2c00, 0x2009, 0x0020, 0x080c, 0xd251,
+	0x001e, 0x004e, 0x2019, 0x0002, 0x080c, 0xcdd9, 0x003e, 0x9085,
+	0x0001, 0x0005, 0x0096, 0x080c, 0xb82c, 0x0140, 0x6014, 0x904d,
+	0x080c, 0xb437, 0x687b, 0x0005, 0x080c, 0x698f, 0x009e, 0x080c,
+	0x9c06, 0x9085, 0x0001, 0x0005, 0x2001, 0x0001, 0x080c, 0x61a6,
 	0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805,
-	0x2011, 0x0276, 0x080c, 0xaa49, 0x003e, 0x002e, 0x001e, 0x015e,
-	0x0120, 0x6007, 0x0031, 0x0804, 0xc095, 0x080c, 0xa6ae, 0x080c,
-	0x6f5c, 0x1190, 0x0006, 0x0026, 0x0036, 0x080c, 0x6f76, 0x1138,
-	0x080c, 0x725c, 0x080c, 0x5be2, 0x080c, 0x6e8d, 0x0010, 0x080c,
-	0x6f30, 0x003e, 0x002e, 0x000e, 0x0005, 0x080c, 0x3107, 0x1904,
-	0xc2a8, 0x080c, 0xc446, 0x1904, 0xbf84, 0x6106, 0x080c, 0xc462,
-	0x1120, 0x6007, 0x002b, 0x0804, 0xc095, 0x6007, 0x002c, 0x0804,
-	0xc095, 0x080c, 0xd2c3, 0x1904, 0xc2a8, 0x080c, 0x3107, 0x1904,
-	0xc2a8, 0x080c, 0xc446, 0x1904, 0xbf84, 0x6106, 0x080c, 0xc467,
-	0x1120, 0x6007, 0x002e, 0x0804, 0xc095, 0x6007, 0x002f, 0x0804,
-	0xc095, 0x080c, 0x3107, 0x1904, 0xc2a8, 0x00e6, 0x00d6, 0x00c6,
-	0x6010, 0x2058, 0xb904, 0x9184, 0x00ff, 0x9086, 0x0006, 0x0158,
-	0x9184, 0xff00, 0x8007, 0x9086, 0x0006, 0x0128, 0x00ce, 0x00de,
-	0x00ee, 0x0804, 0xc09c, 0x080c, 0x52a1, 0xd0e4, 0x0904, 0xc1f3,
-	0x2071, 0x026c, 0x7010, 0x603a, 0x7014, 0x603e, 0x7108, 0x720c,
-	0x080c, 0x6559, 0x0140, 0x6010, 0x2058, 0xb810, 0x9106, 0x1118,
-	0xb814, 0x9206, 0x0510, 0x080c, 0x6555, 0x15b8, 0x2069, 0x1800,
-	0x687c, 0x9206, 0x1590, 0x6878, 0x9106, 0x1578, 0x7210, 0x080c,
-	0xb6b3, 0x0590, 0x080c, 0xc333, 0x0578, 0x080c, 0xd145, 0x0560,
-	0x622e, 0x6007, 0x0036, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c,
-	0x832e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x7214, 0x9286, 0xffff,
-	0x0150, 0x080c, 0xb6b3, 0x01c0, 0x9280, 0x0002, 0x2004, 0x7110,
-	0x9106, 0x1190, 0x08e0, 0x7210, 0x2c08, 0x9085, 0x0001, 0x080c,
-	0xd0a0, 0x2c10, 0x2160, 0x0140, 0x0890, 0x6007, 0x0037, 0x602f,
-	0x0009, 0x6017, 0x1500, 0x08b8, 0x6007, 0x0037, 0x602f, 0x0003,
-	0x6017, 0x1700, 0x0880, 0x6007, 0x0012, 0x0868, 0x080c, 0x3107,
-	0x1904, 0xc2a8, 0x6010, 0x2058, 0xb804, 0x9084, 0xff00, 0x8007,
-	0x9086, 0x0006, 0x1904, 0xc09c, 0x00e6, 0x00d6, 0x00c6, 0x080c,
-	0x52a1, 0xd0e4, 0x0904, 0xc26b, 0x2069, 0x1800, 0x2071, 0x026c,
-	0x7008, 0x603a, 0x720c, 0x623e, 0x9286, 0xffff, 0x1150, 0x7208,
-	0x00c6, 0x2c08, 0x9085, 0x0001, 0x080c, 0xd0a0, 0x2c10, 0x00ce,
-	0x05e8, 0x080c, 0xb6b3, 0x05d0, 0x7108, 0x9280, 0x0002, 0x2004,
-	0x9106, 0x15a0, 0x00c6, 0x0026, 0x2260, 0x080c, 0xb2c3, 0x002e,
-	0x00ce, 0x7118, 0x918c, 0xff00, 0x810f, 0x9186, 0x0001, 0x0178,
-	0x9186, 0x0005, 0x0118, 0x9186, 0x0007, 0x1198, 0x9280, 0x0005,
-	0x2004, 0x9005, 0x0170, 0x080c, 0xc333, 0x0904, 0xc1ec, 0x0056,
-	0x7510, 0x7614, 0x080c, 0xd15e, 0x005e, 0x00ce, 0x00de, 0x00ee,
-	0x0005, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003,
-	0x0001, 0x2009, 0x8020, 0x080c, 0x832e, 0x0c78, 0x6007, 0x003b,
-	0x602f, 0x0003, 0x6017, 0x0300, 0x6003, 0x0001, 0x2009, 0x8020,
-	0x080c, 0x832e, 0x0c10, 0x6007, 0x003b, 0x602f, 0x000b, 0x6017,
-	0x0000, 0x0804, 0xc1c3, 0x00e6, 0x0026, 0x080c, 0x651b, 0x0550,
-	0x080c, 0x6504, 0x080c, 0xd335, 0x1518, 0x2071, 0x1800, 0x70d8,
-	0x9085, 0x0003, 0x70da, 0x00f6, 0x2079, 0x0100, 0x72ac, 0x9284,
-	0x00ff, 0x707a, 0x78e6, 0x9284, 0xff00, 0x727c, 0x9205, 0x707e,
-	0x78ea, 0x00fe, 0x70e3, 0x0000, 0x080c, 0x6559, 0x0120, 0x2011,
-	0x19d8, 0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2d99, 0x0010,
-	0x080c, 0xd367, 0x002e, 0x00ee, 0x080c, 0x9a65, 0x0804, 0xc09b,
-	0x080c, 0x9a65, 0x0005, 0x2600, 0x0002, 0xc2bf, 0xc2bf, 0xc2bf,
-	0xc2bf, 0xc2bf, 0xc2c1, 0xc2bf, 0xc2bf, 0xc2bf, 0xc2bf, 0xc2de,
-	0xc2bf, 0xc2bf, 0xc2bf, 0xc2f0, 0xc2fd, 0xc32e, 0xc2bf, 0x080c,
-	0x0d65, 0x080c, 0xd2c3, 0x1d20, 0x080c, 0x3107, 0x1d08, 0x080c,
-	0xc446, 0x1148, 0x7038, 0x6016, 0x6007, 0x0045, 0x6003, 0x0001,
-	0x080c, 0x8335, 0x0005, 0x080c, 0x2fc1, 0x080c, 0xbdec, 0x6007,
-	0x0001, 0x6003, 0x0001, 0x080c, 0x8335, 0x0005, 0x080c, 0xd2c3,
-	0x1938, 0x080c, 0x3107, 0x1920, 0x080c, 0xc446, 0x1d60, 0x703c,
-	0x6016, 0x6007, 0x004a, 0x6003, 0x0001, 0x080c, 0x8335, 0x0005,
-	0x080c, 0xc34e, 0x0904, 0xc2a8, 0x6007, 0x004e, 0x6003, 0x0001,
-	0x080c, 0x8335, 0x080c, 0x8793, 0x0005, 0x6007, 0x004f, 0x6017,
-	0x0000, 0x7134, 0x918c, 0x00ff, 0x81ff, 0x0508, 0x9186, 0x0001,
-	0x1160, 0x7140, 0x2001, 0x198c, 0x2004, 0x9106, 0x11b0, 0x7144,
-	0x2001, 0x198d, 0x2004, 0x9106, 0x0190, 0x9186, 0x0002, 0x1168,
-	0x2011, 0x0276, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019,
-	0x000a, 0x080c, 0xaa5d, 0x009e, 0x0110, 0x6017, 0x0001, 0x6003,
-	0x0001, 0x080c, 0x8335, 0x080c, 0x8793, 0x0005, 0x6007, 0x0050,
-	0x703c, 0x6016, 0x0ca0, 0x00e6, 0x2071, 0x0260, 0x00b6, 0x00c6,
-	0x2260, 0x6010, 0x2058, 0xb8c4, 0xd084, 0x0150, 0x7128, 0x6050,
-	0x9106, 0x1120, 0x712c, 0x604c, 0x9106, 0x0110, 0x9006, 0x0010,
-	0x9085, 0x0001, 0x00ce, 0x00be, 0x00ee, 0x0005, 0x0016, 0x0096,
-	0x0086, 0x00e6, 0x01c6, 0x01d6, 0x0126, 0x2091, 0x8000, 0x2071,
-	0x1800, 0x708c, 0x908a, 0x00f9, 0x16e8, 0x20e1, 0x0000, 0x2001,
-	0x196f, 0x2003, 0x0000, 0x080c, 0x103c, 0x05a0, 0x2900, 0x6016,
-	0x708c, 0x8004, 0xa816, 0x908a, 0x001e, 0x02d0, 0xa833, 0x001e,
-	0x20a9, 0x001e, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0,
-	0x2001, 0x196f, 0x0016, 0x200c, 0x0471, 0x001e, 0x2940, 0x080c,
-	0x103c, 0x01c0, 0x2900, 0xa006, 0x2100, 0x81ff, 0x0180, 0x0c18,
-	0xa832, 0x20a8, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0,
-	0x2001, 0x196f, 0x0016, 0x200c, 0x00b1, 0x001e, 0x0000, 0x9085,
-	0x0001, 0x0048, 0x2071, 0x1800, 0x708f, 0x0000, 0x6014, 0x2048,
-	0x080c, 0x0fd5, 0x9006, 0x012e, 0x01de, 0x01ce, 0x00ee, 0x008e,
-	0x009e, 0x001e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00c6,
-	0x918c, 0xffff, 0x11a8, 0x080c, 0x1ff6, 0x2099, 0x026c, 0x2001,
-	0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x00f8, 0x20a8,
-	0x4003, 0x22a8, 0x8108, 0x080c, 0x1ff6, 0x2099, 0x0260, 0x0ca8,
-	0x080c, 0x1ff6, 0x2061, 0x196f, 0x6004, 0x2098, 0x6008, 0x3518,
-	0x9312, 0x1218, 0x23a8, 0x4003, 0x0048, 0x20a8, 0x4003, 0x22a8,
-	0x8108, 0x080c, 0x1ff6, 0x2099, 0x0260, 0x0ca8, 0x2061, 0x196f,
-	0x2019, 0x0280, 0x3300, 0x931e, 0x0110, 0x6006, 0x0020, 0x2001,
-	0x0260, 0x6006, 0x8108, 0x2162, 0x9292, 0x0021, 0x9296, 0xffff,
-	0x620a, 0x00ce, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006,
-	0x0016, 0x0026, 0x0036, 0x00c6, 0x81ff, 0x11b8, 0x080c, 0x200e,
-	0x20a1, 0x024c, 0x2001, 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8,
-	0x4003, 0x0418, 0x20a8, 0x4003, 0x82ff, 0x01f8, 0x22a8, 0x8108,
-	0x080c, 0x200e, 0x20a1, 0x0240, 0x0c98, 0x080c, 0x200e, 0x2061,
-	0x1972, 0x6004, 0x20a0, 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8,
-	0x4003, 0x0058, 0x20a8, 0x4003, 0x82ff, 0x0138, 0x22a8, 0x8108,
-	0x080c, 0x200e, 0x20a1, 0x0240, 0x0c98, 0x2061, 0x1972, 0x2019,
-	0x0260, 0x3400, 0x931e, 0x0110, 0x6006, 0x0020, 0x2001, 0x0240,
-	0x6006, 0x8108, 0x2162, 0x9292, 0x0021, 0x9296, 0xffff, 0x620a,
-	0x00ce, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x00b6, 0x0066,
-	0x6610, 0x2658, 0xbe04, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006,
-	0x0170, 0x9686, 0x0004, 0x0158, 0xbe04, 0x96b4, 0x00ff, 0x9686,
-	0x0006, 0x0128, 0x9686, 0x0004, 0x0110, 0x9085, 0x0001, 0x006e,
-	0x00be, 0x0005, 0x00d6, 0x080c, 0xc4dc, 0x00de, 0x0005, 0x00d6,
-	0x080c, 0xc4e9, 0x1520, 0x680c, 0x908c, 0xff00, 0x6820, 0x9084,
-	0x00ff, 0x9115, 0x6216, 0x6824, 0x602e, 0xd1e4, 0x0130, 0x9006,
-	0x080c, 0xd3df, 0x2009, 0x0001, 0x0078, 0xd1ec, 0x0180, 0x6920,
-	0x918c, 0x00ff, 0x6824, 0x080c, 0x23ef, 0x1148, 0x2001, 0x0001,
-	0x080c, 0xd3df, 0x2110, 0x900e, 0x080c, 0x3012, 0x0018, 0x9085,
-	0x0001, 0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, 0x00c6, 0x080c,
-	0x9ad6, 0x0598, 0x0016, 0x0026, 0x00c6, 0x2011, 0x0263, 0x2204,
-	0x8211, 0x220c, 0x080c, 0x23ef, 0x1568, 0x080c, 0x6106, 0x1550,
-	0xbe12, 0xbd16, 0x00ce, 0x002e, 0x001e, 0x2b00, 0x6012, 0x080c,
-	0xd2c3, 0x11c8, 0x080c, 0x3107, 0x11b0, 0x080c, 0xc446, 0x0500,
-	0x2001, 0x0007, 0x080c, 0x60b7, 0x2001, 0x0007, 0x080c, 0x60e3,
-	0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001,
-	0x080c, 0x8335, 0x0010, 0x080c, 0x9a65, 0x9085, 0x0001, 0x00ce,
-	0x00be, 0x0005, 0x080c, 0x9a65, 0x00ce, 0x002e, 0x001e, 0x0ca8,
-	0x080c, 0x9a65, 0x9006, 0x0c98, 0x2069, 0x026d, 0x6800, 0x9082,
-	0x0010, 0x1228, 0x6017, 0x0000, 0x9085, 0x0001, 0x0008, 0x9006,
-	0x0005, 0x6017, 0x0000, 0x2069, 0x026c, 0x6808, 0x9084, 0xff00,
-	0x9086, 0x0800, 0x1190, 0x6904, 0x9186, 0x0018, 0x0118, 0x9186,
-	0x0014, 0x1158, 0x810f, 0x6800, 0x9084, 0x00ff, 0x910d, 0x6162,
-	0x908e, 0x0014, 0x0110, 0x908e, 0x0010, 0x0005, 0x6004, 0x90b2,
-	0x0053, 0x1a0c, 0x0d65, 0x91b6, 0x0013, 0x1130, 0x2008, 0x91b2,
-	0x0040, 0x1a04, 0xc629, 0x0092, 0x91b6, 0x0027, 0x0120, 0x91b6,
-	0x0014, 0x190c, 0x0d65, 0x2001, 0x0007, 0x080c, 0x60e3, 0x080c,
-	0x86d1, 0x080c, 0x9a9f, 0x080c, 0x8793, 0x0005, 0xc566, 0xc568,
-	0xc566, 0xc566, 0xc566, 0xc568, 0xc575, 0xc626, 0xc5c5, 0xc626,
-	0xc5d7, 0xc626, 0xc575, 0xc626, 0xc61e, 0xc626, 0xc61e, 0xc626,
-	0xc626, 0xc566, 0xc566, 0xc566, 0xc566, 0xc566, 0xc566, 0xc566,
-	0xc566, 0xc566, 0xc566, 0xc566, 0xc568, 0xc566, 0xc626, 0xc566,
-	0xc566, 0xc626, 0xc566, 0xc623, 0xc626, 0xc566, 0xc566, 0xc566,
-	0xc566, 0xc626, 0xc626, 0xc566, 0xc626, 0xc626, 0xc566, 0xc570,
-	0xc566, 0xc566, 0xc566, 0xc566, 0xc622, 0xc626, 0xc566, 0xc566,
-	0xc626, 0xc626, 0xc566, 0xc566, 0xc566, 0xc566, 0x080c, 0x0d65,
-	0x080c, 0xbdef, 0x6003, 0x0002, 0x080c, 0x8793, 0x0804, 0xc628,
-	0x9006, 0x080c, 0x60a3, 0x0804, 0xc626, 0x080c, 0x6555, 0x1904,
-	0xc626, 0x9006, 0x080c, 0x60a3, 0x6010, 0x2058, 0xb810, 0x9086,
-	0x00ff, 0x1140, 0x00f6, 0x2079, 0x1800, 0x78a4, 0x8000, 0x78a6,
-	0x00fe, 0x0428, 0x6010, 0x2058, 0xb884, 0x9005, 0x1178, 0x080c,
-	0xbdd7, 0x1904, 0xc626, 0x0036, 0x0046, 0xbba0, 0x2021, 0x0007,
-	0x080c, 0x4998, 0x004e, 0x003e, 0x0804, 0xc626, 0x080c, 0x3138,
-	0x1904, 0xc626, 0x2001, 0x1800, 0x2004, 0x9086, 0x0002, 0x1138,
-	0x00f6, 0x2079, 0x1800, 0x78a4, 0x8000, 0x78a6, 0x00fe, 0x2001,
-	0x0002, 0x080c, 0x60b7, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007,
-	0x0002, 0x080c, 0x8335, 0x080c, 0x8793, 0x6110, 0x2158, 0x2009,
-	0x0001, 0x080c, 0x7fc9, 0x0804, 0xc628, 0x6610, 0x2658, 0xbe04,
-	0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0904, 0xc626, 0x9686,
-	0x0004, 0x0904, 0xc626, 0x2001, 0x0004, 0x0804, 0xc624, 0x2001,
-	0x1800, 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0x6010,
-	0x2058, 0xbba0, 0x2021, 0x0006, 0x080c, 0x4998, 0x004e, 0x003e,
-	0x2001, 0x0006, 0x080c, 0xc642, 0x6610, 0x2658, 0xbe04, 0x0066,
-	0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x006e, 0x0168, 0x2001,
-	0x0006, 0x080c, 0x60e3, 0x9284, 0x00ff, 0x908e, 0x0007, 0x1120,
-	0x2001, 0x0006, 0x080c, 0x60b7, 0x080c, 0x6555, 0x11f8, 0x2001,
-	0x1836, 0x2004, 0xd0a4, 0x01d0, 0xbe04, 0x96b4, 0x00ff, 0x9686,
-	0x0006, 0x01a0, 0x00f6, 0x2079, 0x1800, 0x78a4, 0x8000, 0x78a6,
-	0x00fe, 0x0804, 0xc5af, 0x2001, 0x0004, 0x0030, 0x2001, 0x0006,
-	0x0409, 0x0020, 0x0018, 0x0010, 0x080c, 0x60e3, 0x080c, 0x9a65,
-	0x0005, 0x2600, 0x0002, 0xc63d, 0xc63d, 0xc63d, 0xc63d, 0xc63d,
-	0xc63f, 0xc63d, 0xc63d, 0xc63d, 0xc63d, 0xc63f, 0xc63d, 0xc63d,
-	0xc63d, 0xc63f, 0xc63f, 0xc63f, 0xc63f, 0x080c, 0x0d65, 0x080c,
-	0x9a65, 0x0005, 0x0016, 0x00b6, 0x00d6, 0x6110, 0x2158, 0xb900,
-	0xd184, 0x0138, 0x080c, 0x60b7, 0x9006, 0x080c, 0x60a3, 0x080c,
-	0x2ff2, 0x00de, 0x00be, 0x001e, 0x0005, 0x6610, 0x2658, 0xb804,
-	0x9084, 0xff00, 0x8007, 0x90b2, 0x000c, 0x1a0c, 0x0d65, 0x91b6,
-	0x0015, 0x1110, 0x003b, 0x0028, 0x91b6, 0x0016, 0x190c, 0x0d65,
-	0x006b, 0x0005, 0xa4ee, 0xa4ee, 0xa4ee, 0xa4ee, 0xa4ee, 0xa4ee,
-	0xc6bd, 0xc682, 0xa4ee, 0xa4ee, 0xa4ee, 0xa4ee, 0xa4ee, 0xa4ee,
-	0xa4ee, 0xa4ee, 0xa4ee, 0xa4ee, 0xc6bd, 0xc6c4, 0xa4ee, 0xa4ee,
-	0xa4ee, 0xa4ee, 0x00f6, 0x080c, 0x6555, 0x11d8, 0x080c, 0xbdd7,
-	0x11c0, 0x6010, 0x905d, 0x01a8, 0xb884, 0x9005, 0x0190, 0x9006,
-	0x080c, 0x60a3, 0x2001, 0x0002, 0x080c, 0x60b7, 0x6023, 0x0001,
-	0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8335, 0x080c, 0x8793,
-	0x00d0, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x23ef,
-	0x1190, 0x080c, 0x6166, 0x0118, 0x080c, 0x9a65, 0x0060, 0xb810,
-	0x0006, 0xb814, 0x0006, 0x080c, 0x5bfc, 0x000e, 0xb816, 0x000e,
-	0xb812, 0x080c, 0x9a65, 0x00fe, 0x0005, 0x6604, 0x96b6, 0x001e,
-	0x1110, 0x080c, 0x9a65, 0x0005, 0x080c, 0xa8d2, 0x1148, 0x6003,
-	0x0001, 0x6007, 0x0001, 0x080c, 0x8335, 0x080c, 0x8793, 0x0010,
-	0x080c, 0x9a65, 0x0005, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0d65,
-	0x080c, 0x86d1, 0x080c, 0x9a9f, 0x0005, 0x9182, 0x0040, 0x0002,
-	0xc6f3, 0xc6f3, 0xc6f3, 0xc6f3, 0xc6f5, 0xc6f3, 0xc6f3, 0xc6f3,
-	0xc6f3, 0xc6f3, 0xc6f3, 0xc6f3, 0xc6f3, 0xc6f3, 0xc6f3, 0xc6f3,
-	0xc6f3, 0xc6f3, 0xc6f3, 0x080c, 0x0d65, 0x0096, 0x00b6, 0x00d6,
-	0x00e6, 0x00f6, 0x0046, 0x0026, 0x6210, 0x2258, 0xb8ac, 0x9005,
-	0x11b0, 0x6007, 0x0044, 0x2071, 0x0260, 0x7444, 0x94a4, 0xff00,
-	0x0904, 0xc75c, 0x080c, 0xd3d3, 0x1170, 0x9486, 0x2000, 0x1158,
-	0x2009, 0x0001, 0x2011, 0x0200, 0x080c, 0x8248, 0x0020, 0x9026,
-	0x080c, 0xd308, 0x0c30, 0x080c, 0x1023, 0x090c, 0x0d65, 0x6003,
-	0x0007, 0xa867, 0x010d, 0x9006, 0xa802, 0xa86a, 0xac8a, 0x2c00,
-	0xa88e, 0x6008, 0xa8e2, 0x6010, 0x2058, 0xb8a0, 0x7130, 0xa97a,
-	0x0016, 0xa876, 0xa87f, 0x0000, 0xa883, 0x0000, 0xa887, 0x0036,
-	0x080c, 0x683f, 0x001e, 0x080c, 0xd3d3, 0x1904, 0xc7bc, 0x9486,
-	0x2000, 0x1130, 0x2019, 0x0017, 0x080c, 0xd046, 0x0804, 0xc7bc,
-	0x9486, 0x0200, 0x1120, 0x080c, 0xcfd6, 0x0804, 0xc7bc, 0x9486,
-	0x0400, 0x0120, 0x9486, 0x1000, 0x1904, 0xc7bc, 0x2019, 0x0002,
-	0x080c, 0xcff5, 0x0804, 0xc7bc, 0x2069, 0x1a3d, 0x6a00, 0xd284,
-	0x0904, 0xc826, 0x9284, 0x0300, 0x1904, 0xc81f, 0x6804, 0x9005,
-	0x0904, 0xc807, 0x2d78, 0x6003, 0x0007, 0x080c, 0x103c, 0x0904,
-	0xc7c8, 0x7800, 0xd08c, 0x1118, 0x7804, 0x8001, 0x7806, 0x6017,
-	0x0000, 0x2001, 0x180f, 0x2004, 0xd084, 0x1904, 0xc82a, 0x9006,
-	0xa802, 0xa867, 0x0116, 0xa86a, 0x6008, 0xa8e2, 0x2c00, 0xa87a,
-	0x6010, 0x2058, 0xb8a0, 0x7130, 0xa9b6, 0xa876, 0xb928, 0xa9ba,
-	0xb92c, 0xa9be, 0xb930, 0xa9c2, 0xb934, 0xa9c6, 0xa883, 0x003d,
-	0x7044, 0x9084, 0x0003, 0x9080, 0xc7c4, 0x2005, 0xa87e, 0x20a9,
-	0x000a, 0x2001, 0x0270, 0xaa5c, 0x9290, 0x0021, 0x2009, 0x0205,
-	0x200b, 0x0080, 0x20e1, 0x0000, 0xab60, 0x23e8, 0x2098, 0x22a0,
-	0x4003, 0x200b, 0x0000, 0x2001, 0x027a, 0x200c, 0xa9b2, 0x8000,
-	0x200c, 0xa9ae, 0x080c, 0x6842, 0x002e, 0x004e, 0x00fe, 0x00ee,
-	0x00de, 0x00be, 0x009e, 0x0005, 0x0000, 0x0080, 0x0040, 0x0000,
-	0x2001, 0x1810, 0x2004, 0xd084, 0x0120, 0x080c, 0x1023, 0x1904,
-	0xc771, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x2009,
-	0xa022, 0x080c, 0x832e, 0x0c00, 0x2069, 0x0260, 0x6848, 0x9084,
-	0xff00, 0x9086, 0x1200, 0x1198, 0x686c, 0x9084, 0x00ff, 0x0016,
-	0x6114, 0x918c, 0xf700, 0x910d, 0x6116, 0x001e, 0x6003, 0x0001,
-	0x6007, 0x0043, 0x2009, 0xa025, 0x080c, 0x832e, 0x0828, 0x6868,
-	0x602e, 0x686c, 0x6032, 0x6017, 0xf200, 0x6003, 0x0001, 0x6007,
-	0x0041, 0x2009, 0xa022, 0x080c, 0x832e, 0x0804, 0xc7bc, 0x2001,
-	0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x47fb,
-	0x6017, 0xf300, 0x0010, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007,
-	0x0041, 0x2009, 0xa022, 0x080c, 0x832e, 0x0804, 0xc7bc, 0x6017,
-	0xf500, 0x0c98, 0x6017, 0xf600, 0x0804, 0xc7dc, 0x6017, 0xf200,
-	0x0804, 0xc7dc, 0xa867, 0x0146, 0xa86b, 0x0000, 0x6008, 0xa886,
-	0x2c00, 0xa87a, 0x7044, 0x9084, 0x0003, 0x9080, 0xc7c4, 0x2005,
-	0xa87e, 0x2928, 0x6010, 0x2058, 0xb8a0, 0xa876, 0xb828, 0xa88a,
-	0xb82c, 0xa88e, 0xb830, 0xa892, 0xb834, 0xa896, 0xa883, 0x003d,
-	0x2009, 0x0205, 0x2104, 0x9085, 0x0080, 0x200a, 0x20e1, 0x0000,
-	0x2011, 0x0210, 0x2214, 0x9294, 0x0fff, 0xaaa2, 0x9282, 0x0111,
-	0x1a0c, 0x0d65, 0x8210, 0x821c, 0x2001, 0x026c, 0x2098, 0xa860,
-	0x20e8, 0xa85c, 0x9080, 0x0029, 0x20a0, 0x2011, 0xc8a6, 0x2041,
-	0x0001, 0x223d, 0x9784, 0x00ff, 0x9322, 0x1208, 0x2300, 0x20a8,
-	0x4003, 0x931a, 0x0530, 0x8210, 0xd7fc, 0x1130, 0x8d68, 0x2d0a,
-	0x2001, 0x0260, 0x2098, 0x0c68, 0x2950, 0x080c, 0x103c, 0x0170,
-	0x2900, 0xb002, 0xa867, 0x0147, 0xa86b, 0x0000, 0xa860, 0x20e8,
-	0xa85c, 0x9080, 0x001b, 0x20a0, 0x8840, 0x08d8, 0x2548, 0xa800,
-	0x902d, 0x0118, 0x080c, 0x1055, 0x0cc8, 0x080c, 0x1055, 0x0804,
-	0xc7c8, 0x2548, 0x8847, 0x9885, 0x0046, 0xa866, 0x2009, 0x0205,
-	0x200b, 0x0000, 0x080c, 0xd079, 0x0804, 0xc7bc, 0x8010, 0x0004,
-	0x801a, 0x0006, 0x8018, 0x0008, 0x8016, 0x000a, 0x8014, 0x9186,
-	0x0013, 0x1160, 0x6004, 0x908a, 0x0057, 0x1a0c, 0x0d65, 0x9082,
-	0x0040, 0x0a0c, 0x0d65, 0x2008, 0x0804, 0xc931, 0x9186, 0x0051,
-	0x0108, 0x0040, 0x080c, 0x9935, 0x01e8, 0x9086, 0x0002, 0x0904,
-	0xc978, 0x00c0, 0x9186, 0x0027, 0x0180, 0x9186, 0x0048, 0x0128,
-	0x9186, 0x0014, 0x0150, 0x190c, 0x0d65, 0x080c, 0x9935, 0x0150,
-	0x9086, 0x0004, 0x0904, 0xca15, 0x0028, 0x6004, 0x9082, 0x0040,
-	0x2008, 0x001a, 0x080c, 0x9b20, 0x0005, 0xc8f8, 0xc8fa, 0xc8fa,
-	0xc921, 0xc8f8, 0xc8f8, 0xc8f8, 0xc8f8, 0xc8f8, 0xc8f8, 0xc8f8,
-	0xc8f8, 0xc8f8, 0xc8f8, 0xc8f8, 0xc8f8, 0xc8f8, 0xc8f8, 0xc8f8,
-	0x080c, 0x0d65, 0x080c, 0x86d1, 0x080c, 0x8793, 0x0036, 0x0096,
-	0x6014, 0x904d, 0x01d8, 0x080c, 0xb6c5, 0x01c0, 0x6003, 0x0002,
-	0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1178, 0x2019,
-	0x0004, 0x080c, 0xd079, 0x6017, 0x0000, 0x6018, 0x9005, 0x1120,
-	0x2001, 0x1956, 0x2004, 0x601a, 0x6003, 0x0007, 0x009e, 0x003e,
-	0x0005, 0x0096, 0x080c, 0x86d1, 0x080c, 0x8793, 0x080c, 0xb6c5,
-	0x0120, 0x6014, 0x2048, 0x080c, 0x1055, 0x080c, 0x9a9f, 0x009e,
-	0x0005, 0x0002, 0xc945, 0xc95a, 0xc947, 0xc96f, 0xc945, 0xc945,
-	0xc945, 0xc945, 0xc945, 0xc945, 0xc945, 0xc945, 0xc945, 0xc945,
-	0xc945, 0xc945, 0xc945, 0xc945, 0xc945, 0x080c, 0x0d65, 0x0096,
-	0x6014, 0x2048, 0xa87c, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009,
-	0x0043, 0x080c, 0x9b03, 0x0010, 0x6003, 0x0004, 0x080c, 0x8793,
-	0x009e, 0x0005, 0x080c, 0xb6c5, 0x0138, 0x6114, 0x0096, 0x2148,
-	0xa97c, 0x009e, 0xd1ec, 0x1138, 0x080c, 0x821d, 0x080c, 0x9a65,
-	0x080c, 0x8793, 0x0005, 0x080c, 0xd2cc, 0x0db0, 0x0cc8, 0x6003,
-	0x0001, 0x6007, 0x0041, 0x2009, 0xa022, 0x080c, 0x832e, 0x0005,
-	0x9182, 0x0040, 0x0002, 0xc98e, 0xc990, 0xc98e, 0xc98e, 0xc98e,
-	0xc98e, 0xc98e, 0xc98e, 0xc98e, 0xc98e, 0xc98e, 0xc98e, 0xc98e,
-	0xc98e, 0xc98e, 0xc98e, 0xc98e, 0xc991, 0xc98e, 0x080c, 0x0d65,
-	0x0005, 0x00d6, 0x080c, 0x821d, 0x00de, 0x080c, 0xd324, 0x080c,
-	0x9a65, 0x0005, 0x9182, 0x0040, 0x0002, 0xc9b0, 0xc9b0, 0xc9b0,
-	0xc9b0, 0xc9b0, 0xc9b0, 0xc9b0, 0xc9b0, 0xc9b0, 0xc9b2, 0xc9dd,
-	0xc9b0, 0xc9b0, 0xc9b0, 0xc9b0, 0xc9dd, 0xc9b0, 0xc9b0, 0xc9b0,
-	0x080c, 0x0d65, 0x6014, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0168,
-	0x908c, 0x0003, 0x918e, 0x0002, 0x0180, 0x6144, 0xd1e4, 0x1168,
-	0x2009, 0x0041, 0x009e, 0x0804, 0xca9d, 0x6003, 0x0007, 0x601b,
-	0x0000, 0x080c, 0x821d, 0x009e, 0x0005, 0x6014, 0x2048, 0xa97c,
-	0xd1ec, 0x1130, 0x080c, 0x821d, 0x080c, 0x9a65, 0x009e, 0x0005,
-	0x080c, 0xd2cc, 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c, 0x200c,
-	0xc1d4, 0x2102, 0x0036, 0x080c, 0x872e, 0x080c, 0x8793, 0x6014,
-	0x0096, 0x2048, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc,
-	0x0188, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x0140, 0xa8ac,
-	0x6330, 0x931a, 0x6332, 0xa8b0, 0x632c, 0x931b, 0x632e, 0x6003,
-	0x0002, 0x0080, 0x2019, 0x0004, 0x080c, 0xd079, 0x6018, 0x9005,
-	0x1128, 0x2001, 0x1956, 0x2004, 0x8003, 0x601a, 0x6017, 0x0000,
-	0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x9182, 0x0040, 0x0002,
-	0xca2c, 0xca2c, 0xca2c, 0xca2c, 0xca2c, 0xca2c, 0xca2c, 0xca2c,
-	0xca2e, 0xca2c, 0xca2c, 0xca2c, 0xca2c, 0xca2c, 0xca2c, 0xca2c,
-	0xca2c, 0xca2c, 0xca2c, 0xca79, 0x080c, 0x0d65, 0x6014, 0x0096,
-	0x2048, 0xa834, 0xaa38, 0x6110, 0x00b6, 0x2058, 0xb900, 0x00be,
-	0xd1bc, 0x1190, 0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128, 0x2009,
-	0x0041, 0x009e, 0x0804, 0xca9d, 0x6003, 0x0007, 0x601b, 0x0000,
-	0x080c, 0x821d, 0x009e, 0x0005, 0x6124, 0xd1f4, 0x1d58, 0x0006,
-	0x0046, 0xacac, 0x9422, 0xa9b0, 0x2200, 0x910b, 0x6030, 0x9420,
-	0x6432, 0x602c, 0x9109, 0x612e, 0x004e, 0x000e, 0x08d8, 0x6110,
-	0x00b6, 0x2158, 0xb900, 0x00be, 0xd1bc, 0x1178, 0x2009, 0x180e,
-	0x210c, 0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, 0x0006,
-	0x00e9, 0x080c, 0x821f, 0x009e, 0x0005, 0x6003, 0x0002, 0x009e,
-	0x0005, 0x6024, 0xd0f4, 0x0128, 0x080c, 0x158c, 0x1904, 0xca2e,
-	0x0005, 0x6014, 0x0096, 0x2048, 0xa834, 0xa938, 0x009e, 0x9105,
-	0x1120, 0x080c, 0x158c, 0x1904, 0xca2e, 0x0005, 0xd2fc, 0x0140,
-	0x8002, 0x8000, 0x8212, 0x9291, 0x0000, 0x2009, 0x0009, 0x0010,
-	0x2009, 0x0015, 0xaa9a, 0xa896, 0x0005, 0x9182, 0x0040, 0x0208,
-	0x0062, 0x9186, 0x0013, 0x0120, 0x9186, 0x0014, 0x190c, 0x0d65,
-	0x6024, 0xd0dc, 0x090c, 0x0d65, 0x0005, 0xcac0, 0xcacc, 0xcad8,
-	0xcae4, 0xcac0, 0xcac0, 0xcac0, 0xcac0, 0xcac7, 0xcac2, 0xcac2,
-	0xcac0, 0xcac0, 0xcac0, 0xcac0, 0xcac2, 0xcac0, 0xcac2, 0xcac0,
-	0x080c, 0x0d65, 0x6024, 0xd0dc, 0x090c, 0x0d65, 0x0005, 0x6014,
-	0x9005, 0x190c, 0x0d65, 0x0005, 0x6003, 0x0001, 0x6106, 0x0126,
-	0x2091, 0x8000, 0x2009, 0xa022, 0x080c, 0x8310, 0x012e, 0x0005,
-	0x6003, 0x0004, 0x6106, 0x0126, 0x2091, 0x8000, 0x2009, 0xa001,
-	0x080c, 0x832e, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106, 0x080c,
-	0x1a79, 0x0126, 0x2091, 0x8000, 0x6014, 0x0096, 0x2048, 0xa87c,
-	0x9084, 0x0003, 0x9086, 0x0002, 0x0198, 0x6024, 0xd0cc, 0x1148,
-	0xd0c4, 0x1138, 0xa8a8, 0x2004, 0x9005, 0x1118, 0x2009, 0xb035,
-	0x0010, 0x2009, 0xa035, 0x009e, 0x080c, 0x8375, 0x012e, 0x0005,
-	0x2009, 0xa032, 0x0cc0, 0x0126, 0x2091, 0x8000, 0x0036, 0x0096,
-	0x9182, 0x0040, 0x0023, 0x009e, 0x003e, 0x012e, 0x0005, 0xcb27,
-	0xcb29, 0xcb3e, 0xcb58, 0xcb27, 0xcb27, 0xcb27, 0xcb27, 0xcb27,
-	0xcb27, 0xcb27, 0xcb27, 0xcb27, 0xcb27, 0xcb27, 0xcb27, 0x080c,
-	0x0d65, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0510, 0x909c, 0x0003,
-	0x939e, 0x0003, 0x01e8, 0x6003, 0x0001, 0x6106, 0x0126, 0x2091,
-	0x8000, 0x2009, 0xa022, 0x080c, 0x832e, 0x0468, 0x6014, 0x2048,
-	0xa87c, 0xd0fc, 0x0168, 0x909c, 0x0003, 0x939e, 0x0003, 0x0140,
-	0x6003, 0x0001, 0x6106, 0x2009, 0xa001, 0x080c, 0x832e, 0x00d8,
-	0x901e, 0x6316, 0x631a, 0x2019, 0x0004, 0x080c, 0xd079, 0x0098,
-	0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0d98, 0x909c, 0x0003, 0x939e,
-	0x0003, 0x0d70, 0x6003, 0x0003, 0x6106, 0x080c, 0x1a79, 0x2009,
-	0xa035, 0x080c, 0x8375, 0x0005, 0x080c, 0x86d1, 0x6114, 0x81ff,
-	0x0158, 0x0096, 0x2148, 0x080c, 0xd370, 0x0036, 0x2019, 0x0029,
-	0x080c, 0xd079, 0x003e, 0x009e, 0x080c, 0x9a9f, 0x080c, 0x8793,
-	0x0005, 0x080c, 0x872e, 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148,
-	0x080c, 0xd370, 0x0036, 0x2019, 0x0029, 0x080c, 0xd079, 0x003e,
-	0x009e, 0x080c, 0x9a9f, 0x0005, 0x9182, 0x0085, 0x0002, 0xcba6,
-	0xcba4, 0xcba4, 0xcbb2, 0xcba4, 0xcba4, 0xcba4, 0xcba4, 0xcba4,
-	0xcba4, 0xcba4, 0xcba4, 0xcba4, 0x080c, 0x0d65, 0x6003, 0x000b,
-	0x6106, 0x0126, 0x2091, 0x8000, 0x2009, 0x8020, 0x080c, 0x832e,
-	0x012e, 0x0005, 0x0026, 0x00e6, 0x080c, 0xd2c3, 0x0118, 0x080c,
-	0x9a65, 0x0440, 0x2071, 0x0260, 0x7224, 0x6216, 0x2001, 0x180e,
-	0x2004, 0xd0e4, 0x0150, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be,
-	0x2c00, 0x2011, 0x014e, 0x080c, 0x9d91, 0x7220, 0x080c, 0xcf0f,
-	0x0118, 0x6007, 0x0086, 0x0040, 0x6007, 0x0087, 0x7224, 0x9296,
-	0xffff, 0x1110, 0x6007, 0x0086, 0x6003, 0x0001, 0x2009, 0x8020,
-	0x080c, 0x832e, 0x00ee, 0x002e, 0x0005, 0x9186, 0x0013, 0x1160,
-	0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d65, 0x908a, 0x0092, 0x1a0c,
-	0x0d65, 0x9082, 0x0085, 0x00a2, 0x9186, 0x0027, 0x0130, 0x9186,
-	0x0014, 0x0118, 0x080c, 0x9b20, 0x0050, 0x2001, 0x0007, 0x080c,
-	0x60e3, 0x080c, 0x86d1, 0x080c, 0x9a9f, 0x080c, 0x8793, 0x0005,
-	0xcc15, 0xcc17, 0xcc17, 0xcc15, 0xcc15, 0xcc15, 0xcc15, 0xcc15,
-	0xcc15, 0xcc15, 0xcc15, 0xcc15, 0xcc15, 0x080c, 0x0d65, 0x080c,
-	0x9a9f, 0x080c, 0x8793, 0x0005, 0x9182, 0x0085, 0x0a0c, 0x0d65,
-	0x9182, 0x0092, 0x1a0c, 0x0d65, 0x9182, 0x0085, 0x0002, 0xcc34,
-	0xcc34, 0xcc34, 0xcc36, 0xcc34, 0xcc34, 0xcc34, 0xcc34, 0xcc34,
-	0xcc34, 0xcc34, 0xcc34, 0xcc34, 0x080c, 0x0d65, 0x0005, 0x9186,
-	0x0013, 0x0148, 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118,
-	0x080c, 0x9b20, 0x0020, 0x080c, 0x86d1, 0x080c, 0x9a9f, 0x0005,
-	0x0036, 0x080c, 0xd324, 0x604b, 0x0000, 0x2019, 0x000b, 0x0031,
-	0x6023, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, 0x0036,
-	0x2091, 0x8000, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x0006,
-	0x9086, 0x0003, 0x0110, 0x080c, 0x9746, 0x0086, 0x2c40, 0x0096,
-	0x904e, 0x080c, 0x9200, 0x009e, 0x008e, 0x1550, 0x0076, 0x2c38,
-	0x080c, 0x92ab, 0x007e, 0x1520, 0x6000, 0x9086, 0x0000, 0x0500,
-	0x6020, 0x9086, 0x0007, 0x01e0, 0x0096, 0x601c, 0xd084, 0x0140,
-	0x080c, 0xd324, 0x080c, 0xbdef, 0x080c, 0x18f4, 0x6023, 0x0007,
-	0x6014, 0x2048, 0x080c, 0xb6c5, 0x0110, 0x080c, 0xd079, 0x009e,
-	0x6017, 0x0000, 0x080c, 0xd324, 0x6023, 0x0007, 0x080c, 0xbdef,
-	0x000e, 0x9086, 0x0003, 0x0110, 0x080c, 0x9762, 0x003e, 0x012e,
-	0x0005, 0x00f6, 0x00c6, 0x00b6, 0x0036, 0x0156, 0x2079, 0x0260,
-	0x7938, 0x783c, 0x080c, 0x23ef, 0x15d8, 0x0016, 0x00c6, 0x080c,
-	0x6166, 0x15a0, 0x001e, 0x00c6, 0x2160, 0x080c, 0xbdec, 0x00ce,
-	0x002e, 0x0026, 0x0016, 0x080c, 0x9746, 0x2019, 0x0029, 0x080c,
-	0x9372, 0x080c, 0x8498, 0x0076, 0x903e, 0x080c, 0x8387, 0x007e,
-	0x001e, 0x0076, 0x903e, 0x080c, 0xce23, 0x007e, 0x080c, 0x9762,
-	0x0026, 0xba04, 0x9294, 0xff00, 0x8217, 0x9286, 0x0006, 0x0118,
-	0x9286, 0x0004, 0x1118, 0xbaa0, 0x080c, 0x3093, 0x002e, 0x001e,
-	0x080c, 0x5bfc, 0xbe12, 0xbd16, 0x9006, 0x0010, 0x00ce, 0x001e,
-	0x015e, 0x003e, 0x00be, 0x00ce, 0x00fe, 0x0005, 0x00c6, 0x00d6,
-	0x00b6, 0x0016, 0x2009, 0x1823, 0x2104, 0x9086, 0x0074, 0x1904,
-	0xcd47, 0x2069, 0x0260, 0x6944, 0x9182, 0x0100, 0x06e0, 0x6940,
-	0x9184, 0x8000, 0x0904, 0xcd44, 0x2001, 0x194d, 0x2004, 0x9005,
-	0x1140, 0x6010, 0x2058, 0xb884, 0x9005, 0x0118, 0x9184, 0x0800,
-	0x0598, 0x6948, 0x918a, 0x0001, 0x0648, 0x080c, 0xd3d8, 0x0118,
-	0x6978, 0xd1fc, 0x11b8, 0x2009, 0x0205, 0x200b, 0x0001, 0x693c,
-	0x81ff, 0x1198, 0x6944, 0x9182, 0x0100, 0x02a8, 0x6940, 0x81ff,
-	0x1178, 0x6948, 0x918a, 0x0001, 0x0288, 0x6950, 0x918a, 0x0001,
-	0x0298, 0x00d0, 0x6017, 0x0100, 0x00a0, 0x6017, 0x0300, 0x0088,
-	0x6017, 0x0500, 0x0070, 0x6017, 0x0700, 0x0058, 0x6017, 0x0900,
-	0x0040, 0x6017, 0x0b00, 0x0028, 0x6017, 0x0f00, 0x0010, 0x6017,
-	0x2d00, 0x9085, 0x0001, 0x0008, 0x9006, 0x001e, 0x00be, 0x00de,
-	0x00ce, 0x0005, 0x00c6, 0x00b6, 0x0026, 0x0036, 0x0156, 0x6210,
-	0x2258, 0xbb04, 0x9394, 0x00ff, 0x9286, 0x0006, 0x0180, 0x9286,
-	0x0004, 0x0168, 0x9394, 0xff00, 0x8217, 0x9286, 0x0006, 0x0138,
-	0x9286, 0x0004, 0x0120, 0x080c, 0x6175, 0x0804, 0xcdb2, 0x2011,
-	0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c,
-	0xaa5d, 0x009e, 0x15c0, 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096,
-	0x2b48, 0x2019, 0x0006, 0x080c, 0xaa5d, 0x009e, 0x1560, 0x0046,
-	0x0016, 0xbaa0, 0x2220, 0x9006, 0x2009, 0x1854, 0x210c, 0x0038,
-	0x2009, 0x0029, 0x080c, 0xd0ce, 0xb800, 0xc0e5, 0xb802, 0x080c,
-	0x9746, 0x2019, 0x0029, 0x080c, 0x8498, 0x0076, 0x2039, 0x0000,
-	0x080c, 0x8387, 0x2c08, 0x080c, 0xce23, 0x007e, 0x080c, 0x9762,
-	0x2001, 0x0007, 0x080c, 0x60e3, 0x2001, 0x0007, 0x080c, 0x60b7,
-	0x001e, 0x004e, 0x9006, 0x015e, 0x003e, 0x002e, 0x00be, 0x00ce,
-	0x0005, 0x00d6, 0x2069, 0x026e, 0x6800, 0x9086, 0x0800, 0x0118,
-	0x6017, 0x0000, 0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, 0x00f6,
-	0x0016, 0x0026, 0x0036, 0x0156, 0x2079, 0x026c, 0x7930, 0x7834,
-	0x080c, 0x23ef, 0x11d0, 0x080c, 0x6166, 0x11b8, 0x2011, 0x0270,
-	0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xaa5d,
-	0x009e, 0x1158, 0x2011, 0x0274, 0x20a9, 0x0004, 0x0096, 0x2b48,
-	0x2019, 0x0006, 0x080c, 0xaa5d, 0x009e, 0x015e, 0x003e, 0x002e,
-	0x001e, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x0006, 0x0016, 0x0026,
-	0x0036, 0x0156, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c,
-	0x23ef, 0x11d0, 0x080c, 0x6166, 0x11b8, 0x2011, 0x0276, 0x20a9,
-	0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xaa5d, 0x009e,
-	0x1158, 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019,
-	0x0006, 0x080c, 0xaa5d, 0x009e, 0x015e, 0x003e, 0x002e, 0x001e,
-	0x000e, 0x00be, 0x0005, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066,
-	0x0056, 0x0046, 0x0026, 0x0126, 0x2091, 0x8000, 0x080c, 0x97a4,
-	0x0106, 0x190c, 0x9746, 0x2740, 0x2029, 0x19c2, 0x252c, 0x2021,
-	0x19c9, 0x2424, 0x2061, 0x1ddc, 0x2071, 0x1800, 0x7650, 0x7070,
-	0x81ff, 0x0150, 0x0006, 0x9186, 0x1b00, 0x000e, 0x0128, 0x8001,
-	0x9602, 0x1a04, 0xcec4, 0x0018, 0x9606, 0x0904, 0xcec4, 0x2100,
-	0x9c06, 0x0904, 0xcebb, 0x080c, 0xd10a, 0x1904, 0xcebb, 0x080c,
-	0xd3f5, 0x0904, 0xcebb, 0x080c, 0xd0fa, 0x0904, 0xcebb, 0x6720,
-	0x9786, 0x0001, 0x1148, 0x080c, 0x3138, 0x0904, 0xcee3, 0x6004,
-	0x9086, 0x0000, 0x1904, 0xcee3, 0x9786, 0x0004, 0x0904, 0xcee3,
-	0x9786, 0x0007, 0x0904, 0xcebb, 0x2500, 0x9c06, 0x0904, 0xcebb,
-	0x2400, 0x9c06, 0x0904, 0xcebb, 0x88ff, 0x0118, 0x605c, 0x9906,
-	0x15d0, 0x0096, 0x6043, 0xffff, 0x6000, 0x9086, 0x0004, 0x1120,
-	0x0016, 0x080c, 0x18f4, 0x001e, 0x9786, 0x000a, 0x0148, 0x080c,
-	0xb8d3, 0x1130, 0x080c, 0xa40d, 0x009e, 0x080c, 0x9a9f, 0x0418,
-	0x6014, 0x2048, 0x080c, 0xb6c5, 0x01d8, 0x9786, 0x0003, 0x1588,
-	0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0xa87c, 0xd0cc, 0x0130,
-	0x0096, 0xa878, 0x2048, 0x080c, 0x0fd5, 0x009e, 0x080c, 0xd370,
-	0x0016, 0x080c, 0xb9bc, 0x080c, 0x6833, 0x001e, 0x080c, 0xb8ad,
-	0x009e, 0x080c, 0x9a9f, 0x9ce0, 0x001c, 0x2001, 0x1819, 0x2004,
-	0x9c02, 0x1210, 0x0804, 0xce3c, 0x010e, 0x190c, 0x9762, 0x012e,
-	0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee,
-	0x0005, 0x9786, 0x0006, 0x1150, 0x9386, 0x0005, 0x0128, 0x080c,
-	0xd370, 0x080c, 0xd079, 0x08e0, 0x009e, 0x08e8, 0x9786, 0x000a,
-	0x0908, 0x0804, 0xcea0, 0x81ff, 0x09b0, 0x9180, 0x0001, 0x2004,
-	0x9086, 0x0018, 0x0130, 0x9180, 0x0001, 0x2004, 0x9086, 0x002d,
-	0x1950, 0x6000, 0x9086, 0x0002, 0x1930, 0x080c, 0xb8c2, 0x0130,
-	0x080c, 0xb8d3, 0x1900, 0x080c, 0xa40d, 0x0038, 0x080c, 0x2ff2,
-	0x080c, 0xb8d3, 0x1110, 0x080c, 0xa40d, 0x080c, 0x9a9f, 0x0804,
-	0xcebb, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x0005, 0x00c6,
-	0x00e6, 0x0016, 0x2c08, 0x2170, 0x9006, 0x080c, 0xd0a0, 0x001e,
-	0x0120, 0x6020, 0x9084, 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005,
-	0xcf2e, 0xcf2e, 0xcf2e, 0xcf2e, 0xcf2e, 0xcf2e, 0xcf30, 0xcf2e,
-	0xcf2e, 0xcf2e, 0xcf2e, 0x9a9f, 0x9a9f, 0xcf2e, 0x9006, 0x0005,
-	0x0036, 0x0046, 0x0016, 0x7010, 0x00b6, 0x2058, 0xbca0, 0x00be,
-	0x2c00, 0x2009, 0x0020, 0x080c, 0xd0ce, 0x001e, 0x004e, 0x2019,
-	0x0002, 0x080c, 0xcc56, 0x003e, 0x9085, 0x0001, 0x0005, 0x0096,
-	0x080c, 0xb6c5, 0x0140, 0x6014, 0x904d, 0x080c, 0xb2d0, 0x687b,
-	0x0005, 0x080c, 0x683f, 0x009e, 0x080c, 0x9a9f, 0x9085, 0x0001,
-	0x0005, 0x2001, 0x0001, 0x080c, 0x60a3, 0x0156, 0x0016, 0x0026,
-	0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0276, 0x080c,
-	0xaa49, 0x003e, 0x002e, 0x001e, 0x015e, 0x9005, 0x0005, 0x00f6,
-	0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x00b6, 0x0126, 0x2091,
-	0x8000, 0x2740, 0x2061, 0x1ddc, 0x2079, 0x0001, 0x8fff, 0x0904,
-	0xcfc9, 0x2071, 0x1800, 0x7650, 0x7070, 0x8001, 0x9602, 0x1a04,
-	0xcfc9, 0x88ff, 0x0120, 0x2800, 0x9c06, 0x1590, 0x2078, 0x080c,
-	0xd0fa, 0x0570, 0x2400, 0x9c06, 0x0558, 0x6720, 0x9786, 0x0006,
-	0x1538, 0x9786, 0x0007, 0x0520, 0x88ff, 0x1140, 0x6010, 0x9b06,
-	0x11f8, 0x85ff, 0x0118, 0x605c, 0x9106, 0x11d0, 0x0096, 0x601c,
-	0xd084, 0x0140, 0x080c, 0xd324, 0x080c, 0xbdef, 0x080c, 0x18f4,
-	0x6023, 0x0007, 0x6014, 0x2048, 0x080c, 0xb6c5, 0x0120, 0x0046,
-	0x080c, 0xd079, 0x004e, 0x009e, 0x080c, 0x9a9f, 0x88ff, 0x1198,
-	0x9ce0, 0x001c, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1210, 0x0804,
-	0xcf7e, 0x9006, 0x012e, 0x00be, 0x006e, 0x007e, 0x008e, 0x00ce,
-	0x00ee, 0x00fe, 0x0005, 0x98c5, 0x0001, 0x0ca0, 0x080c, 0x9746,
-	0x00b6, 0x0076, 0x0056, 0x0086, 0x9046, 0x2029, 0x0001, 0x2c20,
-	0x2019, 0x0002, 0x6210, 0x2258, 0x0096, 0x904e, 0x080c, 0x9200,
-	0x009e, 0x008e, 0x903e, 0x080c, 0x92ab, 0x080c, 0xcf6f, 0x005e,
-	0x007e, 0x00be, 0x080c, 0x9762, 0x0005, 0x080c, 0x9746, 0x00b6,
-	0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x2128, 0x20a9,
-	0x007f, 0x900e, 0x0016, 0x0036, 0x080c, 0x6166, 0x1190, 0x0056,
-	0x0086, 0x9046, 0x2508, 0x2029, 0x0001, 0x0096, 0x904e, 0x080c,
-	0x9200, 0x009e, 0x008e, 0x903e, 0x080c, 0x92ab, 0x080c, 0xcf6f,
-	0x005e, 0x003e, 0x001e, 0x8108, 0x1f04, 0xd002, 0x015e, 0x00ce,
-	0x007e, 0x005e, 0x004e, 0x00be, 0x080c, 0x9762, 0x0005, 0x080c,
-	0x9746, 0x00b6, 0x0076, 0x0056, 0x6210, 0x2258, 0x0086, 0x9046,
-	0x2029, 0x0001, 0x2019, 0x0048, 0x0096, 0x904e, 0x080c, 0x9200,
-	0x009e, 0x008e, 0x903e, 0x080c, 0x92ab, 0x2c20, 0x080c, 0xcf6f,
-	0x005e, 0x007e, 0x00be, 0x080c, 0x9762, 0x0005, 0x080c, 0x9746,
-	0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x20a9,
-	0x0800, 0x900e, 0x0016, 0x0036, 0x080c, 0x6166, 0x11a0, 0x0086,
-	0x9046, 0x2828, 0x0046, 0x2021, 0x0001, 0x080c, 0xd308, 0x004e,
-	0x0096, 0x904e, 0x080c, 0x9200, 0x009e, 0x008e, 0x903e, 0x080c,
-	0x92ab, 0x080c, 0xcf6f, 0x003e, 0x001e, 0x8108, 0x1f04, 0xd052,
-	0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x080c, 0x9762,
-	0x0005, 0x0016, 0x00f6, 0x080c, 0xb6c3, 0x0198, 0xa864, 0x9084,
-	0x00ff, 0x9086, 0x0046, 0x0180, 0xa800, 0x907d, 0x0138, 0xa803,
-	0x0000, 0xab82, 0x080c, 0x683f, 0x2f48, 0x0cb0, 0xab82, 0x080c,
-	0x683f, 0x00fe, 0x001e, 0x0005, 0xa800, 0x907d, 0x0130, 0xa803,
-	0x0000, 0x080c, 0x683f, 0x2f48, 0x0cb8, 0x080c, 0x683f, 0x0c88,
-	0x00e6, 0x0046, 0x0036, 0x2061, 0x1ddc, 0x9005, 0x1138, 0x2071,
-	0x1800, 0x7450, 0x7070, 0x8001, 0x9402, 0x12d8, 0x2100, 0x9c06,
-	0x0168, 0x6000, 0x9086, 0x0000, 0x0148, 0x6008, 0x9206, 0x1130,
-	0x6010, 0x91a0, 0x0004, 0x2424, 0x9406, 0x0140, 0x9ce0, 0x001c,
-	0x2001, 0x1819, 0x2004, 0x9c02, 0x1220, 0x0c40, 0x9085, 0x0001,
-	0x0008, 0x9006, 0x003e, 0x004e, 0x00ee, 0x0005, 0x0096, 0x0006,
-	0x080c, 0x1023, 0x000e, 0x090c, 0x0d65, 0xa867, 0x010d, 0xa88e,
-	0x0026, 0x2010, 0x080c, 0xb6b3, 0x2001, 0x0000, 0x0120, 0x2200,
-	0x9080, 0x0017, 0x2004, 0x002e, 0xa87a, 0xa986, 0xac76, 0xa87f,
-	0x0000, 0x2001, 0x195d, 0x2004, 0xa882, 0x9006, 0xa8e2, 0xa802,
-	0xa86a, 0xa88a, 0x0126, 0x2091, 0x8000, 0x080c, 0x683f, 0x012e,
+	0x2011, 0x0276, 0x080c, 0xabb0, 0x003e, 0x002e, 0x001e, 0x015e,
+	0x9005, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066,
+	0x00b6, 0x0126, 0x2091, 0x8000, 0x2740, 0x2061, 0x1ddc, 0x2079,
+	0x0001, 0x8fff, 0x0904, 0xd14c, 0x2071, 0x1800, 0x7650, 0x7070,
+	0x8001, 0x9602, 0x1a04, 0xd14c, 0x88ff, 0x0120, 0x2800, 0x9c06,
+	0x1590, 0x2078, 0x080c, 0xd282, 0x0570, 0x2400, 0x9c06, 0x0558,
+	0x6720, 0x9786, 0x0006, 0x1538, 0x9786, 0x0007, 0x0520, 0x88ff,
+	0x1140, 0x6010, 0x9b06, 0x11f8, 0x85ff, 0x0118, 0x605c, 0x9106,
+	0x11d0, 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xd4ac, 0x080c,
+	0xbf5e, 0x080c, 0x1914, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c,
+	0xb82c, 0x0120, 0x0046, 0x080c, 0xd1fc, 0x004e, 0x009e, 0x080c,
+	0x9c06, 0x88ff, 0x1198, 0x9ce0, 0x001c, 0x2001, 0x1819, 0x2004,
+	0x9c02, 0x1210, 0x0804, 0xd101, 0x9006, 0x012e, 0x00be, 0x006e,
+	0x007e, 0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x98c5, 0x0001,
+	0x0ca0, 0x080c, 0x98ad, 0x00b6, 0x0076, 0x0056, 0x0086, 0x9046,
+	0x2029, 0x0001, 0x2c20, 0x2019, 0x0002, 0x6210, 0x2258, 0x0096,
+	0x904e, 0x080c, 0x9367, 0x009e, 0x008e, 0x903e, 0x080c, 0x9412,
+	0x080c, 0xd0f2, 0x005e, 0x007e, 0x00be, 0x080c, 0x98c9, 0x0005,
+	0x080c, 0x98ad, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156,
+	0x2c20, 0x2128, 0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, 0x080c,
+	0x6269, 0x1190, 0x0056, 0x0086, 0x9046, 0x2508, 0x2029, 0x0001,
+	0x0096, 0x904e, 0x080c, 0x9367, 0x009e, 0x008e, 0x903e, 0x080c,
+	0x9412, 0x080c, 0xd0f2, 0x005e, 0x003e, 0x001e, 0x8108, 0x1f04,
+	0xd185, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x080c,
+	0x98c9, 0x0005, 0x080c, 0x98ad, 0x00b6, 0x0076, 0x0056, 0x6210,
+	0x2258, 0x0086, 0x9046, 0x2029, 0x0001, 0x2019, 0x0048, 0x0096,
+	0x904e, 0x080c, 0x9367, 0x009e, 0x008e, 0x903e, 0x080c, 0x9412,
+	0x2c20, 0x080c, 0xd0f2, 0x005e, 0x007e, 0x00be, 0x080c, 0x98c9,
+	0x0005, 0x080c, 0x98ad, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6,
+	0x0156, 0x2c20, 0x20a9, 0x0800, 0x900e, 0x0016, 0x0036, 0x080c,
+	0x6269, 0x11a0, 0x0086, 0x9046, 0x2828, 0x0046, 0x2021, 0x0001,
+	0x080c, 0xd490, 0x004e, 0x0096, 0x904e, 0x080c, 0x9367, 0x009e,
+	0x008e, 0x903e, 0x080c, 0x9412, 0x080c, 0xd0f2, 0x003e, 0x001e,
+	0x8108, 0x1f04, 0xd1d5, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e,
+	0x00be, 0x080c, 0x98c9, 0x0005, 0x0016, 0x00f6, 0x080c, 0xb82a,
+	0x0198, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0046, 0x0180, 0xa800,
+	0x907d, 0x0138, 0xa803, 0x0000, 0xab82, 0x080c, 0x698f, 0x2f48,
+	0x0cb0, 0xab82, 0x080c, 0x698f, 0x00fe, 0x001e, 0x0005, 0xa800,
+	0x907d, 0x0130, 0xa803, 0x0000, 0x080c, 0x698f, 0x2f48, 0x0cb8,
+	0x080c, 0x698f, 0x0c88, 0x00e6, 0x0046, 0x0036, 0x2061, 0x1ddc,
+	0x9005, 0x1138, 0x2071, 0x1800, 0x7450, 0x7070, 0x8001, 0x9402,
+	0x12d8, 0x2100, 0x9c06, 0x0168, 0x6000, 0x9086, 0x0000, 0x0148,
+	0x6008, 0x9206, 0x1130, 0x6010, 0x91a0, 0x0004, 0x2424, 0x9406,
+	0x0140, 0x9ce0, 0x001c, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1220,
+	0x0c40, 0x9085, 0x0001, 0x0008, 0x9006, 0x003e, 0x004e, 0x00ee,
+	0x0005, 0x0096, 0x0006, 0x080c, 0x1022, 0x000e, 0x090c, 0x0d65,
+	0xaae2, 0xa867, 0x010d, 0xa88e, 0x0026, 0x2010, 0x080c, 0xb81a,
+	0x2001, 0x0000, 0x0120, 0x2200, 0x9080, 0x0017, 0x2004, 0x002e,
+	0xa87a, 0x9186, 0x0020, 0x0110, 0xa8e3, 0xffff, 0xa986, 0xac76,
+	0xa87f, 0x0000, 0x2001, 0x195f, 0x2004, 0xa882, 0x9006, 0xa802,
+	0xa86a, 0xa88a, 0x0126, 0x2091, 0x8000, 0x080c, 0x698f, 0x012e,
 	0x009e, 0x0005, 0x6700, 0x9786, 0x0000, 0x0158, 0x9786, 0x0001,
 	0x0140, 0x9786, 0x000a, 0x0128, 0x9786, 0x0009, 0x0110, 0x9085,
 	0x0001, 0x0005, 0x00e6, 0x6010, 0x9075, 0x0138, 0x00b6, 0x2058,
 	0xb8a0, 0x00be, 0x9206, 0x00ee, 0x0005, 0x9085, 0x0001, 0x0cd8,
 	0x0016, 0x6004, 0x908e, 0x001e, 0x11a0, 0x8007, 0x6134, 0x918c,
 	0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023,
-	0x0005, 0x2001, 0x1956, 0x2004, 0x601a, 0x2009, 0x8020, 0x080c,
-	0x832e, 0x001e, 0x0005, 0xa001, 0xa001, 0x0005, 0x6024, 0xd0e4,
-	0x0158, 0xd0cc, 0x0118, 0x080c, 0xba03, 0x0030, 0x080c, 0xd324,
-	0x080c, 0x821d, 0x080c, 0x9a65, 0x0005, 0x9280, 0x0008, 0x2004,
-	0x9084, 0x000f, 0x0002, 0xd159, 0xd159, 0xd159, 0xd15b, 0xd159,
-	0xd15b, 0xd15b, 0xd159, 0xd15b, 0xd159, 0xd159, 0xd159, 0xd159,
-	0xd159, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x9280, 0x0008,
-	0x2004, 0x9084, 0x000f, 0x0002, 0xd172, 0xd172, 0xd172, 0xd172,
-	0xd172, 0xd172, 0xd17f, 0xd172, 0xd172, 0xd172, 0xd172, 0xd172,
-	0xd172, 0xd172, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00,
-	0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x832e, 0x0005, 0x0096,
-	0x00c6, 0x2260, 0x080c, 0xd324, 0x604b, 0x0000, 0x6024, 0xc0f4,
+	0x0005, 0x2001, 0x1958, 0x2004, 0x601a, 0x2009, 0x8020, 0x080c,
+	0x84a9, 0x001e, 0x0005, 0xa001, 0xa001, 0x0005, 0x6024, 0xd0e4,
+	0x0158, 0xd0cc, 0x0118, 0x080c, 0xbb71, 0x0030, 0x080c, 0xd4ac,
+	0x080c, 0x8398, 0x080c, 0x9bcc, 0x0005, 0x9280, 0x0008, 0x2004,
+	0x9084, 0x000f, 0x0002, 0xd2e1, 0xd2e1, 0xd2e1, 0xd2e3, 0xd2e1,
+	0xd2e3, 0xd2e3, 0xd2e1, 0xd2e3, 0xd2e1, 0xd2e1, 0xd2e1, 0xd2e1,
+	0xd2e1, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x9280, 0x0008,
+	0x2004, 0x9084, 0x000f, 0x0002, 0xd2fa, 0xd2fa, 0xd2fa, 0xd2fa,
+	0xd2fa, 0xd2fa, 0xd307, 0xd2fa, 0xd2fa, 0xd2fa, 0xd2fa, 0xd2fa,
+	0xd2fa, 0xd2fa, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00,
+	0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x84a9, 0x0005, 0x0096,
+	0x00c6, 0x2260, 0x080c, 0xd4ac, 0x604b, 0x0000, 0x6024, 0xc0f4,
 	0xc0e4, 0x6026, 0x603b, 0x0000, 0x00ce, 0x00d6, 0x2268, 0x9186,
-	0x0007, 0x1904, 0xd1d8, 0x6814, 0x9005, 0x0138, 0x2048, 0xa87c,
+	0x0007, 0x1904, 0xd360, 0x6814, 0x9005, 0x0138, 0x2048, 0xa87c,
 	0xd0fc, 0x1118, 0x00de, 0x009e, 0x08a8, 0x6007, 0x003a, 0x6003,
-	0x0001, 0x2009, 0x8020, 0x080c, 0x832e, 0x00c6, 0x2d60, 0x6100,
-	0x9186, 0x0002, 0x1904, 0xd24f, 0x6014, 0x9005, 0x1138, 0x6000,
-	0x9086, 0x0007, 0x190c, 0x0d65, 0x0804, 0xd24f, 0x2048, 0x080c,
-	0xb6c5, 0x1130, 0x0028, 0x2048, 0xa800, 0x9005, 0x1de0, 0x2900,
+	0x0001, 0x2009, 0x8020, 0x080c, 0x84a9, 0x00c6, 0x2d60, 0x6100,
+	0x9186, 0x0002, 0x1904, 0xd3d7, 0x6014, 0x9005, 0x1138, 0x6000,
+	0x9086, 0x0007, 0x190c, 0x0d65, 0x0804, 0xd3d7, 0x2048, 0x080c,
+	0xb82c, 0x1130, 0x0028, 0x2048, 0xa800, 0x9005, 0x1de0, 0x2900,
 	0x2048, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x1168, 0xa87c,
 	0xc0dc, 0xc0f4, 0xa87e, 0xa880, 0xc0fc, 0xa882, 0x2009, 0x0043,
-	0x080c, 0xca9d, 0x0804, 0xd24f, 0x2009, 0x0041, 0x0804, 0xd249,
+	0x080c, 0xcc1b, 0x0804, 0xd3d7, 0x2009, 0x0041, 0x0804, 0xd3d1,
 	0x9186, 0x0005, 0x15a0, 0x6814, 0x2048, 0xa87c, 0xd0bc, 0x1120,
-	0x00de, 0x009e, 0x0804, 0xd172, 0xd0b4, 0x0128, 0xd0fc, 0x090c,
-	0x0d65, 0x0804, 0xd193, 0x6007, 0x003a, 0x6003, 0x0001, 0x2009,
-	0x8020, 0x080c, 0x832e, 0x00c6, 0x2d60, 0x6100, 0x9186, 0x0002,
-	0x0120, 0x9186, 0x0004, 0x1904, 0xd24f, 0x6814, 0x2048, 0xa97c,
+	0x00de, 0x009e, 0x0804, 0xd2fa, 0xd0b4, 0x0128, 0xd0fc, 0x090c,
+	0x0d65, 0x0804, 0xd31b, 0x6007, 0x003a, 0x6003, 0x0001, 0x2009,
+	0x8020, 0x080c, 0x84a9, 0x00c6, 0x2d60, 0x6100, 0x9186, 0x0002,
+	0x0120, 0x9186, 0x0004, 0x1904, 0xd3d7, 0x6814, 0x2048, 0xa97c,
 	0xc1f4, 0xc1dc, 0xa97e, 0xa980, 0xc1fc, 0xc1bc, 0xa982, 0x00f6,
-	0x2c78, 0x080c, 0x1646, 0x00fe, 0x2009, 0x0042, 0x04d0, 0x0036,
-	0x080c, 0x1023, 0x090c, 0x0d65, 0xa867, 0x010d, 0x9006, 0xa802,
+	0x2c78, 0x080c, 0x164f, 0x00fe, 0x2009, 0x0042, 0x04d0, 0x0036,
+	0x080c, 0x1022, 0x090c, 0x0d65, 0xa867, 0x010d, 0x9006, 0xa802,
 	0xa86a, 0xa88a, 0x2d18, 0xab8e, 0xa887, 0x0045, 0x2c00, 0xa892,
 	0x6038, 0xa8a2, 0x2360, 0x6024, 0xc0dd, 0x6026, 0x6010, 0x00b6,
 	0x2058, 0xb8a0, 0x00be, 0x2004, 0x635c, 0xab7a, 0xa876, 0x9006,
-	0xa87e, 0xa882, 0xad9a, 0xae96, 0xa89f, 0x0001, 0x080c, 0x683f,
-	0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xcc56, 0x2d00, 0x600a,
+	0xa87e, 0xa882, 0xad9a, 0xae96, 0xa89f, 0x0001, 0x080c, 0x698f,
+	0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xcdd9, 0x2d00, 0x600a,
 	0x6023, 0x0006, 0x6003, 0x0007, 0x901e, 0x631a, 0x634a, 0x003e,
-	0x0038, 0x604b, 0x0000, 0x6003, 0x0007, 0x080c, 0xca9d, 0x00ce,
+	0x0038, 0x604b, 0x0000, 0x6003, 0x0007, 0x080c, 0xcc1b, 0x00ce,
 	0x00de, 0x009e, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, 0x9082,
-	0x0085, 0x2008, 0x00c2, 0x9186, 0x0027, 0x1178, 0x080c, 0x86d1,
-	0x0036, 0x0096, 0x6014, 0x2048, 0x2019, 0x0004, 0x080c, 0xd079,
-	0x009e, 0x003e, 0x080c, 0x8793, 0x0005, 0x9186, 0x0014, 0x0d70,
-	0x080c, 0x9b20, 0x0005, 0xd282, 0xd280, 0xd280, 0xd280, 0xd280,
-	0xd280, 0xd282, 0xd280, 0xd280, 0xd280, 0xd280, 0xd280, 0xd280,
-	0x080c, 0x0d65, 0x6003, 0x000c, 0x080c, 0x8793, 0x0005, 0x9182,
-	0x0092, 0x1220, 0x9182, 0x0085, 0x0208, 0x001a, 0x080c, 0x9b20,
-	0x0005, 0xd29e, 0xd29e, 0xd29e, 0xd29e, 0xd2a0, 0xd2c0, 0xd29e,
-	0xd29e, 0xd29e, 0xd29e, 0xd29e, 0xd29e, 0xd29e, 0x080c, 0x0d65,
-	0x00d6, 0x2c68, 0x080c, 0x9a0f, 0x01b0, 0x6003, 0x0001, 0x6007,
+	0x0085, 0x2008, 0x00c2, 0x9186, 0x0027, 0x1178, 0x080c, 0x884c,
+	0x0036, 0x0096, 0x6014, 0x2048, 0x2019, 0x0004, 0x080c, 0xd1fc,
+	0x009e, 0x003e, 0x080c, 0x890e, 0x0005, 0x9186, 0x0014, 0x0d70,
+	0x080c, 0x9c87, 0x0005, 0xd40a, 0xd408, 0xd408, 0xd408, 0xd408,
+	0xd408, 0xd40a, 0xd408, 0xd408, 0xd408, 0xd408, 0xd408, 0xd408,
+	0x080c, 0x0d65, 0x6003, 0x000c, 0x080c, 0x890e, 0x0005, 0x9182,
+	0x0092, 0x1220, 0x9182, 0x0085, 0x0208, 0x001a, 0x080c, 0x9c87,
+	0x0005, 0xd426, 0xd426, 0xd426, 0xd426, 0xd428, 0xd448, 0xd426,
+	0xd426, 0xd426, 0xd426, 0xd426, 0xd426, 0xd426, 0x080c, 0x0d65,
+	0x00d6, 0x2c68, 0x080c, 0x9b76, 0x01b0, 0x6003, 0x0001, 0x6007,
 	0x001e, 0x2009, 0x026e, 0x210c, 0x613a, 0x2009, 0x026f, 0x210c,
 	0x613e, 0x600b, 0xffff, 0x6910, 0x6112, 0x6023, 0x0004, 0x2009,
-	0x8020, 0x080c, 0x832e, 0x2d60, 0x080c, 0x9a65, 0x00de, 0x0005,
-	0x080c, 0x9a65, 0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800,
+	0x8020, 0x080c, 0x84a9, 0x2d60, 0x080c, 0x9bcc, 0x00de, 0x0005,
+	0x080c, 0x9bcc, 0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800,
 	0x00be, 0xd0ec, 0x00ee, 0x0005, 0x2009, 0x1873, 0x210c, 0xd1ec,
 	0x05b0, 0x6003, 0x0002, 0x6024, 0xc0e5, 0x6026, 0xd0cc, 0x0150,
-	0x2001, 0x1957, 0x2004, 0x604a, 0x2009, 0x1873, 0x210c, 0xd1f4,
+	0x2001, 0x1959, 0x2004, 0x604a, 0x2009, 0x1873, 0x210c, 0xd1f4,
 	0x1520, 0x00a0, 0x2009, 0x1873, 0x210c, 0xd1f4, 0x0128, 0x6024,
-	0xc0e4, 0x6026, 0x9006, 0x00d8, 0x2001, 0x1957, 0x200c, 0x2001,
-	0x1955, 0x2004, 0x9100, 0x9080, 0x000a, 0x604a, 0x6010, 0x00b6,
+	0xc0e4, 0x6026, 0x9006, 0x00d8, 0x2001, 0x1959, 0x200c, 0x2001,
+	0x1957, 0x2004, 0x9100, 0x9080, 0x000a, 0x604a, 0x6010, 0x00b6,
 	0x2058, 0xb8ac, 0x00be, 0x0008, 0x2104, 0x9005, 0x0118, 0x9088,
 	0x0003, 0x0cd0, 0x2c0a, 0x600f, 0x0000, 0x9085, 0x0001, 0x0005,
 	0x0016, 0x00c6, 0x00e6, 0x615c, 0xb8ac, 0x2060, 0x8cff, 0x0180,
 	0x84ff, 0x1118, 0x605c, 0x9106, 0x1138, 0x600c, 0x2072, 0x080c,
-	0x821d, 0x080c, 0x9a65, 0x0010, 0x9cf0, 0x0003, 0x2e64, 0x0c70,
+	0x8398, 0x080c, 0x9bcc, 0x0010, 0x9cf0, 0x0003, 0x2e64, 0x0c70,
 	0x00ee, 0x00ce, 0x001e, 0x0005, 0x00d6, 0x00b6, 0x6010, 0x2058,
 	0xb8ac, 0x2068, 0x9005, 0x0130, 0x9c06, 0x0110, 0x680c, 0x0cd0,
 	0x600c, 0x680e, 0x00be, 0x00de, 0x0005, 0x0026, 0x0036, 0x0156,
 	0x2011, 0x182b, 0x2204, 0x9084, 0x00ff, 0x2019, 0x026e, 0x2334,
 	0x9636, 0x1508, 0x8318, 0x2334, 0x2204, 0x9084, 0xff00, 0x9636,
 	0x11d0, 0x2011, 0x0270, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048,
-	0x2019, 0x000a, 0x080c, 0xaa5d, 0x009e, 0x1168, 0x2011, 0x0274,
+	0x2019, 0x000a, 0x080c, 0xabc4, 0x009e, 0x1168, 0x2011, 0x0274,
 	0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x0006, 0x080c,
-	0xaa5d, 0x009e, 0x1100, 0x015e, 0x003e, 0x002e, 0x0005, 0x00e6,
-	0x2071, 0x1800, 0x080c, 0x5b75, 0x080c, 0x2d99, 0x00ee, 0x0005,
+	0xabc4, 0x009e, 0x1100, 0x015e, 0x003e, 0x002e, 0x0005, 0x00e6,
+	0x2071, 0x1800, 0x080c, 0x5c68, 0x080c, 0x2ddb, 0x00ee, 0x0005,
 	0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0fc, 0x0108,
 	0x0011, 0x00ee, 0x0005, 0xa880, 0xc0e5, 0xa882, 0x0005, 0x00e6,
 	0x00d6, 0x00c6, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0016,
-	0x0126, 0x2091, 0x8000, 0x2029, 0x19c2, 0x252c, 0x2021, 0x19c9,
+	0x0126, 0x2091, 0x8000, 0x2029, 0x19c4, 0x252c, 0x2021, 0x19cb,
 	0x2424, 0x2061, 0x1ddc, 0x2071, 0x1800, 0x7650, 0x7070, 0x9606,
 	0x0578, 0x6720, 0x9786, 0x0001, 0x0118, 0x9786, 0x0008, 0x1500,
-	0x2500, 0x9c06, 0x01e8, 0x2400, 0x9c06, 0x01d0, 0x080c, 0xd0fa,
-	0x01b8, 0x080c, 0xd10a, 0x11a0, 0x6000, 0x9086, 0x0004, 0x1120,
-	0x0016, 0x080c, 0x18f4, 0x001e, 0x080c, 0xb8c2, 0x1110, 0x080c,
-	0x2ff2, 0x080c, 0xb8d3, 0x1110, 0x080c, 0xa40d, 0x080c, 0x9a9f,
+	0x2500, 0x9c06, 0x01e8, 0x2400, 0x9c06, 0x01d0, 0x080c, 0xd282,
+	0x01b8, 0x080c, 0xd292, 0x11a0, 0x6000, 0x9086, 0x0004, 0x1120,
+	0x0016, 0x080c, 0x1914, 0x001e, 0x080c, 0xba30, 0x1110, 0x080c,
+	0x3034, 0x080c, 0xba41, 0x1110, 0x080c, 0xa574, 0x080c, 0x9c06,
 	0x9ce0, 0x001c, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1208, 0x0858,
 	0x012e, 0x001e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x00ce,
 	0x00de, 0x00ee, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0dc, 0x0005,
 	0x0006, 0x2001, 0x1836, 0x2004, 0xd09c, 0x000e, 0x0005, 0x0006,
-	0x0036, 0x0046, 0x080c, 0xbdd7, 0x0168, 0x2019, 0xffff, 0x9005,
+	0x0036, 0x0046, 0x080c, 0xbf46, 0x0168, 0x2019, 0xffff, 0x9005,
 	0x0128, 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0004,
-	0x080c, 0x4998, 0x004e, 0x003e, 0x000e, 0x6004, 0x9086, 0x0001,
-	0x1128, 0x080c, 0x9372, 0x080c, 0x9a9f, 0x9006, 0x0005, 0x0126,
-	0x0006, 0x00e6, 0x0016, 0x2091, 0x8000, 0x2071, 0x1840, 0xd5a4,
-	0x0118, 0x7034, 0x8000, 0x7036, 0xd5b4, 0x0118, 0x7030, 0x8000,
-	0x7032, 0xd5ac, 0x0178, 0x2500, 0x9084, 0x0007, 0x908e, 0x0003,
-	0x0148, 0x908e, 0x0004, 0x0130, 0x908e, 0x0005, 0x0118, 0x2071,
-	0x184a, 0x0089, 0x001e, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0126,
-	0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0x1842, 0x0021, 0x00ee,
-	0x000e, 0x012e, 0x0005, 0x2e04, 0x8000, 0x2072, 0x1220, 0x8e70,
-	0x2e04, 0x8000, 0x2072, 0x0005, 0x00e6, 0x2071, 0x1840, 0x0c99,
-	0x00ee, 0x0005, 0x00e6, 0x2071, 0x1844, 0x0c69, 0x00ee, 0x0005,
-	0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0x1840, 0x7044,
-	0x8000, 0x7046, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0001, 0x0002,
-	0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200,
-	0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0x931a
+	0x080c, 0x4a6e, 0x004e, 0x003e, 0x000e, 0x6004, 0x9086, 0x0001,
+	0x1128, 0x080c, 0x94d9, 0x080c, 0x9c06, 0x9006, 0x0005, 0x00e6,
+	0x00c6, 0x00b6, 0x0046, 0x2061, 0x1ddc, 0x2071, 0x1800, 0x7450,
+	0x7070, 0x8001, 0x9402, 0x12b8, 0x2100, 0x9c06, 0x0148, 0x6000,
+	0x9086, 0x0000, 0x0128, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x0140,
+	0x9ce0, 0x001c, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1220, 0x0c60,
+	0x9085, 0x0001, 0x0008, 0x9006, 0x004e, 0x00be, 0x00ce, 0x00ee,
+	0x0005, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091, 0x8000, 0x2071,
+	0x1840, 0xd5a4, 0x0118, 0x7034, 0x8000, 0x7036, 0xd5b4, 0x0118,
+	0x7030, 0x8000, 0x7032, 0xd5ac, 0x0178, 0x2500, 0x9084, 0x0007,
+	0x908e, 0x0003, 0x0148, 0x908e, 0x0004, 0x0130, 0x908e, 0x0005,
+	0x0118, 0x2071, 0x184a, 0x0089, 0x001e, 0x00ee, 0x000e, 0x012e,
+	0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0x1842,
+	0x0021, 0x00ee, 0x000e, 0x012e, 0x0005, 0x2e04, 0x8000, 0x2072,
+	0x1220, 0x8e70, 0x2e04, 0x8000, 0x2072, 0x0005, 0x00e6, 0x2071,
+	0x1840, 0x0c99, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1844, 0x0c69,
+	0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071,
+	0x1840, 0x7044, 0x8000, 0x7046, 0x00ee, 0x000e, 0x012e, 0x0005,
+	0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
+	0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000,
+	0x7c76
 };
 #ifdef UNIQUE_FW_NAME
-unsigned short fw2322flx_length01 = 0xcc67;
+unsigned short fw2322flx_length01 = 0xce19;
 #else
-unsigned short risc_code_length01 = 0xcc67;
+unsigned short risc_code_length01 = 0xce19;
 #endif
 
 /*
--- diff/drivers/scsi/qla2xxx/qla_dbg.c	2004-02-18 08:54:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/qla_dbg.c	2004-04-21 10:45:34.890399352 +0100
@@ -2,7 +2,7 @@
  *                  QLOGIC LINUX SOFTWARE
  *
  * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation
+ * Copyright (C) 2003-2004 QLogic Corporation
  * (www.qlogic.com)
  *
  * This program is free software; you can redistribute it and/or modify it
--- diff/drivers/scsi/qla2xxx/qla_dbg.h	2004-02-18 08:54:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/qla_dbg.h	2004-04-21 10:45:34.890399352 +0100
@@ -2,7 +2,7 @@
  *                  QLOGIC LINUX SOFTWARE
  *
  * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation
+ * Copyright (C) 2003-2004 QLogic Corporation
  * (www.qlogic.com)
  *
  * This program is free software; you can redistribute it and/or modify it
--- diff/drivers/scsi/qla2xxx/qla_def.h	2004-02-18 08:54:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/qla_def.h	2004-04-21 10:45:34.891399200 +0100
@@ -2,7 +2,7 @@
 *                  QLOGIC LINUX SOFTWARE
 *
 * QLogic ISP2x00 device driver for Linux 2.6.x
-* Copyright (C) 2003 QLogic Corporation
+* Copyright (C) 2003-2004 QLogic Corporation
 * (www.qlogic.com)
 *
 * This program is free software; you can redistribute it and/or modify it
@@ -209,7 +209,7 @@
 #define MAX_OUTSTANDING_COMMANDS	1024
 
 /* ISP request and response entry counts (37-65535) */
-#define REQUEST_ENTRY_CNT		1024	/* Number of request entries. */
+#define REQUEST_ENTRY_CNT		2048	/* Number of request entries. */
 #define RESPONSE_ENTRY_CNT_2100		64	/* Number of response entries.*/
 #define RESPONSE_ENTRY_CNT_2300		512	/* Number of response entries.*/
 
@@ -265,6 +265,14 @@ typedef struct srb {
 	/* Raw completion info for use by failover ? */
 	uint8_t	fo_retry_cnt;		/* Retry count this request */
 	uint8_t	err_id;			/* error id */
+#define SRB_ERR_PORT	1		/* Request failed -- "port down" */
+#define SRB_ERR_LOOP	2		/* Request failed -- "loop down" */
+#define SRB_ERR_DEVICE	3		/* Request failed -- "device error" */
+#define SRB_ERR_OTHER	4
+
+	/* Segment/entries counts */
+	uint16_t	req_cnt;	/* !0 indicates counts determined */
+	uint16_t	tot_dsds;
 
 	/* SRB magic number */
 	uint16_t magic;
@@ -1518,7 +1526,7 @@ typedef struct {
 /*
  * Inquiry command structure.
  */
-#define INQ_DATA_SIZE	8
+#define INQ_DATA_SIZE	36
 
 /*
  * Inquiry mailbox IOCB packet definition.
@@ -1572,7 +1580,7 @@ typedef struct {
 typedef struct os_tgt {
 	struct os_lun *olun[MAX_LUNS]; /* LUN context pointer. */
 	struct fc_port *fcport;
-	uint32_t flags;
+	unsigned long flags;
 	uint8_t port_down_retry_count;
     	uint32_t down_timer;
 	struct scsi_qla_host *ha;
@@ -1586,10 +1594,9 @@ typedef struct os_tgt {
 /*
  * SCSI Target Queue flags
  */
-#define TQF_QUEUE_SUSPENDED	BIT_0		/* Queue suspended. */
-#define TQF_BOOT_DEVICE		BIT_1		/* Boot device. */
-#define TQF_ONLINE		BIT_2		/* Device online to OS. */
-#define TQF_TGT_RST_NEEDED	BIT_3
+#define TQF_ONLINE		0		/* Device online to OS. */
+#define TQF_SUSPENDED		1
+#define TQF_RETRY_CMDS		2
 
 /*
  * SCSI LUN Queue structure
@@ -1715,6 +1722,12 @@ typedef struct fc_port {
 #define FCF_RLC_SUPPORT		BIT_14
 #define FCF_CONFIG		BIT_15	/* Needed? */
 #define FCF_RESCAN_NEEDED	BIT_16
+#define FCF_XP_DEVICE		BIT_17
+#define FCF_MSA_DEVICE		BIT_18
+#define FCF_EVA_DEVICE		BIT_19
+#define FCF_MSA_PORT_ACTIVE	BIT_20
+#define FCF_FAILBACK_DISABLE	BIT_21
+#define FCF_FAILOVER_DISABLE	BIT_22
 
 /* No loop ID flag. */
 #define FC_NO_LOOP_ID		0x1000
@@ -1730,9 +1743,13 @@ typedef struct fc_lun {
 	uint16_t lun;
 	atomic_t state;
 	uint8_t device_type;
+
 	uint8_t max_path_retries;
+	uint32_t flags;
 } fc_lun_t;
 
+#define	FLF_VISIBLE_LUN		BIT_0
+#define	FLF_ACTIVE_LUN		BIT_1
 
 /*
  * FC-CT interface
@@ -2071,6 +2088,7 @@ typedef struct scsi_qla_host {
 #define ISP_ABORT_RETRY         20      /* ISP aborted. */
 #define FCPORT_RESCAN_NEEDED	21      /* IO descriptor processing needed */
 #define IODESC_PROCESS_NEEDED	22      /* IO descriptor processing needed */
+#define IOCTL_ERROR_RECOVERY	23      
 
 	uint32_t	device_flags;
 #define DFLG_LOCAL_DEVICES		BIT_0
@@ -2287,6 +2305,7 @@ typedef struct scsi_qla_host {
 	uint32_t failback_delay;
 	unsigned long   cfg_flags;
 #define	CFG_ACTIVE	0	/* CFG during a failover, event update, or ioctl */
+#define	CFG_FAILOVER	1	/* CFG during path change */
 
 	uint32_t	binding_type;
 #define BIND_BY_PORT_NAME	0
@@ -2319,7 +2338,6 @@ typedef struct scsi_qla_host {
 #define BINZERO		"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
 	char		*model_desc;
 
-/* following are new and needed for IOCTL support */
 	uint8_t     node_name[WWN_SIZE];
 	uint8_t     nvram_version; 
 	uint8_t     optrom_major; 
--- diff/drivers/scsi/qla2xxx/qla_devtbl.h	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/qla_devtbl.h	2004-04-21 10:45:34.892399048 +0100
@@ -1,4 +1,4 @@
-#define QLA_MODEL_NAMES         0x1B
+#define QLA_MODEL_NAMES         0x21
 
 /*
  * Adapter model names.
@@ -31,6 +31,12 @@ char	*qla2x00_model_name[QLA_MODEL_NAMES
 	" ",		/* 0x118 */
 	"QLA200",	/* 0x119 */
 	"QLA200C"	/* 0x11A */
+	"QLA200P"	/* 0x11B */
+	"QLA200P"	/* 0x11C */
+	"QLA4040"	/* 0x11D */
+	"QLA4040"	/* 0x11E */
+	"QLA4040C"	/* 0x11F */
+	"QLA4040C"	/* 0x120 */
 };
 
 char	*qla2x00_model_desc[QLA_MODEL_NAMES] = {
@@ -61,5 +67,10 @@ char	*qla2x00_model_desc[QLA_MODEL_NAMES
 	" ",						/* 0x118 */
 	"133MHz PCI-X to 2Gb FC Optical",		/* 0x119 */
 	"133MHz PCI-X to 2Gb FC Copper"			/* 0x11A */
+	"133MHz PCI-X to 2Gb FC SFP"			/* 0x11B */
+	"133MHz PCI-X to 2Gb FC SFP"			/* 0x11C */
+	"Optical- 133MHz to 1Gb NIC with IPSEC",	/* 0x11D */
+	"Optical- 133MHz to 1Gb iSCSI with IPSEC",	/* 0x11E */
+	"Copper- 133MHz to 1Gb NIC with IPSEC",		/* 0x11F */
+	"Copper- 133MHz to 1Gb iSCSI with IPSEC",	/* 0x120 */
 };
-
--- diff/drivers/scsi/qla2xxx/qla_gbl.h	2004-02-18 08:54:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/qla_gbl.h	2004-04-21 10:45:34.892399048 +0100
@@ -2,7 +2,7 @@
 *                  QLOGIC LINUX SOFTWARE
 *
 * QLogic ISP2x00 device driver for Linux 2.6.x
-* Copyright (C) 2003 QLogic Corporation
+* Copyright (C) 2003-2004 QLogic Corporation
 * (www.qlogic.com)
 *
 * This program is free software; you can redistribute it and/or modify it
@@ -65,6 +65,7 @@ extern int ql2xmaxqdepth;
 extern int displayConfig;
 extern int ql2xplogiabsentdevice;
 extern int ql2xintrdelaytimer;
+extern int ql2xloginretrycount;
 
 extern int ConfigRequired;
 
@@ -78,6 +79,8 @@ extern rwlock_t qla_hostlist_lock;
 
 extern char *qla2x00_get_fw_version_str(struct scsi_qla_host *, char *);
 
+extern void qla2x00_cmd_timeout(srb_t *);
+
 extern int qla2x00_queuecommand(struct scsi_cmnd *,
     void (*)(struct scsi_cmnd *));
 
@@ -195,7 +198,7 @@ extern int
 qla2x00_get_port_name(scsi_qla_host_t *, uint16_t, uint8_t *, uint8_t);
 
 extern uint8_t
-qla2x00_get_link_status(scsi_qla_host_t *, uint8_t, void *, uint16_t *);
+qla2x00_get_link_status(scsi_qla_host_t *, uint8_t, link_stat_t *, uint16_t *);
 
 extern int
 qla2x00_lip_reset(scsi_qla_host_t *);
@@ -295,16 +298,8 @@ extern void qla2x00_cancel_io_descriptor
 /*
  * Global Function Prototypes in qla_xioctl.c source file.
  */
-#ifdef CONFIG_SCSI_QLA2XXX_IOCTL
-extern void qla2x00_enqueue_aen(scsi_qla_host_t *, uint16_t, void *);
-extern int qla2x00_alloc_ioctl_mem(scsi_qla_host_t *);
-extern void qla2x00_free_ioctl_mem(scsi_qla_host_t *);
-extern int qla2x00_get_ioctl_scrap_mem(scsi_qla_host_t *, void **, uint32_t);
-extern void qla2x00_free_ioctl_scrap_mem(scsi_qla_host_t *);
-#else
 #define qla2x00_enqueue_aen(ha, cmd, mode)	do { } while (0)
 #define qla2x00_alloc_ioctl_mem(ha)		(0)
 #define qla2x00_free_ioctl_mem(ha)		do { } while (0)
-#endif
 
 #endif /* _QLA_GBL_H */
--- diff/drivers/scsi/qla2xxx/qla_gs.c	2004-02-18 08:54:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/qla_gs.c	2004-04-21 10:45:34.893398896 +0100
@@ -2,7 +2,7 @@
  *                  QLOGIC LINUX SOFTWARE
  *
  * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation
+ * Copyright (C) 2003-2004 QLogic Corporation
  * (www.qlogic.com)
  *
  * This program is free software; you can redistribute it and/or modify it
--- diff/drivers/scsi/qla2xxx/qla_init.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/scsi/qla2xxx/qla_init.c	2004-04-21 10:45:34.895398592 +0100
@@ -2,7 +2,7 @@
  *                  QLOGIC LINUX SOFTWARE
  *
  * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation
+ * Copyright (C) 2003-2004 QLogic Corporation
  * (www.qlogic.com)
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -603,7 +603,10 @@ qla2x00_chip_diag(scsi_qla_host_t *ha)
 	ha->product_id[3] = mb[4];
 
 	/* Adjust fw RISC transfer size */
-	ha->fw_transfer_size = REQUEST_ENTRY_SIZE * REQUEST_ENTRY_CNT;
+	if (REQUEST_ENTRY_CNT > 1024)
+		ha->fw_transfer_size = REQUEST_ENTRY_SIZE * 1024;
+	else
+		ha->fw_transfer_size = REQUEST_ENTRY_SIZE * REQUEST_ENTRY_CNT;
 
 	if (IS_QLA2200(ha) &&
 	    RD_MAILBOX_REG(ha, reg, 7) == QLA2200A_RISC_ROM_VER) {
@@ -1360,6 +1363,8 @@ qla2x00_nvram_config(scsi_qla_host_t *ha
 		ha->login_retry_count = ha->port_down_retry_count;
 	else if (ha->port_down_retry_count > (int)ha->login_retry_count)
 		ha->login_retry_count = ha->port_down_retry_count;
+	if (ql2xloginretrycount)
+		ha->login_retry_count = ql2xloginretrycount;
 
 	ha->binding_type = Bind;
 	if (ha->binding_type != BIND_BY_PORT_NAME &&
@@ -1492,7 +1497,7 @@ qla2x00_configure_loop(scsi_qla_host_t *
 {
 	int  rval;
 	uint8_t  rval1 = 0;
-	static unsigned long  flags, save_flags;
+	unsigned long flags, save_flags;
 
 	rval = QLA_SUCCESS;
 
@@ -1592,6 +1597,14 @@ qla2x00_configure_loop(scsi_qla_host_t *
 		DEBUG3(printk("%s: exiting normally\n", __func__));
 	}
 
+	/* Restore state if a resync event occured during processing */
+	if (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) {
+		if (test_bit(LOCAL_LOOP_UPDATE, &save_flags))
+			set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags);
+		if (test_bit(RSCN_UPDATE, &save_flags))
+			set_bit(RSCN_UPDATE, &ha->dpc_flags);
+	}
+
 	return (rval);
 }
 
@@ -1800,6 +1813,20 @@ cleanup_allocation:
 	return (rval);
 }
 
+static void
+qla2x00_probe_for_all_luns(scsi_qla_host_t *ha) 
+{
+	fc_port_t	*fcport;
+
+	qla2x00_mark_all_devices_lost(ha); 
+ 	list_for_each_entry(fcport, &ha->fcports, list) {
+		if (fcport->port_type != FCT_TARGET)
+			continue;
+
+		qla2x00_update_fcport(ha, fcport); 
+	}
+}
+
 /*
  * qla2x00_update_fcport
  *	Updates device on list.
@@ -2100,6 +2127,7 @@ qla2x00_cfg_lun(scsi_qla_host_t *ha, fc_
 	case TYPE_MEDIUM_CHANGER:
 	case TYPE_ENCLOSURE:
 	case 0x20:
+	case 0x0C:
 		break;
 	case TYPE_TAPE:
 		fcport->flags |= FCF_TAPE_PRESENT;
@@ -3172,7 +3200,6 @@ qla2x00_restart_queues(scsi_qla_host_t *
 		qla2x00_done(ha);
 }
 
-//FIXME - Document
 void
 qla2x00_rescan_fcports(scsi_qla_host_t *ha)
 {
@@ -3189,10 +3216,12 @@ qla2x00_rescan_fcports(scsi_qla_host_t *
 
 		rescan_done = 1;
 	}
+	qla2x00_probe_for_all_luns(ha); 
 
 	/* Update OS target and lun structures if necessary. */
-	if (rescan_done)
+	if (rescan_done) {
 		qla2x00_config_os(ha);
+	}
 }
 
 
@@ -3219,7 +3248,7 @@ qla2x00_config_os(scsi_qla_host_t *ha) 
 		if ((tq = TGT_Q(ha, tgt)) == NULL)
 			continue;
 
-		tq->flags &= ~TQF_ONLINE;
+		clear_bit(TQF_ONLINE, &tq->flags);
 	}
 
 	list_for_each_entry(fcport, &ha->fcports, list) {
@@ -3321,7 +3350,7 @@ qla2x00_fcport_bind(scsi_qla_host_t *ha,
 		fcport->tgt_queue = tq;
 		fcport->flags |= FCF_PERSISTENT_BOUND;
 		tq->fcport = fcport;
-		tq->flags |= TQF_ONLINE;
+		set_bit(TQF_ONLINE, &tq->flags);
 		tq->port_down_retry_count = ha->port_down_retry_count;
 
 #if 0
--- diff/drivers/scsi/qla2xxx/qla_inline.h	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/qla_inline.h	2004-04-21 10:45:34.895398592 +0100
@@ -2,7 +2,7 @@
  *                  QLOGIC LINUX SOFTWARE
  *
  * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation
+ * Copyright (C) 2003-2004 QLogic Corporation
  * (www.qlogic.com)
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -240,3 +240,52 @@ qla2x00_issue_marker(scsi_qla_host_t *ha
 	}
 	return (QLA_SUCCESS);
 }
+
+static __inline__ void qla2x00_add_timer_to_cmd(srb_t *, int);
+static __inline__ void qla2x00_delete_timer_from_cmd(srb_t *);
+
+/**************************************************************************
+*   qla2x00_add_timer_to_cmd
+*
+* Description:
+*       Creates a timer for the specified command. The timeout is usually
+*       the command time from kernel minus 2 secs.
+*
+* Input:
+*     sp - pointer to validate
+*
+* Returns:
+*     None.
+**************************************************************************/
+static inline void
+qla2x00_add_timer_to_cmd(srb_t *sp, int timeout)
+{
+	init_timer(&sp->timer);
+	sp->timer.expires = jiffies + timeout * HZ;
+	sp->timer.data = (unsigned long) sp;
+	sp->timer.function = (void (*) (unsigned long))qla2x00_cmd_timeout;
+	add_timer(&sp->timer);
+}
+
+/**************************************************************************
+*   qla2x00_delete_timer_from_cmd
+*
+* Description:
+*       Delete the timer for the specified command.
+*
+* Input:
+*     sp - pointer to validate
+*
+* Returns:
+*     None.
+**************************************************************************/
+static inline void 
+qla2x00_delete_timer_from_cmd(srb_t *sp)
+{
+	if (sp->timer.function != NULL) {
+		del_timer(&sp->timer);
+		sp->timer.function =  NULL;
+		sp->timer.data = (unsigned long) NULL;
+	}
+}
+
--- diff/drivers/scsi/qla2xxx/qla_iocb.c	2004-02-18 08:54:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/qla_iocb.c	2004-04-21 10:45:34.896398440 +0100
@@ -2,7 +2,7 @@
  *                  QLOGIC LINUX SOFTWARE
  *
  * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation
+ * Copyright (C) 2003-2004 QLogic Corporation
  * (www.qlogic.com)
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -350,7 +350,7 @@ qla2x00_start_scsi(srb_t *sp)
 	uint32_t	*clr_ptr;
 	uint32_t        index;
 	uint32_t	handle;
-	uint16_t	cnt, tot_dsds, req_cnt;
+	uint16_t	cnt;
 	cmd_entry_t	*cmd_pkt;
 	uint32_t        timeout;
 	struct scatterlist *sg;
@@ -372,21 +372,23 @@ qla2x00_start_scsi(srb_t *sp)
 		ha->marker_needed = 0;
 	}
 
-	/* Calculate number of segments and entries required */
-	tot_dsds = 0;
-	if (cmd->use_sg) {
-		sg = (struct scatterlist *) cmd->request_buffer;
-		tot_dsds = pci_map_sg(ha->pdev, sg, cmd->use_sg,
-		    cmd->sc_data_direction);
-	} else if (cmd->request_bufflen) {   /* Single segment transfer */
-		tot_dsds++;
+	/* Calculate number of segments and entries required. */
+	if (sp->req_cnt == 0) {
+		sp->tot_dsds = 0;
+		if (cmd->use_sg) {
+			sg = (struct scatterlist *) cmd->request_buffer;
+			sp->tot_dsds = pci_map_sg(ha->pdev, sg, cmd->use_sg,
+			    cmd->sc_data_direction);
+		} else if (cmd->request_bufflen) {
+		    sp->tot_dsds++;
+		}
+		sp->req_cnt = (ha->calc_request_entries)(sp->tot_dsds);
 	}
-	req_cnt = (ha->calc_request_entries)(tot_dsds);
 
 	/* Acquire ring specific lock */
 	spin_lock_irqsave(&ha->hardware_lock, flags);
 
-	if (ha->req_q_cnt < (req_cnt + 2)) {
+	if (ha->req_q_cnt < (sp->req_cnt + 2)) {
 		/* Calculate number of free request entries */
 		cnt = RD_REG_WORD(ISP_REQ_Q_OUT(ha, reg));
 		if (ha->req_ring_index < cnt)
@@ -397,10 +399,11 @@ qla2x00_start_scsi(srb_t *sp)
 	}
 
 	/* If no room for request in request ring */
-	if (ha->req_q_cnt < (req_cnt + 2)) {
+	if (ha->req_q_cnt < (sp->req_cnt + 2)) {
 		DEBUG5(printk("scsi(%ld): in-ptr=%x req_q_cnt=%x "
 		    "tot_dsds=%x.\n",
-		    ha->host_no, ha->req_ring_index, ha->req_q_cnt, tot_dsds));
+		    ha->host_no, ha->req_ring_index, ha->req_q_cnt,
+		    sp->tot_dsds));
 
 		goto queuing_error;
 	}
@@ -427,14 +430,14 @@ qla2x00_start_scsi(srb_t *sp)
 	ha->outstanding_cmds[handle] = sp;
 	sp->ha = ha;
 	sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle;
-	ha->req_q_cnt -= req_cnt;
+	ha->req_q_cnt -= sp->req_cnt;
 
 	cmd_pkt = (cmd_entry_t *)ha->request_ring_ptr;
 	cmd_pkt->handle = handle;
 	/* Zero out remaining portion of packet. */
 	clr_ptr = (uint32_t *)cmd_pkt + 2;
 	memset(clr_ptr, 0, REQUEST_ENTRY_SIZE - 8);
-	cmd_pkt->dseg_count = cpu_to_le16(tot_dsds);
+	cmd_pkt->dseg_count = cpu_to_le16(sp->tot_dsds);
 
 	/* Set target ID */
 	SET_TARGET_ID(ha, cmd_pkt->target, fclun->fcport->loop_id);
@@ -474,10 +477,10 @@ qla2x00_start_scsi(srb_t *sp)
 	cmd_pkt->byte_count = cpu_to_le32((uint32_t)cmd->request_bufflen);
 
 	/* Build IOCB segments */
-	(ha->build_scsi_iocbs)(sp, cmd_pkt, tot_dsds);
+	(ha->build_scsi_iocbs)(sp, cmd_pkt, sp->tot_dsds);
 
 	/* Set total data segment count. */
-	cmd_pkt->entry_count = (uint8_t)req_cnt;
+	cmd_pkt->entry_count = (uint8_t)sp->req_cnt;
 
 	/* Adjust ring index. */
 	ha->req_ring_index++;
@@ -504,9 +507,6 @@ qla2x00_start_scsi(srb_t *sp)
 queuing_error:
 	spin_unlock_irqrestore(&ha->hardware_lock, flags);
 
-	if (cmd->use_sg)
-		pci_unmap_sg(ha->pdev, sg, cmd->use_sg, cmd->sc_data_direction);
-
 	return (QLA_FUNCTION_FAILED);
 }
 
--- diff/drivers/scsi/qla2xxx/qla_isr.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/scsi/qla2xxx/qla_isr.c	2004-04-21 10:45:34.897398288 +0100
@@ -2,7 +2,7 @@
  *                  QLOGIC LINUX SOFTWARE
  *
  * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation
+ * Copyright (C) 2003-2004 QLogic Corporation
  * (www.qlogic.com)
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -452,6 +452,7 @@ qla2x00_async_event(scsi_qla_host_t *ha,
 		if (atomic_read(&ha->loop_state) != LOOP_DOWN) {
 			atomic_set(&ha->loop_state, LOOP_DOWN);
 			atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME);
+			ha->device_flags |= DFLG_NO_CABLE;
 			qla2x00_mark_all_devices_lost(ha);
 		}
 
@@ -1139,6 +1140,10 @@ qla2x00_status_entry(scsi_qla_host_t *ha
 		if ((sp->flags & SRB_IOCTL) ||
 		    atomic_read(&fcport->state) == FCS_DEVICE_DEAD) {
 			cp->result = DID_NO_CONNECT << 16;
+			if (atomic_read(&ha->loop_state) == LOOP_DOWN) 
+				sp->err_id = SRB_ERR_LOOP;
+			else
+				sp->err_id = SRB_ERR_PORT;
 			add_to_done_queue(ha, sp);
 		} else {
 			qla2x00_extend_timeout(cp, EXTEND_CMD_TIMEOUT);
--- diff/drivers/scsi/qla2xxx/qla_listops.h	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/qla_listops.h	2004-04-21 10:45:34.897398288 +0100
@@ -2,7 +2,7 @@
  *                  QLOGIC LINUX SOFTWARE
  *
  * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation
+ * Copyright (C) 2003-2004 QLogic Corporation
  * (www.qlogic.com)
  *
  * This program is free software; you can redistribute it and/or modify it
--- diff/drivers/scsi/qla2xxx/qla_mbx.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/scsi/qla2xxx/qla_mbx.c	2004-04-21 10:45:34.898398136 +0100
@@ -2,7 +2,7 @@
  *                  QLOGIC LINUX SOFTWARE
  *
  * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation
+ * Copyright (C) 2003-2004 QLogic Corporation
  * (www.qlogic.com)
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -1598,8 +1598,8 @@ qla2x00_get_port_name(scsi_qla_host_t *h
  *	BIT_1 = mailbox error.
  */
 uint8_t
-qla2x00_get_link_status(scsi_qla_host_t *ha, uint8_t loop_id, void *ret_buf,
-    uint16_t *status)
+qla2x00_get_link_status(scsi_qla_host_t *ha, uint8_t loop_id,
+    link_stat_t *ret_buf, uint16_t *status)
 {
 	int rval;
 	mbx_cmd_t mc;
@@ -1646,16 +1646,20 @@ qla2x00_get_link_status(scsi_qla_host_t 
 			status[0] = mcp->mb[0];
 			rval = BIT_1;
 		} else {
-			/* copy over data */
-			memcpy(ret_buf, stat_buf,sizeof(link_stat_t));
-			DEBUG(printk("qla2x00_get_link_status(%ld): stat dump: "
-			    "fail_cnt=%d loss_sync=%d loss_sig=%d seq_err=%d "
-			    "inval_xmt_word=%d inval_crc=%d.\n",
-			    ha->host_no,
-			    stat_buf->link_fail_cnt, stat_buf->loss_sync_cnt,
-			    stat_buf->loss_sig_cnt, stat_buf->prim_seq_err_cnt,
-			    stat_buf->inval_xmit_word_cnt,
-			    stat_buf->inval_crc_cnt);)
+			/* copy over data -- firmware data is LE. */
+			ret_buf->link_fail_cnt =
+			    le32_to_cpu(stat_buf->link_fail_cnt);
+			ret_buf->loss_sync_cnt =
+			    le32_to_cpu(stat_buf->loss_sync_cnt);
+			ret_buf->loss_sig_cnt =
+			    le32_to_cpu(stat_buf->loss_sig_cnt);
+			ret_buf->prim_seq_err_cnt =
+			    le32_to_cpu(stat_buf->prim_seq_err_cnt);
+			ret_buf->inval_xmit_word_cnt =
+			    le32_to_cpu(stat_buf->inval_xmit_word_cnt);
+			ret_buf->inval_crc_cnt =
+			    le32_to_cpu(stat_buf->inval_crc_cnt);
+
 			DEBUG11(printk("qla2x00_get_link_status(%ld): stat "
 			    "dump: fail_cnt=%d loss_sync=%d loss_sig=%d "
 			    "seq_err=%d inval_xmt_word=%d inval_crc=%d.\n",
@@ -1672,8 +1676,8 @@ qla2x00_get_link_status(scsi_qla_host_t 
 		rval = BIT_1;
 	}
 
-	pci_free_consistent(ha->pdev, sizeof(link_stat_t),
-	    stat_buf, phys_address);
+	pci_free_consistent(ha->pdev, sizeof(link_stat_t), stat_buf,
+	    phys_address);
 
 	return rval;
 }
--- diff/drivers/scsi/qla2xxx/qla_os.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/scsi/qla2xxx/qla_os.c	2004-04-21 10:45:34.901397680 +0100
@@ -2,7 +2,7 @@
  *                  QLOGIC LINUX SOFTWARE
  *
  * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation
+ * Copyright (C) 2003-2004 QLogic Corporation
  * (www.qlogic.com)
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -110,6 +110,11 @@ MODULE_PARM_DESC(ql2xdoinitscan,
 		"Signal mid-layer to perform scan after driver load: 0 -- no "
 		"signal sent to mid-layer.");
 
+int ql2xloginretrycount = 0;
+module_param(ql2xloginretrycount, int, 0);
+MODULE_PARM_DESC(ql2xloginretrycount,
+		"Specify an alternate value for the NVRAM login retry count.");
+
 /*
  * Proc structures and functions
  */
@@ -175,6 +180,8 @@ static struct scsi_host_template qla2x00
 	.max_sectors		= 0xFFFF,
 };
 
+static struct scsi_transport_template *qla2xxx_transport_template = NULL;
+
 static void qla2x00_display_fc_names(scsi_qla_host_t *);
 
 void qla2x00_blink_led(scsi_qla_host_t *);
@@ -216,55 +223,7 @@ qla2x00_stop_timer(scsi_qla_host_t *ha)
 	ha->timer_active = 0;
 }
 
-
-static void qla2x00_cmd_timeout(srb_t *sp);
-static __inline__ void qla2x00_add_timer_to_cmd(srb_t *sp, int timeout);
-static __inline__ void qla2x00_delete_timer_from_cmd(srb_t *sp);
-
-/**************************************************************************
-*   qla2x00_add_timer_to_cmd
-*
-* Description:
-*       Creates a timer for the specified command. The timeout is usually
-*       the command time from kernel minus 2 secs.
-*
-* Input:
-*     sp - pointer to validate
-*
-* Returns:
-*     None.
-**************************************************************************/
-static inline void
-qla2x00_add_timer_to_cmd(srb_t *sp, int timeout)
-{
-	init_timer(&sp->timer);
-	sp->timer.expires = jiffies + timeout * HZ;
-	sp->timer.data = (unsigned long) sp;
-	sp->timer.function = (void (*) (unsigned long))qla2x00_cmd_timeout;
-	add_timer(&sp->timer);
-}
-
-/**************************************************************************
-*   qla2x00_delete_timer_from_cmd
-*
-* Description:
-*       Delete the timer for the specified command.
-*
-* Input:
-*     sp - pointer to validate
-*
-* Returns:
-*     None.
-**************************************************************************/
-static inline void 
-qla2x00_delete_timer_from_cmd(srb_t *sp)
-{
-	if (sp->timer.function != NULL) {
-		del_timer(&sp->timer);
-		sp->timer.function =  NULL;
-		sp->timer.data = (unsigned long) NULL;
-	}
-}
+void qla2x00_cmd_timeout(srb_t *);
 
 static __inline__ void qla2x00_callback(scsi_qla_host_t *, struct scsi_cmnd *);
 static __inline__ void sp_put(struct scsi_qla_host * ha, srb_t *sp);
@@ -707,6 +666,7 @@ qla2x00_queuecommand(struct scsi_cmnd *c
 
 	host = cmd->device->host;
 	ha = (scsi_qla_host_t *) host->hostdata;
+	was_empty = 1;
 
 	cmd->scsi_done = fn;
 
@@ -736,6 +696,7 @@ qla2x00_queuecommand(struct scsi_cmnd *c
 	}
 
 	sp->fo_retry_cnt = 0;
+	sp->err_id = 0;
 
 	/* Generate LU queue on bus, target, LUN */
 	b = cmd->device->channel;
@@ -755,6 +716,7 @@ qla2x00_queuecommand(struct scsi_cmnd *c
 
 	if (l >= ha->max_luns) {
 		cmd->result = DID_NO_CONNECT << 16;
+		sp->err_id = SRB_ERR_PORT;
 
 		spin_lock_irq(ha->host->host_lock);
 
@@ -801,6 +763,7 @@ qla2x00_queuecommand(struct scsi_cmnd *c
 		    ha->host_no,t,l));
 
 		cmd->result = DID_NO_CONNECT << 16;
+		sp->err_id = SRB_ERR_PORT;
 
 		spin_lock_irq(ha->host->host_lock);
 
@@ -840,20 +803,29 @@ qla2x00_queuecommand(struct scsi_cmnd *c
 	 *	Either PORT_DOWN_TIMER OR LINK_DOWN_TIMER Expired.
 	 */
 	if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD ||
-	    atomic_read(&ha->loop_state) == LOOP_DEAD) {
+	    atomic_read(&ha2->loop_state) == LOOP_DEAD) {
 		/*
 		 * Add the command to the done-queue for later failover
 		 * processing
 		 */
 		cmd->result = DID_NO_CONNECT << 16;
+		if (atomic_read(&ha2->loop_state) == LOOP_DOWN) 
+			sp->err_id = SRB_ERR_LOOP;
+		else
+			sp->err_id = SRB_ERR_PORT;
+
 		add_to_done_queue(ha, sp);
-		if (!list_empty(&ha->done_queue))
-			qla2x00_done(ha);
+		qla2x00_done(ha);
 
 		spin_lock_irq(ha->host->host_lock);
 		return (0);
 	}
-	was_empty = add_to_pending_queue(ha, sp);
+	if (tq && test_bit(TQF_SUSPENDED, &tq->flags)) {
+		/* If target suspended put incoming I/O in retry_q. */
+		qla2x00_extend_timeout(sp->cmd, 10);
+		add_to_scsi_retry_queue(ha, sp);
+	} else
+		was_empty = add_to_pending_queue(ha, sp);
 
 	if ((IS_QLA2100(ha) || IS_QLA2200(ha)) && ha->flags.online) {
 		unsigned long flags;
@@ -1379,6 +1351,9 @@ qla2xxx_eh_device_reset(struct scsi_cmnd
 	os_tgt_t	*tq;
 	os_lun_t	*lq;
 	fc_port_t	*fcport_to_reset;
+	unsigned long	flags;
+	srb_t		*rp;
+	struct list_head *list, *temp;
 
 	return_status = FAILED;
 	if (cmd == NULL) {
@@ -1410,6 +1385,10 @@ qla2xxx_eh_device_reset(struct scsi_cmnd
 	}
 	fcport_to_reset = lq->fclun->fcport;
 
+	/* If we are coming in from the back-door, stall I/O until complete. */
+	if (!cmd->device->host->eh_active)
+		set_bit(TQF_SUSPENDED, &tq->flags);
+
 	qla_printk(KERN_INFO, ha,
 	    "scsi(%ld:%d:%d:%d): DEVICE RESET ISSUED.\n", ha->host_no, b, t, l);
 
@@ -1419,6 +1398,23 @@ qla2xxx_eh_device_reset(struct scsi_cmnd
 	    ha->host_no, cmd, jiffies, cmd->timeout_per_command / HZ,
 	    ha->dpc_flags, cmd->result, cmd->allowed, cmd->state));
 
+ 	/* Clear commands from the retry queue. */
+ 	spin_lock_irqsave(&ha->list_lock, flags);
+ 	list_for_each_safe(list, temp, &ha->retry_queue) {
+ 		rp = list_entry(list, srb_t, list);
+ 
+ 		if (t != rp->cmd->device->id) 
+ 			continue;
+ 
+ 		DEBUG2(printk(KERN_INFO
+		    "qla2xxx_eh_reset: found in retry queue. SP=%p\n", rp));
+ 
+ 		__del_from_retry_queue(ha, rp);
+ 		rp->cmd->result = DID_RESET << 16;
+ 		__add_to_done_queue(ha, rp);
+ 	}
+ 	spin_unlock_irqrestore(&ha->list_lock, flags);
+
 	spin_unlock_irq(ha->host->host_lock);
 
 	/* Blocking call-Does context switching if abort isp is active etc */  
@@ -1486,6 +1482,9 @@ qla2xxx_eh_device_reset(struct scsi_cmnd
 
 eh_dev_reset_done:
 
+	if (!cmd->device->host->eh_active)
+		clear_bit(TQF_SUSPENDED, &tq->flags);
+
 	return (return_status);
 }
 
@@ -1766,7 +1765,7 @@ qla2x00_device_reset(scsi_qla_host_t *ha
 }
 
 /**************************************************************************
-* qla2x00_slave_configure
+* qla2xxx_slave_configure
 *
 * Description:
 **************************************************************************/
@@ -2061,6 +2060,8 @@ int qla2x00_probe_one(struct pci_dev *pd
 	host->max_cmd_len = MAX_CMDSZ;
 	host->max_channel = ha->ports - 1;
 	host->max_lun = ha->max_luns;
+	BUG_ON(qla2xxx_transport_template == NULL);
+	host->transportt = qla2xxx_transport_template;
 	host->unique_id = ha->instance;
 	host->max_id = ha->max_targets;
 
@@ -2310,10 +2311,10 @@ qla2x00_proc_info(struct Scsi_Host *shos
     char **start, off_t offset, int length, int inout)
 {
 	struct info_str	info;
-	int             i;
+	int		i;
 	int             retval = -EINVAL;
 	os_lun_t	*up;
-	os_tgt_t	*tq;
+	fc_port_t	*fcport;
 	unsigned int	t, l;
 	uint32_t        tmp_sn;
 	unsigned long   *flags;
@@ -2499,20 +2500,23 @@ qla2x00_proc_info(struct Scsi_Host *shos
 	    ha->init_cb->port_name[7]);
 
 	/* Print out device port names */
-	for (i = 0; i < MAX_TARGETS; i++) {
-		if ((tq = TGT_Q(ha, i)) == NULL)
+	i = 0;
+ 	list_for_each_entry(fcport, &ha->fcports, list) {
+		if (fcport->port_type != FCT_TARGET)
 			continue;
 
 		copy_info(&info,
 		    "scsi-qla%d-target-%d="
-		    "%02x%02x%02x%02x%02x%02x%02x%02x;\n",
+		    "%02x%02x%02x%02x%02x%02x%02x%02x:%02x%02x%02x;\n",
 		    (int)ha->instance, i,
-		    tq->port_name[0], tq->port_name[1],
-		    tq->port_name[2], tq->port_name[3],
-		    tq->port_name[4], tq->port_name[5],
-		    tq->port_name[6], tq->port_name[7]);
-
-	} /* 2.25 node/port display to proc */
+		    fcport->port_name[0], fcport->port_name[1],
+		    fcport->port_name[2], fcport->port_name[3],
+		    fcport->port_name[4], fcport->port_name[5],
+		    fcport->port_name[6], fcport->port_name[7],
+		    fcport->d_id.b.domain, fcport->d_id.b.area,
+		    fcport->d_id.b.al_pa);
+		i++;
+	}
 
 	copy_info(&info, "\nSCSI LUN Information:\n");
 	copy_info(&info,
@@ -2816,11 +2820,11 @@ void qla2x00_mark_device_lost(scsi_qla_h
 void
 qla2x00_mark_all_devices_lost(scsi_qla_host_t *ha) 
 {
-	struct list_head	*fcpl;
-	fc_port_t		*fcport;
+	fc_port_t *fcport;
 
-	list_for_each(fcpl, &ha->fcports) {
-		fcport = list_entry(fcpl, fc_port_t, list);
+	list_for_each_entry(fcport, &ha->fcports, list) {
+		if (fcport->port_type != FCT_TARGET)
+			continue;
 
 		/*
 		 * No point in marking the device as lost, if the device is
@@ -3180,7 +3184,6 @@ qla2x00_do_dpc(void *data)
 {
 	DECLARE_MUTEX_LOCKED(sem);
 	scsi_qla_host_t *ha;
-	struct list_head *fcpl;
 	fc_port_t	*fcport;
 	os_lun_t        *q;
 	srb_t           *sp;
@@ -3188,7 +3191,10 @@ qla2x00_do_dpc(void *data)
 	unsigned long	flags = 0;
 	struct list_head *list, *templist;
 	int	dead_cnt, online_cnt;
+	int	retry_cmds = 0;
 	uint16_t	next_loopid;
+	int t;
+	os_tgt_t *tq;
 
 	ha = (scsi_qla_host_t *)data;
 
@@ -3249,10 +3255,15 @@ qla2x00_do_dpc(void *data)
 
 				if (atomic_read(&fcport->state) ==
 				    FCS_DEVICE_DEAD ||
-				    atomic_read(&ha->loop_state) == LOOP_DEAD) {
+				    atomic_read(&fcport->ha->loop_state) == LOOP_DEAD) {
 
 					__del_from_retry_queue(ha, sp);
 					sp->cmd->result = DID_NO_CONNECT << 16;
+					if (atomic_read(&fcport->ha->loop_state) ==
+					    LOOP_DOWN) 
+						sp->err_id = SRB_ERR_LOOP;
+					else
+						sp->err_id = SRB_ERR_PORT;
 					sp->cmd->host_scribble =
 					    (unsigned char *) NULL;
 					__add_to_done_queue(ha, sp);
@@ -3295,6 +3306,7 @@ qla2x00_do_dpc(void *data)
 
 				sp = list_entry(list, srb_t, list);
 				q = sp->lun_queue;
+				tq = sp->tgt_queue;
 
 				DEBUG3(printk("scsi(%ld): scsi_retry_q: "
 				    "pid=%ld sp=%p, spflags=0x%x, "
@@ -3306,7 +3318,15 @@ qla2x00_do_dpc(void *data)
 				if (q->q_state != LUN_STATE_WAIT) {
 					online_cnt++;
 					__del_from_scsi_retry_queue(ha, sp);
-					__add_to_retry_queue(ha,sp);
+
+					if (test_bit(TQF_RETRY_CMDS,
+					    &tq->flags)) {
+						qla2x00_extend_timeout(sp->cmd,
+						    (sp->cmd->timeout_per_command / HZ) - QLA_CMD_TIMER_DELTA);
+						__add_to_pending_queue(ha, sp);
+						retry_cmds++;
+					} else
+						__add_to_retry_queue(ha, sp);
 				}
 
 				/* Was this command suspended for N secs */
@@ -3322,6 +3342,17 @@ qla2x00_do_dpc(void *data)
 			}
 			spin_unlock_irqrestore(&ha->list_lock, flags);
 
+			/* Clear all Target Unsuspended bits */
+			for (t = 0; t < ha->max_targets; t++) {
+				if ((tq = ha->otgt[t]) == NULL)
+					continue;
+
+				if (test_bit(TQF_RETRY_CMDS, &tq->flags))
+					clear_bit(TQF_RETRY_CMDS, &tq->flags);
+			}
+			if (retry_cmds)
+				qla2x00_next(ha);
+
 			DEBUG(if (online_cnt > 0))
 			DEBUG(printk("scsi(%ld): dpc() found scsi reqs to "
 			    "restart= %d\n",
@@ -3374,9 +3405,10 @@ qla2x00_do_dpc(void *data)
 			    ha->host_no));
 
 			next_loopid = 0;
-			list_for_each(fcpl, &ha->fcports) {
-				fcport = list_entry(fcpl, fc_port_t, list);
-				
+			list_for_each_entry(fcport, &ha->fcports, list) {
+				if (fcport->port_type != FCT_TARGET)
+					continue;
+
 				/*
 				 * If the port is not ONLINE then try to login
 				 * to it if we haven't run out of retries.
@@ -3579,7 +3611,7 @@ qla2x00_rst_aen(scsi_qla_host_t *ha) 
 
 
 /*
- * This routine will alloacte SP from the free queue
+ * This routine will allocate SP from the free queue
  * input:
  *        scsi_qla_host_t *
  * output:
@@ -3593,6 +3625,7 @@ qla2x00_get_new_sp(scsi_qla_host_t *ha)
 	sp = mempool_alloc(ha->srb_mempool, GFP_KERNEL);
 	if (sp) {
 		atomic_set(&sp->ref_count, 1);
+		sp->req_cnt = 0;
 	}
 	return (sp);
 }
@@ -3677,7 +3710,6 @@ qla2x00_timer(scsi_qla_host_t *ha)
 {
 	int		t,l;
 	unsigned long	cpu_flags = 0;
-	struct list_head	*fcpl;
 	fc_port_t	*fcport;
 	os_lun_t *lq;
 	os_tgt_t *tq;
@@ -3712,8 +3744,9 @@ qla2x00_timer(scsi_qla_host_t *ha)
 	 * the port it marked DEAD. 
 	 */
 	t = 0;
-	list_for_each(fcpl, &ha->fcports) {
-		fcport = list_entry(fcpl, fc_port_t, list);
+	list_for_each_entry(fcport, &ha->fcports, list) {
+		if (fcport->port_type != FCT_TARGET)
+			continue;
 
 		if (atomic_read(&fcport->state) == FCS_DEVICE_LOST) {
 
@@ -3894,7 +3927,7 @@ qla2x00_extend_timeout(struct scsi_cmnd 
 * None.
 * Note:Need to add the support for if( sp->state == SRB_FAILOVER_STATE).
 **************************************************************************/
-static void
+void
 qla2x00_cmd_timeout(srb_t *sp)
 {
 	int t, l;
@@ -3902,9 +3935,6 @@ qla2x00_cmd_timeout(srb_t *sp)
 	scsi_qla_host_t *vis_ha, *dest_ha;
 	struct scsi_cmnd *cmd;
 	ulong      flags;
-#if defined(QL_DEBUG_LEVEL_3)
-	ulong      cpu_flags;
-#endif
 	fc_port_t	*fcport;
 
 	cmd = sp->cmd;
@@ -3937,8 +3967,12 @@ qla2x00_cmd_timeout(srb_t *sp)
 		 * DID_BUS_BUSY to let the OS  retry this cmd.
 		 */
 		if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD ||
-		    atomic_read(&vis_ha->loop_state) == LOOP_DEAD) {
+		    atomic_read(&fcport->ha->loop_state) == LOOP_DEAD) {
 			cmd->result = DID_NO_CONNECT << 16;
+			if (atomic_read(&fcport->ha->loop_state) == LOOP_DOWN) 
+				sp->err_id = SRB_ERR_LOOP;
+			else
+				sp->err_id = SRB_ERR_PORT;
 		} else {
 			cmd->result = DID_BUS_BUSY << 16;
 		}
@@ -3977,6 +4011,10 @@ qla2x00_cmd_timeout(srb_t *sp)
 		    atomic_read(&dest_ha->loop_state) == LOOP_DEAD) {
 			qla2x00_extend_timeout(cmd, EXTEND_CMD_TIMEOUT);
 			cmd->result = DID_NO_CONNECT << 16;
+			if (atomic_read(&dest_ha->loop_state) == LOOP_DOWN) 
+				sp->err_id = SRB_ERR_LOOP;
+			else
+				sp->err_id = SRB_ERR_PORT;
 		} else {
 			cmd->result = DID_BUS_BUSY << 16;
 		}
@@ -3991,55 +4029,7 @@ qla2x00_cmd_timeout(srb_t *sp)
 
 		 return;
 	}
-/* TODO: Remove this code!!! */
-#if defined(QL_DEBUG_LEVEL_3)
-	spin_lock_irqsave(&dest_ha->list_lock, cpu_flags);
-	if (sp->state == SRB_DONE_STATE) {
-		/* IO in done_q  -- leave it */
-		DEBUG(printk("scsi(%ld): Found in Done queue pid %ld sp=%p.\n",
-		    dest_ha->host_no, cmd->serial_number, sp));
-	} else if (sp->state == SRB_SUSPENDED_STATE) {
-		DEBUG(printk("scsi(%ld): Found SP %p in suspended state  "
-		    "- pid %ld:\n",
-		    dest_ha->host_no, sp, cmd->serial_number));
-		DEBUG(qla2x00_dump_buffer((uint8_t *)sp, sizeof(srb_t));)
-	} else if (sp->state == SRB_ACTIVE_STATE) {
-		/*
-		 * IO is with ISP find the command in our active list.
-		 */
-		spin_unlock_irqrestore(&dest_ha->list_lock, cpu_flags);
-		spin_lock_irqsave(&dest_ha->hardware_lock, flags);
-		if (sp ==
-		    dest_ha->outstanding_cmds[(u_long)sp->cmd->host_scribble]) {
-
-			DEBUG(printk("cmd_timeout: Found in ISP \n");)
-
-			sp->state = SRB_ACTIVE_TIMEOUT_STATE;
-			spin_unlock_irqrestore(&dest_ha->hardware_lock, flags);
-		} else {
-			spin_unlock_irqrestore(&dest_ha->hardware_lock, flags);
-			printk(KERN_INFO 
-				"qla_cmd_timeout: State indicates it is with "
-				"ISP, But not in active array\n");
-		}
-		spin_lock_irqsave(&dest_ha->list_lock, cpu_flags); 	/* 01/03 */
-	} else if (sp->state == SRB_ACTIVE_TIMEOUT_STATE) {
-		DEBUG(printk("qla2100%ld: Found in Active timeout state"
-				"pid %ld, State = %x., \n",
-				dest_ha->host_no,
-				sp->cmd->serial_number, sp->state);)
-	} else {
-		/* EMPTY */
-		DEBUG2(printk("cmd_timeout%ld: LOST command state = "
-				"0x%x, sp=%p\n",
-				vis_ha->host_no, sp->state,sp);)
 
-		qla_printk(KERN_INFO, vis_ha,
-			"cmd_timeout: LOST command state = 0x%x\n", sp->state);
-	}
-	spin_unlock_irqrestore(&dest_ha->list_lock, cpu_flags);
-#endif
-	
 	DEBUG3(printk("cmd_timeout: Leaving\n");)
 }
 
@@ -4236,20 +4226,16 @@ qla2x00_next(scsi_qla_host_t *vis_ha) 
 
 		/* If device is dead then send request back to OS */
 		if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD) {
-
 			sp->cmd->result = DID_NO_CONNECT << 16;
-
-			if (!atomic_read(&dest_ha->loop_down_timer) &&
-			    atomic_read(&dest_ha->loop_state) == LOOP_DOWN) {
-				sp->err_id = 2;
-			} else {
-				sp->err_id = 1;
-			}
-			DEBUG3(printk("scsi(%ld): loop/port is down - "
-			    "pid=%ld, sp=%p loopid=0x%x queued to dest HBA "
-			    "scsi%ld.\n",
-			    dest_ha->host_no,
-			    sp->cmd->serial_number, sp,
+			if (atomic_read(&dest_ha->loop_state) == LOOP_DOWN) 
+				sp->err_id = SRB_ERR_LOOP;
+			else
+				sp->err_id = SRB_ERR_PORT;
+
+			DEBUG3(printk("scsi(%ld): loop/port is down - pid=%ld, "
+			    "sp=%p err_id=%d loopid=0x%x queued to dest HBA "
+			    "scsi%ld.\n", dest_ha->host_no,
+			    sp->cmd->serial_number, sp, sp->err_id,
 			    fcport->loop_id, dest_ha->host_no));
 			/* 
 			 * Initiate a failover - done routine will initiate.
@@ -4448,18 +4434,70 @@ qla2x00_down_timeout(struct semaphore *s
 	return -ETIMEDOUT;
 }
 
+static void
+qla2xxx_get_port_id(struct scsi_device *sdev)
+{
+	scsi_qla_host_t *ha = to_qla_host(sdev->host);
+	struct fc_port *fc;
+
+	list_for_each_entry(fc, &ha->fcports, list) {
+		if (fc->os_target_id == sdev->id) {
+			fc_port_id(sdev) = fc->d_id.b.domain << 16 |
+				fc->d_id.b.area << 8 | 
+				fc->d_id.b.al_pa;
+			return;
+		}
+	}
+	fc_port_id(sdev) = -1;
+}
+
+static void
+qla2xxx_get_port_name(struct scsi_device *sdev)
+{
+	scsi_qla_host_t *ha = to_qla_host(sdev->host);
+	struct fc_port *fc;
+
+	list_for_each_entry(fc, &ha->fcports, list) {
+		if (fc->os_target_id == sdev->id) {
+			fc_port_name(sdev) =
+				__be64_to_cpu(*(uint64_t *)fc->port_name);
+			return;
+		}
+	}
+	fc_port_name(sdev) = -1;
+}
+
+static void
+qla2xxx_get_node_name(struct scsi_device *sdev)
+{
+	scsi_qla_host_t *ha = to_qla_host(sdev->host);
+	struct fc_port *fc;
+
+	list_for_each_entry(fc, &ha->fcports, list) {
+		if (fc->os_target_id == sdev->id) {
+			fc_node_name(sdev) =
+				__be64_to_cpu(*(uint64_t *)fc->node_name);
+			return;
+		}
+	}
+	fc_node_name(sdev) = -1;
+}
+
+static struct fc_function_template qla2xxx_transport_functions = {
+	.get_port_id = qla2xxx_get_port_id,
+	.show_port_id = 1,
+	.get_port_name = qla2xxx_get_port_name,
+	.show_port_name = 1,
+	.get_node_name = qla2xxx_get_node_name,
+	.show_node_name = 1,
+};
+
 /**
  * qla2x00_module_init - Module initialization.
  **/
 static int __init
 qla2x00_module_init(void)
 {
-	/* Derive version string. */
-	strcpy(qla2x00_version_str, QLA2XXX_VERSION);
-#if DEBUG_QLA2100
-	strcat(qla2x00_version_str, "-debug");
-#endif
-
 	/* Allocate cache for SRBs. */
 	sprintf(srb_cachep_name, "qla2xxx_srbs");
 	srb_cachep = kmem_cache_create(srb_cachep_name, sizeof(srb_t), 0,
@@ -4470,6 +4508,16 @@ qla2x00_module_init(void)
 		return -ENOMEM;
 	}
 
+	/* Derive version string. */
+	strcpy(qla2x00_version_str, QLA2XXX_VERSION);
+#if DEBUG_QLA2100
+	strcat(qla2x00_version_str, "-debug");
+#endif
+
+	qla2xxx_transport_template = fc_attach_transport(&qla2xxx_transport_functions);
+	if (!qla2xxx_transport_template)
+		return -ENODEV;
+
 	printk(KERN_INFO
 	    "QLogic Fibre Channel HBA Driver (%p)\n", qla2x00_set_info);
 
@@ -4491,6 +4539,8 @@ qla2x00_module_exit(void)
 		}
 		srb_cachep = NULL;
 	}
+
+	fc_release_transport(qla2xxx_transport_template);
 }
 
 module_init(qla2x00_module_init);
--- diff/drivers/scsi/qla2xxx/qla_os.h	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/scsi/qla2xxx/qla_os.h	2004-04-21 10:45:34.901397680 +0100
@@ -2,7 +2,7 @@
  *                  QLOGIC LINUX SOFTWARE
  *
  * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation
+ * Copyright (C) 2003-2004 QLogic Corporation
  * (www.qlogic.com)
  *
  * Portions (C) Arjan van de Ven <arjanv@redhat.com> for Red Hat, Inc.
@@ -45,6 +45,7 @@
 #include <linux/bio.h>
 #include <linux/moduleparam.h>
 #include <linux/capability.h>
+#include <linux/list.h>
 
 #include <asm/system.h>
 
@@ -62,6 +63,8 @@
 
 #include <scsi/scsicam.h>
 #include <scsi/scsi_ioctl.h>
+#include <scsi/scsi_transport.h>
+#include <scsi/scsi_transport_fc.h>
 
 //TODO Fix this!!!
 /*
--- diff/drivers/scsi/qla2xxx/qla_rscn.c	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/qla_rscn.c	2004-04-21 10:45:34.902397528 +0100
@@ -2,7 +2,7 @@
  *                  QLOGIC LINUX SOFTWARE
  *
  * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation
+ * Copyright (C) 2003-2004 QLogic Corporation
  * (www.qlogic.com)
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -292,15 +292,17 @@ qla2x00_iodesc_timeout(unsigned long dat
  *
  * NOTE:
  * The firmware shall timeout an outstanding mailbox IOCB in 2 * R_A_TOV (in
- * tenths of a second).  The driver will wait 2.5 * R_A_TOV before scheduling
- * a recovery (big hammer).
+ * tenths of a second) after it hits the wire.  But, if there are any request
+ * resource contraints (i.e. during heavy I/O), exchanges can be held off for
+ * at most R_A_TOV.  Therefore, the driver will wait 4 * R_A_TOV before
+ * scheduling a recovery (big hammer).
  */
 static inline void
 qla2x00_add_iodesc_timer(struct io_descriptor *iodesc)
 {
 	unsigned long timeout;
 
-	timeout = ((iodesc->ha->r_a_tov * 2) + (iodesc->ha->r_a_tov / 2)) / 10;
+	timeout = (iodesc->ha->r_a_tov * 4) / 10;
 	init_timer(&iodesc->timer);
 	iodesc->timer.data = (unsigned long) iodesc;
 	iodesc->timer.expires = jiffies + (timeout * HZ);
--- diff/drivers/scsi/qla2xxx/qla_settings.h	2004-02-18 08:54:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/qla_settings.h	2004-04-21 10:45:34.902397528 +0100
@@ -2,7 +2,7 @@
  *                  QLOGIC LINUX SOFTWARE
  *
  * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation
+ * Copyright (C) 2003-2004 QLogic Corporation
  * (www.qlogic.com)
  *
  * This program is free software; you can redistribute it and/or modify it
--- diff/drivers/scsi/qla2xxx/qla_sup.c	2004-02-18 08:54:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/qla_sup.c	2004-04-21 10:45:34.903397376 +0100
@@ -2,7 +2,7 @@
  *                  QLOGIC LINUX SOFTWARE
  *
  * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation
+ * Copyright (C) 2003-2004 QLogic Corporation
  * (www.qlogic.com)
  *
  * This program is free software; you can redistribute it and/or modify it
--- diff/drivers/scsi/qla2xxx/qla_version.h	2004-02-18 08:54:11.000000000 +0000
+++ source/drivers/scsi/qla2xxx/qla_version.h	2004-04-21 10:45:34.903397376 +0100
@@ -2,7 +2,7 @@
  *                  QLOGIC LINUX SOFTWARE
  *
  * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003 QLogic Corporation
+ * Copyright (C) 2003-2004 QLogic Corporation
  * (www.qlogic.com)
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -19,9 +19,9 @@
 /*
  * Driver version 
  */
-#define QLA2XXX_VERSION      "8.00.00b10"
+#define QLA2XXX_VERSION      "8.00.00b11-k"
 
 #define QLA_DRIVER_MAJOR_VER	8
 #define QLA_DRIVER_MINOR_VER	0
 #define QLA_DRIVER_PATCH_VER	0
-#define QLA_DRIVER_BETA_VER	10
+#define QLA_DRIVER_BETA_VER	11
--- diff/drivers/scsi/sata_promise.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/sata_promise.c	2004-04-21 10:45:34.910396312 +0100
@@ -28,13 +28,14 @@
 #include <linux/blkdev.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
+#include <linux/sched.h>
 #include "scsi.h"
 #include "hosts.h"
 #include <linux/libata.h>
 #include <asm/io.h>
 
 #define DRV_NAME	"sata_promise"
-#define DRV_VERSION	"0.91"
+#define DRV_VERSION	"0.92"
 
 
 enum {
@@ -45,10 +46,13 @@ enum {
 	PDC_INT_SEQMASK		= 0x40,	/* Mask of asserted SEQ INTs */
 	PDC_TBG_MODE		= 0x41,	/* TBG mode */
 	PDC_FLASH_CTL		= 0x44, /* Flash control register */
-	PDC_CTLSTAT		= 0x60,	/* IDE control and status register */
+	PDC_PCI_CTL		= 0x48, /* PCI control and status register */
+	PDC_GLOBAL_CTL		= 0x48, /* Global control/status (per port) */
+	PDC_CTLSTAT		= 0x60,	/* IDE control and status (per port) */
 	PDC_SATA_PLUG_CSR	= 0x6C, /* SATA Plug control/status reg */
 	PDC_SLEW_CTL		= 0x470, /* slew rate control reg */
 	PDC_HDMA_CTLSTAT	= 0x12C, /* Host DMA control / status */
+
 	PDC_20621_SEQCTL	= 0x400,
 	PDC_20621_SEQMASK	= 0x480,
 	PDC_20621_GENERAL_CTL	= 0x484,
@@ -73,12 +77,19 @@ enum {
 
 	PDC_CHIP0_OFS		= 0xC0000, /* offset of chip #0 */
 
+	PDC_20621_ERR_MASK	= (1<<19) | (1<<20) | (1<<21) | (1<<22) |
+				  (1<<23),
+	PDC_ERR_MASK		= (1<<19) | (1<<20) | (1<<21) | (1<<22) |
+				  (1<<8) | (1<<9) | (1<<10),
+
 	board_2037x		= 0,	/* FastTrak S150 TX2plus */
 	board_20319		= 1,	/* FastTrak S150 TX4 */
 	board_20621		= 2,	/* FastTrak S150 SX4 */
 
+	PDC_HAS_PATA		= (1 << 1), /* PDC20375 has PATA */
+
 	PDC_FLAG_20621		= (1 << 30), /* we have a 20621 */
-	PDC_HDMA_RESET		= (1 << 11), /* HDMA reset */
+	PDC_RESET		= (1 << 11), /* HDMA reset */
 
 	PDC_MAX_HDMA		= 32,
 	PDC_HDMA_Q_MASK		= (PDC_MAX_HDMA - 1),
@@ -154,13 +165,14 @@ static void pdc_eng_timeout(struct ata_p
 static void pdc_20621_phy_reset (struct ata_port *ap);
 static int pdc_port_start(struct ata_port *ap);
 static void pdc_port_stop(struct ata_port *ap);
+static void pdc_phy_reset(struct ata_port *ap);
 static void pdc_fill_sg(struct ata_queued_cmd *qc);
 static void pdc20621_fill_sg(struct ata_queued_cmd *qc);
 static void pdc_tf_load_mmio(struct ata_port *ap, struct ata_taskfile *tf);
 static void pdc_exec_command_mmio(struct ata_port *ap, struct ata_taskfile *tf);
 static void pdc20621_host_stop(struct ata_host_set *host_set);
 static inline void pdc_dma_complete (struct ata_port *ap,
-                                     struct ata_queued_cmd *qc);
+                                     struct ata_queued_cmd *qc, int have_err);
 static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe);
 static int pdc20621_detect_dimm(struct ata_probe_ent *pe);
 static unsigned int pdc20621_i2c_read(struct ata_probe_ent *pe, 
@@ -199,7 +211,7 @@ static struct ata_port_operations pdc_sa
 	.tf_read		= ata_tf_read_mmio,
 	.check_status		= ata_check_status_mmio,
 	.exec_command		= pdc_exec_command_mmio,
-	.phy_reset		= sata_phy_reset,
+	.phy_reset		= pdc_phy_reset,
 	.bmdma_start            = pdc_dma_start,
 	.fill_sg		= pdc_fill_sg,
 	.eng_timeout		= pdc_eng_timeout,
@@ -351,6 +363,34 @@ static void pdc_20621_phy_reset (struct 
         ata_bus_reset(ap);
 }
 
+static void pdc_reset_port(struct ata_port *ap)
+{
+	void *mmio = (void *) ap->ioaddr.cmd_addr + PDC_CTLSTAT;
+	unsigned int i;
+	u32 tmp;
+
+	for (i = 11; i > 0; i--) {
+		tmp = readl(mmio);
+		if (tmp & PDC_RESET)
+			break;
+
+		udelay(100);
+
+		tmp |= PDC_RESET;
+		writel(tmp, mmio);
+	}
+
+	tmp &= ~PDC_RESET;
+	writel(tmp, mmio);
+	readl(mmio);	/* flush */
+}
+
+static void pdc_phy_reset(struct ata_port *ap)
+{
+	pdc_reset_port(ap);
+	sata_phy_reset(ap);
+}
+
 static u32 pdc_sata_scr_read (struct ata_port *ap, unsigned int sc_reg)
 {
 	if (sc_reg > SCR_CONTROL)
@@ -390,12 +430,11 @@ static inline unsigned int pdc_pkt_heade
 	 * and seq id (byte 2)
 	 */
 	switch (tf->protocol) {
-	case ATA_PROT_DMA_READ:
-		buf32[0] = cpu_to_le32(PDC_PKT_READ);
-		break;
-
-	case ATA_PROT_DMA_WRITE:
-		buf32[0] = 0;
+	case ATA_PROT_DMA:
+		if (!(tf->flags & ATA_TFLAG_WRITE))
+			buf32[0] = cpu_to_le32(PDC_PKT_READ);
+		else
+			buf32[0] = 0;
 		break;
 
 	case ATA_PROT_NODATA:
@@ -554,7 +593,7 @@ static inline unsigned int pdc20621_ata_
 	/*
 	 * Set up ATA packet
 	 */
-	if (tf->protocol == ATA_PROT_DMA_READ)
+	if ((tf->protocol == ATA_PROT_DMA) && (!(tf->flags & ATA_TFLAG_WRITE)))
 		buf[i++] = PDC_PKT_READ;
 	else if (tf->protocol == ATA_PROT_NODATA)
 		buf[i++] = PDC_PKT_NODATA;
@@ -606,7 +645,7 @@ static inline void pdc20621_host_pkt(str
 	/*
 	 * Set up Host DMA packet
 	 */
-	if (tf->protocol == ATA_PROT_DMA_READ)
+	if ((tf->protocol == ATA_PROT_DMA) && (!(tf->flags & ATA_TFLAG_WRITE)))
 		tmp = PDC_PKT_READ;
 	else
 		tmp = 0;
@@ -768,7 +807,7 @@ static void pdc20621_dma_start(struct at
 	struct ata_host_set *host_set = ap->host_set;
 	unsigned int port_no = ap->port_no;
 	void *mmio = host_set->mmio_base;
-	unsigned int rw = (qc->flags & ATA_QCFLAG_WRITE);
+	unsigned int rw = (qc->tf.flags & ATA_TFLAG_WRITE);
 	u8 seq = (u8) (port_no + 1);
 	unsigned int doing_hdma = 0, port_ofs;
 
@@ -821,13 +860,14 @@ static inline unsigned int pdc20621_host
 
 	VPRINTK("ENTER\n");
 
-	switch (qc->tf.protocol) {
-	case ATA_PROT_DMA_READ:
+	if ((qc->tf.protocol == ATA_PROT_DMA) &&	/* read */
+	    (!(qc->tf.flags & ATA_TFLAG_WRITE))) {
+
 		/* step two - DMA from DIMM to host */
 		if (doing_hdma) {
 			VPRINTK("ata%u: read hdma, 0x%x 0x%x\n", ap->id,
 				readl(mmio + 0x104), readl(mmio + PDC_HDMA_CTLSTAT));
-			pdc_dma_complete(ap, qc);
+			pdc_dma_complete(ap, qc, 0);
 			pdc20621_pop_hdma(qc);
 		}
 
@@ -843,9 +883,9 @@ static inline unsigned int pdc20621_host
 					   port_ofs + PDC_DIMM_HOST_PKT);
 		}
 		handled = 1;
-		break;
 
-	case ATA_PROT_DMA_WRITE:
+	} else if (qc->tf.protocol == ATA_PROT_DMA) {	/* write */
+
 		/* step one - DMA from host to DIMM */
 		if (doing_hdma) {
 			u8 seq = (u8) (port_no + 1);
@@ -864,25 +904,24 @@ static inline unsigned int pdc20621_host
 		else {
 			VPRINTK("ata%u: write ata, 0x%x 0x%x\n", ap->id,
 				readl(mmio + 0x104), readl(mmio + PDC_HDMA_CTLSTAT));
-			pdc_dma_complete(ap, qc);
+			pdc_dma_complete(ap, qc, 0);
 			pdc20621_pop_hdma(qc);
 		}
 		handled = 1;
-		break;
 
-	case ATA_PROT_NODATA:   /* command completion, but no data xfer */
+	/* command completion, but no data xfer */
+	} else if (qc->tf.protocol == ATA_PROT_NODATA) {
+
 		status = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000);
 		DPRINTK("BUS_NODATA (drv_stat 0x%X)\n", status);
 		ata_qc_complete(qc, status, 0);
 		handled = 1;
-		break;
 
-        default:
-                ap->stats.idle_irq++;
-                break;
-        }
+	} else {
+		ap->stats.idle_irq++;
+	}
 
-        return handled;
+	return handled;
 }
 
 static irqreturn_t pdc20621_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
@@ -918,7 +957,7 @@ static irqreturn_t pdc20621_interrupt (i
 		return IRQ_NONE;
 	}
 
-        spin_lock_irq(&host_set->lock);
+        spin_lock(&host_set->lock);
 
         for (i = 1; i < 9; i++) {
 		port_no = i - 1;
@@ -940,7 +979,7 @@ static irqreturn_t pdc20621_interrupt (i
 		}
 	}
 
-        spin_unlock_irq(&host_set->lock);
+        spin_unlock(&host_set->lock);
 
 	VPRINTK("mask == 0x%x\n", mask);
 
@@ -969,11 +1008,14 @@ static void pdc_fill_sg(struct ata_queue
 }
 
 static inline void pdc_dma_complete (struct ata_port *ap,
-                                     struct ata_queued_cmd *qc)
+                                     struct ata_queued_cmd *qc,
+				     int have_err)
 {
+	u8 err_bit = have_err ? ATA_ERR : 0;
+
 	/* get drive status; clear intr; complete txn */
 	ata_qc_complete(ata_qc_from_tag(ap, ap->active_tag),
-			ata_wait_idle(ap), 0);
+			ata_wait_idle(ap) | err_bit, 0);
 }
 
 static void pdc_eng_timeout(struct ata_port *ap)
@@ -999,8 +1041,7 @@ static void pdc_eng_timeout(struct ata_p
 	qc->scsidone = scsi_finish_command;
 
 	switch (qc->tf.protocol) {
-	case ATA_PROT_DMA_READ:
-	case ATA_PROT_DMA_WRITE:
+	case ATA_PROT_DMA:
 		printk(KERN_ERR "ata%u: DMA timeout\n", ap->id);
 		ata_qc_complete(ata_qc_from_tag(ap, ap->active_tag),
 			        ata_wait_idle(ap) | ATA_ERR, 0);
@@ -1033,18 +1074,27 @@ static inline unsigned int pdc_host_intr
                                           struct ata_queued_cmd *qc)
 {
 	u8 status;
-	unsigned int handled = 0;
+	unsigned int handled = 0, have_err = 0;
+	u32 tmp;
+	void *mmio = (void *) ap->ioaddr.cmd_addr + PDC_GLOBAL_CTL;
+
+	tmp = readl(mmio);
+	if (tmp & PDC_ERR_MASK) {
+		have_err = 1;
+		pdc_reset_port(ap);
+	}
 
 	switch (qc->tf.protocol) {
-	case ATA_PROT_DMA_READ:
-	case ATA_PROT_DMA_WRITE:
-		pdc_dma_complete(ap, qc);
+	case ATA_PROT_DMA:
+		pdc_dma_complete(ap, qc, have_err);
 		handled = 1;
 		break;
 
 	case ATA_PROT_NODATA:   /* command completion, but no data xfer */
 		status = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000);
 		DPRINTK("BUS_NODATA (drv_stat 0x%X)\n", status);
+		if (have_err)
+			status |= ATA_ERR;
 		ata_qc_complete(qc, status, 0);
 		handled = 1;
 		break;
@@ -1088,7 +1138,7 @@ static irqreturn_t pdc_interrupt (int ir
 		return IRQ_NONE;
 	}
 
-        spin_lock_irq(&host_set->lock);
+        spin_lock(&host_set->lock);
 
         for (i = 0; i < host_set->n_ports; i++) {
 		VPRINTK("port %u\n", i);
@@ -1103,7 +1153,7 @@ static irqreturn_t pdc_interrupt (int ir
 		}
 	}
 
-        spin_unlock_irq(&host_set->lock);
+        spin_unlock(&host_set->lock);
 
 	VPRINTK("EXIT\n");
 
@@ -1130,16 +1180,14 @@ static void pdc_dma_start(struct ata_que
 
 static void pdc_tf_load_mmio(struct ata_port *ap, struct ata_taskfile *tf)
 {
-	if ((tf->protocol != ATA_PROT_DMA_READ) &&
-	    (tf->protocol != ATA_PROT_DMA_WRITE))
+	if (tf->protocol == ATA_PROT_PIO)
 		ata_tf_load_mmio(ap, tf);
 }
 
 
 static void pdc_exec_command_mmio(struct ata_port *ap, struct ata_taskfile *tf)
 {
-	if ((tf->protocol != ATA_PROT_DMA_READ) &&
-	    (tf->protocol != ATA_PROT_DMA_WRITE))
+	if (tf->protocol == ATA_PROT_PIO)
 		ata_exec_command_mmio(ap, tf);
 }
 
@@ -1592,14 +1640,14 @@ static void pdc_20621_init(struct ata_pr
 	 * Reset Host DMA
 	 */
 	tmp = readl(mmio + PDC_HDMA_CTLSTAT);
-	tmp |= PDC_HDMA_RESET;
+	tmp |= PDC_RESET;
 	writel(tmp, mmio + PDC_HDMA_CTLSTAT);
 	readl(mmio + PDC_HDMA_CTLSTAT);		/* flush */
 
 	udelay(10);
 
 	tmp = readl(mmio + PDC_HDMA_CTLSTAT);
-	tmp &= ~PDC_HDMA_RESET;
+	tmp &= ~PDC_RESET;
 	writel(tmp, mmio + PDC_HDMA_CTLSTAT);
 	readl(mmio + PDC_HDMA_CTLSTAT);		/* flush */
 }
@@ -1610,14 +1658,18 @@ static void pdc_host_init(unsigned int c
 	u32 tmp;
 
 	if (chip_id == board_20621)
-		return;
+		BUG();
 
-	/* change FIFO_SHD to 8 dwords. Promise driver does this...
-	 * dunno why.
+	/*
+	 * Except for the hotplug stuff, this is voodoo from the
+	 * Promise driver.  Label this entire section
+	 * "TODO: figure out why we do this"
 	 */
+
+	/* change FIFO_SHD to 8 dwords, enable BMR_BURST */
 	tmp = readl(mmio + PDC_FLASH_CTL);
-	if ((tmp & (1 << 16)) == 0)
-		writel(tmp | (1 << 16), mmio + PDC_FLASH_CTL);
+	tmp |= 0x12000;	/* bit 16 (fifo 8 dw) and 13 (bmr burst?) */
+	writel(tmp, mmio + PDC_FLASH_CTL);
 
 	/* clear plug/unplug flags for all ports */
 	tmp = readl(mmio + PDC_SATA_PLUG_CSR);
@@ -1627,13 +1679,17 @@ static void pdc_host_init(unsigned int c
 	tmp = readl(mmio + PDC_SATA_PLUG_CSR);
 	writel(tmp | 0xff0000, mmio + PDC_SATA_PLUG_CSR);
 
-	/* reduce TBG clock to 133 Mhz. FIXME: why? */
+	/* reduce TBG clock to 133 Mhz. */
 	tmp = readl(mmio + PDC_TBG_MODE);
 	tmp &= ~0x30000; /* clear bit 17, 16*/
 	tmp |= 0x10000;  /* set bit 17:16 = 0:1 */
 	writel(tmp, mmio + PDC_TBG_MODE);
 
-	/* adjust slew rate control register. FIXME: why? */
+	readl(mmio + PDC_TBG_MODE);	/* flush */
+	set_current_state(TASK_UNINTERRUPTIBLE);
+	schedule_timeout(msecs_to_jiffies(10));
+
+	/* adjust slew rate control register. */
 	tmp = readl(mmio + PDC_SLEW_CTL);
 	tmp &= 0xFFFFF03F; /* clear bit 11 ~ 6 */
 	tmp  |= 0x00000900; /* set bit 11-9 = 100b , bit 8-6 = 100 */
--- diff/drivers/scsi/scsi.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/scsi.c	2004-04-21 10:45:34.912396008 +0100
@@ -977,7 +977,9 @@ int scsi_track_queue_full(struct scsi_de
  */
 int scsi_device_get(struct scsi_device *sdev)
 {
-	if (sdev->sdev_state == SDEV_DEL)
+	if(!sdev)
+		return -ENXIO;
+	if (sdev->sdev_state == SDEV_DEL || sdev->sdev_state == SDEV_CANCEL)
 		return -ENXIO;
 	if (!get_device(&sdev->sdev_gendev))
 		return -ENXIO;
--- diff/drivers/scsi/scsi_devinfo.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/scsi_devinfo.c	2004-04-21 10:45:34.913395856 +0100
@@ -117,6 +117,7 @@ static struct {
 	 */
 	{"ADAPTEC", "AACRAID", NULL, BLIST_FORCELUN},
 	{"ADAPTEC", "Adaptec 5400S", NULL, BLIST_FORCELUN},
+	{"BELKIN", "USB 2 HS-CF", "1.95",  BLIST_SPARSELUN},
 	{"CANON", "IPUBJD", NULL, BLIST_SPARSELUN},
 	{"CMD", "CRA-7280", NULL, BLIST_SPARSELUN},	/* CMD RAID Controller */
 	{"CNSI", "G7324", NULL, BLIST_SPARSELUN},	/* Chaparral G7324 RAID */
@@ -138,6 +139,7 @@ static struct {
 	{"EMC", "SYMMETRIX", NULL, BLIST_SPARSELUN | BLIST_LARGELUN | BLIST_FORCELUN},
 	{"EMULEX", "MD21/S2     ESDI", NULL, BLIST_SINGLELUN},
 	{"FSC", "CentricStor", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
+	{"Generic", "USB Storage-SMC", "0180", BLIST_FORCELUN},
 	{"Generic", "USB Storage-SMC", "0207", BLIST_FORCELUN},
 	{"HITACHI", "DF400", "*", BLIST_SPARSELUN},
 	{"HITACHI", "DF500", "*", BLIST_SPARSELUN},
@@ -155,6 +157,7 @@ static struct {
 	{"INSITE", "I325VM", NULL, BLIST_KEY},
 	{"LASOUND", "CDX7405", "3.10", BLIST_MAX5LUN | BLIST_SINGLELUN},
 	{"MATSHITA", "PD-1", NULL, BLIST_FORCELUN | BLIST_SINGLELUN},
+	{"Medion", "Flash XL  MMC/SD", "2.6D", BLIST_FORCELUN},
 	{"MegaRAID", "LD", NULL, BLIST_FORCELUN},
 	{"MICROP", "4110", NULL, BLIST_NOTQ},
 	{"MYLEX", "DACARMRB", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
@@ -171,6 +174,7 @@ static struct {
 	{"SGI", "RAID3", "*", BLIST_SPARSELUN},
 	{"SGI", "RAID5", "*", BLIST_SPARSELUN},
 	{"SGI", "TP9100", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
+	{"SMSC", "USB 2 HS-CF", NULL, BLIST_SPARSELUN},
 	{"SONY", "CD-ROM CDU-8001", NULL, BLIST_BORKEN},
 	{"SONY", "TSL", NULL, BLIST_FORCELUN},		/* DDS3 & DDS4 autoloaders */
 	{"SUN", "T300", "*", BLIST_SPARSELUN},
@@ -329,7 +333,7 @@ int scsi_get_device_flags(struct scsi_de
 	struct scsi_dev_info_list *devinfo;
 	unsigned int bflags;
 
-	bflags = sdev->host->hostt->flags;
+	bflags = sdev->sdev_bflags;
 	if (!bflags)
 		bflags = scsi_default_dev_flags;
 
--- diff/drivers/scsi/scsi_error.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/scsi_error.c	2004-04-21 10:45:34.924394184 +0100
@@ -186,12 +186,16 @@ void scsi_times_out(struct scsi_cmnd *sc
  **/
 int scsi_block_when_processing_errors(struct scsi_device *sdev)
 {
+	int online;
+
 	wait_event(sdev->host->host_wait, (!test_bit(SHOST_RECOVERY, &sdev->host->shost_state)));
 
+	online = scsi_device_online(sdev);
+
 	SCSI_LOG_ERROR_RECOVERY(5, printk("%s: rtn: %d\n", __FUNCTION__,
-					  sdev->online));
+					  online));
 
-	return sdev->online;
+	return online;
 }
 
 #ifdef CONFIG_SCSI_LOGGING
@@ -792,7 +796,8 @@ static int scsi_eh_abort_cmds(struct lis
 		rtn = scsi_try_to_abort_cmd(scmd);
 		if (rtn == SUCCESS) {
 			scsi_eh_eflags_clr(scmd,  SCSI_EH_CANCEL_CMD);
-			if (!scmd->device->online || !scsi_eh_tur(scmd)) {
+			if (!scsi_device_online(scmd->device) ||
+			    !scsi_eh_tur(scmd)) {
 				scsi_eh_finish_cmd(scmd, done_q);
 			}
 				
@@ -920,7 +925,8 @@ static int scsi_eh_stu(struct Scsi_Host 
 						  " 0x%p\n", current->comm, sdev));
 
 		if (!scsi_eh_try_stu(stu_scmd)) {
-			if (!sdev->online || !scsi_eh_tur(stu_scmd)) {
+			if (!scsi_device_online(sdev) ||
+			    !scsi_eh_tur(stu_scmd)) {
 				list_for_each_safe(lh, lh_sf, work_q) {
 					scmd = list_entry(lh, struct scsi_cmnd, eh_entry);
 					if (scmd->device == sdev)
@@ -974,7 +980,8 @@ static int scsi_eh_bus_device_reset(stru
 						  sdev));
 		rtn = scsi_try_bus_device_reset(bdr_scmd);
 		if (rtn == SUCCESS) {
-			if (!sdev->online || !scsi_eh_tur(bdr_scmd)) {
+			if (!scsi_device_online(sdev) ||
+			    !scsi_eh_tur(bdr_scmd)) {
 				list_for_each_safe(lh, lh_sf,
 						   work_q) {
 					scmd = list_entry(lh, struct
@@ -1105,7 +1112,7 @@ static int scsi_eh_bus_reset(struct Scsi
 				scmd = list_entry(lh, struct scsi_cmnd,
 						  eh_entry);
 				if (channel == scmd->device->channel)
-					if (!scmd->device->online ||
+					if (!scsi_device_online(scmd->device) ||
 					    !scsi_eh_tur(scmd))
 						scsi_eh_finish_cmd(scmd,
 								   done_q);
@@ -1143,7 +1150,7 @@ static int scsi_eh_host_reset(struct lis
 		if (rtn == SUCCESS) {
 			list_for_each_safe(lh, lh_sf, work_q) {
 				scmd = list_entry(lh, struct scsi_cmnd, eh_entry);
-				if (!scmd->device->online ||
+				if (!scsi_device_online(scmd->device) ||
 				    (!scsi_eh_try_stu(scmd) && !scsi_eh_tur(scmd)) ||
 				    !scsi_eh_tur(scmd))
 					scsi_eh_finish_cmd(scmd, done_q);
@@ -1178,7 +1185,7 @@ static void scsi_eh_offline_sdevs(struct
 				scmd->device->channel,
 				scmd->device->id,
 				scmd->device->lun);
-		scmd->device->online = FALSE;
+		scsi_device_set_state(scmd->device, SDEV_OFFLINE);
 		if (scsi_eh_eflags_chk(scmd, SCSI_EH_CANCEL_CMD)) {
 			/*
 			 * FIXME: Handle lost cmds.
@@ -1248,7 +1255,7 @@ int scsi_decide_disposition(struct scsi_
 	 * if the device is offline, then we clearly just pass the result back
 	 * up to the top level.
 	 */
-	if (!scmd->device->online) {
+	if (!scsi_device_online(scmd->device)) {
 		SCSI_LOG_ERROR_RECOVERY(5, printk("%s: device offline - report"
 						  " as SUCCESS\n",
 						  __FUNCTION__));
@@ -1480,7 +1487,7 @@ static void scsi_restart_operations(stru
 	 * is no point trying to lock the door of an off-line device.
 	 */
 	shost_for_each_device(sdev, shost) {
-		if (sdev->online && sdev->locked)
+		if (scsi_device_online(sdev) && sdev->locked)
 			scsi_eh_lock_door(sdev);
 	}
 
@@ -1535,8 +1542,9 @@ static void scsi_eh_flush_done_q(struct 
 	list_for_each_safe(lh, lh_sf, done_q) {
 		scmd = list_entry(lh, struct scsi_cmnd, eh_entry);
 		list_del_init(lh);
-		if (scmd->device->online &&
-		    	(++scmd->retries < scmd->allowed)) {
+		if (scsi_device_online(scmd->device) &&
+		    !blk_noretry_request(scmd->request) &&
+		    (++scmd->retries < scmd->allowed)) {
 			SCSI_LOG_ERROR_RECOVERY(3, printk("%s: flush"
 							  " retry cmd: %p\n",
 							  current->comm,
@@ -1620,7 +1628,7 @@ int scsi_error_handler(void *data)
 
 	daemonize("scsi_eh_%d", shost->host_no);
 
-	current->flags |= PF_IOTHREAD;
+	current->flags |= PF_NOFREEZE;
 
 	shost->eh_wait = &sem;
 	shost->ehandler = current;
--- diff/drivers/scsi/scsi_lib.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/scsi_lib.c	2004-04-21 10:45:34.926393880 +0100
@@ -524,10 +524,10 @@ static struct scsi_cmnd *scsi_end_reques
 	 * to queue the remainder of them.
 	 */
 	if (end_that_request_chunk(req, uptodate, bytes)) {
-		int leftover = (req->hard_nr_sectors << 9) - bytes;
+		int leftover = (req->hard_nr_sectors << 9);
 
 		if (blk_pc_request(req))
-			leftover = req->data_len - bytes;
+			leftover = req->data_len;
 
 		/* kill remainder if no retrys */
 		if (!uptodate && blk_noretry_request(req))
@@ -957,10 +957,20 @@ static int scsi_prep_fn(struct request_q
 	struct scsi_cmnd *cmd;
 	int specials_only = 0;
 
-	if(unlikely(sdev->sdev_state != SDEV_RUNNING)) {
+	/*
+	 * Just check to see if the device is online.  If it isn't, we
+	 * refuse to process any commands.  The device must be brought
+	 * online before trying any recovery commands
+	 */
+	if (unlikely(!scsi_device_online(sdev))) {
+		printk(KERN_ERR "scsi%d (%d:%d): rejecting I/O to offline device\n",
+		       sdev->host->host_no, sdev->id, sdev->lun);
+		return BLKPREP_KILL;
+	}
+	if (unlikely(sdev->sdev_state != SDEV_RUNNING)) {
 		/* OK, we're not in a running state don't prep
 		 * user commands */
-		if(sdev->sdev_state == SDEV_DEL) {
+		if (sdev->sdev_state == SDEV_DEL) {
 			/* Device is fully deleted, no commands
 			 * at all allowed down */
 			printk(KERN_ERR "scsi%d (%d:%d): rejecting I/O to dead device\n",
@@ -1005,18 +1015,6 @@ static int scsi_prep_fn(struct request_q
 			
 			
 		/*
-		 * Just check to see if the device is online.  If
-		 * it isn't, we refuse to process ordinary commands
-		 * (we will allow specials just in case someone needs
-		 * to send a command to an offline device without bringing
-		 * it back online)
-		 */
-		if(!sdev->online) {
-			printk(KERN_ERR "scsi%d (%d:%d): rejecting I/O to offline device\n",
-			       sdev->host->host_no, sdev->id, sdev->lun);
-			return BLKPREP_KILL;
-		}
-		/*
 		 * Now try and find a command block that we can use.
 		 */
 		if (!req->special) {
@@ -1205,6 +1203,18 @@ static void scsi_request_fn(struct reque
 		if (!req || !scsi_dev_queue_ready(q, sdev))
 			break;
 
+		if (unlikely(!scsi_device_online(sdev))) {
+			printk(KERN_ERR "scsi%d (%d:%d): rejecting I/O to offline device\n",
+			       sdev->host->host_no, sdev->id, sdev->lun);
+			blkdev_dequeue_request(req);
+			req->flags |= REQ_QUIET;
+			while (end_that_request_first(req, 0, req->nr_sectors))
+				;
+			end_that_request_last(req);
+			continue;
+		}
+
+
 		/*
 		 * Remove the request from the request list.
 		 */
@@ -1556,29 +1566,79 @@ scsi_device_set_state(struct scsi_device
 {
 	enum scsi_device_state oldstate = sdev->sdev_state;
 
-	/* FIXME: eventually we will enforce all the state model
-	 * transitions here */
-
-	if(oldstate == state)
+	if (state == oldstate)
 		return 0;
 
-	switch(state) {
+	switch (state) {
+	case SDEV_CREATED:
+		/* There are no legal states that come back to
+		 * created.  This is the manually initialised start
+		 * state */
+		goto illegal;
+			
 	case SDEV_RUNNING:
-		if(oldstate != SDEV_CREATED && oldstate != SDEV_QUIESCE)
-			return -EINVAL;
+		switch (oldstate) {
+		case SDEV_CREATED:
+		case SDEV_OFFLINE:
+		case SDEV_QUIESCE:
+			break;
+		default:
+			goto illegal;
+		}
 		break;
 
 	case SDEV_QUIESCE:
-		if(oldstate != SDEV_RUNNING)
-			return -EINVAL;
+		switch (oldstate) {
+		case SDEV_RUNNING:
+		case SDEV_OFFLINE:
+			break;
+		default:
+			goto illegal;
+		}
 		break;
 
-	default:
+	case SDEV_OFFLINE:
+		switch (oldstate) {
+		case SDEV_CREATED:
+		case SDEV_RUNNING:
+		case SDEV_QUIESCE:
+			break;
+		default:
+			goto illegal;
+		}
 		break;
+
+	case SDEV_CANCEL:
+		switch (oldstate) {
+		case SDEV_RUNNING:
+			break;
+		default:
+			goto illegal;
+		}
+		break;
+
+	case SDEV_DEL:
+		switch (oldstate) {
+		case SDEV_CREATED:
+		case SDEV_CANCEL:
+		case SDEV_OFFLINE:
+			break;
+		default:
+			goto illegal;
+		}
+		break;
+
 	}
 	sdev->sdev_state = state;
-
 	return 0;
+
+ illegal:
+	dev_printk(KERN_ERR, &sdev->sdev_gendev,
+		   "Illegal state transition %s->%s\n",
+		   scsi_device_state_name(oldstate),
+		   scsi_device_state_name(state));
+	WARN_ON(1);
+	return -EINVAL;
 }
 EXPORT_SYMBOL(scsi_device_set_state);
 
@@ -1601,11 +1661,11 @@ int
 scsi_device_quiesce(struct scsi_device *sdev)
 {
 	int err = scsi_device_set_state(sdev, SDEV_QUIESCE);
-	if(err)
+	if (err)
 		return err;
 
 	scsi_run_queue(sdev->request_queue);
-	while(sdev->device_busy) {
+	while (sdev->device_busy) {
 		schedule_timeout(HZ/5);
 		scsi_run_queue(sdev->request_queue);
 	}
@@ -1625,10 +1685,8 @@ EXPORT_SYMBOL(scsi_device_quiesce);
 void
 scsi_device_resume(struct scsi_device *sdev)
 {
-	if(sdev->sdev_state != SDEV_QUIESCE)
+	if(scsi_device_set_state(sdev, SDEV_RUNNING))
 		return;
-
-	scsi_device_set_state(sdev, SDEV_RUNNING);
 	scsi_run_queue(sdev->request_queue);
 }
 EXPORT_SYMBOL(scsi_device_resume);
--- diff/drivers/scsi/scsi_scan.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/scsi_scan.c	2004-04-21 10:45:34.928393576 +0100
@@ -205,7 +205,6 @@ static struct scsi_device *scsi_alloc_sd
 	sdev->id = id;
 	sdev->lun = lun;
 	sdev->channel = channel;
-	sdev->online = TRUE;
 	sdev->sdev_state = SDEV_CREATED;
 	INIT_LIST_HEAD(&sdev->siblings);
 	INIT_LIST_HEAD(&sdev->same_target_siblings);
@@ -552,7 +551,7 @@ static int scsi_add_lun(struct scsi_devi
 	if (((inq_result[0] >> 5) & 7) == 1) {
 		SCSI_LOG_SCAN_BUS(3, printk(KERN_INFO "scsi scan: peripheral"
 				" qualifier of 1, device offlined\n"));
-		sdev->online = FALSE;
+		scsi_device_set_state(sdev, SDEV_OFFLINE);
 	}
 
 	sdev->removable = (0x80 & inq_result[1]) >> 7;
@@ -647,6 +646,9 @@ static int scsi_add_lun(struct scsi_devi
 	 * may do I/O */
 	scsi_device_set_state(sdev, SDEV_RUNNING);
 
+	if (*bflags & BLIST_MS_192_BYTES_FOR_3F)
+		sdev->use_192_bytes_for_3f = 1;
+
 	if(sdev->host->hostt->slave_configure)
 		sdev->host->hostt->slave_configure(sdev);
 
--- diff/drivers/scsi/scsi_sysfs.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/scsi_sysfs.c	2004-04-21 10:45:34.929393424 +0100
@@ -19,6 +19,32 @@
 #include "scsi_priv.h"
 #include "scsi_logging.h"
 
+static struct {
+	enum scsi_device_state	value;
+	char			*name;
+} sdev_states[] = {
+	{ SDEV_CREATED, "created" },
+	{ SDEV_RUNNING, "running" },
+	{ SDEV_CANCEL, "cancel" },
+	{ SDEV_DEL, "deleted" },
+	{ SDEV_QUIESCE, "quiesce" },
+	{ SDEV_OFFLINE,	"offline" },
+};
+
+const char *scsi_device_state_name(enum scsi_device_state state)
+{
+	int i;
+	char *name = NULL;
+
+	for (i = 0; i < sizeof(sdev_states)/sizeof(sdev_states[0]); i++) {
+		if (sdev_states[i].value == state) {
+			name = sdev_states[i].name;
+			break;
+		}
+	}
+	return name;
+}
+
 static int check_set(unsigned int *val, char *src)
 {
 	char *last;
@@ -222,6 +248,9 @@ sdev_store_##field (struct device *dev, 
 }									\
 static DEVICE_ATTR(field, S_IRUGO | S_IWUSR, sdev_show_##field, sdev_store_##field)
 
+/* Currently we don't export bit fields, but we might in future,
+ * so leave this code in */
+#if 0
 /*
  * sdev_rd_attr: create a function and attribute variable for a
  * read/write bit field.
@@ -260,7 +289,7 @@ static int scsi_sdev_check_buf_bit(const
 	} else
 		return -EINVAL;
 }
-
+#endif
 /*
  * Create the actual show/store functions and data structures.
  */
@@ -271,7 +300,6 @@ sdev_rd_attr (scsi_level, "%d\n");
 sdev_rd_attr (vendor, "%.8s\n");
 sdev_rd_attr (model, "%.16s\n");
 sdev_rd_attr (rev, "%.4s\n");
-sdev_rw_attr_bit (online);
 
 static ssize_t
 store_rescan_field (struct device *dev, const char *buf, size_t count) 
@@ -289,6 +317,44 @@ static ssize_t sdev_store_delete(struct 
 };
 static DEVICE_ATTR(delete, S_IWUSR, NULL, sdev_store_delete);
 
+static ssize_t
+store_state_field(struct device *dev, const char *buf, size_t count)
+{
+	int i;
+	struct scsi_device *sdev = to_scsi_device(dev);
+	enum scsi_device_state state = 0;
+
+	for (i = 0; i < sizeof(sdev_states)/sizeof(sdev_states[0]); i++) {
+		const int len = strlen(sdev_states[i].name);
+		if (strncmp(sdev_states[i].name, buf, len) == 0 &&
+		   buf[len] == '\n') {
+			state = sdev_states[i].value;
+			break;
+		}
+	}
+	if (!state)
+		return -EINVAL;
+
+	if (scsi_device_set_state(sdev, state))
+		return -EINVAL;
+	return count;
+}
+
+static ssize_t
+show_state_field(struct device *dev, char *buf)
+{
+	struct scsi_device *sdev = to_scsi_device(dev);
+	const char *name = scsi_device_state_name(sdev->sdev_state);
+
+	if (!name)
+		return -EINVAL;
+
+	return snprintf(buf, 20, "%s\n", name);
+}
+
+DEVICE_ATTR(state, S_IRUGO | S_IWUSR, show_state_field, store_state_field);
+
+
 /* Default template for device attributes.  May NOT be modified */
 static struct device_attribute *scsi_sysfs_sdev_attrs[] = {
 	&dev_attr_device_blocked,
@@ -298,9 +364,9 @@ static struct device_attribute *scsi_sys
 	&dev_attr_vendor,
 	&dev_attr_model,
 	&dev_attr_rev,
-	&dev_attr_online,
 	&dev_attr_rescan,
 	&dev_attr_delete,
+	&dev_attr_state,
 	NULL
 };
 
@@ -436,18 +502,19 @@ int scsi_sysfs_add_sdev(struct scsi_devi
  **/
 void scsi_remove_device(struct scsi_device *sdev)
 {
-	if (sdev->sdev_state == SDEV_RUNNING || sdev->sdev_state == SDEV_CANCEL) {
-		scsi_device_set_state(sdev, SDEV_DEL);
-		class_device_unregister(&sdev->sdev_classdev);
-		if(sdev->transport_classdev.class)
-			class_device_unregister(&sdev->transport_classdev);
-		device_del(&sdev->sdev_gendev);
-		if (sdev->host->hostt->slave_destroy)
-			sdev->host->hostt->slave_destroy(sdev);
-		if (sdev->host->transportt->cleanup)
-			sdev->host->transportt->cleanup(sdev);
-		put_device(&sdev->sdev_gendev);
-	}
+	if (scsi_device_set_state(sdev, SDEV_CANCEL) != 0)
+		return;
+
+	class_device_unregister(&sdev->sdev_classdev);
+	if (sdev->transport_classdev.class)
+		class_device_unregister(&sdev->transport_classdev);
+	device_del(&sdev->sdev_gendev);
+	scsi_device_set_state(sdev, SDEV_DEL);
+	if (sdev->host->hostt->slave_destroy)
+		sdev->host->hostt->slave_destroy(sdev);
+	if (sdev->host->transportt->cleanup)
+		sdev->host->transportt->cleanup(sdev);
+	put_device(&sdev->sdev_gendev);
 }
 
 int scsi_register_driver(struct device_driver *drv)
--- diff/drivers/scsi/scsi_transport_fc.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/scsi_transport_fc.c	2004-04-21 10:45:34.929393424 +0100
@@ -24,8 +24,26 @@
 #include <scsi/scsi_transport.h>
 #include <scsi/scsi_transport_fc.h>
 
+#define FC_PRINTK(x, l, f, a...)	printk(l "scsi(%d:%d:%d:%d): " f, (x)->host->host_no, (x)->channel, (x)->id, (x)->lun , ##a)
+
 static void transport_class_release(struct class_device *class_dev);
 
+#define FC_NUM_ATTRS 	3	/* increase this if you add attributes */
+#define FC_OTHER_ATTRS 	0	/* increase this if you add "always on"
+				 * attributes */
+
+struct fc_internal {
+	struct scsi_transport_template t;
+	struct fc_function_template *f;
+	/* The actual attributes */
+	struct class_device_attribute private_attrs[FC_NUM_ATTRS];
+	/* The array of null terminated pointers to attributes
+	 * needed by scsi_sysfs.c */
+	struct class_device_attribute *attrs[FC_NUM_ATTRS + FC_OTHER_ATTRS + 1];
+};
+
+#define to_fc_internal(tmpl)	container_of(tmpl, struct fc_internal, t)
+
 struct class fc_transport_class = {
 	.name = "fc_transport",
 	.release = transport_class_release,
@@ -43,7 +61,8 @@ static void __exit fc_transport_exit(voi
 
 static int fc_setup_transport_attrs(struct scsi_device *sdev)
 {
-	/* FIXME: Callback into the driver */
+	/* I'm not sure what values are invalid.  We should pick some invalid
+	 * values for the defaults */
 	fc_node_name(sdev) = -1;
 	fc_port_name(sdev) = -1;
 	fc_port_id(sdev) = -1;
@@ -57,44 +76,114 @@ static void transport_class_release(stru
 	put_device(&sdev->sdev_gendev);
 }
 
-#define fc_transport_show_function(field, format_string, cast)			\
-static ssize_t									\
-show_fc_transport_##field (struct class_device *cdev, char *buf)		\
-{										\
-	struct scsi_device *sdev = transport_class_to_sdev(cdev);		\
-	struct fc_transport_attrs *tp;						\
-	tp = (struct fc_transport_attrs *)&sdev->transport_data;		\
-	return snprintf(buf, 20, format_string, cast tp->field);		\
-}
-
-#define fc_transport_rd_attr(field, format_string)				\
-	fc_transport_show_function(field, format_string, )			\
-static CLASS_DEVICE_ATTR( field, S_IRUGO, show_fc_transport_##field, NULL)
-
-#define fc_transport_rd_attr_cast(field, format_string, cast)			\
-	fc_transport_show_function(field, format_string, (cast))		\
-static CLASS_DEVICE_ATTR( field, S_IRUGO, show_fc_transport_##field, NULL)
+#define fc_transport_show_function(field, format_string, cast)		\
+									\
+static ssize_t								\
+show_fc_transport_##field (struct class_device *cdev, char *buf)	\
+{									\
+	struct scsi_device *sdev = transport_class_to_sdev(cdev);	\
+	struct fc_transport_attrs *tp;					\
+	struct fc_internal *i = to_fc_internal(sdev->host->transportt);	\
+	tp = (struct fc_transport_attrs *)&sdev->transport_data;	\
+	if (i->f->get_##field)						\
+		i->f->get_##field(sdev);				\
+	return snprintf(buf, 20, format_string, cast tp->field);	\
+}
+
+#define fc_transport_store_function(field, format_string)		\
+static ssize_t								\
+store_fc_transport_##field(struct class_device *cdev, const char *buf,	\
+			   size_t count)				\
+{									\
+	int val;							\
+	struct scsi_device *sdev = transport_class_to_sdev(cdev);	\
+	struct fc_internal *i = to_fc_internal(sdev->host->transportt);	\
+									\
+	val = simple_strtoul(buf, NULL, 0);				\
+	i->f->set_##field(sdev, val);					\
+	return count;							\
+}
+
+#define fc_transport_rd_attr(field, format_string)			\
+	fc_transport_show_function(field, format_string, )		\
+static CLASS_DEVICE_ATTR(field, S_IRUGO,				\
+			 show_fc_transport_##field, NULL)
+
+#define fc_transport_rd_attr_cast(field, format_string, cast)		\
+	fc_transport_show_function(field, format_string, (cast))	\
+static CLASS_DEVICE_ATTR( field, S_IRUGO,				\
+			  show_fc_transport_##field, NULL)
+
+#define fc_transport_rw_attr(field, format_string)			\
+	fc_transport_show_function(field, format_string, )		\
+	fc_transport_store_function(field, format_string)		\
+static CLASS_DEVICE_ATTR(field, S_IRUGO | S_IWUSR,			\
+			show_fc_transport_##field,			\
+			store_fc_transport_##field)
 
 /* the FiberChannel Tranport Attributes: */
 fc_transport_rd_attr_cast(node_name, "0x%llx\n", unsigned long long);
 fc_transport_rd_attr_cast(port_name, "0x%llx\n", unsigned long long);
 fc_transport_rd_attr(port_id, "0x%06x\n");
 
-struct class_device_attribute *fc_transport_attrs[] = {
-	&class_device_attr_node_name,
-	&class_device_attr_port_name,
-	&class_device_attr_port_id,
-	NULL
-};
+#define SETUP_ATTRIBUTE_RD(field)				\
+	i->private_attrs[count] = class_device_attr_##field;	\
+	i->private_attrs[count].attr.mode = S_IRUGO;		\
+	i->private_attrs[count].store = NULL;			\
+	i->attrs[count] = &i->private_attrs[count];		\
+	if (i->f->show_##field)					\
+		count++
+
+#define SETUP_ATTRIBUTE_RW(field)				\
+	i->private_attrs[count] = class_device_attr_##field;	\
+	if (!i->f->set_##field) {				\
+		i->private_attrs[count].attr.mode = S_IRUGO;	\
+		i->private_attrs[count].store = NULL;		\
+	}							\
+	i->attrs[count] = &i->private_attrs[count];		\
+	if (i->f->show_##field)					\
+		count++
+
+struct scsi_transport_template *
+fc_attach_transport(struct fc_function_template *ft)
+{
+	struct fc_internal *i = kmalloc(sizeof(struct fc_internal),
+					GFP_KERNEL);
+	int count = 0;
+
+	if (unlikely(!i))
+		return NULL;
+
+	memset(i, 0, sizeof(struct fc_internal));
+
+	i->t.attrs = &i->attrs[0];
+	i->t.class = &fc_transport_class;
+	i->t.setup = &fc_setup_transport_attrs;
+	i->t.size = sizeof(struct fc_transport_attrs);
+	i->f = ft;
+
+	SETUP_ATTRIBUTE_RD(port_id);
+	SETUP_ATTRIBUTE_RD(port_name);
+	SETUP_ATTRIBUTE_RD(node_name);
+
+	BUG_ON(count > FC_NUM_ATTRS);
+
+	/* Setup the always-on attributes here */
+
+	i->attrs[count] = NULL;
+
+	return &i->t;
+}
+EXPORT_SYMBOL(fc_attach_transport);
+
+void fc_release_transport(struct scsi_transport_template *t)
+{
+	struct fc_internal *i = to_fc_internal(t);
+
+	kfree(i);
+}
+EXPORT_SYMBOL(fc_release_transport);
 
-struct scsi_transport_template fc_transport_template = {
-	.attrs = fc_transport_attrs,
-	.class = &fc_transport_class,
-	.setup = &fc_setup_transport_attrs,
-	.cleanup = NULL,
-	.size = sizeof(struct fc_transport_attrs) - sizeof(unsigned long),
-};
-EXPORT_SYMBOL(fc_transport_template);
 
 MODULE_AUTHOR("Martin Hicks");
 MODULE_DESCRIPTION("FC Transport Attributes");
--- diff/drivers/scsi/scsi_transport_spi.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/scsi_transport_spi.c	2004-04-21 10:45:34.930393272 +0100
@@ -38,10 +38,14 @@
 static void transport_class_release(struct class_device *class_dev);
 
 #define SPI_NUM_ATTRS 10	/* increase this if you add attributes */
+#define SPI_OTHER_ATTRS 1	/* Increase this if you add "always
+				 * on" attributes */
 
 #define SPI_MAX_ECHO_BUFFER_SIZE	4096
 
+/* Private data accessors (keep these out of the header file) */
 #define spi_dv_pending(x) (((struct spi_transport_attrs *)&(x)->transport_data)->dv_pending)
+#define spi_dv_sem(x) (((struct spi_transport_attrs *)&(x)->transport_data)->dv_sem)
 
 struct spi_internal {
 	struct scsi_transport_template t;
@@ -50,7 +54,7 @@ struct spi_internal {
 	struct class_device_attribute private_attrs[SPI_NUM_ATTRS];
 	/* The array of null terminated pointers to attributes 
 	 * needed by scsi_sysfs.c */
-	struct class_device_attribute *attrs[SPI_NUM_ATTRS + 1];
+	struct class_device_attribute *attrs[SPI_NUM_ATTRS + SPI_OTHER_ATTRS + 1];
 };
 
 #define to_spi_internal(tmpl)	container_of(tmpl, struct spi_internal, t)
@@ -104,6 +108,7 @@ static int spi_setup_transport_attrs(str
 	spi_rti(sdev) = 0;
 	spi_pcomp_en(sdev) = 0;
 	spi_dv_pending(sdev) = 0;
+	init_MUTEX(&spi_dv_sem(sdev));
 
 	return 0;
 }
@@ -160,6 +165,16 @@ spi_transport_rd_attr(rd_strm, "%d\n");
 spi_transport_rd_attr(rti, "%d\n");
 spi_transport_rd_attr(pcomp_en, "%d\n");
 
+static ssize_t
+store_spi_revalidate(struct class_device *cdev, const char *buf, size_t count)
+{
+	struct scsi_device *sdev = transport_class_to_sdev(cdev);
+
+	spi_dv_device(sdev);
+	return count;
+}
+static CLASS_DEVICE_ATTR(revalidate, S_IWUSR, NULL, store_spi_revalidate)
+
 /* Translate the period into ns according to the current spec
  * for SDTR/PPR messages */
 static ssize_t show_spi_transport_period(struct class_device *cdev, char *buf)
@@ -246,7 +261,8 @@ static CLASS_DEVICE_ATTR(period, S_IRUGO
 
 #define DV_LOOPS	3
 #define DV_TIMEOUT	(10*HZ)
-#define DV_RETRIES	5
+#define DV_RETRIES	3	/* should only need at most 
+				 * two cc/ua clears */
 
 
 /* This is for read/write Domain Validation:  If the device supports
@@ -307,7 +323,8 @@ spi_dv_device_echo_buffer(struct scsi_re
 		sreq->sr_data_direction = DMA_TO_DEVICE;
 		scsi_wait_req(sreq, spi_write_buffer, buffer, len,
 			      DV_TIMEOUT, DV_RETRIES);
-		if(sreq->sr_result) {
+		if(sreq->sr_result || !scsi_device_online(sdev)) {
+			scsi_device_set_state(sdev, SDEV_QUIESCE);
 			SPI_PRINTK(sdev, KERN_ERR, "Write Buffer failure %x\n", sreq->sr_result);
 			return 0;
 		}
@@ -317,6 +334,7 @@ spi_dv_device_echo_buffer(struct scsi_re
 		sreq->sr_data_direction = DMA_FROM_DEVICE;
 		scsi_wait_req(sreq, spi_read_buffer, ptr, len,
 			      DV_TIMEOUT, DV_RETRIES);
+		scsi_device_set_state(sdev, SDEV_QUIESCE);
 
 		if (memcmp(buffer, ptr, len) != 0)
 			return 0;
@@ -332,6 +350,7 @@ spi_dv_device_compare_inquiry(struct scs
 {
 	int r;
 	const int len = sreq->sr_device->inquiry_len;
+	struct scsi_device *sdev = sreq->sr_device;
 	const char spi_inquiry[] = {
 		INQUIRY, 0, 0, 0, len, 0
 	};
@@ -344,6 +363,11 @@ spi_dv_device_compare_inquiry(struct scs
 
 		scsi_wait_req(sreq, spi_inquiry, ptr, len,
 			      DV_TIMEOUT, DV_RETRIES);
+		
+		if(sreq->sr_result || !scsi_device_online(sdev)) {
+			scsi_device_set_state(sdev, SDEV_QUIESCE);
+			return 0;
+		}
 
 		/* If we don't have the inquiry data already, the
 		 * first read gets it */
@@ -466,7 +490,7 @@ spi_dv_device_internal(struct scsi_reque
 	}
 
 	/* test width */
-	if (i->f->set_width) {
+	if (i->f->set_width && sdev->wdtr) {
 		i->f->set_width(sdev, 1);
 
 		if (!spi_dv_device_compare_inquiry(sreq, buffer,
@@ -480,6 +504,10 @@ spi_dv_device_internal(struct scsi_reque
 	if (!i->f->set_period)
 		return;
 
+	/* device can't handle synchronous */
+	if(!sdev->ppr && !sdev->sdtr)
+		return;
+
 	/* now set up to the maximum */
 	DV_SET(offset, 255);
 	DV_SET(period, 1);
@@ -536,12 +564,18 @@ spi_dv_device(struct scsi_device *sdev)
 	if (unlikely(scsi_device_quiesce(sdev)))
 		goto out_free;
 
+	spi_dv_pending(sdev) = 1;
+	down(&spi_dv_sem(sdev));
+
 	SPI_PRINTK(sdev, KERN_INFO, "Beginning Domain Validation\n");
 
 	spi_dv_device_internal(sreq, buffer);
 
 	SPI_PRINTK(sdev, KERN_INFO, "Ending Domain Validation\n");
 
+	up(&spi_dv_sem(sdev));
+	spi_dv_pending(sdev) = 0;
+
 	scsi_device_resume(sdev);
 
  out_free:
@@ -593,7 +627,8 @@ spi_schedule_dv_device(struct scsi_devic
 		kfree(wqw);
 		return;
 	}
-
+	/* Set pending early (dv_device doesn't check it, only sets it) */
+	spi_dv_pending(sdev) = 1;
 	if (unlikely(scsi_device_get(sdev))) {
 		kfree(wqw);
 		spi_dv_pending(sdev) = 0;
@@ -632,7 +667,7 @@ spi_attach_transport(struct spi_function
 	i->t.attrs = &i->attrs[0];
 	i->t.class = &spi_transport_class;
 	i->t.setup = &spi_setup_transport_attrs;
-	i->t.size = sizeof(struct spi_transport_attrs) - sizeof(unsigned long);
+	i->t.size = sizeof(struct spi_transport_attrs);
 	i->f = ft;
 
 	SETUP_ATTRIBUTE(period);
@@ -650,6 +685,8 @@ spi_attach_transport(struct spi_function
 	 * this bug will trigger */
 	BUG_ON(count > SPI_NUM_ATTRS);
 
+	i->attrs[count++] = &class_device_attr_revalidate;
+
 	i->attrs[count] = NULL;
 
 	return &i->t;
--- diff/drivers/scsi/sd.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/sd.c	2004-04-21 10:45:34.932392968 +0100
@@ -48,6 +48,7 @@
 #include <linux/vmalloc.h>
 #include <linux/blkdev.h>
 #include <linux/blkpg.h>
+#include <linux/kref.h>
 #include <asm/uaccess.h>
 
 #include "scsi.h"
@@ -77,16 +78,12 @@
  */
 #define SD_MAX_RETRIES		5
 
-static void scsi_disk_release (struct kobject *kobj);
-
-static struct kobj_type scsi_disk_kobj_type = {
-	.release = scsi_disk_release,
-};
+static void scsi_disk_release(struct kref *kref);
 
 struct scsi_disk {
 	struct scsi_driver *driver;	/* always &sd_template */
 	struct scsi_device *device;
-	struct kobject	kobj;
+	struct kref	kref;
 	struct gendisk	*disk;
 	unsigned int	openers;	/* protected by BKL for now, yuck */
 	sector_t	capacity;	/* size in 512-byte sectors */
@@ -101,6 +98,11 @@ struct scsi_disk {
 static unsigned long sd_index_bits[SD_DISKS / BITS_PER_LONG];
 static spinlock_t sd_index_lock = SPIN_LOCK_UNLOCKED;
 
+/* This semaphore is used to mediate the 0->1 reference get in the
+ * face of object destruction (i.e. we can't allow a get on an
+ * object after last put) */
+static DECLARE_MUTEX(sd_ref_sem);
+
 static int sd_revalidate_disk(struct gendisk *disk);
 static void sd_rw_intr(struct scsi_cmnd * SCpnt);
 
@@ -161,31 +163,33 @@ static unsigned int make_sd_dev(unsigned
 
 /* reverse mapping dev -> (sd_nr, part) not currently needed */
 
-#define to_scsi_disk(obj) container_of(obj,struct scsi_disk,kobj);
+#define to_scsi_disk(obj) container_of(obj,struct scsi_disk,kref)
 
 static inline struct scsi_disk *scsi_disk(struct gendisk *disk)
 {
 	return container_of(disk->private_data, struct scsi_disk, driver);
 }
 
-static int scsi_disk_get(struct scsi_disk *sdkp)
+static struct scsi_disk *scsi_disk_get(struct gendisk *disk)
 {
-	if (!kobject_get(&sdkp->kobj))
-		goto out;
-	if (scsi_device_get(sdkp->device))
-		goto out_put_kobj;
-	return 0;
+	struct scsi_disk *sdkp = NULL;
 
-out_put_kobj:
-	kobject_put(&sdkp->kobj);
-out:
-	return -ENXIO;
+	down(&sd_ref_sem);
+	if (disk->private_data == NULL)
+		goto out;
+	sdkp = scsi_disk(disk);
+	if (!kref_get(&sdkp->kref))
+		sdkp = NULL;
+ out:
+	up(&sd_ref_sem);
+	return sdkp;
 }
 
 static void scsi_disk_put(struct scsi_disk *sdkp)
 {
-	scsi_device_put(sdkp->device);
-	kobject_put(&sdkp->kobj);
+	down(&sd_ref_sem);
+	kref_put(&sdkp->kref);
+	up(&sd_ref_sem);
 }
 
 /**
@@ -245,7 +249,7 @@ static int sd_init_command(struct scsi_c
 	SCSI_LOG_HLQUEUE(1, printk("sd_init_command: disk=%s, block=%llu, "
 			    "count=%d\n", disk->disk_name, (unsigned long long)block, this_count));
 
-	if (!sdp || !sdp->online ||
+	if (!sdp || !scsi_device_online(sdp) ||
  	    block + SCpnt->request->nr_sectors > get_capacity(disk)) {
 		SCSI_LOG_HLQUEUE(2, printk("Finishing %ld sectors\n", 
 				 SCpnt->request->nr_sectors));
@@ -406,15 +410,15 @@ queue:
 static int sd_open(struct inode *inode, struct file *filp)
 {
 	struct gendisk *disk = inode->i_bdev->bd_disk;
-	struct scsi_disk *sdkp = scsi_disk(disk);
+	struct scsi_disk *sdkp;
 	struct scsi_device *sdev;
 	int retval;
 
-	SCSI_LOG_HLQUEUE(3, printk("sd_open: disk=%s\n", disk->disk_name));
+	if (!(sdkp = scsi_disk_get(disk)))
+		return -ENXIO;
 
-	retval = scsi_disk_get(sdkp);
-	if (retval)
-		return retval;
+
+	SCSI_LOG_HLQUEUE(3, printk("sd_open: disk=%s\n", disk->disk_name));
 
 	sdev = sdkp->device;
 
@@ -452,7 +456,7 @@ static int sd_open(struct inode *inode, 
 	 * open actually succeeded.
 	 */
 	retval = -ENXIO;
-	if (!sdev->online)
+	if (!scsi_device_online(sdev))
 		goto error_out;
 
 	if (!sdkp->openers++ && sdev->removable) {
@@ -619,7 +623,7 @@ static int sd_media_changed(struct gendi
 	 * can deal with it then.  It is only because of unrecoverable errors
 	 * that we would ever take a device offline in the first place.
 	 */
-	if (!sdp->online)
+	if (!scsi_device_online(sdp))
 		goto not_present;
 
 	/*
@@ -1122,26 +1126,32 @@ sd_read_write_protect_flag(struct scsi_d
 		return;
 	}
 
-	/*
-	 * First attempt: ask for all pages (0x3F), but only 4 bytes.
-	 * We have to start carefully: some devices hang if we ask
-	 * for more than is available.
-	 */
-	res = sd_do_mode_sense(SRpnt, 0, 0x3F, buffer, 4, &data);
+	if (sdkp->device->use_192_bytes_for_3f) {
+		res = sd_do_mode_sense(SRpnt, 0, 0x3F, buffer, 192, &data);
+	} else {
+		/*
+		 * First attempt: ask for all pages (0x3F), but only 4 bytes.
+		 * We have to start carefully: some devices hang if we ask
+		 * for more than is available.
+		 */
+		res = sd_do_mode_sense(SRpnt, 0, 0x3F, buffer, 4, &data);
 
-	/*
-	 * Second attempt: ask for page 0
-	 * When only page 0 is implemented, a request for page 3F may return
-	 * Sense Key 5: Illegal Request, Sense Code 24: Invalid field in CDB.
-	 */
-	if (!scsi_status_is_good(res))
-		res = sd_do_mode_sense(SRpnt, 0, 0, buffer, 4, &data);
+		/*
+		 * Second attempt: ask for page 0 When only page 0 is
+		 * implemented, a request for page 3F may return Sense Key
+		 * 5: Illegal Request, Sense Code 24: Invalid field in
+		 * CDB.
+		 */
+		if (!scsi_status_is_good(res))
+			res = sd_do_mode_sense(SRpnt, 0, 0, buffer, 4, &data);
 
-	/*
-	 * Third attempt: ask 255 bytes, as we did earlier.
-	 */
-	if (!scsi_status_is_good(res))
-		res = sd_do_mode_sense(SRpnt, 0, 0x3F, buffer, 255, &data);
+		/*
+		 * Third attempt: ask 255 bytes, as we did earlier.
+		 */
+		if (!scsi_status_is_good(res))
+			res = sd_do_mode_sense(SRpnt, 0, 0x3F, buffer, 255,
+					       &data);
+	}
 
 	if (!scsi_status_is_good(res)) {
 		printk(KERN_WARNING
@@ -1254,7 +1264,7 @@ static int sd_revalidate_disk(struct gen
 	 * If the device is offline, don't try and read capacity or any
 	 * of the other niceties.
 	 */
-	if (!sdp->online)
+	if (!scsi_device_online(sdp))
 		goto out;
 
 	sreq = scsi_allocate_request(sdp, GFP_KERNEL);
@@ -1332,17 +1342,19 @@ static int sd_probe(struct device *dev)
 	if ((sdp->type != TYPE_DISK) && (sdp->type != TYPE_MOD))
 		goto out;
 
+	if ((error = scsi_device_get(sdp)) != 0)
+		goto out;
+
 	SCSI_LOG_HLQUEUE(3, printk("sd_attach: scsi device: <%d,%d,%d,%d>\n", 
 			 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun));
 
 	error = -ENOMEM;
 	sdkp = kmalloc(sizeof(*sdkp), GFP_KERNEL);
 	if (!sdkp)
-		goto out;
+		goto out_put_sdev;
 
 	memset (sdkp, 0, sizeof(*sdkp));
-	kobject_init(&sdkp->kobj);
-	sdkp->kobj.ktype = &scsi_disk_kobj_type;
+	kref_init(&sdkp->kref, scsi_disk_release);
 
 	/* Note: We can accomodate 64 partitions, but the genhd code
 	 * assumes partitions allocate consecutive minors, which they don't.
@@ -1415,6 +1427,8 @@ out_put:
 	put_disk(gd);
 out_free:
 	kfree(sdkp);
+out_put_sdev:
+	scsi_device_put(sdp);
 out:
 	return error;
 }
@@ -1436,26 +1450,37 @@ static int sd_remove(struct device *dev)
 
 	del_gendisk(sdkp->disk);
 	sd_shutdown(dev);
-	kobject_put(&sdkp->kobj);
+	scsi_disk_put(sdkp);
 
 	return 0;
 }
 
 /**
  *	scsi_disk_release - Called to free the scsi_disk structure
- *	@kobj: pointer to embedded kobject
+ *	@kref: pointer to embedded kref
+ *
+ *	sd_ref_sem must be held entering this routine.  Because it is
+ *	called on last put, you should always use the scsi_disk_get()
+ *	scsi_disk_put() helpers which manipulate the semaphore directly
+ *	and never do a direct kref_put().
  **/
-static void scsi_disk_release(struct kobject *kobj)
+static void scsi_disk_release(struct kref *kref)
 {
-	struct scsi_disk *sdkp = to_scsi_disk(kobj);
+	struct scsi_disk *sdkp = to_scsi_disk(kref);
+	struct scsi_device *sdev = sdkp->device;
+	struct gendisk *disk = sdkp->disk;
 	
-	put_disk(sdkp->disk);
-
 	spin_lock(&sd_index_lock);
 	clear_bit(sdkp->index, sd_index_bits);
 	spin_unlock(&sd_index_lock);
 
+	disk->private_data = NULL;
+
+	put_disk(disk);
+
 	kfree(sdkp);
+
+	scsi_device_put(sdev);
 }
 
 /*
@@ -1474,7 +1499,7 @@ static void sd_shutdown(struct device *d
 	if (!sdkp)
                return;         /* this can happen */
 
-	if (!sdp->online || !sdkp->WCE)
+	if (!scsi_device_online(sdp) || !sdkp->WCE)
 		return;
 
 	printk(KERN_NOTICE "Synchronizing SCSI cache for disk %s: ",
--- diff/drivers/scsi/sg.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/sg.c	2004-04-21 10:45:34.943391296 +0100
@@ -2920,7 +2920,7 @@ static int sg_proc_seq_show_dev(struct s
 			      1,
 			      (int) scsidp->queue_depth,
 			      (int) scsidp->device_busy,
-			      (int) scsidp->online);
+			      (int) scsi_device_online(scsidp));
 	else
 		seq_printf(s, "-1\t-1\t-1\t-1\t-1\t-1\t-1\t-1\t-1\n");
 	return 0;
--- diff/drivers/scsi/sr.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/sr.c	2004-04-21 10:45:34.945390992 +0100
@@ -87,6 +87,11 @@ static struct scsi_driver sr_template = 
 static unsigned long sr_index_bits[SR_DISKS / BITS_PER_LONG];
 static spinlock_t sr_index_lock = SPIN_LOCK_UNLOCKED;
 
+/* This semaphore is used to mediate the 0->1 reference get in the
+ * face of object destruction (i.e. we can't allow a get on an
+ * object after last put) */
+static DECLARE_MUTEX(sr_ref_sem);
+
 static int sr_open(struct cdrom_device_info *, int);
 static void sr_release(struct cdrom_device_info *);
 
@@ -113,6 +118,39 @@ static struct cdrom_device_ops sr_dops =
 	.generic_packet		= sr_packet,
 };
 
+static void sr_kref_release(struct kref *kref);
+
+static inline struct scsi_cd *scsi_cd(struct gendisk *disk)
+{
+	return container_of(disk->private_data, struct scsi_cd, driver);
+}
+
+/*
+ * The get and put routines for the struct scsi_cd.  Note this entity
+ * has a scsi_device pointer and owns a reference to this.
+ */
+static inline struct scsi_cd *scsi_cd_get(struct gendisk *disk)
+{
+	struct scsi_cd *cd = NULL;
+
+	down(&sr_ref_sem);
+	if (disk->private_data == NULL)
+		goto out;
+	cd = scsi_cd(disk);
+	if (!kref_get(&cd->kref))
+		cd = NULL;
+ out:
+	up(&sr_ref_sem);
+	return cd;
+}
+
+static inline void scsi_cd_put(struct scsi_cd *cd)
+{
+	down(&sr_ref_sem);
+	kref_put(&cd->kref);
+	up(&sr_ref_sem);
+}
+
 /*
  * This function checks to see if the media has been changed in the
  * CDROM drive.  It is possible that we have already sensed a change,
@@ -165,11 +203,6 @@ int sr_media_change(struct cdrom_device_
 	return retval;
 }
  
-static inline struct scsi_cd *scsi_cd(struct gendisk *disk)
-{
-	return container_of(disk->private_data, struct scsi_cd, driver);
-}
-
 /*
  * rw_intr is the interrupt routine for the device driver.
  *
@@ -267,7 +300,7 @@ static int sr_init_command(struct scsi_c
 	SCSI_LOG_HLQUEUE(1, printk("Doing sr request, dev = %s, block = %d\n",
 				cd->disk->disk_name, block));
 
-	if (!cd->device || !cd->device->online) {
+	if (!cd->device || !scsi_device_online(cd->device)) {
 		SCSI_LOG_HLQUEUE(2, printk("Finishing %ld sectors\n",
 					SCpnt->request->nr_sectors));
 		SCSI_LOG_HLQUEUE(2, printk("Retry with 0x%p\n", SCpnt));
@@ -418,14 +451,30 @@ queue:
 
 static int sr_block_open(struct inode *inode, struct file *file)
 {
+	struct gendisk *disk = inode->i_bdev->bd_disk;
 	struct scsi_cd *cd = scsi_cd(inode->i_bdev->bd_disk);
-	return cdrom_open(&cd->cdi, inode, file);
+	int ret = 0;
+
+	if(!(cd = scsi_cd_get(disk)))
+		return -ENXIO;
+
+	if((ret = cdrom_open(&cd->cdi, inode, file)) != 0)
+		scsi_cd_put(cd);
+
+	return ret;
 }
 
 static int sr_block_release(struct inode *inode, struct file *file)
 {
+	int ret;
 	struct scsi_cd *cd = scsi_cd(inode->i_bdev->bd_disk);
-	return cdrom_release(&cd->cdi, file);
+	ret = cdrom_release(&cd->cdi, file);
+	if(ret)
+		return ret;
+	
+	scsi_cd_put(cd);
+
+	return 0;
 }
 
 static int sr_block_ioctl(struct inode *inode, struct file *file, unsigned cmd,
@@ -467,10 +516,6 @@ static int sr_open(struct cdrom_device_i
 	struct scsi_device *sdev = cd->device;
 	int retval;
 
-	retval = scsi_device_get(sdev);
-	if (retval)
-		return retval;
-	
 	/*
 	 * If the device is in error recovery, wait until it is done.
 	 * If the device is offline, then disallow any access to it.
@@ -489,7 +534,7 @@ static int sr_open(struct cdrom_device_i
 	return 0;
 
 error_out:
-	scsi_device_put(sdev);
+	scsi_cd_put(cd);
 	return retval;	
 }
 
@@ -500,7 +545,6 @@ static void sr_release(struct cdrom_devi
 	if (cd->device->sector_size > 2048)
 		sr_set_blocklength(cd, 2048);
 
-	scsi_device_put(cd->device);
 }
 
 static int sr_probe(struct device *dev)
@@ -514,12 +558,17 @@ static int sr_probe(struct device *dev)
 	if (sdev->type != TYPE_ROM && sdev->type != TYPE_WORM)
 		goto fail;
 
+	if ((error = scsi_device_get(sdev)) != 0)
+		goto fail;
+
 	error = -ENOMEM;
 	cd = kmalloc(sizeof(*cd), GFP_KERNEL);
 	if (!cd)
-		goto fail;
+		goto fail_put_sdev;
 	memset(cd, 0, sizeof(*cd));
 
+	kref_init(&cd->kref, sr_kref_release);
+
 	disk = alloc_disk(1);
 	if (!disk)
 		goto fail_free;
@@ -588,6 +637,8 @@ fail_put:
 	put_disk(disk);
 fail_free:
 	kfree(cd);
+fail_put_sdev:
+	scsi_device_put(sdev);
 fail:
 	return error;
 }
@@ -863,20 +914,44 @@ static int sr_packet(struct cdrom_device
 	return cgc->stat;
 }
 
-static int sr_remove(struct device *dev)
+/**
+ *	sr_kref_release - Called to free the scsi_cd structure
+ *	@kref: pointer to embedded kref
+ *
+ *	sr_ref_sem must be held entering this routine.  Because it is
+ *	called on last put, you should always use the scsi_cd_get()
+ *	scsi_cd_put() helpers which manipulate the semaphore directly
+ *	and never do a direct kref_put().
+ **/
+static void sr_kref_release(struct kref *kref)
 {
-	struct scsi_cd *cd = dev_get_drvdata(dev);
-
-	del_gendisk(cd->disk);
+	struct scsi_cd *cd = container_of(kref, struct scsi_cd, kref);
+	struct scsi_device *sdev = cd->device;
+	struct gendisk *disk = cd->disk;
 
 	spin_lock(&sr_index_lock);
-	clear_bit(cd->disk->first_minor, sr_index_bits);
+	clear_bit(disk->first_minor, sr_index_bits);
 	spin_unlock(&sr_index_lock);
 
-	put_disk(cd->disk);
 	unregister_cdrom(&cd->cdi);
+
+	disk->private_data = NULL;
+
+	put_disk(disk);
+
 	kfree(cd);
 
+	scsi_device_put(sdev);
+}
+
+static int sr_remove(struct device *dev)
+{
+	struct scsi_cd *cd = dev_get_drvdata(dev);
+
+	del_gendisk(cd->disk);
+
+	scsi_cd_put(cd);
+
 	return 0;
 }
 
--- diff/drivers/scsi/sr.h	2003-06-30 10:07:23.000000000 +0100
+++ source/drivers/scsi/sr.h	2004-04-21 10:45:34.945390992 +0100
@@ -19,6 +19,7 @@
 
 #include "scsi.h"
 #include <linux/genhd.h>
+#include <linux/kref.h>
 
 /* The CDROM is fairly slow, so we need a little extra time */
 /* In fact, it is very slow if it has to spin up first */
@@ -36,6 +37,9 @@ typedef struct scsi_cd {
 	unsigned readcd_known:1;	/* drive supports READ_CD (0xbe) */
 	unsigned readcd_cdda:1;	/* reading audio data using READ_CD */
 	struct cdrom_device_info cdi;
+	/* We hold gendisk and scsi_device references on probe and use
+	 * the refs on this kref to decide when to release them */
+	struct kref kref;
 	struct gendisk *disk;
 } Scsi_CD;
 
--- diff/drivers/scsi/sym53c8xx_2/sym_glue.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/sym53c8xx_2/sym_glue.c	2004-04-21 10:45:34.958389016 +0100
@@ -57,6 +57,10 @@
 #include <linux/module.h>
 #include <linux/spinlock.h>
 #include <scsi/scsi.h>
+#include <scsi/scsi_tcq.h>
+#include <scsi/scsi_device.h>
+#include <scsi/scsi_transport.h>
+#include <scsi/scsi_transport_spi.h>
 
 #include "sym_glue.h"
 #include "sym_nvram.h"
@@ -87,6 +91,8 @@ pci_get_base_address(struct pci_dev *pde
 /* This lock protects only the memory allocation/free.  */
 spinlock_t sym53c8xx_lock = SPIN_LOCK_UNLOCKED;
 
+static struct scsi_transport_template *sym2_transport_template = NULL;
+
 /*
  *  Wrappers to the generic memory allocator.
  */
@@ -171,7 +177,7 @@ struct sym_ucmd {		/* Override the SCSI 
 
 static void __unmap_scsi_data(struct pci_dev *pdev, struct scsi_cmnd *cmd)
 {
-	int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
+	int dma_dir = cmd->sc_data_direction;
 
 	switch(SYM_UCMD_PTR(cmd)->data_mapped) {
 	case 2:
@@ -188,7 +194,7 @@ static void __unmap_scsi_data(struct pci
 static dma_addr_t __map_scsi_single_data(struct pci_dev *pdev, struct scsi_cmnd *cmd)
 {
 	dma_addr_t mapping;
-	int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
+	int dma_dir = cmd->sc_data_direction;
 
 	mapping = pci_map_single(pdev, cmd->request_buffer,
 				 cmd->request_bufflen, dma_dir);
@@ -203,7 +209,7 @@ static dma_addr_t __map_scsi_single_data
 static int __map_scsi_sg_data(struct pci_dev *pdev, struct scsi_cmnd *cmd)
 {
 	int use_sg;
-	int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
+	int dma_dir = cmd->sc_data_direction;
 
 	use_sg = pci_map_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
 	if (use_sg > 0) {
@@ -216,7 +222,7 @@ static int __map_scsi_sg_data(struct pci
 
 static void __sync_scsi_data_for_cpu(struct pci_dev *pdev, struct scsi_cmnd *cmd)
 {
-	int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
+	int dma_dir = cmd->sc_data_direction;
 
 	switch(SYM_UCMD_PTR(cmd)->data_mapped) {
 	case 2:
@@ -231,7 +237,7 @@ static void __sync_scsi_data_for_cpu(str
 
 static void __sync_scsi_data_for_device(struct pci_dev *pdev, struct scsi_cmnd *cmd)
 {
-	int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
+	int dma_dir = cmd->sc_data_direction;
 
 	switch(SYM_UCMD_PTR(cmd)->data_mapped) {
 	case 2:
@@ -378,6 +384,13 @@ void sym_set_cam_result_error(struct sym
 			}
 #endif
 		} else {
+			/*
+			 * Error return from our internal request sense.  This
+			 * is bad: we must clear the contingent allegiance
+			 * condition otherwise the device will always return
+			 * BUSY.  Use a big stick.
+			 */
+			sym_reset_scsi_target(np, csio->device->id);
 			cam_status = DID_ERROR;
 		}
 	} else if (cp->host_status == HS_COMPLETE) 	/* Bad SCSI status */
@@ -594,7 +607,7 @@ int sym_setup_data_and_start(struct sym_
 	 *  No direction means no data.
 	 */
 	dir = csio->sc_data_direction;
-	if (dir != SCSI_DATA_NONE) {
+	if (dir != DMA_NONE) {
 		cp->segments = sym_scatter(np, cp, csio);
 		if (cp->segments < 0) {
 			if (cp->segments == -2)
@@ -918,7 +931,6 @@ prepare:
 	switch(to_do) {
 	default:
 	case SYM_EH_DO_IGNORE:
-		goto finish;
 		break;
 	case SYM_EH_DO_WAIT:
 		init_MUTEX_LOCKED(&ep->sem);
@@ -958,7 +970,6 @@ prepare:
 		to_do = SYM_EH_DO_IGNORE;
 	}
 
-finish:
 	ep->to_do = to_do;
 	/* Complete the command with locks held as required by the driver */
 	if (to_do == SYM_EH_DO_COMPLETE)
@@ -1152,6 +1163,8 @@ static int sym53c8xx_slave_configure(str
 	lp->s.scdev_depth = depth_to_use;
 	sym_tune_dev_queuing(np, device->id, device->lun, reqtags);
 
+	spi_dv_device(device);
+
 	return 0;
 }
 
@@ -1837,6 +1850,8 @@ static struct Scsi_Host * __devinit sym_
 	instance->can_queue	= (SYM_CONF_MAX_START-2);
 	instance->sg_tablesize	= SYM_CONF_MAX_SG;
 	instance->max_cmd_len	= 16;
+	BUG_ON(sym2_transport_template == NULL);
+	instance->transportt	= sym2_transport_template;
 
 	spin_unlock_irqrestore(instance->host_lock, flags);
 
@@ -2355,6 +2370,120 @@ static void __devexit sym2_remove(struct
 	attach_count--;
 }
 
+static void sym2_get_offset(struct scsi_device *sdev)
+{
+	struct sym_hcb *np = ((struct host_data *)sdev->host->hostdata)->ncb;
+	struct sym_tcb *tp = &np->target[sdev->id];
+
+	spi_offset(sdev) = tp->tinfo.curr.offset;
+}
+
+static void sym2_set_offset(struct scsi_device *sdev, int offset)
+{
+	struct sym_hcb *np = ((struct host_data *)sdev->host->hostdata)->ncb;
+	struct sym_tcb *tp = &np->target[sdev->id];
+
+	if (tp->tinfo.curr.options & PPR_OPT_DT) {
+		if (offset > np->maxoffs_dt)
+			offset = np->maxoffs_dt;
+	} else {
+		if (offset > np->maxoffs)
+			offset = np->maxoffs;
+	}
+	tp->tinfo.goal.offset = offset;
+}
+
+
+static void sym2_get_period(struct scsi_device *sdev)
+{
+	struct sym_hcb *np = ((struct host_data *)sdev->host->hostdata)->ncb;
+	struct sym_tcb *tp = &np->target[sdev->id];
+
+	spi_period(sdev) = tp->tinfo.curr.period;
+}
+
+static void sym2_set_period(struct scsi_device *sdev, int period)
+{
+	struct sym_hcb *np = ((struct host_data *)sdev->host->hostdata)->ncb;
+	struct sym_tcb *tp = &np->target[sdev->id];
+
+	if (period <= 9 && np->minsync_dt) {
+		if (period < np->minsync_dt)
+			period = np->minsync_dt;
+		tp->tinfo.goal.options = PPR_OPT_DT;
+		tp->tinfo.goal.period = period;
+		if (!tp->tinfo.curr.offset ||
+					tp->tinfo.curr.offset > np->maxoffs_dt)
+			tp->tinfo.goal.offset = np->maxoffs_dt;
+	} else {
+		if (period < np->minsync)
+			period = np->minsync;
+		tp->tinfo.goal.options = 0;
+		tp->tinfo.goal.period = period;
+		if (!tp->tinfo.curr.offset ||
+					tp->tinfo.curr.offset > np->maxoffs)
+			tp->tinfo.goal.offset = np->maxoffs;
+	}
+}
+
+static void sym2_get_width(struct scsi_device *sdev)
+{
+	struct sym_hcb *np = ((struct host_data *)sdev->host->hostdata)->ncb;
+	struct sym_tcb *tp = &np->target[sdev->id];
+
+	spi_width(sdev) = tp->tinfo.curr.width ? 1 : 0;
+}
+
+static void sym2_set_width(struct scsi_device *sdev, int width)
+{
+	struct sym_hcb *np = ((struct host_data *)sdev->host->hostdata)->ncb;
+	struct sym_tcb *tp = &np->target[sdev->id];
+
+	tp->tinfo.goal.width = width;
+}
+
+static void sym2_get_dt(struct scsi_device *sdev)
+{
+	struct sym_hcb *np = ((struct host_data *)sdev->host->hostdata)->ncb;
+	struct sym_tcb *tp = &np->target[sdev->id];
+
+	spi_dt(sdev) = (tp->tinfo.curr.options & PPR_OPT_DT) ? 1 : 0;
+}
+
+static void sym2_set_dt(struct scsi_device *sdev, int dt)
+{
+	struct sym_hcb *np = ((struct host_data *)sdev->host->hostdata)->ncb;
+	struct sym_tcb *tp = &np->target[sdev->id];
+
+	if (!dt) {
+		/* if clearing DT, then we may need to reduce the
+		 * period and the offset */
+		if (tp->tinfo.curr.period < np->minsync)
+			tp->tinfo.goal.period = np->minsync;
+		if (tp->tinfo.curr.offset > np->maxoffs)
+			tp->tinfo.goal.offset = np->maxoffs;
+		tp->tinfo.goal.options &= ~PPR_OPT_DT;
+	} else {
+		tp->tinfo.goal.options |= PPR_OPT_DT;
+	}
+}
+	
+
+static struct spi_function_template sym2_transport_functions = {
+	.set_offset	= sym2_set_offset,
+	.get_offset	= sym2_get_offset,
+	.show_offset	= 1,
+	.set_period	= sym2_set_period,
+	.get_period	= sym2_get_period,
+	.show_period	= 1,
+	.set_width	= sym2_set_width,
+	.get_width	= sym2_get_width,
+	.show_width	= 1,
+	.get_dt		= sym2_get_dt,
+	.set_dt		= sym2_set_dt,
+	.show_dt	= 1,
+};
+
 static struct pci_device_id sym2_id_table[] __devinitdata = {
 	{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_NCR_53C810,
 	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
@@ -2404,6 +2533,10 @@ static struct pci_driver sym2_driver = {
 
 static int __init sym2_init(void)
 {
+	sym2_transport_template = spi_attach_transport(&sym2_transport_functions);
+	if (!sym2_transport_template)
+		return -ENODEV;
+
 	pci_register_driver(&sym2_driver);
 	return 0;
 }
@@ -2411,6 +2544,7 @@ static int __init sym2_init(void)
 static void __exit sym2_exit(void)
 {
 	pci_unregister_driver(&sym2_driver);
+	spi_release_transport(sym2_transport_template);
 }
 
 module_init(sym2_init);
--- diff/drivers/scsi/sym53c8xx_2/sym_glue.h	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/sym53c8xx_2/sym_glue.h	2004-04-21 10:45:34.959388864 +0100
@@ -66,9 +66,10 @@
 #  include <asm/irq.h>
 #endif
 
+#include <scsi/scsi.h>
 #include <scsi/scsi_cmnd.h>
+#include <scsi/scsi_device.h>
 #include <scsi/scsi_host.h>
-#include "../scsi.h"		/* XXX: DID_* */
 
 #ifndef bzero
 #define bzero(d, n)	memset((d), 0, (n))
@@ -341,18 +342,12 @@ typedef struct scsi_cmnd *cam_scsiio_p;/
 #define	CAM_RESRC_UNAVAIL	DID_ERROR
 
 /*
- *  Remap SCSI data direction values.
+ *  Remap data direction values.
  */
-#ifndef	SCSI_DATA_UNKNOWN
-#define	SCSI_DATA_UNKNOWN	0
-#define	SCSI_DATA_WRITE		1
-#define	SCSI_DATA_READ		2
-#define	SCSI_DATA_NONE		3
-#endif
-#define CAM_DIR_NONE		SCSI_DATA_NONE
-#define CAM_DIR_IN		SCSI_DATA_READ
-#define CAM_DIR_OUT		SCSI_DATA_WRITE
-#define CAM_DIR_UNKNOWN		SCSI_DATA_UNKNOWN
+#define CAM_DIR_NONE		DMA_NONE
+#define CAM_DIR_IN		DMA_FROM_DEVICE
+#define CAM_DIR_OUT		DMA_TO_DEVICE
+#define CAM_DIR_UNKNOWN		DMA_BIDIRECTIONAL
 
 /*
  *  These ones are used as return code from 
--- diff/drivers/scsi/sym53c8xx_2/sym_hipd.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/scsi/sym53c8xx_2/sym_hipd.c	2004-04-21 10:45:34.963388256 +0100
@@ -50,7 +50,8 @@
  * SUCH DAMAGE.
  */
 
-#define SYM_DRIVER_NAME	"sym-2.1.18i"
+#define SYM_VERSION "2.1.18j"
+#define SYM_DRIVER_NAME	"sym-" SYM_VERSION
 
 #include "sym_glue.h"
 #include "sym_nvram.h"
@@ -3183,7 +3184,7 @@ static void sym_sir_bad_scsi_status(hcb_
 		/*
 		 *  patch requested size into sense command
 		 */
-		cp->sensecmd[0]		= 0x03;
+		cp->sensecmd[0]		= REQUEST_SENSE;
 		cp->sensecmd[1]		= 0;
 		if (tp->tinfo.curr.scsi_version <= 2 && cp->lun <= 7)
 			cp->sensecmd[1]	= cp->lun << 5;
@@ -5693,7 +5694,7 @@ if (resid)
 	 *  On standard INQUIRY response (EVPD and CmDt 
 	 *  not set), sniff out device capabilities.
 	 */
-	if (cp->cdb_buf[0] == 0x12 && !(cp->cdb_buf[1] & 0x3))
+	if (cp->cdb_buf[0] == INQUIRY && !(cp->cdb_buf[1] & 0x3))
 		sym_sniff_inquiry(np, cp->cam_ccb, resid);
 #endif
 
--- diff/drivers/scsi/tmscsim.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/scsi/tmscsim.c	2004-04-21 10:45:34.965387952 +0100
@@ -2221,7 +2221,7 @@ int __init DC390_detect (Scsi_Host_Templ
 {
     PDEVDECL0;
     UCHAR   irq;
-    UINT    io_port;
+    ULONG   io_port;
 
     //dc390_pSHT_start = psht;
     dc390_pACB_start = NULL;
--- diff/drivers/serial/68328serial.c	2003-07-11 09:39:50.000000000 +0100
+++ source/drivers/serial/68328serial.c	2004-04-21 10:45:34.971387040 +0100
@@ -4,7 +4,7 @@
  * Copyright (C) 1998       Kenneth Albanowski <kjahds@kjahds.com>
  * Copyright (C) 1998, 1999 D. Jeff Dionne     <jeff@uclinux.org>
  * Copyright (C) 1999       Vladimir Gurevich  <vgurevic@cisco.com>
- * Copyright (C) 2002       David McCullough   <davidm@snapgear.com>
+ * Copyright (C) 2002-2003  David McCullough   <davidm@snapgear.com>
  * Copyright (C) 2002       Greg Ungerer       <gerg@snapgear.com>
  *
  * VZ Support/Fixes             Evan Stawnyczy <e@lineo.ca>
@@ -67,12 +67,12 @@
 #endif
 
 static struct m68k_serial m68k_soft[NR_PORTS];
-struct m86k_serial *IRQ_ports[NR_IRQS];
+struct m68k_serial *IRQ_ports[NR_IRQS];
 
 static unsigned int uart_irqs[NR_PORTS] = UART_IRQ_DEFNS;
 
 /* multiple ports are contiguous in memory */
-m68328_uart *uart_addr = USTCNT_ADDR;
+m68328_uart *uart_addr = (m68328_uart *)USTCNT_ADDR;
 
 struct tty_struct m68k_ttys;
 struct m68k_serial *m68k_consinfo = 0;
@@ -400,7 +400,7 @@ clear_and_return:
 /*
  * This is the serial driver's generic interrupt routine
  */
-void rs_interrupt(int irq, void *dev_id, struct pt_regs * regs)
+irqreturn_t rs_interrupt(int irq, void *dev_id, struct pt_regs * regs)
 {
 	struct m68k_serial * info;
 	m68328_uart *uart;
@@ -409,7 +409,7 @@ void rs_interrupt(int irq, void *dev_id,
 
 	info = IRQ_ports[irq];
 	if(!info)
-	    return;
+	    return IRQ_NONE;
 
 	uart = &uart_addr[info->line];
 	rx = uart->urx.w;
@@ -422,7 +422,7 @@ void rs_interrupt(int irq, void *dev_id,
 #else
 	receive_chars(info, regs, rx);		
 #endif
-	return;
+	return IRQ_HANDLED;
 }
 
 static void do_softint(void *private)
@@ -777,7 +777,7 @@ static int rs_write(struct tty_struct * 
 	save_flags(flags);
 	while (1) {
 		cli();		
-		c = min(count, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
+		c = min_t(int, count, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
 				   SERIAL_XMIT_SIZE - info->xmit_head));
 		if (c <= 0)
 			break;
@@ -785,7 +785,7 @@ static int rs_write(struct tty_struct * 
 		if (from_user) {
 			down(&tmp_buf_sem);
 			copy_from_user(tmp_buf, buf, c);
-			c = min(c, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
+			c = min_t(int, c, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
 				       SERIAL_XMIT_SIZE - info->xmit_head));
 			memcpy(info->xmit_buf + info->xmit_head, tmp_buf, c);
 			up(&tmp_buf_sem);
@@ -1056,11 +1056,10 @@ static int rs_ioctl(struct tty_struct *t
 			send_break(info, arg ? arg*(HZ/10) : HZ/4);
 			return 0;
 		case TIOCGSOFTCAR:
-			error = verify_area(VERIFY_WRITE, (void *) arg,sizeof(long));
+			error = put_user(C_CLOCAL(tty) ? 1 : 0,
+				    (unsigned long *) arg);
 			if (error)
 				return error;
-			put_user(C_CLOCAL(tty) ? 1 : 0,
-				    (unsigned long *) arg);
 			return 0;
 		case TIOCSSOFTCAR:
 			get_user(arg, (unsigned long *) arg);
--- diff/drivers/serial/8250.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/serial/8250.c	2004-04-21 10:45:34.976386280 +0100
@@ -21,6 +21,7 @@
  */
 #include <linux/config.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/tty.h>
 #include <linux/ioport.h>
 #include <linux/init.h>
@@ -117,11 +118,11 @@ static struct old_serial_port old_serial
 
 #define UART_NR	(ARRAY_SIZE(old_serial_port) + CONFIG_SERIAL_8250_NR_UARTS)
 
-#if defined(CONFIG_SERIAL_8250_RSA) && defined(MODULE)
+#ifdef CONFIG_SERIAL_8250_RSA
 
 #define PORT_RSA_MAX 4
-static int probe_rsa[PORT_RSA_MAX];
-static int force_rsa[PORT_RSA_MAX];
+static unsigned long probe_rsa[PORT_RSA_MAX];
+static unsigned int probe_rsa_count;
 #endif /* CONFIG_SERIAL_8250_RSA  */
 
 struct uart_8250_port {
@@ -133,6 +134,7 @@ struct uart_8250_port {
 	unsigned char		acr;
 	unsigned char		ier;
 	unsigned char		lcr;
+	unsigned char		mcr;
 	unsigned char		mcr_mask;	/* mask of user bits */
 	unsigned char		mcr_force;	/* mask of forced bits */
 	unsigned char		lsr_break_flag;
@@ -169,7 +171,8 @@ static const struct serial_uart_config u
 	{ "ST16654",	64,	UART_CLEAR_FIFO | UART_USE_FIFO | UART_STARTECH },
 	{ "XR16850",	128,	UART_CLEAR_FIFO | UART_USE_FIFO | UART_STARTECH },
 	{ "RSA",	2048,	UART_CLEAR_FIFO | UART_USE_FIFO },
-	{ "NS16550A",	16,	UART_CLEAR_FIFO | UART_USE_FIFO | UART_NATSEMI }
+	{ "NS16550A",	16,	UART_CLEAR_FIFO | UART_USE_FIFO | UART_NATSEMI },
+	{ "XScale",	32,	UART_CLEAR_FIFO | UART_USE_FIFO  },
 };
 
 static _INLINE_ unsigned int serial_in(struct uart_8250_port *up, int offset)
@@ -177,11 +180,11 @@ static _INLINE_ unsigned int serial_in(s
 	offset <<= up->port.regshift;
 
 	switch (up->port.iotype) {
-	case SERIAL_IO_HUB6:
+	case UPIO_HUB6:
 		outb(up->port.hub6 - 1 + offset, up->port.iobase);
 		return inb(up->port.iobase + 1);
 
-	case SERIAL_IO_MEM:
+	case UPIO_MEM:
 		return readb(up->port.membase + offset);
 
 	default:
@@ -195,12 +198,12 @@ serial_out(struct uart_8250_port *up, in
 	offset <<= up->port.regshift;
 
 	switch (up->port.iotype) {
-	case SERIAL_IO_HUB6:
+	case UPIO_HUB6:
 		outb(up->port.hub6 - 1 + offset, up->port.iobase);
 		outb(value, up->port.iobase + 1);
 		break;
 
-	case SERIAL_IO_MEM:
+	case UPIO_MEM:
 		writeb(value, up->port.membase + offset);
 		break;
 
@@ -574,7 +577,7 @@ static void autoconfig(struct uart_8250_
 	if (!up->port.iobase && !up->port.mapbase && !up->port.membase)
 		return;
 
-	DEBUG_AUTOCONF("ttyS%d: autoconf (0x%04x, 0x%08lx): ",
+	DEBUG_AUTOCONF("ttyS%d: autoconf (0x%04x, 0x%p): ",
 			up->port.line, up->port.iobase, up->port.membase);
 
 	/*
@@ -676,21 +679,16 @@ static void autoconfig(struct uart_8250_
 		break;
 	}
 
-#if defined(CONFIG_SERIAL_8250_RSA) && defined(MODULE)
+#ifdef CONFIG_SERIAL_8250_RSA
 	/*
 	 * Only probe for RSA ports if we got the region.
 	 */
 	if (up->port.type == PORT_16550A && probeflags & PROBE_RSA) {
 		int i;
 
-		for (i = 0 ; i < PORT_RSA_MAX ; ++i) {
-			if (!probe_rsa[i] && !force_rsa[i])
-				break;
-			if (((probe_rsa[i] != up->port.iobase) ||
-			     check_region(up->port.iobase + UART_RSA_BASE, 16)) &&
-			    (force_rsa[i] != up->port.iobase))
-				continue;
-			if (__enable_rsa(up)) {
+		for (i = 0 ; i < probe_rsa_count; ++i) {
+			if (probe_rsa[i] == up->port.iobase &&
+			    __enable_rsa(up)) {
 				up->port.type = PORT_RSA;
 				break;
 			}
@@ -1176,7 +1174,7 @@ static void serial8250_set_mctrl(struct 
 	if (mctrl & TIOCM_LOOP)
 		mcr |= UART_MCR_LOOP;
 
-	mcr = (mcr & up->mcr_mask) | up->mcr_force;
+	mcr = (mcr & up->mcr_mask) | up->mcr_force | up->mcr;
 
 	serial_out(up, UART_MCR, mcr);
 }
@@ -1202,6 +1200,7 @@ static int serial8250_startup(struct uar
 	int retval;
 
 	up->capabilities = uart_config[up->port.type].flags;
+	up->mcr = 0;
 
 	if (up->port.type == PORT_16C950) {
 		/* Wake up and initialize UART */
@@ -1451,8 +1450,19 @@ serial8250_set_termios(struct uart_port 
 		else
 			fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_8;
 	}
-	if (up->port.type == PORT_16750)
+
+	/*
+	 * TI16C750: hardware flow control and 64 byte FIFOs. When AFE is
+	 * enabled, RTS will be deasserted when the receive FIFO contains
+	 * more characters than the trigger, or the MCR RTS bit is cleared.
+	 */
+	if (up->port.type == PORT_16750) {
+		up->mcr &= ~UART_MCR_AFE;
+		if (termios->c_cflag & CRTSCTS)
+			up->mcr |= UART_MCR_AFE;
+
 		fcr |= UART_FCR7_64BYTE;
+	}
 
 	/*
 	 * Ok, we're now changing the port state.  Do it with
@@ -1499,6 +1509,8 @@ serial8250_set_termios(struct uart_port 
 	up->ier &= ~UART_IER_MSI;
 	if (UART_ENABLE_MS(&up->port, termios->c_cflag))
 		up->ier |= UART_IER_MSI;
+	if (up->port.type == PORT_XSCALE)
+		up->ier |= UART_IER_UUE | UART_IER_RTOIE;
 
 	serial_out(up, UART_IER, up->ier);
 
@@ -1514,10 +1526,17 @@ serial8250_set_termios(struct uart_port 
 	} else {
 		serial_outp(up, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */
 	}
+
 	serial_outp(up, UART_DLL, quot & 0xff);		/* LS of divisor */
 	serial_outp(up, UART_DLM, quot >> 8);		/* MS of divisor */
+
+	/*
+	 * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR
+	 * is written without DLAB set, this mode will be disabled.
+	 */
 	if (up->port.type == PORT_16750)
-		serial_outp(up, UART_FCR, fcr);		/* set fcr */
+		serial_outp(up, UART_FCR, fcr);
+
 	serial_outp(up, UART_LCR, cval);		/* reset DLAB */
 	up->lcr = cval;					/* Save LCR */
 	if (up->port.type != PORT_16750) {
@@ -1527,6 +1546,7 @@ serial8250_set_termios(struct uart_port 
 		}
 		serial_outp(up, UART_FCR, fcr);		/* set fcr */
 	}
+	serial8250_set_mctrl(&up->port, up->port.mctrl);
 	spin_unlock_irqrestore(&up->port.lock, flags);
 }
 
@@ -1613,7 +1633,7 @@ serial8250_request_std_resource(struct u
 	int ret = 0;
 
 	switch (up->port.iotype) {
-	case SERIAL_IO_MEM:
+	case UPIO_MEM:
 		if (up->port.mapbase) {
 			*res = request_mem_region(up->port.mapbase, size, "serial");
 			if (!*res)
@@ -1621,8 +1641,8 @@ serial8250_request_std_resource(struct u
 		}
 		break;
 
-	case SERIAL_IO_HUB6:
-	case SERIAL_IO_PORT:
+	case UPIO_HUB6:
+	case UPIO_PORT:
 		*res = request_region(up->port.iobase, size, "serial");
 		if (!*res)
 			ret = -EBUSY;
@@ -1639,7 +1659,7 @@ serial8250_request_rsa_resource(struct u
 	int ret = 0;
 
 	switch (up->port.iotype) {
-	case SERIAL_IO_MEM:
+	case UPIO_MEM:
 		if (up->port.mapbase) {
 			start = up->port.mapbase;
 			start += UART_RSA_BASE << up->port.regshift;
@@ -1649,8 +1669,8 @@ serial8250_request_rsa_resource(struct u
 		}
 		break;
 
-	case SERIAL_IO_HUB6:
-	case SERIAL_IO_PORT:
+	case UPIO_HUB6:
+	case UPIO_PORT:
 		start = up->port.iobase;
 		start += UART_RSA_BASE << up->port.regshift;
 		*res = request_region(start, size, "serial-rsa");
@@ -1667,6 +1687,8 @@ static void serial8250_release_port(stru
 	struct uart_8250_port *up = (struct uart_8250_port *)port;
 	unsigned long start, offset = 0, size = 0;
 
+	if (!(up->port.flags & UPF_RESOURCES))
+		return;
 	if (up->port.type == PORT_RSA) {
 		offset = UART_RSA_BASE << up->port.regshift;
 		size = 8;
@@ -1675,7 +1697,7 @@ static void serial8250_release_port(stru
 	size <<= up->port.regshift;
 
 	switch (up->port.iotype) {
-	case SERIAL_IO_MEM:
+	case UPIO_MEM:
 		if (up->port.mapbase) {
 			/*
 			 * Unmap the area.
@@ -1691,8 +1713,8 @@ static void serial8250_release_port(stru
 		}
 		break;
 
-	case SERIAL_IO_HUB6:
-	case SERIAL_IO_PORT:
+	case UPIO_HUB6:
+	case UPIO_PORT:
 		start = up->port.iobase;
 
 		if (size)
@@ -1930,7 +1952,11 @@ serial8250_console_write(struct console 
 	 *	First save the UER then disable the interrupts
 	 */
 	ier = serial_in(up, UART_IER);
-	serial_out(up, UART_IER, 0);
+
+	if (up->port.type == PORT_XSCALE)
+		serial_out(up, UART_IER, UART_IER_UUE);
+	else
+		serial_out(up, UART_IER, 0);
 
 	/*
 	 *	Now, do each character
@@ -2185,14 +2211,12 @@ EXPORT_SYMBOL(serial8250_resume_port);
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("Generic 8250/16x50 serial driver $Revision: 1.90 $");
 
-MODULE_PARM(share_irqs, "i");
+module_param(share_irqs, uint, 0644);
 MODULE_PARM_DESC(share_irqs, "Share IRQs with other non-8250/16x50 devices"
 	" (unsafe)");
 
-#if defined(CONFIG_SERIAL_8250_RSA) && defined(MODULE)
-MODULE_PARM(probe_rsa, "1-" __MODULE_STRING(PORT_RSA_MAX) "i");
+#ifdef CONFIG_SERIAL_8250_RSA
+module_param_array(probe_rsa, ulong, probe_rsa_count, 0444);
 MODULE_PARM_DESC(probe_rsa, "Probe I/O ports for RSA");
-MODULE_PARM(force_rsa, "1-" __MODULE_STRING(PORT_RSA_MAX) "i");
-MODULE_PARM_DESC(force_rsa, "Force I/O ports for RSA");
 #endif
 MODULE_ALIAS_CHARDEV_MAJOR(TTY_MAJOR);
--- diff/drivers/serial/8250.h	2003-09-30 15:46:17.000000000 +0100
+++ source/drivers/serial/8250.h	2004-04-21 10:45:34.976386280 +0100
@@ -17,15 +17,6 @@
 
 #include <linux/config.h>
 
-struct serial8250_probe {
-	struct module	*owner;
-	int		(*pci_init_one)(struct pci_dev *dev);
-	void		(*pci_remove_one)(struct pci_dev *dev);
-	void		(*pnp_init)(void);
-};
-
-int serial8250_register_probe(struct serial8250_probe *probe);
-void serial8250_unregister_probe(struct serial8250_probe *probe);
 void serial8250_get_irq_map(unsigned int *map);
 void serial8250_suspend_port(int line);
 void serial8250_resume_port(int line);
--- diff/drivers/serial/8250_hcdp.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/serial/8250_hcdp.c	2004-04-21 10:45:34.977386128 +0100
@@ -186,6 +186,8 @@ setup_serial_hcdp(void *tablep)
 		port.irq = gsi;
 #endif
 		port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_RESOURCES;
+		if (gsi)
+			port.flags |= UPF_AUTO_IRQ;
 
 		/*
 		 * Note: the above memset() initializes port.line to 0,
--- diff/drivers/serial/Kconfig	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/serial/Kconfig	2004-04-21 10:45:34.978385976 +0100
@@ -174,19 +174,19 @@ config SERIAL_8250_ACORN
 	  system, say Y to this option.  The driver can handle 1, 2, or 3 port
 	  cards.  If unsure, say N.
 
-config SERIAL_AMBA
-	tristate "ARM AMBA serial port support"
+config SERIAL_AMBA_PL010
+	tristate "ARM AMBA PL010 serial port support"
 	depends on ARM_AMBA
 	select SERIAL_CORE
 	help
-	  This selects the ARM(R) AMBA(R) PrimeCell UART.  If you have an
-	  Integrator platform, say Y or M here.
+	  This selects the ARM(R) AMBA(R) PrimeCell PL010 UART.  If you have
+	  an Integrator/AP or Integrator/PP2 platform, say Y or M here.
 
 	  If unsure, say N.
 
-config SERIAL_AMBA_CONSOLE
+config SERIAL_AMBA_PL010_CONSOLE
 	bool "Support for console on AMBA serial port"
-	depends on SERIAL_AMBA=y
+	depends on SERIAL_AMBA_PL010=y
 	select SERIAL_CORE_CONSOLE
 	---help---
 	  Say Y here if you wish to use an AMBA PrimeCell UART as the system
@@ -200,10 +200,32 @@ config SERIAL_AMBA_CONSOLE
 	  your boot loader (lilo or loadlin) about how to pass options to the
 	  kernel at boot time.)
 
-config SERIAL_INTEGRATOR
-	bool
-	depends on SERIAL_AMBA && ARCH_INTEGRATOR
-	default y
+config SERIAL_AMBA_PL011
+	tristate "ARM AMBA PL011 serial port support"
+	depends on ARM_AMBA
+	select SERIAL_CORE
+	help
+	  This selects the ARM(R) AMBA(R) PrimeCell PL010 UART.  If you have
+	  an Integrator/PP2, Integrator/CP or Versatile platform, say Y or M
+	  here.
+
+	  If unsure, say N.
+
+config SERIAL_AMBA_PL011_CONSOLE
+	bool "Support for console on AMBA serial port"
+	depends on SERIAL_AMBA_PL011=y
+	select SERIAL_CORE_CONSOLE
+	---help---
+	  Say Y here if you wish to use an AMBA PrimeCell UART as the system
+	  console (the system console is the device which receives all kernel
+	  messages and warnings and which allows logins in single user mode).
+
+	  Even if you say Y here, the currently visible framebuffer console
+	  (/dev/tty0) will still be used as the system console by default, but
+	  you can alter that using a kernel command line option such as
+	  "console=ttyAM0". (Try "man bootparam" or see the documentation of
+	  your boot loader (lilo or loadlin) about how to pass options to the
+	  kernel at boot time.)
 
 config SERIAL_CLPS711X
 	tristate "CLPS711X serial port support"
@@ -224,9 +246,40 @@ config SERIAL_CLPS711X_CONSOLE
 	  your boot loader (lilo or loadlin) about how to pass options to the
 	  kernel at boot time.)
 
+config SERIAL_S3C2410
+	tristate "Samsung S3C2410 Serial port support"
+	depends on ARM && ARCH_S3C2410
+	select SERIAL_CORE
+	help
+	  Support for the on-chip UARTs on the Samsung S3C2410X CPU,
+	  providing /dev/ttySAC0, 1 and 2 (note, some machines may not
+	  provide all of these ports, depending on how the serial port
+	  pins are configured.
+
+config SERIAL_S3C2410_CONSOLE
+	bool "Support for console on S3C2410 serial port"
+	depends on SERIAL_S3C2410=y
+	help
+	  Allow selection of the S3C2410 on-board serial ports for use as
+	  an virtual console.
+
+	  Even if you say Y here, the currently visible virtual console
+	  (/dev/tty0) will still be used as the system console by default, but
+	  you can alter that using a kernel command line option such as
+	  "console=ttySACx". (Try "man bootparam" or see the documentation of
+	  your boot loader about how to pass options to the kernel at
+	  boot time.)
+
+config SERIAL_BAST_SIO
+	bool "Support for BAST SuperIO serial ports"
+	depends on ARCH_BAST && SERIAL_8250=y
+	help
+	  Support for registerin the SuperIO chip on BAST board with
+	  the 8250/16550 uart code.
+
 config SERIAL_DZ
 	bool "DECstation DZ serial driver"
-	depends on DECSTATION
+	depends on MACH_DECSTATION && MIPS32
 	select SERIAL_CORE
 	help
 	  DZ11-family serial controllers for VAXstations, including the
@@ -479,7 +532,7 @@ config SERIAL98_CONSOLE
 
 config SERIAL_SH_SCI
 	tristate "SH SCI(F) serial port support"
-	depends on SUPERH
+	depends on SUPERH || H8300
 	select SERIAL_CORE
 
 config SERIAL_SH_SCI_CONSOLE
--- diff/drivers/serial/Makefile	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/serial/Makefile	2004-04-21 10:45:34.978385976 +0100
@@ -16,10 +16,12 @@ obj-$(CONFIG_SERIAL_21285) += 21285.o
 obj-$(CONFIG_SERIAL_8250) += 8250.o $(serial-8250-y)
 obj-$(CONFIG_SERIAL_8250_CS) += serial_cs.o
 obj-$(CONFIG_SERIAL_8250_ACORN) += 8250_acorn.o
-obj-$(CONFIG_SERIAL_AMBA) += amba.o
+obj-$(CONFIG_SERIAL_AMBA_PL010) += amba-pl010.o
+obj-$(CONFIG_SERIAL_AMBA_PL011) += amba-pl011.o
 obj-$(CONFIG_SERIAL_CLPS711X) += clps711x.o
 obj-$(CONFIG_SERIAL_PXA) += pxa.o
 obj-$(CONFIG_SERIAL_SA1100) += sa1100.o
+obj-$(CONFIG_SERIAL_S3C2410) += s3c2410.o
 obj-$(CONFIG_SERIAL_UART00) += uart00.o
 obj-$(CONFIG_SERIAL_SUNCORE) += suncore.o
 obj-$(CONFIG_SERIAL_SUNZILOG) += sunzilog.o
@@ -36,3 +38,4 @@ obj-$(CONFIG_SERIAL_PMACZILOG) += pmac_z
 obj-$(CONFIG_SERIAL_AU1X00) += au1x00_uart.o
 obj-$(CONFIG_SERIAL_DZ) += dz.o
 obj-$(CONFIG_SERIAL_SH_SCI) += sh-sci.o
+obj-$(CONFIG_SERIAL_BAST_SIO) += bast_sio.o
--- diff/drivers/serial/mcfserial.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/serial/mcfserial.c	2004-04-21 10:45:34.998382936 +0100
@@ -10,6 +10,11 @@
  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
  * Copyright (C) 1998 TSHG
  * Copyright (c) 1999 Rt-Control Inc. <jeff@uclinux.org>
+ *
+ * Changes:
+ * 08/07/2003    Daniele Bellucci <bellucda@tiscali.it>
+ *               some cleanups in mcfrs_write.
+ *
  */
  
 #include <linux/module.h>
@@ -27,11 +32,7 @@
 #include <linux/kernel.h>
 #include <linux/serial.h>
 #include <linux/serialP.h>
-#ifdef CONFIG_LEDMAN
-#include <linux/ledman.h>
-#endif
 #include <linux/console.h>
-#include <linux/version.h>
 #include <linux/init.h>
 
 #include <asm/io.h>
@@ -84,8 +85,6 @@ static struct tty_driver *mcfrs_serial_d
 #undef SERIAL_DEBUG_OPEN
 #undef SERIAL_DEBUG_FLOW
 
-#define _INLINE_ inline
-
 #ifdef CONFIG_M5282
 #define	IRQBASE	77
 #else
@@ -96,8 +95,18 @@ static struct tty_driver *mcfrs_serial_d
  *	Configuration table, UARTs to look for at startup.
  */
 static struct mcf_serial mcfrs_table[] = {
-  { 0, (MCF_MBAR+MCFUART_BASE1), IRQBASE,   ASYNC_BOOT_AUTOCONF },  /* ttyS0 */
-  { 0, (MCF_MBAR+MCFUART_BASE2), IRQBASE+1, ASYNC_BOOT_AUTOCONF },  /* ttyS1 */
+	{  /* ttyS0 */
+		.magic = 0,
+		.addr = (volatile unsigned char *) (MCF_MBAR+MCFUART_BASE1),
+		.irq = IRQBASE,
+		.flags = ASYNC_BOOT_AUTOCONF,
+	},
+	{  /* ttyS1 */
+		.magic = 0,
+		.addr = (volatile unsigned char *) (MCF_MBAR+MCFUART_BASE2),
+		.irq = IRQBASE+1,
+		.flags = ASYNC_BOOT_AUTOCONF,
+	},
 };
 
 
@@ -138,15 +147,16 @@ static DECLARE_MUTEX(mcfrs_tmp_buf_sem);
  *	Forware declarations...
  */
 static void	mcfrs_change_speed(struct mcf_serial *info);
+static void	mcfrs_wait_until_sent(struct tty_struct *tty, int timeout);
 
 
 static inline int serial_paranoia_check(struct mcf_serial *info,
 					char *name, const char *routine)
 {
 #ifdef SERIAL_PARANOIA_CHECK
-	static const char *badmagic =
+	static const char badmagic[] =
 		"MCFRS(warning): bad magic number for serial struct %s in %s\n";
-	static const char *badinfo =
+	static const char badinfo[] =
 		"MCFRS(warning): null mcf_serial for %s in %s\n";
 
 	if (!info) {
@@ -184,7 +194,7 @@ static void mcfrs_setsignals(struct mcf_
 #endif
 	}
 	if (rts >= 0) {
-		uartp = (volatile unsigned char *) info->addr;
+		uartp = info->addr;
 		if (rts) {
 			info->sigs |= TIOCM_RTS;
 			uartp[MCFUART_UOP1] = MCFUART_UOP_RTS;
@@ -214,7 +224,7 @@ static int mcfrs_getsignals(struct mcf_s
 #endif
 
 	local_irq_save(flags);
-	uartp = (volatile unsigned char *) info->addr;
+	uartp = info->addr;
 	sigs = (uartp[MCFUART_UIPR] & MCFUART_UIPR_CTS) ? 0 : TIOCM_CTS;
 	sigs |= (info->sigs & TIOCM_RTS);
 
@@ -254,7 +264,7 @@ static void mcfrs_stop(struct tty_struct
 		return;
 	
 	local_irq_save(flags);
-	uartp = (volatile unsigned char *) info->addr;
+	uartp = info->addr;
 	info->imr &= ~MCFUART_UIR_TXREADY;
 	uartp[MCFUART_UIMR] = info->imr;
 	local_irq_restore(flags);
@@ -271,7 +281,7 @@ static void mcfrs_start(struct tty_struc
 
 	local_irq_save(flags);
 	if (info->xmit_cnt && info->xmit_buf) {
-		uartp = (volatile unsigned char *) info->addr;
+		uartp = info->addr;
 		info->imr |= MCFUART_UIR_TXREADY;
 		uartp[MCFUART_UIMR] = info->imr;
 	}
@@ -299,7 +309,7 @@ static void mcfrs_start(struct tty_struc
  * -----------------------------------------------------------------------
  */
 
-static _INLINE_ void receive_chars(struct mcf_serial *info, struct pt_regs *regs, unsigned short rx)
+static inline void receive_chars(struct mcf_serial *info)
 {
 	volatile unsigned char	*uartp;
 	struct tty_struct	*tty = info->tty;
@@ -308,11 +318,7 @@ static _INLINE_ void receive_chars(struc
 	if (!tty)
 		return;
 
-#if defined(CONFIG_LEDMAN)
-	ledman_cmd(LEDMAN_CMD_SET, info->line ? LEDMAN_COM2_RX : LEDMAN_COM1_RX);
-#endif
-
-	uartp = (volatile unsigned char *) info->addr;
+	uartp = info->addr;
 
 	while ((status = uartp[MCFUART_USR]) & MCFUART_USR_RXREADY) {
 
@@ -354,15 +360,11 @@ static _INLINE_ void receive_chars(struc
 	return;
 }
 
-static _INLINE_ void transmit_chars(struct mcf_serial *info)
+static inline void transmit_chars(struct mcf_serial *info)
 {
 	volatile unsigned char	*uartp;
 
-#if defined(CONFIG_LEDMAN)
-	ledman_cmd(LEDMAN_CMD_SET, info->line ? LEDMAN_COM2_TX : LEDMAN_COM1_TX);
-#endif
-
-	uartp = (volatile unsigned char *) info->addr;
+	uartp = info->addr;
 
 	if (info->x_char) {
 		/* Send special char - probably flow control */
@@ -399,10 +401,10 @@ irqreturn_t mcfrs_interrupt(int irq, voi
 	unsigned char		isr;
 
 	info = &mcfrs_table[(irq - IRQBASE)];
-	isr = (((volatile unsigned char *)info->addr)[MCFUART_UISR]) & info->imr;
+	isr = info->addr[MCFUART_UISR] & info->imr;
 
 	if (isr & MCFUART_UIR_RXREADY)
-		receive_chars(info, regs, isr);
+		receive_chars(info);
 	if (isr & MCFUART_UIR_TXREADY)
 		transmit_chars(info);
 	return IRQ_HANDLED;
@@ -525,7 +527,7 @@ static int startup(struct mcf_serial * i
 	/*
 	 *	Reset UART, get it into known state...
 	 */
-	uartp = (volatile unsigned char *) info->addr;
+	uartp = info->addr;
 	uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETRX;  /* reset RX */
 	uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETTX;  /* reset TX */
 	mcfrs_setsignals(info, 1, 1);
@@ -571,7 +573,7 @@ static void shutdown(struct mcf_serial *
 	
 	local_irq_save(flags);
 
-	uartp = (volatile unsigned char *) info->addr;
+	uartp = info->addr;
 	uartp[MCFUART_UIMR] = 0;  /* mask all interrupts */
 	uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETRX;  /* reset RX */
 	uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETTX;  /* reset TX */
@@ -603,6 +605,9 @@ static void mcfrs_change_speed(struct mc
 	unsigned long		flags;
 	unsigned char		mr1, mr2;
 	int			i;
+#ifdef	CONFIG_M5272
+	unsigned int		fraction;
+#endif
 
 	if (!info->tty || !info->tty->termios)
 		return;
@@ -626,7 +631,20 @@ static void mcfrs_change_speed(struct mc
 		mcfrs_setsignals(info, 0, -1);
 		return;
 	}
+
+	/* compute the baudrate clock */
+#ifdef	CONFIG_M5272
+	/*
+	 * For the MCF5272, also compute the baudrate fraction.
+	 */
+	baudclk = (MCF_BUSCLK / mcfrs_baud_table[i]) / 32;
+	fraction = MCF_BUSCLK - (baudclk * 32 * mcfrs_baud_table[i]);
+	fraction *= 16;
+	fraction /= (32 * mcfrs_baud_table[i]);
+#else
 	baudclk = ((MCF_BUSCLK / mcfrs_baud_table[i]) + 16) / 32;
+#endif
+
 	info->baud = mcfrs_baud_table[i];
 
 	mr1 = MCFUART_MR1_RXIRQRDY | MCFUART_MR1_RXERRCHAR;
@@ -671,7 +689,7 @@ static void mcfrs_change_speed(struct mc
 	else
 		info->flags |= ASYNC_CHECK_CD;
 
-	uartp = (volatile unsigned char *) info->addr;
+	uartp = info->addr;
 
 	local_irq_save(flags);
 #if 0
@@ -690,6 +708,9 @@ static void mcfrs_change_speed(struct mc
 	uartp[MCFUART_UMR] = mr2;
 	uartp[MCFUART_UBG1] = (baudclk & 0xff00) >> 8;	/* set msb byte */
 	uartp[MCFUART_UBG2] = (baudclk & 0xff);		/* set lsb byte */
+#ifdef	CONFIG_M5272
+	uartp[MCFUART_UFPD] = (fraction & 0xf);		/* set fraction */
+#endif
 	uartp[MCFUART_UCSR] = MCFUART_UCSR_RXCLKTIMER | MCFUART_UCSR_TXCLKTIMER;
 	uartp[MCFUART_UCR] = MCFUART_UCR_RXENABLE | MCFUART_UCR_TXENABLE;
 	mcfrs_setsignals(info, 1, -1);
@@ -712,7 +733,7 @@ static void mcfrs_flush_chars(struct tty
 
 	/* Enable transmitter */
 	local_irq_save(flags);
-	uartp = (volatile unsigned char *) info->addr;
+	uartp = info->addr;
 	info->imr |= MCFUART_UIR_TXREADY;
 	uartp[MCFUART_UIMR] = info->imr;
 	local_irq_restore(flags);
@@ -742,24 +763,26 @@ static int mcfrs_write(struct tty_struct
 		local_irq_disable();		
 		c = min(count, (int) min(((int)SERIAL_XMIT_SIZE) - info->xmit_cnt - 1,
 			((int)SERIAL_XMIT_SIZE) - info->xmit_head));
+		local_irq_restore(flags);
 
-		if (c <= 0) {
-			local_irq_restore(flags);
+		if (c <= 0)
 			break;
-		}
 
 		if (from_user) {
 			down(&mcfrs_tmp_buf_sem);
-			copy_from_user(mcfrs_tmp_buf, buf, c);
-			local_irq_restore(flags);
+			if (copy_from_user(mcfrs_tmp_buf, buf, c))
+				return -EFAULT;
+
 			local_irq_disable();
 			c = min(c, (int) min(((int)SERIAL_XMIT_SIZE) - info->xmit_cnt - 1,
 				       ((int)SERIAL_XMIT_SIZE) - info->xmit_head));
+			local_irq_restore(flags);
 			memcpy(info->xmit_buf + info->xmit_head, mcfrs_tmp_buf, c);
 			up(&mcfrs_tmp_buf_sem);
 		} else
 			memcpy(info->xmit_buf + info->xmit_head, buf, c);
 
+		local_irq_disable();
 		info->xmit_head = (info->xmit_head + c) & (SERIAL_XMIT_SIZE-1);
 		info->xmit_cnt += c;
 		local_irq_restore(flags);
@@ -770,7 +793,7 @@ static int mcfrs_write(struct tty_struct
 	}
 
 	local_irq_disable();
-	uartp = (volatile unsigned char *) info->addr;
+	uartp = info->addr;
 	info->imr |= MCFUART_UIR_TXREADY;
 	uartp[MCFUART_UIMR] = info->imr;
 	local_irq_restore(flags);
@@ -884,15 +907,14 @@ static int get_serial_info(struct mcf_se
 	memset(&tmp, 0, sizeof(tmp));
 	tmp.type = info->type;
 	tmp.line = info->line;
-	tmp.port = info->addr;
+	tmp.port = (unsigned int) info->addr;
 	tmp.irq = info->irq;
 	tmp.flags = info->flags;
 	tmp.baud_base = info->baud_base;
 	tmp.close_delay = info->close_delay;
 	tmp.closing_wait = info->closing_wait;
 	tmp.custom_divisor = info->custom_divisor;
-	copy_to_user(retinfo,&tmp,sizeof(*retinfo));
-	return 0;
+	return copy_to_user(retinfo,&tmp,sizeof(*retinfo)) ? -EFAULT : 0;
 }
 
 static int set_serial_info(struct mcf_serial * info,
@@ -904,7 +926,8 @@ static int set_serial_info(struct mcf_se
 
 	if (!new_info)
 		return -EFAULT;
-	copy_from_user(&new_serial,new_info,sizeof(new_serial));
+	if (copy_from_user(&new_serial,new_info,sizeof(new_serial)))
+		return -EFAULT;
 	old_info = *info;
 
 	if (!capable(CAP_SYS_ADMIN)) {
@@ -957,12 +980,11 @@ static int get_lsr_info(struct mcf_seria
 	unsigned char		status;
 
 	local_irq_save(flags);
-	uartp = (volatile unsigned char *) info->addr;
+	uartp = info->addr;
 	status = (uartp[MCFUART_USR] & MCFUART_USR_TXEMPTY) ? TIOCSER_TEMT : 0;
 	local_irq_restore(flags);
 
-	put_user(status,value);
-	return 0;
+	return put_user(status,value);
 }
 
 /*
@@ -976,7 +998,7 @@ static void send_break(	struct mcf_seria
 	if (!info->addr)
 		return;
 	current->state = TASK_INTERRUPTIBLE;
-	uartp = (volatile unsigned char *) info->addr;
+	uartp = info->addr;
 
 	local_irq_save(flags);
 	uartp[MCFUART_UCR] = MCFUART_UCR_CMDBREAKSTART;
@@ -1026,9 +1048,6 @@ static int mcfrs_ioctl(struct tty_struct
 		    unsigned int cmd, unsigned long arg)
 {
 	struct mcf_serial * info = (struct mcf_serial *)tty->driver_data;
-#ifdef TIOCSET422
-	unsigned int val;
-#endif
 	int retval, error;
 
 	if (serial_paranoia_check(info, tty->name, "mcfrs_ioctl"))
@@ -1058,11 +1077,10 @@ static int mcfrs_ioctl(struct tty_struct
 			send_break(info, arg ? arg*(HZ/10) : HZ/4);
 			return 0;
 		case TIOCGSOFTCAR:
-			error = verify_area(VERIFY_WRITE, (void *) arg,sizeof(long));
+			error = put_user(C_CLOCAL(tty) ? 1 : 0,
+				    (unsigned long *) arg);
 			if (error)
 				return error;
-			put_user(C_CLOCAL(tty) ? 1 : 0,
-				    (unsigned long *) arg);
 			return 0;
 		case TIOCSSOFTCAR:
 			get_user(arg, (unsigned long *) arg);
@@ -1089,23 +1107,25 @@ static int mcfrs_ioctl(struct tty_struct
 			    return get_lsr_info(info, (unsigned int *) arg);
 
 		case TIOCSERGSTRUCT:
-			error = verify_area(VERIFY_WRITE, (void *) arg,
-						sizeof(struct mcf_serial));
-			if (error)
-				return error;
-			copy_to_user((struct mcf_serial *) arg,
+			error = copy_to_user((struct mcf_serial *) arg,
 				    info, sizeof(struct mcf_serial));
+			if (error)
+				return -EFAULT;
 			return 0;
 			
 #ifdef TIOCSET422
-		case TIOCSET422:
+		case TIOCSET422: {
+			unsigned int val;
 			get_user(val, (unsigned int *) arg);
 			mcf_setpa(MCFPP_PA11, (val ? 0 : MCFPP_PA11));
 			break;
-		case TIOCGET422:
+		}
+		case TIOCGET422: {
+			unsigned int val;
 			val = (mcf_getpa() & MCFPP_PA11) ? 0 : 1;
 			put_user(val, (unsigned int *) arg);
 			break;
+		}
 #endif
 
 		default:
@@ -1200,7 +1220,7 @@ static void mcfrs_close(struct tty_struc
 	 * line status register.
 	 */
 	info->imr &= ~MCFUART_UIR_RXREADY;
-	uartp = (volatile unsigned char *) info->addr;
+	uartp = info->addr;
 	uartp[MCFUART_UIMR] = info->imr;
 
 #if 0
@@ -1238,6 +1258,76 @@ static void mcfrs_close(struct tty_struc
 }
 
 /*
+ * mcfrs_wait_until_sent() --- wait until the transmitter is empty
+ */
+static void
+mcfrs_wait_until_sent(struct tty_struct *tty, int timeout)
+{
+#ifdef	CONFIG_M5272
+#define	MCF5272_FIFO_SIZE	25		/* fifo size + shift reg */
+
+	struct mcf_serial * info = (struct mcf_serial *)tty->driver_data;
+	volatile unsigned char *uartp;
+	unsigned long orig_jiffies, fifo_time, char_time, fifo_cnt;
+
+	if (serial_paranoia_check(info, tty->name, "mcfrs_wait_until_sent"))
+		return;
+
+	orig_jiffies = jiffies;
+
+	/*
+	 * Set the check interval to be 1/5 of the approximate time
+	 * to send the entire fifo, and make it at least 1.  The check
+	 * interval should also be less than the timeout.
+	 *
+	 * Note: we have to use pretty tight timings here to satisfy
+	 * the NIST-PCTS.
+	 */
+	fifo_time = (MCF5272_FIFO_SIZE * HZ * 10) / info->baud;
+	char_time = fifo_time / 5;
+	if (char_time == 0)
+		char_time = 1;
+	if (timeout && timeout < char_time)
+		char_time = timeout;
+
+	/*
+	 * Clamp the timeout period at 2 * the time to empty the
+	 * fifo.  Just to be safe, set the minimum at .5 seconds.
+	 */
+	fifo_time *= 2;
+	if (fifo_time < (HZ/2))
+		fifo_time = HZ/2;
+	if (!timeout || timeout > fifo_time)
+		timeout = fifo_time;
+
+	/*
+	 * Account for the number of bytes in the UART
+	 * transmitter FIFO plus any byte being shifted out.
+	 */
+	uartp = (volatile unsigned char *) info->addr;
+	for (;;) {
+		fifo_cnt = (uartp[MCFUART_UTF] & MCFUART_UTF_TXB);
+		if ((uartp[MCFUART_USR] & (MCFUART_USR_TXREADY|
+				MCFUART_USR_TXEMPTY)) ==
+			MCFUART_USR_TXREADY)
+			fifo_cnt++;
+		if (fifo_cnt == 0)
+			break;
+		set_current_state(TASK_INTERRUPTIBLE);
+		schedule_timeout(char_time);
+		if (signal_pending(current))
+			break;
+		if (timeout && time_after(jiffies, orig_jiffies + timeout))
+			break;
+	}
+#else
+	/*
+	 * For the other coldfire models, assume all data has been sent
+	 */
+#endif
+}
+
+/*
  * mcfrs_hangup() --- called by tty_hangup() when a hangup is signaled.
  */
 void mcfrs_hangup(struct tty_struct *tty)
@@ -1413,7 +1503,7 @@ static void mcfrs_irqinit(struct mcf_ser
 	volatile unsigned long	*portp;
 	volatile unsigned char	*uartp;
 
-	uartp = (volatile unsigned char *) info->addr;
+	uartp = info->addr;
 	icrp = (volatile unsigned long *) (MCF_MBAR + MCFSIM_ICR2);
 
 	switch (info->line) {
@@ -1438,7 +1528,7 @@ static void mcfrs_irqinit(struct mcf_ser
 	volatile unsigned char *icrp, *uartp;
 	volatile unsigned long *imrp;
 
-	uartp = (volatile unsigned char *) info->addr;
+	uartp = info->addr;
 
 	icrp = (volatile unsigned char *) (MCF_MBAR + MCFICM_INTC0 +
 		MCFINTC_ICR0 + MCFINT_UART0 + info->line);
@@ -1469,7 +1559,7 @@ static void mcfrs_irqinit(struct mcf_ser
 		return;
 	}
 
-	uartp = (volatile unsigned char *) info->addr;
+	uartp = info->addr;
 	uartp[MCFUART_UIVR] = info->irq;
 #endif
 
@@ -1503,7 +1593,7 @@ int mcfrs_readproc(char *page, char **st
 	for (i = 0; (i < NR_PORTS); i++) {
 		info = &mcfrs_table[i];
 		len += sprintf((page + len), "%d: port:%x irq=%d baud:%d ",
-			i, info->addr, info->irq, info->baud);
+			i, (unsigned int) info->addr, info->irq, info->baud);
 		if (info->stats.rx || info->stats.tx)
 			len += sprintf((page + len), "tx:%d rx:%d ",
 			info->stats.tx, info->stats.rx);
@@ -1562,7 +1652,8 @@ static struct tty_operations mcfrs_ops =
 	.start = mcfrs_start,
 	.hangup = mcfrs_hangup,
 	.read_proc = mcfrs_readproc,
-	.tiocmget = mcfrs_tiocmget,
+	.wait_until_sent = mcfrs_wait_until_sent,
+ 	.tiocmget = mcfrs_tiocmget,
 	.tiocmset = mcfrs_tiocmset,
 };
 
@@ -1590,7 +1681,9 @@ mcfrs_init(void)
 	show_serial_version();
 
 	/* Initialize the tty_driver structure */
+	mcfrs_serial_driver->owner = THIS_MODULE;
 	mcfrs_serial_driver->name = "ttyS";
+	mcfrs_serial_driver->devfs_name = "ttys/";
 	mcfrs_serial_driver->driver_name = "serial";
 	mcfrs_serial_driver->major = TTY_MAJOR;
 	mcfrs_serial_driver->minor_start = 64;
@@ -1635,7 +1728,8 @@ mcfrs_init(void)
 		mcfrs_setsignals(info, 0, 0);
 		mcfrs_irqinit(info);
 
-		printk("ttyS%d at 0x%04x (irq = %d)", info->line, info->addr, info->irq);
+		printk("ttyS%d at 0x%04x (irq = %d)", info->line,
+			(unsigned int) info->addr, info->irq);
 		printk(" is a builtin ColdFire UART\n");
 	}
 
--- diff/drivers/serial/mcfserial.h	2003-06-30 10:07:23.000000000 +0100
+++ source/drivers/serial/mcfserial.h	2004-04-21 10:45:34.998382936 +0100
@@ -40,7 +40,7 @@ struct mcf_stats {
 
 struct mcf_serial {
 	int			magic;
-	unsigned int		addr;		/* UART memory address */
+	volatile unsigned char	*addr;		/* UART memory address */
 	int			irq;
 	int			flags; 		/* defined in tty.h */
 	int			type; 		/* UART type */
--- diff/drivers/serial/sa1100.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/serial/sa1100.c	2004-04-21 10:45:35.005381872 +0100
@@ -894,6 +894,7 @@ static int sa1100_serial_probe(struct de
 			if (sa1100_ports[i].port.mapbase != res->start)
 				continue;
 
+			sa1100_ports[i].port.dev = _dev;
 			uart_add_one_port(&sa1100_reg, &sa1100_ports[i].port);
 			dev_set_drvdata(_dev, &sa1100_ports[i]);
 			break;
--- diff/drivers/serial/serial_core.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/serial/serial_core.c	2004-04-21 10:45:35.016380200 +0100
@@ -2227,7 +2227,7 @@ int uart_add_one_port(struct uart_driver
 	 * Register the port whether it's detected or not.  This allows
 	 * setserial to be used to alter this ports parameters.
 	 */
-	tty_register_device(drv->tty_driver, port->line, NULL);
+	tty_register_device(drv->tty_driver, port->line, port->dev);
 
  out:
 	up(&port_sem);
--- diff/drivers/serial/serial_cs.c	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/serial/serial_cs.c	2004-04-21 10:45:35.023379136 +0100
@@ -32,6 +32,7 @@
 ======================================================================*/
 
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/sched.h>
@@ -54,6 +55,8 @@
 #include <pcmcia/ds.h>
 #include <pcmcia/cisreg.h>
 
+#include "8250.h"
+
 #ifdef PCMCIA_DEBUG
 static int pc_debug = PCMCIA_DEBUG;
 MODULE_PARM(pc_debug, "i");
@@ -69,17 +72,18 @@ static char *version = "serial_cs.c 1.13
 
 /* Bit map of interrupts to choose from */
 static u_int irq_mask = 0xdeb8;
-static int irq_list[4] = { -1 };
+static int irq_list[4];
+static unsigned int irq_list_count;
 
 /* Enable the speaker? */
 static int do_sound = 1;
 /* Skip strict UART tests? */
 static int buggy_uart;
 
-MODULE_PARM(irq_mask, "i");
-MODULE_PARM(irq_list, "1-4i");
-MODULE_PARM(do_sound, "i");
-MODULE_PARM(buggy_uart, "i");
+module_param(irq_mask, uint, 0444);
+module_param_array(irq_list, int, irq_list_count, 0444);
+module_param(do_sound, int, 0444);
+module_param(buggy_uart, int, 0444);
 
 /*====================================================================*/
 
@@ -158,6 +162,38 @@ static void serial_remove(dev_link_t *li
 	}
 }
 
+static void serial_suspend(dev_link_t *link)
+{
+	link->state |= DEV_SUSPEND;
+
+	if (link->state & DEV_CONFIG) {
+		struct serial_info *info = link->priv;
+		int i;
+
+		for (i = 0; i < info->ndev; i++)
+			serial8250_suspend_port(info->line[i]);
+
+		if (!info->slave)
+			pcmcia_release_configuration(link->handle);
+	}
+}
+
+static void serial_resume(dev_link_t *link)
+{
+	link->state &= ~DEV_SUSPEND;
+
+	if (DEV_OK(link)) {
+		struct serial_info *info = link->priv;
+		int i;
+
+		if (!info->slave)
+			pcmcia_request_configuration(link->handle, &link->conf);
+
+		for (i = 0; i < info->ndev; i++)
+			serial8250_resume_port(info->line[i]);
+	}
+}
+
 /*======================================================================
 
     serial_attach() creates an "instance" of the driver, allocating
@@ -187,10 +223,10 @@ static dev_link_t *serial_attach(void)
 	link->io.NumPorts1 = 8;
 	link->irq.Attributes = IRQ_TYPE_EXCLUSIVE;
 	link->irq.IRQInfo1 = IRQ_INFO2_VALID | IRQ_LEVEL_ID;
-	if (irq_list[0] == -1)
+	if (irq_list_count == 0)
 		link->irq.IRQInfo2 = irq_mask;
 	else
-		for (i = 0; i < 4; i++)
+		for (i = 0; i < irq_list_count; i++)
 			link->irq.IRQInfo2 |= 1 << irq_list[i];
 	link->conf.Attributes = CONF_ENABLE_IRQ;
 	if (do_sound) {
@@ -674,16 +710,18 @@ serial_event(event_t event, int priority
 		break;
 
 	case CS_EVENT_PM_SUSPEND:
-		link->state |= DEV_SUSPEND;
-		/* Fall through... */
+		serial_suspend(link);
+		break;
+
 	case CS_EVENT_RESET_PHYSICAL:
 		if ((link->state & DEV_CONFIG) && !info->slave)
 			pcmcia_release_configuration(link->handle);
 		break;
 
 	case CS_EVENT_PM_RESUME:
-		link->state &= ~DEV_SUSPEND;
-		/* Fall through... */
+		serial_resume(link);
+		break;
+
 	case CS_EVENT_CARD_RESET:
 		if (DEV_OK(link) && !info->slave)
 			pcmcia_request_configuration(link->handle, &link->conf);
--- diff/drivers/serial/sh-sci.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/serial/sh-sci.c	2004-04-21 10:45:35.024378984 +0100
@@ -297,10 +297,10 @@ static void kgdb_break_interrupt(int irq
 #if defined(__H8300S__)
 enum { sci_disable, sci_enable };
 
-static void h8300_sci_enable(struct sci_port* port, unsigned int ctrl)
+static void h8300_sci_enable(struct uart_port* port, unsigned int ctrl)
 {
 	volatile unsigned char *mstpcrl=(volatile unsigned char *)MSTPCRL;
-	int ch = (port->base  - SMR0) >> 3;
+	int ch = (port->mapbase  - SMR0) >> 3;
 	unsigned char mask = 1 << (ch+1);
 
 	if (ctrl == sci_disable) {
@@ -313,9 +313,9 @@ static void h8300_sci_enable(struct sci_
 
 #if defined(SCI_ONLY) || defined(SCI_AND_SCIF)
 #if defined(__H8300H__) || defined(__H8300S__)
-static void sci_init_pins_sci(struct sci_port* port, unsigned int cflag)
+static void sci_init_pins_sci(struct uart_port* port, unsigned int cflag)
 {
-	int ch = (port->base - SMR0) >> 3;
+	int ch = (port->mapbase - SMR0) >> 3;
 
 	/* set DDR regs */
 	H8300_GPIO_DDR(h8300_sci_pins[ch].port,h8300_sci_pins[ch].rx,H8300_GPIO_INPUT);
@@ -418,11 +418,15 @@ static void sci_transmit_chars(struct ua
 		return;
 	}
 
+#if !defined(SCI_ONLY)
 	if (port->type == PORT_SCIF) {
 		txroom = 16 - (sci_in(port, SCFDR)>>8);
 	} else {
 		txroom = (sci_in(port, SCxSR) & SCI_TDRE)?1:0;
 	}
+#else
+	txroom = (sci_in(port, SCxSR) & SCI_TDRE)?1:0;
+#endif
 
 	count = txroom;
 
@@ -454,10 +458,12 @@ static void sci_transmit_chars(struct ua
 		local_irq_save(flags);
 		ctrl = sci_in(port, SCSCR);
 
+#if !defined(SCI_ONLY)
 		if (port->type == PORT_SCIF) {
 			sci_in(port, SCxSR); /* Dummy read */
 			sci_out(port, SCxSR, SCxSR_TDxE_CLEAR(port));
 		}
+#endif
 
 		ctrl |= SCI_CTRL_FLAGS_TIE;
 		sci_out(port, SCSCR, ctrl);
@@ -480,11 +486,15 @@ static inline void sci_receive_chars(str
 		return;
 
 	while (1) {
+#if !defined(SCI_ONLY)
 		if (port->type == PORT_SCIF) {
 			count = sci_in(port, SCFDR)&0x001f;
 		} else {
 			count = (sci_in(port, SCxSR)&SCxSR_RDxF(port))?1:0;
 		}
+#else
+		count = (sci_in(port, SCxSR)&SCxSR_RDxF(port))?1:0;
+#endif
 
 		/* Don't copy more bytes than there is room for in the buffer */
 		if (tty->flip.count + count > TTY_FLIPBUF_SIZE)
@@ -936,9 +946,11 @@ static void sci_set_termios(struct uart_
 
 	sci_out(port, SCSCR, 0x00);	/* TE=0, RE=0, CKE1=0 */
 
+#if !defined(SCI_ONLY)
 	if (port->type == PORT_SCIF) {
 		sci_out(port, SCFCR, SCFCR_RFRST | SCFCR_TFRST);
 	}
+#endif
 
 	smr_val = sci_in(port, SCSMR) & 3;
 	if ((termios->c_cflag & CSIZE) == CS7)
@@ -1276,7 +1288,7 @@ static struct sci_port sci_ports[SCI_NPO
 			.line		= 1,
 		},
 		.type		= PORT_SCI,
-		.irqs		= H8S_IRQS1,
+		.irqs		= H8S_SCI_IRQS1,
 		.init_pins	= sci_init_pins_sci,
 	},
 	{
@@ -1290,7 +1302,7 @@ static struct sci_port sci_ports[SCI_NPO
 			.line		= 2,
 		},
 		.type		= PORT_SCI,
-		.irqs		= H8S_IRQS2,
+		.irqs		= H8S_SCI_IRQS2,
 		.init_pins	= sci_init_pins_sci,
 	},
 #else
@@ -1328,8 +1340,11 @@ static int __init serial_console_setup(s
 	 * We need to set the initial uartclk here, since otherwise it will
 	 * only ever be setup at sci_init() time.
 	 */
+#if !defined(__H8300H__) && !defined(__H8300S__)
 	port->uartclk = current_cpu_data.module_clock * 16;
-
+#else
+	port->uartclk = CONFIG_CPU_CLOCK;
+#endif
 	if (options)
 		uart_parse_options(options, &baud, &parity, &bits, &flow);
 
@@ -1468,7 +1483,11 @@ static int __init sci_init(void)
 		for (chan = 0; chan < SCI_NPORTS; chan++) {
 			struct sci_port *sciport = &sci_ports[chan];
 
+#if !defined(__H8300H__) && !defined(__H8300S__)
 			sciport->port.uartclk = (current_cpu_data.module_clock * 16);
+#else
+			sciport->port.uartclk = CONFIG_CPU_CLOCK;
+#endif
 			uart_add_one_port(&sci_uart_driver, &sciport->port);
 			sciport->break_timer.data = (unsigned long)sciport;
 			sciport->break_timer.function = sci_break_timer;
--- diff/drivers/serial/sh-sci.h	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/serial/sh-sci.h	2004-04-21 10:45:35.025378832 +0100
@@ -240,11 +240,11 @@ struct sci_port {
   }
 
 #define CPU_SCI_FNS(name, sci_offset, sci_size)				\
-  static inline unsigned int sci_##name##_in(struct sci_port* port)	\
+  static inline unsigned int sci_##name##_in(struct uart_port* port)	\
   {									\
     SCI_IN(sci_size, sci_offset);		 			\
   }									\
-  static inline void sci_##name##_out(struct sci_port* port, unsigned int value) \
+  static inline void sci_##name##_out(struct uart_port* port, unsigned int value) \
   {									\
     SCI_OUT(sci_size, sci_offset, value);				\
   }
@@ -379,9 +379,9 @@ static inline int sci_rxd_in(struct uart
 
 }
 #elif defined(__H8300H__) || defined(__H8300S__)
-static inline int sci_rxd_in(struct sci_port *port)
+static inline int sci_rxd_in(struct uart_port *port)
 {
-	int ch = (port->base - SMR0) >> 3;
+	int ch = (port->mapbase - SMR0) >> 3;
 	return (H8300_SCI_DR(ch) & h8300_sci_pins[ch].rx) ? 1 : 0;
 }
 #endif
--- diff/drivers/tc/lk201.c	2002-11-28 11:30:25.000000000 +0000
+++ source/drivers/tc/lk201.c	2004-04-21 10:45:35.026378680 +0100
@@ -74,7 +74,7 @@ static int __init lk201_reset(struct dec
 
 	for (i = 0; i < sizeof(lk201_reset_string); i++)
 		if (info->hook->poll_tx_char(info, lk201_reset_string[i])) {
-			printk(__FUNCTION__" transmit timeout\n");
+			printk("%s transmit timeout\n", __FUNCTION__);
 			return -EIO;
 		}
 	return 0;
--- diff/drivers/tc/zs.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/tc/zs.c	2004-04-21 10:45:35.027378528 +0100
@@ -1988,7 +1988,8 @@ unsigned int register_zs_hook(unsigned i
 	struct dec_serial *info = &zs_soft[channel];
 
 	if (info->hook) {
-		printk(__FUNCTION__": line %d has already a hook registered\n", channel);
+		printk("%s: line %d has already a hook registered\n",
+		       __FUNCTION__, channel);
 
 		return 0;
 	} else {
@@ -2015,8 +2016,8 @@ unsigned int unregister_zs_hook(unsigned
                 info->hook = NULL;
                 return 1;
         } else {
-                printk(__FUNCTION__": trying to unregister hook on line %d,"
-                       " but none is registered\n", channel);
+                printk("%s: trying to unregister hook on line %d,"
+                       " but none is registered\n", __FUNCTION__, channel);
                 return 0;
         }
 }
--- diff/drivers/usb/Makefile	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/Makefile	2004-04-21 10:45:35.027378528 +0100
@@ -55,8 +55,11 @@ obj-$(CONFIG_USB_MICROTEK)	+= image/
 obj-$(CONFIG_USB_SERIAL)	+= serial/
 
 obj-$(CONFIG_USB_AUERSWALD)	+= misc/
+obj-$(CONFIG_USB_CYTHERM)	+= misc/
 obj-$(CONFIG_USB_EMI26)		+= misc/
+obj-$(CONFIG_USB_EMI62)		+= misc/
 obj-$(CONFIG_USB_LCD)		+= misc/
+obj-$(CONFIG_USB_LED)		+= misc/
 obj-$(CONFIG_USB_LEGOTOWER)	+= misc/
 obj-$(CONFIG_USB_RIO500)	+= misc/
 obj-$(CONFIG_USB_SPEEDTOUCH)	+= misc/
--- diff/drivers/usb/core/config.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/core/config.c	2004-04-21 10:45:35.028378376 +0100
@@ -1,28 +1,62 @@
+#include <linux/config.h>
+
+#ifdef CONFIG_USB_DEBUG
+#define DEBUG
+#endif
+
 #include <linux/usb.h>
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/slab.h>
+#include <linux/device.h>
 #include <asm/byteorder.h>
 
 
 #define USB_MAXALTSETTING		128	/* Hard limit */
 #define USB_MAXENDPOINTS		30	/* Hard limit */
 
-/* these maximums are arbitrary */
-#define USB_MAXCONFIG			8
-#define USB_MAXINTERFACES		32
+#define USB_MAXCONFIG			8	/* Arbitrary limit */
+
 
-static int usb_parse_endpoint(struct usb_host_endpoint *endpoint, unsigned char *buffer, int size)
+static int find_next_descriptor(unsigned char *buffer, int size,
+    int dt1, int dt2, int *num_skipped)
+{
+	struct usb_descriptor_header *h;
+	int n = 0;
+	unsigned char *buffer0 = buffer;
+
+	/* Find the next descriptor of type dt1 or dt2 */
+	while (size >= sizeof(struct usb_descriptor_header)) {
+		h = (struct usb_descriptor_header *) buffer;
+		if (h->bDescriptorType == dt1 || h->bDescriptorType == dt2)
+			break;
+		buffer += h->bLength;
+		size -= h->bLength;
+		++n;
+	}
+
+	/* Store the number of descriptors skipped and return the
+	 * number of bytes skipped */
+	if (num_skipped)
+		*num_skipped = n;
+	return buffer - buffer0;
+}
+
+static int usb_parse_endpoint(struct device *ddev, int cfgno, int inum,
+    int asnum, struct usb_host_endpoint *endpoint,
+    unsigned char *buffer, int size)
 {
 	unsigned char *buffer0 = buffer;
 	struct usb_descriptor_header *header;
-	unsigned char *begin;
-	int numskipped;
+	int n, i;
 
 	header = (struct usb_descriptor_header *)buffer;
 	if (header->bDescriptorType != USB_DT_ENDPOINT) {
-		warn("unexpected descriptor 0x%X, expecting endpoint, 0x%X",
-			header->bDescriptorType, USB_DT_ENDPOINT);
+		dev_err(ddev, "config %d interface %d altsetting %d has an "
+		    "unexpected descriptor of type 0x%X, "
+		    "expecting endpoint type 0x%X\n",
+		    cfgno, inum, asnum,
+		    header->bDescriptorType, USB_DT_ENDPOINT);
 		return -EINVAL;
 	}
 
@@ -31,13 +65,17 @@ static int usb_parse_endpoint(struct usb
 	else if (header->bLength >= USB_DT_ENDPOINT_SIZE)
 		memcpy(&endpoint->desc, buffer, USB_DT_ENDPOINT_SIZE);
 	else {
-		warn("invalid endpoint descriptor");
+		dev_err(ddev, "config %d interface %d altsetting %d has an "
+		    "invalid endpoint descriptor of length %d\n",
+		    cfgno, inum, asnum, header->bLength);
 		return -EINVAL;
 	}
 
-	if ((endpoint->desc.bEndpointAddress & ~USB_ENDPOINT_DIR_MASK) >= 16) {
-		warn("invalid endpoint address 0x%X",
-		    endpoint->desc.bEndpointAddress);
+	i = endpoint->desc.bEndpointAddress & ~USB_ENDPOINT_DIR_MASK;
+	if (i >= 16 || i == 0) {
+		dev_err(ddev, "config %d interface %d altsetting %d has an "
+		    "invalid endpoint with address 0x%X\n",
+		    cfgno, inum, asnum, endpoint->desc.bEndpointAddress);
 		return -EINVAL;
 	}
 
@@ -46,30 +84,16 @@ static int usb_parse_endpoint(struct usb
 	buffer += header->bLength;
 	size -= header->bLength;
 
-	/* Skip over any Class Specific or Vendor Specific descriptors */
-	begin = buffer;
-	numskipped = 0;
-	while (size >= sizeof(struct usb_descriptor_header)) {
-		header = (struct usb_descriptor_header *)buffer;
-
-		/* If we find another "proper" descriptor then we're done  */
-		if ((header->bDescriptorType == USB_DT_ENDPOINT) ||
-		    (header->bDescriptorType == USB_DT_INTERFACE))
-			break;
-
-		dbg("skipping descriptor 0x%X", header->bDescriptorType);
-		numskipped++;
-
-		buffer += header->bLength;
-		size -= header->bLength;
-	}
-	if (numskipped) {
-		dbg("skipped %d class/vendor specific endpoint descriptors", numskipped);
-		endpoint->extra = begin;
-		endpoint->extralen = buffer - begin;
-	}
-
-	return buffer - buffer0;
+	/* Skip over any Class Specific or Vendor Specific descriptors;
+	 * find the next endpoint or interface descriptor */
+	endpoint->extra = buffer;
+	i = find_next_descriptor(buffer, size, USB_DT_ENDPOINT,
+	    USB_DT_INTERFACE, &n);
+	endpoint->extralen = i;
+	if (n > 0)
+		dev_dbg(ddev, "skipped %d class/vendor specific endpoint "
+		    "descriptors\n", n);
+	return buffer - buffer0 + i;
 }
 
 static void usb_free_intf(struct usb_interface *intf)
@@ -78,253 +102,235 @@ static void usb_free_intf(struct usb_int
 
 	if (intf->altsetting) {
 		for (j = 0; j < intf->num_altsetting; j++) {
-			struct usb_host_interface *as = &intf->altsetting[j];
+			struct usb_host_interface *alt = &intf->altsetting[j];
 
-			kfree(as->endpoint);
+			kfree(alt->endpoint);
 		}
 		kfree(intf->altsetting);
 	}
 	kfree(intf);
 }
 
-static int usb_parse_interface(struct usb_host_config *config, unsigned char *buffer, int size)
+static int usb_parse_interface(struct device *ddev, int cfgno,
+    struct usb_host_config *config, unsigned char *buffer, int size)
 {
 	unsigned char *buffer0 = buffer;
 	struct usb_interface_descriptor	*d;
 	int inum, asnum;
 	struct usb_interface *interface;
-	struct usb_host_interface *ifp;
-	int len, numskipped;
-	struct usb_descriptor_header *header;
-	unsigned char *begin;
-	int i, retval;
+	struct usb_host_interface *alt;
+	int i, n;
+	int len, retval;
 
 	d = (struct usb_interface_descriptor *) buffer;
+	buffer += d->bLength;
+	size -= d->bLength;
+
 	if (d->bDescriptorType != USB_DT_INTERFACE) {
-		warn("unexpected descriptor 0x%X, expecting interface, 0x%X",
-			d->bDescriptorType, USB_DT_INTERFACE);
+		dev_err(ddev, "config %d has an unexpected descriptor of type "
+		    "0x%X, expecting interface type 0x%X\n",
+		    cfgno, d->bDescriptorType, USB_DT_INTERFACE);
 		return -EINVAL;
 	}
 
 	inum = d->bInterfaceNumber;
-	if (inum >= config->desc.bNumInterfaces) {
-
-		/* Skip to the next interface descriptor */
-		buffer += d->bLength;
-		size -= d->bLength;
-		while (size >= sizeof(struct usb_descriptor_header)) {
-			header = (struct usb_descriptor_header *) buffer;
-
-			if (header->bDescriptorType == USB_DT_INTERFACE)
-				break;
-			buffer += header->bLength;
-			size -= header->bLength;
-		}
-		return buffer - buffer0;
-	}
+	if (inum >= config->desc.bNumInterfaces)
+		goto skip_to_next_interface_descriptor;
 
 	interface = config->interface[inum];
 	asnum = d->bAlternateSetting;
 	if (asnum >= interface->num_altsetting) {
-		warn("invalid alternate setting %d for interface %d",
-		    asnum, inum);
+		dev_err(ddev, "config %d interface %d has an invalid "
+		    "alternate setting number: %d but max is %d\n",
+		    cfgno, inum, asnum, interface->num_altsetting - 1);
 		return -EINVAL;
 	}
 
-	ifp = &interface->altsetting[asnum];
-	if (ifp->desc.bLength) {
-		warn("duplicate descriptor for interface %d altsetting %d",
-		    inum, asnum);
+	alt = &interface->altsetting[asnum];
+	if (alt->desc.bLength) {
+		dev_err(ddev, "Duplicate descriptor for config %d "
+		    "interface %d altsetting %d\n", cfgno, inum, asnum);
 		return -EINVAL;
 	}
-	memcpy(&ifp->desc, buffer, USB_DT_INTERFACE_SIZE);
-
-	buffer += d->bLength;
-	size -= d->bLength;
-
-	/* Skip over any Class Specific or Vendor Specific descriptors */
-	begin = buffer;
-	numskipped = 0;
-	while (size >= sizeof(struct usb_descriptor_header)) {
-		header = (struct usb_descriptor_header *)buffer;
-
-		/* If we find another "proper" descriptor then we're done  */
-		if ((header->bDescriptorType == USB_DT_INTERFACE) ||
-		    (header->bDescriptorType == USB_DT_ENDPOINT))
-			break;
-
-		dbg("skipping descriptor 0x%X", header->bDescriptorType);
-		numskipped++;
-
-		buffer += header->bLength;
-		size -= header->bLength;
-	}
-	if (numskipped) {
-		dbg("skipped %d class/vendor specific interface descriptors", numskipped);
-		ifp->extra = begin;
-		ifp->extralen = buffer - begin;
-	}
+	memcpy(&alt->desc, d, USB_DT_INTERFACE_SIZE);
 
-	if (ifp->desc.bNumEndpoints > USB_MAXENDPOINTS) {
-		warn("too many endpoints for interface %d altsetting %d",
-		    inum, asnum);
+	/* Skip over any Class Specific or Vendor Specific descriptors;
+	 * find the first endpoint or interface descriptor */
+	alt->extra = buffer;
+	i = find_next_descriptor(buffer, size, USB_DT_ENDPOINT,
+	    USB_DT_INTERFACE, &n);
+	alt->extralen = i;
+	if (n > 0)
+		dev_dbg(ddev, "skipped %d class/vendor specific "
+		    "interface descriptors\n", n);
+	buffer += i;
+	size -= i;
+
+	if (alt->desc.bNumEndpoints > USB_MAXENDPOINTS) {
+		dev_err(ddev, "too many endpoints for config %d interface %d "
+		    "altsetting %d: %d, maximum allowed: %d\n",
+		    cfgno, inum, asnum, alt->desc.bNumEndpoints,
+		    USB_MAXENDPOINTS);
 		return -EINVAL;
 	}
 
-	len = ifp->desc.bNumEndpoints * sizeof(struct usb_host_endpoint);
-	ifp->endpoint = kmalloc(len, GFP_KERNEL);
-	if (!ifp->endpoint) {
-		err("out of memory");
+	len = alt->desc.bNumEndpoints * sizeof(struct usb_host_endpoint);
+	alt->endpoint = kmalloc(len, GFP_KERNEL);
+	if (!alt->endpoint)
 		return -ENOMEM;
-	}
-	memset(ifp->endpoint, 0, len);
+	memset(alt->endpoint, 0, len);
 
-	for (i = 0; i < ifp->desc.bNumEndpoints; i++) {
+	for (i = 0; i < alt->desc.bNumEndpoints; i++) {
 		if (size < USB_DT_ENDPOINT_SIZE) {
-			warn("ran out of descriptors while parsing endpoints");
+			dev_err(ddev, "too few endpoint descriptors for "
+			    "config %d interface %d altsetting %d\n",
+			    cfgno, inum, asnum);
 			return -EINVAL;
 		}
 
-		retval = usb_parse_endpoint(ifp->endpoint + i, buffer, size);
+		retval = usb_parse_endpoint(ddev, cfgno, inum, asnum,
+		    alt->endpoint + i, buffer, size);
 		if (retval < 0)
 			return retval;
 
 		buffer += retval;
 		size -= retval;
 	}
-
 	return buffer - buffer0;
+
+skip_to_next_interface_descriptor:
+	i = find_next_descriptor(buffer, size, USB_DT_INTERFACE,
+	    USB_DT_INTERFACE, NULL);
+	return buffer - buffer0 + i;
 }
 
-int usb_parse_configuration(struct usb_host_config *config, char *buffer, int size)
+int usb_parse_configuration(struct device *ddev, int cfgidx,
+    struct usb_host_config *config, unsigned char *buffer, int size)
 {
+	int cfgno;
 	int nintf, nintf_orig;
-	int i, j;
+	int i, j, n;
 	struct usb_interface *interface;
-	char *buffer2;
+	unsigned char *buffer2;
 	int size2;
 	struct usb_descriptor_header *header;
-	int numskipped, len;
-	char *begin;
-	int retval;
+	int len, retval;
 
 	memcpy(&config->desc, buffer, USB_DT_CONFIG_SIZE);
 	if (config->desc.bDescriptorType != USB_DT_CONFIG ||
 	    config->desc.bLength < USB_DT_CONFIG_SIZE) {
-		warn("invalid configuration descriptor");
+		dev_err(ddev, "invalid descriptor for config index %d: "
+		    "type = 0x%X, length = %d\n", cfgidx,
+		    config->desc.bDescriptorType, config->desc.bLength);
 		return -EINVAL;
 	}
 	config->desc.wTotalLength = size;
+	cfgno = config->desc.bConfigurationValue;
+
+	buffer += config->desc.bLength;
+	size -= config->desc.bLength;
 
 	nintf = nintf_orig = config->desc.bNumInterfaces;
 	if (nintf > USB_MAXINTERFACES) {
-		warn("too many interfaces (%d max %d)",
-		    nintf, USB_MAXINTERFACES);
+		dev_warn(ddev, "config %d has too many interfaces: %d, "
+		    "using maximum allowed: %d\n",
+		    cfgno, nintf, USB_MAXINTERFACES);
 		config->desc.bNumInterfaces = nintf = USB_MAXINTERFACES;
 	}
 
 	for (i = 0; i < nintf; ++i) {
 		interface = config->interface[i] =
 		    kmalloc(sizeof(struct usb_interface), GFP_KERNEL);
-		dbg("kmalloc IF %p, numif %i", interface, i);
-		if (!interface) {
-			err("out of memory");
+		if (!interface)
 			return -ENOMEM;
-		}
 		memset(interface, 0, sizeof(struct usb_interface));
 	}
 
 	/* Go through the descriptors, checking their length and counting the
 	 * number of altsettings for each interface */
-	buffer2 = buffer;
-	size2 = size;
-	j = 0;
-	while (size2 >= sizeof(struct usb_descriptor_header)) {
+	for ((buffer2 = buffer, size2 = size);
+	      size2 >= sizeof(struct usb_descriptor_header);
+	     (buffer2 += header->bLength, size2 -= header->bLength)) {
+
 		header = (struct usb_descriptor_header *) buffer2;
 		if ((header->bLength > size2) || (header->bLength < 2)) {
-			warn("invalid descriptor of length %d", header->bLength);
+			dev_err(ddev, "config %d has an invalid descriptor "
+			    "of length %d\n", cfgno, header->bLength);
 			return -EINVAL;
 		}
 
 		if (header->bDescriptorType == USB_DT_INTERFACE) {
 			struct usb_interface_descriptor *d;
 
-			if (header->bLength < USB_DT_INTERFACE_SIZE) {
-				warn("invalid interface descriptor");
+			d = (struct usb_interface_descriptor *) header;
+			if (d->bLength < USB_DT_INTERFACE_SIZE) {
+				dev_err(ddev, "config %d has an invalid "
+				    "interface descriptor of length %d\n",
+				    cfgno, d->bLength);
 				return -EINVAL;
 			}
-			d = (struct usb_interface_descriptor *) header;
+
 			i = d->bInterfaceNumber;
 			if (i >= nintf_orig) {
-				warn("invalid interface number (%d/%d)",
-				    i, nintf_orig);
+				dev_err(ddev, "config %d has an invalid "
+				    "interface number: %d but max is %d\n",
+				    cfgno, i, nintf_orig - 1);
 				return -EINVAL;
 			}
 			if (i < nintf)
 				++config->interface[i]->num_altsetting;
 
-		} else if ((header->bDescriptorType == USB_DT_DEVICE ||
-		    header->bDescriptorType == USB_DT_CONFIG) && j) {
-			warn("unexpected descriptor type 0x%X", header->bDescriptorType);
+		} else if (header->bDescriptorType == USB_DT_DEVICE ||
+			    header->bDescriptorType == USB_DT_CONFIG) {
+			dev_err(ddev, "config %d contains an unexpected "
+			    "descriptor of type 0x%X\n",
+			    cfgno, header->bDescriptorType);
 			return -EINVAL;
 		}
 
-		j = 1;
-		buffer2 += header->bLength;
-		size2 -= header->bLength;
-	}
+	}	/* for ((buffer2 = buffer, size2 = size); ...) */
 
 	/* Allocate the altsetting arrays */
-	for (i = 0; i < config->desc.bNumInterfaces; ++i) {
+	for (i = 0; i < nintf; ++i) {
 		interface = config->interface[i];
 		if (interface->num_altsetting > USB_MAXALTSETTING) {
-			warn("too many alternate settings for interface %d (%d max %d)\n",
-			    i, interface->num_altsetting, USB_MAXALTSETTING);
+			dev_err(ddev, "too many alternate settings for "
+			    "config %d interface %d: %d, "
+			    "maximum allowed: %d\n",
+			    cfgno, i, interface->num_altsetting,
+			    USB_MAXALTSETTING);
 			return -EINVAL;
 		}
 		if (interface->num_altsetting == 0) {
-			warn("no alternate settings for interface %d", i);
+			dev_err(ddev, "config %d has no interface number "
+			    "%d\n", cfgno, i);
 			return -EINVAL;
 		}
 
-		len = sizeof(*interface->altsetting) * interface->num_altsetting;
+		len = sizeof(*interface->altsetting) *
+		    interface->num_altsetting;
 		interface->altsetting = kmalloc(len, GFP_KERNEL);
-		if (!interface->altsetting) {
-			err("couldn't kmalloc interface->altsetting");
+		if (!interface->altsetting)
 			return -ENOMEM;
-		}
 		memset(interface->altsetting, 0, len);
 	}
 
-	buffer += config->desc.bLength;
-	size -= config->desc.bLength;
-
-	/* Skip over any Class Specific or Vendor Specific descriptors */
-	begin = buffer;
-	numskipped = 0;
-	while (size >= sizeof(struct usb_descriptor_header)) {
-		header = (struct usb_descriptor_header *)buffer;
-
-		/* If we find another "proper" descriptor then we're done  */
-		if ((header->bDescriptorType == USB_DT_ENDPOINT) ||
-		    (header->bDescriptorType == USB_DT_INTERFACE))
-			break;
-
-		dbg("skipping descriptor 0x%X", header->bDescriptorType);
-		numskipped++;
-
-		buffer += header->bLength;
-		size -= header->bLength;
-	}
-	if (numskipped) {
-		dbg("skipped %d class/vendor specific configuration descriptors", numskipped);
-		config->extra = begin;
-		config->extralen = buffer - begin;
-	}
+	/* Skip over any Class Specific or Vendor Specific descriptors;
+	 * find the first interface descriptor */
+	config->extra = buffer;
+	i = find_next_descriptor(buffer, size, USB_DT_INTERFACE,
+	    USB_DT_INTERFACE, &n);
+	config->extralen = i;
+	if (n > 0)
+		dev_dbg(ddev, "skipped %d class/vendor specific "
+		    "configuration descriptors\n", n);
+	buffer += i;
+	size -= i;
 
 	/* Parse all the interface/altsetting descriptors */
 	while (size >= sizeof(struct usb_descriptor_header)) {
-		retval = usb_parse_interface(config, buffer, size);
+		retval = usb_parse_interface(ddev, cfgno, config,
+		    buffer, size);
 		if (retval < 0)
 			return retval;
 
@@ -337,7 +343,8 @@ int usb_parse_configuration(struct usb_h
 		interface = config->interface[i];
 		for (j = 0; j < interface->num_altsetting; ++j) {
 			if (!interface->altsetting[j].desc.bLength) {
-				warn("missing altsetting %d for interface %d", j, i);
+				dev_err(ddev, "config %d interface %d has no "
+				    "altsetting %d\n", cfgno, i, j);
 				return -EINVAL;
 			}
 		}
@@ -360,6 +367,7 @@ void usb_destroy_configuration(struct us
 			kfree(dev->rawdescriptors[i]);
 
 		kfree(dev->rawdescriptors);
+		dev->rawdescriptors = 0;
 	}
 
 	for (c = 0; c < dev->descriptor.bNumConfigurations; c++) {
@@ -373,6 +381,7 @@ void usb_destroy_configuration(struct us
 		}
 	}
 	kfree(dev->config);
+	dev->config = 0;
 }
 
 
@@ -380,81 +389,77 @@ void usb_destroy_configuration(struct us
 // (used by real hubs and virtual root hubs)
 int usb_get_configuration(struct usb_device *dev)
 {
+	struct device *ddev = &dev->dev;
 	int ncfg = dev->descriptor.bNumConfigurations;
-	int result;
+	int result = -ENOMEM;
 	unsigned int cfgno, length;
 	unsigned char *buffer;
 	unsigned char *bigbuffer;
  	struct usb_config_descriptor *desc;
 
 	if (ncfg > USB_MAXCONFIG) {
-		warn("too many configurations (%d max %d)",
-		    ncfg, USB_MAXCONFIG);
+		dev_warn(ddev, "too many configurations: %d, "
+		    "using maximum allowed: %d\n", ncfg, USB_MAXCONFIG);
 		dev->descriptor.bNumConfigurations = ncfg = USB_MAXCONFIG;
 	}
 
 	if (ncfg < 1) {
-		warn("no configurations");
+		dev_err(ddev, "no configurations\n");
 		return -EINVAL;
 	}
 
 	length = ncfg * sizeof(struct usb_host_config);
 	dev->config = kmalloc(length, GFP_KERNEL);
-	if (!dev->config) {
-		err("out of memory");
-		return -ENOMEM;
-	}
+	if (!dev->config)
+		goto err2;
 	memset(dev->config, 0, length);
 
 	length = ncfg * sizeof(char *);
 	dev->rawdescriptors = kmalloc(length, GFP_KERNEL);
-	if (!dev->rawdescriptors) {
-		err("out of memory");
-		return -ENOMEM;
-	}
+	if (!dev->rawdescriptors)
+		goto err2;
 	memset(dev->rawdescriptors, 0, length);
 
 	buffer = kmalloc(8, GFP_KERNEL);
-	if (!buffer) {
-		err("unable to allocate memory for configuration descriptors");
-		return -ENOMEM;
-	}
+	if (!buffer)
+		goto err2;
 	desc = (struct usb_config_descriptor *)buffer;
 
 	for (cfgno = 0; cfgno < ncfg; cfgno++) {
 		/* We grab the first 8 bytes so we know how long the whole */
-		/*  configuration is */
-		result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, buffer, 8);
-		if (result < 8) {
-			if (result < 0)
-				err("unable to get descriptor");
-			else {
-				warn("config descriptor too short (expected %i, got %i)", 8, result);
-				result = -EINVAL;
-			}
+		/* configuration is */
+		result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno,
+		    buffer, 8);
+		if (result < 0) {
+			dev_err(ddev, "unable to read config index %d "
+			    "descriptor\n", cfgno);
+			goto err;
+		} else if (result < 8) {
+			dev_err(ddev, "config index %d descriptor too short "
+			    "(expected %i, got %i)\n", cfgno, 8, result);
+			result = -EINVAL;
 			goto err;
 		}
+		length = max((int) le16_to_cpu(desc->wTotalLength),
+		    USB_DT_CONFIG_SIZE);
 
-  	  	/* Get the full buffer */
-		length = max((int) le16_to_cpu(desc->wTotalLength), USB_DT_CONFIG_SIZE);
-
+		/* Now that we know the length, get the whole thing */
 		bigbuffer = kmalloc(length, GFP_KERNEL);
 		if (!bigbuffer) {
-			err("unable to allocate memory for configuration descriptors");
 			result = -ENOMEM;
 			goto err;
 		}
-
-		/* Now that we know the length, get the whole thing */
-		result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, bigbuffer, length);
+		result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno,
+		    bigbuffer, length);
 		if (result < 0) {
-			err("couldn't get all of config descriptors");
+			dev_err(ddev, "unable to read config index %d "
+			    "descriptor\n", cfgno);
 			kfree(bigbuffer);
 			goto err;
 		}
-
 		if (result < length) {
-			err("config descriptor too short (expected %i, got %i)", length, result);
+			dev_err(ddev, "config index %d descriptor too short "
+			    "(expected %i, got %i)\n", cfgno, length, result);
 			result = -EINVAL;
 			kfree(bigbuffer);
 			goto err;
@@ -462,20 +467,23 @@ int usb_get_configuration(struct usb_dev
 
 		dev->rawdescriptors[cfgno] = bigbuffer;
 
-		result = usb_parse_configuration(&dev->config[cfgno], bigbuffer, length);
+		result = usb_parse_configuration(&dev->dev, cfgno,
+		    &dev->config[cfgno], bigbuffer, length);
 		if (result > 0)
-			dbg("descriptor data left");
+			dev_dbg(ddev, "config index %d descriptor has %d "
+			    "excess byte(s)\n", cfgno, result);
 		else if (result < 0) {
 			++cfgno;
 			goto err;
 		}
 	}
+	result = 0;
 
-	kfree(buffer);
-	return 0;
 err:
 	kfree(buffer);
 	dev->descriptor.bNumConfigurations = cfgno;
+err2:
+	if (result == -ENOMEM)
+		dev_err(ddev, "out of memory\n");
 	return result;
 }
-
--- diff/drivers/usb/core/devices.c	2003-08-20 14:16:31.000000000 +0100
+++ source/drivers/usb/core/devices.c	2004-04-21 10:45:35.029378224 +0100
@@ -238,7 +238,7 @@ static char *usb_dump_interface_descript
 
 	if (start > end)
 		return start;
-	lock_kernel(); /* driver might be unloaded */
+	down_read(&usb_bus_type.subsys.rwsem);
 	start += sprintf(start, format_iface,
 			 desc->bInterfaceNumber,
 			 desc->bAlternateSetting,
@@ -247,8 +247,10 @@ static char *usb_dump_interface_descript
 			 class_decode(desc->bInterfaceClass),
 			 desc->bInterfaceSubClass,
 			 desc->bInterfaceProtocol,
-			 iface->driver ? iface->driver->name : "(none)");
-	unlock_kernel();
+			 iface->dev.driver
+				? iface->dev.driver->name
+				: "(none)");
+	up_read(&usb_bus_type.subsys.rwsem);
 	return start;
 }
 
--- diff/drivers/usb/core/devio.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/core/devio.c	2004-04-21 10:45:35.030378072 +0100
@@ -124,14 +124,25 @@ static ssize_t usbdev_read(struct file *
 		unsigned int length = le16_to_cpu(config->wTotalLength);
 
 		if (*ppos < pos + length) {
+
+			/* The descriptor may claim to be longer than it
+			 * really is.  Here is the actual allocated length. */
+			unsigned alloclen =
+				ps->dev->config[i].desc.wTotalLength;
+
 			len = length - (*ppos - pos);
 			if (len > nbytes)
 				len = nbytes;
 
-			if (copy_to_user(buf,
-			    ps->dev->rawdescriptors[i] + (*ppos - pos), len)) {
-				ret = -EFAULT;
-				goto err;
+			/* Simply don't write (skip over) unallocated parts */
+			if (alloclen > (*ppos - pos)) {
+				alloclen -= (*ppos - pos);
+				if (copy_to_user(buf,
+				    ps->dev->rawdescriptors[i] + (*ppos - pos),
+				    min(len, alloclen))) {
+					ret = -EFAULT;
+					goto err;
+				}
 			}
 
 			*ppos += len;
@@ -328,18 +339,17 @@ static void driver_disconnect(struct usb
 	if (!ps)
 		return;
 
-	/* this waits till synchronous requests complete */
-	down_write (&ps->devsem);
+	/* NOTE:  this relies on usbcore having canceled and completed
+	 * all pending I/O requests; 2.6 does that.
+	 */
 
 	/* prevent new I/O requests */
 	ps->dev = 0;
-	ps->ifclaimed = 0;
+	clear_bit(intf->cur_altsetting->desc.bInterfaceNumber, &ps->ifclaimed);
 	usb_set_intfdata (intf, NULL);
 
 	/* force async requests to complete */
 	destroy_all_async (ps);
-
-	up_write (&ps->devsem);
 }
 
 struct usb_driver usbdevfs_driver = {
@@ -363,13 +373,15 @@ static int claimintf(struct dev_state *p
 		return 0;
 	iface = dev->actconfig->interface[intf];
 	err = -EBUSY;
-	lock_kernel();
+
+	/* lock against other changes to driver bindings */
+	down_write(&usb_bus_type.subsys.rwsem);
 	if (!usb_interface_claimed(iface)) {
 		usb_driver_claim_interface(&usbdevfs_driver, iface, ps);
 		set_bit(intf, &ps->ifclaimed);
 		err = 0;
 	}
-	unlock_kernel();
+	up_write(&usb_bus_type.subsys.rwsem);
 	return err;
 }
 
@@ -384,11 +396,14 @@ static int releaseintf(struct dev_state 
 	err = -EINVAL;
 	dev = ps->dev;
 	down(&dev->serialize);
+	/* lock against other changes to driver bindings */
+	down_write(&usb_bus_type.subsys.rwsem);
 	if (test_and_clear_bit(intf, &ps->ifclaimed)) {
 		iface = dev->actconfig->interface[intf];
 		usb_driver_release_interface(&usbdevfs_driver, iface);
 		err = 0;
 	}
+	up_write(&usb_bus_type.subsys.rwsem);
 	up(&dev->serialize);
 	return err;
 }
@@ -414,6 +429,8 @@ static int findintfep(struct usb_device 
 
 	if (ep & ~(USB_DIR_IN|0xf))
 		return -EINVAL;
+	if (!dev->actconfig)
+		return -ESRCH;
 	for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) {
 		iface = dev->actconfig->interface[i];
 		for (j = 0; j < iface->num_altsetting; j++) {
@@ -434,6 +451,8 @@ static int findintfif(struct usb_device 
 
 	if (ifn & ~0xff)
 		return -EINVAL;
+	if (!dev->actconfig)
+		return -ESRCH;
 	for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) {
 		if (dev->actconfig->interface[i]->
 				altsetting[0].desc.bInterfaceNumber == ifn)
@@ -684,9 +703,9 @@ static int proc_getdriver(struct dev_sta
 	if ((ret = findintfif(ps->dev, gd.interface)) < 0)
 		return ret;
 	interface = ps->dev->actconfig->interface[ret];
-	if (!interface->driver)
+	if (!interface->dev.driver)
 		return -ENODATA;
-	strcpy(gd.driver, interface->driver->name);
+	strncpy(gd.driver, interface->dev.driver->name, sizeof(gd.driver));
 	if (copy_to_user(arg, &gd, sizeof(gd)))
 		return -EFAULT;
 	return 0;
@@ -705,26 +724,11 @@ static int proc_connectinfo(struct dev_s
 
 static int proc_resetdevice(struct dev_state *ps)
 {
-	int i, ret;
-
-	ret = usb_reset_device(ps->dev);
-	if (ret < 0)
-		return ret;
-
-	for (i = 0; i < ps->dev->actconfig->desc.bNumInterfaces; i++) {
-		struct usb_interface *intf = ps->dev->actconfig->interface[i];
-
-		/* Don't simulate interfaces we've claimed */
-		if (test_bit(i, &ps->ifclaimed))
-			continue;
-
-		err ("%s - this function is broken", __FUNCTION__);
-		if (intf->driver && ps->dev) {
-			usb_probe_interface (&intf->dev);
-		}
-	}
+	/* FIXME when usb_reset_device() is fixed we'll need to grab
+	 * ps->dev->serialize before calling it.
+	 */
+	return usb_reset_device(ps->dev);
 
-	return 0;
 }
 
 static int proc_setintf(struct dev_state *ps, void __user *arg)
@@ -738,7 +742,7 @@ static int proc_setintf(struct dev_state
 	if ((ret = findintfif(ps->dev, setintf.interface)) < 0)
 		return ret;
 	interface = ps->dev->actconfig->interface[ret];
-	if (interface->driver) {
+	if (interface->dev.driver) {
 		if ((ret = checkintf(ps, ret)))
 			return ret;
 	}
@@ -750,10 +754,51 @@ static int proc_setintf(struct dev_state
 static int proc_setconfig(struct dev_state *ps, void __user *arg)
 {
 	unsigned int u;
+	int status = 0;
+ 	struct usb_host_config *actconfig;
 
 	if (get_user(u, (unsigned int __user *)arg))
 		return -EFAULT;
-	return usb_set_configuration(ps->dev, u);
+
+	down(&ps->dev->serialize);
+ 	actconfig = ps->dev->actconfig;
+ 
+ 	/* Don't touch the device if any interfaces are claimed.
+ 	 * It could interfere with other drivers' operations, and if
+	 * an interface is claimed by usbfs it could easily deadlock.
+	 */
+ 	if (actconfig) {
+ 		int i;
+ 
+ 		for (i = 0; i < actconfig->desc.bNumInterfaces; ++i) {
+ 			if (usb_interface_claimed(actconfig->interface[i])) {
+				dev_warn (&ps->dev->dev,
+					"usbfs: interface %d claimed "
+					"while '%s' sets config #%d\n",
+					actconfig->interface[i]
+						->cur_altsetting
+						->desc.bInterfaceNumber,
+					current->comm, u);
+#if 0	/* FIXME:  enable in 2.6.10 or so */
+ 				status = -EBUSY;
+				break;
+#endif
+			}
+ 		}
+ 	}
+
+	/* SET_CONFIGURATION is often abused as a "cheap" driver reset,
+	 * so avoid usb_set_configuration()'s kick to sysfs
+	 */
+	if (status == 0) {
+		if (actconfig && actconfig->desc.bConfigurationValue == u)
+			status = usb_reset_configuration(ps->dev);
+		else
+			status = usb_set_configuration(ps->dev, u);
+	}
+	up(&ps->dev->serialize);
+
+	return status;
 }
 
 static int proc_submiturb(struct dev_state *ps, void __user *arg)
@@ -1080,58 +1125,51 @@ static int proc_ioctl (struct dev_state 
 		}
 	}
 
-       if (!ps->dev)
-               retval = -ENODEV;
-       else if (!(ifp = usb_ifnum_to_if (ps->dev, ctrl.ifno)))
+	if (!ps->dev) {
+		if (buf)
+			kfree(buf);
+		return -ENODEV;
+	}
+
+	down(&ps->dev->serialize);
+	if (ps->dev->state != USB_STATE_CONFIGURED)
+		retval = -ENODEV;
+	else if (!(ifp = usb_ifnum_to_if (ps->dev, ctrl.ifno)))
                retval = -EINVAL;
-       else switch (ctrl.ioctl_code) {
+	else switch (ctrl.ioctl_code) {
 
-       /* disconnect kernel driver from interface, leaving it unbound.  */
-       /* maybe unbound - you get no guarantee it stays unbound */
-       case USBDEVFS_DISCONNECT:
-		/* this function is misdesigned - retained for compatibility */
-		lock_kernel();
-		driver = ifp->driver;
-		if (driver) {
-			dbg ("disconnect '%s' from dev %d interface %d",
-			     driver->name, ps->dev->devnum, ctrl.ifno);
-			usb_unbind_interface(&ifp->dev);
+	/* disconnect kernel driver from interface */
+	case USBDEVFS_DISCONNECT:
+		down_write(&usb_bus_type.subsys.rwsem);
+		if (ifp->dev.driver) {
+			driver = to_usb_driver(ifp->dev.driver);
+			dev_dbg (&ifp->dev, "disconnect by usbfs\n");
+			usb_driver_release_interface(driver, ifp);
 		} else
 			retval = -ENODATA;
-		unlock_kernel();
+		up_write(&usb_bus_type.subsys.rwsem);
 		break;
 
 	/* let kernel drivers try to (re)bind to the interface */
 	case USBDEVFS_CONNECT:
-		lock_kernel();
-		retval = usb_probe_interface (&ifp->dev);
-		unlock_kernel();
+		bus_rescan_devices(ifp->dev.bus);
 		break;
 
 	/* talk directly to the interface's driver */
 	default:
-		/* BKL used here to protect against changing the binding
-		 * of this driver to this device, as well as unloading its
-		 * driver module.
-		 */
-		lock_kernel ();
-		driver = ifp->driver;
+		down_read(&usb_bus_type.subsys.rwsem);
+		if (ifp->dev.driver)
+			driver = to_usb_driver(ifp->dev.driver);
 		if (driver == 0 || driver->ioctl == 0) {
-			unlock_kernel();
-			retval = -ENOSYS;
+			retval = -ENOTTY;
 		} else {
-			if (!try_module_get (driver->owner)) {
-				unlock_kernel();
-				retval = -ENOSYS;
-				break;
-			}
-			unlock_kernel ();
 			retval = driver->ioctl (ifp, ctrl.ioctl_code, buf);
 			if (retval == -ENOIOCTLCMD)
 				retval = -ENOTTY;
-			module_put (driver->owner);
 		}
+		up_read(&usb_bus_type.subsys.rwsem);
 	}
+	up(&ps->dev->serialize);
 
 	/* cleanup and return */
 	if (retval >= 0
--- diff/drivers/usb/core/driverfs.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/core/driverfs.c	2004-04-21 10:45:35.030378072 +0100
@@ -55,7 +55,9 @@ set_bConfigurationValue (struct device *
 
 	if (sscanf (buf, "%u", &config) != 1 || config > 255)
 		return -EINVAL;
+	down(&udev->serialize);
 	value = usb_set_configuration (udev, config);
+	up(&udev->serialize);
 	return (value < 0) ? value : count;
 }
 
@@ -109,6 +111,37 @@ show_speed (struct device *dev, char *bu
 }
 static DEVICE_ATTR(speed, S_IRUGO, show_speed, NULL);
 
+static ssize_t
+show_devnum (struct device *dev, char *buf)
+{
+	struct usb_device *udev;
+
+	udev = to_usb_device (dev);
+	return sprintf (buf, "%d\n", udev->devnum);
+}
+static DEVICE_ATTR(devnum, S_IRUGO, show_devnum, NULL);
+
+static ssize_t
+show_version (struct device *dev, char *buf)
+{
+	struct usb_device *udev;
+
+	udev = to_usb_device (dev);
+	return sprintf (buf, "%2x.%02x\n", udev->descriptor.bcdUSB >> 8, 
+			udev->descriptor.bcdUSB & 0xff);
+}
+static DEVICE_ATTR(version, S_IRUGO, show_version, NULL);
+
+static ssize_t
+show_maxchild (struct device *dev, char *buf)
+{
+	struct usb_device *udev;
+
+	udev = to_usb_device (dev);
+	return sprintf (buf, "%d\n", udev->maxchild);
+}
+static DEVICE_ATTR(maxchild, S_IRUGO, show_maxchild, NULL);
+
 /* Descriptor fields */
 #define usb_descriptor_attr(field, format_string)			\
 static ssize_t								\
@@ -159,6 +192,10 @@ void usb_create_driverfs_dev_files (stru
 		device_create_file (dev, &dev_attr_product);
 	if (udev->descriptor.iSerialNumber)
 		device_create_file (dev, &dev_attr_serial);
+
+	device_create_file (dev, &dev_attr_devnum);
+	device_create_file (dev, &dev_attr_version);
+	device_create_file (dev, &dev_attr_maxchild);
 }
 
 /* Interface fields */
--- diff/drivers/usb/core/hcd-pci.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/core/hcd-pci.c	2004-04-21 10:45:35.031377920 +0100
@@ -80,7 +80,8 @@ int usb_hcd_pci_probe (struct pci_dev *d
 		return -ENODEV;
 	
         if (!dev->irq) {
-        	err ("Found HC with no IRQ.  Check BIOS/PCI %s setup!",
+        	dev_err (&dev->dev,
+			"Found HC with no IRQ.  Check BIOS/PCI %s setup!\n",
 			pci_name(dev));
    	        return -ENODEV;
         }
@@ -90,16 +91,17 @@ int usb_hcd_pci_probe (struct pci_dev *d
 		resource = pci_resource_start (dev, 0);
 		len = pci_resource_len (dev, 0);
 		if (!request_mem_region (resource, len, driver->description)) {
-			dbg ("controller already in use");
+			dev_dbg (&dev->dev, "controller already in use\n");
 			return -EBUSY;
 		}
 		base = ioremap_nocache (resource, len);
 		if (base == NULL) {
-			dbg ("error mapping memory");
+			dev_dbg (&dev->dev, "error mapping memory\n");
 			retval = -EFAULT;
 clean_1:
 			release_mem_region (resource, len);
-			err ("init %s fail, %d", pci_name(dev), retval);
+			dev_err (&dev->dev, "init %s fail, %d\n",
+				pci_name(dev), retval);
 			return retval;
 		}
 
@@ -116,7 +118,7 @@ clean_1:
 				break;
 		}
 		if (region == PCI_ROM_RESOURCE) {
-			dbg ("no i/o regions available");
+			dev_dbg (&dev->dev, "no i/o regions available\n");
 			return -EBUSY;
 		}
 		base = (void *) resource;
@@ -127,7 +129,7 @@ clean_1:
 
 	hcd = driver->hcd_alloc ();
 	if (hcd == NULL){
-		dbg ("hcd alloc fail");
+		dev_dbg (&dev->dev, "hcd alloc fail\n");
 		retval = -ENOMEM;
 clean_2:
 		if (driver->flags & HCD_MEMORY) {
@@ -135,7 +137,8 @@ clean_2:
 			goto clean_1;
 		} else {
 			release_region (resource, len);
-			err ("init %s fail, %d", pci_name(dev), retval);
+			dev_err (&dev->dev, "init %s fail, %d\n",
+				pci_name(dev), retval);
 			return retval;
 		}
 	}
@@ -193,13 +196,16 @@ clean_3:
 	hcd->self.op = &usb_hcd_operations;
 	hcd->self.hcpriv = (void *) hcd;
 	hcd->self.release = &hcd_pci_release;
+	init_timer (&hcd->rh_timer);
 
 	INIT_LIST_HEAD (&hcd->dev_list);
 
 	usb_register_bus (&hcd->self);
 
-	if ((retval = driver->start (hcd)) < 0)
+	if ((retval = driver->start (hcd)) < 0) {
+		dev_err (hcd->self.controller, "init error %d\n", retval);
 		usb_hcd_pci_remove (dev);
+	}
 
 	return retval;
 } 
--- diff/drivers/usb/core/hcd.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/core/hcd.c	2004-04-21 10:45:35.032377768 +0100
@@ -42,6 +42,8 @@
 #include <asm/byteorder.h>
 
 #include <linux/usb.h>
+
+#include "usb.h"
 #include "hcd.h"
 
 
@@ -416,9 +418,14 @@ static int rh_call_control (struct usb_h
 
 	default:
 		/* non-generic request */
-		urb->status = hcd->driver->hub_control (hcd,
-			typeReq, wValue, wIndex,
-			ubuf, wLength);
+		if (HCD_IS_SUSPENDED (hcd->state))
+			urb->status = -EAGAIN;
+		else if (!HCD_IS_RUNNING (hcd->state))
+			urb->status = -ENODEV;
+		else
+			urb->status = hcd->driver->hub_control (hcd,
+				typeReq, wValue, wIndex,
+				ubuf, wLength);
 		break;
 error:
 		/* "protocol stall" on error */
@@ -678,8 +685,10 @@ int usb_register_bus(struct usb_bus *bus
 	if (busnum < USB_MAXBUS) {
 		set_bit (busnum, busmap.busmap);
 		bus->busnum = busnum;
-	} else
-		warn ("too many buses");
+	} else {
+		printk (KERN_ERR "%s: too many buses\n", usbcore_name);
+		return -E2BIG;
+	}
 
 	snprintf(bus->class_dev.class_id, BUS_ID_SIZE, "usb%d", busnum);
 	bus->class_dev.class = &usb_host_class;
@@ -804,7 +813,7 @@ long usb_calc_bus_time (int speed, int i
 			tmp = HS_USECS_ISO (bytecount);
 		return tmp;
 	default:
-		dbg ("bogus device speed!");
+		pr_debug ("%s: bogus device speed!\n", usbcore_name);
 		return -1;
 	}
 }
--- diff/drivers/usb/core/hcd.h	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/usb/core/hcd.h	2004-04-21 10:45:35.032377768 +0100
@@ -275,10 +275,6 @@ extern int usb_set_address(struct usb_de
 #define EndpointOutRequest \
 	((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8)
 
-/* table 9.6 standard features */
-#define DEVICE_REMOTE_WAKEUP	1
-#define ENDPOINT_HALT		0
-
 /* class requests from the USB 2.0 hub spec, table 11-15 */
 /* GetBusState and SetHubDescriptor are optional, omitted */
 #define ClearHubFeature		(0x2000 | USB_REQ_CLEAR_FEATURE)
--- diff/drivers/usb/core/hub.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/core/hub.c	2004-04-21 10:45:35.033377616 +0100
@@ -12,6 +12,7 @@
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/completion.h>
 #include <linux/sched.h>
 #include <linux/list.h>
@@ -46,6 +47,12 @@ static DECLARE_WAIT_QUEUE_HEAD(khubd_wai
 static pid_t khubd_pid = 0;			/* PID of khubd */
 static DECLARE_COMPLETION(khubd_exited);
 
+/* cycle leds on hubs that aren't blinking for attention */
+static int blinkenlights = 0;
+module_param (blinkenlights, bool, S_IRUGO);
+MODULE_PARM_DESC (blinkenlights, "true to cycle leds on hubs");
+
+
 #ifdef	DEBUG
 static inline char *portspeed (int portstatus)
 {
@@ -83,7 +90,6 @@ static int clear_hub_feature(struct usb_
 
 /*
  * USB 2.0 spec Section 11.24.2.2
- * BUG: doesn't handle port indicator selector in high byte of wIndex
  */
 static int clear_port_feature(struct usb_device *dev, int port, int feature)
 {
@@ -93,7 +99,6 @@ static int clear_port_feature(struct usb
 
 /*
  * USB 2.0 spec Section 11.24.2.13
- * BUG: doesn't handle port indicator selector in high byte of wIndex
  */
 static int set_port_feature(struct usb_device *dev, int port, int feature)
 {
@@ -102,6 +107,104 @@ static int set_port_feature(struct usb_d
 }
 
 /*
+ * USB 2.0 spec Section 11.24.2.7.1.10 and table 11-7
+ * for info about using port indicators
+ */
+static void set_port_led(
+	struct usb_device *dev,
+	struct usb_hub *hub,
+	int port,
+	int selector
+)
+{
+	int status = set_port_feature(dev, (selector << 8) | port,
+			USB_PORT_FEAT_INDICATOR);
+	if (status < 0)
+		dev_dbg (&hub->intf->dev,
+			"port %d indicator %s status %d\n",
+			port,
+			({ char *s; switch (selector) {
+			case HUB_LED_AMBER: s = "amber"; break;
+			case HUB_LED_GREEN: s = "green"; break;
+			case HUB_LED_OFF: s = "off"; break;
+			case HUB_LED_AUTO: s = "auto"; break;
+			default: s = "??"; break;
+			}; s; }),
+			status);
+}
+
+#define	LED_CYCLE_PERIOD	((2*HZ)/3)
+
+static void led_work (void *__hub)
+{
+	struct usb_hub		*hub = __hub;
+	struct usb_device	*dev = interface_to_usbdev (hub->intf);
+	unsigned		i;
+	unsigned		changed = 0;
+	int			cursor = -1;
+
+	if (dev->state != USB_STATE_CONFIGURED)
+		return;
+
+	for (i = 0; i < hub->descriptor->bNbrPorts; i++) {
+		unsigned	selector, mode;
+
+		/* 30%-50% duty cycle */
+
+		switch (hub->indicator[i]) {
+		/* cycle marker */
+		case INDICATOR_CYCLE:
+			cursor = i;
+			selector = HUB_LED_AUTO;
+			mode = INDICATOR_AUTO;
+			break;
+		/* blinking green = sw attention */
+		case INDICATOR_GREEN_BLINK:
+			selector = HUB_LED_GREEN;
+			mode = INDICATOR_GREEN_BLINK_OFF;
+			break;
+		case INDICATOR_GREEN_BLINK_OFF:
+			selector = HUB_LED_OFF;
+			mode = INDICATOR_GREEN_BLINK;
+			break;
+		/* blinking amber = hw attention */
+		case INDICATOR_AMBER_BLINK:
+			selector = HUB_LED_AMBER;
+			mode = INDICATOR_AMBER_BLINK_OFF;
+			break;
+		case INDICATOR_AMBER_BLINK_OFF:
+			selector = HUB_LED_OFF;
+			mode = INDICATOR_AMBER_BLINK;
+			break;
+		/* blink green/amber = reserved */
+		case INDICATOR_ALT_BLINK:
+			selector = HUB_LED_GREEN;
+			mode = INDICATOR_ALT_BLINK_OFF;
+			break;
+		case INDICATOR_ALT_BLINK_OFF:
+			selector = HUB_LED_AMBER;
+			mode = INDICATOR_ALT_BLINK;
+			break;
+		default:
+			continue;
+		}
+		if (selector != HUB_LED_AUTO)
+			changed = 1;
+		set_port_led(dev, hub, i + 1, selector);
+		hub->indicator[i] = mode;
+	}
+	if (!changed && blinkenlights) {
+		cursor++;
+		cursor %= hub->descriptor->bNbrPorts;
+		set_port_led(dev, hub, cursor + 1, HUB_LED_GREEN);
+		hub->indicator[cursor] = INDICATOR_CYCLE;
+		changed++;
+	}
+	if (changed)
+		schedule_delayed_work(&hub->leds, LED_CYCLE_PERIOD);
+}
+
+/*
  * USB 2.0 spec Section 11.24.2.6
  */
 static int get_hub_status(struct usb_device *dev,
@@ -212,8 +315,7 @@ static void hub_tt_kevent (void *arg)
 		spin_lock_irqsave (&hub->tt.lock, flags);
 
 		if (status)
-			err ("usb-%s-%s clear tt %d (%04x) error %d",
-				dev->bus->bus_name, dev->devpath,
+			dev_err (&dev->dev, "clear tt %d (%04x) error %d\n",
 				clear->tt, clear->devinfo, status);
 		kfree (clear);
 	}
@@ -244,8 +346,7 @@ void usb_hub_tt_clear_buffer (struct usb
 	 * there can be many TTs per hub).  even if they're uncommon.
 	 */
 	if ((clear = kmalloc (sizeof *clear, SLAB_ATOMIC)) == 0) {
-		err ("can't save CLEAR_TT_BUFFER state for hub at usb-%s-%s",
-			dev->bus->bus_name, tt->hub->devpath);
+		dev_err (&dev->dev, "can't save CLEAR_TT_BUFFER state\n");
 		/* FIXME recover somehow ... RESET_TT? */
 		return;
 	}
@@ -377,7 +478,7 @@ static int hub_configure(struct usb_hub 
 			break;
 		case 0x02:
 		case 0x03:
-			dev_dbg(hub_dev, "unknown reserved power switching mode\n");
+			dev_dbg(hub_dev, "no power switching (usb 1.0)\n");
 			break;
 	}
 
@@ -436,9 +537,11 @@ static int hub_configure(struct usb_hub 
 			break;
 	}
 
-	dev_dbg(hub_dev, "Port indicators are %s supported\n", 
-	    (hub->descriptor->wHubCharacteristics & HUB_CHAR_PORTIND)
-	    	? "" : "not");
+	/* probe() zeroes hub->indicator[] */
+	if (hub->descriptor->wHubCharacteristics & HUB_CHAR_PORTIND) {
+		hub->has_indicators = 1;
+		dev_dbg(hub_dev, "Port indicators are supported\n");
+	}
 
 	dev_dbg(hub_dev, "power on to power good time: %dms\n",
 		hub->descriptor->bPwrOn2PwrGood * 2);
@@ -451,12 +554,16 @@ static int hub_configure(struct usb_hub 
 		goto fail;
 	}
 
+	/* FIXME implement per-port power budgeting;
+	 * enable it for bus-powered hubs.
+	 */
 	dev_dbg(hub_dev, "local power source is %s\n",
 		(hubstatus & HUB_STATUS_LOCAL_POWER)
 		? "lost (inactive)" : "good");
 
-	dev_dbg(hub_dev, "%sover-current condition exists\n",
-		(hubstatus & HUB_STATUS_OVERCURRENT) ? "" : "no ");
+	if ((hub->descriptor->wHubCharacteristics & HUB_CHAR_OCPM) == 0)
+		dev_dbg(hub_dev, "%sover-current condition exists\n",
+			(hubstatus & HUB_STATUS_OVERCURRENT) ? "" : "no ");
 
 	/* Start the interrupt endpoint */
 	pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
@@ -486,6 +593,13 @@ static int hub_configure(struct usb_hub 
 	/* Wake up khubd */
 	wake_up(&khubd_wait);
 
+	/* maybe start cycling the hub leds */
+	if (hub->has_indicators && blinkenlights) {
+		set_port_led(dev, hub, 1, HUB_LED_GREEN);
+		hub->indicator [0] = INDICATOR_CYCLE;
+		schedule_delayed_work(&hub->leds, LED_CYCLE_PERIOD);
+	}
+
 	hub_power_on(hub);
 
 	return 0;
@@ -520,7 +634,9 @@ static void hub_disconnect(struct usb_in
 	up(&hub->khubd_sem);
 
 	/* assuming we used keventd, it must quiesce too */
-	if (hub->tt.hub)
+	if (hub->has_indicators)
+		cancel_delayed_work (&hub->leds);
+	if (hub->has_indicators || hub->tt.hub)
 		flush_scheduled_work ();
 
 	if (hub->urb) {
@@ -596,7 +712,7 @@ descriptor_error:
 
 	hub = kmalloc(sizeof(*hub), GFP_KERNEL);
 	if (!hub) {
-		err("couldn't kmalloc hub struct");
+		dev_dbg (hubdev(dev), "couldn't kmalloc hub struct\n");
 		return -ENOMEM;
 	}
 
@@ -605,6 +721,7 @@ descriptor_error:
 	INIT_LIST_HEAD(&hub->event_list);
 	hub->intf = intf;
 	init_MUTEX(&hub->khubd_sem);
+	INIT_WORK(&hub->leds, led_work, hub);
 
 	/* Record the new hub's existence */
 	spin_lock_irqsave(&hub_event_lock, flags);
@@ -700,7 +817,7 @@ static void hub_start_disconnect(struct 
 		}
 	}
 
-	err("cannot disconnect hub %s", dev->devpath);
+	dev_err(&dev->dev, "cannot disconnect hub!\n");
 }
 
 static int hub_port_status(struct usb_device *dev, int port,
@@ -1142,10 +1259,10 @@ static int hub_thread(void *__hub)
 		hub_events();
 		wait_event_interruptible(khubd_wait, !list_empty(&hub_event_list)); 
 		if (current->flags & PF_FREEZE)
-			refrigerator(PF_IOTHREAD);
+			refrigerator(PF_FREEZE);
 	} while (!signal_pending(current));
 
-	dbg("hub_thread exiting");
+	pr_debug ("%s: khubd exiting\n", usbcore_name);
 	complete_and_exit(&khubd_exited, 0);
 }
 
@@ -1176,7 +1293,8 @@ int usb_hub_init(void)
 	pid_t pid;
 
 	if (usb_register(&hub_driver) < 0) {
-		err("Unable to register USB hub driver");
+		printk(KERN_ERR "%s: can't register hub driver\n",
+			usbcore_name);
 		return -1;
 	}
 
@@ -1189,7 +1307,7 @@ int usb_hub_init(void)
 
 	/* Fall through if kernel_thread failed */
 	usb_deregister(&hub_driver);
-	err("failed to start hub_thread");
+	printk(KERN_ERR "%s: can't start khubd\n", usbcore_name);
 
 	return -1;
 }
@@ -1300,33 +1418,15 @@ int usb_physical_reset_device(struct usb
 		kfree(descriptor);
 		usb_destroy_configuration(dev);
 
-		ret = usb_get_device_descriptor(dev, sizeof(dev->descriptor));
-		if (ret != sizeof(dev->descriptor)) {
-			if (ret < 0)
-				err("unable to get device %s descriptor "
-					"(error=%d)", dev->devpath, ret);
-			else
-				err("USB device %s descriptor short read "
-					"(expected %Zi, got %i)",
-					dev->devpath,
-					sizeof(dev->descriptor), ret);
-
-			clear_bit(dev->devnum, dev->bus->devmap.devicemap);
-			dev->devnum = -1;
-			return -EIO;
-		}
-
-		ret = usb_get_configuration(dev);
-		if (ret < 0) {
-			err("unable to get configuration (error=%d)", ret);
-			usb_destroy_configuration(dev);
-			clear_bit(dev->devnum, dev->bus->devmap.devicemap);
-			dev->devnum = -1;
-			return 1;
-		}
+		/* FIXME Linux doesn't yet handle these "device morphed"
+		 * paths.  DFU variants need this to work ... and they
+		 * include the "config descriptors changed" case this
+		 * doesn't yet detect!
+		 */
+		dev->state = USB_STATE_NOTATTACHED;
+		dev_err(&dev->dev, "device morphed (DFU?), nyet supported\n");
 
-		usb_set_configuration(dev, dev->config[0].desc.bConfigurationValue);
-		return 1;
+		return -ENODEV;
 	}
 
 	kfree(descriptor);
--- diff/drivers/usb/core/hub.h	2004-01-19 10:22:58.000000000 +0000
+++ source/drivers/usb/core/hub.h	2004-04-21 10:45:35.034377464 +0100
@@ -139,6 +139,22 @@ struct usb_hub_descriptor {
 	__u8  PortPwrCtrlMask[(USB_MAXCHILDREN + 1 + 7) / 8];
 } __attribute__ ((packed));
 
+
+/* port indicator status selectors, tables 11-7 and 11-25 */
+#define HUB_LED_AUTO	0
+#define HUB_LED_AMBER	1
+#define HUB_LED_GREEN	2
+#define HUB_LED_OFF	3
+
+enum hub_led_mode {
+	INDICATOR_AUTO = 0,
+	INDICATOR_CYCLE,
+	/* software blinks for attention:  software, hardware, reserved */
+	INDICATOR_GREEN_BLINK, INDICATOR_GREEN_BLINK_OFF,
+	INDICATOR_AMBER_BLINK, INDICATOR_AMBER_BLINK_OFF,
+	INDICATOR_ALT_BLINK, INDICATOR_ALT_BLINK_OFF
+} __attribute__ ((packed));
+
 struct usb_device;
 
 /*
@@ -192,6 +208,10 @@ struct usb_hub {
 	struct usb_hub_descriptor *descriptor;	/* class descriptor */
 	struct semaphore	khubd_sem;
 	struct usb_tt		tt;		/* Transaction Translator */
+
+	unsigned		has_indicators:1;
+	enum hub_led_mode	indicator[USB_MAXCHILDREN];
+	struct work_struct	leds;
 };
 
 #endif /* __LINUX_HUB_H */
--- diff/drivers/usb/core/message.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/core/message.c	2004-04-21 10:45:35.035377312 +0100
@@ -572,13 +572,16 @@ int usb_get_descriptor(struct usb_device
 	memset(buf,0,size);	// Make sure we parse really received data
 
 	while (i--) {
-		/* retries if the returned length was 0; flakey device */
+		/* retry on length 0 or stall; some devices are flakey */
 		if ((result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
 				    USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,
 				    (type << 8) + index, 0, buf, size,
 				    HZ * USB_CTRL_GET_TIMEOUT)) > 0
-				|| result == -EPIPE)
+				|| result != -EPIPE)
 			break;
+
+		dev_dbg (&dev->dev, "RETRY descriptor, result %d\n", result);
+		result = -ENOMSG;
 	}
 	return result;
 }
@@ -722,7 +725,8 @@ int usb_clear_halt(struct usb_device *de
 	 * this request for iso endpoints, which can't halt!
 	 */
 	result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
-		USB_REQ_CLEAR_FEATURE, USB_RECIP_ENDPOINT, 0, endp, NULL, 0,
+		USB_REQ_CLEAR_FEATURE, USB_RECIP_ENDPOINT,
+		USB_ENDPOINT_HALT, endp, NULL, 0,
 		HZ * USB_CTRL_SET_TIMEOUT);
 
 	/* don't un-halt or force to DATA0 except on success */
@@ -928,7 +932,8 @@ int usb_set_interface(struct usb_device 
 
 	iface = usb_ifnum_to_if(dev, interface);
 	if (!iface) {
-		warn("selecting invalid interface %d", interface);
+		dev_dbg(&dev->dev, "selecting invalid interface %d\n",
+			interface);
 		return -EINVAL;
 	}
 
@@ -946,8 +951,9 @@ int usb_set_interface(struct usb_device 
 	 * request if the interface only has one alternate setting.
 	 */
 	if (ret == -EPIPE && iface->num_altsetting == 1) {
-		dbg("manual set_interface for dev %d, iface %d, alt %d",
-			dev->devnum, interface, alternate);
+		dev_dbg(&dev->dev,
+			"manual set_interface for iface %d, alt %d\n",
+			interface, alternate);
 		manual = 1;
 	} else if (ret < 0)
 		return ret;
@@ -1065,11 +1071,11 @@ int usb_reset_configuration(struct usb_d
 	return 0;
 }
 
-/**
+/*
  * usb_set_configuration - Makes a particular device setting be current
  * @dev: the device whose configuration is being updated
  * @configuration: the configuration being chosen.
- * Context: !in_interrupt ()
+ * Context: !in_interrupt(), caller holds dev->serialize
  *
  * This is used to enable non-default device modes.  Not all devices
  * use this kind of configurability; many devices only have one
@@ -1105,7 +1111,6 @@ int usb_set_configuration(struct usb_dev
 	struct usb_host_config *cp = NULL;
 	
 	/* dev->serialize guards all config changes */
-	down(&dev->serialize);
 
 	for (i=0; i<dev->descriptor.bNumConfigurations; i++) {
 		if (dev->config[i].desc.bConfigurationValue == configuration) {
@@ -1167,21 +1172,39 @@ int usb_set_configuration(struct usb_dev
 			intf->dev.bus = &usb_bus_type;
 			intf->dev.dma_mask = dev->dev.dma_mask;
 			intf->dev.release = release_interface;
+			device_initialize (&intf->dev);
 			sprintf (&intf->dev.bus_id[0], "%d-%s:%d.%d",
 				 dev->bus->busnum, dev->devpath,
 				 configuration,
 				 alt->desc.bInterfaceNumber);
+		}
+
+		/* Now that all interfaces are setup, probe() calls
+		 * may claim() any interface that's not yet bound.
+		 * Many class drivers need that: CDC, audio, video, etc.
+		 */
+		for (i = 0; i < cp->desc.bNumInterfaces; ++i) {
+			struct usb_interface *intf = cp->interface[i];
+			struct usb_interface_descriptor *desc;
+
+			desc = &intf->altsetting [0].desc;
 			dev_dbg (&dev->dev,
-				"registering %s (config #%d, interface %d)\n",
+				"adding %s (config #%d, interface %d)\n",
 				intf->dev.bus_id, configuration,
-				alt->desc.bInterfaceNumber);
-			device_register (&intf->dev);
+				desc->bInterfaceNumber);
+			ret = device_add (&intf->dev);
+			if (ret != 0) {
+				dev_err(&dev->dev,
+					"device_add(%s) --> %d\n",
+					intf->dev.bus_id,
+					ret);
+				continue;
+			}
 			usb_create_driverfs_intf_files (intf);
 		}
 	}
 
 out:
-	up(&dev->serialize);
 	return ret;
 }
 
@@ -1224,20 +1247,22 @@ int usb_string(struct usb_device *dev, i
 
 	/* get langid for strings if it's not yet known */
 	if (!dev->have_langid) {
-		err = usb_get_string(dev, 0, 0, tbuf, 4);
+		err = usb_get_descriptor(dev, USB_DT_STRING, 0, tbuf, 4);
 		if (err < 0) {
-			err("error getting string descriptor 0 (error=%d)", err);
+			dev_err (&dev->dev,
+				"string descriptor 0 read error: %d\n",
+				err);
 			goto errout;
 		} else if (err < 4 || tbuf[0] < 4) {
-			err("string descriptor 0 too short");
+			dev_err (&dev->dev, "string descriptor 0 too short\n");
 			err = -EINVAL;
 			goto errout;
 		} else {
 			dev->have_langid = -1;
 			dev->string_langid = tbuf[2] | (tbuf[3]<< 8);
 				/* always use the first langid listed */
-			dbg("USB device number %d default language ID 0x%x",
-				dev->devnum, dev->string_langid);
+			dev_dbg (&dev->dev, "default language 0x%04x\n",
+				dev->string_langid);
 		}
 	}
 
@@ -1246,11 +1271,19 @@ int usb_string(struct usb_device *dev, i
 	 */
 
 	err = usb_get_string(dev, dev->string_langid, index, tbuf, 2);
+	if (err == -EPIPE) {
+		dev_dbg(&dev->dev, "RETRY string %d read/%d\n", index, 2);
+		err = usb_get_string(dev, dev->string_langid, index, tbuf, 2);
+	}
 	if(err<2)
 		goto errout;
 	len=tbuf[0];	
 	
 	err = usb_get_string(dev, dev->string_langid, index, tbuf, len);
+	if (err == -EPIPE) {
+		dev_dbg(&dev->dev, "RETRY string %d read/%d\n", index, len);
+		err = usb_get_string(dev, dev->string_langid, index, tbuf, len);
+	}
 	if (err < 0)
 		goto errout;
 
@@ -1288,6 +1321,5 @@ EXPORT_SYMBOL(usb_string);
 // synchronous calls that also maintain usbcore state
 EXPORT_SYMBOL(usb_clear_halt);
 EXPORT_SYMBOL(usb_reset_configuration);
-EXPORT_SYMBOL(usb_set_configuration);
 EXPORT_SYMBOL(usb_set_interface);
 
--- diff/drivers/usb/core/usb.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/core/usb.c	2004-04-21 10:45:35.036377160 +0100
@@ -7,8 +7,7 @@
  * (C) Copyright Gregory P. Smith 1999
  * (C) Copyright Deti Fliegl 1999 (new USB architecture)
  * (C) Copyright Randy Dunlap 2000
- * (C) Copyright David Brownell 2000-2001 (kernel hotplug, usb_device_id,
- 	more docs, etc)
+ * (C) Copyright David Brownell 2000-2004
  * (C) Copyright Yggdrasil Computing, Inc. 2000
  *     (usb_device_id matching changes by Adam J. Richter)
  * (C) Copyright Greg Kroah-Hartman 2002-2003
@@ -58,6 +57,8 @@ extern int usb_host_init(void);
 extern void usb_host_cleanup(void);
 
 
+const char *usbcore_name = "usbcore";
+
 int nousb;		/* Disable USB when built into kernel image */
 			/* Not honored on modular build */
 
@@ -93,17 +94,11 @@ int usb_probe_interface(struct device *d
 	if (!driver->probe)
 		return error;
 
-	/* driver claim() doesn't yet affect dev->driver... */
-	if (intf->driver)
-		return error;
-
 	id = usb_match_id (intf, driver->id_table);
 	if (id) {
 		dev_dbg (dev, "%s - got id\n", __FUNCTION__);
 		error = driver->probe (intf, id);
 	}
-	if (!error)
-		intf->driver = driver;
 
 	return error;
 }
@@ -112,7 +107,7 @@ int usb_probe_interface(struct device *d
 int usb_unbind_interface(struct device *dev)
 {
 	struct usb_interface *intf = to_usb_interface(dev);
-	struct usb_driver *driver = intf->driver;
+	struct usb_driver *driver = to_usb_driver(intf->dev.driver);
 
 	/* release all urbs for this interface */
 	usb_disable_interface(interface_to_usbdev(intf), intf);
@@ -125,7 +120,6 @@ int usb_unbind_interface(struct device *
 			intf->altsetting[0].desc.bInterfaceNumber,
 			0);
 	usb_set_intfdata(intf, NULL);
-	intf->driver = NULL;
 
 	return 0;
 }
@@ -158,11 +152,12 @@ int usb_register(struct usb_driver *new_
 	retval = driver_register(&new_driver->driver);
 
 	if (!retval) {
-		info("registered new driver %s", new_driver->name);
+		pr_info("%s: registered new driver %s\n",
+			usbcore_name, new_driver->name);
 		usbfs_update_special();
 	} else {
-		err("problem %d when registering driver %s",
-			retval, new_driver->name);
+		printk(KERN_ERR "%s: error %d registering driver %s\n",
+			usbcore_name, retval, new_driver->name);
 	}
 
 	return retval;
@@ -181,7 +176,7 @@ int usb_register(struct usb_driver *new_
  */
 void usb_deregister(struct usb_driver *driver)
 {
-	info("deregistering driver %s", driver->name);
+	pr_info("%s: deregistering driver %s\n", usbcore_name, driver->name);
 
 	driver_unregister (&driver->driver);
 
@@ -287,7 +282,8 @@ usb_epnum_to_ep_desc(struct usb_device *
 /**
  * usb_driver_claim_interface - bind a driver to an interface
  * @driver: the driver to be bound
- * @iface: the interface to which it will be bound
+ * @iface: the interface to which it will be bound; must be in the
+ *	usb device's active configuration
  * @priv: driver data associated with that interface
  *
  * This is used by usb device drivers that need to claim more than one
@@ -305,75 +301,52 @@ usb_epnum_to_ep_desc(struct usb_device *
  */
 int usb_driver_claim_interface(struct usb_driver *driver, struct usb_interface *iface, void* priv)
 {
-	if (!iface || !driver)
-		return -EINVAL;
+	struct device *dev = &iface->dev;
 
-	if (iface->driver)
+	if (dev->driver)
 		return -EBUSY;
 
-	/* FIXME should device_bind_driver() */
-	iface->driver = driver;
+	dev->driver = &driver->driver;
 	usb_set_intfdata(iface, priv);
-	return 0;
-}
 
-/**
- * usb_interface_claimed - returns true iff an interface is claimed
- * @iface: the interface being checked
- *
- * This should be used by drivers to check other interfaces to see if
- * they are available or not.  If another driver has claimed the interface,
- * they may not claim it.  Otherwise it's OK to claim it using
- * usb_driver_claim_interface().
- *
- * Returns true (nonzero) iff the interface is claimed, else false (zero).
- */
-int usb_interface_claimed(struct usb_interface *iface)
-{
-	if (!iface)
-		return 0;
+	/* if interface was already added, bind now; else let
+	 * the future device_add() bind it, bypassing probe()
+	 */
+	if (!list_empty (&dev->bus_list))
+		device_bind_driver(dev);
 
-	return (iface->driver != NULL);
-} /* usb_interface_claimed() */
+	return 0;
+}
 
 /**
  * usb_driver_release_interface - unbind a driver from an interface
  * @driver: the driver to be unbound
  * @iface: the interface from which it will be unbound
  *
- * In addition to unbinding the driver, this re-initializes the interface
- * by selecting altsetting 0, the default alternate setting.
- * 
  * This can be used by drivers to release an interface without waiting
- * for their disconnect() methods to be called.
- *
- * When the USB subsystem disconnect()s a driver from some interface,
- * it automatically invokes this method for that interface.  That
- * means that even drivers that used usb_driver_claim_interface()
- * usually won't need to call this.
+ * for their disconnect() methods to be called.  In typical cases this
+ * also causes the driver disconnect() method to be called.
  *
  * This call is synchronous, and may not be used in an interrupt context.
- * Callers must own the driver model's usb bus writelock.  So driver
- * disconnect() entries don't need extra locking, but other call contexts
- * may need to explicitly claim that lock.
+ * Callers must own the usb_device serialize semaphore and the driver model's
+ * usb bus writelock.  So driver disconnect() entries don't need extra locking,
+ * but other call contexts may need to explicitly claim those locks.
  */
-void usb_driver_release_interface(struct usb_driver *driver, struct usb_interface *iface)
+void usb_driver_release_interface(struct usb_driver *driver,
+					struct usb_interface *iface)
 {
+	struct device *dev = &iface->dev;
+
 	/* this should never happen, don't release something that's not ours */
-	if (!iface || !iface->driver || iface->driver != driver)
+	if (!dev->driver || dev->driver != &driver->driver)
 		return;
 
-	if (iface->dev.driver) {
-		/* FIXME should be the ONLY case here */
-		device_release_driver(&iface->dev);
-		return;
-	}
+	/* don't disconnect from disconnect(), or before dev_add() */
+	if (!list_empty (&dev->driver_list) && !list_empty (&dev->bus_list))
+		device_release_driver(dev);
 
-	usb_set_interface(interface_to_usbdev(iface),
-			iface->altsetting[0].desc.bInterfaceNumber,
-			0);
+	dev->driver = NULL;
 	usb_set_intfdata(iface, NULL);
-	iface->driver = NULL;
 }
 
 /**
@@ -587,11 +560,12 @@ static int usb_hotplug (struct device *d
 	int i = 0;
 	int length = 0;
 
-	dbg ("%s", __FUNCTION__);
-
 	if (!dev)
 		return -ENODEV;
 
+	/* driver is often null here; dev_dbg() would oops */
+	pr_debug ("usb %s: hotplug\n", dev->bus_id);
+
 	/* Must check driver_data here, as on remove driver is always NULL */
 	if ((dev->driver == &usb_generic_driver) || 
 	    (dev->driver_data == &usb_generic_driver_data))
@@ -601,11 +575,11 @@ static int usb_hotplug (struct device *d
 	usb_dev = interface_to_usbdev (intf);
 	
 	if (usb_dev->devnum < 0) {
-		dbg ("device already deleted ??");
+		pr_debug ("usb %s: already deleted?\n", dev->bus_id);
 		return -ENODEV;
 	}
 	if (!usb_dev->bus) {
-		dbg ("bus already removed?");
+		pr_debug ("usb %s: bus removed?\n", dev->bus_id);
 		return -ENODEV;
 	}
 
@@ -794,18 +768,11 @@ usb_alloc_dev(struct usb_device *parent,
  *
  * A pointer to the device with the incremented reference counter is returned.
  */
-struct usb_device *usb_get_dev (struct usb_device *dev)
+struct usb_device *usb_get_dev(struct usb_device *dev)
 {
-	struct device *tmp;
-
-	if (!dev)
-		return NULL;
-
-	tmp = get_device(&dev->dev);
-	if (tmp)        
-		return to_usb_device(tmp);
-	else
-		return NULL;
+	if (dev)
+		get_device(&dev->dev);
+	return dev;
 }
 
 /**
@@ -821,20 +788,54 @@ void usb_put_dev(struct usb_device *dev)
 		put_device(&dev->dev);
 }
 
+/**
+ * usb_get_intf - increments the reference count of the usb interface structure
+ * @intf: the interface being referenced
+ *
+ * Each live reference to a interface must be refcounted.
+ *
+ * Drivers for USB interfaces should normally record such references in
+ * their probe() methods, when they bind to an interface, and release
+ * them by calling usb_put_intf(), in their disconnect() methods.
+ *
+ * A pointer to the interface with the incremented reference counter is
+ * returned.
+ */
+struct usb_interface *usb_get_intf(struct usb_interface *intf)
+{
+	if (intf)
+		get_device(&intf->dev);
+	return intf;
+}
+
+/**
+ * usb_put_intf - release a use of the usb interface structure
+ * @intf: interface that's been decremented
+ *
+ * Must be called when a user of an interface is finished with it.  When the
+ * last user of the interface calls this function, the memory of the interface
+ * is freed.
+ */
+void usb_put_intf(struct usb_interface *intf)
+{
+	if (intf)
+		put_device(&intf->dev);
+}
+
 static struct usb_device *match_device(struct usb_device *dev,
 				       u16 vendor_id, u16 product_id)
 {
 	struct usb_device *ret_dev = NULL;
 	int child;
 
-	dbg("looking at vendor %d, product %d",
+	dev_dbg(&dev->dev, "check for vendor %04x, product %04x ...\n",
 	    dev->descriptor.idVendor,
 	    dev->descriptor.idProduct);
 
 	/* see if this device matches */
 	if ((dev->descriptor.idVendor == vendor_id) &&
 	    (dev->descriptor.idProduct == product_id)) {
-		dbg ("found the device!");
+		dev_dbg (&dev->dev, "matched this device!\n");
 		ret_dev = usb_get_dev(dev);
 		goto exit;
 	}
@@ -909,7 +910,8 @@ int usb_get_current_frame_number(struct 
  * extra field of the interface and endpoint descriptor structs.
  */
 
-int __usb_get_extra_descriptor(char *buffer, unsigned size, unsigned char type, void **ptr)
+int __usb_get_extra_descriptor(char *buffer, unsigned size,
+	unsigned char type, void **ptr)
 {
 	struct usb_descriptor_header *header;
 
@@ -917,7 +919,11 @@ int __usb_get_extra_descriptor(char *buf
 		header = (struct usb_descriptor_header *)buffer;
 
 		if (header->bLength < 2) {
-			err("invalid descriptor length of %d", header->bLength);
+			printk(KERN_ERR
+				"%s: bogus descriptor, type %d length %d\n",
+				usbcore_name,
+				header->bDescriptorType, 
+				header->bLength);
 			return -1;
 		}
 
@@ -1164,10 +1170,13 @@ int usb_new_device(struct usb_device *de
 		usb_show_string(dev, "SerialNumber", dev->descriptor.iSerialNumber);
 #endif
 
+	down(&dev->serialize);
+
 	/* put device-specific files into sysfs */
 	err = device_add (&dev->dev);
 	if (err) {
 		dev_err(&dev->dev, "can't device_add, error %d\n", err);
+		up(&dev->serialize);
 		goto fail;
 	}
 	usb_create_driverfs_dev_files (dev);
@@ -1202,6 +1211,7 @@ int usb_new_device(struct usb_device *de
 			dev->descriptor.bNumConfigurations);
 	}
 	err = usb_set_configuration(dev, config);
+	up(&dev->serialize);
 	if (err) {
 		dev_err(&dev->dev, "can't set config #%d, error %d\n",
 			config, err);
@@ -1568,7 +1578,7 @@ int usb_disabled(void)
 static int __init usb_init(void)
 {
 	if (nousb) {
-		info("USB support disabled\n");
+		pr_info ("%s: USB support disabled\n", usbcore_name);
 		return 0;
 	}
 
@@ -1620,7 +1630,6 @@ EXPORT_SYMBOL(usb_get_dev);
 EXPORT_SYMBOL(usb_hub_tt_clear_buffer);
 
 EXPORT_SYMBOL(usb_driver_claim_interface);
-EXPORT_SYMBOL(usb_interface_claimed);
 EXPORT_SYMBOL(usb_driver_release_interface);
 EXPORT_SYMBOL(usb_match_id);
 EXPORT_SYMBOL(usb_find_interface);
--- diff/drivers/usb/core/usb.h	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/usb/core/usb.h	2004-04-21 10:45:35.037377008 +0100
@@ -17,3 +17,7 @@ extern void usb_enable_interface (struct
 
 extern int usb_get_device_descriptor(struct usb_device *dev,
 		unsigned int size);
+extern int usb_set_configuration(struct usb_device *dev, int configuration);
+
+/* for labeling diagnostics */
+extern const char *usbcore_name;
--- diff/drivers/usb/gadget/Kconfig	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/gadget/Kconfig	2004-04-21 10:45:35.037377008 +0100
@@ -71,8 +71,8 @@ config USB_NET2280
 	default USB_GADGET
 
 config USB_GADGET_PXA2XX
-	boolean "PXA 2xx or IXP 42x"
-	depends on ARCH_PXA || ARCH_IXP425
+	boolean "PXA 2xx or IXP 4xx"
+	depends on ARCH_PXA || ARCH_IXP4XX
 	help
 	   Intel's PXA 2xx series XScale ARM-5TE processors include
 	   an integrated full speed USB 1.1 device controller.  The
@@ -134,6 +134,34 @@ config USB_SA1100
 	depends on USB_GADGET_SA1100
 	default USB_GADGET
 
+config USB_GADGET_DUMMY_HCD
+	boolean "Dummy HCD (DEVELOPMENT)"
+	depends on USB && EXPERIMENTAL
+	select USB_GADGET_DUALSPEED
+	help
+	  This host controller driver emulates USB, looping all data transfer
+	  requests back to a USB "gadget driver" in the same host.  The host
+	  side is the master; the gadget side is the slave.  Gadget drivers
+	  can be high, full, or low speed; and they have access to endpoints
+	  like those from NET2280, PXA2xx, or SA1100 hardware.
+	  
+	  This may help in some stages of creating a driver to embed in a
+	  Linux device, since it lets you debug several parts of the gadget
+	  driver without its hardware or drivers being involved.
+	  
+	  Since such a gadget side driver needs to interoperate with a host
+	  side Linux-USB device driver, this may help to debug both sides
+	  of a USB protocol stack.
+
+	  Say "y" to link the driver statically, or "m" to build a
+	  dynamically linked module called "dummy_hcd" and force all
+	  gadget drivers to also be dynamically linked.
+
+config USB_DUMMY_HCD
+	tristate
+	depends on USB_GADGET_DUMMY_HCD
+	default USB_GADGET
+
 endchoice
 
 config USB_GADGET_DUALSPEED
@@ -191,9 +219,11 @@ config USB_ETH
 	     favor of simpler vendor-specific hardware, but is widely
 	     supported by firmware for smart network devices.
 
-	   - On hardware can't implement that protocol, a simpler approach
+	   - On hardware can't implement that protocol, a simple CDC subset
 	     is used, placing fewer demands on USB.
 
+	  RNDIS support is a third option, more demanding than that subset.
+
 	  Within the USB device, this gadget driver exposes a network device
 	  "usbX", where X depends on what other networking devices you have.
 	  Treat it like a two-node Ethernet link:  host, and gadget.
@@ -207,6 +237,19 @@ config USB_ETH
 	  Say "y" to link the driver statically, or "m" to build a
 	  dynamically linked module called "g_ether".
 
+config USB_ETH_RNDIS
+	bool "RNDIS support (EXPERIMENTAL)"
+	depends on USB_ETH && EXPERIMENTAL
+	default y
+	help
+	   Microsoft Windows XP bundles the "Remote NDIS" (RNDIS) protocol,
+	   and Microsoft provides redistributable binary RNDIS drivers for
+	   older versions of Windows.
+
+	   If you say "y" here, the Ethernet gadget driver will try to provide
+	   a second device configuration, supporting RNDIS to talk to such
+	   Microsoft USB hosts.
+
 config USB_GADGETFS
 	tristate "Gadget Filesystem (EXPERIMENTAL)"
 	depends on EXPERIMENTAL
--- diff/drivers/usb/gadget/Makefile	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/gadget/Makefile	2004-04-21 10:45:35.037377008 +0100
@@ -1,6 +1,7 @@
 #
 # USB peripheral controller drivers
 #
+obj-$(CONFIG_USB_DUMMY_HCD)	+= dummy_hcd.o
 obj-$(CONFIG_USB_NET2280)	+= net2280.o
 obj-$(CONFIG_USB_PXA2XX)	+= pxa2xx_udc.o
 obj-$(CONFIG_USB_GOKU)		+= goku_udc.o
@@ -8,11 +9,16 @@ obj-$(CONFIG_USB_GOKU)		+= goku_udc.o
 #
 # USB gadget drivers
 #
-g_zero-objs			:= zero.o usbstring.o config.o
-g_ether-objs			:= ether.o usbstring.o config.o
+g_zero-objs			:= zero.o usbstring.o config.o epautoconf.o
+g_ether-objs			:= ether.o usbstring.o config.o epautoconf.o
 g_serial-objs			:= serial.o usbstring.o
-gadgetfs-objs			:= inode.o usbstring.o
-g_file_storage-objs		:= file_storage.o usbstring.o
+gadgetfs-objs			:= inode.o
+g_file_storage-objs		:= file_storage.o usbstring.o config.o \
+					epautoconf.o
+
+ifeq ($(CONFIG_USB_ETH_RNDIS),y)
+	g_ether-objs		+= rndis.o
+endif
  
 obj-$(CONFIG_USB_ZERO)		+= g_zero.o
 obj-$(CONFIG_USB_ETH)		+= g_ether.o
--- diff/drivers/usb/gadget/ether.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/gadget/ether.c	2004-04-21 10:45:35.044375944 +0100
@@ -1,7 +1,8 @@
 /*
  * ether.c -- Ethernet gadget driver, with CDC and non-CDC options
  *
- * Copyright (C) 2003 David Brownell
+ * Copyright (C) 2003-2004 David Brownell
+ * Copyright (C) 2003-2004 Robert Schwebel, Benedikt Spranger
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -55,6 +56,8 @@
 #include <linux/etherdevice.h>
 #include <linux/ethtool.h>
 
+#include "gadget_chips.h"
+
 /*-------------------------------------------------------------------------*/
 
 /*
@@ -62,25 +65,36 @@
  *
  * CDC Ethernet is the standard USB solution for sending Ethernet frames
  * using USB.  Real hardware tends to use the same framing protocol but look
- * different for control features.  And Microsoft pushes their own approach
- * (RNDIS) instead of the standard.
+ * different for control features.  This driver strongly prefers to use
+ * this USB-IF standard as its open-systems interoperability solution;
+ * most host side USB stacks (except from Microsoft) support it.
  *
  * There's some hardware that can't talk CDC.  We make that hardware
  * implement a "minimalist" vendor-agnostic CDC core:  same framing, but
  * link-level setup only requires activating the configuration.
+ * Linux supports it, but other host operating systems may not.
+ * (This is a subset of CDC Ethernet.)
+ *
+ * A third option is also in use.  Rather than CDC Ethernet, or something
+ * simpler, Microsoft pushes their own approach: RNDIS.  The published
+ * RNDIS specs are ambiguous and appear to be incomplete, and are also
+ * needlessly complex.
  */
 
 #define DRIVER_DESC		"Ethernet Gadget"
-#define DRIVER_VERSION		"Bastille Day 2003"
+#define DRIVER_VERSION		"St Patrick's Day 2004"
 
 static const char shortname [] = "ether";
 static const char driver_desc [] = DRIVER_DESC;
 
-#define MIN_PACKET	sizeof(struct ethhdr)
-#define	MAX_PACKET	ETH_DATA_LEN	/* biggest packet we'll rx/tx */
 #define RX_EXTRA	20		/* guard against rx overflows */
 
-/* FIXME allow high speed jumbograms */
+#ifdef	CONFIG_USB_ETH_RNDIS
+#include "rndis.h"
+#else
+#define rndis_init() 0
+#define rndis_exit() do{}while(0)
+#endif
 
 /*-------------------------------------------------------------------------*/
 
@@ -100,214 +114,130 @@ struct eth_dev {
 	atomic_t		tx_qlen;
 
 	struct work_struct	work;
+	unsigned		zlp:1;
+	unsigned		cdc:1;
+	unsigned		rndis:1;
 	unsigned long		todo;
 #define	WORK_RX_MEMORY		0
+	int			rndis_config;
 };
 
+/* This version autoconfigures as much as possible at run-time.
+ *
+ * It also ASSUMES a self-powered device, without remote wakeup,
+ * although remote wakeup support would make sense.
+ */
+static const char *EP_IN_NAME;
+static const char *EP_OUT_NAME;
+static const char *EP_STATUS_NAME;
+
 /*-------------------------------------------------------------------------*/
 
-/* Thanks to NetChip Technologies for donating this product ID.
- *
- * DO NOT REUSE THESE IDs with a protocol-incompatible driver!!  Ever!!
+/* DO NOT REUSE THESE IDs with a protocol-incompatible driver!!  Ever!!
  * Instead:  allocate your own, using normal USB-IF procedures.
  */
-#define DRIVER_VENDOR_NUM	0x0525		/* NetChip */
-#define DRIVER_PRODUCT_NUM	0xa4a1		/* Linux-USB Ethernet Gadget */
 
-/*-------------------------------------------------------------------------*/
+/* Thanks to NetChip Technologies for donating this product ID.
+ * It's for devices with only CDC Ethernet configurations.
+ */
+#define CDC_VENDOR_NUM	0x0525		/* NetChip */
+#define CDC_PRODUCT_NUM	0xa4a1		/* Linux-USB Ethernet Gadget */
 
-/*
- * hardware-specific configuration, controlled by which device
- * controller driver was configured.
- *
- * CHIP ... hardware identifier
- * DRIVER_VERSION_NUM ... alerts the host side driver to differences
- * EP_*_NAME ... which endpoints do we use for which purpose?
- * EP_*_NUM ... numbers for them (often limited by hardware)
- * WAKEUP ... if hardware supports remote wakeup AND we will issue the
- * 	usb_gadget_wakeup() call to initiate it, USB_CONFIG_ATT_WAKEUP
- *
- * hw_optimize(gadget) ... for any hardware tweaks we want to kick in
- * 	before we enable our endpoints
+/* For hardware that can't talk CDC, we use the same vendor ID that
+ * ARM Linux has used for ethernet-over-usb, both with sa1100 and
+ * with pxa250.  We're protocol-compatible, if the host-side drivers
+ * use the endpoint descriptors.  bcdDevice (version) is nonzero, so
+ * drivers that need to hard-wire endpoint numbers have a hook.
  *
- * add other defines for other portability issues, like hardware that
- * for some reason doesn't handle full speed bulk maxpacket of 64.
+ * The protocol is a minimal subset of CDC Ether, which works on any bulk
+ * hardware that's not deeply broken ... even on hardware that can't talk
+ * RNDIS (like SA-1100, with no interrupt endpoint, or anything that
+ * doesn't handle control-OUT).
  */
+#define	SIMPLE_VENDOR_NUM	0x049f
+#define	SIMPLE_PRODUCT_NUM	0x505a
 
-#define DEV_CONFIG_VALUE	3	/* some hardware cares */
-
-/* #undef on hardware that can't implement CDC */
-#define	DEV_CONFIG_CDC
+/* For hardware that can talk RNDIS and either of the above protocols,
+ * use this ID ... the windows INF files will know it.  Unless it's
+ * used with CDC Ethernet, Linux hosts will need updates to choose the
+ * non-MSFT configuration, either in the kernel (2.4) or else from a
+ * hotplug script (2.6).
+ */
+#define RNDIS_VENDOR_NUM	0x0525	/* NetChip */
+#define RNDIS_PRODUCT_NUM	0xa4a2	/* Ethernet/RNDIS Gadget */
 
-/* undef on bus-powered hardware, and #define MAX_USB_POWER */
-#define SELFPOWER
 
-/*
- * NetChip 2280, PCI based.
- *
- * use DMA with fat fifos for all data traffic, PIO for the status channel
- * where its 64 byte maxpacket ceiling is no issue.
- *
- * performance note:  only PIO needs per-usb-packet IRQs (ep0, ep-e, ep-f)
- * otherwise IRQs are per-Ethernet-packet unless TX_DELAY and chaining help.
+/* Some systems will want different product identifers published in the
+ * device descriptor, either numbers or strings or both.  These string
+ * parameters are in UTF-8 (superset of ASCII's 7 bit characters).
  */
-#ifdef	CONFIG_USB_GADGET_NET2280
-#define CHIP			"net2280"
-#define DEFAULT_QLEN		4		/* has dma chaining */
-#define DRIVER_VERSION_NUM	0x0101
-static const char EP_OUT_NAME [] = "ep-a";
-#define EP_OUT_NUM	1
-static const char EP_IN_NAME [] = "ep-b";
-#define EP_IN_NUM	2
-static const char EP_STATUS_NAME [] = "ep-f";
-#define EP_STATUS_NUM	3
-/* supports remote wakeup, but this driver doesn't */
 
-extern int net2280_set_fifo_mode (struct usb_gadget *gadget, int mode);
+static ushort __initdata idVendor;
+module_param(idVendor, ushort, S_IRUGO);
+MODULE_PARM_DESC(idVendor, "USB Vendor ID");
 
-static inline void hw_optimize (struct usb_gadget *gadget)
-{
-	/* we can have bigger ep-a/ep-b fifos (2KB each, 4 USB packets
-	 * for highspeed bulk) because we're not using ep-c/ep-d.
-	 */
-	net2280_set_fifo_mode (gadget, 1);
-}
-#endif
+static ushort __initdata idProduct;
+module_param(idProduct, ushort, S_IRUGO);
+MODULE_PARM_DESC(idProduct, "USB Product ID");
 
-/*
- * PXA-2xx UDC:  widely used in second gen Linux-capable ARM PDAs
- * and other products.
- *
- * multiple interfaces (or altsettings) aren't usable.  so this hardware
- * can't implement CDC, which needs both capabilities.
- */
-#ifdef	CONFIG_USB_GADGET_PXA2XX
-#undef	DEV_CONFIG_CDC
-#define CHIP			"pxa2xx"
-#define DRIVER_VERSION_NUM	0x0103
-static const char EP_OUT_NAME [] = "ep2out-bulk";
-#define EP_OUT_NUM	2
-static const char EP_IN_NAME [] = "ep1in-bulk";
-#define EP_IN_NUM	1
-/* supports remote wakeup, but this driver doesn't */
+static ushort __initdata bcdDevice;
+module_param(bcdDevice, ushort, S_IRUGO);
+MODULE_PARM_DESC(bcdDevice, "USB Device version (BCD)");
 
-/* no hw optimizations to apply */
-#define hw_optimize(g) do {} while (0)
-#endif
+static char *__initdata iManufacturer;
+module_param(iManufacturer, charp, S_IRUGO);
+MODULE_PARM_DESC(iManufacturer, "USB Manufacturer string");
 
-/*
- * SA-1100 UDC:  widely used in first gen Linux-capable PDAs.
- *
- * can't have a notification endpoint, since there are only the two
- * bulk-capable ones.  the CDC spec allows that.
- */
-#ifdef	CONFIG_USB_GADGET_SA1100
-#define CHIP			"sa1100"
-#define DRIVER_VERSION_NUM	0x0105
-static const char EP_OUT_NAME [] = "ep1out-bulk";
-#define EP_OUT_NUM	1
-static const char EP_IN_NAME [] = "ep2in-bulk";
-#define EP_IN_NUM	2
-// EP_STATUS_NUM is undefined
-/* doesn't support remote wakeup? */
+static char *__initdata iProduct;
+module_param(iProduct, charp, S_IRUGO);
+MODULE_PARM_DESC(iProduct, "USB Product string");
 
-/* no hw optimizations to apply */
-#define hw_optimize(g) do {} while (0)
-#endif
 
-/*
- * Toshiba TC86C001 ("Goku-S") UDC
- *
- * This has three semi-configurable full speed bulk/interrupt endpoints.
- */
-#ifdef	CONFIG_USB_GADGET_GOKU
-#define CHIP			"goku"
-#define DRIVER_VERSION_NUM	0x0106
-static const char EP_OUT_NAME [] = "ep1-bulk";
-#define EP_OUT_NUM	1
-static const char EP_IN_NAME [] = "ep2-bulk";
-#define EP_IN_NUM	2
-static const char EP_STATUS_NAME [] = "ep3-bulk";
-#define EP_STATUS_NUM	3
-/* doesn't support remote wakeup */
+/*-------------------------------------------------------------------------*/
+
+/* Include CDC support if we could run on CDC-capable hardware. */
 
-#define hw_optimize(g) do {} while (0)
+#ifdef CONFIG_USB_GADGET_NET2280
+#define	DEV_CONFIG_CDC
 #endif
 
-/*
- * SuperH UDC:  UDC built-in to some Renesas SH processors.
- *
- * This has three semi-configurable full speed bulk/interrupt endpoints.
- *
- * Only one configuration and interface is supported.  So this hardware
- * can't implement CDC.
- */
-#ifdef	CONFIG_USB_GADGET_SUPERH
-#undef	DEV_CONFIG_CDC
-#define CHIP			"superh"
-#define DRIVER_VERSION_NUM	0x0107
-static const char EP_OUT_NAME[] = "ep1out-bulk";
-#define EP_OUT_NUM		1
-static const char EP_IN_NAME[] = "ep2in-bulk";
-#define EP_IN_NUM		2
+#ifdef CONFIG_USB_GADGET_DUMMY_HCD
+#define	DEV_CONFIG_CDC
+#endif
 
-#define hw_optimize(g) do {} while (0)
+#ifdef CONFIG_USB_GADGET_GOKU
+#define	DEV_CONFIG_CDC
 #endif
 
-/*-------------------------------------------------------------------------*/
+#ifdef CONFIG_USB_GADGET_MQ11XX
+#define	DEV_CONFIG_CDC
+#endif
 
-#ifndef CHIP
-#	error Configure some USB peripheral controller driver!
+#ifdef CONFIG_USB_GADGET_OMAP
+#define	DEV_CONFIG_CDC
 #endif
 
-/* We normally expect hardware that can talk CDC.  That involves
- * using multiple interfaces and altsettings, and maybe a status
- * interrupt.  Driver binding to be done according to USB-IF class,
- * though you can use different VENDOR and PRODUCT numbers if you
- * want (and they're officially assigned).
- * 
- * For hardware that can't talk CDC, we use the same vendor ID that
- * ARM Linux has used for ethernet-over-usb, both with sa1100 and
- * with pxa250.  We're protocol-compatible, if the host-side drivers
- * use the endpoint descriptors.  DRIVER_VERSION_NUM is nonzero, so
- * drivers that need to hard-wire endpoint numbers have a hook.
+
+/* For CDC-incapable hardware, choose the simple cdc subset.
+ * Anything that talks bulk (without notable bugs) can do this.
  */
-#ifdef	DEV_CONFIG_CDC
-#define	DEV_CONFIG_CLASS	USB_CLASS_COMM
-#else	
-#define	DEV_CONFIG_CLASS	USB_CLASS_VENDOR_SPEC
-#undef	EP_STATUS_NUM
-#undef	DRIVER_VENDOR_NUM
-#undef	DRIVER_PRODUCT_NUM
-#define	DRIVER_VENDOR_NUM	0x049f
-#define	DRIVER_PRODUCT_NUM	0x505a
-#endif /* CONFIG_CDC_ETHER */
-
-/* power usage is config specific.
- * hardware that supports remote wakeup defaults to disabling it.
- */
-
-#ifndef	MAX_USB_POWER
-#ifdef	SELFPOWER
-/* some hosts are confused by 0mA  */
-#define MAX_USB_POWER	2	/* mA */
-#else
-/* bus powered */
-#error	Define your bus power consumption!
+#ifdef CONFIG_USB_GADGET_PXA
+#define	DEV_CONFIG_SUBSET
+#endif
+
+#ifdef CONFIG_USB_GADGET_SH
+#define	DEV_CONFIG_SUBSET
 #endif
-#endif	/* MAX_USB_POWER */
 
-#ifndef	WAKEUP
-/* default: this driver won't do remote wakeup */
-#define WAKEUP		0
-/* else value must be USB_CONFIG_ATT_WAKEUP */
+#ifdef CONFIG_USB_GADGET_SA1100
+/* use non-CDC for backwards compatibility */
+#define	DEV_CONFIG_SUBSET
 #endif
 
+
 /*-------------------------------------------------------------------------*/
 
-#ifndef DEFAULT_QLEN
 #define DEFAULT_QLEN	2	/* double buffering by default */
-#endif
 
 #ifdef CONFIG_USB_GADGET_DUALSPEED
 
@@ -320,10 +250,14 @@ module_param (qmult, uint, S_IRUGO|S_IWU
 	(DEFAULT_QLEN*((gadget->speed == USB_SPEED_HIGH) ? qmult : 1))
 
 /* also defer IRQs on highspeed TX */
-#define TX_DELAY	DEFAULT_QLEN
+#define TX_DELAY	qmult
+
+#define	BITRATE(g) ((g->speed == USB_SPEED_HIGH) ? 4800000 : 120000)
 
 #else	/* full speed (low speed doesn't do bulk) */
 #define qlen(gadget) DEFAULT_QLEN
+
+#define	BITRATE(g)	(12000)
 #endif
 
 
@@ -364,8 +298,13 @@ module_param (qmult, uint, S_IRUGO|S_IWU
 
 /*
  * DESCRIPTORS ... most are static, but strings and (full) configuration
- * descriptors are built on demand.  Notice how most of the cdc descriptors
- * aren't needed in the "minimalist" mode.
+ * descriptors are built on demand.  For now we do either full CDC, or
+ * our simple subset, with RNDIS as an optional second configuration.
+ *
+ * RNDIS includes some CDC ACM descriptors ... like CDC Ethernet.  But
+ * the class descriptors match a modem (they're ignored; it's really just
+ * Ethernet functionality), they don't need the NOP altsetting, and the
+ * status transfer endpoint isn't optional.
  */
 
 #define STRING_MANUFACTURER		1
@@ -373,12 +312,24 @@ module_param (qmult, uint, S_IRUGO|S_IWU
 #define STRING_ETHADDR			3
 #define STRING_DATA			4
 #define STRING_CONTROL			5
+#define STRING_RNDIS_CONTROL		6
+#define STRING_CDC			7
+#define STRING_SUBSET			8
+#define STRING_RNDIS			9
 
 #define USB_BUFSIZ	256		/* holds our biggest descriptor */
 
 /*
- * This device advertises one configuration.
+ * This device advertises one configuration, eth_config, unless RNDIS
+ * is enabled (rndis_config) on hardware supporting at least two configs.
+ *
+ * NOTE:  Controllers like superh_udc should probably be able to use
+ * an RNDIS-only configuration.
  */
+
+#define DEV_CONFIG_VALUE	1	/* cdc or subset */
+#define DEV_RNDIS_CONFIG_VALUE	2	/* rndis; optional */
+
 static struct usb_device_descriptor
 device_desc = {
 	.bLength =		sizeof device_desc,
@@ -386,13 +337,12 @@ device_desc = {
 
 	.bcdUSB =		__constant_cpu_to_le16 (0x0200),
 
-	.bDeviceClass =		DEV_CONFIG_CLASS,
+	.bDeviceClass =		USB_CLASS_COMM,
 	.bDeviceSubClass =	0,
 	.bDeviceProtocol =	0,
 
-	.idVendor =		__constant_cpu_to_le16 (DRIVER_VENDOR_NUM),
-	.idProduct =		__constant_cpu_to_le16 (DRIVER_PRODUCT_NUM),
-	.bcdDevice =		__constant_cpu_to_le16 (DRIVER_VERSION_NUM),
+	.idVendor =		__constant_cpu_to_le16 (CDC_VENDOR_NUM),
+	.idProduct =		__constant_cpu_to_le16 (CDC_PRODUCT_NUM),
 	.iManufacturer =	STRING_MANUFACTURER,
 	.iProduct =		STRING_PRODUCT,
 	.bNumConfigurations =	1,
@@ -404,44 +354,70 @@ eth_config = {
 	.bDescriptorType =	USB_DT_CONFIG,
 
 	/* compute wTotalLength on the fly */
-#ifdef	DEV_CONFIG_CDC
 	.bNumInterfaces =	2,
-#else
-	.bNumInterfaces =	1,
-#endif
 	.bConfigurationValue =	DEV_CONFIG_VALUE,
-	.iConfiguration =	STRING_PRODUCT,
-	.bmAttributes =		USB_CONFIG_ATT_ONE | WAKEUP,
-	.bMaxPower =		(MAX_USB_POWER + 1) / 2,
+	.iConfiguration =	STRING_CDC,
+	.bmAttributes =		USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER,
+	.bMaxPower =		1,
 };
 
-#ifdef	DEV_CONFIG_CDC
+#ifdef	CONFIG_USB_ETH_RNDIS
+static const struct usb_config_descriptor 
+rndis_config = {
+	.bLength =              sizeof rndis_config,
+	.bDescriptorType =      USB_DT_CONFIG,
+
+	/* compute wTotalLength on the fly */
+	.bNumInterfaces =       2,
+	.bConfigurationValue =  DEV_RNDIS_CONFIG_VALUE,
+	.iConfiguration =       STRING_RNDIS,
+	.bmAttributes =		USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER,
+	.bMaxPower =            1,
+};
+#endif
 
 /*
- * Compared to the "minimalist" non-CDC model, the CDC model adds
- * three class descriptors, two interface descrioptors, and a status
+ * Compared to the simple CDC subset, the full CDC Ethernet model adds
+ * three class descriptors, two interface descriptors, optional status
  * endpoint.  Both have a "data" interface and two bulk endpoints.
  * There are also differences in how control requests are handled.
+ *
+ * RNDIS shares a lot with CDC-Ethernet, since it's a variant of
+ * the CDC-ACM (modem) spec.
  */
 
-/* master comm interface optionally has a status notification endpoint */
-
-static const struct usb_interface_descriptor
+#ifdef	DEV_CONFIG_CDC
+static struct usb_interface_descriptor
 control_intf = {
 	.bLength =		sizeof control_intf,
 	.bDescriptorType =	USB_DT_INTERFACE,
 
 	.bInterfaceNumber =	0,
-#ifdef	EP_STATUS_NUM
+	/* status endpoint is optional; this may be patched later */
 	.bNumEndpoints =	1,
-#else
-	.bNumEndpoints =	0,
-#endif
 	.bInterfaceClass =	USB_CLASS_COMM,
 	.bInterfaceSubClass =	6,	/* ethernet control model */
 	.bInterfaceProtocol =	0,
 	.iInterface =		STRING_CONTROL,
 };
+#endif
+
+#ifdef	CONFIG_USB_ETH_RNDIS
+static const struct usb_interface_descriptor
+rndis_control_intf = {
+	.bLength =              sizeof rndis_control_intf,
+	.bDescriptorType =      USB_DT_INTERFACE,
+	  
+	.bInterfaceNumber =     0,
+	.bNumEndpoints =        1,
+	.bInterfaceClass =      USB_CLASS_COMM,
+	.bInterfaceSubClass =   2,	/* abstract control model */
+	.bInterfaceProtocol =   0xff,	/* vendor specific */
+	.iInterface =           STRING_RNDIS_CONTROL,
+};
+#endif
+
+#if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS)
 
 /* "Header Functional Descriptor" from CDC spec  5.2.3.1 */
 struct header_desc {
@@ -454,13 +430,13 @@ struct header_desc {
 
 static const struct header_desc header_desc = {
 	.bLength =		sizeof header_desc,
-	.bDescriptorType =	0x24,
+	.bDescriptorType =	USB_DT_CS_INTERFACE,
 	.bDescriptorSubType =	0,
 
 	.bcdCDC =		__constant_cpu_to_le16 (0x0110),
 };
 
-/* "Union Functional Descriptor" from CDC spec 5.2.3.X */
+/* "Union Functional Descriptor" from CDC spec 5.2.3.8 */
 struct union_desc {
 	u8	bLength;
 	u8	bDescriptorType;
@@ -473,13 +449,58 @@ struct union_desc {
 
 static const struct union_desc union_desc = {
 	.bLength =		sizeof union_desc,
-	.bDescriptorType =	0x24,
+	.bDescriptorType =	USB_DT_CS_INTERFACE,
 	.bDescriptorSubType =	6,
 
 	.bMasterInterface0 =	0,	/* index of control interface */
 	.bSlaveInterface0 =	1,	/* index of DATA interface */
 };
 
+#endif	/* CDC || RNDIS */
+
+#ifdef	CONFIG_USB_ETH_RNDIS
+
+/* "Call Management Descriptor" from CDC spec  5.2.3.3 */
+struct call_mgmt_descriptor {
+	u8  bLength;
+	u8  bDescriptorType;
+	u8  bDescriptorSubType;
+
+	u8  bmCapabilities;
+	u8  bDataInterface;
+} __attribute__ ((packed));
+
+static const struct call_mgmt_descriptor call_mgmt_descriptor = {
+	.bLength =  		sizeof call_mgmt_descriptor,
+	.bDescriptorType = 	USB_DT_CS_INTERFACE,
+	.bDescriptorSubType = 	0x01,
+
+	.bmCapabilities = 	0x00,
+	.bDataInterface = 	0x01,
+};
+
+
+/* "Abstract Control Management Descriptor" from CDC spec  5.2.3.4 */
+struct acm_descriptor {
+	u8  bLength;
+	u8  bDescriptorType;
+	u8  bDescriptorSubType;
+
+	u8  bmCapabilities;
+} __attribute__ ((packed));
+
+static struct acm_descriptor acm_descriptor = {
+	.bLength =  		sizeof acm_descriptor,
+	.bDescriptorType = 	USB_DT_CS_INTERFACE,
+	.bDescriptorSubType = 	0x02,
+
+	.bmCapabilities = 	0X00,
+};
+
+#endif
+
+#ifdef	DEV_CONFIG_CDC
+
 /* "Ethernet Networking Functional Descriptor" from CDC spec 5.2.3.16 */
 struct ether_desc {
 	u8	bLength;
@@ -495,41 +516,53 @@ struct ether_desc {
 
 static const struct ether_desc ether_desc = {
 	.bLength =		sizeof ether_desc,
-	.bDescriptorType =	0x24,
+	.bDescriptorType =	USB_DT_CS_INTERFACE,
 	.bDescriptorSubType =	0x0f,
 
 	/* this descriptor actually adds value, surprise! */
 	.iMACAddress =		STRING_ETHADDR,
 	.bmEthernetStatistics =	__constant_cpu_to_le32 (0), /* no statistics */
-	.wMaxSegmentSize =	__constant_cpu_to_le16 (MAX_PACKET + ETH_HLEN),
+	.wMaxSegmentSize =	__constant_cpu_to_le16 (ETH_FRAME_LEN),
 	.wNumberMCFilters =	__constant_cpu_to_le16 (0),
 	.bNumberPowerFilters =	0,
 };
 
-#ifdef	EP_STATUS_NUM
+#endif
+
+#if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS)
 
-/* include the status endpoint if we can, even though it's optional.
+/* include the status endpoint if we can, even where it's optional.
+ * use small wMaxPacketSize, since many "interrupt" endpoints have
+ * very small fifos and it's no big deal if CDC_NOTIFY_SPEED_CHANGE
+ * takes two packets.  also default to a big transfer interval, to
+ * waste less bandwidth.
  *
- * some drivers (like current Linux cdc-ether!) "need" it to exist even
+ * some drivers (like Linux 2.4 cdc-ether!) "need" it to exist even
  * if they ignore the connect/disconnect notifications that real aether
  * can provide.  more advanced cdc configurations might want to support
  * encapsulated commands (vendor-specific, using control-OUT).
+ *
+ * RNDIS requires the status endpoint, since it uses that encapsulation
+ * mechanism for its funky RPC scheme.
  */
  
-#define LOG2_STATUS_INTERVAL_MSEC	6
-#define STATUS_BYTECOUNT		16	/* 8 byte header + data */
-static const struct usb_endpoint_descriptor
+#define LOG2_STATUS_INTERVAL_MSEC	5	/* 1 << 5 == 32 msec */
+#define STATUS_BYTECOUNT		8	/* 8 byte header + data */
+
+static struct usb_endpoint_descriptor
 fs_status_desc = {
 	.bLength =		USB_DT_ENDPOINT_SIZE,
 	.bDescriptorType =	USB_DT_ENDPOINT,
 
-	.bEndpointAddress =	EP_STATUS_NUM | USB_DIR_IN,
+	.bEndpointAddress =	USB_DIR_IN,
 	.bmAttributes =		USB_ENDPOINT_XFER_INT,
 	.wMaxPacketSize =	__constant_cpu_to_le16 (STATUS_BYTECOUNT),
 	.bInterval =		1 << LOG2_STATUS_INTERVAL_MSEC,
 };
 #endif
 
+#ifdef	DEV_CONFIG_CDC
+
 /* the default data interface has no endpoints ... */
 
 static const struct usb_interface_descriptor
@@ -543,10 +576,9 @@ data_nop_intf = {
 	.bInterfaceClass =	USB_CLASS_CDC_DATA,
 	.bInterfaceSubClass =	0,
 	.bInterfaceProtocol =	0,
-	.iInterface =		STRING_DATA,
 };
 
-/* ... but the "real" data interface has two full speed bulk endpoints */
+/* ... but the "real" data interface has two bulk endpoints */
 
 static const struct usb_interface_descriptor
 data_intf = {
@@ -561,16 +593,39 @@ data_intf = {
 	.bInterfaceProtocol =	0,
 	.iInterface =		STRING_DATA,
 };
-#else
+
+#endif
+
+#ifdef	CONFIG_USB_ETH_RNDIS
+
+/* RNDIS doesn't activate by changing to the "real" altsetting */
+
+static const struct usb_interface_descriptor
+rndis_data_intf = {
+	.bLength =		sizeof rndis_data_intf,
+	.bDescriptorType =	USB_DT_INTERFACE,
+
+	.bInterfaceNumber =	1,
+	.bAlternateSetting =	0,
+	.bNumEndpoints =	2,
+	.bInterfaceClass =	USB_CLASS_CDC_DATA,
+	.bInterfaceSubClass =	0,
+	.bInterfaceProtocol =	0,
+	.iInterface =		STRING_DATA,
+};
+
+#endif
+
+#ifdef DEV_CONFIG_SUBSET
 
 /*
- * "Minimalist" non-CDC option is a simple vendor-neutral model that most
+ * "Simple" CDC-subset option is a simple vendor-neutral model that most
  * full speed controllers can handle:  one interface, two bulk endpoints.
  */
 
 static const struct usb_interface_descriptor
-data_intf = {
-	.bLength =		sizeof data_intf,
+subset_data_intf = {
+	.bLength =		sizeof subset_data_intf,
 	.bDescriptorType =	USB_DT_INTERFACE,
 
 	.bInterfaceNumber =	0,
@@ -582,47 +637,73 @@ data_intf = {
 	.iInterface =		STRING_DATA,
 };
 
-#endif	/* DEV_CONFIG_CDC */
+#endif	/* SUBSET */
 
 
-static const struct usb_endpoint_descriptor
+static struct usb_endpoint_descriptor
 fs_source_desc = {
 	.bLength =		USB_DT_ENDPOINT_SIZE,
 	.bDescriptorType =	USB_DT_ENDPOINT,
 
-	.bEndpointAddress =	EP_IN_NUM | USB_DIR_IN,
+	.bEndpointAddress =	USB_DIR_IN,
 	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
-	.wMaxPacketSize =	__constant_cpu_to_le16 (64),
 };
 
-static const struct usb_endpoint_descriptor
+static struct usb_endpoint_descriptor
 fs_sink_desc = {
 	.bLength =		USB_DT_ENDPOINT_SIZE,
 	.bDescriptorType =	USB_DT_ENDPOINT,
 
-	.bEndpointAddress =	EP_OUT_NUM,
+	.bEndpointAddress =	USB_DIR_OUT,
 	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
-	.wMaxPacketSize =	__constant_cpu_to_le16 (64),
 };
 
-static const struct usb_descriptor_header *fs_function [] = {
+static const struct usb_descriptor_header *fs_eth_function [10] = {
 #ifdef DEV_CONFIG_CDC
 	/* "cdc" mode descriptors */
 	(struct usb_descriptor_header *) &control_intf,
 	(struct usb_descriptor_header *) &header_desc,
 	(struct usb_descriptor_header *) &union_desc,
 	(struct usb_descriptor_header *) &ether_desc,
-#ifdef	EP_STATUS_NUM
+	/* NOTE: status endpoint may need to be removed */
 	(struct usb_descriptor_header *) &fs_status_desc,
-#endif
+	/* data interface, with altsetting */
 	(struct usb_descriptor_header *) &data_nop_intf,
-#endif /* DEV_CONFIG_CDC */
-	/* minimalist core */
 	(struct usb_descriptor_header *) &data_intf,
 	(struct usb_descriptor_header *) &fs_source_desc,
 	(struct usb_descriptor_header *) &fs_sink_desc,
 	0,
+#endif /* DEV_CONFIG_CDC */
+};
+
+static inline void __init fs_subset_descriptors(void)
+{
+#ifdef DEV_CONFIG_SUBSET
+	fs_eth_function[0] = (struct usb_descriptor_header *) &subset_data_intf;
+	fs_eth_function[1] = (struct usb_descriptor_header *) &fs_source_desc;
+	fs_eth_function[2] = (struct usb_descriptor_header *) &fs_sink_desc;
+	fs_eth_function[3] = 0;
+#else
+	fs_eth_function[0] = 0;
+#endif
+}
+
+#ifdef	CONFIG_USB_ETH_RNDIS
+static const struct usb_descriptor_header *fs_rndis_function [] = {
+	/* control interface matches ACM, not Ethernet */
+	(struct usb_descriptor_header *) &rndis_control_intf,
+	(struct usb_descriptor_header *) &header_desc,
+	(struct usb_descriptor_header *) &call_mgmt_descriptor,
+	(struct usb_descriptor_header *) &acm_descriptor,
+	(struct usb_descriptor_header *) &union_desc,
+	(struct usb_descriptor_header *) &fs_status_desc,
+	/* data interface has no altsetting */
+	(struct usb_descriptor_header *) &rndis_data_intf,
+	(struct usb_descriptor_header *) &fs_source_desc,
+	(struct usb_descriptor_header *) &fs_sink_desc,
+	0,
 };
+#endif
 
 #ifdef	CONFIG_USB_GADGET_DUALSPEED
 
@@ -631,39 +712,34 @@ static const struct usb_descriptor_heade
  * descriptors, unless they only run at full speed.
  */
 
-#ifdef	EP_STATUS_NUM
-static const struct usb_endpoint_descriptor
+#if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS)
+static struct usb_endpoint_descriptor
 hs_status_desc = {
 	.bLength =		USB_DT_ENDPOINT_SIZE,
 	.bDescriptorType =	USB_DT_ENDPOINT,
 
-	.bEndpointAddress =	EP_STATUS_NUM | USB_DIR_IN,
 	.bmAttributes =		USB_ENDPOINT_XFER_INT,
 	.wMaxPacketSize =	__constant_cpu_to_le16 (STATUS_BYTECOUNT),
-	.bInterval =		LOG2_STATUS_INTERVAL_MSEC + 3,
+	.bInterval =		LOG2_STATUS_INTERVAL_MSEC + 4,
 };
-#endif
+#endif /* DEV_CONFIG_CDC */
 
-static const struct usb_endpoint_descriptor
+static struct usb_endpoint_descriptor
 hs_source_desc = {
 	.bLength =		USB_DT_ENDPOINT_SIZE,
 	.bDescriptorType =	USB_DT_ENDPOINT,
 
-	.bEndpointAddress =	EP_IN_NUM | USB_DIR_IN,
 	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
 	.wMaxPacketSize =	__constant_cpu_to_le16 (512),
-	.bInterval =		1,
 };
 
-static const struct usb_endpoint_descriptor
+static struct usb_endpoint_descriptor
 hs_sink_desc = {
 	.bLength =		USB_DT_ENDPOINT_SIZE,
 	.bDescriptorType =	USB_DT_ENDPOINT,
 
-	.bEndpointAddress =	EP_OUT_NUM,
 	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
 	.wMaxPacketSize =	__constant_cpu_to_le16 (512),
-	.bInterval =		1,
 };
 
 static struct usb_qualifier_descriptor
@@ -672,29 +748,57 @@ dev_qualifier = {
 	.bDescriptorType =	USB_DT_DEVICE_QUALIFIER,
 
 	.bcdUSB =		__constant_cpu_to_le16 (0x0200),
-	.bDeviceClass =		DEV_CONFIG_CLASS,
+	.bDeviceClass =		USB_CLASS_COMM,
 
 	.bNumConfigurations =	1,
 };
 
-static const struct usb_descriptor_header *hs_function [] = {
+static const struct usb_descriptor_header *hs_eth_function [10] = {
 #ifdef DEV_CONFIG_CDC
 	/* "cdc" mode descriptors */
 	(struct usb_descriptor_header *) &control_intf,
 	(struct usb_descriptor_header *) &header_desc,
 	(struct usb_descriptor_header *) &union_desc,
 	(struct usb_descriptor_header *) &ether_desc,
-#ifdef	EP_STATUS_NUM
+	/* NOTE: status endpoint may need to be removed */
 	(struct usb_descriptor_header *) &hs_status_desc,
-#endif
+	/* data interface, with altsetting */
 	(struct usb_descriptor_header *) &data_nop_intf,
-#endif /* DEV_CONFIG_CDC */
-	/* minimalist core */
 	(struct usb_descriptor_header *) &data_intf,
 	(struct usb_descriptor_header *) &hs_source_desc,
 	(struct usb_descriptor_header *) &hs_sink_desc,
 	0,
+#endif /* DEV_CONFIG_CDC */
+};
+
+static inline void __init hs_subset_descriptors(void)
+{
+#ifdef DEV_CONFIG_SUBSET
+	hs_eth_function[0] = (struct usb_descriptor_header *) &subset_data_intf;
+	hs_eth_function[1] = (struct usb_descriptor_header *) &fs_source_desc;
+	hs_eth_function[2] = (struct usb_descriptor_header *) &fs_sink_desc;
+	hs_eth_function[3] = 0;
+#else
+	hs_eth_function[0] = 0;
+#endif
+}
+
+#ifdef	CONFIG_USB_ETH_RNDIS
+static const struct usb_descriptor_header *hs_rndis_function [] = {
+	/* control interface matches ACM, not Ethernet */
+	(struct usb_descriptor_header *) &rndis_control_intf,
+	(struct usb_descriptor_header *) &header_desc,
+	(struct usb_descriptor_header *) &call_mgmt_descriptor,
+	(struct usb_descriptor_header *) &acm_descriptor,
+	(struct usb_descriptor_header *) &union_desc,
+	(struct usb_descriptor_header *) &hs_status_desc,
+	/* data interface has no altsetting */
+	(struct usb_descriptor_header *) &rndis_data_intf,
+	(struct usb_descriptor_header *) &hs_source_desc,
+	(struct usb_descriptor_header *) &hs_sink_desc,
+	0,
 };
+#endif
 
 
 /* maxpacket and other transfer characteristics vary by speed. */
@@ -705,12 +809,19 @@ static const struct usb_descriptor_heade
 /* if there's no high speed support, maxpacket doesn't change. */
 #define ep_desc(g,hs,fs) fs
 
+static inline void __init hs_subset_descriptors(void)
+{
+}
+
 #endif	/* !CONFIG_USB_GADGET_DUALSPEED */
 
 /*-------------------------------------------------------------------------*/
 
 /* descriptors that are built on-demand */
 
+static char				manufacturer [40];
+static char				product_desc [40] = DRIVER_DESC;
+
 #ifdef	DEV_CONFIG_CDC
 /* address that the host will use ... usually assigned at random */
 static char				ethaddr [2 * ETH_ALEN + 1];
@@ -718,13 +829,21 @@ static char				ethaddr [2 * ETH_ALEN + 1
 
 /* static strings, in iso 8859/1 */
 static struct usb_string		strings [] = {
-	{ STRING_MANUFACTURER,	UTS_SYSNAME " " UTS_RELEASE "/" CHIP, },
-	{ STRING_PRODUCT,	driver_desc, },
+	{ STRING_MANUFACTURER,	manufacturer, },
+	{ STRING_PRODUCT,	product_desc, },
+	{ STRING_DATA,		"Ethernet Data", },
 #ifdef	DEV_CONFIG_CDC
+	{ STRING_CDC,		"CDC Ethernet", },
 	{ STRING_ETHADDR,	ethaddr, },
 	{ STRING_CONTROL,	"CDC Communications Control", },
 #endif
-	{ STRING_DATA,		"Ethernet Data", },
+#ifdef	DEV_CONFIG_SUBSET
+	{ STRING_SUBSET,	"CDC Ethernet Subset", },
+#endif
+#ifdef	CONFIG_USB_ETH_RNDIS
+	{ STRING_RNDIS,		"RNDIS", },
+	{ STRING_RNDIS_CONTROL,	"RNDIS Communications Control", },
+#endif
 	{  }		/* end of list */
 };
 
@@ -741,20 +860,34 @@ static int
 config_buf (enum usb_device_speed speed, u8 *buf, u8 type, unsigned index)
 {
 	int				len;
-	const struct usb_descriptor_header **function = fs_function;
 #ifdef CONFIG_USB_GADGET_DUALSPEED
 	int				hs = (speed == USB_SPEED_HIGH);
 
 	if (type == USB_DT_OTHER_SPEED_CONFIG)
 		hs = !hs;
-	if (hs)
-		function = hs_function;
+#define which_config(t)	(hs ? & t ## _config   : & t ## _config)
+#define which_fn(t)	(hs ? & hs_ ## t ## _function : & fs_ ## t ## _function)
+#else
+#define	which_config(t)	(& t ## _config)
+#define	which_fn(t)	(& fs_ ## t ## _function)
 #endif
 
-	/* a single configuration must always be index 0 */
-	if (index > 0)
+	if (index >= device_desc.bNumConfigurations)
 		return -EINVAL;
-	len = usb_gadget_config_buf (&eth_config, buf, USB_BUFSIZ, function);
+
+#ifdef	CONFIG_USB_ETH_RNDIS
+	/* list the RNDIS config first, to make Microsoft's drivers
+	 * happy. DOCSIS 1.0 needs this too.
+	 */
+	if (device_desc.bNumConfigurations == 2 && index == 0)
+		len = usb_gadget_config_buf (which_config (rndis), buf,
+			USB_BUFSIZ, (const struct usb_descriptor_header **)
+				which_fn (rndis));
+	else
+#endif
+		len = usb_gadget_config_buf (which_config (eth), buf,
+			USB_BUFSIZ, (const struct usb_descriptor_header **)
+				which_fn (eth));
 	if (len < 0)
 		return len;
 	((struct usb_config_descriptor *) buf)->bDescriptorType = type;
@@ -766,6 +899,91 @@ config_buf (enum usb_device_speed speed,
 static void eth_start (struct eth_dev *dev, int gfp_flags);
 static int alloc_requests (struct eth_dev *dev, unsigned n, int gfp_flags);
 
+#ifdef	DEV_CONFIG_CDC
+static inline int ether_alt_ep_setup (struct eth_dev *dev, struct usb_ep *ep)
+{
+	const struct usb_endpoint_descriptor	*d;
+
+	/* With CDC,  the host isn't allowed to use these two data
+	 * endpoints in the default altsetting for the interface.
+	 * so we don't activate them yet.  Reset from SET_INTERFACE.
+	 *
+	 * Strictly speaking RNDIS should work the same: activation is
+	 * a side effect of setting a packet filter.  Deactivation is
+	 * from REMOTE_NDIS_HALT_MSG, reset from REMOTE_NDIS_RESET_MSG.
+	 */
+
+	/* one endpoint writes data back IN to the host */
+	if (strcmp (ep->name, EP_IN_NAME) == 0) {
+		d = ep_desc (dev->gadget, &hs_source_desc, &fs_source_desc);
+		ep->driver_data = dev;
+		dev->in_ep = ep;
+		dev->in = d;
+
+	/* one endpoint just reads OUT packets */
+	} else if (strcmp (ep->name, EP_OUT_NAME) == 0) {
+		d = ep_desc (dev->gadget, &hs_sink_desc, &fs_sink_desc);
+		ep->driver_data = dev;
+		dev->out_ep = ep;
+		dev->out = d;
+
+	/* optional status/notification endpoint */
+	} else if (EP_STATUS_NAME &&
+			strcmp (ep->name, EP_STATUS_NAME) == 0) {
+		int			result;
+
+		d = ep_desc (dev->gadget, &hs_status_desc, &fs_status_desc);
+		result = usb_ep_enable (ep, d);
+		if (result < 0)
+			return result;
+
+		ep->driver_data = dev;
+		dev->status_ep = ep;
+		dev->status = d;
+	}
+	return 0;
+}
+#endif
+
+#if	defined(DEV_CONFIG_SUBSET) || defined(CONFIG_USB_ETH_RNDIS)
+static inline int ether_ep_setup (struct eth_dev *dev, struct usb_ep *ep)
+{
+	int					result;
+	const struct usb_endpoint_descriptor	*d;
+
+	/* CDC subset is simpler:  if the device is there,
+	 * it's live with rx and tx endpoints.
+	 *
+	 * Do this as a shortcut for RNDIS too.
+	 */
+
+	/* one endpoint writes data back IN to the host */
+	if (strcmp (ep->name, EP_IN_NAME) == 0) {
+		d = ep_desc (dev->gadget, &hs_source_desc, &fs_source_desc);
+		result = usb_ep_enable (ep, d);
+		if (result < 0)
+			return result;
+
+		ep->driver_data = dev;
+		dev->in_ep = ep;
+		dev->in = d;
+
+	/* one endpoint just reads OUT packets */
+	} else if (strcmp (ep->name, EP_OUT_NAME) == 0) {
+		d = ep_desc (dev->gadget, &hs_sink_desc, &fs_sink_desc);
+		result = usb_ep_enable (ep, d);
+		if (result < 0)
+			return result;
+
+		ep->driver_data = dev;
+		dev->out_ep = ep;
+		dev->out = d;
+	}
+
+	return 0;
+}
+#endif
+
 static int
 set_ether_config (struct eth_dev *dev, int gfp_flags)
 {
@@ -774,34 +992,17 @@ set_ether_config (struct eth_dev *dev, i
 	struct usb_gadget	*gadget = dev->gadget;
 
 	gadget_for_each_ep (ep, gadget) {
-		const struct usb_endpoint_descriptor	*d;
-
 #ifdef	DEV_CONFIG_CDC
-		/* With CDC,  the host isn't allowed to use these two data
-		 * endpoints in the default altsetting for the interface.
-		 * so we don't activate them yet.
-		 */
+		if (!dev->rndis && dev->cdc) {
+			result = ether_alt_ep_setup (dev, ep);
+			if (result == 0)
+				continue;
+		}
+#endif
 
-		/* one endpoint writes data back IN to the host */
-		if (strcmp (ep->name, EP_IN_NAME) == 0) {
-			d = ep_desc (gadget, &hs_source_desc, &fs_source_desc);
-			ep->driver_data = dev;
-			dev->in_ep = ep;
-			dev->in = d;
-			continue;
-
-		/* one endpoint just reads OUT packets */
-		} else if (strcmp (ep->name, EP_OUT_NAME) == 0) {
-			d = ep_desc (gadget, &hs_sink_desc, &fs_sink_desc);
-			ep->driver_data = dev;
-			dev->out_ep = ep;
-			dev->out = d;
-			continue;
-		}
-
-#ifdef	EP_STATUS_NUM
-		/* optional status/notification endpoint */
-		else if (strcmp (ep->name, EP_STATUS_NAME) == 0) {
+#ifdef	CONFIG_USB_ETH_RNDIS
+		if (dev->rndis && strcmp (ep->name, EP_STATUS_NAME) == 0) {
+			const struct usb_endpoint_descriptor	*d;
 			d = ep_desc (gadget, &hs_status_desc, &fs_status_desc);
 			result = usb_ep_enable (ep, d);
 			if (result == 0) {
@@ -810,43 +1011,17 @@ set_ether_config (struct eth_dev *dev, i
 				dev->status = d;
 				continue;
 			}
-		}
+		} else
 #endif
 
-#else	/* !CONFIG_CDC_ETHER */
-
-		/* non-CDC is simpler:  if the device is there,
-		 * it's live with rx and tx endpoints.
-		 */
-		/* one endpoint writes data back IN to the host */
-		if (strcmp (ep->name, EP_IN_NAME) == 0) {
-			d = ep_desc (gadget, &hs_source_desc, &fs_source_desc);
-			result = usb_ep_enable (ep, d);
-			if (result == 0) {
-				ep->driver_data = dev;
-				dev->in_ep = ep;
-				dev->in = d;
+		{
+#if	defined(DEV_CONFIG_SUBSET) || defined(CONFIG_USB_ETH_RNDIS)
+			result = ether_ep_setup (dev, ep);
+			if (result == 0)
 				continue;
-			}
-
-		/* one endpoint just reads OUT packets */
-		} else if (strcmp (ep->name, EP_OUT_NAME) == 0) {
-			d = ep_desc (gadget, &hs_sink_desc, &fs_sink_desc);
-			result = usb_ep_enable (ep, d);
-			if (result == 0) {
-				ep->driver_data = dev;
-				dev->out_ep = ep;
-				dev->out = d;
-				continue;
-			}
+#endif
 		}
 
-#endif /* !CONFIG_CDC_ETHER */
-
-		/* ignore any other endpoints */
-		else
-			continue;
-
 		/* stop on error */
 		ERROR (dev, "can't enable %s, result %d\n", ep->name, result);
 		break;
@@ -857,23 +1032,41 @@ set_ether_config (struct eth_dev *dev, i
 	if (result == 0)
 		result = alloc_requests (dev, qlen (gadget), gfp_flags);
 
-#ifndef	DEV_CONFIG_CDC
-	if (result == 0) {
+	/* on error, disable any endpoints  */
+	if (result < 0) {
+#if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS)
+		if (dev->status_ep)
+			(void) usb_ep_disable (dev->status_ep);
+#endif
+		dev->status_ep = 0;
+		dev->status = 0;
+#if defined(DEV_CONFIG_SUBSET) || defined(CONFIG_USB_ETH_RNDIS)
+		if (dev->rndis || !dev->cdc) {
+			if (dev->in_ep)
+				(void) usb_ep_disable (dev->in_ep);
+			if (dev->out_ep)
+				(void) usb_ep_disable (dev->out_ep);
+		}
+#endif
+		dev->in_ep = 0;
+		dev->in = 0;
+		dev->out_ep = 0;
+		dev->out = 0;
+	} else
+
+	/* activate non-CDC configs right away
+	 * this isn't strictly according to the RNDIS spec
+	 */
+#if defined(DEV_CONFIG_SUBSET) || defined(CONFIG_USB_ETH_RNDIS)
+	if (dev->rndis || !dev->cdc) {
 		netif_carrier_on (dev->net);
 		if (netif_running (dev->net)) {
 			spin_unlock (&dev->lock);
 			eth_start (dev, GFP_ATOMIC);
 			spin_lock (&dev->lock);
 		}
-	} else {
-		(void) usb_ep_disable (dev->in_ep);
-		dev->in_ep = 0;
-		dev->in = 0;
-		(void) usb_ep_disable (dev->out_ep);
-		dev->out_ep = 0;
-		dev->out = 0;
 	}
-#endif /* !CONFIG_CDC_ETHER */
+#endif
 
 	if (result == 0)
 		DEBUG (dev, "qlen %d\n", qlen (gadget));
@@ -918,12 +1111,10 @@ static void eth_reset_config (struct eth
 		dev->out_ep = 0;
 	}
 
-#ifdef	EP_STATUS_NUM
 	if (dev->status_ep) {
 		usb_ep_disable (dev->status_ep);
 		dev->status_ep = 0;
 	}
-#endif
 	dev->config = 0;
 }
 
@@ -939,20 +1130,26 @@ eth_set_config (struct eth_dev *dev, uns
 	if (number == dev->config)
 		return 0;
 
-#ifdef CONFIG_USB_GADGET_SA1100
-	if (dev->config && atomic_read (&dev->tx_qlen) != 0) {
+	if (gadget_is_sa1100 (gadget)
+			&& dev->config
+			&& atomic_read (&dev->tx_qlen) != 0) {
 		/* tx fifo is full, but we can't clear it...*/
 		INFO (dev, "can't change configurations\n");
 		return -ESPIPE;
 	}
-#endif
 	eth_reset_config (dev);
-	hw_optimize (gadget);
 
 	switch (number) {
 	case DEV_CONFIG_VALUE:
+		dev->rndis = 0;
+		result = set_ether_config (dev, gfp_flags);
+		break;
+#ifdef	CONFIG_USB_ETH_RNDIS
+	case DEV_RNDIS_CONFIG_VALUE:
+		dev->rndis = 1;
 		result = set_ether_config (dev, gfp_flags);
 		break;
+#endif
 	default:
 		result = -EINVAL;
 		/* FALL THROUGH */
@@ -974,21 +1171,29 @@ eth_set_config (struct eth_dev *dev, uns
 		}
 
 		dev->config = number;
-		INFO (dev, "%s speed config #%d: %s\n", speed, number,
-				driver_desc);
+		INFO (dev, "%s speed config #%d: %s, using %s\n",
+				speed, number, driver_desc,
+				dev->rndis
+					? "RNDIS"
+					: (dev->cdc
+						? "CDC Ethernet"
+						: "CDC Ethernet Subset"));
 	}
 	return result;
 }
 
 /*-------------------------------------------------------------------------*/
 
-#ifdef	EP_STATUS_NUM
-
-/* section 3.8.2 table 11 of the CDC spec lists Ethernet notifications */
+/* section 3.8.2 table 11 of the CDC spec lists Ethernet notifications
+ * section 3.6.2.1 table 5 specifies ACM notifications, accepted by RNDIS
+ * and RNDIS also defines its own bit-incompatible notifications
+ */
 #define CDC_NOTIFY_NETWORK_CONNECTION	0x00	/* required; 6.3.1 */
 #define CDC_NOTIFY_RESPONSE_AVAILABLE	0x01	/* optional; 6.3.2 */
 #define CDC_NOTIFY_SPEED_CHANGE		0x2a	/* required; 6.3.8 */
 
+#ifdef	DEV_CONFIG_CDC
+
 struct cdc_notification {
 	u8	bmRequestType;
 	u8	bNotificationType;
@@ -1103,19 +1308,46 @@ static void eth_setup_complete (struct u
 
 /* see section 3.8.2 table 10 of the CDC spec for more ethernet
  * requests, mostly for filters (multicast, pm) and statistics
+ * section 3.6.2.1 table 4 has ACM requests; RNDIS requires the
+ * encapsulated command mechanism.
  */
-#define CDC_SEND_ENCAPSULATED_REQUEST	0x00	/* optional */
+#define CDC_SEND_ENCAPSULATED_COMMAND	0x00	/* optional */
 #define CDC_GET_ENCAPSULATED_RESPONSE	0x01	/* optional */
 #define CDC_SET_ETHERNET_PACKET_FILTER	0x43	/* required */
 
+#ifdef CONFIG_USB_ETH_RNDIS
+
+static void rndis_response_complete (struct usb_ep *ep, struct usb_request *req)
+{
+	struct eth_dev          *dev = ep->driver_data;
+	
+	if (req->status || req->actual != req->length)
+		DEBUG (dev, "rndis response complete --> %d, %d/%d\n",
+		       req->status, req->actual, req->length);
+
+	/* done sending after CDC_GET_ENCAPSULATED_RESPONSE */
+	rndis_free_response (dev->rndis_config, req->buf);
+}
+
+static void rndis_command_complete (struct usb_ep *ep, struct usb_request *req)
+{
+	struct eth_dev          *dev = ep->driver_data;
+	
+	/* received RNDIS command from CDC_SEND_ENCAPSULATED_COMMAND */
+	if (rndis_msg_parser (dev->rndis_config, (u8 *) req->buf))
+		ERROR(dev, "%s: rndis parse error\n", __FUNCTION__ );
+}
+
+#endif	/* RNDIS */
+
 /*
  * The setup() callback implements all the ep0 functionality that's not
  * handled lower down.  CDC has a number of less-common features:
  *
  *  - two interfaces:  control, and ethernet data
- *  - data interface has two altsettings:  default, and active
+ *  - Ethernet data interface has two altsettings:  default, and active
  *  - class-specific descriptors for the control interface
- *  - a mandatory class-specific control request
+ *  - class-specific control requests
  */
 static int
 eth_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
@@ -1175,17 +1407,6 @@ eth_setup (struct usb_gadget *gadget, co
 		value = eth_set_config (dev, ctrl->wValue, GFP_ATOMIC);
 		spin_unlock (&dev->lock);
 		break;
-#ifdef	CONFIG_USB_GADGET_PXA2XX
-	/* PXA UDC prevents us from using SET_INTERFACE in normal ways.
-	 * And it hides GET_CONFIGURATION and GET_INTERFACE too.
-	 */
-	case USB_REQ_SET_INTERFACE:
-		spin_lock (&dev->lock);
-		value = eth_set_config (dev, DEV_CONFIG_VALUE, GFP_ATOMIC);
-		spin_unlock (&dev->lock);
-		break;
-
-#else	/* hardware that that stays out of our way */
 	case USB_REQ_GET_CONFIGURATION:
 		if (ctrl->bRequestType != USB_DIR_IN)
 			break;
@@ -1198,17 +1419,28 @@ eth_setup (struct usb_gadget *gadget, co
 				|| !dev->config
 				|| ctrl->wIndex > 1)
 			break;
+		if (!dev->cdc && ctrl->wIndex != 0)
+			break;
 		spin_lock (&dev->lock);
+
+		/* PXA hardware partially handles SET_INTERFACE;
+		 * we need to kluge around that interference.
+		 */
+		if (gadget_is_pxa (gadget)) {
+			value = eth_set_config (dev, DEV_CONFIG_VALUE,
+						GFP_ATOMIC);
+			goto done_set_intf;
+		}
+
+#ifdef DEV_CONFIG_CDC
 		switch (ctrl->wIndex) {
 		case 0:		/* control/master intf */
 			if (ctrl->wValue != 0)
 				break;
-#ifdef	EP_STATUS_NUM
 			if (dev->status_ep) {
 				usb_ep_disable (dev->status_ep);
 				usb_ep_enable (dev->status_ep, dev->status);
 			}
-#endif
 			value = 0;
 			break;
 		case 1:		/* data intf */
@@ -1225,9 +1457,8 @@ eth_setup (struct usb_gadget *gadget, co
 				usb_ep_enable (dev->in_ep, dev->in);
 				usb_ep_enable (dev->out_ep, dev->out);
 				netif_carrier_on (dev->net);
-#ifdef	EP_STATUS_NUM
-				issue_start_status (dev);
-#endif
+				if (dev->status_ep)
+					issue_start_status (dev);
 				if (netif_running (dev->net)) {
 					spin_unlock (&dev->lock);
 					eth_start (dev, GFP_ATOMIC);
@@ -1240,6 +1471,14 @@ eth_setup (struct usb_gadget *gadget, co
 			value = 0;
 			break;
 		}
+#else
+		/* FIXME this is wrong, as is the assumption that
+		 * all non-PXA hardware talks real CDC ...
+		 */
+		dev_warn (&gadget->dev, "set_interface ignored!\n");
+#endif /* DEV_CONFIG_CDC */
+
+done_set_intf:
 		spin_unlock (&dev->lock);
 		break;
 	case USB_REQ_GET_INTERFACE:
@@ -1247,6 +1486,8 @@ eth_setup (struct usb_gadget *gadget, co
 				|| !dev->config
 				|| ctrl->wIndex > 1)
 			break;
+		if (!dev->cdc && ctrl->wIndex != 0)
+			break;
 
 		/* if carrier is on, data interface is active. */
 		*(u8 *)req->buf =
@@ -1255,7 +1496,6 @@ eth_setup (struct usb_gadget *gadget, co
 				: 0,
 		value = min (ctrl->wLength, (u16) 1);
 		break;
-#endif
 
 #ifdef DEV_CONFIG_CDC
 	case CDC_SET_ETHERNET_PACKET_FILTER:
@@ -1263,8 +1503,11 @@ eth_setup (struct usb_gadget *gadget, co
 		 * wValue = packet filter bitmap
 		 */
 		if (ctrl->bRequestType != (USB_TYPE_CLASS|USB_RECIP_INTERFACE)
+				|| !dev->cdc
+				|| dev->rndis
 				|| ctrl->wLength != 0
 				|| ctrl->wIndex > 1)
+			break;
 		DEBUG (dev, "NOP packet filter %04x\n", ctrl->wValue);
 		/* NOTE: table 62 has 5 filter bits to reduce traffic,
 		 * and we "must" support multicast and promiscuous.
@@ -1274,6 +1517,45 @@ eth_setup (struct usb_gadget *gadget, co
 		break;
 #endif /* DEV_CONFIG_CDC */
 
+#ifdef CONFIG_USB_ETH_RNDIS		
+	/* RNDIS uses the CDC command encapsulation mechanism to implement
+	 * an RPC scheme, with much getting/setting of attributes by OID.
+	 */
+	case CDC_SEND_ENCAPSULATED_COMMAND:
+		if (ctrl->bRequestType != (USB_TYPE_CLASS|USB_RECIP_INTERFACE)
+				|| !dev->rndis
+				|| ctrl->wLength > USB_BUFSIZ
+				|| ctrl->wValue
+				|| rndis_control_intf.bInterfaceNumber
+					!= ctrl->wIndex)
+			break;
+		/* read the request, then process it */
+		value = ctrl->wLength;
+		req->complete = rndis_command_complete;
+		/* later, rndis_control_ack () sends a notification */
+		break;
+		
+	case CDC_GET_ENCAPSULATED_RESPONSE:
+		if ((USB_DIR_IN|USB_TYPE_CLASS|USB_RECIP_INTERFACE)
+					== ctrl->bRequestType
+				&& dev->rndis
+				// && ctrl->wLength >= 0x0400
+				&& !ctrl->wValue
+				&& rndis_control_intf.bInterfaceNumber
+					== ctrl->wIndex) {
+			u8 *buf;
+
+			/* return the result */
+			buf = rndis_get_next_response (dev->rndis_config,
+						       &value);
+			if (buf) {
+				memcpy (req->buf, buf, value);
+				req->complete = rndis_response_complete;
+			}
+		}
+		break;
+#endif	/* RNDIS */
+
 	default:
 		VDEBUG (dev,
 			"unknown control req%02x.%02x v%04x i%04x l%d\n",
@@ -1321,7 +1603,9 @@ static int eth_change_mtu (struct net_de
 {
 	struct eth_dev	*dev = (struct eth_dev *) net->priv;
 
-	if (new_mtu <= MIN_PACKET || new_mtu > MAX_PACKET)
+	// FIXME if rndis, don't change while link's live
+
+	if (new_mtu <= ETH_HLEN || new_mtu > ETH_FRAME_LEN)
 		return -ERANGE;
 	/* no zero-length packet read wanted after mtu-sized packets */
 	if (((new_mtu + sizeof (struct ethhdr)) % dev->in_ep->maxpacket) == 0)
@@ -1351,7 +1635,8 @@ static int eth_ethtool_ioctl (struct net
 		info.cmd = ETHTOOL_GDRVINFO;
 		strlcpy (info.driver, shortname, sizeof info.driver);
 		strlcpy (info.version, DRIVER_VERSION, sizeof info.version);
-		strlcpy (info.fw_version, CHIP, sizeof info.fw_version);
+		strlcpy (info.fw_version, dev->gadget->name,
+			sizeof info.fw_version);
 		strlcpy (info.bus_info, dev->gadget->dev.bus_id,
 			sizeof info.bus_info);
 		if (copy_to_user (useraddr, &info, sizeof (info)))
@@ -1402,7 +1687,27 @@ rx_submit (struct eth_dev *dev, struct u
 	int			retval = -ENOMEM;
 	size_t			size;
 
+	/* Padding up to RX_EXTRA handles minor disagreements with host.
+	 * Normally we use the USB "terminate on short read" convention;
+	 * so allow up to (N*maxpacket)-1, since that memory is normally
+	 * already allocated.  Major loss of synch means -EOVERFLOW; any
+	 * obviously corrupted packets will automatically be discarded. 
+	 *
+	 * RNDIS uses internal framing, and explicitly allows senders to
+	 * pad to end-of-packet.  That's potentially nice for speed,
+	 * but means receivers can't recover synch on their own.
+	 */
 	size = (sizeof (struct ethhdr) + dev->net->mtu + RX_EXTRA);
+	size += dev->out_ep->maxpacket - 1;
+#ifdef CONFIG_USB_ETH_RNDIS
+	if (dev->rndis)
+		size += sizeof (struct rndis_packet_msg_type);
+#endif	
+	size -= size % dev->out_ep->maxpacket;
+#ifdef CONFIG_USB_ETH_RNDIS
+	if (!dev->rndis)
+#endif	
+		size--;
 
 	if ((skb = alloc_skb (size, gfp_flags)) == 0) {
 		DEBUG (dev, "no rx skb\n");
@@ -1439,8 +1744,12 @@ static void rx_complete (struct usb_ep *
 	/* normal completion */
 	case 0:
 		skb_put (skb, req->actual);
-		if (MIN_PACKET > skb->len
-				|| skb->len > (MAX_PACKET + ETH_HLEN)) {
+#ifdef CONFIG_USB_ETH_RNDIS
+		/* we know MaxPacketsPerTransfer == 1 here */
+		if (dev->rndis)
+			rndis_rm_hdr (req->buf, &(skb->len));
+#endif
+		if (ETH_HLEN > skb->len || skb->len > ETH_FRAME_LEN) {
 			dev->stats.rx_errors++;
 			dev->stats.rx_length_errors++;
 			DEBUG (dev, "rx length %d\n", skb->len);
@@ -1637,21 +1946,35 @@ static int eth_start_xmit (struct sk_buf
 
 	/* no buffer copies needed, unless the network stack did it
 	 * or the hardware can't use skb buffers.
+	 * or there's not enough space for any RNDIS headers we need
 	 */
+#ifdef CONFIG_USB_ETH_RNDIS
+	if (dev->rndis) {
+		struct sk_buff	*skb_rndis;
+
+		skb_rndis = skb_realloc_headroom (skb,
+				sizeof (struct rndis_packet_msg_type));
+		if (!skb_rndis)
+			goto drop;
+	
+		dev_kfree_skb_any (skb);
+		skb = skb_rndis;
+		rndis_add_hdr (skb);
+		length = skb->len;
+	}
+#endif
 	req->buf = skb->data;
 	req->context = skb;
 	req->complete = tx_complete;
 
-#ifdef	CONFIG_USB_GADGET_SA1100
-	/* don't demand zlp (req->zero) support from all hardware */
-	if ((length % dev->in_ep->maxpacket) == 0)
-		length++;
-#else
 	/* use zlp framing on tx for strict CDC-Ether conformance,
 	 * though any robust network rx path ignores extra padding.
+	 * and some hardware doesn't like to write zlps.
 	 */
 	req->zero = 1;
-#endif
+	if (!dev->zlp && (length % dev->in_ep->maxpacket) == 0)
+		length++;
+
 	req->length = length;
 
 #ifdef	CONFIG_USB_GADGET_DUALSPEED
@@ -1672,6 +1995,9 @@ static int eth_start_xmit (struct sk_buf
 	}
 
 	if (retval) {
+#ifdef CONFIG_USB_ETH_RNDIS
+drop:
+#endif
 		dev->stats.tx_dropped++;
 		dev_kfree_skb_any (skb);
 		spin_lock_irqsave (&dev->lock, flags);
@@ -1683,6 +2009,71 @@ static int eth_start_xmit (struct sk_buf
 	return 0;
 }
 
+/*-------------------------------------------------------------------------*/
+
+#ifdef CONFIG_USB_ETH_RNDIS
+
+static void rndis_send_media_state (struct eth_dev *dev, int connect)
+{
+	if (!dev)
+		return;
+	
+	if (connect) {
+		if (rndis_signal_connect (dev->rndis_config))
+			return;
+	} else {
+		if (rndis_signal_disconnect (dev->rndis_config))
+			return;
+	}
+}
+
+static int rndis_control_ack (struct net_device *net)
+{
+	struct eth_dev          *dev = (struct eth_dev *) net->priv;
+	u32                     length;
+	struct usb_request      *resp;
+	
+	/* in case RNDIS calls this after disconnect */
+	if (!dev->status_ep) {
+		DEBUG (dev, "status ENODEV\n");
+		return -ENODEV;
+	}
+
+	/* Allocate memory for notification ie. ACK */
+	resp = usb_ep_alloc_request (dev->status_ep, GFP_ATOMIC);
+	if (!resp) {
+		DEBUG (dev, "status ENOMEM\n");
+		return -ENOMEM;
+	}
+	
+	resp->buf = usb_ep_alloc_buffer (dev->status_ep, 8,
+					 &resp->dma, GFP_ATOMIC);
+	if (!resp->buf) {
+		DEBUG (dev, "status buf ENOMEM\n");
+		usb_ep_free_request (dev->status_ep, resp);
+		return -ENOMEM;
+	}
+	
+	/* Send RNDIS RESPONSE_AVAILABLE notification;
+	 * CDC_NOTIFY_RESPONSE_AVAILABLE should work too
+	 */
+	resp->length = 8;
+	resp->complete = rndis_response_complete;
+	
+	*((u32 *) resp->buf) = __constant_cpu_to_le32 (1);
+	*((u32 *) resp->buf + 1) = __constant_cpu_to_le32 (0);
+	
+	length = usb_ep_queue (dev->status_ep, resp, GFP_ATOMIC);
+	if (length < 0) {
+		resp->status = 0;
+		rndis_response_complete (dev->status_ep, resp);
+	}
+	
+	return 0;
+}
+
+#endif	/* RNDIS */
+
 static void eth_start (struct eth_dev *dev, int gfp_flags)
 {
 	DEBUG (dev, "%s\n", __FUNCTION__);
@@ -1693,6 +2084,14 @@ static void eth_start (struct eth_dev *d
 	/* and open the tx floodgates */ 
 	atomic_set (&dev->tx_qlen, 0);
 	netif_wake_queue (dev->net);
+#ifdef CONFIG_USB_ETH_RNDIS
+	if (dev->rndis) {
+		rndis_set_param_medium (dev->rndis_config,
+					NDIS_MEDIUM_802_3,
+					BITRATE(dev->gadget));
+		rndis_send_media_state (dev, 1);
+	}
+#endif	
 }
 
 static int eth_open (struct net_device *net)
@@ -1727,11 +2126,19 @@ static int eth_stop (struct net_device *
 			usb_ep_enable (dev->in_ep, dev->in);
 			usb_ep_enable (dev->out_ep, dev->out);
 		}
-#ifdef	EP_STATUS_NUM
-		usb_ep_disable (dev->status_ep);
-		usb_ep_enable (dev->status_ep, dev->status);
-#endif
+		if (dev->status_ep) {
+			usb_ep_disable (dev->status_ep);
+			usb_ep_enable (dev->status_ep, dev->status);
+		}
+	}
+	
+#ifdef	CONFIG_USB_ETH_RNDIS
+	if (dev->rndis) {
+		rndis_set_param_medium (dev->rndis_config,
+					NDIS_MEDIUM_802_3, 0);
+		rndis_send_media_state (dev, 0);
 	}
+#endif
 
 	return 0;
 }
@@ -1744,6 +2151,10 @@ eth_unbind (struct usb_gadget *gadget)
 	struct eth_dev		*dev = get_gadget_data (gadget);
 
 	DEBUG (dev, "unbind\n");
+#ifdef CONFIG_USB_ETH_RNDIS
+	rndis_deregister (dev->rndis_config);
+	rndis_exit ();
+#endif
 
 	/* we've already been disconnected ... no i/o is active */
 	if (dev->req) {
@@ -1762,30 +2173,183 @@ eth_unbind (struct usb_gadget *gadget)
 	set_gadget_data (gadget, 0);
 }
 
-static int
+static int __init
 eth_bind (struct usb_gadget *gadget)
 {
 	struct eth_dev		*dev;
 	struct net_device	*net;
+	u8			cdc = 1, zlp = 1, rndis = 1;
+	struct usb_ep		*ep;
 	int			status = -ENOMEM;
-#ifdef	DEV_CONFIG_CDC
-	u8			node_id [ETH_ALEN];
 
-	/* just one upstream link at a time */
-	if (ethaddr [0] != 0)
+	/* these flags are only ever cleared; compiler take note */
+#ifndef	DEV_CONFIG_CDC
+	cdc = 0;
+#endif
+#ifndef	CONFIG_USB_ETH_RNDIS
+	rndis = 0;
+#endif
+
+	/* Because most host side USB stacks handle CDC Ethernet, that
+	 * standard protocol is _strongly_ preferred for interop purposes.
+	 * (By everyone except Microsoft.)
+	 */
+	if (gadget_is_net2280 (gadget)) {
+		device_desc.bcdDevice = __constant_cpu_to_le16 (0x0201);
+	} else if (gadget_is_dummy (gadget)) {
+		device_desc.bcdDevice = __constant_cpu_to_le16 (0x0202);
+	} else if (gadget_is_pxa (gadget)) {
+		device_desc.bcdDevice = __constant_cpu_to_le16 (0x0203);
+		/* pxa doesn't support altsettings */
+		cdc = 0;
+	} else if (gadget_is_sh(gadget)) {
+		device_desc.bcdDevice = __constant_cpu_to_le16 (0x0204);
+		/* sh doesn't support multiple interfaces or configs */
+		cdc = 0;
+		rndis = 0;
+	} else if (gadget_is_sa1100 (gadget)) {
+		device_desc.bcdDevice = __constant_cpu_to_le16 (0x0205);
+		/* hardware can't write zlps */
+		zlp = 0;
+		/* sa1100 CAN do CDC, without status endpoint ... we use
+		 * non-CDC to be compatible with ARM Linux-2.4 "usb-eth".
+		 */
+		cdc = 0;
+	} else if (gadget_is_goku (gadget)) {
+		device_desc.bcdDevice = __constant_cpu_to_le16 (0x0206);
+	} else if (gadget_is_mq11xx (gadget)) {
+		device_desc.bcdDevice = __constant_cpu_to_le16 (0x0207);
+	} else if (gadget_is_omap (gadget)) {
+		device_desc.bcdDevice = __constant_cpu_to_le16 (0x0208);
+	} else {
+		/* can't assume CDC works.  don't want to default to
+		 * anything less functional on CDC-capable hardware,
+		 * so we fail in this case.
+		 */
+		dev_err (&gadget->dev,
+			"controller '%s' not recognized\n",
+			gadget->name);
+		return -ENODEV;
+	}
+	snprintf (manufacturer, sizeof manufacturer,
+		UTS_SYSNAME " " UTS_RELEASE "/%s",
+		gadget->name);
+
+	/* CDC subset ... recognized by Linux since 2.4.10, but Windows
+	 * drivers aren't widely available.
+	 */
+	if (!cdc) {
+		device_desc.bDeviceClass = USB_CLASS_VENDOR_SPEC;
+		device_desc.idVendor =
+			__constant_cpu_to_le16(SIMPLE_VENDOR_NUM);
+		device_desc.idProduct =
+			__constant_cpu_to_le16(SIMPLE_PRODUCT_NUM);
+	}
+
+	/* If there's an RNDIS configuration, that's what Windows wants to
+	 * be using ... so use these product IDs here and in the "linux.inf"
+	 * needed to install MSFT drivers.  Current Linux kernels will use
+	 * the second configuration if it's CDC Ethernet, and need some help
+	 * to choose the right configuration otherwise.
+	 */
+	if (rndis) {
+		device_desc.idVendor =
+			__constant_cpu_to_le16(RNDIS_VENDOR_NUM);
+		device_desc.idProduct =
+			__constant_cpu_to_le16(RNDIS_PRODUCT_NUM);
+		snprintf (product_desc, sizeof product_desc,
+			"RNDIS/%s", driver_desc);
+	}
+
+	/* support optional vendor/distro customization */
+	if (idVendor) {
+		if (!idProduct) {
+			dev_err (&gadget->dev, "idVendor needs idProduct!\n");
+			return -ENODEV;
+		}
+		device_desc.idVendor = cpu_to_le16(idVendor);
+		device_desc.idProduct = cpu_to_le16(idProduct);
+		if (bcdDevice)
+			device_desc.bcdDevice = cpu_to_le16(bcdDevice);
+	}
+	if (iManufacturer)
+		strlcpy (manufacturer, iManufacturer, sizeof manufacturer);
+	if (iProduct)
+		strlcpy (product_desc, iProduct, sizeof product_desc);
+
+	/* all we really need is bulk IN/OUT */
+	usb_ep_autoconfig_reset (gadget);
+	ep = usb_ep_autoconfig (gadget, &fs_source_desc);
+	if (!ep) {
+autoconf_fail:
+		dev_err (&gadget->dev,
+			"can't autoconfigure on %s\n",
+			gadget->name);
 		return -ENODEV;
+	}
+	EP_IN_NAME = ep->name;
+	ep->driver_data = ep;	/* claim */
+	
+	ep = usb_ep_autoconfig (gadget, &fs_sink_desc);
+	if (!ep)
+		goto autoconf_fail;
+	EP_OUT_NAME = ep->name;
+	ep->driver_data = ep;	/* claim */
+
+	/* CDC Ethernet control interface doesn't require a status endpoint.
+	 * Since some hosts expect one, try to allocate one anyway.
+	 */
+	if (cdc || rndis) {
+		ep = usb_ep_autoconfig (gadget, &fs_status_desc);
+		if (ep) {
+			EP_STATUS_NAME = ep->name;
+			ep->driver_data = ep;	/* claim */
+		} else if (rndis) {
+			dev_err (&gadget->dev,
+				"can't run RNDIS on %s\n",
+				gadget->name);
+			return -ENODEV;
+#ifdef	DEV_CONFIG_CDC
+		} else if (cdc) {
+			control_intf.bNumEndpoints = 0;
+			/* FIXME remove endpoint from descriptor list */
 #endif
+		}
+	}
+
+	/* one config:  cdc, else minimal subset */
+	if (!cdc) {
+		eth_config.bNumInterfaces = 1;
+		eth_config.iConfiguration = STRING_SUBSET;
+		fs_subset_descriptors();
+		hs_subset_descriptors();
+	}
+
+	/* For now RNDIS is always a second config */
+	if (rndis)
+		device_desc.bNumConfigurations = 2;
 
-	device_desc.bMaxPacketSize0 = gadget->ep0->maxpacket;
 #ifdef	CONFIG_USB_GADGET_DUALSPEED
+	if (rndis)
+		dev_qualifier.bNumConfigurations = 2;
+	else if (!cdc)
+		dev_qualifier.bDeviceClass = USB_CLASS_VENDOR_SPEC;
+
 	/* assumes ep0 uses the same value for both speeds ... */
 	dev_qualifier.bMaxPacketSize0 = device_desc.bMaxPacketSize0;
+
+	/* and that all endpoints are dual-speed */
+	hs_source_desc.bEndpointAddress = fs_source_desc.bEndpointAddress;
+	hs_sink_desc.bEndpointAddress = fs_sink_desc.bEndpointAddress;
+#if defined(DEV_CONFIG_CDC) || defined(CONFIG_USB_ETH_RNDIS)
+	if (EP_STATUS_NAME)
+		hs_status_desc.bEndpointAddress =
+				fs_status_desc.bEndpointAddress;
 #endif
+#endif	/* DUALSPEED */
 
-#ifdef	SELFPOWERED
-	eth_config.bmAttributes |= USB_CONFIG_ATT_SELFPOWERED;
+	device_desc.bMaxPacketSize0 = gadget->ep0->maxpacket;
 	usb_gadget_set_selfpowered (gadget);
-#endif
 
  	net = alloc_etherdev (sizeof *dev);
  	if (!net)
@@ -1800,26 +2364,41 @@ eth_bind (struct usb_gadget *gadget)
 	dev->net = net;
 	SET_MODULE_OWNER (net);
 	strcpy (net->name, "usb%d");
+	dev->cdc = cdc;
+	dev->zlp = zlp;
+
+	/* FIXME make these addresses configurable with module params.
+	 * also the manufacturer and product strings.
+	 */
 
 	/* one random address for the gadget device ... both of these could
 	 * reasonably come from an id prom or a module parameter.
 	 */
-	get_random_bytes (net->dev_addr, ETH_ALEN);
-	net->dev_addr [0] &= 0xfe;	// clear multicast bit
-	net->dev_addr [0] |= 0x02;	// set local assignment bit (IEEE802)
+	random_ether_addr(net->dev_addr);
 
 #ifdef	DEV_CONFIG_CDC
 	/* ... another address for the host, on the other end of the
 	 * link, gets exported through CDC (see CDC spec table 41)
 	 */
-	get_random_bytes (node_id, sizeof node_id);
-	node_id [0] &= 0xfe;	// clear multicast bit
-	node_id [0] |= 0x02;    // set local assignment bit (IEEE802)
-	snprintf (ethaddr, sizeof ethaddr, "%02X%02X%02X%02X%02X%02X",
-		node_id [0], node_id [1], node_id [2],
-		node_id [3], node_id [4], node_id [5]);
+	if (cdc) {
+		u8		node_id [ETH_ALEN];
+
+		random_ether_addr(node_id);
+		snprintf (ethaddr, sizeof ethaddr, "%02X%02X%02X%02X%02X%02X",
+			node_id [0], node_id [1], node_id [2],
+			node_id [3], node_id [4], node_id [5]);
+	}
 #endif
 
+	if (rndis) {
+		status = rndis_init();
+		if (status < 0) {
+			dev_err (&gadget->dev, "can't init RNDIS, %d\n",
+				status);
+			goto fail;
+		}
+	}
+
 	net->change_mtu = eth_change_mtu;
 	net->get_stats = eth_get_stats;
 	net->hard_start_xmit = eth_start_xmit;
@@ -1855,15 +2434,57 @@ eth_bind (struct usb_gadget *gadget)
 
  	// SET_NETDEV_DEV (dev->net, &gadget->dev);
  	status = register_netdev (dev->net);
- 	if (status == 0) {
+	if (status < 0)
+		goto fail1;
+
+	INFO (dev, "%s, version: " DRIVER_VERSION "\n", driver_desc);
+	INFO (dev, "using %s, OUT %s IN %s%s%s\n", gadget->name,
+		EP_OUT_NAME, EP_IN_NAME,
+		EP_STATUS_NAME ? " STATUS " : "",
+		EP_STATUS_NAME ? EP_STATUS_NAME : ""
+		);
+	INFO (dev, "MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+		net->dev_addr [0], net->dev_addr [1],
+		net->dev_addr [2], net->dev_addr [3],
+		net->dev_addr [4], net->dev_addr [5]);
 
-		INFO (dev, "%s, " CHIP ", version: " DRIVER_VERSION "\n",
-				driver_desc);
 #ifdef	DEV_CONFIG_CDC
+	if (cdc)
 		INFO (dev, "CDC host enet %s\n", ethaddr);
 #endif
- 		return status;
+
+#ifdef	CONFIG_USB_ETH_RNDIS
+	if (rndis) {
+		u32	vendorID = 0;
+
+		/* FIXME RNDIS vendor id == "vendor NIC code" == ? */
+		
+		dev->rndis_config = rndis_register (rndis_control_ack);
+		if (dev->rndis_config < 0) {
+fail0:
+			unregister_netdev (dev->net);
+			status = -ENODEV;
+			goto fail;
+		}
+		
+		/* these set up a lot of the OIDs that RNDIS needs */
+		if (rndis_set_param_dev (dev->rndis_config, dev->net,
+					 &dev->stats))
+			goto fail0;
+		if (rndis_set_param_vendor (dev->rndis_config, vendorID,
+					    manufacturer))
+			goto fail0;
+		if (rndis_set_param_medium (dev->rndis_config,
+					    NDIS_MEDIUM_802_3,
+					    0))
+			goto fail0;
+		INFO (dev, "RNDIS ready\n");
 	}
+#endif	
+
+	return status;
+
+fail1:
 	dev_dbg(&gadget->dev, "register_netdev failed, %d\n", status);
 fail:
 	eth_unbind (gadget);
@@ -1894,7 +2515,7 @@ static struct usb_gadget_driver eth_driv
 };
 
 MODULE_DESCRIPTION (DRIVER_DESC);
-MODULE_AUTHOR ("David Brownell");
+MODULE_AUTHOR ("David Brownell, Benedikt Spanger");
 MODULE_LICENSE ("GPL");
 
 
--- diff/drivers/usb/gadget/file_storage.c	2004-02-18 08:54:11.000000000 +0000
+++ source/drivers/usb/gadget/file_storage.c	2004-04-21 10:45:35.046375640 +0100
@@ -239,12 +239,14 @@
 #include <linux/usb_ch9.h>
 #include <linux/usb_gadget.h>
 
+#include "gadget_chips.h"
+
 
 /*-------------------------------------------------------------------------*/
 
 #define DRIVER_DESC		"File-backed Storage Gadget"
 #define DRIVER_NAME		"g_file_storage"
-#define DRIVER_VERSION		"26 January 2004"
+#define DRIVER_VERSION		"21 March 2004"
 
 static const char longname[] = DRIVER_DESC;
 static const char shortname[] = DRIVER_NAME;
@@ -261,165 +263,11 @@ MODULE_LICENSE("Dual BSD/GPL");
 #define DRIVER_PRODUCT_ID	0xa4a5	// Linux-USB File-backed Storage Gadget
 
 
-/*-------------------------------------------------------------------------*/
-
-/*
- * Hardware-specific configuration, controlled by which device
- * controller driver was configured.
- *
- * CHIP ... hardware identifier
- * DRIVER_VERSION_NUM ... alerts the host side driver to differences
- * EP_*_NAME ... which endpoints do we use for which purpose?
- * EP_*_NUM ... numbers for them (often limited by hardware)
- * FS_BULK_IN_MAXPACKET ... maxpacket value for full-speed bulk-in ep
- * FS_BULK_OUT_MAXPACKET ... maxpacket value for full-speed bulk-out ep
- * HIGHSPEED ... define if ep0 and descriptors need high speed support
- * MAX_USB_POWER ... define if we use other than 100 mA bus current
- * SELFPOWER ... if we can run on bus power, zero
- * NO_BULK_STALL ... bulk endpoint halts don't work well so avoid them
- */
-
-
-/*
- * NetChip 2280, PCI based.
- *
- * This has half a dozen configurable endpoints, four with dedicated
- * DMA channels to manage their FIFOs.  It supports high speed.
- * Those endpoints can be arranged in any desired configuration.
- */
-#ifdef	CONFIG_USB_GADGET_NET2280
-#define CHIP			"net2280"
-#define DRIVER_VERSION_NUM	0x0201
-static const char EP_BULK_IN_NAME[] = "ep-a";
-#define EP_BULK_IN_NUM		1
-#define FS_BULK_IN_MAXPACKET	64
-static const char EP_BULK_OUT_NAME[] = "ep-b";
-#define EP_BULK_OUT_NUM		2
-#define FS_BULK_OUT_MAXPACKET	64
-static const char EP_INTR_IN_NAME[] = "ep-e";
-#define EP_INTR_IN_NUM		5
-#define HIGHSPEED
-#endif
-
-
-/*
- * Dummy_hcd, software-based loopback controller.
- *
- * This imitates the abilities of the NetChip 2280, so we will use
- * the same configuration.
- */
-#ifdef	CONFIG_USB_GADGET_DUMMY_HCD
-#define CHIP			"dummy"
-#define DRIVER_VERSION_NUM	0x0202
-static const char EP_BULK_IN_NAME[] = "ep-a";
-#define EP_BULK_IN_NUM		1
-#define FS_BULK_IN_MAXPACKET	64
-static const char EP_BULK_OUT_NAME[] = "ep-b";
-#define EP_BULK_OUT_NUM		2
-#define FS_BULK_OUT_MAXPACKET	64
-static const char EP_INTR_IN_NAME[] = "ep-e";
-#define EP_INTR_IN_NUM		5
-#define HIGHSPEED
-#endif
-
-
-/*
- * PXA-2xx UDC:  widely used in second gen Linux-capable PDAs.
- *
- * This has fifteen fixed-function full speed endpoints, and it
- * can support all USB transfer types.
- *
- * These supports three or four configurations, with fixed numbers.
- * The hardware interprets SET_INTERFACE, net effect is that you
- * can't use altsettings or reset the interfaces independently.
- * So stick to a single interface.
- */
-#ifdef	CONFIG_USB_GADGET_PXA2XX
-#define CHIP			"pxa2xx"
-#define DRIVER_VERSION_NUM	0x0203
-static const char EP_BULK_IN_NAME[] = "ep1in-bulk";
-#define EP_BULK_IN_NUM		1
-#define FS_BULK_IN_MAXPACKET	64
-static const char EP_BULK_OUT_NAME[] = "ep2out-bulk";
-#define EP_BULK_OUT_NUM		2
-#define FS_BULK_OUT_MAXPACKET	64
-static const char EP_INTR_IN_NAME[] = "ep6in-bulk";
-#define EP_INTR_IN_NUM		6
-#endif
-
-
 /*
- * SuperH UDC:  UDC built-in to some Renesas SH processors.
- *
- * This has three fixed-function full speed bulk/interrupt endpoints.
- *
- * Only one configuration and interface is supported (SET_CONFIGURATION
- * and SET_INTERFACE are handled completely by the hardware).
- */
-#ifdef	CONFIG_USB_GADGET_SUPERH
-#define CHIP			"superh"
-#define DRIVER_VERSION_NUM	0x0205
-static const char EP_BULK_IN_NAME[] = "ep2in-bulk";
-#define EP_BULK_IN_NUM		2
-#define FS_BULK_IN_MAXPACKET	64
-static const char EP_BULK_OUT_NAME[] = "ep1out-bulk";
-#define EP_BULK_OUT_NUM		1
-#define FS_BULK_OUT_MAXPACKET	64
-static const char EP_INTR_IN_NAME[] = "ep3in-bulk";
-#define EP_INTR_IN_NUM		3
-#define NO_BULK_STALL
-#endif
-
-
-/*
- * Toshiba TC86C001 ("Goku-S") UDC
- *
- * This has three semi-configurable full speed bulk/interrupt endpoints.
- */
-#ifdef	CONFIG_USB_GADGET_GOKU
-#define CHIP			"goku"
-#define DRIVER_VERSION_NUM	0x0206
-static const char EP_BULK_OUT_NAME [] = "ep1-bulk";
-#define EP_BULK_OUT_NUM		1
-#define FS_BULK_IN_MAXPACKET	64
-static const char EP_BULK_IN_NAME [] = "ep2-bulk";
-#define EP_BULK_IN_NUM		2
-#define FS_BULK_OUT_MAXPACKET	64
-static const char EP_INTR_IN_NAME [] = "ep3-bulk";
-#define EP_INTR_IN_NUM		3
-#endif
-
-
-/*-------------------------------------------------------------------------*/
-
-#ifndef CHIP
-#	error Configure some USB peripheral controller driver!
-#endif
-
-/* Power usage is config specific.
- * Hardware that supports remote wakeup defaults to disabling it.
+ * This driver assumes self-powered hardware and has no way for users to
+ * trigger remote wakeup.  It uses autoconfiguration to select endpoints
+ * and endpoint addresses.
  */
-#ifndef	SELFPOWER
-/* default: say we're self-powered */
-#define SELFPOWER USB_CONFIG_ATT_SELFPOWER
-/* else:
- * - SELFPOWER value must be zero
- * - MAX_USB_POWER may be nonzero.
- */
-#endif
-
-#ifndef	MAX_USB_POWER
-/* Any hub supports this steady state bus power consumption */
-#define MAX_USB_POWER	100	/* mA */
-#endif
-
-/* We don't support remote wake-up */
-
-#ifdef NO_BULK_STALL
-#define CAN_STALL	0
-#else
-#define CAN_STALL	1
-#endif
 
 
 /*-------------------------------------------------------------------------*/
@@ -511,9 +359,9 @@ static struct {
 	.removable		= 0,
 	.vendor			= DRIVER_VENDOR_ID,
 	.product		= DRIVER_PRODUCT_ID,
-	.release		= DRIVER_VERSION_NUM,
+	.release		= 0xffff,	// Use controller chip type
 	.buflen			= 16384,
-	.can_stall		= CAN_STALL,
+	.can_stall		= 1,
 	};
 
 
@@ -1002,7 +850,7 @@ device_desc = {
 	/* The next three values can be overridden by module parameters */
 	.idVendor =		__constant_cpu_to_le16(DRIVER_VENDOR_ID),
 	.idProduct =		__constant_cpu_to_le16(DRIVER_PRODUCT_ID),
-	.bcdDevice =		__constant_cpu_to_le16(DRIVER_VERSION_NUM),
+	.bcdDevice =		__constant_cpu_to_le16(0xffff),
 
 	.iManufacturer =	STRING_MANUFACTURER,
 	.iProduct =		STRING_PRODUCT,
@@ -1015,11 +863,11 @@ config_desc = {
 	.bLength =		sizeof config_desc,
 	.bDescriptorType =	USB_DT_CONFIG,
 
-	/* wTotalLength adjusted during bind() */
+	/* wTotalLength computed by usb_gadget_config_buf() */
 	.bNumInterfaces =	1,
 	.bConfigurationValue =	CONFIG_VALUE,
-	.bmAttributes =		USB_CONFIG_ATT_ONE | SELFPOWER,
-	.bMaxPower =		(MAX_USB_POWER + 1) / 2,
+	.bmAttributes =		USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER,
+	.bMaxPower =		1,	// self-powered
 };
 
 /* There is only one interface. */
@@ -1029,47 +877,56 @@ intf_desc = {
 	.bLength =		sizeof intf_desc,
 	.bDescriptorType =	USB_DT_INTERFACE,
 
-	.bNumEndpoints =	2,		// Adjusted during bind()
+	.bNumEndpoints =	2,		// Adjusted during fsg_bind()
 	.bInterfaceClass =	USB_CLASS_MASS_STORAGE,
-	.bInterfaceSubClass =	USB_SC_SCSI,	// Adjusted during bind()
-	.bInterfaceProtocol =	USB_PR_BULK,	// Adjusted during bind()
+	.bInterfaceSubClass =	USB_SC_SCSI,	// Adjusted during fsg_bind()
+	.bInterfaceProtocol =	USB_PR_BULK,	// Adjusted during fsg_bind()
 };
 
 /* Three full-speed endpoint descriptors: bulk-in, bulk-out,
  * and interrupt-in. */
 
-static const struct usb_endpoint_descriptor
+static struct usb_endpoint_descriptor
 fs_bulk_in_desc = {
 	.bLength =		USB_DT_ENDPOINT_SIZE,
 	.bDescriptorType =	USB_DT_ENDPOINT,
 
-	.bEndpointAddress =	EP_BULK_IN_NUM | USB_DIR_IN,
+	.bEndpointAddress =	USB_DIR_IN,
 	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
-	.wMaxPacketSize =	__constant_cpu_to_le16(FS_BULK_IN_MAXPACKET),
+	/* wMaxPacketSize set by autoconfiguration */
 };
 
-static const struct usb_endpoint_descriptor
+static struct usb_endpoint_descriptor
 fs_bulk_out_desc = {
 	.bLength =		USB_DT_ENDPOINT_SIZE,
 	.bDescriptorType =	USB_DT_ENDPOINT,
 
-	.bEndpointAddress =	EP_BULK_OUT_NUM,
+	.bEndpointAddress =	USB_DIR_OUT,
 	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
-	.wMaxPacketSize =	__constant_cpu_to_le16(FS_BULK_OUT_MAXPACKET),
+	/* wMaxPacketSize set by autoconfiguration */
 };
 
-static const struct usb_endpoint_descriptor
+static struct usb_endpoint_descriptor
 fs_intr_in_desc = {
 	.bLength =		USB_DT_ENDPOINT_SIZE,
 	.bDescriptorType =	USB_DT_ENDPOINT,
 
-	.bEndpointAddress =	EP_INTR_IN_NUM | USB_DIR_IN,
+	.bEndpointAddress =	USB_DIR_IN,
 	.bmAttributes =		USB_ENDPOINT_XFER_INT,
 	.wMaxPacketSize =	__constant_cpu_to_le16(2),
 	.bInterval =		32,	// frames -> 32 ms
 };
 
-#ifdef	HIGHSPEED
+static const struct usb_descriptor_header *fs_function[] = {
+	(struct usb_descriptor_header *) &intf_desc,
+	(struct usb_descriptor_header *) &fs_bulk_in_desc,
+	(struct usb_descriptor_header *) &fs_bulk_out_desc,
+	(struct usb_descriptor_header *) &fs_intr_in_desc,
+	NULL,
+};
+
+
+#ifdef	CONFIG_USB_GADGET_DUALSPEED
 
 /*
  * USB 2.0 devices need to expose both high speed and full speed
@@ -1079,47 +936,55 @@ fs_intr_in_desc = {
  * and a "device qualifier" ... plus more construction options
  * for the config descriptor.
  */
-static const struct usb_endpoint_descriptor
+static struct usb_qualifier_descriptor
+dev_qualifier = {
+	.bLength =		sizeof dev_qualifier,
+	.bDescriptorType =	USB_DT_DEVICE_QUALIFIER,
+
+	.bcdUSB =		__constant_cpu_to_le16(0x0200),
+	.bDeviceClass =		USB_CLASS_PER_INTERFACE,
+
+	.bNumConfigurations =	1,
+};
+
+static struct usb_endpoint_descriptor
 hs_bulk_in_desc = {
 	.bLength =		USB_DT_ENDPOINT_SIZE,
 	.bDescriptorType =	USB_DT_ENDPOINT,
 
-	.bEndpointAddress =	EP_BULK_IN_NUM | USB_DIR_IN,
+	/* bEndpointAddress copied from fs_bulk_in_desc during fsg_bind() */
 	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
 	.wMaxPacketSize =	__constant_cpu_to_le16(512),
 };
 
-static const struct usb_endpoint_descriptor
+static struct usb_endpoint_descriptor
 hs_bulk_out_desc = {
 	.bLength =		USB_DT_ENDPOINT_SIZE,
 	.bDescriptorType =	USB_DT_ENDPOINT,
 
-	.bEndpointAddress =	EP_BULK_OUT_NUM,
+	/* bEndpointAddress copied from fs_bulk_out_desc during fsg_bind() */
 	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
 	.wMaxPacketSize =	__constant_cpu_to_le16(512),
 	.bInterval =		1,	// NAK every 1 uframe
 };
 
-static const struct usb_endpoint_descriptor
+static struct usb_endpoint_descriptor
 hs_intr_in_desc = {
 	.bLength =		USB_DT_ENDPOINT_SIZE,
 	.bDescriptorType =	USB_DT_ENDPOINT,
 
-	.bEndpointAddress =	EP_INTR_IN_NUM | USB_DIR_IN,
+	/* bEndpointAddress copied from fs_intr_in_desc during fsg_bind() */
 	.bmAttributes =		USB_ENDPOINT_XFER_INT,
 	.wMaxPacketSize =	__constant_cpu_to_le16(2),
 	.bInterval =		9,	// 2**(9-1) = 256 uframes -> 32 ms
 };
 
-static struct usb_qualifier_descriptor
-dev_qualifier = {
-	.bLength =		sizeof dev_qualifier,
-	.bDescriptorType =	USB_DT_DEVICE_QUALIFIER,
-
-	.bcdUSB =		__constant_cpu_to_le16(0x0200),
-	.bDeviceClass =		USB_CLASS_PER_INTERFACE,
-
-	.bNumConfigurations =	1,
+static const struct usb_descriptor_header *hs_function[] = {
+	(struct usb_descriptor_header *) &intf_desc,
+	(struct usb_descriptor_header *) &hs_bulk_in_desc,
+	(struct usb_descriptor_header *) &hs_bulk_out_desc,
+	(struct usb_descriptor_header *) &hs_intr_in_desc,
+	NULL,
 };
 
 /* Maxpacket and other transfer characteristics vary by speed. */
@@ -1127,22 +992,23 @@ dev_qualifier = {
 
 #else
 
-/* If there's no high speed support, maxpacket doesn't change. */
+/* If there's no high speed support, always use the full-speed descriptor. */
 #define ep_desc(g,fs,hs)	fs
 
-#endif	/* !HIGHSPEED */
+#endif	/* !CONFIG_USB_GADGET_DUALSPEED */
 
 
 /* The CBI specification limits the serial string to 12 uppercase hexadecimal
  * characters. */
+static char				manufacturer[40];
 static char				serial[13];
 
-/* Static strings, in ISO 8859/1 */
+/* Static strings, in UTF-8 (for simplicity we use only ASCII characters) */
 static struct usb_string		strings[] = {
-	{ STRING_MANUFACTURER, UTS_SYSNAME " " UTS_RELEASE " with " CHIP, },
-	{ STRING_PRODUCT, longname, },
-	{ STRING_SERIAL, serial, },
-	{ }			// end of list
+	{STRING_MANUFACTURER,	manufacturer},
+	{STRING_PRODUCT,	longname},
+	{STRING_SERIAL,		serial},
+	{}
 };
 
 static struct usb_gadget_strings	stringtab = {
@@ -1152,61 +1018,33 @@ static struct usb_gadget_strings	stringt
 
 
 /*
- * Config descriptors are handcrafted.  They must agree with the code
- * that sets configurations and with code managing interfaces and their
- * altsettings.  They must also handle different speeds and other-speed
- * requests.
+ * Config descriptors must agree with the code that sets configurations
+ * and with code managing interfaces and their altsettings.  They must
+ * also handle different speeds and other-speed requests.
  */
 static int populate_config_buf(enum usb_device_speed speed,
-		u8 *buf0, u8 type, unsigned index)
+		u8 *buf, u8 type, unsigned index)
 {
-	u8	*buf = buf0;
-#ifdef HIGHSPEED
-	int	hs;
-#endif
+	int					len;
+	const struct usb_descriptor_header	**function;
 
 	if (index > 0)
 		return -EINVAL;
-	if (config_desc.wTotalLength  > EP0_BUFSIZE)
-		return -EDOM;
 
-	/* Config (or other speed config) */
-	memcpy(buf, &config_desc, USB_DT_CONFIG_SIZE);
-	buf[1] = type;
-	buf += USB_DT_CONFIG_SIZE;
-
-	/* Interface */
-	memcpy(buf, &intf_desc, USB_DT_INTERFACE_SIZE);
-	buf += USB_DT_INTERFACE_SIZE;
-
-	/* The endpoints in the interface (at that speed) */
-#ifdef HIGHSPEED
-	hs = (speed == USB_SPEED_HIGH);
+#ifdef CONFIG_USB_GADGET_DUALSPEED
 	if (type == USB_DT_OTHER_SPEED_CONFIG)
-		hs = !hs;
-	if (hs) {
-		memcpy(buf, &hs_bulk_in_desc, USB_DT_ENDPOINT_SIZE);
-		buf += USB_DT_ENDPOINT_SIZE;
-		memcpy(buf, &hs_bulk_out_desc, USB_DT_ENDPOINT_SIZE);
-		buf += USB_DT_ENDPOINT_SIZE;
-		if (transport_is_cbi()) {
-			memcpy(buf, &hs_intr_in_desc, USB_DT_ENDPOINT_SIZE);
-			buf += USB_DT_ENDPOINT_SIZE;
-		}
-	} else
+		speed = (USB_SPEED_FULL + USB_SPEED_HIGH) - speed;
+	if (speed == USB_SPEED_HIGH)
+		function = hs_function;
+	else
 #endif
-	{
-		memcpy(buf, &fs_bulk_in_desc, USB_DT_ENDPOINT_SIZE);
-		buf += USB_DT_ENDPOINT_SIZE;
-		memcpy(buf, &fs_bulk_out_desc, USB_DT_ENDPOINT_SIZE);
-		buf += USB_DT_ENDPOINT_SIZE;
-		if (transport_is_cbi()) {
-			memcpy(buf, &fs_intr_in_desc, USB_DT_ENDPOINT_SIZE);
-			buf += USB_DT_ENDPOINT_SIZE;
-		}
-	}
+		function = fs_function;
 
-	return buf - buf0;
+	len = usb_gadget_config_buf(&config_desc, buf, EP0_BUFSIZE, function);
+	if (len < 0)
+		return len;
+	((struct usb_config_descriptor *) buf)->bDescriptorType = type;
+	return len;
 }
 
 
@@ -1505,22 +1343,26 @@ static int standard_setup_req(struct fsg
 			value = min(ctrl->wLength, (u16) sizeof device_desc);
 			memcpy(req->buf, &device_desc, value);
 			break;
-#ifdef HIGHSPEED
+#ifdef CONFIG_USB_GADGET_DUALSPEED
 		case USB_DT_DEVICE_QUALIFIER:
 			VDBG(fsg, "get device qualifier\n");
+			if (!fsg->gadget->is_dualspeed)
+				break;
 			value = min(ctrl->wLength, (u16) sizeof dev_qualifier);
 			memcpy(req->buf, &dev_qualifier, value);
 			break;
 
 		case USB_DT_OTHER_SPEED_CONFIG:
 			VDBG(fsg, "get other-speed config descriptor\n");
+			if (!fsg->gadget->is_dualspeed)
+				break;
 			goto get_config;
-#endif /* HIGHSPEED */
+#endif
 		case USB_DT_CONFIG:
 			VDBG(fsg, "get configuration descriptor\n");
-#ifdef HIGHSPEED
+#ifdef CONFIG_USB_GADGET_DUALSPEED
 		get_config:
-#endif /* HIGHSPEED */
+#endif
 			value = populate_config_buf(fsg->gadget->speed,
 					req->buf,
 					ctrl->wValue >> 8,
@@ -2164,7 +2006,7 @@ static int do_inquiry(struct fsg_dev *fs
 	buf[4] = 31;		// Additional length
 				// No special options
 	sprintf(buf + 8, "%-8s%-16s%04x", vendor_id, product_id,
-			DRIVER_VERSION_NUM);
+			mod_data.release);
 	return 36;
 }
 
@@ -3258,6 +3100,7 @@ reset:
 	if ((rc = enable_endpoint(fsg, fsg->bulk_out, d)) != 0)
 		goto reset;
 	fsg->bulk_out_enabled = 1;
+	fsg->bulk_out_maxpacket = d->wMaxPacketSize;
 
 	if (transport_is_cbi()) {
 		d = ep_desc(fsg->gadget, &fs_intr_in_desc, &hs_intr_in_desc);
@@ -3842,6 +3685,34 @@ static int __init check_parameters(struc
 	mod_data.protocol_type = USB_SC_SCSI;
 	mod_data.protocol_name = "Transparent SCSI";
 
+	if (gadget_is_sh(fsg->gadget))
+		mod_data.can_stall = 0;
+
+	if (mod_data.release == 0xffff) {	// Parameter wasn't set
+		if (gadget_is_net2280(fsg->gadget))
+			mod_data.release = __constant_cpu_to_le16(0x0301);
+		else if (gadget_is_dummy(fsg->gadget))
+			mod_data.release = __constant_cpu_to_le16(0x0302);
+		else if (gadget_is_pxa(fsg->gadget))
+			mod_data.release = __constant_cpu_to_le16(0x0303);
+		else if (gadget_is_sh(fsg->gadget))
+			mod_data.release = __constant_cpu_to_le16(0x0304);
+
+		/* The sa1100 controller is not supported */
+
+		else if (gadget_is_goku(fsg->gadget))
+			mod_data.release = __constant_cpu_to_le16(0x0306);
+		else if (gadget_is_mq11xx(fsg->gadget))
+			mod_data.release = __constant_cpu_to_le16(0x0307);
+		else if (gadget_is_omap(fsg->gadget))
+			mod_data.release = __constant_cpu_to_le16(0x0308);
+		else {
+			WARN(fsg, "controller '%s' not recognized\n",
+				fsg->gadget->name);
+			mod_data.release = __constant_cpu_to_le16(0x0399);
+		}
+	}
+
 	prot = simple_strtol(mod_data.protocol_parm, NULL, 0);
 
 #ifdef CONFIG_USB_FILE_STORAGE_TEST
@@ -3854,7 +3725,7 @@ static int __init check_parameters(struc
 		mod_data.transport_type = USB_PR_CBI;
 		mod_data.transport_name = "Control-Bulk-Interrupt";
 	} else {
-		INFO(fsg, "invalid transport: %s\n", mod_data.transport_parm);
+		ERROR(fsg, "invalid transport: %s\n", mod_data.transport_parm);
 		return -EINVAL;
 	}
 
@@ -3883,13 +3754,13 @@ static int __init check_parameters(struc
 		mod_data.protocol_type = USB_SC_8070;
 		mod_data.protocol_name = "8070i";
 	} else {
-		INFO(fsg, "invalid protocol: %s\n", mod_data.protocol_parm);
+		ERROR(fsg, "invalid protocol: %s\n", mod_data.protocol_parm);
 		return -EINVAL;
 	}
 
 	mod_data.buflen &= PAGE_CACHE_MASK;
 	if (mod_data.buflen <= 0) {
-		INFO(fsg, "invalid buflen\n");
+		ERROR(fsg, "invalid buflen\n");
 		return -ETOOSMALL;
 	}
 #endif /* CONFIG_USB_FILE_STORAGE_TEST */
@@ -3927,7 +3798,7 @@ static int __init fsg_bind(struct usb_ga
 	if (i == 0)
 		i = max(mod_data.num_filenames, 1);
 	if (i > MAX_LUNS) {
-		INFO(fsg, "invalid number of LUNs: %d\n", i);
+		ERROR(fsg, "invalid number of LUNs: %d\n", i);
 		rc = -EINVAL;
 		goto out;
 	}
@@ -3956,45 +3827,56 @@ static int __init fsg_bind(struct usb_ga
 			if ((rc = open_backing_file(curlun, file[i])) != 0)
 				goto out;
 		} else if (!mod_data.removable) {
-			INFO(fsg, "no file given for LUN%d\n", i);
+			ERROR(fsg, "no file given for LUN%d\n", i);
 			rc = -EINVAL;
 			goto out;
 		}
 	}
 
+	/* Find all the endpoints we will use */
+	ep = usb_ep_autoconfig(gadget, &fs_bulk_in_desc);
+	if (!ep)
+		goto autoconf_fail;
+	ep->driver_data = fsg;		// claim the endpoint
+	fsg->bulk_in = ep;
+
+	ep = usb_ep_autoconfig(gadget, &fs_bulk_out_desc);
+	if (!ep)
+		goto autoconf_fail;
+	ep->driver_data = fsg;		// claim the endpoint
+	fsg->bulk_out = ep;
+
+	if (transport_is_cbi()) {
+		ep = usb_ep_autoconfig(gadget, &fs_intr_in_desc);
+		if (!ep)
+			goto autoconf_fail;
+		ep->driver_data = fsg;		// claim the endpoint
+		fsg->intr_in = ep;
+	}
+
 	/* Fix up the descriptors */
 	device_desc.bMaxPacketSize0 = fsg->ep0->maxpacket;
-#ifdef HIGHSPEED
-	dev_qualifier.bMaxPacketSize0 = fsg->ep0->maxpacket;		// ???
-#endif
 	device_desc.idVendor = cpu_to_le16(mod_data.vendor);
 	device_desc.idProduct = cpu_to_le16(mod_data.product);
 	device_desc.bcdDevice = cpu_to_le16(mod_data.release);
 
 	i = (transport_is_cbi() ? 3 : 2);	// Number of endpoints
-	config_desc.wTotalLength = USB_DT_CONFIG_SIZE + USB_DT_INTERFACE_SIZE
-			+ USB_DT_ENDPOINT_SIZE * i;
 	intf_desc.bNumEndpoints = i;
 	intf_desc.bInterfaceSubClass = mod_data.protocol_type;
 	intf_desc.bInterfaceProtocol = mod_data.transport_type;
+	fs_function[i+1] = NULL;
 
-	/* Find all the endpoints we will use */
-	gadget_for_each_ep(ep, gadget) {
-		if (strcmp(ep->name, EP_BULK_IN_NAME) == 0)
-			fsg->bulk_in = ep;
-		else if (strcmp(ep->name, EP_BULK_OUT_NAME) == 0)
-			fsg->bulk_out = ep;
-		else if (strcmp(ep->name, EP_INTR_IN_NAME) == 0)
-			fsg->intr_in = ep;
-	}
-	if (!fsg->bulk_in || !fsg->bulk_out ||
-			(transport_is_cbi() && !fsg->intr_in)) {
-		DBG(fsg, "unable to find all endpoints\n");
-		rc = -ENOTSUPP;
-		goto out;
-	}
-	fsg->bulk_out_maxpacket = (gadget->speed == USB_SPEED_HIGH ? 512 :
-			FS_BULK_OUT_MAXPACKET);
+#ifdef CONFIG_USB_GADGET_DUALSPEED
+	hs_function[i+1] = NULL;
+
+	/* Assume ep0 uses the same maxpacket value for both speeds */
+	dev_qualifier.bMaxPacketSize0 = fsg->ep0->maxpacket;
+
+	/* Assume that all endpoint addresses are the same for both speeds */
+	hs_bulk_in_desc.bEndpointAddress = fs_bulk_in_desc.bEndpointAddress;
+	hs_bulk_out_desc.bEndpointAddress = fs_bulk_out_desc.bEndpointAddress;
+	hs_intr_in_desc.bEndpointAddress = fs_intr_in_desc.bEndpointAddress;
+#endif
 
 	rc = -ENOMEM;
 
@@ -4023,6 +3905,10 @@ static int __init fsg_bind(struct usb_ga
 	/* This should reflect the actual gadget power source */
 	usb_gadget_set_selfpowered(gadget);
 
+	snprintf(manufacturer, sizeof manufacturer,
+			UTS_SYSNAME " " UTS_RELEASE " with %s",
+			gadget->name);
+
 	/* On a real device, serial[] would be loaded from permanent
 	 * storage.  We just encode it from the driver version string. */
 	for (i = 0; i < sizeof(serial) - 2; i += 2) {
@@ -4071,6 +3957,10 @@ static int __init fsg_bind(struct usb_ga
 	DBG(fsg, "I/O thread pid: %d\n", fsg->thread_pid);
 	return 0;
 
+autoconf_fail:
+	ERROR(fsg, "unable to autoconfigure all endpoints\n");
+	rc = -ENOTSUPP;
+
 out:
 	fsg->state = FSG_STATE_TERMINATED;	// The thread is dead
 	fsg_unbind(gadget);
@@ -4082,7 +3972,7 @@ out:
 /*-------------------------------------------------------------------------*/
 
 static struct usb_gadget_driver		fsg_driver = {
-#ifdef HIGHSPEED
+#ifdef CONFIG_USB_GADGET_DUALSPEED
 	.speed		= USB_SPEED_HIGH,
 #else
 	.speed		= USB_SPEED_FULL,
--- diff/drivers/usb/gadget/gadget_chips.h	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/gadget/gadget_chips.h	2004-04-21 10:45:35.047375488 +0100
@@ -14,6 +14,12 @@
 #define	gadget_is_net2280(g)	0
 #endif
 
+#ifdef CONFIG_USB_GADGET_DUMMY_HCD
+#define	gadget_is_dummy(g)	!strcmp("dummy_udc", (g)->name)
+#else
+#define	gadget_is_dummy(g)	0
+#endif
+
 #ifdef CONFIG_USB_GADGET_PXA
 #define	gadget_is_pxa(g)	!strcmp("pxa2xx_udc", (g)->name)
 #else
--- diff/drivers/usb/gadget/goku_udc.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/usb/gadget/goku_udc.c	2004-04-21 10:45:35.048375336 +0100
@@ -1562,8 +1562,7 @@ static void ep0_setup(struct goku_udc *d
 					if (dev->ep[tmp].is_in)
 						goto stall;
 				}
-				/* endpoint halt */
-				if (ctrl.wValue != 0)
+				if (ctrl.wValue != USB_ENDPOINT_HALT)
 					goto stall;
 				if (tmp)
 					goku_clear_halt(&dev->ep[tmp]);
--- diff/drivers/usb/gadget/net2280.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/gadget/net2280.c	2004-04-21 10:45:35.050375032 +0100
@@ -2401,7 +2401,7 @@ static void handle_stat0_irqs (struct ne
 			/* hw handles device features */
 			if (u.r.bRequestType != USB_RECIP_ENDPOINT)
 				goto delegate;
-			if (u.r.wValue != 0 /* HALT feature */
+			if (u.r.wValue != USB_ENDPOINT_HALT
 					|| u.r.wLength != 0)
 				goto do_stall;
 			if ((e = get_ep_by_addr (dev, u.r.wIndex)) == 0)
@@ -2418,7 +2418,7 @@ static void handle_stat0_irqs (struct ne
 			/* hw handles device features */
 			if (u.r.bRequestType != USB_RECIP_ENDPOINT)
 				goto delegate;
-			if (u.r.wValue != 0 /* HALT feature */
+			if (u.r.wValue != USB_ENDPOINT_HALT
 					|| u.r.wLength != 0)
 				goto do_stall;
 			if ((e = get_ep_by_addr (dev, u.r.wIndex)) == 0)
--- diff/drivers/usb/gadget/pxa2xx_udc.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/usb/gadget/pxa2xx_udc.c	2004-04-21 10:45:35.051374880 +0100
@@ -94,7 +94,7 @@ static const char ep0name [] = "ep0";
 #define	UDC_PROC_FILE
 #endif
 
-#ifdef CONFIG_ARCH_IXP425
+#ifdef CONFIG_ARCH_IXP4XX
 #undef USE_DMA
 
 /* cpu-specific register addresses are compiled in to this code */
@@ -2374,8 +2374,8 @@ static struct pxa2xx_udc memory = {
 #if	defined(CONFIG_ARCH_PXA)
 #define CP15R0_XSCALE_VALUE	0x69052000	/* intel/arm/xscale */
 
-#elif	defined(CONFIG_ARCH_IXP425)
-#define CP15R0_XSCALE_VALUE	0x69054000	/* intel/arm/ixp425 */
+#elif	defined(CONFIG_ARCH_IXP4XX)
+#define CP15R0_XSCALE_VALUE	0x69054000	/* intel/arm/ixp4xx */
 
 #endif
 
@@ -2434,7 +2434,7 @@ static int __init pxa2xx_udc_probe(struc
 		/* fall through */
 	case PXA250_C0: case PXA210_C0:
 		break;
-#elif	defined(CONFIG_ARCH_IXP425)
+#elif	defined(CONFIG_ARCH_IXP4XX)
 	case IXP425_A0:
 		out_dma = 0;
 		break;
--- diff/drivers/usb/gadget/serial.c	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/usb/gadget/serial.c	2004-04-21 10:45:35.054374424 +0100
@@ -207,6 +207,27 @@ static inline void hw_optimize(struct us
 
 
 /*
+ * Dummy_hcd, software-based loopback controller.
+ *
+ * This imitates the abilities of the NetChip 2280, so we will use
+ * the same configuration.
+ */
+#ifdef	CONFIG_USB_GADGET_DUMMY_HCD
+#define CHIP				"dummy"
+#define EP0_MAXPACKET			64
+static const char EP_OUT_NAME[] =	"ep-a";
+#define EP_OUT_NUM			2
+static const char EP_IN_NAME[] =	"ep-b";
+#define EP_IN_NUM			2
+#define HIGHSPEED
+#define SELFPOWER			USB_CONFIG_ATT_SELFPOWER
+
+/* no hw optimizations to apply */
+#define hw_optimize(g)			do {} while (0)
+#endif
+
+
+/*
  * PXA-2xx UDC:  widely used in second gen Linux-capable PDAs.
  *
  * This has fifteen fixed-function full speed endpoints, and it
--- diff/drivers/usb/gadget/usbstring.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/gadget/usbstring.c	2004-04-21 10:45:35.054374424 +0100
@@ -12,6 +12,7 @@
 #include <linux/list.h>
 #include <linux/string.h>
 #include <linux/device.h>
+#include <linux/init.h>
 
 #include <linux/usb_ch9.h>
 #include <linux/usb_gadget.h>
--- diff/drivers/usb/gadget/zero.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/gadget/zero.c	2004-04-21 10:45:35.056374120 +0100
@@ -89,10 +89,12 @@
 #include <linux/usb_ch9.h>
 #include <linux/usb_gadget.h>
 
+#include "gadget_chips.h"
+
 
 /*-------------------------------------------------------------------------*/
 
-#define DRIVER_VERSION		"Bastille Day 2003"
+#define DRIVER_VERSION		"St Patrick's Day 2004"
 
 static const char shortname [] = "zero";
 static const char longname [] = "Gadget Zero";
@@ -105,100 +107,12 @@ static const char loopback [] = "loop in
 /*
  * driver assumes self-powered hardware, and
  * has no way for users to trigger remote wakeup.
- */
-
-/*
- * hardware-specific configuration, controlled by which device
- * controller driver was configured.
- *
- * CHIP ... hardware identifier
- * DRIVER_VERSION_NUM ... alerts the host side driver to differences
- * EP_*_NAME ... which endpoints do we use for which purpose?
- * EP_*_NUM ... numbers for them (often limited by hardware)
- *
- * add other defines for other portability issues, like hardware that
- * for some reason doesn't handle full speed bulk maxpacket of 64.
- */
-
-/*
- * DRIVER_VERSION_NUM 0x0000 (?):  Martin Diehl's ezusb an21/fx code
- */
-
-/*
- * NetChip 2280, PCI based.
- *
- * This has half a dozen configurable endpoints, four with dedicated
- * DMA channels to manage their FIFOs.  It supports high speed.
- * Those endpoints can be arranged in any desired configuration.
- */
-#if defined(CONFIG_USB_GADGET_NET2280) || defined(CONFIG_USB_GADGET_DUMMY_HCD)
-#define CHIP			"net2280"
-#define DRIVER_VERSION_NUM	0x0101
-static const char EP_OUT_NAME [] = "ep-a";
-#define EP_OUT_NUM	2
-static const char EP_IN_NAME [] = "ep-b";
-#define EP_IN_NUM	2
-#endif
-
-/*
- * PXA-2xx UDC:  widely used in second gen Linux-capable PDAs.
  *
- * This has fifteen fixed-function full speed endpoints, and it
- * can support all USB transfer types.
- *
- * These supports three or four configurations, with fixed numbers.
- * The hardware interprets SET_INTERFACE, net effect is that you
- * can't use altsettings or reset the interfaces independently.
- * So stick to a single interface.
+ * this version autoconfigures as much as possible,
+ * which is reasonable for most "bulk-only" drivers.
  */
-#ifdef	CONFIG_USB_GADGET_PXA2XX
-#define CHIP			"pxa2xx"
-#define DRIVER_VERSION_NUM	0x0103
-static const char EP_OUT_NAME [] = "ep12out-bulk";
-#define EP_OUT_NUM	12
-static const char EP_IN_NAME [] = "ep11in-bulk";
-#define EP_IN_NUM	11
-#endif
-
-/*
- * SA-1100 UDC:  widely used in first gen Linux-capable PDAs.
- *
- * This has only two fixed function endpoints, which can only
- * be used for bulk (or interrupt) transfers.  (Plus control.)
- *
- * Since it can't flush its TX fifos without disabling the UDC,
- * the current configuration or altsettings can't change except
- * in special situations.  So this is a case of "choose it right
- * during enumeration" ...
- */
-#ifdef	CONFIG_USB_GADGET_SA1100
-#define CHIP			"sa1100"
-#define DRIVER_VERSION_NUM	0x0105
-static const char EP_OUT_NAME [] = "ep1out-bulk";
-#define EP_OUT_NUM	1
-static const char EP_IN_NAME [] = "ep2in-bulk";
-#define EP_IN_NUM	2
-#endif
-
-/*
- * Toshiba TC86C001 ("Goku-S") UDC
- *
- * This has three semi-configurable full speed bulk/interrupt endpoints.
- */
-#ifdef	CONFIG_USB_GADGET_GOKU
-#define CHIP			"goku"
-#define DRIVER_VERSION_NUM	0x0106
-static const char EP_OUT_NAME [] = "ep1-bulk";
-#define EP_OUT_NUM	1
-static const char EP_IN_NAME [] = "ep2-bulk";
-#define EP_IN_NUM	2
-#endif
-
-/*-------------------------------------------------------------------------*/
-
-#ifndef EP_OUT_NUM
-#	error Configure some USB peripheral controller driver!
-#endif
+static const char *EP_IN_NAME;		/* source */
+static const char *EP_OUT_NAME;		/* sink */
 
 /*-------------------------------------------------------------------------*/
 
@@ -222,20 +136,19 @@ struct zero_dev {
 	dev_printk(level , &(d)->gadget->dev , fmt , ## args)
 
 #ifdef DEBUG
-#undef DEBUG
-#define DEBUG(dev,fmt,args...) \
+#define DBG(dev,fmt,args...) \
 	xprintk(dev , KERN_DEBUG , fmt , ## args)
 #else
-#define DEBUG(dev,fmt,args...) \
+#define DBG(dev,fmt,args...) \
 	do { } while (0)
 #endif /* DEBUG */
 
 #ifdef VERBOSE
-#define VDEBUG	DEBUG
+#define VDBG	DBG
 #else
-#define VDEBUG(dev,fmt,args...) \
+#define VDBG(dev,fmt,args...) \
 	do { } while (0)
-#endif /* DEBUG */
+#endif /* VERBOSE */
 
 #define ERROR(dev,fmt,args...) \
 	xprintk(dev , KERN_ERR , fmt , ## args)
@@ -305,7 +218,6 @@ device_desc = {
 
 	.idVendor =		__constant_cpu_to_le16 (DRIVER_VENDOR_NUM),
 	.idProduct =		__constant_cpu_to_le16 (DRIVER_PRODUCT_NUM),
-	.bcdDevice =		__constant_cpu_to_le16 (DRIVER_VERSION_NUM),
 	.iManufacturer =	STRING_MANUFACTURER,
 	.iProduct =		STRING_PRODUCT,
 	.iSerialNumber =	STRING_SERIAL,
@@ -362,24 +274,22 @@ loopback_intf = {
 
 /* two full speed bulk endpoints; their use is config-dependent */
 
-static const struct usb_endpoint_descriptor
+static struct usb_endpoint_descriptor
 fs_source_desc = {
 	.bLength =		USB_DT_ENDPOINT_SIZE,
 	.bDescriptorType =	USB_DT_ENDPOINT,
 
-	.bEndpointAddress =	EP_IN_NUM | USB_DIR_IN,
+	.bEndpointAddress =	USB_DIR_IN,
 	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
-	.wMaxPacketSize =	__constant_cpu_to_le16 (64),
 };
 
-static const struct usb_endpoint_descriptor
+static struct usb_endpoint_descriptor
 fs_sink_desc = {
 	.bLength =		USB_DT_ENDPOINT_SIZE,
 	.bDescriptorType =	USB_DT_ENDPOINT,
 
-	.bEndpointAddress =	EP_OUT_NUM,
+	.bEndpointAddress =	USB_DIR_OUT,
 	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
-	.wMaxPacketSize =	__constant_cpu_to_le16 (64),
 };
 
 static const struct usb_descriptor_header *fs_source_sink_function [] = {
@@ -643,7 +553,7 @@ static void source_sink_complete (struct
 	case -ECONNABORTED: 		/* hardware forced ep reset */
 	case -ECONNRESET:		/* request dequeued */
 	case -ESHUTDOWN:		/* disconnect from host */
-		VDEBUG (dev, "%s gone (%d), %d/%d\n", ep->name, status,
+		VDBG (dev, "%s gone (%d), %d/%d\n", ep->name, status,
 				req->actual, req->length);
 		if (ep == dev->out_ep)
 			check_read_data (dev, ep, req);
@@ -656,7 +566,7 @@ static void source_sink_complete (struct
 					 */
 	default:
 #if 1
-		DEBUG (dev, "%s complete --> %d, %d/%d\n", ep->name,
+		DBG (dev, "%s complete --> %d, %d/%d\n", ep->name,
 				status, req->actual, req->length);
 #endif
 	case -EREMOTEIO:		/* short read */
@@ -747,7 +657,7 @@ set_source_sink_config (struct zero_dev 
 		break;
 	}
 	if (result == 0)
-		DEBUG (dev, "buflen %d\n", buflen);
+		DBG (dev, "buflen %d\n", buflen);
 
 	/* caller is responsible for cleanup on error */
 	return result;
@@ -858,14 +768,14 @@ set_loopback_config (struct zero_dev *de
 				req->complete = loopback_complete;
 				result = usb_ep_queue (ep, req, GFP_ATOMIC);
 				if (result)
-					DEBUG (dev, "%s queue req --> %d\n",
+					DBG (dev, "%s queue req --> %d\n",
 							ep->name, result);
 			} else
 				result = -ENOMEM;
 		}
 	}
 	if (result == 0)
-		DEBUG (dev, "qlen %d, buflen %d\n", qlen, buflen);
+		DBG (dev, "qlen %d, buflen %d\n", qlen, buflen);
 
 	/* caller is responsible for cleanup on error */
 	return result;
@@ -878,7 +788,7 @@ static void zero_reset_config (struct ze
 	if (dev->config == 0)
 		return;
 
-	DEBUG (dev, "reset config\n");
+	DBG (dev, "reset config\n");
 
 	/* just disable endpoints, forcing completion of pending i/o.
 	 * all our completion handlers free their requests in this case.
@@ -913,13 +823,11 @@ zero_set_config (struct zero_dev *dev, u
 	if (number == dev->config)
 		return 0;
 
-#ifdef CONFIG_USB_GADGET_SA1100
-	if (dev->config) {
+	if (gadget_is_sa1100 (gadget) && dev->config) {
 		/* tx fifo is full, but we can't clear it...*/
 		INFO (dev, "can't change configurations\n");
 		return -ESPIPE;
 	}
-#endif
 	zero_reset_config (dev);
 
 	switch (number) {
@@ -963,7 +871,7 @@ zero_set_config (struct zero_dev *dev, u
 static void zero_setup_complete (struct usb_ep *ep, struct usb_request *req)
 {
 	if (req->status || req->actual != req->length)
-		DEBUG ((struct zero_dev *) ep->driver_data,
+		DBG ((struct zero_dev *) ep->driver_data,
 				"setup complete --> %d, %d/%d\n",
 				req->status, req->actual, req->length);
 }
@@ -1111,7 +1019,7 @@ zero_setup (struct usb_gadget *gadget, c
 
 	default:
 unknown:
-		VDEBUG (dev,
+		VDBG (dev,
 			"unknown control req%02x.%02x v%04x i%04x l%d\n",
 			ctrl->bRequestType, ctrl->bRequest,
 			ctrl->wValue, ctrl->wIndex, ctrl->wLength);
@@ -1122,7 +1030,7 @@ unknown:
 		req->length = value;
 		value = usb_ep_queue (gadget->ep0, req, GFP_ATOMIC);
 		if (value < 0) {
-			DEBUG (dev, "ep_queue --> %d\n", value);
+			DBG (dev, "ep_queue --> %d\n", value);
 			req->status = 0;
 			zero_setup_complete (gadget->ep0, req);
 		}
@@ -1159,7 +1067,7 @@ zero_unbind (struct usb_gadget *gadget)
 {
 	struct zero_dev		*dev = get_gadget_data (gadget);
 
-	DEBUG (dev, "unbind\n");
+	DBG (dev, "unbind\n");
 
 	/* we've already been disconnected ... no i/o is active */
 	if (dev->req)
@@ -1172,7 +1080,70 @@ static int
 zero_bind (struct usb_gadget *gadget)
 {
 	struct zero_dev		*dev;
+	struct usb_ep		*ep;
 
+	/* Bulk-only drivers like this one SHOULD be able to
+	 * autoconfigure on any sane usb controller driver,
+	 * but there may also be important quirks to address.
+	 */
+	usb_ep_autoconfig_reset (gadget);
+	ep = usb_ep_autoconfig (gadget, &fs_source_desc);
+	if (!ep) {
+autoconf_fail:
+		printk (KERN_ERR "%s: can't autoconfigure on %s\n",
+			shortname, gadget->name);
+		return -ENODEV;
+	}
+	EP_IN_NAME = ep->name;
+	ep->driver_data = ep;	/* claim */
+	
+	ep = usb_ep_autoconfig (gadget, &fs_sink_desc);
+	if (!ep)
+		goto autoconf_fail;
+	EP_OUT_NAME = ep->name;
+	ep->driver_data = ep;	/* claim */
+
+
+	/*
+	 * DRIVER POLICY CHOICE:  you may want to do this differently.
+	 * One thing to avoid is reusing a bcdDevice revision code
+	 * with different host-visible configurations or behavior
+	 * restrictions -- using ep1in/ep2out vs ep1out/ep3in, etc
+	 */
+	if (gadget_is_net2280 (gadget)) {
+		device_desc.bcdDevice = __constant_cpu_to_le16 (0x0201);
+	} else if (gadget_is_pxa (gadget)) {
+		device_desc.bcdDevice = __constant_cpu_to_le16 (0x0203);
+#if 0
+	} else if (gadget_is_sh(gadget)) {
+		device_desc.bcdDevice = __constant_cpu_to_le16 (0x0204);
+		/* SH has only one configuration; see "loopdefault" */
+		device_desc.bNumConfigurations = 1;
+		/* FIXME make 1 == default.bConfigurationValue */
+#endif
+	} else if (gadget_is_sa1100 (gadget)) {
+		device_desc.bcdDevice = __constant_cpu_to_le16 (0x0205);
+	} else if (gadget_is_goku (gadget)) {
+		device_desc.bcdDevice = __constant_cpu_to_le16 (0x0206);
+	} else if (gadget_is_mq11xx (gadget)) {
+		device_desc.bcdDevice = __constant_cpu_to_le16 (0x0207);
+	} else if (gadget_is_omap (gadget)) {
+		device_desc.bcdDevice = __constant_cpu_to_le16 (0x0208);
+	} else {
+		/* gadget zero is so simple (for now, no altsettings) that
+		 * it SHOULD NOT have problems with bulk-capable hardware.
+		 * so warn about unrcognized controllers, don't panic.
+		 *
+		 * things like configuration and altsetting numbering
+		 * can need hardware-specific attention though.
+		 */
+		printk (KERN_WARNING "%s: controller '%s' not recognized\n",
+			shortname, gadget->name);
+		device_desc.bcdDevice = __constant_cpu_to_le16 (0x9999);
+	}
+
+
+	/* ok, we made sense of the hardware ... */
 	dev = kmalloc (sizeof *dev, SLAB_KERNEL);
 	if (!dev)
 		return -ENOMEM;
@@ -1203,6 +1174,8 @@ zero_bind (struct usb_gadget *gadget)
 	hs_sink_desc.bEndpointAddress = fs_sink_desc.bEndpointAddress;
 #endif
 
+	usb_gadget_set_selfpowered (gadget);
+
 	gadget->ep0->driver_data = dev;
 
 	INFO (dev, "%s, version: " DRIVER_VERSION "\n", longname);
--- diff/drivers/usb/host/Kconfig	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/host/Kconfig	2004-04-21 10:45:35.056374120 +0100
@@ -38,6 +38,17 @@ config USB_EHCI_SPLIT_ISO
 	  EHCI or USB 2.0 transaction translator implementations.
 	  It should work for ISO-OUT transfers, like audio.
 
+config USB_EHCI_ROOT_HUB_TT
+	bool "Root Hub Transaction Translators (EXPERIMENTAL)"
+	depends on USB_EHCI_HCD && EXPERIMENTAL
+	---help---
+	  Some EHCI chips have vendor-specific extensions to integrate
+	  transaction translators, so that no OHCI or UHCI companion
+	  controller is needed.  It's safe to say "y" even if your
+	  controller doesn't support this feature.
+
+	  This supports the EHCI implementation from ARC International.
+
 config USB_OHCI_HCD
 	tristate "OHCI HCD support"
 	depends on USB
--- diff/drivers/usb/host/ehci-dbg.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/host/ehci-dbg.c	2004-04-21 10:45:35.056374120 +0100
@@ -628,8 +628,10 @@ show_registers (struct class_device *cla
 	/* Capability Registers */
 	i = HC_VERSION(readl (&ehci->caps->hc_capbase));
 	temp = scnprintf (next, size,
-		"PCI device %s\nEHCI %x.%02x, hcd state %d (driver " DRIVER_VERSION ")\n",
-		pci_name(to_pci_dev(hcd->self.controller)),
+		"bus %s device %s\n"
+		"EHCI %x.%02x, hcd state %d (driver " DRIVER_VERSION ")\n",
+		hcd->self.controller->bus->name,
+		hcd->self.controller->bus_id,
 		i >> 8, i & 0x0ff, ehci->hcd.state);
 	size -= temp;
 	next += temp;
--- diff/drivers/usb/host/ehci-hcd.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/host/ehci-hcd.c	2004-04-21 10:45:35.057373968 +0100
@@ -279,6 +279,8 @@ static void ehci_watchdog (unsigned long
 	spin_unlock_irqrestore (&ehci->lock, flags);
 }
 
+#ifdef	CONFIG_PCI
+
 /* EHCI 0.96 (and later) section 5.1 says how to kick BIOS/SMM/...
  * off the controller (maybe it can boot from highspeed USB disks).
  */
@@ -307,6 +309,8 @@ static int bios_handoff (struct ehci_hcd
 	return 0;
 }
 
+#endif
+
 static int
 ehci_reboot (struct notifier_block *self, unsigned long code, void *null)
 {
@@ -335,8 +339,12 @@ static int ehci_hc_reset (struct usb_hcd
 	dbg_hcs_params (ehci, "reset");
 	dbg_hcc_params (ehci, "reset");
 
+#ifdef	CONFIG_PCI
 	/* EHCI 0.96 and later may have "extended capabilities" */
-	temp = HCC_EXT_CAPS (readl (&ehci->caps->hcc_params));
+	if (hcd->self.controller->bus == &pci_bus_type)
+		temp = HCC_EXT_CAPS (readl (&ehci->caps->hcc_params));
+	else
+		temp = 0;
 	while (temp) {
 		u32		cap;
 
@@ -356,6 +364,7 @@ static int ehci_hc_reset (struct usb_hcd
 		}
 		temp = (cap >> 8) & 0xff;
 	}
+#endif
 
 	/* cache this readonly data; minimize PCI reads */
 	ehci->hcs_params = readl (&ehci->caps->hcs_params);
@@ -372,7 +381,11 @@ static int ehci_start (struct usb_hcd *h
 	struct usb_bus		*bus;
 	int			retval;
 	u32			hcc_params;
-	u8                      tempbyte;
+	u8                      sbrn = 0;
+
+	init_timer (&ehci->watchdog);
+	ehci->watchdog.function = ehci_watchdog;
+	ehci->watchdog.data = (unsigned long) ehci;
 
 	/*
 	 * hw default: 1K periodic list heads, one per frame.
@@ -402,6 +415,29 @@ static int ehci_start (struct usb_hcd *h
 	writel (INTR_MASK, &ehci->regs->intr_enable);
 	writel (ehci->periodic_dma, &ehci->regs->frame_list);
 
+#ifdef	CONFIG_PCI
+	if (hcd->self.controller->bus == &pci_bus_type) {
+		struct pci_dev		*pdev;
+
+		pdev = to_pci_dev(hcd->self.controller);
+
+		/* Serial Bus Release Number is at PCI 0x60 offset */
+		pci_read_config_byte(pdev, 0x60, &sbrn);
+
+		/* help hc dma work well with cachelines */
+		pci_set_mwi (pdev);
+
+		/* chip-specific init */
+		switch (pdev->vendor) {
+		case PCI_VENDOR_ID_ARC:
+			if (pdev->device == PCI_DEVICE_ID_ARC_EHCI)
+				ehci->is_arc_rh_tt = 1;
+			break;
+		}
+
+	}
+#endif
+
 	/*
 	 * dedicate a qh for the async ring head, since we couldn't unlink
 	 * a 'real' qh without stopping the async schedule [4.8].  use it
@@ -439,9 +475,6 @@ static int ehci_start (struct usb_hcd *h
 #endif
 	}
 
-	/* help hc dma work well with cachelines */
-	pci_set_mwi (to_pci_dev(ehci->hcd.self.controller));
-
 	/* clear interrupt enables, set irq latency */
 	temp = readl (&ehci->regs->command) & 0x0fff;
 	if (log2_irq_thresh < 0 || log2_irq_thresh > 6)
@@ -468,10 +501,6 @@ static int ehci_start (struct usb_hcd *h
 
 	/* set async sleep time = 10 us ... ? */
 
-	init_timer (&ehci->watchdog);
-	ehci->watchdog.function = ehci_watchdog;
-	ehci->watchdog.data = (unsigned long) ehci;
-
 	/* wire up the root hub */
 	bus = hcd_to_bus (hcd);
 	bus->root_hub = udev = usb_alloc_dev (NULL, bus, 0);
@@ -493,12 +522,10 @@ done2:
 	writel (FLAG_CF, &ehci->regs->configured_flag);
 	readl (&ehci->regs->command);	/* unblock posted write */
 
-        /* PCI Serial Bus Release Number is at 0x60 offset */
-	pci_read_config_byte(to_pci_dev(hcd->self.controller), 0x60, &tempbyte);
 	temp = HC_VERSION(readl (&ehci->caps->hc_capbase));
 	ehci_info (ehci,
 		"USB %x.%x enabled, EHCI %x.%02x, driver %s\n",
-		((tempbyte & 0xf0)>>4), (tempbyte & 0x0f),
+		((sbrn & 0xf0)>>4), (sbrn & 0x0f),
 		temp >> 8, temp & 0xff, DRIVER_VERSION);
 
 	/*
@@ -995,7 +1022,9 @@ static const struct hc_driver ehci_drive
 
 /*-------------------------------------------------------------------------*/
 
-/* EHCI spec says PCI is required. */
+/* EHCI 1.0 doesn't require PCI */
+
+#ifdef	CONFIG_PCI
 
 /* PCI driver selection metadata; PCI hotplugging uses this */
 static const struct pci_device_id pci_ids [] = { {
@@ -1021,6 +1050,9 @@ static struct pci_driver ehci_pci_driver
 #endif
 };
 
+#endif	/* PCI */
+
+
 #define DRIVER_INFO DRIVER_VERSION " " DRIVER_DESC
 
 MODULE_DESCRIPTION (DRIVER_INFO);
--- diff/drivers/usb/host/ehci-hub.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/usb/host/ehci-hub.c	2004-04-21 10:45:35.058373816 +0100
@@ -40,6 +40,15 @@ static int check_reset_complete (
 
 	/* if reset finished and it's still not enabled -- handoff */
 	if (!(port_status & PORT_PE)) {
+
+		/* with integrated TT, there's nobody to hand it to! */
+		if (ehci_is_ARC(ehci)) {
+			ehci_dbg (ehci,
+				"Failed to enable port %d on root hub TT\n",
+				index+1);
+			return port_status;
+		}
+
 		ehci_dbg (ehci, "port %d full speed --> companion\n",
 			index + 1);
 
@@ -257,7 +266,8 @@ static int ehci_hub_control (
 		if (!(temp & PORT_OWNER)) {
 			if (temp & PORT_CONNECT) {
 				status |= 1 << USB_PORT_FEAT_CONNECTION;
-				status |= 1 << USB_PORT_FEAT_HIGHSPEED;
+				// status may be from integrated TT
+				status |= ehci_port_speed(ehci, temp);
 			}
 			if (temp & PORT_PE)
 				status |= 1 << USB_PORT_FEAT_ENABLE;
@@ -307,8 +317,12 @@ static int ehci_hub_control (
 					&ehci->regs->port_status [wIndex]);
 			break;
 		case USB_PORT_FEAT_RESET:
-			/* line status bits may report this as low speed */
+			/* line status bits may report this as low speed,
+			 * which can be fine if this root hub has a
+			 * transaction translator built in.
+			 */
 			if ((temp & (PORT_PE|PORT_CONNECT)) == PORT_CONNECT
+					&& !ehci_is_ARC(ehci)
 					&& PORT_USB11 (temp)) {
 				ehci_dbg (ehci,
 					"port %d low speed --> companion\n",
--- diff/drivers/usb/host/ehci-q.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/usb/host/ehci-q.c	2004-04-21 10:45:35.058373816 +0100
@@ -165,7 +165,10 @@ static void qtd_copy_status (
 		/* if async CSPLIT failed, try cleaning out the TT buffer */
 		} else if (urb->dev->tt && !usb_pipeint (urb->pipe)
 				&& ((token & QTD_STS_MMF) != 0
-					|| QTD_CERR(token) == 0)) {
+					|| QTD_CERR(token) == 0)
+				&& (!ehci_is_ARC(ehci)
+                	                || urb->dev->tt->hub !=
+						ehci->hcd.self.root_hub)) {
 #ifdef DEBUG
 			struct usb_device *tt = urb->dev->tt->hub;
 			dev_dbg (&tt->dev,
@@ -576,7 +579,7 @@ clear_toggle (struct usb_device *udev, i
 // when each interface/altsetting is established.  Unlink
 // any previous qh and cancel its urbs first; endpoints are
 // implicitly reset then (data toggle too).
-// That'd mean updating how usbcore talks to HCDs. (2.5?)
+// That'd mean updating how usbcore talks to HCDs. (2.7?)
 
 
 /*
@@ -674,7 +677,13 @@ qh_make (
 
 		info2 |= (EHCI_TUNE_MULT_TT << 30);
 		info2 |= urb->dev->ttport << 23;
-		info2 |= urb->dev->tt->hub->devnum << 16;
+
+		/* set the address of the TT; for ARC's integrated
+		 * root hub tt, leave it zeroed.
+		 */
+		if (!ehci_is_ARC(ehci)
+				|| urb->dev->tt->hub != ehci->hcd.self.root_hub)
+			info2 |= urb->dev->tt->hub->devnum << 16;
 
 		/* NOTE:  if (PIPE_INTERRUPT) { scheduler sets c-mask } */
 
--- diff/drivers/usb/host/ehci.h	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/host/ehci.h	2004-04-21 10:45:35.059373664 +0100
@@ -85,6 +85,8 @@ struct ehci_hcd {			/* one per controlle
 	unsigned long		actions;
 	unsigned		stamp;
 
+	unsigned		is_arc_rh_tt:1;	/* ARC roothub with TT */
+
 	/* irq statistics */
 #ifdef EHCI_STATS
 	struct ehci_stats	stats;
@@ -552,6 +554,44 @@ struct ehci_fstn {
 
 /*-------------------------------------------------------------------------*/
 
+#ifdef CONFIG_USB_EHCI_ROOT_HUB_TT
+
+/*
+ * Some EHCI controllers have a Transaction Translator built into the
+ * root hub. This is a non-standard feature.  Each controller will need
+ * to add code to the following inline functions, and call them as
+ * needed (mostly in root hub code).
+ */
+
+#define	ehci_is_ARC(e)			((e)->is_arc_rh_tt)
+
+/* Returns the speed of a device attached to a port on the root hub. */
+static inline unsigned int
+ehci_port_speed(struct ehci_hcd *ehci, unsigned int portsc)
+{
+	if (ehci_is_ARC(ehci)) {
+		switch ((portsc>>26)&3) {
+		case 0:
+			return 0;
+		case 1:
+			return (1<<USB_PORT_FEAT_LOWSPEED);
+		case 2:
+		default:
+			return (1<<USB_PORT_FEAT_HIGHSPEED);
+		}
+	}
+	return (1<<USB_PORT_FEAT_HIGHSPEED);
+}
+
+#else
+
+#define	ehci_is_ARC(e)			(0)
+
+#define	ehci_port_speed(ehci, portsc)	(1<<USB_PORT_FEAT_HIGHSPEED)
+#endif
+
+/*-------------------------------------------------------------------------*/
+
 #ifndef DEBUG
 #define STUB_DEBUG_FILES
 #endif	/* DEBUG */
--- diff/drivers/usb/host/ohci-hcd.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/usb/host/ohci-hcd.c	2004-04-21 10:45:35.059373664 +0100
@@ -233,7 +233,7 @@ static int ohci_urb_enqueue (
 	spin_lock (&urb->lock);
 	if (urb->status != -EINPROGRESS) {
 		spin_unlock (&urb->lock);
-
+		urb->hcpriv = urb_priv;
 		finish_urb (ohci, urb, 0);
 		retval = 0;
 		goto fail;
@@ -344,8 +344,11 @@ rescan:
 	if (!ed)
 		goto done;
 
-	if (!HCD_IS_RUNNING (ohci->hcd.state))
+	if (!HCD_IS_RUNNING (ohci->hcd.state)) {
 		ed->state = ED_IDLE;
+		finish_unlinks (ohci, 0, 0);
+	}
+
 	switch (ed->state) {
 	case ED_UNLINK:		/* wait for hw to finish? */
 		/* major IRQ delivery trouble loses INTR_SF too... */
--- diff/drivers/usb/host/ohci-q.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/usb/host/ohci-q.c	2004-04-21 10:45:35.060373512 +0100
@@ -156,6 +156,7 @@ static void periodic_link (struct ohci_h
 			wmb ();
 			*prev = ed;
 			*prev_p = cpu_to_le32p (&ed->dma);
+			wmb();
 		}
 		ohci->load [i] += ed->load;
 	}
@@ -195,6 +196,7 @@ static int ed_schedule (struct ohci_hcd 
 		}
 		ed->ed_prev = ohci->ed_controltail;
 		if (!ohci->ed_controltail && !ohci->ed_rm_list) {
+			wmb();
 			ohci->hc_control |= OHCI_CTRL_CLE;
 			writel (0, &ohci->regs->ed_controlcurrent);
 			writel (ohci->hc_control, &ohci->regs->control);
@@ -212,6 +214,7 @@ static int ed_schedule (struct ohci_hcd 
 		}
 		ed->ed_prev = ohci->ed_bulktail;
 		if (!ohci->ed_bulktail && !ohci->ed_rm_list) {
+			wmb();
 			ohci->hc_control |= OHCI_CTRL_BLE;
 			writel (0, &ohci->regs->ed_bulkcurrent);
 			writel (ohci->hc_control, &ohci->regs->control);
@@ -868,6 +871,7 @@ static struct td *dl_reverse_done_list (
 
 	td_dma = le32_to_cpup (&ohci->hcca->done_head);
 	ohci->hcca->done_head = 0;
+	wmb();
 
 	/* get TD from hc's singly linked list, and
 	 * prepend to ours.  ed->td_list changes later.
@@ -1069,10 +1073,12 @@ dl_done_list (struct ohci_hcd *ohci, str
   			finish_urb (ohci, urb, regs);
 
 		/* clean schedule:  unlink EDs that are no longer busy */
-		if (list_empty (&ed->td_list) && ed->state == ED_OPER)
-			start_ed_unlink (ohci, ed);
+		if (list_empty (&ed->td_list)) {
+			if (ed->state == ED_OPER)
+				start_ed_unlink (ohci, ed);
+
 		/* ... reenabling halted EDs only after fault cleanup */
-		else if ((ed->hwINFO & (ED_SKIP | ED_DEQUEUE)) == ED_SKIP) {
+		} else if ((ed->hwINFO & (ED_SKIP | ED_DEQUEUE)) == ED_SKIP) {
 			td = list_entry (ed->td_list.next, struct td, td_list);
 			if (!(td->hwINFO & TD_DONE)) {
 				ed->hwINFO &= ~ED_SKIP;
--- diff/drivers/usb/host/uhci-debug.c	2004-03-11 10:20:27.000000000 +0000
+++ source/drivers/usb/host/uhci-debug.c	2004-04-21 10:45:35.061373360 +0100
@@ -27,7 +27,7 @@ static inline void lprintk(char *buf)
 		p = strchr(buf, '\n');
 		if (p)
 			*p = 0;
-		printk("%s\n", buf);
+		printk(KERN_DEBUG "%s\n", buf);
 		buf = p;
 		if (buf)
 			buf++;
@@ -210,7 +210,7 @@ static const char *qh_names[] = {
   "skel_int32_qh", "skel_int16_qh",
   "skel_int8_qh", "skel_int4_qh",
   "skel_int2_qh", "skel_int1_qh",
-  "skel_ls_control_qh", "skel_hs_control_qh",
+  "skel_ls_control_qh", "skel_fs_control_qh",
   "skel_bulk_qh", "skel_term_qh"
 };
 
@@ -328,21 +328,17 @@ static int uhci_show_urbp(struct uhci_hc
 	//out += sprintf(out, "Inserttime=%lx ",urbp->inserttime);
 	//out += sprintf(out, "FSBRtime=%lx ",urbp->fsbrtime);
 
-	spin_lock(&urbp->urb->lock);
 	count = 0;
 	list_for_each(tmp, &urbp->td_list)
 		count++;
-	spin_unlock(&urbp->urb->lock);
 	out += sprintf(out, "TDs=%d ",count);
 
 	if (urbp->queued)
 		out += sprintf(out, "queued\n");
 	else {
-		spin_lock(&uhci->frame_list_lock);
 		count = 0;
 		list_for_each(tmp, &urbp->queue_list)
 			count++;
-		spin_unlock(&uhci->frame_list_lock);
 		out += sprintf(out, "queued URBs=%d\n", count);
 	}
 
@@ -352,12 +348,10 @@ static int uhci_show_urbp(struct uhci_hc
 static int uhci_show_lists(struct uhci_hcd *uhci, char *buf, int len)
 {
 	char *out = buf;
-	unsigned long flags;
 	struct list_head *head, *tmp;
 	int count;
 
 	out += sprintf(out, "Main list URBs:");
-	spin_lock_irqsave(&uhci->urb_list_lock, flags);
 	if (list_empty(&uhci->urb_list))
 		out += sprintf(out, " Empty\n");
 	else {
@@ -373,10 +367,8 @@ static int uhci_show_lists(struct uhci_h
 			tmp = tmp->next;
 		}
 	}
-	spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
 
 	out += sprintf(out, "Remove list URBs:");
-	spin_lock_irqsave(&uhci->urb_remove_list_lock, flags);
 	if (list_empty(&uhci->urb_remove_list))
 		out += sprintf(out, " Empty\n");
 	else {
@@ -392,10 +384,8 @@ static int uhci_show_lists(struct uhci_h
 			tmp = tmp->next;
 		}
 	}
-	spin_unlock_irqrestore(&uhci->urb_remove_list_lock, flags);
 
 	out += sprintf(out, "Complete list URBs:");
-	spin_lock_irqsave(&uhci->complete_list_lock, flags);
 	if (list_empty(&uhci->complete_list))
 		out += sprintf(out, " Empty\n");
 	else {
@@ -411,7 +401,6 @@ static int uhci_show_lists(struct uhci_h
 			tmp = tmp->next;
 		}
 	}
-	spin_unlock_irqrestore(&uhci->complete_list_lock, flags);
 
 	return out - buf;
 }
@@ -425,7 +414,7 @@ static int uhci_sprint_schedule(struct u
 	struct uhci_td *td;
 	struct list_head *tmp, *head;
 
-	spin_lock_irqsave(&uhci->frame_list_lock, flags);
+	spin_lock_irqsave(&uhci->schedule_lock, flags);
 
 	out += sprintf(out, "HC status\n");
 	out += uhci_show_status(uhci, out, len - (out - buf));
@@ -508,11 +497,11 @@ static int uhci_sprint_schedule(struct u
 		}
 	}
 
-	spin_unlock_irqrestore(&uhci->frame_list_lock, flags);
-
 	if (debug > 2)
 		out += uhci_show_lists(uhci, out, len - (out - buf));
 
+	spin_unlock_irqrestore(&uhci->schedule_lock, flags);
+
 	return out - buf;
 }
 
@@ -623,4 +612,3 @@ static struct file_operations uhci_proc_
 	.release =	uhci_proc_release,
 };
 #endif
-
--- diff/drivers/usb/host/uhci-hcd.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/host/uhci-hcd.c	2004-04-21 10:45:35.063373056 +0100
@@ -117,26 +117,18 @@ static void hc_state_transitions(struct 
  */
 static inline void uhci_set_next_interrupt(struct uhci_hcd *uhci)
 {
-	unsigned long flags;
-
-	spin_lock_irqsave(&uhci->frame_list_lock, flags);
 	uhci->term_td->status |= cpu_to_le32(TD_CTRL_IOC); 
-	spin_unlock_irqrestore(&uhci->frame_list_lock, flags);
 }
 
 static inline void uhci_clear_next_interrupt(struct uhci_hcd *uhci)
 {
-	spin_lock(&uhci->frame_list_lock);
 	uhci->term_td->status &= ~cpu_to_le32(TD_CTRL_IOC);
-	spin_unlock(&uhci->frame_list_lock);
 }
 
 static inline void uhci_moveto_complete(struct uhci_hcd *uhci, 
 					struct urb_priv *urbp)
 {
-	spin_lock(&uhci->complete_list_lock);
 	list_move_tail(&urbp->urb_list, &uhci->complete_list);
-	spin_unlock(&uhci->complete_list_lock);
 }
 
 static struct uhci_td *uhci_alloc_td(struct uhci_hcd *uhci, struct usb_device *dev)
@@ -178,12 +170,8 @@ static inline void uhci_fill_td(struct u
  */
 static void uhci_insert_td_frame_list(struct uhci_hcd *uhci, struct uhci_td *td, unsigned framenum)
 {
-	unsigned long flags;
-
 	framenum %= UHCI_NUMFRAMES;
 
-	spin_lock_irqsave(&uhci->frame_list_lock, flags);
-
 	td->frame = framenum;
 
 	/* Is there a TD already mapped there? */
@@ -204,18 +192,13 @@ static void uhci_insert_td_frame_list(st
 		uhci->fl->frame[framenum] = cpu_to_le32(td->dma_handle);
 		uhci->fl->frame_cpu[framenum] = td;
 	}
-
-	spin_unlock_irqrestore(&uhci->frame_list_lock, flags);
 }
 
 static void uhci_remove_td(struct uhci_hcd *uhci, struct uhci_td *td)
 {
-	unsigned long flags;
-
 	/* If it's not inserted, don't remove it */
-	spin_lock_irqsave(&uhci->frame_list_lock, flags);
 	if (td->frame == -1 && list_empty(&td->fl_list))
-		goto out;
+		return;
 
 	if (td->frame != -1 && uhci->fl->frame_cpu[td->frame] == td) {
 		if (list_empty(&td->fl_list)) {
@@ -240,9 +223,6 @@ static void uhci_remove_td(struct uhci_h
 
 	list_del_init(&td->fl_list);
 	td->frame = -1;
-
-out:
-	spin_unlock_irqrestore(&uhci->frame_list_lock, flags);
 }
 
 /*
@@ -339,12 +319,11 @@ static void uhci_free_qh(struct uhci_hcd
 
 /*
  * Append this urb's qh after the last qh in skelqh->list
- * MUST be called with uhci->frame_list_lock acquired
  *
  * Note that urb_priv.queue_list doesn't have a separate queue head;
  * it's a ring with every element "live".
  */
-static void _uhci_insert_qh(struct uhci_hcd *uhci, struct uhci_qh *skelqh, struct urb *urb)
+static void uhci_insert_qh(struct uhci_hcd *uhci, struct uhci_qh *skelqh, struct urb *urb)
 {
 	struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
 	struct list_head *tmp;
@@ -396,36 +375,20 @@ static void _uhci_insert_qh(struct uhci_
 	list_add_tail(&urbp->qh->list, &skelqh->list);
 }
 
-static void uhci_insert_qh(struct uhci_hcd *uhci, struct uhci_qh *skelqh, struct urb *urb)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&uhci->frame_list_lock, flags);
-	_uhci_insert_qh(uhci, skelqh, urb);
-	spin_unlock_irqrestore(&uhci->frame_list_lock, flags);
-}
-
 /*
  * Start removal of QH from schedule; it finishes next frame.
  * TDs should be unlinked before this is called.
  */
 static void uhci_remove_qh(struct uhci_hcd *uhci, struct uhci_qh *qh)
 {
-	unsigned long flags;
 	struct uhci_qh *pqh;
 
 	if (!qh)
 		return;
 
-	qh->urbp = NULL;
-
 	/*
 	 * Only go through the hoops if it's actually linked in
-	 * Queued QHs are removed in uhci_delete_queued_urb,
-	 * since (for queued URBs) the pqh is pointed to the next
-	 * QH in the queue, not the next endpoint's QH.
 	 */
-	spin_lock_irqsave(&uhci->frame_list_lock, flags);
 	if (!list_empty(&qh->list)) {
 		pqh = list_entry(qh->list.prev, struct uhci_qh, list);
 
@@ -450,11 +413,19 @@ static void uhci_remove_qh(struct uhci_h
 		/* continue the rest of the schedule */
 		qh->element = UHCI_PTR_TERM;
 
+		/* If our queue is nonempty, make the next URB the head */
+		if (!list_empty(&qh->urbp->queue_list)) {
+			struct urb_priv *nurbp;
+
+			nurbp = list_entry(qh->urbp->queue_list.next,
+					struct urb_priv, queue_list);
+			nurbp->queued = 0;
+			list_add_tail(&nurbp->qh->list, &qh->list);
+		}
 		list_del_init(&qh->list);
 	}
-	spin_unlock_irqrestore(&uhci->frame_list_lock, flags);
 
-	spin_lock_irqsave(&uhci->qh_remove_list_lock, flags);
+	qh->urbp = NULL;
 
 	/* Check to see if the remove list is empty. Set the IOC bit */
 	/* to force an interrupt so we can remove the QH */
@@ -462,8 +433,6 @@ static void uhci_remove_qh(struct uhci_h
 		uhci_set_next_interrupt(uhci);
 
 	list_add(&qh->remove_list, &uhci->qh_remove_list);
-
-	spin_unlock_irqrestore(&uhci->qh_remove_list_lock, flags);
 }
 
 static int uhci_fixup_toggle(struct urb *urb, unsigned int toggle)
@@ -497,13 +466,10 @@ static void uhci_append_queued_urb(struc
 	struct urb_priv *eurbp, *urbp, *furbp, *lurbp;
 	struct list_head *tmp;
 	struct uhci_td *lltd;
-	unsigned long flags;
 
 	eurbp = eurb->hcpriv;
 	urbp = urb->hcpriv;
 
-	spin_lock_irqsave(&uhci->frame_list_lock, flags);
-
 	/* Find the first URB in the queue */
 	if (eurbp->queued) {
 		struct list_head *head = &eurbp->queue_list;
@@ -543,8 +509,6 @@ static void uhci_append_queued_urb(struc
 	list_add_tail(&urbp->queue_list, &furbp->queue_list);
 
 	urbp->queued = 1;
-
-	spin_unlock_irqrestore(&uhci->frame_list_lock, flags);
 }
 
 static void uhci_delete_queued_urb(struct uhci_hcd *uhci, struct urb *urb)
@@ -554,14 +518,11 @@ static void uhci_delete_queued_urb(struc
 	struct urb_priv *purbp;
 	struct uhci_td *pltd;
 	unsigned int toggle;
-	unsigned long flags;
 
 	urbp = urb->hcpriv;
 
-	spin_lock_irqsave(&uhci->frame_list_lock, flags);
-
 	if (list_empty(&urbp->queue_list))
-		goto out;
+		return;
 
 	nurbp = list_entry(urbp->queue_list.next, struct urb_priv, queue_list);
 
@@ -603,39 +564,9 @@ static void uhci_delete_queued_urb(struc
 				usb_pipeout(urb->pipe), toggle);
 	}
 
-	if (!urbp->queued) {
-		struct uhci_qh *pqh;
-
-		nurbp->queued = 0;
-
-		/*
-		 * Fixup the previous QH's queue to link to the new head
-		 * of this queue.
-		 */
-		pqh = list_entry(urbp->qh->list.prev, struct uhci_qh, list);
-
-		if (pqh->urbp) {
-			struct list_head *head, *tmp;
-
-			head = &pqh->urbp->queue_list;
-			tmp = head->next;
-			while (head != tmp) {
-				struct urb_priv *turbp =
-					list_entry(tmp, struct urb_priv, queue_list);
-
-				tmp = tmp->next;
-
-				turbp->qh->link = cpu_to_le32(nurbp->qh->dma_handle) | UHCI_PTR_QH;
-			}
-		}
-
-		pqh->link = cpu_to_le32(nurbp->qh->dma_handle) | UHCI_PTR_QH;
-
-		list_add_tail(&nurbp->qh->list, &urbp->qh->list);
-		list_del_init(&urbp->qh->list);
-	} else {
-		/* We're somewhere in the middle (or end). A bit trickier */
-		/*  than the head scenario */
+	if (urbp->queued) {
+		/* We're somewhere in the middle (or end).  The case where
+		 * we're at the head is handled in uhci_remove_qh(). */
 		purbp = list_entry(urbp->queue_list.prev, struct urb_priv,
 				queue_list);
 
@@ -649,9 +580,6 @@ static void uhci_delete_queued_urb(struc
 	}
 
 	list_del_init(&urbp->queue_list);
-
-out:
-	spin_unlock_irqrestore(&uhci->frame_list_lock, flags);
 }
 
 static struct urb_priv *uhci_alloc_urb_priv(struct uhci_hcd *uhci, struct urb *urb)
@@ -679,9 +607,6 @@ static struct urb_priv *uhci_alloc_urb_p
 	return urbp;
 }
 
-/*
- * MUST be called with urb->lock acquired
- */
 static void uhci_add_td_to_urb(struct urb *urb, struct uhci_td *td)
 {
 	struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
@@ -691,9 +616,6 @@ static void uhci_add_td_to_urb(struct ur
 	list_add_tail(&td->list, &urbp->td_list);
 }
 
-/*
- * MUST be called with urb->lock acquired
- */
 static void uhci_remove_td_from_urb(struct uhci_td *td)
 {
 	if (list_empty(&td->list))
@@ -704,14 +626,10 @@ static void uhci_remove_td_from_urb(stru
 	td->urb = NULL;
 }
 
-/*
- * MUST be called with urb->lock acquired
- */
 static void uhci_destroy_urb_priv(struct uhci_hcd *uhci, struct urb *urb)
 {
 	struct list_head *head, *tmp;
 	struct urb_priv *urbp;
-	unsigned long flags;
 
 	urbp = (struct urb_priv *)urb->hcpriv;
 	if (!urbp)
@@ -721,8 +639,6 @@ static void uhci_destroy_urb_priv(struct
 		dev_warn(uhci_dev(uhci), "urb %p still on uhci->urb_list "
 				"or uhci->remove_list!\n", urb);
 
-	spin_lock_irqsave(&uhci->td_remove_list_lock, flags);
-
 	/* Check to see if the remove list is empty. Set the IOC bit */
 	/* to force an interrupt so we can remove the TD's*/
 	if (list_empty(&uhci->td_remove_list))
@@ -740,42 +656,30 @@ static void uhci_destroy_urb_priv(struct
 		list_add(&td->remove_list, &uhci->td_remove_list);
 	}
 
-	spin_unlock_irqrestore(&uhci->td_remove_list_lock, flags);
-
 	urb->hcpriv = NULL;
 	kmem_cache_free(uhci_up_cachep, urbp);
 }
 
 static void uhci_inc_fsbr(struct uhci_hcd *uhci, struct urb *urb)
 {
-	unsigned long flags;
 	struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
 
-	spin_lock_irqsave(&uhci->frame_list_lock, flags);
-
 	if ((!(urb->transfer_flags & URB_NO_FSBR)) && !urbp->fsbr) {
 		urbp->fsbr = 1;
 		if (!uhci->fsbr++ && !uhci->fsbrtimeout)
-			uhci->skel_term_qh->link = cpu_to_le32(uhci->skel_hs_control_qh->dma_handle) | UHCI_PTR_QH;
+			uhci->skel_term_qh->link = cpu_to_le32(uhci->skel_fs_control_qh->dma_handle) | UHCI_PTR_QH;
 	}
-
-	spin_unlock_irqrestore(&uhci->frame_list_lock, flags);
 }
 
 static void uhci_dec_fsbr(struct uhci_hcd *uhci, struct urb *urb)
 {
-	unsigned long flags;
 	struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
 
-	spin_lock_irqsave(&uhci->frame_list_lock, flags);
-
 	if ((!(urb->transfer_flags & URB_NO_FSBR)) && urbp->fsbr) {
 		urbp->fsbr = 0;
 		if (!--uhci->fsbr)
 			uhci->fsbrtimeout = jiffies + FSBR_DELAY;
 	}
-
-	spin_unlock_irqrestore(&uhci->frame_list_lock, flags);
 }
 
 /*
@@ -840,13 +744,16 @@ static int uhci_submit_control(struct uh
 		urb->setup_dma);
 
 	/*
-	 * If direction is "send", change the frame from SETUP (0x2D)
-	 * to OUT (0xE1). Else change it from SETUP to IN (0x69).
+	 * If direction is "send", change the packet ID from SETUP (0x2D)
+	 * to OUT (0xE1).  Else change it from SETUP to IN (0x69) and
+	 * set Short Packet Detect (SPD) for all data packets.
 	 */
-	destination ^= (USB_PID_SETUP ^ usb_packetid(urb->pipe));
-
-	if (!(urb->transfer_flags & URB_SHORT_NOT_OK))
+	if (usb_pipeout(urb->pipe))
+		destination ^= (USB_PID_SETUP ^ USB_PID_OUT);
+	else {
+		destination ^= (USB_PID_SETUP ^ USB_PID_IN);
 		status |= TD_CTRL_SPD;
+	}
 
 	/*
 	 * Build the DATA TD's
@@ -910,7 +817,7 @@ static int uhci_submit_control(struct uh
 	if (urb->dev->speed == USB_SPEED_LOW)
 		skelqh = uhci->skel_ls_control_qh;
 	else {
-		skelqh = uhci->skel_hs_control_qh;
+		skelqh = uhci->skel_fs_control_qh;
 		uhci_inc_fsbr(uhci, urb);
 	}
 
@@ -923,50 +830,23 @@ static int uhci_submit_control(struct uh
 }
 
 /*
- * If control was short, then end status packet wasn't sent, so this
- * reorganize s so it's sent to finish the transfer.  The original QH is
- * removed from the skel and discarded; all TDs except the last (status)
- * are deleted; the last (status) TD is put on a new QH which is reinserted
- * into the skel.  Since the last TD and urb_priv are reused, the TD->link
- * and urb_priv maintain any queued QHs.
+ * If control-IN transfer was short, the status packet wasn't sent.
+ * This routine changes the element pointer in the QH to point at the
+ * status TD.  It's safe to do this even while the QH is live, because
+ * the hardware only updates the element pointer following a successful
+ * transfer.  The inactive TD for the short packet won't cause an update,
+ * so the pointer won't get overwritten.  The next time the controller
+ * sees this QH, it will send the status packet.
  */
 static int usb_control_retrigger_status(struct uhci_hcd *uhci, struct urb *urb)
 {
-	struct list_head *tmp, *head;
 	struct urb_priv *urbp = (struct urb_priv *)urb->hcpriv;
+	struct uhci_td *td;
 
 	urbp->short_control_packet = 1;
 
-	/* Create a new QH to avoid pointer overwriting problems */
-	uhci_remove_qh(uhci, urbp->qh);
-
-	/* Delete all of the TD's except for the status TD at the end */
-	head = &urbp->td_list;
-	tmp = head->next;
-	while (tmp != head && tmp->next != head) {
-		struct uhci_td *td = list_entry(tmp, struct uhci_td, list);
-
-		tmp = tmp->next;
-
-		uhci_remove_td_from_urb(td);
-		uhci_remove_td(uhci, td);
-		uhci_free_td(uhci, td);
-	}
-
-	urbp->qh = uhci_alloc_qh(uhci, urb->dev);
-	if (!urbp->qh)
-		return -ENOMEM;
-
-	urbp->qh->urbp = urbp;
-
-	/* One TD, who cares about Breadth first? */
-	uhci_insert_tds_in_qh(urbp->qh, urb, UHCI_PTR_DEPTH);
-
-	/* Low-speed transfers get a different queue */
-	if (urb->dev->speed == USB_SPEED_LOW)
-		uhci_insert_qh(uhci, uhci->skel_ls_control_qh, urb);
-	else
-		uhci_insert_qh(uhci, uhci->skel_hs_control_qh, urb);
+	td = list_entry(urbp->td_list.prev, struct uhci_td, list);
+	urbp->qh->element = td->dma_handle;
 
 	return -EINPROGRESS;
 }
@@ -1101,17 +981,20 @@ static int uhci_submit_common(struct uhc
 	status = uhci_maxerr(3) | TD_CTRL_ACTIVE;
 	if (urb->dev->speed == USB_SPEED_LOW)
 		status |= TD_CTRL_LS;
-	if (!(urb->transfer_flags & URB_SHORT_NOT_OK))
+	if (usb_pipein(urb->pipe))
 		status |= TD_CTRL_SPD;
 
 	/*
 	 * Build the DATA TD's
 	 */
 	do {	/* Allow zero length packets */
-		int pktsze = len;
+		int pktsze = maxsze;
 
-		if (pktsze > maxsze)
-			pktsze = maxsze;
+		if (pktsze >= len) {
+			pktsze = len;
+			if (!(urb->transfer_flags & URB_SHORT_NOT_OK))
+				status &= ~TD_CTRL_SPD;
+		}
 
 		td = uhci_alloc_td(uhci, urb->dev);
 		if (!td)
@@ -1154,7 +1037,8 @@ static int uhci_submit_common(struct uhc
 	}
 
 	/* Set the flag on the last packet */
-	td->status |= cpu_to_le32(TD_CTRL_IOC);
+	if (!(urb->transfer_flags & URB_NO_INTERRUPT))
+		td->status |= cpu_to_le32(TD_CTRL_IOC);
 
 	qh = uhci_alloc_qh(uhci, urb->dev);
 	if (!qh)
@@ -1409,9 +1293,6 @@ static int uhci_result_isochronous(struc
 	return ret;
 }
 
-/*
- * MUST be called with uhci->urb_list_lock acquired
- */
 static struct urb *uhci_find_urb_ep(struct uhci_hcd *uhci, struct urb *urb)
 {
 	struct list_head *tmp, *head;
@@ -1449,7 +1330,7 @@ static int uhci_urb_enqueue(struct usb_h
 	struct urb *eurb;
 	int bustime;
 
-	spin_lock_irqsave(&uhci->urb_list_lock, flags);
+	spin_lock_irqsave(&uhci->schedule_lock, flags);
 
 	if (urb->status != -EINPROGRESS)	/* URB already unlinked! */
 		goto out;
@@ -1506,14 +1387,12 @@ static int uhci_urb_enqueue(struct usb_h
 		ret = 0;
 
 out:
-	spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
+	spin_unlock_irqrestore(&uhci->schedule_lock, flags);
 	return ret;
 }
 
 /*
  * Return the result of a transfer
- *
- * MUST be called with urb_list_lock acquired
  */
 static void uhci_transfer_result(struct uhci_hcd *uhci, struct urb *urb)
 {
@@ -1549,7 +1428,6 @@ static void uhci_transfer_result(struct 
 	case PIPE_BULK:
 	case PIPE_ISOCHRONOUS:
 		/* Release bandwidth for Interrupt or Isoc. transfers */
-		/* Spinlock needed ? */
 		if (urb->bandwidth)
 			usb_release_bandwidth(urb->dev, urb, 1);
 		uhci_unlink_generic(uhci, urb);
@@ -1557,15 +1435,12 @@ static void uhci_transfer_result(struct 
 	case PIPE_INTERRUPT:
 		/* Release bandwidth for Interrupt or Isoc. transfers */
 		/* Make sure we don't release if we have a queued URB */
-		spin_lock(&uhci->frame_list_lock);
-		/* Spinlock needed ? */
 		if (list_empty(&urbp->queue_list) && urb->bandwidth)
 			usb_release_bandwidth(urb->dev, urb, 0);
 		else
 			/* bandwidth was passed on to queued URB, */
 			/* so don't let usb_unlink_urb() release it */
 			urb->bandwidth = 0;
-		spin_unlock(&uhci->frame_list_lock);
 		uhci_unlink_generic(uhci, urb);
 		break;
 	default:
@@ -1581,9 +1456,6 @@ out:
 	spin_unlock(&urb->lock);
 }
 
-/*
- * MUST be called with urb->lock acquired
- */
 static void uhci_unlink_generic(struct uhci_hcd *uhci, struct urb *urb)
 {
 	struct list_head *head, *tmp;
@@ -1639,7 +1511,7 @@ static int uhci_urb_dequeue(struct usb_h
 	unsigned long flags;
 	struct urb_priv *urbp;
 
-	spin_lock_irqsave(&uhci->urb_list_lock, flags);
+	spin_lock_irqsave(&uhci->schedule_lock, flags);
 	urbp = urb->hcpriv;
 	if (!urbp)			/* URB was never linked! */
 		goto done;
@@ -1647,16 +1519,13 @@ static int uhci_urb_dequeue(struct usb_h
 
 	uhci_unlink_generic(uhci, urb);
 
-	spin_lock(&uhci->urb_remove_list_lock);
-
 	/* If we're the first, set the next interrupt bit */
 	if (list_empty(&uhci->urb_remove_list))
 		uhci_set_next_interrupt(uhci);
 	list_add_tail(&urbp->urb_list, &uhci->urb_remove_list);
 
-	spin_unlock(&uhci->urb_remove_list_lock);
 done:
-	spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
+	spin_unlock_irqrestore(&uhci->schedule_lock, flags);
 	return 0;
 }
 
@@ -1718,7 +1587,7 @@ static void stall_callback(unsigned long
 
 	INIT_LIST_HEAD(&list);
 
-	spin_lock_irqsave(&uhci->urb_list_lock, flags);
+	spin_lock_irqsave(&uhci->schedule_lock, flags);
 	head = &uhci->urb_list;
 	tmp = head->next;
 	while (tmp != head) {
@@ -1734,12 +1603,15 @@ static void stall_callback(unsigned long
 			uhci_fsbr_timeout(uhci, u);
 
 		/* Check if the URB timed out */
-		if (u->timeout && time_after_eq(jiffies, up->inserttime + u->timeout))
+		if (u->timeout && u->status == -EINPROGRESS &&
+			time_after_eq(jiffies, up->inserttime + u->timeout)) {
+			u->status = -ETIMEDOUT;
 			list_move_tail(&up->urb_list, &list);
+		}
 
 		spin_unlock(&u->lock);
 	}
-	spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
+	spin_unlock_irqrestore(&uhci->schedule_lock, flags);
 
 	head = &list;
 	tmp = head->next;
@@ -1781,7 +1653,6 @@ static void uhci_free_pending_qhs(struct
 {
 	struct list_head *tmp, *head;
 
-	spin_lock(&uhci->qh_remove_list_lock);
 	head = &uhci->qh_remove_list;
 	tmp = head->next;
 	while (tmp != head) {
@@ -1793,14 +1664,12 @@ static void uhci_free_pending_qhs(struct
 
 		uhci_free_qh(uhci, qh);
 	}
-	spin_unlock(&uhci->qh_remove_list_lock);
 }
 
 static void uhci_free_pending_tds(struct uhci_hcd *uhci)
 {
 	struct list_head *tmp, *head;
 
-	spin_lock(&uhci->td_remove_list_lock);
 	head = &uhci->td_remove_list;
 	tmp = head->next;
 	while (tmp != head) {
@@ -1812,18 +1681,17 @@ static void uhci_free_pending_tds(struct
 
 		uhci_free_td(uhci, td);
 	}
-	spin_unlock(&uhci->td_remove_list_lock);
 }
 
 static void uhci_finish_urb(struct usb_hcd *hcd, struct urb *urb, struct pt_regs *regs)
 {
 	struct uhci_hcd *uhci = hcd_to_uhci(hcd);
 
-	spin_lock(&urb->lock);
 	uhci_destroy_urb_priv(uhci, urb);
-	spin_unlock(&urb->lock);
 
+	spin_unlock(&uhci->schedule_lock);
 	usb_hcd_giveback_urb(hcd, urb, regs);
+	spin_lock(&uhci->schedule_lock);
 }
 
 static void uhci_finish_completion(struct usb_hcd *hcd, struct pt_regs *regs)
@@ -1831,7 +1699,6 @@ static void uhci_finish_completion(struc
 	struct uhci_hcd *uhci = hcd_to_uhci(hcd);
 	struct list_head *tmp, *head;
 
-	spin_lock(&uhci->complete_list_lock);
 	head = &uhci->complete_list;
 	tmp = head->next;
 	while (tmp != head) {
@@ -1839,26 +1706,18 @@ static void uhci_finish_completion(struc
 		struct urb *urb = urbp->urb;
 
 		list_del_init(&urbp->urb_list);
-		spin_unlock(&uhci->complete_list_lock);
-
 		uhci_finish_urb(hcd, urb, regs);
 
-		spin_lock(&uhci->complete_list_lock);
 		head = &uhci->complete_list;
 		tmp = head->next;
 	}
-	spin_unlock(&uhci->complete_list_lock);
 }
 
 static void uhci_remove_pending_urbps(struct uhci_hcd *uhci)
 {
-	spin_lock(&uhci->urb_remove_list_lock);
-	spin_lock(&uhci->complete_list_lock);
 
 	/* Splice the urb_remove_list onto the end of the complete_list */
 	list_splice_init(&uhci->urb_remove_list, uhci->complete_list.prev);
-	spin_unlock(&uhci->complete_list_lock);
-	spin_unlock(&uhci->urb_remove_list_lock);
 }
 
 static irqreturn_t uhci_irq(struct usb_hcd *hcd, struct pt_regs *regs)
@@ -1895,16 +1754,15 @@ static irqreturn_t uhci_irq(struct usb_h
 	if (status & USBSTS_RD)
 		uhci->resume_detect = 1;
 
-	uhci_free_pending_qhs(uhci);
+	spin_lock(&uhci->schedule_lock);
 
+	uhci_free_pending_qhs(uhci);
 	uhci_free_pending_tds(uhci);
-
 	uhci_remove_pending_urbps(uhci);
 
 	uhci_clear_next_interrupt(uhci);
 
 	/* Walk the list of pending URB's to see which ones completed */
-	spin_lock(&uhci->urb_list_lock);
 	head = &uhci->urb_list;
 	tmp = head->next;
 	while (tmp != head) {
@@ -1916,9 +1774,10 @@ static irqreturn_t uhci_irq(struct usb_h
 		/* Checks the status and does all of the magic necessary */
 		uhci_transfer_result(uhci, urb);
 	}
-	spin_unlock(&uhci->urb_list_lock);
-
 	uhci_finish_completion(hcd, regs);
+
+	spin_unlock(&uhci->schedule_lock);
+
 	return IRQ_HANDLED;
 }
 
@@ -2208,23 +2067,17 @@ static int uhci_start(struct usb_hcd *hc
 	uhci->fsbr = 0;
 	uhci->fsbrtimeout = 0;
 
-	spin_lock_init(&uhci->qh_remove_list_lock);
+	spin_lock_init(&uhci->schedule_lock);
 	INIT_LIST_HEAD(&uhci->qh_remove_list);
 
-	spin_lock_init(&uhci->td_remove_list_lock);
 	INIT_LIST_HEAD(&uhci->td_remove_list);
 
-	spin_lock_init(&uhci->urb_remove_list_lock);
 	INIT_LIST_HEAD(&uhci->urb_remove_list);
 
-	spin_lock_init(&uhci->urb_list_lock);
 	INIT_LIST_HEAD(&uhci->urb_list);
 
-	spin_lock_init(&uhci->complete_list_lock);
 	INIT_LIST_HEAD(&uhci->complete_list);
 
-	spin_lock_init(&uhci->frame_list_lock);
-
 	uhci->fl = dma_alloc_coherent(uhci_dev(uhci), sizeof(*uhci->fl),
 			&dma_handle, 0);
 	if (!uhci->fl) {
@@ -2311,8 +2164,8 @@ static int uhci_start(struct usb_hcd *hc
 			cpu_to_le32(uhci->skel_int1_qh->dma_handle) | UHCI_PTR_QH;
 	uhci->skel_int1_qh->link = cpu_to_le32(uhci->skel_ls_control_qh->dma_handle) | UHCI_PTR_QH;
 
-	uhci->skel_ls_control_qh->link = cpu_to_le32(uhci->skel_hs_control_qh->dma_handle) | UHCI_PTR_QH;
-	uhci->skel_hs_control_qh->link = cpu_to_le32(uhci->skel_bulk_qh->dma_handle) | UHCI_PTR_QH;
+	uhci->skel_ls_control_qh->link = cpu_to_le32(uhci->skel_fs_control_qh->dma_handle) | UHCI_PTR_QH;
+	uhci->skel_fs_control_qh->link = cpu_to_le32(uhci->skel_bulk_qh->dma_handle) | UHCI_PTR_QH;
 	uhci->skel_bulk_qh->link = cpu_to_le32(uhci->skel_term_qh->dma_handle) | UHCI_PTR_QH;
 
 	/* This dummy TD is to work around a bug in Intel PIIX controllers */
@@ -2416,7 +2269,6 @@ err_create_proc_entry:
 static void uhci_stop(struct usb_hcd *hcd)
 {
 	struct uhci_hcd *uhci = hcd_to_uhci(hcd);
-	unsigned long flags;
 
 	del_timer_sync(&uhci->stall_timer);
 
@@ -2424,16 +2276,18 @@ static void uhci_stop(struct usb_hcd *hc
 	 * At this point, we're guaranteed that no new connects can be made
 	 * to this bus since there are no more parents
 	 */
-	local_irq_save(flags);
+
+	reset_hc(uhci);
+
+	spin_lock_irq(&uhci->schedule_lock);
 	uhci_free_pending_qhs(uhci);
 	uhci_free_pending_tds(uhci);
 	uhci_remove_pending_urbps(uhci);
-
-	reset_hc(uhci);
+	uhci_finish_completion(hcd, NULL);
 
 	uhci_free_pending_qhs(uhci);
 	uhci_free_pending_tds(uhci);
-	local_irq_restore(flags);
+	spin_unlock_irq(&uhci->schedule_lock);
 	
 	release_uhci(uhci);
 }
--- diff/drivers/usb/host/uhci-hcd.h	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/host/uhci-hcd.h	2004-04-21 10:45:35.063373056 +0100
@@ -254,7 +254,7 @@ struct uhci_td {
 #define skel_int2_qh		skelqh[6]
 #define skel_int1_qh		skelqh[7]
 #define skel_ls_control_qh	skelqh[8]
-#define skel_hs_control_qh	skelqh[9]
+#define skel_fs_control_qh	skelqh[9]
 #define skel_bulk_qh		skelqh[10]
 #define skel_term_qh		skelqh[11]
 
@@ -342,8 +342,8 @@ struct uhci_hcd {
 	struct uhci_td *term_td;	/* Terminating TD, see UHCI bug */
 	struct uhci_qh *skelqh[UHCI_NUM_SKELQH];	/* Skeleton QH's */
 
-	spinlock_t frame_list_lock;
-	struct uhci_frame_list *fl;		/* P: uhci->frame_list_lock */
+	spinlock_t schedule_lock;
+	struct uhci_frame_list *fl;		/* P: uhci->schedule_lock */
 	int fsbr;				/* Full-speed bandwidth reclamation */
 	unsigned long fsbrtimeout;		/* FSBR delay */
 
@@ -353,24 +353,19 @@ struct uhci_hcd {
 	unsigned int saved_framenumber;		/* Save during PM suspend */
 
 	/* Main list of URB's currently controlled by this HC */
-	spinlock_t urb_list_lock;
-	struct list_head urb_list;		/* P: uhci->urb_list_lock */
+	struct list_head urb_list;		/* P: uhci->schedule_lock */
 
 	/* List of QH's that are done, but waiting to be unlinked (race) */
-	spinlock_t qh_remove_list_lock;
-	struct list_head qh_remove_list;	/* P: uhci->qh_remove_list_lock */
+	struct list_head qh_remove_list;	/* P: uhci->schedule_lock */
 
 	/* List of TD's that are done, but waiting to be freed (race) */
-	spinlock_t td_remove_list_lock;
-	struct list_head td_remove_list;	/* P: uhci->td_remove_list_lock */
+	struct list_head td_remove_list;	/* P: uhci->schedule_lock */
 
 	/* List of asynchronously unlinked URB's */
-	spinlock_t urb_remove_list_lock;
-	struct list_head urb_remove_list;	/* P: uhci->urb_remove_list_lock */
+	struct list_head urb_remove_list;	/* P: uhci->schedule_lock */
 
 	/* List of URB's awaiting completion callback */
-	spinlock_t complete_list_lock;
-	struct list_head complete_list;		/* P: uhci->complete_list_lock */
+	struct list_head complete_list;		/* P: uhci->schedule_lock */
 
 	int rh_numports;
 
@@ -401,26 +396,15 @@ struct urb_priv {
 /*
  * Locking in uhci.c
  *
- * spinlocks are used extensively to protect the many lists and data
- * structures we have. It's not that pretty, but it's necessary. We
- * need to be done with all of the locks (except complete_list_lock) when
- * we call urb->complete. I've tried to make it simple enough so I don't
- * have to spend hours racking my brain trying to figure out if the
- * locking is safe.
+ * Almost everything relating to the hardware schedule and processing
+ * of URBs is protected by uhci->schedule_lock.  urb->status is protected
+ * by urb->lock; that's the one exception.
  *
- * Here's the safe locking order to prevent deadlocks:
+ * To prevent deadlocks, never lock uhci->schedule_lock while holding
+ * urb->lock.  The safe order of locking is:
  *
- * #1 uhci->urb_list_lock
+ * #1 uhci->schedule_lock
  * #2 urb->lock
- * #3 uhci->urb_remove_list_lock, uhci->frame_list_lock, 
- *   uhci->qh_remove_list_lock
- * #4 uhci->complete_list_lock
- *
- * If you're going to grab 2 or more locks at once, ALWAYS grab the lock
- * at the lowest level FIRST and NEVER grab locks at the same level at the
- * same time.
- * 
- * So, if you need uhci->urb_list_lock, grab it before you grab urb->lock
  */
 
 #endif
--- diff/drivers/usb/input/Kconfig	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/input/Kconfig	2004-04-21 10:45:35.064372904 +0100
@@ -21,7 +21,7 @@ config USB_HID
 	  If unsure, say Y.
 
 	  To compile this driver as a module, choose M here: the
-	  module will be called hid.
+	  module will be called usbhid.
 
 comment "Input core support is needed for USB HID input layer or HIDBP support"
 	depends on USB && INPUT=n
--- diff/drivers/usb/input/Makefile	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/input/Makefile	2004-04-21 10:45:35.064372904 +0100
@@ -3,32 +3,32 @@
 #
 
 # Multipart objects.
-hid-objs	:= hid-core.o
+usbhid-objs	:= hid-core.o
 
 # Optional parts of multipart objects.
 
 ifeq ($(CONFIG_USB_HIDDEV),y)
-	hid-objs        += hiddev.o
+	usbhid-objs	+= hiddev.o
 endif
 ifeq ($(CONFIG_USB_HIDINPUT),y)
-	hid-objs        += hid-input.o
+	usbhid-objs	+= hid-input.o
 endif
 ifeq ($(CONFIG_HID_PID),y)
-	hid-objs	+= pid.o
+	usbhid-objs	+= pid.o
 endif
 ifeq ($(CONFIG_LOGITECH_FF),y)
-	hid-objs	+= hid-lgff.o
+	usbhid-objs	+= hid-lgff.o
 endif
 ifeq ($(CONFIG_THRUSTMASTER_FF),y)
-	hid-objs	+= hid-tmff.o
+	usbhid-objs	+= hid-tmff.o
 endif
 ifeq ($(CONFIG_HID_FF),y)
-	hid-objs	+= hid-ff.o
+	usbhid-objs	+= hid-ff.o
 endif
 
 obj-$(CONFIG_USB_AIPTEK)	+= aiptek.o
 obj-$(CONFIG_USB_ATI_REMOTE)	+= ati_remote.o
-obj-$(CONFIG_USB_HID)		+= hid.o
+obj-$(CONFIG_USB_HID)		+= usbhid.o
 obj-$(CONFIG_USB_KBD)		+= usbkbd.o
 obj-$(CONFIG_USB_KBTAB)		+= kbtab.o
 obj-$(CONFIG_USB_MOUSE)		+= usbmouse.o
--- diff/drivers/usb/input/aiptek.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/input/aiptek.c	2004-04-21 10:45:35.064372904 +0100
@@ -265,7 +265,7 @@ aiptek_probe(struct usb_interface *intf,
 	     const struct usb_device_id *id)
 {
 	struct usb_device *dev = interface_to_usbdev (intf);
-	struct usb_host_interface *interface = intf->altsetting + 0;
+	struct usb_host_interface *interface = intf->cur_altsetting;
 	struct usb_endpoint_descriptor *endpoint;
 	struct aiptek *aiptek;
 	int err = -ENOMEM;
--- diff/drivers/usb/input/ati_remote.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/input/ati_remote.c	2004-04-21 10:45:35.065372752 +0100
@@ -99,7 +99,7 @@
 #define DATA_BUFSIZE      63    /* size of URB data buffers */
 #define ATI_INPUTNUM      1     /* Which input device to register as */
 
-unsigned long channel_mask = 0;
+static unsigned long channel_mask = 0;
 module_param(channel_mask, ulong, 444);
 MODULE_PARM_DESC(channel_mask, "Bitmask of remote control channels to ignore");
 
@@ -139,6 +139,8 @@ static char accel[] = { 1, 2, 4, 6, 9, 1
  */
 #define FILTER_TIME (HZ >> 4)
 
+static DECLARE_MUTEX(disconnect_sem);
+
 struct ati_remote {
 	struct input_dev idev;		
 	struct usb_device *udev;
@@ -286,12 +288,12 @@ static struct usb_driver ati_remote_driv
 static void ati_remote_dump(unsigned char *data, unsigned int len)
 {
 	if ((len == 1) && (data[0] != (unsigned char)0xff) && (data[0] != 0x00))
-		warn("Weird byte 0x%02x\n", data[0]);
+		warn("Weird byte 0x%02x", data[0]);
 	else if (len == 4)
-		warn("Weird key %02x %02x %02x %02x\n", 
+		warn("Weird key %02x %02x %02x %02x", 
 		     data[0], data[1], data[2], data[3]);
 	else
-		warn("Weird data, len=%d %02x %02x %02x %02x %02x %02x ...\n",
+		warn("Weird data, len=%d %02x %02x %02x %02x %02x %02x ...",
 		     len, data[0], data[1], data[2], data[3], data[4], data[5]);
 }
 
@@ -301,9 +303,12 @@ static void ati_remote_dump(unsigned cha
 static int ati_remote_open(struct input_dev *inputdev)
 {
 	struct ati_remote *ati_remote = inputdev->private;
+	int retval = 0;
+
+	down(&disconnect_sem);
 
 	if (ati_remote->open++)
-		return 0;
+		goto exit;
 
 	/* On first open, submit the read urb which was set up previously. */
 	ati_remote->irq_urb->dev = ati_remote->udev;
@@ -311,10 +316,12 @@ static int ati_remote_open(struct input_
 		dev_err(&ati_remote->interface->dev, 
 			"%s: usb_submit_urb failed!\n", __FUNCTION__);
 		ati_remote->open--;
-		return -EIO;
+		retval = -EIO;
 	}
 
-	return 0;
+exit:
+	up(&disconnect_sem);
+	return retval;
 }
 
 /*
@@ -354,8 +361,7 @@ static void ati_remote_irq_out(struct ur
 	
 	ati_remote->send_flags |= SEND_FLAG_COMPLETE;
 	wmb();
-	if (waitqueue_active(&ati_remote->wait))
-		wake_up(&ati_remote->wait);
+	wake_up(&ati_remote->wait);
 }
 
 /*
@@ -377,18 +383,16 @@ static int ati_remote_sendpacket(struct 
 	ati_remote->out_urb->dev = ati_remote->udev;
 	ati_remote->send_flags = SEND_FLAG_IN_PROGRESS;
 
-	set_current_state(TASK_INTERRUPTIBLE);
-	add_wait_queue(&ati_remote->wait, &wait);
-
-	retval = usb_submit_urb(ati_remote->out_urb, GFP_KERNEL);
+	retval = usb_submit_urb(ati_remote->out_urb, GFP_ATOMIC);
 	if (retval) {
-		set_current_state(TASK_RUNNING);
-		remove_wait_queue(&ati_remote->wait, &wait);
 		dev_dbg(&ati_remote->interface->dev, 
 			 "sendpacket: usb_submit_urb failed: %d\n", retval);
 		return retval;
 	}
 
+	set_current_state(TASK_INTERRUPTIBLE);
+	add_wait_queue(&ati_remote->wait, &wait);
+
 	while (timeout && (ati_remote->out_urb->status == -EINPROGRESS) 
 	       && !(ati_remote->send_flags & SEND_FLAG_COMPLETE)) {
 		timeout = schedule_timeout(timeout);
@@ -594,11 +598,7 @@ static void ati_remote_delete(struct ati
 	if (ati_remote->out_urb)
 		usb_unlink_urb(ati_remote->out_urb);
 
-	if (ati_remote->irq_urb)
-		usb_free_urb(ati_remote->irq_urb);
-	
-	if (ati_remote->out_urb)
-		usb_free_urb(ati_remote->out_urb);
+	input_unregister_device(&ati_remote->idev);
 
 	if (ati_remote->inbuf)
 		usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, 
@@ -608,6 +608,12 @@ static void ati_remote_delete(struct ati
 		usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, 
 				ati_remote->inbuf, ati_remote->outbuf_dma);
 	
+	if (ati_remote->irq_urb)
+		usb_free_urb(ati_remote->irq_urb);
+	
+	if (ati_remote->out_urb)
+		usb_free_urb(ati_remote->out_urb);
+
 	kfree(ati_remote);
 }
 
@@ -779,14 +785,14 @@ static int ati_remote_probe(struct usb_i
 
 	usb_set_intfdata(interface, ati_remote);
 	ati_remote->present = 1;	
-	kfree(buf);
-	return 0;
 	
 error:
 	if (buf)
 		kfree(buf);
 
-	ati_remote_delete(ati_remote);
+	if (retval)
+		ati_remote_delete(ati_remote);
+
 	return retval;
 }
 
@@ -796,7 +802,9 @@ error:
 static void ati_remote_disconnect(struct usb_interface *interface)
 {
 	struct ati_remote *ati_remote;
-	
+
+	down(&disconnect_sem);
+
 	ati_remote = usb_get_intfdata(interface);
 	usb_set_intfdata(interface, NULL);
 	if (!ati_remote) {
@@ -804,14 +812,14 @@ static void ati_remote_disconnect(struct
 		return;
 	}
 	
-	input_unregister_device(&ati_remote->idev);
-
 	/* Mark device as unplugged */
 	ati_remote->present = 0;
 
 	/* If device is still open, ati_remote_close will call delete. */
 	if (!ati_remote->open)
 		ati_remote_delete(ati_remote);
+
+	up(&disconnect_sem);
 }
 
 /*
--- diff/drivers/usb/input/hiddev.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/input/hiddev.c	2004-04-21 10:45:35.066372600 +0100
@@ -403,8 +403,8 @@ static int hiddev_ioctl(struct inode *in
 	struct hiddev_collection_info cinfo;
 	struct hiddev_report_info rinfo;
 	struct hiddev_field_info finfo;
-	struct hiddev_usage_ref_multi uref_multi;
-	struct hiddev_usage_ref *uref = &uref_multi.uref;
+	struct hiddev_usage_ref_multi *uref_multi=NULL;
+	struct hiddev_usage_ref *uref;
 	struct hiddev_devinfo dinfo;
 	struct hid_report *report;
 	struct hid_field *field;
@@ -576,26 +576,31 @@ static int hiddev_ioctl(struct inode *in
 		return 0;
 
 	case HIDIOCGUCODE:
-		if (copy_from_user(uref, (void *) arg, sizeof(*uref)))
-			return -EFAULT;
+		uref_multi = kmalloc(sizeof(struct hiddev_usage_ref_multi), GFP_KERNEL);
+		if (!uref_multi)
+			return -ENOMEM;
+		uref = &uref_multi->uref;
+		if (copy_from_user(uref, (void *) arg, sizeof(*uref))) 
+			goto fault;
 
 		rinfo.report_type = uref->report_type;
 		rinfo.report_id = uref->report_id;
 		if ((report = hiddev_lookup_report(hid, &rinfo)) == NULL)
-			return -EINVAL;
+			goto inval;
 
 		if (uref->field_index >= report->maxfield)
-			return -EINVAL;
+			goto inval;
 
 		field = report->field[uref->field_index];
 		if (uref->usage_index >= field->maxusage)
-			return -EINVAL;
+			goto inval;
 
 		uref->usage_code = field->usage[uref->usage_index].hid;
 
 		if (copy_to_user((void *) arg, uref, sizeof(*uref)))
-			return -EFAULT;
+			goto fault;
 
+		kfree(uref_multi);
 		return 0;
 
 	case HIDIOCGUSAGE:
@@ -603,42 +608,46 @@ static int hiddev_ioctl(struct inode *in
 	case HIDIOCGUSAGES:
 	case HIDIOCSUSAGES:
 	case HIDIOCGCOLLECTIONINDEX:
+		uref_multi = kmalloc(sizeof(struct hiddev_usage_ref_multi), GFP_KERNEL);
+		if (!uref_multi)
+			return -ENOMEM;
+		uref = &uref_multi->uref;
 		if (cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) {
-			if (copy_from_user(&uref_multi, (void *) arg, 
+			if (copy_from_user(uref_multi, (void *) arg, 
 					   sizeof(uref_multi)))
-				return -EFAULT;
+				goto fault;
 		} else {
 			if (copy_from_user(uref, (void *) arg, sizeof(*uref)))
-				return -EFAULT;
+				goto fault;
 		}
 
 		if (cmd != HIDIOCGUSAGE && 
 		    cmd != HIDIOCGUSAGES &&
 		    uref->report_type == HID_REPORT_TYPE_INPUT)
-			return -EINVAL;
+			goto inval;
 
 		if (uref->report_id == HID_REPORT_ID_UNKNOWN) {
 			field = hiddev_lookup_usage(hid, uref);
 			if (field == NULL)
-				return -EINVAL;
+				goto inval;
 		} else {
 			rinfo.report_type = uref->report_type;
 			rinfo.report_id = uref->report_id;
 			if ((report = hiddev_lookup_report(hid, &rinfo)) == NULL)
-				return -EINVAL;
+				goto inval;
 
 			if (uref->field_index >= report->maxfield)
-				return -EINVAL;
+				goto inval;
 
 			field = report->field[uref->field_index];
 			if (uref->usage_index >= field->maxusage)
-				return -EINVAL;
+				goto inval;
 
 			if (cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) {
-				if (uref_multi.num_values >= HID_MAX_USAGES || 
+				if (uref_multi->num_values >= HID_MAX_USAGES || 
 				    uref->usage_index >= field->maxusage || 
-				   (uref->usage_index + uref_multi.num_values) >= field->maxusage)
-					return -EINVAL;
+				   (uref->usage_index + uref_multi->num_values) >= field->maxusage)
+					goto inval;
 			}
 		}
 
@@ -646,31 +655,40 @@ static int hiddev_ioctl(struct inode *in
 			case HIDIOCGUSAGE:
 				uref->value = field->value[uref->usage_index];
 				if (copy_to_user((void *) arg, uref, sizeof(*uref)))
-					return -EFAULT;
-				return 0;
+					goto fault;
+				goto goodreturn;
 
 			case HIDIOCSUSAGE:
 				field->value[uref->usage_index] = uref->value;
-				return 0;
+				goto goodreturn;
 
 			case HIDIOCGCOLLECTIONINDEX:
+				kfree(uref_multi);
 				return field->usage[uref->usage_index].collection_index;
 			case HIDIOCGUSAGES:
-				for (i = 0; i < uref_multi.num_values; i++)
-					uref_multi.values[i] = 
+				for (i = 0; i < uref_multi->num_values; i++)
+					uref_multi->values[i] = 
 					    field->value[uref->usage_index + i];
-				if (copy_to_user((void *) arg, &uref_multi, 
-						 sizeof(uref_multi)))
-					return -EFAULT;
-				return 0;
+				if (copy_to_user((void *) arg, uref_multi, 
+						 sizeof(*uref_multi)))
+					goto fault;
+				goto goodreturn;
 			case HIDIOCSUSAGES:
-				for (i = 0; i < uref_multi.num_values; i++)
+				for (i = 0; i < uref_multi->num_values; i++)
 					field->value[uref->usage_index + i] = 
-				  	    uref_multi.values[i];
-				return 0;
+				  	    uref_multi->values[i];
+				goto goodreturn;
 		}
 
+goodreturn:
+		kfree(uref_multi);
 		return 0;
+fault:
+		kfree(uref_multi);
+		return -EFAULT;
+inval:		
+		kfree(uref_multi);
+		return -EINVAL;
 
 	case HIDIOCGCOLLECTIONINFO:
 		if (copy_from_user(&cinfo, (void *) arg, sizeof(cinfo)))
--- diff/drivers/usb/input/kbtab.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/input/kbtab.c	2004-04-21 10:45:35.066372600 +0100
@@ -182,7 +182,7 @@ static int kbtab_probe(struct usb_interf
 	kbtab->dev.dev = &intf->dev;
 	kbtab->usbdev = dev;
 
-	endpoint = &intf->altsetting[0].endpoint[0].desc;
+	endpoint = &intf->cur_altsetting->endpoint[0].desc;
 
 	usb_fill_int_urb(kbtab->irq, dev,
 			 usb_rcvintpipe(dev, endpoint->bEndpointAddress),
--- diff/drivers/usb/input/powermate.c	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/usb/input/powermate.c	2004-04-21 10:45:35.067372448 +0100
@@ -305,7 +305,7 @@ static int powermate_probe(struct usb_in
 	int pipe, maxp;
 	char path[64];
 
-	interface = intf->altsetting + 0;
+	interface = intf->cur_altsetting;
 	endpoint = &interface->endpoint[0].desc;
 	if (!(endpoint->bEndpointAddress & 0x80))
 		return -EIO;
--- diff/drivers/usb/input/wacom.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/input/wacom.c	2004-04-21 10:45:35.067372448 +0100
@@ -698,7 +698,7 @@ static int wacom_probe(struct usb_interf
 	wacom->dev.dev = &intf->dev;
 	wacom->usbdev = dev;
 
-	endpoint = &intf->altsetting[0].endpoint[0].desc;
+	endpoint = &intf->cur_altsetting->endpoint[0].desc;
 
 	if (wacom->features->pktlen > 10)
 		BUG();
--- diff/drivers/usb/input/xpad.c	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/usb/input/xpad.c	2004-04-21 10:45:35.068372296 +0100
@@ -252,7 +252,7 @@ static int xpad_probe(struct usb_interfa
 		return -ENOMEM;
         }
 	
-	ep_irq_in = &intf->altsetting[0].endpoint[0].desc;
+	ep_irq_in = &intf->cur_altsetting->endpoint[0].desc;
 	
 	usb_fill_int_urb(xpad->irq_in, udev,
 			 usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress),
--- diff/drivers/usb/media/Kconfig	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/media/Kconfig	2004-04-21 10:45:35.068372296 +0100
@@ -108,7 +108,7 @@ config USB_OV511
 
 config USB_PWC
 	tristate "USB Philips Cameras"
-	depends on USB && VIDEO_DEV
+	depends on USB && VIDEO_DEV && BROKEN
 	---help---
 	  Say Y or M here if you want to use one of these Philips & OEM
           webcams:
--- diff/drivers/usb/media/vicam.c	2003-10-27 09:20:44.000000000 +0000
+++ source/drivers/usb/media/vicam.c	2004-04-21 10:45:35.069372144 +0100
@@ -612,15 +612,20 @@ vicam_ioctl(struct inode *inode, struct 
 
 	case VIDIOCSPICT:
 		{
-			struct video_picture *vp = (struct video_picture *) arg;
-
-			DBG("VIDIOCSPICT depth = %d, pal = %d\n", vp->depth,
-			    vp->palette);
+			struct video_picture vp;
+			
+			if (copy_from_user(&vp, arg, sizeof(vp))) {
+				retval = -EFAULT;
+				break;
+			}
+			
+			DBG("VIDIOCSPICT depth = %d, pal = %d\n", vp.depth,
+			    vp.palette);
 
-			cam->gain = vp->brightness >> 8;
+			cam->gain = vp.brightness >> 8;
 
-			if (vp->depth != 24
-			    || vp->palette != VIDEO_PALETTE_RGB24)
+			if (vp.depth != 24
+			    || vp.palette != VIDEO_PALETTE_RGB24)
 				retval = -EINVAL;
 
 			break;
@@ -653,12 +658,18 @@ vicam_ioctl(struct inode *inode, struct 
 	case VIDIOCSWIN:
 		{
 
-			struct video_window *vw = (struct video_window *) arg;
-			DBG("VIDIOCSWIN %d x %d\n", vw->width, vw->height);
+			struct video_window vw;
 
-			if ( vw->width != 320 || vw->height != 240 )
+			if (copy_from_user(&vw, arg, sizeof(vw))) {
 				retval = -EFAULT;
+				break;
+			}
+
+			DBG("VIDIOCSWIN %d x %d\n", vw.width, vw.height);
 			
+			if ( vw.width != 320 || vw.height != 240 )
+				retval = -EFAULT;
+
 			break;
 		}
 
@@ -1269,6 +1280,8 @@ static struct usb_driver vicam_driver = 
 
 /**
  *	vicam_probe
+ *	@intf: the interface
+ *	@id: the device id
  *
  *	Called by the usb core when a new device is connected that it thinks
  *	this driver might be interested in.
--- diff/drivers/usb/media/w9968cf.c	2004-03-11 10:20:28.000000000 +0000
+++ source/drivers/usb/media/w9968cf.c	2004-04-21 10:45:35.071371840 +0100
@@ -905,8 +905,7 @@ static void w9968cf_urb_complete(struct 
 	spin_unlock(&cam->urb_lock);
 
 	/* Wake up the user process */
-	if (waitqueue_active(&cam->wait_queue))
-		wake_up_interruptible(&cam->wait_queue);
+	wake_up_interruptible(&cam->wait_queue);
 }
 
 
@@ -2690,6 +2689,7 @@ static int w9968cf_open(struct inode* in
 			up(&cam->dev_sem);
 			return -EWOULDBLOCK;
 		}
+retry:
 		up(&cam->dev_sem);
 		err = wait_event_interruptible(cam->open, cam->disconnected ||
 		                               (cam->users == 0));
@@ -2698,6 +2698,9 @@ static int w9968cf_open(struct inode* in
 		if (cam->disconnected)
 			return -ENODEV;
 		down(&cam->dev_sem);
+		/*recheck - there may be several waiters */
+		if (cam->users)
+			goto retry;
 	}
 
 	DBG(5, "Opening '%s', /dev/video%d ...",
@@ -2758,8 +2761,7 @@ static int w9968cf_release(struct inode*
 	cam->users--;
 	w9968cf_deallocate_memory(cam);
 
-	if (waitqueue_active(&cam->open))
-		wake_up_interruptible(&cam->open);
+	wake_up_interruptible(&cam->open);
 
 	DBG(5, "Video device closed.")
 	up(&cam->dev_sem);
@@ -3371,7 +3373,7 @@ w9968cf_v4l_ioctl(struct inode* inode, s
 		if (copy_from_user(&tuner, arg, sizeof(tuner)))
 			return -EFAULT;
 
-		if (tuner.tuner != 0);
+		if (tuner.tuner != 0)
 			return -EINVAL;
 
 		strcpy(tuner.name, "no_tuner");
--- diff/drivers/usb/misc/Kconfig	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/misc/Kconfig	2004-04-21 10:45:35.071371840 +0100
@@ -108,6 +108,19 @@ config USB_LED
 	  To compile this driver as a module, choose M here: the
 	  module will be called usbled.
 
+config USB_CYTHERM
+	tristate "Cypress USB thermometer driver support"
+	depends on USB
+	help
+	  Say Y here if you want to connect a Cypress USB thermometer
+	  device to your computer's USB port. This device is also known
+	  as the Cypress USB Starter kit or demo board. The Elektor
+	  magazine published a modified version of this device in issue 
+	  #291.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called cytherm.
+
 config USB_SPEEDTOUCH
 	tristate "Alcatel Speedtouch USB support"
 	depends on USB && ATM
--- diff/drivers/usb/misc/Makefile	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/misc/Makefile	2004-04-21 10:45:35.071371840 +0100
@@ -4,8 +4,9 @@
 #
 
 obj-$(CONFIG_USB_AUERSWALD)	+= auerswald.o
-obj-$(CONFIG_USB_EMI62)		+= emi62.o
+obj-$(CONFIG_USB_CYTHERM)	+= cytherm.o
 obj-$(CONFIG_USB_EMI26)		+= emi26.o
+obj-$(CONFIG_USB_EMI62)		+= emi62.o
 obj-$(CONFIG_USB_LCD)		+= usblcd.o
 obj-$(CONFIG_USB_LED)		+= usbled.o
 obj-$(CONFIG_USB_LEGOTOWER)	+= legousbtower.o
--- diff/drivers/usb/misc/speedtch.c	2004-03-11 10:20:28.000000000 +0000
+++ source/drivers/usb/misc/speedtch.c	2004-04-21 10:45:35.073371536 +0100
@@ -84,6 +84,10 @@
 #define VERBOSE_DEBUG
 */
 
+#if !defined (DEBUG) && defined (CONFIG_USB_DEBUG)
+#	define DEBUG
+#endif
+
 #include <linux/usb.h>
 
 #ifdef DEBUG
@@ -102,8 +106,8 @@ static int udsl_print_packet (const unsi
 #endif
 
 #define DRIVER_AUTHOR	"Johan Verrept, Duncan Sands <duncan.sands@free.fr>"
-#define DRIVER_DESC	"Alcatel SpeedTouch USB driver"
-#define DRIVER_VERSION	"1.7"
+#define DRIVER_VERSION	"1.8"
+#define DRIVER_DESC	"Alcatel SpeedTouch USB driver version " DRIVER_VERSION
 
 static const char udsl_driver_name [] = "speedtch";
 
@@ -295,6 +299,19 @@ static struct usb_driver udsl_usb_driver
 };
 
 
+/***********
+**  misc  **
+***********/
+
+static inline void udsl_pop (struct atm_vcc *vcc, struct sk_buff *skb)
+{
+	if (vcc->pop)
+		vcc->pop (vcc, skb);
+	else
+		dev_kfree_skb (skb);
+}
+
+
 /*************
 **  decode  **
 *************/
@@ -716,10 +733,7 @@ made_progress:
 	if (!UDSL_SKB (skb)->num_cells) {
 		struct atm_vcc *vcc = UDSL_SKB (skb)->atm_data.vcc;
 
-		if (vcc->pop)
-			vcc->pop (vcc, skb);
-		else
-			dev_kfree_skb (skb);
+		udsl_pop (vcc, skb);
 		instance->current_skb = NULL;
 
 		atomic_inc (&vcc->stats->tx);
@@ -738,10 +752,7 @@ static void udsl_cancel_send (struct uds
 		if (UDSL_SKB (skb)->atm_data.vcc == vcc) {
 			dbg ("udsl_cancel_send: popping skb 0x%p", skb);
 			__skb_unlink (skb, &instance->sndqueue);
-			if (vcc->pop)
-				vcc->pop (vcc, skb);
-			else
-				dev_kfree_skb (skb);
+			udsl_pop (vcc, skb);
 		}
 	spin_unlock_irq (&instance->sndqueue.lock);
 
@@ -749,10 +760,7 @@ static void udsl_cancel_send (struct uds
 	if ((skb = instance->current_skb) && (UDSL_SKB (skb)->atm_data.vcc == vcc)) {
 		dbg ("udsl_cancel_send: popping current skb (0x%p)", skb);
 		instance->current_skb = NULL;
-		if (vcc->pop)
-			vcc->pop (vcc, skb);
-		else
-			dev_kfree_skb (skb);
+		udsl_pop (vcc, skb);
 	}
 	tasklet_enable (&instance->send_tasklet);
 	dbg ("udsl_cancel_send done");
@@ -761,22 +769,26 @@ static void udsl_cancel_send (struct uds
 static int udsl_atm_send (struct atm_vcc *vcc, struct sk_buff *skb)
 {
 	struct udsl_instance_data *instance = vcc->dev->dev_data;
+	int err;
 
 	vdbg ("udsl_atm_send called (skb 0x%p, len %u)", skb, skb->len);
 
 	if (!instance || !instance->usb_dev) {
 		dbg ("udsl_atm_send: NULL data!");
-		return -ENODEV;
+		err = -ENODEV;
+		goto fail;
 	}
 
 	if (vcc->qos.aal != ATM_AAL5) {
 		dbg ("udsl_atm_send: unsupported ATM type %d!", vcc->qos.aal);
-		return -EINVAL;
+		err = -EINVAL;
+		goto fail;
 	}
 
 	if (skb->len > ATM_MAX_AAL5_PDU) {
 		dbg ("udsl_atm_send: packet too long (%d vs %d)!", skb->len, ATM_MAX_AAL5_PDU);
-		return -EINVAL;
+		err = -EINVAL;
+		goto fail;
 	}
 
 	PACKETDEBUG (skb->data, skb->len);
@@ -786,6 +798,10 @@ static int udsl_atm_send (struct atm_vcc
 	tasklet_schedule (&instance->send_tasklet);
 
 	return 0;
+
+fail:
+	udsl_pop (vcc, skb);
+	return err;
 }
 
 
@@ -1331,6 +1347,7 @@ module_exit (udsl_usb_cleanup);
 MODULE_AUTHOR (DRIVER_AUTHOR);
 MODULE_DESCRIPTION (DRIVER_DESC);
 MODULE_LICENSE ("GPL");
+MODULE_VERSION (DRIVER_VERSION);
 
 
 /************
--- diff/drivers/usb/misc/usbtest.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/misc/usbtest.c	2004-04-21 10:45:35.074371384 +0100
@@ -1169,7 +1169,8 @@ static int test_halt (int ep, struct urb
 
 	/* set halt (protocol test only), verify it worked */
 	retval = usb_control_msg (urb->dev, usb_sndctrlpipe (urb->dev, 0),
-			USB_REQ_SET_FEATURE, USB_RECIP_ENDPOINT, 0, ep,
+			USB_REQ_SET_FEATURE, USB_RECIP_ENDPOINT,
+			USB_ENDPOINT_HALT, ep,
 			NULL, 0, HZ * USB_CTRL_SET_TIMEOUT);
 	if (retval < 0) {
 		dbg ("ep %02x couldn't set halt, %d", ep, retval);
--- diff/drivers/usb/net/Kconfig	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/net/Kconfig	2004-04-21 10:45:35.075371232 +0100
@@ -69,7 +69,7 @@ config USB_KAWETH
 
 config USB_PEGASUS
 	tristate "USB Pegasus/Pegasus-II based ethernet device support"
-	depends on USB && NET_ETHERNET
+	depends on USB && NET
 	select MII
 	---help---
 	  Say Y here if you know you have Pegasus or Pegasus-II based adapter.
--- diff/drivers/usb/net/rtl8150.c	2004-03-11 10:20:28.000000000 +0000
+++ source/drivers/usb/net/rtl8150.c	2004-04-21 10:45:35.075371232 +0100
@@ -20,7 +20,7 @@
 #include <asm/uaccess.h>
 
 /* Version Information */
-#define DRIVER_VERSION "v0.5.7 (2002/12/31)"
+#define DRIVER_VERSION "v0.6.1 (2004/03/13)"
 #define DRIVER_AUTHOR "Petko Manolov <petkan@users.sourceforge.net>"
 #define DRIVER_DESC "rtl8150 based usb-ethernet driver"
 
@@ -43,6 +43,8 @@
 #define	ANAR			0x0144
 #define	ANLP			0x0146
 #define	AER			0x0148
+#define CSCR			0x014C  /* This one has the link status */
+#define CSCR_LINK_STATUS	(1 << 3)
 
 #define	IDR_EEPROM		0x1202
 
@@ -58,6 +60,60 @@
 #define	RTL8150_REQ_GET_REGS	0x05
 #define	RTL8150_REQ_SET_REGS	0x05
 
+
+/* Transmit status register errors */
+#define TSR_ECOL		(1<<5)
+#define TSR_LCOL		(1<<4)
+#define TSR_LOSS_CRS		(1<<3)
+#define TSR_JBR			(1<<2)
+#define TSR_ERRORS		(TSR_ECOL | TSR_LCOL | TSR_LOSS_CRS | TSR_JBR)
+/* Receive status register errors */
+#define RSR_CRC			(1<<2)
+#define RSR_FAE			(1<<1)
+#define RSR_ERRORS		(RSR_CRC | RSR_FAE)
+
+/* Media status register definitions */
+#define MSR_DUPLEX		(1<<4)
+#define MSR_SPEED		(1<<3)
+#define MSR_LINK		(1<<2)
+
+/* Interrupt pipe data */
+#define INT_TSR			0x00
+#define INT_RSR			0x01
+#define INT_MSR			0x02
+#define INT_WAKSR		0x03
+#define INT_TXOK_CNT		0x04
+#define INT_RXLOST_CNT		0x05
+#define INT_CRERR_CNT		0x06
+#define INT_COL_CNT		0x07
+
+/* Transmit status register errors */
+#define TSR_ECOL		(1<<5)
+#define TSR_LCOL		(1<<4)
+#define TSR_LOSS_CRS		(1<<3)
+#define TSR_JBR			(1<<2)
+#define TSR_ERRORS		(TSR_ECOL | TSR_LCOL | TSR_LOSS_CRS | TSR_JBR)
+/* Receive status register errors */
+#define RSR_CRC			(1<<2)
+#define RSR_FAE			(1<<1)
+#define RSR_ERRORS		(RSR_CRC | RSR_FAE)
+
+/* Media status register definitions */
+#define MSR_DUPLEX		(1<<4)
+#define MSR_SPEED		(1<<3)
+#define MSR_LINK		(1<<2)
+
+/* Interrupt pipe data */
+#define INT_TSR			0x00
+#define INT_RSR			0x01
+#define INT_MSR			0x02
+#define INT_WAKSR		0x03
+#define INT_TXOK_CNT		0x04
+#define INT_RXLOST_CNT		0x05
+#define INT_CRERR_CNT		0x06
+#define INT_COL_CNT		0x07
+
+
 #define	RTL8150_MTU		1540
 #define	RTL8150_TX_TIMEOUT	(HZ)
 #define	RX_SKB_POOL_SIZE	4
@@ -71,9 +127,13 @@
 /* Define these values to match your device */
 #define VENDOR_ID_REALTEK		0x0bda
 #define	VENDOR_ID_MELCO			0x0411
+#define VENDOR_ID_MICRONET		0x3980
+#define	VENDOR_ID_LONGSHINE		0x07b8
 
 #define PRODUCT_ID_RTL8150		0x8150
 #define	PRODUCT_ID_LUAKTX		0x0012
+#define	PRODUCT_ID_LCS8138TX		0x401a
+#define PRODUCT_ID_SP128AR		0x0003
 
 #undef	EEPROM_WRITE
 
@@ -81,6 +141,8 @@
 static struct usb_device_id rtl8150_table[] = {
 	{USB_DEVICE(VENDOR_ID_REALTEK, PRODUCT_ID_RTL8150)},
 	{USB_DEVICE(VENDOR_ID_MELCO, PRODUCT_ID_LUAKTX)},
+	{USB_DEVICE(VENDOR_ID_MICRONET, PRODUCT_ID_SP128AR)},
+	{USB_DEVICE(VENDOR_ID_LONGSHINE, PRODUCT_ID_LCS8138TX)},
 	{}
 };
 
@@ -368,6 +430,9 @@ static void read_bulk_callback(struct ur
 
 	if (!dev->rx_skb)
 		goto resched;
+	/* protect against short packets (tell me why we got some?!?) */
+	if (urb->actual_length < 4)
+		goto goon;
 
 	res = urb->actual_length;
 	rx_stat = le16_to_cpu(*(short *)(urb->transfer_buffer + res - 4));
@@ -454,6 +519,7 @@ static void write_bulk_callback(struct u
 void intr_callback(struct urb *urb, struct pt_regs *regs)
 {
 	rtl8150_t *dev;
+	__u8 *d;
 	int status;
 
 	dev = urb->context;
@@ -472,7 +538,28 @@ void intr_callback(struct urb *urb, stru
 		goto resubmit;
 	}
 
-	/* FIXME if this doesn't do anything, don't submit the urb! */
+	d = urb->transfer_buffer;
+	if (d[0] & TSR_ERRORS) {
+		dev->stats.tx_errors++;
+		if (d[INT_TSR] & (TSR_ECOL | TSR_JBR))
+			dev->stats.tx_aborted_errors++;
+		if (d[INT_TSR] & TSR_LCOL)
+			dev->stats.tx_window_errors++;
+		if (d[INT_TSR] & TSR_LOSS_CRS)
+			dev->stats.tx_carrier_errors++;
+	}
+	/* Report link status changes to the network stack */
+	if ((d[INT_MSR] & MSR_LINK) == 0) {
+		if (netif_carrier_ok(dev->netdev)) {
+			netif_carrier_off(dev->netdev);
+			dbg("%s: LINK LOST\n", __func__);
+		}
+	} else {
+		if (!netif_carrier_ok(dev->netdev)) {
+			netif_carrier_on(dev->netdev);
+			dbg("%s: LINK CAME BACK\n", __func__);
+		}
+	}
 
 resubmit:
 	status = usb_submit_urb (urb, SLAB_ATOMIC);
@@ -482,6 +569,7 @@ resubmit:
 				dev->udev->devpath, status);
 }
 
+
 /*
 **
 **	network related part of the code
@@ -538,7 +626,7 @@ static int enable_net_traffic(rtl8150_t 
 		warn("%s - device reset failed", __FUNCTION__);
 	}
 	/* RCR bit7=1 attach Rx info at the end;  =0 HW CRC (which is broken) */
-	rcr = 0x9e;	/* bit7=1 attach Rx info at the end */
+	rcr = 0x9e;
 	dev->rx_creg = cpu_to_le16(rcr);
 	tcr = 0xd8;
 	cr = 0x0c;
@@ -626,6 +714,19 @@ static int rtl8150_start_xmit(struct sk_
 	return 0;
 }
 
+
+static void set_carrier(struct net_device *netdev)
+{
+	rtl8150_t *dev = netdev->priv;
+	short tmp;
+
+	get_registers(dev, CSCR, 2, &tmp);
+	if (tmp & CSCR_LINK_STATUS)
+		netif_carrier_on(netdev);
+	else
+		netif_carrier_off(netdev);
+}
+
 static int rtl8150_open(struct net_device *netdev)
 {
 	rtl8150_t *dev;
@@ -653,6 +754,7 @@ static int rtl8150_open(struct net_devic
 		warn("%s: intr_urb submit failed: %d", __FUNCTION__, res);
 	netif_start_queue(netdev);
 	enable_net_traffic(dev);
+	set_carrier(netdev);
 
 	return res;
 }
@@ -674,7 +776,7 @@ static int rtl8150_close(struct net_devi
 	return res;
 }
 
-static int rtl8150_ethtool_ioctl(struct net_device *netdev, void __user *uaddr)
+static int rtl8150_ethtool_ioctl(struct net_device *netdev, void *uaddr)
 {
 	rtl8150_t *dev;
 	int cmd;
@@ -759,7 +861,7 @@ static int rtl8150_ioctl(struct net_devi
 
 	switch (cmd) {
 	case SIOCETHTOOL:
-		res = rtl8150_ethtool_ioctl(netdev, (void __user *)rq->ifr_data);
+		res = rtl8150_ethtool_ioctl(netdev, rq->ifr_data);
 		break;
 	case SIOCDEVPRIVATE:
 		data[0] = dev->phy;
@@ -774,6 +876,7 @@ static int rtl8150_ioctl(struct net_devi
 	default:
 		res = -EOPNOTSUPP;
 	}
+
 	return res;
 }
 
@@ -796,7 +899,6 @@ static int rtl8150_probe(struct usb_inte
 		kfree(dev);
 		return -ENOMEM;
 	}
-
 	netdev = alloc_etherdev(0);
 	if (!netdev) {
 		kfree(dev->intr_buff);
@@ -837,7 +939,6 @@ static int rtl8150_probe(struct usb_inte
 	info("%s: rtl8150 is detected", netdev->name);
 	
 	usb_set_intfdata(intf, dev);
-
 	SET_NETDEV_DEV(netdev, &intf->dev);
 	if (register_netdev(netdev) != 0) {
 		err("couldn't register the device");
--- diff/drivers/usb/net/usbnet.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/net/usbnet.c	2004-04-21 10:45:35.077370928 +0100
@@ -3104,7 +3104,7 @@ usbnet_probe (struct usb_interface *udev
 
 	}
 	if (status < 0)
-		goto out2;
+		goto out1;
 
 	dev->maxpacket = usb_maxpacket (dev->udev, dev->out, 1);
 	
@@ -3127,7 +3127,6 @@ usbnet_probe (struct usb_interface *udev
 out3:
 	if (info->unbind)
 		info->unbind (dev, udev);
-out2:
 	free_netdev(net);
 out1:
 	kfree(dev);
@@ -3414,9 +3413,7 @@ static int __init usbnet_init (void)
 			< sizeof (struct cdc_state)));
 #endif
 
-	get_random_bytes (node_id, sizeof node_id);
-	node_id [0] &= 0xfe;	// clear multicast bit
-	node_id [0] |= 0x02;    // set local assignment bit (IEEE802)
+	random_ether_addr(node_id);
 
  	return usb_register(&usbnet_driver);
 }
--- diff/drivers/usb/serial/ftdi_sio.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/serial/ftdi_sio.c	2004-04-21 10:45:35.078370776 +0100
@@ -17,6 +17,9 @@
  * See http://ftdi-usb-sio.sourceforge.net for upto date testing info
  *	and extra documentation
  *
+ * (26/Mar/2004) Jan Capek
+ *      Added PID's for ICD-U20/ICD-U40 - incircuit PIC debuggers from CCS Inc.
+ *
  * (09/Feb/2004) Ian Abbott
  *      Changed full name of USB-UIRT device to avoid "/" character.
  *      Added FTDI's alternate PID (0x6006) for FT232/245 devices.
@@ -354,6 +357,7 @@ static struct usb_device_id id_table_8U2
 	{ USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_3, 0, 0x3ff) },
 	{ USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_4, 0, 0x3ff) },
 	{ USB_DEVICE_VER(FTDI_VID, FTDI_ELV_UO100_PID, 0, 0x3ff) },
+	{ USB_DEVICE_VER(FTDI_VID, INSIDE_ACCESSO, 0, 0x3ff) },
 	{ }						/* Terminating entry */
 };
 
@@ -435,7 +439,32 @@ static struct usb_device_id id_table_FT2
 	{ USB_DEVICE_VER(FTDI_VID, PROTEGO_R2X0, 0x400, 0xffff) },
 	{ USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_3, 0x400, 0xffff) },
 	{ USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_4, 0x400, 0xffff) },
+	{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E808_PID, 0x400, 0xffff) },
+	{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E809_PID, 0x400, 0xffff) },
+	{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80A_PID, 0x400, 0xffff) },
+	{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80B_PID, 0x400, 0xffff) },
+	{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80C_PID, 0x400, 0xffff) },
+	{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80D_PID, 0x400, 0xffff) },
+	{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80E_PID, 0x400, 0xffff) },
+	{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80F_PID, 0x400, 0xffff) },
+	{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E888_PID, 0x400, 0xffff) },
+	{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E889_PID, 0x400, 0xffff) },
+	{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88A_PID, 0x400, 0xffff) },
+	{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88B_PID, 0x400, 0xffff) },
+	{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88C_PID, 0x400, 0xffff) },
+	{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88D_PID, 0x400, 0xffff) },
+	{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88E_PID, 0x400, 0xffff) },
+	{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88F_PID, 0x400, 0xffff) },
 	{ USB_DEVICE_VER(FTDI_VID, FTDI_ELV_UO100_PID, 0x400, 0xffff) },
+ 	{ USB_DEVICE_VER(FTDI_VID, LINX_SDMUSBQSS_PID, 0x400, 0xffff) },
+ 	{ USB_DEVICE_VER(FTDI_VID, LINX_MASTERDEVEL2_PID, 0x400, 0xffff) },
+ 	{ USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_0_PID, 0x400, 0xffff) },
+ 	{ USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_1_PID, 0x400, 0xffff) },
+ 	{ USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_2_PID, 0x400, 0xffff) },
+	{ USB_DEVICE(FTDI_VID, FTDI_CCSICDU20_0_PID) },
+	{ USB_DEVICE(FTDI_VID, FTDI_CCSICDU40_1_PID) },
+ 	{ USB_DEVICE(FTDI_VID, FTDI_CCSICDU20_0_PID) },
+ 	{ USB_DEVICE(FTDI_VID, FTDI_CCSICDU40_1_PID) },
 	{ }						/* Terminating entry */
 };
 
@@ -532,6 +561,12 @@ static struct usb_device_id id_table_com
 	{ USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_3) },
 	{ USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_4) },
 	{ USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) },
+ 	{ USB_DEVICE_VER(FTDI_VID, LINX_SDMUSBQSS_PID, 0x400, 0xffff) },
+ 	{ USB_DEVICE_VER(FTDI_VID, LINX_MASTERDEVEL2_PID, 0x400, 0xffff) },
+ 	{ USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_0_PID, 0x400, 0xffff) },
+ 	{ USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_1_PID, 0x400, 0xffff) },
+ 	{ USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_2_PID, 0x400, 0xffff) },
+	{ USB_DEVICE(FTDI_VID, INSIDE_ACCESSO) },
 	{ }						/* Terminating entry */
 };
 
@@ -789,8 +824,14 @@ static __u32 ftdi_232bm_baud_to_divisor(
 static int set_rts(struct usb_serial_port *port, int high_or_low)
 {
 	struct ftdi_private *priv = usb_get_serial_port_data(port);
-	char buf[1];
+	char *buf;
 	unsigned ftdi_high_or_low;
+	int rv;
+	
+	buf = kmalloc(1, GFP_NOIO);
+	if (!buf)
+		return -ENOMEM;
+	
 	if (high_or_low) {
 		ftdi_high_or_low = FTDI_SIO_SET_RTS_HIGH;
 		priv->last_dtr_rts |= TIOCM_RTS;
@@ -798,20 +839,29 @@ static int set_rts(struct usb_serial_por
 		ftdi_high_or_low = FTDI_SIO_SET_RTS_LOW;
 		priv->last_dtr_rts &= ~TIOCM_RTS;
 	}
-	return(usb_control_msg(port->serial->dev,
+	rv = usb_control_msg(port->serial->dev,
 			       usb_sndctrlpipe(port->serial->dev, 0),
 			       FTDI_SIO_SET_MODEM_CTRL_REQUEST, 
 			       FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE,
 			       ftdi_high_or_low, 0, 
-			       buf, 0, WDR_TIMEOUT));
+			       buf, 0, WDR_TIMEOUT);
+
+	kfree(buf);
+	return rv;
 }
 
 
 static int set_dtr(struct usb_serial_port *port, int high_or_low)
 {
 	struct ftdi_private *priv = usb_get_serial_port_data(port);
-	char buf[1];
+	char *buf;
 	unsigned ftdi_high_or_low;
+	int rv;
+	
+	buf = kmalloc(1, GFP_NOIO);
+	if (!buf)
+		return -ENOMEM;
+
 	if (high_or_low) {
 		ftdi_high_or_low = FTDI_SIO_SET_DTR_HIGH;
 		priv->last_dtr_rts |= TIOCM_DTR;
@@ -819,12 +869,15 @@ static int set_dtr(struct usb_serial_por
 		ftdi_high_or_low = FTDI_SIO_SET_DTR_LOW;
 		priv->last_dtr_rts &= ~TIOCM_DTR;
 	}
-	return(usb_control_msg(port->serial->dev,
+	rv = usb_control_msg(port->serial->dev,
 			       usb_sndctrlpipe(port->serial->dev, 0),
 			       FTDI_SIO_SET_MODEM_CTRL_REQUEST, 
 			       FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE,
 			       ftdi_high_or_low, 0, 
-			       buf, 0, WDR_TIMEOUT));
+			       buf, 0, WDR_TIMEOUT);
+
+	kfree(buf);
+	return rv;
 }
 
 
@@ -833,21 +886,29 @@ static __u32 get_ftdi_divisor(struct usb
 
 static int change_speed(struct usb_serial_port *port)
 {
-	char buf[1];
+	char *buf;
         __u16 urb_value;
 	__u16 urb_index;
 	__u32 urb_index_value;
+	int rv;
+
+	buf = kmalloc(1, GFP_NOIO);
+	if (!buf)
+		return -ENOMEM;
 
 	urb_index_value = get_ftdi_divisor(port);
 	urb_value = (__u16)urb_index_value;
 	urb_index = (__u16)(urb_index_value >> 16);
 	
-	return (usb_control_msg(port->serial->dev,
+	rv = usb_control_msg(port->serial->dev,
 			    usb_sndctrlpipe(port->serial->dev, 0),
 			    FTDI_SIO_SET_BAUDRATE_REQUEST,
 			    FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE,
 			    urb_value, urb_index,
-			    buf, 0, 100) < 0);
+			    buf, 0, 100);
+
+	kfree(buf);
+	return rv;
 }
 
 
@@ -1309,15 +1370,16 @@ static void ftdi_close (struct usb_seria
 			/* drop RTS */
 			if (set_rts(port, LOW) < 0) {
 				err("Error from RTS LOW urb");
-			}	
-			/* shutdown our bulk read */
-			if (port->read_urb) {
-				usb_unlink_urb (port->read_urb);	
 			}
-			/* unlink the running write urbs */
-			
+		} /* Note change no line if hupcl is off */
+		
+		/* shutdown our bulk read */
+		if (port->read_urb) {
+			if (usb_unlink_urb (port->read_urb) < 0) {
+				err("Error unlinking read urb");
+			}
+		}
 
-		} /* Note change no line is hupcl is off */
 	} /* if (serial->dev) */
 
 
--- diff/drivers/usb/serial/ftdi_sio.h	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/serial/ftdi_sio.h	2004-04-21 10:45:35.079370624 +0100
@@ -160,7 +160,44 @@
 #define PROTEGO_SPECIAL_1	0xFC70	/* special/unknown device */
 #define PROTEGO_R2X0		0xFC71	/* R200-USB TRNG unit (R210, R220, and R230) */
 #define PROTEGO_SPECIAL_3	0xFC72	/* special/unknown device */
-#define PROTEGO_SPECIAL_4	0xFC73	/* special/unknown device */ 
+#define PROTEGO_SPECIAL_4	0xFC73	/* special/unknown device */
+
+/*
+ * Gude Analog- und Digitalsysteme GmbH
+ */
+#define FTDI_GUDEADS_E808_PID    0xE808
+#define FTDI_GUDEADS_E809_PID    0xE809
+#define FTDI_GUDEADS_E80A_PID    0xE80A
+#define FTDI_GUDEADS_E80B_PID    0xE80B
+#define FTDI_GUDEADS_E80C_PID    0xE80C
+#define FTDI_GUDEADS_E80D_PID    0xE80D
+#define FTDI_GUDEADS_E80E_PID    0xE80E
+#define FTDI_GUDEADS_E80F_PID    0xE80F
+#define FTDI_GUDEADS_E888_PID    0xE888  /* Expert ISDN Control USB */
+#define FTDI_GUDEADS_E889_PID    0xE889  /* USB RS-232 OptoBridge */
+#define FTDI_GUDEADS_E88A_PID    0xE88A
+#define FTDI_GUDEADS_E88B_PID    0xE88B
+#define FTDI_GUDEADS_E88C_PID    0xE88C
+#define FTDI_GUDEADS_E88D_PID    0xE88D
+#define FTDI_GUDEADS_E88E_PID    0xE88E
+#define FTDI_GUDEADS_E88F_PID    0xE88F
+
+/*
+ * Linx Technologies product ids
+ */
+#define LINX_SDMUSBQSS_PID	0xF448	/* Linx SDM-USB-QS-S */
+#define LINX_MASTERDEVEL2_PID   0xF449   /* Linx Master Development 2.0 */
+#define LINX_FUTURE_0_PID   0xF44A   /* Linx future device */
+#define LINX_FUTURE_1_PID   0xF44B   /* Linx future device */
+#define LINX_FUTURE_2_PID   0xF44C   /* Linx future device */
+#define FTDI_GUDEADS_889_PID    0xe889  /* USB RS323 OptoBridge */ 
+/* CCS Inc. ICDU/ICDU40 product ID - the FT232BM is used in an in-circuit-debugger */
+/* unit for PIC16's/PIC18's */
+#define FTDI_CCSICDU20_0_PID    0xF9D0     
+#define FTDI_CCSICDU40_1_PID    0xF9D1     
+
+/* Inside Accesso contactless reader (http://www.insidefr.com) */
+#define INSIDE_ACCESSO		0xFAD0
 
 /* Commands */
 #define FTDI_SIO_RESET 		0 /* Reset the port */
--- diff/drivers/usb/serial/io_ti.c	2003-09-17 12:28:11.000000000 +0100
+++ source/drivers/usb/serial/io_ti.c	2004-04-21 10:45:35.080370472 +0100
@@ -274,7 +274,7 @@ static int TIPurgeDataSync (struct usb_s
 /**
  * TIReadDownloadMemory - Read edgeport memory from TI chip
  * @dev: usb device pointer
- * @address: Device CPU address at which to read
+ * @start_address: Device CPU address at which to read
  * @length: Length of above data
  * @address_type: Can read both XDATA and I2C
  * @buffer: pointer to input data buffer
--- diff/drivers/usb/serial/kobil_sct.c	2004-02-18 08:54:12.000000000 +0000
+++ source/drivers/usb/serial/kobil_sct.c	2004-04-21 10:45:35.081370320 +0100
@@ -262,7 +262,7 @@ static int kobil_open (struct usb_serial
 	// allocate memory for transfer buffer
 	transfer_buffer = (unsigned char *) kmalloc(transfer_buffer_length, GFP_KERNEL);  
 	if (! transfer_buffer) {
-		return -1;
+		return -ENOMEM;
 	} else {
 		memset(transfer_buffer, 0, transfer_buffer_length);
 	}
@@ -274,7 +274,7 @@ static int kobil_open (struct usb_serial
 		if (!port->write_urb) {
 			dbg("%s - port %d usb_alloc_urb failed", __FUNCTION__, port->number);
 			kfree(transfer_buffer);
-			return -1;
+			return -ENOMEM;
 		}
 	}
 
@@ -282,7 +282,9 @@ static int kobil_open (struct usb_serial
 	port->write_urb->transfer_buffer = (unsigned char *) kmalloc(write_urb_transfer_buffer_length, GFP_KERNEL);
 	if (! port->write_urb->transfer_buffer) {
 		kfree(transfer_buffer);
-		return -1;
+		usb_free_urb(port->write_urb);
+		port->write_urb = NULL;
+		return -ENOMEM;
 	} 
 
 	// get hardware version
@@ -503,7 +505,7 @@ static int kobil_write (struct usb_seria
 
 static int kobil_write_room (struct usb_serial_port *port)
 {
-	//dbg(__FUNCTION__ " - port %d", port->number);
+	//dbg("%s - port %d", __FUNCTION__, port->number);
 	return 8;
 }
 
--- diff/drivers/usb/serial/omninet.c	2003-09-17 12:28:11.000000000 +0100
+++ source/drivers/usb/serial/omninet.c	2004-04-21 10:45:35.081370320 +0100
@@ -61,11 +61,12 @@
  * Version Information
  */
 #define DRIVER_VERSION "v1.1"
-#define DRIVER_AUTHOR "Anonymous"
+#define DRIVER_AUTHOR "Alessandro Zummo"
 #define DRIVER_DESC "USB ZyXEL omni.net LCD PLUS Driver"
 
 #define ZYXEL_VENDOR_ID		0x0586
 #define ZYXEL_OMNINET_ID	0x1000
+#define BT_IGNITIONPRO_ID	0x2000  /* This one seems to be a re-branded ZyXEL device */
 
 /* function prototypes */
 static int  omninet_open		(struct usb_serial_port *port, struct file *filp);
@@ -78,6 +79,7 @@ static void omninet_shutdown		(struct us
 
 static struct usb_device_id id_table [] = {
 	{ USB_DEVICE(ZYXEL_VENDOR_ID, ZYXEL_OMNINET_ID) },
+	{ USB_DEVICE(ZYXEL_VENDOR_ID, BT_IGNITIONPRO_ID) },
 	{ }						/* Terminating entry */
 };
 
--- diff/drivers/usb/serial/pl2303.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/serial/pl2303.c	2004-04-21 10:45:35.082370168 +0100
@@ -116,6 +116,7 @@ static struct usb_driver pl2303_driver =
 #define VENDOR_READ_REQUEST		0x01
 
 #define UART_STATE			0x08
+#define UART_STATE_TRANSIENT_MASK	0x74
 #define UART_DCD			0x01
 #define UART_DSR			0x02
 #define UART_BREAK_ERROR		0x04
@@ -212,6 +213,9 @@ static int pl2303_write (struct usb_seri
 
 	dbg("%s - port %d, %d bytes", __FUNCTION__, port->number, count);
 
+	if (!count)
+		return count;
+
 	if (port->write_urb->status == -EINPROGRESS) {
 		dbg("%s - already writing", __FUNCTION__);
 		return 0;
@@ -662,6 +666,7 @@ static void pl2303_read_int_callback (st
 	unsigned char *data = urb->transfer_buffer;
 	unsigned long flags;
 	int status;
+	u8 uart_state;
 
 	dbg("%s (%d)", __FUNCTION__, port->number);
 
@@ -690,8 +695,10 @@ static void pl2303_read_int_callback (st
 		goto exit;
 
 	/* Save off the uart status for others to look at */
+	uart_state = data[UART_STATE];
 	spin_lock_irqsave(&priv->lock, flags);
-	priv->line_status = data[UART_STATE];
+	uart_state |= (priv->line_status & UART_STATE_TRANSIENT_MASK);
+	priv->line_status = uart_state;
 	spin_unlock_irqrestore(&priv->lock, flags);
 		
 exit:
@@ -752,6 +759,7 @@ static void pl2303_read_bulk_callback (s
 
 	spin_lock_irqsave(&priv->lock, flags);
 	status = priv->line_status;
+	priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
 	spin_unlock_irqrestore(&priv->lock, flags);
 	wake_up_interruptible (&priv->delta_msr_wait);
 
--- diff/drivers/usb/serial/visor.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/serial/visor.c	2004-04-21 10:45:35.083370016 +0100
@@ -189,6 +189,7 @@ static void visor_read_bulk_callback	(st
 static void visor_read_int_callback	(struct urb *urb, struct pt_regs *regs);
 static int  clie_3_5_startup	(struct usb_serial *serial);
 static int  treo_attach		(struct usb_serial *serial);
+static int clie_5_attach (struct usb_serial *serial);
 static int palm_os_3_probe (struct usb_serial *serial, const struct usb_device_id *id);
 static int palm_os_4_probe (struct usb_serial *serial, const struct usb_device_id *id);
 
@@ -231,8 +232,6 @@ static struct usb_device_id id_table [] 
 		.driver_info = (kernel_ulong_t)&palm_os_4_probe },
 	{ USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NX60_ID),
 		.driver_info = (kernel_ulong_t)&palm_os_4_probe },
-	{ USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_UX50_ID),
-		.driver_info = (kernel_ulong_t)&palm_os_4_probe },
 	{ USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NZ90V_ID),
 		.driver_info = (kernel_ulong_t)&palm_os_4_probe },
 	{ USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_TJ25_ID),
@@ -249,6 +248,13 @@ static struct usb_device_id id_table [] 
 	{ }					/* Terminating entry */
 };
 
+static struct usb_device_id clie_id_5_table [] = {
+	{ USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_UX50_ID),
+		.driver_info = (kernel_ulong_t)&palm_os_4_probe },
+	{ },					/* optional parameter entry */
+	{ }					/* Terminating entry */
+};
+
 static struct usb_device_id clie_id_3_5_table [] = {
 	{ USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_3_5_ID) },
 	{ }					/* Terminating entry */
@@ -322,6 +328,34 @@ static struct usb_serial_device_type han
 	.read_int_callback =	visor_read_int_callback,
 };
 
+/* All of the device info needed for the Clie UX50, TH55 Palm 5.0 devices */
+static struct usb_serial_device_type clie_5_device = {
+	.owner =		THIS_MODULE,
+	.name =			"Sony Clie 5.0",
+	.short_name =		"clie_5",
+	.id_table =		clie_id_5_table,
+	.num_interrupt_in =	NUM_DONT_CARE,
+	.num_bulk_in =		2,
+	.num_bulk_out =		2,
+	.num_ports =		2,
+	.open =			visor_open,
+	.close =		visor_close,
+	.throttle =		visor_throttle,
+	.unthrottle =		visor_unthrottle,
+	.attach =		clie_5_attach,
+	.probe =		visor_probe,
+	.calc_num_ports =	visor_calc_num_ports,
+	.shutdown =		visor_shutdown,
+	.ioctl =		visor_ioctl,
+	.set_termios =		visor_set_termios,
+	.write =		visor_write,
+	.write_room =		visor_write_room,
+	.chars_in_buffer =	visor_chars_in_buffer,
+	.write_bulk_callback =	visor_write_bulk_callback,
+	.read_bulk_callback =	visor_read_bulk_callback,
+	.read_int_callback =	visor_read_int_callback,
+};
+
 /* device info for the Sony Clie OS version 3.5 */
 static struct usb_serial_device_type clie_3_5_device = {
 	.owner =		THIS_MODULE,
@@ -893,6 +927,27 @@ static int treo_attach (struct usb_seria
 	return 0;
 }
 
+static int clie_5_attach (struct usb_serial *serial)
+{
+	dbg("%s", __FUNCTION__);
+
+	/* TH55 registers 2 ports. 
+	   Communication in from the UX50/TH55 uses bulk_in_endpointAddress from port 0 
+	   Communication out to the UX50/TH55 uses bulk_out_endpointAddress from port 1 
+	   
+	   Lets do a quick and dirty mapping
+	 */
+	
+	/* some sanity check */
+	if (serial->num_ports < 2)
+		return -1;
+		
+	/* port 0 now uses the modified endpoint Address */
+	serial->port[0]->bulk_out_endpointAddress = serial->port[1]->bulk_out_endpointAddress;
+
+	return 0;
+}
+
 static void visor_shutdown (struct usb_serial *serial)
 {
 	dbg("%s", __FUNCTION__);
@@ -1008,6 +1063,9 @@ static int __init visor_init (void)
 	retval = usb_serial_register(&clie_3_5_device);
 	if (retval)
 		goto failed_clie_3_5_register;
+	retval = usb_serial_register(&clie_5_device);
+	if (retval)
+		goto failed_clie_5_register;
 	retval = usb_register(&visor_driver);
 	if (retval) 
 		goto failed_usb_register;
@@ -1015,6 +1073,8 @@ static int __init visor_init (void)
 
 	return 0;
 failed_usb_register:
+	usb_serial_deregister(&clie_5_device);
+failed_clie_5_register:
 	usb_serial_deregister(&clie_3_5_device);
 failed_clie_3_5_register:
 	usb_serial_deregister(&handspring_device);
@@ -1028,6 +1088,7 @@ static void __exit visor_exit (void)
 	usb_deregister (&visor_driver);
 	usb_serial_deregister (&handspring_device);
 	usb_serial_deregister (&clie_3_5_device);
+	usb_serial_deregister (&clie_5_device);
 }
 
 
--- diff/drivers/usb/serial/whiteheat.c	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/usb/serial/whiteheat.c	2004-04-21 10:45:35.084369864 +0100
@@ -91,6 +91,10 @@
 #include "whiteheat_fw.h"		/* firmware for the ConnectTech WhiteHEAT device */
 #include "whiteheat.h"			/* WhiteHEAT specific commands */
 
+#ifndef CMSPAR
+#define CMSPAR 0
+#endif
+
 /*
  * Version Information
  */
@@ -1128,7 +1132,6 @@ static int firm_send_command (struct usb
 	struct usb_serial_port *command_port;
 	struct whiteheat_command_private *command_info;
 	struct whiteheat_private *info;
-	int timeout;
 	__u8 *transfer_buffer;
 	int retval = 0;
 	unsigned long flags;
@@ -1153,10 +1156,8 @@ static int firm_send_command (struct usb
 	}
 
 	/* wait for the command to complete */
-	timeout = COMMAND_TIMEOUT;
-	while (timeout && (command_info->command_finished == FALSE)) {
-		timeout = interruptible_sleep_on_timeout (&command_info->wait_command, timeout);
-	}
+	wait_event_interruptible_timeout(command_info->wait_command, 
+		(command_info->command_finished != FALSE), COMMAND_TIMEOUT);
 
 	spin_lock_irqsave(&command_info->lock, flags);
 
--- diff/drivers/usb/storage/datafab.c	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/usb/storage/datafab.c	2004-04-21 10:45:35.084369864 +0100
@@ -539,8 +539,8 @@ int datafab_transport(Scsi_Cmnd * srb, s
 			  info->sectors, info->ssize);
 
 		// build the reply
-		//
-		((u32 *) ptr)[0] = cpu_to_be32(info->sectors);
+		// we need the last sector, not the number of sectors
+		((u32 *) ptr)[0] = cpu_to_be32(info->sectors - 1);
 		((u32 *) ptr)[1] = cpu_to_be32(info->ssize);
 		usb_stor_set_xfer_buf(ptr, 8, srb);
 
--- diff/drivers/usb/storage/scsiglue.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/storage/scsiglue.c	2004-04-21 10:45:35.085369712 +0100
@@ -64,6 +64,17 @@ static const char* host_info(struct Scsi
 	return "SCSI emulation for USB Mass Storage devices";
 }
 
+static int slave_alloc (struct scsi_device *sdev)
+{
+	/*
+	 * Set default bflags. These can be overridden for individual
+	 * models and vendors via the scsi devinfo mechanism.
+	 */
+	sdev->sdev_bflags = (BLIST_MS_SKIP_PAGE_08 | BLIST_MS_SKIP_PAGE_3F |
+			     BLIST_USE_10_BYTE_MS);
+	return 0;
+}
+
 static int slave_configure(struct scsi_device *sdev)
 {
 	struct us_data *us = (struct us_data *) sdev->host->hostdata[0];
@@ -377,6 +388,7 @@ struct scsi_host_template usb_stor_host_
 	/* unknown initiator id */
 	.this_id =			-1,
 
+	.slave_alloc =			slave_alloc,
 	.slave_configure =		slave_configure,
 
 	/* lots of sg segments can be handled */
@@ -397,10 +409,6 @@ struct scsi_host_template usb_stor_host_
 	/* sysfs device attributes */
 	.sdev_attrs =			sysfs_device_attr_list,
 
-	/* modify scsi_device bits on probe */
-	.flags = (BLIST_MS_SKIP_PAGE_08 | BLIST_MS_SKIP_PAGE_3F |
-		  BLIST_USE_10_BYTE_MS),
-
 	/* module management */
 	.module =			THIS_MODULE
 };
--- diff/drivers/usb/storage/transport.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/storage/transport.c	2004-04-21 10:45:35.085369712 +0100
@@ -256,8 +256,9 @@ int usb_stor_clear_halt(struct us_data *
 		endp |= USB_DIR_IN;
 
 	result = usb_stor_control_msg(us, us->send_ctrl_pipe,
-		USB_REQ_CLEAR_FEATURE, USB_RECIP_ENDPOINT, 0,
-		endp, NULL, 0, 3*HZ);
+		USB_REQ_CLEAR_FEATURE, USB_RECIP_ENDPOINT,
+		USB_ENDPOINT_HALT, endp,
+		NULL, 0, 3*HZ);
 
 	/* reset the toggles and endpoint flags */
 	usb_endpoint_running(us->pusb_dev, usb_pipeendpoint(pipe),
--- diff/drivers/usb/storage/unusual_devs.h	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/storage/unusual_devs.h	2004-04-21 10:45:35.086369560 +0100
@@ -160,7 +160,7 @@ UNUSUAL_DEV(  0x04ce, 0x0002, 0x0074, 0x
 UNUSUAL_DEV(  0x04da, 0x0901, 0x0100, 0x0200,
 		"Panasonic",
 		"LS-120 Camera",
-		US_SC_UFI, US_PR_CBI, NULL, 0),
+		US_SC_UFI, US_PR_DEVICE, NULL, 0),
 
 /* From Yukihiro Nakai, via zaitcev@yahoo.com.
  * This is needed for CB instead of CBI */
@@ -273,7 +273,7 @@ UNUSUAL_DEV(  0x054c, 0x0010, 0x0500, 0x
 UNUSUAL_DEV(  0x054c, 0x0025, 0x0100, 0x0100, 
 		"Sony",
 		"Memorystick NW-MS7",
-		US_SC_UFI, US_PR_CB, NULL,
+		US_SC_DEVICE, US_PR_DEVICE, NULL,
 		US_FL_SINGLE_LUN ),
 
 #ifdef CONFIG_USB_STORAGE_ISD200
@@ -384,7 +384,7 @@ UNUSUAL_DEV(  0x05dc, 0x0001, 0x0000, 0x
 UNUSUAL_DEV(  0x05dc, 0xb002, 0x0000, 0x0113,
 		"Lexar",
 		"USB CF Reader",
-		US_SC_SCSI, US_PR_BULK, NULL,
+		US_SC_DEVICE, US_PR_DEVICE, NULL,
 		US_FL_FIX_INQUIRY ),
 
 /* Reported by Carlos Villegas <cav@uniscope.co.jp>
@@ -392,15 +392,15 @@ UNUSUAL_DEV(  0x05dc, 0xb002, 0x0000, 0x
  * That is the only reason this entry is needed.
  */
 UNUSUAL_DEV(  0x05e3, 0x0700, 0x0000, 0xffff,
-		"SIIG",
-		"CompactFlash Card Reader",
+		"Genesys Logic",
+		"USB to IDE Card Reader",
 		US_SC_DEVICE, US_PR_DEVICE, NULL,
 		US_FL_FIX_INQUIRY ),
 
 /* Submitted Alexander Oltu <alexander@all-2.com> */
 UNUSUAL_DEV(  0x05e3, 0x0701, 0x0000, 0xffff, 
-		"", 
-		"USB TO IDE",
+		"Genesys Logic", 
+		"USB to IDE Optical",
 		US_SC_DEVICE, US_PR_DEVICE, NULL,
 		US_FL_MODE_XLATE ), 
 
@@ -411,16 +411,9 @@ UNUSUAL_DEV(  0x05e3, 0x0701, 0x0000, 0x
  *
  * ST818 slim drives (rev 0.02) don't need special care.
 */
-UNUSUAL_DEV(  0x05e3, 0x0702, 0x0000, 0x0001,
-		"EagleTec",
-		"External Hard Disk",
-		US_SC_DEVICE, US_PR_DEVICE, NULL,
-		US_FL_FIX_INQUIRY ),
-
-/* Reported by Henning Schild <henning@wh9.tu-dresden.de> */
-UNUSUAL_DEV(  0x05e3, 0x0702, 0x0113, 0x0113,
-		"EagleTec",
-		"External Hard Disk",
+UNUSUAL_DEV(  0x05e3, 0x0702, 0x0000, 0xffff,
+		"Genesys Logic",
+		"USB to IDE Disk",
 		US_SC_DEVICE, US_PR_DEVICE, NULL,
 		US_FL_FIX_INQUIRY ),
 
@@ -727,6 +720,21 @@ UNUSUAL_DEV(  0x0bf6, 0xa001, 0x0100, 0x
 		0 ),
 #endif
 
+#ifdef CONFIG_USB_STORAGE_DATAFAB
+UNUSUAL_DEV( 0x0c0b, 0xa109, 0x0000, 0xffff,
+	       "Acomdata",
+	       "CF",
+	       US_SC_SCSI, US_PR_DATAFAB, NULL,
+	       US_FL_SINGLE_LUN ),
+#endif
+#ifdef CONFIG_USB_STORAGE_SDDR55
+UNUSUAL_DEV( 0x0c0b, 0xa109, 0x0000, 0xffff,
+	       "Acomdata",
+	       "SM",
+	       US_SC_SCSI, US_PR_SDDR55, NULL,
+	       US_FL_SINGLE_LUN ),
+#endif
+
 /* Submitted by Joris Struyve <joris@struyve.be> */
 UNUSUAL_DEV( 0x0d96, 0x410a, 0x0001, 0xffff,
 		"Medion",
--- diff/drivers/usb/storage/usb.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/usb/storage/usb.c	2004-04-21 10:45:35.087369408 +0100
@@ -277,7 +277,7 @@ static int usb_stor_control_thread(void 
 	 */
 	daemonize("usb-storage");
 
-	current->flags |= PF_IOTHREAD;
+	current->flags |= PF_NOFREEZE;
 
 	unlock_kernel();
 
--- diff/drivers/usb/usb-skeleton.c	2004-02-09 10:36:11.000000000 +0000
+++ source/drivers/usb/usb-skeleton.c	2004-04-21 10:45:35.087369408 +0100
@@ -516,7 +516,7 @@ static int skel_probe(struct usb_interfa
 	dev = kmalloc (sizeof(struct usb_skel), GFP_KERNEL);
 	if (dev == NULL) {
 		err ("Out of memory");
-		goto error;
+		return -ENOMEM;
 	}
 	memset (dev, 0x00, sizeof (*dev));
 
--- diff/drivers/video/Kconfig	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/video/Kconfig	2004-04-21 10:45:35.091368800 +0100
@@ -55,7 +55,7 @@ config FB_CIRRUS
 
 config FB_PM2
 	tristate "Permedia2 support"
-	depends on FB && (AMIGA || PCI)
+	depends on FB && ((AMIGA && BROKEN) || PCI)
 	help
 	  This is the frame buffer device driver for the Permedia2 AGP frame
 	  buffer card from ASK, aka `Graphic Blaster Exxtreme'.  There is a
--- diff/drivers/video/acornfb.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/video/acornfb.c	2004-04-21 10:45:35.099367584 +0100
@@ -20,12 +20,9 @@
 #include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/string.h>
 #include <linux/ctype.h>
-#include <linux/mm.h>
-#include <linux/tty.h>
 #include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/fb.h>
@@ -36,7 +33,7 @@
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/mach-types.h>
-#include <asm/uaccess.h>
+#include <asm/pgtable.h>
 
 #include "acornfb.h"
 
--- diff/drivers/video/aty/aty128fb.c	2004-02-18 08:54:12.000000000 +0000
+++ source/drivers/video/aty/aty128fb.c	2004-04-21 10:45:35.110365912 +0100
@@ -1998,11 +1998,13 @@ err_free_fb:
 static void __devexit aty128_remove(struct pci_dev *pdev)
 {
 	struct fb_info *info = pci_get_drvdata(pdev);
-	struct aty128fb_par *par = info->par;
+	struct aty128fb_par *par;
 
 	if (!info)
 		return;
 
+	par = info->par;
+
 	unregister_framebuffer(info);
 #ifdef CONFIG_MTRR
 	if (par->mtrr.vram_valid)
--- diff/drivers/video/bw2.c	2003-06-09 14:18:19.000000000 +0100
+++ source/drivers/video/bw2.c	2004-04-21 10:45:35.118364696 +0100
@@ -162,8 +162,10 @@ bw2_blank(int blank, struct fb_info *inf
 }
 
 static struct sbus_mmap_map bw2_mmap_map[] = {
-	{ 0,			0,			SBUS_MMAP_FBSIZE(1) },
-	{ 0,			0,			0		    }
+	{
+		.size = SBUS_MMAP_FBSIZE(1)
+	},
+	{ .size = 0 }
 };
 
 static int bw2_mmap(struct fb_info *info, struct file *file, struct vm_area_struct *vma)
--- diff/drivers/video/cg14.c	2003-08-26 10:00:54.000000000 +0100
+++ source/drivers/video/cg14.c	2004-04-21 10:45:35.120364392 +0100
@@ -367,23 +367,82 @@ static void cg14_init_fix(struct fb_info
 }
 
 static struct sbus_mmap_map __cg14_mmap_map[CG14_MMAP_ENTRIES] __initdata = {
-	{ CG14_REGS,		0x80000000,		0x1000		    },
-	{ CG14_XLUT,		0x80003000,		0x1000		    },
-	{ CG14_CLUT1,		0x80004000,		0x1000		    },
-	{ CG14_CLUT2,		0x80005000,		0x1000		    },
-	{ CG14_CLUT3,		0x80006000,		0x1000		    },
-	{ CG3_MMAP_OFFSET - 
-	  0x7000,		0x80000000,		0x7000		    },
-	{ CG3_MMAP_OFFSET,	0x00000000,		SBUS_MMAP_FBSIZE(1) },
-	{ MDI_CURSOR_MAP,	0x80001000,		0x1000		    },
-	{ MDI_CHUNKY_BGR_MAP,	0x01000000,		0x400000	    },
-	{ MDI_PLANAR_X16_MAP,	0x02000000,		0x200000	    },
-	{ MDI_PLANAR_C16_MAP,	0x02800000,		0x200000	    },
-	{ MDI_PLANAR_X32_MAP,	0x03000000,		0x100000	    },
-	{ MDI_PLANAR_B32_MAP,	0x03400000,		0x100000	    },
-	{ MDI_PLANAR_G32_MAP,	0x03800000,		0x100000	    },
-	{ MDI_PLANAR_R32_MAP,	0x03c00000,		0x100000	    },
-	{ 0,			0,			0		    }
+	{
+		.voff	= CG14_REGS,
+		.poff	= 0x80000000,
+		.size	= 0x1000
+	},
+	{
+		.voff	= CG14_XLUT,
+		.poff	= 0x80003000,
+		.size	= 0x1000
+	},
+	{
+		.voff	= CG14_CLUT1,
+		.poff	= 0x80004000,
+		.size	= 0x1000
+	},
+	{
+		.voff	= CG14_CLUT2,
+		.poff	= 0x80005000,
+		.size	= 0x1000
+	},
+	{
+		.voff	= CG14_CLUT3,
+		.poff	= 0x80006000,
+		.size	= 0x1000
+	},
+	{
+		.voff	= CG3_MMAP_OFFSET - 0x7000,
+		.poff	= 0x80000000,
+		.size	= 0x7000
+	},
+	{
+		.voff	= CG3_MMAP_OFFSET,
+		.poff	= 0x00000000,
+		.size	= SBUS_MMAP_FBSIZE(1)
+	},
+	{
+		.voff	= MDI_CURSOR_MAP,
+		.poff	= 0x80001000,
+		.size	= 0x1000
+	},
+	{
+		.voff	= MDI_CHUNKY_BGR_MAP,
+		.poff	= 0x01000000,
+		.size	= 0x400000
+	},
+	{
+		.voff	= MDI_PLANAR_X16_MAP,
+		.poff	= 0x02000000,
+		.size	= 0x200000
+	},
+	{
+		.voff	= MDI_PLANAR_C16_MAP,
+		.poff	= 0x02800000,
+		.size	= 0x200000
+	},
+	{
+		.voff	= MDI_PLANAR_X32_MAP,
+		.poff	= 0x03000000,
+		.size	= 0x100000
+	},
+	{
+		.voff	= MDI_PLANAR_B32_MAP,
+		.poff	= 0x03400000,
+		.size	= 0x100000
+	},
+	{
+		.voff	= MDI_PLANAR_G32_MAP,
+		.poff	= 0x03800000,
+		.size	= 0x100000
+	},
+	{
+		.voff	= MDI_PLANAR_R32_MAP,
+		.poff	= 0x03c00000,
+		.size	= 0x100000
+	},
+	{ .size = 0 }
 };
 
 struct all_info {
--- diff/drivers/video/cg3.c	2003-06-09 14:18:19.000000000 +0100
+++ source/drivers/video/cg3.c	2004-04-21 10:45:35.121364240 +0100
@@ -221,8 +221,12 @@ cg3_blank(int blank, struct fb_info *inf
 }
 
 static struct sbus_mmap_map cg3_mmap_map[] = {
-	{ CG3_MMAP_OFFSET,	CG3_RAM_OFFSET,		SBUS_MMAP_FBSIZE(1) },
-	{ 0,			0,			0		    }
+	{
+		.poff	= CG3_MMAP_OFFSET,
+		.voff	= CG3_RAM_OFFSET,
+		.size	= SBUS_MMAP_FBSIZE(1)
+	},
+	{ .size = 0 }
 };
 
 static int cg3_mmap(struct fb_info *info, struct file *file, struct vm_area_struct *vma)
--- diff/drivers/video/cg6.c	2003-05-21 11:50:16.000000000 +0100
+++ source/drivers/video/cg6.c	2004-04-21 10:45:35.126363480 +0100
@@ -480,15 +480,47 @@ cg6_blank(int blank, struct fb_info *inf
 }
 
 static struct sbus_mmap_map cg6_mmap_map[] = {
-	{ CG6_FBC,		CG6_FBC_OFFSET,		PAGE_SIZE 		},
-	{ CG6_TEC,		CG6_TEC_OFFSET,		PAGE_SIZE 		},
-	{ CG6_BTREGS,		CG6_BROOKTREE_OFFSET,	PAGE_SIZE 		},
-	{ CG6_FHC,		CG6_FHC_OFFSET,		PAGE_SIZE 		},
-	{ CG6_THC,		CG6_THC_OFFSET,		PAGE_SIZE 		},
-	{ CG6_ROM,		CG6_ROM_OFFSET,		0x10000   		},
-	{ CG6_RAM,		CG6_RAM_OFFSET,		SBUS_MMAP_FBSIZE(1)  	},
-	{ CG6_DHC,		CG6_DHC_OFFSET,		0x40000   		},
-	{ 0,			0,			0	  		}
+	{
+		.voff	= CG6_FBC,
+		.poff	= CG6_FBC_OFFSET,
+		.size	= PAGE_SIZE
+	},
+	{
+		.voff	= CG6_TEC,
+		.poff	= CG6_TEC_OFFSET,
+		.size	= PAGE_SIZE
+	},
+	{
+		.voff	= CG6_BTREGS,
+		.poff	= CG6_BROOKTREE_OFFSET,
+		.size	= PAGE_SIZE
+	},
+	{
+		.voff	= CG6_FHC,
+		.poff	= CG6_FHC_OFFSET,
+		.size	= PAGE_SIZE
+	},
+	{
+		.voff	= CG6_THC,
+		.poff	= CG6_THC_OFFSET,
+		.size	= PAGE_SIZE
+	},
+	{
+		.voff	= CG6_ROM,
+		.poff	= CG6_ROM_OFFSET,
+		.size	= 0x10000
+	},
+	{
+		.voff	= CG6_RAM,
+		.poff	= CG6_RAM_OFFSET,
+		.size	= SBUS_MMAP_FBSIZE(1)
+	},
+	{
+		.voff	= CG6_DHC,
+		.poff	= CG6_DHC_OFFSET,
+		.size	= 0x40000
+	},
+	{ .size	= 0 }
 };
 
 static int cg6_mmap(struct fb_info *info, struct file *file, struct vm_area_struct *vma)
--- diff/drivers/video/console/mdacon.c	2003-01-02 10:43:22.000000000 +0000
+++ source/drivers/video/console/mdacon.c	2004-04-21 10:45:35.130362872 +0100
@@ -502,7 +502,7 @@ static int mdacon_set_palette(struct vc_
 	return -EINVAL;
 }
 
-static int mdacon_blank(struct vc_data *c, int blank)
+static int mdacon_blank(struct vc_data *c, int blank, int mode_switch)
 {
 	if (mda_type == TYPE_MDA) {
 		if (blank) 
--- diff/drivers/video/fbmem.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/video/fbmem.c	2004-04-21 10:45:35.140361352 +0100
@@ -32,6 +32,9 @@
 #include <linux/kmod.h>
 #endif
 #include <linux/devfs_fs_kernel.h>
+#include <linux/err.h>
+#include <linux/kernel.h>
+#include <linux/device.h>
 
 #if defined(__mc68000__) || defined(CONFIG_APUS)
 #include <asm/setup.h>
@@ -911,7 +914,7 @@ fb_cursor(struct fb_info *info, struct f
 			return -ENOMEM;
 		}
 		
-		if (copy_from_user(&cursor.image.data, sprite->image.data, size) ||
+		if (copy_from_user(cursor.image.data, sprite->image.data, size) ||
 		    copy_from_user(cursor.mask, sprite->mask, size)) { 
 			kfree(cursor.image.data);
 			kfree(cursor.mask);
@@ -1038,7 +1041,7 @@ fb_ioctl(struct inode *inode, struct fil
 	case FBIOGETCMAP:
 		if (copy_from_user(&cmap, (void *) arg, sizeof(cmap)))
 			return -EFAULT;
-		return (fb_copy_cmap(&info->cmap, &cmap, 0));
+		return (fb_copy_cmap(&info->cmap, &cmap, 2));
 	case FBIOPAN_DISPLAY:
 		if (copy_from_user(&var, (void *) arg, sizeof(var)))
 			return -EFAULT;
@@ -1245,6 +1248,8 @@ static struct file_operations fb_fops = 
 #endif
 };
 
+static struct class_simple *fb_class;
+
 /**
  *	register_framebuffer - registers a frame buffer device
  *	@fb_info: frame buffer info structure
@@ -1259,6 +1264,7 @@ int
 register_framebuffer(struct fb_info *fb_info)
 {
 	int i;
+	struct class_device *c;
 
 	if (num_registered_fb == FB_MAX)
 		return -ENXIO;
@@ -1267,6 +1273,12 @@ register_framebuffer(struct fb_info *fb_
 		if (!registered_fb[i])
 			break;
 	fb_info->node = i;
+
+	c = class_simple_device_add(fb_class, MKDEV(FB_MAJOR, i), NULL, "fb%d", i);
+	if (IS_ERR(c)) {
+		/* Not fatal */
+		printk(KERN_WARNING "Unable to create class_device for framebuffer %d; errno = %ld\n", i, PTR_ERR(c));
+	}
 	
 	if (fb_info->pixmap.addr == NULL) {
 		fb_info->pixmap.addr = kmalloc(FBPIXMAPSIZE, GFP_KERNEL);
@@ -1332,6 +1344,7 @@ unregister_framebuffer(struct fb_info *f
 		kfree(fb_info->sprite.addr);
 	registered_fb[i]=NULL;
 	num_registered_fb--;
+	class_simple_device_remove(MKDEV(FB_MAJOR, i));
 	return 0;
 }
 
@@ -1393,6 +1406,12 @@ fbmem_init(void)
 	if (register_chrdev(FB_MAJOR,"fb",&fb_fops))
 		printk("unable to get major %d for fb devs\n", FB_MAJOR);
 
+	fb_class = class_simple_create(THIS_MODULE, "graphics");
+	if (IS_ERR(fb_class)) {
+		printk(KERN_WARNING "Unable to create fb class; errno = %ld\n", PTR_ERR(fb_class));
+		fb_class = NULL;
+	}
+
 #ifdef CONFIG_FB_OF
 	if (ofonly) {
 		offb_init();
--- diff/drivers/video/ffb.c	2004-03-11 10:20:28.000000000 +0000
+++ source/drivers/video/ffb.c	2004-04-21 10:45:35.146360440 +0100
@@ -769,34 +769,142 @@ ffb_blank(int blank, struct fb_info *inf
 }
 
 static struct sbus_mmap_map ffb_mmap_map[] = {
-	{ FFB_SFB8R_VOFF,	FFB_SFB8R_POFF,		0x0400000 },
-	{ FFB_SFB8G_VOFF,	FFB_SFB8G_POFF,		0x0400000 },
-	{ FFB_SFB8B_VOFF,	FFB_SFB8B_POFF,		0x0400000 },
-	{ FFB_SFB8X_VOFF,	FFB_SFB8X_POFF,		0x0400000 },
-	{ FFB_SFB32_VOFF,	FFB_SFB32_POFF,		0x1000000 },
-	{ FFB_SFB64_VOFF,	FFB_SFB64_POFF,		0x2000000 },
-	{ FFB_FBC_REGS_VOFF,	FFB_FBC_REGS_POFF,	0x0002000 },
-	{ FFB_BM_FBC_REGS_VOFF,	FFB_BM_FBC_REGS_POFF,	0x0002000 },
-	{ FFB_DFB8R_VOFF,	FFB_DFB8R_POFF,		0x0400000 },
-	{ FFB_DFB8G_VOFF,	FFB_DFB8G_POFF,		0x0400000 },
-	{ FFB_DFB8B_VOFF,	FFB_DFB8B_POFF,		0x0400000 },
-	{ FFB_DFB8X_VOFF,	FFB_DFB8X_POFF,		0x0400000 },
-	{ FFB_DFB24_VOFF,	FFB_DFB24_POFF,		0x1000000 },
-	{ FFB_DFB32_VOFF,	FFB_DFB32_POFF,		0x1000000 },
-	{ FFB_FBC_KREGS_VOFF,	FFB_FBC_KREGS_POFF,	0x0002000 },
-	{ FFB_DAC_VOFF,		FFB_DAC_POFF,		0x0002000 },
-	{ FFB_PROM_VOFF,	FFB_PROM_POFF,		0x0010000 },
-	{ FFB_EXP_VOFF,		FFB_EXP_POFF,		0x0002000 },
-	{ FFB_DFB422A_VOFF,	FFB_DFB422A_POFF,	0x0800000 },
-	{ FFB_DFB422AD_VOFF,	FFB_DFB422AD_POFF,	0x0800000 },
-	{ FFB_DFB24B_VOFF,	FFB_DFB24B_POFF,	0x1000000 },
-	{ FFB_DFB422B_VOFF,	FFB_DFB422B_POFF,	0x0800000 },
-	{ FFB_DFB422BD_VOFF,	FFB_DFB422BD_POFF,	0x0800000 },
-	{ FFB_SFB16Z_VOFF,	FFB_SFB16Z_POFF,	0x0800000 },
-	{ FFB_SFB8Z_VOFF,	FFB_SFB8Z_POFF,		0x0800000 },
-	{ FFB_SFB422_VOFF,	FFB_SFB422_POFF,	0x0800000 },
-	{ FFB_SFB422D_VOFF,	FFB_SFB422D_POFF,	0x0800000 },
-	{ 0,			0,			0	  }
+	{
+		.voff	= FFB_SFB8R_VOFF,
+		.poff	= FFB_SFB8R_POFF,
+		.size	= 0x0400000
+	},
+	{
+		.voff	= FFB_SFB8G_VOFF,
+		.poff	= FFB_SFB8G_POFF,
+		.size	= 0x0400000
+	},
+	{
+		.voff	= FFB_SFB8B_VOFF,
+		.poff	= FFB_SFB8B_POFF,
+		.size	= 0x0400000
+	},
+	{
+		.voff	= FFB_SFB8X_VOFF,
+		.poff	= FFB_SFB8X_POFF,
+		.size	= 0x0400000
+	},
+	{
+		.voff	= FFB_SFB32_VOFF,
+		.poff	= FFB_SFB32_POFF,
+		.size	= 0x1000000
+	},
+	{
+		.voff	= FFB_SFB64_VOFF,
+		.poff	= FFB_SFB64_POFF,
+		.size	= 0x2000000
+	},
+	{
+		.voff	= FFB_FBC_REGS_VOFF,
+		.poff	= FFB_FBC_REGS_POFF,
+		.size	= 0x0002000
+	},
+	{
+		.voff	= FFB_BM_FBC_REGS_VOFF,
+		.poff	= FFB_BM_FBC_REGS_POFF,
+		.size	= 0x0002000
+	},
+	{
+		.voff	= FFB_DFB8R_VOFF,
+		.poff	= FFB_DFB8R_POFF,
+		.size	= 0x0400000
+	},
+	{
+		.voff	= FFB_DFB8G_VOFF,
+		.poff	= FFB_DFB8G_POFF,
+		.size	= 0x0400000
+	},
+	{
+		.voff	= FFB_DFB8B_VOFF,
+		.poff	= FFB_DFB8B_POFF,
+		.size	= 0x0400000
+	},
+	{
+		.voff	= FFB_DFB8X_VOFF,
+		.poff	= FFB_DFB8X_POFF,
+		.size	= 0x0400000
+	},
+	{
+		.voff	= FFB_DFB24_VOFF,
+		.poff	= FFB_DFB24_POFF,
+		.size	= 0x1000000
+	},
+	{
+		.voff	= FFB_DFB32_VOFF,
+		.poff	= FFB_DFB32_POFF,
+		.size	= 0x1000000
+	},
+	{
+		.voff	= FFB_FBC_KREGS_VOFF,
+		.poff	= FFB_FBC_KREGS_POFF,
+		.size	= 0x0002000
+	},
+	{
+		.voff	= FFB_DAC_VOFF,
+		.poff	= FFB_DAC_POFF,
+		.size	= 0x0002000
+	},
+	{
+		.voff	= FFB_PROM_VOFF,
+		.poff	= FFB_PROM_POFF,
+		.size	= 0x0010000
+	},
+	{
+		.voff	= FFB_EXP_VOFF,
+		.poff	= FFB_EXP_POFF,
+		.size	= 0x0002000
+	},
+	{
+		.voff	= FFB_DFB422A_VOFF,
+		.poff	= FFB_DFB422A_POFF,
+		.size	= 0x0800000
+	},
+	{
+		.voff	= FFB_DFB422AD_VOFF,
+		.poff	= FFB_DFB422AD_POFF,
+		.size	= 0x0800000
+	},
+	{
+		.voff	= FFB_DFB24B_VOFF,
+		.poff	= FFB_DFB24B_POFF,
+		.size	= 0x1000000
+	},
+	{
+		.voff	= FFB_DFB422B_VOFF,
+		.poff	= FFB_DFB422B_POFF,
+		.size	= 0x0800000
+	},
+	{
+		.voff	= FFB_DFB422BD_VOFF,
+		.poff	= FFB_DFB422BD_POFF,
+		.size	= 0x0800000
+	},
+	{
+		.voff	= FFB_SFB16Z_VOFF,
+		.poff	= FFB_SFB16Z_POFF,
+		.size	= 0x0800000
+	},
+	{
+		.voff	= FFB_SFB8Z_VOFF,
+		.poff	= FFB_SFB8Z_POFF,
+		.size	= 0x0800000
+	},
+	{
+		.voff	= FFB_SFB422_VOFF,
+		.poff	= FFB_SFB422_POFF,
+		.size	= 0x0800000
+	},
+	{
+		.voff	= FFB_SFB422D_VOFF,
+		.poff	= FFB_SFB422D_POFF,
+		.size	= 0x0800000
+	},
+	{ .size = 0 }
 };
 
 static int ffb_mmap(struct fb_info *info, struct file *file, struct vm_area_struct *vma)
--- diff/drivers/video/leo.c	2003-08-26 10:00:54.000000000 +0100
+++ source/drivers/video/leo.c	2004-04-21 10:45:35.147360288 +0100
@@ -294,20 +294,72 @@ static int leo_blank(int blank, struct f
 }
 
 static struct sbus_mmap_map leo_mmap_map[] = {
-	{ LEO_SS0_MAP,		LEO_OFF_SS0,		0x800000	},
-	{ LEO_LC_SS0_USR_MAP,	LEO_OFF_LC_SS0_USR,	0x1000		},
-	{ LEO_LD_SS0_MAP,	LEO_OFF_LD_SS0,		0x1000		},
-	{ LEO_LX_CURSOR_MAP,	LEO_OFF_LX_CURSOR,	0x1000		},
-	{ LEO_SS1_MAP,		LEO_OFF_SS1,		0x800000	},
-	{ LEO_LC_SS1_USR_MAP,	LEO_OFF_LC_SS1_USR,	0x1000		},
-	{ LEO_LD_SS1_MAP,	LEO_OFF_LD_SS1,		0x1000		},
-	{ LEO_UNK_MAP,		LEO_OFF_UNK,		0x1000		},
-	{ LEO_LX_KRN_MAP,	LEO_OFF_LX_KRN,		0x1000		},
-	{ LEO_LC_SS0_KRN_MAP,	LEO_OFF_LC_SS0_KRN,	0x1000		},
-	{ LEO_LC_SS1_KRN_MAP,	LEO_OFF_LC_SS1_KRN,	0x1000		},
-	{ LEO_LD_GBL_MAP,	LEO_OFF_LD_GBL,		0x1000		},
-	{ LEO_UNK2_MAP,		LEO_OFF_UNK2,		0x100000	},
-	{ 0,			0,			0	  	}
+	{
+		.voff	= LEO_SS0_MAP,
+		.poff	= LEO_OFF_SS0,
+		.size	= 0x800000
+	},
+	{
+		.voff	= LEO_LC_SS0_USR_MAP,
+		.poff	= LEO_OFF_LC_SS0_USR,
+		.size	= 0x1000
+	},
+	{
+		.voff	= LEO_LD_SS0_MAP,
+		.poff	= LEO_OFF_LD_SS0,
+		.size	= 0x1000
+	},
+	{
+		.voff	= LEO_LX_CURSOR_MAP,
+		.poff	= LEO_OFF_LX_CURSOR,
+		.size	= 0x1000
+	},
+	{
+		.voff	= LEO_SS1_MAP,
+		.poff	= LEO_OFF_SS1,
+		.size	= 0x800000
+	},
+	{
+		.voff	= LEO_LC_SS1_USR_MAP,
+		.poff	= LEO_OFF_LC_SS1_USR,
+		.size	= 0x1000
+	},
+	{
+		.voff	= LEO_LD_SS1_MAP,
+		.poff	= LEO_OFF_LD_SS1,
+		.size	= 0x1000
+	},
+	{
+		.voff	= LEO_UNK_MAP,
+		.poff	= LEO_OFF_UNK,
+		.size	= 0x1000
+	},
+	{
+		.voff	= LEO_LX_KRN_MAP,
+		.poff	= LEO_OFF_LX_KRN,
+		.size	= 0x1000
+	},
+	{
+		.voff	= LEO_LC_SS0_KRN_MAP,
+		.poff	= LEO_OFF_LC_SS0_KRN,
+		.size	= 0x1000
+	},
+	{
+		.voff	= LEO_LC_SS1_KRN_MAP,
+		.poff	= LEO_OFF_LC_SS1_KRN,
+		.size	= 0x1000
+	},
+	{
+		.voff	= LEO_LD_GBL_MAP,
+		.poff	= LEO_OFF_LD_GBL,
+		.size	= 0x1000
+	},
+	{
+		.voff	= LEO_UNK2_MAP,
+		.poff	= LEO_OFF_UNK2,
+		.size	= 0x100000
+	},
+	{ .size = 0 }
 };
 
 static int leo_mmap(struct fb_info *info, struct file *file, struct vm_area_struct *vma)
--- diff/drivers/video/pm2fb.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/video/pm2fb.c	2004-04-21 10:45:35.148360136 +0100
@@ -62,17 +62,6 @@
 #define DPRINTK(a,b...)
 #endif
 
-/* Memory barriers. */
-#ifdef __mc68000__
-#define DEFW()
-#define DEFR()
-#define DEFRW()	
-#else
-#define DEFW()		wmb()
-#define DEFR()		rmb()
-#define DEFRW()		mb()
-#endif
-
 /*
  * Driver data 
  */
@@ -182,7 +171,7 @@ inline static u32 pm2_RDAC_RD(struct pm2
 		index = PM2VR_RD_INDEXED_DATA;
 		break;
 	}	
-	DEFRW();
+	mb();
 	return pm2_RD(p, index);
 }
 
@@ -198,21 +187,21 @@ inline static void pm2_RDAC_WR(struct pm
 		index = PM2VR_RD_INDEXED_DATA;
 		break;
 	}	
-	DEFRW();
+	mb();
 	pm2_WR(p, index, v);
 }
 
 inline static u32 pm2v_RDAC_RD(struct pm2fb_par* p, s32 idx)
 {
 	pm2_WR(p, PM2VR_RD_INDEX_LOW, idx & 0xff);
-	DEFRW();
+	mb();
 	return pm2_RD(p, PM2VR_RD_INDEXED_DATA);
 }
 
 inline static void pm2v_RDAC_WR(struct pm2fb_par* p, s32 idx, u32 v)
 {
 	pm2_WR(p, PM2VR_RD_INDEX_LOW, idx & 0xff);
-	DEFRW();
+	mb();
 	pm2_WR(p, PM2VR_RD_INDEXED_DATA, v);
 }
 
@@ -222,7 +211,7 @@ inline static void pm2v_RDAC_WR(struct p
 inline static void WAIT_FIFO(struct pm2fb_par* p, u32 a)
 {
 	while( pm2_RD(p, PM2R_IN_FIFO_SPACE) < a );
-	DEFRW();
+	mb();
 }
 #endif
 
@@ -342,7 +331,7 @@ static void clear_palette(struct pm2fb_p
 
 	WAIT_FIFO(p, 1);
 	pm2_WR(p, PM2R_RD_PALETTE_WRITE_ADDRESS, 0);
-	DEFW();
+	wmb();
 	while (i--) {
 		WAIT_FIFO(p, 3);
 		pm2_WR(p, PM2R_RD_PALETTE_DATA, 0);
@@ -366,14 +355,14 @@ static void reset_card(struct pm2fb_par*
 	if (p->type == PM2_TYPE_PERMEDIA2V)
 		pm2_WR(p, PM2VR_RD_INDEX_HIGH, 0);
 	pm2_WR(p, PM2R_RESET_STATUS, 0);
-	DEFRW();
+	mb();
 	while (pm2_RD(p, PM2R_RESET_STATUS) & PM2F_BEING_RESET)
 		;
-	DEFRW();
+	mb();
 #ifdef CONFIG_FB_PM2_FIFO_DISCONNECT
 	DPRINTK("FIFO disconnect enabled\n");
 	pm2_WR(p, PM2R_FIFO_DISCON, 1);
-	DEFRW();
+	mb();
 #endif
 }
 #endif
@@ -464,11 +453,11 @@ static void set_color(struct pm2fb_par* 
 {
 	WAIT_FIFO(p, 4);
 	pm2_WR(p, PM2R_RD_PALETTE_WRITE_ADDRESS, regno);
-	DEFW();
+	wmb();
 	pm2_WR(p, PM2R_RD_PALETTE_DATA, r);
-	DEFW();
+	wmb();
 	pm2_WR(p, PM2R_RD_PALETTE_DATA, g);
-	DEFW();
+	wmb();
 	pm2_WR(p, PM2R_RD_PALETTE_DATA, b);
 }
 
@@ -482,14 +471,14 @@ static void set_pixclock(struct pm2fb_pa
 		pm2_mnp(clk, &m, &n, &p);
 		WAIT_FIFO(par, 8);
 		pm2_RDAC_WR(par, PM2I_RD_PIXEL_CLOCK_A3, 0);
-		DEFW();
+		wmb();
 		pm2_RDAC_WR(par, PM2I_RD_PIXEL_CLOCK_A1, m);
 		pm2_RDAC_WR(par, PM2I_RD_PIXEL_CLOCK_A2, n);
-		DEFW();
+		wmb();
 		pm2_RDAC_WR(par, PM2I_RD_PIXEL_CLOCK_A3, 8|p);
-		DEFW();
+		wmb();
 		pm2_RDAC_RD(par, PM2I_RD_PIXEL_CLOCK_STATUS);
-		DEFR();
+		rmb();
 		for (i = 256;
 		     i && !(pm2_RD(par, PM2R_RD_INDEXED_DATA) & PM2F_PLL_LOCKED);
 		     i--)
@@ -746,7 +735,7 @@ static int pm2fb_set_par(struct fb_info 
     
 	set_aperture(par, depth);
     
-	DEFRW();
+	mb();
 	WAIT_FIFO(par, 19);
 	pm2_RDAC_WR(par, PM2I_RD_COLOR_KEY_CONTROL,
 		    ( depth == 8 ) ? 0 : PM2F_COLOR_KEY_TEST_OFF);
@@ -794,13 +783,13 @@ static int pm2fb_set_par(struct fb_info 
 	pm2_WR(par, PM2R_VS_END, vsend);
 	pm2_WR(par, PM2R_VB_END, vbend);
 	pm2_WR(par, PM2R_SCREEN_STRIDE, stride);
-	DEFW();
+	wmb();
 	pm2_WR(par, PM2R_WINDOW_ORIGIN, 0);
 	pm2_WR(par, PM2R_SCREEN_SIZE, (height << 16) | width);
 	pm2_WR(par, PM2R_SCISSOR_MODE, PM2F_SCREEN_SCISSOR_ENABLE);
-	DEFW();
+	wmb();
 	pm2_WR(par, PM2R_SCREEN_BASE, base);
-	DEFW();
+	wmb();
 	set_video(par, video);
 	WAIT_FIFO(par, 4);
 	switch (par->type) {
--- diff/drivers/video/tcx.c	2003-06-09 14:18:19.000000000 +0100
+++ source/drivers/video/tcx.c	2004-04-21 10:45:35.149359984 +0100
@@ -238,20 +238,59 @@ tcx_blank(int blank, struct fb_info *inf
 }
 
 static struct sbus_mmap_map __tcx_mmap_map[TCX_MMAP_ENTRIES] = {
-	{ TCX_RAM8BIT,		0,		SBUS_MMAP_FBSIZE(1) },
-	{ TCX_RAM24BIT,		0,		SBUS_MMAP_FBSIZE(4) },
-	{ TCX_UNK3,		0,		SBUS_MMAP_FBSIZE(8) },
-	{ TCX_UNK4,		0,		SBUS_MMAP_FBSIZE(8) },
-	{ TCX_CONTROLPLANE,	0,		SBUS_MMAP_FBSIZE(4) },
-	{ TCX_UNK6,		0,		SBUS_MMAP_FBSIZE(8) },
-	{ TCX_UNK7,		0,		SBUS_MMAP_FBSIZE(8) },
-	{ TCX_TEC,		0,		PAGE_SIZE	    },
-	{ TCX_BTREGS,		0,		PAGE_SIZE	    },
-	{ TCX_THC,		0,		PAGE_SIZE	    },
-	{ TCX_DHC,		0,		PAGE_SIZE	    },
-	{ TCX_ALT,		0,		PAGE_SIZE	    },
-	{ TCX_UNK2,		0,		0x20000		    },
-	{ 0,			0,		0		    }
+	{
+		.voff	= TCX_RAM8BIT,
+		.size	= SBUS_MMAP_FBSIZE(1)
+	},
+	{
+		.voff	= TCX_RAM24BIT,
+		.size	= SBUS_MMAP_FBSIZE(4)
+	},
+	{
+		.voff	= TCX_UNK3,
+		.size	= SBUS_MMAP_FBSIZE(8)
+	},
+	{
+		.voff	= TCX_UNK4,
+		.size	= SBUS_MMAP_FBSIZE(8)
+	},
+	{
+		.voff	= TCX_CONTROLPLANE,
+		.size	= SBUS_MMAP_FBSIZE(4)
+	},
+	{
+		.voff	= TCX_UNK6,
+		.size	= SBUS_MMAP_FBSIZE(8)
+	},
+	{
+		.voff	= TCX_UNK7,
+		.size	= SBUS_MMAP_FBSIZE(8)
+	},
+	{
+		.voff	= TCX_TEC,
+		.size	= PAGE_SIZE
+	},
+	{
+		.voff	= TCX_BTREGS,
+		.size	= PAGE_SIZE
+	},
+	{
+		.voff	= TCX_THC,
+		.size	= PAGE_SIZE
+	},
+	{
+		.voff	= TCX_DHC,
+		.size	= PAGE_SIZE
+	},
+	{
+		.voff	= TCX_ALT,
+		.size	= PAGE_SIZE
+	},
+	{
+		.voff	= TCX_UNK2,
+		.size	= 0x20000
+	},
+	{ .size = 0 }
 };
 
 static int tcx_mmap(struct fb_info *info, struct file *file, struct vm_area_struct *vma)
--- diff/drivers/video/vga16fb.c	2004-02-18 08:54:12.000000000 +0000
+++ source/drivers/video/vga16fb.c	2004-04-21 10:45:35.160358312 +0100
@@ -1347,7 +1347,7 @@ int __init vga16fb_init(void)
 
 	/* XXX share VGA_FB_PHYS and I/O region with vgacon and others */
 
-        vga16fb.screen_base = ioremap(VGA_FB_PHYS, VGA_FB_PHYS_LEN);
+	vga16fb.screen_base = ioremap(VGA_MAP_MEM(VGA_FB_PHYS), VGA_FB_PHYS_LEN);
 	if (!vga16fb.screen_base) {
 		printk(KERN_ERR "vga16fb: unable to map device\n");
 		ret = -ENOMEM;
@@ -1372,6 +1372,8 @@ int __init vga16fb_init(void)
 	vga16fb.par = &vga16_par;
 	vga16fb.flags = FBINFO_FLAG_DEFAULT;
 
+	vga16fb.fix.smem_start	= VGA_MAP_MEM(vga16fb.fix.smem_start);
+
 	i = (vga16fb_defined.bits_per_pixel == 8) ? 256 : 16;
 	ret = fb_alloc_cmap(&vga16fb.cmap, i, 0);
 	if (ret) {
--- diff/drivers/zorro/Makefile	2004-02-09 10:36:12.000000000 +0000
+++ source/drivers/zorro/Makefile	2004-04-21 10:45:35.161358160 +0100
@@ -11,10 +11,11 @@ host-progs 		:= gen-devlist
 clean-files := devlist.h
 
 # Dependencies on generated files need to be listed explicitly
-
 $(obj)/names.o: $(obj)/devlist.h
 
 # And that's how to generate them
-
+quiet_cmd_devlist = DEVLIST $@
+      cmd_devlist = ( cd $(obj); ./gen-devlist ) < $<
 $(obj)/devlist.h: $(src)/zorro.ids $(obj)/gen-devlist
-	( cd $(obj); ./gen-devlist ) < $<
+	$(call cmd,devlist)
+
--- diff/fs/Kconfig	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/Kconfig	2004-04-21 10:45:35.162358008 +0100
@@ -406,18 +406,21 @@ config QUOTA
 	help
 	  If you say Y here, you will be able to set per user limits for disk
 	  usage (also called disk quotas). Currently, it works for the
-	  ext2, ext3, and reiserfs file system. You need additional software
-	  in order to use quota support (you can download sources from
+	  ext2, ext3, and reiserfs file system. ext3 also supports journalled
+	  quotas for which you don't need to run quotacheck(8) after an unclean
+	  shutdown. You need additional software in order to use quota support
+	  (you can download sources from
 	  <http://www.sf.net/projects/linuxquota/>). For further details, read
 	  the Quota mini-HOWTO, available from
-	  <http://www.tldp.org/docs.html#howto>. Probably the quota
-	  support is only useful for multi user systems. If unsure, say N.
+	  <http://www.tldp.org/docs.html#howto>, or the documentation provided
+	  with the quota tools. Probably the quota support is only useful for
+	  multi user systems. If unsure, say N.
 
 config QFMT_V1
 	tristate "Old quota format support"
 	depends on QUOTA
 	help
-	  This quota format was (is) used by kernels earlier than 2.4.??. If
+	  This quota format was (is) used by kernels earlier than 2.4.22. If
 	  you have quota working and you don't want to convert to new quota
 	  format say Y here.
 
@@ -426,8 +429,8 @@ config QFMT_V2
 	depends on QUOTA
 	help
 	  This quota format allows using quotas with 32-bit UIDs/GIDs. If you
-	  need this functionality say Y here. Note that you will need latest
-	  quota utilities for new quota format with this kernel.
+	  need this functionality say Y here. Note that you will need recent
+	  quota utilities (>= 3.01) for new quota format with this kernel.
 
 config QUOTACTL
 	bool
@@ -780,6 +783,30 @@ config PROC_KCORE
 	bool
 	default y if !ARM
 
+config SYSFS
+	bool "sysfs file system support" if EMBEDDED
+	default y
+	help
+	The sysfs filesystem is a virtual filesystem that the kernel uses to
+	export internal kernel objects, their attributes, and their
+	relationships to one another.
+
+	Users can use sysfs to ascertain useful information about the running
+	kernel, such as the devices the kernel has discovered on each bus and
+	which driver each is bound to. sysfs can also be used to tune devices
+	and other kernel subsystems.
+
+	Some system agents rely on the information in sysfs to operate.
+	/sbin/hotplug uses device and object attributes in sysfs to assist in
+	delegating policy decisions, like persistantly naming devices.
+
+	sysfs is currently used by the block subsystem to mount the root
+	partition.  If sysfs is disabled you must specify the boot device on
+	the kernel boot command line via its major and minor numbers.  For
+	example, "root=03:01" for /dev/hda1.
+
+	Designers of embedded systems may wish to say N here to conserve space.
+
 config DEVFS_FS
 	bool "/dev file system support (OBSOLETE)"
 	depends on EXPERIMENTAL
--- diff/fs/Makefile	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/Makefile	2004-04-21 10:45:35.162358008 +0100
@@ -39,7 +39,7 @@ obj-$(CONFIG_QUOTACTL)		+= quota.o
 
 obj-$(CONFIG_PROC_FS)		+= proc/
 obj-y				+= partitions/
-obj-y				+= sysfs/
+obj-$(CONFIG_SYSFS)		+= sysfs/
 obj-y				+= devpts/
 
 obj-$(CONFIG_PROFILING)		+= dcookies.o
--- diff/fs/adfs/super.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/adfs/super.c	2004-04-21 10:45:35.163357856 +0100
@@ -192,6 +192,7 @@ static int parse_options(struct super_bl
 
 static int adfs_remount(struct super_block *sb, int *flags, char *data)
 {
+	*flags |= MS_NODIRATIME;
 	return parse_options(sb, data);
 }
 
--- diff/fs/affs/super.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/affs/super.c	2004-04-21 10:45:35.163357856 +0100
@@ -502,6 +502,8 @@ affs_remount(struct super_block *sb, int
 
 	pr_debug("AFFS: remount(flags=0x%x,opts=\"%s\")\n",*flags,data);
 
+	*flags |= MS_NODIRATIME;
+
 	if (!parse_options(data,&uid,&gid,&mode,&reserved,&root_block,
 	    &blocksize,&sbi->s_prefix,sbi->s_volume,&mount_flags))
 		return -EINVAL;
--- diff/fs/binfmt_aout.c	2003-09-30 15:46:18.000000000 +0100
+++ source/fs/binfmt_aout.c	2004-04-21 10:45:35.163357856 +0100
@@ -413,7 +413,7 @@ beyond_if:
 
 	set_brk(current->mm->start_brk, current->mm->brk);
 
-	retval = setup_arg_pages(bprm); 
+	retval = setup_arg_pages(bprm, EXSTACK_DEFAULT);
 	if (retval < 0) { 
 		/* Someone check-me: is this error path enough? */ 
 		send_sig(SIGKILL, current, 0); 
--- diff/fs/binfmt_elf.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/binfmt_elf.c	2004-04-21 10:45:35.164357704 +0100
@@ -360,6 +360,18 @@ static unsigned long load_elf_interp(str
 	    }
 
 	    /*
+	     * Check to see if the section's size will overflow the
+	     * allowed task size. Note that p_filesz must always be
+	     * <= p_memsize so it is only necessary to check p_memsz.
+	     */
+	    k = load_addr + eppnt->p_vaddr;
+	    if (k > TASK_SIZE || eppnt->p_filesz > eppnt->p_memsz ||
+		eppnt->p_memsz > TASK_SIZE || TASK_SIZE - eppnt->p_memsz < k) {
+	        error = -ENOMEM;
+		goto out_close;
+	    }
+
+	    /*
 	     * Find the end of the file mapping for this phdr, and keep
 	     * track of the largest address we see for this.
 	     */
@@ -476,6 +488,7 @@ static int load_elf_binary(struct linux_
   	struct exec interp_ex;
 	char passed_fileno[6];
 	struct files_struct *files;
+	int executable_stack = EXSTACK_DEFAULT;
 	
 	/* Get the exec-header */
 	elf_ex = *((struct elfhdr *) bprm->buf);
@@ -509,7 +522,8 @@ static int load_elf_binary(struct linux_
 		goto out_free_ph;
 
 	files = current->files;		/* Refcounted so ok */
-	if(unshare_files() < 0)
+	retval = unshare_files();
+	if (retval < 0)
 		goto out_free_ph;
 	if (files == current->files) {
 		put_files_struct(files);
@@ -599,6 +613,15 @@ static int load_elf_binary(struct linux_
 		elf_ppnt++;
 	}
 
+	elf_ppnt = elf_phdata;
+	for (i = 0; i < elf_ex.e_phnum; i++, elf_ppnt++)
+		if (elf_ppnt->p_type == PT_GNU_STACK) {
+			if (elf_ppnt->p_flags & PF_X)
+				executable_stack = EXSTACK_ENABLE_X;
+			else
+				executable_stack = EXSTACK_DISABLE_X;
+		}
+
 	/* Some simple consistency checks for the interpreter */
 	if (elf_interpreter) {
 		interpreter_type = INTERPRETER_ELF | INTERPRETER_AOUT;
@@ -674,7 +697,7 @@ static int load_elf_binary(struct linux_
 	   change some of these later */
 	current->mm->rss = 0;
 	current->mm->free_area_cache = TASK_UNMAPPED_BASE;
-	retval = setup_arg_pages(bprm);
+	retval = setup_arg_pages(bprm, executable_stack);
 	if (retval < 0) {
 		send_sig(SIGKILL, current, 0);
 		goto out_free_dentry;
@@ -749,6 +772,19 @@ static int load_elf_binary(struct linux_
 		if (k < start_code) start_code = k;
 		if (start_data < k) start_data = k;
 
+		/*
+		 * Check to see if the section's size will overflow the
+		 * allowed task size. Note that p_filesz must always be
+		 * <= p_memsz so it is only necessary to check p_memsz.
+		 */
+		if (k > TASK_SIZE || elf_ppnt->p_filesz > elf_ppnt->p_memsz ||
+		    elf_ppnt->p_memsz > TASK_SIZE ||
+		    TASK_SIZE - elf_ppnt->p_memsz < k) {
+			/* set_brk can never work.  Avoid overflows.  */
+			send_sig(SIGKILL, current, 0);
+			goto out_free_dentry;
+		}
+
 		k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
 
 		if (k > elf_bss)
@@ -1129,7 +1165,7 @@ static void fill_prstatus(struct elf_prs
 	prstatus->pr_pid = p->pid;
 	prstatus->pr_ppid = p->parent->pid;
 	prstatus->pr_pgrp = process_group(p);
-	prstatus->pr_sid = p->session;
+	prstatus->pr_sid = p->signal->session;
 	jiffies_to_timeval(p->utime, &prstatus->pr_utime);
 	jiffies_to_timeval(p->stime, &prstatus->pr_stime);
 	jiffies_to_timeval(p->cutime, &prstatus->pr_cutime);
@@ -1157,7 +1193,7 @@ static void fill_psinfo(struct elf_prpsi
 	psinfo->pr_pid = p->pid;
 	psinfo->pr_ppid = p->parent->pid;
 	psinfo->pr_pgrp = process_group(p);
-	psinfo->pr_sid = p->session;
+	psinfo->pr_sid = p->signal->session;
 
 	i = p->state ? ffz(~p->state) + 1 : 0;
 	psinfo->pr_state = i;
--- diff/fs/binfmt_misc.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/binfmt_misc.c	2004-04-21 10:45:35.165357552 +0100
@@ -52,7 +52,7 @@ typedef struct {
 	struct dentry *dentry;
 } Node;
 
-static rwlock_t entries_lock __attribute__((unused)) = RW_LOCK_UNLOCKED;
+static rwlock_t entries_lock = RW_LOCK_UNLOCKED;
 static struct vfsmount *bm_mnt;
 static int entry_count;
 
--- diff/fs/binfmt_som.c	2004-01-19 10:22:59.000000000 +0000
+++ source/fs/binfmt_som.c	2004-04-21 10:45:35.165357552 +0100
@@ -254,7 +254,7 @@ load_som_binary(struct linux_binprm * bp
 
 	set_binfmt(&som_format);
 	compute_creds(bprm);
-	setup_arg_pages(bprm);
+	setup_arg_pages(bprm, EXSTACK_DEFAULT);
 
 	create_som_tables(bprm);
 
--- diff/fs/block_dev.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/block_dev.c	2004-04-21 10:45:35.166357400 +0100
@@ -148,15 +148,15 @@ blkdev_get_blocks(struct inode *inode, s
 	return 0;
 }
 
-static int
+static ssize_t
 blkdev_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
 			loff_t offset, unsigned long nr_segs)
 {
 	struct file *file = iocb->ki_filp;
 	struct inode *inode = file->f_mapping->host;
 
-	return blockdev_direct_IO(rw, iocb, inode, I_BDEV(inode), iov, offset,
-				nr_segs, blkdev_get_blocks, NULL);
+	return blockdev_direct_IO_no_locking(rw, iocb, inode, I_BDEV(inode),
+				iov, offset, nr_segs, blkdev_get_blocks, NULL);
 }
 
 static int blkdev_writepage(struct page *page, struct writeback_control *wbc)
@@ -796,7 +796,7 @@ struct file_operations def_blk_fops = {
 	.fsync		= block_fsync,
 	.ioctl		= block_ioctl,
 	.readv		= generic_file_readv,
-	.writev		= generic_file_writev,
+	.writev		= generic_file_write_nolock,
 	.sendfile	= generic_file_sendfile,
 };
 
--- diff/fs/buffer.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/buffer.c	2004-04-21 10:45:35.168357096 +0100
@@ -51,25 +51,6 @@ static struct bh_wait_queue_head {
 	wait_queue_head_t wqh;
 } ____cacheline_aligned_in_smp bh_wait_queue_heads[1<<BH_WAIT_TABLE_ORDER];
 
-/*
- * Debug/devel support stuff
- */
-
-void __buffer_error(char *file, int line)
-{
-	static int enough;
-
-	if (enough > 10)
-		return;
-	enough++;
-	printk("buffer layer error at %s:%d\n", file, line);
-#ifndef CONFIG_KALLSYMS
-	printk("Pass this trace through ksymoops for reporting\n");
-#endif
-	dump_stack();
-}
-EXPORT_SYMBOL(__buffer_error);
-
 inline void
 init_buffer(struct buffer_head *bh, bh_end_io_t *handler, void *private)
 {
@@ -99,17 +80,6 @@ EXPORT_SYMBOL(wake_up_buffer);
 
 void fastcall unlock_buffer(struct buffer_head *bh)
 {
-	/*
-	 * unlock_buffer against a zero-count bh is a bug, if the page
-	 * is not locked.  Because then nothing protects the buffer's
-	 * waitqueue, which is used here. (Well.  Other locked buffers
-	 * against the page will pin it.  But complain anyway).
-	 */
-	if (atomic_read(&bh->b_count) == 0 &&
-			!PageLocked(bh->b_page) &&
-			!PageWriteback(bh->b_page))
-		buffer_error();
-
 	clear_buffer_locked(bh);
 	smp_mb__after_clear_bit();
 	wake_up_buffer(bh);
@@ -125,14 +95,14 @@ void __wait_on_buffer(struct buffer_head
 	wait_queue_head_t *wqh = bh_waitq_head(bh);
 	DEFINE_WAIT(wait);
 
-	if (atomic_read(&bh->b_count) == 0 &&
-			(!bh->b_page || !PageLocked(bh->b_page)))
-		buffer_error();
-
 	do {
 		prepare_to_wait(wqh, &wait, TASK_UNINTERRUPTIBLE);
 		if (buffer_locked(bh)) {
-			blk_run_queues();
+			struct block_device *bd;
+			smp_mb();
+			bd = bh->b_bdev;
+			if (bd)
+				blk_run_address_space(bd->bd_inode->i_mapping);
 			io_schedule();
 		}
 	} while (buffer_locked(bh));
@@ -142,8 +112,6 @@ void __wait_on_buffer(struct buffer_head
 static void
 __set_page_buffers(struct page *page, struct buffer_head *head)
 {
-	if (page_has_buffers(page))
-		buffer_error();
 	page_cache_get(page);
 	SetPagePrivate(page);
 	page->private = (unsigned long)head;
@@ -274,6 +242,8 @@ static void do_sync(unsigned long wait)
 	sync_inodes(wait);	/* Mappings, inodes and blockdevs, again. */
 	if (!wait)
 		printk("Emergency Sync complete\n");
+	if (unlikely(laptop_mode))
+		laptop_sync_completion();
 }
 
 asmlinkage long sys_sync(void)
@@ -396,7 +366,7 @@ out:
  * Hack idea: for the blockdev mapping, i_bufferlist_lock contention
  * may be quite high.  This code could TryLock the page, and if that
  * succeeds, there is no need to take private_lock. (But if
- * private_lock is contended then so is mapping->page_lock).
+ * private_lock is contended then so is mapping->tree_lock).
  */
 static struct buffer_head *
 __find_get_block_slow(struct block_device *bdev, sector_t block, int unused)
@@ -427,10 +397,12 @@ __find_get_block_slow(struct block_devic
 		}
 		bh = bh->b_this_page;
 	} while (bh != head);
-	buffer_error();
-	printk("block=%llu, b_blocknr=%llu\n",
+
+	printk("__find_get_block_slow() failed. "
+		"block=%llu, b_blocknr=%llu\n",
 		(unsigned long long)block, (unsigned long long)bh->b_blocknr);
 	printk("b_state=0x%08lx, b_size=%u\n", bh->b_state, bh->b_size);
+	printk("device blocksize: %d\n", 1 << bd_inode->i_blkbits);
 out_unlock:
 	spin_unlock(&bd_mapping->private_lock);
 	page_cache_release(page);
@@ -490,7 +462,6 @@ static void free_more_memory(void)
 	pg_data_t *pgdat;
 
 	wakeup_bdflush(1024);
-	blk_run_queues();
 	yield();
 
 	for_each_pgdat(pgdat) {
@@ -825,31 +796,16 @@ EXPORT_SYMBOL(mark_buffer_dirty_inode);
  * bit, see a bunch of clean buffers and we'd end up with dirty buffers/clean
  * page on the dirty page list.
  *
- * There is also a small window where the page is dirty, and not on dirty_pages.
- * Also a possibility that by the time the page is added to dirty_pages, it has
- * been set clean.  The page lists are somewhat approximate in this regard.
- * It's better to have clean pages accidentally attached to dirty_pages than to
- * leave dirty pages attached to clean_pages.
- *
  * We use private_lock to lock against try_to_free_buffers while using the
  * page's buffer list.  Also use this to protect against clean buffers being
  * added to the page after it was set dirty.
  *
  * FIXME: may need to call ->reservepage here as well.  That's rather up to the
  * address_space though.
- *
- * For now, we treat swapper_space specially.  It doesn't use the normal
- * block a_ops.
  */
 int __set_page_dirty_buffers(struct page *page)
 {
 	struct address_space * const mapping = page->mapping;
-	int ret = 0;
-
-	if (mapping == NULL) {
-		SetPageDirty(page);
-		goto out;
-	}
 
 	spin_lock(&mapping->private_lock);
 	if (page_has_buffers(page)) {
@@ -857,29 +813,25 @@ int __set_page_dirty_buffers(struct page
 		struct buffer_head *bh = head;
 
 		do {
-			if (buffer_uptodate(bh))
-				set_buffer_dirty(bh);
-			else
-				buffer_error();
+			set_buffer_dirty(bh);
 			bh = bh->b_this_page;
 		} while (bh != head);
 	}
 	spin_unlock(&mapping->private_lock);
 
 	if (!TestSetPageDirty(page)) {
-		spin_lock(&mapping->page_lock);
+		spin_lock_irq(&mapping->tree_lock);
 		if (page->mapping) {	/* Race with truncate? */
 			if (!mapping->backing_dev_info->memory_backed)
 				inc_page_state(nr_dirty);
-			list_del(&page->list);
-			list_add(&page->list, &mapping->dirty_pages);
+			radix_tree_tag_set(&mapping->page_tree, page->index,
+						PAGECACHE_TAG_DIRTY);
 		}
-		spin_unlock(&mapping->page_lock);
+		spin_unlock_irq(&mapping->tree_lock);
 		__mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
 	}
 	
-out:
-	return ret;
+	return 0;
 }
 EXPORT_SYMBOL(__set_page_dirty_buffers);
 
@@ -1162,7 +1114,7 @@ grow_dev_page(struct block_device *bdev,
 	return page;
 
 failed:
-	buffer_error();
+	BUG();
 	unlock_page(page);
 	page_cache_release(page);
 	return NULL;
@@ -1226,7 +1178,7 @@ __getblk_slow(struct block_device *bdev,
  * The relationship between dirty buffers and dirty pages:
  *
  * Whenever a page has any dirty buffers, the page's dirty bit is set, and
- * the page appears on its address_space.dirty_pages list.
+ * the page is tagged dirty in its radix tree.
  *
  * At all times, the dirtiness of the buffers represents the dirtiness of
  * subsections of the page.  If the page has buffers, the page dirty bit is
@@ -1248,18 +1200,16 @@ __getblk_slow(struct block_device *bdev,
 /**
  * mark_buffer_dirty - mark a buffer_head as needing writeout
  *
- * mark_buffer_dirty() will set the dirty bit against the buffer,
- * then set its backing page dirty, then attach the page to its
- * address_space's dirty_pages list and then attach the address_space's
- * inode to its superblock's dirty inode list.
+ * mark_buffer_dirty() will set the dirty bit against the buffer, then set its
+ * backing page dirty, then tag the page as dirty in its address_space's radix
+ * tree and then attach the address_space's inode to its superblock's dirty
+ * inode list.
  *
  * mark_buffer_dirty() is atomic.  It takes bh->b_page->mapping->private_lock,
- * mapping->page_lock and the global inode_lock.
+ * mapping->tree_lock and the global inode_lock.
  */
 void fastcall mark_buffer_dirty(struct buffer_head *bh)
 {
-	if (!buffer_uptodate(bh))
-		buffer_error();
 	if (!buffer_dirty(bh) && !test_set_buffer_dirty(bh))
 		__set_page_dirty_nobuffers(bh->b_page);
 }
@@ -1278,7 +1228,7 @@ void __brelse(struct buffer_head * buf)
 		return;
 	}
 	printk(KERN_ERR "VFS: brelse: Trying to free free buffer\n");
-	buffer_error();		/* For the stack backtrace */
+	WARN_ON(1);
 }
 
 /*
@@ -1305,8 +1255,6 @@ static struct buffer_head *__bread_slow(
 		unlock_buffer(bh);
 		return bh;
 	} else {
-		if (buffer_dirty(bh))
-			buffer_error();
 		get_bh(bh);
 		bh->b_end_io = end_buffer_read_sync;
 		submit_bh(READ, bh);
@@ -1578,8 +1526,7 @@ int try_to_release_page(struct page *pag
 {
 	struct address_space * const mapping = page->mapping;
 
-	if (!PageLocked(page))
-		BUG();
+	BUG_ON(!PageLocked(page));
 	if (PageWriteback(page))
 		return 0;
 	
@@ -1587,6 +1534,7 @@ int try_to_release_page(struct page *pag
 		return mapping->a_ops->releasepage(page, gfp_mask);
 	return try_to_free_buffers(page);
 }
+EXPORT_SYMBOL(try_to_release_page);
 
 /**
  * block_invalidatepage - invalidate part of all of a buffer-backed page
@@ -1697,10 +1645,6 @@ void unmap_underlying_metadata(struct bl
 
 	old_bh = __find_get_block_slow(bdev, block, 0);
 	if (old_bh) {
-#if 0	/* This happens.  Later. */
-		if (buffer_dirty(old_bh))
-			buffer_error();
-#endif
 		clear_buffer_dirty(old_bh);
 		wait_on_buffer(old_bh);
 		clear_buffer_req(old_bh);
@@ -1748,8 +1692,6 @@ static int __block_write_full_page(struc
 	last_block = (i_size_read(inode) - 1) >> inode->i_blkbits;
 
 	if (!page_has_buffers(page)) {
-		if (!PageUptodate(page))
-			buffer_error();
 		create_empty_buffers(page, 1 << inode->i_blkbits,
 					(1 << BH_Dirty)|(1 << BH_Uptodate));
 	}
@@ -1778,9 +1720,6 @@ static int __block_write_full_page(struc
 			 * mapped buffers outside i_size will occur, because
 			 * this page can be outside i_size when there is a
 			 * truncate in progress.
-			 *
-			 * if (buffer_mapped(bh))
-			 *	buffer_error();
 			 */
 			/*
 			 * The buffer was zeroed by block_write_full_page()
@@ -1788,8 +1727,6 @@ static int __block_write_full_page(struc
 			clear_buffer_dirty(bh);
 			set_buffer_uptodate(bh);
 		} else if (!buffer_mapped(bh) && buffer_dirty(bh)) {
-			if (buffer_new(bh))
-				buffer_error();
 			err = get_block(inode, block, bh, 1);
 			if (err)
 				goto recover;
@@ -1806,27 +1743,30 @@ static int __block_write_full_page(struc
 
 	do {
 		get_bh(bh);
-		if (buffer_mapped(bh) && buffer_dirty(bh)) {
-			if (wbc->sync_mode != WB_SYNC_NONE) {
-				lock_buffer(bh);
-			} else {
-				if (test_set_buffer_locked(bh)) {
-					__set_page_dirty_nobuffers(page);
-					continue;
-				}
-			}
-			if (test_clear_buffer_dirty(bh)) {
-				if (!buffer_uptodate(bh))
-					buffer_error();
-				mark_buffer_async_write(bh);
-			} else {
-				unlock_buffer(bh);
-			}
+		if (!buffer_mapped(bh))
+			continue;
+		/*
+		 * If it's a fully non-blocking write attempt and we cannot
+		 * lock the buffer then redirty the page.  Note that this can
+		 * potentially cause a busy-wait loop from pdflush and kswapd
+		 * activity, but those code paths have their own higher-level
+		 * throttling.
+		 */
+		if (wbc->sync_mode != WB_SYNC_NONE || !wbc->nonblocking) {
+			lock_buffer(bh);
+		} else if (test_set_buffer_locked(bh)) {
+			__set_page_dirty_nobuffers(page);
+			continue;
+		}
+		if (test_clear_buffer_dirty(bh)) {
+			mark_buffer_async_write(bh);
+		} else {
+			unlock_buffer(bh);
 		}
 	} while ((bh = bh->b_this_page) != head);
 
 	BUG_ON(PageWriteback(page));
-	SetPageWriteback(page);		/* Keeps try_to_free_buffers() away */
+	set_page_writeback(page);	/* Keeps try_to_free_buffers() away */
 	unlock_page(page);
 
 	/*
@@ -1862,6 +1802,7 @@ done:
 		if (uptodate)
 			SetPageUptodate(page);
 		end_page_writeback(page);
+		wbc->pages_skipped++;	/* We didn't write this page */
 	}
 	return err;
 
@@ -1889,7 +1830,7 @@ recover:
 	} while ((bh = bh->b_this_page) != head);
 	SetPageError(page);
 	BUG_ON(PageWriteback(page));
-	SetPageWriteback(page);
+	set_page_writeback(page);
 	unlock_page(page);
 	do {
 		struct buffer_head *next = bh->b_this_page;
@@ -1947,8 +1888,6 @@ static int __block_prepare_write(struct 
 				unmap_underlying_metadata(bh->b_bdev,
 							bh->b_blocknr);
 				if (PageUptodate(page)) {
-					if (!buffer_mapped(bh))
-						buffer_error();
 					set_buffer_uptodate(bh);
 					continue;
 				}
@@ -2006,8 +1945,6 @@ out:
 			void *kaddr;
 
 			clear_buffer_new(bh);
-			if (buffer_uptodate(bh))
-				buffer_error();
 			kaddr = kmap_atomic(page, KM_USER0);
 			memset(kaddr+block_start, 0, bh->b_size);
 			kunmap_atomic(kaddr, KM_USER0);
@@ -2073,8 +2010,6 @@ int block_read_full_page(struct page *pa
 
 	if (!PageLocked(page))
 		PAGE_BUG(page);
-	if (PageUptodate(page))
-		buffer_error();
 	blocksize = 1 << inode->i_blkbits;
 	if (!page_has_buffers(page))
 		create_empty_buffers(page, blocksize, 0);
@@ -2689,7 +2624,7 @@ static int end_bio_bh_io_sync(struct bio
 	return 0;
 }
 
-int submit_bh(int rw, struct buffer_head * bh)
+void submit_bh(int rw, struct buffer_head * bh)
 {
 	struct bio *bio;
 
@@ -2697,13 +2632,6 @@ int submit_bh(int rw, struct buffer_head
 	BUG_ON(!buffer_mapped(bh));
 	BUG_ON(!bh->b_end_io);
 
-	if ((rw == READ || rw == READA) && buffer_uptodate(bh))
-		buffer_error();
-	if (rw == WRITE && !buffer_uptodate(bh))
-		buffer_error();
-	if (rw == READ && buffer_dirty(bh))
-		buffer_error();
-
 	/* Only clear out a write error when rewriting */
 	if (test_set_buffer_req(bh) && rw == WRITE)
 		clear_buffer_write_io_error(bh);
@@ -2727,7 +2655,7 @@ int submit_bh(int rw, struct buffer_head
 	bio->bi_end_io = end_bio_bh_io_sync;
 	bio->bi_private = bh;
 
-	return submit_bio(rw, bio);
+	submit_bio(rw, bio);
 }
 
 /**
@@ -2803,21 +2731,6 @@ void sync_dirty_buffer(struct buffer_hea
 }
 
 /*
- * Sanity checks for try_to_free_buffers.
- */
-static void check_ttfb_buffer(struct page *page, struct buffer_head *bh)
-{
-	if (!buffer_uptodate(bh) && !buffer_req(bh)) {
-		if (PageUptodate(page) && page->mapping
-			&& buffer_mapped(bh)	/* discard_buffer */
-			&& S_ISBLK(page->mapping->host->i_mode))
-		{
-			buffer_error();
-		}
-	}
-}
-
-/*
  * try_to_free_buffers() checks if all the buffers on this particular page
  * are unused, and releases them if so.
  *
@@ -2852,7 +2765,6 @@ drop_buffers(struct page *page, struct b
 
 	bh = head;
 	do {
-		check_ttfb_buffer(page, bh);
 		if (buffer_write_io_error(bh))
 			set_bit(AS_EIO, &page->mapping->flags);
 		if (buffer_busy(bh))
@@ -2862,9 +2774,6 @@ drop_buffers(struct page *page, struct b
 		bh = bh->b_this_page;
 	} while (bh != head);
 
-	if (!was_uptodate && PageUptodate(page) && !PageError(page))
-		buffer_error();
-
 	do {
 		struct buffer_head *next = bh->b_this_page;
 
@@ -2889,14 +2798,14 @@ int try_to_free_buffers(struct page *pag
 	if (PageWriteback(page))
 		return 0;
 
-	if (mapping == NULL) {		/* swapped-in anon page */
+	if (mapping == NULL) {		/* can this still happen? */
 		ret = drop_buffers(page, &buffers_to_free);
 		goto out;
 	}
 
 	spin_lock(&mapping->private_lock);
 	ret = drop_buffers(page, &buffers_to_free);
-	if (ret && !PageSwapCache(page)) {
+	if (ret) {
 		/*
 		 * If the filesystem writes its buffers by hand (eg ext3)
 		 * then we can have clean buffers against a dirty page.  We
@@ -2924,7 +2833,10 @@ EXPORT_SYMBOL(try_to_free_buffers);
 
 int block_sync_page(struct page *page)
 {
-	blk_run_queues();
+	struct address_space *mapping;
+	smp_mb();
+	mapping = page->mapping;
+	blk_run_address_space(mapping);
 	return 0;
 }
 
--- diff/fs/cifs/cifsfs.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/cifs/cifsfs.c	2004-04-21 10:45:35.168357096 +0100
@@ -357,6 +357,12 @@ static struct quotactl_ops cifs_quotactl
 };
 #endif
 
+static int cifs_remount(struct super_block *sb, int *flags, char *data)
+{
+	*flags |= MS_NODIRATIME;
+	return 0;
+}
+
 struct super_operations cifs_super_ops = {
 	.read_inode = cifs_read_inode,
 	.put_super = cifs_put_super,
@@ -369,6 +375,7 @@ struct super_operations cifs_super_ops =
    us with the same number of releases (closes) as opens */
 	.show_options = cifs_show_options,
 /*    .umount_begin   = cifs_umount_begin, *//* consider adding in the future */
+	.remount_fs = cifs_remount,
 };
 
 static struct super_block *
--- diff/fs/cifs/file.c	2004-02-18 08:54:12.000000000 +0000
+++ source/fs/cifs/file.c	2004-04-21 10:45:35.169356944 +0100
@@ -898,11 +898,9 @@ static void cifs_copy_cache_pages(struct
 		if(list_empty(pages))
 			break;
 
-		spin_lock(&mapping->page_lock);
-		page = list_entry(pages->prev, struct page, list);
+		page = list_entry(pages->prev, struct page, lru);
 
-		list_del(&page->list);
-		spin_unlock(&mapping->page_lock);
+		list_del(&page->lru);
 
 		if (add_to_page_cache(page, mapping, page->index, GFP_KERNEL)) {
 			page_cache_release(page);
@@ -962,14 +960,10 @@ cifs_readpages(struct file *file, struct
 	pagevec_init(&lru_pvec, 0);
 
 	for(i = 0;i<num_pages;) {
-		spin_lock(&mapping->page_lock);
-		if(list_empty(page_list)) {
-			spin_unlock(&mapping->page_lock);
+		if(list_empty(page_list))
 			break;
-		}
-		page = list_entry(page_list->prev, struct page, list);
+		page = list_entry(page_list->prev, struct page, lru);
 		offset = (loff_t)page->index << PAGE_CACHE_SHIFT;
-	        spin_unlock(&mapping->page_lock);
 
 		/* for reads over a certain size could initiate async read ahead */
 
@@ -989,12 +983,11 @@ cifs_readpages(struct file *file, struct
 			cFYI(1,("Read error in readpages: %d",rc));
 			/* clean up remaing pages off list */
             
-			spin_lock(&mapping->page_lock);
 			while (!list_empty(page_list) && (i < num_pages)) {
-				page = list_entry(page_list->prev, struct page, list);
-				list_del(&page->list);
+				page = list_entry(page_list->prev,
+						struct page, lru);
+				list_del(&page->lru);
 			}
-			spin_unlock(&mapping->page_lock);
 			break;
 		} else if (bytes_read > 0) {
 			pSMBr = (struct smb_com_read_rsp *)smb_read_data;
@@ -1010,8 +1003,9 @@ cifs_readpages(struct file *file, struct
 			cFYI(1,("No bytes read cleaning remaining pages off readahead list"));
 			/* BB turn off caching and do new lookup on file size at server? */
 			while (!list_empty(page_list) && (i < num_pages)) {
-				page = list_entry(page_list->prev, struct page, list);
-				list_del(&page->list);
+				page = list_entry(page_list->prev,
+						struct page, lru);
+				list_del(&page->lru);
 			}
 
 			break;
--- diff/fs/coda/inode.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/coda/inode.c	2004-04-21 10:45:35.170356792 +0100
@@ -82,6 +82,12 @@ void coda_destroy_inodecache(void)
 		printk(KERN_INFO "coda_inode_cache: not all structures were freed\n");
 }
 
+static int coda_remount(struct super_block *sb, int *flags, char *data)
+{
+	*flags |= MS_NODIRATIME;
+	return 0;
+}
+
 /* exported operations */
 struct super_operations coda_super_operations =
 {
@@ -90,6 +96,7 @@ struct super_operations coda_super_opera
 	.clear_inode	= coda_clear_inode,
 	.put_super	= coda_put_super,
 	.statfs		= coda_statfs,
+	.remount_fs	= coda_remount,
 };
 
 static int get_device_index(struct coda_mount_data *data)
--- diff/fs/coda/psdev.c	2003-09-30 15:46:18.000000000 +0100
+++ source/fs/coda/psdev.c	2004-04-21 10:45:35.170356792 +0100
@@ -37,6 +37,7 @@
 #include <linux/init.h>
 #include <linux/list.h>
 #include <linux/smp_lock.h>
+#include <linux/device.h>
 #include <asm/io.h>
 #include <asm/system.h>
 #include <asm/poll.h>
@@ -61,6 +62,7 @@ unsigned long coda_timeout = 30; /* .. s
 
 
 struct venus_comm coda_comms[MAX_CODADEVS];
+static struct class_simple *coda_psdev_class;
 
 /*
  * Device operations
@@ -358,20 +360,38 @@ static struct file_operations coda_psdev
 
 static int init_coda_psdev(void)
 {
-	int i;
+	int i, err = 0;
 	if (register_chrdev(CODA_PSDEV_MAJOR,"coda_psdev",
 				 &coda_psdev_fops)) {
               printk(KERN_ERR "coda_psdev: unable to get major %d\n", 
 		     CODA_PSDEV_MAJOR);
               return -EIO;
 	}
+	coda_psdev_class = class_simple_create(THIS_MODULE, "coda_psdev");
+	if (IS_ERR(coda_psdev_class)) {
+		err = PTR_ERR(coda_psdev_class);
+		goto out_chrdev;
+	}		
 	devfs_mk_dir ("coda");
 	for (i = 0; i < MAX_CODADEVS; i++) {
-		devfs_mk_cdev(MKDEV(CODA_PSDEV_MAJOR, i),
+		class_simple_device_add(coda_psdev_class, MKDEV(CODA_PSDEV_MAJOR,i), 
+				NULL, "cfs%d", i);
+		err = devfs_mk_cdev(MKDEV(CODA_PSDEV_MAJOR, i),
 				S_IFCHR|S_IRUSR|S_IWUSR, "coda/%d", i);
+		if (err)
+			goto out_class;
 	}
 	coda_sysctl_init();
-	return 0;
+	goto out;
+
+out_class:
+	for (i = 0; i < MAX_CODADEVS; i++) 
+		class_simple_device_remove(MKDEV(CODA_PSDEV_MAJOR, i));
+	class_simple_destroy(coda_psdev_class);
+out_chrdev:
+	unregister_chrdev(CODA_PSDEV_MAJOR, "coda_psdev");
+out:
+	return err;
 }
 
 
@@ -408,8 +428,11 @@ static int __init init_coda(void)
 	}
 	return 0;
 out:
-	for (i = 0; i < MAX_CODADEVS; i++)
+	for (i = 0; i < MAX_CODADEVS; i++) {
+		class_simple_device_remove(MKDEV(CODA_PSDEV_MAJOR, i));
 		devfs_remove("coda/%d", i);
+	}
+	class_simple_destroy(coda_psdev_class);
 	devfs_remove("coda");
 	unregister_chrdev(CODA_PSDEV_MAJOR,"coda_psdev");
 	coda_sysctl_clean();
@@ -427,8 +450,11 @@ static void __exit exit_coda(void)
         if ( err != 0 ) {
                 printk("coda: failed to unregister filesystem\n");
         }
-	for (i = 0; i < MAX_CODADEVS; i++)
+	for (i = 0; i < MAX_CODADEVS; i++) {
+		class_simple_device_remove(MKDEV(CODA_PSDEV_MAJOR, i));
 		devfs_remove("coda/%d", i);
+	}
+	class_simple_destroy(coda_psdev_class);
 	devfs_remove("coda");
 	unregister_chrdev(CODA_PSDEV_MAJOR, "coda_psdev");
 	coda_sysctl_clean();
--- diff/fs/compat_ioctl.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/compat_ioctl.c	2004-04-21 10:45:35.172356488 +0100
@@ -1604,7 +1604,7 @@ static int vt_check(struct file *file)
 	 * To have permissions to do most of the vt ioctls, we either have
 	 * to be the owner of the tty, or super-user.
 	 */
-	if (current->tty == tty || capable(CAP_SYS_ADMIN))
+	if (current->signal->tty == tty || capable(CAP_SYS_ADMIN))
 		return 1;
 	return 0;                                                    
 }
--- diff/fs/cramfs/inode.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/cramfs/inode.c	2004-04-21 10:45:35.172356488 +0100
@@ -193,6 +193,12 @@ static void cramfs_put_super(struct supe
 	sb->s_fs_info = NULL;
 }
 
+static int cramfs_remount(struct super_block *sb, int *flags, char *data)
+{
+	*flags |= MS_RDONLY;
+	return 0;
+}
+
 static int cramfs_fill_super(struct super_block *sb, void *data, int silent)
 {
 	int i;
@@ -483,6 +489,7 @@ static struct inode_operations cramfs_di
 
 static struct super_operations cramfs_ops = {
 	.put_super	= cramfs_put_super,
+	.remount_fs	= cramfs_remount,
 	.statfs		= cramfs_statfs,
 };
 
--- diff/fs/dcache.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/dcache.c	2004-04-21 10:45:35.173356336 +0100
@@ -28,6 +28,7 @@
 #include <asm/uaccess.h>
 #include <linux/security.h>
 #include <linux/seqlock.h>
+#include <linux/swap.h>
 
 #define DCACHE_PARANOIA 1
 /* #define DCACHE_DEBUG 1 */
@@ -1619,13 +1620,21 @@ extern void chrdev_init(void);
 
 void __init vfs_caches_init(unsigned long mempages)
 {
-	names_cachep = kmem_cache_create("names_cache", 
-			PATH_MAX, 0, 
+	unsigned long reserve;
+
+	/* Base hash sizes on available memory, with a reserve equal to
+           150% of current kernel size */
+
+	reserve = (mempages - nr_free_pages()) * 3/2;
+	mempages -= reserve;
+
+	names_cachep = kmem_cache_create("names_cache",
+			PATH_MAX, 0,
 			SLAB_HWCACHE_ALIGN, NULL, NULL);
 	if (!names_cachep)
 		panic("Cannot create names SLAB cache");
 
-	filp_cachep = kmem_cache_create("filp", 
+	filp_cachep = kmem_cache_create("filp",
 			sizeof(struct file), 0,
 			SLAB_HWCACHE_ALIGN, filp_ctor, filp_dtor);
 	if(!filp_cachep)
@@ -1633,7 +1642,7 @@ void __init vfs_caches_init(unsigned lon
 
 	dcache_init(mempages);
 	inode_init(mempages);
-	files_init(mempages); 
+	files_init(mempages);
 	mnt_init(mempages);
 	bdev_cache_init();
 	chrdev_init();
--- diff/fs/devfs/base.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/devfs/base.c	2004-04-21 10:45:35.179355424 +0100
@@ -710,8 +710,8 @@
 #define DEBUG_UNREGISTER   0x0000004
 #define DEBUG_FREE         0x0000008
 #define DEBUG_SET_FLAGS    0x0000010
-#define DEBUG_S_READ       0x0000100        /*  Break  */
-#define DEBUG_I_LOOKUP     0x0001000        /*  Break  */
+#define DEBUG_S_READ       0x0000100	/*  Break  */
+#define DEBUG_I_LOOKUP     0x0001000	/*  Break  */
 #define DEBUG_I_CREATE     0x0002000
 #define DEBUG_I_GET        0x0004000
 #define DEBUG_I_CHANGE     0x0008000
@@ -719,8 +719,8 @@
 #define DEBUG_I_RLINK      0x0020000
 #define DEBUG_I_FLINK      0x0040000
 #define DEBUG_I_MKNOD      0x0080000
-#define DEBUG_F_READDIR    0x0100000        /*  Break  */
-#define DEBUG_D_DELETE     0x1000000        /*  Break  */
+#define DEBUG_F_READDIR    0x0100000	/*  Break  */
+#define DEBUG_D_DELETE     0x1000000	/*  Break  */
 #define DEBUG_D_RELEASE    0x2000000
 #define DEBUG_D_IPUT       0x4000000
 #define DEBUG_ALL          0xfffffff
@@ -753,88 +753,80 @@
 
 typedef struct devfs_entry *devfs_handle_t;
 
-struct directory_type
-{
-    rwlock_t lock;                   /*  Lock for searching(R)/updating(W)   */
-    struct devfs_entry *first;
-    struct devfs_entry *last;
-    unsigned char no_more_additions:1;
+struct directory_type {
+	rwlock_t lock;		/*  Lock for searching(R)/updating(W)   */
+	struct devfs_entry *first;
+	struct devfs_entry *last;
+	unsigned char no_more_additions:1;
 };
 
-struct symlink_type
-{
-    unsigned int length;         /*  Not including the NULL-termimator       */
-    char *linkname;              /*  This is NULL-terminated                 */
+struct symlink_type {
+	unsigned int length;	/*  Not including the NULL-termimator       */
+	char *linkname;		/*  This is NULL-terminated                 */
 };
 
-struct devfs_inode     /*  This structure is for "persistent" inode storage  */
-{
-    struct dentry *dentry;
-    struct timespec atime;
-    struct timespec mtime;
-    struct timespec ctime;
-    unsigned int ino;            /*  Inode number as seen in the VFS         */
-    uid_t uid;
-    gid_t gid;
+struct devfs_inode {		/*  This structure is for "persistent" inode storage  */
+	struct dentry *dentry;
+	struct timespec atime;
+	struct timespec mtime;
+	struct timespec ctime;
+	unsigned int ino;	/*  Inode number as seen in the VFS         */
+	uid_t uid;
+	gid_t gid;
 };
 
-struct devfs_entry
-{
+struct devfs_entry {
 #ifdef CONFIG_DEVFS_DEBUG
-    unsigned int magic_number;
+	unsigned int magic_number;
 #endif
-    void *info;
-    atomic_t refcount;           /*  When this drops to zero, it's unused    */
-    union 
-    {
-	struct directory_type dir;
-	dev_t dev;
-	struct symlink_type symlink;
-	const char *name;        /*  Only used for (mode == 0)               */
-    }
-    u;
-    struct devfs_entry *prev;    /*  Previous entry in the parent directory  */
-    struct devfs_entry *next;    /*  Next entry in the parent directory      */
-    struct devfs_entry *parent;  /*  The parent directory                    */
-    struct devfs_inode inode;
-    umode_t mode;
-    unsigned short namelen;      /*  I think 64k+ filenames are a way off... */
-    unsigned char vfs:1;/*  Whether the VFS may delete the entry   */
-    char name[1];                /*  This is just a dummy: the allocated array
-				     is bigger. This is NULL-terminated      */
+	void *info;
+	atomic_t refcount;	/*  When this drops to zero, it's unused    */
+	union {
+		struct directory_type dir;
+		dev_t dev;
+		struct symlink_type symlink;
+		const char *name;	/*  Only used for (mode == 0)               */
+	} u;
+	struct devfs_entry *prev;	/*  Previous entry in the parent directory  */
+	struct devfs_entry *next;	/*  Next entry in the parent directory      */
+	struct devfs_entry *parent;	/*  The parent directory                    */
+	struct devfs_inode inode;
+	umode_t mode;
+	unsigned short namelen;	/*  I think 64k+ filenames are a way off... */
+	unsigned char vfs:1;	/*  Whether the VFS may delete the entry   */
+	char name[1];		/*  This is just a dummy: the allocated array
+				   is bigger. This is NULL-terminated      */
 };
 
 /*  The root of the device tree  */
 static struct devfs_entry *root_entry;
 
-struct devfsd_buf_entry
-{
-    struct devfs_entry *de;      /*  The name is generated with this         */
-    unsigned short type;         /*  The type of event                       */
-    umode_t mode;
-    uid_t uid;
-    gid_t gid;
-    struct devfsd_buf_entry *next;
+struct devfsd_buf_entry {
+	struct devfs_entry *de;	/*  The name is generated with this         */
+	unsigned short type;	/*  The type of event                       */
+	umode_t mode;
+	uid_t uid;
+	gid_t gid;
+	struct devfsd_buf_entry *next;
 };
 
-struct fs_info                  /*  This structure is for the mounted devfs  */
-{
-    struct super_block *sb;
-    spinlock_t devfsd_buffer_lock;  /*  Lock when inserting/deleting events  */
-    struct devfsd_buf_entry *devfsd_first_event;
-    struct devfsd_buf_entry *devfsd_last_event;
-    volatile int devfsd_sleeping;
-    volatile struct task_struct *devfsd_task;
-    volatile pid_t devfsd_pgrp;
-    volatile struct file *devfsd_file;
-    struct devfsd_notify_struct *devfsd_info;
-    volatile unsigned long devfsd_event_mask;
-    atomic_t devfsd_overrun_count;
-    wait_queue_head_t devfsd_wait_queue;      /*  Wake devfsd on input       */
-    wait_queue_head_t revalidate_wait_queue;  /*  Wake when devfsd sleeps    */
+struct fs_info {		/*  This structure is for the mounted devfs  */
+	struct super_block *sb;
+	spinlock_t devfsd_buffer_lock;	/*  Lock when inserting/deleting events  */
+	struct devfsd_buf_entry *devfsd_first_event;
+	struct devfsd_buf_entry *devfsd_last_event;
+	volatile int devfsd_sleeping;
+	volatile struct task_struct *devfsd_task;
+	volatile pid_t devfsd_pgrp;
+	volatile struct file *devfsd_file;
+	struct devfsd_notify_struct *devfsd_info;
+	volatile unsigned long devfsd_event_mask;
+	atomic_t devfsd_overrun_count;
+	wait_queue_head_t devfsd_wait_queue;	/*  Wake devfsd on input       */
+	wait_queue_head_t revalidate_wait_queue;	/*  Wake when devfsd sleeps    */
 };
 
-static struct fs_info fs_info = {.devfsd_buffer_lock = SPIN_LOCK_UNLOCKED};
+static struct fs_info fs_info = {.devfsd_buffer_lock = SPIN_LOCK_UNLOCKED };
 static kmem_cache_t *devfsd_buf_cache;
 #ifdef CONFIG_DEVFS_DEBUG
 static unsigned int devfs_debug_init __initdata = DEBUG_NONE;
@@ -844,7 +836,7 @@ static unsigned int stat_num_entries;
 static unsigned int stat_num_bytes;
 #endif
 static unsigned char poison_array[8] =
-    {0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a};
+    { 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a };
 
 #ifdef CONFIG_DEVFS_MOUNT
 static unsigned int boot_options = OPTION_MOUNT;
@@ -853,75 +845,77 @@ static unsigned int boot_options = OPTIO
 #endif
 
 /*  Forward function declarations  */
-static devfs_handle_t _devfs_walk_path (struct devfs_entry *dir,
-					const char *name, int namelen,
-					int traverse_symlink);
-static ssize_t devfsd_read (struct file *file, char *buf, size_t len,
-			    loff_t *ppos);
-static int devfsd_ioctl (struct inode *inode, struct file *file,
-			 unsigned int cmd, unsigned long arg);
-static int devfsd_close (struct inode *inode, struct file *file);
+static devfs_handle_t _devfs_walk_path(struct devfs_entry *dir,
+				       const char *name, int namelen,
+				       int traverse_symlink);
+static ssize_t devfsd_read(struct file *file, char *buf, size_t len,
+			   loff_t * ppos);
+static int devfsd_ioctl(struct inode *inode, struct file *file,
+			unsigned int cmd, unsigned long arg);
+static int devfsd_close(struct inode *inode, struct file *file);
 #ifdef CONFIG_DEVFS_DEBUG
-static ssize_t stat_read (struct file *file, char *buf, size_t len,
-			  loff_t *ppos);
-static struct file_operations stat_fops =
-{
-    .read    = stat_read,
+static ssize_t stat_read(struct file *file, char *buf, size_t len,
+			 loff_t * ppos);
+static struct file_operations stat_fops = {
+	.read = stat_read,
 };
 #endif
 
-
 /*  Devfs daemon file operations  */
-static struct file_operations devfsd_fops =
-{
-    .read    = devfsd_read,
-    .ioctl   = devfsd_ioctl,
-    .release = devfsd_close,
+static struct file_operations devfsd_fops = {
+	.read = devfsd_read,
+	.ioctl = devfsd_ioctl,
+	.release = devfsd_close,
 };
 
-
 /*  Support functions follow  */
 
-
 /**
  *	devfs_get - Get a reference to a devfs entry.
  *	@de:  The devfs entry.
  */
 
-static struct devfs_entry *devfs_get (struct devfs_entry *de)
+static struct devfs_entry *devfs_get(struct devfs_entry *de)
 {
-    VERIFY_ENTRY (de);
-    if (de) atomic_inc (&de->refcount);
-    return de;
-}   /*  End Function devfs_get  */
+	VERIFY_ENTRY(de);
+	if (de)
+		atomic_inc(&de->refcount);
+	return de;
+}				/*  End Function devfs_get  */
 
 /**
  *	devfs_put - Put (release) a reference to a devfs entry.
  *	@de:  The handle to the devfs entry.
  */
 
-static void devfs_put (devfs_handle_t de)
+static void devfs_put(devfs_handle_t de)
 {
-    if (!de) return;
-    VERIFY_ENTRY (de);
-    if (de->info == POISON_PTR) OOPS ("(%p): poisoned pointer\n", de);
-    if ( !atomic_dec_and_test (&de->refcount) ) return;
-    if (de == root_entry) OOPS ("(%p): root entry being freed\n", de);
-    DPRINTK (DEBUG_FREE, "(%s): de: %p, parent: %p \"%s\"\n",
-	     de->name, de, de->parent,
-	     de->parent ? de->parent->name : "no parent");
-    if ( S_ISLNK (de->mode) ) kfree (de->u.symlink.linkname);
-    WRITE_ENTRY_MAGIC (de, 0);
+	if (!de)
+		return;
+	VERIFY_ENTRY(de);
+	if (de->info == POISON_PTR)
+		OOPS("(%p): poisoned pointer\n", de);
+	if (!atomic_dec_and_test(&de->refcount))
+		return;
+	if (de == root_entry)
+		OOPS("(%p): root entry being freed\n", de);
+	DPRINTK(DEBUG_FREE, "(%s): de: %p, parent: %p \"%s\"\n",
+		de->name, de, de->parent,
+		de->parent ? de->parent->name : "no parent");
+	if (S_ISLNK(de->mode))
+		kfree(de->u.symlink.linkname);
+	WRITE_ENTRY_MAGIC(de, 0);
 #ifdef CONFIG_DEVFS_DEBUG
-    spin_lock (&stat_lock);
-    --stat_num_entries;
-    stat_num_bytes -= sizeof *de + de->namelen;
-    if ( S_ISLNK (de->mode) ) stat_num_bytes -= de->u.symlink.length + 1;
-    spin_unlock (&stat_lock);
+	spin_lock(&stat_lock);
+	--stat_num_entries;
+	stat_num_bytes -= sizeof *de + de->namelen;
+	if (S_ISLNK(de->mode))
+		stat_num_bytes -= de->u.symlink.length + 1;
+	spin_unlock(&stat_lock);
 #endif
-    de->info = POISON_PTR;
-    kfree (de);
-}   /*  End Function devfs_put  */
+	de->info = POISON_PTR;
+	kfree(de);
+}				/*  End Function devfs_put  */
 
 /**
  *	_devfs_search_dir - Search for a devfs entry in a directory.
@@ -934,26 +928,25 @@ static void devfs_put (devfs_handle_t de
  *   An implicit devfs_get() is performed on the returned entry.
  */
 
-static struct devfs_entry *_devfs_search_dir (struct devfs_entry *dir,
-					      const char *name,
-					      unsigned int namelen)
-{
-    struct devfs_entry *curr;
-
-    if ( !S_ISDIR (dir->mode) )
-    {
-	PRINTK ("(%s): not a directory\n", dir->name);
-	return NULL;
-    }
-    for (curr = dir->u.dir.first; curr != NULL; curr = curr->next)
-    {
-	if (curr->namelen != namelen) continue;
-	if (memcmp (curr->name, name, namelen) == 0) break;
-	/*  Not found: try the next one  */
-    }
-    return devfs_get (curr);
-}   /*  End Function _devfs_search_dir  */
+static struct devfs_entry *_devfs_search_dir(struct devfs_entry *dir,
+					     const char *name,
+					     unsigned int namelen)
+{
+	struct devfs_entry *curr;
 
+	if (!S_ISDIR(dir->mode)) {
+		PRINTK("(%s): not a directory\n", dir->name);
+		return NULL;
+	}
+	for (curr = dir->u.dir.first; curr != NULL; curr = curr->next) {
+		if (curr->namelen != namelen)
+			continue;
+		if (memcmp(curr->name, name, namelen) == 0)
+			break;
+		/*  Not found: try the next one  */
+	}
+	return devfs_get(curr);
+}				/*  End Function _devfs_search_dir  */
 
 /**
  *	_devfs_alloc_entry - Allocate a devfs entry.
@@ -965,36 +958,38 @@ static struct devfs_entry *_devfs_search
  *   %NULL.
  */
 
-static struct devfs_entry *_devfs_alloc_entry (const char *name,
-					       unsigned int namelen,
-					       umode_t mode)
-{
-    struct devfs_entry *new;
-    static unsigned long inode_counter = FIRST_INODE;
-    static spinlock_t counter_lock = SPIN_LOCK_UNLOCKED;
-
-    if ( name && (namelen < 1) ) namelen = strlen (name);
-    if ( ( new = kmalloc (sizeof *new + namelen, GFP_KERNEL) ) == NULL )
-	return NULL;
-    memset (new, 0, sizeof *new + namelen);  /*  Will set '\0' on name  */
-    new->mode = mode;
-    if ( S_ISDIR (mode) ) rwlock_init (&new->u.dir.lock);
-    atomic_set (&new->refcount, 1);
-    spin_lock (&counter_lock);
-    new->inode.ino = inode_counter++;
-    spin_unlock (&counter_lock);
-    if (name) memcpy (new->name, name, namelen);
-    new->namelen = namelen;
-    WRITE_ENTRY_MAGIC (new, MAGIC_VALUE);
+static struct devfs_entry *_devfs_alloc_entry(const char *name,
+					      unsigned int namelen,
+					      umode_t mode)
+{
+	struct devfs_entry *new;
+	static unsigned long inode_counter = FIRST_INODE;
+	static spinlock_t counter_lock = SPIN_LOCK_UNLOCKED;
+
+	if (name && (namelen < 1))
+		namelen = strlen(name);
+	if ((new = kmalloc(sizeof *new + namelen, GFP_KERNEL)) == NULL)
+		return NULL;
+	memset(new, 0, sizeof *new + namelen);	/*  Will set '\0' on name  */
+	new->mode = mode;
+	if (S_ISDIR(mode))
+		rwlock_init(&new->u.dir.lock);
+	atomic_set(&new->refcount, 1);
+	spin_lock(&counter_lock);
+	new->inode.ino = inode_counter++;
+	spin_unlock(&counter_lock);
+	if (name)
+		memcpy(new->name, name, namelen);
+	new->namelen = namelen;
+	WRITE_ENTRY_MAGIC(new, MAGIC_VALUE);
 #ifdef CONFIG_DEVFS_DEBUG
-    spin_lock (&stat_lock);
-    ++stat_num_entries;
-    stat_num_bytes += sizeof *new + namelen;
-    spin_unlock (&stat_lock);
+	spin_lock(&stat_lock);
+	++stat_num_entries;
+	stat_num_bytes += sizeof *new + namelen;
+	spin_unlock(&stat_lock);
 #endif
-    return new;
-}   /*  End Function _devfs_alloc_entry  */
-
+	return new;
+}				/*  End Function _devfs_alloc_entry  */
 
 /**
  *	_devfs_append_entry - Append a devfs entry to a directory's child list.
@@ -1009,43 +1004,48 @@ static struct devfs_entry *_devfs_alloc_
  *   On failure, an implicit devfs_put() is performed on %de.
  */
 
-static int _devfs_append_entry (devfs_handle_t dir, devfs_handle_t de,
-				devfs_handle_t *old_de)
+static int _devfs_append_entry(devfs_handle_t dir, devfs_handle_t de,
+			       devfs_handle_t * old_de)
 {
-    int retval;
+	int retval;
 
-    if (old_de) *old_de = NULL;
-    if ( !S_ISDIR (dir->mode) )
-    {
-	PRINTK ("(%s): dir: \"%s\" is not a directory\n", de->name, dir->name);
-	devfs_put (de);
-	return -ENOTDIR;
-    }
-    write_lock (&dir->u.dir.lock);
-    if (dir->u.dir.no_more_additions) retval = -ENOENT;
-    else
-    {
-	struct devfs_entry *old;
-
-	old = _devfs_search_dir (dir, de->name, de->namelen);
-	if (old_de) *old_de = old;
-	else devfs_put (old);
-	if (old == NULL)
-	{
-	    de->parent = dir;
-	    de->prev = dir->u.dir.last;
-	    /*  Append to the directory's list of children  */
-	    if (dir->u.dir.first == NULL) dir->u.dir.first = de;
-	    else dir->u.dir.last->next = de;
-	    dir->u.dir.last = de;
-	    retval = 0;
-	}
-	else retval = -EEXIST;
-    }
-    write_unlock (&dir->u.dir.lock);
-    if (retval) devfs_put (de);
-    return retval;
-}   /*  End Function _devfs_append_entry  */
+	if (old_de)
+		*old_de = NULL;
+	if (!S_ISDIR(dir->mode)) {
+		PRINTK("(%s): dir: \"%s\" is not a directory\n", de->name,
+		       dir->name);
+		devfs_put(de);
+		return -ENOTDIR;
+	}
+	write_lock(&dir->u.dir.lock);
+	if (dir->u.dir.no_more_additions)
+		retval = -ENOENT;
+	else {
+		struct devfs_entry *old;
+
+		old = _devfs_search_dir(dir, de->name, de->namelen);
+		if (old_de)
+			*old_de = old;
+		else
+			devfs_put(old);
+		if (old == NULL) {
+			de->parent = dir;
+			de->prev = dir->u.dir.last;
+			/*  Append to the directory's list of children  */
+			if (dir->u.dir.first == NULL)
+				dir->u.dir.first = de;
+			else
+				dir->u.dir.last->next = de;
+			dir->u.dir.last = de;
+			retval = 0;
+		} else
+			retval = -EEXIST;
+	}
+	write_unlock(&dir->u.dir.lock);
+	if (retval)
+		devfs_put(de);
+	return retval;
+}				/*  End Function _devfs_append_entry  */
 
 /**
  *	_devfs_get_root_entry - Get the root devfs entry.
@@ -1067,7 +1067,7 @@ static struct devfs_entry *_devfs_get_ro
 		return root_entry;
 
 	new = _devfs_alloc_entry(NULL, 0, MODE_DIR);
-	if (new == NULL )
+	if (new == NULL)
 		return NULL;
 
 	spin_lock(&root_lock);
@@ -1080,7 +1080,7 @@ static struct devfs_entry *_devfs_get_ro
 	spin_unlock(&root_lock);
 
 	return root_entry;
-}   /*  End Function _devfs_get_root_entry  */
+}				/*  End Function _devfs_get_root_entry  */
 
 /**
  *	_devfs_descend - Descend down a tree using the next component name.
@@ -1096,142 +1096,134 @@ static struct devfs_entry *_devfs_get_ro
  *   An implicit devfs_get() is performed on the returned entry.
  */
 
-static struct devfs_entry *_devfs_descend (struct devfs_entry *dir,
-					   const char *name, int namelen,
-					   int *next_pos)
-{
-    const char *stop, *ptr;
-    struct devfs_entry *entry;
-
-    if ( (namelen >= 3) && (strncmp (name, "../", 3) == 0) )
-    {   /*  Special-case going to parent directory  */
-	*next_pos = 3;
-	return devfs_get (dir->parent);
-    }
-    stop = name + namelen;
-    /*  Search for a possible '/'  */
-    for (ptr = name; (ptr < stop) && (*ptr != '/'); ++ptr);
-    *next_pos = ptr - name;
-    read_lock (&dir->u.dir.lock);
-    entry = _devfs_search_dir (dir, name, *next_pos);
-    read_unlock (&dir->u.dir.lock);
-    return entry;
-}   /*  End Function _devfs_descend  */
-
-
-static devfs_handle_t _devfs_make_parent_for_leaf (struct devfs_entry *dir,
-						   const char *name,
-						   int namelen, int *leaf_pos)
-{
-    int next_pos = 0;
-
-    if (dir == NULL) dir = _devfs_get_root_entry ();
-    if (dir == NULL) return NULL;
-    devfs_get (dir);
-    /*  Search for possible trailing component and ignore it  */
-    for (--namelen; (namelen > 0) && (name[namelen] != '/'); --namelen);
-    *leaf_pos = (name[namelen] == '/') ? (namelen + 1) : 0;
-    for (; namelen > 0; name += next_pos, namelen -= next_pos)
-    {
-	struct devfs_entry *de, *old = NULL;
-
-	if ( ( de = _devfs_descend (dir, name, namelen, &next_pos) ) == NULL )
-	{
-	    de = _devfs_alloc_entry (name, next_pos, MODE_DIR);
-	    devfs_get (de);
-	    if ( !de || _devfs_append_entry (dir, de, &old) )
-	    {
-		devfs_put (de);
-		if ( !old || !S_ISDIR (old->mode) )
-		{
-		    devfs_put (old);
-		    devfs_put (dir);
-		    return NULL;
+static struct devfs_entry *_devfs_descend(struct devfs_entry *dir,
+					  const char *name, int namelen,
+					  int *next_pos)
+{
+	const char *stop, *ptr;
+	struct devfs_entry *entry;
+
+	if ((namelen >= 3) && (strncmp(name, "../", 3) == 0)) {	/*  Special-case going to parent directory  */
+		*next_pos = 3;
+		return devfs_get(dir->parent);
+	}
+	stop = name + namelen;
+	/*  Search for a possible '/'  */
+	for (ptr = name; (ptr < stop) && (*ptr != '/'); ++ptr) ;
+	*next_pos = ptr - name;
+	read_lock(&dir->u.dir.lock);
+	entry = _devfs_search_dir(dir, name, *next_pos);
+	read_unlock(&dir->u.dir.lock);
+	return entry;
+}				/*  End Function _devfs_descend  */
+
+static devfs_handle_t _devfs_make_parent_for_leaf(struct devfs_entry *dir,
+						  const char *name,
+						  int namelen, int *leaf_pos)
+{
+	int next_pos = 0;
+
+	if (dir == NULL)
+		dir = _devfs_get_root_entry();
+	if (dir == NULL)
+		return NULL;
+	devfs_get(dir);
+	/*  Search for possible trailing component and ignore it  */
+	for (--namelen; (namelen > 0) && (name[namelen] != '/'); --namelen) ;
+	*leaf_pos = (name[namelen] == '/') ? (namelen + 1) : 0;
+	for (; namelen > 0; name += next_pos, namelen -= next_pos) {
+		struct devfs_entry *de, *old = NULL;
+
+		if ((de =
+		     _devfs_descend(dir, name, namelen, &next_pos)) == NULL) {
+			de = _devfs_alloc_entry(name, next_pos, MODE_DIR);
+			devfs_get(de);
+			if (!de || _devfs_append_entry(dir, de, &old)) {
+				devfs_put(de);
+				if (!old || !S_ISDIR(old->mode)) {
+					devfs_put(old);
+					devfs_put(dir);
+					return NULL;
+				}
+				de = old;	/*  Use the existing directory  */
+			}
+		}
+		if (de == dir->parent) {
+			devfs_put(dir);
+			devfs_put(de);
+			return NULL;
 		}
-		de = old;  /*  Use the existing directory  */
-	    }
+		devfs_put(dir);
+		dir = de;
+		if (name[next_pos] == '/')
+			++next_pos;
+	}
+	return dir;
+}				/*  End Function _devfs_make_parent_for_leaf  */
+
+static devfs_handle_t _devfs_prepare_leaf(devfs_handle_t * dir,
+					  const char *name, umode_t mode)
+{
+	int namelen, leaf_pos;
+	struct devfs_entry *de;
+
+	namelen = strlen(name);
+	if ((*dir = _devfs_make_parent_for_leaf(*dir, name, namelen,
+						&leaf_pos)) == NULL) {
+		PRINTK("(%s): could not create parent path\n", name);
+		return NULL;
 	}
-	if (de == dir->parent)
-	{
-	    devfs_put (dir);
-	    devfs_put (de);
-	    return NULL;
-	}
-	devfs_put (dir);
-	dir = de;
-	if (name[next_pos] == '/') ++next_pos;
-    }
-    return dir;
-}   /*  End Function _devfs_make_parent_for_leaf  */
-
-
-static devfs_handle_t _devfs_prepare_leaf (devfs_handle_t *dir,
-					   const char *name, umode_t mode)
-{
-    int namelen, leaf_pos;
-    struct devfs_entry *de;
-
-    namelen = strlen (name);
-    if ( ( *dir = _devfs_make_parent_for_leaf (*dir, name, namelen,
-					       &leaf_pos) ) == NULL )
-    {
-	PRINTK ("(%s): could not create parent path\n", name);
-	return NULL;
-    }
-    if ( ( de = _devfs_alloc_entry (name + leaf_pos, namelen - leaf_pos,mode) )
-	 == NULL )
-    {
-	PRINTK ("(%s): could not allocate entry\n", name);
-	devfs_put (*dir);
-	return NULL;
-    }
-    return de;
-}   /*  End Function _devfs_prepare_leaf  */
-
-
-static devfs_handle_t _devfs_walk_path (struct devfs_entry *dir,
-					const char *name, int namelen,
-					int traverse_symlink)
-{
-    int next_pos = 0;
-
-    if (dir == NULL) dir = _devfs_get_root_entry ();
-    if (dir == NULL) return NULL;
-    devfs_get (dir);
-    for (; namelen > 0; name += next_pos, namelen -= next_pos)
-    {
-	struct devfs_entry *de, *link;
-
-	if (!S_ISDIR (dir->mode))
-	{
-	    devfs_put (dir);
-	    return NULL;
-	}
-
-	if ( ( de = _devfs_descend (dir, name, namelen, &next_pos) ) == NULL )
-	{
-	    devfs_put (dir);
-	    return NULL;
-	}
-	if (S_ISLNK (de->mode) && traverse_symlink)
-	{   /*  Need to follow the link: this is a stack chomper  */
-		/* FIXME what if it puts outside of mounted tree? */
-	    link = _devfs_walk_path (dir, de->u.symlink.linkname,
-				     de->u.symlink.length, TRUE);
-	    devfs_put (de);
-	    if (!link)
-	    {
-		devfs_put (dir);
+	if ((de = _devfs_alloc_entry(name + leaf_pos, namelen - leaf_pos, mode))
+	    == NULL) {
+		PRINTK("(%s): could not allocate entry\n", name);
+		devfs_put(*dir);
 		return NULL;
-	    }
-	    de = link;
 	}
-	devfs_put (dir);
-	dir = de;
-	if (name[next_pos] == '/') ++next_pos;
-    }
-    return dir;
-}   /*  End Function _devfs_walk_path  */
+	return de;
+}				/*  End Function _devfs_prepare_leaf  */
+
+static devfs_handle_t _devfs_walk_path(struct devfs_entry *dir,
+				       const char *name, int namelen,
+				       int traverse_symlink)
+{
+	int next_pos = 0;
+
+	if (dir == NULL)
+		dir = _devfs_get_root_entry();
+	if (dir == NULL)
+		return NULL;
+	devfs_get(dir);
+	for (; namelen > 0; name += next_pos, namelen -= next_pos) {
+		struct devfs_entry *de, *link;
+
+		if (!S_ISDIR(dir->mode)) {
+			devfs_put(dir);
+			return NULL;
+		}
+
+		if ((de =
+		     _devfs_descend(dir, name, namelen, &next_pos)) == NULL) {
+			devfs_put(dir);
+			return NULL;
+		}
+		if (S_ISLNK(de->mode) && traverse_symlink) {	/*  Need to follow the link: this is a stack chomper  */
+			/* FIXME what if it puts outside of mounted tree? */
+			link = _devfs_walk_path(dir, de->u.symlink.linkname,
+						de->u.symlink.length, TRUE);
+			devfs_put(de);
+			if (!link) {
+				devfs_put(dir);
+				return NULL;
+			}
+			de = link;
+		}
+		devfs_put(dir);
+		dir = de;
+		if (name[next_pos] == '/')
+			++next_pos;
+	}
+	return dir;
+}				/*  End Function _devfs_walk_path  */
 
 /**
  *	_devfs_find_entry - Find a devfs entry.
@@ -1244,40 +1236,37 @@ static devfs_handle_t _devfs_walk_path (
  *	devfs_get() is performed.
  */
 
-static struct devfs_entry *_devfs_find_entry (devfs_handle_t dir,
-					      const char *name,
-					      int traverse_symlink)
-{
-    unsigned int namelen = strlen (name);
-
-    if (name[0] == '/')
-    {
-	/*  Skip leading pathname component  */
-	if (namelen < 2)
-	{
-	    PRINTK ("(%s): too short\n", name);
-	    return NULL;
-	}
-	for (++name, --namelen; (*name != '/') && (namelen > 0);
-	     ++name, --namelen);
-	if (namelen < 2)
-	{
-	    PRINTK ("(%s): too short\n", name);
-	    return NULL;
-	}
-	++name;
-	--namelen;
-    }
-    return _devfs_walk_path (dir, name, namelen, traverse_symlink);
-}   /*  End Function _devfs_find_entry  */
-
-static struct devfs_entry *get_devfs_entry_from_vfs_inode (struct inode *inode)
-{
-    if (inode == NULL) return NULL;
-    VERIFY_ENTRY ( (struct devfs_entry *) inode->u.generic_ip );
-    return inode->u.generic_ip;
-}   /*  End Function get_devfs_entry_from_vfs_inode  */
+static struct devfs_entry *_devfs_find_entry(devfs_handle_t dir,
+					     const char *name,
+					     int traverse_symlink)
+{
+	unsigned int namelen = strlen(name);
+
+	if (name[0] == '/') {
+		/*  Skip leading pathname component  */
+		if (namelen < 2) {
+			PRINTK("(%s): too short\n", name);
+			return NULL;
+		}
+		for (++name, --namelen; (*name != '/') && (namelen > 0);
+		     ++name, --namelen) ;
+		if (namelen < 2) {
+			PRINTK("(%s): too short\n", name);
+			return NULL;
+		}
+		++name;
+		--namelen;
+	}
+	return _devfs_walk_path(dir, name, namelen, traverse_symlink);
+}				/*  End Function _devfs_find_entry  */
 
+static struct devfs_entry *get_devfs_entry_from_vfs_inode(struct inode *inode)
+{
+	if (inode == NULL)
+		return NULL;
+	VERIFY_ENTRY((struct devfs_entry *)inode->u.generic_ip);
+	return inode->u.generic_ip;
+}				/*  End Function get_devfs_entry_from_vfs_inode  */
 
 /**
  *	free_dentry - Free the dentry for a device entry and invalidate inode.
@@ -1287,20 +1276,21 @@ static struct devfs_entry *get_devfs_ent
  *	 parent directory.
  */
 
-static void free_dentry (struct devfs_entry *de)
+static void free_dentry(struct devfs_entry *de)
 {
-    struct dentry *dentry = de->inode.dentry;
-
-    if (!dentry) return;
-    spin_lock (&dcache_lock);
-    dget_locked (dentry);
-    spin_unlock (&dcache_lock);
-    /*  Forcefully remove the inode  */
-    if (dentry->d_inode != NULL) dentry->d_inode->i_nlink = 0;
-    d_drop (dentry);
-    dput (dentry);
-}   /*  End Function free_dentry  */
+	struct dentry *dentry = de->inode.dentry;
 
+	if (!dentry)
+		return;
+	spin_lock(&dcache_lock);
+	dget_locked(dentry);
+	spin_unlock(&dcache_lock);
+	/*  Forcefully remove the inode  */
+	if (dentry->d_inode != NULL)
+		dentry->d_inode->i_nlink = 0;
+	d_drop(dentry);
+	dput(dentry);
+}				/*  End Function free_dentry  */
 
 /**
  *	is_devfsd_or_child - Test if the current process is devfsd or one of its children.
@@ -1309,25 +1299,24 @@ static void free_dentry (struct devfs_en
  *	Returns %TRUE if devfsd or child, else %FALSE.
  */
 
-static int is_devfsd_or_child (struct fs_info *fs_info)
+static int is_devfsd_or_child(struct fs_info *fs_info)
 {
-    struct task_struct *p = current;
+	struct task_struct *p = current;
 
-    if (p == fs_info->devfsd_task) return (TRUE);
-    if (process_group(p) == fs_info->devfsd_pgrp) return (TRUE);
-    read_lock(&tasklist_lock);
-    for ( ; p != &init_task; p = p->real_parent)
-    {
 	if (p == fs_info->devfsd_task)
-	{
-	    read_unlock (&tasklist_lock);
-	    return (TRUE);
-	}
-    }
-    read_unlock (&tasklist_lock);
-    return (FALSE);
-}   /*  End Function is_devfsd_or_child  */
-
+		return (TRUE);
+	if (process_group(p) == fs_info->devfsd_pgrp)
+		return (TRUE);
+	read_lock(&tasklist_lock);
+	for (; p != &init_task; p = p->real_parent) {
+		if (p == fs_info->devfsd_task) {
+			read_unlock(&tasklist_lock);
+			return (TRUE);
+		}
+	}
+	read_unlock(&tasklist_lock);
+	return (FALSE);
+}				/*  End Function is_devfsd_or_child  */
 
 /**
  *	devfsd_queue_empty - Test if devfsd has work pending in its event queue.
@@ -1336,11 +1325,10 @@ static int is_devfsd_or_child (struct fs
  *	Returns %TRUE if the queue is empty, else %FALSE.
  */
 
-static inline int devfsd_queue_empty (struct fs_info *fs_info)
+static inline int devfsd_queue_empty(struct fs_info *fs_info)
 {
-    return (fs_info->devfsd_last_event) ? FALSE : TRUE;
-}   /*  End Function devfsd_queue_empty  */
-
+	return (fs_info->devfsd_last_event) ? FALSE : TRUE;
+}				/*  End Function devfsd_queue_empty  */
 
 /**
  *	wait_for_devfsd_finished - Wait for devfsd to finish processing its event queue.
@@ -1349,22 +1337,25 @@ static inline int devfsd_queue_empty (st
  *	Returns %TRUE if no more waiting will be required, else %FALSE.
  */
 
-static int wait_for_devfsd_finished (struct fs_info *fs_info)
+static int wait_for_devfsd_finished(struct fs_info *fs_info)
 {
-    DECLARE_WAITQUEUE (wait, current);
-
-    if (fs_info->devfsd_task == NULL) return (TRUE);
-    if (devfsd_queue_empty (fs_info) && fs_info->devfsd_sleeping) return TRUE;
-    if ( is_devfsd_or_child (fs_info) ) return (FALSE);
-    set_current_state (TASK_UNINTERRUPTIBLE);
-    add_wait_queue (&fs_info->revalidate_wait_queue, &wait);
-    if (!devfsd_queue_empty (fs_info) || !fs_info->devfsd_sleeping)
-	if (fs_info->devfsd_task) schedule ();
-    remove_wait_queue (&fs_info->revalidate_wait_queue, &wait);
-    __set_current_state (TASK_RUNNING);
-    return (TRUE);
-}   /*  End Function wait_for_devfsd_finished  */
+	DECLARE_WAITQUEUE(wait, current);
 
+	if (fs_info->devfsd_task == NULL)
+		return (TRUE);
+	if (devfsd_queue_empty(fs_info) && fs_info->devfsd_sleeping)
+		return TRUE;
+	if (is_devfsd_or_child(fs_info))
+		return (FALSE);
+	set_current_state(TASK_UNINTERRUPTIBLE);
+	add_wait_queue(&fs_info->revalidate_wait_queue, &wait);
+	if (!devfsd_queue_empty(fs_info) || !fs_info->devfsd_sleeping)
+		if (fs_info->devfsd_task)
+			schedule();
+	remove_wait_queue(&fs_info->revalidate_wait_queue, &wait);
+	__set_current_state(TASK_RUNNING);
+	return (TRUE);
+}				/*  End Function wait_for_devfsd_finished  */
 
 /**
  *	devfsd_notify_de - Notify the devfsd daemon of a change.
@@ -1379,35 +1370,37 @@ static int wait_for_devfsd_finished (str
  *	Returns %TRUE if an event was queued and devfsd woken up, else %FALSE.
  */
 
-static int devfsd_notify_de (struct devfs_entry *de,
-			     unsigned short type, umode_t mode,
-			     uid_t uid, gid_t gid, struct fs_info *fs_info)
-{
-    struct devfsd_buf_entry *entry;
-    struct devfs_entry *curr;
-
-    if ( !( fs_info->devfsd_event_mask & (1 << type) ) ) return (FALSE);
-    if ( ( entry = kmem_cache_alloc (devfsd_buf_cache, SLAB_KERNEL) ) == NULL )
-    {
-	atomic_inc (&fs_info->devfsd_overrun_count);
-	return (FALSE);
-    }
-    for (curr = de; curr != NULL; curr = curr->parent) devfs_get (curr);
-    entry->de = de;
-    entry->type = type;
-    entry->mode = mode;
-    entry->uid = uid;
-    entry->gid = gid;
-    entry->next = NULL;
-    spin_lock (&fs_info->devfsd_buffer_lock);
-    if (!fs_info->devfsd_first_event) fs_info->devfsd_first_event = entry;
-    if (fs_info->devfsd_last_event) fs_info->devfsd_last_event->next = entry;
-    fs_info->devfsd_last_event = entry;
-    spin_unlock (&fs_info->devfsd_buffer_lock);
-    wake_up_interruptible (&fs_info->devfsd_wait_queue);
-    return (TRUE);
-}   /*  End Function devfsd_notify_de  */
-
+static int devfsd_notify_de(struct devfs_entry *de,
+			    unsigned short type, umode_t mode,
+			    uid_t uid, gid_t gid, struct fs_info *fs_info)
+{
+	struct devfsd_buf_entry *entry;
+	struct devfs_entry *curr;
+
+	if (!(fs_info->devfsd_event_mask & (1 << type)))
+		return (FALSE);
+	if ((entry = kmem_cache_alloc(devfsd_buf_cache, SLAB_KERNEL)) == NULL) {
+		atomic_inc(&fs_info->devfsd_overrun_count);
+		return (FALSE);
+	}
+	for (curr = de; curr != NULL; curr = curr->parent)
+		devfs_get(curr);
+	entry->de = de;
+	entry->type = type;
+	entry->mode = mode;
+	entry->uid = uid;
+	entry->gid = gid;
+	entry->next = NULL;
+	spin_lock(&fs_info->devfsd_buffer_lock);
+	if (!fs_info->devfsd_first_event)
+		fs_info->devfsd_first_event = entry;
+	if (fs_info->devfsd_last_event)
+		fs_info->devfsd_last_event->next = entry;
+	fs_info->devfsd_last_event = entry;
+	spin_unlock(&fs_info->devfsd_buffer_lock);
+	wake_up_interruptible(&fs_info->devfsd_wait_queue);
+	return (TRUE);
+}				/*  End Function devfsd_notify_de  */
 
 /**
  *	devfsd_notify - Notify the devfsd daemon of a change.
@@ -1417,11 +1410,11 @@ static int devfsd_notify_de (struct devf
  *		the event.
  */
 
-static void devfsd_notify (struct devfs_entry *de,unsigned short type)
+static void devfsd_notify(struct devfs_entry *de, unsigned short type)
 {
 	devfsd_notify_de(de, type, de->mode, current->euid,
 			 current->egid, &fs_info);
-} 
+}
 
 static int devfs_mk_dev(dev_t dev, umode_t mode, const char *fmt, va_list args)
 {
@@ -1432,15 +1425,15 @@ static int devfs_mk_dev(dev_t dev, umode
 	n = vsnprintf(buf, sizeof(buf), fmt, args);
 	if (n >= sizeof(buf) || !buf[0]) {
 		printk(KERN_WARNING "%s: invalid format string %s\n",
-				__FUNCTION__, fmt);
+		       __FUNCTION__, fmt);
 		return -EINVAL;
 	}
-	
+
 	de = _devfs_prepare_leaf(&dir, buf, mode);
 	if (!de) {
 		printk(KERN_WARNING "%s: could not prepare leaf for %s\n",
-				__FUNCTION__, buf);
-		return -ENOMEM;		/* could be more accurate... */
+		       __FUNCTION__, buf);
+		return -ENOMEM;	/* could be more accurate... */
 	}
 
 	de->u.dev = dev;
@@ -1448,12 +1441,12 @@ static int devfs_mk_dev(dev_t dev, umode
 	error = _devfs_append_entry(dir, de, NULL);
 	if (error) {
 		printk(KERN_WARNING "%s: could not append to parent for %s\n",
-				__FUNCTION__, buf);
+		       __FUNCTION__, buf);
 		goto out;
 	}
 
 	devfsd_notify(de, DEVFSD_NOTIFY_REGISTERED);
- out:
+      out:
 	devfs_put(dir);
 	return error;
 }
@@ -1464,7 +1457,7 @@ int devfs_mk_bdev(dev_t dev, umode_t mod
 
 	if (!S_ISBLK(mode)) {
 		printk(KERN_WARNING "%s: invalide mode (%u) for %s\n",
-				__FUNCTION__, mode, fmt);
+		       __FUNCTION__, mode, fmt);
 		return -EINVAL;
 	}
 
@@ -1474,14 +1467,13 @@ int devfs_mk_bdev(dev_t dev, umode_t mod
 
 EXPORT_SYMBOL(devfs_mk_bdev);
 
-
 int devfs_mk_cdev(dev_t dev, umode_t mode, const char *fmt, ...)
 {
 	va_list args;
 
 	if (!S_ISCHR(mode)) {
 		printk(KERN_WARNING "%s: invalide mode (%u) for %s\n",
-				__FUNCTION__, mode, fmt);
+		       __FUNCTION__, mode, fmt);
 		return -EINVAL;
 	}
 
@@ -1491,7 +1483,6 @@ int devfs_mk_cdev(dev_t dev, umode_t mod
 
 EXPORT_SYMBOL(devfs_mk_cdev);
 
-
 /**
  *	_devfs_unhook - Unhook a device entry from its parents list
  *	@de: The entry to unhook.
@@ -1501,21 +1492,25 @@ EXPORT_SYMBOL(devfs_mk_cdev);
  *	The caller must have a write lock on the parent directory.
  */
 
-static int _devfs_unhook (struct devfs_entry *de)
+static int _devfs_unhook(struct devfs_entry *de)
 {
-    struct devfs_entry *parent;
-
-    if ( !de || (de->prev == de) ) return FALSE;
-    parent = de->parent;
-    if (de->prev == NULL) parent->u.dir.first = de->next;
-    else de->prev->next = de->next;
-    if (de->next == NULL) parent->u.dir.last = de->prev;
-    else de->next->prev = de->prev;
-    de->prev = de;          /*  Indicate we're unhooked                      */
-    de->next = NULL;        /*  Force early termination for <devfs_readdir>  */
-    return TRUE;
-}   /*  End Function _devfs_unhook  */
+	struct devfs_entry *parent;
 
+	if (!de || (de->prev == de))
+		return FALSE;
+	parent = de->parent;
+	if (de->prev == NULL)
+		parent->u.dir.first = de->next;
+	else
+		de->prev->next = de->next;
+	if (de->next == NULL)
+		parent->u.dir.last = de->prev;
+	else
+		de->next->prev = de->prev;
+	de->prev = de;		/*  Indicate we're unhooked                      */
+	de->next = NULL;	/*  Force early termination for <devfs_readdir>  */
+	return TRUE;
+}				/*  End Function _devfs_unhook  */
 
 /**
  *	_devfs_unregister - Unregister a device entry from its parent.
@@ -1526,83 +1521,83 @@ static int _devfs_unhook (struct devfs_e
  *	unlocked by this function.
  */
 
-static void _devfs_unregister (struct devfs_entry *dir, struct devfs_entry *de)
+static void _devfs_unregister(struct devfs_entry *dir, struct devfs_entry *de)
 {
-    int unhooked = _devfs_unhook (de);
+	int unhooked = _devfs_unhook(de);
 
-    write_unlock (&dir->u.dir.lock);
-    if (!unhooked) return;
-    devfs_get (dir);
-    devfsd_notify (de, DEVFSD_NOTIFY_UNREGISTERED);
-    free_dentry (de);
-    devfs_put (dir);
-    if ( !S_ISDIR (de->mode) ) return;
-    while (TRUE)  /*  Recursively unregister: this is a stack chomper  */
-    {
-	struct devfs_entry *child;
-
-	write_lock (&de->u.dir.lock);
-	de->u.dir.no_more_additions = TRUE;
-	child = de->u.dir.first;
-	VERIFY_ENTRY (child);
-	_devfs_unregister (de, child);
-	if (!child) break;
-	DPRINTK (DEBUG_UNREGISTER, "(%s): child: %p  refcount: %d\n",
-		 child->name, child, atomic_read (&child->refcount) );
-	devfs_put (child);
-    }
-}   /*  End Function _devfs_unregister  */
-
-static int devfs_do_symlink (devfs_handle_t dir, const char *name,
-			     const char *link, devfs_handle_t *handle)
-{
-    int err;
-    unsigned int linklength;
-    char *newlink;
-    struct devfs_entry *de;
-
-    if (handle != NULL) *handle = NULL;
-    if (name == NULL)
-    {
-	PRINTK ("(): NULL name pointer\n");
-	return -EINVAL;
-    }
-    if (link == NULL)
-    {
-	PRINTK ("(%s): NULL link pointer\n", name);
-	return -EINVAL;
-    }
-    linklength = strlen (link);
-    if ( ( newlink = kmalloc (linklength + 1, GFP_KERNEL) ) == NULL )
-	return -ENOMEM;
-    memcpy (newlink, link, linklength);
-    newlink[linklength] = '\0';
-    if ( ( de = _devfs_prepare_leaf (&dir, name, S_IFLNK | S_IRUGO | S_IXUGO) )
-	 == NULL )
-    {
-	PRINTK ("(%s): could not prepare leaf\n", name);
-	kfree (newlink);
-	return -ENOTDIR;
-    }
-    de->info = NULL;
-    de->u.symlink.linkname = newlink;
-    de->u.symlink.length = linklength;
-    if ( ( err = _devfs_append_entry (dir, de, NULL) ) != 0 )
-    {
-	PRINTK ("(%s): could not append to parent, err: %d\n", name, err);
-	devfs_put (dir);
-	return err;
-    }
-    devfs_put (dir);
+	write_unlock(&dir->u.dir.lock);
+	if (!unhooked)
+		return;
+	devfs_get(dir);
+	devfsd_notify(de, DEVFSD_NOTIFY_UNREGISTERED);
+	free_dentry(de);
+	devfs_put(dir);
+	if (!S_ISDIR(de->mode))
+		return;
+	while (TRUE) {		/*  Recursively unregister: this is a stack chomper  */
+		struct devfs_entry *child;
+
+		write_lock(&de->u.dir.lock);
+		de->u.dir.no_more_additions = TRUE;
+		child = de->u.dir.first;
+		VERIFY_ENTRY(child);
+		_devfs_unregister(de, child);
+		if (!child)
+			break;
+		DPRINTK(DEBUG_UNREGISTER, "(%s): child: %p  refcount: %d\n",
+			child->name, child, atomic_read(&child->refcount));
+		devfs_put(child);
+	}
+}				/*  End Function _devfs_unregister  */
+
+static int devfs_do_symlink(devfs_handle_t dir, const char *name,
+			    const char *link, devfs_handle_t * handle)
+{
+	int err;
+	unsigned int linklength;
+	char *newlink;
+	struct devfs_entry *de;
+
+	if (handle != NULL)
+		*handle = NULL;
+	if (name == NULL) {
+		PRINTK("(): NULL name pointer\n");
+		return -EINVAL;
+	}
+	if (link == NULL) {
+		PRINTK("(%s): NULL link pointer\n", name);
+		return -EINVAL;
+	}
+	linklength = strlen(link);
+	if ((newlink = kmalloc(linklength + 1, GFP_KERNEL)) == NULL)
+		return -ENOMEM;
+	memcpy(newlink, link, linklength);
+	newlink[linklength] = '\0';
+	if ((de = _devfs_prepare_leaf(&dir, name, S_IFLNK | S_IRUGO | S_IXUGO))
+	    == NULL) {
+		PRINTK("(%s): could not prepare leaf\n", name);
+		kfree(newlink);
+		return -ENOTDIR;
+	}
+	de->info = NULL;
+	de->u.symlink.linkname = newlink;
+	de->u.symlink.length = linklength;
+	if ((err = _devfs_append_entry(dir, de, NULL)) != 0) {
+		PRINTK("(%s): could not append to parent, err: %d\n", name,
+		       err);
+		devfs_put(dir);
+		return err;
+	}
+	devfs_put(dir);
 #ifdef CONFIG_DEVFS_DEBUG
-    spin_lock (&stat_lock);
-    stat_num_bytes += linklength + 1;
-    spin_unlock (&stat_lock);
+	spin_lock(&stat_lock);
+	stat_num_bytes += linklength + 1;
+	spin_unlock(&stat_lock);
 #endif
-    if (handle != NULL) *handle = de;
-    return 0;
-}   /*  End Function devfs_do_symlink  */
-
+	if (handle != NULL)
+		*handle = de;
+	return 0;
+}				/*  End Function devfs_do_symlink  */
 
 /**
  *	devfs_mk_symlink Create a symbolic link in the devfs namespace.
@@ -1626,7 +1621,6 @@ int devfs_mk_symlink(const char *from, c
 	return err;
 }
 
-
 /**
  *	devfs_mk_dir - Create a directory in the devfs namespace.
  *		new name is relative to the root of the devfs.
@@ -1668,19 +1662,18 @@ int devfs_mk_dir(const char *fmt, ...)
 		goto out_put;
 	} else if (error) {
 		PRINTK("(%s): could not append to dir: %p \"%s\"\n",
-				buf, dir, dir->name);
+		       buf, dir, dir->name);
 		devfs_put(old);
 		goto out_put;
 	}
-	
+
 	devfsd_notify(de, DEVFSD_NOTIFY_REGISTERED);
 
- out_put:
+      out_put:
 	devfs_put(dir);
 	return error;
 }
 
-
 void devfs_remove(const char *fmt, ...)
 {
 	char buf[64];
@@ -1706,7 +1699,6 @@ void devfs_remove(const char *fmt, ...)
 	}
 }
 
-
 /**
  *	devfs_generate_path - Generate a pathname for an entry, relative to the devfs root.
  *	@de: The devfs entry.
@@ -1718,90 +1710,93 @@ void devfs_remove(const char *fmt, ...)
  *	else a negative error code.
  */
 
-static int devfs_generate_path (devfs_handle_t de, char *path, int buflen)
+static int devfs_generate_path(devfs_handle_t de, char *path, int buflen)
 {
-    int pos;
+	int pos;
 #define NAMEOF(de) ( (de)->mode ? (de)->name : (de)->u.name )
 
-    if (de == NULL) return -EINVAL;
-    VERIFY_ENTRY (de);
-    if (de->namelen >= buflen) return -ENAMETOOLONG; /*  Must be first       */
-    path[buflen - 1] = '\0';
-    if (de->parent == NULL) return buflen - 1;       /*  Don't prepend root  */
-    pos = buflen - de->namelen - 1;
-    memcpy (path + pos, NAMEOF (de), de->namelen);
-    for (de = de->parent; de->parent != NULL; de = de->parent)
-    {
-	if (pos - de->namelen - 1 < 0) return -ENAMETOOLONG;
-	path[--pos] = '/';
-	pos -= de->namelen;
-	memcpy (path + pos, NAMEOF (de), de->namelen);
-    }
-    return pos;
-}   /*  End Function devfs_generate_path  */
+	if (de == NULL)
+		return -EINVAL;
+	VERIFY_ENTRY(de);
+	if (de->namelen >= buflen)
+		return -ENAMETOOLONG;	/*  Must be first       */
+	path[buflen - 1] = '\0';
+	if (de->parent == NULL)
+		return buflen - 1;	/*  Don't prepend root  */
+	pos = buflen - de->namelen - 1;
+	memcpy(path + pos, NAMEOF(de), de->namelen);
+	for (de = de->parent; de->parent != NULL; de = de->parent) {
+		if (pos - de->namelen - 1 < 0)
+			return -ENAMETOOLONG;
+		path[--pos] = '/';
+		pos -= de->namelen;
+		memcpy(path + pos, NAMEOF(de), de->namelen);
+	}
+	return pos;
+}				/*  End Function devfs_generate_path  */
 
 /**
  *	devfs_setup - Process kernel boot options.
  *	@str: The boot options after the "devfs=".
  */
 
-static int __init devfs_setup (char *str)
+static int __init devfs_setup(char *str)
 {
-    static struct
-    {
-	char *name;
-	unsigned int mask;
-	unsigned int *opt;
-    } devfs_options_tab[] __initdata =
-    {
+	static struct {
+		char *name;
+		unsigned int mask;
+		unsigned int *opt;
+	} devfs_options_tab[] __initdata = {
 #ifdef CONFIG_DEVFS_DEBUG
-	{"dall",      DEBUG_ALL,          &devfs_debug_init},
-	{"dmod",      DEBUG_MODULE_LOAD,  &devfs_debug_init},
-	{"dreg",      DEBUG_REGISTER,     &devfs_debug_init},
-	{"dunreg",    DEBUG_UNREGISTER,   &devfs_debug_init},
-	{"dfree",     DEBUG_FREE,         &devfs_debug_init},
-	{"diget",     DEBUG_I_GET,        &devfs_debug_init},
-	{"dchange",   DEBUG_SET_FLAGS,    &devfs_debug_init},
-	{"dsread",    DEBUG_S_READ,       &devfs_debug_init},
-	{"dichange",  DEBUG_I_CHANGE,     &devfs_debug_init},
-	{"dimknod",   DEBUG_I_MKNOD,      &devfs_debug_init},
-	{"dilookup",  DEBUG_I_LOOKUP,     &devfs_debug_init},
-	{"diunlink",  DEBUG_I_UNLINK,     &devfs_debug_init},
-#endif  /*  CONFIG_DEVFS_DEBUG  */
-	{"mount",     OPTION_MOUNT,       &boot_options},
-	{NULL,        0,                  NULL}
-    };
-
-    while ( (*str != '\0') && !isspace (*str) )
-    {
-	int i, found = 0, invert = 0;
-
-	if (strncmp (str, "no", 2) == 0)
-	{
-	    invert = 1;
-	    str += 2;
-	}
-	for (i = 0; devfs_options_tab[i].name != NULL; i++)
-	{
-	    int len = strlen (devfs_options_tab[i].name);
-
-	    if (strncmp (str, devfs_options_tab[i].name, len) == 0)
-	    {
-		if (invert)
-		    *devfs_options_tab[i].opt &= ~devfs_options_tab[i].mask;
-		else
-		    *devfs_options_tab[i].opt |= devfs_options_tab[i].mask;
-		str += len;
-		found = 1;
-		break;
-	    }
+		{
+		"dall", DEBUG_ALL, &devfs_debug_init}, {
+		"dmod", DEBUG_MODULE_LOAD, &devfs_debug_init}, {
+		"dreg", DEBUG_REGISTER, &devfs_debug_init}, {
+		"dunreg", DEBUG_UNREGISTER, &devfs_debug_init}, {
+		"dfree", DEBUG_FREE, &devfs_debug_init}, {
+		"diget", DEBUG_I_GET, &devfs_debug_init}, {
+		"dchange", DEBUG_SET_FLAGS, &devfs_debug_init}, {
+		"dsread", DEBUG_S_READ, &devfs_debug_init}, {
+		"dichange", DEBUG_I_CHANGE, &devfs_debug_init}, {
+		"dimknod", DEBUG_I_MKNOD, &devfs_debug_init}, {
+		"dilookup", DEBUG_I_LOOKUP, &devfs_debug_init}, {
+		"diunlink", DEBUG_I_UNLINK, &devfs_debug_init},
+#endif				/*  CONFIG_DEVFS_DEBUG  */
+		{
+		"mount", OPTION_MOUNT, &boot_options}, {
+		NULL, 0, NULL}
+	};
+
+	while ((*str != '\0') && !isspace(*str)) {
+		int i, found = 0, invert = 0;
+
+		if (strncmp(str, "no", 2) == 0) {
+			invert = 1;
+			str += 2;
+		}
+		for (i = 0; devfs_options_tab[i].name != NULL; i++) {
+			int len = strlen(devfs_options_tab[i].name);
+
+			if (strncmp(str, devfs_options_tab[i].name, len) == 0) {
+				if (invert)
+					*devfs_options_tab[i].opt &=
+					    ~devfs_options_tab[i].mask;
+				else
+					*devfs_options_tab[i].opt |=
+					    devfs_options_tab[i].mask;
+				str += len;
+				found = 1;
+				break;
+			}
+		}
+		if (!found)
+			return 0;	/*  No match         */
+		if (*str != ',')
+			return 0;	/*  No more options  */
+		++str;
 	}
-	if (!found) return 0;       /*  No match         */
-	if (*str != ',') return 0;  /*  No more options  */
-	++str;
-    }
-    return 1;
-}   /*  End Function devfs_setup  */
+	return 1;
+}				/*  End Function devfs_setup  */
 
 __setup("devfs=", devfs_setup);
 
@@ -1809,7 +1804,6 @@ EXPORT_SYMBOL(devfs_mk_symlink);
 EXPORT_SYMBOL(devfs_mk_dir);
 EXPORT_SYMBOL(devfs_remove);
 
-
 /**
  *	try_modload - Notify devfsd of an inode lookup by a non-devfsd process.
  *	@parent: The parent devfs entry.
@@ -1822,26 +1816,26 @@ EXPORT_SYMBOL(devfs_remove);
  *	Returns 0 on success (event was queued), else a negative error code.
  */
 
-static int try_modload (struct devfs_entry *parent, struct fs_info *fs_info,
-			const char *name, unsigned namelen,
-			struct devfs_entry *buf)
-{
-    if ( !( fs_info->devfsd_event_mask & (1 << DEVFSD_NOTIFY_LOOKUP) ) )
-	return -ENOENT;
-    if ( is_devfsd_or_child (fs_info) ) return -ENOENT;
-    memset (buf, 0, sizeof *buf);
-    atomic_set (&buf->refcount, 1);
-    buf->parent = parent;
-    buf->namelen = namelen;
-    buf->u.name = name;
-    WRITE_ENTRY_MAGIC (buf, MAGIC_VALUE);
-    if ( !devfsd_notify_de (buf, DEVFSD_NOTIFY_LOOKUP, 0,
-			    current->euid, current->egid, fs_info) )
-	return -ENOENT;
-    /*  Possible success: event has been queued  */
-    return 0;
-}   /*  End Function try_modload  */
-
+static int try_modload(struct devfs_entry *parent, struct fs_info *fs_info,
+		       const char *name, unsigned namelen,
+		       struct devfs_entry *buf)
+{
+	if (!(fs_info->devfsd_event_mask & (1 << DEVFSD_NOTIFY_LOOKUP)))
+		return -ENOENT;
+	if (is_devfsd_or_child(fs_info))
+		return -ENOENT;
+	memset(buf, 0, sizeof *buf);
+	atomic_set(&buf->refcount, 1);
+	buf->parent = parent;
+	buf->namelen = namelen;
+	buf->u.name = name;
+	WRITE_ENTRY_MAGIC(buf, MAGIC_VALUE);
+	if (!devfsd_notify_de(buf, DEVFSD_NOTIFY_LOOKUP, 0,
+			      current->euid, current->egid, fs_info))
+		return -ENOENT;
+	/*  Possible success: event has been queued  */
+	return 0;
+}				/*  End Function try_modload  */
 
 /*  Superblock operations follow  */
 
@@ -1851,44 +1845,45 @@ static struct file_operations devfs_fops
 static struct file_operations devfs_dir_fops;
 static struct inode_operations devfs_symlink_iops;
 
-static int devfs_notify_change (struct dentry *dentry, struct iattr *iattr)
+static int devfs_notify_change(struct dentry *dentry, struct iattr *iattr)
 {
-    int retval;
-    struct devfs_entry *de;
-    struct inode *inode = dentry->d_inode;
-    struct fs_info *fs_info = inode->i_sb->s_fs_info;
-
-    de = get_devfs_entry_from_vfs_inode (inode);
-    if (de == NULL) return -ENODEV;
-    retval = inode_change_ok (inode, iattr);
-    if (retval != 0) return retval;
-    retval = inode_setattr (inode, iattr);
-    if (retval != 0) return retval;
-    DPRINTK (DEBUG_I_CHANGE, "(%d): VFS inode: %p  devfs_entry: %p\n",
-	     (int) inode->i_ino, inode, de);
-    DPRINTK (DEBUG_I_CHANGE, "():   mode: 0%o  uid: %d  gid: %d\n",
-	     (int) inode->i_mode, (int) inode->i_uid, (int) inode->i_gid);
-    /*  Inode is not on hash chains, thus must save permissions here rather
-	than in a write_inode() method  */
-    de->mode = inode->i_mode;
-    de->inode.uid = inode->i_uid;
-    de->inode.gid = inode->i_gid;
-    de->inode.atime = inode->i_atime;
-    de->inode.mtime = inode->i_mtime;
-    de->inode.ctime = inode->i_ctime;
-    if ( ( iattr->ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID) ) &&
-	 !is_devfsd_or_child (fs_info) )
-	devfsd_notify_de (de, DEVFSD_NOTIFY_CHANGE, inode->i_mode,
-			  inode->i_uid, inode->i_gid, fs_info);
-    return 0;
-}   /*  End Function devfs_notify_change  */
-
-static struct super_operations devfs_sops =
-{ 
-    .drop_inode    = generic_delete_inode,
-    .statfs        = simple_statfs,
-};
+	int retval;
+	struct devfs_entry *de;
+	struct inode *inode = dentry->d_inode;
+	struct fs_info *fs_info = inode->i_sb->s_fs_info;
 
+	de = get_devfs_entry_from_vfs_inode(inode);
+	if (de == NULL)
+		return -ENODEV;
+	retval = inode_change_ok(inode, iattr);
+	if (retval != 0)
+		return retval;
+	retval = inode_setattr(inode, iattr);
+	if (retval != 0)
+		return retval;
+	DPRINTK(DEBUG_I_CHANGE, "(%d): VFS inode: %p  devfs_entry: %p\n",
+		(int)inode->i_ino, inode, de);
+	DPRINTK(DEBUG_I_CHANGE, "():   mode: 0%o  uid: %d  gid: %d\n",
+		(int)inode->i_mode, (int)inode->i_uid, (int)inode->i_gid);
+	/*  Inode is not on hash chains, thus must save permissions here rather
+	   than in a write_inode() method  */
+	de->mode = inode->i_mode;
+	de->inode.uid = inode->i_uid;
+	de->inode.gid = inode->i_gid;
+	de->inode.atime = inode->i_atime;
+	de->inode.mtime = inode->i_mtime;
+	de->inode.ctime = inode->i_ctime;
+	if ((iattr->ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID)) &&
+	    !is_devfsd_or_child(fs_info))
+		devfsd_notify_de(de, DEVFSD_NOTIFY_CHANGE, inode->i_mode,
+				 inode->i_uid, inode->i_gid, fs_info);
+	return 0;
+}				/*  End Function devfs_notify_change  */
+
+static struct super_operations devfs_sops = {
+	.drop_inode = generic_delete_inode,
+	.statfs = simple_statfs,
+};
 
 /**
  *	_devfs_get_vfs_inode - Get a VFS inode.
@@ -1900,39 +1895,38 @@ static struct super_operations devfs_sop
  *       performed if the inode is created.
  */
 
-static struct inode *_devfs_get_vfs_inode (struct super_block *sb,
-					   struct devfs_entry *de,
-					   struct dentry *dentry)
-{
-    struct inode *inode;
-
-    if (de->prev == de) return NULL;  /*  Quick check to see if unhooked  */
-    if ( ( inode = new_inode (sb) ) == NULL )
-    {
-	PRINTK ("(%s): new_inode() failed, de: %p\n", de->name, de);
-	return NULL;
-    }
-    if (de->parent)
-    {
-	read_lock (&de->parent->u.dir.lock);
-	if (de->prev != de) de->inode.dentry = dentry; /*      Not unhooked  */
-	read_unlock (&de->parent->u.dir.lock);
-    }
-    else de->inode.dentry = dentry;             /*  Root: no locking needed  */
-    if (de->inode.dentry != dentry)
-    {   /*  Must have been unhooked  */
-	iput (inode);
-	return NULL;
-    }
-    /* FIXME where is devfs_put? */
-    inode->u.generic_ip = devfs_get (de);
-    inode->i_ino = de->inode.ino;
-    DPRINTK (DEBUG_I_GET, "(%d): VFS inode: %p  devfs_entry: %p\n",
-	     (int) inode->i_ino, inode, de);
-    inode->i_blocks = 0;
-    inode->i_blksize = FAKE_BLOCK_SIZE;
-    inode->i_op = &devfs_iops;
-    inode->i_mode = de->mode;
+static struct inode *_devfs_get_vfs_inode(struct super_block *sb,
+					  struct devfs_entry *de,
+					  struct dentry *dentry)
+{
+	struct inode *inode;
+
+	if (de->prev == de)
+		return NULL;	/*  Quick check to see if unhooked  */
+	if ((inode = new_inode(sb)) == NULL) {
+		PRINTK("(%s): new_inode() failed, de: %p\n", de->name, de);
+		return NULL;
+	}
+	if (de->parent) {
+		read_lock(&de->parent->u.dir.lock);
+		if (de->prev != de)
+			de->inode.dentry = dentry;	/*      Not unhooked  */
+		read_unlock(&de->parent->u.dir.lock);
+	} else
+		de->inode.dentry = dentry;	/*  Root: no locking needed  */
+	if (de->inode.dentry != dentry) {	/*  Must have been unhooked  */
+		iput(inode);
+		return NULL;
+	}
+	/* FIXME where is devfs_put? */
+	inode->u.generic_ip = devfs_get(de);
+	inode->i_ino = de->inode.ino;
+	DPRINTK(DEBUG_I_GET, "(%d): VFS inode: %p  devfs_entry: %p\n",
+		(int)inode->i_ino, inode, de);
+	inode->i_blocks = 0;
+	inode->i_blksize = FAKE_BLOCK_SIZE;
+	inode->i_op = &devfs_iops;
+	inode->i_mode = de->mode;
 	if (S_ISDIR(de->mode)) {
 		inode->i_op = &devfs_dir_iops;
 		inode->i_fop = &devfs_dir_fops;
@@ -1945,100 +1939,107 @@ static struct inode *_devfs_get_vfs_inod
 		init_special_inode(inode, de->mode, 0);
 	} else {
 		PRINTK("(%s): unknown mode %o de: %p\n",
-			de->name, de->mode, de);
+		       de->name, de->mode, de);
 		iput(inode);
 		devfs_put(de);
 		return NULL;
 	}
 
-    inode->i_uid = de->inode.uid;
-    inode->i_gid = de->inode.gid;
-    inode->i_atime = de->inode.atime;
-    inode->i_mtime = de->inode.mtime;
-    inode->i_ctime = de->inode.ctime;
-    DPRINTK (DEBUG_I_GET, "():   mode: 0%o  uid: %d  gid: %d\n",
-	     (int) inode->i_mode, (int) inode->i_uid, (int) inode->i_gid);
-    return inode;
-}   /*  End Function _devfs_get_vfs_inode  */
-
+	inode->i_uid = de->inode.uid;
+	inode->i_gid = de->inode.gid;
+	inode->i_atime = de->inode.atime;
+	inode->i_mtime = de->inode.mtime;
+	inode->i_ctime = de->inode.ctime;
+	DPRINTK(DEBUG_I_GET, "():   mode: 0%o  uid: %d  gid: %d\n",
+		(int)inode->i_mode, (int)inode->i_uid, (int)inode->i_gid);
+	return inode;
+}				/*  End Function _devfs_get_vfs_inode  */
 
 /*  File operations for device entries follow  */
 
-static int devfs_readdir (struct file *file, void *dirent, filldir_t filldir)
+static int devfs_readdir(struct file *file, void *dirent, filldir_t filldir)
 {
-    int err, count;
-    int stored = 0;
-    struct fs_info *fs_info;
-    struct devfs_entry *parent, *de, *next = NULL;
-    struct inode *inode = file->f_dentry->d_inode;
-
-    fs_info = inode->i_sb->s_fs_info;
-    parent = get_devfs_entry_from_vfs_inode (file->f_dentry->d_inode);
-    if ( (long) file->f_pos < 0 ) return -EINVAL;
-    DPRINTK (DEBUG_F_READDIR, "(%s): fs_info: %p  pos: %ld\n",
-	     parent->name, fs_info, (long) file->f_pos);
-    switch ( (long) file->f_pos )
-    {
-      case 0:
-	err = (*filldir) (dirent, "..", 2, file->f_pos,
-			  parent_ino (file->f_dentry), DT_DIR);
-	if (err == -EINVAL) break;
-	if (err < 0) return err;
-	file->f_pos++;
-	++stored;
-	/*  Fall through  */
-      case 1:
-	err = (*filldir) (dirent, ".", 1, file->f_pos, inode->i_ino, DT_DIR);
-	if (err == -EINVAL) break;
-	if (err < 0) return err;
-	file->f_pos++;
-	++stored;
-	/*  Fall through  */
-      default:
-	/*  Skip entries  */
-	count = file->f_pos - 2;
-	read_lock (&parent->u.dir.lock);
-	for (de = parent->u.dir.first; de && (count > 0); de = de->next)
-	    --count;
-	devfs_get (de);
-	read_unlock (&parent->u.dir.lock);
-	/*  Now add all remaining entries  */
-	while (de)
-	{
-	    err = (*filldir) (dirent, de->name, de->namelen,
-				file->f_pos, de->inode.ino, de->mode >> 12);
-	    if (err < 0) devfs_put (de);
-	    else
-	    {
-	        file->f_pos++;
-	        ++stored;
-	    }
-	    if (err == -EINVAL) break;
-	    if (err < 0) return err;
-	    read_lock (&parent->u.dir.lock);
-	    next = devfs_get (de->next);
-	    read_unlock (&parent->u.dir.lock);
-	    devfs_put (de);
-	    de = next;
-	}
-	break;
-    }
-    return stored;
-}   /*  End Function devfs_readdir  */
+	int err, count;
+	int stored = 0;
+	struct fs_info *fs_info;
+	struct devfs_entry *parent, *de, *next = NULL;
+	struct inode *inode = file->f_dentry->d_inode;
+
+	fs_info = inode->i_sb->s_fs_info;
+	parent = get_devfs_entry_from_vfs_inode(file->f_dentry->d_inode);
+	if ((long)file->f_pos < 0)
+		return -EINVAL;
+	DPRINTK(DEBUG_F_READDIR, "(%s): fs_info: %p  pos: %ld\n",
+		parent->name, fs_info, (long)file->f_pos);
+	switch ((long)file->f_pos) {
+	case 0:
+		err = (*filldir) (dirent, "..", 2, file->f_pos,
+				  parent_ino(file->f_dentry), DT_DIR);
+		if (err == -EINVAL)
+			break;
+		if (err < 0)
+			return err;
+		file->f_pos++;
+		++stored;
+		/*  Fall through  */
+	case 1:
+		err =
+		    (*filldir) (dirent, ".", 1, file->f_pos, inode->i_ino,
+				DT_DIR);
+		if (err == -EINVAL)
+			break;
+		if (err < 0)
+			return err;
+		file->f_pos++;
+		++stored;
+		/*  Fall through  */
+	default:
+		/*  Skip entries  */
+		count = file->f_pos - 2;
+		read_lock(&parent->u.dir.lock);
+		for (de = parent->u.dir.first; de && (count > 0); de = de->next)
+			--count;
+		devfs_get(de);
+		read_unlock(&parent->u.dir.lock);
+		/*  Now add all remaining entries  */
+		while (de) {
+			err = (*filldir) (dirent, de->name, de->namelen,
+					  file->f_pos, de->inode.ino,
+					  de->mode >> 12);
+			if (err < 0)
+				devfs_put(de);
+			else {
+				file->f_pos++;
+				++stored;
+			}
+			if (err == -EINVAL)
+				break;
+			if (err < 0)
+				return err;
+			read_lock(&parent->u.dir.lock);
+			next = devfs_get(de->next);
+			read_unlock(&parent->u.dir.lock);
+			devfs_put(de);
+			de = next;
+		}
+		break;
+	}
+	return stored;
+}				/*  End Function devfs_readdir  */
 
 /* Open devfs specific special files */
-static int devfs_open (struct inode *inode, struct file *file)
+static int devfs_open(struct inode *inode, struct file *file)
 {
 	int err;
 	int minor = MINOR(inode->i_rdev);
 	struct file_operations *old_fops, *new_fops;
 
 	switch (minor) {
-	case 0: /* /dev/.devfsd */
+	case 0:		/* /dev/.devfsd */
 		new_fops = fops_get(&devfsd_fops);
 		break;
 #ifdef CONFIG_DEVFS_DEBUG
-	case 1: /* /dev/.stat */
+	case 1:		/* /dev/.stat */
 		new_fops = fops_get(&stat_fops);
 		break;
 #endif
@@ -2057,32 +2058,28 @@ static int devfs_open (struct inode *ino
 	} else
 		fops_put(old_fops);
 	return err;
-}   /*  End Function devfs_open  */
+}				/*  End Function devfs_open  */
 
-static struct file_operations devfs_fops =
-{
-    .open    = devfs_open,
+static struct file_operations devfs_fops = {
+	.open = devfs_open,
 };
 
-static struct file_operations devfs_dir_fops =
-{
-    .read    = generic_read_dir,
-    .readdir = devfs_readdir,
+static struct file_operations devfs_dir_fops = {
+	.read = generic_read_dir,
+	.readdir = devfs_readdir,
 };
 
-
 /*  Dentry operations for device entries follow  */
 
-
 /**
  *	devfs_d_release - Callback for when a dentry is freed.
  *	@dentry: The dentry.
  */
 
-static void devfs_d_release (struct dentry *dentry)
+static void devfs_d_release(struct dentry *dentry)
 {
-    DPRINTK (DEBUG_D_RELEASE, "(%p): inode: %p\n", dentry, dentry->d_inode);
-}   /*  End Function devfs_d_release  */
+	DPRINTK(DEBUG_D_RELEASE, "(%p): inode: %p\n", dentry, dentry->d_inode);
+}				/*  End Function devfs_d_release  */
 
 /**
  *	devfs_d_iput - Callback for when a dentry loses its inode.
@@ -2090,38 +2087,37 @@ static void devfs_d_release (struct dent
  *	@inode:	The inode.
  */
 
-static void devfs_d_iput (struct dentry *dentry, struct inode *inode)
+static void devfs_d_iput(struct dentry *dentry, struct inode *inode)
 {
-    struct devfs_entry *de;
+	struct devfs_entry *de;
 
-    de = get_devfs_entry_from_vfs_inode (inode);
-    DPRINTK (DEBUG_D_IPUT,"(%s): dentry: %p inode: %p de: %p de->dentry: %p\n",
-	     de->name, dentry, inode, de, de->inode.dentry);
-    if ( de->inode.dentry && (de->inode.dentry != dentry) )
-	OOPS ("(%s): de: %p dentry: %p de->dentry: %p\n",
-	      de->name, de, dentry, de->inode.dentry);
-    de->inode.dentry = NULL;
-    iput (inode);
-    devfs_put (de);
-}   /*  End Function devfs_d_iput  */
-
-static int devfs_d_delete (struct dentry *dentry);
-
-static struct dentry_operations devfs_dops =
-{
-    .d_delete     = devfs_d_delete,
-    .d_release    = devfs_d_release,
-    .d_iput       = devfs_d_iput,
+	de = get_devfs_entry_from_vfs_inode(inode);
+	DPRINTK(DEBUG_D_IPUT,
+		"(%s): dentry: %p inode: %p de: %p de->dentry: %p\n", de->name,
+		dentry, inode, de, de->inode.dentry);
+	if (de->inode.dentry && (de->inode.dentry != dentry))
+		OOPS("(%s): de: %p dentry: %p de->dentry: %p\n",
+		     de->name, de, dentry, de->inode.dentry);
+	de->inode.dentry = NULL;
+	iput(inode);
+	devfs_put(de);
+}				/*  End Function devfs_d_iput  */
+
+static int devfs_d_delete(struct dentry *dentry);
+
+static struct dentry_operations devfs_dops = {
+	.d_delete = devfs_d_delete,
+	.d_release = devfs_d_release,
+	.d_iput = devfs_d_iput,
 };
 
-static int devfs_d_revalidate_wait (struct dentry *dentry, struct nameidata *);
+static int devfs_d_revalidate_wait(struct dentry *dentry, struct nameidata *);
 
-static struct dentry_operations devfs_wait_dops =
-{
-    .d_delete     = devfs_d_delete,
-    .d_release    = devfs_d_release,
-    .d_iput       = devfs_d_iput,
-    .d_revalidate = devfs_d_revalidate_wait,
+static struct dentry_operations devfs_wait_dops = {
+	.d_delete = devfs_d_delete,
+	.d_release = devfs_d_release,
+	.d_iput = devfs_d_iput,
+	.d_revalidate = devfs_d_revalidate_wait,
 };
 
 /**
@@ -2129,653 +2125,673 @@ static struct dentry_operations devfs_wa
  *	@dentry: The dentry.
  */
 
-static int devfs_d_delete (struct dentry *dentry)
+static int devfs_d_delete(struct dentry *dentry)
 {
-    struct inode *inode = dentry->d_inode;
+	struct inode *inode = dentry->d_inode;
 
-    if (dentry->d_op == &devfs_wait_dops) dentry->d_op = &devfs_dops;
-    /*  Unhash dentry if negative (has no inode)  */
-    if (inode == NULL)
-    {
-	DPRINTK (DEBUG_D_DELETE, "(%p): dropping negative dentry\n", dentry);
-	return 1;
-    }
-    return 0;
-}   /*  End Function devfs_d_delete  */
+	if (dentry->d_op == &devfs_wait_dops)
+		dentry->d_op = &devfs_dops;
+	/*  Unhash dentry if negative (has no inode)  */
+	if (inode == NULL) {
+		DPRINTK(DEBUG_D_DELETE, "(%p): dropping negative dentry\n",
+			dentry);
+		return 1;
+	}
+	return 0;
+}				/*  End Function devfs_d_delete  */
 
-struct devfs_lookup_struct
-{
-    devfs_handle_t de;
-    wait_queue_head_t wait_queue;
+struct devfs_lookup_struct {
+	devfs_handle_t de;
+	wait_queue_head_t wait_queue;
 };
 
 /* XXX: this doesn't handle the case where we got a negative dentry
         but a devfs entry has been registered in the meanwhile */
-static int devfs_d_revalidate_wait (struct dentry *dentry, struct nameidata *nd)
+static int devfs_d_revalidate_wait(struct dentry *dentry, struct nameidata *nd)
 {
-    struct inode *dir = dentry->d_parent->d_inode;
-    struct fs_info *fs_info = dir->i_sb->s_fs_info;
-    devfs_handle_t parent = get_devfs_entry_from_vfs_inode (dir);
-    struct devfs_lookup_struct *lookup_info = dentry->d_fsdata;
-    DECLARE_WAITQUEUE (wait, current);
-    int need_lock;
-
-    /*
-     * FIXME HACK
-     *
-     * make sure that
-     *   d_instantiate always runs under lock
-     *   we release i_sem lock before going to sleep
-     *
-     * unfortunately sometimes d_revalidate is called with
-     * and sometimes without i_sem lock held. The following checks
-     * attempt to deduce when we need to add (and drop resp.) lock
-     * here. This relies on current (2.6.2) calling coventions:
-     *
-     *   lookup_hash is always run under i_sem and is passing NULL
-     *   as nd
-     *
-     *   open(...,O_CREATE,...) calls _lookup_hash under i_sem
-     *   and sets flags to LOOKUP_OPEN|LOOKUP_CREATE
-     *
-     *   all other invocations of ->d_revalidate seem to happen
-     *   outside of i_sem
-     */
-    need_lock = nd &&
-		(!(nd->flags & LOOKUP_CREATE) || (nd->flags & LOOKUP_PARENT));
-
-    if (need_lock)
-	down(&dir->i_sem);
-
-    if ( is_devfsd_or_child (fs_info) )
-    {
-	devfs_handle_t de = lookup_info->de;
+	struct inode *dir = dentry->d_parent->d_inode;
+	struct fs_info *fs_info = dir->i_sb->s_fs_info;
+	devfs_handle_t parent = get_devfs_entry_from_vfs_inode(dir);
+	struct devfs_lookup_struct *lookup_info = dentry->d_fsdata;
+	DECLARE_WAITQUEUE(wait, current);
+	int need_lock;
+
+	/*
+	 * FIXME HACK
+	 *
+	 * make sure that
+	 *   d_instantiate always runs under lock
+	 *   we release i_sem lock before going to sleep
+	 *
+	 * unfortunately sometimes d_revalidate is called with
+	 * and sometimes without i_sem lock held. The following checks
+	 * attempt to deduce when we need to add (and drop resp.) lock
+	 * here. This relies on current (2.6.2) calling coventions:
+	 *
+	 *   lookup_hash is always run under i_sem and is passing NULL
+	 *   as nd
+	 *
+	 *   open(...,O_CREATE,...) calls _lookup_hash under i_sem
+	 *   and sets flags to LOOKUP_OPEN|LOOKUP_CREATE
+	 *
+	 *   all other invocations of ->d_revalidate seem to happen
+	 *   outside of i_sem
+	 */
+	need_lock = nd &&
+	    (!(nd->flags & LOOKUP_CREATE) || (nd->flags & LOOKUP_PARENT));
+
+	if (need_lock)
+		down(&dir->i_sem);
+
+	if (is_devfsd_or_child(fs_info)) {
+		devfs_handle_t de = lookup_info->de;
+		struct inode *inode;
+
+		DPRINTK(DEBUG_I_LOOKUP,
+			"(%s): dentry: %p inode: %p de: %p by: \"%s\"\n",
+			dentry->d_name.name, dentry, dentry->d_inode, de,
+			current->comm);
+		if (dentry->d_inode)
+			goto out;
+		if (de == NULL) {
+			read_lock(&parent->u.dir.lock);
+			de = _devfs_search_dir(parent, dentry->d_name.name,
+					       dentry->d_name.len);
+			read_unlock(&parent->u.dir.lock);
+			if (de == NULL)
+				goto out;
+			lookup_info->de = de;
+		}
+		/*  Create an inode, now that the driver information is available  */
+		inode = _devfs_get_vfs_inode(dir->i_sb, de, dentry);
+		if (!inode)
+			goto out;
+		DPRINTK(DEBUG_I_LOOKUP,
+			"(%s): new VFS inode(%u): %p de: %p by: \"%s\"\n",
+			de->name, de->inode.ino, inode, de, current->comm);
+		d_instantiate(dentry, inode);
+		goto out;
+	}
+	if (lookup_info == NULL)
+		goto out;	/*  Early termination  */
+	read_lock(&parent->u.dir.lock);
+	if (dentry->d_fsdata) {
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		add_wait_queue(&lookup_info->wait_queue, &wait);
+		read_unlock(&parent->u.dir.lock);
+		/* at this point it is always (hopefully) locked */
+		up(&dir->i_sem);
+		schedule();
+		down(&dir->i_sem);
+		/*
+		 * This does not need nor should remove wait from wait_queue.
+		 * Wait queue head is never reused - nothing is ever added to it
+		 * after all waiters have been waked up and head itself disappears
+		 * very soon after it. Moreover it is local variable on stack that
+		 * is likely to have already disappeared so any reference to it
+		 * at this point is buggy.
+		 */
+
+	} else
+		read_unlock(&parent->u.dir.lock);
+
+      out:
+	if (need_lock)
+		up(&dir->i_sem);
+	return 1;
+}				/*  End Function devfs_d_revalidate_wait  */
+
+/*  Inode operations for device entries follow  */
+
+static struct dentry *devfs_lookup(struct inode *dir, struct dentry *dentry,
+				   struct nameidata *nd)
+{
+	struct devfs_entry tmp;	/*  Must stay in scope until devfsd idle again  */
+	struct devfs_lookup_struct lookup_info;
+	struct fs_info *fs_info = dir->i_sb->s_fs_info;
+	struct devfs_entry *parent, *de;
 	struct inode *inode;
+	struct dentry *retval = NULL;
 
-	DPRINTK (DEBUG_I_LOOKUP,
-		 "(%s): dentry: %p inode: %p de: %p by: \"%s\"\n",
-		 dentry->d_name.name, dentry, dentry->d_inode, de,
-		 current->comm);
+	/*  Set up the dentry operations before anything else, to ensure cleaning
+	   up on any error  */
+	dentry->d_op = &devfs_dops;
+	/*  First try to get the devfs entry for this directory  */
+	parent = get_devfs_entry_from_vfs_inode(dir);
+	DPRINTK(DEBUG_I_LOOKUP, "(%s): dentry: %p parent: %p by: \"%s\"\n",
+		dentry->d_name.name, dentry, parent, current->comm);
+	if (parent == NULL)
+		return ERR_PTR(-ENOENT);
+	read_lock(&parent->u.dir.lock);
+	de = _devfs_search_dir(parent, dentry->d_name.name, dentry->d_name.len);
+	read_unlock(&parent->u.dir.lock);
+	lookup_info.de = de;
+	init_waitqueue_head(&lookup_info.wait_queue);
+	dentry->d_fsdata = &lookup_info;
+	if (de == NULL) {	/*  Try with devfsd. For any kind of failure, leave a negative dentry
+				   so someone else can deal with it (in the case where the sysadmin
+				   does a mknod()). It's important to do this before hashing the
+				   dentry, so that the devfsd queue is filled before revalidates
+				   can start  */
+		if (try_modload(parent, fs_info, dentry->d_name.name, dentry->d_name.len, &tmp) < 0) {	/*  Lookup event was not queued to devfsd  */
+			d_add(dentry, NULL);
+			return NULL;
+		}
+	}
+	dentry->d_op = &devfs_wait_dops;
+	d_add(dentry, NULL);	/*  Open the floodgates  */
+	/*  Unlock directory semaphore, which will release any waiters. They
+	   will get the hashed dentry, and may be forced to wait for
+	   revalidation  */
+	up(&dir->i_sem);
+	wait_for_devfsd_finished(fs_info);	/*  If I'm not devfsd, must wait  */
+	down(&dir->i_sem);	/*  Grab it again because them's the rules  */
+	de = lookup_info.de;
+	/*  If someone else has been so kind as to make the inode, we go home
+	   early  */
 	if (dentry->d_inode)
-	    goto out;
-	if (de == NULL)
-	{
-	    read_lock (&parent->u.dir.lock);
-	    de = _devfs_search_dir (parent, dentry->d_name.name,
-				    dentry->d_name.len);
-	    read_unlock (&parent->u.dir.lock);
-	    if (de == NULL)
 		goto out;
-	    lookup_info->de = de;
+	if (de == NULL) {
+		read_lock(&parent->u.dir.lock);
+		de = _devfs_search_dir(parent, dentry->d_name.name,
+				       dentry->d_name.len);
+		read_unlock(&parent->u.dir.lock);
+		if (de == NULL)
+			goto out;
+		/*  OK, there's an entry now, but no VFS inode yet  */
 	}
 	/*  Create an inode, now that the driver information is available  */
-	inode = _devfs_get_vfs_inode (dir->i_sb, de, dentry);
-	if (!inode)
-	    goto out;
-	DPRINTK (DEBUG_I_LOOKUP,
-		 "(%s): new VFS inode(%u): %p de: %p by: \"%s\"\n",
-		 de->name, de->inode.ino, inode, de, current->comm);
-	d_instantiate (dentry, inode);
-	goto out;
-    }
-    if (lookup_info == NULL)
-	goto out;  /*  Early termination  */
-    read_lock (&parent->u.dir.lock);
-    if (dentry->d_fsdata)
-    {
-	set_current_state (TASK_UNINTERRUPTIBLE);
-	add_wait_queue (&lookup_info->wait_queue, &wait);
-	read_unlock (&parent->u.dir.lock);
-	/* at this point it is always (hopefully) locked */
-	up(&dir->i_sem);
-	schedule ();
-	down(&dir->i_sem);
-	/*
-	 * This does not need nor should remove wait from wait_queue.
-	 * Wait queue head is never reused - nothing is ever added to it
-	 * after all waiters have been waked up and head itself disappears
-	 * very soon after it. Moreover it is local variable on stack that
-	 * is likely to have already disappeared so any reference to it
-	 * at this point is buggy.
-	 */
+	inode = _devfs_get_vfs_inode(dir->i_sb, de, dentry);
+	if (!inode) {
+		retval = ERR_PTR(-ENOMEM);
+		goto out;
+	}
+	DPRINTK(DEBUG_I_LOOKUP,
+		"(%s): new VFS inode(%u): %p de: %p by: \"%s\"\n", de->name,
+		de->inode.ino, inode, de, current->comm);
+	d_instantiate(dentry, inode);
+      out:
+	write_lock(&parent->u.dir.lock);
+	dentry->d_op = &devfs_dops;
+	dentry->d_fsdata = NULL;
+	wake_up(&lookup_info.wait_queue);
+	write_unlock(&parent->u.dir.lock);
+	devfs_put(de);
+	return retval;
+}				/*  End Function devfs_lookup  */
+
+static int devfs_unlink(struct inode *dir, struct dentry *dentry)
+{
+	int unhooked;
+	struct devfs_entry *de;
+	struct inode *inode = dentry->d_inode;
+	struct fs_info *fs_info = dir->i_sb->s_fs_info;
 
-    }
-    else read_unlock (&parent->u.dir.lock);
+	de = get_devfs_entry_from_vfs_inode(inode);
+	DPRINTK(DEBUG_I_UNLINK, "(%s): de: %p\n", dentry->d_name.name, de);
+	if (de == NULL)
+		return -ENOENT;
+	if (!de->vfs)
+		return -EPERM;
+	write_lock(&de->parent->u.dir.lock);
+	unhooked = _devfs_unhook(de);
+	write_unlock(&de->parent->u.dir.lock);
+	if (!unhooked)
+		return -ENOENT;
+	if (!is_devfsd_or_child(fs_info))
+		devfsd_notify_de(de, DEVFSD_NOTIFY_DELETE, inode->i_mode,
+				 inode->i_uid, inode->i_gid, fs_info);
+	free_dentry(de);
+	devfs_put(de);
+	return 0;
+}				/*  End Function devfs_unlink  */
 
-out:
-    if (need_lock)
-	up(&dir->i_sem);
-    return 1;
-}   /*  End Function devfs_d_revalidate_wait  */
+static int devfs_symlink(struct inode *dir, struct dentry *dentry,
+			 const char *symname)
+{
+	int err;
+	struct fs_info *fs_info = dir->i_sb->s_fs_info;
+	struct devfs_entry *parent, *de;
+	struct inode *inode;
 
+	/*  First try to get the devfs entry for this directory  */
+	parent = get_devfs_entry_from_vfs_inode(dir);
+	if (parent == NULL)
+		return -ENOENT;
+	err = devfs_do_symlink(parent, dentry->d_name.name, symname, &de);
+	DPRINTK(DEBUG_DISABLED, "(%s): errcode from <devfs_do_symlink>: %d\n",
+		dentry->d_name.name, err);
+	if (err < 0)
+		return err;
+	de->vfs = TRUE;
+	de->inode.uid = current->euid;
+	de->inode.gid = current->egid;
+	de->inode.atime = CURRENT_TIME;
+	de->inode.mtime = CURRENT_TIME;
+	de->inode.ctime = CURRENT_TIME;
+	if ((inode = _devfs_get_vfs_inode(dir->i_sb, de, dentry)) == NULL)
+		return -ENOMEM;
+	DPRINTK(DEBUG_DISABLED, "(%s): new VFS inode(%u): %p  dentry: %p\n",
+		dentry->d_name.name, de->inode.ino, inode, dentry);
+	d_instantiate(dentry, inode);
+	if (!is_devfsd_or_child(fs_info))
+		devfsd_notify_de(de, DEVFSD_NOTIFY_CREATE, inode->i_mode,
+				 inode->i_uid, inode->i_gid, fs_info);
+	return 0;
+}				/*  End Function devfs_symlink  */
 
-/*  Inode operations for device entries follow  */
+static int devfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
+{
+	int err;
+	struct fs_info *fs_info = dir->i_sb->s_fs_info;
+	struct devfs_entry *parent, *de;
+	struct inode *inode;
 
-static struct dentry *devfs_lookup (struct inode *dir, struct dentry *dentry, struct nameidata *nd)
+	mode = (mode & ~S_IFMT) | S_IFDIR;	/*  VFS doesn't pass S_IFMT part  */
+	parent = get_devfs_entry_from_vfs_inode(dir);
+	if (parent == NULL)
+		return -ENOENT;
+	de = _devfs_alloc_entry(dentry->d_name.name, dentry->d_name.len, mode);
+	if (!de)
+		return -ENOMEM;
+	de->vfs = TRUE;
+	if ((err = _devfs_append_entry(parent, de, NULL)) != 0)
+		return err;
+	de->inode.uid = current->euid;
+	de->inode.gid = current->egid;
+	de->inode.atime = CURRENT_TIME;
+	de->inode.mtime = CURRENT_TIME;
+	de->inode.ctime = CURRENT_TIME;
+	if ((inode = _devfs_get_vfs_inode(dir->i_sb, de, dentry)) == NULL)
+		return -ENOMEM;
+	DPRINTK(DEBUG_DISABLED, "(%s): new VFS inode(%u): %p  dentry: %p\n",
+		dentry->d_name.name, de->inode.ino, inode, dentry);
+	d_instantiate(dentry, inode);
+	if (!is_devfsd_or_child(fs_info))
+		devfsd_notify_de(de, DEVFSD_NOTIFY_CREATE, inode->i_mode,
+				 inode->i_uid, inode->i_gid, fs_info);
+	return 0;
+}				/*  End Function devfs_mkdir  */
+
+static int devfs_rmdir(struct inode *dir, struct dentry *dentry)
+{
+	int err = 0;
+	struct devfs_entry *de;
+	struct fs_info *fs_info = dir->i_sb->s_fs_info;
+	struct inode *inode = dentry->d_inode;
+
+	if (dir->i_sb->s_fs_info != inode->i_sb->s_fs_info)
+		return -EINVAL;
+	de = get_devfs_entry_from_vfs_inode(inode);
+	if (de == NULL)
+		return -ENOENT;
+	if (!S_ISDIR(de->mode))
+		return -ENOTDIR;
+	if (!de->vfs)
+		return -EPERM;
+	/*  First ensure the directory is empty and will stay that way  */
+	write_lock(&de->u.dir.lock);
+	if (de->u.dir.first)
+		err = -ENOTEMPTY;
+	else
+		de->u.dir.no_more_additions = TRUE;
+	write_unlock(&de->u.dir.lock);
+	if (err)
+		return err;
+	/*  Now unhook the directory from its parent  */
+	write_lock(&de->parent->u.dir.lock);
+	if (!_devfs_unhook(de))
+		err = -ENOENT;
+	write_unlock(&de->parent->u.dir.lock);
+	if (err)
+		return err;
+	if (!is_devfsd_or_child(fs_info))
+		devfsd_notify_de(de, DEVFSD_NOTIFY_DELETE, inode->i_mode,
+				 inode->i_uid, inode->i_gid, fs_info);
+	free_dentry(de);
+	devfs_put(de);
+	return 0;
+}				/*  End Function devfs_rmdir  */
+
+static int devfs_mknod(struct inode *dir, struct dentry *dentry, int mode,
+		       dev_t rdev)
 {
-    struct devfs_entry tmp;  /*  Must stay in scope until devfsd idle again  */
-    struct devfs_lookup_struct lookup_info;
-    struct fs_info *fs_info = dir->i_sb->s_fs_info;
-    struct devfs_entry *parent, *de;
-    struct inode *inode;
-    struct dentry *retval = NULL;
-
-    /*  Set up the dentry operations before anything else, to ensure cleaning
-	up on any error  */
-    dentry->d_op = &devfs_dops;
-    /*  First try to get the devfs entry for this directory  */
-    parent = get_devfs_entry_from_vfs_inode (dir);
-    DPRINTK (DEBUG_I_LOOKUP, "(%s): dentry: %p parent: %p by: \"%s\"\n",
-	     dentry->d_name.name, dentry, parent, current->comm);
-    if (parent == NULL) return ERR_PTR (-ENOENT);
-    read_lock (&parent->u.dir.lock);
-    de = _devfs_search_dir (parent, dentry->d_name.name, dentry->d_name.len);
-    read_unlock (&parent->u.dir.lock);
-    lookup_info.de = de;
-    init_waitqueue_head (&lookup_info.wait_queue);
-    dentry->d_fsdata = &lookup_info;
-    if (de == NULL)
-    {   /*  Try with devfsd. For any kind of failure, leave a negative dentry
-	    so someone else can deal with it (in the case where the sysadmin
-	    does a mknod()). It's important to do this before hashing the
-	    dentry, so that the devfsd queue is filled before revalidates
-	    can start  */
-	if (try_modload (parent, fs_info,
-			 dentry->d_name.name, dentry->d_name.len, &tmp) < 0)
-	{   /*  Lookup event was not queued to devfsd  */
-	    d_add (dentry, NULL);
-	    return NULL;
-	}
-    }
-    dentry->d_op = &devfs_wait_dops;
-    d_add (dentry, NULL);  /*  Open the floodgates  */
-    /*  Unlock directory semaphore, which will release any waiters. They
-	will get the hashed dentry, and may be forced to wait for
-	revalidation  */
-    up (&dir->i_sem);
-    wait_for_devfsd_finished (fs_info);  /*  If I'm not devfsd, must wait  */
-    down (&dir->i_sem);      /*  Grab it again because them's the rules  */
-    de = lookup_info.de;
-    /*  If someone else has been so kind as to make the inode, we go home
-	early  */
-    if (dentry->d_inode) goto out;
-    if (de == NULL)
-    {
-	read_lock (&parent->u.dir.lock);
-	de = _devfs_search_dir (parent, dentry->d_name.name,
-				dentry->d_name.len);
-	read_unlock (&parent->u.dir.lock);
-	if (de == NULL) goto out;
-	/*  OK, there's an entry now, but no VFS inode yet  */
-    }
-    /*  Create an inode, now that the driver information is available  */
-    inode = _devfs_get_vfs_inode (dir->i_sb, de, dentry);
-    if (!inode)
-    {
-	retval = ERR_PTR (-ENOMEM);
-	goto out;
-    }
-    DPRINTK (DEBUG_I_LOOKUP, "(%s): new VFS inode(%u): %p de: %p by: \"%s\"\n",
-	     de->name, de->inode.ino, inode, de, current->comm);
-    d_instantiate (dentry, inode);
-out:
-    write_lock (&parent->u.dir.lock);
-    dentry->d_op = &devfs_dops;
-    dentry->d_fsdata = NULL;
-    wake_up (&lookup_info.wait_queue);
-    write_unlock (&parent->u.dir.lock);
-    devfs_put (de);
-    return retval;
-}   /*  End Function devfs_lookup  */
-
-static int devfs_unlink (struct inode *dir, struct dentry *dentry)
-{
-    int unhooked;
-    struct devfs_entry *de;
-    struct inode *inode = dentry->d_inode;
-    struct fs_info *fs_info = dir->i_sb->s_fs_info;
-
-    de = get_devfs_entry_from_vfs_inode (inode);
-    DPRINTK (DEBUG_I_UNLINK, "(%s): de: %p\n", dentry->d_name.name, de);
-    if (de == NULL) return -ENOENT;
-    if (!de->vfs) return -EPERM;
-    write_lock (&de->parent->u.dir.lock);
-    unhooked = _devfs_unhook (de);
-    write_unlock (&de->parent->u.dir.lock);
-    if (!unhooked) return -ENOENT;
-    if ( !is_devfsd_or_child (fs_info) )
-	devfsd_notify_de (de, DEVFSD_NOTIFY_DELETE, inode->i_mode,
-			  inode->i_uid, inode->i_gid, fs_info);
-    free_dentry (de);
-    devfs_put (de);
-    return 0;
-}   /*  End Function devfs_unlink  */
-
-static int devfs_symlink (struct inode *dir, struct dentry *dentry,
-			  const char *symname)
-{
-    int err;
-    struct fs_info *fs_info = dir->i_sb->s_fs_info;
-    struct devfs_entry *parent, *de;
-    struct inode *inode;
-
-    /*  First try to get the devfs entry for this directory  */
-    parent = get_devfs_entry_from_vfs_inode (dir);
-    if (parent == NULL) return -ENOENT;
-    err = devfs_do_symlink (parent, dentry->d_name.name, symname, &de);
-    DPRINTK (DEBUG_DISABLED, "(%s): errcode from <devfs_do_symlink>: %d\n",
-	     dentry->d_name.name, err);
-    if (err < 0) return err;
-    de->vfs = TRUE;
-    de->inode.uid = current->euid;
-    de->inode.gid = current->egid;
-    de->inode.atime = CURRENT_TIME;
-    de->inode.mtime = CURRENT_TIME;
-    de->inode.ctime = CURRENT_TIME;
-    if ( ( inode = _devfs_get_vfs_inode (dir->i_sb, de, dentry) ) == NULL )
-	return -ENOMEM;
-    DPRINTK (DEBUG_DISABLED, "(%s): new VFS inode(%u): %p  dentry: %p\n",
-	     dentry->d_name.name, de->inode.ino, inode, dentry);
-    d_instantiate (dentry, inode);
-    if ( !is_devfsd_or_child (fs_info) )
-	devfsd_notify_de (de, DEVFSD_NOTIFY_CREATE, inode->i_mode,
-			  inode->i_uid, inode->i_gid, fs_info);
-    return 0;
-}   /*  End Function devfs_symlink  */
-
-static int devfs_mkdir (struct inode *dir, struct dentry *dentry, int mode)
-{
-    int err;
-    struct fs_info *fs_info = dir->i_sb->s_fs_info;
-    struct devfs_entry *parent, *de;
-    struct inode *inode;
-
-    mode = (mode & ~S_IFMT) | S_IFDIR;  /*  VFS doesn't pass S_IFMT part  */
-    parent = get_devfs_entry_from_vfs_inode (dir);
-    if (parent == NULL) return -ENOENT;
-    de = _devfs_alloc_entry (dentry->d_name.name, dentry->d_name.len, mode);
-    if (!de) return -ENOMEM;
-    de->vfs = TRUE;
-    if ( ( err = _devfs_append_entry (parent, de, NULL) ) != 0 )
-	return err;
-    de->inode.uid = current->euid;
-    de->inode.gid = current->egid;
-    de->inode.atime = CURRENT_TIME;
-    de->inode.mtime = CURRENT_TIME;
-    de->inode.ctime = CURRENT_TIME;
-    if ( ( inode = _devfs_get_vfs_inode (dir->i_sb, de, dentry) ) == NULL )
-	return -ENOMEM;
-    DPRINTK (DEBUG_DISABLED, "(%s): new VFS inode(%u): %p  dentry: %p\n",
-	     dentry->d_name.name, de->inode.ino, inode, dentry);
-    d_instantiate (dentry, inode);
-    if ( !is_devfsd_or_child (fs_info) )
-	devfsd_notify_de (de, DEVFSD_NOTIFY_CREATE, inode->i_mode,
-			  inode->i_uid, inode->i_gid, fs_info);
-    return 0;
-}   /*  End Function devfs_mkdir  */
-
-static int devfs_rmdir (struct inode *dir, struct dentry *dentry)
-{
-    int err = 0;
-    struct devfs_entry *de;
-    struct fs_info *fs_info = dir->i_sb->s_fs_info;
-    struct inode *inode = dentry->d_inode;
-
-    if (dir->i_sb->s_fs_info != inode->i_sb->s_fs_info) return -EINVAL;
-    de = get_devfs_entry_from_vfs_inode (inode);
-    if (de == NULL) return -ENOENT;
-    if ( !S_ISDIR (de->mode) ) return -ENOTDIR;
-    if (!de->vfs) return -EPERM;
-    /*  First ensure the directory is empty and will stay that way  */
-    write_lock (&de->u.dir.lock);
-    if (de->u.dir.first) err = -ENOTEMPTY;
-    else de->u.dir.no_more_additions = TRUE;
-    write_unlock (&de->u.dir.lock);
-    if (err) return err;
-    /*  Now unhook the directory from its parent  */
-    write_lock (&de->parent->u.dir.lock);
-    if ( !_devfs_unhook (de) ) err = -ENOENT;
-    write_unlock (&de->parent->u.dir.lock);
-    if (err) return err;
-    if ( !is_devfsd_or_child (fs_info) )
-	devfsd_notify_de (de, DEVFSD_NOTIFY_DELETE, inode->i_mode,
-			  inode->i_uid, inode->i_gid, fs_info);
-    free_dentry (de);
-    devfs_put (de);
-    return 0;
-}   /*  End Function devfs_rmdir  */
-
-static int devfs_mknod (struct inode *dir, struct dentry *dentry, int mode,
-			dev_t rdev)
-{
-    int err;
-    struct fs_info *fs_info = dir->i_sb->s_fs_info;
-    struct devfs_entry *parent, *de;
-    struct inode *inode;
-
-    DPRINTK (DEBUG_I_MKNOD, "(%s): mode: 0%o  dev: %u:%u\n",
-	     dentry->d_name.name, mode, MAJOR(rdev), MINOR(rdev));
-    parent = get_devfs_entry_from_vfs_inode (dir);
-    if (parent == NULL) return -ENOENT;
-    de = _devfs_alloc_entry (dentry->d_name.name, dentry->d_name.len, mode);
-    if (!de) return -ENOMEM;
-    de->vfs = TRUE;
-    if (S_ISCHR(mode) || S_ISBLK(mode))
-	de->u.dev = rdev;
-    if ( ( err = _devfs_append_entry (parent, de, NULL) ) != 0 )
+	int err;
+	struct fs_info *fs_info = dir->i_sb->s_fs_info;
+	struct devfs_entry *parent, *de;
+	struct inode *inode;
+
+	DPRINTK(DEBUG_I_MKNOD, "(%s): mode: 0%o  dev: %u:%u\n",
+		dentry->d_name.name, mode, MAJOR(rdev), MINOR(rdev));
+	parent = get_devfs_entry_from_vfs_inode(dir);
+	if (parent == NULL)
+		return -ENOENT;
+	de = _devfs_alloc_entry(dentry->d_name.name, dentry->d_name.len, mode);
+	if (!de)
+		return -ENOMEM;
+	de->vfs = TRUE;
+	if (S_ISCHR(mode) || S_ISBLK(mode))
+		de->u.dev = rdev;
+	if ((err = _devfs_append_entry(parent, de, NULL)) != 0)
+		return err;
+	de->inode.uid = current->euid;
+	de->inode.gid = current->egid;
+	de->inode.atime = CURRENT_TIME;
+	de->inode.mtime = CURRENT_TIME;
+	de->inode.ctime = CURRENT_TIME;
+	if ((inode = _devfs_get_vfs_inode(dir->i_sb, de, dentry)) == NULL)
+		return -ENOMEM;
+	DPRINTK(DEBUG_I_MKNOD, ":   new VFS inode(%u): %p  dentry: %p\n",
+		de->inode.ino, inode, dentry);
+	d_instantiate(dentry, inode);
+	if (!is_devfsd_or_child(fs_info))
+		devfsd_notify_de(de, DEVFSD_NOTIFY_CREATE, inode->i_mode,
+				 inode->i_uid, inode->i_gid, fs_info);
+	return 0;
+}				/*  End Function devfs_mknod  */
+
+static int devfs_readlink(struct dentry *dentry, char *buffer, int buflen)
+{
+	int err;
+	struct devfs_entry *de;
+
+	de = get_devfs_entry_from_vfs_inode(dentry->d_inode);
+	if (!de)
+		return -ENODEV;
+	err = vfs_readlink(dentry, buffer, buflen, de->u.symlink.linkname);
 	return err;
-    de->inode.uid = current->euid;
-    de->inode.gid = current->egid;
-    de->inode.atime = CURRENT_TIME;
-    de->inode.mtime = CURRENT_TIME;
-    de->inode.ctime = CURRENT_TIME;
-    if ( ( inode = _devfs_get_vfs_inode (dir->i_sb, de, dentry) ) == NULL )
-	return -ENOMEM;
-    DPRINTK (DEBUG_I_MKNOD, ":   new VFS inode(%u): %p  dentry: %p\n",
-	     de->inode.ino, inode, dentry);
-    d_instantiate (dentry, inode);
-    if ( !is_devfsd_or_child (fs_info) )
-	devfsd_notify_de (de, DEVFSD_NOTIFY_CREATE, inode->i_mode,
-			  inode->i_uid, inode->i_gid, fs_info);
-    return 0;
-}   /*  End Function devfs_mknod  */
-
-static int devfs_readlink (struct dentry *dentry, char *buffer, int buflen)
-{
-    int err;
-    struct devfs_entry *de;
-
-    de = get_devfs_entry_from_vfs_inode (dentry->d_inode);
-    if (!de) return -ENODEV;
-    err = vfs_readlink (dentry, buffer, buflen, de->u.symlink.linkname);
-    return err;
-}   /*  End Function devfs_readlink  */
-
-static int devfs_follow_link (struct dentry *dentry, struct nameidata *nd)
-{
-    int err;
-    struct devfs_entry *de;
-
-    de = get_devfs_entry_from_vfs_inode (dentry->d_inode);
-    if (!de) return -ENODEV;
-    err = vfs_follow_link (nd, de->u.symlink.linkname);
-    return err;
-}   /*  End Function devfs_follow_link  */
+}				/*  End Function devfs_readlink  */
 
-static struct inode_operations devfs_iops =
+static int devfs_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
-    .setattr        = devfs_notify_change,
+	int err;
+	struct devfs_entry *de;
+
+	de = get_devfs_entry_from_vfs_inode(dentry->d_inode);
+	if (!de)
+		return -ENODEV;
+	err = vfs_follow_link(nd, de->u.symlink.linkname);
+	return err;
+}				/*  End Function devfs_follow_link  */
+
+static struct inode_operations devfs_iops = {
+	.setattr = devfs_notify_change,
 };
 
-static struct inode_operations devfs_dir_iops =
-{
-    .lookup         = devfs_lookup,
-    .unlink         = devfs_unlink,
-    .symlink        = devfs_symlink,
-    .mkdir          = devfs_mkdir,
-    .rmdir          = devfs_rmdir,
-    .mknod          = devfs_mknod,
-    .setattr        = devfs_notify_change,
+static struct inode_operations devfs_dir_iops = {
+	.lookup = devfs_lookup,
+	.unlink = devfs_unlink,
+	.symlink = devfs_symlink,
+	.mkdir = devfs_mkdir,
+	.rmdir = devfs_rmdir,
+	.mknod = devfs_mknod,
+	.setattr = devfs_notify_change,
 };
 
-static struct inode_operations devfs_symlink_iops =
-{
-    .readlink       = devfs_readlink,
-    .follow_link    = devfs_follow_link,
-    .setattr        = devfs_notify_change,
+static struct inode_operations devfs_symlink_iops = {
+	.readlink = devfs_readlink,
+	.follow_link = devfs_follow_link,
+	.setattr = devfs_notify_change,
 };
 
-static int devfs_fill_super (struct super_block *sb, void *data, int silent)
+static int devfs_fill_super(struct super_block *sb, void *data, int silent)
 {
-    struct inode *root_inode = NULL;
+	struct inode *root_inode = NULL;
+
+	if (_devfs_get_root_entry() == NULL)
+		goto out_no_root;
+	atomic_set(&fs_info.devfsd_overrun_count, 0);
+	init_waitqueue_head(&fs_info.devfsd_wait_queue);
+	init_waitqueue_head(&fs_info.revalidate_wait_queue);
+	fs_info.sb = sb;
+	sb->s_fs_info = &fs_info;
+	sb->s_blocksize = 1024;
+	sb->s_blocksize_bits = 10;
+	sb->s_magic = DEVFS_SUPER_MAGIC;
+	sb->s_op = &devfs_sops;
+	if ((root_inode = _devfs_get_vfs_inode(sb, root_entry, NULL)) == NULL)
+		goto out_no_root;
+	sb->s_root = d_alloc_root(root_inode);
+	if (!sb->s_root)
+		goto out_no_root;
+	DPRINTK(DEBUG_S_READ, "(): made devfs ptr: %p\n", sb->s_fs_info);
+	return 0;
+
+      out_no_root:
+	PRINTK("(): get root inode failed\n");
+	if (root_inode)
+		iput(root_inode);
+	return -EINVAL;
+}				/*  End Function devfs_fill_super  */
 
-    if (_devfs_get_root_entry () == NULL) goto out_no_root;
-    atomic_set (&fs_info.devfsd_overrun_count, 0);
-    init_waitqueue_head (&fs_info.devfsd_wait_queue);
-    init_waitqueue_head (&fs_info.revalidate_wait_queue);
-    fs_info.sb = sb;
-    sb->s_fs_info = &fs_info;
-    sb->s_blocksize = 1024;
-    sb->s_blocksize_bits = 10;
-    sb->s_magic = DEVFS_SUPER_MAGIC;
-    sb->s_op = &devfs_sops;
-    if ( ( root_inode = _devfs_get_vfs_inode (sb, root_entry, NULL) ) == NULL )
-	goto out_no_root;
-    sb->s_root = d_alloc_root (root_inode);
-    if (!sb->s_root) goto out_no_root;
-    DPRINTK (DEBUG_S_READ, "(): made devfs ptr: %p\n", sb->s_fs_info);
-    return 0;
-
-out_no_root:
-    PRINTK ("(): get root inode failed\n");
-    if (root_inode) iput (root_inode);
-    return -EINVAL;
-}   /*  End Function devfs_fill_super  */
-
-static struct super_block *
-devfs_get_sb (struct file_system_type *fs_type, int flags,
-	      const char *dev_name, void *data)
+static struct super_block *devfs_get_sb(struct file_system_type *fs_type,
+					int flags, const char *dev_name,
+					void *data)
 {
-    return get_sb_single (fs_type, flags, data, devfs_fill_super);
+	return get_sb_single(fs_type, flags, data, devfs_fill_super);
 }
 
-static struct file_system_type devfs_fs_type =
-{
-    .name	= DEVFS_NAME,
-    .get_sb	= devfs_get_sb,
-    .kill_sb	= kill_anon_super,
+static struct file_system_type devfs_fs_type = {
+	.name = DEVFS_NAME,
+	.get_sb = devfs_get_sb,
+	.kill_sb = kill_anon_super,
 };
 
 /*  File operations for devfsd follow  */
 
-static ssize_t devfsd_read (struct file *file, char *buf, size_t len,
-			    loff_t *ppos)
+static ssize_t devfsd_read(struct file *file, char *buf, size_t len,
+			   loff_t * ppos)
 {
-    int done = FALSE;
-    int ival;
-    loff_t pos, devname_offset, tlen, rpos;
-    devfs_handle_t de;
-    struct devfsd_buf_entry *entry;
-    struct fs_info *fs_info = file->f_dentry->d_inode->i_sb->s_fs_info;
-    struct devfsd_notify_struct *info = fs_info->devfsd_info;
-    DECLARE_WAITQUEUE (wait, current);
-
-    /*  Can't seek (pread) on this device  */
-    if (ppos != &file->f_pos) return -ESPIPE;
-    /*  Verify the task has grabbed the queue  */
-    if (fs_info->devfsd_task != current) return -EPERM;
-    info->major = 0;
-    info->minor = 0;
-    /*  Block for a new entry  */
-    set_current_state (TASK_INTERRUPTIBLE);
-    add_wait_queue (&fs_info->devfsd_wait_queue, &wait);
-    while ( devfsd_queue_empty (fs_info) )
-    {
-	fs_info->devfsd_sleeping = TRUE;
-	wake_up (&fs_info->revalidate_wait_queue);
-	schedule ();
-	fs_info->devfsd_sleeping = FALSE;
-	if ( signal_pending (current) )
-	{
-	    remove_wait_queue (&fs_info->devfsd_wait_queue, &wait);
-	    __set_current_state (TASK_RUNNING);
-	    return -EINTR;
-	}
-	set_current_state (TASK_INTERRUPTIBLE);
-    }
-    remove_wait_queue (&fs_info->devfsd_wait_queue, &wait);
-    __set_current_state (TASK_RUNNING);
-    /*  Now play with the data  */
-    ival = atomic_read (&fs_info->devfsd_overrun_count);
-    info->overrun_count = ival;
-    entry = fs_info->devfsd_first_event;
-    info->type = entry->type;
-    info->mode = entry->mode;
-    info->uid = entry->uid;
-    info->gid = entry->gid;
-    de = entry->de;
-    if (S_ISCHR(de->mode) || S_ISBLK(de->mode)) {
-	info->major = MAJOR(de->u.dev);
-	info->minor = MINOR(de->u.dev);
-    }
-    pos = devfs_generate_path (de, info->devname, DEVFS_PATHLEN);
-    if (pos < 0) return pos;
-    info->namelen = DEVFS_PATHLEN - pos - 1;
-    if (info->mode == 0) info->mode = de->mode;
-    devname_offset = info->devname - (char *) info;
-    rpos = *ppos;
-    if (rpos < devname_offset)
-    {
-	/*  Copy parts of the header  */
-	tlen = devname_offset - rpos;
-	if (tlen > len) tlen = len;
-	if ( copy_to_user (buf, (char *) info + rpos, tlen) )
-	{
-	    return -EFAULT;
-	}
-	rpos += tlen;
-	buf += tlen;
-	len -= tlen;
-    }
-    if ( (rpos >= devname_offset) && (len > 0) )
-    {
-	/*  Copy the name  */
-	tlen = info->namelen + 1;
-	if (tlen > len) tlen = len;
-	else done = TRUE;
-	if ( copy_to_user (buf, info->devname + pos + rpos - devname_offset,
-			   tlen) )
-	{
-	    return -EFAULT;
-	}
-	rpos += tlen;
-    }
-    tlen = rpos - *ppos;
-    if (done)
-    {
-	devfs_handle_t parent;
-
-	spin_lock (&fs_info->devfsd_buffer_lock);
-	fs_info->devfsd_first_event = entry->next;
-	if (entry->next == NULL) fs_info->devfsd_last_event = NULL;
-	spin_unlock (&fs_info->devfsd_buffer_lock);
-	for (; de != NULL; de = parent)
-	{
-	    parent = de->parent;
-	    devfs_put (de);
-	}
-	kmem_cache_free (devfsd_buf_cache, entry);
-	if (ival > 0) atomic_sub (ival, &fs_info->devfsd_overrun_count);
-	*ppos = 0;
-    }
-    else *ppos = rpos;
-    return tlen;
-}   /*  End Function devfsd_read  */
-
-static int devfsd_ioctl (struct inode *inode, struct file *file,
-			 unsigned int cmd, unsigned long arg)
-{
-    int ival;
-    struct fs_info *fs_info = inode->i_sb->s_fs_info;
-
-    switch (cmd)
-    {
-      case DEVFSDIOC_GET_PROTO_REV:
-	ival = DEVFSD_PROTOCOL_REVISION_KERNEL;
-	if ( copy_to_user ( (void *)arg, &ival, sizeof ival ) ) return -EFAULT;
-	break;
-      case DEVFSDIOC_SET_EVENT_MASK:
-	/*  Ensure only one reader has access to the queue. This scheme will
-	    work even if the global kernel lock were to be removed, because it
-	    doesn't matter who gets in first, as long as only one gets it  */
-	if (fs_info->devfsd_task == NULL)
-	{
-	    static spinlock_t lock = SPIN_LOCK_UNLOCKED;
-
-	    if ( !spin_trylock (&lock) ) return -EBUSY;
-	    if (fs_info->devfsd_task != NULL)
-	    {   /*  We lost the race...  */
-		spin_unlock (&lock);
-		return -EBUSY;
-	    }
-	    fs_info->devfsd_task = current;
-	    spin_unlock (&lock);
-	    fs_info->devfsd_pgrp = (process_group(current) == current->pid) ?
-		process_group(current) : 0;
-	    fs_info->devfsd_file = file;
-	    fs_info->devfsd_info = kmalloc (sizeof *fs_info->devfsd_info,
-					    GFP_KERNEL);
-	    if (!fs_info->devfsd_info)
-	    {
-		devfsd_close (inode, file);
-		return -ENOMEM;
-	    }
+	int done = FALSE;
+	int ival;
+	loff_t pos, devname_offset, tlen, rpos;
+	devfs_handle_t de;
+	struct devfsd_buf_entry *entry;
+	struct fs_info *fs_info = file->f_dentry->d_inode->i_sb->s_fs_info;
+	struct devfsd_notify_struct *info = fs_info->devfsd_info;
+	DECLARE_WAITQUEUE(wait, current);
+
+	/*  Can't seek (pread) on this device  */
+	if (ppos != &file->f_pos)
+		return -ESPIPE;
+	/*  Verify the task has grabbed the queue  */
+	if (fs_info->devfsd_task != current)
+		return -EPERM;
+	info->major = 0;
+	info->minor = 0;
+	/*  Block for a new entry  */
+	set_current_state(TASK_INTERRUPTIBLE);
+	add_wait_queue(&fs_info->devfsd_wait_queue, &wait);
+	while (devfsd_queue_empty(fs_info)) {
+		fs_info->devfsd_sleeping = TRUE;
+		wake_up(&fs_info->revalidate_wait_queue);
+		schedule();
+		fs_info->devfsd_sleeping = FALSE;
+		if (signal_pending(current)) {
+			remove_wait_queue(&fs_info->devfsd_wait_queue, &wait);
+			__set_current_state(TASK_RUNNING);
+			return -EINTR;
+		}
+		set_current_state(TASK_INTERRUPTIBLE);
 	}
-	else if (fs_info->devfsd_task != current) return -EBUSY;
-	fs_info->devfsd_event_mask = arg;  /*  Let the masses come forth  */
-	break;
-      case DEVFSDIOC_RELEASE_EVENT_QUEUE:
-	if (fs_info->devfsd_file != file) return -EPERM;
-	return devfsd_close (inode, file);
-	/*break;*/
+	remove_wait_queue(&fs_info->devfsd_wait_queue, &wait);
+	__set_current_state(TASK_RUNNING);
+	/*  Now play with the data  */
+	ival = atomic_read(&fs_info->devfsd_overrun_count);
+	info->overrun_count = ival;
+	entry = fs_info->devfsd_first_event;
+	info->type = entry->type;
+	info->mode = entry->mode;
+	info->uid = entry->uid;
+	info->gid = entry->gid;
+	de = entry->de;
+	if (S_ISCHR(de->mode) || S_ISBLK(de->mode)) {
+		info->major = MAJOR(de->u.dev);
+		info->minor = MINOR(de->u.dev);
+	}
+	pos = devfs_generate_path(de, info->devname, DEVFS_PATHLEN);
+	if (pos < 0)
+		return pos;
+	info->namelen = DEVFS_PATHLEN - pos - 1;
+	if (info->mode == 0)
+		info->mode = de->mode;
+	devname_offset = info->devname - (char *)info;
+	rpos = *ppos;
+	if (rpos < devname_offset) {
+		/*  Copy parts of the header  */
+		tlen = devname_offset - rpos;
+		if (tlen > len)
+			tlen = len;
+		if (copy_to_user(buf, (char *)info + rpos, tlen)) {
+			return -EFAULT;
+		}
+		rpos += tlen;
+		buf += tlen;
+		len -= tlen;
+	}
+	if ((rpos >= devname_offset) && (len > 0)) {
+		/*  Copy the name  */
+		tlen = info->namelen + 1;
+		if (tlen > len)
+			tlen = len;
+		else
+			done = TRUE;
+		if (copy_to_user
+		    (buf, info->devname + pos + rpos - devname_offset, tlen)) {
+			return -EFAULT;
+		}
+		rpos += tlen;
+	}
+	tlen = rpos - *ppos;
+	if (done) {
+		devfs_handle_t parent;
+
+		spin_lock(&fs_info->devfsd_buffer_lock);
+		fs_info->devfsd_first_event = entry->next;
+		if (entry->next == NULL)
+			fs_info->devfsd_last_event = NULL;
+		spin_unlock(&fs_info->devfsd_buffer_lock);
+		for (; de != NULL; de = parent) {
+			parent = de->parent;
+			devfs_put(de);
+		}
+		kmem_cache_free(devfsd_buf_cache, entry);
+		if (ival > 0)
+			atomic_sub(ival, &fs_info->devfsd_overrun_count);
+		*ppos = 0;
+	} else
+		*ppos = rpos;
+	return tlen;
+}				/*  End Function devfsd_read  */
+
+static int devfsd_ioctl(struct inode *inode, struct file *file,
+			unsigned int cmd, unsigned long arg)
+{
+	int ival;
+	struct fs_info *fs_info = inode->i_sb->s_fs_info;
+
+	switch (cmd) {
+	case DEVFSDIOC_GET_PROTO_REV:
+		ival = DEVFSD_PROTOCOL_REVISION_KERNEL;
+		if (copy_to_user((void *)arg, &ival, sizeof ival))
+			return -EFAULT;
+		break;
+	case DEVFSDIOC_SET_EVENT_MASK:
+		/*  Ensure only one reader has access to the queue. This scheme will
+		   work even if the global kernel lock were to be removed, because it
+		   doesn't matter who gets in first, as long as only one gets it  */
+		if (fs_info->devfsd_task == NULL) {
+			static spinlock_t lock = SPIN_LOCK_UNLOCKED;
+
+			if (!spin_trylock(&lock))
+				return -EBUSY;
+			if (fs_info->devfsd_task != NULL) {	/*  We lost the race...  */
+				spin_unlock(&lock);
+				return -EBUSY;
+			}
+			fs_info->devfsd_task = current;
+			spin_unlock(&lock);
+			fs_info->devfsd_pgrp =
+			    (process_group(current) ==
+			     current->pid) ? process_group(current) : 0;
+			fs_info->devfsd_file = file;
+			fs_info->devfsd_info =
+			    kmalloc(sizeof *fs_info->devfsd_info, GFP_KERNEL);
+			if (!fs_info->devfsd_info) {
+				devfsd_close(inode, file);
+				return -ENOMEM;
+			}
+		} else if (fs_info->devfsd_task != current)
+			return -EBUSY;
+		fs_info->devfsd_event_mask = arg;	/*  Let the masses come forth  */
+		break;
+	case DEVFSDIOC_RELEASE_EVENT_QUEUE:
+		if (fs_info->devfsd_file != file)
+			return -EPERM;
+		return devfsd_close(inode, file);
+		/*break; */
 #ifdef CONFIG_DEVFS_DEBUG
-      case DEVFSDIOC_SET_DEBUG_MASK:
-	if ( copy_from_user (&ival, (void *) arg, sizeof ival) )return -EFAULT;
-	devfs_debug = ival;
-	break;
+	case DEVFSDIOC_SET_DEBUG_MASK:
+		if (copy_from_user(&ival, (void *)arg, sizeof ival))
+			return -EFAULT;
+		devfs_debug = ival;
+		break;
 #endif
-      default:
-	return -ENOIOCTLCMD;
-    }
-    return 0;
-}   /*  End Function devfsd_ioctl  */
-
-static int devfsd_close (struct inode *inode, struct file *file)
-{
-    struct devfsd_buf_entry *entry, *next;
-    struct fs_info *fs_info = inode->i_sb->s_fs_info;
-
-    if (fs_info->devfsd_file != file) return 0;
-    fs_info->devfsd_event_mask = 0;
-    fs_info->devfsd_file = NULL;
-    spin_lock (&fs_info->devfsd_buffer_lock);
-    entry = fs_info->devfsd_first_event;
-    fs_info->devfsd_first_event = NULL;
-    fs_info->devfsd_last_event = NULL;
-    if (fs_info->devfsd_info)
-    {
-	kfree (fs_info->devfsd_info);
-	fs_info->devfsd_info = NULL;
-    }
-    spin_unlock (&fs_info->devfsd_buffer_lock);
-    fs_info->devfsd_pgrp = 0;
-    fs_info->devfsd_task = NULL;
-    wake_up (&fs_info->revalidate_wait_queue);
-    for (; entry; entry = next)
-    {
-	next = entry->next;
-	kmem_cache_free (devfsd_buf_cache, entry);
-    }
-    return 0;
-}   /*  End Function devfsd_close  */
+	default:
+		return -ENOIOCTLCMD;
+	}
+	return 0;
+}				/*  End Function devfsd_ioctl  */
+
+static int devfsd_close(struct inode *inode, struct file *file)
+{
+	struct devfsd_buf_entry *entry, *next;
+	struct fs_info *fs_info = inode->i_sb->s_fs_info;
+
+	if (fs_info->devfsd_file != file)
+		return 0;
+	fs_info->devfsd_event_mask = 0;
+	fs_info->devfsd_file = NULL;
+	spin_lock(&fs_info->devfsd_buffer_lock);
+	entry = fs_info->devfsd_first_event;
+	fs_info->devfsd_first_event = NULL;
+	fs_info->devfsd_last_event = NULL;
+	if (fs_info->devfsd_info) {
+		kfree(fs_info->devfsd_info);
+		fs_info->devfsd_info = NULL;
+	}
+	spin_unlock(&fs_info->devfsd_buffer_lock);
+	fs_info->devfsd_pgrp = 0;
+	fs_info->devfsd_task = NULL;
+	wake_up(&fs_info->revalidate_wait_queue);
+	for (; entry; entry = next) {
+		next = entry->next;
+		kmem_cache_free(devfsd_buf_cache, entry);
+	}
+	return 0;
+}				/*  End Function devfsd_close  */
 
 #ifdef CONFIG_DEVFS_DEBUG
-static ssize_t stat_read (struct file *file, char *buf, size_t len,
-			  loff_t *ppos)
+static ssize_t stat_read(struct file *file, char *buf, size_t len,
+			 loff_t * ppos)
 {
-    ssize_t num;
-    char txt[80];
+	ssize_t num;
+	char txt[80];
 
-    num = sprintf (txt, "Number of entries: %u  number of bytes: %u\n",
-		   stat_num_entries, stat_num_bytes) + 1;
-    /*  Can't seek (pread) on this device  */
-    if (ppos != &file->f_pos) return -ESPIPE;
-    if (*ppos >= num) return 0;
-    if (*ppos + len > num) len = num - *ppos;
-    if ( copy_to_user (buf, txt + *ppos, len) ) return -EFAULT;
-    *ppos += len;
-    return len;
-}   /*  End Function stat_read  */
+	num = sprintf(txt, "Number of entries: %u  number of bytes: %u\n",
+		      stat_num_entries, stat_num_bytes) + 1;
+	/*  Can't seek (pread) on this device  */
+	if (ppos != &file->f_pos)
+		return -ESPIPE;
+	if (*ppos >= num)
+		return 0;
+	if (*ppos + len > num)
+		len = num - *ppos;
+	if (copy_to_user(buf, txt + *ppos, len))
+		return -EFAULT;
+	*ppos += len;
+	return len;
+}				/*  End Function stat_read  */
 #endif
 
 static int __init init_devfs_fs(void)
@@ -2793,8 +2809,8 @@ static int __init init_devfs_fs(void)
 	printk(KERN_INFO "%s: %s Richard Gooch (rgooch@atnf.csiro.au)\n",
 	       DEVFS_NAME, DEVFS_VERSION);
 	devfsd_buf_cache = kmem_cache_create("devfsd_event",
-					  sizeof (struct devfsd_buf_entry),
-					  0, 0, NULL, NULL);
+					     sizeof(struct devfsd_buf_entry),
+					     0, 0, NULL, NULL);
 	if (!devfsd_buf_cache)
 		OOPS("(): unable to allocate event slab\n");
 #ifdef CONFIG_DEVFS_DEBUG
@@ -2809,32 +2825,35 @@ static int __init init_devfs_fs(void)
 		return major;
 
 	/*  And create the entry for ".devfsd"  */
-	devfsd = _devfs_alloc_entry(".devfsd", 0, S_IFCHR|S_IRUSR|S_IWUSR);
-	if (devfsd == NULL )
+	devfsd = _devfs_alloc_entry(".devfsd", 0, S_IFCHR | S_IRUSR | S_IWUSR);
+	if (devfsd == NULL)
 		return -ENOMEM;
 	devfsd->u.dev = MKDEV(major, 0);
 	_devfs_append_entry(root_entry, devfsd, NULL);
 
 #ifdef CONFIG_DEVFS_DEBUG
-	stat = _devfs_alloc_entry(".stat", 0, S_IFCHR|S_IRUGO);
-	if (stat == NULL )
+	stat = _devfs_alloc_entry(".stat", 0, S_IFCHR | S_IRUGO);
+	if (stat == NULL)
 		return -ENOMEM;
 	stat->u.dev = MKDEV(major, 1);
-	_devfs_append_entry (root_entry, stat, NULL);
+	_devfs_append_entry(root_entry, stat, NULL);
 #endif
 
 	err = register_filesystem(&devfs_fs_type);
 	return err;
-}   /*  End Function init_devfs_fs  */
+}				/*  End Function init_devfs_fs  */
 
-void __init mount_devfs_fs (void)
+void __init mount_devfs_fs(void)
 {
-    int err;
+	int err;
 
-    if ( !(boot_options & OPTION_MOUNT) ) return;
-    err = do_mount ("none", "/dev", "devfs", 0, NULL);
-    if (err == 0) printk (KERN_INFO "Mounted devfs on /dev\n");
-    else PRINTK ("(): unable to mount devfs, err: %d\n", err);
-}   /*  End Function mount_devfs_fs  */
+	if (!(boot_options & OPTION_MOUNT))
+		return;
+	err = do_mount("none", "/dev", "devfs", 0, NULL);
+	if (err == 0)
+		printk(KERN_INFO "Mounted devfs on /dev\n");
+	else
+		PRINTK("(): unable to mount devfs, err: %d\n", err);
+}				/*  End Function mount_devfs_fs  */
 
 module_init(init_devfs_fs)
--- diff/fs/devfs/util.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/devfs/util.c	2004-04-21 10:45:35.179355424 +0100
@@ -73,7 +73,6 @@
 #include <linux/genhd.h>
 #include <asm/bitops.h>
 
-
 int devfs_register_tape(const char *name)
 {
 	char tname[32], dest[64];
@@ -86,6 +85,7 @@ int devfs_register_tape(const char *name
 
 	return n;
 }
+
 EXPORT_SYMBOL(devfs_register_tape);
 
 void devfs_unregister_tape(int num)
--- diff/fs/direct-io.c	2004-01-19 10:22:59.000000000 +0000
+++ source/fs/direct-io.c	2004-04-21 10:45:35.180355272 +0100
@@ -52,6 +52,10 @@
  *
  * If blkfactor is zero then the user's request was aligned to the filesystem's
  * blocksize.
+ *
+ * needs_locking is set for regular files on direct-IO-naive filesystems.  It
+ * determines whether we need to do the fancy locking which prevents direct-IO
+ * from being able to read uninitialised disk blocks.
  */
 
 struct dio {
@@ -59,6 +63,7 @@ struct dio {
 	struct bio *bio;		/* bio under assembly */
 	struct inode *inode;
 	int rw;
+	int needs_locking;		/* doesn't change */
 	unsigned blkbits;		/* doesn't change */
 	unsigned blkfactor;		/* When we're using an alignment which
 					   is finer than the filesystem's soft
@@ -69,6 +74,7 @@ struct dio {
 					   been performed at the start of a
 					   write */
 	int pages_in_io;		/* approximate total IO pages */
+	size_t	size;			/* total request size (doesn't change)*/
 	sector_t block_in_file;		/* Current offset into the underlying
 					   file in dio_block units. */
 	unsigned blocks_available;	/* At block_in_file.  changes */
@@ -110,16 +116,16 @@ struct dio {
 	int page_errors;		/* errno from get_user_pages() */
 
 	/* BIO completion state */
-	atomic_t bio_count;		/* nr bios to be completed */
-	atomic_t bios_in_flight;	/* nr bios in flight */
-	spinlock_t bio_list_lock;	/* protects bio_list */
+	spinlock_t bio_lock;		/* protects BIO fields below */
+	int bio_count;			/* nr bios to be completed */
+	int bios_in_flight;		/* nr bios in flight */
 	struct bio *bio_list;		/* singly linked via bi_private */
 	struct task_struct *waiter;	/* waiting task (NULL if none) */
 
 	/* AIO related stuff */
 	struct kiocb *iocb;		/* kiocb */
 	int is_async;			/* is IO async ? */
-	int result;			/* IO result */
+	ssize_t result;                 /* IO result */
 };
 
 /*
@@ -204,8 +210,10 @@ static struct page *dio_get_page(struct 
  */
 static void dio_complete(struct dio *dio, loff_t offset, ssize_t bytes)
 {
-	if (dio->end_io)
+	if (dio->end_io && dio->result)
 		dio->end_io(dio->inode, offset, bytes, dio->map_bh.b_private);
+	if (dio->needs_locking)
+		up_read(&dio->inode->i_alloc_sem);
 }
 
 /*
@@ -214,14 +222,38 @@ static void dio_complete(struct dio *dio
  */
 static void finished_one_bio(struct dio *dio)
 {
-	if (atomic_dec_and_test(&dio->bio_count)) {
+	unsigned long flags;
+
+	spin_lock_irqsave(&dio->bio_lock, flags);
+	if (dio->bio_count == 1) {
 		if (dio->is_async) {
+			/*
+			 * Last reference to the dio is going away.
+			 * Drop spinlock and complete the DIO.
+			 */
+			spin_unlock_irqrestore(&dio->bio_lock, flags);
 			dio_complete(dio, dio->block_in_file << dio->blkbits,
 					dio->result);
-			aio_complete(dio->iocb, dio->result, 0);
-			kfree(dio);
+			/* Complete AIO later if falling back to buffered i/o */
+			if (dio->result == dio->size || dio->rw == READ) {
+				aio_complete(dio->iocb, dio->result, 0);
+				kfree(dio);
+				return;
+			} else {
+				/*
+				 * Falling back to buffered
+				 */
+				spin_lock_irqsave(&dio->bio_lock, flags);
+				dio->bio_count--;
+				if (dio->waiter)
+					wake_up_process(dio->waiter);
+				spin_unlock_irqrestore(&dio->bio_lock, flags);
+				return;
+			}
 		}
 	}
+	dio->bio_count--;
+	spin_unlock_irqrestore(&dio->bio_lock, flags);
 }
 
 static int dio_bio_complete(struct dio *dio, struct bio *bio);
@@ -255,13 +287,13 @@ static int dio_bio_end_io(struct bio *bi
 	if (bio->bi_size)
 		return 1;
 
-	spin_lock_irqsave(&dio->bio_list_lock, flags);
+	spin_lock_irqsave(&dio->bio_lock, flags);
 	bio->bi_private = dio->bio_list;
 	dio->bio_list = bio;
-	atomic_dec(&dio->bios_in_flight);
-	if (dio->waiter && atomic_read(&dio->bios_in_flight) == 0)
+	dio->bios_in_flight--;
+	if (dio->waiter && dio->bios_in_flight == 0)
 		wake_up_process(dio->waiter);
-	spin_unlock_irqrestore(&dio->bio_list_lock, flags);
+	spin_unlock_irqrestore(&dio->bio_lock, flags);
 	return 0;
 }
 
@@ -294,10 +326,13 @@ dio_bio_alloc(struct dio *dio, struct bl
 static void dio_bio_submit(struct dio *dio)
 {
 	struct bio *bio = dio->bio;
+	unsigned long flags;
 
 	bio->bi_private = dio;
-	atomic_inc(&dio->bio_count);
-	atomic_inc(&dio->bios_in_flight);
+	spin_lock_irqsave(&dio->bio_lock, flags);
+	dio->bio_count++;
+	dio->bios_in_flight++;
+	spin_unlock_irqrestore(&dio->bio_lock, flags);
 	if (dio->is_async && dio->rw == READ)
 		bio_set_pages_dirty(bio);
 	submit_bio(dio->rw, bio);
@@ -323,22 +358,22 @@ static struct bio *dio_await_one(struct 
 	unsigned long flags;
 	struct bio *bio;
 
-	spin_lock_irqsave(&dio->bio_list_lock, flags);
+	spin_lock_irqsave(&dio->bio_lock, flags);
 	while (dio->bio_list == NULL) {
 		set_current_state(TASK_UNINTERRUPTIBLE);
 		if (dio->bio_list == NULL) {
 			dio->waiter = current;
-			spin_unlock_irqrestore(&dio->bio_list_lock, flags);
-			blk_run_queues();
+			spin_unlock_irqrestore(&dio->bio_lock, flags);
+			blk_run_address_space(dio->inode->i_mapping);
 			io_schedule();
-			spin_lock_irqsave(&dio->bio_list_lock, flags);
+			spin_lock_irqsave(&dio->bio_lock, flags);
 			dio->waiter = NULL;
 		}
 		set_current_state(TASK_RUNNING);
 	}
 	bio = dio->bio_list;
 	dio->bio_list = bio->bi_private;
-	spin_unlock_irqrestore(&dio->bio_list_lock, flags);
+	spin_unlock_irqrestore(&dio->bio_lock, flags);
 	return bio;
 }
 
@@ -380,7 +415,12 @@ static int dio_await_completion(struct d
 	if (dio->bio)
 		dio_bio_submit(dio);
 
-	while (atomic_read(&dio->bio_count)) {
+	/*
+	 * The bio_lock is not held for the read of bio_count.
+	 * This is ok since it is the dio_bio_complete() that changes
+	 * bio_count.
+	 */
+	while (dio->bio_count) {
 		struct bio *bio = dio_await_one(dio);
 		int ret2;
 
@@ -407,10 +447,10 @@ static int dio_bio_reap(struct dio *dio)
 			unsigned long flags;
 			struct bio *bio;
 
-			spin_lock_irqsave(&dio->bio_list_lock, flags);
+			spin_lock_irqsave(&dio->bio_lock, flags);
 			bio = dio->bio_list;
 			dio->bio_list = bio->bi_private;
-			spin_unlock_irqrestore(&dio->bio_list_lock, flags);
+			spin_unlock_irqrestore(&dio->bio_lock, flags);
 			ret = dio_bio_complete(dio, bio);
 		}
 		dio->reap_counter = 0;
@@ -449,6 +489,7 @@ static int get_more_blocks(struct dio *d
 	unsigned long fs_count;	/* Number of filesystem-sized blocks */
 	unsigned long dio_count;/* Number of dio_block-sized blocks */
 	unsigned long blkmask;
+	int beyond_eof = 0;
 
 	/*
 	 * If there was a memory error and we've overwritten all the
@@ -466,8 +507,19 @@ static int get_more_blocks(struct dio *d
 		if (dio_count & blkmask)	
 			fs_count++;
 
+		if (dio->needs_locking) {
+			if (dio->block_in_file >= (i_size_read(dio->inode) >>
+							dio->blkbits))
+				beyond_eof = 1;
+		}
+		/*
+		 * For writes inside i_size we forbid block creations: only
+		 * overwrites are permitted.  We fall back to buffered writes
+		 * at a higher level for inside-i_size block-instantiating
+		 * writes.
+		 */
 		ret = (*dio->get_blocks)(dio->inode, fs_startblk, fs_count,
-				map_bh, dio->rw == WRITE);
+				map_bh, (dio->rw == WRITE) && beyond_eof);
 	}
 	return ret;
 }
@@ -774,6 +826,10 @@ do_holes:
 			if (!buffer_mapped(map_bh)) {
 				char *kaddr;
 
+				/* AKPM: eargh, -ENOTBLK is a hack */
+				if (dio->rw == WRITE)
+					return -ENOTBLK;
+
 				if (dio->block_in_file >=
 					i_size_read(dio->inode)>>blkbits) {
 					/* We hit eof */
@@ -839,32 +895,30 @@ out:
 	return ret;
 }
 
-static int
+/*
+ * Releases both i_sem and i_alloc_sem
+ */
+static ssize_t
 direct_io_worker(int rw, struct kiocb *iocb, struct inode *inode, 
 	const struct iovec *iov, loff_t offset, unsigned long nr_segs, 
-	unsigned blkbits, get_blocks_t get_blocks, dio_iodone_t end_io)
+	unsigned blkbits, get_blocks_t get_blocks, dio_iodone_t end_io,
+	struct dio *dio)
 {
 	unsigned long user_addr; 
 	int seg;
-	int ret = 0;
-	int ret2;
-	struct dio *dio;
+	ssize_t ret = 0;
+	ssize_t ret2;
 	size_t bytes;
 
-	dio = kmalloc(sizeof(*dio), GFP_KERNEL);
-	if (!dio)
-		return -ENOMEM;
-	dio->is_async = !is_sync_kiocb(iocb);
-
 	dio->bio = NULL;
 	dio->inode = inode;
 	dio->rw = rw;
 	dio->blkbits = blkbits;
 	dio->blkfactor = inode->i_blkbits - blkbits;
 	dio->start_zero_done = 0;
+	dio->size = 0;
 	dio->block_in_file = offset >> blkbits;
 	dio->blocks_available = 0;
-
 	dio->cur_page = NULL;
 
 	dio->boundary = 0;
@@ -887,9 +941,9 @@ direct_io_worker(int rw, struct kiocb *i
 	 * (or synchronous) device could take the count to zero while we're
 	 * still submitting BIOs.
 	 */
-	atomic_set(&dio->bio_count, 1);
-	atomic_set(&dio->bios_in_flight, 0);
-	spin_lock_init(&dio->bio_list_lock);
+	dio->bio_count = 1;
+	dio->bios_in_flight = 0;
+	spin_lock_init(&dio->bio_lock);
 	dio->bio_list = NULL;
 	dio->waiter = NULL;
 
@@ -899,7 +953,7 @@ direct_io_worker(int rw, struct kiocb *i
 
 	for (seg = 0; seg < nr_segs; seg++) {
 		user_addr = (unsigned long)iov[seg].iov_base;
-		bytes = iov[seg].iov_len;
+		dio->size += bytes = iov[seg].iov_len;
 
 		/* Index into the first page of the first block */
 		dio->first_block_in_page = (user_addr & ~PAGE_MASK) >> blkbits;
@@ -930,6 +984,13 @@ direct_io_worker(int rw, struct kiocb *i
 		}
 	} /* end iovec loop */
 
+	if (ret == -ENOTBLK && rw == WRITE) {
+		/*
+		 * The remaining part of the request will be
+		 * be handled by buffered I/O when we return
+		 */
+		ret = 0;
+	}
 	/*
 	 * There may be some unwritten disk at the end of a part-written
 	 * fs-block-sized block.  Go zero that now.
@@ -953,14 +1014,48 @@ direct_io_worker(int rw, struct kiocb *i
 	dio_cleanup(dio);
 
 	/*
+	 * All block lookups have been performed. For READ requests
+	 * we can let i_sem go now that its achieved its purpose
+	 * of protecting us from looking up uninitialized blocks.
+	 */
+	if ((rw == READ) && dio->needs_locking)
+		up(&dio->inode->i_sem);
+
+	/*
 	 * OK, all BIOs are submitted, so we can decrement bio_count to truly
 	 * reflect the number of to-be-processed BIOs.
 	 */
 	if (dio->is_async) {
+		int should_wait = 0;
+
+		if (dio->result < dio->size && rw == WRITE) {
+			dio->waiter = current;
+			should_wait = 1;
+		}
 		if (ret == 0)
-			ret = dio->result;	/* Bytes written */
+			ret = dio->result;
 		finished_one_bio(dio);		/* This can free the dio */
-		blk_run_queues();
+		blk_run_address_space(inode->i_mapping);
+		if (should_wait) {
+			unsigned long flags;
+			/*
+			 * Wait for already issued I/O to drain out and
+			 * release its references to user-space pages
+			 * before returning to fallback on buffered I/O
+			 */
+
+			spin_lock_irqsave(&dio->bio_lock, flags);
+			set_current_state(TASK_UNINTERRUPTIBLE);
+			while (dio->bio_count) {
+				spin_unlock_irqrestore(&dio->bio_lock, flags);
+				io_schedule();
+				spin_lock_irqsave(&dio->bio_lock, flags);
+				set_current_state(TASK_UNINTERRUPTIBLE);
+			}
+			spin_unlock_irqrestore(&dio->bio_lock, flags);
+			set_current_state(TASK_RUNNING);
+			kfree(dio);
+		}
 	} else {
 		finished_one_bio(dio);
 		ret2 = dio_await_completion(dio);
@@ -980,6 +1075,14 @@ direct_io_worker(int rw, struct kiocb *i
 				ret = i_size - offset;
 		}
 		dio_complete(dio, offset, ret);
+		/* We could have also come here on an AIO file extend */
+		if (!is_sync_kiocb(iocb) && rw == WRITE &&
+		    ret >= 0 && dio->result == dio->size)
+			/*
+			 * For AIO writes where we have completed the
+			 * i/o, we have to mark the the aio complete.
+			 */
+			aio_complete(iocb, ret, 0);
 		kfree(dio);
 	}
 	return ret;
@@ -987,11 +1090,17 @@ direct_io_worker(int rw, struct kiocb *i
 
 /*
  * This is a library function for use by filesystem drivers.
+ *
+ * For writes to S_ISREG files, we are called under i_sem and return with i_sem
+ * held, even though it is internally dropped.
+ *
+ * For writes to S_ISBLK files, i_sem is not held on entry; it is never taken.
  */
-int
-blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, 
+ssize_t
+__blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
 	struct block_device *bdev, const struct iovec *iov, loff_t offset, 
-	unsigned long nr_segs, get_blocks_t get_blocks, dio_iodone_t end_io)
+	unsigned long nr_segs, get_blocks_t get_blocks, dio_iodone_t end_io,
+	int needs_special_locking)
 {
 	int seg;
 	size_t size;
@@ -1000,6 +1109,9 @@ blockdev_direct_IO(int rw, struct kiocb 
 	unsigned bdev_blkbits = 0;
 	unsigned blocksize_mask = (1 << blkbits) - 1;
 	ssize_t retval = -EINVAL;
+	loff_t end = offset;
+	struct dio *dio;
+	int needs_locking;
 
 	if (bdev)
 		bdev_blkbits = blksize_bits(bdev_hardsect_size(bdev));
@@ -1016,6 +1128,7 @@ blockdev_direct_IO(int rw, struct kiocb 
 	for (seg = 0; seg < nr_segs; seg++) {
 		addr = (unsigned long)iov[seg].iov_base;
 		size = iov[seg].iov_len;
+		end += size;
 		if ((addr & blocksize_mask) || (size & blocksize_mask))  {
 			if (bdev)
 				 blkbits = bdev_blkbits;
@@ -1025,10 +1138,46 @@ blockdev_direct_IO(int rw, struct kiocb 
 		}
 	}
 
-	retval = direct_io_worker(rw, iocb, inode, iov, offset, 
-				nr_segs, blkbits, get_blocks, end_io);
+	dio = kmalloc(sizeof(*dio), GFP_KERNEL);
+	retval = -ENOMEM;
+	if (!dio)
+		goto out;
+
+	/*
+	 * For regular files,
+	 *	readers need to grab i_sem and i_alloc_sem
+	 *	writers need to grab i_alloc_sem only (i_sem is already held)
+	 */
+	needs_locking = 0;
+	if (S_ISREG(inode->i_mode) && needs_special_locking) {
+		needs_locking = 1;
+		if (rw == READ) {
+			struct address_space *mapping;
+
+			mapping = iocb->ki_filp->f_mapping;
+			down(&inode->i_sem);
+			retval = filemap_write_and_wait(mapping);
+			if (retval) {
+				up(&inode->i_sem);
+				kfree(dio);
+				goto out;
+			}
+		}
+		down_read(&inode->i_alloc_sem);
+	}
+	dio->needs_locking = needs_locking;
+	/*
+	 * For file extending writes updating i_size before data
+	 * writeouts complete can expose uninitialized blocks. So
+	 * even for AIO, we need to wait for i/o to complete before
+	 * returning in this case.
+	 */
+	dio->is_async = !is_sync_kiocb(iocb) && !((rw == WRITE) &&
+		(end > i_size_read(inode)));
+
+	retval = direct_io_worker(rw, iocb, inode, iov, offset,
+				nr_segs, blkbits, get_blocks, end_io, dio);
 out:
 	return retval;
 }
-
-EXPORT_SYMBOL(blockdev_direct_IO);
+EXPORT_SYMBOL(__blockdev_direct_IO);
--- diff/fs/dnotify.c	2004-02-09 10:36:12.000000000 +0000
+++ source/fs/dnotify.c	2004-04-21 10:45:35.181355120 +0100
@@ -154,6 +154,9 @@ void dnotify_parent(struct dentry *dentr
 {
 	struct dentry *parent;
 
+	if (!dir_notify_enable)
+		return;
+
 	spin_lock(&dentry->d_lock);
 	parent = dentry->d_parent;
 	if (parent->d_inode->i_dnotify_mask & event) {
--- diff/fs/dquot.c	2004-02-09 10:36:12.000000000 +0000
+++ source/fs/dquot.c	2004-04-21 10:45:35.183354816 +0100
@@ -1,16 +1,13 @@
 /*
- * Implementation of the diskquota system for the LINUX operating
- * system. QUOTA is implemented using the BSD system call interface as
- * the means of communication with the user level. Currently only the
- * ext2 filesystem has support for disk quotas. Other filesystems may
- * be added in the future. This file contains the generic routines
- * called by the different filesystems on allocation of an inode or
- * block. These routines take care of the administration needed to
- * have a consistent diskquota tracking system. The ideas of both
- * user and group quotas are based on the Melbourne quota system as
- * used on BSD derived systems. The internal implementation is 
- * based on one of the several variants of the LINUX inode-subsystem
- * with added complexity of the diskquota system.
+ * Implementation of the diskquota system for the LINUX operating system. QUOTA
+ * is implemented using the BSD system call interface as the means of
+ * communication with the user level. This file contains the generic routines
+ * called by the different filesystems on allocation of an inode or block.
+ * These routines take care of the administration needed to have a consistent
+ * diskquota tracking system. The ideas of both user and group quotas are based
+ * on the Melbourne quota system as used on BSD derived systems. The internal
+ * implementation is based on one of the several variants of the LINUX
+ * inode-subsystem with added complexity of the diskquota system.
  * 
  * Version: $Id: dquot.c,v 6.3 1996/11/17 18:35:34 mvw Exp mvw $
  * 
@@ -52,6 +49,9 @@
  *		New SMP locking.
  *		Jan Kara, <jack@suse.cz>, 10/2002
  *
+ *		Added journalled quota support
+ *		Jan Kara, <jack@suse.cz>, 2003,2004
+ *
  * (C) Copyright 1994 - 1997 Marco van Wieringen 
  */
 
@@ -85,13 +85,36 @@
  * and quota formats and also dqstats structure containing statistics about the
  * lists. dq_data_lock protects data from dq_dqb and also mem_dqinfo structures
  * and also guards consistency of dquot->dq_dqb with inode->i_blocks, i_bytes.
- * Note that we don't have to do the locking of i_blocks and i_bytes when the
- * quota is disabled - i_sem should serialize the access. dq_data_lock should
- * be always grabbed before dq_list_lock.
+ * i_blocks and i_bytes updates itself are guarded by i_lock acquired directly
+ * in inode_add_bytes() and inode_sub_bytes().
+ *
+ * The spinlock ordering is hence: dq_data_lock > dq_list_lock > i_lock
  *
  * Note that some things (eg. sb pointer, type, id) doesn't change during
  * the life of the dquot structure and so needn't to be protected by a lock
+ *
+ * Any operation working on dquots via inode pointers must hold dqptr_sem.  If
+ * operation is just reading pointers from inode (or not using them at all) the
+ * read lock is enough. If pointers are altered function must hold write lock.
+ * If operation is holding reference to dquot in other way (e.g. quotactl ops)
+ * it must be guarded by dqonoff_sem.
+ * This locking assures that:
+ *   a) update/access to dquot pointers in inode is serialized
+ *   b) everyone is guarded against invalidate_dquots()
+ *
+ * Each dquot has its dq_lock semaphore. Locked dquots might not be referenced
+ * from inodes (dquot_alloc_space() and such don't check the dq_lock).
+ * Currently dquot is locked only when it is being read to memory (or space for
+ * it is being allocated) on the first dqget() and when it is being released on
+ * the last dqput(). The allocation and release oparations are serialized by
+ * the dq_lock and by checking the use count in dquot_release().  Write
+ * operations on dquots don't hold dq_lock as they copy data under dq_data_lock
+ * spinlock to internal buffers before writing.
+ *
+ * Lock ordering (including journal_lock) is following:
+ *  dqonoff_sem > journal_lock > dqptr_sem > dquot->dq_lock > dqio_sem
  */
+
 spinlock_t dq_list_lock = SPIN_LOCK_UNLOCKED;
 spinlock_t dq_data_lock = SPIN_LOCK_UNLOCKED;
 
@@ -169,23 +192,6 @@ static void put_quota_format(struct quot
  * mechanism to locate a specific dquot.
  */
 
-/*
- * Note that any operation which operates on dquot data (ie. dq_dqb) must
- * hold dq_data_lock.
- *
- * Any operation working with dquots must hold dqptr_sem. If operation is
- * just reading pointers from inodes than read lock is enough. If pointers
- * are altered function must hold write lock.
- *
- * Locked dquots might not be referenced in inodes. Currently dquot it locked
- * only once in its existence - when it's being read to memory on first dqget()
- * and at that time it can't be referenced from inode. Write operations on
- * dquots don't hold dquot lock as they copy data to internal buffers before
- * writing anyway and copying as well as any data update should be atomic. Also
- * nobody can change used entries in dquot structure as this is done only when
- * quota is destroyed and invalidate_dquots() is called only when dq_count == 0.
- */
-
 static LIST_HEAD(inuse_list);
 static LIST_HEAD(free_dquots);
 static struct list_head dquot_hash[NR_DQHASH];
@@ -254,6 +260,9 @@ static inline void remove_inuse(struct d
 	dqstats.allocated_dquots--;
 	list_del(&dquot->dq_inuse);
 }
+/*
+ * End of list functions needing dq_list_lock
+ */
 
 static void wait_on_dquot(struct dquot *dquot)
 {
@@ -261,34 +270,98 @@ static void wait_on_dquot(struct dquot *
 	up(&dquot->dq_lock);
 }
 
-static int read_dqblk(struct dquot *dquot)
+#define mark_dquot_dirty(dquot) ((dquot)->dq_sb->dq_op->mark_dirty(dquot))
+
+/* No locks needed here as ANY_DQUOT_DIRTY is used just by sync and so the
+ * worst what can happen is that dquot is not written by concurrent sync... */
+int dquot_mark_dquot_dirty(struct dquot *dquot)
+{
+	set_bit(DQ_MOD_B, &(dquot)->dq_flags);
+	set_bit(DQF_ANY_DQUOT_DIRTY_B, &(sb_dqopt((dquot)->dq_sb)->
+		info[(dquot)->dq_type].dqi_flags));
+	return 0;
+}
+
+void mark_info_dirty(struct super_block *sb, int type)
 {
-	int ret;
+	set_bit(DQF_INFO_DIRTY_B, &sb_dqopt(sb)->info[type].dqi_flags);
+}
+EXPORT_SYMBOL(mark_info_dirty);
+
+/*
+ *	Read dquot from disk and alloc space for it
+ */
+
+int dquot_acquire(struct dquot *dquot)
+{
+	int ret = 0;
 	struct quota_info *dqopt = sb_dqopt(dquot->dq_sb);
 
 	down(&dquot->dq_lock);
 	down(&dqopt->dqio_sem);
-	ret = dqopt->ops[dquot->dq_type]->read_dqblk(dquot);
+	if (!test_bit(DQ_READ_B, &dquot->dq_flags))
+		ret = dqopt->ops[dquot->dq_type]->read_dqblk(dquot);
+	if (ret < 0)
+		goto out_iolock;
+	set_bit(DQ_READ_B, &dquot->dq_flags);
+	/* Instantiate dquot if needed */
+	if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags) && !dquot->dq_off) {
+		ret = dqopt->ops[dquot->dq_type]->commit_dqblk(dquot);
+		if (ret < 0)
+			goto out_iolock;
+	}
+	set_bit(DQ_ACTIVE_B, &dquot->dq_flags);
+out_iolock:
 	up(&dqopt->dqio_sem);
 	up(&dquot->dq_lock);
 	return ret;
 }
 
-static int commit_dqblk(struct dquot *dquot)
+/*
+ *	Write dquot to disk
+ */
+int dquot_commit(struct dquot *dquot)
 {
-	int ret;
+	int ret = 0;
 	struct quota_info *dqopt = sb_dqopt(dquot->dq_sb);
 
 	down(&dqopt->dqio_sem);
-	ret = dqopt->ops[dquot->dq_type]->commit_dqblk(dquot);
+	clear_bit(DQ_MOD_B, &dquot->dq_flags);
+	/* Inactive dquot can be only if there was error during read/init
+	 * => we have better not writing it */
+	if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags))
+		ret = dqopt->ops[dquot->dq_type]->commit_dqblk(dquot);
 	up(&dqopt->dqio_sem);
+	if (info_dirty(&dqopt->info[dquot->dq_type]))
+		dquot->dq_sb->dq_op->write_info(dquot->dq_sb, dquot->dq_type);
+	return ret;
+}
+
+/*
+ *	Release dquot
+ */
+int dquot_release(struct dquot *dquot)
+{
+	int ret = 0;
+	struct quota_info *dqopt = sb_dqopt(dquot->dq_sb);
+
+	down(&dquot->dq_lock);
+	/* Check whether we are not racing with some other dqget() */
+	if (atomic_read(&dquot->dq_count) > 1)
+		goto out_dqlock;
+	down(&dqopt->dqio_sem);
+	ret = dqopt->ops[dquot->dq_type]->release_dqblk(dquot);
+	clear_bit(DQ_ACTIVE_B, &dquot->dq_flags);
+	up(&dqopt->dqio_sem);
+out_dqlock:
+	up(&dquot->dq_lock);
 	return ret;
 }
 
 /* Invalidate all dquots on the list. Note that this function is called after
- * quota is disabled so no new quota might be created. Because we hold dqptr_sem
- * for writing and pointers were already removed from inodes we actually know that
- * no quota for this sb+type should be held. */
+ * quota is disabled and pointers from inodes removed so there cannot be new
+ * quota users. Also because we hold dqonoff_sem there can be no quota users
+ * for this sb+type at all. */
 static void invalidate_dquots(struct super_block *sb, int type)
 {
 	struct dquot *dquot;
@@ -302,12 +375,11 @@ static void invalidate_dquots(struct sup
 			continue;
 		if (dquot->dq_type != type)
 			continue;
-#ifdef __DQUOT_PARANOIA	
-		/* There should be no users of quota - we hold dqptr_sem for writing */
+#ifdef __DQUOT_PARANOIA
 		if (atomic_read(&dquot->dq_count))
 			BUG();
 #endif
-		/* Quota now have no users and it has been written on last dqput() */
+		/* Quota now has no users and it has been written on last dqput() */
 		remove_dquot_hash(dquot);
 		remove_free_dquot(dquot);
 		remove_inuse(dquot);
@@ -316,20 +388,22 @@ static void invalidate_dquots(struct sup
 	spin_unlock(&dq_list_lock);
 }
 
-static int vfs_quota_sync(struct super_block *sb, int type)
+int vfs_quota_sync(struct super_block *sb, int type)
 {
 	struct list_head *head;
 	struct dquot *dquot;
 	struct quota_info *dqopt = sb_dqopt(sb);
 	int cnt;
 
-	down_read(&dqopt->dqptr_sem);
+	down(&dqopt->dqonoff_sem);
 restart:
 	/* At this point any dirty dquot will definitely be written so we can clear
 	   dirty flag from info */
+	spin_lock(&dq_data_lock);
 	for (cnt = 0; cnt < MAXQUOTAS; cnt++)
 		if ((cnt == type || type == -1) && sb_has_quota_enabled(sb, cnt))
 			clear_bit(DQF_ANY_DQUOT_DIRTY_B, &dqopt->info[cnt].dqi_flags);
+	spin_unlock(&dq_data_lock);
 	spin_lock(&dq_list_lock);
 	list_for_each(head, &inuse_list) {
 		dquot = list_entry(head, struct dquot, dq_inuse);
@@ -337,10 +411,13 @@ restart:
 			continue;
                 if (type != -1 && dquot->dq_type != type)
 			continue;
-		if (!dquot->dq_sb)	/* Invalidated? */
-			continue;
 		if (!dquot_dirty(dquot))
 			continue;
+		/* Dirty and inactive can be only bad dquot... */
+		if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags))
+			continue;
+		/* Now we have active dquot from which someone is holding reference so we
+		 * can safely just increase use count */
 		atomic_inc(&dquot->dq_count);
 		dqstats.lookups++;
 		spin_unlock(&dq_list_lock);
@@ -351,15 +428,13 @@ restart:
 	spin_unlock(&dq_list_lock);
 
 	for (cnt = 0; cnt < MAXQUOTAS; cnt++)
-		if ((cnt == type || type == -1) && sb_has_quota_enabled(sb, cnt) && info_dirty(&dqopt->info[cnt])) {
-			down(&dqopt->dqio_sem);
-			dqopt->ops[cnt]->write_file_info(sb, cnt);
-			up(&dqopt->dqio_sem);
-		}
+		if ((cnt == type || type == -1) && sb_has_quota_enabled(sb, cnt)
+			&& info_dirty(&dqopt->info[cnt]))
+			sb->dq_op->write_info(sb, cnt);
 	spin_lock(&dq_list_lock);
 	dqstats.syncs++;
 	spin_unlock(&dq_list_lock);
-	up_read(&dqopt->dqptr_sem);
+	up(&dqopt->dqonoff_sem);
 
 	return 0;
 }
@@ -402,7 +477,7 @@ static int shrink_dqcache_memory(int nr,
 /*
  * Put reference to dquot
  * NOTE: If you change this function please check whether dqput_blocks() works right...
- * MUST be called with dqptr_sem held
+ * MUST be called with either dqptr_sem or dqonoff_sem held
  */
 static void dqput(struct dquot *dquot)
 {
@@ -430,11 +505,20 @@ we_slept:
 		spin_unlock(&dq_list_lock);
 		return;
 	}
-	if (dquot_dirty(dquot)) {
+	/* Need to release dquot? */
+	if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags) && dquot_dirty(dquot)) {
 		spin_unlock(&dq_list_lock);
+		/* Commit dquot before releasing */
 		dquot->dq_sb->dq_op->write_dquot(dquot);
 		goto we_slept;
 	}
+	/* Clear flag in case dquot was inactive (something bad happened) */
+	clear_bit(DQ_MOD_B, &dquot->dq_flags);
+	if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) {
+		spin_unlock(&dq_list_lock);
+		dquot_release(dquot);
+		goto we_slept;
+	}
 	atomic_dec(&dquot->dq_count);
 #ifdef __DQUOT_PARANOIA
 	/* sanity check */
@@ -467,7 +551,7 @@ static struct dquot *get_empty_dquot(str
 
 /*
  * Get reference to dquot
- * MUST be called with dqptr_sem held
+ * MUST be called with either dqptr_sem or dqonoff_sem held
  */
 static struct dquot *dqget(struct super_block *sb, unsigned int id, int type)
 {
@@ -493,7 +577,6 @@ we_slept:
 		insert_dquot_hash(dquot);
 		dqstats.lookups++;
 		spin_unlock(&dq_list_lock);
-		read_dqblk(dquot);
 	} else {
 		if (!atomic_read(&dquot->dq_count))
 			remove_free_dquot(dquot);
@@ -501,11 +584,17 @@ we_slept:
 		dqstats.cache_hits++;
 		dqstats.lookups++;
 		spin_unlock(&dq_list_lock);
-		wait_on_dquot(dquot);
 		if (empty)
 			kmem_cache_free(dquot_cachep, empty);
 	}
-
+	/* Wait for dq_lock - after this we know that either dquot_release() is already
+	 * finished or it will be canceled due to dq_count > 1 test */
+	wait_on_dquot(dquot);
+	/* Read the dquot and instantiate it (everything done only if needed) */
+	if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags) && dquot_acquire(dquot) < 0) {
+		dqput(dquot);
+		return NODQUOT;
+	}
 #ifdef __DQUOT_PARANOIA
 	if (!dquot->dq_sb)	/* Has somebody invalidated entry under us? */
 		BUG();
@@ -528,7 +617,7 @@ static int dqinit_needed(struct inode *i
 	return 0;
 }
 
-/* This routine is guarded by dqptr_sem semaphore */
+/* This routine is guarded by dqonoff_sem semaphore */
 static void add_dquot_ref(struct super_block *sb, int type)
 {
 	struct list_head *p;
@@ -539,12 +628,10 @@ restart:
 		struct file *filp = list_entry(p, struct file, f_list);
 		struct inode *inode = filp->f_dentry->d_inode;
 		if (filp->f_mode & FMODE_WRITE && dqinit_needed(inode, type)) {
-			struct vfsmount *mnt = mntget(filp->f_vfsmnt);
 			struct dentry *dentry = dget(filp->f_dentry);
 			file_list_unlock();
 			sb->dq_op->initialize(inode, type);
 			dput(dentry);
-			mntput(mnt);
 			/* As we may have blocked we had better restart... */
 			goto restart;
 		}
@@ -594,7 +681,7 @@ put_it:
 
 /* Free list of dquots - called from inode.c */
 /* dquots are removed from inodes, no new references can be got so we are the only ones holding reference */
-void put_dquot_list(struct list_head *tofree_head)
+static void put_dquot_list(struct list_head *tofree_head)
 {
 	struct list_head *act_head;
 	struct dquot *dquot;
@@ -609,16 +696,28 @@ void put_dquot_list(struct list_head *to
 	}
 }
 
+/* Function in inode.c - remove pointers to dquots in icache */
+extern void remove_dquot_ref(struct super_block *, int, struct list_head *);
+
+/* Gather all references from inodes and drop them */
+static void drop_dquot_ref(struct super_block *sb, int type)
+{
+	LIST_HEAD(tofree_head);
+
+	down_write(&sb_dqopt(sb)->dqptr_sem);
+	remove_dquot_ref(sb, type, &tofree_head);
+	up_write(&sb_dqopt(sb)->dqptr_sem);
+	put_dquot_list(&tofree_head);
+}
+
 static inline void dquot_incr_inodes(struct dquot *dquot, unsigned long number)
 {
 	dquot->dq_dqb.dqb_curinodes += number;
-	mark_dquot_dirty(dquot);
 }
 
 static inline void dquot_incr_space(struct dquot *dquot, qsize_t number)
 {
 	dquot->dq_dqb.dqb_curspace += number;
-	mark_dquot_dirty(dquot);
 }
 
 static inline void dquot_decr_inodes(struct dquot *dquot, unsigned long number)
@@ -630,7 +729,6 @@ static inline void dquot_decr_inodes(str
 	if (dquot->dq_dqb.dqb_curinodes < dquot->dq_dqb.dqb_isoftlimit)
 		dquot->dq_dqb.dqb_itime = (time_t) 0;
 	clear_bit(DQ_INODES_B, &dquot->dq_flags);
-	mark_dquot_dirty(dquot);
 }
 
 static inline void dquot_decr_space(struct dquot *dquot, qsize_t number)
@@ -642,7 +740,6 @@ static inline void dquot_decr_space(stru
 	if (toqb(dquot->dq_dqb.dqb_curspace) < dquot->dq_dqb.dqb_bsoftlimit)
 		dquot->dq_dqb.dqb_btime = (time_t) 0;
 	clear_bit(DQ_BLKS_B, &dquot->dq_flags);
-	mark_dquot_dirty(dquot);
 }
 
 static inline int need_print_warning(struct dquot *dquot)
@@ -674,12 +771,12 @@ static void print_warning(struct dquot *
 
 	if (!need_print_warning(dquot) || (flag && test_and_set_bit(flag, &dquot->dq_flags)))
 		return;
-	tty_write_message(current->tty, dquot->dq_sb->s_id);
+	tty_write_message(current->signal->tty, dquot->dq_sb->s_id);
 	if (warntype == ISOFTWARN || warntype == BSOFTWARN)
-		tty_write_message(current->tty, ": warning, ");
+		tty_write_message(current->signal->tty, ": warning, ");
 	else
-		tty_write_message(current->tty, ": write failed, ");
-	tty_write_message(current->tty, quotatypes[dquot->dq_type]);
+		tty_write_message(current->signal->tty, ": write failed, ");
+	tty_write_message(current->signal->tty, quotatypes[dquot->dq_type]);
 	switch (warntype) {
 		case IHARDWARN:
 			msg = " file limit reached.\n";
@@ -700,7 +797,7 @@ static void print_warning(struct dquot *
 			msg = " block quota exceeded.\n";
 			break;
 	}
-	tty_write_message(current->tty, msg);
+	tty_write_message(current->signal->tty, msg);
 }
 
 static inline void flush_warnings(struct dquot **dquots, char *warntype)
@@ -795,22 +892,22 @@ static int check_bdq(struct dquot *dquot
 }
 
 /*
- * Externally referenced functions through dquot_operations in inode.
- *
- * Note: this is a blocking operation.
+ *	Initialize quota pointers in inode
+ *	Transaction must be started at entry
  */
-void dquot_initialize(struct inode *inode, int type)
+int dquot_initialize(struct inode *inode, int type)
 {
 	unsigned int id = 0;
-	int cnt;
+	int cnt, ret = 0;
 
+	/* First test before acquiring semaphore - solves deadlocks when we
+         * re-enter the quota code and are already holding the semaphore */
+	if (IS_NOQUOTA(inode))
+		return 0;
 	down_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
 	/* Having dqptr_sem we know NOQUOTA flags can't be altered... */
-	if (IS_NOQUOTA(inode)) {
-		up_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
-		return;
-	}
-	/* Build list of quotas to initialize... */
+	if (IS_NOQUOTA(inode))
+		goto out_err;
 	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
 		if (type != -1 && cnt != type)
 			continue;
@@ -828,54 +925,39 @@ void dquot_initialize(struct inode *inod
 				inode->i_flags |= S_QUOTA;
 		}
 	}
+out_err:
 	up_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
+	return ret;
 }
 
 /*
- *	Remove references to quota from inode
- *	This function needs dqptr_sem for writing
+ * 	Release all quotas referenced by inode
+ *	Transaction must be started at an entry
  */
-static void dquot_drop_iupdate(struct inode *inode, struct dquot **to_drop)
+int dquot_drop(struct inode *inode)
 {
 	int cnt;
 
+	down_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
 	inode->i_flags &= ~S_QUOTA;
 	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
-		to_drop[cnt] = inode->i_dquot[cnt];
-		inode->i_dquot[cnt] = NODQUOT;
+		if (inode->i_dquot[cnt] != NODQUOT) {
+			dqput(inode->i_dquot[cnt]);
+			inode->i_dquot[cnt] = NODQUOT;
+		}
 	}
-}
-
-/*
- * 	Release all quotas referenced by inode
- */
-void dquot_drop(struct inode *inode)
-{
-	struct dquot *to_drop[MAXQUOTAS];
-	int cnt;
-
-	down_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
-	dquot_drop_iupdate(inode, to_drop);
 	up_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
-	for (cnt = 0; cnt < MAXQUOTAS; cnt++)
-		if (to_drop[cnt] != NODQUOT)
-			dqput(to_drop[cnt]);
+	return 0;
 }
 
 /*
- *	Release all quotas referenced by inode.
- *	This function assumes dqptr_sem for writing
+ * Following four functions update i_blocks+i_bytes fields and
+ * quota information (together with appropriate checks)
+ * NOTE: We absolutely rely on the fact that caller dirties
+ * the inode (usually macros in quotaops.h care about this) and
+ * holds a handle for the current transaction so that dquot write and
+ * inode write go into the same transaction.
  */
-void dquot_drop_nolock(struct inode *inode)
-{
-	struct dquot *to_drop[MAXQUOTAS];
-	int cnt;
-
-	dquot_drop_iupdate(inode, to_drop);
-	for (cnt = 0; cnt < MAXQUOTAS; cnt++)
-		if (to_drop[cnt] != NODQUOT)
-			dqput(to_drop[cnt]);
-}
 
 /*
  * This operation can block, but only after everything is updated
@@ -885,13 +967,22 @@ int dquot_alloc_space(struct inode *inod
 	int cnt, ret = NO_QUOTA;
 	char warntype[MAXQUOTAS];
 
+	/* First test before acquiring semaphore - solves deadlocks when we
+         * re-enter the quota code and are already holding the semaphore */
+	if (IS_NOQUOTA(inode)) {
+out_add:
+		inode_add_bytes(inode, number);
+		return QUOTA_OK;
+	}
 	for (cnt = 0; cnt < MAXQUOTAS; cnt++)
 		warntype[cnt] = NOWARN;
 
 	down_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
+	if (IS_NOQUOTA(inode)) {	/* Now we can do reliable test... */
+		up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
+		goto out_add;
+	}
 	spin_lock(&dq_data_lock);
-	if (IS_NOQUOTA(inode))
-		goto add_bytes;
 	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
 		if (inode->i_dquot[cnt] == NODQUOT)
 			continue;
@@ -903,11 +994,15 @@ int dquot_alloc_space(struct inode *inod
 			continue;
 		dquot_incr_space(inode->i_dquot[cnt], number);
 	}
-add_bytes:
 	inode_add_bytes(inode, number);
 	ret = QUOTA_OK;
 warn_put_all:
 	spin_unlock(&dq_data_lock);
+	if (ret == QUOTA_OK)
+		/* Dirtify all the dquots - this can block when journalling */
+		for (cnt = 0; cnt < MAXQUOTAS; cnt++)
+			if (inode->i_dquot[cnt])
+				mark_dquot_dirty(inode->i_dquot[cnt]);
 	flush_warnings(inode->i_dquot, warntype);
 	up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
 	return ret;
@@ -921,6 +1016,10 @@ int dquot_alloc_inode(const struct inode
 	int cnt, ret = NO_QUOTA;
 	char warntype[MAXQUOTAS];
 
+	/* First test before acquiring semaphore - solves deadlocks when we
+         * re-enter the quota code and are already holding the semaphore */
+	if (IS_NOQUOTA(inode))
+		return QUOTA_OK;
 	for (cnt = 0; cnt < MAXQUOTAS; cnt++)
 		warntype[cnt] = NOWARN;
 	down_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
@@ -944,6 +1043,11 @@ int dquot_alloc_inode(const struct inode
 	ret = QUOTA_OK;
 warn_put_all:
 	spin_unlock(&dq_data_lock);
+	if (ret == QUOTA_OK)
+		/* Dirtify all the dquots - this can block when journalling */
+		for (cnt = 0; cnt < MAXQUOTAS; cnt++)
+			if (inode->i_dquot[cnt])
+				mark_dquot_dirty(inode->i_dquot[cnt]);
 	flush_warnings((struct dquot **)inode->i_dquot, warntype);
 	up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
 	return ret;
@@ -952,36 +1056,55 @@ warn_put_all:
 /*
  * This is a non-blocking operation.
  */
-void dquot_free_space(struct inode *inode, qsize_t number)
+int dquot_free_space(struct inode *inode, qsize_t number)
 {
 	unsigned int cnt;
 
+	/* First test before acquiring semaphore - solves deadlocks when we
+         * re-enter the quota code and are already holding the semaphore */
+	if (IS_NOQUOTA(inode)) {
+out_sub:
+		inode_sub_bytes(inode, number);
+		return QUOTA_OK;
+	}
 	down_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
+	/* Now recheck reliably when holding dqptr_sem */
+	if (IS_NOQUOTA(inode)) {
+		up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
+		goto out_sub;
+	}
 	spin_lock(&dq_data_lock);
-	if (IS_NOQUOTA(inode))
-		goto sub_bytes;
 	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
 		if (inode->i_dquot[cnt] == NODQUOT)
 			continue;
 		dquot_decr_space(inode->i_dquot[cnt], number);
 	}
-sub_bytes:
 	inode_sub_bytes(inode, number);
 	spin_unlock(&dq_data_lock);
+	/* Dirtify all the dquots - this can block when journalling */
+	for (cnt = 0; cnt < MAXQUOTAS; cnt++)
+		if (inode->i_dquot[cnt])
+			mark_dquot_dirty(inode->i_dquot[cnt]);
 	up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
+	return QUOTA_OK;
 }
 
 /*
  * This is a non-blocking operation.
  */
-void dquot_free_inode(const struct inode *inode, unsigned long number)
+int dquot_free_inode(const struct inode *inode, unsigned long number)
 {
 	unsigned int cnt;
 
+	/* First test before acquiring semaphore - solves deadlocks when we
+         * re-enter the quota code and are already holding the semaphore */
+	if (IS_NOQUOTA(inode))
+		return QUOTA_OK;
 	down_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
+	/* Now recheck reliably when holding dqptr_sem */
 	if (IS_NOQUOTA(inode)) {
 		up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
-		return;
+		return QUOTA_OK;
 	}
 	spin_lock(&dq_data_lock);
 	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
@@ -990,7 +1113,12 @@ void dquot_free_inode(const struct inode
 		dquot_decr_inodes(inode->i_dquot[cnt], number);
 	}
 	spin_unlock(&dq_data_lock);
+	/* Dirtify all the dquots - this can block when journalling */
+	for (cnt = 0; cnt < MAXQUOTAS; cnt++)
+		if (inode->i_dquot[cnt])
+			mark_dquot_dirty(inode->i_dquot[cnt]);
 	up_read(&sb_dqopt(inode->i_sb)->dqptr_sem);
+	return QUOTA_OK;
 }
 
 /*
@@ -1007,17 +1135,24 @@ int dquot_transfer(struct inode *inode, 
 	    chgid = (iattr->ia_valid & ATTR_GID) && inode->i_gid != iattr->ia_gid;
 	char warntype[MAXQUOTAS];
 
+	/* First test before acquiring semaphore - solves deadlocks when we
+         * re-enter the quota code and are already holding the semaphore */
+	if (IS_NOQUOTA(inode))
+		return QUOTA_OK;
 	/* Clear the arrays */
 	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
 		transfer_to[cnt] = transfer_from[cnt] = NODQUOT;
 		warntype[cnt] = NOWARN;
 	}
 	down_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
+	/* Now recheck reliably when holding dqptr_sem */
 	if (IS_NOQUOTA(inode)) {	/* File without quota accounting? */
 		up_write(&sb_dqopt(inode->i_sb)->dqptr_sem);
 		return QUOTA_OK;
 	}
-	/* First build the transfer_to list - here we can block on reading of dquots... */
+	/* First build the transfer_to list - here we can block on
+	 * reading/instantiating of dquots.  We know that the transaction for
+	 * us was already started so we don't violate lock ranking here */
 	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
 		switch (cnt) {
 			case USRQUOTA:
@@ -1065,6 +1200,13 @@ int dquot_transfer(struct inode *inode, 
 	ret = QUOTA_OK;
 warn_put_all:
 	spin_unlock(&dq_data_lock);
+	/* Dirtify all the dquots - this can block when journalling */
+	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
+		if (transfer_from[cnt])
+			mark_dquot_dirty(transfer_from[cnt]);
+		if (transfer_to[cnt])
+			mark_dquot_dirty(transfer_to[cnt]);
+	}
 	flush_warnings(transfer_to, warntype);
 	
 	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
@@ -1078,25 +1220,35 @@ warn_put_all:
 }
 
 /*
+ * Write info of quota file to disk
+ */
+int dquot_commit_info(struct super_block *sb, int type)
+{
+	int ret;
+	struct quota_info *dqopt = sb_dqopt(sb);
+
+	down(&dqopt->dqio_sem);
+	ret = dqopt->ops[type]->write_file_info(sb, type);
+	up(&dqopt->dqio_sem);
+	return ret;
+}
+
+/*
  * Definitions of diskquota operations.
  */
 struct dquot_operations dquot_operations = {
-	.initialize	= dquot_initialize,		/* mandatory */
-	.drop		= dquot_drop,			/* mandatory */
+	.initialize	= dquot_initialize,
+	.drop		= dquot_drop,
 	.alloc_space	= dquot_alloc_space,
 	.alloc_inode	= dquot_alloc_inode,
 	.free_space	= dquot_free_space,
 	.free_inode	= dquot_free_inode,
 	.transfer	= dquot_transfer,
-	.write_dquot	= commit_dqblk
+	.write_dquot	= dquot_commit,
+	.mark_dirty	= dquot_mark_dquot_dirty,
+	.write_info	= dquot_commit_info
 };
 
-/* Function used by filesystems for initializing the dquot_operations structure */
-void init_dquot_operations(struct dquot_operations *fsdqops)
-{
-	memcpy(fsdqops, &dquot_operations, sizeof(dquot_operations));
-}
-
 static inline void set_enable_flags(struct quota_info *dqopt, int type)
 {
 	switch (type) {
@@ -1121,9 +1273,6 @@ static inline void reset_enable_flags(st
 	}
 }
 
-/* Function in inode.c - remove pointers to dquots in icache */
-extern void remove_dquot_ref(struct super_block *, int);
-
 /*
  * Turn quota off on a device. type == -1 ==> quotaoff for all types (umount)
  */
@@ -1137,7 +1286,6 @@ int vfs_quota_off(struct super_block *sb
 
 	/* We need to serialize quota_off() for device */
 	down(&dqopt->dqonoff_sem);
-	down_write(&dqopt->dqptr_sem);
 	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
 		if (type != -1 && cnt != type)
 			continue;
@@ -1146,63 +1294,56 @@ int vfs_quota_off(struct super_block *sb
 		reset_enable_flags(dqopt, cnt);
 
 		/* Note: these are blocking operations */
-		remove_dquot_ref(sb, cnt);
+		drop_dquot_ref(sb, cnt);
 		invalidate_dquots(sb, cnt);
 		/*
 		 * Now all dquots should be invalidated, all writes done so we should be only
 		 * users of the info. No locks needed.
 		 */
-		if (info_dirty(&dqopt->info[cnt])) {
-			down(&dqopt->dqio_sem);
-			dqopt->ops[cnt]->write_file_info(sb, cnt);
-			up(&dqopt->dqio_sem);
-		}
+		if (info_dirty(&dqopt->info[cnt]))
+			sb->dq_op->write_info(sb, cnt);
 		if (dqopt->ops[cnt]->free_file_info)
 			dqopt->ops[cnt]->free_file_info(sb, cnt);
 		put_quota_format(dqopt->info[cnt].dqi_format);
 
 		fput(dqopt->files[cnt]);
-		dqopt->files[cnt] = (struct file *)NULL;
+		dqopt->files[cnt] = NULL;
 		dqopt->info[cnt].dqi_flags = 0;
 		dqopt->info[cnt].dqi_igrace = 0;
 		dqopt->info[cnt].dqi_bgrace = 0;
 		dqopt->ops[cnt] = NULL;
 	}
-	up_write(&dqopt->dqptr_sem);
 	up(&dqopt->dqonoff_sem);
 out:
 	return 0;
 }
 
-int vfs_quota_on(struct super_block *sb, int type, int format_id, char *path)
+/*
+ *	Turn quotas on on a device
+ */
+
+/* Helper function when we already have file open */
+static int vfs_quota_on_file(struct file *f, int type, int format_id)
 {
-	struct file *f;
+	struct quota_format_type *fmt = find_quota_format(format_id);
 	struct inode *inode;
+	struct super_block *sb = f->f_dentry->d_sb;
 	struct quota_info *dqopt = sb_dqopt(sb);
-	struct quota_format_type *fmt = find_quota_format(format_id);
-	int error;
+	struct dquot *to_drop[MAXQUOTAS];
+	int error, cnt;
 	unsigned int oldflags;
 
 	if (!fmt)
 		return -ESRCH;
-	f = filp_open(path, O_RDWR, 0600);
-	if (IS_ERR(f)) {
-		error = PTR_ERR(f);
-		goto out_fmt;
-	}
 	error = -EIO;
 	if (!f->f_op || !f->f_op->read || !f->f_op->write)
-		goto out_f;
-	error = security_quota_on(f);
-	if (error)
-		goto out_f;
+		goto out_fmt;
 	inode = f->f_dentry->d_inode;
 	error = -EACCES;
 	if (!S_ISREG(inode->i_mode))
-		goto out_f;
+		goto out_fmt;
 
 	down(&dqopt->dqonoff_sem);
-	down_write(&dqopt->dqptr_sem);
 	if (sb_has_quota_enabled(sb, type)) {
 		error = -EBUSY;
 		goto out_lock;
@@ -1213,8 +1354,20 @@ int vfs_quota_on(struct super_block *sb,
 	if (!fmt->qf_ops->check_quota_file(sb, type))
 		goto out_file_init;
 	/* We don't want quota and atime on quota files (deadlocks possible) */
-	dquot_drop_nolock(inode);
+	down_write(&dqopt->dqptr_sem);
 	inode->i_flags |= S_NOQUOTA | S_NOATIME;
+	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
+		to_drop[cnt] = inode->i_dquot[cnt];
+		inode->i_dquot[cnt] = NODQUOT;
+	}
+	inode->i_flags &= ~S_QUOTA;
+	up_write(&dqopt->dqptr_sem);
+	/* We must put dquots outside of dqptr_sem because we may need to
+	 * start transaction for dquot_release() */
+	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
+		if (to_drop[cnt])
+			dqput(to_drop[cnt]);
+	}
 
 	dqopt->ops[type] = fmt->qf_ops;
 	dqopt->info[type].dqi_format = fmt;
@@ -1225,7 +1378,6 @@ int vfs_quota_on(struct super_block *sb,
 	}
 	up(&dqopt->dqio_sem);
 	set_enable_flags(dqopt, type);
-	up_write(&dqopt->dqptr_sem);
 
 	add_dquot_ref(sb, type);
 	up(&dqopt->dqonoff_sem);
@@ -1238,14 +1390,58 @@ out_file_init:
 out_lock:
 	up_write(&dqopt->dqptr_sem);
 	up(&dqopt->dqonoff_sem);
-out_f:
-	filp_close(f, NULL);
 out_fmt:
 	put_quota_format(fmt);
 
 	return error; 
 }
 
+/* Actual function called from quotactl() */
+int vfs_quota_on(struct super_block *sb, int type, int format_id, char *path)
+{
+	struct file *f;
+	int error;
+
+	f = filp_open(path, O_RDWR, 0600);
+	if (IS_ERR(f))
+		return PTR_ERR(f);
+	error = security_quota_on(f);
+	if (error)
+		goto out_f;
+	error = vfs_quota_on_file(f, type, format_id);
+	if (!error)
+		return 0;
+out_f:
+	filp_close(f, NULL);
+	return error;
+}
+
+/*
+ * Function used by filesystems when filp_open() would fail (filesystem is
+ * being mounted now). We will use a private file structure. Caller is
+ * responsible that it's IO functions won't need vfsmnt structure or
+ * some dentry tricks...
+ */
+int vfs_quota_on_mount(int type, int format_id, struct dentry *dentry)
+{
+	struct file *f;
+	int error;
+
+	dget(dentry);	/* Get a reference for struct file */
+	f = dentry_open(dentry, NULL, O_RDWR);
+	if (IS_ERR(f)) {
+		error = PTR_ERR(f);
+		goto out_dentry;
+	}
+	error = vfs_quota_on_file(f, type, format_id);
+	if (!error)
+		return 0;
+	fput(f);
+out_dentry:
+	dput(dentry);
+	return error;
+}
+
 /* Generic routine for getting common part of quota structure */
 static void do_get_dqblk(struct dquot *dquot, struct if_dqblk *di)
 {
@@ -1268,14 +1464,14 @@ int vfs_get_dqblk(struct super_block *sb
 {
 	struct dquot *dquot;
 
-	down_read(&sb_dqopt(sb)->dqptr_sem);
+	down(&sb_dqopt(sb)->dqonoff_sem);
 	if (!(dquot = dqget(sb, id, type))) {
-		up_read(&sb_dqopt(sb)->dqptr_sem);
+		up(&sb_dqopt(sb)->dqonoff_sem);
 		return -ESRCH;
 	}
 	do_get_dqblk(dquot, di);
 	dqput(dquot);
-	up_read(&sb_dqopt(sb)->dqptr_sem);
+	up(&sb_dqopt(sb)->dqonoff_sem);
 	return 0;
 }
 
@@ -1329,22 +1525,22 @@ static void do_set_dqblk(struct dquot *d
 		clear_bit(DQ_FAKE_B, &dquot->dq_flags);
 	else
 		set_bit(DQ_FAKE_B, &dquot->dq_flags);
-	mark_dquot_dirty(dquot);
 	spin_unlock(&dq_data_lock);
+	mark_dquot_dirty(dquot);
 }
 
 int vfs_set_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di)
 {
 	struct dquot *dquot;
 
-	down_read(&sb_dqopt(sb)->dqptr_sem);
+	down(&sb_dqopt(sb)->dqonoff_sem);
 	if (!(dquot = dqget(sb, id, type))) {
-		up_read(&sb_dqopt(sb)->dqptr_sem);
+		up(&sb_dqopt(sb)->dqonoff_sem);
 		return -ESRCH;
 	}
 	do_set_dqblk(dquot, di);
 	dqput(dquot);
-	up_read(&sb_dqopt(sb)->dqptr_sem);
+	up(&sb_dqopt(sb)->dqonoff_sem);
 	return 0;
 }
 
@@ -1353,9 +1549,9 @@ int vfs_get_dqinfo(struct super_block *s
 {
 	struct mem_dqinfo *mi;
   
-	down_read(&sb_dqopt(sb)->dqptr_sem);
+	down(&sb_dqopt(sb)->dqonoff_sem);
 	if (!sb_has_quota_enabled(sb, type)) {
-		up_read(&sb_dqopt(sb)->dqptr_sem);
+		up(&sb_dqopt(sb)->dqonoff_sem);
 		return -ESRCH;
 	}
 	mi = sb_dqopt(sb)->info + type;
@@ -1365,7 +1561,7 @@ int vfs_get_dqinfo(struct super_block *s
 	ii->dqi_flags = mi->dqi_flags & DQF_MASK;
 	ii->dqi_valid = IIF_ALL;
 	spin_unlock(&dq_data_lock);
-	up_read(&sb_dqopt(sb)->dqptr_sem);
+	up(&sb_dqopt(sb)->dqonoff_sem);
 	return 0;
 }
 
@@ -1374,9 +1570,9 @@ int vfs_set_dqinfo(struct super_block *s
 {
 	struct mem_dqinfo *mi;
 
-	down_read(&sb_dqopt(sb)->dqptr_sem);
+	down(&sb_dqopt(sb)->dqonoff_sem);
 	if (!sb_has_quota_enabled(sb, type)) {
-		up_read(&sb_dqopt(sb)->dqptr_sem);
+		up(&sb_dqopt(sb)->dqonoff_sem);
 		return -ESRCH;
 	}
 	mi = sb_dqopt(sb)->info + type;
@@ -1387,9 +1583,11 @@ int vfs_set_dqinfo(struct super_block *s
 		mi->dqi_igrace = ii->dqi_igrace;
 	if (ii->dqi_valid & IIF_FLAGS)
 		mi->dqi_flags = (mi->dqi_flags & ~DQF_MASK) | (ii->dqi_flags & DQF_MASK);
-	mark_info_dirty(mi);
 	spin_unlock(&dq_data_lock);
-	up_read(&sb_dqopt(sb)->dqptr_sem);
+	mark_info_dirty(sb, type);
+	/* Force write to disk */
+	sb->dq_op->write_info(sb, type);
+	up(&sb_dqopt(sb)->dqonoff_sem);
 	return 0;
 }
 
@@ -1520,4 +1718,21 @@ EXPORT_SYMBOL(unregister_quota_format);
 EXPORT_SYMBOL(dqstats);
 EXPORT_SYMBOL(dq_list_lock);
 EXPORT_SYMBOL(dq_data_lock);
-EXPORT_SYMBOL(init_dquot_operations);
+EXPORT_SYMBOL(vfs_quota_on);
+EXPORT_SYMBOL(vfs_quota_on_mount);
+EXPORT_SYMBOL(vfs_quota_off);
+EXPORT_SYMBOL(vfs_quota_sync);
+EXPORT_SYMBOL(vfs_get_dqinfo);
+EXPORT_SYMBOL(vfs_set_dqinfo);
+EXPORT_SYMBOL(vfs_get_dqblk);
+EXPORT_SYMBOL(vfs_set_dqblk);
+EXPORT_SYMBOL(dquot_commit);
+EXPORT_SYMBOL(dquot_commit_info);
+EXPORT_SYMBOL(dquot_mark_dquot_dirty);
+EXPORT_SYMBOL(dquot_initialize);
+EXPORT_SYMBOL(dquot_drop);
+EXPORT_SYMBOL(dquot_alloc_space);
+EXPORT_SYMBOL(dquot_alloc_inode);
+EXPORT_SYMBOL(dquot_free_space);
+EXPORT_SYMBOL(dquot_free_inode);
+EXPORT_SYMBOL(dquot_transfer);
--- diff/fs/efs/super.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/efs/super.c	2004-04-21 10:45:35.183354816 +0100
@@ -77,12 +77,19 @@ void efs_put_super(struct super_block *s
 	s->s_fs_info = NULL;
 }
 
+static int efs_remount(struct super_block *sb, int *flags, char *data)
+{
+	*flags |= MS_RDONLY;
+	return 0;
+}
+
 static struct super_operations efs_superblock_operations = {
 	.alloc_inode	= efs_alloc_inode,
 	.destroy_inode	= efs_destroy_inode,
 	.read_inode	= efs_read_inode,
 	.put_super	= efs_put_super,
 	.statfs		= efs_statfs,
+	.remount_fs	= efs_remount,
 };
 
 static int __init init_efs_fs(void) {
--- diff/fs/eventpoll.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/eventpoll.c	2004-04-21 10:45:35.184354664 +0100
@@ -59,10 +59,10 @@
  * we need a lock that will allow us to sleep. This lock is a
  * read-write semaphore (ep->sem). It is acquired on read during
  * the event transfer loop and in write during epoll_ctl(EPOLL_CTL_DEL)
- * and during eventpoll_release(). Then we also need a global
- * semaphore to serialize eventpoll_release() and ep_free().
+ * and during eventpoll_release_file(). Then we also need a global
+ * semaphore to serialize eventpoll_release_file() and ep_free().
  * This semaphore is acquired by ep_free() during the epoll file
- * cleanup path and it is also acquired by eventpoll_release()
+ * cleanup path and it is also acquired by eventpoll_release_file()
  * if a file has been pushed inside an epoll set and it is then
  * close()d without a previous call toepoll_ctl(EPOLL_CTL_DEL).
  * It is possible to drop the "ep->sem" and to use the global
@@ -329,7 +329,7 @@ static struct super_block *eventpollfs_g
 					      void *data);
 
 /*
- * This semaphore is used to serialize ep_free() and eventpoll_release().
+ * This semaphore is used to serialize ep_free() and eventpoll_release_file().
  */
 struct semaphore epsem;
 
@@ -887,10 +887,10 @@ static void ep_free(struct eventpoll *ep
 
 	/*
 	 * We need to lock this because we could be hit by
-	 * eventpoll_release() while we're freeing the "struct eventpoll".
+	 * eventpoll_release_file() while we're freeing the "struct eventpoll".
 	 * We do not need to hold "ep->sem" here because the epoll file
 	 * is on the way to be removed and no one has references to it
-	 * anymore. The only hit might come from eventpoll_release() but
+	 * anymore. The only hit might come from eventpoll_release_file() but
 	 * holding "epsem" is sufficent here.
 	 */
 	down(&epsem);
@@ -1552,7 +1552,7 @@ static int ep_events_transfer(struct eve
 
 	/*
 	 * We need to lock this because we could be hit by
-	 * eventpoll_release() and epoll_ctl(EPOLL_CTL_DEL).
+	 * eventpoll_release_file() and epoll_ctl(EPOLL_CTL_DEL).
 	 */
 	down_read(&ep->sem);
 
--- diff/fs/exec.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/exec.c	2004-04-21 10:45:35.185354512 +0100
@@ -45,7 +45,7 @@
 #include <linux/mount.h>
 #include <linux/security.h>
 #include <linux/syscalls.h>
-#include <linux/rmap-locking.h>
+#include <linux/rmap.h>
 
 #include <asm/uaccess.h>
 #include <asm/pgalloc.h>
@@ -342,7 +342,7 @@ out_sig:
 	return;
 }
 
-int setup_arg_pages(struct linux_binprm *bprm)
+int setup_arg_pages(struct linux_binprm *bprm, int executable_stack)
 {
 	unsigned long stack_base;
 	struct vm_area_struct *mpnt;
@@ -425,8 +425,16 @@ int setup_arg_pages(struct linux_binprm 
 		mpnt->vm_start = PAGE_MASK & (unsigned long) bprm->p;
 		mpnt->vm_end = STACK_TOP;
 #endif
-		mpnt->vm_page_prot = protection_map[VM_STACK_FLAGS & 0x7];
-		mpnt->vm_flags = VM_STACK_FLAGS;
+		/* Adjust stack execute permissions; explicitly enable
+		 * for EXSTACK_ENABLE_X, disable for EXSTACK_DISABLE_X
+		 * and leave alone (arch default) otherwise. */
+		if (unlikely(executable_stack == EXSTACK_ENABLE_X))
+			mpnt->vm_flags = VM_STACK_FLAGS |  VM_EXEC;
+		else if (executable_stack == EXSTACK_DISABLE_X)
+			mpnt->vm_flags = VM_STACK_FLAGS & ~VM_EXEC;
+		else
+			mpnt->vm_flags = VM_STACK_FLAGS;
+		mpnt->vm_page_prot = protection_map[mpnt->vm_flags & 0x7];
 		mpnt->vm_ops = NULL;
 		mpnt->vm_pgoff = 0;
 		mpnt->vm_file = NULL;
@@ -601,6 +609,13 @@ static inline int de_thread(struct task_
 		newsig->group_stop_count = 0;
 		newsig->curr_target = NULL;
 		init_sigpending(&newsig->shared_pending);
+		INIT_LIST_HEAD(&newsig->posix_timers);
+
+		newsig->tty = oldsig->tty;
+		newsig->pgrp = oldsig->pgrp;
+		newsig->session = oldsig->session;
+		newsig->leader = oldsig->leader;
+		newsig->tty_old_pgrp = oldsig->tty_old_pgrp;
 	}
 
 	if (thread_group_empty(current))
@@ -843,7 +858,6 @@ int flush_old_exec(struct linux_binprm *
 			
 	flush_signal_handlers(current, 0);
 	flush_old_files(current->files);
-	exit_itimers(current);
 
 	return 0;
 
--- diff/fs/ext2/fsync.c	2002-10-16 04:29:04.000000000 +0100
+++ source/fs/ext2/fsync.c	2004-04-21 10:45:35.185354512 +0100
@@ -32,17 +32,20 @@
  *	even pass file to fsync ?
  */
 
-int ext2_sync_file(struct file * file, struct dentry *dentry, int datasync)
+int ext2_sync_file(struct file *file, struct dentry *dentry, int datasync)
 {
 	struct inode *inode = dentry->d_inode;
 	int err;
-	
-	err  = sync_mapping_buffers(inode->i_mapping);
+	int ret;
+
+	ret = sync_mapping_buffers(inode->i_mapping);
 	if (!(inode->i_state & I_DIRTY))
-		return err;
+		return ret;
 	if (datasync && !(inode->i_state & I_DIRTY_DATASYNC))
-		return err;
-	
-	err |= ext2_sync_inode(inode);
-	return err ? -EIO : 0;
+		return ret;
+
+	err = ext2_sync_inode(inode);
+	if (ret == 0)
+		ret = err;
+	return ret;
 }
--- diff/fs/ext2/inode.c	2004-02-09 10:36:12.000000000 +0000
+++ source/fs/ext2/inode.c	2004-04-21 10:45:35.186354360 +0100
@@ -28,6 +28,7 @@
 #include <linux/pagemap.h>
 #include <linux/quotaops.h>
 #include <linux/module.h>
+#include <linux/writeback.h>
 #include <linux/buffer_head.h>
 #include <linux/mpage.h>
 #include "ext2.h"
@@ -654,7 +655,7 @@ ext2_get_blocks(struct inode *inode, sec
 	return ret;
 }
 
-static int
+static ssize_t
 ext2_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
 			loff_t offset, unsigned long nr_segs)
 {
@@ -1246,14 +1247,18 @@ static int ext2_update_inode(struct inod
 	return err;
 }
 
-void ext2_write_inode (struct inode * inode, int wait)
+void ext2_write_inode(struct inode *inode, int wait)
 {
-	ext2_update_inode (inode, wait);
+	ext2_update_inode(inode, wait);
 }
 
-int ext2_sync_inode (struct inode *inode)
+int ext2_sync_inode(struct inode *inode)
 {
-	return ext2_update_inode (inode, 1);
+	struct writeback_control wbc = {
+		.sync_mode = WB_SYNC_ALL,
+		.nr_to_write = 0,	/* sys_fsync did this */
+	};
+	return sync_inode(inode, &wbc);
 }
 
 int ext2_setattr(struct dentry *dentry, struct iattr *iattr)
@@ -1275,4 +1280,3 @@ int ext2_setattr(struct dentry *dentry, 
 		error = ext2_acl_chmod(inode);
 	return error;
 }
-
--- diff/fs/ext2/super.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/ext2/super.c	2004-04-21 10:45:35.187354208 +0100
@@ -564,8 +564,9 @@ static int ext2_fill_super(struct super_
 	struct ext2_sb_info * sbi;
 	struct ext2_super_block * es;
 	struct inode *root;
-	unsigned long block, sb_block = 1;
-	unsigned long logic_sb_block = get_sb_block(&data);
+	unsigned long block;
+	unsigned long sb_block = get_sb_block(&data);
+	unsigned long logic_sb_block;
 	unsigned long offset = 0;
 	unsigned long def_mount_opts;
 	int blocksize = BLOCK_SIZE;
@@ -598,6 +599,8 @@ static int ext2_fill_super(struct super_
 	if (blocksize != BLOCK_SIZE) {
 		logic_sb_block = (sb_block*BLOCK_SIZE) / blocksize;
 		offset = (sb_block*BLOCK_SIZE) % blocksize;
+	} else {
+		logic_sb_block = sb_block;
 	}
 
 	if (!(bh = sb_bread(sb, logic_sb_block))) {
--- diff/fs/ext3/fsync.c	2003-06-09 14:18:20.000000000 +0100
+++ source/fs/ext3/fsync.c	2004-04-21 10:45:35.187354208 +0100
@@ -24,6 +24,8 @@
 
 #include <linux/time.h>
 #include <linux/fs.h>
+#include <linux/sched.h>
+#include <linux/writeback.h>
 #include <linux/jbd.h>
 #include <linux/ext3_fs.h>
 #include <linux/ext3_jbd.h>
@@ -38,29 +40,28 @@
  *
  * What we do is just kick off a commit and wait on it.  This will snapshot the
  * inode to disk.
- *
- * Note that there is a serious optimisation we can make here: if the current
- * inode is not part of j_running_transaction or j_committing_transaction
- * then we have nothing to do.  That would require implementation of t_ilist,
- * which isn't too hard.
  */
 
 int ext3_sync_file(struct file * file, struct dentry *dentry, int datasync)
 {
 	struct inode *inode = dentry->d_inode;
+	int ret = 0;
 
 	J_ASSERT(ext3_journal_current_handle() == 0);
 
+	smp_mb();		/* prepare for lockless i_state read */
+	if (!(inode->i_state & I_DIRTY))
+		goto out;
+
 	/*
 	 * data=writeback:
 	 *  The caller's filemap_fdatawrite()/wait will sync the data.
-	 *  ext3_force_commit() will sync the metadata
+	 *  sync_inode() will sync the metadata
 	 *
 	 * data=ordered:
 	 *  The caller's filemap_fdatawrite() will write the data and
-	 *  ext3_force_commit() will wait on the buffers.  Then the caller's
-	 *  filemap_fdatawait() will wait on the pages (but all IO is complete)
-	 *  Not pretty, but it works.
+	 *  sync_inode() will write the inode if it is dirty.  Then the caller's
+	 *  filemap_fdatawait() will wait on the pages.
 	 *
 	 * data=journal:
 	 *  filemap_fdatawrite won't do anything (the buffers are clean).
@@ -70,5 +71,22 @@ int ext3_sync_file(struct file * file, s
 	 *  (they were dirtied by commit).  But that's OK - the blocks are
 	 *  safe in-journal, which is all fsync() needs to ensure.
 	 */
-	return ext3_force_commit(inode->i_sb);
+	if (ext3_should_journal_data(inode)) {
+		ret = ext3_force_commit(inode->i_sb);
+		goto out;
+	}
+
+	/*
+	 * The VFS has written the file data.  If the inode is unaltered
+	 * then we need not start a commit.
+	 */
+	if (inode->i_state & (I_DIRTY_SYNC|I_DIRTY_DATASYNC)) {
+		struct writeback_control wbc = {
+			.sync_mode = WB_SYNC_ALL,
+			.nr_to_write = 0, /* sys_fsync did this */
+		};
+		ret = sync_inode(inode, &wbc);
+	}
+out:
+	return ret;
 }
--- diff/fs/ext3/inode.c	2004-02-09 10:36:12.000000000 +0000
+++ source/fs/ext3/inode.c	2004-04-21 10:45:35.189353904 +0100
@@ -1358,8 +1358,6 @@ static int ext3_ordered_writepage(struct
 	}
 
 	if (!page_has_buffers(page)) {
-		if (!PageUptodate(page))
-			buffer_error();
 		create_empty_buffers(page, inode->i_sb->s_blocksize,
 				(1 << BH_Dirty)|(1 << BH_Uptodate));
 	}
@@ -1527,7 +1525,7 @@ static int ext3_releasepage(struct page 
  * If the O_DIRECT write is intantiating holes inside i_size and the machine
  * crashes then stale disk data _may_ be exposed inside the file.
  */
-static int ext3_direct_IO(int rw, struct kiocb *iocb,
+static ssize_t ext3_direct_IO(int rw, struct kiocb *iocb,
 			const struct iovec *iov, loff_t offset,
 			unsigned long nr_segs)
 {
@@ -1535,7 +1533,7 @@ static int ext3_direct_IO(int rw, struct
 	struct inode *inode = file->f_mapping->host;
 	struct ext3_inode_info *ei = EXT3_I(inode);
 	handle_t *handle = NULL;
-	int ret;
+	ssize_t ret;
 	int orphan = 0;
 	size_t count = iov_length(iov, nr_segs);
 
@@ -2772,9 +2770,28 @@ int ext3_setattr(struct dentry *dentry, 
 
 	if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) ||
 		(ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) {
+		handle_t *handle;
+
+		/* (user+group)*(old+new) structure, inode write (sb,
+		 * inode block, ? - but truncate inode update has it) */
+		handle = ext3_journal_start(inode, 4*EXT3_QUOTA_INIT_BLOCKS+3);
+		if (IS_ERR(handle)) {
+			error = PTR_ERR(handle);
+			goto err_out;
+		}
 		error = DQUOT_TRANSFER(inode, attr) ? -EDQUOT : 0;
-		if (error)
+		if (error) {
+			ext3_journal_stop(handle);
 			return error;
+		}
+		/* Update corresponding info in inode so that everything is in
+		 * one transaction */
+		if (attr->ia_valid & ATTR_UID)
+			inode->i_uid = attr->ia_uid;
+		if (attr->ia_valid & ATTR_GID)
+			inode->i_gid = attr->ia_gid;
+		error = ext3_mark_inode_dirty(handle, inode);
+		ext3_journal_stop(handle);
 	}
 
 	if (S_ISREG(inode->i_mode) &&
@@ -2853,7 +2870,9 @@ int ext3_writepage_trans_blocks(struct i
 		ret = 2 * (bpp + indirects) + 2;
 
 #ifdef CONFIG_QUOTA
-	ret += 2 * EXT3_SINGLEDATA_TRANS_BLOCKS;
+	/* We know that structure was already allocated during DQUOT_INIT so
+	 * we will be updating only the data blocks + inodes */
+	ret += 2*EXT3_QUOTA_TRANS_BLOCKS;
 #endif
 
 	return ret;
--- diff/fs/ext3/namei.c	2004-02-18 08:54:12.000000000 +0000
+++ source/fs/ext3/namei.c	2004-04-21 10:45:35.190353752 +0100
@@ -1606,11 +1606,9 @@ static int ext3_add_nondir(handle_t *han
 {
 	int err = ext3_add_entry(handle, dentry, inode);
 	if (!err) {
-		err = ext3_mark_inode_dirty(handle, inode);
-		if (!err) {
-			d_instantiate(dentry, inode);
-			return 0;
-		}
+		ext3_mark_inode_dirty(handle, inode);
+		d_instantiate(dentry, inode);
+		return 0;
 	}
 	ext3_dec_count(handle, inode);
 	iput(inode);
@@ -1633,7 +1631,8 @@ static int ext3_create (struct inode * d
 	int err;
 
 	handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS +
-					EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3);
+					EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 +
+					2*EXT3_QUOTA_INIT_BLOCKS);
 	if (IS_ERR(handle))
 		return PTR_ERR(handle);
 
@@ -1663,7 +1662,8 @@ static int ext3_mknod (struct inode * di
 		return -EINVAL;
 
 	handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS +
-			 		EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3);
+			 		EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 +
+					2*EXT3_QUOTA_INIT_BLOCKS);
 	if (IS_ERR(handle))
 		return PTR_ERR(handle);
 
@@ -1695,7 +1695,8 @@ static int ext3_mkdir(struct inode * dir
 		return -EMLINK;
 
 	handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS +
-					EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3);
+					EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 +
+					2*EXT3_QUOTA_INIT_BLOCKS);
 	if (IS_ERR(handle))
 		return PTR_ERR(handle);
 
@@ -1974,6 +1975,9 @@ static int ext3_rmdir (struct inode * di
 	struct ext3_dir_entry_2 * de;
 	handle_t *handle;
 
+	/* Initialize quotas before so that eventual writes go in
+	 * separate transaction */
+	DQUOT_INIT(dentry->d_inode);
 	handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS);
 	if (IS_ERR(handle))
 		return PTR_ERR(handle);
@@ -1987,7 +1991,6 @@ static int ext3_rmdir (struct inode * di
 		handle->h_sync = 1;
 
 	inode = dentry->d_inode;
-	DQUOT_INIT(inode);
 
 	retval = -EIO;
 	if (le32_to_cpu(de->inode) != inode->i_ino)
@@ -2031,6 +2034,9 @@ static int ext3_unlink(struct inode * di
 	struct ext3_dir_entry_2 * de;
 	handle_t *handle;
 
+	/* Initialize quotas before so that eventual writes go
+	 * in separate transaction */
+	DQUOT_INIT(dentry->d_inode);
 	handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS);
 	if (IS_ERR(handle))
 		return PTR_ERR(handle);
@@ -2044,7 +2050,6 @@ static int ext3_unlink(struct inode * di
 		goto end_unlink;
 
 	inode = dentry->d_inode;
-	DQUOT_INIT(inode);
 
 	retval = -EIO;
 	if (le32_to_cpu(de->inode) != inode->i_ino)
@@ -2087,7 +2092,8 @@ static int ext3_symlink (struct inode * 
 		return -ENAMETOOLONG;
 
 	handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS +
-			 		EXT3_INDEX_EXTRA_TRANS_BLOCKS + 5);
+			 		EXT3_INDEX_EXTRA_TRANS_BLOCKS + 5 +
+					2*EXT3_QUOTA_INIT_BLOCKS);
 	if (IS_ERR(handle))
 		return PTR_ERR(handle);
 
@@ -2172,6 +2178,10 @@ static int ext3_rename (struct inode * o
 
 	old_bh = new_bh = dir_bh = NULL;
 
+	/* Initialize quotas before so that eventual writes go
+	 * in separate transaction */
+	if (new_dentry->d_inode)
+		DQUOT_INIT(new_dentry->d_inode);
 	handle = ext3_journal_start(old_dir, 2 * EXT3_DATA_TRANS_BLOCKS +
 			 		EXT3_INDEX_EXTRA_TRANS_BLOCKS + 2);
 	if (IS_ERR(handle))
@@ -2198,8 +2208,6 @@ static int ext3_rename (struct inode * o
 		if (!new_inode) {
 			brelse (new_bh);
 			new_bh = NULL;
-		} else {
-			DQUOT_INIT(new_inode);
 		}
 	}
 	if (S_ISDIR(old_inode->i_mode)) {
--- diff/fs/ext3/super.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/ext3/super.c	2004-04-21 10:45:35.192353448 +0100
@@ -32,6 +32,9 @@
 #include <linux/buffer_head.h>
 #include <linux/vfs.h>
 #include <linux/random.h>
+#include <linux/mount.h>
+#include <linux/namei.h>
+#include <linux/quotaops.h>
 #include <asm/uaccess.h>
 #include "xattr.h"
 #include "acl.h"
@@ -504,7 +507,43 @@ static void ext3_clear_inode(struct inod
 # define ext3_clear_inode NULL
 #endif
 
-static struct dquot_operations ext3_qops;
+#ifdef CONFIG_QUOTA
+
+#define QTYPE2NAME(t) ((t)==USRQUOTA?"user":"group")
+#define QTYPE2MOPT(on, t) ((t)==USRQUOTA?((on)##USRJQUOTA):((on)##GRPJQUOTA))
+
+static int ext3_dquot_initialize(struct inode *inode, int type);
+static int ext3_dquot_drop(struct inode *inode);
+static int ext3_write_dquot(struct dquot *dquot);
+static int ext3_mark_dquot_dirty(struct dquot *dquot);
+static int ext3_write_info(struct super_block *sb, int type);
+static int ext3_quota_on(struct super_block *sb, int type, int format_id, char *path);
+static int ext3_quota_on_mount(struct super_block *sb, int type);
+static int ext3_quota_off_mount(struct super_block *sb, int type);
+
+static struct dquot_operations ext3_quota_operations = {
+	.initialize	= ext3_dquot_initialize,
+	.drop		= ext3_dquot_drop,
+	.alloc_space	= dquot_alloc_space,
+	.alloc_inode	= dquot_alloc_inode,
+	.free_space	= dquot_free_space,
+	.free_inode	= dquot_free_inode,
+	.transfer	= dquot_transfer,
+	.write_dquot	= ext3_write_dquot,
+	.mark_dirty	= ext3_mark_dquot_dirty,
+	.write_info	= ext3_write_info
+};
+
+static struct quotactl_ops ext3_qctl_operations = {
+	.quota_on	= ext3_quota_on,
+	.quota_off	= vfs_quota_off,
+	.quota_sync	= vfs_quota_sync,
+	.get_info	= vfs_get_dqinfo,
+	.set_info	= vfs_set_dqinfo,
+	.get_dqblk	= vfs_get_dqblk,
+	.set_dqblk	= vfs_set_dqblk
+};
+#endif
 
 static struct super_operations ext3_sops = {
 	.alloc_inode	= ext3_alloc_inode,
@@ -536,6 +575,8 @@ enum {
 	Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_noacl, Opt_noload,
 	Opt_commit, Opt_journal_update, Opt_journal_inum,
 	Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback,
+	Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota,
+	Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0,
 	Opt_ignore, Opt_err,
 };
 
@@ -571,6 +612,12 @@ static match_table_t tokens = {
 	{Opt_data_journal, "data=journal"},
 	{Opt_data_ordered, "data=ordered"},
 	{Opt_data_writeback, "data=writeback"},
+	{Opt_offusrjquota, "usrjquota="},
+	{Opt_usrjquota, "usrjquota=%s"},
+	{Opt_offgrpjquota, "grpjquota="},
+	{Opt_grpjquota, "grpjquota=%s"},
+	{Opt_jqfmt_vfsold, "jqfmt=vfsold"},
+	{Opt_jqfmt_vfsv0, "jqfmt=vfsv0"},
 	{Opt_ignore, "grpquota"},
 	{Opt_ignore, "noquota"},
 	{Opt_ignore, "quota"},
@@ -598,13 +645,17 @@ static unsigned long get_sb_block(void *
 	return sb_block;
 }
 
-static int parse_options (char * options, struct ext3_sb_info *sbi,
+static int parse_options (char * options, struct super_block *sb,
 			  unsigned long * inum, int is_remount)
 {
+	struct ext3_sb_info *sbi = EXT3_SB(sb);
 	char * p;
 	substring_t args[MAX_OPT_ARGS];
 	int data_opt = 0;
 	int option;
+#ifdef CONFIG_QUOTA
+	int qtype;
+#endif
 
 	if (!options)
 		return 1;
@@ -735,6 +786,10 @@ static int parse_options (char * options
 		case Opt_commit:
 			if (match_int(&args[0], &option))
 				return 0;
+			if (option < 0)
+				return 0;
+			if (option == 0)
+				option = JBD_DEFAULT_MAX_COMMIT_AGE;
 			sbi->s_commit_interval = HZ * option;
 			break;
 		case Opt_data_journal:
@@ -759,6 +814,76 @@ static int parse_options (char * options
 				sbi->s_mount_opt |= data_opt;
 			}
 			break;
+#ifdef CONFIG_QUOTA
+		case Opt_usrjquota:
+			qtype = USRQUOTA;
+			goto set_qf_name;
+		case Opt_grpjquota:
+			qtype = GRPQUOTA;
+set_qf_name:
+			if (sb_any_quota_enabled(sb)) {
+				printk(KERN_ERR
+					"EXT3-fs: Cannot change journalled "
+					"quota options when quota turned on.\n");
+				return 0;
+			}
+			if (sbi->s_qf_names[qtype]) {
+				printk(KERN_ERR
+					"EXT3-fs: %s quota file already "
+					"specified.\n", QTYPE2NAME(qtype));
+				return 0;
+			}
+			sbi->s_qf_names[qtype] = match_strdup(&args[0]);
+			if (!sbi->s_qf_names[qtype]) {
+				printk(KERN_ERR
+					"EXT3-fs: not enough memory for "
+					"storing quotafile name.\n");
+				return 0;
+			}
+			if (strchr(sbi->s_qf_names[qtype], '/')) {
+				printk(KERN_ERR
+					"EXT3-fs: quotafile must be on "
+					"filesystem root.\n");
+				kfree(sbi->s_qf_names[qtype]);
+				sbi->s_qf_names[qtype] = NULL;
+				return 0;
+			}
+			break;
+		case Opt_offusrjquota:
+			qtype = USRQUOTA;
+			goto clear_qf_name;
+		case Opt_offgrpjquota:
+			qtype = GRPQUOTA;
+clear_qf_name:
+			if (sb_any_quota_enabled(sb)) {
+				printk(KERN_ERR "EXT3-fs: Cannot change "
+					"journalled quota options when "
+					"quota turned on.\n");
+				return 0;
+			}
+			if (sbi->s_qf_names[qtype]) {
+				kfree(sbi->s_qf_names[qtype]);
+				sbi->s_qf_names[qtype] = NULL;
+			}
+			break;
+		case Opt_jqfmt_vfsold:
+			sbi->s_jquota_fmt = QFMT_VFS_OLD;
+			break;
+		case Opt_jqfmt_vfsv0:
+			sbi->s_jquota_fmt = QFMT_VFS_V0;
+			break;
+#else
+		case Opt_usrjquota:
+		case Opt_grpjquota:
+		case Opt_offusrjquota:
+		case Opt_offgrpjquota:
+		case Opt_jqfmt_vfsold:
+		case Opt_jqfmt_vfsv0:
+			printk(KERN_ERR
+				"EXT3-fs: journalled quota options not "
+				"supported.\n");
+			break;
+#endif
 		case Opt_abort:
 			set_opt(sbi->s_mount_opt, ABORT);
 			break;
@@ -771,6 +896,13 @@ static int parse_options (char * options
 			return 0;
 		}
 	}
+#ifdef CONFIG_QUOTA
+	if (!sbi->s_jquota_fmt && (sbi->s_qf_names[0] || sbi->s_qf_names[1])) {
+		printk(KERN_ERR
+			"EXT3-fs: journalled quota format not specified.\n");
+		return 0;
+	}
+#endif
 
 	return 1;
 }
@@ -930,6 +1062,9 @@ static void ext3_orphan_cleanup (struct 
 {
 	unsigned int s_flags = sb->s_flags;
 	int nr_orphans = 0, nr_truncates = 0;
+#ifdef CONFIG_QUOTA
+	int i;
+#endif
 	if (!es->s_last_orphan) {
 		jbd_debug(4, "no orphan inodes to clean up\n");
 		return;
@@ -949,6 +1084,20 @@ static void ext3_orphan_cleanup (struct 
 		       sb->s_id);
 		sb->s_flags &= ~MS_RDONLY;
 	}
+#ifdef CONFIG_QUOTA
+	/* Needed for iput() to work correctly and not trash data */
+	sb->s_flags |= MS_ACTIVE;
+	/* Turn on quotas so that they are updated correctly */
+	for (i = 0; i < MAXQUOTAS; i++) {
+		if (EXT3_SB(sb)->s_qf_names[i]) {
+			int ret = ext3_quota_on_mount(sb, i);
+			if (ret < 0)
+				printk(KERN_ERR
+					"EXT3-fs: Cannot turn on journalled "
+					"quota: error %d\n", ret);
+		}
+	}
+#endif
 
 	while (es->s_last_orphan) {
 		struct inode *inode;
@@ -960,6 +1109,7 @@ static void ext3_orphan_cleanup (struct 
 		}
 
 		list_add(&EXT3_I(inode)->i_orphan, &EXT3_SB(sb)->s_orphan);
+		DQUOT_INIT(inode);
 		if (inode->i_nlink) {
 			printk(KERN_DEBUG
 				"%s: truncating inode %ld to %Ld bytes\n",
@@ -987,6 +1137,13 @@ static void ext3_orphan_cleanup (struct 
 	if (nr_truncates)
 		printk(KERN_INFO "EXT3-fs: %s: %d truncate%s cleaned up\n",
 		       sb->s_id, PLURAL(nr_truncates));
+#ifdef CONFIG_QUOTA
+	/* Turn quotas off */
+	for (i = 0; i < MAXQUOTAS; i++) {
+		if (sb_dqopt(sb)->files[i])
+			ext3_quota_off_mount(sb, i);
+	}
+#endif
 	sb->s_flags = s_flags; /* Restore MS_RDONLY status */
 }
 
@@ -1035,8 +1192,9 @@ static int ext3_fill_super (struct super
 	struct buffer_head * bh;
 	struct ext3_super_block *es = 0;
 	struct ext3_sb_info *sbi;
+	unsigned long block;
 	unsigned long sb_block = get_sb_block(&data);
-	unsigned long block, logic_sb_block = 1;
+	unsigned long logic_sb_block;
 	unsigned long offset = 0;
 	unsigned long journal_inum = 0;
 	unsigned long def_mount_opts;
@@ -1069,6 +1227,8 @@ static int ext3_fill_super (struct super
 	if (blocksize != EXT3_MIN_BLOCK_SIZE) {
 		logic_sb_block = (sb_block * EXT3_MIN_BLOCK_SIZE) / blocksize;
 		offset = (sb_block * EXT3_MIN_BLOCK_SIZE) % blocksize;
+	} else {
+		logic_sb_block = sb_block;
 	}
 
 	if (!(bh = sb_bread(sb, logic_sb_block))) {
@@ -1117,7 +1277,7 @@ static int ext3_fill_super (struct super
 	sbi->s_resuid = le16_to_cpu(es->s_def_resuid);
 	sbi->s_resgid = le16_to_cpu(es->s_def_resgid);
 
-	if (!parse_options ((char *) data, sbi, &journal_inum, 0))
+	if (!parse_options ((char *) data, sb, &journal_inum, 0))
 		goto failed_mount;
 
 	sb->s_flags |= MS_ONE_SECOND;
@@ -1296,7 +1456,10 @@ static int ext3_fill_super (struct super
 	 */
 	sb->s_op = &ext3_sops;
 	sb->s_export_op = &ext3_export_ops;
-	sb->dq_op = &ext3_qops;
+#ifdef CONFIG_QUOTA
+	sb->s_qcop = &ext3_qctl_operations;
+	sb->dq_op = &ext3_quota_operations;
+#endif
 	INIT_LIST_HEAD(&sbi->s_orphan); /* unlinked but open files */
 
 	sb->s_root = 0;
@@ -1406,6 +1569,12 @@ failed_mount2:
 		brelse(sbi->s_group_desc[i]);
 	kfree(sbi->s_group_desc);
 failed_mount:
+#ifdef CONFIG_QUOTA
+	for (i = 0; i < MAXQUOTAS; i++) {
+		if (sbi->s_qf_names[i])
+			kfree(sbi->s_qf_names[i]);
+	}
+#endif
 	ext3_blkdev_remove(sbi);
 	brelse(bh);
 out_fail:
@@ -1832,7 +2001,7 @@ int ext3_remount (struct super_block * s
 	/*
 	 * Allow the "check" option to be passed as a remount option.
 	 */
-	if (!parse_options(data, sbi, &tmp, 1))
+	if (!parse_options(data, sb, &tmp, 1))
 		return -EINVAL;
 
 	if (sbi->s_mount_opt & EXT3_MOUNT_ABORT)
@@ -1952,45 +2121,152 @@ int ext3_statfs (struct super_block * sb
 
 #ifdef CONFIG_QUOTA
 
-/* Blocks: (2 data blocks) * (3 indirect + 1 descriptor + 1 bitmap) + superblock */
-#define EXT3_OLD_QFMT_BLOCKS 11
-/* Blocks: quota info + (4 pointer blocks + 1 entry block) * (3 indirect + 1 descriptor + 1 bitmap) + superblock */
-#define EXT3_V0_QFMT_BLOCKS 27
+static inline struct inode *dquot_to_inode(struct dquot *dquot)
+{
+	return sb_dqopt(dquot->dq_sb)->files[dquot->dq_type]->f_dentry->d_inode;
+}
 
-static int (*old_write_dquot)(struct dquot *dquot);
+static int ext3_dquot_initialize(struct inode *inode, int type)
+{
+	handle_t *handle;
+	int ret, err;
+
+	/* We may create quota structure so we need to reserve enough blocks */
+	handle = ext3_journal_start(inode, 2*EXT3_QUOTA_INIT_BLOCKS);
+	if (IS_ERR(handle))
+		return PTR_ERR(handle);
+	ret = dquot_initialize(inode, type);
+	err = ext3_journal_stop(handle);
+	if (!ret)
+		ret = err;
+	return ret;
+}
+
+static int ext3_dquot_drop(struct inode *inode)
+{
+	handle_t *handle;
+	int ret, err;
+
+	/* We may delete quota structure so we need to reserve enough blocks */
+	handle = ext3_journal_start(inode, 2*EXT3_QUOTA_INIT_BLOCKS);
+	if (IS_ERR(handle))
+		return PTR_ERR(handle);
+	ret = dquot_drop(inode);
+	err = ext3_journal_stop(handle);
+	if (!ret)
+		ret = err;
+	return ret;
+}
 
 static int ext3_write_dquot(struct dquot *dquot)
 {
-	int nblocks;
-	int ret;
-	int err;
+	int ret, err;
 	handle_t *handle;
-	struct quota_info *dqops = sb_dqopt(dquot->dq_sb);
-	struct inode *qinode;
 
-	switch (dqops->info[dquot->dq_type].dqi_format->qf_fmt_id) {
-		case QFMT_VFS_OLD:
-			nblocks = EXT3_OLD_QFMT_BLOCKS;
-			break;
-		case QFMT_VFS_V0:
-			nblocks = EXT3_V0_QFMT_BLOCKS;
-			break;
-		default:
-			nblocks = EXT3_MAX_TRANS_DATA;
-	}
-	qinode = dqops->files[dquot->dq_type]->f_dentry->d_inode;
-	handle = ext3_journal_start(qinode, nblocks);
-	if (IS_ERR(handle)) {
-		ret = PTR_ERR(handle);
-		goto out;
-	}
-	ret = old_write_dquot(dquot);
+	handle = ext3_journal_start(dquot_to_inode(dquot),
+					EXT3_QUOTA_TRANS_BLOCKS);
+	if (IS_ERR(handle))
+		return PTR_ERR(handle);
+	ret = dquot_commit(dquot);
 	err = ext3_journal_stop(handle);
-	if (ret == 0)
+	if (!ret)
 		ret = err;
-out:
 	return ret;
 }
+
+static int ext3_mark_dquot_dirty(struct dquot * dquot)
+{
+	/* Are we journalling quotas? */
+	if (EXT3_SB(dquot->dq_sb)->s_qf_names[0] ||
+	    EXT3_SB(dquot->dq_sb)->s_qf_names[1])
+		return ext3_write_dquot(dquot);
+	else
+		return dquot_mark_dquot_dirty(dquot);
+}
+
+static int ext3_write_info(struct super_block *sb, int type)
+{
+	int ret, err;
+	handle_t *handle;
+
+	/* Data block + inode block */
+	handle = ext3_journal_start(sb->s_root->d_inode, 2);
+	if (IS_ERR(handle))
+		return PTR_ERR(handle);
+	ret = dquot_commit_info(sb, type);
+	err = ext3_journal_stop(handle);
+	if (!ret)
+		ret = err;
+	return ret;
+}
+
+/*
+ * Turn on quotas during mount time - we need to find
+ * the quota file and such...
+ */
+static int ext3_quota_on_mount(struct super_block *sb, int type)
+{
+	int err;
+	struct dentry *dentry;
+	struct qstr name = { .name = EXT3_SB(sb)->s_qf_names[type],
+			     .hash = 0,
+			     .len = strlen(EXT3_SB(sb)->s_qf_names[type])};
+
+	dentry = lookup_hash(&name, sb->s_root);
+	if (IS_ERR(dentry))
+		return PTR_ERR(dentry);
+	err = vfs_quota_on_mount(type, EXT3_SB(sb)->s_jquota_fmt, dentry);
+	if (err)
+		dput(dentry);
+	/* We keep the dentry reference if everything went ok - we drop it
+	 * on quota_off time */
+	return err;
+}
+
+/* Turn quotas off during mount time */
+static int ext3_quota_off_mount(struct super_block *sb, int type)
+{
+	int err;
+	struct dentry *dentry;
+
+	dentry = sb_dqopt(sb)->files[type]->f_dentry;
+	err = vfs_quota_off_mount(sb, type);
+	/* We invalidate dentry - it has at least wrong hash... */
+	d_invalidate(dentry);
+	dput(dentry);
+	return err;
+}
+
+/*
+ * Standard function to be called on quota_on
+ */
+static int ext3_quota_on(struct super_block *sb, int type, int format_id,
+			 char *path)
+{
+	int err;
+	struct nameidata nd;
+
+	/* Not journalling quota? */
+	if (!EXT3_SB(sb)->s_qf_names[0] && !EXT3_SB(sb)->s_qf_names[1])
+		return vfs_quota_on(sb, type, format_id, path);
+	err = path_lookup(path, LOOKUP_FOLLOW, &nd);
+	if (err)
+		return err;
+	/* Quotafile not on the same filesystem? */
+	if (nd.mnt->mnt_sb != sb)
+		return -EXDEV;
+	/* Quotafile not of fs root? */
+	if (nd.dentry->d_parent->d_inode != sb->s_root->d_inode)
+		printk(KERN_WARNING
+			"EXT3-fs: Quota file not on filesystem root. "
+			"Journalled quota will not work.\n");
+	if (!ext3_should_journal_data(nd.dentry->d_inode))
+		printk(KERN_WARNING "EXT3-fs: Quota file does not have "
+			"data-journalling. Journalled quota will not work.\n");
+	path_release(&nd);
+	return vfs_quota_on(sb, type, format_id, path);
+}
+
 #endif
 
 static struct super_block *ext3_get_sb(struct file_system_type *fs_type,
@@ -2015,11 +2291,6 @@ static int __init init_ext3_fs(void)
 	err = init_inodecache();
 	if (err)
 		goto out1;
-#ifdef CONFIG_QUOTA
-	init_dquot_operations(&ext3_qops);
-	old_write_dquot = ext3_qops.write_dquot;
-	ext3_qops.write_dquot = ext3_write_dquot;
-#endif
         err = register_filesystem(&ext3_fs_type);
 	if (err)
 		goto out;
--- diff/fs/fat/inode.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/fat/inode.c	2004-04-21 10:45:35.192353448 +0100
@@ -734,6 +734,12 @@ void __exit fat_destroy_inodecache(void)
 		printk(KERN_INFO "fat_inode_cache: not all structures were freed\n");
 }
 
+static int fat_remount(struct super_block *sb, int *flags, char *data)
+{
+	*flags |= MS_NODIRATIME;
+	return 0;
+}
+
 static struct super_operations fat_sops = { 
 	.alloc_inode	= fat_alloc_inode,
 	.destroy_inode	= fat_destroy_inode,
@@ -742,6 +748,7 @@ static struct super_operations fat_sops 
 	.put_super	= fat_put_super,
 	.statfs		= fat_statfs,
 	.clear_inode	= fat_clear_inode,
+	.remount_fs	= fat_remount,
 
 	.read_inode	= make_bad_inode,
 
--- diff/fs/fcntl.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/fcntl.c	2004-04-21 10:45:35.193353296 +0100
@@ -282,80 +282,88 @@ void f_delown(struct file *filp)
 
 EXPORT_SYMBOL(f_delown);
 
-static long do_fcntl(unsigned int fd, unsigned int cmd,
-		     unsigned long arg, struct file * filp)
+long generic_file_fcntl(int fd, unsigned int cmd,
+			unsigned long arg, struct file *filp)
 {
 	long err = -EINVAL;
 
 	switch (cmd) {
-		case F_DUPFD:
-			get_file(filp);
-			err = dupfd(filp, arg);
-			break;
-		case F_GETFD:
-			err = get_close_on_exec(fd) ? FD_CLOEXEC : 0;
-			break;
-		case F_SETFD:
-			err = 0;
-			set_close_on_exec(fd, arg & FD_CLOEXEC);
-			break;
-		case F_GETFL:
-			err = filp->f_flags;
-			break;
-		case F_SETFL:
-			err = setfl(fd, filp, arg);
-			break;
-		case F_GETLK:
-			err = fcntl_getlk(filp, (struct flock __user *) arg);
-			break;
-		case F_SETLK:
-		case F_SETLKW:
-			err = fcntl_setlk(filp, cmd, (struct flock __user *) arg);
-			break;
-		case F_GETOWN:
-			/*
-			 * XXX If f_owner is a process group, the
-			 * negative return value will get converted
-			 * into an error.  Oops.  If we keep the
-			 * current syscall conventions, the only way
-			 * to fix this will be in libc.
-			 */
-			err = filp->f_owner.pid;
-			force_successful_syscall_return();
-			break;
-		case F_SETOWN:
-			err = f_setown(filp, arg, 1);
-			break;
-		case F_GETSIG:
-			err = filp->f_owner.signum;
-			break;
-		case F_SETSIG:
-			/* arg == 0 restores default behaviour. */
-			if (arg < 0 || arg > _NSIG) {
-				break;
-			}
-			err = 0;
-			filp->f_owner.signum = arg;
-			break;
-		case F_GETLEASE:
-			err = fcntl_getlease(filp);
-			break;
-		case F_SETLEASE:
-			err = fcntl_setlease(fd, filp, arg);
-			break;
-		case F_NOTIFY:
-			err = fcntl_dirnotify(fd, filp, arg);
-			break;
-		default:
+	case F_DUPFD:
+		get_file(filp);
+		err = dupfd(filp, arg);
+		break;
+	case F_GETFD:
+		err = get_close_on_exec(fd) ? FD_CLOEXEC : 0;
+		break;
+	case F_SETFD:
+		err = 0;
+		set_close_on_exec(fd, arg & FD_CLOEXEC);
+		break;
+	case F_GETFL:
+		err = filp->f_flags;
+		break;
+	case F_SETFL:
+		err = setfl(fd, filp, arg);
+		break;
+	case F_GETLK:
+		err = fcntl_getlk(filp, (struct flock __user *) arg);
+		break;
+	case F_SETLK:
+	case F_SETLKW:
+		err = fcntl_setlk(filp, cmd, (struct flock __user *) arg);
+		break;
+	case F_GETOWN:
+		/*
+		 * XXX If f_owner is a process group, the
+		 * negative return value will get converted
+		 * into an error.  Oops.  If we keep the
+		 * current syscall conventions, the only way
+		 * to fix this will be in libc.
+		 */
+		err = filp->f_owner.pid;
+		force_successful_syscall_return();
+		break;
+	case F_SETOWN:
+		err = f_setown(filp, arg, 1);
+		break;
+	case F_GETSIG:
+		err = filp->f_owner.signum;
+		break;
+	case F_SETSIG:
+		/* arg == 0 restores default behaviour. */
+		if (arg < 0 || arg > _NSIG) {
 			break;
+		}
+		err = 0;
+		filp->f_owner.signum = arg;
+		break;
+	case F_GETLEASE:
+		err = fcntl_getlease(filp);
+		break;
+	case F_SETLEASE:
+		err = fcntl_setlease(fd, filp, arg);
+		break;
+	case F_NOTIFY:
+		err = fcntl_dirnotify(fd, filp, arg);
+		break;
+	default:
+		break;
 	}
-
 	return err;
 }
+EXPORT_SYMBOL(generic_file_fcntl);
 
-asmlinkage long sys_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg)
+static long do_fcntl(int fd, unsigned int cmd,
+			unsigned long arg, struct file *filp)
+{
+	if (filp->f_op && filp->f_op->fcntl)
+		return filp->f_op->fcntl(fd, cmd, arg, filp);
+	return generic_file_fcntl(fd, cmd, arg, filp);
+}
+
+asmlinkage long sys_fcntl(int fd, unsigned int cmd, unsigned long arg)
 {	
-	struct file * filp;
+	struct file *filp;
 	long err = -EBADF;
 
 	filp = fget(fd);
--- diff/fs/file_table.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/file_table.c	2004-04-21 10:45:35.193353296 +0100
@@ -198,7 +198,7 @@ struct file fastcall *fget(unsigned int 
 	struct files_struct *files = current->files;
 
 	spin_lock(&files->file_lock);
-	file = fcheck(fd);
+	file = fcheck_files(files, fd);
 	if (file)
 		get_file(file);
 	spin_unlock(&files->file_lock);
@@ -221,10 +221,10 @@ struct file fastcall *fget_light(unsigne
 
 	*fput_needed = 0;
 	if (likely((atomic_read(&files->count) == 1))) {
-		file = fcheck(fd);
+		file = fcheck_files(files, fd);
 	} else {
 		spin_lock(&files->file_lock);
-		file = fcheck(fd);
+		file = fcheck_files(files, fd);
 		if (file) {
 			get_file(file);
 			*fput_needed = 1;
--- diff/fs/freevxfs/vxfs_super.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/freevxfs/vxfs_super.c	2004-04-21 10:45:35.194353144 +0100
@@ -56,12 +56,14 @@ MODULE_ALIAS("vxfs"); /* makes mount -t 
 
 static void		vxfs_put_super(struct super_block *);
 static int		vxfs_statfs(struct super_block *, struct kstatfs *);
+static int		vxfs_remount(struct super_block *, int *, char *);
 
 static struct super_operations vxfs_super_ops = {
 	.read_inode =		vxfs_read_inode,
 	.put_inode =		vxfs_put_inode,
 	.put_super =		vxfs_put_super,
 	.statfs =		vxfs_statfs,
+	.remount_fs =		vxfs_remount,
 };
 
 /**
@@ -121,6 +123,12 @@ vxfs_statfs(struct super_block *sbp, str
 	return 0;
 }
 
+static int vxfs_remount(struct super_block *sb, int *flags, char *data)
+{
+	*flags |= MS_RDONLY;
+	return 0;
+}
+
 /**
  * vxfs_read_super - read superblock into memory and initalize filesystem
  * @sbp:		VFS superblock (to fill)
--- diff/fs/fs-writeback.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/fs-writeback.c	2004-04-21 10:45:35.261342960 +0100
@@ -75,6 +75,9 @@ void __mark_inode_dirty(struct inode *in
 	if ((inode->i_state & flags) == flags)
 		return;
 
+	if (unlikely(block_dump))
+		printk("%s(%d): dirtied file\n", current->comm, current->pid);
+
 	spin_lock(&inode_lock);
 	if ((inode->i_state & flags) != flags) {
 		const int was_dirty = inode->i_state & I_DIRTY;
@@ -129,21 +132,16 @@ static void write_inode(struct inode *in
  * starvation of particular inodes when others are being redirtied, prevent
  * livelocks, etc.
  *
- * So what we do is to move all pages which are to be written from dirty_pages
- * onto io_pages.  And keep on writing io_pages until it's empty.  Refusing to
- * move more pages onto io_pages until io_pages is empty.  Once that point has
- * been reached, we are ready to take another pass across the inode's dirty
- * pages.
- *
  * Called under inode_lock.
  */
-static void
+static int
 __sync_single_inode(struct inode *inode, struct writeback_control *wbc)
 {
 	unsigned dirty;
 	struct address_space *mapping = inode->i_mapping;
 	struct super_block *sb = inode->i_sb;
 	int wait = wbc->sync_mode == WB_SYNC_ALL;
+	int ret;
 
 	BUG_ON(inode->i_state & I_LOCK);
 
@@ -152,61 +150,80 @@ __sync_single_inode(struct inode *inode,
 	inode->i_state |= I_LOCK;
 	inode->i_state &= ~I_DIRTY;
 
-	/*
-	 * smp_rmb(); note: if you remove write_lock below, you must add this.
-	 * mark_inode_dirty doesn't take spinlock, make sure that inode is not
-	 * read speculatively by this cpu before &= ~I_DIRTY  -- mikulas
-	 */
-
-	spin_lock(&mapping->page_lock);
-	if (wait || !wbc->for_kupdate || list_empty(&mapping->io_pages))
-		list_splice_init(&mapping->dirty_pages, &mapping->io_pages);
-	spin_unlock(&mapping->page_lock);
 	spin_unlock(&inode_lock);
 
-	do_writepages(mapping, wbc);
+	ret = do_writepages(mapping, wbc);
 
 	/* Don't write the inode if only I_DIRTY_PAGES was set */
 	if (dirty & (I_DIRTY_SYNC | I_DIRTY_DATASYNC))
 		write_inode(inode, wait);
 
-	if (wait)
-		filemap_fdatawait(mapping);
+	if (wait) {
+		int err = filemap_fdatawait(mapping);
+		if (ret == 0)
+			ret = err;
+	}
 
 	spin_lock(&inode_lock);
 	inode->i_state &= ~I_LOCK;
 	if (!(inode->i_state & I_FREEING)) {
-		if (!list_empty(&mapping->io_pages)) {
-		 	/* Needs more writeback */
-			inode->i_state |= I_DIRTY_PAGES;
-		} else if (!list_empty(&mapping->dirty_pages)) {
-			/* Redirtied */
-			inode->i_state |= I_DIRTY_PAGES;
-			inode->dirtied_when = jiffies;
-			list_move(&inode->i_list, &sb->s_dirty);
+		if (!(inode->i_state & I_DIRTY) &&
+		    mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) {
+			/*
+			 * We didn't write back all the pages.  Redirty the
+			 * inode.  It is still on sb->s_dirty.
+			 */
+			if (wbc->for_kupdate) {
+				/*
+				 * For the kupdate function we leave the inode
+				 * where it is on sb_dirty so it will get more
+				 * writeout as soon as the queue becomes
+				 * uncongested.
+				 */
+				inode->i_state |= I_DIRTY_PAGES;
+			} else {
+				/*
+				 * Otherwise fully redirty the inode so that
+				 * other inodes on this superblock will get some
+				 * writeout.  Otherwise heavy writing to one
+				 * file would indefinitely suspend writeout of
+				 * all the other files.
+				 */
+				inode->i_state |= I_DIRTY_PAGES;
+				inode->dirtied_when = jiffies;
+				list_move(&inode->i_list, &sb->s_dirty);
+			}
 		} else if (inode->i_state & I_DIRTY) {
-			/* Redirtied */
-			inode->dirtied_when = jiffies;
-			list_move(&inode->i_list, &sb->s_dirty);
+			/*
+			 * Someone redirtied the inode while were writing back
+			 * the pages: nothing to do.
+			 */
 		} else if (atomic_read(&inode->i_count)) {
+			/*
+			 * The inode is clean, inuse
+			 */
 			list_move(&inode->i_list, &inode_in_use);
 		} else {
+			/*
+			 * The inode is clean, unused
+			 */
 			list_move(&inode->i_list, &inode_unused);
 		}
 	}
 	wake_up_inode(inode);
+	return ret;
 }
 
 /*
  * Write out an inode's dirty pages.  Called under inode_lock.
  */
-static void
+static int
 __writeback_single_inode(struct inode *inode,
 			struct writeback_control *wbc)
 {
 	if ((wbc->sync_mode != WB_SYNC_ALL) && (inode->i_state & I_LOCK)) {
 		list_move(&inode->i_list, &inode->i_sb->s_dirty);
-		return;
+		return 0;
 	}
 
 	/*
@@ -219,7 +236,7 @@ __writeback_single_inode(struct inode *i
 		iput(inode);
 		spin_lock(&inode_lock);
 	}
-	__sync_single_inode(inode, wbc);
+	return __sync_single_inode(inode, wbc);
 }
 
 /*
@@ -265,6 +282,7 @@ sync_sb_inodes(struct super_block *sb, s
 						struct inode, i_list);
 		struct address_space *mapping = inode->i_mapping;
 		struct backing_dev_info *bdi = mapping->backing_dev_info;
+		long pages_skipped;
 
 		if (bdi->memory_backed) {
 			if (sb == blockdev_superblock) {
@@ -312,6 +330,7 @@ sync_sb_inodes(struct super_block *sb, s
 
 		BUG_ON(inode->i_state & I_FREEING);
 		__iget(inode);
+		pages_skipped = wbc->pages_skipped;
 		__writeback_single_inode(inode, wbc);
 		if (wbc->sync_mode == WB_SYNC_HOLD) {
 			inode->dirtied_when = jiffies;
@@ -319,6 +338,13 @@ sync_sb_inodes(struct super_block *sb, s
 		}
 		if (current_is_pdflush())
 			writeback_release(bdi);
+		if (wbc->pages_skipped != pages_skipped) {
+			/*
+			 * writeback is not making progress due to locked
+			 * buffers.  Skip this inode for now.
+			 */
+			list_move(&inode->i_list, &sb->s_dirty);
+		}
 		spin_unlock(&inode_lock);
 		iput(inode);
 		spin_lock(&inode_lock);
@@ -499,10 +525,31 @@ void write_inode_now(struct inode *inode
 	if (sync)
 		wait_on_inode(inode);
 }
-
 EXPORT_SYMBOL(write_inode_now);
 
 /**
+ * sync_inode - write an inode and its pages to disk.
+ * @inode: the inode to sync
+ * @wbc: controls the writeback mode
+ *
+ * sync_inode() will write an inode and its pages to disk.  It will also
+ * correctly update the inode on its superblock's dirty inode lists and will
+ * update inode->i_state.
+ *
+ * The caller must have a ref on the inode.
+ */
+int sync_inode(struct inode *inode, struct writeback_control *wbc)
+{
+	int ret;
+
+	spin_lock(&inode_lock);
+	ret = __writeback_single_inode(inode, wbc);
+	spin_unlock(&inode_lock);
+	return ret;
+}
+EXPORT_SYMBOL(sync_inode);
+
+/**
  * generic_osync_inode - flush all dirty data for a given inode to disk
  * @inode: inode to write
  * @what:  what to write and wait upon
--- diff/fs/hfs/inode.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/hfs/inode.c	2004-04-21 10:45:35.264342504 +0100
@@ -114,8 +114,8 @@ static int hfs_get_blocks(struct inode *
 	return ret;
 }
 
-static int hfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
-			 loff_t offset, unsigned long nr_segs)
+static ssize_t hfs_direct_IO(int rw, struct kiocb *iocb,
+		const struct iovec *iov, loff_t offset, unsigned long nr_segs)
 {
 	struct file *file = iocb->ki_filp;
 	struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
--- diff/fs/hfs/super.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/hfs/super.c	2004-04-21 10:45:35.264342504 +0100
@@ -94,6 +94,7 @@ static int hfs_statfs(struct super_block
 
 int hfs_remount(struct super_block *sb, int *flags, char *data)
 {
+	*flags |= MS_NODIRATIME;
 	if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
 		return 0;
 	if (!(*flags & MS_RDONLY)) {
@@ -276,6 +277,7 @@ static int hfs_fill_super(struct super_b
 		if (!silent)
 			hfs_warn("VFS: Can't find a HFS filesystem on dev %s.\n",
 				hfs_mdb_name(sb));
+		res = -EINVAL;
 		goto bail2;
 	}
 
--- diff/fs/hfsplus/inode.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/hfsplus/inode.c	2004-04-21 10:45:35.265342352 +0100
@@ -114,8 +114,8 @@ static int hfsplus_get_blocks(struct ino
 	return ret;
 }
 
-static int hfsplus_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
-			  loff_t offset, unsigned long nr_segs)
+static ssize_t hfsplus_direct_IO(int rw, struct kiocb *iocb,
+		const struct iovec *iov, loff_t offset, unsigned long nr_segs)
 {
 	struct file *file = iocb->ki_filp;
 	struct inode *inode = file->f_dentry->d_inode->i_mapping->host;
--- diff/fs/hugetlbfs/inode.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/hugetlbfs/inode.c	2004-04-21 10:45:35.265342352 +0100
@@ -573,7 +573,7 @@ hugetlbfs_parse_options(char *options, s
 			unsigned long long size = memparse(value, &rest);
 			if (*rest == '%') {
 				size <<= HPAGE_SHIFT;
-				size *= htlbpage_max;
+				size *= max_huge_pages;
 				do_div(size, 100);
 				rest++;
 			}
--- diff/fs/inode.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/inode.c	2004-04-21 10:45:35.267342048 +0100
@@ -126,7 +126,9 @@ static struct inode *alloc_inode(struct 
 		inode->i_blocks = 0;
 		inode->i_bytes = 0;
 		inode->i_generation = 0;
+#ifdef CONFIG_QUOTA
 		memset(&inode->i_dquot, 0, sizeof(inode->i_dquot));
+#endif
 		inode->i_pipe = NULL;
 		inode->i_bdev = NULL;
 		inode->i_cdev = NULL;
@@ -176,15 +178,12 @@ void inode_init_once(struct inode *inode
 {
 	memset(inode, 0, sizeof(*inode));
 	INIT_HLIST_NODE(&inode->i_hash);
-	INIT_LIST_HEAD(&inode->i_data.clean_pages);
-	INIT_LIST_HEAD(&inode->i_data.dirty_pages);
-	INIT_LIST_HEAD(&inode->i_data.locked_pages);
-	INIT_LIST_HEAD(&inode->i_data.io_pages);
 	INIT_LIST_HEAD(&inode->i_dentry);
 	INIT_LIST_HEAD(&inode->i_devices);
 	sema_init(&inode->i_sem, 1);
+	init_rwsem(&inode->i_alloc_sem);
 	INIT_RADIX_TREE(&inode->i_data.page_tree, GFP_ATOMIC);
-	spin_lock_init(&inode->i_data.page_lock);
+	spin_lock_init(&inode->i_data.tree_lock);
 	init_MUTEX(&inode->i_data.i_shared_sem);
 	atomic_set(&inode->i_data.truncate_count, 0);
 	INIT_LIST_HEAD(&inode->i_data.private_list);
@@ -216,10 +215,8 @@ void __iget(struct inode * inode)
 		return;
 	}
 	atomic_inc(&inode->i_count);
-	if (!(inode->i_state & (I_DIRTY|I_LOCK))) {
-		list_del(&inode->i_list);
-		list_add(&inode->i_list, &inode_in_use);
-	}
+	if (!(inode->i_state & (I_DIRTY|I_LOCK)))
+		list_move(&inode->i_list, &inode_in_use);
 	inodes_stat.nr_unused--;
 }
 
@@ -304,8 +301,7 @@ static int invalidate_list(struct list_h
 		invalidate_inode_buffers(inode);
 		if (!atomic_read(&inode->i_count)) {
 			hlist_del_init(&inode->i_hash);
-			list_del(&inode->i_list);
-			list_add(&inode->i_list, dispose);
+			list_move(&inode->i_list, dispose);
 			inode->i_state |= I_FREEING;
 			count++;
 			continue;
@@ -1017,10 +1013,8 @@ static void generic_forget_inode(struct 
 	struct super_block *sb = inode->i_sb;
 
 	if (!hlist_unhashed(&inode->i_hash)) {
-		if (!(inode->i_state & (I_DIRTY|I_LOCK))) {
-			list_del(&inode->i_list);
-			list_add(&inode->i_list, &inode_unused);
-		}
+		if (!(inode->i_state & (I_DIRTY|I_LOCK)))
+			list_move(&inode->i_list, &inode_unused);
 		inodes_stat.nr_unused++;
 		spin_unlock(&inode_lock);
 		if (!sb || (sb->s_flags & MS_ACTIVE))
@@ -1216,15 +1210,13 @@ EXPORT_SYMBOL(inode_needs_sync);
  */
 #ifdef CONFIG_QUOTA
 
-/* Functions back in dquot.c */
-void put_dquot_list(struct list_head *);
+/* Function back in dquot.c */
 int remove_inode_dquot_ref(struct inode *, int, struct list_head *);
 
-void remove_dquot_ref(struct super_block *sb, int type)
+void remove_dquot_ref(struct super_block *sb, int type, struct list_head *tofree_head)
 {
 	struct inode *inode;
 	struct list_head *act_head;
-	LIST_HEAD(tofree_head);
 
 	if (!sb->dq_op)
 		return;	/* nothing to do */
@@ -1234,26 +1226,24 @@ void remove_dquot_ref(struct super_block
 	list_for_each(act_head, &inode_in_use) {
 		inode = list_entry(act_head, struct inode, i_list);
 		if (inode->i_sb == sb && IS_QUOTAINIT(inode))
-			remove_inode_dquot_ref(inode, type, &tofree_head);
+			remove_inode_dquot_ref(inode, type, tofree_head);
 	}
 	list_for_each(act_head, &inode_unused) {
 		inode = list_entry(act_head, struct inode, i_list);
 		if (inode->i_sb == sb && IS_QUOTAINIT(inode))
-			remove_inode_dquot_ref(inode, type, &tofree_head);
+			remove_inode_dquot_ref(inode, type, tofree_head);
 	}
 	list_for_each(act_head, &sb->s_dirty) {
 		inode = list_entry(act_head, struct inode, i_list);
 		if (IS_QUOTAINIT(inode))
-			remove_inode_dquot_ref(inode, type, &tofree_head);
+			remove_inode_dquot_ref(inode, type, tofree_head);
 	}
 	list_for_each(act_head, &sb->s_io) {
 		inode = list_entry(act_head, struct inode, i_list);
 		if (IS_QUOTAINIT(inode))
-			remove_inode_dquot_ref(inode, type, &tofree_head);
+			remove_inode_dquot_ref(inode, type, tofree_head);
 	}
 	spin_unlock(&inode_lock);
-
-	put_dquot_list(&tofree_head);
 }
 
 #endif
--- diff/fs/intermezzo/vfs.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/intermezzo/vfs.c	2004-04-21 10:45:35.268341896 +0100
@@ -2149,6 +2149,7 @@ again:  /* look the named file or a pare
         if ( error && error != -ENOENT ) {
                 EXIT;
                 unlock_kernel();
+		putname(tmp);
                 return error;
         } 
         if (error == -ENOENT)
@@ -2195,7 +2196,7 @@ again:  /* look the named file or a pare
         fd = get_unused_fd();
         if (fd < 0) {
                 EXIT;
-                goto cleanup_dput;
+                goto exit;
         }
 
         {
@@ -2205,10 +2206,9 @@ again:  /* look the named file or a pare
                 if (IS_ERR(f)) {
                         put_unused_fd(fd);
                         fd = error;
-                        EXIT;
-                        goto cleanup_dput;
-                }
-                fd_install(fd, f);
+                } else {
+	                fd_install(fd, f);
+		}
         }
         /* end of code that might be replaced by open_dentry */
 
@@ -2218,10 +2218,6 @@ exit:
         path_release(&nd);
         putname(tmp);
         return fd;
-
-cleanup_dput:
-        putname(&nd);
-        goto exit;
 }
 
 #ifdef CONFIG_FS_EXT_ATTR
--- diff/fs/isofs/inode.c	2004-01-19 10:22:59.000000000 +0000
+++ source/fs/isofs/inode.c	2004-04-21 10:45:35.269341744 +0100
@@ -119,12 +119,20 @@ static void destroy_inodecache(void)
 		printk(KERN_INFO "iso_inode_cache: not all structures were freed\n");
 }
 
+static int isofs_remount(struct super_block *sb, int *flags, char *data)
+{
+	/* we probably want a lot more here */
+	*flags |= MS_RDONLY;
+	return 0;
+}
+
 static struct super_operations isofs_sops = {
 	.alloc_inode	= isofs_alloc_inode,
 	.destroy_inode	= isofs_destroy_inode,
 	.read_inode	= isofs_read_inode,
 	.put_super	= isofs_put_super,
 	.statfs		= isofs_statfs,
+	.remount_fs	= isofs_remount,
 };
 
 /* the export_operations structure for describing
--- diff/fs/isofs/rock.c	2003-09-17 12:28:11.000000000 +0100
+++ source/fs/isofs/rock.c	2004-04-21 10:45:35.270341592 +0100
@@ -15,6 +15,7 @@
 #include <linux/pagemap.h>
 #include <linux/smp_lock.h>
 #include <linux/buffer_head.h>
+#include <asm/page.h>
 
 #include "rock.h"
 
@@ -358,7 +359,7 @@ int parse_rock_ridge_inode_internal(stru
   return 0;
 }
 
-static char *get_symlink_chunk(char *rpnt, struct rock_ridge *rr)
+static char *get_symlink_chunk(char *rpnt, struct rock_ridge *rr, char *plimit)
 {
 	int slen;
 	int rootflag;
@@ -370,16 +371,25 @@ static char *get_symlink_chunk(char *rpn
 		rootflag = 0;
 		switch (slp->flags & ~1) {
 		case 0:
+			if (slp->len > plimit - rpnt)
+				return NULL;
 			memcpy(rpnt, slp->text, slp->len);
 			rpnt+=slp->len;
 			break;
+		case 2:
+			if (rpnt >= plimit)
+				return NULL;
+			*rpnt++='.';
+			break;
 		case 4:
+			if (2 > plimit - rpnt)
+				return NULL;
 			*rpnt++='.';
-			/* fallthru */
-		case 2:
 			*rpnt++='.';
 			break;
 		case 8:
+			if (rpnt >= plimit)
+				return NULL;
 			rootflag = 1;
 			*rpnt++='/';
 			break;
@@ -396,17 +406,23 @@ static char *get_symlink_chunk(char *rpn
 			 * If there is another SL record, and this component
 			 * record isn't continued, then add a slash.
 			 */
-			if ((!rootflag) && (rr->u.SL.flags & 1) && !(oldslp->flags & 1))
+			if ((!rootflag) && (rr->u.SL.flags & 1) &&
+			    !(oldslp->flags & 1)) {
+				if (rpnt >= plimit)
+					return NULL;
 				*rpnt++='/';
+			}
 			break;
 		}
 
 		/*
 		 * If this component record isn't continued, then append a '/'.
 		 */
-		if (!rootflag && !(oldslp->flags & 1))
+		if (!rootflag && !(oldslp->flags & 1)) {
+			if (rpnt >= plimit)
+				return NULL;
 			*rpnt++='/';
-
+		}
 	}
 	return rpnt;
 }
@@ -487,7 +503,10 @@ static int rock_ridge_symlink_readpage(s
 			CHECK_SP(goto out);
 			break;
 		case SIG('S', 'L'):
-			rpnt = get_symlink_chunk(rpnt, rr);
+			rpnt = get_symlink_chunk(rpnt, rr,
+						 link + (PAGE_SIZE - 1));
+			if (rpnt == NULL)
+				goto out;
 			break;
 		case SIG('C', 'E'):
 			/* This tells is if there is a continuation record */
--- diff/fs/jbd/commit.c	2004-01-19 10:22:59.000000000 +0000
+++ source/fs/jbd/commit.c	2004-04-21 10:45:35.271341440 +0100
@@ -79,6 +79,21 @@ nope:
 }
 
 /*
+ * Try to acquire jbd_lock_bh_state() against the buffer, when j_list_lock is
+ * held.  For ranking reasons we must trylock.  If we lose, schedule away and
+ * return 0.  j_list_lock is dropped in this case.
+ */
+static int inverted_lock(journal_t *journal, struct buffer_head *bh)
+{
+	if (!jbd_trylock_bh_state(bh)) {
+		spin_unlock(&journal->j_list_lock);
+		schedule();
+		return 0;
+	}
+	return 1;
+}
+
+/*
  * journal_commit_transaction
  *
  * The primary function for committing a transaction to the log.  This
@@ -88,7 +103,6 @@ void journal_commit_transaction(journal_
 {
 	transaction_t *commit_transaction;
 	struct journal_head *jh, *new_jh, *descriptor;
-	struct journal_head *next_jh, *last_jh;
 	struct buffer_head *wbuf[64];
 	int bufs;
 	int flags;
@@ -222,114 +236,109 @@ void journal_commit_transaction(journal_
 	err = 0;
 	/*
 	 * Whenever we unlock the journal and sleep, things can get added
-	 * onto ->t_datalist, so we have to keep looping back to write_out_data
-	 * until we *know* that the list is empty.
+	 * onto ->t_sync_datalist, so we have to keep looping back to
+	 * write_out_data until we *know* that the list is empty.
 	 */
-write_out_data:
-
+	bufs = 0;
 	/*
 	 * Cleanup any flushed data buffers from the data list.  Even in
 	 * abort mode, we want to flush this out as soon as possible.
-	 *
-	 * We take j_list_lock to protect the lists from
-	 * journal_try_to_free_buffers().
 	 */
+write_out_data:
+	cond_resched();
 	spin_lock(&journal->j_list_lock);
 
-write_out_data_locked:
-	bufs = 0;
-	next_jh = commit_transaction->t_sync_datalist;
-	if (next_jh == NULL)
-		goto sync_datalist_empty;
-	last_jh = next_jh->b_tprev;
-
-	do {
+	while (commit_transaction->t_sync_datalist) {
 		struct buffer_head *bh;
 
-		jh = next_jh;
-		next_jh = jh->b_tnext;
+		jh = commit_transaction->t_sync_datalist;
+		commit_transaction->t_sync_datalist = jh->b_tnext;
 		bh = jh2bh(jh);
-		if (!buffer_locked(bh)) {
+		if (buffer_locked(bh)) {
+			BUFFER_TRACE(bh, "locked");
+			if (!inverted_lock(journal, bh))
+				goto write_out_data;
+			__journal_unfile_buffer(jh);
+			__journal_file_buffer(jh, commit_transaction,
+						BJ_Locked);
+			jbd_unlock_bh_state(bh);
+			if (need_resched()) {
+				spin_unlock(&journal->j_list_lock);
+				goto write_out_data;
+			}
+		} else {
 			if (buffer_dirty(bh)) {
 				BUFFER_TRACE(bh, "start journal writeout");
-				atomic_inc(&bh->b_count);
+				get_bh(bh);
 				wbuf[bufs++] = bh;
-			} else {
-				BUFFER_TRACE(bh, "writeout complete: unfile");
-				/*
-				 * We have a lock ranking problem..
-				 */
-				if (!jbd_trylock_bh_state(bh)) {
+				if (bufs == ARRAY_SIZE(wbuf)) {
+					jbd_debug(2, "submit %d writes\n",
+							bufs);
 					spin_unlock(&journal->j_list_lock);
-					schedule();
-					spin_lock(&journal->j_list_lock);
-					break;
+					ll_rw_block(WRITE, bufs, wbuf);
+					journal_brelse_array(wbuf, bufs);
+					bufs = 0;
+					goto write_out_data;
 				}
+			} else {
+				BUFFER_TRACE(bh, "writeout complete: unfile");
+				if (!inverted_lock(journal, bh))
+					goto write_out_data;
 				__journal_unfile_buffer(jh);
-				jh->b_transaction = NULL;
 				jbd_unlock_bh_state(bh);
 				journal_remove_journal_head(bh);
-				__brelse(bh);
-				if (need_resched() && commit_transaction->
-							t_sync_datalist) {
-					commit_transaction->t_sync_datalist =
-								next_jh;
-					if (bufs)
-						break;
+				put_bh(bh);
+				if (need_resched()) {
 					spin_unlock(&journal->j_list_lock);
-					cond_resched();
 					goto write_out_data;
 				}
 			}
 		}
-		if (bufs == ARRAY_SIZE(wbuf)) {
-			/*
-			 * Major speedup: start here on the next scan
-			 */
-			J_ASSERT(commit_transaction->t_sync_datalist != 0);
-			commit_transaction->t_sync_datalist = jh;
-			break;
-		}
-	} while (jh != last_jh);
+	}
 
-	if (bufs || need_resched()) {
-		jbd_debug(2, "submit %d writes\n", bufs);
+	if (bufs) {
 		spin_unlock(&journal->j_list_lock);
-		if (bufs)
-			ll_rw_block(WRITE, bufs, wbuf);
-		cond_resched();
+		ll_rw_block(WRITE, bufs, wbuf);
 		journal_brelse_array(wbuf, bufs);
 		spin_lock(&journal->j_list_lock);
-		goto write_out_data_locked;
 	}
 
 	/*
-	 * Wait for all previously submitted IO on the data list to complete.
+	 * Wait for all previously submitted IO to complete.
 	 */
-	jh = commit_transaction->t_sync_datalist;
-	if (jh == NULL)
-		goto sync_datalist_empty;
-
-	do {
+	while (commit_transaction->t_locked_list) {
 		struct buffer_head *bh;
-		jh = jh->b_tprev;	/* Wait on the last written */
+
+		jh = commit_transaction->t_locked_list->b_tprev;
 		bh = jh2bh(jh);
+		get_bh(bh);
 		if (buffer_locked(bh)) {
-			get_bh(bh);
 			spin_unlock(&journal->j_list_lock);
 			wait_on_buffer(bh);
 			if (unlikely(!buffer_uptodate(bh)))
 				err = -EIO;
+			spin_lock(&journal->j_list_lock);
+		}
+		if (!inverted_lock(journal, bh)) {
 			put_bh(bh);
-			/* the journal_head may have been removed now */
-			goto write_out_data;
-		} else if (buffer_dirty(bh)) {
-			goto write_out_data_locked;
+			spin_lock(&journal->j_list_lock);
+			continue;
 		}
-	} while (jh != commit_transaction->t_sync_datalist);
-	goto write_out_data_locked;
-
-sync_datalist_empty:
+		if (buffer_jbd(bh) && jh->b_jlist == BJ_Locked) {
+			__journal_unfile_buffer(jh);
+			jbd_unlock_bh_state(bh);
+			journal_remove_journal_head(bh);
+			put_bh(bh);
+		} else {
+			jbd_unlock_bh_state(bh);
+		}
+		put_bh(bh);
+		if (need_resched()) {
+			spin_unlock(&journal->j_list_lock);
+			cond_resched();
+			spin_lock(&journal->j_list_lock);
+		}
+	}
 	spin_unlock(&journal->j_list_lock);
 
 	journal_write_revoke_records(journal, commit_transaction);
@@ -533,24 +542,18 @@ wait_for_iobuf:
 		bh = jh2bh(jh);
 		if (buffer_locked(bh)) {
 			wait_on_buffer(bh);
-			if (unlikely(!buffer_uptodate(bh)))
-				err = -EIO;
 			goto wait_for_iobuf;
 		}
 
+		if (unlikely(!buffer_uptodate(bh)))
+			err = -EIO;
+
 		clear_buffer_jwrite(bh);
 
 		JBUFFER_TRACE(jh, "ph4: unfile after journal write");
 		journal_unfile_buffer(journal, jh);
 
 		/*
-		 * akpm: don't put back a buffer_head with stale pointers
-		 * dangling around.
-		 */
-		J_ASSERT_JH(jh, jh->b_transaction != NULL);
-		jh->b_transaction = NULL;
-
-		/*
 		 * ->t_iobuf_list should contain only dummy buffer_heads
 		 * which were created by journal_write_metadata_buffer().
 		 */
@@ -593,15 +596,15 @@ wait_for_iobuf:
 		bh = jh2bh(jh);
 		if (buffer_locked(bh)) {
 			wait_on_buffer(bh);
-			if (unlikely(!buffer_uptodate(bh)))
-				err = -EIO;
 			goto wait_for_ctlbuf;
 		}
 
+		if (unlikely(!buffer_uptodate(bh)))
+			err = -EIO;
+
 		BUFFER_TRACE(bh, "ph5: control buffer writeout done: unfile");
 		clear_buffer_jwrite(bh);
 		journal_unfile_buffer(journal, jh);
-		jh->b_transaction = NULL;
 		journal_put_journal_head(jh);
 		__brelse(bh);		/* One for getblk */
 		/* AKPM: bforget here */
@@ -754,7 +757,6 @@ skip_commit: /* The journal should be un
 			J_ASSERT_BH(bh, !buffer_dirty(bh));
 			J_ASSERT_JH(jh, jh->b_next_transaction == NULL);
 			__journal_unfile_buffer(jh);
-			jh->b_transaction = 0;
 			jbd_unlock_bh_state(bh);
 			journal_remove_journal_head(bh);  /* needs a brelse */
 			release_buffer_page(bh);
--- diff/fs/jbd/journal.c	2003-11-25 15:24:59.000000000 +0000
+++ source/fs/jbd/journal.c	2004-04-21 10:45:35.272341288 +0100
@@ -172,7 +172,7 @@ loop:
 		 */
 		jbd_debug(1, "Now suspending kjournald\n");
 		spin_unlock(&journal->j_state_lock);
-		refrigerator(PF_IOTHREAD);
+		refrigerator(PF_FREEZE);
 		spin_lock(&journal->j_state_lock);
 	} else {
 		/*
@@ -321,7 +321,6 @@ repeat:
 	}
 
 	mapped_data = kmap_atomic(new_page, KM_USER0);
-
 	/*
 	 * Check for escaping
 	 */
@@ -330,6 +329,7 @@ repeat:
 		need_copy_out = 1;
 		do_escape = 1;
 	}
+	kunmap_atomic(mapped_data, KM_USER0);
 
 	/*
 	 * Do we need to do a data copy?
@@ -337,7 +337,6 @@ repeat:
 	if (need_copy_out && !done_copy_out) {
 		char *tmp;
 
-		kunmap_atomic(mapped_data, KM_USER0);
 		jbd_unlock_bh_state(bh_in);
 		tmp = jbd_rep_kmalloc(bh_in->b_size, GFP_NOFS);
 		jbd_lock_bh_state(bh_in);
@@ -349,10 +348,8 @@ repeat:
 		jh_in->b_frozen_data = tmp;
 		mapped_data = kmap_atomic(new_page, KM_USER0);
 		memcpy(tmp, mapped_data + new_offset, jh2bh(jh_in)->b_size);
+		kunmap_atomic(mapped_data, KM_USER0);
 
-		/* If we get to this path, we'll always need the new
-		   address kmapped so that we can clear the escaped
-		   magic number below. */
 		new_page = virt_to_page(tmp);
 		new_offset = offset_in_page(tmp);
 		done_copy_out = 1;
@@ -362,9 +359,11 @@ repeat:
 	 * Did we need to do an escaping?  Now we've done all the
 	 * copying, we can finally do so.
 	 */
-	if (do_escape)
+	if (do_escape) {
+		mapped_data = kmap_atomic(new_page, KM_USER0);
 		*((unsigned int *)(mapped_data + new_offset)) = 0;
-	kunmap_atomic(mapped_data, KM_USER0);
+		kunmap_atomic(mapped_data, KM_USER0);
+	}
 
 	/* keep subsequent assertions sane */
 	new_bh->b_state = 0;
@@ -636,7 +635,7 @@ static journal_t * journal_init_common (
 	spin_lock_init(&journal->j_list_lock);
 	spin_lock_init(&journal->j_state_lock);
 
-	journal->j_commit_interval = (HZ * 5);
+	journal->j_commit_interval = (HZ * JBD_DEFAULT_MAX_COMMIT_AGE);
 
 	/* The journal is marked for error until we succeed with recovery! */
 	journal->j_flags = JFS_ABORT;
--- diff/fs/jbd/revoke.c	2003-08-26 10:00:54.000000000 +0100
+++ source/fs/jbd/revoke.c	2004-04-21 10:45:35.733271216 +0100
@@ -358,17 +358,15 @@ int journal_revoke(handle_t *handle, uns
 		bh2 = __find_get_block(bdev, blocknr, journal->j_blocksize);
 		if (bh2) {
 			/* ... and it has RevokeValid status... */
-			if ((bh2 != bh) &&
-			    test_bit(BH_RevokeValid, &bh2->b_state))
+			if (bh2 != bh && buffer_revokevalid(bh2))
 				/* ...then it better be revoked too,
 				 * since it's illegal to create a revoke
 				 * record against a buffer_head which is
 				 * not marked revoked --- that would
 				 * risk missing a subsequent revoke
 				 * cancel. */
-				J_ASSERT_BH(bh2, test_bit(BH_Revoked, &
-							  bh2->b_state));
-			__brelse(bh2);
+				J_ASSERT_BH(bh2, buffer_revoked(bh2));
+			put_bh(bh2);
 		}
 	}
 #endif
@@ -377,9 +375,9 @@ int journal_revoke(handle_t *handle, uns
            first having the revoke cancelled: it's illegal to free a
            block twice without allocating it in between! */
 	if (bh) {
-		J_ASSERT_BH(bh, !test_bit(BH_Revoked, &bh->b_state));
-		set_bit(BH_Revoked, &bh->b_state);
-		set_bit(BH_RevokeValid, &bh->b_state);
+		J_ASSERT_BH(bh, !buffer_revoked(bh));
+		set_buffer_revoked(bh);
+		set_buffer_revokevalid(bh);
 		if (bh_in) {
 			BUFFER_TRACE(bh_in, "call journal_forget");
 			journal_forget(handle, bh_in);
@@ -400,7 +398,7 @@ int journal_revoke(handle_t *handle, uns
  * Cancel an outstanding revoke.  For use only internally by the
  * journaling code (called from journal_get_write_access).
  *
- * We trust the BH_Revoked bit on the buffer if the buffer is already
+ * We trust buffer_revoked() on the buffer if the buffer is already
  * being journaled: if there is no revoke pending on the buffer, then we
  * don't do anything here.
  *
@@ -427,11 +425,11 @@ int journal_cancel_revoke(handle_t *hand
 	 * only perform the full cancel if the revoke bit is set.  If
 	 * not, we can't trust the revoke bit, and we need to do the
 	 * full search for a revoke record. */
-	if (test_and_set_bit(BH_RevokeValid, &bh->b_state))
-		need_cancel = (test_and_clear_bit(BH_Revoked, &bh->b_state));
-	else {
+	if (test_set_buffer_revokevalid(bh)) {
+		need_cancel = test_clear_buffer_revoked(bh);
+	} else {
 		need_cancel = 1;
-		clear_bit(BH_Revoked, &bh->b_state);
+		clear_buffer_revoked(bh);
 	}
 
 	if (need_cancel) {
@@ -462,7 +460,7 @@ int journal_cancel_revoke(handle_t *hand
 		bh2 = __find_get_block(bh->b_bdev, bh->b_blocknr, bh->b_size);
 		if (bh2) {
 			if (bh2 != bh)
-				clear_bit(BH_Revoked, &bh2->b_state);
+				clear_buffer_revoked(bh2);
 			__brelse(bh2);
 		}
 	}
@@ -597,24 +595,20 @@ static void flush_descriptor(journal_t *
 			     int offset)
 {
 	journal_revoke_header_t *header;
+	struct buffer_head *bh = jh2bh(descriptor);
 
 	if (is_journal_aborted(journal)) {
-		JBUFFER_TRACE(descriptor, "brelse");
-		__brelse(jh2bh(descriptor));
+		put_bh(bh);
 		return;
 	}
 
 	header = (journal_revoke_header_t *) jh2bh(descriptor)->b_data;
 	header->r_count = htonl(offset);
-	set_bit(BH_JWrite, &jh2bh(descriptor)->b_state);
-	{
-		struct buffer_head *bh = jh2bh(descriptor);
-		BUFFER_TRACE(bh, "write");
-		set_buffer_uptodate(bh);
-		ll_rw_block (WRITE, 1, &bh);
-	}
+	set_buffer_jwrite(bh);
+	BUFFER_TRACE(bh, "write");
+	set_buffer_uptodate(bh);
+	ll_rw_block(WRITE, 1, &bh);
 }
-
 #endif
 
 /* 
--- diff/fs/jbd/transaction.c	2004-02-09 10:36:12.000000000 +0000
+++ source/fs/jbd/transaction.c	2004-04-21 10:45:35.734271064 +0100
@@ -522,7 +522,6 @@ static void jbd_unexpected_dirty_buffer(
  * part of the transaction, that is).
  *
  */
-
 static int
 do_get_write_access(handle_t *handle, struct journal_head *jh,
 			int force_copy, int *credits) 
@@ -550,7 +549,6 @@ repeat:
 
 	lock_buffer(bh);
 	jbd_lock_bh_state(bh);
-	spin_lock(&journal->j_list_lock);
 
 	/* We now hold the buffer lock so it is safe to query the buffer
 	 * state.  Is the buffer dirty? 
@@ -566,9 +564,10 @@ repeat:
 	 * the buffer dirtied, ugh.)  */
 
 	if (buffer_dirty(bh)) {
-		/* First question: is this buffer already part of the
-		 * current transaction or the existing committing
-		 * transaction? */
+		/*
+		 * First question: is this buffer already part of the current
+		 * transaction or the existing committing transaction?
+		 */
 		if (jh->b_transaction) {
 			J_ASSERT_JH(jh,
 				jh->b_transaction == transaction || 
@@ -586,22 +585,23 @@ repeat:
 
 	error = -EROFS;
 	if (is_handle_aborted(handle)) {
-		spin_unlock(&journal->j_list_lock);
 		jbd_unlock_bh_state(bh);
-		goto out_unlocked;
+		goto out;
 	}
 	error = 0;
 
-	/* The buffer is already part of this transaction if
-	 * b_transaction or b_next_transaction points to it. */
-
+	/*
+	 * The buffer is already part of this transaction if b_transaction or
+	 * b_next_transaction points to it
+	 */
 	if (jh->b_transaction == transaction ||
 	    jh->b_next_transaction == transaction)
-		goto done_locked;
-
-	/* If there is already a copy-out version of this buffer, then
-	 * we don't need to make another one. */
+		goto done;
 
+	/*
+	 * If there is already a copy-out version of this buffer, then we don't
+	 * need to make another one
+	 */
 	if (jh->b_frozen_data) {
 		JBUFFER_TRACE(jh, "has frozen data");
 		J_ASSERT_JH(jh, jh->b_next_transaction == NULL);
@@ -611,7 +611,7 @@ repeat:
 		handle->h_buffer_credits--;
 		if (credits)
 			(*credits)++;
-		goto done_locked;
+		goto done;
 	}
 
 	/* Is there data here we need to preserve? */
@@ -635,7 +635,6 @@ repeat:
 			wait_queue_head_t *wqh;
 
 			JBUFFER_TRACE(jh, "on shadow: sleep");
-			spin_unlock(&journal->j_list_lock);
 			jbd_unlock_bh_state(bh);
 			/* commit wakes up all shadow buffers after IO */
 			wqh = bh_waitq_head(jh2bh(jh));
@@ -661,7 +660,6 @@ repeat:
 			JBUFFER_TRACE(jh, "generate frozen data");
 			if (!frozen_buffer) {
 				JBUFFER_TRACE(jh, "allocate memory for buffer");
-				spin_unlock(&journal->j_list_lock);
 				jbd_unlock_bh_state(bh);
 				frozen_buffer = jbd_kmalloc(jh2bh(jh)->b_size,
 							    GFP_NOFS);
@@ -672,12 +670,10 @@ repeat:
 					JBUFFER_TRACE(jh, "oom!");
 					error = -ENOMEM;
 					jbd_lock_bh_state(bh);
-					spin_lock(&journal->j_list_lock);
-					goto done_locked;
+					goto done;
 				}
 				goto repeat;
 			}
-
 			jh->b_frozen_data = frozen_buffer;
 			frozen_buffer = NULL;
 			need_copy = 1;
@@ -690,20 +686,22 @@ repeat:
 	if (credits)
 		(*credits)++;
 
-	/* Finally, if the buffer is not journaled right now, we need to
-	 * make sure it doesn't get written to disk before the caller
-	 * actually commits the new data. */
-
+	/*
+	 * Finally, if the buffer is not journaled right now, we need to make
+	 * sure it doesn't get written to disk before the caller actually
+	 * commits the new data
+	 */
 	if (!jh->b_transaction) {
 		JBUFFER_TRACE(jh, "no transaction");
 		J_ASSERT_JH(jh, !jh->b_next_transaction);
 		jh->b_transaction = transaction;
 		JBUFFER_TRACE(jh, "file as BJ_Reserved");
+		spin_lock(&journal->j_list_lock);
 		__journal_file_buffer(jh, transaction, BJ_Reserved);
+		spin_unlock(&journal->j_list_lock);
 	}
 
-done_locked:
-	spin_unlock(&journal->j_list_lock);
+done:
 	if (need_copy) {
 		struct page *page;
 		int offset;
@@ -719,11 +717,13 @@ done_locked:
 	}
 	jbd_unlock_bh_state(bh);
 
-	/* If we are about to journal a buffer, then any revoke pending
-           on it is no longer valid. */
+	/*
+	 * If we are about to journal a buffer, then any revoke pending on it is
+	 * no longer valid
+	 */
 	journal_cancel_revoke(handle, jh);
 
-out_unlocked:
+out:
 	if (frozen_buffer)
 		kfree(frozen_buffer);
 
@@ -1010,7 +1010,8 @@ int journal_dirty_data(handle_t *handle,
 			 * the write() data.
 			 */
 			if (jh->b_jlist != BJ_None &&
-					jh->b_jlist != BJ_SyncData) {
+					jh->b_jlist != BJ_SyncData &&
+					jh->b_jlist != BJ_Locked) {
 				JBUFFER_TRACE(jh, "Not stealing");
 				goto no_journal;
 			}
@@ -1037,7 +1038,6 @@ int journal_dirty_data(handle_t *handle,
 			if (jh->b_transaction != NULL) {
 				JBUFFER_TRACE(jh, "unfile from commit");
 				__journal_unfile_buffer(jh);
-				jh->b_transaction = NULL;
 			}
 			/* The buffer will be refiled below */
 
@@ -1048,11 +1048,10 @@ int journal_dirty_data(handle_t *handle,
 		 * committing transaction, so might still be left on that
 		 * transaction's metadata lists.
 		 */
-		if (jh->b_jlist != BJ_SyncData) {
+		if (jh->b_jlist != BJ_SyncData && jh->b_jlist != BJ_Locked) {
 			JBUFFER_TRACE(jh, "not on correct data list: unfile");
 			J_ASSERT_JH(jh, jh->b_jlist != BJ_Shadow);
 			__journal_unfile_buffer(jh);
-			jh->b_transaction = NULL;
 			JBUFFER_TRACE(jh, "file as data");
 			__journal_file_buffer(jh, handle->h_transaction,
 						BJ_SyncData);
@@ -1112,26 +1111,21 @@ int journal_dirty_metadata(handle_t *han
 	 * I _think_ we're OK here with SMP barriers - a mistaken decision will
 	 * result in this test being false, so we go in and take the locks.
 	 */
-	if (jh->b_transaction == handle->h_transaction &&
-					jh->b_jlist == BJ_Metadata) {
+	if (jh->b_transaction == transaction && jh->b_jlist == BJ_Metadata) {
 		JBUFFER_TRACE(jh, "fastpath");
 		J_ASSERT_JH(jh, jh->b_transaction ==
 					journal->j_running_transaction);
 		goto out_unlock_bh;
 	}
 
-	spin_lock(&journal->j_list_lock);
 	set_buffer_jbddirty(bh);
 
-	J_ASSERT_JH(jh, jh->b_transaction != NULL);
-
 	/* 
 	 * Metadata already on the current transaction list doesn't
 	 * need to be filed.  Metadata on another transaction's list must
 	 * be committing, and will be refiled once the commit completes:
 	 * leave it alone for now. 
 	 */
-
 	if (jh->b_transaction != transaction) {
 		JBUFFER_TRACE(jh, "already on other transaction");
 		J_ASSERT_JH(jh, jh->b_transaction ==
@@ -1139,17 +1133,15 @@ int journal_dirty_metadata(handle_t *han
 		J_ASSERT_JH(jh, jh->b_next_transaction == transaction);
 		/* And this case is illegal: we can't reuse another
 		 * transaction's data buffer, ever. */
-		/* FIXME: writepage() should be journalled */
-		goto out_unlock_list;
+		goto out_unlock_bh;
 	}
 
 	/* That test should have eliminated the following case: */
 	J_ASSERT_JH(jh, jh->b_frozen_data == 0);
 
 	JBUFFER_TRACE(jh, "file as BJ_Metadata");
+	spin_lock(&journal->j_list_lock);
 	__journal_file_buffer(jh, handle->h_transaction, BJ_Metadata);
-
-out_unlock_list:
 	spin_unlock(&journal->j_list_lock);
 out_unlock_bh:
 	jbd_unlock_bh_state(bh);
@@ -1227,7 +1219,6 @@ void journal_forget(handle_t *handle, st
 		J_ASSERT_JH(jh, !jh->b_committed_data);
 
 		__journal_unfile_buffer(jh);
-		jh->b_transaction = 0;
 
 		/* 
 		 * We are no longer going to journal this buffer.
@@ -1353,10 +1344,10 @@ int journal_stop(handle_t *handle)
 	 * by 30x or more...
 	 */
 	if (handle->h_sync) {
-		set_current_state(TASK_RUNNING);
 		do {
 			old_handle_count = transaction->t_handle_count;
-			schedule();
+			set_current_state(TASK_UNINTERRUPTIBLE);
+			schedule_timeout(1);
 		} while (old_handle_count != transaction->t_handle_count);
 	}
 
@@ -1515,7 +1506,7 @@ void __journal_unfile_buffer(struct jour
 
 	switch (jh->b_jlist) {
 	case BJ_None:
-		return;
+		goto out;
 	case BJ_SyncData:
 		list = &transaction->t_sync_datalist;
 		break;
@@ -1539,12 +1530,17 @@ void __journal_unfile_buffer(struct jour
 	case BJ_Reserved:
 		list = &transaction->t_reserved_list;
 		break;
+	case BJ_Locked:
+		list = &transaction->t_locked_list;
+		break;
 	}
 
 	__blist_del_buffer(list, jh);
 	jh->b_jlist = BJ_None;
 	if (test_clear_buffer_jbddirty(bh))
 		mark_buffer_dirty(bh);	/* Expose it to the VM */
+out:
+	jh->b_transaction = NULL;
 }
 
 void journal_unfile_buffer(journal_t *journal, struct journal_head *jh)
@@ -1576,11 +1572,10 @@ __journal_try_to_free_buffer(journal_t *
 
 	spin_lock(&journal->j_list_lock);
 	if (jh->b_transaction != 0 && jh->b_cp_transaction == 0) {
-		if (jh->b_jlist == BJ_SyncData) {
+		if (jh->b_jlist == BJ_SyncData || jh->b_jlist == BJ_Locked) {
 			/* A written-back ordered data buffer */
 			JBUFFER_TRACE(jh, "release data");
 			__journal_unfile_buffer(jh);
-			jh->b_transaction = 0;
 			journal_remove_journal_head(bh);
 			__brelse(bh);
 		}
@@ -1686,7 +1681,6 @@ static int __dispose_buffer(struct journ
 	struct buffer_head *bh = jh2bh(jh);
 
 	__journal_unfile_buffer(jh);
-	jh->b_transaction = 0;
 
 	if (jh->b_cp_transaction) {
 		JBUFFER_TRACE(jh, "on running+cp transaction");
@@ -1955,8 +1949,7 @@ void __journal_file_buffer(struct journa
 
 	if (jh->b_transaction)
 		__journal_unfile_buffer(jh);
-	else
-		jh->b_transaction = transaction;
+	jh->b_transaction = transaction;
 
 	switch (jlist) {
 	case BJ_None:
@@ -1985,6 +1978,9 @@ void __journal_file_buffer(struct journa
 	case BJ_Reserved:
 		list = &transaction->t_reserved_list;
 		break;
+	case BJ_Locked:
+		list =  &transaction->t_locked_list;
+		break;
 	}
 
 	__blist_add_buffer(list, jh);
@@ -2026,7 +2022,6 @@ void __journal_refile_buffer(struct jour
 	/* If the buffer is now unused, just drop it. */
 	if (jh->b_next_transaction == NULL) {
 		__journal_unfile_buffer(jh);
-		jh->b_transaction = NULL;
 		return;
 	}
 
--- diff/fs/jffs/inode-v23.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/jffs/inode-v23.c	2004-04-21 10:45:35.735270912 +0100
@@ -1771,6 +1771,12 @@ jffs_write_super(struct super_block *sb)
 	unlock_kernel();
 }
 
+static int jffs_remount(struct super_block *sb, int *flags, char *data)
+{
+	*flags |= MS_NODIRATIME;
+	return 0;
+}
+
 static struct super_operations jffs_ops =
 {
 	.read_inode	= jffs_read_inode,
@@ -1778,6 +1784,7 @@ static struct super_operations jffs_ops 
 	.put_super	= jffs_put_super,
 	.write_super	= jffs_write_super,
 	.statfs		= jffs_statfs,
+	.remount_fs	= jffs_remount,
 };
 
 static struct super_block *jffs_get_sb(struct file_system_type *fs_type,
--- diff/fs/jffs2/fs.c	2003-10-27 09:20:38.000000000 +0000
+++ source/fs/jffs2/fs.c	2004-04-21 10:45:35.735270912 +0100
@@ -350,7 +350,7 @@ int jffs2_remount_fs (struct super_block
 	if (!(*flags & MS_RDONLY))
 		jffs2_start_garbage_collect_thread(c);
 	
-	sb->s_flags = (sb->s_flags & ~MS_RDONLY)|(*flags & MS_RDONLY);
+	*flags |= MS_NOATIME;
 
 	return 0;
 }
--- diff/fs/jffs2/super.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/jffs2/super.c	2004-04-21 10:45:35.736270760 +0100
@@ -129,7 +129,7 @@ static struct super_block *jffs2_get_sb_
 		  mtd->index, mtd->name));
 
 	sb->s_op = &jffs2_super_operations;
-	sb->s_flags |= MS_NODIRATIME;
+	sb->s_flags |= MS_NOATIME;
 
 	ret = jffs2_do_fill_super(sb, data, (flags&MS_VERBOSE)?1:0);
 
--- diff/fs/jfs/inode.c	2004-02-09 10:36:12.000000000 +0000
+++ source/fs/jfs/inode.c	2004-04-21 10:45:35.736270760 +0100
@@ -302,8 +302,8 @@ static sector_t jfs_bmap(struct address_
 	return generic_block_bmap(mapping, block, jfs_get_block);
 }
 
-static int jfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
-			loff_t offset, unsigned long nr_segs)
+static ssize_t jfs_direct_IO(int rw, struct kiocb *iocb,
+	const struct iovec *iov, loff_t offset, unsigned long nr_segs)
 {
 	struct file *file = iocb->ki_filp;
 	struct inode *inode = file->f_mapping->host;
--- diff/fs/jfs/jfs_logmgr.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/jfs/jfs_logmgr.c	2004-04-21 10:45:35.737270608 +0100
@@ -1975,8 +1975,7 @@ static int lbmRead(struct jfs_log * log,
 
 	bio->bi_end_io = lbmIODone;
 	bio->bi_private = bp;
-	submit_bio(READ, bio);
-	blk_run_queues();
+	submit_bio(READ_SYNC, bio);
 
 	wait_event(bp->l_ioevent, (bp->l_flag != lbmREAD));
 
@@ -2120,9 +2119,8 @@ static void lbmStartIO(struct lbuf * bp)
 
 	/* check if journaling to disk has been disabled */
 	if (!log->no_integrity) {
-		submit_bio(WRITE, bio);
+		submit_bio(WRITE_SYNC, bio);
 		INCREMENT(lmStat.submitted);
-		blk_run_queues();
 	}
 	else {
 		bio->bi_size = 0;
@@ -2330,7 +2328,7 @@ int jfsIOWait(void *arg)
 		}
 		if (current->flags & PF_FREEZE) {
 			spin_unlock_irq(&log_redrive_lock);
-			refrigerator(PF_IOTHREAD);
+			refrigerator(PF_FREEZE);
 		} else {
 			add_wait_queue(&jfs_IO_thread_wait, &wq);
 			set_current_state(TASK_INTERRUPTIBLE);
--- diff/fs/jfs/jfs_txnmgr.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/jfs/jfs_txnmgr.c	2004-04-21 10:45:35.739270304 +0100
@@ -2813,7 +2813,7 @@ restart:
 
 		if (current->flags & PF_FREEZE) {
 			LAZY_UNLOCK(flags);
-			refrigerator(PF_IOTHREAD);
+			refrigerator(PF_FREEZE);
 		} else {
 			DECLARE_WAITQUEUE(wq, current);
 
@@ -2977,11 +2977,12 @@ int jfs_sync(void *arg)
 					    anon_inode_list);
 			ip = &jfs_ip->vfs_inode;
 
-			/*
-			 * down_trylock returns 0 on success.  This is
-			 * inconsistent with spin_trylock.
-			 */
-			if (! down_trylock(&jfs_ip->commit_sem)) {
+			if (! igrab(ip)) {
+				/*
+				 * Inode is being freed
+				 */
+				list_del_init(&jfs_ip->anon_inode_list);
+			} else if (! down_trylock(&jfs_ip->commit_sem)) {
 				/*
 				 * inode will be removed from anonymous list
 				 * when it is committed
@@ -2991,6 +2992,8 @@ int jfs_sync(void *arg)
 				rc = txCommit(tid, 1, &ip, 0);
 				txEnd(tid);
 				up(&jfs_ip->commit_sem);
+
+				iput(ip);
 				/*
 				 * Just to be safe.  I don't know how
 				 * long we can run without blocking
@@ -3010,6 +3013,10 @@ int jfs_sync(void *arg)
 				/* Put on anon_list2 */
 				list_add(&jfs_ip->anon_inode_list,
 					 &TxAnchor.anon_list2);
+
+				TXN_UNLOCK();
+				iput(ip);
+				TXN_LOCK();
 			}
 		}
 		/* Add anon_list2 back to anon_list */
@@ -3017,7 +3024,7 @@ int jfs_sync(void *arg)
 
 		if (current->flags & PF_FREEZE) {
 			TXN_UNLOCK();
-			refrigerator(PF_IOTHREAD);
+			refrigerator(PF_FREEZE);
 		} else {
 			DECLARE_WAITQUEUE(wq, current);
 
--- diff/fs/lockd/clntlock.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/lockd/clntlock.c	2004-04-21 10:45:35.739270304 +0100
@@ -228,7 +228,6 @@ restart:
 	}
 
 	host->h_reclaiming = 0;
-	wake_up(&host->h_gracewait);
 
 	/* Now, wake up all processes that sleep on a blocked lock */
 	for (block = nlm_blocked; block; block = block->b_next) {
--- diff/fs/lockd/clntproc.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/lockd/clntproc.c	2004-04-21 10:45:35.740270152 +0100
@@ -217,6 +217,21 @@ nlmclnt_alloc_call(void)
 	return NULL;
 }
 
+static int nlm_wait_on_grace(wait_queue_head_t *queue)
+{
+	DEFINE_WAIT(wait);
+	int status = -EINTR;
+
+	prepare_to_wait(queue, &wait, TASK_INTERRUPTIBLE);
+	if (!signalled ()) {
+		schedule_timeout(NLMCLNT_GRACE_WAIT);
+		if (!signalled ())
+			status = 0;
+	}
+	finish_wait(queue, &wait);
+	return status;
+}
+
 /*
  * Generic NLM call
  */
@@ -241,10 +256,8 @@ nlmclnt_call(struct nlm_rqst *req, u32 p
 		msg.rpc_cred = nfs_file_cred(filp);
 
 	do {
-		if (host->h_reclaiming && !argp->reclaim) {
-			interruptible_sleep_on(&host->h_gracewait);
-			continue;
-		}
+		if (host->h_reclaiming && !argp->reclaim)
+			goto in_grace_period;
 
 		/* If we have no RPC client yet, create one. */
 		if ((clnt = nlm_bind_host(host)) == NULL)
@@ -279,22 +292,23 @@ nlmclnt_call(struct nlm_rqst *req, u32 p
 				return -ENOLCK;
 			}
 		} else {
+			if (!argp->reclaim) {
+				/* We appear to be out of the grace period */
+				wake_up_all(&host->h_gracewait);
+			}
 			dprintk("lockd: server returns status %d\n", resp->status);
 			return 0;	/* Okay, call complete */
 		}
 
-		/* Back off a little and try again */
-		interruptible_sleep_on_timeout(&host->h_gracewait, 15*HZ);
-
-		/* When the lock requested by F_SETLKW isn't available,
-		   we will wait until the request can be satisfied. If
-		   a signal is received during wait, we should return
-		   -EINTR. */
-		if (signalled ()) {
-			status = -EINTR;
-			break;
-		}
-	} while (1);
+in_grace_period:
+		/*
+		 * The server has rebooted and appears to be in the grace
+		 * period during which locks are only allowed to be
+		 * reclaimed.
+		 * We can only back off and try again later.
+		 */
+		status = nlm_wait_on_grace(&host->h_gracewait);
+	} while (status == 0);
 
 	return status;
 }
--- diff/fs/locks.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/locks.c	2004-04-21 10:45:35.741270000 +0100
@@ -1453,13 +1453,10 @@ int fcntl_setlk(struct file *filp, unsig
 	 * and shared.
 	 */
 	if (IS_MANDLOCK(inode) &&
-	    (inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID) {
-		struct address_space *mapping = filp->f_mapping;
-
-		if (!list_empty(&mapping->i_mmap_shared)) {
-			error = -EAGAIN;
-			goto out;
-		}
+	    (inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID &&
+	    mapping_writably_mapped(filp->f_mapping)) {
+		error = -EAGAIN;
+		goto out;
 	}
 
 	error = flock_to_posix_lock(filp, file_lock, &flock);
@@ -1591,13 +1588,10 @@ int fcntl_setlk64(struct file *filp, uns
 	 * and shared.
 	 */
 	if (IS_MANDLOCK(inode) &&
-	    (inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID) {
-		struct address_space *mapping = filp->f_mapping;
-
-		if (!list_empty(&mapping->i_mmap_shared)) {
-			error = -EAGAIN;
-			goto out;
-		}
+	    (inode->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID &&
+	    mapping_writably_mapped(filp->f_mapping)) {
+		error = -EAGAIN;
+		goto out;
 	}
 
 	error = flock64_to_posix_lock(filp, file_lock, &flock);
--- diff/fs/mpage.c	2003-08-26 10:00:54.000000000 +0100
+++ source/fs/mpage.c	2004-04-21 10:45:35.742269848 +0100
@@ -329,10 +329,10 @@ mpage_readpages(struct address_space *ma
 
 	pagevec_init(&lru_pvec, 0);
 	for (page_idx = 0; page_idx < nr_pages; page_idx++) {
-		struct page *page = list_entry(pages->prev, struct page, list);
+		struct page *page = list_entry(pages->prev, struct page, lru);
 
 		prefetchw(&page->flags);
-		list_del(&page->list);
+		list_del(&page->lru);
 		if (!add_to_page_cache(page, mapping,
 					page->index, GFP_KERNEL)) {
 			bio = do_mpage_readpage(bio, page,
@@ -485,8 +485,7 @@ mpage_writepage(struct bio *bio, struct 
 			break;
 		block_in_file++;
 	}
-	if (page_block == 0)
-		buffer_error();
+	BUG_ON(page_block == 0);
 
 	first_unmapped = page_block;
 
@@ -546,7 +545,7 @@ alloc_new:
 	}
 
 	BUG_ON(PageWriteback(page));
-	SetPageWriteback(page);
+	set_page_writeback(page);
 	unlock_page(page);
 	if (boundary || (first_unmapped != blocks_per_page)) {
 		bio = mpage_bio_submit(WRITE, bio);
@@ -589,31 +588,13 @@ out:
  * This is a library function, which implements the writepages()
  * address_space_operation.
  *
- * (The next two paragraphs refer to code which isn't here yet, but they
- *  explain the presence of address_space.io_pages)
- *
- * Pages can be moved from clean_pages or locked_pages onto dirty_pages
- * at any time - it's not possible to lock against that.  So pages which
- * have already been added to a BIO may magically reappear on the dirty_pages
- * list.  And mpage_writepages() will again try to lock those pages.
- * But I/O has not yet been started against the page.  Thus deadlock.
- *
- * To avoid this, mpage_writepages() will only write pages from io_pages. The
- * caller must place them there.  We walk io_pages, locking the pages and
- * submitting them for I/O, moving them to locked_pages.
- *
- * This has the added benefit of preventing a livelock which would otherwise
- * occur if pages are being dirtied faster than we can write them out.
- *
  * If a page is already under I/O, generic_writepages() skips it, even
  * if it's dirty.  This is desirable behaviour for memory-cleaning writeback,
  * but it is INCORRECT for data-integrity system calls such as fsync().  fsync()
  * and msync() need to guarantee that all the data which was dirty at the time
- * the call was made get new I/O started against them.  So if called_for_sync()
- * is true, we must wait for existing IO to complete.
- *
- * It's fairly rare for PageWriteback pages to be on ->dirty_pages.  It
- * means that someone redirtied the page while it was under I/O.
+ * the call was made get new I/O started against them.  If wbc->sync_mode is
+ * WB_SYNC_ALL then we were called for data integrity and we must wait for
+ * existing IO to complete.
  */
 int
 mpage_writepages(struct address_space *mapping,
@@ -625,6 +606,10 @@ mpage_writepages(struct address_space *m
 	int ret = 0;
 	int done = 0;
 	int (*writepage)(struct page *page, struct writeback_control *wbc);
+	struct pagevec pvec;
+	int nr_pages;
+	pgoff_t index;
+	int scanned = 0;
 
 	if (wbc->nonblocking && bdi_write_congested(bdi)) {
 		wbc->encountered_congestion = 1;
@@ -635,42 +620,41 @@ mpage_writepages(struct address_space *m
 	if (get_block == NULL)
 		writepage = mapping->a_ops->writepage;
 
-	spin_lock(&mapping->page_lock);
-	while (!list_empty(&mapping->io_pages) && !done) {
-		struct page *page = list_entry(mapping->io_pages.prev,
-					struct page, list);
-		list_del(&page->list);
-		if (PageWriteback(page) && wbc->sync_mode == WB_SYNC_NONE) {
-			if (PageDirty(page)) {
-				list_add(&page->list, &mapping->dirty_pages);
+	pagevec_init(&pvec, 0);
+	if (wbc->sync_mode == WB_SYNC_NONE) {
+		index = mapping->writeback_index; /* Start from prev offset */
+	} else {
+		index = 0;			  /* whole-file sweep */
+		scanned = 1;
+	}
+retry:
+	while (!done && (nr_pages = pagevec_lookup_tag(&pvec, mapping, &index,
+					PAGECACHE_TAG_DIRTY, PAGEVEC_SIZE))) {
+		unsigned i;
+
+		scanned = 1;
+		for (i = 0; i < nr_pages; i++) {
+			struct page *page = pvec.pages[i];
+
+			/*
+			 * At this point we hold neither mapping->tree_lock nor
+			 * lock on the page itself: the page may be truncated or
+			 * invalidated (changing page->mapping to NULL), or even
+			 * swizzled back from swapper_space to tmpfs file
+			 * mapping
+			 */
+
+			lock_page(page);
+
+			if (wbc->sync_mode != WB_SYNC_NONE)
+				wait_on_page_writeback(page);
+
+			if (page->mapping != mapping || PageWriteback(page) ||
+					!clear_page_dirty_for_io(page)) {
+				unlock_page(page);
 				continue;
 			}
-			list_add(&page->list, &mapping->locked_pages);
-			continue;
-		}
-		if (!PageDirty(page)) {
-			list_add(&page->list, &mapping->clean_pages);
-			continue;
-		}
-		list_add(&page->list, &mapping->locked_pages);
 
-		page_cache_get(page);
-		spin_unlock(&mapping->page_lock);
-
-		/*
-		 * At this point we hold neither mapping->page_lock nor
-		 * lock on the page itself: the page may be truncated or
-		 * invalidated (changing page->mapping to NULL), or even
-		 * swizzled back from swapper_space to tmpfs file mapping.
-		 */
-
-		lock_page(page);
-
-		if (wbc->sync_mode != WB_SYNC_NONE)
-			wait_on_page_writeback(page);
-
-		if (page->mapping == mapping && !PageWriteback(page) &&
-					test_clear_page_dirty(page)) {
 			if (writepage) {
 				ret = (*writepage)(page, wbc);
 				if (ret) {
@@ -683,7 +667,7 @@ mpage_writepages(struct address_space *m
 				}
 			} else {
 				bio = mpage_writepage(bio, page, get_block,
-					&last_block_in_bio, &ret, wbc);
+						&last_block_in_bio, &ret, wbc);
 			}
 			if (ret || (--(wbc->nr_to_write) <= 0))
 				done = 1;
@@ -691,16 +675,20 @@ mpage_writepages(struct address_space *m
 				wbc->encountered_congestion = 1;
 				done = 1;
 			}
-		} else {
-			unlock_page(page);
 		}
-		page_cache_release(page);
-		spin_lock(&mapping->page_lock);
+		pagevec_release(&pvec);
+		cond_resched();
 	}
-	/*
-	 * Leave any remaining dirty pages on ->io_pages
-	 */
-	spin_unlock(&mapping->page_lock);
+	if (!scanned && !done) {
+		/*
+		 * We hit the last page and there is more work to be done: wrap
+		 * back to the start of the file
+		 */
+		scanned = 1;
+		index = 0;
+		goto retry;
+	}
+	mapping->writeback_index = index;
 	if (bio)
 		mpage_bio_submit(WRITE, bio);
 	return ret;
--- diff/fs/namei.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/namei.c	2004-04-21 10:45:35.743269696 +0100
@@ -26,6 +26,7 @@
 #include <linux/personality.h>
 #include <linux/security.h>
 #include <linux/mount.h>
+#include <linux/audit.h>
 #include <asm/namei.h>
 #include <asm/uaccess.h>
 
@@ -141,10 +142,12 @@ char * getname(const char __user * filen
 
 		result = tmp;
 		if (retval < 0) {
-			putname(tmp);
+			__putname(tmp);
 			result = ERR_PTR(retval);
 		}
 	}
+	if (unlikely(current->audit_context) && !IS_ERR(result) && result)
+		audit_getname(result);
 	return result;
 }
 
@@ -860,6 +863,8 @@ walk_init_root(const char *name, struct 
 
 int fastcall path_lookup(const char *name, unsigned int flags, struct nameidata *nd)
 {
+	int retval;
+
 	nd->last_type = LAST_ROOT; /* if there are only slashes... */
 	nd->flags = flags;
 
@@ -882,7 +887,13 @@ int fastcall path_lookup(const char *nam
 	}
 	read_unlock(&current->fs->lock);
 	current->total_link_count = 0;
-	return link_path_walk(name, nd);
+	retval = link_path_walk(name, nd);
+	if (unlikely(current->audit_context
+		     && nd && nd->dentry && nd->dentry->d_inode))
+		audit_inode(name,
+			    nd->dentry->d_inode->i_ino,
+			    nd->dentry->d_inode->i_rdev);
+	return retval;
 }
 
 /*
--- diff/fs/namespace.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/namespace.c	2004-04-21 10:45:35.744269544 +0100
@@ -24,7 +24,15 @@
 #include <asm/uaccess.h>
 
 extern int __init init_rootfs(void);
+
+#ifdef CONFIG_SYSFS
 extern int __init sysfs_init(void);
+#else
+static inline int sysfs_init(void)
+{
+	return 0;
+}
+#endif
 
 /* spinlock for vfsmount related operations, inplace of dcache_lock */
 spinlock_t vfsmount_lock __cacheline_aligned_in_smp = SPIN_LOCK_UNLOCKED;
@@ -769,7 +777,7 @@ long do_mount(char * dev_name, char * di
 		mnt_flags |= MNT_NODEV;
 	if (flags & MS_NOEXEC)
 		mnt_flags |= MNT_NOEXEC;
-	flags &= ~(MS_NOSUID|MS_NOEXEC|MS_NODEV);
+	flags &= ~(MS_NOSUID|MS_NOEXEC|MS_NODEV|MS_ACTIVE);
 
 	/* ... and get the mountpoint */
 	retval = path_lookup(dir_name, LOOKUP_FOLLOW, &nd);
--- diff/fs/ncpfs/inode.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/ncpfs/inode.c	2004-04-21 10:45:35.744269544 +0100
@@ -85,6 +85,12 @@ static void destroy_inodecache(void)
 		printk(KERN_INFO "ncp_inode_cache: not all structures were freed\n");
 }
 
+static int ncp_remount(struct super_block *sb, int *flags, char* data)
+{
+	*flags |= MS_NODIRATIME;
+	return 0;
+}
+
 static struct super_operations ncp_sops =
 {
 	.alloc_inode	= ncp_alloc_inode,
@@ -93,6 +99,7 @@ static struct super_operations ncp_sops 
 	.delete_inode	= ncp_delete_inode,
 	.put_super	= ncp_put_super,
 	.statfs		= ncp_statfs,
+	.remount_fs	= ncp_remount,
 };
 
 extern struct dentry_operations ncp_root_dentry_operations;
--- diff/fs/nfs/direct.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/nfs/direct.c	2004-04-21 10:45:35.745269392 +0100
@@ -128,6 +128,7 @@ nfs_direct_read_seg(struct inode *inode,
 		.inode		= inode,
 		.args		= {
 			.fh		= NFS_FH(inode),
+			.lockowner	= current->files,
 		},
 		.res		= {
 			.fattr		= &rdata.fattr,
@@ -190,16 +191,17 @@ nfs_direct_read_seg(struct inode *inode,
  * writes so that this read will see them when we read from the
  * server.
  */
-static int
+static ssize_t
 nfs_direct_read(struct inode *inode, struct file *file,
 		const struct iovec *iov, loff_t file_offset,
 		unsigned long nr_segs)
 {
-	int tot_bytes = 0;
+	ssize_t tot_bytes = 0;
 	unsigned long seg = 0;
 
 	while ((seg < nr_segs) && (tot_bytes >= 0)) {
-		int result, page_count;
+		ssize_t result;
+		int page_count;
 		struct page **pages;
 		const struct iovec *vec = &iov[seg++];
 		unsigned long user_addr = (unsigned long) vec->iov_base;
@@ -258,6 +260,7 @@ nfs_direct_write_seg(struct inode *inode
 		.inode		= inode,
 		.args		= {
 			.fh		= NFS_FH(inode),
+			.lockowner	= current->files,
 		},
 		.res		= {
 			.fattr		= &wdata.fattr,
@@ -335,8 +338,7 @@ retry:
 						VERF_SIZE) != 0)
 			goto sync_retry;
 	}
-	nfs_end_data_update(inode);
-	NFS_FLAGS(inode) |= NFS_INO_INVALID_DATA;
+	nfs_end_data_update_defer(inode);
 
 	return tot_bytes;
 
@@ -358,16 +360,17 @@ sync_retry:
  * that non-direct readers might access, so they will pick up these
  * writes immediately.
  */
-static int
+static ssize_t
 nfs_direct_write(struct inode *inode, struct file *file,
 		const struct iovec *iov, loff_t file_offset,
 		unsigned long nr_segs)
 {
-	int tot_bytes = 0;
+	ssize_t tot_bytes = 0;
 	unsigned long seg = 0;
 
 	while ((seg < nr_segs) && (tot_bytes >= 0)) {
-		int result, page_count;
+		ssize_t result;
+		int page_count;
 		struct page **pages;
 		const struct iovec *vec = &iov[seg++];
 		unsigned long user_addr = (unsigned long) vec->iov_base;
@@ -395,10 +398,6 @@ nfs_direct_write(struct inode *inode, st
 		if (result < size)
 			break;
 	}
-	/* Zap the page cache if we managed to write */
-	if (tot_bytes > 0)
-		invalidate_remote_inode(inode);
-
 	return tot_bytes;
 }
 
@@ -417,11 +416,11 @@ nfs_direct_write(struct inode *inode, st
  * The inode's i_sem is no longer held by the VFS layer before it calls
  * this function to do a write.
  */
-int
+ssize_t
 nfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
 		loff_t file_offset, unsigned long nr_segs)
 {
-	int result = -EINVAL;
+	ssize_t result = -EINVAL;
 	struct file *file = iocb->ki_filp;
 	struct dentry *dentry = file->f_dentry;
 	struct inode *inode = dentry->d_inode;
--- diff/fs/nfs/file.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/nfs/file.c	2004-04-21 10:45:35.745269392 +0100
@@ -33,6 +33,8 @@
 
 #define NFSDBG_FACILITY		NFSDBG_FILE
 
+static long nfs_file_fcntl(int fd, unsigned int cmd,
+			unsigned long arg, struct file *filp);
 static int nfs_file_open(struct inode *, struct file *);
 static int nfs_file_release(struct inode *, struct file *);
 static int  nfs_file_mmap(struct file *, struct vm_area_struct *);
@@ -55,6 +57,7 @@ struct file_operations nfs_file_operatio
 	.fsync		= nfs_fsync,
 	.lock		= nfs_lock,
 	.sendfile	= nfs_file_sendfile,
+	.fcntl		= nfs_file_fcntl,
 };
 
 struct inode_operations nfs_file_inode_operations = {
@@ -68,6 +71,28 @@ struct inode_operations nfs_file_inode_o
 # define IS_SWAPFILE(inode)	(0)
 #endif
 
+#define nfs_invalid_flags	(O_APPEND | O_DIRECT)
+
+/*
+ * Check for special cases that NFS doesn't support, and
+ * pass the rest to the generic fcntl function.
+ */
+static long
+nfs_file_fcntl(int fd, unsigned int cmd,
+		unsigned long arg, struct file *filp)
+{
+	switch (cmd) {
+	case F_SETFL:
+		if ((filp->f_flags & nfs_invalid_flags) == nfs_invalid_flags)
+			return -EINVAL;
+		break;
+	default:
+		break;
+	}
+
+	return generic_file_fcntl(fd, cmd, arg, filp);
+}
+
 /*
  * Open file
  */
@@ -78,6 +103,9 @@ nfs_file_open(struct inode *inode, struc
 	int (*open)(struct inode *, struct file *);
 	int res = 0;
 
+	if ((filp->f_flags & nfs_invalid_flags) == nfs_invalid_flags)
+		return -EINVAL;
+
 	lock_kernel();
 	/* Do NFSv4 open() call */
 	if ((open = server->rpc_ops->file_open) != NULL)
--- diff/fs/nfs/inode.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/nfs/inode.c	2004-04-21 10:45:35.746269240 +0100
@@ -1012,6 +1012,8 @@ void nfs_begin_data_update(struct inode 
  * nfs_end_data_update
  * @inode - pointer to inode
  * Declare end of the operations that will update file data
+ * This will mark the inode as immediately needing revalidation
+ * of its attribute cache.
  */
 void nfs_end_data_update(struct inode *inode)
 {
@@ -1027,6 +1029,27 @@ void nfs_end_data_update(struct inode *i
 }
 
 /**
+ * nfs_end_data_update_defer
+ * @inode - pointer to inode
+ * Declare end of the operations that will update file data
+ * This will defer marking the inode as needing revalidation
+ * unless there are no other pending updates.
+ */
+void nfs_end_data_update_defer(struct inode *inode)
+{
+	struct nfs_inode *nfsi = NFS_I(inode);
+
+	if (atomic_dec_and_test(&nfsi->data_updates)) {
+		/* Mark the attribute cache for revalidation */
+		nfsi->flags |= NFS_INO_INVALID_ATTR;
+		/* Directories and symlinks: invalidate page cache too */
+		if (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))
+			nfsi->flags |= NFS_INO_INVALID_DATA;
+		nfsi->cache_change_attribute ++;
+	}
+}
+
+/**
  * nfs_refresh_inode - verify consistency of the inode attribute cache
  * @inode - pointer to inode
  * @fattr - updated attributes
--- diff/fs/nfs/nfs2xdr.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/nfs/nfs2xdr.c	2004-04-21 10:45:35.747269088 +0100
@@ -231,7 +231,7 @@ nfs_xdr_readargs(struct rpc_rqst *req, u
 static int
 nfs_xdr_readres(struct rpc_rqst *req, u32 *p, struct nfs_readres *res)
 {
-	struct iovec *iov = req->rq_rvec;
+	struct iovec *iov = req->rq_rcv_buf.head;
 	int	status, count, recvd, hdrlen;
 
 	if ((status = ntohl(*p++)))
@@ -250,7 +250,7 @@ nfs_xdr_readres(struct rpc_rqst *req, u3
 		xdr_shift_buf(&req->rq_rcv_buf, iov->iov_len - hdrlen);
 	}
 
-	recvd = req->rq_received - hdrlen;
+	recvd = req->rq_rcv_buf.len - hdrlen;
 	if (count > recvd) {
 		printk(KERN_WARNING "NFS: server cheating in read reply: "
 			"count %d > recvd %d\n", count, recvd);
@@ -396,7 +396,7 @@ nfs_xdr_readdirres(struct rpc_rqst *req,
 	}
 
 	pglen = rcvbuf->page_len;
-	recvd = req->rq_received - hdrlen;
+	recvd = rcvbuf->len - hdrlen;
 	if (pglen > recvd)
 		pglen = recvd;
 	page = rcvbuf->pages;
--- diff/fs/nfs/nfs3proc.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/nfs/nfs3proc.c	2004-04-21 10:45:35.747269088 +0100
@@ -729,11 +729,10 @@ nfs3_read_done(struct rpc_task *task)
 }
 
 static void
-nfs3_proc_read_setup(struct nfs_read_data *data, unsigned int count)
+nfs3_proc_read_setup(struct nfs_read_data *data)
 {
 	struct rpc_task		*task = &data->task;
 	struct inode		*inode = data->inode;
-	struct nfs_page		*req;
 	int			flags;
 	struct rpc_message	msg = {
 		.rpc_proc	= &nfs3_procedures[NFS3PROC_READ],
@@ -741,27 +740,13 @@ nfs3_proc_read_setup(struct nfs_read_dat
 		.rpc_resp	= &data->res,
 		.rpc_cred	= data->cred,
 	};
-	
-	req = nfs_list_entry(data->pages.next);
-	data->args.fh     = NFS_FH(inode);
-	data->args.offset = req_offset(req);
-	data->args.pgbase = req->wb_pgbase;
-	data->args.pages  = data->pagevec;
-	data->args.count  = count;
-	data->res.fattr   = &data->fattr;
-	data->res.count   = count;
-	data->res.eof     = 0;
-	
+
 	/* N.B. Do we need to test? Never called for swapfile inode */
 	flags = RPC_TASK_ASYNC | (IS_SWAPFILE(inode)? NFS_RPC_SWAPFLAGS : 0);
 
 	/* Finalize the task. */
 	rpc_init_task(task, NFS_CLIENT(inode), nfs3_read_done, flags);
-	task->tk_calldata = data;
-	/* Release requests */
-	task->tk_release = nfs_readdata_release;
-
-	rpc_call_setup(&data->task, &msg, 0);
+	rpc_call_setup(task, &msg, 0);
 }
 
 static void
@@ -778,11 +763,10 @@ nfs3_write_done(struct rpc_task *task)
 }
 
 static void
-nfs3_proc_write_setup(struct nfs_write_data *data, unsigned int count, int how)
+nfs3_proc_write_setup(struct nfs_write_data *data, int how)
 {
 	struct rpc_task		*task = &data->task;
 	struct inode		*inode = data->inode;
-	struct nfs_page		*req;
 	int			stable;
 	int			flags;
 	struct rpc_message	msg = {
@@ -799,28 +783,14 @@ nfs3_proc_write_setup(struct nfs_write_d
 			stable = NFS_DATA_SYNC;
 	} else
 		stable = NFS_UNSTABLE;
-	
-	req = nfs_list_entry(data->pages.next);
-	data->args.fh     = NFS_FH(inode);
-	data->args.offset = req_offset(req);
-	data->args.pgbase = req->wb_pgbase;
-	data->args.count  = count;
 	data->args.stable = stable;
-	data->args.pages  = data->pagevec;
-	data->res.fattr   = &data->fattr;
-	data->res.count   = count;
-	data->res.verf    = &data->verf;
 
 	/* Set the initial flags for the task.  */
 	flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC;
 
 	/* Finalize the task. */
 	rpc_init_task(task, NFS_CLIENT(inode), nfs3_write_done, flags);
-	task->tk_calldata = data;
-	/* Release requests */
-	task->tk_release = nfs_writedata_release;
-
-	rpc_call_setup(&data->task, &msg, 0);
+	rpc_call_setup(task, &msg, 0);
 }
 
 static void
@@ -837,7 +807,7 @@ nfs3_commit_done(struct rpc_task *task)
 }
 
 static void
-nfs3_proc_commit_setup(struct nfs_write_data *data, u64 start, u32 len, int how)
+nfs3_proc_commit_setup(struct nfs_write_data *data, int how)
 {
 	struct rpc_task		*task = &data->task;
 	struct inode		*inode = data->inode;
@@ -849,23 +819,12 @@ nfs3_proc_commit_setup(struct nfs_write_
 		.rpc_cred	= data->cred,
 	};
 
-	data->args.fh     = NFS_FH(data->inode);
-	data->args.offset = start;
-	data->args.count  = len;
-	data->res.count   = len;
-	data->res.fattr   = &data->fattr;
-	data->res.verf    = &data->verf;
-	
 	/* Set the initial flags for the task.  */
 	flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC;
 
 	/* Finalize the task. */
 	rpc_init_task(task, NFS_CLIENT(inode), nfs3_commit_done, flags);
-	task->tk_calldata = data;
-	/* Release requests */
-	task->tk_release = nfs_commit_release;
-	
-	rpc_call_setup(&data->task, &msg, 0);
+	rpc_call_setup(task, &msg, 0);
 }
 
 /*
--- diff/fs/nfs/nfs3xdr.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/nfs/nfs3xdr.c	2004-04-21 10:45:35.748268936 +0100
@@ -515,7 +515,7 @@ nfs3_xdr_readdirres(struct rpc_rqst *req
 	}
 
 	pglen = rcvbuf->page_len;
-	recvd = req->rq_received - hdrlen;
+	recvd = rcvbuf->len - hdrlen;
 	if (pglen > recvd)
 		pglen = recvd;
 	page = rcvbuf->pages;
@@ -536,16 +536,16 @@ nfs3_xdr_readdirres(struct rpc_rqst *req
 
 		if (res->plus) {
 			/* post_op_attr */
-			if (p > end)
+			if (p + 2 > end)
 				goto short_pkt;
 			if (*p++) {
 				p += 21;
-				if (p > end)
+				if (p + 1 > end)
 					goto short_pkt;
 			}
 			/* post_op_fh3 */
 			if (*p++) {
-				if (p > end)
+				if (p + 1 > end)
 					goto short_pkt;
 				len = ntohl(*p++);
 				if (len > NFS3_FHSIZE) {
@@ -758,7 +758,7 @@ nfs3_xdr_readlinkres(struct rpc_rqst *re
 static int
 nfs3_xdr_readres(struct rpc_rqst *req, u32 *p, struct nfs_readres *res)
 {
-	struct iovec *iov = req->rq_rvec;
+	struct iovec *iov = req->rq_rcv_buf.head;
 	int	status, count, ocount, recvd, hdrlen;
 
 	status = ntohl(*p++);
@@ -789,7 +789,7 @@ nfs3_xdr_readres(struct rpc_rqst *req, u
 		xdr_shift_buf(&req->rq_rcv_buf, iov->iov_len - hdrlen);
 	}
 
-	recvd = req->rq_received - hdrlen;
+	recvd = req->rq_rcv_buf.len - hdrlen;
 	if (count > recvd) {
 		printk(KERN_WARNING "NFS: server cheating in read reply: "
 			"count %d > recvd %d\n", count, recvd);
--- diff/fs/nfs/nfs4proc.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/nfs/nfs4proc.c	2004-04-21 10:45:35.751268480 +0100
@@ -51,10 +51,7 @@
 
 #define NFS4_POLL_RETRY_TIME	(15*HZ)
 
-#define GET_OP(cp,name)		&cp->ops[cp->req_nops].u.name
-#define OPNUM(cp)		cp->ops[cp->req_nops].opnum
-
-static int nfs4_proc_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *);
+static int nfs4_do_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *);
 static int nfs4_async_handle_error(struct rpc_task *, struct nfs_server *);
 extern u32 *nfs4_decode_dirent(u32 *p, struct nfs_entry *entry, int plus);
 extern struct rpc_procinfo nfs4_procedures[];
@@ -72,102 +69,10 @@ static inline int nfs4_map_errors(int er
 	return err;
 }
 
-static void
-nfs4_setup_compound(struct nfs4_compound *cp, struct nfs4_op *ops,
-		    struct nfs_server *server, char *tag)
-{
-	memset(cp, 0, sizeof(*cp));
-	cp->ops = ops;
-	cp->server = server;
-}
-
-static void
-nfs4_setup_access(struct nfs4_compound *cp, u32 req_access, u32 *resp_supported, u32 *resp_access)
-{
-	struct nfs4_access *access = GET_OP(cp, access);
-	
-	access->ac_req_access = req_access;
-	access->ac_resp_supported = resp_supported;
-	access->ac_resp_access = resp_access;
-	
-	OPNUM(cp) = OP_ACCESS;
-	cp->req_nops++;
-}
-
-static void
-nfs4_setup_create_dir(struct nfs4_compound *cp, struct qstr *name,
-		      struct iattr *sattr, struct nfs4_change_info *info)
-{
-	struct nfs4_create *create = GET_OP(cp, create);
-	
-	create->cr_ftype = NF4DIR;
-	create->cr_namelen = name->len;
-	create->cr_name = name->name;
-	create->cr_attrs = sattr;
-	create->cr_cinfo = info;
-	
-	OPNUM(cp) = OP_CREATE;
-	cp->req_nops++;
-}
-
-static void
-nfs4_setup_create_symlink(struct nfs4_compound *cp, struct qstr *name,
-			  struct qstr *linktext, struct iattr *sattr,
-			  struct nfs4_change_info *info)
-{
-	struct nfs4_create *create = GET_OP(cp, create);
-
-	create->cr_ftype = NF4LNK;
-	create->cr_textlen = linktext->len;
-	create->cr_text = linktext->name;
-	create->cr_namelen = name->len;
-	create->cr_name = name->name;
-	create->cr_attrs = sattr;
-	create->cr_cinfo = info;
-
-	OPNUM(cp) = OP_CREATE;
-	cp->req_nops++;
-}
-
-static void
-nfs4_setup_create_special(struct nfs4_compound *cp, struct qstr *name,
-			    dev_t dev, struct iattr *sattr,
-			    struct nfs4_change_info *info)
-{
-	int mode = sattr->ia_mode;
-	struct nfs4_create *create = GET_OP(cp, create);
-
-	BUG_ON(!(sattr->ia_valid & ATTR_MODE));
-	BUG_ON(!S_ISFIFO(mode) && !S_ISBLK(mode) && !S_ISCHR(mode) && !S_ISSOCK(mode));
-	
-	if (S_ISFIFO(mode))
-		create->cr_ftype = NF4FIFO;
-	else if (S_ISBLK(mode)) {
-		create->cr_ftype = NF4BLK;
-		create->cr_specdata1 = MAJOR(dev);
-		create->cr_specdata2 = MINOR(dev);
-	}
-	else if (S_ISCHR(mode)) {
-		create->cr_ftype = NF4CHR;
-		create->cr_specdata1 = MAJOR(dev);
-		create->cr_specdata2 = MINOR(dev);
-	}
-	else
-		create->cr_ftype = NF4SOCK;
-	
-	create->cr_namelen = name->len;
-	create->cr_name = name->name;
-	create->cr_attrs = sattr;
-	create->cr_cinfo = info;
-
-	OPNUM(cp) = OP_CREATE;
-	cp->req_nops++;
-}
-
 /*
  * This is our standard bitmap for GETATTR requests.
  */
-u32 nfs4_fattr_bitmap[2] = {
+const u32 nfs4_fattr_bitmap[2] = {
 	FATTR4_WORD0_TYPE
 	| FATTR4_WORD0_CHANGE
 	| FATTR4_WORD0_SIZE
@@ -184,7 +89,7 @@ u32 nfs4_fattr_bitmap[2] = {
 	| FATTR4_WORD1_TIME_MODIFY
 };
 
-u32 nfs4_statfs_bitmap[2] = {
+const u32 nfs4_statfs_bitmap[2] = {
 	FATTR4_WORD0_FILES_AVAIL
 	| FATTR4_WORD0_FILES_FREE
 	| FATTR4_WORD0_FILES_TOTAL,
@@ -199,121 +104,28 @@ u32 nfs4_pathconf_bitmap[2] = {
 	0
 };
 
-static inline void
-__nfs4_setup_getattr(struct nfs4_compound *cp, u32 *bitmap,
-		     struct nfs_fattr *fattr,
-		     struct nfs_fsstat *fsstat,
-		     struct nfs_pathconf *pathconf)
-{
-        struct nfs4_getattr *getattr = GET_OP(cp, getattr);
-
-        getattr->gt_bmval = bitmap;
-        getattr->gt_attrs = fattr;
-	getattr->gt_fsstat = fsstat;
-	getattr->gt_pathconf = pathconf;
-
-        OPNUM(cp) = OP_GETATTR;
-        cp->req_nops++;
-}
-
-static void
-nfs4_setup_getattr(struct nfs4_compound *cp,
-		struct nfs_fattr *fattr)
-{
-	__nfs4_setup_getattr(cp, nfs4_fattr_bitmap, fattr,
-			NULL, NULL);
-}
-
-static void
-nfs4_setup_statfs(struct nfs4_compound *cp,
-		struct nfs_fsstat *fsstat)
-{
-	__nfs4_setup_getattr(cp, nfs4_statfs_bitmap,
-			NULL, fsstat, NULL);
-}
-
-static void
-nfs4_setup_pathconf(struct nfs4_compound *cp,
-		struct nfs_pathconf *pathconf)
-{
-	__nfs4_setup_getattr(cp, nfs4_pathconf_bitmap,
-			NULL, NULL, pathconf);
-}
-
-static void
-nfs4_setup_getfh(struct nfs4_compound *cp, struct nfs_fh *fhandle)
-{
-	struct nfs4_getfh *getfh = GET_OP(cp, getfh);
-
-	getfh->gf_fhandle = fhandle;
-
-	OPNUM(cp) = OP_GETFH;
-	cp->req_nops++;
-}
-
-static void
-nfs4_setup_link(struct nfs4_compound *cp, struct qstr *name,
-		struct nfs4_change_info *info)
-{
-	struct nfs4_link *link = GET_OP(cp, link);
-
-	link->ln_namelen = name->len;
-	link->ln_name = name->name;
-	link->ln_cinfo = info;
-
-	OPNUM(cp) = OP_LINK;
-	cp->req_nops++;
-}
-
-static void
-nfs4_setup_lookup(struct nfs4_compound *cp, struct qstr *q)
-{
-	struct nfs4_lookup *lookup = GET_OP(cp, lookup);
-
-	lookup->lo_name = q;
-
-	OPNUM(cp) = OP_LOOKUP;
-	cp->req_nops++;
-}
-
-static void
-nfs4_setup_putfh(struct nfs4_compound *cp, struct nfs_fh *fhandle)
-{
-	struct nfs4_putfh *putfh = GET_OP(cp, putfh);
-
-	putfh->pf_fhandle = fhandle;
-
-	OPNUM(cp) = OP_PUTFH;
-	cp->req_nops++;
-}
-
-static void
-nfs4_setup_putrootfh(struct nfs4_compound *cp)
-{
-        OPNUM(cp) = OP_PUTROOTFH;
-        cp->req_nops++;
-}
+const u32 nfs4_fsinfo_bitmap[2] = { FATTR4_WORD0_MAXFILESIZE
+			| FATTR4_WORD0_MAXREAD
+			| FATTR4_WORD0_MAXWRITE
+			| FATTR4_WORD0_LEASE_TIME,
+			0
+};
 
-static void
-nfs4_setup_readdir(struct nfs4_compound *cp, u64 cookie, u32 *verifier,
-		     struct page **pages, unsigned int bufsize, struct dentry *dentry)
+static void nfs4_setup_readdir(u64 cookie, u32 *verifier, struct dentry *dentry,
+		struct nfs4_readdir_arg *readdir)
 {
 	u32 *start, *p;
-	struct nfs4_readdir *readdir = GET_OP(cp, readdir);
 
-	BUG_ON(bufsize < 80);
-	readdir->rd_cookie = (cookie > 2) ? cookie : 0;
-	memcpy(&readdir->rd_req_verifier, verifier, sizeof(readdir->rd_req_verifier));
-	readdir->rd_count = bufsize;
-	readdir->rd_bmval[0] = FATTR4_WORD0_FILEID;
-	readdir->rd_bmval[1] = 0;
-	readdir->rd_pages = pages;
-	readdir->rd_pgbase = 0;
-	
-	OPNUM(cp) = OP_READDIR;
-	cp->req_nops++;
+	BUG_ON(readdir->count < 80);
+	if (cookie > 2) {
+		readdir->cookie = (cookie > 2) ? cookie : 0;
+		memcpy(&readdir->verifier, verifier, sizeof(readdir->verifier));
+		return;
+	}
 
-	if (cookie >= 2)
+	readdir->cookie = 0;
+	memset(&readdir->verifier, 0, sizeof(readdir->verifier));
+	if (cookie == 2)
 		return;
 	
 	/*
@@ -323,7 +135,7 @@ nfs4_setup_readdir(struct nfs4_compound 
 	 * when talking to the server, we always send cookie 0
 	 * instead of 1 or 2.
 	 */
-	start = p = (u32 *)kmap_atomic(*pages, KM_USER0);
+	start = p = (u32 *)kmap_atomic(*readdir->pages, KM_USER0);
 	
 	if (cookie == 0) {
 		*p++ = xdr_one;                                  /* next */
@@ -335,7 +147,7 @@ nfs4_setup_readdir(struct nfs4_compound 
 		*p++ = xdr_one;                         /* bitmap length */
 		*p++ = htonl(FATTR4_WORD0_FILEID);             /* bitmap */
 		*p++ = htonl(8);              /* attribute buffer length */
-		p = xdr_encode_hyper(p, NFS_FILEID(dentry->d_inode));
+		p = xdr_encode_hyper(p, dentry->d_inode->i_ino);
 	}
 	
 	*p++ = xdr_one;                                  /* next */
@@ -347,70 +159,14 @@ nfs4_setup_readdir(struct nfs4_compound 
 	*p++ = xdr_one;                         /* bitmap length */
 	*p++ = htonl(FATTR4_WORD0_FILEID);             /* bitmap */
 	*p++ = htonl(8);              /* attribute buffer length */
-	p = xdr_encode_hyper(p, NFS_FILEID(dentry->d_parent->d_inode));
+	p = xdr_encode_hyper(p, dentry->d_parent->d_inode->i_ino);
 
-	readdir->rd_pgbase = (char *)p - (char *)start;
-	readdir->rd_count -= readdir->rd_pgbase;
+	readdir->pgbase = (char *)p - (char *)start;
+	readdir->count -= readdir->pgbase;
 	kunmap_atomic(start, KM_USER0);
 }
 
 static void
-nfs4_setup_readlink(struct nfs4_compound *cp, int count, struct page **pages)
-{
-	struct nfs4_readlink *readlink = GET_OP(cp, readlink);
-
-	readlink->rl_count = count;
-	readlink->rl_pages = pages;
-
-	OPNUM(cp) = OP_READLINK;
-	cp->req_nops++;
-}
-
-static void
-nfs4_setup_remove(struct nfs4_compound *cp, struct qstr *name, struct nfs4_change_info *cinfo)
-{
-	struct nfs4_remove *remove = GET_OP(cp, remove);
-
-	remove->rm_namelen = name->len;
-	remove->rm_name = name->name;
-	remove->rm_cinfo = cinfo;
-
-	OPNUM(cp) = OP_REMOVE;
-	cp->req_nops++;
-}
-
-static void
-nfs4_setup_rename(struct nfs4_compound *cp, struct qstr *old, struct qstr *new,
-		  struct nfs4_change_info *old_cinfo, struct nfs4_change_info *new_cinfo)
-{
-	struct nfs4_rename *rename = GET_OP(cp, rename);
-
-	rename->rn_oldnamelen = old->len;
-	rename->rn_oldname = old->name;
-	rename->rn_newnamelen = new->len;
-	rename->rn_newname = new->name;
-	rename->rn_src_cinfo = old_cinfo;
-	rename->rn_dst_cinfo = new_cinfo;
-
-	OPNUM(cp) = OP_RENAME;
-	cp->req_nops++;
-}
-
-static void
-nfs4_setup_restorefh(struct nfs4_compound *cp)
-{
-        OPNUM(cp) = OP_RESTOREFH;
-        cp->req_nops++;
-}
-
-static void
-nfs4_setup_savefh(struct nfs4_compound *cp)
-{
-        OPNUM(cp) = OP_SAVEFH;
-        cp->req_nops++;
-}
-
-static void
 renew_lease(struct nfs_server *server, unsigned long timestamp)
 {
 	struct nfs4_client *clp = server->nfs4_state;
@@ -420,58 +176,12 @@ renew_lease(struct nfs_server *server, u
 	spin_unlock(&clp->cl_lock);
 }
 
-static inline void
-process_lease(struct nfs4_compound *cp)
+static void update_changeattr(struct inode *inode, struct nfs4_change_info *cinfo)
 {
-        /*
-         * Generic lease processing: If this operation contains a
-	 * lease-renewing operation, and it succeeded, update the RENEW time
-	 * in the superblock.  Instead of the current time, we use the time
-	 * when the request was sent out.  (All we know is that the lease was
-	 * renewed sometime between then and now, and we have to assume the
-	 * worst case.)
-	 *
-	 * Notes:
-	 *   (1) renewd doesn't acquire the spinlock when messing with
-	 *     server->last_renewal; this is OK since rpciod always runs
-	 *     under the BKL.
-	 *   (2) cp->timestamp was set at the end of XDR encode.
-         */
-	if (!cp->renew_index)
-		return;
-	if (!cp->toplevel_status || cp->resp_nops > cp->renew_index)
-		renew_lease(cp->server, cp->timestamp);
-}
-
-static int
-nfs4_call_compound(struct nfs4_compound *cp, struct rpc_cred *cred, int flags)
-{
-	int status;
-	struct rpc_message msg = {
-		.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COMPOUND],
-		.rpc_argp = cp,
-		.rpc_resp = cp,
-		.rpc_cred = cred,
-	};
-
-	status = rpc_call_sync(cp->server->client, &msg, flags);
-	if (!status)
-		process_lease(cp);
-	
-	return status;
-}
+	struct nfs_inode *nfsi = NFS_I(inode);
 
-static inline void
-process_cinfo(struct nfs4_change_info *info, struct nfs_fattr *fattr)
-{
-	BUG_ON((fattr->valid & NFS_ATTR_FATTR) == 0);
-	BUG_ON((fattr->valid & NFS_ATTR_FATTR_V4) == 0);
-	
-	if (fattr->change_attr == info->after) {
-		fattr->pre_change_attr = info->before;
-		fattr->valid |= NFS_ATTR_PRE_CHANGE;
-		fattr->timestamp = jiffies;
-	}
+	if (cinfo->before == nfsi->change_attr && cinfo->atomic)
+		nfsi->change_attr = cinfo->after;
 }
 
 /*
@@ -487,12 +197,6 @@ nfs4_open_reclaim(struct nfs4_state_owne
 	struct nfs_fattr fattr = {
 		.valid = 0,
 	};
-	struct nfs4_change_info d_cinfo;
-	struct nfs4_getattr     f_getattr = {
-		.gt_bmval       = nfs4_fattr_bitmap,
-		.gt_attrs       = &fattr,
-	};
-
 	struct nfs_open_reclaimargs o_arg = {
 		.fh = NFS_FH(inode),
 		.seqid = sp->so_seqid,
@@ -500,11 +204,10 @@ nfs4_open_reclaim(struct nfs4_state_owne
 		.share_access = state->state,
 		.clientid = server->nfs4_state->cl_clientid,
 		.claim = NFS4_OPEN_CLAIM_PREVIOUS,
-		.f_getattr = &f_getattr,
+		.bitmask = server->attr_bitmask,
 	};
 	struct nfs_openres o_res = {
-		.cinfo = &d_cinfo,
-		.f_getattr = &f_getattr,
+		.f_attr = &fattr,
 		.server = server,	/* Grrr */
 	};
 	struct rpc_message msg = {
@@ -534,36 +237,21 @@ nfs4_do_open(struct inode *dir, struct q
 	struct nfs4_state     *state = NULL;
 	struct nfs_server       *server = NFS_SERVER(dir);
 	struct inode *inode = NULL;
-	struct nfs4_change_info d_cinfo;
 	int                     status;
-	struct nfs_fattr        d_attr = {
-		.valid          = 0,
-	};
 	struct nfs_fattr        f_attr = {
 		.valid          = 0,
 	};
-	struct nfs4_getattr     f_getattr = {
-		.gt_bmval       = nfs4_fattr_bitmap,
-		.gt_attrs       = &f_attr,
-	};
-	struct nfs4_getattr     d_getattr = {
-		.gt_bmval       = nfs4_fattr_bitmap,
-		.gt_attrs       = &d_attr,
-	};
 	struct nfs_openargs o_arg = {
 		.fh             = NFS_FH(dir),
 		.share_access   = flags & (FMODE_READ|FMODE_WRITE),
 		.opentype       = (flags & O_CREAT) ? NFS4_OPEN_CREATE : NFS4_OPEN_NOCREATE,
 		.createmode     = (flags & O_EXCL) ? NFS4_CREATE_EXCLUSIVE : NFS4_CREATE_UNCHECKED,
 		.name           = name,
-		.f_getattr      = &f_getattr,
-		.d_getattr      = &d_getattr,
 		.server         = server,
+		.bitmask = server->attr_bitmask,
 	};
 	struct nfs_openres o_res = {
-		.cinfo          = &d_cinfo,
-		.f_getattr      = &f_getattr,
-		.d_getattr      = &d_getattr,
+		.f_attr         = &f_attr,
 		.server         = server,
 	};
 	struct rpc_message msg = {
@@ -596,8 +284,7 @@ retry:
 	nfs4_increment_seqid(status, sp);
 	if (status)
 		goto out_up;
-	process_cinfo(&d_cinfo, &d_attr);
-	nfs_refresh_inode(dir, &d_attr);
+	update_changeattr(dir, &o_res.cinfo);
 
 	status = -ENOMEM;
 	inode = nfs_fhget(dir->i_sb, &o_res.fh, &f_attr);
@@ -679,18 +366,14 @@ nfs4_do_setattr(struct nfs_server *serve
                 struct nfs_fh *fhandle, struct iattr *sattr,
                 struct nfs4_state *state)
 {
-        struct nfs4_getattr     getattr = {
-                .gt_bmval       = nfs4_fattr_bitmap,
-                .gt_attrs       = fattr,
-        };
         struct nfs_setattrargs  arg = {
                 .fh             = fhandle,
                 .iap            = sattr,
-                .attr           = &getattr,
 		.server		= server,
+		.bitmask = server->attr_bitmask,
         };
         struct nfs_setattrres  res = {
-                .attr           = &getattr,
+		.fattr		= fattr,
 		.server		= server,
         };
         struct rpc_message msg = {
@@ -834,30 +517,85 @@ nfs4_open_revalidate(struct inode *dir, 
 	return 0;
 }
 
-static int
-nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
-		   struct nfs_fsinfo *info)
+
+static int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
+{
+	struct nfs4_server_caps_res res = {};
+	struct rpc_message msg = {
+		.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SERVER_CAPS],
+		.rpc_argp = fhandle,
+		.rpc_resp = &res,
+	};
+	int status;
+
+	status = rpc_call_sync(server->client, &msg, 0);
+	if (status == 0) {
+		memcpy(server->attr_bitmask, res.attr_bitmask, sizeof(server->attr_bitmask));
+		if (res.attr_bitmask[0] & FATTR4_WORD0_ACL)
+			server->caps |= NFS_CAP_ACLS;
+		if (res.has_links != 0)
+			server->caps |= NFS_CAP_HARDLINKS;
+		if (res.has_symlinks != 0)
+			server->caps |= NFS_CAP_SYMLINKS;
+		server->acl_bitmask = res.acl_bitmask;
+	}
+	return status;
+}
+
+static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
+		struct nfs_fsinfo *info)
+{
+	struct nfs_fattr *	fattr = info->fattr;
+	struct nfs4_lookup_root_arg args = {
+		.bitmask = nfs4_fattr_bitmap,
+	};
+	struct nfs4_lookup_res res = {
+		.server = server,
+		.fattr = fattr,
+		.fh = fhandle,
+	};
+	struct rpc_message msg = {
+		.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP_ROOT],
+		.rpc_argp = &args,
+		.rpc_resp = &res,
+	};
+	fattr->valid = 0;
+	return rpc_call_sync(server->client, &msg, 0);
+}
+
+static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
+		struct nfs_fsinfo *info)
 {
-	struct nfs4_compound	compound;
-	struct nfs4_op		ops[4];
 	struct nfs_fattr *	fattr = info->fattr;
 	unsigned char *		p;
 	struct qstr		q;
-	int			status;
+	struct nfs4_lookup_arg args = {
+		.dir_fh = fhandle,
+		.name = &q,
+		.bitmask = nfs4_fattr_bitmap,
+	};
+	struct nfs4_lookup_res res = {
+		.server = server,
+		.fattr = fattr,
+		.fh = fhandle,
+	};
+	struct rpc_message msg = {
+		.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP],
+		.rpc_argp = &args,
+		.rpc_resp = &res,
+	};
+	int status;
 
 	/*
 	 * Now we do a separate LOOKUP for each component of the mount path.
 	 * The LOOKUPs are done separately so that we can conveniently
 	 * catch an ERR_WRONGSEC if it occurs along the way...
 	 */
-	p = server->mnt_path;
-	fattr->valid = 0;
-	nfs4_setup_compound(&compound, ops, server, "getrootfh");
-	nfs4_setup_putrootfh(&compound);
-	nfs4_setup_getattr(&compound, fattr);
-	nfs4_setup_getfh(&compound, fhandle);
-	if ((status = nfs4_call_compound(&compound, NULL, 0)))
+	status = nfs4_lookup_root(server, fhandle, info);
+	if (status)
 		goto out;
+
+	p = server->mnt_path;
 	for (;;) {
 		while (*p == '/')
 			p++;
@@ -869,12 +607,7 @@ nfs4_proc_get_root(struct nfs_server *se
 		q.len = p - q.name;
 
 		fattr->valid = 0;
-		nfs4_setup_compound(&compound, ops, server, "mount");
-		nfs4_setup_putfh(&compound, fhandle);
-		nfs4_setup_lookup(&compound, &q);
-		nfs4_setup_getattr(&compound, fattr);
-		nfs4_setup_getfh(&compound, fhandle);
-		status = nfs4_call_compound(&compound, NULL, 0);
+		status = rpc_call_sync(server->client, &msg, 0);
 		if (!status)
 			continue;
 		if (status == -ENOENT) {
@@ -883,24 +616,34 @@ nfs4_proc_get_root(struct nfs_server *se
 		}
 		break;
 	}
+	if (status == 0)
+		status = nfs4_server_capabilities(server, fhandle);
+	if (status == 0)
+		status = nfs4_do_fsinfo(server, fhandle, info);
 out:
-	if (status)
-		return nfs4_map_errors(status);
-	return nfs4_proc_fsinfo(server, fhandle, info);
+	return nfs4_map_errors(status);
 }
 
-static int
-nfs4_proc_getattr(struct inode *inode, struct nfs_fattr *fattr)
+static int nfs4_proc_getattr(struct inode *inode, struct nfs_fattr *fattr)
 {
-	struct nfs4_compound compound;
-	struct nfs4_op ops[2];
-
+	struct nfs_server *server = NFS_SERVER(inode);
+	struct nfs4_getattr_arg args = {
+		.fh = NFS_FH(inode),
+		.bitmask = server->attr_bitmask,
+	};
+	struct nfs4_getattr_res res = {
+		.fattr = fattr,
+		.server = server,
+	};
+	struct rpc_message msg = {
+		.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETATTR],
+		.rpc_argp = &args,
+		.rpc_resp = &res,
+	};
+	
 	fattr->valid = 0;
 
-	nfs4_setup_compound(&compound, ops, NFS_SERVER(inode), "getattr");
-	nfs4_setup_putfh(&compound, NFS_FH(inode));
-	nfs4_setup_getattr(&compound, fattr);
-	return nfs4_map_errors(nfs4_call_compound(&compound, NULL, 0));
+	return nfs4_map_errors(rpc_call_sync(NFS_CLIENT(inode), &msg, 0));
 }
 
 /* 
@@ -962,75 +705,72 @@ out:
 	return status;
 }
 
-static int
-nfs4_proc_lookup(struct inode *dir, struct qstr *name,
-		 struct nfs_fh *fhandle, struct nfs_fattr *fattr)
+static int nfs4_proc_lookup(struct inode *dir, struct qstr *name,
+		struct nfs_fh *fhandle, struct nfs_fattr *fattr)
 {
-	struct nfs4_compound	compound;
-	struct nfs4_op		ops[5];
-	struct nfs_fattr	dir_attr;
-	int			status;
-
-	dir_attr.valid = 0;
+	int		       status;
+	struct nfs_server *server = NFS_SERVER(dir);
+	struct nfs4_lookup_arg args = {
+		.bitmask = server->attr_bitmask,
+		.dir_fh = NFS_FH(dir),
+		.name = name,
+	};
+	struct nfs4_lookup_res res = {
+		.server = server,
+		.fattr = fattr,
+		.fh = fhandle,
+	};
+	struct rpc_message msg = {
+		.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP],
+		.rpc_argp = &args,
+		.rpc_resp = &res,
+	};
+	
 	fattr->valid = 0;
 	
 	dprintk("NFS call  lookup %s\n", name->name);
-	nfs4_setup_compound(&compound, ops, NFS_SERVER(dir), "lookup");
-	nfs4_setup_putfh(&compound, NFS_FH(dir));
-	nfs4_setup_getattr(&compound, &dir_attr);
-	nfs4_setup_lookup(&compound, name);
-	nfs4_setup_getattr(&compound, fattr);
-	nfs4_setup_getfh(&compound, fhandle);
-	status = nfs4_call_compound(&compound, NULL, 0);
+	status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
 	dprintk("NFS reply lookup: %d\n", status);
-
-	if (status >= 0)
-		status = nfs_refresh_inode(dir, &dir_attr);
 	return nfs4_map_errors(status);
 }
 
-static int
-nfs4_proc_access(struct inode *inode, struct rpc_cred *cred, int mode)
+static int nfs4_proc_access(struct inode *inode, struct rpc_cred *cred, int mode)
 {
-	struct nfs4_compound	compound;
-	struct nfs4_op		ops[3];
-	struct nfs_fattr	fattr;
-	u32			req_access = 0, resp_supported, resp_access;
 	int			status;
-
-	fattr.valid = 0;
+	struct nfs4_accessargs args = {
+		.fh = NFS_FH(inode),
+	};
+	struct nfs4_accessres res = { 0 };
+	struct rpc_message msg = {
+		.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_ACCESS],
+		.rpc_argp = &args,
+		.rpc_resp = &res,
+		.rpc_cred = cred,
+	};
 
 	/*
 	 * Determine which access bits we want to ask for...
 	 */
 	if (mode & MAY_READ)
-		req_access |= NFS4_ACCESS_READ;
+		args.access |= NFS4_ACCESS_READ;
 	if (S_ISDIR(inode->i_mode)) {
 		if (mode & MAY_WRITE)
-			req_access |= NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND | NFS4_ACCESS_DELETE;
+			args.access |= NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND | NFS4_ACCESS_DELETE;
 		if (mode & MAY_EXEC)
-			req_access |= NFS4_ACCESS_LOOKUP;
+			args.access |= NFS4_ACCESS_LOOKUP;
 	}
 	else {
 		if (mode & MAY_WRITE)
-			req_access |= NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND;
+			args.access |= NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND;
 		if (mode & MAY_EXEC)
-			req_access |= NFS4_ACCESS_EXECUTE;
+			args.access |= NFS4_ACCESS_EXECUTE;
 	}
-
-	nfs4_setup_compound(&compound, ops, NFS_SERVER(inode), "access");
-	nfs4_setup_putfh(&compound, NFS_FH(inode));
-	nfs4_setup_getattr(&compound, &fattr);
-	nfs4_setup_access(&compound, req_access, &resp_supported, &resp_access);
-	status = nfs4_call_compound(&compound, cred, 0);
-	nfs_refresh_inode(inode, &fattr);
-
+	status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
 	if (!status) {
-		if (req_access != resp_supported) {
+		if (args.access != res.supported) {
 			printk(KERN_NOTICE "NFS: server didn't support all access bits!\n");
 			status = -ENOTSUPP;
-		}
-		else if (req_access != resp_access)
+		} else if ((args.access & res.access) != args.access)
 			status = -EACCES;
 	}
 	return nfs4_map_errors(status);
@@ -1060,16 +800,20 @@ nfs4_proc_access(struct inode *inode, st
  * Both of these changes to the XDR layer would in fact be quite
  * minor, but I decided to leave them for a subsequent patch.
  */
-static int
-nfs4_proc_readlink(struct inode *inode, struct page *page)
+static int nfs4_proc_readlink(struct inode *inode, struct page *page)
 {
-	struct nfs4_compound	compound;
-	struct nfs4_op		ops[2];
+	struct nfs4_readlink args = {
+		.fh       = NFS_FH(inode),
+		.count    = PAGE_CACHE_SIZE,
+		.pages    = &page,
+	};
+	struct rpc_message msg = {
+		.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READLINK],
+		.rpc_argp = &args,
+		.rpc_resp = NULL,
+	};
 
-	nfs4_setup_compound(&compound, ops, NFS_SERVER(inode), "readlink");
-	nfs4_setup_putfh(&compound, NFS_FH(inode));
-	nfs4_setup_readlink(&compound, PAGE_CACHE_SIZE, &page);
-	return nfs4_map_errors(nfs4_call_compound(&compound, NULL, 0));
+	return nfs4_map_errors(rpc_call_sync(NFS_CLIENT(inode), &msg, 0));
 }
 
 static int
@@ -1096,10 +840,10 @@ nfs4_proc_read(struct nfs_read_data *rda
 	if (filp) {
 		struct nfs4_state *state;
 		state = (struct nfs4_state *)filp->private_data;
-		nfs4_copy_stateid(&rdata->args.stateid, state, rdata->lockowner);
+		rdata->args.state = state;
 		msg.rpc_cred = state->owner->so_cred;
 	} else {
-		memcpy(&rdata->args.stateid, &zero_stateid, sizeof(rdata->args.stateid));
+		rdata->args.state = NULL;
 		msg.rpc_cred = NFS_I(inode)->mm_cred;
 	}
 
@@ -1134,10 +878,10 @@ nfs4_proc_write(struct nfs_write_data *w
 	if (filp) {
 		struct nfs4_state *state;
 		state = (struct nfs4_state *)filp->private_data;
-		nfs4_copy_stateid(&wdata->args.stateid, state, wdata->lockowner);
+		wdata->args.state = state;
 		msg.rpc_cred = state->owner->so_cred;
 	} else {
-		memcpy(&wdata->args.stateid, &zero_stateid, sizeof(wdata->args.stateid));
+		wdata->args.state = NULL;
 		msg.rpc_cred = NFS_I(inode)->mm_cred;
 	}
 
@@ -1166,15 +910,10 @@ nfs4_proc_commit(struct nfs_write_data *
 	/*
 	 * Try first to use O_WRONLY, then O_RDWR stateid.
 	 */
-	if (filp) {
-		struct nfs4_state *state;
-		state = (struct nfs4_state *)filp->private_data;
-		nfs4_copy_stateid(&cdata->args.stateid, state, cdata->lockowner);
-		msg.rpc_cred = state->owner->so_cred;
-	} else {
-		memcpy(&cdata->args.stateid, &zero_stateid, sizeof(cdata->args.stateid));
+	if (filp)
+		msg.rpc_cred = ((struct nfs4_state *)filp->private_data)->owner->so_cred;
+	else
 		msg.rpc_cred = NFS_I(inode)->mm_cred;
-	}
 
 	fattr->valid = 0;
 	status = rpc_call_sync(server->client, &msg, 0);
@@ -1226,301 +965,318 @@ nfs4_proc_create(struct inode *dir, stru
 	return inode;
 }
 
-static int
-nfs4_proc_remove(struct inode *dir, struct qstr *name)
+static int nfs4_proc_remove(struct inode *dir, struct qstr *name)
 {
-	struct nfs4_compound	compound;
-	struct nfs4_op		ops[3];
-	struct nfs4_change_info	dir_cinfo;
-	struct nfs_fattr	dir_attr;
+	struct nfs4_remove_arg args = {
+		.fh = NFS_FH(dir),
+		.name = name,
+	};
+	struct nfs4_change_info	res;
+	struct rpc_message msg = {
+		.rpc_proc	= &nfs4_procedures[NFSPROC4_CLNT_REMOVE],
+		.rpc_argp	= &args,
+		.rpc_resp	= &res,
+	};
 	int			status;
 
-	dir_attr.valid = 0;
-	nfs4_setup_compound(&compound, ops, NFS_SERVER(dir), "remove");
-	nfs4_setup_putfh(&compound, NFS_FH(dir));
-	nfs4_setup_remove(&compound, name, &dir_cinfo);
-	nfs4_setup_getattr(&compound, &dir_attr);
-	status = nfs4_call_compound(&compound, NULL, 0);
-
-	if (!status) {
-		process_cinfo(&dir_cinfo, &dir_attr);
-		nfs_refresh_inode(dir, &dir_attr);
-	}
+	status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
+	if (status == 0)
+		update_changeattr(dir, &res);
 	return nfs4_map_errors(status);
 }
 
 struct unlink_desc {
-	struct nfs4_compound	compound;
-	struct nfs4_op		ops[3];
-	struct nfs4_change_info	cinfo;
-	struct nfs_fattr	attrs;
+	struct nfs4_remove_arg	args;
+	struct nfs4_change_info	res;
 };
 
-static int
-nfs4_proc_unlink_setup(struct rpc_message *msg, struct dentry *dir, struct qstr *name)
+static int nfs4_proc_unlink_setup(struct rpc_message *msg, struct dentry *dir,
+		struct qstr *name)
 {
-	struct unlink_desc *	up;
-	struct nfs4_compound *	cp;
+	struct unlink_desc *up;
 
 	up = (struct unlink_desc *) kmalloc(sizeof(*up), GFP_KERNEL);
 	if (!up)
 		return -ENOMEM;
-	cp = &up->compound;
 	
-	nfs4_setup_compound(cp, up->ops, NFS_SERVER(dir->d_inode), "unlink_setup");
-	nfs4_setup_putfh(cp, NFS_FH(dir->d_inode));
-	nfs4_setup_remove(cp, name, &up->cinfo);
-	nfs4_setup_getattr(cp, &up->attrs);
+	up->args.fh = NFS_FH(dir->d_inode);
+	up->args.name = name;
 	
-	msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COMPOUND];
-	msg->rpc_argp = cp;
-	msg->rpc_resp = cp;
+	msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVE];
+	msg->rpc_argp = &up->args;
+	msg->rpc_resp = &up->res;
 	return 0;
 }
 
-static int
-nfs4_proc_unlink_done(struct dentry *dir, struct rpc_task *task)
+static int nfs4_proc_unlink_done(struct dentry *dir, struct rpc_task *task)
 {
 	struct rpc_message *msg = &task->tk_msg;
 	struct unlink_desc *up;
 	
-	if (msg->rpc_argp) {
-		up = (struct unlink_desc *) msg->rpc_argp;
-		process_lease(&up->compound);
-		process_cinfo(&up->cinfo, &up->attrs);
-		nfs_refresh_inode(dir->d_inode, &up->attrs);
+	if (msg->rpc_resp != NULL) {
+		up = container_of(msg->rpc_resp, struct unlink_desc, res);
+		update_changeattr(dir->d_inode, &up->res);
 		kfree(up);
+		msg->rpc_resp = NULL;
 		msg->rpc_argp = NULL;
 	}
 	return 0;
 }
 
-static int
-nfs4_proc_rename(struct inode *old_dir, struct qstr *old_name,
-		 struct inode *new_dir, struct qstr *new_name)
+static int nfs4_proc_rename(struct inode *old_dir, struct qstr *old_name,
+		struct inode *new_dir, struct qstr *new_name)
 {
-	struct nfs4_compound	compound;
-	struct nfs4_op		ops[7];
-	struct nfs4_change_info	old_cinfo, new_cinfo;
-	struct nfs_fattr	old_dir_attr, new_dir_attr;
+	struct nfs4_rename_arg arg = {
+		.old_dir = NFS_FH(old_dir),
+		.new_dir = NFS_FH(new_dir),
+		.old_name = old_name,
+		.new_name = new_name,
+	};
+	struct nfs4_rename_res res = { };
+	struct rpc_message msg = {
+		.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENAME],
+		.rpc_argp = &arg,
+		.rpc_resp = &res,
+	};
 	int			status;
-
-	old_dir_attr.valid = 0;
-	new_dir_attr.valid = 0;
 	
-	nfs4_setup_compound(&compound, ops, NFS_SERVER(old_dir), "rename");
-	nfs4_setup_putfh(&compound, NFS_FH(old_dir));
-	nfs4_setup_savefh(&compound);
-	nfs4_setup_putfh(&compound, NFS_FH(new_dir));
-	nfs4_setup_rename(&compound, old_name, new_name, &old_cinfo, &new_cinfo);
-	nfs4_setup_getattr(&compound, &new_dir_attr);
-	nfs4_setup_restorefh(&compound);
-	nfs4_setup_getattr(&compound, &old_dir_attr);
-	status = nfs4_call_compound(&compound, NULL, 0);
+	status = rpc_call_sync(NFS_CLIENT(old_dir), &msg, 0);
 
 	if (!status) {
-		process_cinfo(&old_cinfo, &old_dir_attr);
-		process_cinfo(&new_cinfo, &new_dir_attr);
-		nfs_refresh_inode(old_dir, &old_dir_attr);
-		nfs_refresh_inode(new_dir, &new_dir_attr);
+		update_changeattr(old_dir, &res.old_cinfo);
+		update_changeattr(new_dir, &res.new_cinfo);
 	}
 	return nfs4_map_errors(status);
 }
 
-static int
-nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *name)
+static int nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *name)
 {
-	struct nfs4_compound	compound;
-	struct nfs4_op		ops[7];
-	struct nfs4_change_info	dir_cinfo;
-	struct nfs_fattr	dir_attr, fattr;
+	struct nfs4_link_arg arg = {
+		.fh     = NFS_FH(inode),
+		.dir_fh = NFS_FH(dir),
+		.name   = name,
+	};
+	struct nfs4_change_info	cinfo = { };
+	struct rpc_message msg = {
+		.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LINK],
+		.rpc_argp = &arg,
+		.rpc_resp = &cinfo,
+	};
 	int			status;
-	
-	dir_attr.valid = 0;
-	fattr.valid = 0;
-	
-	nfs4_setup_compound(&compound, ops, NFS_SERVER(inode), "link");
-	nfs4_setup_putfh(&compound, NFS_FH(inode));
-	nfs4_setup_savefh(&compound);
-	nfs4_setup_putfh(&compound, NFS_FH(dir));
-	nfs4_setup_link(&compound, name, &dir_cinfo);
-	nfs4_setup_getattr(&compound, &dir_attr);
-	nfs4_setup_restorefh(&compound);
-	nfs4_setup_getattr(&compound, &fattr);
-	status = nfs4_call_compound(&compound, NULL, 0);
 
-	if (!status) {
-		process_cinfo(&dir_cinfo, &dir_attr);
-		nfs_refresh_inode(dir, &dir_attr);
-		nfs_refresh_inode(inode, &fattr);
-	}
+	status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
+	if (!status)
+		update_changeattr(dir, &cinfo);
+
 	return nfs4_map_errors(status);
 }
 
-static int
-nfs4_proc_symlink(struct inode *dir, struct qstr *name, struct qstr *path,
-		  struct iattr *sattr, struct nfs_fh *fhandle,
-		  struct nfs_fattr *fattr)
-{
-	struct nfs4_compound	compound;
-	struct nfs4_op		ops[7];
-	struct nfs_fattr	dir_attr;
-	struct nfs4_change_info	dir_cinfo;
+static int nfs4_proc_symlink(struct inode *dir, struct qstr *name,
+		struct qstr *path, struct iattr *sattr, struct nfs_fh *fhandle,
+		struct nfs_fattr *fattr)
+{
+	struct nfs_server *server = NFS_SERVER(dir);
+	struct nfs4_create_arg arg = {
+		.dir_fh = NFS_FH(dir),
+		.server = server,
+		.name = name,
+		.attrs = sattr,
+		.ftype = NF4LNK,
+		.bitmask = server->attr_bitmask,
+	};
+	struct nfs4_create_res res = {
+		.server = server,
+		.fh = fhandle,
+		.fattr = fattr,
+	};
+	struct rpc_message msg = {
+		.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE],
+		.rpc_argp = &arg,
+		.rpc_resp = &res,
+	};
 	int			status;
 
-	dir_attr.valid = 0;
+	arg.u.symlink = path;
 	fattr->valid = 0;
 	
-	nfs4_setup_compound(&compound, ops, NFS_SERVER(dir), "symlink");
-	nfs4_setup_putfh(&compound, NFS_FH(dir));
-	nfs4_setup_savefh(&compound);
-	nfs4_setup_create_symlink(&compound, name, path, sattr, &dir_cinfo);
-	nfs4_setup_getattr(&compound, fattr);
-	nfs4_setup_getfh(&compound, fhandle);
-	nfs4_setup_restorefh(&compound);
-	nfs4_setup_getattr(&compound, &dir_attr);
-	status = nfs4_call_compound(&compound, NULL, 0);
-
-	if (!status) {
-		process_cinfo(&dir_cinfo, &dir_attr);
-		nfs_refresh_inode(dir, &dir_attr);
-	}
+	status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
+	if (!status)
+		update_changeattr(dir, &res.dir_cinfo);
 	return nfs4_map_errors(status);
 }
 
-static int
-nfs4_proc_mkdir(struct inode *dir, struct qstr *name, struct iattr *sattr,
-		struct nfs_fh *fhandle, struct nfs_fattr *fattr)
+static int nfs4_proc_mkdir(struct inode *dir, struct qstr *name,
+		struct iattr *sattr, struct nfs_fh *fhandle,
+		struct nfs_fattr *fattr)
 {
-	struct nfs4_compound	compound;
-	struct nfs4_op		ops[7];
-	struct nfs_fattr	dir_attr;
-	struct nfs4_change_info	dir_cinfo;
+	struct nfs_server *server = NFS_SERVER(dir);
+	struct nfs4_create_arg arg = {
+		.dir_fh = NFS_FH(dir),
+		.server = server,
+		.name = name,
+		.attrs = sattr,
+		.ftype = NF4DIR,
+		.bitmask = server->attr_bitmask,
+	};
+	struct nfs4_create_res res = {
+		.server = server,
+		.fh = fhandle,
+		.fattr = fattr,
+	};
+	struct rpc_message msg = {
+		.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE],
+		.rpc_argp = &arg,
+		.rpc_resp = &res,
+	};
 	int			status;
 
-	dir_attr.valid = 0;
 	fattr->valid = 0;
 	
-	nfs4_setup_compound(&compound, ops, NFS_SERVER(dir), "mkdir");
-	nfs4_setup_putfh(&compound, NFS_FH(dir));
-	nfs4_setup_savefh(&compound);
-	nfs4_setup_create_dir(&compound, name, sattr, &dir_cinfo);
-	nfs4_setup_getattr(&compound, fattr);
-	nfs4_setup_getfh(&compound, fhandle);
-	nfs4_setup_restorefh(&compound);
-	nfs4_setup_getattr(&compound, &dir_attr);
-	status = nfs4_call_compound(&compound, NULL, 0);
-
-	if (!status) {
-		process_cinfo(&dir_cinfo, &dir_attr);
-		nfs_refresh_inode(dir, &dir_attr);
-	}
+	status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
+	if (!status)
+		update_changeattr(dir, &res.dir_cinfo);
 	return nfs4_map_errors(status);
 }
 
-static int
-nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
+static int nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
                   u64 cookie, struct page *page, unsigned int count, int plus)
 {
 	struct inode		*dir = dentry->d_inode;
-	struct nfs4_compound	compound;
-	struct nfs4_op		ops[2];
+	struct nfs4_readdir_arg args = {
+		.fh = NFS_FH(dir),
+		.pages = &page,
+		.pgbase = 0,
+		.count = count,
+	};
+	struct nfs4_readdir_res res;
+	struct rpc_message msg = {
+		.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READDIR],
+		.rpc_argp = &args,
+		.rpc_resp = &res,
+		.rpc_cred = cred,
+	};
 	int			status;
 
 	lock_kernel();
-
-	nfs4_setup_compound(&compound, ops, NFS_SERVER(dir), "readdir");
-	nfs4_setup_putfh(&compound, NFS_FH(dir));
-	nfs4_setup_readdir(&compound, cookie, NFS_COOKIEVERF(dir), &page, count, dentry);
-	status = nfs4_call_compound(&compound, cred, 0);
+	nfs4_setup_readdir(cookie, NFS_COOKIEVERF(dir), dentry, &args);
+	res.pgbase = args.pgbase;
+	status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
 	if (status == 0)
-		memcpy(NFS_COOKIEVERF(dir), ops[1].u.readdir.rd_resp_verifier.data, NFS4_VERIFIER_SIZE);
-
+		memcpy(NFS_COOKIEVERF(dir), res.verifier.data, NFS4_VERIFIER_SIZE);
 	unlock_kernel();
 	return nfs4_map_errors(status);
 }
 
-static int
-nfs4_proc_mknod(struct inode *dir, struct qstr *name, struct iattr *sattr,
-		dev_t rdev, struct nfs_fh *fh, struct nfs_fattr *fattr)
+static int nfs4_proc_mknod(struct inode *dir, struct qstr *name,
+		struct iattr *sattr, dev_t rdev, struct nfs_fh *fh,
+		struct nfs_fattr *fattr)
 {
-	struct nfs4_compound	compound;
-	struct nfs4_op		ops[7];
-	struct nfs_fattr	dir_attr;
-	struct nfs4_change_info	dir_cinfo;
+	struct nfs_server *server = NFS_SERVER(dir);
+	struct nfs4_create_arg arg = {
+		.dir_fh = NFS_FH(dir),
+		.server = server,
+		.name = name,
+		.attrs = sattr,
+		.bitmask = server->attr_bitmask,
+	};
+	struct nfs4_create_res res = {
+		.server = server,
+		.fh = fh,
+		.fattr = fattr,
+	};
+	struct rpc_message msg = {
+		.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE],
+		.rpc_argp = &arg,
+		.rpc_resp = &res,
+	};
 	int			status;
+	int                     mode = sattr->ia_mode;
 
-	dir_attr.valid = 0;
 	fattr->valid = 0;
-	
-	nfs4_setup_compound(&compound, ops, NFS_SERVER(dir), "mknod");
-	nfs4_setup_putfh(&compound, NFS_FH(dir));
-	nfs4_setup_savefh(&compound);
-	nfs4_setup_create_special(&compound, name, rdev,sattr, &dir_cinfo);
-	nfs4_setup_getattr(&compound, fattr);
-	nfs4_setup_getfh(&compound, fh);
-	nfs4_setup_restorefh(&compound);
-	nfs4_setup_getattr(&compound, &dir_attr);
-	status = nfs4_call_compound(&compound, NULL, 0);
 
-	if (!status) {
-		process_cinfo(&dir_cinfo, &dir_attr);
-		nfs_refresh_inode(dir, &dir_attr);
+	BUG_ON(!(sattr->ia_valid & ATTR_MODE));
+	BUG_ON(!S_ISFIFO(mode) && !S_ISBLK(mode) && !S_ISCHR(mode) && !S_ISSOCK(mode));
+	if (S_ISFIFO(mode))
+		arg.ftype = NF4FIFO;
+	else if (S_ISBLK(mode)) {
+		arg.ftype = NF4BLK;
+		arg.u.device.specdata1 = MAJOR(rdev);
+		arg.u.device.specdata2 = MINOR(rdev);
 	}
+	else if (S_ISCHR(mode)) {
+		arg.ftype = NF4CHR;
+		arg.u.device.specdata1 = MAJOR(rdev);
+		arg.u.device.specdata2 = MINOR(rdev);
+	}
+	else
+		arg.ftype = NF4SOCK;
+	
+	status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
+	if (!status)
+		update_changeattr(dir, &res.dir_cinfo);
 	return nfs4_map_errors(status);
 }
 
-static int
-nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle,
+static int nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle,
 		 struct nfs_fsstat *fsstat)
 {
-	struct nfs4_compound compound;
-	struct nfs4_op ops[2];
+	struct nfs4_statfs_arg args = {
+		.fh = fhandle,
+		.bitmask = server->attr_bitmask,
+	};
+	struct rpc_message msg = {
+		.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_STATFS],
+		.rpc_argp = &args,
+		.rpc_resp = fsstat,
+	};
 
-	nfs4_setup_compound(&compound, ops, server, "statfs");
-	nfs4_setup_putfh(&compound, fhandle);
-	nfs4_setup_statfs(&compound, fsstat);
-	return nfs4_map_errors(nfs4_call_compound(&compound, NULL, 0));
+	fsstat->fattr->valid = 0;
+	return nfs4_map_errors(rpc_call_sync(server->client, &msg, 0));
 }
 
-static int
-nfs4_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle,
-		 struct nfs_fsinfo *fsinfo)
+static int nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle,
+		struct nfs_fsinfo *fsinfo)
 {
+	struct nfs4_fsinfo_arg args = {
+		.fh = fhandle,
+		.bitmask = server->attr_bitmask,
+	};
 	struct rpc_message msg = {
 		.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FSINFO],
-		.rpc_argp = fhandle,
+		.rpc_argp = &args,
 		.rpc_resp = fsinfo,
 	};
 
 	return nfs4_map_errors(rpc_call_sync(server->client, &msg, 0));
 }
 
-static int
-nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
-		   struct nfs_pathconf *pathconf)
+static int nfs4_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo)
 {
-	struct nfs4_compound compound;
-	struct nfs4_op ops[2];
-
-	nfs4_setup_compound(&compound, ops, server, "statfs");
-	nfs4_setup_putfh(&compound, fhandle);
-	nfs4_setup_pathconf(&compound, pathconf);
-	return nfs4_map_errors(nfs4_call_compound(&compound, NULL, 0));
+	fsinfo->fattr->valid = 0;
+	return nfs4_map_errors(nfs4_do_fsinfo(server, fhandle, fsinfo));
 }
 
-static void
-nfs4_restart_read(struct rpc_task *task)
+static int nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
+		struct nfs_pathconf *pathconf)
 {
-	struct nfs_read_data *data = (struct nfs_read_data *)task->tk_calldata;
-	struct nfs_page *req;
+	struct nfs4_pathconf_arg args = {
+		.fh = fhandle,
+		.bitmask = server->attr_bitmask,
+	};
+	struct rpc_message msg = {
+		.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_PATHCONF],
+		.rpc_argp = &args,
+		.rpc_resp = pathconf,
+	};
 
-	rpc_restart_call(task);
-	req = nfs_list_entry(data->pages.next);
-	if (req->wb_state)
-		nfs4_copy_stateid(&data->args.stateid, req->wb_state, req->wb_lockowner);
-	else
-		memcpy(&data->args.stateid, &zero_stateid, sizeof(data->args.stateid));
+	/* None of the pathconf attributes are mandatory to implement */
+	if ((args.bitmask[0] & nfs4_pathconf_bitmap[0]) == 0) {
+		memset(pathconf, 0, sizeof(*pathconf));
+		return 0;
+	}
+
+	pathconf->fattr->valid = 0;
+	return nfs4_map_errors(rpc_call_sync(server->client, &msg, 0));
 }
 
 static void
@@ -1530,7 +1286,7 @@ nfs4_read_done(struct rpc_task *task)
 	struct inode *inode = data->inode;
 
 	if (nfs4_async_handle_error(task, NFS_SERVER(inode)) == -EAGAIN) {
-		task->tk_action = nfs4_restart_read;
+		rpc_restart_call(task);
 		return;
 	}
 	if (task->tk_status > 0)
@@ -1540,7 +1296,7 @@ nfs4_read_done(struct rpc_task *task)
 }
 
 static void
-nfs4_proc_read_setup(struct nfs_read_data *data, unsigned int count)
+nfs4_proc_read_setup(struct nfs_read_data *data)
 {
 	struct rpc_task	*task = &data->task;
 	struct rpc_message msg = {
@@ -1550,59 +1306,26 @@ nfs4_proc_read_setup(struct nfs_read_dat
 		.rpc_cred = data->cred,
 	};
 	struct inode *inode = data->inode;
-	struct nfs_page *req = nfs_list_entry(data->pages.next);
 	int flags;
 
-	data->args.fh     = NFS_FH(inode);
-	data->args.offset = req_offset(req);
-	data->args.pgbase = req->wb_pgbase;
-	data->args.pages  = data->pagevec;
-	data->args.count  = count;
-	data->res.fattr   = &data->fattr;
-	data->res.count   = count;
-	data->res.eof     = 0;
 	data->timestamp   = jiffies;
 
-	data->lockowner = req->wb_lockowner;
-	if (req->wb_state)
-		nfs4_copy_stateid(&data->args.stateid, req->wb_state, req->wb_lockowner);
-	else
-		memcpy(&data->args.stateid, &zero_stateid, sizeof(data->args.stateid));
-
 	/* N.B. Do we need to test? Never called for swapfile inode */
 	flags = RPC_TASK_ASYNC | (IS_SWAPFILE(inode)? NFS_RPC_SWAPFLAGS : 0);
 
 	/* Finalize the task. */
 	rpc_init_task(task, NFS_CLIENT(inode), nfs4_read_done, flags);
-	task->tk_calldata = data;
-	/* Release requests */
-	task->tk_release = nfs_readdata_release;
-
 	rpc_call_setup(task, &msg, 0);
 }
 
 static void
-nfs4_restart_write(struct rpc_task *task)
-{
-	struct nfs_write_data *data = (struct nfs_write_data *)task->tk_calldata;
-	struct nfs_page *req;
-
-	rpc_restart_call(task);
-	req = nfs_list_entry(data->pages.next);
-	if (req->wb_state)
-		nfs4_copy_stateid(&data->args.stateid, req->wb_state, req->wb_lockowner);
-	else
-		memcpy(&data->args.stateid, &zero_stateid, sizeof(data->args.stateid));
-}
-
-static void
 nfs4_write_done(struct rpc_task *task)
 {
 	struct nfs_write_data *data = (struct nfs_write_data *) task->tk_calldata;
 	struct inode *inode = data->inode;
 	
 	if (nfs4_async_handle_error(task, NFS_SERVER(inode)) == -EAGAIN) {
-		task->tk_action = nfs4_restart_write;
+		rpc_restart_call(task);
 		return;
 	}
 	if (task->tk_status >= 0)
@@ -1612,7 +1335,7 @@ nfs4_write_done(struct rpc_task *task)
 }
 
 static void
-nfs4_proc_write_setup(struct nfs_write_data *data, unsigned int count, int how)
+nfs4_proc_write_setup(struct nfs_write_data *data, int how)
 {
 	struct rpc_task	*task = &data->task;
 	struct rpc_message msg = {
@@ -1622,7 +1345,6 @@ nfs4_proc_write_setup(struct nfs_write_d
 		.rpc_cred = data->cred,
 	};
 	struct inode *inode = data->inode;
-	struct nfs_page *req = nfs_list_entry(data->pages.next);
 	int stable;
 	int flags;
 	
@@ -1633,33 +1355,15 @@ nfs4_proc_write_setup(struct nfs_write_d
 			stable = NFS_DATA_SYNC;
 	} else
 		stable = NFS_UNSTABLE;
-
-	data->args.fh     = NFS_FH(inode);
-	data->args.offset = req_offset(req);
-	data->args.pgbase = req->wb_pgbase;
-	data->args.count  = count;
 	data->args.stable = stable;
-	data->args.pages  = data->pagevec;
-	data->res.fattr   = &data->fattr;
-	data->res.count   = count;
-	data->res.verf    = &data->verf;
-	data->timestamp   = jiffies;
 
-	data->lockowner = req->wb_lockowner;
-	if (req->wb_state)
-		nfs4_copy_stateid(&data->args.stateid, req->wb_state, req->wb_lockowner);
-	else
-		memcpy(&data->args.stateid, &zero_stateid, sizeof(data->args.stateid));
+	data->timestamp   = jiffies;
 
 	/* Set the initial flags for the task.  */
 	flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC;
 
 	/* Finalize the task. */
 	rpc_init_task(task, NFS_CLIENT(inode), nfs4_write_done, flags);
-	task->tk_calldata = data;
-	/* Release requests */
-	task->tk_release = nfs_writedata_release;
-
 	rpc_call_setup(task, &msg, 0);
 }
 
@@ -1670,7 +1374,7 @@ nfs4_commit_done(struct rpc_task *task)
 	struct inode *inode = data->inode;
 	
 	if (nfs4_async_handle_error(task, NFS_SERVER(inode)) == -EAGAIN) {
-		task->tk_action = nfs4_restart_write;
+		rpc_restart_call(task);
 		return;
 	}
 	/* Call back common NFS writeback processing */
@@ -1678,7 +1382,7 @@ nfs4_commit_done(struct rpc_task *task)
 }
 
 static void
-nfs4_proc_commit_setup(struct nfs_write_data *data, u64 start, u32 len, int how)
+nfs4_proc_commit_setup(struct nfs_write_data *data, int how)
 {
 	struct rpc_task	*task = &data->task;
 	struct rpc_message msg = {
@@ -1690,22 +1394,11 @@ nfs4_proc_commit_setup(struct nfs_write_
 	struct inode *inode = data->inode;
 	int flags;
 	
-	data->args.fh     = NFS_FH(data->inode);
-	data->args.offset = start;
-	data->args.count  = len;
-	data->res.count   = len;
-	data->res.fattr   = &data->fattr;
-	data->res.verf    = &data->verf;
-	
 	/* Set the initial flags for the task.  */
 	flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC;
 
 	/* Finalize the task. */
 	rpc_init_task(task, NFS_CLIENT(inode), nfs4_commit_done, flags);
-	task->tk_calldata = data;
-	/* Release requests */
-	task->tk_release = nfs_commit_release;
-	
 	rpc_call_setup(task, &msg, 0);	
 }
 
--- diff/fs/nfs/nfs4state.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/nfs/nfs4state.c	2004-04-21 10:45:35.751268480 +0100
@@ -105,7 +105,7 @@ nfs4_alloc_client(struct in_addr *addr)
 		INIT_WORK(&clp->cl_renewd, nfs4_renew_state, clp);
 		INIT_LIST_HEAD(&clp->cl_superblocks);
 		init_waitqueue_head(&clp->cl_waitq);
-		INIT_RPC_WAITQ(&clp->cl_rpcwaitq, "NFS4 client");
+		rpc_init_wait_queue(&clp->cl_rpcwaitq, "NFS4 client");
 		clp->cl_state = 1 << NFS4CLNT_NEW;
 	}
 	return clp;
--- diff/fs/nfs/nfs4xdr.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/nfs/nfs4xdr.c	2004-04-21 10:45:35.757267568 +0100
@@ -81,21 +81,14 @@ static int nfs_stat_to_errno(int);
 #define decode_putrootfh_maxsz	(op_decode_hdr_maxsz)
 #define encode_getfh_maxsz      (op_encode_hdr_maxsz)
 #define decode_getfh_maxsz      (op_decode_hdr_maxsz + 1 + \
-                                (NFS4_FHSIZE >> 2))
+				((3+NFS4_FHSIZE) >> 2))
 #define encode_getattr_maxsz    (op_encode_hdr_maxsz + 3)
-#define nfs4_fattr_bitmap_maxsz (26 + 2 * ((NFS4_MAXNAMLEN +1) >> 2))
+#define nfs4_name_maxsz		(1 + ((3 + NFS4_MAXNAMLEN) >> 2))
+#define nfs4_fattr_bitmap_maxsz (36 + 2 * nfs4_name_maxsz)
 #define decode_getattr_maxsz    (op_decode_hdr_maxsz + 3 + \
                                 nfs4_fattr_bitmap_maxsz)
 #define encode_savefh_maxsz     (op_encode_hdr_maxsz)
 #define decode_savefh_maxsz     (op_decode_hdr_maxsz)
-#define encode_restorefh_maxsz  (op_encode_hdr_maxsz)
-#define decode_restorefh_maxsz  (op_decode_hdr_maxsz)
-#define encode_read_getattr_maxsz	(op_encode_hdr_maxsz + 2)
-#define decode_read_getattr_maxsz	(op_decode_hdr_maxsz + 8)
-#define encode_pre_write_getattr_maxsz	(op_encode_hdr_maxsz + 2)
-#define decode_pre_write_getattr_maxsz	(op_decode_hdr_maxsz + 5)
-#define encode_post_write_getattr_maxsz	(op_encode_hdr_maxsz + 2)
-#define decode_post_write_getattr_maxsz	(op_decode_hdr_maxsz + 13)
 #define encode_fsinfo_maxsz	(op_encode_hdr_maxsz + 2)
 #define decode_fsinfo_maxsz	(op_decode_hdr_maxsz + 11)
 #define encode_renew_maxsz	(op_encode_hdr_maxsz + 3)
@@ -115,54 +108,63 @@ static int nfs_stat_to_errno(int);
 				3 + (NFS4_VERIFIER_SIZE >> 2))
 #define decode_setclientid_confirm_maxsz \
 				(op_decode_hdr_maxsz)
-
+#define encode_lookup_maxsz	(op_encode_hdr_maxsz + \
+				1 + ((3 + NFS4_FHSIZE) >> 2))
+#define encode_remove_maxsz	(op_encode_hdr_maxsz + \
+				nfs4_name_maxsz)
+#define encode_rename_maxsz	(op_encode_hdr_maxsz + \
+				2 * nfs4_name_maxsz)
+#define decode_rename_maxsz	(op_decode_hdr_maxsz + 5 + 5)
+#define encode_link_maxsz	(op_encode_hdr_maxsz + \
+				nfs4_name_maxsz)
+#define decode_link_maxsz	(op_decode_hdr_maxsz + 5)
+#define encode_create_maxsz	(op_encode_hdr_maxsz + \
+				2 + 2 * nfs4_name_maxsz + \
+				nfs4_fattr_bitmap_maxsz)
+#define decode_create_maxsz	(op_decode_hdr_maxsz + 8)
 #define NFS4_enc_compound_sz	(1024)  /* XXX: large enough? */
 #define NFS4_dec_compound_sz	(1024)  /* XXX: large enough? */
 #define NFS4_enc_read_sz	(compound_encode_hdr_maxsz + \
 				encode_putfh_maxsz + \
-				encode_read_getattr_maxsz + \
 				op_encode_hdr_maxsz + 7)
 #define NFS4_dec_read_sz	(compound_decode_hdr_maxsz + \
 				decode_putfh_maxsz + \
-				decode_read_getattr_maxsz + \
+				op_decode_hdr_maxsz + 2)
+#define NFS4_enc_readlink_sz	(compound_encode_hdr_maxsz + \
+				encode_putfh_maxsz + \
+				op_encode_hdr_maxsz)
+#define NFS4_dec_readlink_sz	(compound_decode_hdr_maxsz + \
+				decode_putfh_maxsz + \
+				op_decode_hdr_maxsz)
+#define NFS4_enc_readdir_sz	(compound_encode_hdr_maxsz + \
+				encode_putfh_maxsz + \
+				op_encode_hdr_maxsz + 9)
+#define NFS4_dec_readdir_sz	(compound_decode_hdr_maxsz + \
+				decode_putfh_maxsz + \
 				op_decode_hdr_maxsz + 2)
 #define NFS4_enc_write_sz	(compound_encode_hdr_maxsz + \
 				encode_putfh_maxsz + \
-				encode_pre_write_getattr_maxsz + \
-				op_encode_hdr_maxsz + 8 + \
-				encode_post_write_getattr_maxsz)
+				op_encode_hdr_maxsz + 8)
 #define NFS4_dec_write_sz	(compound_decode_hdr_maxsz + \
 				decode_putfh_maxsz + \
-				decode_pre_write_getattr_maxsz + \
-				op_decode_hdr_maxsz + 4 + \
-				decode_post_write_getattr_maxsz)
+				op_decode_hdr_maxsz + 4)
 #define NFS4_enc_commit_sz	(compound_encode_hdr_maxsz + \
 				encode_putfh_maxsz + \
-				encode_pre_write_getattr_maxsz + \
-				op_encode_hdr_maxsz + 3 + \
-				encode_post_write_getattr_maxsz)
+				op_encode_hdr_maxsz + 3)
 #define NFS4_dec_commit_sz	(compound_decode_hdr_maxsz + \
 				decode_putfh_maxsz + \
-				decode_pre_write_getattr_maxsz + \
-				op_decode_hdr_maxsz + 2 + \
-				decode_post_write_getattr_maxsz)
+				op_decode_hdr_maxsz + 2)
 #define NFS4_enc_open_sz        (compound_encode_hdr_maxsz + \
                                 encode_putfh_maxsz + \
-                                encode_savefh_maxsz + \
                                 op_encode_hdr_maxsz + \
                                 13 + 3 + 2 + 64 + \
                                 encode_getattr_maxsz + \
-                                encode_getfh_maxsz + \
-                                encode_restorefh_maxsz + \
-                                encode_getattr_maxsz)
+                                encode_getfh_maxsz)
 #define NFS4_dec_open_sz        (compound_decode_hdr_maxsz + \
                                 decode_putfh_maxsz + \
-                                decode_savefh_maxsz + \
                                 op_decode_hdr_maxsz + 4 + 5 + 2 + 3 + \
                                 decode_getattr_maxsz + \
-                                decode_getfh_maxsz + \
-                                decode_restorefh_maxsz + \
-                                decode_getattr_maxsz)
+                                decode_getfh_maxsz)
 #define NFS4_enc_open_confirm_sz      \
                                 (compound_encode_hdr_maxsz + \
                                 encode_putfh_maxsz + \
@@ -255,8 +257,88 @@ static int nfs_stat_to_errno(int);
 				decode_putfh_maxsz + \
 				decode_getattr_maxsz + \
 				op_decode_hdr_maxsz + 4)
-
-
+#define NFS4_enc_access_sz	(compound_encode_hdr_maxsz + \
+				encode_putfh_maxsz + \
+				op_encode_hdr_maxsz + 1)
+#define NFS4_dec_access_sz	(compound_decode_hdr_maxsz + \
+				decode_putfh_maxsz + \
+				op_decode_hdr_maxsz + 2)
+#define NFS4_enc_getattr_sz	(compound_encode_hdr_maxsz + \
+				encode_putfh_maxsz + \
+				encode_getattr_maxsz)
+#define NFS4_dec_getattr_sz	(compound_decode_hdr_maxsz + \
+				decode_putfh_maxsz + \
+				decode_getattr_maxsz)
+#define NFS4_enc_lookup_sz	(compound_encode_hdr_maxsz + \
+				encode_putfh_maxsz + \
+				encode_lookup_maxsz + \
+				encode_getattr_maxsz + \
+				encode_getfh_maxsz)
+#define NFS4_dec_lookup_sz	(compound_decode_hdr_maxsz + \
+				decode_putfh_maxsz + \
+				op_decode_hdr_maxsz + \
+				decode_getattr_maxsz + \
+				decode_getfh_maxsz)
+#define NFS4_enc_lookup_root_sz (compound_encode_hdr_maxsz + \
+				encode_putrootfh_maxsz + \
+				encode_getattr_maxsz + \
+				encode_getfh_maxsz)
+#define NFS4_dec_lookup_root_sz (compound_decode_hdr_maxsz + \
+				decode_putrootfh_maxsz + \
+				decode_getattr_maxsz + \
+				decode_getfh_maxsz)
+#define NFS4_enc_remove_sz	(compound_encode_hdr_maxsz + \
+				encode_putfh_maxsz + \
+				encode_remove_maxsz)
+#define NFS4_dec_remove_sz	(compound_decode_hdr_maxsz + \
+				decode_putfh_maxsz + \
+				op_decode_hdr_maxsz + 5)
+#define NFS4_enc_rename_sz	(compound_encode_hdr_maxsz + \
+				encode_putfh_maxsz + \
+				encode_savefh_maxsz + \
+				encode_putfh_maxsz + \
+				encode_rename_maxsz)
+#define NFS4_dec_rename_sz	(compound_decode_hdr_maxsz + \
+				decode_putfh_maxsz + \
+				decode_savefh_maxsz + \
+				decode_putfh_maxsz + \
+				decode_rename_maxsz)
+#define NFS4_enc_link_sz	(compound_encode_hdr_maxsz + \
+				encode_putfh_maxsz + \
+				encode_savefh_maxsz + \
+				encode_putfh_maxsz + \
+				encode_link_maxsz)
+#define NFS4_dec_link_sz	(compound_decode_hdr_maxsz + \
+				decode_putfh_maxsz + \
+				decode_savefh_maxsz + \
+				decode_putfh_maxsz + \
+				decode_link_maxsz)
+#define NFS4_enc_create_sz	(compound_encode_hdr_maxsz + \
+				encode_putfh_maxsz + \
+				encode_create_maxsz + \
+				encode_getattr_maxsz + \
+				encode_getfh_maxsz)
+#define NFS4_dec_create_sz	(compound_decode_hdr_maxsz + \
+				decode_putfh_maxsz + \
+				decode_create_maxsz + \
+				decode_getattr_maxsz + \
+				decode_getfh_maxsz)
+#define NFS4_enc_pathconf_sz	(compound_encode_hdr_maxsz + \
+				encode_putfh_maxsz + \
+				encode_getattr_maxsz)
+#define NFS4_dec_pathconf_sz	(compound_decode_hdr_maxsz + \
+				decode_putfh_maxsz + \
+				decode_getattr_maxsz)
+#define NFS4_enc_statfs_sz	(compound_encode_hdr_maxsz + \
+				encode_putfh_maxsz + \
+				encode_getattr_maxsz)
+#define NFS4_dec_statfs_sz	(compound_decode_hdr_maxsz + \
+				decode_putfh_maxsz + \
+				op_decode_hdr_maxsz + 12)
+#define NFS4_enc_server_caps_sz (compound_encode_hdr_maxsz + \
+				encode_getattr_maxsz)
+#define NFS4_dec_server_caps_sz (compound_decode_hdr_maxsz + \
+				decode_getattr_maxsz)
 
 static struct {
 	unsigned int	mode;
@@ -297,7 +379,7 @@ struct compound_hdr {
 	*p++ = htonl((uint32_t)(n));					\
 } while (0)
 #define WRITEMEM(ptr,nbytes)     do {				\
-	p = xdr_writemem(p, ptr, nbytes);			\
+	p = xdr_encode_opaque_fixed(p, ptr, nbytes);		\
 } while (0)
 
 #define RESERVE_SPACE(nbytes)	do {				\
@@ -306,19 +388,7 @@ struct compound_hdr {
 	BUG_ON(!p);						\
 } while (0)
 
-static inline
-uint32_t *xdr_writemem(uint32_t *p, const void *ptr, int nbytes)
-{
-	int tmp = XDR_QUADLEN(nbytes);
-	if (!tmp)
-		return p;
-	p[tmp-1] = 0;
-	memcpy(p, ptr, nbytes);
-	return p + tmp;
-}
-
-static int
-encode_compound_hdr(struct xdr_stream *xdr, struct compound_hdr *hdr)
+static int encode_compound_hdr(struct xdr_stream *xdr, struct compound_hdr *hdr)
 {
 	uint32_t *p;
 
@@ -332,9 +402,7 @@ encode_compound_hdr(struct xdr_stream *x
 	return 0;
 }
 
-static int
-encode_attrs(struct xdr_stream *xdr, struct iattr *iap,
-    struct nfs_server *server)
+static int encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, const struct nfs_server *server)
 {
 	char owner_name[IDMAP_NAMESZ];
 	char owner_group[IDMAP_NAMESZ];
@@ -461,20 +529,18 @@ encode_attrs(struct xdr_stream *xdr, str
 	return status;
 }
 
-static int
-encode_access(struct xdr_stream *xdr, struct nfs4_access *access)
+static int encode_access(struct xdr_stream *xdr, u32 access)
 {
 	uint32_t *p;
 
 	RESERVE_SPACE(8);
 	WRITE32(OP_ACCESS);
-	WRITE32(access->ac_req_access);
+	WRITE32(access);
 	
 	return 0;
 }
 
-static int
-encode_close(struct xdr_stream *xdr, struct nfs_closeargs *arg)
+static int encode_close(struct xdr_stream *xdr, const struct nfs_closeargs *arg)
 {
 	uint32_t *p;
 
@@ -486,8 +552,7 @@ encode_close(struct xdr_stream *xdr, str
 	return 0;
 }
 
-static int
-encode_commit(struct xdr_stream *xdr, struct nfs_writeargs *args)
+static int encode_commit(struct xdr_stream *xdr, const struct nfs_writeargs *args)
 {
 	uint32_t *p;
         
@@ -499,42 +564,39 @@ encode_commit(struct xdr_stream *xdr, st
         return 0;
 }
 
-static int
-encode_create(struct xdr_stream *xdr, struct nfs4_create *create,
-    struct nfs_server *server)
+static int encode_create(struct xdr_stream *xdr, const struct nfs4_create_arg *create)
 {
 	uint32_t *p;
 	
 	RESERVE_SPACE(8);
 	WRITE32(OP_CREATE);
-	WRITE32(create->cr_ftype);
+	WRITE32(create->ftype);
 
-	switch (create->cr_ftype) {
+	switch (create->ftype) {
 	case NF4LNK:
-		RESERVE_SPACE(4 + create->cr_textlen);
-		WRITE32(create->cr_textlen);
-		WRITEMEM(create->cr_text, create->cr_textlen);
+		RESERVE_SPACE(4 + create->u.symlink->len);
+		WRITE32(create->u.symlink->len);
+		WRITEMEM(create->u.symlink->name, create->u.symlink->len);
 		break;
 
 	case NF4BLK: case NF4CHR:
 		RESERVE_SPACE(8);
-		WRITE32(create->cr_specdata1);
-		WRITE32(create->cr_specdata2);
+		WRITE32(create->u.device.specdata1);
+		WRITE32(create->u.device.specdata2);
 		break;
 
 	default:
 		break;
 	}
 
-	RESERVE_SPACE(4 + create->cr_namelen);
-	WRITE32(create->cr_namelen);
-	WRITEMEM(create->cr_name, create->cr_namelen);
+	RESERVE_SPACE(4 + create->name->len);
+	WRITE32(create->name->len);
+	WRITEMEM(create->name->name, create->name->len);
 
-	return encode_attrs(xdr, create->cr_attrs, server);
+	return encode_attrs(xdr, create->attrs, create->server);
 }
 
-static int
-encode_getattr_one(struct xdr_stream *xdr, uint32_t bitmap)
+static int encode_getattr_one(struct xdr_stream *xdr, uint32_t bitmap)
 {
         uint32_t *p;
 
@@ -545,8 +607,7 @@ encode_getattr_one(struct xdr_stream *xd
         return 0;
 }
 
-static int
-encode_getattr_two(struct xdr_stream *xdr, uint32_t bm0, uint32_t bm1)
+static int encode_getattr_two(struct xdr_stream *xdr, uint32_t bm0, uint32_t bm1)
 {
         uint32_t *p;
 
@@ -558,56 +619,24 @@ encode_getattr_two(struct xdr_stream *xd
         return 0;
 }
 
-static inline int
-encode_getattr(struct xdr_stream *xdr, struct nfs4_getattr *getattr)
-{
-	return encode_getattr_two(xdr, getattr->gt_bmval[0],
-					getattr->gt_bmval[1]);
-}
-
-/*
- * Request the change attribute in order to check attribute+cache consistency
- */
-static inline int
-encode_read_getattr(struct xdr_stream *xdr)
+static int encode_getfattr(struct xdr_stream *xdr, const u32* bitmask)
 {
-	return encode_getattr_two(xdr, FATTR4_WORD0_CHANGE,
-			FATTR4_WORD1_TIME_ACCESS);
-}
+	extern u32 nfs4_fattr_bitmap[];
 
-/*
- * Request the change attribute prior to doing a write operation
- */
-static inline int
-encode_pre_write_getattr(struct xdr_stream *xdr)
-{
-	/* Request the change attribute */
-	return encode_getattr_one(xdr, FATTR4_WORD0_CHANGE);
+	return encode_getattr_two(xdr,
+			bitmask[0] & nfs4_fattr_bitmap[0],
+			bitmask[1] & nfs4_fattr_bitmap[1]);
 }
 
-/*
- * Request the change attribute, size, and [cm]time after a write operation
- */
-static inline int
-encode_post_write_getattr(struct xdr_stream *xdr)
+static int encode_fsinfo(struct xdr_stream *xdr, const u32* bitmask)
 {
-	return encode_getattr_two(xdr, FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE,
-			FATTR4_WORD1_SPACE_USED |
-			FATTR4_WORD1_TIME_METADATA |
-			FATTR4_WORD1_TIME_MODIFY);
-}
+	extern u32 nfs4_fsinfo_bitmap[];
 
-static int
-encode_fsinfo(struct xdr_stream *xdr)
-{
-	return encode_getattr_one(xdr, FATTR4_WORD0_MAXFILESIZE
-			| FATTR4_WORD0_MAXREAD
-			| FATTR4_WORD0_MAXWRITE
-			| FATTR4_WORD0_LEASE_TIME);
+	return encode_getattr_two(xdr, bitmask[0] & nfs4_fsinfo_bitmap[0],
+			bitmask[1] & nfs4_fsinfo_bitmap[1]);
 }
 
-static int
-encode_getfh(struct xdr_stream *xdr)
+static int encode_getfh(struct xdr_stream *xdr)
 {
 	uint32_t *p;
 
@@ -617,15 +646,14 @@ encode_getfh(struct xdr_stream *xdr)
 	return 0;
 }
 
-static int
-encode_link(struct xdr_stream *xdr, struct nfs4_link *link)
+static int encode_link(struct xdr_stream *xdr, const struct qstr *name)
 {
 	uint32_t *p;
 
-	RESERVE_SPACE(8 + link->ln_namelen);
+	RESERVE_SPACE(8 + name->len);
 	WRITE32(OP_LINK);
-	WRITE32(link->ln_namelen);
-	WRITEMEM(link->ln_name, link->ln_namelen);
+	WRITE32(name->len);
+	WRITEMEM(name->name, name->len);
 	
 	return 0;
 }
@@ -634,8 +662,7 @@ encode_link(struct xdr_stream *xdr, stru
  * opcode,type,reclaim,offset,length,new_lock_owner = 32
  * open_seqid,open_stateid,lock_seqid,lock_owner.clientid, lock_owner.id = 40
  */
-static int
-encode_lock(struct xdr_stream *xdr, struct nfs_lockargs *arg)
+static int encode_lock(struct xdr_stream *xdr, const struct nfs_lockargs *arg)
 {
 	uint32_t *p;
 	struct nfs_lock_opargs *opargs = arg->u.lock;
@@ -669,8 +696,7 @@ encode_lock(struct xdr_stream *xdr, stru
 	return 0;
 }
 
-static int
-encode_lockt(struct xdr_stream *xdr, struct nfs_lockargs *arg)
+static int encode_lockt(struct xdr_stream *xdr, const struct nfs_lockargs *arg)
 {
 	uint32_t *p;
 	struct nfs_lowner *opargs = arg->u.lockt;
@@ -687,8 +713,7 @@ encode_lockt(struct xdr_stream *xdr, str
 	return 0;
 }
 
-static int
-encode_locku(struct xdr_stream *xdr, struct nfs_lockargs *arg)
+static int encode_locku(struct xdr_stream *xdr, const struct nfs_lockargs *arg)
 {
 	uint32_t *p;
 	struct nfs_locku_opargs *opargs = arg->u.locku;
@@ -704,22 +729,20 @@ encode_locku(struct xdr_stream *xdr, str
 	return 0;
 }
 
-static int
-encode_lookup(struct xdr_stream *xdr, struct nfs4_lookup *lookup)
+static int encode_lookup(struct xdr_stream *xdr, const struct qstr *name)
 {
-	int len = lookup->lo_name->len;
+	int len = name->len;
 	uint32_t *p;
 
 	RESERVE_SPACE(8 + len);
 	WRITE32(OP_LOOKUP);
 	WRITE32(len);
-	WRITEMEM(lookup->lo_name->name, len);
+	WRITEMEM(name->name, len);
 
 	return 0;
 }
 
-static int
-encode_open(struct xdr_stream *xdr, struct nfs_openargs *arg)
+static int encode_open(struct xdr_stream *xdr, const struct nfs_openargs *arg)
 {
 	int status;
 	uint32_t *p;
@@ -778,8 +801,7 @@ encode_open(struct xdr_stream *xdr, stru
 	return 0;
 }
 
-static int
-encode_open_confirm(struct xdr_stream *xdr, struct nfs_open_confirmargs *arg)
+static int encode_open_confirm(struct xdr_stream *xdr, const struct nfs_open_confirmargs *arg)
 {
 	uint32_t *p;
 
@@ -792,8 +814,7 @@ encode_open_confirm(struct xdr_stream *x
 }
 
 
-static int
-encode_open_reclaim(struct xdr_stream *xdr, struct nfs_open_reclaimargs *arg)
+static int encode_open_reclaim(struct xdr_stream *xdr, const struct nfs_open_reclaimargs *arg)
 {
 	uint32_t *p;
 
@@ -827,8 +848,7 @@ encode_open_reclaim(struct xdr_stream *x
 	return 0;
 }
 
-static int
-encode_open_downgrade(struct xdr_stream *xdr, struct nfs_closeargs *arg)
+static int encode_open_downgrade(struct xdr_stream *xdr, const struct nfs_closeargs *arg)
 {
 	uint32_t *p;
 
@@ -844,7 +864,7 @@ encode_open_downgrade(struct xdr_stream 
 }
 
 static int
-encode_putfh(struct xdr_stream *xdr, struct nfs_fh *fh)
+encode_putfh(struct xdr_stream *xdr, const struct nfs_fh *fh)
 {
 	int len = fh->size;
 	uint32_t *p;
@@ -857,8 +877,7 @@ encode_putfh(struct xdr_stream *xdr, str
 	return 0;
 }
 
-static int
-encode_putrootfh(struct xdr_stream *xdr)
+static int encode_putrootfh(struct xdr_stream *xdr)
 {
         uint32_t *p;
         
@@ -868,22 +887,37 @@ encode_putrootfh(struct xdr_stream *xdr)
         return 0;
 }
 
-static int
-encode_read(struct xdr_stream *xdr, struct nfs_readargs *args)
+static void encode_stateid(struct xdr_stream *xdr, struct nfs4_state *state, fl_owner_t lockowner)
 {
+	extern nfs4_stateid zero_stateid;
+	nfs4_stateid stateid;
 	uint32_t *p;
 
-	RESERVE_SPACE(32);
+	RESERVE_SPACE(16);
+	if (state != NULL) {
+		nfs4_copy_stateid(&stateid, state, lockowner);
+		WRITEMEM(stateid.data, sizeof(stateid.data));
+	} else
+		WRITEMEM(zero_stateid.data, sizeof(zero_stateid.data));
+}
+
+static int encode_read(struct xdr_stream *xdr, const struct nfs_readargs *args)
+{
+	uint32_t *p;
+
+	RESERVE_SPACE(4);
 	WRITE32(OP_READ);
-	WRITEMEM(args->stateid.data, sizeof(args->stateid.data));
+
+	encode_stateid(xdr, args->state, args->lockowner);
+
+	RESERVE_SPACE(12);
 	WRITE64(args->offset);
 	WRITE32(args->count);
 
 	return 0;
 }
 
-static int
-encode_readdir(struct xdr_stream *xdr, struct nfs4_readdir *readdir, struct rpc_rqst *req)
+static int encode_readdir(struct xdr_stream *xdr, const struct nfs4_readdir_arg *readdir, struct rpc_rqst *req)
 {
 	struct rpc_auth *auth = req->rq_task->tk_auth;
 	int replen;
@@ -891,27 +925,26 @@ encode_readdir(struct xdr_stream *xdr, s
 
 	RESERVE_SPACE(32+sizeof(nfs4_verifier));
 	WRITE32(OP_READDIR);
-	WRITE64(readdir->rd_cookie);
-	WRITEMEM(readdir->rd_req_verifier.data, sizeof(readdir->rd_req_verifier.data));
-	WRITE32(readdir->rd_count >> 5);  /* meaningless "dircount" field */
-	WRITE32(readdir->rd_count);
+	WRITE64(readdir->cookie);
+	WRITEMEM(readdir->verifier.data, sizeof(readdir->verifier.data));
+	WRITE32(readdir->count >> 5);  /* meaningless "dircount" field */
+	WRITE32(readdir->count);
 	WRITE32(2);
-	WRITE32(readdir->rd_bmval[0]);
-	WRITE32(readdir->rd_bmval[1]);
+	WRITE32(FATTR4_WORD0_FILEID);
+	WRITE32(0);
 
 	/* set up reply iovec
 	 *    toplevel_status + taglen + rescount + OP_PUTFH + status
 	 *      + OP_READDIR + status + verifer(2)  = 9
 	 */
 	replen = (RPC_REPHDRSIZE + auth->au_rslack + 9) << 2;
-	xdr_inline_pages(&req->rq_rcv_buf, replen, readdir->rd_pages,
-			 readdir->rd_pgbase, readdir->rd_count);
+	xdr_inline_pages(&req->rq_rcv_buf, replen, readdir->pages,
+			 readdir->pgbase, readdir->count);
 
 	return 0;
 }
 
-static int
-encode_readlink(struct xdr_stream *xdr, struct nfs4_readlink *readlink, struct rpc_rqst *req)
+static int encode_readlink(struct xdr_stream *xdr, const struct nfs4_readlink *readlink, struct rpc_rqst *req)
 {
 	struct rpc_auth *auth = req->rq_task->tk_auth;
 	int replen;
@@ -925,43 +958,40 @@ encode_readlink(struct xdr_stream *xdr, 
 	 *      + OP_READLINK + status  = 7
 	 */
 	replen = (RPC_REPHDRSIZE + auth->au_rslack + 7) << 2;
-	xdr_inline_pages(&req->rq_rcv_buf, replen, readlink->rl_pages, 0, readlink->rl_count);
+	xdr_inline_pages(&req->rq_rcv_buf, replen, readlink->pages, 0, readlink->count);
 	
 	return 0;
 }
 
-static int
-encode_remove(struct xdr_stream *xdr, struct nfs4_remove *remove)
+static int encode_remove(struct xdr_stream *xdr, const struct qstr *name)
 {
 	uint32_t *p;
 
-	RESERVE_SPACE(8 + remove->rm_namelen);
+	RESERVE_SPACE(8 + name->len);
 	WRITE32(OP_REMOVE);
-	WRITE32(remove->rm_namelen);
-	WRITEMEM(remove->rm_name, remove->rm_namelen);
+	WRITE32(name->len);
+	WRITEMEM(name->name, name->len);
 
 	return 0;
 }
 
-static int
-encode_rename(struct xdr_stream *xdr, struct nfs4_rename *rename)
+static int encode_rename(struct xdr_stream *xdr, const struct qstr *oldname, const struct qstr *newname)
 {
 	uint32_t *p;
 
-	RESERVE_SPACE(8 + rename->rn_oldnamelen);
+	RESERVE_SPACE(8 + oldname->len);
 	WRITE32(OP_RENAME);
-	WRITE32(rename->rn_oldnamelen);
-	WRITEMEM(rename->rn_oldname, rename->rn_oldnamelen);
+	WRITE32(oldname->len);
+	WRITEMEM(oldname->name, oldname->len);
 	
-	RESERVE_SPACE(4 + rename->rn_newnamelen);
-	WRITE32(rename->rn_newnamelen);
-	WRITEMEM(rename->rn_newname, rename->rn_newnamelen);
+	RESERVE_SPACE(4 + newname->len);
+	WRITE32(newname->len);
+	WRITEMEM(newname->name, newname->len);
 
 	return 0;
 }
 
-static int
-encode_renew(struct xdr_stream *xdr, struct nfs4_client *client_stateid)
+static int encode_renew(struct xdr_stream *xdr, const struct nfs4_client *client_stateid)
 {
 	uint32_t *p;
 
@@ -973,17 +1003,6 @@ encode_renew(struct xdr_stream *xdr, str
 }
 
 static int
-encode_restorefh(struct xdr_stream *xdr)
-{
-	uint32_t *p;
-
-	RESERVE_SPACE(4);
-	WRITE32(OP_RESTOREFH);
-
-	return 0;
-}
-
-static int
 encode_savefh(struct xdr_stream *xdr)
 {
 	uint32_t *p;
@@ -994,9 +1013,7 @@ encode_savefh(struct xdr_stream *xdr)
 	return 0;
 }
 
-static int
-encode_setattr(struct xdr_stream *xdr, struct nfs_setattrargs *arg,
-    struct nfs_server *server)
+static int encode_setattr(struct xdr_stream *xdr, const struct nfs_setattrargs *arg, const struct nfs_server *server)
 {
 	int status;
 	uint32_t *p;
@@ -1011,8 +1028,7 @@ encode_setattr(struct xdr_stream *xdr, s
         return 0;
 }
 
-static int
-encode_setclientid(struct xdr_stream *xdr, struct nfs4_setclientid *setclientid)
+static int encode_setclientid(struct xdr_stream *xdr, const struct nfs4_setclientid *setclientid)
 {
 	uint32_t total_len;
 	uint32_t len1, len2, len3;
@@ -1039,8 +1055,7 @@ encode_setclientid(struct xdr_stream *xd
 	return 0;
 }
 
-static int
-encode_setclientid_confirm(struct xdr_stream *xdr, struct nfs4_client *client_state)
+static int encode_setclientid_confirm(struct xdr_stream *xdr, const struct nfs4_client *client_state)
 {
         uint32_t *p;
 
@@ -1052,14 +1067,16 @@ encode_setclientid_confirm(struct xdr_st
         return 0;
 }
 
-static int
-encode_write(struct xdr_stream *xdr, struct nfs_writeargs *args)
+static int encode_write(struct xdr_stream *xdr, const struct nfs_writeargs *args)
 {
 	uint32_t *p;
 
-	RESERVE_SPACE(36);
+	RESERVE_SPACE(4);
 	WRITE32(OP_WRITE);
-	WRITEMEM(args->stateid.data, sizeof(args->stateid.data));
+
+	encode_stateid(xdr, args->state, args->lockowner);
+
+	RESERVE_SPACE(16);
 	WRITE64(args->offset);
 	WRITE32(args->stable);
 	WRITE32(args->count);
@@ -1068,297 +1085,409 @@ encode_write(struct xdr_stream *xdr, str
 
 	return 0;
 }
-
-/* FIXME: this sucks */
-static int
-encode_compound(struct xdr_stream *xdr, struct nfs4_compound *cp, struct rpc_rqst *req)
-{
-	struct compound_hdr hdr = {
-		.taglen = cp->taglen,
-		.tag	= cp->tag,
-		.nops	= cp->req_nops,
-	};
-	int i, status = 0;
-
-	encode_compound_hdr(xdr, &hdr);
-
-	for (i = 0; i < cp->req_nops; i++) {
-		switch (cp->ops[i].opnum) {
-		case OP_ACCESS:
-			status = encode_access(xdr, &cp->ops[i].u.access);
-			break;
-		case OP_CREATE:
-			status = encode_create(xdr, &cp->ops[i].u.create, cp->server);
-			break;
-		case OP_GETATTR:
-			status = encode_getattr(xdr, &cp->ops[i].u.getattr);
-			break;
-		case OP_GETFH:
-			status = encode_getfh(xdr);
-			break;
-		case OP_LINK:
-			status = encode_link(xdr, &cp->ops[i].u.link);
-			break;
-		case OP_LOOKUP:
-			status = encode_lookup(xdr, &cp->ops[i].u.lookup);
-			break;
-		case OP_PUTFH:
-			status = encode_putfh(xdr, cp->ops[i].u.putfh.pf_fhandle);
-			break;
-		case OP_PUTROOTFH:
-			status = encode_putrootfh(xdr);
-			break;
-		case OP_READDIR:
-			status = encode_readdir(xdr, &cp->ops[i].u.readdir, req);
-			break;
-		case OP_READLINK:
-			status = encode_readlink(xdr, &cp->ops[i].u.readlink, req);
-			break;
-		case OP_REMOVE:
-			status = encode_remove(xdr, &cp->ops[i].u.remove);
-			break;
-		case OP_RENAME:
-			status = encode_rename(xdr, &cp->ops[i].u.rename);
-			break;
-		case OP_RESTOREFH:
-			status = encode_restorefh(xdr);
-			break;
-		case OP_SAVEFH:
-			status = encode_savefh(xdr);
-			break;
-		default:
-			BUG();
-		}
-		if (status)
-			return status;
-	}
-	
-	return 0;
-}
 /*
  * END OF "GENERIC" ENCODE ROUTINES.
  */
 
-
 /*
- * Encode COMPOUND argument
+ * Encode an ACCESS request
  */
-static int
-nfs4_xdr_enc_compound(struct rpc_rqst *req, uint32_t *p, struct nfs4_compound *cp)
+static int nfs4_xdr_enc_access(struct rpc_rqst *req, uint32_t *p, const struct nfs4_accessargs *args)
 {
 	struct xdr_stream xdr;
+	struct compound_hdr hdr = {
+		.nops = 2,
+	};
 	int status;
-	
+
 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-	status = encode_compound(&xdr, cp, req);
-	cp->timestamp = jiffies;
+	encode_compound_hdr(&xdr, &hdr);
+	if ((status = encode_putfh(&xdr, args->fh)) == 0)
+		status = encode_access(&xdr, args->access);
 	return status;
 }
-/*
- * Encode a CLOSE request
- */
-static int
-nfs4_xdr_enc_close(struct rpc_rqst *req, uint32_t *p, struct nfs_closeargs *args)
-{
-        struct xdr_stream xdr;
-        struct compound_hdr hdr = {
-                .nops   = 2,
-        };
-        int status;
-
-        xdr_init_encode(&xdr, &req->rq_snd_buf, p);
-        encode_compound_hdr(&xdr, &hdr);
-        status = encode_putfh(&xdr, args->fh);
-        if(status)
-                goto out;
-        status = encode_close(&xdr, args);
-out:
-        return status;
-}
 
 /*
- * Encode an OPEN request
+ * Encode LOOKUP request
  */
-static int
-nfs4_xdr_enc_open(struct rpc_rqst *req, uint32_t *p, struct nfs_openargs *args)
+static int nfs4_xdr_enc_lookup(struct rpc_rqst *req, uint32_t *p, const struct nfs4_lookup_arg *args)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr = {
-		.nops   = 7,
+		.nops = 4,
 	};
 	int status;
 
 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
 	encode_compound_hdr(&xdr, &hdr);
-	status = encode_putfh(&xdr, args->fh);
-	if (status)
-		goto out;
-	status = encode_savefh(&xdr);
-	if (status)
-		goto out;
-	status = encode_open(&xdr, args);
-	if (status)
-		goto out;
-	status = encode_getattr(&xdr, args->f_getattr);
-	if (status)
+	if ((status = encode_putfh(&xdr, args->dir_fh)) != 0)
 		goto out;
-	status = encode_getfh(&xdr);
-	if (status)
+	if ((status = encode_lookup(&xdr, args->name)) != 0)
 		goto out;
-	status = encode_restorefh(&xdr);
-	if (status)
+	if ((status = encode_getfh(&xdr)) != 0)
 		goto out;
-	status = encode_getattr(&xdr, args->d_getattr);
+	status = encode_getfattr(&xdr, args->bitmask);
 out:
 	return status;
 }
 
 /*
- * Encode an OPEN_CONFIRM request
+ * Encode LOOKUP_ROOT request
  */
-static int
-nfs4_xdr_enc_open_confirm(struct rpc_rqst *req, uint32_t *p, struct nfs_open_confirmargs *args)
+static int nfs4_xdr_enc_lookup_root(struct rpc_rqst *req, uint32_t *p, const struct nfs4_lookup_root_arg *args)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr = {
-		.nops   = 2,
+		.nops = 3,
 	};
 	int status;
 
 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
 	encode_compound_hdr(&xdr, &hdr);
-	status = encode_putfh(&xdr, args->fh);
-	if(status)
+	if ((status = encode_putrootfh(&xdr)) != 0)
 		goto out;
-	status = encode_open_confirm(&xdr, args);
+	if ((status = encode_getfh(&xdr)) == 0)
+		status = encode_getfattr(&xdr, args->bitmask);
 out:
 	return status;
 }
 
 /*
- * Encode an OPEN request
+ * Encode REMOVE request
  */
-static int
-nfs4_xdr_enc_open_reclaim(struct rpc_rqst *req, uint32_t *p,
-		struct nfs_open_reclaimargs *args)
+static int nfs4_xdr_enc_remove(struct rpc_rqst *req, uint32_t *p, const struct nfs4_remove_arg *args)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr = {
-		.nops   = 3,
+		.nops = 2,
 	};
 	int status;
 
 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
 	encode_compound_hdr(&xdr, &hdr);
-	status = encode_putfh(&xdr, args->fh);
-	if (status)
-		goto out;
-	status = encode_open_reclaim(&xdr, args);
-	if (status)
-		goto out;
-	status = encode_getattr(&xdr, args->f_getattr);
-out:
+	if ((status = encode_putfh(&xdr, args->fh)) == 0)
+		status = encode_remove(&xdr, args->name);
 	return status;
 }
 
 /*
- * Encode an OPEN_DOWNGRADE request
+ * Encode RENAME request
  */
-static int
-nfs4_xdr_enc_open_downgrade(struct rpc_rqst *req, uint32_t *p, struct nfs_closeargs *args)
+static int nfs4_xdr_enc_rename(struct rpc_rqst *req, uint32_t *p, const struct nfs4_rename_arg *args)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr = {
-		.nops	= 2,
+		.nops = 4,
 	};
 	int status;
 
 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
 	encode_compound_hdr(&xdr, &hdr);
-	status = encode_putfh(&xdr, args->fh);
-	if (status)
+	if ((status = encode_putfh(&xdr, args->old_dir)) != 0)
 		goto out;
-	status = encode_open_downgrade(&xdr, args);
+	if ((status = encode_savefh(&xdr)) != 0)
+		goto out;
+	if ((status = encode_putfh(&xdr, args->new_dir)) != 0)
+		goto out;
+	status = encode_rename(&xdr, args->old_name, args->new_name);
 out:
 	return status;
 }
 
 /*
- * Encode a LOCK request
+ * Encode LINK request
  */
-static int
-nfs4_xdr_enc_lock(struct rpc_rqst *req, uint32_t *p, struct nfs_lockargs *args)
+static int nfs4_xdr_enc_link(struct rpc_rqst *req, uint32_t *p, const struct nfs4_link_arg *args)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr = {
-		.nops   = 2,
+		.nops = 4,
 	};
 	int status;
 
 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
 	encode_compound_hdr(&xdr, &hdr);
-	status = encode_putfh(&xdr, args->fh);
-	if(status)
+	if ((status = encode_putfh(&xdr, args->fh)) != 0)
 		goto out;
-	status = encode_lock(&xdr, args);
+	if ((status = encode_savefh(&xdr)) != 0)
+		goto out;
+	if ((status = encode_putfh(&xdr, args->dir_fh)) != 0)
+		goto out;
+	status = encode_link(&xdr, args->name);
 out:
 	return status;
 }
 
 /*
- * Encode a LOCKT request
+ * Encode CREATE request
  */
-static int
-nfs4_xdr_enc_lockt(struct rpc_rqst *req, uint32_t *p, struct nfs_lockargs *args)
+static int nfs4_xdr_enc_create(struct rpc_rqst *req, uint32_t *p, const struct nfs4_create_arg *args)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr = {
-		.nops   = 2,
+		.nops = 4,
 	};
 	int status;
 
 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
 	encode_compound_hdr(&xdr, &hdr);
-	status = encode_putfh(&xdr, args->fh);
-	if(status)
+	if ((status = encode_putfh(&xdr, args->dir_fh)) != 0)
 		goto out;
-	status = encode_lockt(&xdr, args);
+	if ((status = encode_create(&xdr, args)) != 0)
+		goto out;
+	if ((status = encode_getfattr(&xdr, args->bitmask)) != 0)
+		goto out;
+	status = encode_getfh(&xdr);
 out:
 	return status;
 }
 
 /*
- * Encode a LOCKU request
+ * Encode GETATTR request
  */
-static int
-nfs4_xdr_enc_locku(struct rpc_rqst *req, uint32_t *p, struct nfs_lockargs *args)
+static int nfs4_xdr_enc_getattr(struct rpc_rqst *req, uint32_t *p, const struct nfs4_getattr_arg *args)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr = {
-		.nops   = 2,
+		.nops = 2,
 	};
 	int status;
 
 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
 	encode_compound_hdr(&xdr, &hdr);
-	status = encode_putfh(&xdr, args->fh);
-	if(status)
-		goto out;
-	status = encode_locku(&xdr, args);
-out:
+	if ((status = encode_putfh(&xdr, args->fh)) == 0)
+		status = encode_getfattr(&xdr, args->bitmask);
 	return status;
 }
 
 /*
- * Encode a READ request
+ * Encode a CLOSE request
  */
-static int
-nfs4_xdr_enc_read(struct rpc_rqst *req, uint32_t *p, struct nfs_readargs *args)
+static int nfs4_xdr_enc_close(struct rpc_rqst *req, uint32_t *p, struct nfs_closeargs *args)
+{
+        struct xdr_stream xdr;
+        struct compound_hdr hdr = {
+                .nops   = 2,
+        };
+        int status;
+
+        xdr_init_encode(&xdr, &req->rq_snd_buf, p);
+        encode_compound_hdr(&xdr, &hdr);
+        status = encode_putfh(&xdr, args->fh);
+        if(status)
+                goto out;
+        status = encode_close(&xdr, args);
+out:
+        return status;
+}
+
+/*
+ * Encode an OPEN request
+ */
+static int nfs4_xdr_enc_open(struct rpc_rqst *req, uint32_t *p, struct nfs_openargs *args)
 {
-	struct rpc_auth	*auth = req->rq_task->tk_auth;
 	struct xdr_stream xdr;
 	struct compound_hdr hdr = {
-		.nops	= 3,
+		.nops = 4,
+	};
+	int status;
+
+	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
+	encode_compound_hdr(&xdr, &hdr);
+	status = encode_putfh(&xdr, args->fh);
+	if (status)
+		goto out;
+	status = encode_open(&xdr, args);
+	if (status)
+		goto out;
+	status = encode_getfattr(&xdr, args->bitmask);
+	if (status)
+		goto out;
+	status = encode_getfh(&xdr);
+out:
+	return status;
+}
+
+/*
+ * Encode an OPEN_CONFIRM request
+ */
+static int nfs4_xdr_enc_open_confirm(struct rpc_rqst *req, uint32_t *p, struct nfs_open_confirmargs *args)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr = {
+		.nops   = 2,
+	};
+	int status;
+
+	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
+	encode_compound_hdr(&xdr, &hdr);
+	status = encode_putfh(&xdr, args->fh);
+	if(status)
+		goto out;
+	status = encode_open_confirm(&xdr, args);
+out:
+	return status;
+}
+
+/*
+ * Encode an OPEN request
+ */
+static int nfs4_xdr_enc_open_reclaim(struct rpc_rqst *req, uint32_t *p, struct nfs_open_reclaimargs *args)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr = {
+		.nops   = 3,
+	};
+	int status;
+
+	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
+	encode_compound_hdr(&xdr, &hdr);
+	status = encode_putfh(&xdr, args->fh);
+	if (status)
+		goto out;
+	status = encode_open_reclaim(&xdr, args);
+	if (status)
+		goto out;
+	status = encode_getfattr(&xdr, args->bitmask);
+out:
+	return status;
+}
+
+/*
+ * Encode an OPEN_DOWNGRADE request
+ */
+static int nfs4_xdr_enc_open_downgrade(struct rpc_rqst *req, uint32_t *p, struct nfs_closeargs *args)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr = {
+		.nops	= 2,
+	};
+	int status;
+
+	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
+	encode_compound_hdr(&xdr, &hdr);
+	status = encode_putfh(&xdr, args->fh);
+	if (status)
+		goto out;
+	status = encode_open_downgrade(&xdr, args);
+out:
+	return status;
+}
+
+/*
+ * Encode a LOCK request
+ */
+static int nfs4_xdr_enc_lock(struct rpc_rqst *req, uint32_t *p, struct nfs_lockargs *args)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr = {
+		.nops   = 2,
+	};
+	int status;
+
+	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
+	encode_compound_hdr(&xdr, &hdr);
+	status = encode_putfh(&xdr, args->fh);
+	if(status)
+		goto out;
+	status = encode_lock(&xdr, args);
+out:
+	return status;
+}
+
+/*
+ * Encode a LOCKT request
+ */
+static int nfs4_xdr_enc_lockt(struct rpc_rqst *req, uint32_t *p, struct nfs_lockargs *args)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr = {
+		.nops   = 2,
+	};
+	int status;
+
+	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
+	encode_compound_hdr(&xdr, &hdr);
+	status = encode_putfh(&xdr, args->fh);
+	if(status)
+		goto out;
+	status = encode_lockt(&xdr, args);
+out:
+	return status;
+}
+
+/*
+ * Encode a LOCKU request
+ */
+static int nfs4_xdr_enc_locku(struct rpc_rqst *req, uint32_t *p, struct nfs_lockargs *args)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr = {
+		.nops   = 2,
+	};
+	int status;
+
+	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
+	encode_compound_hdr(&xdr, &hdr);
+	status = encode_putfh(&xdr, args->fh);
+	if(status)
+		goto out;
+	status = encode_locku(&xdr, args);
+out:
+	return status;
+}
+
+/*
+ * Encode a READLINK request
+ */
+static int nfs4_xdr_enc_readlink(struct rpc_rqst *req, uint32_t *p, const struct nfs4_readlink *args)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr = {
+		.nops = 2,
+	};
+	int status;
+
+	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
+	encode_compound_hdr(&xdr, &hdr);
+	status = encode_putfh(&xdr, args->fh);
+	if(status)
+		goto out;
+	status = encode_readlink(&xdr, args, req);
+out:
+	return status;
+}
+
+/*
+ * Encode a READDIR request
+ */
+static int nfs4_xdr_enc_readdir(struct rpc_rqst *req, uint32_t *p, const struct nfs4_readdir_arg *args)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr = {
+		.nops = 2,
+	};
+	int status;
+
+	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
+	encode_compound_hdr(&xdr, &hdr);
+	status = encode_putfh(&xdr, args->fh);
+	if(status)
+		goto out;
+	status = encode_readdir(&xdr, args, req);
+out:
+	return status;
+}
+
+/*
+ * Encode a READ request
+ */
+static int nfs4_xdr_enc_read(struct rpc_rqst *req, uint32_t *p, struct nfs_readargs *args)
+{
+	struct rpc_auth	*auth = req->rq_task->tk_auth;
+	struct xdr_stream xdr;
+	struct compound_hdr hdr = {
+		.nops = 2,
 	};
 	int replen, status;
 
@@ -1370,14 +1499,12 @@ nfs4_xdr_enc_read(struct rpc_rqst *req, 
 	status = encode_read(&xdr, args);
 	if (status)
 		goto out;
-	status = encode_read_getattr(&xdr);
 
 	/* set up reply iovec
 	 *    toplevel status + taglen=0 + rescount + OP_PUTFH + status
 	 *       + OP_READ + status + eof + datalen = 9
 	 */
-	replen = (RPC_REPHDRSIZE + auth->au_rslack +
-			NFS4_dec_read_sz - decode_read_getattr_maxsz) << 2;
+	replen = (RPC_REPHDRSIZE + auth->au_rslack + NFS4_dec_read_sz) << 2;
 	xdr_inline_pages(&req->rq_rcv_buf, replen,
 			 args->pages, args->pgbase, args->count);
 out:
@@ -1387,8 +1514,7 @@ out:
 /*
  * Encode an SETATTR request
  */
-static int
-nfs4_xdr_enc_setattr(struct rpc_rqst *req, uint32_t *p, struct nfs_setattrargs *args)
+static int nfs4_xdr_enc_setattr(struct rpc_rqst *req, uint32_t *p, struct nfs_setattrargs *args)
 
 {
         struct xdr_stream xdr;
@@ -1405,7 +1531,7 @@ nfs4_xdr_enc_setattr(struct rpc_rqst *re
         status = encode_setattr(&xdr, args, args->server);
         if(status)
                 goto out;
-        status = encode_getattr(&xdr, args->attr);
+	status = encode_getfattr(&xdr, args->bitmask);
 out:
         return status;
 }
@@ -1413,12 +1539,11 @@ out:
 /*
  * Encode a WRITE request
  */
-static int
-nfs4_xdr_enc_write(struct rpc_rqst *req, uint32_t *p, struct nfs_writeargs *args)
+static int nfs4_xdr_enc_write(struct rpc_rqst *req, uint32_t *p, struct nfs_writeargs *args)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr = {
-		.nops   = 4,
+		.nops = 2,
 	};
 	int status;
 
@@ -1427,13 +1552,7 @@ nfs4_xdr_enc_write(struct rpc_rqst *req,
 	status = encode_putfh(&xdr, args->fh);
 	if (status)
 		goto out;
-	status = encode_pre_write_getattr(&xdr);
-	if (status)
-		goto out;
 	status = encode_write(&xdr, args);
-	if (status)
-		goto out;
-	status = encode_post_write_getattr(&xdr);
 out:
 	return status;
 }
@@ -1441,12 +1560,11 @@ out:
 /*
  *  a COMMIT request
  */
-static int
-nfs4_xdr_enc_commit(struct rpc_rqst *req, uint32_t *p, struct nfs_writeargs *args)
+static int nfs4_xdr_enc_commit(struct rpc_rqst *req, uint32_t *p, struct nfs_writeargs *args)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr = {
-		.nops   = 4,
+		.nops = 2,
 	};
 	int status;
 
@@ -1455,13 +1573,7 @@ nfs4_xdr_enc_commit(struct rpc_rqst *req
 	status = encode_putfh(&xdr, args->fh);
 	if (status)
 		goto out;
-	status = encode_pre_write_getattr(&xdr);
-	if (status)
-		goto out;
 	status = encode_commit(&xdr, args);
-	if (status)
-		goto out;
-	status = encode_post_write_getattr(&xdr);
 out:
 	return status;
 }
@@ -1469,8 +1581,7 @@ out:
 /*
  * FSINFO request
  */
-static int
-nfs4_xdr_enc_fsinfo(struct rpc_rqst *req, uint32_t *p, void *fhandle)
+static int nfs4_xdr_enc_fsinfo(struct rpc_rqst *req, uint32_t *p, struct nfs4_fsinfo_arg *args)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr = {
@@ -1480,17 +1591,81 @@ nfs4_xdr_enc_fsinfo(struct rpc_rqst *req
 
 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
 	encode_compound_hdr(&xdr, &hdr);
-	status = encode_putfh(&xdr, fhandle);
+	status = encode_putfh(&xdr, args->fh);
+	if (!status)
+		status = encode_fsinfo(&xdr, args->bitmask);
+	return status;
+}
+
+/*
+ * a PATHCONF request
+ */
+static int nfs4_xdr_enc_pathconf(struct rpc_rqst *req, uint32_t *p, const struct nfs4_pathconf_arg *args)
+{
+	extern u32 nfs4_pathconf_bitmap[2];
+	struct xdr_stream xdr;
+	struct compound_hdr hdr = {
+		.nops = 2,
+	};
+	int status;
+
+	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
+	encode_compound_hdr(&xdr, &hdr);
+	status = encode_putfh(&xdr, args->fh);
 	if (!status)
-		status = encode_fsinfo(&xdr);
+		status = encode_getattr_one(&xdr,
+				args->bitmask[0] & nfs4_pathconf_bitmap[0]);
+	return status;
+}
+
+/*
+ * a STATFS request
+ */
+static int nfs4_xdr_enc_statfs(struct rpc_rqst *req, uint32_t *p, const struct nfs4_statfs_arg *args)
+{
+	extern u32 nfs4_statfs_bitmap[];
+	struct xdr_stream xdr;
+	struct compound_hdr hdr = {
+		.nops = 2,
+	};
+	int status;
+
+	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
+	encode_compound_hdr(&xdr, &hdr);
+	status = encode_putfh(&xdr, args->fh);
+	if (status == 0)
+		status = encode_getattr_two(&xdr,
+				args->bitmask[0] & nfs4_statfs_bitmap[0],
+				args->bitmask[1] & nfs4_statfs_bitmap[1]);
+	return status;
+}
+
+/*
+ * GETATTR_BITMAP request
+ */
+static int nfs4_xdr_enc_server_caps(struct rpc_rqst *req, uint32_t *p, const struct nfs_fh *fhandle)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr = {
+		.nops = 2,
+	};
+	int status;
+
+	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
+	encode_compound_hdr(&xdr, &hdr);
+	status = encode_putfh(&xdr, fhandle);
+	if (status == 0)
+		status = encode_getattr_one(&xdr, FATTR4_WORD0_SUPPORTED_ATTRS|
+				FATTR4_WORD0_LINK_SUPPORT|
+				FATTR4_WORD0_SYMLINK_SUPPORT|
+				FATTR4_WORD0_ACLSUPPORT);
 	return status;
 }
 
 /*
  * a RENEW request
  */
-static int
-nfs4_xdr_enc_renew(struct rpc_rqst *req, uint32_t *p, struct nfs4_client *clp)
+static int nfs4_xdr_enc_renew(struct rpc_rqst *req, uint32_t *p, struct nfs4_client *clp)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr = {
@@ -1505,9 +1680,7 @@ nfs4_xdr_enc_renew(struct rpc_rqst *req,
 /*
  * a SETCLIENTID request
  */
-static int
-nfs4_xdr_enc_setclientid(struct rpc_rqst *req, uint32_t *p,
-		struct nfs4_setclientid *sc)
+static int nfs4_xdr_enc_setclientid(struct rpc_rqst *req, uint32_t *p, struct nfs4_setclientid *sc)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr = {
@@ -1522,14 +1695,13 @@ nfs4_xdr_enc_setclientid(struct rpc_rqst
 /*
  * a SETCLIENTID_CONFIRM request
  */
-static int
-nfs4_xdr_enc_setclientid_confirm(struct rpc_rqst *req, uint32_t *p,
-		struct nfs4_client *clp)
+static int nfs4_xdr_enc_setclientid_confirm(struct rpc_rqst *req, uint32_t *p, struct nfs4_client *clp)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr = {
 		.nops	= 3,
 	};
+	const u32 lease_bitmap[2] = { FATTR4_WORD0_LEASE_TIME, 0 };
 	int status;
 
 	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
@@ -1538,7 +1710,7 @@ nfs4_xdr_enc_setclientid_confirm(struct 
 	if (!status)
 		status = encode_putrootfh(&xdr);
 	if (!status)
-		status = encode_fsinfo(&xdr);
+		status = encode_fsinfo(&xdr, lease_bitmap);
 	return status;
 }
 
@@ -1552,15 +1724,6 @@ nfs4_xdr_enc_setclientid_confirm(struct 
  * task to translate them into Linux-specific versions which are more
  * consistent with the style used in NFSv2/v3...
  */
-#define DECODE_TAIL				\
-	status = 0;				\
-out:						\
-	return status;				\
-xdr_error:					\
-	printk(KERN_NOTICE "xdr error! (%s:%d)\n", __FILE__, __LINE__); \
-	status = -EIO;				\
-	goto out
-
 #define READ32(x)         (x) = ntohl(*p++)
 #define READ64(x)         do {			\
 	(x) = (u64)ntohl(*p++) << 32;		\
@@ -1585,8 +1748,7 @@ xdr_error:					\
 	} \
 } while (0)
 
-static int
-decode_compound_hdr(struct xdr_stream *xdr, struct compound_hdr *hdr)
+static int decode_compound_hdr(struct xdr_stream *xdr, struct compound_hdr *hdr)
 {
 	uint32_t *p;
 
@@ -1601,30 +1763,612 @@ decode_compound_hdr(struct xdr_stream *x
 	return 0;
 }
 
-static int
-decode_op_hdr(struct xdr_stream *xdr, enum nfs_opnum4 expected)
+static int decode_op_hdr(struct xdr_stream *xdr, enum nfs_opnum4 expected)
+{
+	uint32_t *p;
+	uint32_t opnum;
+	int32_t nfserr;
+
+	READ_BUF(8);
+	READ32(opnum);
+	if (opnum != expected) {
+		printk(KERN_NOTICE
+				"nfs4_decode_op_hdr: Server returned operation"
+			       	" %d but we issued a request for %d\n",
+				opnum, expected);
+		return -EIO;
+	}
+	READ32(nfserr);
+	if (nfserr != NFS_OK)
+		return -nfs_stat_to_errno(nfserr);
+	return 0;
+}
+
+static int decode_attr_bitmap(struct xdr_stream *xdr, uint32_t *bitmap)
+{
+	uint32_t bmlen, *p;
+
+	READ_BUF(4);
+	READ32(bmlen);
+
+	bitmap[0] = bitmap[1] = 0;
+	READ_BUF((bmlen << 2));
+	if (bmlen > 0) {
+		READ32(bitmap[0]);
+		if (bmlen > 1)
+			READ32(bitmap[1]);
+	}
+	return 0;
+}
+
+static inline int decode_attr_length(struct xdr_stream *xdr, uint32_t *attrlen, uint32_t **savep)
+{
+	uint32_t *p;
+
+	READ_BUF(4);
+	READ32(*attrlen);
+	*savep = xdr->p;
+	return 0;
+}
+
+static int decode_attr_supported(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *bitmask)
+{
+	if (likely(bitmap[0] & FATTR4_WORD0_SUPPORTED_ATTRS)) {
+		decode_attr_bitmap(xdr, bitmask);
+		bitmap[0] &= ~FATTR4_WORD0_SUPPORTED_ATTRS;
+	} else
+		bitmask[0] = bitmask[1] = 0;
+	dprintk("%s: bitmask=0x%x%x\n", __FUNCTION__, bitmask[0], bitmask[1]);
+	return 0;
+}
+
+static int decode_attr_type(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *type)
+{
+	uint32_t *p;
+
+	*type = 0;
+	if (unlikely(bitmap[0] & (FATTR4_WORD0_TYPE - 1U)))
+		return -EIO;
+	if (likely(bitmap[0] & FATTR4_WORD0_TYPE)) {
+		READ_BUF(4);
+		READ32(*type);
+		if (*type < NF4REG || *type > NF4NAMEDATTR) {
+			dprintk("%s: bad type %d\n", __FUNCTION__, *type);
+			return -EIO;
+		}
+		bitmap[0] &= ~FATTR4_WORD0_TYPE;
+	}
+	dprintk("%s: type=0%o\n", __FUNCTION__, nfs_type2fmt[*type].nfs2type);
+	return 0;
+}
+
+static int decode_attr_change(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *change)
+{
+	uint32_t *p;
+
+	*change = 0;
+	if (unlikely(bitmap[0] & (FATTR4_WORD0_CHANGE - 1U)))
+		return -EIO;
+	if (likely(bitmap[0] & FATTR4_WORD0_CHANGE)) {
+		READ_BUF(8);
+		READ64(*change);
+		bitmap[0] &= ~FATTR4_WORD0_CHANGE;
+	}
+	dprintk("%s: change attribute=%Lu\n", __FUNCTION__,
+			(unsigned long long)*change);
+	return 0;
+}
+
+static int decode_attr_size(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *size)
+{
+	uint32_t *p;
+
+	*size = 0;
+	if (unlikely(bitmap[0] & (FATTR4_WORD0_SIZE - 1U)))
+		return -EIO;
+	if (likely(bitmap[0] & FATTR4_WORD0_SIZE)) {
+		READ_BUF(8);
+		READ64(*size);
+		bitmap[0] &= ~FATTR4_WORD0_SIZE;
+	}
+	dprintk("%s: file size=%Lu\n", __FUNCTION__, (unsigned long long)*size);
+	return 0;
+}
+
+static int decode_attr_link_support(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res)
+{
+	uint32_t *p;
+
+	*res = 0;
+	if (unlikely(bitmap[0] & (FATTR4_WORD0_LINK_SUPPORT - 1U)))
+		return -EIO;
+	if (likely(bitmap[0] & FATTR4_WORD0_LINK_SUPPORT)) {
+		READ_BUF(4);
+		READ32(*res);
+		bitmap[0] &= ~FATTR4_WORD0_LINK_SUPPORT;
+	}
+	dprintk("%s: link support=%s\n", __FUNCTION__, *res == 0 ? "false" : "true");
+	return 0;
+}
+
+static int decode_attr_symlink_support(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res)
+{
+	uint32_t *p;
+
+	*res = 0;
+	if (unlikely(bitmap[0] & (FATTR4_WORD0_SYMLINK_SUPPORT - 1U)))
+		return -EIO;
+	if (likely(bitmap[0] & FATTR4_WORD0_SYMLINK_SUPPORT)) {
+		READ_BUF(4);
+		READ32(*res);
+		bitmap[0] &= ~FATTR4_WORD0_SYMLINK_SUPPORT;
+	}
+	dprintk("%s: symlink support=%s\n", __FUNCTION__, *res == 0 ? "false" : "true");
+	return 0;
+}
+
+static int decode_attr_fsid(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs4_fsid *fsid)
+{
+	uint32_t *p;
+
+	fsid->major = 0;
+	fsid->minor = 0;
+	if (unlikely(bitmap[0] & (FATTR4_WORD0_FSID - 1U)))
+		return -EIO;
+	if (likely(bitmap[0] & FATTR4_WORD0_FSID)) {
+		READ_BUF(16);
+		READ64(fsid->major);
+		READ64(fsid->minor);
+		bitmap[0] &= ~FATTR4_WORD0_FSID;
+	}
+	dprintk("%s: fsid=(0x%Lx/0x%Lx)\n", __FUNCTION__,
+			(unsigned long long)fsid->major,
+			(unsigned long long)fsid->minor);
+	return 0;
+}
+
+static int decode_attr_lease_time(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res)
+{
+	uint32_t *p;
+
+	*res = 60;
+	if (unlikely(bitmap[0] & (FATTR4_WORD0_LEASE_TIME - 1U)))
+		return -EIO;
+	if (likely(bitmap[0] & FATTR4_WORD0_LEASE_TIME)) {
+		READ_BUF(4);
+		READ32(*res);
+		bitmap[0] &= ~FATTR4_WORD0_LEASE_TIME;
+	}
+	dprintk("%s: file size=%u\n", __FUNCTION__, (unsigned int)*res);
+	return 0;
+}
+
+static int decode_attr_aclsupport(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res)
+{
+	uint32_t *p;
+
+	*res = ACL4_SUPPORT_ALLOW_ACL|ACL4_SUPPORT_DENY_ACL;
+	if (unlikely(bitmap[0] & (FATTR4_WORD0_ACLSUPPORT - 1U)))
+		return -EIO;
+	if (likely(bitmap[0] & FATTR4_WORD0_ACLSUPPORT)) {
+		READ_BUF(4);
+		READ32(*res);
+		bitmap[0] &= ~FATTR4_WORD0_ACLSUPPORT;
+	}
+	dprintk("%s: ACLs supported=%u\n", __FUNCTION__, (unsigned int)*res);
+	return 0;
+}
+
+static int decode_attr_fileid(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *fileid)
+{
+	uint32_t *p;
+
+	*fileid = 0;
+	if (unlikely(bitmap[0] & (FATTR4_WORD0_FILEID - 1U)))
+		return -EIO;
+	if (likely(bitmap[0] & FATTR4_WORD0_FILEID)) {
+		READ_BUF(8);
+		READ64(*fileid);
+		bitmap[0] &= ~FATTR4_WORD0_FILEID;
+	}
+	dprintk("%s: fileid=%Lu\n", __FUNCTION__, (unsigned long long)*fileid);
+	return 0;
+}
+
+static int decode_attr_files_avail(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res)
+{
+	uint32_t *p;
+	int status = 0;
+
+	*res = 0;
+	if (unlikely(bitmap[0] & (FATTR4_WORD0_FILES_AVAIL - 1U)))
+		return -EIO;
+	if (likely(bitmap[0] & FATTR4_WORD0_FILES_AVAIL)) {
+		READ_BUF(8);
+		READ64(*res);
+		bitmap[0] &= ~FATTR4_WORD0_FILES_AVAIL;
+	}
+	dprintk("%s: files avail=%Lu\n", __FUNCTION__, (unsigned long long)*res);
+	return status;
+}
+
+static int decode_attr_files_free(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res)
+{
+	uint32_t *p;
+	int status = 0;
+
+	*res = 0;
+	if (unlikely(bitmap[0] & (FATTR4_WORD0_FILES_FREE - 1U)))
+		return -EIO;
+	if (likely(bitmap[0] & FATTR4_WORD0_FILES_FREE)) {
+		READ_BUF(8);
+		READ64(*res);
+		bitmap[0] &= ~FATTR4_WORD0_FILES_FREE;
+	}
+	dprintk("%s: files free=%Lu\n", __FUNCTION__, (unsigned long long)*res);
+	return status;
+}
+
+static int decode_attr_files_total(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res)
+{
+	uint32_t *p;
+	int status = 0;
+
+	*res = 0;
+	if (unlikely(bitmap[0] & (FATTR4_WORD0_FILES_TOTAL - 1U)))
+		return -EIO;
+	if (likely(bitmap[0] & FATTR4_WORD0_FILES_TOTAL)) {
+		READ_BUF(8);
+		READ64(*res);
+		bitmap[0] &= ~FATTR4_WORD0_FILES_TOTAL;
+	}
+	dprintk("%s: files total=%Lu\n", __FUNCTION__, (unsigned long long)*res);
+	return status;
+}
+
+static int decode_attr_maxfilesize(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res)
+{
+	uint32_t *p;
+	int status = 0;
+
+	*res = 0;
+	if (unlikely(bitmap[0] & (FATTR4_WORD0_MAXFILESIZE - 1U)))
+		return -EIO;
+	if (likely(bitmap[0] & FATTR4_WORD0_MAXFILESIZE)) {
+		READ_BUF(8);
+		READ64(*res);
+		bitmap[0] &= ~FATTR4_WORD0_MAXFILESIZE;
+	}
+	dprintk("%s: maxfilesize=%Lu\n", __FUNCTION__, (unsigned long long)*res);
+	return status;
+}
+
+static int decode_attr_maxlink(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *maxlink)
+{
+	uint32_t *p;
+	int status = 0;
+
+	*maxlink = 1;
+	if (unlikely(bitmap[0] & (FATTR4_WORD0_MAXLINK - 1U)))
+		return -EIO;
+	if (likely(bitmap[0] & FATTR4_WORD0_MAXLINK)) {
+		READ_BUF(4);
+		READ32(*maxlink);
+		bitmap[0] &= ~FATTR4_WORD0_MAXLINK;
+	}
+	dprintk("%s: maxlink=%u\n", __FUNCTION__, *maxlink);
+	return status;
+}
+
+static int decode_attr_maxname(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *maxname)
+{
+	uint32_t *p;
+	int status = 0;
+
+	*maxname = 1024;
+	if (unlikely(bitmap[0] & (FATTR4_WORD0_MAXNAME - 1U)))
+		return -EIO;
+	if (likely(bitmap[0] & FATTR4_WORD0_MAXNAME)) {
+		READ_BUF(4);
+		READ32(*maxname);
+		bitmap[0] &= ~FATTR4_WORD0_MAXNAME;
+	}
+	dprintk("%s: maxname=%u\n", __FUNCTION__, *maxname);
+	return status;
+}
+
+static int decode_attr_maxread(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res)
+{
+	uint32_t *p;
+	int status = 0;
+
+	*res = 1024;
+	if (unlikely(bitmap[0] & (FATTR4_WORD0_MAXREAD - 1U)))
+		return -EIO;
+	if (likely(bitmap[0] & FATTR4_WORD0_MAXREAD)) {
+		uint64_t maxread;
+		READ_BUF(8);
+		READ64(maxread);
+		if (maxread > 0x7FFFFFFF)
+			maxread = 0x7FFFFFFF;
+		*res = (uint32_t)maxread;
+		bitmap[0] &= ~FATTR4_WORD0_MAXREAD;
+	}
+	dprintk("%s: maxread=%lu\n", __FUNCTION__, (unsigned long)*res);
+	return status;
+}
+
+static int decode_attr_maxwrite(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res)
+{
+	uint32_t *p;
+	int status = 0;
+
+	*res = 1024;
+	if (unlikely(bitmap[0] & (FATTR4_WORD0_MAXWRITE - 1U)))
+		return -EIO;
+	if (likely(bitmap[0] & FATTR4_WORD0_MAXWRITE)) {
+		uint64_t maxwrite;
+		READ_BUF(8);
+		READ64(maxwrite);
+		if (maxwrite > 0x7FFFFFFF)
+			maxwrite = 0x7FFFFFFF;
+		*res = (uint32_t)maxwrite;
+		bitmap[0] &= ~FATTR4_WORD0_MAXWRITE;
+	}
+	dprintk("%s: maxwrite=%lu\n", __FUNCTION__, (unsigned long)*res);
+	return status;
+}
+
+static int decode_attr_mode(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *mode)
+{
+	uint32_t *p;
+
+	*mode = 0;
+	if (unlikely(bitmap[1] & (FATTR4_WORD1_MODE - 1U)))
+		return -EIO;
+	if (likely(bitmap[1] & FATTR4_WORD1_MODE)) {
+		READ_BUF(4);
+		READ32(*mode);
+		*mode &= ~S_IFMT;
+		bitmap[1] &= ~FATTR4_WORD1_MODE;
+	}
+	dprintk("%s: file mode=0%o\n", __FUNCTION__, (unsigned int)*mode);
+	return 0;
+}
+
+static int decode_attr_nlink(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *nlink)
+{
+	uint32_t *p;
+
+	*nlink = 1;
+	if (unlikely(bitmap[1] & (FATTR4_WORD1_NUMLINKS - 1U)))
+		return -EIO;
+	if (likely(bitmap[1] & FATTR4_WORD1_NUMLINKS)) {
+		READ_BUF(4);
+		READ32(*nlink);
+		bitmap[1] &= ~FATTR4_WORD1_NUMLINKS;
+	}
+	dprintk("%s: nlink=%u\n", __FUNCTION__, (unsigned int)*nlink);
+	return 0;
+}
+
+static int decode_attr_owner(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs4_client *clp, int32_t *uid)
+{
+	uint32_t len, *p;
+
+	*uid = -2;
+	if (unlikely(bitmap[1] & (FATTR4_WORD1_OWNER - 1U)))
+		return -EIO;
+	if (likely(bitmap[1] & FATTR4_WORD1_OWNER)) {
+		READ_BUF(4);
+		READ32(len);
+		READ_BUF(len);
+		if (len < XDR_MAX_NETOBJ) {
+			if (nfs_map_name_to_uid(clp, (char *)p, len, uid) != 0)
+				dprintk("%s: nfs_map_name_to_uid failed!\n",
+						__FUNCTION__);
+		} else
+			printk(KERN_WARNING "%s: name too long (%u)!\n",
+					__FUNCTION__, len);
+		bitmap[1] &= ~FATTR4_WORD1_OWNER;
+	}
+	dprintk("%s: uid=%d\n", __FUNCTION__, (int)*uid);
+	return 0;
+}
+
+static int decode_attr_group(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs4_client *clp, int32_t *gid)
+{
+	uint32_t len, *p;
+
+	*gid = -2;
+	if (unlikely(bitmap[1] & (FATTR4_WORD1_OWNER_GROUP - 1U)))
+		return -EIO;
+	if (likely(bitmap[1] & FATTR4_WORD1_OWNER_GROUP)) {
+		READ_BUF(4);
+		READ32(len);
+		READ_BUF(len);
+		if (len < XDR_MAX_NETOBJ) {
+			if (nfs_map_group_to_gid(clp, (char *)p, len, gid) != 0)
+				dprintk("%s: nfs_map_group_to_gid failed!\n",
+						__FUNCTION__);
+		} else
+			printk(KERN_WARNING "%s: name too long (%u)!\n",
+					__FUNCTION__, len);
+		bitmap[1] &= ~FATTR4_WORD1_OWNER_GROUP;
+	}
+	dprintk("%s: gid=%d\n", __FUNCTION__, (int)*gid);
+	return 0;
+}
+
+static int decode_attr_rdev(struct xdr_stream *xdr, uint32_t *bitmap, dev_t *rdev)
+{
+	uint32_t major = 0, minor = 0, *p;
+
+	*rdev = MKDEV(0,0);
+	if (unlikely(bitmap[1] & (FATTR4_WORD1_RAWDEV - 1U)))
+		return -EIO;
+	if (likely(bitmap[1] & FATTR4_WORD1_RAWDEV)) {
+		dev_t tmp;
+
+		READ_BUF(8);
+		READ32(major);
+		READ32(minor);
+		tmp = MKDEV(major, minor);
+		if (MAJOR(tmp) == major && MINOR(tmp) == minor)
+			*rdev = tmp;
+		bitmap[1] &= ~ FATTR4_WORD1_RAWDEV;
+	}
+	dprintk("%s: rdev=(0x%x:0x%x)\n", __FUNCTION__, major, minor);
+	return 0;
+}
+
+static int decode_attr_space_avail(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res)
+{
+	uint32_t *p;
+	int status = 0;
+
+	*res = 0;
+	if (unlikely(bitmap[1] & (FATTR4_WORD1_SPACE_AVAIL - 1U)))
+		return -EIO;
+	if (likely(bitmap[1] & FATTR4_WORD1_SPACE_AVAIL)) {
+		READ_BUF(8);
+		READ64(*res);
+		bitmap[1] &= ~FATTR4_WORD1_SPACE_AVAIL;
+	}
+	dprintk("%s: space avail=%Lu\n", __FUNCTION__, (unsigned long long)*res);
+	return status;
+}
+
+static int decode_attr_space_free(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res)
+{
+	uint32_t *p;
+	int status = 0;
+
+	*res = 0;
+	if (unlikely(bitmap[1] & (FATTR4_WORD1_SPACE_FREE - 1U)))
+		return -EIO;
+	if (likely(bitmap[1] & FATTR4_WORD1_SPACE_FREE)) {
+		READ_BUF(8);
+		READ64(*res);
+		bitmap[1] &= ~FATTR4_WORD1_SPACE_FREE;
+	}
+	dprintk("%s: space free=%Lu\n", __FUNCTION__, (unsigned long long)*res);
+	return status;
+}
+
+static int decode_attr_space_total(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *res)
+{
+	uint32_t *p;
+	int status = 0;
+
+	*res = 0;
+	if (unlikely(bitmap[1] & (FATTR4_WORD1_SPACE_TOTAL - 1U)))
+		return -EIO;
+	if (likely(bitmap[1] & FATTR4_WORD1_SPACE_TOTAL)) {
+		READ_BUF(8);
+		READ64(*res);
+		bitmap[1] &= ~FATTR4_WORD1_SPACE_TOTAL;
+	}
+	dprintk("%s: space total=%Lu\n", __FUNCTION__, (unsigned long long)*res);
+	return status;
+}
+
+static int decode_attr_space_used(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *used)
+{
+	uint32_t *p;
+
+	*used = 0;
+	if (unlikely(bitmap[1] & (FATTR4_WORD1_SPACE_USED - 1U)))
+		return -EIO;
+	if (likely(bitmap[1] & FATTR4_WORD1_SPACE_USED)) {
+		READ_BUF(8);
+		READ64(*used);
+		bitmap[1] &= ~FATTR4_WORD1_SPACE_USED;
+	}
+	dprintk("%s: space used=%Lu\n", __FUNCTION__,
+			(unsigned long long)*used);
+	return 0;
+}
+
+static int decode_attr_time(struct xdr_stream *xdr, struct timespec *time)
+{
+	uint32_t *p;
+	uint64_t sec;
+	uint32_t nsec;
+
+	READ_BUF(12);
+	READ64(sec);
+	READ32(nsec);
+	time->tv_sec = (time_t)sec;
+	time->tv_nsec = (long)nsec;
+	return 0;
+}
+
+static int decode_attr_time_access(struct xdr_stream *xdr, uint32_t *bitmap, struct timespec *time)
+{
+	int status = 0;
+
+	time->tv_sec = 0;
+	time->tv_nsec = 0;
+	if (unlikely(bitmap[1] & (FATTR4_WORD1_TIME_ACCESS - 1U)))
+		return -EIO;
+	if (likely(bitmap[1] & FATTR4_WORD1_TIME_ACCESS)) {
+		status = decode_attr_time(xdr, time);
+		bitmap[1] &= ~FATTR4_WORD1_TIME_ACCESS;
+	}
+	dprintk("%s: atime=%ld\n", __FUNCTION__, (long)time->tv_sec);
+	return status;
+}
+
+static int decode_attr_time_metadata(struct xdr_stream *xdr, uint32_t *bitmap, struct timespec *time)
+{
+	int status = 0;
+
+	time->tv_sec = 0;
+	time->tv_nsec = 0;
+	if (unlikely(bitmap[1] & (FATTR4_WORD1_TIME_METADATA - 1U)))
+		return -EIO;
+	if (likely(bitmap[1] & FATTR4_WORD1_TIME_METADATA)) {
+		status = decode_attr_time(xdr, time);
+		bitmap[1] &= ~FATTR4_WORD1_TIME_METADATA;
+	}
+	dprintk("%s: ctime=%ld\n", __FUNCTION__, (long)time->tv_sec);
+	return status;
+}
+
+static int decode_attr_time_modify(struct xdr_stream *xdr, uint32_t *bitmap, struct timespec *time)
+{
+	int status = 0;
+
+	time->tv_sec = 0;
+	time->tv_nsec = 0;
+	if (unlikely(bitmap[1] & (FATTR4_WORD1_TIME_MODIFY - 1U)))
+		return -EIO;
+	if (likely(bitmap[1] & FATTR4_WORD1_TIME_MODIFY)) {
+		status = decode_attr_time(xdr, time);
+		bitmap[1] &= ~FATTR4_WORD1_TIME_MODIFY;
+	}
+	dprintk("%s: mtime=%ld\n", __FUNCTION__, (long)time->tv_sec);
+	return status;
+}
+
+static int verify_attr_len(struct xdr_stream *xdr, uint32_t *savep, uint32_t attrlen)
 {
-	uint32_t *p;
-	uint32_t opnum;
-	int32_t nfserr;
+	unsigned int attrwords = XDR_QUADLEN(attrlen);
+	unsigned int nwords = xdr->p - savep;
 
-	READ_BUF(8);
-	READ32(opnum);
-	if (opnum != expected) {
-		printk(KERN_NOTICE
-				"nfs4_decode_op_hdr: Server returned operation"
-			       	" %d but we issued a request for %d\n",
-				opnum, expected);
+	if (unlikely(attrwords != nwords)) {
+		printk(KERN_WARNING "%s: server returned incorrect attribute length: %u %c %u\n",
+				__FUNCTION__,
+				attrwords << 2,
+				(attrwords < nwords) ? '<' : '>',
+				nwords << 2);
 		return -EIO;
 	}
-	READ32(nfserr);
-	if (nfserr != NFS_OK)
-		return -nfs_stat_to_errno(nfserr);
 	return 0;
 }
 
-static int
-decode_change_info(struct xdr_stream *xdr, struct nfs4_change_info *cinfo)
+static int decode_change_info(struct xdr_stream *xdr, struct nfs4_change_info *cinfo)
 {
 	uint32_t *p;
 
@@ -1635,8 +2379,7 @@ decode_change_info(struct xdr_stream *xd
 	return 0;
 }
 
-static int
-decode_access(struct xdr_stream *xdr, struct nfs4_access *access)
+static int decode_access(struct xdr_stream *xdr, struct nfs4_accessres *access)
 {
 	uint32_t *p;
 	uint32_t supp, acc;
@@ -1648,17 +2391,12 @@ decode_access(struct xdr_stream *xdr, st
 	READ_BUF(8);
 	READ32(supp);
 	READ32(acc);
-	if ((supp & ~access->ac_req_access) || (acc & ~supp)) {
-		printk(KERN_NOTICE "NFS: server returned bad bits in access call!\n");
-		return -EIO;
-	}
-	*access->ac_resp_supported = supp;
-	*access->ac_resp_access = acc;
+	access->supported = supp;
+	access->access = acc;
 	return 0;
 }
 
-static int
-decode_close(struct xdr_stream *xdr, struct nfs_closeres *res)
+static int decode_close(struct xdr_stream *xdr, struct nfs_closeres *res)
 {
 	uint32_t *p;
 	int status;
@@ -1671,8 +2409,7 @@ decode_close(struct xdr_stream *xdr, str
 	return 0;
 }
 
-static int
-decode_commit(struct xdr_stream *xdr, struct nfs_writeres *res)
+static int decode_commit(struct xdr_stream *xdr, struct nfs_writeres *res)
 {
 	uint32_t *p;
 	int status;
@@ -1685,8 +2422,7 @@ decode_commit(struct xdr_stream *xdr, st
 	return 0;
 }
 
-static int
-decode_create(struct xdr_stream *xdr, struct nfs4_create *create)
+static int decode_create(struct xdr_stream *xdr, struct nfs4_change_info *cinfo)
 {
 	uint32_t *p;
 	uint32_t bmlen;
@@ -1695,7 +2431,7 @@ decode_create(struct xdr_stream *xdr, st
 	status = decode_op_hdr(xdr, OP_CREATE);
 	if (status)
 		return status;
-	if ((status = decode_change_info(xdr, create->cr_cinfo)))
+	if ((status = decode_change_info(xdr, cinfo)))
 		return status;
 	READ_BUF(4);
 	READ32(bmlen);
@@ -1703,443 +2439,192 @@ decode_create(struct xdr_stream *xdr, st
 	return 0;
 }
 
-extern uint32_t nfs4_fattr_bitmap[2];
-extern uint32_t nfs4_fsstat_bitmap[2];
-extern uint32_t nfs4_pathconf_bitmap[2];
-
-static int
-decode_getattr(struct xdr_stream *xdr, struct nfs4_getattr *getattr,
-    struct nfs_server *server)
+static int decode_server_caps(struct xdr_stream *xdr, struct nfs4_server_caps_res *res)
 {
-	struct nfs_fattr *nfp = getattr->gt_attrs;
-	struct nfs_fsstat *fsstat = getattr->gt_fsstat;
-	struct nfs_pathconf *pathconf = getattr->gt_pathconf;
-	uint32_t attrlen, dummy32, bmlen,
-		 bmval0 = 0,
-		 bmval1 = 0,
-		 len = 0;
-	uint32_t *p;
-	unsigned int type;
-	int fmode = 0;
+	uint32_t *savep;
+	uint32_t attrlen, 
+		 bitmap[2] = {0};
 	int status;
+
+	if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_bitmap(xdr, bitmap)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_length(xdr, &attrlen, &savep)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_supported(xdr, bitmap, res->attr_bitmask)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_link_support(xdr, bitmap, &res->has_links)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_symlink_support(xdr, bitmap, &res->has_symlinks)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_aclsupport(xdr, bitmap, &res->acl_bitmask)) != 0)
+		goto xdr_error;
+	status = verify_attr_len(xdr, savep, attrlen);
+xdr_error:
+	if (status != 0)
+		printk(KERN_NOTICE "%s: xdr error %d!\n", __FUNCTION__, -status);
+	return status;
+}
 	
-	status = decode_op_hdr(xdr, OP_GETATTR);
-	if (status)
-		return status;
-        
-        READ_BUF(4);
-        READ32(bmlen);
-        if (bmlen > 2)
-                goto xdr_error;
+static int decode_statfs(struct xdr_stream *xdr, struct nfs_fsstat *fsstat)
+{
+	uint32_t *savep;
+	uint32_t attrlen, 
+		 bitmap[2] = {0};
+	int status;
 	
-        READ_BUF((bmlen << 2) + 4);
-        if (bmlen > 0)
-                READ32(bmval0);
-        if (bmlen > 1)
-                READ32(bmval1);
-        READ32(attrlen);
-
-	if ((bmval0 & ~getattr->gt_bmval[0]) ||
-	    (bmval1 & ~getattr->gt_bmval[1])) {
-		dprintk("read_attrs: server returned bad attributes!\n");
+	if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_bitmap(xdr, bitmap)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_length(xdr, &attrlen, &savep)) != 0)
 		goto xdr_error;
-	}
-	if (nfp) {
-		nfp->bitmap[0] = bmval0;
-		nfp->bitmap[1] = bmval1;
-	}
 
-	/*
-	 * In case the server doesn't return some attributes,
-	 * we initialize them here to some nominal values..
-	 */
-	if (nfp) {
-		nfp->valid = NFS_ATTR_FATTR | NFS_ATTR_FATTR_V3 | NFS_ATTR_FATTR_V4;
-		nfp->nlink = 1;
-		nfp->timestamp = jiffies;
-	}
-        if (bmval0 & FATTR4_WORD0_TYPE) {
-                READ_BUF(4);
-                len += 4;
-                READ32(type);
-                if (type < NF4REG || type > NF4NAMEDATTR) {
-                        dprintk("read_attrs: bad type %d\n", type);
-                        goto xdr_error;
-                }
-		nfp->type = nfs_type2fmt[type].nfs2type;
-		fmode = nfs_type2fmt[type].mode;
-                dprintk("read_attrs: type=%d\n", (uint32_t)nfp->type);
-        }
-        if (bmval0 & FATTR4_WORD0_CHANGE) {
-                READ_BUF(8);
-                len += 8;
-                READ64(nfp->change_attr);
-                dprintk("read_attrs: changeid=%Ld\n", (long long)nfp->change_attr);
-        }
-        if (bmval0 & FATTR4_WORD0_SIZE) {
-                READ_BUF(8);
-                len += 8;
-                READ64(nfp->size);
-                dprintk("read_attrs: size=%Ld\n", (long long)nfp->size);
-        }
-        if (bmval0 & FATTR4_WORD0_FSID) {
-                READ_BUF(16);
-                len += 16;
-                READ64(nfp->fsid_u.nfs4.major);
-                READ64(nfp->fsid_u.nfs4.minor);
-                dprintk("read_attrs: fsid=0x%Lx/0x%Lx\n",
-			(long long)nfp->fsid_u.nfs4.major,
-			(long long)nfp->fsid_u.nfs4.minor);
-        }
-        if (bmval0 & FATTR4_WORD0_FILEID) {
-                READ_BUF(8);
-                len += 8;
-                READ64(nfp->fileid);
-                dprintk("read_attrs: fileid=%Ld\n", (long long) nfp->fileid);
-        }
-	if (bmval0 & FATTR4_WORD0_FILES_AVAIL) {
-		READ_BUF(8);
-		len += 8;
-		READ64(fsstat->afiles);
-		dprintk("read_attrs: files_avail=0x%Lx\n", (long long) fsstat->afiles);
-	}
-        if (bmval0 & FATTR4_WORD0_FILES_FREE) {
-                READ_BUF(8);
-                len += 8;
-                READ64(fsstat->ffiles);
-                dprintk("read_attrs: files_free=0x%Lx\n", (long long) fsstat->ffiles);
-        }
-        if (bmval0 & FATTR4_WORD0_FILES_TOTAL) {
-                READ_BUF(8);
-                len += 8;
-                READ64(fsstat->tfiles);
-                dprintk("read_attrs: files_tot=0x%Lx\n", (long long) fsstat->tfiles);
-        }
-	if (bmval0 & FATTR4_WORD0_MAXLINK) {
-		READ_BUF(4);
-		len += 4;
-		READ32(pathconf->max_link);
-		dprintk("read_attrs: maxlink=%d\n", pathconf->max_link);
-	}
-        if (bmval0 & FATTR4_WORD0_MAXNAME) {
-                READ_BUF(4);
-                len += 4;
-                READ32(pathconf->max_namelen);
-                dprintk("read_attrs: maxname=%d\n", pathconf->max_namelen);
-        }
-	
-        if (bmval1 & FATTR4_WORD1_MODE) {
-                READ_BUF(4);
-                len += 4;
-                READ32(dummy32);
-		nfp->mode = (dummy32 & ~S_IFMT) | fmode;
-                dprintk("read_attrs: mode=0%o\n", nfp->mode);
-        }
-        if (bmval1 & FATTR4_WORD1_NUMLINKS) {
-                READ_BUF(4);
-                len += 4;
-                READ32(nfp->nlink);
-                dprintk("read_attrs: nlinks=0%o\n", nfp->nlink);
-        }
-        if (bmval1 & FATTR4_WORD1_OWNER) {
-                READ_BUF(4);
-		len += 4;
-		READ32(dummy32);    /* name length */
-		if (dummy32 > XDR_MAX_NETOBJ) {
-			dprintk("read_attrs: name too long!\n");
-			goto xdr_error;
-		}
-		READ_BUF(dummy32);
-		len += (XDR_QUADLEN(dummy32) << 2);
-		if ((status = nfs_map_name_to_uid(server->nfs4_state, (char *)p, dummy32,
-						&nfp->uid)) < 0) {
-			dprintk("read_attrs: name-to-uid mapping failed!\n");
-			nfp->uid = -2;
-		}
-		dprintk("read_attrs: uid=%d\n", (int)nfp->uid);
-        }
-        if (bmval1 & FATTR4_WORD1_OWNER_GROUP) {
-                READ_BUF(4);
-		len += 4;
-		READ32(dummy32);
-		if (dummy32 > XDR_MAX_NETOBJ) {
-			dprintk("read_attrs: name too long!\n");
-			goto xdr_error;
-		}
-		READ_BUF(dummy32);
-		len += (XDR_QUADLEN(dummy32) << 2);
-		if ((status = nfs_map_group_to_gid(server->nfs4_state, (char *)p, dummy32,
-						&nfp->gid)) < 0) {
-			dprintk("read_attrs: group-to-gid mapping failed!\n");
-			nfp->gid = -2;
-		}
-		dprintk("read_attrs: gid=%d\n", (int)nfp->gid);
-        }
-        if (bmval1 & FATTR4_WORD1_RAWDEV) {
-		uint32_t major, minor;
+	if ((status = decode_attr_files_avail(xdr, bitmap, &fsstat->afiles)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_files_free(xdr, bitmap, &fsstat->ffiles)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_files_total(xdr, bitmap, &fsstat->tfiles)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_space_avail(xdr, bitmap, &fsstat->abytes)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_space_free(xdr, bitmap, &fsstat->fbytes)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_space_total(xdr, bitmap, &fsstat->tbytes)) != 0)
+		goto xdr_error;
 
-		READ_BUF(8);
-		len += 8;
-		READ32(major);
-		READ32(minor);
-		nfp->rdev = MKDEV(major, minor);
-		if (MAJOR(nfp->rdev) != major || MINOR(nfp->rdev) != minor)
-			nfp->rdev = 0;
-		dprintk("read_attrs: rdev=%u:%u\n", major, minor);
-        }
-        if (bmval1 & FATTR4_WORD1_SPACE_AVAIL) {
-                READ_BUF(8);
-                len += 8;
-                READ64(fsstat->abytes);
-                dprintk("read_attrs: savail=0x%Lx\n", (long long) fsstat->abytes);
-        }
-	if (bmval1 & FATTR4_WORD1_SPACE_FREE) {
-                READ_BUF(8);
-                len += 8;
-                READ64(fsstat->fbytes);
-                dprintk("read_attrs: sfree=0x%Lx\n", (long long) fsstat->fbytes);
-        }
-        if (bmval1 & FATTR4_WORD1_SPACE_TOTAL) {
-                READ_BUF(8);
-                len += 8;
-                READ64(fsstat->tbytes);
-                dprintk("read_attrs: stotal=0x%Lx\n", (long long) fsstat->tbytes);
-        }
-        if (bmval1 & FATTR4_WORD1_SPACE_USED) {
-                READ_BUF(8);
-                len += 8;
-                READ64(nfp->du.nfs3.used);
-                dprintk("read_attrs: sused=0x%Lx\n", (long long) nfp->du.nfs3.used);
-        }
-        if (bmval1 & FATTR4_WORD1_TIME_ACCESS) {
-                READ_BUF(12);
-                len += 12;
-                READTIME(nfp->atime);
-                dprintk("read_attrs: atime=%ld\n", (long)nfp->atime.tv_sec);
-        }
-        if (bmval1 & FATTR4_WORD1_TIME_METADATA) {
-                READ_BUF(12);
-                len += 12;
-                READTIME(nfp->ctime);
-                dprintk("read_attrs: ctime=%ld\n", (long)nfp->ctime.tv_sec);
-        }
-        if (bmval1 & FATTR4_WORD1_TIME_MODIFY) {
-                READ_BUF(12);
-                len += 12;
-                READTIME(nfp->mtime);
-                dprintk("read_attrs: mtime=%ld\n", (long)nfp->mtime.tv_sec);
-        }
-        if (len != attrlen)
-                goto xdr_error;
-	
-        DECODE_TAIL;
+	status = verify_attr_len(xdr, savep, attrlen);
+xdr_error:
+	if (status != 0)
+		printk(KERN_NOTICE "%s: xdr error %d!\n", __FUNCTION__, -status);
+	return status;
 }
 
-static int
-decode_change_attr(struct xdr_stream *xdr, uint64_t *change_attr)
+static int decode_pathconf(struct xdr_stream *xdr, struct nfs_pathconf *pathconf)
 {
-	uint32_t *p;
-	uint32_t attrlen, bmlen, bmval = 0;
+	uint32_t *savep;
+	uint32_t attrlen, 
+		 bitmap[2] = {0};
 	int status;
+	
+	if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_bitmap(xdr, bitmap)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_length(xdr, &attrlen, &savep)) != 0)
+		goto xdr_error;
 
-	status = decode_op_hdr(xdr, OP_GETATTR);
-	if (status)
-		return status;
-	READ_BUF(4);
-	READ32(bmlen);
-	if (bmlen < 1)
-		return -EIO;
-	READ_BUF(bmlen << 2);
-	READ32(bmval);
-	if (bmval != FATTR4_WORD0_CHANGE) {
-		printk(KERN_NOTICE "decode_change_attr: server returned bad attribute bitmap 0x%x\n",
-			(unsigned int)bmval);
-		return -EIO;
-	}
-	READ_BUF(4);
-	READ32(attrlen);
-	READ_BUF(attrlen);
-	if (attrlen < 8) {
-		printk(KERN_NOTICE "decode_change_attr: server returned bad attribute length %u\n",
-				(unsigned int)attrlen);
-		return -EIO;
-	}
-	READ64(*change_attr);
-	return 0;
+	if ((status = decode_attr_maxlink(xdr, bitmap, &pathconf->max_link)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_maxname(xdr, bitmap, &pathconf->max_namelen)) != 0)
+		goto xdr_error;
+
+	status = verify_attr_len(xdr, savep, attrlen);
+xdr_error:
+	if (status != 0)
+		printk(KERN_NOTICE "%s: xdr error %d!\n", __FUNCTION__, -status);
+	return status;
 }
 
-static int
-decode_read_getattr(struct xdr_stream *xdr, struct nfs_fattr *fattr)
+static int decode_getfattr(struct xdr_stream *xdr, struct nfs_fattr *fattr, const struct nfs_server *server)
 {
-	uint32_t *p;
-	uint32_t attrlen, bmlen, bmval0 = 0, bmval1 = 0;
-	int status;
+	uint32_t *savep;
+	uint32_t attrlen,
+		 bitmap[2] = {0},
+		 type;
+	int status, fmode = 0;
 
-	status = decode_op_hdr(xdr, OP_GETATTR);
-	if (status)
-		return status;
-	READ_BUF(4);
-	READ32(bmlen);
-	if (bmlen < 1)
-		return -EIO;
-	READ_BUF(bmlen << 2);
-	READ32(bmval0);
-	if (bmval0 != FATTR4_WORD0_CHANGE)
-		goto out_bad_bitmap;
-	if (bmlen > 1) {
-		READ32(bmval1);
-		if (bmval1 & ~(FATTR4_WORD1_TIME_ACCESS))
-			goto out_bad_bitmap;
-	}
-	READ_BUF(4);
-	READ32(attrlen);
-	READ_BUF(attrlen);
-	if (attrlen < 16) {
-		printk(KERN_NOTICE "decode_post_write_getattr: server returned bad attribute length %u\n",
-				(unsigned int)attrlen);
-		return -EIO;
-	}
-	READ64(fattr->change_attr);
-	if (bmval1 & FATTR4_WORD1_TIME_ACCESS)
-		READTIME(fattr->atime);
-	fattr->bitmap[0] = bmval0;
-	fattr->bitmap[1] = bmval1;
-	return 0;
-out_bad_bitmap:
-	printk(KERN_NOTICE "decode_read_getattr: server returned bad attribute bitmap 0x%x/0x%x\n",
-			(unsigned int)bmval0, (unsigned int)bmval1);
-	return -EIO;
-}
+	if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_bitmap(xdr, bitmap)) != 0)
+		goto xdr_error;
 
-static int
-decode_pre_write_getattr(struct xdr_stream *xdr, struct nfs_fattr *fattr)
-{
-	return decode_change_attr(xdr, &fattr->pre_change_attr);
-}
+	fattr->bitmap[0] = bitmap[0];
+	fattr->bitmap[1] = bitmap[1];
 
-static int
-decode_post_write_getattr(struct xdr_stream *xdr, struct nfs_fattr *fattr)
-{
-	uint32_t *p;
-	uint32_t attrlen, bmlen, bmval0 = 0, bmval1 = 0;
-	int status;
+	if ((status = decode_attr_length(xdr, &attrlen, &savep)) != 0)
+		goto xdr_error;
 
-	status = decode_op_hdr(xdr, OP_GETATTR);
-	if (status)
-		return status;
-	READ_BUF(4);
-	READ32(bmlen);
-	if (bmlen < 1)
-		return -EIO;
-	READ_BUF(bmlen << 2);
-	READ32(bmval0);
-	if (bmval0 != (FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE))
-		goto out_bad_bitmap;
-	if (bmlen > 1) {
-		READ32(bmval1);
-		if (bmval1 & ~(FATTR4_WORD1_SPACE_USED |
-					FATTR4_WORD1_TIME_METADATA |
-					FATTR4_WORD1_TIME_MODIFY))
-			goto out_bad_bitmap;
+
+	if ((status = decode_attr_type(xdr, bitmap, &type)) != 0)
+		goto xdr_error;
+	fattr->type = nfs_type2fmt[type].nfs2type;
+	fmode = nfs_type2fmt[type].mode;
+
+	if ((status = decode_attr_change(xdr, bitmap, &fattr->change_attr)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_size(xdr, bitmap, &fattr->size)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_fsid(xdr, bitmap, &fattr->fsid_u.nfs4)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_fileid(xdr, bitmap, &fattr->fileid)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_mode(xdr, bitmap, &fattr->mode)) != 0)
+		goto xdr_error;
+	fattr->mode |= fmode;
+	if ((status = decode_attr_nlink(xdr, bitmap, &fattr->nlink)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_owner(xdr, bitmap, server->nfs4_state, &fattr->uid)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_group(xdr, bitmap, server->nfs4_state, &fattr->gid)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_rdev(xdr, bitmap, &fattr->rdev)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_space_used(xdr, bitmap, &fattr->du.nfs3.used)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_time_access(xdr, bitmap, &fattr->atime)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_time_metadata(xdr, bitmap, &fattr->ctime)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_time_modify(xdr, bitmap, &fattr->mtime)) != 0)
+		goto xdr_error;
+	if ((status = verify_attr_len(xdr, savep, attrlen)) == 0) {
+		fattr->valid = NFS_ATTR_FATTR | NFS_ATTR_FATTR_V3 | NFS_ATTR_FATTR_V4;
+		fattr->timestamp = jiffies;
 	}
-	READ_BUF(4);
-	READ32(attrlen);
-	READ_BUF(attrlen);
-	if (attrlen < 16) {
-		printk(KERN_NOTICE "decode_post_write_getattr: server returned bad attribute length %u\n",
-				(unsigned int)attrlen);
-		return -EIO;
-	}
-	READ64(fattr->change_attr);
-	READ64(fattr->size);
-	if (bmval1 & FATTR4_WORD1_SPACE_USED)
-		READ64(fattr->du.nfs3.used);
-	if (bmval1 & FATTR4_WORD1_TIME_METADATA)
-		READTIME(fattr->ctime);
-	if (bmval1 & FATTR4_WORD1_TIME_MODIFY)
-		READTIME(fattr->mtime);
-	fattr->bitmap[0] = bmval0;
-	fattr->bitmap[1] = bmval1;
-	return 0;
-out_bad_bitmap:
-	printk(KERN_NOTICE "decode_post_write_getattr: server returned bad attribute bitmap 0x%x/0x%x\n",
-			(unsigned int)bmval0, (unsigned int)bmval1);
-	return -EIO;
+xdr_error:
+	if (status != 0)
+		printk(KERN_NOTICE "%s: xdr error %d!\n", __FUNCTION__, -status);
+	return status;
 }
 
 
-static int
-decode_fsinfo(struct xdr_stream *xdr, struct nfs_fsinfo *fsinfo)
+static int decode_fsinfo(struct xdr_stream *xdr, struct nfs_fsinfo *fsinfo)
 {
-	uint32_t *p;
-	uint32_t len, attrlen, bmlen, bmval0 = 0, bmval1 = 0;
+	uint32_t *savep;
+	uint32_t attrlen, bitmap[2];
 	int status;
 
-	status = decode_op_hdr(xdr, OP_GETATTR);
-	if (status)
-		return status;
-	READ_BUF(4);
-	READ32(bmlen);
-	if (bmlen < 1)
-		return -EIO;
-	READ_BUF(bmlen << 2);
-	READ32(bmval0);
-	if (bmval0 & ~(FATTR4_WORD0_MAXFILESIZE|FATTR4_WORD0_MAXREAD|
-				FATTR4_WORD0_MAXWRITE|FATTR4_WORD0_LEASE_TIME))
-		goto out_bad_bitmap;
-	if (bmlen > 1) {
-		READ32(bmval1);
-		if (bmval1 != 0 || bmlen > 2)
-			goto out_bad_bitmap;
-	}
-	READ_BUF(4);
-	READ32(attrlen);
-	READ_BUF(attrlen);
+	if ((status = decode_op_hdr(xdr, OP_GETATTR)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_bitmap(xdr, bitmap)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_length(xdr, &attrlen, &savep)) != 0)
+		goto xdr_error;
+
 	fsinfo->rtmult = fsinfo->wtmult = 512;	/* ??? */
-	fsinfo->lease_time = 60;
-	len = attrlen;
 
-	if (bmval0 & FATTR4_WORD0_LEASE_TIME) {
-		len -= 4;
-		READ32(fsinfo->lease_time);
-		dprintk("read_attrs: lease_time=%d\n", fsinfo->lease_time);
-	}
-	if (bmval0 & FATTR4_WORD0_MAXFILESIZE) {
-		len -= 8;
-		READ64(fsinfo->maxfilesize);
-		dprintk("read_attrs: maxfilesize=0x%Lx\n", (long long) fsinfo->maxfilesize);
-	}
-	if (bmval0 & FATTR4_WORD0_MAXREAD) {
-		len -= 8;
-		READ64(fsinfo->rtmax);
-		fsinfo->rtpref = fsinfo->dtpref = fsinfo->rtmax;
-		dprintk("read_attrs: maxread=%d\n", fsinfo->rtmax);
-	}
-	if (bmval0 & FATTR4_WORD0_MAXWRITE) {
-		len -= 8;
-		READ64(fsinfo->wtmax);
-		fsinfo->wtpref = fsinfo->wtmax;
-		dprintk("read_attrs: maxwrite=%d\n", fsinfo->wtmax);
-	}
-	if (len != 0)
-		goto out_bad_attrlen;
-	return 0;
-out_bad_attrlen:
-	printk(KERN_NOTICE "%s: server attribute length %u does not match bitmap 0x%x/0x%x\n",
-			__FUNCTION__, (unsigned int)attrlen,
-			(unsigned int) bmval0, (unsigned int)bmval1);
-	return -EIO;
-out_bad_bitmap:
-	printk(KERN_NOTICE "%s: server returned bad attribute bitmap 0x%x/0x%x\n",
-			__FUNCTION__,
-			(unsigned int)bmval0, (unsigned int)bmval1);
-	return -EIO;
+	if ((status = decode_attr_lease_time(xdr, bitmap, &fsinfo->lease_time)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_maxfilesize(xdr, bitmap, &fsinfo->maxfilesize)) != 0)
+		goto xdr_error;
+	if ((status = decode_attr_maxread(xdr, bitmap, &fsinfo->rtmax)) != 0)
+		goto xdr_error;
+	fsinfo->rtpref = fsinfo->dtpref = fsinfo->rtmax;
+	if ((status = decode_attr_maxwrite(xdr, bitmap, &fsinfo->wtmax)) != 0)
+		goto xdr_error;
+	fsinfo->wtpref = fsinfo->wtmax;
+
+	status = verify_attr_len(xdr, savep, attrlen);
+xdr_error:
+	if (status != 0)
+		printk(KERN_NOTICE "%s: xdr error %d!\n", __FUNCTION__, -status);
+	return status;
 }
 
-static int
-decode_getfh(struct xdr_stream *xdr, struct nfs4_getfh *getfh)
+static int decode_getfh(struct xdr_stream *xdr, struct nfs_fh *fh)
 {
-	struct nfs_fh *fh = getfh->gf_fhandle;
 	uint32_t *p;
 	uint32_t len;
 	int status;
@@ -2152,7 +2637,7 @@ decode_getfh(struct xdr_stream *xdr, str
 
 	READ_BUF(4);
 	READ32(len);
-	if (len > NFS_MAXFHSIZE)
+	if (len > NFS4_FHSIZE)
 		return -EIO;
 	fh->size = len;
 	READ_BUF(len);
@@ -2160,22 +2645,20 @@ decode_getfh(struct xdr_stream *xdr, str
 	return 0;
 }
 
-static int
-decode_link(struct xdr_stream *xdr, struct nfs4_link *link)
+static int decode_link(struct xdr_stream *xdr, struct nfs4_change_info *cinfo)
 {
 	int status;
 	
 	status = decode_op_hdr(xdr, OP_LINK);
 	if (status)
 		return status;
-	return decode_change_info(xdr, link->ln_cinfo);
+	return decode_change_info(xdr, cinfo);
 }
 
 /*
  * We create the owner, so we know a proper owner.id length is 4.
  */
-static int
-decode_lock_denied (struct xdr_stream *xdr, struct nfs_lock_denied *denied)
+static int decode_lock_denied (struct xdr_stream *xdr, struct nfs_lock_denied *denied)
 {
 	uint32_t *p;
 	uint32_t namelen;
@@ -2192,8 +2675,7 @@ decode_lock_denied (struct xdr_stream *x
 	return -NFS4ERR_DENIED;
 }
 
-static int
-decode_lock(struct xdr_stream *xdr, struct nfs_lockres *res)
+static int decode_lock(struct xdr_stream *xdr, struct nfs_lockres *res)
 {
 	uint32_t *p;
 	int status;
@@ -2207,8 +2689,7 @@ decode_lock(struct xdr_stream *xdr, stru
 	return status;
 }
 
-static int
-decode_lockt(struct xdr_stream *xdr, struct nfs_lockres *res)
+static int decode_lockt(struct xdr_stream *xdr, struct nfs_lockres *res)
 {
 	int status;
 	status = decode_op_hdr(xdr, OP_LOCKT);
@@ -2217,8 +2698,7 @@ decode_lockt(struct xdr_stream *xdr, str
 	return status;
 }
 
-static int
-decode_locku(struct xdr_stream *xdr, struct nfs_lockres *res)
+static int decode_locku(struct xdr_stream *xdr, struct nfs_lockres *res)
 {
 	uint32_t *p;
 	int status;
@@ -2231,14 +2711,12 @@ decode_locku(struct xdr_stream *xdr, str
 	return status;
 }
 
-static int
-decode_lookup(struct xdr_stream *xdr)
+static int decode_lookup(struct xdr_stream *xdr)
 {
 	return decode_op_hdr(xdr, OP_LOOKUP);
 }
 
-static int
-decode_open(struct xdr_stream *xdr, struct nfs_openres *res)
+static int decode_open(struct xdr_stream *xdr, struct nfs_openres *res)
 {
         uint32_t *p;
         uint32_t bmlen, delegation_type;
@@ -2250,7 +2728,7 @@ decode_open(struct xdr_stream *xdr, stru
         READ_BUF(sizeof(res->stateid.data));
         COPYMEM(res->stateid.data, sizeof(res->stateid.data));
 
-        decode_change_info(xdr, res->cinfo);
+        decode_change_info(xdr, &res->cinfo);
 
         READ_BUF(8);
         READ32(res->rflags);
@@ -2261,14 +2739,14 @@ decode_open(struct xdr_stream *xdr, stru
         READ_BUF((bmlen << 2) + 4);
         p += bmlen;
         READ32(delegation_type);
-        if (delegation_type != NFS4_OPEN_DELEGATE_NONE)
-                goto xdr_error;
-
-        DECODE_TAIL;
+        if (delegation_type == NFS4_OPEN_DELEGATE_NONE)
+		return 0;
+xdr_error:
+	printk(KERN_NOTICE "%s: xdr error!\n", __FUNCTION__);
+	return -EIO;
 }
 
-static int
-decode_open_confirm(struct xdr_stream *xdr, struct nfs_open_confirmres *res)
+static int decode_open_confirm(struct xdr_stream *xdr, struct nfs_open_confirmres *res)
 {
         uint32_t *p;
 	int status;
@@ -2281,8 +2759,7 @@ decode_open_confirm(struct xdr_stream *x
         return 0;
 }
 
-static int
-decode_open_downgrade(struct xdr_stream *xdr, struct nfs_closeres *res)
+static int decode_open_downgrade(struct xdr_stream *xdr, struct nfs_closeres *res)
 {
 	uint32_t *p;
 	int status;
@@ -2295,22 +2772,19 @@ decode_open_downgrade(struct xdr_stream 
 	return 0;
 }
 
-static int
-decode_putfh(struct xdr_stream *xdr)
+static int decode_putfh(struct xdr_stream *xdr)
 {
 	return decode_op_hdr(xdr, OP_PUTFH);
 }
 
-static int
-decode_putrootfh(struct xdr_stream *xdr)
+static int decode_putrootfh(struct xdr_stream *xdr)
 {
 	return decode_op_hdr(xdr, OP_PUTROOTFH);
 }
 
-static int
-decode_read(struct xdr_stream *xdr, struct rpc_rqst *req, struct nfs_readres *res)
+static int decode_read(struct xdr_stream *xdr, struct rpc_rqst *req, struct nfs_readres *res)
 {
-	struct iovec *iov = req->rq_rvec;
+	struct iovec *iov = req->rq_rcv_buf.head;
 	uint32_t *p;
 	uint32_t count, eof, recvd, hdrlen;
 	int status;
@@ -2322,7 +2796,7 @@ decode_read(struct xdr_stream *xdr, stru
 	READ32(eof);
 	READ32(count);
 	hdrlen = (u8 *) p - (u8 *) iov->iov_base;
-	recvd = req->rq_received - hdrlen;
+	recvd = req->rq_rcv_buf.len - hdrlen;
 	if (count > recvd) {
 		printk(KERN_WARNING "NFS: server cheating in read reply: "
 				"count %u > recvd %u\n", count, recvd);
@@ -2335,8 +2809,7 @@ decode_read(struct xdr_stream *xdr, stru
 	return 0;
 }
 
-static int
-decode_readdir(struct xdr_stream *xdr, struct rpc_rqst *req, struct nfs4_readdir *readdir)
+static int decode_readdir(struct xdr_stream *xdr, struct rpc_rqst *req, struct nfs4_readdir_res *readdir)
 {
 	struct xdr_buf	*rcvbuf = &req->rq_rcv_buf;
 	struct page	*page = *rcvbuf->pages;
@@ -2350,17 +2823,17 @@ decode_readdir(struct xdr_stream *xdr, s
 	if (status)
 		return status;
 	READ_BUF(8);
-	COPYMEM(readdir->rd_resp_verifier.data, 8);
+	COPYMEM(readdir->verifier.data, 8);
 
 	hdrlen = (char *) p - (char *) iov->iov_base;
-	recvd = req->rq_received - hdrlen;
+	recvd = rcvbuf->len - hdrlen;
 	if (pglen > recvd)
 		pglen = recvd;
 	xdr_read_pages(xdr, pglen);
 
-	BUG_ON(pglen + readdir->rd_pgbase > PAGE_CACHE_SIZE);
+	BUG_ON(pglen + readdir->pgbase > PAGE_CACHE_SIZE);
 	kaddr = p = (uint32_t *) kmap_atomic(page, KM_USER0);
-	end = (uint32_t *) ((char *)p + pglen + readdir->rd_pgbase);
+	end = (uint32_t *) ((char *)p + pglen + readdir->pgbase);
 	entry = p;
 	for (nr = 0; *p++; nr++) {
 		if (p + 3 > end)
@@ -2420,8 +2893,7 @@ err_unmap:
 	return -errno_NFSERR_IO;
 }
 
-static int
-decode_readlink(struct xdr_stream *xdr, struct rpc_rqst *req, struct nfs4_readlink *readlink)
+static int decode_readlink(struct xdr_stream *xdr, struct rpc_rqst *req)
 {
 	struct xdr_buf *rcvbuf = &req->rq_rcv_buf;
 	struct iovec *iov = rcvbuf->head;
@@ -2462,43 +2934,34 @@ decode_readlink(struct xdr_stream *xdr, 
 	return 0;
 }
 
-static int
-decode_restorefh(struct xdr_stream *xdr)
-{
-	return decode_op_hdr(xdr, OP_RESTOREFH);
-}
-
-static int
-decode_remove(struct xdr_stream *xdr, struct nfs4_remove *remove)
+static int decode_remove(struct xdr_stream *xdr, struct nfs4_change_info *cinfo)
 {
 	int status;
 
 	status = decode_op_hdr(xdr, OP_REMOVE);
 	if (status)
 		goto out;
-	status = decode_change_info(xdr, remove->rm_cinfo);
+	status = decode_change_info(xdr, cinfo);
 out:
 	return status;
 }
 
-static int
-decode_rename(struct xdr_stream *xdr, struct nfs4_rename *rename)
+static int decode_rename(struct xdr_stream *xdr, struct nfs4_change_info *old_cinfo,
+	      struct nfs4_change_info *new_cinfo)
 {
 	int status;
 
 	status = decode_op_hdr(xdr, OP_RENAME);
 	if (status)
 		goto out;
-	if ((status = decode_change_info(xdr, rename->rn_src_cinfo)))
-		goto out;
-	if ((status = decode_change_info(xdr, rename->rn_dst_cinfo)))
+	if ((status = decode_change_info(xdr, old_cinfo)))
 		goto out;
+	status = decode_change_info(xdr, new_cinfo);
 out:
 	return status;
 }
 
-static int
-decode_renew(struct xdr_stream *xdr)
+static int decode_renew(struct xdr_stream *xdr)
 {
 	return decode_op_hdr(xdr, OP_RENEW);
 }
@@ -2509,8 +2972,7 @@ decode_savefh(struct xdr_stream *xdr)
 	return decode_op_hdr(xdr, OP_SAVEFH);
 }
 
-static int
-decode_setattr(struct xdr_stream *xdr, struct nfs_setattrres *res)
+static int decode_setattr(struct xdr_stream *xdr, struct nfs_setattrres *res)
 {
 	uint32_t *p;
 	uint32_t bmlen;
@@ -2526,8 +2988,7 @@ decode_setattr(struct xdr_stream *xdr, s
 	return 0;
 }
 
-static int
-decode_setclientid(struct xdr_stream *xdr, struct nfs4_client *clp)
+static int decode_setclientid(struct xdr_stream *xdr, struct nfs4_client *clp)
 {
 	uint32_t *p;
 	uint32_t opnum;
@@ -2558,124 +3019,38 @@ decode_setclientid(struct xdr_stream *xd
 		READ_BUF(4);
 		READ32(len);
 		READ_BUF(len);
-		return -EEXIST;
-	} else
-		return -nfs_stat_to_errno(nfserr);
-
-	return 0;
-}
-
-static int
-decode_setclientid_confirm(struct xdr_stream *xdr)
-{
-	return decode_op_hdr(xdr, OP_SETCLIENTID_CONFIRM);
-}
-
-static int
-decode_write(struct xdr_stream *xdr, struct nfs_writeres *res)
-{
-	uint32_t *p;
-	int status;
-
-	status = decode_op_hdr(xdr, OP_WRITE);
-	if (status)
-		return status;
-
-	READ_BUF(16);
-	READ32(res->count);
-	READ32(res->verf->committed);
-	COPYMEM(res->verf->verifier, 8);
-	return 0;
-}
-
-/* FIXME: this sucks */
-static int
-decode_compound(struct xdr_stream *xdr, struct nfs4_compound *cp, struct rpc_rqst *req)
-{
-	struct compound_hdr hdr;
-	struct nfs4_op *op;
-	int status;
-
-	status = decode_compound_hdr(xdr, &hdr);
-	if (status)
-		goto out;
-
-	cp->toplevel_status = hdr.status;
-
-	/*
-	 * We need this if our zero-copy I/O is going to work.  Rumor has
-	 * it that the spec will soon mandate it...
-	 */
-	if (hdr.taglen != cp->taglen)
-		dprintk("nfs4: non-conforming server returns tag length mismatch!\n");
-
-	cp->resp_nops = hdr.nops;
-	if (hdr.nops > cp->req_nops) {
-		dprintk("nfs4: resp_nops > req_nops!\n");
-		goto xdr_error;
-	}
-
-	op = &cp->ops[0];
-	for (cp->nops = 0; cp->nops < cp->resp_nops; cp->nops++, op++) {
-		switch (op->opnum) {
-		case OP_ACCESS:
-			status = decode_access(xdr, &op->u.access);
-			break;
-		case OP_CREATE:
-			status = decode_create(xdr, &op->u.create);
-			break;
-		case OP_GETATTR:
-			status = decode_getattr(xdr, &op->u.getattr, cp->server);
-			break;
-		case OP_GETFH:
-			status = decode_getfh(xdr, &op->u.getfh);
-			break;
-		case OP_LINK:
-			status = decode_link(xdr, &op->u.link);
-			break;
-		case OP_LOOKUP:
-			status = decode_lookup(xdr);
-			break;
-		case OP_PUTFH:
-			status = decode_putfh(xdr);
-			break;
-		case OP_PUTROOTFH:
-			status = decode_putrootfh(xdr);
-			break;
-		case OP_READDIR:
-			status = decode_readdir(xdr, req, &op->u.readdir);
-			break;
-		case OP_READLINK:
-			status = decode_readlink(xdr, req, &op->u.readlink);
-			break;
-		case OP_RESTOREFH:
-			status = decode_restorefh(xdr);
-			break;
-		case OP_REMOVE:
-			status = decode_remove(xdr, &op->u.remove);
-			break;
-		case OP_RENAME:
-			status = decode_rename(xdr, &op->u.rename);
-			break;
-		case OP_SAVEFH:
-			status = decode_savefh(xdr);
-			break;
-		default:
-			BUG();
-			return -EIO;
-		}
-		if (status)
-			break;
-	}
+		return -EEXIST;
+	} else
+		return -nfs_stat_to_errno(nfserr);
+
+	return 0;
+}
+
+static int decode_setclientid_confirm(struct xdr_stream *xdr)
+{
+	return decode_op_hdr(xdr, OP_SETCLIENTID_CONFIRM);
+}
+
+static int decode_write(struct xdr_stream *xdr, struct nfs_writeres *res)
+{
+	uint32_t *p;
+	int status;
+
+	status = decode_op_hdr(xdr, OP_WRITE);
+	if (status)
+		return status;
 
-	DECODE_TAIL;
+	READ_BUF(16);
+	READ32(res->count);
+	READ32(res->verf->committed);
+	COPYMEM(res->verf->verifier, 8);
+	return 0;
 }
 
 /*
  * Decode OPEN_DOWNGRADE response
  */
-static int
-nfs4_xdr_dec_open_downgrade(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_closeres *res)
+static int nfs4_xdr_dec_open_downgrade(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_closeres *res)
 {
         struct xdr_stream xdr;
         struct compound_hdr hdr;
@@ -2698,31 +3073,180 @@ out:
  */
 
 /*
- * Decode COMPOUND response
+ * Decode ACCESS response
  */
-static int
-nfs4_xdr_dec_compound(struct rpc_rqst *rqstp, uint32_t *p, struct nfs4_compound *cp)
+static int nfs4_xdr_dec_access(struct rpc_rqst *rqstp, uint32_t *p, struct nfs4_accessres *res)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr;
+	int status;
+	
+	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
+	if ((status = decode_compound_hdr(&xdr, &hdr)) != 0)
+		goto out;
+	if ((status = decode_putfh(&xdr)) == 0)
+		status = decode_access(&xdr, res);
+out:
+	return status;
+}
+
+/*
+ * Decode LOOKUP response
+ */
+static int nfs4_xdr_dec_lookup(struct rpc_rqst *rqstp, uint32_t *p, struct nfs4_lookup_res *res)
 {
 	struct xdr_stream xdr;
+	struct compound_hdr hdr;
 	int status;
 	
 	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
-	if ((status = decode_compound(&xdr, cp, rqstp)))
+	if ((status = decode_compound_hdr(&xdr, &hdr)) != 0)
+		goto out;
+	if ((status = decode_putfh(&xdr)) != 0)
 		goto out;
+	if ((status = decode_lookup(&xdr)) != 0)
+		goto out;
+	if ((status = decode_getfh(&xdr, res->fh)) != 0)
+		goto out;
+	status = decode_getfattr(&xdr, res->fattr, res->server);
+out:
+	return status;
+}
+
+/*
+ * Decode LOOKUP_ROOT response
+ */
+static int nfs4_xdr_dec_lookup_root(struct rpc_rqst *rqstp, uint32_t *p, struct nfs4_lookup_res *res)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr;
+	int status;
 	
-	status = 0;
-	if (cp->toplevel_status)
-		status = -nfs_stat_to_errno(cp->toplevel_status);
+	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
+	if ((status = decode_compound_hdr(&xdr, &hdr)) != 0)
+		goto out;
+	if ((status = decode_putrootfh(&xdr)) != 0)
+		goto out;
+	if ((status = decode_getfh(&xdr, res->fh)) == 0)
+		status = decode_getfattr(&xdr, res->fattr, res->server);
+out:
+	return status;
+}
+
+/*
+ * Decode REMOVE response
+ */
+static int nfs4_xdr_dec_remove(struct rpc_rqst *rqstp, uint32_t *p, struct nfs4_change_info *cinfo)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr;
+	int status;
+	
+	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
+	if ((status = decode_compound_hdr(&xdr, &hdr)) != 0)
+		goto out;
+	if ((status = decode_putfh(&xdr)) == 0)
+		status = decode_remove(&xdr, cinfo);
+out:
+	return status;
+}
+
+/*
+ * Decode RENAME response
+ */
+static int nfs4_xdr_dec_rename(struct rpc_rqst *rqstp, uint32_t *p, struct nfs4_rename_res *res)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr;
+	int status;
+	
+	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
+	if ((status = decode_compound_hdr(&xdr, &hdr)) != 0)
+		goto out;
+	if ((status = decode_putfh(&xdr)) != 0)
+		goto out;
+	if ((status = decode_savefh(&xdr)) != 0)
+		goto out;
+	if ((status = decode_putfh(&xdr)) != 0)
+		goto out;
+	status = decode_rename(&xdr, &res->old_cinfo, &res->new_cinfo);
+out:
+	return status;
+}
+
+/*
+ * Decode LINK response
+ */
+static int nfs4_xdr_dec_link(struct rpc_rqst *rqstp, uint32_t *p, struct nfs4_change_info *cinfo)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr;
+	int status;
+	
+	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
+	if ((status = decode_compound_hdr(&xdr, &hdr)) != 0)
+		goto out;
+	if ((status = decode_putfh(&xdr)) != 0)
+		goto out;
+	if ((status = decode_savefh(&xdr)) != 0)
+		goto out;
+	if ((status = decode_putfh(&xdr)) != 0)
+		goto out;
+	status = decode_link(&xdr, cinfo);
+out:
+	return status;
+}
+
+/*
+ * Decode CREATE response
+ */
+static int nfs4_xdr_dec_create(struct rpc_rqst *rqstp, uint32_t *p, struct nfs4_create_res *res)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr;
+	int status;
+	
+	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
+	if ((status = decode_compound_hdr(&xdr, &hdr)) != 0)
+		goto out;
+	if ((status = decode_putfh(&xdr)) != 0)
+		goto out;
+	if ((status = decode_create(&xdr,&res->dir_cinfo)) != 0)
+		goto out;
+	if ((status = decode_getfattr(&xdr, res->fattr, res->server)) != 0)
+		goto out;
+	status = decode_getfh(&xdr, res->fh);
+out:
+	return status;
+}
 
+/*
+ * Decode GETATTR response
+ */
+static int nfs4_xdr_dec_getattr(struct rpc_rqst *rqstp, uint32_t *p, struct nfs4_getattr_res *res)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr;
+	int status;
+	
+	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
+	status = decode_compound_hdr(&xdr, &hdr);
+	if (status)
+		goto out;
+	status = decode_putfh(&xdr);
+	if (status)
+		goto out;
+	status = decode_getfattr(&xdr, res->fattr, res->server);
 out:
 	return status;
+
 }
 
+
 /*
  * Decode CLOSE response
  */
-static int
-nfs4_xdr_dec_close(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_closeres *res)
+static int nfs4_xdr_dec_close(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_closeres *res)
 {
         struct xdr_stream xdr;
         struct compound_hdr hdr;
@@ -2743,14 +3267,10 @@ out:
 /*
  * Decode OPEN response
  */
-static int
-nfs4_xdr_dec_open(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_openres *res)
+static int nfs4_xdr_dec_open(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_openres *res)
 {
         struct xdr_stream xdr;
         struct compound_hdr hdr;
-	struct nfs4_getfh gfh	= {
-		.gf_fhandle = &res->fh,
-	};
         int status;
 
         xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
@@ -2760,24 +3280,13 @@ nfs4_xdr_dec_open(struct rpc_rqst *rqstp
         status = decode_putfh(&xdr);
         if (status)
                 goto out;
-        status = decode_savefh(&xdr);
-        if (status)
-                goto out;
         status = decode_open(&xdr, res);
         if (status)
                 goto out;
-        status = decode_getattr(&xdr, res->f_getattr, res->server);
-        if (status)
-                goto out;
-        status = decode_getfh(&xdr, &gfh);
-        if (status)
-                goto out;
-        status = decode_restorefh(&xdr);
-        if (status)
-                goto out;
-        status = decode_getattr(&xdr, res->d_getattr, res->server);
+	status = decode_getfattr(&xdr, res->f_attr, res->server);
         if (status)
                 goto out;
+	status = decode_getfh(&xdr, &res->fh);
 out:
         return status;
 }
@@ -2785,8 +3294,7 @@ out:
 /*
  * Decode OPEN_CONFIRM response
  */
-static int
-nfs4_xdr_dec_open_confirm(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_open_confirmres *res)
+static int nfs4_xdr_dec_open_confirm(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_open_confirmres *res)
 {
         struct xdr_stream xdr;
         struct compound_hdr hdr;
@@ -2807,8 +3315,7 @@ out:
 /*
  * Decode OPEN_RECLAIM response
  */
-static int
-nfs4_xdr_dec_open_reclaim(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_openres *res)
+static int nfs4_xdr_dec_open_reclaim(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_openres *res)
 {
         struct xdr_stream xdr;
         struct compound_hdr hdr;
@@ -2824,7 +3331,7 @@ nfs4_xdr_dec_open_reclaim(struct rpc_rqs
         status = decode_open(&xdr, res);
         if (status)
                 goto out;
-        status = decode_getattr(&xdr, res->f_getattr, res->server);
+	status = decode_getfattr(&xdr, res->f_attr, res->server);
 out:
         return status;
 }
@@ -2832,8 +3339,7 @@ out:
 /*
  * Decode SETATTR response
  */
-static int
-nfs4_xdr_dec_setattr(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_setattrres *res)
+static int nfs4_xdr_dec_setattr(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_setattrres *res)
 {
         struct xdr_stream xdr;
         struct compound_hdr hdr;
@@ -2849,7 +3355,7 @@ nfs4_xdr_dec_setattr(struct rpc_rqst *rq
         status = decode_setattr(&xdr, res);
         if (status)
                 goto out;
-        status = decode_getattr(&xdr, res->attr, res->server);
+	status = decode_getfattr(&xdr, res->fattr, res->server);
 out:
         return status;
 }
@@ -2857,8 +3363,7 @@ out:
 /*
  * Decode LOCK response
  */
-static int
-nfs4_xdr_dec_lock(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_lockres *res)
+static int nfs4_xdr_dec_lock(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_lockres *res)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr;
@@ -2879,8 +3384,7 @@ out:
 /*
  * Decode LOCKT response
  */
-static int
-nfs4_xdr_dec_lockt(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_lockres *res)
+static int nfs4_xdr_dec_lockt(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_lockres *res)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr;
@@ -2901,8 +3405,7 @@ out:
 /*
  * Decode LOCKU response
  */
-static int
-nfs4_xdr_dec_locku(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_lockres *res)
+static int nfs4_xdr_dec_locku(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_lockres *res)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr;
@@ -2921,10 +3424,9 @@ out:
 }
 
 /*
- * Decode Read response
+ * Decode READLINK response
  */
-static int
-nfs4_xdr_dec_read(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_readres *res)
+static int nfs4_xdr_dec_readlink(struct rpc_rqst *rqstp, uint32_t *p, void *res)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr;
@@ -2937,23 +3439,15 @@ nfs4_xdr_dec_read(struct rpc_rqst *rqstp
 	status = decode_putfh(&xdr);
 	if (status)
 		goto out;
-	status = decode_read(&xdr, rqstp, res);
-	if (status)
-		goto out;
-	status = decode_read_getattr(&xdr, res->fattr);
-	if (!status)
-		status = -nfs_stat_to_errno(hdr.status);
-	if (!status)
-		status = res->count;
+	status = decode_readlink(&xdr, rqstp);
 out:
 	return status;
 }
 
 /*
- * Decode WRITE response
+ * Decode READDIR response
  */
-static int
-nfs4_xdr_dec_write(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_writeres *res)
+static int nfs4_xdr_dec_readdir(struct rpc_rqst *rqstp, uint32_t *p, struct nfs4_readdir_res *res)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr;
@@ -2966,15 +3460,28 @@ nfs4_xdr_dec_write(struct rpc_rqst *rqst
 	status = decode_putfh(&xdr);
 	if (status)
 		goto out;
-	status = decode_pre_write_getattr(&xdr, res->fattr);
+	status = decode_readdir(&xdr, rqstp, res);
+out:
+	return status;
+}
+
+/*
+ * Decode Read response
+ */
+static int nfs4_xdr_dec_read(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_readres *res)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr;
+	int status;
+
+	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
+	status = decode_compound_hdr(&xdr, &hdr);
 	if (status)
 		goto out;
-	status = decode_write(&xdr, res);
+	status = decode_putfh(&xdr);
 	if (status)
 		goto out;
-	status = decode_post_write_getattr(&xdr, res->fattr);
-	if (!status)
-		status = -nfs_stat_to_errno(hdr.status);
+	status = decode_read(&xdr, rqstp, res);
 	if (!status)
 		status = res->count;
 out:
@@ -2982,10 +3489,9 @@ out:
 }
 
 /*
- * Decode COMMIT response
+ * Decode WRITE response
  */
-static int
-nfs4_xdr_dec_commit(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_writeres *res)
+static int nfs4_xdr_dec_write(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_writeres *res)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr;
@@ -2998,15 +3504,30 @@ nfs4_xdr_dec_commit(struct rpc_rqst *rqs
 	status = decode_putfh(&xdr);
 	if (status)
 		goto out;
-	status = decode_pre_write_getattr(&xdr, res->fattr);
+	status = decode_write(&xdr, res);
+	if (!status)
+		status = res->count;
+out:
+	return status;
+}
+
+/*
+ * Decode COMMIT response
+ */
+static int nfs4_xdr_dec_commit(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_writeres *res)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr;
+	int status;
+
+	xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
+	status = decode_compound_hdr(&xdr, &hdr);
 	if (status)
 		goto out;
-	status = decode_commit(&xdr, res);
+	status = decode_putfh(&xdr);
 	if (status)
 		goto out;
-	status = decode_post_write_getattr(&xdr, res->fattr);
-	if (!status)
-		status = -nfs_stat_to_errno(hdr.status);
+	status = decode_commit(&xdr, res);
 out:
 	return status;
 }
@@ -3014,8 +3535,7 @@ out:
 /*
  * FSINFO request
  */
-static int
-nfs4_xdr_dec_fsinfo(struct rpc_rqst *req, uint32_t *p, struct nfs_fsinfo *fsinfo)
+static int nfs4_xdr_dec_fsinfo(struct rpc_rqst *req, uint32_t *p, struct nfs_fsinfo *fsinfo)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr;
@@ -3033,10 +3553,64 @@ nfs4_xdr_dec_fsinfo(struct rpc_rqst *req
 }
 
 /*
+ * PATHCONF request
+ */
+static int nfs4_xdr_dec_pathconf(struct rpc_rqst *req, uint32_t *p, struct nfs_pathconf *pathconf)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr;
+	int status;
+
+	xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
+	status = decode_compound_hdr(&xdr, &hdr);
+	if (!status)
+		status = decode_putfh(&xdr);
+	if (!status)
+		status = decode_pathconf(&xdr, pathconf);
+	return status;
+}
+
+/*
+ * STATFS request
+ */
+static int nfs4_xdr_dec_statfs(struct rpc_rqst *req, uint32_t *p, struct nfs_fsstat *fsstat)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr;
+	int status;
+
+	xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
+	status = decode_compound_hdr(&xdr, &hdr);
+	if (!status)
+		status = decode_putfh(&xdr);
+	if (!status)
+		status = decode_statfs(&xdr, fsstat);
+	return status;
+}
+
+/*
+ * GETATTR_BITMAP request
+ */
+static int nfs4_xdr_dec_server_caps(struct rpc_rqst *req, uint32_t *p, struct nfs4_server_caps_res *res)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr;
+	int status;
+
+	xdr_init_decode(&xdr, &req->rq_rcv_buf, p);
+	if ((status = decode_compound_hdr(&xdr, &hdr)) != 0)
+		goto out;
+	if ((status = decode_putfh(&xdr)) != 0)
+		goto out;
+	status = decode_server_caps(&xdr, res);
+out:
+	return status;
+}
+
+/*
  * Decode RENEW response
  */
-static int
-nfs4_xdr_dec_renew(struct rpc_rqst *rqstp, uint32_t *p, void *dummy)
+static int nfs4_xdr_dec_renew(struct rpc_rqst *rqstp, uint32_t *p, void *dummy)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr;
@@ -3052,8 +3626,7 @@ nfs4_xdr_dec_renew(struct rpc_rqst *rqst
 /*
  * a SETCLIENTID request
  */
-static int
-nfs4_xdr_dec_setclientid(struct rpc_rqst *req, uint32_t *p,
+static int nfs4_xdr_dec_setclientid(struct rpc_rqst *req, uint32_t *p,
 		struct nfs4_client *clp)
 {
 	struct xdr_stream xdr;
@@ -3072,8 +3645,7 @@ nfs4_xdr_dec_setclientid(struct rpc_rqst
 /*
  * a SETCLIENTID_CONFIRM request
  */
-static int
-nfs4_xdr_dec_setclientid_confirm(struct rpc_rqst *req, uint32_t *p, struct nfs_fsinfo *fsinfo)
+static int nfs4_xdr_dec_setclientid_confirm(struct rpc_rqst *req, uint32_t *p, struct nfs_fsinfo *fsinfo)
 {
 	struct xdr_stream xdr;
 	struct compound_hdr hdr;
@@ -3092,8 +3664,7 @@ nfs4_xdr_dec_setclientid_confirm(struct 
 	return status;
 }
 
-uint32_t *
-nfs4_decode_dirent(uint32_t *p, struct nfs_entry *entry, int plus)
+uint32_t *nfs4_decode_dirent(uint32_t *p, struct nfs_entry *entry, int plus)
 {
 	uint32_t len;
 
@@ -3209,7 +3780,6 @@ nfs_stat_to_errno(int stat)
     }
 
 struct rpc_procinfo	nfs4_procedures[] = {
-  PROC(COMPOUND,	enc_compound,	dec_compound),
   PROC(READ,		enc_read,	dec_read),
   PROC(WRITE,		enc_write,	dec_write),
   PROC(COMMIT,		enc_commit,	dec_commit),
@@ -3226,6 +3796,19 @@ struct rpc_procinfo	nfs4_procedures[] = 
   PROC(LOCK,            enc_lock,       dec_lock),
   PROC(LOCKT,           enc_lockt,      dec_lockt),
   PROC(LOCKU,           enc_locku,      dec_locku),
+  PROC(ACCESS,		enc_access,	dec_access),
+  PROC(GETATTR,		enc_getattr,	dec_getattr),
+  PROC(LOOKUP,		enc_lookup,	dec_lookup),
+  PROC(LOOKUP_ROOT,	enc_lookup_root,	dec_lookup_root),
+  PROC(REMOVE,		enc_remove,	dec_remove),
+  PROC(RENAME,		enc_rename,	dec_rename),
+  PROC(LINK,		enc_link,	dec_link),
+  PROC(CREATE,		enc_create,	dec_create),
+  PROC(PATHCONF,	enc_pathconf,	dec_pathconf),
+  PROC(STATFS,		enc_statfs,	dec_statfs),
+  PROC(READLINK,	enc_readlink,	dec_readlink),
+  PROC(READDIR,		enc_readdir,	dec_readdir),
+  PROC(SERVER_CAPS,	enc_server_caps, dec_server_caps),
 };
 
 struct rpc_version		nfs_version4 = {
--- diff/fs/nfs/nfsroot.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/nfs/nfsroot.c	2004-04-21 10:45:35.758267416 +0100
@@ -66,7 +66,8 @@
  *				is NOT for the length of the hostname.
  *	Hua Qin		:	Support for mounting root file system via
  *				NFS over TCP.
- */
+ *	Fabian Frederick:	Option parser rebuilt (using parser lib)
+*/
 
 #include <linux/config.h>
 #include <linux/types.h>
@@ -85,6 +86,7 @@
 #include <linux/inet.h>
 #include <linux/root_dev.h>
 #include <net/ipconfig.h>
+#include <linux/parser.h>
 
 /* Define this to allow debugging output */
 #undef NFSROOT_DEBUG
@@ -114,98 +116,164 @@ static int mount_port __initdata = 0;		/
 
  ***************************************************************************/
 
-/*
- *  The following integer options are recognized
- */
-static struct nfs_int_opts {
-	char *name;
-	int  *val;
-} root_int_opts[] __initdata = {
-	{ "port",	&nfs_port },
-	{ "rsize",	&nfs_data.rsize },
-	{ "wsize",	&nfs_data.wsize },
-	{ "timeo",	&nfs_data.timeo },
-	{ "retrans",	&nfs_data.retrans },
-	{ "acregmin",	&nfs_data.acregmin },
-	{ "acregmax",	&nfs_data.acregmax },
-	{ "acdirmin",	&nfs_data.acdirmin },
-	{ "acdirmax",	&nfs_data.acdirmax },
-	{ NULL,		NULL }
+enum {
+	Opt_port, Opt_rsize, Opt_wsize, Opt_timeo, Opt_retrans, Opt_acregmin,
+	Opt_acregmax, Opt_acdirmin, Opt_acdirmax, Opt_soft, Opt_hard, Opt_intr,
+	Opt_nointr, Opt_posix, Opt_noposix, Opt_cto, Opt_nocto, Opt_ac, 
+	Opt_noac, Opt_lock, Opt_nolock, Opt_v2, Opt_v3, Opt_udp, Opt_tcp,
+	Opt_broken_suid, Opt_err,
 };
 
-
-/*
- *  And now the flag options
- */
-static struct nfs_bool_opts {
-	char *name;
-	int  and_mask;
-	int  or_mask;
-} root_bool_opts[] __initdata = {
-	{ "soft",	~NFS_MOUNT_SOFT,	NFS_MOUNT_SOFT },
-	{ "hard",	~NFS_MOUNT_SOFT,	0 },
-	{ "intr",	~NFS_MOUNT_INTR,	NFS_MOUNT_INTR },
-	{ "nointr",	~NFS_MOUNT_INTR,	0 },
-	{ "posix",	~NFS_MOUNT_POSIX,	NFS_MOUNT_POSIX },
-	{ "noposix",	~NFS_MOUNT_POSIX,	0 },
-	{ "cto",	~NFS_MOUNT_NOCTO,	0 },
-	{ "nocto",	~NFS_MOUNT_NOCTO,	NFS_MOUNT_NOCTO },
-	{ "ac",		~NFS_MOUNT_NOAC,	0 },
-	{ "noac",	~NFS_MOUNT_NOAC,	NFS_MOUNT_NOAC },
-	{ "lock",	~NFS_MOUNT_NONLM,	0 },
-	{ "nolock",	~NFS_MOUNT_NONLM,	NFS_MOUNT_NONLM },
-#ifdef CONFIG_NFS_V3
-	{ "v2",		~NFS_MOUNT_VER3,	0 },
-	{ "v3",		~NFS_MOUNT_VER3,	NFS_MOUNT_VER3 },
-#endif
-	{ "udp",	~NFS_MOUNT_TCP,		0 },
-	{ "tcp",	~NFS_MOUNT_TCP,		NFS_MOUNT_TCP },
-	{ "broken_suid",~NFS_MOUNT_BROKEN_SUID,	NFS_MOUNT_BROKEN_SUID },
-	{ NULL,		0,			0 }
+static match_table_t __initdata tokens = {
+	{Opt_port, "port=%u"},
+	{Opt_rsize, "rsize=%u"},
+	{Opt_wsize, "wsize=%u"},
+	{Opt_timeo, "timeo=%u"},
+	{Opt_retrans, "retrans=%u"},
+	{Opt_acregmin, "acregmin=%u"},
+	{Opt_acregmax, "acregmax=%u"},
+	{Opt_acdirmin, "acdirmin=%u"},
+	{Opt_acdirmax, "acdirmax=%u"},
+	{Opt_soft, "soft"},
+	{Opt_hard, "hard"},
+	{Opt_intr, "intr"},
+	{Opt_nointr, "nointr"},
+	{Opt_posix, "posix"},
+	{Opt_noposix, "noposix"},
+	{Opt_cto, "cto"},
+	{Opt_nocto, "nocto"},
+	{Opt_ac, "ac"},
+	{Opt_noac, "noac"},
+	{Opt_lock, "lock"},
+	{Opt_nolock, "nolock"},
+	{Opt_v2, "v2"},
+	{Opt_v3, "v3"},
+	{Opt_udp, "udp"},
+	{Opt_tcp, "tcp"},
+	{Opt_broken_suid, "broken_suid"},
+	{Opt_err, NULL}
+	
 };
 
-
 /*
  *  Parse option string.
  */
-static void __init root_nfs_parse(char *name, char *buf)
+
+static int __init root_nfs_parse(char *name, char *buf)
 {
-	char *options, *val, *cp;
 
-	if ((options = strchr(name, ','))) {
-		*options++ = 0;
-		while ((cp = strsep(&options, ",")) != NULL) {
-			if (!*cp)
-				continue;
-			if ((val = strchr(cp, '='))) {
-				struct nfs_int_opts *opts = root_int_opts;
-				*val++ = '\0';
-				while (opts->name && strcmp(opts->name, cp))
-					opts++;
-				if (opts->name)
-					*(opts->val) = (int) simple_strtoul(val, NULL, 10);
-			} else {
-				struct nfs_bool_opts *opts = root_bool_opts;
-				while (opts->name && strcmp(opts->name, cp))
-					opts++;
-				if (opts->name) {
-					nfs_data.flags &= opts->and_mask;
-					nfs_data.flags |= opts->or_mask;
-				}
-			}
+	char *p;
+	substring_t args[MAX_OPT_ARGS];
+	int option;
+
+	if (!name)
+		return 1;
+
+	if (name[0] && strcmp(name, "default")){
+		strlcpy(buf, name, NFS_MAXPATHLEN);
+		return 1;
+	}
+	while ((p = strsep (&name, ",")) != NULL) {
+		int token; 
+		if (!*p)
+			continue;
+		token = match_token(p, tokens, args);
+
+		/* %u tokens only */
+		if (match_int(&args[0], &option))
+			return 0;
+		switch (token) {
+			case Opt_port:
+				nfs_port = option;
+				break;
+			case Opt_rsize:
+				nfs_data.rsize = option;
+				break;
+			case Opt_wsize:
+				nfs_data.wsize = option;
+				break;
+			case Opt_timeo:
+				nfs_data.timeo = option;
+				break;
+			case Opt_retrans:
+				nfs_data.retrans = option;
+				break;
+			case Opt_acregmin:
+				nfs_data.acregmin = option;
+				break;
+			case Opt_acregmax:
+				nfs_data.acregmax = option;
+				break;
+			case Opt_acdirmin:
+				nfs_data.acdirmin = option;
+				break;
+			case Opt_acdirmax:
+				nfs_data.acdirmax = option;
+				break;
+			case Opt_soft:
+				nfs_data.flags |= NFS_MOUNT_SOFT;
+				break;
+			case Opt_hard:
+				nfs_data.flags &= ~NFS_MOUNT_SOFT;
+				break;
+			case Opt_intr:
+				nfs_data.flags |= NFS_MOUNT_INTR;
+				break;
+			case Opt_nointr:
+				nfs_data.flags &= ~NFS_MOUNT_INTR;
+				break;
+			case Opt_posix:
+				nfs_data.flags |= NFS_MOUNT_POSIX;
+				break;
+			case Opt_noposix:
+				nfs_data.flags &= ~NFS_MOUNT_POSIX;
+				break;
+			case Opt_cto:
+				nfs_data.flags &= ~NFS_MOUNT_NOCTO;
+				break;
+			case Opt_nocto:
+				nfs_data.flags |= NFS_MOUNT_NOCTO;
+				break;
+			case Opt_ac:
+				nfs_data.flags &= ~NFS_MOUNT_NOAC;
+				break;
+			case Opt_noac:
+				nfs_data.flags |= NFS_MOUNT_NOAC;
+				break;
+			case Opt_lock:
+				nfs_data.flags &= ~NFS_MOUNT_NONLM;
+				break;
+			case Opt_nolock:
+				nfs_data.flags |= NFS_MOUNT_NONLM;
+				break;
+			case Opt_v2:
+				nfs_data.flags &= ~NFS_MOUNT_VER3;
+				break;
+			case Opt_v3:
+				nfs_data.flags |= NFS_MOUNT_VER3;
+				break;
+			case Opt_udp:
+				nfs_data.flags &= ~NFS_MOUNT_TCP;
+				break;
+			case Opt_tcp:
+				nfs_data.flags |= NFS_MOUNT_TCP;
+				break;
+			case Opt_broken_suid:
+				nfs_data.flags |= NFS_MOUNT_BROKEN_SUID;
+				break;
+			default : 
+				return 0;
 		}
 	}
-	if (name[0] && strcmp(name, "default"))
-		strlcpy(buf, name, NFS_MAXPATHLEN);
+	return 1;
 }
 
-
 /*
  *  Prepare the NFS data structure and parse all options.
  */
 static int __init root_nfs_name(char *name)
 {
-	char buf[NFS_MAXPATHLEN];
+	static char buf[NFS_MAXPATHLEN];
 	char *cp;
 
 	/* Set some default values */
--- diff/fs/nfs/pagelist.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/nfs/pagelist.c	2004-04-21 10:45:35.758267416 +0100
@@ -32,7 +32,7 @@ static inline struct nfs_page *
 nfs_page_alloc(void)
 {
 	struct nfs_page	*p;
-	p = kmem_cache_alloc(nfs_page_cachep, SLAB_NOFS);
+	p = kmem_cache_alloc(nfs_page_cachep, SLAB_KERNEL);
 	if (p) {
 		memset(p, 0, sizeof(*p));
 		INIT_LIST_HEAD(&p->wb_list);
@@ -88,6 +88,7 @@ nfs_create_request(struct file *file, st
 	 * long write-back delay. This will be adjusted in
 	 * update_nfs_request below if the region is not locked. */
 	req->wb_page    = page;
+	atomic_set(&req->wb_complete, 0);
 	req->wb_index	= page->index;
 	page_cache_get(page);
 	req->wb_offset  = offset;
--- diff/fs/nfs/proc.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/nfs/proc.c	2004-04-21 10:45:35.759267264 +0100
@@ -559,11 +559,10 @@ nfs_read_done(struct rpc_task *task)
 }
 
 static void
-nfs_proc_read_setup(struct nfs_read_data *data, unsigned int count)
+nfs_proc_read_setup(struct nfs_read_data *data)
 {
 	struct rpc_task		*task = &data->task;
 	struct inode		*inode = data->inode;
-	struct nfs_page		*req;
 	int			flags;
 	struct rpc_message	msg = {
 		.rpc_proc	= &nfs_procedures[NFSPROC_READ],
@@ -571,27 +570,13 @@ nfs_proc_read_setup(struct nfs_read_data
 		.rpc_resp	= &data->res,
 		.rpc_cred	= data->cred,
 	};
-	
-	req = nfs_list_entry(data->pages.next);
-	data->args.fh     = NFS_FH(inode);
-	data->args.offset = req_offset(req);
-	data->args.pgbase = req->wb_pgbase;
-	data->args.pages  = data->pagevec;
-	data->args.count  = count;
-	data->res.fattr   = &data->fattr;
-	data->res.count   = count;
-	data->res.eof     = 0;
-	
+
 	/* N.B. Do we need to test? Never called for swapfile inode */
 	flags = RPC_TASK_ASYNC | (IS_SWAPFILE(inode)? NFS_RPC_SWAPFLAGS : 0);
 
 	/* Finalize the task. */
 	rpc_init_task(task, NFS_CLIENT(inode), nfs_read_done, flags);
-	task->tk_calldata = data;
-	/* Release requests */
-	task->tk_release = nfs_readdata_release;
-
-	rpc_call_setup(&data->task, &msg, 0);
+	rpc_call_setup(task, &msg, 0);
 }
 
 static void
@@ -605,11 +590,10 @@ nfs_write_done(struct rpc_task *task)
 }
 
 static void
-nfs_proc_write_setup(struct nfs_write_data *data, unsigned int count, int how)
+nfs_proc_write_setup(struct nfs_write_data *data, int how)
 {
 	struct rpc_task		*task = &data->task;
 	struct inode		*inode = data->inode;
-	struct nfs_page		*req;
 	int			flags;
 	struct rpc_message	msg = {
 		.rpc_proc	= &nfs_procedures[NFSPROC_WRITE],
@@ -619,32 +603,18 @@ nfs_proc_write_setup(struct nfs_write_da
 	};
 
 	/* Note: NFSv2 ignores @stable and always uses NFS_FILE_SYNC */
-	
-	req = nfs_list_entry(data->pages.next);
-	data->args.fh     = NFS_FH(inode);
-	data->args.offset = req_offset(req);
-	data->args.pgbase = req->wb_pgbase;
-	data->args.count  = count;
 	data->args.stable = NFS_FILE_SYNC;
-	data->args.pages  = data->pagevec;
-	data->res.fattr   = &data->fattr;
-	data->res.count   = count;
-	data->res.verf    = &data->verf;
 
 	/* Set the initial flags for the task.  */
 	flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC;
 
 	/* Finalize the task. */
 	rpc_init_task(task, NFS_CLIENT(inode), nfs_write_done, flags);
-	task->tk_calldata = data;
-	/* Release requests */
-	task->tk_release = nfs_writedata_release;
-
-	rpc_call_setup(&data->task, &msg, 0);
+	rpc_call_setup(task, &msg, 0);
 }
 
 static void
-nfs_proc_commit_setup(struct nfs_write_data *data, u64 start, u32 len, int how)
+nfs_proc_commit_setup(struct nfs_write_data *data, int how)
 {
 	BUG();
 }
--- diff/fs/nfs/read.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/nfs/read.c	2004-04-21 10:45:35.760267112 +0100
@@ -35,6 +35,8 @@
 #define NFSDBG_FACILITY		NFSDBG_PAGECACHE
 
 static int nfs_pagein_one(struct list_head *, struct inode *);
+static void nfs_readpage_result_partial(struct nfs_read_data *, int);
+static void nfs_readpage_result_full(struct nfs_read_data *, int);
 
 static kmem_cache_t *nfs_rdata_cachep;
 static mempool_t *nfs_rdata_mempool;
@@ -57,12 +59,37 @@ static __inline__ void nfs_readdata_free
 	mempool_free(p, nfs_rdata_mempool);
 }
 
-void nfs_readdata_release(struct rpc_task *task)
+static void nfs_readdata_release(struct rpc_task *task)
 {
         struct nfs_read_data   *data = (struct nfs_read_data *)task->tk_calldata;
         nfs_readdata_free(data);
 }
 
+static
+unsigned int nfs_page_length(struct inode *inode, struct page *page)
+{
+	loff_t i_size = i_size_read(inode);
+	unsigned long idx;
+
+	if (i_size <= 0)
+		return 0;
+	idx = (i_size - 1) >> PAGE_CACHE_SHIFT;
+	if (page->index > idx)
+		return 0;
+	if (page->index != idx)
+		return PAGE_CACHE_SIZE;
+	return 1 + ((i_size - 1) & (PAGE_CACHE_SIZE - 1));
+}
+
+static
+int nfs_return_empty_page(struct page *page)
+{
+	memclear_highpage_flush(page, 0, PAGE_CACHE_SIZE);
+	SetPageUptodate(page);
+	unlock_page(page);
+	return 0;
+}
+
 /*
  * Read a page synchronously.
  */
@@ -78,6 +105,7 @@ nfs_readpage_sync(struct file *file, str
 		.inode		= inode,
 		.args		= {
 			.fh		= NFS_FH(inode),
+			.lockowner	= current->files,
 			.pages		= &page,
 			.pgbase		= 0UL,
 			.count		= rsize,
@@ -146,89 +174,209 @@ nfs_readpage_async(struct file *file, st
 {
 	LIST_HEAD(one_request);
 	struct nfs_page	*new;
+	unsigned int len;
 
-	new = nfs_create_request(file, inode, page, 0, PAGE_CACHE_SIZE);
+	len = nfs_page_length(inode, page);
+	if (len == 0)
+		return nfs_return_empty_page(page);
+	new = nfs_create_request(file, inode, page, 0, len);
 	if (IS_ERR(new)) {
 		unlock_page(page);
 		return PTR_ERR(new);
 	}
+	if (len < PAGE_CACHE_SIZE)
+		memclear_highpage_flush(page, len, PAGE_CACHE_SIZE - len);
+
 	nfs_lock_request(new);
 	nfs_list_add_request(new, &one_request);
 	nfs_pagein_one(&one_request, inode);
 	return 0;
 }
 
+static void nfs_readpage_release(struct nfs_page *req)
+{
+	unlock_page(req->wb_page);
+
+	nfs_clear_request(req);
+	nfs_release_request(req);
+	nfs_unlock_request(req);
+
+	dprintk("NFS: read done (%s/%Ld %d@%Ld)\n",
+			req->wb_inode->i_sb->s_id,
+			(long long)NFS_FILEID(req->wb_inode),
+			req->wb_bytes,
+			(long long)req_offset(req));
+}
+
 /*
  * Set up the NFS read request struct
  */
-static void
-nfs_read_rpcsetup(struct list_head *head, struct nfs_read_data *data)
+static void nfs_read_rpcsetup(struct nfs_page *req, struct nfs_read_data *data,
+		unsigned int count, unsigned int offset)
 {
 	struct inode		*inode;
-	struct nfs_page		*req;
-	struct page		**pages;
-	unsigned int		count;
 
-	pages = data->pagevec;
-	count = 0;
-	while (!list_empty(head)) {
-		req = nfs_list_entry(head->next);
-		nfs_list_remove_request(req);
-		nfs_list_add_request(req, &data->pages);
-		*pages++ = req->wb_page;
-		count += req->wb_bytes;
-	}
-	req = nfs_list_entry(data->pages.next);
+	data->req	  = req;
 	data->inode	  = inode = req->wb_inode;
 	data->cred	  = req->wb_cred;
 
-	NFS_PROTO(inode)->read_setup(data, count);
+	data->args.fh     = NFS_FH(inode);
+	data->args.offset = req_offset(req) + offset;
+	data->args.pgbase = req->wb_pgbase + offset;
+	data->args.pages  = data->pagevec;
+	data->args.count  = count;
+	data->args.lockowner = req->wb_lockowner;
+	data->args.state  = req->wb_state;
+
+	data->res.fattr   = &data->fattr;
+	data->res.count   = count;
+	data->res.eof     = 0;
+
+	NFS_PROTO(inode)->read_setup(data);
+
+	data->task.tk_cookie = (unsigned long)inode;
+	data->task.tk_calldata = data;
+	/* Release requests */
+	data->task.tk_release = nfs_readdata_release;
 
-	dprintk("NFS: %4d initiated read call (req %s/%Ld, %u bytes @ offset %Lu.\n",
+	dprintk("NFS: %4d initiated read call (req %s/%Ld, %u bytes @ offset %Lu)\n",
 			data->task.tk_pid,
 			inode->i_sb->s_id,
 			(long long)NFS_FILEID(inode),
 			count,
-			(unsigned long long)req_offset(req));
+			(unsigned long long)data->args.offset);
 }
 
 static void
 nfs_async_read_error(struct list_head *head)
 {
 	struct nfs_page	*req;
-	struct page	*page;
 
 	while (!list_empty(head)) {
 		req = nfs_list_entry(head->next);
-		page = req->wb_page;
 		nfs_list_remove_request(req);
-		SetPageError(page);
-		unlock_page(page);
-		nfs_clear_request(req);
-		nfs_release_request(req);
-		nfs_unlock_request(req);
+		SetPageError(req->wb_page);
+		nfs_readpage_release(req);
 	}
 }
 
-static int
-nfs_pagein_one(struct list_head *head, struct inode *inode)
+/*
+ * Start an async read operation
+ */
+static void nfs_execute_read(struct nfs_read_data *data)
+{
+	struct rpc_clnt *clnt = NFS_CLIENT(data->inode);
+	sigset_t oldset;
+
+	rpc_clnt_sigmask(clnt, &oldset);
+	lock_kernel();
+	rpc_execute(&data->task);
+	unlock_kernel();
+	rpc_clnt_sigunmask(clnt, &oldset);
+}
+
+/*
+ * Generate multiple requests to fill a single page.
+ *
+ * We optimize to reduce the number of read operations on the wire.  If we
+ * detect that we're reading a page, or an area of a page, that is past the
+ * end of file, we do not generate NFS read operations but just clear the
+ * parts of the page that would have come back zero from the server anyway.
+ *
+ * We rely on the cached value of i_size to make this determination; another
+ * client can fill pages on the server past our cached end-of-file, but we
+ * won't see the new data until our attribute cache is updated.  This is more
+ * or less conventional NFS client behavior.
+ */
+static int nfs_pagein_multi(struct list_head *head, struct inode *inode)
+{
+	struct nfs_page *req = nfs_list_entry(head->next);
+	struct page *page = req->wb_page;
+	struct nfs_read_data *data;
+	unsigned int rsize = NFS_SERVER(inode)->rsize;
+	unsigned int nbytes, offset;
+	int requests = 0;
+	LIST_HEAD(list);
+
+	nfs_list_remove_request(req);
+
+	nbytes = req->wb_bytes;
+	for(;;) {
+		data = nfs_readdata_alloc();
+		if (!data)
+			goto out_bad;
+		list_add(&data->pages, &list);
+		requests++;
+		if (nbytes <= rsize)
+			break;
+		nbytes -= rsize;
+	}
+	atomic_set(&req->wb_complete, requests);
+
+	ClearPageError(page);
+	offset = 0;
+	nbytes = req->wb_bytes;
+	do {
+		data = list_entry(list.next, struct nfs_read_data, pages);
+		list_del_init(&data->pages);
+
+		data->pagevec[0] = page;
+		data->complete = nfs_readpage_result_partial;
+
+		if (nbytes > rsize) {
+			nfs_read_rpcsetup(req, data, rsize, offset);
+			offset += rsize;
+			nbytes -= rsize;
+		} else {
+			nfs_read_rpcsetup(req, data, nbytes, offset);
+			nbytes = 0;
+		}
+		nfs_execute_read(data);
+	} while (nbytes != 0);
+
+	return 0;
+
+out_bad:
+	while (!list_empty(&list)) {
+		data = list_entry(list.next, struct nfs_read_data, pages);
+		list_del(&data->pages);
+		nfs_readdata_free(data);
+	}
+	SetPageError(page);
+	nfs_readpage_release(req);
+	return -ENOMEM;
+}
+
+static int nfs_pagein_one(struct list_head *head, struct inode *inode)
 {
-	struct rpc_clnt		*clnt = NFS_CLIENT(inode);
+	struct nfs_page		*req;
+	struct page		**pages;
 	struct nfs_read_data	*data;
-	sigset_t		oldset;
+	unsigned int		count;
+
+	if (NFS_SERVER(inode)->rsize < PAGE_CACHE_SIZE)
+		return nfs_pagein_multi(head, inode);
 
 	data = nfs_readdata_alloc();
 	if (!data)
 		goto out_bad;
 
-	nfs_read_rpcsetup(head, data);
+	pages = data->pagevec;
+	count = 0;
+	while (!list_empty(head)) {
+		req = nfs_list_entry(head->next);
+		nfs_list_remove_request(req);
+		nfs_list_add_request(req, &data->pages);
+		ClearPageError(req->wb_page);
+		*pages++ = req->wb_page;
+		count += req->wb_bytes;
+	}
+	req = nfs_list_entry(data->pages.next);
+
+	data->complete = nfs_readpage_result_full;
+	nfs_read_rpcsetup(req, data, count, 0);
 
-	/* Start the async call */
-	rpc_clnt_sigmask(clnt, &oldset);
-	lock_kernel();
-	rpc_execute(&data->task);
-	unlock_kernel();
-	rpc_clnt_sigunmask(clnt, &oldset);
+	nfs_execute_read(data);
 	return 0;
 out_bad:
 	nfs_async_read_error(head);
@@ -258,55 +406,95 @@ nfs_pagein_list(struct list_head *head, 
 }
 
 /*
+ * Handle a read reply that fills part of a page.
+ */
+static void nfs_readpage_result_partial(struct nfs_read_data *data, int status)
+{
+	struct nfs_page *req = data->req;
+	struct page *page = req->wb_page;
+ 
+	if (status >= 0) {
+		unsigned int request = data->args.count;
+		unsigned int result = data->res.count;
+
+		if (result < request) {
+			memclear_highpage_flush(page,
+						data->args.pgbase + result,
+						request - result);
+		}
+	} else
+		SetPageError(page);
+
+	if (atomic_dec_and_test(&req->wb_complete)) {
+		if (!PageError(page))
+			SetPageUptodate(page);
+		nfs_readpage_release(req);
+	}
+}
+
+/*
  * This is the callback from RPC telling us whether a reply was
  * received or some error occurred (timeout or socket shutdown).
  */
-void
-nfs_readpage_result(struct rpc_task *task)
+static void nfs_readpage_result_full(struct nfs_read_data *data, int status)
 {
-	struct nfs_read_data *data = (struct nfs_read_data *)task->tk_calldata;
 	unsigned int count = data->res.count;
 
-	dprintk("NFS: %4d nfs_readpage_result, (status %d)\n",
-		task->tk_pid, task->tk_status);
-
-	NFS_FLAGS(data->inode) |= NFS_INO_INVALID_ATIME;
 	while (!list_empty(&data->pages)) {
 		struct nfs_page *req = nfs_list_entry(data->pages.next);
 		struct page *page = req->wb_page;
 		nfs_list_remove_request(req);
 
-		if (task->tk_status >= 0) {
+		if (status >= 0) {
 			if (count < PAGE_CACHE_SIZE) {
-				memclear_highpage_flush(page,
+				if (count < req->wb_bytes)
+					memclear_highpage_flush(page,
 							req->wb_pgbase + count,
 							req->wb_bytes - count);
-
 				count = 0;
 			} else
 				count -= PAGE_CACHE_SIZE;
 			SetPageUptodate(page);
 		} else
 			SetPageError(page);
-		unlock_page(page);
+		nfs_readpage_release(req);
+	}
+}
 
-		dprintk("NFS: read (%s/%Ld %d@%Ld)\n",
-                        req->wb_inode->i_sb->s_id,
-                        (long long)NFS_FILEID(req->wb_inode),
-                        req->wb_bytes,
-                        (long long)req_offset(req));
-		nfs_clear_request(req);
-		nfs_release_request(req);
-		nfs_unlock_request(req);
+/*
+ * This is the callback from RPC telling us whether a reply was
+ * received or some error occurred (timeout or socket shutdown).
+ */
+void nfs_readpage_result(struct rpc_task *task)
+{
+	struct nfs_read_data *data = (struct nfs_read_data *)task->tk_calldata;
+	struct nfs_readargs *argp = &data->args;
+	struct nfs_readres *resp = &data->res;
+	int status = task->tk_status;
+
+	dprintk("NFS: %4d nfs_readpage_result, (status %d)\n",
+		task->tk_pid, status);
+
+	/* Is this a short read? */
+	if (task->tk_status >= 0 && resp->count < argp->count && !resp->eof) {
+		/* Has the server at least made some progress? */
+		if (resp->count != 0) {
+			/* Yes, so retry the read at the end of the data */
+			argp->offset += resp->count;
+			argp->pgbase += resp->count;
+			argp->count -= resp->count;
+			rpc_restart_call(task);
+			return;
+		}
+		task->tk_status = -EIO;
 	}
+	NFS_FLAGS(data->inode) |= NFS_INO_INVALID_ATIME;
+	data->complete(data, status);
 }
 
 /*
  * Read a page over NFS.
- * We read the page synchronously in the following cases:
- *  -	The NFS rsize is smaller than PAGE_CACHE_SIZE. We could kludge our way
- *	around this by creating several consecutive read requests, but
- *	that's hardly worth it.
+ * We read the page synchronously in the following case:
  *  -	The error flag is set for this page. This happens only when a
  *	previous async read operation failed.
  */
@@ -329,7 +517,7 @@ nfs_readpage(struct file *file, struct p
 	if (error)
 		goto out_error;
 
-	if (!PageError(page) && NFS_SERVER(inode)->rsize >= PAGE_CACHE_SIZE) {
+	if (!IS_SYNC(inode)) {
 		error = nfs_readpage_async(file, inode, page);
 		goto out;
 	}
@@ -351,26 +539,25 @@ struct nfs_readdesc {
 };
 
 static int
-readpage_sync_filler(void *data, struct page *page)
-{
-	struct nfs_readdesc *desc = (struct nfs_readdesc *)data;
-	return nfs_readpage_sync(desc->filp, page->mapping->host, page);
-}
-
-static int
 readpage_async_filler(void *data, struct page *page)
 {
 	struct nfs_readdesc *desc = (struct nfs_readdesc *)data;
 	struct inode *inode = page->mapping->host;
 	struct nfs_page *new;
+	unsigned int len;
 
 	nfs_wb_page(inode, page);
-	new = nfs_create_request(desc->filp, inode, page, 0, PAGE_CACHE_SIZE);
+	len = nfs_page_length(inode, page);
+	if (len == 0)
+		return nfs_return_empty_page(page);
+	new = nfs_create_request(desc->filp, inode, page, 0, len);
 	if (IS_ERR(new)) {
 			SetPageError(page);
 			unlock_page(page);
 			return PTR_ERR(new);
 	}
+	if (len < PAGE_CACHE_SIZE)
+		memclear_highpage_flush(page, len, PAGE_CACHE_SIZE - len);
 	nfs_lock_request(new);
 	nfs_list_add_request(new, desc->head);
 	return 0;
@@ -385,14 +572,16 @@ nfs_readpages(struct file *filp, struct 
 		.filp		= filp,
 		.head		= &head,
 	};
-	struct nfs_server *server = NFS_SERVER(mapping->host);
-	int is_sync = server->rsize < PAGE_CACHE_SIZE;
+	struct inode *inode = mapping->host;
+	struct nfs_server *server = NFS_SERVER(inode);
 	int ret;
 
-	ret = read_cache_pages(mapping, pages,
-			       is_sync ? readpage_sync_filler :
-					 readpage_async_filler,
-			       &desc);
+	dprintk("NFS: nfs_readpages (%s/%Ld %d)\n",
+			inode->i_sb->s_id,
+			(long long)NFS_FILEID(inode),
+			nr_pages);
+
+	ret = read_cache_pages(mapping, pages, readpage_async_filler, &desc);
 	if (!list_empty(&head)) {
 		int err = nfs_pagein_list(&head, server->rpages);
 		if (!ret)
--- diff/fs/nfs/write.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/nfs/write.c	2004-04-21 10:45:35.762266808 +0100
@@ -74,11 +74,17 @@
 static struct nfs_page * nfs_update_request(struct file*, struct inode *,
 					    struct page *,
 					    unsigned int, unsigned int);
+static void nfs_writeback_done_partial(struct nfs_write_data *, int);
+static void nfs_writeback_done_full(struct nfs_write_data *, int);
+static int nfs_wait_on_write_congestion(struct address_space *, int);
+static int nfs_wait_on_requests(struct inode *, unsigned long, unsigned int);
 
 static kmem_cache_t *nfs_wdata_cachep;
 static mempool_t *nfs_wdata_mempool;
 static mempool_t *nfs_commit_mempool;
 
+static DECLARE_WAIT_QUEUE_HEAD(nfs_write_congestion);
+
 static __inline__ struct nfs_write_data *nfs_writedata_alloc(void)
 {
 	struct nfs_write_data	*p;
@@ -95,7 +101,7 @@ static __inline__ void nfs_writedata_fre
 	mempool_free(p, nfs_wdata_mempool);
 }
 
-void nfs_writedata_release(struct rpc_task *task)
+static void nfs_writedata_release(struct rpc_task *task)
 {
 	struct nfs_write_data	*wdata = (struct nfs_write_data *)task->tk_calldata;
 	nfs_writedata_free(wdata);
@@ -117,12 +123,6 @@ static __inline__ void nfs_commit_free(s
 	mempool_free(p, nfs_commit_mempool);
 }
 
-void nfs_commit_release(struct rpc_task *task)
-{
-	struct nfs_write_data	*wdata = (struct nfs_write_data *)task->tk_calldata;
-	nfs_commit_free(wdata);
-}
-
 /* Adjust the file length if we're writing beyond the end */
 static void nfs_grow_file(struct page *page, unsigned int offset, unsigned int count)
 {
@@ -173,19 +173,19 @@ static void nfs_mark_uptodate(struct pag
  * Write a page synchronously.
  * Offset is the data offset within the page.
  */
-static int
-nfs_writepage_sync(struct file *file, struct inode *inode, struct page *page,
-		   unsigned int offset, unsigned int count)
+static int nfs_writepage_sync(struct file *file, struct inode *inode,
+		struct page *page, unsigned int offset, unsigned int count,
+		int how)
 {
 	unsigned int	wsize = NFS_SERVER(inode)->wsize;
 	int		result, written = 0;
-	int		swapfile = IS_SWAPFILE(inode);
 	struct nfs_write_data	wdata = {
-		.flags		= swapfile ? NFS_RPC_SWAPFLAGS : 0,
+		.flags		= how,
 		.cred		= NULL,
 		.inode		= inode,
 		.args		= {
 			.fh		= NFS_FH(inode),
+			.lockowner	= current->files,
 			.pages		= &page,
 			.stable		= NFS_FILE_SYNC,
 			.pgbase		= offset,
@@ -204,7 +204,7 @@ nfs_writepage_sync(struct file *file, st
 
 	nfs_begin_data_update(inode);
 	do {
-		if (count < wsize && !swapfile)
+		if (count < wsize)
 			wdata.args.count = count;
 		wdata.args.offset = page_offset(page) + wdata.args.pgbase;
 
@@ -233,7 +233,7 @@ nfs_writepage_sync(struct file *file, st
 		ClearPageError(page);
 
 io_error:
-	nfs_end_data_update(inode);
+	nfs_end_data_update_defer(inode);
 	if (wdata.cred)
 		put_rpccred(wdata.cred);
 
@@ -259,17 +259,26 @@ static int nfs_writepage_async(struct fi
 	return status;
 }
 
+static int wb_priority(struct writeback_control *wbc)
+{
+	if (wbc->for_reclaim)
+		return FLUSH_HIGHPRI;
+	if (wbc->for_kupdate)
+		return FLUSH_LOWPRI;
+	return 0;
+}
+
 /*
  * Write an mmapped page to the server.
  */
-int
-nfs_writepage(struct page *page, struct writeback_control *wbc)
+int nfs_writepage(struct page *page, struct writeback_control *wbc)
 {
 	struct inode *inode = page->mapping->host;
 	unsigned long end_index;
 	unsigned offset = PAGE_CACHE_SIZE;
 	loff_t i_size = i_size_read(inode);
 	int inode_referenced = 0;
+	int priority = wb_priority(wbc);
 	int err;
 
 	/*
@@ -285,7 +294,7 @@ nfs_writepage(struct page *page, struct 
 	end_index = i_size >> PAGE_CACHE_SHIFT;
 
 	/* Ensure we've flushed out any previous writes */
-	nfs_wb_page(inode,page);
+	nfs_wb_page_priority(inode, page, priority);
 
 	/* easy case */
 	if (page->index < end_index)
@@ -299,44 +308,60 @@ nfs_writepage(struct page *page, struct 
 		goto out;
 do_it:
 	lock_kernel();
-	if (NFS_SERVER(inode)->wsize >= PAGE_CACHE_SIZE && !IS_SYNC(inode) &&
-			inode_referenced) {
+	if (!IS_SYNC(inode) && inode_referenced) {
 		err = nfs_writepage_async(NULL, inode, page, 0, offset);
-		if (err >= 0)
+		if (err >= 0) {
 			err = 0;
+			if (wbc->for_reclaim)
+				err = WRITEPAGE_ACTIVATE;
+		}
 	} else {
-		err = nfs_writepage_sync(NULL, inode, page, 0, offset); 
+		err = nfs_writepage_sync(NULL, inode, page, 0, offset, priority); 
 		if (err == offset)
 			err = 0;
 	}
 	unlock_kernel();
 out:
-	unlock_page(page);
+	if (err != WRITEPAGE_ACTIVATE)
+		unlock_page(page);
 	if (inode_referenced)
 		iput(inode);
 	return err; 
 }
 
-int
-nfs_writepages(struct address_space *mapping, struct writeback_control *wbc)
+/*
+ * Note: causes nfs_update_request() to block on the assumption
+ * 	 that the writeback is generated due to memory pressure.
+ */
+int nfs_writepages(struct address_space *mapping, struct writeback_control *wbc)
 {
+	struct backing_dev_info *bdi = mapping->backing_dev_info;
 	struct inode *inode = mapping->host;
-	int is_sync = !wbc->nonblocking;
 	int err;
 
 	err = generic_writepages(mapping, wbc);
 	if (err)
-		goto out;
-	err = nfs_flush_inode(inode, 0, 0, 0);
+		return err;
+	while (test_and_set_bit(BDI_write_congested, &bdi->state) != 0) {
+		if (wbc->nonblocking)
+			return 0;
+		nfs_wait_on_write_congestion(mapping, 0);
+	}
+	err = nfs_flush_inode(inode, 0, 0, wb_priority(wbc));
 	if (err < 0)
 		goto out;
-	if (wbc->sync_mode == WB_SYNC_HOLD)
-		goto out;
-	if (is_sync && wbc->sync_mode == WB_SYNC_ALL) {
-		err = nfs_wb_all(inode);
-	} else
-		nfs_commit_inode(inode, 0, 0, 0);
+	wbc->nr_to_write -= err;
+	if (!wbc->nonblocking && wbc->sync_mode == WB_SYNC_ALL) {
+		err = nfs_wait_on_requests(inode, 0, 0);
+		if (err < 0)
+			goto out;
+	}
+	err = nfs_commit_inode(inode, 0, 0, wb_priority(wbc));
+	if (err > 0)
+		wbc->nr_to_write -= err;
 out:
+	clear_bit(BDI_write_congested, &bdi->state);
+	wake_up_all(&nfs_write_congestion);
 	return err;
 }
 
@@ -365,7 +390,7 @@ nfs_inode_add_request(struct inode *inod
 /*
  * Insert a write request into an inode
  */
-static inline void
+static void
 nfs_inode_remove_request(struct nfs_page *req)
 {
 	struct nfs_inode *nfsi;
@@ -379,7 +404,7 @@ nfs_inode_remove_request(struct nfs_page
 	nfsi->npages--;
 	if (!nfsi->npages) {
 		spin_unlock(&nfs_wreq_lock);
-		nfs_end_data_update(inode);
+		nfs_end_data_update_defer(inode);
 		iput(inode);
 	} else
 		spin_unlock(&nfs_wreq_lock);
@@ -416,7 +441,7 @@ nfs_find_request(struct inode *inode, un
 /*
  * Add a request to the inode's dirty list.
  */
-static inline void
+static void
 nfs_mark_request_dirty(struct nfs_page *req)
 {
 	struct inode *inode = req->wb_inode;
@@ -444,7 +469,7 @@ nfs_dirty_request(struct nfs_page *req)
 /*
  * Add a request to the inode's commit list.
  */
-static inline void
+static void
 nfs_mark_request_commit(struct nfs_page *req)
 {
 	struct inode *inode = req->wb_inode;
@@ -548,6 +573,38 @@ nfs_scan_commit(struct inode *inode, str
 }
 #endif
 
+static int nfs_wait_on_write_congestion(struct address_space *mapping, int intr)
+{
+	struct backing_dev_info *bdi = mapping->backing_dev_info;
+	DEFINE_WAIT(wait);
+	int ret = 0;
+
+	might_sleep();
+
+	if (!bdi_write_congested(bdi))
+		return 0;
+	if (intr) {
+		struct rpc_clnt *clnt = NFS_CLIENT(mapping->host);
+		sigset_t oldset;
+
+		rpc_clnt_sigmask(clnt, &oldset);
+		prepare_to_wait(&nfs_write_congestion, &wait, TASK_INTERRUPTIBLE);
+		if (bdi_write_congested(bdi)) {
+			if (signalled())
+				ret = -ERESTARTSYS;
+			else
+				schedule();
+		}
+		rpc_clnt_sigunmask(clnt, &oldset);
+	} else {
+		prepare_to_wait(&nfs_write_congestion, &wait, TASK_UNINTERRUPTIBLE);
+		if (bdi_write_congested(bdi))
+			schedule();
+	}
+	finish_wait(&nfs_write_congestion, &wait);
+	return ret;
+}
+
 
 /*
  * Try to update any existing write request, or create one if there is none.
@@ -560,11 +617,14 @@ static struct nfs_page *
 nfs_update_request(struct file* file, struct inode *inode, struct page *page,
 		   unsigned int offset, unsigned int bytes)
 {
+	struct nfs_server *server = NFS_SERVER(inode);
 	struct nfs_page		*req, *new = NULL;
 	unsigned long		rqend, end;
 
 	end = offset + bytes;
 
+	if (nfs_wait_on_write_congestion(page->mapping, server->flags & NFS_MOUNT_INTR))
+		return ERR_PTR(-ERESTARTSYS);
 	for (;;) {
 		/* Loop over all inode entries and see if we find
 		 * A request for the page we wish to update
@@ -668,8 +728,8 @@ nfs_flush_incompatible(struct file *file
  * XXX: Keep an eye on generic_file_read to make sure it doesn't do bad
  * things with a page scheduled for an RPC call (e.g. invalidate it).
  */
-int
-nfs_updatepage(struct file *file, struct page *page, unsigned int offset, unsigned int count)
+int nfs_updatepage(struct file *file, struct page *page,
+		unsigned int offset, unsigned int count)
 {
 	struct dentry	*dentry = file->f_dentry;
 	struct inode	*inode = page->mapping->host;
@@ -680,12 +740,8 @@ nfs_updatepage(struct file *file, struct
 		dentry->d_parent->d_name.name, dentry->d_name.name,
 		count, (long long)(page_offset(page) +offset));
 
-	/*
-	 * If wsize is smaller than page size, update and write
-	 * page synchronously.
-	 */
-	if (NFS_SERVER(inode)->wsize < PAGE_CACHE_SIZE || IS_SYNC(inode)) {
-		status = nfs_writepage_sync(file, inode, page, offset, count);
+	if (IS_SYNC(inode)) {
+		status = nfs_writepage_sync(file, inode, page, offset, count, 0);
 		if (status > 0) {
 			if (offset == 0 && status == PAGE_CACHE_SIZE)
 				SetPageUptodate(page);
@@ -747,43 +803,162 @@ done:
 	return status;
 }
 
+static void nfs_writepage_release(struct nfs_page *req)
+{
+	end_page_writeback(req->wb_page);
+
+#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
+	if (!PageError(req->wb_page)) {
+		if (NFS_NEED_RESCHED(req)) {
+			nfs_mark_request_dirty(req);
+			goto out;
+		} else if (NFS_NEED_COMMIT(req)) {
+			nfs_mark_request_commit(req);
+			goto out;
+		}
+	}
+	nfs_inode_remove_request(req);
+
+out:
+	nfs_clear_commit(req);
+	nfs_clear_reschedule(req);
+#else
+	nfs_inode_remove_request(req);
+#endif
+	nfs_unlock_request(req);
+}
+
+static inline int flush_task_priority(int how)
+{
+	switch (how & (FLUSH_HIGHPRI|FLUSH_LOWPRI)) {
+		case FLUSH_HIGHPRI:
+			return RPC_PRIORITY_HIGH;
+		case FLUSH_LOWPRI:
+			return RPC_PRIORITY_LOW;
+	}
+	return RPC_PRIORITY_NORMAL;
+}
+
 /*
  * Set up the argument/result storage required for the RPC call.
  */
-static void
-nfs_write_rpcsetup(struct list_head *head, struct nfs_write_data *data, int how)
+static void nfs_write_rpcsetup(struct nfs_page *req,
+		struct nfs_write_data *data,
+		unsigned int count, unsigned int offset,
+		int how)
 {
 	struct rpc_task		*task = &data->task;
 	struct inode		*inode;
-	struct nfs_page		*req;
-	struct page		**pages;
-	unsigned int		count;
 
 	/* Set up the RPC argument and reply structs
 	 * NB: take care not to mess about with data->commit et al. */
 
-	pages = data->pagevec;
-	count = 0;
-	while (!list_empty(head)) {
-		req = nfs_list_entry(head->next);
-		nfs_list_remove_request(req);
-		nfs_list_add_request(req, &data->pages);
-		SetPageWriteback(req->wb_page);
-		*pages++ = req->wb_page;
-		count += req->wb_bytes;
-	}
-	req = nfs_list_entry(data->pages.next);
+	data->req = req;
 	data->inode = inode = req->wb_inode;
 	data->cred = req->wb_cred;
 
-	NFS_PROTO(inode)->write_setup(data, count, how);
+	data->args.fh     = NFS_FH(inode);
+	data->args.offset = req_offset(req) + offset;
+	data->args.pgbase = req->wb_pgbase + offset;
+	data->args.pages  = data->pagevec;
+	data->args.count  = count;
+	data->args.lockowner = req->wb_lockowner;
+	data->args.state  = req->wb_state;
+
+	data->res.fattr   = &data->fattr;
+	data->res.count   = count;
+	data->res.verf    = &data->verf;
+
+	NFS_PROTO(inode)->write_setup(data, how);
+
+	data->task.tk_priority = flush_task_priority(how);
+	data->task.tk_cookie = (unsigned long)inode;
+	data->task.tk_calldata = data;
+	/* Release requests */
+	data->task.tk_release = nfs_writedata_release;
 
 	dprintk("NFS: %4d initiated write call (req %s/%Ld, %u bytes @ offset %Lu)\n",
 		task->tk_pid,
 		inode->i_sb->s_id,
 		(long long)NFS_FILEID(inode),
 		count,
-		(unsigned long long)req_offset(req));
+		(unsigned long long)data->args.offset);
+}
+
+static void nfs_execute_write(struct nfs_write_data *data)
+{
+	struct rpc_clnt *clnt = NFS_CLIENT(data->inode);
+	sigset_t oldset;
+
+	rpc_clnt_sigmask(clnt, &oldset);
+	lock_kernel();
+	rpc_execute(&data->task);
+	unlock_kernel();
+	rpc_clnt_sigunmask(clnt, &oldset);
+}
+
+/*
+ * Generate multiple small requests to write out a single
+ * contiguous dirty area on one page.
+ */
+static int nfs_flush_multi(struct list_head *head, struct inode *inode, int how)
+{
+	struct nfs_page *req = nfs_list_entry(head->next);
+	struct page *page = req->wb_page;
+	struct nfs_write_data *data;
+	unsigned int wsize = NFS_SERVER(inode)->wsize;
+	unsigned int nbytes, offset;
+	int requests = 0;
+	LIST_HEAD(list);
+
+	nfs_list_remove_request(req);
+
+	nbytes = req->wb_bytes;
+	for (;;) {
+		data = nfs_writedata_alloc();
+		if (!data)
+			goto out_bad;
+		list_add(&data->pages, &list);
+		requests++;
+		if (nbytes <= wsize)
+			break;
+		nbytes -= wsize;
+	}
+	atomic_set(&req->wb_complete, requests);
+
+	ClearPageError(page);
+	SetPageWriteback(page);
+	offset = 0;
+	nbytes = req->wb_bytes;
+	do {
+		data = list_entry(list.next, struct nfs_write_data, pages);
+		list_del_init(&data->pages);
+
+		data->pagevec[0] = page;
+		data->complete = nfs_writeback_done_partial;
+
+		if (nbytes > wsize) {
+			nfs_write_rpcsetup(req, data, wsize, offset, how);
+			offset += wsize;
+			nbytes -= wsize;
+		} else {
+			nfs_write_rpcsetup(req, data, nbytes, offset, how);
+			nbytes = 0;
+		}
+		nfs_execute_write(data);
+	} while (nbytes != 0);
+
+	return 0;
+
+out_bad:
+	while (!list_empty(&list)) {
+		data = list_entry(list.next, struct nfs_write_data, pages);
+		list_del(&data->pages);
+		nfs_writedata_free(data);
+	}
+	nfs_mark_request_dirty(req);
+	nfs_unlock_request(req);
+	return -ENOMEM;
 }
 
 /*
@@ -794,25 +969,38 @@ nfs_write_rpcsetup(struct list_head *hea
  * This is the case if nfs_updatepage detects a conflicting request
  * that has been written but not committed.
  */
-static int
-nfs_flush_one(struct list_head *head, struct inode *inode, int how)
+static int nfs_flush_one(struct list_head *head, struct inode *inode, int how)
 {
-	struct rpc_clnt 	*clnt = NFS_CLIENT(inode);
+	struct nfs_page		*req;
+	struct page		**pages;
 	struct nfs_write_data	*data;
-	sigset_t		oldset;
+	unsigned int		count;
+
+	if (NFS_SERVER(inode)->wsize < PAGE_CACHE_SIZE)
+		return nfs_flush_multi(head, inode, how);
 
 	data = nfs_writedata_alloc();
 	if (!data)
 		goto out_bad;
 
+	pages = data->pagevec;
+	count = 0;
+	while (!list_empty(head)) {
+		req = nfs_list_entry(head->next);
+		nfs_list_remove_request(req);
+		nfs_list_add_request(req, &data->pages);
+		ClearPageError(req->wb_page);
+		SetPageWriteback(req->wb_page);
+		*pages++ = req->wb_page;
+		count += req->wb_bytes;
+	}
+	req = nfs_list_entry(data->pages.next);
+
+	data->complete = nfs_writeback_done_full;
 	/* Set up the argument struct */
-	nfs_write_rpcsetup(head, data, how);
+	nfs_write_rpcsetup(req, data, count, 0, how);
 
-	rpc_clnt_sigmask(clnt, &oldset);
-	lock_kernel();
-	rpc_execute(&data->task);
-	unlock_kernel();
-	rpc_clnt_sigunmask(clnt, &oldset);
+	nfs_execute_write(data);
 	return 0;
  out_bad:
 	while (!list_empty(head)) {
@@ -851,59 +1039,59 @@ nfs_flush_list(struct list_head *head, i
 	return error;
 }
 
-
 /*
- * This function is called when the WRITE call is complete.
+ * Handle a write reply that flushed part of a page.
  */
-void
-nfs_writeback_done(struct rpc_task *task)
+static void nfs_writeback_done_partial(struct nfs_write_data *data, int status)
 {
-	struct nfs_write_data	*data = (struct nfs_write_data *) task->tk_calldata;
-	struct nfs_writeargs	*argp = &data->args;
-	struct nfs_writeres	*resp = &data->res;
-	struct nfs_page		*req;
-	struct page		*page;
+	struct nfs_page		*req = data->req;
+	struct page		*page = req->wb_page;
 
-	dprintk("NFS: %4d nfs_writeback_done (status %d)\n",
-		task->tk_pid, task->tk_status);
+	dprintk("NFS: write (%s/%Ld %d@%Ld)",
+		req->wb_inode->i_sb->s_id,
+		(long long)NFS_FILEID(req->wb_inode),
+		req->wb_bytes,
+		(long long)req_offset(req));
 
-	/* We can't handle that yet but we check for it nevertheless */
-	if (resp->count < argp->count && task->tk_status >= 0) {
-		static unsigned long    complain;
-		if (time_before(complain, jiffies)) {
-			printk(KERN_WARNING
-			       "NFS: Server wrote less than requested.\n");
-			complain = jiffies + 300 * HZ;
-		}
-		/* Can't do anything about it right now except throw
-		 * an error. */
-		task->tk_status = -EIO;
-	}
+	if (status < 0) {
+		ClearPageUptodate(page);
+		SetPageError(page);
+		if (req->wb_file)
+			req->wb_file->f_error = status;
+		dprintk(", error = %d\n", status);
+	} else {
 #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
-	if (data->verf.committed < argp->stable && task->tk_status >= 0) {
-		/* We tried a write call, but the server did not
-		 * commit data to stable storage even though we
-		 * requested it.
-		 * Note: There is a known bug in Tru64 < 5.0 in which
-		 *	 the server reports NFS_DATA_SYNC, but performs
-		 *	 NFS_FILE_SYNC. We therefore implement this checking
-		 *	 as a dprintk() in order to avoid filling syslog.
-		 */
-		static unsigned long    complain;
-
-		if (time_before(complain, jiffies)) {
-			dprintk("NFS: faulty NFS server %s:"
-				" (committed = %d) != (stable = %d)\n",
-				NFS_SERVER(data->inode)->hostname,
-				data->verf.committed, argp->stable);
-			complain = jiffies + 300 * HZ;
-		}
-	}
+		if (data->verf.committed < NFS_FILE_SYNC) {
+			if (!NFS_NEED_COMMIT(req)) {
+				nfs_defer_commit(req);
+				memcpy(&req->wb_verf, &data->verf, sizeof(req->wb_verf));
+				dprintk(" defer commit\n");
+			} else if (memcmp(&req->wb_verf, &data->verf, sizeof(req->wb_verf))) {
+				nfs_defer_reschedule(req);
+				dprintk(" server reboot detected\n");
+			}
+		} else
 #endif
+			dprintk(" OK\n");
+	}
 
-	/*
-	 * Process the nfs_page list
-	 */
+	if (atomic_dec_and_test(&req->wb_complete))
+		nfs_writepage_release(req);
+}
+
+/*
+ * Handle a write reply that flushes a whole page.
+ *
+ * FIXME: There is an inherent race with invalidate_inode_pages and
+ *	  writebacks since the page->count is kept > 1 for as long
+ *	  as the page has a write request pending.
+ */
+static void nfs_writeback_done_full(struct nfs_write_data *data, int status)
+{
+	struct nfs_page		*req;
+	struct page		*page;
+
+	/* Update attributes as result of writeback. */
 	while (!list_empty(&data->pages)) {
 		req = nfs_list_entry(data->pages.next);
 		nfs_list_remove_request(req);
@@ -915,20 +1103,20 @@ nfs_writeback_done(struct rpc_task *task
 			req->wb_bytes,
 			(long long)req_offset(req));
 
-		if (task->tk_status < 0) {
+		if (status < 0) {
 			ClearPageUptodate(page);
 			SetPageError(page);
 			if (req->wb_file)
-				req->wb_file->f_error = task->tk_status;
+				req->wb_file->f_error = status;
 			end_page_writeback(page);
 			nfs_inode_remove_request(req);
-			dprintk(", error = %d\n", task->tk_status);
+			dprintk(", error = %d\n", status);
 			goto next;
 		}
 		end_page_writeback(page);
 
 #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
-		if (argp->stable != NFS_UNSTABLE || data->verf.committed == NFS_FILE_SYNC) {
+		if (data->args.stable != NFS_UNSTABLE || data->verf.committed == NFS_FILE_SYNC) {
 			nfs_inode_remove_request(req);
 			dprintk(" OK\n");
 			goto next;
@@ -944,13 +1132,88 @@ nfs_writeback_done(struct rpc_task *task
 	}
 }
 
+/*
+ * This function is called when the WRITE call is complete.
+ */
+void nfs_writeback_done(struct rpc_task *task)
+{
+	struct nfs_write_data	*data = (struct nfs_write_data *) task->tk_calldata;
+	struct nfs_writeargs	*argp = &data->args;
+	struct nfs_writeres	*resp = &data->res;
+
+	dprintk("NFS: %4d nfs_writeback_done (status %d)\n",
+		task->tk_pid, task->tk_status);
 
 #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
+	if (resp->verf->committed < argp->stable && task->tk_status >= 0) {
+		/* We tried a write call, but the server did not
+		 * commit data to stable storage even though we
+		 * requested it.
+		 * Note: There is a known bug in Tru64 < 5.0 in which
+		 *	 the server reports NFS_DATA_SYNC, but performs
+		 *	 NFS_FILE_SYNC. We therefore implement this checking
+		 *	 as a dprintk() in order to avoid filling syslog.
+		 */
+		static unsigned long    complain;
+
+		if (time_before(complain, jiffies)) {
+			dprintk("NFS: faulty NFS server %s:"
+				" (committed = %d) != (stable = %d)\n",
+				NFS_SERVER(data->inode)->hostname,
+				resp->verf->committed, argp->stable);
+			complain = jiffies + 300 * HZ;
+		}
+	}
+#endif
+	/* Is this a short write? */
+	if (task->tk_status >= 0 && resp->count < argp->count) {
+		static unsigned long    complain;
+
+		/* Has the server at least made some progress? */
+		if (resp->count != 0) {
+			/* Was this an NFSv2 write or an NFSv3 stable write? */
+			if (resp->verf->committed != NFS_UNSTABLE) {
+				/* Resend from where the server left off */
+				argp->offset += resp->count;
+				argp->pgbase += resp->count;
+				argp->count -= resp->count;
+			} else {
+				/* Resend as a stable write in order to avoid
+				 * headaches in the case of a server crash.
+				 */
+				argp->stable = NFS_FILE_SYNC;
+			}
+			rpc_restart_call(task);
+			return;
+		}
+		if (time_before(complain, jiffies)) {
+			printk(KERN_WARNING
+			       "NFS: Server wrote less than requested.\n");
+			complain = jiffies + 300 * HZ;
+		}
+		/* Can't do anything about it except throw an error. */
+		task->tk_status = -EIO;
+	}
+
+	/*
+	 * Process the nfs_page list
+	 */
+	data->complete(data, task->tk_status);
+}
+
+
+#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
+static void nfs_commit_release(struct rpc_task *task)
+{
+	struct nfs_write_data	*wdata = (struct nfs_write_data *)task->tk_calldata;
+	nfs_commit_free(wdata);
+}
+
 /*
  * Set up the argument/result storage required for the RPC call.
  */
-static void
-nfs_commit_rpcsetup(struct list_head *head, struct nfs_write_data *data, int how)
+static void nfs_commit_rpcsetup(struct list_head *head,
+		struct nfs_write_data *data, int how)
 {
 	struct rpc_task		*task = &data->task;
 	struct nfs_page		*first, *last;
@@ -979,7 +1242,20 @@ nfs_commit_rpcsetup(struct list_head *he
 	data->inode	  = inode;
 	data->cred	  = first->wb_cred;
 
-	NFS_PROTO(inode)->commit_setup(data, start, len, how);
+	data->args.fh     = NFS_FH(data->inode);
+	data->args.offset = start;
+	data->args.count  = len;
+	data->res.count   = len;
+	data->res.fattr   = &data->fattr;
+	data->res.verf    = &data->verf;
+	
+	NFS_PROTO(inode)->commit_setup(data, how);
+
+	data->task.tk_priority = flush_task_priority(how);
+	data->task.tk_cookie = (unsigned long)inode;
+	data->task.tk_calldata = data;
+	/* Release requests */
+	data->task.tk_release = nfs_commit_release;
 	
 	dprintk("NFS: %4d initiated commit call\n", task->tk_pid);
 }
@@ -990,10 +1266,8 @@ nfs_commit_rpcsetup(struct list_head *he
 int
 nfs_commit_list(struct list_head *head, int how)
 {
-	struct rpc_clnt		*clnt;
 	struct nfs_write_data	*data;
 	struct nfs_page         *req;
-	sigset_t		oldset;
 
 	data = nfs_commit_alloc();
 
@@ -1002,13 +1276,8 @@ nfs_commit_list(struct list_head *head, 
 
 	/* Set up the argument struct */
 	nfs_commit_rpcsetup(head, data, how);
-	clnt = NFS_CLIENT(data->inode);
 
-	rpc_clnt_sigmask(clnt, &oldset);
-	lock_kernel();
-	rpc_execute(&data->task);
-	unlock_kernel();
-	rpc_clnt_sigunmask(clnt, &oldset);
+	nfs_execute_write(data);
 	return 0;
  out_bad:
 	while (!list_empty(head)) {
--- diff/fs/nfsd/nfs4proc.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/nfsd/nfs4proc.c	2004-04-21 10:45:35.763266656 +0100
@@ -66,10 +66,31 @@ fh_dup2(struct svc_fh *dst, struct svc_f
 }
 
 static int
+do_open_permission(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open *open)
+{
+	int accmode, status;
+
+	if (open->op_truncate &&
+		!(open->op_share_access & NFS4_SHARE_ACCESS_WRITE))
+		return nfserr_inval;
+
+	accmode = MAY_NOP;
+	if (open->op_share_access & NFS4_SHARE_ACCESS_READ)
+		accmode = MAY_READ;
+	if (open->op_share_deny & NFS4_SHARE_ACCESS_WRITE)
+		accmode |= (MAY_WRITE | MAY_TRUNC);
+	accmode |= MAY_OWNER_OVERRIDE;
+
+	status = fh_verify(rqstp, current_fh, S_IFREG, accmode);
+
+	return status;
+}
+
+static int
 do_open_lookup(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open *open)
 {
 	struct svc_fh resfh;
-	int accmode, status;
+	int status;
 
 	fh_init(&resfh, NFS4_FHSIZE);
 	open->op_truncate = 0;
@@ -92,6 +113,8 @@ do_open_lookup(struct svc_rqst *rqstp, s
 
 	if (!status) {
 		set_change_info(&open->op_cinfo, current_fh);
+
+		/* set reply cache */
 		fh_dup2(current_fh, &resfh);
 		/* XXXJBF: keep a saved svc_fh struct instead?? */
 		open->op_stateowner->so_replay.rp_openfh_len =
@@ -100,30 +123,66 @@ do_open_lookup(struct svc_rqst *rqstp, s
 				&resfh.fh_handle.fh_base,
 				resfh.fh_handle.fh_size);
 
-		accmode = MAY_NOP;
-		if (open->op_share_access & NFS4_SHARE_ACCESS_READ)
-			accmode = MAY_READ;
-		if (open->op_share_deny & NFS4_SHARE_ACCESS_WRITE)
-			accmode |= (MAY_WRITE | MAY_TRUNC);
-		accmode |= MAY_OWNER_OVERRIDE;
-		status = fh_verify(rqstp, current_fh, S_IFREG, accmode);
+		status = do_open_permission(rqstp, current_fh, open);
 	}
 
 	fh_put(&resfh);
 	return status;
 }
 
+static int
+do_open_fhandle(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open *open)
+{
+	int status;
+
+	dprintk("NFSD: do_open_fhandle\n");
+
+	/* we don't know the target directory, and therefore can not
+	* set the change info
+	*/
+
+	memset(&open->op_cinfo, 0, sizeof(struct nfsd4_change_info));
+
+	/* set replay cache */
+	open->op_stateowner->so_replay.rp_openfh_len = current_fh->fh_handle.fh_size;
+	memcpy(open->op_stateowner->so_replay.rp_openfh,
+		&current_fh->fh_handle.fh_base,
+		current_fh->fh_handle.fh_size);
+
+	open->op_truncate = (open->op_iattr.ia_valid & ATTR_SIZE) &&
+	!open->op_iattr.ia_size;
+
+	status = do_open_permission(rqstp, current_fh, open);
+
+	return status;
+}
+
+
+/*
+ * nfs4_unlock_state() called in encode
+ */
 static inline int
 nfsd4_open(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open *open)
 {
 	int status;
-	dprintk("NFSD: nfsd4_open filename %.*s\n",
-		(int)open->op_fname.len, open->op_fname.data);
+	dprintk("NFSD: nfsd4_open filename %.*s op_stateowner %p\n",
+		(int)open->op_fname.len, open->op_fname.data,
+		open->op_stateowner);
+
+	if (nfs4_in_grace() && open->op_claim_type != NFS4_OPEN_CLAIM_PREVIOUS)
+		return nfserr_grace;
+
+	if (nfs4_in_no_grace() &&
+		           open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS)
+		return nfserr_no_grace;
 
 	/* This check required by spec. */
 	if (open->op_create && open->op_claim_type != NFS4_OPEN_CLAIM_NULL)
 		return nfserr_inval;
 
+	open->op_stateowner = NULL;
+	nfs4_lock_state();
+
 	/* check seqid for replay. set nfs4_owner */
 	status = nfsd4_process_open1(open);
 	if (status == NFSERR_REPLAY_ME) {
@@ -141,16 +200,30 @@ nfsd4_open(struct svc_rqst *rqstp, struc
 	}
 	if (status)
 		return status;
+	if (open->op_claim_type == NFS4_OPEN_CLAIM_NULL) {
 	/*
 	 * This block of code will (1) set CURRENT_FH to the file being opened,
 	 * creating it if necessary, (2) set open->op_cinfo, 
 	 * (3) set open->op_truncate if the file is to be truncated 
 	 * after opening, (4) do permission checking.
 	 */
-	status = do_open_lookup(rqstp, current_fh, open);
-	if (status)
-		return status;
-
+		status = do_open_lookup(rqstp, current_fh, open);
+		if (status)
+			return status;
+	} else if (open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS) {
+	/*
+	* The CURRENT_FH is already set to the file being opened. This
+	* block of code will (1) set open->op_cinfo, (2) set
+	* open->op_truncate if the file is to be truncated after opening,
+	* (3) do permission checking.
+	*/
+		status = do_open_fhandle(rqstp, current_fh, open);
+		if (status)
+			return status;
+	} else {
+		printk("NFSD: unsupported OPEN claim type\n");
+		return nfserr_inval;
+	}
 	/*
 	 * nfsd4_process_open2() does the actual opening of the file.  If
 	 * successful, it (1) truncates the file if open->op_truncate was
@@ -187,9 +260,14 @@ nfsd4_putfh(struct svc_rqst *rqstp, stru
 static inline int
 nfsd4_putrootfh(struct svc_rqst *rqstp, struct svc_fh *current_fh)
 {
+	int status;
+
 	fh_put(current_fh);
-	return exp_pseudoroot(rqstp->rq_client, current_fh,
+	status = exp_pseudoroot(rqstp->rq_client, current_fh,
 			      &rqstp->rq_chandle);
+	if (!status)
+		status = nfsd_setuser(rqstp, current_fh->fh_export);
+	return status;
 }
 
 static inline int
@@ -402,6 +480,8 @@ nfsd4_read(struct svc_rqst *rqstp, struc
 	int status;
 
 	/* no need to check permission - this will be done in nfsd_read() */
+	if (nfs4_in_grace())
+		return nfserr_grace;
 
 	if (read->rd_offset >= OFFSET_MAX)
 		return nfserr_inval;
@@ -448,6 +528,9 @@ out:
 static inline int
 nfsd4_readdir(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_readdir *readdir)
 {
+	u64 cookie = readdir->rd_cookie;
+	static const nfs4_verifier zeroverf;
+
 	/* no need to check permission - this will be done in nfsd_readdir() */
 
 	if (readdir->rd_bmval[1] & NFSD_WRITEONLY_ATTRS_WORD1)
@@ -456,7 +539,8 @@ nfsd4_readdir(struct svc_rqst *rqstp, st
 	readdir->rd_bmval[0] &= NFSD_SUPPORTED_ATTRS_WORD0;
 	readdir->rd_bmval[1] &= NFSD_SUPPORTED_ATTRS_WORD1;
 
-	if (readdir->rd_cookie > ~(u32)0)
+	if ((cookie > ~(u32)0) || (cookie == 1) || (cookie == 2) ||
+	    (cookie == 0 && memcmp(readdir->rd_verf.data, zeroverf.data, NFS4_VERIFIER_SIZE)))
 		return nfserr_bad_cookie;
 
 	readdir->rd_rqstp = rqstp;
@@ -521,10 +605,13 @@ static inline int
 nfsd4_setattr(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_setattr *setattr)
 {
 	struct nfs4_stateid *stp;
-	int status = nfserr_nofilehandle;
+	int status = nfs_ok;
+
+	if (nfs4_in_grace())
+		return nfserr_grace;
 
 	if (!current_fh->fh_dentry)
-		goto out;
+		return nfserr_nofilehandle;
 
 	status = nfs_ok;
 	if (setattr->sa_iattr.ia_valid & ATTR_SIZE) {
@@ -563,6 +650,9 @@ nfsd4_write(struct svc_rqst *rqstp, stru
 	u32 *p;
 	int status = nfs_ok;
 
+	if (nfs4_in_grace())
+		return nfserr_grace;
+
 	/* no need to check permission - this will be done in nfsd_write() */
 
 	if (write->wr_offset >= OFFSET_MAX)
@@ -757,7 +847,9 @@ nfsd4_proc_compound(struct svc_rqst *rqs
 			break;
 		case OP_CLOSE:
 			op->status = nfsd4_close(rqstp, &current_fh, &op->u.close);
-			op->replay = &op->u.close.cl_stateowner->so_replay;
+			if (op->u.close.cl_stateowner)
+				op->replay =
+					&op->u.close.cl_stateowner->so_replay;
 			break;
 		case OP_COMMIT:
 			op->status = nfsd4_commit(rqstp, &current_fh, &op->u.commit);
@@ -776,13 +868,18 @@ nfsd4_proc_compound(struct svc_rqst *rqs
 			break;
 		case OP_LOCK:
 			op->status = nfsd4_lock(rqstp, &current_fh, &op->u.lock);
-			op->replay = &op->u.lock.lk_stateowner->so_replay;
+			if (op->u.lock.lk_stateowner)
+				op->replay =
+					&op->u.lock.lk_stateowner->so_replay;
 			break;
 		case OP_LOCKT:
 			op->status = nfsd4_lockt(rqstp, &current_fh, &op->u.lockt);
 			break;
 		case OP_LOCKU:
 			op->status = nfsd4_locku(rqstp, &current_fh, &op->u.locku);
+			if (op->u.locku.lu_stateowner)
+				op->replay =
+					&op->u.locku.lu_stateowner->so_replay;
 			break;
 		case OP_LOOKUP:
 			op->status = nfsd4_lookup(rqstp, &current_fh, &op->u.lookup);
@@ -797,15 +894,21 @@ nfsd4_proc_compound(struct svc_rqst *rqs
 			break;
 		case OP_OPEN:
 			op->status = nfsd4_open(rqstp, &current_fh, &op->u.open);
-			op->replay = &op->u.open.op_stateowner->so_replay;
+			if (op->u.open.op_stateowner)
+				op->replay =
+					&op->u.open.op_stateowner->so_replay;
 			break;
 		case OP_OPEN_CONFIRM:
 			op->status = nfsd4_open_confirm(rqstp, &current_fh, &op->u.open_confirm);
-			op->replay = &op->u.open_confirm.oc_stateowner->so_replay;
+			if (op->u.open_confirm.oc_stateowner)
+				op->replay =
+					&op->u.open_confirm.oc_stateowner->so_replay;
 			break;
 		case OP_OPEN_DOWNGRADE:
 			op->status = nfsd4_open_downgrade(rqstp, &current_fh, &op->u.open_downgrade);
-			op->replay = &op->u.open_downgrade.od_stateowner->so_replay;
+			if (op->u.open_downgrade.od_stateowner)
+				op->replay =
+					&op->u.open_downgrade.od_stateowner->so_replay;
 			break;
 		case OP_PUTFH:
 			op->status = nfsd4_putfh(rqstp, &current_fh, &op->u.putfh);
--- diff/fs/nfsd/nfs4state.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/nfsd/nfs4state.c	2004-04-21 10:45:35.765266352 +0100
@@ -52,6 +52,7 @@
 
 /* Globals */
 time_t boot_time;
+static time_t grace_end = 0;
 static u32 current_clientid = 1;
 static u32 current_ownerid;
 static u32 current_fileid;
@@ -89,6 +90,9 @@ nfs4_lock_state(void)
 	down(&client_sema);
 }
 
+/*
+ * nfs4_unlock_state(); called in encode
+ */
 void
 nfs4_unlock_state(void)
 {
@@ -136,12 +140,16 @@ static void release_file(struct nfs4_fil
  *
  * client_lru holds client queue ordered by nfs4_client.cl_time
  * for lease renewal.
+ *
+ * close_lru holds (open) stateowner queue ordered by nfs4_stateowner.so_time
+ * for last close replay.
  */
 static struct list_head	conf_id_hashtbl[CLIENT_HASH_SIZE];
 static struct list_head	conf_str_hashtbl[CLIENT_HASH_SIZE];
 static struct list_head	unconf_str_hashtbl[CLIENT_HASH_SIZE];
 static struct list_head	unconf_id_hashtbl[CLIENT_HASH_SIZE];
 static struct list_head client_lru;
+static struct list_head close_lru;
 
 static inline void
 renew_client(struct nfs4_client *clp)
@@ -376,7 +384,6 @@ nfsd4_setclientid(struct svc_rqst *rqstp
 	unsigned int 		strhashval;
 	struct nfs4_client *	conf, * unconf, * new, * clp;
 	int 			status;
-	struct list_head *pos, *next;
 	
 	status = nfserr_inval;
 	if (!check_name(clname))
@@ -391,8 +398,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp
 
 	conf = NULL;
 	nfs4_lock_state();
-	list_for_each_safe(pos, next, &conf_str_hashtbl[strhashval]) {
-		clp = list_entry(pos, struct nfs4_client, cl_strhash);
+	list_for_each_entry(clp, &conf_str_hashtbl[strhashval], cl_strhash) {
 		if (!cmp_name(&clp->cl_name, &clname))
 			continue;
 		/* 
@@ -422,8 +428,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp
 		break;
 	}
 	unconf = NULL;
-	list_for_each_safe(pos, next, &unconf_str_hashtbl[strhashval]) {
-		clp = list_entry(pos, struct nfs4_client, cl_strhash);
+	list_for_each_entry(clp, &unconf_str_hashtbl[strhashval], cl_strhash) {
 		if (!cmp_name(&clp->cl_name, &clname))
 			continue;
 		/* cl_name match from a previous SETCLIENTID operation */
@@ -549,7 +554,6 @@ nfsd4_setclientid_confirm(struct svc_rqs
 	struct nfs4_client *clp, *conf = NULL, *unconf = NULL;
 	nfs4_verifier confirm = setclientid_confirm->sc_confirm; 
 	clientid_t * clid = &setclientid_confirm->sc_clientid;
-	struct list_head *pos, *next;
 	int status;
 
 	status = nfserr_stale_clientid;
@@ -562,8 +566,7 @@ nfsd4_setclientid_confirm(struct svc_rqs
 
 	idhashval = clientid_hashval(clid->cl_id);
 	nfs4_lock_state();
-	list_for_each_safe(pos, next, &conf_id_hashtbl[idhashval]) {
-		clp = list_entry(pos, struct nfs4_client, cl_idhash);
+	list_for_each_entry(clp, &conf_id_hashtbl[idhashval], cl_idhash) {
 		if (!cmp_clid(&clp->cl_clientid, clid))
 			continue;
 
@@ -582,8 +585,7 @@ nfsd4_setclientid_confirm(struct svc_rqs
 		conf = clp;
 		break;
 	}
-	list_for_each_safe(pos, next, &unconf_id_hashtbl[idhashval]) {
-		clp = list_entry(pos, struct nfs4_client, cl_idhash);
+	list_for_each_entry(clp, &unconf_id_hashtbl[idhashval], cl_idhash) {
 		if (!cmp_clid(&clp->cl_clientid, clid))
 			continue;
 		status = nfserr_inval;
@@ -774,6 +776,8 @@ alloc_init_open_stateowner(unsigned int 
 	INIT_LIST_HEAD(&sop->so_perclient);
 	INIT_LIST_HEAD(&sop->so_perfilestate);
 	INIT_LIST_HEAD(&sop->so_perlockowner);  /* not used */
+	INIT_LIST_HEAD(&sop->so_close_lru);
+	sop->so_time = 0;
 	list_add(&sop->so_idhash, &ownerid_hashtbl[idhashval]);
 	list_add(&sop->so_strhash, &ownerstr_hashtbl[strhashval]);
 	list_add(&sop->so_perclient, &clp->cl_perclient);
@@ -814,6 +818,7 @@ release_stateowner(struct nfs4_stateowne
 	list_del(&sop->so_strhash);
 	list_del(&sop->so_perclient);
 	list_del(&sop->so_perlockowner);
+	list_del(&sop->so_close_lru);
 	del_perclient++;
 	while (!list_empty(&sop->so_perfilestate)) {
 		stp = list_entry(sop->so_perfilestate.next, 
@@ -882,6 +887,19 @@ release_file(struct nfs4_file *fp)
 }	
 
 void
+move_to_close_lru(struct nfs4_stateowner *sop)
+{
+	dprintk("NFSD: move_to_close_lru nfs4_stateowner %p\n", sop);
+	/* remove stateowner from all other hash lists except perclient */
+	list_del_init(&sop->so_idhash);
+	list_del_init(&sop->so_strhash);
+	list_del_init(&sop->so_perlockowner);
+
+        list_add_tail(&sop->so_close_lru, &close_lru);
+        sop->so_time = get_seconds();
+}
+
+void
 release_state_owner(struct nfs4_stateid *stp, struct nfs4_stateowner **sopp,
 		int flag)
 {
@@ -890,16 +908,13 @@ release_state_owner(struct nfs4_stateid 
 
 	dprintk("NFSD: release_state_owner\n");
 	release_stateid(stp, flag);
-	/*
-	 * release unused nfs4_stateowners.
-	 * XXX will need to be placed  on an  open_stateid_lru list to be
+
+	/* place unused nfs4_stateowners on so_close_lru list to be
 	 * released by the laundromat service after the lease period
 	 * to enable us to handle CLOSE replay
 	 */
-	if (sop->so_confirmed && list_empty(&sop->so_perfilestate)) {
-		release_stateowner(sop);
-		*sopp = NULL;
-	}
+	if (sop->so_confirmed && list_empty(&sop->so_perfilestate))
+		move_to_close_lru(sop);
 	/* unused nfs4_file's are releseed. XXX slab cache? */
 	if (list_empty(&fp->fi_perfile)) {
 		release_file(fp);
@@ -916,11 +931,9 @@ cmp_owner_str(struct nfs4_stateowner *so
 /* search ownerstr_hashtbl[] for owner */
 static int
 find_openstateowner_str(unsigned int hashval, struct nfsd4_open *open, struct nfs4_stateowner **op) {
-	struct list_head *pos, *next;
 	struct nfs4_stateowner *local = NULL;
 
-	list_for_each_safe(pos, next, &ownerstr_hashtbl[hashval]) {
-		local = list_entry(pos, struct nfs4_stateowner, so_strhash);
+	list_for_each_entry(local, &ownerstr_hashtbl[hashval], so_strhash) {
 		if(!cmp_owner_str(local, &open->op_owner, &open->op_clientid)) 
 			continue;
 		*op = local;
@@ -933,12 +946,10 @@ find_openstateowner_str(unsigned int has
 static int
 verify_clientid(struct nfs4_client **client, clientid_t *clid) {
 
-	struct list_head *pos, *next;
 	struct nfs4_client *clp;
 	unsigned int idhashval = clientid_hashval(clid->cl_id);
 
-	list_for_each_safe(pos, next, &conf_id_hashtbl[idhashval]) {
-		clp = list_entry(pos, struct nfs4_client, cl_idhash);
+	list_for_each_entry(clp, &conf_id_hashtbl[idhashval], cl_idhash) {
 		if (!cmp_clid(&clp->cl_clientid, clid))
 			continue;
 		*client = clp;
@@ -951,11 +962,9 @@ verify_clientid(struct nfs4_client **cli
 /* search file_hashtbl[] for file */
 static int
 find_file(unsigned int hashval, struct inode *ino, struct nfs4_file **fp) {
-	struct list_head *pos, *next;
 	struct nfs4_file *local = NULL;
 
-	list_for_each_safe(pos, next, &file_hashtbl[hashval]) {
-		local = list_entry(pos, struct nfs4_file, fi_hash);
+	list_for_each_entry(local, &file_hashtbl[hashval], fi_hash) {
 		if (local->fi_inode == ino) {
 			*fp = local;
 			return(1);
@@ -1011,15 +1020,13 @@ nfs4_share_conflict(struct svc_fh *curre
 	unsigned int fi_hashval;
 	struct nfs4_file *fp;
 	struct nfs4_stateid *stp;
-	struct list_head *pos, *next;
 
 	dprintk("NFSD: nfs4_share_conflict\n");
 
 	fi_hashval = file_hashval(ino);
 	if (find_file(fi_hashval, ino, &fp)) {
 	/* Search for conflicting share reservations */
-		list_for_each_safe(pos, next, &fp->fi_perfile) {
-			stp = list_entry(pos, struct nfs4_stateid, st_perfile);
+		list_for_each_entry(stp, &fp->fi_perfile, st_perfile) {
 			if (test_bit(deny_type, &stp->st_deny_bmap) ||
 			    test_bit(NFS4_SHARE_DENY_BOTH, &stp->st_deny_bmap))
 				return nfserr_share_denied;
@@ -1066,6 +1073,8 @@ nfs4_file_downgrade(struct file *filp, u
  * 		notfound:
  * 			verify clientid
  * 			create new owner
+ *
+ * called with nfs4_lock_state() held.
  */
 int
 nfsd4_process_open1(struct nfsd4_open *open)
@@ -1082,9 +1091,8 @@ nfsd4_process_open1(struct nfsd4_open *o
 
 	status = nfserr_stale_clientid;
 	if (STALE_CLIENTID(&open->op_clientid))
-		goto out;
+		return status;
 
-	nfs4_lock_state();
 	strhashval = ownerstr_hashval(clientid->cl_id, open->op_owner);
 	if (find_openstateowner_str(strhashval, open, &sop)) {
 		open->op_stateowner = sop;
@@ -1104,7 +1112,7 @@ nfsd4_process_open1(struct nfsd4_open *o
 			}
 			/* replay: indicate to calling function */
 			status = NFSERR_REPLAY_ME;
-			goto out;
+			return status;
 		}
 		if (sop->so_confirmed) {
 			if (open->op_seqid == sop->so_seqid + 1) { 
@@ -1142,25 +1150,27 @@ instantiate_new_owner:
 renew:
 	renew_client(sop->so_client);
 out:
-	nfs4_unlock_state();
+	if (status && open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS)
+		status = nfserr_reclaim_bad;
 	return status;
 }
-
+/*
+ * called with nfs4_lock_state() held.
+ */
 int
 nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open *open)
 {
 	struct iattr iattr;
 	struct nfs4_stateowner *sop = open->op_stateowner;
-	struct nfs4_file *fp;
+	struct nfs4_file *fp = NULL;
 	struct inode *ino;
 	unsigned int fi_hashval;
-	struct list_head *pos, *next;
 	struct nfs4_stateid *stq, *stp = NULL;
 	int status;
 
 	status = nfserr_resource;
 	if (!sop)
-		goto out;
+		return status;
 
 	ino = current_fh->fh_dentry->d_inode;
 
@@ -1168,13 +1178,11 @@ nfsd4_process_open2(struct svc_rqst *rqs
 	if (!TEST_ACCESS(open->op_share_access) || !TEST_DENY(open->op_share_deny))
 		goto out;
 
-	nfs4_lock_state();
 	fi_hashval = file_hashval(ino);
 	if (find_file(fi_hashval, ino, &fp)) {
 		/* Search for conflicting share reservations */
 		status = nfserr_share_denied;
-		list_for_each_safe(pos, next, &fp->fi_perfile) {
-		stq = list_entry(pos, struct nfs4_stateid, st_perfile);
+		list_for_each_entry(stq, &fp->fi_perfile, st_perfile) {
 			if(stq->st_stateowner == sop) {
 				stp = stq;
 				continue;
@@ -1253,6 +1261,17 @@ out:
 	if (fp && list_empty(&fp->fi_perfile))
 		release_file(fp);
 
+	if (open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS) {
+		if (status)
+			status = nfserr_reclaim_bad;
+		else {
+		/* successful reclaim. so_seqid is decremented because
+		* it will be bumped in encode_open
+		*/
+			open->op_stateowner->so_confirmed = 1;
+			open->op_stateowner->so_seqid--;
+		}
+	}
 	/*
 	* To finish the open response, we just need to set the rflags.
 	*/
@@ -1260,12 +1279,12 @@ out:
 	if (!open->op_stateowner->so_confirmed)
 		open->op_rflags |= NFS4_OPEN_RESULT_CONFIRM;
 
-	nfs4_unlock_state();
 	return status;
 out_free:
 	kfree(stp);
 	goto out;
 }
+
 static struct work_struct laundromat_work;
 static void laundromat_main(void *);
 static DECLARE_WORK(laundromat_work, laundromat_main, NULL);
@@ -1274,7 +1293,6 @@ int 
 nfsd4_renew(clientid_t *clid)
 {
 	struct nfs4_client *clp;
-	struct list_head *pos, *next;
 	unsigned int idhashval;
 	int status;
 
@@ -1286,15 +1304,13 @@ nfsd4_renew(clientid_t *clid)
 		goto out;
 	status = nfs_ok;
 	idhashval = clientid_hashval(clid->cl_id);
-	list_for_each_safe(pos, next, &conf_id_hashtbl[idhashval]) {
-		clp = list_entry(pos, struct nfs4_client, cl_idhash);
+	list_for_each_entry(clp, &conf_id_hashtbl[idhashval], cl_idhash) {
 		if (!cmp_clid(&clp->cl_clientid, clid))
 			continue;
 		renew_client(clp);
 		goto out;
 	}
-	list_for_each_safe(pos, next, &unconf_id_hashtbl[idhashval]) {
-		clp = list_entry(pos, struct nfs4_client, cl_idhash);
+	list_for_each_entry(clp, &unconf_id_hashtbl[idhashval], cl_idhash) {
 		if (!cmp_clid(&clp->cl_clientid, clid))
 			continue;
 		renew_client(clp);
@@ -1316,9 +1332,11 @@ time_t
 nfs4_laundromat(void)
 {
 	struct nfs4_client *clp;
+	struct nfs4_stateowner *sop;
 	struct list_head *pos, *next;
 	time_t cutoff = get_seconds() - NFSD_LEASE_TIME;
-	time_t t, return_val = NFSD_LEASE_TIME;
+	time_t t, clientid_val = NFSD_LEASE_TIME;
+	time_t u, close_val = NFSD_LEASE_TIME;
 
 	nfs4_lock_state();
 
@@ -1327,18 +1345,30 @@ nfs4_laundromat(void)
 		clp = list_entry(pos, struct nfs4_client, cl_lru);
 		if (time_after((unsigned long)clp->cl_time, (unsigned long)cutoff)) {
 			t = clp->cl_time - cutoff;
-			if (return_val > t)
-				return_val = t;
+			if (clientid_val > t)
+				clientid_val = t;
 			break;
 		}
 		dprintk("NFSD: purging unused client (clientid %08x)\n",
 			clp->cl_clientid.cl_id);
 		expire_client(clp);
 	}
-	if (return_val < NFSD_LAUNDROMAT_MINTIMEOUT)
-		return_val = NFSD_LAUNDROMAT_MINTIMEOUT;
+	list_for_each_safe(pos, next, &close_lru) {
+		sop = list_entry(pos, struct nfs4_stateowner, so_close_lru);
+		if (time_after((unsigned long)sop->so_time, (unsigned long)cutoff)) {
+			u = sop->so_time - cutoff;
+			if (close_val > u)
+				close_val = u;
+			break;
+		}
+		dprintk("NFSD: purging unused open stateowner (so_id %d)\n",
+			sop->so_id);
+		release_stateowner(sop);
+	}
+	if (clientid_val < NFSD_LAUNDROMAT_MINTIMEOUT)
+		clientid_val = NFSD_LAUNDROMAT_MINTIMEOUT;
 	nfs4_unlock_state();
-	return return_val;
+	return clientid_val;
 }
 
 void
@@ -1351,17 +1381,19 @@ laundromat_main(void *not_used)
 	schedule_delayed_work(&laundromat_work, t*HZ);
 }
 
-/* search ownerid_hashtbl[] for stateid owner (stateid->si_stateownerid) */
+/* search ownerid_hashtbl[] and close_lru for stateid owner
+ * (stateid->si_stateownerid)
+ */
 struct nfs4_stateowner *
-find_openstateowner_id(u32 st_id) {
-	struct list_head *pos, *next;
+find_openstateowner_id(u32 st_id, int flags) {
 	struct nfs4_stateowner *local = NULL;
-	unsigned int hashval = ownerid_hashval(st_id);
 
-	list_for_each_safe(pos, next, &ownerid_hashtbl[hashval]) {
-		local = list_entry(pos, struct nfs4_stateowner, so_idhash);
-		if(local->so_id == st_id)
-			return local;
+	dprintk("NFSD: find_openstateowner_id %d\n", st_id);
+	if (flags & CLOSE_STATE) {
+		list_for_each_entry(local, &close_lru, so_close_lru) {
+			if(local->so_id == st_id)
+				return local;
+		}
 	}
 	return NULL;
 }
@@ -1547,11 +1579,12 @@ no_nfs4_stateid:
 	* starting by trying to look up the stateowner.
 	* If stateowner is not found - stateid is bad.
 	*/
-	if (!(sop = find_openstateowner_id(stateid->si_stateownerid))) {
+	if (!(sop = find_openstateowner_id(stateid->si_stateownerid, flags))) {
 		printk("NFSD: preprocess_seqid_op: no stateowner or nfs4_stateid!\n");
 		status = nfserr_bad_stateid;
 		goto out;
 	}
+	*sopp = sop;
 
 check_replay:
 	if (seqid == sop->so_seqid) {
@@ -1561,11 +1594,15 @@ check_replay:
 	} else  {
 		printk("NFSD: preprocess_seqid_op: bad seqid (expected %d, got %d\n", sop->so_seqid +1, seqid);
 
+		*sopp = NULL;
 		status = nfserr_bad_seqid;
 	}
 	goto out;
 }
 
+/*
+ * nfs4_unlock_state(); called in encode
+ */
 int
 nfsd4_open_confirm(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open_confirm *oc)
 {
@@ -1601,7 +1638,6 @@ nfsd4_open_confirm(struct svc_rqst *rqst
 		         stp->st_stateid.si_generation);
 	status = nfs_ok;
 out:
-	nfs4_unlock_state();
 	return status;
 }
 
@@ -1630,6 +1666,9 @@ reset_union_bmap_deny(unsigned long deny
 	}
 }
 
+/*
+ * nfs4_unlock_state(); called in encode
+ */
 
 int
 nfsd4_open_downgrade(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open_downgrade *od)
@@ -1642,6 +1681,7 @@ nfsd4_open_downgrade(struct svc_rqst *rq
 			(int)current_fh->fh_dentry->d_name.len,
 			current_fh->fh_dentry->d_name.name);
 
+	od->od_stateowner = NULL;
 	status = nfserr_inval;
 	if (!TEST_ACCESS(od->od_share_access) || !TEST_DENY(od->od_share_deny))
 		goto out;
@@ -1675,10 +1715,12 @@ nfsd4_open_downgrade(struct svc_rqst *rq
 	memcpy(&od->od_stateid, &stp->st_stateid, sizeof(stateid_t));
 	status = nfs_ok;
 out:
-	nfs4_unlock_state();
 	return status;
 }
 
+/*
+ * nfs4_unlock_state() called after encode
+ */
 int
 nfsd4_close(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_close *close)
 {
@@ -1689,10 +1731,12 @@ nfsd4_close(struct svc_rqst *rqstp, stru
 			(int)current_fh->fh_dentry->d_name.len,
 			current_fh->fh_dentry->d_name.name);
 
+	close->cl_stateowner = NULL;
 	nfs4_lock_state();
+	/* check close_lru for replay */
 	if ((status = nfs4_preprocess_seqid_op(current_fh, close->cl_seqid, 
 					&close->cl_stateid, 
-					CHECK_FH | OPEN_STATE, 
+					CHECK_FH | OPEN_STATE | CLOSE_STATE,
 					&close->cl_stateowner, &stp, NULL)))
 		goto out; 
 	/*
@@ -1705,7 +1749,6 @@ nfsd4_close(struct svc_rqst *rqstp, stru
 	/* release_state_owner() calls nfsd_close() if needed */
 	release_state_owner(stp, &close->cl_stateowner, OPEN_STATE);
 out:
-	nfs4_unlock_state();
 	return status;
 }
 
@@ -1729,7 +1772,6 @@ static struct list_head lockstateid_hash
 struct nfs4_stateid *
 find_stateid(stateid_t *stid, int flags)
 {
-	struct list_head *pos, *next;
 	struct nfs4_stateid *local = NULL;
 	u32 st_id = stid->si_stateownerid;
 	u32 f_id = stid->si_fileid;
@@ -1738,8 +1780,7 @@ find_stateid(stateid_t *stid, int flags)
 	dprintk("NFSD: find_stateid flags 0x%x\n",flags);
 	if ((flags & LOCK_STATE) || (flags & RDWR_STATE)) {
 		hashval = stateid_hashval(st_id, f_id);
-		list_for_each_safe(pos, next, &lockstateid_hashtbl[hashval]) {
-			local = list_entry(pos, struct nfs4_stateid, st_hash);
+		list_for_each_entry(local, &lockstateid_hashtbl[hashval], st_hash) {
 			if((local->st_stateid.si_stateownerid == st_id) &&
 			   (local->st_stateid.si_fileid == f_id))
 				return local;
@@ -1747,8 +1788,7 @@ find_stateid(stateid_t *stid, int flags)
 	} 
 	if ((flags & OPEN_STATE) || (flags & RDWR_STATE)) {
 		hashval = stateid_hashval(st_id, f_id);
-		list_for_each_safe(pos, next, &stateid_hashtbl[hashval]) {
-			local = list_entry(pos, struct nfs4_stateid, st_hash);
+		list_for_each_entry(local, &stateid_hashtbl[hashval], st_hash) {
 			if((local->st_stateid.si_stateownerid == st_id) &&
 			   (local->st_stateid.si_fileid == f_id))
 				return local;
@@ -1779,14 +1819,12 @@ nfs4_transform_lock_offset(struct file_l
 int
 nfs4_verify_lock_stateowner(struct nfs4_stateowner *sop, unsigned int hashval)
 {
-	struct list_head *pos, *next;
 	struct nfs4_stateowner *local = NULL;
 	int status = 0;
 			        
 	if (hashval >= LOCK_HASH_SIZE)
 		goto out;
-	list_for_each_safe(pos, next, &lock_ownerid_hashtbl[hashval]) {
-		local = list_entry(pos, struct nfs4_stateowner, so_idhash);
+	list_for_each_entry(local, &lock_ownerid_hashtbl[hashval], so_idhash) {
 		if (local == sop) {
 			status = 1;
 			goto out;
@@ -1817,11 +1855,9 @@ nfs4_set_lock_denied(struct file_lock *f
 
 static int
 find_lockstateowner_str(unsigned int hashval, struct xdr_netobj *owner, clientid_t *clid, struct nfs4_stateowner **op) {
-	struct list_head *pos, *next;
 	struct nfs4_stateowner *local = NULL;
 
-	list_for_each_safe(pos, next, &lock_ownerstr_hashtbl[hashval]) {
-		local = list_entry(pos, struct nfs4_stateowner, so_strhash);
+	list_for_each_entry(local, &lock_ownerstr_hashtbl[hashval], so_strhash) {
 		if(!cmp_owner_str(local, owner, clid)) 
 			continue;
 		*op = local;
@@ -1854,6 +1890,8 @@ alloc_init_lock_stateowner(unsigned int 
 	INIT_LIST_HEAD(&sop->so_perclient);
 	INIT_LIST_HEAD(&sop->so_perfilestate);
 	INIT_LIST_HEAD(&sop->so_perlockowner);
+	INIT_LIST_HEAD(&sop->so_close_lru); /* not used */
+	sop->so_time = 0;
 	list_add(&sop->so_idhash, &lock_ownerid_hashtbl[idhashval]);
 	list_add(&sop->so_strhash, &lock_ownerstr_hashtbl[strhashval]);
 	list_add(&sop->so_perclient, &clp->cl_perclient);
@@ -1913,6 +1951,8 @@ check_lock_length(u64 offset, u64 length
 
 /*
  *  LOCK operation 
+ *
+ * nfs4_unlock_state(); called in encode
  */
 int
 nfsd4_lock(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_lock *lock)
@@ -1929,6 +1969,11 @@ nfsd4_lock(struct svc_rqst *rqstp, struc
 		(long long) lock->lk_offset,
 		(long long) lock->lk_length);
 
+	if (nfs4_in_grace() && !lock->lk_reclaim)
+		return nfserr_grace;
+	if (nfs4_in_no_grace() && lock->lk_reclaim)
+		return nfserr_no_grace;
+
 	if (check_lock_length(lock->lk_offset, lock->lk_length))
 		 return nfserr_inval;
 
@@ -1958,8 +2003,11 @@ nfsd4_lock(struct svc_rqst *rqstp, struc
 		                        CHECK_FH | OPEN_STATE,
 		                        &open_sop, &open_stp,
 					&lock->v.new.clientid);
-		if (status)
+		if (status) {
+			if (lock->lk_reclaim)
+				status = nfserr_reclaim_bad;
 			goto out;
+		}
 		/* create lockowner and lock stateid */
 		fp = open_stp->st_file;
 		strhashval = lock_ownerstr_hashval(fp->fi_inode, 
@@ -2077,7 +2125,6 @@ out_destroy_new_stateid:
 		release_state_owner(lock_stp, &lock->lk_stateowner, LOCK_STATE);
 	}
 out:
-	nfs4_unlock_state();
 	return status;
 }
 
@@ -2095,6 +2142,9 @@ nfsd4_lockt(struct svc_rqst *rqstp, stru
 	unsigned int strhashval;
 	int status;
 
+	if (nfs4_in_grace())
+		return nfserr_grace;
+
 	if (check_lock_length(lockt->lt_offset, lockt->lt_length))
 		 return nfserr_inval;
 
@@ -2188,6 +2238,7 @@ nfsd4_locku(struct svc_rqst *rqstp, stru
 	if (check_lock_length(locku->lu_offset, locku->lu_length))
 		 return nfserr_inval;
 
+	locku->lu_stateowner = NULL;
 	nfs4_lock_state();
 									        
 	if ((status = nfs4_preprocess_seqid_op(current_fh, 
@@ -2230,7 +2281,6 @@ nfsd4_locku(struct svc_rqst *rqstp, stru
 	memcpy(&locku->lu_stateid, &stp->st_stateid, sizeof(stateid_t));
 
 out:
-	nfs4_unlock_state();
 	return status;
 
 out_nfserr:
@@ -2265,7 +2315,6 @@ int
 nfsd4_release_lockowner(struct svc_rqst *rqstp, struct nfsd4_release_lockowner *rlockowner)
 {
 	clientid_t *clid = &rlockowner->rl_clientid;
-	struct list_head *pos, *next;
 	struct nfs4_stateowner *local = NULL;
 	struct xdr_netobj *owner = &rlockowner->rl_owner;
 	int status, i;
@@ -2286,9 +2335,7 @@ nfsd4_release_lockowner(struct svc_rqst 
 	/* find the lockowner */
         status = nfs_ok;
 	for (i=0; i < LOCK_HASH_SIZE; i++) {
-		list_for_each_safe(pos, next, &lock_ownerstr_hashtbl[i]) {
-			local = list_entry(pos, struct nfs4_stateowner,
-						so_strhash);
+		list_for_each_entry(local, &lock_ownerstr_hashtbl[i], so_strhash) {
 			if(cmp_owner_str(local, owner, clid))
 				break;
 		}
@@ -2299,9 +2346,7 @@ nfsd4_release_lockowner(struct svc_rqst 
 		/* check for any locks held by any stateid associated with the
 		 * (lock) stateowner */
 		status = nfserr_locks_held;
-		list_for_each_safe(pos, next, &local->so_perfilestate) {
-			stp = list_entry(pos, struct nfs4_stateid,
-					                    st_perfilestate);
+		list_for_each_entry(stp, &local->so_perfilestate, st_perfilestate) {
 			if(stp->st_vfs_set) {
 				if (check_for_locks(&stp->st_vfs_file, local))
 					goto out;
@@ -2324,6 +2369,7 @@ void 
 nfs4_state_init(void)
 {
 	int i;
+	time_t start = get_seconds();
 
 	if (nfs4_init)
 		return;
@@ -2351,15 +2397,30 @@ nfs4_state_init(void)
 	memset(&zerostateid, 0, sizeof(stateid_t));
 	memset(&onestateid, ~0, sizeof(stateid_t));
 
+	INIT_LIST_HEAD(&close_lru);
 	INIT_LIST_HEAD(&client_lru);
 	init_MUTEX(&client_sema);
-	boot_time = get_seconds();
+	boot_time = start;
+	grace_end = start + NFSD_LEASE_TIME;
 	INIT_WORK(&laundromat_work,laundromat_main, NULL);
 	schedule_delayed_work(&laundromat_work, NFSD_LEASE_TIME*HZ);
 	nfs4_init = 1;
 
 }
 
+int
+nfs4_in_grace(void)
+{
+	return time_before(get_seconds(), (unsigned long)grace_end);
+}
+
+int
+nfs4_in_no_grace(void)
+{
+	return (grace_end < get_seconds());
+}
+
+
 static void
 __nfs4_state_shutdown(void)
 {
--- diff/fs/nfsd/nfs4xdr.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/nfsd/nfs4xdr.c	2004-04-21 10:45:35.766266200 +0100
@@ -58,93 +58,94 @@
 
 #define NFSDDBG_FACILITY		NFSDDBG_XDR
 
-/*
- * From Peter Astrand <peter@cendio.se>: The following routines check
- * whether a filename supplied by the client is valid.
- */
-static const char trailing_bytes_for_utf8[256] = {
-	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+static const char utf8_byte_len[256] = {
+	1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+	1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+	1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+	1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,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,
-	1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-	2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5
+	0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+	3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, 4,4,4,4,4,4,4,4,5,5,5,5,6,6,0,0
 };
 
 static inline int
-is_legal_iso_utf8_sequence(unsigned char *source, int length)
+is_legal_utf8_sequence(unsigned char *source, int length)
 {
-	unsigned char a;
-	unsigned char *srcptr;
+	unsigned char *ptr;
+	unsigned char c;
 
-	srcptr = source + length;
+	if (length==1) return 1;
 
-	switch (length) {
-		/* Everything else falls through when "1"... */
+	/* Check for overlong sequence, and check second byte */
+	c = *(source + 1);
+	switch (*source) {
+	case 0xE0: /* 3 bytes */
+		if ( c < 0xA0 ) return 0;
+		break;
+	case 0xF0: /* 4 bytes */
+		if ( c < 0x90 ) return 0;
+		break;
+	case 0xF8: /* 5 bytes */
+		if ( c < 0xC8 ) return 0;
+		break;
+	case 0xFC: /* 6 bytes */
+		if ( c < 0x84 ) return 0;
+		break;
 	default:
-		/* Sequences with more than 6 bytes are invalid */
-		return 0;
+		if ( (c & 0xC0) != 0x80) return 0;
+	}
 
-		/*
-		   Byte 3-6 must be 80..BF
-		*/
-	case 6:
-		if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0;
-	case 5:
-		if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0;
-	case 4:
-		if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0;
-	case 3:
-		if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0;
-
-	case 2:
-		a = *--srcptr;
-
-		/* Upper limit */
-		if (a > 0xBF)
-			/* 2nd byte may never be > 0xBF */
-			return 0;
+	/* Check that trailing bytes look like 10xxxxxx */
+	for (ptr = source++ + length - 1; ptr>source; ptr--)
+		if ( ((*ptr) & 0xC0) != 0x80 ) return 0;
+	return 1;
+}
 
-		/*
-		   Lower limits checks, to detect non-shortest forms.
-		   No fall-through in this inner switch.
-		*/
-		switch (*source) {
-		case 0xE0: /* 3 bytes */
-			if (a < 0xA0) return 0;
-			break;
-		case 0xF0: /* 4 bytes */
-			if (a < 0x90) return 0;
-			break;
-		case 0xF8: /* 5 bytes */
-			if (a < 0xC8) return 0;
-			break;
-		case 0xFC: /* 6 bytes */
-			if (a < 0x84) return 0;
-			break;
-		default:
-			/* In all cases, 2nd byte must be >= 0x80 (because leading
-			   10...) */
-			if (a < 0x80) return 0;
-		}
+/* This does some screening on disallowed unicode characters.  It is NOT
+ * comprehensive.
+ */
+static int
+is_allowed_utf8_char(unsigned char *source, int length)
+{
+	/* We assume length and source point to a valid utf8 sequence */
+	unsigned char c;
 
-	case 1:
-		/* Invalid ranges */
-		if (*source >= 0x80 && *source < 0xC2)
-			/* Multibyte char with value < 0xC2, non-shortest */
-			return 0;
-		if (*source > 0xFD)
-			/* Leading byte starting with 11111110 is illegal */
-			return 0;
-		if (!*source)
-			return 0;
+	/* Disallow F0000 and up (in utf8, F3B08080) */
+	if (*source > 0xF3 ) return 0;
+	c = *(source + 1);
+	switch (*source) {
+	case 0xF3:
+		if (c >= 0xB0) return 0;
+		break;
+	/* Disallow D800-F8FF (in utf8, EDA080-EFA3BF */
+	case 0xED:
+		if (c >= 0xA0) return 0;
+		break;
+	case 0xEE:
+		return 0;
+		break;
+	case 0xEF:
+		if (c <= 0xA3) return 0;
+	/* Disallow FFF9-FFFF (EFBFB9-EFBFBF) */
+		if (c==0xBF)
+			/* Don't need to check <=0xBF, since valid utf8 */
+			if ( *(source+2) >= 0xB9) return 0;
+		break;
 	}
-
 	return 1;
 }
 
+/* This routine should really check to see that the proper stringprep
+ * mappings have been applied.  Instead, we do a simple screen of some
+ * of the more obvious illegal values by calling is_allowed_utf8_char.
+ * This will allow many illegal strings through, but if a client behaves,
+ * it will get full functionality.  The other option (apart from full
+ * stringprep checking) is to limit everything to an easily handled subset,
+ * such as 7-bit ascii.
+ *
+ * Note - currently calling routines ignore return value except as boolean.
+ */
 static int
 check_utf8(char *str, int len)
 {
@@ -155,11 +156,17 @@ check_utf8(char *str, int len)
 	sourceend = str + len;
 
 	while (chunk < sourceend) {
-		chunklen = trailing_bytes_for_utf8[*chunk]+1;
+		chunklen = utf8_byte_len[*chunk];
+		if (!chunklen)
+			return nfserr_inval;
 		if (chunk + chunklen > sourceend)
 			return nfserr_inval;
-		if (!is_legal_iso_utf8_sequence(chunk, chunklen))
+		if (!is_legal_utf8_sequence(chunk, chunklen))
+			return nfserr_inval;
+		if (!is_allowed_utf8_char(chunk, chunklen))
 			return nfserr_inval;
+		if ( (chunklen==1) && (!*chunk) )
+			return nfserr_inval; /* Disallow embedded nulls */
 		chunk += chunklen;
 	}
 
@@ -477,11 +484,14 @@ nfsd4_decode_access(struct nfsd4_compoun
 	DECODE_TAIL;
 }
 
+#define NFS4_STATE_NOT_LOCKED	((void *)-1)
+
 static int
 nfsd4_decode_close(struct nfsd4_compoundargs *argp, struct nfsd4_close *close)
 {
 	DECODE_HEAD;
 
+	close->cl_stateowner = NFS4_STATE_NOT_LOCKED;
 	READ_BUF(4 + sizeof(stateid_t));
 	READ32(close->cl_seqid);
 	READ32(close->cl_stateid.si_generation);
@@ -572,6 +582,7 @@ nfsd4_decode_lock(struct nfsd4_compounda
 {
 	DECODE_HEAD;
 
+	lock->lk_stateowner = NFS4_STATE_NOT_LOCKED;
 	/*
 	* type, reclaim(boolean), offset, length, new_lock_owner(boolean)
 	*/
@@ -629,6 +640,7 @@ nfsd4_decode_locku(struct nfsd4_compound
 {
 	DECODE_HEAD;
 
+	locku->lu_stateowner = NFS4_STATE_NOT_LOCKED;
 	READ_BUF(24 + sizeof(stateid_t));
 	READ32(locku->lu_type);
 	if ((locku->lu_type < NFS4_READ_LT) || (locku->lu_type > NFS4_WRITEW_LT))
@@ -664,6 +676,7 @@ nfsd4_decode_open(struct nfsd4_compounda
 
 	memset(open->op_bmval, 0, sizeof(open->op_bmval));
 	open->op_iattr.ia_valid = 0;
+	open->op_stateowner = NFS4_STATE_NOT_LOCKED;
 
 	/* seqid, share_access, share_deny, clientid, ownerlen */
 	READ_BUF(16 + sizeof(clientid_t));
@@ -739,6 +752,7 @@ nfsd4_decode_open_confirm(struct nfsd4_c
 {
 	DECODE_HEAD;
 		    
+	open_conf->oc_stateowner = NFS4_STATE_NOT_LOCKED;
 	READ_BUF(4 + sizeof(stateid_t));
 	READ32(open_conf->oc_req_stateid.si_generation);
 	COPYMEM(&open_conf->oc_req_stateid.si_opaque, sizeof(stateid_opaque_t));
@@ -752,6 +766,7 @@ nfsd4_decode_open_downgrade(struct nfsd4
 {
 	DECODE_HEAD;
 		    
+	open_down->od_stateowner = NFS4_STATE_NOT_LOCKED;
 	READ_BUF(4 + sizeof(stateid_t));
 	READ32(open_down->od_stateid.si_generation);
 	COPYMEM(&open_down->od_stateid.si_opaque, sizeof(stateid_opaque_t));
@@ -1252,7 +1267,8 @@ nfsd4_decode_compound(struct nfsd4_compo
  */
 
 #define ENCODE_SEQID_OP_TAIL(stateowner) do {			\
-	if (seqid_mutating_err(nfserr) && stateowner) {		\
+	if (seqid_mutating_err(nfserr) && stateowner		\
+	    && (stateowner != NFS4_STATE_NOT_LOCKED)) { 	\
 		if (stateowner->so_confirmed)			\
 			stateowner->so_seqid++;			\
 		stateowner->so_replay.rp_status = nfserr;   	\
@@ -1260,7 +1276,10 @@ nfsd4_decode_compound(struct nfsd4_compo
 			  (((char *)(resp)->p - (char *)save)); \
 		memcpy(stateowner->so_replay.rp_buf, save,      \
  			stateowner->so_replay.rp_buflen); 	\
-	} } while(0)
+	}							\
+	if (stateowner != NFS4_STATE_NOT_LOCKED)		\
+		nfs4_unlock_state();				\
+	} while (0);
 
 
 static u32 nfs4_ftypes[16] = {
@@ -1588,7 +1607,18 @@ nfsd4_encode_fattr(struct svc_fh *fhp, s
 		WRITE32(stat.mtime.tv_sec);
 		WRITE32(stat.mtime.tv_nsec);
 	}
+	if (bmval1 & FATTR4_WORD1_MOUNTED_ON_FILEID) {
+		struct dentry *mnt_pnt, *mnt_root;
 
+		if ((buflen -= 8) < 0)
+                	goto out_resource;
+		mnt_root = exp->ex_mnt->mnt_root;
+		if (mnt_root->d_inode == dentry->d_inode) {
+			mnt_pnt = exp->ex_mnt->mnt_mountpoint;
+			WRITE64((u64) mnt_pnt->d_inode->i_ino);
+		} else
+                	WRITE64((u64) stat.ino);
+	}
 	*attrlenp = htonl((char *)p - (char *)attrlenp - 4);
 	*countp = p - buffer;
 	status = nfs_ok;
@@ -1899,7 +1929,7 @@ nfsd4_encode_open(struct nfsd4_compoundr
 	ENCODE_SEQID_OP_HEAD;
 
 	if (nfserr)
-		return;
+		goto out;
 
 	RESERVE_SPACE(36 + sizeof(stateid_t));
 	WRITE32(open->op_stateid.si_generation);
@@ -1954,7 +1984,7 @@ nfsd4_encode_open(struct nfsd4_compoundr
 		BUG();
 	}
 	/* XXX save filehandle here */
-
+out:
 	ENCODE_SEQID_OP_TAIL(open->op_stateowner);
 }
 
@@ -2161,6 +2191,8 @@ nfsd4_encode_readdir(struct nfsd4_compou
 	    readdir->common.err == nfserr_toosmall &&
 	    readdir->buffer == page) 
 		nfserr = nfserr_toosmall;
+	if (nfserr == nfserr_symlink)
+		nfserr = nfserr_notdir;
 	if (nfserr)
 		goto err_no_verf;
 
@@ -2277,14 +2309,8 @@ nfsd4_encode_operation(struct nfsd4_comp
 
 	RESERVE_SPACE(8);
 	WRITE32(op->opnum);
-	if ((op->opnum != OP_SETATTR) && (op->opnum != OP_LOCK) && (op->opnum != OP_LOCKT) && (op->opnum != OP_SETCLIENTID) && (op->status)) {
-		*p++ = op->status;
-		ADJUST_ARGS();
-		return;
-	} else {
-		statp = p++;        /* to be backfilled at the end */
-		ADJUST_ARGS();
-	}
+	statp = p++;	/* to be backfilled at the end */
+	ADJUST_ARGS();
 
 	switch (op->opnum) {
 	case OP_ACCESS:
@@ -2388,6 +2414,8 @@ nfsd4_encode_operation(struct nfsd4_comp
  * 
  * XDR note: do not encode rp->rp_buflen: the buffer contains the
  * previously sent already encoded operation.
+ *
+ * called with nfs4_lock_state() held
  */
 void
 nfsd4_encode_replay(struct nfsd4_compoundres *resp, struct nfsd4_op *op)
@@ -2405,6 +2433,7 @@ nfsd4_encode_replay(struct nfsd4_compoun
 	RESERVE_SPACE(rp->rp_buflen);
 	WRITEMEM(rp->rp_buf, rp->rp_buflen);
 	ADJUST_ARGS();
+	nfs4_unlock_state();
 }
 
 /*
--- diff/fs/ntfs/aops.c	2003-08-26 10:00:54.000000000 +0100
+++ source/fs/ntfs/aops.c	2004-04-21 10:45:35.767266048 +0100
@@ -743,7 +743,7 @@ lock_retry_remap:
 	}
 
 	BUG_ON(PageWriteback(page));
-	SetPageWriteback(page);		/* Keeps try_to_free_buffers() away. */
+	set_page_writeback(page);	/* Keeps try_to_free_buffers() away. */
 	unlock_page(page);
 
 	/*
@@ -885,7 +885,7 @@ static int ntfs_writepage(struct page *p
 	// FIXME: Make sure it is ok to SetPageError() on unlocked page under
 	// writeback before doing the change!
 #if 0
-	SetPageWriteback(page);
+	set_page_writeback(page);
 	unlock_page(page);
 #endif
 
@@ -1340,8 +1340,6 @@ err_out:
 			void *kaddr;
 
 			clear_buffer_new(bh);
-			if (buffer_uptodate(bh))
-				buffer_error();
 			kaddr = kmap_atomic(page, KM_USER0);
 			memset(kaddr + block_start, 0, bh->b_size);
 			kunmap_atomic(kaddr, KM_USER0);
--- diff/fs/ntfs/compress.c	2003-08-26 10:00:54.000000000 +0100
+++ source/fs/ntfs/compress.c	2004-04-21 10:45:35.768265896 +0100
@@ -23,6 +23,7 @@
 
 #include <linux/fs.h>
 #include <linux/buffer_head.h>
+#include <linux/blkdev.h>
 
 #include "ntfs.h"
 
@@ -668,7 +669,7 @@ lock_retry_remap:
 					"uptodate! Unplugging the disk queue "
 					"and rescheduling.");
 			get_bh(tbh);
-			blk_run_queues();
+			blk_run_address_space(mapping);
 			schedule();
 			put_bh(tbh);
 			if (unlikely(!buffer_uptodate(tbh)))
--- diff/fs/open.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/open.c	2004-04-21 10:45:35.769265744 +0100
@@ -57,10 +57,19 @@ static int vfs_statfs_native(struct supe
 		memcpy(buf, &st, sizeof(st));
 	else {
 		if (sizeof buf->f_blocks == 4) {
-			if ((st.f_blocks | st.f_bfree |
-			     st.f_bavail | st.f_files | st.f_ffree) &
+			if ((st.f_blocks | st.f_bfree | st.f_bavail) &
 			    0xffffffff00000000ULL)
 				return -EOVERFLOW;
+			/*
+			 * f_files and f_ffree may be -1; it's okay to stuff
+			 * that into 32 bits
+			 */
+			if (st.f_files != -1 &&
+			    (st.f_files & 0xffffffff00000000ULL))
+				return -EOVERFLOW;
+			if (st.f_ffree != -1 &&
+			    (st.f_ffree & 0xffffffff00000000ULL))
+				return -EOVERFLOW;
 		}
 
 		buf->f_type = st.f_type;
@@ -192,7 +201,9 @@ int do_truncate(struct dentry *dentry, l
 	newattrs.ia_size = length;
 	newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
 	down(&dentry->d_inode->i_sem);
+	down_write(&dentry->d_inode->i_alloc_sem);
 	err = notify_change(dentry, &newattrs);
+	up_write(&dentry->d_inode->i_alloc_sem);
 	up(&dentry->d_inode->i_sem);
 	return err;
 }
@@ -1037,7 +1048,7 @@ EXPORT_SYMBOL(sys_close);
 asmlinkage long sys_vhangup(void)
 {
 	if (capable(CAP_SYS_TTY_CONFIG)) {
-		tty_vhangup(current->tty);
+		tty_vhangup(current->signal->tty);
 		return 0;
 	}
 	return -EPERM;
--- diff/fs/openpromfs/inode.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/openpromfs/inode.c	2004-04-21 10:45:35.769265744 +0100
@@ -1018,16 +1018,23 @@ static void openprom_read_inode(struct i
 	}
 }
 
+static int openprom_remount(struct super_block *sb, int *flags, char *data)
+{
+	*flags |= MS_NOATIME;
+	return 0;
+}
+
 static struct super_operations openprom_sops = { 
 	.read_inode	= openprom_read_inode,
 	.statfs		= simple_statfs,
+	.remount_fs	= openprom_remount,
 };
 
 static int openprom_fill_super(struct super_block *s, void *data, int silent)
 {
 	struct inode * root_inode;
 
-	s->s_flags |= MS_NODIRATIME;
+	s->s_flags |= MS_NOATIME;
 	s->s_blocksize = 1024;
 	s->s_blocksize_bits = 10;
 	s->s_magic = OPENPROM_SUPER_MAGIC;
--- diff/fs/proc/array.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/proc/array.c	2004-04-21 10:45:35.770265592 +0100
@@ -162,13 +162,13 @@ static inline char * task_state(struct t
 		"Uid:\t%d\t%d\t%d\t%d\n"
 		"Gid:\t%d\t%d\t%d\t%d\n",
 		get_task_state(p),
-		(p->sleep_avg/1024)*100/(1000000000/1024),
+		(p->sleep_avg/1024)*100/(1020000000/1024),
 	       	p->tgid,
 		p->pid, p->pid ? p->real_parent->pid : 0,
 		p->pid && p->ptrace ? p->parent->pid : 0,
 		p->uid, p->euid, p->suid, p->fsuid,
 		p->gid, p->egid, p->sgid, p->fsgid);
-	read_unlock(&tasklist_lock);	
+	read_unlock(&tasklist_lock);
 	task_lock(p);
 	buffer += sprintf(buffer,
 		"FDSize:\t%d\n"
@@ -301,7 +301,7 @@ int proc_pid_stat(struct task_struct *ta
 	sigset_t sigign, sigcatch;
 	char state;
 	int res;
-	pid_t ppid;
+ 	pid_t ppid, pgid = -1, sid = -1;
 	int num_threads = 0;
 	struct mm_struct *mm;
 
@@ -311,10 +311,6 @@ int proc_pid_stat(struct task_struct *ta
 	mm = task->mm;
 	if(mm)
 		mm = mmgrab(mm);
-	if (task->tty) {
-		tty_pgrp = task->tty->pgrp;
-		tty_nr = new_encode_dev(tty_devnum(task->tty));
-	}
 	task_unlock(task);
 	if (mm) {
 		down_read(&mm->mmap_sem);
@@ -335,7 +331,15 @@ int proc_pid_stat(struct task_struct *ta
 		collect_sigign_sigcatch(task, &sigign, &sigcatch);
 		spin_unlock_irq(&task->sighand->siglock);
 	}
-	read_unlock(&tasklist_lock);		
+	if (task->signal) {
+		if (task->signal->tty) {
+			tty_pgrp = task->signal->tty->pgrp;
+			tty_nr = new_encode_dev(tty_devnum(task->signal->tty));
+		}
+		pgid = process_group(task);
+		sid = task->signal->session;
+	}
+	read_unlock(&tasklist_lock);
 
 	/* scale priority and nice values from timeslices to -20..20 */
 	/* to make it look like a "normal" Unix priority/nice value  */
@@ -352,8 +356,8 @@ int proc_pid_stat(struct task_struct *ta
 		task->comm,
 		state,
 		ppid,
-		process_group(task),
-		task->session,
+		pgid,
+		sid,
 		tty_nr,
 		tty_pgrp,
 		task->flags,
@@ -388,8 +392,8 @@ int proc_pid_stat(struct task_struct *ta
 		sigign      .sig[0] & 0x7fffffffUL,
 		sigcatch    .sig[0] & 0x7fffffffUL,
 		wchan,
-		task->nswap,
-		task->cnswap,
+		0UL,
+		0UL,
 		task->exit_signal,
 		task_cpu(task),
 		task->rt_priority,
--- diff/fs/proc/base.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/proc/base.c	2004-04-21 10:45:35.771265440 +0100
@@ -189,11 +189,7 @@ static int proc_fd_link(struct inode *in
 	struct file *file;
 	int fd = proc_type(inode) - PROC_TID_FD_DIR;
 
-	task_lock(task);
-	files = task->files;
-	if (files)
-		atomic_inc(&files->count);
-	task_unlock(task);
+	files = get_files_struct(task);
 	if (files) {
 		spin_lock(&files->file_lock);
 		file = fcheck_files(files, fd);
@@ -806,11 +802,7 @@ static int proc_readfd(struct file * fil
 				goto out;
 			filp->f_pos++;
 		default:
-			task_lock(p);
-			files = p->files;
-			if (files)
-				atomic_inc(&files->count);
-			task_unlock(p);
+			files = get_files_struct(p);
 			if (!files)
 				goto out;
 			spin_lock(&files->file_lock);
@@ -1009,11 +1001,7 @@ static int tid_fd_revalidate(struct dent
 	int fd = proc_type(inode) - PROC_TID_FD_DIR;
 	struct files_struct *files;
 
-	task_lock(task);
-	files = task->files;
-	if (files)
-		atomic_inc(&files->count);
-	task_unlock(task);
+	files = get_files_struct(task);
 	if (files) {
 		spin_lock(&files->file_lock);
 		if (fcheck_files(files, fd)) {
@@ -1117,11 +1105,7 @@ static struct dentry *proc_lookupfd(stru
 	if (!inode)
 		goto out;
 	ei = PROC_I(inode);
-	task_lock(task);
-	files = task->files;
-	if (files)
-		atomic_inc(&files->count);
-	task_unlock(task);
+	files = get_files_struct(task);
 	if (!files)
 		goto out_unlock;
 	inode->i_mode = S_IFLNK;
--- diff/fs/proc/generic.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/proc/generic.c	2004-04-21 10:45:35.771265440 +0100
@@ -15,6 +15,8 @@
 #include <linux/module.h>
 #include <linux/mount.h>
 #include <linux/smp_lock.h>
+#include <linux/init.h>
+#include <linux/idr.h>
 #include <asm/uaccess.h>
 #include <asm/bitops.h>
 
@@ -275,24 +277,46 @@ static int xlate_proc_name(const char *n
 	return 0;
 }
 
-static unsigned long proc_alloc_map[(PROC_NDYNAMIC + BITS_PER_LONG - 1) / BITS_PER_LONG];
+static DEFINE_IDR(proc_inum_idr);
+static spinlock_t proc_inum_lock = SPIN_LOCK_UNLOCKED; /* protects the above */
 
-spinlock_t proc_alloc_map_lock = SPIN_LOCK_UNLOCKED;
+#define PROC_DYNAMIC_FIRST 0xF0000000UL
 
-static int make_inode_number(void)
+/*
+ * Return an inode number between PROC_DYNAMIC_FIRST and
+ * 0xffffffff, or zero on failure.
+ */
+static unsigned int get_inode_number(void)
 {
-	int i;
-	spin_lock(&proc_alloc_map_lock);
-	i = find_first_zero_bit(proc_alloc_map, PROC_NDYNAMIC);
-	if (i < 0 || i >= PROC_NDYNAMIC) {
-		i = -1;
-		goto out;
-	}
-	set_bit(i, proc_alloc_map);
-	i += PROC_DYNAMIC_FIRST;
-out:
-	spin_unlock(&proc_alloc_map_lock);
-	return i;
+	unsigned int i, inum = 0;
+
+retry:
+	if (idr_pre_get(&proc_inum_idr, GFP_KERNEL) == 0)
+		return 0;
+
+	spin_lock(&proc_inum_lock);
+	i = idr_get_new(&proc_inum_idr, NULL);
+	spin_unlock(&proc_inum_lock);
+
+	if (i == -1)
+		goto retry;
+
+	inum = (i & MAX_ID_MASK) + PROC_DYNAMIC_FIRST;
+
+	/* inum will never be more than 0xf0ffffff, so no check
+	 * for overflow.
+	 */
+
+	return inum;
+}
+
+static void release_inode_number(unsigned int inum)
+{
+	int id = (inum - PROC_DYNAMIC_FIRST) | ~MAX_ID_MASK;
+
+	spin_lock(&proc_inum_lock);
+	idr_remove(&proc_inum_idr, id);
+	spin_unlock(&proc_inum_lock);
 }
 
 static int
@@ -346,7 +370,8 @@ struct dentry *proc_lookup(struct inode 
 			if (de->namelen != dentry->d_name.len)
 				continue;
 			if (!memcmp(dentry->d_name.name, de->name, de->namelen)) {
-				int ino = de->low_ino;
+				unsigned int ino = de->low_ino;
+
 				error = -EINVAL;
 				inode = proc_get_inode(dir->i_sb, ino, de);
 				break;
@@ -452,10 +477,10 @@ static struct inode_operations proc_dir_
 
 static int proc_register(struct proc_dir_entry * dir, struct proc_dir_entry * dp)
 {
-	int	i;
+	unsigned int i;
 	
-	i = make_inode_number();
-	if (i < 0)
+	i = get_inode_number();
+	if (i == 0)
 		return -EAGAIN;
 	dp->low_ino = i;
 	dp->next = dir->subdir;
@@ -621,11 +646,13 @@ struct proc_dir_entry *create_proc_entry
 
 void free_proc_entry(struct proc_dir_entry *de)
 {
-	int ino = de->low_ino;
+	unsigned int ino = de->low_ino;
 
-	if (ino < PROC_DYNAMIC_FIRST ||
-	    ino >= PROC_DYNAMIC_FIRST+PROC_NDYNAMIC)
+	if (ino < PROC_DYNAMIC_FIRST)
 		return;
+
+	release_inode_number(ino);
+
 	if (S_ISLNK(de->mode) && de->data)
 		kfree(de->data);
 	kfree(de);
@@ -653,8 +680,6 @@ void remove_proc_entry(const char *name,
 		de->next = NULL;
 		if (S_ISDIR(de->mode))
 			parent->nlink--;
-		clear_bit(de->low_ino - PROC_DYNAMIC_FIRST,
-			  proc_alloc_map);
 		proc_kill_inodes(de);
 		de->nlink = 0;
 		WARN_ON(de->subdir);
--- diff/fs/proc/inode-alloc.txt	2002-10-16 04:27:54.000000000 +0100
+++ source/fs/proc/inode-alloc.txt	2004-04-21 10:45:35.772265288 +0100
@@ -4,9 +4,10 @@ Current inode allocations in the proc-fs
   00000001-00000fff	static entries	(goners)
        001		root-ino
 
-  00001000-00001fff	dynamic entries
+  00001000-00001fff	unused
   0001xxxx-7fffxxxx	pid-dir entries for pid 1-7fff
-  80000000-ffffffff	unused
+  80000000-efffffff	unused
+  f0000000-ffffffff	dynamic entries
 
 Goal:
 	a) once we'll split the thing into several virtual filesystems we
--- diff/fs/proc/inode.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/proc/inode.c	2004-04-21 10:45:35.772265288 +0100
@@ -127,6 +127,12 @@ int __init proc_init_inodecache(void)
 	return 0;
 }
 
+static int proc_remount(struct super_block *sb, int *flags, char *data)
+{
+	*flags |= MS_NODIRATIME;
+	return 0;
+}
+
 static struct super_operations proc_sops = { 
 	.alloc_inode	= proc_alloc_inode,
 	.destroy_inode	= proc_destroy_inode,
@@ -134,6 +140,7 @@ static struct super_operations proc_sops
 	.drop_inode	= generic_delete_inode,
 	.delete_inode	= proc_delete_inode,
 	.statfs		= simple_statfs,
+	.remount_fs	= proc_remount,
 };
 
 enum {
@@ -181,8 +188,8 @@ static int parse_options(char *options,u
 	return 1;
 }
 
-struct inode * proc_get_inode(struct super_block * sb, int ino,
-				struct proc_dir_entry * de)
+struct inode *proc_get_inode(struct super_block *sb, unsigned int ino,
+				struct proc_dir_entry *de)
 {
 	struct inode * inode;
 
@@ -190,11 +197,8 @@ struct inode * proc_get_inode(struct sup
 	 * Increment the use count so the dir entry can't disappear.
 	 */
 	de_get(de);
-#if 1
-/* shouldn't ever happen */
-if (de && de->deleted)
-printk("proc_iget: using deleted entry %s, count=%d\n", de->name, atomic_read(&de->count));
-#endif
+
+	WARN_ON(de && de->deleted);
 
 	inode = iget(sb, ino);
 	if (!inode)
--- diff/fs/proc/proc_tty.c	2004-01-19 10:22:59.000000000 +0000
+++ source/fs/proc/proc_tty.c	2004-04-21 10:45:35.772265288 +0100
@@ -181,7 +181,7 @@ static int tty_ldiscs_read_proc(char *pa
 }
 
 /*
- * Thsi function is called by register_tty_driver() to handle
+ * This function is called by tty_register_driver() to handle
  * registering the driver's /proc handler into /proc/tty/driver/<foo>
  */
 void proc_tty_register_driver(struct tty_driver *driver)
@@ -205,7 +205,7 @@ void proc_tty_register_driver(struct tty
 }
 
 /*
- * This function is called by unregister_tty_driver()
+ * This function is called by tty_unregister_driver()
  */
 void proc_tty_unregister_driver(struct tty_driver *driver)
 {
--- diff/fs/qnx4/inode.c	2003-06-30 10:07:34.000000000 +0100
+++ source/fs/qnx4/inode.c	2004-04-21 10:45:35.773265136 +0100
@@ -149,9 +149,13 @@ static int qnx4_remount(struct super_blo
 
 	qs = qnx4_sb(sb);
 	qs->Version = QNX4_VERSION;
+#ifndef CONFIG_QNX4FS_RW
+	*flags |= MS_RDONLY;
+#endif
 	if (*flags & MS_RDONLY) {
 		return 0;
 	}
+
 	mark_buffer_dirty(qs->sb_buf);
 
 	return 0;
--- diff/fs/quota_v1.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/quota_v1.c	2004-04-21 10:45:35.773265136 +0100
@@ -60,7 +60,7 @@ static int v1_read_dqblk(struct dquot *d
 	v1_disk2mem_dqblk(&dquot->dq_dqb, &dqblk);
 	if (dquot->dq_dqb.dqb_bhardlimit == 0 && dquot->dq_dqb.dqb_bsoftlimit == 0 &&
 	    dquot->dq_dqb.dqb_ihardlimit == 0 && dquot->dq_dqb.dqb_isoftlimit == 0)
-		dquot->dq_flags |= DQ_FAKE;
+		set_bit(DQ_FAKE_B, &dquot->dq_flags);
 	dqstats.reads++;
 
 	return 0;
@@ -80,12 +80,7 @@ static int v1_commit_dqblk(struct dquot 
 	fs = get_fs();
 	set_fs(KERNEL_DS);
 
-	/*
-	 * Note: clear the DQ_MOD flag unconditionally,
-	 * so we don't loop forever on failure.
-	 */
 	v1_mem2disk_dqblk(&dqblk, &dquot->dq_dqb);
-	dquot->dq_flags &= ~DQ_MOD;
 	if (dquot->dq_id == 0) {
 		dqblk.dqb_btime = sb_dqopt(dquot->dq_sb)->info[type].dqi_bgrace;
 		dqblk.dqb_itime = sb_dqopt(dquot->dq_sb)->info[type].dqi_igrace;
--- diff/fs/quota_v2.c	2003-05-21 11:50:00.000000000 +0100
+++ source/fs/quota_v2.c	2004-04-21 10:45:35.775264832 +0100
@@ -65,7 +65,7 @@ static int v2_read_file_info(struct supe
 	set_fs(fs);
 	if (size != sizeof(struct v2_disk_dqinfo)) {
 		printk(KERN_WARNING "Can't read info structure on device %s.\n",
-			f->f_vfsmnt->mnt_sb->s_id);
+			f->f_dentry->d_sb->s_id);
 		return -1;
 	}
 	info->dqi_bgrace = le32_to_cpu(dinfo.dqi_bgrace);
@@ -87,10 +87,12 @@ static int v2_write_file_info(struct sup
 	ssize_t size;
 	loff_t offset = V2_DQINFOOFF;
 
+	spin_lock(&dq_data_lock);
 	info->dqi_flags &= ~DQF_INFO_DIRTY;
 	dinfo.dqi_bgrace = cpu_to_le32(info->dqi_bgrace);
 	dinfo.dqi_igrace = cpu_to_le32(info->dqi_igrace);
 	dinfo.dqi_flags = cpu_to_le32(info->dqi_flags & DQF_MASK);
+	spin_unlock(&dq_data_lock);
 	dinfo.dqi_blocks = cpu_to_le32(info->u.v2_i.dqi_blocks);
 	dinfo.dqi_free_blk = cpu_to_le32(info->u.v2_i.dqi_free_blk);
 	dinfo.dqi_free_entry = cpu_to_le32(info->u.v2_i.dqi_free_entry);
@@ -100,7 +102,7 @@ static int v2_write_file_info(struct sup
 	set_fs(fs);
 	if (size != sizeof(struct v2_disk_dqinfo)) {
 		printk(KERN_WARNING "Can't write info structure on device %s.\n",
-			f->f_vfsmnt->mnt_sb->s_id);
+			f->f_dentry->d_sb->s_id);
 		return -1;
 	}
 	return 0;
@@ -173,9 +175,10 @@ static ssize_t write_blk(struct file *fi
 }
 
 /* Remove empty block from list and return it */
-static int get_free_dqblk(struct file *filp, struct mem_dqinfo *info)
+static int get_free_dqblk(struct file *filp, int type)
 {
 	dqbuf_t buf = getdqbuf();
+	struct mem_dqinfo *info = sb_dqinfo(filp->f_dentry->d_sb, type);
 	struct v2_disk_dqdbheader *dh = (struct v2_disk_dqdbheader *)buf;
 	int ret, blk;
 
@@ -193,7 +196,7 @@ static int get_free_dqblk(struct file *f
 			goto out_buf;
 		blk = info->u.v2_i.dqi_blocks++;
 	}
-	mark_info_dirty(info);
+	mark_info_dirty(filp->f_dentry->d_sb, type);
 	ret = blk;
 out_buf:
 	freedqbuf(buf);
@@ -201,8 +204,9 @@ out_buf:
 }
 
 /* Insert empty block to the list */
-static int put_free_dqblk(struct file *filp, struct mem_dqinfo *info, dqbuf_t buf, uint blk)
+static int put_free_dqblk(struct file *filp, int type, dqbuf_t buf, uint blk)
 {
+	struct mem_dqinfo *info = sb_dqinfo(filp->f_dentry->d_sb, type);
 	struct v2_disk_dqdbheader *dh = (struct v2_disk_dqdbheader *)buf;
 	int err;
 
@@ -210,16 +214,17 @@ static int put_free_dqblk(struct file *f
 	dh->dqdh_prev_free = cpu_to_le32(0);
 	dh->dqdh_entries = cpu_to_le16(0);
 	info->u.v2_i.dqi_free_blk = blk;
-	mark_info_dirty(info);
+	mark_info_dirty(filp->f_dentry->d_sb, type);
 	if ((err = write_blk(filp, blk, buf)) < 0)	/* Some strange block. We had better leave it... */
 		return err;
 	return 0;
 }
 
 /* Remove given block from the list of blocks with free entries */
-static int remove_free_dqentry(struct file *filp, struct mem_dqinfo *info, dqbuf_t buf, uint blk)
+static int remove_free_dqentry(struct file *filp, int type, dqbuf_t buf, uint blk)
 {
 	dqbuf_t tmpbuf = getdqbuf();
+	struct mem_dqinfo *info = sb_dqinfo(filp->f_dentry->d_sb, type);
 	struct v2_disk_dqdbheader *dh = (struct v2_disk_dqdbheader *)buf;
 	uint nextblk = le32_to_cpu(dh->dqdh_next_free), prevblk = le32_to_cpu(dh->dqdh_prev_free);
 	int err;
@@ -242,7 +247,7 @@ static int remove_free_dqentry(struct fi
 	}
 	else {
 		info->u.v2_i.dqi_free_entry = nextblk;
-		mark_info_dirty(info);
+		mark_info_dirty(filp->f_dentry->d_sb, type);
 	}
 	freedqbuf(tmpbuf);
 	dh->dqdh_next_free = dh->dqdh_prev_free = cpu_to_le32(0);
@@ -255,9 +260,10 @@ out_buf:
 }
 
 /* Insert given block to the beginning of list with free entries */
-static int insert_free_dqentry(struct file *filp, struct mem_dqinfo *info, dqbuf_t buf, uint blk)
+static int insert_free_dqentry(struct file *filp, int type, dqbuf_t buf, uint blk)
 {
 	dqbuf_t tmpbuf = getdqbuf();
+	struct mem_dqinfo *info = sb_dqinfo(filp->f_dentry->d_sb, type);
 	struct v2_disk_dqdbheader *dh = (struct v2_disk_dqdbheader *)buf;
 	int err;
 
@@ -276,7 +282,7 @@ static int insert_free_dqentry(struct fi
 	}
 	freedqbuf(tmpbuf);
 	info->u.v2_i.dqi_free_entry = blk;
-	mark_info_dirty(info);
+	mark_info_dirty(filp->f_dentry->d_sb, type);
 	return 0;
 out_buf:
 	freedqbuf(tmpbuf);
@@ -307,7 +313,7 @@ static uint find_free_dqentry(struct dqu
 			goto out_buf;
 	}
 	else {
-		blk = get_free_dqblk(filp, info);
+		blk = get_free_dqblk(filp, dquot->dq_type);
 		if ((int)blk < 0) {
 			*err = blk;
 			freedqbuf(buf);
@@ -315,10 +321,10 @@ static uint find_free_dqentry(struct dqu
 		}
 		memset(buf, 0, V2_DQBLKSIZE);
 		info->u.v2_i.dqi_free_entry = blk;	/* This is enough as block is already zeroed and entry list is empty... */
-		mark_info_dirty(info);
+		mark_info_dirty(dquot->dq_sb, dquot->dq_type);
 	}
 	if (le16_to_cpu(dh->dqdh_entries)+1 >= V2_DQSTRINBLK)	/* Block will be full? */
-		if ((*err = remove_free_dqentry(filp, info, buf, blk)) < 0) {
+		if ((*err = remove_free_dqentry(filp, dquot->dq_type, buf, blk)) < 0) {
 			printk(KERN_ERR "VFS: find_free_dqentry(): Can't remove block (%u) from entry free list.\n", blk);
 			goto out_buf;
 		}
@@ -349,7 +355,6 @@ out_buf:
 static int do_insert_tree(struct dquot *dquot, uint *treeblk, int depth)
 {
 	struct file *filp = sb_dqopt(dquot->dq_sb)->files[dquot->dq_type];
-	struct mem_dqinfo *info = sb_dqopt(dquot->dq_sb)->info + dquot->dq_type;
 	dqbuf_t buf;
 	int ret = 0, newson = 0, newact = 0;
 	u32 *ref;
@@ -358,7 +363,7 @@ static int do_insert_tree(struct dquot *
 	if (!(buf = getdqbuf()))
 		return -ENOMEM;
 	if (!*treeblk) {
-		ret = get_free_dqblk(filp, info);
+		ret = get_free_dqblk(filp, dquot->dq_type);
 		if (ret < 0)
 			goto out_buf;
 		*treeblk = ret;
@@ -392,7 +397,7 @@ static int do_insert_tree(struct dquot *
 		ret = write_blk(filp, *treeblk, buf);
 	}
 	else if (newact && ret < 0)
-		put_free_dqblk(filp, info, buf, *treeblk);
+		put_free_dqblk(filp, dquot->dq_type, buf, *treeblk);
 out_buf:
 	freedqbuf(buf);
 	return ret;
@@ -417,6 +422,7 @@ static int v2_write_dquot(struct dquot *
 	ssize_t ret;
 	struct v2_disk_dqblk ddquot;
 
+	/* dq_off is guarded by dqio_sem */
 	if (!dquot->dq_off)
 		if ((ret = dq_insert_tree(dquot)) < 0) {
 			printk(KERN_ERR "VFS: Error %Zd occurred while creating quota.\n", ret);
@@ -424,7 +430,9 @@ static int v2_write_dquot(struct dquot *
 		}
 	filp = sb_dqopt(dquot->dq_sb)->files[type];
 	offset = dquot->dq_off;
+	spin_lock(&dq_data_lock);
 	mem2diskdqb(&ddquot, &dquot->dq_dqb, dquot->dq_id);
+	spin_unlock(&dq_data_lock);
 	fs = get_fs();
 	set_fs(KERNEL_DS);
 	ret = filp->f_op->write(filp, (char *)&ddquot, sizeof(struct v2_disk_dqblk), &offset);
@@ -445,7 +453,6 @@ static int v2_write_dquot(struct dquot *
 static int free_dqentry(struct dquot *dquot, uint blk)
 {
 	struct file *filp = sb_dqopt(dquot->dq_sb)->files[dquot->dq_type];
-	struct mem_dqinfo *info = sb_dqopt(dquot->dq_sb)->info + dquot->dq_type;
 	struct v2_disk_dqdbheader *dh;
 	dqbuf_t buf = getdqbuf();
 	int ret = 0;
@@ -463,8 +470,8 @@ static int free_dqentry(struct dquot *dq
 	dh = (struct v2_disk_dqdbheader *)buf;
 	dh->dqdh_entries = cpu_to_le16(le16_to_cpu(dh->dqdh_entries)-1);
 	if (!le16_to_cpu(dh->dqdh_entries)) {	/* Block got free? */
-		if ((ret = remove_free_dqentry(filp, info, buf, blk)) < 0 ||
-		    (ret = put_free_dqblk(filp, info, buf, blk)) < 0) {
+		if ((ret = remove_free_dqentry(filp, dquot->dq_type, buf, blk)) < 0 ||
+		    (ret = put_free_dqblk(filp, dquot->dq_type, buf, blk)) < 0) {
 			printk(KERN_ERR "VFS: Can't move quota data block (%u) to free list.\n", blk);
 			goto out_buf;
 		}
@@ -473,7 +480,7 @@ static int free_dqentry(struct dquot *dq
 		memset(buf+(dquot->dq_off & ((1 << V2_DQBLKSIZE_BITS)-1)), 0, sizeof(struct v2_disk_dqblk));
 		if (le16_to_cpu(dh->dqdh_entries) == V2_DQSTRINBLK-1) {
 			/* Insert will write block itself */
-			if ((ret = insert_free_dqentry(filp, info, buf, blk)) < 0) {
+			if ((ret = insert_free_dqentry(filp, dquot->dq_type, buf, blk)) < 0) {
 				printk(KERN_ERR "VFS: Can't insert quota data block (%u) to free entry list.\n", blk);
 				goto out_buf;
 			}
@@ -494,7 +501,6 @@ out_buf:
 static int remove_tree(struct dquot *dquot, uint *blk, int depth)
 {
 	struct file *filp = sb_dqopt(dquot->dq_sb)->files[dquot->dq_type];
-	struct mem_dqinfo *info = sb_dqopt(dquot->dq_sb)->info + dquot->dq_type;
 	dqbuf_t buf = getdqbuf();
 	int ret = 0;
 	uint newblk;
@@ -518,7 +524,7 @@ static int remove_tree(struct dquot *dqu
 		ref[GETIDINDEX(dquot->dq_id, depth)] = cpu_to_le32(0);
 		for (i = 0; i < V2_DQBLKSIZE && !buf[i]; i++);	/* Block got empty? */
 		if (i == V2_DQBLKSIZE) {
-			put_free_dqblk(filp, info, buf, *blk);
+			put_free_dqblk(filp, dquot->dq_type, buf, *blk);
 			*blk = 0;
 		}
 		else
@@ -632,7 +638,7 @@ static int v2_read_dquot(struct dquot *d
 		if (offset < 0)
 			printk(KERN_ERR "VFS: Can't read quota structure for id %u.\n", dquot->dq_id);
 		dquot->dq_off = 0;
-		dquot->dq_flags |= DQ_FAKE;
+		set_bit(DQ_FAKE_B, &dquot->dq_flags);
 		memset(&dquot->dq_dqb, 0, sizeof(struct mem_dqblk));
 		ret = offset;
 	}
@@ -650,21 +656,24 @@ static int v2_read_dquot(struct dquot *d
 			ret = 0;
 		set_fs(fs);
 		disk2memdqb(&dquot->dq_dqb, &ddquot);
+		if (!dquot->dq_dqb.dqb_bhardlimit &&
+			!dquot->dq_dqb.dqb_bsoftlimit &&
+			!dquot->dq_dqb.dqb_ihardlimit &&
+			!dquot->dq_dqb.dqb_isoftlimit)
+			set_bit(DQ_FAKE_B, &dquot->dq_flags);
 	}
 	dqstats.reads++;
 
 	return ret;
 }
 
-/* Commit changes of dquot to disk - it might also mean deleting it when quota became fake one and user has no blocks... */
-static int v2_commit_dquot(struct dquot *dquot)
+/* Check whether dquot should not be deleted. We know we are
+ * the only one operating on dquot (thanks to dq_lock) */
+static int v2_release_dquot(struct dquot *dquot)
 {
-	/* We clear the flag everytime so we don't loop when there was an IO error... */
-	dquot->dq_flags &= ~DQ_MOD;
-	if (dquot->dq_flags & DQ_FAKE && !(dquot->dq_dqb.dqb_curinodes | dquot->dq_dqb.dqb_curspace))
+	if (test_bit(DQ_FAKE_B, &dquot->dq_flags) && !(dquot->dq_dqb.dqb_curinodes | dquot->dq_dqb.dqb_curspace))
 		return v2_delete_dquot(dquot);
-	else
-		return v2_write_dquot(dquot);
+	return 0;
 }
 
 static struct quota_format_ops v2_format_ops = {
@@ -673,7 +682,8 @@ static struct quota_format_ops v2_format
 	.write_file_info	= v2_write_file_info,
 	.free_file_info		= NULL,
 	.read_dqblk		= v2_read_dquot,
-	.commit_dqblk		= v2_commit_dquot,
+	.commit_dqblk		= v2_write_dquot,
+	.release_dqblk		= v2_release_dquot,
 };
 
 static struct quota_format_type v2_quota_format = {
--- diff/fs/read_write.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/read_write.c	2004-04-21 10:45:35.775264832 +0100
@@ -412,13 +412,13 @@ static ssize_t do_readv_writev(int type,
 	 */
 	tot_len = 0;
 	ret = -EINVAL;
-	for (seg = 0 ; seg < nr_segs; seg++) {
-		ssize_t tmp = tot_len;
+	for (seg = 0; seg < nr_segs; seg++) {
 		ssize_t len = (ssize_t)iov[seg].iov_len;
+
 		if (len < 0)	/* size_t not fitting an ssize_t .. */
 			goto out;
 		tot_len += len;
-		if (tot_len < tmp) /* maths overflow on the ssize_t */
+		if ((ssize_t)tot_len < 0) /* maths overflow on the ssize_t */
 			goto out;
 	}
 	if (tot_len == 0) {
@@ -635,7 +635,7 @@ asmlinkage ssize_t sys_sendfile(int out_
 		return ret;
 	}
 
-	return do_sendfile(out_fd, in_fd, NULL, count, MAX_NON_LFS);
+	return do_sendfile(out_fd, in_fd, NULL, count, 0);
 }
 
 asmlinkage ssize_t sys_sendfile64(int out_fd, int in_fd, loff_t __user *offset, size_t count)
--- diff/fs/reiserfs/do_balan.c	2003-08-20 14:16:33.000000000 +0100
+++ source/fs/reiserfs/do_balan.c	2004-04-21 10:45:35.776264680 +0100
@@ -30,34 +30,11 @@ struct tree_balance * cur_tb = NULL; /* 
                                         is interrupting do_balance */
 #endif
 
-/*
- * AKPM: The __mark_buffer_dirty() call here will not
- * put the buffer on the dirty buffer LRU because we've just
- * set BH_Dirty.  That's a thinko in reiserfs.
- *
- * I'm reluctant to "fix" this bug because that would change
- * behaviour.  Using mark_buffer_dirty() here would make the
- * buffer eligible for VM and periodic writeback, which may
- * violate ordering constraints.  I'll just leave the code
- * as-is by removing the __mark_buffer_dirty call altogether.
- *
- * Chris says this code has "probably never been run" anyway.
- * It is due to go away.
- */
-
 inline void do_balance_mark_leaf_dirty (struct tree_balance * tb, 
 					struct buffer_head * bh, int flag)
 {
-    if (reiserfs_dont_log(tb->tb_sb)) {
-	if (!test_set_buffer_dirty(bh)) {
-//	    __mark_buffer_dirty(bh) ;
-	    tb->need_balance_dirty = 1;
-	}
-    } else {
-	int windex = push_journal_writer("do_balance") ;
-	journal_mark_dirty(tb->transaction_handle, tb->transaction_handle->t_super, bh) ;
-	pop_journal_writer(windex) ;
-    }
+    journal_mark_dirty(tb->transaction_handle,
+                       tb->transaction_handle->t_super, bh) ;
 }
 
 #define do_balance_mark_internal_dirty do_balance_mark_leaf_dirty
--- diff/fs/reiserfs/file.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/reiserfs/file.c	2004-04-21 10:45:35.778264376 +0100
@@ -9,6 +9,8 @@
 #include <asm/uaccess.h>
 #include <linux/pagemap.h>
 #include <linux/writeback.h>
+#include <linux/blkdev.h>
+#include <linux/buffer_head.h>
 
 /*
 ** We pack the tails of files on file close, not at the time they are written.
@@ -29,7 +31,6 @@ static int reiserfs_file_release (struct
 {
 
     struct reiserfs_transaction_handle th ;
-    int windex ;
 
     if (!S_ISREG (inode->i_mode))
 	BUG ();
@@ -59,9 +60,7 @@ static int reiserfs_file_release (struct
 	   appended (we append by unformatted node only) or its direct
 	   item(s) had to be converted, then it may have to be
 	   indirect2direct converted */
-	windex = push_journal_writer("file_release") ;
 	reiserfs_truncate_file(inode, 0) ;
-	pop_journal_writer(windex) ;
     }
     up (&inode->i_sem); 
     reiserfs_write_unlock(inode->i_sb);
@@ -153,6 +152,7 @@ out:
    Maps all unmapped but prepared pages from the list.
    Updates metadata with newly allocated blocknumbers as needed */
 int reiserfs_allocate_blocks_for_region(
+				struct reiserfs_transaction_handle *th,
 				struct inode *inode, /* Inode we work with */
 				loff_t pos, /* Writing position */
 				int num_pages, /* number of pages write going
@@ -170,7 +170,6 @@ int reiserfs_allocate_blocks_for_region(
     struct cpu_key key; // cpu key of item that we are going to deal with
     struct item_head *ih; // pointer to item head that we are going to deal with
     struct buffer_head *bh; // Buffer head that contains items that we are going to deal with
-    struct reiserfs_transaction_handle th; // transaction handle for transaction we are going to create.
     __u32 * item; // pointer to item we are going to deal with
     INITIALIZE_PATH(path); // path to item, that we are going to deal with.
     b_blocknr_t allocated_blocks[blocks_to_allocate]; // Pointer to a place where allocated blocknumbers would be stored. Right now statically allocated, later that will change.
@@ -197,7 +196,7 @@ int reiserfs_allocate_blocks_for_region(
     /* If we came here, it means we absolutely need to open a transaction,
        since we need to allocate some blocks */
     reiserfs_write_lock(inode->i_sb); // Journaling stuff and we need that.
-    journal_begin(&th, inode->i_sb, JOURNAL_PER_BALANCE_CNT * 3 + 1); // Wish I know if this number enough
+    journal_begin(th, inode->i_sb, JOURNAL_PER_BALANCE_CNT * 3 + 1); // Wish I know if this number enough
     reiserfs_update_inode_transaction(inode) ;
 
     /* Look for the in-tree position of our write, need path for block allocator */
@@ -209,14 +208,20 @@ int reiserfs_allocate_blocks_for_region(
    
     /* Allocate blocks */
     /* First fill in "hint" structure for block allocator */
-    hint.th = &th; // transaction handle.
+    hint.th = th; // transaction handle.
     hint.path = &path; // Path, so that block allocator can determine packing locality or whatever it needs to determine.
     hint.inode = inode; // Inode is needed by block allocator too.
     hint.search_start = 0; // We have no hint on where to search free blocks for block allocator.
     hint.key = key.on_disk_key; // on disk key of file.
     hint.block = inode->i_blocks>>(inode->i_sb->s_blocksize_bits-9); // Number of disk blocks this file occupies already.
     hint.formatted_node = 0; // We are allocating blocks for unformatted node.
-    hint.preallocate = 0; // We do not do any preallocation for now.
+
+    /* only preallocate if this is a small write */
+    if (blocks_to_allocate <
+        REISERFS_SB(inode->i_sb)->s_alloc_options.preallocsize)
+        hint.preallocate = 1;
+    else
+        hint.preallocate = 0;
 
     /* Call block allocator to allocate blocks */
     res = reiserfs_allocate_blocknrs(&hint, allocated_blocks, blocks_to_allocate, blocks_to_allocate);
@@ -225,7 +230,7 @@ int reiserfs_allocate_blocks_for_region(
 	    /* We flush the transaction in case of no space. This way some
 	       blocks might become free */
 	    SB_JOURNAL(inode->i_sb)->j_must_wait = 1;
-	    restart_transaction(&th, inode, &path);
+	    restart_transaction(th, inode, &path);
 
 	    /* We might have scheduled, so search again */
 	    res = search_for_position_by_key(inode->i_sb, &key, &path);
@@ -280,7 +285,20 @@ int reiserfs_allocate_blocks_for_region(
 	// position, and how many blocks it is going to cover (we need to
 	//  populate pointers to file blocks representing the hole with zeros)
 
-	hole_size = (pos + 1 - (le_key_k_offset( get_inode_item_key_version(inode), &(ih->ih_key))+op_bytes_number(ih, inode->i_sb->s_blocksize))) >> inode->i_sb->s_blocksize_bits;
+	{
+	    int item_offset = 1;
+	    /*
+	     * if ih is stat data, its offset is 0 and we don't want to
+	     * add 1 to pos in the hole_size calculation
+	     */
+	    if (is_statdata_le_ih(ih))
+	        item_offset = 0;
+	    hole_size = (pos + item_offset -
+	            (le_key_k_offset( get_inode_item_key_version(inode),
+		    &(ih->ih_key)) +
+		    op_bytes_number(ih, inode->i_sb->s_blocksize))) >>
+		    inode->i_sb->s_blocksize_bits;
+	}
 
 	if ( hole_size > 0 ) {
 	    int to_paste = min_t(__u64, hole_size, MAX_ITEM_LEN(inode->i_sb->s_blocksize)/UNFM_P_SIZE ); // How much data to insert first time.
@@ -299,7 +317,7 @@ int reiserfs_allocate_blocks_for_region(
 		    /* Ok, there is existing indirect item already. Need to append it */
 		    /* Calculate position past inserted item */
 		    make_cpu_key( &key, inode, le_key_k_offset( get_inode_item_key_version(inode), &(ih->ih_key)) + op_bytes_number(ih, inode->i_sb->s_blocksize), TYPE_INDIRECT, 3);
-		    res = reiserfs_paste_into_item( &th, &path, &key, (char *)zeros, UNFM_P_SIZE*to_paste);
+		    res = reiserfs_paste_into_item( th, &path, &key, (char *)zeros, UNFM_P_SIZE*to_paste);
 		    if ( res ) {
 			kfree(zeros);
 			goto error_exit_free_blocks;
@@ -329,7 +347,7 @@ int reiserfs_allocate_blocks_for_region(
 		        kfree(zeros);
 			goto error_exit_free_blocks;
 		    }
-		    res = reiserfs_insert_item( &th, &path, &key, &ins_ih, (char *)zeros);
+		    res = reiserfs_insert_item( th, &path, &key, &ins_ih, (char *)zeros);
 		} else {
 		    reiserfs_panic(inode->i_sb, "green-9011: Unexpected key type %K\n", &key);
 		}
@@ -339,8 +357,8 @@ int reiserfs_allocate_blocks_for_region(
 		}
 		/* Now we want to check if transaction is too full, and if it is
 		   we restart it. This will also free the path. */
-		if (journal_transaction_should_end(&th, th.t_blocks_allocated))
-		    restart_transaction(&th, inode, &path);
+		if (journal_transaction_should_end(th, th->t_blocks_allocated))
+		    restart_transaction(th, inode, &path);
 
 		/* Well, need to recalculate path and stuff */
 		set_cpu_key_k_offset( &key, cpu_key_k_offset(&key) + (to_paste << inode->i_blkbits));
@@ -371,7 +389,7 @@ retry:
 	       one. */
 	    /* First if we are already modifying current item, log it */
 	    if ( modifying_this_item ) {
-		journal_mark_dirty (&th, inode->i_sb, bh);
+		journal_mark_dirty (th, inode->i_sb, bh);
 		modifying_this_item = 0;
 	    }
 	    /* Then set the key to look for a new indirect item (offset of old
@@ -435,7 +453,7 @@ retry:
 
     if ( modifying_this_item ) { // We need to log last-accessed block, if it
 				 // was modified, but not logged yet.
-	journal_mark_dirty (&th, inode->i_sb, bh);
+	journal_mark_dirty (th, inode->i_sb, bh);
     }
 
     if ( curr_block < blocks_to_allocate ) {
@@ -446,7 +464,7 @@ retry:
 	    // position. We do not need to recalculate path as it should
 	    // already point to correct place.
 	    make_cpu_key( &key, inode, le_key_k_offset( get_inode_item_key_version(inode), &(ih->ih_key)) + op_bytes_number(ih, inode->i_sb->s_blocksize), TYPE_INDIRECT, 3);
-	    res = reiserfs_paste_into_item( &th, &path, &key, (char *)(allocated_blocks+curr_block), UNFM_P_SIZE*(blocks_to_allocate-curr_block));
+	    res = reiserfs_paste_into_item( th, &path, &key, (char *)(allocated_blocks+curr_block), UNFM_P_SIZE*(blocks_to_allocate-curr_block));
 	    if ( res ) {
 		goto error_exit_free_blocks;
 	    }
@@ -477,29 +495,18 @@ retry:
 		goto error_exit_free_blocks;
 	    }
 	    /* Insert item into the tree with the data as its body */
-	    res = reiserfs_insert_item( &th, &path, &key, &ins_ih, (char *)(allocated_blocks+curr_block));
+	    res = reiserfs_insert_item( th, &path, &key, &ins_ih, (char *)(allocated_blocks+curr_block));
 	} else {
 	    reiserfs_panic(inode->i_sb, "green-9010: unexpected item type for key %K\n",&key);
 	}
     }
 
-    /* Now the final thing, if we have grew the file, we must update it's size*/
-    if ( pos + write_bytes > inode->i_size) {
-	inode->i_size = pos + write_bytes; // Set new size
-	/* If the file have grown so much that tail packing is no longer possible, reset
-	   "need to pack" flag */
-	if ( (have_large_tails (inode->i_sb) && inode->i_size > i_block_size (inode)*4) ||
-	     (have_small_tails (inode->i_sb) && inode->i_size > i_block_size(inode)) )
-	    REISERFS_I(inode)->i_flags &= ~i_pack_on_close_mask ;
-    }
-
-    /* Amount of on-disk blocks used by file have changed, update it */
+    // the caller is responsible for closing the transaction
+    // unless we return an error, they are also responsible for logging
+    // the inode.
+    //
     inode->i_blocks += blocks_to_allocate << (inode->i_blkbits - 9);
-    reiserfs_update_sd(&th, inode); // And update on-disk metadata
-    // finish all journal stuff now, We are not going to play with metadata
-    // anymore.
     pathrelse(&path);
-    journal_end(&th, inode->i_sb, JOURNAL_PER_BALANCE_CNT * 3 + 1);
     reiserfs_write_unlock(inode->i_sb);
 
     // go through all the pages/buffers and map the buffers to newly allocated
@@ -530,6 +537,7 @@ retry:
 	    if ( !buffer_mapped(bh) ) { // Ok, unmapped buffer, need to map it
 		map_bh( bh, inode->i_sb, le32_to_cpu(allocated_blocks[curr_block]));
 		curr_block++;
+		set_buffer_new(bh);
 	    }
 	}
     }
@@ -543,10 +551,11 @@ error_exit_free_blocks:
     pathrelse(&path);
     // free blocks
     for( i = 0; i < blocks_to_allocate; i++ )
-	reiserfs_free_block( &th, le32_to_cpu(allocated_blocks[i]));
+	reiserfs_free_block(th, le32_to_cpu(allocated_blocks[i]));
 
 error_exit:
-    journal_end(&th, inode->i_sb, JOURNAL_PER_BALANCE_CNT * 3 + 1);
+    reiserfs_update_sd(th, inode); // update any changes we made to blk count
+    journal_end(th, inode->i_sb, JOURNAL_PER_BALANCE_CNT * 3 + 1);
     reiserfs_write_unlock(inode->i_sb);
 
     return res;
@@ -606,12 +615,63 @@ int reiserfs_copy_from_user_to_file_regi
     return page_fault?-EFAULT:0;
 }
 
+/* taken fs/buffer.c:__block_commit_write */
+int reiserfs_commit_page(struct inode *inode, struct page *page,
+		unsigned from, unsigned to)
+{
+    unsigned block_start, block_end;
+    int partial = 0;
+    unsigned blocksize;
+    struct buffer_head *bh, *head;
+    unsigned long i_size_index = inode->i_size >> PAGE_CACHE_SHIFT;
+    int new;
+
+    blocksize = 1 << inode->i_blkbits;
+
+    for(bh = head = page_buffers(page), block_start = 0;
+        bh != head || !block_start;
+	block_start=block_end, bh = bh->b_this_page)
+    {
+
+	new = buffer_new(bh);
+	clear_buffer_new(bh);
+	block_end = block_start + blocksize;
+	if (block_end <= from || block_start >= to) {
+	    if (!buffer_uptodate(bh))
+		    partial = 1;
+	} else {
+	    set_buffer_uptodate(bh);
+	    if (!buffer_dirty(bh)) {
+		mark_buffer_dirty(bh);
+		/* do data=ordered on any page past the end
+		 * of file and any buffer marked BH_New.
+		 */
+		if (reiserfs_data_ordered(inode->i_sb) &&
+		    (new || page->index >= i_size_index)) {
+		    reiserfs_add_ordered_list(inode, bh);
+	        }
+	    }
+	}
+    }
+
+    /*
+     * If this is a partial write which happened to make all buffers
+     * uptodate then we can optimize away a bogus readpage() for
+     * the next read(). Here we 'discover' whether the page went
+     * uptodate as a result of this (potentially partial) write.
+     */
+    if (!partial)
+	SetPageUptodate(page);
+    return 0;
+}
 
 
 /* Submit pages for write. This was separated from actual file copying
    because we might want to allocate block numbers in-between.
    This function assumes that caller will adjust file size to correct value. */
 int reiserfs_submit_file_region_for_write(
+				struct reiserfs_transaction_handle *th,
+				struct inode *inode,
 				loff_t pos, /* Writing position offset */
 				int num_pages, /* Number of pages to write */
 				int write_bytes, /* number of bytes to write */
@@ -622,12 +682,14 @@ int reiserfs_submit_file_region_for_writ
     int retval = 0; // Return value we are going to return.
     int i; // loop counter
     int offset; // Writing offset in page.
+    int orig_write_bytes = write_bytes;
+    int sd_update = 0;
 
     for ( i = 0, offset = (pos & (PAGE_CACHE_SIZE-1)); i < num_pages ; i++,offset=0) {
 	int count = min_t(int,PAGE_CACHE_SIZE-offset,write_bytes); // How much of bytes to write to this page
 	struct page *page=prepared_pages[i]; // Current page we process.
 
-	status = block_commit_write(page, offset, offset+count);
+	status = reiserfs_commit_page(inode, page, offset, offset+count);
 	if ( status )
 	    retval = status; // To not overcomplicate matters We are going to
 			     // submit all the pages even if there was error.
@@ -639,6 +701,41 @@ int reiserfs_submit_file_region_for_writ
 			  // to grab_cache_page
 	page_cache_release(page);
     }
+    /* now that we've gotten all the ordered buffers marked dirty,
+     * we can safely update i_size and close any running transaction
+     */
+    if ( pos + orig_write_bytes > inode->i_size) {
+	inode->i_size = pos + orig_write_bytes; // Set new size
+	/* If the file have grown so much that tail packing is no
+	 * longer possible, reset "need to pack" flag */
+	if ( (have_large_tails (inode->i_sb) &&
+	      inode->i_size > i_block_size (inode)*4) ||
+	     (have_small_tails (inode->i_sb) &&
+	     inode->i_size > i_block_size(inode)) )
+	    REISERFS_I(inode)->i_flags &= ~i_pack_on_close_mask ;
+        else if ( (have_large_tails (inode->i_sb) &&
+	          inode->i_size < i_block_size (inode)*4) ||
+	          (have_small_tails (inode->i_sb) &&
+		  inode->i_size < i_block_size(inode)) )
+	    REISERFS_I(inode)->i_flags |= i_pack_on_close_mask ;
+
+	if (th->t_trans_id) {
+	    reiserfs_write_lock(inode->i_sb);
+	    reiserfs_update_sd(th, inode); // And update on-disk metadata
+	    reiserfs_write_unlock(inode->i_sb);
+	} else
+	    inode->i_sb->s_op->dirty_inode(inode);
+
+        sd_update = 1;
+    }
+    if (th->t_trans_id) {
+	reiserfs_write_lock(inode->i_sb);
+	if (!sd_update)
+	    reiserfs_update_sd(th, inode);
+	journal_end(th, th->t_super, th->t_blocks_allocated);
+	reiserfs_write_unlock(inode->i_sb);
+    }
+    th->t_trans_id = 0;
     return retval;
 }
 
@@ -1006,19 +1103,18 @@ ssize_t reiserfs_file_write( struct file
     loff_t pos; // Current position in the file.
     size_t res; // return value of various functions that we call.
     struct inode *inode = file->f_dentry->d_inode; // Inode of the file that we are writing to.
-    struct page * prepared_pages[REISERFS_WRITE_PAGES_AT_A_TIME];
 				/* To simplify coding at this time, we store
 				   locked pages in array for now */
-    if ( count <= PAGE_CACHE_SIZE )
-        return generic_file_write(file, buf, count, ppos);
+    struct page * prepared_pages[REISERFS_WRITE_PAGES_AT_A_TIME];
+    struct reiserfs_transaction_handle th;
+    th.t_trans_id = 0;
 
-    if ( file->f_flags & O_DIRECT) { // Direct IO needs some special threating.
+    if ( file->f_flags & O_DIRECT) { // Direct IO needs treatment
 	int result, after_file_end = 0;
 	if ( (*ppos + count >= inode->i_size) || (file->f_flags & O_APPEND) ) {
 	    /* If we are appending a file, we need to put this savelink in here.
 	       If we will crash while doing direct io, finish_unfinished will
 	       cut the garbage from the file end. */
-	    struct reiserfs_transaction_handle th;
 	    reiserfs_write_lock(inode->i_sb);
 	    journal_begin(&th, inode->i_sb,  JOURNAL_PER_BALANCE_CNT );
 	    reiserfs_update_inode_transaction(inode);
@@ -1043,7 +1139,6 @@ ssize_t reiserfs_file_write( struct file
 	return result;
     }
 
-
     if ( unlikely((ssize_t) count < 0 ))
         return -EINVAL;
 
@@ -1149,11 +1244,7 @@ ssize_t reiserfs_file_write( struct file
 
 	if ( blocks_to_allocate > 0) {/*We only allocate blocks if we need to*/
 	    /* Fill in all the possible holes and append the file if needed */
-	    res = reiserfs_allocate_blocks_for_region(inode, pos, num_pages, write_bytes, prepared_pages, blocks_to_allocate);
-	} else if ( pos + write_bytes > inode->i_size ) {
-	    /* File might have grown even though no new blocks were added */
-	    inode->i_size = pos + write_bytes;
-	    inode->i_sb->s_op->dirty_inode(inode);
+	    res = reiserfs_allocate_blocks_for_region(&th, inode, pos, num_pages, write_bytes, prepared_pages, blocks_to_allocate);
 	}
 
 	/* well, we have allocated the blocks, so it is time to free
@@ -1176,7 +1267,8 @@ ssize_t reiserfs_file_write( struct file
 	}
 
 	/* Send the pages to disk and unlock them. */
-	res = reiserfs_submit_file_region_for_write(pos, num_pages, write_bytes, prepared_pages);
+	res = reiserfs_submit_file_region_for_write(&th, inode, pos, num_pages,
+	                                            write_bytes,prepared_pages);
 	if ( res )
 	    break;
 
@@ -1187,10 +1279,17 @@ ssize_t reiserfs_file_write( struct file
 	balance_dirty_pages_ratelimited(inode->i_mapping);
     }
 
+    /* this is only true on error */
+    if (th.t_trans_id) {
+        reiserfs_write_lock(inode->i_sb);
+	journal_end(&th, th.t_super, th.t_blocks_allocated);
+        reiserfs_write_unlock(inode->i_sb);
+    }
     if ((file->f_flags & O_SYNC) || IS_SYNC(inode))
 	res = generic_osync_inode(inode, file->f_mapping, OSYNC_METADATA|OSYNC_DATA);
 
     up(&inode->i_sem);
+    reiserfs_async_progress_wait(inode->i_sb);
     return (already_written != 0)?already_written:res;
 
 out:
--- diff/fs/reiserfs/fix_node.c	2004-02-18 08:54:12.000000000 +0000
+++ source/fs/reiserfs/fix_node.c	2004-04-21 10:45:35.779264224 +0100
@@ -2106,9 +2106,9 @@ static void tb_buffer_sanity_check (stru
 {;}
 #endif
 
-static void clear_all_dirty_bits(struct super_block *s, 
+static int clear_all_dirty_bits(struct super_block *s,
                                  struct buffer_head *bh) {
-  reiserfs_prepare_for_journal(s, bh, 0) ;
+  return reiserfs_prepare_for_journal(s, bh, 0) ;
 }
 
 static int wait_tb_buffers_until_unlocked (struct tree_balance * p_s_tb)
@@ -2137,11 +2137,11 @@ static int wait_tb_buffers_until_unlocke
 					    p_s_tb->tb_path->path_length - i);
 		}
 #endif
-		clear_all_dirty_bits(p_s_tb->tb_sb, 
-				     PATH_OFFSET_PBUFFER (p_s_tb->tb_path, i)) ;
-
-		if ( buffer_locked (PATH_OFFSET_PBUFFER (p_s_tb->tb_path, i)) )
+		if (!clear_all_dirty_bits(p_s_tb->tb_sb,
+				     PATH_OFFSET_PBUFFER (p_s_tb->tb_path, i)))
+		{
 		    locked = PATH_OFFSET_PBUFFER (p_s_tb->tb_path, i);
+		}
 	    }
 	}
 
@@ -2151,22 +2151,19 @@ static int wait_tb_buffers_until_unlocke
 
 		if ( p_s_tb->L[i] ) {
 		    tb_buffer_sanity_check (p_s_tb->tb_sb, p_s_tb->L[i], "L", i);
-		    clear_all_dirty_bits(p_s_tb->tb_sb, p_s_tb->L[i]) ;
-		    if ( buffer_locked (p_s_tb->L[i]) )
+		    if (!clear_all_dirty_bits(p_s_tb->tb_sb, p_s_tb->L[i]))
 			locked = p_s_tb->L[i];
 		}
 
 		if ( !locked && p_s_tb->FL[i] ) {
 		    tb_buffer_sanity_check (p_s_tb->tb_sb, p_s_tb->FL[i], "FL", i);
-		    clear_all_dirty_bits(p_s_tb->tb_sb, p_s_tb->FL[i]) ;
-		    if ( buffer_locked (p_s_tb->FL[i]) )
+		    if (!clear_all_dirty_bits(p_s_tb->tb_sb, p_s_tb->FL[i]))
 			locked = p_s_tb->FL[i];
 		}
 
 		if ( !locked && p_s_tb->CFL[i] ) {
 		    tb_buffer_sanity_check (p_s_tb->tb_sb, p_s_tb->CFL[i], "CFL", i);
-		    clear_all_dirty_bits(p_s_tb->tb_sb, p_s_tb->CFL[i]) ;
-		    if ( buffer_locked (p_s_tb->CFL[i]) )
+		    if (!clear_all_dirty_bits(p_s_tb->tb_sb, p_s_tb->CFL[i]))
 			locked = p_s_tb->CFL[i];
 		}
 
@@ -2176,23 +2173,20 @@ static int wait_tb_buffers_until_unlocke
 
 		if ( p_s_tb->R[i] ) {
 		    tb_buffer_sanity_check (p_s_tb->tb_sb, p_s_tb->R[i], "R", i);
-		    clear_all_dirty_bits(p_s_tb->tb_sb, p_s_tb->R[i]) ;
-		    if ( buffer_locked (p_s_tb->R[i]) )
+		    if (!clear_all_dirty_bits(p_s_tb->tb_sb, p_s_tb->R[i]))
 			locked = p_s_tb->R[i];
 		}
 
        
 		if ( !locked && p_s_tb->FR[i] ) {
 		    tb_buffer_sanity_check (p_s_tb->tb_sb, p_s_tb->FR[i], "FR", i);
-		    clear_all_dirty_bits(p_s_tb->tb_sb, p_s_tb->FR[i]) ;
-		    if ( buffer_locked (p_s_tb->FR[i]) )
+		    if (!clear_all_dirty_bits(p_s_tb->tb_sb, p_s_tb->FR[i]))
 			locked = p_s_tb->FR[i];
 		}
 
 		if ( !locked && p_s_tb->CFR[i] ) {
 		    tb_buffer_sanity_check (p_s_tb->tb_sb, p_s_tb->CFR[i], "CFR", i);
-		    clear_all_dirty_bits(p_s_tb->tb_sb, p_s_tb->CFR[i]) ;
-		    if ( buffer_locked (p_s_tb->CFR[i]) )
+		    if (!clear_all_dirty_bits(p_s_tb->tb_sb, p_s_tb->CFR[i]))
 			locked = p_s_tb->CFR[i];
 		}
 	    }
@@ -2207,10 +2201,8 @@ static int wait_tb_buffers_until_unlocke
 	*/
 	for ( i = 0; !locked && i < MAX_FEB_SIZE; i++ ) { 
 	    if ( p_s_tb->FEB[i] ) {
-		clear_all_dirty_bits(p_s_tb->tb_sb, p_s_tb->FEB[i]) ;
-		if (buffer_locked(p_s_tb->FEB[i])) {
+		if (!clear_all_dirty_bits(p_s_tb->tb_sb, p_s_tb->FEB[i]))
 		    locked = p_s_tb->FEB[i] ;
-		}
 	    }
 	}
 
@@ -2280,7 +2272,6 @@ int fix_nodes (int n_op_mode,
     ** during wait_tb_buffers_run
     */
     int wait_tb_buffers_run = 0 ; 
-    int windex ;
     struct buffer_head  * p_s_tbS0 = PATH_PLAST_BUFFER(p_s_tb->tb_path);
 
     ++ REISERFS_SB(p_s_tb -> tb_sb) -> s_fix_nodes;
@@ -2407,10 +2398,7 @@ int fix_nodes (int n_op_mode,
 		p_s_tb->insert_size[n_h + 1] = (DC_SIZE + KEY_SIZE) * (p_s_tb->blknum[n_h] - 1);
     }
 
-    
-    windex = push_journal_writer("fix_nodes") ;
     if ((n_ret_value = wait_tb_buffers_until_unlocked (p_s_tb)) == CARRY_ON) {
-	pop_journal_writer(windex) ;
 	if (FILESYSTEM_CHANGED_TB(p_s_tb)) {
 	    wait_tb_buffers_run = 1 ;
 	    n_ret_value = REPEAT_SEARCH ;
@@ -2420,7 +2408,6 @@ int fix_nodes (int n_op_mode,
 	}
     } else {
 	wait_tb_buffers_run = 1 ;
-	pop_journal_writer(windex) ;
 	goto repeat; 
     }
 
--- diff/fs/reiserfs/ibalance.c	2002-10-16 04:28:24.000000000 +0100
+++ source/fs/reiserfs/ibalance.c	2004-04-21 10:45:35.780264072 +0100
@@ -633,7 +633,6 @@ static void balance_internal_when_delete
 		/* use check_internal if new root is an internal node */
 		check_internal (new_root);
 	    /*&&&&&&&&&&&&&&&&&&&&&&*/
-	    tb->tb_sb->s_dirt = 1;
 
 	    /* do what is needed for buffer thrown from tree */
 	    reiserfs_invalidate_buffer(tb, tbSh);
@@ -951,7 +950,6 @@ int balance_internal (struct tree_balanc
         PUT_SB_ROOT_BLOCK( tb->tb_sb, tbSh->b_blocknr );
         PUT_SB_TREE_HEIGHT( tb->tb_sb, SB_TREE_HEIGHT(tb->tb_sb) + 1 );
 	do_balance_mark_sb_dirty (tb, REISERFS_SB(tb->tb_sb)->s_sbh, 1);
-	tb->tb_sb->s_dirt = 1;
     }
 	
     if ( tb->blknum[h] == 2 ) {
--- diff/fs/reiserfs/inode.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/reiserfs/inode.c	2004-04-21 10:45:35.782263768 +0100
@@ -22,16 +22,17 @@ extern int reiserfs_default_io_size; /* 
 #define GET_BLOCK_NO_HOLE 2   /* return -ENOENT for file holes */
 #define GET_BLOCK_READ_DIRECT 4  /* read the tail if indirect item not found */
 #define GET_BLOCK_NO_ISEM     8 /* i_sem is not held, don't preallocate */
+#define GET_BLOCK_NO_DANGLE   16 /* don't leave any transactions running */
 
 static int reiserfs_get_block (struct inode * inode, sector_t block,
 			       struct buffer_head * bh_result, int create);
+static int reiserfs_commit_write(struct file *f, struct page *page,
+                                 unsigned from, unsigned to);
 
 void reiserfs_delete_inode (struct inode * inode)
 {
     int jbegin_count = JOURNAL_PER_BALANCE_CNT * 2; 
-    int windex ;
     struct reiserfs_transaction_handle th ;
-
   
     reiserfs_write_lock(inode->i_sb);
 
@@ -41,10 +42,8 @@ void reiserfs_delete_inode (struct inode
 
 	journal_begin(&th, inode->i_sb, jbegin_count) ;
 	reiserfs_update_inode_transaction(inode) ;
-	windex = push_journal_writer("delete_inode") ;
 
 	reiserfs_delete_object (&th, inode);
-	pop_journal_writer(windex) ;
 
 	journal_end(&th, inode->i_sb, jbegin_count) ;
 
@@ -107,12 +106,6 @@ inline void make_le_item_head (struct it
     put_ih_entry_count( ih, entry_count );
 }
 
-static void add_to_flushlist(struct inode *inode, struct buffer_head *bh) {
-    struct reiserfs_journal *j = SB_JOURNAL(inode->i_sb) ;
-
-    buffer_insert_list(&j->j_dirty_buffers_lock, bh, &j->j_dirty_buffers) ;
-}
-
 //
 // FIXME: we might cache recently accessed indirect item
 
@@ -206,6 +199,10 @@ static int file_capable (struct inode * 
   struct super_block *s = th->t_super ;
   int len = th->t_blocks_allocated ;
 
+  /* we cannot restart while nested */
+  if (th->t_refcount > 1) {
+      return  ;
+  }
   pathrelse(path) ;
   reiserfs_update_sd(th, inode) ;
   journal_end(th, s, len) ;
@@ -437,7 +434,8 @@ static int reiserfs_get_blocks_direct_io
        reiserfs_get_block() */
     bh_result->b_size = (1 << inode->i_blkbits);
 
-    ret = reiserfs_get_block(inode, iblock, bh_result, create) ;
+    ret = reiserfs_get_block(inode, iblock, bh_result,
+                             create | GET_BLOCK_NO_DANGLE) ;
 
     /* don't allow direct io onto tail pages */
     if (ret == 0 && buffer_mapped(bh_result) && bh_result->b_blocknr == 0) {
@@ -510,15 +508,14 @@ static int convert_tail_for_hole(struct 
     ** won't trigger a get_block in this case.
     */
     fix_tail_page_for_writing(tail_page) ;
-    retval = block_prepare_write(tail_page, tail_start, tail_end, 
-                                 reiserfs_get_block) ; 
+    retval = reiserfs_prepare_write(NULL, tail_page, tail_start, tail_end);
     if (retval)
         goto unlock ;
 
     /* tail conversion might change the data in the page */
     flush_dcache_page(tail_page) ;
 
-    retval = generic_commit_write(NULL, tail_page, tail_start, tail_end) ;
+    retval = reiserfs_commit_write(NULL, tail_page, tail_start, tail_end) ;
 
 unlock:
     if (tail_page != hole_page) {
@@ -557,8 +554,7 @@ int reiserfs_get_block (struct inode * i
     __u32 * item;
     int done;
     int fs_gen;
-    int windex ;
-    struct reiserfs_transaction_handle th ;
+    struct reiserfs_transaction_handle *th = NULL;
     /* space reserved in transaction batch: 
         . 3 balancings in direct->indirect conversion
         . 1 block involved into reiserfs_update_sd()
@@ -566,12 +562,11 @@ int reiserfs_get_block (struct inode * i
        can incur (much) more that 3 balancings. */
     int jbegin_count = JOURNAL_PER_BALANCE_CNT * 3 + 1;
     int version;
-    int transaction_started = 0 ;
+    int dangle = 1;
     loff_t new_offset = (((loff_t)block) << inode->i_sb->s_blocksize_bits) + 1 ;
 
 				/* bad.... */
     reiserfs_write_lock(inode->i_sb);
-    th.t_trans_id = 0 ;
     version = get_inode_item_key_version (inode);
 
     if (block < 0) {
@@ -595,6 +590,13 @@ int reiserfs_get_block (struct inode * i
 	reiserfs_write_unlock(inode->i_sb);
 	return ret;
     }
+    /*
+     * if we're already in a transaction, make sure to close
+     * any new transactions we start in this func
+     */
+    if ((create & GET_BLOCK_NO_DANGLE) ||
+        reiserfs_transaction_running(inode->i_sb))
+        dangle = 0;
 
     /* If file is of such a size, that it might have a tail and tails are enabled
     ** we should mark it as possibly needing tail packing on close
@@ -603,15 +605,17 @@ int reiserfs_get_block (struct inode * i
 	 (have_small_tails (inode->i_sb) && inode->i_size < i_block_size(inode)) )
 	REISERFS_I(inode)->i_flags |= i_pack_on_close_mask ;
 
-    windex = push_journal_writer("reiserfs_get_block") ;
-  
     /* set the key of the first byte in the 'block'-th block of file */
     make_cpu_key (&key, inode, new_offset,
 		  TYPE_ANY, 3/*key length*/);
     if ((new_offset + inode->i_sb->s_blocksize - 1) > inode->i_size) {
-	journal_begin(&th, inode->i_sb, jbegin_count) ;
+start_trans:
+	th = reiserfs_persistent_transaction(inode->i_sb, jbegin_count);
+	if (!th) {
+	    retval = -ENOMEM;
+	    goto failure;
+	}
 	reiserfs_update_inode_transaction(inode) ;
-	transaction_started = 1 ;
     }
  research:
 
@@ -631,23 +635,21 @@ int reiserfs_get_block (struct inode * i
 
     if (allocation_needed (retval, allocated_block_nr, ih, item, pos_in_item)) {
 	/* we have to allocate block for the unformatted node */
-	if (!transaction_started) {
+	if (!th) {
 	    pathrelse(&path) ;
-	    journal_begin(&th, inode->i_sb, jbegin_count) ;
-	    reiserfs_update_inode_transaction(inode) ;
-	    transaction_started = 1 ;
-	    goto research ;
+	    goto start_trans;
 	}
 
-	repeat = _allocate_block(&th, block, inode, &allocated_block_nr, &path, create);
+	repeat = _allocate_block(th, block, inode, &allocated_block_nr, &path, create);
 
 	if (repeat == NO_DISK_SPACE) {
 	    /* restart the transaction to give the journal a chance to free
 	    ** some blocks.  releases the path, so we have to go back to
 	    ** research if we succeed on the second try
 	    */
-	    restart_transaction(&th, inode, &path) ; 
-	    repeat = _allocate_block(&th, block, inode, &allocated_block_nr, NULL, create);
+	    SB_JOURNAL(inode->i_sb)->j_next_async_flush = 1;
+	    restart_transaction(th, inode, &path) ;
+	    repeat = _allocate_block(th, block, inode, &allocated_block_nr, NULL, create);
 
 	    if (repeat != NO_DISK_SPACE) {
 		goto research ;
@@ -675,17 +677,18 @@ int reiserfs_get_block (struct inode * i
 		goto research;
 	    }
 	    set_buffer_new(bh_result);
+	    if (buffer_dirty(bh_result) && reiserfs_data_ordered(inode->i_sb))
+	    	reiserfs_add_ordered_list(inode, bh_result);
 	    put_block_num(item, pos_in_item, allocated_block_nr) ;
             unfm_ptr = allocated_block_nr;
-	    journal_mark_dirty (&th, inode->i_sb, bh);
+	    journal_mark_dirty (th, inode->i_sb, bh);
 	    inode->i_blocks += (inode->i_sb->s_blocksize / 512) ;
-	    reiserfs_update_sd(&th, inode) ;
+	    reiserfs_update_sd(th, inode) ;
 	}
 	set_block_dev_mapped(bh_result, unfm_ptr, inode);
 	pathrelse (&path);
-	pop_journal_writer(windex) ;
-	if (transaction_started)
-	    journal_end(&th, inode->i_sb, jbegin_count) ;
+	if (!dangle && th)
+	    reiserfs_end_persistent_transaction(th);
 
 	reiserfs_write_unlock(inode->i_sb);
 	 
@@ -696,16 +699,9 @@ int reiserfs_get_block (struct inode * i
 	return 0;
     }
 
-    if (!transaction_started) {
-	/* if we don't pathrelse, we could vs-3050 on the buffer if
-	** someone is waiting for it (they can't finish until the buffer
-	** is released, we can start a new transaction until they finish)
-	*/
+    if (!th) {
 	pathrelse(&path) ;
-	journal_begin(&th, inode->i_sb, jbegin_count) ;
-	reiserfs_update_inode_transaction(inode) ;
-	transaction_started = 1 ;
-	goto research;
+	goto start_trans;
     }
 
     /* desired position is not found or is in the direct item. We have
@@ -733,9 +729,9 @@ int reiserfs_get_block (struct inode * i
 	    set_cpu_key_k_offset (&tmp_key, 1);
 	    PATH_LAST_POSITION(&path) ++;
 
-	    retval = reiserfs_insert_item (&th, &path, &tmp_key, &tmp_ih, (char *)&unp);
+	    retval = reiserfs_insert_item (th, &path, &tmp_key, &tmp_ih, (char *)&unp);
 	    if (retval) {
-		reiserfs_free_block (&th, allocated_block_nr);
+		reiserfs_free_block (th, allocated_block_nr);
 		goto failure; // retval == -ENOSPC or -EIO or -EEXIST
 	    }
 	    if (unp)
@@ -759,8 +755,14 @@ int reiserfs_get_block (struct inode * i
 		   node. FIXME: this should also get into page cache */
 
 		pathrelse(&path) ;
-		journal_end(&th, inode->i_sb, jbegin_count) ;
-		transaction_started = 0 ;
+		/*
+		 * ugly, but we can only end the transaction if
+		 * we aren't nested
+		 */
+		if (th->t_refcount == 1) {
+		    reiserfs_end_persistent_transaction(th);
+		    th = NULL;
+		}
 
 		retval = convert_tail_for_hole(inode, bh_result, tail_offset) ;
 		if (retval) {
@@ -768,18 +770,19 @@ int reiserfs_get_block (struct inode * i
 			printk("clm-6004: convert tail failed inode %lu, error %d\n", inode->i_ino, retval) ;
 		    if (allocated_block_nr) {
 			/* the bitmap, the super, and the stat data == 3 */
-			journal_begin(&th, inode->i_sb, 3) ;
-			reiserfs_free_block (&th, allocated_block_nr);
-			transaction_started = 1 ;
+			if (!th)
+			    th = reiserfs_persistent_transaction(inode->i_sb,3);
+			if (th)
+			    reiserfs_free_block (th, allocated_block_nr);
 		    }
 		    goto failure ;
 		}
 		goto research ;
 	    }
-	    retval = direct2indirect (&th, inode, &path, unbh, tail_offset);
+	    retval = direct2indirect (th, inode, &path, unbh, tail_offset);
 	    if (retval) {
 		reiserfs_unmap_buffer(unbh);
-		reiserfs_free_block (&th, allocated_block_nr);
+		reiserfs_free_block (th, allocated_block_nr);
 		goto failure;
 	    }
 	    /* it is important the set_buffer_uptodate is done after
@@ -799,7 +802,7 @@ int reiserfs_get_block (struct inode * i
 		/* we've converted the tail, so we must
 		** flush unbh before the transaction commits
 		*/
-		add_to_flushlist(inode, unbh) ;
+		reiserfs_add_tail_list(inode, unbh) ;
 
 		/* mark it dirty now to prevent commit_write from adding
 		** this buffer to the inode's dirty buffer list
@@ -862,13 +865,13 @@ int reiserfs_get_block (struct inode * i
 		   only have space for one block */
 		blocks_needed=max_to_insert?max_to_insert:1;
 	    }
-	    retval = reiserfs_paste_into_item (&th, &path, &tmp_key, (char *)un, UNFM_P_SIZE * blocks_needed);
+	    retval = reiserfs_paste_into_item (th, &path, &tmp_key, (char *)un, UNFM_P_SIZE * blocks_needed);
 
 	    if (blocks_needed != 1)
 		kfree(un);
 
 	    if (retval) {
-		reiserfs_free_block (&th, allocated_block_nr);
+		reiserfs_free_block (th, allocated_block_nr);
 		goto failure;
 	    }
 	    if (done) {
@@ -893,8 +896,8 @@ int reiserfs_get_block (struct inode * i
 	** release the path so that anybody waiting on the path before
 	** ending their transaction will be able to continue.
 	*/
-	if (journal_transaction_should_end(&th, th.t_blocks_allocated)) {
-	  restart_transaction(&th, inode, &path) ; 
+	if (journal_transaction_should_end(th, th->t_blocks_allocated)) {
+	  restart_transaction(th, inode, &path) ;
 	}
 	/* inserting indirect pointers for a hole can take a 
 	** long time.  reschedule if needed
@@ -911,7 +914,7 @@ int reiserfs_get_block (struct inode * i
 			      "%K should not be found\n", &key);
 	    retval = -EEXIST;
 	    if (allocated_block_nr)
-	        reiserfs_free_block (&th, allocated_block_nr);
+	        reiserfs_free_block (th, allocated_block_nr);
 	    pathrelse(&path) ;
 	    goto failure;
 	}
@@ -925,11 +928,10 @@ int reiserfs_get_block (struct inode * i
     retval = 0;
 
  failure:
-    if (transaction_started) {
-      reiserfs_update_sd(&th, inode) ;
-      journal_end(&th, inode->i_sb, jbegin_count) ;
+    if (th && !dangle) {
+      reiserfs_update_sd(th, inode) ;
+      reiserfs_end_persistent_transaction(th);
     }
-    pop_journal_writer(windex) ;
     reiserfs_write_unlock(inode->i_sb);
     reiserfs_check_path(&path) ;
     return retval;
@@ -969,7 +971,7 @@ static void init_inode (struct inode * i
     REISERFS_I(inode)->i_prealloc_block = 0;
     REISERFS_I(inode)->i_prealloc_count = 0;
     REISERFS_I(inode)->i_trans_id = 0;
-    REISERFS_I(inode)->i_trans_index = 0;
+    REISERFS_I(inode)->i_jl = NULL;
 
     if (stat_data_v1 (ih)) {
 	struct stat_data_v1 * sd = (struct stat_data_v1 *)B_I_PITEM (bh, ih);
@@ -1626,7 +1628,7 @@ int reiserfs_new_inode (struct reiserfs_
     REISERFS_I(inode)->i_prealloc_block = 0;
     REISERFS_I(inode)->i_prealloc_count = 0;
     REISERFS_I(inode)->i_trans_id = 0;
-    REISERFS_I(inode)->i_trans_index = 0;
+    REISERFS_I(inode)->i_jl = 0;
     REISERFS_I(inode)->i_attrs =
 	REISERFS_I(dir)->i_attrs & REISERFS_INHERIT_MASK;
     sd_attrs_to_i_attrs( REISERFS_I(inode) -> i_attrs, inode );
@@ -1832,7 +1834,6 @@ unlock:
 */
 void reiserfs_truncate_file(struct inode *p_s_inode, int update_timestamps) {
     struct reiserfs_transaction_handle th ;
-    int windex ;
     /* we want the offset for the first byte after the end of the file */
     unsigned long offset = p_s_inode->i_size & (PAGE_CACHE_SIZE - 1) ;
     unsigned blocksize = p_s_inode->i_sb->s_blocksize ;
@@ -1867,14 +1868,12 @@ void reiserfs_truncate_file(struct inode
        cut_from_item. 1 is for update_sd */
     journal_begin(&th, p_s_inode->i_sb,  JOURNAL_PER_BALANCE_CNT * 2 + 1 ) ;
     reiserfs_update_inode_transaction(p_s_inode) ;
-    windex = push_journal_writer("reiserfs_vfs_truncate_file") ;
     if (update_timestamps)
 	    /* we are doing real truncate: if the system crashes before the last
 	       transaction of truncating gets committed - on reboot the file
 	       either appears truncated properly or not truncated at all */
 	add_save_link (&th, p_s_inode, 1);
     reiserfs_do_truncate (&th, p_s_inode, page, update_timestamps) ;
-    pop_journal_writer(windex) ;
     journal_end(&th, p_s_inode->i_sb,  JOURNAL_PER_BALANCE_CNT * 2 + 1 ) ;
 
     if (update_timestamps)
@@ -1926,7 +1925,6 @@ static int map_block_for_writepage(struc
     th.t_trans_id = 0;
 
     if (!buffer_uptodate(bh_result)) {
-        buffer_error();
 	return -EIO;
     }
 
@@ -2015,7 +2013,8 @@ out:
     /* this is where we fill in holes in the file. */
     if (use_get_block) {
 	retval = reiserfs_get_block(inode, block, bh_result, 
-	                            GET_BLOCK_CREATE | GET_BLOCK_NO_ISEM) ;
+	                            GET_BLOCK_CREATE | GET_BLOCK_NO_ISEM |
+				    GET_BLOCK_NO_DANGLE);
 	if (!retval) {
 	    if (!buffer_mapped(bh_result) || bh_result->b_blocknr == 0) {
 	        /* get_block failed to find a mapped unformatted node. */
@@ -2037,32 +2036,6 @@ out:
     return retval ;
 }
 
-/*
- * does the right thing for deciding when to lock a buffer and
- * mark it for io during a writepage.  make sure the buffer is
- * dirty before sending it here though.
- */
-static void lock_buffer_for_writepage(struct page *page, 
-                                      struct writeback_control *wbc, 
-			              struct buffer_head *bh)
-{
-    if (wbc->sync_mode != WB_SYNC_NONE) {
-	lock_buffer(bh);
-    } else {
-	if (test_set_buffer_locked(bh)) {
-	    __set_page_dirty_nobuffers(page);
-	    return;
-	}
-    }
-    if (test_clear_buffer_dirty(bh)) {
-	if (!buffer_uptodate(bh))
-	    buffer_error();
-	mark_buffer_async_write(bh);
-    } else {
-	unlock_buffer(bh);
-    }
-}
-
 /* 
  * mason@suse.com: updated in 2.5.54 to follow the same general io 
  * start/recovery path as __block_write_full_page, along with special
@@ -2083,8 +2056,6 @@ static int reiserfs_write_full_page(stru
      * in the BH_Uptodate is just a sanity check.
      */
     if (!page_has_buffers(page)) {
-	if (!PageUptodate(page))
-	    buffer_error();
 	create_empty_buffers(page, inode->i_sb->s_blocksize, 
 	                    (1 << BH_Dirty) | (1 << BH_Uptodate));
     }
@@ -2110,31 +2081,50 @@ static int reiserfs_write_full_page(stru
     }
     bh = head ;
     block = page->index << (PAGE_CACHE_SHIFT - inode->i_sb->s_blocksize_bits) ;
+    /* first map all the buffers, logging any direct items we find */
     do {
-	get_bh(bh);
-	if (buffer_dirty(bh)) {
-	    if (buffer_mapped(bh) && bh->b_blocknr != 0) {
-		/* buffer mapped to an unformatted node */
-		lock_buffer_for_writepage(page, wbc, bh);
-	    } else {
-		/* not mapped yet, or it points to a direct item, search
-		 * the btree for the mapping info, and log any direct
-		 * items found
-		 */
-		if ((error = map_block_for_writepage(inode, bh, block))) {
-		    goto fail ;
-		}
-		if (buffer_mapped(bh) && bh->b_blocknr != 0)  {
-		    lock_buffer_for_writepage(page, wbc, bh);
-		} 
+	if (buffer_dirty(bh) && (!buffer_mapped(bh) ||
+	   (buffer_mapped(bh) && bh->b_blocknr == 0))) {
+	    /* not mapped yet, or it points to a direct item, search
+	     * the btree for the mapping info, and log any direct
+	     * items found
+	     */
+	    if ((error = map_block_for_writepage(inode, bh, block))) {
+		goto fail ;
 	    }
 	}
         bh = bh->b_this_page;
 	block++;
     } while(bh != head) ;
 
+    /* now go through and lock any dirty buffers on the page */
+    do {
+	get_bh(bh);
+	if (!buffer_mapped(bh))
+	    continue;
+	if (buffer_mapped(bh) && bh->b_blocknr == 0)
+	    continue;
+
+	/* from this point on, we know the buffer is mapped to a
+	 * real block and not a direct item
+	 */
+	if (wbc->sync_mode != WB_SYNC_NONE || !wbc->nonblocking) {
+	    lock_buffer(bh);
+	} else {
+	    if (test_set_buffer_locked(bh)) {
+		__set_page_dirty_nobuffers(page);
+		continue;
+	    }
+	}
+	if (test_clear_buffer_dirty(bh)) {
+	    mark_buffer_async_write(bh);
+	} else {
+	    unlock_buffer(bh);
+	}
+    } while((bh = bh->b_this_page) != head);
+
     BUG_ON(PageWriteback(page));
-    SetPageWriteback(page);
+    set_page_writeback(page);
     unlock_page(page);
 
     /*
@@ -2198,7 +2188,7 @@ fail:
     } while(bh != head);
     SetPageError(page);
     BUG_ON(PageWriteback(page));
-    SetPageWriteback(page);
+    set_page_writeback(page);
     unlock_page(page);
     do {
         struct buffer_head *next = bh->b_this_page;
@@ -2227,13 +2217,46 @@ static int reiserfs_writepage (struct pa
     return reiserfs_write_full_page(page, wbc) ;
 }
 
-
 int reiserfs_prepare_write(struct file *f, struct page *page, 
 			   unsigned from, unsigned to) {
     struct inode *inode = page->mapping->host ;
+    int ret;
+    int old_ref = 0;
+
     reiserfs_wait_on_write_block(inode->i_sb) ;
     fix_tail_page_for_writing(page) ;
-    return block_prepare_write(page, from, to, reiserfs_get_block) ;
+    if (reiserfs_transaction_running(inode->i_sb)) {
+	struct reiserfs_transaction_handle *th;
+        th = (struct reiserfs_transaction_handle *)current->journal_info;
+	old_ref = th->t_refcount;
+	th->t_refcount++;
+    }
+
+    ret = block_prepare_write(page, from, to, reiserfs_get_block) ;
+    if (ret && reiserfs_transaction_running(inode->i_sb)) {
+    	struct reiserfs_transaction_handle *th = current->journal_info;
+	/* this gets a little ugly.  If reiserfs_get_block returned an
+	 * error and left a transacstion running, we've got to close it,
+	 * and we've got to free handle if it was a persistent transaction.
+	 *
+	 * But, if we had nested into an existing transaction, we need
+	 * to just drop the ref count on the handle.
+	 *
+	 * If old_ref == 0, the transaction is from reiserfs_get_block,
+	 * and it was a persistent trans.  Otherwise, it was nested above.
+	 */
+	if (th->t_refcount > old_ref) {
+	    if (old_ref)
+	    	th->t_refcount--;
+	    else {
+		reiserfs_write_lock(inode->i_sb);
+		reiserfs_end_persistent_transaction(th);
+		reiserfs_write_unlock(inode->i_sb);
+	    }
+	}
+    }
+    return ret;
+
 }
 
 
@@ -2245,16 +2268,21 @@ static int reiserfs_commit_write(struct 
                                  unsigned from, unsigned to) {
     struct inode *inode = page->mapping->host ;
     loff_t pos = ((loff_t)page->index << PAGE_CACHE_SHIFT) + to;
-    int ret ; 
+    int ret = 0;
+    struct reiserfs_transaction_handle *th = NULL;
     
     reiserfs_wait_on_write_block(inode->i_sb) ;
+    if (reiserfs_transaction_running(inode->i_sb)) {
+        th = current->journal_info;
+    }
+    reiserfs_commit_page(inode, page, from, to);
  
     /* generic_commit_write does this for us, but does not update the
     ** transaction tracking stuff when the size changes.  So, we have
     ** to do the i_size updates here.
     */
     if (pos > inode->i_size) {
-	struct reiserfs_transaction_handle th ;
+	struct reiserfs_transaction_handle myth ;
 	reiserfs_write_lock(inode->i_sb);
 	/* If the file have grown beyond the border where it
 	   can have a tail, unmark it as needing a tail
@@ -2263,16 +2291,19 @@ static int reiserfs_commit_write(struct 
 	     (have_small_tails (inode->i_sb) && inode->i_size > i_block_size(inode)) )
 	    REISERFS_I(inode)->i_flags &= ~i_pack_on_close_mask ;
 
-	journal_begin(&th, inode->i_sb, 1) ;
+	journal_begin(&myth, inode->i_sb, 1) ;
 	reiserfs_update_inode_transaction(inode) ;
 	inode->i_size = pos ;
-	reiserfs_update_sd(&th, inode) ;
-	journal_end(&th, inode->i_sb, 1) ;
+	reiserfs_update_sd(&myth, inode) ;
+	journal_end(&myth, inode->i_sb, 1) ;
+	reiserfs_write_unlock(inode->i_sb);
+    }
+    if (th) {
+	reiserfs_write_lock(inode->i_sb);
+        reiserfs_end_persistent_transaction(th);
 	reiserfs_write_unlock(inode->i_sb);
     }
  
-    ret = generic_commit_write(f, page, from, to) ;
-
     /* we test for O_SYNC here so we can commit the transaction
     ** for any packed tails the file might have had
     */
@@ -2332,16 +2363,110 @@ void i_attrs_to_sd_attrs( struct inode *
 	}
 }
 
+/* decide if this buffer needs to stay around for data logging or ordered
+** write purposes
+*/
+static int invalidatepage_can_drop(struct inode *inode, struct buffer_head *bh)
+{
+    int ret = 1 ;
+    struct reiserfs_journal *j = SB_JOURNAL(inode->i_sb) ;
+
+    spin_lock(&j->j_dirty_buffers_lock) ;
+    if (!buffer_mapped(bh)) {
+        goto free_jh;
+    }
+    /* the page is locked, and the only places that log a data buffer
+     * also lock the page.
+     */
+#if 0
+    if (reiserfs_file_data_log(inode)) {
+	/* very conservative, leave the buffer pinned if anyone might need it.
+	** this should be changed to drop the buffer if it is only in the
+	** current transaction
+	*/
+        if (buffer_journaled(bh) || buffer_journal_dirty(bh)) {
+	    ret = 0 ;
+	}
+    } else
+#endif
+    if (buffer_dirty(bh) || buffer_locked(bh)) {
+	struct reiserfs_journal_list *jl;
+	struct reiserfs_jh *jh = bh->b_private;
+
+	/* why is this safe?
+	 * reiserfs_setattr updates i_size in the on disk
+	 * stat data before allowing vmtruncate to be called.
+	 *
+	 * If buffer was put onto the ordered list for this
+	 * transaction, we know for sure either this transaction
+	 * or an older one already has updated i_size on disk,
+	 * and this ordered data won't be referenced in the file
+	 * if we crash.
+	 *
+	 * if the buffer was put onto the ordered list for an older
+	 * transaction, we need to leave it around
+	 */
+	if (jh && (jl = jh->jl) && jl != SB_JOURNAL(inode->i_sb)->j_current_jl)
+	    ret = 0;
+    }
+free_jh:
+    if (ret && bh->b_private) {
+        reiserfs_free_jh(bh);
+    }
+    spin_unlock(&j->j_dirty_buffers_lock) ;
+    return ret ;
+}
+
+/* clm -- taken from fs/buffer.c:block_invalidate_page */
+static int reiserfs_invalidatepage(struct page *page, unsigned long offset)
+{
+    struct buffer_head *head, *bh, *next;
+    struct inode *inode = page->mapping->host;
+    unsigned int curr_off = 0;
+    int ret = 1;
+
+    BUG_ON(!PageLocked(page));
+    if (!page_has_buffers(page))
+	goto out;
+
+    head = page_buffers(page);
+    bh = head;
+    do {
+	unsigned int next_off = curr_off + bh->b_size;
+	next = bh->b_this_page;
+
+	/*
+	 * is this block fully invalidated?
+	 */
+	if (offset <= curr_off) {
+	    if (invalidatepage_can_drop(inode, bh))
+		reiserfs_unmap_buffer(bh);
+	    else
+	        ret = 0;
+	}
+	curr_off = next_off;
+	bh = next;
+    } while (bh != head);
+
+    /*
+     * We release buffers only if the entire page is being invalidated.
+     * The get_block cached value has been unconditionally invalidated,
+     * so real IO is not possible anymore.
+     */
+    if (!offset && ret)
+	ret = try_to_release_page(page, 0);
+out:
+    return ret;
+}
+
 /*
  * Returns 1 if the page's buffers were dropped.  The page is locked.
  *
  * Takes j_dirty_buffers_lock to protect the b_assoc_buffers list_heads
  * in the buffers at page_buffers(page).
  *
- * FIXME: Chris says the buffer list is not used with `mount -o notail',
- * so in that case the fs can avoid the extra locking.  Create a second
- * address_space_operations with a NULL ->releasepage and install that
- * into new address_spaces.
+ * even in -o notail mode, we can't be sure an old mount without -o notail
+ * didn't create files with tails.
  */
 static int reiserfs_releasepage(struct page *page, int unused_gfp_flags)
 {
@@ -2355,11 +2480,13 @@ static int reiserfs_releasepage(struct p
     head = page_buffers(page) ;
     bh = head ;
     do {
-	if (!buffer_dirty(bh) && !buffer_locked(bh)) {
-		list_del_init(&bh->b_assoc_buffers) ;
-	} else {
+	if (bh->b_private) {
+	    if (!buffer_dirty(bh) && !buffer_locked(bh)) {
+		reiserfs_free_jh(bh);
+	    } else {
 		ret = 0 ;
 		break ;
+	    }
 	}
 	bh = bh->b_this_page ;
     } while (bh != head) ;
@@ -2371,14 +2498,14 @@ static int reiserfs_releasepage(struct p
 
 /* We thank Mingming Cao for helping us understand in great detail what
    to do in this section of the code. */
-static int reiserfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
-			      loff_t offset, unsigned long nr_segs)
+static ssize_t reiserfs_direct_IO(int rw, struct kiocb *iocb,
+		const struct iovec *iov, loff_t offset, unsigned long nr_segs)
 {
     struct file *file = iocb->ki_filp;
     struct inode *inode = file->f_mapping->host;
 
     return blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
-			      offset, nr_segs, reiserfs_get_blocks_direct_io, NULL);
+			offset, nr_segs, reiserfs_get_blocks_direct_io, NULL);
 }
 
 
@@ -2387,6 +2514,7 @@ struct address_space_operations reiserfs
     .readpage = reiserfs_readpage, 
     .readpages = reiserfs_readpages, 
     .releasepage = reiserfs_releasepage,
+    .invalidatepage = reiserfs_invalidatepage,
     .sync_page = block_sync_page,
     .prepare_write = reiserfs_prepare_write,
     .commit_write = reiserfs_commit_write,
--- diff/fs/reiserfs/ioctl.c	2003-10-09 09:47:17.000000000 +0100
+++ source/fs/reiserfs/ioctl.c	2004-04-21 10:45:35.783263616 +0100
@@ -92,6 +92,7 @@ int reiserfs_unpack (struct inode * inod
     int retval = 0;
     int index ;
     struct page *page ;
+    struct address_space *mapping ;
     unsigned long write_from ;
     unsigned long blocksize = inode->i_sb->s_blocksize ;
     	
@@ -122,17 +123,19 @@ int reiserfs_unpack (struct inode * inod
     ** reiserfs_get_block to unpack the tail for us.
     */
     index = inode->i_size >> PAGE_CACHE_SHIFT ;
-    page = grab_cache_page(inode->i_mapping, index) ;
+    mapping = inode->i_mapping ;
+    page = grab_cache_page(mapping, index) ;
     retval = -ENOMEM;
     if (!page) {
         goto out ;
     }
-    retval = reiserfs_prepare_write(NULL, page, write_from, blocksize) ;
+    retval = mapping->a_ops->prepare_write(NULL, page, write_from, write_from) ;
     if (retval)
         goto out_unlock ;
 
     /* conversion can change page contents, must flush */
     flush_dcache_page(page) ;
+    retval = mapping->a_ops->commit_write(NULL, page, write_from, write_from) ;
     REISERFS_I(inode)->i_flags |= i_nopack_mask;
 
 out_unlock:
--- diff/fs/reiserfs/journal.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/reiserfs/journal.c	2004-04-21 10:45:35.788262856 +0100
@@ -32,13 +32,6 @@
 **                      around too long.
 **		     -- Note, if you call this as an immediate flush from 
 **		        from within kupdate, it will ignore the immediate flag
-**
-** The commit thread -- a writer process for async commits.  It allows a 
-**                      a process to request a log flush on a task queue.
-**                      the commit will happen once the commit thread wakes up.
-**                      The benefit here is the writer (with whatever
-**                      related locks it has) doesn't have to wait for the
-**                      log blocks to hit disk if it doesn't want to.
 */
 
 #include <linux/config.h>
@@ -60,6 +53,15 @@
 #include <linux/suspend.h>
 #include <linux/buffer_head.h>
 #include <linux/workqueue.h>
+#include <linux/writeback.h>
+#include <linux/blkdev.h>
+
+
+/* gets a struct reiserfs_journal_list * from a list head */
+#define JOURNAL_LIST_ENTRY(h) (list_entry((h), struct reiserfs_journal_list, \
+                               j_list))
+#define JOURNAL_WORK_ENTRY(h) (list_entry((h), struct reiserfs_journal_list, \
+                               j_working_list))
 
 /* the number of mounted filesystems.  This is used to decide when to
 ** start and kill the commit workqueue
@@ -78,6 +80,13 @@ static struct workqueue_struct *commit_w
 #define BLOCK_FREED_HOLDER 3    /* this block was freed during this transaction, and can't be written */
 
 #define BLOCK_NEEDS_FLUSH 4	/* used in flush_journal_list */
+#define BLOCK_DIRTIED 5
+
+
+/* journal list state bits */
+#define LIST_TOUCHED 1
+#define LIST_DIRTY   2
+#define LIST_COMMIT_PENDING  4		/* someone will commit this list */
 
 /* flags for do_journal_end */
 #define FLUSH_ALL   1		/* flush commit and real blocks */
@@ -86,6 +95,9 @@ static struct workqueue_struct *commit_w
 
 /* state bits for the journal */
 #define WRITERS_BLOCKED 1      /* set when new writers not allowed */
+#define WRITERS_QUEUED 2       /* set when log is full due to too many
+				* writers
+				*/
 
 static int do_journal_end(struct reiserfs_transaction_handle *,struct super_block *,unsigned long nblocks,int flags) ;
 static int flush_journal_list(struct super_block *s, struct reiserfs_journal_list *jl, int flushall) ;
@@ -94,6 +106,9 @@ static int can_dirty(struct reiserfs_jou
 static int journal_join(struct reiserfs_transaction_handle *th, struct super_block *p_s_sb, unsigned long nblocks);
 static int release_journal_dev( struct super_block *super,
 				struct reiserfs_journal *journal );
+static int dirty_one_transaction(struct super_block *s,
+                                 struct reiserfs_journal_list *jl);
+static void flush_async_commits(void *p);
 
 static void init_journal_hash(struct super_block *p_s_sb) {
   memset(SB_JOURNAL(p_s_sb)->j_hash_table, 0, JOURNAL_HASH_SIZE * sizeof(struct reiserfs_journal_cnode *)) ;
@@ -105,8 +120,10 @@ static void init_journal_hash(struct sup
 ** more details.
 */
 static int reiserfs_clean_and_file_buffer(struct buffer_head *bh) {
-  if (bh)
+  if (bh) {
     clear_buffer_dirty(bh);
+    clear_bit(BH_JTest, &bh->b_state);
+  }
   return 0 ;
 }
 
@@ -367,6 +384,7 @@ static void free_cnode(struct super_bloc
 
 static int clear_prepared_bits(struct buffer_head *bh) {
   clear_bit(BH_JPrepared, &bh->b_state) ;
+  clear_bit(BH_JRestore_dirty, &bh->b_state) ;
   return 0 ;
 }
 
@@ -408,7 +426,6 @@ void reiserfs_check_lock_depth(char *cal
 #ifdef CONFIG_SMP
   if (current->lock_depth < 0) {
     printk("%s called without kernel lock held\n", caller) ;
-    show_reiserfs_locks() ;
     BUG() ;
   }
 #else
@@ -444,52 +461,6 @@ static inline struct reiserfs_journal_cn
   return cn ;
 }
 
-/* once upon a time, the journal would deadlock.  a lot.  Now, when
-** CONFIG_REISERFS_CHECK is defined, anytime someone enters a
-** transaction, it pushes itself into this ugly static list, and pops
-** itself off before calling journal_end.  I made a SysRq key to dump
-** the list, and tell me what the writers are when I'm deadlocked.  */
-
-				/* are you depending on the compiler
-                                   to optimize this function away
-                                   everywhere it is called? It is not
-                                   obvious how this works, but I
-                                   suppose debugging code need not be
-                                   clear.  -Hans */
-static char *journal_writers[512] ;
-int push_journal_writer(char *s) {
-#ifdef CONFIG_REISERFS_CHECK
-  int i ;
-  for (i = 0 ; i < 512 ; i++) {
-    if (!journal_writers[i]) {
-      journal_writers[i] = s ;
-      return i ;
-    }
-  }
-  return -1 ;
-#else
-  return 0 ;
-#endif
-}
-int pop_journal_writer(int index) {
-#ifdef CONFIG_REISERFS_CHECK
-  if (index >= 0) {
-    journal_writers[index] = NULL ;
-  }
-#endif
-  return 0 ;
-}
-
-int dump_journal_writers(void) {
-  int i ;
-  for (i = 0 ; i < 512 ; i++) {
-    if (journal_writers[i]) {
-      printk("%d: %s\n", i, journal_writers[i]) ;
-    }
-  }
-  return 0 ;
-}
-
 /*
 ** this actually means 'can this block be reallocated yet?'.  If you set search_all, a block can only be allocated
 ** if it is not in the current transaction, was not freed by the current transaction, and has no chance of ever
@@ -518,11 +489,6 @@ int reiserfs_in_journal(struct super_blo
 
   *next_zero_bit = 0 ; /* always start this at zero. */
 
-  /* we aren't logging all blocks are safe for reuse */
-  if (reiserfs_dont_log(p_s_sb)) {
-    return 0 ;
-  }
-
   PROC_INFO_INC( p_s_sb, journal.in_journal );
   /* If we aren't doing a search_all, this is a metablock, and it will be logged before use.
   ** if we crash before the transaction that freed it commits,  this transaction won't
@@ -550,6 +516,7 @@ int reiserfs_in_journal(struct super_blo
 
   /* is it in the current transaction.  This should never happen */
   if ((cn = get_journal_hash_dev(p_s_sb, SB_JOURNAL(p_s_sb)->j_hash_table, bl))) {
+    BUG();
     return 1; 
   }
 
@@ -574,18 +541,30 @@ inline void insert_journal_hash(struct r
 
 /* lock the current transaction */
 inline static void lock_journal(struct super_block *p_s_sb) {
-  PROC_INFO_INC( p_s_sb, journal.lock_journal );
-  while(atomic_read(&(SB_JOURNAL(p_s_sb)->j_wlock)) > 0) {
-    PROC_INFO_INC( p_s_sb, journal.lock_journal_wait );
-    sleep_on(&(SB_JOURNAL(p_s_sb)->j_wait)) ;
-  }
-  atomic_set(&(SB_JOURNAL(p_s_sb)->j_wlock), 1) ;
+    PROC_INFO_INC( p_s_sb, journal.lock_journal );
+    down(&SB_JOURNAL(p_s_sb)->j_lock);
 }
 
 /* unlock the current transaction */
 inline static void unlock_journal(struct super_block *p_s_sb) {
-  atomic_dec(&(SB_JOURNAL(p_s_sb)->j_wlock)) ;
-  wake_up(&(SB_JOURNAL(p_s_sb)->j_wait)) ;
+    up(&SB_JOURNAL(p_s_sb)->j_lock);
+}
+
+static inline void get_journal_list(struct reiserfs_journal_list *jl)
+{
+    jl->j_refcount++;
+}
+
+static inline void put_journal_list(struct super_block *s,
+                                   struct reiserfs_journal_list *jl)
+{
+    if (jl->j_refcount < 1) {
+        printk("trans id %lu, refcount at %d\n", jl->j_trans_id,
+	                                         jl->j_refcount);
+        BUG();
+    }
+    if (--jl->j_refcount == 0)
+        reiserfs_kfree(jl, sizeof(struct reiserfs_journal_list), s);
 }
 
 /*
@@ -603,6 +582,323 @@ static void cleanup_freed_for_journal_li
   jl->j_list_bitmap = NULL ;
 }
 
+static int journal_list_still_alive(struct super_block *s,
+                                    unsigned long trans_id)
+{
+    struct list_head *entry = &SB_JOURNAL(s)->j_journal_list;
+    struct reiserfs_journal_list *jl;
+
+    if (!list_empty(entry)) {
+        jl = JOURNAL_LIST_ENTRY(entry->next);
+	if (jl->j_trans_id <= trans_id) {
+	    return 1;
+	}
+    }
+    return 0;
+}
+
+static void reiserfs_end_buffer_io_sync(struct buffer_head *bh, int uptodate) {
+    char b[BDEVNAME_SIZE];
+
+    if (buffer_journaled(bh)) {
+        reiserfs_warning("clm-2084: pinned buffer %lu:%s sent to disk\n",
+	                 bh->b_blocknr, bdevname(bh->b_bdev, b)) ;
+    }
+    if (uptodate)
+    	set_buffer_uptodate(bh) ;
+    else
+    	clear_buffer_uptodate(bh) ;
+    unlock_buffer(bh) ;
+    put_bh(bh) ;
+}
+
+static void reiserfs_end_ordered_io(struct buffer_head *bh, int uptodate) {
+    if (uptodate)
+    	set_buffer_uptodate(bh) ;
+    else
+    	clear_buffer_uptodate(bh) ;
+    unlock_buffer(bh) ;
+    put_bh(bh) ;
+}
+
+static void submit_logged_buffer(struct buffer_head *bh) {
+    get_bh(bh) ;
+    bh->b_end_io = reiserfs_end_buffer_io_sync ;
+    mark_buffer_notjournal_new(bh) ;
+    clear_buffer_dirty(bh) ;
+    if (!test_and_clear_bit(BH_JTest, &bh->b_state))
+        BUG();
+    if (!buffer_uptodate(bh))
+        BUG();
+    submit_bh(WRITE, bh) ;
+}
+
+static void submit_ordered_buffer(struct buffer_head *bh) {
+    get_bh(bh) ;
+    bh->b_end_io = reiserfs_end_ordered_io;
+    clear_buffer_dirty(bh) ;
+    if (!buffer_uptodate(bh))
+        BUG();
+    submit_bh(WRITE, bh) ;
+}
+
+#define CHUNK_SIZE 32
+struct buffer_chunk {
+    struct buffer_head *bh[CHUNK_SIZE];
+    int nr;
+};
+
+static void write_chunk(struct buffer_chunk *chunk) {
+    int i;
+    for (i = 0; i < chunk->nr ; i++) {
+	submit_logged_buffer(chunk->bh[i]) ;
+    }
+    chunk->nr = 0;
+}
+
+static void write_ordered_chunk(struct buffer_chunk *chunk) {
+    int i;
+    for (i = 0; i < chunk->nr ; i++) {
+	submit_ordered_buffer(chunk->bh[i]) ;
+    }
+    chunk->nr = 0;
+}
+
+static int add_to_chunk(struct buffer_chunk *chunk, struct buffer_head *bh,
+			 spinlock_t *lock,
+			 void (fn)(struct buffer_chunk *))
+{
+    int ret = 0;
+    if (chunk->nr >= CHUNK_SIZE)
+        BUG();
+    chunk->bh[chunk->nr++] = bh;
+    if (chunk->nr >= CHUNK_SIZE) {
+	ret = 1;
+        if (lock)
+	    spin_unlock(lock);
+        fn(chunk);
+        if (lock)
+	    spin_lock(lock);
+    }
+    return ret;
+}
+
+
+atomic_t nr_reiserfs_jh = ATOMIC_INIT(0);
+static struct reiserfs_jh *alloc_jh(void) {
+    struct reiserfs_jh *jh;
+    while(1) {
+	jh = kmalloc(sizeof(*jh), GFP_NOFS);
+	if (jh) {
+	    atomic_inc(&nr_reiserfs_jh);
+	    return jh;
+	}
+        yield();
+    }
+}
+
+/*
+ * we want to free the jh when the buffer has been written
+ * and waited on
+ */
+void reiserfs_free_jh(struct buffer_head *bh) {
+    struct reiserfs_jh *jh;
+
+    jh = bh->b_private;
+    if (jh) {
+	bh->b_private = NULL;
+	jh->bh = NULL;
+	list_del_init(&jh->list);
+	kfree(jh);
+	if (atomic_read(&nr_reiserfs_jh) <= 0)
+	    BUG();
+	atomic_dec(&nr_reiserfs_jh);
+	put_bh(bh);
+    }
+}
+
+static inline int __add_jh(struct reiserfs_journal *j, struct buffer_head *bh,
+                           int tail)
+{
+    struct reiserfs_jh *jh;
+
+    if (bh->b_private) {
+	spin_lock(&j->j_dirty_buffers_lock);
+	if (!bh->b_private) {
+	    spin_unlock(&j->j_dirty_buffers_lock);
+	    goto no_jh;
+	}
+        jh = bh->b_private;
+	list_del_init(&jh->list);
+    } else {
+no_jh:
+	get_bh(bh);
+	jh = alloc_jh();
+	spin_lock(&j->j_dirty_buffers_lock);
+	/* buffer must be locked for __add_jh, should be able to have
+	 * two adds at the same time
+	 */
+	if (bh->b_private)
+	    BUG();
+	jh->bh = bh;
+	bh->b_private = jh;
+    }
+    jh->jl = j->j_current_jl;
+    if (tail)
+	list_add_tail(&jh->list, &jh->jl->j_tail_bh_list);
+    else {
+	list_add_tail(&jh->list, &jh->jl->j_bh_list);
+    }
+    spin_unlock(&j->j_dirty_buffers_lock);
+    return 0;
+}
+
+int reiserfs_add_tail_list(struct inode *inode, struct buffer_head *bh) {
+    return __add_jh(SB_JOURNAL(inode->i_sb), bh, 1);
+}
+int reiserfs_add_ordered_list(struct inode *inode, struct buffer_head *bh) {
+    return __add_jh(SB_JOURNAL(inode->i_sb), bh, 0);
+}
+
+#define JH_ENTRY(l) list_entry((l), struct reiserfs_jh, list)
+static int write_ordered_buffers(spinlock_t *lock,
+				 struct reiserfs_journal *j,
+                                 struct reiserfs_journal_list *jl,
+				 struct list_head *list)
+{
+    struct buffer_head *bh;
+    struct reiserfs_jh *jh;
+    int ret = 0;
+    struct buffer_chunk chunk;
+    struct list_head tmp;
+    INIT_LIST_HEAD(&tmp);
+
+    chunk.nr = 0;
+    spin_lock(lock);
+    while(!list_empty(list)) {
+        jh = JH_ENTRY(list->next);
+	bh = jh->bh;
+	get_bh(bh);
+	if (test_set_buffer_locked(bh)) {
+	    if (!buffer_dirty(bh)) {
+		list_del_init(&jh->list);
+		list_add(&jh->list, &tmp);
+		goto loop_next;
+	    }
+	    spin_unlock(lock);
+	    if (chunk.nr)
+		write_ordered_chunk(&chunk);
+	    wait_on_buffer(bh);
+	    cond_resched();
+	    spin_lock(lock);
+	    goto loop_next;
+	}
+	if (buffer_dirty(bh)) {
+	    list_del_init(&jh->list);
+	    list_add(&jh->list, &tmp);
+	    add_to_chunk(&chunk, bh, lock, write_ordered_chunk);
+	} else {
+	    reiserfs_free_jh(bh);
+	    unlock_buffer(bh);
+	}
+loop_next:
+	put_bh(bh);
+	cond_resched_lock(lock);
+    }
+    if (chunk.nr) {
+	spin_unlock(lock);
+        write_ordered_chunk(&chunk);
+	spin_lock(lock);
+    }
+    while(!list_empty(&tmp)) {
+        jh = JH_ENTRY(tmp.prev);
+	bh = jh->bh;
+	get_bh(bh);
+	reiserfs_free_jh(bh);
+
+	if (buffer_locked(bh)) {
+	    spin_unlock(lock);
+	    wait_on_buffer(bh);
+	    spin_lock(lock);
+	}
+	if (!buffer_uptodate(bh))
+	    ret = -EIO;
+	put_bh(bh);
+	cond_resched_lock(lock);
+    }
+    spin_unlock(lock);
+    return ret;
+}
+
+static int flush_older_commits(struct super_block *s, struct reiserfs_journal_list *jl) {
+    struct reiserfs_journal_list *other_jl;
+    struct reiserfs_journal_list *first_jl;
+    struct list_head *entry;
+    unsigned long trans_id = jl->j_trans_id;
+    unsigned long other_trans_id;
+    unsigned long first_trans_id;
+
+find_first:
+    /*
+     * first we walk backwards to find the oldest uncommitted transation
+     */
+    first_jl = jl;
+    entry = jl->j_list.prev;
+    while(1) {
+	other_jl = JOURNAL_LIST_ENTRY(entry);
+	if (entry == &SB_JOURNAL(s)->j_journal_list ||
+	    atomic_read(&other_jl->j_older_commits_done))
+	    break;
+
+        first_jl = other_jl;
+	entry = other_jl->j_list.prev;
+    }
+
+    /* if we didn't find any older uncommitted transactions, return now */
+    if (first_jl == jl) {
+        return 0;
+    }
+
+    first_trans_id = first_jl->j_trans_id;
+
+    entry = &first_jl->j_list;
+    while(1) {
+	other_jl = JOURNAL_LIST_ENTRY(entry);
+	other_trans_id = other_jl->j_trans_id;
+
+	if (other_trans_id < trans_id) {
+	    if (atomic_read(&other_jl->j_commit_left) != 0) {
+		flush_commit_list(s, other_jl, 0);
+
+		/* list we were called with is gone, return */
+		if (!journal_list_still_alive(s, trans_id))
+		    return 1;
+
+		/* the one we just flushed is gone, this means all
+		 * older lists are also gone, so first_jl is no longer
+		 * valid either.  Go back to the beginning.
+		 */
+		if (!journal_list_still_alive(s, other_trans_id)) {
+		    goto find_first;
+		}
+	    }
+	    entry = entry->next;
+	    if (entry == &SB_JOURNAL(s)->j_journal_list)
+		return 0;
+	} else {
+	    return 0;
+	}
+    }
+    return 0;
+}
+int reiserfs_async_progress_wait(struct super_block *s) {
+    DEFINE_WAIT(wait);
+    struct reiserfs_journal *j = SB_JOURNAL(s);
+    if (atomic_read(&j->j_async_throttle))
+    	blk_congestion_wait(WRITE, HZ/10);
+    return 0;
+}
+
 /*
 ** if this journal list still has commit blocks unflushed, send them to disk.
 **
@@ -611,13 +907,10 @@ static void cleanup_freed_for_journal_li
 **
 */
 static int flush_commit_list(struct super_block *s, struct reiserfs_journal_list *jl, int flushall) {
-  int i, count ;
-  int index = 0 ;
+  int i;
   int bn ;
-  int retry_count = 0 ;
-  int orig_commit_left = 0 ;
   struct buffer_head *tbh = NULL ;
-  struct reiserfs_journal_list *other_jl ;
+  unsigned long trans_id = jl->j_trans_id;
 
   reiserfs_check_lock_depth("flush_commit_list") ;
 
@@ -628,133 +921,112 @@ static int flush_commit_list(struct supe
   /* before we can put our commit blocks on disk, we have to make sure everyone older than
   ** us is on disk too
   */
-  if (jl->j_len <= 0) {
-    return 0 ;
-  }
+  if (jl->j_len <= 0)
+    BUG();
+  if (trans_id == SB_JOURNAL(s)->j_trans_id)
+    BUG();
+
+  get_journal_list(jl);
   if (flushall) {
-    /* we _must_ make sure the transactions are committed in order.  Start with the
-    ** index after this one, wrap all the way around 
-    */
-    index = (jl - SB_JOURNAL_LIST(s)) + 1 ;
-    for (i = 0 ; i < JOURNAL_LIST_COUNT ; i++) {
-      other_jl = SB_JOURNAL_LIST(s) + ( (index + i) % JOURNAL_LIST_COUNT) ;
-      if (other_jl && other_jl != jl && other_jl->j_len > 0 && other_jl->j_trans_id > 0 && 
-          other_jl->j_trans_id <= jl->j_trans_id && (atomic_read(&(jl->j_older_commits_done)) == 0)) {
-        flush_commit_list(s, other_jl, 0) ;
-      }
+    if (flush_older_commits(s, jl) == 1) {
+      /* list disappeared during flush_older_commits.  return */
+      goto put_jl;
     }
   }
 
-  count = 0 ;
-  /* don't flush the commit list for the current transactoin */
-  if (jl == ((SB_JOURNAL_LIST(s) + SB_JOURNAL_LIST_INDEX(s)))) {
-    return 0 ;
-  }
-
   /* make sure nobody is trying to flush this one at the same time */
-  if (atomic_read(&(jl->j_commit_flushing))) {
-    sleep_on(&(jl->j_commit_wait)) ;
-    if (flushall) {
-      atomic_set(&(jl->j_older_commits_done), 1) ;
-    }
-    return 0 ;
+  down(&jl->j_commit_lock);
+  if (!journal_list_still_alive(s, trans_id)) {
+    up(&jl->j_commit_lock);
+    goto put_jl;
   }
-  
+  if (jl->j_trans_id == 0)
+    BUG();
+
   /* this commit is done, exit */
   if (atomic_read(&(jl->j_commit_left)) <= 0) {
     if (flushall) {
       atomic_set(&(jl->j_older_commits_done), 1) ;
     }
-    return 0 ;
+    up(&jl->j_commit_lock);
+    goto put_jl;
   }
-  /* keeps others from flushing while we are flushing */
-  atomic_set(&(jl->j_commit_flushing), 1) ; 
 
-
-  if (jl->j_len > SB_JOURNAL_TRANS_MAX(s)) {
-    reiserfs_panic(s, "journal-512: flush_commit_list: length is %lu, list number %d\n", jl->j_len, jl - SB_JOURNAL_LIST(s)) ;
-    return 0 ;
+  if (!list_empty(&jl->j_bh_list)) {
+      unlock_kernel();
+      write_ordered_buffers(&SB_JOURNAL(s)->j_dirty_buffers_lock,
+                            SB_JOURNAL(s), jl, &jl->j_bh_list);
+      lock_kernel();
   }
-
-  orig_commit_left = atomic_read(&(jl->j_commit_left)) ; 
-
-  /* start by checking all the commit blocks in this transaction.  
-  ** Add anyone not on disk into tbh.  Stop checking once commit_left <= 1, because that means we
-  ** only have the commit block left 
-  */
-retry:
-  count = 0 ;
-  for (i = 0 ; atomic_read(&(jl->j_commit_left)) > 1 && i < (jl->j_len + 1) ; i++) {  /* everything but commit_bh */
-    bn = SB_ONDISK_JOURNAL_1st_BLOCK(s) + (jl->j_start+i) %  SB_ONDISK_JOURNAL_SIZE(s);
+  if (!list_empty(&jl->j_bh_list))
+      BUG();
+  /*
+   * for the description block and all the log blocks, submit any buffers
+   * that haven't already reached the disk
+   */
+  atomic_inc(&SB_JOURNAL(s)->j_async_throttle);
+  for (i = 0 ; i < (jl->j_len + 1) ; i++) {
+    bn = SB_ONDISK_JOURNAL_1st_BLOCK(s) + (jl->j_start+i) %
+         SB_ONDISK_JOURNAL_SIZE(s);
     tbh = journal_find_get_block(s, bn) ;
-
-/* kill this sanity check */
-if (count > (orig_commit_left + 2)) {
-reiserfs_panic(s, "journal-539: flush_commit_list: BAD count(%d) > orig_commit_left(%d)!\n", count, orig_commit_left) ;
-}
-    if (tbh) {
-      if (buffer_locked(tbh)) { /* wait on it, redo it just to make sure */
-	wait_on_buffer(tbh) ;
-	if (!buffer_uptodate(tbh)) {
-	  reiserfs_panic(s, "journal-584, buffer write failed\n") ;
-	}
-      } 
-      if (buffer_dirty(tbh)) {
-	printk("journal-569: flush_commit_list, block already dirty!\n") ;
-      } else {				
-	mark_buffer_dirty(tbh) ;
-      }
-      ll_rw_block(WRITE, 1, &tbh) ;
-      count++ ;
-      put_bh(tbh) ; /* once for our get_hash */
-    } 
-  }
-
-  /* wait on everyone in tbh before writing commit block*/
-  if (count > 0) {
-    for (i = 0 ; atomic_read(&(jl->j_commit_left)) > 1 && 
-                 i < (jl->j_len + 1) ; i++) {  /* everything but commit_bh */
-      bn = SB_ONDISK_JOURNAL_1st_BLOCK(s) + (jl->j_start + i) % SB_ONDISK_JOURNAL_SIZE(s) ;
-      tbh = journal_find_get_block(s, bn) ;
-
-      wait_on_buffer(tbh) ;
-      if (!buffer_uptodate(tbh)) {
-	reiserfs_panic(s, "journal-601, buffer write failed\n") ;
-      }
-      put_bh(tbh) ; /* once for our get_hash */
-      bforget(tbh) ;    /* once due to original getblk in do_journal_end */
-      atomic_dec(&(jl->j_commit_left)) ;
-    }
+    if (buffer_dirty(tbh))
+	ll_rw_block(WRITE, 1, &tbh) ;
+    put_bh(tbh) ;
+  }
+  atomic_dec(&SB_JOURNAL(s)->j_async_throttle);
+
+  /* wait on everything written so far before writing the commit */
+  for (i = 0 ;  i < (jl->j_len + 1) ; i++) {
+    bn = SB_ONDISK_JOURNAL_1st_BLOCK(s) +
+	 (jl->j_start + i) % SB_ONDISK_JOURNAL_SIZE(s) ;
+    tbh = journal_find_get_block(s, bn) ;
+    wait_on_buffer(tbh) ;
+    // since we're using ll_rw_blk above, it might have skipped over
+    // a locked buffer.  Double check here
+    //
+    if (buffer_dirty(tbh))
+      sync_dirty_buffer(tbh);
+    if (!buffer_uptodate(tbh)) {
+      reiserfs_panic(s, "journal-601, buffer write failed\n") ;
+    }
+    put_bh(tbh) ; /* once for journal_find_get_block */
+    put_bh(tbh) ;    /* once due to original getblk in do_journal_end */
+    atomic_dec(&(jl->j_commit_left)) ;
   }
 
-  if (atomic_read(&(jl->j_commit_left)) != 1) { /* just the commit_bh left, flush it without calling getblk for everyone */
-    if (retry_count < 2) {
-      printk("journal-582: flush_commit_list, not all log blocks on disk yet, trying again\n") ;
-      retry_count++ ;
-      goto retry;
-    }
-    reiserfs_panic(s, "journal-563: flush_commit_list: BAD, j_commit_left is %u, should be 1\n", 
-		   atomic_read(&(jl->j_commit_left)));
-  }
+  if (atomic_read(&(jl->j_commit_left)) != 1)
+    BUG();
 
+  if (buffer_dirty(jl->j_commit_bh))
+    BUG();
   mark_buffer_dirty(jl->j_commit_bh) ;
   sync_dirty_buffer(jl->j_commit_bh) ;
   if (!buffer_uptodate(jl->j_commit_bh)) {
     reiserfs_panic(s, "journal-615: buffer write failed\n") ;
   }
-  atomic_dec(&(jl->j_commit_left)) ;
   bforget(jl->j_commit_bh) ;
+  if (SB_JOURNAL(s)->j_last_commit_id != 0 &&
+     (jl->j_trans_id - SB_JOURNAL(s)->j_last_commit_id) != 1) {
+      reiserfs_warning("clm-2200: last commit %lu, current %lu\n",
+                       SB_JOURNAL(s)->j_last_commit_id,
+		       jl->j_trans_id);
+  }
+  SB_JOURNAL(s)->j_last_commit_id = jl->j_trans_id;
 
   /* now, every commit block is on the disk.  It is safe to allow blocks freed during this transaction to be reallocated */
   cleanup_freed_for_journal_list(s, jl) ;
 
+  /* mark the metadata dirty */
+  dirty_one_transaction(s, jl);
+  atomic_dec(&(jl->j_commit_left)) ;
+
   if (flushall) {
     atomic_set(&(jl->j_older_commits_done), 1) ;
   }
-  atomic_set(&(jl->j_commit_flushing), 0) ;
-  wake_up(&(jl->j_commit_wait)) ;
+  up(&jl->j_commit_lock);
+put_jl:
+  put_journal_list(s, jl);
 
-  s->s_dirt = 1 ;
   return 0 ;
 }
 
@@ -851,45 +1123,35 @@ static int update_journal_header_block(s
 ** flush any and all journal lists older than you are 
 ** can only be called from flush_journal_list
 */
-static int flush_older_journal_lists(struct super_block *p_s_sb, struct reiserfs_journal_list *jl, unsigned long trans_id) {
-  int i, index ;
-  struct reiserfs_journal_list *other_jl ;
-
-  index = jl - SB_JOURNAL_LIST(p_s_sb) ;
-  for (i = 0 ; i < JOURNAL_LIST_COUNT ; i++) {
-    other_jl = SB_JOURNAL_LIST(p_s_sb) + ((index + i) % JOURNAL_LIST_COUNT) ;
-    if (other_jl && other_jl->j_len > 0 && 
-        other_jl->j_trans_id > 0 && 
-	other_jl->j_trans_id < trans_id && 
-        other_jl != jl) {
-      /* do not flush all */
-      flush_journal_list(p_s_sb, other_jl, 0) ; 
+static int flush_older_journal_lists(struct super_block *p_s_sb,
+                                     struct reiserfs_journal_list *jl)
+{
+    struct list_head *entry;
+    struct reiserfs_journal_list *other_jl ;
+    unsigned long trans_id = jl->j_trans_id;
+
+    /* we know we are the only ones flushing things, no extra race
+     * protection is required.
+     */
+restart:
+    entry = SB_JOURNAL(p_s_sb)->j_journal_list.next;
+    other_jl = JOURNAL_LIST_ENTRY(entry);
+    if (other_jl->j_trans_id < trans_id) {
+	/* do not flush all */
+	flush_journal_list(p_s_sb, other_jl, 0) ;
+
+	/* other_jl is now deleted from the list */
+	goto restart;
     }
-  }
-  return 0 ;
+    return 0 ;
 }
 
-static void reiserfs_end_buffer_io_sync(struct buffer_head *bh, int uptodate) {
-    char b[BDEVNAME_SIZE];
-
-    if (buffer_journaled(bh)) {
-        reiserfs_warning("clm-2084: pinned buffer %lu:%s sent to disk\n",
-	                 bh->b_blocknr, bdevname(bh->b_bdev, b)) ;
+static void del_from_work_list(struct super_block *s,
+                               struct reiserfs_journal_list *jl) {
+    if (!list_empty(&jl->j_working_list)) {
+	list_del_init(&jl->j_working_list);
+	SB_JOURNAL(s)->j_num_work_lists--;
     }
-    if (uptodate)
-    	set_buffer_uptodate(bh) ;
-    else
-    	clear_buffer_uptodate(bh) ;
-    unlock_buffer(bh) ;
-    put_bh(bh) ;
-}
-static void submit_logged_buffer(struct buffer_head *bh) {
-    lock_buffer(bh) ;
-    get_bh(bh) ;
-    bh->b_end_io = reiserfs_end_buffer_io_sync ;
-    mark_buffer_notjournal_new(bh) ;
-    clear_buffer_dirty(bh) ;
-    submit_bh(WRITE, bh) ;
 }
 
 /* flush a journal list, both commit and real blocks
@@ -912,29 +1174,26 @@ static int flush_journal_list(struct sup
   unsigned long j_len_saved = jl->j_len ;
 
   if (j_len_saved <= 0) {
-    return 0 ;
+    BUG();
   }
 
   if (atomic_read(&SB_JOURNAL(s)->j_wcount) != 0) {
     reiserfs_warning("clm-2048: flush_journal_list called with wcount %d\n",
                       atomic_read(&SB_JOURNAL(s)->j_wcount)) ;
   }
-  /* if someone is getting the commit list, we must wait for them */
-  while (atomic_read(&(jl->j_commit_flushing))) { 
-    sleep_on(&(jl->j_commit_wait)) ;
-  }
-  /* if someone is flushing this list, we must wait for them */
-  while (atomic_read(&(jl->j_flushing))) {
-    sleep_on(&(jl->j_flush_wait)) ;
-  }
+  if (jl->j_trans_id == 0)
+    BUG();
 
-  /* this list is now ours, we can change anything we want */
-  atomic_set(&(jl->j_flushing), 1) ;
+  /* if flushall == 0, the lock is already held */
+  if (flushall) {
+      down(&SB_JOURNAL(s)->j_flush_sem);
+  } else if (!down_trylock(&SB_JOURNAL(s)->j_flush_sem)) {
+      BUG();
+  }
 
   count = 0 ;
   if (j_len_saved > SB_JOURNAL_TRANS_MAX(s)) {
-    reiserfs_panic(s, "journal-715: flush_journal_list, length is %lu, list number %d\n", j_len_saved, jl - SB_JOURNAL_LIST(s)) ;
-    atomic_dec(&(jl->j_flushing)) ;
+    reiserfs_panic(s, "journal-715: flush_journal_list, length is %lu, trans id %lu\n", j_len_saved, jl->j_trans_id);
     return 0 ;
   }
 
@@ -949,6 +1208,9 @@ static int flush_journal_list(struct sup
   */
   flush_commit_list(s, jl, 1) ;
 
+  if (!(jl->j_state & LIST_DIRTY))
+      BUG();
+
   /* are we done now? */
   if (atomic_read(&(jl->j_nonzerolen)) <= 0 && 
       atomic_read(&(jl->j_commit_left)) <= 0) {
@@ -984,13 +1246,13 @@ static int flush_journal_list(struct sup
       get_bh(saved_bh) ;
 
       if (buffer_journal_dirty(saved_bh)) {
+	if (!can_dirty(cn))
+	  BUG();
         was_jwait = 1 ;
-	mark_buffer_notjournal_dirty(saved_bh) ;
-        /* undo the inc from journal_mark_dirty */
-	put_bh(saved_bh) ;
-      }
-      if (can_dirty(cn)) {
         was_dirty = 1 ;
+      } else if (can_dirty(cn)) {
+        /* everything with !pjl && jwait should be writable */
+	BUG();
       }
     }
 
@@ -998,7 +1260,8 @@ static int flush_journal_list(struct sup
     ** sure they are commited, and don't try writing it to disk
     */
     if (pjl) {
-      flush_commit_list(s, pjl, 1) ;
+      if (atomic_read(&pjl->j_commit_left))
+        flush_commit_list(s, pjl, 1) ;
       goto free_cnode ;
     }
 
@@ -1017,22 +1280,17 @@ static int flush_journal_list(struct sup
 printk("journal-813: BAD! buffer %llu %cdirty %cjwait, not in a newer tranasction\n", (unsigned long long)saved_bh->b_blocknr,
         was_dirty ? ' ' : '!', was_jwait ? ' ' : '!') ;
     }
-    /* kupdate_one_transaction waits on the buffers it is writing, so we
-    ** should never see locked buffers here
-    */
-    if (buffer_locked(saved_bh)) {
-      printk("clm-2083: locked buffer %llu in flush_journal_list\n", 
-              (unsigned long long)saved_bh->b_blocknr) ;
-      wait_on_buffer(saved_bh) ;
-      if (!buffer_uptodate(saved_bh)) {
-        reiserfs_panic(s, "journal-923: buffer write failed\n") ;
-      }
-    } 
     if (was_dirty) { 
       /* we inc again because saved_bh gets decremented at free_cnode */
       get_bh(saved_bh) ;
       set_bit(BLOCK_NEEDS_FLUSH, &cn->state) ;
-      submit_logged_buffer(saved_bh) ;
+      lock_buffer(saved_bh);
+      if (cn->blocknr != saved_bh->b_blocknr)
+        BUG();
+      if (buffer_dirty(saved_bh))
+        submit_logged_buffer(saved_bh) ;
+      else
+        unlock_buffer(saved_bh);
       count++ ;
     } else {
       printk("clm-2082: Unable to flush buffer %llu in flush_journal_list\n",
@@ -1063,6 +1321,14 @@ free_cnode:
 	if (!buffer_uptodate(cn->bh)) {
 	  reiserfs_panic(s, "journal-949: buffer write failed\n") ;
 	}
+	/* note, we must clear the JDirty_wait bit after the up to date
+	** check, otherwise we race against our flushpage routine
+	*/
+	if (!test_and_clear_bit(BH_JDirty_wait, &cn->bh->b_state))
+	    BUG();
+
+        /* undo the inc from journal_mark_dirty */
+	put_bh(cn->bh) ;
         brelse(cn->bh) ;
       }
       cn = cn->next ;
@@ -1076,7 +1342,7 @@ flush_older_and_return:
   ** replayed after a crash
   */
   if (flushall) {
-    flush_older_journal_lists(s, jl, jl->j_trans_id) ;
+    flush_older_journal_lists(s, jl);
   } 
   
   /* before we can remove everything from the hash tables for this 
@@ -1091,181 +1357,224 @@ flush_older_and_return:
     update_journal_header_block(s, (jl->j_start + jl->j_len + 2) % SB_ONDISK_JOURNAL_SIZE(s), jl->j_trans_id) ;
   }
   remove_all_from_journal_list(s, jl, 0) ;
+  list_del(&jl->j_list);
+  SB_JOURNAL(s)->j_num_lists--;
+  del_from_work_list(s, jl);
+
+  if (SB_JOURNAL(s)->j_last_flush_id != 0 &&
+     (jl->j_trans_id - SB_JOURNAL(s)->j_last_flush_id) != 1) {
+      reiserfs_warning("clm-2201: last flush %lu, current %lu\n",
+                       SB_JOURNAL(s)->j_last_flush_id,
+		       jl->j_trans_id);
+  }
+  SB_JOURNAL(s)->j_last_flush_id = jl->j_trans_id;
+
+  /* not strictly required since we are freeing the list, but it should
+   * help find code using dead lists later on
+   */
   jl->j_len = 0 ;
   atomic_set(&(jl->j_nonzerolen), 0) ;
   jl->j_start = 0 ;
   jl->j_realblock = NULL ;
   jl->j_commit_bh = NULL ;
   jl->j_trans_id = 0 ;
-  atomic_dec(&(jl->j_flushing)) ;
-  wake_up(&(jl->j_flush_wait)) ;
+  jl->j_state = 0;
+  put_journal_list(s, jl);
+  if (flushall)
+    up(&SB_JOURNAL(s)->j_flush_sem);
   return 0 ;
 } 
 
-
-static int kupdate_one_transaction(struct super_block *s,
-                                    struct reiserfs_journal_list *jl) 
+static int write_one_transaction(struct super_block *s,
+                                 struct reiserfs_journal_list *jl,
+				 struct buffer_chunk *chunk)
 {
-    struct reiserfs_journal_list *pjl ; /* previous list for this cn */
-    struct reiserfs_journal_cnode *cn, *walk_cn ;
-    b_blocknr_t blocknr ;
-    int run = 0 ;
-    int orig_trans_id = jl->j_trans_id ;
-    struct buffer_head *saved_bh ; 
+    struct reiserfs_journal_cnode *cn;
     int ret = 0 ;
 
-    /* if someone is getting the commit list, we must wait for them */
-    while (atomic_read(&(jl->j_commit_flushing))) {
-        sleep_on(&(jl->j_commit_wait)) ;
-    }
-    /* if someone is flushing this list, we must wait for them */
-    while (atomic_read(&(jl->j_flushing))) {
-        sleep_on(&(jl->j_flush_wait)) ;
-    }
-    /* was it flushed while we slept? */
-    if (jl->j_len <= 0 || jl->j_trans_id != orig_trans_id) {
-        return 0 ;
+    jl->j_state |= LIST_TOUCHED;
+    del_from_work_list(s, jl);
+    if (jl->j_len == 0 || atomic_read(&jl->j_nonzerolen) == 0) {
+        return 0;
     }
 
-    /* this list is now ours, we can change anything we want */
-    atomic_set(&(jl->j_flushing), 1) ;
-
-loop_start:
     cn = jl->j_realblock ;
     while(cn) {
-        saved_bh = NULL ;
         /* if the blocknr == 0, this has been cleared from the hash,
         ** skip it
         */
         if (cn->blocknr == 0) {
             goto next ;
         }
+        if (cn->bh && can_dirty(cn) && buffer_dirty(cn->bh)) {
+	    struct buffer_head *tmp_bh;
+	    /* we can race against journal_mark_freed when we try
+	     * to lock_buffer(cn->bh), so we have to inc the buffer
+	     * count, and recheck things after locking
+	     */
+	    tmp_bh = cn->bh;
+	    get_bh(tmp_bh);
+	    lock_buffer(tmp_bh);
+	    if (cn->bh && can_dirty(cn) && buffer_dirty(tmp_bh)) {
+		if (!buffer_journal_dirty(tmp_bh) ||
+		    reiserfs_buffer_prepared(tmp_bh))
+		    BUG();
+		add_to_chunk(chunk, tmp_bh, NULL, write_chunk);
+		ret++;
+	    } else {
+		/* note, cn->bh might be null now */
+		unlock_buffer(tmp_bh);
+	    }
+	    put_bh(tmp_bh);
+        }
+next:
+        cn = cn->next ;
+	cond_resched();
+    }
+    return ret ;
+}
+
+/* used by flush_commit_list */
+static int dirty_one_transaction(struct super_block *s,
+                                 struct reiserfs_journal_list *jl)
+{
+    struct reiserfs_journal_cnode *cn;
+    struct reiserfs_journal_list *pjl;
+    int ret = 0 ;
+
+    jl->j_state |= LIST_DIRTY;
+    cn = jl->j_realblock ;
+    while(cn) {
         /* look for a more recent transaction that logged this
         ** buffer.  Only the most recent transaction with a buffer in
         ** it is allowed to send that buffer to disk
         */
-        pjl = find_newer_jl_for_cn(cn) ;
-        if (run == 0 && !pjl && cn->bh && buffer_journal_dirty(cn->bh) &&
-            can_dirty(cn)) 
-        {
-            if (!test_bit(BH_JPrepared, &cn->bh->b_state)) {
-                set_bit(BLOCK_NEEDS_FLUSH, &cn->state) ;
-		submit_logged_buffer(cn->bh) ;
-            } else {
-                /* someone else is using this buffer.  We can't 
-                ** send it to disk right now because they might
-                ** be changing/logging it.
-                */
-                ret = 1 ;
-            }
-        } else if (test_bit(BLOCK_NEEDS_FLUSH, &cn->state)) {
-            clear_bit(BLOCK_NEEDS_FLUSH, &cn->state) ;
-            if (!pjl && cn->bh) {
-                wait_on_buffer(cn->bh) ;
-            }
-            /* check again, someone could have logged while we scheduled */
-            pjl = find_newer_jl_for_cn(cn) ;
-
-            /* before the JDirty_wait bit is set, the 
-            ** buffer is added to the hash list.  So, if we are
-            ** run in the middle of a do_journal_end, we will notice
-            ** if this buffer was logged and added from the latest
-            ** transaction.  In this case, we don't want to decrement
-            ** b_count
-            */
-            if (!pjl && cn->bh && buffer_journal_dirty(cn->bh)) {
-                blocknr = cn->blocknr ;
-                walk_cn = cn ;
-                saved_bh= cn->bh ;
-                /* update all older transactions to show this block
-                ** was flushed
-                */
-                mark_buffer_notjournal_dirty(cn->bh) ;
-                while(walk_cn) {
-                    if (walk_cn->bh && walk_cn->blocknr == blocknr && 
-                         walk_cn->sb == cn->sb) {
-                        if (walk_cn->jlist) {
-                            atomic_dec(&(walk_cn->jlist->j_nonzerolen)) ;
-                        }
-                        walk_cn->bh = NULL ;
-                    }
-                    walk_cn = walk_cn->hnext ;
-                }
-                if (atomic_read(&saved_bh->b_count) < 1) {
-                    reiserfs_warning("clm-2081: bad count on %lu\n", 
-                                      saved_bh->b_blocknr) ;
-                }
-                brelse(saved_bh) ;
-            }
-        }
-        /*
-        ** if the more recent transaction is committed to the log,
-        ** this buffer can be considered flushed.  Decrement our
-        ** counters to reflect one less buffer that needs writing.
-        **
-        ** note, this relies on all of the above code being
-        ** schedule free once pjl comes back non-null.
-        */
-        if (pjl && cn->bh && atomic_read(&pjl->j_commit_left) == 0) {
-            atomic_dec(&cn->jlist->j_nonzerolen) ;
-            cn->bh = NULL ;
+	pjl = find_newer_jl_for_cn(cn) ;
+        if (!pjl && cn->blocknr && cn->bh && buffer_journal_dirty(cn->bh))
+	{
+	    if (!can_dirty(cn))
+	        BUG();
+	    /* if the buffer is prepared, it will either be logged
+	     * or restored.  If restored, we need to make sure
+	     * it actually gets marked dirty
+	     */
+	    mark_buffer_notjournal_new(cn->bh) ;
+	    if (test_bit(BH_JPrepared, &cn->bh->b_state)) {
+	        set_bit(BH_JRestore_dirty, &cn->bh->b_state);
+	    } else {
+	        set_bit(BH_JTest, &cn->bh->b_state);
+	        mark_buffer_dirty(cn->bh);
+	    }
         } 
-next:
         cn = cn->next ;
     }
-    /* the first run through the loop sends all the dirty buffers to
-    ** ll_rw_block.
-    ** the second run through the loop does all the accounting
-    */
-    if (run++ == 0) {
-        goto loop_start ;
-    }
-
-    atomic_set(&(jl->j_flushing), 0) ;
-    wake_up(&(jl->j_flush_wait)) ;
     return ret ;
 }
-/* since we never give dirty buffers to bdflush/kupdate, we have to
-** flush them ourselves.  This runs through the journal lists, finds
-** old metadata in need of flushing and sends it to disk.
-** this does not end transactions, commit anything, or free
-** cnodes.
-**
-** returns the highest transaction id that was flushed last time
-*/
-static unsigned long reiserfs_journal_kupdate(struct super_block *s) {
-    struct reiserfs_journal_list *jl ;
-    int i ;
-    int start ;
-    time_t age ;
-    int ret = 0 ;
 
-    start = SB_JOURNAL_LIST_INDEX(s) ;
+static int kupdate_transactions(struct super_block *s,
+                                   struct reiserfs_journal_list *jl,
+				   struct reiserfs_journal_list **next_jl,
+				   unsigned long *next_trans_id,
+				   int num_blocks,
+				   int num_trans) {
+    int ret = 0;
+    int written = 0 ;
+    int transactions_flushed = 0;
+    unsigned long orig_trans_id = jl->j_trans_id;
+    struct buffer_chunk chunk;
+    struct list_head *entry;
+    chunk.nr = 0;
+
+    down(&SB_JOURNAL(s)->j_flush_sem);
+    if (!journal_list_still_alive(s, orig_trans_id)) {
+	goto done;
+    }
+
+    /* we've got j_flush_sem held, nobody is going to delete any
+     * of these lists out from underneath us
+     */
+    while((num_trans && transactions_flushed < num_trans) ||
+          (!num_trans && written < num_blocks)) {
+
+	if (jl->j_len == 0 || (jl->j_state & LIST_TOUCHED) ||
+	    atomic_read(&jl->j_commit_left))
+	{
+	    del_from_work_list(s, jl);
+	    break;
+	}
+	ret = write_one_transaction(s, jl, &chunk);
 
-    /* safety check to prevent flush attempts during a mount */
-    if (start < 0) {
-        return 0 ;
-    }
-    i = (start + 1) % JOURNAL_LIST_COUNT ;
-    while(i != start) {
-        jl = SB_JOURNAL_LIST(s) + i  ;
-        age = get_seconds() - jl->j_timestamp ;
-        if (jl->j_len > 0 && // age >= (JOURNAL_MAX_COMMIT_AGE * 2) && 
-            atomic_read(&(jl->j_nonzerolen)) > 0 &&
-            atomic_read(&(jl->j_commit_left)) == 0) {
-
-            if (jl->j_trans_id == SB_JOURNAL(s)->j_trans_id) {
-                break ;
-            }
-            /* if ret was already 1, we want to preserve that */
-            ret |= kupdate_one_transaction(s, jl) ;
-        } 
-        if (atomic_read(&(jl->j_nonzerolen)) > 0) {
-            ret |= 1 ;
+	if (ret < 0)
+	    goto done;
+	transactions_flushed++;
+	written += ret;
+	entry = jl->j_list.next;
+
+	/* did we wrap? */
+	if (entry == &SB_JOURNAL(s)->j_journal_list) {
+	    break;
         }
-        i = (i + 1) % JOURNAL_LIST_COUNT ;
+	jl = JOURNAL_LIST_ENTRY(entry);
+
+	/* don't bother with older transactions */
+	if (jl->j_trans_id <= orig_trans_id)
+	    break;
     }
-    return ret ;
+    if (chunk.nr) {
+        write_chunk(&chunk);
+    }
+
+done:
+    up(&SB_JOURNAL(s)->j_flush_sem);
+    return ret;
+}
+
+/* for o_sync and fsync heavy applications, they tend to use
+** all the journa list slots with tiny transactions.  These
+** trigger lots and lots of calls to update the header block, which
+** adds seeks and slows things down.
+**
+** This function tries to clear out a large chunk of the journal lists
+** at once, which makes everything faster since only the newest journal
+** list updates the header block
+*/
+static int flush_used_journal_lists(struct super_block *s,
+                                    struct reiserfs_journal_list *jl) {
+    unsigned long len = 0;
+    unsigned long cur_len;
+    int ret;
+    int i;
+    struct reiserfs_journal_list *tjl;
+    struct reiserfs_journal_list *flush_jl;
+    unsigned long trans_id;
+
+    flush_jl = tjl = jl;
+
+    /* flush for 256 transactions or 256 blocks, whichever comes first */
+    for(i = 0 ; i < 256 && len < 256 ; i++) {
+	if (atomic_read(&tjl->j_commit_left) ||
+	    tjl->j_trans_id < jl->j_trans_id) {
+	    break;
+	}
+	cur_len = atomic_read(&tjl->j_nonzerolen);
+	if (cur_len > 0) {
+	    tjl->j_state &= ~LIST_TOUCHED;
+	}
+	len += cur_len;
+	flush_jl = tjl;
+	if (tjl->j_list.next == &SB_JOURNAL(s)->j_journal_list)
+	    break;
+	tjl = JOURNAL_LIST_ENTRY(tjl->j_list.next);
+    }
+    /* try to find a group of blocks we can flush across all the
+    ** transactions, but only bother if we've actually spanned
+    ** across multiple lists
+    */
+    if (flush_jl != jl) {
+        ret = kupdate_transactions(s, jl, &tjl, &trans_id, len, i);
+    }
+    flush_journal_list(s, flush_jl, 1);
+    return 0;
 }
 
 /*
@@ -1309,6 +1618,10 @@ void remove_journal_hash(struct super_bl
 }
 
 static void free_journal_ram(struct super_block *p_s_sb) {
+  reiserfs_kfree(SB_JOURNAL(p_s_sb)->j_current_jl,
+                 sizeof(struct reiserfs_journal_list), p_s_sb);
+  SB_JOURNAL(p_s_sb)->j_num_lists--;
+
   vfree(SB_JOURNAL(p_s_sb)->j_cnode_free_orig) ;
   free_list_bitmaps(p_s_sb, SB_JOURNAL(p_s_sb)->j_list_bitmap) ;
   free_bitmap_nodes(p_s_sb) ; /* must be after free_list_bitmaps */
@@ -1344,6 +1657,7 @@ static int do_journal_release(struct rei
 
   reiserfs_mounted_fs_count-- ;
   /* wait for all commits to finish */
+  cancel_delayed_work(&SB_JOURNAL(p_s_sb)->j_work);
   flush_workqueue(commit_wq);
   if (!reiserfs_mounted_fs_count) {
     destroy_workqueue(commit_wq);
@@ -1439,7 +1753,7 @@ static int journal_transaction_is_valid(
     }
     brelse(c_bh) ;
     reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1006: found valid "
-                   "transaction start offset %lu, len %d id %d\n", 
+                   "transaction start offset %llu, len %d id %d\n",
 		   d_bh->b_blocknr - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb), 
 		   get_desc_trans_len(desc), get_desc_trans_id(desc)) ;
     return 1 ;
@@ -1479,7 +1793,7 @@ static int journal_read_transaction(stru
   desc = (struct reiserfs_journal_desc *)d_bh->b_data ;
   trans_offset = d_bh->b_blocknr - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) ;
   reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1037: "
-                 "journal_read_transaction, offset %lu, len %d mount_id %d\n", 
+                 "journal_read_transaction, offset %llu, len %d mount_id %d\n",
 		 d_bh->b_blocknr - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb), 
 		 get_desc_trans_len(desc), get_desc_mount_id(desc)) ;
   if (get_desc_trans_id(desc) < oldest_trans_id) {
@@ -1507,7 +1821,7 @@ static int journal_read_transaction(stru
   commit = (struct reiserfs_journal_commit *)c_bh->b_data ;
   if (journal_compare_desc_commit(p_s_sb, desc, commit)) {
     reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal_read_transaction, "
-                   "commit offset %ld had bad time %d or length %d\n", 
+                   "commit offset %llu had bad time %d or length %d\n",
 		   c_bh->b_blocknr -  SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb), 
 		   get_commit_trans_id(commit), get_commit_trans_len(commit));
     brelse(c_bh) ;
@@ -1675,7 +1989,7 @@ static int journal_read(struct super_blo
   printk("reiserfs: checking transaction log (%s) for (%s)\n",
 	 bdevname(SB_JOURNAL(p_s_sb)->j_dev_bd, b),
 	 reiserfs_bdevname(p_s_sb));
-  start = get_seconds() ;
+  start = get_seconds();
 
   /* step 1, read in the journal header block.  Check the transaction it says 
   ** is the first unflushed, and if that transaction is not valid, 
@@ -1735,7 +2049,7 @@ static int journal_read(struct super_blo
 	oldest_start = d_bh->b_blocknr ;
 	newest_mount_id = get_desc_mount_id(desc) ;
 	reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1179: Setting "
-	               "oldest_start to offset %lu, trans_id %lu\n", 
+	               "oldest_start to offset %llu, trans_id %lu\n",
 		       oldest_start - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb), 
 		       oldest_trans_id) ;
       } else if (oldest_trans_id > get_desc_trans_id(desc)) { 
@@ -1763,7 +2077,7 @@ start_log_replay:
   cur_dblock = oldest_start ;
   if (oldest_trans_id)  {
     reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1206: Starting replay "
-                   "from offset %lu, trans_id %lu\n", 
+                   "from offset %llu, trans_id %lu\n",
 		   cur_dblock - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb), 
 		   oldest_trans_id) ;
 
@@ -1817,70 +2131,28 @@ start_log_replay:
   return 0 ;
 }
 
-
-struct reiserfs_journal_commit_task {
-  struct super_block *p_s_sb ;
-  int jindex ;
-  int wake_on_finish ; /* if this is one, we wake the task_done queue, if it
-                       ** is zero, we free the whole struct on finish
-		       */
-  struct reiserfs_journal_commit_task *self ;
-  struct work_struct work;
-} ;
-
-static void reiserfs_journal_commit_task_func(void *__ct) {
-  struct reiserfs_journal_commit_task *ct = __ct;
-  struct reiserfs_journal_list *jl ;
-
-  reiserfs_write_lock(ct->p_s_sb);
-
-  jl = SB_JOURNAL_LIST(ct->p_s_sb) + ct->jindex ;
-
-  flush_commit_list(ct->p_s_sb, SB_JOURNAL_LIST(ct->p_s_sb) + ct->jindex, 1) ; 
-
-  if (jl->j_len > 0 && atomic_read(&(jl->j_nonzerolen)) > 0 &&
-      atomic_read(&(jl->j_commit_left)) == 0) {
-    kupdate_one_transaction(ct->p_s_sb, jl) ;
-  }
-  reiserfs_kfree(ct->self, sizeof(struct reiserfs_journal_commit_task), ct->p_s_sb) ;
-  reiserfs_write_unlock(ct->p_s_sb);
-}
-
-static void setup_commit_task_arg(struct reiserfs_journal_commit_task *ct,
-                                  struct super_block *p_s_sb, 
-				  int jindex) {
-  if (!ct) {
-    reiserfs_panic(NULL, "journal-1360: setup_commit_task_arg called with NULL struct\n") ;
-  }
-  ct->p_s_sb = p_s_sb ;
-  ct->jindex = jindex ;
-  INIT_WORK(&ct->work, reiserfs_journal_commit_task_func, ct);
-  ct->self = ct ;
-}
-
-static void commit_flush_async(struct super_block *p_s_sb, int jindex) {
-  struct reiserfs_journal_commit_task *ct ;
-  /* using GFP_NOFS, GFP_KERNEL could try to flush inodes, which will try
-  ** to start/join a transaction, which will deadlock
-  */
-  ct = reiserfs_kmalloc(sizeof(struct reiserfs_journal_commit_task), GFP_NOFS, p_s_sb) ;
-  if (ct) {
-    setup_commit_task_arg(ct, p_s_sb, jindex) ;
-    queue_work(commit_wq, &ct->work) ;
-  } else {
-#ifdef CONFIG_REISERFS_CHECK
-    reiserfs_warning("journal-1540: kmalloc failed, doing sync commit\n") ;
-#endif
-    flush_commit_list(p_s_sb, SB_JOURNAL_LIST(p_s_sb) + jindex, 1) ;
-  }
+static struct reiserfs_journal_list *alloc_journal_list(struct super_block *s)
+{
+    struct reiserfs_journal_list *jl;
+retry:
+    jl = reiserfs_kmalloc(sizeof(struct reiserfs_journal_list), GFP_NOFS, s);
+    if (!jl) {
+	yield();
+	goto retry;
+    }
+    memset(jl, 0, sizeof(*jl));
+    INIT_LIST_HEAD(&jl->j_list);
+    INIT_LIST_HEAD(&jl->j_working_list);
+    INIT_LIST_HEAD(&jl->j_tail_bh_list);
+    INIT_LIST_HEAD(&jl->j_bh_list);
+    sema_init(&jl->j_commit_lock, 1);
+    SB_JOURNAL(s)->j_num_lists++;
+    get_journal_list(jl);
+    return jl;
 }
 
 static void journal_list_init(struct super_block *p_s_sb) {
-  int i ;
-  for (i = 0 ; i < JOURNAL_LIST_COUNT ; i++) {
-    init_waitqueue_head(&(SB_JOURNAL_LIST(p_s_sb)[i].j_commit_wait)) ;
-    init_waitqueue_head(&(SB_JOURNAL_LIST(p_s_sb)[i].j_flush_wait)) ;
-  }
+    SB_JOURNAL(p_s_sb)->j_current_jl = alloc_journal_list(p_s_sb);
 }
 
 static int release_journal_dev( struct super_block *super,
@@ -1971,6 +2243,7 @@ int journal_init(struct super_block *p_s
     struct reiserfs_super_block * rs;
     struct reiserfs_journal_header *jh;
     struct reiserfs_journal *journal;
+    struct reiserfs_journal_list *jl;
     char b[BDEVNAME_SIZE];
 
     journal = SB_JOURNAL(p_s_sb) = vmalloc(sizeof (struct reiserfs_journal)) ;
@@ -1981,6 +2254,8 @@ int journal_init(struct super_block *p_s
     memset(journal, 0, sizeof(struct reiserfs_journal)) ;
     INIT_LIST_HEAD(&SB_JOURNAL(p_s_sb)->j_bitmap_nodes) ;
     INIT_LIST_HEAD (&SB_JOURNAL(p_s_sb)->j_prealloc_list);
+    INIT_LIST_HEAD(&SB_JOURNAL(p_s_sb)->j_working_list);
+    INIT_LIST_HEAD(&SB_JOURNAL(p_s_sb)->j_journal_list);
     reiserfs_allocate_list_bitmaps(p_s_sb, SB_JOURNAL(p_s_sb)->j_list_bitmap, 
  				   SB_BMAP_NR(p_s_sb)) ;
     allocate_bitmap_nodes(p_s_sb) ;
@@ -2030,11 +2305,7 @@ int journal_init(struct super_block *p_s
      
   SB_JOURNAL_TRANS_MAX(p_s_sb)      = le32_to_cpu (jh->jh_journal.jp_journal_trans_max);
   SB_JOURNAL_MAX_BATCH(p_s_sb)      = le32_to_cpu (jh->jh_journal.jp_journal_max_batch);
-  if (commit_max_age != 0) {
-	  SB_JOURNAL_MAX_COMMIT_AGE(p_s_sb) = commit_max_age;
-  } else {
   SB_JOURNAL_MAX_COMMIT_AGE(p_s_sb) = le32_to_cpu (jh->jh_journal.jp_journal_max_commit_age);
-  }
   SB_JOURNAL_MAX_TRANS_AGE(p_s_sb)  = JOURNAL_MAX_TRANS_AGE;
 
   if (SB_JOURNAL_TRANS_MAX(p_s_sb)) {
@@ -2074,6 +2345,14 @@ int journal_init(struct super_block *p_s
       SB_JOURNAL_MAX_BATCH(p_s_sb) = (SB_JOURNAL_TRANS_MAX(p_s_sb)) * 9 / 10 ;
     }
   }
+
+  SB_JOURNAL_DEFAULT_MAX_COMMIT_AGE(p_s_sb) = SB_JOURNAL_MAX_COMMIT_AGE(p_s_sb);
+
+  if (commit_max_age != 0) {
+      SB_JOURNAL_MAX_COMMIT_AGE(p_s_sb) = commit_max_age;
+      SB_JOURNAL_MAX_TRANS_AGE(p_s_sb) = commit_max_age;
+  }
+
   printk ("Reiserfs journal params: device %s, size %u, "
 	  "journal first block %u, max trans len %u, max batch %u, "
 	  "max commit age %u, max trans age %u\n",
@@ -2088,14 +2367,9 @@ int journal_init(struct super_block *p_s
   brelse (bhjh);
      
   SB_JOURNAL(p_s_sb)->j_list_bitmap_index = 0 ;
-  SB_JOURNAL_LIST_INDEX(p_s_sb) = -10000 ; /* make sure flush_old_commits does not try to flush a list while replay is on */
-
-  /* clear out the journal list array */
-  memset(SB_JOURNAL_LIST(p_s_sb), 0, sizeof(struct reiserfs_journal_list) * JOURNAL_LIST_COUNT) ; 
   journal_list_init(p_s_sb) ;
 
   memset(SB_JOURNAL(p_s_sb)->j_list_hash_table, 0, JOURNAL_HASH_SIZE * sizeof(struct reiserfs_journal_cnode *)) ;
-  memset(journal_writers, 0, sizeof(char *) * 512) ; /* debug code */
 
   INIT_LIST_HEAD(&SB_JOURNAL(p_s_sb)->j_dirty_buffers) ;
   spin_lock_init(&SB_JOURNAL(p_s_sb)->j_dirty_buffers_lock) ;
@@ -2104,18 +2378,19 @@ int journal_init(struct super_block *p_s
   SB_JOURNAL(p_s_sb)->j_len = 0 ;
   SB_JOURNAL(p_s_sb)->j_len_alloc = 0 ;
   atomic_set(&(SB_JOURNAL(p_s_sb)->j_wcount), 0) ;
+  atomic_set(&(SB_JOURNAL(p_s_sb)->j_async_throttle), 0) ;
   SB_JOURNAL(p_s_sb)->j_bcount = 0 ;	  
   SB_JOURNAL(p_s_sb)->j_trans_start_time = 0 ;	  
   SB_JOURNAL(p_s_sb)->j_last = NULL ;	  
   SB_JOURNAL(p_s_sb)->j_first = NULL ;     
   init_waitqueue_head(&(SB_JOURNAL(p_s_sb)->j_join_wait)) ;
-  init_waitqueue_head(&(SB_JOURNAL(p_s_sb)->j_wait)) ; 
+  sema_init(&SB_JOURNAL(p_s_sb)->j_lock, 1);
+  sema_init(&SB_JOURNAL(p_s_sb)->j_flush_sem, 1);
 
   SB_JOURNAL(p_s_sb)->j_trans_id = 10 ;  
   SB_JOURNAL(p_s_sb)->j_mount_id = 10 ; 
   SB_JOURNAL(p_s_sb)->j_state = 0 ;
   atomic_set(&(SB_JOURNAL(p_s_sb)->j_jlock), 0) ;
-  atomic_set(&(SB_JOURNAL(p_s_sb)->j_wlock), 0) ;
   SB_JOURNAL(p_s_sb)->j_cnode_free_list = allocate_cnodes(num_cnodes) ;
   SB_JOURNAL(p_s_sb)->j_cnode_free_orig = SB_JOURNAL(p_s_sb)->j_cnode_free_list ;
   SB_JOURNAL(p_s_sb)->j_cnode_free = SB_JOURNAL(p_s_sb)->j_cnode_free_list ? num_cnodes : 0 ;
@@ -2123,8 +2398,9 @@ int journal_init(struct super_block *p_s
   SB_JOURNAL(p_s_sb)->j_must_wait = 0 ;
 
   init_journal_hash(p_s_sb) ;
-  SB_JOURNAL_LIST(p_s_sb)[0].j_list_bitmap = get_list_bitmap(p_s_sb, SB_JOURNAL_LIST(p_s_sb)) ;
-  if (!(SB_JOURNAL_LIST(p_s_sb)[0].j_list_bitmap)) {
+  jl = SB_JOURNAL(p_s_sb)->j_current_jl;
+  jl->j_list_bitmap = get_list_bitmap(p_s_sb, jl);
+  if (!jl->j_list_bitmap) {
     reiserfs_warning("journal-2005, get_list_bitmap failed for journal list 0\n") ;
     goto free_and_return;
   }
@@ -2132,16 +2408,12 @@ int journal_init(struct super_block *p_s
     reiserfs_warning("Replay Failure, unable to mount\n") ;
     goto free_and_return;
   }
-  SB_JOURNAL_LIST_INDEX(p_s_sb) = 0 ; /* once the read is done, we can set this
-                                         where it belongs */
-
-  if (reiserfs_dont_log (p_s_sb))
-    return 0;
 
   reiserfs_mounted_fs_count++ ;
   if (reiserfs_mounted_fs_count <= 1)
     commit_wq = create_workqueue("reiserfs");
 
+  INIT_WORK(&journal->j_work, flush_async_commits, p_s_sb);
   return 0 ;
 free_and_return:
   free_journal_ram(p_s_sb);
@@ -2155,7 +2427,8 @@ free_and_return:
 */
 int journal_transaction_should_end(struct reiserfs_transaction_handle *th, int new_alloc) {
   time_t now = get_seconds() ;
-  if (reiserfs_dont_log(th->t_super)) 
+  /* cannot restart while nested */
+  if (th->t_refcount > 1)
     return 0 ;
   if ( SB_JOURNAL(th->t_super)->j_must_wait > 0 ||
        (SB_JOURNAL(th->t_super)->j_len_alloc + new_alloc) >= SB_JOURNAL_MAX_BATCH(th->t_super) || 
@@ -2193,6 +2466,49 @@ void reiserfs_wait_on_write_block(struct
                !test_bit(WRITERS_BLOCKED, &SB_JOURNAL(s)->j_state)) ;
 }
 
+static void queue_log_writer(struct super_block *s) {
+    wait_queue_t wait;
+    set_bit(WRITERS_QUEUED, &SB_JOURNAL(s)->j_state);
+
+    /*
+     * we don't want to use wait_event here because
+     * we only want to wait once.
+     */
+    init_waitqueue_entry(&wait, current);
+    add_wait_queue(&SB_JOURNAL(s)->j_join_wait, &wait);
+    set_current_state(TASK_UNINTERRUPTIBLE);
+    if (test_bit(WRITERS_QUEUED, &SB_JOURNAL(s)->j_state))
+        schedule();
+    current->state = TASK_RUNNING;
+    remove_wait_queue(&SB_JOURNAL(s)->j_join_wait, &wait);
+}
+
+static void wake_queued_writers(struct super_block *s) {
+    if (test_and_clear_bit(WRITERS_QUEUED, &SB_JOURNAL(s)->j_state))
+        wake_up(&SB_JOURNAL(s)->j_join_wait);
+}
+
+static void let_transaction_grow(struct super_block *sb,
+                                 unsigned long trans_id)
+{
+    unsigned long bcount = SB_JOURNAL(sb)->j_bcount;
+    while(1) {
+	set_current_state(TASK_UNINTERRUPTIBLE);
+	schedule_timeout(1);
+	SB_JOURNAL(sb)->j_current_jl->j_state |= LIST_COMMIT_PENDING;
+        while ((atomic_read(&SB_JOURNAL(sb)->j_wcount) > 0 ||
+	        atomic_read(&SB_JOURNAL(sb)->j_jlock)) &&
+	       SB_JOURNAL(sb)->j_trans_id == trans_id) {
+	    queue_log_writer(sb);
+	}
+	if (SB_JOURNAL(sb)->j_trans_id != trans_id)
+	    break;
+	if (bcount == SB_JOURNAL(sb)->j_bcount)
+	    break;
+	bcount = SB_JOURNAL(sb)->j_bcount;
+    }
+}
+
 /* join == true if you must join an existing transaction.
 ** join == false if you can deal with waiting for others to finish
 **
@@ -2202,92 +2518,170 @@ void reiserfs_wait_on_write_block(struct
 static int do_journal_begin_r(struct reiserfs_transaction_handle *th, struct super_block * p_s_sb,unsigned long nblocks,int join) {
   time_t now = get_seconds() ;
   int old_trans_id  ;
+  struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
+  struct reiserfs_transaction_handle myth;
+  int sched_count = 0;
 
   reiserfs_check_lock_depth("journal_begin") ;
   RFALSE( p_s_sb->s_flags & MS_RDONLY, 
 	  "clm-2078: calling journal_begin on readonly FS") ;
 
-  if (reiserfs_dont_log(p_s_sb)) {
-    th->t_super = p_s_sb ; /* others will check this for the don't log flag */
-    return 0 ;
-  }
   PROC_INFO_INC( p_s_sb, journal.journal_being );
+  /* set here for journal_join */
+  th->t_refcount = 1;
+  th->t_super = p_s_sb ;
 
 relock:
   lock_journal(p_s_sb) ;
+  journal->j_bcount++;
 
-  if (test_bit(WRITERS_BLOCKED, &SB_JOURNAL(p_s_sb)->j_state)) {
+  if (test_bit(WRITERS_BLOCKED, &journal->j_state)) {
     unlock_journal(p_s_sb) ;
     reiserfs_wait_on_write_block(p_s_sb) ;
     PROC_INFO_INC( p_s_sb, journal.journal_relock_writers );
     goto relock ;
   }
+  now = get_seconds();
 
   /* if there is no room in the journal OR
   ** if this transaction is too old, and we weren't called joinable, wait for it to finish before beginning 
   ** we don't sleep if there aren't other writers
   */
 
-  if (  (!join && SB_JOURNAL(p_s_sb)->j_must_wait > 0) ||
-     ( !join && (SB_JOURNAL(p_s_sb)->j_len_alloc + nblocks + 2) >= SB_JOURNAL_MAX_BATCH(p_s_sb)) || 
-     (!join && atomic_read(&(SB_JOURNAL(p_s_sb)->j_wcount)) > 0 && SB_JOURNAL(p_s_sb)->j_trans_start_time > 0 && 
-      (now - SB_JOURNAL(p_s_sb)->j_trans_start_time) > SB_JOURNAL_MAX_TRANS_AGE(p_s_sb)) ||
-     (!join && atomic_read(&(SB_JOURNAL(p_s_sb)->j_jlock)) ) ||
-     (!join && SB_JOURNAL(p_s_sb)->j_cnode_free < (SB_JOURNAL_TRANS_MAX(p_s_sb) * 3))) {
+  if ( (!join && journal->j_must_wait > 0) ||
+     ( !join && (journal->j_len_alloc + nblocks + 2) >= SB_JOURNAL_MAX_BATCH(p_s_sb)) ||
+     (!join && atomic_read(&journal->j_wcount) > 0 && journal->j_trans_start_time > 0 &&
+      (now - journal->j_trans_start_time) > SB_JOURNAL_MAX_TRANS_AGE(p_s_sb)) ||
+     (!join && atomic_read(&journal->j_jlock)) ||
+     (!join && journal->j_cnode_free < (SB_JOURNAL_TRANS_MAX(p_s_sb) * 3))) {
 
+    old_trans_id = journal->j_trans_id;
     unlock_journal(p_s_sb) ; /* allow others to finish this transaction */
 
-    /* if writer count is 0, we can just force this transaction to end, and start
-    ** a new one afterwards.
-    */
-    if (atomic_read(&(SB_JOURNAL(p_s_sb)->j_wcount)) <= 0) {
-      struct reiserfs_transaction_handle myth ;
-      journal_join(&myth, p_s_sb, 1) ;
-      reiserfs_prepare_for_journal(p_s_sb, SB_BUFFER_WITH_SB(p_s_sb), 1) ;
-      journal_mark_dirty(&myth, p_s_sb, SB_BUFFER_WITH_SB(p_s_sb)) ;
-      do_journal_end(&myth, p_s_sb,1,COMMIT_NOW) ;
+    if (!join && (journal->j_len_alloc + nblocks + 2) >=
+        SB_JOURNAL_MAX_BATCH(p_s_sb) &&
+	((journal->j_len + nblocks + 2) * 100) < (journal->j_len_alloc * 75))
+    {
+	if (atomic_read(&journal->j_wcount) > 10) {
+	    sched_count++;
+	    queue_log_writer(p_s_sb);
+	    goto relock;
+	}
+    }
+    /* don't mess with joining the transaction if all we have to do is
+     * wait for someone else to do a commit
+     */
+    if (atomic_read(&journal->j_jlock)) {
+	while (journal->j_trans_id == old_trans_id &&
+	       atomic_read(&journal->j_jlock)) {
+	    queue_log_writer(p_s_sb);
+        }
+	goto relock;
+    }
+    journal_join(&myth, p_s_sb, 1) ;
+
+    /* someone might have ended the transaction while we joined */
+    if (old_trans_id != SB_JOURNAL(p_s_sb)->j_trans_id) {
+        do_journal_end(&myth, p_s_sb, 1, 0) ;
     } else {
-      /* but if the writer count isn't zero, we have to wait for the current writers to finish.
-      ** They won't batch on transaction end once we set j_jlock
-      */
-      atomic_set(&(SB_JOURNAL(p_s_sb)->j_jlock), 1) ;
-      old_trans_id = SB_JOURNAL(p_s_sb)->j_trans_id ;
-      while(atomic_read(&(SB_JOURNAL(p_s_sb)->j_jlock)) &&
-            SB_JOURNAL(p_s_sb)->j_trans_id == old_trans_id) {
-	sleep_on(&(SB_JOURNAL(p_s_sb)->j_join_wait)) ;
-      }
+        do_journal_end(&myth, p_s_sb, 1, COMMIT_NOW) ;
     }
+
     PROC_INFO_INC( p_s_sb, journal.journal_relock_wcount );
     goto relock ;
   }
-
-  if (SB_JOURNAL(p_s_sb)->j_trans_start_time == 0) { /* we are the first writer, set trans_id */
-    SB_JOURNAL(p_s_sb)->j_trans_start_time = now ;
+  /* we are the first writer, set trans_id */
+  if (journal->j_trans_start_time == 0) {
+    journal->j_trans_start_time = get_seconds();
   }
-  atomic_inc(&(SB_JOURNAL(p_s_sb)->j_wcount)) ;
-  SB_JOURNAL(p_s_sb)->j_len_alloc += nblocks ;
+  atomic_inc(&(journal->j_wcount)) ;
+  journal->j_len_alloc += nblocks ;
   th->t_blocks_logged = 0 ;
   th->t_blocks_allocated = nblocks ;
-  th->t_super = p_s_sb ;
-  th->t_trans_id = SB_JOURNAL(p_s_sb)->j_trans_id ;
-  th->t_caller = "Unknown" ;
+  th->t_trans_id = journal->j_trans_id ;
   unlock_journal(p_s_sb) ;
-  p_s_sb->s_dirt = 1; 
   return 0 ;
 }
 
+struct reiserfs_transaction_handle *
+reiserfs_persistent_transaction(struct super_block *s, int nblocks) {
+    int ret ;
+    struct reiserfs_transaction_handle *th ;
+
+    /* if we're nesting into an existing transaction.  It will be
+    ** persistent on its own
+    */
+    if (reiserfs_transaction_running(s)) {
+        th = current->journal_info ;
+	th->t_refcount++ ;
+	if (th->t_refcount < 2) {
+	    BUG() ;
+	}
+	return th ;
+    }
+    th = reiserfs_kmalloc(sizeof(struct reiserfs_transaction_handle), GFP_NOFS, s) ;
+    if (!th)
+       return NULL;
+    ret = journal_begin(th, s, nblocks) ;
+    if (ret) {
+	reiserfs_kfree(th, sizeof(struct reiserfs_transaction_handle), s) ;
+        return NULL;
+    }
+    return th ;
+}
+
+int
+reiserfs_end_persistent_transaction(struct reiserfs_transaction_handle *th) {
+    struct super_block *s = th->t_super;
+    int ret;
+    ret = journal_end(th, th->t_super, th->t_blocks_allocated);
+    if (th->t_refcount == 0)
+	reiserfs_kfree(th, sizeof(struct reiserfs_transaction_handle), s) ;
+    return ret;
+}
 
 static int journal_join(struct reiserfs_transaction_handle *th, struct super_block *p_s_sb, unsigned long nblocks) {
+  struct reiserfs_transaction_handle *cur_th = current->journal_info;
+
+  /* this keeps do_journal_end from NULLing out the current->journal_info
+  ** pointer
+  */
+  th->t_handle_save = cur_th ;
+  if (cur_th && cur_th->t_refcount > 1) {
+      BUG() ;
+  }
   return do_journal_begin_r(th, p_s_sb, nblocks, 1) ;
 }
 
 int journal_begin(struct reiserfs_transaction_handle *th, struct super_block  * p_s_sb, unsigned long nblocks) {
-  return do_journal_begin_r(th, p_s_sb, nblocks, 0) ;
-}
+    struct reiserfs_transaction_handle *cur_th = current->journal_info ;
+    int ret ;
 
-/* not used at all */
-int journal_prepare(struct super_block  * p_s_sb, struct buffer_head *bh) {
-  return 0 ;
+    th->t_handle_save = NULL ;
+    if (cur_th) {
+	/* we are nesting into the current transaction */
+	if (cur_th->t_super == p_s_sb) {
+	      cur_th->t_refcount++ ;
+	      memcpy(th, cur_th, sizeof(*th));
+	      if (th->t_refcount <= 1)
+		      printk("BAD: refcount <= 1, but journal_info != 0\n");
+	      return 0;
+	} else {
+	    /* we've ended up with a handle from a different filesystem.
+	    ** save it and restore on journal_end.  This should never
+	    ** really happen...
+	    */
+	    reiserfs_warning("clm-2100: nesting info a different FS\n") ;
+	    th->t_handle_save = current->journal_info ;
+	    current->journal_info = th;
+	}
+    } else {
+	current->journal_info = th;
+    }
+    ret = do_journal_begin_r(th, p_s_sb, nblocks, 0) ;
+    if (current->journal_info != th)
+        BUG() ;
+    return ret ;
 }
 
 /*
@@ -2305,18 +2699,14 @@ int journal_mark_dirty(struct reiserfs_t
   int prepared = 0 ;
 
   PROC_INFO_INC( p_s_sb, journal.mark_dirty );
-  if (reiserfs_dont_log(th->t_super)) {
-    mark_buffer_dirty(bh) ;
-    return 0 ;
-  }
-
   if (th->t_trans_id != SB_JOURNAL(p_s_sb)->j_trans_id) {
     reiserfs_panic(th->t_super, "journal-1577: handle trans id %ld != current trans id %ld\n", 
                    th->t_trans_id, SB_JOURNAL(p_s_sb)->j_trans_id);
   }
-  p_s_sb->s_dirt = 1 ;
+  p_s_sb->s_dirt = 1;
 
   prepared = test_and_clear_bit(BH_JPrepared, &bh->b_state) ;
+  clear_bit(BH_JRestore_dirty, &bh->b_state);
   /* already in this transaction, we are done */
   if (buffer_journaled(bh)) {
     PROC_INFO_INC( p_s_sb, journal.mark_dirty_already );
@@ -2327,14 +2717,12 @@ int journal_mark_dirty(struct reiserfs_t
   ** a dirty or journal_dirty or locked buffer to be logged, as some changes
   ** could get to disk too early.  NOT GOOD.
   */
-  if (!prepared || buffer_locked(bh)) {
+  if (!prepared || buffer_dirty(bh)) {
     printk("journal-1777: buffer %llu bad state %cPREPARED %cLOCKED %cDIRTY %cJDIRTY_WAIT\n", (unsigned long long)bh->b_blocknr, prepared ? ' ' : '!', 
                             buffer_locked(bh) ? ' ' : '!',
 			    buffer_dirty(bh) ? ' ' : '!',
 			    buffer_journal_dirty(bh) ? ' ' : '!') ;
-    show_reiserfs_locks() ;
   }
-  count_already_incd = clear_prepared_bits(bh) ;
 
   if (atomic_read(&(SB_JOURNAL(p_s_sb)->j_wcount)) <= 0) {
     printk("journal-1409: journal_mark_dirty returning because j_wcount was %d\n", atomic_read(&(SB_JOURNAL(p_s_sb)->j_wcount))) ;
@@ -2353,14 +2741,6 @@ int journal_mark_dirty(struct reiserfs_t
     mark_buffer_notjournal_dirty(bh) ;
   }
 
-  if (buffer_dirty(bh)) {
-    clear_buffer_dirty(bh) ;
-  }
-
-  if (buffer_journaled(bh)) { /* must double check after getting lock */
-    goto done ;
-  }
-
   if (SB_JOURNAL(p_s_sb)->j_len > SB_JOURNAL(p_s_sb)->j_len_alloc) {
     SB_JOURNAL(p_s_sb)->j_len_alloc = SB_JOURNAL(p_s_sb)->j_len + JOURNAL_PER_BALANCE_CNT ;
   }
@@ -2400,29 +2780,31 @@ int journal_mark_dirty(struct reiserfs_t
     SB_JOURNAL(p_s_sb)->j_first = cn ;
     SB_JOURNAL(p_s_sb)->j_last = cn ;
   }
-done:
-  return 0 ;
-}
-
-/*
-** if buffer already in current transaction, do a journal_mark_dirty
-** otherwise, just mark it dirty and move on.  Used for writes to meta blocks
-** that don't need journaling
-*/
-int journal_mark_dirty_nolog(struct reiserfs_transaction_handle *th, struct super_block *p_s_sb, struct buffer_head *bh) {
-  if (reiserfs_dont_log(th->t_super) || buffer_journaled(bh) || 
-      buffer_journal_dirty(bh)) {
-    return journal_mark_dirty(th, p_s_sb, bh) ;
-  }
-  if (get_journal_hash_dev(p_s_sb, SB_JOURNAL(p_s_sb)->j_list_hash_table, bh->b_blocknr)) {
-    return journal_mark_dirty(th, p_s_sb, bh) ;
-  }
-  mark_buffer_dirty(bh) ;
   return 0 ;
 }
 
 int journal_end(struct reiserfs_transaction_handle *th, struct super_block *p_s_sb, unsigned long nblocks) {
-  return do_journal_end(th, p_s_sb, nblocks, 0) ;
+  if (!current->journal_info && th->t_refcount > 1)
+    printk("REISER-NESTING: th NULL, refcount %d\n", th->t_refcount);
+
+  th->t_refcount--;
+  if (th->t_refcount > 0) {
+    struct reiserfs_transaction_handle *cur_th = current->journal_info ;
+
+    /* we aren't allowed to close a nested transaction on a different
+    ** filesystem from the one in the task struct
+    */
+    if (cur_th->t_super != th->t_super)
+      BUG() ;
+
+    if (th != cur_th) {
+      memcpy(current->journal_info, th, sizeof(*th));
+      th->t_trans_id = 0;
+    }
+    return 0;
+  } else {
+    return do_journal_end(th, p_s_sb, nblocks, 0) ;
+  }
 }
 
 /* removes from the current transaction, relsing and descrementing any counters.  
@@ -2464,7 +2846,6 @@ static int remove_from_transaction(struc
     if (atomic_read(&(bh->b_count)) < 0) {
       printk("journal-1752: remove from trans, b_count < 0\n") ;
     }
-    if (!buffer_locked(bh)) reiserfs_clean_and_file_buffer(bh) ; 
     ret = 1 ;
   }
   SB_JOURNAL(p_s_sb)->j_len-- ;
@@ -2490,7 +2871,7 @@ static int can_dirty(struct reiserfs_jou
   int can_dirty = 1 ;
   
   /* first test hprev.  These are all newer than cn, so any node here
-  ** with the name block number and dev means this node can't be sent
+  ** with the same block number and dev means this node can't be sent
   ** to disk right now.
   */
   while(cur && can_dirty) {
@@ -2520,6 +2901,10 @@ static int can_dirty(struct reiserfs_jou
 */
 int journal_end_sync(struct reiserfs_transaction_handle *th, struct super_block *p_s_sb, unsigned long nblocks) {
 
+  /* you can sync while nested, very, very bad */
+  if (th->t_refcount > 1) {
+    BUG() ;
+  }
   if (SB_JOURNAL(p_s_sb)->j_len == 0) {
     reiserfs_prepare_for_journal(p_s_sb, SB_BUFFER_WITH_SB(p_s_sb), 1) ;
     journal_mark_dirty(th, p_s_sb, SB_BUFFER_WITH_SB(p_s_sb)) ;
@@ -2527,88 +2912,68 @@ int journal_end_sync(struct reiserfs_tra
   return do_journal_end(th, p_s_sb, nblocks, COMMIT_NOW | WAIT) ;
 }
 
-int show_reiserfs_locks(void) {
-
-  dump_journal_writers() ;
-  return 0 ;
-}
-
 /*
-** used to get memory back from async commits that are floating around
-** and to reclaim any blocks deleted but unusable because their commits
-** haven't hit disk yet.  called from bitmap.c
-**
-** if it starts flushing things, it ors SCHEDULE_OCCURRED into repeat.
-** note, this is just if schedule has a chance of occurring.  I need to 
-** change flush_commit_lists to have a repeat parameter too.
-**
+** writeback the pending async commits to disk
 */
-void flush_async_commits(struct super_block *p_s_sb) {
-  int i ;
-
-  for (i = 0 ; i < JOURNAL_LIST_COUNT ; i++) {
-    if (i != SB_JOURNAL_LIST_INDEX(p_s_sb)) {
-      flush_commit_list(p_s_sb, SB_JOURNAL_LIST(p_s_sb) + i, 1) ; 
-    }
+static void flush_async_commits(void *p) {
+  struct super_block *p_s_sb = p;
+  struct reiserfs_journal_list *jl;
+  struct list_head *entry;
+
+  lock_kernel();
+  if (!list_empty(&SB_JOURNAL(p_s_sb)->j_journal_list)) {
+      /* last entry is the youngest, commit it and you get everything */
+      entry = SB_JOURNAL(p_s_sb)->j_journal_list.prev;
+      jl = JOURNAL_LIST_ENTRY(entry);
+      flush_commit_list(p_s_sb, jl, 1);
+  }
+  unlock_kernel();
+  /*
+   * this is a little racey, but there's no harm in missing
+   * the filemap_fdata_write
+   */
+  if (!atomic_read(&SB_JOURNAL(p_s_sb)->j_async_throttle)) {
+      atomic_inc(&SB_JOURNAL(p_s_sb)->j_async_throttle);
+      filemap_fdatawrite(p_s_sb->s_bdev->bd_inode->i_mapping);
+      atomic_dec(&SB_JOURNAL(p_s_sb)->j_async_throttle);
   }
 }
 
 /*
 ** flushes any old transactions to disk
 ** ends the current transaction if it is too old
-**
-** also calls flush_journal_list with old_only == 1, which allows me to reclaim
-** memory and such from the journal lists whose real blocks are all on disk.
-**
-** called by sync_dev_journal from buffer.c
 */
-int flush_old_commits(struct super_block *p_s_sb, int immediate) {
-  int i ;
-  int count = 0;
-  int start ; 
-  time_t now ; 
-  struct reiserfs_transaction_handle th ; 
-
-  start =  SB_JOURNAL_LIST_INDEX(p_s_sb) ;
-  now = get_seconds() ;
-
-  /* safety check so we don't flush while we are replaying the log during mount */
-  if (SB_JOURNAL_LIST_INDEX(p_s_sb) < 0) {
-    return 0  ;
-  }
-  /* starting with oldest, loop until we get to the start */
-  i = (SB_JOURNAL_LIST_INDEX(p_s_sb) + 1) % JOURNAL_LIST_COUNT ;
-  while(i != start) {
-    if (SB_JOURNAL_LIST(p_s_sb)[i].j_len > 0 && ((now - SB_JOURNAL_LIST(p_s_sb)[i].j_timestamp) > SB_JOURNAL_MAX_COMMIT_AGE(p_s_sb) ||
-       immediate)) {
-      /* we have to check again to be sure the current transaction did not change */
-      if (i != SB_JOURNAL_LIST_INDEX(p_s_sb))  {
-	flush_commit_list(p_s_sb, SB_JOURNAL_LIST(p_s_sb) + i, 1) ;
-      }
-    }
-    i = (i + 1) % JOURNAL_LIST_COUNT ;
-    count++ ;
-  }
-  /* now, check the current transaction.  If there are no writers, and it is too old, finish it, and
-  ** force the commit blocks to disk
-  */
-  if (!immediate && atomic_read(&(SB_JOURNAL(p_s_sb)->j_wcount)) <= 0 &&  
-     SB_JOURNAL(p_s_sb)->j_trans_start_time > 0 && 
-     SB_JOURNAL(p_s_sb)->j_len > 0 && 
-     (now - SB_JOURNAL(p_s_sb)->j_trans_start_time) > SB_JOURNAL_MAX_TRANS_AGE(p_s_sb)) {
-    journal_join(&th, p_s_sb, 1) ;
-    reiserfs_prepare_for_journal(p_s_sb, SB_BUFFER_WITH_SB(p_s_sb), 1) ;
-    journal_mark_dirty(&th, p_s_sb, SB_BUFFER_WITH_SB(p_s_sb)) ;
-    do_journal_end(&th, p_s_sb,1, COMMIT_NOW) ;
-  } else if (immediate) { /* belongs above, but I wanted this to be very explicit as a special case.  If they say to 
-                             flush, we must be sure old transactions hit the disk too. */
-    journal_join(&th, p_s_sb, 1) ;
-    reiserfs_prepare_for_journal(p_s_sb, SB_BUFFER_WITH_SB(p_s_sb), 1) ;
-    journal_mark_dirty(&th, p_s_sb, SB_BUFFER_WITH_SB(p_s_sb)) ;
-    do_journal_end(&th, p_s_sb,1, COMMIT_NOW | WAIT) ;
-  }
-   reiserfs_journal_kupdate(p_s_sb) ;
-   return 0 ;
+int reiserfs_flush_old_commits(struct super_block *p_s_sb) {
+    time_t now ;
+    struct reiserfs_transaction_handle th ;
+
+    now = get_seconds();
+    /* safety check so we don't flush while we are replaying the log during
+     * mount
+     */
+    if (list_empty(&SB_JOURNAL(p_s_sb)->j_journal_list)) {
+	return 0  ;
+    }
+
+    /* check the current transaction.  If there are no writers, and it is
+     * too old, finish it, and force the commit blocks to disk
+     */
+    if (atomic_read(&(SB_JOURNAL(p_s_sb)->j_wcount)) <= 0 &&
+        SB_JOURNAL(p_s_sb)->j_trans_start_time > 0 &&
+        SB_JOURNAL(p_s_sb)->j_len > 0 &&
+        (now - SB_JOURNAL(p_s_sb)->j_trans_start_time) >
+	SB_JOURNAL_MAX_TRANS_AGE(p_s_sb))
+    {
+	journal_join(&th, p_s_sb, 1) ;
+	reiserfs_prepare_for_journal(p_s_sb, SB_BUFFER_WITH_SB(p_s_sb), 1) ;
+	journal_mark_dirty(&th, p_s_sb, SB_BUFFER_WITH_SB(p_s_sb)) ;
+
+	/* we're only being called from kreiserfsd, it makes no sense to do
+	** an async commit so that kreiserfsd can do it later
+	*/
+	do_journal_end(&th, p_s_sb,1, COMMIT_NOW | WAIT) ;
+    }
+    return p_s_sb->s_dirt;
 }
 
 /*
@@ -2629,6 +2994,7 @@ static int check_journal_end(struct reis
   int flush = flags & FLUSH_ALL ;
   int commit_now = flags & COMMIT_NOW ;
   int wait_on_commit = flags & WAIT ;
+  struct reiserfs_journal_list *jl;
 
   if (th->t_trans_id != SB_JOURNAL(p_s_sb)->j_trans_id) {
     reiserfs_panic(th->t_super, "journal-1577: handle trans id %ld != current trans id %ld\n", 
@@ -2645,13 +3011,7 @@ static int check_journal_end(struct reis
   ** care of in this trans
   */
   if (SB_JOURNAL(p_s_sb)->j_len == 0) {
-    int wcount = atomic_read(&(SB_JOURNAL(p_s_sb)->j_wcount)) ;
-    unlock_journal(p_s_sb) ;
-    if (atomic_read(&(SB_JOURNAL(p_s_sb)->j_jlock))  > 0 && wcount <= 0) {
-      atomic_dec(&(SB_JOURNAL(p_s_sb)->j_jlock)) ;
-      wake_up(&(SB_JOURNAL(p_s_sb)->j_join_wait)) ;
-    }
-    return 0 ;
+    BUG();
   }
   /* if wcount > 0, and we are called to with flush or commit_now,
   ** we wait on j_join_wait.  We will wake up when the last writer has
@@ -2661,24 +3021,38 @@ static int check_journal_end(struct reis
   */
   if (atomic_read(&(SB_JOURNAL(p_s_sb)->j_wcount)) > 0) {
     if (flush || commit_now) {
-      int orig_jindex = SB_JOURNAL_LIST_INDEX(p_s_sb) ;
+      unsigned trans_id ;
+
+      jl = SB_JOURNAL(p_s_sb)->j_current_jl;
+      trans_id = jl->j_trans_id;
+      if (wait_on_commit)
+        jl->j_state |= LIST_COMMIT_PENDING;
       atomic_set(&(SB_JOURNAL(p_s_sb)->j_jlock), 1) ;
       if (flush) {
         SB_JOURNAL(p_s_sb)->j_next_full_flush = 1 ;
       }
       unlock_journal(p_s_sb) ;
+
       /* sleep while the current transaction is still j_jlocked */
-      while(atomic_read(&(SB_JOURNAL(p_s_sb)->j_jlock)) && 
-            SB_JOURNAL(p_s_sb)->j_trans_id == th->t_trans_id) {
-	sleep_on(&(SB_JOURNAL(p_s_sb)->j_join_wait)) ;
-      }
-      if (commit_now) {
-	if (wait_on_commit) {
-	  flush_commit_list(p_s_sb,  SB_JOURNAL_LIST(p_s_sb) + orig_jindex, 1) ;
-	} else {
-	  commit_flush_async(p_s_sb, orig_jindex) ; 
+      while(SB_JOURNAL(p_s_sb)->j_trans_id == trans_id) {
+	if (atomic_read(&SB_JOURNAL(p_s_sb)->j_jlock)) {
+	    queue_log_writer(p_s_sb);
+        } else {
+	    lock_journal(p_s_sb);
+	    if (SB_JOURNAL(p_s_sb)->j_trans_id == trans_id) {
+	        atomic_set(&(SB_JOURNAL(p_s_sb)->j_jlock), 1) ;
+	    }
+	    unlock_journal(p_s_sb);
 	}
       }
+      if (SB_JOURNAL(p_s_sb)->j_trans_id == trans_id) {
+          BUG();
+      }
+      if (commit_now && journal_list_still_alive(p_s_sb, trans_id) &&
+          wait_on_commit)
+      {
+	  flush_commit_list(p_s_sb, jl, 1) ;
+      }
       return 0 ;
     } 
     unlock_journal(p_s_sb) ;
@@ -2686,7 +3060,7 @@ static int check_journal_end(struct reis
   }
 
   /* deal with old transactions where we are the last writers */
-  now = get_seconds() ;
+  now = get_seconds();
   if ((now - SB_JOURNAL(p_s_sb)->j_trans_start_time) > SB_JOURNAL_MAX_TRANS_AGE(p_s_sb)) {
     commit_now = 1 ;
     SB_JOURNAL(p_s_sb)->j_next_async_flush = 1 ;
@@ -2726,25 +3100,21 @@ int journal_mark_freed(struct reiserfs_t
   struct buffer_head *bh = NULL ;
   struct reiserfs_list_bitmap *jb = NULL ;
   int cleaned = 0 ;
-  
-  if (reiserfs_dont_log(th->t_super)) {
-    bh = sb_find_get_block(p_s_sb, blocknr) ;
-    if (bh && buffer_dirty (bh)) {
-      printk ("journal_mark_freed(dont_log): dirty buffer on hash list: %lx %d\n", bh->b_state, blocknr);
-      BUG ();
-    }
-    brelse (bh);
-    return 0 ;
+
+  cn = get_journal_hash_dev(p_s_sb, SB_JOURNAL(p_s_sb)->j_hash_table, blocknr);
+  if (cn && cn->bh) {
+      bh = cn->bh ;
+      get_bh(bh) ;
   }
-  bh = sb_find_get_block(p_s_sb, blocknr) ;
   /* if it is journal new, we just remove it from this transaction */
   if (bh && buffer_journal_new(bh)) {
     mark_buffer_notjournal_new(bh) ;
     clear_prepared_bits(bh) ;
+    reiserfs_clean_and_file_buffer(bh) ;
     cleaned = remove_from_transaction(p_s_sb, blocknr, cleaned) ;
   } else {
     /* set the bit for this block in the journal bitmap for this transaction */
-    jb = SB_JOURNAL_LIST(p_s_sb)[SB_JOURNAL_LIST_INDEX(p_s_sb)].j_list_bitmap ;
+    jb = SB_JOURNAL(p_s_sb)->j_current_jl->j_list_bitmap;
     if (!jb) {
       reiserfs_panic(p_s_sb, "journal-1702: journal_mark_freed, journal_list_bitmap is NULL\n") ;
     }
@@ -2754,6 +3124,7 @@ int journal_mark_freed(struct reiserfs_t
 
     if (bh) {
       clear_prepared_bits(bh) ;
+      reiserfs_clean_and_file_buffer(bh) ;
     }
     cleaned = remove_from_transaction(p_s_sb, blocknr, cleaned) ;
 
@@ -2785,7 +3156,6 @@ int journal_mark_freed(struct reiserfs_t
   }
 
   if (bh) {
-    reiserfs_clean_and_file_buffer(bh) ;
     put_bh(bh) ; /* get_hash grabs the buffer */
     if (atomic_read(&(bh->b_count)) < 0) {
       printk("journal-2165: bh->b_count < 0\n") ;
@@ -2795,50 +3165,84 @@ int journal_mark_freed(struct reiserfs_t
 }
 
 void reiserfs_update_inode_transaction(struct inode *inode) {
-  
-  REISERFS_I(inode)->i_trans_index = SB_JOURNAL_LIST_INDEX(inode->i_sb);
-
+  REISERFS_I(inode)->i_jl = SB_JOURNAL(inode->i_sb)->j_current_jl;
   REISERFS_I(inode)->i_trans_id = SB_JOURNAL(inode->i_sb)->j_trans_id ;
 }
 
-static int reiserfs_inode_in_this_transaction(struct inode *inode) {
-  if (REISERFS_I(inode)->i_trans_id == SB_JOURNAL(inode->i_sb)->j_trans_id || 
-      REISERFS_I(inode)->i_trans_id == 0) {
-    return 1; 
-  } 
-  return 0 ;
+static void __commit_trans_jl(struct inode *inode, unsigned long id,
+                                 struct reiserfs_journal_list *jl)
+{
+    struct reiserfs_transaction_handle th ;
+    struct super_block *sb = inode->i_sb ;
+
+    /* is it from the current transaction, or from an unknown transaction? */
+    if (id == SB_JOURNAL(sb)->j_trans_id) {
+	jl = SB_JOURNAL(sb)->j_current_jl;
+	/* try to let other writers come in and grow this transaction */
+	let_transaction_grow(sb, id);
+	if (SB_JOURNAL(sb)->j_trans_id != id) {
+	    goto flush_commit_only;
+	}
+
+	journal_begin(&th, sb, 1) ;
+
+	/* someone might have ended this transaction while we joined */
+	if (SB_JOURNAL(sb)->j_trans_id != id) {
+	    reiserfs_prepare_for_journal(sb, SB_BUFFER_WITH_SB(sb), 1) ;
+	    journal_mark_dirty(&th, sb, SB_BUFFER_WITH_SB(sb)) ;
+	    journal_end(&th, sb, 1) ;
+	    goto flush_commit_only;
+	}
+
+	journal_end_sync(&th, sb, 1) ;
+
+    } else {
+	/* this gets tricky, we have to make sure the journal list in
+	 * the inode still exists.  We know the list is still around
+	 * if we've got a larger transaction id than the oldest list
+	 */
+flush_commit_only:
+	if (journal_list_still_alive(inode->i_sb, id)) {
+	    flush_commit_list(sb, jl, 1) ;
+	}
+    }
+    /* otherwise the list is gone, and long since committed */
 }
 
 void reiserfs_commit_for_inode(struct inode *inode) {
-  struct reiserfs_journal_list *jl ;
-  struct reiserfs_transaction_handle th ;
-  struct super_block *sb = inode->i_sb ;
-
-  jl = SB_JOURNAL_LIST(sb) + REISERFS_I(inode)->i_trans_index ;
-
-  /* is it from the current transaction, or from an unknown transaction? */
-  if (reiserfs_inode_in_this_transaction(inode)) {
-    journal_join(&th, sb, 1) ;
-    reiserfs_update_inode_transaction(inode) ;
-    journal_end_sync(&th, sb, 1) ;
-  } else if (jl->j_trans_id == REISERFS_I(inode)->i_trans_id) {
-    flush_commit_list(sb, jl, 1) ;
-  }
-  /* if the transaction id does not match, this list is long since flushed
-  ** and we don't have to do anything here
-  */
+    unsigned long id = REISERFS_I(inode)->i_trans_id;
+    struct reiserfs_journal_list *jl = REISERFS_I(inode)->i_jl;
+
+    /* for the whole inode, assume unset id means it was
+     * changed in the current transaction.  More conservative
+     */
+    if (!id || !jl) {
+	reiserfs_update_inode_transaction(inode) ;
+	id = REISERFS_I(inode)->i_trans_id;
+	/* jl will be updated in __commit_trans_jl */
+    }
+
+    __commit_trans_jl(inode, id, jl);
 }
 
 void reiserfs_restore_prepared_buffer(struct super_block *p_s_sb, 
                                       struct buffer_head *bh) {
-  PROC_INFO_INC( p_s_sb, journal.restore_prepared );
-  if (reiserfs_dont_log (p_s_sb))
-    return;
-
-  if (!bh) {
-    return ;
-  }
-  clear_bit(BH_JPrepared, &bh->b_state) ;
+    PROC_INFO_INC( p_s_sb, journal.restore_prepared );
+    if (!bh) {
+	return ;
+    }
+    if (test_and_clear_bit(BH_JRestore_dirty, &bh->b_state) &&
+	buffer_journal_dirty(bh)) {
+	struct reiserfs_journal_cnode *cn;
+	cn = get_journal_hash_dev(p_s_sb,
+	                          SB_JOURNAL(p_s_sb)->j_list_hash_table,
+				  bh->b_blocknr);
+	if (cn && can_dirty(cn)) {
+	    set_bit(BH_JTest, &bh->b_state);
+	    mark_buffer_dirty(bh);
+        }
+    }
+    clear_bit(BH_JPrepared, &bh->b_state) ;
 }
 
 extern struct tree_balance *cur_tb ;
@@ -2849,29 +3253,39 @@ extern struct tree_balance *cur_tb ;
 ** wait on it.
 ** 
 */
-void reiserfs_prepare_for_journal(struct super_block *p_s_sb, 
+int reiserfs_prepare_for_journal(struct super_block *p_s_sb,
                                   struct buffer_head *bh, int wait) {
-  int retry_count = 0 ;
-
   PROC_INFO_INC( p_s_sb, journal.prepare );
-  if (reiserfs_dont_log (p_s_sb))
-    return;
 
-  while(!test_bit(BH_JPrepared, &bh->b_state) ||
-        (wait && buffer_locked(bh))) {
-    if (buffer_journaled(bh)) {
-      set_bit(BH_JPrepared, &bh->b_state) ;
-      return ;
-    }
-    set_bit(BH_JPrepared, &bh->b_state) ;
-    if (wait) {
-      RFALSE( buffer_locked(bh) && cur_tb != NULL,
-	      "waiting while do_balance was running\n") ;
-      wait_on_buffer(bh) ;
+    if (test_set_buffer_locked(bh)) {
+	if (!wait)
+	    return 0;
+	lock_buffer(bh);
+    }
+    set_bit(BH_JPrepared, &bh->b_state);
+    if (test_clear_buffer_dirty(bh) && buffer_journal_dirty(bh))  {
+	clear_bit(BH_JTest, &bh->b_state);
+	set_bit(BH_JRestore_dirty, &bh->b_state);
+    }
+    unlock_buffer(bh);
+    return 1;
+}
+
+static void flush_old_journal_lists(struct super_block *s) {
+    struct reiserfs_journal_list *jl;
+    struct list_head *entry;
+    time_t now = get_seconds();
+
+    while(!list_empty(&SB_JOURNAL(s)->j_journal_list)) {
+        entry = SB_JOURNAL(s)->j_journal_list.next;
+	jl = JOURNAL_LIST_ENTRY(entry);
+	/* this check should always be run, to send old lists to disk */
+	if (jl->j_timestamp < (now - (JOURNAL_MAX_TRANS_AGE * 4))) {
+	    flush_used_journal_lists(s, jl);
+	} else {
+	    break;
+	}
     }
-    PROC_INFO_INC( p_s_sb, journal.prepare_retry );
-    retry_count++ ;
-  }
 }
 
 /* 
@@ -2890,19 +3304,24 @@ static int do_journal_end(struct reiserf
   struct buffer_head *c_bh ; /* commit bh */
   struct buffer_head *d_bh ; /* desc bh */
   int cur_write_start = 0 ; /* start index of current log write */
-  int cur_blocks_left = 0 ; /* number of journal blocks left to write */
   int old_start ;
   int i ;
-  int jindex ;
-  int orig_jindex ;
   int flush = flags & FLUSH_ALL ;
-  int commit_now = flags & COMMIT_NOW ;
   int wait_on_commit = flags & WAIT ;
-  struct reiserfs_super_block *rs ; 
-  int trans_half ;
+  struct reiserfs_journal_list *jl, *temp_jl;
+  struct list_head *entry, *safe;
+  unsigned long jindex;
+  unsigned long commit_trans_id;
+  int trans_half;
 
-  if (reiserfs_dont_log(th->t_super)) {
-    return 0 ;
+  if (th->t_refcount > 1)
+    BUG() ;
+
+  current->journal_info = th->t_handle_save;
+  reiserfs_check_lock_depth("journal end");
+  if (SB_JOURNAL(p_s_sb)->j_len == 0) {
+      reiserfs_prepare_for_journal(p_s_sb, SB_BUFFER_WITH_SB(p_s_sb), 1) ;
+      journal_mark_dirty(th, p_s_sb, SB_BUFFER_WITH_SB(p_s_sb)) ;
   }
 
   lock_journal(p_s_sb) ;
@@ -2911,24 +3330,25 @@ static int do_journal_end(struct reiserf
     flush = 1 ;
   }
   if (SB_JOURNAL(p_s_sb)->j_next_async_flush) {
-    flags |= COMMIT_NOW ;
-    commit_now = 1 ;
+    flags |= COMMIT_NOW | WAIT;
+    wait_on_commit = 1;
   }
 
   /* check_journal_end locks the journal, and unlocks if it does not return 1 
   ** it tells us if we should continue with the journal_end, or just return
   */
   if (!check_journal_end(th, p_s_sb, nblocks, flags)) {
-    return 0 ;
+    p_s_sb->s_dirt = 1;
+    wake_queued_writers(p_s_sb);
+    reiserfs_async_progress_wait(p_s_sb);
+    goto out ;
   }
 
   /* check_journal_end might set these, check again */
   if (SB_JOURNAL(p_s_sb)->j_next_full_flush) {
     flush = 1 ;
   }
-  if (SB_JOURNAL(p_s_sb)->j_next_async_flush) {
-    commit_now = 1 ;
-  }
+
   /*
   ** j must wait means we have to flush the log blocks, and the real blocks for
   ** this transaction
@@ -2938,14 +3358,16 @@ static int do_journal_end(struct reiserf
   }
 
 #ifdef REISERFS_PREALLOCATE
+  /* quota ops might need to nest, setup the journal_info pointer for them */
+  current->journal_info = th ;
   reiserfs_discard_all_prealloc(th); /* it should not involve new blocks into
 				      * the transaction */
+  current->journal_info = th->t_handle_save ;
 #endif
   
-  rs = SB_DISK_SUPER_BLOCK(p_s_sb) ;
   /* setup description block */
   d_bh = journal_getblk(p_s_sb, SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) + SB_JOURNAL(p_s_sb)->j_start) ; 
-  set_buffer_uptodate(d_bh) ;
+  set_buffer_uptodate(d_bh);
   desc = (struct reiserfs_journal_desc *)(d_bh)->b_data ;
   memset(d_bh->b_data, 0, d_bh->b_size) ;
   memcpy(get_journal_desc_magic (d_bh), JOURNAL_DESC_MAGIC, 8) ;
@@ -2960,28 +3382,33 @@ static int do_journal_end(struct reiserf
   set_buffer_uptodate(c_bh) ;
 
   /* init this journal list */
-  atomic_set(&(SB_JOURNAL_LIST(p_s_sb)[SB_JOURNAL_LIST_INDEX(p_s_sb)].j_older_commits_done), 0) ;
-  SB_JOURNAL_LIST(p_s_sb)[SB_JOURNAL_LIST_INDEX(p_s_sb)].j_trans_id = SB_JOURNAL(p_s_sb)->j_trans_id ;
-  SB_JOURNAL_LIST(p_s_sb)[SB_JOURNAL_LIST_INDEX(p_s_sb)].j_timestamp = SB_JOURNAL(p_s_sb)->j_trans_start_time ;
-  SB_JOURNAL_LIST(p_s_sb)[SB_JOURNAL_LIST_INDEX(p_s_sb)].j_commit_bh = c_bh ;
-  SB_JOURNAL_LIST(p_s_sb)[SB_JOURNAL_LIST_INDEX(p_s_sb)].j_start = SB_JOURNAL(p_s_sb)->j_start ;
-  SB_JOURNAL_LIST(p_s_sb)[SB_JOURNAL_LIST_INDEX(p_s_sb)].j_len = SB_JOURNAL(p_s_sb)->j_len ;  
-  atomic_set(&(SB_JOURNAL_LIST(p_s_sb)[SB_JOURNAL_LIST_INDEX(p_s_sb)].j_nonzerolen), SB_JOURNAL(p_s_sb)->j_len) ;
-  atomic_set(&(SB_JOURNAL_LIST(p_s_sb)[SB_JOURNAL_LIST_INDEX(p_s_sb)].j_commit_left), SB_JOURNAL(p_s_sb)->j_len + 2);
-  SB_JOURNAL_LIST(p_s_sb)[SB_JOURNAL_LIST_INDEX(p_s_sb)].j_realblock = NULL ;
-  atomic_set(&(SB_JOURNAL_LIST(p_s_sb)[SB_JOURNAL_LIST_INDEX(p_s_sb)].j_commit_flushing), 1) ;
-  atomic_set(&(SB_JOURNAL_LIST(p_s_sb)[SB_JOURNAL_LIST_INDEX(p_s_sb)].j_flushing), 1) ;
-
-  /* which is faster, locking/unlocking at the start and end of the for
-  ** or locking once per iteration around the insert_journal_hash?
-  ** eitherway, we are write locking insert_journal_hash.  The ENTIRE FOR
-  ** LOOP MUST not cause schedule to occur.
-  */
+  jl = SB_JOURNAL(p_s_sb)->j_current_jl;
+
+  /* we lock the commit before doing anything because
+   * we want to make sure nobody tries to run flush_commit_list until
+   * the new transaction is fully setup, and we've already flushed the
+   * ordered bh list
+   */
+  down(&jl->j_commit_lock);
 
-  /* for each real block, add it to the journal list hash,
+  /* save the transaction id in case we need to commit it later */
+  commit_trans_id = jl->j_trans_id;
+
+  atomic_set(&jl->j_older_commits_done, 0) ;
+  jl->j_trans_id = SB_JOURNAL(p_s_sb)->j_trans_id ;
+  jl->j_timestamp = SB_JOURNAL(p_s_sb)->j_trans_start_time ;
+  jl->j_commit_bh = c_bh ;
+  jl->j_start = SB_JOURNAL(p_s_sb)->j_start ;
+  jl->j_len = SB_JOURNAL(p_s_sb)->j_len ;
+  atomic_set(&jl->j_nonzerolen, SB_JOURNAL(p_s_sb)->j_len) ;
+  atomic_set(&jl->j_commit_left, SB_JOURNAL(p_s_sb)->j_len + 2);
+  jl->j_realblock = NULL ;
+
+  /* The ENTIRE FOR LOOP MUST not cause schedule to occur.
+  **  for each real block, add it to the journal list hash,
   ** copy into real block index array in the commit or desc block
   */
-  trans_half = journal_trans_half(p_s_sb->s_blocksize) ;
+  trans_half = journal_trans_half(p_s_sb->s_blocksize);
   for (i = 0, cn = SB_JOURNAL(p_s_sb)->j_first ; cn ; cn = cn->next, i++) {
     if (test_bit(BH_JDirty, &cn->bh->b_state) ) {
       jl_cn = get_cnode(p_s_sb) ;
@@ -2989,7 +3416,7 @@ static int do_journal_end(struct reiserf
         reiserfs_panic(p_s_sb, "journal-1676, get_cnode returned NULL\n") ;
       }
       if (i == 0) {
-        SB_JOURNAL_LIST(p_s_sb)[SB_JOURNAL_LIST_INDEX(p_s_sb)].j_realblock = jl_cn ;
+        jl->j_realblock = jl_cn ;
       }
       jl_cn->prev = last_cn ;
       jl_cn->next = NULL ;
@@ -3005,9 +3432,9 @@ static int do_journal_end(struct reiserf
       }
       jl_cn->blocknr = cn->bh->b_blocknr ; 
       jl_cn->state = 0 ;
-      jl_cn->sb = p_s_sb ;
+      jl_cn->sb = p_s_sb;
       jl_cn->bh = cn->bh ;
-      jl_cn->jlist = SB_JOURNAL_LIST(p_s_sb) + SB_JOURNAL_LIST_INDEX(p_s_sb) ;
+      jl_cn->jlist = jl;
       insert_journal_hash(SB_JOURNAL(p_s_sb)->j_list_hash_table, jl_cn) ; 
       if (i < trans_half) {
 	desc->j_realblock[i] = cpu_to_le32(cn->bh->b_blocknr) ;
@@ -3018,7 +3445,6 @@ static int do_journal_end(struct reiserf
       i-- ;
     }
   }
-  
   set_desc_trans_len(desc, SB_JOURNAL(p_s_sb)->j_len) ;
   set_desc_mount_id(desc, SB_JOURNAL(p_s_sb)->j_mount_id) ;
   set_desc_trans_id(desc, SB_JOURNAL(p_s_sb)->j_trans_id) ;
@@ -3026,84 +3452,54 @@ static int do_journal_end(struct reiserf
 
   /* special check in case all buffers in the journal were marked for not logging */
   if (SB_JOURNAL(p_s_sb)->j_len == 0) {
-    brelse(d_bh) ;
-    brelse(c_bh) ;
-    unlock_journal(p_s_sb) ;
-    printk("journal-2020: do_journal_end: BAD desc->j_len is ZERO\n") ;
-    atomic_set(&(SB_JOURNAL(p_s_sb)->j_jlock), 0) ;
-    wake_up(&(SB_JOURNAL(p_s_sb)->j_join_wait)) ;
-    return 0 ;
+    BUG();
   }
 
+  /* we're about to dirty all the log blocks, mark the description block
+   * dirty now too.  Don't mark the commit block dirty until all the
+   * others are on disk
+   */
+  mark_buffer_dirty(d_bh);
+
   /* first data block is j_start + 1, so add one to cur_write_start wherever you use it */
   cur_write_start = SB_JOURNAL(p_s_sb)->j_start ;
-  cur_blocks_left = SB_JOURNAL(p_s_sb)->j_len  ;
   cn = SB_JOURNAL(p_s_sb)->j_first ;
   jindex = 1 ; /* start at one so we don't get the desc again */
-  while(cur_blocks_left > 0) {
+  while(cn) {
+    clear_bit(BH_JNew, &(cn->bh->b_state)) ;
     /* copy all the real blocks into log area.  dirty log blocks */
     if (test_bit(BH_JDirty, &cn->bh->b_state)) {
       struct buffer_head *tmp_bh ;
       tmp_bh =  journal_getblk(p_s_sb, SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) + 
 		       ((cur_write_start + jindex) % SB_ONDISK_JOURNAL_SIZE(p_s_sb))) ;
-      set_buffer_uptodate(tmp_bh) ;
+      set_buffer_uptodate(tmp_bh);
       memcpy(tmp_bh->b_data, cn->bh->b_data, cn->bh->b_size) ;  
+      mark_buffer_dirty(tmp_bh);
       jindex++ ;
-    } else {
-      /* JDirty cleared sometime during transaction.  don't log this one */
-      printk("journal-2048: do_journal_end: BAD, buffer in journal hash, but not JDirty!\n") ;
-    }
-    cn = cn->next ;
-    cur_blocks_left-- ;
-  }
-
-  /* we are done  with both the c_bh and d_bh, but
-  ** c_bh must be written after all other commit blocks,
-  ** so we dirty/relse c_bh in flush_commit_list, with commit_left <= 1.
-  */
-
-  /* now loop through and mark all buffers from this transaction as JDirty_wait
-  ** clear the JDirty bit, clear BH_JNew too.  
-  ** if they weren't JDirty, they weren't logged, just relse them and move on
-  */
-  cn = SB_JOURNAL(p_s_sb)->j_first ; 
-  while(cn) {
-    clear_bit(BH_JNew, &(cn->bh->b_state)) ;
-    if (test_bit(BH_JDirty, &(cn->bh->b_state))) {
       set_bit(BH_JDirty_wait, &(cn->bh->b_state)) ; 
       clear_bit(BH_JDirty, &(cn->bh->b_state)) ;
     } else {
+      /* JDirty cleared sometime during transaction.  don't log this one */
+      reiserfs_warning("journal-2048: do_journal_end: BAD, buffer in journal hash, but not JDirty!\n") ;
       brelse(cn->bh) ;
     }
     next = cn->next ;
     free_cnode(p_s_sb, cn) ;
     cn = next ;
+    cond_resched();
   }
 
-  /* unlock the journal list for committing and flushing */
-  atomic_set(&(SB_JOURNAL_LIST(p_s_sb)[SB_JOURNAL_LIST_INDEX(p_s_sb)].j_commit_flushing), 0) ;
-  atomic_set(&(SB_JOURNAL_LIST(p_s_sb)[SB_JOURNAL_LIST_INDEX(p_s_sb)].j_flushing), 0) ;
-
-  orig_jindex = SB_JOURNAL_LIST_INDEX(p_s_sb) ;
-  jindex = (SB_JOURNAL_LIST_INDEX(p_s_sb) + 1) % JOURNAL_LIST_COUNT ; 
-  SB_JOURNAL_LIST_INDEX(p_s_sb) = jindex ;
-
-  /* write any buffers that must hit disk before this commit is done */
-  fsync_buffers_list(&(SB_JOURNAL(p_s_sb)->j_dirty_buffers_lock),
-		     &(SB_JOURNAL(p_s_sb)->j_dirty_buffers)) ;
+  /* we are done  with both the c_bh and d_bh, but
+  ** c_bh must be written after all other commit blocks,
+  ** so we dirty/relse c_bh in flush_commit_list, with commit_left <= 1.
+  */
 
-  /* honor the flush and async wishes from the caller */
-  if (flush) {
-  
-    flush_commit_list(p_s_sb, SB_JOURNAL_LIST(p_s_sb) + orig_jindex, 1) ;
-    flush_journal_list(p_s_sb,  SB_JOURNAL_LIST(p_s_sb) + orig_jindex , 1) ;  
-  } else if (commit_now) {
-    if (wait_on_commit) {
-      flush_commit_list(p_s_sb, SB_JOURNAL_LIST(p_s_sb) + orig_jindex, 1) ;
-    } else {
-      commit_flush_async(p_s_sb, orig_jindex) ; 
-    }
-  }
+  SB_JOURNAL(p_s_sb)->j_current_jl = alloc_journal_list(p_s_sb);
+
+  /* now it is safe to insert this transaction on the main list */
+  list_add_tail(&jl->j_list, &SB_JOURNAL(p_s_sb)->j_journal_list);
+  list_add_tail(&jl->j_working_list, &SB_JOURNAL(p_s_sb)->j_working_list);
+  SB_JOURNAL(p_s_sb)->j_num_work_lists++;
 
   /* reset journal values for the next transaction */
   old_start = SB_JOURNAL(p_s_sb)->j_start ;
@@ -3115,57 +3511,108 @@ static int do_journal_end(struct reiserf
   SB_JOURNAL(p_s_sb)->j_len = 0 ;
   SB_JOURNAL(p_s_sb)->j_trans_start_time = 0 ;
   SB_JOURNAL(p_s_sb)->j_trans_id++ ;
+  SB_JOURNAL(p_s_sb)->j_current_jl->j_trans_id = SB_JOURNAL(p_s_sb)->j_trans_id;
   SB_JOURNAL(p_s_sb)->j_must_wait = 0 ;
   SB_JOURNAL(p_s_sb)->j_len_alloc = 0 ;
   SB_JOURNAL(p_s_sb)->j_next_full_flush = 0 ;
   SB_JOURNAL(p_s_sb)->j_next_async_flush = 0 ;
   init_journal_hash(p_s_sb) ; 
 
+  // make sure reiserfs_add_jh sees the new current_jl before we
+  // write out the tails
+  smp_mb();
+
+  /* tail conversion targets have to hit the disk before we end the
+   * transaction.  Otherwise a later transaction might repack the tail
+   * before this transaction commits, leaving the data block unflushed and
+   * clean, if we crash before the later transaction commits, the data block
+   * is lost.
+   */
+  if (!list_empty(&jl->j_tail_bh_list)) {
+      unlock_kernel();
+      write_ordered_buffers(&SB_JOURNAL(p_s_sb)->j_dirty_buffers_lock,
+			    SB_JOURNAL(p_s_sb), jl, &jl->j_tail_bh_list);
+      lock_kernel();
+  }
+  if (!list_empty(&jl->j_tail_bh_list))
+      BUG();
+  up(&jl->j_commit_lock);
+
+  /* honor the flush wishes from the caller, simple commits can
+  ** be done outside the journal lock, they are done below
+  **
+  ** if we don't flush the commit list right now, we put it into
+  ** the work queue so the people waiting on the async progress work
+  ** queue don't wait for this proc to flush journal lists and such.
+  */
+  if (flush) {
+    flush_commit_list(p_s_sb, jl, 1) ;
+    flush_journal_list(p_s_sb, jl, 1) ;
+  } else if (!(jl->j_state & LIST_COMMIT_PENDING))
+    queue_delayed_work(commit_wq, &SB_JOURNAL(p_s_sb)->j_work, HZ/10);
+
+
   /* if the next transaction has any chance of wrapping, flush 
   ** transactions that might get overwritten.  If any journal lists are very 
   ** old flush them as well.  
   */
-  for (i = 0 ; i < JOURNAL_LIST_COUNT ; i++) {
-    jindex = i ;
-    if (SB_JOURNAL_LIST(p_s_sb)[jindex].j_len > 0 && SB_JOURNAL(p_s_sb)->j_start <= SB_JOURNAL_LIST(p_s_sb)[jindex].j_start) {
-      if ((SB_JOURNAL(p_s_sb)->j_start + SB_JOURNAL_TRANS_MAX(p_s_sb) + 1) >= SB_JOURNAL_LIST(p_s_sb)[jindex].j_start) {
-	flush_journal_list(p_s_sb, SB_JOURNAL_LIST(p_s_sb) + jindex, 1) ; 
-      }
-    } else if (SB_JOURNAL_LIST(p_s_sb)[jindex].j_len > 0 && 
-              (SB_JOURNAL(p_s_sb)->j_start + SB_JOURNAL_TRANS_MAX(p_s_sb) + 1) > SB_ONDISK_JOURNAL_SIZE(p_s_sb)) {
-      if (((SB_JOURNAL(p_s_sb)->j_start + SB_JOURNAL_TRANS_MAX(p_s_sb) + 1) % SB_ONDISK_JOURNAL_SIZE(p_s_sb)) >= 
-            SB_JOURNAL_LIST(p_s_sb)[jindex].j_start) {
-	flush_journal_list(p_s_sb, SB_JOURNAL_LIST(p_s_sb) + jindex, 1 ) ; 
+first_jl:
+  list_for_each_safe(entry, safe, &SB_JOURNAL(p_s_sb)->j_journal_list) {
+    temp_jl = JOURNAL_LIST_ENTRY(entry);
+    if (SB_JOURNAL(p_s_sb)->j_start <= temp_jl->j_start) {
+      if ((SB_JOURNAL(p_s_sb)->j_start + SB_JOURNAL_TRANS_MAX(p_s_sb) + 1) >=
+          temp_jl->j_start)
+      {
+	flush_used_journal_lists(p_s_sb, temp_jl);
+	goto first_jl;
+      } else if ((SB_JOURNAL(p_s_sb)->j_start +
+                  SB_JOURNAL_TRANS_MAX(p_s_sb) + 1) <
+		  SB_ONDISK_JOURNAL_SIZE(p_s_sb))
+      {
+          /* if we don't cross into the next transaction and we don't
+	   * wrap, there is no way we can overlap any later transactions
+	   * break now
+	   */
+	  break;
+      }
+    } else if ((SB_JOURNAL(p_s_sb)->j_start +
+                SB_JOURNAL_TRANS_MAX(p_s_sb) + 1) >
+		SB_ONDISK_JOURNAL_SIZE(p_s_sb))
+    {
+      if (((SB_JOURNAL(p_s_sb)->j_start + SB_JOURNAL_TRANS_MAX(p_s_sb) + 1) %
+            SB_ONDISK_JOURNAL_SIZE(p_s_sb)) >= temp_jl->j_start)
+      {
+	flush_used_journal_lists(p_s_sb, temp_jl);
+	goto first_jl;
+      } else {
+	  /* we don't overlap anything from out start to the end of the
+	   * log, and our wrapped portion doesn't overlap anything at
+	   * the start of the log.  We can break
+	   */
+	  break;
       }
-    } 
-    /* this check should always be run, to send old lists to disk */
-    if (SB_JOURNAL_LIST(p_s_sb)[jindex].j_len > 0 && 
-              SB_JOURNAL_LIST(p_s_sb)[jindex].j_timestamp < 
-	      (get_seconds() - (SB_JOURNAL_MAX_TRANS_AGE(p_s_sb) * 4))) {
-	flush_journal_list(p_s_sb, SB_JOURNAL_LIST(p_s_sb) + jindex, 1 ) ; 
     }
   }
+  flush_old_journal_lists(p_s_sb);
 
-  /* if the next journal_list is still in use, flush it */
-  if (SB_JOURNAL_LIST(p_s_sb)[SB_JOURNAL_LIST_INDEX(p_s_sb)].j_len != 0) {
-    flush_journal_list(p_s_sb, SB_JOURNAL_LIST(p_s_sb) + SB_JOURNAL_LIST_INDEX(p_s_sb), 1) ; 
-  }
-
-  /* we don't want anyone flushing the new transaction's list */
-  atomic_set(&(SB_JOURNAL_LIST(p_s_sb)[SB_JOURNAL_LIST_INDEX(p_s_sb)].j_commit_flushing), 1) ;
-  atomic_set(&(SB_JOURNAL_LIST(p_s_sb)[SB_JOURNAL_LIST_INDEX(p_s_sb)].j_flushing), 1) ;
-  SB_JOURNAL_LIST(p_s_sb)[SB_JOURNAL_LIST_INDEX(p_s_sb)].j_list_bitmap = get_list_bitmap(p_s_sb, SB_JOURNAL_LIST(p_s_sb) + 
-											 SB_JOURNAL_LIST_INDEX(p_s_sb)) ;
+  SB_JOURNAL(p_s_sb)->j_current_jl->j_list_bitmap = get_list_bitmap(p_s_sb, SB_JOURNAL(p_s_sb)->j_current_jl) ;
 
-  if (!(SB_JOURNAL_LIST(p_s_sb)[SB_JOURNAL_LIST_INDEX(p_s_sb)].j_list_bitmap)) {
+  if (!(SB_JOURNAL(p_s_sb)->j_current_jl->j_list_bitmap)) {
     reiserfs_panic(p_s_sb, "journal-1996: do_journal_end, could not get a list bitmap\n") ;
   }
-  unlock_journal(p_s_sb) ;
+
   atomic_set(&(SB_JOURNAL(p_s_sb)->j_jlock), 0) ;
+  unlock_journal(p_s_sb) ;
   /* wake up any body waiting to join. */
+  clear_bit(WRITERS_QUEUED, &SB_JOURNAL(p_s_sb)->j_state);
   wake_up(&(SB_JOURNAL(p_s_sb)->j_join_wait)) ;
+
+  if (!flush && wait_on_commit &&
+      journal_list_still_alive(p_s_sb, commit_trans_id)) {
+	  flush_commit_list(p_s_sb, jl, 1) ;
+  }
+out:
+  reiserfs_check_lock_depth("journal end2");
+  th->t_trans_id = 0;
   return 0 ;
 }
-
-
-
--- diff/fs/reiserfs/namei.c	2004-01-19 10:22:59.000000000 +0000
+++ source/fs/reiserfs/namei.c	2004-04-21 10:45:35.789262704 +0100
@@ -575,7 +575,6 @@ static int reiserfs_create (struct inode
 
     reiserfs_write_lock(dir->i_sb);
     journal_begin(&th, dir->i_sb, jbegin_count) ;
-    th.t_caller = "create" ;
     retval = reiserfs_new_inode (&th, dir, mode, 0, 0/*i_size*/, dentry, inode);
     if (retval) {
         goto out_failed;
@@ -738,7 +737,6 @@ static int reiserfs_rmdir (struct inode 
 {
     int retval;
     struct inode * inode;
-    int windex ;
     struct reiserfs_transaction_handle th ;
     int jbegin_count; 
     INITIALIZE_PATH (path);
@@ -750,7 +748,6 @@ static int reiserfs_rmdir (struct inode 
 
     reiserfs_write_lock(dir->i_sb);
     journal_begin(&th, dir->i_sb, jbegin_count) ;
-    windex = push_journal_writer("reiserfs_rmdir") ;
 
     de.de_gen_number_bit_string = 0;
     if ( (retval = reiserfs_find_entry (dir, dentry->d_name.name, dentry->d_name.len, &path, &de)) == NAME_NOT_FOUND) {
@@ -799,7 +796,6 @@ static int reiserfs_rmdir (struct inode 
     /* prevent empty directory from getting lost */
     add_save_link (&th, inode, 0/* not truncate */);
 
-    pop_journal_writer(windex) ;
     journal_end(&th, dir->i_sb, jbegin_count) ;
     reiserfs_check_path(&path) ;
     reiserfs_write_unlock(dir->i_sb);
@@ -810,7 +806,6 @@ static int reiserfs_rmdir (struct inode 
        reiserfs_cut_from_item, or reiserfs_cut_from_item does not
        release path if operation was not complete */
     pathrelse (&path);
-    pop_journal_writer(windex) ;
     journal_end(&th, dir->i_sb, jbegin_count) ;
     reiserfs_write_unlock(dir->i_sb);
     return retval;	
@@ -822,7 +817,6 @@ static int reiserfs_unlink (struct inode
     struct inode * inode;
     struct reiserfs_dir_entry de;
     INITIALIZE_PATH (path);
-    int windex ;
     struct reiserfs_transaction_handle th ;
     int jbegin_count;
     unsigned long savelink;
@@ -835,7 +829,6 @@ static int reiserfs_unlink (struct inode
 
     reiserfs_write_lock(dir->i_sb);
     journal_begin(&th, dir->i_sb, jbegin_count) ;
-    windex = push_journal_writer("reiserfs_unlink") ;
 	
     de.de_gen_number_bit_string = 0;
     if ( (retval = reiserfs_find_entry (dir, dentry->d_name.name, dentry->d_name.len, &path, &de)) == NAME_NOT_FOUND) {
@@ -888,7 +881,6 @@ static int reiserfs_unlink (struct inode
        /* prevent file from getting lost */
        add_save_link (&th, inode, 0/* not truncate */);
 
-    pop_journal_writer(windex) ;
     journal_end(&th, dir->i_sb, jbegin_count) ;
     reiserfs_check_path(&path) ;
     reiserfs_write_unlock(dir->i_sb);
@@ -896,7 +888,6 @@ static int reiserfs_unlink (struct inode
 
  end_unlink:
     pathrelse (&path);
-    pop_journal_writer(windex) ;
     journal_end(&th, dir->i_sb, jbegin_count) ;
     reiserfs_check_path(&path) ;
     reiserfs_write_unlock(dir->i_sb);
@@ -979,7 +970,6 @@ static int reiserfs_link (struct dentry 
 {
     int retval;
     struct inode *inode = old_dentry->d_inode;
-    int windex ;
     struct reiserfs_transaction_handle th ;
     int jbegin_count = JOURNAL_PER_BALANCE_CNT * 3; 
 
@@ -997,7 +987,6 @@ static int reiserfs_link (struct dentry 
     inode->i_nlink++;
 
     journal_begin(&th, dir->i_sb, jbegin_count) ;
-    windex = push_journal_writer("reiserfs_link") ;
 
     /* create new entry */
     retval = reiserfs_add_entry (&th, dir, dentry->d_name.name, dentry->d_name.len,
@@ -1008,7 +997,6 @@ static int reiserfs_link (struct dentry 
 
     if (retval) {
 	inode->i_nlink--;
-	pop_journal_writer(windex) ;
 	journal_end(&th, dir->i_sb, jbegin_count) ;
 	reiserfs_write_unlock(dir->i_sb);
 	return retval;
@@ -1019,7 +1007,6 @@ static int reiserfs_link (struct dentry 
 
     atomic_inc(&inode->i_count) ;
     d_instantiate(dentry, inode);
-    pop_journal_writer(windex) ;
     journal_end(&th, dir->i_sb, jbegin_count) ;
     reiserfs_write_unlock(dir->i_sb);
     return 0;
@@ -1083,7 +1070,6 @@ static int reiserfs_rename (struct inode
     struct item_head new_entry_ih, old_entry_ih, dot_dot_ih ;
     struct reiserfs_dir_entry old_de, new_de, dot_dot_de;
     struct inode * old_inode, * new_dentry_inode;
-    int windex ;
     struct reiserfs_transaction_handle th ;
     int jbegin_count ; 
     umode_t old_inode_mode;
@@ -1151,7 +1137,6 @@ static int reiserfs_rename (struct inode
     }
 
     journal_begin(&th, old_dir->i_sb, jbegin_count) ;
-    windex = push_journal_writer("reiserfs_rename") ;
 
     /* add new entry (or find the existing one) */
     retval = reiserfs_add_entry (&th, new_dir, new_dentry->d_name.name, new_dentry->d_name.len, 
@@ -1162,7 +1147,6 @@ static int reiserfs_rename (struct inode
 			    "vs-7050: new entry is found, new inode == 0\n");
 	}
     } else if (retval) {
-	pop_journal_writer(windex) ;
 	journal_end(&th, old_dir->i_sb, jbegin_count) ;
 	reiserfs_write_unlock(old_dir->i_sb);
 	return retval;
@@ -1315,14 +1299,11 @@ static int reiserfs_rename (struct inode
 	reiserfs_update_sd (&th, new_dentry_inode);
     }
 
-    pop_journal_writer(windex) ;
     journal_end(&th, old_dir->i_sb, jbegin_count) ;
     reiserfs_write_unlock(old_dir->i_sb);
     return 0;
 }
 
-
-
 /*
  * directories can handle most operations...
  */
--- diff/fs/reiserfs/objectid.c	2002-10-16 04:27:54.000000000 +0100
+++ source/fs/reiserfs/objectid.c	2004-04-21 10:45:35.790262552 +0100
@@ -86,7 +86,6 @@ __u32 reiserfs_get_unused_objectid (stru
     }
 
     journal_mark_dirty(th, s, SB_BUFFER_WITH_SB (s));
-    s->s_dirt = 1;
     return unused_objectid;
 }
 
@@ -105,8 +104,6 @@ void reiserfs_release_objectid (struct r
 
     reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s), 1) ;
     journal_mark_dirty(th, s, SB_BUFFER_WITH_SB (s)); 
-    s->s_dirt = 1;
-
 
     /* start at the beginning of the objectid map (i = 0) and go to
        the end of it (i = disk_sb->s_oid_cursize).  Linear search is
--- diff/fs/reiserfs/prints.c	2004-02-18 08:54:12.000000000 +0000
+++ source/fs/reiserfs/prints.c	2004-04-21 10:45:35.790262552 +0100
@@ -333,7 +333,6 @@ extern struct tree_balance * cur_tb;
 
 void reiserfs_panic (struct super_block * sb, const char * fmt, ...)
 {
-  show_reiserfs_locks() ;
   do_reiserfs_warning(fmt);
   printk ( KERN_EMERG "%s", error_buf);
   BUG ();
--- diff/fs/reiserfs/procfs.c	2004-01-19 10:22:59.000000000 +0000
+++ source/fs/reiserfs/procfs.c	2004-04-21 10:45:35.791262400 +0100
@@ -87,7 +87,7 @@ static int show_super(struct seq_file *m
 	struct reiserfs_sb_info *r = REISERFS_SB(sb);
     
 	seq_printf(m,	"state: \t%s\n"
-			"mount options: \t%s%s%s%s%s%s%s%s%s%s%s%s\n"
+			"mount options: \t%s%s%s%s%s%s%s%s%s%s%s\n"
 			"gen. counter: \t%i\n"
 			"s_kmallocs: \t%i\n"
 			"s_disk_reads: \t%i\n"
@@ -131,7 +131,6 @@ static int show_super(struct seq_file *m
 			reiserfs_test4( sb ) ? "TEST4 " : "",
 			have_large_tails( sb ) ? "TAILS " : have_small_tails(sb)?"SMALL_TAILS ":"NO_TAILS ",
 			replay_only( sb ) ? "REPLAY_ONLY " : "",
-			reiserfs_dont_log( sb ) ? "DONT_LOG " : "LOG ",
 			convert_reiserfs( sb ) ? "CONV " : "",
 
 			atomic_read( &r -> s_generation_counter ),
@@ -370,7 +369,6 @@ static int show_journal(struct seq_file 
 			"j_first_unflushed_offset: \t%lu\n"
 			"j_last_flush_trans_id: \t%lu\n"
 			"j_trans_start_time: \t%li\n"
-			"j_journal_list_index: \t%i\n"
 			"j_list_bitmap_index: \t%i\n"
 			"j_must_wait: \t%i\n"
 			"j_next_full_flush: \t%i\n"
@@ -416,7 +414,6 @@ static int show_journal(struct seq_file 
 			JF( j_first_unflushed_offset ),
 			JF( j_last_flush_trans_id ),
 			JF( j_trans_start_time ),
-			JF( j_journal_list_index ),
 			JF( j_list_bitmap_index ),
 			JF( j_must_wait ),
 			JF( j_next_full_flush ),
--- diff/fs/reiserfs/super.c	2004-01-19 10:22:59.000000000 +0000
+++ source/fs/reiserfs/super.c	2004-04-21 10:45:35.792262248 +0100
@@ -59,22 +59,26 @@ static int is_any_reiserfs_magic_string 
 static int reiserfs_remount (struct super_block * s, int * flags, char * data);
 static int reiserfs_statfs (struct super_block * s, struct kstatfs * buf);
 
-static void reiserfs_write_super (struct super_block * s)
+static void reiserfs_sync_fs (struct super_block * s)
 {
+    if (!(s->s_flags & MS_RDONLY)) {
+        struct reiserfs_transaction_handle th;
+	reiserfs_write_lock(s);
+	journal_begin(&th, s, 1);
+	journal_end_sync(&th, s, 1);
+	reiserfs_flush_old_commits(s);
+	s->s_dirt = 0;
+	reiserfs_write_unlock(s);
+    }
+}
 
-  int dirty = 0 ;
-  reiserfs_write_lock(s);
-  if (!(s->s_flags & MS_RDONLY)) {
-    dirty = flush_old_commits(s, 1) ;
-  }
-  s->s_dirt = dirty;
-  reiserfs_write_unlock(s);
+static void reiserfs_write_super(struct super_block *s)
+{
+    reiserfs_sync_fs(s);
 }
 
 static void reiserfs_write_super_lockfs (struct super_block * s)
 {
-
-  int dirty = 0 ;
   struct reiserfs_transaction_handle th ;
   reiserfs_write_lock(s);
   if (!(s->s_flags & MS_RDONLY)) {
@@ -84,7 +88,7 @@ static void reiserfs_write_super_lockfs 
     reiserfs_block_writes(&th) ;
     journal_end(&th, s, 1) ;
   }
-  s->s_dirt = dirty;
+  s->s_dirt = 0;
   reiserfs_write_unlock(s);
 }
 
@@ -506,6 +510,14 @@ typedef struct {
 		    applied BEFORE setmask */
 } opt_desc_t;
 
+/* possible values for -o data= */
+static const arg_desc_t logging_mode[] = {
+    {"ordered", 1<<REISERFS_DATA_ORDERED, (1<<REISERFS_DATA_LOG|1<<REISERFS_DATA_WRITEBACK)},
+    {"journal", 1<<REISERFS_DATA_LOG, (1<<REISERFS_DATA_ORDERED|1<<REISERFS_DATA_WRITEBACK)},
+    {"writeback", 1<<REISERFS_DATA_WRITEBACK, (1<<REISERFS_DATA_ORDERED|1<<REISERFS_DATA_LOG)},
+    {NULL, 0}
+};
+
 /* possible values for "-o block-allocator=" and bits which are to be set in
    s_mount_opt of reiserfs specific part of in-core super block */
 static const arg_desc_t balloc[] = {
@@ -660,6 +672,7 @@ static int reiserfs_parse_options (struc
 	{"nolog", 0, 0, 0, 0}, /* This is unsupported */
 	{"replayonly", 0, 0, 1<<REPLAYONLY, 0},
 	{"block-allocator", 'a', balloc, 0, 0},
+	{"data", 'd', logging_mode, 0, 0},
 	{"resize", 'r', 0, 0, 0},
 	{"jdev", 'j', 0, 0, 0},
 	{"nolargeio", 'w', 0, 0, 0},
@@ -696,13 +709,11 @@ static int reiserfs_parse_options (struc
 		char *p = 0;
 		int val = simple_strtoul (arg, &p, 0);
 		/* commit=NNN (time in seconds) */
-		if ( *p != '\0' || val == 0) {
+		if ( *p != '\0' || val < 0) {
 			printk ("reiserfs_parse_options: bad value %s\n", arg);
 			return 0;
 		}
-		if ( val > 0 ) {
-			*commit_max_age = val;
-		}
+		*commit_max_age = val;
 	}
 
 	if ( c == 'w' ) {
@@ -733,6 +744,33 @@ static int reiserfs_parse_options (struc
     return 1;
 }
 
+static void switch_data_mode(struct super_block *s, unsigned long mode) {
+    REISERFS_SB(s)->s_mount_opt &= ~((1 << REISERFS_DATA_LOG) |
+                                       (1 << REISERFS_DATA_ORDERED) |
+				       (1 << REISERFS_DATA_WRITEBACK));
+    REISERFS_SB(s)->s_mount_opt |= (1 << mode);
+}
+
+static void handle_data_mode(struct super_block *s, unsigned long mount_options)
+{
+    if (mount_options & (1 << REISERFS_DATA_LOG)) {
+        if (!reiserfs_data_log(s)) {
+	    switch_data_mode(s, REISERFS_DATA_LOG);
+	    printk("reiserfs: switching to journaled data mode\n");
+	}
+    } else if (mount_options & (1 << REISERFS_DATA_ORDERED)) {
+        if (!reiserfs_data_ordered(s)) {
+	    switch_data_mode(s, REISERFS_DATA_ORDERED);
+	    printk("reiserfs: switching to ordered data mode\n");
+	}
+    } else if (mount_options & (1 << REISERFS_DATA_WRITEBACK)) {
+        if (!reiserfs_data_writeback(s)) {
+	    switch_data_mode(s, REISERFS_DATA_WRITEBACK);
+	    printk("reiserfs: switching to writeback data mode\n");
+	}
+    }
+}
+
 static void handle_attrs( struct super_block *s )
 {
 	struct reiserfs_super_block * rs;
@@ -781,7 +819,14 @@ static int reiserfs_remount (struct supe
   REISERFS_SB(s)->s_mount_opt = (REISERFS_SB(s)->s_mount_opt & ~safe_mask) |  (mount_options & safe_mask);
 
   if(commit_max_age != 0) {
-	  SB_JOURNAL_MAX_COMMIT_AGE(s) = commit_max_age;
+    SB_JOURNAL_MAX_COMMIT_AGE(s) = commit_max_age;
+    SB_JOURNAL_MAX_TRANS_AGE(s) = commit_max_age;
+  }
+  else
+  {
+    /* 0 means restore defaults. */
+    SB_JOURNAL_MAX_COMMIT_AGE(s) = SB_JOURNAL_DEFAULT_MAX_COMMIT_AGE(s);
+    SB_JOURNAL_MAX_TRANS_AGE(s) = JOURNAL_MAX_TRANS_AGE;
   }
 
   if(blocks) {
@@ -805,12 +850,12 @@ static int reiserfs_remount (struct supe
     reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s), 1) ;
     set_sb_umount_state( rs, REISERFS_SB(s)->s_mount_state );
     journal_mark_dirty(&th, s, SB_BUFFER_WITH_SB (s));
-    s->s_dirt = 0;
   } else {
     /* remount read-write */
     if (!(s->s_flags & MS_RDONLY))
 	return 0; /* We are read-write already */
 
+    handle_data_mode(s, mount_options);
     REISERFS_SB(s)->s_mount_state = sb_umount_state(rs) ;
     s->s_flags &= ~MS_RDONLY ; /* now it is safe to call journal_begin */
     journal_begin(&th, s, 10) ;
@@ -822,12 +867,12 @@ static int reiserfs_remount (struct supe
     set_sb_umount_state( rs, REISERFS_ERROR_FS );
     /* mark_buffer_dirty (SB_BUFFER_WITH_SB (s), 1); */
     journal_mark_dirty(&th, s, SB_BUFFER_WITH_SB (s));
-    s->s_dirt = 0;
     REISERFS_SB(s)->s_mount_state = REISERFS_VALID_FS ;
   }
   /* this will force a full flush of all journal lists */
   SB_JOURNAL(s)->j_must_wait = 1 ;
   journal_end(&th, s, 10) ;
+  s->s_dirt = 0;
 
   if (!( *mount_flags & MS_RDONLY ) )
     finish_unfinished( s );
@@ -1258,8 +1303,8 @@ static int reiserfs_fill_super (struct s
     REISERFS_SB(s)->s_alloc_options.bits = ( 1 << 5);
     /* If file grew past 4 blocks, start preallocation blocks for it. */
     REISERFS_SB(s)->s_alloc_options.preallocmin = 4;
-    /* Preallocate by 8 blocks (9-1) at once */
-    REISERFS_SB(s)->s_alloc_options.preallocsize = 9;
+    /* Preallocate by 16 blocks (17-1) at once */
+    REISERFS_SB(s)->s_alloc_options.preallocsize = 17;
 
     jdev_name = NULL;
     if (reiserfs_parse_options (s, (char *) data, &(sbi->s_mount_opt), &blocks, &jdev_name, &commit_max_age) == 0) {
@@ -1303,6 +1348,21 @@ static int reiserfs_fill_super (struct s
     SPRINTK(silent, "reiserfs:warning: - it is slow mode for debugging.\n");
 #endif
 
+    /* make data=ordered the default */
+    if (!reiserfs_data_log(s) && !reiserfs_data_ordered(s) &&
+        !reiserfs_data_writeback(s))
+    {
+         REISERFS_SB(s)->s_mount_opt |= (1 << REISERFS_DATA_ORDERED);
+    }
+
+    if (reiserfs_data_log(s)) {
+        printk("reiserfs: using journaled data mode\n");
+    } else if (reiserfs_data_ordered(s)) {
+        printk("reiserfs: using ordered data mode\n");
+    } else {
+        printk("reiserfs: using writeback data mode\n");
+    }
+
     // set_device_ro(s->s_dev, 1) ;
     if( journal_init(s, jdev_name, old_format, commit_max_age) ) {
 	SPRINTK(silent, "sh-2022: reiserfs_fill_super: unable to initialize journal space\n") ;
@@ -1392,8 +1452,6 @@ static int reiserfs_fill_super (struct s
 	
 	/* look for files which were to be removed in previous session */
 	finish_unfinished (s);
-
-	s->s_dirt = 0;
     } else {
 	if ( old_format_only(s) && !silent) {
 	    reiserfs_warning("reiserfs: using 3.5.x disk format\n") ;
--- diff/fs/reiserfs/tail_conversion.c	2003-09-30 15:46:19.000000000 +0100
+++ source/fs/reiserfs/tail_conversion.c	2004-04-21 10:45:35.793262096 +0100
@@ -139,20 +139,20 @@ int direct2indirect (struct reiserfs_tra
 
 /* stolen from fs/buffer.c */
 void reiserfs_unmap_buffer(struct buffer_head *bh) {
-  if (buffer_mapped(bh)) {
+    lock_buffer(bh) ;
     if (buffer_journaled(bh) || buffer_journal_dirty(bh)) {
       BUG() ;
     }
     clear_buffer_dirty(bh) ;
-    lock_buffer(bh) ;
     /* Remove the buffer from whatever list it belongs to. We are mostly
        interested in removing it from per-sb j_dirty_buffers list, to avoid
         BUG() on attempt to write not mapped buffer */
-    if ( !list_empty(&bh->b_assoc_buffers) && bh->b_page) {
+    if ( (!list_empty(&bh->b_assoc_buffers) || bh->b_private) && bh->b_page) {
 	struct inode *inode = bh->b_page->mapping->host;
 	struct reiserfs_journal *j = SB_JOURNAL(inode->i_sb);
 	spin_lock(&j->j_dirty_buffers_lock);
 	list_del_init(&bh->b_assoc_buffers);
+	reiserfs_free_jh(bh);
 	spin_unlock(&j->j_dirty_buffers_lock);
     }
     clear_buffer_mapped(bh) ;
@@ -160,7 +160,6 @@ void reiserfs_unmap_buffer(struct buffer
     clear_buffer_new(bh);
     bh->b_bdev = NULL;
     unlock_buffer(bh) ;
-  }
 }
 
 static void
--- diff/fs/romfs/inode.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/romfs/inode.c	2004-04-21 10:45:35.793262096 +0100
@@ -592,11 +592,18 @@ static void destroy_inodecache(void)
 		printk(KERN_INFO "romfs_inode_cache: not all structures were freed\n");
 }
 
+static int romfs_remount(struct super_block *sb, int *flags, char *data)
+{
+	*flags |= MS_RDONLY;
+	return 0;
+}
+
 static struct super_operations romfs_ops = {
 	.alloc_inode	= romfs_alloc_inode,
 	.destroy_inode	= romfs_destroy_inode,
 	.read_inode	= romfs_read_inode,
 	.statfs		= romfs_statfs,
+	.remount_fs	= romfs_remount,
 };
 
 static struct super_block *romfs_get_sb(struct file_system_type *fs_type,
--- diff/fs/seq_file.c	2003-10-09 09:47:34.000000000 +0100
+++ source/fs/seq_file.c	2004-04-21 10:45:35.794261944 +0100
@@ -37,7 +37,6 @@ int seq_open(struct file *file, struct s
 	file->private_data = p;
 	return 0;
 }
-
 EXPORT_SYMBOL(seq_open);
 
 /**
@@ -146,7 +145,6 @@ Efault:
 	err = -EFAULT;
 	goto Done;
 }
-
 EXPORT_SYMBOL(seq_read);
 
 static int traverse(struct seq_file *m, loff_t offset)
@@ -232,7 +230,6 @@ loff_t seq_lseek(struct file *file, loff
 	up(&m->sem);
 	return retval;
 }
-
 EXPORT_SYMBOL(seq_lseek);
 
 /**
@@ -250,7 +247,6 @@ int seq_release(struct inode *inode, str
 	kfree(m);
 	return 0;
 }
-
 EXPORT_SYMBOL(seq_release);
 
 /**
@@ -287,7 +283,6 @@ int seq_escape(struct seq_file *m, const
 	m->count = p - m->buf;
         return 0;
 }
-
 EXPORT_SYMBOL(seq_escape);
 
 int seq_printf(struct seq_file *m, const char *f, ...)
@@ -307,7 +302,6 @@ int seq_printf(struct seq_file *m, const
 	m->count = m->size;
 	return -1;
 }
-
 EXPORT_SYMBOL(seq_printf);
 
 int seq_path(struct seq_file *m,
@@ -340,7 +334,6 @@ int seq_path(struct seq_file *m,
 	m->count = m->size;
 	return -1;
 }
-
 EXPORT_SYMBOL(seq_path);
 
 static void *single_start(struct seq_file *p, loff_t *pos)
@@ -377,7 +370,6 @@ int single_open(struct file *file, int (
 	}
 	return res;
 }
-
 EXPORT_SYMBOL(single_open);
 
 int single_release(struct inode *inode, struct file *file)
@@ -387,7 +379,6 @@ int single_release(struct inode *inode, 
 	kfree(op);
 	return res;
 }
-
 EXPORT_SYMBOL(single_release);
 
 int seq_release_private(struct inode *inode, struct file *file)
@@ -398,5 +389,27 @@ int seq_release_private(struct inode *in
 	seq->private = NULL;
 	return seq_release(inode, file);
 }
-
 EXPORT_SYMBOL(seq_release_private);
+
+int seq_putc(struct seq_file *m, char c)
+{
+	if (m->count < m->size) {
+		m->buf[m->count++] = c;
+		return 0;
+	}
+	return -1;
+}
+EXPORT_SYMBOL(seq_putc);
+
+int seq_puts(struct seq_file *m, const char *s)
+{
+	int len = strlen(s);
+	if (m->count + len < m->size) {
+		memcpy(m->buf + m->count, s, len);
+		m->count += len;
+		return 0;
+	}
+	m->count = m->size;
+	return -1;
+}
+EXPORT_SYMBOL(seq_puts);
--- diff/fs/smbfs/inode.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/smbfs/inode.c	2004-04-21 10:45:35.794261944 +0100
@@ -93,6 +93,12 @@ static void destroy_inodecache(void)
 		printk(KERN_INFO "smb_inode_cache: not all structures were freed\n");
 }
 
+static int smb_remount(struct super_block *sb, int *flags, char *data)
+{
+	*flags |= MS_NODIRATIME;
+	return 0;
+}
+
 static struct super_operations smb_sops =
 {
 	.alloc_inode	= smb_alloc_inode,
@@ -102,6 +108,7 @@ static struct super_operations smb_sops 
 	.put_super	= smb_put_super,
 	.statfs		= smb_statfs,
 	.show_options	= smb_show_options,
+	.remount_fs	= smb_remount,
 };
 
 
--- diff/fs/stat.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/stat.c	2004-04-21 10:45:35.795261792 +0100
@@ -107,7 +107,8 @@ EXPORT_SYMBOL(vfs_fstat);
 
 #if !defined(__alpha__) && !defined(__sparc__) && !defined(__ia64__) \
   && !defined(CONFIG_ARCH_S390) && !defined(__hppa__) \
-  && !defined(__arm__) && !defined(CONFIG_V850) && !defined(__powerpc64__)
+  && !defined(__arm__) && !defined(CONFIG_V850) && !defined(__powerpc64__) \
+  && !defined(__mips__)
 
 /*
  * For backward compatibility?  Maybe this should be moved
@@ -397,6 +398,8 @@ EXPORT_SYMBOL(inode_get_bytes);
 
 void inode_set_bytes(struct inode *inode, loff_t bytes)
 {
+	/* Caller is here responsible for sufficient locking
+	 * (ie. inode->i_lock) */
 	inode->i_blocks = bytes >> 9;
 	inode->i_bytes = bytes & 511;
 }
--- diff/fs/super.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/super.c	2004-04-21 10:45:35.795261792 +0100
@@ -562,7 +562,9 @@ int set_anon_super(struct super_block *s
 	spin_unlock(&unnamed_dev_lock);
 
 	if ((dev & MAX_ID_MASK) == (1 << MINORBITS)) {
+		spin_lock(&unnamed_dev_lock);
 		idr_remove(&unnamed_dev_idr, dev);
+		spin_unlock(&unnamed_dev_lock);
 		return -EMFILE;
 	}
 	s->s_dev = MKDEV(0, dev & MINORMASK);
--- diff/fs/sysv/inode.c	2003-09-17 12:28:12.000000000 +0100
+++ source/fs/sysv/inode.c	2004-04-21 10:45:35.796261640 +0100
@@ -57,6 +57,16 @@ clean:
 	unlock_kernel();
 }
 
+static int sysv_remount(struct super_block *sb, int *flags, char *data)
+{
+	struct sysv_sb_info *sbi = SYSV_SB(sb);
+	if (sbi->s_forced_ro)
+		*flags |= MS_RDONLY;
+	if (!(*flags & MS_RDONLY))
+		sb->s_dirt = 1;
+	return 0;
+}
+
 static void sysv_put_super(struct super_block *sb)
 {
 	struct sysv_sb_info *sbi = SYSV_SB(sb);
@@ -321,6 +331,7 @@ struct super_operations sysv_sops = {
 	.delete_inode	= sysv_delete_inode,
 	.put_super	= sysv_put_super,
 	.write_super	= sysv_write_super,
+	.remount_fs	= sysv_remount,
 	.statfs		= sysv_statfs,
 };
 
--- diff/fs/sysv/super.c	2003-06-09 14:18:20.000000000 +0100
+++ source/fs/sysv/super.c	2004-04-21 10:45:35.796261640 +0100
@@ -206,11 +206,11 @@ static int detect_sysv(struct sysv_sb_in
  
  	if (fs16_to_cpu(sbi, sbd->s_nfree) == 0xffff) {
  		sbi->s_type = FSTYPE_AFS;
+		sbi->s_forced_ro = 1;
  		if (!(sb->s_flags & MS_RDONLY)) {
  			printk("SysV FS: SCO EAFS on %s detected, " 
  				"forcing read-only mode.\n", 
  				sb->s_id);
- 			sb->s_flags |= MS_RDONLY;
  		}
  		return sbd->s_type;
  	}
@@ -234,7 +234,7 @@ static int detect_sysv(struct sysv_sb_in
 	if (sbd->s_type >= 0x10) {
 		printk("SysV FS: can't handle long file names on %s, "
 		       "forcing read-only mode.\n", sb->s_id);
-		sb->s_flags |= MS_RDONLY;
+		sbi->s_forced_ro = 1;
 	}
 
 	sbi->s_type = FSTYPE_SYSV4;
@@ -335,9 +335,10 @@ static int complete_read_super(struct su
 		printk("SysV FS: get root dentry failed\n");
 		return 0;
 	}
+	if (sbi->s_forced_ro)
+		sb->s_flags |= MS_RDONLY;
 	if (sbi->s_truncate)
 		sb->s_root->d_op = &sysv_dentry_operations;
-	sb->s_flags |= MS_RDONLY;
 	sb->s_dirt = 1;
 	return 1;
 }
@@ -481,6 +482,7 @@ static int v7_fill_super(struct super_bl
 	    (fs32_to_cpu(sbi, v7i->i_size) & 017) != 0)
 		goto failed;
 	brelse(bh2);
+	bh2 = NULL;
 
 	sbi->s_bh1 = bh;
 	sbi->s_bh2 = bh;
--- diff/fs/sysv/sysv.h	2002-10-16 04:27:08.000000000 +0100
+++ source/fs/sysv/sysv.h	2004-04-21 10:45:35.797261488 +0100
@@ -54,6 +54,7 @@ struct sysv_sb_info {
 	u32            s_ndatazones;	/* total number of data zones */
 	u32            s_nzones;	/* same as s_sbd->s_fsize */
 	u16	       s_namelen;       /* max length of dir entry */
+	int	       s_forced_ro;
 };
 
 /*
--- diff/fs/udf/super.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/udf/super.c	2004-04-21 10:45:35.797261488 +0100
@@ -460,6 +460,12 @@ udf_remount_fs(struct super_block *sb, i
 	UDF_SB(sb)->s_gid   = uopt.gid;
 	UDF_SB(sb)->s_umask = uopt.umask;
 
+	if (UDF_SB_LVIDBH(sb)) {
+		int write_rev = le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFWriteRev);
+		if (write_rev > UDF_MAX_WRITE_VERSION)
+			*flags |= MS_RDONLY;
+	}
+
 	if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
 		return 0;
 	if (*flags & MS_RDONLY)
--- diff/fs/ufs/dir.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/ufs/dir.c	2004-04-21 10:45:35.798261336 +0100
@@ -56,13 +56,14 @@ ufs_readdir (struct file * filp, void * 
 {
 	struct inode *inode = filp->f_dentry->d_inode;
 	int error = 0;
-	unsigned long offset, lblk, blk;
+	unsigned long offset, lblk;
 	int i, stored;
 	struct buffer_head * bh;
 	struct ufs_dir_entry * de;
 	struct super_block * sb;
 	int de_reclen;
 	unsigned flags;
+	u64     blk= 0L;
 
 	lock_kernel();
 
--- diff/fs/ufs/inode.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/ufs/inode.c	2004-04-21 10:45:35.799261184 +0100
@@ -50,7 +50,7 @@
 #define UFSD(x)
 #endif
 
-static int ufs_block_to_path(struct inode *inode, long i_block, int offsets[4])
+static int ufs_block_to_path(struct inode *inode, sector_t i_block, sector_t offsets[4])
 {
 	struct ufs_sb_private_info *uspi = UFS_SB(inode->i_sb)->s_uspi;
 	int ptrs = uspi->s_apb;
@@ -60,6 +60,8 @@ static int ufs_block_to_path(struct inod
 		double_blocks = (1 << (ptrs_bits * 2));
 	int n = 0;
 
+
+	UFSD(("ptrs=uspi->s_apb = %d,double_blocks=%d \n",ptrs,double_blocks));
 	if (i_block < 0) {
 		ufs_warning(inode->i_sb, "ufs_block_to_path", "block < 0");
 	} else if (i_block < direct_blocks) {
@@ -87,20 +89,23 @@ static int ufs_block_to_path(struct inod
  * the begining of the filesystem.
  */
 
-u64  ufs_frag_map(struct inode *inode, int frag)
+u64  ufs_frag_map(struct inode *inode, sector_t frag)
 {
 	struct ufs_inode_info *ufsi = UFS_I(inode);
 	struct super_block *sb = inode->i_sb;
 	struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi;
-	int mask = uspi->s_apbmask>>uspi->s_fpbshift;
+	u64 mask = (u64) uspi->s_apbmask>>uspi->s_fpbshift;
 	int shift = uspi->s_apbshift-uspi->s_fpbshift;
-	int offsets[4], *p;
+	sector_t offsets[4], *p;
 	int depth = ufs_block_to_path(inode, frag >> uspi->s_fpbshift, offsets);
-	int ret = 0;
+	u64  ret = 0L;
 	u32 block;
-	u64 u2_block = 0;
+	u64 u2_block = 0L;
 	unsigned flags = UFS_SB(sb)->s_flags;
-	u64 temp = 0;
+	u64 temp = 0L;
+
+	UFSD((": frag = %lu  depth = %d\n",frag,depth));
+	UFSD((": uspi->s_fpbshift = %d ,uspi->s_apbmask = %x, mask=%llx\n",uspi->s_fpbshift,uspi->s_apbmask,mask));
 
 	if (depth == 0)
 		return 0;
@@ -116,7 +121,7 @@ u64  ufs_frag_map(struct inode *inode, i
 		goto out;
 	while (--depth) {
 		struct buffer_head *bh;
-		int n = *p++;
+		sector_t n = *p++;
 
 		bh = sb_bread(sb, uspi->s_sbbase + fs32_to_cpu(sb, block)+(n>>shift));
 		if (!bh)
@@ -126,20 +131,21 @@ u64  ufs_frag_map(struct inode *inode, i
 		if (!block)
 			goto out;
 	}
-	ret = uspi->s_sbbase + fs32_to_cpu(sb, block) + (frag & uspi->s_fpbmask);
+	ret = (u64) (uspi->s_sbbase + fs32_to_cpu(sb, block) + (frag & uspi->s_fpbmask));
 	goto out;
 ufs2:
 	u2_block = ufsi->i_u1.u2_i_data[*p++];
 	if (!u2_block)
 		goto out;
 
-	temp = (u64)uspi->s_sbbase + fs64_to_cpu(sb, u2_block);
 
 	while (--depth) {
 		struct buffer_head *bh;
-		u64 n = *p++;
+		sector_t n = *p++;
 
-		bh = sb_bread(sb, temp +(n>>shift));
+
+		temp = (u64)(uspi->s_sbbase) + fs64_to_cpu(sb, u2_block);
+		bh = sb_bread(sb, temp +(u64) (n>>shift));
 		if (!bh)
 			goto out;
 		u2_block = ((u64*)bh->b_data)[n & mask];
@@ -147,7 +153,8 @@ ufs2:
 		if (!u2_block)
 			goto out;
 	}
-	ret = temp + (frag & uspi->s_fpbmask);
+	temp = (u64)uspi->s_sbbase + fs64_to_cpu(sb, u2_block);
+	ret = temp + (u64) (frag & uspi->s_fpbmask);
 
 out:
 	unlock_kernel();
@@ -379,6 +386,7 @@ static int ufs_getfrag_block (struct ino
 	
 	if (!create) {
 		phys64 = ufs_frag_map(inode, fragment);
+		UFSD(("phys64 = %lu \n",phys64));
 		if (phys64)
 			map_bh(bh_result, sb, phys64);
 		return 0;
--- diff/fs/ufs/super.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/ufs/super.c	2004-04-21 10:45:35.799261184 +0100
@@ -93,6 +93,8 @@
 #undef UFS_SUPER_DEBUG
 #undef UFS_SUPER_DEBUG_MORE
 
+
+#undef UFS_SUPER_DEBUG_MORE
 #ifdef UFS_SUPER_DEBUG
 #define UFSD(x) printk("(%s, %d), %s: ", __FILE__, __LINE__, __FUNCTION__); printk x;
 #else
@@ -157,6 +159,8 @@ void ufs2_print_super_stuff(
 	printk("  magic:         0x%x\n", fs32_to_cpu(sb, usb->fs_magic));
 	printk("  fs_size:   %u\n",fs64_to_cpu(sb, usb->fs_u11.fs_u2.fs_size));
 	printk("  fs_dsize:  %u\n",fs64_to_cpu(sb, usb->fs_u11.fs_u2.fs_dsize));
+	printk("  bsize:         %u\n", fs32_to_cpu(usb, usb->fs_bsize));
+	printk("  fsize:         %u\n", fs32_to_cpu(usb, usb->fs_fsize));
 	printk("  fs_volname:  %s\n", usb->fs_u11.fs_u2.fs_volname);
 	printk("  fs_fsmnt:  %s\n", usb->fs_u11.fs_u2.fs_fsmnt);
 	printk("  fs_sblockloc: %u\n",fs64_to_cpu(sb,
@@ -897,6 +901,8 @@ magic_found:
 	uspi->s_fmask = fs32_to_cpu(sb, usb1->fs_fmask);
 	uspi->s_bshift = fs32_to_cpu(sb, usb1->fs_bshift);
 	uspi->s_fshift = fs32_to_cpu(sb, usb1->fs_fshift);
+	UFSD(("uspi->s_bshift = %d,uspi->s_fshift = %d", uspi->s_bshift,
+		uspi->s_fshift));
 	uspi->s_fpbshift = fs32_to_cpu(sb, usb1->fs_fragshift);
 	uspi->s_fsbtodb = fs32_to_cpu(sb, usb1->fs_fsbtodb);
 	/* s_sbsize already set */
@@ -929,7 +935,12 @@ magic_found:
 	 * Compute another frequently used values
 	 */
 	uspi->s_fpbmask = uspi->s_fpb - 1;
-	uspi->s_apbshift = uspi->s_bshift - 2;
+	if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) {
+		uspi->s_apbshift = uspi->s_bshift - 3;
+	}
+	else {
+		uspi->s_apbshift = uspi->s_bshift - 2;
+	}
 	uspi->s_2apbshift = uspi->s_apbshift * 2;
 	uspi->s_3apbshift = uspi->s_apbshift * 3;
 	uspi->s_apb = 1 << uspi->s_apbshift;
--- diff/fs/ufs/truncate.c	2003-02-26 16:00:55.000000000 +0000
+++ source/fs/ufs/truncate.c	2004-04-21 10:45:35.800261032 +0100
@@ -38,6 +38,7 @@
 #include <linux/string.h>
 #include <linux/smp_lock.h>
 #include <linux/buffer_head.h>
+#include <linux/blkdev.h>
 #include <linux/sched.h>
 
 #include "swab.h"
@@ -456,7 +457,7 @@ void ufs_truncate (struct inode * inode)
 			break;
 		if (IS_SYNC(inode) && (inode->i_state & I_DIRTY))
 			ufs_sync_inode (inode);
-		blk_run_queues();
+		blk_run_address_space(inode->i_mapping);
 		yield();
 	}
 	offset = inode->i_size & uspi->s_fshift;
--- diff/fs/xattr_acl.c	2002-11-11 11:09:43.000000000 +0000
+++ source/fs/xattr_acl.c	2004-04-21 10:45:35.800261032 +0100
@@ -29,7 +29,7 @@ posix_acl_from_xattr(const void *value, 
 	if (size < sizeof(posix_acl_xattr_header))
 		 return ERR_PTR(-EINVAL);
 	if (header->a_version != cpu_to_le32(POSIX_ACL_XATTR_VERSION))
-		return ERR_PTR(-EINVAL);
+		return ERR_PTR(-EOPNOTSUPP);
 
 	count = posix_acl_xattr_count(size);
 	if (count < 0)
--- diff/fs/xfs/linux/xfs_aops.c	2004-04-05 12:57:08.000000000 +0100
+++ source/fs/xfs/linux/xfs_aops.c	2004-04-21 10:45:35.801260880 +0100
@@ -566,7 +566,7 @@ xfs_submit_page(
 	int			i;
 
 	BUG_ON(PageWriteback(page));
-	SetPageWriteback(page);
+	set_page_writeback(page);
 	clear_page_dirty(page);
 	unlock_page(page);
 
@@ -1013,7 +1013,7 @@ linvfs_get_blocks_direct(
 					create, 1, BMAPI_WRITE|BMAPI_DIRECT);
 }
 
-STATIC int
+STATIC ssize_t
 linvfs_direct_IO(
 	int			rw,
 	struct kiocb		*iocb,
@@ -1032,7 +1032,8 @@ linvfs_direct_IO(
 	if (error)
 		return -error;
 
-	return blockdev_direct_IO(rw, iocb, inode, iomap.iomap_target->pbr_bdev,
+	return blockdev_direct_IO_no_locking(rw, iocb, inode,
+		iomap.iomap_target->pbr_bdev,
 		iov, offset, nr_segs,
 		linvfs_get_blocks_direct,
 		linvfs_unwritten_convert_direct);
--- diff/fs/xfs/linux/xfs_buf.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/xfs/linux/xfs_buf.c	2004-04-21 10:45:35.802260728 +0100
@@ -1013,7 +1013,7 @@ pagebuf_lock(
 {
 	PB_TRACE(pb, "lock", 0);
 	if (atomic_read(&pb->pb_io_remaining))
-		blk_run_queues();
+		blk_run_address_space(pb->pb_target->pbr_mapping);
 	down(&pb->pb_sema);
 	PB_SET_OWNER(pb);
 	PB_TRACE(pb, "locked", 0);
@@ -1109,7 +1109,7 @@ _pagebuf_wait_unpin(
 		if (atomic_read(&pb->pb_pin_count) == 0)
 			break;
 		if (atomic_read(&pb->pb_io_remaining))
-			blk_run_queues();
+			blk_run_address_space(pb->pb_target->pbr_mapping);
 		schedule();
 	}
 	remove_wait_queue(&pb->pb_waiters, &wait);
@@ -1407,7 +1407,7 @@ submit_io:
 	if (pb->pb_flags & PBF_RUN_QUEUES) {
 		pb->pb_flags &= ~PBF_RUN_QUEUES;
 		if (atomic_read(&pb->pb_io_remaining) > 1)
-			blk_run_queues();
+			blk_run_address_space(pb->pb_target->pbr_mapping);
 	}
 }
 
@@ -1471,7 +1471,7 @@ pagebuf_iowait(
 {
 	PB_TRACE(pb, "iowait", 0);
 	if (atomic_read(&pb->pb_io_remaining))
-		blk_run_queues();
+		blk_run_address_space(pb->pb_target->pbr_mapping);
 	down(&pb->pb_iodonesema);
 	PB_TRACE(pb, "iowaited", (long)pb->pb_error);
 	return pb->pb_error;
@@ -1617,7 +1617,6 @@ STATIC int
 pagebuf_daemon(
 	void			*data)
 {
-	int			count;
 	page_buf_t		*pb;
 	struct list_head	*curr, *next, tmp;
 
@@ -1633,14 +1632,13 @@ pagebuf_daemon(
 	do {
 		/* swsusp */
 		if (current->flags & PF_FREEZE)
-			refrigerator(PF_IOTHREAD);
+			refrigerator(PF_FREEZE);
 
 		set_current_state(TASK_INTERRUPTIBLE);
 		schedule_timeout(xfs_flush_interval);
 
 		spin_lock(&pbd_delwrite_lock);
 
-		count = 0;
 		list_for_each_safe(curr, next, &pbd_delwrite_queue) {
 			pb = list_entry(curr, page_buf_t, pb_list);
 
@@ -1657,7 +1655,6 @@ pagebuf_daemon(
 				pb->pb_flags &= ~PBF_DELWRI;
 				pb->pb_flags |= PBF_WRITE;
 				list_move(&pb->pb_list, &tmp);
-				count++;
 			}
 		}
 
@@ -1667,12 +1664,11 @@ pagebuf_daemon(
 			list_del_init(&pb->pb_list);
 
 			pagebuf_iostrategy(pb);
+			blk_run_address_space(pb->pb_target->pbr_mapping);
 		}
 
 		if (as_list_len > 0)
 			purge_addresses();
-		if (count)
-			blk_run_queues();
 
 		force_flush = 0;
 	} while (pagebuf_daemon_active);
@@ -1689,7 +1685,6 @@ pagebuf_delwri_flush(
 	page_buf_t		*pb;
 	struct list_head	*curr, *next, tmp;
 	int			pincount = 0;
-	int			flush_cnt = 0;
 
 	pagebuf_runall_queues(pagebuf_dataio_workqueue);
 	pagebuf_runall_queues(pagebuf_logio_workqueue);
@@ -1733,14 +1728,8 @@ pagebuf_delwri_flush(
 
 		pagebuf_lock(pb);
 		pagebuf_iostrategy(pb);
-		if (++flush_cnt > 32) {
-			blk_run_queues();
-			flush_cnt = 0;
-		}
 	}
 
-	blk_run_queues();
-
 	while (!list_empty(&tmp)) {
 		pb = list_entry(tmp.next, page_buf_t, pb_list);
 
@@ -1751,6 +1740,9 @@ pagebuf_delwri_flush(
 		pagebuf_rele(pb);
 	}
 
+	if (flags & PBDF_WAIT)
+		blk_run_address_space(target->pbr_mapping);
+
 	if (pinptr)
 		*pinptr = pincount;
 }
--- diff/fs/xfs/linux/xfs_super.c	2004-03-11 10:20:28.000000000 +0000
+++ source/fs/xfs/linux/xfs_super.c	2004-04-21 10:45:35.803260576 +0100
@@ -464,7 +464,7 @@ syncd(void *arg)
 		schedule_timeout(xfs_syncd_interval);
 		/* swsusp */
 		if (current->flags & PF_FREEZE)
-			refrigerator(PF_IOTHREAD);
+			refrigerator(PF_FREEZE);
 		if (vfsp->vfs_flag & VFS_UMOUNT)
 			break;
 		if (vfsp->vfs_flag & VFS_RDONLY)
--- diff/fs/xfs/linux/xfs_vnode.h	2004-02-09 10:36:12.000000000 +0000
+++ source/fs/xfs/linux/xfs_vnode.h	2004-04-21 10:45:35.803260576 +0100
@@ -596,11 +596,10 @@ static __inline__ void vn_flagclr(struct
 /*
  * Some useful predicates.
  */
-#define VN_MAPPED(vp)	\
-	(!list_empty(&(LINVFS_GET_IP(vp)->i_mapping->i_mmap)) || \
-	(!list_empty(&(LINVFS_GET_IP(vp)->i_mapping->i_mmap_shared))))
+#define VN_MAPPED(vp)	mapping_mapped(LINVFS_GET_IP(vp)->i_mapping)
 #define VN_CACHED(vp)	(LINVFS_GET_IP(vp)->i_mapping->nrpages)
-#define VN_DIRTY(vp)	(!list_empty(&(LINVFS_GET_IP(vp)->i_mapping->dirty_pages)))
+#define VN_DIRTY(vp)	mapping_tagged(LINVFS_GET_IP(vp)->i_mapping, \
+					PAGECACHE_TAG_DIRTY)
 #define VMODIFY(vp)	VN_FLAGSET(vp, VMODIFIED)
 #define VUNMODIFY(vp)	VN_FLAGCLR(vp, VMODIFIED)
 
--- diff/include/asm-alpha/hdreg.h	2002-10-16 04:27:56.000000000 +0100
+++ source/include/asm-alpha/hdreg.h	2004-04-21 10:45:35.803260576 +0100
@@ -1,12 +1 @@
-/*
- *  linux/include/asm-alpha/hdreg.h
- *
- *  Copyright (C) 1994-1996  Linus Torvalds & authors
- */
-
-#ifndef __ASMalpha_HDREG_H
-#define __ASMalpha_HDREG_H
-
-typedef unsigned long ide_ioreg_t;
-
-#endif /* __ASMalpha_HDREG_H */
+#include <asm-generic/hdreg.h>
--- diff/include/asm-alpha/ide.h	2003-06-30 10:07:29.000000000 +0100
+++ source/include/asm-alpha/ide.h	2004-04-21 10:45:35.804260424 +0100
@@ -19,7 +19,7 @@
 #define MAX_HWIFS	CONFIG_IDE_MAX_HWIFS
 #endif
 
-static __inline__ int ide_default_irq(ide_ioreg_t base)
+static inline int ide_default_irq(unsigned long base)
 {
 	switch (base) {
 		case 0x1f0: return 14;
@@ -31,7 +31,7 @@ static __inline__ int ide_default_irq(id
 	}
 }
 
-static __inline__ ide_ioreg_t ide_default_io_base(int index)
+static inline unsigned long ide_default_io_base(int index)
 {
 	switch (index) {
 		case 0:	return 0x1f0;
@@ -43,42 +43,11 @@ static __inline__ ide_ioreg_t ide_defaul
 	}
 }
 
-static __inline__ void ide_init_hwif_ports(hw_regs_t *hw, ide_ioreg_t data_port, ide_ioreg_t ctrl_port, int *irq)
-{
-	ide_ioreg_t reg = data_port;
-	int i;
-
-	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
-		hw->io_ports[i] = reg;
-		reg += 1;
-	}
-	if (ctrl_port) {
-		hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
-	} else {
-		hw->io_ports[IDE_CONTROL_OFFSET] = hw->io_ports[IDE_DATA_OFFSET] + 0x206;
-	}
-	if (irq != NULL)
-		*irq = 0;
-	hw->io_ports[IDE_IRQ_OFFSET] = 0;
-}
-
-/*
- * This registers the standard ports for this architecture with the IDE
- * driver.
- */
-static __inline__ void ide_init_default_hwifs(void)
-{
-#ifndef CONFIG_PCI
-	hw_regs_t hw;
-	int index;
-
-	for (index = 0; index < MAX_HWIFS; index++) {
-		ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL);
-		hw.irq = ide_default_irq(ide_default_io_base(index));
-		ide_register_hw(&hw, NULL);
-	}
+#ifdef CONFIG_PCI
+#define ide_init_default_irq(base)	(0)
+#else
+#define ide_init_default_irq(base)	ide_default_irq(base)
 #endif
-}
 
 #include <asm-generic/ide_iops.h>
 
--- diff/include/asm-alpha/irq.h	2003-08-20 14:16:33.000000000 +0100
+++ source/include/asm-alpha/irq.h	2004-04-21 10:45:35.804260424 +0100
@@ -93,5 +93,8 @@ extern void enable_irq(unsigned int);
 struct pt_regs;
 extern void (*perf_irq)(unsigned long, struct pt_regs *);
 
+struct irqaction;
+int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
+
 
 #endif /* _ALPHA_IRQ_H */
--- diff/include/asm-alpha/pgalloc.h	2003-05-21 11:50:16.000000000 +0100
+++ source/include/asm-alpha/pgalloc.h	2004-04-21 10:45:35.804260424 +0100
@@ -63,7 +63,10 @@ pte_free_kernel(pte_t *pte)
 static inline struct page *
 pte_alloc_one(struct mm_struct *mm, unsigned long addr)
 {
-	return virt_to_page(pte_alloc_one_kernel(mm, addr));
+	pte_t *pte = pte_alloc_one_kernel(mm, addr);
+	if (pte)
+		return virt_to_page(pte);
+	return 0;
 }
 
 static inline void
--- diff/include/asm-arm/arch-adifcc/vmalloc.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-arm/arch-adifcc/vmalloc.h	2004-04-21 10:45:35.805260272 +0100
@@ -13,6 +13,3 @@
 #define VMALLOC_OFFSET	  (8*1024*1024)
 #define VMALLOC_START	  (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
 #define VMALLOC_END       (0xe8000000)
-
-#define MODULE_START	(PAGE_OFFSET - 16*1048576)
-#define MODULE_END	(PAGE_OFFSET)
--- diff/include/asm-arm/arch-cl7500/ide.h	2002-10-16 04:29:07.000000000 +0100
+++ source/include/asm-arm/arch-cl7500/ide.h	2004-04-21 10:45:35.805260272 +0100
@@ -13,10 +13,10 @@
  * Set up a hw structure for a specified data port, control port and IRQ.
  * This should follow whatever the default interface uses.
  */
-static __inline__ void
-ide_init_hwif_ports(hw_regs_t *hw, int data_port, int ctrl_port, int *irq)
+static inline void ide_init_hwif_ports(hw_regs_t *hw, unsigned long data_port,
+				       unsigned long ctrl_port, int *irq)
 {
-	ide_ioreg_t reg = data_port;
+	unsigned long reg = data_port;
 	int i;
 
 	memset(hw, 0, sizeof(*hw));
--- diff/include/asm-arm/arch-cl7500/vmalloc.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-arm/arch-cl7500/vmalloc.h	2004-04-21 10:45:35.805260272 +0100
@@ -13,7 +13,3 @@
 #define VMALLOC_OFFSET	  (8*1024*1024)
 #define VMALLOC_START	  (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
 #define VMALLOC_END       (PAGE_OFFSET + 0x1c000000)
-
-#define MODULE_START	(PAGE_OFFSET - 16*1048576)
-#define MODULE_END	(PAGE_OFFSET)
-
--- diff/include/asm-arm/arch-clps711x/vmalloc.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-arm/arch-clps711x/vmalloc.h	2004-04-21 10:45:35.805260272 +0100
@@ -29,6 +29,3 @@
 #define VMALLOC_OFFSET	  (8*1024*1024)
 #define VMALLOC_START	  (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
 #define VMALLOC_END       (PAGE_OFFSET + 0x10000000)
-
-#define MODULE_START	(PAGE_OFFSET - 16*1048576)
-#define MODULE_END	(PAGE_OFFSET)
--- diff/include/asm-arm/arch-ebsa110/vmalloc.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-arm/arch-ebsa110/vmalloc.h	2004-04-21 10:45:35.806260120 +0100
@@ -19,6 +19,3 @@
 #define VMALLOC_OFFSET	  (8*1024*1024)
 #define VMALLOC_START	  (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
 #define VMALLOC_END       (PAGE_OFFSET + 0x1f000000)
-
-#define MODULE_START	(PAGE_OFFSET - 16*1048576)
-#define MODULE_END	(PAGE_OFFSET)
--- diff/include/asm-arm/arch-ebsa285/ide.h	2002-10-16 04:28:32.000000000 +0100
+++ source/include/asm-arm/arch-ebsa285/ide.h	2004-04-21 10:45:35.806260120 +0100
@@ -16,17 +16,17 @@
  * Set up a hw structure for a specified data port, control port and IRQ.
  * This should follow whatever the default interface uses.
  */
-static __inline__ void
-ide_init_hwif_ports(hw_regs_t *hw, int data_port, int ctrl_port, int *irq)
+static inline void ide_init_hwif_ports(hw_regs_t *hw, unsigned long data_port,
+				       unsigned long ctrl_port, int *irq)
 {
-	ide_ioreg_t reg = (ide_ioreg_t) data_port;
+	unsigned long reg = data_port;
 	int i;
 
 	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
 		hw->io_ports[i] = reg;
 		reg += 1;
 	}
-	hw->io_ports[IDE_CONTROL_OFFSET] = (ide_ioreg_t) ctrl_port;
+	hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
 	if (irq)
 		*irq = 0;
 }
--- diff/include/asm-arm/arch-ebsa285/vmalloc.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-arm/arch-ebsa285/vmalloc.h	2004-04-21 10:45:35.806260120 +0100
@@ -24,6 +24,3 @@
 #else
 #define VMALLOC_END       (PAGE_OFFSET + 0x20000000)
 #endif
-
-#define MODULE_START	(PAGE_OFFSET - 16*1048576)
-#define MODULE_END	(PAGE_OFFSET)
--- diff/include/asm-arm/arch-epxa10db/vmalloc.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-arm/arch-epxa10db/vmalloc.h	2004-04-21 10:45:35.807259968 +0100
@@ -29,6 +29,3 @@
 #define VMALLOC_OFFSET	  (8*1024*1024)
 #define VMALLOC_START	  (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
 #define VMALLOC_END       (PAGE_OFFSET + 0x10000000)
-
-#define MODULE_START	(PAGE_OFFSET - 16*1048576)
-#define MODULE_END	(PAGE_OFFSET)
--- diff/include/asm-arm/arch-integrator/vmalloc.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-arm/arch-integrator/vmalloc.h	2004-04-21 10:45:35.807259968 +0100
@@ -29,6 +29,3 @@
 #define VMALLOC_OFFSET	  (8*1024*1024)
 #define VMALLOC_START	  (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
 #define VMALLOC_END       (PAGE_OFFSET + 0x10000000)
-
-#define MODULE_START	(PAGE_OFFSET - 16*1048576)
-#define MODULE_END	(PAGE_OFFSET)
--- diff/include/asm-arm/arch-iop3xx/ide.h	2003-05-21 11:50:10.000000000 +0100
+++ source/include/asm-arm/arch-iop3xx/ide.h	2004-04-21 10:45:35.807259968 +0100
@@ -18,23 +18,21 @@
  * Set up a hw structure for a specified data port, control port and IRQ.
  * This should follow whatever the default interface uses.
  */
-static __inline__ void
-ide_init_hwif_ports(hw_regs_t *hw, int data_port, int ctrl_port, int *irq)
+static inline void ide_init_hwif_ports(hw_regs_t *hw, unsigned long data_port,
+				       unsigned long ctrl_port, int *irq)
 {
-	ide_ioreg_t reg;
+	unsigned long reg = data_port;
 	int i;
 	int regincr = 1;
 
 	memset(hw, 0, sizeof(*hw));
 
-	reg = (ide_ioreg_t)data_port;
-
 	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
 		hw->io_ports[i] = reg;
 		reg += regincr;
 	}
 
-	hw->io_ports[IDE_CONTROL_OFFSET] = (ide_ioreg_t) ctrl_port;
+	hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
 
 	if (irq) *irq = 0;
 }
--- diff/include/asm-arm/arch-iop3xx/vmalloc.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-arm/arch-iop3xx/vmalloc.h	2004-04-21 10:45:35.808259816 +0100
@@ -13,6 +13,3 @@
 #define VMALLOC_OFFSET	  (8*1024*1024)
 #define VMALLOC_START	  (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
 #define VMALLOC_END       (0xe8000000)
-
-#define MODULE_START	(PAGE_OFFSET - 16*1048576)
-#define MODULE_END	(PAGE_OFFSET)
--- diff/include/asm-arm/arch-l7200/ide.h	2002-10-16 04:28:20.000000000 +0100
+++ source/include/asm-arm/arch-l7200/ide.h	2004-04-21 10:45:35.808259816 +0100
@@ -12,8 +12,8 @@
  * Set up a hw structure for a specified data port, control port and IRQ.
  * This should follow whatever the default interface uses.
  */
-static __inline__ void
-ide_init_hwif_ports(hw_regs_t *hw, int data_port, int ctrl_port, int *irq)
+static inline void ide_init_hwif_ports(hw_regs_t *hw, unsigned long data_port,
+				       unsigned long ctrl_port, int *irq)
 {
 }
 
--- diff/include/asm-arm/arch-l7200/vmalloc.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-arm/arch-l7200/vmalloc.h	2004-04-21 10:45:35.808259816 +0100
@@ -13,6 +13,3 @@
 #define VMALLOC_OFFSET	  (8*1024*1024)
 #define VMALLOC_START	  (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
 #define VMALLOC_END       (PAGE_OFFSET + 0x10000000)
-
-#define MODULE_START	(PAGE_OFFSET - 16*1048576)
-#define MODULE_END	(PAGE_OFFSET)
--- diff/include/asm-arm/arch-nexuspci/ide.h	2002-10-16 04:28:31.000000000 +0100
+++ source/include/asm-arm/arch-nexuspci/ide.h	2004-04-21 10:45:35.808259816 +0100
@@ -12,17 +12,17 @@
  * Set up a hw structure for a specified data port, control port and IRQ.
  * This should follow whatever the default interface uses.
  */
-static __inline__ void
-ide_init_hwif_ports(hw_regs_t *hw, int data_port, int ctrl_port, int *irq)
+static inline void ide_init_hwif_ports(hw_regs_t *hw, unsigned long data_port,
+				       unsigned long ctrl_port, int *irq)
 {
-	ide_ioreg_t reg = (ide_ioreg_t) data_port;
+	unsigned long reg = data_port;
 	int i;
 
 	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
 		hw->io_ports[i] = reg;
 		reg += 1;
 	}
-	hw->io_ports[IDE_CONTROL_OFFSET] = (ide_ioreg_t) ctrl_port;
+	hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
 	if (irq)
 		*irq = 0;
 }
--- diff/include/asm-arm/arch-nexuspci/vmalloc.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-arm/arch-nexuspci/vmalloc.h	2004-04-21 10:45:35.809259664 +0100
@@ -13,6 +13,3 @@
 #define VMALLOC_OFFSET	  (8*1024*1024)
 #define VMALLOC_START	  (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
 #define VMALLOC_END       (PAGE_OFFSET + 0x20000000)
-
-#define MODULE_START	(PAGE_OFFSET - 16*1048576)
-#define MODULE_END	(PAGE_OFFSET)
--- diff/include/asm-arm/arch-pxa/ide.h	2003-09-30 15:46:19.000000000 +0100
+++ source/include/asm-arm/arch-pxa/ide.h	2004-04-21 10:45:35.821257840 +0100
@@ -23,23 +23,21 @@
  * Set up a hw structure for a specified data port, control port and IRQ.
  * This should follow whatever the default interface uses.
  */
-static __inline__ void
-ide_init_hwif_ports(hw_regs_t *hw, int data_port, int ctrl_port, int *irq)
+static inline void ide_init_hwif_ports(hw_regs_t *hw, unsigned long data_port,
+				       unsigned long ctrl_port, int *irq)
 {
-	ide_ioreg_t reg;
+	unsigned long reg = data_port;
 	int i;
 	int regincr = 1;
 
 	memset(hw, 0, sizeof(*hw));
 
-	reg = (ide_ioreg_t)data_port;
-
 	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
 		hw->io_ports[i] = reg;
 		reg += regincr;
 	}
 
-	hw->io_ports[IDE_CONTROL_OFFSET] = (ide_ioreg_t) ctrl_port;
+	hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
 
 	if (irq)
 		*irq = 0;
--- diff/include/asm-arm/arch-pxa/memory.h	2002-11-28 11:30:26.000000000 +0000
+++ source/include/asm-arm/arch-pxa/memory.h	2004-04-21 10:45:35.822257688 +0100
@@ -55,4 +55,52 @@
 #define __virt_to_bus(x)	 __virt_to_phys(x)
 #define __bus_to_virt(x)	 __phys_to_virt(x)
 
+#ifdef CONFIG_DISCONTIGMEM
+/*
+ * The nodes are matched with the physical SDRAM banks as follows:
+ *
+ * 	node 0:  0xa0000000-0xa3ffffff	-->  0xc0000000-0xc3ffffff
+ * 	node 1:  0xa4000000-0xa7ffffff	-->  0xc4000000-0xc7ffffff
+ * 	node 2:  0xa8000000-0xabffffff	-->  0xc8000000-0xcbffffff
+ * 	node 3:  0xac000000-0xafffffff	-->  0xcc000000-0xcfffffff
+ */
+
+#define NR_NODES	4
+
+/*
+ * Given a kernel address, find the home node of the underlying memory.
+ */
+#define KVADDR_TO_NID(addr) (((unsigned long)(addr) - PAGE_OFFSET) >> 26)
+
+/*
+ * Given a page frame number, convert it to a node id.
+ */
+#define PFN_TO_NID(pfn)		(((pfn) - PHYS_PFN_OFFSET) >> (26 - PAGE_SHIFT))
+
+/*
+ * Given a kaddr, ADDR_TO_MAPBASE finds the owning node of the memory
+ * and returns the mem_map of that node.
+ */
+#define ADDR_TO_MAPBASE(kaddr)	NODE_MEM_MAP(KVADDR_TO_NID(kaddr))
+
+/*
+ * Given a page frame number, find the owning node of the memory
+ * and returns the mem_map of that node.
+ */
+#define PFN_TO_MAPBASE(pfn)	NODE_MEM_MAP(PFN_TO_NID(pfn))
+
+/*
+ * Given a kaddr, LOCAL_MEM_MAP finds the owning node of the memory
+ * and returns the index corresponding to the appropriate page in the
+ * node's mem_map.
+ */
+#define LOCAL_MAP_NR(addr) \
+	(((unsigned long)(addr) & 0x03ffffff) >> PAGE_SHIFT)
+
+#else
+
+#define PFN_TO_NID(addr)	(0)
+
+#endif
+
 #endif
--- diff/include/asm-arm/arch-pxa/pxa-regs.h	2003-09-30 15:46:19.000000000 +0100
+++ source/include/asm-arm/arch-pxa/pxa-regs.h	2004-04-21 10:45:35.823257536 +0100
@@ -1076,6 +1076,35 @@ typedef void            (*ExcpHndlr) (vo
 #define SSITR		__REG(0x4100000C)  /* SSP Interrupt Test Register */
 #define SSDR		__REG(0x41000010)  /* (Write / Read) SSP Data Write Register/SSP Data Read Register */
 
+#define SSCR0_DSS	(0x0000000f)	/* Data Size Select (mask) */
+#define SSCR0_DataSize(x)  ((x) - 1)	/* Data Size Select [4..16] */
+#define SSCR0_FRF	(0x00000030)	/* FRame Format (mask) */
+#define SSCR0_Motorola	(0x0 << 4)	/* Motorola's Serial Peripheral Interface (SPI) */
+#define SSCR0_TI	(0x1 << 4)	/* Texas Instruments' Synchronous Serial Protocol (SSP) */
+#define SSCR0_National	(0x2 << 4)	/* National Microwire */
+#define SSCR0_ECS	(1 << 6)	/* External clock select */
+#define SSCR0_SSE	(1 << 7)	/* Synchronous Serial Port Enable */
+#define SSCR0_SCR	(0x0000ff00)	/* Serial Clock Rate (mask) */
+#define SSCR0_SerClkDiv(x) ((((x) - 2)/2) << 8) /* Divisor [2..512] */
+
+#define SSCR1_RIE	(1 << 0)	/* Receive FIFO Interrupt Enable */
+#define SSCR1_TIE	(1 << 1)	/* Transmit FIFO Interrupt Enable */
+#define SSCR1_LBM	(1 << 2)	/* Loop-Back Mode */
+#define SSCR1_SPO	(1 << 3)	/* Motorola SPI SSPSCLK polarity setting */
+#define SSCR1_SPH	(1 << 4)	/* Motorola SPI SSPSCLK phase setting */
+#define SSCR1_MWDS	(1 << 5)	/* Microwire Transmit Data Size */
+#define SSCR1_TFT	(0x000003c0)	/* Transmit FIFO Threshold (mask) */
+#define SSCR1_TxTresh(x) (((x) - 1) << 6) /* level [1..16] */
+#define SSCR1_RFT	(0x00003c00)	/* Receive FIFO Threshold (mask) */
+#define SSCR1_RxTresh(x) (((x) - 1) << 10) /* level [1..16] */
+
+#define SSSR_TNF	(1 << 2)	/* Transmit FIFO Not Full */
+#define SSSR_RNE	(1 << 3)	/* Receive FIFO Not Empty */
+#define SSSR_BSY	(1 << 4)	/* SSP Busy */
+#define SSSR_TFS	(1 << 5)	/* Transmit FIFO Service Request */
+#define SSSR_RFS	(1 << 6)	/* Receive FIFO Service Request */
+#define SSSR_ROR	(1 << 7)	/* Receive FIFO Overrun */
+
 
 /*
  * MultiMediaCard (MMC) controller
--- diff/include/asm-arm/arch-pxa/vmalloc.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-arm/arch-pxa/vmalloc.h	2004-04-21 10:45:35.823257536 +0100
@@ -20,6 +20,3 @@
 #define VMALLOC_OFFSET	  (8*1024*1024)
 #define VMALLOC_START	  (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
 #define VMALLOC_END       (0xe8000000)
-
-#define MODULE_START	(PAGE_OFFSET - 16*1048576)
-#define MODULE_END	(PAGE_OFFSET)
--- diff/include/asm-arm/arch-rpc/ide.h	2002-10-16 04:27:54.000000000 +0100
+++ source/include/asm-arm/arch-rpc/ide.h	2004-04-21 10:45:35.823257536 +0100
@@ -16,10 +16,10 @@
  * Set up a hw structure for a specified data port, control port and IRQ.
  * This should follow whatever the default interface uses.
  */
-static __inline__ void
-ide_init_hwif_ports(hw_regs_t *hw, int data_port, int ctrl_port, int *irq)
+static inline void ide_init_hwif_ports(hw_regs_t *hw, unsigned long data_port,
+				       unsigned long ctrl_port, int *irq)
 {
-	ide_ioreg_t reg = (ide_ioreg_t) data_port;
+	unsigned long reg = data_port;
 	int i;
 
 	memset(hw, 0, sizeof(*hw));
@@ -28,7 +28,7 @@ ide_init_hwif_ports(hw_regs_t *hw, int d
 		hw->io_ports[i] = reg;
 		reg += 1;
 	}
-	hw->io_ports[IDE_CONTROL_OFFSET] = (ide_ioreg_t) ctrl_port;
+	hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
 	if (irq)
 		*irq = 0;
 }
--- diff/include/asm-arm/arch-rpc/vmalloc.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-arm/arch-rpc/vmalloc.h	2004-04-21 10:45:35.824257384 +0100
@@ -19,6 +19,3 @@
 #define VMALLOC_OFFSET	  (8*1024*1024)
 #define VMALLOC_START	  (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
 #define VMALLOC_END       (PAGE_OFFSET + 0x1c000000)
-
-#define MODULE_START	(PAGE_OFFSET - 16*1048576)
-#define MODULE_END	(PAGE_OFFSET)
--- diff/include/asm-arm/arch-sa1100/ide.h	2003-02-13 11:46:55.000000000 +0000
+++ source/include/asm-arm/arch-sa1100/ide.h	2004-04-21 10:45:35.835255712 +0100
@@ -19,13 +19,13 @@
  * Set up a hw structure for a specified data port, control port and IRQ.
  * This should follow whatever the default interface uses.
  */
-static __inline__ void
-ide_init_hwif_ports(hw_regs_t *hw, int data_port, int ctrl_port, int *irq)
+static inline void ide_init_hwif_ports(hw_regs_t *hw, unsigned long data_port,
+				       unsigned long ctrl_port, int *irq)
 {
-	ide_ioreg_t reg;
+	unsigned long reg = data_port;
 	int i;
 	int regincr = 1;
-	
+
 	/* The Empeg board has the first two address lines unused */
 	if (machine_is_empeg())
 		regincr = 1 << 2;
@@ -36,15 +36,13 @@ ide_init_hwif_ports(hw_regs_t *hw, int d
 
 	memset(hw, 0, sizeof(*hw));
 
-	reg = (ide_ioreg_t)data_port;
-
 	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
 		hw->io_ports[i] = reg;
 		reg += regincr;
 	}
-	
-	hw->io_ports[IDE_CONTROL_OFFSET] = (ide_ioreg_t) ctrl_port;
-	
+
+	hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
+
 	if (irq)
 		*irq = 0;
 }
--- diff/include/asm-arm/arch-sa1100/vmalloc.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-arm/arch-sa1100/vmalloc.h	2004-04-21 10:45:35.835255712 +0100
@@ -13,6 +13,3 @@
 #define VMALLOC_OFFSET	  (8*1024*1024)
 #define VMALLOC_START	  (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
 #define VMALLOC_END       (0xe8000000)
-
-#define MODULE_START	(PAGE_OFFSET - 16*1048576)
-#define MODULE_END	(PAGE_OFFSET)
--- diff/include/asm-arm/arch-shark/ide.h	2002-11-28 11:30:39.000000000 +0000
+++ source/include/asm-arm/arch-shark/ide.h	2004-04-21 10:45:35.836255560 +0100
@@ -14,10 +14,10 @@
  * Set up a hw structure for a specified data port, control port and IRQ.
  * This should follow whatever the default interface uses.
  */
-static __inline__ void
-ide_init_hwif_ports(hw_regs_t *hw, int data_port, int ctrl_port, int *irq)
+static inline void ide_init_hwif_ports(hw_regs_t *hw, unsigned long data_port,
+				       unsigned long ctrl_port, int *irq)
 {
-	ide_ioreg_t reg = (ide_ioreg_t) data_port;
+	unsigned long reg = data_port;
 	int i;
 
 	memset(hw, 0, sizeof(*hw));
@@ -26,7 +26,7 @@ ide_init_hwif_ports(hw_regs_t *hw, int d
 		hw->io_ports[i] = reg;
 		reg += 1;
 	}
-	hw->io_ports[IDE_CONTROL_OFFSET] = (ide_ioreg_t) ctrl_port;
+	hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
 	if (irq)
 		*irq = 0;
 }
--- diff/include/asm-arm/arch-shark/vmalloc.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-arm/arch-shark/vmalloc.h	2004-04-21 10:45:35.836255560 +0100
@@ -13,6 +13,3 @@
 #define VMALLOC_OFFSET	  (8*1024*1024)
 #define VMALLOC_START	  (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
 #define VMALLOC_END       (PAGE_OFFSET + 0x10000000)
-
-#define MODULE_START	(PAGE_OFFSET - 16*1048576)
-#define MODULE_END	(PAGE_OFFSET)
--- diff/include/asm-arm/arch-tbox/vmalloc.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-arm/arch-tbox/vmalloc.h	2004-04-21 10:45:35.836255560 +0100
@@ -13,6 +13,3 @@
 #define VMALLOC_OFFSET	  (8*1024*1024)
 #define VMALLOC_START	  (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
 #define VMALLOC_END       (PAGE_OFFSET + 0x10000000)
-
-#define MODULE_START	(PAGE_OFFSET - 16*1048576)
-#define MODULE_END	(PAGE_OFFSET)
--- diff/include/asm-arm/cacheflush.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-arm/cacheflush.h	2004-04-21 10:45:35.837255408 +0100
@@ -41,7 +41,7 @@
 #endif
 
 #if defined(CONFIG_CPU_ARM920T) || defined(CONFIG_CPU_ARM922T) || \
-    defined(CONFIG_CPU_ARM1020)
+    defined(CONFIG_CPU_ARM925T) || defined(CONFIG_CPU_ARM1020)
 # define MULTI_CACHE 1
 #endif
 
@@ -283,23 +283,21 @@ flush_cache_page(struct vm_area_struct *
  * flush_dcache_page is used when the kernel has written to the page
  * cache page at virtual address page->virtual.
  *
- * If this page isn't mapped (ie, page->mapping = NULL), or it has
- * userspace mappings (page->mapping->i_mmap or page->mapping->i_mmap_shared)
- * then we _must_ always clean + invalidate the dcache entries associated
- * with the kernel mapping.
+ * If this page isn't mapped (ie, page_mapping == NULL), or it might
+ * have userspace mappings, then we _must_ always clean + invalidate
+ * the dcache entries associated with the kernel mapping.
  *
  * Otherwise we can defer the operation, and clean the cache when we are
  * about to change to user space.  This is the same method as used on SPARC64.
  * See update_mmu_cache for the user space part.
  */
-#define mapping_mapped(map)	(!list_empty(&(map)->i_mmap) || \
-				 !list_empty(&(map)->i_mmap_shared))
-
 extern void __flush_dcache_page(struct page *);
 
 static inline void flush_dcache_page(struct page *page)
 {
-	if (page->mapping && !mapping_mapped(page->mapping))
+	struct address_space *mapping = page_mapping(page);
+
+	if (mapping && !mapping_mapped(mapping))
 		set_bit(PG_dcache_dirty, &page->flags);
 	else
 		__flush_dcache_page(page);
--- diff/include/asm-arm/ecard.h	2003-05-21 11:49:50.000000000 +0100
+++ source/include/asm-arm/ecard.h	2004-04-21 10:45:35.837255408 +0100
@@ -208,7 +208,13 @@ extern int ecard_readchunk (struct in_ch
 /*
  * Obtain the address of a card
  */
-extern unsigned int ecard_address (struct expansion_card *ec, card_type_t card_type, card_speed_t speed);
+extern __deprecated unsigned int ecard_address (struct expansion_card *ec, card_type_t card_type, card_speed_t speed);
+
+/*
+ * Request and release ecard resources
+ */
+extern int ecard_request_resources(struct expansion_card *ec);
+extern void ecard_release_resources(struct expansion_card *ec);
 
 #ifdef ECARD_C
 /* Definitions internal to ecard.c - for it's use only!!
--- diff/include/asm-arm/hardirq.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-arm/hardirq.h	2004-04-21 10:45:35.837255408 +0100
@@ -78,14 +78,14 @@ typedef struct {
 #endif
 
 #ifndef CONFIG_SMP
-/*
- * Some compilers get the use of "%?" wrong in the asm below.
- */
+
+extern asmlinkage void __do_softirq(void);
+
 #define irq_exit()							\
 	do {								\
 		preempt_count() -= IRQ_EXIT_OFFSET;			\
-		if (!in_interrupt() && softirq_pending(smp_processor_id())) \
-			__asm__("bl	__do_softirq": : : "lr", "cc");/* out of line */\
+		if (!in_interrupt() && local_softirq_pending())		\
+			__do_softirq();					\
 		preempt_enable_no_resched();				\
 	} while (0)
 
--- diff/include/asm-arm/hdreg.h	2002-10-16 04:28:21.000000000 +0100
+++ source/include/asm-arm/hdreg.h	2004-04-21 10:45:35.843254496 +0100
@@ -1,13 +1 @@
-/*
- *  linux/include/asm-arm/hdreg.h
- *
- *  Copyright (C) 1994-1996  Linus Torvalds & authors
- */
-
-#ifndef __ASMARM_HDREG_H
-#define __ASMARM_HDREG_H
-
-typedef unsigned long ide_ioreg_t;
-
-#endif /* __ASMARM_HDREG_H */
-
+#include <asm-generic/hdreg.h>
--- diff/include/asm-arm/ide.h	2003-05-21 11:49:50.000000000 +0100
+++ source/include/asm-arm/ide.h	2004-04-21 10:45:35.843254496 +0100
@@ -23,9 +23,11 @@
  * We always use the new IDE port registering,
  * so these are fixed here.
  */
-#define ide_default_io_base(i)		((ide_ioreg_t)0)
+#define ide_default_io_base(i)		(0)
 #define ide_default_irq(b)		(0)
 
+#define ide_init_default_irq(base)	(0)
+
 #define __ide_mm_insw(port,addr,len)	readsw(port,addr,len)
 #define __ide_mm_insl(port,addr,len)	readsl(port,addr,len)
 #define __ide_mm_outsw(port,addr,len)	writesw(port,addr,len)
--- diff/include/asm-arm/irq.h	2003-05-21 11:50:16.000000000 +0100
+++ source/include/asm-arm/irq.h	2004-04-21 10:45:35.843254496 +0100
@@ -44,5 +44,9 @@ void disable_irq_wake(unsigned int irq);
 void enable_irq_wake(unsigned int irq);
 int setup_irq(unsigned int, struct irqaction *);
 
+struct irqaction;
+struct pt_regs;
+int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
+
 #endif
 
--- diff/include/asm-arm/memory.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-arm/memory.h	2004-04-21 10:45:35.844254344 +0100
@@ -15,6 +15,17 @@
 #include <linux/config.h>
 #include <asm/arch/memory.h>
 
+/*
+ * The module space lives between the addresses given by TASK_SIZE
+ * and PAGE_OFFSET - it must be within 32MB of the kernel text.
+ */
+#define MODULE_END	(PAGE_OFFSET)
+#define MODULE_START	(MODULE_END - 16*1048576)
+
+#if TASK_SIZE > MODULE_START
+#error Top of user space clashes with start of module space
+#endif
+
 #ifndef __ASSEMBLY__
 
 /*
--- diff/include/asm-arm/pgtable.h	2004-01-19 10:22:59.000000000 +0000
+++ source/include/asm-arm/pgtable.h	2004-04-21 10:45:35.844254344 +0100
@@ -15,13 +15,62 @@
 #include <asm/arch/vmalloc.h>
 
 /*
- * We pull a couple of tricks here:
- *  1. We wrap the PMD into the PGD.
- *  2. We lie about the size of the PTE and PGD.
- * Even though we have 256 PTE entries and 4096 PGD entries, we tell
- * Linux that we actually have 512 PTE entries and 2048 PGD entries.
- * Each "Linux" PGD entry is made up of two hardware PGD entries, and
- * each PTE table is actually two hardware PTE tables.
+ * Hardware-wise, we have a two level page table structure, where the first
+ * level has 4096 entries, and the second level has 256 entries.  Each entry
+ * is one 32-bit word.  Most of the bits in the second level entry are used
+ * by hardware, and there aren't any "accessed" and "dirty" bits.
+ *
+ * Linux on the other hand has a three level page table structure, which can
+ * be wrapped to fit a two level page table structure easily - using the PGD
+ * and PTE only.  However, Linux also expects one "PTE" table per page, and
+ * at least a "dirty" bit.
+ *
+ * Therefore, we tweak the implementation slightly - we tell Linux that we
+ * have 2048 entries in the first level, each of which is 8 bytes (iow, two
+ * hardware pointers to the second level.)  The second level contains two
+ * hardware PTE tables arranged contiguously, followed by Linux versions
+ * which contain the state information Linux needs.  We, therefore, end up
+ * with 512 entries in the "PTE" level.
+ *
+ * This leads to the page tables having the following layout:
+ *
+ *    pgd             pte
+ * |        |
+ * +--------+ +0
+ * |        |-----> +------------+ +0
+ * +- - - - + +4    |  h/w pt 0  |
+ * |        |-----> +------------+ +1024
+ * +--------+ +8    |  h/w pt 1  |
+ * |        |       +------------+ +2048
+ * +- - - - +       | Linux pt 0 |
+ * |        |       +------------+ +3072
+ * +--------+       | Linux pt 1 |
+ * |        |       +------------+ +4096
+ *
+ * See L_PTE_xxx below for definitions of bits in the "Linux pt", and
+ * PTE_xxx for definitions of bits appearing in the "h/w pt".
+ *
+ * PMD_xxx definitions refer to bits in the first level page table.
+ *
+ * The "dirty" bit is emulated by only granting hardware write permission
+ * iff the page is marked "writable" and "dirty" in the Linux PTE.  This
+ * means that a write to a clean page will cause a permission fault, and
+ * the Linux MM layer will mark the page dirty via handle_pte_fault().
+ * For the hardware to notice the permission change, the TLB entry must
+ * be flushed, and ptep_establish() does that for us.
+ *
+ * The "accessed" or "young" bit is emulated by a similar method; we only
+ * allow accesses to the page if the "young" bit is set.  Accesses to the
+ * page will cause a fault, and handle_pte_fault() will set the young bit
+ * for us as long as the page is marked present in the corresponding Linux
+ * PTE entry.  Again, ptep_establish() will ensure that the TLB is up to
+ * date.
+ *
+ * However, when the "young" bit is cleared, we deny access to the page
+ * by clearing the hardware PTE.  Currently Linux does not flush the TLB
+ * for us in this case, which means the TLB will retain the transation
+ * until either the TLB entry is evicted under pressure, or a context
+ * switch which changes the user space mapping occurs.
  */
 #define PTRS_PER_PTE		512
 #define PTRS_PER_PMD		1
--- diff/include/asm-arm/proc-fns.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-arm/proc-fns.h	2004-04-21 10:45:35.845254192 +0100
@@ -66,6 +66,14 @@
 #   define CPU_NAME cpu_arm922
 #  endif
 # endif
+# ifdef CONFIG_CPU_ARM925T
+#  ifdef CPU_NAME
+#   undef  MULTI_CPU
+#   define MULTI_CPU
+#  else
+#   define CPU_NAME cpu_arm925
+#  endif
+# endif
 # ifdef CONFIG_CPU_ARM926T
 #  ifdef CPU_NAME
 #   undef  MULTI_CPU
--- diff/include/asm-arm/thread_info.h	2004-02-18 08:54:12.000000000 +0000
+++ source/include/asm-arm/thread_info.h	2004-04-21 10:45:35.845254192 +0100
@@ -108,8 +108,8 @@ extern void free_thread_info(struct thre
 #define TI_CPU		20
 #define TI_CPU_DOMAIN	24
 #define TI_CPU_SAVE	28
-#define TI_USED_MATH	76
-#define TI_FPSTATE	(TI_USED_MATH+16)
+#define TI_USED_CP	76
+#define TI_FPSTATE	(TI_USED_CP+16)
 
 #endif
 
--- diff/include/asm-arm/tlb.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-arm/tlb.h	2004-04-21 10:45:35.845254192 +0100
@@ -17,8 +17,9 @@
 #ifndef __ASMARM_TLB_H
 #define __ASMARM_TLB_H
 
-#include <asm/tlbflush.h>
 #include <asm/cacheflush.h>
+#include <asm/tlbflush.h>
+#include <asm/pgalloc.h>
 
 /*
  * TLB handling.  This allows us to remove pages from the page
--- diff/include/asm-arm/uaccess.h	2003-09-17 12:28:12.000000000 +0100
+++ source/include/asm-arm/uaccess.h	2004-04-21 10:45:35.846254040 +0100
@@ -75,7 +75,7 @@ static inline void set_fs (mm_segment_t 
 
 #define access_ok(type,addr,size)	(__range_ok(addr,size) == 0)
 
-static inline int verify_area(int type, const void * addr, unsigned long size)
+static inline int verify_area(int type, const void __user *addr, unsigned long size)
 {
 	return access_ok(type, addr, size) ? 0 : -EFAULT;
 }
@@ -354,13 +354,13 @@ do {									\
 	: "r" (x), "i" (-EFAULT)				\
 	: "cc")
 
-extern unsigned long __arch_copy_from_user(void *to, const void *from, unsigned long n);
-extern unsigned long __arch_copy_to_user(void *to, const void *from, unsigned long n);
-extern unsigned long __arch_clear_user(void *addr, unsigned long n);
-extern unsigned long __arch_strncpy_from_user(char *to, const char *from, unsigned long count);
-extern unsigned long __arch_strnlen_user(const char *s, long n);
+extern unsigned long __arch_copy_from_user(void *to, const void __user *from, unsigned long n);
+extern unsigned long __arch_copy_to_user(void __user *to, const void *from, unsigned long n);
+extern unsigned long __arch_clear_user(void __user *addr, unsigned long n);
+extern unsigned long __arch_strncpy_from_user(char *to, const char __user *from, unsigned long count);
+extern unsigned long __arch_strnlen_user(const char __user *s, long n);
 
-static __inline__ unsigned long copy_from_user(void *to, const void *from, unsigned long n)
+static inline unsigned long copy_from_user(void *to, const void __user *from, unsigned long n)
 {
 	if (access_ok(VERIFY_READ, from, n))
 		n = __arch_copy_from_user(to, from, n);
@@ -369,36 +369,36 @@ static __inline__ unsigned long copy_fro
 	return n;
 }
 
-static __inline__ unsigned long __copy_from_user(void *to, const void *from, unsigned long n)
+static inline unsigned long __copy_from_user(void *to, const void __user *from, unsigned long n)
 {
 	return __arch_copy_from_user(to, from, n);
 }
 
-static __inline__ unsigned long copy_to_user(void *to, const void *from, unsigned long n)
+static inline unsigned long copy_to_user(void __user *to, const void *from, unsigned long n)
 {
 	if (access_ok(VERIFY_WRITE, to, n))
 		n = __arch_copy_to_user(to, from, n);
 	return n;
 }
 
-static __inline__ unsigned long __copy_to_user(void *to, const void *from, unsigned long n)
+static inline unsigned long __copy_to_user(void __user *to, const void *from, unsigned long n)
 {
 	return __arch_copy_to_user(to, from, n);
 }
 
-static __inline__ unsigned long clear_user (void *to, unsigned long n)
+static inline unsigned long clear_user (void __user *to, unsigned long n)
 {
 	if (access_ok(VERIFY_WRITE, to, n))
 		n = __arch_clear_user(to, n);
 	return n;
 }
 
-static __inline__ unsigned long __clear_user (void *to, unsigned long n)
+static inline unsigned long __clear_user (void __user *to, unsigned long n)
 {
 	return __arch_clear_user(to, n);
 }
 
-static __inline__ long strncpy_from_user (char *dst, const char *src, long count)
+static inline long strncpy_from_user (char *dst, const char __user *src, long count)
 {
 	long res = -EFAULT;
 	if (access_ok(VERIFY_READ, src, 1))
@@ -406,14 +406,14 @@ static __inline__ long strncpy_from_user
 	return res;
 }
 
-static __inline__ long __strncpy_from_user (char *dst, const char *src, long count)
+static inline long __strncpy_from_user (char *dst, const char __user *src, long count)
 {
 	return __arch_strncpy_from_user(dst, src, count);
 }
 
 #define strlen_user(s)	strnlen_user(s, ~0UL >> 1)
 
-static inline long strnlen_user(const char *s, long n)
+static inline long strnlen_user(const char __user *s, long n)
 {
 	unsigned long res = 0;
 
--- diff/include/asm-arm26/hdreg.h	2003-06-30 10:07:24.000000000 +0100
+++ source/include/asm-arm26/hdreg.h	2004-04-21 10:45:35.846254040 +0100
@@ -1,15 +1 @@
-/*
- *  linux/include/asm-arm26/hdreg.h
- *
- *  Used by include/linux/ide.h
- *
- *  Copyright (C) 1994-1996  Linus Torvalds & authors
- */
-
-#ifndef __ASMARM_HDREG_H
-#define __ASMARM_HDREG_H
-
-typedef unsigned int ide_ioreg_t;
-
-#endif /* __ASMARM_HDREG_H */
-
+#include <asm-generic/hdreg.h>
--- diff/include/asm-arm26/ide.h	2003-06-30 10:07:24.000000000 +0100
+++ source/include/asm-arm26/ide.h	2004-04-21 10:45:35.847253888 +0100
@@ -30,21 +30,23 @@
  * Set up a hw structure for a specified data port, control port and IRQ.
  * This should follow whatever the default interface uses.
  */
-static __inline__ void
-ide_init_hwif_ports(hw_regs_t *hw, int data_port, int ctrl_port, int *irq)
+static inline void ide_init_hwif_ports(hw_regs_t *hw, unsigned long data_port,
+				       unsigned long ctrl_port, int *irq)
 {
-        ide_ioreg_t reg = (ide_ioreg_t) data_port;
+	unsigned long reg = data_port;
         int i;
 
         for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
                 hw->io_ports[i] = reg;
                 reg += 1;
         }
-        hw->io_ports[IDE_CONTROL_OFFSET] = (ide_ioreg_t) ctrl_port;
+	hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
         if (irq)
                 *irq = 0;
 }
 
+#define ide_init_default_irq(base)	(0)
+
 /*
  * This registers the standard ports for this architecture with the IDE
  * driver.
@@ -67,7 +69,7 @@ static __inline__ void ide_init_default_
  * We always use the new IDE port registering,
  * so these are fixed here.
  */
-#define ide_default_io_base(i)		((ide_ioreg_t)0)
+#define ide_default_io_base(i)		(0)
 #define ide_default_irq(b)		(0)
 
 #endif /* __KERNEL__ */
--- diff/include/asm-arm26/irq.h	2003-06-30 10:07:24.000000000 +0100
+++ source/include/asm-arm26/irq.h	2004-04-21 10:45:35.847253888 +0100
@@ -45,6 +45,8 @@ extern void enable_irq(unsigned int);
 int set_irq_type(unsigned int irq, unsigned int type);
 
 int setup_irq(unsigned int, struct irqaction *);
+struct pt_regs;
+int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
 
 #endif
 
--- diff/include/asm-cris/bitops.h	2003-07-11 09:39:50.000000000 +0100
+++ source/include/asm-cris/bitops.h	2004-04-21 10:45:35.847253888 +0100
@@ -169,7 +169,7 @@ extern inline int __test_and_clear_bit(i
 	return retval;
 }
 /**
- * test_and_change_bit - Change a bit and return its new value
+ * test_and_change_bit - Change a bit and return its old value
  * @nr: Bit to change
  * @addr: Address to count from
  *
--- diff/include/asm-cris/irq.h	2003-07-11 09:39:50.000000000 +0100
+++ source/include/asm-cris/irq.h	2004-04-21 10:45:35.848253736 +0100
@@ -14,6 +14,10 @@ extern void enable_irq(unsigned int);
 #define disable_irq_nosync      disable_irq
 #define enable_irq_nosync       enable_irq
 
+struct irqaction;
+struct pt_regs;
+int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
+
 #endif  /* _ASM_IRQ_H */
 
 
--- diff/include/asm-generic/cpumask_array.h	2004-01-19 10:22:59.000000000 +0000
+++ source/include/asm-generic/cpumask_array.h	2004-04-21 10:45:35.848253736 +0100
@@ -16,7 +16,7 @@
 
 #define cpus_and(dst,src1,src2)	bitmap_and((dst).mask,(src1).mask, (src2).mask, NR_CPUS)
 #define cpus_or(dst,src1,src2)	bitmap_or((dst).mask, (src1).mask, (src2).mask, NR_CPUS)
-#define cpus_clear(map)		bitmap_clear((map).mask, NR_CPUS)
+#define cpus_clear(map)		bitmap_zero((map).mask, NR_CPUS)
 #define cpus_complement(map)	bitmap_complement((map).mask, NR_CPUS)
 #define cpus_equal(map1, map2)	bitmap_equal((map1).mask, (map2).mask, NR_CPUS)
 #define cpus_empty(map)		bitmap_empty(map.mask, NR_CPUS)
@@ -48,7 +48,7 @@
 /*
  * um, these need to be usable as static initializers
  */
-#define CPU_MASK_ALL	{ {[0 ... CPU_ARRAY_SIZE-1] = ~0UL} }
-#define CPU_MASK_NONE	{ {[0 ... CPU_ARRAY_SIZE-1] =  0UL} }
+#define CPU_MASK_ALL	((cpumask_t) { {[0 ... CPU_ARRAY_SIZE-1] = ~0UL} })
+#define CPU_MASK_NONE	((cpumask_t) { {[0 ... CPU_ARRAY_SIZE-1] =  0UL} })
 
 #endif /* __ASM_GENERIC_CPUMASK_ARRAY_H */
--- diff/include/asm-generic/dma-mapping.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-generic/dma-mapping.h	2004-04-21 10:45:35.848253736 +0100
@@ -7,6 +7,10 @@
 #ifndef _ASM_GENERIC_DMA_MAPPING_H
 #define _ASM_GENERIC_DMA_MAPPING_H
 
+#include <linux/config.h>
+
+#ifdef CONFIG_PCI
+
 /* we implement the API below in terms of the existing PCI one,
  * so include it */
 #include <linux/pci.h>
@@ -146,6 +150,119 @@ dma_mapping_error(dma_addr_t dma_addr)
 	return pci_dma_mapping_error(dma_addr);
 }
 
+
+#else
+
+static inline int
+dma_supported(struct device *dev, u64 mask)
+{
+	return 0;
+}
+
+static inline int
+dma_set_mask(struct device *dev, u64 dma_mask)
+{
+	BUG();
+	return 0;
+}
+
+static inline void *
+dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle,
+		   int flag)
+{
+	BUG();
+	return NULL;
+}
+
+static inline void
+dma_free_coherent(struct device *dev, size_t size, void *cpu_addr,
+		    dma_addr_t dma_handle)
+{
+	BUG();
+}
+
+static inline dma_addr_t
+dma_map_single(struct device *dev, void *cpu_addr, size_t size,
+	       enum dma_data_direction direction)
+{
+	BUG();
+	return 0;
+}
+
+static inline void
+dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
+		 enum dma_data_direction direction)
+{
+	BUG();
+}
+
+static inline dma_addr_t
+dma_map_page(struct device *dev, struct page *page,
+	     unsigned long offset, size_t size,
+	     enum dma_data_direction direction)
+{
+	BUG();
+	return 0;
+}
+
+static inline void
+dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,
+	       enum dma_data_direction direction)
+{
+	BUG();
+}
+
+static inline int
+dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
+	   enum dma_data_direction direction)
+{
+	BUG();
+	return 0;
+}
+
+static inline void
+dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries,
+	     enum dma_data_direction direction)
+{
+	BUG();
+}
+
+static inline void
+dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size,
+			enum dma_data_direction direction)
+{
+	BUG();
+}
+
+static inline void
+dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t size,
+			   enum dma_data_direction direction)
+{
+	BUG();
+}
+
+static inline void
+dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems,
+		    enum dma_data_direction direction)
+{
+	BUG();
+}
+
+static inline void
+dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems,
+		       enum dma_data_direction direction)
+{
+	BUG();
+}
+
+static inline int
+dma_error(dma_addr_t dma_addr)
+{
+	return 0;
+}
+
+#endif
+
 /* Now for the API extensions over the pci_ one */
 
 #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
--- diff/include/asm-generic/rmap.h	2003-06-09 14:18:20.000000000 +0100
+++ source/include/asm-generic/rmap.h	2004-04-21 10:45:35.849253584 +0100
@@ -57,7 +57,8 @@ static inline unsigned long ptep_to_addr
 {
 	struct page * page = kmap_atomic_to_page(ptep);
 	unsigned long low_bits;
-	low_bits = ((unsigned long)ptep & ~PAGE_MASK) * PTRS_PER_PTE;
+	low_bits = ((unsigned long)ptep & (PTRS_PER_PTE*sizeof(pte_t) - 1))
+			* (PAGE_SIZE/sizeof(pte_t));
 	return page->index + low_bits;
 }
 
--- diff/include/asm-generic/siginfo.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-generic/siginfo.h	2004-04-21 10:45:35.849253584 +0100
@@ -123,6 +123,7 @@ typedef struct siginfo {
 #define __SI_FAULT	(3 << 16)
 #define __SI_CHLD	(4 << 16)
 #define __SI_RT		(5 << 16)
+#define __SI_MESGQ	(6 << 16)
 #define __SI_CODE(T,N)	((T) | ((N) & 0xffff))
 #else
 #define __SI_KILL	0
@@ -131,6 +132,7 @@ typedef struct siginfo {
 #define __SI_FAULT	0
 #define __SI_CHLD	0
 #define __SI_RT		0
+#define __SI_MESGQ	0
 #define __SI_CODE(T,N)	(N)
 #endif
 
@@ -142,7 +144,7 @@ typedef struct siginfo {
 #define SI_KERNEL	0x80		/* sent by the kernel from somewhere */
 #define SI_QUEUE	-1		/* sent by sigqueue */
 #define SI_TIMER __SI_CODE(__SI_TIMER,-2) /* sent by timer expiration */
-#define SI_MESGQ	-3		/* sent by real time mesq state change */
+#define SI_MESGQ __SI_CODE(__SI_MESGQ,-3) /* sent by real time mesq state change */
 #define SI_ASYNCIO	-4		/* sent by AIO completion */
 #define SI_SIGIO	-5		/* sent by queued SIGIO */
 #define SI_TKILL	-6		/* sent by tkill system call */
--- diff/include/asm-generic/vmlinux.lds.h	2003-06-30 10:07:24.000000000 +0100
+++ source/include/asm-generic/vmlinux.lds.h	2004-04-21 10:45:35.850253432 +0100
@@ -51,3 +51,8 @@
 		*(.security_initcall.init) 				\
 		__security_initcall_end = .;				\
 	}
+
+#define SCHED_TEXT							\
+		__scheduling_functions_start_here = .;			\
+		*(.sched.text)						\
+		__scheduling_functions_end_here = .;
--- diff/include/asm-h8300/hdreg.h	2003-05-21 11:50:10.000000000 +0100
+++ source/include/asm-h8300/hdreg.h	2004-04-21 10:45:35.850253432 +0100
@@ -4,6 +4,8 @@
  *  Copyright (C) 1994-1996  Linus Torvalds & authors
  */
 
+#warning this file is obsolete, please do not use it
+
 #ifndef _H8300_HDREG_H
 #define _H8300_HDREG_H
 
--- diff/include/asm-h8300/ide.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-h8300/ide.h	2004-04-21 10:45:35.850253432 +0100
@@ -25,10 +25,7 @@ static __inline__ void ide_init_hwif_por
 {
 }
 
-
-static inline void ide_init_default_hwifs(void)
-{
-}
+#define ide_init_default_irq(base)	(0)
 
 #define MAX_HWIFS	1
 
--- diff/include/asm-h8300/io.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-h8300/io.h	2004-04-21 10:45:35.851253280 +0100
@@ -9,7 +9,7 @@
 #if defined(CONFIG_H83007) || defined(CONFIG_H83068)
 #include <asm/regs306x.h>
 #elif defined(CONFIG_H8S2678)
-#include <asm/regs2678.h>
+#include <asm/regs267x.h>
 #else
 #error UNKNOWN CPU TYPE
 #endif
@@ -73,7 +73,7 @@ static inline unsigned int _swapl(volati
 
 static inline int h8300_buswidth(unsigned int addr)
 {
-	return (*(volatile unsigned char *)ABWCR & (1 << (addr >> 21) & 7)) == 0;
+	return (*(volatile unsigned char *)ABWCR & (1 << ((addr >> 21) & 7))) == 0;
 }
 
 static inline void io_outsb(unsigned int addr, void *buf, int len)
@@ -145,10 +145,10 @@ static inline void io_insl(unsigned int 
 #define memcpy_fromio(a,b,c)	memcpy((a),(void *)(b),(c))
 #define memcpy_toio(a,b,c)	memcpy((void *)(a),(b),(c))
 
-#define inb(addr)    ((h8300_buswidth(addr))?readb(addr ^ 1) & 0xff:readb(addr))
+#define inb(addr)    ((h8300_buswidth(addr))?readb((addr) ^ 1) & 0xff:readb(addr))
 #define inw(addr)    _swapw(readw(addr))
 #define inl(addr)    _swapl(readl(addr))
-#define outb(x,addr) ((void)((h8300_buswidth(addr) && (addr & 1))?writew(x,addr):writeb(x,addr)))
+#define outb(x,addr) ((void)((h8300_buswidth(addr) && ((addr) & 1))?writew(x,addr):writeb(x,addr)))
 #define outw(x,addr) ((void) writew(_swapw(x),addr))
 #define outl(x,addr) ((void) writel(_swapl(x),addr))
 
--- diff/include/asm-h8300/irq.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-h8300/irq.h	2004-04-21 10:45:35.851253280 +0100
@@ -68,4 +68,8 @@ extern void disable_irq(unsigned int);
 #define enable_irq_nosync(x)	enable_irq(x)
 #define disable_irq_nosync(x)	disable_irq(x)
 
+struct irqaction;
+struct pt_regs;
+int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
+
 #endif /* _H8300_IRQ_H_ */
--- diff/include/asm-h8300/processor.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-h8300/processor.h	2004-04-21 10:45:35.852253128 +0100
@@ -51,16 +51,19 @@ extern inline void wrusp(unsigned long u
 #define MCA_bus 0
 
 struct thread_struct {
-	unsigned long ksp;		/* kernel stack pointer */
-	unsigned long usp;		/* user stack pointer */
-	unsigned long ccr;		/* saved status register */
-	unsigned long esp0;             /* points to SR of stack frame */
-	unsigned long debugreg[8];      /* debug info */
+	unsigned long  ksp;		/* kernel stack pointer */
+	unsigned long  usp;		/* user stack pointer */
+	unsigned long  ccr;		/* saved status register */
+	unsigned long  esp0;            /* points to SR of stack frame */
+	struct {
+		unsigned short *addr;
+		unsigned short inst;
+	} breakinfo;
 };
 
 #define INIT_THREAD  { \
 	sizeof(init_stack) + (unsigned long) init_stack, 0, \
-	PS_S, \
+	PS_S,  0, {(unsigned short *)-1, 0}, \
 }
 
 /*
--- diff/include/asm-h8300/ptrace.h	2003-08-20 14:16:33.000000000 +0100
+++ source/include/asm-h8300/ptrace.h	2004-04-21 10:45:35.853252976 +0100
@@ -14,6 +14,7 @@
 #define PT_CCR	   8
 #define PT_PC	   9
 #define PT_USP	   10
+#define PT_EXR     12
 
 /* this struct defines the way the registers are stored on the
    stack during a system call. */
@@ -44,6 +45,16 @@ struct pt_regs {
 #define PS_S  (0x10)
 #endif
 
+#if defined(__H8300H__)
+#define H8300_REGS_NO 11
+#endif
+#if defined(__H8300S__)
+#define H8300_REGS_NO 12
+#endif
+
+/* Find the stack offset for a register, relative to thread.esp0. */
+#define PT_REG(reg)	((long)&((struct pt_regs *)0)->reg)
+
 #define user_mode(regs) (!((regs)->ccr & PS_S))
 #define instruction_pointer(regs) ((regs)->pc)
 extern void show_regs(struct pt_regs *);
--- diff/include/asm-h8300/regs306x.h	2003-08-20 14:16:33.000000000 +0100
+++ source/include/asm-h8300/regs306x.h	2004-04-21 10:45:35.853252976 +0100
@@ -125,8 +125,8 @@
 #define RDR2  0xFFFFC5
 #define SCMR2 0xFFFFC6
 
-#define MDCR   0xFEE000
-#define SYSCR  0xFEE001
+#define MDCR   0xFEE011
+#define SYSCR  0xFEE012
 #define DIVCR  0xFEE01B
 #define MSTCRH 0xFEE01C
 #define MSTCRL 0xFEE01D
--- diff/include/asm-i386/bitops.h	2003-11-25 15:24:59.000000000 +0000
+++ source/include/asm-i386/bitops.h	2004-04-21 10:45:35.853252976 +0100
@@ -212,7 +212,7 @@ static __inline__ int __test_and_change_
 }
 
 /**
- * test_and_change_bit - Change a bit and return its new value
+ * test_and_change_bit - Change a bit and return its old value
  * @nr: Bit to change
  * @addr: Address to count from
  *
--- diff/include/asm-i386/hdreg.h	2003-05-21 11:49:50.000000000 +0100
+++ source/include/asm-i386/hdreg.h	2004-04-21 10:45:35.854252824 +0100
@@ -1,11 +1 @@
-/*
- *  linux/include/asm-i386/hdreg.h
- *
- *  Copyright (C) 1994-1996  Linus Torvalds & authors
- */
-
-#ifndef __ASMi386_HDREG_H
-#define __ASMi386_HDREG_H
-
-
-#endif /* __ASMi386_HDREG_H */
+#warning this file is obsolete, please do not use it
--- diff/include/asm-i386/hw_irq.h	2004-02-18 08:54:12.000000000 +0000
+++ source/include/asm-i386/hw_irq.h	2004-04-21 10:45:35.854252824 +0100
@@ -27,6 +27,7 @@
 
 extern u8 irq_vector[NR_IRQ_VECTORS];
 #define IO_APIC_VECTOR(irq)	(irq_vector[irq])
+#define AUTO_ASSIGN		-1
 
 extern void (*interrupt[NR_IRQS])(void);
 
--- diff/include/asm-i386/ide.h	2003-05-21 11:50:00.000000000 +0100
+++ source/include/asm-i386/ide.h	2004-04-21 10:45:35.854252824 +0100
@@ -59,29 +59,23 @@ static __inline__ unsigned long ide_defa
 	}
 }
 
+#ifdef CONFIG_X86_PC9800
 static __inline__ void ide_init_hwif_ports(hw_regs_t *hw, unsigned long data_port,
 	 unsigned long ctrl_port, int *irq)
 {
 	unsigned long reg = data_port;
 	int i;
-#ifdef CONFIG_X86_PC9800
+
 	unsigned long increment = data_port == 0x640 ? 2 : 1;
-#endif
 
 	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
 		hw->io_ports[i] = reg;
-#ifdef CONFIG_X86_PC9800
 		reg += increment;
-#else
-		reg += 1;
-#endif
 	}
 	if (ctrl_port) {
 		hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
-#ifdef CONFIG_X86_PC9800
 	} else if (data_port == 0x640) {
 		hw->io_ports[IDE_CONTROL_OFFSET] = 0x74c;
-#endif
 	} else {
 		hw->io_ports[IDE_CONTROL_OFFSET] = hw->io_ports[IDE_DATA_OFFSET] + 0x206;
 	}
@@ -89,21 +83,13 @@ static __inline__ void ide_init_hwif_por
 		*irq = 0;
 	hw->io_ports[IDE_IRQ_OFFSET] = 0;
 }
+#endif
 
-static __inline__ void ide_init_default_hwifs(void)
-{
-#ifndef CONFIG_BLK_DEV_IDEPCI
-	hw_regs_t hw;
-	int index;
-
-	for(index = 0; index < MAX_HWIFS; index++) {
-		memset(&hw, 0, sizeof hw);
-		ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL);
-		hw.irq = ide_default_irq(ide_default_io_base(index));
-		ide_register_hw(&hw, NULL);
-	}
-#endif /* CONFIG_BLK_DEV_IDEPCI */
-}
+#ifdef CONFIG_BLK_DEV_IDEPCI
+#define ide_init_default_irq(base)	(0)
+#else
+#define ide_init_default_irq(base)	ide_default_irq(base)
+#endif
 
 #include <asm-generic/ide_iops.h>
 
--- diff/include/asm-i386/irq.h	2004-01-19 10:22:59.000000000 +0000
+++ source/include/asm-i386/irq.h	2004-04-21 10:45:35.855252672 +0100
@@ -14,6 +14,7 @@
 #include <linux/sched.h>
 /* include comes from machine specific directory */
 #include "irq_vectors.h"
+#include <asm/thread_info.h>
 
 static __inline__ int irq_canonicalize(int irq)
 {
@@ -30,4 +31,28 @@ extern int can_request_irq(unsigned int,
 #define ARCH_HAS_NMI_WATCHDOG		/* See include/linux/nmi.h */
 #endif
 
+#ifdef CONFIG_4KSTACKS
+/*
+ * per-CPU IRQ handling contexts (thread information and stack)
+ */
+union irq_ctx {
+	struct thread_info      tinfo;
+	u32                     stack[THREAD_SIZE/sizeof(u32)];
+};
+
+extern union irq_ctx *hardirq_ctx[NR_CPUS];
+extern union irq_ctx *softirq_ctx[NR_CPUS];
+
+extern void irq_ctx_init(int cpu);
+
+#define __ARCH_HAS_DO_SOFTIRQ
+#else
+#define irq_ctx_init(cpu) do { ; } while (0)
+#endif
+
+struct irqaction;
+struct pt_regs;
+asmlinkage int handle_IRQ_event(unsigned int, struct pt_regs *,
+				struct irqaction *);
+
 #endif /* _ASM_IRQ_H */
--- diff/include/asm-i386/mach-default/irq_vectors.h	2004-01-19 10:22:59.000000000 +0000
+++ source/include/asm-i386/mach-default/irq_vectors.h	2004-04-21 10:45:35.855252672 +0100
@@ -84,22 +84,7 @@
  */
 #define NR_VECTORS 256
 
-#ifdef CONFIG_PCI_USE_VECTOR
-#define NR_IRQS FIRST_SYSTEM_VECTOR
-#define NR_IRQ_VECTORS NR_IRQS
-#else
-#ifdef CONFIG_X86_IO_APIC
-#define NR_IRQS 224
-# if (224 >= 32 * NR_CPUS)
-# define NR_IRQ_VECTORS NR_IRQS
-# else
-# define NR_IRQ_VECTORS (32 * NR_CPUS)
-# endif
-#else
-#define NR_IRQS 16
-#define NR_IRQ_VECTORS NR_IRQS
-#endif
-#endif
+#include "irq_vectors_limits.h"
 
 #define FPU_IRQ			13
 
--- diff/include/asm-i386/mach-generic/mach_mpspec.h	2003-06-30 10:07:29.000000000 +0100
+++ source/include/asm-i386/mach-generic/mach_mpspec.h	2004-04-21 10:45:35.856252520 +0100
@@ -8,6 +8,8 @@
 
 #define MAX_IRQ_SOURCES 256
 
-#define MAX_MP_BUSSES 32
+/* Summit or generic (i.e. installer) kernels need lots of bus entries. */
+/* Maximum 256 PCI busses, plus 1 ISA bus in each of 4 cabinets. */
+#define MAX_MP_BUSSES 260
 
 #endif /* __ASM_MACH_MPSPEC_H */
--- diff/include/asm-i386/mach-summit/mach_mpspec.h	2003-06-30 10:07:29.000000000 +0100
+++ source/include/asm-i386/mach-summit/mach_mpspec.h	2004-04-21 10:45:35.857252368 +0100
@@ -8,6 +8,7 @@
 
 #define MAX_IRQ_SOURCES 256
 
-#define MAX_MP_BUSSES 32
+/* Maximum 256 PCI busses, plus 1 ISA bus in each of 4 cabinets. */
+#define MAX_MP_BUSSES 260
 
 #endif /* __ASM_MACH_MPSPEC_H */
--- diff/include/asm-i386/module.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-i386/module.h	2004-04-21 10:45:35.858252216 +0100
@@ -60,6 +60,12 @@ struct mod_arch_specific
 #define MODULE_REGPARM ""
 #endif
 
-#define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY MODULE_REGPARM
+#ifdef CONFIG_4KSTACKS
+#define MODULE_STACKSIZE "4KSTACKS "
+#else
+#define MODULE_STACKSIZE ""
+#endif
+
+#define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY MODULE_REGPARM MODULE_STACKSIZE
 
 #endif /* _ASM_I386_MODULE_H */
--- diff/include/asm-i386/mpspec.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-i386/mpspec.h	2004-04-21 10:45:35.858252216 +0100
@@ -52,7 +52,7 @@ typedef struct physid_mask physid_mask_t
 
 #define physids_and(dst, src1, src2)		bitmap_and((dst).mask, (src1).mask, (src2).mask, MAX_APICS)
 #define physids_or(dst, src1, src2)		bitmap_or((dst).mask, (src1).mask, (src2).mask, MAX_APICS)
-#define physids_clear(map)			bitmap_clear((map).mask, MAX_APICS)
+#define physids_clear(map)			bitmap_zero((map).mask, MAX_APICS)
 #define physids_complement(map)			bitmap_complement((map).mask, MAX_APICS)
 #define physids_empty(map)			bitmap_empty((map).mask, MAX_APICS)
 #define physids_equal(map1, map2)		bitmap_equal((map1).mask, (map2).mask, MAX_APICS)
--- diff/include/asm-i386/pgtable.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-i386/pgtable.h	2004-04-21 10:45:35.859252064 +0100
@@ -35,7 +35,7 @@ extern pgd_t swapper_pg_dir[1024];
 extern kmem_cache_t *pgd_cache;
 extern kmem_cache_t *pmd_cache;
 extern spinlock_t pgd_lock;
-extern struct list_head pgd_list;
+extern struct page *pgd_list;
 
 void pmd_ctor(void *, kmem_cache_t *, unsigned long);
 void pgd_ctor(void *, kmem_cache_t *, unsigned long);
@@ -107,6 +107,9 @@ void paging_init(void);
 #define _PAGE_BIT_DIRTY		6
 #define _PAGE_BIT_PSE		7	/* 4 MB (or 2MB) page, Pentium+, if present.. */
 #define _PAGE_BIT_GLOBAL	8	/* Global TLB entry PPro+ */
+#define _PAGE_BIT_UNUSED1	9	/* available for programmer */
+#define _PAGE_BIT_UNUSED2	10
+#define _PAGE_BIT_UNUSED3	11
 
 #define _PAGE_PRESENT	0x001
 #define _PAGE_RW	0x002
@@ -117,6 +120,9 @@ void paging_init(void);
 #define _PAGE_DIRTY	0x040
 #define _PAGE_PSE	0x080	/* 4 MB (or 2MB) page, Pentium+, if present.. */
 #define _PAGE_GLOBAL	0x100	/* Global TLB entry PPro+ */
+#define _PAGE_UNUSED1	0x200	/* available for programmer */
+#define _PAGE_UNUSED2	0x400
+#define _PAGE_UNUSED3	0x800
 
 #define _PAGE_FILE	0x040	/* set:pagecache unset:swap */
 #define _PAGE_PROTNONE	0x080	/* If not present */
--- diff/include/asm-i386/processor.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-i386/processor.h	2004-04-21 10:45:35.859252064 +0100
@@ -403,6 +403,8 @@ struct tss_struct {
 	unsigned long stack[64];
 } __attribute__((packed));
 
+#define ARCH_MIN_TASKALIGN	16
+
 struct thread_struct {
 /* cached TLS descriptors. */
 	struct desc_struct tls_array[GDT_ENTRY_TLS_ENTRIES];
--- diff/include/asm-i386/thread_info.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-i386/thread_info.h	2004-04-21 10:45:35.860251912 +0100
@@ -9,6 +9,9 @@
 
 #ifdef __KERNEL__
 
+#include <linux/config.h>
+#include <asm/page.h>
+
 #ifndef __ASSEMBLY__
 #include <asm/processor.h>
 #endif
@@ -29,12 +32,16 @@ struct thread_info {
 	__u32			cpu;		/* current CPU */
 	__s32			preempt_count; /* 0 => preemptable, <0 => BUG */
 
+
 	mm_segment_t		addr_limit;	/* thread address space:
 					 	   0-0xBFFFFFFF for user-thead
 						   0-0xFFFFFFFF for kernel-thread
 						*/
 	struct restart_block    restart_block;
 
+	unsigned long           previous_esp;   /* ESP of the previous stack in case
+						   of nested (IRQ) stacks
+						*/
 	__u8			supervisor_stack[0];
 };
 
@@ -53,7 +60,13 @@ struct thread_info {
 #endif
 
 #define PREEMPT_ACTIVE		0x4000000
+#ifdef CONFIG_4KSTACKS
+#define THREAD_SIZE            (4096)
+#else
+#define THREAD_SIZE		(8192)
+#endif
 
+#define STACK_WARN             (THREAD_SIZE/8)
 /*
  * macros/functions for gaining access to the thread information structure
  *
@@ -77,7 +90,6 @@ struct thread_info {
 #define init_thread_info	(init_thread_union.thread_info)
 #define init_stack		(init_thread_union.stack)
 
-#define THREAD_SIZE (2*PAGE_SIZE)
 
 /* how to get the thread information struct from C */
 static inline struct thread_info *current_thread_info(void)
@@ -87,6 +99,14 @@ static inline struct thread_info *curren
 	return ti;
 }
 
+/* how to get the current stack pointer from C */
+static inline unsigned long current_stack_pointer(void)
+{
+	unsigned long ti;
+	__asm__("movl %%esp,%0; ":"=r" (ti) : );
+	return ti;
+}
+
 /* thread information allocation */
 #ifdef CONFIG_DEBUG_STACK_USAGE
 #define alloc_thread_info(tsk)					\
@@ -108,8 +128,6 @@ static inline struct thread_info *curren
 
 #else /* !__ASSEMBLY__ */
 
-#define THREAD_SIZE	8192
-
 /* how to get the thread information struct from ASM */
 #define GET_THREAD_INFO(reg) \
 	movl $-THREAD_SIZE, reg; \
@@ -133,6 +151,7 @@ static inline struct thread_info *curren
 #define TIF_NEED_RESCHED	3	/* rescheduling necessary */
 #define TIF_SINGLESTEP		4	/* restore singlestep on return to user mode */
 #define TIF_IRET		5	/* return with iret */
+#define TIF_SYSCALL_AUDIT	7	/* syscall auditing active */
 #define TIF_POLLING_NRFLAG	16	/* true if poll_idle() is polling TIF_NEED_RESCHED */
 
 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
@@ -141,9 +160,12 @@ static inline struct thread_info *curren
 #define _TIF_NEED_RESCHED	(1<<TIF_NEED_RESCHED)
 #define _TIF_SINGLESTEP		(1<<TIF_SINGLESTEP)
 #define _TIF_IRET		(1<<TIF_IRET)
+#define _TIF_SYSCALL_AUDIT	(1<<TIF_SYSCALL_AUDIT)
 #define _TIF_POLLING_NRFLAG	(1<<TIF_POLLING_NRFLAG)
 
-#define _TIF_WORK_MASK		0x0000FFFE	/* work to do on interrupt/exception return */
+/* work to do on interrupt/exception return */
+#define _TIF_WORK_MASK \
+  (0x0000FFFF & ~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT))
 #define _TIF_ALLWORK_MASK	0x0000FFFF	/* work to do on any return to u-space */
 
 /*
--- diff/include/asm-i386/uaccess.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/asm-i386/uaccess.h	2004-04-21 10:45:35.860251912 +0100
@@ -454,55 +454,9 @@ __copy_from_user(void *to, const void __
 	return __copy_from_user_ll(to, from, n);
 }
 
-/**
- * copy_to_user: - Copy a block of data into user space.
- * @to:   Destination address, in user space.
- * @from: Source address, in kernel space.
- * @n:    Number of bytes to copy.
- *
- * Context: User context only.  This function may sleep.
- *
- * Copy data from kernel space to user space.
- *
- * Returns number of bytes that could not be copied.
- * On success, this will be zero.
- */
-static inline unsigned long
-copy_to_user(void __user *to, const void *from, unsigned long n)
-{
-	might_sleep();
-	if (access_ok(VERIFY_WRITE, to, n))
-		n = __copy_to_user(to, from, n);
-	return n;
-}
-
-/**
- * copy_from_user: - Copy a block of data from user space.
- * @to:   Destination address, in kernel space.
- * @from: Source address, in user space.
- * @n:    Number of bytes to copy.
- *
- * Context: User context only.  This function may sleep.
- *
- * Copy data from user space to kernel space.
- *
- * Returns number of bytes that could not be copied.
- * On success, this will be zero.
- *
- * If some data could not be copied, this function will pad the copied
- * data to the requested size using zero bytes.
- */
-static inline unsigned long
-copy_from_user(void *to, const void __user *from, unsigned long n)
-{
-	might_sleep();
-	if (access_ok(VERIFY_READ, from, n))
-		n = __copy_from_user(to, from, n);
-	else
-		memset(to, 0, n);
-	return n;
-}
-
+unsigned long copy_to_user(void __user *to, const void *from, unsigned long n);
+unsigned long copy_from_user(void *to,
+			const void __user *from, unsigned long n);
 long strncpy_from_user(char *dst, const char __user *src, long count);
 long __strncpy_from_user(char *dst, const char __user *src, long count);
 
--- diff/include/asm-i386/unistd.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-i386/unistd.h	2004-04-21 10:45:35.861251760 +0100
@@ -279,8 +279,17 @@
 #define __NR_utimes		271
 #define __NR_fadvise64_64	272
 #define __NR_vserver		273
+#define __NR_mbind		274
+#define __NR_get_mempolicy	275
+#define __NR_set_mempolicy	276
+#define __NR_mq_open 		277
+#define __NR_mq_unlink		(__NR_mq_open+1)
+#define __NR_mq_timedsend	(__NR_mq_open+2)
+#define __NR_mq_timedreceive	(__NR_mq_open+3)
+#define __NR_mq_notify		(__NR_mq_open+4)
+#define __NR_mq_getsetattr	(__NR_mq_open+5)
 
-#define NR_syscalls 274
+#define NR_syscalls 283
 
 /* user-visible error numbers are in the range -1 - -124: see <asm-i386/errno.h> */
 
--- diff/include/asm-ia64/bitops.h	2003-08-26 10:00:54.000000000 +0100
+++ source/include/asm-ia64/bitops.h	2004-04-21 10:45:35.861251760 +0100
@@ -236,7 +236,7 @@ __test_and_clear_bit(int nr, volatile vo
 }
 
 /**
- * test_and_change_bit - Change a bit and return its new value
+ * test_and_change_bit - Change a bit and return its old value
  * @nr: Bit to set
  * @addr: Address to count from
  *
--- diff/include/asm-ia64/hdreg.h	2002-10-16 04:27:54.000000000 +0100
+++ source/include/asm-ia64/hdreg.h	2004-04-21 10:45:35.862251608 +0100
@@ -4,6 +4,8 @@
  *  Copyright (C) 1994-1996  Linus Torvalds & authors
  */
 
+#warning this file is obsolete, please do not use it
+
 #ifndef __ASM_IA64_HDREG_H
 #define __ASM_IA64_HDREG_H
 
--- diff/include/asm-ia64/hw_irq.h	2003-09-30 15:46:19.000000000 +0100
+++ source/include/asm-ia64/hw_irq.h	2004-04-21 10:45:35.862251608 +0100
@@ -34,6 +34,8 @@ typedef u8 ia64_vector;
 #define IA64_MAX_VECTORED_IRQ		255
 #define IA64_NUM_VECTORS		256
 
+#define AUTO_ASSIGN			-1
+
 #define IA64_SPURIOUS_INT_VECTOR	0x0f
 
 /*
@@ -80,7 +82,7 @@ extern unsigned long ipi_base_addr;
 
 extern struct hw_interrupt_type irq_type_ia64_lsapic;	/* CPU-internal interrupt controller */
 
-extern int ia64_alloc_vector (void);	/* allocate a free vector */
+extern int assign_irq_vector (int irq);	/* allocate a free vector */
 extern void ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect);
 extern void register_percpu_irq (ia64_vector vec, struct irqaction *action);
 
--- diff/include/asm-ia64/ide.h	2003-05-21 11:49:50.000000000 +0100
+++ source/include/asm-ia64/ide.h	2004-04-21 10:45:35.862251608 +0100
@@ -25,8 +25,7 @@
 # endif
 #endif
 
-static __inline__ int
-ide_default_irq (ide_ioreg_t base)
+static inline int ide_default_irq(unsigned long base)
 {
 	switch (base) {
 	      case 0x1f0: return isa_irq_to_vector(14);
@@ -40,8 +39,7 @@ ide_default_irq (ide_ioreg_t base)
 	}
 }
 
-static __inline__ ide_ioreg_t
-ide_default_io_base (int index)
+static inline unsigned long ide_default_io_base(int index)
 {
 	switch (index) {
 	      case 0: return 0x1f0;
@@ -55,41 +53,11 @@ ide_default_io_base (int index)
 	}
 }
 
-static __inline__ void
-ide_init_hwif_ports (hw_regs_t *hw, ide_ioreg_t data_port, ide_ioreg_t ctrl_port, int *irq)
-{
-	ide_ioreg_t reg = data_port;
-	int i;
-
-	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
-		hw->io_ports[i] = reg;
-		reg += 1;
-	}
-	if (ctrl_port) {
-		hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
-	} else {
-		hw->io_ports[IDE_CONTROL_OFFSET] = hw->io_ports[IDE_DATA_OFFSET] + 0x206;
-	}
-	if (irq != NULL)
-		*irq = 0;
-	hw->io_ports[IDE_IRQ_OFFSET] = 0;
-}
-
-static __inline__ void
-ide_init_default_hwifs (void)
-{
-#ifndef CONFIG_PCI
-	hw_regs_t hw;
-	int index;
-
-	for(index = 0; index < MAX_HWIFS; index++) {
-		memset(&hw, 0, sizeof hw);
-		ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL);
-		hw.irq = ide_default_irq(ide_default_io_base(index));
-		ide_register_hw(&hw, NULL);
-	}
+#ifdef CONFIG_PCI
+#define ide_init_default_irq(base)	(0)
+#else
+#define ide_init_default_irq(base)	ide_default_irq(base)
 #endif
-}
 
 #include <asm-generic/ide_iops.h>
 
--- diff/include/asm-ia64/irq.h	2003-05-21 11:50:16.000000000 +0100
+++ source/include/asm-ia64/irq.h	2004-04-21 10:45:35.863251456 +0100
@@ -12,6 +12,7 @@
  */
 
 #define NR_IRQS		256
+#define NR_IRQ_VECTORS	NR_IRQS
 
 static __inline__ int
 irq_canonicalize (int irq)
@@ -29,4 +30,8 @@ extern void disable_irq_nosync (unsigned
 extern void enable_irq (unsigned int);
 extern void set_irq_affinity_info (unsigned int irq, int dest, int redir);
 
+struct irqaction;
+struct pt_regs;
+int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
+
 #endif /* _ASM_IA64_IRQ_H */
--- diff/include/asm-ia64/machvec_hpzx1.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-ia64/machvec_hpzx1.h	2004-04-21 10:45:35.863251456 +0100
@@ -2,6 +2,7 @@
 #define _ASM_IA64_MACHVEC_HPZX1_h
 
 extern ia64_mv_setup_t dig_setup;
+extern ia64_mv_setup_t			sba_setup;
 extern ia64_mv_dma_alloc_coherent	sba_alloc_coherent;
 extern ia64_mv_dma_free_coherent	sba_free_coherent;
 extern ia64_mv_dma_map_single		sba_map_single;
@@ -19,7 +20,7 @@ extern ia64_mv_dma_mapping_error	sba_dma
  * the macros are used directly.
  */
 #define platform_name			"hpzx1"
-#define platform_setup			dig_setup
+#define platform_setup			sba_setup
 #define platform_dma_init		machvec_noop
 #define platform_dma_alloc_coherent	sba_alloc_coherent
 #define platform_dma_free_coherent	sba_free_coherent
--- diff/include/asm-ia64/perfmon.h	2003-10-27 09:20:39.000000000 +0000
+++ source/include/asm-ia64/perfmon.h	2004-04-21 10:45:35.864251304 +0100
@@ -242,9 +242,10 @@ extern int pfm_unregister_buffer_fmt(pfm
 /*
  * perfmon interface exported to modules
  */
-extern long pfm_mod_fast_read_pmds(struct task_struct *, unsigned long mask[4], unsigned long *addr, struct pt_regs *regs);
-extern long pfm_mod_read_pmds(struct task_struct *, pfarg_reg_t *req, unsigned int nreq, struct pt_regs *regs);
-extern long pfm_mod_write_pmcs(struct task_struct *, pfarg_reg_t *req, unsigned int nreq, struct pt_regs *regs);
+extern int pfm_mod_read_pmds(struct task_struct *, void *req, unsigned int nreq, struct pt_regs *regs);
+extern int pfm_mod_write_pmcs(struct task_struct *, void *req, unsigned int nreq, struct pt_regs *regs);
+extern int pfm_mod_write_ibrs(struct task_struct *task, void *req, unsigned int nreq, struct pt_regs *regs);
+extern int pfm_mod_write_dbrs(struct task_struct *task, void *req, unsigned int nreq, struct pt_regs *regs);
 
 /*
  * describe the content of the local_cpu_date->pfm_syst_info field
--- diff/include/asm-ia64/pgtable.h	2004-02-09 10:36:12.000000000 +0000
+++ source/include/asm-ia64/pgtable.h	2004-04-21 10:45:35.864251304 +0100
@@ -119,7 +119,8 @@
 #define PAGE_NONE	__pgprot(_PAGE_PROTNONE | _PAGE_A)
 #define PAGE_SHARED	__pgprot(__ACCESS_BITS | _PAGE_PL_3 | _PAGE_AR_RW)
 #define PAGE_READONLY	__pgprot(__ACCESS_BITS | _PAGE_PL_3 | _PAGE_AR_R)
-#define PAGE_COPY	__pgprot(__ACCESS_BITS | _PAGE_PL_3 | _PAGE_AR_RX)
+#define PAGE_COPY	__pgprot(__ACCESS_BITS | _PAGE_PL_3 | _PAGE_AR_R)
+#define PAGE_COPY_EXEC	__pgprot(__ACCESS_BITS | _PAGE_PL_3 | _PAGE_AR_RX)
 #define PAGE_GATE	__pgprot(__ACCESS_BITS | _PAGE_PL_0 | _PAGE_AR_X_RX)
 #define PAGE_KERNEL	__pgprot(__DIRTY_BITS  | _PAGE_PL_0 | _PAGE_AR_RWX)
 #define PAGE_KERNELRX	__pgprot(__ACCESS_BITS | _PAGE_PL_0 | _PAGE_AR_RX)
--- diff/include/asm-ia64/processor.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-ia64/processor.h	2004-04-21 10:45:35.865251152 +0100
@@ -137,14 +137,6 @@ struct ia64_psr {
  * state comes earlier:
  */
 struct cpuinfo_ia64 {
-	/* irq_stat must be 64-bit aligned */
-	union {
-		struct {
-			__u32 irq_count;
-			__u32 bh_count;
-		} f;
-		__u64 irq_and_bh_counts;
-	} irq_stat;
 	__u32 softirq_pending;
 	__u64 itm_delta;	/* # of clock cycles between clock ticks */
 	__u64 itm_next;		/* interval timer mask value to use for next clock tick */
--- diff/include/asm-m68k/hdreg.h	2003-06-09 14:18:20.000000000 +0100
+++ source/include/asm-m68k/hdreg.h	2004-04-21 10:45:35.865251152 +0100
@@ -1,11 +1 @@
-/*
- *  linux/include/asm-m68k/hdreg.h
- *
- *  Copyright (C) 1994-1996  Linus Torvalds & authors
- */
-
-#ifndef _M68K_HDREG_H
-#define _M68K_HDREG_H
-
-
-#endif /* _M68K_HDREG_H */
+#warning this file is obsolete, please do not use it
--- diff/include/asm-m68k/ide.h	2003-06-09 14:18:20.000000000 +0100
+++ source/include/asm-m68k/ide.h	2004-04-21 10:45:35.865251152 +0100
@@ -74,13 +74,7 @@ static __inline__ void ide_init_hwif_por
 		printk("ide_init_hwif_ports: must not be called\n");
 }
 
-/*
- * This registers the standard ports for this architecture with the IDE
- * driver.
- */
-static __inline__ void ide_init_default_hwifs(void)
-{
-}
+#define ide_init_default_irq(base)	(0)
 
 /*
  * Get rid of defs from io.h - ide has its private and conflicting versions
--- diff/include/asm-m68k/io.h	2004-02-18 08:54:12.000000000 +0000
+++ source/include/asm-m68k/io.h	2004-04-21 10:45:35.866251000 +0100
@@ -120,66 +120,66 @@ extern int isa_sex;
  * be compiled in so the case statement will be optimised away
  */
 
-static inline unsigned char *isa_itb(long addr)
+static inline u8 *isa_itb(long addr)
 {
   switch(ISA_TYPE)
     {
 #ifdef CONFIG_Q40
-    case Q40_ISA: return (unsigned char *)Q40_ISA_IO_B(addr);
+    case Q40_ISA: return (u8 *)Q40_ISA_IO_B(addr);
 #endif
 #ifdef CONFIG_GG2
-    case GG2_ISA: return (unsigned char *)GG2_ISA_IO_B(addr);
+    case GG2_ISA: return (u8 *)GG2_ISA_IO_B(addr);
 #endif
 #ifdef CONFIG_AMIGA_PCMCIA
-    case AG_ISA: return (unsigned char *)AG_ISA_IO_B(addr);
+    case AG_ISA: return (u8 *)AG_ISA_IO_B(addr);
 #endif
     default: return 0; /* avoid warnings, just in case */
     }
 }
-static inline unsigned short *isa_itw(long addr)
+static inline u16 *isa_itw(long addr)
 {
   switch(ISA_TYPE)
     {
 #ifdef CONFIG_Q40
-    case Q40_ISA: return (unsigned short *)Q40_ISA_IO_W(addr);
+    case Q40_ISA: return (u16 *)Q40_ISA_IO_W(addr);
 #endif
 #ifdef CONFIG_GG2
-    case GG2_ISA: return (unsigned short *)GG2_ISA_IO_W(addr);
+    case GG2_ISA: return (u16 *)GG2_ISA_IO_W(addr);
 #endif
 #ifdef CONFIG_AMIGA_PCMCIA
-    case AG_ISA: return (unsigned short *)AG_ISA_IO_W(addr);
+    case AG_ISA: return (u16 *)AG_ISA_IO_W(addr);
 #endif
     default: return 0; /* avoid warnings, just in case */
     }
 }
-static inline unsigned char *isa_mtb(long addr)
+static inline u8 *isa_mtb(long addr)
 {
   switch(ISA_TYPE)
     {
 #ifdef CONFIG_Q40
-    case Q40_ISA: return (unsigned char *)Q40_ISA_MEM_B(addr);
+    case Q40_ISA: return (u8 *)Q40_ISA_MEM_B(addr);
 #endif
 #ifdef CONFIG_GG2
-    case GG2_ISA: return (unsigned char *)GG2_ISA_MEM_B(addr);
+    case GG2_ISA: return (u8 *)GG2_ISA_MEM_B(addr);
 #endif
 #ifdef CONFIG_AMIGA_PCMCIA
-    case AG_ISA: return (unsigned char *)addr;
+    case AG_ISA: return (u8 *)addr;
 #endif
     default: return 0; /* avoid warnings, just in case */
     }
 }
-static inline unsigned short *isa_mtw(long addr)
+static inline u16 *isa_mtw(long addr)
 {
   switch(ISA_TYPE)
     {
 #ifdef CONFIG_Q40
-    case Q40_ISA: return (unsigned short *)Q40_ISA_MEM_W(addr);
+    case Q40_ISA: return (u16 *)Q40_ISA_MEM_W(addr);
 #endif
 #ifdef CONFIG_GG2
-    case GG2_ISA: return (unsigned short *)GG2_ISA_MEM_W(addr);
+    case GG2_ISA: return (u16 *)GG2_ISA_MEM_W(addr);
 #endif
 #ifdef CONFIG_AMIGA_PCMCIA
-    case AG_ISA: return (unsigned short *)addr;
+    case AG_ISA: return (u16 *)addr;
 #endif
     default: return 0; /* avoid warnings, just in case */
     }
@@ -213,7 +213,7 @@ static inline void isa_delay(void)
     }
 }
 
-#define isa_inb_p(p)      ({unsigned char v=isa_inb(p);isa_delay();v;})
+#define isa_inb_p(p)      ({u8 v=isa_inb(p);isa_delay();v;})
 #define isa_outb_p(v,p)   ({isa_outb((v),(p));isa_delay();})
 
 #define isa_insb(port, buf, nr) raw_insb(isa_itb(port), (buf), (nr))
--- diff/include/asm-m68k/irq.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-m68k/irq.h	2004-04-21 10:45:35.866251000 +0100
@@ -124,4 +124,8 @@ extern volatile unsigned int num_spuriou
  */
 extern irq_node_t *new_irq_node(void);
 
+struct irqaction;
+struct pt_regs;
+int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
+
 #endif /* _M68K_IRQ_H_ */
--- diff/include/asm-m68k/raw_io.h	2003-06-09 14:18:20.000000000 +0100
+++ source/include/asm-m68k/raw_io.h	2004-04-21 10:45:35.867250848 +0100
@@ -10,6 +10,8 @@
 
 #ifdef __KERNEL__
 
+#include <asm/types.h>
+
 
 /* Values for nocacheflag and cmode */
 #define IOMAP_FULL_CACHING		0
@@ -28,21 +30,21 @@ extern void __iounmap(void *addr, unsign
  * two accesses to memory, which may be undesirable for some devices.
  */
 #define in_8(addr) \
-    ({ unsigned char __v = (*(volatile unsigned char *) (addr)); __v; })
+    ({ u8 __v = (*(volatile u8 *) (addr)); __v; })
 #define in_be16(addr) \
-    ({ unsigned short __v = (*(volatile unsigned short *) (addr)); __v; })
+    ({ u16 __v = (*(volatile u16 *) (addr)); __v; })
 #define in_be32(addr) \
-    ({ unsigned int __v = (*(volatile unsigned int *) (addr)); __v; })
+    ({ u32 __v = (*(volatile u32 *) (addr)); __v; })
 #define in_le16(addr) \
-    ({ unsigned short __v = le16_to_cpu(*(volatile unsigned short *) (addr)); __v; })
+    ({ u16 __v = le16_to_cpu(*(volatile u16 *) (addr)); __v; })
 #define in_le32(addr) \
-    ({ unsigned int __v = le32_to_cpu(*(volatile unsigned int *) (addr)); __v; })
+    ({ u32 __v = le32_to_cpu(*(volatile u32 *) (addr)); __v; })
 
-#define out_8(addr,b) (void)((*(volatile unsigned char *) (addr)) = (b))
-#define out_be16(addr,w) (void)((*(volatile unsigned short *) (addr)) = (w))
-#define out_be32(addr,l) (void)((*(volatile unsigned int *) (addr)) = (l))
-#define out_le16(addr,w) (void)((*(volatile unsigned short *) (addr)) = cpu_to_le16(w))
-#define out_le32(addr,l) (void)((*(volatile unsigned int *) (addr)) = cpu_to_le32(l))
+#define out_8(addr,b) (void)((*(volatile u8 *) (addr)) = (b))
+#define out_be16(addr,w) (void)((*(volatile u16 *) (addr)) = (w))
+#define out_be32(addr,l) (void)((*(volatile u32 *) (addr)) = (l))
+#define out_le16(addr,w) (void)((*(volatile u16 *) (addr)) = cpu_to_le16(w))
+#define out_le32(addr,l) (void)((*(volatile u32 *) (addr)) = cpu_to_le32(l))
 
 #define raw_inb in_8
 #define raw_inw in_be16
@@ -52,8 +54,7 @@ extern void __iounmap(void *addr, unsign
 #define raw_outw(val,port) out_be16((port),(val))
 #define raw_outl(val,port) out_be32((port),(val))
 
-static inline void raw_insb(volatile unsigned char *port, unsigned char *buf,
-			    unsigned int len)
+static inline void raw_insb(volatile u8 *port, u8 *buf, unsigned int len)
 {
 	unsigned int i;
 
@@ -61,8 +62,8 @@ static inline void raw_insb(volatile uns
 		*buf++ = in_8(port);
 }
 
-static inline void raw_outsb(volatile unsigned char *port,
-			     const unsigned char *buf, unsigned int len)
+static inline void raw_outsb(volatile u8 *port, const u8 *buf,
+			     unsigned int len)
 {
 	unsigned int i;
 
@@ -70,8 +71,7 @@ static inline void raw_outsb(volatile un
 		out_8(port, *buf++);
 }
 
-static inline void raw_insw(volatile unsigned short *port, unsigned short *buf,
-			    unsigned int nr)
+static inline void raw_insw(volatile u16 *port, u16 *buf, unsigned int nr)
 {
 	unsigned int tmp;
 
@@ -110,8 +110,8 @@ static inline void raw_insw(volatile uns
 	}
 }
 
-static inline void raw_outsw(volatile unsigned short *port,
-			     const unsigned short *buf, unsigned int nr)
+static inline void raw_outsw(volatile u16 *port, const u16 *buf,
+			     unsigned int nr)
 {
 	unsigned int tmp;
 
@@ -150,8 +150,7 @@ static inline void raw_outsw(volatile un
 	}
 }
 
-static inline void raw_insl(volatile unsigned int *port, unsigned int *buf,
-			    unsigned int nr)
+static inline void raw_insl(volatile u32 *port, u32 *buf, unsigned int nr)
 {
 	unsigned int tmp;
 
@@ -190,8 +189,8 @@ static inline void raw_insl(volatile uns
 	}
 }
 
-static inline void raw_outsl(volatile unsigned int *port,
-			     const unsigned int *buf, unsigned int nr)
+static inline void raw_outsl(volatile u32 *port, const u32 *buf,
+			     unsigned int nr)
 {
 	unsigned int tmp;
 
@@ -231,8 +230,8 @@ static inline void raw_outsl(volatile un
 }
 
 
-static inline void raw_insw_swapw(volatile unsigned short *port,
-				  unsigned short *buf, unsigned int nr)
+static inline void raw_insw_swapw(volatile u16 *port, u16 *buf,
+				  unsigned int nr)
 {
     if ((nr) % 8)
 	__asm__ __volatile__
@@ -284,8 +283,8 @@ static inline void raw_insw_swapw(volati
 		: "d0", "a0", "a1", "d6");
 }
 
-static inline void raw_outsw_swapw(volatile unsigned short *port,
-				   const unsigned short *buf, unsigned int nr)
+static inline void raw_outsw_swapw(volatile u16 *port, const u16 *buf,
+				   unsigned int nr)
 {
     if ((nr) % 8)
 	__asm__ __volatile__
--- diff/include/asm-m68k/sun3mmu.h	2004-02-09 10:36:12.000000000 +0000
+++ source/include/asm-m68k/sun3mmu.h	2004-04-21 10:45:35.867250848 +0100
@@ -1,12 +1,11 @@
 /*
  * Definitions for Sun3 custom MMU.
  */
-#include <asm/movs.h>
-
 #ifndef __SUN3_MMU_H__
 #define __SUN3_MMU_H__
 
-#define FC_CONTROL 3
+#include <asm/movs.h>
+#include <asm/sun3-head.h>
 
 /* MMU characteristics. */
 #define SUN3_SEGMAPS_PER_CONTEXT	2048
--- diff/include/asm-m68k/tlbflush.h	2004-02-09 10:36:12.000000000 +0000
+++ source/include/asm-m68k/tlbflush.h	2004-04-21 10:45:35.867250848 +0100
@@ -65,20 +65,24 @@ static inline void flush_tlb_all(void)
 
 static inline void flush_tlb_mm(struct mm_struct *mm)
 {
-	if (mm == current->mm)
+	if (mm == current->active_mm)
 		__flush_tlb();
 }
 
 static inline void flush_tlb_page(struct vm_area_struct *vma, unsigned long addr)
 {
-	if (vma->vm_mm == current->mm)
+	if (vma->vm_mm == current->active_mm) {
+		mm_segment_t old_fs = get_fs();
+		set_fs(USER_DS);
 		__flush_tlb_one(addr);
+		set_fs(old_fs);
+	}
 }
 
 static inline void flush_tlb_range(struct vm_area_struct *vma,
 				   unsigned long start, unsigned long end)
 {
-	if (vma->vm_mm == current->mm)
+	if (vma->vm_mm == current->active_mm)
 		__flush_tlb();
 }
 
--- diff/include/asm-m68k/traps.h	2002-10-16 04:28:23.000000000 +0100
+++ source/include/asm-m68k/traps.h	2004-04-21 10:45:35.868250696 +0100
@@ -19,6 +19,8 @@ extern e_vector vectors[];
 
 #endif
 
+#define VEC_RESETSP (0)
+#define VEC_RESETPC (1)
 #define VEC_BUSERR  (2)
 #define VEC_ADDRERR (3)
 #define VEC_ILLEGAL (4)
@@ -29,10 +31,18 @@ extern e_vector vectors[];
 #define VEC_TRACE   (9)
 #define VEC_LINE10  (10)
 #define VEC_LINE11  (11)
-#define VEC_RESV1   (12)
+#define VEC_RESV12  (12)
 #define VEC_COPROC  (13)
 #define VEC_FORMAT  (14)
 #define VEC_UNINT   (15)
+#define VEC_RESV16  (16)
+#define VEC_RESV17  (17)
+#define VEC_RESV18  (18)
+#define VEC_RESV19  (19)
+#define VEC_RESV20  (20)
+#define VEC_RESV21  (21)
+#define VEC_RESV22  (22)
+#define VEC_RESV23  (23)
 #define VEC_SPUR    (24)
 #define VEC_INT1    (25)
 #define VEC_INT2    (26)
@@ -65,8 +75,14 @@ extern e_vector vectors[];
 #define VEC_FPOVER  (53)
 #define VEC_FPNAN   (54)
 #define VEC_FPUNSUP (55)
+#define VEC_MMUCFG  (56)
+#define VEC_MMUILL  (57)
+#define VEC_MMUACC  (58)
+#define VEC_RESV59  (59)
 #define	VEC_UNIMPEA (60)
 #define	VEC_UNIMPII (61)
+#define VEC_RESV62  (62)
+#define VEC_RESV63  (63)
 #define VEC_USER    (64)
 
 #define VECOFF(vec) ((vec)<<2)
--- diff/include/asm-m68knommu/coldfire.h	2003-06-09 14:18:20.000000000 +0100
+++ source/include/asm-m68knommu/coldfire.h	2004-04-21 10:45:35.868250696 +0100
@@ -54,6 +54,8 @@
 #define	MCF_CLK		54000000
 #elif defined(CONFIG_CLOCK_60MHz)
 #define	MCF_CLK		60000000
+#elif defined(CONFIG_CLOCK_64MHz)
+#define	MCF_CLK		64000000
 #elif defined(CONFIG_CLOCK_66MHz)
 #define	MCF_CLK		66000000
 #elif defined(CONFIG_CLOCK_70MHz)
--- diff/include/asm-m68knommu/dma-mapping.h	2002-12-30 10:17:13.000000000 +0000
+++ source/include/asm-m68knommu/dma-mapping.h	2004-04-21 10:45:35.868250696 +0100
@@ -1 +1,10 @@
+#ifndef _M68KNOMMU_DMA_MAPPING_H
+#define _M68KNOMMU_DMA_MAPPING_H
+
+#include <linux/config.h>
+
+#ifdef CONFIG_PCI
 #include <asm-generic/dma-mapping.h>
+#endif
+
+#endif  /* _M68KNOMMU_DMA_MAPPING_H */
--- diff/include/asm-m68knommu/ide.h	2002-11-11 11:09:43.000000000 +0000
+++ source/include/asm-m68knommu/ide.h	2004-04-21 10:45:35.869250544 +0100
@@ -139,28 +139,7 @@ static IDE_INLINE void ide_init_hwif_por
 	}
 }
 
-
-/*
- * This registers the standard ports for this architecture with the IDE
- * driver.
- */
-static IDE_INLINE void ide_init_default_hwifs(void)
-{
-	hw_regs_t hw;
-	ide_ioreg_t base;
-	int index;
-
-	for (index = 0; index < MAX_HWIFS; index++) {
-		base = ide_default_io_base(index);
-		if (!base)
-			continue;
-		memset(&hw, 0, sizeof(hw));
-		ide_init_hwif_ports(&hw, base, 0, NULL);
-		hw.irq = ide_default_irq(base);
-		ide_register_hw(&hw, NULL);
-	}
-}
-
+#define ide_init_default_irq(base)	ide_default_irq(base)
 
 static IDE_INLINE int
 ide_request_irq(
--- diff/include/asm-m68knommu/irq.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-m68knommu/irq.h	2004-04-21 10:45:35.869250544 +0100
@@ -121,4 +121,8 @@ extern irq_node_t *new_irq_node(void);
 #define enable_irq_nosync(x)	enable_irq(x)
 #define disable_irq_nosync(x)	disable_irq(x)
 
+struct irqaction;
+struct pt_regs;
+int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
+
 #endif /* _M68K_IRQ_H_ */
--- diff/include/asm-mips/asm.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/asm.h	2004-04-21 10:45:35.869250544 +0100
@@ -209,7 +209,7 @@ symbol		=	value
 #define ALSZ	7
 #define ALMASK	~7
 #endif
-#if (_MIPS_SIM == _MIPS_SIM_ABIN32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
+#if (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
 #define ALSZ	15
 #define ALMASK	~15
 #endif
@@ -237,7 +237,7 @@ symbol		=	value
 #define REG_SUBU	subu
 #define REG_ADDU	addu
 #endif
-#if (_MIPS_SIM == _MIPS_SIM_ABIN32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
+#if (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
 #define REG_S		sd
 #define REG_L		ld
 #define REG_SUBU	dsubu
@@ -386,7 +386,7 @@ symbol		=	value
 #define MFC0		mfc0
 #define MTC0		mtc0
 #endif
-#if (_MIPS_SIM == _MIPS_SIM_ABIN32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
+#if (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
 #define MFC0		dmfc0
 #define MTC0		dmtc0
 #endif
--- diff/include/asm-mips/bitops.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/bitops.h	2004-04-21 10:45:35.870250392 +0100
@@ -296,7 +296,7 @@ static inline int __test_and_clear_bit(u
 }
 
 /*
- * test_and_change_bit - Change a bit and return its new value
+ * test_and_change_bit - Change a bit and return its old value
  * @nr: Bit to change
  * @addr: Address to count from
  *
@@ -567,7 +567,7 @@ static inline int __test_and_clear_bit(u
 }
 
 /*
- * test_and_change_bit - Change a bit and return its new value
+ * test_and_change_bit - Change a bit and return its old value
  * @nr: Bit to change
  * @addr: Address to count from
  *
--- diff/include/asm-mips/bootinfo.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/bootinfo.h	2004-04-21 10:45:35.870250392 +0100
@@ -173,6 +173,7 @@
 #define  MACH_DB1500		5       /* Au1500-based eval board */
 #define  MACH_XXS1500		6       /* Au1500-based eval board */
 #define  MACH_MTX1		7       /* 4G MTX-1 Au1500-based board */
+#define  MACH_PB1550		8       /* Au1550-based eval board */
 
 /*
  * Valid machtype for group NEC_VR41XX
@@ -199,8 +200,8 @@
  * Valid machtype for group LASAT
  */
 #define MACH_GROUP_LASAT       21
-#define  MACH_LASAT_100		1	/* Masquerade II/SP100/SP50/SP25 */
-#define  MACH_LASAT_200		2	/* Masquerade PRO/SP200 */
+#define  MACH_LASAT_100		0	/* Masquerade II/SP100/SP50/SP25 */
+#define  MACH_LASAT_200		1	/* Masquerade PRO/SP200 */
 
 /*
  * Valid machtype for group TITAN
--- diff/include/asm-mips/cacheflush.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/cacheflush.h	2004-04-21 10:45:35.871250240 +0100
@@ -11,6 +11,7 @@
 
 /* Keep includes the same across arches.  */
 #include <linux/mm.h>
+#include <asm/cpu-features.h>
 
 /* Cache flushing:
  *
@@ -35,7 +36,15 @@ extern void (*flush_cache_range)(struct 
 	unsigned long start, unsigned long end);
 extern void (*flush_cache_page)(struct vm_area_struct *vma,
 	unsigned long page);
-extern void flush_dcache_page(struct page *page);
+extern void __flush_dcache_page(struct page *page);
+
+static inline void flush_dcache_page(struct page *page)
+{
+	if (cpu_has_dc_aliases)
+		__flush_dcache_page(page);
+
+}
+
 extern void (*flush_icache_page)(struct vm_area_struct *vma,
 	struct page *page);
 extern void (*flush_icache_range)(unsigned long start, unsigned long end);
--- diff/include/asm-mips/dma-mapping.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-mips/dma-mapping.h	2004-04-21 10:45:35.871250240 +0100
@@ -31,17 +31,19 @@ extern void dma_unmap_sg(struct device *
 	int nhwentries, enum dma_data_direction direction);
 extern void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle,
 	size_t size, enum dma_data_direction direction);
-extern void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle,
-	size_t size, enum dma_data_direction direction);
-extern void dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle,
-	unsigned long offset, size_t size, enum dma_data_direction direction);
-extern void dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle,
-	unsigned long offset, size_t size, enum dma_data_direction direction);
-extern void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems,
+extern void dma_sync_single_for_device(struct device *dev,
+	dma_addr_t dma_handle, size_t size, enum dma_data_direction direction);
+extern void dma_sync_single_range_for_cpu(struct device *dev,
+	dma_addr_t dma_handle, unsigned long offset, size_t size,
 	enum dma_data_direction direction);
-extern void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems,
+extern void dma_sync_single_range_for_device(struct device *dev,
+	dma_addr_t dma_handle, unsigned long offset, size_t size,
 	enum dma_data_direction direction);
-
+extern void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg,
+	int nelems, enum dma_data_direction direction);
+extern void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg,
+	int nelems, enum dma_data_direction direction);
+extern int dma_mapping_error(dma_addr_t dma_addr);
 extern int dma_supported(struct device *dev, u64 mask);
 
 static inline int
--- diff/include/asm-mips/hardirq.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/hardirq.h	2004-04-21 10:45:35.871250240 +0100
@@ -81,7 +81,7 @@ typedef struct {
 
 #ifdef CONFIG_PREEMPT
 # include <linux/smp_lock.h>
-# define in_atomic()	(preempt_count() != kernel_locked())
+# define in_atomic()	((preempt_count() & ~PREEMPT_ACTIVE) != kernel_locked())
 # define IRQ_EXIT_OFFSET (HARDIRQ_OFFSET-1)
 #else
 # define in_atomic()	(preempt_count() != 0)
--- diff/include/asm-mips/hazards.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/hazards.h	2004-04-21 10:45:35.872250088 +0100
@@ -3,7 +3,7 @@
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  *
- * Copyright (C) 2003 Ralf Baechle
+ * Copyright (C) 2003, 2004 Ralf Baechle
  */
 #ifndef _ASM_HAZARDS_H
 #define _ASM_HAZARDS_H
@@ -18,16 +18,32 @@
  * for data translations should not occur for 3 cpu cycles.
  */
 #ifdef CONFIG_CPU_RM9000
-#define rm9000_tlb_hazard						\
+#define mtc0_tlbw_hazard						\
 	.set	push;							\
 	.set	mips32;							\
 	ssnop; ssnop; ssnop; ssnop;					\
 	.set	pop
+
+#define tlbw_eret_hazard						\
+	.set	push;							\
+	.set	mips32;							\
+	ssnop; ssnop; ssnop; ssnop;					\
+	.set	pop
+
 #else
-#define rm9000_tlb_hazard
+
+/*
+ * The taken branch will result in a two cycle penalty for the two killed
+ * instructions on R4000 / R4400.  Other processors only have a single cycle
+ * hazard so this is nice trick to have an optimal code for a range of
+ * processors.
+ */
+#define mtc0_tlbw_hazard						\
+	b	. + 8
+#define tlbw_eret_hazard
 #endif
 
-#else
+#else /* __ASSEMBLY__ */
 
 /*
  * RM9000 hazards.  When the JTLB is updated by tlbwi or tlbwr, a subsequent
@@ -35,15 +51,37 @@
  * for data translations should not occur for 3 cpu cycles.
  */
 #ifdef CONFIG_CPU_RM9000
-#define rm9000_tlb_hazard()						\
+
+#define mtc0_tlbw_hazard()						\
+	__asm__ __volatile__(						\
+		".set\tmips32\n\t"					\
+		"ssnop; ssnop; ssnop; ssnop\n\t"			\
+		".set\tmips0")
+
+#define tlbw_use_hazard()						\
 	__asm__ __volatile__(						\
 		".set\tmips32\n\t"					\
 		"ssnop; ssnop; ssnop; ssnop\n\t"			\
 		".set\tmips0")
 #else
-#define rm9000_tlb_hazard() do { } while (0)
-#endif
+
+/*
+ * Overkill warning ...
+ */
+#define mtc0_tlbw_hazard()						\
+	__asm__ __volatile__(						\
+		".set noreorder\n\t"					\
+		"nop; nop; nop; nop; nop; nop;\n\t"			\
+		".set reorder\n\t")
+
+#define tlbw_use_hazard()						\
+	__asm__ __volatile__(						\
+		".set noreorder\n\t"					\
+		"nop; nop; nop; nop; nop; nop;\n\t"			\
+		".set reorder\n\t")
 
 #endif
 
+#endif /* __ASSEMBLY__ */
+
 #endif /* _ASM_HAZARDS_H */
--- diff/include/asm-mips/hdreg.h	2003-08-20 14:16:33.000000000 +0100
+++ source/include/asm-mips/hdreg.h	2004-04-21 10:45:35.872250088 +0100
@@ -1,16 +1 @@
-/*
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- *  This file contains the MIPS architecture specific IDE code.
- *
- *  Copyright (C) 1994-1996  Linus Torvalds & authors
- *  Copyright (C) 2001 Ralf Baechle
- */
-#ifndef _ASM_HDREG_H
-#define _ASM_HDREG_H
-
-typedef unsigned long ide_ioreg_t;
-
-#endif /* _ASM_HDREG_H */
+#include <asm-generic/hdreg.h>
--- diff/include/asm-mips/highmem.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/highmem.h	2004-04-21 10:45:35.872250088 +0100
@@ -19,6 +19,7 @@
 
 #ifdef __KERNEL__
 
+#include <linux/config.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <asm/kmap_types.h>
@@ -47,14 +48,56 @@ extern pte_t *pkmap_page_table;
 extern void * kmap_high(struct page *page);
 extern void kunmap_high(struct page *page);
 
-extern void *kmap(struct page *page);
-extern void kunmap(struct page *page);
-extern void *kmap_atomic(struct page *page, enum km_type type);
-extern void kunmap_atomic(void *kvaddr, enum km_type type);
-extern struct page *kmap_atomic_to_page(void *ptr);
+/*
+ * CONFIG_LIMITED_DMA is for systems with DMA limitations such as Momentum's
+ * Jaguar ATX.  This option exploits the highmem code in the kernel so is
+ * always enabled together with CONFIG_HIGHMEM but at this time doesn't
+ * actually add highmem functionality.
+ */
+
+#ifdef CONFIG_LIMITED_DMA
+
+/*
+ * These are the default functions for the no-highmem case from
+ * <linux/highmem.h>
+ */
+static inline void *kmap(struct page *page)
+{
+	might_sleep();
+	return page_address(page);
+}
+
+#define kunmap(page) do { (void) (page); } while (0)
+
+static inline void *kmap_atomic(struct page *page, enum km_type type)
+{
+	return page_address(page);
+}
+
+static inline void kunmap_atomic(void *kvaddr, enum km_type type) { }
+
+#define kmap_atomic_to_page(ptr) virt_to_page(ptr)
+
+#define flush_cache_kmaps()	do { } while (0)
+
+#else /* LIMITED_DMA */
+
+extern void *__kmap(struct page *page);
+extern void __kunmap(struct page *page);
+extern void *__kmap_atomic(struct page *page, enum km_type type);
+extern void __kunmap_atomic(void *kvaddr, enum km_type type);
+extern struct page *__kmap_atomic_to_page(void *ptr);
+
+#define kmap			__kmap
+#define kunmap			__kunmap
+#define kmap_atomic		__kmap_atomic
+#define kunmap_atomic		__kunmap_atomic
+#define kmap_atomic_to_page	__kmap_atomic_to_page
 
 #define flush_cache_kmaps()	flush_cache_all()
 
+#endif /* LIMITED_DMA */
+
 #endif /* __KERNEL__ */
 
 #endif /* _ASM_HIGHMEM_H */
--- diff/include/asm-mips/ip32/ip32_ints.h	2003-08-20 14:16:36.000000000 +0100
+++ source/include/asm-mips/ip32/ip32_ints.h	2004-04-21 10:45:35.873249936 +0100
@@ -16,7 +16,7 @@
  */
 
 /* CPU */
-#define CLOCK_IRQ			0
+#define IP32_R4K_TIMER_IRQ		0
 
 /* MACE */
 #define MACE_VID_IN1_IRQ		1
--- diff/include/asm-mips/ip32/mace.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/ip32/mace.h	2004-04-21 10:45:35.873249936 +0100
@@ -342,7 +342,7 @@ struct mace_isa {
 	struct mace_serial serial2;
 	char _pad4[0x8000 - sizeof(struct mace_serial)];
 
-	mace32_t rtc[0x10000/8];
+	volatile unsigned char rtc[0x10000];
 };
 
 struct sgi_mace {
--- diff/include/asm-mips/irq.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/irq.h	2004-04-21 10:45:35.873249936 +0100
@@ -31,4 +31,7 @@ extern asmlinkage unsigned int do_IRQ(in
 
 extern void init_generic_irq(void);
 
+struct irqaction;
+int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
+
 #endif /* _ASM_IRQ_H */
--- diff/include/asm-mips/lasat/lasat.h	2003-07-08 09:55:19.000000000 +0100
+++ source/include/asm-mips/lasat/lasat.h	2004-04-21 10:45:35.874249784 +0100
@@ -220,7 +220,22 @@ extern void lasat_write_eeprom_info(void
 #define N_MACHTYPES		2
 /* for calibration of delays */
 
+/* the lasat_ndelay function is necessary because it is used at an
+ * early stage of the boot process where ndelay is not calibrated.
+ * It is used for the bit-banging rtc and eeprom drivers */
+
 #include <asm/delay.h>
+/* calculating with the slowest board with 100 MHz clock */
+#define LASAT_100_DIVIDER 20
+/* All 200's run at 250 MHz clock */
+#define LASAT_200_DIVIDER 8
+
+extern unsigned int lasat_ndelay_divider;
+
+static inline void lasat_ndelay(unsigned int ns)
+{
+            __delay(ns / lasat_ndelay_divider);
+}
 
 extern void (* prom_printf)(const char *fmt, ...);
 
--- diff/include/asm-mips/mach-atlas/mc146818rtc.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/mach-atlas/mc146818rtc.h	2004-04-21 10:45:35.874249784 +0100
@@ -50,4 +50,6 @@ static inline void CMOS_WRITE(unsigned c
 
 #define RTC_ALWAYS_BCD	0
 
+#define mc146818_decode_year(year) ((year) < 70 ? (year) + 2000 : (year) + 1970)
+
 #endif /* __ASM_MACH_ATLAS_MC146818RTC_H */
--- diff/include/asm-mips/mach-au1x00/au1000.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/mach-au1x00/au1000.h	2004-04-21 10:45:35.875249632 +0100
@@ -197,6 +197,15 @@ extern au1xxx_irq_map_t au1xxx_irq_map[]
 #define MEM_STTIME3                0xB4001034
 #define MEM_STADDR3                0xB4001038
 
+#ifdef CONFIG_SOC_AU1550
+#define MEM_STNDCTL                0xB4001100
+#define MEM_STSTAT                 0xB4001104
+
+#define MEM_STNAND_CMD                  (0x0)
+#define MEM_STNAND_ADDR                 (0x4)
+#define MEM_STNAND_DATA                (0x20)
+#endif
+
 /* Interrupt Controller 0 */
 #define IC0_CFG0RD                 0xB0400040
 #define IC0_CFG0SET                0xB0400040
@@ -951,6 +960,23 @@ extern au1xxx_irq_map_t au1xxx_irq_map[]
   #define SYS_PF_CS			(1<<16)	/* EXTCLK0/32khz to gpio2 */
   #define SYS_PF_EX0			(1<<9)	/* gpio2/clock */
 
+/* Au1550 Only.  Redefines lots of pins */
+  #define SYS_PF_PSC2_MASK		(7 << 17)
+  #define SYS_PF_PSC2_AC97		(0)
+  #define SYS_PF_PSC2_SPI		(0)
+  #define SYS_PF_PSC2_I2S		(1 << 17)
+  #define SYS_PF_PSC2_SMBUS		(3 << 17)
+  #define SYS_PF_PSC2_GPIO		(7 << 17)
+  #define SYS_PF_PSC3_MASK		(7 << 20)
+  #define SYS_PF_PSC3_AC97		(0)
+  #define SYS_PF_PSC3_SPI		(0)
+  #define SYS_PF_PSC3_I2S		(1 << 20)
+  #define SYS_PF_PSC3_SMBUS		(3 << 20)
+  #define SYS_PF_PSC3_GPIO		(7 << 20)
+  #define SYS_PF_PSC1_S1		(1 << 1)
+  #define SYS_PF_MUST_BE_SET		((1 << 5) | (1 << 2))
+
+
 #define SYS_TRIOUTRD              0xB1900100
 #define SYS_TRIOUTCLR             0xB1900100
 #define SYS_OUTPUTRD              0xB1900108
@@ -959,7 +985,7 @@ extern au1xxx_irq_map_t au1xxx_irq_map[]
 #define SYS_PINSTATERD            0xB1900110
 #define SYS_PININPUTEN            0xB1900110
 
-/* GPIO2, Au1500 only */
+/* GPIO2, Au1500, Au1550 only */
 #define GPIO2_BASE                0xB1700000
 #define GPIO2_DIR                 (GPIO2_BASE + 0)
 #define GPIO2_OUTPUT              (GPIO2_BASE + 8)
@@ -1071,6 +1097,14 @@ extern au1xxx_irq_map_t au1xxx_irq_map[]
   #define AC97C_RS              (1<<1)
   #define AC97C_CE              (1<<0)
 
+
+/* Secure Digital (SD) Controller */
+#define SD0_XMIT_FIFO	0xB0600000
+#define SD0_RECV_FIFO	0xB0600004
+#define SD1_XMIT_FIFO	0xB0680000
+#define SD1_RECV_FIFO	0xB0680004
+
+
 #if defined (CONFIG_SOC_AU1500) || defined(CONFIG_SOC_AU1550)
 /* Au1500 PCI Controller */
 #define Au1500_CFG_BASE           0xB4005000 // virtual, kseg0 addr
@@ -1119,6 +1153,20 @@ extern au1xxx_irq_map_t au1xxx_irq_map[]
 #define IOMEM_RESOURCE_START  0x10000000
 #define IOMEM_RESOURCE_END    0xffffffff
 
+  /*
+   * Borrowed from the PPC arch:
+   * The following macro is used to lookup irqs in a standard table
+   * format for those PPC systems that do not already have PCI
+   * interrupts properly routed.
+   */
+  /* FIXME - double check this from asm-ppc/pci-bridge.h */
+#define PCI_IRQ_TABLE_LOOKUP                            \
+  ({ long _ctl_ = -1;                                 \
+      if (idsel >= min_idsel && idsel <= max_idsel && pin <= irqs_per_slot)    \
+	       _ctl_ = pci_irq_table[idsel - min_idsel][pin-1];               \
+		      _ctl_; })
+
+
 #else /* Au1000 and Au1100 */
 
 /* don't allow any legacy ports probing */
--- diff/include/asm-mips/mach-au1x00/au1000_dma.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/mach-au1x00/au1000_dma.h	2004-04-21 10:45:35.875249632 +0100
@@ -50,6 +50,7 @@
 #define DMA_DAH_MASK		(0x0f << 20)
 #define DMA_DID_BIT		16
 #define DMA_DID_MASK		(0x0f << DMA_DID_BIT)
+#define DMA_DS			(1<<15)
 #define DMA_BE			(1<<13)
 #define DMA_DR			(1<<12)
 #define DMA_TS8			(1<<11)
@@ -99,6 +100,15 @@ enum {
 	DMA_NUM_DEV
 };
 
+/* DMA Device ID's for 2nd bank (AU1100) follow */
+enum {
+	DMA_ID_SD0_TX = 0,
+	DMA_ID_SD0_RX,
+	DMA_ID_SD1_TX,
+	DMA_ID_SD1_RX,
+	DMA_NUM_DEV_BANK2
+};
+
 struct dma_chan {
 	int dev_id;		// this channel is allocated if >=0, free otherwise
 	unsigned int io;
@@ -126,7 +136,7 @@ extern spinlock_t au1000_dma_spin_lock;
 
 static __inline__ struct dma_chan *get_dma_chan(unsigned int dmanr)
 {
-	if (dmanr > NUM_AU1000_DMA_CHANNELS
+	if (dmanr >= NUM_AU1000_DMA_CHANNELS
 	    || au1000_dma_table[dmanr].dev_id < 0)
 		return NULL;
 	return &au1000_dma_table[dmanr];
@@ -205,8 +215,8 @@ static __inline__ void disable_dma(unsig
 
 	halt_dma(dmanr);
 
-		// now we can disable the buffers
-		au_writel(~DMA_GO, chan->io + DMA_MODE_CLEAR);
+	// now we can disable the buffers
+	au_writel(~DMA_GO, chan->io + DMA_MODE_CLEAR);
 }
 
 static __inline__ int dma_halted(unsigned int dmanr)
@@ -286,6 +296,9 @@ static __inline__ void set_dma_fifo_addr
 	if (!chan)
 		return;
 
+	if (chan->mode & DMA_DS)	/* second bank of device ids */
+		return;
+
 	if (chan->dev_id != DMA_ID_GP04 && chan->dev_id != DMA_ID_GP05)
 		return;
 
@@ -430,3 +443,4 @@ static __inline__ int get_dma_residue(un
 }
 
 #endif /* __ASM_AU1000_DMA_H */
+
--- diff/include/asm-mips/mach-db1x00/db1x00.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/mach-db1x00/db1x00.h	2004-04-21 10:45:35.878249176 +0100
@@ -93,9 +93,13 @@ typedef volatile struct
 #define BCSR_PCMCIA_PC1RST		0x8000
 
 #define BCSR_BOARD_PCIM66EN		0x0001
+#define BCSR_BOARD_SD0_PWR		0x0040
+#define BCSR_BOARD_SD1_PWR		0x0080
 #define BCSR_BOARD_PCIM33		0x0100
 #define BCSR_BOARD_GPIO200RST		0x0400
 #define BCSR_BOARD_PCICFG		0x1000
+#define BCSR_BOARD_SD0_WP		0x4000
+#define BCSR_BOARD_SD1_WP		0x8000
 
 #define BCSR_LEDS_DECIMALS		0x0003
 #define BCSR_LEDS_LED0			0x0100
@@ -122,4 +126,48 @@ typedef volatile struct
 #define DB1X00_USER_ONLY
 #endif
 
+/* SD controller macros */
+/*
+ * Detect card.
+ */
+#define mmc_card_inserted(_n_, _res_) \
+	do { \
+		BCSR * const bcsr = (BCSR *)0xAE000000; \
+		unsigned long mmc_wp, board_specific; \
+		if ((_n_)) { \
+			mmc_wp = BCSR_BOARD_SD1_WP; \
+		} else { \
+			mmc_wp = BCSR_BOARD_SD0_WP; \
+		} \
+		board_specific = au_readl((unsigned long)(&bcsr->specific)); \
+		if (!(board_specific & mmc_wp)) {/* low means card present */ \
+			*(int *)(_res_) = 1; \
+		} else { \
+			*(int *)(_res_) = 0; \
+		} \
+	} while (0)
+
+/*
+ * Apply power to card slot(s).
+ */
+#define mmc_power_on(_n_) \
+	do { \
+		BCSR * const bcsr = (BCSR *)0xAE000000; \
+		unsigned long mmc_pwr, mmc_wp, board_specific; \
+		if ((_n_)) { \
+			mmc_pwr = BCSR_BOARD_SD1_PWR; \
+			mmc_wp = BCSR_BOARD_SD1_WP; \
+		} else { \
+			mmc_pwr = BCSR_BOARD_SD0_PWR; \
+			mmc_wp = BCSR_BOARD_SD0_WP; \
+		} \
+		board_specific = au_readl((unsigned long)(&bcsr->specific)); \
+		if (!(board_specific & mmc_wp)) {/* low means card present */ \
+			board_specific |= mmc_pwr; \
+			au_writel(board_specific, (int)(&bcsr->specific)); \
+			au_sync(); \
+		} \
+	} while (0)
+
 #endif /* __ASM_DB1X00_H */
+
--- diff/include/asm-mips/mach-generic/ide.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/mach-generic/ide.h	2004-04-21 10:45:35.878249176 +0100
@@ -34,7 +34,7 @@ static inline int ide_default_irq(unsign
 	}
 }
 
-static inline ide_ioreg_t ide_default_io_base(int index)
+static inline unsigned long ide_default_io_base(int index)
 {
 	switch (index) {
 		case 0: return 0x1f0;
@@ -48,39 +48,10 @@ static inline ide_ioreg_t ide_default_io
 	}
 }
 
-static inline void ide_init_hwif_ports(hw_regs_t *hw, unsigned long data_port,
-	 unsigned long ctrl_port, int *irq)
-{
-	unsigned long reg = data_port;
-	int i;
-
-	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
-		hw->io_ports[i] = reg;
-		reg += 1;
-	}
-	if (ctrl_port) {
-		hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
-	} else {
-		hw->io_ports[IDE_CONTROL_OFFSET] = hw->io_ports[IDE_DATA_OFFSET] + 0x206;
-	}
-	if (irq != NULL)
-		*irq = 0;
-	hw->io_ports[IDE_IRQ_OFFSET] = 0;
-}
-
-static inline void ide_init_default_hwifs(void)
-{
-#ifndef CONFIG_BLK_DEV_IDEPCI
-	hw_regs_t hw;
-	int index;
-
-	for(index = 0; index < MAX_HWIFS; index++) {
-		memset(&hw, 0, sizeof hw);
-		ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL);
-		hw.irq = ide_default_irq(ide_default_io_base(index));
-		ide_register_hw(&hw, NULL);
-	}
-#endif /* CONFIG_BLK_DEV_IDEPCI */
-}
+#ifdef CONFIG_BLK_DEV_IDEPCI
+#define ide_init_default_irq(base)	(0)
+#else
+#define ide_init_default_irq(base)	ide_default_irq(base)
+#endif
 
 #endif /* __ASM_MACH_GENERIC_IDE_H */
--- diff/include/asm-mips/mach-generic/spaces.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/mach-generic/spaces.h	2004-04-21 10:45:35.878249176 +0100
@@ -3,9 +3,9 @@
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  *
- * Copyright (C) 1996, 99 Ralf Baechle
+ * Copyright (C) 1994 - 1999, 2000, 03, 04 Ralf Baechle
  * Copyright (C) 2000, 2002  Maciej W. Rozycki
- * Copyright (C) 1990, 1999 by Silicon Graphics, Inc.
+ * Copyright (C) 1990, 1999, 2000 Silicon Graphics, Inc.
  */
 #ifndef _ASM_MACH_SPACES_H
 #define _ASM_MACH_SPACES_H
@@ -19,10 +19,41 @@
 #define UNCAC_BASE		0xa0000000
 #define MAP_BASE		0xc0000000
 
+/*
+ * This handles the memory map.
+ * We handle pages at KSEG0 for kernels with 32 bit address space.
+ */
+#define PAGE_OFFSET		0x80000000UL
+
+/*
+ * Memory above this physical address will be considered highmem.
+ */
+#ifndef HIGHMEM_START
+#define HIGHMEM_START		0x20000000UL
+#endif
+
 #endif /* CONFIG_MIPS32 */
 
 #ifdef CONFIG_MIPS64
 
+/*
+ * This handles the memory map.
+ */
+#ifdef CONFIG_DMA_NONCOHERENT
+#define PAGE_OFFSET	0x9800000000000000UL
+#else
+#define PAGE_OFFSET	0xa800000000000000UL
+#endif
+
+/*
+ * Memory above this physical address will be considered highmem.
+ * Fixme: 59 bits is a fictive number and makes assumptions about processors
+ * in the distant future.  Nobody will care for a few years :-)
+ */
+#ifndef HIGHMEM_START
+#define HIGHMEM_START		(1UL << 59UL)
+#endif
+
 #ifdef CONFIG_DMA_NONCOHERENT
 #define CAC_BASE		0x9800000000000000
 #else
@@ -38,4 +69,4 @@
 
 #endif /* CONFIG_MIPS64 */
 
-#endif /* _ASM_MACH_SPACES_H */
+#endif /* __ASM_MACH_GENERIC_SPACES_H */
--- diff/include/asm-mips/mach-ip27/mmzone.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/mach-ip27/mmzone.h	2004-04-21 10:45:35.879249024 +0100
@@ -2,6 +2,7 @@
 #define _ASM_MACH_MMZONE_H
 
 #include <asm/sn/addrs.h>
+#include <asm/sn/arch.h>
 
 #define pa_to_nid(addr)		NASID_TO_COMPACT_NODEID(NASID_GET(addr))
 
--- diff/include/asm-mips/mach-ip27/spaces.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/mach-ip27/spaces.h	2004-04-21 10:45:35.879249024 +0100
@@ -27,4 +27,8 @@
 #define TO_MSPEC(x)		(MSPEC_BASE | ((x) & TO_PHYS_MASK))
 #define TO_HSPEC(x)		(HSPEC_BASE | ((x) & TO_PHYS_MASK))
 
+#define PAGE_OFFSET		CAC_BASE
+
+#define HIGHMEM_START		(~0UL)
+
 #endif /* _ASM_MACH_SPACES_H */
--- diff/include/asm-mips/mach-ip32/mc146818rtc.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/mach-ip32/mc146818rtc.h	2004-04-21 10:45:35.880248872 +0100
@@ -19,14 +19,18 @@
 
 static unsigned char CMOS_READ(unsigned long addr)
 {
-	return readb(mace->isa.rtc + addr);
+	return mace->isa.rtc[addr << 8];
 }
 
 static inline void CMOS_WRITE(unsigned char data, unsigned long addr)
 {
-	writeb(data, mace->isa.rtc + addr);
+	mace->isa.rtc[addr << 8] = data;
 }
 
+/* FIXME: Do it right. For now just assume that noone lives in 20th century
+ * and no O2 user in 22th century ;-) */
+#define mc146818_decode_year(year) ((year) + 2000)
+
 #define RTC_ALWAYS_BCD	0
 
 #endif /* __ASM_MACH_IP32_MC146818RTC_H */
--- diff/include/asm-mips/mach-mips/mc146818rtc.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/mach-mips/mc146818rtc.h	2004-04-21 10:45:35.881248720 +0100
@@ -43,4 +43,6 @@ static inline void CMOS_WRITE(unsigned c
 
 #define RTC_ALWAYS_BCD	0
 
+#define mc146818_decode_year(year) ((year) < 70 ? (year) + 2000 : (year) + 1970)
+
 #endif /* __ASM_MACH_MALTA_MC146818RTC_H */
--- diff/include/asm-mips/mc146818-time.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/mc146818-time.h	2004-04-21 10:45:35.882248568 +0100
@@ -120,8 +120,7 @@ static inline unsigned long mc146818_get
 		BCD_TO_BIN(mon);
 		BCD_TO_BIN(year);
 	}
-	if ((year += 1900) < 1970)
-		year += 100;
+	year = mc146818_decode_year(year);
 
 	return mktime(year, mon, day, hour, min, sec);
 }
--- diff/include/asm-mips/mipsregs.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/mipsregs.h	2004-04-21 10:45:35.883248416 +0100
@@ -632,6 +632,24 @@ do {									\
 } while (0)
 
 /*
+ * On The RM7000 these are use to access cop0 set 1 registers
+ */
+#define __read_32bit_c0_ctrl_register(source)				\
+({ int __res;								\
+	__asm__ __volatile__(						\
+		"cfc0\t%0, " #source "\n\t"				\
+		: "=r" (__res));					\
+	__res;								\
+})
+
+#define __write_32bit_c0_ctrl_register(register, value)			\
+do {									\
+	__asm__ __volatile__(						\
+		"ctc0\t%z0, " #register "\n\t"				\
+		: : "Jr" ((unsigned int)value));			\
+} while (0)
+
+/*
  * These versions are only needed for systems with more than 38 bits of
  * physical address space running the 32-bit kernel.  That's none atm :-)
  */
@@ -791,12 +809,30 @@ do {									\
 #define read_c0_xcontext()	__read_ulong_c0_register($20, 0)
 #define write_c0_xcontext(val)	__write_ulong_c0_register($20, 0, val)
 
-#define read_c0_intcontrol()	__read_32bit_c0_register($20, 1)
-#define write_c0_intcontrol(val) __write_32bit_c0_register($20, 1, val)
+#define read_c0_intcontrol()	__read_32bit_c0_ctrl_register($20)
+#define write_c0_intcontrol(val) __write_32bit_c0_ctrl_register($20, val)
 
 #define read_c0_framemask()	__read_32bit_c0_register($21, 0)
 #define write_c0_framemask(val)	__write_32bit_c0_register($21, 0, val)
 
+#define read_c0_diag()		__read_32bit_c0_register($22, 0)
+#define write_c0_diag(val)	__write_32bit_c0_register($22, 0, val)
+
+#define read_c0_diag1()		__read_32bit_c0_register($22, 1)
+#define write_c0_diag1(val)	__write_32bit_c0_register($22, 1, val)
+
+#define read_c0_diag2()		__read_32bit_c0_register($22, 2)
+#define write_c0_diag2(val)	__write_32bit_c0_register($22, 2, val)
+
+#define read_c0_diag3()		__read_32bit_c0_register($22, 3)
+#define write_c0_diag3(val)	__write_32bit_c0_register($22, 3, val)
+
+#define read_c0_diag4()		__read_32bit_c0_register($22, 4)
+#define write_c0_diag4(val)	__write_32bit_c0_register($22, 4, val)
+
+#define read_c0_diag5()		__read_32bit_c0_register($22, 5)
+#define write_c0_diag5(val)	__write_32bit_c0_register($22, 5, val)
+
 #define read_c0_debug()		__read_32bit_c0_register($23, 0)
 #define write_c0_debug(val)	__write_32bit_c0_register($23, 0, val)
 
@@ -838,51 +874,45 @@ do {									\
 
 /*
  * TLB operations.
+ *
+ * It is responsibility of the caller to take care of any TLB hazards.
  */
 static inline void tlb_probe(void)
 {
-	rm9000_tlb_hazard();
 	__asm__ __volatile__(
 		".set noreorder\n\t"
 		"tlbp\n\t"
 		".set reorder");
-	rm9000_tlb_hazard();
 }
 
 static inline void tlb_read(void)
 {
-	rm9000_tlb_hazard();
 	__asm__ __volatile__(
 		".set noreorder\n\t"
 		"tlbr\n\t"
 		".set reorder");
-	rm9000_tlb_hazard();
 }
 
 static inline void tlb_write_indexed(void)
 {
-	rm9000_tlb_hazard();
 	__asm__ __volatile__(
 		".set noreorder\n\t"
 		"tlbwi\n\t"
 		".set reorder");
-	rm9000_tlb_hazard();
 }
 
 static inline void tlb_write_random(void)
 {
-	rm9000_tlb_hazard();
 	__asm__ __volatile__(
 		".set noreorder\n\t"
 		"tlbwr\n\t"
 		".set reorder");
-	rm9000_tlb_hazard();
 }
 
 /*
  * Manipulate bits in a c0 register.
  */
-#define __BUILD_SET_C0(name,register)				\
+#define __BUILD_SET_C0(name)					\
 static inline unsigned int					\
 set_c0_##name(unsigned int set)					\
 {								\
@@ -920,10 +950,10 @@ change_c0_##name(unsigned int change, un
 	return res;						\
 }
 
-__BUILD_SET_C0(status,CP0_STATUS)
-__BUILD_SET_C0(cause,CP0_CAUSE)
-__BUILD_SET_C0(config,CP0_CONFIG)
-__BUILD_SET_C0(intcontrol,CP0_CONFIG)
+__BUILD_SET_C0(status)
+__BUILD_SET_C0(cause)
+__BUILD_SET_C0(config)
+__BUILD_SET_C0(intcontrol)
 
 #endif /* !__ASSEMBLY__ */
 
--- diff/include/asm-mips/mmu_context.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/mmu_context.h	2004-04-21 10:45:35.884248264 +0100
@@ -45,6 +45,11 @@ extern unsigned long pgd_current[];
 #define ASID_INC	0x40
 #define ASID_MASK	0xfc0
 
+#elif defined(CONFIG_CPU_RM9000)
+
+#define ASID_INC	0x1
+#define ASID_MASK	0xfff
+
 #else /* FIXME: not correct for R6000, R8000 */
 
 #define ASID_INC	0x1
--- diff/include/asm-mips/module.h	2003-07-08 09:55:19.000000000 +0100
+++ source/include/asm-mips/module.h	2004-04-21 10:45:35.884248264 +0100
@@ -1,14 +1,41 @@
 #ifndef _ASM_MODULE_H
 #define _ASM_MODULE_H
 
+#include <linux/config.h>
+
 struct mod_arch_specific {
 	/* Data Bus Error exception tables */
 	const struct exception_table_entry *dbe_table_start;
 	const struct exception_table_entry *dbe_table_end;
 };
 
-#define Elf_Shdr Elf32_Shdr
-#define Elf_Sym Elf32_Sym
-#define Elf_Ehdr Elf32_Ehdr
+typedef uint8_t Elf64_Byte;		/* Type for a 8-bit quantity.  */
+
+typedef struct
+{
+  Elf64_Addr r_offset;			/* Address of relocation.  */
+  Elf64_Word r_sym;			/* Symbol index.  */
+  Elf64_Byte r_ssym;			/* Special symbol.  */
+  Elf64_Byte r_type3;			/* Third relocation.  */
+  Elf64_Byte r_type2;			/* Second relocation.  */
+  Elf64_Byte r_type;			/* First relocation.  */
+  Elf64_Sxword r_addend;		/* Addend.  */
+} Elf64_Mips_Rela;
+
+#ifdef CONFIG_MIPS32
+
+#define Elf_Shdr	Elf32_Shdr
+#define Elf_Sym		Elf32_Sym
+#define Elf_Ehdr	Elf32_Ehdr
+
+#endif
+
+#ifdef CONFIG_MIPS64
+
+#define Elf_Shdr	Elf64_Shdr
+#define Elf_Sym		Elf64_Sym
+#define Elf_Ehdr	Elf64_Ehdr
+
+#endif
 
 #endif /* _ASM_MODULE_H */
--- diff/include/asm-mips/mv64340.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/mv64340.h	2004-04-21 10:45:35.885248112 +0100
@@ -2,18 +2,19 @@
  * mv64340.h - MV-64340 Internal registers definition file.
  *
  * Copyright 2002 Momentum Computer, Inc.
+ * 	Author: Matthew Dharm <mdharm@momenco.com>
  * Copyright 2002 GALILEO TECHNOLOGY, LTD. 
  *
  * This program is free software; you can redistribute  it and/or modify it
  * under  the terms of  the GNU General  Public License as published by the
  * Free Software Foundation;  either version 2 of the  License, or (at your
  * option) any later version.
- *
  */
 #ifndef __ASM_MV64340_H
 #define __ASM_MV64340_H
 
-#include <asm/mv64340_dep.h>
+#include <asm/addrspace.h>
+#include <asm/byteorder.h>
 
 /****************************************/
 /* Processor Address Space              */
@@ -1033,9 +1034,38 @@
 #define MV64340_SERIAL_INIT_CONTROL                                 0xf328
 #define MV64340_SERIAL_INIT_STATUS                                  0xf32c
 
-struct pci;
+extern unsigned long mv64340_base;
+
+#define MV64340_BASE       (mv64340_base)
+
+/*
+ * Because of an error/peculiarity in the Galileo chip, we need to swap the
+ * bytes when running bigendian.
+ */
+
+#define MV_WRITE(ofs, data)		\
+        *(volatile u32 *)(MV64340_BASE + (ofs)) = cpu_to_le32((u32)data)
+#define MV_READ(ofs)			\
+        (le32_to_cpu(*(volatile u32 *)(MV64340_BASE + (ofs))))
+
+#define MV_WRITE_16(ofs, data)		\
+        *(volatile u16 *)(MV64340_BASE + (ofs)) = cpu_to_le16((u16)data)
+#define MV_READ_16(ofs)			\
+        le16_to_cpu(*(volatile u16 *)(MV64340_BASE + (ofs)))
+
+#define MV_WRITE_8(ofs, data)		\
+        *(volatile u8 *)(MV64340_BASE + (ofs)) = ((u16)data)
+#define MV_READ_8(ofs)			\
+        (*(volatile u8 *)(MV64340_BASE + (ofs)))
+
+#define MV_SET_REG_BITS(ofs, bits)	\
+	(*((volatile u32 *)(MV64340_BASE + (ofs)))) |= ((u32)cpu_to_le32(bits))
+#define MV_RESET_REG_BITS(ofs, bits)	\
+	(*((volatile u32 *)(MV64340_BASE + (ofs)))) &= ~((u32)cpu_to_le32(bits))
+
+extern void mv64340_irq_init(unsigned int base);
 
-extern mv64340_bus0_pci_ops;
-extern mv64340_bus1_pci_ops;
+extern struct pci_ops mv64340_bus0_pci_ops;
+extern struct pci_ops mv64340_bus1_pci_ops;
 
 #endif /* __ASM_MV64340_H */
--- diff/include/asm-mips/page.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/page.h	2004-04-21 10:45:35.886247960 +0100
@@ -10,13 +10,7 @@
 #define _ASM_PAGE_H
 
 #include <linux/config.h>
-
-#ifdef CONFIG_MIPS32
-#include <asm/page-32.h>
-#endif
-#ifdef CONFIG_MIPS64
-#include <asm/page-64.h>
-#endif
+#include <spaces.h>
 
 #ifdef __KERNEL__
 
@@ -135,4 +129,8 @@ static __inline__ int get_order(unsigned
 
 #endif /* defined (__KERNEL__) */
 
+#ifdef CONFIG_LIMITED_DMA
+#define WANT_PAGE_VIRTUAL
+#endif
+
 #endif /* _ASM_PAGE_H */
--- diff/include/asm-mips/pgalloc.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/pgalloc.h	2004-04-21 10:45:35.887247808 +0100
@@ -122,12 +122,6 @@ static inline void pmd_free(pmd_t *pmd)
 
 #endif
 
-/*
- * Used for the b0rked handling of kernel pagetables on the 64-bit kernel.
- */
-extern pte_t kptbl[(PAGE_SIZE << PGD_ORDER)/sizeof(pte_t)];
-extern pmd_t kpmdtbl[PTRS_PER_PMD];
-
 #define check_pgt_cache()	do { } while (0)
 
 #endif /* _ASM_PGALLOC_H */
--- diff/include/asm-mips/pgtable-64.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/pgtable-64.h	2004-04-21 10:45:35.887247808 +0100
@@ -216,4 +216,10 @@ static inline pte_t mk_swap_pte(unsigned
 
 typedef pte_t *pte_addr_t;
 
+/*
+ * Used for the b0rked handling of kernel pagetables on the 64-bit kernel.
+ */
+extern pte_t kptbl[(PAGE_SIZE << PGD_ORDER)/sizeof(pte_t)];
+extern pmd_t kpmdtbl[PTRS_PER_PMD];
+
 #endif /* _ASM_PGTABLE_64_H */
--- diff/include/asm-mips/prefetch.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/prefetch.h	2004-04-21 10:45:35.887247808 +0100
@@ -21,8 +21,9 @@
  * RM7000 version 1.0 interprets all hints as Pref_Load; version 2.0 implements
  * Pref_PrepareForStore also.
  *
- * RM9000 is MIPS IV but implements prefetching like MIPS32/MIPS64;
- * it's Pref_WriteBackInvalidate is a nop.
+ * RM9000 is MIPS IV but implements prefetching like MIPS32/MIPS64; it's
+ * Pref_WriteBackInvalidate is a nop and Pref_PrepareForStore is broken in
+ * current versions due to erratum G105.
  *
  * VR7701 only implements the Load prefetch.
  *
--- diff/include/asm-mips/processor.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/processor.h	2004-04-21 10:45:35.888247656 +0100
@@ -18,11 +18,11 @@
 #include <asm/cachectl.h>
 #include <asm/cpu.h>
 #include <asm/mipsregs.h>
+#include <asm/prefetch.h>
 #include <asm/system.h>
 
 #ifdef CONFIG_SGI_IP27
 #include <asm/sn/types.h>
-#include <asm/sn/intr_public.h>
 #endif
 
 /*
@@ -53,7 +53,6 @@ struct cpuinfo_mips {
 	cnodeid_t	p_nodeid;	/* my node ID in compact-id-space */
 	nasid_t		p_nasid;	/* my node ID in numa-as-id-space */
 	unsigned char	p_slice;	/* Physical position on node board */
-	struct hub_intmasks_s p_intmasks; /* SN0 per-CPU interrupt masks */
 #endif
 #if 0
 	unsigned long		loops_per_sec;
@@ -77,6 +76,7 @@ struct cpuinfo_mips {
 	struct cache_desc	dcache;	/* Primary D or combined I/D cache */
 	struct cache_desc	scache;	/* Secondary cache */
 	struct cache_desc	tcache;	/* Tertiary/split secondary cache */
+	void 			*data;	/* Additional data */
 } __attribute__((aligned(SMP_CACHE_BYTES)));
 
 extern struct cpuinfo_mips cpu_data[];
@@ -287,4 +287,20 @@ static inline unsigned long long sched_c
 	return 0ULL;
 }
 
+#ifdef CONFIG_CPU_HAS_PREFETCH
+
+#define ARCH_HAS_PREFETCH
+
+extern inline void prefetch(const void *addr)
+{
+	__asm__ __volatile__(
+	"	.set	mips4		\n"
+	"	pref	%0, (%1)	\n"
+	"	.set	mips0		\n"
+	:
+	: "i" (Pref_Load), "r" (addr));
+}
+
+#endif
+
 #endif /* _ASM_PROCESSOR_H */
--- diff/include/asm-mips/serial.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/serial.h	2004-04-21 10:45:35.888247656 +0100
@@ -233,16 +233,23 @@
 #define HUB6_SERIAL_PORT_DFNS
 #endif
 
-#ifdef CONFIG_MCA
-#define MCA_SERIAL_PORT_DFNS			\
-	{ 0, BASE_BAUD, 0x3220, 3, STD_COM_FLAGS },	\
-	{ 0, BASE_BAUD, 0x3228, 3, STD_COM_FLAGS },	\
-	{ 0, BASE_BAUD, 0x4220, 3, STD_COM_FLAGS },	\
-	{ 0, BASE_BAUD, 0x4228, 3, STD_COM_FLAGS },	\
-	{ 0, BASE_BAUD, 0x5220, 3, STD_COM_FLAGS },	\
-	{ 0, BASE_BAUD, 0x5228, 3, STD_COM_FLAGS },
+#ifdef CONFIG_MOMENCO_JAGUAR_ATX
+/* Ordinary NS16552 duart with a 20MHz crystal.  */
+#define JAGUAR_ATX_UART_CLK	20000000
+#define JAGUAR_ATX_BASE_BAUD	(JAGUAR_ATX_UART_CLK / 16)
+
+#define JAGUAR_ATX_SERIAL1_IRQ	6
+#define JAGUAR_ATX_SERIAL1_BASE	0xfd000023L
+
+#define _JAGUAR_ATX_SERIAL_INIT(int, base)				\
+	{ baud_base: JAGUAR_ATX_BASE_BAUD, irq: int,			\
+	  flags: (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST),		\
+	  iomem_base: (u8 *) base, iomem_reg_shift: 2,			\
+	  io_type: SERIAL_IO_MEM }
+#define MOMENCO_JAGUAR_ATX_SERIAL_PORT_DEFNS				\
+	_JAGUAR_ATX_SERIAL_INIT(JAGUAR_ATX_SERIAL1_IRQ, JAGUAR_ATX_SERIAL1_BASE)
 #else
-#define MCA_SERIAL_PORT_DFNS
+#define MOMENCO_JAGUAR_ATX_SERIAL_PORT_DEFNS
 #endif
 
 #ifdef CONFIG_MOMENCO_OCELOT
--- diff/include/asm-mips/sibyte/board.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/sibyte/board.h	2004-04-21 10:45:35.888247656 +0100
@@ -56,8 +56,6 @@
 
 #else
 
-void swarm_setup(void);
-
 #ifdef LEDS_PHYS
 extern void setleds(char *str);
 #else
--- diff/include/asm-mips/siginfo.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/siginfo.h	2004-04-21 10:45:35.889247504 +0100
@@ -175,7 +175,7 @@ typedef struct siginfo32 {
 #undef SI_MESGQ
 #define SI_ASYNCIO	-2	/* sent by AIO completion */
 #define SI_TIMER __SI_CODE(__SI_TIMER,-3) /* sent by timer expiration */
-#define SI_MESGQ	-4	/* sent by real time mesq state change */
+#define SI_MESGQ __SI_CODE(__SI_MESGQ,-4) /* sent by real time mesq state change */
 
 #ifdef __KERNEL__
 
--- diff/include/asm-mips/smp.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/smp.h	2004-04-21 10:45:35.889247504 +0100
@@ -117,6 +117,8 @@ static inline void smp_send_reschedule(i
 	core_send_ipi(cpu, SMP_RESCHEDULE_YOURSELF);
 }
 
+extern asmlinkage void smp_call_function_interrupt(void);
+
 #endif /* CONFIG_SMP */
 
 #endif /* __ASM_SMP_H */
--- diff/include/asm-mips/sn/agent.h	2003-08-20 14:16:36.000000000 +0100
+++ source/include/asm-mips/sn/agent.h	2004-04-21 10:45:35.889247504 +0100
@@ -12,9 +12,9 @@
 #define _ASM_SGI_SN_AGENT_H
 
 #include <linux/config.h>
+#include <linux/topology.h>
 #include <asm/sn/addrs.h>
 #include <asm/sn/arch.h>
-//#include <asm/sn/io.h>
 
 #if defined(CONFIG_SGI_IP27)
 #include <asm/sn/sn0/hub.h>
@@ -28,7 +28,7 @@
 
 #if defined(CONFIG_SGI_IP27)
 #define HUB_NIC_ADDR(_cpuid) 						   \
-	REMOTE_HUB_ADDR(COMPACT_TO_NASID_NODEID(cputocnode(_cpuid)),       \
+	REMOTE_HUB_ADDR(COMPACT_TO_NASID_NODEID(cpu_to_node(_cpuid)),       \
 		MD_MLAN_CTL)
 #endif
 
--- diff/include/asm-mips/sn/arch.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/sn/arch.h	2004-04-21 10:45:35.890247352 +0100
@@ -11,38 +11,21 @@
 #ifndef _ASM_SN_ARCH_H
 #define _ASM_SN_ARCH_H
 
-#include <linux/types.h>
 #include <linux/config.h>
-
-#if !defined(CONFIG_SGI_IO)
+#include <linux/types.h>
 #include <asm/sn/types.h>
+#ifdef CONFIG_SGI_IP27
 #include <asm/sn/sn0/arch.h>
 #endif
 
-
-#ifndef __ASSEMBLY__
-#if !defined(CONFIG_SGI_IO)
 typedef u64	hubreg_t;
 typedef u64	nic_t;
-#endif
-#endif
-
-#ifdef CONFIG_SGI_IP27
-#define CPUS_PER_NODE		2	/* CPUs on a single hub */
-#define CPUS_PER_NODE_SHFT	1	/* Bits to shift in the node number */
-#define CPUS_PER_SUBNODE	2	/* CPUs on a single hub PI */
-#endif
-#define CNODE_NUM_CPUS(_cnode)		(NODEPDA(_cnode)->node_num_cpus)
 
-#define CNODE_TO_CPU_BASE(_cnode)	(NODEPDA(_cnode)->node_first_cpu)
-#define cputocnode(cpu)			(cpu_data[(cpu)].p_nodeid)
 #define cputonasid(cpu)			(cpu_data[(cpu)].p_nasid)
 #define cputoslice(cpu)			(cpu_data[(cpu)].p_slice)
 #define makespnum(_nasid, _slice)					\
 		(((_nasid) << CPUS_PER_NODE_SHFT) | (_slice))
 
-#ifndef __ASSEMBLY__
-
 #define INVALID_NASID		(nasid_t)-1
 #define INVALID_CNODEID		(cnodeid_t)-1
 #define INVALID_PNODEID		(pnodeid_t)-1
@@ -72,45 +55,12 @@ extern nasid_t compact_to_nasid_node[MAX
     ((nnode) >> \
      (is_fine_dirmode() ? NASID_TO_FINEREG_SHFT : NASID_TO_COARSEREG_SHFT))
 
-#if !defined(_STANDALONE)
 extern cnodeid_t nasid_to_compact_node[MAX_NASIDS];
 extern nasid_t compact_to_nasid_node[MAX_COMPACT_NODES];
 extern cnodeid_t cpuid_to_compact_node[MAXCPUS];
-#endif
-
-#if !defined(DEBUG) && (!defined(SABLE) || defined(_STANDALONE))
 
 #define NASID_TO_COMPACT_NODEID(nnode)	(nasid_to_compact_node[nnode])
 #define COMPACT_TO_NASID_NODEID(cnode)	(compact_to_nasid_node[cnode])
 #define CPUID_TO_COMPACT_NODEID(cpu)	(cpuid_to_compact_node[(cpu)])
-#else
-
-/*
- * These functions can do type checking and fail if they need to return
- * a bad nodeid, but they're not as fast so just use 'em for debug kernels.
- */
-cnodeid_t nasid_to_compact_nodeid(nasid_t nasid);
-nasid_t compact_to_nasid_nodeid(cnodeid_t cnode);
-
-#define NASID_TO_COMPACT_NODEID(nnode)	nasid_to_compact_nodeid(nnode)
-#define COMPACT_TO_NASID_NODEID(cnode)	compact_to_nasid_nodeid(cnode)
-#define CPUID_TO_COMPACT_NODEID(cpu)	(cpuid_to_compact_node[(cpu)])
-#endif
-
-#endif /* !__ASSEMBLY__ */
-
-#define SLOT_BITMASK    	(MAX_MEM_SLOTS - 1)
-#define SLOT_SIZE		(1LL<<SLOT_SHIFT)
 
-#define node_getnumslots(node)	(MAX_MEM_SLOTS)
-#define NODE_MAX_MEM_SIZE	SLOT_SIZE * MAX_MEM_SLOTS
-
-/*
- * New stuff in here from Irix sys/pfdat.h.
- */
-#define	SLOT_PFNSHIFT		(SLOT_SHIFT - PAGE_SHIFT)
-#define	PFN_NASIDSHFT		(NASID_SHFT - PAGE_SHIFT)
-#define mkpfn(nasid, off)	(((pfn_t)(nasid) << PFN_NASIDSHFT) | (off))
-#define slot_getbasepfn(node,slot) \
-		(mkpfn(COMPACT_TO_NASID_NODEID(node), slot<<SLOT_PFNSHIFT))
 #endif /* _ASM_SN_ARCH_H */
--- diff/include/asm-mips/sn/hub.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/sn/hub.h	2004-04-21 10:45:35.890247352 +0100
@@ -1,15 +1,35 @@
 #ifndef __ASM_SN_HUB_H
 #define __ASM_SN_HUB_H
 
+#include <linux/types.h>
+#include <linux/cpumask.h>
 #include <asm/sn/types.h>
 #include <asm/sn/io.h>
 #include <asm/sn/klkernvars.h>
+#include <asm/xtalk/xtalk.h>
+
+#define LEVELS_PER_SLICE	128
+
+struct slice_data {
+	unsigned long irq_alloc_mask[2];
+	unsigned long irq_enable_mask[2];
+	int level_to_irq[LEVELS_PER_SLICE];
+};
 
 struct hub_data {
 	kern_vars_t	kern_vars;
+	DECLARE_BITMAP  (h_bigwin_used, HUB_NUM_BIG_WINDOW);
+	cpumask_t	h_cpus;
+	unsigned long slice_map;
+	struct slice_data slice[2];
 };
 
 extern struct hub_data *hub_data[];
 #define HUB_DATA(n)		(hub_data[(n)])
 
+/* ip27-hubio.c */
+extern unsigned long hub_pio_map(cnodeid_t cnode, xwidgetnum_t widget,
+			  unsigned long xtalk_addr, size_t size);
+extern void hub_pio_init(cnodeid_t cnode);
+
 #endif /* __ASM_SN_HUB_H */
--- diff/include/asm-mips/sn/io.h	2003-08-20 14:16:36.000000000 +0100
+++ source/include/asm-mips/sn/io.h	2004-04-21 10:45:35.891247200 +0100
@@ -10,8 +10,10 @@
 #define _ASM_SN_IO_H
 
 #include <linux/config.h>
+#if defined (CONFIG_SGI_IP27)
+#include <asm/sn/sn0/hubio.h>
+#endif
 
-#ifdef CONFIG_SGI_IO
 
 #define IIO_ITTE_BASE		0x400160 /* base of translation table entries */
 #define IIO_ITTE(bigwin)	(IIO_ITTE_BASE + 8*(bigwin))
@@ -55,14 +57,4 @@
 			(_x) : \
 			(_x) - (HUB_WIDGET_ID_MIN-1)) << 3) )
 
-#if defined (CONFIG_SGI_IP27)
-#include <asm/sn/sn0/hubio.h>
-#endif
-
-#else /* CONFIG_SGI_IO */
-
-#include <asm/sn/sn0/addrs.h>
-
-#endif	/* CONFIG_SGI_IO */
-
 #endif /* _ASM_SN_IO_H */
--- diff/include/asm-mips/sn/sn0/arch.h	2003-08-20 14:16:36.000000000 +0100
+++ source/include/asm-mips/sn/sn0/arch.h	2004-04-21 10:45:35.891247200 +0100
@@ -82,4 +82,8 @@
 #define SLOT_MIN_MEM_SIZE	(32*1024*1024)
 #endif
 
+#define CPUS_PER_NODE		2	/* CPUs on a single hub */
+#define CPUS_PER_NODE_SHFT	1	/* Bits to shift in the node number */
+#define CPUS_PER_SUBNODE	2	/* CPUs on a single hub PI */
+
 #endif /* _ASM_SN_SN0_ARCH_H */
--- diff/include/asm-mips/sn/sn_private.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/sn/sn_private.h	2004-04-21 10:45:35.891247200 +0100
@@ -16,5 +16,6 @@ extern void install_ipi(void);
 extern void setup_replication_mask(int);
 extern void replicate_kernel_text(int);
 extern pfn_t node_getfirstfree(cnodeid_t);
+extern void mlreset(void);
 
 #endif /* __ASM_SN_SN_PRIVATE_H */
--- diff/include/asm-mips/spinlock.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/spinlock.h	2004-04-21 10:45:35.892247048 +0100
@@ -167,4 +167,28 @@ static inline void _raw_write_unlock(rwl
 	: "memory");
 }
 
+static inline int _raw_write_trylock(rwlock_t *rw)
+{
+	unsigned int tmp;
+	int ret;
+
+	__asm__ __volatile__(
+	".set\tnoreorder\t\t\t# _raw_write_trylock\n"
+	"li\t%2, 0\n\t"
+	"1:\tll\t%1, %3\n\t"
+	"bnez\t%1, 2f\n\t"
+	"lui\t%1, 0x8000\n\t"
+	"sc\t%1, %0\n\t"
+	"beqz\t%1, 1b\n\t"
+	"sync\n\t"
+	"li\t%2, 1\n\t"
+	".set\treorder\n"
+	"2:"
+	: "=m" (rw->lock), "=&r" (tmp), "=&r" (ret)
+	: "m" (rw->lock)
+	: "memory");
+
+	return ret;
+}
+
 #endif /* _ASM_SPINLOCK_H */
--- diff/include/asm-mips/stackframe.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/stackframe.h	2004-04-21 10:45:35.892247048 +0100
@@ -102,17 +102,6 @@
 		.endm
 #endif
 
-#ifdef CONFIG_PREEMPT
-		.macro	bump_lock_count
-		lw	t0, TI_PRE_COUNT($28)
-		addiu	t0, t0, 1
-		sw	t0, TI_PRE_COUNT($28)
-		.endm
-#else
-		.macro	bump_lock_count
-		.endm
-#endif
-
 		.macro	SAVE_SOME
 		.set	push
 		.set	reorder
@@ -149,7 +138,6 @@
 		LONG_S	$31, PT_R31(sp)
 		ori	$28, sp, _THREAD_MASK
 		xori	$28, _THREAD_MASK
-		bump_lock_count
 		.set	pop
 		.endm
 
--- diff/include/asm-mips/topology.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/topology.h	2004-04-21 10:45:35.892247048 +0100
@@ -1,15 +1 @@
-#ifndef __ASM_TOPOLOGY_H
-#define __ASM_TOPOLOGY_H
-
-#include <linux/config.h>
-
-#ifdef CONFIG_SGI_IP27
-
-#include <asm/mmzone.h>
-
-#define cpu_to_node(cpu)	(cputocnode(cpu))
-#endif
-
-#include <asm-generic/topology.h>
-
-#endif /* __ASM_TOPOLOGY_H */
+#include <topology.h>
--- diff/include/asm-mips/uaccess.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/uaccess.h	2004-04-21 10:45:35.893246896 +0100
@@ -581,6 +581,23 @@ extern size_t __copy_user(void *__to, co
 
 #define __copy_in_user(to, from, n)	__copy_from_user(to, from, n)
 
+#define copy_in_user(to,from,n)						\
+({									\
+	void *__cu_to;							\
+	const void *__cu_from;						\
+	long __cu_len;							\
+									\
+	might_sleep();							\
+	__cu_to = (to);							\
+	__cu_from = (from);						\
+	__cu_len = (n);							\
+	if (likely(access_ok(VERIFY_READ, __cu_from, __cu_len) &&	\
+	           access_ok(VERIFY_WRITE, __cu_to, __cu_len)))		\
+		__cu_len = __invoke_copy_from_user(__cu_to, __cu_from,	\
+		                                   __cu_len);		\
+	__cu_len;							\
+})
+
 /*
  * __clear_user: - Zero a block of memory in user space, with less checking.
  * @to:   Destination address, in user space.
--- diff/include/asm-mips/unistd.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/unistd.h	2004-04-21 10:45:35.894246744 +0100
@@ -917,7 +917,7 @@ type name(atype a, btype b, ctype c, dty
 	return -1; \
 }
 
-#if (_MIPS_SIM == _MIPS_SIM_ABIN32)
+#if (_MIPS_SIM == _MIPS_SIM_ABI32)
 
 /*
  * Using those means your brain needs more than an oil change ;-)
@@ -985,9 +985,9 @@ type name(atype a, btype b, ctype c, dty
 	return -1; \
 }
 
-#endif /* (_MIPS_SIM == _MIPS_SIM_ABIN32) */
+#endif /* (_MIPS_SIM == _MIPS_SIM_ABI32) */
 
-#if (_MIPS_SIM == _MIPS_SIM_NABIN32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
+#if (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
 
 #define _syscall5(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e) \
 type name (atype a,btype b,ctype c,dtype d,etype e) \
@@ -1043,12 +1043,13 @@ type name (atype a,btype b,ctype c,dtype
 	return -1; \
 }
 
-#endif /* (_MIPS_SIM == _MIPS_SIM_NABIN32) || (_MIPS_SIM == _MIPS_SIM_ABI64) */
+#endif /* (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64) */
 
 #ifdef __KERNEL_SYSCALLS__
 
 #include <linux/compiler.h>
 #include <linux/types.h>
+#include <linux/linkage.h>
 #include <asm/ptrace.h>
 #include <asm/sim.h>
 
--- diff/include/asm-mips/vr41xx/e55.h	2003-07-08 09:55:19.000000000 +0100
+++ source/include/asm-mips/vr41xx/e55.h	2004-04-21 10:45:35.894246744 +0100
@@ -1,17 +1,21 @@
 /*
- * FILE NAME
- *	include/asm-mips/vr41xx/e55.h
+ *  e55.h, Include file for CASIO CASSIOPEIA E-10/15/55/65.
  *
- * BRIEF MODULE DESCRIPTION
- *	Include file for CASIO CASSIOPEIA E-10/15/55/65.
+ *  Copyright (C) 2002-2004  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
  *
- * Copyright 2002 Yoichi Yuasa
- *                yuasa@hh.iij4u.or.jp
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
  *
- *  This program is free software; you can redistribute it and/or modify it
- *  under the terms of the GNU General Public License as published by the
- *  Free Software Foundation; either version 2 of the License, or (at your
- *  option) any later version.
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 #ifndef __CASIO_E55_H
 #define __CASIO_E55_H
@@ -25,13 +29,15 @@
 #define VR41XX_ISA_MEM_BASE		0x10000000
 #define VR41XX_ISA_MEM_SIZE		0x04000000
 
-#define VR41XX_ISA_IO_BASE		0x14000000
-#define VR41XX_ISA_IO_SIZE		0x04000000
+/* VR41XX_ISA_IO_BASE includes offset from real base. */
+#define VR41XX_ISA_IO_BASE		0x1400c000
+#define VR41XX_ISA_IO_SIZE		0x03ff4000
+
+#define ISA_BUS_IO_BASE			0
+#define ISA_BUS_IO_SIZE			VR41XX_ISA_IO_SIZE
 
 #define IO_PORT_BASE			KSEG1ADDR(VR41XX_ISA_IO_BASE)
-#define IO_PORT_RESOURCE_START		0
-#define IO_PORT_RESOURCE_END		VR41XX_ISA_IO_SIZE
-#define IO_MEM_RESOURCE_START		VR41XX_ISA_MEM_BASE
-#define IO_MEM_RESOURCE_END		(VR41XX_ISA_MEM_BASE + VR41XX_ISA_MEM_SIZE)
+#define IO_PORT_RESOURCE_START		ISA_BUS_IO_BASE
+#define IO_PORT_RESOURCE_END		(ISA_BUS_IO_BASE + ISA_BUS_IO_SIZE - 1)
 
 #endif /* __CASIO_E55_H */
--- diff/include/asm-mips/vr41xx/vr41xx.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/vr41xx/vr41xx.h	2004-04-21 10:45:35.895246592 +0100
@@ -7,7 +7,7 @@
  * Copyright (C) 2001, 2002 Paul Mundt
  * Copyright (C) 2002 MontaVista Software, Inc.
  * Copyright (C) 2002 TimeSys Corp.
- * Copyright (C) 2003 Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
+ * Copyright (C) 2003-2004 Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
@@ -43,20 +43,21 @@
 #define PRID_VR4133		0x00000c84
 
 /*
+ * Memory resource
+ */
+#define IO_MEM_RESOURCE_START	0UL
+#define IO_MEM_RESOURCE_END	0x1fffffffUL
+
+/*
  * Bus Control Uint
  */
-extern void vr41xx_bcu_init(void);
 extern unsigned long vr41xx_get_vtclock_frequency(void);
 extern unsigned long vr41xx_get_tclock_frequency(void);
 
 /*
  * Clock Mask Unit
  */
-extern void vr41xx_cmu_init(void);
-extern void vr41xx_clock_supply(unsigned int clock);
-extern void vr41xx_clock_mask(unsigned int clock);
-
-enum {
+typedef enum {
 	PIU_CLOCK,
 	SIU_CLOCK,
 	AIU_CLOCK,
@@ -70,7 +71,10 @@ enum {
 	CEU_CLOCK,
 	ETHER0_CLOCK,
 	ETHER1_CLOCK
-};
+} vr41xx_clock_t;
+
+extern void vr41xx_supply_clock(vr41xx_clock_t clock);
+extern void vr41xx_mask_clock(vr41xx_clock_t clock);
 
 /*
  * Interrupt Control Unit
@@ -129,14 +133,12 @@ enum {
 #define GIU_IRQ_LAST		GIU_IRQ(31)
 #define GIU_IRQ_TO_PIN(x)	((x) - GIU_IRQ_BASE)	/* Pin 0-31 */
 
-extern void (*board_irq_init)(void);
 extern int vr41xx_set_intassign(unsigned int irq, unsigned char intassign);
 extern int vr41xx_cascade_irq(unsigned int irq, int (*get_irq_number)(int irq));
 
 /*
  * Power Management Unit
  */
-extern void vr41xx_pmu_init(void);
 
 /*
  * RTC
@@ -226,10 +228,4 @@ struct vr41xx_pci_address_map {
 
 extern void vr41xx_pciu_init(struct vr41xx_pci_address_map *map);
 
-/*
- * MISC
- */
-extern void vr41xx_time_init(void);
-extern void vr41xx_timer_setup(struct irqaction *irq);
-
 #endif /* __NEC_VR41XX_H */
--- diff/include/asm-mips/vr41xx/workpad.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/vr41xx/workpad.h	2004-04-21 10:45:35.895246592 +0100
@@ -1,17 +1,21 @@
 /*
- * FILE NAME
- *	include/asm-mips/vr41xx/workpad.h
+ *  workpad.h, Include file for IBM WorkPad z50.
  *
- * BRIEF MODULE DESCRIPTION
- *	Include file for IBM WorkPad z50.
+ *  Copyright (C) 2002-2004  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
  *
- * Copyright 2002 Yoichi Yuasa
- *                yuasa@hh.iij4u.or.jp
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
  *
- *  This program is free software; you can redistribute it and/or modify it
- *  under the terms of the GNU General Public License as published by the
- *  Free Software Foundation; either version 2 of the License, or (at your
- *  option) any later version.
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 #ifndef __IBM_WORKPAD_H
 #define __IBM_WORKPAD_H
@@ -29,10 +33,11 @@
 #define VR41XX_ISA_IO_BASE		0x15000000
 #define VR41XX_ISA_IO_SIZE		0x03000000
 
+#define ISA_BUS_IO_BASE			0
+#define ISA_BUS_IO_SIZE			VR41XX_ISA_IO_SIZE
+
 #define IO_PORT_BASE			KSEG1ADDR(VR41XX_ISA_IO_BASE)
-#define IO_PORT_RESOURCE_START		0
-#define IO_PORT_RESOURCE_END		VR41XX_ISA_IO_SIZE
-#define IO_MEM_RESOURCE_START		VR41XX_ISA_MEM_BASE
-#define IO_MEM_RESOURCE_END		(VR41XX_ISA_MEM_BASE + VR41XX_ISA_MEM_SIZE)
+#define IO_PORT_RESOURCE_START		ISA_BUS_IO_BASE
+#define IO_PORT_RESOURCE_END		(ISA_BUS_IO_BASE + ISA_BUS_IO_SIZE - 1)
 
 #endif /* __IBM_WORKPAD_H */
--- diff/include/asm-mips/war.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/war.h	2004-04-21 10:45:35.895246592 +0100
@@ -169,6 +169,14 @@
 #endif
 
 /*
+ * On the RM9000 there is a problem which makes the CreateDirtyExclusive
+ * cache operation unusable on SMP systems.
+ */
+#if defined(CONFIG_MOMENCO_JAGUAR_ATX) || defined(CONFIG_PMC_YOSEMITE)
+#define  RM9000_CDEX_SMP_WAR		1
+#endif
+
+/*
  * Workarounds default to off
  */
 #ifndef R4600_V1_INDEX_ICACHEOP_WAR
@@ -198,5 +206,8 @@
 #ifndef TX49XX_ICACHE_INDEX_INV_WAR
 #define TX49XX_ICACHE_INDEX_INV_WAR	0
 #endif
+#ifndef RM9000_CDEX_SMP_WAR
+#define RM9000_CDEX_SMP_WAR		0
+#endif
 
 #endif /* _ASM_WAR_H */
--- diff/include/asm-parisc/cacheflush.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-parisc/cacheflush.h	2004-04-21 10:45:35.896246440 +0100
@@ -69,8 +69,9 @@ extern void __flush_dcache_page(struct p
 
 static inline void flush_dcache_page(struct page *page)
 {
-	if (page->mapping && list_empty(&page->mapping->i_mmap) &&
-			list_empty(&page->mapping->i_mmap_shared)) {
+	struct address_space *mapping = page_mapping(page);
+
+	if (mapping && !mapping_mapped(mapping)) {
 		set_bit(PG_dcache_dirty, &page->flags);
 	} else {
 		__flush_dcache_page(page);
--- diff/include/asm-parisc/hdreg.h	2002-10-16 04:28:29.000000000 +0100
+++ source/include/asm-parisc/hdreg.h	2004-04-21 10:45:35.896246440 +0100
@@ -1,6 +1 @@
-#ifndef _ASM_HDREG_H
-#define _ASM_HDREG_H
-
-typedef unsigned long ide_ioreg_t;
-
-#endif
+#include <asm-generic/hdreg.h>
--- diff/include/asm-parisc/ide.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-parisc/ide.h	2004-04-21 10:45:35.896246440 +0100
@@ -20,29 +20,9 @@
 #endif
 
 #define ide_default_irq(base) (0)
-#define ide_default_io_base(index) ((ide_ioreg_t)0)
+#define ide_default_io_base(index) (0)
 
-static __inline__ void ide_init_hwif_ports(hw_regs_t *hw, ide_ioreg_t data_port, ide_ioreg_t ctrl_port, int *irq)
-{
-	ide_ioreg_t reg = data_port;
-	int i;
-
-	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
-		hw->io_ports[i] = reg;
-		reg += 1;
-	}
-	if (ctrl_port) {
-		hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
-	} else {
-		hw->io_ports[IDE_CONTROL_OFFSET] = hw->io_ports[IDE_DATA_OFFSET] + 0x206;
-	}
-	if (irq != NULL)
-		*irq = 0;
-	hw->io_ports[IDE_IRQ_OFFSET] = 0;
-}
-
-/* There are no standard ports. */
-static inline void ide_init_default_hwifs(void)	{ ; }
+#define ide_init_default_irq(base)	(0)
 
 #define ide_request_irq(irq,hand,flg,dev,id)	request_irq((irq),(hand),(flg),(dev),(id))
 #define ide_free_irq(irq,dev_id)		free_irq((irq), (dev_id))
--- diff/include/asm-parisc/irq.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/asm-parisc/irq.h	2004-04-21 10:45:35.896246440 +0100
@@ -96,4 +96,7 @@ extern unsigned long txn_alloc_addr(int)
 /* soft power switch support (power.c) */
 extern struct tasklet_struct power_tasklet;
 
+struct irqaction;
+int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
+
 #endif	/* _ASM_PARISC_IRQ_H */
--- diff/include/asm-ppc/hdreg.h	2002-10-16 04:27:18.000000000 +0100
+++ source/include/asm-ppc/hdreg.h	2004-04-21 10:45:35.897246288 +0100
@@ -1,17 +1 @@
-/*
- *  include/asm-ppc/hdreg.h
- *
- *  Copyright (C) 1994-1996  Linus Torvalds & authors
- */
-
-/*
- *  This file contains the ppc architecture specific IDE code.
- */
-
-#ifndef __ASMPPC_HDREG_H
-#define __ASMPPC_HDREG_H
-
-typedef unsigned long ide_ioreg_t;
-
-#endif /* __ASMPPC_HDREG_H */
-
+#include <asm-generic/hdreg.h>
--- diff/include/asm-ppc/ide.h	2003-09-30 15:46:19.000000000 +0100
+++ source/include/asm-ppc/ide.h	2004-04-21 10:45:35.897246288 +0100
@@ -19,8 +19,6 @@
 #define MAX_HWIFS	8
 #endif
 
-#include <asm/hdreg.h>
-
 #include <linux/config.h>
 #include <linux/hdreg.h>
 #include <linux/ioport.h>
@@ -59,50 +57,11 @@ static __inline__ unsigned long ide_defa
 	return 0;
 }
 
-/*
- * This is only used for PC-style IDE controllers (e.g. as on PReP)
- * or for PCI IDE devices, not for other types of IDE interface such
- * as the pmac IDE interfaces.
- */
-static __inline__ void ide_init_hwif_ports(hw_regs_t *hw,
-					   unsigned long data_port,
-					   unsigned long ctrl_port, int *irq)
-{
-	unsigned long reg = data_port;
-	int i;
-
-	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++)
-		hw->io_ports[i] = reg++;
-	if (ctrl_port) {
-		hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
-	} else {
-		hw->io_ports[IDE_CONTROL_OFFSET] =
-			hw->io_ports[IDE_DATA_OFFSET] + 0x206;
-	}
-	if (irq != NULL)
-		*irq = 0;
-	hw->io_ports[IDE_IRQ_OFFSET] = 0;
-	if (ppc_ide_md.ide_init_hwif != NULL)
-		ppc_ide_md.ide_init_hwif(hw, data_port, ctrl_port, irq);
-}
-
-static __inline__ void ide_init_default_hwifs(void)
-{
-#ifndef CONFIG_PCI
-	hw_regs_t hw;
-	int index;
-	unsigned long base;
-
-	for (index = 0; index < MAX_HWIFS; index++) {
-		base = ide_default_io_base(index);
-		if (base == 0)
-			continue;
-		ide_init_hwif_ports(&hw, base, 0, NULL);
-		hw.irq = ide_default_irq(base);
-		ide_register_hw(&hw, NULL);
-	}
+#ifdef CONFIG_PCI
+#define ide_init_default_irq(base)	(0)
+#else
+#define ide_init_default_irq(base)	ide_default_irq(base)
 #endif
-}
 
 #if (defined CONFIG_APUS || defined CONFIG_BLK_DEV_MPC8xx_IDE )
 #define IDE_ARCH_ACK_INTR  1
--- diff/include/asm-ppc/irq.h	2003-09-30 15:46:19.000000000 +0100
+++ source/include/asm-ppc/irq.h	2004-04-21 10:45:35.898246136 +0100
@@ -211,5 +211,9 @@ extern unsigned long ppc_cached_irq_mask
 extern unsigned long ppc_lost_interrupts[NR_MASK_WORDS];
 extern atomic_t ppc_n_lost_interrupts;
 
+struct irqaction;
+struct pt_regs;
+int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
+
 #endif /* _ASM_IRQ_H */
 #endif /* __KERNEL__ */
--- diff/include/asm-ppc/page.h	2003-09-30 15:46:19.000000000 +0100
+++ source/include/asm-ppc/page.h	2004-04-21 10:45:35.898246136 +0100
@@ -84,7 +84,8 @@ typedef unsigned long pgprot_t;
 #define PAGE_ALIGN(addr)	(((addr)+PAGE_SIZE-1)&PAGE_MASK)
 
 struct page;
-extern void clear_page(void *page);
+extern void clear_pages(void *page, int order);
+static inline void clear_page(void *page) { clear_pages(page, 0); }
 extern void copy_page(void *to, void *from);
 extern void clear_user_page(void *page, unsigned long vaddr, struct page *pg);
 extern void copy_user_page(void *to, void *from, unsigned long vaddr,
--- diff/include/asm-ppc/unistd.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-ppc/unistd.h	2004-04-21 10:45:35.898246136 +0100
@@ -260,8 +260,20 @@
 #define __NR_fstatfs64		253
 #define __NR_fadvise64_64	254
 #define __NR_rtas		255
+/* Number 256 is reserved for sys_debug_setcontext */
+/* Number 257 is reserved for vserver */
+/* Number 258 is reserved for new sys_remap_file_pages */
+/* Number 259 is reserved for new sys_mbind */
+/* Number 260 is reserved for new sys_get_mempolicy */
+/* Number 261 is reserved for new sys_set_mempolicy */
+#define __NR_mq_open		262
+#define __NR_mq_unlink		263
+#define __NR_mq_timedsend	264
+#define __NR_mq_timedreceive	265
+#define __NR_mq_notify		266
+#define __NR_mq_getsetattr	267
 
-#define __NR_syscalls		256
+#define __NR_syscalls		268
 
 #define __NR(n)	#n
 
--- diff/include/asm-ppc64/cacheflush.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-ppc64/cacheflush.h	2004-04-21 10:45:35.899245984 +0100
@@ -1,8 +1,8 @@
 #ifndef _PPC64_CACHEFLUSH_H
 #define _PPC64_CACHEFLUSH_H
 
-/* Keep includes the same across arches.  */
 #include <linux/mm.h>
+#include <asm/cputable.h>
 
 /*
  * No cache flushing is required when address mappings are
@@ -18,7 +18,7 @@
 #define flush_cache_vunmap(start, end)		do { } while (0)
 
 extern void flush_dcache_page(struct page *page);
-extern void flush_icache_range(unsigned long, unsigned long);
+extern void __flush_icache_range(unsigned long, unsigned long);
 extern void flush_icache_user_range(struct vm_area_struct *vma,
 				    struct page *page, unsigned long addr,
 				    int len);
@@ -35,4 +35,10 @@ do { memcpy(dst, src, len); \
 
 extern void __flush_dcache_icache(void *page_va);
 
+static inline void flush_icache_range(unsigned long start, unsigned long stop)
+{
+	if (!(cur_cpu_spec->cpu_features & CPU_FTR_COHERENT_ICACHE))
+		__flush_icache_range(start, stop);
+}
+
 #endif /* _PPC64_CACHEFLUSH_H */
--- diff/include/asm-ppc64/cputable.h	2004-02-09 10:36:12.000000000 +0000
+++ source/include/asm-ppc64/cputable.h	2004-04-21 10:45:35.899245984 +0100
@@ -125,8 +125,12 @@ extern firmware_feature_t firmware_featu
 #define CPU_FTR_TLBIEL         		0x0000000400000000
 #define CPU_FTR_NOEXECUTE     		0x0000000800000000
 #define CPU_FTR_NODSISRALIGN  		0x0000001000000000
-#define CPU_FTR_DABR  			0x0000002000000000
-#define CPU_FTR_IABR  			0x0000004000000000
+#define CPU_FTR_IABR  			0x0000002000000000
+#define CPU_FTR_MMCRA  			0x0000004000000000
+#define CPU_FTR_PMC8  			0x0000008000000000
+#define CPU_FTR_SMT  			0x0000010000000000
+#define CPU_FTR_COHERENT_ICACHE  	0x0000020000000000
+#define CPU_FTR_LOCKLESS_TLBIE		0x0000040000000000
 
 /* Platform firmware features */
 #define FW_FTR_                         0x0000000000000001
--- diff/include/asm-ppc64/dma-mapping.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-ppc64/dma-mapping.h	2004-04-21 10:45:35.899245984 +0100
@@ -36,10 +36,43 @@ extern int dma_map_sg(struct device *dev
 		enum dma_data_direction direction);
 extern void dma_unmap_sg(struct device *dev, struct scatterlist *sg,
 		int nhwentries, enum dma_data_direction direction);
-extern void dma_sync_single(struct device *dev, dma_addr_t dma_handle,
-		size_t size, enum dma_data_direction direction);
-extern void dma_sync_sg(struct device *dev, struct scatterlist *sg, int nelems,
-		enum dma_data_direction direction);
+
+static inline void
+dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size,
+			enum dma_data_direction direction)
+{
+	BUG_ON(direction == DMA_NONE);
+	/* nothing to do */
+}
+
+static inline void
+dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t size,
+			   enum dma_data_direction direction)
+{
+	BUG_ON(direction == DMA_NONE);
+	/* nothing to do */
+}
+
+static inline void
+dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems,
+		    enum dma_data_direction direction)
+{
+	BUG_ON(direction == DMA_NONE);
+	/* nothing to do */
+}
+
+static inline void
+dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems,
+		       enum dma_data_direction direction)
+{
+	BUG_ON(direction == DMA_NONE);
+	/* nothing to do */
+}
+
+static inline int dma_mapping_error(dma_addr_t dma_addr)
+{
+	return (dma_addr == DMA_ERROR_CODE);
+}
 
 /* Now for the API extensions over the pci_ one */
 
@@ -56,27 +89,29 @@ dma_get_cache_alignment(void)
 }
 
 static inline void
-dma_sync_single_range(struct device *dev, dma_addr_t dma_handle,
-		      unsigned long offset, size_t size,
-		      enum dma_data_direction direction)
+dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle,
+			      unsigned long offset, size_t size,
+			      enum dma_data_direction direction)
 {
-	/* just sync everything, that's all the pci API can do */
-	dma_sync_single(dev, dma_handle, offset+size, direction);
+	BUG_ON(direction == DMA_NONE);
+	/* nothing to do */
 }
 
 static inline void
-dma_cache_sync(void *vaddr, size_t size,
-	       enum dma_data_direction direction)
+dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle,
+				 unsigned long offset, size_t size,
+				 enum dma_data_direction direction)
 {
-	/* could define this in terms of the dma_cache ... operations,
-	 * but if you get this on a platform, you should convert the platform
-	 * to using the generic device DMA API */
-	BUG();
+	BUG_ON(direction == DMA_NONE);
+	/* nothing to do */
 }
 
-static inline int dma_mapping_error(dma_addr_t dma_addr)
+static inline void
+dma_cache_sync(void *vaddr, size_t size,
+	       enum dma_data_direction direction)
 {
-	return (dma_addr == DMA_ERROR_CODE);
+	BUG_ON(direction == DMA_NONE);
+	/* nothing to do */
 }
 
 #endif	/* _ASM_DMA_MAPPING_H */
--- diff/include/asm-ppc64/eeh.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-ppc64/eeh.h	2004-04-21 10:45:35.900245832 +0100
@@ -199,74 +199,71 @@ static inline void eeh_memcpy_toio(void 
 	memcpy(vdest, src, n);
 }
 
-/* The I/O macros must handle ISA ports as well as PCI I/O bars.
- * ISA does not implement EEH and ISA may not exist in the system.
- * For PCI we check for EEH failures.
- */
-#define _IO_IS_ISA(port) ((port) < 0x10000)
-#define _IO_HAS_ISA_BUS	(isa_io_base != 0)
+#define MAX_ISA_PORT 0x10000
+extern unsigned long io_page_mask;
+#define _IO_IS_VALID(port) ((port) >= MAX_ISA_PORT || (1 << (port>>PAGE_SHIFT)) & io_page_mask)
 
 static inline u8 eeh_inb(unsigned long port) {
 	u8 val;
-	if (_IO_IS_ISA(port) && !_IO_HAS_ISA_BUS)
+	if (!_IO_IS_VALID(port))
 		return ~0;
 	val = in_8((u8 *)(port+pci_io_base));
-	if (!_IO_IS_ISA(port) && EEH_POSSIBLE_IO_ERROR(val, u8))
+	if (EEH_POSSIBLE_IO_ERROR(val, u8))
 		return eeh_check_failure((void*)(port), val);
 	return val;
 }
 
 static inline void eeh_outb(u8 val, unsigned long port) {
-	if (!_IO_IS_ISA(port) || _IO_HAS_ISA_BUS)
+	if (_IO_IS_VALID(port))
 		return out_8((u8 *)(port+pci_io_base), val);
 }
 
 static inline u16 eeh_inw(unsigned long port) {
 	u16 val;
-	if (_IO_IS_ISA(port) && !_IO_HAS_ISA_BUS)
+	if (!_IO_IS_VALID(port))
 		return ~0;
 	val = in_le16((u16 *)(port+pci_io_base));
-	if (!_IO_IS_ISA(port) && EEH_POSSIBLE_IO_ERROR(val, u16))
+	if (EEH_POSSIBLE_IO_ERROR(val, u16))
 		return eeh_check_failure((void*)(port), val);
 	return val;
 }
 
 static inline void eeh_outw(u16 val, unsigned long port) {
-	if (!_IO_IS_ISA(port) || _IO_HAS_ISA_BUS)
+	if (_IO_IS_VALID(port))
 		return out_le16((u16 *)(port+pci_io_base), val);
 }
 
 static inline u32 eeh_inl(unsigned long port) {
 	u32 val;
-	if (_IO_IS_ISA(port) && !_IO_HAS_ISA_BUS)
+	if (!_IO_IS_VALID(port))
 		return ~0;
 	val = in_le32((u32 *)(port+pci_io_base));
-	if (!_IO_IS_ISA(port) && EEH_POSSIBLE_IO_ERROR(val, u32))
+	if (EEH_POSSIBLE_IO_ERROR(val, u32))
 		return eeh_check_failure((void*)(port), val);
 	return val;
 }
 
 static inline void eeh_outl(u32 val, unsigned long port) {
-	if (!_IO_IS_ISA(port) || _IO_HAS_ISA_BUS)
+	if (_IO_IS_VALID(port))
 		return out_le32((u32 *)(port+pci_io_base), val);
 }
 
 /* in-string eeh macros */
 static inline void eeh_insb(unsigned long port, void * buf, int ns) {
 	_insb((u8 *)(port+pci_io_base), buf, ns);
-	if (!_IO_IS_ISA(port) && EEH_POSSIBLE_IO_ERROR((*(((u8*)buf)+ns-1)), u8))
+	if (EEH_POSSIBLE_IO_ERROR((*(((u8*)buf)+ns-1)), u8))
 		eeh_check_failure((void*)(port), *(u8*)buf);
 }
 
 static inline void eeh_insw_ns(unsigned long port, void * buf, int ns) {
 	_insw_ns((u16 *)(port+pci_io_base), buf, ns);
-	if (!_IO_IS_ISA(port) && EEH_POSSIBLE_IO_ERROR((*(((u16*)buf)+ns-1)), u16))
+	if (EEH_POSSIBLE_IO_ERROR((*(((u16*)buf)+ns-1)), u16))
 		eeh_check_failure((void*)(port), *(u16*)buf);
 }
 
 static inline void eeh_insl_ns(unsigned long port, void * buf, int nl) {
 	_insl_ns((u32 *)(port+pci_io_base), buf, nl);
-	if (!_IO_IS_ISA(port) && EEH_POSSIBLE_IO_ERROR((*(((u32*)buf)+nl-1)), u32))
+	if (EEH_POSSIBLE_IO_ERROR((*(((u32*)buf)+nl-1)), u32))
 		eeh_check_failure((void*)(port), *(u32*)buf);
 }
 
--- diff/include/asm-ppc64/hdreg.h	2002-10-16 04:27:18.000000000 +0100
+++ source/include/asm-ppc64/hdreg.h	2004-04-21 10:45:35.900245832 +0100
@@ -1,22 +1 @@
-/*
- *  linux/include/asm-ppc/hdreg.h
- *
- *  Copyright (C) 1994-1996  Linus Torvalds & authors
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- */
-
-/*
- *  This file contains the ppc architecture specific IDE code.
- */
-
-#ifndef __ASMPPC64_HDREG_H
-#define __ASMPPC64_HDREG_H
-
-typedef unsigned long ide_ioreg_t;
-
-#endif /* __ASMPPC64_HDREG_H */
-
+#include <asm-generic/hdreg.h>
--- diff/include/asm-ppc64/hw_irq.h	2004-02-09 10:36:12.000000000 +0000
+++ source/include/asm-ppc64/hw_irq.h	2004-04-21 10:45:35.900245832 +0100
@@ -75,9 +75,24 @@ static inline void __do_save_and_cli(uns
 
 #endif /* CONFIG_PPC_ISERIES */
 
-#define mask_irq(irq) ({if (irq_desc[irq].handler && irq_desc[irq].handler->disable) irq_desc[irq].handler->disable(irq);})
-#define unmask_irq(irq) ({if (irq_desc[irq].handler && irq_desc[irq].handler->enable) irq_desc[irq].handler->enable(irq);})
-#define ack_irq(irq) ({if (irq_desc[irq].handler && irq_desc[irq].handler->ack) irq_desc[irq].handler->ack(irq);})
+#define mask_irq(irq)						\
+	({							\
+	 	irq_desc_t *desc = get_irq_desc(irq);		\
+		if (desc->handler && desc->handler->disable)	\
+			desc->handler->disable(irq);		\
+	})
+#define unmask_irq(irq)						\
+	({							\
+	 	irq_desc_t *desc = get_irq_desc(irq);		\
+		if (desc->handler && desc->handler->enable)	\
+			desc->handler->enable(irq);		\
+	})
+#define ack_irq(irq)						\
+	({							\
+	 	irq_desc_t *desc = get_irq_desc(irq);		\
+		if (desc->handler && desc->handler->ack)	\
+			desc->handler->ack(irq);		\
+	})
 
 /* Should we handle this via lost interrupts and IPIs or should we don't care like
  * we do now ? --BenH.
--- diff/include/asm-ppc64/ide.h	2002-10-16 04:28:22.000000000 +0100
+++ source/include/asm-ppc64/ide.h	2004-04-21 10:45:35.901245680 +0100
@@ -22,31 +22,10 @@
 # define MAX_HWIFS	4
 #endif
 
-static __inline__ int ide_default_irq(ide_ioreg_t base) { return 0; }
-static __inline__ ide_ioreg_t ide_default_io_base(int index) { return 0; }
+static inline int ide_default_irq(unsigned long base) { return 0; }
+static inline unsigned long ide_default_io_base(int index) { return 0; }
 
-static __inline__ void ide_init_hwif_ports(hw_regs_t *hw, ide_ioreg_t data_port, ide_ioreg_t ctrl_port, int *irq)
-{
-	ide_ioreg_t reg = data_port;
-	int i;
-
-	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
-		hw->io_ports[i] = reg;
-		reg += 1;
-	}
-	if (ctrl_port) {
-		hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
-	} else {
-		hw->io_ports[IDE_CONTROL_OFFSET] = hw->io_ports[IDE_DATA_OFFSET] + 0x206;
-	}
-	if (irq != NULL)
-		*irq = 0;
-	hw->io_ports[IDE_IRQ_OFFSET] = 0;
-}
-
-static __inline__ void ide_init_default_hwifs(void)
-{
-}
+#define ide_init_default_irq(base)	(0)
 
 #endif /* __KERNEL__ */
 
--- diff/include/asm-ppc64/iommu.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-ppc64/iommu.h	2004-04-21 10:45:35.901245680 +0100
@@ -19,12 +19,13 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-#ifndef _PCI_DMA_H
-#define _PCI_DMA_H
+#ifndef _ASM_IOMMU_H
+#define _ASM_IOMMU_H
 
 #include <asm/types.h>
 #include <linux/spinlock.h>
 #include <linux/device.h>
+#include <linux/dma-mapping.h>
 
 /*
  * IOMAP_MAX_ORDER defines the largest contiguous block
@@ -130,19 +131,20 @@ extern void iommu_devnode_init(struct iS
  */
 extern struct iommu_table *iommu_init_table(struct iommu_table * tbl);
 
-/* allocates a range of tces and sets them to the pages  */
-extern dma_addr_t iommu_alloc(struct iommu_table *, void *page, 
-			      unsigned int numPages, int direction);
-extern void iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr, 
-		       unsigned int npages);
-
-/* same with sg lists */
-extern int iommu_alloc_sg(struct iommu_table *table, struct device *dev,
-			  struct scatterlist *sglist, int nelems,
-			  int direction);
-extern void iommu_free_sg(struct iommu_table *tbl, struct scatterlist *sglist,
-			  int nelems);
-
+extern int iommu_map_sg(struct device *dev, struct iommu_table *tbl,
+		struct scatterlist *sglist, int nelems,
+		enum dma_data_direction direction);
+extern void iommu_unmap_sg(struct iommu_table *tbl, struct scatterlist *sglist,
+		int nelems, enum dma_data_direction direction);
+
+extern void *iommu_alloc_consistent(struct iommu_table *tbl, size_t size,
+		dma_addr_t *dma_handle);
+extern void iommu_free_consistent(struct iommu_table *tbl, size_t size,
+		void *vaddr, dma_addr_t dma_handle);
+extern dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr,
+		size_t size, enum dma_data_direction direction);
+extern void iommu_unmap_single(struct iommu_table *tbl, dma_addr_t dma_handle,
+		size_t size, enum dma_data_direction direction);
 
 extern void tce_init_pSeries(void);
 extern void tce_init_iSeries(void);
@@ -152,4 +154,4 @@ extern void pci_dma_init_direct(void);
 
 extern int ppc64_iommu_off;
 
-#endif
+#endif /* _ASM_IOMMU_H */
--- diff/include/asm-ppc64/irq.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-ppc64/irq.h	2004-04-21 10:45:35.902245528 +0100
@@ -11,6 +11,11 @@
 
 #include <asm/atomic.h>
 
+/*
+ * Maximum number of interrupt sources that we can handle.
+ */
+#define NR_IRQS		512
+
 extern void disable_irq(unsigned int);
 extern void disable_irq_nosync(unsigned int);
 extern void enable_irq(unsigned int);
@@ -18,12 +23,11 @@ extern void enable_irq(unsigned int);
 /* this number is used when no interrupt has been assigned */
 #define NO_IRQ			(-1)
 
-/*
- * this is the maximum number of virtual irqs we will use.
- */
-#define NR_IRQS			512
+#define get_irq_desc(irq) (&irq_desc[(irq)])
 
-#define NUM_8259_INTERRUPTS	16
+/* Define a way to iterate across irqs. */
+#define for_each_irq(i) \
+	for ((i) = 0; (i) < NR_IRQS; ++(i))
 
 /* Interrupt numbers are virtual in case they are sparsely
  * distributed by the hardware.
@@ -41,12 +45,39 @@ static inline unsigned int virt_irq_to_r
 	return virt_irq_to_real_map[virt_irq];
 }
 
+/*
+ * Because many systems have two overlapping names spaces for
+ * interrupts (ISA and XICS for example), and the ISA interrupts
+ * have historically not been easy to renumber, we allow ISA
+ * interrupts to take values 0 - 15, and shift up the remaining
+ * interrupts by 0x10.
+ */
+#define NUM_ISA_INTERRUPTS	0x10
+extern int __irq_offset_value;
+
+static inline int irq_offset_up(int irq)
+{
+	return(irq + __irq_offset_value);
+}
+
+static inline int irq_offset_down(int irq)
+{
+	return(irq - __irq_offset_value);
+}
+
+static inline int irq_offset_value(void)
+{
+	return __irq_offset_value;
+}
+
 static __inline__ int irq_canonicalize(int irq)
 {
 	return irq;
 }
 
-#define NR_MASK_WORDS	((NR_IRQS + 63) / 64)
+struct irqaction;
+struct pt_regs;
+int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
 
 #endif /* _ASM_IRQ_H */
 #endif /* __KERNEL__ */
--- diff/include/asm-ppc64/machdep.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-ppc64/machdep.h	2004-04-21 10:45:35.902245528 +0100
@@ -11,6 +11,7 @@
 
 #include <linux/config.h>
 #include <linux/seq_file.h>
+#include <linux/dma-mapping.h>
 
 struct pt_regs;
 struct pci_bus;	
@@ -57,7 +58,7 @@ struct machdep_calls {
 				     long index,
 				     long npages,
 				     unsigned long uaddr,
-				     int direction);
+				     enum dma_data_direction direction);
 	void		(*tce_free)(struct iommu_table *tbl,
 				    long index,
 				    long npages);
@@ -79,6 +80,7 @@ struct machdep_calls {
 	void		(*restart)(char *cmd);
 	void		(*power_off)(void);
 	void		(*halt)(void);
+	void		(*panic)(char *str);
 
 	int		(*set_rtc_time)(struct rtc_time *);
 	void		(*get_rtc_time)(struct rtc_time *);
--- diff/include/asm-ppc64/mmu.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-ppc64/mmu.h	2004-04-21 10:45:35.902245528 +0100
@@ -23,12 +23,12 @@ typedef unsigned long mm_context_id_t;
 typedef struct {
 	mm_context_id_t id;
 #ifdef CONFIG_HUGETLB_PAGE
-	int low_hpages;
+	u16 htlb_segs; /* bitmask */
 #endif
 } mm_context_t;
 
 #ifdef CONFIG_HUGETLB_PAGE
-#define KERNEL_LOW_HPAGES	.low_hpages = 0,
+#define KERNEL_LOW_HPAGES	.htlb_segs = 0,
 #else
 #define KERNEL_LOW_HPAGES
 #endif
--- diff/include/asm-ppc64/mmzone.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-ppc64/mmzone.h	2004-04-21 10:45:35.903245376 +0100
@@ -19,13 +19,13 @@ extern struct pglist_data node_data[];
  */
 
 extern int numa_cpu_lookup_table[];
-extern int numa_memory_lookup_table[];
+extern char *numa_memory_lookup_table;
 extern cpumask_t numa_cpumask_lookup_table[];
 extern int nr_cpus_in_node[];
 
 #define MAX_MEMORY (1UL << 41)
-/* 256MB regions */
-#define MEMORY_INCREMENT_SHIFT 28
+/* 16MB regions */
+#define MEMORY_INCREMENT_SHIFT 24
 #define MEMORY_INCREMENT (1UL << MEMORY_INCREMENT_SHIFT)
 
 /* NUMA debugging, will not work on a DLPAR machine */
--- diff/include/asm-ppc64/naca.h	2004-02-09 10:36:12.000000000 +0000
+++ source/include/asm-ppc64/naca.h	2004-04-21 10:45:35.903245376 +0100
@@ -37,12 +37,10 @@ struct naca_struct {
 	u32 dCacheL1LinesPerPage;	/* L1 d-cache lines / page   0x64 */
 	u32 iCacheL1LogLineSize;	/* L1 i-cache line size Log2 0x68 */
 	u32 iCacheL1LinesPerPage;	/* L1 i-cache lines / page   0x6c */
-	u64 smt_snooze_delay;           /* Delay (in usec) before    0x70 */
-                                        /* entering ST mode               */
-	u8  smt_state;                  /* 0 = SMT off               0x78 */
+	u8  smt_state;                  /* 0 = SMT off               0x70 */
 	                                /* 1 = SMT on                     */
 	                                /* 2 = SMT dynamic                */
-	u8  resv0[7];                   /* Reserved           0x70 - 0x7F */
+	u8  resv0[15];                  /* Reserved           0x71 - 0x7F */
 };
 
 extern struct naca_struct *naca;
--- diff/include/asm-ppc64/paca.h	2004-02-18 08:54:12.000000000 +0000
+++ source/include/asm-ppc64/paca.h	2004-04-21 10:45:35.903245376 +0100
@@ -64,13 +64,13 @@ struct paca_struct {
         u16 xHwProcNum;                 /* Physical processor number            0x1A */
 	u32 default_decr;		/* Default decrementer value		0x1c */	
 	u64 xKsave;			/* Saved Kernel stack addr or zero	0x20 */
-	struct ItLpQueue *lpQueuePtr;	/* LpQueue handled by this processor    0x30 */
-	u64  xTOC;			/* Kernel TOC address			0x38 */
-	STAB xStab_data;		/* Segment table information		0x40,0x48,0x50 */
-	u8 *exception_sp;		/*                                      0x58 */
-	u8 xProcEnabled;		/*                                      0x59 */
-	u8 prof_enabled;		/* 1=iSeries profiling enabled          0x60 */
-	u8 resv1[38];			/*					0x61-0x7F */
+	struct ItLpQueue *lpQueuePtr;	/* LpQueue handled by this processor    0x28 */
+	u64  xTOC;			/* Kernel TOC address			0x30 */
+	STAB xStab_data;		/* Segment table information		0x38,0x40,0x48 */
+	u8 *exception_sp;		/*                                      0x50 */
+	u8 xProcEnabled;		/*                                      0x58 */
+	u8 prof_enabled;		/* 1=iSeries profiling enabled          0x59 */
+	u8 resv1[38];			/*					0x5a-0x7f*/
 
 /*=====================================================================================
  * CACHE_LINE_2 0x0080 - 0x00FF
--- diff/include/asm-ppc64/page.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-ppc64/page.h	2004-04-21 10:45:35.904245224 +0100
@@ -22,6 +22,10 @@
 #define PAGE_MASK	(~(PAGE_SIZE-1))
 #define PAGE_OFFSET_MASK (PAGE_SIZE-1)
 
+#define SID_SHIFT       28
+#define SID_MASK        0xfffffffff
+#define GET_ESID(x)     (((x) >> SID_SHIFT) & SID_MASK)
+
 #ifdef CONFIG_HUGETLB_PAGE
 
 #define HPAGE_SHIFT	24
@@ -33,30 +37,36 @@
 #define TASK_HPAGE_BASE 	(0x0000010000000000UL)
 #define TASK_HPAGE_END 	(0x0000018000000000UL)
 
-/* For 32-bit processes the hugepage range is 2-3G */
-#define TASK_HPAGE_BASE_32	(0x80000000UL)
-#define TASK_HPAGE_END_32	(0xc0000000UL)
+#define LOW_ESID_MASK(addr, len)	(((1U << (GET_ESID(addr+len-1)+1)) \
+	   	                	- (1U << GET_ESID(addr))) & 0xffff)
 
 #define ARCH_HAS_HUGEPAGE_ONLY_RANGE
 #define ARCH_HAS_PREPARE_HUGEPAGE_RANGE
 
-#define is_hugepage_low_range(addr, len) \
-	(((addr) > (TASK_HPAGE_BASE_32-(len))) && ((addr) < TASK_HPAGE_END_32))
-#define is_hugepage_high_range(addr, len) \
+#define touches_hugepage_low_range(addr, len) \
+	(LOW_ESID_MASK((addr), (len)) & current->mm->context.htlb_segs)
+#define touches_hugepage_high_range(addr, len) \
 	(((addr) > (TASK_HPAGE_BASE-(len))) && ((addr) < TASK_HPAGE_END))
 
+#define __within_hugepage_low_range(addr, len, segmask) \
+	((LOW_ESID_MASK((addr), (len)) | (segmask)) == (segmask))
+#define within_hugepage_low_range(addr, len) \
+	__within_hugepage_low_range((addr), (len), \
+				    current->mm->context.htlb_segs)
+#define within_hugepage_high_range(addr, len) (((addr) >= TASK_HPAGE_BASE) \
+	  && ((addr)+(len) <= TASK_HPAGE_END) && ((addr)+(len) >= (addr)))
+
 #define is_hugepage_only_range(addr, len) \
-	(is_hugepage_high_range((addr), (len)) || \
-	 (current->mm->context.low_hpages \
-	  && is_hugepage_low_range((addr), (len))))
+	(touches_hugepage_high_range((addr), (len)) || \
+	  touches_hugepage_low_range((addr), (len)))
 #define hugetlb_free_pgtables free_pgtables
 #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
 
 #define in_hugepage_area(context, addr) \
 	((cur_cpu_spec->cpu_features & CPU_FTR_16M_PAGE) && \
-	 ((((addr) >= TASK_HPAGE_BASE) && ((addr) < TASK_HPAGE_END)) || \
-	  ((context).low_hpages && \
-	   (((addr) >= TASK_HPAGE_BASE_32) && ((addr) < TASK_HPAGE_END_32)))))
+	 ( (((addr) >= TASK_HPAGE_BASE) && ((addr) < TASK_HPAGE_END)) || \
+	   ( ((addr) < 0x100000000L) && \
+	     ((1 << GET_ESID(addr)) & (context).htlb_segs) ) ) )
 
 #else /* !CONFIG_HUGETLB_PAGE */
 
@@ -64,10 +74,6 @@
 
 #endif /* !CONFIG_HUGETLB_PAGE */
 
-#define SID_SHIFT       28
-#define SID_MASK        0xfffffffff
-#define GET_ESID(x)     (((x) >> SID_SHIFT) & SID_MASK)
-
 /* align addr on a size boundary - adjust address up/down if needed */
 #define _ALIGN_UP(addr,size)	(((addr)+((size)-1))&(~((size)-1)))
 #define _ALIGN_DOWN(addr,size)	((addr)&(~((size)-1)))
--- diff/include/asm-ppc64/pci-bridge.h	2004-02-18 08:54:12.000000000 +0000
+++ source/include/asm-ppc64/pci-bridge.h	2004-04-21 10:45:35.904245224 +0100
@@ -2,6 +2,8 @@
 #ifndef _ASM_PCI_BRIDGE_H
 #define _ASM_PCI_BRIDGE_H
 
+#include <linux/pci.h>
+
 /*
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
--- diff/include/asm-ppc64/pci.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-ppc64/pci.h	2004-04-21 10:45:35.905245072 +0100
@@ -64,13 +64,13 @@ struct pci_dma_ops {
 				       void *vaddr, dma_addr_t dma_handle);
 
 	dma_addr_t	(*pci_map_single)(struct pci_dev *hwdev, void *ptr,
-					  size_t size, int direction);
+					  size_t size, enum dma_data_direction direction);
 	void		(*pci_unmap_single)(struct pci_dev *hwdev, dma_addr_t dma_addr,
-					    size_t size, int direction);
+					    size_t size, enum dma_data_direction direction);
 	int		(*pci_map_sg)(struct pci_dev *hwdev, struct scatterlist *sg,
-				      int nents, int direction);
+				      int nents, enum dma_data_direction direction);
 	void		(*pci_unmap_sg)(struct pci_dev *hwdev, struct scatterlist *sg,
-					int nents, int direction);
+					int nents, enum dma_data_direction direction);
 	int		(*pci_dma_supported)(struct pci_dev *hwdev, u64 mask);
 	int		(*pci_dac_dma_supported)(struct pci_dev *hwdev, u64 mask);
 };
@@ -92,25 +92,29 @@ static inline void pci_free_consistent(s
 static inline dma_addr_t pci_map_single(struct pci_dev *hwdev, void *ptr,
 					size_t size, int direction)
 {
-	return pci_dma_ops.pci_map_single(hwdev, ptr, size, direction); 
+	return pci_dma_ops.pci_map_single(hwdev, ptr, size,
+			(enum dma_data_direction)direction);
 }
 
 static inline void pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr,
 				    size_t size, int direction)
 {
-	pci_dma_ops.pci_unmap_single(hwdev, dma_addr, size, direction);
+	pci_dma_ops.pci_unmap_single(hwdev, dma_addr, size,
+			(enum dma_data_direction)direction);
 }
 
 static inline int pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg,
 			     int nents, int direction)
 {
-	return pci_dma_ops.pci_map_sg(hwdev, sg, nents, direction);
+	return pci_dma_ops.pci_map_sg(hwdev, sg, nents,
+			(enum dma_data_direction)direction);
 }
 
 static inline void pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg,
 				int nents, int direction)
 {
-	pci_dma_ops.pci_unmap_sg(hwdev, sg, nents, direction);
+	pci_dma_ops.pci_unmap_sg(hwdev, sg, nents,
+			(enum dma_data_direction)direction);
 }
 
 static inline void pci_dma_sync_single_for_cpu(struct pci_dev *hwdev,
--- diff/include/asm-ppc64/pgtable.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-ppc64/pgtable.h	2004-04-21 10:45:35.905245072 +0100
@@ -313,7 +313,9 @@ static inline int ptep_test_and_clear_yo
 {
 	unsigned long old;
 
-	old = pte_update(ptep, _PAGE_ACCESSED | _PAGE_HPTEFLAGS);
+       	if ((pte_val(*ptep) & (_PAGE_ACCESSED | _PAGE_HASHPTE)) == 0)
+		return 0;
+	old = pte_update(ptep, _PAGE_ACCESSED);
 	if (old & _PAGE_HASHPTE) {
 		hpte_update(ptep, old, 0);
 		flush_tlb_pending();	/* XXX generic code doesn't flush */
@@ -326,12 +328,13 @@ static inline int ptep_test_and_clear_yo
  * moment we always flush but we need to fix hpte_update and test if the
  * optimisation is worth it.
  */
-#if 1
 static inline int ptep_test_and_clear_dirty(pte_t *ptep)
 {
 	unsigned long old;
 
-	old = pte_update(ptep, _PAGE_DIRTY | _PAGE_HPTEFLAGS);
+       	if ((pte_val(*ptep) & _PAGE_DIRTY) == 0)
+		return 0;
+	old = pte_update(ptep, _PAGE_DIRTY);
 	if (old & _PAGE_HASHPTE)
 		hpte_update(ptep, old, 0);
 	return (old & _PAGE_DIRTY) != 0;
@@ -341,7 +344,9 @@ static inline void ptep_set_wrprotect(pt
 {
 	unsigned long old;
 
-	old = pte_update(ptep, _PAGE_RW | _PAGE_HPTEFLAGS);
+       	if ((pte_val(*ptep) & _PAGE_RW) == 0)
+       		return;
+	old = pte_update(ptep, _PAGE_RW);
 	if (old & _PAGE_HASHPTE)
 		hpte_update(ptep, old, 0);
 }
@@ -358,7 +363,6 @@ static inline void ptep_set_wrprotect(pt
 #define ptep_clear_flush_young(__vma, __address, __ptep)		\
 ({									\
 	int __young = ptep_test_and_clear_young(__ptep);		\
-	flush_tlb_page(__vma, __address);				\
 	__young;							\
 })
 
@@ -370,27 +374,6 @@ static inline void ptep_set_wrprotect(pt
 	__dirty;							\
 })
 
-#else
-static inline int ptep_test_and_clear_dirty(pte_t *ptep)
-{
-	unsigned long old;
-
-	old = pte_update(ptep, _PAGE_DIRTY);
-	if ((~old & (_PAGE_HASHPTE | _PAGE_RW | _PAGE_DIRTY)) == 0)
-		hpte_update(ptep, old, 1);
-	return (old & _PAGE_DIRTY) != 0;
-}
-
-static inline void ptep_set_wrprotect(pte_t *ptep)
-{
-	unsigned long old;
-
-	old = pte_update(ptep, _PAGE_RW);
-	if ((~old & (_PAGE_HASHPTE | _PAGE_RW | _PAGE_DIRTY)) == 0)
-		hpte_update(ptep, old, 1);
-}
-#endif
-
 static inline pte_t ptep_get_and_clear(pte_t *ptep)
 {
 	unsigned long old = pte_update(ptep, ~0UL);
--- diff/include/asm-ppc64/ppc32.h	2004-02-09 10:36:12.000000000 +0000
+++ source/include/asm-ppc64/ppc32.h	2004-04-21 10:45:35.906244920 +0100
@@ -141,20 +141,6 @@ struct ucontext32 { 
 	struct mcontext32	uc_mcontext;
 };
 
-typedef struct compat_sigevent {
-	compat_sigval_t sigev_value;
-	int sigev_signo;
-	int sigev_notify;
-	union {
-		int _pad[SIGEV_PAD_SIZE];
-		int _tid;
-		struct {
-			compat_uptr_t _function;
-			compat_uptr_t _attribute;
-		} _sigev_thread;
-	} _sigev_un;
-} compat_sigevent_t;
-
 struct ipc_kludge_32 {
 	unsigned int msgp;
 	int msgtyp;
--- diff/include/asm-ppc64/processor.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-ppc64/processor.h	2004-04-21 10:45:35.907244768 +0100
@@ -235,8 +235,6 @@
 #define	SPRN_IMMR	0x27E  	/* Internal Memory Map Register */
 #define	SPRN_L2CR	0x3F9	/* Level 2 Cache Control Regsiter */
 #define	SPRN_LR		0x008	/* Link Register */
-#define	SPRN_MMCR0	0x3B8	/* Monitor Mode Control Register 0 */
-#define	SPRN_MMCR1	0x3BC	/* Monitor Mode Control Register 1 */
 #define	SPRN_PBL1	0x3FC	/* Protection Bound Lower 1 */
 #define	SPRN_PBL2	0x3FE	/* Protection Bound Lower 2 */
 #define	SPRN_PBU1	0x3FD	/* Protection Bound Upper 1 */
@@ -244,10 +242,7 @@
 #define	SPRN_PID	0x3B1	/* Process ID */
 #define	SPRN_PIR	0x3FF	/* Processor Identification Register */
 #define	SPRN_PIT	0x3DB	/* Programmable Interval Timer */
-#define	SPRN_PMC1	0x3B9	/* Performance Counter Register 1 */
-#define	SPRN_PMC2	0x3BA	/* Performance Counter Register 2 */
-#define	SPRN_PMC3	0x3BD	/* Performance Counter Register 3 */
-#define	SPRN_PMC4	0x3BE	/* Performance Counter Register 4 */
+#define	SPRN_PURR	0x135	/* Processor Utilization of Resources Register */
 #define	SPRN_PVR	0x11F	/* Processor Version Register */
 #define	SPRN_RPA	0x3D6	/* Required Physical Address Register */
 #define	SPRN_SDA	0x3BF	/* Sampled Data Address Register */
@@ -307,17 +302,26 @@
 #define	    WRS_SYSTEM		3		/* WDT forced system reset */
 #define	  TSR_PIS		0x08000000	/* PIT Interrupt Status */
 #define	  TSR_FIS		0x04000000	/* FIT Interrupt Status */
-#define	SPRN_UMMCR0	0x3A8	/* User Monitor Mode Control Register 0 */
-#define	SPRN_UMMCR1	0x3AC	/* User Monitor Mode Control Register 0 */
-#define	SPRN_UPMC1	0x3A9	/* User Performance Counter Register 1 */
-#define	SPRN_UPMC2	0x3AA	/* User Performance Counter Register 2 */
-#define	SPRN_UPMC3	0x3AD	/* User Performance Counter Register 3 */
-#define	SPRN_UPMC4	0x3AE	/* User Performance Counter Register 4 */
 #define	SPRN_USIA	0x3AB	/* User Sampled Instruction Address Register */
 #define	SPRN_XER	0x001	/* Fixed Point Exception Register */
 #define	SPRN_ZPR	0x3B0	/* Zone Protection Register */
 #define SPRN_VRSAVE     0x100   /* Vector save */
 
+/* Performance monitor SPRs */
+#define SPRN_SIAR	780
+#define SPRN_SDAR	781
+#define SPRN_MMCRA	786
+#define SPRN_PMC1	787
+#define SPRN_PMC2	788
+#define SPRN_PMC3	789
+#define SPRN_PMC4	790
+#define SPRN_PMC5	791
+#define SPRN_PMC6	792
+#define SPRN_PMC7	793
+#define SPRN_PMC8	794
+#define SPRN_MMCR0	795
+#define SPRN_MMCR1	798
+
 /* Short-hand versions for a number of the above SPRNs */
 
 #define	CTR	SPRN_CTR	/* Counter Register */
@@ -343,6 +347,7 @@
 #define	__LR	SPRN_LR
 #define	PVR	SPRN_PVR	/* Processor Version */
 #define	PIR	SPRN_PIR	/* Processor ID */
+#define	PURR	SPRN_PURR	/* Processor Utilization of Resource Register */
 #define	RPA	SPRN_RPA	/* Required Physical Address Register */
 #define	SDR1	SPRN_SDR1      	/* MMU hash base register */
 #define	SPR0	SPRN_SPRG0	/* Supervisor Private Registers */
--- diff/include/asm-ppc64/rtas.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-ppc64/rtas.h	2004-04-21 10:45:35.907244768 +0100
@@ -169,12 +169,11 @@ extern struct rtas_t rtas;
 extern void enter_rtas(struct rtas_args *);
 extern int rtas_token(const char *service);
 extern long rtas_call(int token, int, int, unsigned long *, ...);
-extern void phys_call_rtas(int, int, int, ...);
-extern void phys_call_rtas_display_status(char);
 extern void call_rtas_display_status(char);
 extern void rtas_restart(char *cmd);
 extern void rtas_power_off(void);
 extern void rtas_halt(void);
+extern void rtas_os_term(char *str);
 extern int rtas_get_sensor(int sensor, int index, int *state);
 extern int rtas_get_power_level(int powerdomain, int *level);
 extern int rtas_set_power_level(int powerdomain, int level, int *setlevel);
@@ -198,7 +197,7 @@ extern void pSeries_log_error(char *buf,
 /* All the types and not flags */
 #define ERR_TYPE_MASK	(ERR_TYPE_RTAS_LOG | ERR_TYPE_KERNEL_PANIC)
 
-#define RTAS_ERR KERN_ERR "RTAS: "
+#define RTAS_DEBUG KERN_DEBUG "RTAS: "
  
 #define RTAS_ERROR_LOG_MAX 2048
  
@@ -219,6 +218,8 @@ extern void pSeries_log_error(char *buf,
 extern spinlock_t rtas_data_buf_lock;
 extern char rtas_data_buf[RTAS_DATA_BUF_SIZE];
 
+extern void rtas_stop_self(void);
+
 /* RMO buffer reserved for user-space RTAS use */
 extern unsigned long rtas_rmo_buf;
 
--- diff/include/asm-ppc64/smp.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-ppc64/smp.h	2004-04-21 10:45:35.907244768 +0100
@@ -67,9 +67,14 @@ extern cpumask_t cpu_available_map;
 #endif
 #define PPC_MSG_DEBUGGER_BREAK  3
 
+extern cpumask_t irq_affinity[];
+
 void smp_init_iSeries(void);
 void smp_init_pSeries(void);
 
+extern int __cpu_disable(void);
+extern void __cpu_die(unsigned int cpu);
+extern void cpu_die(void) __attribute__((noreturn));
 #endif /* !(CONFIG_SMP) */
 
 #define get_hard_smp_processor_id(CPU) (paca[(CPU)].xHwProcNum)
--- diff/include/asm-ppc64/system.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-ppc64/system.h	2004-04-21 10:45:35.908244616 +0100
@@ -94,7 +94,12 @@ static inline int debugger_dabr_match(st
 static inline int debugger_fault_handler(struct pt_regs *regs) { return 0; }
 #endif
 
+extern int fix_alignment(struct pt_regs *regs);
+extern void bad_page_fault(struct pt_regs *regs, unsigned long address,
+			   int sig);
 extern void show_regs(struct pt_regs * regs);
+extern int die(const char *str, struct pt_regs *regs, long err);
+
 extern void flush_instruction_cache(void);
 extern int _get_PVR(void);
 extern void giveup_fpu(struct task_struct *);
--- diff/include/asm-ppc64/thread_info.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-ppc64/thread_info.h	2004-04-21 10:45:35.908244616 +0100
@@ -97,6 +97,7 @@ static inline struct thread_info *curren
 #define TIF_32BIT		5	/* 32 bit binary */
 #define TIF_RUN_LIGHT		6	/* iSeries run light */
 #define TIF_ABI_PENDING		7	/* 32/64 bit switch needed */
+#define TIF_SYSCALL_AUDIT	8	/* syscall auditing active */
 
 /* as above, but as bit values */
 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
@@ -107,6 +108,8 @@ static inline struct thread_info *curren
 #define _TIF_32BIT		(1<<TIF_32BIT)
 #define _TIF_RUN_LIGHT		(1<<TIF_RUN_LIGHT)
 #define _TIF_ABI_PENDING	(1<<TIF_ABI_PENDING)
+#define _TIF_SYSCALL_AUDIT	(1<<TIF_SYSCALL_AUDIT)
+#define _TIF_SYSCALL_T_OR_A	(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)
 
 #define _TIF_USER_WORK_MASK	(_TIF_NOTIFY_RESUME | _TIF_SIGPENDING | \
 				 _TIF_NEED_RESCHED)
--- diff/include/asm-ppc64/unistd.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-ppc64/unistd.h	2004-04-21 10:45:35.908244616 +0100
@@ -266,8 +266,20 @@
 #define __NR_fstatfs64		253
 #define __NR_fadvise64_64	254
 #define __NR_rtas		255
+/* Number 256 is reserved for sys_debug_setcontext */
+/* Number 257 is reserved for vserver */
+/* Number 258 is reserved for new sys_remap_file_pages */
+/* Number 259 is reserved for new sys_mbind */
+/* Number 260 is reserved for new sys_get_mempolicy */
+/* Number 261 is reserved for new sys_set_mempolicy */
+#define __NR_mq_open		262
+#define __NR_mq_unlink		263
+#define __NR_mq_timedsend	264
+#define __NR_mq_timedreceive	265
+#define __NR_mq_notify		266
+#define __NR_mq_getsetattr	267
 
-#define __NR_syscalls		256
+#define __NR_syscalls		268
 #ifdef __KERNEL__
 #define NR_syscalls	__NR_syscalls
 #endif
--- diff/include/asm-ppc64/vio.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-ppc64/vio.h	2004-04-21 10:45:35.909244464 +0100
@@ -17,7 +17,6 @@
 #include <linux/init.h>
 #include <linux/errno.h>
 #include <linux/device.h>
-#include <linux/pci.h>
 #include <linux/dma-mapping.h>
 #include <asm/hvcall.h>
 #include <asm/prom.h>
@@ -58,13 +57,13 @@ int vio_enable_interrupts(struct vio_dev
 int vio_disable_interrupts(struct vio_dev *dev);
 
 dma_addr_t vio_map_single(struct vio_dev *dev, void *vaddr, 
-			  size_t size, int direction);
+			  size_t size, enum dma_data_direction direction);
 void vio_unmap_single(struct vio_dev *dev, dma_addr_t dma_handle, 
-		      size_t size, int direction);
+		      size_t size, enum dma_data_direction direction);
 int vio_map_sg(struct vio_dev *vdev, struct scatterlist *sglist, 
-	       int nelems, int direction);
+	       int nelems, enum dma_data_direction direction);
 void vio_unmap_sg(struct vio_dev *vdev, struct scatterlist *sglist, 
-		  int nelems, int direction);
+		  int nelems, enum dma_data_direction direction);
 void *vio_alloc_consistent(struct vio_dev *dev, size_t size, 
 			   dma_addr_t *dma_handle);
 void vio_free_consistent(struct vio_dev *dev, size_t size, void *vaddr, 
@@ -79,23 +78,10 @@ static inline int vio_dma_supported(stru
 		vio_map_single(dev, (page_address(page) + (off)), size, dir)
 #define vio_unmap_page(dev,addr,sz,dir) vio_unmap_single(dev,addr,sz,dir)
 
-
-static inline void vio_dma_sync_single(struct vio_dev *hwdev,
-				       dma_addr_t dma_handle,
-				       size_t size, int direction)
-{
-	BUG_ON(direction == PCI_DMA_NONE);
-	/* nothing to do */
-}
-
-static inline void vio_dma_sync_sg(struct vio_dev *hwdev,
-				   struct scatterlist *sg,
-				   int nelems, int direction)
+static inline int vio_set_dma_mask(struct vio_dev *dev, u64 mask)
 {
-	BUG_ON(direction == PCI_DMA_NONE);
-	/* nothing to do */
+	return -EIO;
 }
-static inline int vio_set_dma_mask(struct vio_dev *dev, u64 mask) { return -EIO; }
 
 extern struct bus_type vio_bus_type;
 
@@ -138,9 +124,4 @@ static inline struct vio_dev *to_vio_dev
 	return container_of(dev, struct vio_dev, dev);
 }
 
-static inline int vio_dma_mapping_error(dma_addr_t dma_addr)
-{
-	return dma_mapping_error(dma_addr);
-}
-
 #endif /* _ASM_VIO_H */
--- diff/include/asm-s390/irq.h	2003-08-20 14:16:14.000000000 +0100
+++ source/include/asm-s390/irq.h	2004-04-21 10:45:35.909244464 +0100
@@ -21,6 +21,10 @@ enum interruption_class {
 
 #define touch_nmi_watchdog() do { } while(0)
 
+struct irqaction;
+struct pt_regs;
+int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
+
 #endif /* __KERNEL__ */
 #endif
 
--- diff/include/asm-s390/pgalloc.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-s390/pgalloc.h	2004-04-21 10:45:35.909244464 +0100
@@ -139,7 +139,10 @@ pte_alloc_one_kernel(struct mm_struct *m
 static inline struct page *
 pte_alloc_one(struct mm_struct *mm, unsigned long vmaddr)
 {
-	return virt_to_page(pte_alloc_one_kernel(mm, vmaddr));
+	pte_t *pte = pte_alloc_one_kernel(mm, vmaddr);
+	if (pte)
+		return virt_to_page(pte);
+	return 0;
 }
 
 static inline void pte_free_kernel(pte_t *pte)
--- diff/include/asm-s390/spinlock.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-s390/spinlock.h	2004-04-21 10:45:35.910244312 +0100
@@ -70,11 +70,9 @@ extern inline void _raw_spin_lock(spinlo
 
 extern inline int _raw_spin_trylock(spinlock_t *lp)
 {
-#ifndef __s390x__
-	unsigned long result, reg;
-#else /* __s390x__ */
-	unsigned int result, reg;
-#endif /* __s390x__ */
+	unsigned long reg;
+	unsigned int result;
+
 	__asm__ __volatile("    basr  %1,0\n"
 			   "0:  cs    %0,%1,0(%3)"
 			   : "=d" (result), "=&d" (reg), "=m" (lp->lock)
@@ -226,7 +224,7 @@ extern inline int _raw_write_trylock(rwl
 			     "0: csg %0,%1,0(%3)\n"
 #endif /* __s390x__ */
 			     : "=d" (result), "=&d" (reg), "=m" (rw->lock)
-			     : "a" (&rw->lock), "m" (rw->lock), "0" (0)
+			     : "a" (&rw->lock), "m" (rw->lock), "0" (0UL)
 			     : "cc", "memory" );
 	return result == 0;
 }
--- diff/include/asm-s390/thread_info.h	2003-06-30 10:07:24.000000000 +0100
+++ source/include/asm-s390/thread_info.h	2004-04-21 10:45:35.910244312 +0100
@@ -84,6 +84,7 @@ static inline struct thread_info *curren
 #define TIF_SIGPENDING		2	/* signal pending */
 #define TIF_NEED_RESCHED	3	/* rescheduling necessary */
 #define TIF_RESTART_SVC		4	/* restart svc with new svc number */
+#define TIF_SYSCALL_AUDIT	5	/* syscall auditing active */
 #define TIF_USEDFPU		16	/* FPU was used by this task this quantum (SMP) */
 #define TIF_POLLING_NRFLAG	17	/* true if poll_idle() is polling 
 					   TIF_NEED_RESCHED */
@@ -94,6 +95,7 @@ static inline struct thread_info *curren
 #define _TIF_SIGPENDING		(1<<TIF_SIGPENDING)
 #define _TIF_NEED_RESCHED	(1<<TIF_NEED_RESCHED)
 #define _TIF_RESTART_SVC	(1<<TIF_RESTART_SVC)
+#define _TIF_SYSCALL_AUDIT	(1<<TIF_SYSCALL_AUDIT)
 #define _TIF_USEDFPU		(1<<TIF_USEDFPU)
 #define _TIF_POLLING_NRFLAG	(1<<TIF_POLLING_NRFLAG)
 #define _TIF_31BIT		(1<<TIF_31BIT)
--- diff/include/asm-s390/unistd.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-s390/unistd.h	2004-04-21 10:45:35.911244160 +0100
@@ -233,9 +233,7 @@
 #define __NR_sched_setaffinity	239
 #define __NR_sched_getaffinity	240
 #define __NR_tgkill		241
-/*
- * Number 242 is reserved for tux
- */
+/* Number 242 is reserved for tux */
 #define __NR_io_setup		243
 #define __NR_io_destroy		244
 #define __NR_io_getevents	245
@@ -256,15 +254,22 @@
 #define __NR_clock_gettime	(__NR_timer_create+6)
 #define __NR_clock_getres	(__NR_timer_create+7)
 #define __NR_clock_nanosleep	(__NR_timer_create+8)
-
-/*
- * Number 263 is reserved for vserver
- */
+/* Number 263 is reserved for vserver */
 #define __NR_fadvise64_64	264
 #define __NR_statfs64		265
 #define __NR_fstatfs64		266
+/* Number 267 is reserved for new sys_remap_file_pages */
+/* Number 268 is reserved for new sys_mbind */
+/* Number 269 is reserved for new sys_get_mempolicy */
+/* Number 270 is reserved for new sys_set_mempolicy */
+#define __NR_mq_open		271
+#define __NR_mq_unlink		272
+#define __NR_mq_timedsend	273
+#define __NR_mq_timedreceive	274
+#define __NR_mq_notify		275
+#define __NR_mq_getsetattr	276
 
-#define NR_syscalls 267
+#define NR_syscalls 277
 
 /* 
  * There are some system calls that are not present on 64 bit, some
--- diff/include/asm-sh/hdreg.h	2002-10-16 04:27:48.000000000 +0100
+++ source/include/asm-sh/hdreg.h	2004-04-21 10:45:35.911244160 +0100
@@ -1,12 +1 @@
-/*
- *  linux/include/asm-sh/hdreg.h
- *
- *  Copyright (C) 1994-1996  Linus Torvalds & authors
- */
-
-#ifndef __ASM_SH_HDREG_H
-#define __ASM_SH_HDREG_H
-
-typedef unsigned long ide_ioreg_t;
-
-#endif /* __ASM_SH_HDREG_H */
+#include <asm-generic/hdreg.h>
--- diff/include/asm-sh/ide.h	2003-07-08 09:55:19.000000000 +0100
+++ source/include/asm-sh/ide.h	2004-04-21 10:45:35.912244008 +0100
@@ -22,7 +22,7 @@
 #define MAX_HWIFS	2
 #endif
 
-static __inline__ int ide_default_irq_hp600(ide_ioreg_t base)
+static inline int ide_default_irq_hp600(unsigned long base)
 {
 	switch (base) {
 		case 0x01f0: return 93;
@@ -32,7 +32,7 @@ static __inline__ int ide_default_irq_hp
 	}
 }
 
-static __inline__ int ide_default_irq(ide_ioreg_t base)
+static inline int ide_default_irq(unsigned long base)
 {
 	if (MACH_HP600) {
 		return ide_default_irq_hp600(base);
@@ -45,7 +45,7 @@ static __inline__ int ide_default_irq(id
 	}
 }
 
-static __inline__ ide_ioreg_t ide_default_io_base_hp600(int index)
+static inline unsigned long ide_default_io_base_hp600(int index)
 {
 	switch (index) {
 		case 0:	
@@ -57,7 +57,7 @@ static __inline__ ide_ioreg_t ide_defaul
 	}
 }
 
-static __inline__ ide_ioreg_t ide_default_io_base(int index)
+static inline unsigned long ide_default_io_base(int index)
 {
 	if (MACH_HP600) {
 		return ide_default_io_base_hp600(index);
@@ -72,39 +72,11 @@ static __inline__ ide_ioreg_t ide_defaul
 	}
 }
 
-static __inline__ void ide_init_hwif_ports(hw_regs_t *hw, ide_ioreg_t data_port, ide_ioreg_t ctrl_port, int *irq)
-{
-	ide_ioreg_t reg = data_port;
-	int i;
-
-	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
-		hw->io_ports[i] = reg;
-		reg += 1;
-	}
-	if (ctrl_port) {
-		hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
-	} else {
-		hw->io_ports[IDE_CONTROL_OFFSET] = hw->io_ports[IDE_DATA_OFFSET] + 0x206;
-	}
-	if (irq != NULL)
-		*irq = 0;
-	hw->io_ports[IDE_IRQ_OFFSET] = 0;
-}
-
-static __inline__ void ide_init_default_hwifs(void)
-{
-#ifndef CONFIG_PCI
-	hw_regs_t hw;
-	int index;
-
-	for(index = 0; index < MAX_HWIFS; index++) {
-		memset(&hw, 0, sizeof hw);
-		ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL);
-		hw.irq = ide_default_irq(ide_default_io_base(index));
-		ide_register_hw(&hw, NULL);
-	}
-#endif /* CONFIG_PCI */
-}
+#ifdef CONFIG_PCI
+#define ide_init_default_irq(base)	(0)
+#else
+#define ide_init_default_irq(base)	ide_default_irq(base)
+#endif
 
 #include <asm-generic/ide_iops.h>
 
--- diff/include/asm-sh/irq.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-sh/irq.h	2004-04-21 10:45:35.912244008 +0100
@@ -329,4 +329,8 @@ static inline int generic_irq_demux(int 
 #define irq_canonicalize(irq)	(irq)
 #define irq_demux(irq)		__irq_demux(sh_mv.mv_irq_demux(irq))
 
+struct irqaction;
+struct pt_regs;
+int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
+
 #endif /* __ASM_SH_IRQ_H */
--- diff/include/asm-sh/pgalloc.h	2004-02-09 10:36:12.000000000 +0000
+++ source/include/asm-sh/pgalloc.h	2004-04-21 10:45:35.912244008 +0100
@@ -97,12 +97,11 @@ static inline pte_t ptep_get_and_clear(p
 
 	pte_clear(ptep);
 	if (!pte_not_present(pte)) {
-		struct page *page;
 		unsigned long pfn = pte_pfn(pte);
 		if (pfn_valid(pfn)) {
-			page = pfn_to_page(pfn);
-			if (!page->mapping
-			    || list_empty(&page->mapping->i_mmap_shared))
+			struct page *page = pfn_to_page(pfn);
+			struct address_space *mapping = page_mapping(page);
+			if (!mapping || !mapping_writably_mapped(mapping))
 				__clear_bit(PG_mapped, &page->flags);
 		}
 	}
--- diff/include/asm-sparc/hdreg.h	2002-10-16 04:28:33.000000000 +0100
+++ source/include/asm-sparc/hdreg.h	2004-04-21 10:45:35.913243856 +0100
@@ -1,13 +1 @@
-/* $Id: hdreg.h,v 1.2 2000/12/05 00:56:36 anton Exp $
- * hdreg.h: SPARC PCI specific IDE glue.
- *
- * Copyright (C) 1997  David S. Miller (davem@caip.rutgers.edu)
- * Copyright (C) 1998  Eddie C. Dost   (ecd@skynet.be)
- */
-
-#ifndef __SPARC_HDREG_H
-#define __SPARC_HDREG_H
-
-typedef unsigned long ide_ioreg_t;
-
-#endif /* __SPARC_HDREG_H */
+#include <asm-generic/hdreg.h>
--- diff/include/asm-sparc/ide.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-sparc/ide.h	2004-04-21 10:45:35.913243856 +0100
@@ -14,7 +14,6 @@
 #include <linux/config.h>
 #include <asm/pgtable.h>
 #include <asm/io.h>
-#include <asm/hdreg.h>
 #include <asm/psr.h>
 
 #undef  MAX_HWIFS
@@ -30,31 +29,7 @@ static __inline__ unsigned long ide_defa
 	return 0;
 }
 
-/*
- * Doing any sort of ioremap() here does not work
- * because this function may be called with null aguments.
- */
-static __inline__ void ide_init_hwif_ports(hw_regs_t *hw, unsigned long data_port, unsigned long ctrl_port, int *irq)
-{
-	unsigned long reg = data_port;
-	int i;
-
-	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
-		hw->io_ports[i] = reg;
-		reg += 1;
-	}
-	if (ctrl_port) {
-		hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
-	} else {
-		hw->io_ports[IDE_CONTROL_OFFSET] = hw->io_ports[IDE_DATA_OFFSET] + 0x206;
-	}
-	if (irq != NULL)
-		*irq = 0;
-	hw->io_ports[IDE_IRQ_OFFSET] = 0;
-}
-
-/* There are no standard ports. */
-static inline void ide_init_default_hwifs(void)	{ ; }
+#define ide_init_default_irq(base)	(0)
 
 #define __ide_insl(data_reg, buffer, wcount) \
 	__ide_insw(data_reg, buffer, (wcount)<<1)
--- diff/include/asm-sparc/irq.h	2003-10-27 09:20:39.000000000 +0000
+++ source/include/asm-sparc/irq.h	2004-04-21 10:45:35.913243856 +0100
@@ -184,4 +184,8 @@ extern struct sun4m_intregs *sun4m_inter
 #define SUN4M_INT_SBUS(x)	(1 << (x+7))
 #define SUN4M_INT_VME(x)	(1 << (x))
 
+struct irqaction;
+struct pt_regs;
+int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
+
 #endif
--- diff/include/asm-sparc/unistd.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-sparc/unistd.h	2004-04-21 10:45:35.914243704 +0100
@@ -289,10 +289,17 @@
 #define __NR_io_submit		270
 #define __NR_io_cancel		271
 #define __NR_io_getevents	272
-/* WARNING: You MAY NOT add syscall numbers larger than 272, since
+#define __NR_mq_open		273
+#define __NR_mq_unlink		(__NR_mq_open+1)
+#define __NR_mq_timedsend	(__NR_mq_open+2)
+#define __NR_mq_timedreceive	(__NR_mq_open+3)
+#define __NR_mq_notify		(__NR_mq_open+4)
+#define __NR_mq_getsetattr	(__NR_mq_open+5)
+
+/* WARNING: You MAY NOT add syscall numbers larger than 282, since
  *          all of the syscall tables in the Sparc kernel are
- *          sized to have 273 entries (starting at zero).  Therefore
- *          find a free slot in the 0-272 range.
+ *          sized to have 283 entries (starting at zero).  Therefore
+ *          find a free slot in the 0-282 range.
  */
 
 #define _syscall0(type,name) \
--- diff/include/asm-sparc64/hdreg.h	2002-10-16 04:28:20.000000000 +0100
+++ source/include/asm-sparc64/hdreg.h	2004-04-21 10:45:35.914243704 +0100
@@ -1,13 +1 @@
-/* $Id: hdreg.h,v 1.1 1999/05/14 07:23:13 davem Exp $
- * hdreg.h: Ultra/PCI specific IDE glue.
- *
- * Copyright (C) 1997  David S. Miller (davem@caip.rutgers.edu)
- * Copyright (C) 1998  Eddie C. Dost   (ecd@skynet.be)
- */
-
-#ifndef __SPARC64_HDREG_H
-#define __SPARC64_HDREG_H
-
-typedef unsigned long ide_ioreg_t;
-
-#endif /* __SPARC64_HDREG_H */
+#include <asm-generic/hdreg.h>
--- diff/include/asm-sparc64/ide.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-sparc64/ide.h	2004-04-21 10:45:35.914243704 +0100
@@ -13,7 +13,6 @@
 #include <linux/config.h>
 #include <asm/pgalloc.h>
 #include <asm/io.h>
-#include <asm/hdreg.h>
 #include <asm/page.h>
 #include <asm/spitfire.h>
 
@@ -35,27 +34,7 @@ static __inline__ unsigned long ide_defa
 	return 0;
 }
 
-static __inline__ void ide_init_hwif_ports(hw_regs_t *hw, unsigned long data_port, unsigned long ctrl_port, int *irq)
-{
-	unsigned long reg = data_port;
-	int i;
-
-	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
-		hw->io_ports[i] = reg;
-		reg += 1;
-	}
-	if (ctrl_port) {
-		hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
-	} else {
-		hw->io_ports[IDE_CONTROL_OFFSET] = hw->io_ports[IDE_DATA_OFFSET] + 0x206;
-	}
-	if (irq != NULL)
-		*irq = 0;
-	hw->io_ports[IDE_IRQ_OFFSET] = 0;
-}
-
-/* There are no standard ports. */
-static inline void ide_init_default_hwifs(void)	{ ; }
+#define ide_init_default_irq(base)	(0)
 
 #define __ide_insl(data_reg, buffer, wcount) \
 	__ide_insw(data_reg, buffer, (wcount)<<1)
--- diff/include/asm-sparc64/irq.h	2003-08-26 10:00:54.000000000 +0100
+++ source/include/asm-sparc64/irq.h	2004-04-21 10:45:35.915243552 +0100
@@ -150,4 +150,8 @@ static __inline__ unsigned long get_soft
 	return retval;
 }
 
+struct irqaction;
+struct pt_regs;
+int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
+
 #endif
--- diff/include/asm-sparc64/pgalloc.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-sparc64/pgalloc.h	2004-04-21 10:45:35.915243552 +0100
@@ -189,7 +189,15 @@ static __inline__ void free_pmd_slow(pmd
 	pmd_populate_kernel(MM,PMD,page_address(PTE_PAGE))
 
 extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address);
-#define pte_alloc_one(MM,ADDR)	virt_to_page(pte_alloc_one_kernel(MM,ADDR))
+
+static inline struct page *
+pte_alloc_one(struct mm_struct *mm, unsigned long addr)
+{
+	pte_t *pte = pte_alloc_one_kernel(mm, addr);
+	if (pte)
+		return virt_to_page(pte);
+	return 0;
+}
 
 static __inline__ pte_t *pte_alloc_one_fast(struct mm_struct *mm, unsigned long address)
 {
--- diff/include/asm-sparc64/system.h	2003-02-26 16:00:55.000000000 +0000
+++ source/include/asm-sparc64/system.h	2004-04-21 10:45:35.916243400 +0100
@@ -205,8 +205,10 @@ do {	if (test_thread_flag(TIF_PERFCTR)) 
 	"ldx	[%%g6 + %7], %%g4\n\t"					\
 	"wrpr	%%g0, 0x96, %%pstate\n\t"				\
 	"andcc	%%o7, %6, %%g0\n\t"					\
-	"bne,pn	%%icc, ret_from_syscall\n\t"				\
+	"beq,pt %%icc, 1f\n\t"						\
 	" mov	%%g5, %0\n\t"						\
+	"b,a ret_from_syscall\n\t"					\
+	"1:\n\t"							\
 	: "=&r" (last)							\
 	: "0" (next->thread_info),					\
 	  "i" (TI_WSTATE), "i" (TI_KSP), "i" (TI_FLAGS), "i" (TI_CWP),	\
--- diff/include/asm-sparc64/unistd.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-sparc64/unistd.h	2004-04-21 10:45:35.916243400 +0100
@@ -291,10 +291,16 @@
 #define __NR_io_submit		270
 #define __NR_io_cancel		271
 #define __NR_io_getevents	272
-/* WARNING: You MAY NOT add syscall numbers larger than 272, since
+#define __NR_mq_open		273
+#define __NR_mq_unlink		(__NR_mq_open+1)
+#define __NR_mq_timedsend	(__NR_mq_open+2)
+#define __NR_mq_timedreceive	(__NR_mq_open+3)
+#define __NR_mq_notify		(__NR_mq_open+4)
+#define __NR_mq_getsetattr	(__NR_mq_open+5)
+/* WARNING: You MAY NOT add syscall numbers larger than 282, since
  *          all of the syscall tables in the Sparc kernel are
- *          sized to have 273 entries (starting at zero).  Therefore
- *          find a free slot in the 0-272 range.
+ *          sized to have 283 entries (starting at zero).  Therefore
+ *          find a free slot in the 0-282 range.
  */
 
 #define _syscall0(type,name) \
--- diff/include/asm-um/irq.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/asm-um/irq.h	2004-04-21 10:45:35.916243400 +0100
@@ -32,4 +32,9 @@ extern int um_request_irq(unsigned int i
 			  void (*handler)(int, void *, struct pt_regs *),
 			  unsigned long irqflags,  const char * devname,
 			  void *dev_id);
+
+struct irqaction;
+struct pt_regs;
+int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
+
 #endif
--- diff/include/asm-v850/bitops.h	2003-06-30 10:07:24.000000000 +0100
+++ source/include/asm-v850/bitops.h	2004-04-21 10:45:35.917243248 +0100
@@ -1,8 +1,8 @@
 /*
  * include/asm-v850/bitops.h -- Bit operations
  *
- *  Copyright (C) 2001,02,03  NEC Electronics Corporation
- *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
+ *  Copyright (C) 2001,02,03,04  NEC Electronics Corporation
+ *  Copyright (C) 2001,02,03,04  Miles Bader <miles@gnu.org>
  *  Copyright (C) 1992  Linus Torvalds.
  *
  * This file is subject to the terms and conditions of the GNU General
@@ -84,24 +84,26 @@ extern __inline__ unsigned long ffz (uns
 #define change_bit __change_bit
 
 
-#define __const_tns_bit_op(op, nr, addr)				\
-  ({ int __tns_res;							\
-     __asm__ ("tst1 (%1 - 0x123), %2; setf nz, %0; " op " (%1 - 0x123), %2" \
-	      : "=&r" (__tns_res)					\
-	      : "g" (((nr) & 0x7) + 0x123),				\
-		"m" (*((char *)(addr) + ((nr) >> 3)))			\
-	      : "memory");						\
-     __tns_res;							\
+#define __const_tns_bit_op(op, nr, addr)				      \
+  ({ int __tns_res;							      \
+     __asm__ __volatile__ (						      \
+	     "tst1 (%1 - 0x123), %2; setf nz, %0; " op " (%1 - 0x123), %2"    \
+	     : "=&r" (__tns_res)					      \
+	     : "g" (((nr) & 0x7) + 0x123),				      \
+	       "m" (*((char *)(addr) + ((nr) >> 3)))			      \
+	     : "memory");						      \
+     __tns_res;								      \
   })
-#define __var_tns_bit_op(op, nr, addr)					\
-  ({ int __nr = (nr);							\
-     int __tns_res;							\
-     __asm__ ("tst1 %1, [%2]; setf nz, %0; " op " %1, [%2]"		\
-	      : "=&r" (__tns_res)					\
-	      : "r" (__nr & 0x7),					\
-		"r" ((char *)(addr) + (__nr >> 3))			\
-	      : "memory");						\
-     __tns_res;							\
+#define __var_tns_bit_op(op, nr, addr)					      \
+  ({ int __nr = (nr);							      \
+     int __tns_res;							      \
+     __asm__ __volatile__ (						      \
+	     "tst1 %1, [%2]; setf nz, %0; " op " %1, [%2]"		      \
+	      : "=&r" (__tns_res)					      \
+	      : "r" (__nr & 0x7),					      \
+		"r" ((char *)(addr) + (__nr >> 3))			      \
+	      : "memory");						      \
+     __tns_res;								      \
   })
 #define __tns_bit_op(op, nr, addr)					\
   ((__builtin_constant_p (nr) && (unsigned)(nr) <= 0x7FFFF)		\
--- diff/include/asm-v850/dma-mapping.h	2002-12-30 10:17:13.000000000 +0000
+++ source/include/asm-v850/dma-mapping.h	2004-04-21 10:45:35.917243248 +0100
@@ -1 +1,12 @@
+#ifndef __V850_DMA_MAPPING_H__
+#define __V850_DMA_MAPPING_H__
+
+#include <linux/config.h>
+
+#ifdef CONFIG_PCI
 #include <asm-generic/dma-mapping.h>
+#else
+#include <asm-generic/dma-mapping-broken.h>
+#endif
+
+#endif /* __V850_DMA_MAPPING_H__ */
--- diff/include/asm-v850/irq.h	2003-05-21 11:50:16.000000000 +0100
+++ source/include/asm-v850/irq.h	2004-04-21 10:45:35.917243248 +0100
@@ -65,4 +65,8 @@ extern void disable_irq_nosync (unsigned
 
 #endif /* !__ASSEMBLY__ */
 
+struct irqaction;
+struct pt_regs;
+int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
+
 #endif /* __V850_IRQ_H__ */
--- diff/include/asm-v850/rte_me2_cb.h	2003-08-20 14:16:15.000000000 +0100
+++ source/include/asm-v850/rte_me2_cb.h	2004-04-21 10:45:35.918243096 +0100
@@ -147,7 +147,7 @@ extern void cb_pic_init_irqs (void);
 #define CB_UART_REG_GAP 	0x10
 #define CB_UART_CLOCK   	0x16000000
 
-/* CompactFlash setting see also asm/ide.h, asm/hdreg.h.  */
+/* CompactFlash setting */
 #define CB_CF_BASE     		0x0FE0C000
 #define CB_CF_CCR_ADDR 		(CB_CF_BASE+0x200)
 #define CB_CF_CCR      		(*(volatile u8 *)CB_CF_CCR_ADDR)
--- diff/include/asm-x86_64/apicdef.h	2003-06-30 10:07:24.000000000 +0100
+++ source/include/asm-x86_64/apicdef.h	2004-04-21 10:45:35.918243096 +0100
@@ -370,4 +370,6 @@ struct local_apic {
 
 #undef u32
 
+#define BAD_APICID 0xFFu
+
 #endif
--- diff/include/asm-x86_64/bitops.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-x86_64/bitops.h	2004-04-21 10:45:35.918243096 +0100
@@ -204,7 +204,7 @@ static __inline__ int __test_and_change_
 }
 
 /**
- * test_and_change_bit - Change a bit and return its new value
+ * test_and_change_bit - Change a bit and return its old value
  * @nr: Bit to change
  * @addr: Address to count from
  *
--- diff/include/asm-x86_64/bootsetup.h	2003-06-30 10:07:24.000000000 +0100
+++ source/include/asm-x86_64/bootsetup.h	2004-04-21 10:45:35.919242944 +0100
@@ -26,6 +26,9 @@ extern char x86_boot_params[2048];
 #define INITRD_START (*(unsigned int *) (PARAM+0x218))
 #define INITRD_SIZE (*(unsigned int *) (PARAM+0x21c))
 #define EDID_INFO (*(struct edid_info *) (PARAM+0x440))
+#define DISK80_SIGNATURE (*(unsigned int*) (PARAM+DISK80_SIG_BUFFER))
+#define EDD_NR     (*(unsigned char *) (PARAM+EDDNR))
+#define EDD_BUF     ((struct edd_info *) (PARAM+EDDBUF))
 #define COMMAND_LINE saved_command_line
 #define COMMAND_LINE_SIZE 256
 
--- diff/include/asm-x86_64/hdreg.h	2003-05-21 11:50:00.000000000 +0100
+++ source/include/asm-x86_64/hdreg.h	2004-04-21 10:45:35.919242944 +0100
@@ -1,10 +1 @@
-/*
- *  linux/include/asm-x86_64/hdreg.h
- *
- *  Copyright (C) 1994-1996  Linus Torvalds & authors
- */
-
-#ifndef __ASMx86_64_HDREG_H
-#define __ASMx86_64_HDREG_H
-
-#endif /* __ASMx86_64_HDREG_H */
+#warning this file is obsolete, please do not use it
--- diff/include/asm-x86_64/ia32_unistd.h	2003-09-17 12:28:12.000000000 +0100
+++ source/include/asm-x86_64/ia32_unistd.h	2004-04-21 10:45:35.919242944 +0100
@@ -278,7 +278,17 @@
 #define __NR_ia32_tgkill		270
 #define __NR_ia32_utimes		271
 #define __NR_ia32_fadvise64_64		272
+#define __NR_ia32_vserver		273
+#define __NR_ia32_mbind		274
+#define __NR_ia32_get_mempolicy	275
+#define __NR_ia32_set_mempolicy	276
+#define __NR_ia32_mq_open 		277
+#define __NR_ia32_mq_unlink		(__NR_ia32_mq_open+1)
+#define __NR_ia32_mq_timedsend	(__NR_ia32_mq_open+2)
+#define __NR_ia32_mq_timedreceive	(__NR_ia32_mq_open+3)
+#define __NR_ia32_mq_notify		(__NR_ia32_mq_open+4)
+#define __NR_ia32_mq_getsetattr	(__NR_ia32_mq_open+5)
 
-#define IA32_NR_syscalls 275	/* must be > than biggest syscall! */	
+#define IA32_NR_syscalls 285	/* must be > than biggest syscall! */
 
 #endif /* _ASM_X86_64_IA32_UNISTD_H_ */
--- diff/include/asm-x86_64/ide.h	2003-02-26 16:01:09.000000000 +0000
+++ source/include/asm-x86_64/ide.h	2004-04-21 10:45:35.920242792 +0100
@@ -51,40 +51,11 @@ static __inline__ unsigned long ide_defa
 	}
 }
 
-static __inline__ void ide_init_hwif_ports(hw_regs_t *hw, unsigned long data_port,
-	 unsigned long ctrl_port, int *irq)
-{
-	unsigned long reg = data_port;
-	int i;
-
-	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
-		hw->io_ports[i] = reg;
-		reg += 1;
-	}
-	if (ctrl_port) {
-		hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
-	} else {
-		hw->io_ports[IDE_CONTROL_OFFSET] = hw->io_ports[IDE_DATA_OFFSET] + 0x206;
-	}
-	if (irq != NULL)
-		*irq = 0;
-	hw->io_ports[IDE_IRQ_OFFSET] = 0;
-}
-
-static __inline__ void ide_init_default_hwifs(void)
-{
-#ifndef CONFIG_BLK_DEV_IDEPCI
-	hw_regs_t hw;
-	int index;
-
-	for(index = 0; index < MAX_HWIFS; index++) {
-		memset(&hw, 0, sizeof hw);
-		ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL);
-		hw.irq = ide_default_irq(ide_default_io_base(index));
-		ide_register_hw(&hw, NULL);
-	}
-#endif /* CONFIG_BLK_DEV_IDEPCI */
-}
+#ifdef CONFIG_BLK_DEV_IDEPCI
+#define ide_init_default_irq(base)	(0)
+#else
+#define ide_init_default_irq(base)	ide_default_irq(base)
+#endif
 
 #include <asm-generic/ide_iops.h>
 
--- diff/include/asm-x86_64/irq.h	2004-01-19 10:22:59.000000000 +0000
+++ source/include/asm-x86_64/irq.h	2004-04-21 10:45:35.920242792 +0100
@@ -53,4 +53,8 @@ extern int can_request_irq(unsigned int,
 #define ARCH_HAS_NMI_WATCHDOG		/* See include/linux/nmi.h */
 #endif
 
+struct irqaction;
+struct pt_regs;
+int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
+
 #endif /* _ASM_IRQ_H */
--- diff/include/asm-x86_64/mpspec.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-x86_64/mpspec.h	2004-04-21 10:45:35.920242792 +0100
@@ -211,7 +211,7 @@ typedef struct physid_mask physid_mask_t
 
 #define physids_and(dst, src1, src2)		bitmap_and((dst).mask, (src1).mask, (src2).mask, MAX_APICS)
 #define physids_or(dst, src1, src2)		bitmap_or((dst).mask, (src1).mask, (src2).mask, MAX_APICS)
-#define physids_clear(map)			bitmap_clear((map).mask, MAX_APICS)
+#define physids_clear(map)			bitmap_zero((map).mask, MAX_APICS)
 #define physids_complement(map)			bitmap_complement((map).mask, MAX_APICS)
 #define physids_empty(map)			bitmap_empty((map).mask, MAX_APICS)
 #define physids_equal(map1, map2)		bitmap_equal((map1).mask, (map2).mask, MAX_APICS)
--- diff/include/asm-x86_64/numa.h	2003-05-21 11:50:00.000000000 +0100
+++ source/include/asm-x86_64/numa.h	2004-04-21 10:45:35.921242640 +0100
@@ -9,12 +9,13 @@ struct node { 
 };
 
 #define for_all_nodes(x) for ((x) = 0; (x) < numnodes; (x)++) \
-				if ((1UL << (x)) & nodes_present)
-
+				if (node_online(x))
 
 extern int compute_hash_shift(struct node *nodes);
-extern unsigned long nodes_present;
 
 #define ZONE_ALIGN (1UL << (MAX_ORDER+PAGE_SHIFT))
 
+extern void numa_add_cpu(int cpu);
+extern void numa_init_array(void);
+
 #endif
--- diff/include/asm-x86_64/pci.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-x86_64/pci.h	2004-04-21 10:45:35.922242488 +0100
@@ -357,8 +357,9 @@ static inline void pcibios_add_platform_
 #endif /* __KERNEL__ */
 
 /* generic pci stuff */
+#ifdef CONFIG_PCI
 #include <asm-generic/pci.h>
-
 #include <linux/dma-mapping.h>
+#endif
 
 #endif /* __x8664_PCI_H */
--- diff/include/asm-x86_64/processor.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-x86_64/processor.h	2004-04-21 10:45:35.922242488 +0100
@@ -59,6 +59,7 @@ struct cpuinfo_x86 {
 	char	x86_model_id[64];
 	int 	x86_cache_size;  /* in KB */
 	int	x86_clflush_size;
+	int	x86_cache_alignment;
 	int	x86_tlbsize;	/* number of 4K pages in DTLB/ITLB combined(in pages)*/
         __u8    x86_virt_bits, x86_phys_bits;
         __u32   x86_power; 	
@@ -453,6 +454,6 @@ static inline void __mwait(unsigned long
 	ti->task;					\
 })
 
-#define cache_line_size() (boot_cpu_data.x86_clflush_size)
+#define cache_line_size() (boot_cpu_data.x86_cache_alignment)
 
 #endif /* __ASM_X86_64_PROCESSOR_H */
--- diff/include/asm-x86_64/proto.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-x86_64/proto.h	2004-04-21 10:45:35.922242488 +0100
@@ -42,7 +42,7 @@ extern void early_identify_cpu(struct cp
 
 extern int k8_scan_nodes(unsigned long start, unsigned long end);
 
-extern int numa_initmem_init(unsigned long start_pfn, unsigned long end_pfn);
+extern void numa_initmem_init(unsigned long start_pfn, unsigned long end_pfn);
 extern unsigned long numa_free_all_bootmem(void);
 
 extern void reserve_bootmem_generic(unsigned long phys, unsigned len);
@@ -101,6 +101,8 @@ extern int acpi_disabled;
 extern int fallback_aper_order;
 extern int fallback_aper_force;
 extern int iommu_aperture;
+extern int iommu_aperture_disabled;
+extern int iommu_aperture_allowed;
 
 extern void smp_local_timer_interrupt(struct pt_regs * regs);
 
--- diff/include/asm-x86_64/smp.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-x86_64/smp.h	2004-04-21 10:45:35.923242336 +0100
@@ -80,10 +80,30 @@ extern __inline int hard_smp_processor_i
  * the real APIC ID <-> CPU # mapping.
  * AK: why is this volatile?
  */
-extern volatile char x86_apicid_to_cpu[NR_CPUS];
 extern volatile char x86_cpu_to_apicid[NR_CPUS];
 
-#define safe_smp_processor_id() (disable_apic ? 0 : x86_apicid_to_cpu[hard_smp_processor_id()])
+static inline char x86_apicid_to_cpu(char apicid)
+{
+	int i;
+
+	for (i = 0; i < NR_CPUS; ++i)
+		if (x86_cpu_to_apicid[i] == apicid)
+			return i;
+
+	return -1;
+}
+
+#define safe_smp_processor_id() (disable_apic ? 0 : x86_apicid_to_cpu(hard_smp_processor_id()))
+
+extern u8 bios_cpu_apicid[];
+
+static inline int cpu_present_to_apicid(int mps_cpu)
+{
+	if (mps_cpu < NR_CPUS)
+		return (int)bios_cpu_apicid[mps_cpu];
+	else
+		return BAD_APICID;
+}
 
 #define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
 #endif /* !ASSEMBLY */
--- diff/include/asm-x86_64/thread_info.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-x86_64/thread_info.h	2004-04-21 10:45:35.923242336 +0100
@@ -101,6 +101,7 @@ static inline struct thread_info *stack_
 #define TIF_NEED_RESCHED	3	/* rescheduling necessary */
 #define TIF_SINGLESTEP		4	/* reenable singlestep on user return*/
 #define TIF_IRET		5	/* force IRET */
+#define TIF_SYSCALL_AUDIT	7	/* syscall auditing active */
 #define TIF_POLLING_NRFLAG	16	/* true if poll_idle() is polling TIF_NEED_RESCHED */
 #define TIF_IA32		17	/* 32bit process */ 
 #define TIF_FORK		18	/* ret_from_fork */
@@ -112,13 +113,15 @@ static inline struct thread_info *stack_
 #define _TIF_SINGLESTEP		(1<<TIF_SINGLESTEP)
 #define _TIF_NEED_RESCHED	(1<<TIF_NEED_RESCHED)
 #define _TIF_IRET		(1<<TIF_IRET)
+#define _TIF_SYSCALL_AUDIT	(1<<TIF_SYSCALL_AUDIT)
 #define _TIF_POLLING_NRFLAG	(1<<TIF_POLLING_NRFLAG)
 #define _TIF_IA32		(1<<TIF_IA32)
 #define _TIF_FORK		(1<<TIF_FORK)
 #define _TIF_ABI_PENDING	(1<<TIF_ABI_PENDING)
 
 /* work to do on interrupt/exception return */
-#define _TIF_WORK_MASK    (0x0000FFFF & ~(_TIF_SYSCALL_TRACE|_TIF_SINGLESTEP))
+#define _TIF_WORK_MASK \
+  (0x0000FFFF & ~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP))
 /* work to do on any return to user space */
 #define _TIF_ALLWORK_MASK 0x0000FFFF	
 
--- diff/include/asm-x86_64/topology.h	2004-02-18 08:54:13.000000000 +0000
+++ source/include/asm-x86_64/topology.h	2004-04-21 10:45:35.923242336 +0100
@@ -6,18 +6,19 @@
 #ifdef CONFIG_DISCONTIGMEM
 
 #include <asm/mpspec.h>
+#include <asm/bitops.h>
 
 /* Map the K8 CPU local memory controllers to a simple 1:1 CPU:NODE topology */
 
-extern int fake_node;
-/* This is actually a cpumask_t, but doesn't matter because we don't have
-   >BITS_PER_LONG CPUs */
-extern unsigned long cpu_online_map;
+extern cpumask_t cpu_online_map;
 
-#define cpu_to_node(cpu)		(fake_node ? 0 : (cpu))
+extern unsigned char cpu_to_node[];
+extern cpumask_t     node_to_cpumask[];
+
+#define cpu_to_node(cpu)		(cpu_to_node[cpu])
 #define parent_node(node)		(node)
-#define node_to_first_cpu(node) 	(fake_node ? 0 : (node))
-#define node_to_cpumask(node)	(fake_node ? cpu_online_map : (1UL << (node)))
+#define node_to_first_cpu(node) 	(__ffs(node_to_cpumask[node]))
+#define node_to_cpumask(node)		(node_to_cpumask[node])
 
 static inline unsigned long pcibus_to_cpumask(int bus)
 {
--- diff/include/asm-x86_64/types.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/asm-x86_64/types.h	2004-04-21 10:45:35.924242184 +0100
@@ -33,8 +33,6 @@ typedef unsigned long long  __u64;
 
 #ifndef __ASSEMBLY__
 
-#include <linux/config.h>
-
 typedef signed char s8;
 typedef unsigned char u8;
 
@@ -50,10 +48,8 @@ typedef unsigned long long u64;
 typedef u64 dma64_addr_t;
 typedef u64 dma_addr_t;
 
-#ifdef CONFIG_LBD
 typedef u64 sector_t;
 #define HAVE_SECTOR_T
-#endif
 
 #endif /* __ASSEMBLY__ */
 
--- diff/include/asm-x86_64/unistd.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-x86_64/unistd.h	2004-04-21 10:45:35.924242184 +0100
@@ -532,10 +532,28 @@ __SYSCALL(__NR_tgkill, sys_tgkill)
 __SYSCALL(__NR_utimes, sys_utimes)
 #define __NR_vserver		236
 __SYSCALL(__NR_vserver, sys_ni_syscall)
+#define __NR_vserver		236
+__SYSCALL(__NR_vserver, sys_ni_syscall)
+#define __NR_mbind 			237
+__SYSCALL(__NR_mbind, sys_ni_syscall)
+#define __NR_set_mempolicy 	238
+__SYSCALL(__NR_set_mempolicy, sys_ni_syscall)
+#define __NR_get_mempolicy 	239
+__SYSCALL(__NR_get_mempolicy, sys_ni_syscall)
+#define __NR_mq_open 		240
+__SYSCALL(__NR_mq_open, sys_mq_open)
+#define __NR_mq_unlink 		241
+__SYSCALL(__NR_mq_unlink, sys_mq_unlink)
+#define __NR_mq_timedsend 	242
+__SYSCALL(__NR_mq_timedsend, sys_mq_timedsend)
+#define __NR_mq_timedreceive 243
+__SYSCALL(__NR_mq_timedreceive, sys_mq_timedreceive)
+#define __NR_mq_notify 		244
+__SYSCALL(__NR_mq_notify, sys_mq_notify)
+#define __NR_mq_getsetattr 	245
+__SYSCALL(__NR_mq_getsetattr, sys_mq_getsetattr)
 
-/* 237,238,239 reserved for NUMA API */
-
-#define __NR_syscall_max __NR_vserver
+#define __NR_syscall_max __NR_mq_getsetattr
 #ifndef __NO_STUBS
 
 /* user-visible error numbers are in the range -1 - -4095 */
--- diff/include/linux/ata.h	2004-02-18 08:54:13.000000000 +0000
+++ source/include/linux/ata.h	2004-04-21 10:45:35.925242032 +0100
@@ -102,16 +102,6 @@ enum {
 	ATA_REG_DEVSEL		= ATA_REG_DEVICE,
 	ATA_REG_IRQ		= ATA_REG_NSECT,
 
-	/* ATA taskfile protocols */
-	ATA_PROT_UNKNOWN	= 0,
-	ATA_PROT_NODATA		= 1,
-	ATA_PROT_PIO_READ	= 2,
-	ATA_PROT_PIO_WRITE	= 3,
-	ATA_PROT_DMA_READ	= 4,
-	ATA_PROT_DMA_WRITE	= 5,
-	ATA_PROT_ATAPI		= 6,
-	ATA_PROT_ATAPI_DMA	= 7,
-
 	/* ATA device commands */
 	ATA_CMD_EDD		= 0x90,	/* execute device diagnostic */
 	ATA_CMD_ID_ATA		= 0xEC,
@@ -156,14 +146,55 @@ enum {
 	SCR_CONTROL		= 2,
 	SCR_ACTIVE		= 3,
 	SCR_NOTIFICATION	= 4,
+
+	/* struct ata_taskfile flags */
+	ATA_TFLAG_LBA48		= (1 << 0), /* enable 48-bit LBA and "HOB" */
+	ATA_TFLAG_ISADDR	= (1 << 1), /* enable r/w to nsect/lba regs */
+	ATA_TFLAG_DEVICE	= (1 << 2), /* enable r/w to device reg */
+	ATA_TFLAG_WRITE		= (1 << 3), /* data dir: host->dev==1 (write) */
+};
+
+enum ata_tf_protocols {
+	/* ATA taskfile protocols */
+	ATA_PROT_UNKNOWN,	/* unknown/invalid */
+	ATA_PROT_NODATA,	/* no data */
+	ATA_PROT_PIO,		/* PIO single sector */
+	ATA_PROT_PIO_MULT,	/* PIO multiple sector */
+	ATA_PROT_DMA,		/* DMA */
+	ATA_PROT_ATAPI,		/* packet command */
+	ATA_PROT_ATAPI_DMA,	/* packet command with special DMA sauce */
 };
 
 /* core structures */
+
 struct ata_prd {
 	u32			addr;
 	u32			flags_len;
 } __attribute__((packed));
 
+struct ata_taskfile {
+	unsigned long		flags;		/* ATA_TFLAG_xxx */
+	u8			protocol;	/* ATA_PROT_xxx */
+
+	u8			ctl;		/* control reg */
+
+	u8			hob_feature;	/* additional data */
+	u8			hob_nsect;	/* to support LBA48 */
+	u8			hob_lbal;
+	u8			hob_lbam;
+	u8			hob_lbah;
+
+	u8			feature;
+	u8			nsect;
+	u8			lbal;
+	u8			lbam;
+	u8			lbah;
+
+	u8			device;
+
+	u8			command;	/* IO operation */
+};
+
 #define ata_id_is_ata(dev)	(((dev)->id[0] & (1 << 15)) == 0)
 #define ata_id_has_lba48(dev)	((dev)->id[83] & (1 << 10))
 #define ata_id_has_lba(dev)	((dev)->id[49] & (1 << 8))
--- diff/include/linux/atmdev.h	2004-02-18 08:54:13.000000000 +0000
+++ source/include/linux/atmdev.h	2004-04-21 10:45:35.925242032 +0100
@@ -399,9 +399,9 @@ void vcc_remove_socket(struct sock *sk);
  *
  */
 
-static inline int atm_guess_pdu2truesize(int pdu_size)
+static inline int atm_guess_pdu2truesize(int size)
 {
-	return ((pdu_size+15) & ~15) + sizeof(struct sk_buff);
+	return (SKB_DATA_ALIGN(size) + sizeof(struct skb_shared_info));
 }
 
 
--- diff/include/linux/backing-dev.h	2003-05-21 11:49:56.000000000 +0100
+++ source/include/linux/backing-dev.h	2004-04-21 10:45:35.926241880 +0100
@@ -20,26 +20,46 @@ enum bdi_state {
 	BDI_unused,		/* Available bits start here */
 };
 
+typedef int (congested_fn)(void *, int);
+
 struct backing_dev_info {
 	unsigned long ra_pages;	/* max readahead in PAGE_CACHE_SIZE units */
 	unsigned long state;	/* Always use atomic bitops on this */
 	int memory_backed;	/* Cannot clean pages with writepage */
+	congested_fn *congested_fn; /* Function pointer if device is md/dm */
+	void *congested_data;	/* Pointer to aux data for congested func */
+	void (*unplug_io_fn)(struct backing_dev_info *);
+	void *unplug_io_data;
 };
 
 extern struct backing_dev_info default_backing_dev_info;
+void default_unplug_io_fn(struct backing_dev_info *bdi);
 
 int writeback_acquire(struct backing_dev_info *bdi);
 int writeback_in_progress(struct backing_dev_info *bdi);
 void writeback_release(struct backing_dev_info *bdi);
 
+static inline int bdi_congested(struct backing_dev_info *bdi, int bdi_bits)
+{
+	if (bdi->congested_fn)
+		return bdi->congested_fn(bdi->congested_data, bdi_bits);
+	return (bdi->state & bdi_bits);
+}
+
 static inline int bdi_read_congested(struct backing_dev_info *bdi)
 {
-	return test_bit(BDI_read_congested, &bdi->state);
+	return bdi_congested(bdi, 1 << BDI_read_congested);
 }
 
 static inline int bdi_write_congested(struct backing_dev_info *bdi)
 {
-	return test_bit(BDI_write_congested, &bdi->state);
+	return bdi_congested(bdi, 1 << BDI_write_congested);
+}
+
+static inline int bdi_rw_congested(struct backing_dev_info *bdi)
+{
+	return bdi_congested(bdi, (1 << BDI_read_congested)|
+				  (1 << BDI_write_congested));
 }
 
 #endif		/* _LINUX_BACKING_DEV_H */
--- diff/include/linux/binfmts.h	2003-08-20 14:16:34.000000000 +0100
+++ source/include/linux/binfmts.h	2004-04-21 10:45:35.926241880 +0100
@@ -58,7 +58,13 @@ extern int prepare_binprm(struct linux_b
 extern void remove_arg_zero(struct linux_binprm *);
 extern int search_binary_handler(struct linux_binprm *,struct pt_regs *);
 extern int flush_old_exec(struct linux_binprm * bprm);
-extern int setup_arg_pages(struct linux_binprm * bprm);
+
+/* Stack area protections */
+#define EXSTACK_DEFAULT   0	/* Whatever the arch defaults to */
+#define EXSTACK_DISABLE_X 1	/* Disable executable stacks */
+#define EXSTACK_ENABLE_X  2	/* Enable executable stacks */
+
+extern int setup_arg_pages(struct linux_binprm * bprm, int executable_stack);
 extern int copy_strings(int argc,char __user * __user * argv,struct linux_binprm *bprm); 
 extern int copy_strings_kernel(int argc,char ** argv,struct linux_binprm *bprm);
 extern void compute_creds(struct linux_binprm *binprm);
--- diff/include/linux/bio.h	2004-02-18 08:54:13.000000000 +0000
+++ source/include/linux/bio.h	2004-04-21 10:45:35.927241728 +0100
@@ -119,11 +119,13 @@ struct bio {
  * bit 1 -- rw-ahead when set
  * bit 2 -- barrier
  * bit 3 -- fail fast, don't want low level driver retries
+ * bit 4 -- synchronous I/O hint: the block layer will unplug immediately
  */
 #define BIO_RW		0
 #define BIO_RW_AHEAD	1
 #define BIO_RW_BARRIER	2
 #define BIO_RW_FAILFAST	3
+#define BIO_RW_SYNC	4
 
 /*
  * various member access, note that bio_data should of course not be used
@@ -138,6 +140,7 @@ struct bio {
 #define bio_cur_sectors(bio)	(bio_iovec(bio)->bv_len >> 9)
 #define bio_data(bio)		(page_address(bio_page((bio))) + bio_offset((bio)))
 #define bio_barrier(bio)	((bio)->bi_rw & (1 << BIO_RW_BARRIER))
+#define bio_sync(bio)		((bio)->bi_rw & (1 << BIO_RW_SYNC))
 
 /*
  * will die
--- diff/include/linux/bitmap.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/linux/bitmap.h	2004-04-21 10:45:35.927241728 +0100
@@ -16,9 +16,9 @@ int bitmap_equal(const unsigned long *bi
 			unsigned long *bitmap2, int bits);
 void bitmap_complement(unsigned long *bitmap, int bits);
 
-static inline void bitmap_clear(unsigned long *bitmap, int bits)
+static inline void bitmap_zero(unsigned long *bitmap, int bits)
 {
-	CLEAR_BITMAP((unsigned long *)bitmap, bits);
+	memset(bitmap, 0, BITS_TO_LONGS(bits)*sizeof(unsigned long));
 }
 
 static inline void bitmap_fill(unsigned long *bitmap, int bits)
--- diff/include/linux/blkdev.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/blkdev.h	2004-04-21 10:45:35.928241576 +0100
@@ -243,7 +243,7 @@ typedef int (merge_requests_fn) (request
 typedef void (request_fn_proc) (request_queue_t *q);
 typedef int (make_request_fn) (request_queue_t *q, struct bio *bio);
 typedef int (prep_rq_fn) (request_queue_t *, struct request *);
-typedef void (unplug_fn) (void *q);
+typedef void (unplug_fn) (request_queue_t *);
 
 struct bio_vec;
 typedef int (merge_bvec_fn) (request_queue_t *, struct bio *, struct bio_vec *);
@@ -315,8 +315,6 @@ struct request_queue
 	unsigned long		bounce_pfn;
 	int			bounce_gfp;
 
-	struct list_head	plug_list;
-
 	/*
 	 * various queue flags, see QUEUE_* below
 	 */
@@ -350,6 +348,8 @@ struct request_queue
 
 	atomic_t		refcnt;
 
+	unsigned int		in_flight;
+
 	/*
 	 * sg stuff
 	 */
@@ -370,14 +370,18 @@ struct request_queue
 #define QUEUE_FLAG_WRITEFULL	4	/* read queue has been filled */
 #define QUEUE_FLAG_DEAD		5	/* queue being torn down */
 #define QUEUE_FLAG_REENTER	6	/* Re-entrancy avoidance */
+#define QUEUE_FLAG_PLUGGED	7	/* queue is plugged */
 
-#define blk_queue_plugged(q)	!list_empty(&(q)->plug_list)
+#define blk_queue_plugged(q)	test_bit(QUEUE_FLAG_PLUGGED, &(q)->queue_flags)
 #define blk_queue_tagged(q)	test_bit(QUEUE_FLAG_QUEUED, &(q)->queue_flags)
 #define blk_queue_stopped(q)	test_bit(QUEUE_FLAG_STOPPED, &(q)->queue_flags)
 
 #define blk_fs_request(rq)	((rq)->flags & REQ_CMD)
 #define blk_pc_request(rq)	((rq)->flags & REQ_BLOCK_PC)
 #define blk_noretry_request(rq)	((rq)->flags & REQ_FAILFAST)
+#define blk_rq_started(rq)	((rq)->flags & REQ_STARTED)
+
+#define blk_account_rq(rq)	(blk_rq_started(rq) && blk_fs_request(rq))
 
 #define blk_pm_suspend_request(rq)	((rq)->flags & REQ_PM_SUSPEND)
 #define blk_pm_resume_request(rq)	((rq)->flags & REQ_PM_RESUME)
@@ -515,7 +519,7 @@ extern int scsi_cmd_ioctl(struct gendisk
 extern void blk_start_queue(request_queue_t *q);
 extern void blk_stop_queue(request_queue_t *q);
 extern void __blk_stop_queue(request_queue_t *q);
-extern void blk_run_queue(request_queue_t *q);
+extern void blk_run_queue(request_queue_t *);
 extern void blk_queue_activity_fn(request_queue_t *, activity_fn *, void *);
 extern struct request *blk_rq_map_user(request_queue_t *, int, void __user *, unsigned int);
 extern int blk_rq_unmap_user(struct request *, void __user *, unsigned int);
@@ -526,6 +530,18 @@ static inline request_queue_t *bdev_get_
 	return bdev->bd_disk->queue;
 }
 
+static inline void blk_run_backing_dev(struct backing_dev_info *bdi)
+{
+	if (bdi && bdi->unplug_io_fn)
+		bdi->unplug_io_fn(bdi);
+}
+
+static inline void blk_run_address_space(struct address_space *mapping)
+{
+	if (mapping)
+		blk_run_backing_dev(mapping->backing_dev_info);
+}
+
 /*
  * end_request() and friends. Must be called with the request queue spinlock
  * acquired. All functions called within end_request() _must_be_ atomic.
@@ -572,7 +588,7 @@ extern struct backing_dev_info *blk_get_
 
 extern int blk_rq_map_sg(request_queue_t *, struct request *, struct scatterlist *);
 extern void blk_dump_rq_flags(struct request *, char *);
-extern void generic_unplug_device(void *);
+extern void generic_unplug_device(request_queue_t *);
 extern long nr_blockdev_pages(void);
 
 int blk_get_queue(request_queue_t *);
--- diff/include/linux/buffer_head.h	2004-02-09 10:36:12.000000000 +0000
+++ source/include/linux/buffer_head.h	2004-04-21 10:45:35.928241576 +0100
@@ -62,13 +62,6 @@ struct buffer_head {
 };
 
 /*
- * Debug
- */
-
-void __buffer_error(char *file, int line);
-#define buffer_error() __buffer_error(__FILE__, __LINE__)
-
-/*
  * macro tricks to expand the set_buffer_foo(), clear_buffer_foo()
  * and buffer_foo() functions.
  */
@@ -177,7 +170,7 @@ void free_buffer_head(struct buffer_head
 void FASTCALL(unlock_buffer(struct buffer_head *bh));
 void ll_rw_block(int, int, struct buffer_head * bh[]);
 void sync_dirty_buffer(struct buffer_head *bh);
-int submit_bh(int, struct buffer_head *);
+void submit_bh(int, struct buffer_head *);
 void write_boundary_block(struct block_device *bdev,
 			sector_t bblock, unsigned blocksize);
 
--- diff/include/linux/compat.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/compat.h	2004-04-21 10:45:35.928241576 +0100
@@ -13,6 +13,7 @@
 #include <linux/sem.h>
 
 #include <asm/compat.h>
+#include <asm/siginfo.h>
 
 #define compat_jiffies_to_clock_t(x)	\
 		(((unsigned long)(x) * COMPAT_USER_HZ) / HZ)
@@ -90,6 +91,22 @@ typedef union compat_sigval {
 	compat_uptr_t	sival_ptr;
 } compat_sigval_t;
 
+typedef struct compat_sigevent {
+	compat_sigval_t sigev_value;
+	compat_int_t sigev_signo;
+	compat_int_t sigev_notify;
+	union {
+		compat_int_t _pad[SIGEV_PAD_SIZE];
+		compat_int_t _tid;
+
+		struct {
+			compat_uptr_t _function;
+			compat_uptr_t _attribute;
+		} _sigev_thread;
+	} _sigev_un;
+} compat_sigevent_t;
+
+
 long compat_sys_semctl(int first, int second, int third, void __user *uptr);
 long compat_sys_msgsnd(int first, int second, int third, void __user *uptr);
 long compat_sys_msgrcv(int first, int second, int msgtyp, int third,
--- diff/include/linux/compat_ioctl.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/compat_ioctl.h	2004-04-21 10:45:35.929241424 +0100
@@ -123,6 +123,19 @@ COMPATIBLE_IOCTL(STOP_ARRAY)
 COMPATIBLE_IOCTL(STOP_ARRAY_RO)
 COMPATIBLE_IOCTL(RESTART_ARRAY_RW)
 /* DM */
+COMPATIBLE_IOCTL(DM_VERSION_32)
+COMPATIBLE_IOCTL(DM_LIST_DEVICES_32)
+COMPATIBLE_IOCTL(DM_DEV_CREATE_32)
+COMPATIBLE_IOCTL(DM_DEV_REMOVE_32)
+COMPATIBLE_IOCTL(DM_DEV_RENAME_32)
+COMPATIBLE_IOCTL(DM_DEV_SUSPEND_32)
+COMPATIBLE_IOCTL(DM_DEV_STATUS_32)
+COMPATIBLE_IOCTL(DM_DEV_WAIT_32)
+COMPATIBLE_IOCTL(DM_TABLE_LOAD_32)
+COMPATIBLE_IOCTL(DM_TABLE_CLEAR_32)
+COMPATIBLE_IOCTL(DM_TABLE_DEPS_32)
+COMPATIBLE_IOCTL(DM_TABLE_STATUS_32)
+COMPATIBLE_IOCTL(DM_LIST_VERSIONS_32)
 COMPATIBLE_IOCTL(DM_VERSION)
 COMPATIBLE_IOCTL(DM_LIST_DEVICES)
 COMPATIBLE_IOCTL(DM_DEV_CREATE)
--- diff/include/linux/compiler-gcc3.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/linux/compiler-gcc3.h	2004-04-21 10:45:35.929241424 +0100
@@ -3,7 +3,7 @@
 /* These definitions are for GCC v3.x.  */
 #include <linux/compiler-gcc.h>
 
-#if __GNUC_MINOR__ >= 1
+#if __GNUC_MINOR__ >= 1  && __GNUC_MINOR__ < 4
 # define inline		__inline__ __attribute__((always_inline))
 # define __inline__	__inline__ __attribute__((always_inline))
 # define __inline	__inline__ __attribute__((always_inline))
--- diff/include/linux/compiler.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/compiler.h	2004-04-21 10:45:35.930241272 +0100
@@ -4,9 +4,11 @@
 #ifdef __CHECKER__
 # define __user		__attribute__((noderef, address_space(1)))
 # define __kernel	/* default address space */
+# define __safe		__attribute__((safe))
 #else
 # define __user
 # define __kernel
+# define __safe
 #endif
 
 #ifdef __KERNEL__
--- diff/include/linux/cpufreq.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/linux/cpufreq.h	2004-04-21 10:45:35.930241272 +0100
@@ -175,6 +175,7 @@ struct freq_attr;
 struct cpufreq_driver {
 	struct module           *owner;
 	char			name[CPUFREQ_NAME_LEN];
+	u8			flags;
 
 	/* needed by all drivers */
 	int	(*init)		(struct cpufreq_policy *policy);
@@ -192,6 +193,11 @@ struct cpufreq_driver {
 	struct freq_attr	**attr;
 };
 
+/* flags */
+
+#define CPUFREQ_STICKY	0x01	/* the driver isn't removed even if 
+				   all ->init() calls failed */
+
 int cpufreq_register_driver(struct cpufreq_driver *driver_data);
 int cpufreq_unregister_driver(struct cpufreq_driver *driver_data);
 
--- diff/include/linux/devfs_fs.h	2002-10-16 04:28:33.000000000 +0100
+++ source/include/linux/devfs_fs.h	2004-04-21 10:45:35.930241272 +0100
@@ -22,22 +22,20 @@
 #define DEVFSD_NOTIFY_CREATE        6
 #define DEVFSD_NOTIFY_DELETE        7
 
-#define DEVFS_PATHLEN               1024  /*  Never change this otherwise the
-					      binary interface will change   */
+#define DEVFS_PATHLEN               1024	/*  Never change this otherwise the
+						   binary interface will change   */
 
-struct devfsd_notify_struct
-{   /*  Use native C types to ensure same types in kernel and user space     */
-    unsigned int type;           /*  DEVFSD_NOTIFY_* value                   */
-    unsigned int mode;           /*  Mode of the inode or device entry       */
-    unsigned int major;          /*  Major number of device entry            */
-    unsigned int minor;          /*  Minor number of device entry            */
-    unsigned int uid;            /*  Uid of process, inode or device entry   */
-    unsigned int gid;            /*  Gid of process, inode or device entry   */
-    unsigned int overrun_count;  /*  Number of lost events                   */
-    unsigned int namelen;        /*  Number of characters not including '\0' */
-    /*  The device name MUST come last                                       */
-    char devname[DEVFS_PATHLEN]; /*  This will be '\0' terminated            */
+struct devfsd_notify_struct {	/*  Use native C types to ensure same types in kernel and user space     */
+	unsigned int type;	/*  DEVFSD_NOTIFY_* value                   */
+	unsigned int mode;	/*  Mode of the inode or device entry       */
+	unsigned int major;	/*  Major number of device entry            */
+	unsigned int minor;	/*  Minor number of device entry            */
+	unsigned int uid;	/*  Uid of process, inode or device entry   */
+	unsigned int gid;	/*  Gid of process, inode or device entry   */
+	unsigned int overrun_count;	/*  Number of lost events                   */
+	unsigned int namelen;	/*  Number of characters not including '\0' */
+	/*  The device name MUST come last                                       */
+	char devname[DEVFS_PATHLEN];	/*  This will be '\0' terminated            */
 };
 
-
-#endif  /*  _LINUX_DEVFS_FS_H  */
+#endif				/*  _LINUX_DEVFS_FS_H  */
--- diff/include/linux/devfs_fs_kernel.h	2003-09-30 15:46:20.000000000 +0100
+++ source/include/linux/devfs_fs_kernel.h	2004-04-21 10:45:35.931241120 +0100
@@ -12,18 +12,18 @@
 
 #ifdef CONFIG_DEVFS_FS
 extern int devfs_mk_bdev(dev_t dev, umode_t mode, const char *fmt, ...)
-	__attribute__((format (printf, 3, 4)));
+    __attribute__ ((format(printf, 3, 4)));
 extern int devfs_mk_cdev(dev_t dev, umode_t mode, const char *fmt, ...)
-	__attribute__((format (printf, 3, 4)));
+    __attribute__ ((format(printf, 3, 4)));
 extern int devfs_mk_symlink(const char *name, const char *link);
 extern int devfs_mk_dir(const char *fmt, ...)
-	__attribute__((format (printf, 1, 2)));
+    __attribute__ ((format(printf, 1, 2)));
 extern void devfs_remove(const char *fmt, ...)
-	__attribute__((format (printf, 1, 2)));
+    __attribute__ ((format(printf, 1, 2)));
 extern int devfs_register_tape(const char *name);
 extern void devfs_unregister_tape(int num);
 extern void mount_devfs_fs(void);
-#else  /*  CONFIG_DEVFS_FS  */
+#else				/*  CONFIG_DEVFS_FS  */
 static inline int devfs_mk_bdev(dev_t dev, umode_t mode, const char *fmt, ...)
 {
 	return 0;
@@ -32,9 +32,9 @@ static inline int devfs_mk_cdev(dev_t de
 {
 	return 0;
 }
-static inline int devfs_mk_symlink (const char *name, const char *link)
+static inline int devfs_mk_symlink(const char *name, const char *link)
 {
-    return 0;
+	return 0;
 }
 static inline int devfs_mk_dir(const char *fmt, ...)
 {
@@ -43,16 +43,16 @@ static inline int devfs_mk_dir(const cha
 static inline void devfs_remove(const char *fmt, ...)
 {
 }
-static inline int devfs_register_tape (const char *name)
+static inline int devfs_register_tape(const char *name)
 {
-    return -1;
+	return -1;
 }
 static inline void devfs_unregister_tape(int num)
 {
 }
-static inline void mount_devfs_fs (void)
+static inline void mount_devfs_fs(void)
 {
-    return;
+	return;
 }
-#endif  /*  CONFIG_DEVFS_FS  */
-#endif  /*  _LINUX_DEVFS_FS_KERNEL_H  */
+#endif				/*  CONFIG_DEVFS_FS  */
+#endif				/*  _LINUX_DEVFS_FS_KERNEL_H  */
--- diff/include/linux/device.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/device.h	2004-04-21 10:45:35.931241120 +0100
@@ -17,7 +17,6 @@
 #include <linux/list.h>
 #include <linux/spinlock.h>
 #include <linux/types.h>
-#include <linux/ioport.h>
 #include <linux/module.h>
 #include <linux/pm.h>
 #include <asm/semaphore.h>
--- diff/include/linux/divert.h	2003-06-09 14:18:20.000000000 +0100
+++ source/include/linux/divert.h	2004-04-21 10:45:35.931241120 +0100
@@ -46,7 +46,7 @@ typedef union _divert_cf_arg
 	u32		uint32;
 	s64		int64;
 	u64		uint64;
-	void	*ptr;
+	void	__user *ptr;
 } divert_cf_arg;
 
 
@@ -111,7 +111,7 @@ struct divert_cf
 #ifdef CONFIG_NET_DIVERT
 int alloc_divert_blk(struct net_device *);
 void free_divert_blk(struct net_device *);
-int divert_ioctl(unsigned int cmd, struct divert_cf *arg);
+int divert_ioctl(unsigned int cmd, struct divert_cf __user *arg);
 void divert_frame(struct sk_buff *skb);
 static inline void handle_diverter(struct sk_buff *skb)
 {
--- diff/include/linux/dm-ioctl.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/dm-ioctl.h	2004-04-21 10:45:35.932240968 +0100
@@ -129,8 +129,14 @@ struct dm_target_spec {
 	int32_t status;		/* used when reading from kernel only */
 
 	/*
-	 * Offset in bytes (from the start of this struct) to
-	 * next target_spec.
+	 * Location of the next dm_target_spec.
+	 * - When specifying targets on a DM_TABLE_LOAD command, this value is
+	 *   the number of bytes from the start of the "current" dm_target_spec
+	 *   to the start of the "next" dm_target_spec.
+	 * - When retrieving targets on a DM_TABLE_STATUS command, this value
+	 *   is the number of bytes from the start of the first dm_target_spec
+	 *   (that follows the dm_ioctl struct) to the start of the "next"
+	 *   dm_target_spec.
 	 */
 	uint32_t next;
 
@@ -200,6 +206,34 @@ enum {
 	DM_LIST_VERSIONS_CMD,
 };
 
+/*
+ * The dm_ioctl struct passed into the ioctl is just the header
+ * on a larger chunk of memory.  On x86-64 and other
+ * architectures the dm-ioctl struct will be padded to an 8 byte
+ * boundary so the size will be different, which would change the
+ * ioctl code - yes I really messed up.  This hack forces these
+ * architectures to have the correct ioctl code.
+ */
+#ifdef CONFIG_COMPAT
+typedef char ioctl_struct[308];
+#define DM_VERSION_32       _IOWR(DM_IOCTL, DM_VERSION_CMD, ioctl_struct)
+#define DM_REMOVE_ALL_32    _IOWR(DM_IOCTL, DM_REMOVE_ALL_CMD, ioctl_struct)
+#define DM_LIST_DEVICES_32  _IOWR(DM_IOCTL, DM_LIST_DEVICES_CMD, ioctl_struct)
+
+#define DM_DEV_CREATE_32    _IOWR(DM_IOCTL, DM_DEV_CREATE_CMD, ioctl_struct)
+#define DM_DEV_REMOVE_32    _IOWR(DM_IOCTL, DM_DEV_REMOVE_CMD, ioctl_struct)
+#define DM_DEV_RENAME_32    _IOWR(DM_IOCTL, DM_DEV_RENAME_CMD, ioctl_struct)
+#define DM_DEV_SUSPEND_32   _IOWR(DM_IOCTL, DM_DEV_SUSPEND_CMD, ioctl_struct)
+#define DM_DEV_STATUS_32    _IOWR(DM_IOCTL, DM_DEV_STATUS_CMD, ioctl_struct)
+#define DM_DEV_WAIT_32      _IOWR(DM_IOCTL, DM_DEV_WAIT_CMD, ioctl_struct)
+
+#define DM_TABLE_LOAD_32    _IOWR(DM_IOCTL, DM_TABLE_LOAD_CMD, ioctl_struct)
+#define DM_TABLE_CLEAR_32   _IOWR(DM_IOCTL, DM_TABLE_CLEAR_CMD, ioctl_struct)
+#define DM_TABLE_DEPS_32    _IOWR(DM_IOCTL, DM_TABLE_DEPS_CMD, ioctl_struct)
+#define DM_TABLE_STATUS_32  _IOWR(DM_IOCTL, DM_TABLE_STATUS_CMD, ioctl_struct)
+#define DM_LIST_VERSIONS_32 _IOWR(DM_IOCTL, DM_LIST_VERSIONS_CMD, ioctl_struct)
+#endif
+
 #define DM_IOCTL 0xfd
 
 #define DM_VERSION       _IOWR(DM_IOCTL, DM_VERSION_CMD, struct dm_ioctl)
--- diff/include/linux/dma-mapping.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/dma-mapping.h	2004-04-21 10:45:35.932240968 +0100
@@ -10,6 +10,9 @@ enum dma_data_direction {
 	DMA_NONE = 3,
 };
 
+#define DMA_64BIT_MASK	0xffffffffffffffffULL
+#define DMA_32BIT_MASK	0x00000000ffffffffULL
+
 #include <asm/dma-mapping.h>
 
 /* Backwards compat, remove in 2.7.x */
--- diff/include/linux/elevator.h	2004-02-18 08:54:13.000000000 +0000
+++ source/include/linux/elevator.h	2004-04-21 10:45:35.933240816 +0100
@@ -94,6 +94,11 @@ extern elevator_t iosched_deadline;
  */
 extern elevator_t iosched_as;
 
+/*
+ * completely fair queueing I/O scheduler
+ */
+extern elevator_t iosched_cfq;
+
 extern int elevator_init(request_queue_t *, elevator_t *);
 extern void elevator_exit(request_queue_t *);
 extern int elv_rq_merge_ok(struct request *, struct bio *);
--- diff/include/linux/elf.h	2003-10-09 09:47:34.000000000 +0100
+++ source/include/linux/elf.h	2004-04-21 10:45:35.933240816 +0100
@@ -35,6 +35,8 @@ typedef __s64	Elf64_Sxword;
 #define PT_HIPROC  0x7fffffff
 #define PT_GNU_EH_FRAME		0x6474e550
 
+#define PT_GNU_STACK	(PT_LOOS + 0x474e551)
+
 /* These constants define the different elf file types */
 #define ET_NONE   0
 #define ET_REL    1
--- diff/include/linux/etherdevice.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/linux/etherdevice.h	2004-04-21 10:45:35.933240816 +0100
@@ -25,6 +25,7 @@
 #define _LINUX_ETHERDEVICE_H
 
 #include <linux/if_ether.h>
+#include <linux/random.h>
 
 #ifdef __KERNEL__
 extern int		eth_header(struct sk_buff *skb, struct net_device *dev,
@@ -40,7 +41,9 @@ extern int		eth_header_parse(struct sk_b
 					 unsigned char *haddr);
 
 extern struct net_device *alloc_etherdev(int sizeof_priv);
-static inline void eth_copy_and_sum (struct sk_buff *dest, unsigned char *src, int len, int base)
+static inline void eth_copy_and_sum (struct sk_buff *dest, 
+				     const unsigned char *src, 
+				     int len, int base)
 {
 	memcpy (dest->data, src, len);
 }
@@ -55,13 +58,26 @@ static inline void eth_copy_and_sum (str
  *
  * Return true if the address is valid.
  */
-static inline int is_valid_ether_addr( u8 *addr )
+static inline int is_valid_ether_addr( const u8 *addr )
 {
 	const char zaddr[6] = {0,};
 
 	return !(addr[0]&1) && memcmp( addr, zaddr, 6);
 }
 
+/**
+ * random_ether_addr - Generate software assigned random Ethernet address
+ * @addr: Pointer to a six-byte array containing the Ethernet address
+ *
+ * Generate a random Ethernet address (MAC) that is not multicast
+ * and has the local assigned bit set.
+ */
+static inline void random_ether_addr(u8 *addr)
+{
+	get_random_bytes (addr, ETH_ALEN);
+	addr [0] &= 0xfe;	/* clear multicast bit */
+	addr [0] |= 0x02;	/* set local assignment bit (IEEE802) */
+}
 #endif
 
 #endif	/* _LINUX_ETHERDEVICE_H */
--- diff/include/linux/ext3_fs_sb.h	2004-02-09 10:36:12.000000000 +0000
+++ source/include/linux/ext3_fs_sb.h	2004-04-21 10:45:35.934240664 +0100
@@ -69,6 +69,10 @@ struct ext3_sb_info {
 	struct timer_list turn_ro_timer;	/* For turning read-only (crash simulation) */
 	wait_queue_head_t ro_wait_queue;	/* For people waiting for the fs to go read-only */
 #endif
+#ifdef CONFIG_QUOTA
+	char *s_qf_names[MAXQUOTAS];		/* Names of quota files with journalled quota */
+	int s_jquota_fmt;			/* Format of quota to use */
+#endif
 };
 
 #endif	/* _LINUX_EXT3_FS_SB */
--- diff/include/linux/ext3_jbd.h	2004-02-09 10:36:12.000000000 +0000
+++ source/include/linux/ext3_jbd.h	2004-04-21 10:45:35.934240664 +0100
@@ -42,8 +42,9 @@
  * superblock only gets updated once, of course, so don't bother
  * counting that again for the quota updates. */
 
-#define EXT3_DATA_TRANS_BLOCKS		(3 * EXT3_SINGLEDATA_TRANS_BLOCKS + \
-					 EXT3_XATTR_TRANS_BLOCKS - 2)
+#define EXT3_DATA_TRANS_BLOCKS		(EXT3_SINGLEDATA_TRANS_BLOCKS + \
+					 EXT3_XATTR_TRANS_BLOCKS - 2 + \
+					 2*EXT3_QUOTA_TRANS_BLOCKS)
 
 extern int ext3_writepage_trans_blocks(struct inode *inode);
 
@@ -72,6 +73,19 @@ extern int ext3_writepage_trans_blocks(s
 
 #define EXT3_INDEX_EXTRA_TRANS_BLOCKS	8
 
+#ifdef CONFIG_QUOTA
+/* Amount of blocks needed for quota update - we know that the structure was
+ * allocated so we need to update only inode+data */
+#define EXT3_QUOTA_TRANS_BLOCKS 2
+/* Amount of blocks needed for quota insert/delete - we do some block writes
+ * but inode, sb and group updates are done only once */
+#define EXT3_QUOTA_INIT_BLOCKS (DQUOT_MAX_WRITES*\
+				(EXT3_SINGLEDATA_TRANS_BLOCKS-3)+3)
+#else
+#define EXT3_QUOTA_TRANS_BLOCKS 0
+#define EXT3_QUOTA_INIT_BLOCKS 0
+#endif
+
 int
 ext3_mark_iloc_dirty(handle_t *handle, 
 		     struct inode *inode,
--- diff/include/linux/fd.h	2002-10-16 04:27:50.000000000 +0100
+++ source/include/linux/fd.h	2004-04-21 10:45:35.934240664 +0100
@@ -17,6 +17,7 @@ struct floppy_struct {
 			stretch;	/* !=0 means double track steps */
 #define FD_STRETCH 1
 #define FD_SWAPSIDES 2
+#define FD_ZEROBASED 4
 
 	unsigned char	gap,		/* gap1 size */
 
--- diff/include/linux/file.h	2003-06-09 14:18:20.000000000 +0100
+++ source/include/linux/file.h	2004-04-21 10:45:35.935240512 +0100
@@ -75,6 +75,10 @@ static inline struct file * fcheck_files
 #define fcheck(fd)	fcheck_files(current->files, fd)
 
 extern void FASTCALL(fd_install(unsigned int fd, struct file * file));
+
+struct task_struct;
+
+struct files_struct *get_files_struct(struct task_struct *);
 void FASTCALL(put_files_struct(struct files_struct *fs));
 
 #endif /* __LINUX_FILE_H */
--- diff/include/linux/fs.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/fs.h	2004-04-21 10:45:35.936240360 +0100
@@ -20,6 +20,7 @@
 #include <linux/radix-tree.h>
 #include <linux/kobject.h>
 #include <asm/atomic.h>
+#include <linux/audit.h>
 
 struct iovec;
 struct nameidata;
@@ -82,6 +83,8 @@ extern int leases_enable, dir_notify_ena
 #define WRITE 1
 #define READA 2		/* read-ahead  - don't block if no resources */
 #define SPECIAL 4	/* For non-blockdevice requests in request queue */
+#define READ_SYNC	(READ | (1 << BIO_RW_SYNC))
+#define WRITE_SYNC	(WRITE | (1 << BIO_RW_SYNC))
 
 #define SEL_IN		1
 #define SEL_OUT		2
@@ -314,7 +317,7 @@ struct address_space_operations {
 	sector_t (*bmap)(struct address_space *, sector_t);
 	int (*invalidatepage) (struct page *, unsigned long);
 	int (*releasepage) (struct page *, int);
-	int (*direct_IO)(int, struct kiocb *, const struct iovec *iov,
+	ssize_t (*direct_IO)(int, struct kiocb *, const struct iovec *iov,
 			loff_t offset, unsigned long nr_segs);
 };
 
@@ -322,12 +325,9 @@ struct backing_dev_info;
 struct address_space {
 	struct inode		*host;		/* owner: inode, block_device */
 	struct radix_tree_root	page_tree;	/* radix tree of all pages */
-	spinlock_t		page_lock;	/* and spinlock protecting it */
-	struct list_head	clean_pages;	/* list of clean pages */
-	struct list_head	dirty_pages;	/* list of dirty pages */
-	struct list_head	locked_pages;	/* list of locked pages */
-	struct list_head	io_pages;	/* being prepared for I/O */
+	spinlock_t		tree_lock;	/* and spinlock protecting it */
 	unsigned long		nrpages;	/* number of total pages */
+	pgoff_t			writeback_index;/* writeback starts here */
 	struct address_space_operations *a_ops;	/* methods */
 	struct list_head	i_mmap;		/* list of private mappings */
 	struct list_head	i_mmap_shared;	/* list of shared mappings */
@@ -365,6 +365,35 @@ struct block_device {
 };
 
 /*
+ * Radix-tree tags, for tagging dirty and writeback pages within the pagecache
+ * radix trees
+ */
+#define PAGECACHE_TAG_DIRTY	0
+#define PAGECACHE_TAG_WRITEBACK	1
+
+int mapping_tagged(struct address_space *mapping, int tag);
+
+/*
+ * Might pages of this file be mapped into userspace?
+ */
+static inline int mapping_mapped(struct address_space *mapping)
+{
+	return	!list_empty(&mapping->i_mmap) ||
+		!list_empty(&mapping->i_mmap_shared);
+}
+
+/*
+ * Might pages of this file have been modified in userspace?
+ * Note that i_mmap_shared holds all the VM_SHARED vmas: do_mmap_pgoff
+ * marks vma as VM_SHARED if it is shared, and the file was opened for
+ * writing i.e. vma may be mprotected writable even if now readonly.
+ */
+static inline int mapping_writably_mapped(struct address_space *mapping)
+{
+	return	!list_empty(&mapping->i_mmap_shared);
+}
+
+/*
  * Use sequence counter to get consistent i_size on 32-bit processors.
  */
 #if BITS_PER_LONG==32 && defined(CONFIG_SMP)
@@ -397,13 +426,16 @@ struct inode {
 	unsigned short          i_bytes;
 	spinlock_t		i_lock;	/* i_blocks, i_bytes, maybe i_size */
 	struct semaphore	i_sem;
+	struct rw_semaphore	i_alloc_sem;
 	struct inode_operations	*i_op;
 	struct file_operations	*i_fop;	/* former ->i_op->default_file_ops */
 	struct super_block	*i_sb;
 	struct file_lock	*i_flock;
 	struct address_space	*i_mapping;
 	struct address_space	i_data;
+#ifdef CONFIG_QUOTA
 	struct dquot		*i_dquot[MAXQUOTAS];
+#endif
 	/* These three should probably be a union */
 	struct list_head	i_devices;
 	struct pipe_inode_info	*i_pipe;
@@ -621,6 +653,9 @@ extern struct list_head file_lock_list;
 
 #include <linux/fcntl.h>
 
+extern long generic_file_fcntl(int fd, unsigned int cmd,
+				unsigned long arg, struct file *filp);
+
 extern int fcntl_getlk(struct file *, struct flock __user *);
 extern int fcntl_setlk(struct file *, unsigned int, struct flock __user *);
 
@@ -716,7 +751,6 @@ struct super_block {
 
 	char s_id[32];				/* Informational name */
 
-	struct kobject           kobj;          /* anchor for sysfs */
 	void 			*s_fs_info;	/* Filesystem private info */
 
 	/*
@@ -830,6 +864,8 @@ struct file_operations {
 	ssize_t (*sendfile) (struct file *, loff_t *, size_t, read_actor_t, void __user *);
 	ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
 	unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
+	long (*fcntl)(int fd, unsigned int cmd,
+			unsigned long arg, struct file *filp);
 };
 
 struct inode_operations {
@@ -925,6 +961,7 @@ static inline void file_accessed(struct 
 	touch_atime(file->f_vfsmnt, file->f_dentry);
 }
 
+int sync_inode(struct inode *inode, struct writeback_control *wbc);
 
 /**
  * &export_operations - for nfsd to communicate with file systems
@@ -1144,7 +1181,18 @@ extern char * getname(const char __user 
 extern void vfs_caches_init(unsigned long);
 
 #define __getname()	kmem_cache_alloc(names_cachep, SLAB_KERNEL)
-#define putname(name)	kmem_cache_free(names_cachep, (void *)(name))
+#define __putname(name) kmem_cache_free(names_cachep, (void *)(name))
+#ifndef CONFIG_AUDITSYSCALL
+#define putname(name)   __putname(name)
+#else
+#define putname(name)							\
+	do {								\
+		if (unlikely(current->audit_context))			\
+			audit_putname(name);				\
+		else							\
+			__putname(name);				\
+	} while (0)
+#endif
 
 extern int register_blkdev(unsigned int, const char *);
 extern int unregister_blkdev(unsigned int, const char *);
@@ -1227,6 +1275,7 @@ extern void write_inode_now(struct inode
 extern int filemap_fdatawrite(struct address_space *);
 extern int filemap_flush(struct address_space *);
 extern int filemap_fdatawait(struct address_space *);
+extern int filemap_write_and_wait(struct address_space *mapping);
 extern void sync_supers(void);
 extern void sync_filesystems(int wait);
 extern void emergency_sync(void);
@@ -1309,7 +1358,7 @@ extern struct file * get_empty_filp(void
 extern void file_move(struct file *f, struct list_head *list);
 extern void file_kill(struct file *f);
 struct bio;
-extern int submit_bio(int, struct bio *);
+extern void submit_bio(int, struct bio *);
 extern int bdev_read_only(struct block_device *);
 extern int set_blocksize(struct block_device *, int);
 extern int sb_set_blocksize(struct super_block *, int);
@@ -1339,9 +1388,6 @@ extern void
 file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping);
 extern ssize_t generic_file_direct_IO(int rw, struct kiocb *iocb,
 	const struct iovec *iov, loff_t offset, unsigned long nr_segs);
-extern int blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, 
-	struct block_device *bdev, const struct iovec *iov, loff_t offset, 
-	unsigned long nr_segs, get_blocks_t *get_blocks, dio_iodone_t *end_io);
 extern ssize_t generic_file_readv(struct file *filp, const struct iovec *iov, 
 	unsigned long nr_segs, loff_t *ppos);
 ssize_t generic_file_writev(struct file *filp, const struct iovec *iov, 
@@ -1363,6 +1409,32 @@ static inline void do_generic_file_read(
 				actor);
 }
 
+ssize_t __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
+	struct block_device *bdev, const struct iovec *iov, loff_t offset,
+	unsigned long nr_segs, get_blocks_t get_blocks, dio_iodone_t end_io,
+	int needs_special_locking);
+
+/*
+ * For filesystems which need locking between buffered and direct access
+ */
+static inline ssize_t blockdev_direct_IO(int rw, struct kiocb *iocb,
+	struct inode *inode, struct block_device *bdev, const struct iovec *iov,
+	loff_t offset, unsigned long nr_segs, get_blocks_t get_blocks,
+	dio_iodone_t end_io)
+{
+	return __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset,
+				nr_segs, get_blocks, end_io, 1);
+}
+
+static inline ssize_t blockdev_direct_IO_no_locking(int rw, struct kiocb *iocb,
+	struct inode *inode, struct block_device *bdev, const struct iovec *iov,
+	loff_t offset, unsigned long nr_segs, get_blocks_t get_blocks,
+	dio_iodone_t end_io)
+{
+	return __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset,
+				nr_segs, get_blocks, end_io, 0);
+}
+
 extern struct file_operations generic_ro_fops;
 
 #define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m))
--- diff/include/linux/gfp.h	2003-08-26 10:00:54.000000000 +0100
+++ source/include/linux/gfp.h	2004-04-21 10:45:35.936240360 +0100
@@ -32,10 +32,16 @@
 #define __GFP_NOFAIL	0x800	/* Retry for ever.  Cannot fail */
 #define __GFP_NORETRY	0x1000	/* Do not retry.  Might fail */
 #define __GFP_NO_GROW	0x2000	/* Slab internal usage */
+#define __GFP_COMP	0x4000	/* Add compound page metadata */
 
 #define __GFP_BITS_SHIFT 16	/* Room for 16 __GFP_FOO bits */
 #define __GFP_BITS_MASK ((1 << __GFP_BITS_SHIFT) - 1)
 
+/* if you forget to add the bitmask here kernel will crash, period */
+#define GFP_LEVEL_MASK (__GFP_WAIT|__GFP_HIGH|__GFP_IO|__GFP_FS| \
+			__GFP_COLD|__GFP_NOWARN|__GFP_REPEAT| \
+			__GFP_NOFAIL|__GFP_NORETRY|__GFP_NO_GROW|__GFP_COMP)
+
 #define GFP_ATOMIC	(__GFP_HIGH)
 #define GFP_NOIO	(__GFP_WAIT)
 #define GFP_NOFS	(__GFP_WAIT | __GFP_IO)
--- diff/include/linux/hugetlb.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/hugetlb.h	2004-04-21 10:45:35.937240208 +0100
@@ -20,16 +20,17 @@ void huge_page_release(struct page *);
 int hugetlb_report_meminfo(char *);
 int is_hugepage_mem_enough(size_t);
 unsigned long hugetlb_total_pages(void);
-struct page *follow_huge_addr(struct mm_struct *mm, struct vm_area_struct *vma,
-			unsigned long address, int write);
-struct vm_area_struct *hugepage_vma(struct mm_struct *mm,
-					unsigned long address);
+struct page *follow_huge_addr(struct mm_struct *mm, unsigned long address,
+			      int write);
 struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address,
 				pmd_t *pmd, int write);
 int is_aligned_hugepage_range(unsigned long addr, unsigned long len);
 int pmd_huge(pmd_t pmd);
+struct page *alloc_huge_page(void);
+void free_huge_page(struct page *);
 
-extern int htlbpage_max;
+extern unsigned long max_huge_pages;
+extern const unsigned long hugetlb_zero, hugetlb_infinity;
 
 static inline void
 mark_mm_hugetlb(struct mm_struct *mm, struct vm_area_struct *vma)
@@ -62,7 +63,7 @@ static inline unsigned long hugetlb_tota
 }
 
 #define follow_hugetlb_page(m,v,p,vs,a,b,i)	({ BUG(); 0; })
-#define follow_huge_addr(mm, vma, addr, write)	0
+#define follow_huge_addr(mm, addr, write)	ERR_PTR(-EINVAL)
 #define copy_hugetlb_page_range(src, dst, vma)	({ BUG(); 0; })
 #define hugetlb_prefault(mapping, vma)		({ BUG(); 0; })
 #define zap_hugepage_range(vma, start, len)	BUG()
@@ -70,7 +71,6 @@ static inline unsigned long hugetlb_tota
 #define huge_page_release(page)			BUG()
 #define is_hugepage_mem_enough(size)		0
 #define hugetlb_report_meminfo(buf)		0
-#define hugepage_vma(mm, addr)			0
 #define mark_mm_hugetlb(mm, vma)		do { } while (0)
 #define follow_huge_pmd(mm, addr, pmd, write)	0
 #define is_aligned_hugepage_range(addr, len)	0
@@ -78,6 +78,8 @@ static inline unsigned long hugetlb_tota
 #define pmd_huge(x)	0
 #define is_hugepage_only_range(addr, len)	0
 #define hugetlb_free_pgtables(tlb, prev, start, end) do { } while (0)
+#define alloc_huge_page()			({ NULL; })
+#define free_huge_page(p)			({ (void)(p); BUG(); })
 
 #ifndef HPAGE_MASK
 #define HPAGE_MASK	0		/* Keep the compiler happy */
--- diff/include/linux/icmpv6.h	2003-05-21 11:50:10.000000000 +0100
+++ source/include/linux/icmpv6.h	2004-04-21 10:45:35.937240208 +0100
@@ -95,8 +95,7 @@ struct icmp6hdr {
 #define MLD2_ALLOW_NEW_SOURCES	5
 #define MLD2_BLOCK_OLD_SOURCES	6
 
-/* this must be an IANA-assigned value; 206 for testing only */
-#define ICMPV6_MLD2_REPORT		206
+#define ICMPV6_MLD2_REPORT		143
 #define MLD2_ALL_MCR_INIT { { { 0xff,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0,0x16 } } }
 
 /*
--- diff/include/linux/ide.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/ide.h	2004-04-21 10:45:35.938240056 +0100
@@ -20,7 +20,6 @@
 #include <linux/pci.h>
 #include <asm/byteorder.h>
 #include <asm/system.h>
-#include <asm/hdreg.h>
 #include <asm/io.h>
 #include <asm/semaphore.h>
 
@@ -294,8 +293,49 @@ void ide_setup_ports(	hw_regs_t *hw,
 #endif
 			int irq);
 
+static inline void ide_std_init_ports(hw_regs_t *hw,
+				      unsigned long io_addr,
+				      unsigned long ctl_addr)
+{
+	unsigned int i;
+
+	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++)
+		hw->io_ports[i] = io_addr++;
+
+	hw->io_ports[IDE_CONTROL_OFFSET] = ctl_addr;
+}
+
 #include <asm/ide.h>
 
+/*
+ * ide_init_hwif_ports() is OBSOLETE and will be removed in 2.7 series.
+ *
+ * arm26, arm, h8300, m68k, m68knommu (broken) and i386-pc9800 (broken)
+ * still have their own versions.
+ */
+#if !defined(CONFIG_ARM) && !defined(CONFIG_H8300) && !defined(CONFIG_M68K)
+static inline void ide_init_hwif_ports(hw_regs_t *hw,
+				       unsigned long io_addr,
+				       unsigned long ctl_addr,
+				       int *irq)
+{
+	if (!ctl_addr)
+		ide_std_init_ports(hw, io_addr, io_addr + 0x206);
+	else
+		ide_std_init_ports(hw, io_addr, ctl_addr);
+
+	if (irq)
+		*irq = 0;
+
+	hw->io_ports[IDE_IRQ_OFFSET] = 0;
+
+#ifdef CONFIG_PPC32
+	if (ppc_ide_md.ide_init_hwif)
+		ppc_ide_md.ide_init_hwif(hw, io_addr, ctl_addr, irq);
+#endif
+}
+#endif /* !ARM && !H8300 && !M68K */
+
 /* Currently only m68k, apus and m8xx need it */
 #ifndef IDE_ARCH_ACK_INTR
 # define ide_ack_intr(hwif) (1)
--- diff/include/linux/idr.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/linux/idr.h	2004-04-21 10:45:35.938240056 +0100
@@ -23,6 +23,7 @@
 # error "BITS_PER_LONG is not 32 or 64"
 #endif
 
+#define IDR_SIZE (1 << IDR_BITS)
 #define IDR_MASK ((1 << IDR_BITS)-1)
 
 /* Define the size of the id's */
@@ -53,6 +54,17 @@ struct idr {
 	spinlock_t	  lock;
 };
 
+#define IDR_INIT(name)	\
+{								\
+	.top		= NULL,					\
+	.id_free	= NULL,					\
+	.count		= 0,					\
+	.layers 	= 0,					\
+	.id_free_cnt	= 0,					\
+	.lock		= SPIN_LOCK_UNLOCKED,			\
+}
+#define DEFINE_IDR(name)	struct idr name = IDR_INIT(name)
+
 /*
  * This is what we export.
  */
--- diff/include/linux/if.h	2003-05-21 11:50:10.000000000 +0100
+++ source/include/linux/if.h	2004-04-21 10:45:35.938240056 +0100
@@ -144,7 +144,7 @@ struct ifreq 
 		struct  ifmap ifru_map;
 		char	ifru_slave[IFNAMSIZ];	/* Just fits the size */
 		char	ifru_newname[IFNAMSIZ];
-		char *	ifru_data;
+		char __user *	ifru_data;
 		struct	if_settings ifru_settings;
 	} ifr_ifru;
 };
--- diff/include/linux/if_bridge.h	2003-05-21 11:50:10.000000000 +0100
+++ source/include/linux/if_bridge.h	2004-04-21 10:45:35.939239904 +0100
@@ -98,9 +98,6 @@ struct __fdb_entry
 
 #include <linux/netdevice.h>
 
-struct net_bridge;
-struct net_bridge_port;
-
 extern void brioctl_set(int (*ioctl_hook)(unsigned long));
 extern int (*br_handle_frame_hook)(struct sk_buff *skb);
 extern int (*br_should_route_hook)(struct sk_buff **pskb);
--- diff/include/linux/init.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/init.h	2004-04-21 10:45:35.939239904 +0100
@@ -46,6 +46,8 @@
 #define __exitdata	__attribute__ ((__section__(".exit.data")))
 #define __exit_call	__attribute_used__ __attribute__ ((__section__ (".exitcall.exit")))
 
+#define __sched		__attribute__((__section__(".sched.text")))
+
 #ifdef MODULE
 #define __exit		__attribute__ ((__section__(".exit.text")))
 #else
--- diff/include/linux/init_task.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/linux/init_task.h	2004-04-21 10:45:35.939239904 +0100
@@ -49,6 +49,7 @@
 	.shared_pending	= { 				\
 		.list = LIST_HEAD_INIT(sig.shared_pending.list),	\
 		.signal =  {{0}}}, \
+	.posix_timers	 = LIST_HEAD_INIT(sig.posix_timers),		\
 }
 
 #define INIT_SIGHAND(sighand) {	\
@@ -107,7 +108,6 @@ extern struct group_info init_groups;
 		.list = LIST_HEAD_INIT(tsk.pending.list),		\
 		.signal = {{0}}},					\
 	.blocked	= {{0}},					\
-	.posix_timers	 = LIST_HEAD_INIT(tsk.posix_timers),		\
 	.alloc_lock	= SPIN_LOCK_UNLOCKED,				\
 	.proc_lock	= SPIN_LOCK_UNLOCKED,				\
 	.switch_lock	= SPIN_LOCK_UNLOCKED,				\
--- diff/include/linux/ipmi.h	2003-05-21 11:49:46.000000000 +0100
+++ source/include/linux/ipmi.h	2004-04-21 10:45:35.940239752 +0100
@@ -109,6 +109,35 @@ struct ipmi_ipmb_addr
 	unsigned char lun;
 };
 
+/*
+ * A LAN Address.  This is an address to/from a LAN interface bridged
+ * by the BMC, not an address actually out on the LAN.
+ *
+ * A concious decision was made here to deviate slightly from the IPMI
+ * spec.  We do not use rqSWID and rsSWID like it shows in the
+ * message.  Instead, we use remote_SWID and local_SWID.  This means
+ * that any message (a request or response) from another device will
+ * always have exactly the same address.  If you didn't do this,
+ * requests and responses from the same device would have different
+ * addresses, and that's not too cool.
+ *
+ * In this address, the remote_SWID is always the SWID the remote
+ * message came from, or the SWID we are sending the message to.
+ * local_SWID is always our SWID.  Note that having our SWID in the
+ * message is a little wierd, but this is required.
+ */
+#define IPMI_LAN_ADDR_TYPE		0x04
+struct ipmi_lan_addr
+{
+	int           addr_type;
+	short         channel;
+	unsigned char privilege;
+	unsigned char session_handle;
+	unsigned char remote_SWID;
+	unsigned char local_SWID;
+	unsigned char lun;
+};
+
 
 /*
  * Channel for talking directly with the BMC.  When using this
@@ -145,10 +174,20 @@ struct ipmi_msg
  * Receive types for messages coming from the receive interface.  This
  * is used for the receive in-kernel interface and in the receive
  * IOCTL.
+ *
+ * The "IPMI_RESPONSE_RESPNOSE_TYPE" is a little strange sounding, but
+ * it allows you to get the message results when you send a response
+ * message.
  */
 #define IPMI_RESPONSE_RECV_TYPE		1 /* A response to a command */
 #define IPMI_ASYNC_EVENT_RECV_TYPE	2 /* Something from the event queue */
 #define IPMI_CMD_RECV_TYPE		3 /* A command from somewhere else */
+#define IPMI_RESPONSE_RESPONSE_TYPE	4 /* The response for
+					      a sent response, giving any
+					      error status for sending the
+					      response.  When you send a
+					      response message, this will
+					      be returned. */
 /* Note that async events and received commands do not have a completion
    code as the first byte of the incoming data, unlike a response. */
 
@@ -160,6 +199,7 @@ struct ipmi_msg
  * The in-kernel interface.
  */
 #include <linux/list.h>
+#include <linux/module.h>
 
 /* Opaque type for a IPMI message user.  One of these is needed to
    send and receive messages. */
@@ -185,6 +225,12 @@ struct ipmi_recv_msg
 	long             msgid;
 	struct ipmi_msg  msg;
 
+	/* The user_msg_data is the data supplied when a message was
+	   sent, if this is a response to a sent message.  If this is
+	   not a response to a sent message, then user_msg_data will
+	   be NULL. */
+	void             *user_msg_data;
+
 	/* Call this when done with the message.  It will presumably free
 	   the message and do any other necessary cleanup. */
 	void (*done)(struct ipmi_recv_msg *msg);
@@ -206,9 +252,10 @@ struct ipmi_user_hndl
         /* Routine type to call when a message needs to be routed to
 	   the upper layer.  This will be called with some locks held,
 	   the only IPMI routines that can be called are ipmi_request
-	   and the alloc/free operations. */
+	   and the alloc/free operations.  The handler_data is the
+	   variable supplied when the receive handler was registered. */
 	void (*ipmi_recv_hndl)(struct ipmi_recv_msg *msg,
-			       void                 *handler_data);
+			       void                 *user_msg_data);
 
 	/* Called when the interface detects a watchdog pre-timeout.  If
 	   this is NULL, it will be ignored for the user. */
@@ -221,7 +268,12 @@ int ipmi_create_user(unsigned int       
 		     void                  *handler_data,
 		     ipmi_user_t           *user);
 
-/* Destroy the given user of the IPMI layer. */
+/* Destroy the given user of the IPMI layer.  Note that after this
+   function returns, the system is guaranteed to not call any
+   callbacks for the user.  Thus as long as you destroy all the users
+   before you unload a module, you will be safe.  And if you destroy
+   the users before you destroy the callback structures, it should be
+   safe, too. */
 int ipmi_destroy_user(ipmi_user_t user);
 
 /* Get the IPMI version of the BMC we are talking to. */
@@ -253,20 +305,51 @@ unsigned char ipmi_get_my_LUN(ipmi_user_
  * in the msgid field of the received command.  If the priority is >
  * 0, the message will go into a high-priority queue and be sent
  * first.  Otherwise, it goes into a normal-priority queue.
+ * The user_msg_data field will be returned in any response to this
+ * message.
+ *
+ * Note that if you send a response (with the netfn lower bit set),
+ * you *will* get back a SEND_MSG response telling you what happened
+ * when the response was sent.  You will not get back a response to
+ * the message itself.
  */
 int ipmi_request(ipmi_user_t      user,
 		 struct ipmi_addr *addr,
 		 long             msgid,
 		 struct ipmi_msg  *msg,
+		 void             *user_msg_data,
 		 int              priority);
 
 /*
+ * Like ipmi_request, but lets you specify the number of retries and
+ * the retry time.  The retries is the number of times the message
+ * will be resent if no reply is received.  If set to -1, the default
+ * value will be used.  The retry time is the time in milliseconds
+ * between retries.  If set to zero, the default value will be
+ * used.
+ *
+ * Don't use this unless you *really* have to.  It's primarily for the
+ * IPMI over LAN converter; since the LAN stuff does its own retries,
+ * it makes no sense to do it here.  However, this can be used if you
+ * have unusual requirements.
+ */
+int ipmi_request_settime(ipmi_user_t      user,
+			 struct ipmi_addr *addr,
+			 long             msgid,
+			 struct ipmi_msg  *msg,
+			 void             *user_msg_data,
+			 int              priority,
+			 int              max_retries,
+			 unsigned int     retry_time_ms);
+
+/*
  * Like ipmi_request, but lets you specify the slave return address.
  */
 int ipmi_request_with_source(ipmi_user_t      user,
 			     struct ipmi_addr *addr,
 			     long             msgid,
 			     struct ipmi_msg  *msg,
+			     void             *user_msg_data,
 			     int              priority,
 			     unsigned char    source_address,
 			     unsigned char    source_lun);
@@ -284,6 +367,7 @@ int ipmi_request_supply_msgs(ipmi_user_t
 			     struct ipmi_addr     *addr,
 			     long                 msgid,
 			     struct ipmi_msg      *msg,
+			     void                 *user_msg_data,
 			     void                 *supplied_smi,
 			     struct ipmi_recv_msg *supplied_recv,
 			     int                  priority);
@@ -331,6 +415,10 @@ struct ipmi_smi_watcher
 {
 	struct list_head link;
 
+	/* You must set the owner to the current module, if you are in
+	   a module (generally just set it to "THIS_MODULE"). */
+	struct module *owner;
+
 	/* These two are called with read locks held for the interface
 	   the watcher list.  So you can add and remove users from the
 	   IPMI interface, send messages, etc., but you cannot add
@@ -422,6 +510,29 @@ struct ipmi_req
 #define IPMICTL_SEND_COMMAND		_IOR(IPMI_IOC_MAGIC, 13,	\
 					     struct ipmi_req)
 
+/* Messages sent to the interface with timing parameters are this
+   format. */
+struct ipmi_req_settime
+{
+	struct ipmi_req req;
+
+	/* See ipmi_request_settime() above for details on these
+           values. */
+	int          retries;
+	unsigned int retry_time_ms;
+};
+/*
+ * Send a message to the interfaces with timing parameters.  error values
+ * are:
+ *   - EFAULT - an address supplied was invalid.
+ *   - EINVAL - The address supplied was not valid, or the command
+ *              was not allowed.
+ *   - EMSGSIZE - The message to was too large.
+ *   - ENOMEM - Buffers could not be allocated for the command.
+ */
+#define IPMICTL_SEND_COMMAND_SETTIME	_IOR(IPMI_IOC_MAGIC, 21,	\
+					     struct ipmi_req_settime)
+
 /* Messages received from the interface are this format. */
 struct ipmi_recv
 {
@@ -513,4 +624,18 @@ struct ipmi_cmdspec
 #define IPMICTL_SET_MY_LUN_CMD		_IOR(IPMI_IOC_MAGIC, 19, unsigned int)
 #define IPMICTL_GET_MY_LUN_CMD		_IOR(IPMI_IOC_MAGIC, 20, unsigned int)
 
+/*
+ * Get/set the default timing values for an interface.  You shouldn't
+ * generally mess with these.
+ */
+struct ipmi_timing_parms
+{
+	int          retries;
+	unsigned int retry_time_ms;
+};
+#define IPMICTL_SET_TIMING_PARMS_CMD	_IOR(IPMI_IOC_MAGIC, 22, \
+					     struct ipmi_timing_parms)
+#define IPMICTL_GET_TIMING_PARMS_CMD	_IOR(IPMI_IOC_MAGIC, 23, \
+					     struct ipmi_timing_parms)
+
 #endif /* __LINUX_IPMI_H */
--- diff/include/linux/ipmi_msgdefs.h	2003-10-27 09:20:39.000000000 +0000
+++ source/include/linux/ipmi_msgdefs.h	2004-04-21 10:45:35.941239600 +0100
@@ -53,6 +53,7 @@
 #define IPMI_SET_BMC_GLOBAL_ENABLES_CMD	0x2e
 #define IPMI_GET_BMC_GLOBAL_ENABLES_CMD	0x2f
 #define IPMI_READ_EVENT_MSG_BUFFER_CMD	0x35
+#define IPMI_GET_CHANNEL_INFO_CMD	0x42
 
 #define IPMI_NETFN_STORAGE_REQUEST		0x0a
 #define IPMI_NETFN_STORAGE_RESPONSE		0x0b
@@ -61,8 +62,39 @@
 /* The default slave address */
 #define IPMI_BMC_SLAVE_ADDR	0x20
 
-#define IPMI_MAX_MSG_LENGTH	80
+/* The BT interface on high-end HP systems supports up to 255 bytes in
+ * one transfer.  Its "virtual" BMC supports some commands that are longer
+ * than 128 bytes.  Use the full 256, plus NetFn/LUN, Cmd, cCode, plus
+ * some overhead.  It would be nice to base this on the "BT Capabilities"
+ * but that's too hard to propogate to the rest of the driver. */
+#define IPMI_MAX_MSG_LENGTH	272	/* multiple of 16 */
 
-#define IPMI_CC_NO_ERROR	0
+#define IPMI_CC_NO_ERROR		0x00
+#define IPMI_NODE_BUSY_ERR		0xc0
+#define IPMI_ERR_MSG_TRUNCATED		0xc6
+#define IPMI_LOST_ARBITRATION_ERR	0x81
+#define IPMI_ERR_UNSPECIFIED		0xff
+
+#define IPMI_CHANNEL_PROTOCOL_IPMB	1
+#define IPMI_CHANNEL_PROTOCOL_ICMB	2
+#define IPMI_CHANNEL_PROTOCOL_SMBUS	4
+#define IPMI_CHANNEL_PROTOCOL_KCS	5
+#define IPMI_CHANNEL_PROTOCOL_SMIC	6
+#define IPMI_CHANNEL_PROTOCOL_BT10	7
+#define IPMI_CHANNEL_PROTOCOL_BT15	8
+#define IPMI_CHANNEL_PROTOCOL_TMODE	9
+
+#define IPMI_CHANNEL_MEDIUM_IPMB	1
+#define IPMI_CHANNEL_MEDIUM_ICMB10	2
+#define IPMI_CHANNEL_MEDIUM_ICMB09	3
+#define IPMI_CHANNEL_MEDIUM_8023LAN	4
+#define IPMI_CHANNEL_MEDIUM_ASYNC	5
+#define IPMI_CHANNEL_MEDIUM_OTHER_LAN	6
+#define IPMI_CHANNEL_MEDIUM_PCI_SMBUS	7
+#define IPMI_CHANNEL_MEDIUM_SMBUS1	8
+#define IPMI_CHANNEL_MEDIUM_SMBUS2	9
+#define IPMI_CHANNEL_MEDIUM_USB1	10
+#define IPMI_CHANNEL_MEDIUM_USB2	11
+#define IPMI_CHANNEL_MEDIUM_SYSINTF	12
 
 #endif /* __LINUX_IPMI_MSGDEFS_H */
--- diff/include/linux/ipmi_smi.h	2003-02-26 16:01:09.000000000 +0000
+++ source/include/linux/ipmi_smi.h	2004-04-21 10:45:35.941239600 +0100
@@ -35,6 +35,8 @@
 #define __LINUX_IPMI_SMI_H
 
 #include <linux/ipmi_msgdefs.h>
+#include <linux/proc_fs.h>
+#include <linux/module.h>
 
 /* This files describes the interface for IPMI system management interface
    drivers to bind into the IPMI message handler. */
@@ -48,7 +50,7 @@ typedef struct ipmi_smi *ipmi_smi_t;
  * been received, it will report this same data structure back up to
  * the upper layer.  If an error occurs, it should fill in the
  * response with an error code in the completion code location. When
- * asyncronous data is received, one of these is allocated, the
+ * asynchronous data is received, one of these is allocated, the
  * data_size is set to zero and the response holds the data from the
  * get message or get event command that the interface initiated.
  * Note that it is the interfaces responsibility to detect
@@ -62,9 +64,6 @@ struct ipmi_smi_msg
 	long    msgid;
 	void    *user_data;
 
-	/* If 0, add to the end of the queue.  If 1, add to the beginning. */
-	int     prio;
-
 	int           data_size;
 	unsigned char data[IPMI_MAX_MSG_LENGTH];
 
@@ -134,4 +133,11 @@ static inline void ipmi_free_smi_msg(str
 	msg->done(msg);
 }
 
+/* Allow the lower layer to add things to the proc filesystem
+   directory for this interface.  Note that the entry will
+   automatically be dstroyed when the interface is destroyed. */
+int ipmi_smi_add_proc_entry(ipmi_smi_t smi, char *name,
+			    read_proc_t *read_proc, write_proc_t *write_proc,
+			    void *data, struct module *owner);
+
 #endif /* __LINUX_IPMI_SMI_H */
--- diff/include/linux/irq.h	2003-08-26 10:00:54.000000000 +0100
+++ source/include/linux/irq.h	2004-04-21 10:45:35.941239600 +0100
@@ -71,7 +71,6 @@ extern irq_desc_t irq_desc [NR_IRQS];
 
 #include <asm/hw_irq.h> /* the arch dependent stuff */
 
-extern int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
 extern int setup_irq(unsigned int , struct irqaction * );
 
 extern hw_irq_controller no_irq_type;  /* needed in every arch ? */
--- diff/include/linux/jbd.h	2003-07-22 18:54:27.000000000 +0100
+++ source/include/linux/jbd.h	2004-04-21 10:45:35.942239448 +0100
@@ -42,6 +42,11 @@
  */
 #undef JBD_PARANOID_IOFAIL
 
+/*
+ * The default maximum commit age, in seconds.
+ */
+#define JBD_DEFAULT_MAX_COMMIT_AGE 5
+
 #ifdef CONFIG_JBD_DEBUG
 /*
  * Define JBD_EXPENSIVE_CHECKING to enable more expensive internal
@@ -300,6 +305,10 @@ BUFFER_FNS(JBD, jbd)
 BUFFER_FNS(JWrite, jwrite)
 BUFFER_FNS(JBDDirty, jbddirty)
 TAS_BUFFER_FNS(JBDDirty, jbddirty)
+BUFFER_FNS(Revoked, revoked)
+TAS_BUFFER_FNS(Revoked, revoked)
+BUFFER_FNS(RevokeValid, revokevalid)
+TAS_BUFFER_FNS(RevokeValid, revokevalid)
 BUFFER_FNS(Freed, freed)
 
 static inline struct buffer_head *jh2bh(struct journal_head *jh)
@@ -487,6 +496,12 @@ struct transaction_s 
 	struct journal_head	*t_reserved_list;
 
 	/*
+	 * Doubly-linked circular list of all buffers under writeout during
+	 * commit [j_list_lock]
+	 */
+	struct journal_head	*t_locked_list;
+
+	/*
 	 * Doubly-linked circular list of all metadata buffers owned by this
 	 * transaction [j_list_lock]
 	 */
@@ -1001,10 +1016,10 @@ extern int	cleanup_journal_tail(journal_
 /* Debugging code only: */
 
 #define jbd_ENOSYS() \
-do {								      \
-	printk (KERN_ERR "JBD unimplemented function " __FUNCTION__); \
-	current->state = TASK_UNINTERRUPTIBLE;			      \
-	schedule();						      \
+do {								           \
+	printk (KERN_ERR "JBD unimplemented function %s\n", __FUNCTION__); \
+	current->state = TASK_UNINTERRUPTIBLE;			           \
+	schedule();						           \
 } while (1)
 
 /*
@@ -1079,7 +1094,8 @@ static inline int jbd_space_needed(journ
 #define BJ_Shadow	5	/* Buffer contents being shadowed to the log */
 #define BJ_LogCtl	6	/* Buffer contains log descriptors */
 #define BJ_Reserved	7	/* Buffer is reserved for access by journal */
-#define BJ_Types	8
+#define BJ_Locked	8	/* Locked for I/O during commit */
+#define BJ_Types	9
  
 extern int jbd_blocks_per_page(struct inode *inode);
 
--- diff/include/linux/kernel.h	2004-03-11 10:20:29.000000000 +0000
+++ source/include/linux/kernel.h	2004-04-21 10:45:35.943239296 +0100
@@ -109,9 +109,15 @@ static inline void console_verbose(void)
 extern void bust_spinlocks(int yes);
 extern int oops_in_progress;		/* If set, an oops, panic(), BUG() or die() is in progress */
 extern int panic_on_oops;
-extern int system_running;
+extern int system_state;		/* See values below */
 extern int tainted;
 extern const char *print_tainted(void);
+
+/* Values used for system_state */
+#define SYSTEM_BOOTING 0
+#define SYSTEM_RUNNING 1
+#define SYSTEM_SHUTDOWN 2
+
 #define TAINT_PROPRIETARY_MODULE	(1<<0)
 #define TAINT_FORCED_MODULE		(1<<1)
 #define TAINT_UNSAFE_SMP		(1<<2)
--- diff/include/linux/kernelcapi.h	2002-10-16 04:27:18.000000000 +0100
+++ source/include/linux/kernelcapi.h	2004-04-21 10:45:35.943239296 +0100
@@ -10,10 +10,8 @@
 #ifndef __KERNELCAPI_H__
 #define __KERNELCAPI_H__
 
-#include <linux/list.h>
-
-#define CAPI_MAXAPPL	128	/* maximum number of applications  */
-#define CAPI_MAXCONTR	16	/* maximum number of controller    */
+#define CAPI_MAXAPPL	240	/* maximum number of applications  */
+#define CAPI_MAXCONTR	32	/* maximum number of controller    */
 #define CAPI_MAXDATAWINDOW	8
 
 
@@ -47,6 +45,7 @@ typedef struct kcapi_carddef {
 
 #ifdef __KERNEL__
 
+#include <linux/list.h>
 #include <linux/skbuff.h>
 
 #define	KCI_CONTRUP	0	/* arg: struct capi_profile */
@@ -63,6 +62,10 @@ struct capi20_appl {
 	unsigned long nrecvdatapkt;
 	unsigned long nsentctlpkt;
 	unsigned long nsentdatapkt;
+	struct semaphore recv_sem;
+	struct sk_buff_head recv_queue;
+	struct work_struct recv_work;
+	int release_in_progress;
 
 	/* ugly hack to allow for notification of added/removed
 	 * controllers. The Right Way (tm) is known. XXX
--- diff/include/linux/libata.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/libata.h	2004-04-21 10:45:35.943239296 +0100
@@ -107,12 +107,6 @@ enum {
 	ATA_FLAG_MMIO		= (1 << 6), /* use MMIO, not PIO */
 	ATA_FLAG_SATA_RESET	= (1 << 7), /* use COMRESET */
 
-	/* struct ata_taskfile flags */
-	ATA_TFLAG_LBA48		= (1 << 0),
-	ATA_TFLAG_ISADDR	= (1 << 1), /* enable r/w to nsect/lba regs */
-	ATA_TFLAG_DEVICE	= (1 << 2), /* enable r/w to device reg */
-
-	ATA_QCFLAG_WRITE	= (1 << 0), /* read==0, write==1 */
 	ATA_QCFLAG_ACTIVE	= (1 << 1), /* cmd not yet ack'd to scsi lyer */
 	ATA_QCFLAG_DMA		= (1 << 2), /* data delivered via DMA */
 	ATA_QCFLAG_ATAPI	= (1 << 3), /* is ATAPI packet command? */
@@ -223,29 +217,6 @@ struct ata_host_set {
 	struct ata_port *	ports[0];
 };
 
-struct ata_taskfile {
-	unsigned long		flags;		/* ATA_TFLAG_xxx */
-	u8			protocol;	/* ATA_PROT_xxx */
-
-	u8			ctl;		/* control reg */
-
-	u8			hob_feature;	/* additional data */
-	u8			hob_nsect;	/* to support LBA48 */
-	u8			hob_lbal;
-	u8			hob_lbam;
-	u8			hob_lbah;
-
-	u8			feature;
-	u8			nsect;
-	u8			lbal;
-	u8			lbam;
-	u8			lbah;
-
-	u8			device;
-
-	u8			command;	/* IO operation */
-};
-
 struct ata_queued_cmd {
 	struct ata_port		*ap;
 	struct ata_device	*dev;
@@ -293,6 +264,11 @@ struct ata_device {
 						 * ATAPI7 spec size, 40 ASCII
 						 * characters
 						 */
+
+	/* cache info about current transfer mode */
+	u8			xfer_protocol;	/* taskfile xfer protocol */
+	u8			read_cmd;	/* opcode to use on read */
+	u8			write_cmd;	/* opcode to use on write */
 };
 
 struct ata_engine {
@@ -408,7 +384,6 @@ extern int ata_scsi_detect(Scsi_Host_Tem
 extern int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *));
 extern int ata_scsi_error(struct Scsi_Host *host);
 extern int ata_scsi_release(struct Scsi_Host *host);
-extern int ata_scsi_slave_config(struct scsi_device *sdev);
 extern unsigned int ata_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc);
 /*
  * Default driver ops implementations
@@ -433,6 +408,7 @@ extern void ata_eng_timeout(struct ata_p
 extern int ata_std_bios_param(struct scsi_device *sdev,
 			      struct block_device *bdev,
 			      sector_t capacity, int geom[]);
+extern int ata_scsi_slave_config(struct scsi_device *sdev);
 
 
 static inline unsigned long msecs_to_jiffies(unsigned long msecs)
--- diff/include/linux/list.h	2004-02-18 08:54:13.000000000 +0000
+++ source/include/linux/list.h	2004-04-21 10:45:35.944239144 +0100
@@ -39,7 +39,7 @@ struct list_head {
 } while (0)
 
 /*
- * Insert a new entry between two known consecutive entries. 
+ * Insert a new entry between two known consecutive entries.
  *
  * This is only for internal list manipulation where we know
  * the prev/next entries already!
@@ -81,14 +81,13 @@ static inline void list_add_tail(struct 
 }
 
 /*
- * Insert a new entry between two known consecutive entries. 
+ * Insert a new entry between two known consecutive entries.
  *
  * This is only for internal list manipulation where we know
  * the prev/next entries already!
  */
-static __inline__ void __list_add_rcu(struct list_head * new,
-	struct list_head * prev,
-	struct list_head * next)
+static inline void __list_add_rcu(struct list_head * new,
+		struct list_head * prev, struct list_head * next)
 {
 	new->next = next;
 	new->prev = prev;
@@ -104,8 +103,16 @@ static __inline__ void __list_add_rcu(st
  *
  * Insert a new entry after the specified head.
  * This is good for implementing stacks.
+ *
+ * The caller must take whatever precautions are necessary
+ * (such as holding appropriate locks) to avoid racing
+ * with another list-mutation primitive, such as list_add_rcu()
+ * or list_del_rcu(), running on this same list.
+ * However, it is perfectly legal to run concurrently with
+ * the _rcu list-traversal primitives, such as
+ * list_for_each_entry_rcu().
  */
-static __inline__ void list_add_rcu(struct list_head *new, struct list_head *head)
+static inline void list_add_rcu(struct list_head *new, struct list_head *head)
 {
 	__list_add_rcu(new, head, head->next);
 }
@@ -117,8 +124,17 @@ static __inline__ void list_add_rcu(stru
  *
  * Insert a new entry before the specified head.
  * This is useful for implementing queues.
+ *
+ * The caller must take whatever precautions are necessary
+ * (such as holding appropriate locks) to avoid racing
+ * with another list-mutation primitive, such as list_add_tail_rcu()
+ * or list_del_rcu(), running on this same list.
+ * However, it is perfectly legal to run concurrently with
+ * the _rcu list-traversal primitives, such as
+ * list_for_each_entry_rcu().
  */
-static __inline__ void list_add_tail_rcu(struct list_head *new, struct list_head *head)
+static inline void list_add_tail_rcu(struct list_head *new,
+					struct list_head *head)
 {
 	__list_add_rcu(new, head->prev, head);
 }
@@ -153,12 +169,25 @@ static inline void list_del(struct list_
  * list_del_rcu - deletes entry from list without re-initialization
  * @entry: the element to delete from the list.
  *
- * Note: list_empty on entry does not return true after this, 
+ * Note: list_empty on entry does not return true after this,
  * the entry is in an undefined state. It is useful for RCU based
  * lockfree traversal.
  *
- * In particular, it means that we can not poison the forward 
+ * In particular, it means that we can not poison the forward
  * pointers that may still be used for walking the list.
+ *
+ * The caller must take whatever precautions are necessary
+ * (such as holding appropriate locks) to avoid racing
+ * with another list-mutation primitive, such as list_del_rcu()
+ * or list_add_rcu(), running on this same list.
+ * However, it is perfectly legal to run concurrently with
+ * the _rcu list-traversal primitives, such as
+ * list_for_each_entry_rcu().
+ *
+ * Note that the caller is not permitted to immediately free
+ * the newly deleted entry.  Instead, either synchronize_kernel()
+ * or call_rcu() must be used to defer freeing until an RCU
+ * grace period has elapsed.
  */
 static inline void list_del_rcu(struct list_head *entry)
 {
@@ -173,7 +202,7 @@ static inline void list_del_rcu(struct l
 static inline void list_del_init(struct list_head *entry)
 {
 	__list_del(entry->prev, entry->next);
-	INIT_LIST_HEAD(entry); 
+	INIT_LIST_HEAD(entry);
 }
 
 /**
@@ -306,7 +335,7 @@ static inline void list_splice_init(stru
 #define list_for_each_prev(pos, head) \
 	for (pos = (head)->prev, prefetch(pos->prev); pos != (head); \
         	pos = pos->prev, prefetch(pos->prev))
-        	
+
 /**
  * list_for_each_safe	-	iterate over a list safe against removal of list entry
  * @pos:	the &struct list_head to use as a loop counter.
@@ -384,21 +413,29 @@ static inline void list_splice_init(stru
  * list_for_each_rcu	-	iterate over an rcu-protected list
  * @pos:	the &struct list_head to use as a loop counter.
  * @head:	the head for your list.
+ *
+ * This list-traversal primitive may safely run concurrently with
+ * the _rcu list-mutation primitives such as list_add_rcu()
+ * as long as the traversal is guarded by rcu_read_lock().
  */
 #define list_for_each_rcu(pos, head) \
 	for (pos = (head)->next, prefetch(pos->next); pos != (head); \
         	pos = pos->next, ({ smp_read_barrier_depends(); 0;}), prefetch(pos->next))
-        	
+
 #define __list_for_each_rcu(pos, head) \
 	for (pos = (head)->next; pos != (head); \
         	pos = pos->next, ({ smp_read_barrier_depends(); 0;}))
-        	
+
 /**
  * list_for_each_safe_rcu	-	iterate over an rcu-protected list safe
  *					against removal of list entry
  * @pos:	the &struct list_head to use as a loop counter.
  * @n:		another &struct list_head to use as temporary storage
  * @head:	the head for your list.
+ *
+ * This list-traversal primitive may safely run concurrently with
+ * the _rcu list-mutation primitives such as list_add_rcu()
+ * as long as the traversal is guarded by rcu_read_lock().
  */
 #define list_for_each_safe_rcu(pos, n, head) \
 	for (pos = (head)->next, n = pos->next; pos != (head); \
@@ -409,6 +446,10 @@ static inline void list_splice_init(stru
  * @pos:	the type * to use as a loop counter.
  * @head:	the head for your list.
  * @member:	the name of the list_struct within the struct.
+ *
+ * This list-traversal primitive may safely run concurrently with
+ * the _rcu list-mutation primitives such as list_add_rcu()
+ * as long as the traversal is guarded by rcu_read_lock().
  */
 #define list_for_each_entry_rcu(pos, head, member)			\
 	for (pos = list_entry((head)->next, typeof(*pos), member),	\
@@ -420,55 +461,59 @@ static inline void list_splice_init(stru
 
 
 /**
- * list_for_each_continue_rcu	-	iterate over an rcu-protected list 
+ * list_for_each_continue_rcu	-	iterate over an rcu-protected list
  *			continuing after existing point.
  * @pos:	the &struct list_head to use as a loop counter.
  * @head:	the head for your list.
+ *
+ * This list-traversal primitive may safely run concurrently with
+ * the _rcu list-mutation primitives such as list_add_rcu()
+ * as long as the traversal is guarded by rcu_read_lock().
  */
 #define list_for_each_continue_rcu(pos, head) \
 	for ((pos) = (pos)->next, prefetch((pos)->next); (pos) != (head); \
         	(pos) = (pos)->next, ({ smp_read_barrier_depends(); 0;}), prefetch((pos)->next))
 
-/* 
- * Double linked lists with a single pointer list head. 
- * Mostly useful for hash tables where the two pointer list head is 
+/*
+ * Double linked lists with a single pointer list head.
+ * Mostly useful for hash tables where the two pointer list head is
  * too wasteful.
  * You lose the ability to access the tail in O(1).
- */ 
-
-struct hlist_head { 
-	struct hlist_node *first; 
-}; 
+ */
 
-struct hlist_node { 
-	struct hlist_node *next, **pprev; 
-}; 
+struct hlist_head {
+	struct hlist_node *first;
+};
+
+struct hlist_node {
+	struct hlist_node *next, **pprev;
+};
 
-#define HLIST_HEAD_INIT { .first = NULL } 
+#define HLIST_HEAD_INIT { .first = NULL }
 #define HLIST_HEAD(name) struct hlist_head name = {  .first = NULL }
-#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL) 
+#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL)
 #define INIT_HLIST_NODE(ptr) ((ptr)->next = NULL, (ptr)->pprev = NULL)
 
-static __inline__ int hlist_unhashed(const struct hlist_node *h) 
-{ 
+static inline int hlist_unhashed(const struct hlist_node *h)
+{
 	return !h->pprev;
-} 
+}
 
-static __inline__ int hlist_empty(const struct hlist_head *h) 
-{ 
+static inline int hlist_empty(const struct hlist_head *h)
+{
 	return !h->first;
-} 
+}
 
-static __inline__ void __hlist_del(struct hlist_node *n) 
+static inline void __hlist_del(struct hlist_node *n)
 {
 	struct hlist_node *next = n->next;
 	struct hlist_node **pprev = n->pprev;
-	*pprev = next;  
-	if (next) 
+	*pprev = next;
+	if (next)
 		next->pprev = pprev;
-}  
+}
 
-static __inline__ void hlist_del(struct hlist_node *n)
+static inline void hlist_del(struct hlist_node *n)
 {
 	__hlist_del(n);
 	n->next = LIST_POISON1;
@@ -479,12 +524,20 @@ static __inline__ void hlist_del(struct 
  * hlist_del_rcu - deletes entry from hash list without re-initialization
  * @n: the element to delete from the hash list.
  *
- * Note: list_unhashed() on entry does not return true after this, 
+ * Note: list_unhashed() on entry does not return true after this,
  * the entry is in an undefined state. It is useful for RCU based
  * lockfree traversal.
  *
  * In particular, it means that we can not poison the forward
  * pointers that may still be used for walking the hash list.
+ *
+ * The caller must take whatever precautions are necessary
+ * (such as holding appropriate locks) to avoid racing
+ * with another list-mutation primitive, such as hlist_add_head_rcu()
+ * or hlist_del_rcu(), running on this same list.
+ * However, it is perfectly legal to run concurrently with
+ * the _rcu list-traversal primitives, such as
+ * hlist_for_each_entry().
  */
 static inline void hlist_del_rcu(struct hlist_node *n)
 {
@@ -492,52 +545,77 @@ static inline void hlist_del_rcu(struct 
 	n->pprev = LIST_POISON2;
 }
 
-static __inline__ void hlist_del_init(struct hlist_node *n) 
+static inline void hlist_del_init(struct hlist_node *n)
 {
 	if (n->pprev)  {
 		__hlist_del(n);
 		INIT_HLIST_NODE(n);
 	}
-}  
+}
 
 #define hlist_del_rcu_init hlist_del_init
 
-static __inline__ void hlist_add_head(struct hlist_node *n, struct hlist_head *h) 
-{ 
+static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
+{
 	struct hlist_node *first = h->first;
-	n->next = first; 
-	if (first) 
+	n->next = first;
+	if (first)
 		first->pprev = &n->next;
-	h->first = n; 
-	n->pprev = &h->first; 
-} 
+	h->first = n;
+	n->pprev = &h->first;
+}
+
 
-static __inline__ void hlist_add_head_rcu(struct hlist_node *n, struct hlist_head *h) 
-{ 
+/**
+ * hlist_add_head_rcu - adds the specified element to the specified hlist,
+ * while permitting racing traversals.
+ * @n: the element to add to the hash list.
+ * @h: the list to add to.
+ *
+ * The caller must take whatever precautions are necessary
+ * (such as holding appropriate locks) to avoid racing
+ * with another list-mutation primitive, such as hlist_add_head_rcu()
+ * or hlist_del_rcu(), running on this same list.
+ * However, it is perfectly legal to run concurrently with
+ * the _rcu list-traversal primitives, such as
+ * hlist_for_each_entry(), but only if smp_read_barrier_depends()
+ * is used to prevent memory-consistency problems on Alpha CPUs.
+ * Regardless of the type of CPU, the list-traversal primitive
+ * must be guarded by rcu_read_lock().
+ *
+ * OK, so why don't we have an hlist_for_each_entry_rcu()???
+ */
+static inline void hlist_add_head_rcu(struct hlist_node *n,
+					struct hlist_head *h)
+{
 	struct hlist_node *first = h->first;
 	n->next = first;
-	n->pprev = &h->first; 
+	n->pprev = &h->first;
 	smp_wmb();
-	if (first) 
+	if (first)
 		first->pprev = &n->next;
-	h->first = n; 
-} 
+	h->first = n;
+}
 
 /* next must be != NULL */
-static __inline__ void hlist_add_before(struct hlist_node *n, struct hlist_node *next)
+static inline void hlist_add_before(struct hlist_node *n,
+					struct hlist_node *next)
 {
 	n->pprev = next->pprev;
-	n->next = next; 
-	next->pprev = &n->next; 
+	n->next = next;
+	next->pprev = &n->next;
 	*(n->pprev) = n;
 }
 
-static __inline__ void hlist_add_after(struct hlist_node *n,
-				       struct hlist_node *next)
+static inline void hlist_add_after(struct hlist_node *n,
+					struct hlist_node *next)
 {
-	next->next	= n->next;
-	*(next->pprev)	= n;
-	n->next		= next;
+	next->next = n->next;
+	n->next = next;
+	next->pprev = &n->next;
+
+	if(next->next)
+		next->next->pprev  = &next->next;
 }
 
 #define hlist_entry(ptr, type, member) container_of(ptr,type,member)
@@ -545,7 +623,7 @@ static __inline__ void hlist_add_after(s
 /* Cannot easily do prefetch unfortunately */
 #define hlist_for_each(pos, head) \
 	for (pos = (head)->first; pos && ({ prefetch(pos->next); 1; }); \
-	     pos = pos->next) 
+	     pos = pos->next)
 
 #define hlist_for_each_safe(pos, n, head) \
 	for (pos = (head)->first; n = pos ? pos->next : 0, pos; \
--- diff/include/linux/mm.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/mm.h	2004-04-21 10:45:35.945238992 +0100
@@ -180,9 +180,8 @@ struct page {
 	page_flags_t flags;		/* atomic flags, some possibly
 					   updated asynchronously */
 	atomic_t count;			/* Usage count, see below. */
-	struct list_head list;		/* ->mapping has some page lists. */
 	struct address_space *mapping;	/* The inode (or ...) we belong to. */
-	unsigned long index;		/* Our offset within mapping. */
+	pgoff_t index;			/* Our offset within mapping. */
 	struct list_head lru;		/* Pageout list, eg. active_list;
 					   protected by zone->lru_lock !! */
 	union {
@@ -190,8 +189,11 @@ struct page {
 					 * protected by PG_chainlock */
 		pte_addr_t direct;
 	} pte;
-	unsigned long private;		/* mapping-private opaque data */
-
+	unsigned long private;		/* Mapping-private opaque data:
+					 * usually used for buffer_heads
+					 * if PagePrivate set; used for
+					 * swp_entry_t if PageSwapCache
+					 */
 	/*
 	 * On machines where all RAM is mapped into kernel address space,
 	 * we can simply calculate the virtual address. On machines with
@@ -242,33 +244,18 @@ extern void FASTCALL(__page_cache_releas
 static inline int page_count(struct page *p)
 {
 	if (PageCompound(p))
-		p = (struct page *)p->lru.next;
+		p = (struct page *)p->private;
 	return atomic_read(&(p)->count);
 }
 
 static inline void get_page(struct page *page)
 {
-	if (PageCompound(page))
-		page = (struct page *)page->lru.next;
+	if (unlikely(PageCompound(page)))
+		page = (struct page *)page->private;
 	atomic_inc(&page->count);
 }
 
-static inline void put_page(struct page *page)
-{
-	if (PageCompound(page)) {
-		page = (struct page *)page->lru.next;
-		if (put_page_testzero(page)) {
-			if (page->lru.prev) {	/* destructor? */
-				(*(void (*)(struct page *))page->lru.prev)(page);
-			} else {
-				__page_cache_release(page);
-			}
-		}
-		return;
-	}
-	if (!PageReserved(page) && put_page_testzero(page))
-		__page_cache_release(page);
-}
+void put_page(struct page *page);
 
 #else		/* CONFIG_HUGETLB_PAGE */
 
@@ -349,7 +336,7 @@ static inline unsigned long page_zonenum
 {
 	return (page->flags >> NODEZONE_SHIFT) & (~(~0UL << ZONES_SHIFT));
 }
-static inline unsigned long page_nodenum(struct page *page)
+static inline unsigned long page_to_nid(struct page *page)
 {
 	return (page->flags >> (NODEZONE_SHIFT + ZONES_SHIFT));
 }
@@ -404,6 +391,19 @@ void page_address_init(void);
 #endif
 
 /*
+ * On an anonymous page mapped into a user virtual memory area,
+ * page->mapping points to its anon_vma, not to a struct address_space.
+ *
+ * Please note that, confusingly, "page_mapping" refers to the inode
+ * address_space which maps the page from disk; whereas "page_mapped"
+ * refers to user virtual address space into which the page is mapped.
+ */
+static inline struct address_space *page_mapping(struct page *page)
+{
+	return PageAnon(page)? NULL: page->mapping;
+}
+
+/*
  * Return true if this page is mapped into pagetables.  Subtle: test pte.direct
  * rather than pte.chain.  Because sometimes pte.direct is 64-bit, and .chain
  * is only 32-bit.
@@ -439,22 +439,36 @@ struct file *shmem_file_setup(char * nam
 void shmem_lock(struct file * file, int lock);
 int shmem_zero_setup(struct vm_area_struct *);
 
+/*
+ * Parameter block passed down to zap_pte_range in exceptional cases.
+ */
+struct zap_details {
+	struct vm_area_struct *nonlinear_vma;	/* Check page->index if set */
+	struct address_space *check_mapping;	/* Check page->mapping if set */
+	pgoff_t	first_index;			/* Lowest page->index to unmap */
+	pgoff_t last_index;			/* Highest page->index to unmap */
+};
+
 void zap_page_range(struct vm_area_struct *vma, unsigned long address,
-			unsigned long size);
+		unsigned long size, struct zap_details *);
 int unmap_vmas(struct mmu_gather **tlbp, struct mm_struct *mm,
 		struct vm_area_struct *start_vma, unsigned long start_addr,
-		unsigned long end_addr, unsigned long *nr_accounted);
-void unmap_page_range(struct mmu_gather *tlb, struct vm_area_struct *vma,
-			unsigned long address, unsigned long size);
+		unsigned long end_addr, unsigned long *nr_accounted,
+		struct zap_details *);
 void clear_page_tables(struct mmu_gather *tlb, unsigned long first, int nr);
 int copy_page_range(struct mm_struct *dst, struct mm_struct *src,
 			struct vm_area_struct *vma);
 int zeromap_page_range(struct vm_area_struct *vma, unsigned long from,
 			unsigned long size, pgprot_t prot);
+void unmap_mapping_range(struct address_space *mapping,
+		loff_t const holebegin, loff_t const holelen, int even_cows);
+
+static inline void unmap_shared_mapping_range(struct address_space *mapping,
+		loff_t const holebegin, loff_t const holelen)
+{
+	unmap_mapping_range(mapping, holebegin, holelen, 0);
+}
 
-extern void invalidate_mmap_range(struct address_space *mapping,
-				  loff_t const holebegin,
-				  loff_t const holelen);
 extern int vmtruncate(struct inode * inode, loff_t offset);
 extern pmd_t *FASTCALL(__pmd_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address));
 extern pte_t *FASTCALL(pte_alloc_kernel(struct mm_struct *mm, pmd_t *pmd, unsigned long address));
@@ -472,7 +486,9 @@ int get_user_pages(struct task_struct *t
 
 int __set_page_dirty_buffers(struct page *page);
 int __set_page_dirty_nobuffers(struct page *page);
+int FASTCALL(set_page_dirty(struct page *page));
 int set_page_dirty_lock(struct page *page);
+int clear_page_dirty_for_io(struct page *page);
 
 /*
  * Prototype to add a shrinker callback for ageable caches.
@@ -498,23 +514,6 @@ extern struct shrinker *set_shrinker(int
 extern void remove_shrinker(struct shrinker *shrinker);
 
 /*
- * If the mapping doesn't provide a set_page_dirty a_op, then
- * just fall through and assume that it wants buffer_heads.
- * FIXME: make the method unconditional.
- */
-static inline int set_page_dirty(struct page *page)
-{
-	if (page->mapping) {
-		int (*spd)(struct page *);
-
-		spd = page->mapping->a_ops->set_page_dirty;
-		if (spd)
-			return (*spd)(page);
-	}
-	return __set_page_dirty_buffers(page);
-}
-
-/*
  * On a two-level page table, this ends up being trivial. Thus the
  * inlining and the symmetry break with pte_alloc_map() that does all
  * of this out-of-line.
@@ -541,6 +540,8 @@ extern void si_meminfo_node(struct sysin
 extern void insert_vm_struct(struct mm_struct *, struct vm_area_struct *);
 extern void __vma_link_rb(struct mm_struct *, struct vm_area_struct *,
 	struct rb_node **, struct rb_node *);
+extern struct vm_area_struct *copy_vma(struct vm_area_struct **,
+	unsigned long addr, unsigned long len, unsigned long pgoff);
 extern void exit_mmap(struct mm_struct *);
 
 extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
--- diff/include/linux/mmzone.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/mmzone.h	2004-04-21 10:45:35.946238840 +0100
@@ -54,6 +54,15 @@ struct per_cpu_pageset {
 	struct per_cpu_pages pcp[2];	/* 0: hot.  1: cold */
 } ____cacheline_aligned_in_smp;
 
+#define ZONE_DMA		0
+#define ZONE_NORMAL		1
+#define ZONE_HIGHMEM		2
+
+#define MAX_NR_ZONES		3	/* Sync this with ZONES_SHIFT */
+#define ZONES_SHIFT		2	/* ceil(log2(MAX_NR_ZONES)) */
+
+#define GFP_ZONEMASK	0x03
+
 /*
  * On machines where it is needed (eg PCs) we divide physical memory
  * into multiple physical zones. On a PC we have 3 zones:
@@ -70,6 +79,19 @@ struct zone {
 	spinlock_t		lock;
 	unsigned long		free_pages;
 	unsigned long		pages_min, pages_low, pages_high;
+	/*
+	 * protection[] is a pre-calculated number of extra pages that must be
+	 * available in a zone in order for __alloc_pages() to allocate memory
+	 * from the zone. i.e., for a GFP_KERNEL alloc of "order" there must
+	 * be "(1<<order) + protection[ZONE_NORMAL]" free pages in the zone
+	 * for us to choose to allocate the page from that zone.
+	 *
+	 * It uses both min_free_kbytes and sysctl_lower_zone_protection.
+	 * The protection values are recalculated if either of these values
+	 * change.  The array elements are in zonelist order:
+	 *	[0] == GFP_DMA, [1] == GFP_KERNEL, [2] == GFP_HIGHMEM.
+	 */
+	unsigned long		protection[MAX_NR_ZONES];
 
 	ZONE_PADDING(_pad1_)
 
@@ -157,14 +179,6 @@ struct zone {
 	unsigned long		present_pages;	/* amount of memory (excluding holes) */
 } ____cacheline_maxaligned_in_smp;
 
-#define ZONE_DMA		0
-#define ZONE_NORMAL		1
-#define ZONE_HIGHMEM		2
-
-#define MAX_NR_ZONES		3	/* Sync this with ZONES_SHIFT */
-#define ZONES_SHIFT		2	/* ceil(log2(MAX_NR_ZONES)) */
-
-#define GFP_ZONEMASK	0x03
 
 /*
  * The "priority" of VM scanning is how much of the queues we will scan in one
@@ -228,6 +242,11 @@ void get_zone_counts(unsigned long *acti
 void build_all_zonelists(void);
 void wakeup_kswapd(struct zone *zone);
 
+/*
+ * zone_idx() returns 0 for the ZONE_DMA zone, 1 for the ZONE_NORMAL zone, etc.
+ */
+#define zone_idx(zone)		((zone) - (zone)->zone_pgdat->node_zones)
+
 /**
  * for_each_pgdat - helper macro to iterate over all nodes
  * @pgdat - pointer to a pg_data_t variable
@@ -299,7 +318,9 @@ static inline int is_normal(struct zone 
 struct ctl_table;
 struct file;
 int min_free_kbytes_sysctl_handler(struct ctl_table *, int, struct file *, 
-					  void __user *, size_t *);
+					void __user *, size_t *);
+int lower_zone_protection_sysctl_handler(struct ctl_table *, int, struct file *,
+					void __user *, size_t *);
 
 #include <linux/topology.h>
 /* Returns the number of the current Node. */
--- diff/include/linux/module.h	2004-03-11 10:20:29.000000000 +0000
+++ source/include/linux/module.h	2004-04-21 10:45:35.946238840 +0100
@@ -70,6 +70,7 @@ static const char __module_cat(name,__LI
 extern const struct gtype##_id __mod_##gtype##_table		\
   __attribute__ ((unused, alias(__stringify(name))))
 
+extern struct module __this_module;
 #define THIS_MODULE (&__this_module)
 
 #else  /* !MODULE */
@@ -481,21 +482,6 @@ static inline int unregister_module_noti
 
 #endif /* CONFIG_MODULES */
 
-#ifdef MODULE
-extern struct module __this_module;
-#ifdef KBUILD_MODNAME
-/* We make the linker do some of the work. */
-struct module __this_module
-__attribute__((section(".gnu.linkonce.this_module"))) = {
-	.name = __stringify(KBUILD_MODNAME),
-	.init = init_module,
-#ifdef CONFIG_MODULE_UNLOAD
-	.exit = cleanup_module,
-#endif
-};
-#endif /* KBUILD_MODNAME */
-#endif /* MODULE */
-
 #define symbol_request(x) try_then_request_module(symbol_get(x), "symbol:" #x)
 
 /* BELOW HERE ALL THESE ARE OBSOLETE AND WILL VANISH */
--- diff/include/linux/msg.h	2004-03-11 10:20:29.000000000 +0000
+++ source/include/linux/msg.h	2004-04-21 10:45:35.947238688 +0100
@@ -74,9 +74,6 @@ struct msg_msg {
 	/* the actual message follows immediately */
 };
 
-#define DATALEN_MSG	(PAGE_SIZE-sizeof(struct msg_msg))
-#define DATALEN_SEG	(PAGE_SIZE-sizeof(struct msg_msgseg))
-
 /* one msq_queue structure for each present queue on the system */
 struct msg_queue {
 	struct kern_ipc_perm q_perm;
--- diff/include/linux/netdevice.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/netdevice.h	2004-04-21 10:45:35.948238536 +0100
@@ -42,13 +42,14 @@ struct divert_blk;
 struct vlan_group;
 struct ethtool_ops;
 
-					/* source back-compat hook */
+					/* source back-compat hooks */
 #define SET_ETHTOOL_OPS(netdev,ops) \
 	( (netdev)->ethtool_ops = (ops) )
 
 #define HAVE_ALLOC_NETDEV		/* feature macro: alloc_xxxdev
 					   functions are available. */
-#define HAVE_FREE_NETDEV
+#define HAVE_FREE_NETDEV		/* free_netdev() */
+#define HAVE_NETDEV_PRIV		/* netdev_priv() */
 
 #define NET_XMIT_SUCCESS	0
 #define NET_XMIT_DROP		1	/* skb dropped			*/
@@ -484,9 +485,14 @@ struct net_device
 	int padded;
 };
 
+#define	NETDEV_ALIGN		32
+#define	NETDEV_ALIGN_CONST	(NETDEV_ALIGN - 1)
+
 static inline void *netdev_priv(struct net_device *dev)
 {
-	return (char *)dev + ((sizeof(struct net_device) + 31) & ~31);
+	return (char *)dev + ((sizeof(struct net_device)
+					+ NETDEV_ALIGN_CONST)
+				& ~NETDEV_ALIGN_CONST);
 }
 
 #define SET_MODULE_OWNER(dev) do { } while (0)
--- diff/include/linux/netfilter.h	2003-07-08 09:55:19.000000000 +0100
+++ source/include/linux/netfilter.h	2004-04-21 10:45:35.948238536 +0100
@@ -99,6 +99,24 @@ void nf_unregister_sockopt(struct nf_soc
 
 extern struct list_head nf_hooks[NPROTO][NF_MAX_HOOKS];
 
+typedef void nf_logfn(unsigned int hooknum,
+		      const struct sk_buff *skb,
+		      const struct net_device *in,
+		      const struct net_device *out,
+		      const char *prefix);
+
+/* Function to register/unregister log function. */
+int nf_log_register(int pf, nf_logfn *logfn);
+void nf_log_unregister(int pf, nf_logfn *logfn);
+
+/* Calls the registered backend logging function */
+void nf_log_packet(int pf,
+		   unsigned int hooknum,
+		   const struct sk_buff *skb,
+		   const struct net_device *in,
+		   const struct net_device *out,
+		   const char *fmt, ...);
+                   
 /* Activate hook; either okfn or kfree_skb called, unless a hook
    returns NF_STOLEN (in which case, it's up to the hook to deal with
    the consequences).
--- diff/include/linux/netfilter_ipv4.h	2004-01-19 10:22:59.000000000 +0000
+++ source/include/linux/netfilter_ipv4.h	2004-04-21 10:45:35.950238232 +0100
@@ -51,6 +51,8 @@
 
 enum nf_ip_hook_priorities {
 	NF_IP_PRI_FIRST = INT_MIN,
+	NF_IP_PRI_CONNTRACK_DEFRAG = -400,
+	NF_IP_PRI_RAW = -300,
 	NF_IP_PRI_SELINUX_FIRST = -225,
 	NF_IP_PRI_CONNTRACK = -200,
 	NF_IP_PRI_BRIDGE_SABOTAGE_FORWARD = -175,
--- diff/include/linux/netfilter_ipv4/ip_conntrack.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/netfilter_ipv4/ip_conntrack.h	2004-04-21 10:45:35.948238536 +0100
@@ -252,6 +252,9 @@ extern void ip_ct_refresh(struct ip_conn
 /* Call me when a conntrack is destroyed. */
 extern void (*ip_conntrack_destroyed)(struct ip_conntrack *conntrack);
 
+/* Fake conntrack entry for untracked connections */
+extern struct ip_conntrack ip_conntrack_untracked;
+
 /* Returns new sk_buff, or NULL */
 struct sk_buff *
 ip_ct_gather_frags(struct sk_buff *skb);
--- diff/include/linux/netfilter_ipv4/ip_conntrack_helper.h	2003-05-21 11:50:10.000000000 +0100
+++ source/include/linux/netfilter_ipv4/ip_conntrack_helper.h	2004-04-21 10:45:35.949238384 +0100
@@ -35,9 +35,13 @@ extern void ip_conntrack_helper_unregist
 
 extern struct ip_conntrack_helper *ip_ct_find_helper(const struct ip_conntrack_tuple *tuple);
 
+
+/* Allocate space for an expectation: this is mandatory before calling 
+   ip_conntrack_expect_related. */
+extern struct ip_conntrack_expect *ip_conntrack_expect_alloc(void);
 /* Add an expected connection: can have more than one per connection */
-extern int ip_conntrack_expect_related(struct ip_conntrack *related_to,
-				       struct ip_conntrack_expect *exp);
+extern int ip_conntrack_expect_related(struct ip_conntrack_expect *exp,
+				       struct ip_conntrack *related_to);
 extern int ip_conntrack_change_expect(struct ip_conntrack_expect *expect,
 				      struct ip_conntrack_tuple *newtuple);
 extern void ip_conntrack_unexpect_related(struct ip_conntrack_expect *exp);
--- diff/include/linux/netfilter_ipv4/ip_conntrack_tftp.h	2003-05-21 11:50:00.000000000 +0100
+++ source/include/linux/netfilter_ipv4/ip_conntrack_tftp.h	2004-04-21 10:45:35.949238384 +0100
@@ -9,5 +9,8 @@ struct tftphdr {
 
 #define TFTP_OPCODE_READ	1
 #define TFTP_OPCODE_WRITE	2
+#define TFTP_OPCODE_DATA	3
+#define TFTP_OPCODE_ACK		4
+#define TFTP_OPCODE_ERROR	5
 
 #endif /* _IP_CT_TFTP */
--- diff/include/linux/netfilter_ipv4/ipt_ULOG.h	2002-10-16 04:27:54.000000000 +0100
+++ source/include/linux/netfilter_ipv4/ipt_ULOG.h	2004-04-21 10:45:35.950238232 +0100
@@ -11,6 +11,9 @@
 #define NETLINK_NFLOG 	5
 #endif
 
+#define ULOG_DEFAULT_NLGROUP	1
+#define ULOG_DEFAULT_QTHRESHOLD	1
+
 #define ULOG_MAC_LEN	80
 #define ULOG_PREFIX_LEN	32
 
--- diff/include/linux/netfilter_ipv4/ipt_conntrack.h	2002-10-16 04:28:33.000000000 +0100
+++ source/include/linux/netfilter_ipv4/ipt_conntrack.h	2004-04-21 10:45:35.950238232 +0100
@@ -10,6 +10,7 @@
 
 #define IPT_CONNTRACK_STATE_SNAT (1 << (IP_CT_NUMBER + 1))
 #define IPT_CONNTRACK_STATE_DNAT (1 << (IP_CT_NUMBER + 2))
+#define IPT_CONNTRACK_STATE_UNTRACKED (1 << (IP_CT_NUMBER + 3))
 
 /* flags, invflags: */
 #define IPT_CONNTRACK_STATE	0x01
--- diff/include/linux/netfilter_ipv4/ipt_state.h	2002-10-16 04:28:34.000000000 +0100
+++ source/include/linux/netfilter_ipv4/ipt_state.h	2004-04-21 10:45:35.950238232 +0100
@@ -4,6 +4,8 @@
 #define IPT_STATE_BIT(ctinfo) (1 << ((ctinfo)%IP_CT_IS_REPLY+1))
 #define IPT_STATE_INVALID (1 << 0)
 
+#define IPT_STATE_UNTRACKED (1 << (IP_CT_NUMBER + 1))
+
 struct ipt_state_info
 {
 	unsigned int statemask;
--- diff/include/linux/netlink.h	2004-03-11 10:20:29.000000000 +0000
+++ source/include/linux/netlink.h	2004-04-21 10:45:35.952237928 +0100
@@ -13,6 +13,7 @@
 #define NETLINK_XFRM		6	/* ipsec */
 #define NETLINK_SELINUX		7	/* SELinux event notifications */
 #define NETLINK_ARPD		8
+#define NETLINK_AUDIT		9	/* auditing */
 #define NETLINK_ROUTE6		11	/* af_inet6 route comm channel */
 #define NETLINK_IP6_FW		13
 #define NETLINK_DNRTMSG		14	/* DECnet routing messages */
@@ -119,6 +120,20 @@ extern void netlink_set_err(struct sock 
 extern int netlink_register_notifier(struct notifier_block *nb);
 extern int netlink_unregister_notifier(struct notifier_block *nb);
 
+/* finegrained unicast helpers: */
+struct sock *netlink_getsockbypid(struct sock *ssk, u32 pid);
+struct sock *netlink_getsockbyfilp(struct file *filp);
+int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock, long timeo);
+void netlink_detachskb(struct sock *sk, struct sk_buff *skb);
+int netlink_sendskb(struct sock *sk, struct sk_buff *skb, int protocol);
+
+/* finegrained unicast helpers: */
+struct sock *netlink_getsockbypid(struct sock *ssk, u32 pid);
+struct sock *netlink_getsockbyfilp(struct file *filp);
+int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock, long timeo);
+void netlink_detachskb(struct sock *sk, struct sk_buff *skb);
+int netlink_sendskb(struct sock *sk, struct sk_buff *skb, int protocol);
+
 /*
  *	skb should fit one page. This choice is good for headerless malloc.
  *
--- diff/include/linux/nfs4.h	2004-03-11 10:20:29.000000000 +0000
+++ source/include/linux/nfs4.h	2004-04-21 10:45:35.952237928 +0100
@@ -47,6 +47,11 @@
 #define NFS4_ACE_SYSTEM_AUDIT_ACE_TYPE   2
 #define NFS4_ACE_SYSTEM_ALARM_ACE_TYPE   3
 
+#define ACL4_SUPPORT_ALLOW_ACL 0x01
+#define ACL4_SUPPORT_DENY_ACL  0x02
+#define ACL4_SUPPORT_AUDIT_ACL 0x04
+#define ACL4_SUPPORT_ALARM_ACL 0x08
+
 typedef struct { char data[NFS4_VERIFIER_SIZE]; } nfs4_verifier;
 typedef struct { char data[16]; } nfs4_stateid;
 
@@ -217,63 +222,64 @@ enum lock_type4 {
 
 
 /* Mandatory Attributes */
-#define FATTR4_WORD0_SUPPORTED_ATTRS    (1)
-#define FATTR4_WORD0_TYPE               (1 << 1)
-#define FATTR4_WORD0_FH_EXPIRE_TYPE     (1 << 2)
-#define FATTR4_WORD0_CHANGE             (1 << 3)
-#define FATTR4_WORD0_SIZE               (1 << 4)
-#define FATTR4_WORD0_LINK_SUPPORT       (1 << 5)
-#define FATTR4_WORD0_SYMLINK_SUPPORT    (1 << 6)
-#define FATTR4_WORD0_NAMED_ATTR         (1 << 7)
-#define FATTR4_WORD0_FSID               (1 << 8)
-#define FATTR4_WORD0_UNIQUE_HANDLES     (1 << 9)
-#define FATTR4_WORD0_LEASE_TIME         (1 << 10)
-#define FATTR4_WORD0_RDATTR_ERROR       (1 << 11)
+#define FATTR4_WORD0_SUPPORTED_ATTRS    (1UL << 0)
+#define FATTR4_WORD0_TYPE               (1UL << 1)
+#define FATTR4_WORD0_FH_EXPIRE_TYPE     (1UL << 2)
+#define FATTR4_WORD0_CHANGE             (1UL << 3)
+#define FATTR4_WORD0_SIZE               (1UL << 4)
+#define FATTR4_WORD0_LINK_SUPPORT       (1UL << 5)
+#define FATTR4_WORD0_SYMLINK_SUPPORT    (1UL << 6)
+#define FATTR4_WORD0_NAMED_ATTR         (1UL << 7)
+#define FATTR4_WORD0_FSID               (1UL << 8)
+#define FATTR4_WORD0_UNIQUE_HANDLES     (1UL << 9)
+#define FATTR4_WORD0_LEASE_TIME         (1UL << 10)
+#define FATTR4_WORD0_RDATTR_ERROR       (1UL << 11)
 
 /* Recommended Attributes */
-#define FATTR4_WORD0_ACL                (1 << 12)
-#define FATTR4_WORD0_ACLSUPPORT         (1 << 13)
-#define FATTR4_WORD0_ARCHIVE            (1 << 14)
-#define FATTR4_WORD0_CANSETTIME         (1 << 15)
-#define FATTR4_WORD0_CASE_INSENSITIVE   (1 << 16)
-#define FATTR4_WORD0_CASE_PRESERVING    (1 << 17)
-#define FATTR4_WORD0_CHOWN_RESTRICTED   (1 << 18)
-#define FATTR4_WORD0_FILEHANDLE         (1 << 19)
-#define FATTR4_WORD0_FILEID             (1 << 20)
-#define FATTR4_WORD0_FILES_AVAIL        (1 << 21)
-#define FATTR4_WORD0_FILES_FREE         (1 << 22)
-#define FATTR4_WORD0_FILES_TOTAL        (1 << 23)
-#define FATTR4_WORD0_FS_LOCATIONS       (1 << 24)
-#define FATTR4_WORD0_HIDDEN             (1 << 25)
-#define FATTR4_WORD0_HOMOGENEOUS        (1 << 26)
-#define FATTR4_WORD0_MAXFILESIZE        (1 << 27)
-#define FATTR4_WORD0_MAXLINK            (1 << 28)
-#define FATTR4_WORD0_MAXNAME            (1 << 29)
-#define FATTR4_WORD0_MAXREAD            (1 << 30)
-#define FATTR4_WORD0_MAXWRITE           (1 << 31)
-#define FATTR4_WORD1_MIMETYPE           (1)
-#define FATTR4_WORD1_MODE               (1 << 1)
-#define FATTR4_WORD1_NO_TRUNC           (1 << 2)
-#define FATTR4_WORD1_NUMLINKS           (1 << 3)
-#define FATTR4_WORD1_OWNER              (1 << 4)
-#define FATTR4_WORD1_OWNER_GROUP        (1 << 5)
-#define FATTR4_WORD1_QUOTA_HARD         (1 << 6)
-#define FATTR4_WORD1_QUOTA_SOFT         (1 << 7)
-#define FATTR4_WORD1_QUOTA_USED         (1 << 8)
-#define FATTR4_WORD1_RAWDEV             (1 << 9)
-#define FATTR4_WORD1_SPACE_AVAIL        (1 << 10)
-#define FATTR4_WORD1_SPACE_FREE         (1 << 11)
-#define FATTR4_WORD1_SPACE_TOTAL        (1 << 12)
-#define FATTR4_WORD1_SPACE_USED         (1 << 13)
-#define FATTR4_WORD1_SYSTEM             (1 << 14)
-#define FATTR4_WORD1_TIME_ACCESS        (1 << 15)
-#define FATTR4_WORD1_TIME_ACCESS_SET    (1 << 16)
-#define FATTR4_WORD1_TIME_BACKUP        (1 << 17)
-#define FATTR4_WORD1_TIME_CREATE        (1 << 18)
-#define FATTR4_WORD1_TIME_DELTA         (1 << 19)
-#define FATTR4_WORD1_TIME_METADATA      (1 << 20)
-#define FATTR4_WORD1_TIME_MODIFY        (1 << 21)
-#define FATTR4_WORD1_TIME_MODIFY_SET    (1 << 22)
+#define FATTR4_WORD0_ACL                (1UL << 12)
+#define FATTR4_WORD0_ACLSUPPORT         (1UL << 13)
+#define FATTR4_WORD0_ARCHIVE            (1UL << 14)
+#define FATTR4_WORD0_CANSETTIME         (1UL << 15)
+#define FATTR4_WORD0_CASE_INSENSITIVE   (1UL << 16)
+#define FATTR4_WORD0_CASE_PRESERVING    (1UL << 17)
+#define FATTR4_WORD0_CHOWN_RESTRICTED   (1UL << 18)
+#define FATTR4_WORD0_FILEHANDLE         (1UL << 19)
+#define FATTR4_WORD0_FILEID             (1UL << 20)
+#define FATTR4_WORD0_FILES_AVAIL        (1UL << 21)
+#define FATTR4_WORD0_FILES_FREE         (1UL << 22)
+#define FATTR4_WORD0_FILES_TOTAL        (1UL << 23)
+#define FATTR4_WORD0_FS_LOCATIONS       (1UL << 24)
+#define FATTR4_WORD0_HIDDEN             (1UL << 25)
+#define FATTR4_WORD0_HOMOGENEOUS        (1UL << 26)
+#define FATTR4_WORD0_MAXFILESIZE        (1UL << 27)
+#define FATTR4_WORD0_MAXLINK            (1UL << 28)
+#define FATTR4_WORD0_MAXNAME            (1UL << 29)
+#define FATTR4_WORD0_MAXREAD            (1UL << 30)
+#define FATTR4_WORD0_MAXWRITE           (1UL << 31)
+#define FATTR4_WORD1_MIMETYPE           (1UL << 0)
+#define FATTR4_WORD1_MODE               (1UL << 1)
+#define FATTR4_WORD1_NO_TRUNC           (1UL << 2)
+#define FATTR4_WORD1_NUMLINKS           (1UL << 3)
+#define FATTR4_WORD1_OWNER              (1UL << 4)
+#define FATTR4_WORD1_OWNER_GROUP        (1UL << 5)
+#define FATTR4_WORD1_QUOTA_HARD         (1UL << 6)
+#define FATTR4_WORD1_QUOTA_SOFT         (1UL << 7)
+#define FATTR4_WORD1_QUOTA_USED         (1UL << 8)
+#define FATTR4_WORD1_RAWDEV             (1UL << 9)
+#define FATTR4_WORD1_SPACE_AVAIL        (1UL << 10)
+#define FATTR4_WORD1_SPACE_FREE         (1UL << 11)
+#define FATTR4_WORD1_SPACE_TOTAL        (1UL << 12)
+#define FATTR4_WORD1_SPACE_USED         (1UL << 13)
+#define FATTR4_WORD1_SYSTEM             (1UL << 14)
+#define FATTR4_WORD1_TIME_ACCESS        (1UL << 15)
+#define FATTR4_WORD1_TIME_ACCESS_SET    (1UL << 16)
+#define FATTR4_WORD1_TIME_BACKUP        (1UL << 17)
+#define FATTR4_WORD1_TIME_CREATE        (1UL << 18)
+#define FATTR4_WORD1_TIME_DELTA         (1UL << 19)
+#define FATTR4_WORD1_TIME_METADATA      (1UL << 20)
+#define FATTR4_WORD1_TIME_MODIFY        (1UL << 21)
+#define FATTR4_WORD1_TIME_MODIFY_SET    (1UL << 22)
+#define FATTR4_WORD1_MOUNTED_ON_FILEID  (1UL << 23)
 
 #define NFSPROC4_NULL 0
 #define NFSPROC4_COMPOUND 1
@@ -286,7 +292,6 @@ enum lock_type4 {
 
 enum {
 	NFSPROC4_CLNT_NULL = 0,		/* Unused */
-	NFSPROC4_CLNT_COMPOUND,		/* Soon to be unused */
 	NFSPROC4_CLNT_READ,
 	NFSPROC4_CLNT_WRITE,
 	NFSPROC4_CLNT_COMMIT,
@@ -303,6 +308,19 @@ enum {
 	NFSPROC4_CLNT_LOCK,
 	NFSPROC4_CLNT_LOCKT,
 	NFSPROC4_CLNT_LOCKU,
+	NFSPROC4_CLNT_ACCESS,
+	NFSPROC4_CLNT_GETATTR,
+	NFSPROC4_CLNT_LOOKUP,
+	NFSPROC4_CLNT_LOOKUP_ROOT,
+	NFSPROC4_CLNT_REMOVE,
+	NFSPROC4_CLNT_RENAME,
+	NFSPROC4_CLNT_LINK,
+	NFSPROC4_CLNT_CREATE,
+	NFSPROC4_CLNT_PATHCONF,
+	NFSPROC4_CLNT_STATFS,
+	NFSPROC4_CLNT_READLINK,
+	NFSPROC4_CLNT_READDIR,
+	NFSPROC4_CLNT_SERVER_CAPS,
 };
 
 #endif
--- diff/include/linux/nfs_fs.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/nfs_fs.h	2004-04-21 10:45:35.953237776 +0100
@@ -69,6 +69,8 @@
 #define FLUSH_SYNC		1	/* file being synced, or contention */
 #define FLUSH_WAIT		2	/* wait for completion */
 #define FLUSH_STABLE		4	/* commit to stable storage */
+#define FLUSH_LOWPRI		8	/* low priority background flush */
+#define FLUSH_HIGHPRI		16	/* high priority memory reclaim flush */
 
 #ifdef __KERNEL__
 
@@ -275,6 +277,7 @@ extern void nfs_begin_attr_update(struct
 extern void nfs_end_attr_update(struct inode *);
 extern void nfs_begin_data_update(struct inode *);
 extern void nfs_end_data_update(struct inode *);
+extern void nfs_end_data_update_defer(struct inode *);
 
 /* linux/net/ipv4/ipconfig.c: trims ip addr off front of name, too. */
 extern u32 root_nfs_parse_addr(char *name); /*__init*/
@@ -301,7 +304,7 @@ nfs_file_cred(struct file *file)
 /*
  * linux/fs/nfs/direct.c
  */
-extern int nfs_direct_IO(int, struct kiocb *, const struct iovec *, loff_t,
+extern ssize_t nfs_direct_IO(int, struct kiocb *, const struct iovec *, loff_t,
 			unsigned long);
 
 /*
@@ -335,10 +338,8 @@ extern int  nfs_writepages(struct addres
 extern int  nfs_flush_incompatible(struct file *file, struct page *page);
 extern int  nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int);
 extern void nfs_writeback_done(struct rpc_task *task);
-extern void nfs_writedata_release(struct rpc_task *task);
 
 #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
-extern void nfs_commit_release(struct rpc_task *task);
 extern void nfs_commit_done(struct rpc_task *);
 #endif
 
@@ -376,14 +377,18 @@ nfs_wb_all(struct inode *inode)
 /*
  * Write back all requests on one page - we do this before reading it.
  */
-static inline int
-nfs_wb_page(struct inode *inode, struct page* page)
+static inline int nfs_wb_page_priority(struct inode *inode, struct page* page, int how)
 {
 	int error = nfs_sync_inode(inode, page->index, 1,
-						FLUSH_WAIT | FLUSH_STABLE);
+			how | FLUSH_WAIT | FLUSH_STABLE);
 	return (error < 0) ? error : 0;
 }
 
+static inline int nfs_wb_page(struct inode *inode, struct page* page)
+{
+	return nfs_wb_page_priority(inode, page, 0);
+}
+
 /* Hack for future NFS swap support */
 #ifndef IS_SWAPFILE
 # define IS_SWAPFILE(inode)	(0)
@@ -397,7 +402,6 @@ extern int  nfs_readpages(struct file *,
 		struct list_head *, unsigned);
 extern int  nfs_pagein_list(struct list_head *, int);
 extern void nfs_readpage_result(struct rpc_task *);
-extern void nfs_readdata_release(struct rpc_task *);
 
 /*
  * linux/fs/mount_clnt.c
--- diff/include/linux/nfs_fs_sb.h	2004-02-18 08:54:13.000000000 +0000
+++ source/include/linux/nfs_fs_sb.h	2004-04-21 10:45:35.953237776 +0100
@@ -38,10 +38,19 @@ struct nfs_server {
 	struct list_head	nfs4_siblings;	/* List of other nfs_server structs
 						 * that share the same clientid
 						 */
+	u32			attr_bitmask[2];/* V4 bitmask representing the set
+						   of attributes supported on this
+						   filesystem */
+	u32			acl_bitmask;	/* V4 bitmask representing the ACEs
+						   that are supported on this
+						   filesystem */
 #endif
 };
 
 /* Server capabilities */
-#define NFS_CAP_READDIRPLUS	(1)
+#define NFS_CAP_READDIRPLUS	(1U << 0)
+#define NFS_CAP_HARDLINKS	(1U << 1)
+#define NFS_CAP_SYMLINKS	(1U << 2)
+#define NFS_CAP_ACLS		(1U << 3)
 
 #endif
--- diff/include/linux/nfs_page.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/nfs_page.h	2004-04-21 10:45:35.953237776 +0100
@@ -17,10 +17,14 @@
 #include <linux/sunrpc/auth.h>
 #include <linux/nfs_xdr.h>
 
+#include <asm/atomic.h>
+
 /*
  * Valid flags for a dirty buffer
  */
 #define PG_BUSY			0
+#define PG_NEED_COMMIT		1
+#define PG_NEED_RESCHED		2
 
 struct nfs_page {
 	struct list_head	wb_list,	/* Defines state of page: */
@@ -31,6 +35,7 @@ struct nfs_page {
 	struct rpc_cred		*wb_cred;
 	struct nfs4_state	*wb_state;
 	struct page		*wb_page;	/* page to read in/write out */
+	atomic_t		wb_complete;	/* i/os we're waiting for */
 	wait_queue_head_t	wb_wait;	/* wait queue */
 	unsigned long		wb_index;	/* Offset >> PAGE_CACHE_SHIFT */
 	unsigned int		wb_offset,	/* Offset & ~PAGE_CACHE_MASK */
@@ -42,6 +47,8 @@ struct nfs_page {
 };
 
 #define NFS_WBACK_BUSY(req)	(test_bit(PG_BUSY,&(req)->wb_flags))
+#define NFS_NEED_COMMIT(req)	(test_bit(PG_NEED_COMMIT,&(req)->wb_flags))
+#define NFS_NEED_RESCHED(req)	(test_bit(PG_NEED_RESCHED,&(req)->wb_flags))
 
 extern	struct nfs_page *nfs_create_request(struct file *, struct inode *,
 					    struct page *,
@@ -93,8 +100,7 @@ nfs_unlock_request(struct nfs_page *req)
 	smp_mb__before_clear_bit();
 	clear_bit(PG_BUSY, &req->wb_flags);
 	smp_mb__after_clear_bit();
-	if (waitqueue_active(&req->wb_wait))
-		wake_up_all(&req->wb_wait);
+	wake_up_all(&req->wb_wait);
 	nfs_release_request(req);
 }
 
@@ -115,6 +121,38 @@ nfs_list_remove_request(struct nfs_page 
 	req->wb_list_head = NULL;
 }
 
+static inline int
+nfs_defer_commit(struct nfs_page *req)
+{
+	if (test_and_set_bit(PG_NEED_COMMIT, &req->wb_flags))
+		return 0;
+	return 1;
+}
+
+static inline void
+nfs_clear_commit(struct nfs_page *req)
+{
+	smp_mb__before_clear_bit();
+	clear_bit(PG_NEED_COMMIT, &req->wb_flags);
+	smp_mb__after_clear_bit();
+}
+
+static inline int
+nfs_defer_reschedule(struct nfs_page *req)
+{
+	if (test_and_set_bit(PG_NEED_RESCHED, &req->wb_flags))
+		return 0;
+	return 1;
+}
+
+static inline void
+nfs_clear_reschedule(struct nfs_page *req)
+{
+	smp_mb__before_clear_bit();
+	clear_bit(PG_NEED_RESCHED, &req->wb_flags);
+	smp_mb__after_clear_bit();
+}
+
 static inline struct nfs_page *
 nfs_list_entry(struct list_head *head)
 {
--- diff/include/linux/nfs_xdr.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/nfs_xdr.h	2004-04-21 10:45:35.955237472 +0100
@@ -3,6 +3,11 @@
 
 #include <linux/sunrpc/xprt.h>
 
+struct nfs4_fsid {
+	__u64 major;
+	__u64 minor;
+};
+
 struct nfs_fattr {
 	unsigned short		valid;		/* which fields are valid */
 	__u64			pre_size;	/* pre_op_attr.size	  */
@@ -26,10 +31,7 @@ struct nfs_fattr {
 	dev_t			rdev;
 	union {
 		__u64		nfs3;		/* also nfs2 */
-		struct {
-			__u64	major;
-			__u64	minor;
-		} nfs4;
+		struct nfs4_fsid nfs4;
 	} fsid_u;
 	__u64			fileid;
 	struct timespec		atime;
@@ -87,6 +89,12 @@ struct nfs_pathconf {
 	__u32			max_namelen; /* max name length */
 };
 
+struct nfs4_change_info {
+	u32			atomic;
+	u64			before;
+	u64			after;
+};
+
 /*
  * Arguments to the open call.
  */
@@ -102,20 +110,18 @@ struct nfs_openargs {
 		struct iattr *  attrs;    /* UNCHECKED, GUARDED */
 		nfs4_verifier   verifier; /* EXCLUSIVE */
 	} u;
-	struct qstr *           name;
-	struct nfs4_getattr *   f_getattr;
-	struct nfs4_getattr *   d_getattr;
-	struct nfs_server *     server;	 /* Needed for ID mapping */
+	const struct qstr *	name;
+	const struct nfs_server *server;	 /* Needed for ID mapping */
+	const u32 *		bitmask;
 };
 
 struct nfs_openres {
 	nfs4_stateid            stateid;
 	struct nfs_fh           fh;
-	struct nfs4_change_info * cinfo;
+	struct nfs4_change_info	cinfo;
 	__u32                   rflags;
-	struct nfs4_getattr *   f_getattr;
-	struct nfs4_getattr *   d_getattr;
-	struct nfs_server *     server;
+	struct nfs_fattr *      f_attr;
+	const struct nfs_server *server;
 };
 
 /*
@@ -141,7 +147,7 @@ struct nfs_open_reclaimargs {
 	__u32			id;
 	__u32			share_access;
 	__u32			claim;
-	struct nfs4_getattr *   f_getattr;
+	const __u32 *		bitmask;
 };
 
 /*
@@ -215,7 +221,7 @@ struct nfs_lockres {
 		nfs4_stateid            stateid;/* LOCK success, LOCKU */
 		struct nfs_lock_denied  denied; /* LOCK failed, LOCKT success */
 	} u;
-	struct nfs_server *     server;
+	const struct nfs_server *	server;
 };
 
 /*
@@ -229,7 +235,8 @@ struct nfs_lockres {
 
 struct nfs_readargs {
 	struct nfs_fh *		fh;
-	nfs4_stateid		stateid;
+	fl_owner_t		lockowner;
+	struct nfs4_state *	state;
 	__u64			offset;
 	__u32			count;
 	unsigned int		pgbase;
@@ -252,7 +259,8 @@ struct nfs_readres {
 
 struct nfs_writeargs {
 	struct nfs_fh *		fh;
-	nfs4_stateid		stateid;
+	fl_owner_t		lockowner;
+	struct nfs4_state *	state;
 	__u64			offset;
 	__u32			count;
 	enum nfs3_stable_how	stable;
@@ -319,13 +327,13 @@ struct nfs_setattrargs {
 	struct nfs_fh *                 fh;
 	nfs4_stateid                    stateid;
 	struct iattr *                  iap;
-	struct nfs4_getattr *           attr;
-	struct nfs_server *             server; /* Needed for name mapping */
+	const struct nfs_server *	server; /* Needed for name mapping */
+	const u32 *			bitmask;
 };
 
 struct nfs_setattrres {
-	struct nfs4_getattr *           attr;
-	struct nfs_server *             server;
+	struct nfs_fattr *              fattr;
+	const struct nfs_server *	server;
 };
 
 struct nfs_linkargs {
@@ -476,124 +484,116 @@ struct nfs3_readdirres {
 
 typedef u64 clientid4;
 
-struct nfs4_change_info {
-	u32				atomic;
-	u64				before;
-	u64				after;
+struct nfs4_accessargs {
+	const struct nfs_fh *		fh;
+	u32				access;
 };
 
-struct nfs4_access {
-	u32				ac_req_access;     /* request */
-	u32 *				ac_resp_supported; /* response */
-	u32 *				ac_resp_access;    /* response */
+struct nfs4_accessres {
+	u32				supported;
+	u32				access;
 };
 
-struct nfs4_close {
-	char *				cl_stateid;        /* request */
-	u32				cl_seqid;          /* request */
-};
-
-struct nfs4_create {
-	u32				cr_ftype;          /* request */
-	union {                                            /* request */
-		struct {
-			u32		textlen;
-			const char *	text;
-		} symlink;   /* NF4LNK */
+struct nfs4_create_arg {
+	u32				ftype;
+	union {
+		struct qstr *		symlink;    /* NF4LNK */
 		struct {
 			u32		specdata1;
 			u32		specdata2;
 		} device;    /* NF4BLK, NF4CHR */
 	} u;
-	u32				cr_namelen;        /* request */
-	const char *			cr_name;           /* request */
-	struct iattr *			cr_attrs;          /* request */
-	struct nfs4_change_info	*	cr_cinfo;          /* response */
+	const struct qstr *		name;
+	const struct nfs_server *	server;
+	const struct iattr *		attrs;
+	const struct nfs_fh *		dir_fh;
+	const u32 *			bitmask;
 };
-#define cr_textlen			u.symlink.textlen
-#define cr_text				u.symlink.text
-#define cr_specdata1			u.device.specdata1
-#define cr_specdata2			u.device.specdata2
 
-struct nfs4_getattr {
-        u32 *				gt_bmval;          /* request */
-        struct nfs_fattr *		gt_attrs;          /* response */
-	struct nfs_fsstat *		gt_fsstat;         /* response */
-	struct nfs_pathconf *		gt_pathconf;       /* response */
+struct nfs4_create_res {
+	const struct nfs_server *	server;
+	struct nfs_fh *			fh;
+	struct nfs_fattr *		fattr;
+	struct nfs4_change_info		dir_cinfo;
 };
 
-struct nfs4_getfh {
-	struct nfs_fh *			gf_fhandle;       /* response */
+struct nfs4_fsinfo_arg {
+	const struct nfs_fh *		fh;
+	const u32 *			bitmask;
 };
 
-struct nfs4_link {
-	u32				ln_namelen;       /* request */
-	const char *			ln_name;          /* request */
-	struct nfs4_change_info *	ln_cinfo;         /* response */
+struct nfs4_getattr_arg {
+	const struct nfs_fh *		fh;
+	const u32 *			bitmask;
 };
 
-struct nfs4_lookup {
-	struct qstr *			lo_name;          /* request */
+struct nfs4_getattr_res {
+	const struct nfs_server *	server;
+	struct nfs_fattr *		fattr;
 };
 
-struct nfs4_open {
-	struct nfs4_client *		op_client_state;  /* request */
-	u32				op_share_access;  /* request */
-	u32				op_opentype;      /* request */
-	u32				op_createmode;    /* request */
-	union {                                           /* request */
-		struct iattr *		attrs;    /* UNCHECKED, GUARDED */
-		nfs4_verifier		verifier; /* EXCLUSIVE */
-	} u;
-	struct qstr *			op_name;          /* request */
-	char *				op_stateid;       /* response */
-	struct nfs4_change_info	*	op_cinfo;         /* response */
-	u32 *				op_rflags;        /* response */
-};
-#define op_attrs     u.attrs
-#define op_verifier  u.verifier
-
-struct nfs4_open_confirm {
-	char *				oc_stateid;       /* request */
-};
-
-struct nfs4_putfh {
-	struct nfs_fh *			pf_fhandle;       /* request */
-};
-
-struct nfs4_readdir {
-	u64				rd_cookie;        /* request */
-	nfs4_verifier			rd_req_verifier;  /* request */
-	u32				rd_count;         /* request */
-	u32				rd_bmval[2];      /* request */	
-	nfs4_verifier			rd_resp_verifier; /* response */
-	struct page **			rd_pages;   /* zero-copy data */
-	unsigned int			rd_pgbase;  /* zero-copy data */
+struct nfs4_link_arg {
+	const struct nfs_fh *		fh;
+	const struct nfs_fh *		dir_fh;
+	const struct qstr *		name;
+};
+
+struct nfs4_lookup_arg {
+	const struct nfs_fh *		dir_fh;
+	const struct qstr *		name;
+	const u32 *			bitmask;
+};
+
+struct nfs4_lookup_res {
+	const struct nfs_server *	server;
+	struct nfs_fattr *		fattr;
+	struct nfs_fh *			fh;
+};
+
+struct nfs4_lookup_root_arg {
+	const u32 *			bitmask;
+};
+
+struct nfs4_pathconf_arg {
+	const struct nfs_fh *		fh;
+	const u32 *			bitmask;
+};
+
+struct nfs4_readdir_arg {
+	const struct nfs_fh *		fh;
+	u64				cookie;
+	nfs4_verifier			verifier;
+	u32				count;
+	struct page **			pages;	/* zero-copy data */
+	unsigned int			pgbase;	/* zero-copy data */
+};
+
+struct nfs4_readdir_res {
+	nfs4_verifier			verifier;
+	unsigned int			pgbase;
 };
 
 struct nfs4_readlink {
-	u32				rl_count;   /* zero-copy data */
-	struct page **			rl_pages;   /* zero-copy data */
+	const struct nfs_fh *		fh;
+	u32				count;   /* zero-copy data */
+	struct page **			pages;   /* zero-copy data */
 };
 
-struct nfs4_remove {
-	u32				rm_namelen;       /* request */
-	const char *			rm_name;          /* request */
-	struct nfs4_change_info *	rm_cinfo;         /* response */
+struct nfs4_remove_arg {
+	const struct nfs_fh *		fh;
+	const struct qstr *		name;
 };
 
-struct nfs4_rename {
-	u32				rn_oldnamelen;    /* request */
-	const char *			rn_oldname;       /* request */
-	u32				rn_newnamelen;    /* request */
-	const char *			rn_newname;       /* request */
-	struct nfs4_change_info	*	rn_src_cinfo;     /* response */
-	struct nfs4_change_info *	rn_dst_cinfo;     /* response */
+struct nfs4_rename_arg {
+	const struct nfs_fh *		old_dir;
+	const struct nfs_fh *		new_dir;
+	const struct qstr *		old_name;
+	const struct qstr *		new_name;
 };
 
-struct nfs4_setattr {
-	char *				st_stateid;       /* request */
-	struct iattr *			st_iap;           /* request */
+struct nfs4_rename_res {
+	struct nfs4_change_info		old_cinfo;
+	struct nfs4_change_info		new_cinfo;
 };
 
 struct nfs4_setclientid {
@@ -606,70 +606,37 @@ struct nfs4_setclientid {
 	struct nfs4_client *		sc_state;	  /* response */
 };
 
-struct nfs4_op {
-	u32				opnum;
-	union {
-		struct nfs4_access	access;
-		struct nfs4_close	close;
-		struct nfs4_create	create;
-		struct nfs4_getattr	getattr;
-		struct nfs4_getfh	getfh;
-		struct nfs4_link	link;
-		struct nfs4_lookup	lookup;
-		struct nfs4_open	open;
-		struct nfs4_open_confirm open_confirm;
-		struct nfs4_putfh	putfh;
-		struct nfs4_readdir	readdir;
-		struct nfs4_readlink	readlink;
-		struct nfs4_remove	remove;
-		struct nfs4_rename	rename;
-		struct nfs4_client *	renew;
-		struct nfs4_setattr	setattr;
-	} u;
+struct nfs4_statfs_arg {
+	const struct nfs_fh *		fh;
+	const u32 *			bitmask;
 };
 
-struct nfs4_compound {
-	unsigned int		flags;   /* defined below */
-	struct nfs_server *	server;
-
-	/* RENEW information */
-	int			renew_index;
-	unsigned long		timestamp;
-
-	/* scratch variables for XDR encode/decode */
-	int			nops;
-	u32 *			p;
-	u32 *			end;
-
-	/* the individual COMPOUND operations */
-	struct nfs4_op		*ops;
-
-	/* request */
-	int			req_nops;
-	u32			taglen;
-	char *			tag;
-	
-	/* response */
-	int			resp_nops;
-	int			toplevel_status;
+struct nfs4_server_caps_res {
+	u32				attr_bitmask[2];
+	u32				acl_bitmask;
+	u32				has_links;
+	u32				has_symlinks;
 };
 
 #endif /* CONFIG_NFS_V4 */
 
+struct nfs_page;
+
 struct nfs_read_data {
 	int			flags;
 	struct rpc_task		task;
 	struct inode		*inode;
 	struct rpc_cred		*cred;
-	fl_owner_t		lockowner;
 	struct nfs_fattr	fattr;	/* fattr storage */
 	struct list_head	pages;	/* Coalesced read requests */
+	struct nfs_page		*req;	/* multi ops per nfs_page */
 	struct page		*pagevec[NFS_READ_MAXIOV];
 	struct nfs_readargs args;
 	struct nfs_readres  res;
 #ifdef CONFIG_NFS_V4
 	unsigned long		timestamp;	/* For lease renewal */
 #endif
+	void (*complete) (struct nfs_read_data *, int);
 };
 
 struct nfs_write_data {
@@ -677,20 +644,19 @@ struct nfs_write_data {
 	struct rpc_task		task;
 	struct inode		*inode;
 	struct rpc_cred		*cred;
-	fl_owner_t		lockowner;
 	struct nfs_fattr	fattr;
 	struct nfs_writeverf	verf;
 	struct list_head	pages;		/* Coalesced requests we wish to flush */
+	struct nfs_page		*req;		/* multi ops per nfs_page */
 	struct page		*pagevec[NFS_WRITE_MAXIOV];
 	struct nfs_writeargs	args;		/* argument struct */
 	struct nfs_writeres	res;		/* result struct */
 #ifdef CONFIG_NFS_V4
 	unsigned long		timestamp;	/* For lease renewal */
 #endif
+	void (*complete) (struct nfs_write_data *, int);
 };
 
-struct nfs_page;
-
 /*
  * RPC procedure vector for NFSv2/NFSv3 demuxing
  */
@@ -737,9 +703,9 @@ struct nfs_rpc_ops {
 	int	(*pathconf) (struct nfs_server *, struct nfs_fh *,
 			     struct nfs_pathconf *);
 	u32 *	(*decode_dirent)(u32 *, struct nfs_entry *, int plus);
-	void	(*read_setup)   (struct nfs_read_data *, unsigned int count);
-	void	(*write_setup)  (struct nfs_write_data *, unsigned int count, int how);
-	void	(*commit_setup) (struct nfs_write_data *, u64 start, u32 len, int how);
+	void	(*read_setup)   (struct nfs_read_data *);
+	void	(*write_setup)  (struct nfs_write_data *, int how);
+	void	(*commit_setup) (struct nfs_write_data *, int how);
 	int	(*file_open)   (struct inode *, struct file *);
 	int	(*file_release) (struct inode *, struct file *);
 	void	(*request_init)(struct nfs_page *, struct file *);
--- diff/include/linux/nfsd/nfsd.h	2004-03-11 10:20:29.000000000 +0000
+++ source/include/linux/nfsd/nfsd.h	2004-04-21 10:45:35.955237472 +0100
@@ -196,6 +196,9 @@ void		nfsd_lockd_shutdown(void);
 #define	nfserr_openmode		__constant_htonl(NFSERR_OPENMODE)
 #define	nfserr_locks_held	__constant_htonl(NFSERR_LOCKS_HELD)
 #define	nfserr_op_illegal	__constant_htonl(NFSERR_OP_ILLEGAL)
+#define	nfserr_grace		__constant_htonl(NFSERR_GRACE)
+#define	nfserr_no_grace		__constant_htonl(NFSERR_NO_GRACE)
+#define	nfserr_reclaim_bad	__constant_htonl(NFSERR_RECLAIM_BAD)
 
 /* error codes for internal use */
 /* if a request fails due to kmalloc failure, it gets dropped.
@@ -278,7 +281,7 @@ static inline int is_fsid(struct svc_fh 
  | FATTR4_WORD1_SPACE_AVAIL     | FATTR4_WORD1_SPACE_FREE   | FATTR4_WORD1_SPACE_TOTAL      \
  | FATTR4_WORD1_SPACE_USED      | FATTR4_WORD1_TIME_ACCESS  | FATTR4_WORD1_TIME_ACCESS_SET  \
  | FATTR4_WORD1_TIME_CREATE     | FATTR4_WORD1_TIME_DELTA   | FATTR4_WORD1_TIME_METADATA    \
- | FATTR4_WORD1_TIME_MODIFY     | FATTR4_WORD1_TIME_MODIFY_SET)
+ | FATTR4_WORD1_TIME_MODIFY     | FATTR4_WORD1_TIME_MODIFY_SET | FATTR4_WORD1_MOUNTED_ON_FILEID)
 
 /* These will return ERR_INVAL if specified in GETATTR or READDIR. */
 #define NFSD_WRITEONLY_ATTRS_WORD1							    \
--- diff/include/linux/nfsd/state.h	2004-03-11 10:20:29.000000000 +0000
+++ source/include/linux/nfsd/state.h	2004-04-21 10:45:35.955237472 +0100
@@ -132,6 +132,9 @@ struct nfs4_replay {
 *         release a stateowner.
 *    so_perlockowner: (open) nfs4_stateid->st_perlockowner entry - used when
 *         close is called to reap associated byte-range locks
+*    so_close_lru: (open) stateowner is placed on this list instead of being
+*         reaped (when so_perfilestate is empty) to hold the last close replay.
+*         reaped by laundramat thread after lease period.
 */
 struct nfs4_stateowner {
 	struct list_head        so_idhash;   /* hash by so_id */
@@ -139,6 +142,8 @@ struct nfs4_stateowner {
 	struct list_head        so_perclient; /* nfs4_client->cl_perclient */
 	struct list_head        so_perfilestate; /* list: nfs4_stateid */
 	struct list_head        so_perlockowner; /* nfs4_stateid->st_perlockowner */
+	struct list_head	so_close_lru; /* tail queue */
+	time_t			so_time; /* time of placement on so_close_lru */
 	int			so_is_open_owner; /* 1=openowner,0=lockowner */
 	u32                     so_id;
 	struct nfs4_client *    so_client;
@@ -194,6 +199,7 @@ struct nfs4_stateid {
 #define OPEN_STATE              0x00000004
 #define LOCK_STATE              0x00000008
 #define RDWR_STATE              0x00000010
+#define CLOSE_STATE             0x00000020
 
 #define seqid_mutating_err(err)                       \
 	(((err) != nfserr_stale_clientid) &&    \
@@ -209,4 +215,6 @@ extern int nfs4_share_conflict(struct sv
 		unsigned int deny_type);
 extern void nfs4_lock_state(void);
 extern void nfs4_unlock_state(void);
+extern int nfs4_in_grace(void);
+extern int nfs4_in_no_grace(void);
 #endif   /* NFSD4_STATE_H */
--- diff/include/linux/page-flags.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/page-flags.h	2004-04-21 10:45:35.956237320 +0100
@@ -69,12 +69,14 @@
 #define PG_private		12	/* Has something at ->private */
 #define PG_writeback		13	/* Page is under writeback */
 #define PG_nosave		14	/* Used for system suspend/resume */
-#define PG_chainlock		15	/* lock bit for ->pte_chain */
+#define PG_maplock		15	/* Lock bit for rmap to ptes */
 
 #define PG_direct		16	/* ->pte_chain points directly at pte */
 #define PG_mappedtodisk		17	/* Has blocks allocated on-disk */
 #define PG_reclaim		18	/* To be reclaimed asap */
 #define PG_compound		19	/* Part of a compound page */
+#define PG_anon			20	/* Anonymous page: anon_vma in mapping*/
+#define PG_swapcache		21	/* Swap page: swp_entry_t in private */
 
 
 /*
@@ -298,24 +300,33 @@ extern void get_full_page_state(struct p
 #define SetPageCompound(page)	set_bit(PG_compound, &(page)->flags)
 #define ClearPageCompound(page)	clear_bit(PG_compound, &(page)->flags)
 
-/*
- * The PageSwapCache predicate doesn't use a PG_flag at this time,
- * but it may again do so one day.
- */
+#define PageAnon(page)		test_bit(PG_anon, &(page)->flags)
+#define SetPageAnon(page)	set_bit(PG_anon, &(page)->flags)
+#define ClearPageAnon(page)	clear_bit(PG_anon, &(page)->flags)
+
 #ifdef CONFIG_SWAP
-extern struct address_space swapper_space;
-#define PageSwapCache(page) ((page)->mapping == &swapper_space)
+#define PageSwapCache(page)	test_bit(PG_swapcache, &(page)->flags)
+#define SetPageSwapCache(page)	set_bit(PG_swapcache, &(page)->flags)
+#define ClearPageSwapCache(page) clear_bit(PG_swapcache, &(page)->flags)
 #else
-#define PageSwapCache(page) 0
+#define PageSwapCache(page)	0
 #endif
 
 struct page;	/* forward declaration */
 
 int test_clear_page_dirty(struct page *page);
+int __clear_page_dirty(struct page *page);
+int test_clear_page_writeback(struct page *page);
+int test_set_page_writeback(struct page *page);
 
 static inline void clear_page_dirty(struct page *page)
 {
 	test_clear_page_dirty(page);
 }
 
+static inline void set_page_writeback(struct page *page)
+{
+	test_set_page_writeback(page);
+}
+
 #endif	/* PAGE_FLAGS_H */
--- diff/include/linux/pagemap.h	2004-01-19 10:22:59.000000000 +0000
+++ source/include/linux/pagemap.h	2004-04-21 10:45:35.956237320 +0100
@@ -69,9 +69,10 @@ extern struct page * find_trylock_page(s
 				unsigned long index);
 extern struct page * find_or_create_page(struct address_space *mapping,
 				unsigned long index, unsigned int gfp_mask);
-extern unsigned int find_get_pages(struct address_space *mapping,
-				pgoff_t start, unsigned int nr_pages,
-				struct page **pages);
+unsigned find_get_pages(struct address_space *mapping, pgoff_t start,
+			unsigned int nr_pages, struct page **pages);
+unsigned find_get_pages_tag(struct address_space *mapping, pgoff_t *index,
+			int tag, unsigned int nr_pages, struct page **pages);
 
 /*
  * Returns locked page at given index in given cache, creating it if needed.
@@ -138,15 +139,12 @@ static inline unsigned long get_page_cac
         return atomic_read(&nr_pagecache);
 }
 
-static inline void ___add_to_page_cache(struct page *page,
-		struct address_space *mapping, unsigned long index)
+static inline pgoff_t linear_page_index(struct vm_area_struct *vma,
+					unsigned long address)
 {
-	list_add(&page->list, &mapping->clean_pages);
-	page->mapping = mapping;
-	page->index = index;
-
-	mapping->nrpages++;
-	pagecache_acct(1);
+	pgoff_t pgoff = (address - vma->vm_start) >> PAGE_SHIFT;
+	pgoff += vma->vm_pgoff;
+	return pgoff >> (PAGE_CACHE_SHIFT - PAGE_SHIFT);
 }
 
 extern void FASTCALL(__lock_page(struct page *page));
--- diff/include/linux/pagevec.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/linux/pagevec.h	2004-04-21 10:45:35.956237320 +0100
@@ -22,8 +22,11 @@ void __pagevec_free(struct pagevec *pvec
 void __pagevec_lru_add(struct pagevec *pvec);
 void __pagevec_lru_add_active(struct pagevec *pvec);
 void pagevec_strip(struct pagevec *pvec);
-unsigned int pagevec_lookup(struct pagevec *pvec, struct address_space *mapping,
-		pgoff_t start, unsigned int nr_pages);
+unsigned pagevec_lookup(struct pagevec *pvec, struct address_space *mapping,
+		pgoff_t start, unsigned nr_pages);
+unsigned pagevec_lookup_tag(struct pagevec *pvec,
+		struct address_space *mapping, pgoff_t *index, int tag,
+		unsigned nr_pages);
 
 static inline void pagevec_init(struct pagevec *pvec, int cold)
 {
--- diff/include/linux/pci.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/pci.h	2004-04-21 10:45:35.957237168 +0100
@@ -305,18 +305,89 @@
 #define  PCI_X_CMD_ERO		0x0002	/* Enable Relaxed Ordering */
 #define  PCI_X_CMD_MAX_READ	0x000c	/* Max Memory Read Byte Count */
 #define  PCI_X_CMD_MAX_SPLIT	0x0070	/* Max Outstanding Split Transactions */
-#define PCI_X_DEVFN		4	/* A copy of devfn. */
-#define PCI_X_BUSNR		5	/* Bus segment number */
-#define PCI_X_STATUS		6	/* PCI-X capabilities */
-#define  PCI_X_STATUS_64BIT	0x0001	/* 64-bit device */
-#define  PCI_X_STATUS_133MHZ	0x0002	/* 133 MHz capable */
-#define  PCI_X_STATUS_SPL_DISC	0x0004	/* Split Completion Discarded */
-#define  PCI_X_STATUS_UNX_SPL	0x0008	/* Unexpected Split Completion */
-#define  PCI_X_STATUS_COMPLEX	0x0010	/* Device Complexity */
-#define  PCI_X_STATUS_MAX_READ	0x0060	/* Designed Maximum Memory Read Count */
-#define  PCI_X_STATUS_MAX_SPLIT	0x0380	/* Design Max Outstanding Split Trans */
-#define  PCI_X_STATUS_MAX_CUM	0x1c00	/* Designed Max Cumulative Read Size */
-#define  PCI_X_STATUS_SPL_ERR	0x2000	/* Rcvd Split Completion Error Msg */
+#define  PCI_X_CMD_VERSION(x) 	(((x) >> 12) & 3) /* Version */
+#define PCI_X_STATUS		4	/* PCI-X capabilities */
+#define  PCI_X_STATUS_DEVFN	0x000000ff	/* A copy of devfn */
+#define  PCI_X_STATUS_BUS	0x0000ff00	/* A copy of bus nr */
+#define  PCI_X_STATUS_64BIT	0x00010000	/* 64-bit device */
+#define  PCI_X_STATUS_133MHZ	0x00020000	/* 133 MHz capable */
+#define  PCI_X_STATUS_SPL_DISC	0x00040000	/* Split Completion Discarded */
+#define  PCI_X_STATUS_UNX_SPL	0x00080000	/* Unexpected Split Completion */
+#define  PCI_X_STATUS_COMPLEX	0x00100000	/* Device Complexity */
+#define  PCI_X_STATUS_MAX_READ	0x00600000	/* Designed Max Memory Read Count */
+#define  PCI_X_STATUS_MAX_SPLIT	0x03800000	/* Designed Max Outstanding Split Transactions */
+#define  PCI_X_STATUS_MAX_CUM	0x1c000000	/* Designed Max Cumulative Read Size */
+#define  PCI_X_STATUS_SPL_ERR	0x20000000	/* Rcvd Split Completion Error Msg */
+#define  PCI_X_STATUS_266MHZ	0x40000000	/* 266 MHz capable */
+#define  PCI_X_STATUS_533MHZ	0x80000000	/* 533 MHz capable */
+
+/* Extended Capabilities (PCI-X 2.0 and Express) */
+#define PCI_EXT_CAP_ID(header)		(header & 0x0000ffff)
+#define PCI_EXT_CAP_VER(header)		((header >> 16) & 0xf)
+#define PCI_EXT_CAP_NEXT(header)	((header >> 20) & 0xffc)
+
+#define PCI_EXT_CAP_ID_ERR	1
+#define PCI_EXT_CAP_ID_VC	2
+#define PCI_EXT_CAP_ID_DSN	3
+#define PCI_EXT_CAP_ID_PWR	4
+
+/* Advanced Error Reporting */
+#define PCI_ERR_UNCOR_STATUS	4	/* Uncorrectable Error Status */
+#define  PCI_ERR_UNC_TRAIN	0x00000001	/* Training */
+#define  PCI_ERR_UNC_DLP	0x00000010	/* Data Link Protocol */
+#define  PCI_ERR_UNC_POISON_TLP	0x00001000	/* Poisoned TLP */
+#define  PCI_ERR_UNC_FCP	0x00002000	/* Flow Control Protocol */
+#define  PCI_ERR_UNC_COMP_TIME	0x00004000	/* Completion Timeout */
+#define  PCI_ERR_UNC_COMP_ABORT	0x00008000	/* Completer Abort */
+#define  PCI_ERR_UNC_UNX_COMP	0x00010000	/* Unexpected Completion */
+#define  PCI_ERR_UNC_RX_OVER	0x00020000	/* Receiver Overflow */
+#define  PCI_ERR_UNC_MALF_TLP	0x00040000	/* Malformed TLP */
+#define  PCI_ERR_UNC_ECRC	0x00080000	/* ECRC Error Status */
+#define  PCI_ERR_UNC_UNSUP	0x00100000	/* Unsupported Request */
+#define PCI_ERR_UNCOR_MASK	8	/* Uncorrectable Error Mask */
+	/* Same bits as above */
+#define PCI_ERR_UNCOR_SEVER	12	/* Uncorrectable Error Severity */
+	/* Same bits as above */
+#define PCI_ERR_COR_STATUS	16	/* Correctable Error Status */
+#define  PCI_ERR_COR_RCVR	0x00000001	/* Receiver Error Status */
+#define  PCI_ERR_COR_BAD_TLP	0x00000040	/* Bad TLP Status */
+#define  PCI_ERR_COR_BAD_DLLP	0x00000080	/* Bad DLLP Status */
+#define  PCI_ERR_COR_REP_ROLL	0x00000100	/* REPLAY_NUM Rollover */
+#define  PCI_ERR_COR_REP_TIMER	0x00001000	/* Replay Timer Timeout */
+#define PCI_ERR_COR_MASK	20	/* Correctable Error Mask */
+	/* Same bits as above */
+#define PCI_ERR_CAP		24	/* Advanced Error Capabilities */
+#define  PCI_ERR_CAP_FEP(x)	((x) & 31)	/* First Error Pointer */
+#define  PCI_ERR_CAP_ECRC_GENC	0x00000020	/* ECRC Generation Capable */
+#define  PCI_ERR_CAP_ECRC_GENE	0x00000040	/* ECRC Generation Enable */
+#define  PCI_ERR_CAP_ECRC_CHKC	0x00000080	/* ECRC Check Capable */
+#define  PCI_ERR_CAP_ECRC_CHKE	0x00000100	/* ECRC Check Enable */
+#define PCI_ERR_HEADER_LOG	28	/* Header Log Register (16 bytes) */
+#define PCI_ERR_ROOT_COMMAND	44	/* Root Error Command */
+#define PCI_ERR_ROOT_STATUS	48
+#define PCI_ERR_ROOT_COR_SRC	52
+#define PCI_ERR_ROOT_SRC	54
+
+/* Virtual Channel */
+#define PCI_VC_PORT_REG1	4
+#define PCI_VC_PORT_REG2	8
+#define PCI_VC_PORT_CTRL	12
+#define PCI_VC_PORT_STATUS	14
+#define PCI_VC_RES_CAP		16
+#define PCI_VC_RES_CTRL		20
+#define PCI_VC_RES_STATUS	26
+
+/* Power Budgeting */
+#define PCI_PWR_DSR		4	/* Data Select Register */
+#define PCI_PWR_DATA		8	/* Data Register */
+#define  PCI_PWR_DATA_BASE(x)	((x) & 0xff)	    /* Base Power */
+#define  PCI_PWR_DATA_SCALE(x)	(((x) >> 8) & 3)    /* Data Scale */
+#define  PCI_PWR_DATA_PM_SUB(x)	(((x) >> 10) & 7)   /* PM Sub State */
+#define  PCI_PWR_DATA_PM_STATE(x) (((x) >> 13) & 3) /* PM State */
+#define  PCI_PWR_DATA_TYPE(x)	(((x) >> 15) & 7)   /* Type */
+#define  PCI_PWR_DATA_RAIL(x)	(((x) >> 18) & 7)   /* Power Rail */
+#define PCI_PWR_CAP		12	/* Capability */
+#define  PCI_PWR_CAP_BUDGET(x)	((x) & 1)	/* Included in system budget */
 
 /* Include the ID list */
 
@@ -403,6 +474,8 @@ struct pci_dev {
 	unsigned short vendor_compatible[DEVICE_COUNT_COMPATIBLE];
 	unsigned short device_compatible[DEVICE_COUNT_COMPATIBLE];
 
+	int		cfg_size;	/* Size of configuration space */
+
 	/*
 	 * Instead of touching interrupt line and base address registers
 	 * directly, use the values stored here. They might be different!
@@ -602,6 +675,7 @@ struct pci_dev *pci_find_subsys (unsigne
 struct pci_dev *pci_find_class (unsigned int class, const struct pci_dev *from);
 struct pci_dev *pci_find_slot (unsigned int bus, unsigned int devfn);
 int pci_find_capability (struct pci_dev *dev, int cap);
+int pci_find_ext_capability (struct pci_dev *dev, int cap);
 struct pci_bus * pci_find_next_bus(const struct pci_bus *from);
 
 struct pci_dev *pci_get_device (unsigned int vendor, unsigned int device, struct pci_dev *from);
@@ -676,6 +750,12 @@ int pci_request_region(struct pci_dev *,
 void pci_release_region(struct pci_dev *, int);
 
 /* drivers/pci/bus.c */
+int pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res,
+			   unsigned long size, unsigned long align,
+			   unsigned long min, unsigned int type_mask,
+			   void (*alignf)(void *, struct resource *,
+					  unsigned long, unsigned long),
+			   void *alignf_data);
 void pci_enable_bridges(struct pci_bus *bus);
 
 /* New-style probing supporting hot-pluggable devices */
@@ -768,6 +848,7 @@ static inline int pci_assign_resource(st
 static inline int pci_register_driver(struct pci_driver *drv) { return 0;}
 static inline void pci_unregister_driver(struct pci_driver *drv) { }
 static inline int pci_find_capability (struct pci_dev *dev, int cap) {return 0; }
+static inline int pci_find_ext_capability (struct pci_dev *dev, int cap) {return 0; }
 static inline const struct pci_device_id *pci_match_device(const struct pci_device_id *ids, const struct pci_dev *dev) { return NULL; }
 
 /* Power management related routines */
--- diff/include/linux/pci_ids.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/pci_ids.h	2004-04-21 10:45:35.959236864 +0100
@@ -572,6 +572,7 @@
 #define PCI_DEVICE_ID_SI_503		0x0008
 #define PCI_DEVICE_ID_SI_ACPI		0x0009
 #define PCI_DEVICE_ID_SI_LPC		0x0018
+#define PCI_DEVICE_ID_SI_180		0x0180
 #define PCI_DEVICE_ID_SI_5597_VGA	0x0200
 #define PCI_DEVICE_ID_SI_6205		0x0205
 #define PCI_DEVICE_ID_SI_501		0x0406
@@ -707,6 +708,7 @@
 #define PCI_VENDOR_ID_TI		0x104c
 #define PCI_DEVICE_ID_TI_TVP4010	0x3d04
 #define PCI_DEVICE_ID_TI_TVP4020	0x3d07
+#define PCI_DEVICE_ID_TI_4450		0x8011
 #define PCI_DEVICE_ID_TI_1130		0xac12
 #define PCI_DEVICE_ID_TI_1031		0xac13
 #define PCI_DEVICE_ID_TI_1131		0xac15
@@ -723,6 +725,7 @@
 #define PCI_DEVICE_ID_TI_4451		0xac42
 #define PCI_DEVICE_ID_TI_1410		0xac50
 #define PCI_DEVICE_ID_TI_1420		0xac51
+#define PCI_DEVICE_ID_TI_1451A		0xac52
 #define PCI_DEVICE_ID_TI_1520		0xac55
 #define PCI_DEVICE_ID_TI_1510		0xac56
 
@@ -994,6 +997,7 @@
 #define PCI_DEVICE_ID_AL_M1531		0x1531
 #define PCI_DEVICE_ID_AL_M1533		0x1533
 #define PCI_DEVICE_ID_AL_M1541		0x1541
+#define PCI_DEVICE_ID_AL_M1563		0x1563
 #define PCI_DEVICE_ID_AL_M1621		0x1621
 #define PCI_DEVICE_ID_AL_M1631		0x1631
 #define PCI_DEVICE_ID_AL_M1632		0x1632
@@ -1837,6 +1841,8 @@
 #define PCI_DEVICE_ID_TIGON3_5901	0x170d
 #define PCI_DEVICE_ID_TIGON3_5901_2	0x170e
 #define PCI_DEVICE_ID_BCM4401		0x4401
+#define PCI_DEVICE_ID_BCM4401B0		0x4402
+#define PCI_DEVICE_ID_BCM4401B1		0x170c
 
 #define PCI_VENDOR_ID_ENE		0x1524
 #define PCI_DEVICE_ID_ENE_1211		0x1211
@@ -1871,6 +1877,13 @@
 #define PCI_DEVICE_ID_ALTIMA_AC9100	0x03ea
 #define PCI_DEVICE_ID_ALTIMA_AC1003	0x03eb
 
+#define PCI_VENDOR_ID_S2IO		0x17d5
+#define	PCI_DEVICE_ID_S2IO_WIN		0x5731
+#define	PCI_DEVICE_ID_S2IO_UNI		0x5831
+
+#define PCI_VENDOR_ID_ARC               0x192E
+#define PCI_DEVICE_ID_ARC_EHCI          0x0101
+
 #define PCI_VENDOR_ID_SYMPHONY		0x1c1c
 #define PCI_DEVICE_ID_SYMPHONY_101	0x0001
 
@@ -2074,6 +2087,7 @@
 #define PCI_DEVICE_ID_INTEL_82830_CGC	0x3577
 #define PCI_DEVICE_ID_INTEL_82855GM_HB	0x3580
 #define PCI_DEVICE_ID_INTEL_82855GM_IG	0x3582
+#define PCI_DEVICE_ID_INTEL_SMCH	0x3590
 #define PCI_DEVICE_ID_INTEL_80310	0x530d
 #define PCI_DEVICE_ID_INTEL_82371SB_0	0x7000
 #define PCI_DEVICE_ID_INTEL_82371SB_1	0x7010
--- diff/include/linux/pfkeyv2.h	2003-08-26 10:00:54.000000000 +0100
+++ source/include/linux/pfkeyv2.h	2004-04-21 10:45:35.959236864 +0100
@@ -181,7 +181,7 @@ struct sadb_x_policy {
 	uint8_t		sadb_x_policy_dir;
 	uint8_t		sadb_x_policy_reserved;
 	uint32_t	sadb_x_policy_id;
-	uint32_t	sadb_x_policy_reserved2;
+	uint32_t	sadb_x_policy_priority;
 } __attribute__((packed));
 /* sizeof(struct sadb_x_policy) == 16 */
 
--- diff/include/linux/posix_types.h	2002-10-16 04:29:05.000000000 +0100
+++ source/include/linux/posix_types.h	2004-04-21 10:45:35.959236864 +0100
@@ -42,6 +42,7 @@ typedef void (*__kernel_sighandler_t)(in
 
 /* Type of a SYSV IPC key.  */
 typedef int __kernel_key_t;
+typedef int __kernel_mqd_t;
 
 #include <asm/posix_types.h>
 
--- diff/include/linux/prefetch.h	2002-10-16 04:29:05.000000000 +0100
+++ source/include/linux/prefetch.h	2004-04-21 10:45:35.960236712 +0100
@@ -10,6 +10,7 @@
 #ifndef _LINUX_PREFETCH_H
 #define _LINUX_PREFETCH_H
 
+#include <linux/types.h>
 #include <asm/processor.h>
 #include <asm/cache.h>
 
@@ -54,4 +55,15 @@ static inline void prefetchw(const void 
 #define PREFETCH_STRIDE (4*L1_CACHE_BYTES)
 #endif
 
+static inline void prefetch_range(void *addr, size_t len)
+{
+#ifdef ARCH_HAS_PREFETCH
+	char *cp;
+	char *end = addr + len;
+
+	for (cp = addr; cp < end; cp += PREFETCH_STRIDE)
+		prefetch(cp);
+#endif
+}
+
 #endif
--- diff/include/linux/proc_fs.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/proc_fs.h	2004-04-21 10:45:35.960236712 +0100
@@ -26,9 +26,6 @@ enum {
 
 /* Finally, the dynamically allocatable proc entries are reserved: */
 
-#define PROC_DYNAMIC_FIRST 4096
-#define PROC_NDYNAMIC      16384
-
 #define PROC_SUPER_MAGIC 0x9fa0
 
 /*
@@ -53,7 +50,7 @@ typedef	int (write_proc_t)(struct file *
 typedef int (get_info_t)(char *, char **, off_t, int);
 
 struct proc_dir_entry {
-	unsigned short low_ino;
+	unsigned int low_ino;
 	unsigned short namelen;
 	const char *name;
 	mode_t mode;
@@ -102,7 +99,7 @@ extern void remove_proc_entry(const char
 
 extern struct vfsmount *proc_mnt;
 extern int proc_fill_super(struct super_block *,void *,int);
-extern struct inode * proc_get_inode(struct super_block *, int, struct proc_dir_entry *);
+extern struct inode *proc_get_inode(struct super_block *, unsigned int, struct proc_dir_entry *);
 
 extern int proc_match(int, const char *,struct proc_dir_entry *);
 
--- diff/include/linux/quota.h	2004-01-19 10:22:59.000000000 +0000
+++ source/include/linux/quota.h	2004-04-21 10:45:35.961236560 +0100
@@ -138,6 +138,10 @@ struct if_dqinfo {
 #include <linux/dqblk_v1.h>
 #include <linux/dqblk_v2.h>
 
+/* Maximal numbers of writes for quota operation (insert/delete/update)
+ * (over all formats) - info block, 4 pointer blocks, data block */
+#define DQUOT_MAX_WRITES	6
+
 /*
  * Data for one user/group kept in memory
  */
@@ -168,22 +172,21 @@ struct mem_dqinfo {
 	} u;
 };
 
+struct super_block;
+
 #define DQF_MASK 0xffff		/* Mask for format specific flags */
 #define DQF_INFO_DIRTY_B 16
 #define DQF_ANY_DQUOT_DIRTY_B 17
 #define DQF_INFO_DIRTY (1 << DQF_INFO_DIRTY_B)	/* Is info dirty? */
 #define DQF_ANY_DQUOT_DIRTY (1 << DQF_ANY_DQUOT_DIRTY_B) /* Is any dquot dirty? */
 
-extern inline void mark_info_dirty(struct mem_dqinfo *info)
-{
-	set_bit(DQF_INFO_DIRTY_B, &info->dqi_flags);
-}
-
+extern void mark_info_dirty(struct super_block *sb, int type);
 #define info_dirty(info) test_bit(DQF_INFO_DIRTY_B, &(info)->dqi_flags)
 #define info_any_dquot_dirty(info) test_bit(DQF_ANY_DQUOT_DIRTY_B, &(info)->dqi_flags)
 #define info_any_dirty(info) (info_dirty(info) || info_any_dquot_dirty(info))
 
 #define sb_dqopt(sb) (&(sb)->s_dquot)
+#define sb_dqinfo(sb, type) (sb_dqopt(sb)->info+(type))
 
 struct dqstats {
 	int lookups;
@@ -200,15 +203,13 @@ extern struct dqstats dqstats;
 
 #define NR_DQHASH 43            /* Just an arbitrary number */
 
-#define DQ_MOD_B	0
-#define DQ_BLKS_B	1
-#define DQ_INODES_B	2
-#define DQ_FAKE_B	3
-
-#define DQ_MOD        (1 << DQ_MOD_B)	/* dquot modified since read */
-#define DQ_BLKS       (1 << DQ_BLKS_B)	/* uid/gid has been warned about blk limit */
-#define DQ_INODES     (1 << DQ_INODES_B)	/* uid/gid has been warned about inode limit */
-#define DQ_FAKE       (1 << DQ_FAKE_B)	/* no limits only usage */
+#define DQ_MOD_B	0	/* dquot modified since read */
+#define DQ_BLKS_B	1	/* uid/gid has been warned about blk limit */
+#define DQ_INODES_B	2	/* uid/gid has been warned about inode limit */
+#define DQ_FAKE_B	3	/* no limits only usage */
+#define DQ_READ_B	4	/* dquot was read into memory */
+#define DQ_ACTIVE_B	5	/* dquot is active (dquot_release not called) */
+#define DQ_WAITFREE_B	6	/* dquot being waited (by invalidate_dquots) */
 
 struct dquot {
 	struct list_head dq_hash;	/* Hash list in memory */
@@ -216,8 +217,7 @@ struct dquot {
 	struct list_head dq_free;	/* Free list element */
 	struct semaphore dq_lock;	/* dquot IO lock */
 	atomic_t dq_count;		/* Use count */
-
-	/* fields after this point are cleared when invalidating */
+	wait_queue_head_t dq_wait_unused;	/* Wait queue for dquot to become unused */
 	struct super_block *dq_sb;	/* superblock this applies to */
 	unsigned int dq_id;		/* ID this applies to (uid, gid) */
 	loff_t dq_off;			/* Offset of dquot on disk */
@@ -238,19 +238,22 @@ struct quota_format_ops {
 	int (*write_file_info)(struct super_block *sb, int type);	/* Write main info about file */
 	int (*free_file_info)(struct super_block *sb, int type);	/* Called on quotaoff() */
 	int (*read_dqblk)(struct dquot *dquot);		/* Read structure for one user */
-	int (*commit_dqblk)(struct dquot *dquot);	/* Write (or delete) structure for one user */
+	int (*commit_dqblk)(struct dquot *dquot);	/* Write structure for one user */
+	int (*release_dqblk)(struct dquot *dquot);	/* Called when last reference to dquot is being dropped */
 };
 
 /* Operations working with dquots */
 struct dquot_operations {
-	void (*initialize) (struct inode *, int);
-	void (*drop) (struct inode *);
+	int (*initialize) (struct inode *, int);
+	int (*drop) (struct inode *);
 	int (*alloc_space) (struct inode *, qsize_t, int);
 	int (*alloc_inode) (const struct inode *, unsigned long);
-	void (*free_space) (struct inode *, qsize_t);
-	void (*free_inode) (const struct inode *, unsigned long);
+	int (*free_space) (struct inode *, qsize_t);
+	int (*free_inode) (const struct inode *, unsigned long);
 	int (*transfer) (struct inode *, struct iattr *);
-	int (*write_dquot) (struct dquot *);
+	int (*write_dquot) (struct dquot *);		/* Ordinary dquot write */
+	int (*mark_dirty) (struct dquot *);		/* Dquot is marked dirty */
+	int (*write_info) (struct super_block *, int);	/* Write of quota "superblock" */
 };
 
 /* Operations handling requests from userspace */
@@ -289,10 +292,7 @@ struct quota_info {
 };
 
 /* Inline would be better but we need to dereference super_block which is not defined yet */
-#define mark_dquot_dirty(dquot) do {\
-	set_bit(DQF_ANY_DQUOT_DIRTY_B, &(sb_dqopt((dquot)->dq_sb)->info[(dquot)->dq_type].dqi_flags));\
-	set_bit(DQ_MOD_B, &(dquot)->dq_flags);\
-} while (0)
+int mark_dquot_dirty(struct dquot *dquot);
 
 #define dquot_dirty(dquot) test_bit(DQ_MOD_B, &(dquot)->dq_flags)
 
@@ -304,7 +304,6 @@ struct quota_info {
 
 int register_quota_format(struct quota_format_type *fmt);
 void unregister_quota_format(struct quota_format_type *fmt);
-void init_dquot_operations(struct dquot_operations *fsdqops);
 
 struct quota_module_name {
 	int qm_fmt_id;
--- diff/include/linux/quotaops.h	2004-02-09 10:36:12.000000000 +0000
+++ source/include/linux/quotaops.h	2004-04-21 10:45:35.961236560 +0100
@@ -22,16 +22,31 @@
  */
 extern void sync_dquots(struct super_block *sb, int type);
 
-extern void dquot_initialize(struct inode *inode, int type);
-extern void dquot_drop(struct inode *inode);
+extern int dquot_initialize(struct inode *inode, int type);
+extern int dquot_drop(struct inode *inode);
 
-extern int  dquot_alloc_space(struct inode *inode, qsize_t number, int prealloc);
-extern int  dquot_alloc_inode(const struct inode *inode, unsigned long number);
+extern int dquot_alloc_space(struct inode *inode, qsize_t number, int prealloc);
+extern int dquot_alloc_inode(const struct inode *inode, unsigned long number);
 
-extern void dquot_free_space(struct inode *inode, qsize_t number);
-extern void dquot_free_inode(const struct inode *inode, unsigned long number);
+extern int dquot_free_space(struct inode *inode, qsize_t number);
+extern int dquot_free_inode(const struct inode *inode, unsigned long number);
 
-extern int  dquot_transfer(struct inode *inode, struct iattr *iattr);
+extern int dquot_transfer(struct inode *inode, struct iattr *iattr);
+extern int dquot_commit(struct dquot *dquot);
+extern int dquot_acquire(struct dquot *dquot);
+extern int dquot_release(struct dquot *dquot);
+extern int dquot_commit_info(struct super_block *sb, int type);
+extern int dquot_mark_dquot_dirty(struct dquot *dquot);
+
+extern int vfs_quota_on(struct super_block *sb, int type, int format_id, char *path);
+extern int vfs_quota_on_mount(int type, int format_id, struct dentry *dentry);
+extern int vfs_quota_off(struct super_block *sb, int type);
+#define vfs_quota_off_mount(sb, type) vfs_quota_off(sb, type)
+extern int vfs_quota_sync(struct super_block *sb, int type);
+extern int vfs_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
+extern int vfs_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii);
+extern int vfs_get_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di);
+extern int vfs_set_dqblk(struct super_block *sb, int type, qid_t id, struct if_dqblk *di);
 
 /*
  * Operations supported for diskquotas.
@@ -42,6 +57,8 @@ extern struct quotactl_ops vfs_quotactl_
 #define sb_dquot_ops (&dquot_operations)
 #define sb_quotactl_ops (&vfs_quotactl_ops)
 
+/* It is better to call this function outside of any transaction as it might
+ * need a lot of space in journal for dquot structure allocation. */
 static __inline__ void DQUOT_INIT(struct inode *inode)
 {
 	BUG_ON(!inode->i_sb);
@@ -49,6 +66,7 @@ static __inline__ void DQUOT_INIT(struct
 		inode->i_sb->dq_op->initialize(inode, -1);
 }
 
+/* The same as with DQUOT_INIT */
 static __inline__ void DQUOT_DROP(struct inode *inode)
 {
 	if (IS_QUOTAINIT(inode)) {
@@ -57,6 +75,8 @@ static __inline__ void DQUOT_DROP(struct
 	}
 }
 
+/* The following allocation/freeing/transfer functions *must* be called inside
+ * a transaction (deadlocks possible otherwise) */
 static __inline__ int DQUOT_PREALLOC_SPACE_NODIRTY(struct inode *inode, qsize_t nr)
 {
 	if (sb_any_quota_enabled(inode->i_sb)) {
@@ -64,11 +84,8 @@ static __inline__ int DQUOT_PREALLOC_SPA
 		if (inode->i_sb->dq_op->alloc_space(inode, nr, 1) == NO_QUOTA)
 			return 1;
 	}
-	else {
-		spin_lock(&dq_data_lock);
+	else
 		inode_add_bytes(inode, nr);
-		spin_unlock(&dq_data_lock);
-	}
 	return 0;
 }
 
@@ -87,11 +104,8 @@ static __inline__ int DQUOT_ALLOC_SPACE_
 		if (inode->i_sb->dq_op->alloc_space(inode, nr, 0) == NO_QUOTA)
 			return 1;
 	}
-	else {
-		spin_lock(&dq_data_lock);
+	else
 		inode_add_bytes(inode, nr);
-		spin_unlock(&dq_data_lock);
-	}
 	return 0;
 }
 
@@ -117,11 +131,8 @@ static __inline__ void DQUOT_FREE_SPACE_
 {
 	if (sb_any_quota_enabled(inode->i_sb))
 		inode->i_sb->dq_op->free_space(inode, nr);
-	else {
-		spin_lock(&dq_data_lock);
+	else
 		inode_sub_bytes(inode, nr);
-		spin_unlock(&dq_data_lock);
-	}
 }
 
 static __inline__ void DQUOT_FREE_SPACE(struct inode *inode, qsize_t nr)
@@ -146,6 +157,7 @@ static __inline__ int DQUOT_TRANSFER(str
 	return 0;
 }
 
+/* The following two functions cannot be called inside a transaction */
 #define DQUOT_SYNC(sb)	sync_dquots(sb, -1)
 
 static __inline__ int DQUOT_OFF(struct super_block *sb)
--- diff/include/linux/radix-tree.h	2003-05-21 11:50:10.000000000 +0100
+++ source/include/linux/radix-tree.h	2004-04-21 10:45:35.962236408 +0100
@@ -20,8 +20,7 @@
 #define _LINUX_RADIX_TREE_H
 
 #include <linux/preempt.h>
-
-struct radix_tree_node;
+#include <linux/types.h>
 
 struct radix_tree_root {
 	unsigned int		height;
@@ -29,25 +28,40 @@ struct radix_tree_root {
 	struct radix_tree_node	*rnode;
 };
 
-#define RADIX_TREE_INIT(mask)	{0, (mask), NULL}
+#define RADIX_TREE_INIT(mask)	{					\
+	.height = 0,							\
+	.gfp_mask = (mask),						\
+	.rnode = NULL,							\
+}
 
 #define RADIX_TREE(name, mask) \
 	struct radix_tree_root name = RADIX_TREE_INIT(mask)
 
-#define INIT_RADIX_TREE(root, mask)	\
-do {					\
-	(root)->height = 0;		\
-	(root)->gfp_mask = (mask);	\
-	(root)->rnode = NULL;		\
+#define INIT_RADIX_TREE(root, mask)					\
+do {									\
+	(root)->height = 0;						\
+	(root)->gfp_mask = (mask);					\
+	(root)->rnode = NULL;						\
 } while (0)
 
-extern int radix_tree_insert(struct radix_tree_root *, unsigned long, void *);
-extern void *radix_tree_lookup(struct radix_tree_root *, unsigned long);
-extern void *radix_tree_delete(struct radix_tree_root *, unsigned long);
-extern unsigned int
+int radix_tree_insert(struct radix_tree_root *, unsigned long, void *);
+void *radix_tree_lookup(struct radix_tree_root *, unsigned long);
+void *radix_tree_delete(struct radix_tree_root *, unsigned long);
+unsigned int
 radix_tree_gang_lookup(struct radix_tree_root *root, void **results,
 			unsigned long first_index, unsigned int max_items);
 int radix_tree_preload(int gfp_mask);
+void radix_tree_init(void);
+void *radix_tree_tag_set(struct radix_tree_root *root,
+			unsigned long index, int tag);
+void *radix_tree_tag_clear(struct radix_tree_root *root,
+			unsigned long index, int tag);
+int radix_tree_tag_get(struct radix_tree_root *root,
+			unsigned long index, int tag);
+unsigned int
+radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results,
+		unsigned long first_index, unsigned int max_items, int tag);
+int radix_tree_tagged(struct radix_tree_root *root, int tag);
 
 static inline void radix_tree_preload_end(void)
 {
--- diff/include/linux/raid/md.h	2003-06-30 10:07:24.000000000 +0100
+++ source/include/linux/raid/md.h	2004-04-21 10:45:35.962236408 +0100
@@ -76,6 +76,7 @@ extern void md_handle_safemode(mddev_t *
 extern void md_done_sync(mddev_t *mddev, int blocks, int ok);
 extern void md_sync_acct(mdk_rdev_t *rdev, unsigned long nr_sectors);
 extern void md_error (mddev_t *mddev, mdk_rdev_t *rdev);
+extern void md_unplug_mddev(mddev_t *mddev);
 
 extern void md_print_devices (void);
 
--- diff/include/linux/raid/md_k.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/raid/md_k.h	2004-04-21 10:45:35.962236408 +0100
@@ -315,7 +315,7 @@ typedef struct mdk_thread_s {
 
 #define THREAD_WAKEUP  0
 
-#define __wait_event_lock_irq(wq, condition, lock) 			\
+#define __wait_event_lock_irq(wq, condition, lock, cmd) 		\
 do {									\
 	wait_queue_t __wait;						\
 	init_waitqueue_entry(&__wait, current);				\
@@ -326,7 +326,7 @@ do {									\
 		if (condition)						\
 			break;						\
 		spin_unlock_irq(&lock);					\
-		blk_run_queues();					\
+		cmd;							\
 		schedule();						\
 		spin_lock_irq(&lock);					\
 	}								\
@@ -334,36 +334,11 @@ do {									\
 	remove_wait_queue(&wq, &__wait);				\
 } while (0)
 
-#define wait_event_lock_irq(wq, condition, lock) 			\
+#define wait_event_lock_irq(wq, condition, lock, cmd) 			\
 do {									\
 	if (condition)	 						\
 		break;							\
-	__wait_event_lock_irq(wq, condition, lock);			\
-} while (0)
-
-
-#define __wait_disk_event(wq, condition) 				\
-do {									\
-	wait_queue_t __wait;						\
-	init_waitqueue_entry(&__wait, current);				\
-									\
-	add_wait_queue(&wq, &__wait);					\
-	for (;;) {							\
-		set_current_state(TASK_UNINTERRUPTIBLE);		\
-		if (condition)						\
-			break;						\
-		blk_run_queues();					\
-		schedule();						\
-	}								\
-	current->state = TASK_RUNNING;					\
-	remove_wait_queue(&wq, &__wait);				\
-} while (0)
-
-#define wait_disk_event(wq, condition) 					\
-do {									\
-	if (condition)	 						\
-		break;							\
-	__wait_disk_event(wq, condition);				\
+	__wait_event_lock_irq(wq, condition, lock, cmd);		\
 } while (0)
 
 #endif
--- diff/include/linux/reiserfs_fs.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/reiserfs_fs.h	2004-04-21 10:45:35.964236104 +0100
@@ -1702,45 +1702,90 @@ struct reiserfs_journal_header {
 	 (((block)<<(JBH_HASH_SHIFT - 6)) ^ ((block) >> 13) ^ ((block) << (JBH_HASH_SHIFT - 12))))
 #define journal_hash(t,sb,block) ((t)[_jhashfn((sb),(block)) & JBH_HASH_MASK])
 
-/* finds n'th buffer with 0 being the start of this commit.  Needs to go away, j_ap_blocks has changed
-** since I created this.  One chunk of code in journal.c needs changing before deleting it
-*/
-#define JOURNAL_BUFFER(j,n) ((j)->j_ap_blocks[((j)->j_start + (n)) % JOURNAL_BLOCK_COUNT])
-
 // We need these to make journal.c code more readable
 #define journal_find_get_block(s, block) __find_get_block(SB_JOURNAL(s)->j_dev_bd, block, s->s_blocksize)
 #define journal_getblk(s, block) __getblk(SB_JOURNAL(s)->j_dev_bd, block, s->s_blocksize)
 #define journal_bread(s, block) __bread(SB_JOURNAL(s)->j_dev_bd, block, s->s_blocksize)
 
+enum reiserfs_bh_state_bits {
+    BH_JDirty = BH_PrivateStart,
+    BH_JDirty_wait,
+    BH_JNew,
+    BH_JPrepared,
+    BH_JRestore_dirty,
+    BH_JTest, // debugging only will go away
+};
+
+/*
+** transaction handle which is passed around for all journal calls
+*/
+struct reiserfs_transaction_handle {
+  struct super_block *t_super ; /* super for this FS when journal_begin was
+				   called. saves calls to reiserfs_get_super
+				   also used by nested transactions to make
+				   sure they are nesting on the right FS
+				   _must_ be first in the handle
+				*/
+  int t_refcount;
+  int t_blocks_logged ;         /* number of blocks this writer has logged */
+  int t_blocks_allocated ;      /* number of blocks this writer allocated */
+  unsigned long t_trans_id ;    /* sanity check, equals the current trans id */
+  void *t_handle_save ;		/* save existing current->journal_info */
+  int displace_new_blocks:1;	/* if new block allocation occurres, that block
+				   should be displaced from others */
+} ;
+
+/* used to keep track of ordered and tail writes, attached to the buffer
+ * head through b_journal_head.
+ */
+struct reiserfs_jh {
+    struct reiserfs_journal_list *jl;
+    struct buffer_head *bh;
+    struct list_head list;
+};
+
+void reiserfs_free_jh(struct buffer_head *bh);
+int reiserfs_add_tail_list(struct inode *inode, struct buffer_head *bh);
+int reiserfs_add_ordered_list(struct inode *inode, struct buffer_head *bh);
+int journal_mark_dirty(struct reiserfs_transaction_handle *, struct super_block *, struct buffer_head *bh) ;
+
+static inline int reiserfs_transaction_running(struct super_block *s) {
+    struct reiserfs_transaction_handle *th = current->journal_info ;
+    if (th && th->t_super == s)
+        return 1 ;
+    if (th && th->t_super == NULL)
+        BUG();
+    return 0 ;
+}
+
+int reiserfs_async_progress_wait(struct super_block *s);
+
+struct reiserfs_transaction_handle *
+reiserfs_persistent_transaction(struct super_block *, int count);
+int reiserfs_end_persistent_transaction(struct reiserfs_transaction_handle *);
+int reiserfs_commit_page(struct inode *inode, struct page *page,
+		unsigned from, unsigned to);
+int reiserfs_flush_old_commits(struct super_block *);
 void reiserfs_commit_for_inode(struct inode *) ;
 void reiserfs_update_inode_transaction(struct inode *) ;
 void reiserfs_wait_on_write_block(struct super_block *s) ;
 void reiserfs_block_writes(struct reiserfs_transaction_handle *th) ;
 void reiserfs_allow_writes(struct super_block *s) ;
 void reiserfs_check_lock_depth(char *caller) ;
-void reiserfs_prepare_for_journal(struct super_block *, struct buffer_head *bh, int wait) ;
+int reiserfs_prepare_for_journal(struct super_block *, struct buffer_head *bh, int wait) ;
 void reiserfs_restore_prepared_buffer(struct super_block *, struct buffer_head *bh) ;
 int journal_init(struct super_block *, const char * j_dev_name, int old_format, unsigned int) ;
 int journal_release(struct reiserfs_transaction_handle*, struct super_block *) ;
 int journal_release_error(struct reiserfs_transaction_handle*, struct super_block *) ;
 int journal_end(struct reiserfs_transaction_handle *, struct super_block *, unsigned long) ;
 int journal_end_sync(struct reiserfs_transaction_handle *, struct super_block *, unsigned long) ;
-int journal_mark_dirty_nolog(struct reiserfs_transaction_handle *, struct super_block *, struct buffer_head *bh) ;
 int journal_mark_freed(struct reiserfs_transaction_handle *, struct super_block *, b_blocknr_t blocknr) ;
-int push_journal_writer(char *w) ;
-int pop_journal_writer(int windex) ;
 int journal_transaction_should_end(struct reiserfs_transaction_handle *, int) ;
 int reiserfs_in_journal(struct super_block *p_s_sb, int bmap_nr, int bit_nr, int searchall, b_blocknr_t *next) ;
 int journal_begin(struct reiserfs_transaction_handle *, struct super_block *p_s_sb, unsigned long) ;
-void flush_async_commits(struct super_block *p_s_sb) ;
 
 int buffer_journaled(const struct buffer_head *bh) ;
 int mark_buffer_journal_new(struct buffer_head *bh) ;
-int reiserfs_add_page_to_flush_list(struct reiserfs_transaction_handle *,
-                                    struct inode *, struct buffer_head *) ;
-int reiserfs_remove_page_from_flush_list(struct reiserfs_transaction_handle *,
-                                         struct inode *) ;
-
 int reiserfs_allocate_list_bitmaps(struct super_block *s, struct reiserfs_list_bitmap *, int) ;
 
 				/* why is this kerplunked right here? */
@@ -1983,8 +2028,17 @@ extern struct address_space_operations r
 void * reiserfs_kmalloc (size_t size, int flags, struct super_block * s);
 void reiserfs_kfree (const void * vp, size_t size, struct super_block * s);
 #else
-#define reiserfs_kmalloc(x, y, z) kmalloc(x, y)
-#define reiserfs_kfree(x, y, z) kfree(x)
+static inline void *reiserfs_kmalloc(size_t size, int flags,
+					struct super_block *s)
+{
+	return kmalloc(size, flags);
+}
+
+static inline void reiserfs_kfree(const void *vp, size_t size,
+					struct super_block *s)
+{
+	kfree(vp);
+}
 #endif
 
 int fix_nodes (int n_op_mode, struct tree_balance * p_s_tb, 
--- diff/include/linux/reiserfs_fs_i.h	2003-06-09 14:18:20.000000000 +0100
+++ source/include/linux/reiserfs_fs_i.h	2004-04-21 10:45:35.964236104 +0100
@@ -3,6 +3,8 @@
 
 #include <linux/list.h>
 
+struct reiserfs_journal_list;
+
 /** bitmasks for i_flags field in reiserfs-specific part of inode */
 typedef enum {
     /** this says what format of key do all items (but stat data) of
@@ -48,7 +50,7 @@ struct reiserfs_inode_info {
     ** needs to be committed in order for this inode to be properly
     ** flushed */
     unsigned long i_trans_id ;
-    unsigned long i_trans_index ;
+    struct reiserfs_journal_list *i_jl;
     struct inode vfs_inode;
 };
 
--- diff/include/linux/reiserfs_fs_sb.h	2003-09-30 15:46:20.000000000 +0100
+++ source/include/linux/reiserfs_fs_sb.h	2004-04-21 10:45:35.965235952 +0100
@@ -106,21 +106,6 @@ typedef enum {
 #define JOURNAL_MAX_CNODE   1500 /* max cnodes to allocate. */
 #define JOURNAL_HASH_SIZE 8192   
 #define JOURNAL_NUM_BITMAPS 5 /* number of copies of the bitmaps to have floating.  Must be >= 2 */
-#define JOURNAL_LIST_COUNT 64
-
-/* these are bh_state bit flag offset numbers, for use in the buffer head */
-
-#define BH_JDirty       16      /* journal data needs to be written before buffer can be marked dirty */
-#define BH_JDirty_wait 18	/* commit is done, buffer marked dirty */
-#define BH_JNew 19		/* buffer allocated during this transaction, no need to write if freed during this trans too */
-
-/* ugly.  metadata blocks must be prepared before they can be logged.  
-** prepared means unlocked and cleaned.  If the block is prepared, but not
-** logged for some reason, any bits cleared while preparing it must be 
-** set again.
-*/
-#define BH_JPrepared 20		/* block has been prepared for the log */
-#define BH_JRestore_dirty 22    /* restore the dirty bit later */
 
 /* One of these for every block in every transaction
 ** Each one is in two hash tables.  First, a hash of the current transaction, and after journal_end, a
@@ -154,22 +139,6 @@ struct reiserfs_list_bitmap {
 } ;
 
 /*
-** transaction handle which is passed around for all journal calls
-*/
-struct reiserfs_transaction_handle {
-				/* ifdef it. -Hans */
-  char *t_caller ;              /* debugging use */
-  int t_blocks_logged ;         /* number of blocks this writer has logged */
-  int t_blocks_allocated ;      /* number of blocks this writer allocated */
-  unsigned long t_trans_id ;    /* sanity check, equals the current trans id */
-  struct super_block *t_super ; /* super for this FS when journal_begin was 
-                                   called. saves calls to reiserfs_get_super */
-  int displace_new_blocks:1;	/* if new block allocation occurres, that block
-				   should be displaced from others */
-
-} ;
-
-/*
 ** one of these for each transaction.  The most important part here is the j_realblock.
 ** this list of cnodes is used to hash all the blocks in all the commits, to mark all the
 ** real buffer heads dirty once all the commits hit the disk,
@@ -177,23 +146,30 @@ struct reiserfs_transaction_handle {
 ** to be overwritten */
 struct reiserfs_journal_list {
   unsigned long j_start ;
+  unsigned long j_state;
   unsigned long j_len ;
   atomic_t j_nonzerolen ;
   atomic_t j_commit_left ;
-  atomic_t j_flushing ;
-  atomic_t j_commit_flushing ;
   atomic_t j_older_commits_done ;      /* all commits older than this on disk*/
+  struct semaphore j_commit_lock;
   unsigned long j_trans_id ;
   time_t j_timestamp ;
   struct reiserfs_list_bitmap *j_list_bitmap ;
   struct buffer_head *j_commit_bh ; /* commit buffer head */
   struct reiserfs_journal_cnode *j_realblock  ;
   struct reiserfs_journal_cnode *j_freedlist ; /* list of buffers that were freed during this trans.  free each of these on flush */
-  wait_queue_head_t j_commit_wait ; /* wait for all the commit blocks to be flushed */
-  wait_queue_head_t j_flush_wait ; /* wait for all the real blocks to be flushed */
-} ;
+  /* time ordered list of all active transactions */
+  struct list_head j_list;
 
-struct reiserfs_page_list  ; /* defined in reiserfs_fs.h */
+  /* time ordered list of all transactions we haven't tried to flush yet */
+  struct list_head j_working_list;
+
+  /* list of tail conversion targets in need of flush before commit */
+  struct list_head j_tail_bh_list;
+  /* list of data=ordered buffers in need of flush before commit */
+  struct list_head j_bh_list;
+  int j_refcount;
+} ;
 
 struct reiserfs_journal {
   struct buffer_head ** j_ap_blocks ; /* journal blocks on disk */
@@ -216,16 +192,11 @@ struct reiserfs_journal {
   unsigned long j_last_flush_trans_id ;    /* last fully flushed journal timestamp */
   struct buffer_head *j_header_bh ;   
 
-  /* j_flush_pages must be flushed before the current transaction can
-  ** commit
-  */
-  struct reiserfs_page_list *j_flush_pages ;
   time_t j_trans_start_time ;         /* time this transaction started */
-  wait_queue_head_t j_wait ;         /* wait  journal_end to finish I/O */
-  atomic_t j_wlock ;                       /* lock for j_wait */
+  struct semaphore j_lock;
+  struct semaphore j_flush_sem;
   wait_queue_head_t j_join_wait ;    /* wait for current transaction to finish before starting new one */
   atomic_t j_jlock ;                       /* lock for j_join_wait */
-  int j_journal_list_index ;	      /* journal list number of the current trans */
   int j_list_bitmap_index ;	      /* number of next list bitmap to use */
   int j_must_wait ;		       /* no more journal begins allowed. MUST sleep on j_join_wait */
   int j_next_full_flush ;             /* next journal_end will flush all journal list */
@@ -237,24 +208,45 @@ struct reiserfs_journal {
   unsigned int s_journal_trans_max ;           /* max number of blocks in a transaction.  */
   unsigned int s_journal_max_batch ;           /* max number of blocks to batch into a trans */
   unsigned int s_journal_max_commit_age ;      /* in seconds, how old can an async commit be */
+  unsigned int s_journal_default_max_commit_age ; /* the default for the max commit age */
   unsigned int s_journal_max_trans_age ;       /* in seconds, how old can a transaction be */  
 
   struct reiserfs_journal_cnode *j_cnode_free_list ;
   struct reiserfs_journal_cnode *j_cnode_free_orig ; /* orig pointer returned from vmalloc */
 
+  struct reiserfs_journal_list *j_current_jl;
   int j_free_bitmap_nodes ;
   int j_used_bitmap_nodes ;
+
+  int j_num_lists;      /* total number of active transactions */
+  int j_num_work_lists; /* number that need attention from kreiserfsd */
+
+  /* debugging to make sure things are flushed in order */
+  int j_last_flush_id;
+
+  /* debugging to make sure things are committed in order */
+  int j_last_commit_id;
+
   struct list_head j_bitmap_nodes ;
   struct list_head j_dirty_buffers ;
   spinlock_t j_dirty_buffers_lock ; /* protects j_dirty_buffers */
+
+  /* list of all active transactions */
+  struct list_head j_journal_list;
+  /* lists that haven't been touched by writeback attempts */
+  struct list_head j_working_list;
+
   struct reiserfs_list_bitmap j_list_bitmap[JOURNAL_NUM_BITMAPS] ;	/* array of bitmaps to record the deleted blocks */
-  struct reiserfs_journal_list j_journal_list[JOURNAL_LIST_COUNT] ;	    /* array of all the journal lists */
   struct reiserfs_journal_cnode *j_hash_table[JOURNAL_HASH_SIZE] ; 	    /* hash table for real buffer heads in current trans */ 
   struct reiserfs_journal_cnode *j_list_hash_table[JOURNAL_HASH_SIZE] ; /* hash table for all the real buffer heads in all 
   										the transactions */
   struct list_head j_prealloc_list;     /* list of inodes which have preallocated blocks */
   unsigned long j_max_trans_size ;
   unsigned long j_max_batch_size ;
+
+  /* when flushing ordered buffers, throttle new ordered writers */
+  struct work_struct j_work;
+  atomic_t j_async_throttle;
 };
 
 #define JOURNAL_DESC_MAGIC "ReIsErLB" /* ick.  magic string to find desc blocks in the journal */
@@ -409,12 +401,12 @@ struct reiserfs_sb_info
 #define REISERFS_3_5 0
 #define REISERFS_3_6 1
 
+enum reiserfs_mount_options {
 /* Mount options */
-#define REISERFS_LARGETAIL 0  /* large tails will be created in a session */
-#define REISERFS_SMALLTAIL 17  /* small (for files less than block size) tails will be created in a session */
-#define REPLAYONLY 3 /* replay journal and return 0. Use by fsck */
-#define REISERFS_NOLOG 4      /* -o nolog: turn journalling off */
-#define REISERFS_CONVERT 5    /* -o conv: causes conversion of old
+    REISERFS_LARGETAIL,  /* large tails will be created in a session */
+    REISERFS_SMALLTAIL,  /* small (for files less than block size) tails will be created in a session */
+    REPLAYONLY, /* replay journal and return 0. Use by fsck */
+    REISERFS_CONVERT,    /* -o conv: causes conversion of old
                                  format super block to the new
                                  format. If not specified - old
                                  partition will be dealt with in a
@@ -428,26 +420,29 @@ struct reiserfs_sb_info
 ** the existing hash on the FS, so if you have a tea hash disk, and mount
 ** with -o hash=rupasov, the mount will fail.
 */
-#define FORCE_TEA_HASH 6      /* try to force tea hash on mount */
-#define FORCE_RUPASOV_HASH 7  /* try to force rupasov hash on mount */
-#define FORCE_R5_HASH 8       /* try to force rupasov hash on mount */
-#define FORCE_HASH_DETECT 9   /* try to detect hash function on mount */
-
+    FORCE_TEA_HASH,      /* try to force tea hash on mount */
+    FORCE_RUPASOV_HASH,  /* try to force rupasov hash on mount */
+    FORCE_R5_HASH,       /* try to force rupasov hash on mount */
+    FORCE_HASH_DETECT,   /* try to detect hash function on mount */
+
+    REISERFS_DATA_LOG,
+    REISERFS_DATA_ORDERED,
+    REISERFS_DATA_WRITEBACK,
 
 /* used for testing experimental features, makes benchmarking new
    features with and without more convenient, should never be used by
    users in any code shipped to users (ideally) */
 
-#define REISERFS_NO_BORDER 11
-#define REISERFS_NO_UNHASHED_RELOCATION 12
-#define REISERFS_HASHED_RELOCATION 13
-
-#define REISERFS_ATTRS 15
-
-#define REISERFS_TEST1 11
-#define REISERFS_TEST2 12
-#define REISERFS_TEST3 13
-#define REISERFS_TEST4 14 
+    REISERFS_NO_BORDER,
+    REISERFS_NO_UNHASHED_RELOCATION,
+    REISERFS_HASHED_RELOCATION,
+    REISERFS_ATTRS,
+
+    REISERFS_TEST1,
+    REISERFS_TEST2,
+    REISERFS_TEST3,
+    REISERFS_TEST4,
+};
 
 #define reiserfs_r5_hash(s) (REISERFS_SB(s)->s_mount_opt & (1 << FORCE_R5_HASH))
 #define reiserfs_rupasov_hash(s) (REISERFS_SB(s)->s_mount_opt & (1 << FORCE_RUPASOV_HASH))
@@ -461,17 +456,15 @@ struct reiserfs_sb_info
 #define have_large_tails(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_LARGETAIL))
 #define have_small_tails(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_SMALLTAIL))
 #define replay_only(s) (REISERFS_SB(s)->s_mount_opt & (1 << REPLAYONLY))
-#define reiserfs_dont_log(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_NOLOG))
 #define reiserfs_attrs(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_ATTRS))
 #define old_format_only(s) (REISERFS_SB(s)->s_properties & (1 << REISERFS_3_5))
 #define convert_reiserfs(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_CONVERT))
-
+#define reiserfs_data_log(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_DATA_LOG))
+#define reiserfs_data_ordered(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_DATA_ORDERED))
+#define reiserfs_data_writeback(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_DATA_WRITEBACK))
 
 void reiserfs_file_buffer (struct buffer_head * bh, int list);
 extern struct file_system_type reiserfs_fs_type;
-int journal_mark_dirty(struct reiserfs_transaction_handle *, struct super_block *, struct buffer_head *bh) ;
-int flush_old_commits(struct super_block *s, int) ;
-int show_reiserfs_locks(void) ;
 int reiserfs_resize(struct super_block *, unsigned long) ;
 
 #define CARRY_ON                0
@@ -481,8 +474,6 @@ int reiserfs_resize(struct super_block *
 #define SB_BUFFER_WITH_SB(s) (REISERFS_SB(s)->s_sbh)
 #define SB_JOURNAL(s) (REISERFS_SB(s)->s_journal)
 #define SB_JOURNAL_1st_RESERVED_BLOCK(s) (SB_JOURNAL(s)->j_1st_reserved_block)
-#define SB_JOURNAL_LIST(s) (SB_JOURNAL(s)->j_journal_list)
-#define SB_JOURNAL_LIST_INDEX(s) (SB_JOURNAL(s)->j_journal_list_index) 
 #define SB_JOURNAL_LEN_FREE(s) (SB_JOURNAL(s)->j_journal_len_free) 
 #define SB_AP_BITMAP(s) (REISERFS_SB(s)->s_ap_bitmap)
 
@@ -491,6 +482,7 @@ int reiserfs_resize(struct super_block *
 #define SB_JOURNAL_TRANS_MAX(s)      (SB_JOURNAL(s)->s_journal_trans_max)
 #define SB_JOURNAL_MAX_BATCH(s)      (SB_JOURNAL(s)->s_journal_max_batch)
 #define SB_JOURNAL_MAX_COMMIT_AGE(s) (SB_JOURNAL(s)->s_journal_max_commit_age)
+#define SB_JOURNAL_DEFAULT_MAX_COMMIT_AGE(s) (SB_JOURNAL(s)->s_journal_default_max_commit_age)
 #define SB_JOURNAL_MAX_TRANS_AGE(s)  (SB_JOURNAL(s)->s_journal_max_trans_age)
 
 /* A safe version of the "bdevname", which returns the "s_id" field of
--- diff/include/linux/rtnetlink.h	2004-02-09 10:36:12.000000000 +0000
+++ source/include/linux/rtnetlink.h	2004-04-21 10:45:35.966235800 +0100
@@ -47,7 +47,11 @@
 #define RTM_NEWPREFIX	(RTM_BASE+36)
 #define RTM_GETPREFIX	(RTM_BASE+38)
 
-#define	RTM_MAX		(RTM_BASE+39)
+#define	RTM_GETMULTICAST (RTM_BASE+42)
+
+#define	RTM_GETANYCAST	(RTM_BASE+46)
+
+#define	RTM_MAX		(RTM_BASE+47)
 
 /* 
    Generic structure for encapsulation of optional route information.
@@ -340,7 +344,8 @@ enum
 	IFA_LABEL,
 	IFA_BROADCAST,
 	IFA_ANYCAST,
-	IFA_CACHEINFO
+	IFA_CACHEINFO,
+	IFA_MULTICAST
 };
 
 #define IFA_MAX IFA_CACHEINFO
--- diff/include/linux/sched.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/sched.h	2004-04-21 10:45:35.967235648 +0100
@@ -170,6 +170,8 @@ extern void update_one_process(struct ta
 			       unsigned long system, int cpu);
 extern void scheduler_tick(int user_tick, int system);
 extern unsigned long cache_decay_ticks;
+extern const unsigned long scheduling_functions_start_here;
+extern const unsigned long scheduling_functions_end_here;
 
 
 #define	MAX_SCHEDULE_TIMEOUT	LONG_MAX
@@ -267,6 +269,18 @@ struct signal_struct {
 
 	/* thread group stop support, overloads group_exit_code too */
 	int			group_stop_count;
+
+	/* POSIX.1b Interval Timers */
+	struct list_head posix_timers;
+
+	/* job control IDs */
+	pid_t pgrp;
+	pid_t tty_old_pgrp;
+	pid_t session;
+	/* boolean value for session group leader */
+	int leader;
+
+	struct tty_struct *tty; /* NULL if no tty */
 };
 
 /*
@@ -360,6 +374,8 @@ int set_current_groups(struct group_info
     ((gi)->blocks[(i)/NGROUPS_PER_BLOCK][(i)%NGROUPS_PER_BLOCK])
 
 
+struct audit_context;		/* See audit.c */
+
 struct task_struct {
 	volatile long state;	/* -1 unrunnable, 0 runnable, >0 stopped */
 	struct thread_info *thread_info;
@@ -396,12 +412,7 @@ struct task_struct {
 	unsigned long personality;
 	int did_exec:1;
 	pid_t pid;
-	pid_t __pgrp;		/* Accessed via process_group() */
-	pid_t tty_old_pgrp;
-	pid_t session;
 	pid_t tgid;
-	/* boolean value for session group leader */
-	int leader;
 	/* 
 	 * pointers to (original) parent process, youngest child, younger sibling,
 	 * older sibling, respectively.  (p->father can be replaced with 
@@ -425,12 +436,11 @@ struct task_struct {
 	unsigned long it_real_value, it_prof_value, it_virt_value;
 	unsigned long it_real_incr, it_prof_incr, it_virt_incr;
 	struct timer_list real_timer;
-	struct list_head posix_timers; /* POSIX.1b Interval Timers */
 	unsigned long utime, stime, cutime, cstime;
 	unsigned long nvcsw, nivcsw, cnvcsw, cnivcsw; /* context switch counts */
 	u64 start_time;
 /* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */
-	unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;
+	unsigned long min_flt, maj_flt, cmin_flt, cmaj_flt;
 /* process credentials */
 	uid_t uid,euid,suid,fsuid;
 	gid_t gid,egid,sgid,fsgid;
@@ -444,7 +454,6 @@ struct task_struct {
 	char comm[16];
 /* file system info */
 	int link_count, total_link_count;
-	struct tty_struct *tty; /* NULL if no tty */
 /* ipc stuff */
 	struct sysv_sem sysvsem;
 /* CPU-specific state of this task */
@@ -469,6 +478,7 @@ struct task_struct {
 	sigset_t *notifier_mask;
 	
 	void *security;
+	struct audit_context *audit_context;
 
 /* Thread group tracking */
    	u32 parent_exec_id;
@@ -497,7 +507,7 @@ struct task_struct {
 
 static inline pid_t process_group(struct task_struct *tsk)
 {
-	return tsk->group_leader->__pgrp;
+	return tsk->signal->pgrp;
 }
 
 extern void __put_task_struct(struct task_struct *tsk);
@@ -522,7 +532,7 @@ do { if (atomic_dec_and_test(&(tsk)->usa
 #define PF_FLUSHER	0x00002000	/* responsible for disk writeback */
 
 #define PF_FREEZE	0x00004000	/* this task should be frozen for suspend */
-#define PF_IOTHREAD	0x00008000	/* this thread is needed for doing I/O to swap */
+#define PF_NOFREEZE	0x00008000	/* this thread should not be frozen */
 #define PF_FROZEN	0x00010000	/* frozen for system suspend */
 #define PF_FSTRANS	0x00020000	/* inside a filesystem transaction */
 #define PF_KSWAPD	0x00040000	/* I am kswapd */
@@ -720,7 +730,7 @@ extern void exit_signal(struct task_stru
 extern void __exit_signal(struct task_struct *);
 extern void exit_sighand(struct task_struct *);
 extern void __exit_sighand(struct task_struct *);
-extern void exit_itimers(struct task_struct *);
+extern void exit_itimers(struct signal_struct *);
 
 extern NORET_TYPE void do_group_exit(int);
 
--- diff/include/linux/sem.h	2004-03-11 10:20:29.000000000 +0000
+++ source/include/linux/sem.h	2004-04-21 10:45:35.968235496 +0100
@@ -134,7 +134,22 @@ struct sysv_sem {
 	struct sem_undo_list *undo_list;
 };
 
-void exit_sem(struct task_struct *p);
+#ifdef CONFIG_SYSVIPC
+
+extern int copy_semundo(unsigned long clone_flags, struct task_struct *tsk);
+extern void exit_sem(struct task_struct *tsk);
+
+#else
+static inline int copy_semundo(unsigned long clone_flags, struct task_struct *tsk)
+{
+	return 0;
+}
+
+static inline void exit_sem(struct task_struct *tsk)
+{
+	return;
+}
+#endif
 
 #endif /* __KERNEL__ */
 
--- diff/include/linux/seq_file.h	2003-09-30 15:46:20.000000000 +0100
+++ source/include/linux/seq_file.h	2004-04-21 10:45:35.968235496 +0100
@@ -35,27 +35,8 @@ ssize_t seq_read(struct file *, char __u
 loff_t seq_lseek(struct file *, loff_t, int);
 int seq_release(struct inode *, struct file *);
 int seq_escape(struct seq_file *, const char *, const char *);
-
-static inline int seq_putc(struct seq_file *m, char c)
-{
-	if (m->count < m->size) {
-		m->buf[m->count++] = c;
-		return 0;
-	}
-	return -1;
-}
-
-static inline int seq_puts(struct seq_file *m, const char *s)
-{
-	int len = strlen(s);
-	if (m->count + len < m->size) {
-		memcpy(m->buf + m->count, s, len);
-		m->count += len;
-		return 0;
-	}
-	m->count = m->size;
-	return -1;
-}
+int seq_putc(struct seq_file *m, char c);
+int seq_puts(struct seq_file *m, const char *s);
 
 int seq_printf(struct seq_file *, const char *, ...)
 	__attribute__ ((format (printf,2,3)));
--- diff/include/linux/serial_core.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/serial_core.h	2004-04-21 10:45:35.968235496 +0100
@@ -16,8 +16,6 @@
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- *  $Id: serial_core.h,v 1.49 2002/07/20 18:06:32 rmk Exp $
  */
 
 /*
@@ -38,7 +36,8 @@
 #define PORT_16850	12
 #define PORT_RSA	13
 #define PORT_NS16550A	14
-#define PORT_MAX_8250	14	/* max port ID */
+#define PORT_XSCALE	15
+#define PORT_MAX_8250	15	/* max port ID */
 
 /*
  * ARM specific type numbers.  These are not currently guaranteed
@@ -83,6 +82,9 @@
 #define PORT_SCIF	53
 #define PORT_IRDA	54
 
+/* Samsung S3C2410 SoC and derivatives thereof */
+#define PORT_S3C2410    55
+
 #ifdef __KERNEL__
 
 #include <linux/config.h>
@@ -94,6 +96,7 @@
 struct uart_port;
 struct uart_info;
 struct serial_struct;
+struct device;
 
 /*
  * This structure describes all the operations that can be
@@ -182,7 +185,6 @@ struct uart_port {
 
 	unsigned int		flags;
 
-#define UPF_HUP_NOTIFY		(1 << 0)
 #define UPF_FOURPORT		(1 << 1)
 #define UPF_SAK			(1 << 2)
 #define UPF_SPD_MASK		(0x1030)
@@ -215,6 +217,7 @@ struct uart_port {
 	unsigned int		custom_divisor;
 	unsigned int		line;			/* port index */
 	unsigned long		mapbase;		/* for ioremap */
+	struct device		*dev;			/* parent device */
 	unsigned char		hub6;			/* this should be in the 8250 driver */
 	unsigned char		unused[3];
 };
--- diff/include/linux/serial_reg.h	2004-03-11 10:20:29.000000000 +0000
+++ source/include/linux/serial_reg.h	2004-04-21 10:45:35.969235344 +0100
@@ -121,6 +121,7 @@
 /*
  * These are the definitions for the Modem Control Register
  */
+#define UART_MCR_AFE	0x20	/* Enable auto-RTS/CTS (TI16C750) */
 #define UART_MCR_LOOP	0x10	/* Enable loopback test mode */
 #define UART_MCR_OUT2	0x08	/* Out2 complement */
 #define UART_MCR_OUT1	0x04	/* Out1 complement */
@@ -141,7 +142,7 @@
 #define UART_MSR_ANY_DELTA 0x0F	/* Any of the delta bits! */
 
 /*
- * The Intel PXA2xx chip defines those bits
+ * The Intel XScale on-chip UARTs define these bits
  */
 #define UART_IER_DMAE	0x80	/* DMA Requests Enable */
 #define UART_IER_UUE	0x40	/* UART Unit Enable */
--- diff/include/linux/slab.h	2004-02-18 08:54:13.000000000 +0000
+++ source/include/linux/slab.h	2004-04-21 10:45:35.969235344 +0100
@@ -25,9 +25,7 @@ typedef struct kmem_cache_s kmem_cache_t
 #define	SLAB_KERNEL		GFP_KERNEL
 #define	SLAB_DMA		GFP_DMA
 
-#define SLAB_LEVEL_MASK		(__GFP_WAIT|__GFP_HIGH|__GFP_IO|__GFP_FS|\
-				__GFP_COLD|__GFP_NOWARN|__GFP_REPEAT|\
-				__GFP_NOFAIL|__GFP_NORETRY)
+#define SLAB_LEVEL_MASK		GFP_LEVEL_MASK
 
 #define	SLAB_NO_GROW		__GFP_NO_GROW	/* don't grow a cache */
 
--- diff/include/linux/sunrpc/sched.h	2004-02-18 08:54:13.000000000 +0000
+++ source/include/linux/sunrpc/sched.h	2004-04-21 10:45:35.970235192 +0100
@@ -49,6 +49,8 @@ struct rpc_task {
 				tk_cred_retry,
 				tk_suid_retry;
 
+	unsigned long		tk_cookie;	/* Cookie for batching tasks */
+
 	/*
 	 * timeout_fn   to be executed by timer bottom half
 	 * callback	to be executed after waking up
@@ -72,7 +74,9 @@ struct rpc_task {
 	unsigned long		tk_timeout;	/* timeout for rpc_sleep() */
 	unsigned short		tk_flags;	/* misc flags */
 	unsigned char		tk_active   : 1;/* Task has been activated */
+	unsigned char		tk_priority : 2;/* Task priority */
 	unsigned long		tk_runstate;	/* Task run status */
+	struct list_head	tk_links;	/* links to related tasks */
 #ifdef RPC_DEBUG
 	unsigned short		tk_pid;		/* debugging aid */
 #endif
@@ -138,28 +142,58 @@ typedef void			(*rpc_action)(struct rpc_
 	} while(0)
 
 /*
+ * Task priorities.
+ * Note: if you change these, you must also change
+ * the task initialization definitions below.
+ */
+#define RPC_PRIORITY_LOW	0
+#define RPC_PRIORITY_NORMAL	1
+#define RPC_PRIORITY_HIGH	2
+#define RPC_NR_PRIORITY		(RPC_PRIORITY_HIGH+1)
+
+/*
  * RPC synchronization objects
  */
 struct rpc_wait_queue {
-	struct list_head	tasks;
+	struct list_head	tasks[RPC_NR_PRIORITY];	/* task queue for each priority level */
+	unsigned long		cookie;			/* cookie of last task serviced */
+	unsigned char		maxpriority;		/* maximum priority (0 if queue is not a priority queue) */
+	unsigned char		priority;		/* current priority */
+	unsigned char		count;			/* # task groups remaining serviced so far */
+	unsigned char		nr;			/* # tasks remaining for cookie */
 #ifdef RPC_DEBUG
-	char *			name;
+	const char *		name;
 #endif
 };
 
+/*
+ * This is the # requests to send consecutively
+ * from a single cookie.  The aim is to improve
+ * performance of NFS operations such as read/write.
+ */
+#define RPC_BATCH_COUNT			16
+
 #ifndef RPC_DEBUG
-# define RPC_WAITQ_INIT(var,qname) ((struct rpc_wait_queue) {LIST_HEAD_INIT(var)})
-# define RPC_WAITQ(var,qname)      struct rpc_wait_queue var = RPC_WAITQ_INIT(var.tasks,qname)
-# define INIT_RPC_WAITQ(ptr,qname) do { \
-	INIT_LIST_HEAD(&(ptr)->tasks); \
-	} while(0)
+# define RPC_WAITQ_INIT(var,qname) { \
+		.tasks = { \
+			[0] = LIST_HEAD_INIT(var.tasks[0]), \
+			[1] = LIST_HEAD_INIT(var.tasks[1]), \
+			[2] = LIST_HEAD_INIT(var.tasks[2]), \
+		}, \
+	}
 #else
-# define RPC_WAITQ_INIT(var,qname) ((struct rpc_wait_queue) {LIST_HEAD_INIT(var.tasks), qname})
-# define RPC_WAITQ(var,qname)      struct rpc_wait_queue var = RPC_WAITQ_INIT(var,qname)
-# define INIT_RPC_WAITQ(ptr,qname) do { \
-	INIT_LIST_HEAD(&(ptr)->tasks); (ptr)->name = qname; \
-	} while(0)
+# define RPC_WAITQ_INIT(var,qname) { \
+		.tasks = { \
+			[0] = LIST_HEAD_INIT(var.tasks[0]), \
+			[1] = LIST_HEAD_INIT(var.tasks[1]), \
+			[2] = LIST_HEAD_INIT(var.tasks[2]), \
+		}, \
+		.name = qname, \
+	}
 #endif
+# define RPC_WAITQ(var,qname)      struct rpc_wait_queue var = RPC_WAITQ_INIT(var,qname)
+
+#define RPC_IS_PRIORITY(q)		((q)->maxpriority > 0)
 
 /*
  * Function prototypes
@@ -175,6 +209,8 @@ void		rpc_run_child(struct rpc_task *par
 					rpc_action action);
 int		rpc_add_wait_queue(struct rpc_wait_queue *, struct rpc_task *);
 void		rpc_remove_wait_queue(struct rpc_task *);
+void		rpc_init_priority_wait_queue(struct rpc_wait_queue *, const char *);
+void		rpc_init_wait_queue(struct rpc_wait_queue *, const char *);
 void		rpc_sleep_on(struct rpc_wait_queue *, struct rpc_task *,
 					rpc_action action, rpc_action timer);
 void		rpc_add_timer(struct rpc_task *, rpc_action);
@@ -194,16 +230,14 @@ void		rpc_show_tasks(void);
 int		rpc_init_mempool(void);
 void		rpc_destroy_mempool(void);
 
-static __inline__ void
-rpc_exit(struct rpc_task *task, int status)
+static inline void rpc_exit(struct rpc_task *task, int status)
 {
 	task->tk_status = status;
 	task->tk_action = NULL;
 }
 
 #ifdef RPC_DEBUG
-static __inline__ char *
-rpc_qname(struct rpc_wait_queue *q)
+static inline const char * rpc_qname(struct rpc_wait_queue *q)
 {
 	return ((q && q->name) ? q->name : "unknown");
 }
--- diff/include/linux/sunrpc/svcauth_gss.h	2004-03-11 10:20:29.000000000 +0000
+++ source/include/linux/sunrpc/svcauth_gss.h	2004-04-21 10:45:35.970235192 +0100
@@ -22,14 +22,5 @@
 int gss_svc_init(void);
 int svcauth_gss_register_pseudoflavor(u32 pseudoflavor, char * name);
 
-
-struct gss_svc_data {
-	/* decoded gss client cred: */
-	struct rpc_gss_wire_cred	clcred;
-	/* pointer to the beginning of the procedure-specific results, which
-	 * may be encrypted/checksummed in svcauth_gss_release: */
-	u32				*body_start;
-};
-
 #endif /* __KERNEL__ */
 #endif /* _LINUX_SUNRPC_SVCAUTH_GSS_H */
--- diff/include/linux/sunrpc/xdr.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/sunrpc/xdr.h	2004-04-21 10:45:35.971235040 +0100
@@ -55,7 +55,8 @@ struct xdr_buf {
 	unsigned int	page_base,	/* Start of page data */
 			page_len;	/* Length of page data */
 
-	unsigned int	len;		/* Total length of data */
+	unsigned int	buflen,		/* Total length of storage buffer */
+			len;		/* Length of XDR encoded message */
 
 };
 
@@ -87,7 +88,8 @@ struct xdr_buf {
 /*
  * Miscellaneous XDR helper functions
  */
-u32 *	xdr_encode_array(u32 *p, const void *s, unsigned int len);
+u32 *	xdr_encode_opaque_fixed(u32 *p, const void *ptr, unsigned int len);
+u32 *	xdr_encode_opaque(u32 *p, const void *ptr, unsigned int len);
 u32 *	xdr_encode_string(u32 *p, const char *s);
 u32 *	xdr_decode_string(u32 *p, char **sp, int *lenp, int maxlen);
 u32 *	xdr_decode_string_inplace(u32 *p, char **sp, int *lenp, int maxlen);
@@ -100,6 +102,11 @@ void	xdr_encode_pages(struct xdr_buf *, 
 void	xdr_inline_pages(struct xdr_buf *, unsigned int,
 			 struct page **, unsigned int, unsigned int);
 
+static inline u32 *xdr_encode_array(u32 *p, const void *s, unsigned int len)
+{
+	return xdr_encode_opaque(p, s, len);
+}
+
 /*
  * Decode 64bit quantities (NFSv3 support)
  */
@@ -145,6 +152,7 @@ extern void _copy_from_pages(char *, str
 extern void xdr_buf_from_iov(struct iovec *, struct xdr_buf *);
 extern int xdr_buf_subsegment(struct xdr_buf *, struct xdr_buf *, int, int);
 extern int xdr_buf_read_netobj(struct xdr_buf *, struct xdr_netobj *, int);
+extern int read_bytes_from_xdr_buf(struct xdr_buf *buf, int base, void *obj, int len);
 
 /*
  * Helper structure for copying from an sk_buff.
@@ -177,86 +185,14 @@ struct xdr_stream {
 	struct iovec *iov;	/* pointer to the current iovec */
 };
 
-/*
- * Initialize an xdr_stream for encoding data.
- *
- * Note: at the moment the RPC client only passes the length of our
- *	 scratch buffer in the xdr_buf's header iovec. Previously this
- *	 meant we needed to call xdr_adjust_iovec() after encoding the
- *	 data. With the new scheme, the xdr_stream manages the details
- *	 of the buffer length, and takes care of adjusting the iovec
- *	 length for us.
- */
-static inline void
-xdr_init_encode(struct xdr_stream *xdr, struct xdr_buf *buf, uint32_t *p)
-{
-	struct iovec *iov = buf->head;
-
-	xdr->buf = buf;
-	xdr->iov = iov;
-	xdr->end = (uint32_t *)((char *)iov->iov_base + iov->iov_len);
-	buf->len = iov->iov_len = (char *)p - (char *)iov->iov_base;
-	xdr->p = p;
-}
-
-/*
- * Check that we have enough buffer space to encode 'nbytes' more
- * bytes of data. If so, update the total xdr_buf length, and
- * adjust the length of the current iovec.
- */
-static inline uint32_t *
-xdr_reserve_space(struct xdr_stream *xdr, size_t nbytes)
-{
-	uint32_t *p = xdr->p;
-	uint32_t *q;
-
-	/* align nbytes on the next 32-bit boundary */
-	nbytes += 3;
-	nbytes &= ~3;
-	q = p + (nbytes >> 2);
-	if (unlikely(q > xdr->end || q < p))
-		return NULL;
-	xdr->p = q;
-	xdr->iov->iov_len += nbytes;
-	xdr->buf->len += nbytes;
-	return p;
-}
-
+extern void xdr_init_encode(struct xdr_stream *xdr, struct xdr_buf *buf, uint32_t *p);
+extern uint32_t *xdr_reserve_space(struct xdr_stream *xdr, size_t nbytes);
 extern void xdr_write_pages(struct xdr_stream *xdr, struct page **pages,
 		unsigned int base, unsigned int len);
+extern void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, uint32_t *p);
+extern uint32_t *xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes);
 extern void xdr_read_pages(struct xdr_stream *xdr, unsigned int len);
 
-/*
- * Initialize an xdr_stream for decoding data.
- */
-static inline void
-xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, uint32_t *p)
-{
-	struct iovec *iov = buf->head;
-	xdr->buf = buf;
-	xdr->iov = iov;
-	xdr->p = p;
-	xdr->end = (uint32_t *)((char *)iov->iov_base + iov->iov_len);
-}
-
-/*
- * Check if the input buffer is long enough to enable us to decode
- * 'nbytes' more bytes of data starting at the current position.
- * If so return the current pointer, then update the current
- * position.
- */
-static inline uint32_t *
-xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes)
-{
-	uint32_t *p = xdr->p;
-	uint32_t *q = p + XDR_QUADLEN(nbytes);
-
-	if (unlikely(q > xdr->end || q < p))
-		return NULL;
-	xdr->p = q;
-	return p;
-}
-
 #endif /* __KERNEL__ */
 
 #endif /* _SUNRPC_XDR_H_ */
--- diff/include/linux/sunrpc/xprt.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/sunrpc/xprt.h	2004-04-21 10:45:35.971235040 +0100
@@ -120,8 +120,6 @@ struct rpc_rqst {
 };
 #define rq_svec			rq_snd_buf.head
 #define rq_slen			rq_snd_buf.len
-#define rq_rvec			rq_rcv_buf.head
-#define rq_rlen			rq_rcv_buf.len
 
 #define XPRT_LAST_FRAG		(1 << 0)
 #define XPRT_COPY_RECM		(1 << 1)
@@ -218,12 +216,15 @@ void			xprt_connect(struct rpc_task *);
 int			xprt_clear_backlog(struct rpc_xprt *);
 void			xprt_sock_setbufsize(struct rpc_xprt *);
 
-#define XPRT_CONNECT	0
-#define XPRT_LOCKED	1
+#define XPRT_LOCKED	0
+#define XPRT_CONNECT	1
+#define XPRT_CONNECTING	2
 
 #define xprt_connected(xp)		(test_bit(XPRT_CONNECT, &(xp)->sockstate))
 #define xprt_set_connected(xp)		(set_bit(XPRT_CONNECT, &(xp)->sockstate))
 #define xprt_test_and_set_connected(xp)	(test_and_set_bit(XPRT_CONNECT, &(xp)->sockstate))
+#define xprt_test_and_clear_connected(xp) \
+					(test_and_clear_bit(XPRT_CONNECT, &(xp)->sockstate))
 #define xprt_clear_connected(xp)	(clear_bit(XPRT_CONNECT, &(xp)->sockstate))
 
 #endif /* __KERNEL__*/
--- diff/include/linux/suspend.h	2004-03-11 10:20:29.000000000 +0000
+++ source/include/linux/suspend.h	2004-04-21 10:45:35.971235040 +0100
@@ -24,7 +24,7 @@ typedef struct pbe {
 #define SWAP_FILENAME_MAXLENGTH	32
 
 struct suspend_header {
-	__u32 version_code;
+	u32 version_code;
 	unsigned long num_physpages;
 	char machine[8];
 	char version[20];
--- diff/include/linux/swap.h	2004-02-09 10:36:12.000000000 +0000
+++ source/include/linux/swap.h	2004-04-21 10:45:35.972234888 +0100
@@ -76,7 +76,6 @@ struct reclaim_state {
 #ifdef __KERNEL__
 
 struct address_space;
-struct pte_chain;
 struct sysinfo;
 struct writeback_control;
 struct zone;
@@ -177,26 +176,11 @@ extern int try_to_free_pages(struct zone
 extern int shrink_all_memory(int);
 extern int vm_swappiness;
 
-/* linux/mm/rmap.c */
 #ifdef CONFIG_MMU
-int FASTCALL(page_referenced(struct page *));
-struct pte_chain *FASTCALL(page_add_rmap(struct page *, pte_t *,
-					struct pte_chain *));
-void FASTCALL(page_remove_rmap(struct page *, pte_t *));
-int FASTCALL(try_to_unmap(struct page *));
-
 /* linux/mm/shmem.c */
 extern int shmem_unuse(swp_entry_t entry, struct page *page);
-#else
-#define page_referenced(page)	TestClearPageReferenced(page)
-#define try_to_unmap(page)	SWAP_FAIL
 #endif /* CONFIG_MMU */
 
-/* return values of try_to_unmap */
-#define	SWAP_SUCCESS	0
-#define	SWAP_AGAIN	1
-#define	SWAP_FAIL	2
-
 #ifdef CONFIG_SWAP
 /* linux/mm/page_io.c */
 extern int swap_readpage(struct file *, struct page *);
@@ -232,6 +216,7 @@ extern sector_t map_swap_page(struct swa
 extern struct swap_info_struct *get_swap_info_struct(unsigned);
 extern int can_share_swap_page(struct page *);
 extern int remove_exclusive_swap_page(struct page *);
+extern void swap_unplug_io_fn(struct page *);
 
 extern struct swap_list_t swap_list;
 extern spinlock_t swaplock;
@@ -265,6 +250,7 @@ extern spinlock_t swaplock;
 #define move_from_swap_cache(p, i, m)		1
 #define __delete_from_swap_cache(p)		/*NOTHING*/
 #define delete_from_swap_cache(p)		/*NOTHING*/
+#define swap_unplug_io_fn(p)			/*NOTHING*/
 
 static inline int remove_exclusive_swap_page(struct page *p)
 {
--- diff/include/linux/syscalls.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/syscalls.h	2004-04-21 10:45:35.972234888 +0100
@@ -48,6 +48,7 @@ struct timex;
 struct timezone;
 struct tms;
 struct utimbuf;
+struct mq_attr;
 
 #include <linux/config.h>
 #include <linux/types.h>
@@ -450,6 +451,13 @@ asmlinkage long sys_shmget(key_t key, si
 asmlinkage long sys_shmdt(char __user *shmaddr);
 asmlinkage long sys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf);
 
+asmlinkage long sys_mq_open(const char __user *name, int oflag, mode_t mode, struct mq_attr __user *attr);
+asmlinkage long sys_mq_unlink(const char __user *name);
+asmlinkage long sys_mq_timedsend(mqd_t mqdes, const char __user *msg_ptr, size_t msg_len, unsigned int msg_prio, const struct timespec __user *abs_timeout);
+asmlinkage ssize_t sys_mq_timedreceive(mqd_t mqdes, char __user *msg_ptr, size_t msg_len, unsigned int __user *msg_prio, const struct timespec __user *abs_timeout);
+asmlinkage long sys_mq_notify(mqd_t mqdes, const struct sigevent __user *notification);
+asmlinkage long sys_mq_getsetattr(mqd_t mqdes, const struct mq_attr __user *mqstat, struct mq_attr __user *omqstat);
+
 asmlinkage long sys_pciconfig_iobase(long which, unsigned long bus, unsigned long devfn);
 asmlinkage long sys_pciconfig_read(unsigned long bus, unsigned long dfn,
 				unsigned long off, unsigned long len,
--- diff/include/linux/sysctl.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/sysctl.h	2004-04-21 10:45:35.973234736 +0100
@@ -131,6 +131,7 @@ enum
 	KERN_PRINTK_RATELIMIT_BURST=61,	/* int: tune printk ratelimiting */
 	KERN_PTY=62,		/* dir: pty driver */
 	KERN_NGROUPS_MAX=63,	/* int: NGROUPS_MAX */
+	KERN_SPARC_SCONS_PWROFF=64, /* int: serial console power-off halt */
 };
 
 
@@ -159,6 +160,8 @@ enum
 	VM_LOWER_ZONE_PROTECTION=20,/* Amount of protection of lower zones */
 	VM_MIN_FREE_KBYTES=21,	/* Minimum free kilobytes to maintain */
 	VM_MAX_MAP_COUNT=22,	/* int: Maximum number of mmaps/address-space */
+	VM_LAPTOP_MODE=23,	/* vm laptop mode */
+	VM_BLOCK_DUMP=24,	/* block dump mode */
 };
 
 
--- diff/include/linux/sysfs.h	2003-08-26 10:00:54.000000000 +0100
+++ source/include/linux/sysfs.h	2004-04-21 10:45:35.973234736 +0100
@@ -18,6 +18,12 @@ struct attribute {
 	mode_t			mode;
 };
 
+struct attribute_group {
+	char			* name;
+	struct attribute	** attrs;
+};
+
+
 struct bin_attribute {
 	struct attribute	attr;
 	size_t			size;
@@ -25,14 +31,13 @@ struct bin_attribute {
 	ssize_t (*write)(struct kobject *, char *, loff_t, size_t);
 };
 
-int sysfs_create_bin_file(struct kobject * kobj, struct bin_attribute * attr);
-int sysfs_remove_bin_file(struct kobject * kobj, struct bin_attribute * attr);
-
 struct sysfs_ops {
 	ssize_t	(*show)(struct kobject *, struct attribute *,char *);
 	ssize_t	(*store)(struct kobject *,struct attribute *,const char *, size_t);
 };
 
+#ifdef CONFIG_SYSFS
+
 extern int
 sysfs_create_dir(struct kobject *);
 
@@ -57,13 +62,75 @@ sysfs_create_link(struct kobject * kobj,
 extern void
 sysfs_remove_link(struct kobject *, char * name);
 
-
-struct attribute_group {
-	char			* name;
-	struct attribute	** attrs;
-};
+int sysfs_create_bin_file(struct kobject * kobj, struct bin_attribute * attr);
+int sysfs_remove_bin_file(struct kobject * kobj, struct bin_attribute * attr);
 
 int sysfs_create_group(struct kobject *, const struct attribute_group *);
 void sysfs_remove_group(struct kobject *, const struct attribute_group *);
 
+#else /* CONFIG_SYSFS */
+
+static inline int sysfs_create_dir(struct kobject * k)
+{
+	return 0;
+}
+
+static inline void sysfs_remove_dir(struct kobject * k)
+{
+	;
+}
+
+static inline void sysfs_rename_dir(struct kobject * k, const char *new_name)
+{
+	;
+}
+
+static inline int sysfs_create_file(struct kobject * k, const struct attribute * a)
+{
+	return 0;
+}
+
+static inline int sysfs_update_file(struct kobject * k, const struct attribute * a)
+{
+	return 0;
+}
+
+static inline void sysfs_remove_file(struct kobject * k, const struct attribute * a)
+{
+	;
+}
+
+static inline int sysfs_create_link(struct kobject * k, struct kobject * t, char * n)
+{
+	return 0;
+}
+
+static inline void sysfs_remove_link(struct kobject * k, char * name)
+{
+	;
+}
+
+
+static inline int sysfs_create_bin_file(struct kobject * k, struct bin_attribute * a)
+{
+	return 0;
+}
+
+static inline int sysfs_remove_bin_file(struct kobject * k, struct bin_attribute * a)
+{
+	return 0;
+}
+
+static inline int sysfs_create_group(struct kobject * k, const struct attribute_group *g)
+{
+	return 0;
+}
+
+static inline void sysfs_remove_group(struct kobject * k, const struct attribute_group * g)
+{
+	;
+}
+
+#endif /* CONFIG_SYSFS */
+
 #endif /* _SYSFS_H_ */
--- diff/include/linux/tty.h	2004-03-11 10:20:29.000000000 +0000
+++ source/include/linux/tty.h	2004-04-21 10:45:35.974234584 +0100
@@ -363,6 +363,9 @@ extern void tty_flip_buffer_push(struct 
 extern int tty_get_baud_rate(struct tty_struct *tty);
 extern int tty_termios_baud_rate(struct termios *termios);
 
+struct semaphore;
+extern struct semaphore tty_sem;
+
 /* n_tty.c */
 extern struct tty_ldisc tty_ldisc_N_TTY;
 
--- diff/include/linux/types.h	2003-09-30 15:46:20.000000000 +0100
+++ source/include/linux/types.h	2004-04-21 10:45:35.974234584 +0100
@@ -8,8 +8,6 @@
 	(((bits)+BITS_PER_LONG-1)/BITS_PER_LONG)
 #define DECLARE_BITMAP(name,bits) \
 	unsigned long name[BITS_TO_LONGS(bits)]
-#define CLEAR_BITMAP(name,bits) \
-	memset(name, 0, BITS_TO_LONGS(bits)*sizeof(unsigned long))
 #endif
 
 #include <linux/posix_types.h>
@@ -31,6 +29,7 @@ typedef __kernel_key_t		key_t;
 typedef __kernel_suseconds_t	suseconds_t;
 typedef __kernel_timer_t	timer_t;
 typedef __kernel_clockid_t	clockid_t;
+typedef __kernel_mqd_t		mqd_t;
 
 #ifdef __KERNEL__
 typedef __kernel_uid32_t	uid_t;
--- diff/include/linux/udp.h	2004-01-19 10:22:59.000000000 +0000
+++ source/include/linux/udp.h	2004-04-21 10:45:35.974234584 +0100
@@ -31,6 +31,7 @@ struct udphdr {
 #define UDP_ENCAP	100	/* Set the socket to accept encapsulated packets */
 
 /* UDP encapsulation types */
+#define UDP_ENCAP_ESPINUDP_NON_IKE	1 /* draft-ietf-ipsec-nat-t-ike-00/01 */
 #define UDP_ENCAP_ESPINUDP	2 /* draft-ietf-ipsec-udp-encaps-06 */
 
 #ifdef __KERNEL__
--- diff/include/linux/ufs_fs.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/ufs_fs.h	2004-04-21 10:45:35.975234432 +0100
@@ -896,7 +896,7 @@ extern void ufs_free_inode (struct inode
 extern struct inode * ufs_new_inode (struct inode *, int);
 
 /* inode.c */
-extern u64  ufs_frag_map (struct inode *, int);
+extern u64  ufs_frag_map (struct inode *, sector_t);
 extern void ufs_read_inode (struct inode *);
 extern void ufs_put_inode (struct inode *);
 extern void ufs_write_inode (struct inode *, int);
--- diff/include/linux/usb.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/usb.h	2004-04-21 10:45:35.976234280 +0100
@@ -31,6 +31,7 @@ static __inline__ void wait_ms(unsigned 
 }
 
 struct usb_device;
+struct usb_driver;
 
 /*-------------------------------------------------------------------------*/
 
@@ -86,8 +87,6 @@ struct usb_host_interface {
  *	number from the USB core by calling usb_register_dev().
  * @dev: driver model's view of this device
  * @class_dev: driver model's class view of this device.
- * @released: wait for the interface to be released when changing
- *	configurations.
  *
  * USB device drivers attach to interfaces on a physical device.  Each
  * interface encapsulates a single high level function, such as feeding
@@ -123,11 +122,9 @@ struct usb_interface {
 					 * active alternate setting */
 	unsigned num_altsetting;	/* number of alternate settings */
 
-	struct usb_driver *driver;	/* driver */
 	int minor;			/* minor number this interface is bound to */
 	struct device dev;		/* interface specific device info */
 	struct class_device *class_dev;
-	struct completion *released;	/* wait for release */
 };
 #define	to_usb_interface(d) container_of(d, struct usb_interface, dev)
 #define	interface_to_usbdev(intf) \
@@ -143,6 +140,9 @@ static inline void usb_set_intfdata (str
 	dev_set_drvdata(&intf->dev, data);
 }
 
+struct usb_interface *usb_get_intf(struct usb_interface *intf);
+void usb_put_intf(struct usb_interface *intf);
+
 /* this maximum is arbitrary */
 #define USB_MAXINTERFACES	32
 
@@ -318,7 +318,21 @@ extern int usb_get_current_frame_number 
 /* used these for multi-interface device registration */
 extern int usb_driver_claim_interface(struct usb_driver *driver,
 			struct usb_interface *iface, void* priv);
-extern int usb_interface_claimed(struct usb_interface *iface);
+
+/**
+ * usb_interface_claimed - returns true iff an interface is claimed
+ * @iface: the interface being checked
+ *
+ * Returns true (nonzero) iff the interface is claimed, else false (zero).
+ * Callers must own the driver model's usb bus readlock.  So driver
+ * probe() entries don't need extra locking, but other call contexts
+ * may need to explicitly claim that lock.
+ *
+ */
+static int inline usb_interface_claimed(struct usb_interface *iface) {
+	return (iface->dev.driver != NULL);
+}
+
 extern void usb_driver_release_interface(struct usb_driver *driver,
 			struct usb_interface *iface);
 const struct usb_device_id *usb_match_id(struct usb_interface *interface,
@@ -904,7 +918,6 @@ extern int usb_string(struct usb_device 
 /* wrappers that also update important state inside usbcore */
 extern int usb_clear_halt(struct usb_device *dev, int pipe);
 extern int usb_reset_configuration(struct usb_device *dev);
-extern int usb_set_configuration(struct usb_device *dev, int configuration);
 extern int usb_set_interface(struct usb_device *dev, int ifnum, int alternate);
 
 /*
--- diff/include/linux/usb_ch9.h	2004-01-19 10:22:59.000000000 +0000
+++ source/include/linux/usb_ch9.h	2004-04-21 10:45:35.976234280 +0100
@@ -68,6 +68,20 @@
 #define USB_REQ_SET_INTERFACE		0x0B
 #define USB_REQ_SYNCH_FRAME		0x0C
 
+/*
+ * USB feature flags are written using USB_REQ_{CLEAR,SET}_FEATURE, and
+ * are read as a bit array returned by USB_REQ_GET_STATUS.  (So there
+ * are at most sixteen features of each type.)
+ */
+#define USB_DEVICE_SELF_POWERED		0	/* (read only) */
+#define USB_DEVICE_REMOTE_WAKEUP	1	/* dev may initiate wakeup */
+#define USB_DEVICE_TEST_MODE		2	/* (high speed only) */
+#define USB_DEVICE_B_HNP_ENABLE		3	/* dev may initiate HNP */
+#define USB_DEVICE_A_HNP_SUPPORT	4	/* RH port supports HNP */
+#define USB_DEVICE_A_ALT_HNP_SUPPORT	5	/* other RH port does */
+
+#define USB_ENDPOINT_HALT		0	/* IN/OUT will STALL */
+
 
 /**
  * struct usb_ctrlrequest - SETUP data for a USB device control request
--- diff/include/linux/usb_gadget.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/usb_gadget.h	2004-04-21 10:45:35.977234128 +0100
@@ -731,6 +731,15 @@ int usb_descriptor_fillbuf(void *, unsig
 int usb_gadget_config_buf(const struct usb_config_descriptor *config,
 	void *buf, unsigned buflen, const struct usb_descriptor_header **desc);
 
+/*-------------------------------------------------------------------------*/
+
+/* utility wrapping a simple endpoint selection policy */
+
+extern struct usb_ep *usb_ep_autoconfig (struct usb_gadget *,
+			struct usb_endpoint_descriptor *) __init;
+
+extern void usb_ep_autoconfig_reset (struct usb_gadget *) __init;
+
 #endif  /* __KERNEL__ */
 
 #endif	/* __LINUX_USB_GADGET_H */
--- diff/include/linux/videodev.h	2004-02-09 10:36:12.000000000 +0000
+++ source/include/linux/videodev.h	2004-04-21 10:45:35.977234128 +0100
@@ -430,6 +430,7 @@ struct video_code
 #define VID_HARDWARE_VICAM      34
 #define VID_HARDWARE_SF16FMR2	35
 #define VID_HARDWARE_W9968CF    36
+#define VID_HARDWARE_SAA7114H   37
 #endif /* __LINUX_VIDEODEV_H */
 
 /*
--- diff/include/linux/videodev2.h	2004-02-09 10:36:12.000000000 +0000
+++ source/include/linux/videodev2.h	2004-04-21 10:45:35.978233976 +0100
@@ -869,7 +869,7 @@ struct v4l2_streamparm
 #define VIDIOC_S_MODULATOR	_IOW  ('V', 55, struct v4l2_modulator)
 #define VIDIOC_G_FREQUENCY	_IOWR ('V', 56, struct v4l2_frequency)
 #define VIDIOC_S_FREQUENCY	_IOW  ('V', 57, struct v4l2_frequency)
-#define VIDIOC_CROPCAP		_IOR  ('V', 58, struct v4l2_cropcap)
+#define VIDIOC_CROPCAP		_IOWR ('V', 58, struct v4l2_cropcap)
 #define VIDIOC_G_CROP		_IOWR ('V', 59, struct v4l2_crop)
 #define VIDIOC_S_CROP		_IOW  ('V', 60, struct v4l2_crop)
 #define VIDIOC_G_JPEGCOMP	_IOR  ('V', 61, struct v4l2_jpegcompression)
@@ -887,6 +887,7 @@ struct v4l2_streamparm
 #define VIDIOC_S_CTRL_OLD      	_IOW  ('V', 28, struct v4l2_control)
 #define VIDIOC_G_AUDIO_OLD     	_IOWR ('V', 33, struct v4l2_audio)
 #define VIDIOC_G_AUDOUT_OLD    	_IOWR ('V', 49, struct v4l2_audioout)
+#define VIDIOC_CROPCAP_OLD     	_IOR  ('V', 58, struct v4l2_cropcap)
 
 #define BASE_VIDIOC_PRIVATE	192		/* 192-255 are private */
 
--- diff/include/linux/wireless.h	2003-06-09 14:18:20.000000000 +0100
+++ source/include/linux/wireless.h	2004-04-21 10:45:35.978233976 +0100
@@ -438,7 +438,7 @@ struct	iw_param
  */
 struct	iw_point
 {
-  caddr_t	pointer;	/* Pointer to the data  (in user space) */
+  void __user	*pointer;	/* Pointer to the data  (in user space) */
   __u16		length;		/* number of fields or size in bytes */
   __u16		flags;		/* Optional params */
 };
--- diff/include/linux/writeback.h	2003-10-09 09:47:17.000000000 +0100
+++ source/include/linux/writeback.h	2004-04-21 10:45:35.979233824 +0100
@@ -39,6 +39,7 @@ struct writeback_control {
 					   older than this */
 	long nr_to_write;		/* Write this many pages, and decrement
 					   this for each page written */
+	long pages_skipped;		/* Pages which were not written */
 	int nonblocking;		/* Don't get stuck on request queues */
 	int encountered_congestion;	/* An output: a queue is full */
 	int for_kupdate;		/* A kupdate writeback */
@@ -71,12 +72,16 @@ static inline void wait_on_inode(struct 
  * mm/page-writeback.c
  */
 int wakeup_bdflush(long nr_pages);
+void laptop_io_completion(void);
+void laptop_sync_completion(void);
 
-/* These 5 are exported to sysctl. */
+/* These are exported to sysctl. */
 extern int dirty_background_ratio;
 extern int vm_dirty_ratio;
 extern int dirty_writeback_centisecs;
 extern int dirty_expire_centisecs;
+extern int block_dump;
+extern int laptop_mode;
 
 struct ctl_table;
 struct file;
--- diff/include/media/audiochip.h	2003-06-09 14:18:20.000000000 +0100
+++ source/include/media/audiochip.h	2004-04-21 10:45:35.979233824 +0100
@@ -15,6 +15,8 @@
 #define AUDIO_INTERN       0x03
 #define AUDIO_OFF          0x04 
 #define AUDIO_ON           0x05
+#define AUDIO_EXTERN_1     AUDIO_EXTERN
+#define AUDIO_EXTERN_2     0x06
 #define AUDIO_MUTE         0x80
 #define AUDIO_UNMUTE       0x81
 
--- diff/include/net/bluetooth/hci_core.h	2004-03-11 10:20:29.000000000 +0000
+++ source/include/net/bluetooth/hci_core.h	2004-04-21 10:45:35.979233824 +0100
@@ -515,9 +515,9 @@ struct hci_pinfo {
 #define HCI_SFLT_MAX_OGF  5
 
 struct hci_sec_filter {
-	unsigned long type_mask;
-	unsigned long event_mask[2];
-	unsigned long ocf_mask[HCI_SFLT_MAX_OGF + 1][4];
+	__u32 type_mask;
+	__u32 event_mask[2];
+	__u32 ocf_mask[HCI_SFLT_MAX_OGF + 1][4];
 };
 
 /* ----- HCI requests ----- */
--- diff/include/net/irda/irlan_common.h	2003-08-26 10:00:54.000000000 +0100
+++ source/include/net/irda/irlan_common.h	2004-04-21 10:45:35.981233520 +0100
@@ -219,7 +219,6 @@ int irlan_insert_array_param(struct sk_b
 			     __u16 value_len);
 
 int irlan_extract_param(__u8 *buf, char *name, char *value, __u16 *len);
-void print_ret_code(__u8 code);
 
 #endif
 
--- diff/include/net/irda/irlan_eth.h	2003-08-26 10:00:54.000000000 +0100
+++ source/include/net/irda/irlan_eth.h	2004-04-21 10:45:35.981233520 +0100
@@ -25,16 +25,9 @@
 #ifndef IRLAN_ETH_H
 #define IRLAN_ETH_H
 
-void  irlan_eth_setup(struct net_device *dev);
-int  irlan_eth_open(struct net_device *dev);
-int  irlan_eth_close(struct net_device *dev);
+struct net_device *alloc_irlandev(const char *name);
 int  irlan_eth_receive(void *instance, void *sap, struct sk_buff *skb);
-int  irlan_eth_xmit(struct sk_buff *skb, struct net_device *dev);
 
 void irlan_eth_flow_indication( void *instance, void *sap, LOCAL_FLOW flow);
 void irlan_eth_send_gratuitous_arp(struct net_device *dev);
-
-void irlan_eth_set_multicast_list( struct net_device *dev);
-struct net_device_stats *irlan_eth_get_stats(struct net_device *dev);
-
 #endif
--- diff/include/net/irda/irlan_filter.h	2003-08-26 10:00:54.000000000 +0100
+++ source/include/net/irda/irlan_filter.h	2004-04-21 10:45:35.982233368 +0100
@@ -27,7 +27,7 @@
 
 void irlan_check_command_param(struct irlan_cb *self, char *param, 
 			       char *value);
-void handle_filter_request(struct irlan_cb *self, struct sk_buff *skb);
+void irlan_filter_request(struct irlan_cb *self, struct sk_buff *skb);
 int irlan_print_filter(struct seq_file *seq, int filter_type);
 
 #endif /* IRLAN_FILTER_H */
--- diff/include/net/neighbour.h	2004-02-09 10:36:12.000000000 +0000
+++ source/include/net/neighbour.h	2004-04-21 10:45:35.986232760 +0100
@@ -281,6 +281,8 @@ __neigh_lookup_errno(struct neigh_table 
 	return neigh_create(tbl, pkey, dev);
 }
 
+#define LOCALLY_ENQUEUED -2
+
 #endif
 #endif
 
--- diff/include/net/sctp/sctp.h	2004-02-09 10:36:12.000000000 +0000
+++ source/include/net/sctp/sctp.h	2004-04-21 10:45:35.986232760 +0100
@@ -1,5 +1,5 @@
 /* SCTP kernel reference Implementation
- * (C) Copyright IBM Corp. 2001, 2003
+ * (C) Copyright IBM Corp. 2001, 2004
  * Copyright (c) 1999-2000 Cisco, Inc.
  * Copyright (c) 1999-2001 Motorola, Inc.
  * Copyright (c) 2001-2003 Intel Corp.
@@ -78,6 +78,7 @@
 #include <linux/proc_fs.h>
 #include <linux/spinlock.h>
 #include <linux/jiffies.h>
+#include <linux/idr.h>
 
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
 #include <net/ipv6.h>
@@ -223,24 +224,6 @@ DECLARE_SNMP_STAT(struct sctp_mib, sctp_
 #define SCTP_INC_STATS_USER(field) SNMP_INC_STATS_USER(sctp_statistics, field)
 #define SCTP_DEC_STATS(field)      SNMP_DEC_STATS(sctp_statistics, field)
 
-/* Determine if this is a valid kernel address.  */
-static inline int sctp_is_valid_kaddr(unsigned long addr)
-{
-	struct page *page;
-
-	/* Make sure the address is not in the user address space. */
-	if (addr < PAGE_OFFSET)
-		return 0;
-
-	page = virt_to_page(addr);
-
-	/* Is this page valid? */
-	if (!virt_addr_valid(addr) || PageReserved(page))
-		return 0;
-
-	return 1;
-}
-
 #endif /* !TEST_FRAME */
 
 
@@ -357,7 +340,7 @@ static inline void sctp_v6_exit(void) { 
 /* Map an association to an assoc_id. */
 static inline sctp_assoc_t sctp_assoc2id(const struct sctp_association *asoc)
 {
-	return (sctp_assoc_t) asoc;
+	return (asoc?asoc->assoc_id:NULL);
 }
 
 /* Look up the association by its id.  */
@@ -519,6 +502,9 @@ extern struct proto sctp_prot;
 extern struct proc_dir_entry *proc_net_sctp;
 void sctp_put_port(struct sock *sk);
 
+extern struct idr sctp_assocs_id;
+extern spinlock_t sctp_assocs_id_lock;
+
 /* Static inline functions. */
 
 /* Convert from an IP version number to an Address Family symbol.  */
--- diff/include/net/sctp/structs.h	2004-02-18 08:54:13.000000000 +0000
+++ source/include/net/sctp/structs.h	2004-04-21 10:45:35.987232608 +0100
@@ -1,5 +1,5 @@
 /* SCTP kernel reference Implementation
- * (C) Copyright IBM Corp. 2001, 2003
+ * (C) Copyright IBM Corp. 2001, 2004
  * Copyright (c) 1999-2000 Cisco, Inc.
  * Copyright (c) 1999-2001 Motorola, Inc.
  * Copyright (c) 2001 Intel Corp.
@@ -1282,11 +1282,8 @@ struct sctp_association {
 	/* Associations on the same socket. */
 	struct list_head asocs;
 
-	/* This is a signature that lets us know that this is a
-	 * struct sctp_association data structure.  Used for mapping an
-	 * association id to an association.
-	 */
-	__u32 eyecatcher;
+	/* association id. */
+	sctp_assoc_t assoc_id;
 
 	/* This is our parent endpoint.	 */
 	struct sctp_endpoint *ep;
--- diff/include/net/sctp/ulpevent.h	2003-08-20 14:16:14.000000000 +0100
+++ source/include/net/sctp/ulpevent.h	2004-04-21 10:45:35.988232456 +0100
@@ -1,7 +1,7 @@
 /* SCTP kernel reference Implementation
+ * (C) Copyright IBM Corp. 2001, 2004
  * Copyright (c) 1999-2000 Cisco, Inc.
  * Copyright (c) 1999-2001 Motorola, Inc.
- * Copyright (c) 2001 International Business Machines, Corp.
  * Copyright (c) 2001 Intel Corp.
  * Copyright (c) 2001 Nokia, Inc.
  * Copyright (c) 2001 La Monte H.P. Yarroll
@@ -54,7 +54,13 @@
  * growing this structure as it is at the maximum limit now.
  */
 struct sctp_ulpevent {
-	struct sctp_sndrcvinfo sndrcvinfo;
+	struct sctp_association *asoc;
+	__u16 stream;
+	__u16 ssn;
+	__u16 flags;
+	__u32 ppid;
+	__u32 tsn;
+	__u32 cumtsn;
 	int msg_flags;
 	int iif;
 };
--- diff/include/net/sock.h	2004-02-09 10:36:12.000000000 +0000
+++ source/include/net/sock.h	2004-04-21 10:45:35.989232304 +0100
@@ -341,8 +341,6 @@ static __inline__ void __sk_add_node(str
 	hlist_add_head(&sk->sk_node, list);
 }
 
-static inline void sock_hold(struct sock *sk);
-
 static __inline__ void sk_add_node(struct sock *sk, struct hlist_head *list)
 {
 	sock_hold(sk);
@@ -382,6 +380,7 @@ enum sock_flags {
 	SOCK_LINGER,
 	SOCK_DESTROY,
 	SOCK_BROADCAST,
+	SOCK_TIMESTAMP,
 };
 
 static inline void sock_set_flag(struct sock *sk, enum sock_flags flag)
@@ -561,8 +560,8 @@ extern void __lock_sock(struct sock *sk)
 extern void __release_sock(struct sock *sk);
 #define sock_owned_by_user(sk)	((sk)->sk_lock.owner)
 
-extern void lock_sock(struct sock *sk);
-extern void release_sock(struct sock *sk);
+extern void FASTCALL(lock_sock(struct sock *sk));
+extern void FASTCALL(release_sock(struct sock *sk));
 
 /* BH context may only use the following locking interface. */
 #define bh_lock_sock(__sk)	spin_lock(&((__sk)->sk_lock.slock))
@@ -623,9 +622,9 @@ extern int                      sock_no_
 extern int			sock_no_listen(struct socket *, int);
 extern int                      sock_no_shutdown(struct socket *, int);
 extern int			sock_no_getsockopt(struct socket *, int , int,
-						   char *, int *);
+						   char __user *, int __user *);
 extern int			sock_no_setsockopt(struct socket *, int, int,
-						   char *, int);
+						   char __user *, int);
 extern int                      sock_no_sendmsg(struct kiocb *, struct socket *,
 						struct msghdr *, size_t);
 extern int                      sock_no_recvmsg(struct kiocb *, struct socket *,
@@ -1023,11 +1022,33 @@ static inline int sock_intr_errno(long t
 static __inline__ void
 sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb)
 {
-	if (sk->sk_rcvtstamp)
-		put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMP, sizeof(skb->stamp), &skb->stamp);
-	else
-		sk->sk_stamp = skb->stamp;
-}
+	struct timeval *stamp = &skb->stamp;
+	if (sk->sk_rcvtstamp) { 
+		/* Race occurred between timestamp enabling and packet
+		   receiving.  Fill in the current time for now. */
+		if (stamp->tv_sec == 0)
+			do_gettimeofday(stamp);
+		put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMP, sizeof(struct timeval),
+			 stamp);
+	} else
+		sk->sk_stamp = *stamp;
+}
+
+extern atomic_t netstamp_needed;
+extern void sock_enable_timestamp(struct sock *sk);
+extern void sock_disable_timestamp(struct sock *sk);
+
+static inline void net_timestamp(struct timeval *stamp) 
+{ 
+	if (atomic_read(&netstamp_needed)) 
+		do_gettimeofday(stamp);
+	else {
+		stamp->tv_sec = 0;
+		stamp->tv_usec = 0;
+	}		
+} 
+
+extern int sock_get_timestamp(struct sock *, struct timeval *);
 
 /* 
  *	Enable debug/info messages 
@@ -1035,8 +1056,10 @@ sock_recv_timestamp(struct msghdr *msg, 
 
 #if 0
 #define NETDEBUG(x)	do { } while (0)
+#define LIMIT_NETDEBUG(x) do {} while(0)
 #else
 #define NETDEBUG(x)	do { x; } while (0)
+#define LIMIT_NETDEBUG(x) do { if (net_ratelimit()) { x; } } while(0)
 #endif
 
 /*
--- diff/include/scsi/scsi_cmnd.h	2004-03-11 10:20:29.000000000 +0000
+++ source/include/scsi/scsi_cmnd.h	2004-04-21 10:45:35.989232304 +0100
@@ -112,7 +112,7 @@ struct scsi_cmnd {
 	struct request *request;	/* The command we are
 				   	   working on */
 
-#define SCSI_SENSE_BUFFERSIZE 	64
+#define SCSI_SENSE_BUFFERSIZE 	96
 	unsigned char sense_buffer[SCSI_SENSE_BUFFERSIZE];		/* obtained by REQUEST SENSE
 						 * when CHECK CONDITION is
 						 * received on original command 
--- diff/include/scsi/scsi_device.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/scsi/scsi_device.h	2004-04-21 10:45:35.989232304 +0100
@@ -12,7 +12,9 @@ struct scsi_mode_data;
 
 
 /*
- * sdev state
+ * sdev state: If you alter this, you also need to alter scsi_sysfs.c
+ * (for the ascii descriptions) and the state model enforcer:
+ * scsi_lib:scsi_device_set_state().
  */
 enum scsi_device_state {
 	SDEV_CREATED = 1,	/* device created but not added to sysfs
@@ -26,6 +28,8 @@ enum scsi_device_state {
 	SDEV_QUIESCE,		/* Device quiescent.  No block commands
 				 * will be accepted, only specials (which
 				 * originate in the mid-layer) */
+	SDEV_OFFLINE,		/* Device offlined (by error handling or
+				 * user request */
 };
 
 struct scsi_device {
@@ -67,8 +71,10 @@ struct scsi_device {
 	unsigned char current_tag;	/* current tag */
 	struct scsi_target      *sdev_target;   /* used only for single_lun */
 
-	unsigned online:1;
-
+	unsigned int	sdev_bflags; /* black/white flags as also found in
+				 * scsi_devinfo.[hc]. For now used only to
+				 * pass settings from slave_alloc to scsi
+				 * core. */
 	unsigned writeable:1;
 	unsigned removable:1;
 	unsigned changed:1;	/* Data invalid due to media change */
@@ -96,6 +102,7 @@ struct scsi_device {
 	unsigned use_10_for_ms:1; /* first try 10-byte mode sense/select */
 	unsigned skip_ms_page_8:1;	/* do not use MODE SENSE page 0x08 */
 	unsigned skip_ms_page_3f:1;	/* do not use MODE SENSE page 0x3f */
+	unsigned use_192_bytes_for_3f:1; /* ask for 192 bytes from page 0x3f */
 	unsigned no_start_on_add:1;	/* do not issue start on add */
 	unsigned allow_restart:1; /* issue START_UNIT in error handler */
 
@@ -177,4 +184,9 @@ extern int scsi_device_set_state(struct 
 				 enum scsi_device_state state);
 extern int scsi_device_quiesce(struct scsi_device *sdev);
 extern void scsi_device_resume(struct scsi_device *sdev);
+extern const char *scsi_device_state_name(enum scsi_device_state);
+static int inline scsi_device_online(struct scsi_device *sdev)
+{
+	return sdev->sdev_state != SDEV_OFFLINE;
+}
 #endif /* _SCSI_SCSI_DEVICE_H */
--- diff/include/scsi/scsi_devinfo.h	2003-10-27 09:20:44.000000000 +0000
+++ source/include/scsi/scsi_devinfo.h	2004-04-21 10:45:35.990232152 +0100
@@ -19,4 +19,5 @@
 #define BLIST_MS_SKIP_PAGE_08	0x2000	/* do not send ms page 0x08 */
 #define BLIST_MS_SKIP_PAGE_3F	0x4000	/* do not send ms page 0x3f */
 #define BLIST_USE_10_BYTE_MS	0x8000	/* use 10 byte ms before 6 byte ms */
+#define BLIST_MS_192_BYTES_FOR_3F	0x10000	/*  192 byte ms page 0x3f request */
 #endif
--- diff/include/scsi/scsi_host.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/scsi/scsi_host.h	2004-04-21 10:45:35.990232152 +0100
@@ -345,12 +345,6 @@ struct scsi_host_template {
 	 * module_init/module_exit.
 	 */
 	struct list_head legacy_hosts;
-
-	/*
-	 * Default flags settings, these modify the setting of scsi_device
-	 * bits.
-	 */
-	unsigned int flags;
 };
 
 /*
--- diff/include/scsi/scsi_transport_fc.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/scsi/scsi_transport_fc.h	2004-04-21 10:45:35.990232152 +0100
@@ -20,6 +20,8 @@
 #ifndef SCSI_TRANSPORT_FC_H
 #define SCSI_TRANSPORT_FC_H
 
+#include <linux/config.h>
+
 struct scsi_transport_template;
 
 struct fc_transport_attrs {
@@ -33,6 +35,22 @@ struct fc_transport_attrs {
 #define fc_node_name(x)	(((struct fc_transport_attrs *)&(x)->transport_data)->node_name)
 #define fc_port_name(x)	(((struct fc_transport_attrs *)&(x)->transport_data)->port_name)
 
-extern struct scsi_transport_template fc_transport_template;
+/* The functions by which the transport class and the driver communicate */
+struct fc_function_template {
+	void 	(*get_port_id)(struct scsi_device *);
+	void	(*get_node_name)(struct scsi_device *);
+	void	(*get_port_name)(struct scsi_device *);
+	/* The driver sets these to tell the transport class it
+	 * wants the attributes displayed in sysfs.  If the show_ flag
+	 * is not set, the attribute will be private to the transport
+	 * class */
+	unsigned long	show_port_id:1;
+	unsigned long	show_node_name:1;
+	unsigned long	show_port_name:1;
+	/* Private Attributes */
+};
+
+struct scsi_transport_template *fc_attach_transport(struct fc_function_template *);
+void fc_release_transport(struct scsi_transport_template *);
 
 #endif /* SCSI_TRANSPORT_FC_H */
--- diff/include/scsi/scsi_transport_spi.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/scsi/scsi_transport_spi.h	2004-04-21 10:45:35.991232000 +0100
@@ -35,7 +35,9 @@ struct spi_transport_attrs {
 	unsigned int rd_strm:1;	/* Read streaming enabled */
 	unsigned int rti:1;	/* Retain Training Information */
 	unsigned int pcomp_en:1;/* Precompensation enabled */
+	/* Private Fields */
 	unsigned int dv_pending:1; /* Internal flag */
+	struct semaphore dv_sem; /* semaphore to serialise dv */
 };
 
 /* accessor functions */
--- diff/include/sound/es1688.h	2003-05-21 11:50:16.000000000 +0100
+++ source/include/sound/es1688.h	2004-04-21 10:45:35.991232000 +0100
@@ -55,6 +55,8 @@ struct _snd_es1688 {
 
 typedef struct _snd_es1688 es1688_t;
 
+#define chip_t es1688_t
+
 /* I/O ports */
 
 #define ES1688P(codec, x) ((codec)->port + e_s_s_ESS1688##x)
--- diff/include/sound/sndmagic.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/sound/sndmagic.h	2004-04-21 10:45:35.991232000 +0100
@@ -203,6 +203,7 @@ static inline int _snd_magic_bad(void *o
 #define pdacf_t_magic				0xa15a4500
 #define vortex_t_magic				0xa15a4601
 #define atiixp_t_magic				0xa15a4701
+#define amd7930_t_magic				0xa15a4801
 
 #else
 
--- diff/init/Kconfig	2004-03-11 10:20:29.000000000 +0000
+++ source/init/Kconfig	2004-04-21 10:45:35.992231848 +0100
@@ -83,13 +83,30 @@ config SYSVIPC
 	  exchange information. It is generally considered to be a good thing,
 	  and some programs won't run unless you say Y here. In particular, if
 	  you want to run the DOS emulator dosemu under Linux (read the
-	  DOSEMU-HOWTO, available from
-	  <http://www.tldp.org/docs.html#howto>), you'll need to say Y
-	  here.
+	  DOSEMU-HOWTO, available from <http://www.tldp.org/docs.html#howto>),
+	  you'll need to say Y here.
 
 	  You can find documentation about IPC with "info ipc" and also in
 	  section 6.4 of the Linux Programmer's Guide, available from
-	  <http://www.tldp.org/docs.html#guide>.
+	  <http://www.tldp.org/guides.html>.
+
+config POSIX_MQUEUE
+	bool "POSIX Message Queues"
+	depends on EXPERIMENTAL
+	---help---
+	  POSIX variant of message queues is a part of IPC. In POSIX message
+	  queues every message has a priority which decides about succession
+	  of receiving it by a process. If you want to compile and run
+	  programs written e.g. for Solaris with use of its POSIX message
+	  queues (functions mq_*) say Y here. To use this feature you will
+	  also need mqueue library, available from
+	  <http://www.mat.uni.torun.pl/~wrona/posix_ipc/>
+
+	  POSIX message queues are visible as a filesystem called 'mqueue'
+	  and can be mounted somewhere if you want to do filesystem
+	  operations on message queues.
+
+	  If unsure, say Y.
 
 config BSD_PROCESS_ACCT
 	bool "BSD Process Accounting"
@@ -120,6 +137,26 @@ config SYSCTL
 	  building a kernel for install/rescue disks or your system is very
 	  limited in memory.
 
+config AUDIT
+	bool "Auditing support"
+	default y if SECURITY_SELINUX
+	default n
+	help
+	  Enable auditing infrastructure that can be used with another
+	  kernel subsystem, such as SELinux (which requires this for
+	  logging of avc messages output).  Does not do system-call
+	  auditing without CONFIG_AUDITSYSCALL.
+
+config AUDITSYSCALL
+	bool "Enable system-call auditing support"
+	depends on AUDIT && (X86 || PPC64)
+	default y if SECURITY_SELINUX
+	default n
+	help
+	  Enable low-overhead system-call auditing infrastructure that
+	  can be used independently or with another kernel subsystem,
+	  such as SELinux.
+
 config LOG_BUF_SHIFT
 	int "Kernel log buffer size (16 => 64KB, 17 => 128KB)" if DEBUG_KERNEL
 	range 12 20
@@ -183,12 +220,12 @@ config IKCONFIG_PROC
 
 
 menuconfig EMBEDDED
-	bool "Remove kernel features (for embedded systems)"
+	bool "Configure standard kernel features (for small systems)"
 	help
-	  This option allows certain base kernel features to be removed from
-	  the build.  This is for specialized environments which can tolerate
-	  a "non-standard" kernel.  Only use this if you really know what you
-	  are doing.
+	  This option allows certain base kernel options and settings
+          to be disabled or tweaked. This is for specialized
+          environments which can tolerate a "non-standard" kernel.
+          Only use this if you really know what you are doing.
 
 config KALLSYMS
 	 bool "Load all symbols for debugging/kksymoops" if EMBEDDED
--- diff/init/do_mounts.c	2004-04-05 12:57:08.000000000 +0100
+++ source/init/do_mounts.c	2004-04-21 10:45:35.992231848 +0100
@@ -141,9 +141,11 @@ dev_t __init name_to_dev_t(char *name)
 	dev_t res = 0;
 	int part;
 
+#ifdef CONFIG_SYSFS
 	sys_mkdir("/sys", 0700);
 	if (sys_mount("sysfs", "/sys", "sysfs", 0, NULL) < 0)
 		goto out;
+#endif
 
 	if (strncmp(name, "/dev/", 5) != 0) {
 		unsigned maj, min;
--- diff/init/main.c	2004-04-05 12:57:08.000000000 +0100
+++ source/init/main.c	2004-04-21 10:45:35.993231696 +0100
@@ -94,11 +94,7 @@ extern void driver_init(void);
 extern void tc_init(void);
 #endif
 
-/*
- * Are we up and running (ie do we have all the infrastructure
- * set up)
- */
-int system_running;
+int system_state;	/* SYSTEM_BOOTING/RUNNING/SHUTDOWN */
 
 /*
  * Boot command-line arguments
@@ -604,6 +600,13 @@ static int init(void * unused)
 	smp_init();
 	do_basic_setup();
 
+       /*
+        * check if there is an early userspace init, if yes
+        * let it do all the work
+        */
+       if (sys_access("/init", 0) == 0)
+               execute_command = "/init";
+       else
 	prepare_namespace();
 
 	/*
@@ -613,7 +616,7 @@ static int init(void * unused)
 	 */
 	free_initmem();
 	unlock_kernel();
-	system_running = 1;
+	system_state = SYSTEM_RUNNING;
 
 	if (sys_open("/dev/console", O_RDWR, 0) < 0)
 		printk("Warning: unable to open an initial console.\n");
--- diff/ipc/Makefile	2004-04-05 12:57:08.000000000 +0100
+++ source/ipc/Makefile	2004-04-21 10:45:35.993231696 +0100
@@ -2,7 +2,8 @@
 # Makefile for the linux ipc.
 #
 
-obj-y   := util.o
-
 obj-$(CONFIG_SYSVIPC_COMPAT) += compat.o
-obj-$(CONFIG_SYSVIPC) += msg.o sem.o shm.o
+obj-$(CONFIG_SYSVIPC) += util.o msgutil.o msg.o sem.o shm.o
+obj_mq-$(CONFIG_COMPAT) += compat_mq.o
+obj-$(CONFIG_POSIX_MQUEUE) += mqueue.o msgutil.o $(obj_mq-y)
+
--- diff/ipc/msg.c	2004-02-09 10:36:12.000000000 +0000
+++ source/ipc/msg.c	2004-04-21 10:45:35.995231392 +0100
@@ -51,11 +51,6 @@ struct msg_sender {
 	struct task_struct* tsk;
 };
 
-struct msg_msgseg {
-	struct msg_msgseg* next;
-	/* the next part of the message follows immediately */
-};
-
 #define SEARCH_ANY		1
 #define SEARCH_EQUAL		2
 #define SEARCH_NOTEQUAL		3
@@ -129,106 +124,6 @@ static int newque (key_t key, int msgflg
 	return msg_buildid(id,msq->q_perm.seq);
 }
 
-static void free_msg(struct msg_msg* msg)
-{
-	struct msg_msgseg* seg;
-
-	security_msg_msg_free(msg);
-
-	seg = msg->next;
-	kfree(msg);
-	while(seg != NULL) {
-		struct msg_msgseg* tmp = seg->next;
-		kfree(seg);
-		seg = tmp;
-	}
-}
-
-static struct msg_msg* load_msg(void* src, int len)
-{
-	struct msg_msg* msg;
-	struct msg_msgseg** pseg;
-	int err;
-	int alen;
-
-	alen = len;
-	if(alen > DATALEN_MSG)
-		alen = DATALEN_MSG;
-
-	msg = (struct msg_msg *) kmalloc (sizeof(*msg) + alen, GFP_KERNEL);
-	if(msg==NULL)
-		return ERR_PTR(-ENOMEM);
-
-	msg->next = NULL;
-	msg->security = NULL;
-
-	if (copy_from_user(msg+1, src, alen)) {
-		err = -EFAULT;
-		goto out_err;
-	}
-
-	len -= alen;
-	src = ((char*)src)+alen;
-	pseg = &msg->next;
-	while(len > 0) {
-		struct msg_msgseg* seg;
-		alen = len;
-		if(alen > DATALEN_SEG)
-			alen = DATALEN_SEG;
-		seg = (struct msg_msgseg *) kmalloc (sizeof(*seg) + alen, GFP_KERNEL);
-		if(seg==NULL) {
-			err=-ENOMEM;
-			goto out_err;
-		}
-		*pseg = seg;
-		seg->next = NULL;
-		if(copy_from_user (seg+1, src, alen)) {
-			err = -EFAULT;
-			goto out_err;
-		}
-		pseg = &seg->next;
-		len -= alen;
-		src = ((char*)src)+alen;
-	}
-	
-	err = security_msg_msg_alloc(msg);
-	if (err)
-		goto out_err;
-
-	return msg;
-
-out_err:
-	free_msg(msg);
-	return ERR_PTR(err);
-}
-
-static int store_msg(void* dest, struct msg_msg* msg, int len)
-{
-	int alen;
-	struct msg_msgseg *seg;
-
-	alen = len;
-	if(alen > DATALEN_MSG)
-		alen = DATALEN_MSG;
-	if(copy_to_user (dest, msg+1, alen))
-		return -1;
-
-	len -= alen;
-	dest = ((char*)dest)+alen;
-	seg = msg->next;
-	while(len > 0) {
-		alen = len;
-		if(alen > DATALEN_SEG)
-			alen = DATALEN_SEG;
-		if(copy_to_user (dest, seg+1, alen))
-			return -1;
-		len -= alen;
-		dest = ((char*)dest)+alen;
-		seg=seg->next;
-	}
-	return 0;
-}
-
 static inline void ss_add(struct msg_queue* msq, struct msg_sender* mss)
 {
 	mss->tsk=current;
--- diff/ipc/shm.c	2004-04-05 12:57:08.000000000 +0100
+++ source/ipc/shm.c	2004-04-21 10:45:35.996231240 +0100
@@ -380,9 +380,7 @@ static void shm_get_stat(unsigned long *
 
 		if (is_file_hugepages(shp->shm_file)) {
 			struct address_space *mapping = inode->i_mapping;
-			spin_lock(&mapping->page_lock);
 			*rss += (HPAGE_SIZE/PAGE_SIZE)*mapping->nrpages;
-			spin_unlock(&mapping->page_lock);
 		} else {
 			struct shmem_inode_info *info = SHMEM_I(inode);
 			spin_lock(&info->lock);
--- diff/ipc/util.c	2004-03-11 10:20:29.000000000 +0000
+++ source/ipc/util.c	2004-04-21 10:45:35.997231088 +0100
@@ -25,8 +25,6 @@
 #include <linux/rcupdate.h>
 #include <linux/workqueue.h>
 
-#if defined(CONFIG_SYSVIPC)
-
 #include "util.h"
 
 /**
@@ -531,20 +529,3 @@ int ipc_parse_version (int *cmd)
 }
 
 #endif /* __ia64__ */
-
-#else
-/*
- * Dummy functions when SYSV IPC isn't configured
- */
-
-int copy_semundo(unsigned long clone_flags, struct task_struct *tsk)
-{
-	return 0;
-}
-
-void exit_sem(struct task_struct *tsk)
-{
-	return;
-}
-
-#endif /* CONFIG_SYSVIPC */
--- diff/ipc/util.h	2004-02-18 08:54:13.000000000 +0000
+++ source/ipc/util.h	2004-04-21 10:45:35.997231088 +0100
@@ -4,6 +4,10 @@
  *
  * ipc helper functions (c) 1999 Manfred Spraul <manfreds@colorfullife.com>
  */
+
+#ifndef _IPC_UTIL_H
+#define _IPC_UTIL_H
+
 #define USHRT_MAX 0xffff
 #define SEQ_MULTIPLIER	(IPCMNI)
 
@@ -62,3 +66,9 @@ void ipc64_perm_to_ipc_perm(struct ipc64
 #else
 int ipc_parse_version (int *cmd);
 #endif
+
+extern void free_msg(struct msg_msg *msg);
+extern struct msg_msg *load_msg(void __user *src, int len);
+extern int store_msg(void __user *dest, struct msg_msg *msg, int len);
+
+#endif
--- diff/kernel/Makefile	2004-03-11 10:20:29.000000000 +0000
+++ source/kernel/Makefile	2004-04-21 10:45:35.997231088 +0100
@@ -21,6 +21,8 @@ obj-$(CONFIG_COMPAT) += compat.o
 obj-$(CONFIG_IKCONFIG) += configs.o
 obj-$(CONFIG_IKCONFIG_PROC) += configs.o
 obj-$(CONFIG_STOP_MACHINE) += stop_machine.o
+obj-$(CONFIG_AUDIT) += audit.o
+obj-$(CONFIG_AUDITSYSCALL) += auditsc.o
 
 ifneq ($(CONFIG_IA64),y)
 # According to Alan Modra <alan@linuxcare.com.au>, the -fno-omit-frame-pointer is
--- diff/kernel/acct.c	2004-04-05 12:57:08.000000000 +0100
+++ source/kernel/acct.c	2004-04-21 10:45:35.998230936 +0100
@@ -347,7 +347,11 @@ static void do_acct_process(long exitcod
 	/* we really need to bite the bullet and change layout */
 	ac.ac_uid = current->uid;
 	ac.ac_gid = current->gid;
-	ac.ac_tty = current->tty ? old_encode_dev(tty_devnum(current->tty)) : 0;
+
+	read_lock(&tasklist_lock);	/* pin current->signal */
+	ac.ac_tty = current->signal->tty ?
+		old_encode_dev(tty_devnum(current->signal->tty)) : 0;
+	read_unlock(&tasklist_lock);
 
 	ac.ac_flag = 0;
 	if (current->flags & PF_FORKNOEXEC)
@@ -376,7 +380,7 @@ static void do_acct_process(long exitcod
 	ac.ac_rw = encode_comp_t(ac.ac_io / 1024);
 	ac.ac_minflt = encode_comp_t(current->min_flt);
 	ac.ac_majflt = encode_comp_t(current->maj_flt);
-	ac.ac_swaps = encode_comp_t(current->nswap);
+	ac.ac_swaps = encode_comp_t(0);
 	ac.ac_exitcode = exitcode;
 
 	/*
--- diff/kernel/exit.c	2004-04-05 12:57:08.000000000 +0100
+++ source/kernel/exit.c	2004-04-21 10:45:36.001230480 +0100
@@ -92,7 +92,6 @@ repeat: 
 	p->parent->cstime += p->stime + p->cstime;
 	p->parent->cmin_flt += p->min_flt + p->cmin_flt;
 	p->parent->cmaj_flt += p->maj_flt + p->cmaj_flt;
-	p->parent->cnswap += p->nswap + p->cnswap;
 	p->parent->cnvcsw += p->nvcsw + p->cnvcsw;
 	p->parent->cnivcsw += p->nivcsw + p->cnivcsw;
 	sched_exit(p);
@@ -136,13 +135,13 @@ int session_of_pgrp(int pgrp)
 
 	read_lock(&tasklist_lock);
 	for_each_task_pid(pgrp, PIDTYPE_PGID, p, l, pid)
-		if (p->session > 0) {
-			sid = p->session;
+		if (p->signal->session > 0) {
+			sid = p->signal->session;
 			goto out;
 		}
 	p = find_task_by_pid(pgrp);
 	if (p)
-		sid = p->session;
+		sid = p->signal->session;
 out:
 	read_unlock(&tasklist_lock);
 	
@@ -170,7 +169,7 @@ static int will_become_orphaned_pgrp(int
 				|| p->real_parent->pid == 1)
 			continue;
 		if (process_group(p->real_parent) != pgrp
-			    && p->real_parent->session == p->session) {
+			    && p->real_parent->signal->session == p->signal->session) {
 			ret = 0;
 			break;
 		}
@@ -259,14 +258,14 @@ void __set_special_pids(pid_t session, p
 {
 	struct task_struct *curr = current;
 
-	if (curr->session != session) {
+	if (curr->signal->session != session) {
 		detach_pid(curr, PIDTYPE_SID);
-		curr->session = session;
+		curr->signal->session = session;
 		attach_pid(curr, PIDTYPE_SID, session);
 	}
 	if (process_group(curr) != pgrp) {
 		detach_pid(curr, PIDTYPE_PGID);
-		curr->group_leader->__pgrp = pgrp;
+		curr->signal->pgrp = pgrp;
 		attach_pid(curr, PIDTYPE_PGID, pgrp);
 	}
 }
@@ -341,7 +340,7 @@ void daemonize(const char *name, ...)
 	exit_mm(current);
 
 	set_special_pids(1, 1);
-	current->tty = NULL;
+	current->signal->tty = NULL;
 
 	/* Block and flush all signals */
 	sigfillset(&blocked);
@@ -386,6 +385,19 @@ static inline void close_files(struct fi
 	}
 }
 
+struct files_struct *get_files_struct(struct task_struct *task)
+{
+	struct files_struct *files;
+
+	task_lock(task);
+	files = task->files;
+	if (files)
+		atomic_inc(&files->count);
+	task_unlock(task);
+
+	return files;
+}
+
 void fastcall put_files_struct(struct files_struct *files)
 {
 	if (atomic_dec_and_test(&files->count)) {
@@ -564,7 +576,7 @@ static inline void reparent_thread(task_
 	 * outside, so the child pgrp is now orphaned.
 	 */
 	if ((process_group(p) != process_group(father)) &&
-	    (p->session == father->session)) {
+	    (p->signal->session == father->signal->session)) {
 		int pgrp = process_group(p);
 
 		if (will_become_orphaned_pgrp(pgrp, NULL) && has_stopped_jobs(pgrp)) {
@@ -675,7 +687,7 @@ static void exit_notify(struct task_stru
 	t = tsk->real_parent;
 	
 	if ((process_group(t) != process_group(tsk)) &&
-	    (t->session == tsk->session) &&
+	    (t->signal->session == tsk->signal->session) &&
 	    will_become_orphaned_pgrp(process_group(tsk), tsk) &&
 	    has_stopped_jobs(process_group(tsk))) {
 		__kill_pg_info(SIGHUP, (void *)1, process_group(tsk));
@@ -777,10 +789,9 @@ asmlinkage NORET_TYPE void do_exit(long 
 	__exit_files(tsk);
 	__exit_fs(tsk);
 	exit_namespace(tsk);
-	exit_itimers(tsk);
 	exit_thread();
 
-	if (tsk->leader)
+	if (tsk->signal->leader)
 		disassociate_ctty(1);
 
 	module_put(tsk->thread_info->exec_domain->module);
--- diff/kernel/fork.c	2004-03-11 10:20:29.000000000 +0000
+++ source/kernel/fork.c	2004-04-21 10:45:36.002230328 +0100
@@ -21,6 +21,7 @@
 #include <linux/completion.h>
 #include <linux/namespace.h>
 #include <linux/personality.h>
+#include <linux/sem.h>
 #include <linux/file.h>
 #include <linux/binfmts.h>
 #include <linux/mman.h>
@@ -31,6 +32,7 @@
 #include <linux/futex.h>
 #include <linux/ptrace.h>
 #include <linux/mount.h>
+#include <linux/audit.h>
 
 #include <asm/pgtable.h>
 #include <asm/pgalloc.h>
@@ -39,9 +41,6 @@
 #include <asm/cacheflush.h>
 #include <asm/tlbflush.h>
 
-extern int copy_semundo(unsigned long clone_flags, struct task_struct *tsk);
-extern void exit_sem(struct task_struct *tsk);
-
 /* The idle threads do not count..
  * Protected by write_lock_irq(&tasklist_lock)
  */
@@ -85,6 +84,8 @@ void __put_task_struct(struct task_struc
 	WARN_ON(atomic_read(&tsk->usage));
 	WARN_ON(tsk == current);
 
+	if (unlikely(tsk->audit_context))
+		audit_free(tsk);
 	security_task_free(tsk);
 	free_uid(tsk->user);
 	put_group_info(tsk->group_info);
@@ -209,11 +210,14 @@ EXPORT_SYMBOL(autoremove_wake_function);
 void __init fork_init(unsigned long mempages)
 {
 #ifndef __HAVE_ARCH_TASK_STRUCT_ALLOCATOR
+#ifndef ARCH_MIN_TASKALIGN
+#define ARCH_MIN_TASKALIGN	0
+#endif
 	/* create a slab on which task_structs can be allocated */
 	task_struct_cachep =
 		kmem_cache_create("task_struct",
-				  sizeof(struct task_struct),0,
-				  SLAB_MUST_HWCACHE_ALIGN, NULL, NULL);
+				  sizeof(struct task_struct),ARCH_MIN_TASKALIGN,
+				  0, NULL, NULL);
 	if (!task_struct_cachep)
 		panic("fork_init(): cannot create task_struct SLAB cache");
 #endif
@@ -322,7 +326,7 @@ static inline int dup_mmap(struct mm_str
       
 			/* insert tmp into the share list, just after mpnt */
 			down(&file->f_mapping->i_shared_sem);
-			list_add_tail(&tmp->shared, &mpnt->shared);
+			list_add(&tmp->shared, &mpnt->shared);
 			up(&file->f_mapping->i_shared_sem);
 		}
 
@@ -512,7 +516,6 @@ static int copy_mm(unsigned long clone_f
 
 	tsk->min_flt = tsk->maj_flt = 0;
 	tsk->cmin_flt = tsk->cmaj_flt = 0;
-	tsk->nswap = tsk->cnswap = 0;
 	tsk->nvcsw = tsk->nivcsw = tsk->cnvcsw = tsk->cnivcsw = 0;
 
 	tsk->mm = NULL;
@@ -812,6 +815,13 @@ static inline int copy_signal(unsigned l
 	sig->group_stop_count = 0;
 	sig->curr_target = NULL;
 	init_sigpending(&sig->shared_pending);
+	INIT_LIST_HEAD(&sig->posix_timers);
+
+	sig->tty = current->signal->tty;
+	sig->pgrp = process_group(current);
+	sig->session = current->signal->session;
+	sig->leader = 0;	/* session leadership doesn't inherit */
+	sig->tty_old_pgrp = 0;
 
 	return 0;
 }
@@ -923,7 +933,6 @@ struct task_struct *copy_process(unsigne
 
 	INIT_LIST_HEAD(&p->children);
 	INIT_LIST_HEAD(&p->sibling);
-	INIT_LIST_HEAD(&p->posix_timers);
 	init_waitqueue_head(&p->wait_chldexit);
 	p->vfork_done = NULL;
 	spin_lock_init(&p->alloc_lock);
@@ -937,21 +946,22 @@ struct task_struct *copy_process(unsigne
 	init_timer(&p->real_timer);
 	p->real_timer.data = (unsigned long) p;
 
-	p->leader = 0;		/* session leadership doesn't inherit */
-	p->tty_old_pgrp = 0;
 	p->utime = p->stime = 0;
 	p->cutime = p->cstime = 0;
 	p->lock_depth = -1;		/* -1 = no lock */
 	p->start_time = get_jiffies_64();
 	p->security = NULL;
 	p->io_context = NULL;
+	p->audit_context = NULL;
 
 	retval = -ENOMEM;
 	if ((retval = security_task_alloc(p)))
 		goto bad_fork_cleanup;
+	if ((retval = audit_alloc(p)))
+		goto bad_fork_cleanup_security;
 	/* copy all the process information */
 	if ((retval = copy_semundo(clone_flags, p)))
-		goto bad_fork_cleanup_security;
+		goto bad_fork_cleanup_audit;
 	if ((retval = copy_files(clone_flags, p)))
 		goto bad_fork_cleanup_semundo;
 	if ((retval = copy_fs(clone_flags, p)))
@@ -1057,7 +1067,7 @@ struct task_struct *copy_process(unsigne
 	if (thread_group_leader(p)) {
 		attach_pid(p, PIDTYPE_TGID, p->tgid);
 		attach_pid(p, PIDTYPE_PGID, process_group(p));
-		attach_pid(p, PIDTYPE_SID, p->session);
+		attach_pid(p, PIDTYPE_SID, p->signal->session);
 		if (p->pid)
 			__get_cpu_var(process_counts)++;
 	} else
@@ -1076,6 +1086,8 @@ bad_fork_cleanup_namespace:
 	exit_namespace(p);
 bad_fork_cleanup_mm:
 	exit_mm(p);
+	if (p->active_mm)
+		mmdrop(p->active_mm);
 bad_fork_cleanup_signal:
 	exit_signal(p);
 bad_fork_cleanup_sighand:
@@ -1086,6 +1098,8 @@ bad_fork_cleanup_files:
 	exit_files(p); /* blocking */
 bad_fork_cleanup_semundo:
 	exit_sem(p);
+bad_fork_cleanup_audit:
+	audit_free(p);
 bad_fork_cleanup_security:
 	security_task_free(p);
 bad_fork_cleanup:
--- diff/kernel/kmod.c	2004-03-11 10:20:29.000000000 +0000
+++ source/kernel/kmod.c	2004-04-21 10:45:36.002230328 +0100
@@ -249,7 +249,7 @@ int call_usermodehelper(char *path, char
 	};
 	DECLARE_WORK(work, __call_usermodehelper, &sub_info);
 
-	if (!system_running)
+	if (system_state != SYSTEM_RUNNING)
 		return -EBUSY;
 
 	if (path[0] == '\0')
--- diff/kernel/module.c	2004-04-05 12:57:08.000000000 +0100
+++ source/kernel/module.c	2004-04-21 10:45:36.003230176 +0100
@@ -493,7 +493,6 @@ static inline int __try_stop_module(void
 	}
 
 	/* Mark it as dying. */
-	sref->mod->waiter = current;
 	sref->mod->state = MODULE_STATE_GOING;
 	return 0;
 }
@@ -588,6 +587,9 @@ sys_delete_module(const char __user *nam
 		}
 	}
 
+	/* Set this up before setting mod->state */
+	mod->waiter = current;
+
 	/* Stop the machine so refcounts can't move and disable module. */
 	ret = try_stop_module(mod, flags, &forced);
 
@@ -1001,6 +1003,8 @@ static int simplify_symbols(Elf_Shdr *se
 			/* We compiled with -fno-common.  These are not
 			   supposed to happen.  */
 			DEBUGP("Common symbol: %s\n", strtab + sym[i].st_name);
+			printk("%s: please compile with -fno-common\n",
+			       mod->name);
 			ret = -ENOEXEC;
 			break;
 
@@ -1539,6 +1543,10 @@ static struct module *load_module(void _
 				      / sizeof(struct obsolete_modparm),
 				      sechdrs, symindex,
 				      (char *)sechdrs[strindex].sh_addr);
+		if (setupindex)
+			printk(KERN_WARNING "%s: Ignoring new-style "
+			       "parameters in presence of obsolete ones\n",
+			       mod->name);
 	} else {
 		/* Size of section 0 is 0, so this works well if no params */
 		err = parse_args(mod->name, mod->args,
--- diff/kernel/params.c	2003-10-09 09:47:34.000000000 +0100
+++ source/kernel/params.c	2004-04-21 10:45:36.004230024 +0100
@@ -96,6 +96,13 @@ static char *next_arg(char *args, char *
 	else {
 		args[equals] = '\0';
 		*val = args + equals + 1;
+
+		/* Don't include quotes in value. */
+		if (**val == '"') {
+			(*val)++;
+			if (args[i-1] == '"')
+				args[i-1] = '\0';
+		}
 	}
 
 	if (args[i]) {
--- diff/kernel/pid.c	2004-03-11 10:20:29.000000000 +0000
+++ source/kernel/pid.c	2004-04-21 10:45:36.004230024 +0100
@@ -253,14 +253,14 @@ void switch_exec_pids(task_t *leader, ta
 
 	attach_pid(thread, PIDTYPE_PID, thread->pid);
 	attach_pid(thread, PIDTYPE_TGID, thread->tgid);
-	attach_pid(thread, PIDTYPE_PGID, leader->__pgrp);
-	attach_pid(thread, PIDTYPE_SID, thread->session);
+	attach_pid(thread, PIDTYPE_PGID, thread->signal->pgrp);
+	attach_pid(thread, PIDTYPE_SID, thread->signal->session);
 	list_add_tail(&thread->tasks, &init_task.tasks);
 
 	attach_pid(leader, PIDTYPE_PID, leader->pid);
 	attach_pid(leader, PIDTYPE_TGID, leader->tgid);
-	attach_pid(leader, PIDTYPE_PGID, leader->__pgrp);
-	attach_pid(leader, PIDTYPE_SID, leader->session);
+	attach_pid(leader, PIDTYPE_PGID, leader->signal->pgrp);
+	attach_pid(leader, PIDTYPE_SID, leader->signal->session);
 }
 
 /*
--- diff/kernel/posix-timers.c	2004-03-11 10:20:29.000000000 +0000
+++ source/kernel/posix-timers.c	2004-04-21 10:45:36.005229872 +0100
@@ -189,7 +189,11 @@ static u64 do_posix_clock_monotonic_gett
 int do_posix_clock_monotonic_gettime(struct timespec *tp);
 int do_posix_clock_monotonic_settime(struct timespec *tp);
 static struct k_itimer *lock_timer(timer_t timer_id, unsigned long *flags);
-static inline void unlock_timer(struct k_itimer *timr, unsigned long flags);
+
+static inline void unlock_timer(struct k_itimer *timr, unsigned long flags)
+{
+	spin_unlock_irqrestore(&timr->it_lock, flags);
+}
 
 /*
  * Initialize everything, well, just everything in Posix clocks/timers ;)
@@ -317,12 +321,21 @@ static void timer_notify_task(struct k_i
 	if (timr->it_incr)
 		timr->sigq->info.si_sys_private = ++timr->it_requeue_pending;
 
-	if (timr->it_sigev_notify & SIGEV_THREAD_ID )
+	if (timr->it_sigev_notify & SIGEV_THREAD_ID) {
+		if (unlikely(timr->it_process->flags & PF_EXITING)) {
+			timr->it_sigev_notify = SIGEV_SIGNAL;
+			put_task_struct(timr->it_process);
+			timr->it_process = timr->it_process->group_leader;
+			goto group;
+		}
 		ret = send_sigqueue(timr->it_sigev_signo, timr->sigq,
 			timr->it_process);
-	else
+	}
+	else {
+	group:
 		ret = send_group_sigqueue(timr->it_sigev_signo, timr->sigq,
 			timr->it_process);
+	}
 	if (ret) {
 		/*
 		 * signal was not sent because of sig_ignor
@@ -352,7 +365,7 @@ static void posix_timer_fn(unsigned long
 
 static inline struct task_struct * good_sigevent(sigevent_t * event)
 {
-	struct task_struct *rtn = current;
+	struct task_struct *rtn = current->group_leader;
 
 	if ((event->sigev_notify & SIGEV_THREAD_ID ) &&
 		(!(rtn = find_task_by_pid(event->sigev_notify_thread_id)) ||
@@ -395,11 +408,15 @@ static struct k_itimer * alloc_posix_tim
 static void release_posix_timer(struct k_itimer *tmr)
 {
 	if (tmr->it_id != -1) {
-		spin_lock_irq(&idr_lock);
+		unsigned long flags;
+		spin_lock_irqsave(&idr_lock, flags);
 		idr_remove(&posix_timers_id, tmr->it_id);
-		spin_unlock_irq(&idr_lock);
+		spin_unlock_irqrestore(&idr_lock, flags);
 	}
 	sigqueue_free(tmr->sigq);
+	if (unlikely(tmr->it_process) &&
+	    tmr->it_sigev_notify == (SIGEV_SIGNAL|SIGEV_THREAD_ID))
+		put_task_struct(tmr->it_process);
 	kmem_cache_free(posix_timers_cache, tmr);
 }
 
@@ -414,6 +431,7 @@ sys_timer_create(clockid_t which_clock,
 	struct k_itimer *new_timer = NULL;
 	timer_t new_timer_id;
 	struct task_struct *process = 0;
+	unsigned long flags;
 	sigevent_t event;
 
 	if ((unsigned) which_clock >= MAX_CLOCKS ||
@@ -458,7 +476,7 @@ sys_timer_create(clockid_t which_clock,
 			 * We may be setting up this process for another
 			 * thread.  It may be exiting.  To catch this
 			 * case the we check the PF_EXITING flag.  If
-			 * the flag is not set, the task_lock will catch
+			 * the flag is not set, the siglock will catch
 			 * him before it is too late (in exit_itimers).
 			 *
 			 * The exec case is a bit more invloved but easy
@@ -469,13 +487,14 @@ sys_timer_create(clockid_t which_clock,
 			 * for us to die which means we can finish this
 			 * linkage with our last gasp. I.e. no code :)
 			 */
-			task_lock(process);
+			spin_lock_irqsave(&process->sighand->siglock, flags);
 			if (!(process->flags & PF_EXITING)) {
 				list_add(&new_timer->list,
-					 &process->posix_timers);
-				task_unlock(process);
+					 &process->signal->posix_timers);
+				spin_unlock_irqrestore(&process->sighand->siglock, flags);
+				get_task_struct(process);
 			} else {
-				task_unlock(process);
+				spin_unlock_irqrestore(&process->sighand->siglock, flags);
 				process = 0;
 			}
 		}
@@ -491,10 +510,10 @@ sys_timer_create(clockid_t which_clock,
 		new_timer->it_sigev_notify = SIGEV_SIGNAL;
 		new_timer->it_sigev_signo = SIGALRM;
 		new_timer->it_sigev_value.sival_int = new_timer->it_id;
-		process = current;
-		task_lock(process);
-		list_add(&new_timer->list, &process->posix_timers);
-		task_unlock(process);
+		process = current->group_leader;
+		spin_lock_irqsave(&process->sighand->siglock, flags);
+		list_add(&new_timer->list, &process->signal->posix_timers);
+		spin_unlock_irqrestore(&process->sighand->siglock, flags);
 	}
 
 	new_timer->it_clock = which_clock;
@@ -538,11 +557,6 @@ static int good_timespec(const struct ti
 	return 1;
 }
 
-static inline void unlock_timer(struct k_itimer *timr, unsigned long flags)
-{
-	spin_unlock_irqrestore(&timr->it_lock, flags);
-}
-
 /*
  * Locking issues: We need to protect the result of the id look up until
  * we get the timer locked down so it is not deleted under us.  The
@@ -925,14 +939,18 @@ retry_delete:
 #else
 	p_timer_del(&posix_clocks[timer->it_clock], timer);
 #endif
-	task_lock(timer->it_process);
+	spin_lock(&current->sighand->siglock);
 	list_del(&timer->list);
-	task_unlock(timer->it_process);
+	spin_unlock(&current->sighand->siglock);
 	/*
 	 * This keeps any tasks waiting on the spin lock from thinking
 	 * they got something (see the lock code above).
 	 */
+	if (timer->it_process) {
+		if (timer->it_sigev_notify == (SIGEV_SIGNAL|SIGEV_THREAD_ID))
+			put_task_struct(timer->it_process);
 	timer->it_process = NULL;
+	}
 	unlock_timer(timer, flags);
 	release_posix_timer(timer);
 	return 0;
@@ -942,24 +960,50 @@ retry_delete:
  */
 static inline void itimer_delete(struct k_itimer *timer)
 {
-	if (sys_timer_delete(timer->it_id))
-		BUG();
+	unsigned long flags;
+
+#ifdef CONFIG_SMP
+	int error;
+retry_delete:
+#endif
+	spin_lock_irqsave(&timer->it_lock, flags);
+
+#ifdef CONFIG_SMP
+	error = p_timer_del(&posix_clocks[timer->it_clock], timer);
+
+	if (error == TIMER_RETRY) {
+		unlock_timer(timer, flags);
+		goto retry_delete;
+	}
+#else
+	p_timer_del(&posix_clocks[timer->it_clock], timer);
+#endif
+	list_del(&timer->list);
+	/*
+	 * This keeps any tasks waiting on the spin lock from thinking
+	 * they got something (see the lock code above).
+	 */
+	if (timer->it_process) {
+		if (timer->it_sigev_notify == (SIGEV_SIGNAL|SIGEV_THREAD_ID))
+			put_task_struct(timer->it_process);
+		timer->it_process = NULL;
+	}
+	unlock_timer(timer, flags);
+	release_posix_timer(timer);
 }
+
 /*
- * This is exported to exit and exec
+ * This is called by __exit_signal, only when there are no more
+ * references to the shared signal_struct.
  */
-void exit_itimers(struct task_struct *tsk)
+void exit_itimers(struct signal_struct *sig)
 {
 	struct k_itimer *tmr;
 
-	task_lock(tsk);
-	while (!list_empty(&tsk->posix_timers)) {
-		tmr = list_entry(tsk->posix_timers.next, struct k_itimer, list);
-		task_unlock(tsk);
+	while (!list_empty(&sig->posix_timers)) {
+		tmr = list_entry(sig->posix_timers.next, struct k_itimer, list);
 		itimer_delete(tmr);
-		task_lock(tsk);
 	}
-	task_unlock(tsk);
 }
 
 /*
--- diff/kernel/power/Kconfig	2004-01-19 10:22:59.000000000 +0000
+++ source/kernel/power/Kconfig	2004-04-21 10:45:36.005229872 +0100
@@ -9,9 +9,9 @@ config PM
 
 	  Power Management is most important for battery powered laptop
 	  computers; if you have a laptop, check out the Linux Laptop home
-	  page on the WWW at
-	  <http://www.cs.utexas.edu/users/kharker/linux-laptop/> and the
-	  Battery Powered Linux mini-HOWTO, available from
+	  page on the WWW at <http://www.linux-on-laptops.com/> or
+	  Tuxmobil - Linux on Mobile Computers at <http://www.tuxmobil.org/>
+	  and the Battery Powered Linux mini-HOWTO, available from
 	  <http://www.tldp.org/docs.html#howto>.
 
 	  Note that, even if you say N here, Linux on the x86 architecture
@@ -44,7 +44,7 @@ config SOFTWARE_SUSPEND
 
 config PM_DISK
 	bool "Suspend-to-Disk Support"
-	depends on PM && SWAP
+	depends on PM && SWAP && X86 && !X86_64
 	---help---
 	  Suspend-to-disk is a power management state in which the contents
 	  of memory are stored on disk and the entire system is shut down or
--- diff/kernel/power/disk.c	2004-03-11 10:20:29.000000000 +0000
+++ source/kernel/power/disk.c	2004-04-21 10:45:36.006229720 +0100
@@ -84,7 +84,6 @@ static void free_some_memory(void)
 	while (shrink_all_memory(10000))
 		printk(".");
 	printk("|\n");
-	blk_run_queues();
 }
 
 
@@ -285,11 +284,16 @@ static ssize_t disk_store(struct subsyst
 {
 	int error = 0;
 	int i;
+	int len;
+	char *p;
 	u32 mode = 0;
 
+	p = memchr(buf, '\n', n);
+	len = p ? p - buf : n;
+
 	down(&pm_sem);
 	for (i = PM_DISK_FIRMWARE; i < PM_DISK_MAX; i++) {
-		if (!strcmp(buf,pm_disk_modes[i])) {
+		if (!strncmp(buf, pm_disk_modes[i], len)) {
 			mode = i;
 			break;
 		}
--- diff/kernel/power/main.c	2003-09-30 15:46:21.000000000 +0100
+++ source/kernel/power/main.c	2004-04-21 10:45:36.006229720 +0100
@@ -218,10 +218,15 @@ static ssize_t state_store(struct subsys
 {
 	u32 state = PM_SUSPEND_STANDBY;
 	char ** s;
+	char *p;
 	int error;
+	int len;
+
+	p = memchr(buf, '\n', n);
+	len = p ? p - buf : n;
 
 	for (s = &pm_states[state]; *s; s++, state++) {
-		if (!strcmp(buf,*s))
+		if (!strncmp(buf, *s, len))
 			break;
 	}
 	if (*s)
--- diff/kernel/power/pmdisk.c	2004-03-11 10:20:29.000000000 +0000
+++ source/kernel/power/pmdisk.c	2004-04-21 10:45:36.007229568 +0100
@@ -35,7 +35,7 @@
 #include "power.h"
 
 
-extern int pmdisk_arch_suspend(int resume);
+extern asmlinkage int pmdisk_arch_suspend(int resume);
 
 #define __ADDRESS(x)  ((unsigned long) phys_to_virt(x))
 #define ADDRESS(x) __ADDRESS((x) << PAGE_SHIFT)
@@ -859,7 +859,6 @@ static int end_io(struct bio * bio, unsi
 
 static void wait_io(void)
 {
-	blk_run_queues();
 	while(atomic_read(&io_done))
 		io_schedule();
 }
@@ -898,7 +897,7 @@ static int submit(int rw, pgoff_t page_o
 	if (rw == WRITE)
 		bio_set_pages_dirty(bio);
 	start_io();
-	submit_bio(rw,bio);
+	submit_bio(rw | (1 << BIO_RW_SYNC), bio);
 	wait_io();
  Done:
 	bio_put(bio);
--- diff/kernel/power/process.c	2003-08-26 10:00:54.000000000 +0100
+++ source/kernel/power/process.c	2004-04-21 10:45:36.007229568 +0100
@@ -28,9 +28,10 @@
 static inline int freezeable(struct task_struct * p)
 {
 	if ((p == current) || 
-	    (p->flags & PF_IOTHREAD) || 
+	    (p->flags & PF_NOFREEZE) ||
 	    (p->state == TASK_ZOMBIE) ||
-	    (p->state == TASK_DEAD))
+	    (p->state == TASK_DEAD) ||
+	    (p->state == TASK_STOPPED))
 		return 0;
 	return 1;
 }
@@ -38,21 +39,19 @@ static inline int freezeable(struct task
 /* Refrigerator is place where frozen processes are stored :-). */
 void refrigerator(unsigned long flag)
 {
-	/* You need correct to work with real-time processes.
-	   OTOH, this way one process may see (via /proc/) some other
-	   process in stopped state (and thereby discovered we were
-	   suspended. We probably do not care. 
-	 */
+	/* Hmm, should we be allowed to suspend when there are realtime
+	   processes around? */
 	long save;
 	save = current->state;
-	current->state = TASK_STOPPED;
+	current->state = TASK_UNINTERRUPTIBLE;
 	pr_debug("%s entered refrigerator\n", current->comm);
 	printk("=");
 	current->flags &= ~PF_FREEZE;
-	if (flag)
-		flush_signals(current); /* We have signaled a kernel thread, which isn't normal behaviour
-					   and that may lead to 100%CPU sucking because those threads
-					   just don't manage signals. */
+
+	spin_lock_irq(&current->sighand->siglock);
+	recalc_sigpending(); /* We sent fake signal, clean it up */
+	spin_unlock_irq(&current->sighand->siglock);
+
 	current->flags |= PF_FROZEN;
 	while (current->flags & PF_FROZEN)
 		schedule();
--- diff/kernel/power/swsusp.c	2004-03-11 10:20:29.000000000 +0000
+++ source/kernel/power/swsusp.c	2004-04-21 10:45:36.008229416 +0100
@@ -1,11 +1,11 @@
 /*
- * linux/kernel/suspend.c
+ * linux/kernel/power/swsusp.c
  *
  * This file is to realize architecture-independent
  * machine suspend feature using pretty near only high-level routines
  *
  * Copyright (C) 1998-2001 Gabor Kuti <seasons@fornax.hu>
- * Copyright (C) 1998,2001-2003 Pavel Machek <pavel@suse.cz>
+ * Copyright (C) 1998,2001-2004 Pavel Machek <pavel@suse.cz>
  *
  * This file is released under the GPLv2.
  *
@@ -61,6 +61,7 @@
 #include <linux/bootmem.h>
 #include <linux/syscalls.h>
 #include <linux/console.h>
+#include <linux/highmem.h>
 
 #include <asm/uaccess.h>
 #include <asm/mmu_context.h>
@@ -74,11 +75,6 @@ unsigned char software_suspend_enabled =
 #define NORESUME		1
 #define RESUME_SPECIFIED	2
 
-
-#define __ADDRESS(x)  ((unsigned long) phys_to_virt(x))
-#define ADDRESS(x) __ADDRESS((x) << PAGE_SHIFT)
-#define ADDRESS2(x) __ADDRESS(__pa(x))		/* Needed for x86-64 where some pages are in memory twice */
-
 /* References to section boundaries */
 extern char __nosave_begin, __nosave_end;
 
@@ -105,6 +101,10 @@ unsigned int nr_copy_pages __nosavedata 
    time of suspend, that must be freed. Second is "pagedir_nosave", 
    allocated at time of resume, that travels through memory not to
    collide with anything.
+
+   Warning: this is even more evil than it seems. Pagedirs this file
+   talks about are completely different from page directories used by
+   MMU hardware.
  */
 suspend_pagedir_t *pagedir_nosave __nosavedata = NULL;
 static suspend_pagedir_t *pagedir_save;
@@ -139,15 +139,15 @@ static const char name_resume[] = "Resum
 #define TEST_SWSUSP 0		/* Set to 1 to reboot instead of halt machine after suspension */
 
 #ifdef DEBUG_DEFAULT
-# define PRINTK(f, a...)       printk(f, ## a)
+# define PRINTK(f, a...)	printk(f, ## a)
 #else
-# define PRINTK(f, a...)
+# define PRINTK(f, a...)       	do { } while(0)
 #endif
 
 #ifdef DEBUG_SLOW
 #define MDELAY(a) mdelay(a)
 #else
-#define MDELAY(a)
+#define MDELAY(a) do { } while(0)
 #endif
 
 /*
@@ -225,6 +225,7 @@ static void mark_swapfiles(swp_entry_t p
 static void read_swapfiles(void) /* This is called before saving image */
 {
 	int i, len;
+	static char buff[sizeof(resume_file)], *sname;
 	
 	len=strlen(resume_file);
 	root_swap = 0xFFFF;
@@ -243,8 +244,11 @@ static void read_swapfiles(void) /* This
 					swapfile_used[i] = SWAPFILE_IGNORED;				  
 			} else {
 	  			/* we ignore all swap devices that are not the resume_file */
-				if (1) {
-// FIXME				if(resume_device == swap_info[i].swap_device) {
+				sname = d_path(swap_info[i].swap_file->f_dentry,
+					       swap_info[i].swap_file->f_vfsmnt,
+					       buff,
+					       sizeof(buff));
+				if (!strcmp(sname, resume_file)) {
 					swapfile_used[i] = SWAPFILE_SUSPEND;
 					root_swap = i;
 				} else {
@@ -346,7 +350,7 @@ static int write_suspend_image(void)
 
 	cur = (void *) buffer;
 	if (fill_suspend_header(&cur->sh))
-		panic("\nOut of memory while writing header");
+		BUG();		/* Not a BUG_ON(): we want fill_suspend_header to be called, always */
 		
 	cur->link.next = prev;
 
@@ -362,73 +366,174 @@ static int write_suspend_image(void)
 	return 0;
 }
 
-/* if pagedir_p != NULL it also copies the counted pages */
-static int count_and_copy_data_pages(struct pbe *pagedir_p)
-{
-	int chunk_size;
-	int nr_copy_pages = 0;
-	int pfn;
+#ifdef CONFIG_HIGHMEM
+struct highmem_page {
+	char *data;
 	struct page *page;
-	
-#ifdef CONFIG_DISCONTIGMEM
-	panic("Discontingmem not supported");
-#else
-	BUG_ON (max_pfn != num_physpages);
-#endif
-	for (pfn = 0; pfn < max_pfn; pfn++) {
+	struct highmem_page *next;
+};
+
+struct highmem_page *highmem_copy = NULL;
+
+static int save_highmem_zone(struct zone *zone)
+{
+	unsigned long zone_pfn;
+	for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) {
+		struct page *page;
+		struct highmem_page *save;
+		void *kaddr;
+		unsigned long pfn = zone_pfn + zone->zone_start_pfn;
+		int chunk_size;
+
+		if (!(pfn%1000))
+			printk(".");
+		if (!pfn_valid(pfn))
+			continue;
 		page = pfn_to_page(pfn);
-		if (PageHighMem(page))
-			panic("Swsusp not supported on highmem boxes. Send 1GB of RAM to <pavel@ucw.cz> and try again ;-).");
+		/*
+		 * This condition results from rvmalloc() sans vmalloc_32()
+		 * and architectural memory reservations. This should be
+		 * corrected eventually when the cases giving rise to this
+		 * are better understood.
+		 */
+		if (PageReserved(page)) {
+			printk("highmem reserved page?!\n");
+			continue;
+		}
+		if ((chunk_size = is_head_of_free_region(page))) {
+			pfn += chunk_size - 1;
+			zone_pfn += chunk_size - 1;
+			continue;
+		}
+		save = kmalloc(sizeof(struct highmem_page), GFP_ATOMIC);
+		if (!save)
+			return -ENOMEM;
+		save->next = highmem_copy;
+		save->page = page;
+		save->data = (void *) get_zeroed_page(GFP_ATOMIC);
+		if (!save->data) {
+			kfree(save);
+			return -ENOMEM;
+		}
+		kaddr = kmap_atomic(page, KM_USER0);
+		memcpy(save->data, kaddr, PAGE_SIZE);
+		kunmap_atomic(kaddr, KM_USER0);
+		highmem_copy = save;
+	}
+	return 0;
+}
 
-		if (!PageReserved(page)) {
-			if (PageNosave(page))
-				continue;
-
-			if ((chunk_size=is_head_of_free_region(page))!=0) {
-				pfn += chunk_size - 1;
-				continue;
-			}
-		} else if (PageReserved(page)) {
-			BUG_ON (PageNosave(page));
+static int save_highmem(void)
+{
+	struct zone *zone;
+	int res = 0;
+	for_each_zone(zone) {
+		if (is_highmem(zone))
+			res = save_highmem_zone(zone);
+		if (res)
+			return res;
+	}
+	return 0;
+}
 
-			/*
-			 * Just copy whole code segment. Hopefully it is not that big.
-			 */
-			if ((ADDRESS(pfn) >= (unsigned long) ADDRESS2(&__nosave_begin)) && 
-			    (ADDRESS(pfn) <  (unsigned long) ADDRESS2(&__nosave_end))) {
-				PRINTK("[nosave %lx]", ADDRESS(pfn));
-				continue;
-			}
-			/* Hmm, perhaps copying all reserved pages is not too healthy as they may contain 
-			   critical bios data? */
-		} else	BUG();
+static int restore_highmem(void)
+{
+	while (highmem_copy) {
+		struct highmem_page *save = highmem_copy;
+		void *kaddr;
+		highmem_copy = save->next;
+
+		kaddr = kmap_atomic(save->page, KM_USER0);
+		memcpy(kaddr, save->data, PAGE_SIZE);
+		kunmap_atomic(kaddr, KM_USER0);
+		free_page((long) save->data);
+		kfree(save);
+	}
+	return 0;
+}
+#endif
 
-		nr_copy_pages++;
-		if (pagedir_p) {
-			pagedir_p->orig_address = ADDRESS(pfn);
-			copy_page((void *) pagedir_p->address, (void *) pagedir_p->orig_address);
-			pagedir_p++;
+static int pfn_is_nosave(unsigned long pfn)
+{
+	unsigned long nosave_begin_pfn = __pa(&__nosave_begin) >> PAGE_SHIFT;
+	unsigned long nosave_end_pfn = PAGE_ALIGN(__pa(&__nosave_end)) >> PAGE_SHIFT;
+	return (pfn >= nosave_begin_pfn) && (pfn < nosave_end_pfn);
+}
+
+/* if *pagedir_p != NULL it also copies the counted pages */
+static int count_and_copy_zone(struct zone *zone, struct pbe **pagedir_p)
+{
+	unsigned long zone_pfn, chunk_size, nr_copy_pages = 0;
+	struct pbe *pbe = *pagedir_p;
+	for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) {
+		struct page *page;
+		unsigned long pfn = zone_pfn + zone->zone_start_pfn;
+
+		if (!(pfn%1000))
+			printk(".");
+		if (!pfn_valid(pfn))
+			continue;
+		page = pfn_to_page(pfn);
+		BUG_ON(PageReserved(page) && PageNosave(page));
+		if (PageNosave(page))
+			continue;
+		if (PageReserved(page) && pfn_is_nosave(pfn)) {
+			PRINTK("[nosave pfn 0x%lx]", pfn);
+			continue;
 		}
+		if ((chunk_size = is_head_of_free_region(page))) {
+			pfn += chunk_size - 1;
+			zone_pfn += chunk_size - 1;
+			continue;
+		}
+		nr_copy_pages++;
+		if (!pbe)
+			continue;
+		pbe->orig_address = (long) page_address(page);
+		copy_page((void *)pbe->address, (void *)pbe->orig_address);
+		pbe++;
 	}
+	*pagedir_p = pbe;
 	return nr_copy_pages;
 }
 
-static void free_suspend_pagedir(unsigned long this_pagedir)
+static int count_and_copy_data_pages(struct pbe *pagedir_p)
 {
-	struct page *page;
-	int pfn;
-	unsigned long this_pagedir_end = this_pagedir +
-		(PAGE_SIZE << pagedir_order);
+	int nr_copy_pages = 0;
+	struct zone *zone;
+	for_each_zone(zone) {
+		if (!is_highmem(zone))
+			nr_copy_pages += count_and_copy_zone(zone, &pagedir_p);
+	}
+	return nr_copy_pages;
+}
 
-	for(pfn = 0; pfn < num_physpages; pfn++) {
+static void free_suspend_pagedir_zone(struct zone *zone, unsigned long pagedir)
+{
+	unsigned long zone_pfn, pagedir_end, pagedir_pfn, pagedir_end_pfn;
+	pagedir_end = pagedir + (PAGE_SIZE << pagedir_order);
+	pagedir_pfn = __pa(pagedir) >> PAGE_SHIFT;
+	pagedir_end_pfn = __pa(pagedir_end) >> PAGE_SHIFT;
+	for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) {
+		struct page *page;
+		unsigned long pfn = zone_pfn + zone->zone_start_pfn;
+		if (!pfn_valid(pfn))
+			continue;
 		page = pfn_to_page(pfn);
 		if (!TestClearPageNosave(page))
 			continue;
+		else if (pfn >= pagedir_pfn && pfn < pagedir_end_pfn)
+			continue;
+		__free_page(page);
+	}
+}
 
-		if (ADDRESS(pfn) >= this_pagedir && ADDRESS(pfn) < this_pagedir_end)
-			continue; /* old pagedir gets freed in one */
-		
-		free_page(ADDRESS(pfn));
+static void free_suspend_pagedir(unsigned long this_pagedir)
+{
+	struct zone *zone;
+	for_each_zone(zone) {
+		if (!is_highmem(zone))
+			free_suspend_pagedir_zone(zone, this_pagedir);
 	}
 	free_pages(this_pagedir, pagedir_order);
 }
@@ -443,7 +548,7 @@ static suspend_pagedir_t *create_suspend
 	pagedir_order = get_bitmask_order(SUSPEND_PD_PAGES(nr_copy_pages));
 
 	p = pagedir = (suspend_pagedir_t *)__get_free_pages(GFP_ATOMIC | __GFP_COLD, pagedir_order);
-	if(!pagedir)
+	if (!pagedir)
 		return NULL;
 
 	page = virt_to_page(pagedir);
@@ -452,7 +557,7 @@ static suspend_pagedir_t *create_suspend
 		
 	while(nr_copy_pages--) {
 		p->address = get_zeroed_page(GFP_ATOMIC | __GFP_COLD);
-		if(!p->address) {
+		if (!p->address) {
 			free_suspend_pagedir((unsigned long) pagedir);
 			return NULL;
 		}
@@ -492,10 +597,19 @@ static int suspend_prepare_image(void)
 	struct sysinfo i;
 	unsigned int nr_needed_pages = 0;
 
-	drain_local_pages();
-
 	pagedir_nosave = NULL;
-	printk( "/critical section: Counting pages to copy" );
+	printk( "/critical section: ");
+#ifdef CONFIG_HIGHMEM
+	printk( "handling highmem" );
+	if (save_highmem()) {
+		printk(KERN_CRIT "%sNot enough free pages for highmem\n", name_suspend);
+		return -ENOMEM;
+	}
+	printk(", ");
+#endif
+
+	printk("counting pages to copy" );
+	drain_local_pages();
 	nr_copy_pages = count_and_copy_data_pages(NULL);
 	nr_needed_pages = nr_copy_pages + PAGES_FOR_IO;
 	
@@ -504,23 +618,22 @@ static int suspend_prepare_image(void)
 		printk(KERN_CRIT "%sCouldn't get enough free pages, on %d pages short\n",
 		       name_suspend, nr_needed_pages-nr_free_pages());
 		root_swap = 0xFFFF;
-		return 1;
+		return -ENOMEM;
 	}
 	si_swapinfo(&i);	/* FIXME: si_swapinfo(&i) returns all swap devices information.
 				   We should only consider resume_device. */
 	if (i.freeswap < nr_needed_pages)  {
 		printk(KERN_CRIT "%sThere's not enough swap space available, on %ld pages short\n",
 		       name_suspend, nr_needed_pages-i.freeswap);
-		return 1;
+		return -ENOSPC;
 	}
 
 	PRINTK( "Alloc pagedir\n" ); 
 	pagedir_save = pagedir_nosave = create_suspend_pagedir(nr_copy_pages);
-	if(!pagedir_nosave) {
-		/* Shouldn't happen */
-		printk(KERN_CRIT "%sCouldn't allocate enough pages\n",name_suspend);
-		panic("Really should not happen");
-		return 1;
+	if (!pagedir_nosave) {
+		/* Pagedir is big, one-chunk allocation. It is easily possible for this allocation to fail */
+		printk(KERN_CRIT "%sCouldn't allocate continuous pagedir\n", name_suspend);
+		return -ENOMEM;
 	}
 	nr_copy_pages_check = nr_copy_pages;
 	pagedir_order_check = pagedir_order;
@@ -603,21 +716,25 @@ asmlinkage void do_magic_resume_2(void)
 
 	PRINTK( "Freeing prev allocated pagedir\n" );
 	free_suspend_pagedir((unsigned long) pagedir_save);
+
+#ifdef CONFIG_HIGHMEM
+	printk( "Restoring highmem\n" );
+	restore_highmem();
+#endif
+	printk("done, devices\n");
+
 	device_power_up();
 	spin_unlock_irq(&suspend_pagedir_lock);
 	device_resume();
 
-	acquire_console_sem();
-	update_screen(fg_console);	/* Hmm, is this the problem? */
-	release_console_sem();
-
+	/* Fixme: this is too late; we should do this ASAP to avoid "infinite reboots" problem */
 	PRINTK( "Fixing swap signatures... " );
 	mark_swapfiles(((swp_entry_t) {0}), MARK_SWAP_RESUME);
 	PRINTK( "ok\n" );
 
 #ifdef SUSPEND_CONSOLE
 	acquire_console_sem();
-	update_screen(fg_console);	/* Hmm, is this the problem? */
+	update_screen(fg_console);
 	release_console_sem();
 #endif
 }
@@ -707,11 +824,6 @@ int software_suspend(void)
 
 		free_some_memory();
 		
-		/* No need to invalidate any vfsmnt list -- 
-		 * they will be valid after resume, anyway.
-		 */
-		blk_run_queues();
-
 		/* Save state of all device drivers, and stop them. */		   
 		if ((res = device_suspend(4))==0)
 			/* If stopping device drivers worked, we proceed basically into
--- diff/kernel/printk.c	2004-03-11 10:20:29.000000000 +0000
+++ source/kernel/printk.c	2004-04-21 10:45:36.009229264 +0100
@@ -522,7 +522,8 @@ asmlinkage int printk(const char *fmt, .
 			log_level_unknown = 1;
 	}
 
-	if (!cpu_online(smp_processor_id()) && !system_running) {
+	if (!cpu_online(smp_processor_id()) &&
+	    system_state != SYSTEM_RUNNING) {
 		/*
 		 * Some console drivers may assume that per-cpu resources have
 		 * been allocated.  So don't allow them to be called by this
--- diff/kernel/rcupdate.c	2004-04-05 12:57:08.000000000 +0100
+++ source/kernel/rcupdate.c	2004-04-21 10:45:36.009229264 +0100
@@ -182,7 +182,7 @@ static void rcu_offline_cpu(int cpu)
 	 * it here
 	 */
 	spin_lock_irq(&rcu_ctrlblk.mutex);
-	if (!rcu_ctrlblk.rcu_cpu_mask)
+	if (cpus_empty(rcu_ctrlblk.rcu_cpu_mask))
 		goto unlock;
 
 	cpu_clear(cpu, rcu_ctrlblk.rcu_cpu_mask);
--- diff/kernel/sched.c	2004-04-05 12:57:08.000000000 +0100
+++ source/kernel/sched.c	2004-04-21 10:45:36.011228960 +0100
@@ -225,6 +225,13 @@ static DEFINE_PER_CPU(struct runqueue, r
 #define task_rq(p)		cpu_rq(task_cpu(p))
 #define cpu_curr(cpu)		(cpu_rq(cpu)->curr)
 
+extern unsigned long __scheduling_functions_start_here;
+extern unsigned long __scheduling_functions_end_here;
+const unsigned long scheduling_functions_start_here =
+			(unsigned long)&__scheduling_functions_start_here;
+const unsigned long scheduling_functions_end_here =
+			(unsigned long)&__scheduling_functions_end_here;
+
 /*
  * Default context-switch locking:
  */
@@ -1587,12 +1594,10 @@ out:
 	rebalance_tick(rq, 0);
 }
 
-void scheduling_functions_start_here(void) { }
-
 /*
  * schedule() is the main scheduler function.
  */
-asmlinkage void schedule(void)
+asmlinkage void __sched schedule(void)
 {
 	long *switch_count;
 	task_t *prev, *next;
@@ -1731,7 +1736,7 @@ EXPORT_SYMBOL(schedule);
  * off of preempt_enable.  Kernel preemptions off return from interrupt
  * occur there and call schedule directly.
  */
-asmlinkage void preempt_schedule(void)
+asmlinkage void __sched preempt_schedule(void)
 {
 	struct thread_info *ti = current_thread_info();
 
@@ -1842,7 +1847,6 @@ void fastcall __wake_up_sync(wait_queue_
 		__wake_up_common(q, mode, nr_exclusive, 0);
 	spin_unlock_irqrestore(&q->lock, flags);
 }
-
 EXPORT_SYMBOL_GPL(__wake_up_sync);	/* For internal use only */
 
 void fastcall complete(struct completion *x)
@@ -1855,7 +1859,6 @@ void fastcall complete(struct completion
 			 1, 0);
 	spin_unlock_irqrestore(&x->wait.lock, flags);
 }
-
 EXPORT_SYMBOL(complete);
 
 void fastcall complete_all(struct completion *x)
@@ -1868,8 +1871,9 @@ void fastcall complete_all(struct comple
 			 0, 0);
 	spin_unlock_irqrestore(&x->wait.lock, flags);
 }
+EXPORT_SYMBOL(complete_all);
 
-void fastcall wait_for_completion(struct completion *x)
+void fastcall __sched wait_for_completion(struct completion *x)
 {
 	might_sleep();
 	spin_lock_irq(&x->wait.lock);
@@ -1889,7 +1893,6 @@ void fastcall wait_for_completion(struct
 	x->done--;
 	spin_unlock_irq(&x->wait.lock);
 }
-
 EXPORT_SYMBOL(wait_for_completion);
 
 #define	SLEEP_ON_VAR					\
@@ -1907,7 +1910,7 @@ EXPORT_SYMBOL(wait_for_completion);
 	__remove_wait_queue(q, &wait);			\
 	spin_unlock_irqrestore(&q->lock, flags);
 
-void fastcall interruptible_sleep_on(wait_queue_head_t *q)
+void fastcall __sched interruptible_sleep_on(wait_queue_head_t *q)
 {
 	SLEEP_ON_VAR
 
@@ -1920,7 +1923,7 @@ void fastcall interruptible_sleep_on(wai
 
 EXPORT_SYMBOL(interruptible_sleep_on);
 
-long fastcall interruptible_sleep_on_timeout(wait_queue_head_t *q, long timeout)
+long fastcall __sched interruptible_sleep_on_timeout(wait_queue_head_t *q, long timeout)
 {
 	SLEEP_ON_VAR
 
@@ -1935,7 +1938,7 @@ long fastcall interruptible_sleep_on_tim
 
 EXPORT_SYMBOL(interruptible_sleep_on_timeout);
 
-void fastcall sleep_on(wait_queue_head_t *q)
+void fastcall __sched sleep_on(wait_queue_head_t *q)
 {
 	SLEEP_ON_VAR
 
@@ -1948,7 +1951,7 @@ void fastcall sleep_on(wait_queue_head_t
 
 EXPORT_SYMBOL(sleep_on);
 
-long fastcall sleep_on_timeout(wait_queue_head_t *q, long timeout)
+long fastcall __sched sleep_on_timeout(wait_queue_head_t *q, long timeout)
 {
 	SLEEP_ON_VAR
 
@@ -1963,8 +1966,6 @@ long fastcall sleep_on_timeout(wait_queu
 
 EXPORT_SYMBOL(sleep_on_timeout);
 
-void scheduling_functions_end_here(void) { }
-
 void set_user_nice(task_t *p, long nice)
 {
 	unsigned long flags;
@@ -2424,7 +2425,7 @@ asmlinkage long sys_sched_yield(void)
 	return 0;
 }
 
-void __cond_resched(void)
+void __sched __cond_resched(void)
 {
 	set_current_state(TASK_RUNNING);
 	schedule();
@@ -2438,7 +2439,7 @@ EXPORT_SYMBOL(__cond_resched);
  * this is a shortcut for kernel-space yielding - it marks the
  * thread runnable and calls sys_sched_yield().
  */
-void yield(void)
+void __sched yield(void)
 {
 	set_current_state(TASK_RUNNING);
 	sys_sched_yield();
@@ -2453,7 +2454,7 @@ EXPORT_SYMBOL(yield);
  * But don't do that if it is a deliberate, throttling IO wait (this task
  * has set its backing_dev_info: the queue against which it should throttle)
  */
-void io_schedule(void)
+void __sched io_schedule(void)
 {
 	struct runqueue *rq = this_rq();
 
@@ -2464,7 +2465,7 @@ void io_schedule(void)
 
 EXPORT_SYMBOL(io_schedule);
 
-long io_schedule_timeout(long timeout)
+long __sched io_schedule_timeout(long timeout)
 {
 	struct runqueue *rq = this_rq();
 	long ret;
@@ -2778,7 +2779,7 @@ static int migration_thread(void * data)
 		migration_req_t *req;
 
 		if (current->flags & PF_FREEZE)
-			refrigerator(PF_IOTHREAD);
+			refrigerator(PF_FREEZE);
 
 		spin_lock_irq(&rq->lock);
 		head = &rq->migration_queue;
@@ -2982,7 +2983,8 @@ void __might_sleep(char *file, int line)
 #if defined(in_atomic)
 	static unsigned long prev_jiffy;	/* ratelimiting */
 
-	if ((in_atomic() || irqs_disabled()) && system_running) {
+	if ((in_atomic() || irqs_disabled()) &&
+	    system_state == SYSTEM_RUNNING) {
 		if (time_before(jiffies, prev_jiffy + HZ) && prev_jiffy)
 			return;
 		prev_jiffy = jiffies;
@@ -3009,7 +3011,7 @@ EXPORT_SYMBOL(__might_sleep);
  *
  * Called inside preempt_disable().
  */
-void __preempt_spin_lock(spinlock_t *lock)
+void __sched __preempt_spin_lock(spinlock_t *lock)
 {
 	if (preempt_count() > 1) {
 		_raw_spin_lock(lock);
@@ -3025,7 +3027,7 @@ void __preempt_spin_lock(spinlock_t *loc
 
 EXPORT_SYMBOL(__preempt_spin_lock);
 
-void __preempt_write_lock(rwlock_t *lock)
+void __sched __preempt_write_lock(rwlock_t *lock)
 {
 	if (preempt_count() > 1) {
 		_raw_write_lock(lock);
--- diff/kernel/signal.c	2004-04-05 12:57:08.000000000 +0100
+++ source/kernel/signal.c	2004-04-21 10:45:36.012228808 +0100
@@ -354,7 +354,6 @@ void __exit_signal(struct task_struct *t
 		tsk->signal = NULL;
 		spin_unlock(&sighand->siglock);
 		flush_sigqueue(&sig->shared_pending);
-		kmem_cache_free(signal_cachep, sig);
 	} else {
 		/*
 		 * If there is any task waiting for the group exit
@@ -368,9 +367,28 @@ void __exit_signal(struct task_struct *t
 			sig->curr_target = next_thread(tsk);
 		tsk->signal = NULL;
 		spin_unlock(&sighand->siglock);
+		sig = NULL;	/* Marker for below.  */
 	}
 	clear_tsk_thread_flag(tsk,TIF_SIGPENDING);
 	flush_sigqueue(&tsk->pending);
+	if (sig) {
+		/*
+		 * We are cleaning up the signal_struct here.  We delayed
+		 * calling exit_itimers until after flush_sigqueue, just in
+		 * case our thread-local pending queue contained a queued
+		 * timer signal that would have been cleared in
+		 * exit_itimers.  When that called sigqueue_free, it would
+		 * attempt to re-take the tasklist_lock and deadlock.  This
+		 * can never happen if we ensure that all queues the
+		 * timer's signal might be queued on have been flushed
+		 * first.  The shared_pending queue, and our own pending
+		 * queue are the only queues the timer could be on, since
+		 * there are no other threads left in the group and timer
+		 * signals are constrained to threads inside the group.
+		 */
+		exit_itimers(sig);
+		kmem_cache_free(signal_cachep, sig);
+	}
 }
 
 void exit_signal(struct task_struct *tsk)
@@ -588,7 +606,8 @@ static int check_kill_permission(int sig
 	error = -EPERM;
 	if ((!info || ((unsigned long)info != 1 &&
 			(unsigned long)info != 2 && SI_FROMUSER(info)))
-	    && ((sig != SIGCONT) || (current->session != t->session))
+	    && ((sig != SIGCONT) ||
+		(current->signal->session != t->signal->session))
 	    && (current->euid ^ t->suid) && (current->euid ^ t->uid)
 	    && (current->uid ^ t->suid) && (current->uid ^ t->uid)
 	    && !capable(CAP_KILL))
@@ -1103,7 +1122,7 @@ kill_sl_info(int sig, struct siginfo *in
 	retval = -ESRCH;
 	read_lock(&tasklist_lock);
 	for_each_task_pid(sid, PIDTYPE_SID, p, l, pid) {
-		if (!p->leader)
+		if (!p->signal->leader)
 			continue;
 		err = group_send_sig_info(sig, info, p);
 		if (retval)
@@ -2047,9 +2066,9 @@ int copy_siginfo_to_user(siginfo_t __use
 		err |= __put_user(from->si_stime, &to->si_stime);
 		break;
 	case __SI_RT: /* This is not generated by the kernel as of now. */
+	case __SI_MESGQ: /* But this is */
 		err |= __put_user(from->si_pid, &to->si_pid);
 		err |= __put_user(from->si_uid, &to->si_uid);
-		err |= __put_user(from->si_int, &to->si_int);
 		err |= __put_user(from->si_ptr, &to->si_ptr);
 		break;
 	default: /* this is just in case for now ... */
@@ -2553,4 +2572,3 @@ void __init signals_init(void)
 	if (!sigqueue_cachep)
 		panic("signals_init(): cannot create sigqueue SLAB cache");
 }
-
--- diff/kernel/softirq.c	2004-04-05 12:57:08.000000000 +0100
+++ source/kernel/softirq.c	2004-04-21 10:45:36.013228656 +0100
@@ -16,6 +16,7 @@
 #include <linux/cpu.h>
 #include <linux/kthread.h>
 
+#include <asm/irq.h>
 /*
    - No shared variables, all the data are CPU local.
    - If a softirq needs serialization, let it serialize itself
@@ -69,53 +70,66 @@ static inline void wakeup_softirqd(void)
  */
 #define MAX_SOFTIRQ_RESTART 10
 
-asmlinkage void do_softirq(void)
+asmlinkage void __do_softirq(void)
 {
-	int max_restart = MAX_SOFTIRQ_RESTART;
+	struct softirq_action *h;
 	__u32 pending;
-	unsigned long flags;
+	int max_restart = MAX_SOFTIRQ_RESTART;
 
-	if (in_interrupt())
-		return;
+	pending = local_softirq_pending();
 
-	local_irq_save(flags);
+	local_bh_disable();
+restart:
+	/* Reset the pending bitmask before enabling irqs */
+	local_softirq_pending() = 0;
+
+	local_irq_enable();
+
+	h = softirq_vec;
+
+	do {
+		if (pending & 1)
+			h->action(h);
+		h++;
+		pending >>= 1;
+	} while (pending);
+
+	local_irq_disable();
 
 	pending = local_softirq_pending();
+	if (pending && --max_restart)
+		goto restart;
 
-	if (pending) {
-		struct softirq_action *h;
+	if (pending)
+		wakeup_softirqd();
 
-		local_bh_disable();
-restart:
-		/* Reset the pending bitmask before enabling irqs */
-		local_softirq_pending() = 0;
+	__local_bh_enable();
+}
 
-		local_irq_enable();
+#ifndef __ARCH_HAS_DO_SOFTIRQ
+
+asmlinkage void do_softirq(void)
+{
+	__u32 pending;
+	unsigned long flags;
 
-		h = softirq_vec;
+	if (in_interrupt())
+		return;
 
-		do {
-			if (pending & 1)
-				h->action(h);
-			h++;
-			pending >>= 1;
-		} while (pending);
+	local_irq_save(flags);
 
-		local_irq_disable();
+	pending = local_softirq_pending();
 
-		pending = local_softirq_pending();
-		if (pending && --max_restart)
-			goto restart;
-		if (pending)
-			wakeup_softirqd();
-		__local_bh_enable();
-	}
+	if (pending)
+		__do_softirq();
 
 	local_irq_restore(flags);
 }
 
 EXPORT_SYMBOL(do_softirq);
 
+#endif
+
 void local_bh_enable(void)
 {
 	__local_bh_enable();
@@ -309,7 +323,7 @@ void __init softirq_init(void)
 static int ksoftirqd(void * __bind_cpu)
 {
 	set_user_nice(current, 19);
-	current->flags |= PF_IOTHREAD;
+	current->flags |= PF_NOFREEZE;
 
 	set_current_state(TASK_INTERRUPTIBLE);
 
--- diff/kernel/stop_machine.c	2004-04-05 12:57:08.000000000 +0100
+++ source/kernel/stop_machine.c	2004-04-21 10:45:36.013228656 +0100
@@ -149,10 +149,10 @@ static int do_stop(void *_smdata)
 	complete(&smdata->done);
 
 	/* Wait for kthread_stop */
-	__set_current_state(TASK_INTERRUPTIBLE);
+	set_current_state(TASK_INTERRUPTIBLE);
 	while (!kthread_should_stop()) {
 		schedule();
-		__set_current_state(TASK_INTERRUPTIBLE);
+		set_current_state(TASK_INTERRUPTIBLE);
 	}
 	__set_current_state(TASK_RUNNING);
 	return ret;
--- diff/kernel/sys.c	2004-03-11 10:20:29.000000000 +0000
+++ source/kernel/sys.c	2004-04-21 10:45:36.014228504 +0100
@@ -260,6 +260,17 @@ cond_syscall(sys_msgctl)
 cond_syscall(sys_shmget)
 cond_syscall(sys_shmdt)
 cond_syscall(sys_shmctl)
+cond_syscall(sys_mq_open)
+cond_syscall(sys_mq_unlink)
+cond_syscall(sys_mq_timedsend)
+cond_syscall(sys_mq_timedreceive)
+cond_syscall(sys_mq_notify)
+cond_syscall(sys_mq_getsetattr)
+cond_syscall(compat_sys_mq_open)
+cond_syscall(compat_sys_mq_timedsend)
+cond_syscall(compat_sys_mq_timedreceive)
+cond_syscall(compat_sys_mq_notify)
+cond_syscall(compat_sys_mq_getsetattr)
 
 /* arch-specific weak syscall entries */
 cond_syscall(sys_pciconfig_read)
@@ -436,7 +447,7 @@ asmlinkage long sys_reboot(int magic1, i
 	switch (cmd) {
 	case LINUX_REBOOT_CMD_RESTART:
 		notifier_call_chain(&reboot_notifier_list, SYS_RESTART, NULL);
-		system_running = 0;
+		system_state = SYSTEM_SHUTDOWN;
 		device_shutdown();
 		printk(KERN_EMERG "Restarting system.\n");
 		machine_restart(NULL);
@@ -452,7 +463,7 @@ asmlinkage long sys_reboot(int magic1, i
 
 	case LINUX_REBOOT_CMD_HALT:
 		notifier_call_chain(&reboot_notifier_list, SYS_HALT, NULL);
-		system_running = 0;
+		system_state = SYSTEM_SHUTDOWN;
 		device_shutdown();
 		printk(KERN_EMERG "System halted.\n");
 		machine_halt();
@@ -462,7 +473,7 @@ asmlinkage long sys_reboot(int magic1, i
 
 	case LINUX_REBOOT_CMD_POWER_OFF:
 		notifier_call_chain(&reboot_notifier_list, SYS_POWER_OFF, NULL);
-		system_running = 0;
+		system_state = SYSTEM_SHUTDOWN;
 		device_shutdown();
 		printk(KERN_EMERG "Power down.\n");
 		machine_power_off();
@@ -478,7 +489,7 @@ asmlinkage long sys_reboot(int magic1, i
 		buffer[sizeof(buffer) - 1] = '\0';
 
 		notifier_call_chain(&reboot_notifier_list, SYS_RESTART, buffer);
-		system_running = 0;
+		system_state = SYSTEM_SHUTDOWN;
 		device_shutdown();
 		printk(KERN_EMERG "Restarting system with command '%s'.\n", buffer);
 		machine_restart(buffer);
@@ -979,7 +990,7 @@ asmlinkage long sys_setpgid(pid_t pid, p
 
 	if (p->parent == current || p->real_parent == current) {
 		err = -EPERM;
-		if (p->session != current->session)
+		if (p->signal->session != current->signal->session)
 			goto out;
 		err = -EACCES;
 		if (p->did_exec)
@@ -991,7 +1002,7 @@ asmlinkage long sys_setpgid(pid_t pid, p
 	}
 
 	err = -EPERM;
-	if (p->leader)
+	if (p->signal->leader)
 		goto out;
 
 	if (pgid != pid) {
@@ -1000,7 +1011,7 @@ asmlinkage long sys_setpgid(pid_t pid, p
 		struct list_head *l;
 
 		for_each_task_pid(pgid, PIDTYPE_PGID, p, l, pid)
-			if (p->session == current->session)
+			if (p->signal->session == current->signal->session)
 				goto ok_pgid;
 		goto out;
 	}
@@ -1012,7 +1023,7 @@ ok_pgid:
 
 	if (process_group(p) != pgid) {
 		detach_pid(p, PIDTYPE_PGID);
-		p->group_leader->__pgrp = pgid;
+		p->signal->pgrp = pgid;
 		attach_pid(p, PIDTYPE_PGID, pgid);
 	}
 
@@ -1054,7 +1065,7 @@ asmlinkage long sys_getpgrp(void)
 asmlinkage long sys_getsid(pid_t pid)
 {
 	if (!pid) {
-		return current->session;
+		return current->signal->session;
 	} else {
 		int retval;
 		struct task_struct *p;
@@ -1066,7 +1077,7 @@ asmlinkage long sys_getsid(pid_t pid)
 		if(p) {
 			retval = security_task_getsid(p);
 			if (!retval)
-				retval = p->session;
+				retval = p->signal->session;
 		}
 		read_unlock(&tasklist_lock);
 		return retval;
@@ -1087,10 +1098,10 @@ asmlinkage long sys_setsid(void)
 	if (pid)
 		goto out;
 
-	current->leader = 1;
+	current->signal->leader = 1;
 	__set_special_pids(current->pid, current->pid);
-	current->tty = NULL;
-	current->tty_old_pgrp = 0;
+	current->signal->tty = NULL;
+	current->signal->tty_old_pgrp = 0;
 	err = process_group(current);
 out:
 	write_unlock_irq(&tasklist_lock);
@@ -1521,7 +1532,6 @@ int getrusage(struct task_struct *p, int
 			r.ru_nivcsw = p->nivcsw;
 			r.ru_minflt = p->min_flt;
 			r.ru_majflt = p->maj_flt;
-			r.ru_nswap = p->nswap;
 			break;
 		case RUSAGE_CHILDREN:
 			jiffies_to_timeval(p->cutime, &r.ru_utime);
@@ -1530,7 +1540,6 @@ int getrusage(struct task_struct *p, int
 			r.ru_nivcsw = p->cnivcsw;
 			r.ru_minflt = p->cmin_flt;
 			r.ru_majflt = p->cmaj_flt;
-			r.ru_nswap = p->cnswap;
 			break;
 		default:
 			jiffies_to_timeval(p->utime + p->cutime, &r.ru_utime);
@@ -1539,7 +1548,6 @@ int getrusage(struct task_struct *p, int
 			r.ru_nivcsw = p->nivcsw + p->cnivcsw;
 			r.ru_minflt = p->min_flt + p->cmin_flt;
 			r.ru_majflt = p->maj_flt + p->cmaj_flt;
-			r.ru_nswap = p->nswap + p->cnswap;
 			break;
 	}
 	return copy_to_user(ru, &r, sizeof(r)) ? -EFAULT : 0;
--- diff/kernel/sysctl.c	2004-04-05 12:57:08.000000000 +0100
+++ source/kernel/sysctl.c	2004-04-21 10:45:36.015228352 +0100
@@ -93,6 +93,7 @@ extern int sem_ctls[];
 #ifdef __sparc__
 extern char reboot_command [];
 extern int stop_a_enabled;
+extern int scons_pwroff;
 #endif
 
 #ifdef __hppa__
@@ -325,6 +326,14 @@ static ctl_table kern_table[] = {
 		.mode		= 0644,
 		.proc_handler	= &proc_dointvec,
 	},
+	{
+		.ctl_name	= KERN_SPARC_SCONS_PWROFF,
+		.procname	= "scons-poweroff",
+		.data		= &scons_pwroff,
+		.maxlen		= sizeof (int),
+		.mode		= 0644,
+		.proc_handler	= &proc_dointvec,
+	},
 #endif
 #ifdef __hppa__
 	{
@@ -710,10 +719,12 @@ static ctl_table vm_table[] = {
 	 {
 		.ctl_name	= VM_HUGETLB_PAGES,
 		.procname	= "nr_hugepages",
-		.data		= &htlbpage_max,
-		.maxlen		= sizeof(int),
+		.data		= &max_huge_pages,
+		.maxlen		= sizeof(unsigned long),
 		.mode		= 0644,
 		.proc_handler	= &hugetlb_sysctl_handler,
+		.extra1		= (void *)&hugetlb_zero,
+		.extra2		= (void *)&hugetlb_infinity,
 	 },
 #endif
 	{
@@ -722,7 +733,7 @@ static ctl_table vm_table[] = {
 		.data		= &sysctl_lower_zone_protection,
 		.maxlen		= sizeof(sysctl_lower_zone_protection),
 		.mode		= 0644,
-		.proc_handler	= &proc_dointvec_minmax,
+		.proc_handler	= &lower_zone_protection_sysctl_handler,
 		.strategy	= &sysctl_intvec,
 		.extra1		= &zero,
 	},
@@ -744,6 +755,26 @@ static ctl_table vm_table[] = {
 		.mode		= 0644,
 		.proc_handler	= &proc_dointvec
 	},
+	{
+		.ctl_name	= VM_LAPTOP_MODE,
+		.procname	= "laptop_mode",
+		.data		= &laptop_mode,
+		.maxlen		= sizeof(laptop_mode),
+		.mode		= 0644,
+		.proc_handler	= &proc_dointvec,
+		.strategy	= &sysctl_intvec,
+		.extra1		= &zero,
+	},
+	{
+		.ctl_name	= VM_BLOCK_DUMP,
+		.procname	= "block_dump",
+		.data		= &block_dump,
+		.maxlen		= sizeof(block_dump),
+		.mode		= 0644,
+		.proc_handler	= &proc_dointvec,
+		.strategy	= &sysctl_intvec,
+		.extra1		= &zero,
+	},
 	{ .ctl_name = 0 }
 };
 
--- diff/kernel/time.c	2003-10-27 09:20:44.000000000 +0000
+++ source/kernel/time.c	2004-04-21 10:45:36.015228352 +0100
@@ -51,10 +51,11 @@ EXPORT_SYMBOL(sys_tz);
 asmlinkage long sys_time(int * tloc)
 {
 	int i;
+	struct timeval tv;
+
+	do_gettimeofday(&tv);
+	i = tv.tv_sec;
 
-	/* SMP: This is fairly trivial. We grab CURRENT_TIME and 
-	   stuff it to user space. No side effects */
-	i = get_seconds();
 	if (tloc) {
 		if (put_user(i,tloc))
 			i = -EFAULT;
--- diff/kernel/timer.c	2004-04-05 12:57:08.000000000 +0100
+++ source/kernel/timer.c	2004-04-21 10:45:36.016228200 +0100
@@ -996,7 +996,7 @@ static void process_timeout(unsigned lon
  *
  * In all cases the return value is guaranteed to be non-negative.
  */
-fastcall signed long schedule_timeout(signed long timeout)
+fastcall signed long __sched schedule_timeout(signed long timeout)
 {
 	struct timer_list timer;
 	unsigned long expire;
@@ -1056,7 +1056,7 @@ asmlinkage long sys_gettid(void)
 	return current->pid;
 }
 
-static long nanosleep_restart(struct restart_block *restart)
+static long __sched nanosleep_restart(struct restart_block *restart)
 {
 	unsigned long expire = restart->arg0, now = jiffies;
 	struct timespec __user *rmtp = (struct timespec __user *) restart->arg1;
--- diff/kernel/workqueue.c	2004-04-05 12:57:08.000000000 +0100
+++ source/kernel/workqueue.c	2004-04-21 10:45:36.016228200 +0100
@@ -181,7 +181,7 @@ static int worker_thread(void *__cwq)
 	struct k_sigaction sa;
 	sigset_t blocked;
 
-	current->flags |= PF_IOTHREAD;
+	current->flags |= PF_NOFREEZE;
 
 	set_user_nice(current, -10);
 
--- diff/lib/bitmap.c	2004-04-05 12:57:08.000000000 +0100
+++ source/lib/bitmap.c	2004-04-21 10:45:36.017228048 +0100
@@ -12,8 +12,6 @@
 #include <asm/bitops.h>
 #include <asm/uaccess.h>
 
-#define MAX_BITMAP_BITS	512U	/* for ia64 NR_CPUS maximum */
-
 int bitmap_empty(const unsigned long *bitmap, int bits)
 {
 	int k, lim = bits/BITS_PER_LONG;
@@ -71,33 +69,85 @@ void bitmap_complement(unsigned long *bi
 }
 EXPORT_SYMBOL(bitmap_complement);
 
+/*
+ * bitmap_shift_right - logical right shift of the bits in a bitmap
+ *   @dst - destination bitmap
+ *   @src - source bitmap
+ *   @nbits - shift by this many bits
+ *   @bits - bitmap size, in bits
+ *
+ * Shifting right (dividing) means moving bits in the MS -> LS bit
+ * direction.  Zeros are fed into the vacated MS positions and the
+ * LS bits shifted off the bottom are lost.
+ */
 void bitmap_shift_right(unsigned long *dst,
 			const unsigned long *src, int shift, int bits)
 {
-	int k;
-	DECLARE_BITMAP(__shr_tmp, MAX_BITMAP_BITS);
-
-	BUG_ON(bits > MAX_BITMAP_BITS);
-	bitmap_clear(__shr_tmp, bits);
-	for (k = 0; k < bits - shift; ++k)
-		if (test_bit(k + shift, src))
-			set_bit(k, __shr_tmp);
-	bitmap_copy(dst, __shr_tmp, bits);
+	int k, lim = BITS_TO_LONGS(bits), left = bits % BITS_PER_LONG;
+	int off = shift/BITS_PER_LONG, rem = shift % BITS_PER_LONG;
+	unsigned long mask = (1UL << left) - 1;
+	for (k = 0; off + k < lim; ++k) {
+		unsigned long upper, lower;
+
+		/*
+		 * If shift is not word aligned, take lower rem bits of
+		 * word above and make them the top rem bits of result.
+		 */
+		if (!rem || off + k + 1 >= lim)
+			upper = 0;
+		else {
+			upper = src[off + k + 1];
+			if (off + k + 1 == lim - 1 && left)
+				upper &= mask;
+		}
+		lower = src[off + k];
+		if (left && off + k == lim - 1)
+			lower &= mask;
+		dst[k] = upper << (BITS_PER_LONG - rem) | lower >> rem;
+		if (left && k == lim - 1)
+			dst[k] &= mask;
+	}
+	if (off)
+		memset(&dst[lim - off], 0, off*sizeof(unsigned long));
 }
 EXPORT_SYMBOL(bitmap_shift_right);
 
+/*
+ * bitmap_shift_left - logical left shift of the bits in a bitmap
+ *   @dst - destination bitmap
+ *   @src - source bitmap
+ *   @nbits - shift by this many bits
+ *   @bits - bitmap size, in bits
+ *
+ * Shifting left (multiplying) means moving bits in the LS -> MS
+ * direction.  Zeros are fed into the vacated LS bit positions
+ * and those MS bits shifted off the top are lost.
+ */
 void bitmap_shift_left(unsigned long *dst,
 			const unsigned long *src, int shift, int bits)
 {
-	int k;
-	DECLARE_BITMAP(__shl_tmp, MAX_BITMAP_BITS);
-
-	BUG_ON(bits > MAX_BITMAP_BITS);
-	bitmap_clear(__shl_tmp, bits);
-	for (k = bits; k >= shift; --k)
-		if (test_bit(k - shift, src))
-			set_bit(k, __shl_tmp);
-	bitmap_copy(dst, __shl_tmp, bits);
+	int k, lim = BITS_TO_LONGS(bits), left = bits % BITS_PER_LONG;
+	int off = shift/BITS_PER_LONG, rem = shift % BITS_PER_LONG;
+	for (k = lim - off - 1; k >= 0; --k) {
+		unsigned long upper, lower;
+
+		/*
+		 * If shift is not word aligned, take upper rem bits of
+		 * word below and make them the bottom rem bits of result.
+		 */
+		if (rem && k > 0)
+			lower = src[k - 1];
+		else
+			lower = 0;
+		upper = src[k];
+		if (left && k == lim - 1)
+			upper &= (1UL << left) - 1;
+		dst[k + off] = lower  >> (BITS_PER_LONG - rem) | upper << rem;
+		if (left && k + off == lim - 1)
+			dst[k + off] &= (1UL << left) - 1;
+	}
+	if (off)
+		memset(dst, 0, off*sizeof(unsigned long));
 }
 EXPORT_SYMBOL(bitmap_shift_left);
 
@@ -223,7 +273,7 @@ int bitmap_parse(const char __user *ubuf
 	int c, old_c, totaldigits, ndigits, nchunks, nbits;
 	u32 chunk;
 
-	bitmap_clear(maskp, nmaskbits);
+	bitmap_zero(maskp, nmaskbits);
 
 	nchunks = nbits = totaldigits = c = 0;
 	do {
@@ -269,7 +319,7 @@ int bitmap_parse(const char __user *ubuf
 		if (nchunks == 0 && chunk == 0)
 			continue;
 
-		bitmap_shift_right(maskp, maskp, CHUNKSZ, nmaskbits);
+		bitmap_shift_left(maskp, maskp, CHUNKSZ, nmaskbits);
 		*maskp |= chunk;
 		nchunks++;
 		nbits += (nchunks == 1) ? nbits_to_hold_value(chunk) : CHUNKSZ;
--- diff/lib/idr.c	2004-03-11 10:20:29.000000000 +0000
+++ source/lib/idr.c	2004-04-21 10:45:36.017228048 +0100
@@ -109,7 +109,7 @@ static kmem_cache_t *idr_layer_cache;
 
 
 
-static inline struct idr_layer *alloc_layer(struct idr *idp)
+static struct idr_layer *alloc_layer(struct idr *idp)
 {
 	struct idr_layer *p;
 
@@ -123,7 +123,7 @@ static inline struct idr_layer *alloc_la
 	return(p);
 }
 
-static inline void free_layer(struct idr *idp, struct idr_layer *p)
+static void free_layer(struct idr *idp, struct idr_layer *p)
 {
 	/*
 	 * Depends on the return element being zeroed.
@@ -137,7 +137,7 @@ static inline void free_layer(struct idr
 
 int idr_pre_get(struct idr *idp, unsigned gfp_mask)
 {
-	while (idp->id_free_cnt < idp->layers + 1) {
+	while (idp->id_free_cnt < IDR_FREE_MAX) {
 		struct idr_layer *new;
 		new = kmem_cache_alloc(idr_layer_cache, gfp_mask);
 		if(new == NULL)
@@ -148,91 +148,125 @@ int idr_pre_get(struct idr *idp, unsigne
 }
 EXPORT_SYMBOL(idr_pre_get);
 
-static inline int sub_alloc(struct idr *idp, int shift, void *ptr)
+static int sub_alloc(struct idr *idp, void *ptr, int *starting_id)
 {
-	int n, v = 0;
-	struct idr_layer *p;
-	struct idr_layer **pa[MAX_LEVEL];
-	struct idr_layer ***paa = &pa[0];
-	
-	*paa = NULL;
-	*++paa = &idp->top;
+	int n, m, sh;
+	struct idr_layer *p, *new;
+	struct idr_layer *pa[MAX_LEVEL];
+	int l, id;
+	long bm;
 
-	/*
-	 * By keeping each pointer in an array we can do the 
-	 * "after" recursion processing.  In this case, that means
-	 * we can update the upper level bit map.
-	 */
-	
-	while (1){
-		p = **paa;
-		n = ffz(p->bitmap);
-		if (shift){
-			/*
-			 * We run around this while until we
-			 * reach the leaf node...
-			 */
-			if (!p->ary[n]){
-				/*
-				 * If no node, allocate one, AFTER
-				 * we insure that we will not
-				 * intrude on the reserved bit field.
-				 */
-				if ((n << shift) >= MAX_ID_BIT)
-					return -1;
-				p->ary[n] = alloc_layer(idp);
-				p->count++;
+	id = *starting_id;
+	p = idp->top;
+	l = idp->layers;
+	pa[l--] = NULL;
+	while (1) {
+		/*
+		 * We run around this while until we reach the leaf node...
+		 */
+		n = (id >> (IDR_BITS*l)) & IDR_MASK;
+		bm = ~p->bitmap;
+		m = find_next_bit(&bm, IDR_SIZE, n);
+		if (m == IDR_SIZE) {
+			/* no space available go back to previous layer. */
+			l++;
+			id = (id | ((1 << (IDR_BITS*l))-1)) + 1;
+			if (!(p = pa[l])) {
+				*starting_id = id;
+				return -2;
 			}
-			*++paa = &p->ary[n];
-			v += (n << shift);
-			shift -= IDR_BITS;
-		} else {
-			/*
-			 * We have reached the leaf node, plant the
-			 * users pointer and return the raw id.
-			 */
-			p->ary[n] = (struct idr_layer *)ptr;
-			__set_bit(n, &p->bitmap);
-			v += n;
+			continue;
+		}
+		if (m != n) {
+			sh = IDR_BITS*l;
+			id = ((id >> sh) ^ n ^ m) << sh;
+		}
+		if (id >= MAX_ID_BIT)
+			return -1;
+		if (l == 0)
+			break;
+		/*
+		 * Create the layer below if it is missing.
+		 */
+		if (!p->ary[m]) {
+			if (!(new = alloc_layer(idp)))
+				return -1;
+			p->ary[m] = new;
 			p->count++;
-			/*
-			 * This is the post recursion processing.  Once
-			 * we find a bitmap that is not full we are
-			 * done
-			 */
-			while (*(paa-1) && (**paa)->bitmap == IDR_FULL){
-				n = *paa - &(**(paa-1))->ary[0];
-				__set_bit(n, &(**--paa)->bitmap);
-			}
-			return(v);
 		}
+		pa[l--] = p;
+		p = p->ary[m];
+	}
+	/*
+	 * We have reached the leaf node, plant the
+	 * users pointer and return the raw id.
+	 */
+	p->ary[m] = (struct idr_layer *)ptr;
+	__set_bit(m, &p->bitmap);
+	p->count++;
+	/*
+	 * If this layer is full mark the bit in the layer above
+	 * to show that this part of the radix tree is full.
+	 * This may complete the layer above and require walking
+	 * up the radix tree.
+	 */
+	n = id;
+	while (p->bitmap == IDR_FULL) {
+		if (!(p = pa[++l]))
+			break;
+		n = n >> IDR_BITS;
+		__set_bit((n & IDR_MASK), &p->bitmap);
 	}
+	return(id);
 }
 
-int idr_get_new(struct idr *idp, void *ptr)
+int idr_get_new_above(struct idr *idp, void *ptr, int starting_id)
 {
-	int v;
+	struct idr_layer *p, *new;
+	int layers, v, id;
 	
-	if (idp->id_free_cnt < idp->layers + 1) 
-		return (-1);
+	id = starting_id;
+build_up:
+	p = idp->top;
+	layers = idp->layers;
+	if (unlikely(!p)) {
+		if (!(p = alloc_layer(idp)))
+			return -1;
+		layers = 1;
+	}
 	/*
-	 * Add a new layer if the array is full 
+	 * Add a new layer to the top of the tree if the requested
+	 * id is larger than the currently allocated space.
 	 */
-	if (unlikely(!idp->top || idp->top->bitmap == IDR_FULL)){
-		/*
-		 * This is a bit different than the lower layers because
-		 * we have one branch already allocated and full.
-		 */
-		struct idr_layer *new = alloc_layer(idp);
-		new->ary[0] = idp->top;
-		if ( idp->top)
-			++new->count;
-		idp->top = new;
-		if ( idp->layers++ )
+	while (id >= (1 << (layers*IDR_BITS))) {
+		layers++;
+		if (!p->count)
+			continue;
+		if (!(new = alloc_layer(idp))) {
+			/*
+			 * The allocation failed.  If we built part of
+			 * the structure tear it down.
+			 */
+			for (new = p; p && p != idp->top; new = p) {
+				p = p->ary[0];
+				new->ary[0] = 0;
+				new->bitmap = new->count = 0;
+				free_layer(idp, new);
+			}
+			return -1;
+		}
+		new->ary[0] = p;
+		new->count = 1;
+		if (p->bitmap == IDR_FULL)
 			__set_bit(0, &new->bitmap);
+		p = new;
 	}
-	v = sub_alloc(idp,  (idp->layers - 1) * IDR_BITS, ptr);
-	if ( likely(v >= 0 )){
+	idp->top = p;
+	idp->layers = layers;
+	v = sub_alloc(idp, ptr, &id);
+	if (v == -2)
+		goto build_up;
+	if ( likely(v >= 0 )) {
 		idp->count++;
 		v += (idp->count << MAX_ID_SHIFT);
 		if ( unlikely( v == -1 ))
@@ -240,10 +274,16 @@ int idr_get_new(struct idr *idp, void *p
 	}
 	return(v);
 }
+EXPORT_SYMBOL(idr_get_new_above);
+
+int idr_get_new(struct idr *idp, void *ptr)
+{
+	return idr_get_new_above(idp, ptr, 0);
+}
 EXPORT_SYMBOL(idr_get_new);
 
 
-static inline void sub_remove(struct idr *idp, int shift, int id)
+static void sub_remove(struct idr *idp, int shift, int id)
 {
 	struct idr_layer *p = idp->top;
 	struct idr_layer **pa[MAX_LEVEL];
--- diff/lib/kobject.c	2004-03-11 10:20:29.000000000 +0000
+++ source/lib/kobject.c	2004-04-21 10:45:36.018227896 +0100
@@ -349,16 +349,16 @@ int kobject_set_name(struct kobject * ko
 		/* 
 		 * Need more space? Allocate it and try again 
 		 */
-		name = kmalloc(need,GFP_KERNEL);
+		limit = need + 1;
+		name = kmalloc(limit,GFP_KERNEL);
 		if (!name) {
 			error = -ENOMEM;
 			goto Done;
 		}
-		limit = need;
 		need = vsnprintf(name,limit,fmt,args);
 
 		/* Still? Give up. */
-		if (need > limit) {
+		if (need >= limit) {
 			kfree(name);
 			error = -EFAULT;
 			goto Done;
--- diff/lib/radix-tree.c	2004-04-05 12:57:08.000000000 +0100
+++ source/lib/radix-tree.c	2004-04-21 10:45:36.019227744 +0100
@@ -6,12 +6,12 @@
  * modify it under the terms of the GNU General Public License as
  * published by the Free Software Foundation; either version 2, or (at
  * your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
@@ -28,21 +28,31 @@
 #include <linux/cpu.h>
 #include <linux/gfp.h>
 #include <linux/string.h>
+#include <linux/bitops.h>
 
-/*
- * Radix tree node definition.
- */
-#define RADIX_TREE_MAP_SHIFT  6
-#define RADIX_TREE_MAP_SIZE  (1UL << RADIX_TREE_MAP_SHIFT)
-#define RADIX_TREE_MAP_MASK  (RADIX_TREE_MAP_SIZE-1)
+
+#ifdef __KERNEL__
+#define RADIX_TREE_MAP_SHIFT	6
+#else
+#define RADIX_TREE_MAP_SHIFT	3	/* For more stressful testing */
+#endif
+#define RADIX_TREE_TAGS		2
+
+#define RADIX_TREE_MAP_SIZE	(1UL << RADIX_TREE_MAP_SHIFT)
+#define RADIX_TREE_MAP_MASK	(RADIX_TREE_MAP_SIZE-1)
+
+#define RADIX_TREE_TAG_LONGS	\
+	((RADIX_TREE_MAP_SIZE + BITS_PER_LONG - 1) / BITS_PER_LONG)
 
 struct radix_tree_node {
 	unsigned int	count;
 	void		*slots[RADIX_TREE_MAP_SIZE];
+	unsigned long	tags[RADIX_TREE_TAGS][RADIX_TREE_TAG_LONGS];
 };
 
 struct radix_tree_path {
 	struct radix_tree_node *node, **slot;
+	int offset;
 };
 
 #define RADIX_TREE_INDEX_BITS  (8 /* CHAR_BIT */ * sizeof(unsigned long))
@@ -124,6 +134,22 @@ out:
 	return ret;
 }
 
+static inline void tag_set(struct radix_tree_node *node, int tag, int offset)
+{
+	if (!test_bit(offset, &node->tags[tag][0]))
+		__set_bit(offset, &node->tags[tag][0]);
+}
+
+static inline void tag_clear(struct radix_tree_node *node, int tag, int offset)
+{
+	__clear_bit(offset, &node->tags[tag][0]);
+}
+
+static inline int tag_get(struct radix_tree_node *node, int tag, int offset)
+{
+	return test_bit(offset, &node->tags[tag][0]);
+}
+
 /*
  *	Return the maximum key which can be store into a
  *	radix tree with height HEIGHT.
@@ -140,26 +166,53 @@ static int radix_tree_extend(struct radi
 {
 	struct radix_tree_node *node;
 	unsigned int height;
+	char tags[RADIX_TREE_TAGS];
+	int tag;
 
 	/* Figure out what the height should be.  */
 	height = root->height + 1;
 	while (index > radix_tree_maxindex(height))
 		height++;
 
-	if (root->rnode) {
-		do {
-			if (!(node = radix_tree_node_alloc(root)))
-				return -ENOMEM;
-
-			/* Increase the height.  */
-			node->slots[0] = root->rnode;
-			node->count = 1;
-			root->rnode = node;
-			root->height++;
-		} while (height > root->height);
-	} else 
+	if (root->rnode == NULL) {
 		root->height = height;
+		goto out;
+	}
+
+	/*
+	 * Prepare the tag status of the top-level node for propagation
+	 * into the newly-pushed top-level node(s)
+	 */
+	for (tag = 0; tag < RADIX_TREE_TAGS; tag++) {
+		int idx;
+
+		tags[tag] = 0;
+		for (idx = 0; idx < RADIX_TREE_TAG_LONGS; idx++) {
+			if (root->rnode->tags[tag][idx]) {
+				tags[tag] = 1;
+				break;
+			}
+		}
+	}
 
+	do {
+		if (!(node = radix_tree_node_alloc(root)))
+			return -ENOMEM;
+
+		/* Increase the height.  */
+		node->slots[0] = root->rnode;
+
+		/* Propagate the aggregated tag info into the new root */
+		for (tag = 0; tag < RADIX_TREE_TAGS; tag++) {
+			if (tags[tag])
+				tag_set(node, tag, 0);
+		}
+
+		node->count = 1;
+		root->rnode = node;
+		root->height++;
+	} while (height > root->height);
+out:
 	return 0;
 }
 
@@ -171,23 +224,27 @@ static int radix_tree_extend(struct radi
  *
  *	Insert an item into the radix tree at position @index.
  */
-int radix_tree_insert(struct radix_tree_root *root, unsigned long index, void *item)
+int radix_tree_insert(struct radix_tree_root *root,
+			unsigned long index, void *item)
 {
 	struct radix_tree_node *node = NULL, *tmp, **slot;
 	unsigned int height, shift;
+	int offset;
 	int error;
 
 	/* Make sure the tree is high enough.  */
-	if (index > radix_tree_maxindex(root->height)) {
+	if ((!index && !root->rnode) ||
+			index > radix_tree_maxindex(root->height)) {
 		error = radix_tree_extend(root, index);
 		if (error)
 			return error;
 	}
-    
+
 	slot = &root->rnode;
 	height = root->height;
 	shift = (height-1) * RADIX_TREE_MAP_SHIFT;
 
+	offset = 0;			/* uninitialised var warning */
 	while (height > 0) {
 		if (*slot == NULL) {
 			/* Have to add a child node.  */
@@ -198,18 +255,21 @@ int radix_tree_insert(struct radix_tree_
 				node->count++;
 		}
 
-		/* Go a level down.  */
+		/* Go a level down */
+		offset = (index >> shift) & RADIX_TREE_MAP_MASK;
 		node = *slot;
-		slot = (struct radix_tree_node **)
-			(node->slots + ((index >> shift) & RADIX_TREE_MAP_MASK));
+		slot = (struct radix_tree_node **)(node->slots + offset);
 		shift -= RADIX_TREE_MAP_SHIFT;
 		height--;
 	}
 
 	if (*slot != NULL)
 		return -EEXIST;
-	if (node)
+	if (node) {
 		node->count++;
+		BUG_ON(tag_get(node, 0, offset));
+		BUG_ON(tag_get(node, 1, offset));
+	}
 
 	*slot = item;
 	return 0;
@@ -221,7 +281,7 @@ EXPORT_SYMBOL(radix_tree_insert);
  *	@root:		radix tree root
  *	@index:		index key
  *
- *	Lookup them item at the position @index in the radix tree @root.
+ *	Lookup the item at the position @index in the radix tree @root.
  */
 void *radix_tree_lookup(struct radix_tree_root *root, unsigned long index)
 {
@@ -240,16 +300,174 @@ void *radix_tree_lookup(struct radix_tre
 			return NULL;
 
 		slot = (struct radix_tree_node **)
-			((*slot)->slots + ((index >> shift) & RADIX_TREE_MAP_MASK));
+			((*slot)->slots +
+				((index >> shift) & RADIX_TREE_MAP_MASK));
 		shift -= RADIX_TREE_MAP_SHIFT;
 		height--;
 	}
 
-	return (void *) *slot;
+	return *slot;
 }
 EXPORT_SYMBOL(radix_tree_lookup);
 
-static /* inline */ unsigned int
+/**
+ *	radix_tree_tag_set - set a tag on a radix tree node
+ *	@root:		radix tree root
+ *	@index:		index key
+ *	@tag: 		tag index
+ *
+ *	Set the search tag corresponging to @index in the radix tree.  From
+ *	the root all the way down to the leaf node.
+ *
+ *	Returns the address of the tagged item.   Setting a tag on a not-present
+ *	item is a bug.
+ */
+void *radix_tree_tag_set(struct radix_tree_root *root,
+			unsigned long index, int tag)
+{
+	unsigned int height, shift;
+	struct radix_tree_node **slot;
+
+	height = root->height;
+	if (index > radix_tree_maxindex(height))
+		return NULL;
+
+	shift = (height - 1) * RADIX_TREE_MAP_SHIFT;
+	slot = &root->rnode;
+
+	while (height > 0) {
+		int offset;
+
+		offset = (index >> shift) & RADIX_TREE_MAP_MASK;
+		tag_set(*slot, tag, offset);
+		slot = (struct radix_tree_node **)((*slot)->slots + offset);
+		BUG_ON(*slot == NULL);
+		shift -= RADIX_TREE_MAP_SHIFT;
+		height--;
+	}
+
+	return *slot;
+}
+EXPORT_SYMBOL(radix_tree_tag_set);
+
+/**
+ *	radix_tree_tag_clear - clear a tag on a radix tree node
+ *	@root:		radix tree root
+ *	@index:		index key
+ *	@tag: 		tag index
+ *
+ *	Clear the search tag corresponging to @index in the radix tree.  If
+ *	this causes the leaf node to have no tags set then clear the tag in the
+ *	next-to-leaf node, etc.
+ *
+ *	Returns the address of the tagged item on success, else NULL.  ie:
+ *	has the same return value and semantics as radix_tree_lookup().
+ */
+void *radix_tree_tag_clear(struct radix_tree_root *root,
+			unsigned long index, int tag)
+{
+	struct radix_tree_path path[RADIX_TREE_MAX_PATH], *pathp = path;
+	unsigned int height, shift;
+	void *ret = NULL;
+
+	height = root->height;
+	if (index > radix_tree_maxindex(height))
+		goto out;
+
+	shift = (height - 1) * RADIX_TREE_MAP_SHIFT;
+	pathp->node = NULL;
+	pathp->slot = &root->rnode;
+
+	while (height > 0) {
+		int offset;
+
+		if (*pathp->slot == NULL)
+			goto out;
+
+		offset = (index >> shift) & RADIX_TREE_MAP_MASK;
+		pathp[1].offset = offset;
+		pathp[1].node = *pathp[0].slot;
+		pathp[1].slot = (struct radix_tree_node **)
+				(pathp[1].node->slots + offset);
+		pathp++;
+		shift -= RADIX_TREE_MAP_SHIFT;
+		height--;
+	}
+
+	ret = *pathp[0].slot;
+	if (ret == NULL)
+		goto out;
+
+	do {
+		int idx;
+
+		tag_clear(pathp[0].node, tag, pathp[0].offset);
+		for (idx = 0; idx < RADIX_TREE_TAG_LONGS; idx++) {
+			if (pathp[0].node->tags[tag][idx])
+				goto out;
+		}
+		pathp--;
+	} while (pathp[0].node);
+out:
+	return ret;
+}
+EXPORT_SYMBOL(radix_tree_tag_clear);
+
+#ifndef __KERNEL__	/* Only the test harness uses this at present */
+/**
+ *	radix_tree_tag_get - get a tag on a radix tree node
+ *	@root:		radix tree root
+ *	@index:		index key
+ *	@tag: 		tag index
+ *
+ *	Return the search tag corresponging to @index in the radix tree.
+ *
+ *	Returns zero if the tag is unset, or if there is no corresponding item
+ *	in the tree.
+ */
+int radix_tree_tag_get(struct radix_tree_root *root,
+			unsigned long index, int tag)
+{
+	unsigned int height, shift;
+	struct radix_tree_node **slot;
+	int saw_unset_tag = 0;
+
+	height = root->height;
+	if (index > radix_tree_maxindex(height))
+		return 0;
+
+	shift = (height - 1) * RADIX_TREE_MAP_SHIFT;
+	slot = &root->rnode;
+
+	for ( ; ; ) {
+		int offset;
+
+		if (*slot == NULL)
+			return 0;
+
+		offset = (index >> shift) & RADIX_TREE_MAP_MASK;
+
+		/*
+		 * This is just a debug check.  Later, we can bale as soon as
+		 * we see an unset tag.
+		 */
+		if (!tag_get(*slot, tag, offset))
+			saw_unset_tag = 1;
+		if (height == 1) {
+			int ret = tag_get(*slot, tag, offset);
+
+			BUG_ON(ret && saw_unset_tag);
+			return ret;
+		}
+		slot = (struct radix_tree_node **)((*slot)->slots + offset);
+		shift -= RADIX_TREE_MAP_SHIFT;
+		height--;
+	}
+}
+EXPORT_SYMBOL(radix_tree_tag_get);
+#endif
+
+static unsigned int
 __lookup(struct radix_tree_root *root, void **results, unsigned long index,
 	unsigned int max_items, unsigned long *next_index)
 {
@@ -316,17 +534,6 @@ radix_tree_gang_lookup(struct radix_tree
 	unsigned long cur_index = first_index;
 	unsigned int ret = 0;
 
-	if (root->rnode == NULL)
-		goto out;
-	if (max_index == 0) {			/* Bah.  Special case */
-		if (first_index == 0) {
-			if (max_items > 0) {
-				*results = root->rnode;
-				ret = 1;
-			}
-		}
-		goto out;
-	}
 	while (ret < max_items) {
 		unsigned int nr_found;
 		unsigned long next_index;	/* Index of next search */
@@ -340,11 +547,101 @@ radix_tree_gang_lookup(struct radix_tree
 			break;
 		cur_index = next_index;
 	}
-out:
 	return ret;
 }
 EXPORT_SYMBOL(radix_tree_gang_lookup);
 
+/*
+ * FIXME: the two tag_get()s here should use find_next_bit() instead of
+ * open-coding the search.
+ */
+static unsigned int
+__lookup_tag(struct radix_tree_root *root, void **results, unsigned long index,
+	unsigned int max_items, unsigned long *next_index, int tag)
+{
+	unsigned int nr_found = 0;
+	unsigned int shift;
+	unsigned int height = root->height;
+	struct radix_tree_node *slot;
+
+	shift = (height - 1) * RADIX_TREE_MAP_SHIFT;
+	slot = root->rnode;
+
+	while (height > 0) {
+		unsigned long i = (index >> shift) & RADIX_TREE_MAP_MASK;
+
+		for ( ; i < RADIX_TREE_MAP_SIZE; i++) {
+			if (tag_get(slot, tag, i)) {
+				BUG_ON(slot->slots[i] == NULL);
+				break;
+			}
+			index &= ~((1 << shift) - 1);
+			index += 1 << shift;
+			if (index == 0)
+				goto out;	/* 32-bit wraparound */
+		}
+		if (i == RADIX_TREE_MAP_SIZE)
+			goto out;
+		height--;
+		if (height == 0) {	/* Bottom level: grab some items */
+			unsigned long j = index & RADIX_TREE_MAP_MASK;
+
+			for ( ; j < RADIX_TREE_MAP_SIZE; j++) {
+				index++;
+				if (tag_get(slot, tag, j)) {
+					BUG_ON(slot->slots[j] == NULL);
+					results[nr_found++] = slot->slots[j];
+					if (nr_found == max_items)
+						goto out;
+				}
+			}
+		}
+		shift -= RADIX_TREE_MAP_SHIFT;
+		slot = slot->slots[i];
+	}
+out:
+	*next_index = index;
+	return nr_found;
+}
+
+/**
+ *	radix_tree_gang_lookup_tag - perform multiple lookup on a radix tree
+ *	                             based on a tag
+ *	@root:		radix tree root
+ *	@results:	where the results of the lookup are placed
+ *	@first_index:	start the lookup from this key
+ *	@max_items:	place up to this many items at *results
+ *	@tag:		the tag index
+ *
+ *	Performs an index-ascending scan of the tree for present items which
+ *	have the tag indexed by @tag set.  Places the items at *@results and
+ *	returns the number of items which were placed at *@results.
+ */
+unsigned int
+radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results,
+		unsigned long first_index, unsigned int max_items, int tag)
+{
+	const unsigned long max_index = radix_tree_maxindex(root->height);
+	unsigned long cur_index = first_index;
+	unsigned int ret = 0;
+
+	while (ret < max_items) {
+		unsigned int nr_found;
+		unsigned long next_index;	/* Index of next search */
+
+		if (cur_index > max_index)
+			break;
+		nr_found = __lookup_tag(root, results + ret, cur_index,
+					max_items - ret, &next_index, tag);
+		ret += nr_found;
+		if (next_index == 0)
+			break;
+		cur_index = next_index;
+	}
+	return ret;
+}
+EXPORT_SYMBOL(radix_tree_gang_lookup_tag);
+
 /**
  *	radix_tree_delete    -    delete an item from a radix tree
  *	@root:		radix tree root
@@ -357,24 +654,31 @@ EXPORT_SYMBOL(radix_tree_gang_lookup);
 void *radix_tree_delete(struct radix_tree_root *root, unsigned long index)
 {
 	struct radix_tree_path path[RADIX_TREE_MAX_PATH], *pathp = path;
+	struct radix_tree_path *orig_pathp;
 	unsigned int height, shift;
 	void *ret = NULL;
+	char tags[RADIX_TREE_TAGS];
+	int nr_cleared_tags;
 
 	height = root->height;
 	if (index > radix_tree_maxindex(height))
 		goto out;
 
-	shift = (height-1) * RADIX_TREE_MAP_SHIFT;
+	shift = (height - 1) * RADIX_TREE_MAP_SHIFT;
 	pathp->node = NULL;
 	pathp->slot = &root->rnode;
 
 	while (height > 0) {
+		int offset;
+
 		if (*pathp->slot == NULL)
 			goto out;
 
+		offset = (index >> shift) & RADIX_TREE_MAP_MASK;
+		pathp[1].offset = offset;
 		pathp[1].node = *pathp[0].slot;
 		pathp[1].slot = (struct radix_tree_node **)
-		    (pathp[1].node->slots + ((index >> shift) & RADIX_TREE_MAP_MASK));
+				(pathp[1].node->slots + offset);
 		pathp++;
 		shift -= RADIX_TREE_MAP_SHIFT;
 		height--;
@@ -384,20 +688,67 @@ void *radix_tree_delete(struct radix_tre
 	if (ret == NULL)
 		goto out;
 
+	orig_pathp = pathp;
+
+	/*
+	 * Clear all tags associated with the just-deleted item
+	 */
+	memset(tags, 0, sizeof(tags));
+	do {
+		int tag;
+
+		nr_cleared_tags = RADIX_TREE_TAGS;
+		for (tag = 0; tag < RADIX_TREE_TAGS; tag++) {
+			int idx;
+
+			if (!tags[tag])
+				tag_clear(pathp[0].node, tag, pathp[0].offset);
+
+			for (idx = 0; idx < RADIX_TREE_TAG_LONGS; idx++) {
+				if (pathp[0].node->tags[tag][idx]) {
+					tags[tag] = 1;
+					nr_cleared_tags--;
+					break;
+				}
+			}
+		}
+		pathp--;
+	} while (pathp[0].node && nr_cleared_tags);
+
+	pathp = orig_pathp;
 	*pathp[0].slot = NULL;
 	while (pathp[0].node && --pathp[0].node->count == 0) {
 		pathp--;
+		BUG_ON(*pathp[0].slot == NULL);
 		*pathp[0].slot = NULL;
 		radix_tree_node_free(pathp[1].node);
 	}
-
 	if (root->rnode == NULL)
-		root->height = 0;  /* Empty tree, we can reset the height */
+		root->height = 0;
 out:
 	return ret;
 }
 EXPORT_SYMBOL(radix_tree_delete);
 
+/**
+ *	radix_tree_tagged - test whether any items in the tree are tagged
+ *	@root:		radix tree root
+ *	@tag:		tag to test
+ */
+int radix_tree_tagged(struct radix_tree_root *root, int tag)
+{
+	int idx;
+
+	if (!root->rnode)
+		return 0;
+	for (idx = 0; idx < RADIX_TREE_TAG_LONGS; idx++) {
+		if (root->rnode->tags[tag][idx])
+			return 1;
+	}
+	return 0;
+}
+EXPORT_SYMBOL(radix_tree_tagged);
+
 static void
 radix_tree_node_ctor(void *node, kmem_cache_t *cachep, unsigned long flags)
 {
--- diff/lib/rwsem.c	2004-03-11 10:20:29.000000000 +0000
+++ source/lib/rwsem.c	2004-04-21 10:45:36.020227592 +0100
@@ -5,6 +5,7 @@
  */
 #include <linux/rwsem.h>
 #include <linux/sched.h>
+#include <linux/init.h>
 #include <linux/module.h>
 
 struct rwsem_waiter {
@@ -162,7 +163,7 @@ static inline struct rw_semaphore *rwsem
 /*
  * wait for the read lock to be granted
  */
-struct rw_semaphore fastcall *rwsem_down_read_failed(struct rw_semaphore *sem)
+struct rw_semaphore fastcall __sched *rwsem_down_read_failed(struct rw_semaphore *sem)
 {
 	struct rwsem_waiter waiter;
 
@@ -178,7 +179,7 @@ struct rw_semaphore fastcall *rwsem_down
 /*
  * wait for the write lock to be granted
  */
-struct rw_semaphore fastcall *rwsem_down_write_failed(struct rw_semaphore *sem)
+struct rw_semaphore fastcall __sched *rwsem_down_write_failed(struct rw_semaphore *sem)
 {
 	struct rwsem_waiter waiter;
 
--- diff/mm/Makefile	2003-10-09 09:47:17.000000000 +0100
+++ source/mm/Makefile	2004-04-21 10:45:36.020227592 +0100
@@ -12,3 +12,4 @@ obj-y			:= bootmem.o filemap.o mempool.o
 			   slab.o swap.o truncate.o vmscan.o $(mmu-y)
 
 obj-$(CONFIG_SWAP)	+= page_io.o swap_state.o swapfile.o
+obj-$(CONFIG_HUGETLBFS)	+= hugetlb.o
--- diff/mm/filemap.c	2004-04-05 12:57:08.000000000 +0100
+++ source/mm/filemap.c	2004-04-21 10:45:36.022227288 +0100
@@ -59,10 +59,10 @@
  *    ->private_lock		(__free_pte->__set_page_dirty_buffers)
  *      ->swap_list_lock
  *        ->swap_device_lock	(exclusive_swap_page, others)
- *          ->mapping->page_lock
+ *          ->mapping->tree_lock
  *
  *  ->i_sem
- *    ->i_shared_sem		(truncate->invalidate_mmap_range)
+ *    ->i_shared_sem		(truncate->unmap_mapping_range)
  *
  *  ->mmap_sem
  *    ->i_shared_sem		(various places)
@@ -73,14 +73,17 @@
  *  ->mmap_sem
  *    ->i_sem			(msync)
  *
+ *  ->i_sem
+ *    ->i_alloc_sem             (various)
+ *
  *  ->inode_lock
  *    ->sb_lock			(fs/fs-writeback.c)
- *    ->mapping->page_lock	(__sync_single_inode)
+ *    ->mapping->tree_lock	(__sync_single_inode)
  *
  *  ->page_table_lock
  *    ->swap_device_lock	(try_to_unmap_one)
  *    ->private_lock		(try_to_unmap_one)
- *    ->page_lock		(try_to_unmap_one)
+ *    ->tree_lock		(try_to_unmap_one)
  *    ->zone.lru_lock		(follow_page->mark_page_accessed)
  *
  *  ->task->proc_lock
@@ -90,16 +93,14 @@
 /*
  * Remove a page from the page cache and free it. Caller has to make
  * sure the page is locked and that nobody else uses it - or that usage
- * is safe.  The caller must hold a write_lock on the mapping's page_lock.
+ * is safe.  The caller must hold a write_lock on the mapping's tree_lock.
  */
 void __remove_from_page_cache(struct page *page)
 {
 	struct address_space *mapping = page->mapping;
 
 	radix_tree_delete(&mapping->page_tree, page->index);
-	list_del(&page->list);
 	page->mapping = NULL;
-
 	mapping->nrpages--;
 	pagecache_acct(-1);
 }
@@ -111,17 +112,23 @@ void remove_from_page_cache(struct page 
 	if (unlikely(!PageLocked(page)))
 		PAGE_BUG(page);
 
-	spin_lock(&mapping->page_lock);
+	spin_lock_irq(&mapping->tree_lock);
 	__remove_from_page_cache(page);
-	spin_unlock(&mapping->page_lock);
+	spin_unlock_irq(&mapping->tree_lock);
 }
 
 static inline int sync_page(struct page *page)
 {
-	struct address_space *mapping = page->mapping;
+	struct address_space *mapping;
 
-	if (mapping && mapping->a_ops && mapping->a_ops->sync_page)
-		return mapping->a_ops->sync_page(page);
+	smp_mb();
+	mapping = page_mapping(page);
+	if (mapping) {
+		if (mapping->a_ops && mapping->a_ops->sync_page)
+			return mapping->a_ops->sync_page(page);
+	} else if (PageSwapCache(page)) {
+		swap_unplug_io_fn(page);
+	}
 	return 0;
 }
 
@@ -145,9 +152,6 @@ static int __filemap_fdatawrite(struct a
 	if (mapping->backing_dev_info->memory_backed)
 		return 0;
 
-	spin_lock(&mapping->page_lock);
-	list_splice_init(&mapping->dirty_pages, &mapping->io_pages);
-	spin_unlock(&mapping->page_lock);
 	ret = do_writepages(mapping, &wbc);
 	return ret;
 }
@@ -156,7 +160,6 @@ int filemap_fdatawrite(struct address_sp
 {
 	return __filemap_fdatawrite(mapping, WB_SYNC_ALL);
 }
-
 EXPORT_SYMBOL(filemap_fdatawrite);
 
 /*
@@ -167,55 +170,40 @@ int filemap_flush(struct address_space *
 {
 	return __filemap_fdatawrite(mapping, WB_SYNC_NONE);
 }
-
 EXPORT_SYMBOL(filemap_flush);
 
-/**
- * filemap_fdatawait - walk the list of locked pages of the given address
- *                     space and wait for all of them.
- * @mapping: address space structure to wait for
+/*
+ * Wait for writeback to complete against pages indexed by start->end
+ * inclusive
  */
-int filemap_fdatawait(struct address_space * mapping)
+static int wait_on_page_writeback_range(struct address_space *mapping,
+				pgoff_t start, pgoff_t end)
 {
+	struct pagevec pvec;
+	int nr_pages;
 	int ret = 0;
-	int progress;
-
-restart:
-	progress = 0;
-	spin_lock(&mapping->page_lock);
-        while (!list_empty(&mapping->locked_pages)) {
-		struct page *page;
+	pgoff_t index;
 
-		page = list_entry(mapping->locked_pages.next,struct page,list);
-		list_del(&page->list);
-		if (PageDirty(page))
-			list_add(&page->list, &mapping->dirty_pages);
-		else
-			list_add(&page->list, &mapping->clean_pages);
+	if (end < start)
+		return 0;
 
-		if (!PageWriteback(page)) {
-			if (++progress > 32) {
-				if (need_resched()) {
-					spin_unlock(&mapping->page_lock);
-					__cond_resched();
-					goto restart;
-				}
-			}
-			continue;
+	pagevec_init(&pvec, 0);
+	index = start;
+	while ((nr_pages = pagevec_lookup_tag(&pvec, mapping, &index,
+			PAGECACHE_TAG_WRITEBACK,
+			min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1))) {
+		unsigned i;
+
+		for (i = 0; i < nr_pages; i++) {
+			struct page *page = pvec.pages[i];
+
+			wait_on_page_writeback(page);
+			if (PageError(page))
+				ret = -EIO;
 		}
-
-		progress = 0;
-		page_cache_get(page);
-		spin_unlock(&mapping->page_lock);
-
-		wait_on_page_writeback(page);
-		if (PageError(page))
-			ret = -EIO;
-
-		page_cache_release(page);
-		spin_lock(&mapping->page_lock);
+		pagevec_release(&pvec);
+		cond_resched();
 	}
-	spin_unlock(&mapping->page_lock);
 
 	/* Check for outstanding write errors */
 	if (test_and_clear_bit(AS_ENOSPC, &mapping->flags))
@@ -226,8 +214,31 @@ restart:
 	return ret;
 }
 
+/**
+ * filemap_fdatawait - walk the list of under-writeback pages of the given
+ *     address space and wait for all of them.
+ *
+ * @mapping: address space structure to wait for
+ */
+int filemap_fdatawait(struct address_space *mapping)
+{
+	return wait_on_page_writeback_range(mapping, 0, -1);
+}
+
 EXPORT_SYMBOL(filemap_fdatawait);
 
+int filemap_write_and_wait(struct address_space *mapping)
+{
+	int retval = 0;
+
+	if (mapping->nrpages) {
+		retval = filemap_fdatawrite(mapping);
+		if (retval == 0)
+			retval = filemap_fdatawait(mapping);
+	}
+	return retval;
+}
+
 /*
  * This adds a page to the page cache, starting out as locked, unreferenced,
  * not uptodate and with no errors.
@@ -235,13 +246,9 @@ EXPORT_SYMBOL(filemap_fdatawait);
  * This function is used for two things: adding newly allocated pagecache
  * pages and for moving existing anon pages into swapcache.
  *
- * In the case of pagecache pages, the page is new, so we can just run
- * SetPageLocked() against it.  The other page state flags were set by
- * rmqueue()
- *
- * In the case of swapcache, try_to_swap_out() has already locked the page, so
- * SetPageLocked() is ugly-but-OK there too.  The required page state has been
- * set up by swap_out_add_to_swap_cache().
+ * This function is used to add newly allocated pagecache pages:
+ * the page is new, so we can just run SetPageLocked() against it.
+ * The other page state flags were set by rmqueue().
  *
  * This function does not add the page to the LRU.  The caller must do that.
  */
@@ -252,15 +259,18 @@ int add_to_page_cache(struct page *page,
 
 	if (error == 0) {
 		page_cache_get(page);
-		spin_lock(&mapping->page_lock);
+		spin_lock_irq(&mapping->tree_lock);
 		error = radix_tree_insert(&mapping->page_tree, offset, page);
 		if (!error) {
 			SetPageLocked(page);
-			___add_to_page_cache(page, mapping, offset);
+			page->mapping = mapping;
+			page->index = offset;
+			mapping->nrpages++;
+			pagecache_acct(1);
 		} else {
 			page_cache_release(page);
 		}
-		spin_unlock(&mapping->page_lock);
+		spin_unlock_irq(&mapping->tree_lock);
 		radix_tree_preload_end();
 	}
 	return error;
@@ -348,8 +358,7 @@ void end_page_writeback(struct page *pag
 	wait_queue_head_t *waitqueue = page_waitqueue(page);
 
 	if (!TestClearPageReclaim(page) || rotate_reclaimable_page(page)) {
-		smp_mb__before_clear_bit();
-		if (!TestClearPageWriteback(page))
+		if (!test_clear_page_writeback(page))
 			BUG();
 		smp_mb__after_clear_bit();
 	}
@@ -396,11 +405,11 @@ struct page * find_get_page(struct addre
 	 * We scan the hash list read-only. Addition to and removal from
 	 * the hash-list needs a held write-lock.
 	 */
-	spin_lock(&mapping->page_lock);
+	spin_lock_irq(&mapping->tree_lock);
 	page = radix_tree_lookup(&mapping->page_tree, offset);
 	if (page)
 		page_cache_get(page);
-	spin_unlock(&mapping->page_lock);
+	spin_unlock_irq(&mapping->tree_lock);
 	return page;
 }
 
@@ -413,11 +422,11 @@ struct page *find_trylock_page(struct ad
 {
 	struct page *page;
 
-	spin_lock(&mapping->page_lock);
+	spin_lock_irq(&mapping->tree_lock);
 	page = radix_tree_lookup(&mapping->page_tree, offset);
 	if (page && TestSetPageLocked(page))
 		page = NULL;
-	spin_unlock(&mapping->page_lock);
+	spin_unlock_irq(&mapping->tree_lock);
 	return page;
 }
 
@@ -439,15 +448,15 @@ struct page *find_lock_page(struct addre
 {
 	struct page *page;
 
-	spin_lock(&mapping->page_lock);
+	spin_lock_irq(&mapping->tree_lock);
 repeat:
 	page = radix_tree_lookup(&mapping->page_tree, offset);
 	if (page) {
 		page_cache_get(page);
 		if (TestSetPageLocked(page)) {
-			spin_unlock(&mapping->page_lock);
+			spin_unlock_irq(&mapping->tree_lock);
 			lock_page(page);
-			spin_lock(&mapping->page_lock);
+			spin_lock_irq(&mapping->tree_lock);
 
 			/* Has the page been truncated while we slept? */
 			if (page->mapping != mapping || page->index != offset) {
@@ -457,7 +466,7 @@ repeat:
 			}
 		}
 	}
-	spin_unlock(&mapping->page_lock);
+	spin_unlock_irq(&mapping->tree_lock);
 	return page;
 }
 
@@ -525,18 +534,39 @@ EXPORT_SYMBOL(find_or_create_page);
  *
  * find_get_pages() returns the number of pages which were found.
  */
-unsigned int find_get_pages(struct address_space *mapping, pgoff_t start,
+unsigned find_get_pages(struct address_space *mapping, pgoff_t start,
 			    unsigned int nr_pages, struct page **pages)
 {
 	unsigned int i;
 	unsigned int ret;
 
-	spin_lock(&mapping->page_lock);
+	spin_lock_irq(&mapping->tree_lock);
 	ret = radix_tree_gang_lookup(&mapping->page_tree,
 				(void **)pages, start, nr_pages);
 	for (i = 0; i < ret; i++)
 		page_cache_get(pages[i]);
-	spin_unlock(&mapping->page_lock);
+	spin_unlock_irq(&mapping->tree_lock);
+	return ret;
+}
+
+/*
+ * Like find_get_pages, except we only return pages which are tagged with
+ * `tag'.   We update *index to index the next page for the traversal.
+ */
+unsigned find_get_pages_tag(struct address_space *mapping, pgoff_t *index,
+			int tag, unsigned int nr_pages, struct page **pages)
+{
+	unsigned int i;
+	unsigned int ret;
+
+	spin_lock_irq(&mapping->tree_lock);
+	ret = radix_tree_gang_lookup_tag(&mapping->page_tree,
+				(void **)pages, *index, nr_pages, tag);
+	for (i = 0; i < ret; i++)
+		page_cache_get(pages[i]);
+	if (ret)
+		*index = pages[ret - 1]->index + 1;
+	spin_unlock_irq(&mapping->tree_lock);
 	return ret;
 }
 
@@ -630,7 +660,7 @@ page_ok:
 		 * virtual addresses, take care about potential aliasing
 		 * before reading the page on the kernel side.
 		 */
-		if (!list_empty(&mapping->i_mmap_shared))
+		if (mapping_writably_mapped(mapping))
 			flush_dcache_page(page);
 
 		/*
@@ -981,7 +1011,6 @@ static int fastcall page_cache_read(stru
 	return error == -EEXIST ? 0 : error;
 }
 
-#define MMAP_READAROUND (16UL)
 #define MMAP_LOTSAMISS  (100)
 
 /*
@@ -1037,6 +1066,8 @@ retry_all:
 retry_find:
 	page = find_get_page(mapping, pgoff);
 	if (!page) {
+		unsigned long ra_pages;
+
 		if (VM_SequentialReadHint(area)) {
 			handle_ra_miss(mapping, ra, pgoff);
 			goto no_cached_page;
@@ -1059,9 +1090,18 @@ retry_find:
 			inc_page_state(pgmajfault);
 		}
 		did_readaround = 1;
-		do_page_cache_readahead(mapping, file,
-				pgoff & ~(MMAP_READAROUND-1), MMAP_READAROUND);
-		goto retry_find;
+		ra_pages = max_sane_readahead(file->f_ra.ra_pages);
+		if (ra_pages) {
+			long start;
+
+			start = pgoff - ra_pages / 2;
+			if (pgoff < 0)
+				pgoff = 0;
+			do_page_cache_readahead(mapping, file, pgoff, ra_pages);
+		}
+		page = find_get_page(mapping, pgoff);
+		if (!page)
+			goto no_cached_page;
 	}
 
 	if (!did_readaround)
@@ -1323,11 +1363,7 @@ repeat:
 		 * If a nonlinear mapping then store the file page offset
 		 * in the pte.
 		 */
-	    	unsigned long pgidx;
-		pgidx = (addr - vma->vm_start) >> PAGE_SHIFT;
-		pgidx += vma->vm_pgoff;
-		pgidx >>= PAGE_CACHE_SHIFT - PAGE_SHIFT;
-		if (pgoff != pgidx) {
+		if (pgoff != linear_page_index(vma, addr)) {
 	    		err = install_file_pte(mm, vma, addr, pgoff, prot);
 			if (err)
 		    		return err;
@@ -1716,6 +1752,7 @@ EXPORT_SYMBOL(generic_write_checks);
 
 /*
  * Write to a file through the page cache. 
+ * Called under i_sem for S_ISREG files.
  *
  * We put everything into the page cache prior to writing it. This is not a
  * problem when writing full pages. With partial pages, however, we first have
@@ -1806,12 +1843,21 @@ generic_file_aio_write_nolock(struct kio
 		/*
 		 * Sync the fs metadata but not the minor inode changes and
 		 * of course not the data as we did direct DMA for the IO.
+		 * i_sem is held, which protects generic_osync_inode() from
+		 * livelocking.
 		 */
 		if (written >= 0 && file->f_flags & O_SYNC)
 			status = generic_osync_inode(inode, mapping, OSYNC_METADATA);
-		if (written >= 0 && !is_sync_kiocb(iocb))
+		if (written == count && !is_sync_kiocb(iocb))
 			written = -EIOCBQUEUED;
-		goto out_status;
+		if (written < 0 || written == count)
+			goto out_status;
+		/*
+		 * direct-io write to a hole: fall through to buffered I/O
+		 * for completing the rest of the request.
+		 */
+		pos += written;
+		count -= written;
 	}
 
 	buf = iov->iov_base;
@@ -1900,6 +1946,14 @@ generic_file_aio_write_nolock(struct kio
 					OSYNC_METADATA|OSYNC_DATA);
 	}
 	
+	/*
+	 * If we get here for O_DIRECT writes then we must have fallen through
+	 * to buffered writes (block instantiation inside i_size).  So we sync
+	 * the file data here, to try to honour O_DIRECT expectations.
+	 */
+	if (unlikely(file->f_flags & O_DIRECT) && written)
+		status = filemap_write_and_wait(mapping);
+
 out_status:	
 	err = written ? written : status;
 out:
@@ -1991,6 +2045,9 @@ ssize_t generic_file_writev(struct file 
 
 EXPORT_SYMBOL(generic_file_writev);
 
+/*
+ * Called under i_sem for writes to S_ISREG files
+ */
 ssize_t
 generic_file_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
 	loff_t offset, unsigned long nr_segs)
@@ -1999,18 +2056,13 @@ generic_file_direct_IO(int rw, struct ki
 	struct address_space *mapping = file->f_mapping;
 	ssize_t retval;
 
-	if (mapping->nrpages) {
-		retval = filemap_fdatawrite(mapping);
-		if (retval == 0)
-			retval = filemap_fdatawait(mapping);
-		if (retval)
-			goto out;
+	retval = filemap_write_and_wait(mapping);
+	if (retval == 0) {
+		retval = mapping->a_ops->direct_IO(rw, iocb, iov,
+						offset, nr_segs);
+		if (rw == WRITE && mapping->nrpages)
+			invalidate_inode_pages2(mapping);
 	}
-
-	retval = mapping->a_ops->direct_IO(rw, iocb, iov, offset, nr_segs);
-	if (rw == WRITE && mapping->nrpages)
-		invalidate_inode_pages2(mapping);
-out:
 	return retval;
 }
 
--- diff/mm/fremap.c	2004-03-11 10:20:29.000000000 +0000
+++ source/mm/fremap.c	2004-04-21 10:45:36.022227288 +0100
@@ -12,7 +12,7 @@
 #include <linux/mman.h>
 #include <linux/pagemap.h>
 #include <linux/swapops.h>
-#include <linux/rmap-locking.h>
+#include <linux/rmap.h>
 #include <linux/module.h>
 
 #include <asm/mmu_context.h>
--- diff/mm/madvise.c	2004-02-09 10:36:12.000000000 +0000
+++ source/mm/madvise.c	2004-04-21 10:45:36.023227136 +0100
@@ -92,10 +92,19 @@ static long madvise_willneed(struct vm_a
 static long madvise_dontneed(struct vm_area_struct * vma,
 			     unsigned long start, unsigned long end)
 {
+	struct zap_details details;
+
 	if (vma->vm_flags & VM_LOCKED)
 		return -EINVAL;
 
-	zap_page_range(vma, start, end - start);
+	if (unlikely(vma->vm_flags & VM_NONLINEAR)) {
+		details.check_mapping = NULL;
+		details.nonlinear_vma = vma;
+		details.first_index = 0;
+		details.last_index = ULONG_MAX;
+		zap_page_range(vma, start, end - start, &details);
+	} else
+		zap_page_range(vma, start, end - start, NULL);
 	return 0;
 }
 
--- diff/mm/memory.c	2004-04-05 12:57:08.000000000 +0100
+++ source/mm/memory.c	2004-04-21 10:45:36.024226984 +0100
@@ -43,7 +43,7 @@
 #include <linux/swap.h>
 #include <linux/highmem.h>
 #include <linux/pagemap.h>
-#include <linux/rmap-locking.h>
+#include <linux/rmap.h>
 #include <linux/module.h>
 #include <linux/init.h>
 
@@ -384,9 +384,9 @@ nomem:
 	return -ENOMEM;
 }
 
-static void
-zap_pte_range(struct mmu_gather *tlb, pmd_t * pmd,
-		unsigned long address, unsigned long size)
+static void zap_pte_range(struct mmu_gather *tlb,
+		pmd_t *pmd, unsigned long address,
+		unsigned long size, struct zap_details *details)
 {
 	unsigned long offset;
 	pte_t *ptep;
@@ -408,35 +408,64 @@ zap_pte_range(struct mmu_gather *tlb, pm
 		if (pte_none(pte))
 			continue;
 		if (pte_present(pte)) {
+			struct page *page = NULL;
 			unsigned long pfn = pte_pfn(pte);
-
-			pte = ptep_get_and_clear(ptep);
-			tlb_remove_tlb_entry(tlb, ptep, address+offset);
 			if (pfn_valid(pfn)) {
-				struct page *page = pfn_to_page(pfn);
-				if (!PageReserved(page)) {
-					if (pte_dirty(pte))
-						set_page_dirty(page);
-					if (page->mapping && pte_young(pte) &&
-							!PageSwapCache(page))
-						mark_page_accessed(page);
-					tlb->freed++;
-					page_remove_rmap(page, ptep);
-					tlb_remove_page(tlb, page);
-				}
+				page = pfn_to_page(pfn);
+				if (PageReserved(page))
+					page = NULL;
+			}
+			if (unlikely(details) && page) {
+				/*
+				 * unmap_shared_mapping_pages() wants to
+				 * invalidate cache without truncating:
+				 * unmap shared but keep private pages.
+				 */
+				if (details->check_mapping &&
+				    details->check_mapping != page->mapping)
+					continue;
+				/*
+				 * Each page->index must be checked when
+				 * invalidating or truncating nonlinear.
+				 */
+				if (details->nonlinear_vma &&
+				    (page->index < details->first_index ||
+				     page->index > details->last_index))
+					continue;
 			}
-		} else {
-			if (!pte_file(pte))
-				free_swap_and_cache(pte_to_swp_entry(pte));
-			pte_clear(ptep);
+			pte = ptep_get_and_clear(ptep);
+			tlb_remove_tlb_entry(tlb, ptep, address+offset);
+			if (unlikely(!page))
+				continue;
+			if (unlikely(details) && details->nonlinear_vma
+			    && linear_page_index(details->nonlinear_vma,
+					address+offset) != page->index)
+				set_pte(ptep, pgoff_to_pte(page->index));
+			if (pte_dirty(pte))
+				set_page_dirty(page);
+			if (pte_young(pte) && page_mapping(page))
+				mark_page_accessed(page);
+			tlb->freed++;
+			page_remove_rmap(page, ptep);
+			tlb_remove_page(tlb, page);
+			continue;
 		}
+		/*
+		 * If details->check_mapping, we leave swap entries;
+		 * if details->nonlinear_vma, we leave file entries.
+		 */
+		if (unlikely(details))
+			continue;
+		if (!pte_file(pte))
+			free_swap_and_cache(pte_to_swp_entry(pte));
+		pte_clear(ptep);
 	}
 	pte_unmap(ptep-1);
 }
 
-static void
-zap_pmd_range(struct mmu_gather *tlb, pgd_t * dir,
-		unsigned long address, unsigned long size)
+static void zap_pmd_range(struct mmu_gather *tlb,
+		pgd_t * dir, unsigned long address,
+		unsigned long size, struct zap_details *details)
 {
 	pmd_t * pmd;
 	unsigned long end;
@@ -453,28 +482,23 @@ zap_pmd_range(struct mmu_gather *tlb, pg
 	if (end > ((address + PGDIR_SIZE) & PGDIR_MASK))
 		end = ((address + PGDIR_SIZE) & PGDIR_MASK);
 	do {
-		zap_pte_range(tlb, pmd, address, end - address);
+		zap_pte_range(tlb, pmd, address, end - address, details);
 		address = (address + PMD_SIZE) & PMD_MASK; 
 		pmd++;
 	} while (address < end);
 }
 
-void unmap_page_range(struct mmu_gather *tlb, struct vm_area_struct *vma,
-			unsigned long address, unsigned long end)
+static void unmap_page_range(struct mmu_gather *tlb,
+		struct vm_area_struct *vma, unsigned long address,
+		unsigned long end, struct zap_details *details)
 {
 	pgd_t * dir;
 
-	if (is_vm_hugetlb_page(vma)) {
-		unmap_hugepage_range(vma, address, end);
-		return;
-	}
-
 	BUG_ON(address >= end);
-
 	dir = pgd_offset(vma->vm_mm, address);
 	tlb_start_vma(tlb, vma);
 	do {
-		zap_pmd_range(tlb, dir, address, end - address);
+		zap_pmd_range(tlb, dir, address, end - address, details);
 		address = (address + PGDIR_SIZE) & PGDIR_MASK;
 		dir++;
 	} while (address && (address < end));
@@ -491,9 +515,9 @@ void unmap_page_range(struct mmu_gather 
 #define ZAP_BLOCK_SIZE	(256 * PAGE_SIZE)
 #endif
 
-/* No preempt: go for the best straight-line efficiency */
+/* No preempt: go for improved straight-line efficiency */
 #if !defined(CONFIG_PREEMPT)
-#define ZAP_BLOCK_SIZE	(~(0UL))
+#define ZAP_BLOCK_SIZE	(1024 * PAGE_SIZE)
 #endif
 
 /**
@@ -504,6 +528,7 @@ void unmap_page_range(struct mmu_gather 
  * @start_addr: virtual address at which to start unmapping
  * @end_addr: virtual address at which to end unmapping
  * @nr_accounted: Place number of unmapped pages in vm-accountable vma's here
+ * @details: details of nonlinear truncation or shared cache invalidation
  *
  * Returns the number of vma's which were covered by the unmapping.
  *
@@ -524,22 +549,14 @@ void unmap_page_range(struct mmu_gather 
  */
 int unmap_vmas(struct mmu_gather **tlbp, struct mm_struct *mm,
 		struct vm_area_struct *vma, unsigned long start_addr,
-		unsigned long end_addr, unsigned long *nr_accounted)
+		unsigned long end_addr, unsigned long *nr_accounted,
+		struct zap_details *details)
 {
 	unsigned long zap_bytes = ZAP_BLOCK_SIZE;
 	unsigned long tlb_start = 0;	/* For tlb_finish_mmu */
 	int tlb_start_valid = 0;
 	int ret = 0;
 
-	if (vma) {	/* debug.  killme. */
-		if (end_addr <= vma->vm_start)
-			printk("%s: end_addr(0x%08lx) <= vm_start(0x%08lx)\n",
-				__FUNCTION__, end_addr, vma->vm_start);
-		if (start_addr >= vma->vm_end)
-			printk("%s: start_addr(0x%08lx) <= vm_end(0x%08lx)\n",
-				__FUNCTION__, start_addr, vma->vm_end);
-	}
-
 	for ( ; vma && vma->vm_start < end_addr; vma = vma->vm_next) {
 		unsigned long start;
 		unsigned long end;
@@ -558,17 +575,20 @@ int unmap_vmas(struct mmu_gather **tlbp,
 		while (start != end) {
 			unsigned long block;
 
-			if (is_vm_hugetlb_page(vma))
-				block = end - start;
-			else
-				block = min(zap_bytes, end - start);
-
 			if (!tlb_start_valid) {
 				tlb_start = start;
 				tlb_start_valid = 1;
 			}
 
-			unmap_page_range(*tlbp, vma, start, start + block);
+			if (is_vm_hugetlb_page(vma)) {
+				block = end - start;
+				unmap_hugepage_range(vma, start, end);
+			} else {
+				block = min(zap_bytes, end - start);
+				unmap_page_range(*tlbp, vma, start,
+						start + block, details);
+			}
+
 			start += block;
 			zap_bytes -= block;
 			if ((long)zap_bytes > 0)
@@ -582,9 +602,6 @@ int unmap_vmas(struct mmu_gather **tlbp,
 			}
 			zap_bytes = ZAP_BLOCK_SIZE;
 		}
-		if (vma->vm_next && vma->vm_next->vm_start < vma->vm_end)
-			printk("%s: VMA list is not sorted correctly!\n",
-				__FUNCTION__);		
 	}
 	return ret;
 }
@@ -594,9 +611,10 @@ int unmap_vmas(struct mmu_gather **tlbp,
  * @vma: vm_area_struct holding the applicable pages
  * @address: starting address of pages to zap
  * @size: number of bytes to zap
+ * @details: details of nonlinear truncation or shared cache invalidation
  */
-void zap_page_range(struct vm_area_struct *vma,
-			unsigned long address, unsigned long size)
+void zap_page_range(struct vm_area_struct *vma, unsigned long address,
+		unsigned long size, struct zap_details *details)
 {
 	struct mm_struct *mm = vma->vm_mm;
 	struct mmu_gather *tlb;
@@ -613,7 +631,7 @@ void zap_page_range(struct vm_area_struc
 	lru_add_drain();
 	spin_lock(&mm->page_table_lock);
 	tlb = tlb_gather_mmu(mm, 0);
-	unmap_vmas(&tlb, mm, vma, address, end, &nr_accounted);
+	unmap_vmas(&tlb, mm, vma, address, end, &nr_accounted, details);
 	tlb_finish_mmu(tlb, address, end);
 	spin_unlock(&mm->page_table_lock);
 }
@@ -629,11 +647,11 @@ follow_page(struct mm_struct *mm, unsign
 	pmd_t *pmd;
 	pte_t *ptep, pte;
 	unsigned long pfn;
-	struct vm_area_struct *vma;
+	struct page *page;
 
-	vma = hugepage_vma(mm, address);
-	if (vma)
-		return follow_huge_addr(mm, vma, address, write);
+	page = follow_huge_addr(mm, address, write);
+	if (! IS_ERR(page))
+		return page;
 
 	pgd = pgd_offset(mm, address);
 	if (pgd_none(*pgd) || pgd_bad(*pgd))
@@ -688,6 +706,32 @@ static inline struct page *get_page_map(
 }
 
 
+static inline int
+untouched_anonymous_page(struct mm_struct* mm, struct vm_area_struct *vma,
+			 unsigned long address)
+{
+	pgd_t *pgd;
+	pmd_t *pmd;
+
+	/* Check if the vma is for an anonymous mapping. */
+	if (vma->vm_ops && vma->vm_ops->nopage)
+		return 0;
+
+	/* Check if page directory entry exists. */
+	pgd = pgd_offset(mm, address);
+	if (pgd_none(*pgd) || pgd_bad(*pgd))
+		return 1;
+
+	/* Check if page middle directory entry exists. */
+	pmd = pmd_offset(pgd, address);
+	if (pmd_none(*pmd) || pmd_bad(*pmd))
+		return 1;
+
+	/* There is a pte slot for 'address' in 'mm'. */
+	return 0;
+}
+
+
 int get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
 		unsigned long start, int len, int write, int force,
 		struct page **pages, struct vm_area_struct **vmas)
@@ -750,6 +794,18 @@ int get_user_pages(struct task_struct *t
 			struct page *map;
 			int lookup_write = write;
 			while (!(map = follow_page(mm, start, lookup_write))) {
+				/*
+				 * Shortcut for anonymous pages. We don't want
+				 * to force the creation of pages tables for
+				 * insanly big anonymously mapped areas that
+				 * nobody touched so far. This is important
+				 * for doing a core dump for these mappings.
+				 */
+				if (!lookup_write &&
+				    untouched_anonymous_page(mm,vma,start)) {
+					map = ZERO_PAGE(start);
+					break;
+				}
 				spin_unlock(&mm->page_table_lock);
 				switch (handle_mm_fault(mm,vma,start,write)) {
 				case VM_FAULT_MINOR:
@@ -1092,46 +1148,46 @@ no_pte_chain:
 }
 
 /*
- * Helper function for invalidate_mmap_range().
- * Both hba and hlen are page numbers in PAGE_SIZE units.
- * An hlen of zero blows away the entire portion file after hba.
- */
-static void
-invalidate_mmap_range_list(struct list_head *head,
-			   unsigned long const hba,
-			   unsigned long const hlen)
-{
-	struct list_head *curr;
-	unsigned long hea;	/* last page of hole. */
-	unsigned long vba;
-	unsigned long vea;	/* last page of corresponding uva hole. */
-	struct vm_area_struct *vp;
-	unsigned long zba;
-	unsigned long zea;
-
-	hea = hba + hlen - 1;	/* avoid overflow. */
-	if (hea < hba)
-		hea = ULONG_MAX;
-	list_for_each(curr, head) {
-		vp = list_entry(curr, struct vm_area_struct, shared);
-		vba = vp->vm_pgoff;
-		vea = vba + ((vp->vm_end - vp->vm_start) >> PAGE_SHIFT) - 1;
-		if (hea < vba || vea < hba)
-		    	continue;	/* Mapping disjoint from hole. */
-		zba = (hba <= vba) ? vba : hba;
-		zea = (vea <= hea) ? vea : hea;
-		zap_page_range(vp,
-			       ((zba - vba) << PAGE_SHIFT) + vp->vm_start,
-			       (zea - zba + 1) << PAGE_SHIFT);
+ * Helper function for unmap_mapping_range().
+ */
+static void unmap_mapping_range_list(struct list_head *head,
+				     struct zap_details *details)
+{
+	struct vm_area_struct *vma;
+	pgoff_t vba, vea, zba, zea;
+
+	list_for_each_entry(vma, head, shared) {
+		if (unlikely(vma->vm_flags & VM_NONLINEAR)) {
+			details->nonlinear_vma = vma;
+			zap_page_range(vma, vma->vm_start,
+				vma->vm_end - vma->vm_start, details);
+			details->nonlinear_vma = NULL;
+			continue;
+		}
+		vba = vma->vm_pgoff;
+		vea = vba + ((vma->vm_end - vma->vm_start) >> PAGE_SHIFT) - 1;
+		/* Assume for now that PAGE_CACHE_SHIFT == PAGE_SHIFT */
+		if (vba > details->last_index || vea < details->first_index)
+			continue;	/* Mapping disjoint from hole. */
+		zba = details->first_index;
+		if (zba < vba)
+			zba = vba;
+		zea = details->last_index;
+		if (zea > vea)
+			zea = vea;
+		zap_page_range(vma,
+			((zba - vba) << PAGE_SHIFT) + vma->vm_start,
+			(zea - zba + 1) << PAGE_SHIFT,
+			details->check_mapping? details: NULL);
 	}
 }
 
 /**
- * invalidate_mmap_range - invalidate the portion of all mmaps
+ * unmap_mapping_range - unmap the portion of all mmaps
  * in the specified address_space corresponding to the specified
  * page range in the underlying file.
- * @address_space: the address space containing mmaps to be invalidated.
- * @holebegin: byte in first page to invalidate, relative to the start of
+ * @address_space: the address space containing mmaps to be unmapped.
+ * @holebegin: byte in first page to unmap, relative to the start of
  * the underlying file.  This will be rounded down to a PAGE_SIZE
  * boundary.  Note that this is different from vmtruncate(), which
  * must keep the partial page.  In contrast, we must get rid of
@@ -1139,31 +1195,45 @@ invalidate_mmap_range_list(struct list_h
  * @holelen: size of prospective hole in bytes.  This will be rounded
  * up to a PAGE_SIZE boundary.  A holelen of zero truncates to the
  * end of the file.
+ * @even_cows: 1 when truncating a file, unmap even private COWed pages;
+ * but 0 when invalidating pagecache, don't throw away private data.
  */
-void invalidate_mmap_range(struct address_space *mapping,
-		      loff_t const holebegin, loff_t const holelen)
+void unmap_mapping_range(struct address_space *mapping,
+	loff_t const holebegin, loff_t const holelen, int even_cows)
 {
-	unsigned long hba = holebegin >> PAGE_SHIFT;
-	unsigned long hlen = (holelen + PAGE_SIZE - 1) >> PAGE_SHIFT;
+	struct zap_details details;
+	pgoff_t hba = holebegin >> PAGE_SHIFT;
+	pgoff_t hlen = (holelen + PAGE_SIZE - 1) >> PAGE_SHIFT;
 
 	/* Check for overflow. */
 	if (sizeof(holelen) > sizeof(hlen)) {
 		long long holeend =
 			(holebegin + holelen + PAGE_SIZE - 1) >> PAGE_SHIFT;
-
 		if (holeend & ~(long long)ULONG_MAX)
 			hlen = ULONG_MAX - hba + 1;
 	}
+
+	details.check_mapping = even_cows? NULL: mapping;
+	details.nonlinear_vma = NULL;
+	details.first_index = hba;
+	details.last_index = hba + hlen - 1;
+	if (details.last_index < details.first_index)
+		details.last_index = ULONG_MAX;
+
 	down(&mapping->i_shared_sem);
 	/* Protect against page fault */
 	atomic_inc(&mapping->truncate_count);
 	if (unlikely(!list_empty(&mapping->i_mmap)))
-		invalidate_mmap_range_list(&mapping->i_mmap, hba, hlen);
+		unmap_mapping_range_list(&mapping->i_mmap, &details);
+
+	/* Don't waste time to check mapping on fully shared vmas */
+	details.check_mapping = NULL;
+
 	if (unlikely(!list_empty(&mapping->i_mmap_shared)))
-		invalidate_mmap_range_list(&mapping->i_mmap_shared, hba, hlen);
+		unmap_mapping_range_list(&mapping->i_mmap_shared, &details);
 	up(&mapping->i_shared_sem);
 }
-EXPORT_SYMBOL_GPL(invalidate_mmap_range);
+EXPORT_SYMBOL(unmap_mapping_range);
 
 /*
  * Handle all mappings that got truncated by a "truncate()"
@@ -1181,7 +1251,7 @@ int vmtruncate(struct inode * inode, lof
 	if (inode->i_size < offset)
 		goto do_expand;
 	i_size_write(inode, offset);
-	invalidate_mmap_range(mapping, offset + PAGE_SIZE - 1, 0);
+	unmap_mapping_range(mapping, offset + PAGE_SIZE - 1, 0, 1);
 	truncate_inode_pages(mapping, offset);
 	goto out_truncate;
 
@@ -1460,7 +1530,7 @@ retry:
 	spin_lock(&mm->page_table_lock);
 	/*
 	 * For a file-backed vma, someone could have truncated or otherwise
-	 * invalidated this page.  If invalidate_mmap_range got called,
+	 * invalidated this page.  If unmap_mapping_range got called,
 	 * retry getting the page.
 	 */
 	if (mapping &&
--- diff/mm/mempool.c	2004-04-05 12:57:08.000000000 +0100
+++ source/mm/mempool.c	2004-04-21 10:45:36.025226832 +0100
@@ -234,8 +234,6 @@ repeat_alloc:
 	if (!(gfp_mask & __GFP_WAIT))
 		return NULL;
 
-	blk_run_queues();
-
 	prepare_to_wait(&pool->wait, &wait, TASK_UNINTERRUPTIBLE);
 	mb();
 	if (!pool->curr_nr)
--- diff/mm/mmap.c	2004-04-05 12:57:08.000000000 +0100
+++ source/mm/mmap.c	2004-04-21 10:45:36.025226832 +0100
@@ -385,7 +385,8 @@ can_vma_merge_after(struct vm_area_struc
  * whether that can be merged with its predecessor or its successor.  Or
  * both (it neatly fills a hole).
  */
-static int vma_merge(struct mm_struct *mm, struct vm_area_struct *prev,
+static struct vm_area_struct *vma_merge(struct mm_struct *mm,
+			struct vm_area_struct *prev,
 			struct rb_node *rb_parent, unsigned long addr, 
 			unsigned long end, unsigned long vm_flags,
 			struct file *file, unsigned long pgoff)
@@ -399,7 +400,7 @@ static int vma_merge(struct mm_struct *m
 	 * vma->vm_flags & VM_SPECIAL, too.
 	 */
 	if (vm_flags & VM_SPECIAL)
-		return 0;
+		return NULL;
 
 	i_shared_sem = file ? &file->f_mapping->i_shared_sem : NULL;
 
@@ -412,7 +413,6 @@ static int vma_merge(struct mm_struct *m
 	 * Can it merge with the predecessor?
 	 */
 	if (prev->vm_end == addr &&
-			is_mergeable_vma(prev, file, vm_flags) &&
 			can_vma_merge_after(prev, vm_flags, file, pgoff)) {
 		struct vm_area_struct *next;
 		int need_up = 0;
@@ -443,12 +443,12 @@ static int vma_merge(struct mm_struct *m
 
 			mm->map_count--;
 			kmem_cache_free(vm_area_cachep, next);
-			return 1;
+			return prev;
 		}
 		spin_unlock(lock);
 		if (need_up)
 			up(i_shared_sem);
-		return 1;
+		return prev;
 	}
 
 	/*
@@ -459,7 +459,7 @@ static int vma_merge(struct mm_struct *m
  merge_next:
 		if (!can_vma_merge_before(prev, vm_flags, file,
 				pgoff, (end - addr) >> PAGE_SHIFT))
-			return 0;
+			return NULL;
 		if (end == prev->vm_start) {
 			if (file)
 				down(i_shared_sem);
@@ -469,11 +469,11 @@ static int vma_merge(struct mm_struct *m
 			spin_unlock(lock);
 			if (file)
 				up(i_shared_sem);
-			return 1;
+			return prev;
 		}
 	}
 
-	return 0;
+	return NULL;
 }
 
 /*
@@ -728,7 +728,7 @@ unmap_and_free_vma:
 	fput(file);
 
 	/* Undo any partial mapping done by a device driver. */
-	zap_page_range(vma, vma->vm_start, vma->vm_end - vma->vm_start);
+	zap_page_range(vma, vma->vm_start, vma->vm_end - vma->vm_start, NULL);
 free_vma:
 	kmem_cache_free(vm_area_cachep, vma);
 unacct_error:
@@ -1160,7 +1160,7 @@ static void unmap_region(struct mm_struc
 
 	lru_add_drain();
 	tlb = tlb_gather_mmu(mm, 0);
-	unmap_vmas(&tlb, mm, vma, start, end, &nr_accounted);
+	unmap_vmas(&tlb, mm, vma, start, end, &nr_accounted, NULL);
 	vm_unacct_memory(nr_accounted);
 
 	if (is_hugepage_only_range(start, end - start))
@@ -1446,7 +1446,7 @@ void exit_mmap(struct mm_struct *mm)
 	flush_cache_mm(mm);
 	/* Use ~0UL here to ensure all VMAs in the mm are unmapped */
 	mm->map_count -= unmap_vmas(&tlb, mm, mm->mmap, 0,
-					~0UL, &nr_accounted);
+					~0UL, &nr_accounted, NULL);
 	vm_unacct_memory(nr_accounted);
 	BUG_ON(mm->map_count);	/* This is just debugging */
 	clear_page_tables(tlb, FIRST_USER_PGD_NR, USER_PTRS_PER_PGD);
@@ -1492,5 +1492,45 @@ void insert_vm_struct(struct mm_struct *
 	if (__vma && __vma->vm_start < vma->vm_end)
 		BUG();
 	vma_link(mm, vma, prev, rb_link, rb_parent);
-	validate_mm(mm);
+}
+
+/*
+ * Copy the vma structure to a new location in the same mm,
+ * prior to moving page table entries, to effect an mremap move.
+ */
+struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
+	unsigned long addr, unsigned long len, unsigned long pgoff)
+{
+	struct vm_area_struct *vma = *vmap;
+	unsigned long vma_start = vma->vm_start;
+	struct mm_struct *mm = vma->vm_mm;
+	struct vm_area_struct *new_vma, *prev;
+	struct rb_node **rb_link, *rb_parent;
+
+	find_vma_prepare(mm, addr, &prev, &rb_link, &rb_parent);
+	new_vma = vma_merge(mm, prev, rb_parent, addr, addr + len,
+			vma->vm_flags, vma->vm_file, pgoff);
+	if (new_vma) {
+		/*
+		 * Source vma may have been merged into new_vma
+		 */
+		if (vma_start >= new_vma->vm_start &&
+		    vma_start < new_vma->vm_end)
+			*vmap = new_vma;
+	} else {
+		new_vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
+		if (new_vma) {
+			*new_vma = *vma;
+			INIT_LIST_HEAD(&new_vma->shared);
+			new_vma->vm_start = addr;
+			new_vma->vm_end = addr + len;
+			new_vma->vm_pgoff = pgoff;
+			if (new_vma->vm_file)
+				get_file(new_vma->vm_file);
+			if (new_vma->vm_ops && new_vma->vm_ops->open)
+				new_vma->vm_ops->open(new_vma);
+			vma_link(mm, new_vma, prev, rb_link, rb_parent);
+		}
+	}
+	return new_vma;
 }
--- diff/mm/mprotect.c	2004-04-05 12:57:08.000000000 +0100
+++ source/mm/mprotect.c	2004-04-21 10:45:36.026226680 +0100
@@ -114,10 +114,11 @@ static int
 mprotect_attempt_merge(struct vm_area_struct *vma, struct vm_area_struct *prev,
 		unsigned long end, int newflags)
 {
-	struct mm_struct * mm = vma->vm_mm;
+	struct mm_struct * mm;
 
 	if (!prev || !vma)
 		return 0;
+	mm = vma->vm_mm;
 	if (prev->vm_end != vma->vm_start)
 		return 0;
 	if (!can_vma_merge(prev, newflags))
--- diff/mm/mremap.c	2004-02-18 08:54:13.000000000 +0000
+++ source/mm/mremap.c	2004-04-21 10:45:36.027226528 +0100
@@ -15,7 +15,7 @@
 #include <linux/swap.h>
 #include <linux/fs.h>
 #include <linux/highmem.h>
-#include <linux/rmap-locking.h>
+#include <linux/rmap.h>
 #include <linux/security.h>
 
 #include <asm/uaccess.h>
@@ -79,31 +79,21 @@ static inline pte_t *alloc_one_pte_map(s
 	return pte;
 }
 
-static int
+static void
 copy_one_pte(struct vm_area_struct *vma, unsigned long old_addr,
 	     pte_t *src, pte_t *dst, struct pte_chain **pte_chainp)
 {
-	int error = 0;
-	pte_t pte;
-	struct page *page = NULL;
+	pte_t pte = ptep_clear_flush(vma, old_addr, src);
+	set_pte(dst, pte);
 
-	if (pte_present(*src))
-		page = pte_page(*src);
-
-	if (!pte_none(*src)) {
-		if (page)
+	if (pte_present(pte)) {
+		unsigned long pfn = pte_pfn(pte);
+		if (pfn_valid(pfn)) {
+			struct page *page = pfn_to_page(pfn);
 			page_remove_rmap(page, src);
-		pte = ptep_clear_flush(vma, old_addr, src);
-		if (!dst) {
-			/* No dest?  We must put it back. */
-			dst = src;
-			error++;
-		}
-		set_pte(dst, pte);
-		if (page)
 			*pte_chainp = page_add_rmap(page, dst, *pte_chainp);
+		}
 	}
-	return error;
 }
 
 static int
@@ -140,8 +130,11 @@ move_one_page(struct vm_area_struct *vma
 		 * page_table_lock, we should re-check the src entry...
 		 */
 		if (src) {
-			error = copy_one_pte(vma, old_addr, src,
+			if (dst)
+				copy_one_pte(vma, old_addr, src,
 						dst, &pte_chain);
+			else
+				error = -ENOMEM;
 			pte_unmap_nested(src);
 		}
 		pte_unmap(dst);
@@ -155,7 +148,7 @@ out:
 static int move_page_tables(struct vm_area_struct *vma,
 	unsigned long new_addr, unsigned long old_addr, unsigned long len)
 {
-	unsigned long offset = len;
+	unsigned long offset;
 
 	flush_cache_range(vma, old_addr, old_addr + len);
 
@@ -164,137 +157,95 @@ static int move_page_tables(struct vm_ar
 	 * easy way out on the assumption that most remappings will be
 	 * only a few pages.. This also makes error recovery easier.
 	 */
-	while (offset) {
-		offset -= PAGE_SIZE;
-		if (move_one_page(vma, old_addr + offset, new_addr + offset))
-			goto oops_we_failed;
+	for (offset = 0; offset < len; offset += PAGE_SIZE) {
+		if (move_one_page(vma, old_addr+offset, new_addr+offset) < 0)
+			break;
 	}
-	return 0;
-
-	/*
-	 * Ok, the move failed because we didn't have enough pages for
-	 * the new page table tree. This is unlikely, but we have to
-	 * take the possibility into account. In that case we just move
-	 * all the pages back (this will work, because we still have
-	 * the old page tables)
-	 */
-oops_we_failed:
-	flush_cache_range(vma, new_addr, new_addr + len);
-	while ((offset += PAGE_SIZE) < len)
-		move_one_page(vma, new_addr + offset, old_addr + offset);
-	zap_page_range(vma, new_addr, len);
-	return -1;
+	return offset;
 }
 
 static unsigned long move_vma(struct vm_area_struct *vma,
-	unsigned long addr, unsigned long old_len, unsigned long new_len,
-	unsigned long new_addr)
+		unsigned long old_addr, unsigned long old_len,
+		unsigned long new_len, unsigned long new_addr)
 {
 	struct mm_struct *mm = vma->vm_mm;
-	struct vm_area_struct *new_vma, *next, *prev;
-	int allocated_vma;
+	struct address_space *mapping = NULL;
+	struct vm_area_struct *new_vma;
+	unsigned long vm_flags = vma->vm_flags;
+	unsigned long new_pgoff;
+	unsigned long moved_len;
+	unsigned long excess = 0;
 	int split = 0;
 
-	new_vma = NULL;
-	next = find_vma_prev(mm, new_addr, &prev);
-	if (next) {
-		if (prev && prev->vm_end == new_addr &&
-		    can_vma_merge(prev, vma->vm_flags) && !vma->vm_file &&
-					!(vma->vm_flags & VM_SHARED)) {
-			spin_lock(&mm->page_table_lock);
-			prev->vm_end = new_addr + new_len;
-			spin_unlock(&mm->page_table_lock);
-			new_vma = prev;
-			if (next != prev->vm_next)
-				BUG();
-			if (prev->vm_end == next->vm_start &&
-					can_vma_merge(next, prev->vm_flags)) {
-				spin_lock(&mm->page_table_lock);
-				prev->vm_end = next->vm_end;
-				__vma_unlink(mm, next, prev);
-				spin_unlock(&mm->page_table_lock);
-				if (vma == next)
-					vma = prev;
-				mm->map_count--;
-				kmem_cache_free(vm_area_cachep, next);
-			}
-		} else if (next->vm_start == new_addr + new_len &&
-			  	can_vma_merge(next, vma->vm_flags) &&
-				!vma->vm_file && !(vma->vm_flags & VM_SHARED)) {
-			spin_lock(&mm->page_table_lock);
-			next->vm_start = new_addr;
-			spin_unlock(&mm->page_table_lock);
-			new_vma = next;
-		}
-	} else {
-		prev = find_vma(mm, new_addr-1);
-		if (prev && prev->vm_end == new_addr &&
-		    can_vma_merge(prev, vma->vm_flags) && !vma->vm_file &&
-				!(vma->vm_flags & VM_SHARED)) {
-			spin_lock(&mm->page_table_lock);
-			prev->vm_end = new_addr + new_len;
-			spin_unlock(&mm->page_table_lock);
-			new_vma = prev;
-		}
+	/*
+	 * We'd prefer to avoid failure later on in do_munmap:
+	 * which may split one vma into three before unmapping.
+	 */
+	if (mm->map_count >= sysctl_max_map_count - 3)
+		return -ENOMEM;
+
+	new_pgoff = vma->vm_pgoff + ((old_addr - vma->vm_start) >> PAGE_SHIFT);
+	new_vma = copy_vma(&vma, new_addr, new_len, new_pgoff);
+	if (!new_vma)
+		return -ENOMEM;
+
+	if (vma->vm_file) {
+		/*
+		 * Subtle point from Rajesh Venkatasubramanian: before
+		 * moving file-based ptes, we must lock vmtruncate out,
+		 * since it might clean the dst vma before the src vma,
+		 * and we propagate stale pages into the dst afterward.
+		 */
+		mapping = vma->vm_file->f_mapping;
+		down(&mapping->i_shared_sem);
+	}
+	moved_len = move_page_tables(vma, new_addr, old_addr, old_len);
+	if (moved_len < old_len) {
+		/*
+		 * On error, move entries back from new area to old,
+		 * which will succeed since page tables still there,
+		 * and then proceed to unmap new area instead of old.
+		 */
+		move_page_tables(new_vma, old_addr, new_addr, moved_len);
+		vma = new_vma;
+		old_len = new_len;
+		old_addr = new_addr;
+		new_addr = -ENOMEM;
 	}
+	if (mapping)
+		up(&mapping->i_shared_sem);
 
-	allocated_vma = 0;
-	if (!new_vma) {
-		new_vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
-		if (!new_vma)
-			goto out;
-		allocated_vma = 1;
-	}
-
-	if (!move_page_tables(vma, new_addr, addr, old_len)) {
-		unsigned long vm_locked = vma->vm_flags & VM_LOCKED;
-
-		if (allocated_vma) {
-			*new_vma = *vma;
-			INIT_LIST_HEAD(&new_vma->shared);
-			new_vma->vm_start = new_addr;
-			new_vma->vm_end = new_addr+new_len;
-			new_vma->vm_pgoff += (addr-vma->vm_start) >> PAGE_SHIFT;
-			if (new_vma->vm_file)
-				get_file(new_vma->vm_file);
-			if (new_vma->vm_ops && new_vma->vm_ops->open)
-				new_vma->vm_ops->open(new_vma);
-			insert_vm_struct(current->mm, new_vma);
-		}
+	/* Conceal VM_ACCOUNT so old reservation is not undone */
+	if (vm_flags & VM_ACCOUNT) {
+		vma->vm_flags &= ~VM_ACCOUNT;
+		excess = vma->vm_end - vma->vm_start - old_len;
+		if (old_addr > vma->vm_start &&
+		    old_addr + old_len < vma->vm_end)
+			split = 1;
+	}
 
-		/* Conceal VM_ACCOUNT so old reservation is not undone */
-		if (vma->vm_flags & VM_ACCOUNT) {
-			vma->vm_flags &= ~VM_ACCOUNT;
-			if (addr > vma->vm_start) {
-				if (addr + old_len < vma->vm_end)
-					split = 1;
-			} else if (addr + old_len == vma->vm_end)
-				vma = NULL;	/* it will be removed */
-		} else
-			vma = NULL;		/* nothing more to do */
-
-		do_munmap(current->mm, addr, old_len);
-
-		/* Restore VM_ACCOUNT if one or two pieces of vma left */
-		if (vma) {
-			vma->vm_flags |= VM_ACCOUNT;
-			if (split)
-				vma->vm_next->vm_flags |= VM_ACCOUNT;
-		}
+	if (do_munmap(mm, old_addr, old_len) < 0) {
+		/* OOM: unable to split vma, just get accounts right */
+		vm_unacct_memory(excess >> PAGE_SHIFT);
+		excess = 0;
+	}
 
-		current->mm->total_vm += new_len >> PAGE_SHIFT;
-		if (vm_locked) {
-			current->mm->locked_vm += new_len >> PAGE_SHIFT;
-			if (new_len > old_len)
-				make_pages_present(new_addr + old_len,
-						   new_addr + new_len);
-		}
-		return new_addr;
+	/* Restore VM_ACCOUNT if one or two pieces of vma left */
+	if (excess) {
+		vma->vm_flags |= VM_ACCOUNT;
+		if (split)
+			vma->vm_next->vm_flags |= VM_ACCOUNT;
 	}
-	if (allocated_vma)
-		kmem_cache_free(vm_area_cachep, new_vma);
- out:
-	return -ENOMEM;
+
+	mm->total_vm += new_len >> PAGE_SHIFT;
+	if (vm_flags & VM_LOCKED) {
+		mm->locked_vm += new_len >> PAGE_SHIFT;
+		if (new_len > old_len)
+			make_pages_present(new_addr + old_len,
+					   new_addr + new_len);
+	}
+
+	return new_addr;
 }
 
 /*
--- diff/mm/page-writeback.c	2004-02-09 10:36:12.000000000 +0000
+++ source/mm/page-writeback.c	2004-04-21 10:45:36.027226528 +0100
@@ -28,6 +28,7 @@
 #include <linux/smp.h>
 #include <linux/sysctl.h>
 #include <linux/cpu.h>
+#include <linux/syscalls.h>
 
 /*
  * The maximum number of pages to writeout in a single bdflush/kupdate
@@ -81,6 +82,16 @@ int dirty_writeback_centisecs = 5 * 100;
  */
 int dirty_expire_centisecs = 30 * 100;
 
+/*
+ * Flag that makes the machine dump writes/reads and block dirtyings.
+ */
+int block_dump;
+
+/*
+ * Flag that puts the machine in "laptop mode".
+ */
+int laptop_mode;
+
 /* End of sysctl-exported parameters */
 
 
@@ -195,7 +206,19 @@ static void balance_dirty_pages(struct a
 	if (nr_reclaimable + ps.nr_writeback <= dirty_thresh)
 		dirty_exceeded = 0;
 
-	if (!writeback_in_progress(bdi) && nr_reclaimable > background_thresh)
+	if (writeback_in_progress(bdi))
+		return;		/* pdflush is already working this queue */
+
+	/*
+	 * In laptop mode, we wait until hitting the higher threshold before
+	 * starting background writeout, and then write out all the way down
+	 * to the lower threshold.  So slow writers cause minimal disk activity.
+	 *
+	 * In normal mode, we start background writeout at the lower
+	 * background_thresh, to keep the amount of dirty memory low.
+	 */
+	if ((laptop_mode && pages_written) ||
+	     (!laptop_mode && (nr_reclaimable > background_thresh)))
 		pdflush_operation(background_writeout, 0);
 }
 
@@ -261,13 +284,13 @@ static void background_writeout(unsigned
 			break;
 		wbc.encountered_congestion = 0;
 		wbc.nr_to_write = MAX_WRITEBACK_PAGES;
+		wbc.pages_skipped = 0;
 		writeback_inodes(&wbc);
 		min_pages -= MAX_WRITEBACK_PAGES - wbc.nr_to_write;
-		if (wbc.nr_to_write > 0) {
+		if (wbc.nr_to_write > 0 || wbc.pages_skipped > 0) {
 			/* Wrote less than expected */
-			if (wbc.encountered_congestion)
-				blk_congestion_wait(WRITE, HZ/10);
-			else
+			blk_congestion_wait(WRITE, HZ/10);
+			if (!wbc.encountered_congestion)
 				break;
 		}
 	}
@@ -289,7 +312,13 @@ int wakeup_bdflush(long nr_pages)
 	return pdflush_operation(background_writeout, nr_pages);
 }
 
-static struct timer_list wb_timer;
+static void wb_timer_fn(unsigned long unused);
+static void laptop_timer_fn(unsigned long unused);
+
+static struct timer_list wb_timer =
+			TIMER_INITIALIZER(wb_timer_fn, 0, 0);
+static struct timer_list laptop_mode_wb_timer =
+			TIMER_INITIALIZER(laptop_timer_fn, 0, 0);
 
 /*
  * Periodic writeback of "old" data.
@@ -368,7 +397,36 @@ static void wb_timer_fn(unsigned long un
 {
 	if (pdflush_operation(wb_kupdate, 0) < 0)
 		mod_timer(&wb_timer, jiffies + HZ); /* delay 1 second */
+}
+
+static void laptop_flush(unsigned long unused)
+{
+	sys_sync();
+}
+
+static void laptop_timer_fn(unsigned long unused)
+{
+	pdflush_operation(laptop_flush, 0);
+}
 
+/*
+ * We've spun up the disk and we're in laptop mode: schedule writeback
+ * of all dirty data a few seconds from now.  If the flush is already scheduled
+ * then push it back - the user is still using the disk.
+ */
+void laptop_io_completion(void)
+{
+	mod_timer(&laptop_mode_wb_timer, jiffies + laptop_mode * HZ);
+}
+
+/*
+ * We're in laptop mode and we've just synced. The sync's writes will have
+ * caused another writeback to be scheduled by laptop_io_completion.
+ * Nothing needs to be written back anymore, so we unschedule the writeback.
+ */
+void laptop_sync_completion(void)
+{
+	del_timer(&laptop_mode_wb_timer);
 }
 
 /*
@@ -429,18 +487,15 @@ void __init page_writeback_init(void)
 		vm_dirty_ratio *= correction;
 		vm_dirty_ratio /= 100;
 	}
-
-	init_timer(&wb_timer);
-	wb_timer.expires = jiffies + (dirty_writeback_centisecs * HZ) / 100;
-	wb_timer.data = 0;
-	wb_timer.function = wb_timer_fn;
-	add_timer(&wb_timer);
+	mod_timer(&wb_timer, jiffies + (dirty_writeback_centisecs * HZ) / 100);
 	set_ratelimit();
 	register_cpu_notifier(&ratelimit_nb);
 }
 
 int do_writepages(struct address_space *mapping, struct writeback_control *wbc)
 {
+	if (wbc->nr_to_write <= 0)
+		return 0;
 	if (mapping->a_ops->writepages)
 		return mapping->a_ops->writepages(mapping, wbc);
 	return generic_writepages(mapping, wbc);
@@ -470,12 +525,8 @@ int write_one_page(struct page *page, in
 	if (wait)
 		wait_on_page_writeback(page);
 
-	spin_lock(&mapping->page_lock);
-	list_del(&page->list);
-	if (test_clear_page_dirty(page)) {
-		list_add(&page->list, &mapping->locked_pages);
+	if (clear_page_dirty_for_io(page)) {
 		page_cache_get(page);
-		spin_unlock(&mapping->page_lock);
 		ret = mapping->a_ops->writepage(page, &wbc);
 		if (ret == 0 && wait) {
 			wait_on_page_writeback(page);
@@ -484,8 +535,6 @@ int write_one_page(struct page *page, in
 		}
 		page_cache_release(page);
 	} else {
-		list_add(&page->list, &mapping->clean_pages);
-		spin_unlock(&mapping->page_lock);
 		unlock_page(page);
 	}
 	return ret;
@@ -493,9 +542,8 @@ int write_one_page(struct page *page, in
 EXPORT_SYMBOL(write_one_page);
 
 /*
- * For address_spaces which do not use buffers.  Just set the page's dirty bit
- * and move it to the dirty_pages list.  Also perform space reservation if
- * required.
+ * For address_spaces which do not use buffers.  Just tag the page as dirty in
+ * its radix tree.
  *
  * __set_page_dirty_nobuffers() may return -ENOSPC.  But if it does, the page
  * is still safe, as long as it actually manages to find some blocks at
@@ -513,15 +561,15 @@ int __set_page_dirty_nobuffers(struct pa
 		struct address_space *mapping = page->mapping;
 
 		if (mapping) {
-			spin_lock(&mapping->page_lock);
+			spin_lock_irq(&mapping->tree_lock);
 			if (page->mapping) {	/* Race with truncate? */
 				BUG_ON(page->mapping != mapping);
 				if (!mapping->backing_dev_info->memory_backed)
 					inc_page_state(nr_dirty);
-				list_del(&page->list);
-				list_add(&page->list, &mapping->dirty_pages);
+				radix_tree_tag_set(&mapping->page_tree,
+					page->index, PAGECACHE_TAG_DIRTY);
 			}
-			spin_unlock(&mapping->page_lock);
+			spin_unlock_irq(&mapping->tree_lock);
 			if (!PageSwapCache(page))
 				__mark_inode_dirty(mapping->host,
 							I_DIRTY_PAGES);
@@ -532,6 +580,24 @@ int __set_page_dirty_nobuffers(struct pa
 EXPORT_SYMBOL(__set_page_dirty_nobuffers);
 
 /*
+ * If the mapping doesn't provide a set_page_dirty a_op, then
+ * just fall through and assume that it wants buffer_heads.
+ */
+int fastcall set_page_dirty(struct page *page)
+{
+	struct address_space *mapping = page_mapping(page);
+	int (*spd)(struct page *);
+
+	if (!mapping) {
+		SetPageDirty(page);
+		return 0;
+	}
+	spd = mapping->a_ops->set_page_dirty;
+	return spd? (*spd)(page): __set_page_dirty_buffers(page);
+}
+EXPORT_SYMBOL(set_page_dirty);
+
+/*
  * set_page_dirty() is racy if the caller has no reference against
  * page->mapping->host, and if the page is unlocked.  This is because another
  * CPU could truncate the page off the mapping and then free the mapping.
@@ -558,13 +624,136 @@ EXPORT_SYMBOL(set_page_dirty_lock);
  */
 int test_clear_page_dirty(struct page *page)
 {
-	if (TestClearPageDirty(page)) {
-		struct address_space *mapping = page->mapping;
+	struct address_space *mapping = page_mapping(page);
+	unsigned long flags;
 
-		if (mapping && !mapping->backing_dev_info->memory_backed)
-			dec_page_state(nr_dirty);
-		return 1;
+	if (mapping) {
+		spin_lock_irqsave(&mapping->tree_lock, flags);
+		if (TestClearPageDirty(page)) {
+			radix_tree_tag_clear(&mapping->page_tree, page->index,
+						PAGECACHE_TAG_DIRTY);
+			spin_unlock_irqrestore(&mapping->tree_lock, flags);
+			if (!mapping->backing_dev_info->memory_backed)
+				dec_page_state(nr_dirty);
+			return 1;
+		}
+		spin_unlock_irqrestore(&mapping->tree_lock, flags);
+		return 0;
 	}
-	return 0;
+	return TestClearPageDirty(page);
 }
 EXPORT_SYMBOL(test_clear_page_dirty);
+
+/*
+ * Clear a page's dirty flag, while caring for dirty memory accounting.
+ * Returns true if the page was previously dirty.
+ *
+ * This is for preparing to put the page under writeout.  We leave the page
+ * tagged as dirty in the radix tree so that a concurrent write-for-sync
+ * can discover it via a PAGECACHE_TAG_DIRTY walk.  The ->writepage
+ * implementation will run either set_page_writeback() or set_page_dirty(),
+ * at which stage we bring the page's dirty flag and radix-tree dirty tag
+ * back into sync.
+ *
+ * This incoherency between the page's dirty flag and radix-tree tag is
+ * unfortunate, but it only exists while the page is locked.
+ */
+int clear_page_dirty_for_io(struct page *page)
+{
+	struct address_space *mapping = page_mapping(page);
+
+	if (mapping) {
+		if (TestClearPageDirty(page)) {
+			if (!mapping->backing_dev_info->memory_backed)
+				dec_page_state(nr_dirty);
+			return 1;
+		}
+		return 0;
+	}
+	return TestClearPageDirty(page);
+}
+EXPORT_SYMBOL(clear_page_dirty_for_io);
+
+/*
+ * Clear a page's dirty flag while ignoring dirty memory accounting
+ */
+int __clear_page_dirty(struct page *page)
+{
+	struct address_space *mapping = page_mapping(page);
+
+	if (mapping) {
+		unsigned long flags;
+
+		spin_lock_irqsave(&mapping->tree_lock, flags);
+		if (TestClearPageDirty(page)) {
+			radix_tree_tag_clear(&mapping->page_tree, page->index,
+						PAGECACHE_TAG_DIRTY);
+			spin_unlock_irqrestore(&mapping->tree_lock, flags);
+			return 1;
+		}
+		spin_unlock_irqrestore(&mapping->tree_lock, flags);
+		return 0;
+	}
+	return TestClearPageDirty(page);
+}
+
+int test_clear_page_writeback(struct page *page)
+{
+	struct address_space *mapping = page_mapping(page);
+	int ret;
+
+	if (mapping) {
+		unsigned long flags;
+
+		spin_lock_irqsave(&mapping->tree_lock, flags);
+		ret = TestClearPageWriteback(page);
+		if (ret)
+			radix_tree_tag_clear(&mapping->page_tree, page->index,
+						PAGECACHE_TAG_WRITEBACK);
+		spin_unlock_irqrestore(&mapping->tree_lock, flags);
+	} else {
+		ret = TestClearPageWriteback(page);
+	}
+	return ret;
+}
+
+int test_set_page_writeback(struct page *page)
+{
+	struct address_space *mapping = page_mapping(page);
+	int ret;
+
+	if (mapping) {
+		unsigned long flags;
+
+		spin_lock_irqsave(&mapping->tree_lock, flags);
+		ret = TestSetPageWriteback(page);
+		if (!ret)
+			radix_tree_tag_set(&mapping->page_tree, page->index,
+						PAGECACHE_TAG_WRITEBACK);
+		if (!PageDirty(page))
+			radix_tree_tag_clear(&mapping->page_tree, page->index,
+						PAGECACHE_TAG_DIRTY);
+		spin_unlock_irqrestore(&mapping->tree_lock, flags);
+	} else {
+		ret = TestSetPageWriteback(page);
+	}
+	return ret;
+
+}
+EXPORT_SYMBOL(test_set_page_writeback);
+
+/*
+ * Return true if any of the pages in the mapping are marged with the
+ * passed tag.
+ */
+int mapping_tagged(struct address_space *mapping, int tag)
+{
+	unsigned long flags;
+	int ret;
+
+	spin_lock_irqsave(&mapping->tree_lock, flags);
+	ret = radix_tree_tagged(&mapping->page_tree, tag);
+	spin_unlock_irqrestore(&mapping->tree_lock, flags);
+	return ret;
+}
+EXPORT_SYMBOL(mapping_tagged);
--- diff/mm/page_alloc.c	2004-04-05 12:57:08.000000000 +0100
+++ source/mm/page_alloc.c	2004-04-21 10:45:36.029226224 +0100
@@ -71,18 +71,22 @@ static int bad_range(struct zone *zone, 
 
 static void bad_page(const char *function, struct page *page)
 {
-	printk("Bad page state at %s (in process '%s', page %p)\n", function, current->comm, page);
-	printk("flags:0x%08lx mapping:%p mapped:%d count:%d\n",
+	printk(KERN_EMERG "Bad page state at %s (in process '%s', page %p)\n",
+		function, current->comm, page);
+	printk(KERN_EMERG "flags:0x%08lx mapping:%p mapped:%d count:%d\n",
 		(unsigned long)page->flags, page->mapping,
 		page_mapped(page), page_count(page));
-	printk("Backtrace:\n");
+	printk(KERN_EMERG "Backtrace:\n");
 	dump_stack();
-	printk("Trying to fix it up, but a reboot is needed\n");
+	printk(KERN_EMERG "Trying to fix it up, but a reboot is needed\n");
 	page->flags &= ~(1 << PG_private	|
 			1 << PG_locked	|
 			1 << PG_lru	|
 			1 << PG_active	|
 			1 << PG_dirty	|
+			1 << PG_maplock |
+			1 << PG_anon    |
+			1 << PG_swapcache |
 			1 << PG_writeback);
 	set_page_count(page, 0);
 	page->mapping = NULL;
@@ -99,13 +103,13 @@ static void bad_page(const char *functio
  *
  * The remaining PAGE_SIZE pages are called "tail pages".
  *
- * All pages have PG_compound set.  All pages have their lru.next pointing at
+ * All pages have PG_compound set.  All pages have their ->private pointing at
  * the head page (even the head page has this).
  *
- * The head page's lru.prev, if non-zero, holds the address of the compound
- * page's put_page() function.
+ * The first tail page's ->mapping, if non-zero, holds the address of the
+ * compound page's put_page() function.
  *
- * The order of the allocation is stored in the first tail page's lru.prev.
+ * The order of the allocation is stored in the first tail page's ->index
  * This is only for debug at present.  This usage means that zero-order pages
  * may not be compound.
  */
@@ -114,13 +118,13 @@ static void prep_compound_page(struct pa
 	int i;
 	int nr_pages = 1 << order;
 
-	page->lru.prev = NULL;
-	page[1].lru.prev = (void *)order;
+	page[1].mapping = 0;
+	page[1].index = order;
 	for (i = 0; i < nr_pages; i++) {
 		struct page *p = page + i;
 
 		SetPageCompound(p);
-		p->lru.next = (void *)page;
+		p->private = (unsigned long)page;
 	}
 }
 
@@ -129,7 +133,10 @@ static void destroy_compound_page(struct
 	int i;
 	int nr_pages = 1 << order;
 
-	if (page[1].lru.prev != (void *)order)
+	if (!PageCompound(page))
+		return;
+
+	if (page[1].index != order)
 		bad_page(__FUNCTION__, page);
 
 	for (i = 0; i < nr_pages; i++) {
@@ -137,7 +144,7 @@ static void destroy_compound_page(struct
 
 		if (!PageCompound(p))
 			bad_page(__FUNCTION__, page);
-		if (p->lru.next != (void *)page)
+		if (p->private != (unsigned long)page)
 			bad_page(__FUNCTION__, page);
 		ClearPageCompound(p);
 	}
@@ -199,13 +206,13 @@ static inline void __free_pages_bulk (st
 		buddy2 = base + page_idx;
 		BUG_ON(bad_range(zone, buddy1));
 		BUG_ON(bad_range(zone, buddy2));
-		list_del(&buddy1->list);
+		list_del(&buddy1->lru);
 		mask <<= 1;
 		area++;
 		index >>= 1;
 		page_idx &= mask;
 	}
-	list_add(&(base + page_idx)->list, &area->free_list);
+	list_add(&(base + page_idx)->lru, &area->free_list);
 }
 
 static inline void free_pages_check(const char *function, struct page *page)
@@ -220,6 +227,9 @@ static inline void free_pages_check(cons
 			1 << PG_active	|
 			1 << PG_reclaim	|
 			1 << PG_slab	|
+			1 << PG_maplock |
+			1 << PG_anon    |
+			1 << PG_swapcache |
 			1 << PG_writeback )))
 		bad_page(function, page);
 	if (PageDirty(page))
@@ -253,9 +263,9 @@ free_pages_bulk(struct zone *zone, int c
 	zone->all_unreclaimable = 0;
 	zone->pages_scanned = 0;
 	while (!list_empty(list) && count--) {
-		page = list_entry(list->prev, struct page, list);
+		page = list_entry(list->prev, struct page, lru);
 		/* have to delete it as __free_pages_bulk list manipulates */
-		list_del(&page->list);
+		list_del(&page->lru);
 		__free_pages_bulk(page, base, zone, area, mask, order);
 		ret++;
 	}
@@ -271,7 +281,7 @@ void __free_pages_ok(struct page *page, 
 	mod_page_state(pgfree, 1 << order);
 	for (i = 0 ; i < (1 << order) ; ++i)
 		free_pages_check(__FUNCTION__, page + i);
-	list_add(&page->list, &list);
+	list_add(&page->lru, &list);
 	kernel_map_pages(page, 1<<order, 0);
 	free_pages_bulk(page_zone(page), 1, &list, order);
 }
@@ -290,7 +300,7 @@ expand(struct zone *zone, struct page *p
 		area--;
 		high--;
 		size >>= 1;
-		list_add(&page->list, &area->free_list);
+		list_add(&page->lru, &area->free_list);
 		MARK_USED(index, high, area);
 		index += size;
 		page += size;
@@ -327,6 +337,9 @@ static void prep_new_page(struct page *p
 			1 << PG_active	|
 			1 << PG_dirty	|
 			1 << PG_reclaim	|
+			1 << PG_maplock |
+			1 << PG_anon    |
+			1 << PG_swapcache |
 			1 << PG_writeback )))
 		bad_page(__FUNCTION__, page);
 
@@ -353,8 +366,8 @@ static struct page *__rmqueue(struct zon
 		if (list_empty(&area->free_list))
 			continue;
 
-		page = list_entry(area->free_list.next, struct page, list);
-		list_del(&page->list);
+		page = list_entry(area->free_list.next, struct page, lru);
+		list_del(&page->lru);
 		index = page - zone->zone_mem_map;
 		if (current_order != MAX_ORDER-1)
 			MARK_USED(index, current_order, area);
@@ -384,7 +397,7 @@ static int rmqueue_bulk(struct zone *zon
 		if (page == NULL)
 			break;
 		allocated++;
-		list_add_tail(&page->list, list);
+		list_add_tail(&page->lru, list);
 	}
 	spin_unlock_irqrestore(&zone->lock, flags);
 	return allocated;
@@ -426,7 +439,7 @@ int is_head_of_free_region(struct page *
 	spin_lock_irqsave(&zone->lock, flags);
 	for (order = MAX_ORDER - 1; order >= 0; --order)
 		list_for_each(curr, &zone->free_area[order].free_list)
-			if (page == list_entry(curr, struct page, list)) {
+			if (page == list_entry(curr, struct page, lru)) {
 				spin_unlock_irqrestore(&zone->lock, flags);
 				return 1 << order;
 			}
@@ -464,7 +477,7 @@ static void fastcall free_hot_cold_page(
 	local_irq_save(flags);
 	if (pcp->count >= pcp->high)
 		pcp->count -= free_pages_bulk(zone, pcp->batch, &pcp->list, 0);
-	list_add(&page->list, &pcp->list);
+	list_add(&page->lru, &pcp->list);
 	pcp->count++;
 	local_irq_restore(flags);
 	put_cpu();
@@ -486,10 +499,12 @@ void fastcall free_cold_page(struct page
  * or two.
  */
 
-static struct page *buffered_rmqueue(struct zone *zone, int order, int cold)
+static struct page *
+buffered_rmqueue(struct zone *zone, int order, int gfp_flags)
 {
 	unsigned long flags;
 	struct page *page = NULL;
+	int cold = !!(gfp_flags & __GFP_COLD);
 
 	if (order == 0) {
 		struct per_cpu_pages *pcp;
@@ -500,8 +515,8 @@ static struct page *buffered_rmqueue(str
 			pcp->count += rmqueue_bulk(zone, 0,
 						pcp->batch, &pcp->list);
 		if (pcp->count) {
-			page = list_entry(pcp->list.next, struct page, list);
-			list_del(&page->list);
+			page = list_entry(pcp->list.next, struct page, lru);
+			list_del(&page->lru);
 			pcp->count--;
 		}
 		local_irq_restore(flags);
@@ -512,14 +527,14 @@ static struct page *buffered_rmqueue(str
 		spin_lock_irqsave(&zone->lock, flags);
 		page = __rmqueue(zone, order);
 		spin_unlock_irqrestore(&zone->lock, flags);
-		if (order && page)
-			prep_compound_page(page, order);
 	}
 
 	if (page != NULL) {
 		BUG_ON(bad_range(zone, page));
 		mod_page_state_zone(zone, pgalloc, 1 << order);
 		prep_new_page(page, order);
+		if (order && (gfp_flags & __GFP_COMP))
+			prep_compound_page(page, order);
 	}
 	return page;
 }
@@ -551,41 +566,36 @@ __alloc_pages(unsigned int gfp_mask, uns
 	struct reclaim_state reclaim_state;
 	struct task_struct *p = current;
 	int i;
-	int cold;
+	int alloc_type;
 	int do_retry;
 
 	might_sleep_if(wait);
 
-	cold = 0;
-	if (gfp_mask & __GFP_COLD)
-		cold = 1;
-
 	zones = zonelist->zones;  /* the list of zones suitable for gfp_mask */
 	if (zones[0] == NULL)     /* no zones in the zonelist */
 		return NULL;
 
+	alloc_type = zone_idx(zones[0]);
+
 	/* Go through the zonelist once, looking for a zone with enough free */
-	min = 1UL << order;
 	for (i = 0; zones[i] != NULL; i++) {
 		struct zone *z = zones[i];
-		unsigned long local_low;
+
+		min = (1<<order) + z->protection[alloc_type];
 
 		/*
-		 * This is the fabled 'incremental min'. We let real-time tasks
-		 * dip their real-time paws a little deeper into reserves.
+		 * We let real-time tasks dip their real-time paws a little
+		 * deeper into reserves.
 		 */
-		local_low = z->pages_low;
 		if (rt_task(p))
-			local_low >>= 1;
-		min += local_low;
+			min -= z->pages_low >> 1;
 
 		if (z->free_pages >= min ||
 				(!wait && z->free_pages >= z->pages_high)) {
-			page = buffered_rmqueue(z, order, cold);
+			page = buffered_rmqueue(z, order, gfp_mask);
 			if (page)
-		       		goto got_pg;
+				goto got_pg;
 		}
-		min += z->pages_low * sysctl_lower_zone_protection;
 	}
 
 	/* we're somewhat low on memory, failed to find what we needed */
@@ -593,24 +603,22 @@ __alloc_pages(unsigned int gfp_mask, uns
 		wakeup_kswapd(zones[i]);
 
 	/* Go through the zonelist again, taking __GFP_HIGH into account */
-	min = 1UL << order;
 	for (i = 0; zones[i] != NULL; i++) {
-		unsigned long local_min;
 		struct zone *z = zones[i];
 
-		local_min = z->pages_min;
+		min = (1<<order) + z->protection[alloc_type];
+
 		if (gfp_mask & __GFP_HIGH)
-			local_min >>= 2;
+			min -= z->pages_low >> 2;
 		if (rt_task(p))
-			local_min >>= 1;
-		min += local_min;
+			min -= z->pages_low >> 1;
+
 		if (z->free_pages >= min ||
 				(!wait && z->free_pages >= z->pages_high)) {
-			page = buffered_rmqueue(z, order, cold);
+			page = buffered_rmqueue(z, order, gfp_mask);
 			if (page)
 				goto got_pg;
 		}
-		min += local_min * sysctl_lower_zone_protection;
 	}
 
 	/* here we're in the low on memory slow path */
@@ -621,7 +629,7 @@ rebalance:
 		for (i = 0; zones[i] != NULL; i++) {
 			struct zone *z = zones[i];
 
-			page = buffered_rmqueue(z, order, cold);
+			page = buffered_rmqueue(z, order, gfp_mask);
 			if (page)
 				goto got_pg;
 		}
@@ -642,18 +650,17 @@ rebalance:
 	p->flags &= ~PF_MEMALLOC;
 
 	/* go through the zonelist yet one more time */
-	min = 1UL << order;
 	for (i = 0; zones[i] != NULL; i++) {
 		struct zone *z = zones[i];
 
-		min += z->pages_min;
+		min = (1UL << order) + z->protection[alloc_type];
+
 		if (z->free_pages >= min ||
 				(!wait && z->free_pages >= z->pages_high)) {
-			page = buffered_rmqueue(z, order, cold);
+			page = buffered_rmqueue(z, order, gfp_mask);
 			if (page)
 				goto got_pg;
 		}
-		min += z->pages_low * sysctl_lower_zone_protection;
 	}
 
 	/*
@@ -734,7 +741,7 @@ fastcall unsigned long __get_free_pages(
 	struct page * page;
 
 #ifdef CONFIG_NUMA
-	if (unlikely(!system_running))
+	if (unlikely(system_state == SYSTEM_BOOTING))
 		return get_boot_pages(gfp_mask, order);
 #endif
 	page = alloc_pages(gfp_mask, order);
@@ -1056,6 +1063,8 @@ void show_free_areas(void)
 		ps.nr_page_table_pages);
 
 	for_each_zone(zone) {
+		int i;
+
 		show_node(zone);
 		printk("%s"
 			" free:%lukB"
@@ -1075,6 +1084,10 @@ void show_free_areas(void)
 			K(zone->nr_inactive),
 			K(zone->present_pages)
 			);
+		printk("protections[]:");
+		for (i = 0; i < MAX_NR_ZONES; i++)
+			printk(" %lu", zone->protection[i]);
+		printk("\n");
 	}
 
 	for_each_zone(zone) {
@@ -1209,7 +1222,7 @@ static void __init build_zonelists(pg_da
 	local_node = pgdat->node_id;
 	load = numnodes;
 	prev_node = local_node;
-	CLEAR_BITMAP(used_mask, MAX_NUMNODES);
+	bitmap_zero(used_mask, MAX_NUMNODES);
 	while ((node = find_next_best_node(local_node, used_mask)) >= 0) {
 		/*
 		 * We don't want to pressure a particular node.
@@ -1272,7 +1285,7 @@ static void __init build_zonelists(pg_da
  			j = build_zonelists_node(NODE_DATA(node), zonelist, j, k);
  
 		zonelist->zones[j++] = NULL;
-	} 
+	}
 }
 
 #endif	/* CONFIG_NUMA */
@@ -1363,7 +1376,7 @@ void __init memmap_init_zone(struct page
 		set_page_zone(page, NODEZONE(nid, zone));
 		set_page_count(page, 0);
 		SetPageReserved(page);
-		INIT_LIST_HEAD(&page->list);
+		INIT_LIST_HEAD(&page->lru);
 #ifdef WANT_PAGE_VIRTUAL
 		/* The shift won't overflow because ZONE_NORMAL is below 4G. */
 		if (zone != ZONE_HIGHMEM)
@@ -1744,6 +1757,93 @@ void __init page_alloc_init(void)
 	hotcpu_notifier(page_alloc_cpu_notify, 0);
 }
 
+static unsigned long higherzone_val(struct zone *z, int max_zone,
+					int alloc_type)
+{
+	int z_idx = zone_idx(z);
+	struct zone *higherzone;
+	unsigned long pages;
+
+	/* there is no higher zone to get a contribution from */
+	if (z_idx == MAX_NR_ZONES-1)
+		return 0;
+
+	higherzone = &z->zone_pgdat->node_zones[z_idx+1];
+
+	/* We always start with the higher zone's protection value */
+	pages = higherzone->protection[alloc_type];
+
+	/*
+	 * We get a lower-zone-protection contribution only if there are
+	 * pages in the higher zone and if we're not the highest zone
+	 * in the current zonelist.  e.g., never happens for GFP_DMA. Happens
+	 * only for ZONE_DMA in a GFP_KERNEL allocation and happens for ZONE_DMA
+	 * and ZONE_NORMAL for a GFP_HIGHMEM allocation.
+	 */
+	if (higherzone->present_pages && z_idx < alloc_type)
+		pages += higherzone->pages_low * sysctl_lower_zone_protection;
+
+	return pages;
+}
+
+/*
+ * setup_per_zone_protection - called whenver min_free_kbytes or
+ *	sysctl_lower_zone_protection changes.  Ensures that each zone
+ *	has a correct pages_protected value, so an adequate number of
+ *	pages are left in the zone after a successful __alloc_pages().
+ *
+ *	This algorithm is way confusing.  I tries to keep the same behavior
+ *	as we had with the incremental min iterative algorithm.
+ */
+static void setup_per_zone_protection(void)
+{
+	struct pglist_data *pgdat;
+	struct zone *zones, *zone;
+	int max_zone;
+	int i, j;
+
+	for_each_pgdat(pgdat) {
+		zones = pgdat->node_zones;
+
+		for (i = 0, max_zone = 0; i < MAX_NR_ZONES; i++)
+			if (zones[i].present_pages)
+				max_zone = i;
+
+		/*
+		 * For each of the different allocation types:
+		 * GFP_DMA -> GFP_KERNEL -> GFP_HIGHMEM
+		 */
+		for (i = 0; i < MAX_NR_ZONES; i++) {
+			/*
+			 * For each of the zones:
+			 * ZONE_HIGHMEM -> ZONE_NORMAL -> ZONE_DMA
+			 */
+			for (j = MAX_NR_ZONES-1; j >= 0; j--) {
+				zone = &zones[j];
+
+				/*
+				 * We never protect zones that don't have memory
+				 * in them (j>max_zone) or zones that aren't in
+				 * the zonelists for a certain type of
+				 * allocation (j>i).  We have to assign these to
+				 * zero because the lower zones take
+				 * contributions from the higher zones.
+				 */
+				if (j > max_zone || j > i) {
+					zone->protection[i] = 0;
+					continue;
+				}
+				/*
+				 * The contribution of the next higher zone
+				 */
+				zone->protection[i] = higherzone_val(zone,
+								max_zone, i);
+				zone->protection[i] += zone->pages_low;
+			}
+		}
+	}
+}
+
 /*
  * setup_per_zone_pages_min - called when min_free_kbytes changes.  Ensures 
  *	that the pages_{min,low,high} values for each zone are set correctly 
@@ -1757,9 +1857,10 @@ static void setup_per_zone_pages_min(voi
 	unsigned long flags;
 
 	/* Calculate total number of !ZONE_HIGHMEM pages */
-	for_each_zone(zone)
+	for_each_zone(zone) {
 		if (!is_highmem(zone))
 			lowmem_pages += zone->present_pages;
+	}
 
 	for_each_zone(zone) {
 		spin_lock_irqsave(&zone->lru_lock, flags);
@@ -1827,13 +1928,14 @@ static int __init init_per_zone_pages_mi
 	if (min_free_kbytes > 16384)
 		min_free_kbytes = 16384;
 	setup_per_zone_pages_min();
+	setup_per_zone_protection();
 	return 0;
 }
 module_init(init_per_zone_pages_min)
 
 /*
  * min_free_kbytes_sysctl_handler - just a wrapper around proc_dointvec() so 
- *	that we can call setup_per_zone_pages_min() whenever min_free_kbytes 
+ *	that we can call two helper functions whenever min_free_kbytes
  *	changes.
  */
 int min_free_kbytes_sysctl_handler(ctl_table *table, int write, 
@@ -1841,5 +1943,19 @@ int min_free_kbytes_sysctl_handler(ctl_t
 {
 	proc_dointvec(table, write, file, buffer, length);
 	setup_per_zone_pages_min();
+	setup_per_zone_protection();
+	return 0;
+}
+
+/*
+ * lower_zone_protection_sysctl_handler - just a wrapper around
+ *	proc_dointvec() so that we can call setup_per_zone_protection()
+ *	whenever sysctl_lower_zone_protection changes.
+ */
+int lower_zone_protection_sysctl_handler(ctl_table *table, int write,
+		 struct file *file, void __user *buffer, size_t *length)
+{
+	proc_dointvec_minmax(table, write, file, buffer, length);
+	setup_per_zone_protection();
 	return 0;
 }
--- diff/mm/page_io.c	2002-12-16 09:26:07.000000000 +0000
+++ source/mm/page_io.c	2004-04-21 10:45:36.030226072 +0100
@@ -16,25 +16,20 @@
 #include <linux/swap.h>
 #include <linux/bio.h>
 #include <linux/swapops.h>
-#include <linux/buffer_head.h>	/* for block_sync_page() */
-#include <linux/mpage.h>
 #include <linux/writeback.h>
 #include <asm/pgtable.h>
 
-static struct bio *
-get_swap_bio(int gfp_flags, struct page *page, bio_end_io_t end_io)
+static struct bio *get_swap_bio(int gfp_flags, pgoff_t index,
+				struct page *page, bio_end_io_t end_io)
 {
 	struct bio *bio;
 
 	bio = bio_alloc(gfp_flags, 1);
 	if (bio) {
 		struct swap_info_struct *sis;
-		swp_entry_t entry;
+		swp_entry_t entry = { .val = index, };
 
-		BUG_ON(!PageSwapCache(page));
-		entry.val = page->index;
 		sis = get_swap_info_struct(swp_type(entry));
-
 		bio->bi_sector = map_swap_page(sis, swp_offset(entry)) *
 					(PAGE_SIZE >> 9);
 		bio->bi_bdev = sis->bdev;
@@ -90,23 +85,25 @@ static int end_swap_bio_read(struct bio 
 int swap_writepage(struct page *page, struct writeback_control *wbc)
 {
 	struct bio *bio;
-	int ret = 0;
+	int ret = 0, rw = WRITE;
 
 	if (remove_exclusive_swap_page(page)) {
 		unlock_page(page);
 		goto out;
 	}
-	bio = get_swap_bio(GFP_NOIO, page, end_swap_bio_write);
+	bio = get_swap_bio(GFP_NOIO, page->private, page, end_swap_bio_write);
 	if (bio == NULL) {
 		set_page_dirty(page);
 		unlock_page(page);
 		ret = -ENOMEM;
 		goto out;
 	}
+	if (wbc->sync_mode == WB_SYNC_ALL)
+		rw |= (1 << BIO_RW_SYNC);
 	inc_page_state(pswpout);
-	SetPageWriteback(page);
+	set_page_writeback(page);
 	unlock_page(page);
-	submit_bio(WRITE, bio);
+	submit_bio(rw, bio);
 out:
 	return ret;
 }
@@ -118,7 +115,7 @@ int swap_readpage(struct file *file, str
 
 	BUG_ON(!PageLocked(page));
 	ClearPageUptodate(page);
-	bio = get_swap_bio(GFP_KERNEL, page, end_swap_bio_read);
+	bio = get_swap_bio(GFP_KERNEL, page->private, page, end_swap_bio_read);
 	if (bio == NULL) {
 		unlock_page(page);
 		ret = -ENOMEM;
@@ -130,39 +127,34 @@ out:
 	return ret;
 }
 
-struct address_space_operations swap_aops = {
-	.writepage	= swap_writepage,
-	.readpage	= swap_readpage,
-	.sync_page	= block_sync_page,
-	.set_page_dirty	= __set_page_dirty_nobuffers,
-};
-
+#if defined(CONFIG_SOFTWARE_SUSPEND) || defined(CONFIG_PM_DISK)
 /*
  * A scruffy utility function to read or write an arbitrary swap page
- * and wait on the I/O.
+ * and wait on the I/O.  The caller must have a ref on the page.
+ *
+ * We use end_swap_bio_read() even for writes, because it happens to do what
+ * we want.
  */
 int rw_swap_page_sync(int rw, swp_entry_t entry, struct page *page)
 {
-	int ret;
-	struct writeback_control swap_wbc = {
-		.sync_mode = WB_SYNC_ALL,
-	};
+	struct bio *bio;
+	int ret = 0;
 
 	lock_page(page);
 
-	BUG_ON(page->mapping);
-	page->mapping = &swapper_space;
-	page->index = entry.val;
-
-	if (rw == READ) {
-		ret = swap_readpage(NULL, page);
-		wait_on_page_locked(page);
-	} else {
-		ret = swap_writepage(page, &swap_wbc);
-		wait_on_page_writeback(page);
+	bio = get_swap_bio(GFP_KERNEL, entry.val, page, end_swap_bio_read);
+	if (bio == NULL) {
+		unlock_page(page);
+		ret = -ENOMEM;
+		goto out;
 	}
-	page->mapping = NULL;
-	if (ret == 0 && (!PageUptodate(page) || PageError(page)))
+
+	submit_bio(rw | (1 << BIO_RW_SYNC), bio);
+	wait_on_page_locked(page);
+
+	if (!PageUptodate(page) || PageError(page))
 		ret = -EIO;
+out:
 	return ret;
 }
+#endif
--- diff/mm/pdflush.c	2004-04-05 12:57:08.000000000 +0100
+++ source/mm/pdflush.c	2004-04-21 10:45:36.030226072 +0100
@@ -107,7 +107,7 @@ static int __pdflush(struct pdflush_work
 
 		schedule();
 		if (current->flags & PF_FREEZE) {
-			refrigerator(PF_IOTHREAD);
+			refrigerator(PF_FREEZE);
 			spin_lock_irq(&pdflush_lock);
 			continue;
 		}
--- diff/mm/readahead.c	2004-04-05 12:57:08.000000000 +0100
+++ source/mm/readahead.c	2004-04-21 10:45:36.030226072 +0100
@@ -15,11 +15,16 @@
 #include <linux/backing-dev.h>
 #include <linux/pagevec.h>
 
+void default_unplug_io_fn(struct backing_dev_info *bdi)
+{
+}
+EXPORT_SYMBOL(default_unplug_io_fn);
+
 struct backing_dev_info default_backing_dev_info = {
 	.ra_pages	= (VM_MAX_READAHEAD * 1024) / PAGE_CACHE_SIZE,
 	.state		= 0,
+	.unplug_io_fn	= default_unplug_io_fn,
 };
-
 EXPORT_SYMBOL_GPL(default_backing_dev_info);
 
 /*
@@ -32,7 +37,6 @@ file_ra_state_init(struct file_ra_state 
 	ra->ra_pages = mapping->backing_dev_info->ra_pages;
 	ra->average = ra->ra_pages / 2;
 }
-
 EXPORT_SYMBOL(file_ra_state_init);
 
 /*
@@ -48,7 +52,7 @@ static inline unsigned long get_min_read
 	return (VM_MIN_READAHEAD * 1024) / PAGE_CACHE_SIZE;
 }
 
-#define list_to_page(head) (list_entry((head)->prev, struct page, list))
+#define list_to_page(head) (list_entry((head)->prev, struct page, lru))
 
 /**
  * read_cache_pages - populate an address space with some pages, and
@@ -72,7 +76,7 @@ int read_cache_pages(struct address_spac
 
 	while (!list_empty(pages)) {
 		page = list_to_page(pages);
-		list_del(&page->list);
+		list_del(&page->lru);
 		if (add_to_page_cache(page, mapping, page->index, GFP_KERNEL)) {
 			page_cache_release(page);
 			continue;
@@ -85,7 +89,7 @@ int read_cache_pages(struct address_spac
 				struct page *victim;
 
 				victim = list_to_page(pages);
-				list_del(&victim->list);
+				list_del(&victim->lru);
 				page_cache_release(victim);
 			}
 			break;
@@ -112,7 +116,7 @@ static int read_pages(struct address_spa
 	pagevec_init(&lru_pvec, 0);
 	for (page_idx = 0; page_idx < nr_pages; page_idx++) {
 		struct page *page = list_to_page(pages);
-		list_del(&page->list);
+		list_del(&page->lru);
 		if (!add_to_page_cache(page, mapping,
 					page->index, GFP_KERNEL)) {
 			mapping->a_ops->readpage(filp, page);
@@ -230,7 +234,7 @@ __do_page_cache_readahead(struct address
 	/*
 	 * Preallocate as many pages as we will need.
 	 */
-	spin_lock(&mapping->page_lock);
+	spin_lock_irq(&mapping->tree_lock);
 	for (page_idx = 0; page_idx < nr_to_read; page_idx++) {
 		unsigned long page_offset = offset + page_idx;
 		
@@ -241,16 +245,16 @@ __do_page_cache_readahead(struct address
 		if (page)
 			continue;
 
-		spin_unlock(&mapping->page_lock);
+		spin_unlock_irq(&mapping->tree_lock);
 		page = page_cache_alloc_cold(mapping);
-		spin_lock(&mapping->page_lock);
+		spin_lock_irq(&mapping->tree_lock);
 		if (!page)
 			break;
 		page->index = page_offset;
-		list_add(&page->list, &page_pool);
+		list_add(&page->lru, &page_pool);
 		ret++;
 	}
-	spin_unlock(&mapping->page_lock);
+	spin_unlock_irq(&mapping->tree_lock);
 
 	/*
 	 * Now start the IO.  We ignore I/O errors - if the page is not
--- diff/mm/rmap.c	2004-04-05 12:57:08.000000000 +0100
+++ source/mm/rmap.c	2004-04-21 10:45:36.031225920 +0100
@@ -13,7 +13,7 @@
 
 /*
  * Locking:
- * - the page->pte.chain is protected by the PG_chainlock bit,
+ * - the page->pte.chain is protected by the PG_maplock bit,
  *   which nests within the the mm->page_table_lock,
  *   which nests within the page lock.
  * - because swapout locking is opposite to the locking order
@@ -26,7 +26,7 @@
 #include <linux/swapops.h>
 #include <linux/slab.h>
 #include <linux/init.h>
-#include <linux/rmap-locking.h>
+#include <linux/rmap.h>
 #include <linux/cache.h>
 #include <linux/percpu.h>
 
@@ -35,7 +35,18 @@
 #include <asm/tlb.h>
 #include <asm/tlbflush.h>
 
-/* #define DEBUG_RMAP */
+/*
+ * Something oopsable to put for now in the page->mapping
+ * of an anonymous page, to test that it is ignored.
+ */
+#define ANON_MAPPING_DEBUG	((struct address_space *) 0xADB)
+
+static inline void clear_page_anon(struct page *page)
+{
+	BUG_ON(page->mapping != ANON_MAPPING_DEBUG);
+	page->mapping = NULL;
+	ClearPageAnon(page);
+}
 
 /*
  * Shared pages have a chain of pte_chain structures, used to locate
@@ -108,7 +119,7 @@ pte_chain_encode(struct pte_chain *pte_c
  *
  * Quick test_and_clear_referenced for all mappings to a page,
  * returns the number of processes which referenced the page.
- * Caller needs to hold the pte_chain_lock.
+ * Caller needs to hold the rmap lock.
  *
  * If the page has a single-entry pte_chain, collapse that back to a PageDirect
  * representation.  This way, it's only done under memory pressure.
@@ -175,11 +186,15 @@ page_add_rmap(struct page *page, pte_t *
 	if (PageReserved(page))
 		return pte_chain;
 
-	pte_chain_lock(page);
+	rmap_lock(page);
 
 	if (page->pte.direct == 0) {
 		page->pte.direct = pte_paddr;
 		SetPageDirect(page);
+		if (!page->mapping) {
+			SetPageAnon(page);
+			page->mapping = ANON_MAPPING_DEBUG;
+		}
 		inc_page_state(nr_mapped);
 		goto out;
 	}
@@ -208,7 +223,7 @@ page_add_rmap(struct page *page, pte_t *
 	cur_pte_chain->ptes[pte_chain_idx(cur_pte_chain) - 1] = pte_paddr;
 	cur_pte_chain->next_and_idx--;
 out:
-	pte_chain_unlock(page);
+	rmap_unlock(page);
 	return pte_chain;
 }
 
@@ -230,7 +245,7 @@ void fastcall page_remove_rmap(struct pa
 	if (!pfn_valid(page_to_pfn(page)) || PageReserved(page))
 		return;
 
-	pte_chain_lock(page);
+	rmap_lock(page);
 
 	if (!page_mapped(page))
 		goto out_unlock;	/* remap_page_range() from a driver? */
@@ -271,13 +286,15 @@ void fastcall page_remove_rmap(struct pa
 		}
 	}
 out:
-	if (page->pte.direct == 0 && page_test_and_clear_dirty(page))
-		set_page_dirty(page);
-	if (!page_mapped(page))
+	if (!page_mapped(page)) {
+		if (page_test_and_clear_dirty(page))
+			set_page_dirty(page);
+		if (PageAnon(page))
+			clear_page_anon(page);
 		dec_page_state(nr_mapped);
+	}
 out_unlock:
-	pte_chain_unlock(page);
-	return;
+	rmap_unlock(page);
 }
 
 /**
@@ -290,10 +307,9 @@ out_unlock:
  * to the locking order used by the page fault path, we use trylocks.
  * Locking:
  *	    page lock			shrink_list(), trylock
- *		pte_chain_lock		shrink_list()
+ *		rmap lock		shrink_list()
  *		    mm->page_table_lock	try_to_unmap_one(), trylock
  */
-static int FASTCALL(try_to_unmap_one(struct page *, pte_addr_t));
 static int fastcall try_to_unmap_one(struct page * page, pte_addr_t paddr)
 {
 	pte_t *ptep = rmap_ptep_map(paddr);
@@ -315,8 +331,7 @@ static int fastcall try_to_unmap_one(str
 		return SWAP_AGAIN;
 	}
 
-
-	/* During mremap, it's possible pages are not in a VMA. */
+	/* unmap_vmas drops page_table_lock with vma unlinked */
 	vma = find_vma(mm, address);
 	if (!vma) {
 		ret = SWAP_FAIL;
@@ -333,25 +348,23 @@ static int fastcall try_to_unmap_one(str
 	flush_cache_page(vma, address);
 	pte = ptep_clear_flush(vma, address, ptep);
 
-	if (PageSwapCache(page)) {
+	if (PageAnon(page)) {
+		swp_entry_t entry = { .val = page->private };
 		/*
 		 * Store the swap location in the pte.
 		 * See handle_pte_fault() ...
 		 */
-		swp_entry_t entry = { .val = page->index };
+		BUG_ON(!PageSwapCache(page));
 		swap_duplicate(entry);
 		set_pte(ptep, swp_entry_to_pte(entry));
 		BUG_ON(pte_file(*ptep));
 	} else {
-		unsigned long pgidx;
 		/*
 		 * If a nonlinear mapping then store the file page offset
 		 * in the pte.
 		 */
-		pgidx = (address - vma->vm_start) >> PAGE_SHIFT;
-		pgidx += vma->vm_pgoff;
-		pgidx >>= PAGE_CACHE_SHIFT - PAGE_SHIFT;
-		if (page->index != pgidx) {
+		BUG_ON(!page->mapping);
+		if (page->index != linear_page_index(vma, address)) {
 			set_pte(ptep, pgoff_to_pte(page->index));
 			BUG_ON(!pte_file(*ptep));
 		}
@@ -377,7 +390,7 @@ out_unlock:
  *
  * Tries to remove all the page table entries which are mapping this
  * page, used in the pageout path.  Caller must hold the page lock
- * and its pte chain lock.  Return values are:
+ * and its rmap lock.  Return values are:
  *
  * SWAP_SUCCESS	- we succeeded in removing all mappings
  * SWAP_AGAIN	- we missed a trylock, try again later
@@ -394,20 +407,15 @@ int fastcall try_to_unmap(struct page * 
 		BUG();
 	if (!PageLocked(page))
 		BUG();
-	/* We need backing store to swap out a page. */
-	if (!page->mapping)
-		BUG();
 
 	if (PageDirect(page)) {
 		ret = try_to_unmap_one(page, page->pte.direct);
 		if (ret == SWAP_SUCCESS) {
-			if (page_test_and_clear_dirty(page))
-				set_page_dirty(page);
 			page->pte.direct = 0;
 			ClearPageDirect(page);
 		}
 		goto out;
-	}		
+	}
 
 	start = page->pte.chain;
 	victim_i = pte_chain_idx(start);
@@ -439,9 +447,6 @@ int fastcall try_to_unmap(struct page * 
 				} else {
 					start->next_and_idx++;
 				}
-				if (page->pte.direct == 0 &&
-				    page_test_and_clear_dirty(page))
-					set_page_dirty(page);
 				break;
 			case SWAP_AGAIN:
 				/* Skip this pte, remembering status. */
@@ -454,8 +459,14 @@ int fastcall try_to_unmap(struct page * 
 		}
 	}
 out:
-	if (!page_mapped(page))
+	if (!page_mapped(page)) {
+		if (page_test_and_clear_dirty(page))
+			set_page_dirty(page);
+		if (PageAnon(page))
+			clear_page_anon(page);
 		dec_page_state(nr_mapped);
+		ret = SWAP_SUCCESS;
+	}
 	return ret;
 }
 
@@ -523,8 +534,8 @@ void __init pte_chain_init(void)
 {
 	pte_chain_cache = kmem_cache_create(	"pte_chain",
 						sizeof(struct pte_chain),
+						sizeof(struct pte_chain),
 						0,
-						SLAB_MUST_HWCACHE_ALIGN,
 						pte_chain_ctor,
 						NULL);
 
--- diff/mm/shmem.c	2004-04-05 12:57:08.000000000 +0100
+++ source/mm/shmem.c	2004-04-21 10:45:36.032225768 +0100
@@ -123,6 +123,42 @@ static inline struct shmem_sb_info *SHME
 	return sb->s_fs_info;
 }
 
+/*
+ * shmem_file_setup pre-accounts the whole fixed size of a VM object,
+ * for shared memory and for shared anonymous (/dev/zero) mappings
+ * (unless MAP_NORESERVE and sysctl_overcommit_memory <= 1),
+ * consistent with the pre-accounting of private mappings ...
+ */
+static inline int shmem_acct_size(unsigned long flags, loff_t size)
+{
+	return (flags & VM_ACCOUNT)?
+		security_vm_enough_memory(VM_ACCT(size)): 0;
+}
+
+static inline void shmem_unacct_size(unsigned long flags, loff_t size)
+{
+	if (flags & VM_ACCOUNT)
+		vm_unacct_memory(VM_ACCT(size));
+}
+
+/*
+ * ... whereas tmpfs objects are accounted incrementally as
+ * pages are allocated, in order to allow huge sparse files.
+ * shmem_getpage reports shmem_acct_block failure as -ENOSPC not -ENOMEM,
+ * so that a failure on a sparse tmpfs mapping will give SIGBUS not OOM.
+ */
+static inline int shmem_acct_block(unsigned long flags)
+{
+	return (flags & VM_ACCOUNT)?
+		0: security_vm_enough_memory(VM_ACCT(PAGE_CACHE_SIZE));
+}
+
+static inline void shmem_unacct_blocks(unsigned long flags, long pages)
+{
+	if (!(flags & VM_ACCOUNT))
+		vm_unacct_memory(pages * VM_ACCT(PAGE_CACHE_SIZE));
+}
+
 static struct super_operations shmem_ops;
 static struct address_space_operations shmem_aops;
 static struct file_operations shmem_file_operations;
@@ -133,6 +169,7 @@ static struct vm_operations_struct shmem
 static struct backing_dev_info shmem_backing_dev_info = {
 	.ra_pages	= 0,	/* No readahead */
 	.memory_backed	= 1,	/* Does not contribute to dirty memory */
+	.unplug_io_fn = default_unplug_io_fn,
 };
 
 LIST_HEAD(shmem_inodes);
@@ -173,6 +210,7 @@ static void shmem_recalc_inode(struct in
 		sbinfo->free_blocks += freed;
 		inode->i_blocks -= freed*BLOCKS_PER_PAGE;
 		spin_unlock(&sbinfo->stat_lock);
+		shmem_unacct_blocks(info->flags, freed);
 	}
 }
 
@@ -456,7 +494,7 @@ static void shmem_truncate(struct inode 
 			shmem_dir_unmap(dir);
 			if (empty) {
 				shmem_dir_free(empty);
-				info->alloced++;
+				shmem_free_block(inode);
 			}
 			empty = subdir;
 			cond_resched_lock(&info->lock);
@@ -479,19 +517,19 @@ static void shmem_truncate(struct inode 
 		else if (subdir) {
 			*dir = NULL;
 			shmem_dir_free(subdir);
-			info->alloced++;
+			shmem_free_block(inode);
 		}
 	}
 done1:
 	shmem_dir_unmap(dir-1);
 	if (empty) {
 		shmem_dir_free(empty);
-		info->alloced++;
+		shmem_free_block(inode);
 	}
 	if (info->next_index <= SHMEM_NR_DIRECT) {
 		shmem_dir_free(info->i_indirect);
 		info->i_indirect = NULL;
-		info->alloced++;
+		shmem_free_block(inode);
 	}
 done2:
 	BUG_ON(info->swapped > info->next_index);
@@ -516,20 +554,10 @@ static int shmem_notify_change(struct de
 {
 	struct inode *inode = dentry->d_inode;
 	struct page *page = NULL;
-	long change = 0;
 	int error;
 
-	if ((attr->ia_valid & ATTR_SIZE) && (attr->ia_size <= SHMEM_MAX_BYTES)) {
-		/*
-	 	 * Account swap file usage based on new file size,
-		 * but just let vmtruncate fail on out-of-range sizes.
-	 	 */
-		change = VM_ACCT(attr->ia_size) - VM_ACCT(inode->i_size);
-		if (change > 0) {
-			if (security_vm_enough_memory(change))
-				return -ENOMEM;
-		} else if (attr->ia_size < inode->i_size) {
-			vm_unacct_memory(-change);
+	if (attr->ia_valid & ATTR_SIZE) {
+		if (attr->ia_size < inode->i_size) {
 			/*
 			 * If truncating down to a partial page, then
 			 * if that page is already allocated, hold it
@@ -563,8 +591,6 @@ static int shmem_notify_change(struct de
 		error = inode_setattr(inode, attr);
 	if (page)
 		page_cache_release(page);
-	if (error)
-		vm_unacct_memory(change);
 	return error;
 }
 
@@ -577,8 +603,7 @@ static void shmem_delete_inode(struct in
 		spin_lock(&shmem_ilock);
 		list_del(&info->list);
 		spin_unlock(&shmem_ilock);
-		if (info->flags & VM_ACCOUNT)
-			vm_unacct_memory(VM_ACCT(inode->i_size));
+		shmem_unacct_size(info->flags, inode->i_size);
 		inode->i_size = 0;
 		shmem_truncate(inode);
 	}
@@ -909,7 +934,7 @@ repeat:
 		shmem_swp_unmap(entry);
 		sbinfo = SHMEM_SB(inode->i_sb);
 		spin_lock(&sbinfo->stat_lock);
-		if (sbinfo->free_blocks == 0) {
+		if (sbinfo->free_blocks == 0 || shmem_acct_block(info->flags)) {
 			spin_unlock(&sbinfo->stat_lock);
 			spin_unlock(&info->lock);
 			error = -ENOSPC;
@@ -923,6 +948,7 @@ repeat:
 			spin_unlock(&info->lock);
 			filepage = page_cache_alloc(mapping);
 			if (!filepage) {
+				shmem_unacct_blocks(info->flags, 1);
 				shmem_free_block(inode);
 				error = -ENOMEM;
 				goto failed;
@@ -940,6 +966,7 @@ repeat:
 					filepage, mapping, idx, GFP_ATOMIC)) {
 				spin_unlock(&info->lock);
 				page_cache_release(filepage);
+				shmem_unacct_blocks(info->flags, 1);
 				shmem_free_block(inode);
 				filepage = NULL;
 				if (error)
@@ -1028,11 +1055,7 @@ static int shmem_populate(struct vm_area
 		 	 * If a nonlinear mapping then store the file page
 			 * offset in the pte.
 			 */
-	    		unsigned long pgidx;
-			pgidx = (addr - vma->vm_start) >> PAGE_SHIFT;
-			pgidx += vma->vm_pgoff;
-			pgidx >>= PAGE_CACHE_SHIFT - PAGE_SHIFT;
-			if (pgoff != pgidx) {
+			if (pgoff != linear_page_index(vma, addr)) {
 	    			err = install_file_pte(mm, vma, addr, pgoff, prot);
 				if (err)
 		    			return err;
@@ -1094,7 +1117,6 @@ shmem_get_inode(struct super_block *sb, 
 		info = SHMEM_I(inode);
 		memset(info, 0, (char *)inode - (char *)info);
 		spin_lock_init(&info->lock);
-		info->flags = VM_ACCOUNT;
 		switch (mode & S_IFMT) {
 		default:
 			init_special_inode(inode, mode, dev);
@@ -1167,7 +1189,6 @@ shmem_file_write(struct file *file, cons
 	loff_t		pos;
 	unsigned long	written;
 	int		err;
-	loff_t		maxpos;
 
 	if ((ssize_t) count < 0)
 		return -EINVAL;
@@ -1184,15 +1205,6 @@ shmem_file_write(struct file *file, cons
 	if (err || !count)
 		goto out;
 
-	maxpos = inode->i_size;
-	if (maxpos < pos + count) {
-		maxpos = pos + count;
-		if (security_vm_enough_memory(VM_ACCT(maxpos) - VM_ACCT(inode->i_size))) {
-			err = -ENOMEM;
-			goto out;
-		}
-	}
-
 	err = remove_suid(file->f_dentry);
 	if (err)
 		goto out;
@@ -1267,10 +1279,6 @@ shmem_file_write(struct file *file, cons
 	*ppos = pos;
 	if (written)
 		err = written;
-
-	/* Short writes give back address space */
-	if (inode->i_size != maxpos)
-		vm_unacct_memory(VM_ACCT(maxpos) - VM_ACCT(inode->i_size));
 out:
 	up(&inode->i_sem);
 	return err;
@@ -1328,7 +1336,7 @@ static void do_shmem_file_read(struct fi
 			 * virtual addresses, take care about potential aliasing
 			 * before reading the page on the kernel side.
 			 */
-			if (!list_empty(&mapping->i_mmap_shared))
+			if (mapping_writably_mapped(mapping))
 				flush_dcache_page(page);
 			/*
 			 * Mark the page accessed if we read the beginning.
@@ -1551,13 +1559,8 @@ static int shmem_symlink(struct inode *d
 		memcpy(info, symname, len);
 		inode->i_op = &shmem_symlink_inline_operations;
 	} else {
-		if (security_vm_enough_memory(VM_ACCT(1))) {
-			iput(inode);
-			return -ENOMEM;
-		}
 		error = shmem_getpage(inode, 0, &page, SGP_WRITE, NULL);
 		if (error) {
-			vm_unacct_memory(VM_ACCT(1));
 			iput(inode);
 			return error;
 		}
@@ -1947,7 +1950,7 @@ struct file *shmem_file_setup(char *name
 	if (size > SHMEM_MAX_BYTES)
 		return ERR_PTR(-EINVAL);
 
-	if ((flags & VM_ACCOUNT) && security_vm_enough_memory(VM_ACCT(size)))
+	if (shmem_acct_size(flags, size))
 		return ERR_PTR(-ENOMEM);
 
 	error = -ENOMEM;
@@ -1969,7 +1972,7 @@ struct file *shmem_file_setup(char *name
 	if (!inode)
 		goto close_file;
 
-	SHMEM_I(inode)->flags &= flags;
+	SHMEM_I(inode)->flags = flags & VM_ACCOUNT;
 	d_instantiate(dentry, inode);
 	inode->i_size = size;
 	inode->i_nlink = 0;	/* It is unlinked */
@@ -1985,8 +1988,7 @@ close_file:
 put_dentry:
 	dput(dentry);
 put_memory:
-	if (flags & VM_ACCOUNT)
-		vm_unacct_memory(VM_ACCT(size));
+	shmem_unacct_size(flags, size);
 	return ERR_PTR(error);
 }
 
--- diff/mm/slab.c	2004-04-05 12:57:08.000000000 +0100
+++ source/mm/slab.c	2004-04-21 10:45:36.034225464 +0100
@@ -121,6 +121,14 @@
 /* Shouldn't this be in a header file somewhere? */
 #define	BYTES_PER_WORD		sizeof(void *)
 
+#ifndef cache_line_size
+#define cache_line_size()	L1_CACHE_BYTES
+#endif
+
+#ifndef ARCH_KMALLOC_MINALIGN
+#define ARCH_KMALLOC_MINALIGN 0
+#endif
+
 /* Legal flag mask for kmem_cache_create(). */
 #if DEBUG
 # define CREATE_MASK	(SLAB_DEBUG_INITIAL | SLAB_RED_ZONE | \
@@ -268,6 +276,7 @@ struct kmem_cache_s {
 	unsigned int		colour_off;	/* colour offset */
 	unsigned int		colour_next;	/* cache colouring */
 	kmem_cache_t		*slabp_cache;
+	unsigned int		slab_size;
 	unsigned int		dflags;		/* dynamic flags */
 
 	/* constructor func */
@@ -453,10 +462,10 @@ static int slab_break_gfp_order = BREAK_
  * global 'mem_map'. These are used to find the slab an obj belongs to.
  * With kfree(), these are used to find the cache which an obj belongs to.
  */
-#define	SET_PAGE_CACHE(pg,x)  ((pg)->list.next = (struct list_head *)(x))
-#define	GET_PAGE_CACHE(pg)    ((kmem_cache_t *)(pg)->list.next)
-#define	SET_PAGE_SLAB(pg,x)   ((pg)->list.prev = (struct list_head *)(x))
-#define	GET_PAGE_SLAB(pg)     ((struct slab *)(pg)->list.prev)
+#define	SET_PAGE_CACHE(pg,x)  ((pg)->lru.next = (struct list_head *)(x))
+#define	GET_PAGE_CACHE(pg)    ((kmem_cache_t *)(pg)->lru.next)
+#define	SET_PAGE_SLAB(pg,x)   ((pg)->lru.prev = (struct list_head *)(x))
+#define	GET_PAGE_SLAB(pg)     ((struct slab *)(pg)->lru.prev)
 
 /* These are the default caches for kmalloc. Custom caches can have other sizes. */
 struct cache_sizes malloc_sizes[] = {
@@ -490,8 +499,10 @@ static kmem_cache_t cache_cache = {
 	.objsize	= sizeof(kmem_cache_t),
 	.flags		= SLAB_NO_REAP,
 	.spinlock	= SPIN_LOCK_UNLOCKED,
-	.colour_off	= L1_CACHE_BYTES,
 	.name		= "kmem_cache",
+#if DEBUG
+	.reallen	= sizeof(kmem_cache_t),
+#endif
 };
 
 /* Guard access to the cache-chain. */
@@ -535,7 +546,7 @@ static inline struct array_cache *ac_dat
 }
 
 /* Cal the num objs, wastage, and bytes left over for a given slab size. */
-static void cache_estimate (unsigned long gfporder, size_t size,
+static void cache_estimate (unsigned long gfporder, size_t size, size_t align,
 		 int flags, size_t *left_over, unsigned int *num)
 {
 	int i;
@@ -548,7 +559,7 @@ static void cache_estimate (unsigned lon
 		extra = sizeof(kmem_bufctl_t);
 	}
 	i = 0;
-	while (i*size + L1_CACHE_ALIGN(base+i*extra) <= wastage)
+	while (i*size + ALIGN(base+i*extra, align) <= wastage)
 		i++;
 	if (i > 0)
 		i--;
@@ -558,7 +569,7 @@ static void cache_estimate (unsigned lon
 
 	*num = i;
 	wastage -= i*size;
-	wastage -= L1_CACHE_ALIGN(base+i*extra);
+	wastage -= ALIGN(base+i*extra, align);
 	*left_over = wastage;
 }
 
@@ -705,16 +716,20 @@ void __init kmem_cache_init(void)
 	init_MUTEX(&cache_chain_sem);
 	INIT_LIST_HEAD(&cache_chain);
 	list_add(&cache_cache.next, &cache_chain);
+	cache_cache.colour_off = cache_line_size();
 	cache_cache.array[smp_processor_id()] = &initarray_cache.cache;
 
-	cache_estimate(0, cache_cache.objsize, 0,
-			&left_over, &cache_cache.num);
+	cache_cache.objsize = ALIGN(cache_cache.objsize, cache_line_size());
+
+	cache_estimate(0, cache_cache.objsize, cache_line_size(), 0,
+				&left_over, &cache_cache.num);
 	if (!cache_cache.num)
 		BUG();
 
 	cache_cache.colour = left_over/cache_cache.colour_off;
 	cache_cache.colour_next = 0;
-
+	cache_cache.slab_size = ALIGN(cache_cache.num*sizeof(kmem_bufctl_t) +
+				sizeof(struct slab), cache_line_size());
 
 	/* 2+3) create the kmalloc caches */
 	sizes = malloc_sizes;
@@ -728,7 +743,7 @@ void __init kmem_cache_init(void)
 		 * allow tighter packing of the smaller caches. */
 		sizes->cs_cachep = kmem_cache_create(
 			names->name, sizes->cs_size,
-			0, SLAB_HWCACHE_ALIGN, NULL, NULL);
+			ARCH_KMALLOC_MINALIGN, 0, NULL, NULL);
 		if (!sizes->cs_cachep)
 			BUG();
 
@@ -740,7 +755,7 @@ void __init kmem_cache_init(void)
 
 		sizes->cs_dmacachep = kmem_cache_create(
 			names->name_dma, sizes->cs_size,
-			0, SLAB_CACHE_DMA|SLAB_HWCACHE_ALIGN, NULL, NULL);
+			ARCH_KMALLOC_MINALIGN, SLAB_CACHE_DMA, NULL, NULL);
 		if (!sizes->cs_dmacachep)
 			BUG();
 
@@ -1056,7 +1071,7 @@ static void slab_destroy (kmem_cache_t *
  * kmem_cache_create - Create a cache.
  * @name: A string which is used in /proc/slabinfo to identify this cache.
  * @size: The size of objects to be created in this cache.
- * @offset: The offset to use within the page.
+ * @align: The required alignment for the objects.
  * @flags: SLAB flags
  * @ctor: A constructor for the objects.
  * @dtor: A destructor for the objects.
@@ -1081,16 +1096,15 @@ static void slab_destroy (kmem_cache_t *
  * %SLAB_NO_REAP - Don't automatically reap this cache when we're under
  * memory pressure.
  *
- * %SLAB_HWCACHE_ALIGN - Align the objects in this cache to a hardware
- * cacheline.  This can be beneficial if you're counting cycles as closely
- * as davem.
+ * %SLAB_HWCACHE_ALIGN - This flag has no effect and will be removed soon.
+ *
  */
 kmem_cache_t *
-kmem_cache_create (const char *name, size_t size, size_t offset,
+kmem_cache_create (const char *name, size_t size, size_t align,
 	unsigned long flags, void (*ctor)(void*, kmem_cache_t *, unsigned long),
 	void (*dtor)(void*, kmem_cache_t *, unsigned long))
 {
-	size_t left_over, align, slab_size;
+	size_t left_over, slab_size;
 	kmem_cache_t *cachep = NULL;
 
 	/*
@@ -1101,7 +1115,7 @@ kmem_cache_create (const char *name, siz
 		(size < BYTES_PER_WORD) ||
 		(size > (1<<MAX_OBJ_ORDER)*PAGE_SIZE) ||
 		(dtor && !ctor) ||
-		(offset < 0 || offset > size)) {
+		(align < 0)) {
 			printk(KERN_ERR "%s: Early error in slab %s\n",
 					__FUNCTION__, name);
 			BUG();
@@ -1118,22 +1132,16 @@ kmem_cache_create (const char *name, siz
 
 #if FORCED_DEBUG
 	/*
-	 * Enable redzoning and last user accounting, except
-	 * - for caches with forced alignment: redzoning would violate the
-	 *   alignment
-	 * - for caches with large objects, if the increased size would
-	 *   increase the object size above the next power of two: caches
-	 *   with object sizes just above a power of two have a significant
-	 *   amount of internal fragmentation
+	 * Enable redzoning and last user accounting, except for caches with
+	 * large objects, if the increased size would increase the object size
+	 * above the next power of two: caches with object sizes just above a
+	 * power of two have a significant amount of internal fragmentation.
 	 */
-	if ((size < 4096 || fls(size-1) == fls(size-1+3*BYTES_PER_WORD))
-			&& !(flags & SLAB_MUST_HWCACHE_ALIGN)) {
+	if ((size < 4096 || fls(size-1) == fls(size-1+3*BYTES_PER_WORD)))
 		flags |= SLAB_RED_ZONE|SLAB_STORE_USER;
-	}
 	flags |= SLAB_POISON;
 #endif
 #endif
-
 	/*
 	 * Always checks flags, a caller might be expecting debug
 	 * support which isn't available.
@@ -1141,15 +1149,23 @@ kmem_cache_create (const char *name, siz
 	if (flags & ~CREATE_MASK)
 		BUG();
 
+	if (align) {
+		/* minimum supported alignment: */
+		if (align < BYTES_PER_WORD)
+			align = BYTES_PER_WORD;
+
+		/* combinations of forced alignment and advanced debugging is
+		 * not yet implemented.
+		 */
+		flags &= ~(SLAB_RED_ZONE|SLAB_STORE_USER);
+	}
+
 	/* Get cache's description obj. */
 	cachep = (kmem_cache_t *) kmem_cache_alloc(&cache_cache, SLAB_KERNEL);
 	if (!cachep)
 		goto opps;
 	memset(cachep, 0, sizeof(kmem_cache_t));
 
-#if DEBUG
-	cachep->reallen = size;
-#endif
 	/* Check that size is in terms of words.  This is needed to avoid
 	 * unaligned accesses for some archs when redzoning is used, and makes
 	 * sure any on-slab bufctl's are also correctly aligned.
@@ -1160,30 +1176,31 @@ kmem_cache_create (const char *name, siz
 	}
 	
 #if DEBUG
+	cachep->reallen = size;
+
 	if (flags & SLAB_RED_ZONE) {
-		/*
-		 * There is no point trying to honour cache alignment
-		 * when redzoning.
-		 */
-		flags &= ~SLAB_HWCACHE_ALIGN;
+		/* redzoning only works with word aligned caches */
+		align = BYTES_PER_WORD;
+
 		/* add space for red zone words */
 		cachep->dbghead += BYTES_PER_WORD;
 		size += 2*BYTES_PER_WORD;
 	}
 	if (flags & SLAB_STORE_USER) {
-		flags &= ~SLAB_HWCACHE_ALIGN;
-		size += BYTES_PER_WORD; /* add space */
+		/* user store requires word alignment and
+		 * one word storage behind the end of the real
+		 * object.
+		 */
+		align = BYTES_PER_WORD;
+		size += BYTES_PER_WORD;
 	}
 #if FORCED_DEBUG && defined(CONFIG_DEBUG_PAGEALLOC)
-	if (size > 128 && cachep->reallen > L1_CACHE_BYTES && size < PAGE_SIZE) {
+	if (size > 128 && cachep->reallen > cache_line_size() && size < PAGE_SIZE) {
 		cachep->dbghead += PAGE_SIZE - size;
 		size = PAGE_SIZE;
 	}
 #endif
 #endif
-	align = BYTES_PER_WORD;
-	if (flags & SLAB_HWCACHE_ALIGN)
-		align = L1_CACHE_BYTES;
 
 	/* Determine if the slab management is 'on' or 'off' slab. */
 	if (size >= (PAGE_SIZE>>3))
@@ -1193,13 +1210,16 @@ kmem_cache_create (const char *name, siz
 		 */
 		flags |= CFLGS_OFF_SLAB;
 
-	if (flags & SLAB_HWCACHE_ALIGN) {
-		/* Need to adjust size so that objs are cache aligned. */
-		/* Small obj size, can get at least two per cache line. */
+	if (!align) {
+		/* Default alignment: compile time specified l1 cache size.
+		 * Except if an object is really small, then squeeze multiple
+		 * into one cacheline.
+		 */
+		align = cache_line_size();
 		while (size <= align/2)
 			align /= 2;
-		size = (size+align-1)&(~(align-1));
 	}
+	size = ALIGN(size, align);
 
 	/* Cal size (in pages) of slabs, and the num of objs per slab.
 	 * This could be made much more intelligent.  For now, try to avoid
@@ -1209,7 +1229,7 @@ kmem_cache_create (const char *name, siz
 	do {
 		unsigned int break_flag = 0;
 cal_wastage:
-		cache_estimate(cachep->gfporder, size, flags,
+		cache_estimate(cachep->gfporder, size, align, flags,
 						&left_over, &cachep->num);
 		if (break_flag)
 			break;
@@ -1243,7 +1263,8 @@ next:
 		cachep = NULL;
 		goto opps;
 	}
-	slab_size = L1_CACHE_ALIGN(cachep->num*sizeof(kmem_bufctl_t)+sizeof(struct slab));
+	slab_size = ALIGN(cachep->num*sizeof(kmem_bufctl_t)
+				+ sizeof(struct slab), align);
 
 	/*
 	 * If the slab has been placed off-slab, and we have enough space then
@@ -1254,14 +1275,17 @@ next:
 		left_over -= slab_size;
 	}
 
-	/* Offset must be a multiple of the alignment. */
-	offset += (align-1);
-	offset &= ~(align-1);
-	if (!offset)
-		offset = L1_CACHE_BYTES;
-	cachep->colour_off = offset;
-	cachep->colour = left_over/offset;
+	if (flags & CFLGS_OFF_SLAB) {
+		/* really off slab. No need for manual alignment */
+		slab_size = cachep->num*sizeof(kmem_bufctl_t)+sizeof(struct slab);
+	}
 
+	cachep->colour_off = cache_line_size();
+	/* Offset must be a multiple of the alignment. */
+	if (cachep->colour_off < align)
+		cachep->colour_off = align;
+	cachep->colour = left_over/cachep->colour_off;
+	cachep->slab_size = slab_size;
 	cachep->flags = flags;
 	cachep->gfpflags = 0;
 	if (flags & SLAB_CACHE_DMA)
@@ -1543,8 +1567,7 @@ static inline struct slab* alloc_slabmgm
 			return NULL;
 	} else {
 		slabp = objp+colour_off;
-		colour_off += L1_CACHE_ALIGN(cachep->num *
-				sizeof(kmem_bufctl_t) + sizeof(struct slab));
+		colour_off += cachep->slab_size;
 	}
 	slabp->inuse = 0;
 	slabp->colouroff = colour_off;
--- diff/mm/swap.c	2004-04-05 12:57:08.000000000 +0100
+++ source/mm/swap.c	2004-04-21 10:45:36.035225312 +0100
@@ -34,6 +34,27 @@
 /* How many pages do we try to swap or page in/out together? */
 int page_cluster;
 
+#ifdef CONFIG_HUGETLB_PAGE
+
+void put_page(struct page *page)
+{
+	if (unlikely(PageCompound(page))) {
+		page = (struct page *)page->private;
+		if (put_page_testzero(page)) {
+			if (page[1].mapping) {	/* destructor? */
+				(*(void (*)(struct page *))page[1].mapping)(page);
+			} else {
+				__page_cache_release(page);
+			}
+		}
+		return;
+	}
+	if (!PageReserved(page) && put_page_testzero(page))
+		__page_cache_release(page);
+}
+EXPORT_SYMBOL(put_page);
+#endif
+
 /*
  * Writeback is about to end against a page which has been marked for immediate
  * reclaim.  If it still appears to be reclaimable, move it to the tail of the
@@ -70,7 +91,7 @@ int rotate_reclaimable_page(struct page 
 		list_add_tail(&page->lru, &zone->inactive_list);
 		inc_page_state(pgrotated);
 	}
-	if (!TestClearPageWriteback(page))
+	if (!test_clear_page_writeback(page))
 		BUG();
 	spin_unlock_irqrestore(&zone->lru_lock, flags);
 	return 0;
@@ -353,13 +374,21 @@ void pagevec_strip(struct pagevec *pvec)
  *
  * pagevec_lookup() returns the number of pages which were found.
  */
-unsigned int pagevec_lookup(struct pagevec *pvec, struct address_space *mapping,
-		pgoff_t start, unsigned int nr_pages)
+unsigned pagevec_lookup(struct pagevec *pvec, struct address_space *mapping,
+		pgoff_t start, unsigned nr_pages)
 {
 	pvec->nr = find_get_pages(mapping, start, nr_pages, pvec->pages);
 	return pagevec_count(pvec);
 }
 
+unsigned pagevec_lookup_tag(struct pagevec *pvec, struct address_space *mapping,
+		pgoff_t *index, int tag, unsigned nr_pages)
+{
+	pvec->nr = find_get_pages_tag(mapping, index, tag,
+					nr_pages, pvec->pages);
+	return pagevec_count(pvec);
+}
+
 
 #ifdef CONFIG_SMP
 /*
--- diff/mm/swap_state.c	2003-08-20 14:16:34.000000000 +0100
+++ source/mm/swap_state.c	2004-04-21 10:45:36.035225312 +0100
@@ -16,28 +16,24 @@
 
 #include <asm/pgtable.h>
 
-static struct backing_dev_info swap_backing_dev_info = {
-	.ra_pages	= 0,	/* No readahead */
-	.memory_backed	= 1,	/* Does not contribute to dirty memory */
+/*
+ * swapper_space is a fiction, retained to simplify the path through
+ * vmscan's shrink_list.  Only those fields initialized below are used.
+ */
+static struct address_space_operations swap_aops = {
+	.writepage	= swap_writepage,
 };
 
-extern struct address_space_operations swap_aops;
+static struct backing_dev_info swap_backing_dev_info = {
+	.state		= 0,	/* uncongested */
+};
 
 struct address_space swapper_space = {
 	.page_tree	= RADIX_TREE_INIT(GFP_ATOMIC),
-	.page_lock	= SPIN_LOCK_UNLOCKED,
-	.clean_pages	= LIST_HEAD_INIT(swapper_space.clean_pages),
-	.dirty_pages	= LIST_HEAD_INIT(swapper_space.dirty_pages),
-	.io_pages	= LIST_HEAD_INIT(swapper_space.io_pages),
-	.locked_pages	= LIST_HEAD_INIT(swapper_space.locked_pages),
+	.tree_lock	= SPIN_LOCK_UNLOCKED,
+	.nrpages	= 0,	/* total_swapcache_pages */
 	.a_ops		= &swap_aops,
 	.backing_dev_info = &swap_backing_dev_info,
-	.i_mmap		= LIST_HEAD_INIT(swapper_space.i_mmap),
-	.i_mmap_shared	= LIST_HEAD_INIT(swapper_space.i_mmap_shared),
-	.i_shared_sem	= __MUTEX_INITIALIZER(swapper_space.i_shared_sem),
-	.truncate_count  = ATOMIC_INIT(0),
-	.private_lock	= SPIN_LOCK_UNLOCKED,
-	.private_list	= LIST_HEAD_INIT(swapper_space.private_list),
 };
 
 #define INC_CACHE_INFO(x)	do { swap_cache_info.x++; } while (0)
@@ -59,30 +55,55 @@ void show_swap_cache_info(void)
 		swap_cache_info.noent_race, swap_cache_info.exist_race);
 }
 
+/*
+ * __add_to_swap_cache resembles add_to_page_cache on swapper_space,
+ * but sets SwapCache flag and private instead of mapping and index.
+ */
+static int __add_to_swap_cache(struct page *page,
+		swp_entry_t entry, int gfp_mask)
+{
+	int error;
+
+	BUG_ON(PageSwapCache(page));
+	BUG_ON(PagePrivate(page));
+	error = radix_tree_preload(gfp_mask);
+	if (!error) {
+		page_cache_get(page);
+		spin_lock(&swapper_space.tree_lock);
+		error = radix_tree_insert(&swapper_space.page_tree,
+						entry.val, page);
+		if (!error) {
+			SetPageLocked(page);
+			SetPageSwapCache(page);
+			page->private = entry.val;
+			total_swapcache_pages++;
+			pagecache_acct(1);
+		} else
+			page_cache_release(page);
+		spin_unlock(&swapper_space.tree_lock);
+		radix_tree_preload_end();
+	}
+	return error;
+}
+
 static int add_to_swap_cache(struct page *page, swp_entry_t entry)
 {
 	int error;
 
-	if (page->mapping)
-		BUG();
 	if (!swap_duplicate(entry)) {
 		INC_CACHE_INFO(noent_race);
 		return -ENOENT;
 	}
-	error = add_to_page_cache(page, &swapper_space, entry.val, GFP_KERNEL);
+	error = __add_to_swap_cache(page, entry, GFP_KERNEL);
 	/*
 	 * Anon pages are already on the LRU, we don't run lru_cache_add here.
 	 */
-	if (error != 0) {
+	if (error) {
 		swap_free(entry);
 		if (error == -EEXIST)
 			INC_CACHE_INFO(exist_race);
 		return error;
 	}
-	if (!PageLocked(page))
-		BUG();
-	if (!PageSwapCache(page))
-		BUG();
 	INC_CACHE_INFO(add_total);
 	return 0;
 }
@@ -96,7 +117,12 @@ void __delete_from_swap_cache(struct pag
 	BUG_ON(!PageLocked(page));
 	BUG_ON(!PageSwapCache(page));
 	BUG_ON(PageWriteback(page));
-	__remove_from_page_cache(page);
+
+	radix_tree_delete(&swapper_space.page_tree, page->private);
+	page->private = 0;
+	ClearPageSwapCache(page);
+	total_swapcache_pages--;
+	pagecache_acct(-1);
 	INC_CACHE_INFO(del_total);
 }
 
@@ -140,8 +166,7 @@ int add_to_swap(struct page * page)
 		/*
 		 * Add it to the swap cache and mark it dirty
 		 */
-		err = add_to_page_cache(page, &swapper_space,
-					entry.val, GFP_ATOMIC);
+		err = __add_to_swap_cache(page, entry, GFP_ATOMIC);
 
 		if (pf_flags & PF_MEMALLOC)
 			current->flags |= PF_MEMALLOC;
@@ -149,8 +174,7 @@ int add_to_swap(struct page * page)
 		switch (err) {
 		case 0:				/* Success */
 			SetPageUptodate(page);
-			ClearPageDirty(page);
-			set_page_dirty(page);
+			SetPageDirty(page);
 			INC_CACHE_INFO(add_total);
 			return 1;
 		case -EEXIST:
@@ -176,75 +200,48 @@ void delete_from_swap_cache(struct page 
 {
 	swp_entry_t entry;
 
+	BUG_ON(!PageSwapCache(page));
 	BUG_ON(!PageLocked(page));
 	BUG_ON(PageWriteback(page));
 	BUG_ON(PagePrivate(page));
   
-	entry.val = page->index;
+	entry.val = page->private;
 
-	spin_lock(&swapper_space.page_lock);
+	spin_lock(&swapper_space.tree_lock);
 	__delete_from_swap_cache(page);
-	spin_unlock(&swapper_space.page_lock);
+	spin_unlock(&swapper_space.tree_lock);
 
 	swap_free(entry);
 	page_cache_release(page);
 }
 
+/*
+ * Strange swizzling function only for use by shmem_writepage
+ */
 int move_to_swap_cache(struct page *page, swp_entry_t entry)
 {
-	struct address_space *mapping = page->mapping;
-	int err;
-
-	spin_lock(&swapper_space.page_lock);
-	spin_lock(&mapping->page_lock);
-
-	err = radix_tree_insert(&swapper_space.page_tree, entry.val, page);
-	if (!err) {
-		__remove_from_page_cache(page);
-		___add_to_page_cache(page, &swapper_space, entry.val);
-	}
-
-	spin_unlock(&mapping->page_lock);
-	spin_unlock(&swapper_space.page_lock);
-
+	int err = __add_to_swap_cache(page, entry, GFP_ATOMIC);
 	if (!err) {
+		remove_from_page_cache(page);
+		page_cache_release(page);	/* pagecache ref */
 		if (!swap_duplicate(entry))
 			BUG();
-		/* shift page from clean_pages to dirty_pages list */
-		BUG_ON(PageDirty(page));
-		set_page_dirty(page);
+		SetPageDirty(page);
 		INC_CACHE_INFO(add_total);
 	} else if (err == -EEXIST)
 		INC_CACHE_INFO(exist_race);
 	return err;
 }
 
+/*
+ * Strange swizzling function for shmem_getpage (and shmem_unuse)
+ */
 int move_from_swap_cache(struct page *page, unsigned long index,
 		struct address_space *mapping)
 {
-	swp_entry_t entry;
-	int err;
-
-	BUG_ON(!PageLocked(page));
-	BUG_ON(PageWriteback(page));
-	BUG_ON(PagePrivate(page));
-
-	entry.val = page->index;
-
-	spin_lock(&swapper_space.page_lock);
-	spin_lock(&mapping->page_lock);
-
-	err = radix_tree_insert(&mapping->page_tree, index, page);
+	int err = add_to_page_cache(page, mapping, index, GFP_ATOMIC);
 	if (!err) {
-		__delete_from_swap_cache(page);
-		___add_to_page_cache(page, mapping, index);
-	}
-
-	spin_unlock(&mapping->page_lock);
-	spin_unlock(&swapper_space.page_lock);
-
-	if (!err) {
-		swap_free(entry);
+		delete_from_swap_cache(page);
 		/* shift page from clean_pages to dirty_pages list */
 		ClearPageDirty(page);
 		set_page_dirty(page);
@@ -252,7 +249,6 @@ int move_from_swap_cache(struct page *pa
 	return err;
 }
 
-
 /* 
  * If we are the only user, then try to free up the swap cache. 
  * 
@@ -310,19 +306,17 @@ void free_pages_and_swap_cache(struct pa
  */
 struct page * lookup_swap_cache(swp_entry_t entry)
 {
-	struct page *found;
+	struct page *page;
 
-	found = find_get_page(&swapper_space, entry.val);
-	/*
-	 * Unsafe to assert PageSwapCache and mapping on page found:
-	 * if SMP nothing prevents swapoff from deleting this page from
-	 * the swap cache at this moment.  find_lock_page would prevent
-	 * that, but no need to change: we _have_ got the right page.
-	 */
-	INC_CACHE_INFO(find_total);
-	if (found)
+	spin_lock(&swapper_space.tree_lock);
+	page = radix_tree_lookup(&swapper_space.page_tree, entry.val);
+	if (page) {
+		page_cache_get(page);
 		INC_CACHE_INFO(find_success);
-	return found;
+	}
+	spin_unlock(&swapper_space.tree_lock);
+	INC_CACHE_INFO(find_total);
+	return page;
 }
 
 /* 
@@ -340,10 +334,14 @@ struct page * read_swap_cache_async(swp_
 		/*
 		 * First check the swap cache.  Since this is normally
 		 * called after lookup_swap_cache() failed, re-calling
-		 * that would confuse statistics: use find_get_page()
-		 * directly.
+		 * that would confuse statistics.
 		 */
-		found_page = find_get_page(&swapper_space, entry.val);
+		spin_lock(&swapper_space.tree_lock);
+		found_page = radix_tree_lookup(&swapper_space.page_tree,
+						entry.val);
+		if (found_page)
+			page_cache_get(found_page);
+		spin_unlock(&swapper_space.tree_lock);
 		if (found_page)
 			break;
 
--- diff/mm/swapfile.c	2004-04-05 12:57:08.000000000 +0100
+++ source/mm/swapfile.c	2004-04-21 10:45:36.037225008 +0100
@@ -21,8 +21,9 @@
 #include <linux/seq_file.h>
 #include <linux/init.h>
 #include <linux/module.h>
-#include <linux/rmap-locking.h>
+#include <linux/rmap.h>
 #include <linux/security.h>
+#include <linux/backing-dev.h>
 
 #include <asm/pgtable.h>
 #include <asm/tlbflush.h>
@@ -44,8 +45,71 @@ struct swap_list_t swap_list = {-1, -1};
 
 struct swap_info_struct swap_info[MAX_SWAPFILES];
 
+/*
+ * Array of backing blockdevs, for swap_unplug_fn.  We need this because the
+ * bdev->unplug_fn can sleep and we cannot hold swap_list_lock while calling
+ * the unplug_fn.  And swap_list_lock cannot be turned into a semaphore.
+ */
+static DECLARE_MUTEX(swap_bdevs_sem);
+static struct block_device *swap_bdevs[MAX_SWAPFILES];
+
 #define SWAPFILE_CLUSTER 256
 
+/*
+ * Caller holds swap_bdevs_sem
+ */
+static void install_swap_bdev(struct block_device *bdev)
+{
+	int i;
+
+	for (i = 0; i < MAX_SWAPFILES; i++) {
+		if (swap_bdevs[i] == NULL) {
+			swap_bdevs[i] = bdev;
+			return;
+		}
+	}
+	BUG();
+}
+
+static void remove_swap_bdev(struct block_device *bdev)
+{
+	int i;
+
+	for (i = 0; i < MAX_SWAPFILES; i++) {
+		if (swap_bdevs[i] == bdev) {
+			memcpy(&swap_bdevs[i], &swap_bdevs[i + 1],
+				(MAX_SWAPFILES - i - 1) * sizeof(*swap_bdevs));
+			swap_bdevs[MAX_SWAPFILES - 1] = NULL;
+			return;
+		}
+	}
+	BUG();
+}
+
+/*
+ * Unlike a standard unplug_io_fn, swap_unplug_io_fn is never called
+ * through swap's backing_dev_info (which is only used by shrink_list),
+ * but directly from sync_page when PageSwapCache: and takes the page
+ * as argument, so that it can find the right device from swp_entry_t.
+ */
+void swap_unplug_io_fn(struct page *page)
+{
+	swp_entry_t entry;
+
+	down(&swap_bdevs_sem);
+	entry.val = page->private;
+	if (PageSwapCache(page)) {
+		struct block_device *bdev = swap_bdevs[swp_type(entry)];
+		struct backing_dev_info *bdi;
+
+		if (bdev) {
+			bdi = bdev->bd_inode->i_mapping->backing_dev_info;
+			(*bdi->unplug_io_fn)(bdi);
+		}
+	}
+	up(&swap_bdevs_sem);
+}
+
 static inline int scan_swap_map(struct swap_info_struct *si)
 {
 	unsigned long offset;
@@ -247,16 +311,16 @@ static int exclusive_swap_page(struct pa
 	struct swap_info_struct * p;
 	swp_entry_t entry;
 
-	entry.val = page->index;
+	entry.val = page->private;
 	p = swap_info_get(entry);
 	if (p) {
 		/* Is the only swap cache user the cache itself? */
 		if (p->swap_map[swp_offset(entry)] == 1) {
-			/* Recheck the page count with the pagecache lock held.. */
-			spin_lock(&swapper_space.page_lock);
-			if (page_count(page) - !!PagePrivate(page) == 2)
+			/* Recheck the page count with the swapcache lock held.. */
+			spin_lock(&swapper_space.tree_lock);
+			if (page_count(page) == 2)
 				retval = 1;
-			spin_unlock(&swapper_space.page_lock);
+			spin_unlock(&swapper_space.tree_lock);
 		}
 		swap_info_put(p);
 	}
@@ -315,7 +379,7 @@ int remove_exclusive_swap_page(struct pa
 	if (page_count(page) != 2) /* 2: us + cache */
 		return 0;
 
-	entry.val = page->index;
+	entry.val = page->private;
 	p = swap_info_get(entry);
 	if (!p)
 		return 0;
@@ -323,14 +387,14 @@ int remove_exclusive_swap_page(struct pa
 	/* Is the only swap cache user the cache itself? */
 	retval = 0;
 	if (p->swap_map[swp_offset(entry)] == 1) {
-		/* Recheck the page count with the pagecache lock held.. */
-		spin_lock(&swapper_space.page_lock);
+		/* Recheck the page count with the swapcache lock held.. */
+		spin_lock(&swapper_space.tree_lock);
 		if ((page_count(page) == 2) && !PageWriteback(page)) {
 			__delete_from_swap_cache(page);
 			SetPageDirty(page);
 			retval = 1;
 		}
-		spin_unlock(&swapper_space.page_lock);
+		spin_unlock(&swapper_space.tree_lock);
 	}
 	swap_info_put(p);
 
@@ -353,8 +417,14 @@ void free_swap_and_cache(swp_entry_t ent
 
 	p = swap_info_get(entry);
 	if (p) {
-		if (swap_entry_free(p, swp_offset(entry)) == 1)
-			page = find_trylock_page(&swapper_space, entry.val);
+		if (swap_entry_free(p, swp_offset(entry)) == 1) {
+			spin_lock(&swapper_space.tree_lock);
+			page = radix_tree_lookup(&swapper_space.page_tree,
+				entry.val);
+			if (page && TestSetPageLocked(page))
+				page = NULL;
+			spin_unlock(&swapper_space.tree_lock);
+		}
 		swap_info_put(p);
 	}
 	if (page) {
@@ -996,14 +1066,14 @@ int page_queue_congested(struct page *pa
 
 	BUG_ON(!PageLocked(page));	/* It pins the swap_info_struct */
 
-	bdi = page->mapping->backing_dev_info;
 	if (PageSwapCache(page)) {
-		swp_entry_t entry = { .val = page->index };
+		swp_entry_t entry = { .val = page->private };
 		struct swap_info_struct *sis;
 
 		sis = get_swap_info_struct(swp_type(entry));
 		bdi = sis->bdev->bd_inode->i_mapping->backing_dev_info;
-	}
+	} else
+		bdi = page->mapping->backing_dev_info;
 	return bdi_write_congested(bdi);
 }
 #endif
@@ -1088,6 +1158,7 @@ asmlinkage long sys_swapoff(const char _
 		swap_list_unlock();
 		goto out_dput;
 	}
+	down(&swap_bdevs_sem);
 	swap_list_lock();
 	swap_device_lock(p);
 	swap_file = p->swap_file;
@@ -1099,6 +1170,8 @@ asmlinkage long sys_swapoff(const char _
 	destroy_swap_extents(p);
 	swap_device_unlock(p);
 	swap_list_unlock();
+	remove_swap_bdev(p->bdev);
+	up(&swap_bdevs_sem);
 	vfree(swap_map);
 	if (S_ISBLK(mapping->host->i_mode)) {
 		struct block_device *bdev = I_BDEV(mapping->host);
@@ -1440,6 +1513,7 @@ asmlinkage long sys_swapon(const char __
 	if (error)
 		goto bad_swap;
 
+	down(&swap_bdevs_sem);
 	swap_list_lock();
 	swap_device_lock(p);
 	p->flags = SWP_ACTIVE;
@@ -1465,6 +1539,8 @@ asmlinkage long sys_swapon(const char __
 	}
 	swap_device_unlock(p);
 	swap_list_unlock();
+	install_swap_bdev(p->bdev);
+	up(&swap_bdevs_sem);
 	error = 0;
 	goto out;
 bad_swap:
@@ -1484,7 +1560,7 @@ bad_swap_2:
 	destroy_swap_extents(p);
 	if (swap_map)
 		vfree(swap_map);
-	if (swap_file && !IS_ERR(swap_file))
+	if (swap_file)
 		filp_close(swap_file, NULL);
 out:
 	if (page && !IS_ERR(page)) {
--- diff/mm/truncate.c	2004-04-05 12:57:08.000000000 +0100
+++ source/mm/truncate.c	2004-04-21 10:45:36.037225008 +0100
@@ -62,7 +62,7 @@ truncate_complete_page(struct address_sp
  * This is for invalidate_inode_pages().  That function can be called at
  * any time, and is not supposed to throw away dirty pages.  But pages can
  * be marked dirty at any time too.  So we re-check the dirtiness inside
- * ->page_lock.  That provides exclusion against the __set_page_dirty
+ * ->tree_lock.  That provides exclusion against the __set_page_dirty
  * functions.
  */
 static int
@@ -74,13 +74,13 @@ invalidate_complete_page(struct address_
 	if (PagePrivate(page) && !try_to_release_page(page, 0))
 		return 0;
 
-	spin_lock(&mapping->page_lock);
+	spin_lock_irq(&mapping->tree_lock);
 	if (PageDirty(page)) {
-		spin_unlock(&mapping->page_lock);
+		spin_unlock_irq(&mapping->tree_lock);
 		return 0;
 	}
 	__remove_from_page_cache(page);
-	spin_unlock(&mapping->page_lock);
+	spin_unlock_irq(&mapping->tree_lock);
 	ClearPageUptodate(page);
 	page_cache_release(page);	/* pagecache ref */
 	return 1;
--- diff/mm/vmscan.c	2004-04-05 12:57:08.000000000 +0100
+++ source/mm/vmscan.c	2004-04-21 10:45:36.038224856 +0100
@@ -28,7 +28,7 @@
 #include <linux/mm_inline.h>
 #include <linux/pagevec.h>
 #include <linux/backing-dev.h>
-#include <linux/rmap-locking.h>
+#include <linux/rmap.h>
 #include <linux/topology.h>
 #include <linux/cpu.h>
 #include <linux/notifier.h>
@@ -173,30 +173,25 @@ static int shrink_slab(unsigned long sca
 	return 0;
 }
 
-/* Must be called with page's pte_chain_lock held. */
+/* Must be called with page's rmap lock held. */
 static inline int page_mapping_inuse(struct page *page)
 {
-	struct address_space *mapping = page->mapping;
+	struct address_space *mapping;
 
 	/* Page is in somebody's page tables. */
 	if (page_mapped(page))
 		return 1;
 
-	/* XXX: does this happen ? */
-	if (!mapping)
-		return 0;
-
 	/* Be more reluctant to reclaim swapcache than pagecache */
 	if (PageSwapCache(page))
 		return 1;
 
-	/* File is mmap'd by somebody. */
-	if (!list_empty(&mapping->i_mmap))
-		return 1;
-	if (!list_empty(&mapping->i_mmap_shared))
-		return 1;
+	mapping = page_mapping(page);
+	if (!mapping)
+		return 0;
 
-	return 0;
+	/* File is mmap'd by somebody? */
+	return mapping_mapped(mapping);
 }
 
 static inline int is_page_cache_freeable(struct page *page)
@@ -233,7 +228,7 @@ static void handle_write_error(struct ad
 				struct page *page, int error)
 {
 	lock_page(page);
-	if (page->mapping == mapping) {
+	if (page_mapping(page) == mapping) {
 		if (error == -ENOSPC)
 			set_bit(AS_ENOSPC, &mapping->flags);
 		else
@@ -246,7 +241,8 @@ static void handle_write_error(struct ad
  * shrink_list returns the number of reclaimed pages
  */
 static int
-shrink_list(struct list_head *page_list, unsigned int gfp_mask, int *nr_scanned)
+shrink_list(struct list_head *page_list, unsigned int gfp_mask,
+		int *nr_scanned, int do_writepage)
 {
 	struct address_space *mapping;
 	LIST_HEAD(ret_pages);
@@ -277,35 +273,36 @@ shrink_list(struct list_head *page_list,
 		if (PageWriteback(page))
 			goto keep_locked;
 
-		pte_chain_lock(page);
+		rmap_lock(page);
 		referenced = page_referenced(page);
 		if (referenced && page_mapping_inuse(page)) {
 			/* In active use or really unfreeable.  Activate it. */
-			pte_chain_unlock(page);
+			rmap_unlock(page);
 			goto activate_locked;
 		}
 
-		mapping = page->mapping;
+		mapping = page_mapping(page);
+		may_enter_fs = (gfp_mask & __GFP_FS);
 
 #ifdef CONFIG_SWAP
 		/*
-		 * Anonymous process memory without backing store. Try to
-		 * allocate it some swap space here.
+		 * Anonymous process memory has backing store?
+		 * Try to allocate it some swap space here.
 		 *
 		 * XXX: implement swap clustering ?
 		 */
-		if (page_mapped(page) && !mapping && !PagePrivate(page)) {
-			pte_chain_unlock(page);
+		if (PageAnon(page) && !PageSwapCache(page)) {
+			rmap_unlock(page);
 			if (!add_to_swap(page))
 				goto activate_locked;
-			pte_chain_lock(page);
-			mapping = page->mapping;
+			rmap_lock(page);
+		}
+		if (PageSwapCache(page)) {
+			mapping = &swapper_space;
+			may_enter_fs = (gfp_mask & __GFP_IO);
 		}
 #endif /* CONFIG_SWAP */
 
-		may_enter_fs = (gfp_mask & __GFP_FS) ||
-				(PageSwapCache(page) && (gfp_mask & __GFP_IO));
-
 		/*
 		 * The page is mapped into the page tables of one or more
 		 * processes. Try to unmap it here.
@@ -313,16 +310,16 @@ shrink_list(struct list_head *page_list,
 		if (page_mapped(page) && mapping) {
 			switch (try_to_unmap(page)) {
 			case SWAP_FAIL:
-				pte_chain_unlock(page);
+				rmap_unlock(page);
 				goto activate_locked;
 			case SWAP_AGAIN:
-				pte_chain_unlock(page);
+				rmap_unlock(page);
 				goto keep_locked;
 			case SWAP_SUCCESS:
 				; /* try to free the page below */
 			}
 		}
-		pte_chain_unlock(page);
+		rmap_unlock(page);
 
 		/*
 		 * If the page is dirty, only perform writeback if that write
@@ -354,8 +351,9 @@ shrink_list(struct list_head *page_list,
 				goto keep_locked;
 			if (!may_write_to_queue(mapping->backing_dev_info))
 				goto keep_locked;
-			spin_lock(&mapping->page_lock);
-			if (test_clear_page_dirty(page)) {
+			if (laptop_mode && !do_writepage)
+				goto keep_locked;
+			if (clear_page_dirty_for_io(page)) {
 				int res;
 				struct writeback_control wbc = {
 					.sync_mode = WB_SYNC_NONE,
@@ -364,9 +362,6 @@ shrink_list(struct list_head *page_list,
 					.for_reclaim = 1,
 				};
 
-				list_move(&page->list, &mapping->locked_pages);
-				spin_unlock(&mapping->page_lock);
-
 				SetPageReclaim(page);
 				res = mapping->a_ops->writepage(page, &wbc);
 				if (res < 0)
@@ -381,7 +376,6 @@ shrink_list(struct list_head *page_list,
 				}
 				goto keep;
 			}
-			spin_unlock(&mapping->page_lock);
 		}
 
 		/*
@@ -415,7 +409,7 @@ shrink_list(struct list_head *page_list,
 		if (!mapping)
 			goto keep_locked;	/* truncate got there first */
 
-		spin_lock(&mapping->page_lock);
+		spin_lock_irq(&mapping->tree_lock);
 
 		/*
 		 * The non-racy check for busy page.  It is critical to check
@@ -423,15 +417,15 @@ shrink_list(struct list_head *page_list,
 		 * not in use by anybody. 	(pagecache + us == 2)
 		 */
 		if (page_count(page) != 2 || PageDirty(page)) {
-			spin_unlock(&mapping->page_lock);
+			spin_unlock_irq(&mapping->tree_lock);
 			goto keep_locked;
 		}
 
 #ifdef CONFIG_SWAP
 		if (PageSwapCache(page)) {
-			swp_entry_t swap = { .val = page->index };
+			swp_entry_t swap = { .val = page->private };
 			__delete_from_swap_cache(page);
-			spin_unlock(&mapping->page_lock);
+			spin_unlock_irq(&mapping->tree_lock);
 			swap_free(swap);
 			__put_page(page);	/* The pagecache ref */
 			goto free_it;
@@ -439,7 +433,7 @@ shrink_list(struct list_head *page_list,
 #endif /* CONFIG_SWAP */
 
 		__remove_from_page_cache(page);
-		spin_unlock(&mapping->page_lock);
+		spin_unlock_irq(&mapping->tree_lock);
 		__put_page(page);
 
 free_it:
@@ -478,7 +472,7 @@ keep:
  */
 static int
 shrink_cache(struct zone *zone, unsigned int gfp_mask,
-		int max_scan, int *total_scanned)
+		int max_scan, int *total_scanned, int do_writepage)
 {
 	LIST_HEAD(page_list);
 	struct pagevec pvec;
@@ -526,7 +520,8 @@ shrink_cache(struct zone *zone, unsigned
 			mod_page_state_zone(zone, pgscan_kswapd, nr_scan);
 		else
 			mod_page_state_zone(zone, pgscan_direct, nr_scan);
-		nr_freed = shrink_list(&page_list, gfp_mask, total_scanned);
+		nr_freed = shrink_list(&page_list, gfp_mask,
+					total_scanned, do_writepage);
 		*total_scanned += nr_taken;
 		if (current_is_kswapd())
 			mod_page_state(kswapd_steal, nr_freed);
@@ -658,20 +653,19 @@ refill_inactive_zone(struct zone *zone, 
 				list_add(&page->lru, &l_active);
 				continue;
 			}
-			pte_chain_lock(page);
+			rmap_lock(page);
 			if (page_referenced(page)) {
-				pte_chain_unlock(page);
+				rmap_unlock(page);
 				list_add(&page->lru, &l_active);
 				continue;
 			}
-			pte_chain_unlock(page);
+			rmap_unlock(page);
 		}
 		/*
 		 * FIXME: need to consider page_count(page) here if/when we
 		 * reap orphaned pages via the LRU (Daniel's locking stuff)
 		 */
-		if (total_swap_pages == 0 && !page->mapping &&
-						!PagePrivate(page)) {
+		if (total_swap_pages == 0 && PageAnon(page)) {
 			list_add(&page->lru, &l_active);
 			continue;
 		}
@@ -740,7 +734,7 @@ refill_inactive_zone(struct zone *zone, 
  */
 static int
 shrink_zone(struct zone *zone, int max_scan, unsigned int gfp_mask,
-		int *total_scanned, struct page_state *ps)
+		int *total_scanned, struct page_state *ps, int do_writepage)
 {
 	unsigned long ratio;
 	int count;
@@ -769,7 +763,8 @@ shrink_zone(struct zone *zone, int max_s
 	count = atomic_read(&zone->nr_scan_inactive);
 	if (count >= SWAP_CLUSTER_MAX) {
 		atomic_set(&zone->nr_scan_inactive, 0);
-		return shrink_cache(zone, gfp_mask, count, total_scanned);
+		return shrink_cache(zone, gfp_mask, count,
+					total_scanned, do_writepage);
 	}
 	return 0;
 }
@@ -792,7 +787,7 @@ shrink_zone(struct zone *zone, int max_s
  */
 static int
 shrink_caches(struct zone **zones, int priority, int *total_scanned,
-		int gfp_mask, struct page_state *ps)
+		int gfp_mask, struct page_state *ps, int do_writepage)
 {
 	int ret = 0;
 	int i;
@@ -808,7 +803,8 @@ shrink_caches(struct zone **zones, int p
 			continue;	/* Let kswapd poll it */
 
 		max_scan = zone->nr_inactive >> priority;
-		ret += shrink_zone(zone, max_scan, gfp_mask, total_scanned, ps);
+		ret += shrink_zone(zone, max_scan, gfp_mask,
+					total_scanned, ps, do_writepage);
 	}
 	return ret;
 }
@@ -838,6 +834,8 @@ int try_to_free_pages(struct zone **zone
 	int nr_reclaimed = 0;
 	struct reclaim_state *reclaim_state = current->reclaim_state;
 	int i;
+	unsigned long total_scanned = 0;
+	int do_writepage = 0;
 
 	inc_page_state(allocstall);
 
@@ -845,13 +843,13 @@ int try_to_free_pages(struct zone **zone
 		zones[i]->temp_priority = DEF_PRIORITY;
 
 	for (priority = DEF_PRIORITY; priority >= 0; priority--) {
-		int total_scanned = 0;
+		int scanned = 0;
 		struct page_state ps;
 
 		get_page_state(&ps);
-		nr_reclaimed += shrink_caches(zones, priority, &total_scanned,
-						gfp_mask, &ps);
-		shrink_slab(total_scanned, gfp_mask);
+		nr_reclaimed += shrink_caches(zones, priority, &scanned,
+						gfp_mask, &ps, do_writepage);
+		shrink_slab(scanned, gfp_mask);
 		if (reclaim_state) {
 			nr_reclaimed += reclaim_state->reclaimed_slab;
 			reclaim_state->reclaimed_slab = 0;
@@ -863,14 +861,20 @@ int try_to_free_pages(struct zone **zone
 		if (!(gfp_mask & __GFP_FS))
 			break;		/* Let the caller handle it */
 		/*
-		 * Try to write back as many pages as we just scanned.  Not
-		 * sure if that makes sense, but it's an attempt to avoid
-		 * creating IO storms unnecessarily
+		 * Try to write back as many pages as we just scanned.  This
+		 * tends to cause slow streaming writers to write data to the
+		 * disk smoothly, at the dirtying rate, which is nice.   But
+		 * that's undesirable in laptop mode, where we *want* lumpy
+		 * writeout.  So in laptop mode, write out the whole world.
 		 */
-		wakeup_bdflush(total_scanned);
+		total_scanned += scanned;
+		if (total_scanned > SWAP_CLUSTER_MAX + SWAP_CLUSTER_MAX/2) {
+			wakeup_bdflush(laptop_mode ? 0 : total_scanned);
+			do_writepage = 1;
+		}
 
 		/* Take a nap, wait for some writeback to complete */
-		if (total_scanned && priority < DEF_PRIORITY - 2)
+		if (scanned && priority < DEF_PRIORITY - 2)
 			blk_congestion_wait(WRITE, HZ/10);
 	}
 	if ((gfp_mask & __GFP_FS) && !(gfp_mask & __GFP_NORETRY))
@@ -912,6 +916,9 @@ static int balance_pgdat(pg_data_t *pgda
 	int priority;
 	int i;
 	struct reclaim_state *reclaim_state = current->reclaim_state;
+	unsigned long total_scanned = 0;
+	unsigned long total_reclaimed = 0;
+	int do_writepage = 0;
 
 	inc_page_state(pageoutrun);
 
@@ -923,7 +930,6 @@ static int balance_pgdat(pg_data_t *pgda
 
 	for (priority = DEF_PRIORITY; priority; priority--) {
 		int all_zones_ok = 1;
-		int pages_scanned = 0;
 		int end_zone = 0;	/* Inclusive.  0 = ZONE_DMA */
 
 
@@ -960,9 +966,9 @@ scan:
 		 */
 		for (i = 0; i <= end_zone; i++) {
 			struct zone *zone = pgdat->node_zones + i;
-			int total_scanned = 0;
 			int max_scan;
 			int reclaimed;
+			int scanned = 0;
 
 			if (zone->all_unreclaimable && priority != DEF_PRIORITY)
 				continue;
@@ -974,16 +980,25 @@ scan:
 			zone->temp_priority = priority;
 			max_scan = zone->nr_inactive >> priority;
 			reclaimed = shrink_zone(zone, max_scan, GFP_KERNEL,
-					&total_scanned, ps);
-			total_scanned += pages_scanned;
+					&scanned, ps, do_writepage);
+			total_scanned += scanned;
 			reclaim_state->reclaimed_slab = 0;
-			shrink_slab(total_scanned, GFP_KERNEL);
+			shrink_slab(scanned, GFP_KERNEL);
 			reclaimed += reclaim_state->reclaimed_slab;
+			total_reclaimed += reclaimed;
 			to_free -= reclaimed;
 			if (zone->all_unreclaimable)
 				continue;
 			if (zone->pages_scanned > zone->present_pages * 2)
 				zone->all_unreclaimable = 1;
+			/*
+			 * If we've done a decent amount of scanning and
+			 * the reclaim ratio is low, start doing writepage
+			 * even in laptop mode
+			 */
+			if (total_scanned > SWAP_CLUSTER_MAX * 2 &&
+			    total_scanned > total_reclaimed+total_reclaimed/2)
+				do_writepage = 1;
 		}
 		if (nr_pages && to_free > 0)
 			continue;	/* swsusp: need to do more work */
@@ -993,7 +1008,7 @@ scan:
 		 * OK, kswapd is getting into trouble.  Take a nap, then take
 		 * another pass across the zones.
 		 */
-		if (pages_scanned && priority < DEF_PRIORITY - 2)
+		if (total_scanned && priority < DEF_PRIORITY - 2)
 			blk_congestion_wait(WRITE, HZ/10);
 	}
 out:
@@ -1002,7 +1017,7 @@ out:
 
 		zone->prev_priority = zone->temp_priority;
 	}
-	return nr_pages - to_free;
+	return total_reclaimed;
 }
 
 /*
@@ -1052,7 +1067,7 @@ int kswapd(void *p)
 		struct page_state ps;
 
 		if (current->flags & PF_FREEZE)
-			refrigerator(PF_IOTHREAD);
+			refrigerator(PF_FREEZE);
 		prepare_to_wait(&pgdat->kswapd_wait, &wait, TASK_INTERRUPTIBLE);
 		schedule();
 		finish_wait(&pgdat->kswapd_wait, &wait);
--- diff/net/8021q/vlan.h	2003-06-30 10:07:24.000000000 +0100
+++ source/net/8021q/vlan.h	2004-04-21 10:45:36.038224856 +0100
@@ -19,8 +19,8 @@ I never found it..and the problem seems 
 I'll bet they might prove useful again... --Ben
 
 
-#define VLAN_MEM_DBG(x, y, z) printk(VLAN_DBG __FUNCTION__ ":  "  x, y, z);
-#define VLAN_FMEM_DBG(x, y) printk(VLAN_DBG __FUNCTION__  ":  " x, y);
+#define VLAN_MEM_DBG(x, y, z) printk(VLAN_DBG "%s:  "  x, __FUNCTION__, y, z);
+#define VLAN_FMEM_DBG(x, y) printk(VLAN_DBG "%s:  " x, __FUNCTION__, y);
 */
 
 /* This way they don't do anything! */
--- diff/net/8021q/vlanproc.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/8021q/vlanproc.c	2004-04-21 10:45:36.039224704 +0100
@@ -220,7 +220,7 @@ int vlan_proc_rem_dev(struct net_device 
 	}
 
 #ifdef VLAN_DEBUG
-	printk(VLAN_DBG __FUNCTION__ ": dev: %p\n", vlandev);
+	printk(VLAN_DBG "%s: dev: %p\n", __FUNCTION__, vlandev);
 #endif
 
 	/** NOTE:  This will consume the memory pointed to by dent, it seems. */
--- diff/net/Kconfig	2004-04-05 12:57:08.000000000 +0100
+++ source/net/Kconfig	2004-04-21 10:45:36.040224552 +0100
@@ -129,59 +129,6 @@ config IPV6
 
 source "net/ipv6/Kconfig"
 
-config DECNET
-	tristate "DECnet Support"
-	---help---
-	  The DECnet networking protocol was used in many products made by
-	  Digital (now Compaq).  It provides reliable stream and sequenced
-	  packet communications over which run a variety of services similar
-	  to those which run over TCP/IP.
-
-	  To find some tools to use with the kernel layer support, please
-	  look at Patrick Caulfield's web site:
-	  <http://linux-decnet.sourceforge.net/>.
-
-	  More detailed documentation is available in
-	  <file:Documentation/networking/decnet.txt>.
-
-	  Be sure to say Y to "/proc file system support" and "Sysctl support"
-	  below when using DECnet, since you will need sysctl support to aid
-	  in configuration at run time.
-
-	  The DECnet code is also available as a module ( = code which can be
-	  inserted in and removed from the running kernel whenever you want).
-	  The module is called decnet.
-
-source "net/decnet/Kconfig"
-
-config BRIDGE
-	tristate "802.1d Ethernet Bridging"
-	---help---
-	  If you say Y here, then your Linux box will be able to act as an
-	  Ethernet bridge, which means that the different Ethernet segments it
-	  is connected to will appear as one Ethernet to the participants.
-	  Several such bridges can work together to create even larger
-	  networks of Ethernets using the IEEE 802.1 spanning tree algorithm.
-	  As this is a standard, Linux bridges will cooperate properly with
-	  other third party bridge products.
-
-	  In order to use the Ethernet bridge, you'll need the bridge
-	  configuration tools; see <file:Documentation/networking/bridge.txt>
-	  for location. Please read the Bridge mini-HOWTO for more
-	  information.
-
-	  If you enable iptables support along with the bridge support then you
-	  turn your bridge into a bridging IP firewall.
-	  iptables will then see the IP packets being bridged, so you need to
-	  take this into account when setting up your firewall rules.
-	  Enabling arptables support when bridging will let arptables see
-	  bridged ARP traffic in the arptables FORWARD chain.
-
-	  To compile this code as a module, choose M here: the module
-	  will be called bridge.
-
-	  If unsure, say N.
-
 menuconfig NETFILTER
 	bool "Network packet filtering (replaces ipchains)"
 	---help---
@@ -345,9 +292,62 @@ config ATM_BR2684_IPFILTER
 	  large number of IP-only vcc's.  Do not enable this unless you are sure
 	  you know what you are doing.
 
+config BRIDGE
+	tristate "802.1d Ethernet Bridging"
+	---help---
+	  If you say Y here, then your Linux box will be able to act as an
+	  Ethernet bridge, which means that the different Ethernet segments it
+	  is connected to will appear as one Ethernet to the participants.
+	  Several such bridges can work together to create even larger
+	  networks of Ethernets using the IEEE 802.1 spanning tree algorithm.
+	  As this is a standard, Linux bridges will cooperate properly with
+	  other third party bridge products.
+
+	  In order to use the Ethernet bridge, you'll need the bridge
+	  configuration tools; see <file:Documentation/networking/bridge.txt>
+	  for location. Please read the Bridge mini-HOWTO for more
+	  information.
+
+	  If you enable iptables support along with the bridge support then you
+	  turn your bridge into a bridging IP firewall.
+	  iptables will then see the IP packets being bridged, so you need to
+	  take this into account when setting up your firewall rules.
+	  Enabling arptables support when bridging will let arptables see
+	  bridged ARP traffic in the arptables FORWARD chain.
+
+	  To compile this code as a module, choose M here: the module
+	  will be called bridge.
+
+	  If unsure, say N.
+
 config VLAN_8021Q
 	tristate "802.1Q VLAN Support"
 
+config DECNET
+	tristate "DECnet Support"
+	---help---
+	  The DECnet networking protocol was used in many products made by
+	  Digital (now Compaq).  It provides reliable stream and sequenced
+	  packet communications over which run a variety of services similar
+	  to those which run over TCP/IP.
+
+	  To find some tools to use with the kernel layer support, please
+	  look at Patrick Caulfield's web site:
+	  <http://linux-decnet.sourceforge.net/>.
+
+	  More detailed documentation is available in
+	  <file:Documentation/networking/decnet.txt>.
+
+	  Be sure to say Y to "/proc file system support" and "Sysctl support"
+	  below when using DECnet, since you will need sysctl support to aid
+	  in configuration at run time.
+
+	  The DECnet code is also available as a module ( = code which can be
+	  inserted in and removed from the running kernel whenever you want).
+	  The module is called decnet.
+
+source "net/decnet/Kconfig"
+
 source "net/llc/Kconfig"
 
 config IPX
@@ -650,14 +650,6 @@ endmenu
 
 endmenu
 
-source "drivers/net/Kconfig"
-
-source "net/ax25/Kconfig"
-
-source "net/irda/Kconfig"
-
-source "net/bluetooth/Kconfig"
-
 config NETPOLL
 	def_bool NETCONSOLE
 
@@ -674,4 +666,13 @@ config NETPOLL_TRAP
 config NET_POLL_CONTROLLER
 	def_bool NETPOLL
 
+source "net/ax25/Kconfig"
+
+source "net/irda/Kconfig"
+
+source "net/bluetooth/Kconfig"
+
+source "drivers/net/Kconfig"
+
 endmenu
+
--- diff/net/appletalk/ddp.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/appletalk/ddp.c	2004-04-21 10:45:36.040224552 +0100
@@ -1795,13 +1795,7 @@ static int atalk_ioctl(struct socket *so
 			break;
 		}
 		case SIOCGSTAMP:
-			if (!sk)
-				break;
-			rc = -ENOENT;
-			if (!sk->sk_stamp.tv_sec)
-				break;
-			rc = copy_to_user((void *)arg, &sk->sk_stamp,
-					  sizeof(struct timeval)) ? -EFAULT : 0;
+			rc = sock_get_timestamp(sk, (struct timeval *)arg);
 			break;
 		/* Routing */
 		case SIOCADDRT:
--- diff/net/atm/ioctl.c	2003-09-30 15:46:21.000000000 +0100
+++ source/net/atm/ioctl.c	2004-04-21 10:45:36.041224400 +0100
@@ -76,12 +76,8 @@ int vcc_ioctl(struct socket *sock, unsig
 				goto done;
 			}
 		case SIOCGSTAMP: /* borrowed from IP */
-			if (!vcc->sk->sk_stamp.tv_sec) {
-				error = -ENOENT;
-				goto done;
-			}
-			error = copy_to_user((void *)arg, &vcc->sk->sk_stamp,
-					     sizeof(struct timeval)) ? -EFAULT : 0;
+			error = sock_get_timestamp(vcc->sk, (struct timeval *)
+						   arg);
 			goto done;
 		case ATM_SETSC:
 			printk(KERN_WARNING "ATM_SETSC is obsolete\n");
--- diff/net/atm/lec.h	2004-03-11 10:20:29.000000000 +0000
+++ source/net/atm/lec.h	2004-04-21 10:45:36.041224400 +0100
@@ -16,6 +16,7 @@
 
 #if defined (CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
 #include <linux/if_bridge.h>
+struct net_bridge;
 extern struct net_bridge_fdb_entry *(*br_fdb_get_hook)(struct net_bridge *br,
                                                 unsigned char *addr);
 extern void (*br_fdb_put_hook)(struct net_bridge_fdb_entry *ent);
--- diff/net/ax25/Kconfig	2003-09-30 15:46:21.000000000 +0100
+++ source/net/ax25/Kconfig	2004-04-21 10:45:36.041224400 +0100
@@ -6,9 +6,8 @@
 #		Joerg Reuter DL1BKE <jreuter@yaina.de>
 # 19980129	Moved to net/ax25/Config.in, sourcing device drivers.
 
-menu "Amateur Radio support"
-
-config HAMRADIO
+menuconfig HAMRADIO
+	depends on NET
 	bool "Amateur Radio support"
 	help
 	  If you want to connect your Linux box to an amateur radio, answer Y
@@ -109,5 +108,3 @@ source "drivers/net/hamradio/Kconfig"
 
 endmenu
 
-endmenu
-
--- diff/net/ax25/af_ax25.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/ax25/af_ax25.c	2004-04-21 10:45:36.042224248 +0100
@@ -1694,12 +1694,7 @@ static int ax25_ioctl(struct socket *soc
 
 	case SIOCGSTAMP:
 		if (sk != NULL) {
-			if (!sk->sk_stamp.tv_sec) {
-				res = -ENOENT;
-				break;
-			}
-			res = copy_to_user((void *)arg, &sk->sk_stamp,
-					  sizeof(struct timeval)) ? -EFAULT : 0;
+			res = sock_get_timestamp(sk, (struct timeval *)arg);
 			break;
 	 	}
 		res = -EINVAL;
--- diff/net/bluetooth/Kconfig	2004-02-09 10:36:12.000000000 +0000
+++ source/net/bluetooth/Kconfig	2004-04-21 10:45:36.043224096 +0100
@@ -2,10 +2,8 @@
 # Bluetooth subsystem configuration
 #
 
-menu "Bluetooth support"
+menuconfig BT
 	depends on NET
-
-config BT
 	tristate "Bluetooth subsystem support"
 	help
 	  Bluetooth is low-cost, low-power, short-range wireless technology.
@@ -62,5 +60,3 @@ source "net/bluetooth/cmtp/Kconfig"
 
 source "drivers/bluetooth/Kconfig"
 
-endmenu
-
--- diff/net/bluetooth/bnep/core.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/bluetooth/bnep/core.c	2004-04-21 10:45:36.043224096 +0100
@@ -458,7 +458,7 @@ static int bnep_session(void *arg)
 
         daemonize("kbnepd %s", dev->name);
 	set_user_nice(current, -15);
-	current->flags |= PF_IOTHREAD;
+	current->flags |= PF_NOFREEZE;
 
         set_fs(KERNEL_DS);
 
--- diff/net/bluetooth/cmtp/core.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/bluetooth/cmtp/core.c	2004-04-21 10:45:36.043224096 +0100
@@ -293,7 +293,7 @@ static int cmtp_session(void *arg)
 
 	daemonize("kcmtpd_ctr_%d", session->num);
 	set_user_nice(current, -15);
-	current->flags |= PF_IOTHREAD;
+	current->flags |= PF_NOFREEZE;
 
 	set_fs(KERNEL_DS);
 
--- diff/net/bluetooth/hci_sock.c	2004-02-09 10:36:12.000000000 +0000
+++ source/net/bluetooth/hci_sock.c	2004-04-21 10:45:36.044223944 +0100
@@ -61,6 +61,11 @@
 
 /* ----- HCI socket interface ----- */
 
+static inline int hci_test_bit(int nr, void *addr)
+{
+	return *((__u32 *) addr + (nr >> 5)) & ((__u32) 1 << (nr & 31));
+}
+
 /* Security filter */
 static struct hci_sec_filter hci_sec_filter = {
 	/* Packet types */
@@ -115,8 +120,8 @@ void hci_send_to_sock(struct hci_dev *hd
 
 		if (skb->pkt_type == HCI_EVENT_PKT) {
 			register int evt = (*(__u8 *)skb->data & HCI_FLT_EVENT_BITS);
-			
-			if (!test_bit(evt, flt->event_mask))
+
+			if (!hci_test_bit(evt, &flt->event_mask))
 				continue;
 
 			if (flt->opcode && ((evt == HCI_EV_CMD_COMPLETE && 
@@ -399,8 +404,8 @@ static int hci_sock_sendmsg(struct kiocb
 		u16 ogf = hci_opcode_ogf(opcode);
 		u16 ocf = hci_opcode_ocf(opcode);
 
-		if (((ogf > HCI_SFLT_MAX_OGF) || 
-				!test_bit(ocf & HCI_FLT_OCF_BITS, hci_sec_filter.ocf_mask[ogf])) &&
+		if (((ogf > HCI_SFLT_MAX_OGF) ||
+				!hci_test_bit(ocf & HCI_FLT_OCF_BITS, &hci_sec_filter.ocf_mask[ogf])) &&
 		    			!capable(CAP_NET_RAW)) {
 			err = -EPERM;
 			goto drop;
--- diff/net/bluetooth/rfcomm/core.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/bluetooth/rfcomm/core.c	2004-04-21 10:45:36.045223792 +0100
@@ -1819,7 +1819,7 @@ static int rfcomm_run(void *unused)
 
 	daemonize("krfcommd");
 	set_user_nice(current, -10);
-	current->flags |= PF_IOTHREAD;
+	current->flags |= PF_NOFREEZE;
 
 	set_fs(KERNEL_DS);
 
--- diff/net/bluetooth/rfcomm/tty.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/bluetooth/rfcomm/tty.c	2004-04-21 10:45:36.045223792 +0100
@@ -315,7 +315,7 @@ static int rfcomm_create_dev(struct sock
 
 	if (req.flags != NOCAP_FLAGS && !capable(CAP_NET_ADMIN))
 		return -EPERM;
-	
+
 	if (req.flags & (1 << RFCOMM_REUSE_DLC)) {
 		/* Socket must be connected */
 		if (sk->sk_state != BT_CONNECTED)
@@ -354,12 +354,14 @@ static int rfcomm_release_dev(unsigned l
 
 	BT_DBG("dev_id %id flags 0x%x", req.dev_id, req.flags);
 
-	if (!capable(CAP_NET_ADMIN))
-		return -EPERM;
-	
 	if (!(dev = rfcomm_dev_get(req.dev_id)))
 		return -ENODEV;
 
+	if (dev->flags != NOCAP_FLAGS && !capable(CAP_NET_ADMIN)) {
+		rfcomm_dev_put(dev);
+		return -EPERM;
+	}
+
 	if (req.flags & (1 << RFCOMM_HANGUP_NOW))
 		rfcomm_dlc_close(dev->dlc, 0);
 
--- diff/net/bridge/br.c	2003-12-19 09:51:02.000000000 +0000
+++ source/net/bridge/br.c	2004-04-21 10:45:36.046223640 +0100
@@ -20,8 +20,7 @@
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/init.h>
-#include <linux/if_bridge.h>
-#include <asm/uaccess.h>
+
 #include "br_private.h"
 
 #if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE)
@@ -32,6 +31,8 @@ int (*br_should_route_hook) (struct sk_b
 
 static int __init br_init(void)
 {
+	br_fdb_init();
+
 #ifdef CONFIG_BRIDGE_NETFILTER
 	if (br_netfilter_init())
 		return 1;
@@ -55,16 +56,18 @@ static void __exit br_deinit(void)
 #endif
 	unregister_netdevice_notifier(&br_device_notifier);
 	brioctl_set(NULL);
-	br_handle_frame_hook = NULL;
+
+	br_cleanup_bridges();
+
+	synchronize_net();
 
 #if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE)
 	br_fdb_get_hook = NULL;
 	br_fdb_put_hook = NULL;
 #endif
 
-	br_cleanup_bridges();
-
-	synchronize_net();
+	br_handle_frame_hook = NULL;
+	br_fdb_fini();
 }
 
 EXPORT_SYMBOL(br_should_route_hook);
--- diff/net/bridge/br_device.c	2003-08-26 10:00:54.000000000 +0100
+++ source/net/bridge/br_device.c	2004-04-21 10:45:36.046223640 +0100
@@ -15,7 +15,6 @@
 
 #include <linux/kernel.h>
 #include <linux/netdevice.h>
-#include <linux/if_bridge.h>
 #include <linux/module.h>
 #include <asm/uaccess.h>
 #include "br_private.h"
@@ -32,7 +31,7 @@ static int br_dev_do_ioctl(struct net_de
 	if (copy_from_user(args, data, 4*sizeof(unsigned long)))
 		return -EFAULT;
 
-	return br_ioctl(dev->priv, args[0], args[1], args[2], args[3]);
+	return br_ioctl_device(dev->priv, args[0], args[1], args[2], args[3]);
 }
 
 static struct net_device_stats *br_dev_get_stats(struct net_device *dev)
--- diff/net/bridge/br_fdb.c	2003-07-08 09:55:19.000000000 +0100
+++ source/net/bridge/br_fdb.c	2004-04-21 10:45:36.046223640 +0100
@@ -14,12 +14,31 @@
  */
 
 #include <linux/kernel.h>
+#include <linux/init.h>
 #include <linux/spinlock.h>
 #include <linux/if_bridge.h>
+#include <linux/times.h>
+#include <linux/etherdevice.h>
 #include <asm/atomic.h>
 #include <asm/uaccess.h>
 #include "br_private.h"
 
+static kmem_cache_t *br_fdb_cache;
+
+void __init br_fdb_init(void)
+{
+	br_fdb_cache = kmem_cache_create("bridge_fdb_cache",
+					 sizeof(struct net_bridge_fdb_entry),
+					 0,
+					 SLAB_HWCACHE_ALIGN, NULL, NULL);
+}
+
+void __exit br_fdb_fini(void)
+{
+	kmem_cache_destroy(br_fdb_cache);
+}
+
+
 /* if topology_changing then use forward_delay (default 15 sec)
  * otherwise keep longer (default 5 minutes)
  */
@@ -35,7 +54,7 @@ static __inline__ int has_expired(const 
 		&& time_before_eq(fdb->ageing_timer + hold_time(br), jiffies);
 }
 
-static __inline__ void copy_fdb(struct __fdb_entry *ent, 
+static inline void copy_fdb(struct __fdb_entry *ent, 
 				const struct net_bridge_fdb_entry *f)
 {
 	memset(ent, 0, sizeof(struct __fdb_entry));
@@ -43,7 +62,7 @@ static __inline__ void copy_fdb(struct _
 	ent->port_no = f->dst?f->dst->port_no:0;
 	ent->is_local = f->is_local;
 	ent->ageing_timer_value = f->is_static ? 0 
-		: ((jiffies - f->ageing_timer) * USER_HZ) / HZ;
+		: jiffies_to_clock_t(jiffies - f->ageing_timer);
 }
 
 static __inline__ int br_mac_hash(const unsigned char *mac)
@@ -173,7 +192,7 @@ struct net_bridge_fdb_entry *br_fdb_get(
 void br_fdb_put(struct net_bridge_fdb_entry *ent)
 {
 	if (atomic_dec_and_test(&ent->use_count))
-		kfree(ent);
+		kmem_cache_free(br_fdb_cache, ent);
 }
 
 int br_fdb_get_entries(struct net_bridge *br,
@@ -220,7 +239,7 @@ int br_fdb_get_entries(struct net_bridge
 			
 			/* entry was deleted during copy_to_user */
 			if (atomic_dec_and_test(&f->use_count)) {
-				kfree(f);
+				kmem_cache_free(br_fdb_cache, f);
 				num = -EAGAIN;
 				goto out;
 			}
@@ -241,12 +260,16 @@ int br_fdb_get_entries(struct net_bridge
 	return num;
 }
 
-void br_fdb_insert(struct net_bridge *br, struct net_bridge_port *source,
-		   const unsigned char *addr, int is_local)
+int br_fdb_insert(struct net_bridge *br, struct net_bridge_port *source,
+		  const unsigned char *addr, int is_local)
 {
 	struct hlist_node *h;
 	struct net_bridge_fdb_entry *fdb;
 	int hash = br_mac_hash(addr);
+	int ret = 0;
+
+	if (!is_valid_ether_addr(addr))
+		return -EADDRNOTAVAIL;
 
 	write_lock_bh(&br->hash_lock);
 	hlist_for_each(h, &br->hash[hash]) {
@@ -262,6 +285,7 @@ void br_fdb_insert(struct net_bridge *br
 					printk(KERN_WARNING "%s: received packet with "
 					       " own address as source address\n",
 					       source->dev->name);
+				ret = -EEXIST;
 				goto out;
 			}
 
@@ -275,9 +299,11 @@ void br_fdb_insert(struct net_bridge *br
 		}
 	}
 
-	fdb = kmalloc(sizeof(*fdb), GFP_ATOMIC);
-	if (fdb == NULL) 
+	fdb = kmem_cache_alloc(br_fdb_cache, GFP_ATOMIC);
+	if (unlikely(fdb == NULL)) {
+		ret = -ENOMEM;
 		goto out;
+	}
 
 	memcpy(fdb->addr.addr, addr, ETH_ALEN);
 	atomic_set(&fdb->use_count, 1);
@@ -296,4 +322,6 @@ void br_fdb_insert(struct net_bridge *br
 	list_add_tail(&fdb->age_list, &br->age_list);
  out:
 	write_unlock_bh(&br->hash_lock);
+
+	return ret;
 }
--- diff/net/bridge/br_forward.c	2003-10-09 09:47:34.000000000 +0100
+++ source/net/bridge/br_forward.c	2004-04-21 10:45:36.047223488 +0100
@@ -15,9 +15,7 @@
 
 #include <linux/kernel.h>
 #include <linux/netdevice.h>
-#include <linux/inetdevice.h>
 #include <linux/skbuff.h>
-#include <linux/if_bridge.h>
 #include <linux/netfilter_bridge.h>
 #include "br_private.h"
 
--- diff/net/bridge/br_if.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/bridge/br_if.c	2004-04-21 10:45:36.047223488 +0100
@@ -14,28 +14,65 @@
  */
 
 #include <linux/kernel.h>
+#include <linux/netdevice.h>
+#include <linux/ethtool.h>
 #include <linux/if_arp.h>
-#include <linux/if_bridge.h>
-#include <linux/inetdevice.h>
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/rtnetlink.h>
 #include <net/sock.h>
-#include <asm/uaccess.h>
+
 #include "br_private.h"
 
+/*
+ * Determine initial path cost based on speed.
+ * using recommendations from 802.1d standard
+ *
+ * Need to simulate user ioctl because not all device's that support
+ * ethtool, use ethtool_ops.  Also, since driver might sleep need to
+ * not be holding any locks.
+ */
 static int br_initial_port_cost(struct net_device *dev)
 {
+
+	struct ethtool_cmd ecmd = { ETHTOOL_GSET };
+	struct ifreq ifr;
+	mm_segment_t old_fs;
+	int err;
+
+	strncpy(ifr.ifr_name, dev->name, IFNAMSIZ);
+	ifr.ifr_data = (void *) &ecmd;
+
+	old_fs = get_fs();
+	set_fs(KERNEL_DS);
+	err = dev_ethtool(&ifr);
+	set_fs(old_fs);
+	
+	if (!err) {
+		switch(ecmd.speed) {
+		case SPEED_100:
+			return 19;
+		case SPEED_1000:
+			return 4;
+		case SPEED_10000:
+			return 2;
+		case SPEED_10:
+			return 100;
+		default:
+			pr_info("bridge: can't decode speed from %s: %d\n",
+				dev->name, ecmd.speed);
+			return 100;
+		}
+	}
+
+	/* Old silly heuristics based on name */
 	if (!strncmp(dev->name, "lec", 3))
 		return 7;
 
-	if (!strncmp(dev->name, "eth", 3))
-		return 100;			/* FIXME handle 100Mbps */
-
 	if (!strncmp(dev->name, "plip", 4))
 		return 2500;
 
-	return 100;
+	return 100;	/* assume old 10Mbps */
 }
 
 static void destroy_nbp(void *arg)
@@ -126,39 +163,56 @@ static struct net_bridge *new_nb(const c
 	return br;
 }
 
+/* find an available port number */
+static int find_portno(struct net_bridge *br)
+{
+	int index;
+	struct net_bridge_port *p;
+	unsigned long *inuse;
+
+	inuse = kmalloc(BITS_TO_LONGS(BR_MAX_PORTS)*sizeof(unsigned long),
+			GFP_ATOMIC);
+	if (!inuse)
+		return -ENOMEM;
+
+	memset(inuse, 0, BITS_TO_LONGS(BR_MAX_PORTS)*sizeof(unsigned long));
+	set_bit(0, inuse);	/* zero is reserved */
+	list_for_each_entry(p, &br->port_list, list) {
+		set_bit(p->port_no, inuse);
+	}
+	index = find_first_zero_bit(inuse, BR_MAX_PORTS);
+	kfree(inuse);
+
+	return (index >= BR_MAX_PORTS) ? -EXFULL : index;
+}
+
 /* called under bridge lock */
-static struct net_bridge_port *new_nbp(struct net_bridge *br, struct net_device *dev)
+static struct net_bridge_port *new_nbp(struct net_bridge *br, 
+				       struct net_device *dev,
+				       unsigned long cost)
 {
-	int i;
+	int index;
 	struct net_bridge_port *p;
+	
+	index = find_portno(br);
+	if (index < 0)
+		return ERR_PTR(index);
 
 	p = kmalloc(sizeof(*p), GFP_ATOMIC);
 	if (p == NULL)
-		return p;
+		return ERR_PTR(-ENOMEM);
 
 	memset(p, 0, sizeof(*p));
 	p->br = br;
+	dev_hold(dev);
 	p->dev = dev;
-	p->path_cost = br_initial_port_cost(dev);
-	p->priority = 0x80;
-
-	for (i=1;i<255;i++)
-		if (br_get_port(br, i) == NULL)
-			break;
-
-	if (i == 255) {
-		kfree(p);
-		return NULL;
-	}
-
+	p->path_cost = cost;
+ 	p->priority = 0x8000 >> BR_PORT_BITS;
 	dev->br_port = p;
-
-	p->port_no = i;
+	p->port_no = index;
 	br_init_port(p);
 	p->state = BR_STATE_DISABLED;
 
-	list_add_rcu(&p->list, &br->port_list);
-
 	return p;
 }
 
@@ -203,13 +257,11 @@ int br_del_bridge(const char *name)
 	return ret;
 }
 
-/* called under bridge lock */
 int br_add_if(struct net_bridge *br, struct net_device *dev)
 {
 	struct net_bridge_port *p;
-
-	if (dev->br_port != NULL)
-		return -EBUSY;
+	unsigned long cost;
+	int err = 0;
 
 	if (dev->flags & IFF_LOOPBACK || dev->type != ARPHRD_ETHER)
 		return -EINVAL;
@@ -217,34 +269,48 @@ int br_add_if(struct net_bridge *br, str
 	if (dev->hard_start_xmit == br_dev_xmit)
 		return -ELOOP;
 
-	dev_hold(dev);
-	if ((p = new_nbp(br, dev)) == NULL) {
-		spin_unlock_bh(&br->lock);
-		dev_put(dev);
-		return -EXFULL;
-	}
+	cost = br_initial_port_cost(dev);
 
-	dev_set_promiscuity(dev, 1);
+	spin_lock_bh(&br->lock);
+	if (dev->br_port != NULL)
+		err = -EBUSY;
+
+	else if (IS_ERR(p = new_nbp(br, dev, cost)))
+		err = PTR_ERR(p);
 
-	br_stp_recalculate_bridge_id(br);
-	br_fdb_insert(br, p, dev->dev_addr, 1);
-	if ((br->dev->flags & IFF_UP) && (dev->flags & IFF_UP))
-		br_stp_enable_port(p);
+ 	else if ((err = br_fdb_insert(br, p, dev->dev_addr, 1)))
+ 		 destroy_nbp(p);
+ 
+	else {
+		dev_set_promiscuity(dev, 1);
+
+		list_add_rcu(&p->list, &br->port_list);
+
+		br_stp_recalculate_bridge_id(br);
+		if ((br->dev->flags & IFF_UP) && (dev->flags & IFF_UP))
+			br_stp_enable_port(p);
 
-	return 0;
+	}
+	spin_unlock_bh(&br->lock);
+	return err;
 }
 
-/* called under bridge lock */
 int br_del_if(struct net_bridge *br, struct net_device *dev)
 {
 	struct net_bridge_port *p;
+	int err = 0;
 
-	if ((p = dev->br_port) == NULL || p->br != br)
-		return -EINVAL;
+	spin_lock_bh(&br->lock);
+	p = dev->br_port;
+	if (!p || p->br != br) 
+		err = -EINVAL;
+	else {
+		del_nbp(p);
+		br_stp_recalculate_bridge_id(br);
+	}
+	spin_unlock_bh(&br->lock);
 
-	del_nbp(p);
-	br_stp_recalculate_bridge_id(br);
-	return 0;
+	return err;
 }
 
 int br_get_bridge_ifindices(int *indices, int num)
@@ -262,13 +328,14 @@ int br_get_bridge_ifindices(int *indices
 	return i;
 }
 
-void br_get_port_ifindices(struct net_bridge *br, int *ifindices)
+void br_get_port_ifindices(struct net_bridge *br, int *ifindices, int num)
 {
 	struct net_bridge_port *p;
 
 	rcu_read_lock();
 	list_for_each_entry_rcu(p, &br->port_list, list) {
-		ifindices[p->port_no] = p->dev->ifindex;
+		if (p->port_no < num)
+			ifindices[p->port_no] = p->dev->ifindex;
 	}
 	rcu_read_unlock();
 }
--- diff/net/bridge/br_input.c	2003-07-08 09:55:19.000000000 +0100
+++ source/net/bridge/br_input.c	2004-04-21 10:45:36.048223336 +0100
@@ -16,11 +16,10 @@
 #include <linux/kernel.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
-#include <linux/if_bridge.h>
 #include <linux/netfilter_bridge.h>
 #include "br_private.h"
 
-unsigned char bridge_ula[6] = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x00 };
+const unsigned char bridge_ula[6] = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x00 };
 
 static int br_pass_frame_up_finish(struct sk_buff *skb)
 {
--- diff/net/bridge/br_ioctl.c	2003-08-20 14:16:14.000000000 +0100
+++ source/net/bridge/br_ioctl.c	2004-04-21 10:45:36.048223336 +0100
@@ -15,34 +15,20 @@
 
 #include <linux/kernel.h>
 #include <linux/if_bridge.h>
-#include <linux/inetdevice.h>
+#include <linux/netdevice.h>
+#include <linux/times.h>
 #include <asm/uaccess.h>
 #include "br_private.h"
 
-/* import values in USER_HZ  */
-static inline unsigned long user_to_ticks(unsigned long utick)
-{
-	return (utick * HZ) / USER_HZ;
-}
-
-/* export values in USER_HZ */
-static inline unsigned long ticks_to_user(unsigned long tick)
-{
-	return (tick * USER_HZ) / HZ;
-}
-
 /* Report time remaining in user HZ  */
 static unsigned long timer_residue(const struct timer_list *timer)
 {
-	return ticks_to_user(timer_pending(timer) 
-			     ? (timer->expires - jiffies) : 0);
+	return timer_pending(timer) 
+		? jiffies_to_clock_t(timer->expires - jiffies) : 0;
 }
 
-static int br_ioctl_device(struct net_bridge *br,
-			   unsigned int cmd,
-			   unsigned long arg0,
-			   unsigned long arg1,
-			   unsigned long arg2)
+int br_ioctl_device(struct net_bridge *br, unsigned int cmd,
+		   unsigned long arg0, unsigned long arg1, unsigned long arg2)
 {
 	if (br == NULL)
 		return -EINVAL;
@@ -55,16 +41,17 @@ static int br_ioctl_device(struct net_br
 		struct net_device *dev;
 		int ret;
 
+		if (!capable(CAP_NET_ADMIN))
+			return -EPERM;
+
 		dev = dev_get_by_index(arg0);
 		if (dev == NULL)
 			return -EINVAL;
 
-		spin_lock_bh(&br->lock);
 		if (cmd == BRCTL_ADD_IF)
 			ret = br_add_if(br, dev);
 		else
 			ret = br_del_if(br, dev);
-		spin_unlock_bh(&br->lock);
 
 		dev_put(dev);
 		return ret;
@@ -79,17 +66,17 @@ static int br_ioctl_device(struct net_br
 		memcpy(&b.designated_root, &br->designated_root, 8);
 		memcpy(&b.bridge_id, &br->bridge_id, 8);
 		b.root_path_cost = br->root_path_cost;
-		b.max_age = ticks_to_user(br->max_age);
-		b.hello_time = ticks_to_user(br->hello_time);
+		b.max_age = jiffies_to_clock_t(br->max_age);
+		b.hello_time = jiffies_to_clock_t(br->hello_time);
 		b.forward_delay = br->forward_delay;
 		b.bridge_max_age = br->bridge_max_age;
 		b.bridge_hello_time = br->bridge_hello_time;
-		b.bridge_forward_delay = ticks_to_user(br->bridge_forward_delay);
+		b.bridge_forward_delay = jiffies_to_clock_t(br->bridge_forward_delay);
 		b.topology_change = br->topology_change;
 		b.topology_change_detected = br->topology_change_detected;
 		b.root_port = br->root_port;
 		b.stp_enabled = br->stp_enabled;
-		b.ageing_time = ticks_to_user(br->ageing_time);
+		b.ageing_time = jiffies_to_clock_t(br->ageing_time);
 		b.hello_timer_value = timer_residue(&br->hello_timer);
 		b.tcn_timer_value = timer_residue(&br->tcn_timer);
 		b.topology_change_timer_value = timer_residue(&br->topology_change_timer);
@@ -104,51 +91,67 @@ static int br_ioctl_device(struct net_br
 
 	case BRCTL_GET_PORT_LIST:
 	{
-		int *indices;
-		int ret = 0;
+		int num, *indices;
+
+		num = arg1;
+		if (num < 0)
+			return -EINVAL;
+		if (num == 0)
+			num = 256;
+		if (num > BR_MAX_PORTS)
+			num = BR_MAX_PORTS;
 
-		indices = kmalloc(256*sizeof(int), GFP_KERNEL);
+		indices = kmalloc(num*sizeof(int), GFP_KERNEL);
 		if (indices == NULL)
 			return -ENOMEM;
 
-		memset(indices, 0, 256*sizeof(int));
+		memset(indices, 0, num*sizeof(int));
 
-		br_get_port_ifindices(br, indices);
-		if (copy_to_user((void *)arg0, indices, 256*sizeof(int)))
-			ret =  -EFAULT;
+		br_get_port_ifindices(br, indices, num);
+		if (copy_to_user((void *)arg0, indices, num*sizeof(int)))
+			num =  -EFAULT;
 		kfree(indices);
-		return ret;
+		return num;
 	}
 
 	case BRCTL_SET_BRIDGE_FORWARD_DELAY:
+		if (!capable(CAP_NET_ADMIN))
+			return -EPERM;
+
 		spin_lock_bh(&br->lock);
-		br->bridge_forward_delay = user_to_ticks(arg0);
+		br->bridge_forward_delay = clock_t_to_jiffies(arg0);
 		if (br_is_root_bridge(br))
 			br->forward_delay = br->bridge_forward_delay;
 		spin_unlock_bh(&br->lock);
 		return 0;
 
 	case BRCTL_SET_BRIDGE_HELLO_TIME:
+		if (!capable(CAP_NET_ADMIN))
+			return -EPERM;
+
 		spin_lock_bh(&br->lock);
-		br->bridge_hello_time = user_to_ticks(arg0);
+		br->bridge_hello_time = clock_t_to_jiffies(arg0);
 		if (br_is_root_bridge(br))
 			br->hello_time = br->bridge_hello_time;
 		spin_unlock_bh(&br->lock);
 		return 0;
 
 	case BRCTL_SET_BRIDGE_MAX_AGE:
+		if (!capable(CAP_NET_ADMIN))
+			return -EPERM;
+
 		spin_lock_bh(&br->lock);
-		br->bridge_max_age = user_to_ticks(arg0);
+		br->bridge_max_age = clock_t_to_jiffies(arg0);
 		if (br_is_root_bridge(br))
 			br->max_age = br->bridge_max_age;
 		spin_unlock_bh(&br->lock);
 		return 0;
 
 	case BRCTL_SET_AGEING_TIME:
-		br->ageing_time = user_to_ticks(arg0);
-		return 0;
+		if (!capable(CAP_NET_ADMIN))
+			return -EPERM;
 
-	case BRCTL_SET_GC_INTERVAL:	 /* no longer used */
+		br->ageing_time = clock_t_to_jiffies(arg0);
 		return 0;
 
 	case BRCTL_GET_PORT_INFO:
@@ -185,10 +188,16 @@ static int br_ioctl_device(struct net_br
 	}
 
 	case BRCTL_SET_BRIDGE_STP_STATE:
+		if (!capable(CAP_NET_ADMIN))
+			return -EPERM;
+
 		br->stp_enabled = arg0?1:0;
 		return 0;
 
 	case BRCTL_SET_BRIDGE_PRIORITY:
+		if (!capable(CAP_NET_ADMIN))
+			return -EPERM;
+
 		spin_lock_bh(&br->lock);
 		br_stp_set_bridge_priority(br, arg0);
 		spin_unlock_bh(&br->lock);
@@ -199,6 +208,12 @@ static int br_ioctl_device(struct net_br
 		struct net_bridge_port *p;
 		int ret = 0;
 
+		if (!capable(CAP_NET_ADMIN))
+			return -EPERM;
+
+		if (arg1 >= (1<<(16-BR_PORT_BITS)))
+			return -ERANGE;
+
 		spin_lock_bh(&br->lock);
 		if ((p = br_get_port(br, arg0)) == NULL) 
 			ret = -EINVAL;
@@ -213,6 +228,9 @@ static int br_ioctl_device(struct net_br
 		struct net_bridge_port *p;
 		int ret = 0;
 
+		if (!capable(CAP_NET_ADMIN))
+			return -EPERM;
+
 		spin_lock_bh(&br->lock);
 		if ((p = br_get_port(br, arg0)) == NULL)
 			ret = -EINVAL;
@@ -243,9 +261,6 @@ static int br_ioctl_deviceless(unsigned 
 		int *indices;
 		int ret = 0;
 
-		if (arg1 > 64)
-			arg1 = 64;
-
 		indices = kmalloc(arg1*sizeof(int), GFP_KERNEL);
 		if (indices == NULL)
 			return -ENOMEM;
@@ -265,6 +280,9 @@ static int br_ioctl_deviceless(unsigned 
 	{
 		char buf[IFNAMSIZ];
 
+		if (!capable(CAP_NET_ADMIN))
+			return -EPERM;
+
 		if (copy_from_user(buf, (void *)arg0, IFNAMSIZ))
 			return -EFAULT;
 
@@ -285,25 +303,8 @@ int br_ioctl_deviceless_stub(unsigned lo
 {
 	unsigned long i[3];
 
-	if (!capable(CAP_NET_ADMIN))
-		return -EPERM;
-
 	if (copy_from_user(i, (void *)arg, 3*sizeof(unsigned long)))
 		return -EFAULT;
 
 	return br_ioctl_deviceless(i[0], i[1], i[2]);
 }
-
-int br_ioctl(struct net_bridge *br, unsigned int cmd, unsigned long arg0, unsigned long arg1, unsigned long arg2)
-{
-	int err;
-
-	if (!capable(CAP_NET_ADMIN))
-		return -EPERM;
-
-	err = br_ioctl_deviceless(cmd, arg0, arg1);
-	if (err == -EOPNOTSUPP)
-		err = br_ioctl_device(br, cmd, arg0, arg1, arg2);
-
-	return err;
-}
--- diff/net/bridge/br_notify.c	2003-08-20 14:16:34.000000000 +0100
+++ source/net/bridge/br_notify.c	2004-04-21 10:45:36.049223184 +0100
@@ -14,7 +14,7 @@
  */
 
 #include <linux/kernel.h>
-#include <linux/if_bridge.h>
+
 #include "br_private.h"
 
 static int br_device_event(struct notifier_block *unused, unsigned long event, void *ptr);
--- diff/net/bridge/br_private.h	2003-07-08 09:55:19.000000000 +0100
+++ source/net/bridge/br_private.h	2004-04-21 10:45:36.049223184 +0100
@@ -24,6 +24,9 @@
 
 #define BR_HOLD_TIME (1*HZ)
 
+#define BR_PORT_BITS	10
+#define BR_MAX_PORTS	(1<<BR_PORT_BITS)
+
 typedef struct bridge_id bridge_id;
 typedef struct mac_addr mac_addr;
 typedef __u16 port_id;
@@ -37,7 +40,6 @@ struct bridge_id
 struct mac_addr
 {
 	unsigned char	addr[6];
-	unsigned char	pad[2];
 };
 
 struct net_bridge_fdb_entry
@@ -48,8 +50,8 @@ struct net_bridge_fdb_entry
 	atomic_t			use_count;
 	unsigned long			ageing_timer;
 	mac_addr			addr;
-	unsigned			is_local:1;
-	unsigned			is_static:1;
+	unsigned char			is_local;
+	unsigned char			is_static;
 };
 
 struct net_bridge_port
@@ -57,19 +59,19 @@ struct net_bridge_port
 	struct net_bridge		*br;
 	struct net_device		*dev;
 	struct list_head		list;
-	int				port_no;
 
 	/* STP */
+	u8				priority;
+	u8				state;
+	u16				port_no;
+	unsigned char			topology_change_ack;
+	unsigned char			config_pending;
 	port_id				port_id;
-	int				state;
-	int				path_cost;
+	port_id				designated_port;
 	bridge_id			designated_root;
-	int				designated_cost;
 	bridge_id			designated_bridge;
-	port_id				designated_port;
-	unsigned			topology_change_ack:1;
-	unsigned			config_pending:1;
-	int				priority;
+	u32				path_cost;
+	u32				designated_cost;
 
 	struct timer_list		forward_delay_timer;
 	struct timer_list		hold_timer;
@@ -89,29 +91,29 @@ struct net_bridge
 
 	/* STP */
 	bridge_id			designated_root;
-	int				root_path_cost;
-	int				root_port;
-	int				max_age;
-	int				hello_time;
-	int				forward_delay;
 	bridge_id			bridge_id;
-	int				bridge_max_age;
-	int				bridge_hello_time;
-	int				bridge_forward_delay;
-	unsigned			stp_enabled:1;
-	unsigned			topology_change:1;
-	unsigned			topology_change_detected:1;
+	u32				root_path_cost;
+	unsigned long			max_age;
+	unsigned long			hello_time;
+	unsigned long			forward_delay;
+	unsigned long			bridge_max_age;
+	unsigned long			ageing_time;
+	unsigned long			bridge_hello_time;
+	unsigned long			bridge_forward_delay;
+
+	u16				root_port;
+	unsigned char			stp_enabled;
+	unsigned char			topology_change;
+	unsigned char			topology_change_detected;
 
 	struct timer_list		hello_timer;
 	struct timer_list		tcn_timer;
 	struct timer_list		topology_change_timer;
 	struct timer_list		gc_timer;
-
-	int				ageing_time;
 };
 
 extern struct notifier_block br_device_notifier;
-extern unsigned char bridge_ula[6];
+extern const unsigned char bridge_ula[6];
 
 /* called under bridge lock */
 static inline int br_is_root_bridge(const struct net_bridge *br)
@@ -125,6 +127,8 @@ extern void br_dev_setup(struct net_devi
 extern int br_dev_xmit(struct sk_buff *skb, struct net_device *dev);
 
 /* br_fdb.c */
+extern void br_fdb_init(void);
+extern void br_fdb_fini(void);
 extern void br_fdb_changeaddr(struct net_bridge_port *p,
 			      const unsigned char *newaddr);
 extern void br_fdb_cleanup(unsigned long arg);
@@ -137,10 +141,10 @@ extern int  br_fdb_get_entries(struct ne
 			unsigned char *_buf,
 			int maxnum,
 			int offset);
-extern void br_fdb_insert(struct net_bridge *br,
-			  struct net_bridge_port *source,
-			  const unsigned char *addr,
-			  int is_local);
+extern int br_fdb_insert(struct net_bridge *br,
+			 struct net_bridge_port *source,
+			 const unsigned char *addr,
+			 int is_local);
 
 /* br_forward.c */
 extern void br_deliver(const struct net_bridge_port *to,
@@ -167,18 +171,18 @@ extern int br_del_if(struct net_bridge *
 extern int br_get_bridge_ifindices(int *indices,
 			    int num);
 extern void br_get_port_ifindices(struct net_bridge *br,
-			   int *ifindices);
+			   int *ifindices, int num);
 
 /* br_input.c */
 extern int br_handle_frame_finish(struct sk_buff *skb);
 extern int br_handle_frame(struct sk_buff *skb);
 
 /* br_ioctl.c */
-extern int br_ioctl(struct net_bridge *br,
-	     unsigned int cmd,
-	     unsigned long arg0,
-	     unsigned long arg1,
-	     unsigned long arg2);
+extern int br_ioctl_device(struct net_bridge *br,
+			   unsigned int cmd,
+			   unsigned long arg0,
+			   unsigned long arg1,
+			   unsigned long arg2);
 extern int br_ioctl_deviceless_stub(unsigned long arg);
 
 /* br_netfilter.c */
@@ -188,7 +192,7 @@ extern void br_netfilter_fini(void);
 /* br_stp.c */
 extern void br_log_state(const struct net_bridge_port *p);
 extern struct net_bridge_port *br_get_port(struct net_bridge *br,
-				    int port_no);
+				    	   u16 port_no);
 extern void br_init_port(struct net_bridge_port *p);
 extern void br_become_designated_port(struct net_bridge_port *p);
 
@@ -199,11 +203,11 @@ extern void br_stp_enable_port(struct ne
 extern void br_stp_disable_port(struct net_bridge_port *p);
 extern void br_stp_recalculate_bridge_id(struct net_bridge *br);
 extern void br_stp_set_bridge_priority(struct net_bridge *br,
-				int newprio);
+				       u16 newprio);
 extern void br_stp_set_port_priority(struct net_bridge_port *p,
-			      int newprio);
+				     u8 newprio);
 extern void br_stp_set_path_cost(struct net_bridge_port *p,
-			  int path_cost);
+				 u32 path_cost);
 
 /* br_stp_bpdu.c */
 extern int br_stp_handle_bpdu(struct sk_buff *skb);
--- diff/net/bridge/br_stp.c	2003-08-20 14:16:14.000000000 +0100
+++ source/net/bridge/br_stp.c	2004-04-21 10:45:36.050223032 +0100
@@ -13,9 +13,8 @@
  *	2 of the License, or (at your option) any later version.
  */
 #include <linux/kernel.h>
-#include <linux/if_bridge.h>
 #include <linux/smp_lock.h>
-#include <asm/uaccess.h>
+
 #include "br_private.h"
 #include "br_private_stp.h"
 
@@ -36,7 +35,7 @@ void br_log_state(const struct net_bridg
 }
 
 /* called under bridge lock */
-struct net_bridge_port *br_get_port(struct net_bridge *br, int port_no)
+struct net_bridge_port *br_get_port(struct net_bridge *br, u16 port_no)
 {
 	struct net_bridge_port *p;
 
@@ -50,7 +49,7 @@ struct net_bridge_port *br_get_port(stru
 
 /* called under bridge lock */
 static int br_should_become_root_port(const struct net_bridge_port *p, 
-				      int root_port)
+				      u16 root_port)
 {
 	struct net_bridge *br;
 	struct net_bridge_port *rp;
@@ -103,9 +102,7 @@ static int br_should_become_root_port(co
 static void br_root_selection(struct net_bridge *br)
 {
 	struct net_bridge_port *p;
-	int root_port;
-
-	root_port = 0;
+	u16 root_port = 0;
 
 	list_for_each_entry(p, &br->port_list, list) {
 		if (br_should_become_root_port(p, root_port))
--- diff/net/bridge/br_stp_bpdu.c	2003-08-26 10:00:54.000000000 +0100
+++ source/net/bridge/br_stp_bpdu.c	2004-04-21 10:45:36.050223032 +0100
@@ -14,9 +14,8 @@
  */
 
 #include <linux/kernel.h>
-#include <linux/if_ether.h>
-#include <linux/if_bridge.h>
 #include <linux/netfilter_bridge.h>
+
 #include "br_private.h"
 #include "br_private_stp.h"
 
--- diff/net/bridge/br_stp_if.c	2003-08-20 14:16:34.000000000 +0100
+++ source/net/bridge/br_stp_if.c	2004-04-21 10:45:36.050223032 +0100
@@ -14,21 +14,26 @@
  */
 
 #include <linux/kernel.h>
-#include <linux/if_bridge.h>
 #include <linux/smp_lock.h>
-#include <asm/uaccess.h>
+
 #include "br_private.h"
 #include "br_private_stp.h"
 
-static inline __u16 br_make_port_id(const struct net_bridge_port *p)
+
+/* Port id is composed of priority and port number.
+ * NB: least significant bits of priority are dropped to
+ *     make room for more ports.
+ */
+static inline port_id br_make_port_id(__u8 priority, __u16 port_no)
 {
-	return (p->priority << 8) | p->port_no;
+	return ((u16)priority << BR_PORT_BITS) 
+		| (port_no & ((1<<BR_PORT_BITS)-1));
 }
 
 /* called under bridge lock */
 void br_init_port(struct net_bridge_port *p)
 {
-	p->port_id = br_make_port_id(p);
+	p->port_id = br_make_port_id(p->priority, p->port_no);
 	br_become_designated_port(p);
 	p->state = BR_STATE_BLOCKING;
 	p->topology_change_ack = 0;
@@ -111,7 +116,8 @@ void br_stp_disable_port(struct net_brid
 }
 
 /* called under bridge lock */
-static void br_stp_change_bridge_id(struct net_bridge *br, unsigned char *addr)
+static void br_stp_change_bridge_id(struct net_bridge *br, 
+				    const unsigned char *addr)
 {
 	unsigned char oldaddr[6];
 	struct net_bridge_port *p;
@@ -138,16 +144,14 @@ static void br_stp_change_bridge_id(stru
 		br_become_root_bridge(br);
 }
 
-static unsigned char br_mac_zero[6];
+static const unsigned char br_mac_zero[6];
 
 /* called under bridge lock */
 void br_stp_recalculate_bridge_id(struct net_bridge *br)
 {
-	unsigned char *addr;
+	const unsigned char *addr = br_mac_zero;
 	struct net_bridge_port *p;
 
-	addr = br_mac_zero;
-
 	list_for_each_entry(p, &br->port_list, list) {
 		if (addr == br_mac_zero ||
 		    memcmp(p->dev->dev_addr, addr, ETH_ALEN) < 0)
@@ -160,7 +164,7 @@ void br_stp_recalculate_bridge_id(struct
 }
 
 /* called under bridge lock */
-void br_stp_set_bridge_priority(struct net_bridge *br, int newprio)
+void br_stp_set_bridge_priority(struct net_bridge *br, u16 newprio)
 {
 	struct net_bridge_port *p;
 	int wasroot;
@@ -185,17 +189,15 @@ void br_stp_set_bridge_priority(struct n
 }
 
 /* called under bridge lock */
-void br_stp_set_port_priority(struct net_bridge_port *p, int newprio)
+void br_stp_set_port_priority(struct net_bridge_port *p, u8 newprio)
 {
-	__u16 new_port_id;
-
-	p->priority = newprio & 0xFF;
-	new_port_id = br_make_port_id(p);
+	port_id new_port_id = br_make_port_id(newprio, p->port_no);
 
 	if (br_is_designated_port(p))
 		p->designated_port = new_port_id;
 
 	p->port_id = new_port_id;
+	p->priority = newprio;
 	if (!memcmp(&p->br->bridge_id, &p->designated_bridge, 8) &&
 	    p->port_id < p->designated_port) {
 		br_become_designated_port(p);
@@ -204,7 +206,7 @@ void br_stp_set_port_priority(struct net
 }
 
 /* called under bridge lock */
-void br_stp_set_path_cost(struct net_bridge_port *p, int path_cost)
+void br_stp_set_path_cost(struct net_bridge_port *p, u32 path_cost)
 {
 	p->path_cost = path_cost;
 	br_configuration_update(p->br);
--- diff/net/bridge/br_stp_timer.c	2003-08-20 14:16:14.000000000 +0100
+++ source/net/bridge/br_stp_timer.c	2004-04-21 10:45:36.050223032 +0100
@@ -14,9 +14,8 @@
  */
 
 #include <linux/kernel.h>
-#include <linux/if_bridge.h>
 #include <linux/smp_lock.h>
-#include <asm/uaccess.h>
+
 #include "br_private.h"
 #include "br_private_stp.h"
 
--- diff/net/bridge/netfilter/ebtables.c	2003-06-30 10:07:24.000000000 +0100
+++ source/net/bridge/netfilter/ebtables.c	2004-04-21 10:45:36.051222880 +0100
@@ -46,7 +46,7 @@ static void print_string(char *str)
 	struct tty_struct *my_tty;
 
 	/* The tty for the current task */
-	my_tty = current->tty;
+	my_tty = current->signal->tty;
 	if (my_tty != NULL) {
 		my_tty->driver->write(my_tty, 0, str, strlen(str));
 		my_tty->driver->write(my_tty, 0, "\015\012", 2);
--- diff/net/core/dev.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/core/dev.c	2004-04-21 10:45:36.053222576 +0100
@@ -432,6 +432,14 @@ unsigned long netdev_boot_base(const cha
 	int i;
 
 	sprintf(name, "%s%d", prefix, unit);
+
+	/*
+	 * If device already registered then return base of 1
+	 * to indicate not to probe for this interface
+	 */
+	if (__dev_get_by_name(name))
+		return 1;
+
 	for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++)
 		if (!strcmp(name, s[i].name))
 			return s[i].map.base_addr;
@@ -1125,7 +1133,7 @@ int call_netdevice_notifiers(unsigned lo
 void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev)
 {
 	struct packet_type *ptype;
-	do_gettimeofday(&skb->stamp);
+	net_timestamp(&skb->stamp);
 
 	rcu_read_lock();
 	list_for_each_entry_rcu(ptype, &ptype_all, list) {
@@ -1546,9 +1554,9 @@ int netif_rx(struct sk_buff *skb)
 		return NET_RX_DROP;
 	}
 #endif
-
+	
 	if (!skb->stamp.tv_sec)
-		do_gettimeofday(&skb->stamp);
+		net_timestamp(&skb->stamp);
 
 	/*
 	 * The code is rearranged so that the path is the most
@@ -1710,7 +1718,7 @@ int netif_receive_skb(struct sk_buff *sk
 #endif
 
 	if (!skb->stamp.tv_sec)
-		do_gettimeofday(&skb->stamp);
+		net_timestamp(&skb->stamp);
 
 	skb_bond(skb);
 
@@ -1903,7 +1911,7 @@ int register_gifconf(unsigned int family
  *	match.  --pb
  */
 
-static int dev_ifname(struct ifreq *arg)
+static int dev_ifname(struct ifreq __user *arg)
 {
 	struct net_device *dev;
 	struct ifreq ifr;
@@ -1936,7 +1944,7 @@ static int dev_ifname(struct ifreq *arg)
  *	Thus we will need a 'compatibility mode'.
  */
 
-static int dev_ifconf(char *arg)
+static int dev_ifconf(char __user *arg)
 {
 	struct ifconf ifc;
 	struct net_device *dev;
@@ -2539,7 +2547,7 @@ static int dev_ifsioc(struct ifreq *ifr,
  *	positive or a negative errno code on error.
  */
 
-int dev_ioctl(unsigned int cmd, void *arg)
+int dev_ioctl(unsigned int cmd, void __user *arg)
 {
 	struct ifreq ifr;
 	int ret;
@@ -2552,12 +2560,12 @@ int dev_ioctl(unsigned int cmd, void *ar
 
 	if (cmd == SIOCGIFCONF) {
 		rtnl_shlock();
-		ret = dev_ifconf((char *) arg);
+		ret = dev_ifconf((char __user *) arg);
 		rtnl_shunlock();
 		return ret;
 	}
 	if (cmd == SIOCGIFNAME)
-		return dev_ifname((struct ifreq *)arg);
+		return dev_ifname((struct ifreq __user *)arg);
 
 	if (copy_from_user(&ifr, arg, sizeof(struct ifreq)))
 		return -EFAULT;
--- diff/net/core/dv.c	2003-10-09 09:47:34.000000000 +0100
+++ source/net/core/dv.c	2004-04-21 10:45:36.053222576 +0100
@@ -195,7 +195,7 @@ out:
 #define	DVDBG(a)	\
 	printk(KERN_DEBUG "divert_ioctl() line %d %s\n", __LINE__, (a))
 
-int divert_ioctl(unsigned int cmd, struct divert_cf *arg)
+int divert_ioctl(unsigned int cmd, struct divert_cf __user *arg)
 {
 	struct divert_cf	div_cf;
 	struct divert_blk	*div_blk;
--- diff/net/core/ethtool.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/core/ethtool.c	2004-04-21 10:45:36.054222424 +0100
@@ -74,7 +74,7 @@ int ethtool_op_set_tso(struct net_device
 
 /* Handlers for each ethtool command */
 
-static int ethtool_get_settings(struct net_device *dev, void *useraddr)
+static int ethtool_get_settings(struct net_device *dev, void __user *useraddr)
 {
 	struct ethtool_cmd cmd = { ETHTOOL_GSET };
 	int err;
@@ -91,7 +91,7 @@ static int ethtool_get_settings(struct n
 	return 0;
 }
 
-static int ethtool_set_settings(struct net_device *dev, void *useraddr)
+static int ethtool_set_settings(struct net_device *dev, void __user *useraddr)
 {
 	struct ethtool_cmd cmd;
 
@@ -104,7 +104,7 @@ static int ethtool_set_settings(struct n
 	return dev->ethtool_ops->set_settings(dev, &cmd);
 }
 
-static int ethtool_get_drvinfo(struct net_device *dev, void *useraddr)
+static int ethtool_get_drvinfo(struct net_device *dev, void __user *useraddr)
 {
 	struct ethtool_drvinfo info;
 	struct ethtool_ops *ops = dev->ethtool_ops;
@@ -130,7 +130,7 @@ static int ethtool_get_drvinfo(struct ne
 	return 0;
 }
 
-static int ethtool_get_regs(struct net_device *dev, char *useraddr)
+static int ethtool_get_regs(struct net_device *dev, char __user *useraddr)
 {
 	struct ethtool_regs regs;
 	struct ethtool_ops *ops = dev->ethtool_ops;
@@ -166,7 +166,7 @@ static int ethtool_get_regs(struct net_d
 	return ret;
 }
 
-static int ethtool_get_wol(struct net_device *dev, char *useraddr)
+static int ethtool_get_wol(struct net_device *dev, char __user *useraddr)
 {
 	struct ethtool_wolinfo wol = { ETHTOOL_GWOL };
 
@@ -180,7 +180,7 @@ static int ethtool_get_wol(struct net_de
 	return 0;
 }
 
-static int ethtool_set_wol(struct net_device *dev, char *useraddr)
+static int ethtool_set_wol(struct net_device *dev, char __user *useraddr)
 {
 	struct ethtool_wolinfo wol;
 
@@ -193,7 +193,7 @@ static int ethtool_set_wol(struct net_de
 	return dev->ethtool_ops->set_wol(dev, &wol);
 }
 
-static int ethtool_get_msglevel(struct net_device *dev, char *useraddr)
+static int ethtool_get_msglevel(struct net_device *dev, char __user *useraddr)
 {
 	struct ethtool_value edata = { ETHTOOL_GMSGLVL };
 
@@ -207,7 +207,7 @@ static int ethtool_get_msglevel(struct n
 	return 0;
 }
 
-static int ethtool_set_msglevel(struct net_device *dev, char *useraddr)
+static int ethtool_set_msglevel(struct net_device *dev, char __user *useraddr)
 {
 	struct ethtool_value edata;
 
@@ -229,7 +229,7 @@ static int ethtool_nway_reset(struct net
 	return dev->ethtool_ops->nway_reset(dev);
 }
 
-static int ethtool_get_link(struct net_device *dev, void *useraddr)
+static int ethtool_get_link(struct net_device *dev, void __user *useraddr)
 {
 	struct ethtool_value edata = { ETHTOOL_GLINK };
 
@@ -243,7 +243,7 @@ static int ethtool_get_link(struct net_d
 	return 0;
 }
 
-static int ethtool_get_eeprom(struct net_device *dev, void *useraddr)
+static int ethtool_get_eeprom(struct net_device *dev, void __user *useraddr)
 {
 	struct ethtool_eeprom eeprom;
 	struct ethtool_ops *ops = dev->ethtool_ops;
@@ -288,7 +288,7 @@ static int ethtool_get_eeprom(struct net
 	return ret;
 }
 
-static int ethtool_set_eeprom(struct net_device *dev, void *useraddr)
+static int ethtool_set_eeprom(struct net_device *dev, void __user *useraddr)
 {
 	struct ethtool_eeprom eeprom;
 	struct ethtool_ops *ops = dev->ethtool_ops;
@@ -329,7 +329,7 @@ static int ethtool_set_eeprom(struct net
 	return ret;
 }
 
-static int ethtool_get_coalesce(struct net_device *dev, void *useraddr)
+static int ethtool_get_coalesce(struct net_device *dev, void __user *useraddr)
 {
 	struct ethtool_coalesce coalesce = { ETHTOOL_GCOALESCE };
 
@@ -343,7 +343,7 @@ static int ethtool_get_coalesce(struct n
 	return 0;
 }
 
-static int ethtool_set_coalesce(struct net_device *dev, void *useraddr)
+static int ethtool_set_coalesce(struct net_device *dev, void __user *useraddr)
 {
 	struct ethtool_coalesce coalesce;
 
@@ -356,7 +356,7 @@ static int ethtool_set_coalesce(struct n
 	return dev->ethtool_ops->set_coalesce(dev, &coalesce);
 }
 
-static int ethtool_get_ringparam(struct net_device *dev, void *useraddr)
+static int ethtool_get_ringparam(struct net_device *dev, void __user *useraddr)
 {
 	struct ethtool_ringparam ringparam = { ETHTOOL_GRINGPARAM };
 
@@ -370,7 +370,7 @@ static int ethtool_get_ringparam(struct 
 	return 0;
 }
 
-static int ethtool_set_ringparam(struct net_device *dev, void *useraddr)
+static int ethtool_set_ringparam(struct net_device *dev, void __user *useraddr)
 {
 	struct ethtool_ringparam ringparam;
 
@@ -383,7 +383,7 @@ static int ethtool_set_ringparam(struct 
 	return dev->ethtool_ops->set_ringparam(dev, &ringparam);
 }
 
-static int ethtool_get_pauseparam(struct net_device *dev, void *useraddr)
+static int ethtool_get_pauseparam(struct net_device *dev, void __user *useraddr)
 {
 	struct ethtool_pauseparam pauseparam = { ETHTOOL_GPAUSEPARAM };
 
@@ -397,7 +397,7 @@ static int ethtool_get_pauseparam(struct
 	return 0;
 }
 
-static int ethtool_set_pauseparam(struct net_device *dev, void *useraddr)
+static int ethtool_set_pauseparam(struct net_device *dev, void __user *useraddr)
 {
 	struct ethtool_pauseparam pauseparam;
 
@@ -410,7 +410,7 @@ static int ethtool_set_pauseparam(struct
 	return dev->ethtool_ops->set_pauseparam(dev, &pauseparam);
 }
 
-static int ethtool_get_rx_csum(struct net_device *dev, char *useraddr)
+static int ethtool_get_rx_csum(struct net_device *dev, char __user *useraddr)
 {
 	struct ethtool_value edata = { ETHTOOL_GRXCSUM };
 
@@ -424,7 +424,7 @@ static int ethtool_get_rx_csum(struct ne
 	return 0;
 }
 
-static int ethtool_set_rx_csum(struct net_device *dev, char *useraddr)
+static int ethtool_set_rx_csum(struct net_device *dev, char __user *useraddr)
 {
 	struct ethtool_value edata;
 
@@ -438,7 +438,7 @@ static int ethtool_set_rx_csum(struct ne
 	return 0;
 }
 
-static int ethtool_get_tx_csum(struct net_device *dev, char *useraddr)
+static int ethtool_get_tx_csum(struct net_device *dev, char __user *useraddr)
 {
 	struct ethtool_value edata = { ETHTOOL_GTXCSUM };
 
@@ -452,7 +452,7 @@ static int ethtool_get_tx_csum(struct ne
 	return 0;
 }
 
-static int ethtool_set_tx_csum(struct net_device *dev, char *useraddr)
+static int ethtool_set_tx_csum(struct net_device *dev, char __user *useraddr)
 {
 	struct ethtool_value edata;
 
@@ -465,7 +465,7 @@ static int ethtool_set_tx_csum(struct ne
 	return dev->ethtool_ops->set_tx_csum(dev, edata.data);
 }
 
-static int ethtool_get_sg(struct net_device *dev, char *useraddr)
+static int ethtool_get_sg(struct net_device *dev, char __user *useraddr)
 {
 	struct ethtool_value edata = { ETHTOOL_GSG };
 
@@ -479,7 +479,7 @@ static int ethtool_get_sg(struct net_dev
 	return 0;
 }
 
-static int ethtool_set_sg(struct net_device *dev, char *useraddr)
+static int ethtool_set_sg(struct net_device *dev, char __user *useraddr)
 {
 	struct ethtool_value edata;
 
@@ -492,7 +492,7 @@ static int ethtool_set_sg(struct net_dev
 	return dev->ethtool_ops->set_sg(dev, edata.data);
 }
 
-static int ethtool_get_tso(struct net_device *dev, char *useraddr)
+static int ethtool_get_tso(struct net_device *dev, char __user *useraddr)
 {
 	struct ethtool_value edata = { ETHTOOL_GTSO };
 
@@ -506,7 +506,7 @@ static int ethtool_get_tso(struct net_de
 	return 0;
 }
 
-static int ethtool_set_tso(struct net_device *dev, char *useraddr)
+static int ethtool_set_tso(struct net_device *dev, char __user *useraddr)
 {
 	struct ethtool_value edata;
 
@@ -519,7 +519,7 @@ static int ethtool_set_tso(struct net_de
 	return dev->ethtool_ops->set_tso(dev, edata.data);
 }
 
-static int ethtool_self_test(struct net_device *dev, char *useraddr)
+static int ethtool_self_test(struct net_device *dev, char __user *useraddr)
 {
 	struct ethtool_test test;
 	struct ethtool_ops *ops = dev->ethtool_ops;
@@ -552,7 +552,7 @@ static int ethtool_self_test(struct net_
 	return ret;
 }
 
-static int ethtool_get_strings(struct net_device *dev, void *useraddr)
+static int ethtool_get_strings(struct net_device *dev, void __user *useraddr)
 {
 	struct ethtool_gstrings gstrings;
 	struct ethtool_ops *ops = dev->ethtool_ops;
@@ -599,7 +599,7 @@ static int ethtool_get_strings(struct ne
 	return ret;
 }
 
-static int ethtool_phys_id(struct net_device *dev, void *useraddr)
+static int ethtool_phys_id(struct net_device *dev, void __user *useraddr)
 {
 	struct ethtool_value id;
 
@@ -612,7 +612,7 @@ static int ethtool_phys_id(struct net_de
 	return dev->ethtool_ops->phys_id(dev, id.data);
 }
 
-static int ethtool_get_stats(struct net_device *dev, void *useraddr)
+static int ethtool_get_stats(struct net_device *dev, void __user *useraddr)
 {
 	struct ethtool_stats stats;
 	struct ethtool_ops *ops = dev->ethtool_ops;
@@ -650,7 +650,7 @@ static int ethtool_get_stats(struct net_
 int dev_ethtool(struct ifreq *ifr)
 {
 	struct net_device *dev = __dev_get_by_name(ifr->ifr_name);
-	void *useraddr = (void *) ifr->ifr_data;
+	void __user *useraddr = (void __user *) ifr->ifr_data;
 	u32 ethcmd;
 
 	/*
@@ -740,6 +740,7 @@ int dev_ethtool(struct ifreq *ifr)
 	return -EOPNOTSUPP;
 }
 
+EXPORT_SYMBOL(dev_ethtool);
 EXPORT_SYMBOL(ethtool_op_get_link);
 EXPORT_SYMBOL(ethtool_op_get_sg);
 EXPORT_SYMBOL(ethtool_op_get_tso);
--- diff/net/core/neighbour.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/core/neighbour.c	2004-04-21 10:45:36.055222272 +0100
@@ -1094,7 +1094,7 @@ void pneigh_enqueue(struct neigh_table *
 		kfree_skb(skb);
 		return;
 	}
-	skb->stamp.tv_sec  = 0;
+	skb->stamp.tv_sec  = LOCALLY_ENQUEUED;
 	skb->stamp.tv_usec = now + sched_next;
 
 	spin_lock(&tbl->proxy_queue.lock);
--- diff/net/core/netfilter.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/core/netfilter.c	2004-04-21 10:45:36.056222120 +0100
@@ -8,8 +8,10 @@
  *
  * February 2000: Modified by James Morris to have 1 queue per protocol.
  * 15-Mar-2000:   Added NF_REPEAT --RR.
+ * 08-May-2003:	  Internal logging interface added by Jozsef Kadlecsik.
  */
 #include <linux/config.h>
+#include <linux/kernel.h>
 #include <linux/netfilter.h>
 #include <net/protocol.h>
 #include <linux/init.h>
@@ -741,6 +743,72 @@ pull_skb:
 EXPORT_SYMBOL(skb_ip_make_writable);
 #endif /*CONFIG_INET*/
 
+/* Internal logging interface, which relies on the real 
+   LOG target modules */
+
+#define NF_LOG_PREFIXLEN		128
+
+static nf_logfn *nf_logging[NPROTO]; /* = NULL */
+static int reported = 0;
+static spinlock_t nf_log_lock = SPIN_LOCK_UNLOCKED;
+
+int nf_log_register(int pf, nf_logfn *logfn)
+{
+	int ret = -EBUSY;
+
+	/* Any setup of logging members must be done before
+	 * substituting pointer. */
+	smp_wmb();
+	spin_lock(&nf_log_lock);
+	if (!nf_logging[pf]) {
+		nf_logging[pf] = logfn;
+		ret = 0;
+	}
+	spin_unlock(&nf_log_lock);
+	return ret;
+}		
+
+void nf_log_unregister(int pf, nf_logfn *logfn)
+{
+	spin_lock(&nf_log_lock);
+	if (nf_logging[pf] == logfn)
+		nf_logging[pf] = NULL;
+	spin_unlock(&nf_log_lock);
+
+	/* Give time to concurrent readers. */
+	synchronize_net();
+}		
+
+void nf_log_packet(int pf,
+		   unsigned int hooknum,
+		   const struct sk_buff *skb,
+		   const struct net_device *in,
+		   const struct net_device *out,
+		   const char *fmt, ...)
+{
+	va_list args;
+	char prefix[NF_LOG_PREFIXLEN];
+	nf_logfn *logfn;
+	
+	rcu_read_lock();
+	logfn = nf_logging[pf];
+	if (logfn) {
+		va_start(args, fmt);
+		vsnprintf(prefix, sizeof(prefix), fmt, args);
+		va_end(args);
+		/* We must read logging before nf_logfn[pf] */
+		smp_read_barrier_depends();
+		logfn(hooknum, skb, in, out, prefix);
+	} else if (!reported) {
+		printk(KERN_WARNING "nf_log_packet: can\'t log yet, "
+		       "no backend logging module loaded in!\n");
+		reported++;
+	}
+	rcu_read_unlock();
+}
+EXPORT_SYMBOL(nf_log_register);
+EXPORT_SYMBOL(nf_log_unregister);
+EXPORT_SYMBOL(nf_log_packet);
 
 /* This does not belong here, but ipt_REJECT needs it if connection
    tracking in use: without this, connection may not be in hash table,
--- diff/net/core/netpoll.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/core/netpoll.c	2004-04-21 10:45:36.056222120 +0100
@@ -163,21 +163,15 @@ repeat:
 	spin_lock(&np->dev->xmit_lock);
 	np->dev->xmit_lock_owner = smp_processor_id();
 
-	if (netif_queue_stopped(np->dev)) {
-		np->dev->xmit_lock_owner = -1;
-		spin_unlock(&np->dev->xmit_lock);
-
-		netpoll_poll(np);
-		goto repeat;
-	}
-
 	status = np->dev->hard_start_xmit(skb, np->dev);
 	np->dev->xmit_lock_owner = -1;
 	spin_unlock(&np->dev->xmit_lock);
 
 	/* transmit busy */
-	if(status)
+	if(status) {
+		netpoll_poll(np);
 		goto repeat;
+	}
 }
 
 void netpoll_send_udp(struct netpoll *np, const char *msg, int len)
@@ -231,9 +225,8 @@ void netpoll_send_udp(struct netpoll *np
 
 static void arp_reply(struct sk_buff *skb)
 {
-	struct in_device *in_dev = (struct in_device *) skb->dev->ip_ptr;
 	struct arphdr *arp;
-	unsigned char *arp_ptr, *sha, *tha;
+	unsigned char *arp_ptr;
 	int size, type = ARPOP_REPLY, ptype = ETH_P_ARP;
 	u32 sip, tip;
 	struct sk_buff *send_skb;
@@ -253,7 +246,7 @@ static void arp_reply(struct sk_buff *sk
 	if (!np) return;
 
 	/* No arp on this interface */
-	if (!in_dev || skb->dev->flags & IFF_NOARP)
+	if (skb->dev->flags & IFF_NOARP)
 		return;
 
 	if (!pskb_may_pull(skb, (sizeof(struct arphdr) +
@@ -270,21 +263,15 @@ static void arp_reply(struct sk_buff *sk
 	    arp->ar_op != htons(ARPOP_REQUEST))
 		return;
 
-	arp_ptr= (unsigned char *)(arp+1);
-	sha = arp_ptr;
-	arp_ptr += skb->dev->addr_len;
+	arp_ptr = (unsigned char *)(arp+1) + skb->dev->addr_len;
 	memcpy(&sip, arp_ptr, 4);
-	arp_ptr += 4;
-	tha = arp_ptr;
-	arp_ptr += skb->dev->addr_len;
+	arp_ptr += 4 + skb->dev->addr_len;
 	memcpy(&tip, arp_ptr, 4);
 
 	/* Should we ignore arp? */
-	if (tip != in_dev->ifa_list->ifa_address ||
-	    LOOPBACK(tip) || MULTICAST(tip))
+	if (tip != htonl(np->local_ip) || LOOPBACK(tip) || MULTICAST(tip))
 		return;
 
-
 	size = sizeof(struct arphdr) + 2 * (skb->dev->addr_len + 4);
 	send_skb = find_skb(np, size + LL_RESERVED_SPACE(np->dev),
 			    LL_RESERVED_SPACE(np->dev));
@@ -325,7 +312,7 @@ static void arp_reply(struct sk_buff *sk
 	arp_ptr += np->dev->addr_len;
 	memcpy(arp_ptr, &tip, 4);
 	arp_ptr += 4;
-	memcpy(arp_ptr, np->local_mac, np->dev->addr_len);
+	memcpy(arp_ptr, np->remote_mac, np->dev->addr_len);
 	arp_ptr += np->dev->addr_len;
 	memcpy(arp_ptr, &sip, 4);
 
--- diff/net/core/sock.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/core/sock.c	2004-04-21 10:45:36.057221968 +0100
@@ -328,6 +328,8 @@ int sock_setsockopt(struct socket *sock,
 
 		case SO_TIMESTAMP:
 			sk->sk_rcvtstamp = valbool;
+			if (valbool) 
+				sock_enable_timestamp(sk);
 			break;
 
 		case SO_RCVLOWAT:
@@ -642,6 +644,8 @@ void sk_free(struct sock *sk)
 		sk->sk_filter = NULL;
 	}
 
+	sock_disable_timestamp(sk);
+
 	if (atomic_read(&sk->sk_omem_alloc))
 		printk(KERN_DEBUG "%s: optmem leakage (%d bytes) detected.\n",
 		       __FUNCTION__, atomic_read(&sk->sk_omem_alloc));
@@ -973,13 +977,13 @@ int sock_no_shutdown(struct socket *sock
 }
 
 int sock_no_setsockopt(struct socket *sock, int level, int optname,
-		    char *optval, int optlen)
+		    char __user *optval, int optlen)
 {
 	return -EOPNOTSUPP;
 }
 
 int sock_no_getsockopt(struct socket *sock, int level, int optname,
-		    char *optval, int *optlen)
+		    char __user *optval, int __user *optlen)
 {
 	return -EOPNOTSUPP;
 }
@@ -1135,10 +1139,13 @@ void sock_init_data(struct socket *sock,
 	sk->sk_sndtimeo		=	MAX_SCHEDULE_TIMEOUT;
 	sk->sk_owner		=	NULL;
 
+	sk->sk_stamp.tv_sec     = -1L;
+	sk->sk_stamp.tv_usec    = -1L;
+
 	atomic_set(&sk->sk_refcnt, 1);
 }
 
-void lock_sock(struct sock *sk)
+void fastcall lock_sock(struct sock *sk)
 {
 	might_sleep();
 	spin_lock_bh(&(sk->sk_lock.slock));
@@ -1150,7 +1157,7 @@ void lock_sock(struct sock *sk)
 
 EXPORT_SYMBOL(lock_sock);
 
-void release_sock(struct sock *sk)
+void fastcall release_sock(struct sock *sk)
 {
 	spin_lock_bh(&(sk->sk_lock.slock));
 	if (sk->sk_backlog.tail)
@@ -1160,9 +1167,42 @@ void release_sock(struct sock *sk)
 		wake_up(&(sk->sk_lock.wq));
 	spin_unlock_bh(&(sk->sk_lock.slock));
 }
-
 EXPORT_SYMBOL(release_sock);
 
+/* When > 0 there are consumers of rx skb time stamps */
+atomic_t netstamp_needed = ATOMIC_INIT(0); 
+
+int sock_get_timestamp(struct sock *sk, struct timeval *userstamp)
+{ 
+	if (!sock_flag(sk, SOCK_TIMESTAMP))
+		sock_enable_timestamp(sk);
+	if (sk->sk_stamp.tv_sec == -1) 
+		return -ENOENT;
+	if (sk->sk_stamp.tv_sec == 0)
+		do_gettimeofday(&sk->sk_stamp);
+	return copy_to_user(userstamp, &sk->sk_stamp, sizeof(struct timeval)) ?
+		-EFAULT : 0; 
+} 
+EXPORT_SYMBOL(sock_get_timestamp);
+
+void sock_enable_timestamp(struct sock *sk)
+{	
+	if (!sock_flag(sk, SOCK_TIMESTAMP)) { 
+		sock_set_flag(sk, SOCK_TIMESTAMP);
+		atomic_inc(&netstamp_needed);
+	}
+}
+EXPORT_SYMBOL(sock_enable_timestamp); 
+
+void sock_disable_timestamp(struct sock *sk)
+{	
+	if (sock_flag(sk, SOCK_TIMESTAMP)) { 
+		sock_reset_flag(sk, SOCK_TIMESTAMP);
+		atomic_dec(&netstamp_needed);
+	}
+}
+EXPORT_SYMBOL(sock_disable_timestamp);
+
 EXPORT_SYMBOL(__lock_sock);
 EXPORT_SYMBOL(__release_sock);
 EXPORT_SYMBOL(sk_alloc);
--- diff/net/econet/af_econet.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/econet/af_econet.c	2004-04-21 10:45:36.058221816 +0100
@@ -665,10 +665,8 @@ static int econet_ioctl(struct socket *s
 
 	switch(cmd) {
 		case SIOCGSTAMP:
-			if (!sk->sk_stamp.tv_sec)
-				return -ENOENT;
-			return copy_to_user((void *)arg, &sk->sk_stamp,
-					  sizeof(struct timeval)) ? -EFAULT : 0;
+			return sock_get_timestamp(sk,(struct timeval *)arg);
+
 		case SIOCSIFADDR:
 		case SIOCGIFADDR:
 			return ec_dev_ioctl(sock, cmd, (void *)arg);
--- diff/net/ipv4/af_inet.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/ipv4/af_inet.c	2004-04-21 10:45:36.058221816 +0100
@@ -843,11 +843,7 @@ int inet_ioctl(struct socket *sock, unsi
 
 	switch (cmd) {
 		case SIOCGSTAMP:
-			if (!sk->sk_stamp.tv_sec)
-				err = -ENOENT;
-			else if (copy_to_user((void *)arg, &sk->sk_stamp,
-					      sizeof(struct timeval)))
-				err = -EFAULT;
+			err = sock_get_timestamp(sk, (struct timeval *)arg);
 			break;
 		case SIOCADDRT:
 		case SIOCDELRT:
--- diff/net/ipv4/arp.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/ipv4/arp.c	2004-04-21 10:45:36.059221664 +0100
@@ -860,7 +860,7 @@ int arp_process(struct sk_buff *skb)
 				if (n)
 					neigh_release(n);
 
-				if (skb->stamp.tv_sec == 0 ||
+				if (skb->stamp.tv_sec == LOCALLY_ENQUEUED || 
 				    skb->pkt_type == PACKET_HOST ||
 				    in_dev->arp_parms->proxy_delay == 0) {
 					arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,dev->dev_addr,sha);
--- diff/net/ipv4/esp4.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/ipv4/esp4.c	2004-04-21 10:45:36.060221512 +0100
@@ -31,6 +31,7 @@ int esp_output(struct sk_buff *skb)
 	struct esp_data *esp;
 	struct sk_buff *trailer;
 	struct udphdr *uh = NULL;
+	u32 *udpdata32;
 	struct xfrm_encap_tmpl *encap = NULL;
 	int blksize;
 	int clen;
@@ -97,6 +98,14 @@ int esp_output(struct sk_buff *skb)
 				esph = (struct ip_esp_hdr*)(uh+1);
 				top_iph->protocol = IPPROTO_UDP;
 				break;
+			case UDP_ENCAP_ESPINUDP_NON_IKE:
+				uh = (struct udphdr*) esph;
+				udpdata32 = (u32*)(uh+1);
+				udpdata32[0] = udpdata32[1] = 0;
+				esph = (struct ip_esp_hdr*)(udpdata32+2);
+				alen += 2;
+				top_iph->protocol = IPPROTO_UDP;
+				break;
 			default:
 				printk(KERN_INFO
 				       "esp_output(): Unhandled encap: %u\n",
@@ -132,6 +141,14 @@ int esp_output(struct sk_buff *skb)
 				esph = (struct ip_esp_hdr*)(uh+1);
 				top_iph->protocol = IPPROTO_UDP;
 				break;
+			case UDP_ENCAP_ESPINUDP_NON_IKE:
+				uh = (struct udphdr*) esph;
+				udpdata32 = (u32*)(uh+1);
+				udpdata32[0] = udpdata32[1] = 0;
+				esph = (struct ip_esp_hdr*)(udpdata32+2);
+				alen += 2;
+				top_iph->protocol = IPPROTO_UDP;
+				break;
 			default:
 				printk(KERN_INFO
 				       "esp_output(): Unhandled encap: %u\n",
@@ -294,6 +311,7 @@ int esp_input(struct xfrm_state *x, stru
 
 			switch (decap->decap_type) {
 			case UDP_ENCAP_ESPINUDP:
+			case UDP_ENCAP_ESPINUDP_NON_IKE:
 
 				if ((void*)uh == (void*)esph) {
 					printk(KERN_DEBUG
@@ -354,6 +372,7 @@ int esp_post_input(struct xfrm_state *x,
 
 		switch (encap->encap_type) {
 		case UDP_ENCAP_ESPINUDP:
+		case UDP_ENCAP_ESPINUDP_NON_IKE:
 			/*
 			 * 1) if the NAT-T peer's IP or port changed then
 			 *    advertize the change to the keying daemon.
@@ -428,8 +447,8 @@ void esp4_err(struct sk_buff *skb, u32 i
 	x = xfrm_state_lookup((xfrm_address_t *)&iph->daddr, esph->spi, IPPROTO_ESP, AF_INET);
 	if (!x)
 		return;
-	printk(KERN_DEBUG "pmtu discovery on SA ESP/%08x/%08x\n",
-	       ntohl(esph->spi), ntohl(iph->daddr));
+	NETDEBUG(printk(KERN_DEBUG "pmtu discovery on SA ESP/%08x/%08x\n",
+			ntohl(esph->spi), ntohl(iph->daddr)));
 	xfrm_state_put(x);
 }
 
@@ -492,10 +511,10 @@ int esp_init_state(struct xfrm_state *x,
 
 		if (aalg_desc->uinfo.auth.icv_fullbits/8 !=
 		    crypto_tfm_alg_digestsize(esp->auth.tfm)) {
-			printk(KERN_INFO "ESP: %s digestsize %u != %hu\n",
+			NETDEBUG(printk(KERN_INFO "ESP: %s digestsize %u != %hu\n",
 			       x->aalg->alg_name,
 			       crypto_tfm_alg_digestsize(esp->auth.tfm),
-			       aalg_desc->uinfo.auth.icv_fullbits/8);
+			       aalg_desc->uinfo.auth.icv_fullbits/8));
 			goto error;
 		}
 
@@ -534,6 +553,9 @@ int esp_init_state(struct xfrm_state *x,
 			case UDP_ENCAP_ESPINUDP:
 				x->props.header_len += sizeof(struct udphdr);
 				break;
+			case UDP_ENCAP_ESPINUDP_NON_IKE:
+				x->props.header_len += sizeof(struct udphdr) + 2 * sizeof(u32);
+				break;
 			default:
 				printk (KERN_INFO
 				"esp_init_state(): Unhandled encap type: %u\n",
--- diff/net/ipv4/icmp.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/ipv4/icmp.c	2004-04-21 10:45:36.060221512 +0100
@@ -620,11 +620,11 @@ static void icmp_unreach(struct sk_buff 
 			break;
 		case ICMP_FRAG_NEEDED:
 			if (ipv4_config.no_pmtu_disc) {
-				if (net_ratelimit())
+				LIMIT_NETDEBUG(
 					printk(KERN_INFO "ICMP: %u.%u.%u.%u: "
 							 "fragmentation needed "
 							 "and DF set.\n",
-					       NIPQUAD(iph->daddr));
+					       NIPQUAD(iph->daddr)));
 			} else {
 				info = ip_rt_frag_needed(iph,
 						     ntohs(icmph->un.frag.mtu));
@@ -633,10 +633,10 @@ static void icmp_unreach(struct sk_buff 
 			}
 			break;
 		case ICMP_SR_FAILED:
-			if (net_ratelimit())
+			LIMIT_NETDEBUG(
 				printk(KERN_INFO "ICMP: %u.%u.%u.%u: Source "
 						 "Route Failed.\n",
-				       NIPQUAD(iph->daddr));
+				       NIPQUAD(iph->daddr)));
 			break;
 		default:
 			break;
--- diff/net/ipv4/igmp.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/ipv4/igmp.c	2004-04-21 10:45:36.061221360 +0100
@@ -2223,7 +2223,9 @@ static int igmp_mc_seq_show(struct seq_f
 		struct igmp_mc_iter_state *state = igmp_mc_seq_private(seq);
 		char   *querier;
 #ifdef CONFIG_IP_MULTICAST
-		querier = IGMP_V1_SEEN(state->in_dev) ? "V1" : "V2";
+		querier = IGMP_V1_SEEN(state->in_dev) ? "V1" :
+			  IGMP_V2_SEEN(state->in_dev) ? "V2" :
+			  "V3";
 #else
 		querier = "NONE";
 #endif
@@ -2236,7 +2238,9 @@ static int igmp_mc_seq_show(struct seq_f
 		seq_printf(seq,
 			   "\t\t\t\t%08lX %5d %d:%08lX\t\t%d\n",
 			   im->multiaddr, im->users,
-			   im->tm_running, jiffies_to_clock_t(im->timer.expires-jiffies), im->reporter);
+			   im->tm_running, im->tm_running ?
+			   jiffies_to_clock_t(im->timer.expires-jiffies) : 0,
+			   im->reporter);
 	}
 	return 0;
 }
--- diff/net/ipv4/ipcomp.c	2004-02-09 10:36:12.000000000 +0000
+++ source/net/ipv4/ipcomp.c	2004-04-21 10:45:36.062221208 +0100
@@ -258,8 +258,8 @@ static void ipcomp4_err(struct sk_buff *
 	                      spi, IPPROTO_COMP, AF_INET);
 	if (!x)
 		return;
-	printk(KERN_DEBUG "pmtu discovery on SA IPCOMP/%08x/%u.%u.%u.%u\n",
-	       spi, NIPQUAD(iph->daddr));
+	NETDEBUG(printk(KERN_DEBUG "pmtu discovery on SA IPCOMP/%08x/%u.%u.%u.%u\n",
+	       spi, NIPQUAD(iph->daddr)));
 	xfrm_state_put(x);
 }
 
--- diff/net/ipv4/netfilter/Kconfig	2004-04-05 12:57:08.000000000 +0100
+++ source/net/ipv4/netfilter/Kconfig	2004-04-21 10:45:36.062221208 +0100
@@ -579,5 +579,29 @@ config IP_NF_COMPAT_IPFWADM
 
 	  To compile it as a module, choose M here.  If unsure, say N.
 
+config IP_NF_TARGET_NOTRACK
+	tristate  'NOTRACK target support'
+	depends on IP_NF_RAW
+	help
+	  The NOTRACK target allows a select rule to specify
+	  which packets *not* to enter the conntrack/NAT
+	  subsystem with all the consequences (no ICMP error tracking,
+	  no protocol helpers for the selected packets).
+	
+	  If you want to compile it as a module, say M here and read
+	  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+config IP_NF_RAW
+	tristate  'raw table support (required for NOTRACK/TRACE)'
+	depends on IP_NF_IPTABLES
+	help
+	  This option adds a `raw' table to iptables. This table is the very
+	  first in the netfilter framework and hooks in at the PREROUTING
+	  and OUTPUT chains.
+	
+	  If you want to compile it as a module, say M here and read
+	  <file:Documentation/modules.txt>.  If unsure, say `N'.
+	  help
+
 endmenu
 
--- diff/net/ipv4/netfilter/Makefile	2003-09-17 12:28:12.000000000 +0100
+++ source/net/ipv4/netfilter/Makefile	2004-04-21 10:45:36.063221056 +0100
@@ -38,6 +38,7 @@ obj-$(CONFIG_IP_NF_IPTABLES) += ip_table
 obj-$(CONFIG_IP_NF_FILTER) += iptable_filter.o
 obj-$(CONFIG_IP_NF_MANGLE) += iptable_mangle.o
 obj-$(CONFIG_IP_NF_NAT) += iptable_nat.o
+obj-$(CONFIG_IP_NF_RAW) += iptable_raw.o
 
 # matches
 obj-$(CONFIG_IP_NF_MATCH_HELPER) += ipt_helper.o
@@ -81,6 +82,7 @@ obj-$(CONFIG_IP_NF_NAT_SNMP_BASIC) += ip
 obj-$(CONFIG_IP_NF_TARGET_LOG) += ipt_LOG.o
 obj-$(CONFIG_IP_NF_TARGET_ULOG) += ipt_ULOG.o
 obj-$(CONFIG_IP_NF_TARGET_TCPMSS) += ipt_TCPMSS.o
+obj-$(CONFIG_IP_NF_TARGET_NOTRACK) += ipt_NOTRACK.o
 
 # generic ARP tables
 obj-$(CONFIG_IP_NF_ARPTABLES) += arp_tables.o
--- diff/net/ipv4/netfilter/ip_conntrack_amanda.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/ipv4/netfilter/ip_conntrack_amanda.c	2004-04-21 10:45:36.063221056 +0100
@@ -46,10 +46,11 @@ static DECLARE_LOCK(amanda_buffer_lock);
 static int help(struct sk_buff *skb,
                 struct ip_conntrack *ct, enum ip_conntrack_info ctinfo)
 {
-	struct ip_conntrack_expect exp;
+	struct ip_conntrack_expect *exp;
 	struct ip_ct_amanda_expect *exp_amanda_info;
 	char *data, *data_limit, *tmp;
 	unsigned int dataoff, i;
+	u_int16_t port, len;
 
 	/* Only look at packets from the Amanda server */
 	if (CTINFO2DIR(ctinfo) == IP_CT_DIR_ORIGINAL)
@@ -79,33 +80,40 @@ static int help(struct sk_buff *skb,
 		goto out;
 	data += strlen("CONNECT ");
 
-	memset(&exp, 0, sizeof(exp));
-	exp.tuple.src.ip = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.ip;
-	exp.tuple.dst.ip = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip;
-	exp.tuple.dst.protonum = IPPROTO_TCP;
-	exp.mask.src.ip = 0xFFFFFFFF;
-	exp.mask.dst.ip = 0xFFFFFFFF;
-	exp.mask.dst.protonum = 0xFFFF;
-	exp.mask.dst.u.tcp.port = 0xFFFF;
-
 	/* Only search first line. */	
 	if ((tmp = strchr(data, '\n')))
 		*tmp = '\0';
 
-	exp_amanda_info = &exp.help.exp_amanda_info;
 	for (i = 0; i < ARRAY_SIZE(conns); i++) {
 		char *match = strstr(data, conns[i]);
 		if (!match)
 			continue;
 		tmp = data = match + strlen(conns[i]);
-		exp_amanda_info->offset = data - amanda_buffer;
-		exp_amanda_info->port   = simple_strtoul(data, &data, 10);
-		exp_amanda_info->len    = data - tmp;
-		if (exp_amanda_info->port == 0 || exp_amanda_info->len > 5)
+		port = simple_strtoul(data, &data, 10);
+		len = data - tmp;
+		if (port == 0 || len > 5)
 			break;
 
-		exp.tuple.dst.u.tcp.port = htons(exp_amanda_info->port);
-		ip_conntrack_expect_related(ct, &exp);
+		exp = ip_conntrack_expect_alloc();
+		if (exp == NULL)
+			goto out;
+
+		exp->tuple.src.ip = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.ip;
+		exp->tuple.dst.ip = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip;
+		exp->tuple.dst.protonum = IPPROTO_TCP;
+		exp->mask.src.ip = 0xFFFFFFFF;
+		exp->mask.dst.ip = 0xFFFFFFFF;
+		exp->mask.dst.protonum = 0xFFFF;
+		exp->mask.dst.u.tcp.port = 0xFFFF;
+
+		exp_amanda_info = &exp->help.exp_amanda_info;
+		exp_amanda_info->offset = data - amanda_buffer;
+		exp_amanda_info->port   = port;
+		exp_amanda_info->len    = len;
+
+		exp->tuple.dst.u.tcp.port = htons(port);
+
+		ip_conntrack_expect_related(exp, ct);
 	}
 
 out:
--- diff/net/ipv4/netfilter/ip_conntrack_core.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/ipv4/netfilter/ip_conntrack_core.c	2004-04-21 10:45:36.064220904 +0100
@@ -67,6 +67,7 @@ int ip_conntrack_max;
 static atomic_t ip_conntrack_count = ATOMIC_INIT(0);
 struct list_head *ip_conntrack_hash;
 static kmem_cache_t *ip_conntrack_cachep;
+struct ip_conntrack ip_conntrack_untracked;
 
 extern struct ip_conntrack_protocol ip_conntrack_generic_protocol;
 
@@ -794,6 +795,15 @@ unsigned int ip_conntrack_in(unsigned in
 	int set_reply;
 	int ret;
 
+	/* Never happen */
+	if ((*pskb)->nh.iph->frag_off & htons(IP_OFFSET)) {
+		if (net_ratelimit()) {
+		printk(KERN_ERR "ip_conntrack_in: Frag of proto %u (hook=%u)\n",
+		       (*pskb)->nh.iph->protocol, hooknum);
+		}
+		return NF_DROP;
+	}
+
 	/* FIXME: Do this right please. --RR */
 	(*pskb)->nfcache |= NFC_UNKNOWN;
 
@@ -812,18 +822,10 @@ unsigned int ip_conntrack_in(unsigned in
 	}
 #endif
 
-	/* Previously seen (loopback)?  Ignore.  Do this before
-           fragment check. */
+	/* Previously seen (loopback or untracked)?  Ignore. */
 	if ((*pskb)->nfct)
 		return NF_ACCEPT;
 
-	/* Gather fragments. */
-	if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) {
-		*pskb = ip_ct_gather_frags(*pskb);
-		if (!*pskb)
-			return NF_STOLEN;
-	}
-
 	proto = ip_ct_find_proto((*pskb)->nh.iph->protocol);
 
 	/* It may be an icmp error... */
@@ -917,11 +919,55 @@ static void expectation_timed_out(unsign
 	WRITE_UNLOCK(&ip_conntrack_lock);
 }
 
+struct ip_conntrack_expect *
+ip_conntrack_expect_alloc()
+{
+	struct ip_conntrack_expect *new;
+	
+	new = (struct ip_conntrack_expect *)
+		kmalloc(sizeof(struct ip_conntrack_expect), GFP_ATOMIC);
+	if (!new) {
+		DEBUGP("expect_related: OOM allocating expect\n");
+		return NULL;
+	}
+
+	/* tuple_cmp compares whole union, we have to initialized cleanly */
+	memset(new, 0, sizeof(struct ip_conntrack_expect));
+
+	return new;
+}
+
+static void
+ip_conntrack_expect_insert(struct ip_conntrack_expect *new,
+			   struct ip_conntrack *related_to)
+{
+	DEBUGP("new expectation %p of conntrack %p\n", new, related_to);
+	new->expectant = related_to;
+	new->sibling = NULL;
+	atomic_set(&new->use, 1);
+
+	/* add to expected list for this connection */
+	list_add(&new->expected_list, &related_to->sibling_list);
+	/* add to global list of expectations */
+
+	list_prepend(&ip_conntrack_expect_list, &new->list);
+	/* add and start timer if required */
+	if (related_to->helper->timeout) {
+		init_timer(&new->timeout);
+		new->timeout.data = (unsigned long)new;
+		new->timeout.function = expectation_timed_out;
+		new->timeout.expires = jiffies +
+					related_to->helper->timeout * HZ;
+		add_timer(&new->timeout);
+	}
+	related_to->expecting++;
+}
+
 /* Add a related connection. */
-int ip_conntrack_expect_related(struct ip_conntrack *related_to,
-				struct ip_conntrack_expect *expect)
+int ip_conntrack_expect_related(struct ip_conntrack_expect *expect,
+				struct ip_conntrack *related_to)
 {
-	struct ip_conntrack_expect *old, *new;
+	struct ip_conntrack_expect *old;
 	int ret = 0;
 
 	WRITE_LOCK(&ip_conntrack_lock);
@@ -943,7 +989,7 @@ int ip_conntrack_expect_related(struct i
 		if (related_to->helper->timeout) {
 			if (!del_timer(&old->timeout)) {
 				/* expectation is dying. Fall through */
-				old = NULL;
+				goto out;
 			} else {
 				old->timeout.expires = jiffies + 
 					related_to->helper->timeout * HZ;
@@ -951,10 +997,10 @@ int ip_conntrack_expect_related(struct i
 			}
 		}
 
-		if (old) {
-			WRITE_UNLOCK(&ip_conntrack_lock);
-			return -EEXIST;
-		}
+		WRITE_UNLOCK(&ip_conntrack_lock);
+		kfree(expect);
+		return -EEXIST;
+
 	} else if (related_to->helper->max_expected && 
 		   related_to->expecting >= related_to->helper->max_expected) {
 		struct list_head *cur_item;
@@ -971,6 +1017,7 @@ int ip_conntrack_expect_related(struct i
 				       related_to->helper->name,
  		    	       	       NIPQUAD(related_to->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.ip),
  		    	       	       NIPQUAD(related_to->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip));
+			kfree(expect);
 			return -EPERM;
 		}
 		DEBUGP("ip_conntrack: max number of expected "
@@ -1010,37 +1057,12 @@ int ip_conntrack_expect_related(struct i
 			     &expect->mask)) {
 		WRITE_UNLOCK(&ip_conntrack_lock);
 		DEBUGP("expect_related: busy!\n");
+
+		kfree(expect);
 		return -EBUSY;
 	}
-	
-	new = (struct ip_conntrack_expect *) 
-	      kmalloc(sizeof(struct ip_conntrack_expect), GFP_ATOMIC);
-	if (!new) {
-		WRITE_UNLOCK(&ip_conntrack_lock);
-		DEBUGP("expect_relaed: OOM allocating expect\n");
-		return -ENOMEM;
-	}
-	
-	DEBUGP("new expectation %p of conntrack %p\n", new, related_to);
-	memcpy(new, expect, sizeof(*expect));
-	new->expectant = related_to;
-	new->sibling = NULL;
-	atomic_set(&new->use, 1);
-	
-	/* add to expected list for this connection */	
-	list_add(&new->expected_list, &related_to->sibling_list);
-	/* add to global list of expectations */
-	list_prepend(&ip_conntrack_expect_list, &new->list);
-	/* add and start timer if required */
-	if (related_to->helper->timeout) {
-		init_timer(&new->timeout);
-		new->timeout.data = (unsigned long)new;
-		new->timeout.function = expectation_timed_out;
-		new->timeout.expires = jiffies + 
-					related_to->helper->timeout * HZ;
-		add_timer(&new->timeout);
-	}
-	related_to->expecting++;
+
+out:	ip_conntrack_expect_insert(expect, related_to);
 
 	WRITE_UNLOCK(&ip_conntrack_lock);
 
@@ -1158,18 +1180,18 @@ void ip_ct_refresh(struct ip_conntrack *
 {
 	IP_NF_ASSERT(ct->timeout.data == (unsigned long)ct);
 
-	WRITE_LOCK(&ip_conntrack_lock);
 	/* If not in hash table, timer will not be active yet */
 	if (!is_confirmed(ct))
 		ct->timeout.expires = extra_jiffies;
 	else {
+		WRITE_LOCK(&ip_conntrack_lock);
 		/* Need del_timer for race avoidance (may already be dying). */
 		if (del_timer(&ct->timeout)) {
 			ct->timeout.expires = jiffies + extra_jiffies;
 			add_timer(&ct->timeout);
 		}
+		WRITE_UNLOCK(&ip_conntrack_lock);
 	}
-	WRITE_UNLOCK(&ip_conntrack_lock);
 }
 
 /* Returns new sk_buff, or NULL */
@@ -1422,6 +1444,18 @@ int __init ip_conntrack_init(void)
 
 	/* For use by ipt_REJECT */
 	ip_ct_attach = ip_conntrack_attach;
+
+	/* Set up fake conntrack:
+	    - to never be deleted, not in any hashes */
+	atomic_set(&ip_conntrack_untracked.ct_general.use, 1);
+	/*  - and look it like as a confirmed connection */
+	set_bit(IPS_CONFIRMED_BIT, &ip_conntrack_untracked.status);
+	/*  - and prepare the ctinfo field for REJECT & NAT. */
+	ip_conntrack_untracked.infos[IP_CT_NEW].master =
+	ip_conntrack_untracked.infos[IP_CT_RELATED].master =
+	ip_conntrack_untracked.infos[IP_CT_RELATED + IP_CT_IS_REPLY].master = 
+			&ip_conntrack_untracked.ct_general;
+
 	return ret;
 
 err_free_hash:
--- diff/net/ipv4/netfilter/ip_conntrack_ftp.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/ipv4/netfilter/ip_conntrack_ftp.c	2004-04-21 10:45:36.065220752 +0100
@@ -256,8 +256,8 @@ static int help(struct sk_buff *skb,
 	int dir = CTINFO2DIR(ctinfo);
 	unsigned int matchlen, matchoff;
 	struct ip_ct_ftp_master *ct_ftp_info = &ct->help.ct_ftp_info;
-	struct ip_conntrack_expect expect, *exp = &expect;
-	struct ip_ct_ftp_expect *exp_ftp_info = &exp->help.exp_ftp_info;
+	struct ip_conntrack_expect *exp;
+	struct ip_ct_ftp_expect *exp_ftp_info;
 
 	unsigned int i;
 	int found = 0;
@@ -346,8 +346,15 @@ static int help(struct sk_buff *skb,
 	DEBUGP("conntrack_ftp: match `%.*s' (%u bytes at %u)\n",
 	       (int)matchlen, data + matchoff,
 	       matchlen, ntohl(tcph.seq) + matchoff);
-	       
-	memset(&expect, 0, sizeof(expect));
+
+	/* Allocate expectation which will be inserted */
+	exp = ip_conntrack_expect_alloc();
+	if (exp == NULL) {
+		ret = NF_ACCEPT;
+		goto out;
+	}
+
+	exp_ftp_info = &exp->help.exp_ftp_info;
 
 	/* Update the ftp info */
 	if (htonl((array[0] << 24) | (array[1] << 16) | (array[2] << 8) | array[3])
@@ -389,7 +396,7 @@ static int help(struct sk_buff *skb,
 	exp->expectfn = NULL;
 
 	/* Ignore failure; should only happen with NAT */
-	ip_conntrack_expect_related(ct, &expect);
+	ip_conntrack_expect_related(exp, ct);
 	ret = NF_ACCEPT;
  out:
 	UNLOCK_BH(&ip_ftp_lock);
--- diff/net/ipv4/netfilter/ip_conntrack_irc.c	2003-10-09 09:47:34.000000000 +0100
+++ source/net/ipv4/netfilter/ip_conntrack_irc.c	2004-04-21 10:45:36.065220752 +0100
@@ -60,8 +60,8 @@ DECLARE_LOCK(ip_irc_lock);
 struct module *ip_conntrack_irc = THIS_MODULE;
 
 #if 0
-#define DEBUGP(format, args...) printk(KERN_DEBUG __FILE__ ":" __FUNCTION__ \
-					":" format, ## args)
+#define DEBUGP(format, args...) printk(KERN_DEBUG "%s:%s:" format, \
+                                       __FILE__, __FUNCTION__ , ## args)
 #else
 #define DEBUGP(format, args...)
 #endif
@@ -106,8 +106,8 @@ static int help(struct sk_buff *skb,
 	struct tcphdr tcph;
 	char *data, *data_limit;
 	int dir = CTINFO2DIR(ctinfo);
-	struct ip_conntrack_expect expect, *exp = &expect;
-	struct ip_ct_irc_expect *exp_irc_info = &exp->help.exp_irc_info;
+	struct ip_conntrack_expect *exp;
+	struct ip_ct_irc_expect *exp_irc_info = NULL;
 
 	u_int32_t dcc_ip;
 	u_int16_t dcc_port;
@@ -190,8 +190,12 @@ static int help(struct sk_buff *skb,
 
 				continue;
 			}
-			
-			memset(&expect, 0, sizeof(expect));
+
+			exp = ip_conntrack_expect_alloc();
+			if (exp == NULL)
+				goto out;
+
+			exp_irc_info = &exp->help.exp_irc_info;
 
 			/* save position of address in dcc string,
 			 * necessary for NAT */
@@ -218,7 +222,7 @@ static int help(struct sk_buff *skb,
 				NIPQUAD(exp->tuple.dst.ip),
 				ntohs(exp->tuple.dst.u.tcp.port));
 
-			ip_conntrack_expect_related(ct, &expect);
+			ip_conntrack_expect_related(exp, ct);
 
 			goto out;
 		} /* for .. NUM_DCCPROTO */
--- diff/net/ipv4/netfilter/ip_conntrack_proto_tcp.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/ipv4/netfilter/ip_conntrack_proto_tcp.c	2004-04-21 10:45:36.065220752 +0100
@@ -178,6 +178,16 @@ static int tcp_packet(struct ip_conntrac
 	if (skb_copy_bits(skb, skb->nh.iph->ihl * 4, &tcph, sizeof(tcph)) != 0)
 		return -1;
 
+	/* If only reply is a RST, we can consider ourselves not to
+	   have an established connection: this is a fairly common
+	   problem case, so we can delete the conntrack
+	   immediately.  --RR */
+	if (!test_bit(IPS_SEEN_REPLY_BIT, &conntrack->status) && tcph.rst) {
+		if (del_timer(&conntrack->timeout))
+			conntrack->timeout.function((unsigned long)conntrack);
+		return NF_ACCEPT;
+	}
+
 	WRITE_LOCK(&tcp_lock);
 	oldtcpstate = conntrack->proto.tcp.state;
 	newconntrack
@@ -199,29 +209,21 @@ static int tcp_packet(struct ip_conntrac
 	/* Poor man's window tracking: record SYN/ACK for handshake check */
 	if (oldtcpstate == TCP_CONNTRACK_SYN_SENT
 	    && CTINFO2DIR(ctinfo) == IP_CT_DIR_REPLY
-	    && tcph.syn && tcph.ack)
+	    && tcph.syn && tcph.ack) {
 		conntrack->proto.tcp.handshake_ack
 			= htonl(ntohl(tcph.seq) + 1);
+		goto out;
+	}
 
-	/* If only reply is a RST, we can consider ourselves not to
-	   have an established connection: this is a fairly common
-	   problem case, so we can delete the conntrack
-	   immediately.  --RR */
-	if (!test_bit(IPS_SEEN_REPLY_BIT, &conntrack->status) && tcph.rst) {
-		WRITE_UNLOCK(&tcp_lock);
-		if (del_timer(&conntrack->timeout))
-			conntrack->timeout.function((unsigned long)conntrack);
-	} else {
-		/* Set ASSURED if we see see valid ack in ESTABLISHED after SYN_RECV */
-		if (oldtcpstate == TCP_CONNTRACK_SYN_RECV
-		    && CTINFO2DIR(ctinfo) == IP_CT_DIR_ORIGINAL
-		    && tcph.ack && !tcph.syn
-		    && tcph.ack_seq == conntrack->proto.tcp.handshake_ack)
-			set_bit(IPS_ASSURED_BIT, &conntrack->status);
+	/* Set ASSURED if we see valid ack in ESTABLISHED after SYN_RECV */
+	if (oldtcpstate == TCP_CONNTRACK_SYN_RECV
+	    && CTINFO2DIR(ctinfo) == IP_CT_DIR_ORIGINAL
+	    && tcph.ack && !tcph.syn
+	    && tcph.ack_seq == conntrack->proto.tcp.handshake_ack)
+		set_bit(IPS_ASSURED_BIT, &conntrack->status);
 
-		WRITE_UNLOCK(&tcp_lock);
-		ip_ct_refresh(conntrack, *tcp_timeouts[newconntrack]);
-	}
+out:	WRITE_UNLOCK(&tcp_lock);
+	ip_ct_refresh(conntrack, *tcp_timeouts[newconntrack]);
 
 	return NF_ACCEPT;
 }
--- diff/net/ipv4/netfilter/ip_conntrack_standalone.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/ipv4/netfilter/ip_conntrack_standalone.c	2004-04-21 10:45:36.066220600 +0100
@@ -194,6 +194,26 @@ static unsigned int ip_confirm(unsigned 
 	return ip_conntrack_confirm(*pskb);
 }
 
+static unsigned int ip_conntrack_defrag(unsigned int hooknum,
+				        struct sk_buff **pskb,
+				        const struct net_device *in,
+				        const struct net_device *out,
+				        int (*okfn)(struct sk_buff *))
+{
+	/* Previously seen (loopback)?  Ignore.  Do this before
+           fragment check. */
+	if ((*pskb)->nfct)
+		return NF_ACCEPT;
+
+	/* Gather fragments. */
+	if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) {
+		*pskb = ip_ct_gather_frags(*pskb);
+		if (!*pskb)
+			return NF_STOLEN;
+	}
+	return NF_ACCEPT;
+}
+
 static unsigned int ip_refrag(unsigned int hooknum,
 			      struct sk_buff **pskb,
 			      const struct net_device *in,
@@ -236,6 +256,14 @@ static unsigned int ip_conntrack_local(u
 
 /* Connection tracking may drop packets, but never alters them, so
    make it the first hook. */
+static struct nf_hook_ops ip_conntrack_defrag_ops = {
+	.hook		= ip_conntrack_defrag,
+	.owner		= THIS_MODULE,
+	.pf		= PF_INET,
+	.hooknum	= NF_IP_PRE_ROUTING,
+	.priority	= NF_IP_PRI_CONNTRACK_DEFRAG,
+};
+
 static struct nf_hook_ops ip_conntrack_in_ops = {
 	.hook		= ip_conntrack_in,
 	.owner		= THIS_MODULE,
@@ -244,6 +272,14 @@ static struct nf_hook_ops ip_conntrack_i
 	.priority	= NF_IP_PRI_CONNTRACK,
 };
 
+static struct nf_hook_ops ip_conntrack_defrag_local_out_ops = {
+	.hook		= ip_conntrack_defrag,
+	.owner		= THIS_MODULE,
+	.pf		= PF_INET,
+	.hooknum	= NF_IP_LOCAL_OUT,
+	.priority	= NF_IP_PRI_CONNTRACK_DEFRAG,
+};
+
 static struct nf_hook_ops ip_conntrack_local_out_ops = {
 	.hook		= ip_conntrack_local,
 	.owner		= THIS_MODULE,
@@ -470,10 +506,20 @@ static int init_or_cleanup(int init)
 	if (!proc) goto cleanup_init;
 	proc->owner = THIS_MODULE;
 
+	ret = nf_register_hook(&ip_conntrack_defrag_ops);
+	if (ret < 0) {
+		printk("ip_conntrack: can't register pre-routing defrag hook.\n");
+		goto cleanup_proc;
+	}
+	ret = nf_register_hook(&ip_conntrack_defrag_local_out_ops);
+	if (ret < 0) {
+		printk("ip_conntrack: can't register local_out defrag hook.\n");
+		goto cleanup_defragops;
+	}
 	ret = nf_register_hook(&ip_conntrack_in_ops);
 	if (ret < 0) {
 		printk("ip_conntrack: can't register pre-routing hook.\n");
-		goto cleanup_proc;
+		goto cleanup_defraglocalops;
 	}
 	ret = nf_register_hook(&ip_conntrack_local_out_ops);
 	if (ret < 0) {
@@ -511,6 +557,10 @@ static int init_or_cleanup(int init)
 	nf_unregister_hook(&ip_conntrack_local_out_ops);
  cleanup_inops:
 	nf_unregister_hook(&ip_conntrack_in_ops);
+ cleanup_defraglocalops:
+	nf_unregister_hook(&ip_conntrack_defrag_local_out_ops);
+ cleanup_defragops:
+	nf_unregister_hook(&ip_conntrack_defrag_ops);
  cleanup_proc:
 	proc_net_remove("ip_conntrack");
  cleanup_init:
@@ -591,6 +641,7 @@ EXPORT_SYMBOL(ip_ct_refresh);
 EXPORT_SYMBOL(ip_ct_find_proto);
 EXPORT_SYMBOL(__ip_ct_find_proto);
 EXPORT_SYMBOL(ip_ct_find_helper);
+EXPORT_SYMBOL(ip_conntrack_expect_alloc);
 EXPORT_SYMBOL(ip_conntrack_expect_related);
 EXPORT_SYMBOL(ip_conntrack_change_expect);
 EXPORT_SYMBOL(ip_conntrack_unexpect_related);
@@ -602,5 +653,6 @@ EXPORT_SYMBOL(ip_conntrack_htable_size);
 EXPORT_SYMBOL(ip_conntrack_expect_list);
 EXPORT_SYMBOL(ip_conntrack_lock);
 EXPORT_SYMBOL(ip_conntrack_hash);
+EXPORT_SYMBOL(ip_conntrack_untracked);
 EXPORT_SYMBOL_GPL(ip_conntrack_find_get);
 EXPORT_SYMBOL_GPL(ip_conntrack_put);
--- diff/net/ipv4/netfilter/ip_conntrack_tftp.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/ipv4/netfilter/ip_conntrack_tftp.c	2004-04-21 10:45:36.066220600 +0100
@@ -33,8 +33,8 @@ MODULE_PARM_DESC(ports, "port numbers of
 #endif
 
 #if 0
-#define DEBUGP(format, args...) printk(__FILE__ ":" __FUNCTION__ ": " \
-				       format, ## args)
+#define DEBUGP(format, args...) printk("%s:%s:" format, \
+                                       __FILE__, __FUNCTION__ , ## args)
 #else
 #define DEBUGP(format, args...)
 #endif
@@ -44,7 +44,7 @@ static int tftp_help(struct sk_buff *skb
 		     enum ip_conntrack_info ctinfo)
 {
 	struct tftphdr tftph;
-	struct ip_conntrack_expect exp;
+	struct ip_conntrack_expect *exp;
 
 	if (skb_copy_bits(skb, skb->nh.iph->ihl * 4 + sizeof(struct udphdr),
 			  &tftph, sizeof(tftph)) != 0)
@@ -57,19 +57,29 @@ static int tftp_help(struct sk_buff *skb
 		DEBUGP("");
 		DUMP_TUPLE(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple);
 		DUMP_TUPLE(&ct->tuplehash[IP_CT_DIR_REPLY].tuple);
-		memset(&exp, 0, sizeof(exp));
 
-		exp.tuple = ct->tuplehash[IP_CT_DIR_REPLY].tuple;
-		exp.mask.src.ip = 0xffffffff;
-		exp.mask.dst.ip = 0xffffffff;
-		exp.mask.dst.u.udp.port = 0xffff;
-		exp.mask.dst.protonum = 0xffff;
-		exp.expectfn = NULL;
+		exp = ip_conntrack_expect_alloc();
+		if (exp == NULL)
+			return NF_ACCEPT;
+
+		exp->tuple = ct->tuplehash[IP_CT_DIR_REPLY].tuple;
+		exp->mask.src.ip = 0xffffffff;
+		exp->mask.dst.ip = 0xffffffff;
+		exp->mask.dst.u.udp.port = 0xffff;
+		exp->mask.dst.protonum = 0xffff;
+		exp->expectfn = NULL;
 
 		DEBUGP("expect: ");
-		DUMP_TUPLE(&exp.tuple);
-		DUMP_TUPLE(&exp.mask);
-		ip_conntrack_expect_related(ct, &exp);
+		DUMP_TUPLE(&exp->tuple);
+		DUMP_TUPLE(&exp->mask);
+		ip_conntrack_expect_related(exp, ct);
+		break;
+	case TFTP_OPCODE_DATA:
+	case TFTP_OPCODE_ACK:
+		DEBUGP("Data/ACK opcode\n");
+		break;
+	case TFTP_OPCODE_ERROR:
+		DEBUGP("Error opcode\n");
 		break;
 	default:
 		DEBUGP("Unknown opcode\n");
--- diff/net/ipv4/netfilter/ip_nat_core.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/ipv4/netfilter/ip_nat_core.c	2004-04-21 10:45:36.067220448 +0100
@@ -1016,6 +1016,10 @@ int __init ip_nat_init(void)
 	/* FIXME: Man, this is a hack.  <SIGH> */
 	IP_NF_ASSERT(ip_conntrack_destroyed == NULL);
 	ip_conntrack_destroyed = &ip_nat_cleanup_conntrack;
+	
+	/* Initialize fake conntrack so that NAT will skip it */
+	ip_conntrack_untracked.nat.info.initialized |= 
+		(1 << IP_NAT_MANIP_SRC) | (1 << IP_NAT_MANIP_DST);
 
 	return 0;
 }
--- diff/net/ipv4/netfilter/ip_nat_tftp.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/ipv4/netfilter/ip_nat_tftp.c	2004-04-21 10:45:36.067220448 +0100
@@ -47,8 +47,8 @@ MODULE_PARM_DESC(ports, "port numbers of
 #endif
 
 #if 0
-#define DEBUGP(format, args...) printk(__FILE__ ":" __FUNCTION__ ": " \
-				       format, ## args)
+#define DEBUGP(format, args...) printk("%s:%s:" format, \
+                                       __FILE__, __FUNCTION__ , ## args)
 #else
 #define DEBUGP(format, args...)
 #endif
--- diff/net/ipv4/netfilter/ipt_LOG.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/ipv4/netfilter/ipt_LOG.c	2004-04-21 10:45:36.068220296 +0100
@@ -19,6 +19,7 @@
 #include <net/tcp.h>
 #include <net/route.h>
 
+#include <linux/netfilter.h>
 #include <linux/netfilter_ipv4/ip_tables.h>
 #include <linux/netfilter_ipv4/ipt_LOG.h>
 
@@ -26,6 +27,10 @@ MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Netfilter Core Team <coreteam@netfilter.org>");
 MODULE_DESCRIPTION("iptables syslog logging module");
 
+static unsigned int nflog = 1;
+MODULE_PARM(nflog, "i");
+MODULE_PARM_DESC(nflog, "register as internal netfilter logging module");
+ 
 #if 0
 #define DEBUGP printk
 #else
@@ -324,28 +329,25 @@ static void dump_packet(const struct ipt
 	/* maxlen = 230+   91  + 230 + 252 = 803 */
 }
 
-static unsigned int
-ipt_log_target(struct sk_buff **pskb,
+static void
+ipt_log_packet(unsigned int hooknum,
+	       const struct sk_buff *skb,
 	       const struct net_device *in,
 	       const struct net_device *out,
-	       unsigned int hooknum,
-	       const void *targinfo,
-	       void *userinfo)
+	       const struct ipt_log_info *loginfo,
+	       const char *level_string,
+	       const char *prefix)
 {
-	const struct ipt_log_info *loginfo = targinfo;
-	char level_string[4] = "< >";
-
-	level_string[1] = '0' + (loginfo->level % 8);
 	spin_lock_bh(&log_lock);
 	printk(level_string);
 	printk("%sIN=%s OUT=%s ",
-	       loginfo->prefix,
+	       prefix == NULL ? loginfo->prefix : prefix,
 	       in ? in->name : "",
 	       out ? out->name : "");
 #ifdef CONFIG_BRIDGE_NETFILTER
-	if ((*pskb)->nf_bridge) {
-		struct net_device *physindev = (*pskb)->nf_bridge->physindev;
-		struct net_device *physoutdev = (*pskb)->nf_bridge->physoutdev;
+	if (skb->nf_bridge) {
+		struct net_device *physindev = skb->nf_bridge->physindev;
+		struct net_device *physoutdev = skb->nf_bridge->physoutdev;
 
 		if (physindev && in != physindev)
 			printk("PHYSIN=%s ", physindev->name);
@@ -357,25 +359,56 @@ ipt_log_target(struct sk_buff **pskb,
 	if (in && !out) {
 		/* MAC logging for input chain only. */
 		printk("MAC=");
-		if ((*pskb)->dev && (*pskb)->dev->hard_header_len
-		    && (*pskb)->mac.raw != (void*)(*pskb)->nh.iph) {
+		if (skb->dev && skb->dev->hard_header_len
+		    && skb->mac.raw != (void*)skb->nh.iph) {
 			int i;
-			unsigned char *p = (*pskb)->mac.raw;
-			for (i = 0; i < (*pskb)->dev->hard_header_len; i++,p++)
+			unsigned char *p = skb->mac.raw;
+			for (i = 0; i < skb->dev->hard_header_len; i++,p++)
 				printk("%02x%c", *p,
-				       i==(*pskb)->dev->hard_header_len - 1
+				       i==skb->dev->hard_header_len - 1
 				       ? ' ':':');
 		} else
 			printk(" ");
 	}
 
-	dump_packet(loginfo, *pskb, 0);
+	dump_packet(loginfo, skb, 0);
 	printk("\n");
 	spin_unlock_bh(&log_lock);
+}
+
+static unsigned int
+ipt_log_target(struct sk_buff **pskb,
+	       const struct net_device *in,
+	       const struct net_device *out,
+	       unsigned int hooknum,
+	       const void *targinfo,
+	       void *userinfo)
+{
+	const struct ipt_log_info *loginfo = targinfo;
+	char level_string[4] = "< >";
+
+	level_string[1] = '0' + (loginfo->level % 8);
+	ipt_log_packet(hooknum, *pskb, in, out, loginfo, level_string, NULL);
 
 	return IPT_CONTINUE;
 }
 
+static void
+ipt_logfn(unsigned int hooknum,
+	  const struct sk_buff *skb,
+	  const struct net_device *in,
+	  const struct net_device *out,
+	  const char *prefix)
+{
+	struct ipt_log_info loginfo = { 
+		.level = 0, 
+		.logflags = IPT_LOG_MASK, 
+		.prefix = "" 
+	};
+
+	ipt_log_packet(hooknum, skb, in, out, &loginfo, KERN_WARNING, prefix);
+}
+
 static int ipt_log_checkentry(const char *tablename,
 			      const struct ipt_entry *e,
 			      void *targinfo,
@@ -413,11 +446,18 @@ static struct ipt_target ipt_log_reg = {
 
 static int __init init(void)
 {
-	return ipt_register_target(&ipt_log_reg);
+	if (ipt_register_target(&ipt_log_reg))
+		return -EINVAL;
+	if (nflog)
+		nf_log_register(PF_INET, &ipt_logfn);
+	
+	return 0;
 }
 
 static void __exit fini(void)
 {
+	if (nflog)
+		nf_log_unregister(PF_INET, &ipt_logfn);
 	ipt_unregister_target(&ipt_log_reg);
 }
 
--- diff/net/ipv4/netfilter/ipt_ULOG.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/ipv4/netfilter/ipt_ULOG.c	2004-04-21 10:45:36.069220144 +0100
@@ -50,6 +50,7 @@
 #include <linux/netlink.h>
 #include <linux/netdevice.h>
 #include <linux/mm.h>
+#include <linux/netfilter.h>
 #include <linux/netfilter_ipv4/ip_tables.h>
 #include <linux/netfilter_ipv4/ipt_ULOG.h>
 #include <linux/netfilter_ipv4/lockhelp.h>
@@ -64,13 +65,13 @@ MODULE_DESCRIPTION("iptables userspace l
 #define ULOG_MAXNLGROUPS	32		/* numer of nlgroups */
 
 #if 0
-#define DEBUGP(format, args...)	printk(__FILE__ ":" __FUNCTION__ ":" \
-				       format, ## args)
+#define DEBUGP(format, args...) printk("%s:%s:" format, \
+                                       __FILE__, __FUNCTION__ , ## args)
 #else
 #define DEBUGP(format, args...)
 #endif
 
-#define PRINTR(format, args...) do { if (net_ratelimit()) printk(format, ## args); } while (0)
+#define PRINTR(format, args...) do { if (net_ratelimit()) printk(format , ## args); } while (0)
 
 static unsigned int nlbufsiz = 4096;
 MODULE_PARM(nlbufsiz, "i");
@@ -80,6 +81,10 @@ static unsigned int flushtimeout = 10 * 
 MODULE_PARM(flushtimeout, "i");
 MODULE_PARM_DESC(flushtimeout, "buffer flush timeout");
 
+static unsigned int nflog = 1;
+MODULE_PARM(nflog, "i");
+MODULE_PARM_DESC(nflog, "register as internal netfilter logging module");
+
 /* global data structures */
 
 typedef struct {
@@ -157,17 +162,17 @@ struct sk_buff *ulog_alloc_skb(unsigned 
 	return skb;
 }
 
-static unsigned int ipt_ulog_target(struct sk_buff **pskb,
-				    const struct net_device *in,
-				    const struct net_device *out,
-				    unsigned int hooknum,
-				    const void *targinfo, void *userinfo)
+static void ipt_ulog_packet(unsigned int hooknum,
+			    const struct sk_buff *skb,
+			    const struct net_device *in,
+			    const struct net_device *out,
+			    const struct ipt_ulog_info *loginfo,
+			    const char *prefix)
 {
 	ulog_buff_t *ub;
 	ulog_packet_msg_t *pm;
 	size_t size, copy_len;
 	struct nlmsghdr *nlh;
-	struct ipt_ulog_info *loginfo = (struct ipt_ulog_info *) targinfo;
 
 	/* ffs == find first bit set, necessary because userspace
 	 * is already shifting groupnumber, but we need unshifted.
@@ -176,8 +181,8 @@ static unsigned int ipt_ulog_target(stru
 
 	/* calculate the size of the skb needed */
 	if ((loginfo->copy_range == 0) ||
-	    (loginfo->copy_range > (*pskb)->len)) {
-		copy_len = (*pskb)->len;
+	    (loginfo->copy_range > skb->len)) {
+		copy_len = skb->len;
 	} else {
 		copy_len = loginfo->copy_range;
 	}
@@ -214,19 +219,21 @@ static unsigned int ipt_ulog_target(stru
 
 	/* copy hook, prefix, timestamp, payload, etc. */
 	pm->data_len = copy_len;
-	pm->timestamp_sec = (*pskb)->stamp.tv_sec;
-	pm->timestamp_usec = (*pskb)->stamp.tv_usec;
-	pm->mark = (*pskb)->nfmark;
+	pm->timestamp_sec = skb->stamp.tv_sec;
+	pm->timestamp_usec = skb->stamp.tv_usec;
+	pm->mark = skb->nfmark;
 	pm->hook = hooknum;
-	if (loginfo->prefix[0] != '\0')
+	if (prefix != NULL)
+		strncpy(pm->prefix, prefix, sizeof(pm->prefix));
+	else if (loginfo->prefix[0] != '\0')
 		strncpy(pm->prefix, loginfo->prefix, sizeof(pm->prefix));
 	else
 		*(pm->prefix) = '\0';
 
 	if (in && in->hard_header_len > 0
-	    && (*pskb)->mac.raw != (void *) (*pskb)->nh.iph
+	    && skb->mac.raw != (void *) skb->nh.iph
 	    && in->hard_header_len <= ULOG_MAC_LEN) {
-		memcpy(pm->mac, (*pskb)->mac.raw, in->hard_header_len);
+		memcpy(pm->mac, skb->mac.raw, in->hard_header_len);
 		pm->mac_len = in->hard_header_len;
 	} else
 		pm->mac_len = 0;
@@ -241,8 +248,8 @@ static unsigned int ipt_ulog_target(stru
 	else
 		pm->outdev_name[0] = '\0';
 
-	/* copy_len <= (*pskb)->len, so can't fail. */
-	if (skb_copy_bits(*pskb, 0, pm->payload, copy_len) < 0)
+	/* copy_len <= skb->len, so can't fail. */
+	if (skb_copy_bits(skb, 0, pm->payload, copy_len) < 0)
 		BUG();
 	
 	/* check if we are building multi-part messages */
@@ -266,8 +273,7 @@ static unsigned int ipt_ulog_target(stru
 
 	UNLOCK_BH(&ulog_lock);
 
-	return IPT_CONTINUE;
-
+	return;
 
 nlmsg_failure:
 	PRINTR("ipt_ULOG: error during NLMSG_PUT\n");
@@ -276,8 +282,35 @@ alloc_failure:
 	PRINTR("ipt_ULOG: Error building netlink message\n");
 
 	UNLOCK_BH(&ulog_lock);
+}
+
+static unsigned int ipt_ulog_target(struct sk_buff **pskb,
+				    const struct net_device *in,
+				    const struct net_device *out,
+				    unsigned int hooknum,
+				    const void *targinfo, void *userinfo)
+{
+	struct ipt_ulog_info *loginfo = (struct ipt_ulog_info *) targinfo;
 
-	return IPT_CONTINUE;
+	ipt_ulog_packet(hooknum, *pskb, in, out, loginfo, NULL);
+ 
+ 	return IPT_CONTINUE;
+}
+ 
+static void ipt_logfn(unsigned int hooknum,
+		      const struct sk_buff *skb,
+		      const struct net_device *in,
+		      const struct net_device *out,
+		      const char *prefix)
+{
+	struct ipt_ulog_info loginfo = { 
+		.nl_group = ULOG_DEFAULT_NLGROUP,
+		.copy_range = 0,
+		.qthreshold = ULOG_DEFAULT_QTHRESHOLD,
+		.prefix = ""
+	};
+
+	ipt_ulog_packet(hooknum, skb, in, out, &loginfo, prefix);
 }
 
 static int ipt_ulog_checkentry(const char *tablename,
@@ -341,7 +374,9 @@ static int __init init(void)
 		sock_release(nflognl->sk_socket);
 		return -EINVAL;
 	}
-
+	if (nflog)
+		nf_log_register(PF_INET, &ipt_logfn);
+	
 	return 0;
 }
 
@@ -352,6 +387,8 @@ static void __exit fini(void)
 
 	DEBUGP("ipt_ULOG: cleanup_module\n");
 
+	if (nflog)
+		nf_log_unregister(PF_INET, &ipt_logfn);
 	ipt_unregister_target(&ipt_ulog_reg);
 	sock_release(nflognl->sk_socket);
 
--- diff/net/ipv4/netfilter/ipt_conntrack.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/ipv4/netfilter/ipt_conntrack.c	2004-04-21 10:45:36.069220144 +0100
@@ -35,11 +35,13 @@ match(const struct sk_buff *skb,
 
 #define FWINV(bool,invflg) ((bool) ^ !!(sinfo->invflags & invflg))
 
-	if (ct)
-		statebit = IPT_CONNTRACK_STATE_BIT(ctinfo);
-	else
-		statebit = IPT_CONNTRACK_STATE_INVALID;
-
+	if (skb->nfct == &ip_conntrack_untracked.infos[IP_CT_NEW])
+		statebit = IPT_CONNTRACK_STATE_UNTRACKED;
+	else if (ct)
+ 		statebit = IPT_CONNTRACK_STATE_BIT(ctinfo);
+ 	else
+ 		statebit = IPT_CONNTRACK_STATE_INVALID;
+ 
 	if(sinfo->flags & IPT_CONNTRACK_STATE) {
 		if (ct) {
 			if(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.ip !=
--- diff/net/ipv4/netfilter/ipt_owner.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/ipv4/netfilter/ipt_owner.c	2004-04-21 10:45:36.069220144 +0100
@@ -95,7 +95,7 @@ match_sid(const struct sk_buff *skb, pid
 	read_lock(&tasklist_lock);
 	do_each_thread(g, p) {
 		struct files_struct *files;
-		if (p->session != sid)
+		if (p->signal->session != sid)
 			continue;
 
 		task_lock(p);
--- diff/net/ipv4/netfilter/ipt_state.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/ipv4/netfilter/ipt_state.c	2004-04-21 10:45:36.070219992 +0100
@@ -30,7 +30,9 @@ match(const struct sk_buff *skb,
 	enum ip_conntrack_info ctinfo;
 	unsigned int statebit;
 
-	if (!ip_conntrack_get((struct sk_buff *)skb, &ctinfo))
+	if (skb->nfct == &ip_conntrack_untracked.infos[IP_CT_NEW])
+		statebit = IPT_STATE_UNTRACKED;
+	else if (!ip_conntrack_get((struct sk_buff *)skb, &ctinfo))
 		statebit = IPT_STATE_INVALID;
 	else
 		statebit = IPT_STATE_BIT(ctinfo);
--- diff/net/ipv4/udp.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/ipv4/udp.c	2004-04-21 10:45:36.071219840 +0100
@@ -975,6 +975,7 @@ static int udp_encap_rcv(struct sock * s
 			/* Must be an IKE packet.. pass it through */
 			return 1;
 
+	decaps:
 		/* At this point we are sure that this is an ESPinUDP packet,
 		 * so we need to remove 'len' bytes from the packet (the UDP
 		 * header and optional ESP marker bytes) and then modify the
@@ -1002,6 +1003,20 @@ static int udp_encap_rcv(struct sock * s
 		/* and let the caller know to send this into the ESP processor... */
 		return -1;
 
+	case UDP_ENCAP_ESPINUDP_NON_IKE:
+		/* Check if this is a keepalive packet.  If so, eat it. */
+		if (len == 1 && udpdata[0] == 0xff) {
+			return 0;
+		} else if (len > 2 * sizeof(u32) + sizeof(struct ip_esp_hdr) &&
+			   udpdata32[0] == 0 && udpdata32[1] == 0) {
+			
+			/* ESP Packet with Non-IKE marker */
+			len = sizeof(struct udphdr) + 2 * sizeof(u32);
+			goto decaps;
+		} else
+			/* Must be an IKE packet.. pass it through */
+			return 1;
+
 	default:
 		if (net_ratelimit())
 			printk(KERN_INFO "udp_encap_rcv(): Unhandled UDP encap type: %u\n",
--- diff/net/ipv6/addrconf.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/ipv6/addrconf.c	2004-04-21 10:45:36.073219536 +0100
@@ -2553,7 +2553,89 @@ rtattr_failure:
 	return -1;
 }
 
-static int inet6_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
+static int inet6_fill_ifmcaddr(struct sk_buff *skb, struct ifmcaddr6 *ifmca,
+				u32 pid, u32 seq, int event)
+{
+	struct ifaddrmsg *ifm;
+	struct nlmsghdr  *nlh;
+	struct ifa_cacheinfo ci;
+	unsigned char	 *b = skb->tail;
+
+	nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ifm));
+	if (pid) nlh->nlmsg_flags |= NLM_F_MULTI;
+	ifm = NLMSG_DATA(nlh);
+	ifm->ifa_family = AF_INET6;	
+	ifm->ifa_prefixlen = 128;
+	ifm->ifa_flags = IFA_F_PERMANENT;
+	ifm->ifa_scope = RT_SCOPE_UNIVERSE;
+	if (ipv6_addr_scope(&ifmca->mca_addr)&IFA_SITE)
+		ifm->ifa_scope = RT_SCOPE_SITE;
+	ifm->ifa_index = ifmca->idev->dev->ifindex;
+	RTA_PUT(skb, IFA_MULTICAST, 16, &ifmca->mca_addr);
+	ci.cstamp = (__u32)(TIME_DELTA(ifmca->mca_cstamp, INITIAL_JIFFIES) / HZ
+		    * 100 + TIME_DELTA(ifmca->mca_cstamp, INITIAL_JIFFIES) % HZ
+		    * 100 / HZ);
+	ci.tstamp = (__u32)(TIME_DELTA(ifmca->mca_tstamp, INITIAL_JIFFIES) / HZ
+		    * 100 + TIME_DELTA(ifmca->mca_tstamp, INITIAL_JIFFIES) % HZ
+		    * 100 / HZ);
+	ci.ifa_prefered = INFINITY_LIFE_TIME;
+	ci.ifa_valid = INFINITY_LIFE_TIME;
+	RTA_PUT(skb, IFA_CACHEINFO, sizeof(ci), &ci);
+	nlh->nlmsg_len = skb->tail - b;
+	return skb->len;
+
+nlmsg_failure:
+rtattr_failure:
+	skb_trim(skb, b - skb->data);
+	return -1;
+}
+
+static int inet6_fill_ifacaddr(struct sk_buff *skb, struct ifacaddr6 *ifaca,
+				u32 pid, u32 seq, int event)
+{
+	struct ifaddrmsg *ifm;
+	struct nlmsghdr  *nlh;
+	struct ifa_cacheinfo ci;
+	unsigned char	 *b = skb->tail;
+
+	nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ifm));
+	if (pid) nlh->nlmsg_flags |= NLM_F_MULTI;
+	ifm = NLMSG_DATA(nlh);
+	ifm->ifa_family = AF_INET6;	
+	ifm->ifa_prefixlen = 128;
+	ifm->ifa_flags = IFA_F_PERMANENT;
+	ifm->ifa_scope = RT_SCOPE_UNIVERSE;
+	if (ipv6_addr_scope(&ifaca->aca_addr)&IFA_SITE)
+		ifm->ifa_scope = RT_SCOPE_SITE;
+	ifm->ifa_index = ifaca->aca_idev->dev->ifindex;
+	RTA_PUT(skb, IFA_ANYCAST, 16, &ifaca->aca_addr);
+	ci.cstamp = (__u32)(TIME_DELTA(ifaca->aca_cstamp, INITIAL_JIFFIES) / HZ
+		    * 100 + TIME_DELTA(ifaca->aca_cstamp, INITIAL_JIFFIES) % HZ
+		    * 100 / HZ);
+	ci.tstamp = (__u32)(TIME_DELTA(ifaca->aca_tstamp, INITIAL_JIFFIES) / HZ
+		    * 100 + TIME_DELTA(ifaca->aca_tstamp, INITIAL_JIFFIES) % HZ
+		    * 100 / HZ);
+	ci.ifa_prefered = INFINITY_LIFE_TIME;
+	ci.ifa_valid = INFINITY_LIFE_TIME;
+	RTA_PUT(skb, IFA_CACHEINFO, sizeof(ci), &ci);
+	nlh->nlmsg_len = skb->tail - b;
+	return skb->len;
+
+nlmsg_failure:
+rtattr_failure:
+	skb_trim(skb, b - skb->data);
+	return -1;
+}
+
+enum addr_type_t
+{
+	UNICAST_ADDR,
+	MULTICAST_ADDR,
+	ANYCAST_ADDR,
+};
+
+static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
+			   enum addr_type_t type)
 {
 	int idx, ip_idx;
 	int s_idx, s_ip_idx;
@@ -2561,7 +2643,9 @@ static int inet6_dump_ifaddr(struct sk_b
 	struct net_device *dev;
 	struct inet6_dev *idev = NULL;
 	struct inet6_ifaddr *ifa;
-	
+	struct ifmcaddr6 *ifmca;
+	struct ifacaddr6 *ifaca;
+
 	s_idx = cb->args[0];
 	s_ip_idx = ip_idx = cb->args[1];
 	read_lock(&dev_base_lock);
@@ -2575,28 +2659,58 @@ static int inet6_dump_ifaddr(struct sk_b
 		if ((idev = in6_dev_get(dev)) == NULL)
 			continue;
 		read_lock_bh(&idev->lock);
-		/* unicast address */
-		for (ifa = idev->addr_list; ifa;
-		     ifa = ifa->if_next, ip_idx++) {
-			if (ip_idx < s_ip_idx)
-				continue;
-			if ((err = inet6_fill_ifaddr(skb, ifa, 
-			    NETLINK_CB(cb->skb).pid, 
-			    cb->nlh->nlmsg_seq, RTM_NEWADDR)) <= 0)
-				goto done;
-		}
-		/* temp addr */
+		switch (type) {
+		case UNICAST_ADDR:
+			/* unicast address */
+			for (ifa = idev->addr_list; ifa;
+			     ifa = ifa->if_next, ip_idx++) {
+				if (ip_idx < s_ip_idx)
+					continue;
+				if ((err = inet6_fill_ifaddr(skb, ifa, 
+				    NETLINK_CB(cb->skb).pid, 
+				    cb->nlh->nlmsg_seq, RTM_NEWADDR)) <= 0)
+					goto done;
+			}
+			/* temp addr */
 #ifdef CONFIG_IPV6_PRIVACY
-		for (ifa = idev->tempaddr_list; ifa; 
-		     ifa = ifa->tmp_next, ip_idx++) {
-			if (ip_idx < s_ip_idx)
-				continue;
-			if ((err = inet6_fill_ifaddr(skb, ifa, 
-			    NETLINK_CB(cb->skb).pid, 
-			    cb->nlh->nlmsg_seq, RTM_NEWADDR)) <= 0) 
-				goto done;
-		}
+			for (ifa = idev->tempaddr_list; ifa; 
+			     ifa = ifa->tmp_next, ip_idx++) {
+				if (ip_idx < s_ip_idx)
+					continue;
+				if ((err = inet6_fill_ifaddr(skb, ifa, 
+				    NETLINK_CB(cb->skb).pid, 
+				    cb->nlh->nlmsg_seq, RTM_NEWADDR)) <= 0) 
+					goto done;
+			}
 #endif
+			break;
+		case MULTICAST_ADDR:
+			/* multicast address */
+			for (ifmca = idev->mc_list; ifmca; 
+			     ifmca = ifmca->next, ip_idx++) {
+				if (ip_idx < s_ip_idx)
+					continue;
+				if ((err = inet6_fill_ifmcaddr(skb, ifmca, 
+				    NETLINK_CB(cb->skb).pid, 
+				    cb->nlh->nlmsg_seq, RTM_GETMULTICAST)) <= 0)
+					goto done;
+			}
+			break;
+		case ANYCAST_ADDR:
+			/* anycast address */
+			for (ifaca = idev->ac_list; ifaca;
+			     ifaca = ifaca->aca_next, ip_idx++) {
+				if (ip_idx < s_ip_idx)
+					continue;
+				if ((err = inet6_fill_ifacaddr(skb, ifaca, 
+				    NETLINK_CB(cb->skb).pid, 
+				    cb->nlh->nlmsg_seq, RTM_GETANYCAST)) <= 0) 
+					goto done;
+			}
+			break;
+		default:
+			break;
+		}
 		read_unlock_bh(&idev->lock);
 		in6_dev_put(idev);
 	}
@@ -2611,6 +2725,25 @@ done:
 	return skb->len;
 }
 
+static int inet6_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
+{
+	enum addr_type_t type = UNICAST_ADDR;
+	return inet6_dump_addr(skb, cb, type);
+}
+
+static int inet6_dump_ifmcaddr(struct sk_buff *skb, struct netlink_callback *cb)
+{
+	enum addr_type_t type = MULTICAST_ADDR;
+	return inet6_dump_addr(skb, cb, type);
+}
+
+
+static int inet6_dump_ifacaddr(struct sk_buff *skb, struct netlink_callback *cb)
+{
+	enum addr_type_t type = ANYCAST_ADDR;
+	return inet6_dump_addr(skb, cb, type);
+}
+
 static void inet6_ifa_notify(int event, struct inet6_ifaddr *ifa)
 {
 	struct sk_buff *skb;
@@ -2835,6 +2968,8 @@ static struct rtnetlink_link inet6_rtnet
 	[RTM_NEWADDR - RTM_BASE] = { .doit	= inet6_rtm_newaddr, },
 	[RTM_DELADDR - RTM_BASE] = { .doit	= inet6_rtm_deladdr, },
 	[RTM_GETADDR - RTM_BASE] = { .dumpit	= inet6_dump_ifaddr, },
+	[RTM_GETMULTICAST - RTM_BASE] = { .dumpit = inet6_dump_ifmcaddr, },
+	[RTM_GETANYCAST - RTM_BASE] = { .dumpit	= inet6_dump_ifacaddr, },
 	[RTM_NEWROUTE - RTM_BASE] = { .doit	= inet6_rtm_newroute, },
 	[RTM_DELROUTE - RTM_BASE] = { .doit	= inet6_rtm_delroute, },
 	[RTM_GETROUTE - RTM_BASE] = { .doit	= inet6_rtm_getroute,
--- diff/net/ipv6/af_inet6.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/ipv6/af_inet6.c	2004-04-21 10:45:36.073219536 +0100
@@ -474,13 +474,7 @@ int inet6_ioctl(struct socket *sock, uns
 	switch(cmd) 
 	{
 	case SIOCGSTAMP:
-		if (!sk->sk_stamp.tv_sec)
-			return -ENOENT;
-		err = copy_to_user((void *)arg, &sk->sk_stamp,
-				   sizeof(struct timeval));
-		if (err)
-			return -EFAULT;
-		return 0;
+		return sock_get_timestamp(sk, (struct timeval *)arg);
 
 	case SIOCADDRT:
 	case SIOCDELRT:
--- diff/net/ipv6/ah6.c	2004-02-09 10:36:12.000000000 +0000
+++ source/net/ipv6/ah6.c	2004-04-21 10:45:36.074219384 +0100
@@ -92,8 +92,8 @@ static int ipv6_clear_mutable_options(st
 			*nh_offset = offset;
 			offset += ipv6_optlen(exthdr);
 			if (!zero_out_mutable_opts(exthdr)) {
-				if (net_ratelimit())
-					printk(KERN_WARNING "overrun hopopts\n"); 
+				LIMIT_NETDEBUG(
+				printk(KERN_WARNING "overrun hopopts\n")); 
 				return 0;
 			}
 			nexthdr = exthdr->nexthdr;
@@ -112,8 +112,8 @@ static int ipv6_clear_mutable_options(st
 			*nh_offset = offset;
 			offset += ipv6_optlen(exthdr);
 			if (!zero_out_mutable_opts(exthdr))  {
-				if (net_ratelimit())
-					printk(KERN_WARNING "overrun destopt\n"); 
+				LIMIT_NETDEBUG(
+					printk(KERN_WARNING "overrun destopt\n")); 
 				return 0;
 			}
 			nexthdr = exthdr->nexthdr;
@@ -130,8 +130,8 @@ static int ipv6_clear_mutable_options(st
 				exthdr = (struct ipv6_opt_hdr*)(skb->nh.raw + offset);
 				nextnexthdr = exthdr->nexthdr;
 				if (!zero_out_mutable_opts(exthdr)) {
-					if (net_ratelimit())
-						printk(KERN_WARNING "overrun destopt\n");
+					LIMIT_NETDEBUG(
+						printk(KERN_WARNING "overrun destopt\n"));
 					return 0;
 				}
 			}
@@ -162,7 +162,7 @@ int ah6_output(struct sk_buff *skb)
 	}
 
 	spin_lock_bh(&x->lock);
-	err = xfrm_check_output(x, skb, AF_INET);
+	err = xfrm_check_output(x, skb, AF_INET6);
 	if (err)
 		goto error;
 
@@ -322,8 +322,8 @@ int ah6_input(struct xfrm_state *x, stru
 		skb_push(skb, skb->data - skb->nh.raw);
 		ahp->icv(ahp, skb, ah->auth_data);
 		if (memcmp(ah->auth_data, auth_data, ahp->icv_trunc_len)) {
-			if (net_ratelimit())
-				printk(KERN_WARNING "ipsec ah authentication error\n");
+			LIMIT_NETDEBUG(
+				printk(KERN_WARNING "ipsec ah authentication error\n"));
 			x->stats.integrity_failed++;
 			goto free_out;
 		}
@@ -368,9 +368,9 @@ void ah6_err(struct sk_buff *skb, struct
 	if (!x)
 		return;
 
-	printk(KERN_DEBUG "pmtu discovery on SA AH/%08x/"
+	NETDEBUG(printk(KERN_DEBUG "pmtu discovery on SA AH/%08x/"
 			"%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n",
-	       ntohl(ah->spi), NIP6(iph->daddr));
+	       ntohl(ah->spi), NIP6(iph->daddr)));
 
 	xfrm_state_put(x);
 }
--- diff/net/ipv6/datagram.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/ipv6/datagram.c	2004-04-21 10:45:36.074219384 +0100
@@ -427,8 +427,8 @@ int datagram_send_ctl(struct msghdr *msg
 			break;
 
 		default:
-			if (net_ratelimit())
-				printk(KERN_DEBUG "invalid cmsg type: %d\n", cmsg->cmsg_type);
+			LIMIT_NETDEBUG(
+				printk(KERN_DEBUG "invalid cmsg type: %d\n", cmsg->cmsg_type));
 			err = -EINVAL;
 			break;
 		};
--- diff/net/ipv6/esp6.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/ipv6/esp6.c	2004-04-21 10:45:36.074219384 +0100
@@ -278,9 +278,8 @@ int esp6_input(struct xfrm_state *x, str
 
 		padlen = nexthdr[0];
 		if (padlen+2 >= elen) {
-			if (net_ratelimit()) {
-				printk(KERN_WARNING "ipsec esp packet is garbage padlen=%d, elen=%d\n", padlen+2, elen);
-			}
+			LIMIT_NETDEBUG(
+				printk(KERN_WARNING "ipsec esp packet is garbage padlen=%d, elen=%d\n", padlen+2, elen));
 			ret = -EINVAL;
 			goto out;
 		}
--- diff/net/ipv6/exthdrs.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/ipv6/exthdrs.c	2004-04-21 10:45:36.075219232 +0100
@@ -159,6 +159,7 @@ static int ipv6_destopt_rcv(struct sk_bu
 
 	if (!pskb_may_pull(skb, (skb->h.raw-skb->data)+8) ||
 	    !pskb_may_pull(skb, (skb->h.raw-skb->data)+((skb->h.raw[1]+1)<<3))) {
+		IP6_INC_STATS_BH(Ip6InHdrErrors);
 		kfree_skb(skb);
 		return -1;
 	}
@@ -171,6 +172,7 @@ static int ipv6_destopt_rcv(struct sk_bu
 		return 1;
 	}
 
+	IP6_INC_STATS_BH(Ip6InHdrErrors);
 	return -1;
 }
 
@@ -234,6 +236,7 @@ static int ipv6_rthdr_rcv(struct sk_buff
 
 	if (ipv6_addr_is_multicast(&skb->nh.ipv6h->daddr) ||
 	    skb->pkt_type != PACKET_HOST) {
+		IP6_INC_STATS_BH(Ip6InAddrErrors);
 		kfree_skb(skb);
 		return -1;
 	}
@@ -249,11 +252,13 @@ looped_back:
 	}
 
 	if (hdr->type != IPV6_SRCRT_TYPE_0) {
+		IP6_INC_STATS_BH(Ip6InHdrErrors);
 		icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, (&hdr->type) - skb->nh.raw);
 		return -1;
 	}
 	
 	if (hdr->hdrlen & 0x01) {
+		IP6_INC_STATS_BH(Ip6InHdrErrors);
 		icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, (&hdr->hdrlen) - skb->nh.raw);
 		return -1;
 	}
@@ -266,6 +271,7 @@ looped_back:
 	n = hdr->hdrlen >> 1;
 
 	if (hdr->segments_left > n) {
+		IP6_INC_STATS_BH(Ip6InHdrErrors);
 		icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, (&hdr->segments_left) - skb->nh.raw);
 		return -1;
 	}
@@ -276,8 +282,11 @@ looped_back:
 	if (skb_cloned(skb)) {
 		struct sk_buff *skb2 = skb_copy(skb, GFP_ATOMIC);
 		kfree_skb(skb);
-		if (skb2 == NULL)
+		/* the copy is a forwarded packet */
+		if (skb2 == NULL) {
+			IP6_INC_STATS_BH(Ip6OutDiscards);	
 			return -1;
+		}
 		*skbp = skb = skb2;
 		opt = (struct inet6_skb_parm *)skb2->cb;
 		hdr = (struct ipv6_rt_hdr *) skb2->h.raw;
@@ -293,6 +302,7 @@ looped_back:
 	addr += i - 1;
 
 	if (ipv6_addr_is_multicast(addr)) {
+		IP6_INC_STATS_BH(Ip6InAddrErrors);
 		kfree_skb(skb);
 		return -1;
 	}
@@ -309,6 +319,7 @@ looped_back:
 	}
 	if (skb->dst->dev->flags&IFF_LOOPBACK) {
 		if (skb->nh.ipv6h->hop_limit <= 1) {
+			IP6_INC_STATS_BH(Ip6InHdrErrors);
 			icmpv6_send(skb, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT,
 				    0, skb->dev);
 			kfree_skb(skb);
@@ -410,8 +421,8 @@ static int ipv6_hop_ra(struct sk_buff *s
 		((struct inet6_skb_parm*)skb->cb)->ra = optoff;
 		return 1;
 	}
-	if (net_ratelimit())
-		printk(KERN_DEBUG "ipv6_hop_ra: wrong RA length %d\n", skb->nh.raw[optoff+1]);
+	LIMIT_NETDEBUG(
+		 printk(KERN_DEBUG "ipv6_hop_ra: wrong RA length %d\n", skb->nh.raw[optoff+1]));
 	kfree_skb(skb);
 	return 0;
 }
@@ -423,17 +434,20 @@ static int ipv6_hop_jumbo(struct sk_buff
 	u32 pkt_len;
 
 	if (skb->nh.raw[optoff+1] != 4 || (optoff&3) != 2) {
-		if (net_ratelimit())
-			printk(KERN_DEBUG "ipv6_hop_jumbo: wrong jumbo opt length/alignment %d\n", skb->nh.raw[optoff+1]);
+		LIMIT_NETDEBUG(
+			 printk(KERN_DEBUG "ipv6_hop_jumbo: wrong jumbo opt length/alignment %d\n", skb->nh.raw[optoff+1]));
+		IP6_INC_STATS_BH(Ip6InHdrErrors);
 		goto drop;
 	}
 
 	pkt_len = ntohl(*(u32*)(skb->nh.raw+optoff+2));
 	if (pkt_len <= IPV6_MAXPLEN) {
+		IP6_INC_STATS_BH(Ip6InHdrErrors);
 		icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff+2);
 		return 0;
 	}
 	if (skb->nh.ipv6h->payload_len) {
+		IP6_INC_STATS_BH(Ip6InHdrErrors);
 		icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff);
 		return 0;
 	}
--- diff/net/ipv6/icmp.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/ipv6/icmp.c	2004-04-21 10:45:36.076219080 +0100
@@ -329,8 +329,8 @@ void icmpv6_send(struct sk_buff *skb, in
 	 *	for now we don't know that.
 	 */
 	if ((addr_type == IPV6_ADDR_ANY) || (addr_type & IPV6_ADDR_MULTICAST)) {
-		if (net_ratelimit())
-			printk(KERN_DEBUG "icmpv6_send: addr_any/mcast source\n");
+		LIMIT_NETDEBUG(
+			printk(KERN_DEBUG "icmpv6_send: addr_any/mcast source\n"));
 		return;
 	}
 
@@ -338,8 +338,8 @@ void icmpv6_send(struct sk_buff *skb, in
 	 *	Never answer to a ICMP packet.
 	 */
 	if (is_ineligible(skb)) {
-		if (net_ratelimit())
-			printk(KERN_DEBUG "icmpv6_send: no reply to icmp error\n"); 
+		LIMIT_NETDEBUG(
+			printk(KERN_DEBUG "icmpv6_send: no reply to icmp error\n")); 
 		return;
 	}
 
@@ -385,8 +385,8 @@ void icmpv6_send(struct sk_buff *skb, in
 	len = skb->len - msg.offset;
 	len = min_t(unsigned int, len, IPV6_MIN_MTU - sizeof(struct ipv6hdr) -sizeof(struct icmp6hdr));
 	if (len < 0) {
-		if (net_ratelimit())
-			printk(KERN_DEBUG "icmp: len problem\n");
+		LIMIT_NETDEBUG(
+			printk(KERN_DEBUG "icmp: len problem\n"));
 		goto out_dst_release;
 	}
 
@@ -570,17 +570,17 @@ static int icmpv6_rcv(struct sk_buff **p
 		skb->ip_summed = CHECKSUM_UNNECESSARY;
 		if (csum_ipv6_magic(saddr, daddr, skb->len, IPPROTO_ICMPV6,
 				    skb->csum)) {
-			if (net_ratelimit())
-				printk(KERN_DEBUG "ICMPv6 hw checksum failed\n");
+			LIMIT_NETDEBUG(
+				printk(KERN_DEBUG "ICMPv6 hw checksum failed\n"));
 			skb->ip_summed = CHECKSUM_NONE;
 		}
 	}
 	if (skb->ip_summed == CHECKSUM_NONE) {
 		if (csum_ipv6_magic(saddr, daddr, skb->len, IPPROTO_ICMPV6,
 				    skb_checksum(skb, 0, skb->len, 0))) {
-			if (net_ratelimit())
+			LIMIT_NETDEBUG(
 				printk(KERN_DEBUG "ICMPv6 checksum failed [%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x > %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x]\n",
-				       NIP6(*saddr), NIP6(*daddr));
+				       NIP6(*saddr), NIP6(*daddr)));
 			goto discard_it;
 		}
 	}
@@ -646,11 +646,12 @@ static int icmpv6_rcv(struct sk_buff **p
 		break;
 
 	case ICMPV6_MGM_REDUCTION:
+	case ICMPV6_MLD2_REPORT:
 		break;
 
 	default:
-		if (net_ratelimit())
-			printk(KERN_DEBUG "icmpv6: msg of unknown type\n");
+		LIMIT_NETDEBUG(
+			printk(KERN_DEBUG "icmpv6: msg of unknown type\n"));
 
 		/* informational */
 		if (type & ICMPV6_INFOMSG_MASK)
--- diff/net/ipv6/ip6_input.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/ipv6/ip6_input.c	2004-04-21 10:45:36.076219080 +0100
@@ -79,8 +79,10 @@ int ipv6_rcv(struct sk_buff *skb, struct
 	if (skb->len < sizeof(struct ipv6hdr))
 		goto err;
 
-	if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
+	if (!pskb_may_pull(skb, sizeof(struct ipv6hdr))) {
+		IP6_INC_STATS_BH(Ip6InHdrErrors);
 		goto drop;
+	}
 
 	hdr = skb->nh.ipv6h;
 
@@ -94,8 +96,10 @@ int ipv6_rcv(struct sk_buff *skb, struct
 		if (pkt_len + sizeof(struct ipv6hdr) > skb->len)
 			goto truncated;
 		if (pkt_len + sizeof(struct ipv6hdr) < skb->len) {
-			if (__pskb_trim(skb, pkt_len + sizeof(struct ipv6hdr)))
+			if (__pskb_trim(skb, pkt_len + sizeof(struct ipv6hdr))){
+				IP6_INC_STATS_BH(Ip6InHdrErrors);
 				goto drop;
+			}
 			hdr = skb->nh.ipv6h;
 			if (skb->ip_summed == CHECKSUM_HW)
 				skb->ip_summed = CHECKSUM_NONE;
@@ -206,6 +210,7 @@ resubmit:
 	return 0;
 
 discard:
+	IP6_INC_STATS_BH(Ip6InDiscards);
 	rcu_read_unlock();
 	kfree_skb(skb);
 	return 0;
--- diff/net/ipv6/ip6_output.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/ipv6/ip6_output.c	2004-04-21 10:45:36.077218928 +0100
@@ -87,6 +87,7 @@ static inline int ip6_output_finish(stru
 	} else if (dst->neighbour)
 		return dst->neighbour->output(skb);
 
+	IP6_INC_STATS_BH(Ip6OutNoRoutes);
 	kfree_skb(skb);
 	return -EINVAL;
 
@@ -131,6 +132,7 @@ int ip6_output2(struct sk_buff *skb)
 					ip6_dev_loopback_xmit);
 
 			if (skb->nh.ipv6h->hop_limit == 0) {
+				IP6_INC_STATS(Ip6OutDiscards);
 				kfree_skb(skb);
 				return 0;
 			}
@@ -167,8 +169,9 @@ int ip6_route_me_harder(struct sk_buff *
 	dst = ip6_route_output(skb->sk, &fl);
 
 	if (dst->error) {
-		if (net_ratelimit())
-			printk(KERN_DEBUG "ip6_route_me_harder: No more route.\n");
+		IP6_INC_STATS(Ip6OutNoRoutes);
+		LIMIT_NETDEBUG(
+			printk(KERN_DEBUG "ip6_route_me_harder: No more route.\n"));
 		dst_release(dst);
 		return -EINVAL;
 	}
@@ -224,8 +227,10 @@ int ip6_xmit(struct sock *sk, struct sk_
 			struct sk_buff *skb2 = skb_realloc_headroom(skb, head_room);
 			kfree_skb(skb);
 			skb = skb2;
-			if (skb == NULL)
+			if (skb == NULL) {	
+				IP6_INC_STATS(Ip6OutDiscards);
 				return -ENOBUFS;
+			}
 			if (sk)
 				skb_set_owner_w(skb, sk);
 		}
@@ -265,6 +270,7 @@ int ip6_xmit(struct sock *sk, struct sk_
 		printk(KERN_DEBUG "IPv6: sending pkt_too_big to self\n");
 	skb->dev = dst->dev;
 	icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, skb->dev);
+	IP6_INC_STATS(Ip6FragFails);
 	kfree_skb(skb);
 	return -EMSGSIZE;
 }
@@ -345,8 +351,10 @@ int ip6_forward(struct sk_buff *skb)
 	if (ipv6_devconf.forwarding == 0)
 		goto error;
 
-	if (!xfrm6_policy_check(NULL, XFRM_POLICY_FWD, skb))
+	if (!xfrm6_policy_check(NULL, XFRM_POLICY_FWD, skb)) {
+		IP6_INC_STATS(Ip6InDiscards);
 		goto drop;
+	}
 
 	skb->ip_summed = CHECKSUM_NONE;
 
@@ -382,8 +390,10 @@ int ip6_forward(struct sk_buff *skb)
 		return -ETIMEDOUT;
 	}
 
-	if (!xfrm6_route_forward(skb))
+	if (!xfrm6_route_forward(skb)) {
+		IP6_INC_STATS(Ip6InDiscards);
 		goto drop;
+	}
 
 	/* IPv6 specs say nothing about it, but it is clear that we cannot
 	   send redirects to source routed frames.
@@ -420,12 +430,15 @@ int ip6_forward(struct sk_buff *skb)
 		skb->dev = dst->dev;
 		icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, dst_pmtu(dst), skb->dev);
 		IP6_INC_STATS_BH(Ip6InTooBigErrors);
+		IP6_INC_STATS_BH(Ip6FragFails);
 		kfree_skb(skb);
 		return -EMSGSIZE;
 	}
 
-	if (skb_cow(skb, dst->dev->hard_header_len))
+	if (skb_cow(skb, dst->dev->hard_header_len)) {
+		IP6_INC_STATS(Ip6OutDiscards);
 		goto drop;
+	}
 
 	hdr = skb->nh.ipv6h;
 
@@ -648,6 +661,7 @@ slow_path:
 
 		if ((frag = alloc_skb(len+hlen+sizeof(struct frag_hdr)+LL_RESERVED_SPACE(rt->u.dst.dev), GFP_ATOMIC)) == NULL) {
 			NETDEBUG(printk(KERN_INFO "IPv6: frag: no memory for new fragment!\n"));
+			IP6_INC_STATS(Ip6FragFails);
 			err = -ENOMEM;
 			goto fail;
 		}
@@ -1062,6 +1076,7 @@ int ip6_push_pending_frames(struct sock 
 	ipv6_addr_copy(&hdr->daddr, final_dst);
 
 	skb->dst = dst_clone(&rt->u.dst);
+	IP6_INC_STATS(Ip6OutRequests);	
 	err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, skb->dst->dev, dst_output);
 	if (err) {
 		if (err > 0)
@@ -1092,8 +1107,10 @@ void ip6_flush_pending_frames(struct soc
 	struct ipv6_pinfo *np = inet6_sk(sk);
 	struct sk_buff *skb;
 
-	while ((skb = __skb_dequeue_tail(&sk->sk_write_queue)) != NULL)
+	while ((skb = __skb_dequeue_tail(&sk->sk_write_queue)) != NULL) {
+		IP6_INC_STATS(Ip6OutDiscards);
 		kfree_skb(skb);
+	}
 
 	inet->cork.flags &= ~IPCORK_OPT;
 
--- diff/net/ipv6/mcast.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/ipv6/mcast.c	2004-04-21 10:45:36.078218776 +0100
@@ -1317,6 +1317,7 @@ static void mld_sendpack(struct sk_buff 
 	struct inet6_dev *idev = in6_dev_get(skb->dev);
 	int err;
 
+	IP6_INC_STATS(Ip6OutRequests);
 	payload_len = skb->tail - (unsigned char *)skb->nh.ipv6h -
 		sizeof(struct ipv6hdr);
 	mldlen = skb->tail - skb->h.raw;
@@ -1326,8 +1327,12 @@ static void mld_sendpack(struct sk_buff 
 		IPPROTO_ICMPV6, csum_partial(skb->h.raw, mldlen, 0));
 	err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, skb->dev,
 		dev_queue_xmit);
-	if (!err)
+	if (!err) {
 		ICMP6_INC_STATS(idev,Icmp6OutMsgs);
+		IP6_INC_STATS(Ip6OutMcastPkts);
+	} else
+		IP6_INC_STATS(Ip6OutDiscards);
+
 	if (likely(idev != NULL))
 		in6_dev_put(idev);
 }
@@ -1608,6 +1613,7 @@ static void igmp6_send(struct in6_addr *
 		     IPV6_TLV_ROUTERALERT, 2, 0, 0,
 		     IPV6_TLV_PADN, 0 };
 
+	IP6_INC_STATS(Ip6OutRequests);
 	snd_addr = addr;
 	if (type == ICMPV6_MGM_REDUCTION) {
 		snd_addr = &all_routers;
@@ -1620,8 +1626,10 @@ static void igmp6_send(struct in6_addr *
 
 	skb = sock_alloc_send_skb(sk, LL_RESERVED_SPACE(dev) + full_len, 1, &err);
 
-	if (skb == NULL)
+	if (skb == NULL) {
+		IP6_INC_STATS(Ip6OutDiscards);
 		return;
+	}
 
 	skb_reserve(skb, LL_RESERVED_SPACE(dev));
 	if (dev->hard_header) {
@@ -1664,13 +1672,16 @@ static void igmp6_send(struct in6_addr *
 		else
 			ICMP6_INC_STATS(idev, Icmp6OutGroupMembResponses);
 		ICMP6_INC_STATS(idev, Icmp6OutMsgs);
-	}
+		IP6_INC_STATS(Ip6OutMcastPkts);
+	} else
+		IP6_INC_STATS(Ip6OutDiscards);
 
 	if (likely(idev != NULL))
 		in6_dev_put(idev);
 	return;
 
 out:
+	IP6_INC_STATS(Ip6OutDiscards);
 	kfree_skb(skb);
 }
 
--- diff/net/ipv6/ndisc.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/ipv6/ndisc.c	2004-04-21 10:45:36.079218624 +0100
@@ -452,6 +452,7 @@ static void ndisc_send_na(struct net_dev
 
 	skb->dst = dst;
 	idev = in6_dev_get(dst->dev);
+	IP6_INC_STATS(Ip6OutRequests);
 	err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, dst->dev, dst_output);
 	if (!err) {
 		ICMP6_INC_STATS(idev, Icmp6OutNeighborAdvertisements);
@@ -535,6 +536,7 @@ void ndisc_send_ns(struct net_device *de
 	/* send it! */
 	skb->dst = dst;
 	idev = in6_dev_get(dst->dev);
+	IP6_INC_STATS(Ip6OutRequests);
 	err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, dst->dev, dst_output);
 	if (!err) {
 		ICMP6_INC_STATS(idev, Icmp6OutNeighborSolicits);
@@ -607,6 +609,7 @@ void ndisc_send_rs(struct net_device *de
 	/* send it! */
 	skb->dst = dst;
 	idev = in6_dev_get(dst->dev);
+	IP6_INC_STATS(Ip6OutRequests);	
 	err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, dst->dev, dst_output);
 	if (!err) {
 		ICMP6_INC_STATS(idev, Icmp6OutRouterSolicits);
@@ -761,7 +764,7 @@ static void ndisc_recv_ns(struct sk_buff
 		if (ipv6_chk_acast_addr(dev, &msg->target) ||
 		    (idev->cnf.forwarding && 
 		     pneigh_lookup(&nd_tbl, &msg->target, dev, 0))) {
-			if (skb->stamp.tv_sec != 0 &&
+			if (skb->stamp.tv_sec != LOCALLY_ENQUEUED &&
 			    skb->pkt_type != PACKET_HOST &&
 			    inc != 0 &&
 			    idev->nd_parms->proxy_delay != 0) {
@@ -1332,6 +1335,7 @@ void ndisc_send_redirect(struct sk_buff 
 
 	buff->dst = dst;
 	idev = in6_dev_get(dst->dev);
+	IP6_INC_STATS(Ip6OutRequests);
 	err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, buff, NULL, dst->dev, dst_output);
 	if (!err) {
 		ICMP6_INC_STATS(idev, Icmp6OutRedirects);
@@ -1403,6 +1407,10 @@ static int ndisc_netdev_event(struct not
 		neigh_changeaddr(&nd_tbl, dev);
 		fib6_run_gc(0);
 		break;
+	case NETDEV_DOWN:
+		neigh_ifdown(&nd_tbl, dev);
+		fib6_run_gc(0);
+		break;
 	default:
 		break;
 	}
--- diff/net/ipv6/netfilter/Kconfig	2004-02-18 08:54:13.000000000 +0000
+++ source/net/ipv6/netfilter/Kconfig	2004-04-21 10:45:36.079218624 +0100
@@ -3,7 +3,7 @@
 #
 
 menu "IPv6: Netfilter Configuration"
-	depends on INET && IPV6!=n && NETFILTER
+	depends on INET && IPV6 && NETFILTER
 
 #tristate 'Connection tracking (required for masq/NAT)' CONFIG_IP6_NF_CONNTRACK
 #if [ "$CONFIG_IP6_NF_CONNTRACK" != "n" ]; then
@@ -218,5 +218,17 @@ config IP6_NF_TARGET_MARK
 	  To compile it as a module, choose M here.  If unsure, say N.
 
 #dep_tristate '  LOG target support' CONFIG_IP6_NF_TARGET_LOG $CONFIG_IP6_NF_IPTABLES
+config IP6_NF_RAW
+	tristate  'raw table support (required for TRACE)'
+	depends on IP6_NF_IPTABLES
+	help
+	  This option adds a `raw' table to ip6tables. This table is the very
+	  first in the netfilter framework and hooks in at the PREROUTING
+	  and OUTPUT chains.
+	
+	  If you want to compile it as a module, say M here and read
+	  <file:Documentation/modules.txt>.  If unsure, say `N'.
+	  help
+
 endmenu
 
--- diff/net/ipv6/netfilter/Makefile	2003-05-21 11:50:10.000000000 +0100
+++ source/net/ipv6/netfilter/Makefile	2004-04-21 10:45:36.079218624 +0100
@@ -21,4 +21,5 @@ obj-$(CONFIG_IP6_NF_MANGLE) += ip6table_
 obj-$(CONFIG_IP6_NF_TARGET_MARK) += ip6t_MARK.o
 obj-$(CONFIG_IP6_NF_QUEUE) += ip6_queue.o
 obj-$(CONFIG_IP6_NF_TARGET_LOG) += ip6t_LOG.o
+obj-$(CONFIG_IP6_NF_RAW) += ip6table_raw.o
 obj-$(CONFIG_IP6_NF_MATCH_HL) += ip6t_hl.o
--- diff/net/ipv6/netfilter/ip6t_LOG.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/ipv6/netfilter/ip6t_LOG.c	2004-04-21 10:45:36.080218472 +0100
@@ -18,12 +18,17 @@
 #include <net/udp.h>
 #include <net/tcp.h>
 #include <net/ipv6.h>
+#include <linux/netfilter.h>
 #include <linux/netfilter_ipv6/ip6_tables.h>
 
 MODULE_AUTHOR("Jan Rekorajski <baggins@pld.org.pl>");
 MODULE_DESCRIPTION("IP6 tables LOG target module");
 MODULE_LICENSE("GPL");
 
+static unsigned int nflog = 1;
+MODULE_PARM(nflog, "i");
+MODULE_PARM_DESC(nflog, "register as internal netfilter logging module");
+ 
 struct in_device;
 #include <net/route.h>
 #include <linux/netfilter_ipv6/ip6t_LOG.h>
@@ -265,40 +270,38 @@ static void dump_packet(const struct ip6
 	}
 }
 
-static unsigned int
-ip6t_log_target(struct sk_buff **pskb,
-		unsigned int hooknum,
+static void
+ip6t_log_packet(unsigned int hooknum,
+		const struct sk_buff *skb,
 		const struct net_device *in,
 		const struct net_device *out,
-		const void *targinfo,
-		void *userinfo)
+		const struct ip6t_log_info *loginfo,
+		const char *level_string,
+		const char *prefix)
 {
-	struct ipv6hdr *ipv6h = (*pskb)->nh.ipv6h;
-	const struct ip6t_log_info *loginfo = targinfo;
-	char level_string[4] = "< >";
+	struct ipv6hdr *ipv6h = skb->nh.ipv6h;
 
-	level_string[1] = '0' + (loginfo->level % 8);
 	spin_lock_bh(&log_lock);
 	printk(level_string);
 	printk("%sIN=%s OUT=%s ",
-		loginfo->prefix,
+		prefix == NULL ? loginfo->prefix : prefix,
 		in ? in->name : "",
 		out ? out->name : "");
 	if (in && !out) {
 		/* MAC logging for input chain only. */
 		printk("MAC=");
-		if ((*pskb)->dev && (*pskb)->dev->hard_header_len && (*pskb)->mac.raw != (void*)ipv6h) {
-			if ((*pskb)->dev->type != ARPHRD_SIT){
+		if (skb->dev && skb->dev->hard_header_len && skb->mac.raw != (void*)ipv6h) {
+			if (skb->dev->type != ARPHRD_SIT){
 			  int i;
-			  unsigned char *p = (*pskb)->mac.raw;
-			  for (i = 0; i < (*pskb)->dev->hard_header_len; i++,p++)
+			  unsigned char *p = skb->mac.raw;
+			  for (i = 0; i < skb->dev->hard_header_len; i++,p++)
 				printk("%02x%c", *p,
-			       		i==(*pskb)->dev->hard_header_len - 1
+			       		i==skb->dev->hard_header_len - 1
 			       		? ' ':':');
 			} else {
 			  int i;
-			  unsigned char *p = (*pskb)->mac.raw;
-			  if ( p - (ETH_ALEN*2+2) > (*pskb)->head ){
+			  unsigned char *p = skb->mac.raw;
+			  if ( p - (ETH_ALEN*2+2) > skb->head ){
 			    p -= (ETH_ALEN+2);
 			    for (i = 0; i < (ETH_ALEN); i++,p++)
 				printk("%02x%s", *p,
@@ -309,10 +312,10 @@ ip6t_log_target(struct sk_buff **pskb,
 					i == ETH_ALEN-1 ? ' ' : ':');
 			  }
 			  
-			  if (((*pskb)->dev->addr_len == 4) &&
-			      (*pskb)->dev->hard_header_len > 20){
+			  if ((skb->dev->addr_len == 4) &&
+			      skb->dev->hard_header_len > 20){
 			    printk("TUNNEL=");
-			    p = (*pskb)->mac.raw + 12;
+			    p = skb->mac.raw + 12;
 			    for (i = 0; i < 4; i++,p++)
 				printk("%3d%s", *p,
 					i == 3 ? "->" : ".");
@@ -328,10 +331,41 @@ ip6t_log_target(struct sk_buff **pskb,
 	dump_packet(loginfo, ipv6h, 1);
 	printk("\n");
 	spin_unlock_bh(&log_lock);
+}
+
+static unsigned int
+ip6t_log_target(struct sk_buff **pskb,
+		unsigned int hooknum,
+		const struct net_device *in,
+		const struct net_device *out,
+		const void *targinfo,
+		void *userinfo)
+{
+	const struct ip6t_log_info *loginfo = targinfo;
+	char level_string[4] = "< >";
+
+	level_string[1] = '0' + (loginfo->level % 8);
+	ip6t_log_packet(hooknum, *pskb, in, out, loginfo, level_string, NULL);
 
 	return IP6T_CONTINUE;
 }
 
+static void
+ip6t_logfn(unsigned int hooknum,
+	   const struct sk_buff *skb,
+	   const struct net_device *in,
+	   const struct net_device *out,
+	   const char *prefix)
+{
+	struct ip6t_log_info loginfo = {
+		.level = 0,
+		.logflags = IP6T_LOG_MASK,
+		.prefix = ""
+	};
+
+	ip6t_log_packet(hooknum, skb, in, out, &loginfo, KERN_WARNING, prefix);
+}
+
 static int ip6t_log_checkentry(const char *tablename,
 			       const struct ip6t_entry *e,
 			       void *targinfo,
@@ -360,20 +394,27 @@ static int ip6t_log_checkentry(const cha
 	return 1;
 }
 
-static struct ip6t_target ip6t_log_reg
-= { { NULL, NULL }, "LOG", ip6t_log_target, ip6t_log_checkentry, NULL, 
-    THIS_MODULE };
+static struct ip6t_target ip6t_log_reg = {
+	.name 		= "LOG",
+	.target 	= ip6t_log_target, 
+	.checkentry	= ip6t_log_checkentry, 
+	.me 		= THIS_MODULE,
+};
 
 static int __init init(void)
 {
 	if (ip6t_register_target(&ip6t_log_reg))
 		return -EINVAL;
+	if (nflog)
+		nf_log_register(PF_INET6, &ip6t_logfn);
 
 	return 0;
 }
 
 static void __exit fini(void)
 {
+	if (nflog)
+		nf_log_unregister(PF_INET6, &ip6t_logfn);
 	ip6t_unregister_target(&ip6t_log_reg);
 }
 
--- diff/net/ipv6/netfilter/ip6t_owner.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/ipv6/netfilter/ip6t_owner.c	2004-04-21 10:45:36.080218472 +0100
@@ -61,7 +61,7 @@ match_sid(const struct sk_buff *skb, pid
 	read_lock(&tasklist_lock);
 	do_each_thread(g, p) {
 		struct files_struct *files;
-		if (p->session != sid)
+		if (p->signal->session != sid)
 			continue;
 
 		task_lock(p);
--- diff/net/ipv6/raw.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/ipv6/raw.c	2004-04-21 10:45:36.081218320 +0100
@@ -328,7 +328,8 @@ int rawv6_rcv(struct sock *sk, struct sk
 			if (csum_ipv6_magic(&skb->nh.ipv6h->saddr,
 					    &skb->nh.ipv6h->daddr,
 					    skb->len, inet->num, skb->csum)) {
-				NETDEBUG(if (net_ratelimit()) printk(KERN_DEBUG "raw v6 hw csum failure.\n"));
+				LIMIT_NETDEBUG(
+			        printk(KERN_DEBUG "raw v6 hw csum failure.\n"));
 				skb->ip_summed = CHECKSUM_NONE;
 			}
 		}
@@ -526,6 +527,7 @@ static int rawv6_send_hdrinc(struct sock
 	if (err)
 		goto error_fault;
 
+	IP6_INC_STATS(Ip6OutRequests);		
 	err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, rt->u.dst.dev,
 		      dst_output);
 	if (err > 0)
--- diff/net/ipv6/reassembly.c	2004-02-09 10:36:12.000000000 +0000
+++ source/net/ipv6/reassembly.c	2004-04-21 10:45:36.082218168 +0100
@@ -426,6 +426,7 @@ static void ip6_frag_queue(struct frag_q
 			((u8 *) (fhdr + 1) - (u8 *) (skb->nh.ipv6h + 1)));
 
 	if ((unsigned int)end > IPV6_MAXPLEN) {
+		IP6_INC_STATS_BH(Ip6InHdrErrors);
  		icmpv6_param_prob(skb,ICMPV6_HDR_FIELD, (u8*)&fhdr->frag_off - skb->nh.raw);
  		return;
 	}
@@ -452,6 +453,7 @@ static void ip6_frag_queue(struct frag_q
 			/* RFC2460 says always send parameter problem in
 			 * this case. -DaveM
 			 */
+			IP6_INC_STATS_BH(Ip6InHdrErrors);
 			icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, 
 					  offsetof(struct ipv6hdr, payload_len));
 			return;
@@ -570,6 +572,7 @@ static void ip6_frag_queue(struct frag_q
 	return;
 
 err:
+	IP6_INC_STATS(Ip6ReasmFails);
 	kfree_skb(skb);
 }
 
@@ -694,10 +697,12 @@ static int ipv6_frag_rcv(struct sk_buff 
 
 	/* Jumbo payload inhibits frag. header */
 	if (hdr->payload_len==0) {
+		IP6_INC_STATS(Ip6InHdrErrors);
 		icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, skb->h.raw-skb->nh.raw);
 		return -1;
 	}
 	if (!pskb_may_pull(skb, (skb->h.raw-skb->data)+sizeof(struct frag_hdr))) {
+		IP6_INC_STATS(Ip6InHdrErrors);
 		icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, skb->h.raw-skb->nh.raw);
 		return -1;
 	}
--- diff/net/ipv6/tcp_ipv6.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/ipv6/tcp_ipv6.c	2004-04-21 10:45:36.083218016 +0100
@@ -1425,7 +1425,7 @@ static int tcp_v6_checksum_init(struct s
 		if (!tcp_v6_check(skb->h.th,skb->len,&skb->nh.ipv6h->saddr,
 				  &skb->nh.ipv6h->daddr,skb->csum))
 			return 0;
-		NETDEBUG(if (net_ratelimit()) printk(KERN_DEBUG "hw tcp v6 csum failed\n"));
+		LIMIT_NETDEBUG(printk(KERN_DEBUG "hw tcp v6 csum failed\n"));
 	}
 	if (skb->len <= 76) {
 		if (tcp_v6_check(skb->h.th,skb->len,&skb->nh.ipv6h->saddr,
--- diff/net/ipv6/udp.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/ipv6/udp.c	2004-04-21 10:45:36.084217864 +0100
@@ -634,8 +634,8 @@ static int udpv6_rcv(struct sk_buff **ps
 		/* RFC 2460 section 8.1 says that we SHOULD log
 		   this error. Well, it is reasonable.
 		 */
-		if (net_ratelimit())
-			printk(KERN_INFO "IPv6: udp checksum is 0\n");
+		LIMIT_NETDEBUG(
+			printk(KERN_INFO "IPv6: udp checksum is 0\n"));
 		goto discard;
 	}
 
@@ -650,7 +650,7 @@ static int udpv6_rcv(struct sk_buff **ps
 	if (skb->ip_summed==CHECKSUM_HW) {
 		skb->ip_summed = CHECKSUM_UNNECESSARY;
 		if (csum_ipv6_magic(saddr, daddr, ulen, IPPROTO_UDP, skb->csum)) {
-			NETDEBUG(if (net_ratelimit()) printk(KERN_DEBUG "udp v6 hw csum failure.\n"));
+			LIMIT_NETDEBUG(printk(KERN_DEBUG "udp v6 hw csum failure.\n"));
 			skb->ip_summed = CHECKSUM_NONE;
 		}
 	}
@@ -913,6 +913,7 @@ do_udp_sendmsg:
 	if (msg->msg_controllen) {
 		opt = &opt_space;
 		memset(opt, 0, sizeof(struct ipv6_txoptions));
+		opt->tot_len = sizeof(*opt);
 
 		err = datagram_send_ctl(msg, fl, opt, &hlimit);
 		if (err < 0) {
@@ -970,7 +971,7 @@ back_from_confirm:
 		/* ... which is an evident application bug. --ANK */
 		release_sock(sk);
 
-		NETDEBUG(if (net_ratelimit()) printk(KERN_DEBUG "udp cork app bug 2\n"));
+		LIMIT_NETDEBUG(printk(KERN_DEBUG "udp cork app bug 2\n"));
 		err = -EINVAL;
 		goto out;
 	}
--- diff/net/ipx/af_ipx.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/ipx/af_ipx.c	2004-04-21 10:45:36.085217712 +0100
@@ -1797,7 +1797,8 @@ static int ipx_recvmsg(struct kiocb *ioc
 				     copied);
 	if (rc)
 		goto out_free;
-	sk->sk_stamp = skb->stamp;
+	if (skb->stamp.tv_sec)
+		sk->sk_stamp = skb->stamp;
 
 	msg->msg_namelen = sizeof(*sipx);
 
@@ -1870,15 +1871,8 @@ static int ipx_ioctl(struct socket *sock
 		break;
 	case SIOCGSTAMP:
 		rc = -EINVAL;
-		if (sk) {
-			rc = -ENOENT;
-			if (!sk->sk_stamp.tv_sec)
-				break;
-			rc = -EFAULT;
-			if (!copy_to_user((void *)arg, &sk->sk_stamp,
-					  sizeof(struct timeval)))
-				rc = 0;
-		}
+		if (sk) 
+			rc = sock_get_timestamp(sk, (struct timeval *)arg);
 		break;
 	case SIOCGIFDSTADDR:
 	case SIOCSIFDSTADDR:
--- diff/net/irda/Kconfig	2003-10-09 09:47:34.000000000 +0100
+++ source/net/irda/Kconfig	2004-04-21 10:45:36.085217712 +0100
@@ -2,11 +2,9 @@
 # IrDA protocol configuration
 #
 
-menu "IrDA (infrared) support"
+menuconfig IRDA
 	depends on NET
-
-config IRDA
-	tristate "IrDA subsystem support"
+	tristate "IrDA (infrared) subsystem support"
 	---help---
 	  Say Y here if you want to build support for the IrDA (TM) protocols.
 	  The Infrared Data Associations (tm) specifies standards for wireless
@@ -95,5 +93,3 @@ config IRDA_DEBUG
 
 source "drivers/net/irda/Kconfig"
 
-endmenu
-
--- diff/net/irda/af_irda.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/irda/af_irda.c	2004-04-21 10:45:36.086217560 +0100
@@ -1796,14 +1796,8 @@ static int irda_ioctl(struct socket *soc
 	}
 
 	case SIOCGSTAMP:
-		if (sk != NULL) {
-			if (!sk->sk_stamp.tv_sec)
-				return -ENOENT;
-			if (copy_to_user((void *)arg, &sk->sk_stamp,
-					 sizeof(struct timeval)))
-				return -EFAULT;
-			return 0;
-		}
+		if (sk != NULL)
+			return sock_get_timestamp(sk, (struct timeval *)arg);
 		return -EINVAL;
 
 	case SIOCGIFADDR:
--- diff/net/irda/irlan/irlan_client.c	2003-08-26 10:00:54.000000000 +0100
+++ source/net/irda/irlan/irlan_client.c	2004-04-21 10:45:36.087217408 +0100
@@ -343,6 +343,52 @@ void irlan_client_reconnect_data_channel
 	irttp_data_request(self->client.tsap_ctrl, skb);	
 }
 
+
+/*
+ * Function print_ret_code (code)
+ *
+ *    Print return code of request to peer IrLAN layer.
+ *
+ */
+static void print_ret_code(__u8 code) 
+{
+	switch(code) {
+	case 0:
+		printk(KERN_INFO "Success\n");
+		break;
+	case 1:
+		WARNING("IrLAN: Insufficient resources\n");
+		break;
+	case 2:
+		WARNING("IrLAN: Invalid command format\n");
+		break;
+	case 3:
+		WARNING("IrLAN: Command not supported\n");
+		break;
+	case 4:
+		WARNING("IrLAN: Parameter not supported\n");
+		break;
+	case 5:
+		WARNING("IrLAN: Value not supported\n");
+		break;
+	case 6:
+		WARNING("IrLAN: Not open\n");
+		break;
+	case 7:
+		WARNING("IrLAN: Authentication required\n");
+		break;
+	case 8:
+		WARNING("IrLAN: Invalid password\n");
+		break;
+	case 9:
+		WARNING("IrLAN: Protocol error\n");
+		break;
+	case 255:
+		WARNING("IrLAN: Asynchronous status\n");
+		break;
+	}
+}
+
 /*
  * Function irlan_client_parse_response (self, skb)
  *
--- diff/net/irda/irlan/irlan_common.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/irda/irlan/irlan_common.c	2004-04-21 10:45:36.088217256 +0100
@@ -32,6 +32,7 @@
 #include <linux/errno.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
+#include <linux/random.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/rtnetlink.h>
@@ -75,14 +76,14 @@ static int eth;   /* Use "eth" or "irlan
 static int access = ACCESS_PEER; /* PEER, DIRECT or HOSTED */
 
 #ifdef CONFIG_PROC_FS
-static char *irlan_access[] = {
+static const char *irlan_access[] = {
 	"UNKNOWN",
 	"DIRECT",
 	"PEER",
 	"HOSTED"
 };
 
-static char *irlan_media[] = {
+static const char *irlan_media[] = {
 	"UNKNOWN",
 	"802.3",
 	"802.5"
@@ -115,12 +116,12 @@ void irlan_close_tsaps(struct irlan_cb *
  *    Initialize IrLAN layer
  *
  */
-int __init irlan_init(void)
+static int __init irlan_init(void)
 {
 	struct irlan_cb *new;
 	__u16 hints;
 
-	IRDA_DEBUG(0, "%s()\n", __FUNCTION__ );
+	IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
 #ifdef CONFIG_PROC_FS
 	{ struct proc_dir_entry *proc;
@@ -156,7 +157,7 @@ int __init irlan_init(void)
 	return 0;
 }
 
-void __exit irlan_cleanup(void) 
+static void __exit irlan_cleanup(void) 
 {
 	struct irlan_cb *self, *next;
 
@@ -191,9 +192,7 @@ struct irlan_cb *irlan_open(__u32 saddr,
 	IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
 	/* Create network device with irlan */
-	dev = alloc_netdev(sizeof(*self), 
-			   eth ? "eth%d" : "irlan%d", 
-			   irlan_eth_setup);
+	dev = alloc_irlandev(eth ? "eth%d" : "irlan%d");
 	if (!dev)
 		return NULL;
 
@@ -209,6 +208,19 @@ struct irlan_cb *irlan_open(__u32 saddr,
 
 	/* Provider access can only be PEER, DIRECT, or HOSTED */
 	self->provider.access_type = access;
+	if (access == ACCESS_DIRECT) {
+		/*  
+		 * Since we are emulating an IrLAN sever we will have to
+		 * give ourself an ethernet address!  
+		 */
+		dev->dev_addr[0] = 0x40;
+		dev->dev_addr[1] = 0x00;
+		dev->dev_addr[2] = 0x00;
+		dev->dev_addr[3] = 0x00;
+		get_random_bytes(dev->dev_addr+4, 1);
+		get_random_bytes(dev->dev_addr+5, 1);
+	}
+
 	self->media = MEDIA_802_3;
 	self->disconnect_reason = LM_USER_REQUEST;
 	init_timer(&self->watchdog_timer);
@@ -242,16 +254,14 @@ struct irlan_cb *irlan_open(__u32 saddr,
  */
 static void __irlan_close(struct irlan_cb *self)
 {
-	struct sk_buff *skb;
-
 	IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 	
 	ASSERT_RTNL();
 	ASSERT(self != NULL, return;);
 	ASSERT(self->magic == IRLAN_MAGIC, return;);
 
-	del_timer(&self->watchdog_timer);
-	del_timer(&self->client.kick_timer);
+	del_timer_sync(&self->watchdog_timer);
+	del_timer_sync(&self->client.kick_timer);
 
 	/* Close all open connections and remove TSAPs */
 	irlan_close_tsaps(self);
@@ -260,8 +270,7 @@ static void __irlan_close(struct irlan_c
 		iriap_close(self->client.iriap);
 
 	/* Remove frames queued on the control channel */
-	while ((skb = skb_dequeue(&self->client.txq)))
-		dev_kfree_skb(skb);
+	skb_queue_purge(&self->client.txq);
 
 	/* Unregister and free self via destructor */
 	unregister_netdevice(self->dev);
@@ -303,7 +312,7 @@ void irlan_connect_indication(void *inst
 	self->max_sdu_size = max_sdu_size;
 	self->max_header_size = max_header_size;
 
-	IRDA_DEBUG(0, "IrLAN, We are now connected!\n");
+	IRDA_DEBUG(0, "%s: We are now connected!\n", __FUNCTION__);
 
 	del_timer(&self->watchdog_timer);
 
@@ -345,7 +354,7 @@ void irlan_connect_confirm(void *instanc
 
 	/* TODO: we could set the MTU depending on the max_sdu_size */
 
-	IRDA_DEBUG(2, "IrLAN, We are now connected!\n");
+	IRDA_DEBUG(0, "%s: We are now connected!\n", __FUNCTION__);
 	del_timer(&self->watchdog_timer);
 
 	/* 
@@ -451,7 +460,7 @@ void irlan_open_data_tsap(struct irlan_c
 	notify.udata_indication      = irlan_eth_receive;
 	notify.connect_indication    = irlan_connect_indication;
 	notify.connect_confirm       = irlan_connect_confirm;
- 	/*notify.flow_indication       = irlan_eth_flow_indication;*/
+ 	notify.flow_indication       = irlan_eth_flow_indication;
 	notify.disconnect_indication = irlan_disconnect_indication;
 	notify.instance              = self;
 	strlcpy(notify.name, "IrLAN data", sizeof(notify.name));
@@ -1168,51 +1177,6 @@ static int irlan_seq_open(struct inode *
 }
 #endif
 
-/*
- * Function print_ret_code (code)
- *
- *    Print return code of request to peer IrLAN layer.
- *
- */
-void print_ret_code(__u8 code) 
-{
-	switch(code) {
-	case 0:
-		printk(KERN_INFO "Success\n");
-		break;
-	case 1:
-		WARNING("IrLAN: Insufficient resources\n");
-		break;
-	case 2:
-		WARNING("IrLAN: Invalid command format\n");
-		break;
-	case 3:
-		WARNING("IrLAN: Command not supported\n");
-		break;
-	case 4:
-		WARNING("IrLAN: Parameter not supported\n");
-		break;
-	case 5:
-		WARNING("IrLAN: Value not supported\n");
-		break;
-	case 6:
-		WARNING("IrLAN: Not open\n");
-		break;
-	case 7:
-		WARNING("IrLAN: Authentication required\n");
-		break;
-	case 8:
-		WARNING("IrLAN: Invalid password\n");
-		break;
-	case 9:
-		WARNING("IrLAN: Protocol error\n");
-		break;
-	case 255:
-		WARNING("IrLAN: Asynchronous status\n");
-		break;
-	}
-}
-
 MODULE_AUTHOR("Dag Brattli <dagb@cs.uit.no>");
 MODULE_DESCRIPTION("The Linux IrDA LAN protocol"); 
 MODULE_LICENSE("GPL");
@@ -1222,19 +1186,6 @@ MODULE_PARM_DESC(eth, "Name devices ethX
 MODULE_PARM(access, "i");
 MODULE_PARM_DESC(access, "Access type DIRECT=1, PEER=2, HOSTED=3");
 
-/*
- * Function init_module (void)
- *
- *    Initialize the IrLAN module, this function is called by the
- *    modprobe(1) program.
- */
 module_init(irlan_init);
-
-/*
- * Function cleanup_module (void)
- *
- *    Remove the IrLAN module, this function is called by the rmmod(1)
- *    program
- */
 module_exit(irlan_cleanup);
 
--- diff/net/irda/irlan/irlan_eth.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/irda/irlan/irlan_eth.c	2004-04-21 10:45:36.088217256 +0100
@@ -30,7 +30,6 @@
 #include <linux/etherdevice.h>
 #include <linux/inetdevice.h>
 #include <linux/if_arp.h>
-#include <linux/random.h>
 #include <linux/module.h>
 #include <net/arp.h>
 
@@ -41,20 +40,20 @@
 #include <net/irda/irlan_event.h>
 #include <net/irda/irlan_eth.h>
 
+static int  irlan_eth_open(struct net_device *dev);
+static int  irlan_eth_close(struct net_device *dev);
+static int  irlan_eth_xmit(struct sk_buff *skb, struct net_device *dev);
+static void irlan_eth_set_multicast_list( struct net_device *dev);
+static struct net_device_stats *irlan_eth_get_stats(struct net_device *dev);
+
 /*
- * Function irlan_eth_init (dev)
+ * Function irlan_eth_setup (dev)
  *
  *    The network device initialization function.
  *
  */
-void irlan_eth_setup(struct net_device *dev)
+static void irlan_eth_setup(struct net_device *dev)
 {
-	struct irlan_cb *self;
-
-	IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
-
-	self = (struct irlan_cb *) dev->priv;
-
 	dev->open               = irlan_eth_open;
 	dev->stop               = irlan_eth_close;
 	dev->hard_start_xmit    = irlan_eth_xmit; 
@@ -71,20 +70,30 @@ void irlan_eth_setup(struct net_device *
 	 * Queueing here as well can introduce some strange latency
 	 * problems, which we will avoid by setting the queue size to 0.
 	 */
-	dev->tx_queue_len = 0;
+	/*
+	 * The bugs in IrTTP and IrLAN that created this latency issue
+	 * have now been fixed, and we can propagate flow control properly
+	 * to the network layer. However, this requires a minimal queue of
+	 * packets for the device.
+	 * Without flow control, the Tx Queue is 14 (ttp) + 0 (dev) = 14
+	 * With flow control, the Tx Queue is 7 (ttp) + 4 (dev) = 11
+	 * See irlan_eth_flow_indication()...
+	 * Note : this number was randomly selected and would need to
+	 * be adjusted.
+	 * Jean II */
+	dev->tx_queue_len = 4;
+}
 
-	if (self->provider.access_type == ACCESS_DIRECT) {
-		/*  
-		 * Since we are emulating an IrLAN sever we will have to
-		 * give ourself an ethernet address!  
-		 */
-		dev->dev_addr[0] = 0x40;
-		dev->dev_addr[1] = 0x00;
-		dev->dev_addr[2] = 0x00;
-		dev->dev_addr[3] = 0x00;
-		get_random_bytes(dev->dev_addr+4, 1);
-		get_random_bytes(dev->dev_addr+5, 1);
-	}
+/*
+ * Function alloc_irlandev
+ *
+ *    Allocate network device and control block
+ *
+ */
+struct net_device *alloc_irlandev(const char *name)
+{
+	return alloc_netdev(sizeof(struct irlan_cb), name,
+			    irlan_eth_setup);
 }
 
 /*
@@ -93,18 +102,12 @@ void irlan_eth_setup(struct net_device *
  *    Network device has been opened by user
  *
  */
-int irlan_eth_open(struct net_device *dev)
+static int irlan_eth_open(struct net_device *dev)
 {
-	struct irlan_cb *self;
+	struct irlan_cb *self = netdev_priv(dev);
 	
 	IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
-	ASSERT(dev != NULL, return -1;);
-
-	self = (struct irlan_cb *) dev->priv;
-
-	ASSERT(self != NULL, return -1;);
-
 	/* Ready to play! */
  	netif_stop_queue(dev); /* Wait until data link is ready */
 
@@ -112,10 +115,10 @@ int irlan_eth_open(struct net_device *de
 	self->disconnect_reason = 0;
 	irlan_client_wakeup(self, self->saddr, self->daddr);
 
-	/* Make sure we have a hardware address before we return, so DHCP clients gets happy */
-	interruptible_sleep_on(&self->open_wait);
-	
-	return 0;
+	/* Make sure we have a hardware address before we return, 
+	   so DHCP clients gets happy */
+	return wait_event_interruptible(self->open_wait,
+					!self->tsap_data->connected);
 }
 
 /*
@@ -126,10 +129,9 @@ int irlan_eth_open(struct net_device *de
  *    close timer, so that the instance will be removed if we are unable
  *    to discover the remote device after the disconnect.
  */
-int irlan_eth_close(struct net_device *dev)
+static int irlan_eth_close(struct net_device *dev)
 {
-	struct irlan_cb *self = (struct irlan_cb *) dev->priv;
-	struct sk_buff *skb;
+	struct irlan_cb *self = netdev_priv(dev);
 	
 	IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 	
@@ -143,8 +145,7 @@ int irlan_eth_close(struct net_device *d
 	irlan_do_provider_event(self, IRLAN_LMP_DISCONNECT, NULL);	
 	
 	/* Remove frames queued on the control channel */
-	while ((skb = skb_dequeue(&self->client.txq)))
-			dev_kfree_skb(skb);
+	skb_queue_purge(&self->client.txq);
 
 	self->client.tx_busy = 0;
 	
@@ -157,16 +158,11 @@ int irlan_eth_close(struct net_device *d
  *    Transmits ethernet frames over IrDA link.
  *
  */
-int irlan_eth_xmit(struct sk_buff *skb, struct net_device *dev)
+static int irlan_eth_xmit(struct sk_buff *skb, struct net_device *dev)
 {
-	struct irlan_cb *self;
+	struct irlan_cb *self = netdev_priv(dev);
 	int ret;
 
-	self = (struct irlan_cb *) dev->priv;
-
-	ASSERT(self != NULL, return 0;);
-	ASSERT(self->magic == IRLAN_MAGIC, return 0;);
-
 	/* skb headroom large enough to contain all IrDA-headers? */
 	if ((skb_headroom(skb) < self->max_header_size) || (skb_shared(skb))) {
 		struct sk_buff *new_skb = 
@@ -220,9 +216,7 @@ int irlan_eth_xmit(struct sk_buff *skb, 
  */
 int irlan_eth_receive(void *instance, void *sap, struct sk_buff *skb)
 {
-	struct irlan_cb *self;
-
-	self = (struct irlan_cb *) instance;
+	struct irlan_cb *self = instance;
 
 	if (skb == NULL) {
 		++self->stats.rx_dropped; 
@@ -251,6 +245,14 @@ int irlan_eth_receive(void *instance, vo
  *
  *    Do flow control between IP/Ethernet and IrLAN/IrTTP. This is done by 
  *    controlling the queue stop/start.
+ *
+ * The IrDA link layer has the advantage to have flow control, and
+ * IrTTP now properly handles that. Flow controlling the higher layers
+ * prevent us to drop Tx packets in here (up to 15% for a TCP socket,
+ * more for UDP socket).
+ * Also, this allow us to reduce the overall transmit queue, which means
+ * less latency in case of mixed traffic.
+ * Jean II
  */
 void irlan_eth_flow_indication(void *instance, void *sap, LOCAL_FLOW flow)
 {
@@ -266,37 +268,25 @@ void irlan_eth_flow_indication(void *ins
 
 	ASSERT(dev != NULL, return;);
 	
+	IRDA_DEBUG(0, "%s() : flow %s ; running %d\n", __FUNCTION__,
+		   flow == FLOW_STOP ? "FLOW_STOP" : "FLOW_START",
+		   netif_running(dev));
+
 	switch (flow) {
 	case FLOW_STOP:
+		/* IrTTP is full, stop higher layers */
 		netif_stop_queue(dev);
 		break;
 	case FLOW_START:
 	default:
 		/* Tell upper layers that its time to transmit frames again */
 		/* Schedule network layer */
-		netif_start_queue(dev);
+		netif_wake_queue(dev);
 		break;
 	}
 }
 
 /*
- * Function irlan_eth_rebuild_header (buff, dev, dest, skb)
- *
- *    If we don't want to use ARP. Currently not used!!
- *
- */
-void irlan_eth_rebuild_header(void *buff, struct net_device *dev, 
-			      unsigned long dest, struct sk_buff *skb)
-{
-	struct ethhdr *eth = (struct ethhdr *) buff;
-
-	memcpy(eth->h_source, dev->dev_addr, dev->addr_len);
-	memcpy(eth->h_dest, dev->dev_addr, dev->addr_len);
-
-	/* return 0; */
-}
-
-/*
  * Function irlan_etc_send_gratuitous_arp (dev)
  *
  *    Send gratuitous ARP to announce that we have changed
@@ -336,17 +326,12 @@ void irlan_eth_send_gratuitous_arp(struc
  *
  */
 #define HW_MAX_ADDRS 4 /* Must query to get it! */
-void irlan_eth_set_multicast_list(struct net_device *dev) 
+static void irlan_eth_set_multicast_list(struct net_device *dev) 
 {
- 	struct irlan_cb *self;
-
- 	self = dev->priv; 
+ 	struct irlan_cb *self = netdev_priv(dev);
 
 	IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
- 	ASSERT(self != NULL, return;); 
- 	ASSERT(self->magic == IRLAN_MAGIC, return;);
-
 	/* Check if data channel has been connected yet */
 	if (self->client.state != IRLAN_DATA) {
 		IRDA_DEBUG(1, "%s(), delaying!\n", __FUNCTION__ );
@@ -388,12 +373,9 @@ void irlan_eth_set_multicast_list(struct
  *    Get the current statistics for this device
  *
  */
-struct net_device_stats *irlan_eth_get_stats(struct net_device *dev) 
+static struct net_device_stats *irlan_eth_get_stats(struct net_device *dev) 
 {
-	struct irlan_cb *self = (struct irlan_cb *) dev->priv;
-
-	ASSERT(self != NULL, return NULL;);
-	ASSERT(self->magic == IRLAN_MAGIC, return NULL;);
+	struct irlan_cb *self = netdev_priv(dev);
 
 	return &self->stats;
 }
--- diff/net/irda/irlan/irlan_filter.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/irda/irlan/irlan_filter.c	2004-04-21 10:45:36.089217104 +0100
@@ -29,12 +29,12 @@
 #include <net/irda/irlan_common.h>
 
 /*
- * Function handle_filter_request (self, skb)
+ * Function irlan_filter_request (self, skb)
  *
  *    Handle filter request from client peer device
  *
  */
-void handle_filter_request(struct irlan_cb *self, struct sk_buff *skb)
+void irlan_filter_request(struct irlan_cb *self, struct sk_buff *skb)
 {
 	ASSERT(self != NULL, return;);
 	ASSERT(self->magic == IRLAN_MAGIC, return;);
--- diff/net/irda/irlan/irlan_provider.c	2003-06-09 14:18:20.000000000 +0100
+++ source/net/irda/irlan/irlan_provider.c	2004-04-21 10:45:36.089217104 +0100
@@ -358,7 +358,7 @@ void irlan_provider_send_reply(struct ir
 					 12);
 		break;
 	case CMD_FILTER_OPERATION:
-		handle_filter_request(self, skb);
+		irlan_filter_request(self, skb);
 		break;
 	default:
 		IRDA_DEBUG(2, "%s(), Unknown command!\n", __FUNCTION__ );
--- diff/net/irda/irlap_event.c	2004-02-09 10:36:12.000000000 +0000
+++ source/net/irda/irlap_event.c	2004-04-21 10:45:36.090216952 +0100
@@ -2236,6 +2236,14 @@ static int irlap_state_sclose(struct irl
 		irlap_disconnect_indication(self, LAP_DISC_INDICATION);
 		break;
 	case RECV_DM_RSP:
+		/* IrLAP-1.1 p.82: in SCLOSE, S and I type RSP frames
+		 * shall take us down into default NDM state, like DM_RSP
+		 */
+	case RECV_RR_RSP:
+	case RECV_RNR_RSP:
+	case RECV_REJ_RSP:
+	case RECV_SREJ_RSP:
+	case RECV_I_RSP:
 		/* Always switch state before calling upper layers */
 		irlap_next_state(self, LAP_NDM);
 
@@ -2253,6 +2261,17 @@ static int irlap_state_sclose(struct irl
 		irlap_disconnect_indication(self, LAP_DISC_INDICATION);
 		break;
 	default:
+		/* IrLAP-1.1 p.82: in SCLOSE, basically any received frame
+		 * with pf=1 shall restart the wd-timer and resend the rd:rsp
+		 */
+		if (info != NULL  &&  info->pf) {
+			del_timer(&self->wd_timer);
+			irlap_wait_min_turn_around(self, &self->qos_tx);
+			irlap_send_rd_frame(self);
+			irlap_start_wd_timer(self, self->wd_timeout);
+			break;		/* stay in SCLOSE */
+		}
+
 		IRDA_DEBUG(1, "%s(), Unknown event %d, (%s)\n", __FUNCTION__,
 			   event, irlap_event[event]);
 
--- diff/net/key/af_key.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/key/af_key.c	2004-04-21 10:45:36.091216800 +0100
@@ -1780,6 +1780,7 @@ static void pfkey_xfrm_policy2msg(struct
 	}
 	pol->sadb_x_policy_dir = dir+1;
 	pol->sadb_x_policy_id = xp->index;
+	pol->sadb_x_policy_priority = xp->priority;
 
 	for (i=0; i<xp->xfrm_nr; i++) {
 		struct sadb_x_ipsecrequest *rq;
@@ -1872,6 +1873,7 @@ static int pfkey_spdadd(struct sock *sk,
 
 	xp->action = (pol->sadb_x_policy_type == IPSEC_POLICY_DISCARD ?
 		      XFRM_POLICY_BLOCK : XFRM_POLICY_ALLOW);
+	xp->priority = pol->sadb_x_policy_priority;
 
 	sa = ext_hdrs[SADB_EXT_ADDRESS_SRC-1], 
 	xp->family = pfkey_sadb_addr2xfrm_addr(sa, &xp->selector.saddr);
@@ -2636,7 +2638,7 @@ static int pfkey_send_new_mapping(struct
 	addr->sadb_address_len = 
 		(sizeof(struct sadb_address)+sockaddr_size)/
 			sizeof(uint64_t);
-	addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
+	addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST;
 	addr->sadb_address_proto = 0;
 	addr->sadb_address_reserved = 0;
 	if (x->props.family == AF_INET) {
--- diff/net/netlink/af_netlink.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/netlink/af_netlink.c	2004-04-21 10:45:36.092216648 +0100
@@ -415,38 +415,65 @@ static void netlink_overrun(struct sock 
 	}
 }
 
-int netlink_unicast(struct sock *ssk, struct sk_buff *skb, u32 pid, int nonblock)
+struct sock *netlink_getsockbypid(struct sock *ssk, u32 pid)
 {
-	struct sock *sk;
-	struct netlink_opt *nlk;
-	int len = skb->len;
 	int protocol = ssk->sk_protocol;
-	long timeo;
-        DECLARE_WAITQUEUE(wait, current);
-
-	timeo = sock_sndtimeo(ssk, nonblock);
+	struct sock *sock;
+	struct netlink_opt *nlk;
 
-retry:
-	sk = netlink_lookup(protocol, pid);
-	if (sk == NULL)
-		goto no_dst;
-	nlk = nlk_sk(sk);
+	sock = netlink_lookup(protocol, pid);
+	if (!sock)
+		return ERR_PTR(-ECONNREFUSED);
 
 	/* Don't bother queuing skb if kernel socket has no input function */
-        if (nlk->pid == 0 && !nlk->data_ready)
-        	goto no_dst;
+	nlk = nlk_sk(sock);
+	if (nlk->pid == 0 && !nlk->data_ready) {
+		sock_put(sock);
+		return ERR_PTR(-ECONNREFUSED);
+	}
+	return sock;
+}
+
+struct sock *netlink_getsockbyfilp(struct file *filp)
+{
+	struct inode *inode = filp->f_dentry->d_inode;
+	struct socket *socket;
+	struct sock *sock;
+
+	if (!inode->i_sock || !(socket = SOCKET_I(inode)))
+		return ERR_PTR(-ENOTSOCK);
+
+	sock = socket->sk;
+	if (sock->sk_family != AF_NETLINK)
+		return ERR_PTR(-EINVAL);
+
+	sock_hold(sock);
+	return sock;
+}
+
+/*
+ * Attach a skb to a netlink socket.
+ * The caller must hold a reference to the destination socket. On error, the
+ * reference is dropped. The skb is not send to the destination, just all
+ * all error checks are performed and memory in the queue is reserved.
+ * Return values:
+ * < 0: error. skb freed, reference to sock dropped.
+ * 0: continue
+ * 1: repeat lookup - reference dropped while waiting for socket memory.
+ */
+int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock, long timeo)
+{
+	struct netlink_opt *nlk;
+
+	nlk = nlk_sk(sk);
 
 #ifdef NL_EMULATE_DEV
-	if (nlk->handler) {
-		skb_orphan(skb);
-		len = nlk->handler(protocol, skb);
-		sock_put(sk);
-		return len;
-	}
+	if (nlk->handler)
+		return 0;
 #endif
-
 	if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf ||
 	    test_bit(0, &nlk->state)) {
+		DECLARE_WAITQUEUE(wait, current);
 		if (!timeo) {
 			if (!nlk->pid)
 				netlink_overrun(sk);
@@ -471,19 +498,60 @@ retry:
 			kfree_skb(skb);
 			return sock_intr_errno(timeo);
 		}
-		goto retry;
+		return 1;
 	}
-
 	skb_orphan(skb);
 	skb_set_owner_r(skb, sk);
+	return 0;
+}
+
+int netlink_sendskb(struct sock *sk, struct sk_buff *skb, int protocol)
+{
+	struct netlink_opt *nlk;
+	int len = skb->len;
+
+	nlk = nlk_sk(sk);
+#ifdef NL_EMULATE_DEV
+	if (nlk->handler) {
+		skb_orphan(skb);
+		len = nlk->handler(protocol, skb);
+		sock_put(sk);
+		return len;
+	}
+#endif
+
 	skb_queue_tail(&sk->sk_receive_queue, skb);
 	sk->sk_data_ready(sk, len);
 	sock_put(sk);
 	return len;
+}
 
-no_dst:
+void netlink_detachskb(struct sock *sk, struct sk_buff *skb)
+{
 	kfree_skb(skb);
-	return -ECONNREFUSED;
+	sock_put(sk);
+}
+
+int netlink_unicast(struct sock *ssk, struct sk_buff *skb, u32 pid, int nonblock)
+{
+	struct sock *sk;
+	int err;
+	long timeo;
+
+	timeo = sock_sndtimeo(ssk, nonblock);
+retry:
+	sk = netlink_getsockbypid(ssk, pid);
+	if (IS_ERR(sk)) {
+		kfree_skb(skb);
+		return PTR_ERR(skb);
+	}
+	err = netlink_attachskb(sk, skb, nonblock, timeo);
+	if (err == 1)
+		goto retry;
+	if (err)
+		return err;
+
+	return netlink_sendskb(sk, skb, ssk->sk_protocol);
 }
 
 static __inline__ int netlink_broadcast_deliver(struct sock *sk, struct sk_buff *skb)
--- diff/net/netrom/af_netrom.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/netrom/af_netrom.c	2004-04-21 10:45:36.093216496 +0100
@@ -1200,17 +1200,11 @@ static int nr_ioctl(struct socket *sock,
 	}
 
 	case SIOCGSTAMP:
-		if (sk != NULL) {
-			if (!sk->sk_stamp.tv_sec) {
-				release_sock(sk);
-				return -ENOENT;
-			}
-			ret = copy_to_user((void *)arg, &sk->sk_stamp, sizeof(struct timeval)) ? -EFAULT : 0;
-			release_sock(sk);
-			return ret;
-		}
+		ret = -EINVAL;
+		if (sk != NULL)
+			ret = sock_get_timestamp(sk, (struct timeval *)arg);
 		release_sock(sk);
-		return -EINVAL;
+		return ret;
 
 	case SIOCGIFADDR:
 	case SIOCSIFADDR:
--- diff/net/packet/af_packet.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/packet/af_packet.c	2004-04-21 10:45:36.094216344 +0100
@@ -625,6 +625,10 @@ static int tpacket_rcv(struct sk_buff *s
 	h->tp_snaplen = snaplen;
 	h->tp_mac = macoff;
 	h->tp_net = netoff;
+	if (skb->stamp.tv_sec == 0) { 
+		do_gettimeofday(&skb->stamp);
+		sock_enable_timestamp(sk);
+	}
 	h->tp_sec = skb->stamp.tv_sec;
 	h->tp_usec = skb->stamp.tv_usec;
 
@@ -1461,13 +1465,8 @@ static int packet_ioctl(struct socket *s
 			return put_user(amount, (int *)arg);
 		}
 		case SIOCGSTAMP:
-			if (!sk->sk_stamp.tv_sec)
-				return -ENOENT;
-			if (copy_to_user((void *)arg, &sk->sk_stamp,
-					 sizeof(struct timeval)))
-				return -EFAULT;
-			break;
-
+			return sock_get_timestamp(sk, (struct timeval *)arg);
+			
 #ifdef CONFIG_INET
 		case SIOCADDRT:
 		case SIOCDELRT:
--- diff/net/rose/af_rose.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/rose/af_rose.c	2004-04-21 10:45:36.094216344 +0100
@@ -1269,12 +1269,8 @@ static int rose_ioctl(struct socket *soc
 	}
 
 	case SIOCGSTAMP:
-		if (sk != NULL) {
-			if (!sk->sk_stamp.tv_sec)
-				return -ENOENT;
-			return copy_to_user((void *)arg, &sk->sk_stamp,
-					  sizeof(struct timeval)) ? -EFAULT : 0;
-		}
+		if (sk != NULL) 
+			return sock_get_timestamp(sk, (struct timeval *)arg);
 		return -EINVAL;
 
 	case SIOCGIFADDR:
--- diff/net/rxrpc/transport.c	2004-02-09 10:36:12.000000000 +0000
+++ source/net/rxrpc/transport.c	2004-04-21 10:45:36.095216192 +0100
@@ -341,6 +341,11 @@ static int rxrpc_incoming_msg(struct rxr
 	msg->trans = trans;
 	msg->state = RXRPC_MSG_RECEIVED;
 	msg->stamp = pkt->stamp;
+	if (msg->stamp.tv_sec == 0) {
+		do_gettimeofday(&msg->stamp); 
+		if (pkt->sk) 
+			sock_enable_timestamp(pkt->sk);
+	} 
 	msg->seq = ntohl(msg->hdr.seq);
 
 	/* attach the packet */
--- diff/net/sched/Kconfig	2004-04-05 12:57:08.000000000 +0100
+++ source/net/sched/Kconfig	2004-04-21 10:45:36.095216192 +0100
@@ -184,7 +184,7 @@ config NET_SCH_INGRESS
 	  If unsure, say Y.
 
 	  To compile this code as a module, choose M here: the
-	  module will be called cls_ingress.
+	  module will be called sch_ingress.
 
 config NET_QOS
 	bool "QoS support"
--- diff/net/sched/sch_dsmark.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/sched/sch_dsmark.c	2004-04-21 10:45:36.096216040 +0100
@@ -326,7 +326,8 @@ int dsmark_init(struct Qdisc *sch,struct
 	__u16 tmp;
 
 	DPRINTK("dsmark_init(sch %p,[qdisc %p],opt %p)\n",sch,p,opt);
-	if (rtattr_parse(tb,TCA_DSMARK_MAX,RTA_DATA(opt),RTA_PAYLOAD(opt)) < 0 ||
+	if (!opt ||
+	    rtattr_parse(tb,TCA_DSMARK_MAX,RTA_DATA(opt),RTA_PAYLOAD(opt)) < 0 ||
 	    !tb[TCA_DSMARK_INDICES-1] ||
 	    RTA_PAYLOAD(tb[TCA_DSMARK_INDICES-1]) < sizeof(__u16))
                 return -EINVAL;
--- diff/net/sctp/associola.c	2004-02-09 10:36:12.000000000 +0000
+++ source/net/sctp/associola.c	2004-04-21 10:45:36.097215888 +0100
@@ -1,5 +1,5 @@
 /* SCTP kernel reference Implementation
- * (C) Copyright IBM Corp. 2001, 2003
+ * (C) Copyright IBM Corp. 2001, 2004
  * Copyright (c) 1999-2000 Cisco, Inc.
  * Copyright (c) 1999-2001 Motorola, Inc.
  * Copyright (c) 2001 Intel Corp.
@@ -276,7 +276,7 @@ struct sctp_association *sctp_associatio
 
 	asoc->need_ecne = 0;
 
-	asoc->eyecatcher = SCTP_ASSOC_EYECATCHER;
+	asoc->assoc_id = (sctp_assoc_t)-1;
 
 	/* Assume that peer would support both address types unless we are
 	 * told otherwise.
@@ -360,8 +360,6 @@ void sctp_association_free(struct sctp_a
 		sctp_transport_free(transport);
 	}
 
-	asoc->eyecatcher = 0;
-
 	/* Free any cached ASCONF_ACK chunk. */
 	if (asoc->addip_last_asconf_ack)
 		sctp_chunk_free(asoc->addip_last_asconf_ack);
@@ -381,6 +379,12 @@ static void sctp_association_destroy(str
 	sctp_endpoint_put(asoc->ep);
 	sock_put(asoc->base.sk);
 
+	if ((int)asoc->assoc_id != -1) {
+		spin_lock_bh(&sctp_assocs_id_lock);
+		idr_remove(&sctp_assocs_id, (int)asoc->assoc_id);
+		spin_unlock_bh(&sctp_assocs_id_lock);
+	}
+
 	if (asoc->base.malloced) {
 		kfree(asoc);
 		SCTP_DBG_OBJCNT_DEC(assoc);
@@ -856,26 +860,6 @@ out:
 	return transport;
 }
 
-/*  Is this a live association structure. */
-int sctp_assoc_valid(struct sock *sk, struct sctp_association *asoc)
-{
-
-	/* First, verify that this is a kernel address. */
-	if (!sctp_is_valid_kaddr((unsigned long) asoc))
-		return 0;
-
-	/* Verify that this _is_ an sctp_association
-	 * data structure and if so, that the socket matches.
-	 */
-	if (SCTP_ASSOC_EYECATCHER != asoc->eyecatcher)
-		return 0;
-	if (asoc->base.sk != sk)
-		return 0;
-
-	/* The association is valid. */
-	return 1;
-}
-
 /* Do delayed input processing.  This is scheduled by sctp_rcv(). */
 static void sctp_assoc_bh_rcv(struct sctp_association *asoc)
 {
@@ -891,6 +875,7 @@ static void sctp_assoc_bh_rcv(struct sct
 	sk = asoc->base.sk;
 
 	inqueue = &asoc->base.inqueue;
+	sctp_association_hold(asoc);
 	while (NULL != (chunk = sctp_inq_pop(inqueue))) {
 		state = asoc->state;
 		subtype = chunk->chunk_hdr->type;
@@ -913,14 +898,14 @@ static void sctp_assoc_bh_rcv(struct sct
 		/* Check to see if the association is freed in response to
 		 * the incoming chunk.  If so, get out of the while loop.
 		 */
-		if (!sctp_assoc_valid(sk, asoc))
+		if (asoc->base.dead)
 			break;
 
 		/* If there is an error on chunk, discard this packet. */
 		if (error && chunk)
 			chunk->pdiscard = 1;
 	}
-
+	sctp_association_put(asoc);
 }
 
 /* This routine moves an association from its old sk to a new sk.  */
--- diff/net/sctp/input.c	2004-02-09 10:36:12.000000000 +0000
+++ source/net/sctp/input.c	2004-04-21 10:45:36.097215888 +0100
@@ -175,6 +175,12 @@ int sctp_rcv(struct sk_buff *skb)
 	rcvr = asoc ? &asoc->base : &ep->base;
 	sk = rcvr->sk;
 
+	/* SCTP seems to always need a timestamp right now (FIXME) */
+	if (skb->stamp.tv_sec == 0) {
+		do_gettimeofday(&skb->stamp);
+		sock_enable_timestamp(sk); 
+	}
+
 	if (!xfrm_policy_check(sk, XFRM_POLICY_IN, skb, family))
 		goto discard_release;
 
--- diff/net/sctp/ipv6.c	2004-02-09 10:36:12.000000000 +0000
+++ source/net/sctp/ipv6.c	2004-04-21 10:45:36.098215736 +0100
@@ -1,7 +1,7 @@
 /* SCTP kernel reference Implementation
+ * (C) Copyright IBM Corp. 2002, 2004
  * Copyright (c) 2001 Nokia, Inc.
  * Copyright (c) 2001 La Monte H.P. Yarroll
- * Copyright (c) 2002-2003 International Business Machines, Corp.
  * Copyright (c) 2002-2003 Intel Corp.
  *
  * This file is part of the SCTP kernel reference Implementation
@@ -698,7 +698,7 @@ static void sctp_inet6_event_msgname(str
 		union sctp_addr *addr;
 		struct sctp_association *asoc;
 
-		asoc = event->sndrcvinfo.sinfo_assoc_id;
+		asoc = event->asoc;
 		sctp_inet6_msgname(msgname, addrlen);
 		sin6 = (struct sockaddr_in6 *)msgname;
 		sin6->sin6_port = htons(asoc->peer.port);
--- diff/net/sctp/objcnt.c	2003-06-30 10:07:24.000000000 +0100
+++ source/net/sctp/objcnt.c	2004-04-21 10:45:36.098215736 +0100
@@ -1,5 +1,5 @@
 /* SCTP kernel reference Implementation
- * Copyright (c) 2001 International Business Machines Corp.
+ * (C) Copyright IBM Corp. 2001, 2004
  * 
  * This file is part of the SCTP kernel reference Implementation
  * 
@@ -134,7 +134,7 @@ void sctp_dbg_objcnt_init(void)
 /* Cleanup the objcount entry in the proc filesystem.  */
 void sctp_dbg_objcnt_exit(void)
 {
-	remove_proc_entry("sctp_dbg_objcount", proc_net_sctp);
+	remove_proc_entry("sctp_dbg_objcnt", proc_net_sctp);
 }
 
 
--- diff/net/sctp/protocol.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/sctp/protocol.c	2004-04-21 10:45:36.099215584 +0100
@@ -64,6 +64,9 @@ struct sctp_globals sctp_globals;
 struct proc_dir_entry	*proc_net_sctp;
 DEFINE_SNMP_STAT(struct sctp_mib, sctp_statistics);
 
+struct idr sctp_assocs_id;
+spinlock_t sctp_assocs_id_lock = SPIN_LOCK_UNLOCKED;
+
 /* This is the global socket data structure used for responding to
  * the Out-of-the-blue (OOTB) packets.  A control sock will be created
  * for this socket at the initialization time.
@@ -721,7 +724,7 @@ static void sctp_inet_event_msgname(stru
 	if (msgname) {
 		struct sctp_association *asoc;
 
-		asoc = event->sndrcvinfo.sinfo_assoc_id;
+		asoc = event->asoc;
 		sctp_inet_msgname(msgname, addr_len);
 		sin = (struct sockaddr_in *)msgname;
 		sinfrom = &asoc->peer.primary_addr.v4;
@@ -1049,6 +1052,9 @@ __init int sctp_init(void)
 	sctp_max_instreams    		= SCTP_DEFAULT_INSTREAMS;
 	sctp_max_outstreams   		= SCTP_DEFAULT_OUTSTREAMS;
 
+	/* Initialize handle used for association ids. */
+	idr_init(&sctp_assocs_id);
+
 	/* Size and allocate the association hash table.
 	 * The methodology is similar to that of the tcp hash tables.
 	 */
--- diff/net/sctp/sm_make_chunk.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/sctp/sm_make_chunk.c	2004-04-21 10:45:36.100215432 +0100
@@ -1,5 +1,5 @@
 /* SCTP kernel reference Implementation
- * (C) Copyright IBM Corp. 2001, 2003
+ * (C) Copyright IBM Corp. 2001, 2004
  * Copyright (c) 1999-2000 Cisco, Inc.
  * Copyright (c) 1999-2001 Motorola, Inc.
  * Copyright (c) 2001-2002 Intel Corp.
@@ -1817,10 +1817,23 @@ int sctp_process_init(struct sctp_associ
 	/* Allocate storage for the negotiated streams if it is not a temporary 	 * association.
 	 */
 	if (!asoc->temp) {
+		sctp_assoc_t assoc_id;
+
 		asoc->ssnmap = sctp_ssnmap_new(asoc->c.sinit_max_instreams,
 					       asoc->c.sinit_num_ostreams, gfp);
 		if (!asoc->ssnmap)
-			goto nomem_ssnmap;
+			goto clean_up;
+
+		do {
+			if (unlikely(!idr_pre_get(&sctp_assocs_id, gfp)))
+				goto clean_up;
+			spin_lock_bh(&sctp_assocs_id_lock);
+			assoc_id = (sctp_assoc_t)idr_get_new(&sctp_assocs_id,
+							     (void *)asoc);
+			spin_unlock_bh(&sctp_assocs_id_lock);
+		} while (unlikely((int)assoc_id == -1));
+
+		asoc->assoc_id = assoc_id;
 	}
 
 	/* ADDIP Section 4.1 ASCONF Chunk Procedures
@@ -1836,7 +1849,6 @@ int sctp_process_init(struct sctp_associ
 	asoc->peer.addip_serial = asoc->peer.i.initial_tsn - 1;
 	return 1;
 
-nomem_ssnmap:
 clean_up:
 	/* Release the transport structures. */
 	list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) {
--- diff/net/sctp/socket.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/sctp/socket.c	2004-04-21 10:45:36.102215128 +0100
@@ -135,8 +135,14 @@ struct sctp_association *sctp_id2assoc(s
 	}
 
 	/* Otherwise this is a UDP-style socket. */
-	asoc = (struct sctp_association *)id;
-	if (!sctp_assoc_valid(sk, asoc))
+	if (!id || (id == (sctp_assoc_t)-1))
+		return NULL;
+
+	spin_lock_bh(&sctp_assocs_id_lock);
+	asoc = (struct sctp_association *)idr_find(&sctp_assocs_id, (int)id);
+	spin_unlock_bh(&sctp_assocs_id_lock);
+
+	if (!asoc || (asoc->base.sk != sk) || asoc->base.dead)
 		return NULL;
 
 	return asoc;
@@ -1010,7 +1016,7 @@ SCTP_STATIC int sctp_sendmsg(struct kioc
 	struct list_head *pos;
 	int msg_flags = msg->msg_flags;
 
-	SCTP_DEBUG_PRINTK("sctp_sendmsg(sk: %p, msg: %p, msg_len: %u)\n",
+	SCTP_DEBUG_PRINTK("sctp_sendmsg(sk: %p, msg: %p, msg_len: %zu)\n",
 			  sk, msg, msg_len);
 
 	err = 0;
@@ -1066,7 +1072,7 @@ SCTP_STATIC int sctp_sendmsg(struct kioc
 		associd = sinfo->sinfo_assoc_id;
 	}
 
-	SCTP_DEBUG_PRINTK("msg_len: %u, sinfo_flags: 0x%x\n",
+	SCTP_DEBUG_PRINTK("msg_len: %zu, sinfo_flags: 0x%x\n",
 			  msg_len, sinfo_flags);
 
 	/* MSG_EOF or MSG_ABORT cannot be set on a TCP-style socket. */
@@ -1432,7 +1438,7 @@ SCTP_STATIC int sctp_recvmsg(struct kioc
 	int err = 0;
 	int skb_len;
 
-	SCTP_DEBUG_PRINTK("sctp_recvmsg(%s: %p, %s: %p, %s: %d, %s: %d, %s: "
+	SCTP_DEBUG_PRINTK("sctp_recvmsg(%s: %p, %s: %p, %s: %zd, %s: %d, %s: "
 			  "0x%x, %s: %p)\n", "sk", sk, "msghdr", msg,
 			  "len", len, "knoblauch", noblock,
 			  "flags", flags, "addr_len", addr_len);
@@ -1498,8 +1504,7 @@ SCTP_STATIC int sctp_recvmsg(struct kioc
 		 * rwnd by that amount. If all the data in the skb is read,
 		 * rwnd is updated when the event is freed.
 		 */
-		sctp_assoc_rwnd_increase(event->sndrcvinfo.sinfo_assoc_id,
-					 copied);
+		sctp_assoc_rwnd_increase(event->asoc, copied);
 		goto out;
 	} else if ((event->msg_flags & MSG_NOTIFICATION) ||
 		   (event->msg_flags & MSG_EOR))
@@ -4233,7 +4238,7 @@ static int sctp_wait_for_sndbuf(struct s
 	long current_timeo = *timeo_p;
 	DEFINE_WAIT(wait);
 
-	SCTP_DEBUG_PRINTK("wait_for_sndbuf: asoc=%p, timeo=%ld, msg_len=%u\n",
+	SCTP_DEBUG_PRINTK("wait_for_sndbuf: asoc=%p, timeo=%ld, msg_len=%zu\n",
 	                  asoc, (long)(*timeo_p), msg_len);
 
 	/* Increment the association's refcnt.  */
@@ -4477,7 +4482,7 @@ static void sctp_sock_migrate(struct soc
 	 */
 	sctp_skb_for_each(skb, &oldsk->sk_receive_queue, tmp) {
 		event = sctp_skb2event(skb);
-		if (event->sndrcvinfo.sinfo_assoc_id == assoc) {
+		if (event->asoc == assoc) {
 			__skb_unlink(skb, skb->list);
 			__skb_queue_tail(&newsk->sk_receive_queue, skb);
 		}
@@ -4506,7 +4511,7 @@ static void sctp_sock_migrate(struct soc
 		 */
 		sctp_skb_for_each(skb, &oldsp->pd_lobby, tmp) {
 			event = sctp_skb2event(skb);
-			if (event->sndrcvinfo.sinfo_assoc_id == assoc) {
+			if (event->asoc == assoc) {
 				__skb_unlink(skb, skb->list);
 				__skb_queue_tail(queue, skb);
 			}
--- diff/net/sctp/ulpevent.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/sctp/ulpevent.c	2004-04-21 10:45:36.103214976 +0100
@@ -1,7 +1,7 @@
 /* SCTP kernel reference Implementation
+ * (C) Copyright IBM Corp. 2001, 2004
  * Copyright (c) 1999-2000 Cisco, Inc.
  * Copyright (c) 1999-2001 Motorola, Inc.
- * Copyright (c) 2001 International Business Machines, Corp.
  * Copyright (c) 2001 Intel Corp.
  * Copyright (c) 2001 Nokia, Inc.
  * Copyright (c) 2001 La Monte H.P. Yarroll
@@ -590,8 +590,7 @@ struct sctp_ulpevent *sctp_ulpevent_make
 						struct sctp_chunk *chunk,
 						int gfp)
 {
-	struct sctp_ulpevent *event;
-	struct sctp_sndrcvinfo *info;
+	struct sctp_ulpevent *event = NULL;
 	struct sk_buff *skb;
 	size_t padding, len;
 
@@ -624,101 +623,21 @@ struct sctp_ulpevent *sctp_ulpevent_make
 	/* Initialize event with flags 0.  */
 	sctp_ulpevent_init(event, 0);
 
-	event->iif = sctp_chunk_iif(chunk);
-
 	sctp_ulpevent_receive_data(event, asoc);
 
-	info = (struct sctp_sndrcvinfo *) &event->sndrcvinfo;
-
-	/* Sockets API Extensions for SCTP
-	 * Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV)
-	 *
-	 * sinfo_stream: 16 bits (unsigned integer)
-	 *
-	 * For recvmsg() the SCTP stack places the message's stream number in
-	 * this value.
-	 */
-	info->sinfo_stream = ntohs(chunk->subh.data_hdr->stream);
-
-	/* Sockets API Extensions for SCTP
-	 * Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV)
-	 *
-	 * sinfo_ssn: 16 bits (unsigned integer)
-	 *
-	 * For recvmsg() this value contains the stream sequence number that
-	 * the remote endpoint placed in the DATA chunk.  For fragmented
-	 * messages this is the same number for all deliveries of the message
-	 * (if more than one recvmsg() is needed to read the message).
-	 */
-	info->sinfo_ssn = ntohs(chunk->subh.data_hdr->ssn);
-
-        /* Sockets API Extensions for SCTP
-	 * Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV)
-	 *
-	 * sinfo_ppid: 32 bits (unsigned integer)
-	 *
-	 * In recvmsg() this value is
-	 * the same information that was passed by the upper layer in the peer
-	 * application.  Please note that byte order issues are NOT accounted
-	 * for and this information is passed opaquely by the SCTP stack from
-	 * one end to the other.
-	 */
-	info->sinfo_ppid = chunk->subh.data_hdr->ppid;
-
-	/* Sockets API Extensions for SCTP
-	 * Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV)
-	 *
-	 * sinfo_flags: 16 bits (unsigned integer)
-	 *
-	 * This field may contain any of the following flags and is composed of
-	 * a bitwise OR of these values.
-	 *
-	 * recvmsg() flags:
-	 *
-	 * MSG_UNORDERED - This flag is present when the message was sent
-	 *                 non-ordered.
-	 */
+	event->stream = ntohs(chunk->subh.data_hdr->stream);
+	event->ssn = ntohs(chunk->subh.data_hdr->ssn);
+	event->ppid = chunk->subh.data_hdr->ppid;
 	if (chunk->chunk_hdr->flags & SCTP_DATA_UNORDERED) {
-		info->sinfo_flags |= MSG_UNORDERED;
-
-		/* sinfo_cumtsn: 32 bit (unsigned integer)
-		 *
-		 * This field will hold the current cumulative TSN as
-		 * known by the underlying SCTP layer.  Note this field is
-		 * ignored when sending and only valid for a receive
-		 * operation when sinfo_flags are set to MSG_UNORDERED.
-		 */
-		info->sinfo_cumtsn = sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map);
+		event->flags |= MSG_UNORDERED;
+		event->cumtsn = sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map);
 	}
-
-	/* Note:  For reassembly, we need to have the fragmentation bits.
-	 * For now, merge these into the msg_flags, since those bit
-	 * possitions are not used.
-	 */
+	event->tsn = ntohl(chunk->subh.data_hdr->tsn);
 	event->msg_flags |= chunk->chunk_hdr->flags;
-
-	/* With 04 draft, tsn moves into sndrcvinfo. */
-	info->sinfo_tsn = ntohl(chunk->subh.data_hdr->tsn);
-
-	/* Context is not used on receive. */
-	info->sinfo_context = 0;
-
-	/* Sockets API Extensions for SCTP
-	 * Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV)
-	 *
-	 * sinfo_assoc_id: sizeof (sctp_assoc_t)
-	 *
-	 * The association handle field, sinfo_assoc_id, holds the identifier
-	 * for the association announced in the COMMUNICATION_UP notification.
-	 * All notifications for a given association have the same identifier.
-	 * Ignored for TCP-style sockets.
-	 */
-	info->sinfo_assoc_id = sctp_assoc2id(asoc);
-
-	return event;
+	event->iif = sctp_chunk_iif(chunk);
 
 fail:
-	return NULL;
+	return event;
 }
 
 /* Create a partial delivery related event.
@@ -797,11 +716,77 @@ __u16 sctp_ulpevent_get_notification_typ
 void sctp_ulpevent_read_sndrcvinfo(const struct sctp_ulpevent *event,
 				   struct msghdr *msghdr)
 {
-	if (!sctp_ulpevent_is_notification(event)) {
-		put_cmsg(msghdr, IPPROTO_SCTP, SCTP_SNDRCV,
-			 sizeof(struct sctp_sndrcvinfo),
-			 (void *) &event->sndrcvinfo);
-	}
+	struct sctp_sndrcvinfo sinfo;
+
+	if (sctp_ulpevent_is_notification(event))
+		return;
+
+	/* Sockets API Extensions for SCTP
+ 	 * Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV)
+ 	 *
+ 	 * sinfo_stream: 16 bits (unsigned integer)
+ 	 *
+ 	 * For recvmsg() the SCTP stack places the message's stream number in
+ 	 * this value.
+ 	*/
+	sinfo.sinfo_stream = event->stream;
+	/* sinfo_ssn: 16 bits (unsigned integer)
+	 *
+	 * For recvmsg() this value contains the stream sequence number that
+	 * the remote endpoint placed in the DATA chunk.  For fragmented
+	 * messages this is the same number for all deliveries of the message
+	 * (if more than one recvmsg() is needed to read the message).
+	 */
+	sinfo.sinfo_ssn = event->ssn;
+	/* sinfo_ppid: 32 bits (unsigned integer)
+	 *
+	 * In recvmsg() this value is
+	 * the same information that was passed by the upper layer in the peer
+	 * application.  Please note that byte order issues are NOT accounted
+	 * for and this information is passed opaquely by the SCTP stack from
+	 * one end to the other.
+	 */
+	sinfo.sinfo_ppid = event->ppid;
+	/* sinfo_flags: 16 bits (unsigned integer)
+	 *
+	 * This field may contain any of the following flags and is composed of
+	 * a bitwise OR of these values.
+	 *
+	 * recvmsg() flags:
+	 *
+	 * MSG_UNORDERED - This flag is present when the message was sent
+	 *                 non-ordered.
+	 */
+	sinfo.sinfo_flags = event->flags;
+	/* sinfo_tsn: 32 bit (unsigned integer)
+	 *
+	 * For the receiving side, this field holds a TSN that was 
+	 * assigned to one of the SCTP Data Chunks.
+	 */
+	sinfo.sinfo_tsn = event->tsn;
+	/* sinfo_cumtsn: 32 bit (unsigned integer)
+	 *
+	 * This field will hold the current cumulative TSN as
+	 * known by the underlying SCTP layer.  Note this field is
+	 * ignored when sending and only valid for a receive
+	 * operation when sinfo_flags are set to MSG_UNORDERED.
+	 */
+	sinfo.sinfo_cumtsn = event->cumtsn;
+	/* sinfo_assoc_id: sizeof (sctp_assoc_t)
+	 *
+	 * The association handle field, sinfo_assoc_id, holds the identifier
+	 * for the association announced in the COMMUNICATION_UP notification.
+	 * All notifications for a given association have the same identifier.
+	 * Ignored for one-to-one style sockets.
+	 */
+	sinfo.sinfo_assoc_id = sctp_assoc2id(event->asoc);
+
+	/* These fields are not used while receiving. */
+	sinfo.sinfo_context = 0;
+	sinfo.sinfo_timetolive = 0;
+
+	put_cmsg(msghdr, IPPROTO_SCTP, SCTP_SNDRCV,
+		 sizeof(struct sctp_sndrcvinfo), (void *)&sinfo);
 }
 
 /* Stub skb destructor.  */
@@ -831,14 +816,14 @@ static inline void sctp_ulpevent_set_own
 	sctp_association_hold((struct sctp_association *)asoc);
 	skb = sctp_event2skb(event);
 	skb->sk = asoc->base.sk;
-	event->sndrcvinfo.sinfo_assoc_id = sctp_assoc2id(asoc);
+	event->asoc = (struct sctp_association *)asoc;
 	skb->destructor = sctp_stub_rfree;
 }
 
 /* A simple destructor to give up the reference to the association. */
 static inline void sctp_ulpevent_release_owner(struct sctp_ulpevent *event)
 {
-	sctp_association_put(event->sndrcvinfo.sinfo_assoc_id);
+	sctp_association_put(event->asoc);
 }
 
 /* Do accounting for bytes received and hold a reference to the association
@@ -880,8 +865,7 @@ static void sctp_ulpevent_release_data(s
 	 */
 
 	skb = sctp_event2skb(event);
-	sctp_assoc_rwnd_increase(event->sndrcvinfo.sinfo_assoc_id,
-				 skb_headlen(skb));
+	sctp_assoc_rwnd_increase(event->asoc, skb_headlen(skb));
 
 	/* Don't forget the fragments. */
 	for (frag = skb_shinfo(skb)->frag_list; frag; frag = frag->next) {
--- diff/net/sctp/ulpqueue.c	2003-08-20 14:16:14.000000000 +0100
+++ source/net/sctp/ulpqueue.c	2004-04-21 10:45:36.104214824 +0100
@@ -1,7 +1,7 @@
 /* SCTP kernel reference Implementation
+ * (C) Copyright IBM Corp. 2001, 2004
  * Copyright (c) 1999-2000 Cisco, Inc.
  * Copyright (c) 1999-2001 Motorola, Inc.
- * Copyright (c) 2001-2003 International Business Machines, Corp.
  * Copyright (c) 2001 Intel Corp.
  * Copyright (c) 2001 Nokia, Inc.
  * Copyright (c) 2001 La Monte H.P. Yarroll
@@ -251,7 +251,7 @@ static inline void sctp_ulpq_store_reasm
 	struct sctp_ulpevent *cevent;
 	__u32 tsn, ctsn;
 
-	tsn = event->sndrcvinfo.sinfo_tsn;
+	tsn = event->tsn;
 
 	/* See if it belongs at the end. */
 	pos = skb_peek_tail(&ulpq->reasm);
@@ -262,7 +262,7 @@ static inline void sctp_ulpq_store_reasm
 
 	/* Short circuit just dropping it at the end. */
 	cevent = sctp_skb2event(pos);
-	ctsn = cevent->sndrcvinfo.sinfo_tsn;
+	ctsn = cevent->tsn;
 	if (TSN_lt(ctsn, tsn)) {
 		__skb_queue_tail(&ulpq->reasm, sctp_event2skb(event));
 		return;
@@ -271,7 +271,7 @@ static inline void sctp_ulpq_store_reasm
 	/* Find the right place in this list. We store them by TSN.  */
 	skb_queue_walk(&ulpq->reasm, pos) {
 		cevent = sctp_skb2event(pos);
-		ctsn = cevent->sndrcvinfo.sinfo_tsn;
+		ctsn = cevent->tsn;
 
 		if (TSN_lt(tsn, ctsn))
 			break;
@@ -368,7 +368,7 @@ static inline struct sctp_ulpevent *sctp
 	 */
 	skb_queue_walk(&ulpq->reasm, pos) {
 		cevent = sctp_skb2event(pos);
-		ctsn = cevent->sndrcvinfo.sinfo_tsn;
+		ctsn = cevent->tsn;
 
 		switch (cevent->msg_flags & SCTP_DATA_FRAG_MASK) {
 		case SCTP_DATA_FIRST_FRAG:
@@ -425,7 +425,7 @@ static inline struct sctp_ulpevent *sctp
 
 	skb_queue_walk(&ulpq->reasm, pos) {
 		cevent = sctp_skb2event(pos);
-		ctsn = cevent->sndrcvinfo.sinfo_tsn;
+		ctsn = cevent->tsn;
 
 		switch (cevent->msg_flags & SCTP_DATA_FRAG_MASK) {
 		case SCTP_DATA_MIDDLE_FRAG:
@@ -486,7 +486,7 @@ static inline struct sctp_ulpevent *sctp
 		/* Do not even bother unless this is the next tsn to
 		 * be delivered.
 		 */
-		ctsn = event->sndrcvinfo.sinfo_tsn;
+		ctsn = event->tsn;
 		ctsnap = sctp_tsnmap_get_ctsn(&ulpq->asoc->peer.tsn_map);
 		if (TSN_lte(ctsn, ctsnap))
 			retval = sctp_ulpq_retrieve_partial(ulpq);
@@ -517,7 +517,7 @@ static inline struct sctp_ulpevent *sctp
 
 	skb_queue_walk(&ulpq->reasm, pos) {
 		cevent = sctp_skb2event(pos);
-		ctsn = cevent->sndrcvinfo.sinfo_tsn;
+		ctsn = cevent->tsn;
 
 		switch (cevent->msg_flags & SCTP_DATA_FRAG_MASK) {
 		case SCTP_DATA_FIRST_FRAG:
@@ -563,15 +563,15 @@ static inline void sctp_ulpq_retrieve_or
 	__u16 sid, csid;
 	__u16 ssn, cssn;
 
-	sid = event->sndrcvinfo.sinfo_stream;
-	ssn = event->sndrcvinfo.sinfo_ssn;
+	sid = event->stream;
+	ssn = event->ssn;
 	in  = &ulpq->asoc->ssnmap->in;
 
 	/* We are holding the chunks by stream, by SSN.  */
 	sctp_skb_for_each(pos, &ulpq->lobby, tmp) {
 		cevent = (struct sctp_ulpevent *) pos->cb;
-		csid = cevent->sndrcvinfo.sinfo_stream;
-		cssn = cevent->sndrcvinfo.sinfo_ssn;
+		csid = cevent->stream;
+		cssn = cevent->ssn;
 
 		/* Have we gone too far?  */
 		if (csid > sid)
@@ -609,12 +609,12 @@ static inline void sctp_ulpq_store_order
 		return;
 	}
 
-	sid = event->sndrcvinfo.sinfo_stream;
-	ssn = event->sndrcvinfo.sinfo_ssn;
+	sid = event->stream;
+	ssn = event->ssn;
 	
 	cevent = (struct sctp_ulpevent *) pos->cb;
-	csid = cevent->sndrcvinfo.sinfo_stream;
-	cssn = cevent->sndrcvinfo.sinfo_ssn;
+	csid = cevent->stream;
+	cssn = cevent->ssn;
 	if (sid > csid) {
 		__skb_queue_tail(&ulpq->lobby, sctp_event2skb(event));
 		return;
@@ -630,8 +630,8 @@ static inline void sctp_ulpq_store_order
 	 */
 	skb_queue_walk(&ulpq->lobby, pos) {
 		cevent = (struct sctp_ulpevent *) pos->cb;
-		csid = cevent->sndrcvinfo.sinfo_stream;
-		cssn = cevent->sndrcvinfo.sinfo_ssn;
+		csid = cevent->stream;
+		cssn = cevent->ssn;
 
 		if (csid > sid)
 			break;
@@ -656,8 +656,8 @@ static inline struct sctp_ulpevent *sctp
 		return event;
 
 	/* Note: The stream ID must be verified before this routine.  */
-	sid = event->sndrcvinfo.sinfo_stream;
-	ssn = event->sndrcvinfo.sinfo_ssn;
+	sid = event->stream;
+	ssn = event->ssn;
 	in  = &ulpq->asoc->ssnmap->in;
 
 	/* Is this the expected SSN for this stream ID?  */
@@ -694,7 +694,7 @@ static __u16 sctp_ulpq_renege_order(stru
 	while ((skb = __skb_dequeue_tail(&ulpq->lobby))) {
 		freed += skb_headlen(skb);
 		event = sctp_skb2event(skb);
-		tsn = event->sndrcvinfo.sinfo_tsn;
+		tsn = event->tsn;
 
 		sctp_ulpevent_free(event);
 		sctp_tsnmap_renege(tsnmap, tsn);
@@ -720,7 +720,7 @@ static __u16 sctp_ulpq_renege_frags(stru
 	while ((skb = __skb_dequeue_tail(&ulpq->reasm))) {
 		freed += skb_headlen(skb);
 		event = sctp_skb2event(skb);
-		tsn = event->sndrcvinfo.sinfo_tsn;
+		tsn = event->tsn;
 
 		sctp_ulpevent_free(event);
 		sctp_tsnmap_renege(tsnmap, tsn);
--- diff/net/sunrpc/auth_gss/auth_gss.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/sunrpc/auth_gss/auth_gss.c	2004-04-21 10:45:36.104214824 +0100
@@ -365,7 +365,7 @@ retry:
 	gss_msg = gss_new;
 	memset(gss_new, 0, sizeof(*gss_new));
 	INIT_LIST_HEAD(&gss_new->list);
-	INIT_RPC_WAITQ(&gss_new->waitq, "RPCSEC_GSS upcall waitq");
+	rpc_init_wait_queue(&gss_new->waitq, "RPCSEC_GSS upcall waitq");
 	atomic_set(&gss_new->count, 2);
 	msg = &gss_new->msg;
 	msg->data = &gss_new->uid;
@@ -721,8 +721,7 @@ gss_marshal(struct rpc_task *task, u32 *
 		printk("gss_marshal: gss_get_mic FAILED (%d)\n", maj_stat);
 		goto out_put_ctx;
 	}
-	*p++ = htonl(mic.len);
-	p += XDR_QUADLEN(mic.len);
+	p = xdr_encode_opaque(p, NULL, mic.len);
 	gss_put_ctx(ctx);
 	return p;
 out_put_ctx:
@@ -857,9 +856,7 @@ gss_wrap_req(struct rpc_task *task,
 			status = -EIO; /* XXX? */
 			if (maj_stat)
 				goto out;
-			q = p;
-			*q++ = htonl(mic.len);
-			q += XDR_QUADLEN(mic.len);
+			q = xdr_encode_opaque(p, NULL, mic.len);
 
 			offset = (u8 *)q - (u8 *)p;
 			iov->iov_len += offset;
--- diff/net/sunrpc/auth_gss/gss_krb5_crypto.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/sunrpc/auth_gss/gss_krb5_crypto.c	2004-04-21 10:45:36.105214672 +0100
@@ -40,6 +40,7 @@
 #include <asm/scatterlist.h>
 #include <linux/crypto.h>
 #include <linux/highmem.h>
+#include <linux/pagemap.h>
 #include <linux/sunrpc/gss_krb5.h>
 
 #ifdef RPC_DEBUG
@@ -171,22 +172,24 @@ krb5_make_checksum(s32 cksumtype, char *
 	}
 
 	len = body->page_len;
-	offset = body->page_base;
-	i = 0;
-	while (len) {
-		sg->page = body->pages[i];
-		sg->offset = offset;
-		offset = 0;
-		if (PAGE_SIZE > len)
-			thislen = len;
-		else
-			thislen = PAGE_SIZE;
-		sg->length = thislen;
-		kmap(sg->page); /* XXX kmap_atomic? */
-		crypto_digest_update(tfm, sg, 1);
-		kunmap(sg->page);
-		len -= thislen;
-		i++;
+	if (len != 0) {
+		offset = body->page_base & (PAGE_CACHE_SIZE - 1);
+		i = body->page_base >> PAGE_CACHE_SHIFT;
+		thislen = PAGE_CACHE_SIZE - offset;
+		do {
+			if (thislen > len)
+				thislen = len;
+			sg->page = body->pages[i];
+			sg->offset = offset;
+			sg->length = thislen;
+			kmap(sg->page); /* XXX kmap_atomic? */
+			crypto_digest_update(tfm, sg, 1);
+			kunmap(sg->page);
+			len -= thislen;
+			i++;
+			offset = 0;
+			thislen = PAGE_CACHE_SIZE;
+		} while(len != 0);
 	}
 	if (body->tail[0].iov_len) {
 		buf_to_sg(sg, body->tail[0].iov_base, body->tail[0].iov_len);
--- diff/net/sunrpc/auth_gss/gss_krb5_mech.c	2004-03-11 10:20:29.000000000 +0000
+++ source/net/sunrpc/auth_gss/gss_krb5_mech.c	2004-04-21 10:45:36.105214672 +0100
@@ -236,6 +236,8 @@ static int __init init_kerberos_module(v
 	gss_register_triple(RPC_AUTH_GSS_KRB5I, gm, 0, RPC_GSS_SVC_INTEGRITY);
 	if (svcauth_gss_register_pseudoflavor(RPC_AUTH_GSS_KRB5, "krb5"))
 		printk("Failed to register %s with server!\n", "krb5");
+	if (svcauth_gss_register_pseudoflavor(RPC_AUTH_GSS_KRB5I, "krb5i"))
+		printk("Failed to register %s with server!\n", "krb5i");
 	gss_mech_put(gm);
 	return 0;
 }
--- diff/net/sunrpc/auth_gss/svcauth_gss.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/sunrpc/auth_gss/svcauth_gss.c	2004-04-21 10:45:36.106214520 +0100
@@ -389,11 +389,13 @@ static int rsc_parse(struct cache_detail
 		/* number of additional gid's */
 		if (get_int(&mesg, &N))
 			goto out;
+		status = -ENOMEM;
 		rsci.cred.cr_group_info = groups_alloc(N);
 		if (rsci.cred.cr_group_info == NULL)
 			goto out;
 
 		/* gid's */
+		status = -EINVAL;
 		for (i=0; i<N; i++) {
 			gid_t gid;
 			if (get_int(&mesg, &gid))
@@ -406,7 +408,11 @@ static int rsc_parse(struct cache_detail
 		if (len < 0)
 			goto out;
 		gm = gss_mech_get_by_name(buf);
+		status = -EOPNOTSUPP;
+		if (!gm)
+			goto out;
 
+		status = -EINVAL;
 		/* mech-specific data: */
 		len = qword_get(&mesg, buf, mlen);
 		if (len < 0) {
@@ -664,6 +670,68 @@ out:
 	return stat;
 }
 
+static inline int
+read_u32_from_xdr_buf(struct xdr_buf *buf, int base, u32 *obj)
+{
+	u32     raw;
+	int     status;
+
+	status = read_bytes_from_xdr_buf(buf, base, &raw, sizeof(*obj));
+	if (status)
+		return status;
+	*obj = ntohl(raw);
+	return 0;
+}
+
+/* It would be nice if this bit of code could be shared with the client.
+ * Obstacles:
+ *	The client shouldn't malloc(), would have to pass in own memory.
+ *	The server uses base of head iovec as read pointer, while the
+ *	client uses separate pointer. */
+static int
+unwrap_integ_data(struct xdr_buf *buf, u32 seq, struct gss_ctx *ctx)
+{
+	int stat = -EINVAL;
+	u32 integ_len, maj_stat;
+	struct xdr_netobj mic;
+	struct xdr_buf integ_buf;
+
+	integ_len = ntohl(svc_getu32(&buf->head[0]));
+	if (integ_len & 3)
+		goto out;
+	if (integ_len > buf->len)
+		goto out;
+	if (xdr_buf_subsegment(buf, &integ_buf, 0, integ_len))
+		BUG();
+	/* copy out mic... */
+	if (read_u32_from_xdr_buf(buf, integ_len, &mic.len))
+		BUG();
+	if (mic.len > RPC_MAX_AUTH_SIZE)
+		goto out;
+	mic.data = kmalloc(mic.len, GFP_KERNEL);
+	if (!mic.data)
+		goto out;
+	if (read_bytes_from_xdr_buf(buf, integ_len + 4, mic.data, mic.len))
+		goto out;
+	maj_stat = gss_verify_mic(ctx, &integ_buf, &mic, NULL);
+	if (maj_stat != GSS_S_COMPLETE)
+		goto out;
+	if (ntohl(svc_getu32(&buf->head[0])) != seq)
+		goto out;
+	stat = 0;
+out:
+	return stat;
+}
+
+struct gss_svc_data {
+	/* decoded gss client cred: */
+	struct rpc_gss_wire_cred	clcred;
+	/* pointer to the beginning of the procedure-specific results,
+	 * which may be encrypted/checksummed in svcauth_gss_release: */
+	u32				*body_start;
+	struct rsc			*rsci;
+};
+
 /*
  * Accept an rpcsec packet.
  * If context establishment, punt to user space
@@ -684,7 +752,7 @@ svcauth_gss_accept(struct svc_rqst *rqst
 	struct rsc	*rsci = NULL;
 	struct rsi	*rsip, rsikey;
 	u32		*rpcstart;
-	u32		*reject_stat = resv->iov_base;
+	u32		*reject_stat = resv->iov_base + resv->iov_len;
 	int		ret;
 
 	dprintk("RPC: svcauth_gss: argv->iov_len = %zd\n",argv->iov_len);
@@ -695,6 +763,8 @@ svcauth_gss_accept(struct svc_rqst *rqst
 	if (!svcdata)
 		goto auth_err;
 	rqstp->rq_auth_data = svcdata;
+	svcdata->body_start = 0;
+	svcdata->rsci = NULL;
 	gc = &svcdata->clcred;
 
 	/* start of rpc packet is 7 u32's back from here:
@@ -748,9 +818,6 @@ svcauth_gss_accept(struct svc_rqst *rqst
 		break;
 	case RPC_GSS_PROC_DATA:
 	case RPC_GSS_PROC_DESTROY:
-		/* integrity and privacy unsupported: */
-		if (gc->gc_svc != RPC_GSS_SVC_NONE)
-			goto auth_err;
 		*authp = rpcsec_gsserr_credproblem;
 		rsci = gss_svc_searchbyctx(&gc->gc_ctx);
 		if (!rsci)
@@ -828,6 +895,7 @@ svcauth_gss_accept(struct svc_rqst *rqst
 		svc_putu32(resv, rpc_success);
 		goto complete;
 	case RPC_GSS_PROC_DATA:
+		*authp = rpc_autherr_badcred;
 		rqstp->rq_client =
 			find_gss_auth_domain(rsci->mechctx, gc->gc_svc);
 		if (rqstp->rq_client == NULL)
@@ -835,10 +903,28 @@ svcauth_gss_accept(struct svc_rqst *rqst
 		*authp = rpcsec_gsserr_ctxproblem;
 		if (gss_write_verf(rqstp, rsci->mechctx, gc->gc_seq))
 			goto auth_err;
-		/* For use when wrapping: */
-		svcdata->body_start = resv->iov_base + 1;
 		rqstp->rq_cred = rsci->cred;
 		get_group_info(rsci->cred.cr_group_info);
+		*authp = rpc_autherr_badcred;
+		switch (gc->gc_svc) {
+		case RPC_GSS_SVC_NONE:
+			break;
+		case RPC_GSS_SVC_INTEGRITY:
+			if (unwrap_integ_data(&rqstp->rq_arg,
+					gc->gc_seq, rsci->mechctx))
+				goto auth_err;
+			svcdata->rsci = rsci;
+			cache_get(&rsci->h);
+			/* placeholders for length and seq. number: */
+			svcdata->body_start = resv->iov_base + resv->iov_len;
+			svc_putu32(resv, 0);
+			svc_putu32(resv, 0);
+			break;
+		case RPC_GSS_SVC_PRIVACY:
+			/* currently unsupported */
+		default:
+			goto auth_err;
+		}
 		ret = SVC_OK;
 		goto out;
 	}
@@ -861,14 +947,95 @@ out:
 static int
 svcauth_gss_release(struct svc_rqst *rqstp)
 {
+	struct gss_svc_data *gsd = (struct gss_svc_data *)rqstp->rq_auth_data;
+	struct rpc_gss_wire_cred *gc = &gsd->clcred;
+	struct xdr_buf *resbuf = &rqstp->rq_res;
+	struct xdr_buf integ_buf;
+	struct xdr_netobj mic;
+	struct iovec *resv;
+	u32 *p;
+	int integ_offset, integ_len;
+	int stat = -EINVAL;
+
+	if (gc->gc_proc != RPC_GSS_PROC_DATA)
+		goto out;
+	/* Release can be called twice, but we only wrap once. */
+	if (gsd->body_start == 0)
+		goto out;
+	/* normally not set till svc_send, but we need it here: */
+	resbuf->len = resbuf->head[0].iov_len
+		+ resbuf->page_len + resbuf->tail[0].iov_len;
+	switch (gc->gc_svc) {
+	case RPC_GSS_SVC_NONE:
+		break;
+	case RPC_GSS_SVC_INTEGRITY:
+		p = gsd->body_start;
+		gsd->body_start = 0;
+		/* move accept_stat to right place: */
+		memcpy(p, p + 2, 4);
+		/* don't wrap in failure case: */
+		/* Note: counting on not getting here if call was not even
+		 * accepted! */
+		if (*p != rpc_success) {
+			resbuf->head[0].iov_len -= 2 * 4;
+			goto out;
+		}
+		p++;
+		integ_offset = (u8 *)(p + 1) - (u8 *)resbuf->head[0].iov_base;
+		integ_len = resbuf->len - integ_offset;
+		BUG_ON(integ_len % 4);
+		*p++ = htonl(integ_len);
+		*p++ = htonl(gc->gc_seq);
+		if (xdr_buf_subsegment(resbuf, &integ_buf, integ_offset,
+					integ_len))
+			BUG();
+		if (resbuf->page_len == 0
+			&& resbuf->tail[0].iov_len + RPC_MAX_AUTH_SIZE
+				< PAGE_SIZE) {
+			BUG_ON(resbuf->tail[0].iov_len);
+			/* Use head for everything */
+			resv = &resbuf->head[0];
+		} else if (resbuf->tail[0].iov_base == NULL) {
+			/* copied from nfsd4_encode_read */
+			svc_take_page(rqstp);
+			resbuf->tail[0].iov_base = page_address(rqstp
+					->rq_respages[rqstp->rq_resused-1]);
+			rqstp->rq_restailpage = rqstp->rq_resused-1;
+			resbuf->tail[0].iov_len = 0;
+			resv = &resbuf->tail[0];
+		} else {
+			resv = &resbuf->tail[0];
+		}
+		mic.data = (u8 *)resv->iov_base + resv->iov_len + 4;
+		if (gss_get_mic(gsd->rsci->mechctx, 0, &integ_buf, &mic))
+			goto out_err;
+		svc_putu32(resv, htonl(mic.len));
+		memset(mic.data + mic.len, 0,
+				round_up_to_quad(mic.len) - mic.len);
+		resv->iov_len += XDR_QUADLEN(mic.len) << 2;
+		/* not strictly required: */
+		resbuf->len += XDR_QUADLEN(mic.len) << 2;
+		BUG_ON(resv->iov_len > PAGE_SIZE);
+		break;
+	case RPC_GSS_SVC_PRIVACY:
+	default:
+		goto out_err;
+	}
+
+out:
+	stat = 0;
+out_err:
 	if (rqstp->rq_client)
 		auth_domain_put(rqstp->rq_client);
 	rqstp->rq_client = NULL;
 	if (rqstp->rq_cred.cr_group_info)
 		put_group_info(rqstp->rq_cred.cr_group_info);
 	rqstp->rq_cred.cr_group_info = NULL;
+	if (gsd->rsci)
+		rsc_put(&gsd->rsci->h, &rsc_cache);
+	gsd->rsci = NULL;
 
-	return 0;
+	return stat;
 }
 
 static void
--- diff/net/sunrpc/clnt.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/sunrpc/clnt.c	2004-04-21 10:45:36.107214368 +0100
@@ -144,7 +144,7 @@ rpc_create_client(struct rpc_xprt *xprt,
 	clnt->cl_vers     = version->number;
 	clnt->cl_prot     = xprt->prot;
 	clnt->cl_stats    = program->stats;
-	INIT_RPC_WAITQ(&clnt->cl_pmap_default.pm_bindwait, "bindwait");
+	rpc_init_wait_queue(&clnt->cl_pmap_default.pm_bindwait, "bindwait");
 
 	if (!clnt->cl_port)
 		clnt->cl_autobind = 1;
@@ -605,11 +605,13 @@ call_encode(struct rpc_task *task)
 	sndbuf->tail[0].iov_len  = 0;
 	sndbuf->page_len	 = 0;
 	sndbuf->len		 = 0;
+	sndbuf->buflen		 = bufsiz;
 	rcvbuf->head[0].iov_base = (void *)((char *)task->tk_buffer + bufsiz);
 	rcvbuf->head[0].iov_len  = bufsiz;
 	rcvbuf->tail[0].iov_len  = 0;
 	rcvbuf->page_len	 = 0;
-	rcvbuf->len		 = bufsiz;
+	rcvbuf->len		 = 0;
+	rcvbuf->buflen		 = bufsiz;
 
 	/* Encode header and provided arguments */
 	encode = task->tk_msg.rpc_proc->p_encode;
@@ -849,6 +851,8 @@ call_decode(struct rpc_task *task)
 		return;
 	}
 
+	req->rq_rcv_buf.len = req->rq_private_buf.len;
+
 	/* Check that the softirq receive buffer is valid */
 	WARN_ON(memcmp(&req->rq_rcv_buf, &req->rq_private_buf,
 				sizeof(req->rq_rcv_buf)) != 0);
@@ -884,7 +888,7 @@ call_decode(struct rpc_task *task)
 					task->tk_status);
 	return;
 out_retry:
-	req->rq_received = 0;
+	req->rq_received = req->rq_private_buf.len = 0;
 	task->tk_status = 0;
 }
 
@@ -956,7 +960,7 @@ call_header(struct rpc_task *task)
 static u32 *
 call_verify(struct rpc_task *task)
 {
-	u32	*p = task->tk_rqstp->rq_rvec[0].iov_base, n;
+	u32	*p = task->tk_rqstp->rq_rcv_buf.head[0].iov_base, n;
 
 	p += 1;	/* skip XID */
 
--- diff/net/sunrpc/sched.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/sunrpc/sched.c	2004-04-21 10:45:36.108214216 +0100
@@ -162,6 +162,26 @@ rpc_delete_timer(struct rpc_task *task)
 }
 
 /*
+ * Add new request to a priority queue.
+ */
+static void __rpc_add_wait_queue_priority(struct rpc_wait_queue *queue, struct rpc_task *task)
+{
+	struct list_head *q;
+	struct rpc_task *t;
+
+	q = &queue->tasks[task->tk_priority];
+	if (unlikely(task->tk_priority > queue->maxpriority))
+		q = &queue->tasks[queue->maxpriority];
+	list_for_each_entry(t, q, tk_list) {
+		if (t->tk_cookie == task->tk_cookie) {
+			list_add_tail(&task->tk_list, &t->tk_links);
+			return;
+		}
+	}
+	list_add_tail(&task->tk_list, q);
+}
+
+/*
  * Add new request to wait queue.
  *
  * Swapper tasks always get inserted at the head of the queue.
@@ -169,8 +189,7 @@ rpc_delete_timer(struct rpc_task *task)
  * improve overall performance.
  * Everyone else gets appended to the queue to ensure proper FIFO behavior.
  */
-static inline int
-__rpc_add_wait_queue(struct rpc_wait_queue *queue, struct rpc_task *task)
+static int __rpc_add_wait_queue(struct rpc_wait_queue *queue, struct rpc_task *task)
 {
 	if (task->tk_rpcwait == queue)
 		return 0;
@@ -179,10 +198,12 @@ __rpc_add_wait_queue(struct rpc_wait_que
 		printk(KERN_WARNING "RPC: doubly enqueued task!\n");
 		return -EWOULDBLOCK;
 	}
-	if (RPC_IS_SWAPPER(task))
-		list_add(&task->tk_list, &queue->tasks);
+	if (RPC_IS_PRIORITY(queue))
+		__rpc_add_wait_queue_priority(queue, task);
+	else if (RPC_IS_SWAPPER(task))
+		list_add(&task->tk_list, &queue->tasks[0]);
 	else
-		list_add_tail(&task->tk_list, &queue->tasks);
+		list_add_tail(&task->tk_list, &queue->tasks[0]);
 	task->tk_rpcwait = queue;
 
 	dprintk("RPC: %4d added to queue %p \"%s\"\n",
@@ -191,8 +212,7 @@ __rpc_add_wait_queue(struct rpc_wait_que
 	return 0;
 }
 
-int
-rpc_add_wait_queue(struct rpc_wait_queue *q, struct rpc_task *task)
+int rpc_add_wait_queue(struct rpc_wait_queue *q, struct rpc_task *task)
 {
 	int		result;
 
@@ -203,18 +223,35 @@ rpc_add_wait_queue(struct rpc_wait_queue
 }
 
 /*
+ * Remove request from a priority queue.
+ */
+static void __rpc_remove_wait_queue_priority(struct rpc_task *task)
+{
+	struct rpc_task *t;
+
+	if (!list_empty(&task->tk_links)) {
+		t = list_entry(task->tk_links.next, struct rpc_task, tk_list);
+		list_move(&t->tk_list, &task->tk_list);
+		list_splice_init(&task->tk_links, &t->tk_links);
+	}
+	list_del(&task->tk_list);
+}
+
+/*
  * Remove request from queue.
  * Note: must be called with spin lock held.
  */
-static inline void
-__rpc_remove_wait_queue(struct rpc_task *task)
+static void __rpc_remove_wait_queue(struct rpc_task *task)
 {
 	struct rpc_wait_queue *queue = task->tk_rpcwait;
 
 	if (!queue)
 		return;
 
-	list_del(&task->tk_list);
+	if (RPC_IS_PRIORITY(queue))
+		__rpc_remove_wait_queue_priority(task);
+	else
+		list_del(&task->tk_list);
 	task->tk_rpcwait = NULL;
 
 	dprintk("RPC: %4d removed from queue %p \"%s\"\n",
@@ -231,6 +268,48 @@ rpc_remove_wait_queue(struct rpc_task *t
 	spin_unlock_bh(&rpc_queue_lock);
 }
 
+static inline void rpc_set_waitqueue_priority(struct rpc_wait_queue *queue, int priority)
+{
+	queue->priority = priority;
+	queue->count = 1 << (priority * 2);
+}
+
+static inline void rpc_set_waitqueue_cookie(struct rpc_wait_queue *queue, unsigned long cookie)
+{
+	queue->cookie = cookie;
+	queue->nr = RPC_BATCH_COUNT;
+}
+
+static inline void rpc_reset_waitqueue_priority(struct rpc_wait_queue *queue)
+{
+	rpc_set_waitqueue_priority(queue, queue->maxpriority);
+	rpc_set_waitqueue_cookie(queue, 0);
+}
+
+static void __rpc_init_priority_wait_queue(struct rpc_wait_queue *queue, const char *qname, int maxprio)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(queue->tasks); i++)
+		INIT_LIST_HEAD(&queue->tasks[i]);
+	queue->maxpriority = maxprio;
+	rpc_reset_waitqueue_priority(queue);
+#ifdef RPC_DEBUG
+	queue->name = qname;
+#endif
+}
+
+void rpc_init_priority_wait_queue(struct rpc_wait_queue *queue, const char *qname)
+{
+	__rpc_init_priority_wait_queue(queue, qname, RPC_PRIORITY_HIGH);
+}
+
+void rpc_init_wait_queue(struct rpc_wait_queue *queue, const char *qname)
+{
+	__rpc_init_priority_wait_queue(queue, qname, 0);
+}
+EXPORT_SYMBOL(rpc_init_wait_queue);
+
 /*
  * Make an RPC task runnable.
  *
@@ -255,13 +334,11 @@ rpc_make_runnable(struct rpc_task *task)
 				return;
 			}
 			rpc_clear_sleeping(task);
-			if (waitqueue_active(&rpciod_idle))
-				wake_up(&rpciod_idle);
+			wake_up(&rpciod_idle);
 		}
 	} else {
 		rpc_clear_sleeping(task);
-		if (waitqueue_active(&task->tk_wait))
-			wake_up(&task->tk_wait);
+		wake_up(&task->tk_wait);
 	}
 }
 
@@ -287,8 +364,7 @@ void rpciod_wake_up(void)
 {
 	if(rpciod_pid==0)
 		printk(KERN_ERR "rpciod: wot no daemon?\n");
-	if (waitqueue_active(&rpciod_idle))
-		wake_up(&rpciod_idle);
+	wake_up(&rpciod_idle);
 }
 
 /*
@@ -406,17 +482,72 @@ rpc_wake_up_task(struct rpc_task *task)
 }
 
 /*
+ * Wake up the next task on a priority queue.
+ */
+static struct rpc_task * __rpc_wake_up_next_priority(struct rpc_wait_queue *queue)
+{
+	struct list_head *q;
+	struct rpc_task *task;
+
+	/*
+	 * Service a batch of tasks from a single cookie.
+	 */
+	q = &queue->tasks[queue->priority];
+	if (!list_empty(q)) {
+		task = list_entry(q->next, struct rpc_task, tk_list);
+		if (queue->cookie == task->tk_cookie) {
+			if (--queue->nr)
+				goto out;
+			list_move_tail(&task->tk_list, q);
+		}
+		/*
+		 * Check if we need to switch queues.
+		 */
+		if (--queue->count)
+			goto new_cookie;
+	}
+
+	/*
+	 * Service the next queue.
+	 */
+	do {
+		if (q == &queue->tasks[0])
+			q = &queue->tasks[queue->maxpriority];
+		else
+			q = q - 1;
+		if (!list_empty(q)) {
+			task = list_entry(q->next, struct rpc_task, tk_list);
+			goto new_queue;
+		}
+	} while (q != &queue->tasks[queue->priority]);
+
+	rpc_reset_waitqueue_priority(queue);
+	return NULL;
+
+new_queue:
+	rpc_set_waitqueue_priority(queue, (unsigned int)(q - &queue->tasks[0]));
+new_cookie:
+	rpc_set_waitqueue_cookie(queue, task->tk_cookie);
+out:
+	__rpc_wake_up_task(task);
+	return task;
+}
+
+/*
  * Wake up the next task on the wait queue.
  */
-struct rpc_task *
-rpc_wake_up_next(struct rpc_wait_queue *queue)
+struct rpc_task * rpc_wake_up_next(struct rpc_wait_queue *queue)
 {
 	struct rpc_task	*task = NULL;
 
 	dprintk("RPC:      wake_up_next(%p \"%s\")\n", queue, rpc_qname(queue));
 	spin_lock_bh(&rpc_queue_lock);
-	task_for_first(task, &queue->tasks)
-		__rpc_wake_up_task(task);
+	if (RPC_IS_PRIORITY(queue))
+		task = __rpc_wake_up_next_priority(queue);
+	else {
+		task_for_first(task, &queue->tasks[0])
+			__rpc_wake_up_task(task);
+	}
 	spin_unlock_bh(&rpc_queue_lock);
 
 	return task;
@@ -428,15 +559,22 @@ rpc_wake_up_next(struct rpc_wait_queue *
  *
  * Grabs rpc_queue_lock
  */
-void
-rpc_wake_up(struct rpc_wait_queue *queue)
+void rpc_wake_up(struct rpc_wait_queue *queue)
 {
 	struct rpc_task *task;
 
+	struct list_head *head;
 	spin_lock_bh(&rpc_queue_lock);
-	while (!list_empty(&queue->tasks))
-		task_for_first(task, &queue->tasks)
+	head = &queue->tasks[queue->maxpriority];
+	for (;;) {
+		while (!list_empty(head)) {
+			task = list_entry(head->next, struct rpc_task, tk_list);
 			__rpc_wake_up_task(task);
+		}
+		if (head == &queue->tasks[0])
+			break;
+		head--;
+	}
 	spin_unlock_bh(&rpc_queue_lock);
 }
 
@@ -447,17 +585,22 @@ rpc_wake_up(struct rpc_wait_queue *queue
  *
  * Grabs rpc_queue_lock
  */
-void
-rpc_wake_up_status(struct rpc_wait_queue *queue, int status)
+void rpc_wake_up_status(struct rpc_wait_queue *queue, int status)
 {
+	struct list_head *head;
 	struct rpc_task *task;
 
 	spin_lock_bh(&rpc_queue_lock);
-	while (!list_empty(&queue->tasks)) {
-		task_for_first(task, &queue->tasks) {
+	head = &queue->tasks[queue->maxpriority];
+	for (;;) {
+		while (!list_empty(head)) {
+			task = list_entry(head->next, struct rpc_task, tk_list);
 			task->tk_status = status;
 			__rpc_wake_up_task(task);
 		}
+		if (head == &queue->tasks[0])
+			break;
+		head--;
 	}
 	spin_unlock_bh(&rpc_queue_lock);
 }
@@ -643,21 +786,22 @@ __rpc_schedule(void)
 
 	dprintk("RPC:      rpc_schedule enter\n");
 	while (1) {
-		spin_lock_bh(&rpc_queue_lock);
 
-		task_for_first(task, &schedq.tasks) {
+		task_for_first(task, &schedq.tasks[0]) {
 			__rpc_remove_wait_queue(task);
 			spin_unlock_bh(&rpc_queue_lock);
 
 			__rpc_execute(task);
+			spin_lock_bh(&rpc_queue_lock);
 		} else {
-			spin_unlock_bh(&rpc_queue_lock);
 			break;
 		}
 
 		if (++count >= 200 || need_resched()) {
 			count = 0;
+			spin_unlock_bh(&rpc_queue_lock);
 			schedule();
+			spin_lock_bh(&rpc_queue_lock);
 		}
 	}
 	dprintk("RPC:      rpc_schedule leave\n");
@@ -709,9 +853,7 @@ rpc_free(struct rpc_task *task)
 /*
  * Creation and deletion of RPC task structures
  */
-inline void
-rpc_init_task(struct rpc_task *task, struct rpc_clnt *clnt,
-				rpc_action callback, int flags)
+void rpc_init_task(struct rpc_task *task, struct rpc_clnt *clnt, rpc_action callback, int flags)
 {
 	memset(task, 0, sizeof(*task));
 	init_timer(&task->tk_timer);
@@ -729,6 +871,10 @@ rpc_init_task(struct rpc_task *task, str
 	task->tk_cred_retry = 2;
 	task->tk_suid_retry = 1;
 
+	task->tk_priority = RPC_PRIORITY_NORMAL;
+	task->tk_cookie = (unsigned long)current;
+	INIT_LIST_HEAD(&task->tk_links);
+
 	/* Add to global list of all tasks */
 	spin_lock(&rpc_sched_lock);
 	list_add(&task->tk_task, &all_tasks);
@@ -866,7 +1012,7 @@ rpc_find_parent(struct rpc_task *child)
 	struct list_head *le;
 
 	parent = (struct rpc_task *) child->tk_calldata;
-	task_for_each(task, le, &childq.tasks)
+	task_for_each(task, le, &childq.tasks[0])
 		if (task == parent)
 			return parent;
 
@@ -946,7 +1092,7 @@ static DECLARE_MUTEX_LOCKED(rpciod_runni
 static inline int
 rpciod_task_pending(void)
 {
-	return !list_empty(&schedq.tasks);
+	return !list_empty(&schedq.tasks[0]);
 }
 
 
@@ -969,27 +1115,41 @@ rpciod(void *ptr)
 	allow_signal(SIGKILL);
 
 	dprintk("RPC: rpciod starting (pid %d)\n", rpciod_pid);
+	spin_lock_bh(&rpc_queue_lock);
 	while (rpciod_users) {
+		DEFINE_WAIT(wait);
 		if (signalled()) {
+			spin_unlock_bh(&rpc_queue_lock);
 			rpciod_killall();
 			flush_signals(current);
+			spin_lock_bh(&rpc_queue_lock);
 		}
 		__rpc_schedule();
-		if (current->flags & PF_FREEZE)
-			refrigerator(PF_IOTHREAD);
+		if (current->flags & PF_FREEZE) {
+			spin_unlock_bh(&rpc_queue_lock);
+			refrigerator(PF_FREEZE);
+			spin_lock_bh(&rpc_queue_lock);
+		}
 
 		if (++rounds >= 64) {	/* safeguard */
+			spin_unlock_bh(&rpc_queue_lock);
 			schedule();
 			rounds = 0;
+			spin_lock_bh(&rpc_queue_lock);
 		}
 
-		if (!rpciod_task_pending()) {
-			dprintk("RPC: rpciod back to sleep\n");
-			wait_event_interruptible(rpciod_idle, rpciod_task_pending());
-			dprintk("RPC: switch to rpciod\n");
+		dprintk("RPC: rpciod back to sleep\n");
+		prepare_to_wait(&rpciod_idle, &wait, TASK_INTERRUPTIBLE);
+		if (!rpciod_task_pending() && !signalled()) {
+			spin_unlock_bh(&rpc_queue_lock);
+			schedule();
 			rounds = 0;
+			spin_lock_bh(&rpc_queue_lock);
 		}
+		finish_wait(&rpciod_idle, &wait);
+		dprintk("RPC: switch to rpciod\n");
 	}
+	spin_unlock_bh(&rpc_queue_lock);
 
 	dprintk("RPC: rpciod shutdown commences\n");
 	if (!list_empty(&all_tasks)) {
@@ -1013,7 +1173,9 @@ rpciod_killall(void)
 	while (!list_empty(&all_tasks)) {
 		clear_thread_flag(TIF_SIGPENDING);
 		rpc_killall_tasks(NULL);
+		spin_lock_bh(&rpc_queue_lock);
 		__rpc_schedule();
+		spin_unlock_bh(&rpc_queue_lock);
 		if (!list_empty(&all_tasks)) {
 			dprintk("rpciod_killall: waiting for tasks to exit\n");
 			yield();
--- diff/net/sunrpc/sunrpc_syms.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/sunrpc/sunrpc_syms.c	2004-04-21 10:45:36.108214216 +0100
@@ -120,7 +120,6 @@ EXPORT_SYMBOL(svcauth_unix_purge);
 EXPORT_SYMBOL(unix_domain_find);
 
 /* Generic XDR */
-EXPORT_SYMBOL(xdr_encode_array);
 EXPORT_SYMBOL(xdr_encode_string);
 EXPORT_SYMBOL(xdr_decode_string);
 EXPORT_SYMBOL(xdr_decode_string_inplace);
@@ -129,11 +128,10 @@ EXPORT_SYMBOL(xdr_encode_netobj);
 EXPORT_SYMBOL(xdr_encode_pages);
 EXPORT_SYMBOL(xdr_inline_pages);
 EXPORT_SYMBOL(xdr_shift_buf);
-EXPORT_SYMBOL(xdr_write_pages);
-EXPORT_SYMBOL(xdr_read_pages);
 EXPORT_SYMBOL(xdr_buf_from_iov);
 EXPORT_SYMBOL(xdr_buf_subsegment);
 EXPORT_SYMBOL(xdr_buf_read_netobj);
+EXPORT_SYMBOL(read_bytes_from_xdr_buf);
 
 /* Debugging symbols */
 #ifdef RPC_DEBUG
--- diff/net/sunrpc/svcsock.c	2003-10-09 09:47:34.000000000 +0100
+++ source/net/sunrpc/svcsock.c	2004-04-21 10:45:36.109214064 +0100
@@ -591,6 +591,12 @@ svc_udp_recvfrom(struct svc_rqst *rqstp)
 		/* possibly an icmp error */
 		dprintk("svc: recvfrom returned error %d\n", -err);
 	}
+	if (skb->stamp.tv_sec == 0) {
+		skb->stamp.tv_sec = xtime.tv_sec; 
+		skb->stamp.tv_usec = xtime.tv_nsec * 1000; 
+		/* Don't enable netstamp, sunrpc doesn't 
+		   need that much accuracy */
+	}
 	svsk->sk_sk->sk_stamp = skb->stamp;
 	set_bit(SK_DATA, &svsk->sk_flags); /* there may be more data... */
 
@@ -828,21 +834,38 @@ svc_tcp_accept(struct svc_sock *svsk)
 
 	/* make sure that we don't have too many active connections.
 	 * If we have, something must be dropped.
-	 * We randomly choose between newest and oldest (in terms
-	 * of recent activity) and drop it.
+	 *
+	 * There's no point in trying to do random drop here for
+	 * DoS prevention. The NFS clients does 1 reconnect in 15
+	 * seconds. An attacker can easily beat that.
+	 *
+	 * The only somewhat efficient mechanism would be if drop
+	 * old connections from the same IP first. But right now
+	 * we don't even record the client IP in svc_sock.
 	 */
-	if (serv->sv_tmpcnt > (serv->sv_nrthreads+3)*5) {
+	if (serv->sv_tmpcnt > (serv->sv_nrthreads+3)*20) {
 		struct svc_sock *svsk = NULL;
 		spin_lock_bh(&serv->sv_lock);
 		if (!list_empty(&serv->sv_tempsocks)) {
-			if (net_random()&1)
-				svsk = list_entry(serv->sv_tempsocks.prev,
-						  struct svc_sock,
-						  sk_list);
-			else
-				svsk = list_entry(serv->sv_tempsocks.next,
-						  struct svc_sock,
-						  sk_list);
+			if (net_ratelimit()) {
+				/* Try to help the admin */
+				printk(KERN_NOTICE "%s: too many open TCP "
+					"sockets, consider increasing the "
+					"number of nfsd threads\n",
+						   serv->sv_name);
+				printk(KERN_NOTICE "%s: last TCP connect from "
+					"%u.%u.%u.%u:%d\n",
+					serv->sv_name,
+					NIPQUAD(sin.sin_addr.s_addr),
+					ntohs(sin.sin_port));
+			}
+			/*
+			 * Always select the oldest socket. It's not fair,
+			 * but so is life
+			 */
+			svsk = list_entry(serv->sv_tempsocks.prev,
+					  struct svc_sock,
+					  sk_list);
 			set_bit(SK_CLOSE, &svsk->sk_flags);
 			svsk->sk_inuse ++;
 		}
@@ -1209,7 +1232,7 @@ svc_recv(struct svc_serv *serv, struct s
 		schedule_timeout(timeout);
 
 		if (current->flags & PF_FREEZE)
-			refrigerator(PF_IOTHREAD);
+			refrigerator(PF_FREEZE);
 
 		spin_lock_bh(&serv->sv_lock);
 		remove_wait_queue(&rqstp->rq_wait, &wait);
--- diff/net/sunrpc/xdr.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/sunrpc/xdr.c	2004-04-21 10:45:36.110213912 +0100
@@ -53,16 +53,50 @@ xdr_decode_netobj(u32 *p, struct xdr_net
 	return p + XDR_QUADLEN(len);
 }
 
-u32 *
-xdr_encode_array(u32 *p, const void *array, unsigned int len)
+/**
+ * xdr_encode_opaque_fixed - Encode fixed length opaque data
+ * @p - pointer to current position in XDR buffer.
+ * @ptr - pointer to data to encode (or NULL)
+ * @nbytes - size of data.
+ *
+ * Copy the array of data of length nbytes at ptr to the XDR buffer
+ * at position p, then align to the next 32-bit boundary by padding
+ * with zero bytes (see RFC1832).
+ * Note: if ptr is NULL, only the padding is performed.
+ *
+ * Returns the updated current XDR buffer position
+ *
+ */
+u32 *xdr_encode_opaque_fixed(u32 *p, const void *ptr, unsigned int nbytes)
 {
-	int quadlen = XDR_QUADLEN(len);
-
-	p[quadlen] = 0;
-	*p++ = htonl(len);
-	memcpy(p, array, len);
-	return p + quadlen;
+	if (likely(nbytes != 0)) {
+		unsigned int quadlen = XDR_QUADLEN(nbytes);
+		unsigned int padding = (quadlen << 2) - nbytes;
+
+		if (ptr != NULL)
+			memcpy(p, ptr, nbytes);
+		if (padding != 0)
+			memset((char *)p + nbytes, 0, padding);
+		p += quadlen;
+	}
+	return p;
+}
+EXPORT_SYMBOL(xdr_encode_opaque_fixed);
+
+/**
+ * xdr_encode_opaque - Encode variable length opaque data
+ * @p - pointer to current position in XDR buffer.
+ * @ptr - pointer to data to encode (or NULL)
+ * @nbytes - size of data.
+ *
+ * Returns the updated current XDR buffer position
+ */
+u32 *xdr_encode_opaque(u32 *p, const void *ptr, unsigned int nbytes)
+{
+	*p++ = htonl(nbytes);
+	return xdr_encode_opaque_fixed(p, ptr, nbytes);
 }
+EXPORT_SYMBOL(xdr_encode_opaque);
 
 u32 *
 xdr_encode_string(u32 *p, const char *string)
@@ -126,6 +160,7 @@ xdr_encode_pages(struct xdr_buf *xdr, st
 		tail->iov_len  = pad;
 		len += pad;
 	}
+	xdr->buflen += len;
 	xdr->len += len;
 }
 
@@ -147,7 +182,7 @@ xdr_inline_pages(struct xdr_buf *xdr, un
 	tail->iov_base = buf + offset;
 	tail->iov_len = buflen - offset;
 
-	xdr->len += len;
+	xdr->buflen += len;
 }
 
 /*
@@ -641,7 +676,10 @@ xdr_shrink_bufhead(struct xdr_buf *buf, 
 				copy);
 	}
 	head->iov_len -= len;
-	buf->len -= len;
+	buf->buflen -= len;
+	/* Have we truncated the message? */
+	if (buf->len > buf->buflen)
+		buf->len = buf->buflen;
 }
 
 /*
@@ -671,7 +709,7 @@ xdr_shrink_pagelen(struct xdr_buf *buf, 
 			copy = tail->iov_len - len;
 			memmove(p, tail->iov_base, copy);
 		} else
-			buf->len -= len;
+			buf->buflen -= len;
 		/* Copy from the inlined pages into the tail */
 		copy = len;
 		if (copy > tail->iov_len)
@@ -681,7 +719,10 @@ xdr_shrink_pagelen(struct xdr_buf *buf, 
 				copy);
 	}
 	buf->page_len -= len;
-	buf->len -= len;
+	buf->buflen -= len;
+	/* Have we truncated the message? */
+	if (buf->len > buf->buflen)
+		buf->len = buf->buflen;
 }
 
 void
@@ -690,8 +731,67 @@ xdr_shift_buf(struct xdr_buf *buf, size_
 	xdr_shrink_bufhead(buf, len);
 }
 
-void
-xdr_write_pages(struct xdr_stream *xdr, struct page **pages, unsigned int base,
+/**
+ * xdr_init_encode - Initialize a struct xdr_stream for sending data.
+ * @xdr: pointer to xdr_stream struct
+ * @buf: pointer to XDR buffer in which to encode data
+ * @p: current pointer inside XDR buffer
+ *
+ * Note: at the moment the RPC client only passes the length of our
+ *	 scratch buffer in the xdr_buf's header iovec. Previously this
+ *	 meant we needed to call xdr_adjust_iovec() after encoding the
+ *	 data. With the new scheme, the xdr_stream manages the details
+ *	 of the buffer length, and takes care of adjusting the iovec
+ *	 length for us.
+ */
+void xdr_init_encode(struct xdr_stream *xdr, struct xdr_buf *buf, uint32_t *p)
+{
+	struct iovec *iov = buf->head;
+
+	xdr->buf = buf;
+	xdr->iov = iov;
+	xdr->end = (uint32_t *)((char *)iov->iov_base + iov->iov_len);
+	buf->len = iov->iov_len = (char *)p - (char *)iov->iov_base;
+	xdr->p = p;
+}
+EXPORT_SYMBOL(xdr_init_encode);
+
+/**
+ * xdr_reserve_space - Reserve buffer space for sending
+ * @xdr: pointer to xdr_stream
+ * @nbytes: number of bytes to reserve
+ *
+ * Checks that we have enough buffer space to encode 'nbytes' more
+ * bytes of data. If so, update the total xdr_buf length, and
+ * adjust the length of the current iovec.
+ */
+uint32_t * xdr_reserve_space(struct xdr_stream *xdr, size_t nbytes)
+{
+	uint32_t *p = xdr->p;
+	uint32_t *q;
+
+	/* align nbytes on the next 32-bit boundary */
+	nbytes += 3;
+	nbytes &= ~3;
+	q = p + (nbytes >> 2);
+	if (unlikely(q > xdr->end || q < p))
+		return NULL;
+	xdr->p = q;
+	xdr->iov->iov_len += nbytes;
+	xdr->buf->len += nbytes;
+	return p;
+}
+EXPORT_SYMBOL(xdr_reserve_space);
+
+/**
+ * xdr_write_pages - Insert a list of pages into an XDR buffer for sending
+ * @xdr: pointer to xdr_stream
+ * @pages: list of pages
+ * @base: offset of first byte
+ * @len: length of data in bytes
+ *
+ */
+void xdr_write_pages(struct xdr_stream *xdr, struct page **pages, unsigned int base,
 		 unsigned int len)
 {
 	struct xdr_buf *buf = xdr->buf;
@@ -713,15 +813,69 @@ xdr_write_pages(struct xdr_stream *xdr, 
 		len += pad;
 		*xdr->p++ = 0;
 	}
+	buf->buflen += len;
 	buf->len += len;
 }
+EXPORT_SYMBOL(xdr_write_pages);
 
-void
-xdr_read_pages(struct xdr_stream *xdr, unsigned int len)
+/**
+ * xdr_init_decode - Initialize an xdr_stream for decoding data.
+ * @xdr: pointer to xdr_stream struct
+ * @buf: pointer to XDR buffer from which to decode data
+ * @p: current pointer inside XDR buffer
+ */
+void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, uint32_t *p)
+{
+	struct iovec *iov = buf->head;
+	unsigned int len = iov->iov_len;
+
+	if (len > buf->len)
+		len = buf->len;
+	xdr->buf = buf;
+	xdr->iov = iov;
+	xdr->p = p;
+	xdr->end = (uint32_t *)((char *)iov->iov_base + len);
+}
+EXPORT_SYMBOL(xdr_init_decode);
+
+/**
+ * xdr_inline_decode - Retrieve non-page XDR data to decode
+ * @xdr: pointer to xdr_stream struct
+ * @nbytes: number of bytes of data to decode
+ *
+ * Check if the input buffer is long enough to enable us to decode
+ * 'nbytes' more bytes of data starting at the current position.
+ * If so return the current pointer, then update the current
+ * pointer position.
+ */
+uint32_t * xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes)
+{
+	uint32_t *p = xdr->p;
+	uint32_t *q = p + XDR_QUADLEN(nbytes);
+
+	if (unlikely(q > xdr->end || q < p))
+		return NULL;
+	xdr->p = q;
+	return p;
+}
+EXPORT_SYMBOL(xdr_inline_decode);
+
+/**
+ * xdr_read_pages - Ensure page-based XDR data to decode is aligned at current pointer position
+ * @xdr: pointer to xdr_stream struct
+ * @len: number of bytes of page data
+ *
+ * Moves data beyond the current pointer position from the XDR head[] buffer
+ * into the page list. Any data that lies beyond current position + "len"
+ * bytes is moved into the XDR tail[]. The current pointer is then
+ * repositioned at the beginning of the XDR tail.
+ */
+void xdr_read_pages(struct xdr_stream *xdr, unsigned int len)
 {
 	struct xdr_buf *buf = xdr->buf;
 	struct iovec *iov;
 	ssize_t shift;
+	unsigned int end;
 	int padding;
 
 	/* Realign pages to current pointer position */
@@ -735,9 +889,21 @@ xdr_read_pages(struct xdr_stream *xdr, u
 		xdr_shrink_pagelen(buf, buf->page_len - len);
 	padding = (XDR_QUADLEN(len) << 2) - len;
 	xdr->iov = iov = buf->tail;
+	/* Compute remaining message length.  */
+	end = iov->iov_len;
+	shift = buf->buflen - buf->len;
+	if (shift < end)
+		end -= shift;
+	else if (shift > 0)
+		end = 0;
+	/*
+	 * Position current pointer at beginning of tail, and
+	 * set remaining message length.
+	 */
 	xdr->p = (uint32_t *)((char *)iov->iov_base + padding);
-	xdr->end = (uint32_t *)((char *)iov->iov_base + iov->iov_len);
+	xdr->end = (uint32_t *)((char *)iov->iov_base + end);
 }
+EXPORT_SYMBOL(xdr_read_pages);
 
 static struct iovec empty_iov = {.iov_base = NULL, .iov_len = 0};
 
@@ -747,7 +913,7 @@ xdr_buf_from_iov(struct iovec *iov, stru
 	buf->head[0] = *iov;
 	buf->tail[0] = empty_iov;
 	buf->page_len = 0;
-	buf->len = iov->iov_len;
+	buf->buflen = buf->len = iov->iov_len;
 }
 
 /* Sets subiov to the intersection of iov with the buffer of length len
@@ -777,7 +943,7 @@ xdr_buf_subsegment(struct xdr_buf *buf, 
 {
 	int i;
 
-	subbuf->len = len;
+	subbuf->buflen = subbuf->len = len;
 	iov_subsegment(buf->head, subbuf->head, &base, &len);
 
 	if (base < buf->page_len) {
@@ -799,7 +965,7 @@ xdr_buf_subsegment(struct xdr_buf *buf, 
 }
 
 /* obj is assumed to point to allocated memory of size at least len: */
-static int
+int
 read_bytes_from_xdr_buf(struct xdr_buf *buf, int base, void *obj, int len)
 {
 	struct xdr_buf subbuf;
--- diff/net/sunrpc/xprt.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/sunrpc/xprt.c	2004-04-21 10:45:36.111213760 +0100
@@ -405,7 +405,6 @@ xprt_close(struct rpc_xprt *xprt)
 	sk->sk_write_space  = xprt->old_write_space;
 	write_unlock_bh(&sk->sk_callback_lock);
 
-	xprt_disconnect(xprt);
 	sk->sk_no_check	 = 0;
 
 	sock_release(sock);
@@ -416,6 +415,7 @@ xprt_socket_autoclose(void *args)
 {
 	struct rpc_xprt *xprt = (struct rpc_xprt *)args;
 
+	xprt_disconnect(xprt);
 	xprt_close(xprt);
 	xprt_release_write(xprt, NULL);
 }
@@ -448,7 +448,10 @@ xprt_init_autodisconnect(unsigned long d
 		goto out_abort;
 	spin_unlock(&xprt->sock_lock);
 	/* Let keventd close the socket */
-	schedule_work(&xprt->task_cleanup);
+	if (test_bit(XPRT_CONNECTING, &xprt->sockstate) != 0)
+		xprt_release_write(xprt, NULL);
+	else
+		schedule_work(&xprt->task_cleanup);
 	return;
 out_abort:
 	spin_unlock(&xprt->sock_lock);
@@ -460,12 +463,8 @@ static void xprt_socket_connect(void *ar
 	struct socket *sock = xprt->sock;
 	int status = -EIO;
 
-	if (xprt->shutdown) {
-		rpc_wake_up_status(&xprt->pending, -EIO);
-		return;
-	}
-	if (!xprt->addr.sin_port)
-		goto out_err;
+	if (xprt->shutdown || xprt->addr.sin_port == 0)
+		goto out;
 
 	/*
 	 * Start by resetting any existing state
@@ -475,12 +474,12 @@ static void xprt_socket_connect(void *ar
 	if (sock == NULL) {
 		/* couldn't create socket or bind to reserved port;
 		 * this is likely a permanent error, so cause an abort */
-		goto out_err;
-		return;
+		goto out;
 	}
 	xprt_bind_socket(xprt, sock);
 	xprt_sock_setbufsize(xprt);
 
+	status = 0;
 	if (!xprt->stream)
 		goto out;
 
@@ -491,28 +490,22 @@ static void xprt_socket_connect(void *ar
 			sizeof(xprt->addr), O_NONBLOCK);
 	dprintk("RPC: %p  connect status %d connected %d sock state %d\n",
 			xprt, -status, xprt_connected(xprt), sock->sk->sk_state);
-	if (status >= 0)
-		goto out;
-	switch (status) {
-		case -EINPROGRESS:
-		case -EALREADY:
-			return;
-		default:
-			goto out_err;
+	if (status < 0) {
+		switch (status) {
+			case -EINPROGRESS:
+			case -EALREADY:
+				goto out_clear;
+		}
 	}
 out:
-	spin_lock_bh(&xprt->sock_lock);
-	if (xprt->snd_task)
-		rpc_wake_up_task(xprt->snd_task);
-	spin_unlock_bh(&xprt->sock_lock);
-	return;
-out_err:
-	spin_lock_bh(&xprt->sock_lock);
-	if (xprt->snd_task) {
-		xprt->snd_task->tk_status = status;
-		rpc_wake_up_task(xprt->snd_task);
-	}
-	spin_unlock_bh(&xprt->sock_lock);
+	if (status < 0)
+		rpc_wake_up_status(&xprt->pending, status);
+	else
+		rpc_wake_up(&xprt->pending);
+out_clear:
+	smp_mb__before_clear_bit();
+	clear_bit(XPRT_CONNECTING, &xprt->sockstate);
+	smp_mb__after_clear_bit();
 }
 
 /*
@@ -544,7 +537,8 @@ void xprt_connect(struct rpc_task *task)
 
 	task->tk_timeout = RPC_CONNECT_TIMEOUT;
 	rpc_sleep_on(&xprt->pending, task, xprt_connect_status, NULL);
-	schedule_work(&xprt->sock_connect);
+	if (!test_and_set_bit(XPRT_CONNECTING, &xprt->sockstate))
+		schedule_work(&xprt->sock_connect);
 	return;
  out_write:
 	xprt_release_write(xprt, task);
@@ -647,8 +641,8 @@ xprt_complete_rqst(struct rpc_xprt *xprt
 #endif
 
 	dprintk("RPC: %4d has input (%d bytes)\n", task->tk_pid, copied);
-	req->rq_received = copied;
 	list_del_init(&req->rq_list);
+	req->rq_received = req->rq_private_buf.len = copied;
 
 	/* ... and wake up the process. */
 	rpc_wake_up_task(task);
@@ -765,7 +759,7 @@ udp_data_ready(struct sock *sk, int len)
 
 	dprintk("RPC: %4d received reply\n", task->tk_pid);
 
-	if ((copied = rovr->rq_private_buf.len) > repsize)
+	if ((copied = rovr->rq_private_buf.buflen) > repsize)
 		copied = repsize;
 
 	/* Suck it into the iovec, verify checksum if not done by hw. */
@@ -782,8 +776,6 @@ udp_data_ready(struct sock *sk, int len)
  dropit:
 	skb_free_datagram(sk, skb);
  out:
-	if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
-		wake_up_interruptible(sk->sk_sleep);
 	read_unlock(&sk->sk_callback_lock);
 }
 
@@ -910,7 +902,7 @@ tcp_read_request(struct rpc_xprt *xprt, 
 	xprt->tcp_copied += len;
 	xprt->tcp_offset += len;
 
-	if (xprt->tcp_copied == req->rq_private_buf.len)
+	if (xprt->tcp_copied == req->rq_private_buf.buflen)
 		xprt->tcp_flags &= ~XPRT_COPY_DATA;
 	else if (xprt->tcp_offset == xprt->tcp_reclen) {
 		if (xprt->tcp_flags & XPRT_LAST_FRAG)
@@ -1028,9 +1020,6 @@ tcp_state_change(struct sock *sk)
 			xprt->tcp_reclen = 0;
 			xprt->tcp_copied = 0;
 			xprt->tcp_flags = XPRT_COPY_RECM | XPRT_COPY_XID;
-
-			if (xprt->snd_task)
-				rpc_wake_up_task(xprt->snd_task);
 			rpc_wake_up(&xprt->pending);
 		}
 		spin_unlock_bh(&xprt->sock_lock);
@@ -1039,12 +1028,11 @@ tcp_state_change(struct sock *sk)
 	case TCP_SYN_RECV:
 		break;
 	default:
-		xprt_disconnect(xprt);
+		if (xprt_test_and_clear_connected(xprt))
+			rpc_wake_up_status(&xprt->pending, -ENOTCONN);
 		break;
 	}
  out:
-	if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
-		wake_up_interruptible_all(sk->sk_sleep);
 	read_unlock(&sk->sk_callback_lock);
 }
 
@@ -1084,8 +1072,6 @@ xprt_write_space(struct sock *sk)
 	if (xprt->snd_task && xprt->snd_task->tk_rpcwait == &xprt->pending)
 		rpc_wake_up_task(xprt->snd_task);
 	spin_unlock_bh(&xprt->sock_lock);
-	if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
-		wake_up_interruptible(sk->sk_sleep);
 out:
 	read_unlock(&sk->sk_callback_lock);
 }
@@ -1464,10 +1450,10 @@ xprt_setup(int proto, struct sockaddr_in
 	} else
 		xprt_default_timeout(&xprt->timeout, xprt->prot);
 
-	INIT_RPC_WAITQ(&xprt->pending, "xprt_pending");
-	INIT_RPC_WAITQ(&xprt->sending, "xprt_sending");
-	INIT_RPC_WAITQ(&xprt->resend, "xprt_resend");
-	INIT_RPC_WAITQ(&xprt->backlog, "xprt_backlog");
+	rpc_init_wait_queue(&xprt->pending, "xprt_pending");
+	rpc_init_wait_queue(&xprt->sending, "xprt_sending");
+	rpc_init_wait_queue(&xprt->resend, "xprt_resend");
+	rpc_init_priority_wait_queue(&xprt->backlog, "xprt_backlog");
 
 	/* initialize free list */
 	for (req = &xprt->slot[entries-1]; req >= &xprt->slot[0]; req--)
@@ -1626,8 +1612,7 @@ xprt_shutdown(struct rpc_xprt *xprt)
 	rpc_wake_up(&xprt->resend);
 	rpc_wake_up(&xprt->pending);
 	rpc_wake_up(&xprt->backlog);
-	if (waitqueue_active(&xprt->cong_wait))
-		wake_up(&xprt->cong_wait);
+	wake_up(&xprt->cong_wait);
 	del_timer_sync(&xprt->timer);
 }
 
@@ -1637,8 +1622,7 @@ xprt_shutdown(struct rpc_xprt *xprt)
 int
 xprt_clear_backlog(struct rpc_xprt *xprt) {
 	rpc_wake_up_next(&xprt->backlog);
-	if (waitqueue_active(&xprt->cong_wait))
-		wake_up(&xprt->cong_wait);
+	wake_up(&xprt->cong_wait);
 	return 1;
 }
 
@@ -1650,6 +1634,7 @@ xprt_destroy(struct rpc_xprt *xprt)
 {
 	dprintk("RPC:      destroying transport %p\n", xprt);
 	xprt_shutdown(xprt);
+	xprt_disconnect(xprt);
 	xprt_close(xprt);
 	kfree(xprt->slot);
 	kfree(xprt);
--- diff/net/unix/af_unix.c	2004-04-05 12:57:08.000000000 +0100
+++ source/net/unix/af_unix.c	2004-04-21 10:45:36.112213608 +0100
@@ -82,8 +82,6 @@
  *		  with BSD names.
  */
 
-#undef unix	/* KBUILD_MODNAME */
-
 #include <linux/module.h>
 #include <linux/config.h>
 #include <linux/kernel.h>
--- diff/net/wanrouter/af_wanpipe.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/wanrouter/af_wanpipe.c	2004-04-21 10:45:36.113213456 +0100
@@ -1765,13 +1765,7 @@ static int wanpipe_ioctl(struct socket *
 	switch(cmd) 
 	{
 		case SIOCGSTAMP:
-			if (!sk->sk_stamp.tv_sec)
-				return -ENOENT;
-			err = -EFAULT;
-			if (!copy_to_user((void *)arg, &sk->sk_stamp,
-			    sizeof(struct timeval)))
-				err = 0;
-			return err;
+			return sock_get_timestamp(sk, (struct timeval *)arg);
 
 		case SIOC_WANPIPE_CHECK_TX:
 
--- diff/net/x25/af_x25.c	2004-02-18 08:54:13.000000000 +0000
+++ source/net/x25/af_x25.c	2004-04-21 10:45:36.114213304 +0100
@@ -1206,14 +1206,10 @@ static int x25_ioctl(struct socket *sock
 		}
 
 		case SIOCGSTAMP:
-			if (sk) {
-				rc = -ENOENT;
-				if (!sk->sk_stamp.tv_sec)
-					break;
-				rc = copy_to_user((void *)arg, &sk->sk_stamp,
-						  sizeof(struct timeval)) ? -EFAULT : 0;
-			}
 			rc = -EINVAL;
+			if (sk)
+				rc = sock_get_timestamp(sk, 
+						(struct timeval *)arg); 
 			break;
 		case SIOCGIFADDR:
 		case SIOCSIFADDR:
--- diff/scripts/Makefile.modinst	2004-03-11 10:20:29.000000000 +0000
+++ source/scripts/Makefile.modinst	2004-04-21 10:45:36.115213152 +0100
@@ -12,10 +12,6 @@ include scripts/Makefile.lib
 __modules := $(shell head -q -n1 /dev/null $(wildcard $(MODVERDIR)/*.mod))
 modules := $(patsubst %.o,%.ko,$(wildcard $(__modules:.ko=.o)))
 
-ifneq ($(filter-out $(modules),$(__modules)),)
-  $(warning *** Uh-oh, you have stale module entries. You messed with SUBDIRS, do not complain if something goes wrong.)
-endif
-
 .PHONY: $(modules)
 __modinst: $(modules)
 	@:
--- diff/scripts/Makefile.modpost	2004-04-05 12:57:08.000000000 +0100
+++ source/scripts/Makefile.modpost	2004-04-21 10:45:36.115213152 +0100
@@ -13,12 +13,6 @@ include scripts/Makefile.lib
 __modules := $(shell head -q -n1 /dev/null $(wildcard $(MODVERDIR)/*.mod))
 modules := $(patsubst %.o,%.ko,$(wildcard $(__modules:.ko=.o)))
 
-ifneq ($(filter-out $(modules),$(__modules)),)
-  $(warning Trouble: $(filter-out $(modules),$(__modules)))
-  $(warning *** Uh-oh, you have stale module entries. You messed with SUBDIRS,)
-  $(warning     do not complain if something goes wrong.)
-endif
-
 __modversions: $(modules)
 	@:
 
@@ -35,6 +29,8 @@ targets += $(modules)
 
 # Compile version info for unresolved symbols
 
+modname = $(*F)
+
 quiet_cmd_cc_o_c = CC      $@
       cmd_cc_o_c = $(CC) $(c_flags) $(CFLAGS_MODULE)	\
 		   -c -o $@ $<
@@ -53,9 +49,11 @@ $(modules:.ko=.mod.c): __modpost ;
 # Extract all checksums for all exported symbols
 
 quiet_cmd_modpost = MODPOST
-      cmd_modpost = scripts/modpost $(filter-out FORCE,$^)
+      cmd_modpost = scripts/modpost \
+	$(if $(filter vmlinux,$^),-o,-i) $(objtree)/Module.symvers \
+	$(filter-out FORCE,$^)
 
-__modpost: $(wildcard vmlinux) $(modules:.ko=.o) FORCE
+__modpost: $(if $(KBUILD_EXTMOD),,$(wildcard vmlinux)) $(modules:.ko=.o) FORCE
 	$(call if_changed,modpost)
 
 targets += __modpost
--- diff/scripts/genksyms/parse.y	2003-05-21 11:49:46.000000000 +0100
+++ source/scripts/genksyms/parse.y	2004-04-21 10:45:36.116213000 +0100
@@ -197,7 +197,7 @@ storage_class_specifier:
 type_specifier:
 	simple_type_specifier
 	| cvar_qualifier
-	| TYPEOF_KEYW '(' type_specifier ')'
+	| TYPEOF_KEYW '(' decl_specifier_seq ')'
 
 	/* References to s/u/e's defined elsewhere.  Rearrange things
 	   so that it is easier to expand the definition fully later.  */
--- diff/scripts/kernel-doc	2003-06-30 10:07:24.000000000 +0100
+++ source/scripts/kernel-doc	2004-04-21 10:45:36.117212848 +0100
@@ -1376,6 +1376,7 @@ sub dump_function($$) {
     $prototype =~ s/^inline +//;
     $prototype =~ s/^__inline__ +//;
     $prototype =~ s/^#define +//; #ak added
+    $prototype =~ s/__attribute__ \(\([a-z,]*\)\)//;
 
     # Yes, this truly is vile.  We are looking for:
     # 1. Return type (may be nothing if we're looking at a macro)
--- diff/scripts/modpost.c	2004-04-05 12:57:08.000000000 +0100
+++ source/scripts/modpost.c	2004-04-21 10:45:36.117212848 +0100
@@ -16,7 +16,7 @@
 
 /* Are we using CONFIG_MODVERSIONS? */
 int modversions = 0;
-/* Do we have vmlinux? */
+/* Warn about undefined symbols? (do so if we have vmlinux) */
 int have_vmlinux = 0;
 
 void
@@ -59,6 +59,17 @@ void *do_nofail(void *ptr, const char *f
 static struct module *modules;
 
 struct module *
+find_module(char *modname)
+{
+	struct module *mod;
+
+	for (mod = modules; mod; mod = mod->next)
+		if (strcmp(mod->name, modname) == 0)
+			break;
+	return mod;
+}
+
+struct module *
 new_module(char *modname)
 {
 	struct module *mod;
@@ -113,12 +124,13 @@ static inline unsigned int tdb_hash(cons
  * the list of unresolved symbols per module */
 
 struct symbol *
-alloc_symbol(const char *name)
+alloc_symbol(const char *name, struct symbol *next)
 {
 	struct symbol *s = NOFAIL(malloc(sizeof(*s) + strlen(name) + 1));
 
 	memset(s, 0, sizeof(*s));
 	strcpy(s->name, name);
+	s->next = next;
 	return s;
 }
 
@@ -128,17 +140,15 @@ void
 new_symbol(const char *name, struct module *module, unsigned int *crc)
 {
 	unsigned int hash;
-	struct symbol *new = alloc_symbol(name);
+	struct symbol *new;
 
+	hash = tdb_hash(name) % SYMBOL_HASH_SIZE;
+	new = symbolhash[hash] = alloc_symbol(name, symbolhash[hash]);
 	new->module = module;
 	if (crc) {
 		new->crc = *crc;
 		new->crc_valid = 1;
 	}
-
-	hash = tdb_hash(name) % SYMBOL_HASH_SIZE;
-	new->next = symbolhash[hash];
-	symbolhash[hash] = new;
 }
 
 struct symbol *
@@ -165,7 +175,7 @@ add_exported_symbol(const char *name, st
 	struct symbol *s = find_symbol(name);
 
 	if (!s) {
-		new_symbol(name, modules, crc);
+		new_symbol(name, module, crc);
 		return;
 	}
 	if (crc) {
@@ -182,7 +192,7 @@ grab_file(const char *filename, unsigned
 	int fd;
 
 	fd = open(filename, O_RDONLY);
-	if (fstat(fd, &st) != 0)
+	if (fd < 0 || fstat(fd, &st) != 0)
 		return NULL;
 
 	*size = st.st_size;
@@ -319,7 +329,6 @@ void
 handle_modversions(struct module *mod, struct elf_info *info,
 		   Elf_Sym *sym, const char *symname)
 {
-	struct symbol *s;
 	unsigned int crc;
 
 	switch (sym->st_shndx) {
@@ -343,6 +352,9 @@ handle_modversions(struct module *mod, s
 		/* ignore global offset table */
 		if (strcmp(symname, "_GLOBAL_OFFSET_TABLE_") == 0)
 			break;
+		/* ignore __this_module, it will be resolved shortly */
+		if (strcmp(symname, MODULE_SYMBOL_PREFIX "__this_module") == 0)
+			break;
 #ifdef STT_REGISTER
 		if (info->hdr->e_machine == EM_SPARC ||
 		    info->hdr->e_machine == EM_SPARCV9) {
@@ -353,13 +365,10 @@ handle_modversions(struct module *mod, s
 #endif
 		
 		if (memcmp(symname, MODULE_SYMBOL_PREFIX,
-			   strlen(MODULE_SYMBOL_PREFIX)) == 0) {
-			s = alloc_symbol(symname + 
-					 strlen(MODULE_SYMBOL_PREFIX));
-			/* add to list */
-			s->next = mod->unres;
-			mod->unres = s;
-		}
+			   strlen(MODULE_SYMBOL_PREFIX)) == 0)
+			mod->unres = alloc_symbol(symname +
+						  strlen(MODULE_SYMBOL_PREFIX),
+						  mod->unres);
 		break;
 	default:
 		/* All exported symbols */
@@ -390,17 +399,24 @@ read_symbols(char *modname)
 	const char *symname;
 	struct module *mod;
 	struct elf_info info = { };
-	struct symbol *s;
 	Elf_Sym *sym;
 
-	/* When there's no vmlinux, don't print warnings about
-	 * unresolved symbols (since there'll be too many ;) */
-	have_vmlinux = is_vmlinux(modname);
-
 	parse_elf(&info, modname);
 
 	mod = new_module(modname);
 
+	/* When there's no vmlinux, don't print warnings about
+	 * unresolved symbols (since there'll be too many ;) */
+	if (is_vmlinux(modname)) {
+		unsigned int fake_crc = 0;
+		have_vmlinux = 1;
+		/* May not have this if !CONFIG_MODULE_UNLOAD: fake it.
+		   If it appears, we'll get the real CRC. */
+		add_exported_symbol("cleanup_module", mod, &fake_crc);
+		add_exported_symbol("struct_module", mod, &fake_crc);
+		mod->skip = 1;
+	}
+
 	for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
 		symname = info.strtab + sym->st_name;
 
@@ -416,10 +432,12 @@ read_symbols(char *modname)
 	 * the automatic versioning doesn't pick it up, but it's really
 	 * important anyhow */
 	if (modversions) {
-		s = alloc_symbol("struct_module");
-		/* add to list */
-		s->next = mod->unres;
-		mod->unres = s;
+		mod->unres = alloc_symbol("struct_module", mod->unres);
+
+		/* Always version init_module and cleanup_module, in
+		 * case module doesn't have its own. */
+		mod->unres = alloc_symbol("init_module", mod->unres);
+		mod->unres = alloc_symbol("cleanup_module", mod->unres);
 	}
 }
 
@@ -468,6 +486,16 @@ add_header(struct buffer *b)
 	buf_printf(b, "#include <linux/compiler.h>\n");
 	buf_printf(b, "\n");
 	buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n");
+	buf_printf(b, "\n");
+	buf_printf(b, "#undef unix\n"); /* We have a module called "unix" */
+	buf_printf(b, "struct module __this_module\n");
+	buf_printf(b, "__attribute__((section(\".gnu.linkonce.this_module\"))) = {\n");
+	buf_printf(b, " .name = __stringify(KBUILD_MODNAME),\n");
+	buf_printf(b, " .init = init_module,\n");
+	buf_printf(b, "#ifdef CONFIG_MODULE_UNLOAD\n");
+	buf_printf(b, " .exit = cleanup_module,\n");
+	buf_printf(b, "#endif\n");
+	buf_printf(b, "};\n");
 }
 
 /* Record CRCs for unresolved symbols */
@@ -590,19 +618,106 @@ write_if_changed(struct buffer *b, const
 	fclose(file);
 }
 
+void
+read_dump(const char *fname)
+{
+	unsigned long size, pos = 0;
+	void *file = grab_file(fname, &size);
+	char *line;
+
+        if (!file) {
+                perror(fname);
+                abort();
+        }
+
+	while ((line = get_next_line(&pos, file, size))) {
+		char *symname, *modname, *d;
+		unsigned int crc;
+		struct module *mod;
+
+		if (!(symname = strchr(line, '\t')))
+			goto fail;
+		*symname++ = '\0';
+		if (!(modname = strchr(symname, '\t')))
+			goto fail;
+		*modname++ = '\0';
+		if (strchr(modname, '\t'))
+			goto fail;
+		crc = strtoul(line, &d, 16);
+		if (*symname == '\0' || *modname == '\0' || *d != '\0')
+			goto fail;
+
+		if (!(mod = find_module(modname))) {
+			if (is_vmlinux(modname)) {
+				modversions = 1;
+				have_vmlinux = 1;
+			}
+			mod = new_module(NOFAIL(strdup(modname)));
+			mod->skip = 1;
+		}
+		add_exported_symbol(symname, mod, &crc);
+	}
+	return;
+fail:
+	fatal("parse error in symbol dump file\n");
+}
+
+void
+write_dump(const char *fname)
+{
+	struct buffer buf = { };
+	struct symbol *symbol;
+	int n;
+
+	for (n = 0; n < SYMBOL_HASH_SIZE ; n++) {
+		symbol = symbolhash[n];
+		while (symbol) {
+			symbol = symbol->next;
+		}
+	}
+
+	for (n = 0; n < SYMBOL_HASH_SIZE ; n++) {
+		symbol = symbolhash[n];
+		while (symbol) {
+			buf_printf(&buf, "0x%08x\t%s\t%s\n", symbol->crc,
+				symbol->name, symbol->module->name);
+			symbol = symbol->next;
+		}
+	}
+	write_if_changed(&buf, fname);
+}
+
 int
 main(int argc, char **argv)
 {
 	struct module *mod;
 	struct buffer buf = { };
 	char fname[SZ];
+	char *dump_read = NULL, *dump_write = NULL;
+	int opt;
+
+	while ((opt = getopt(argc, argv, "i:o:")) != -1) {
+		switch(opt) {
+			case 'i':
+				dump_read = optarg;
+				break;
+			case 'o':
+				dump_write = optarg;
+				break;
+			default:
+				exit(1);
+		}
+	}
 
-	for (; argv[1]; argv++) {
-		read_symbols(argv[1]);
+	if (dump_read)
+		read_dump(dump_read);
+
+	while (optind < argc) {
+		read_symbols(argv[optind++]);
 	}
 
 	for (mod = modules; mod; mod = mod->next) {
-		if (is_vmlinux(mod->name))
+		if (mod->skip)
 			continue;
 
 		buf.pos = 0;
@@ -615,6 +730,10 @@ main(int argc, char **argv)
 		sprintf(fname, "%s.mod.c", mod->name);
 		write_if_changed(&buf, fname);
 	}
+
+	if (dump_write)
+		write_dump(dump_write);
+
 	return 0;
 }
 
--- diff/scripts/modpost.h	2004-04-05 12:57:08.000000000 +0100
+++ source/scripts/modpost.h	2004-04-21 10:45:36.118212696 +0100
@@ -73,6 +73,7 @@ struct module {
 	const char *name;
 	struct symbol *unres;
 	int seen;
+	int skip;
 	struct buffer dev_table_buf;
 };
 
--- diff/scripts/ver_linux	2004-04-05 12:57:08.000000000 +0100
+++ source/scripts/ver_linux	2004-04-21 10:45:36.118212696 +0100
@@ -68,7 +68,8 @@ ldd -v > /dev/null 2>&1 && ldd -v || ldd
 ls -l /usr/lib/lib{g,stdc}++.so  2>/dev/null | awk -F. \
        '{print "Linux C++ Library      " $4"."$5"."$6}'
 
-ps --version 2>&1 | awk 'NR==1{print "Procps                ", $NF}'
+ps --version 2>&1 | grep version | awk \
+'NR==1{print "Procps                ", $NF}'
 
 ifconfig --version 2>&1 | grep tools | awk \
 'NR==1{print "Net-tools             ", $NF}'
--- diff/security/selinux/Kconfig	2003-09-30 15:46:21.000000000 +0100
+++ source/security/selinux/Kconfig	2004-04-21 10:45:36.118212696 +0100
@@ -7,7 +7,7 @@ config SECURITY_SELINUX
 	  You will also need a policy configuration and a labeled filesystem.
 	  You can obtain the policy compiler (checkpolicy), the utility for
 	  labeling filesystems (setfiles), and an example policy configuration
-	  from http://www.nsa.gov/selinux.
+	  from <http://www.nsa.gov/selinux/>.
 	  If you are unsure how to answer this question, answer N.
 
 config SECURITY_SELINUX_BOOTPARAM
--- diff/security/selinux/avc.c	2004-02-18 08:54:13.000000000 +0000
+++ source/security/selinux/avc.c	2004-04-21 10:45:36.120212392 +0100
@@ -22,9 +22,14 @@
 #include <linux/un.h>
 #include <net/af_unix.h>
 #include <linux/ip.h>
+#include <linux/audit.h>
+#include <linux/ipv6.h>
+#include <net/ipv6.h>
 #include "avc.h"
 #include "avc_ss.h"
+#ifdef CONFIG_AUDIT
 #include "class_to_string.h"
+#endif
 #include "common_perm_to_string.h"
 #include "av_inherit.h"
 #include "av_perm_to_string.h"
@@ -66,14 +71,10 @@ struct avc_callback_node {
 };
 
 static spinlock_t avc_lock = SPIN_LOCK_UNLOCKED;
-static spinlock_t avc_log_lock = SPIN_LOCK_UNLOCKED;
 static struct avc_node *avc_node_freelist = NULL;
 static struct avc_cache avc_cache;
-static char *avc_audit_buffer = NULL;
 static unsigned avc_cache_stats[AVC_NSTATS];
 static struct avc_callback_node *avc_callbacks = NULL;
-static unsigned int avc_log_level = 4; /* default:  KERN_WARNING */
-static char avc_level_string[4] = "< >";
 
 static inline int avc_hash(u32 ssid, u32 tsid, u16 tclass)
 {
@@ -85,14 +86,14 @@ static inline int avc_hash(u32 ssid, u32
  * @tclass: target security class
  * @av: access vector
  */
-void avc_dump_av(u16 tclass, u32 av)
+void avc_dump_av(struct audit_buffer *ab, u16 tclass, u32 av)
 {
 	char **common_pts = 0;
 	u32 common_base = 0;
 	int i, i2, perm;
 
 	if (av == 0) {
-		printk(" null");
+		audit_log_format(ab, " null");
 		return;
 	}
 
@@ -104,12 +105,12 @@ void avc_dump_av(u16 tclass, u32 av)
 		}
 	}
 
-	printk(" {");
+	audit_log_format(ab, " {");
 	i = 0;
 	perm = 1;
 	while (perm < common_base) {
 		if (perm & av)
-			printk(" %s", common_pts[i]);
+			audit_log_format(ab, " %s", common_pts[i]);
 		i++;
 		perm <<= 1;
 	}
@@ -122,13 +123,14 @@ void avc_dump_av(u16 tclass, u32 av)
 					break;
 			}
 			if (i2 < ARRAY_SIZE(av_perm_to_string))
-				printk(" %s", av_perm_to_string[i2].name);
+				audit_log_format(ab, " %s",
+						 av_perm_to_string[i2].name);
 		}
 		i++;
 		perm <<= 1;
 	}
 
-	printk(" }");
+	audit_log_format(ab, " }");
 }
 
 /**
@@ -137,7 +139,7 @@ void avc_dump_av(u16 tclass, u32 av)
  * @tsid: target security identifier
  * @tclass: target security class
  */
-void avc_dump_query(u32 ssid, u32 tsid, u16 tclass)
+void avc_dump_query(struct audit_buffer *ab, u32 ssid, u32 tsid, u16 tclass)
 {
 	int rc;
 	char *scontext;
@@ -145,20 +147,20 @@ void avc_dump_query(u32 ssid, u32 tsid, 
 
  	rc = security_sid_to_context(ssid, &scontext, &scontext_len);
 	if (rc)
-		printk("ssid=%d", ssid);
+		audit_log_format(ab, "ssid=%d", ssid);
 	else {
-		printk("scontext=%s", scontext);
+		audit_log_format(ab, "scontext=%s", scontext);
 		kfree(scontext);
 	}
 
 	rc = security_sid_to_context(tsid, &scontext, &scontext_len);
 	if (rc)
-		printk(" tsid=%d", tsid);
+		audit_log_format(ab, " tsid=%d", tsid);
 	else {
-		printk(" tcontext=%s", scontext);
+		audit_log_format(ab, " tcontext=%s", scontext);
 		kfree(scontext);
 	}
-	printk(" tclass=%s", class_to_string[tclass]);
+	audit_log_format(ab, " tclass=%s", class_to_string[tclass]);
 }
 
 /**
@@ -192,11 +194,7 @@ void __init avc_init(void)
 		avc_node_freelist = new;
 	}
 
-	avc_audit_buffer = (char *)__get_free_page(GFP_ATOMIC);
-	if (!avc_audit_buffer)
-		panic("AVC:  unable to allocate audit buffer\n");
-
-	avc_level_string[1] = '0' + avc_log_level;
+	audit_log(current->audit_context, "AVC INITIALIZED\n");
 }
 
 #if 0
@@ -418,64 +416,24 @@ out:
 	return rc;
 }
 
-static inline void avc_print_ipv4_addr(u32 addr, u16 port, char *name1, char *name2)
-{
-	if (addr)
-		printk(" %s=%d.%d.%d.%d", name1, NIPQUAD(addr));
+static inline void avc_print_ipv6_addr(struct audit_buffer *ab,
+				       struct in6_addr *addr, u16 port,
+				       char *name1, char *name2)
+{
+	if (!ipv6_addr_any(addr))
+		audit_log_format(ab, " %s=%04x:%04x:%04x:%04x:%04x:"
+				 "%04x:%04x:%04x", name1, NIP6(*addr));
 	if (port)
-		printk(" %s=%d", name2, ntohs(port));
+		audit_log_format(ab, " %s=%d", name2, ntohs(port));
 }
 
-/*
- * Copied from net/core/utils.c:net_ratelimit and modified for
- * use by the AVC audit facility.
- */
-#define AVC_MSG_COST	5*HZ
-#define AVC_MSG_BURST	10*5*HZ
-
-/*
- * This enforces a rate limit: not more than one kernel message
- * every 5secs to make a denial-of-service attack impossible.
- */
-static int avc_ratelimit(void)
+static inline void avc_print_ipv4_addr(struct audit_buffer *ab, u32 addr,
+				       u16 port, char *name1, char *name2)
 {
-	static spinlock_t ratelimit_lock = SPIN_LOCK_UNLOCKED;
-	static unsigned long toks = 10*5*HZ;
-	static unsigned long last_msg;
-	static int missed, rc = 0;
-	unsigned long flags;
-	unsigned long now = jiffies;
-
-	spin_lock_irqsave(&ratelimit_lock, flags);
-	toks += now - last_msg;
-	last_msg = now;
-	if (toks > AVC_MSG_BURST)
-		toks = AVC_MSG_BURST;
-	if (toks >= AVC_MSG_COST) {
-		int lost = missed;
-		missed = 0;
-		toks -= AVC_MSG_COST;
-		spin_unlock_irqrestore(&ratelimit_lock, flags);
-		if (lost)
-			printk(KERN_WARNING "AVC: %d messages suppressed.\n",
-			       lost);
-		rc = 1;
-		goto out;
-	}
-	missed++;
-	spin_unlock_irqrestore(&ratelimit_lock, flags);
-out:
-	return rc;
-}
-
-static inline int check_avc_ratelimit(void)
-{
-	if (selinux_enforcing)
-		return avc_ratelimit();
-	else {
-		/* If permissive, then never suppress messages. */
-		return 1;
-	}
+	if (addr)
+		audit_log_format(ab, " %s=%d.%d.%d.%d", name1, NIPQUAD(addr));
+	if (port)
+		audit_log_format(ab, " %s=%d", name2, ntohs(port));
 }
 
 /**
@@ -503,9 +461,8 @@ void avc_audit(u32 ssid, u32 tsid,
 {
 	struct task_struct *tsk = current;
 	struct inode *inode = NULL;
-	char *p;
 	u32 denied, audited;
-	unsigned long flags;
+	struct audit_buffer *ab;
 
 	denied = requested & ~avd->allowed;
 	if (denied) {
@@ -520,22 +477,18 @@ void avc_audit(u32 ssid, u32 tsid,
 			return;
 	}
 
-	if (!check_avc_ratelimit())
-		return;
-
-	/* prevent overlapping printks */
-	spin_lock_irqsave(&avc_log_lock,flags);
-
-	printk("%s\n", avc_level_string);
-	printk("%savc:  %s ", avc_level_string, denied ? "denied" : "granted");
-	avc_dump_av(tclass,audited);
-	printk(" for ");
+	ab = audit_log_start(current->audit_context);
+	if (!ab)
+		return;		/* audit_panic has been called */
+	audit_log_format(ab, "avc:  %s ", denied ? "denied" : "granted");
+	avc_dump_av(ab, tclass,audited);
+	audit_log_format(ab, " for ");
 	if (a && a->tsk)
 		tsk = a->tsk;
 	if (tsk && tsk->pid) {
 		struct mm_struct *mm;
 		struct vm_area_struct *vma;
-		printk(" pid=%d", tsk->pid);
+		audit_log_format(ab, " pid=%d", tsk->pid);
 		if (tsk == current)
 			mm = current->mm;
 		else
@@ -546,11 +499,9 @@ void avc_audit(u32 ssid, u32 tsid,
 				while (vma) {
 					if ((vma->vm_flags & VM_EXECUTABLE) &&
 					    vma->vm_file) {
-						p = d_path(vma->vm_file->f_dentry,
-							   vma->vm_file->f_vfsmnt,
-							   avc_audit_buffer,
-							   PAGE_SIZE);
-						printk(" exe=%s", p);
+						audit_log_d_path(ab, "exe=",
+							vma->vm_file->f_dentry,
+							vma->vm_file->f_vfsmnt);
 						break;
 					}
 					vma = vma->vm_next;
@@ -560,29 +511,26 @@ void avc_audit(u32 ssid, u32 tsid,
 			if (tsk != current)
 				mmput(mm);
 		} else {
-			printk(" comm=%s", tsk->comm);
+			audit_log_format(ab, " comm=%s", tsk->comm);
 		}
 	}
 	if (a) {
 		switch (a->type) {
 		case AVC_AUDIT_DATA_IPC:
-			printk(" key=%d", a->u.ipc_id);
+			audit_log_format(ab, " key=%d", a->u.ipc_id);
 			break;
 		case AVC_AUDIT_DATA_CAP:
-			printk(" capability=%d", a->u.cap);
+			audit_log_format(ab, " capability=%d", a->u.cap);
 			break;
 		case AVC_AUDIT_DATA_FS:
 			if (a->u.fs.dentry) {
 				struct dentry *dentry = a->u.fs.dentry;
 				if (a->u.fs.mnt) {
-					p = d_path(dentry,
-						   a->u.fs.mnt,
-						   avc_audit_buffer,
-						   PAGE_SIZE);
-					if (p)
-						printk(" path=%s", p);
+					audit_log_d_path(ab, "path=", dentry,
+							a->u.fs.mnt);
 				} else {
-					printk(" name=%s", dentry->d_name.name);
+					audit_log_format(ab, " name=%s",
+							 dentry->d_name.name);
 				}
 				inode = dentry->d_inode;
 			} else if (a->u.fs.inode) {
@@ -590,70 +538,97 @@ void avc_audit(u32 ssid, u32 tsid,
 				inode = a->u.fs.inode;
 				dentry = d_find_alias(inode);
 				if (dentry) {
-					printk(" name=%s", dentry->d_name.name);
+					audit_log_format(ab, " name=%s",
+							 dentry->d_name.name);
 					dput(dentry);
 				}
 			}
 			if (inode)
-				printk(" dev=%s ino=%ld",
-				       inode->i_sb->s_id, inode->i_ino);
+				audit_log_format(ab, " dev=%s ino=%ld",
+						 inode->i_sb->s_id,
+						 inode->i_ino);
 			break;
 		case AVC_AUDIT_DATA_NET:
 			if (a->u.net.sk) {
 				struct sock *sk = a->u.net.sk;
 				struct unix_sock *u;
-				struct inet_opt *inet;
+				int len = 0;
+				char *p = NULL;
 
 				switch (sk->sk_family) {
-				case AF_INET:
-					inet = inet_sk(sk);
-					avc_print_ipv4_addr(inet->rcv_saddr,
-					                    inet->sport,
-					                    "laddr", "lport");
-					avc_print_ipv4_addr(inet->daddr,
-					                    inet->dport,
-					                    "faddr", "fport");
+				case AF_INET: {
+					struct inet_opt *inet = inet_sk(sk);
+
+					avc_print_ipv4_addr(ab, inet->rcv_saddr,
+							    inet->sport,
+							    "laddr", "lport");
+					avc_print_ipv4_addr(ab, inet->daddr,
+							    inet->dport,
+							    "faddr", "fport");
+					break;
+				}
+				case AF_INET6: {
+					struct inet_opt *inet = inet_sk(sk);
+					struct ipv6_pinfo *inet6 = inet6_sk(sk);
+
+					avc_print_ipv6_addr(ab, &inet6->rcv_saddr,
+							    inet->sport,
+							    "laddr", "lport");
+					avc_print_ipv6_addr(ab, &inet6->daddr,
+							    inet->dport,
+							    "faddr", "fport");
 					break;
+				}
 				case AF_UNIX:
 					u = unix_sk(sk);
 					if (u->dentry) {
-						p = d_path(u->dentry,
-							   u->mnt,
-							   avc_audit_buffer,
-							   PAGE_SIZE);
-						printk(" path=%s", p);
-					} else if (u->addr) {
-						p = avc_audit_buffer;
-						memcpy(p,
-						       u->addr->name->sun_path,
-						       u->addr->len-sizeof(short));
-						if (*p == 0) {
-							*p = '@';
-							p += u->addr->len-sizeof(short);
-							*p = 0;
-						}
-						printk(" path=%s",
-						       avc_audit_buffer);
+						audit_log_d_path(ab, "path=",
+							u->dentry, u->mnt);
+						break;
 					}
+					if (!u->addr)
+						break;
+					len = u->addr->len-sizeof(short);
+					p = &u->addr->name->sun_path[0];
+					if (*p)
+						audit_log_format(ab,
+							"path=%*.*s", len,
+							len, p);
+					else
+						audit_log_format(ab,
+							"path=@%*.*s", len-1,
+							len-1, p+1);
 					break;
 				}
 			}
 			
-			avc_print_ipv4_addr(a->u.net.saddr, a->u.net.sport,
-			                    "saddr", "src");
-			avc_print_ipv4_addr(a->u.net.daddr, a->u.net.dport,
-			                    "daddr", "dest");
-
+			switch (a->u.net.family) {
+			case AF_INET:
+				avc_print_ipv4_addr(ab, a->u.net.v4info.saddr,
+						    a->u.net.sport,
+						    "saddr", "src");
+				avc_print_ipv4_addr(ab, a->u.net.v4info.daddr,
+						    a->u.net.dport,
+						    "daddr", "dest");
+				break;
+			case AF_INET6:
+				avc_print_ipv6_addr(ab, &a->u.net.v6info.saddr,
+						    a->u.net.sport,
+						    "saddr", "src");
+				avc_print_ipv6_addr(ab, &a->u.net.v6info.daddr,
+						    a->u.net.dport,
+						    "daddr", "dest");
+				break;
+			}
 			if (a->u.net.netif)
-				printk(" netif=%s", a->u.net.netif);
+				audit_log_format(ab, " netif=%s",
+					a->u.net.netif);
 			break;
 		}
 	}
-	printk(" ");
-	avc_dump_query(ssid, tsid, tclass);
-	printk("\n");
-
-	spin_unlock_irqrestore(&avc_log_lock,flags);
+	audit_log_format(ab, " ");
+	avc_dump_query(ab, ssid, tsid, tclass);
+	audit_log_end(ab);
 }
 
 /**
@@ -1082,14 +1057,3 @@ int avc_has_perm(u32 ssid, u32 tsid, u16
 	avc_audit(ssid, tsid, tclass, requested, &avd, rc, auditdata);
 	return rc;
 }
-
-static int __init avc_log_level_setup(char *str)
-{
-	avc_log_level = simple_strtol(str, NULL, 0);
-	if (avc_log_level > 7)
-		avc_log_level = 7;
-	return 1;
-}
-
-__setup("avc_log_level=", avc_log_level_setup);
-
--- diff/security/selinux/hooks.c	2004-04-05 12:57:08.000000000 +0100
+++ source/security/selinux/hooks.c	2004-04-21 10:45:36.122212088 +0100
@@ -42,6 +42,7 @@
 #include <linux/proc_fs.h>
 #include <linux/kd.h>
 #include <linux/netfilter_ipv4.h>
+#include <linux/netfilter_ipv6.h>
 #include <net/icmp.h>
 #include <net/ip.h>		/* for sysctl_local_port_range[] */
 #include <net/tcp.h>		/* struct or_callable used in sock_rcv_skb */
@@ -59,6 +60,7 @@
 #include <net/af_unix.h>	/* for Unix socket types */
 #include <linux/parser.h>
 #include <linux/nfs_mount.h>
+#include <net/ipv6.h>
 #include <linux/hugetlb.h>
 
 #include "avc.h"
@@ -272,7 +274,7 @@ static int sk_alloc_security(struct sock
 
 static void sk_free_security(struct sock *sk)
 {
-	struct task_security_struct *ssec = sk->sk_security;
+	struct sk_security_struct *ssec = sk->sk_security;
 
 	if (sk->sk_family != PF_UNIX || ssec->magic != SELINUX_MAGIC)
 		return;
@@ -2647,35 +2649,32 @@ static void selinux_task_to_inode(struct
 
 #ifdef CONFIG_SECURITY_NETWORK
 
-static void selinux_parse_skb_ipv4(struct sk_buff *skb, struct avc_audit_data *ad)
+/* Returns error only if unable to parse addresses */
+static int selinux_parse_skb_ipv4(struct sk_buff *skb, struct avc_audit_data *ad)
 {
-	int dlen, ihlen;
-	struct iphdr *iph;
+	int offset, ihlen, ret;
+	struct iphdr iph;
 
-	if (skb->len < sizeof(struct iphdr))
+	offset = skb->nh.raw - skb->data;
+	ret = skb_copy_bits(skb, offset, &iph, sizeof(iph));
+	if (ret)
 		goto out;
-	
-	iph = skb->nh.iph;
-	ihlen = iph->ihl * 4;
-	if (ihlen < sizeof(struct iphdr))
+
+	ihlen = iph.ihl * 4;
+	if (ihlen < sizeof(iph))
 		goto out;
 
-	dlen = skb->len - ihlen;
-	ad->u.net.saddr = iph->saddr;
-	ad->u.net.daddr = iph->daddr;
+	ad->u.net.v4info.saddr = iph.saddr;
+	ad->u.net.v4info.daddr = iph.daddr;
 
-	switch (iph->protocol) {
+	switch (iph.protocol) {
         case IPPROTO_TCP: {
-        	int offset;
         	struct tcphdr tcph;
 
-        	if (ntohs(iph->frag_off) & IP_OFFSET)
+        	if (ntohs(iph.frag_off) & IP_OFFSET)
         		break;
-        		
-		if (dlen < sizeof(tcph))
-			break;
 
-		offset = skb->nh.raw - skb->data + ihlen;
+		offset += ihlen;
 		if (skb_copy_bits(skb, offset, &tcph, sizeof(tcph)) < 0)
 			break;
 
@@ -2685,16 +2684,12 @@ static void selinux_parse_skb_ipv4(struc
         }
         
         case IPPROTO_UDP: {
-        	int offset;
         	struct udphdr udph;
         	
-        	if (ntohs(iph->frag_off) & IP_OFFSET)
+        	if (ntohs(iph.frag_off) & IP_OFFSET)
         		break;
         		
-        	if (dlen < sizeof(udph))
-        		break;
-
-		offset = skb->nh.raw - skb->data + ihlen;
+		offset += ihlen;
         	if (skb_copy_bits(skb, offset, &udph, sizeof(udph)) < 0)
         		break;	
 
@@ -2707,7 +2702,96 @@ static void selinux_parse_skb_ipv4(struc
         	break;
         }
 out:
-	return;
+	return ret;
+}
+
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+
+/* Returns error only if unable to parse addresses */
+static int selinux_parse_skb_ipv6(struct sk_buff *skb, struct avc_audit_data *ad)
+{
+	u8 nexthdr;
+	int ret, offset;
+	struct ipv6hdr ipv6h;
+
+	offset = skb->nh.raw - skb->data;
+	ret = skb_copy_bits(skb, offset, &ipv6h, sizeof(ipv6h));
+	if (ret)
+		goto out;
+
+	ipv6_addr_copy(&ad->u.net.v6info.saddr, &ipv6h.saddr);
+	ipv6_addr_copy(&ad->u.net.v6info.daddr, &ipv6h.daddr);
+
+	nexthdr = ipv6h.nexthdr;
+	offset += sizeof(ipv6h);
+	offset = ipv6_skip_exthdr(skb, offset, &nexthdr,
+				  skb->tail - skb->head - offset);
+	if (offset < 0)
+		goto out;
+
+	switch (nexthdr) {
+	case IPPROTO_TCP: {
+        	struct tcphdr tcph;
+
+		if (skb_copy_bits(skb, offset, &tcph, sizeof(tcph)) < 0)
+			break;
+
+		ad->u.net.sport = tcph.source;
+		ad->u.net.dport = tcph.dest;
+		break;
+	}
+
+	case IPPROTO_UDP: {
+		struct udphdr udph;
+
+		if (skb_copy_bits(skb, offset, &udph, sizeof(udph)) < 0)
+			break;
+
+		ad->u.net.sport = udph.source;
+		ad->u.net.dport = udph.dest;
+		break;
+	}
+
+	/* includes fragments */
+	default:
+		break;
+	}
+out:
+	return ret;
+}
+
+#endif /* IPV6 */
+
+static int selinux_parse_skb(struct sk_buff *skb, struct avc_audit_data *ad,
+			     char **addrp, int *len, int src)
+{
+	int ret = 0;
+
+	switch (ad->u.net.family) {
+	case PF_INET:
+		ret = selinux_parse_skb_ipv4(skb, ad);
+		if (ret || !addrp)
+			break;
+		*len = 4;
+		*addrp = (char *)(src ? &ad->u.net.v4info.saddr :
+					&ad->u.net.v4info.daddr);
+		break;
+
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+	case PF_INET6:
+		ret = selinux_parse_skb_ipv6(skb, ad);
+		if (ret || !addrp)
+			break;
+		*len = 16;
+		*addrp = (char *)(src ? &ad->u.net.v6info.saddr :
+					&ad->u.net.v6info.daddr);
+		break;
+#endif	/* IPV6 */
+	default:
+		break;
+	}
+
+	return ret;
 }
 
 /* socket security operations */
@@ -2770,6 +2854,7 @@ static void selinux_socket_post_create(s
 
 static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen)
 {
+	u16 family;
 	int err;
 
 	err = socket_has_perm(current, sock, SOCKET__BIND);
@@ -2777,20 +2862,35 @@ static int selinux_socket_bind(struct so
 		goto out;
 
 	/*
-	 * If PF_INET, check name_bind permission for the port.
+	 * If PF_INET or PF_INET6, check name_bind permission for the port.
 	 */
-	if (sock->sk->sk_family == PF_INET) {
+	family = sock->sk->sk_family;
+	if (family == PF_INET || family == PF_INET6) {
+		char *addrp;
 		struct inode_security_struct *isec;
 		struct task_security_struct *tsec;
 		struct avc_audit_data ad;
-		struct sockaddr_in *addr = (struct sockaddr_in *)address;
-		unsigned short snum = ntohs(addr->sin_port);
+		struct sockaddr_in *addr4 = NULL;
+		struct sockaddr_in6 *addr6 = NULL;
+		unsigned short snum;
 		struct sock *sk = sock->sk;
-		u32 sid, node_perm;
+		u32 sid, node_perm, addrlen;
 
 		tsec = current->security;
 		isec = SOCK_INODE(sock)->i_security;
 
+		if (family == PF_INET) {
+			addr4 = (struct sockaddr_in *)address;
+			snum = ntohs(addr4->sin_port);
+			addrlen = sizeof(addr4->sin_addr.s_addr);
+			addrp = (char *)&addr4->sin_addr.s_addr;
+		} else {
+			addr6 = (struct sockaddr_in6 *)address;
+			snum = ntohs(addr6->sin6_port);
+			addrlen = sizeof(addr6->sin6_addr.s6_addr);
+			addrp = (char *)&addr6->sin6_addr.s6_addr;
+		}
+
 		if (snum&&(snum < max(PROT_SOCK,ip_local_port_range_0) ||
 			   snum > ip_local_port_range_1)) {
 			err = security_port_sid(sk->sk_family, sk->sk_type,
@@ -2820,14 +2920,19 @@ static int selinux_socket_bind(struct so
 			break;
 		}
 		
-		err = security_node_sid(PF_INET, &addr->sin_addr.s_addr,
-		                        sizeof(addr->sin_addr.s_addr), &sid);
+		err = security_node_sid(family, addrp, addrlen, &sid);
 		if (err)
 			goto out;
 		
 		AVC_AUDIT_DATA_INIT(&ad,NET);
 		ad.u.net.sport = htons(snum);
-		ad.u.net.saddr = addr->sin_addr.s_addr;
+		ad.u.net.family = family;
+
+		if (family == PF_INET)
+			ad.u.net.v4info.saddr = addr4->sin_addr.s_addr;
+		else
+			ipv6_addr_copy(&ad.u.net.v6info.saddr, &addr6->sin6_addr);
+
 		err = avc_has_perm(isec->sid, sid,
 		                   isec->sclass, node_perm, NULL, &ad);
 		if (err)
@@ -2967,21 +3072,26 @@ static int selinux_socket_unix_may_send(
 
 static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
 {
-	int err = 0;
+	u16 family;
+	char *addrp;
+	int len, err = 0;
 	u32 netif_perm, node_perm, node_sid, recv_perm = 0;
 	struct socket *sock;
 	struct inode *inode;
 	struct net_device *dev;
-	struct iphdr *iph;
 	struct sel_netif *netif;
 	struct netif_security_struct *nsec;
 	struct inode_security_struct *isec;
 	struct avc_audit_data ad;
 
-	/* Only IPv4 is supported here at this stage */
-	if (sk->sk_family != PF_INET)
+	family = sk->sk_family;
+	if (family != PF_INET && family != PF_INET6)
 		goto out;
 
+	/* Handle mapped IPv4 packets arriving via IPv6 sockets */
+	if (family == PF_INET6 && skb->protocol == ntohs(ETH_P_IP))
+		family = PF_INET;
+
 	sock = sk->sk_socket;
 	
 	/* TCP control messages don't always have a socket. */
@@ -3026,7 +3136,13 @@ static int selinux_socket_sock_rcv_skb(s
 
 	AVC_AUDIT_DATA_INIT(&ad, NET);
 	ad.u.net.netif = dev->name;
-	selinux_parse_skb_ipv4(skb, &ad);
+	ad.u.net.family = family;
+
+	err = selinux_parse_skb(skb, &ad, &addrp, &len, 1);
+	if (err) {
+		sel_netif_put(netif);
+		goto out;
+	}
 
 	err = avc_has_perm(isec->sid, nsec->if_sid, SECCLASS_NETIF,
 	                   netif_perm, &nsec->avcr, &ad);
@@ -3035,8 +3151,7 @@ static int selinux_socket_sock_rcv_skb(s
 		goto out;
 	
 	/* Fixme: this lookup is inefficient */
-	iph = skb->nh.iph;
-	err = security_node_sid(PF_INET, &iph->saddr, sizeof(iph->saddr), &node_sid);
+	err = security_node_sid(family, addrp, len, &node_sid);
 	if (err)
 		goto out;
 	
@@ -3057,7 +3172,6 @@ static int selinux_socket_sock_rcv_skb(s
 		err = avc_has_perm(isec->sid, port_sid, isec->sclass,
 		                   recv_perm, NULL, &ad);
 	}
-
 out:	
 	return err;
 }
@@ -3111,18 +3225,20 @@ static void selinux_sk_free_security(str
 }
 
 #ifdef CONFIG_NETFILTER
+
 static unsigned int selinux_ip_postroute_last(unsigned int hooknum,
                                               struct sk_buff **pskb,
                                               const struct net_device *in,
                                               const struct net_device *out,
-                                              int (*okfn)(struct sk_buff *))
+                                              int (*okfn)(struct sk_buff *),
+                                              u16 family)
 {
-	int err = NF_ACCEPT;
+	char *addrp;
+	int len, err = NF_ACCEPT;
 	u32 netif_perm, node_perm, node_sid, send_perm = 0;
 	struct sock *sk;
 	struct socket *sock;
 	struct inode *inode;
-	struct iphdr *iph;
 	struct sel_netif *netif;
 	struct sk_buff *skb = *pskb;
 	struct netif_security_struct *nsec;
@@ -3170,9 +3286,17 @@ static unsigned int selinux_ip_postroute
 		break;
 	}
 
+
 	AVC_AUDIT_DATA_INIT(&ad, NET);
 	ad.u.net.netif = dev->name;
-	selinux_parse_skb_ipv4(skb, &ad);
+	ad.u.net.family = family;
+
+	err = selinux_parse_skb(skb, &ad, &addrp,
+				&len, 0) ? NF_DROP : NF_ACCEPT;
+	if (err != NF_ACCEPT) {
+		sel_netif_put(netif);
+		goto out;
+	}
 
 	err = avc_has_perm(isec->sid, nsec->if_sid, SECCLASS_NETIF,
 	                   netif_perm, &nsec->avcr, &ad) ? NF_DROP : NF_ACCEPT;
@@ -3181,8 +3305,7 @@ static unsigned int selinux_ip_postroute
 		goto out;
 		
 	/* Fixme: this lookup is inefficient */
-	iph = skb->nh.iph;
-	err = security_node_sid(PF_INET, &iph->daddr, sizeof(iph->daddr),
+	err = security_node_sid(family, addrp, len,
 				&node_sid) ? NF_DROP : NF_ACCEPT;
 	if (err != NF_ACCEPT)
 		goto out;
@@ -3212,6 +3335,28 @@ out:
 	return err;
 }
 
+static unsigned int selinux_ipv4_postroute_last(unsigned int hooknum,
+						struct sk_buff **pskb,
+						const struct net_device *in,
+						const struct net_device *out,
+						int (*okfn)(struct sk_buff *))
+{
+	return selinux_ip_postroute_last(hooknum, pskb, in, out, okfn, PF_INET);
+}
+
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+
+static unsigned int selinux_ipv6_postroute_last(unsigned int hooknum,
+						struct sk_buff **pskb,
+						const struct net_device *in,
+						const struct net_device *out,
+						int (*okfn)(struct sk_buff *))
+{
+	return selinux_ip_postroute_last(hooknum, pskb, in, out, okfn, PF_INET6);
+}
+
+#endif	/* IPV6 */
+
 #endif	/* CONFIG_NETFILTER */
 
 #endif	/* CONFIG_SECURITY_NETWORK */
@@ -4025,14 +4170,26 @@ security_initcall(selinux_init);
 
 #if defined(CONFIG_SECURITY_NETWORK) && defined(CONFIG_NETFILTER)
 
-static struct nf_hook_ops selinux_ip_ops[] = {
-	{ .hook =	selinux_ip_postroute_last,
-	  .owner =	THIS_MODULE,
-	  .pf =		PF_INET, 
-	  .hooknum =	NF_IP_POST_ROUTING, 
-	  .priority =	NF_IP_PRI_SELINUX_LAST, },
+static struct nf_hook_ops selinux_ipv4_op = {
+	.hook =		selinux_ipv4_postroute_last,
+	.owner =	THIS_MODULE,
+	.pf =		PF_INET,
+	.hooknum =	NF_IP_POST_ROUTING,
+	.priority =	NF_IP_PRI_SELINUX_LAST,
+};
+
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+
+static struct nf_hook_ops selinux_ipv6_op = {
+	.hook =		selinux_ipv6_postroute_last,
+	.owner =	THIS_MODULE,
+	.pf =		PF_INET6,
+	.hooknum =	NF_IP6_POST_ROUTING,
+	.priority =	NF_IP6_PRI_SELINUX_LAST,
 };
 
+#endif	/* IPV6 */
+
 static int __init selinux_nf_ip_init(void)
 {
 	int err = 0;
@@ -4042,10 +4199,17 @@ static int __init selinux_nf_ip_init(voi
 		
 	printk(KERN_INFO "SELinux:  Registering netfilter hooks\n");
 	
-	err = nf_register_hook(&selinux_ip_ops[0]);
+	err = nf_register_hook(&selinux_ipv4_op);
+	if (err)
+		panic("SELinux: nf_register_hook for IPv4: error %d\n", err);
+
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+
+	err = nf_register_hook(&selinux_ipv6_op);
 	if (err)
-		panic("SELinux: nf_register_hook 0 error %d\n", err);
+		panic("SELinux: nf_register_hook for IPv6: error %d\n", err);
 
+#endif	/* IPV6 */
 out:
 	return err;
 }
--- diff/security/selinux/include/avc.h	2004-02-18 08:54:13.000000000 +0000
+++ source/security/selinux/include/avc.h	2004-04-21 10:45:36.122212088 +0100
@@ -12,6 +12,7 @@
 #include <linux/kdev_t.h>
 #include <linux/spinlock.h>
 #include <linux/init.h>
+#include <linux/in6.h>
 #include <asm/system.h>
 #include "flask.h"
 #include "av_permissions.h"
@@ -65,16 +66,28 @@ struct avc_audit_data {
 		struct {
 			char *netif;
 			struct sock *sk;
+			u16 family;
 			u16 dport;
 			u16 sport;
-			u32 daddr;
-			u32 saddr;
+			union {
+				struct {
+					u32 daddr;
+					u32 saddr;
+				} v4;
+				struct {
+					struct in6_addr daddr;
+					struct in6_addr saddr;
+				} v6;
+			} fam;
 		} net;
 		int cap;
 		int ipc_id;
 	} u;
 };
 
+#define v4info fam.v4
+#define v6info fam.v6
+
 /* Initialize an AVC audit data structure. */
 #define AVC_AUDIT_DATA_INIT(_d,_t) \
         { memset((_d), 0, sizeof(struct avc_audit_data)); (_d)->type = AVC_AUDIT_DATA_##_t; }
@@ -114,9 +127,10 @@ static inline void avc_cache_stats_add(i
 /*
  * AVC display support
  */
-void avc_dump_av(u16 tclass, u32 av);
-void avc_dump_query(u32 ssid, u32 tsid, u16 tclass);
-void avc_dump_cache(char *tag);
+struct audit_buffer;
+void avc_dump_av(struct audit_buffer *ab, u16 tclass, u32 av);
+void avc_dump_query(struct audit_buffer *ab, u32 ssid, u32 tsid, u16 tclass);
+void avc_dump_cache(struct audit_buffer *ab, char *tag);
 
 /*
  * AVC operations
--- diff/security/selinux/include/security.h	2004-04-05 12:57:08.000000000 +0100
+++ source/security/selinux/include/security.h	2004-04-21 10:45:36.122212088 +0100
@@ -15,8 +15,15 @@
 #define SECCLASS_NULL			0x0000 /* no class */
 
 #define SELINUX_MAGIC 0xf97cff8c
-#define POLICYDB_VERSION 16
-#define POLICYDB_VERSION_COMPAT 15
+
+/* Identify specific policy version changes */
+#define POLICYDB_VERSION_BASE  15
+#define POLICYDB_VERSION_BOOL  16
+#define POLICYDB_VERSION_IPV6  17
+
+/* Range of policy versions we understand*/
+#define POLICYDB_VERSION_MIN   POLICYDB_VERSION_BASE
+#define POLICYDB_VERSION_MAX   POLICYDB_VERSION_IPV6
 
 #ifdef CONFIG_SECURITY_SELINUX_BOOTPARAM
 extern int selinux_enabled;
--- diff/security/selinux/selinuxfs.c	2004-04-05 12:57:08.000000000 +0100
+++ source/security/selinux/selinuxfs.c	2004-04-21 10:45:36.123211936 +0100
@@ -164,7 +164,7 @@ static ssize_t sel_read_policyvers(struc
 		return -ENOMEM;
 	memset(page, 0, PAGE_SIZE);
 
-	length = scnprintf(page, PAGE_SIZE, "%u", POLICYDB_VERSION);
+	length = scnprintf(page, PAGE_SIZE, "%u", POLICYDB_VERSION_MAX);
 	if (length < 0) {
 		free_page((unsigned long)page);
 		return length;
--- diff/security/selinux/ss/policydb.c	2004-04-05 12:57:08.000000000 +0100
+++ source/security/selinux/ss/policydb.c	2004-04-21 10:45:36.124211784 +0100
@@ -48,6 +48,45 @@ static unsigned int symtab_sizes[SYM_NUM
 	16
 };
 
+struct policydb_compat_info {
+	int version;
+	int sym_num;
+	int ocon_num;
+};
+
+/* These need to be updated if SYM_NUM or OCON_NUM changes */
+static struct policydb_compat_info policydb_compat[] = {
+	{
+		.version        = POLICYDB_VERSION_BASE,
+		.sym_num        = SYM_NUM - 1,
+		.ocon_num       = OCON_NUM - 1,
+	},
+	{
+		.version        = POLICYDB_VERSION_BOOL,
+		.sym_num        = SYM_NUM,
+		.ocon_num       = OCON_NUM - 1,
+	},
+	{
+		.version        = POLICYDB_VERSION_IPV6,
+		.sym_num        = SYM_NUM,
+		.ocon_num       = OCON_NUM,
+	},
+};
+
+static struct policydb_compat_info *policydb_lookup_compat(int version)
+{
+	int i;
+	struct policydb_compat_info *info = NULL;
+
+	for (i = 0; i < sizeof(policydb_compat)/sizeof(*info); i++) {
+		if (policydb_compat[i].version == version) {
+			info = &policydb_compat[i];
+			break;
+		}
+	}
+	return info;
+}
+
 /*
  * Initialize the role table.
  */
@@ -1086,9 +1125,10 @@ int policydb_read(struct policydb *p, vo
 	struct role_trans *tr, *ltr;
 	struct ocontext *l, *c, *newc;
 	struct genfs *genfs_p, *genfs, *newgenfs;
-	int i, j, rc, policy_ver, num_syms;
+	int i, j, rc, r_policyvers;
 	u32 *buf, len, len2, config, nprim, nel, nel2;
 	char *policydb_str;
+	struct policydb_compat_info *info;
 
 	config = 0;
 	mls_set_config(config);
@@ -1116,7 +1156,7 @@ int policydb_read(struct policydb *p, vo
 	len = buf[1];
 	if (len != strlen(POLICYDB_STRING)) {
 		printk(KERN_ERR "security:  policydb string length %d does not "
-		       "match expected length %Zd\n",
+		       "match expected length %Zu\n",
 		       len, strlen(POLICYDB_STRING));
 		goto bad;
 	}
@@ -1151,12 +1191,15 @@ int policydb_read(struct policydb *p, vo
 	for (i = 0; i < 4; i++)
 		buf[i] = le32_to_cpu(buf[i]);
 
-	policy_ver = buf[0];
-	if (policy_ver != POLICYDB_VERSION && policy_ver != POLICYDB_VERSION_COMPAT) {
-		printk(KERN_ERR "security:  policydb version %d does not match "
-		       "my version %d\n", buf[0], POLICYDB_VERSION);
-		goto bad;
+	r_policyvers = buf[0];
+	if (r_policyvers < POLICYDB_VERSION_MIN ||
+	    r_policyvers > POLICYDB_VERSION_MAX) {
+	    	printk(KERN_ERR "security:  policydb version %d does not match "
+	    	       "my version range %d-%d\n",
+	    	       buf[0], POLICYDB_VERSION_MIN, POLICYDB_VERSION_MAX);
+	    	goto bad;
 	}
+
 	if (buf[1] != config) {
 		printk(KERN_ERR "security:  policydb configuration (%s) does "
 		       "not match my configuration (%s)\n",
@@ -1165,29 +1208,26 @@ int policydb_read(struct policydb *p, vo
 		goto bad;
 	}
 
-	if (policy_ver == POLICYDB_VERSION_COMPAT) {
-		if (buf[2] != (SYM_NUM - 1) || buf[3] != OCON_NUM) {
-			printk(KERN_ERR "security:  policydb table sizes (%d,%d) do "
-			       "not match mine (%d,%d)\n",
-			       buf[2], buf[3], SYM_NUM, OCON_NUM);
-			goto bad;
-		}
-		num_syms = SYM_NUM - 1;
-	} else {
-		if (buf[2] != SYM_NUM || buf[3] != OCON_NUM) {
-			printk(KERN_ERR "security:  policydb table sizes (%d,%d) do "
-			       "not match mine (%d,%d)\n",
-			       buf[2], buf[3], SYM_NUM, OCON_NUM);
-			goto bad;
-		}
-		num_syms = SYM_NUM;
+
+	info = policydb_lookup_compat(r_policyvers);
+	if (!info) {
+		printk(KERN_ERR "security:  unable to find policy compat info "
+		       "for version %d\n", r_policyvers);
+		goto bad;
+	}
+
+	if (buf[2] != info->sym_num || buf[3] != info->ocon_num) {
+		printk(KERN_ERR "security:  policydb table sizes (%d,%d) do "
+		       "not match mine (%d,%d)\n", buf[2], buf[3],
+		       info->sym_num, info->ocon_num);
+		goto bad;
 	}
 
 	rc = mls_read_nlevels(p, fp);
 	if (rc)
 		goto bad;
 
-	for (i = 0; i < num_syms; i++) {
+	for (i = 0; i < info->sym_num; i++) {
 		buf = next_entry(fp, sizeof(u32)*2);
 		if (!buf) {
 			rc = -EINVAL;
@@ -1208,7 +1248,7 @@ int policydb_read(struct policydb *p, vo
 	if (rc)
 		goto bad;
 
-	if (policy_ver == POLICYDB_VERSION) {
+	if (r_policyvers >= POLICYDB_VERSION_BOOL) {
 		rc = cond_read_list(p, fp);
 		if (rc)
 			goto bad;
@@ -1281,7 +1321,7 @@ int policydb_read(struct policydb *p, vo
 	if (rc)
 		goto bad;
 
-	for (i = 0; i < OCON_NUM; i++) {
+	for (i = 0; i < info->ocon_num; i++) {
 		buf = next_entry(fp, sizeof(u32));
 		if (!buf) {
 			rc = -EINVAL;
@@ -1379,6 +1419,20 @@ int policydb_read(struct policydb *p, vo
 				if (rc)
 					goto bad;
 				break;
+			case OCON_NODE6: {
+				int k;
+
+				buf = next_entry(fp, sizeof(u32) * 8);
+				if (!buf)
+					goto bad;
+				for (k = 0; k < 4; k++)
+					c->u.node6.addr[k] = le32_to_cpu(buf[k]);
+				for (k = 0; k < 4; k++)
+					c->u.node6.mask[k] = le32_to_cpu(buf[k+4]);
+				if (context_read_and_validate(&c->context[0], p, fp))
+					goto bad;
+				break;
+			}
 			}
 		}
 	}
--- diff/security/selinux/ss/policydb.h	2004-04-05 12:57:08.000000000 +0100
+++ source/security/selinux/ss/policydb.h	2004-04-21 10:45:36.124211784 +0100
@@ -138,6 +138,10 @@ struct ocontext {
 			u32 addr;
 			u32 mask;
 		} node;		/* node information */
+		struct {
+			u32 addr[4];
+			u32 mask[4];
+		} node6;        /* IPv6 node information */
 	} u;
 	union {
 		u32 sclass;  /* security class for genfs */
@@ -177,7 +181,8 @@ struct genfs {
 #define OCON_NETIF 3	/* network interfaces */
 #define OCON_NODE  4	/* nodes */
 #define OCON_FSUSE 5	/* fs_use */
-#define OCON_NUM   6
+#define OCON_NODE6 6	/* IPv6 nodes */
+#define OCON_NUM   7
 
 /* The policy database */
 struct policydb {
--- diff/security/selinux/ss/services.c	2004-04-05 12:57:08.000000000 +0100
+++ source/security/selinux/ss/services.c	2004-04-21 10:45:36.125211632 +0100
@@ -26,6 +26,7 @@
 #include <linux/errno.h>
 #include <linux/in.h>
 #include <linux/sched.h>
+#include <linux/audit.h>
 #include <asm/semaphore.h>
 #include "flask.h"
 #include "avc.h"
@@ -399,7 +400,7 @@ int security_sid_to_context(u32 sid, cha
 			char *scontextp;
 
 			*scontext_len = strlen(initial_sid_to_string[sid]) + 1;
-			scontextp = kmalloc(*scontext_len,GFP_KERNEL);
+			scontextp = kmalloc(*scontext_len,GFP_ATOMIC);
 			strcpy(scontextp, initial_sid_to_string[sid]);
 			*scontext = scontextp;
 			goto out;
@@ -548,32 +549,34 @@ out:
 	return rc;
 }
 
-static inline int compute_sid_handle_invalid_context(
+static int compute_sid_handle_invalid_context(
 	struct context *scontext,
 	struct context *tcontext,
 	u16 tclass,
 	struct context *newcontext)
 {
-	int rc = 0;
-
-	if (selinux_enforcing) {
-		rc = -EACCES;
-	} else {
-		char *s, *t, *n;
-		u32 slen, tlen, nlen;
+	char *s = NULL, *t = NULL, *n = NULL;
+	u32 slen, tlen, nlen;
 
-		context_struct_to_string(scontext, &s, &slen);
-		context_struct_to_string(tcontext, &t, &tlen);
-		context_struct_to_string(newcontext, &n, &nlen);
-		printk(KERN_ERR "security_compute_sid:  invalid context %s", n);
-		printk(" for scontext=%s", s);
-		printk(" tcontext=%s", t);
-		printk(" tclass=%s\n", policydb.p_class_val_to_name[tclass-1]);
-		kfree(s);
-		kfree(t);
-		kfree(n);
-	}
-	return rc;
+	if (context_struct_to_string(scontext, &s, &slen) < 0)
+		goto out;
+	if (context_struct_to_string(tcontext, &t, &tlen) < 0)
+		goto out;
+	if (context_struct_to_string(newcontext, &n, &nlen) < 0)
+		goto out;
+	audit_log(current->audit_context,
+		  "security_compute_sid:  invalid context %s"
+		  " for scontext=%s"
+		  " tcontext=%s"
+		  " tclass=%s",
+		  n, s, t, policydb.p_class_val_to_name[tclass-1]);
+out:
+	kfree(s);
+	kfree(t);
+	kfree(n);
+	if (!selinux_enforcing)
+		return 0;
+	return -EACCES;
 }
 
 static int security_compute_sid(u32 ssid,
@@ -1187,6 +1190,18 @@ out:
 	return rc;
 }
 
+static int match_ipv6_addrmask(u32 *input, u32 *addr, u32 *mask)
+{
+	int i, fail = 0;
+
+	for(i = 0; i < 4; i++)
+		if(addr[i] != (input[i] & mask[i])) {
+			fail = 1;
+			break;
+		}
+
+	return !fail;
+}
 
 /**
  * security_node_sid - Obtain the SID for a node (host).
@@ -1201,22 +1216,47 @@ int security_node_sid(u16 domain,
 		      u32 *out_sid)
 {
 	int rc = 0;
-	u32 addr;
 	struct ocontext *c;
 
 	POLICY_RDLOCK;
 
-	if (domain != AF_INET || addrlen != sizeof(u32)) {
-		*out_sid = SECINITSID_NODE;
-		goto out;
+	switch (domain) {
+	case AF_INET: {
+		u32 addr;
+
+		if (addrlen != sizeof(u32)) {
+			rc = -EINVAL;
+			goto out;
+		}
+
+		addr = *((u32 *)addrp);
+
+		c = policydb.ocontexts[OCON_NODE];
+		while (c) {
+			if (c->u.node.addr == (addr & c->u.node.mask))
+				break;
+			c = c->next;
+		}
+		break;
 	}
-	addr = *((u32 *)addrp);
 
-	c = policydb.ocontexts[OCON_NODE];
-	while (c) {
-		if (c->u.node.addr == (addr & c->u.node.mask))
-			break;
-		c = c->next;
+	case AF_INET6:
+		if (addrlen != sizeof(u64) * 2) {
+			rc = -EINVAL;
+			goto out;
+		}
+		c = policydb.ocontexts[OCON_NODE6];
+		while (c) {
+			if (match_ipv6_addrmask(addrp, c->u.node6.addr,
+						c->u.node6.mask))
+				break;
+			c = c->next;
+		}
+		break;
+
+	default:
+		*out_sid = SECINITSID_NODE;
+		goto out;
 	}
 
 	if (c) {
--- diff/sound/core/Kconfig	2004-04-05 12:57:08.000000000 +0100
+++ source/sound/core/Kconfig	2004-04-21 10:45:36.125211632 +0100
@@ -1,7 +1,7 @@
 # ALSA soundcard-configuration
 config SND_BIT32_EMUL
 	tristate "Emulation for 32-bit applications"
-	depends on SND && (SPARC64 || PPC64 || X86_64 && IA32_EMULATION)
+	depends on SND && SND_PCM && (SPARC64 || PPC64 || X86_64 && IA32_EMULATION)
 
 config SND_TIMER
 	tristate
--- diff/sound/isa/es1688/es1688.c	2004-04-05 12:57:08.000000000 +0100
+++ source/sound/isa/es1688/es1688.c	2004-04-21 10:45:36.126211480 +0100
@@ -34,8 +34,6 @@
 #define SNDRV_GET_ID
 #include <sound/initval.h>
 
-#define chip_t es1688_t
-
 MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
 MODULE_DESCRIPTION("ESS ESx688 AudioDrive");
 MODULE_LICENSE("GPL");
--- diff/sound/isa/es1688/es1688_lib.c	2004-04-05 12:57:08.000000000 +0100
+++ source/sound/isa/es1688/es1688_lib.c	2004-04-21 10:45:36.126211480 +0100
@@ -37,8 +37,6 @@ MODULE_DESCRIPTION("ESS ESx688 lowlevel 
 MODULE_CLASSES("{sound}");
 MODULE_LICENSE("GPL");
 
-#define chip_t es1688_t
-
 static int snd_es1688_dsp_command(es1688_t *chip, unsigned char val)
 {
 	int i;
--- diff/sound/isa/wavefront/wavefront_synth.c	2004-04-05 12:57:08.000000000 +0100
+++ source/sound/isa/wavefront/wavefront_synth.c	2004-04-21 10:45:36.128211176 +0100
@@ -1920,7 +1920,6 @@ wavefront_reset_to_cleanliness (snd_wave
 #include <linux/syscalls.h>
 #include <asm/uaccess.h>
 
-static int errno;
 
 static int __init
 wavefront_download_firmware (snd_wavefront_t *dev, char *path)
--- diff/sound/oss/Kconfig	2004-04-05 12:57:08.000000000 +0100
+++ source/sound/oss/Kconfig	2004-04-21 10:45:36.133210416 +0100
@@ -318,7 +318,7 @@ config SOUND_MSNDCLAS
 	  See <file:Documentation/sound/oss/MultiSound> for important information
 	  about this driver.  Note that it has been discontinued, but the
 	  Voyetra Turtle Beach knowledge base entry for it is still available
-	  at <http://www.voyetra-turtle-beach.com/site/kb_ftp/790.asp>.
+	  at <http://www.turtlebeach.com/site/kb_ftp/790.asp>.
 
 comment "Compiled-in MSND Classic support requires firmware during compilation."
 	depends on SOUND_PRIME && SOUND_MSNDCLAS=y
@@ -380,7 +380,7 @@ config SOUND_MSNDPIN
 	  See <file:Documentation/sound/oss/MultiSound> for important information
 	  about this driver. Note that it has been discontinued, but the
 	  Voyetra Turtle Beach knowledge base entry for it is still available
-	  at <http://www.voyetra-turtle-beach.com/site/kb_ftp/600.asp>.
+	  at <http://www.turtlebeach.com/site/kb_ftp/600.asp>.
 
 comment "Compiled-in MSND Pinnacle support requires firmware during compilation."
 	depends on SOUND_PRIME && SOUND_MSNDPIN=y
--- diff/sound/oss/au1000.c	2004-01-19 10:22:59.000000000 +0000
+++ source/sound/oss/au1000.c	2004-04-21 10:45:36.134210264 +0100
@@ -369,7 +369,7 @@ static void set_adc_rate(struct au1000_s
 	adc_rate = rdcodec(s->codec, AC97_PCM_LR_ADC_RATE);
 
 #ifdef AU1000_VERBOSE_DEBUG
-	dbg(__FUNCTION__ ": set to %d Hz", adc_rate);
+	dbg("%s: set to %d Hz", __FUNCTION__, adc_rate);
 #endif
 
 	// some codec's don't allow unequal DAC and ADC rates, in which case
@@ -420,7 +420,7 @@ static void set_dac_rate(struct au1000_s
 	dac_rate = rdcodec(s->codec, AC97_PCM_FRONT_DAC_RATE);
 
 #ifdef AU1000_VERBOSE_DEBUG
-	dbg(__FUNCTION__ ": set to %d Hz", dac_rate);
+	dbg("%s: set to %d Hz", __FUNCTION__, dac_rate);
 #endif
 
 	// some codec's don't allow unequal DAC and ADC rates, in which case
@@ -989,7 +989,7 @@ static int translate_from_user(struct dm
 	for (sample = 0; sample < num_samples; sample++) {
 		if (copy_from_user(usersample, userbuf,
 				   db->user_bytes_per_sample)) {
-			dbg(__FUNCTION__ ": fault");
+			dbg("%s: fault", __FUNCTION__);
 			return -EFAULT;
 		}
 
@@ -1053,7 +1053,7 @@ static int translate_to_user(struct dmab
 
 		if (copy_to_user(userbuf, usersample,
 				 db->user_bytes_per_sample)) {
-			dbg(__FUNCTION__ ": fault");
+			dbg("%s: fault", __FUNCTION__);
 			return -EFAULT;
 		}
 
@@ -1848,9 +1848,9 @@ static int  au1000_open(struct inode *in
 
 #ifdef AU1000_VERBOSE_DEBUG
 	if (file->f_flags & O_NONBLOCK)
-		dbg(__FUNCTION__ ": non-blocking");
+		dbg("%s: non-blocking", __FUNCTION__);
 	else
-		dbg(__FUNCTION__ ": blocking");
+		dbg("%s: blocking", __FUNCTION__);
 #endif
 	
 	file->private_data = s;
--- diff/sound/oss/ite8172.c	2004-01-19 10:22:59.000000000 +0000
+++ source/sound/oss/ite8172.c	2004-04-21 10:45:36.136209960 +0100
@@ -1779,9 +1779,9 @@ static int it8172_open(struct inode *ino
     
 #ifdef IT8172_VERBOSE_DEBUG
 	if (file->f_flags & O_NONBLOCK)
-		dbg(__FUNCTION__ ": non-blocking");
+		dbg("%s: non-blocking", __FUNCTION__);
 	else
-		dbg(__FUNCTION__ ": blocking");
+		dbg("%s: blocking", __FUNCTION__);
 #endif
 	
 	for (list = devs.next; ; list = list->next) {
--- diff/sound/oss/rme96xx.c	2004-04-05 12:57:08.000000000 +0100
+++ source/sound/oss/rme96xx.c	2004-04-21 10:45:36.137209808 +0100
@@ -872,7 +872,7 @@ int rme96xx_init(rme96xx_info* s)
 	int status;
 	unsigned short rev;
 
-	DBG(printk(__FUNCTION__"\n"));
+	DBG(printk("%s\n", __FUNCTION__));
 	numcards++;
 
 	s->magic = RME96xx_MAGIC; 
@@ -972,7 +972,7 @@ static int __devinit rme96xx_probe(struc
 	int i;
 	rme96xx_info *s;
 
-	DBG(printk(__FUNCTION__"\n"));
+	DBG(printk("%s\n", __FUNCTION__));
 	
 	if (pcidev->irq == 0) 
 		return -1;
@@ -1501,7 +1501,7 @@ static int rme96xx_release(struct inode 
 {
 	struct dmabuf * dma = (struct dmabuf*) file->private_data;
 	/* int hwp;  ... was unused   HP20020201 */
-	DBG(printk(__FUNCTION__"\n"));
+	DBG(printk("%s\n", __FUNCTION__));
 
 	COMM          ("draining")
 	if (dma->open_mode & FMODE_WRITE) {
--- diff/sound/oss/sb.h	2002-10-16 04:26:42.000000000 +0100
+++ source/sound/oss/sb.h	2004-04-21 10:45:36.137209808 +0100
@@ -110,6 +110,7 @@ typedef struct sb_devc {
 	/* Mixer fields */
 	   int *levels;
 	   mixer_tab *iomap;
+	   size_t iomap_sz; /* number or records in the iomap table */
 	   int mixer_caps, recmask, outmask, supported_devices;
 	   int supported_rec_devices, supported_out_devices;
 	   int my_mixerdev;
--- diff/sound/oss/sb_ess.c	2003-05-21 11:50:10.000000000 +0100
+++ source/sound/oss/sb_ess.c	2004-04-21 10:45:36.138209656 +0100
@@ -1638,8 +1638,10 @@ printk (KERN_INFO "FKS: ess_mixer_init d
 #endif
 		if (devc->duplex) {
 			devc->iomap				= &es1887_mix;
+			devc->iomap_sz                          = ARRAY_SIZE(es1887_mix);
 		} else {
 			devc->iomap				= &es_rec_mix;
+			devc->iomap_sz                          = ARRAY_SIZE(es_rec_mix);
 		}
 		break;
 	default:
@@ -1647,6 +1649,7 @@ printk (KERN_INFO "FKS: ess_mixer_init d
 			devc->supported_devices		= ES688_MIXER_DEVICES;
 			devc->supported_rec_devices	= ES688_RECORDING_DEVICES;
 			devc->iomap					= &es688_mix;
+			devc->iomap_sz                                  = ARRAY_SIZE(es688_mix);
 		} else {
 			/*
 			 * es1688 has 4 bits master vol.
@@ -1656,8 +1659,10 @@ printk (KERN_INFO "FKS: ess_mixer_init d
 			devc->supported_rec_devices	= ES1688_RECORDING_DEVICES;
 			if (devc->submodel < 0x10) {
 				devc->iomap				= &es1688_mix;
+				devc->iomap_sz                          = ARRAY_SIZE(es688_mix);
 			} else {
 				devc->iomap				= &es1688later_mix;
+				devc->iomap_sz                          = ARRAY_SIZE(es1688later_mix);
 			}
 		}
 	}
--- diff/sound/oss/sb_mixer.c	2003-05-21 11:50:10.000000000 +0100
+++ source/sound/oss/sb_mixer.c	2004-04-21 10:45:36.138209656 +0100
@@ -278,6 +278,9 @@ int sb_common_mixer_set(sb_devc * devc, 
 	if (regoffs == 0)
 		return -EINVAL;
 
+	if ((dev < 0) || (dev >= devc->iomap_sz))
+	    return -EINVAL;
+
 	val = sb_getmixer(devc, regoffs);
 	change_bits(devc, &val, dev, LEFT_CHN, left);
 
@@ -333,6 +336,9 @@ static int smw_mixer_set(sb_devc * devc,
 			break;
 
 		default:
+			/* bounds check */
+			if (dev < 0 || dev >= ARRAY_SIZE(smw_mix_regs))
+				return -EINVAL;
 			reg = smw_mix_regs[dev];
 			if (reg == 0)
 				return -EINVAL;
@@ -355,7 +361,7 @@ static int sb_mixer_set(sb_devc * devc, 
 	if (right > 100)
 		right = 100;
 
-	if (dev > 31)
+	if ((dev < 0) || (dev > 31))
 		return -EINVAL;
 
 	if (!(devc->supported_devices & (1 << dev)))	/*
@@ -684,6 +690,7 @@ int sb_mixer_init(sb_devc * devc, struct
 			devc->supported_devices = SBPRO_MIXER_DEVICES;
 			devc->supported_rec_devices = SBPRO_RECORDING_DEVICES;
 			devc->iomap = &sbpro_mix;
+			devc->iomap_sz = ARRAY_SIZE(sbpro_mix);
 			break;
 
 		case MDL_ESS:
@@ -695,6 +702,7 @@ int sb_mixer_init(sb_devc * devc, struct
 			devc->supported_devices = 0;
 			devc->supported_rec_devices = 0;
 			devc->iomap = &sbpro_mix;
+			devc->iomap_sz = ARRAY_SIZE(sbpro_mix);
 			smw_mixer_init(devc);
 			break;
 
@@ -706,11 +714,13 @@ int sb_mixer_init(sb_devc * devc, struct
 			{
 				devc->supported_devices = SB16_MIXER_DEVICES;
 				devc->iomap = &sb16_mix;
+				devc->iomap_sz = ARRAY_SIZE(sb16_mix);
 			}
 			else
 			{
 				devc->supported_devices = ALS007_MIXER_DEVICES;
 				devc->iomap = &als007_mix;
+				devc->iomap_sz = ARRAY_SIZE(als007_mix);
 			}
 			break;
 
--- diff/sound/oss/vwsnd.c	2004-01-19 10:22:59.000000000 +0000
+++ source/sound/oss/vwsnd.c	2004-04-21 10:45:36.140209352 +0100
@@ -196,8 +196,8 @@ static void dbgassert(const char *fcn, i
 #define ASSERT(e)      ((e) ? (void) 0 : dbgassert(__FUNCTION__, __LINE__, #e))
 #define DBGDO(x)            x
 #define DBGX(fmt, args...)  (in_interrupt() ? 0 : printk(KERN_ERR fmt, ##args))
-#define DBGP(fmt, args...)  (DBGX(__FUNCTION__ ": " fmt, ##args))
-#define DBGE(fmt, args...)  (DBGX(__FUNCTION__ fmt, ##args))
+#define DBGP(fmt, args...)  (DBGX("%s: " fmt, __FUNCTION__ , ##args))
+#define DBGE(fmt, args...)  (DBGX("%s" fmt, __FUNCTION__ , ##args))
 #define DBGC(rtn)           (DBGP("calling %s\n", rtn))
 #define DBGR()              (DBGP("returning\n"))
 #define DBGXV(fmt, args...) (shut_up ? 0 : DBGX(fmt, ##args))
--- diff/sound/oss/wavfront.c	2004-04-05 12:57:08.000000000 +0100
+++ source/sound/oss/wavfront.c	2004-04-21 10:45:36.141209200 +0100
@@ -2495,7 +2495,6 @@ static int __init detect_wavefront (int 
 #include <linux/slab.h>
 #include <asm/uaccess.h>
 
-static int errno; 
 
 static int
 wavefront_download_firmware (char *path)
--- diff/sound/pci/mixart/mixart.h	2004-04-05 12:57:08.000000000 +0100
+++ source/sound/pci/mixart/mixart.h	2004-04-21 10:45:36.142209048 +0100
@@ -23,6 +23,7 @@
 #ifndef __SOUND_MIXART_H
 #define __SOUND_MIXART_H
 
+#include <linux/interrupt.h>
 #include <sound/pcm.h>
 
 #define MIXART_DRIVER_VERSION	0x000100	/* 0.1.0 */
--- diff/sound/pcmcia/pdaudiocf/pdaudiocf.c	2004-04-05 12:57:08.000000000 +0100
+++ source/sound/pcmcia/pdaudiocf/pdaudiocf.c	2004-04-21 10:45:36.142209048 +0100
@@ -26,6 +26,7 @@
 #include <pcmcia/cisreg.h>
 #include "pdaudiocf.h"
 #include <sound/initval.h>
+#include <linux/init.h>
 
 /*
  */
--- diff/Documentation/laptop-mode.txt	1970-01-01 01:00:00.000000000 +0100
+++ source/Documentation/laptop-mode.txt	2004-04-21 10:45:33.316638600 +0100
@@ -0,0 +1,665 @@
+How to conserve battery power using laptop-mode
+-----------------------------------------------
+
+Document Author: Bart Samwel (bart@samwel.tk)
+Date created: January 2, 2004
+Last modified: April 3, 2004
+
+Introduction
+------------
+
+Laptopmode is used to minimize the time that the hard disk needs to be spun up,
+to conserve battery power on laptops. It has been reported to cause significant
+power savings.
+
+Contents
+--------
+
+* Introduction
+* The short story
+* Caveats
+* The details
+* Tips & Tricks
+* Control script
+* ACPI integration
+* Monitoring tool
+
+
+The short story
+---------------
+
+If you just want to use it, run the laptop_mode control script (which is included
+at the end of this document) as follows:
+
+# laptop_mode start
+
+Then set your harddisk spindown time to a relatively low value with hdparm:
+
+hdparm -S 4 /dev/hda
+
+The value -S 4 means 20 seconds idle time before spindown. Your harddisk will
+now only spin up when a disk cache miss occurs, or at least once every 10
+minutes to write back any pending changes.
+
+To stop laptop_mode, run "laptop_mode stop".
+
+
+Caveats
+-------
+
+* The downside of laptop mode is that you have a chance of losing up
+  to 10 minutes of work. If you cannot afford this, don't use it! It's
+  wise to turn OFF laptop mode when you're almost out of battery --
+  although this will make the battery run out faster, at least you'll
+  lose less work when it actually runs out. I'm still looking for someone
+  to submit instructions on how to turn off laptop mode when battery is low,
+  e.g., using ACPI events. I don't have a laptop myself, so if you do and
+  you care to contribute such instructions, please do.
+
+* Most desktop hard drives have a very limited lifetime measured in spindown
+  cycles, typically about 50.000 times (it's usually listed on the spec sheet).
+  Check your drive's rating, and don't wear down your drive's lifetime if you
+  don't need to.
+
+* If you mount some of your ext3/reiserfs filesystems with the -n option, then
+  the control script will not be able to remount them correctly. You must set
+  DO_REMOUNTS=0 in the control script, otherwise it will remount them with the
+  wrong options -- or it will fail because it cannot write to /etc/mtab.
+
+* If you have your filesystems listed as type "auto" in fstab, like I did, then
+  the control script will not recognize them as filesystems that need remounting.
+
+* If you have XFS, make SURE that you set the XFS_HZ value in the control script
+  correctly, to the value of HZ of your running kernel. Laptop mode will not
+  work correctly if it is set too low, and you may lose data if it is set too
+  high. The reason for this problem is that XFS does not export its sysctl
+  variables in centisecs (like most other subsystems do) but in "jiffies",
+  which is an internal kernel measure. Once this is fixed things will get better.
+
+
+The details
+-----------
+
+Laptop-mode is controlled by the flag /proc/sys/vm/laptop_mode. When this
+flag is set, any physical disk read operation (that might have caused the
+hard disk to spin up) causes Linux to flush all dirty blocks. The result
+of this is that after a disk has spun down, it will not be spun up anymore
+to write dirty blocks, because those blocks had already been written
+immediately after the most recent read operation
+
+To increase the effectiveness of the laptop_mode strategy, the laptop_mode
+control script increases dirty_expire_centisecs and dirty_writeback_centisecs in
+/proc/sys/vm to about 10 minutes (by default), which means that pages that are
+dirtied are not forced to be written to disk as often. The control script also
+changes the dirty background ratio, so that background writeback of dirty pages
+is not done anymore. Combined with a higher commit value (also 10 minutes) for
+ext3 or ReiserFS filesystems (also done automatically by the control script),
+this results in concentration of disk activity in a small time interval which
+occurs only once every 10 minutes, or whenever the disk is forced to spin up by
+a cache miss. The disk can then be spun down in the periods of inactivity.
+
+If you want to find out which process caused the disk to spin up, you can
+gather information by setting the flag /proc/sys/vm/block_dump. When this flag
+is set, Linux reports all disk read and write operations that take place, and
+all block dirtyings done to files. This makes it possible to debug why a disk
+needs to spin up, and to increase battery life even more. The output of
+block_dump is written to the kernel output, and it can be retrieved using
+"dmesg". When you use block_dump, you may want to turn off klogd, otherwise
+the output of block_dump will be logged, causing disk activity that is not
+normally there.
+
+If 10 minutes is too much or too little downtime for you, you can configure
+this downtime as follows. In the control script, set the MAX_AGE value to the
+maximum number of seconds of disk downtime that you would like. You should
+then set your filesystem's commit interval to the same value. The dirty ratio
+is also configurable from the control script.
+
+If you don't like the idea of the control script remounting your filesystems
+for you, you can change DO_REMOUNTS to 0 in the script.
+
+Thanks to Kiko Piris, the control script can be used to enable laptop mode on
+both the Linux 2.4 and 2.6 series.
+
+
+Tips & Tricks
+-------------
+
+* Bartek Kania reports getting up to 50 minutes of extra battery life (on top
+  of his regular 3 to 3.5 hours) using very aggressive power management (hdparm
+  -B1) and a spindown time of 5 seconds (hdparm -S1).
+
+* You can spin down the disk while playing MP3, by setting the disk readahead
+  to 8MB (hdparm -a 16384). Effectively, the disk will read a complete MP3 at
+  once, and will then spin down while the MP3 is playing. (Thanks to Bartek
+  Kania.)
+
+* Drew Scott Daniels observed: "I don't know why, but when I decrease the number
+  of colours that my display uses it consumes less battery power. I've seen
+  this on powerbooks too. I hope that this is a piece of information that
+  might be useful to the Laptop Mode patch or it's users."
+
+* One thing which will cause disks to spin up is not-present application
+  and dynamic library text pages.  The kernel will load program text off disk
+  on-demand, so each time you invoke an application feature for the first
+  time, the kernel needs to spin the disk up to go and fetch that part of the
+  application.
+
+  So it is useful to increase the disk readahead parameter greatly, so that
+  the kernel will pull all of the executable's pages into memory on the first
+  pagefault.
+
+  The supplied script does this.
+
+* In syslog.conf, you can prefix entries with a dash ``-'' to omit syncing the
+  file after every logging. When you're using laptop-mode and your disk doesn't
+  spin down, this is a likely culprit.
+
+* Richard Atterer observed that laptop mode does not work well with noflushd
+  (http://noflushd.sourceforge.net/), it seems that noflushd prevents laptop-mode
+  from doing its thing.
+
+
+Control script
+--------------
+
+Please note that this control script works for the Linux 2.4 and 2.6 series.
+
+--------------------CONTROL SCRIPT BEGIN------------------------------------------
+#! /bin/sh
+
+# start or stop laptop_mode, best run by a power management daemon when
+# ac gets connected/disconnected from a laptop
+#
+# install as /sbin/laptop_mode
+#
+# Contributors to this script:   Kiko Piris
+#				 Bart Samwel
+#				 Micha Feigin
+#				 Andrew Morton
+#				 Dax Kelson
+#
+# Original Linux 2.4 version by: Jens Axboe
+
+# Remove an option (the first parameter) of the form option=<number> from
+# a mount options string (the rest of the parameters).
+parse_mount_opts () {
+	OPT="$1"
+	shift
+	echo "$*"			| \
+	sed 's/.*/,&,/'			| \
+	sed 's/,'"$OPT"'=[0-9]*,/,/g'	| \
+	sed 's/,,*/,/g'			| \
+	sed 's/^,//'			| \
+	sed 's/,$//'			| \
+	cat -
+}
+
+# Remove an option (the first parameter) without any arguments from
+# a mount option string (the rest of the parameters).
+parse_nonumber_mount_opts () {
+	OPT="$1"
+	shift
+	echo "$*" 			| \
+	sed 's/.*/,&,/'			| \
+	sed 's/,'"$OPT"',/,/g'		| \
+	sed 's/,,*/,/g'			| \
+	sed 's/^,//'			| \
+	sed 's/,$//'			| \
+	cat -
+}
+
+# Find out the state of a yes/no option (e.g. "atime"/"noatime") in
+# fstab for a given filesystem, and use this state to replace the
+# value of the option in another mount options string. The device
+# is the first argument, the option name the second, and the default
+# value the third. The remainder is the mount options string.
+#
+# Example:
+# parse_yesno_opts_wfstab /dev/hda1 atime atime defaults,noatime
+#
+# If fstab contains, say, "rw" for this filesystem, then the result
+# will be "defaults,atime".
+parse_yesno_opts_wfstab () {
+	L_DEV=$1
+	shift
+	OPT=$1
+	shift
+	DEF_OPT=$1
+	shift
+	L_OPTS="$*"
+	PARSEDOPTS1="$(parse_nonumber_mount_opts $OPT $L_OPTS)"
+	PARSEDOPTS1="$(parse_nonumber_mount_opts no$OPT $PARSEDOPTS1)"
+	# Watch for a default atime in fstab
+	FSTAB_OPTS="$(cat /etc/fstab | sed 's/  / /g' | grep ^\ *"$L_DEV " | awk '{ print $4 }')"
+	if [ -z "$(echo "$FSTAB_OPTS" | grep "$OPT")" ] ; then
+		# option not specified in fstab -- choose the default.
+		echo "$PARSEDOPTS1,$DEF_OPT"
+	else
+		# option specified in fstab: extract the value and use it
+		if [ -z "$(echo "$FSTAB_OPTS" | grep "no$OPT")" ] ; then
+			# no$OPT not found -- so we must have $OPT.
+			echo "$PARSEDOPTS1,$OPT"
+		else
+			echo "$PARSEDOPTS1,no$OPT"
+		fi
+	fi
+}
+
+# Find out the state of a numbered option (e.g. "commit=NNN") in
+# fstab for a given filesystem, and use this state to replace the
+# value of the option in another mount options string. The device
+# is the first argument, and the option name the second. The
+# remainder is the mount options string in which the replacement
+# must be done.
+#
+# Example:
+# parse_mount_opts_wfstab /dev/hda1 commit defaults,commit=7
+#
+# If fstab contains, say, "commit=3,rw" for this filesystem, then the
+# result will be "rw,commit=3".
+parse_mount_opts_wfstab () {
+	L_DEV=$1
+	shift
+	OPT=$1
+	shift
+	L_OPTS="$*"
+
+	PARSEDOPTS1="$(parse_mount_opts $OPT $L_OPTS)"
+	# Watch for a default commit in fstab
+	FSTAB_OPTS="$(cat /etc/fstab | sed 's/	/ /g' | grep ^\ *"$L_DEV " | awk '{ print $4 }')"
+	if [ -z "$(echo "$FSTAB_OPTS" | grep "$OPT=")" ] ; then
+		# option not specified in fstab: set it to 0
+		echo "$PARSEDOPTS1,$OPT=0"
+	else
+		# option specified in fstab: extract the value, and use it
+		echo -n "$PARSEDOPTS1,$OPT="
+		echo "$FSTAB_OPTS"	| \
+		sed 's/.*/,&,/'		| \
+		sed 's/.*,'"$OPT"'=//'	| \
+		sed 's/,.*//'		| \
+		cat -
+	fi
+}
+
+KLEVEL="$(uname -r | cut -c1-3)"
+case "$KLEVEL" in
+	"2.4"|"2.6")
+		true
+		;;
+	*)
+		echo "Unhandled kernel version: $KLEVEL ('uname -r' = '$(uname -r)')"
+		exit 1
+		;;
+esac
+
+# Shall we remount journaled fs. with appropiate commit interval? (1=yes)
+DO_REMOUNTS=1
+
+# age time, in seconds. should be put into a sysconfig file
+MAX_AGE=600
+
+# Dirty synchronous ratio.  At this percentage of dirty pages the process which
+# calls write() does its own writeback
+DIRTY_RATIO=40
+
+#
+# Allowed dirty background ratio, in percent.  Once DIRTY_RATIO has been
+# exceeded, the kernel will wake pdflush which will then reduce the amount
+# of dirty memory to dirty_background_ratio.  Set this nice and low, so once
+# some writeout has commenced, we do a lot of it.
+#
+DIRTY_BACKGROUND_RATIO=5
+
+READAHEAD=4096		# kilobytes
+
+# kernel default dirty buffer age
+DEF_AGE=30
+DEF_UPDATE=5
+DEF_DIRTY_BACKGROUND_RATIO=10
+DEF_DIRTY_RATIO=40
+DEF_XFS_AGE_BUFFER=15
+DEF_XFS_SYNC_INTERVAL=30
+
+# This must be adjusted manually to the value of HZ in the running kernel,
+# until the XFS people change their external interfaces to work in centisecs
+# like the rest of the external world. Unfortunately this cannot be automated. :(
+XFS_HZ=1000
+
+if [ ! -e /proc/sys/vm/laptop_mode ]; then
+	echo "Kernel is not patched with laptop_mode patch."
+	exit 1
+fi
+
+if [ ! -w /proc/sys/vm/laptop_mode ]; then
+	echo "You do not have enough privileges to enable laptop_mode."
+	exit 1
+fi
+
+case "$1" in
+	start)
+		AGE=$((100*$MAX_AGE))
+		XFS_AGE=$(($XFS_HZ*$MAX_AGE))
+		echo -n "Starting laptop_mode"
+
+		if [ -d /proc/sys/vm/pagebuf ] ; then
+			# This only needs to be set, not reset -- it is only used when
+			# laptop mode is enabled.
+			echo $XFS_AGE > /proc/sys/vm/pagebuf/lm_flush_age
+			echo $XFS_AGE > /proc/sys/fs/xfs/lm_sync_interval
+		elif [ -f /proc/sys/fs/xfs/lm_age_buffer ] ; then
+			# The same goes for these.
+			echo $XFS_AGE > /proc/sys/fs/xfs/lm_age_buffer
+			echo $XFS_AGE > /proc/sys/fs/xfs/lm_sync_interval
+		elif [ -f /proc/sys/fs/xfs/age_buffer ] ; then
+			# But not for these -- they are also used in normal
+			# operation.
+			echo $XFS_AGE > /proc/sys/fs/xfs/age_buffer
+			echo $XFS_AGE > /proc/sys/fs/xfs/sync_interval
+		fi
+
+		case "$KLEVEL" in
+			"2.4")
+				echo "1"				> /proc/sys/vm/laptop_mode
+				echo "30 500 0 0 $AGE $AGE 60 20 0"	> /proc/sys/vm/bdflush
+				;;
+			"2.6")
+				echo "5"				> /proc/sys/vm/laptop_mode
+				echo "$AGE"				> /proc/sys/vm/dirty_writeback_centisecs
+				echo "$AGE"				> /proc/sys/vm/dirty_expire_centisecs
+				echo "$DIRTY_RATIO"			> /proc/sys/vm/dirty_ratio
+				echo "$DIRTY_BACKGROUND_RATIO"		> /proc/sys/vm/dirty_background_ratio
+				;;
+		esac
+		if [ $DO_REMOUNTS -eq 1 ]; then
+			cat /etc/mtab | while read DEV MP FST OPTS DUMP PASS ; do
+				PARSEDOPTS="$(parse_mount_opts "$OPTS")"
+				case "$FST" in
+					"ext3"|"reiserfs")
+						PARSEDOPTS="$(parse_mount_opts commit "$OPTS")"
+						mount $DEV -t $FST $MP -o remount,$PARSEDOPTS,commit=$MAX_AGE,noatime
+						;;
+					"xfs")
+						mount $DEV -t $FST $MP -o remount,$OPTS,noatime
+						;;
+				esac
+				if [ -b $DEV ] ; then
+					blockdev --setra $(($READAHEAD * 2)) $DEV
+				fi
+			done
+		fi
+		echo "."
+		;;
+	stop)
+		U_AGE=$((100*$DEF_UPDATE))
+		B_AGE=$((100*$DEF_AGE))
+		echo -n "Stopping laptop_mode"
+		echo "0" > /proc/sys/vm/laptop_mode
+		if [ -f /proc/sys/fs/xfs/age_buffer ] && [ ! -f /proc/sys/fs/xfs/lm_age_buffer ] ; then
+			# These need to be restored though, if there are no lm_*.
+			echo "$(($XFS_HZ*$DEF_XFS_AGE_BUFFER))" 	> /proc/sys/fs/xfs/age_buffer
+			echo "$(($XFS_HZ*$DEF_XFS_SYNC_INTERVAL))" 	> /proc/sys/fs/xfs/sync_interval
+		fi
+		case "$KLEVEL" in
+			"2.4")
+				echo "30 500 0 0 $U_AGE $B_AGE 60 20 0"	> /proc/sys/vm/bdflush
+				;;
+			"2.6")
+				echo "$U_AGE"				> /proc/sys/vm/dirty_writeback_centisecs
+				echo "$B_AGE"				> /proc/sys/vm/dirty_expire_centisecs
+				echo "$DEF_DIRTY_RATIO"			> /proc/sys/vm/dirty_ratio
+				echo "$DEF_DIRTY_BACKGROUND_RATIO"	> /proc/sys/vm/dirty_background_ratio
+				;;
+		esac
+		if [ $DO_REMOUNTS -eq 1 ]; then
+			cat /etc/mtab | while read DEV MP FST OPTS DUMP PASS ; do
+				# Reset commit and atime options to defaults.
+				case "$FST" in
+					"ext3"|"reiserfs")
+						PARSEDOPTS="$(parse_mount_opts_wfstab $DEV commit $OPTS)"
+						PARSEDOPTS="$(parse_yesno_opts_wfstab $DEV atime atime $PARSEDOPTS)"
+						mount $DEV -t $FST $MP -o remount,$PARSEDOPTS
+						;;
+					"xfs")
+						PARSEDOPTS="$(parse_yesno_opts_wfstab $DEV atime atime $OPTS)"
+						mount $DEV -t $FST $MP -o remount,$PARSEDOPTS
+						;;
+				esac
+				if [ -b $DEV ] ; then
+					blockdev --setra 256 $DEV
+				fi
+			done
+		fi
+		echo "."
+		;;
+	*)
+		echo "Usage: $0 {start|stop}"
+		;;
+
+esac
+
+exit 0
+
+--------------------CONTROL SCRIPT END--------------------------------------------
+
+
+ACPI integration
+----------------
+
+Dax Kelson submitted this so that the ACPI acpid daemon will
+kick off the laptop_mode script and run hdparm.
+
+---------------------------/etc/acpi/events/ac_adapter BEGIN-------------------------------------------
+event=ac_adapter
+action=/etc/acpi/actions/battery.sh
+---------------------------/etc/acpi/events/ac_adapter END-------------------------------------------
+
+---------------------------/etc/acpi/actions/battery.sh BEGIN-------------------------------------------
+#!/bin/sh
+
+# cpu throttling
+# cat /proc/acpi/processor/CPU0/throttling for more info
+ACAD_THR=0
+BATT_THR=2
+
+# spindown time for HD (man hdparm for valid values)
+# I prefer 2 hours for acad and 20 seconds for batt
+ACAD_HD=244
+BATT_HD=4
+
+# ac/battery event handler
+
+status=`awk '/^state: / { print $2 }' /proc/acpi/ac_adapter/AC/state`
+
+case $status in
+        "on-line")
+                echo "Setting HD spindown to 2 hours"
+                /sbin/laptop-mode stop
+                /sbin/hdparm -S $ACAD_HD /dev/hda > /dev/null 2>&1
+                /sbin/hdparm -B 255 /dev/hda > /dev/null 2>&1
+                #echo -n $ACAD_CPU:$ACAD_THR > /proc/acpi/processor/CPU0/limit
+                exit 0
+        ;;
+        "off-line")
+                echo "Setting HD spindown to 20 seconds"
+                /sbin/laptop-mode start
+                /sbin/hdparm -S $BATT_HD /dev/hda > /dev/null 2>&1
+                /sbin/hdparm -B 1 /dev/hda > /dev/null 2>&1
+                #echo -n $BATT_CPU:$BATT_THR > /proc/acpi/processor/CPU0/limit
+                exit 0
+        ;;
+esac
+---------------------------/etc/acpi/actions/battery.sh END-------------------------------------------
+
+Monitoring tool
+---------------
+
+Bartek Kania submitted this, it can be used to measure how much time your disk
+spends spun up/down.
+
+---------------------------dslm.c BEGIN-------------------------------------------
+/*
+ * Simple Disk Sleep Monitor
+ *  by Bartek Kania
+ * Licenced under the GPL
+ */
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <time.h>
+#include <string.h>
+#include <signal.h>
+#include <sys/ioctl.h>
+#include <linux/hdreg.h>
+
+#ifdef DEBUG
+#define D(x) x
+#else
+#define D(x)
+#endif
+
+int endit = 0;
+
+/* Check if the disk is in powersave-mode
+ * Most of the code is stolen from hdparm.
+ * 1 = active, 0 = standby/sleep, -1 = unknown */
+int check_powermode(int fd)
+{
+    unsigned char args[4] = {WIN_CHECKPOWERMODE1,0,0,0};
+    int state;
+
+    if (ioctl(fd, HDIO_DRIVE_CMD, &args)
+	&& (args[0] = WIN_CHECKPOWERMODE2) /* try again with 0x98 */
+	&& ioctl(fd, HDIO_DRIVE_CMD, &args)) {
+	if (errno != EIO || args[0] != 0 || args[1] != 0) {
+	    state = -1; /* "unknown"; */
+	} else
+	    state = 0; /* "sleeping"; */
+    } else {
+	state = (args[2] == 255) ? 1 : 0;
+    }
+    D(printf(" drive state is:  %d\n", state));
+
+    return state;
+}
+
+char *state_name(int i)
+{
+    if (i == -1) return "unknown";
+    if (i == 0) return "sleeping";
+    if (i == 1) return "active";
+
+    return "internal error";
+}
+
+char *myctime(time_t time)
+{
+    char *ts = ctime(&time);
+    ts[strlen(ts) - 1] = 0;
+
+    return ts;
+}
+
+void measure(int fd)
+{
+    time_t start_time;
+    int last_state;
+    time_t last_time;
+    int curr_state;
+    time_t curr_time = 0;
+    time_t time_diff;
+    time_t active_time = 0;
+    time_t sleep_time = 0;
+    time_t unknown_time = 0;
+    time_t total_time = 0;
+    int changes = 0;
+    float tmp;
+
+    printf("Starting measurements\n");
+
+    last_state = check_powermode(fd);
+    start_time = last_time = time(0);
+    printf("  System is in state %s\n\n", state_name(last_state));
+
+    while(!endit) {
+	sleep(1);
+	curr_state = check_powermode(fd);
+
+	if (curr_state != last_state || endit) {
+	    changes++;
+	    curr_time = time(0);
+	    time_diff = curr_time - last_time;
+
+	    if (last_state == 1) active_time += time_diff;
+	    else if (last_state == 0) sleep_time += time_diff;
+	    else unknown_time += time_diff;
+
+	    last_state = curr_state;
+	    last_time = curr_time;
+
+	    printf("%s: State-change to %s\n", myctime(curr_time),
+		   state_name(curr_state));
+	}
+    }
+    changes--; /* Compensate for SIGINT */
+
+    total_time = time(0) - start_time;
+    printf("\nTotal running time:  %lus\n", curr_time - start_time);
+    printf(" State changed %d times\n", changes);
+
+    tmp = (float)sleep_time / (float)total_time * 100;
+    printf(" Time in sleep state:   %lus (%.2f%%)\n", sleep_time, tmp);
+    tmp = (float)active_time / (float)total_time * 100;
+    printf(" Time in active state:  %lus (%.2f%%)\n", active_time, tmp);
+    tmp = (float)unknown_time / (float)total_time * 100;
+    printf(" Time in unknown state: %lus (%.2f%%)\n", unknown_time, tmp);
+}
+
+void ender(int s)
+{
+    endit = 1;
+}
+
+void usage()
+{
+    puts("usage: dslm [-w <time>] <disk>");
+    exit(0);
+}
+
+int main(int ac, char **av)
+{
+    int fd;
+    char *disk = 0;
+    int settle_time = 60;
+
+    /* Parse the simple command-line */
+    if (ac == 2)
+	disk = av[1];
+    else if (ac == 4) {
+	settle_time = atoi(av[2]);
+	disk = av[3];
+    } else
+	usage();
+
+    if (!(fd = open(disk, O_RDONLY|O_NONBLOCK))) {
+	printf("Can't open %s, because: %s\n", disk, strerror(errno));
+	exit(-1);
+    }
+
+    if (settle_time) {
+	printf("Waiting %d seconds for the system to settle down to "
+	       "'normal'\n", settle_time);
+	sleep(settle_time);
+    } else
+	puts("Not waiting for system to settle down");
+
+    signal(SIGINT, ender);
+
+    measure(fd);
+
+    close(fd);
+
+    return 0;
+}
+---------------------------dslm.c END---------------------------------------------
--- diff/Documentation/networking/s2io.txt	1970-01-01 01:00:00.000000000 +0100
+++ source/Documentation/networking/s2io.txt	2004-04-21 10:45:33.317638448 +0100
@@ -0,0 +1,48 @@
+S2IO Technologies XFrame 10 Gig adapter.
+-------------------------------------------
+
+I. Module loadable parameters.
+When loaded as a module, the driver provides a host of Module loadable
+parameters, so the device can be tuned as per the users needs.
+A list of the Module params is given below.
+(i)	ring_num: This can be used to program the number of
+		 receive rings used in the driver.
+(ii)	ring_len: This defines the number of descriptors each ring
+		 can have. There can be a maximum of 8 rings.
+(iii)	frame_len: This is an array of size 8. Using this we can 
+		 set the maximum size of the received frame that can
+		 be steered into the corrsponding receive ring.	
+(iv)	fifo_num: This defines the number of Tx FIFOs thats used in
+		 the driver. 
+(v)	fifo_len: Each element defines the number of 
+ 		 Tx descriptors that can be associated with each 
+		 corresponding FIFO. There are a maximum of 8 FIFOs.
+(vi)	tx_prio: This is a bool, if module is loaded with a non-zero
+		value for tx_prio multi FIFO scheme is activated.
+(vii)	rx_prio: This is a bool, if module is loaded with a non-zero
+		value for tx_prio multi RING scheme is activated.
+(viii)	latency_timer: The value given against this param will be
+		 loaded	into the latency timer register in PCI Config
+		 space, else the register is left with its reset value.
+
+II. Performance tuning.
+ By changing a few sysctl parameters.
+	Copy the following lines into a file and run the following command,
+	"sysctl -p <file_name>"
+### IPV4 specific settings
+net.ipv4.tcp_timestamps = 0 # turns TCP timestamp support off, default 1, reduces CPU use
+net.ipv4.tcp_sack = 0 # turn SACK support off, default on
+# on systems with a VERY fast bus -> memory interface this is the big gainer
+net.ipv4.tcp_rmem = 10000000 10000000 10000000 # sets min/default/max TCP read buffer, default 4096 87380 174760
+net.ipv4.tcp_wmem = 10000000 10000000 10000000 # sets min/pressure/max TCP write buffer, default 4096 16384 131072
+net.ipv4.tcp_mem = 10000000 10000000 10000000 # sets min/pressure/max TCP buffer space, default 31744 32256 32768
+                                                                                
+### CORE settings (mostly for socket and UDP effect)
+net.core.rmem_max = 524287 # maximum receive socket buffer size, default 131071
+net.core.wmem_max = 524287 # maximum send socket buffer size, default 131071
+net.core.rmem_default = 524287 # default receive socket buffer size, default 65535
+net.core.wmem_default = 524287 # default send socket buffer size, default 65535
+net.core.optmem_max = 524287 # maximum amount of option memory buffers, default 10240
+net.core.netdev_max_backlog = 300000 # number of unprocessed input packets before kernel starts dropping them, default 300
+---End of performance tuning file---
+
--- diff/Documentation/usb/linux.inf	1970-01-01 01:00:00.000000000 +0100
+++ source/Documentation/usb/linux.inf	2004-04-21 10:45:33.319638144 +0100
@@ -0,0 +1,200 @@
+; MS-Windows driver config matching some basic modes of the
+; Linux-USB Ethernet/RNDIS gadget firmware:
+;
+;  - RNDIS plus CDC Ethernet ... this may be familiar as a DOCSIS
+;    cable modem profile, and supports most non-Microsoft USB hosts
+;
+;  - RNDIS plus CDC Subset ... used by hardware that incapable of
+;    full CDC Ethernet support.
+;
+; Microsoft only directly supports RNDIS drivers, and bundled them into XP.
+; The Microsoft "Remote NDIS USB Driver Kit" is currently found at:
+;   http://www.microsoft.com/whdc/hwdev/resources/HWservices/rndis.mspx
+
+
+[Version]
+Signature           = "$CHICAGO$"
+Class               = Net
+ClassGUID           = {4d36e972-e325-11ce-bfc1-08002be10318}
+Provider            = %Linux%
+Compatible          = 1
+MillenniumPreferred = .ME
+DriverVer           = 03/30/2004,0.0.0.0
+; catalog file would be used by WHQL
+;CatalogFile         = Linux.cat
+
+[Manufacturer]
+%Linux%          = LinuxDevices,NT.5.1
+
+[LinuxDevices]
+; NetChip IDs, used by both firmware modes
+%LinuxDevice%    = RNDIS, USB\VID_0525&PID_a4a2
+
+[LinuxDevices.NT.5.1]
+%LinuxDevice%    = RNDIS.NT.5.1, USB\VID_0525&PID_a4a1
+
+[ControlFlags]
+ExcludeFromSelect=*
+
+; Windows 98, Windows 98 Second Edition specific sections --------
+
+[RNDIS]
+DeviceID        = usb8023
+MaxInstance     = 512
+DriverVer           = 03/30/2004,0.0.0.0
+AddReg          = RNDIS_AddReg_98, RNDIS_AddReg_Common
+
+[RNDIS_AddReg_98]
+HKR, ,               DevLoader,        0, *ndis
+HKR, ,               DeviceVxDs,       0, usb8023.sys
+HKR, NDIS,           LogDriverName,    0, "usb8023"
+HKR, NDIS,           MajorNdisVersion, 1, 5
+HKR, NDIS,           MinorNdisVersion, 1, 0
+HKR, Ndi\Interfaces, DefUpper,         0, "ndis3,ndis4,ndis5"
+HKR, Ndi\Interfaces, DefLower,         0, "ethernet"
+HKR, Ndi\Interfaces, UpperRange,       0, "ndis3,ndis4,ndis5"
+HKR, Ndi\Interfaces, LowerRange,       0, "ethernet"
+HKR, Ndi\Install,    ndis3,            0, "RNDIS_Install_98"
+HKR, Ndi\Install,    ndis4,            0, "RNDIS_Install_98"
+HKR, Ndi\Install,    ndis5,            0, "RNDIS_Install_98"
+HKR, Ndi,            DeviceId,         0, "USB\VID_0525&PID_a4a1"
+
+[RNDIS_Install_98]
+CopyFiles=RNDIS_CopyFiles_98
+
+[RNDIS_CopyFiles_98]
+usb8023.sys, usb8023w.sys, , 0 
+rndismp.sys, rndismpw.sys, , 0 
+
+; Windows Millennium Edition specific sections --------------------
+
+[RNDIS.ME]
+DeviceID        = usb8023
+MaxInstance     = 512
+DriverVer           = 03/30/2004,0.0.0.0
+AddReg          = RNDIS_AddReg_ME, RNDIS_AddReg_Common
+Characteristics = 0x84   ; NCF_PHYSICAL + NCF_HAS_UI
+BusType         = 15
+
+[RNDIS_AddReg_ME]
+HKR, ,               DevLoader,        0, *ndis
+HKR, ,               DeviceVxDs,       0, usb8023.sys
+HKR, NDIS,           LogDriverName,    0, "usb8023"
+HKR, NDIS,           MajorNdisVersion, 1, 5
+HKR, NDIS,           MinorNdisVersion, 1, 0
+HKR, Ndi\Interfaces, DefUpper,         0, "ndis3,ndis4,ndis5"
+HKR, Ndi\Interfaces, DefLower,         0, "ethernet"
+HKR, Ndi\Interfaces, UpperRange,       0, "ndis3,ndis4,ndis5"
+HKR, Ndi\Interfaces, LowerRange,       0, "ethernet"
+HKR, Ndi\Install,    ndis3,            0, "RNDIS_Install_ME"
+HKR, Ndi\Install,    ndis4,            0, "RNDIS_Install_ME"
+HKR, Ndi\Install,    ndis5,            0, "RNDIS_Install_ME"
+HKR, Ndi,            DeviceId,         0, "USB\VID_0525&PID_a4a1"
+
+[RNDIS_Install_ME]
+CopyFiles=RNDIS_CopyFiles_ME
+
+[RNDIS_CopyFiles_ME]
+usb8023.sys, usb8023m.sys, , 0 
+rndismp.sys, rndismpm.sys, , 0 
+
+; Windows 2000 specific sections ---------------------------------
+
+[RNDIS.NT]
+Characteristics = 0x84   ; NCF_PHYSICAL + NCF_HAS_UI
+BusType         = 15
+DriverVer           = 03/30/2004,0.0.0.0
+AddReg          = RNDIS_AddReg_NT, RNDIS_AddReg_Common
+CopyFiles       = RNDIS_CopyFiles_NT
+
+[RNDIS.NT.Services]
+AddService = USB_RNDIS, 2, RNDIS_ServiceInst_NT, RNDIS_EventLog
+
+[RNDIS_CopyFiles_NT]
+; no rename of files on Windows 2000, use the 'k' names as is
+usb8023k.sys, , , 0 
+rndismpk.sys, , , 0 
+
+[RNDIS_ServiceInst_NT]
+DisplayName     = %ServiceDisplayName%
+ServiceType     = 1 
+StartType       = 3 
+ErrorControl    = 1 
+ServiceBinary   = %12%\usb8023k.sys    
+LoadOrderGroup  = NDIS
+AddReg          = RNDIS_WMI_AddReg_NT
+
+[RNDIS_WMI_AddReg_NT]
+HKR, , MofImagePath, 0x00020000, "System32\drivers\rndismpk.sys"
+
+; Windows XP specific sections -----------------------------------
+
+[RNDIS.NT.5.1]
+Characteristics = 0x84   ; NCF_PHYSICAL + NCF_HAS_UI
+BusType         = 15
+DriverVer           = 03/30/2004,0.0.0.0
+AddReg          = RNDIS_AddReg_NT, RNDIS_AddReg_Common
+; no copyfiles - the files are already in place
+
+[RNDIS.NT.5.1.Services]
+AddService      = USB_RNDIS, 2, RNDIS_ServiceInst_51, RNDIS_EventLog
+
+[RNDIS_ServiceInst_51]
+DisplayName     = %ServiceDisplayName%
+ServiceType     = 1 
+StartType       = 3 
+ErrorControl    = 1 
+ServiceBinary   = %12%\usb8023.sys    
+LoadOrderGroup  = NDIS
+AddReg          = RNDIS_WMI_AddReg_51
+
+[RNDIS_WMI_AddReg_51]
+HKR, , MofImagePath, 0x00020000, "System32\drivers\rndismp.sys"
+
+; Windows 2000 and Windows XP common sections --------------------
+
+[RNDIS_AddReg_NT]
+HKR, Ndi,               Service,        0, "USB_RNDIS"
+HKR, Ndi\Interfaces,    UpperRange,     0, "ndis5" 
+HKR, Ndi\Interfaces,    LowerRange,     0, "ethernet"
+
+[RNDIS_EventLog]
+AddReg = RNDIS_EventLog_AddReg
+
+[RNDIS_EventLog_AddReg]
+HKR, , EventMessageFile, 0x00020000, "%%SystemRoot%%\System32\netevent.dll"
+HKR, , TypesSupported,   0x00010001, 7
+
+; Common Sections -------------------------------------------------
+
+[RNDIS_AddReg_Common]
+HKR, NDI\params\NetworkAddress, ParamDesc,  0, %NetworkAddress%
+HKR, NDI\params\NetworkAddress, type,       0, "edit"
+HKR, NDI\params\NetworkAddress, LimitText,  0, "12"
+HKR, NDI\params\NetworkAddress, UpperCase,  0, "1"
+HKR, NDI\params\NetworkAddress, default,    0, " "
+HKR, NDI\params\NetworkAddress, optional,   0, "1"
+
+[SourceDisksNames]
+1=%SourceDisk%,,1
+
+[SourceDisksFiles]
+usb8023m.sys=1
+rndismpm.sys=1
+usb8023w.sys=1
+rndismpw.sys=1
+usb8023k.sys=1
+rndismpk.sys=1
+
+[DestinationDirs]
+RNDIS_CopyFiles_98    = 10, system32/drivers
+RNDIS_CopyFiles_ME    = 10, system32/drivers
+RNDIS_CopyFiles_NT    = 12
+
+[Strings]
+ServiceDisplayName    = "USB Remote NDIS Network Device Driver"
+NetworkAddress        = "Network Address"
+Linux                 = "Linux Developer Community"
+LinuxDevice           = "Linux USB Ethernet/RNDIS Gadget"
+SourceDisk            = "Ethernet/RNDIS Gadget Driver Install Disk"
+
--- diff/arch/arm/boot/compressed/ice-dcc.S	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/boot/compressed/ice-dcc.S	2004-04-21 10:45:33.344634344 +0100
@@ -0,0 +1,17 @@
+
+
+	.text
+
+	.global	icedcc_putc
+
+icedcc_putc:
+	mov	r2, #0x4000000
+1:
+	subs	r2, r2, #1
+	movlt	pc, r14
+	mrc	p14, 0, r1, c0, c0, 0
+	tst	r1, #2
+	bne	1b
+
+	mcr	p14, 0, r0, c1, c0, 0
+	mov	pc, r14
--- diff/arch/arm/configs/bast_defconfig	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/configs/bast_defconfig	2004-04-21 10:45:33.345634192 +0100
@@ -0,0 +1,802 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_ARM=y
+CONFIG_MMU=y
+CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+# CONFIG_CLEAN_COMPILE is not set
+CONFIG_STANDALONE=y
+CONFIG_BROKEN=y
+CONFIG_BROKEN_ON_SMP=y
+
+#
+# General setup
+#
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+CONFIG_LOG_BUF_SHIFT=16
+# CONFIG_IKCONFIG is not set
+# CONFIG_EMBEDDED is not set
+CONFIG_KALLSYMS=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+# CONFIG_MODULE_UNLOAD is not set
+CONFIG_OBSOLETE_MODPARM=y
+# CONFIG_MODVERSIONS is not set
+CONFIG_KMOD=y
+
+#
+# System Type
+#
+# CONFIG_ARCH_ADIFCC is not set
+# CONFIG_ARCH_ANAKIN is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_CAMELOT is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_IOP3XX is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_SHARK is not set
+CONFIG_ARCH_S3C2410=y
+
+#
+# CLPS711X/EP721X Implementations
+#
+
+#
+# Epxa10db
+#
+
+#
+# Footbridge Implementations
+#
+
+#
+# IOP3xx Implementation Options
+#
+# CONFIG_ARCH_IOP310 is not set
+# CONFIG_ARCH_IOP321 is not set
+
+#
+# IOP3xx Chipset Features
+#
+
+#
+# Intel PXA250/210 Implementations
+#
+
+#
+# SA11x0 Implementations
+#
+
+#
+# S3C2410 Implementations
+#
+CONFIG_ARCH_BAST=y
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_ARM920T=y
+CONFIG_CPU_32v4=y
+CONFIG_CPU_ABRT_EV4T=y
+CONFIG_CPU_CACHE_V4WT=y
+CONFIG_CPU_COPY_V4WB=y
+CONFIG_CPU_TLB_V4WBI=y
+
+#
+# Processor Features
+#
+# CONFIG_ARM_THUMB is not set
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+
+#
+# General setup
+#
+# CONFIG_ZBOOT_ROM is not set
+CONFIG_ZBOOT_ROM_TEXT=0
+CONFIG_ZBOOT_ROM_BSS=0
+# CONFIG_HOTPLUG is not set
+
+#
+# At least one math emulation must be selected
+#
+CONFIG_FPE_NWFPE=y
+CONFIG_FPE_NWFPE_XP=y
+# CONFIG_FPE_FASTFPE is not set
+CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_AOUT=y
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Generic Driver Options
+#
+# CONFIG_PM is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="root=/dev/hda1 ro init=/bin/bash console=ttySAC0"
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Parallel port support
+#
+CONFIG_PARPORT=y
+CONFIG_PARPORT_PC=y
+CONFIG_PARPORT_PC_CML1=y
+# CONFIG_PARPORT_SERIAL is not set
+CONFIG_PARPORT_PC_FIFO=y
+CONFIG_PARPORT_PC_SUPERIO=y
+# CONFIG_PARPORT_ARC is not set
+CONFIG_PARPORT_OTHER=y
+CONFIG_PARPORT_1284=y
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_PARTITIONS is not set
+# CONFIG_MTD_CONCAT is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_CFI_STAA is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+# CONFIG_MTD_EDB7312 is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLKMTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_PARIDE is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_INITRD=y
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Networking support
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_PACKET is not set
+# CONFIG_NETLINK_DEV is not set
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_INET_ECN is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_IPV6 is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_NETFILTER is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+CONFIG_IPV6_SCTP__=y
+# CONFIG_IP_SCTP is not set
+# CONFIG_ATM is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+# CONFIG_MII is not set
+# CONFIG_SMC91X is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_PLIP is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+# CONFIG_HOSTAP is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_SHAPER is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+# CONFIG_IRDA is not set
+
+#
+# Bluetooth support
+#
+# CONFIG_BT is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=y
+CONFIG_BLK_DEV_IDE=y
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+CONFIG_BLK_DEV_IDEDISK=y
+# CONFIG_IDEDISK_MULTI_MODE is not set
+# CONFIG_IDEDISK_STROKE is not set
+CONFIG_BLK_DEV_IDECD=y
+CONFIG_BLK_DEV_IDETAPE=m
+CONFIG_BLK_DEV_IDEFLOPPY=m
+# CONFIG_IDE_TASK_IOCTL is not set
+# CONFIG_IDE_TASKFILE_IO is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_BLK_DEV_IDE_BAST=y
+# CONFIG_BLK_DEV_IDEDMA is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_DMA_NONPCI is not set
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI device support
+#
+# CONFIG_SCSI is not set
+
+#
+# I2O device support
+#
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN_BOOL is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+# CONFIG_INPUT_TSLIBDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+CONFIG_SERIO=y
+CONFIG_SERIO_I8042=y
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_CT82C710 is not set
+# CONFIG_SERIO_PARKBD is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=y
+# CONFIG_MOUSE_PS2_SYNAPTICS is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+CONFIG_SERIAL_NONSTANDARD=y
+# CONFIG_COMPUTONE is not set
+# CONFIG_ROCKETPORT is not set
+# CONFIG_CYCLADES is not set
+# CONFIG_DIGIEPCA is not set
+# CONFIG_DIGI is not set
+# CONFIG_MOXA_INTELLIO is not set
+# CONFIG_MOXA_SMARTIO is not set
+# CONFIG_ISI is not set
+# CONFIG_SYNCLINK is not set
+# CONFIG_SYNCLINKMP is not set
+# CONFIG_N_HDLC is not set
+# CONFIG_RISCOM8 is not set
+# CONFIG_SPECIALIX is not set
+# CONFIG_SX is not set
+# CONFIG_RIO is not set
+# CONFIG_STALDRV is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=8
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+# CONFIG_SERIAL_8250_MULTIPORT is not set
+# CONFIG_SERIAL_8250_RSA is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_S3C2410=y
+CONFIG_SERIAL_S3C2410_CONSOLE=y
+# CONFIG_SERIAL_DZ is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=256
+CONFIG_PRINTER=y
+# CONFIG_LP_CONSOLE is not set
+CONFIG_PPDEV=y
+# CONFIG_TIPAR is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+CONFIG_I2C_CHARDEV=m
+
+#
+# I2C Algorithms
+#
+CONFIG_I2C_ALGOBIT=m
+# CONFIG_I2C_ALGOPCF is not set
+
+#
+# I2C Hardware Bus support
+#
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+# CONFIG_I2C_PHILIPSPAR is not set
+# CONFIG_SCx200_ACB is not set
+
+#
+# I2C Hardware Sensors Chip support
+#
+CONFIG_I2C_SENSOR=m
+# CONFIG_SENSORS_ADM1021 is not set
+CONFIG_SENSORS_EEPROM=m
+# CONFIG_SENSORS_IT87 is not set
+CONFIG_SENSORS_LM75=m
+CONFIG_SENSORS_LM78=m
+CONFIG_SENSORS_LM85=m
+# CONFIG_SENSORS_VIA686A is not set
+# CONFIG_SENSORS_W83781D is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Mice
+#
+# CONFIG_BUSMOUSE is not set
+# CONFIG_QIC02_TAPE is not set
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_NVRAM is not set
+CONFIG_RTC=y
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_XATTR=y
+# CONFIG_EXT3_FS_POSIX_ACL is not set
+# CONFIG_EXT3_FS_SECURITY is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_MINIX_FS is not set
+CONFIG_ROMFS_FS=y
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+# CONFIG_DEVFS_FS is not set
+CONFIG_DEVPTS_FS=y
+# CONFIG_DEVPTS_FS_XATTR is not set
+# CONFIG_TMPFS is not set
+# CONFIG_HUGETLBFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_JFFS_FS=y
+CONFIG_JFFS_FS_VERBOSE=0
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+# CONFIG_JFFS2_FS_NAND is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+# CONFIG_NFS_V3 is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+# CONFIG_EXPORTFS is not set
+CONFIG_SUNRPC=y
+# CONFIG_SUNRPC_GSS is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_INTERMEZZO_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_ACORN_PARTITION=y
+CONFIG_ACORN_PARTITION_CUMANA=y
+CONFIG_ACORN_PARTITION_EESOX=y
+CONFIG_ACORN_PARTITION_ICS=y
+CONFIG_ACORN_PARTITION_ADFS=y
+CONFIG_ACORN_PARTITION_POWERTEC=y
+CONFIG_ACORN_PARTITION_RISCIX=y
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+CONFIG_BSD_DISKLABEL=y
+# CONFIG_MINIX_SUBPARTITION is not set
+CONFIG_SOLARIS_X86_PARTITION=y
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_NEC98_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+CONFIG_NLS=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS_DEFAULT="iso8859-1"
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Graphics support
+#
+CONFIG_FB=y
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+# CONFIG_MCP is not set
+
+#
+# Console Switches
+#
+# CONFIG_SWITCHES is not set
+
+#
+# USB support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# Kernel hacking
+#
+CONFIG_FRAME_POINTER=y
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_INFO=y
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_WAITQ is not set
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_ERRORS is not set
+CONFIG_DEBUG_LL=y
+CONFIG_DEBUG_LL_PRINTK=y
+CONFIG_DEBUG_S3C2410_PORT=y
+CONFIG_DEBUG_S3C2410_UART=0
+
+#
+# Security options
+#
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+CONFIG_CRC32=y
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
--- diff/arch/arm/configs/s3c2410_defconfig	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/configs/s3c2410_defconfig	2004-04-21 10:45:33.347633888 +0100
@@ -0,0 +1,799 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_ARM=y
+CONFIG_MMU=y
+CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+# CONFIG_CLEAN_COMPILE is not set
+CONFIG_STANDALONE=y
+CONFIG_BROKEN=y
+CONFIG_BROKEN_ON_SMP=y
+
+#
+# General setup
+#
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+CONFIG_LOG_BUF_SHIFT=16
+# CONFIG_IKCONFIG is not set
+# CONFIG_EMBEDDED is not set
+CONFIG_KALLSYMS=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+# CONFIG_MODULE_UNLOAD is not set
+CONFIG_OBSOLETE_MODPARM=y
+# CONFIG_MODVERSIONS is not set
+CONFIG_KMOD=y
+
+#
+# System Type
+#
+# CONFIG_ARCH_ADIFCC is not set
+# CONFIG_ARCH_ANAKIN is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_CAMELOT is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_IOP3XX is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_SHARK is not set
+CONFIG_ARCH_S3C2410=y
+
+#
+# CLPS711X/EP721X Implementations
+#
+
+#
+# Epxa10db
+#
+
+#
+# Footbridge Implementations
+#
+
+#
+# IOP3xx Implementation Options
+#
+# CONFIG_ARCH_IOP310 is not set
+# CONFIG_ARCH_IOP321 is not set
+
+#
+# IOP3xx Chipset Features
+#
+
+#
+# Intel PXA250/210 Implementations
+#
+
+#
+# SA11x0 Implementations
+#
+
+#
+# S3C2410 Implementations
+#
+CONFIG_ARCH_BAST=y
+CONFIG_ARCH_H1940=y
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_ARM920T=y
+CONFIG_CPU_32v4=y
+CONFIG_CPU_ABRT_EV4T=y
+CONFIG_CPU_CACHE_V4WT=y
+CONFIG_CPU_COPY_V4WB=y
+CONFIG_CPU_TLB_V4WBI=y
+
+#
+# Processor Features
+#
+# CONFIG_ARM_THUMB is not set
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+
+#
+# General setup
+#
+# CONFIG_ZBOOT_ROM is not set
+CONFIG_ZBOOT_ROM_TEXT=0
+CONFIG_ZBOOT_ROM_BSS=0
+# CONFIG_HOTPLUG is not set
+
+#
+# At least one math emulation must be selected
+#
+CONFIG_FPE_NWFPE=y
+CONFIG_FPE_NWFPE_XP=y
+# CONFIG_FPE_FASTFPE is not set
+CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_AOUT=y
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Generic Driver Options
+#
+# CONFIG_PM is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="root=/dev/hda1 ro init=/bin/bash console=ttySAC0"
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Parallel port support
+#
+CONFIG_PARPORT=y
+CONFIG_PARPORT_PC=y
+CONFIG_PARPORT_PC_CML1=y
+# CONFIG_PARPORT_SERIAL is not set
+CONFIG_PARPORT_PC_FIFO=y
+CONFIG_PARPORT_PC_SUPERIO=y
+# CONFIG_PARPORT_ARC is not set
+CONFIG_PARPORT_OTHER=y
+CONFIG_PARPORT_1284=y
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_PARTITIONS is not set
+# CONFIG_MTD_CONCAT is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_CFI_STAA is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+# CONFIG_MTD_EDB7312 is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLKMTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_PARIDE is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_INITRD=y
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Networking support
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_PACKET is not set
+# CONFIG_NETLINK_DEV is not set
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_INET_ECN is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_IPV6 is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_NETFILTER is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+CONFIG_IPV6_SCTP__=y
+# CONFIG_IP_SCTP is not set
+# CONFIG_ATM is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+# CONFIG_MII is not set
+# CONFIG_SMC91X is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_PLIP is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+# CONFIG_HOSTAP is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_SHAPER is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+# CONFIG_IRDA is not set
+
+#
+# Bluetooth support
+#
+# CONFIG_BT is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=y
+CONFIG_BLK_DEV_IDE=y
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+CONFIG_BLK_DEV_IDEDISK=y
+# CONFIG_IDEDISK_MULTI_MODE is not set
+# CONFIG_IDEDISK_STROKE is not set
+CONFIG_BLK_DEV_IDECD=y
+CONFIG_BLK_DEV_IDETAPE=m
+CONFIG_BLK_DEV_IDEFLOPPY=m
+# CONFIG_IDE_TASK_IOCTL is not set
+# CONFIG_IDE_TASKFILE_IO is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_BLK_DEV_IDE_BAST=y
+# CONFIG_BLK_DEV_IDEDMA is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_DMA_NONPCI is not set
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI device support
+#
+# CONFIG_SCSI is not set
+
+#
+# I2O device support
+#
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN_BOOL is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+# CONFIG_INPUT_TSLIBDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+CONFIG_SERIO=y
+# CONFIG_SERIO_I8042 is not set
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_CT82C710 is not set
+# CONFIG_SERIO_PARKBD is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=y
+# CONFIG_MOUSE_PS2_SYNAPTICS is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+CONFIG_SERIAL_NONSTANDARD=y
+# CONFIG_COMPUTONE is not set
+# CONFIG_ROCKETPORT is not set
+# CONFIG_CYCLADES is not set
+# CONFIG_DIGIEPCA is not set
+# CONFIG_DIGI is not set
+# CONFIG_MOXA_INTELLIO is not set
+# CONFIG_MOXA_SMARTIO is not set
+# CONFIG_ISI is not set
+# CONFIG_SYNCLINK is not set
+# CONFIG_SYNCLINKMP is not set
+# CONFIG_N_HDLC is not set
+# CONFIG_RISCOM8 is not set
+# CONFIG_SPECIALIX is not set
+# CONFIG_SX is not set
+# CONFIG_RIO is not set
+# CONFIG_STALDRV is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=8
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+# CONFIG_SERIAL_8250_MULTIPORT is not set
+# CONFIG_SERIAL_8250_RSA is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_S3C2410=y
+CONFIG_SERIAL_S3C2410_CONSOLE=y
+CONFIG_SERIAL_BAST_SIO=y
+# CONFIG_SERIAL_DZ is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=256
+CONFIG_PRINTER=y
+# CONFIG_LP_CONSOLE is not set
+CONFIG_PPDEV=y
+# CONFIG_TIPAR is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+CONFIG_I2C_CHARDEV=m
+
+#
+# I2C Algorithms
+#
+CONFIG_I2C_ALGOBIT=m
+# CONFIG_I2C_ALGOPCF is not set
+
+#
+# I2C Hardware Bus support
+#
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+# CONFIG_I2C_PHILIPSPAR is not set
+# CONFIG_SCx200_ACB is not set
+
+#
+# I2C Hardware Sensors Chip support
+#
+CONFIG_I2C_SENSOR=m
+# CONFIG_SENSORS_ADM1021 is not set
+CONFIG_SENSORS_EEPROM=m
+# CONFIG_SENSORS_IT87 is not set
+CONFIG_SENSORS_LM75=m
+CONFIG_SENSORS_LM78=m
+CONFIG_SENSORS_LM85=m
+# CONFIG_SENSORS_VIA686A is not set
+# CONFIG_SENSORS_W83781D is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Mice
+#
+# CONFIG_BUSMOUSE is not set
+# CONFIG_QIC02_TAPE is not set
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_NVRAM is not set
+CONFIG_RTC=y
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_XATTR=y
+# CONFIG_EXT3_FS_POSIX_ACL is not set
+# CONFIG_EXT3_FS_SECURITY is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_MINIX_FS is not set
+CONFIG_ROMFS_FS=y
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+# CONFIG_DEVFS_FS is not set
+CONFIG_DEVPTS_FS=y
+# CONFIG_DEVPTS_FS_XATTR is not set
+# CONFIG_TMPFS is not set
+# CONFIG_HUGETLBFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_JFFS_FS=y
+CONFIG_JFFS_FS_VERBOSE=0
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+# CONFIG_JFFS2_FS_NAND is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+# CONFIG_NFS_V3 is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+# CONFIG_EXPORTFS is not set
+CONFIG_SUNRPC=y
+# CONFIG_SUNRPC_GSS is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_INTERMEZZO_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+CONFIG_BSD_DISKLABEL=y
+# CONFIG_MINIX_SUBPARTITION is not set
+CONFIG_SOLARIS_X86_PARTITION=y
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_NEC98_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+CONFIG_NLS=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS_DEFAULT="iso8859-1"
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Graphics support
+#
+CONFIG_FB=y
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+# CONFIG_MCP is not set
+
+#
+# Console Switches
+#
+# CONFIG_SWITCHES is not set
+
+#
+# USB support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# Kernel hacking
+#
+CONFIG_FRAME_POINTER=y
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_INFO=y
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_WAITQ is not set
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_ERRORS is not set
+CONFIG_DEBUG_LL=y
+CONFIG_DEBUG_LL_PRINTK=y
+# CONFIG_DEBUG_ICEDCC is not set
+CONFIG_DEBUG_S3C2410_PORT=y
+CONFIG_DEBUG_S3C2410_UART=0
+
+#
+# Security options
+#
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+CONFIG_CRC32=y
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
--- diff/arch/arm/mach-omap/Kconfig	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-omap/Kconfig	2004-04-21 10:45:33.355632672 +0100
@@ -0,0 +1,113 @@
+
+menu "TI OMAP Implementations"
+
+choice
+	prompt "OMAP Core Type"
+	depends on ARCH_OMAP
+	default ARCH_OMAP1510
+
+config ARCH_OMAP1510
+	bool "OMAP-1510 Based System"
+	select CPU_ARM925T
+	select CPU_DCACHE_WRITETHROUGH
+
+config ARCH_OMAP1610
+	bool "OMAP-1610 Based System"
+	select CPU_ARM926T
+
+endchoice
+
+choice
+	prompt "OMAP Board Type"
+	depends on ARCH_OMAP
+	default MACH_OMAP_INNOVATOR
+
+config MACH_OMAP_INNOVATOR
+	bool "TI Innovator"
+	depends on ARCH_OMAP1510 || ARCH_OMAP1610
+	help
+          TI OMAP 1510 or 1610 Innovator board support. Say Y here if you
+          have such a board.
+
+config MACH_OMAP_GENERIC
+	bool "Generic OMAP board"
+	depends on ARCH_OMAP1510 || ARCH_OMAP1610
+	help
+          Support for generic OMAP-1510 or 1610 board with no
+          FPGA. Can be used as template for porting Linux to
+          custom OMAP boards. Say Y here if you have a custom
+          board.
+
+endchoice
+
+comment "OMAP Feature Selections"
+
+config MACH_OMAP_H2
+	bool "TI H2 Support"
+	depends on ARCH_OMAP1610 && MACH_OMAP_INNOVATOR
+    	help
+	  TI OMAP 1610 H2 board support. Say Y here if you have such
+	  a board.
+
+config OMAP_MUX
+	bool "OMAP multiplexing support"
+        depends on ARCH_OMAP
+	default y
+        help
+          Pin multiplexing support for OMAP boards. If your bootloader
+          sets the multiplexing correctly, say N. Otherwise, or if unsure,
+          say Y.
+
+config OMAP_MUX_DEBUG
+	bool "Multiplexing debug output"
+        depends on OMAP_MUX
+        default n
+        help
+          Makes the multiplexing functions print out a lot of debug info.
+          This is useful if you want to find out the correct values of the
+          multiplexing registers.
+
+config OMAP_ARM_195MHZ
+	bool "OMAP ARM 195 MHz CPU"
+	depends on ARCH_OMAP730
+	help
+          Enable 195MHz clock for OMAP CPU. If unsure, say N.
+
+config OMAP_ARM_192MHZ
+	bool "OMAP ARM 192 MHz CPU"
+	depends on ARCH_OMAP1610
+	help
+          Enable 192MHz clock for OMAP CPU. If unsure, say N.
+
+config OMAP_ARM_182MHZ
+	bool "OMAP ARM 182 MHz CPU"
+	depends on ARCH_OMAP730
+	help
+          Enable 182MHz clock for OMAP CPU. If unsure, say N.
+
+config OMAP_ARM_168MHZ
+	bool "OMAP ARM 168 MHz CPU"
+	depends on ARCH_OMAP1510 || ARCH_OMAP1610 || ARCH_OMAP730
+	help
+          Enable 168MHz clock for OMAP CPU. If unsure, say N.
+
+config OMAP_ARM_120MHZ
+	bool "OMAP ARM 120 MHz CPU"
+	depends on ARCH_OMAP1510 || ARCH_OMAP1610 || ARCH_OMAP730
+	help
+          Enable 120MHz clock for OMAP CPU. If unsure, say N.
+
+config OMAP_ARM_60MHZ
+	bool "OMAP ARM 60 MHz CPU"
+	depends on ARCH_OMAP1510 || ARCH_OMAP1610 || ARCH_OMAP730
+        default y
+	help
+          Enable 60MHz clock for OMAP CPU. If unsure, say Y.
+
+config OMAP_ARM_30MHZ
+	bool "OMAP ARM 30 MHz CPU"
+	depends on ARCH_OMAP1510 || ARCH_OMAP1610 || ARCH_OMAP730
+	help
+          Enable 30MHz clock for OMAP CPU. If unsure, say N.
+
+endmenu
--- diff/arch/arm/mach-omap/Makefile	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-omap/Makefile	2004-04-21 10:45:33.355632672 +0100
@@ -0,0 +1,36 @@
+#
+# Makefile for the linux kernel.
+#
+
+# Common support
+obj-y := common.o irq.o dma.o clocks.o mux.o bus.o gpio.o
+obj-m :=
+obj-n :=
+obj-  :=
+led-y := leds.o
+
+# OCPI interconnect support for 1610
+ifeq ($(CONFIG_ARCH_OMAP1610),y)
+obj-y += ocpi.o
+ifeq ($(CONFIG_OMAP_INNOVATOR),y)
+obj-y += innovator1610.o
+endif
+endif
+
+ifeq ($(CONFIG_ARCH_OMAP1510),y)
+ifeq ($(CONFIG_OMAP_INNOVATOR),y)
+obj-y += innovator1510.o fpga.o
+endif
+endif
+
+# Specific board support
+obj-$(CONFIG_MACH_OMAP_GENERIC) += omap-generic.o
+obj-$(CONFIG_MACH_OMAP_PERSEUS2) += omap-perseus2.o
+
+# LEDs support
+led-$(CONFIG_OMAP_INNOVATOR) += leds-innovator.o
+led-$(CONFIG_MACH_OMAP_PERSEUS2) += leds-perseus2.o
+obj-$(CONFIG_LEDS) += $(led-y)
+
+# kgdb support
+obj-$(CONFIG_KGDB_SERIAL)	+= kgdb-serial.o
--- diff/arch/arm/mach-omap/bus.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-omap/bus.c	2004-04-21 10:45:33.356632520 +0100
@@ -0,0 +1,280 @@
+/*
+ * linux/arch/arm/mach-omap/bus.c
+ *
+ * Virtual bus for OMAP. Allows better power management, such as managing
+ * shared clocks, and mapping of bus addresses to Local Bus addresses.
+ *
+ * See drivers/usb/host/ohci-omap.c or drivers/video/omap/omapfb.c for
+ * examples on how to register drivers to this bus.
+ *
+ * Copyright (C) 2003 - 2004 Nokia Corporation
+ * Written by Tony Lindgren <tony@atomide.com>
+ * Portions of code based on sa1111.c.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/ptrace.h>
+#include <linux/errno.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+
+#include <asm/hardware.h>
+#include <asm/mach-types.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/mach/irq.h>
+
+#include <asm/arch/bus.h>
+
+static int omap_bus_match(struct device *_dev, struct device_driver *_drv);
+static int omap_bus_suspend(struct device *dev, u32 state);
+static int omap_bus_resume(struct device *dev);
+
+/*
+ * OMAP bus definitions
+ *
+ * NOTE: Most devices should use TIPB. LBUS does automatic address mapping
+ *	 to Local Bus addresses, and should only be used for Local Bus devices.
+ *	 We may add new buses later on for power management reasons. Basically
+ *	 we want to be able to turn off any bus if it's not used by device
+ *	 drivers.
+ */
+static struct device omap_bus_devices[OMAP_NR_BUSES] = {
+	{
+		.bus_id		= OMAP_BUS_NAME_TIPB
+	}, {
+		.bus_id		= OMAP_BUS_NAME_LBUS
+	},
+};
+
+static struct bus_type omap_bus_types[OMAP_NR_BUSES] = {
+	{
+		.name		= OMAP_BUS_NAME_TIPB,
+		.match		= omap_bus_match,
+		.suspend	= omap_bus_suspend,
+		.resume		= omap_bus_resume,
+	}, {
+		.name		= OMAP_BUS_NAME_LBUS,	/* Local bus on 1510 */
+		.match		= omap_bus_match,
+		.suspend	= omap_bus_suspend,
+		.resume		= omap_bus_resume,
+	},
+};
+
+#ifdef CONFIG_ARCH_OMAP1510
+/*
+ * NOTE: This code _should_ go somewhere else. But let's wait for the
+ *	 dma-mapping code to settle down first.
+ */
+
+/*
+ * Test for Local Bus device in order to do address translation between
+ * dma_handle and Local Bus address.
+ */
+inline int dmadev_uses_omap_lbus(struct device * dev)
+{
+	return dev->bus == &omap_bus_types[OMAP_BUS_LBUS] ? 1 : 0;
+}
+
+/*
+ * Translate bus address to Local Bus address for dma-mapping
+ */
+inline int dmadev_to_lbus(dma_addr_t addr)
+{
+	return bus_to_lbus(addr);
+}
+
+/*
+ * Translate Local Bus address to bus address for dma-mapping
+ */
+inline int lbus_to_dmadev(dma_addr_t addr)
+{
+	return lbus_to_bus(addr);
+}
+#endif
+
+static int omap_bus_match(struct device *dev, struct device_driver *drv)
+{
+	struct omap_dev *omapdev = OMAP_DEV(dev);
+	struct omap_driver *omapdrv = OMAP_DRV(drv);
+
+	return omapdev->devid == omapdrv->devid;
+}
+
+static int omap_bus_suspend(struct device *dev, u32 state)
+{
+	struct omap_dev *omapdev = OMAP_DEV(dev);
+	struct omap_driver *omapdrv = OMAP_DRV(dev->driver);
+	int ret = 0;
+
+	if (omapdrv && omapdrv->suspend)
+		ret = omapdrv->suspend(omapdev, state);
+	return ret;
+}
+
+static int omap_bus_resume(struct device *dev)
+{
+	struct omap_dev *omapdev = OMAP_DEV(dev);
+	struct omap_driver *omapdrv = OMAP_DRV(dev->driver);
+	int ret = 0;
+
+	if (omapdrv && omapdrv->resume)
+		ret = omapdrv->resume(omapdev);
+	return ret;
+}
+
+static int omap_device_probe(struct device *dev)
+{
+	struct omap_dev *omapdev = OMAP_DEV(dev);
+	struct omap_driver *omapdrv = OMAP_DRV(dev->driver);
+	int ret = -ENODEV;
+
+	if (omapdrv && omapdrv->probe)
+		ret = omapdrv->probe(omapdev);
+
+	return ret;
+}
+
+static int omap_device_remove(struct device *dev)
+{
+	struct omap_dev *omapdev = OMAP_DEV(dev);
+	struct omap_driver *omapdrv = OMAP_DRV(dev->driver);
+	int ret = 0;
+
+	if (omapdrv && omapdrv->remove)
+		ret = omapdrv->remove(omapdev);
+	return ret;
+}
+
+int omap_device_register(struct omap_dev *odev)
+{
+	if (!odev)
+		return -EINVAL;
+
+	if (odev->busid < 0 || odev->busid >= OMAP_NR_BUSES) {
+		printk(KERN_ERR "%s: busid invalid: %s: bus: %i\n",
+		       __FUNCTION__, odev->name, odev->busid);
+		return -EINVAL;
+	}
+
+	odev->dev.parent = &omap_bus_devices[odev->busid];
+	odev->dev.bus = &omap_bus_types[odev->busid];
+
+	/* This is needed for USB OHCI to work */
+	if (odev->dma_mask)
+		odev->dev.dma_mask = odev->dma_mask;
+
+	snprintf(odev->dev.bus_id, BUS_ID_SIZE, "%s%u",
+		 odev->name, odev->devid);
+
+	printk("Registering OMAP device '%s'. Parent at %s\n",
+		 odev->dev.bus_id, odev->dev.parent->bus_id);
+
+	return device_register(&odev->dev);
+}
+
+void omap_device_unregister(struct omap_dev *odev)
+{
+	if (odev)
+		device_unregister(&odev->dev);
+}
+
+int omap_driver_register(struct omap_driver *driver)
+{
+	int ret;
+
+	if (driver->busid < 0 || driver->busid >= OMAP_NR_BUSES) {
+		printk(KERN_ERR "%s: busid invalid: bus: %i device: %i\n",
+		       __FUNCTION__, driver->busid, driver->devid);
+		return -EINVAL;
+	}
+
+	driver->drv.probe = omap_device_probe;
+	driver->drv.remove = omap_device_remove;
+	driver->drv.bus = &omap_bus_types[driver->busid];
+
+	/*
+	 * driver_register calls bus_add_driver
+	 */
+	ret = driver_register(&driver->drv);
+
+	return ret;
+}
+
+void omap_driver_unregister(struct omap_driver *driver)
+{
+	driver_unregister(&driver->drv);
+}
+
+static int __init omap_bus_init(void)
+{
+	int i, ret;
+
+	/* Initialize all OMAP virtual buses */
+	for (i = 0; i < OMAP_NR_BUSES; i++) {
+		ret = device_register(&omap_bus_devices[i]);
+		if (ret != 0) {
+			printk(KERN_ERR "Unable to register bus device %s\n",
+			       omap_bus_devices[i].bus_id);
+			continue;
+		}
+		ret = bus_register(&omap_bus_types[i]);
+		if (ret != 0) {
+			printk(KERN_ERR "Unable to register bus %s\n",
+			       omap_bus_types[i].name);
+			device_unregister(&omap_bus_devices[i]);
+		}
+	}
+	printk("OMAP virtual buses initialized\n");
+
+	return ret;
+}
+
+static void __exit omap_bus_exit(void)
+{
+	int i;
+
+	/* Unregister all OMAP virtual buses */
+	for (i = 0; i < OMAP_NR_BUSES; i++) {
+		bus_unregister(&omap_bus_types[i]);
+		device_unregister(&omap_bus_devices[i]);
+	}
+}
+
+module_init(omap_bus_init);
+module_exit(omap_bus_exit);
+
+MODULE_DESCRIPTION("Virtual bus for OMAP");
+MODULE_LICENSE("GPL");
+
+EXPORT_SYMBOL(omap_bus_types);
+EXPORT_SYMBOL(omap_driver_register);
+EXPORT_SYMBOL(omap_driver_unregister);
+EXPORT_SYMBOL(omap_device_register);
+EXPORT_SYMBOL(omap_device_unregister);
+
+#ifdef CONFIG_ARCH_OMAP1510
+EXPORT_SYMBOL(dmadev_uses_omap_lbus);
+EXPORT_SYMBOL(dmadev_to_lbus);
+EXPORT_SYMBOL(lbus_to_dmadev);
+#endif
--- diff/arch/arm/mach-omap/clocks.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-omap/clocks.c	2004-04-21 10:45:33.357632368 +0100
@@ -0,0 +1,676 @@
+/*
+ * Clock interface for OMAP
+ *
+ * Copyright (C) 2001 RidgeRun, Inc
+ * Written by Gordon McNutt <gmcnutt@ridgerun.com>
+ * Updated 2004 for Linux 2.6 by Tony Lindgren <tony@atomide.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/spinlock.h>
+#include <asm/errno.h>
+#include <asm/io.h>
+#include <asm/arch/clocks.h>
+
+/* Input clock in MHz */
+static unsigned int source_clock = 12;
+
+/*
+ * We use one spinlock for all clock registers for now. We may want to
+ * change this to be clock register specific later on. Before we can do
+ * that, we need to map out the shared clock registers.
+ */
+static spinlock_t clock_lock = SPIN_LOCK_UNLOCKED;
+
+typedef struct {
+	char		*name;
+	__u8		flags;
+	ck_t		parent;
+	volatile __u16	*rate_reg;	/* Clock rate register */
+	volatile __u16	*enbl_reg;	/* Enable register */
+	volatile __u16	*idle_reg;	/* Idle register */
+	volatile __u16	*slct_reg;	/* Select register */
+	__s8		rate_shift;	/* Clock rate bit shift */
+	__s8		enbl_shift;	/* Clock enable bit shift */
+	__s8		idle_shift;	/* Clock idle bit shift */
+	__s8		slct_shift;	/* Clock select bit shift */
+} ck_info_t;
+
+#define CK_NAME(ck)		ck_info_table[ck].name
+#define CK_FLAGS(ck)		ck_info_table[ck].flags
+#define CK_PARENT(ck)		ck_info_table[ck].parent
+#define CK_RATE_REG(ck)		ck_info_table[ck].rate_reg
+#define CK_ENABLE_REG(ck)	ck_info_table[ck].enbl_reg
+#define CK_IDLE_REG(ck)		ck_info_table[ck].idle_reg
+#define CK_SELECT_REG(ck)	ck_info_table[ck].slct_reg
+#define CK_RATE_SHIFT(ck)	ck_info_table[ck].rate_shift
+#define CK_ENABLE_SHIFT(ck)	ck_info_table[ck].enbl_shift
+#define CK_IDLE_SHIFT(ck)	ck_info_table[ck].idle_shift
+#define CK_SELECT_SHIFT(ck)	ck_info_table[ck].slct_shift
+#define CK_CAN_CHANGE_RATE(cl)	(CK_FLAGS(ck) & CK_RATEF)
+#define CK_CAN_DISABLE(cl)	(CK_FLAGS(ck) & CK_ENABLEF)
+#define CK_CAN_IDLE(cl)		(CK_FLAGS(ck) & CK_IDLEF)
+#define CK_CAN_SWITCH(cl)	(CK_FLAGS(ck) & CK_SELECTF)
+
+static ck_info_t ck_info_table[] = {
+	{
+		.name		= "clkin",
+		.flags		= 0,
+		.parent		= OMAP_CLKIN,
+	}, {
+		.name		= "ck_gen1",
+		.flags		= CK_RATEF | CK_IDLEF,
+		.rate_reg	= CK_DPLL1,
+		.idle_reg	= ARM_IDLECT1,
+		.idle_shift	= IDLDPLL_ARM,
+		.parent		= OMAP_CLKIN,
+	}, {
+		.name		= "ck_gen2",
+		.flags		= 0,
+		.parent		= OMAP_CK_GEN1,
+	}, {
+		.name		= "ck_gen3",
+		.flags		= 0,
+		.parent		= OMAP_CK_GEN1,
+	}, {
+		.name		= "tc_ck",
+		.flags		= CK_RATEF | CK_IDLEF,
+		.parent		= OMAP_CK_GEN3,
+		.rate_reg	= ARM_CKCTL,	/* ARM_CKCTL[TCDIV(9:8)] */
+		.idle_reg	= ARM_IDLECT1,
+		.rate_shift	= TCDIV,
+		.idle_shift	= IDLIF_ARM
+	}, {
+		.name		= "arm_ck",
+		.flags		= CK_IDLEF | CK_RATEF,
+		.parent		= OMAP_CK_GEN1,
+		.rate_reg	= ARM_CKCTL,	/* ARM_CKCTL[ARMDIV(5:4)] */
+		.idle_reg	= ARM_IDLECT1,
+		.rate_shift	= ARMDIV,
+		.idle_shift	= SETARM_IDLE,
+	}, {
+		.name		= "mpuper_ck",
+		.flags		= CK_RATEF | CK_IDLEF | CK_ENABLEF,
+		.parent		= OMAP_CK_GEN1,
+		.rate_reg	= ARM_CKCTL,	/* ARM_CKCTL[PERDIV(1:0)] */
+		.enbl_reg	= ARM_IDLECT2,
+		.idle_reg	= ARM_IDLECT1,
+		.rate_shift	= PERDIV,
+		.enbl_shift	= EN_PERCK,
+		.idle_shift	= IDLPER_ARM
+	}, {
+		.name		= "arm_gpio_ck",
+		.flags		= CK_ENABLEF,
+		.parent		= OMAP_CK_GEN1,
+		.enbl_reg	= ARM_IDLECT2,
+		.enbl_shift	= EN_GPIOCK
+	}, {
+		.name		= "mpuxor_ck",
+		.flags		= CK_ENABLEF | CK_IDLEF,
+		.parent		= OMAP_CLKIN,
+		.idle_reg	= ARM_IDLECT1,
+		.enbl_reg	= ARM_IDLECT2,
+		.idle_shift	= IDLXORP_ARM,
+		.enbl_shift	= EN_XORPCK
+	}, {
+		.name		= "mputim_ck",
+		.flags		= CK_IDLEF | CK_ENABLEF | CK_SELECTF,
+		.parent		= OMAP_CLKIN,
+		.idle_reg	= ARM_IDLECT1,
+		.enbl_reg	= ARM_IDLECT2,
+		.slct_reg	= ARM_CKCTL,
+		.idle_shift	= IDLTIM_ARM,
+		.enbl_shift	= EN_TIMCK,
+		.slct_shift	= ARM_TIMXO
+	}, {
+		.name		= "mpuwd_ck",
+		.flags		= CK_IDLEF | CK_ENABLEF,
+		.parent		= OMAP_CLKIN,
+		.idle_reg	= ARM_IDLECT1,
+		.enbl_reg	= ARM_IDLECT2,
+		.idle_shift	= IDLWDT_ARM,
+		.enbl_shift	= EN_WDTCK,
+	}, {
+		.name		= "dsp_ck",
+		.flags		= CK_RATEF | CK_ENABLEF,
+		.parent		= OMAP_CK_GEN2,
+		.rate_reg	= ARM_CKCTL,	/* ARM_CKCTL[DSPDIV(7:6)] */
+		.enbl_reg	= ARM_CKCTL,
+		.rate_shift	= DSPDIV,
+		.enbl_shift	= EN_DSPCK,
+	}, {
+		.name		= "dspmmu_ck",
+		.flags		= CK_RATEF | CK_ENABLEF,
+		.parent		= OMAP_CK_GEN2,
+		.rate_reg	= ARM_CKCTL,	/* ARM_CKCTL[DSPMMUDIV(11:10)] */
+		.enbl_reg	= ARM_CKCTL,
+		.rate_shift	= DSPMMUDIV,
+		.enbl_shift	= EN_DSPCK,
+	}, {
+		.name		= "dma_ck",
+		.flags		= CK_RATEF | CK_IDLEF | CK_ENABLEF,
+		.parent		= OMAP_CK_GEN3,
+		.rate_reg	= ARM_CKCTL,	/* ARM_CKCTL[TCDIV(9:8)] */
+		.idle_reg	= ARM_IDLECT1,
+		.enbl_reg	= ARM_IDLECT2,
+		.rate_shift	= TCDIV,
+		.idle_shift	= IDLIF_ARM,
+		.enbl_shift	= DMACK_REQ
+	}, {
+		.name		= "api_ck",
+		.flags		= CK_RATEF | CK_IDLEF | CK_ENABLEF,
+		.parent		= OMAP_CK_GEN3,
+		.rate_reg	= ARM_CKCTL,	/* ARM_CKCTL[TCDIV(9:8)] */
+		.idle_reg	= ARM_IDLECT1,
+		.enbl_reg	= ARM_IDLECT2,
+		.rate_shift	= TCDIV,
+		.idle_shift	= IDLAPI_ARM,
+		.enbl_shift	= EN_APICK,
+	}, {
+		.name		= "hsab_ck",
+		.flags		= CK_RATEF | CK_IDLEF | CK_ENABLEF,
+		.parent		= OMAP_CK_GEN3,
+		.rate_reg	= ARM_CKCTL,	/* ARM_CKCTL[TCDIV(9:8)] */
+		.idle_reg	= ARM_IDLECT1,
+		.enbl_reg	= ARM_IDLECT2,
+		.rate_shift	= TCDIV,
+		.idle_shift	= IDLHSAB_ARM,
+		.enbl_shift	= EN_HSABCK,
+	}, {
+		.name		= "lbfree_ck",
+		.flags		= CK_RATEF | CK_ENABLEF,
+		.parent		= OMAP_CK_GEN3,
+		.rate_reg	= ARM_CKCTL,	/* ARM_CKCTL[TCDIV(9:8)] */
+		.enbl_reg	= ARM_IDLECT2,
+		.rate_shift	= TCDIV,
+		.enbl_shift	= EN_LBFREECK,
+	}, {
+		.name		= "lb_ck",
+		.flags		= CK_RATEF | CK_IDLEF | CK_ENABLEF,
+		.parent		= OMAP_CK_GEN3,
+		.rate_reg	= ARM_CKCTL,	/* ARM_CKCTL[TCDIV(9:8)] */
+		.idle_reg	= ARM_IDLECT1,
+		.enbl_reg	= ARM_IDLECT2,
+		.rate_shift	= TCDIV,
+		.idle_shift	= IDLLB_ARM,
+		.enbl_shift	= EN_LBCK,
+	}, {
+		.name		= "lcd_ck",
+		.flags		= CK_RATEF | CK_IDLEF | CK_ENABLEF,
+		.parent		= OMAP_CK_GEN3,
+		.rate_reg	= ARM_CKCTL,	/* ARM_CKCTL[LCDDIV(3:2)] */
+		.idle_reg	= ARM_IDLECT1,
+		.enbl_reg	= ARM_IDLECT2,
+		.rate_shift	= LCDDIV,
+		.idle_shift	= IDLLCD_ARM,
+		.enbl_shift	= EN_LCDCK,
+	},
+};
+
+/*****************************************************************************/
+
+#define CK_IN_RANGE(ck)		(!((ck < OMAP_CK_MIN) || (ck > OMAP_CK_MAX)))
+
+int ck_auto_unclock = 1;
+int ck_debug = 0;
+
+#define CK_MAX_PLL_FREQ		OMAP_CK_MAX_RATE
+static __u8 ck_valid_table[CK_MAX_PLL_FREQ / 8 + 1];
+static __u8 ck_lookup_table[CK_MAX_PLL_FREQ];
+
+int
+ck_set_input(ck_t ck, ck_t input)
+{
+	int ret = 0, shift;
+	volatile __u16 *reg;
+	unsigned long flags;
+
+	if (!CK_IN_RANGE(ck) || !CK_CAN_SWITCH(ck)) {
+		ret = -EINVAL;
+		goto exit;
+	}
+
+	reg = CK_SELECT_REG(ck);
+	shift = CK_SELECT_SHIFT(ck);
+
+	spin_lock_irqsave(&clock_lock, flags);
+	if (input == OMAP_CLKIN) {
+		*((volatile __u16 *) reg) &= ~(1 << shift);
+		goto exit;
+	} else if (input == CK_PARENT(ck)) {
+		*((volatile __u16 *) reg) |= (1 << shift);
+		goto exit;
+	}
+
+	ret = -EINVAL;
+ exit:
+	spin_unlock_irqrestore(&clock_lock, flags);
+	return ret;
+}
+
+int
+ck_get_input(ck_t ck, ck_t * input)
+{
+	int ret = -EINVAL;
+	unsigned long flags;
+
+	if (!CK_IN_RANGE(ck))
+		goto exit;
+
+	ret = 0;
+
+	spin_lock_irqsave(&clock_lock, flags);
+	if (CK_CAN_SWITCH(ck)) {
+		int shift;
+		volatile __u16 *reg;
+
+		reg = CK_SELECT_REG(ck);
+		shift = CK_SELECT_SHIFT(ck);
+		if (*reg & (1 << shift)) {
+			*input = CK_PARENT(ck);
+			goto exit;
+		}
+	}
+
+	*input = OMAP_CLKIN;
+
+ exit:
+	spin_unlock_irqrestore(&clock_lock, flags);
+	return ret;
+}
+
+static int
+__ck_set_pll_rate(ck_t ck, int rate)
+{
+	volatile __u16 *pll;
+	unsigned long flags;
+
+	if ((rate < 0) || (rate > CK_MAX_PLL_FREQ))
+		return -EINVAL;
+
+	/* Scan downward for the closest matching frequency */
+	while (rate && !test_bit(rate, (unsigned long *)&ck_valid_table))
+		rate--;
+
+	if (!rate) {
+		printk(KERN_ERR "%s: couldn't find a matching rate\n",
+			__FUNCTION__);
+		return -EINVAL;
+	}
+
+	spin_lock_irqsave(&clock_lock, flags);
+	pll = (volatile __u16 *) CK_RATE_REG(ck);
+
+	/* Clear the rate bits */
+	*pll &= ~(0x1f << 5);
+
+	/* Set the rate bits */
+	*pll |= (ck_lookup_table[rate - 1] << 5);
+	spin_unlock_irqrestore(&clock_lock, flags);
+
+	return 0;
+}
+
+static int
+__ck_set_clkm_rate(ck_t ck, int rate)
+{
+	int shift, prate, div, ret;
+	volatile __u16 *reg;
+	unsigned long flags;
+
+	spin_lock_irqsave(&clock_lock, flags);
+
+	/*
+	 * We can only set this clock's value to a fraction of its
+	 * parent's value. The interface says I'll round down when necessary.
+	 * So first let's get the parent's current rate.
+	 */
+	prate = ck_get_rate(CK_PARENT(ck));
+
+	/*
+	 * Let's just start with the highest fraction and keep searching
+	 * down through available rates until we find one less than or equal
+	 * to the desired rate.
+	 */
+	for (div = 0; div < 4; div++) {
+		if (prate <= rate)
+			break;
+		prate = prate / 2;
+	}
+
+	/*
+	 * Oops. Looks like the caller wants a rate lower than we can support.
+	 */
+	if (div == 5) {
+		printk(KERN_ERR "%s: %d is too low\n",
+			__FUNCTION__, rate);
+		ret = -EINVAL;
+		goto exit;
+	}
+
+	/*
+	 * One more detail: if this clock supports more than one parent, then
+	 * we're going to automatically switch over to the parent which runs
+	 * through the divisor. For omap this is not ambiguous because for all
+	 * such clocks one choice is always OMAP_CLKIN (which doesn't run
+	 * through the divisor) and the other is whatever I encoded as
+	 * CK_PARENT. Note that I wait until we get this far because I don't
+	 * want to switch the input until we're sure this is going to work.
+	 */
+	if (CK_CAN_SWITCH(ck))
+		if ((ret = ck_set_input(ck, CK_PARENT(ck))) < 0) {
+			BUG();
+			goto exit;
+		}
+
+	/*
+	 * At last, we can set the divisor. Clear the old rate bits and
+	 * set the new ones.
+	 */
+	reg = (volatile __u16 *) CK_RATE_REG(ck);
+	shift = CK_RATE_SHIFT(ck);
+	*reg &= ~(3 << shift);
+	*reg |= (div << shift);
+
+	/* And return the new (actual, after rounding down) rate. */
+	ret = prate;
+
+ exit:
+	spin_unlock_irqrestore(&clock_lock, flags);
+	return ret;
+}
+
+int
+ck_set_rate(ck_t ck, int rate)
+{
+	int ret = -EINVAL;
+
+	if (!CK_IN_RANGE(ck) || !CK_CAN_CHANGE_RATE(ck))
+		goto exit;
+
+	switch (ck) {
+
+	default:
+		ret = __ck_set_clkm_rate(ck, rate);
+		break;
+
+	case OMAP_CK_GEN1:
+		ret = __ck_set_pll_rate(ck, rate);
+		break;
+
+	};
+
+ exit:
+	return ret;
+}
+
+static int
+__ck_get_pll_rate(ck_t ck)
+{
+	int m, d;
+
+	__u16 pll = *((volatile __u16 *) CK_RATE_REG(ck));
+
+	m = (pll & (0x1f << 7)) >> 7;
+	m = m ? m : 1;
+	d = (pll & (3 << 5)) >> 5;
+	d++;
+
+	return ((source_clock * m) / d);
+}
+
+static int
+__ck_get_clkm_rate(ck_t ck)
+{
+	static int bits2div[] = { 1, 2, 4, 8 };
+	int in, bits, reg, shift;
+
+	reg = *(CK_RATE_REG(ck));
+	shift = CK_RATE_SHIFT(ck);
+
+	in = ck_get_rate(CK_PARENT(ck));
+	bits = (reg & (3 << shift)) >> shift;
+
+	return (in / bits2div[bits]);
+}
+
+int
+ck_get_rate(ck_t ck)
+{
+	int ret = 0;
+	ck_t parent;
+
+	if (!CK_IN_RANGE(ck)) {
+		ret = -EINVAL;
+		goto exit;
+	}
+
+	switch (ck) {
+
+	case OMAP_CK_GEN1:
+		ret = __ck_get_pll_rate(ck);
+		break;
+
+	case OMAP_CLKIN:
+		ret = source_clock;
+		break;
+
+	case OMAP_MPUXOR_CK:
+	case OMAP_CK_GEN2:
+	case OMAP_CK_GEN3:
+	case OMAP_ARM_GPIO_CK:
+		ret = ck_get_rate(CK_PARENT(ck));
+		break;
+
+	case OMAP_ARM_CK:
+	case OMAP_MPUPER_CK:
+	case OMAP_DSP_CK:
+	case OMAP_DSPMMU_CK:
+	case OMAP_LCD_CK:
+	case OMAP_TC_CK:
+	case OMAP_DMA_CK:
+	case OMAP_API_CK:
+	case OMAP_HSAB_CK:
+	case OMAP_LBFREE_CK:
+	case OMAP_LB_CK:
+		ret = __ck_get_clkm_rate(ck);
+		break;
+
+	case OMAP_MPUTIM_CK:
+		ck_get_input(ck, &parent);
+		ret = ck_get_rate(parent);
+		break;
+
+	case OMAP_MPUWD_CK:
+		/* Note that this evaluates to zero if source_clock is 12MHz. */
+		ret = source_clock / 14;
+		break;
+	default:
+		ret = -EINVAL;
+		break;
+	}
+
+ exit:
+	return ret;
+}
+
+int
+ck_enable(ck_t ck)
+{
+	volatile __u16 *reg;
+	int ret = -EINVAL, shift;
+	unsigned long flags;
+
+	if (!CK_IN_RANGE(ck))
+		goto exit;
+
+	if (ck_debug)
+		printk(KERN_DEBUG "%s: %s\n", __FUNCTION__, CK_NAME(ck));
+
+	ret = 0;
+
+	if (!CK_CAN_DISABLE(ck))
+		/* Then it must be on... */
+		goto exit;
+
+	spin_lock_irqsave(&clock_lock, flags);
+	reg = CK_ENABLE_REG(ck);
+	shift = CK_ENABLE_SHIFT(ck);
+	*reg |= (1 << shift);
+	spin_unlock_irqrestore(&clock_lock, flags);
+
+ exit:
+	return ret;
+}
+
+int
+ck_disable(ck_t ck)
+{
+	volatile __u16 *reg;
+	int ret = -EINVAL, shift;
+	unsigned long flags;
+
+	if (!CK_IN_RANGE(ck))
+		goto exit;
+
+	if (ck_debug)
+		printk(KERN_DEBUG "%s: %s\n", __FUNCTION__, CK_NAME(ck));
+
+	if (!CK_CAN_DISABLE(ck))
+		goto exit;
+
+	ret = 0;
+
+	if (ck == OMAP_CLKIN)
+		return -EINVAL;
+
+	spin_lock_irqsave(&clock_lock, flags);
+	reg = CK_ENABLE_REG(ck);
+	shift = CK_ENABLE_SHIFT(ck);
+	*reg &= ~(1 << shift);
+	spin_unlock_irqrestore(&clock_lock, flags);
+
+ exit:
+	return ret;
+}
+
+int ck_valid_rate(int rate)
+{
+	return test_bit(rate, (unsigned long *)&ck_valid_table);
+}
+
+static void
+__ck_make_lookup_table(void)
+{
+	__u8 m, d;
+
+	memset(ck_valid_table, 0, sizeof (ck_valid_table));
+
+	for (m = 1; m < 32; m++)
+		for (d = 1; d < 5; d++) {
+
+			int rate = ((source_clock * m) / (d));
+
+			if (rate > CK_MAX_PLL_FREQ)
+				continue;
+			if (test_bit(rate, (unsigned long *)&ck_valid_table))
+				continue;
+			set_bit(rate, (unsigned long *)&ck_valid_table);
+			ck_lookup_table[rate - 1] = (m << 2) | (d - 1);
+		}
+}
+
+int __init
+init_ck(void)
+{
+	__ck_make_lookup_table();
+
+	/* We want to be in syncronous scalable mode */
+	*ARM_SYSST = 0x1000;
+#if defined(CONFIG_OMAP_ARM_30MHZ)
+	*ARM_CKCTL = 0x1555;
+	*DPLL_CTL_REG = 0x2290;
+#elif defined(CONFIG_OMAP_ARM_60MHZ)
+	*ARM_CKCTL = 0x1005;
+	*DPLL_CTL_REG = 0x2290;
+#elif defined(CONFIG_OMAP_ARM_96MHZ)
+	*ARM_CKCTL = 0x1005;
+	*DPLL_CTL_REG = 0x2410;
+#elif defined(CONFIG_OMAP_ARM_120MHZ)
+	*ARM_CKCTL = 0x110a;
+	*DPLL_CTL_REG = 0x2510;
+#elif defined(CONFIG_OMAP_ARM_168MHZ)
+	*ARM_CKCTL = 0x110f;
+	*DPLL_CTL_REG = 0x2710;
+#elif defined(CONFIG_OMAP_ARM_182MHZ) && defined(CONFIG_ARCH_OMAP730)
+	*ARM_CKCTL = 0x250E;
+	*DPLL_CTL_REG = 0x2713;
+#elif defined(CONFIG_OMAP_ARM_192MHZ) && defined(CONFIG_ARCH_OMAP1610)
+	*ARM_CKCTL = 0x110f;
+	if (crystal_type == 2) {
+		source_clock = 13;	/* MHz */
+		*DPLL_CTL_REG = 0x2510;
+	} else
+		*DPLL_CTL_REG = 0x2810;
+#elif defined(CONFIG_OMAP_ARM_195MHZ) && defined(CONFIG_ARCH_OMAP730)
+	*ARM_CKCTL = 0x250E;
+	*DPLL_CTL_REG = 0x2793;
+#else
+#error "OMAP MHZ not set, please run make xconfig"
+#endif
+
+	/* Turn off some other junk the bootloader might have turned on */
+	*ARM_CKCTL &= 0x0fff;	/* Turn off DSP, ARM_INTHCK, ARM_TIMXO */
+	*ARM_RSTCT1 = 0;	/* Put DSP/MPUI into reset until needed */
+	*ARM_RSTCT2 = 1;
+	*ARM_IDLECT1 = 0x400;
+
+	/*
+	 * According to OMAP5910 Erratum SYS_DMA_1, bit DMACK_REQ (bit 8)
+	 * of the ARM_IDLECT2 register must be set to zero. The power-on
+	 * default value of this bit is one.
+	 */
+	*ARM_IDLECT2 = 0x0000;	/* Turn LCD clock off also */
+
+	/*
+	 * Only enable those clocks we will need, let the drivers
+	 * enable other clocks as necessary
+	 */
+	ck_enable(OMAP_MPUPER_CK);
+	ck_enable(OMAP_ARM_GPIO_CK);
+	ck_enable(OMAP_MPUXOR_CK);
+	//ck_set_rate(OMAP_MPUTIM_CK, OMAP_CLKIN);
+	ck_enable(OMAP_MPUTIM_CK);
+	start_mputimer1(0xffffffff);
+
+	return 0;
+}
+
+
+EXPORT_SYMBOL(ck_get_rate);
+EXPORT_SYMBOL(ck_set_rate);
+EXPORT_SYMBOL(ck_enable);
+EXPORT_SYMBOL(ck_disable);
--- diff/arch/arm/mach-omap/common.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-omap/common.c	2004-04-21 10:45:33.357632368 +0100
@@ -0,0 +1,69 @@
+/*
+ * linux/arch/arm/mach-omap/common.c
+ *
+ * Code common to all OMAP machines.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/pm.h>
+
+#include <asm/hardware.h>
+#include <asm/system.h>
+#include <asm/pgtable.h>
+#include <asm/mach/map.h>
+#include <asm/arch/clocks.h>
+#include <asm/io.h>
+
+#include "common.h"
+
+/*
+ * Common OMAP I/O mapping
+ *
+ * The machine specific code may provide the extra mapping besides the
+ * default mapping provided here.
+ */
+
+static struct map_desc standard_io_desc[] __initdata = {
+ { IO_BASE,          IO_START,          IO_SIZE,          MT_DEVICE },
+ { OMAP_DSP_BASE,    OMAP_DSP_START,    OMAP_DSP_SIZE,    MT_DEVICE },
+ { OMAP_DSPREG_BASE, OMAP_DSPREG_START, OMAP_DSPREG_SIZE, MT_DEVICE },
+ { OMAP_SRAM_BASE,   OMAP_SRAM_START,   OMAP_SRAM_SIZE,   MT_DEVICE }
+};
+
+static int initialized = 0;
+
+static void __init _omap_map_io(void)
+{
+	initialized = 1;
+
+	iotable_init(standard_io_desc, ARRAY_SIZE(standard_io_desc));
+
+	/* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort
+	 * on a Posted Write in the TIPB Bridge".
+	 */
+	__raw_writew(0x0, MPU_PUBLIC_TIPB_CNTL_REG);
+	__raw_writew(0x0, MPU_PRIVATE_TIPB_CNTL_REG);
+
+	/* Must init clocks early to assure that timer interrupt works
+	 */
+	init_ck();
+}
+
+/*
+ * This should only get called from board specific init
+ */
+void omap_map_io(void)
+{
+	if (!initialized)
+		_omap_map_io();
+}
+
+EXPORT_SYMBOL(omap_map_io);
+
--- diff/arch/arm/mach-omap/common.h	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-omap/common.h	2004-04-21 10:45:33.357632368 +0100
@@ -0,0 +1,6 @@
+/*
+ * linux/arch/arm/mach-omap/common.h
+ */
+
+extern void omap_map_io(void);
+
--- diff/arch/arm/mach-omap/dma.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-omap/dma.c	2004-04-21 10:45:33.358632216 +0100
@@ -0,0 +1,560 @@
+/*
+ * linux/arch/arm/omap/dma.c
+ *
+ * Copyright (C) 2003 Nokia Corporation
+ * Author: Juha Yrjölä <juha.yrjola@nokia.com>
+ *
+ * Support functions for the OMAP internal DMA channels.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/sched.h>
+#include <linux/spinlock.h>
+#include <linux/errno.h>
+#include <linux/interrupt.h>
+
+#include <asm/system.h>
+#include <asm/irq.h>
+#include <asm/hardware.h>
+#include <asm/dma.h>
+#include <asm/io.h>
+
+#define OMAP_DMA_ACTIVE		0x01
+
+#define OMAP_DMA_CCR_EN		(1 << 7)
+
+#define OMAP_FUNC_MUX_ARM_BASE	(0xfffe1000 + 0xec)
+
+static int enable_1510_mode = 0;
+
+struct omap_dma_lch {
+	int dev_id;
+	u16 saved_csr;
+	u16 enabled_irqs;
+	const char *dev_name;
+	void (* callback)(int lch, u16 ch_status, void *data);
+	void *data;
+	long flags;
+};
+
+static int dma_chan_count;
+
+static spinlock_t dma_chan_lock;
+static struct omap_dma_lch dma_chan[OMAP_LOGICAL_DMA_CH_COUNT];
+
+const static u8 dma_irq[OMAP_LOGICAL_DMA_CH_COUNT] = {
+	INT_DMA_CH0_6, INT_DMA_CH1_7, INT_DMA_CH2_8, INT_DMA_CH3,
+	INT_DMA_CH4, INT_DMA_CH5, INT_1610_DMA_CH6, INT_1610_DMA_CH7,
+	INT_1610_DMA_CH8, INT_1610_DMA_CH9, INT_1610_DMA_CH10,
+	INT_1610_DMA_CH11, INT_1610_DMA_CH12, INT_1610_DMA_CH13,
+	INT_1610_DMA_CH14, INT_1610_DMA_CH15, INT_DMA_LCD
+};
+
+static inline int get_gdma_dev(int req)
+{
+	u32 reg = OMAP_FUNC_MUX_ARM_BASE + ((req - 1) / 5) * 4;
+	int shift = ((req - 1) % 5) * 6;
+
+	return ((__raw_readl(reg) >> shift) & 0x3f) + 1;
+}
+
+static inline void set_gdma_dev(int req, int dev)
+{
+	u32 reg = OMAP_FUNC_MUX_ARM_BASE + ((req - 1) / 5) * 4;
+	int shift = ((req - 1) % 5) * 6;
+	u32 l;
+
+	l = __raw_readl(reg);
+	l &= ~(0x3f << shift);
+	l |= (dev - 1) << shift;
+	__raw_writel(l, reg);
+}
+
+static void clear_lch_regs(int lch)
+{
+	int i;
+	u32 lch_base = OMAP_DMA_BASE + lch * 0x40;
+
+	for (i = 0; i < 0x2c; i += 2)
+		__raw_writew(0, lch_base + i);
+}
+
+void omap_set_dma_transfer_params(int lch, int data_type, int elem_count,
+				  int frame_count, int sync_mode)
+{
+	u16 w;
+
+	w = __raw_readw(OMAP_DMA_CSDP_REG(lch));
+	w &= ~0x03;
+	w |= data_type;
+	__raw_writew(w, OMAP_DMA_CSDP_REG(lch));
+
+	w = __raw_readw(OMAP_DMA_CCR_REG(lch));
+	w &= ~(1 << 5);
+	if (sync_mode == OMAP_DMA_SYNC_FRAME)
+		w |= 1 << 5;
+	__raw_writew(w, OMAP_DMA_CCR_REG(lch));
+
+	w = __raw_readw(OMAP_DMA_CCR2_REG(lch));
+	w &= ~(1 << 2);
+	if (sync_mode == OMAP_DMA_SYNC_BLOCK)
+		w |= 1 << 2;
+	__raw_writew(w, OMAP_DMA_CCR2_REG(lch));
+
+	__raw_writew(elem_count, OMAP_DMA_CEN_REG(lch));
+	__raw_writew(frame_count, OMAP_DMA_CFN_REG(lch));
+
+}
+
+void omap_set_dma_src_params(int lch, int src_port, int src_amode,
+			     unsigned long src_start)
+{
+	u16 w;
+
+	w = __raw_readw(OMAP_DMA_CSDP_REG(lch));
+	w &= ~(0x1f << 2);
+	w |= src_port << 2;
+	__raw_writew(w, OMAP_DMA_CSDP_REG(lch));
+
+	w = __raw_readw(OMAP_DMA_CCR_REG(lch));
+	w &= ~(0x03 << 12);
+	w |= src_amode << 12;
+	__raw_writew(w, OMAP_DMA_CCR_REG(lch));
+
+	__raw_writew(src_start >> 16, OMAP_DMA_CSSA_U_REG(lch));
+	__raw_writew(src_start, OMAP_DMA_CSSA_L_REG(lch));
+}
+
+void omap_set_dma_dest_params(int lch, int dest_port, int dest_amode,
+			      unsigned long dest_start)
+{
+	u16 w;
+
+	w = __raw_readw(OMAP_DMA_CSDP_REG(lch));
+	w &= ~(0x1f << 9);
+	w |= dest_port << 9;
+	__raw_writew(w, OMAP_DMA_CSDP_REG(lch));
+
+	w = __raw_readw(OMAP_DMA_CCR_REG(lch));
+	w &= ~(0x03 << 14);
+	w |= dest_amode << 14;
+	__raw_writew(w, OMAP_DMA_CCR_REG(lch));
+
+	__raw_writew(dest_start >> 16, OMAP_DMA_CDSA_U_REG(lch));
+	__raw_writew(dest_start, OMAP_DMA_CDSA_L_REG(lch));
+}
+
+void omap_start_dma(int lch)
+{
+	u16 w;
+
+	/* Read CSR to make sure it's cleared. */
+	w = __raw_readw(OMAP_DMA_CSR_REG(lch));
+	/* Enable some nice interrupts. */
+	__raw_writew(dma_chan[lch].enabled_irqs, OMAP_DMA_CICR_REG(lch));
+
+	w = __raw_readw(OMAP_DMA_CCR_REG(lch));
+	w |= OMAP_DMA_CCR_EN;
+	__raw_writew(w, OMAP_DMA_CCR_REG(lch));
+	dma_chan[lch].flags |= OMAP_DMA_ACTIVE;
+}
+
+void omap_stop_dma(int lch)
+{
+	u16 w;
+
+	/* Disable all interrupts on the channel */
+	__raw_writew(0, OMAP_DMA_CICR_REG(lch));
+
+	w = __raw_readw(OMAP_DMA_CCR_REG(lch));
+	w &= ~OMAP_DMA_CCR_EN;
+	__raw_writew(w, OMAP_DMA_CCR_REG(lch));
+	dma_chan[lch].flags &= ~OMAP_DMA_ACTIVE;
+}
+
+void omap_enable_dma_irq(int lch, u16 bits)
+{
+	dma_chan[lch].enabled_irqs |= bits;
+}
+
+void omap_disable_dma_irq(int lch, u16 bits)
+{
+	dma_chan[lch].enabled_irqs &= ~bits;
+}
+
+static int dma_handle_ch(int ch)
+{
+	u16 csr;
+
+	if (enable_1510_mode && ch >= 6) {
+		csr = dma_chan[ch].saved_csr;
+		dma_chan[ch].saved_csr = 0;
+	} else
+		csr = __raw_readw(OMAP_DMA_CSR_REG(ch));
+	if (enable_1510_mode && ch <= 2 && (csr >> 7) != 0) {
+		dma_chan[ch + 6].saved_csr = csr >> 7;
+		csr &= 0x7f;
+	}
+	if (!csr)
+		return 0;
+	if (unlikely(dma_chan[ch].dev_id == -1)) {
+		printk(KERN_WARNING "Spurious interrupt from DMA channel %d (CSR %04x)\n",
+		       ch, csr);
+		return 0;
+	}
+	if (unlikely(csr & OMAP_DMA_TOUT_IRQ))
+		printk(KERN_WARNING "DMA timeout with device %d\n", dma_chan[ch].dev_id);
+	if (unlikely(csr & OMAP_DMA_DROP_IRQ))
+		printk(KERN_WARNING "DMA synchronization event drop occurred with device %d\n",
+		       dma_chan[ch].dev_id);
+	if (likely(csr & OMAP_DMA_BLOCK_IRQ))
+		dma_chan[ch].flags &= ~OMAP_DMA_ACTIVE;
+	if (likely(dma_chan[ch].callback != NULL))
+		dma_chan[ch].callback(ch, csr, dma_chan[ch].data);
+	return 1;
+}
+
+static irqreturn_t dma_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
+{
+	int ch = ((int) dev_id) - 1;
+	int handled = 0;
+
+	for (;;) {
+		int handled_now = 0;
+
+		handled_now += dma_handle_ch(ch);
+		if (enable_1510_mode && dma_chan[ch + 6].saved_csr)
+			handled_now += dma_handle_ch(ch + 6);
+		if (!handled_now)
+			break;
+		handled += handled_now;
+	}
+
+	return handled ? IRQ_HANDLED : IRQ_NONE;
+}
+
+int omap_request_dma(int dev_id, const char *dev_name,
+		     void (* callback)(int lch, u16 ch_status, void *data),
+		     void *data, int *dma_ch_out)
+{
+	int ch, free_ch = -1;
+	unsigned long flags;
+	struct omap_dma_lch *chan;
+
+	spin_lock_irqsave(&dma_chan_lock, flags);
+	for (ch = 0; ch < dma_chan_count; ch++) {
+		if (free_ch == -1 && dma_chan[ch].dev_id == -1) {
+			free_ch = ch;
+			if (dev_id == 0)
+				break;
+		}
+		if (dev_id != 0 && dma_chan[ch].dev_id == dev_id) {
+			spin_unlock_irqrestore(&dma_chan_lock, flags);
+			return -EAGAIN;
+		}
+	}
+	if (free_ch == -1) {
+		spin_unlock_irqrestore(&dma_chan_lock, flags);
+		return -EBUSY;
+	}
+	chan = dma_chan + free_ch;
+	chan->dev_id = dev_id;
+	clear_lch_regs(free_ch);
+	spin_unlock_irqrestore(&dma_chan_lock, flags);
+
+	chan->dev_id = dev_id;
+	chan->dev_name = dev_name;
+	chan->callback = callback;
+	chan->data = data;
+	chan->enabled_irqs = OMAP_DMA_TOUT_IRQ | OMAP_DMA_DROP_IRQ | OMAP_DMA_BLOCK_IRQ;
+
+	if (cpu_is_omap1610()) {
+		/* If the sync device is set, configure it dynamically. */
+		if (dev_id != 0) {
+			set_gdma_dev(free_ch + 1, dev_id);
+			dev_id = free_ch + 1;
+		}
+		/* Disable the 1510 compatibility mode and set the sync device
+		 * id. */
+		__raw_writew(dev_id | (1 << 10), OMAP_DMA_CCR_REG(free_ch));
+	} else {
+		__raw_writew(dev_id, OMAP_DMA_CCR_REG(free_ch));
+	}
+	*dma_ch_out = free_ch;
+
+	return 0;
+}
+
+void omap_free_dma(int ch)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&dma_chan_lock, flags);
+	if (dma_chan[ch].dev_id == -1) {
+		printk("omap_dma: trying to free nonallocated DMA channel %d\n", ch);
+		spin_unlock_irqrestore(&dma_chan_lock, flags);
+		return;
+	}
+	dma_chan[ch].dev_id = -1;
+	spin_unlock_irqrestore(&dma_chan_lock, flags);
+
+	/* Disable all DMA interrupts for the channel. */
+	__raw_writew(0, OMAP_DMA_CICR_REG(ch));
+	/* Make sure the DMA transfer is stopped. */
+	__raw_writew(0, OMAP_DMA_CCR_REG(ch));
+}
+
+int omap_dma_in_1510_mode(void)
+{
+	return enable_1510_mode;
+}
+
+
+static struct lcd_dma_info {
+	spinlock_t lock;
+	int reserved;
+	void (* callback)(u16 status, void *data);
+	void *cb_data;
+
+	unsigned long addr, size;
+	int rotate, data_type, xres, yres;
+} lcd_dma;
+
+void omap_set_lcd_dma_b1(unsigned long addr, u16 fb_xres, u16 fb_yres,
+			 int data_type)
+{
+	lcd_dma.addr = addr;
+	lcd_dma.data_type = data_type;
+	lcd_dma.xres = fb_xres;
+	lcd_dma.yres = fb_yres;
+}
+
+static void set_b1_regs(void)
+{
+	unsigned long top, bottom;
+	int es;
+	u16 w, en, fn;
+	s16 ei;
+	s32 fi;
+	u32 l;
+
+	switch (lcd_dma.data_type) {
+	case OMAP_DMA_DATA_TYPE_S8:
+		es = 1;
+		break;
+	case OMAP_DMA_DATA_TYPE_S16:
+		es = 2;
+		break;
+	case OMAP_DMA_DATA_TYPE_S32:
+		es = 4;
+		break;
+	default:
+		BUG();
+		return;
+	}
+
+	if (lcd_dma.rotate == 0) {
+		top = lcd_dma.addr;
+		bottom = lcd_dma.addr + (lcd_dma.xres * lcd_dma.yres - 1) * es;
+		/* 1510 DMA requires the bottom address to be 2 more than the
+		 * actual last memory access location. */
+		if (omap_dma_in_1510_mode() &&
+		    lcd_dma.data_type == OMAP_DMA_DATA_TYPE_S32)
+			bottom += 2;
+		en = lcd_dma.xres;
+		fn = lcd_dma.yres;
+		ei = 0;
+		fi = 0;
+	} else {
+		top = lcd_dma.addr + (lcd_dma.xres - 1) * es;
+		bottom = lcd_dma.addr + (lcd_dma.yres - 1) * lcd_dma.xres * es;
+		en = lcd_dma.yres;
+		fn = lcd_dma.xres;
+		ei = (lcd_dma.xres - 1) * es + 1;
+		fi = -(lcd_dma.xres * (lcd_dma.yres - 1) + 2) * 2 + 1;
+	}
+
+	if (omap_dma_in_1510_mode()) {
+		__raw_writew(top >> 16, OMAP1510_DMA_LCD_TOP_F1_U);
+		__raw_writew(top, OMAP1510_DMA_LCD_TOP_F1_L);
+		__raw_writew(bottom >> 16, OMAP1510_DMA_LCD_BOT_F1_U);
+		__raw_writew(bottom, OMAP1510_DMA_LCD_BOT_F1_L);
+
+		return;
+	}
+
+	/* 1610 regs */
+	__raw_writew(top >> 16, OMAP1610_DMA_LCD_TOP_B1_U);
+	__raw_writew(top, OMAP1610_DMA_LCD_TOP_B1_L);
+	__raw_writew(bottom >> 16, OMAP1610_DMA_LCD_BOT_B1_U);
+	__raw_writew(bottom, OMAP1610_DMA_LCD_BOT_B1_L);
+
+	__raw_writew(en, OMAP1610_DMA_LCD_SRC_EN_B1);
+	__raw_writew(fn, OMAP1610_DMA_LCD_SRC_FN_B1);
+
+	w = __raw_readw(OMAP1610_DMA_LCD_CSDP);
+	w &= ~0x03;
+	w |= lcd_dma.data_type;
+	__raw_writew(w, OMAP1610_DMA_LCD_CSDP);
+
+	if (!lcd_dma.rotate)
+		return;
+
+	/* Rotation stuff */
+	l = __raw_readw(OMAP1610_DMA_LCD_CSDP);
+	/* Disable burst access */
+	l &= ~(0x03 << 7);
+	__raw_writew(l, OMAP1610_DMA_LCD_CSDP);
+
+	l = __raw_readw(OMAP1610_DMA_LCD_CCR);
+	/* Set the double-indexed addressing mode */
+	l |= (0x03 << 12);
+	__raw_writew(l, OMAP1610_DMA_LCD_CCR);
+
+	__raw_writew(ei, OMAP1610_DMA_LCD_SRC_EI_B1);
+	__raw_writew(fi >> 16, OMAP1610_DMA_LCD_SRC_FI_B1_U);
+	__raw_writew(fi, OMAP1610_DMA_LCD_SRC_FI_B1_L);
+}
+
+void omap_set_lcd_dma_b1_rotation(int rotate)
+{
+	if (omap_dma_in_1510_mode()) {
+		printk(KERN_ERR "DMA rotation is not supported in 1510 mode\n");
+		BUG();
+		return;
+	}
+	lcd_dma.rotate = rotate;
+}
+
+int omap_request_lcd_dma(void (* callback)(u16 status, void *data),
+			 void *data)
+{
+	spin_lock_irq(&lcd_dma.lock);
+	if (lcd_dma.reserved) {
+		spin_unlock_irq(&lcd_dma.lock);
+		printk(KERN_ERR "LCD DMA channel already reserved\n");
+		BUG();
+		return -EBUSY;
+	}
+	lcd_dma.reserved = 1;
+	spin_unlock_irq(&lcd_dma.lock);
+	lcd_dma.callback = callback;
+	lcd_dma.cb_data = data;
+
+	return 0;
+}
+
+void omap_free_lcd_dma(void)
+{
+	spin_lock(&lcd_dma.lock);
+	if (!lcd_dma.reserved) {
+		spin_unlock(&lcd_dma.lock);
+		printk(KERN_ERR "LCD DMA is not reserved\n");
+		BUG();
+		return;
+	}
+	if (!enable_1510_mode)
+		__raw_writew(__raw_readw(OMAP1610_DMA_LCD_CCR) & ~1, OMAP1610_DMA_LCD_CCR);
+	lcd_dma.reserved = 0;
+	spin_unlock(&lcd_dma.lock);
+}
+
+void omap_start_lcd_dma(void)
+{
+	if (!enable_1510_mode) {
+		/* Set some reasonable defaults */
+		__raw_writew(0x9102, OMAP1610_DMA_LCD_CSDP);
+		__raw_writew(0x0004, OMAP1610_DMA_LCD_LCH_CTRL);
+		__raw_writew(0x5740, OMAP1610_DMA_LCD_CCR);
+	}
+	set_b1_regs();
+	if (!enable_1510_mode)
+		__raw_writew(__raw_readw(OMAP1610_DMA_LCD_CCR) | 1, OMAP1610_DMA_LCD_CCR);
+}
+
+void omap_stop_lcd_dma(void)
+{
+	if (!enable_1510_mode)
+		__raw_writew(__raw_readw(OMAP1610_DMA_LCD_CCR) & ~1, OMAP1610_DMA_LCD_CCR);
+}
+
+static int __init omap_init_dma(void)
+{
+	int ch, r;
+
+	if (cpu_is_omap1510()) {
+		printk(KERN_INFO "DMA support for OMAP1510 initialized\n");
+		dma_chan_count = 9;
+		enable_1510_mode = 1;
+	} else if (cpu_is_omap1610()) {
+		printk(KERN_INFO "OMAP DMA hardware version %d\n",
+		       __raw_readw(OMAP_DMA_HW_ID_REG));
+		printk(KERN_INFO "DMA capabilities: %08x:%08x:%04x:%04x:%04x\n",
+		       (__raw_readw(OMAP_DMA_CAPS_0_U_REG) << 16) | __raw_readw(OMAP_DMA_CAPS_0_L_REG),
+		       (__raw_readw(OMAP_DMA_CAPS_1_U_REG) << 16) | __raw_readw(OMAP_DMA_CAPS_1_L_REG),
+		       __raw_readw(OMAP_DMA_CAPS_2_REG), __raw_readw(OMAP_DMA_CAPS_3_REG),
+		       __raw_readw(OMAP_DMA_CAPS_4_REG));
+		if (!enable_1510_mode) {
+			u16 w;
+
+			/* Disable OMAP 3.0/3.1 compatibility mode. */
+			w = __raw_readw(OMAP_DMA_GSCR_REG);
+			w |= 1 << 3;
+			__raw_writew(w, OMAP_DMA_GSCR_REG);
+			dma_chan_count = OMAP_LOGICAL_DMA_CH_COUNT;
+		} else
+			dma_chan_count = 9;
+	} else {
+		dma_chan_count = 0;
+		return 0;
+	}
+
+	memset(&lcd_dma, 0, sizeof(lcd_dma));
+	spin_lock_init(&lcd_dma.lock);
+	spin_lock_init(&dma_chan_lock);
+	memset(&dma_chan, 0, sizeof(dma_chan));
+
+	for (ch = 0; ch < dma_chan_count; ch++) {
+		dma_chan[ch].dev_id = -1;
+		if (ch >= 6 && enable_1510_mode)
+			continue;
+
+		/* request_irq() doesn't like dev_id (ie. ch) being zero,
+		 * so we have to kludge around this. */
+		r = request_irq(dma_irq[ch], dma_irq_handler, 0, "DMA",
+				(void *) (ch + 1));
+		if (r != 0) {
+			int i;
+
+			printk(KERN_ERR "unable to request IRQ %d for DMA (error %d)\n",
+			       dma_irq[ch], r);
+			for (i = 0; i < ch; i++)
+				free_irq(dma_irq[i], (void *) (i + 1));
+			return r;
+		}
+	}
+
+	return 0;
+}
+arch_initcall(omap_init_dma);
+
+EXPORT_SYMBOL(omap_request_dma);
+EXPORT_SYMBOL(omap_free_dma);
+EXPORT_SYMBOL(omap_start_dma);
+EXPORT_SYMBOL(omap_stop_dma);
+EXPORT_SYMBOL(omap_set_dma_transfer_params);
+EXPORT_SYMBOL(omap_set_dma_src_params);
+EXPORT_SYMBOL(omap_set_dma_dest_params);
+
+EXPORT_SYMBOL(omap_request_lcd_dma);
+EXPORT_SYMBOL(omap_free_lcd_dma);
+EXPORT_SYMBOL(omap_start_lcd_dma);
+EXPORT_SYMBOL(omap_stop_lcd_dma);
+EXPORT_SYMBOL(omap_set_lcd_dma_b1);
+EXPORT_SYMBOL(omap_set_lcd_dma_b1_rotation);
--- diff/arch/arm/mach-omap/fpga.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-omap/fpga.c	2004-04-21 10:45:33.359632064 +0100
@@ -0,0 +1,209 @@
+/*
+ * linux/arch/arm/mach-omap/fpga.c
+ *
+ * Interrupt handler for OMAP-1510 FPGA
+ *
+ * Copyright (C) 2001 RidgeRun, Inc.
+ * Author: Greg Lonnon <glonnon@ridgerun.com>
+ *
+ * Copyright (C) 2002 MontaVista Software, Inc.
+ *
+ * Separated FPGA interrupts from innovator1510.c and cleaned up for 2.6
+ * Copyright (C) 2004 Nokia Corporation by Tony Lindrgen <tony@atomide.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/config.h>
+#include <linux/types.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/errno.h>
+
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/mach/irq.h>
+
+#include <asm/arch/fpga.h>
+#include <asm/arch/gpio.h>
+
+unsigned char fpga_read(int reg)
+{
+	return __raw_readb(reg);
+}
+
+void fpga_write(unsigned char val, int reg)
+{
+	__raw_writeb(val, reg);
+}
+
+static void fpga_mask_irq(unsigned int irq)
+{
+	irq -= IH_FPGA_BASE;
+
+	if (irq < 8)
+		__raw_writeb((__raw_readb(OMAP1510P1_FPGA_IMR_LO)
+			      & ~(1 << irq)), OMAP1510P1_FPGA_IMR_LO);
+	else if (irq < 16)
+		__raw_writeb((__raw_readb(OMAP1510P1_FPGA_IMR_HI)
+			      & ~(1 << (irq - 8))), OMAP1510P1_FPGA_IMR_HI);
+	else
+		__raw_writeb((__raw_readb(INNOVATOR_FPGA_IMR2)
+			      & ~(1 << (irq - 16))), INNOVATOR_FPGA_IMR2);
+}
+
+
+static inline u32 get_fpga_unmasked_irqs(void)
+{
+	return
+		((__raw_readb(OMAP1510P1_FPGA_ISR_LO) &
+		  __raw_readb(OMAP1510P1_FPGA_IMR_LO))) |
+		((__raw_readb(OMAP1510P1_FPGA_ISR_HI) &
+		  __raw_readb(OMAP1510P1_FPGA_IMR_HI)) << 8) |
+		((__raw_readb(INNOVATOR_FPGA_ISR2) &
+		  __raw_readb(INNOVATOR_FPGA_IMR2)) << 16);
+}
+
+
+static void fpga_ack_irq(unsigned int irq)
+{
+	/* Don't need to explicitly ACK FPGA interrupts */
+}
+
+static void fpga_unmask_irq(unsigned int irq)
+{
+	irq -= IH_FPGA_BASE;
+
+	if (irq < 8)
+		__raw_writeb((__raw_readb(OMAP1510P1_FPGA_IMR_LO) | (1 << irq)),
+		     OMAP1510P1_FPGA_IMR_LO);
+	else if (irq < 16)
+		__raw_writeb((__raw_readb(OMAP1510P1_FPGA_IMR_HI)
+			      | (1 << (irq - 8))), OMAP1510P1_FPGA_IMR_HI);
+	else
+		__raw_writeb((__raw_readb(INNOVATOR_FPGA_IMR2)
+			      | (1 << (irq - 16))), INNOVATOR_FPGA_IMR2);
+}
+
+static void fpga_mask_ack_irq(unsigned int irq)
+{
+	fpga_mask_irq(irq);
+	fpga_ack_irq(irq);
+}
+
+void innovator_fpga_IRQ_demux(unsigned int irq, struct irqdesc *desc,
+			      struct pt_regs *regs)
+{
+	struct irqdesc *d;
+	u32 stat;
+	int fpga_irq;
+
+	/*
+	 * Acknowledge the parent IRQ.
+	 */
+	desc->chip->ack(irq);
+
+	for (;;) {
+		stat = get_fpga_unmasked_irqs();
+
+		if (!stat) {
+			break;
+		}
+
+		for (fpga_irq = IH_FPGA_BASE;
+			(fpga_irq < (IH_FPGA_BASE + NR_FPGA_IRQS)) && stat;
+			fpga_irq++, stat >>= 1) {
+			if (stat & 1) {
+				d = irq_desc + fpga_irq;
+				d->handle(fpga_irq, d, regs);
+				desc->chip->unmask(irq);
+			}
+		}
+	}
+}
+
+static struct irqchip omap_fpga_irq_ack = {
+	.ack		= fpga_mask_ack_irq,
+	.mask		= fpga_mask_irq,
+	.unmask		= fpga_unmask_irq,
+};
+
+
+static struct irqchip omap_fpga_irq = {
+	.ack		= fpga_ack_irq,
+	.mask		= fpga_mask_irq,
+	.unmask		= fpga_unmask_irq,
+};
+
+/*
+ * All of the FPGA interrupt request inputs except for the touchscreen are
+ * edge-sensitive; the touchscreen is level-sensitive.  The edge-sensitive
+ * interrupts are acknowledged as a side-effect of reading the interrupt
+ * status register from the FPGA.  The edge-sensitive interrupt inputs
+ * cause a problem with level interrupt requests, such as Ethernet.  The
+ * problem occurs when a level interrupt request is asserted while its
+ * interrupt input is masked in the FPGA, which results in a missed
+ * interrupt.
+ *
+ * In an attempt to workaround the problem with missed interrupts, the
+ * mask_ack routine for all of the FPGA interrupts has been changed from
+ * fpga_mask_ack_irq() to fpga_ack_irq() so that the specific FPGA interrupt
+ * being serviced is left unmasked.  We can do this because the FPGA cascade
+ * interrupt is installed with the SA_INTERRUPT flag, which leaves all
+ * interrupts masked at the CPU while an FPGA interrupt handler executes.
+ *
+ * Limited testing indicates that this workaround appears to be effective
+ * for the smc9194 Ethernet driver used on the Innovator.  It should work
+ * on other FPGA interrupts as well, but any drivers that explicitly mask
+ * interrupts at the interrupt controller via disable_irq/enable_irq
+ * could pose a problem.
+ */
+void fpga_init_irq(void)
+{
+	int i;
+
+	__raw_writeb(0, OMAP1510P1_FPGA_IMR_LO);
+	__raw_writeb(0, OMAP1510P1_FPGA_IMR_HI);
+	__raw_writeb(0, INNOVATOR_FPGA_IMR2);
+
+	for (i = IH_FPGA_BASE; i < (IH_FPGA_BASE + NR_FPGA_IRQS); i++) {
+
+		if (i == INT_FPGA_TS) {
+			/*
+			 * The touchscreen interrupt is level-sensitive, so
+			 * we'll use the regular mask_ack routine for it.
+			 */
+			set_irq_chip(i, &omap_fpga_irq_ack);
+		}
+		else {
+			/*
+			 * All FPGA interrupts except the touchscreen are
+			 * edge-sensitive, so we won't mask them.
+			 */
+			set_irq_chip(i, &omap_fpga_irq);
+		}
+
+		set_irq_handler(i, do_level_IRQ);
+		set_irq_flags(i, IRQF_VALID);
+	}
+
+	/*
+	 * The FPGA interrupt line is connected to GPIO13. Claim this pin for
+	 * the ARM.
+	 *
+	 * NOTE: For general GPIO/MPUIO access and interrupts, please see
+	 * gpio.[ch]
+	 */
+	omap_request_gpio(13);
+	omap_set_gpio_direction(13, 1);
+	omap_set_gpio_edge_ctrl(13, OMAP_GPIO_RISING_EDGE);
+	set_irq_chained_handler(INT_FPGA, innovator_fpga_IRQ_demux);
+}
+
+EXPORT_SYMBOL(fpga_init_irq);
+EXPORT_SYMBOL(fpga_read);
+EXPORT_SYMBOL(fpga_write);
--- diff/arch/arm/mach-omap/gpio.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-omap/gpio.c	2004-04-21 10:45:33.360631912 +0100
@@ -0,0 +1,755 @@
+/*
+ *  linux/arch/arm/mach-omap/gpio.c
+ *
+ * Support functions for OMAP GPIO
+ *
+ * Copyright (C) 2003 Nokia Corporation
+ * Written by Juha Yrjölä <juha.yrjola@nokia.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/config.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/sched.h>
+#include <linux/interrupt.h>
+#include <linux/ptrace.h>
+
+#include <asm/hardware.h>
+#include <asm/irq.h>
+#include <asm/arch/irqs.h>
+#include <asm/arch/gpio.h>
+#include <asm/arch/pm.h>
+#include <asm/mach/irq.h>
+
+#include <asm/io.h>
+
+/*
+ * OMAP1510 GPIO registers
+ */
+#define OMAP1510_GPIO_BASE		0xfffce000
+#define OMAP1510_GPIO_DATA_INPUT	0x00
+#define OMAP1510_GPIO_DATA_OUTPUT	0x04
+#define OMAP1510_GPIO_DIR_CONTROL	0x08
+#define OMAP1510_GPIO_INT_CONTROL	0x0c
+#define OMAP1510_GPIO_INT_MASK		0x10
+#define OMAP1510_GPIO_INT_STATUS	0x14
+#define OMAP1510_GPIO_PIN_CONTROL	0x18
+
+#define OMAP1510_IH_GPIO_BASE		64
+
+/*
+ * OMAP1610 specific GPIO registers
+ */
+#define OMAP1610_GPIO1_BASE		0xfffbe400
+#define OMAP1610_GPIO2_BASE		0xfffbec00
+#define OMAP1610_GPIO3_BASE		0xfffbb400
+#define OMAP1610_GPIO4_BASE		0xfffbbc00
+#define OMAP1610_GPIO_REVISION		0x0000
+#define OMAP1610_GPIO_SYSCONFIG		0x0010
+#define OMAP1610_GPIO_SYSSTATUS		0x0014
+#define OMAP1610_GPIO_IRQSTATUS1	0x0018
+#define OMAP1610_GPIO_IRQENABLE1	0x001c
+#define OMAP1610_GPIO_DATAIN		0x002c
+#define OMAP1610_GPIO_DATAOUT		0x0030
+#define OMAP1610_GPIO_DIRECTION		0x0034
+#define OMAP1610_GPIO_EDGE_CTRL1	0x0038
+#define OMAP1610_GPIO_EDGE_CTRL2	0x003c
+#define OMAP1610_GPIO_CLEAR_IRQENABLE1	0x009c
+#define OMAP1610_GPIO_CLEAR_DATAOUT	0x00b0
+#define OMAP1610_GPIO_SET_IRQENABLE1	0x00dc
+#define OMAP1610_GPIO_SET_DATAOUT	0x00f0
+
+/*
+ * OMAP730 specific GPIO registers
+ */
+#define OMAP730_GPIO1_BASE		0xfffbc000
+#define OMAP730_GPIO2_BASE		0xfffbc800
+#define OMAP730_GPIO3_BASE		0xfffbd000
+#define OMAP730_GPIO4_BASE		0xfffbd800
+#define OMAP730_GPIO5_BASE		0xfffbe000
+#define OMAP730_GPIO6_BASE		0xfffbe800
+#define OMAP730_GPIO_DATA_INPUT		0x00
+#define OMAP730_GPIO_DATA_OUTPUT	0x04
+#define OMAP730_GPIO_DIR_CONTROL	0x08
+#define OMAP730_GPIO_INT_CONTROL	0x0c
+#define OMAP730_GPIO_INT_MASK		0x10
+#define OMAP730_GPIO_INT_STATUS		0x14
+
+#define OMAP_MPUIO_MASK         (~OMAP_MAX_GPIO_LINES & 0xff)
+
+struct gpio_bank {
+	u32 base;
+	u16 irq;
+	u16 virtual_irq_start;
+	u8 method;
+	u32 reserved_map;
+	spinlock_t lock;
+};
+
+#define METHOD_MPUIO		0
+#define METHOD_GPIO_1510	1
+#define METHOD_GPIO_1610	2
+#define METHOD_GPIO_730	3
+
+#ifdef CONFIG_ARCH_OMAP1610
+static struct gpio_bank gpio_bank_1610[5] = {
+	{ OMAP_MPUIO_BASE,     INT_MPUIO,	    IH_MPUIO_BASE,     METHOD_MPUIO},
+	{ OMAP1610_GPIO1_BASE, INT_GPIO_BANK1,	    IH_GPIO_BASE,      METHOD_GPIO_1610 },
+	{ OMAP1610_GPIO2_BASE, INT_1610_GPIO_BANK2, IH_GPIO_BASE + 16, METHOD_GPIO_1610 },
+	{ OMAP1610_GPIO3_BASE, INT_1610_GPIO_BANK3, IH_GPIO_BASE + 32, METHOD_GPIO_1610 },
+	{ OMAP1610_GPIO4_BASE, INT_1610_GPIO_BANK4, IH_GPIO_BASE + 48, METHOD_GPIO_1610 },
+};
+#endif
+
+#ifdef CONFIG_ARCH_OMAP1510
+static struct gpio_bank gpio_bank_1510[2] = {
+	{ OMAP_MPUIO_BASE,    INT_MPUIO,      IH_MPUIO_BASE, METHOD_MPUIO },
+	{ OMAP1510_GPIO_BASE, INT_GPIO_BANK1, IH_GPIO_BASE,  METHOD_GPIO_1510 }
+};
+#endif
+
+#ifdef CONFIG_ARCH_OMAP730
+static struct gpio_bank gpio_bank_730[7] = {
+	{ OMAP_MPUIO_BASE,     INT_MPUIO,	    IH_MPUIO_BASE,	METHOD_MPUIO },
+	{ OMAP730_GPIO1_BASE,  INT_GPIO_BANK1,	    IH_GPIO_BASE,	METHOD_GPIO_730 },
+	{ OMAP730_GPIO2_BASE,  INT_730_GPIO_BANK2,  IH_GPIO_BASE + 32,	METHOD_GPIO_730 },
+	{ OMAP730_GPIO3_BASE,  INT_730_GPIO_BANK3,  IH_GPIO_BASE + 64,	METHOD_GPIO_730 },
+	{ OMAP730_GPIO4_BASE,  INT_730_GPIO_BANK4,  IH_GPIO_BASE + 96,	METHOD_GPIO_730 },
+	{ OMAP730_GPIO5_BASE,  INT_730_GPIO_BANK5,  IH_GPIO_BASE + 128, METHOD_GPIO_730 },
+	{ OMAP730_GPIO6_BASE,  INT_730_GPIO_BANK6,  IH_GPIO_BASE + 160, METHOD_GPIO_730 },
+};
+#endif
+
+static struct gpio_bank *gpio_bank;
+static int gpio_bank_count;
+
+static inline struct gpio_bank *get_gpio_bank(int gpio)
+{
+#ifdef CONFIG_ARCH_OMAP1510
+	if (cpu_is_omap1510()) {
+		if (OMAP_GPIO_IS_MPUIO(gpio))
+			return &gpio_bank[0];
+		return &gpio_bank[1];
+	}
+#endif
+#ifdef CONFIG_ARCH_OMAP1610
+	if (cpu_is_omap1610()) {
+		if (OMAP_GPIO_IS_MPUIO(gpio))
+			return &gpio_bank[0];
+		return &gpio_bank[1 + (gpio >> 4)];
+	}
+#endif
+#ifdef CONFIG_ARCH_OMAP730
+	if (cpu_is_omap730()) {
+		if (OMAP_GPIO_IS_MPUIO(gpio))
+			return &gpio_bank[0];
+		return &gpio_bank[1 + (gpio >> 5)];
+	}
+#endif
+}
+
+static inline int get_gpio_index(int gpio)
+{
+	if (cpu_is_omap730())
+		return gpio & 0x1f;
+	else
+		return gpio & 0x0f;
+}
+
+static inline int gpio_valid(int gpio)
+{
+	if (gpio < 0)
+		return -1;
+	if (OMAP_GPIO_IS_MPUIO(gpio)) {
+		if ((gpio & OMAP_MPUIO_MASK) > 16)
+			return -1;
+		return 0;
+	}
+#ifdef CONFIG_ARCH_OMAP1510
+	if (cpu_is_omap1510() && gpio < 16)
+		return 0;
+#endif
+#ifdef CONFIG_ARCH_OMAP1610
+	if (cpu_is_omap1610() && gpio < 64)
+		return 0;
+#endif
+#ifdef CONFIG_ARCH_OMAP1610
+	if (cpu_is_omap730() && gpio < 192)
+		return 0;
+#endif
+	return -1;
+}
+
+static int check_gpio(int gpio)
+{
+	if (unlikely(gpio_valid(gpio)) < 0) {
+		printk(KERN_ERR "omap-gpio: invalid GPIO %d\n", gpio);
+		dump_stack();
+		return -1;
+	}
+	return 0;
+}
+
+static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input)
+{
+	u32 reg = bank->base;
+	u32 l;
+
+	switch (bank->method) {
+	case METHOD_MPUIO:
+		reg += OMAP_MPUIO_IO_CNTL;
+		break;
+	case METHOD_GPIO_1510:
+		reg += OMAP1510_GPIO_DIR_CONTROL;
+		break;
+	case METHOD_GPIO_1610:
+		reg += OMAP1610_GPIO_DIRECTION;
+		break;
+	case METHOD_GPIO_730:
+		reg += OMAP730_GPIO_DIR_CONTROL;
+		break;
+	}
+	l = __raw_readl(reg);
+	if (is_input)
+		l |= 1 << gpio;
+	else
+		l &= ~(1 << gpio);
+	__raw_writel(l, reg);
+}
+
+void omap_set_gpio_direction(int gpio, int is_input)
+{
+	struct gpio_bank *bank;
+
+	if (check_gpio(gpio) < 0)
+		return;
+	bank = get_gpio_bank(gpio);
+	spin_lock(&bank->lock);
+	_set_gpio_direction(bank, get_gpio_index(gpio), is_input);
+	spin_unlock(&bank->lock);
+}
+
+static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable)
+{
+	u32 reg = bank->base;
+	u32 l = 0;
+
+	switch (bank->method) {
+	case METHOD_MPUIO:
+		reg += OMAP_MPUIO_OUTPUT_REG;
+		l = __raw_readl(reg);
+		if (enable)
+			l |= 1 << gpio;
+		else
+			l &= ~(1 << gpio);
+		break;
+	case METHOD_GPIO_1510:
+		reg += OMAP1510_GPIO_DATA_OUTPUT;
+		l = __raw_readl(reg);
+		if (enable)
+			l |= 1 << gpio;
+		else
+			l &= ~(1 << gpio);
+		break;
+	case METHOD_GPIO_1610:
+		if (enable)
+			reg += OMAP1610_GPIO_SET_DATAOUT;
+		else
+			reg += OMAP1610_GPIO_CLEAR_DATAOUT;
+		l = 1 << gpio;
+		break;
+	case METHOD_GPIO_730:
+		reg += OMAP730_GPIO_DATA_OUTPUT;
+		l = __raw_readl(reg);
+		if (enable)
+			l |= 1 << gpio;
+		else
+			l &= ~(1 << gpio);
+		break;
+	default:
+		BUG();
+		return;
+	}
+	__raw_writel(l, reg);
+}
+
+void omap_set_gpio_dataout(int gpio, int enable)
+{
+	struct gpio_bank *bank;
+
+	if (check_gpio(gpio) < 0)
+		return;
+	bank = get_gpio_bank(gpio);
+	spin_lock(&bank->lock);
+	_set_gpio_dataout(bank, get_gpio_index(gpio), enable);
+	spin_unlock(&bank->lock);
+}
+
+int omap_get_gpio_datain(int gpio)
+{
+	struct gpio_bank *bank;
+	u32 reg;
+
+	if (check_gpio(gpio) < 0)
+		return -1;
+	bank = get_gpio_bank(gpio);
+	reg = bank->base;
+	switch (bank->method) {
+	case METHOD_MPUIO:
+		reg += OMAP_MPUIO_INPUT_LATCH;
+		break;
+	case METHOD_GPIO_1510:
+		reg += OMAP1510_GPIO_DATA_INPUT;
+		break;
+	case METHOD_GPIO_1610:
+		reg += OMAP1610_GPIO_DATAIN;
+		break;
+	default:
+		BUG();
+		return -1;
+	}
+	return (__raw_readl(reg) & (1 << get_gpio_index(gpio))) != 0;
+}
+
+static void _set_gpio_edge_ctrl(struct gpio_bank *bank, int gpio, int edge)
+{
+	u32 reg = bank->base;
+	u32 l;
+
+	switch (bank->method) {
+	case METHOD_MPUIO:
+		reg += OMAP_MPUIO_GPIO_INT_EDGE_REG;
+		l = __raw_readl(reg);
+		if (edge == OMAP_GPIO_RISING_EDGE)
+			l |= 1 << gpio;
+		else
+			l &= ~(1 << gpio);
+		__raw_writel(l, reg);
+		break;
+	case METHOD_GPIO_1510:
+		reg += OMAP1510_GPIO_INT_CONTROL;
+		l = __raw_readl(reg);
+		if (edge == OMAP_GPIO_RISING_EDGE)
+			l |= 1 << gpio;
+		else
+			l &= ~(1 << gpio);
+		__raw_writel(l, reg);
+		break;
+	case METHOD_GPIO_1610:
+		edge &= 0x03;
+		if (gpio & 0x08)
+			reg += OMAP1610_GPIO_EDGE_CTRL2;
+		else
+			reg += OMAP1610_GPIO_EDGE_CTRL1;
+		gpio &= 0x07;
+		l = __raw_readl(reg);
+		l &= ~(3 << (gpio << 1));
+		l |= edge << (gpio << 1);
+		__raw_writel(l, reg);
+		break;
+	case METHOD_GPIO_730:
+		reg += OMAP730_GPIO_INT_CONTROL;
+		l = __raw_readl(reg);
+		if (edge == OMAP_GPIO_RISING_EDGE)
+			l |= 1 << gpio;
+		else
+			l &= ~(1 << gpio);
+		__raw_writel(l, reg);
+		break;
+	default:
+		BUG();
+		return;
+	}
+}
+
+void omap_set_gpio_edge_ctrl(int gpio, int edge)
+{
+	struct gpio_bank *bank;
+
+	if (check_gpio(gpio) < 0)
+		return;
+	bank = get_gpio_bank(gpio);
+	spin_lock(&bank->lock);
+	_set_gpio_edge_ctrl(bank, get_gpio_index(gpio), edge);
+	spin_unlock(&bank->lock);
+}
+
+
+static int _get_gpio_edge_ctrl(struct gpio_bank *bank, int gpio)
+{
+	u32 reg = bank->base, l;
+
+	switch (bank->method) {
+	case METHOD_MPUIO:
+		l = __raw_readl(reg + OMAP_MPUIO_GPIO_INT_EDGE_REG);
+		return (l & (1 << gpio)) ?
+			OMAP_GPIO_RISING_EDGE : OMAP_GPIO_FALLING_EDGE;
+	case METHOD_GPIO_1510:
+		l = __raw_readl(reg + OMAP1510_GPIO_INT_CONTROL);
+		return (l & (1 << gpio)) ?
+			OMAP_GPIO_RISING_EDGE : OMAP_GPIO_FALLING_EDGE;
+	case METHOD_GPIO_1610:
+		if (gpio & 0x08)
+			reg += OMAP1610_GPIO_EDGE_CTRL2;
+		else
+			reg += OMAP1610_GPIO_EDGE_CTRL1;
+		return (__raw_readl(reg) >> ((gpio & 0x07) << 1)) & 0x03;
+	case METHOD_GPIO_730:
+		l = __raw_readl(reg + OMAP730_GPIO_INT_CONTROL);
+		return (l & (1 << gpio)) ?
+			OMAP_GPIO_RISING_EDGE : OMAP_GPIO_FALLING_EDGE;
+	default:
+		BUG();
+		return -1;
+	}
+}
+
+static void _clear_gpio_irqstatus(struct gpio_bank *bank, int gpio)
+{
+	u32 reg = bank->base;
+
+	switch (bank->method) {
+	case METHOD_MPUIO:
+		/* MPUIO irqstatus cannot be cleared one bit at a time,
+		 * so do nothing here */
+		return;
+	case METHOD_GPIO_1510:
+		reg += OMAP1510_GPIO_INT_STATUS;
+		break;
+	case METHOD_GPIO_1610:
+		reg += OMAP1610_GPIO_IRQSTATUS1;
+		break;
+	case METHOD_GPIO_730:
+		reg += OMAP730_GPIO_INT_STATUS;
+		break;
+	default:
+		BUG();
+		return;
+	}
+	__raw_writel(1 << get_gpio_index(gpio), reg);
+}
+
+static void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int enable)
+{
+	u32 reg = bank->base;
+	u32 l;
+
+	switch (bank->method) {
+	case METHOD_MPUIO:
+		reg += OMAP_MPUIO_GPIO_MASKIT;
+		l = __raw_readl(reg);
+		if (enable)
+			l &= ~(1 << gpio);
+		else
+			l |= 1 << gpio;
+		break;
+	case METHOD_GPIO_1510:
+		reg += OMAP1510_GPIO_INT_MASK;
+		l = __raw_readl(reg);
+		if (enable)
+			l &= ~(1 << gpio);
+		else
+			l |= 1 << gpio;
+		break;
+	case METHOD_GPIO_1610:
+		if (enable) {
+			reg += OMAP1610_GPIO_SET_IRQENABLE1;
+			_clear_gpio_irqstatus(bank, gpio);
+		} else
+			reg += OMAP1610_GPIO_CLEAR_IRQENABLE1;
+		l = 1 << gpio;
+		break;
+	case METHOD_GPIO_730:
+		reg += OMAP730_GPIO_INT_MASK;
+		l = __raw_readl(reg);
+		if (enable)
+			l &= ~(1 << gpio);
+		else
+			l |= 1 << gpio;
+		break;
+	default:
+		BUG();
+		return;
+	}
+	__raw_writel(l, reg);
+}
+
+int omap_request_gpio(int gpio)
+{
+	struct gpio_bank *bank;
+
+	if (check_gpio(gpio) < 0)
+		return -EINVAL;
+
+	bank = get_gpio_bank(gpio);
+	spin_lock(&bank->lock);
+	if (unlikely(bank->reserved_map & (1 << get_gpio_index(gpio)))) {
+		printk(KERN_ERR "omap-gpio: GPIO %d is already reserved!\n", gpio);
+		dump_stack();
+		spin_unlock(&bank->lock);
+		return -1;
+	}
+	bank->reserved_map |= (1 << get_gpio_index(gpio));
+#ifdef CONFIG_ARCH_OMAP1510
+	if (bank->method == METHOD_GPIO_1510) {
+		u32 reg;
+
+		/* Claim the pin for the ARM */
+		reg = bank->base + OMAP1510_GPIO_PIN_CONTROL;
+		__raw_writel(__raw_readl(reg) | (1 << get_gpio_index(gpio)), reg);
+	}
+#endif
+	spin_unlock(&bank->lock);
+
+	return 0;
+}
+
+void omap_free_gpio(int gpio)
+{
+	struct gpio_bank *bank;
+
+	if (check_gpio(gpio) < 0)
+		return;
+	bank = get_gpio_bank(gpio);
+	spin_lock(&bank->lock);
+	if (unlikely(!(bank->reserved_map & (1 << get_gpio_index(gpio))))) {
+		printk(KERN_ERR "omap-gpio: GPIO %d wasn't reserved!\n", gpio);
+		dump_stack();
+		spin_unlock(&bank->lock);
+		return;
+	}
+	bank->reserved_map &= ~(1 << get_gpio_index(gpio));
+	_set_gpio_direction(bank, get_gpio_index(gpio), 1);
+	_set_gpio_irqenable(bank, get_gpio_index(gpio), 0);
+	spin_unlock(&bank->lock);
+}
+
+static void gpio_irq_handler(unsigned int irq, struct irqdesc *desc,
+			     struct pt_regs *regs)
+{
+	u32 isr_reg = 0;
+	struct gpio_bank *bank = (struct gpio_bank *) desc->data;
+
+	/*
+	 * Acknowledge the parent IRQ.
+	 */
+	desc->chip->ack(irq);
+
+	/* Since the level 1 GPIO interrupt cascade (IRQ14) is configured as
+	 * edge-sensitive, we need to unmask it here in order to avoid missing
+	 * any additional GPIO interrupts that might occur after the last time
+	 * we check for pending GPIO interrupts here.
+	 * We are relying on the fact that this interrupt handler was installed
+	 * with the SA_INTERRUPT flag so that interrupts are disabled at the
+	 * CPU while it is executing.
+	 */
+	desc->chip->unmask(irq);
+
+	if (bank->method == METHOD_MPUIO)
+		isr_reg = bank->base + OMAP_MPUIO_GPIO_INT;
+#ifdef CONFIG_ARCH_OMAP1510
+	if (bank->method == METHOD_GPIO_1510)
+		isr_reg = bank->base + OMAP1510_GPIO_INT_STATUS;
+#endif
+#ifdef CONFIG_ARCH_OMAP1610
+	if (bank->method == METHOD_GPIO_1610)
+		isr_reg = bank->base + OMAP1610_GPIO_IRQSTATUS1;
+#endif
+#ifdef CONFIG_ARCH_OMAP730
+	if (bank->method == METHOD_GPIO_730)
+		isr_reg = bank->base + OMAP730_GPIO_INT_STATUS;
+#endif
+	for (;;) {
+		u32 isr = __raw_readl(isr_reg);
+		unsigned int gpio_irq;
+
+		if (!isr)
+			break;
+		gpio_irq = bank->virtual_irq_start;
+
+		for (; isr != 0; isr >>= 1, gpio_irq++) {
+			if (isr & 1) {
+				struct irqdesc *d = irq_desc + gpio_irq;
+				d->handle(gpio_irq, d, regs);
+			}
+		}
+	}
+}
+
+static void gpio_ack_irq(unsigned int irq)
+{
+	unsigned int gpio = irq - IH_GPIO_BASE;
+	struct gpio_bank *bank = get_gpio_bank(gpio);
+
+#ifdef CONFIG_ARCH_OMAP1510
+	if (bank->method == METHOD_GPIO_1510)
+		__raw_writew(1 << gpio, bank->base + OMAP1510_GPIO_INT_STATUS);
+#endif
+#ifdef CONFIG_ARCH_OMAP1610
+	if (bank->method == METHOD_GPIO_1610)
+		__raw_writew(1 << gpio, bank->base + OMAP1610_GPIO_IRQSTATUS1);
+#endif
+#ifdef CONFIG_ARCH_OMAP730
+	if (bank->method == METHOD_GPIO_730)
+		__raw_writel(1 << gpio, bank->base + OMAP730_GPIO_INT_STATUS);
+#endif
+}
+
+static void gpio_mask_irq(unsigned int irq)
+{
+	unsigned int gpio = irq - IH_GPIO_BASE;
+	struct gpio_bank *bank = get_gpio_bank(gpio);
+
+	_set_gpio_irqenable(bank, get_gpio_index(gpio), 0);
+}
+
+static void gpio_unmask_irq(unsigned int irq)
+{
+	unsigned int gpio = irq - IH_GPIO_BASE;
+	struct gpio_bank *bank = get_gpio_bank(gpio);
+
+	if (_get_gpio_edge_ctrl(bank, get_gpio_index(gpio)) == OMAP_GPIO_NO_EDGE) {
+		printk(KERN_ERR "OMAP GPIO %d: trying to enable GPIO IRQ while no edge is set\n",
+		       gpio);
+		_set_gpio_edge_ctrl(bank, get_gpio_index(gpio), OMAP_GPIO_RISING_EDGE);
+	}
+	_set_gpio_irqenable(bank, get_gpio_index(gpio), 1);
+}
+
+static void mpuio_ack_irq(unsigned int irq)
+{
+	/* The ISR is reset automatically, so do nothing here. */
+}
+
+static void mpuio_mask_irq(unsigned int irq)
+{
+	unsigned int gpio = OMAP_MPUIO(irq - IH_MPUIO_BASE);
+	struct gpio_bank *bank = get_gpio_bank(gpio);
+
+	_set_gpio_irqenable(bank, gpio, 0);
+}
+
+static void mpuio_unmask_irq(unsigned int irq)
+{
+	unsigned int gpio = OMAP_MPUIO(irq - IH_MPUIO_BASE);
+	struct gpio_bank *bank = get_gpio_bank(gpio);
+
+	_set_gpio_irqenable(bank, gpio, 1);
+}
+
+static struct irqchip gpio_irq_chip = {
+	.ack	= gpio_ack_irq,
+	.mask	= gpio_mask_irq,
+	.unmask = gpio_unmask_irq,
+};
+
+static struct irqchip mpuio_irq_chip = {
+	.ack	= mpuio_ack_irq,
+	.mask	= mpuio_mask_irq,
+	.unmask = mpuio_unmask_irq
+};
+
+static int initialized = 0;
+
+static int __init _omap_gpio_init(void)
+{
+	int i;
+	struct gpio_bank *bank;
+
+	initialized = 1;
+
+#ifdef CONFIG_ARCH_OMAP1510
+	if (cpu_is_omap1510()) {
+		printk(KERN_INFO "OMAP1510 GPIO hardware\n");
+		gpio_bank_count = 2;
+		gpio_bank = gpio_bank_1510;
+	}
+#endif
+#ifdef CONFIG_ARCH_OMAP1610
+	if (cpu_is_omap1610()) {
+		int rev;
+
+		gpio_bank_count = 5;
+		gpio_bank = gpio_bank_1610;
+		rev = __raw_readw(gpio_bank[1].base + OMAP1610_GPIO_REVISION);
+		printk(KERN_INFO "OMAP GPIO hardware version %d.%d\n",
+		       (rev >> 4) & 0x0f, rev & 0x0f);
+	}
+#endif
+#ifdef CONFIG_ARCH_OMAP730
+	if (cpu_is_omap730()) {
+		printk(KERN_INFO "OMAP730 GPIO hardware\n");
+		gpio_bank_count = 7;
+		gpio_bank = gpio_bank_730;
+	}
+#endif
+	for (i = 0; i < gpio_bank_count; i++) {
+		int j, gpio_count = 16;
+
+		bank = &gpio_bank[i];
+		bank->reserved_map = 0;
+		spin_lock_init(&bank->lock);
+		if (bank->method == METHOD_MPUIO) {
+			__raw_writew(0xFFFF, OMAP_MPUIO_BASE + OMAP_MPUIO_GPIO_MASKIT);
+		}
+#ifdef CONFIG_ARCH_OMAP1510
+		if (bank->method == METHOD_GPIO_1510) {
+			__raw_writew(0xffff, bank->base + OMAP1510_GPIO_INT_MASK);
+			__raw_writew(0x0000, bank->base + OMAP1510_GPIO_INT_STATUS);
+		}
+#endif
+#ifdef CONFIG_ARCH_OMAP1610
+		if (bank->method == METHOD_GPIO_1610) {
+			__raw_writew(0x0000, bank->base + OMAP1610_GPIO_IRQENABLE1);
+			__raw_writew(0xffff, bank->base + OMAP1610_GPIO_IRQSTATUS1);
+		}
+#endif
+#ifdef CONFIG_ARCH_OMAP730
+		if (bank->method == METHOD_GPIO_730) {
+			__raw_writel(0xffffffff, bank->base + OMAP730_GPIO_INT_MASK);
+			__raw_writel(0x00000000, bank->base + OMAP730_GPIO_INT_STATUS);
+
+			gpio_count = 32; /* 730 has 32-bit GPIOs */
+		}
+#endif
+		for (j = bank->virtual_irq_start;
+		     j < bank->virtual_irq_start + gpio_count; j++) {
+			if (bank->method == METHOD_MPUIO)
+				set_irq_chip(j, &mpuio_irq_chip);
+			else
+				set_irq_chip(j, &gpio_irq_chip);
+			set_irq_handler(j, do_level_IRQ);
+			set_irq_flags(j, IRQF_VALID);
+		}
+		set_irq_chained_handler(bank->irq, gpio_irq_handler);
+		set_irq_data(bank->irq, bank);
+	}
+
+	/* Enable system clock for GPIO module.
+	 * The CAM_CLK_CTRL_REG *is* really the right place. */
+	if (cpu_is_omap1610())
+		__raw_writel(__raw_readl(ULPD_CAM_CLK_CTRL_REG) | 0x04, ULPD_CAM_CLK_CTRL_REG);
+
+	return 0;
+}
+
+/*
+ * This may get called early from board specific init
+ */
+int omap_gpio_init(void)
+{
+	if (!initialized)
+		return _omap_gpio_init();
+	else
+		return 0;
+}
+
+EXPORT_SYMBOL(omap_gpio_init);
+EXPORT_SYMBOL(omap_request_gpio);
+EXPORT_SYMBOL(omap_free_gpio);
+
+arch_initcall(omap_gpio_init);
--- diff/arch/arm/mach-omap/innovator1510.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-omap/innovator1510.c	2004-04-21 10:45:33.360631912 +0100
@@ -0,0 +1,99 @@
+/*
+ * linux/arch/arm/mach-omap/innovator1510.c
+ *
+ * Board specific inits for OMAP-1510 Innovator
+ *
+ * Copyright (C) 2001 RidgeRun, Inc.
+ * Author: Greg Lonnon <glonnon@ridgerun.com>
+ *
+ * Copyright (C) 2002 MontaVista Software, Inc.
+ *
+ * Separated FPGA interrupts from innovator1510.c and cleaned up for 2.6
+ * Copyright (C) 2004 Nokia Corporation by Tony Lindrgen <tony@atomide.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/device.h>
+
+#include <asm/hardware.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+
+#include <asm/arch/clocks.h>
+#include <asm/arch/gpio.h>
+#include <asm/arch/fpga.h>
+
+#include "common.h"
+
+extern int omap_gpio_init(void);
+
+void innovator_init_irq(void)
+{
+	omap_init_irq();
+	omap_gpio_init();
+	fpga_init_irq();
+}
+
+static struct resource smc91x_resources[] = {
+	[0] = {
+		.start	= OMAP1510P1_FPGA_ETHR_START,	/* Physical */
+		.end	= OMAP1510P1_FPGA_ETHR_START + 16,
+		.flags	= IORESOURCE_MEM,
+	},
+	[1] = {
+		.start	= INT_ETHER,
+		.end	= INT_ETHER,
+		.flags	= IORESOURCE_IRQ,
+	},
+};
+
+static struct platform_device smc91x_device = {
+	.name		= "smc91x",
+	.id		= 0,
+	.num_resources	= ARRAY_SIZE(smc91x_resources),
+	.resource	= smc91x_resources,
+};
+
+static struct platform_device *devices[] __initdata = {
+	&smc91x_device,
+};
+
+static void __init innovator_init(void)
+{
+	if (!machine_is_innovator())
+		return;
+
+	(void) platform_add_devices(devices, ARRAY_SIZE(devices));
+}
+
+/* Only FPGA needs to be mapped here. All others are done with ioremap */
+static struct map_desc innovator_io_desc[] __initdata = {
+{ OMAP1510P1_FPGA_BASE, OMAP1510P1_FPGA_START, OMAP1510P1_FPGA_SIZE,
+	MT_DEVICE },
+};
+
+static void __init innovator_map_io(void)
+{
+	omap_map_io();
+	iotable_init(innovator_io_desc, ARRAY_SIZE(innovator_io_desc));
+
+	/* Dump the Innovator FPGA rev early - useful info for support. */
+	printk("Innovator FPGA Rev %d.%d Board Rev %d\n",
+	       fpga_read(OMAP1510P1_FPGA_REV_HIGH),
+	       fpga_read(OMAP1510P1_FPGA_REV_LOW),
+	       fpga_read(OMAP1510P1_FPGA_BOARD_REV));
+}
+
+MACHINE_START(INNOVATOR, "TI-Innovator/OMAP1510")
+	MAINTAINER("MontaVista Software, Inc.")
+	BOOT_MEM(0x10000000, 0xe0000000, 0xe0000000)
+	BOOT_PARAMS(0x10000100)
+	MAPIO(innovator_map_io)
+	INITIRQ(innovator_init_irq)
+	INIT_MACHINE(innovator_init)
+MACHINE_END
--- diff/arch/arm/mach-omap/innovator1610.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-omap/innovator1610.c	2004-04-21 10:45:33.360631912 +0100
@@ -0,0 +1,91 @@
+/*
+ * linux/arch/arm/mach-omap/innovator1610.c
+ *
+ * This file contains Innovator-specific code.
+ *
+ * Copyright (C) 2002 MontaVista Software, Inc.
+ *
+ * Copyright (C) 2001 RidgeRun, Inc.
+ * Author: Greg Lonnon <glonnon@ridgerun.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/config.h>
+#include <linux/types.h>
+#include <linux/init.h>
+#include <linux/major.h>
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/errno.h>
+
+#include <asm/setup.h>
+#include <asm/page.h>
+#include <asm/hardware.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/arch/irqs.h>
+
+#include "common.h"
+
+void
+innovator_init_irq(void)
+{
+	omap_init_irq();
+}
+
+static struct resource smc91x_resources[] = {
+	[0] = {
+		.start	= OMAP1610_ETHR_START,		/* Physical */
+		.end	= OMAP1610_ETHR_START + SZ_4K,
+		.flags	= IORESOURCE_MEM,
+	},
+	[1] = {
+		.start	= 0,				/* Really GPIO 0 */
+		.end	= 0,
+		.flags	= IORESOURCE_IRQ,
+	},
+};
+
+static struct platform_device smc91x_device = {
+	.name		= "smc91x",
+	.id		= 0,
+	.num_resources	= ARRAY_SIZE(smc91x_resources),
+	.resource	= smc91x_resources,
+};
+
+static struct platform_device *devices[] __initdata = {
+	&smc91x_device,
+};
+
+static void __init innovator_init(void)
+{
+	if (!machine_is_innovator())
+		return;
+
+	(void) platform_add_devices(devices, ARRAY_SIZE(devices));
+}
+
+static struct map_desc innovator_io_desc[] __initdata = {
+{ OMAP1610_ETHR_BASE, OMAP1610_ETHR_START, OMAP1610_ETHR_SIZE,MT_DEVICE },
+{ OMAP1610_NOR_FLASH_BASE, OMAP1610_NOR_FLASH_START, OMAP1610_NOR_FLASH_SIZE,
+	MT_DEVICE },
+};
+
+static void __init innovator_map_io(void)
+{
+	omap_map_io();
+	iotable_init(innovator_io_desc, ARRAY_SIZE(innovator_io_desc));
+}
+
+MACHINE_START(INNOVATOR, "TI-Innovator/OMAP1610")
+	MAINTAINER("MontaVista Software, Inc.")
+	BOOT_MEM(0x10000000, 0xe0000000, 0xe0000000)
+	BOOT_PARAMS(0x10000100)
+	MAPIO(innovator_map_io)
+	INITIRQ(innovator_init_irq)
+	INIT_MACHINE(innovator_init)
+MACHINE_END
+
--- diff/arch/arm/mach-omap/irq.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-omap/irq.c	2004-04-21 10:45:33.361631760 +0100
@@ -0,0 +1,224 @@
+/*
+ * linux/arch/arm/mach-omap/irq.c
+ *
+ * Interrupt handler for OMAP-1510 and 1610
+ *
+ * Copyright (C) 2001 RidgeRun, Inc.
+ * Author: Greg Lonnon <glonnon@ridgerun.com>
+ *
+ * Modified for OMAP-1610 by Tony Lindgren <tony.lindgren@nokia.com>
+ * GPIO interrupt handler moved to gpio.c for OMAP-1610 by Juha Yrjola
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/config.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/sched.h>
+#include <linux/interrupt.h>
+#include <linux/ptrace.h>
+
+#include <asm/hardware.h>
+#include <asm/irq.h>
+#include <asm/mach/irq.h>
+#include <asm/arch/gpio.h>
+
+#include <asm/io.h>
+
+#define NUM_IRQS	IH_BOARD_BASE
+
+static void mask_irq(unsigned int irq);
+static void unmask_irq(unsigned int irq);
+static void ack_irq(unsigned int irq);
+
+static inline void
+write_ih(int level, int reg, u32 value)
+{
+	if (cpu_is_omap1510()) {
+		__raw_writel(value,
+			(IO_ADDRESS((level ? OMAP_IH2_BASE : OMAP_IH1_BASE) +
+				(reg))));
+	} else {
+		if (level) {
+			__raw_writel(value,
+				IO_ADDRESS(OMAP_IH2_BASE + ((level - 1) << 8) +
+					reg));
+		} else {
+			__raw_writel(value, IO_ADDRESS(OMAP_IH1_BASE + reg));
+		}
+	}
+}
+
+static inline u32
+read_ih(int level, int reg)
+{
+	if (cpu_is_omap1510()) {
+		return __raw_readl((IO_ADDRESS((level ? OMAP_IH2_BASE : OMAP_IH1_BASE)
+					 + (reg))));
+	} else {
+		if (level) {
+			return __raw_readl(IO_ADDRESS(OMAP_IH2_BASE +
+					((level - 1) << 8) + reg));
+		} else {
+			return __raw_readl(IO_ADDRESS(OMAP_IH1_BASE + reg));
+		}
+	}
+}
+
+static inline int
+get_level(int irq)
+{
+	if (cpu_is_omap1510()) {
+		return (((irq) < IH2_BASE) ? 0 : 1);
+	} else {
+		if (irq < IH2_BASE)
+			return 0;
+		else {
+			return (irq >> 5);
+		}
+	}
+}
+
+static inline int
+get_irq_num(int irq)
+{
+	if (cpu_is_omap1510()) {
+		return (((irq) < IH2_BASE) ? irq : irq - IH2_BASE);
+	} else {
+		return irq & 0x1f;
+	}
+}
+
+static void
+mask_irq(unsigned int irq)
+{
+	int level = get_level(irq);
+	int irq_num = get_irq_num(irq);
+	u32 mask = read_ih(level, IRQ_MIR) | (1 << irq_num);
+	write_ih(level, IRQ_MIR, mask);
+}
+
+static void
+ack_irq(unsigned int irq)
+{
+	int level = get_level(irq);
+
+	if (level > 1)
+		level = 1;
+	do {
+		write_ih(level, IRQ_CONTROL_REG, 0x1);
+		/*
+		 * REVISIT: So says the TRM:
+		 *	if (level) write_ih(0, ITR, 0);
+		 */
+	} while (level--);
+}
+
+void
+unmask_irq(unsigned int irq)
+{
+	int level = get_level(irq);
+	int irq_num = get_irq_num(irq);
+	u32 mask = read_ih(level, IRQ_MIR) & ~(1 << irq_num);
+
+	write_ih(level, IRQ_MIR, mask);
+}
+
+static void
+mask_ack_irq(unsigned int irq)
+{
+	mask_irq(irq);
+	ack_irq(irq);
+}
+
+static struct irqchip omap_normal_irq = {
+	.ack		= mask_ack_irq,
+	.mask		= mask_irq,
+	.unmask		= unmask_irq,
+};
+
+static void
+irq_priority(int irq, int fiq, int priority, int trigger)
+{
+	int level, irq_num;
+	unsigned long reg_value, reg_addr;
+
+	level = get_level(irq);
+	irq_num = get_irq_num(irq);
+	/* FIQ is only available on level 0 interrupts */
+	fiq = level ? 0 : (fiq & 0x1);
+	reg_value = (fiq) | ((priority & 0x1f) << 2) |
+		((trigger & 0x1) << 1);
+	reg_addr = (IRQ_ILR0 + irq_num * 0x4);
+	write_ih(level, reg_addr, reg_value);
+}
+
+void __init
+omap_init_irq(void)
+{
+	int i, irq_count, irq_bank_count = 0;
+	uint *trigger;
+
+	if (cpu_is_omap1510()) {
+		static uint trigger_1510[2] = {
+			0xb3febfff, 0xffbfffed
+		};
+		irq_bank_count = 2;
+		irq_count = 64;
+		trigger = trigger_1510;
+	}
+	if (cpu_is_omap1610()) {
+		static uint trigger_1610[5] = {
+			0xb3fefe8f, 0xfffff7ff, 0xffffffff
+		};
+		irq_bank_count = 5;
+		irq_count = 160;
+		trigger = trigger_1610;
+	}
+	if (cpu_is_omap730()) {
+		static uint trigger_730[] = {
+			0xb3f8e22f, 0xfdb9c1f2, 0x800040f3
+		};
+		irq_bank_count = 3;
+		irq_count = 96;
+		trigger = trigger_730;
+	}
+
+	for (i = 0; i < irq_bank_count; i++) {
+		/* Mask and clear all interrupts */
+		write_ih(i, IRQ_MIR, ~0x0);
+		write_ih(i, IRQ_ITR, 0x0);
+	}
+
+	/* Clear any pending interrupts */
+	write_ih(1, IRQ_CONTROL_REG, 3);
+	write_ih(0, IRQ_CONTROL_REG, 3);
+
+	for (i = 0; i < irq_count; i++) {
+		set_irq_chip(i, &omap_normal_irq);
+		set_irq_handler(i, do_level_IRQ);
+		set_irq_flags(i, IRQF_VALID);
+
+		irq_priority(i, 0, 0, trigger[get_level(i)] >> get_irq_num(i) & 1);
+	}
+	unmask_irq(INT_IH2_IRQ);
+}
--- diff/arch/arm/mach-omap/leds-innovator.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-omap/leds-innovator.c	2004-04-21 10:45:33.361631760 +0100
@@ -0,0 +1,103 @@
+/*
+ * linux/arch/arm/mach-omap/leds-innovator.c
+ */
+#include <linux/config.h>
+#include <linux/init.h>
+
+#include <asm/hardware.h>
+#include <asm/leds.h>
+#include <asm/system.h>
+
+#include "leds.h"
+
+
+#define LED_STATE_ENABLED	1
+#define LED_STATE_CLAIMED	2
+
+static unsigned int led_state;
+static unsigned int hw_led_state;
+
+void innovator_leds_event(led_event_t evt)
+{
+	unsigned long flags;
+
+	local_irq_save(flags);
+
+	switch (evt) {
+	case led_start:
+		hw_led_state = 0;
+		led_state = LED_STATE_ENABLED;
+		break;
+
+	case led_stop:
+		led_state &= ~LED_STATE_ENABLED;
+		hw_led_state = 0;
+		break;
+
+	case led_claim:
+		led_state |= LED_STATE_CLAIMED;
+		hw_led_state = 0;
+		break;
+
+	case led_release:
+		led_state &= ~LED_STATE_CLAIMED;
+		hw_led_state = 0;
+		break;
+
+#ifdef CONFIG_LEDS_TIMER
+	case led_timer:
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_state ^= 0;
+		break;
+#endif
+
+#ifdef CONFIG_LEDS_CPU
+	case led_idle_start:
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_state |= 0;
+		break;
+
+	case led_idle_end:
+		if (!(led_state & LED_STATE_CLAIMED))
+			hw_led_state &= ~0;
+		break;
+#endif
+
+	case led_halted:
+		break;
+
+	case led_green_on:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_state &= ~0;
+		break;
+
+	case led_green_off:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_state |= 0;
+		break;
+
+	case led_amber_on:
+		break;
+
+	case led_amber_off:
+		break;
+
+	case led_red_on:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_state &= ~0;
+		break;
+
+	case led_red_off:
+		if (led_state & LED_STATE_CLAIMED)
+			hw_led_state |= 0;
+		break;
+
+	default:
+		break;
+	}
+
+	if (led_state & LED_STATE_ENABLED)
+		;
+
+	local_irq_restore(flags);
+}
--- diff/arch/arm/mach-omap/leds-perseus2.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-omap/leds-perseus2.c	2004-04-21 10:45:33.362631608 +0100
@@ -0,0 +1,103 @@
+/*
+ * linux/arch/arm/mach-omap/leds-perseus2.c
+ *
+ * Copyright 2003 by Texas Instruments Incorporated
+ *
+ */
+#include <linux/config.h>
+#include <linux/init.h>
+#include <linux/kernel_stat.h>
+#include <linux/sched.h>
+#include <linux/version.h>
+
+#include <asm/io.h>
+#include <asm/hardware.h>
+#include <asm/leds.h>
+#include <asm/system.h>
+#include <asm/arch/omap-perseus2.h>
+
+#include "leds.h"
+
+void perseus2_leds_event(led_event_t evt)
+{
+	unsigned long flags;
+	static unsigned long hw_led_state = 0;
+
+	local_irq_save(flags);
+
+	switch (evt) {
+	case led_start:
+		hw_led_state |= OMAP730_FPGA_LED_STARTSTOP;
+		break;
+
+	case led_stop:
+		hw_led_state &= ~OMAP730_FPGA_LED_STARTSTOP;
+		break;
+
+	case led_claim:
+		hw_led_state |= OMAP730_FPGA_LED_CLAIMRELEASE;
+		break;
+
+	case led_release:
+		hw_led_state &= ~OMAP730_FPGA_LED_CLAIMRELEASE;
+		break;
+
+#ifdef CONFIG_LEDS_TIMER
+	case led_timer:
+		/*
+		 * Toggle Timer LED
+		 */
+		if (hw_led_state & OMAP730_FPGA_LED_TIMER)
+			hw_led_state &= ~OMAP730_FPGA_LED_TIMER;
+		else
+			hw_led_state |= OMAP730_FPGA_LED_TIMER;
+		break;
+#endif
+
+#ifdef CONFIG_LEDS_CPU
+	case led_idle_start:
+		hw_led_state |= OMAP730_FPGA_LED_IDLE;
+		break;
+
+	case led_idle_end:
+		hw_led_state &= ~OMAP730_FPGA_LED_IDLE;
+		break;
+#endif
+
+	case led_halted:
+		if (hw_led_state & OMAP730_FPGA_LED_HALTED)
+			hw_led_state &= ~OMAP730_FPGA_LED_HALTED;
+		else
+			hw_led_state |= OMAP730_FPGA_LED_HALTED;
+		break;
+
+	case led_green_on:
+		break;
+
+	case led_green_off:
+		break;
+
+	case led_amber_on:
+		break;
+
+	case led_amber_off:
+		break;
+
+	case led_red_on:
+		break;
+
+	case led_red_off:
+		break;
+
+	default:
+		break;
+	}
+
+
+	/*
+	 *  Actually burn the LEDs
+	 */
+	__raw_writew(~hw_led_state & 0xffff, OMAP730_FPGA_LEDS);
+
+	local_irq_restore(flags);
+}
--- diff/arch/arm/mach-omap/leds.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-omap/leds.c	2004-04-21 10:45:33.362631608 +0100
@@ -0,0 +1,23 @@
+/*
+ * linux/arch/arm/mach-omap/leds.c
+ *
+ * OMAP LEDs dispatcher
+ */
+#include <linux/init.h>
+
+#include <asm/leds.h>
+#include <asm/mach-types.h>
+
+#include "leds.h"
+
+static int __init
+omap1510_leds_init(void)
+{
+	if (machine_is_innovator())
+		leds_event = innovator_leds_event;
+
+	leds_event(led_start);
+	return 0;
+}
+
+__initcall(omap1510_leds_init);
--- diff/arch/arm/mach-omap/leds.h	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-omap/leds.h	2004-04-21 10:45:33.362631608 +0100
@@ -0,0 +1,2 @@
+extern void innovator_leds_event(led_event_t evt);
+extern void perseus2_leds_event(led_event_t evt);
--- diff/arch/arm/mach-omap/mux.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-omap/mux.c	2004-04-21 10:45:33.362631608 +0100
@@ -0,0 +1,124 @@
+/*
+ * linux/arch/arm/mach-omap/mux.c
+ *
+ * Utility to set the Omap MUX and PULL_DWN registers from a table in mux.h
+ *
+ * Copyright (C) 2003 Nokia Corporation
+ *
+ * Written by Tony Lindgren <tony.lindgren@nokia.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <asm/system.h>
+#include <asm/io.h>
+#include <linux/spinlock.h>
+
+#define __MUX_C__
+#include <asm/arch/mux.h>
+
+static spinlock_t mux_spin_lock = SPIN_LOCK_UNLOCKED;
+
+/*
+ * Sets the Omap MUX and PULL_DWN registers based on the table
+ */
+int omap_cfg_reg(const reg_cfg_t reg_cfg)
+{
+#ifdef CONFIG_OMAP_MUX
+	unsigned long flags;
+	reg_cfg_set *cfg;
+	unsigned int reg_orig = 0, reg = 0, pu_pd_orig = 0, pu_pd = 0,
+		pull_orig = 0, pull = 0;
+
+	cfg = &reg_cfg_table[reg_cfg];
+
+	/*
+	 * We do a pretty long section here with lock on, but pin muxing
+	 * should only happen on driver init for each driver, so it's not time
+	 * critical.
+	 */
+	spin_lock_irqsave(&mux_spin_lock, flags);
+
+	/* Check the mux register in question */
+	if (cfg->mux_reg) {
+		reg_orig = __raw_readl(cfg->mux_reg);
+
+		/* The mux registers always seem to be 3 bits long */
+		reg = reg_orig & ~(0x7 << cfg->mask_offset);
+
+		reg |= (cfg->mask << cfg->mask_offset);
+
+		__raw_writel(reg, cfg->mux_reg);
+	}
+
+	/* Check for pull up or pull down selection on 1610 */
+	if (!cpu_is_omap1510()) {
+		if (cfg->pu_pd_reg && cfg->pull_val) {
+			pu_pd_orig = __raw_readl(cfg->pu_pd_reg);
+			if (cfg->pu_pd_val) {
+				/* Use pull up */
+				pu_pd = pu_pd_orig | (1 << cfg->pull_bit);
+			} else {
+				/* Use pull down */
+				pu_pd = pu_pd_orig & ~(1 << cfg->pull_bit);
+			}
+			__raw_writel(pu_pd, cfg->pu_pd_reg);
+		}
+	}
+
+	/* Check for an associated pull down register */
+	if (cfg->pull_reg) {
+		pull_orig = __raw_readl(cfg->pull_reg);
+
+		if (cfg->pull_val) {
+			/* Low bit = pull enabled */
+			pull = pull_orig & ~(1 << cfg->pull_bit);
+		} else {
+			/* High bit = pull disabled */
+			pull = pull_orig | (1 << cfg->pull_bit);
+		}
+
+		__raw_writel(pull, cfg->pull_reg);
+	}
+
+#ifdef CONFIG_OMAP_MUX_DEBUG
+	if (cfg->debug) {
+		printk("Omap: Setting register %s\n", cfg->name);
+		printk("      %s (0x%08x) = 0x%08x -> 0x%08x\n",
+		       cfg->mux_reg_name, cfg->mux_reg, reg_orig, reg);
+
+		if (!cpu_is_omap1510()) {
+			if (cfg->pu_pd_reg && cfg->pull_val) {
+				printk("      %s (0x%08x) = 0x%08x -> 0x%08x\n",
+				       cfg->pu_pd_name, cfg->pu_pd_reg,
+				       pu_pd_orig, pu_pd);
+			}
+		}
+
+		printk("      %s (0x%08x) = 0x%08x -> 0x%08x\n",
+		       cfg->pull_name, cfg->pull_reg, pull_orig, pull);
+	}
+#endif
+
+	spin_unlock_irqrestore(&mux_spin_lock, flags);
+
+#endif
+	return 0;
+}
+
+EXPORT_SYMBOL(omap_cfg_reg);
--- diff/arch/arm/mach-omap/ocpi.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-omap/ocpi.c	2004-04-21 10:45:33.363631456 +0100
@@ -0,0 +1,116 @@
+/*
+ * linux/arch/arm/mach-omap/ocpi.c
+ *
+ * Minimal OCP bus support for OMAP-1610
+ *
+ * Copyright (C) 2003 - 2004 Nokia Corporation
+ * Written by Tony Lindgren <tony@atomide.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/version.h>
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/spinlock.h>
+
+#include <asm/io.h>
+#include <asm/arch/hardware.h>
+
+#define OCPI_BASE		0xfffec320
+#define OCPI_FAULT		(OCPI_BASE + 0x00)
+#define OCPI_CMD_FAULT		(OCPI_BASE + 0x04)
+#define OCPI_SINT0		(OCPI_BASE + 0x08)
+#define OCPI_TABORT		(OCPI_BASE + 0x0c)
+#define OCPI_SINT1		(OCPI_BASE + 0x10)
+#define OCPI_PROT		(OCPI_BASE + 0x14)
+#define OCPI_SEC		(OCPI_BASE + 0x18)
+
+#define EN_OCPI_CK		(1 << 0)
+#define IDLOCPI_ARM		(1 << 1)
+
+/* USB OHCI OCPI access error registers */
+#define HOSTUEADDR	0xfffba0e0
+#define HOSTUESTATUS	0xfffba0e4
+
+/*
+ * Enables device access to OMAP buses via the OCPI bridge
+ * FIXME: Add locking
+ */
+int ocpi_enable(void)
+{
+	unsigned int val;
+
+	/* Make sure there's clock for OCPI */
+	val = __raw_readl(ARM_IDLECT3);
+	val |= EN_OCPI_CK;
+	val &= ~IDLOCPI_ARM;
+	__raw_writel(val, ARM_IDLECT3);
+
+	/* Enable access for OHCI in OCPI */
+	val = __raw_readl(OCPI_PROT);
+	val &= ~0xff;
+	//val &= (1 << 0);	/* Allow access only to EMIFS */
+	__raw_writel(val, OCPI_PROT);
+
+	val = __raw_readl(OCPI_SEC);
+	val &= ~0xff;
+	__raw_writel(val, OCPI_SEC);
+
+	val = __raw_readl(OCPI_SEC);
+	val |= 0;
+	__raw_writel(val, OCPI_SEC);
+
+	val = __raw_readl(OCPI_SINT0);
+	val |= 0;
+	__raw_writel(val, OCPI_SINT1);
+
+	return 0;
+}
+EXPORT_SYMBOL(ocpi_enable);
+
+int ocpi_status(void)
+{
+	printk("OCPI: addr: 0x%08x cmd: 0x%08x\n"
+	       "      ohci-addr: 0x%08x ohci-status: 0x%08x\n",
+	       __raw_readl(OCPI_FAULT), __raw_readl(OCPI_CMD_FAULT),
+	       __raw_readl(HOSTUEADDR), __raw_readl(HOSTUESTATUS));
+
+	return 1;
+}
+EXPORT_SYMBOL(ocpi_status);
+
+static int __init omap_ocpi_init(void)
+{
+	ocpi_enable();
+	printk("OMAP OCPI interconnect driver loaded\n");
+
+	return 0;
+}
+
+static void __exit omap_ocpi_exit(void)
+{
+	/* FIXME: Disable OCPI */
+}
+
+MODULE_AUTHOR("Tony Lindgren <tony@atomide.com>");
+MODULE_DESCRIPTION("OMAP OCPI bus controller module");
+MODULE_LICENSE("GPL");
+module_init(omap_ocpi_init);
+module_exit(omap_ocpi_exit);
--- diff/arch/arm/mach-omap/omap-generic.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-omap/omap-generic.c	2004-04-21 10:45:33.363631456 +0100
@@ -0,0 +1,77 @@
+/*
+ * linux/arch/arm/mach-omap/generic.c
+ *
+ * Modified from innovator.c
+ *
+ * Code for generic OMAP board. Should work on many OMAP systems where
+ * the device drivers take care of all the necessary hardware initialization.
+ * Do not put any board specific code to this file; create a new machine
+ * type if you need custom low-level initializations.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/device.h>
+
+#include <asm/hardware.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+
+#include <asm/arch/clocks.h>
+#include <asm/arch/gpio.h>
+#include <asm/arch/mux.h>
+
+#include "common.h"
+
+static void __init omap_generic_init_irq(void)
+{
+	omap_init_irq();
+}
+
+/*
+ * Muxes the serial ports on
+ */
+static void __init omap_early_serial_init(void)
+{
+	omap_cfg_reg(UART1_TX);
+	omap_cfg_reg(UART1_RTS);
+
+	omap_cfg_reg(UART2_TX);
+	omap_cfg_reg(UART2_RTS);
+
+	omap_cfg_reg(UART3_TX);
+	omap_cfg_reg(UART3_RX);
+}
+
+static void __init omap_generic_init(void)
+{
+	if (!machine_is_omap_generic())
+		return;
+
+	/*
+	 * Make sure the serial ports are muxed on at this point.
+	 * You have to mux them off in device drivers later on
+	 * if not needed.
+	 */
+	if (cpu_is_omap1510()) {
+		omap_early_serial_init();
+	}
+}
+
+static void __init omap_generic_map_io(void)
+{
+	omap_map_io();
+}
+
+MACHINE_START(OMAP_GENERIC, "Generic OMAP-1510/1610")
+	MAINTAINER("Tony Lindgren <tony@atomide.com>")
+	BOOT_MEM(0x10000000, 0xe0000000, 0xe0000000)
+	BOOT_PARAMS(0x10000100)
+	MAPIO(omap_generic_map_io)
+	INITIRQ(omap_generic_init_irq)
+	INIT_MACHINE(omap_generic_init)
+MACHINE_END
--- diff/arch/arm/mach-omap/omap-perseus2.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-omap/omap-perseus2.c	2004-04-21 10:45:33.364631304 +0100
@@ -0,0 +1,116 @@
+/*
+ * linux/arch/arm/mach-omap/omap-perseus2.c
+ *
+ * Modified from omap-generic.c
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/device.h>
+
+#include <asm/hardware.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+
+#include <asm/arch/clocks.h>
+#include <asm/arch/gpio.h>
+#include <asm/arch/mux.h>
+
+#include <asm/arch/omap-perseus2.h>
+
+#include "common.h"
+
+void omap_perseus2_init_irq(void)
+{
+	omap_init_irq();
+}
+
+static struct resource smc91x_resources[] = {
+	[0] = {
+		.start	= OMAP730_FPGA_ETHR_START,	/* Physical */
+		.end	= OMAP730_FPGA_ETHR_START + SZ_4K,
+		.flags	= IORESOURCE_MEM,
+	},
+	[1] = {
+		.start	= 0,
+		.end	= 0,
+		.flags	= INT_ETHER,
+	},
+};
+
+static struct platform_device smc91x_device = {
+	.name		= "smc91x",
+	.id		= 0,
+	.num_resources	= ARRAY_SIZE(smc91x_resources),
+	.resource	= smc91x_resources,
+};
+
+static struct platform_device *devices[] __initdata = {
+	&smc91x_device,
+};
+
+static void __init omap_perseus2_init(void)
+{
+	if (!machine_is_omap_perseus2())
+		return;
+
+	(void) platform_add_devices(devices, ARRAY_SIZE(devices));
+}
+
+/* Only FPGA needs to be mapped here. All others are done with ioremap */
+static struct map_desc omap_perseus2_io_desc[] __initdata = {
+	{OMAP730_FPGA_BASE, OMAP730_FPGA_START, OMAP730_FPGA_SIZE,
+	 MT_DEVICE},
+};
+
+static void __init omap_perseus2_map_io(void)
+{
+	omap_map_io();
+	iotable_init(omap_perseus2_io_desc,
+		     ARRAY_SIZE(omap_perseus2_io_desc));
+
+	/* Early, board-dependent init */
+
+	/*
+	 * Hold GSM Reset until needed
+	 */
+	*DSP_M_CTL &= ~1;
+
+	/*
+	 * UARTs -> done automagically by 8250 driver
+	 */
+
+	/*
+	 * CSx timings, GPIO Mux ... setup
+	 */
+
+	/* Flash: CS0 timings setup */
+	*((volatile __u32 *) OMAP_FLASH_CFG_0) = 0x0000fff3;
+	*((volatile __u32 *) OMAP_FLASH_ACFG_0) = 0x00000088;
+
+	/*
+	 * Ethernet support trough the debug board
+	 * CS1 timings setup
+	 */
+	*((volatile __u32 *) OMAP_FLASH_CFG_1) = 0x0000fff3;
+	*((volatile __u32 *) OMAP_FLASH_ACFG_1) = 0x00000000;
+
+	/*
+	 * Configure MPU_EXT_NIRQ IO in IO_CONF9 register,
+	 * It is used as the Ethernet controller interrupt
+	 */
+	*((volatile __u32 *) PERSEUS2_IO_CONF_9) &= 0x1FFFFFFF;
+}
+
+MACHINE_START(OMAP_PERSEUS2, "OMAP730 Perseus2")
+	MAINTAINER("Kevin Hilman <k-hilman@ti.com>")
+	BOOT_MEM(0x10000000, 0xe0000000, 0xe0000000)
+	BOOT_PARAMS(0x10000100)
+	MAPIO(omap_perseus2_map_io)
+	INITIRQ(omap_perseus2_init_irq)
+	INIT_MACHINE(omap_perseus2_init)
+MACHINE_END
--- diff/arch/arm/mach-s3c2410/Kconfig	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-s3c2410/Kconfig	2004-04-21 10:45:33.364631304 +0100
@@ -0,0 +1,25 @@
+menu "S3C2410 Implementations"
+
+config ARCH_BAST
+	bool "Simtec Electronics BAST (EB2410ITX)"
+	depends on ARCH_S3C2410
+	help
+	  Say Y here if you are using the Simtec Electronics EB2410ITX
+	  development board (also known as BAST)
+
+	  Product page: <http://www.simtec.co.uk/products/EB2410ITX/>.
+
+config ARCH_H1940
+	bool "IPAQ H1940"
+	depends on ARCH_S3C2410
+	help
+	  Say Y here if you are using the HP IPAQ H1940
+	  <http://www.handhelds.org/projects/h1940.html>.
+
+config MACH_VR1000
+	bool "Simtec VR1000"
+	depends on ARCH_S3C2410
+	help
+	  Say Y here if you are using the Simtec VR1000 board.
+
+endmenu
--- diff/arch/arm/mach-s3c2410/Makefile	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-s3c2410/Makefile	2004-04-21 10:45:33.364631304 +0100
@@ -0,0 +1,18 @@
+#
+# Makefile for the linux kernel.
+#
+
+# Object file lists.
+
+obj-y			:= s3c2410.o irq.o
+obj-m			:=
+obj-n			:=
+obj-			:=
+
+obj-$(CONFIG_ARCH_BAST)    += mach-bast.o
+obj-$(CONFIG_MACH_H1940)   += mach-h1940.o
+obj-$(CONFIG_ARCH_H1940)   += mach-h1940.o
+obj-$(CONFIG_MACH_VR1000)  += mach-vr1000.o
+
+#obj-$(CONFIG_PCI)	+=$(pci-y)
+#obj-$(CONFIG_LEDS)	+=$(leds-y)
--- diff/arch/arm/mach-s3c2410/bast-irq.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-s3c2410/bast-irq.c	2004-04-21 10:45:33.365631152 +0100
@@ -0,0 +1,132 @@
+/* linux/arch/arm/mach-s3c2410/bast-irq.c
+ *
+ * Copyright (c) 2004 Simtec Electronics
+ *   Ben Dooks <ben@simtec.co.uk>
+ *
+ * http://www.simtec.co.uk/products/EB2410ITX/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Modifications:
+ *     08-Jan-2003 BJD  Moved from central IRQ code
+ */
+
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/ioport.h>
+#include <linux/ptrace.h>
+#include <linux/sysdev.h>
+
+#include <asm/hardware.h>
+#include <asm/irq.h>
+#include <asm/io.h>
+
+#include <asm/mach/irq.h>
+#include <asm/hardware/s3c2410/irq.h>
+
+#if 0
+#include <asm/debug-ll.h>
+#endif
+
+#define irqdbf(x...)
+#define irqdbf2(x...)
+
+
+/* handle PC104 ISA interrupts from the system CPLD */
+
+/* table of ISA irq nos to the relevant mask... zero means
+ * the irq is not implemented
+*/
+static unsigned char bast_pc104_irqmasks[] = {
+	0,   /* 0 */
+	0,   /* 1 */
+	0,   /* 2 */
+	1,   /* 3 */
+	0,   /* 4 */
+	2,   /* 5 */
+	0,   /* 6 */
+	4,   /* 7 */
+	0,   /* 8 */
+	0,   /* 9 */
+	8,   /* 10 */
+	0,   /* 11 */
+	0,   /* 12 */
+	0,   /* 13 */
+	0,   /* 14 */
+	0,   /* 15 */
+};
+
+static unsigned char bast_pc104_irqs[] = { 3, 5, 7, 10 };
+
+static void
+bast_pc104_mask(unsigned int irqno)
+{
+	unsigned long temp;
+
+	temp = __raw_readb(BAST_VA_PC104_IRQMASK);
+	temp &= ~bast_pc104_irqmasks[irqno];
+	__raw_writeb(temp, BAST_VA_PC104_IRQMASK);
+
+	if (temp == 0)
+		bast_extint_mask(IRQ_ISA);
+}
+
+static void
+bast_pc104_ack(unsigned int irqno)
+{
+	bast_extint_ack(IRQ_ISA);
+}
+
+static void
+bast_pc104_unmask(unsigned int irqno)
+{
+	unsigned long temp;
+
+	temp = __raw_readb(BAST_VA_PC104_IRQMASK);
+	temp |= bast_pc104_irqmasks[irqno];
+	__raw_writeb(temp, BAST_VA_PC104_IRQMASK);
+
+	bast_extint_unmask(IRQ_ISA);
+}
+
+static struct bast_pc104_chip = {
+	.mask	     = bast_pc104_mask,
+	.unmask	     = bast_pc104_unmask,
+	.ack	     = bast_pc104_ack
+};
+
+static void
+bast_irq_pc104_demux(unsigned int irq,
+		     struct irqdesc *desc,
+		     struct pt_regs *regs)
+{
+	unsigned int stat;
+	unsigned int irqno;
+	int i;
+
+	stat = __raw_readb(BAST_VA_PC104_IRQREQ) & 0xf;
+
+	for (i = 0; i < 4 && stat != 0; i++) {
+		if (stat & 1) {
+			irqno = bast_pc104_irqs[i];
+			desc = irq_desc + irqno;
+
+			desc->handle(irqno, desc, regs);
+		}
+
+		stat >>= 1;
+	}
+}
--- diff/arch/arm/mach-s3c2410/bast.h	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-s3c2410/bast.h	2004-04-21 10:45:33.365631152 +0100
@@ -0,0 +1,2 @@
+
+extern void bast_init_irq(void);
--- diff/arch/arm/mach-s3c2410/irq.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-s3c2410/irq.c	2004-04-21 10:45:33.366631000 +0100
@@ -0,0 +1,598 @@
+/* linux/arch/arm/mach-s3c2410/irq.c
+ *
+ * Copyright (c) 2003 Simtec Electronics
+ * Ben Dooks <ben@simtec.co.uk>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/interrupt.h>
+#include <linux/ioport.h>
+#include <linux/ptrace.h>
+#include <linux/sysdev.h>
+
+#include <asm/hardware.h>
+#include <asm/irq.h>
+#include <asm/io.h>
+
+#include <asm/mach/irq.h>
+
+#include <asm/arch/regs-irq.h>
+#include <asm/arch/regs-lcd.h>
+
+#if 0
+#include <asm/debug-ll.h>
+#endif
+
+#define irqdbf(x...)
+#define irqdbf2(x...)
+
+static void
+s3c_irq_mask(unsigned int irqno)
+{
+	unsigned long mask;
+
+	irqno -= IRQ_EINT0;
+
+	mask = __raw_readl(S3C2410_INTMSK);
+	mask |= 1UL << irqno;
+	__raw_writel(mask, S3C2410_INTMSK);
+}
+
+static inline void
+s3c_irq_ack(unsigned int irqno)
+{
+	unsigned long bitval = 1UL << (irqno - IRQ_EINT0);
+
+	__raw_writel(bitval, S3C2410_SRCPND);
+	__raw_writel(bitval, S3C2410_INTPND);
+}
+
+static inline void
+s3c_irq_maskack(unsigned int irqno)
+{
+	unsigned long bitval = 1UL << (irqno - IRQ_EINT0);
+	unsigned long mask;
+
+	mask = __raw_readl(S3C2410_INTMSK);
+	__raw_writel(mask|bitval, S3C2410_INTMSK);
+
+	__raw_writel(bitval, S3C2410_SRCPND);
+	__raw_writel(bitval, S3C2410_INTPND);
+}
+
+
+static void
+s3c_irq_unmask(unsigned int irqno)
+{
+	unsigned long mask;
+
+	if (irqno != IRQ_TIMER4 && irqno != IRQ_EINT8t23)
+		irqdbf2("s3c_irq_unmask %d\n", irqno);
+
+	irqno -= IRQ_EINT0;
+
+	mask = __raw_readl(S3C2410_INTMSK);
+	mask &= ~(1UL << irqno);
+	__raw_writel(mask, S3C2410_INTMSK);
+}
+
+static struct irqchip s3c_irq_level_chip = {
+	.ack	   = s3c_irq_maskack,
+	.mask	   = s3c_irq_mask,
+	.unmask	   = s3c_irq_unmask
+};
+
+static struct irqchip s3c_irq_chip = {
+	.ack	   = s3c_irq_ack,
+	.mask	   = s3c_irq_mask,
+	.unmask	   = s3c_irq_unmask
+};
+
+/* S3C2410_EINTMASK
+ * S3C2410_EINTPEND
+ */
+
+#define EXTINT_OFF (IRQ_EINT4 - 4)
+
+static void
+s3c_irqext_mask(unsigned int irqno)
+{
+	unsigned long mask;
+
+	irqno -= EXTINT_OFF;
+
+	mask = __raw_readl(S3C2410_EINTMASK);
+	mask |= ( 1UL << irqno);
+	__raw_writel(mask, S3C2410_EINTMASK);
+
+	if (irqno <= (IRQ_EINT7 - EXTINT_OFF)) {
+		/* check to see if all need masking */
+
+		if ((mask & (0xf << 4)) == (0xf << 4)) {
+			/* all masked, mask the parent */
+			s3c_irq_mask(IRQ_EINT4t7);
+		}
+	} else {
+		/* todo: the same check as above for the rest of the irq regs...*/
+
+	}
+}
+
+static void
+s3c_irqext_ack(unsigned int irqno)
+{
+	unsigned long req;
+	unsigned long bit;
+	unsigned long mask;
+
+	bit = 1UL << (irqno - EXTINT_OFF);
+
+
+	mask = __raw_readl(S3C2410_EINTMASK);
+
+	__raw_writel(bit, S3C2410_EINTPEND);
+
+	req = __raw_readl(S3C2410_EINTPEND);
+	req &= ~mask;
+
+	/* not sure if we should be acking the parent irq... */
+
+	if (irqno <= IRQ_EINT7 ) {
+		if ((req & 0xf0) == 0)
+			s3c_irq_ack(IRQ_EINT4t7);
+	} else {
+		if ((req >> 8) == 0)
+			s3c_irq_ack(IRQ_EINT8t23);
+	}
+}
+
+static void
+s3c_irqext_unmask(unsigned int irqno)
+{
+	unsigned long mask;
+
+	irqno -= EXTINT_OFF;
+
+	mask = __raw_readl(S3C2410_EINTMASK);
+	mask &= ~( 1UL << irqno);
+	__raw_writel(mask, S3C2410_EINTMASK);
+
+	s3c_irq_unmask((irqno <= (IRQ_EINT7 - EXTINT_OFF)) ? IRQ_EINT4t7 : IRQ_EINT8t23);
+}
+
+/* todo - put type handler in here */
+
+static int
+s3c_irqext_type(unsigned int irq, unsigned int type)
+{
+	irqdbf("s3c_irqext_type: called for irq %d, type %d\n", irq, type);
+
+	return 0;
+}
+
+static struct irqchip s3c_irqext_chip = {
+	.mask	    = s3c_irqext_mask,
+	.unmask	    = s3c_irqext_unmask,
+	.ack	    = s3c_irqext_ack,
+	.type	    = s3c_irqext_type
+};
+
+/* mask values for the parent registers for each of the interrupt types */
+
+#define INTMSK_UART0	 (1UL << (IRQ_UART0 - IRQ_EINT0))
+#define INTMSK_UART1	 (1UL << (IRQ_UART1 - IRQ_EINT0))
+#define INTMSK_UART2	 (1UL << (IRQ_UART2 - IRQ_EINT0))
+#define INTMSK_ADCPARENT (1UL << (IRQ_ADCPARENT - IRQ_EINT0))
+#define INTMSK_LCD	 (1UL << (IRQ_LCD - IRQ_EINT0))
+
+static inline void
+s3c_irqsub_mask(unsigned int irqno, unsigned int parentbit,
+		int subcheck)
+{
+	unsigned long mask;
+	unsigned long submask;
+
+	submask = __raw_readl(S3C2410_INTSUBMSK);
+	mask = __raw_readl(S3C2410_INTMSK);
+
+	submask |= (1UL << (irqno - IRQ_S3CUART_RX0));
+
+	/* check to see if we need to mask the parent IRQ */
+
+	if ((submask  & subcheck) == subcheck) {
+		__raw_writel(mask | parentbit, S3C2410_INTMSK);
+	}
+
+	/* write back masks */
+	__raw_writel(submask, S3C2410_INTSUBMSK);
+
+}
+
+static inline void
+s3c_irqsub_unmask(unsigned int irqno, unsigned int parentbit)
+{
+	unsigned long mask;
+	unsigned long submask;
+
+	submask = __raw_readl(S3C2410_INTSUBMSK);
+	mask = __raw_readl(S3C2410_INTMSK);
+
+	submask &= ~(1UL << (irqno - IRQ_S3CUART_RX0));
+	mask &= ~parentbit;
+
+	/* write back masks */
+	__raw_writel(submask, S3C2410_INTSUBMSK);
+	__raw_writel(mask, S3C2410_INTMSK);
+}
+
+
+static inline void
+s3c_irqsub_maskack(unsigned int irqno, unsigned int parentmask, unsigned int group)
+{
+	unsigned int bit = 1UL << (irqno - IRQ_S3CUART_RX0);
+
+	s3c_irqsub_mask(irqno, parentmask, group);
+
+	__raw_writel(bit, S3C2410_SUBSRCPND);
+
+	/* only ack parent if we've got all the irqs (seems we must
+	 * ack, all and hope that the irq system retriggers ok when
+	 * the interrupt goes off again)
+	 */
+
+	if (1) {
+		__raw_writel(parentmask, S3C2410_SRCPND);
+		__raw_writel(parentmask, S3C2410_INTPND);
+	}
+}
+
+
+/* UART0 */
+
+static void
+s3c_irq_uart0_mask(unsigned int irqno)
+{
+	s3c_irqsub_mask(irqno, INTMSK_UART0, 7);
+}
+
+static void
+s3c_irq_uart0_unmask(unsigned int irqno)
+{
+	s3c_irqsub_unmask(irqno, INTMSK_UART0);
+}
+
+static void
+s3c_irq_uart0_ack(unsigned int irqno)
+{
+	s3c_irqsub_maskack(irqno, INTMSK_UART0, 7);
+}
+
+static struct irqchip s3c_irq_uart0 = {
+	.mask	    = s3c_irq_uart0_mask,
+	.unmask	    = s3c_irq_uart0_unmask,
+	.ack	    = s3c_irq_uart0_ack,
+};
+
+/* UART1 */
+
+static void
+s3c_irq_uart1_mask(unsigned int irqno)
+{
+	s3c_irqsub_mask(irqno, INTMSK_UART1, 7 << 3);
+}
+
+static void
+s3c_irq_uart1_unmask(unsigned int irqno)
+{
+	s3c_irqsub_unmask(irqno, INTMSK_UART1);
+}
+
+static void
+s3c_irq_uart1_ack(unsigned int irqno)
+{
+	s3c_irqsub_maskack(irqno, INTMSK_UART1, 7 << 3);
+}
+
+static struct irqchip s3c_irq_uart1 = {
+	.mask	    = s3c_irq_uart1_mask,
+	.unmask	    = s3c_irq_uart1_unmask,
+	.ack	    = s3c_irq_uart1_ack,
+};
+
+/* UART2 */
+
+static void
+s3c_irq_uart2_mask(unsigned int irqno)
+{
+	s3c_irqsub_mask(irqno, INTMSK_UART2, 7 << 6);
+}
+
+static void
+s3c_irq_uart2_unmask(unsigned int irqno)
+{
+	s3c_irqsub_unmask(irqno, INTMSK_UART2);
+}
+
+static void
+s3c_irq_uart2_ack(unsigned int irqno)
+{
+	s3c_irqsub_maskack(irqno, INTMSK_UART2, 7 << 6);
+}
+
+static struct irqchip s3c_irq_uart2 = {
+	.mask	    = s3c_irq_uart2_mask,
+	.unmask	    = s3c_irq_uart2_unmask,
+	.ack	    = s3c_irq_uart2_ack,
+};
+
+/* ADC and Touchscreen */
+
+static void
+s3c_irq_adc_mask(unsigned int irqno)
+{
+	s3c_irqsub_mask(irqno, INTMSK_ADCPARENT, 3 << 9);
+}
+
+static void
+s3c_irq_adc_unmask(unsigned int irqno)
+{
+	s3c_irqsub_unmask(irqno, INTMSK_ADCPARENT);
+}
+
+static void
+s3c_irq_adc_ack(unsigned int irqno)
+{
+	s3c_irqsub_maskack(irqno, INTMSK_ADCPARENT, 3 << 9);
+}
+
+static struct irqchip s3c_irq_adc = {
+	.mask	    = s3c_irq_adc_mask,
+	.unmask	    = s3c_irq_adc_unmask,
+	.ack	    = s3c_irq_adc_ack,
+};
+
+#if 0
+/* LCD (todo) */
+
+static void
+s3c_irq_lcd_mask(unsigned int irqno)
+{
+
+}
+
+static void
+s3c_irq_lcd_unmask(unsigned int irqno)
+{
+
+}
+
+static void
+s3c_irq_lcd_ack(unsigned int irqno)
+{
+
+}
+
+static struct irqchip s3c_irq_lcd = {
+	.mask	    = s3c_irq_lcd_mask,
+	.unmask	    = s3c_irq_lcd_unmask,
+	.ack	    = s3c_irq_lcd_ack,
+};
+#endif
+
+/* irq demux */
+
+
+static void s3c_irq_demux_uart(unsigned int start,
+			       struct pt_regs *regs)
+{
+	unsigned int subsrc, submsk;
+	unsigned int offset = start - IRQ_S3CUART_RX0;
+	struct irqdesc *desc;
+
+	/* read the current pending interrupts, and the mask
+	 * for what it is available */
+
+	subsrc = __raw_readl(S3C2410_SUBSRCPND);
+	submsk = __raw_readl(S3C2410_INTSUBMSK);
+
+	irqdbf2("s3c_irq_demux_uart: start=%d (%d), subsrc=0x%08x,0x%08x\n",
+		start, offset, subsrc, submsk);
+
+	subsrc &= ~submsk;
+	subsrc >>= offset;
+	subsrc &= 7;
+
+	if (subsrc != 0) {
+		desc = irq_desc + start;
+
+		if (subsrc & 1)
+			desc->handle(start, desc, regs);
+
+		desc++;
+
+		if (subsrc & 2)
+			desc->handle(start+1, desc, regs);
+
+		desc++;
+
+		if (subsrc & 4)
+			desc->handle(start+2, desc, regs);
+	}
+}
+
+/* uart demux entry points */
+
+static void
+s3c_irq_demux_uart0(unsigned int irq,
+		    struct irqdesc *desc,
+		    struct pt_regs *regs)
+{
+	irq = irq;
+	s3c_irq_demux_uart(IRQ_S3CUART_RX0, regs);
+}
+
+static void
+s3c_irq_demux_uart1(unsigned int irq,
+		    struct irqdesc *desc,
+		    struct pt_regs *regs)
+{
+	irq = irq;
+	s3c_irq_demux_uart(IRQ_S3CUART_RX1, regs);
+}
+
+static void
+s3c_irq_demux_uart2(unsigned int irq,
+		    struct irqdesc *desc,
+		    struct pt_regs *regs)
+{
+	irq = irq;
+	s3c_irq_demux_uart(IRQ_S3CUART_RX2, regs);
+}
+
+
+
+void __init s3c2410_init_irq(void)
+{
+	unsigned long pend;
+	int irqno;
+	int i;
+
+	irqdbf("s3c2410_init_irq: clearing interrupt status flags\n");
+
+	/* first, clear all interrupts pending... */
+
+	for (i = 0; i < 4; i++) {
+		pend = __raw_readl(S3C2410_EINTPEND);
+		if (pend == 0)
+			break;
+		__raw_writel(pend, S3C2410_EINTPEND);
+		printk("irq: clearing pending ext status %08x\n", (int)pend);
+	}
+
+	for (i = 0; i < 4; i++) {
+		pend = __raw_readl(S3C2410_INTPND);
+		if (pend == 0)
+			break;
+		__raw_writel(pend, S3C2410_SRCPND);
+		__raw_writel(pend, S3C2410_INTPND);
+		printk("irq: clearing pending status %08x\n", (int)pend);
+	}
+
+	for (i = 0; i < 4; i++) {
+		pend = __raw_readl(S3C2410_SUBSRCPND);
+
+		if (pend == 0)
+			break;
+
+		printk("irq: clearing subpending status %08x\n", (int)pend);
+		__raw_writel(pend, S3C2410_SUBSRCPND);
+	}
+
+	/* register the main interrupts */
+
+	irqdbf("s3c2410_init_irq: registering s3c2410 interrupt handlers\n");
+
+	for (irqno = IRQ_EINT0; irqno < IRQ_ADCPARENT; irqno++) {
+		/* set all the s3c2410 internal irqs */
+
+		switch (irqno) {
+
+		case IRQ_EINT4t7:
+		case IRQ_EINT8t23:
+			/* these are already dealt with, so should never
+			 * appear */
+			break;
+
+			/* deal with the special IRQs (cascaded) */
+
+		case IRQ_UART0:
+		case IRQ_UART1:
+		case IRQ_UART2:
+		case IRQ_LCD:
+		case IRQ_ADCPARENT:
+			set_irq_chip(irqno, &s3c_irq_level_chip);
+			set_irq_handler(irqno, do_level_IRQ);
+			break;
+
+		case IRQ_RESERVED6:
+		case IRQ_RESERVED24:
+			/* no IRQ here */
+			break;
+
+		default:
+			//irqdbf("registering irq %d (s3c irq)\n", irqno);
+			set_irq_chip(irqno, &s3c_irq_chip);
+			set_irq_handler(irqno, do_edge_IRQ);
+			set_irq_flags(irqno, IRQF_VALID);
+		}
+	}
+
+	/* setup the cascade irq handlers */
+
+	set_irq_chained_handler(IRQ_UART0, s3c_irq_demux_uart0);
+	set_irq_chained_handler(IRQ_UART1, s3c_irq_demux_uart1);
+	set_irq_chained_handler(IRQ_UART2, s3c_irq_demux_uart2);
+	//set_irq_chained_handler(IRQ_LCD, s3c_irq_demux_);
+	//set_irq_chained_handler(IRQ_ADCPARENT, s3c_irq_demux_);
+
+
+	/* external interrupts */
+
+	for (irqno = IRQ_EINT4; irqno <= IRQ_EINT23; irqno++) {
+		irqdbf("registering irq %d (extended s3c irq)\n", irqno);
+		set_irq_chip(irqno, &s3c_irqext_chip);
+		set_irq_handler(irqno, do_edge_IRQ);
+		set_irq_flags(irqno, IRQF_VALID);
+	}
+
+	/* register the uart interrupts */
+
+	irqdbf("s3c2410: registering external interrupts\n");
+
+	for (irqno = IRQ_S3CUART_RX0; irqno <= IRQ_S3CUART_ERR0; irqno++) {
+		irqdbf("registering irq %d (s3c uart0 irq)\n", irqno);
+		set_irq_chip(irqno, &s3c_irq_uart0);
+		set_irq_handler(irqno, do_level_IRQ);
+		set_irq_flags(irqno, IRQF_VALID);
+	}
+
+	for (irqno = IRQ_S3CUART_RX1; irqno <= IRQ_S3CUART_ERR1; irqno++) {
+		irqdbf("registering irq %d (s3c uart1 irq)\n", irqno);
+		set_irq_chip(irqno, &s3c_irq_uart1);
+		set_irq_handler(irqno, do_level_IRQ);
+		set_irq_flags(irqno, IRQF_VALID);
+	}
+
+	for (irqno = IRQ_S3CUART_RX2; irqno <= IRQ_S3CUART_ERR2; irqno++) {
+		irqdbf("registering irq %d (s3c uart2 irq)\n", irqno);
+		set_irq_chip(irqno, &s3c_irq_uart2);
+		set_irq_handler(irqno, do_level_IRQ);
+		set_irq_flags(irqno, IRQF_VALID);
+	}
+
+	for (irqno = IRQ_TC; irqno <= IRQ_ADC; irqno++) {
+		irqdbf("registering irq %d (s3c adc irq)\n", irqno);
+		set_irq_chip(irqno, &s3c_irq_adc);
+		set_irq_handler(irqno, do_edge_IRQ);
+		set_irq_flags(irqno, IRQF_VALID);
+	}
+
+	irqdbf("s3c2410: registered interrupt handlers\n");
+}
--- diff/arch/arm/mach-s3c2410/mach-bast.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-s3c2410/mach-bast.c	2004-04-21 10:45:33.366631000 +0100
@@ -0,0 +1,194 @@
+/* linux/arch/arm/mach-s3c2410/mach-bast.c
+ *
+ * Copyright (c) 2003 Simtec Electronics
+ *   Ben Dooks <ben@simtec.co.uk>
+ *
+ * http://www.simtec.co.uk/products/EB2410ITX/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Modifications:
+ *     16-May-2003 BJD  Created initial version
+ *     16-Aug-2003 BJD  Fixed header files and copyright, added URL
+ *     05-Sep-2003 BJD  Moved to v2.6 kernel
+ *     06-Jan-2003 BJD  Updates for <arch/map.h>
+ *     18-Jan-2003 BJD  Added serial port configuration
+*/
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/interrupt.h>
+#include <linux/list.h>
+#include <linux/timer.h>
+#include <linux/init.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/irq.h>
+
+#include <asm/arch/bast-map.h>
+
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/mach-types.h>
+
+//#include <asm/debug-ll.h>
+#include <asm/arch/regs-serial.h>
+
+#include "s3c2410.h"
+
+/* macros for virtual address mods for the io space entries */
+#define VA_C5(item) ((item) + BAST_VAM_CS5)
+#define VA_C4(item) ((item) + BAST_VAM_CS4)
+#define VA_C3(item) ((item) + BAST_VAM_CS3)
+#define VA_C2(item) ((item) + BAST_VAM_CS2)
+
+/* macros to modify the physical addresses for io space */
+
+#define PA_CS2(item) ((item) + S3C2410_CS2)
+#define PA_CS3(item) ((item) + S3C2410_CS3)
+#define PA_CS4(item) ((item) + S3C2410_CS4)
+#define PA_CS5(item) ((item) + S3C2410_CS5)
+
+static struct map_desc bast_iodesc[] __initdata = {
+  /* ISA IO areas */
+
+  { S3C2410_VA_ISA_BYTE, PA_CS2(BAST_PA_ISAIO),	   SZ_16M, MT_DEVICE },
+  { S3C2410_VA_ISA_WORD, PA_CS3(BAST_PA_ISAIO),	   SZ_16M, MT_DEVICE },
+
+  /* we could possibly compress the next set down into a set of smaller tables
+   * pagetables, but that would mean using an L2 section, and it still means
+   * we cannot actually feed the same register to an LDR due to 16K spacing
+   */
+
+  /* bast CPLD control registers, and external interrupt controls */
+  { BAST_VA_CTRL1, BAST_PA_CTRL1,		   SZ_1M, MT_DEVICE },
+  { BAST_VA_CTRL2, BAST_PA_CTRL2,		   SZ_1M, MT_DEVICE },
+  { BAST_VA_CTRL3, BAST_PA_CTRL3,		   SZ_1M, MT_DEVICE },
+  { BAST_VA_CTRL4, BAST_PA_CTRL4,		   SZ_1M, MT_DEVICE },
+
+  /* PC104 IRQ mux */
+  { BAST_VA_PC104_IRQREQ,  BAST_PA_PC104_IRQREQ,   SZ_1M, MT_DEVICE },
+  { BAST_VA_PC104_IRQRAW,  BAST_PA_PC104_IRQRAW,   SZ_1M, MT_DEVICE },
+  { BAST_VA_PC104_IRQMASK, BAST_PA_PC104_IRQMASK,  SZ_1M, MT_DEVICE },
+
+  /* onboard 8bit lcd port */
+
+  { BAST_VA_LCD_RCMD1,  BAST_PA_LCD_RCMD1,	   SZ_1M, MT_DEVICE },
+  { BAST_VA_LCD_WCMD1,  BAST_PA_LCD_WCMD1,	   SZ_1M, MT_DEVICE },
+  { BAST_VA_LCD_RDATA1, BAST_PA_LCD_RDATA1,	   SZ_1M, MT_DEVICE },
+  { BAST_VA_LCD_WDATA1, BAST_PA_LCD_WDATA1,	   SZ_1M, MT_DEVICE },
+  { BAST_VA_LCD_RCMD2,  BAST_PA_LCD_RCMD2,	   SZ_1M, MT_DEVICE },
+  { BAST_VA_LCD_WCMD2,  BAST_PA_LCD_WCMD2,	   SZ_1M, MT_DEVICE },
+  { BAST_VA_LCD_RDATA2, BAST_PA_LCD_RDATA2,	   SZ_1M, MT_DEVICE },
+  { BAST_VA_LCD_WDATA2, BAST_PA_LCD_WDATA2,	   SZ_1M, MT_DEVICE },
+
+  /* peripheral space... one for each of fast/slow/byte/16bit */
+  /* note, ide is only decoded in word space, even though some registers
+   * are only 8bit */
+
+  /* slow, byte */
+  { VA_C2(BAST_VA_ISAIO),   PA_CS2(BAST_PA_ISAIO),    SZ_16M, MT_DEVICE },
+  { VA_C2(BAST_VA_ISAMEM),  PA_CS2(BAST_PA_ISAMEM),   SZ_16M, MT_DEVICE },
+  { VA_C2(BAST_VA_ASIXNET), PA_CS3(BAST_PA_ASIXNET),  SZ_1M,  MT_DEVICE },
+  { VA_C2(BAST_VA_SUPERIO), PA_CS2(BAST_PA_SUPERIO),  SZ_1M,  MT_DEVICE },
+  { VA_C2(BAST_VA_DM9000),  PA_CS2(BAST_PA_DM9000),   SZ_1M,  MT_DEVICE },
+  { VA_C2(BAST_VA_IDEPRI),  PA_CS3(BAST_PA_IDEPRI),   SZ_1M,  MT_DEVICE },
+  { VA_C2(BAST_VA_IDESEC),  PA_CS3(BAST_PA_IDESEC),   SZ_1M,  MT_DEVICE },
+  { VA_C2(BAST_VA_IDEPRIAUX), PA_CS3(BAST_PA_IDEPRIAUX), SZ_1M, MT_DEVICE },
+  { VA_C2(BAST_VA_IDESECAUX), PA_CS3(BAST_PA_IDESECAUX), SZ_1M, MT_DEVICE },
+
+  /* slow, word */
+  { VA_C3(BAST_VA_ISAIO),   PA_CS3(BAST_PA_ISAIO),    SZ_16M, MT_DEVICE },
+  { VA_C3(BAST_VA_ISAMEM),  PA_CS3(BAST_PA_ISAMEM),   SZ_16M, MT_DEVICE },
+  { VA_C3(BAST_VA_ASIXNET), PA_CS3(BAST_PA_ASIXNET),  SZ_1M,  MT_DEVICE },
+  { VA_C3(BAST_VA_SUPERIO), PA_CS3(BAST_PA_SUPERIO),  SZ_1M,  MT_DEVICE },
+  { VA_C3(BAST_VA_DM9000),  PA_CS3(BAST_PA_DM9000),   SZ_1M,  MT_DEVICE },
+  { VA_C3(BAST_VA_IDEPRI),  PA_CS3(BAST_PA_IDEPRI),   SZ_1M,  MT_DEVICE },
+  { VA_C3(BAST_VA_IDESEC),  PA_CS3(BAST_PA_IDESEC),   SZ_1M,  MT_DEVICE },
+  { VA_C3(BAST_VA_IDEPRIAUX), PA_CS3(BAST_PA_IDEPRIAUX), SZ_1M, MT_DEVICE },
+  { VA_C3(BAST_VA_IDESECAUX), PA_CS3(BAST_PA_IDESECAUX), SZ_1M, MT_DEVICE },
+
+  /* fast, byte */
+  { VA_C4(BAST_VA_ISAIO),   PA_CS4(BAST_PA_ISAIO),    SZ_16M, MT_DEVICE },
+  { VA_C4(BAST_VA_ISAMEM),  PA_CS4(BAST_PA_ISAMEM),   SZ_16M, MT_DEVICE },
+  { VA_C4(BAST_VA_ASIXNET), PA_CS5(BAST_PA_ASIXNET),  SZ_1M,  MT_DEVICE },
+  { VA_C4(BAST_VA_SUPERIO), PA_CS4(BAST_PA_SUPERIO),  SZ_1M,  MT_DEVICE },
+  { VA_C4(BAST_VA_DM9000),  PA_CS4(BAST_PA_DM9000),   SZ_1M,  MT_DEVICE },
+  { VA_C4(BAST_VA_IDEPRI),  PA_CS5(BAST_PA_IDEPRI),   SZ_1M,  MT_DEVICE },
+  { VA_C4(BAST_VA_IDESEC),  PA_CS5(BAST_PA_IDESEC),   SZ_1M,  MT_DEVICE },
+  { VA_C4(BAST_VA_IDEPRIAUX), PA_CS5(BAST_PA_IDEPRIAUX), SZ_1M, MT_DEVICE },
+  { VA_C4(BAST_VA_IDESECAUX), PA_CS5(BAST_PA_IDESECAUX), SZ_1M, MT_DEVICE },
+
+  /* fast, word */
+  { VA_C5(BAST_VA_ISAIO),   PA_CS5(BAST_PA_ISAIO),    SZ_16M, MT_DEVICE },
+  { VA_C5(BAST_VA_ISAMEM),  PA_CS5(BAST_PA_ISAMEM),   SZ_16M, MT_DEVICE },
+  { VA_C5(BAST_VA_ASIXNET), PA_CS5(BAST_PA_ASIXNET),  SZ_1M,  MT_DEVICE },
+  { VA_C5(BAST_VA_SUPERIO), PA_CS5(BAST_PA_SUPERIO),  SZ_1M,  MT_DEVICE },
+  { VA_C5(BAST_VA_DM9000),  PA_CS5(BAST_PA_DM9000),   SZ_1M,  MT_DEVICE },
+  { VA_C5(BAST_VA_IDEPRI),  PA_CS5(BAST_PA_IDEPRI),   SZ_1M,  MT_DEVICE },
+  { VA_C5(BAST_VA_IDESEC),  PA_CS5(BAST_PA_IDESEC),   SZ_1M,  MT_DEVICE },
+  { VA_C5(BAST_VA_IDEPRIAUX), PA_CS5(BAST_PA_IDEPRIAUX), SZ_1M, MT_DEVICE },
+  { VA_C5(BAST_VA_IDESECAUX), PA_CS5(BAST_PA_IDESECAUX), SZ_1M, MT_DEVICE },
+};
+
+#define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK
+#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
+#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
+
+/* base baud rate for all our UARTs */
+static unsigned long bast_serial_clock = 24*1000*1000;
+
+static struct s3c2410_uartcfg bast_uartcfgs[] = {
+	[0] = {
+		.hwport	     = 0,
+		.flags	     = 0,
+		.clock	     = &bast_serial_clock,
+		.ucon	     = UCON,
+		.ulcon	     = ULCON,
+		.ufcon	     = UFCON,
+	},
+	[1] = {
+		.hwport	     = 1,
+		.flags	     = 0,
+		.clock	     = &bast_serial_clock,
+		.ucon	     = UCON,
+		.ulcon	     = ULCON,
+		.ufcon	     = UFCON,
+	},
+	/* port 2 is not actually used */
+	[2] = {
+		.hwport	     = 2,
+		.flags	     = 0,
+		.clock	     = &bast_serial_clock,
+		.ucon	     = UCON,
+		.ulcon	     = ULCON,
+		.ufcon	     = UFCON,
+	}
+};
+
+
+void __init bast_map_io(void)
+{
+	s3c2410_map_io(bast_iodesc, ARRAY_SIZE(bast_iodesc));
+	s3c2410_uartcfgs = bast_uartcfgs;
+}
+
+void __init bast_init_irq(void)
+{
+	//llprintk("bast_init_irq:\n");
+
+	s3c2410_init_irq();
+
+}
+
+MACHINE_START(BAST, "Simtec-BAST")
+     MAINTAINER("Ben Dooks <ben@simtec.co.uk>")
+     BOOT_MEM(S3C2410_SDRAM_PA, S3C2410_PA_UART, S3C2410_VA_UART)
+     BOOT_PARAMS(S3C2410_SDRAM_PA + 0x100)
+     MAPIO(bast_map_io)
+     INITIRQ(bast_init_irq)
+MACHINE_END
--- diff/arch/arm/mach-s3c2410/mach-h1940.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-s3c2410/mach-h1940.c	2004-04-21 10:45:33.366631000 +0100
@@ -0,0 +1,100 @@
+/* linux/arch/arm/mach-s3c2410/mach-ipaq.c
+ *
+ * Copyright (c) 2003 Simtec Electronics
+ *   Ben Dooks <ben@simtec.co.uk>
+ *
+ * http://www.handhelds.org/projects/h1940.html
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Modifications:
+ *     16-May-2003 BJD  Created initial version
+ *     16-Aug-2003 BJD  Fixed header files and copyright, added URL
+ *     05-Sep-2003 BJD  Moved to v2.6 kernel
+ *     06-Jan-2003 BJD  Updates for <arch/map.h>
+ *     18-Jan-2003 BJD  Added serial port configuration
+ *     17-Feb-2003 BJD  Copied to mach-ipaq.c
+*/
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/interrupt.h>
+#include <linux/list.h>
+#include <linux/timer.h>
+#include <linux/init.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/irq.h>
+
+#include <asm/hardware.h>
+#include <asm/hardware/iomd.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/mach-types.h>
+
+//#include <asm/debug-ll.h>
+#include <asm/arch/regs-serial.h>
+
+#include "s3c2410.h"
+
+static struct map_desc ipaq_iodesc[] __initdata = {
+	/* nothing here yet */
+};
+
+#define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK
+#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
+#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
+
+static struct s3c2410_uartcfg ipaq_uartcfgs[] = {
+	[0] = {
+		.hwport	     = 0,
+		.flags	     = 0,
+		.clock	     = &s3c2410_hclk,
+		.ucon	     = 0x3c5,
+		.ulcon	     = 0x03,
+		.ufcon	     = 0x51,
+	},
+	[1] = {
+		.hwport	     = 1,
+		.flags	     = 0,
+		.clock	     = &s3c2410_hclk,
+		.ucon	     = 0x245,
+		.ulcon	     = 0x03,
+		.ufcon	     = 0x00,
+	},
+	/* IR port */
+	[2] = {
+		.hwport	     = 2,
+		.flags	     = 0,
+		.clock	     = &s3c2410_hclk,
+		.ucon	     = 0x3c5,
+		.ulcon	     = 0x43,
+		.ufcon	     = 0x51,
+	}
+};
+
+
+void __init ipaq_map_io(void)
+{
+	s3c2410_map_io(ipaq_iodesc, ARRAY_SIZE(ipaq_iodesc));
+	s3c2410_uartcfgs = ipaq_uartcfgs;
+}
+
+void __init ipaq_init_irq(void)
+{
+	//llprintk("ipaq_init_irq:\n");
+
+	s3c2410_init_irq();
+
+}
+
+MACHINE_START(H1940, "IPAQ-H1940")
+     MAINTAINER("Ben Dooks <ben@fluff.org>")
+     BOOT_MEM(S3C2410_SDRAM_PA, S3C2410_PA_UART, S3C2410_VA_UART)
+     BOOT_PARAMS(S3C2410_SDRAM_PA + 0x100)
+     MAPIO(ipaq_map_io)
+     INITIRQ(ipaq_init_irq)
+MACHINE_END
--- diff/arch/arm/mach-s3c2410/mach-vr1000.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-s3c2410/mach-vr1000.c	2004-04-21 10:45:33.367630848 +0100
@@ -0,0 +1,164 @@
+/* linux/arch/arm/mach-s3c2410/mach-vr1000.c
+ *
+ * Copyright (c) 2003 Simtec Electronics
+ *   Ben Dooks <ben@simtec.co.uk>
+ *
+ * http://www.simtec.co.uk/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Modifications:
+ *     16-May-2003 BJD  Created initial version
+ *     16-Aug-2003 BJD  Fixed header files and copyright, added URL
+ *     05-Sep-2003 BJD  Moved to v2.6 kernel
+ *     06-Jan-2003 BJD  Updates for <arch/map.h>
+ *     18-Jan-2003 BJD  Added serial port configuration
+ *     05-Apr-2004 BJD  Copied to make mach-vr1000.c
+*/
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/interrupt.h>
+#include <linux/list.h>
+#include <linux/timer.h>
+#include <linux/init.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/irq.h>
+
+#include <asm/arch/bast-map.h>
+#include <asm/arch/vr1000-map.h>
+
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/mach-types.h>
+
+//#include <asm/debug-ll.h>
+#include <asm/arch/regs-serial.h>
+
+#include "s3c2410.h"
+
+/* macros for virtual address mods for the io space entries */
+#define VA_C5(item) ((item) + BAST_VAM_CS5)
+#define VA_C4(item) ((item) + BAST_VAM_CS4)
+#define VA_C3(item) ((item) + BAST_VAM_CS3)
+#define VA_C2(item) ((item) + BAST_VAM_CS2)
+
+/* macros to modify the physical addresses for io space */
+
+#define PA_CS2(item) ((item) + S3C2410_CS2)
+#define PA_CS3(item) ((item) + S3C2410_CS3)
+#define PA_CS4(item) ((item) + S3C2410_CS4)
+#define PA_CS5(item) ((item) + S3C2410_CS5)
+
+static struct map_desc vr1000_iodesc[] __initdata = {
+  /* ISA IO areas */
+
+  { S3C2410_VA_ISA_BYTE, PA_CS2(BAST_PA_ISAIO),	   SZ_16M, MT_DEVICE },
+  { S3C2410_VA_ISA_WORD, PA_CS3(BAST_PA_ISAIO),	   SZ_16M, MT_DEVICE },
+
+  /* we could possibly compress the next set down into a set of smaller tables
+   * pagetables, but that would mean using an L2 section, and it still means
+   * we cannot actually feed the same register to an LDR due to 16K spacing
+   */
+
+  /* bast CPLD control registers, and external interrupt controls */
+  { VR1000_VA_CTRL1, VR1000_PA_CTRL1,		       SZ_1M, MT_DEVICE },
+  { VR1000_VA_CTRL2, VR1000_PA_CTRL2,		       SZ_1M, MT_DEVICE },
+  { VR1000_VA_CTRL3, VR1000_PA_CTRL3,		       SZ_1M, MT_DEVICE },
+  { VR1000_VA_CTRL4, VR1000_PA_CTRL4,		       SZ_1M, MT_DEVICE },
+
+  /* peripheral space... one for each of fast/slow/byte/16bit */
+  /* note, ide is only decoded in word space, even though some registers
+   * are only 8bit */
+
+  /* slow, byte */
+  { VA_C2(VR1000_VA_DM9000),  PA_CS2(VR1000_PA_DM9000),	  SZ_1M,  MT_DEVICE },
+  { VA_C2(VR1000_VA_IDEPRI),  PA_CS3(VR1000_PA_IDEPRI),	  SZ_1M,  MT_DEVICE },
+  { VA_C2(VR1000_VA_IDESEC),  PA_CS3(VR1000_PA_IDESEC),	  SZ_1M,  MT_DEVICE },
+  { VA_C2(VR1000_VA_IDEPRIAUX), PA_CS3(VR1000_PA_IDEPRIAUX), SZ_1M, MT_DEVICE },
+  { VA_C2(VR1000_VA_IDESECAUX), PA_CS3(VR1000_PA_IDESECAUX), SZ_1M, MT_DEVICE },
+
+  /* slow, word */
+  { VA_C3(VR1000_VA_DM9000),  PA_CS3(VR1000_PA_DM9000),	  SZ_1M,  MT_DEVICE },
+  { VA_C3(VR1000_VA_IDEPRI),  PA_CS3(VR1000_PA_IDEPRI),	  SZ_1M,  MT_DEVICE },
+  { VA_C3(VR1000_VA_IDESEC),  PA_CS3(VR1000_PA_IDESEC),	  SZ_1M,  MT_DEVICE },
+  { VA_C3(VR1000_VA_IDEPRIAUX), PA_CS3(VR1000_PA_IDEPRIAUX), SZ_1M, MT_DEVICE },
+  { VA_C3(VR1000_VA_IDESECAUX), PA_CS3(VR1000_PA_IDESECAUX), SZ_1M, MT_DEVICE },
+
+  /* fast, byte */
+  { VA_C4(VR1000_VA_DM9000),  PA_CS4(VR1000_PA_DM9000),	  SZ_1M,  MT_DEVICE },
+  { VA_C4(VR1000_VA_IDEPRI),  PA_CS5(VR1000_PA_IDEPRI),	  SZ_1M,  MT_DEVICE },
+  { VA_C4(VR1000_VA_IDESEC),  PA_CS5(VR1000_PA_IDESEC),	  SZ_1M,  MT_DEVICE },
+  { VA_C4(VR1000_VA_IDEPRIAUX), PA_CS5(VR1000_PA_IDEPRIAUX), SZ_1M, MT_DEVICE },
+  { VA_C4(VR1000_VA_IDESECAUX), PA_CS5(VR1000_PA_IDESECAUX), SZ_1M, MT_DEVICE },
+
+  /* fast, word */
+  { VA_C5(VR1000_VA_DM9000),  PA_CS5(VR1000_PA_DM9000),	  SZ_1M,  MT_DEVICE },
+  { VA_C5(VR1000_VA_IDEPRI),  PA_CS5(VR1000_PA_IDEPRI),	  SZ_1M,  MT_DEVICE },
+  { VA_C5(VR1000_VA_IDESEC),  PA_CS5(VR1000_PA_IDESEC),	  SZ_1M,  MT_DEVICE },
+  { VA_C5(VR1000_VA_IDEPRIAUX), PA_CS5(VR1000_PA_IDEPRIAUX), SZ_1M, MT_DEVICE },
+  { VA_C5(VR1000_VA_IDESECAUX), PA_CS5(VR1000_PA_IDESECAUX), SZ_1M, MT_DEVICE },
+};
+
+#define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK
+#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
+#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
+
+/* base baud rate for all our UARTs */
+static unsigned long vr1000_serial_clock = 3692307;
+
+static struct s3c2410_uartcfg vr1000_uartcfgs[] = {
+	[0] = {
+		.hwport	     = 0,
+		.flags	     = 0,
+		.clock	     = &vr1000_serial_clock,
+		.ucon	     = UCON,
+		.ulcon	     = ULCON,
+		.ufcon	     = UFCON,
+	},
+	[1] = {
+		.hwport	     = 1,
+		.flags	     = 0,
+		.clock	     = &vr1000_serial_clock,
+		.ucon	     = UCON,
+		.ulcon	     = ULCON,
+		.ufcon	     = UFCON,
+	},
+	/* port 2 is not actually used */
+	[2] = {
+		.hwport	     = 2,
+		.flags	     = 0,
+		.clock	     = &vr1000_serial_clock,
+		.ucon	     = UCON,
+		.ulcon	     = ULCON,
+		.ufcon	     = UFCON,
+	}
+};
+
+
+void __init vr1000_map_io(void)
+{
+	s3c2410_map_io(vr1000_iodesc, ARRAY_SIZE(vr1000_iodesc));
+	s3c2410_uartcfgs = vr1000_uartcfgs;
+}
+
+void __init vr1000_init_irq(void)
+{
+	//llprintk("vr1000init_irq:\n");
+
+	s3c2410_init_irq();
+
+}
+
+MACHINE_START(VR1000, "Simtec-VR1000")
+     MAINTAINER("Ben Dooks <ben@simtec.co.uk>")
+     BOOT_MEM(S3C2410_SDRAM_PA, S3C2410_PA_UART, S3C2410_VA_UART)
+     BOOT_PARAMS(S3C2410_SDRAM_PA + 0x100)
+     MAPIO(vr1000_map_io)
+     INITIRQ(vr1000_init_irq)
+MACHINE_END
--- diff/arch/arm/mach-s3c2410/s3c2410.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-s3c2410/s3c2410.c	2004-04-21 10:45:33.367630848 +0100
@@ -0,0 +1,191 @@
+/* linux/arch/arm/mach-s3c2410/s3c2410.c
+ *
+ * Copyright (c) 2003 Simtec Electronics
+ * Ben Dooks <ben@simtec.co.uk>
+ *
+ * http://www.simtec.co.uk/products/EB2410ITX/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Modifications:
+ *     16-May-2003 BJD  Created initial version
+ *     16-Aug-2003 BJD  Fixed header files and copyright, added URL
+ *     05-Sep-2003 BJD  Moved to kernel v2.6
+ *     18-Jan-2003 BJD  Added serial port configuration
+*/
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/interrupt.h>
+#include <linux/list.h>
+#include <linux/timer.h>
+#include <linux/init.h>
+#include <linux/device.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/irq.h>
+
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/mach-types.h>
+
+#include <asm/arch/regs-clock.h>
+#include <asm/arch/regs-serial.h>
+
+int s3c2410_clock_tick_rate = 12*1000*1000;  /* current timers at 12MHz */
+
+/* serial port setup */
+
+struct s3c2410_uartcfg *s3c2410_uartcfgs;
+
+/* clock info */
+
+unsigned long s3c2410_fclk;
+unsigned long s3c2410_hclk;
+unsigned long s3c2410_pclk;
+
+#ifndef MHZ
+#define MHZ (1000*1000)
+#endif
+
+#define print_mhz(m) ((m) / MHZ), ((m / 1000) % 1000)
+
+#define IODESC_ENT(x) { S3C2410_VA_##x, S3C2410_PA_##x, S3C2410_SZ_##x, MT_DEVICE }
+
+static struct map_desc s3c2410_iodesc[] __initdata = {
+  IODESC_ENT(IRQ),
+  IODESC_ENT(MEMCTRL),
+  IODESC_ENT(USBHOST),
+  IODESC_ENT(DMA),
+  IODESC_ENT(CLKPWR),
+  IODESC_ENT(LCD),
+  IODESC_ENT(NAND),
+  IODESC_ENT(UART),
+  IODESC_ENT(TIMER),
+  IODESC_ENT(USBDEV),
+  IODESC_ENT(WATCHDOG),
+  IODESC_ENT(IIC),
+  IODESC_ENT(IIS),
+  IODESC_ENT(GPIO),
+  IODESC_ENT(RTC),
+  IODESC_ENT(ADC),
+  IODESC_ENT(SPI),
+  IODESC_ENT(SDI)
+};
+
+static struct resource s3c_uart0_resource[] = {
+	[0] = {
+		.start = S3C2410_PA_UART0,
+		.end   = S3C2410_PA_UART0 + 0x3fff,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = IRQ_S3CUART_RX0,
+		.end   = IRQ_S3CUART_ERR0,
+		.flags = IORESOURCE_IRQ,
+	}
+
+};
+
+static struct resource s3c_uart1_resource[] = {
+	[0] = {
+		.start = S3C2410_PA_UART1,
+		.end   = S3C2410_PA_UART1 + 0x3fff,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = IRQ_S3CUART_RX1,
+		.end   = IRQ_S3CUART_ERR1,
+		.flags = IORESOURCE_IRQ,
+	}
+};
+
+static struct resource s3c_uart2_resource[] = {
+	[0] = {
+		.start = S3C2410_PA_UART2,
+		.end   = S3C2410_PA_UART2 + 0x3fff,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = IRQ_S3CUART_RX2,
+		.end   = IRQ_S3CUART_ERR2,
+		.flags = IORESOURCE_IRQ,
+	}
+};
+
+/* our uart devices */
+
+static struct platform_device s3c_uart0 = {
+	.name		  = "s3c2410-uart",
+	.id		  = 0,
+	.num_resources	  = ARRAY_SIZE(s3c_uart0_resource),
+	.resource	  = s3c_uart0_resource,
+};
+
+
+static struct platform_device s3c_uart1 = {
+	.name		  = "s3c2410-uart",
+	.id		  = 1,
+	.num_resources	  = ARRAY_SIZE(s3c_uart1_resource),
+	.resource	  = s3c_uart1_resource,
+};
+
+static struct platform_device s3c_uart2 = {
+	.name		  = "s3c2410-uart",
+	.id		  = 2,
+	.num_resources	  = ARRAY_SIZE(s3c_uart2_resource),
+	.resource	  = s3c_uart2_resource,
+};
+
+static struct platform_device *uart_devices[] __initdata = {
+	&s3c_uart0,
+	&s3c_uart1,
+	&s3c_uart2
+};
+
+void __init s3c2410_map_io(struct map_desc *mach_desc, int size)
+{
+	unsigned long tmp;
+
+	/* register our io-tables */
+
+	iotable_init(s3c2410_iodesc, ARRAY_SIZE(s3c2410_iodesc));
+	iotable_init(mach_desc, size);
+
+	/* now we've got our machine bits initialised, work out what
+	 * clocks we've got */
+
+	s3c2410_fclk = s3c2410_get_pll(__raw_readl(S3C2410_MPLLCON), 12*MHZ);
+
+	tmp = __raw_readl(S3C2410_CLKDIVN);
+	//printk("tmp=%08x, fclk=%d\n", tmp, s3c2410_fclk);
+
+	/* work out clock scalings */
+
+	s3c2410_hclk = s3c2410_fclk / ((tmp & S3C2410_CLKDIVN_HDIVN) ? 2 : 1);
+	s3c2410_pclk = s3c2410_hclk / ((tmp & S3C2410_CLKDIVN_PDIVN) ? 2 : 1);
+
+	/* print brieft summary of clocks, etc */
+
+	printk("S3C2410: core %ld.%03ld MHz, memory %ld.%03ld MHz, peripheral %ld.%03ld MHz\n",
+	       print_mhz(s3c2410_fclk), print_mhz(s3c2410_hclk),
+	       print_mhz(s3c2410_pclk));
+}
+
+
+static int __init s3c2410_init(void)
+{
+	int ret;
+
+	printk("S3C2410: Initialising architecture\n");
+
+	ret = platform_add_devices(uart_devices, ARRAY_SIZE(uart_devices));
+
+	return ret;
+}
+
+arch_initcall(s3c2410_init);
--- diff/arch/arm/mach-s3c2410/s3c2410.h	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/mach-s3c2410/s3c2410.h	2004-04-21 10:45:33.368630696 +0100
@@ -0,0 +1,6 @@
+
+
+extern void s3c2410_map_io(struct map_desc *, int count);
+
+extern void s3c2410_init_irq(void);
+
--- diff/arch/arm/oprofile/common.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/oprofile/common.c	2004-04-21 10:45:33.374629784 +0100
@@ -0,0 +1,138 @@
+/**
+ * @file common.c
+ *
+ * @remark Copyright 2004 Oprofile Authors
+ * @remark Read the file COPYING
+ *
+ * @author Zwane Mwaikambo
+ */
+
+#include <linux/init.h>
+#include <linux/oprofile.h>
+#include <linux/errno.h>
+#include <asm/semaphore.h>
+
+#include "op_counter.h"
+#include "op_arm_model.h"
+
+static struct op_arm_model_spec *pmu_model;
+static int pmu_enabled;
+static struct semaphore pmu_sem;
+
+static int pmu_start(void);
+static int pmu_setup(void);
+static void pmu_stop(void);
+static int pmu_create_files(struct super_block *, struct dentry *);
+
+static struct oprofile_operations pmu_ops = {
+	.create_files	= pmu_create_files,
+	.setup		= pmu_setup,
+	.shutdown	= pmu_stop,
+	.start		= pmu_start,
+	.stop		= pmu_stop,
+};
+
+#ifdef CONFIG_PM
+static struct sys_device device_oprofile = {
+	.id		= 0,
+	.cls		= &oprofile_sysclass,
+};
+
+static int __init init_driverfs(void)
+{
+	int ret;
+
+	if (!(ret = sysdev_class_register(&oprofile_sysclass)))
+		ret = sys_device_register(&device_oprofile);
+
+	return ret;
+}
+
+static void __exit exit_driverfs(void)
+{
+	sys_device_unregister(&device_oprofile);
+	sysdev_class_unregister(&oprofile_sysclass);
+}
+#else
+#define init_driverfs()	do { } while (0)
+#define exit_driverfs() do { } while (0)
+#endif /* CONFIG_PM */
+
+struct op_counter_config counter_config[OP_MAX_COUNTER];
+
+static int pmu_create_files(struct super_block *sb, struct dentry *root)
+{
+	unsigned int i;
+
+	for (i = 0; i < pmu_model->num_counters; i++) {
+		struct dentry *dir;
+		char buf[2];
+
+		snprintf(buf, sizeof buf, "%d", i);
+		dir = oprofilefs_mkdir(sb, root, buf);
+		oprofilefs_create_ulong(sb, dir, "enabled", &counter_config[i].enabled);
+		oprofilefs_create_ulong(sb, dir, "event", &counter_config[i].event);
+		oprofilefs_create_ulong(sb, dir, "count", &counter_config[i].count);
+		oprofilefs_create_ulong(sb, dir, "unit_mask", &counter_config[i].unit_mask);
+		oprofilefs_create_ulong(sb, dir, "kernel", &counter_config[i].kernel);
+		oprofilefs_create_ulong(sb, dir, "user", &counter_config[i].user);
+	}
+
+	return 0;
+}
+
+static int pmu_setup(void)
+{
+	int ret;
+
+	spin_lock(&oprofilefs_lock);
+	ret = pmu_model->setup_ctrs();
+	spin_unlock(&oprofilefs_lock);
+	return ret;
+}
+
+static int pmu_start(void)
+{
+	int ret = -EBUSY;
+
+	down(&pmu_sem);
+	if (!pmu_enabled) {
+		ret = pmu_model->start();
+		pmu_enabled = !ret;
+	}
+	up(&pmu_sem);
+	return ret;
+}
+
+static void pmu_stop(void)
+{
+	down(&pmu_sem);
+	if (pmu_enabled)
+		pmu_model->stop();
+	pmu_enabled = 0;
+	up(&pmu_sem);
+}
+
+int __init pmu_init(struct oprofile_operations **ops, struct op_arm_model_spec *spec)
+{
+	init_MUTEX(&pmu_sem);
+
+	if (spec->init() < 0)
+		return -ENODEV;
+
+	pmu_model = spec;
+	init_driverfs();
+	*ops = &pmu_ops;
+	pmu_ops.cpu_type = pmu_model->name;
+	printk(KERN_INFO "oprofile: using %s PMU\n", spec->name);
+	return 0;
+}
+
+void pmu_exit(void)
+{
+	if (pmu_model) {
+		exit_driverfs();
+		pmu_model = NULL;
+	}
+}
+
--- diff/arch/arm/oprofile/op_arm_model.h	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/oprofile/op_arm_model.h	2004-04-21 10:45:33.374629784 +0100
@@ -0,0 +1,29 @@
+/**
+ * @file op_arm_model.h
+ * interface to ARM machine specific operations
+ *
+ * @remark Copyright 2004 Oprofile Authors
+ * @remark Read the file COPYING
+ *
+ * @author Zwane Mwaikambo
+ */
+
+#ifndef OP_ARM_MODEL_H
+#define OP_ARM_MODEL_H
+
+struct op_arm_model_spec {
+	int (*init)(void);
+	unsigned int num_counters;
+	int (*setup_ctrs)(void);
+	int (*start)(void);
+	void (*stop)(void);
+	char *name;
+};
+
+#ifdef CONFIG_CPU_XSCALE
+extern struct op_arm_model_spec op_xscale_spec;
+#endif
+
+extern int pmu_init(struct oprofile_operations **ops, struct op_arm_model_spec *spec);
+extern void pmu_exit(void);
+#endif /* OP_ARM_MODEL_H */
--- diff/arch/arm/oprofile/op_counter.h	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/oprofile/op_counter.h	2004-04-21 10:45:33.375629632 +0100
@@ -0,0 +1,29 @@
+/**
+ * @file op_counter.h
+ *
+ * @remark Copyright 2004 Oprofile Authors
+ * @remark Read the file COPYING
+ *
+ * @author Zwane Mwaikambo
+ */
+
+#ifndef OP_COUNTER_H
+#define OP_COUNTER_H
+
+#define OP_MAX_COUNTER 5
+
+/* Per performance monitor configuration as set via
+ * oprofilefs.
+ */
+struct op_counter_config {
+	unsigned long count;
+	unsigned long enabled;
+	unsigned long event;
+	unsigned long unit_mask;
+	unsigned long kernel;
+	unsigned long user;
+};
+
+extern struct op_counter_config counter_config[];
+
+#endif /* OP_COUNTER_H */
--- diff/arch/arm/oprofile/op_model_xscale.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/arm/oprofile/op_model_xscale.c	2004-04-21 10:45:33.375629632 +0100
@@ -0,0 +1,432 @@
+/**
+ * @file op_model_xscale.c
+ * XScale Performance Monitor Driver
+ *
+ * @remark Copyright 2000-2004 Deepak Saxena <dsaxena@mvista.com>
+ * @remark Copyright 2000-2004 MontaVista Software Inc
+ * @remark Copyright 2004 Dave Jiang <dave.jiang@intel.com>
+ * @remark Copyright 2004 Intel Corporation
+ * @remark Copyright 2004 Zwane Mwaikambo <zwane@arm.linux.org.uk>
+ * @remark Copyright 2004 Oprofile Authors
+ *
+ * @remark Read the file COPYING
+ *
+ * @author Zwane Mwaikambo
+ */
+
+/* #define DEBUG */
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/oprofile.h>
+#include <linux/interrupt.h>
+#include <asm/arch/irqs.h>
+
+#include "op_counter.h"
+#include "op_arm_model.h"
+
+#define	PMU_ENABLE	0x001	/* Enable counters */
+#define PMN_RESET	0x002	/* Reset event counters */
+#define	CCNT_RESET	0x004	/* Reset clock counter */
+#define	PMU_RESET	(CCNT_RESET | PMN_RESET)
+
+/* TODO do runtime detection */
+#ifdef CONFIG_ARCH_IOP310
+#define XSCALE_PMU_IRQ  IRQ_XS80200_PMU
+#endif
+#ifdef CONFIG_ARCH_IOP321
+#define XSCALE_PMU_IRQ  IRQ_IOP321_CORE_PMU
+#endif
+#ifdef CONFIG_ARCH_IOP331
+#define XSCALE_PMU_IRQ  IRQ_IOP331_CORE_PMU
+#endif
+
+/*
+ * Different types of events that can be counted by the XScale PMU
+ * as used by Oprofile userspace. Here primarily for documentation
+ * purposes.
+ */
+
+#define EVT_ICACHE_MISS			0x00
+#define	EVT_ICACHE_NO_DELIVER		0x01
+#define	EVT_DATA_STALL			0x02
+#define	EVT_ITLB_MISS			0x03
+#define	EVT_DTLB_MISS			0x04
+#define	EVT_BRANCH			0x05
+#define	EVT_BRANCH_MISS			0x06
+#define	EVT_INSTRUCTION			0x07
+#define	EVT_DCACHE_FULL_STALL		0x08
+#define	EVT_DCACHE_FULL_STALL_CONTIG	0x09
+#define	EVT_DCACHE_ACCESS		0x0A
+#define	EVT_DCACHE_MISS			0x0B
+#define	EVT_DCACE_WRITE_BACK		0x0C
+#define	EVT_PC_CHANGED			0x0D
+#define	EVT_BCU_REQUEST			0x10
+#define	EVT_BCU_FULL			0x11
+#define	EVT_BCU_DRAIN			0x12
+#define	EVT_BCU_ECC_NO_ELOG		0x14
+#define	EVT_BCU_1_BIT_ERR		0x15
+#define	EVT_RMW				0x16
+/* EVT_CCNT is not hardware defined */
+#define EVT_CCNT			0xFE
+#define EVT_UNUSED			0xFF
+
+struct pmu_counter {
+	volatile unsigned long ovf;
+	unsigned long reset_counter;
+};
+
+enum { CCNT, PMN0, PMN1, PMN2, PMN3, MAX_COUNTERS };
+
+static struct pmu_counter results[MAX_COUNTERS];
+
+/*
+ * There are two versions of the PMU in current XScale processors
+ * with differing register layouts and number of performance counters.
+ * e.g. IOP321 is xsc1 whilst IOP331 is xsc2.
+ * We detect which register layout to use in xscale_detect_pmu()
+ */
+enum { PMU_XSC1, PMU_XSC2 };
+
+struct pmu_type {
+	int id;
+	char *name;
+	int num_counters;
+	unsigned int int_enable;
+	unsigned int cnt_ovf[MAX_COUNTERS];
+	unsigned int int_mask[MAX_COUNTERS];
+};
+
+static struct pmu_type pmu_parms[] = {
+	{
+		.id		= PMU_XSC1,
+		.name		= "arm/xscale1",
+		.num_counters	= 3,
+		.int_mask	= { [PMN0] = 0x10, [PMN1] = 0x20,
+				    [CCNT] = 0x40 },
+		.cnt_ovf	= { [CCNT] = 0x400, [PMN0] = 0x100,
+				    [PMN1] = 0x200},
+	},
+	{
+		.id		= PMU_XSC2,
+		.name		= "arm/xscale2",
+		.num_counters	= 5,
+		.int_mask	= { [CCNT] = 0x01, [PMN0] = 0x02,
+				    [PMN1] = 0x04, [PMN2] = 0x08,
+				    [PMN3] = 0x10 },
+		.cnt_ovf	= { [CCNT] = 0x01, [PMN0] = 0x02,
+				    [PMN1] = 0x04, [PMN2] = 0x08,
+				    [PMN3] = 0x10 },
+	},
+};
+
+static struct pmu_type *pmu;
+
+static void write_pmnc(u32 val)
+{
+	/* upper 4bits and 7, 11 are write-as-0 */
+	val &= 0xffff77f;
+	if (pmu->id == PMU_XSC1)
+		__asm__ __volatile__ ("mcr p14, 0, %0, c0, c0, 0" : : "r" (val));
+	else
+		__asm__ __volatile__ ("mcr p14, 0, %0, c0, c1, 0" : : "r" (val));
+}
+
+static u32 read_pmnc(void)
+{
+	u32 val;
+
+	if (pmu->id == PMU_XSC1)
+		__asm__ __volatile__ ("mrc p14, 0, %0, c0, c0, 0" : "=r" (val));
+	else
+		__asm__ __volatile__ ("mrc p14, 0, %0, c0, c1, 0" : "=r" (val));
+
+	return val;
+}
+
+static u32 __xsc1_read_counter(int counter)
+{
+	u32 val = 0;
+
+	switch (counter) {
+	case CCNT:
+		__asm__ __volatile__ ("mrc p14, 0, %0, c1, c0, 0" : "=r" (val));
+		break;
+	case PMN0:
+		__asm__ __volatile__ ("mrc p14, 0, %0, c2, c0, 0" : "=r" (val));
+		break;
+	case PMN1:
+		__asm__ __volatile__ ("mrc p14, 0, %0, c3, c0, 0" : "=r" (val));
+		break;
+	}
+	return val;
+}
+
+static u32 __xsc2_read_counter(int counter)
+{
+	u32 val = 0;
+
+	switch (counter) {
+	case CCNT:
+		__asm__ __volatile__ ("mrc p14, 0, %0, c1, c1, 0" : "=r" (val));
+		break;
+	case PMN0:
+		__asm__ __volatile__ ("mrc p14, 0, %0, c0, c2, 0" : "=r" (val));
+		break;
+	case PMN1:
+		__asm__ __volatile__ ("mrc p14, 0, %0, c1, c2, 0" : "=r" (val));
+		break;
+	case PMN2:
+		__asm__ __volatile__ ("mrc p14, 0, %0, c2, c2, 0" : "=r" (val));
+		break;
+	case PMN3:
+		__asm__ __volatile__ ("mrc p14, 0, %0, c3, c2, 0" : "=r" (val));
+		break;
+	}
+	return val;
+}
+
+static u32 read_counter(int counter)
+{
+	u32 val;
+
+	if (pmu->id == PMU_XSC1)
+		val = __xsc1_read_counter(counter);
+	else
+		val = __xsc2_read_counter(counter);
+
+	return val;
+}
+
+static void __xsc1_write_counter(int counter, u32 val)
+{
+	switch (counter) {
+	case CCNT:
+		__asm__ __volatile__ ("mcr p14, 0, %0, c1, c0, 0" : : "r" (val));
+		break;
+	case PMN0:
+		__asm__ __volatile__ ("mcr p14, 0, %0, c2, c0, 0" : : "r" (val));
+		break;
+	case PMN1:
+		__asm__ __volatile__ ("mcr p14, 0, %0, c3, c0, 0" : : "r" (val));
+		break;
+	}
+}
+
+static void __xsc2_write_counter(int counter, u32 val)
+{
+	switch (counter) {
+	case CCNT:
+		__asm__ __volatile__ ("mcr p14, 0, %0, c1, c1, 0" : : "r" (val));
+		break;
+	case PMN0:
+		__asm__ __volatile__ ("mcr p14, 0, %0, c0, c2, 0" : : "r" (val));
+		break;
+	case PMN1:
+		__asm__ __volatile__ ("mcr p14, 0, %0, c1, c2, 0" : : "r" (val));
+		break;
+	case PMN2:
+		__asm__ __volatile__ ("mcr p14, 0, %0, c2, c2, 0" : : "r" (val));
+		break;
+	case PMN3:
+		__asm__ __volatile__ ("mcr p14, 0, %0, c3, c2, 0" : : "r" (val));
+		break;
+	}
+}
+
+static void write_counter(int counter, u32 val)
+{
+	if (pmu->id == PMU_XSC1)
+		__xsc1_write_counter(counter, val);
+	else
+		__xsc2_write_counter(counter, val);
+}
+
+static int xscale_setup_ctrs(void)
+{
+	u32 evtsel, pmnc;
+	int i;
+
+	for (i = CCNT; i < MAX_COUNTERS; i++) {
+		if (counter_config[i].event)
+			continue;
+
+		counter_config[i].event = EVT_UNUSED;
+	}
+
+	switch (pmu->id) {
+	case PMU_XSC1:
+		pmnc = (counter_config[PMN1].event << 20) | (counter_config[PMN0].event << 12);
+		pr_debug("xscale_setup_ctrs: pmnc: %#08x\n", pmnc);
+		write_pmnc(pmnc);
+		break;
+
+	case PMU_XSC2:
+		evtsel = counter_config[PMN0].event | (counter_config[PMN1].event << 8) |
+			(counter_config[PMN2].event << 16) | (counter_config[PMN3].event << 24);
+
+		pr_debug("xscale_setup_ctrs: evtsel %#08x\n", evtsel);
+		__asm__ __volatile__ ("mcr p14, 0, %0, c8, c1, 0" : : "r" (evtsel));
+		break;
+	}
+
+	for (i = CCNT; i < MAX_COUNTERS; i++) {
+		if (counter_config[i].event == EVT_UNUSED) {
+			counter_config[i].event = 0;
+			pmu->int_enable &= ~pmu->int_mask[i];
+			continue;
+		}
+
+		results[i].reset_counter = counter_config[i].count;
+		write_counter(i, -(u32)counter_config[i].count);
+		pmu->int_enable |= pmu->int_mask[i];
+		pr_debug("xscale_setup_ctrs: counter%d %#08x from %#08lx\n", i,
+			read_counter(i), counter_config[i].count);
+	}
+
+	return 0;
+}
+
+static void inline __xsc1_check_ctrs(void)
+{
+	int i;
+	u32 pmnc = read_pmnc();
+
+	/* NOTE: there's an A stepping errata that states if an overflow */
+	/*       bit already exists and another occurs, the previous     */
+	/*       Overflow bit gets cleared. There's no workaround.	 */
+	/*	 Fixed in B stepping or later			 	 */
+
+	pmnc &= ~(PMU_ENABLE | pmu->cnt_ovf[PMN0] | pmu->cnt_ovf[PMN1] |
+		pmu->cnt_ovf[CCNT]);
+	write_pmnc(pmnc);
+
+	for (i = CCNT; i <= PMN1; i++) {
+		if (!(pmu->int_mask[i] & pmu->int_enable))
+			continue;
+
+		if (pmnc & pmu->cnt_ovf[i])
+			results[i].ovf++;
+	}
+}
+
+static void inline __xsc2_check_ctrs(void)
+{
+	int i;
+	u32 flag = 0, pmnc = read_pmnc();
+
+	pmnc &= ~PMU_ENABLE;
+	write_pmnc(pmnc);
+
+	/* read overflow flag register */
+	__asm__ __volatile__ ("mrc p14, 0, %0, c5, c1, 0" : "=r" (flag));
+
+	for (i = CCNT; i <= PMN3; i++) {
+		if (!(pmu->int_mask[i] & pmu->int_enable))
+			continue;
+
+		if (flag & pmu->cnt_ovf[i])
+			results[i].ovf++;
+	}
+
+	/* writeback clears overflow bits */
+	__asm__ __volatile__ ("mcr p14, 0, %0, c5, c1, 0" : : "r" (flag));
+}
+
+static irqreturn_t xscale_pmu_interrupt(int irq, void *arg, struct pt_regs *regs)
+{
+	unsigned long eip = instruction_pointer(regs);
+	int i, is_kernel = !user_mode(regs);
+	u32 pmnc;
+
+	if (pmu->id == PMU_XSC1)
+		__xsc1_check_ctrs();
+	else
+		__xsc2_check_ctrs();
+
+	for (i = CCNT; i < MAX_COUNTERS; i++) {
+		if (!results[i].ovf)
+			continue;
+
+		write_counter(i, -(u32)results[i].reset_counter);
+		oprofile_add_sample(eip, is_kernel, i, smp_processor_id());
+		results[i].ovf--;
+	}
+
+	pmnc = read_pmnc() | PMU_ENABLE;
+	write_pmnc(pmnc);
+
+	return IRQ_HANDLED;
+}
+
+static void xscale_pmu_stop(void)
+{
+	u32 pmnc = read_pmnc();
+
+	pmnc &= ~PMU_ENABLE;
+	write_pmnc(pmnc);
+
+	free_irq(XSCALE_PMU_IRQ, results);
+}
+
+static int xscale_pmu_start(void)
+{
+	int ret;
+	u32 pmnc = read_pmnc();
+
+	ret = request_irq(XSCALE_PMU_IRQ, xscale_pmu_interrupt, SA_INTERRUPT,
+			"XScale PMU", (void *)results);
+
+	if (ret < 0) {
+		printk(KERN_ERR "oprofile: unable to request IRQ%d for XScale PMU\n",
+			XSCALE_PMU_IRQ);
+		return ret;
+	}
+
+	if (pmu->id == PMU_XSC1)
+		pmnc |= pmu->int_enable;
+	else
+		__asm__ __volatile__ ("mcr p14, 0, %0, c4, c1, 0" : : "r" (pmu->int_enable));
+
+	pmnc |= PMU_ENABLE;
+	write_pmnc(pmnc);
+	pr_debug("xscale_pmu_start: pmnc: %#08x mask: %08x\n", pmnc, pmu->int_enable);
+	return 0;
+}
+
+static int xscale_detect_pmu(void)
+{
+	int ret = 0;
+	u32 id;
+
+	__asm__ __volatile__ ("mrc p15, 0, %0, c0, c0, 0" : "=r" (id));
+	id = (id >> 13) & 0x7;
+
+	switch (id) {
+	case 1:
+		pmu = &pmu_parms[PMU_XSC1];
+		break;
+	case 2:
+		pmu = &pmu_parms[PMU_XSC2];
+		break;
+	default:
+		ret = -ENODEV;
+		break;
+	}
+
+	if (!ret) {
+		op_xscale_spec.name = pmu->name;
+		op_xscale_spec.num_counters = pmu->num_counters;
+		pr_debug("xscale_detect_pmu: detected %s PMU\n", pmu->name);
+	}
+
+	return ret;
+}
+
+struct op_arm_model_spec op_xscale_spec = {
+	.init		= xscale_detect_pmu,
+	.setup_ctrs	= xscale_setup_ctrs,
+	.start		= xscale_pmu_start,
+	.stop		= xscale_pmu_stop,
+};
+
--- diff/arch/h8300/platform/h8300h/ptrace_h8300h.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/h8300/platform/h8300h/ptrace_h8300h.c	2004-04-21 10:45:33.413623856 +0100
@@ -0,0 +1,282 @@
+/*
+ *  linux/arch/h8300/platform/h8300h/ptrace_h8300h.c
+ *    ptrace cpu depend helper functions
+ *
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ * This file is subject to the terms and conditions of the GNU General
+ * Public License.  See the file COPYING in the main directory of
+ * this archive for more details.
+ */
+
+#include <linux/linkage.h>
+#include <linux/sched.h>
+#include <asm/ptrace.h>
+
+#define CCR_MASK 0x6f    /* mode/imask not set */
+#define BREAKINST 0x5730 /* trapa #3 */
+
+/* Mapping from PT_xxx to the stack offset at which the register is
+   saved.  Notice that usp has no stack-slot and needs to be treated
+   specially (see get_reg/put_reg below). */
+static const int h8300_register_offset[] = {
+	PT_REG(er1), PT_REG(er2), PT_REG(er3), PT_REG(er4),
+	PT_REG(er5), PT_REG(er6), PT_REG(er0), PT_REG(orig_er0),
+	PT_REG(ccr), PT_REG(pc)
+};
+
+/* read register */
+long h8300_get_reg(struct task_struct *task, int regno)
+{
+	switch (regno) {
+	case PT_USP:
+		return task->thread.usp + sizeof(long)*2;
+	case PT_CCR:
+	    return *(unsigned short *)(task->thread.esp0 + h8300_register_offset[regno]);
+	default:
+	    return *(unsigned long *)(task->thread.esp0 + h8300_register_offset[regno]);
+	}
+}
+
+/* write register */
+int h8300_put_reg(struct task_struct *task, int regno, unsigned long data)
+{
+	unsigned short oldccr;
+	switch (regno) {
+	case PT_USP:
+		task->thread.usp = data - sizeof(long)*2;
+	case PT_CCR:
+		oldccr = *(unsigned short *)(task->thread.esp0 + h8300_register_offset[regno]);
+		oldccr &= ~CCR_MASK;
+		data &= CCR_MASK;
+		data |= oldccr;
+		*(unsigned short *)(task->thread.esp0 + h8300_register_offset[regno]) = data;
+		break;
+	default:
+		*(unsigned long *)(task->thread.esp0 + h8300_register_offset[regno]) = data;
+		break;
+	}
+	return 0;
+}
+
+/* disable singlestep */
+void h8300_disable_trace(struct task_struct *child)
+{
+	if((long)child->thread.breakinfo.addr != -1L) {
+		*child->thread.breakinfo.addr = child->thread.breakinfo.inst;
+		child->thread.breakinfo.addr = (unsigned short *)-1L;
+	}
+}
+
+/* calculate next pc */
+enum jump_type {none,    /* normal instruction */
+		jabs,    /* absolute address jump */
+		ind,     /* indirect address jump */
+		ret,     /* return to subrutine */
+		reg,     /* register indexed jump */
+		relb,    /* pc relative jump (byte offset) */
+		relw,    /* pc relative jump (word offset) */
+               };
+
+/* opcode decode table define
+   ptn: opcode pattern
+   msk: opcode bitmask
+   len: instruction length (<0 next table index)
+   jmp: jump operation mode */
+struct optable {
+	unsigned char bitpattern;
+	unsigned char bitmask;
+	signed char length;
+	signed char type;
+} __attribute__((aligned(1),packed));
+
+#define OPTABLE(ptn,msk,len,jmp)   \
+        {                          \
+		.bitpattern = ptn, \
+		.bitmask    = msk, \
+		.length	    = len, \
+		.type       = jmp, \
+	}
+
+const static struct optable optable_0[] = {
+	OPTABLE(0x00,0xff, 1,none), /* 0x00 */
+	OPTABLE(0x01,0xff,-1,none), /* 0x01 */
+	OPTABLE(0x02,0xfe, 1,none), /* 0x02-0x03 */
+	OPTABLE(0x04,0xee, 1,none), /* 0x04-0x05/0x14-0x15 */
+	OPTABLE(0x06,0xfe, 1,none), /* 0x06-0x07 */
+	OPTABLE(0x08,0xea, 1,none), /* 0x08-0x09/0x0c-0x0d/0x18-0x19/0x1c-0x1d */
+	OPTABLE(0x0a,0xee, 1,none), /* 0x0a-0x0b/0x1a-0x1b */
+	OPTABLE(0x0e,0xee, 1,none), /* 0x0e-0x0f/0x1e-0x1f */
+	OPTABLE(0x10,0xfc, 1,none), /* 0x10-0x13 */
+	OPTABLE(0x16,0xfe, 1,none), /* 0x16-0x17 */
+	OPTABLE(0x20,0xe0, 1,none), /* 0x20-0x3f */
+	OPTABLE(0x40,0xf0, 1,relb), /* 0x40-0x4f */
+	OPTABLE(0x50,0xfc, 1,none), /* 0x50-0x53 */
+	OPTABLE(0x54,0xfd, 1,ret ), /* 0x54/0x56 */
+	OPTABLE(0x55,0xff, 1,relb), /* 0x55 */
+	OPTABLE(0x57,0xff, 1,none), /* 0x57 */
+	OPTABLE(0x58,0xfb, 2,relw), /* 0x58/0x5c */
+	OPTABLE(0x59,0xfb, 1,reg ), /* 0x59/0x5b */
+	OPTABLE(0x5a,0xfb, 2,jabs), /* 0x5a/0x5e */
+	OPTABLE(0x5b,0xfb, 2,ind ), /* 0x5b/0x5f */
+	OPTABLE(0x60,0xe8, 1,none), /* 0x60-0x67/0x70-0x77 */
+	OPTABLE(0x68,0xfa, 1,none), /* 0x68-0x69/0x6c-0x6d */
+	OPTABLE(0x6a,0xfe,-2,none), /* 0x6a-0x6b */
+	OPTABLE(0x6e,0xfe, 2,none), /* 0x6e-0x6f */
+	OPTABLE(0x78,0xff, 4,none), /* 0x78 */
+	OPTABLE(0x79,0xff, 2,none), /* 0x79 */
+	OPTABLE(0x7a,0xff, 3,none), /* 0x7a */
+	OPTABLE(0x7b,0xff, 2,none), /* 0x7b */
+	OPTABLE(0x7c,0xfc, 2,none), /* 0x7c-0x7f */
+	OPTABLE(0x80,0x80, 1,none), /* 0x80-0xff */
+};
+
+const static struct optable optable_1[] = {
+	OPTABLE(0x00,0xff,-3,none), /* 0x0100 */
+	OPTABLE(0x40,0xf0,-3,none), /* 0x0140-0x14f */
+	OPTABLE(0x80,0xf0, 1,none), /* 0x0180-0x018f */
+	OPTABLE(0xc0,0xc0, 2,none), /* 0x01c0-0x01ff */
+};
+
+const static struct optable optable_2[] = {
+	OPTABLE(0x00,0x20, 2,none), /* 0x6a0?/0x6a8?/0x6b0?/0x6b8? */
+	OPTABLE(0x20,0x20, 3,none), /* 0x6a2?/0x6aa?/0x6b2?/0x6ba? */
+};
+
+const static struct optable optable_3[] = {
+	OPTABLE(0x69,0xfb, 2,none), /* 0x010069/0x01006d/014069/0x01406d */
+	OPTABLE(0x6b,0xff,-4,none), /* 0x01006b/0x01406b */
+	OPTABLE(0x6f,0xff, 3,none), /* 0x01006f/0x01406f */
+	OPTABLE(0x78,0xff, 5,none), /* 0x010078/0x014078 */
+};
+
+const static struct optable optable_4[] = {
+	OPTABLE(0x00,0x78, 3,none), /* 0x0100690?/0x01006d0?/0140690/0x01406d0?/0x0100698?/0x01006d8?/0140698?/0x01406d8? */
+	OPTABLE(0x20,0x78, 4,none), /* 0x0100692?/0x01006d2?/0140692/0x01406d2?/0x010069a?/0x01006da?/014069a?/0x01406da? */
+};
+
+const static struct optables_list {
+	const struct optable *ptr;
+	int size;
+} optables[] = {
+#define OPTABLES(no)                                                   \
+        {                                                              \
+		.ptr  = optable_##no,                                  \
+		.size = sizeof(optable_##no) / sizeof(struct optable), \
+	}
+	OPTABLES(0),
+	OPTABLES(1),
+	OPTABLES(2),
+	OPTABLES(3),
+	OPTABLES(4),
+
+};
+
+const unsigned char condmask[] = {
+	0x00,0x40,0x01,0x04,0x02,0x08,0x10,0x20
+};
+
+static int isbranch(struct task_struct *task,int reson)
+{
+	unsigned char cond = h8300_get_reg(task, PT_CCR);
+	/* encode complex conditions */
+	/* B4: N^V
+	   B5: Z|(N^V)
+	   B6: C|Z */
+	__asm__("bld #3,%w0\n\t"
+		"bxor #1,%w0\n\t"
+		"bst #4,%w0\n\t"
+		"bor #2,%w0\n\t"
+		"bst #5,%w0\n\t"
+		"bld #2,%w0\n\t"
+		"bor #0,%w0\n\t"
+		"bst #6,%w0\n\t"
+		:"=&r"(cond)::"cc");
+	cond &= condmask[reson >> 1];
+	if (!(reson & 1))
+		return cond == 0;
+	else
+		return cond != 0;
+}
+
+static unsigned short *getnextpc(struct task_struct *child, unsigned short *pc)
+{
+	const struct optable *op;
+	unsigned char *fetch_p;
+	unsigned char inst;
+	unsigned long addr;
+	unsigned long *sp;
+	int op_len,regno;
+	op = optables[0].ptr;
+	op_len = optables[0].size;
+	fetch_p = (unsigned char *)pc;
+	inst = *fetch_p++;
+	do {
+		if ((inst & op->bitmask) == op->bitpattern) {
+			if (op->length < 0) {
+				op = optables[-op->length].ptr;
+				op_len = optables[-op->length].size + 1;
+				inst = *fetch_p++;
+			} else {
+				switch (op->type) {
+				case none:
+					return pc + op->length;
+				case jabs:
+					addr = *(unsigned long *)pc;
+					return (unsigned short *)(addr & 0x00ffffff);
+				case ind:
+					addr = *pc & 0xff;
+					return (unsigned short *)(*(unsigned long *)addr);
+				case ret:
+					sp = (unsigned long *)h8300_get_reg(child, PT_USP);
+					/* user stack frames
+					   |   er0  | temporary saved
+					   +--------+
+					   |   exp  | exception stack frames
+					   +--------+
+					   | ret pc | userspace return address
+					*/
+					return (unsigned short *)(*(sp+2) & 0x00ffffff);
+				case reg:
+					regno = (*pc >> 4) & 0x07;
+					if (regno == 0)
+						addr = h8300_get_reg(child, PT_ER0);
+					else
+						addr = h8300_get_reg(child, regno-1+PT_ER1);
+					return (unsigned short *)addr;
+				case relb:
+					if ((inst = 0x55) || isbranch(child,inst & 0x0f))
+						(unsigned char *)pc += (signed char)(*fetch_p);
+					return pc+1; /* skip myself */
+				case relw:
+					if ((inst = 0x5c) || isbranch(child,(*fetch_p & 0xf0) >> 4))
+						(unsigned char *)pc += (signed short)(*(pc+1));
+					return pc+2; /* skip myself */
+				}
+			}
+		} else
+			op++;
+	} while(--op_len > 0);
+	return NULL;
+}
+
+/* Set breakpoint(s) to simulate a single step from the current PC.  */
+
+void h8300_enable_trace(struct task_struct *child)
+{
+	unsigned short *nextpc;
+	nextpc = getnextpc(child,(unsigned short *)h8300_get_reg(child, PT_PC));
+	child->thread.breakinfo.addr = nextpc;
+	child->thread.breakinfo.inst = *nextpc;
+	*nextpc = BREAKINST;
+}
+
+asmlinkage void trace_trap(unsigned long bp)
+{
+	if ((unsigned long)current->thread.breakinfo.addr == bp) {
+		h8300_disable_trace(current);
+		force_sig(SIGTRAP,current);
+	} else
+	        force_sig(SIGILL,current);
+}
+
--- diff/arch/h8300/platform/h8s/ptrace_h8s.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/h8300/platform/h8s/ptrace_h8s.c	2004-04-21 10:45:33.414623704 +0100
@@ -0,0 +1,84 @@
+/*
+ *  linux/arch/h8300/platform/h8s/ptrace_h8s.c
+ *    ptrace cpu depend helper functions
+ *
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ * This file is subject to the terms and conditions of the GNU General
+ * Public License.  See the file COPYING in the main directory of
+ * this archive for more details.
+ */
+
+#include <linux/linkage.h>
+#include <linux/sched.h>
+#include <linux/errno.h>
+#include <asm/ptrace.h>
+
+#define CCR_MASK  0x6f
+#define EXR_TRACE 0x80
+
+/* Mapping from PT_xxx to the stack offset at which the register is
+   saved.  Notice that usp has no stack-slot and needs to be treated
+   specially (see get_reg/put_reg below). */
+static const int h8300_register_offset[] = {
+	PT_REG(er1), PT_REG(er2), PT_REG(er3), PT_REG(er4),
+	PT_REG(er5), PT_REG(er6), PT_REG(er0), PT_REG(orig_er0),
+	PT_REG(ccr), PT_REG(pc), PT_REG(exr)
+};
+
+/* read register */
+long h8300_get_reg(struct task_struct *task, int regno)
+{
+	switch (regno) {
+	case PT_USP:
+		return task->thread.usp + sizeof(long)*2 + 2;
+	case PT_CCR:
+	case PT_EXR:
+	    return *(unsigned short *)(task->thread.esp0 + h8300_register_offset[regno]);
+	default:
+	    return *(unsigned long *)(task->thread.esp0 + h8300_register_offset[regno]);
+	}
+}
+
+/* write register */
+int h8300_put_reg(struct task_struct *task, int regno, unsigned long data)
+{
+	unsigned short oldccr;
+	switch (regno) {
+	case PT_USP:
+		task->thread.usp = data - sizeof(long)*2 - 2;
+	case PT_CCR:
+		oldccr = *(unsigned short *)(task->thread.esp0 + h8300_register_offset[regno]);
+		oldccr &= ~CCR_MASK;
+		data &= CCR_MASK;
+		data |= oldccr;
+		*(unsigned short *)(task->thread.esp0 + h8300_register_offset[regno]) = data;
+		break;
+	case PT_EXR:
+		/* exr modify not support */
+		return -EIO;
+	default:
+		*(unsigned long *)(task->thread.esp0 + h8300_register_offset[regno]) = data;
+		break;
+	}
+	return 0;
+}
+
+/* disable singlestep */
+void h8300_disable_trace(struct task_struct *child)
+{
+	*(unsigned short *)(child->thread.esp0 + h8300_register_offset[PT_EXR]) &= ~EXR_TRACE;
+}
+
+/* enable singlestep */
+void h8300_enable_trace(struct task_struct *child)
+{
+	*(unsigned short *)(child->thread.esp0 + h8300_register_offset[PT_EXR]) |= EXR_TRACE;
+}
+
+asmlinkage void trace_trap(unsigned long bp)
+{
+	(void)bp;
+	force_sig(SIGTRAP,current);
+}
+
--- diff/arch/i386/kernel/std_resources.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/i386/kernel/std_resources.c	2004-04-21 10:45:33.485612912 +0100
@@ -0,0 +1,204 @@
+/*
+ *  Machine specific resource allocation for generic.
+ */
+
+#include <linux/ioport.h>
+#include <asm/io.h>
+#include <asm/std_resources.h>
+
+#define romsignature(x) (*(unsigned short *)(x) == 0xaa55)
+
+static struct resource system_rom_resource = {
+	.name	= "System ROM",
+	.start	= 0xf0000,
+	.end	= 0xfffff,
+	.flags	= IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
+};
+
+static struct resource extension_rom_resource = {
+	.name	= "Extension ROM",
+	.start	= 0xe0000,
+	.end	= 0xeffff,
+	.flags	= IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
+};
+
+static struct resource adapter_rom_resources[] = { {
+	.name 	= "Adapter ROM",
+	.start	= 0xc8000,
+	.end	= 0,
+	.flags	= IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
+}, {
+	.name 	= "Adapter ROM",
+	.start	= 0,
+	.end	= 0,
+	.flags	= IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
+}, {
+	.name 	= "Adapter ROM",
+	.start	= 0,
+	.end	= 0,
+	.flags	= IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
+}, {
+	.name 	= "Adapter ROM",
+	.start	= 0,
+	.end	= 0,
+	.flags	= IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
+}, {
+	.name 	= "Adapter ROM",
+	.start	= 0,
+	.end	= 0,
+	.flags	= IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
+}, {
+	.name 	= "Adapter ROM",
+	.start	= 0,
+	.end	= 0,
+	.flags	= IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
+} };
+
+#define ADAPTER_ROM_RESOURCES \
+	(sizeof adapter_rom_resources / sizeof adapter_rom_resources[0])
+
+static struct resource video_rom_resource = {
+	.name 	= "Video ROM",
+	.start	= 0xc0000,
+	.end	= 0xc7fff,
+	.flags	= IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
+};
+
+static struct resource vram_resource = {
+	.name	= "Video RAM area",
+	.start	= 0xa0000,
+	.end	= 0xbffff,
+	.flags	= IORESOURCE_BUSY | IORESOURCE_MEM
+};
+
+static struct resource standard_io_resources[] = { {
+	.name	= "dma1",
+	.start	= 0x0000,
+	.end	= 0x001f,
+	.flags	= IORESOURCE_BUSY | IORESOURCE_IO
+}, {
+	.name	= "pic1",
+	.start	= 0x0020,
+	.end	= 0x0021,
+	.flags	= IORESOURCE_BUSY | IORESOURCE_IO
+}, {
+	.name	= "timer",
+	.start	= 0x0040,
+	.end	= 0x005f,
+	.flags	= IORESOURCE_BUSY | IORESOURCE_IO
+}, {
+	.name	= "keyboard",
+	.start	= 0x0060,
+	.end	= 0x006f,
+	.flags	= IORESOURCE_BUSY | IORESOURCE_IO
+}, {
+	.name	= "dma page reg",
+	.start	= 0x0080,
+	.end	= 0x008f,
+	.flags	= IORESOURCE_BUSY | IORESOURCE_IO
+}, {
+	.name	= "pic2",
+	.start	= 0x00a0,
+	.end	= 0x00a1,
+	.flags	= IORESOURCE_BUSY | IORESOURCE_IO
+}, {
+	.name	= "dma2",
+	.start	= 0x00c0,
+	.end	= 0x00df,
+	.flags	= IORESOURCE_BUSY | IORESOURCE_IO
+}, {
+	.name	= "fpu",
+	.start	= 0x00f0,
+	.end	= 0x00ff,
+	.flags	= IORESOURCE_BUSY | IORESOURCE_IO
+} };
+
+#define STANDARD_IO_RESOURCES \
+	(sizeof standard_io_resources / sizeof standard_io_resources[0])
+
+static int __init checksum(unsigned char *rom, unsigned long length)
+{
+	unsigned char *p, sum = 0;
+
+	for (p = rom; p < rom + length; p++)
+		sum += *p;
+	return sum == 0;
+}
+
+void __init probe_roms(void)
+{
+	unsigned long start, length, upper;
+	unsigned char *rom;
+	int	      i;
+
+	/* video rom */
+	upper = adapter_rom_resources[0].start;
+	for (start = video_rom_resource.start; start < upper; start += 2048) {
+		rom = isa_bus_to_virt(start);
+		if (!romsignature(rom))
+			continue;
+
+		video_rom_resource.start = start;
+
+		/* 0 < length <= 0x7f * 512, historically */
+		length = rom[2] * 512;
+
+		/* if checksum okay, trust length byte */
+		if (length && checksum(rom, length))
+			video_rom_resource.end = start + length - 1;
+
+		request_resource(&iomem_resource, &video_rom_resource);
+		break;
+	}
+
+	start = (video_rom_resource.end + 1 + 2047) & ~2047UL;
+	if (start < upper)
+		start = upper;
+
+	/* system rom */
+	request_resource(&iomem_resource, &system_rom_resource);
+	upper = system_rom_resource.start;
+
+	/* check for extension rom (ignore length byte!) */
+	rom = isa_bus_to_virt(extension_rom_resource.start);
+	if (romsignature(rom)) {
+		length = extension_rom_resource.end - extension_rom_resource.start + 1;
+		if (checksum(rom, length)) {
+			request_resource(&iomem_resource, &extension_rom_resource);
+			upper = extension_rom_resource.start;
+		}
+	}
+
+	/* check for adapter roms on 2k boundaries */
+	for (i = 0; i < ADAPTER_ROM_RESOURCES && start < upper; start += 2048) {
+		rom = isa_bus_to_virt(start);
+		if (!romsignature(rom))
+			continue;
+
+		/* 0 < length <= 0x7f * 512, historically */
+		length = rom[2] * 512;
+
+		/* but accept any length that fits if checksum okay */
+		if (!length || start + length > upper || !checksum(rom, length))
+			continue;
+
+		adapter_rom_resources[i].start = start;
+		adapter_rom_resources[i].end = start + length - 1;
+		request_resource(&iomem_resource, &adapter_rom_resources[i]);
+
+		start = adapter_rom_resources[i++].end & ~2047UL;
+	}
+}
+
+void __init request_graphics_resource(void)
+{
+	request_resource(&iomem_resource, &vram_resource);
+}
+
+void __init request_standard_io_resources(void)
+{
+	int i;
+
+	for (i = 0; i < STANDARD_IO_RESOURCES; i++)
+		request_resource(&ioport_resource, &standard_io_resources[i]);
+}
--- diff/arch/i386/mach-pc9800/std_resources.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/i386/mach-pc9800/std_resources.c	2004-04-21 10:45:33.495611392 +0100
@@ -0,0 +1,195 @@
+/*
+ *  Machine specific resource allocation for PC-9800.
+ *  Written by Osamu Tomita <tomita@cinet.co.jp>
+ */
+
+#include <linux/ioport.h>
+#include <asm/io.h>
+#include <asm/std_resources.h>
+
+static char str_pic1[] = "pic1";
+static char str_dma[] = "dma";
+static char str_pic2[] = "pic2";
+static char str_calender_clock[] = "calender clock";
+static char str_system[] = "system";
+static char str_nmi_control[] = "nmi control";
+static char str_kanji_rom[] = "kanji rom";
+static char str_keyboard[] = "keyboard";
+static char str_text_gdc[] = "text gdc";
+static char str_crtc[] = "crtc";
+static char str_timer[] = "timer";
+static char str_graphic_gdc[] = "graphic gdc";
+static char str_dma_ex_bank[] = "dma ex. bank";
+static char str_beep_freq[] = "beep freq.";
+static char str_mouse_pio[] = "mouse pio";
+struct resource standard_io_resources[] = {
+	{ str_pic1, 0x00, 0x00, IORESOURCE_BUSY },
+	{ str_dma, 0x01, 0x01, IORESOURCE_BUSY },
+	{ str_pic1, 0x02, 0x02, IORESOURCE_BUSY },
+	{ str_dma, 0x03, 0x03, IORESOURCE_BUSY },
+	{ str_dma, 0x05, 0x05, IORESOURCE_BUSY },
+	{ str_dma, 0x07, 0x07, IORESOURCE_BUSY },
+	{ str_pic2, 0x08, 0x08, IORESOURCE_BUSY },
+	{ str_dma, 0x09, 0x09, IORESOURCE_BUSY },
+	{ str_pic2, 0x0a, 0x0a, IORESOURCE_BUSY },
+	{ str_dma, 0x0b, 0x0b, IORESOURCE_BUSY },
+	{ str_dma, 0x0d, 0x0d, IORESOURCE_BUSY },
+	{ str_dma, 0x0f, 0x0f, IORESOURCE_BUSY },
+	{ str_dma, 0x11, 0x11, IORESOURCE_BUSY },
+	{ str_dma, 0x13, 0x13, IORESOURCE_BUSY },
+	{ str_dma, 0x15, 0x15, IORESOURCE_BUSY },
+	{ str_dma, 0x17, 0x17, IORESOURCE_BUSY },
+	{ str_dma, 0x19, 0x19, IORESOURCE_BUSY },
+	{ str_dma, 0x1b, 0x1b, IORESOURCE_BUSY },
+	{ str_dma, 0x1d, 0x1d, IORESOURCE_BUSY },
+	{ str_dma, 0x1f, 0x1f, IORESOURCE_BUSY },
+	{ str_calender_clock, 0x20, 0x20, 0 },
+	{ str_dma, 0x21, 0x21, IORESOURCE_BUSY },
+	{ str_calender_clock, 0x22, 0x22, 0 },
+	{ str_dma, 0x23, 0x23, IORESOURCE_BUSY },
+	{ str_dma, 0x25, 0x25, IORESOURCE_BUSY },
+	{ str_dma, 0x27, 0x27, IORESOURCE_BUSY },
+	{ str_dma, 0x29, 0x29, IORESOURCE_BUSY },
+	{ str_dma, 0x2b, 0x2b, IORESOURCE_BUSY },
+	{ str_dma, 0x2d, 0x2d, IORESOURCE_BUSY },
+	{ str_system, 0x31, 0x31, IORESOURCE_BUSY },
+	{ str_system, 0x33, 0x33, IORESOURCE_BUSY },
+	{ str_system, 0x35, 0x35, IORESOURCE_BUSY },
+	{ str_system, 0x37, 0x37, IORESOURCE_BUSY },
+	{ str_nmi_control, 0x50, 0x50, IORESOURCE_BUSY },
+	{ str_nmi_control, 0x52, 0x52, IORESOURCE_BUSY },
+	{ "time stamp", 0x5c, 0x5f, IORESOURCE_BUSY },
+	{ str_kanji_rom, 0xa1, 0xa1, IORESOURCE_BUSY },
+	{ str_kanji_rom, 0xa3, 0xa3, IORESOURCE_BUSY },
+	{ str_kanji_rom, 0xa5, 0xa5, IORESOURCE_BUSY },
+	{ str_kanji_rom, 0xa7, 0xa7, IORESOURCE_BUSY },
+	{ str_kanji_rom, 0xa9, 0xa9, IORESOURCE_BUSY },
+	{ str_keyboard, 0x41, 0x41, IORESOURCE_BUSY },
+	{ str_keyboard, 0x43, 0x43, IORESOURCE_BUSY },
+	{ str_text_gdc, 0x60, 0x60, IORESOURCE_BUSY },
+	{ str_text_gdc, 0x62, 0x62, IORESOURCE_BUSY },
+	{ str_text_gdc, 0x64, 0x64, IORESOURCE_BUSY },
+	{ str_text_gdc, 0x66, 0x66, IORESOURCE_BUSY },
+	{ str_text_gdc, 0x68, 0x68, IORESOURCE_BUSY },
+	{ str_text_gdc, 0x6a, 0x6a, IORESOURCE_BUSY },
+	{ str_text_gdc, 0x6c, 0x6c, IORESOURCE_BUSY },
+	{ str_text_gdc, 0x6e, 0x6e, IORESOURCE_BUSY },
+	{ str_crtc, 0x70, 0x70, IORESOURCE_BUSY },
+	{ str_crtc, 0x72, 0x72, IORESOURCE_BUSY },
+	{ str_crtc, 0x74, 0x74, IORESOURCE_BUSY },
+	{ str_crtc, 0x74, 0x74, IORESOURCE_BUSY },
+	{ str_crtc, 0x76, 0x76, IORESOURCE_BUSY },
+	{ str_crtc, 0x78, 0x78, IORESOURCE_BUSY },
+	{ str_crtc, 0x7a, 0x7a, IORESOURCE_BUSY },
+	{ str_timer, 0x71, 0x71, IORESOURCE_BUSY },
+	{ str_timer, 0x73, 0x73, IORESOURCE_BUSY },
+	{ str_timer, 0x75, 0x75, IORESOURCE_BUSY },
+	{ str_timer, 0x77, 0x77, IORESOURCE_BUSY },
+	{ str_graphic_gdc, 0xa0, 0xa0, IORESOURCE_BUSY },
+	{ str_graphic_gdc, 0xa2, 0xa2, IORESOURCE_BUSY },
+	{ str_graphic_gdc, 0xa4, 0xa4, IORESOURCE_BUSY },
+	{ str_graphic_gdc, 0xa6, 0xa6, IORESOURCE_BUSY },
+	{ "cpu", 0xf0, 0xf7, IORESOURCE_BUSY },
+	{ "fpu", 0xf8, 0xff, IORESOURCE_BUSY },
+	{ str_dma_ex_bank, 0x0e05, 0x0e05, 0 },
+	{ str_dma_ex_bank, 0x0e07, 0x0e07, 0 },
+	{ str_dma_ex_bank, 0x0e09, 0x0e09, 0 },
+	{ str_dma_ex_bank, 0x0e0b, 0x0e0b, 0 },
+	{ str_beep_freq, 0x3fd9, 0x3fd9, IORESOURCE_BUSY },
+	{ str_beep_freq, 0x3fdb, 0x3fdb, IORESOURCE_BUSY },
+	{ str_beep_freq, 0x3fdd, 0x3fdd, IORESOURCE_BUSY },
+	{ str_beep_freq, 0x3fdf, 0x3fdf, IORESOURCE_BUSY },
+	/* All PC-9800 have (exactly) one mouse interface.  */
+	{ str_mouse_pio, 0x7fd9, 0x7fd9, 0 },
+	{ str_mouse_pio, 0x7fdb, 0x7fdb, 0 },
+	{ str_mouse_pio, 0x7fdd, 0x7fdd, 0 },
+	{ str_mouse_pio, 0x7fdf, 0x7fdf, 0 },
+	{ "mouse timer", 0xbfdb, 0xbfdb, 0 },
+	{ "mouse irq", 0x98d7, 0x98d7, 0 },
+};
+
+#define STANDARD_IO_RESOURCES (sizeof(standard_io_resources)/sizeof(struct resource))
+
+static struct resource tvram_resource = { "Text VRAM/CG window", 0xa0000, 0xa4fff, IORESOURCE_BUSY };
+static struct resource gvram_brg_resource = { "Graphic VRAM (B/R/G)", 0xa8000, 0xbffff, IORESOURCE_BUSY };
+static struct resource gvram_e_resource = { "Graphic VRAM (E)", 0xe0000, 0xe7fff, IORESOURCE_BUSY };
+
+/* System ROM resources */
+#define MAXROMS 6
+static struct resource rom_resources[MAXROMS] = {
+	{ "System ROM", 0xe8000, 0xfffff, IORESOURCE_BUSY }
+};
+
+void __init probe_roms(void)
+{
+	int i;
+	__u8 *xrom_id;
+	int roms = 1;
+
+	request_resource(&iomem_resource, rom_resources+0);
+
+	xrom_id = (__u8 *) isa_bus_to_virt(PC9800SCA_XROM_ID + 0x10);
+
+	for (i = 0; i < 16; i++) {
+		if (xrom_id[i] & 0x80) {
+			int j;
+
+			for (j = i + 1; j < 16 && (xrom_id[j] & 0x80); j++)
+				;
+			rom_resources[roms].start = 0x0d0000 + i * 0x001000;
+			rom_resources[roms].end = 0x0d0000 + j * 0x001000 - 1;
+			rom_resources[roms].name = "Extension ROM";
+			rom_resources[roms].flags = IORESOURCE_BUSY;
+
+			request_resource(&iomem_resource,
+					  rom_resources + roms);
+			if (++roms >= MAXROMS)
+				return;
+		}
+	}
+}
+
+void __init request_graphics_resource(void)
+{
+	int i;
+
+	if (PC9800_HIGHRESO_P()) {
+		tvram_resource.start = 0xe0000;
+		tvram_resource.end   = 0xe4fff;
+		gvram_brg_resource.name  = "Graphic VRAM";
+		gvram_brg_resource.start = 0xc0000;
+		gvram_brg_resource.end   = 0xdffff;
+	}
+
+	request_resource(&iomem_resource, &tvram_resource);
+	request_resource(&iomem_resource, &gvram_brg_resource);
+	if (!PC9800_HIGHRESO_P())
+		request_resource(&iomem_resource, &gvram_e_resource);
+
+	if (PC9800_HIGHRESO_P() || PC9800_9821_P()) {
+		static char graphics[] = "graphics";
+		static struct resource graphics_resources[] = {
+			{ graphics, 0x9a0, 0x9a0, 0 },
+			{ graphics, 0x9a2, 0x9a2, 0 },
+			{ graphics, 0x9a4, 0x9a4, 0 },
+			{ graphics, 0x9a6, 0x9a6, 0 },
+			{ graphics, 0x9a8, 0x9a8, 0 },
+			{ graphics, 0x9aa, 0x9aa, 0 },
+			{ graphics, 0x9ac, 0x9ac, 0 },
+			{ graphics, 0x9ae, 0x9ae, 0 },
+		};
+
+#define GRAPHICS_RESOURCES (sizeof(graphics_resources)/sizeof(struct resource))
+
+		for (i = 0; i < GRAPHICS_RESOURCES; i++)
+			request_resource(&ioport_resource, graphics_resources + i);
+	}
+}
+
+void __init request_standard_io_resources(void)
+{
+	int i;
+
+	for (i = 0; i < STANDARD_IO_RESOURCES; i++)
+		request_resource(&ioport_resource, standard_io_resources+i);
+}
--- diff/arch/m68knommu/kernel/dma.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/m68knommu/kernel/dma.c	2004-04-21 10:45:33.573599536 +0100
@@ -0,0 +1,36 @@
+/*
+ * Dynamic DMA mapping support.
+ *
+ * We never have any address translations to worry about, so this
+ * is just alloc/free.
+ */
+
+#include <linux/types.h>
+#include <linux/mm.h>
+#include <linux/string.h>
+#include <linux/pci.h>
+#include <asm/io.h>
+
+void *dma_alloc_coherent(struct device *dev, size_t size,
+			   dma_addr_t *dma_handle, int gfp)
+{
+	void *ret;
+	/* ignore region specifiers */
+	gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);
+
+	if (dev == NULL || (*dev->dma_mask < 0xffffffff))
+		gfp |= GFP_DMA;
+	ret = (void *)__get_free_pages(gfp, get_order(size));
+
+	if (ret != NULL) {
+		memset(ret, 0, size);
+		*dma_handle = virt_to_phys(ret);
+	}
+	return ret;
+}
+
+void dma_free_coherent(struct device *dev, size_t size,
+			 void *vaddr, dma_addr_t dma_handle)
+{
+	free_pages((unsigned long)vaddr, get_order(size));
+}
--- diff/arch/m68knommu/platform/5272/senTec/crt0_ram.S	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/m68knommu/platform/5272/senTec/crt0_ram.S	2004-04-21 10:45:33.581598320 +0100
@@ -0,0 +1,159 @@
+/*****************************************************************************/
+
+/*
+ *	crt0_ram.S -- startup code for MCF5272 ColdFire based boards.
+ *
+ *	(C) Copyright 1999-2002, Greg Ungerer (gerg@snapgear.com).
+ *	(C) Copyright 2000, Lineo (www.lineo.com).
+ */
+
+/*****************************************************************************/
+
+#include <linux/config.h>
+#include <linux/threads.h>
+#include <linux/linkage.h>
+#include <asm/segment.h>
+#include <asm/coldfire.h>
+#include <asm/mcfsim.h>
+
+/*****************************************************************************/
+
+/*
+ *	senTec COBRA5272 board, chip select and memory setup.
+ */
+
+#define	MEM_BASE	0x00000000	/* Memory base at address 0 */
+#define	VBR_BASE	MEM_BASE	/* Vector address */
+
+#if defined(CONFIG_RAM16MB)
+#define	MEM_SIZE	0x01000000	/* Memory size 16Mb */
+#elif defined(CONFIG_RAM8MB)
+#define	MEM_SIZE	0x00800000	/* Memory size 8Mb */
+#else
+#define	MEM_SIZE	0x00400000	/* Memory size 4Mb */
+#endif
+
+/*****************************************************************************/
+
+.global	_start
+.global _rambase
+.global _ramvec
+.global	_ramstart
+.global	_ramend
+
+/*****************************************************************************/
+
+.data
+
+/*
+ *	Set up the usable of RAM stuff. Size of RAM is determined then
+ *	an initial stack set up at the end.
+ */
+_rambase:
+.long	0
+_ramvec:
+.long	0
+_ramstart:
+.long	0
+_ramend:
+.long	0
+
+/*****************************************************************************/
+
+.text
+
+/*
+ *	This is the codes first entry point. This is where it all
+ *	begins...
+ */
+
+_start:
+	nop					/* Filler */
+	move.w	#0x2700, %sr			/* No interrupts */
+
+	/*
+	 * Setup VBR here, otherwise buserror remap will not work.
+	 * if dBug was active before (on my SBC with dBug 1.1 of Dec 16 1996)
+	 *
+	 * bkr@cut.de 19990306
+	 *
+	 * Note: this is because dBUG points VBR to ROM, making vectors read
+	 * only, so the bus trap can't be changed. (RS)
+	 */
+	move.l	#VBR_BASE, %a7			/* Note VBR can't be read */
+	movec   %a7, %VBR
+	move.l	%a7, _ramvec			/* Set up vector addr */
+	move.l	%a7, _rambase			/* Set up base RAM addr */
+
+
+	/*
+	 *	Set memory size.
+	 */
+	move.l	#MEM_SIZE, %a0
+
+	move.l	%a0, %d0			/* Mem end addr is in a0 */
+	move.l	%d0, %sp			/* Set up initial stack ptr */
+	move.l	%d0, _ramend			/* Set end ram addr */
+
+	/*
+	 *	Enable CPU internal cache.
+	 */
+	move.l	#0x01000000, %d0		/* Invalidate cache cmd */
+	movec	%d0, %CACR			/* Invalidate cache */
+	move.l	#0x80000100, %d0		/* Setup cache mask */
+	movec	%d0, %CACR			/* Enable cache */
+
+#ifdef CONFIG_ROMFS_FS
+	/*
+	 *	Move ROM filesystem above bss :-)
+	 */
+	lea.l	_sbss, %a0			/* Get start of bss */
+	lea.l	_ebss, %a1			/* Set up destination  */
+	move.l	%a0, %a2			/* Copy of bss start */
+
+	move.l	8(%a0), %d0			/* Get size of ROMFS */
+	addq.l	#8, %d0				/* Allow for rounding */
+	and.l	#0xfffffffc, %d0		/* Whole words */
+
+	add.l	%d0, %a0			/* Copy from end */
+	add.l	%d0, %a1			/* Copy from end */
+	move.l	%a1, _ramstart			/* Set start of ram */
+
+_copy_romfs:
+	move.l	-(%a0), %d0			/* Copy dword */
+	move.l	%d0, -(%a1)
+	cmp.l	%a0, %a2			/* Check if at end */
+	bne	_copy_romfs
+
+#else /* CONFIG_ROMFS_FS */
+	lea.l	_ebss, %a1
+	move.l	%a1, _ramstart
+#endif /* CONFIG_ROMFS_FS */
+
+
+	/*
+	 *	Zero out the bss region.
+	 */
+	lea.l	_sbss, %a0			/* Get start of bss */
+	lea.l	_ebss, %a1			/* Get end of bss */
+	clr.l	%d0				/* Set value */
+_clear_bss:
+	move.l	%d0, (%a0)+			/* Clear each word */
+	cmp.l	%a0, %a1			/* Check if at end */
+	bne	_clear_bss
+
+	/*
+	 *	Load the current thread pointer and stack.
+	 */
+	lea	init_thread_union, %a0
+	lea	0x2000(%a0), %sp
+
+	/*
+	 *	Assember start up done, start code proper.
+	 */
+	jsr	start_kernel			/* Start Linux kernel */
+
+_exit:
+	jmp	_exit				/* Should never get here */
+
+/*****************************************************************************/
--- diff/arch/m68knommu/platform/5282/senTec/crt0_ram.S	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/m68knommu/platform/5282/senTec/crt0_ram.S	2004-04-21 10:45:33.582598168 +0100
@@ -0,0 +1,180 @@
+/*****************************************************************************/
+
+/*
+ *	crt0_ram.S -- startup code for MCF5282 ColdFire based boards.
+ *
+ *	(C) Copyright 2003, Greg Ungerer (gerg@snapgear.com).
+ */
+
+/*****************************************************************************/
+
+#include <linux/config.h>
+#include <linux/threads.h>
+#include <linux/linkage.h>
+#include <asm/segment.h>
+#include <asm/coldfire.h>
+#include <asm/mcfsim.h>
+
+/*****************************************************************************/
+
+/*
+ *	senTec COBRA5282 board, chip select and memory setup.
+ */
+
+#define	MEM_BASE	0x00000000	/* Memory base at address 0 */
+#define	VBR_BASE	MEM_BASE	/* Vector address */
+
+#if defined(CONFIG_RAM16MB)
+#define	MEM_SIZE	0x01000000	/* Memory size 16Mb */
+#elif defined(CONFIG_RAM8MB)
+#define	MEM_SIZE	0x00800000	/* Memory size 8Mb */
+#else
+#define	MEM_SIZE	0x00400000	/* Memory size 4Mb */
+#endif
+
+#define IPSBAR 0x40000000
+#define GPACR0 0x30
+/*****************************************************************************/
+
+.global	_start
+.global	_rambase
+.global	_ramvec
+.global	_ramstart
+.global	_ramend
+
+/*****************************************************************************/
+
+.data
+
+/*
+ *	Set up the usable of RAM stuff. Size of RAM is determined then
+ *	an initial stack set up at the end.
+ */
+_rambase:
+.long	0
+_ramvec:
+.long	0
+_ramstart:
+.long	0
+_ramend:
+.long	0
+
+/*****************************************************************************/
+
+.text
+
+/*
+ *	This is the codes first entry point. This is where it all
+ *	begins...
+ */
+
+_start:
+	nop								/* Filler */
+	move.w	#0x2700, %sr			/* No interrupts */
+
+	/*
+	 * Setup VBR here, otherwise buserror remap will not work.
+	 * if dBug was active before (on my SBC with dBug 1.1 of Dec 16 1996)
+	 *
+	 * bkr@cut.de 19990306
+	 *
+	 * Note: this is because dBUG points VBR to ROM, making vectors read
+	 * only, so the bus trap can't be changed. (RS)
+	 */
+	move.l	#VBR_BASE, %a7			/* Note VBR can't be read */
+	movec   %a7, %VBR
+	move.l	%a7, _ramvec			/* Set up vector addr */
+	move.l	%a7, _rambase			/* Set up base RAM addr */
+
+
+	/*
+	 *	Set memory size.
+	 */
+	move.l	#MEM_SIZE, %a0
+
+	move.l	%a0, %d0			/* Mem end addr is in a0 */
+	move.l	%d0, %sp			/* Set up initial stack ptr */
+	move.l	%d0, _ramend		/* Set end ram addr */
+
+	/*
+	 *	Enable CPU internal cache.
+	 *
+	 *	Cache is totally broken in first 5282 silicon.
+	 *	No point enabling it for now.
+	 */
+#if 0
+	move.l	#0x01000000, %d0
+	movec	%d0, %CACR				/* Invalidate cache */
+	nop
+
+	move.l	#0x0000c000, %d0		/* Set SDRAM cached only */
+	movec	%d0, %ACR0
+	move.l	#0x00000000, %d0		/* No other regions cached */
+	movec	%d0, %ACR1
+
+	move.l	#0x00000000, %d0		/* Setup cache mask */
+	movec	%d0, %CACR				/* Enable cache */
+	nop
+#endif
+
+
+#ifdef CONFIG_ROMFS_FS
+	/*
+	 *	Move ROM filesystem above bss :-)
+	 */
+	lea.l	_sbss, %a0			/* Get start of bss */
+	lea.l	_ebss, %a1			/* Set up destination  */
+	move.l	%a0, %a2			/* Copy of bss start */
+
+	move.l	8(%a0), %d0			/* Get size of ROMFS */
+	addq.l	#8, %d0				/* Allow for rounding */
+	and.l	#0xfffffffc, %d0	/* Whole words */
+
+	add.l	%d0, %a0			/* Copy from end */
+	add.l	%d0, %a1			/* Copy from end */
+	move.l	%a1, _ramstart		/* Set start of ram */
+
+_copy_romfs:
+	move.l	-(%a0), %d0			/* Copy dword */
+	move.l	%d0, -(%a1)
+	cmp.l	%a0, %a2			/* Check if at end */
+	bne	_copy_romfs
+#else /* CONFIG_ROMFS_FS */
+	lea.l	_ebss, %a1
+	move.l	%a1, _ramstart
+#endif /* CONFIG_ROMFS_FS */
+
+
+	/*
+	 *	Zero out the bss region.
+	 */
+	lea.l	_sbss, %a0			/* Get start of bss */
+	lea.l	_ebss, %a1			/* Get end of bss */
+	clr.l	%d0					/* Set value */
+_clear_bss:
+	move.l	%d0, (%a0)+			/* Clear each word */
+	cmp.l	%a0, %a1			/* Check if at end */
+	bne	_clear_bss
+
+	/*
+	 *	Load the current thread pointer and stack.
+	 */
+	lea	init_thread_union, %a0
+	lea	0x2000(%a0), %sp
+
+   /*
+    * User mode port access
+    */
+   move.l   #0x0000000c, %d0
+   move.b   %d0, (IPSBAR+GPACR0)
+
+
+	/*
+	 *	Assember start up done, start code proper.
+	 */
+	jsr	start_kernel			/* Start Linux kernel */
+
+_exit:
+	jmp	_exit				/* Should never get here */
+
+/*****************************************************************************/
--- diff/arch/mips/au1000/common/au1xxx_irqmap.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/mips/au1000/common/au1xxx_irqmap.c	2004-04-21 10:45:33.590596952 +0100
@@ -0,0 +1,197 @@
+/*
+ * BRIEF MODULE DESCRIPTION
+ *	Au1xxx processor specific IRQ tables
+ *
+ * Copyright 2004 Embedded Edge, LLC
+ *	dan@embeddededge.com
+ *
+ *  This program is free software; you can redistribute	 it and/or modify it
+ *  under  the terms of	 the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the	License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED	  ``AS	IS'' AND   ANY	EXPRESS OR IMPLIED
+ *  WARRANTIES,	  INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO	EVENT  SHALL   THE AUTHOR  BE	 LIABLE FOR ANY	  DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED	  TO, PROCUREMENT OF  SUBSTITUTE GOODS	OR SERVICES; LOSS OF
+ *  USE, DATA,	OR PROFITS; OR	BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN	 CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/irq.h>
+#include <linux/kernel_stat.h>
+#include <linux/module.h>
+#include <linux/signal.h>
+#include <linux/sched.h>
+#include <linux/types.h>
+#include <linux/interrupt.h>
+#include <linux/ioport.h>
+#include <linux/timex.h>
+#include <linux/slab.h>
+#include <linux/random.h>
+#include <linux/delay.h>
+
+#include <asm/bitops.h>
+#include <asm/bootinfo.h>
+#include <asm/io.h>
+#include <asm/mipsregs.h>
+#include <asm/system.h>
+#include <asm/mach-au1x00/au1000.h>
+
+/* The IC0 interrupt table.  This is processor, rather than
+ * board dependent, so no reason to keep this info in the board
+ * dependent files.
+ *
+ * Careful if you change match 2 request!
+ * The interrupt handler is called directly from the low level dispatch code.
+ */
+au1xxx_irq_map_t au1xxx_ic0_map[] = {
+
+#if defined(CONFIG_SOC_AU1000)
+	{ AU1000_UART0_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_UART1_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_UART2_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_UART3_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_SSI0_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_SSI1_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE+1, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE+2, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE+3, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE+4, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE+5, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE+6, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE+7, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_TOY_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
+	{ AU1000_RTC_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_IRDA_TX_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_IRDA_RX_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_USB_DEV_REQ_INT, INTC_INT_HIGH_LEVEL, 0 },
+	{ AU1000_USB_DEV_SUS_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_USB_HOST_INT, INTC_INT_LOW_LEVEL, 0 },
+	{ AU1000_ACSYNC_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_MAC0_DMA_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_MAC1_DMA_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_AC97C_INT, INTC_INT_RISE_EDGE, 0 },
+
+#elif defined(CONFIG_SOC_AU1500)
+
+	{ AU1000_UART0_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_PCI_INTA, INTC_INT_LOW_LEVEL, 0 },
+	{ AU1000_PCI_INTB, INTC_INT_LOW_LEVEL, 0 },
+	{ AU1000_UART3_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_PCI_INTC, INTC_INT_LOW_LEVEL, 0 },
+	{ AU1000_PCI_INTD, INTC_INT_LOW_LEVEL, 0 },
+	{ AU1000_DMA_INT_BASE, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE+1, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE+2, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE+3, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE+4, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE+5, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE+6, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE+7, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_TOY_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
+	{ AU1000_RTC_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_USB_DEV_REQ_INT, INTC_INT_HIGH_LEVEL, 0 },
+	{ AU1000_USB_DEV_SUS_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_USB_HOST_INT, INTC_INT_LOW_LEVEL, 0 },
+	{ AU1000_ACSYNC_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_MAC0_DMA_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_MAC1_DMA_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_AC97C_INT, INTC_INT_RISE_EDGE, 0 },
+
+#elif defined(CONFIG_SOC_AU1100)
+
+	{ AU1000_UART0_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_UART1_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ 2/*AU1000_SD_INT*/, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_UART3_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_SSI0_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_SSI1_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE+1, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE+2, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE+3, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE+4, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE+5, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE+6, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_DMA_INT_BASE+7, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_TOY_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
+	{ AU1000_RTC_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_IRDA_TX_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_IRDA_RX_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1000_USB_DEV_REQ_INT, INTC_INT_HIGH_LEVEL, 0 },
+	{ AU1000_USB_DEV_SUS_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_USB_HOST_INT, INTC_INT_LOW_LEVEL, 0 },
+	{ AU1000_ACSYNC_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1000_MAC0_DMA_INT, INTC_INT_HIGH_LEVEL, 0},
+	/*{ AU1000_GPIO215_208_INT, INTC_INT_HIGH_LEVEL, 0},*/
+	/*{ AU1000_LCD_INT, INTC_INT_HIGH_LEVEL, 0 },*/
+	{ AU1000_AC97C_INT, INTC_INT_RISE_EDGE, 0 },
+
+#elif defined(CONFIG_SOC_AU1550)
+
+	{ AU1550_UART0_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1550_PCI_INTA, INTC_INT_LOW_LEVEL, 0 },
+	{ AU1550_PCI_INTB, INTC_INT_LOW_LEVEL, 0 },
+	{ AU1550_DDMA_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1550_CRYPTO_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1550_PCI_INTC, INTC_INT_LOW_LEVEL, 0 },
+	{ AU1550_PCI_INTD, INTC_INT_LOW_LEVEL, 0 },
+	{ AU1550_PCI_RST_INT, INTC_INT_LOW_LEVEL, 0 },
+	{ AU1550_UART1_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1550_UART3_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1550_PSC0_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1550_PSC1_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1550_PSC2_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1550_PSC3_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1550_TOY_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1550_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1550_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1550_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
+	{ AU1550_RTC_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1550_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1550_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1550_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1550_NAND_INT, INTC_INT_RISE_EDGE, 0},
+	{ AU1550_USB_DEV_REQ_INT, INTC_INT_HIGH_LEVEL, 0 },
+	{ AU1550_USB_DEV_SUS_INT, INTC_INT_RISE_EDGE, 0 },
+	{ AU1550_USB_HOST_INT, INTC_INT_LOW_LEVEL, 0 },
+	{ AU1550_MAC0_DMA_INT, INTC_INT_HIGH_LEVEL, 0},
+	{ AU1550_MAC1_DMA_INT, INTC_INT_HIGH_LEVEL, 0},
+
+#else
+#error "Error: Unknown Alchemy SOC"
+#endif
+
+};
+
+int au1xxx_ic0_nr_irqs = sizeof(au1xxx_ic0_map)/sizeof(au1xxx_irq_map_t);
+
--- diff/arch/mips/au1000/common/dbdma.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/mips/au1000/common/dbdma.c	2004-04-21 10:45:33.592596648 +0100
@@ -0,0 +1,775 @@
+/*
+ *
+ * BRIEF MODULE DESCRIPTION
+ *      The Descriptor Based DMA channel manager that first appeared
+ *	on the Au1550.  I started with dma.c, but I think all that is
+ *	left is this initial comment :-)
+ *
+ * Copyright 2004 Embedded Edge, LLC
+ *	dan@embeddededge.com
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/string.h>
+#include <linux/delay.h>
+#include <asm/mach-au1x00/au1000.h>
+#include <asm/mach-au1x00/au1xxx_dbdma.h>
+#include <asm/system.h>
+
+/*
+ * The Descriptor Based DMA supports up to 16 channels.
+ *
+ * There are 32 devices defined. We keep an internal structure
+ * of devices using these channels, along with additional
+ * information.
+ *
+ * We allocate the descriptors and allow access to them through various
+ * functions.  The drivers allocate the data buffers and assign them
+ * to the descriptors.
+ */
+static spinlock_t au1xxx_dbdma_spin_lock = SPIN_LOCK_UNLOCKED;
+
+/* I couldn't find a macro that did this......
+*/
+#define ALIGN_ADDR(x, a)	((((u32)(x)) + (a-1)) & ~(a-1))
+
+static volatile dbdma_global_t *dbdma_gptr = (dbdma_global_t *)DDMA_GLOBAL_BASE;
+static int dbdma_initialized;
+static void au1xxx_dbdma_init(void);
+
+typedef struct dbdma_device_table {
+	u32		dev_flags;
+	u32		dev_tsize;
+	u32		dev_devwidth;
+	u32		dev_physaddr;		/* If FIFO */
+	u32		dev_intlevel;
+	u32		dev_intpolarity;
+} dbdev_tab_t;
+
+typedef struct dbdma_chan_config {
+	u32			chan_flags;
+	u32			chan_index;
+	dbdev_tab_t		*chan_src;
+	dbdev_tab_t		*chan_dest;
+	au1x_dma_chan_t		*chan_ptr;
+	au1x_ddma_desc_t	*chan_desc_base;
+	au1x_ddma_desc_t	*get_ptr, *put_ptr, *cur_ptr;
+	void			*chan_callparam;
+	void (*chan_callback)(int, void *, struct pt_regs *);
+} chan_tab_t;
+
+#define	DEV_FLAGS_INUSE		(1 << 0)
+#define	DEV_FLAGS_ANYUSE	(1 << 1)
+#define DEV_FLAGS_OUT		(1 << 2)
+#define DEV_FLAGS_IN		(1 << 3)
+
+static dbdev_tab_t dbdev_tab[] = {
+	/* UARTS */
+	{ DEV_FLAGS_OUT, 0, 8, 0x11100004, 0, 0 },
+	{ DEV_FLAGS_IN, 0, 8, 0x11100000, 0, 0 },
+	{ DEV_FLAGS_OUT, 0, 8, 0x11400004, 0, 0 },
+	{ DEV_FLAGS_IN, 0, 8, 0x11400000, 0, 0 },
+
+	/* EXT DMA */
+	{ 0, 0, 0, 0x00000000, 0, 0 },
+	{ 0, 0, 0, 0x00000000, 0, 0 },
+	{ 0, 0, 0, 0x00000000, 0, 0 },
+	{ 0, 0, 0, 0x00000000, 0, 0 },
+
+	/* USB DEV */
+	{ DEV_FLAGS_IN, 4, 8, 0x10200000, 0, 0 },
+	{ DEV_FLAGS_OUT, 4, 8, 0x10200004, 0, 0 },
+	{ DEV_FLAGS_OUT, 4, 8, 0x10200008, 0, 0 },
+	{ DEV_FLAGS_OUT, 4, 8, 0x1020000c, 0, 0 },
+	{ DEV_FLAGS_IN, 4, 8, 0x10200010, 0, 0 },
+	{ DEV_FLAGS_IN, 4, 8, 0x10200014, 0, 0 },
+
+	/* PSC 0 */
+	{ DEV_FLAGS_OUT, 0, 0, 0x11a0001c, 0, 0 },
+	{ DEV_FLAGS_IN, 0, 0, 0x11a0001c, 0, 0 },
+
+	/* PSC 1 */
+	{ DEV_FLAGS_OUT, 0, 0, 0x11b0001c, 0, 0 },
+	{ DEV_FLAGS_IN, 0, 0, 0x11b0001c, 0, 0 },
+
+	/* PSC 2 */
+	{ DEV_FLAGS_OUT, 0, 0, 0x10a0001c, 0, 0 },
+	{ DEV_FLAGS_IN, 0, 0, 0x10a0001c, 0, 0 },
+
+	/* PSC 3 */
+	{ DEV_FLAGS_OUT, 0, 0, 0x10b0001c, 0, 0 },
+	{ DEV_FLAGS_IN, 0, 0, 0x10b0001c, 0, 0 },
+
+	{ 0, 0, 0, 0x00000000, 0, 0 },	/* PCI */
+	{ 0, 0, 0, 0x00000000, 0, 0 },	/* NAND */
+
+	/* MAC 0 */
+	{ DEV_FLAGS_IN, 0, 0, 0x00000000, 0, 0 },
+	{ DEV_FLAGS_OUT, 0, 0, 0x00000000, 0, 0 },
+
+	/* MAC 1 */
+	{ DEV_FLAGS_IN, 0, 0, 0x00000000, 0, 0 },
+	{ DEV_FLAGS_OUT, 0, 0, 0x00000000, 0, 0 },
+
+	/* reserved */
+	{ DEV_FLAGS_INUSE, 0, 0, 0x00000000, 0, 0 },
+	{ DEV_FLAGS_INUSE, 0, 0, 0x00000000, 0, 0 },
+
+	/* Memory */
+	{ DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },	/* throttle */
+	{ DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },	/* always */
+};
+
+static chan_tab_t *chan_tab_ptr[NUM_DBDMA_CHANS];
+
+/* Allocate a channel and return a non-zero descriptor if successful.
+*/
+u32
+au1xxx_dbdma_chan_alloc(u32 srcid, u32 destid,
+       void (*callback)(int, void *, struct pt_regs *), void *callparam)
+{
+	unsigned long   flags;
+	u32		used, chan, rv;
+	u32		dcp;
+	int		i;
+	dbdev_tab_t	*stp, *dtp;
+	chan_tab_t	*ctp;
+	volatile au1x_dma_chan_t *cp;
+
+	/* We do the intialization on the first channel allocation.
+	 * We have to wait because of the interrupt handler initialization
+	 * which can't be done successfully during board set up.
+	 */
+	if (!dbdma_initialized)
+		au1xxx_dbdma_init();
+	dbdma_initialized = 1;
+
+	if ((srcid > DSCR_NDEV_IDS) || (destid > DSCR_NDEV_IDS))
+		return 0;
+
+	stp = &dbdev_tab[srcid];
+	dtp = &dbdev_tab[destid];
+	used = 0;
+	rv = 0;
+
+	/* Check to see if we can get both channels.
+	*/
+	spin_lock_irqsave(&au1xxx_dbdma_spin_lock, flags);
+	if (!(stp->dev_flags & DEV_FLAGS_INUSE) ||
+	     (stp->dev_flags & DEV_FLAGS_ANYUSE)) {
+	     	/* Got source */
+		stp->dev_flags |= DEV_FLAGS_INUSE;
+		if (!(dtp->dev_flags & DEV_FLAGS_INUSE) ||
+		     (dtp->dev_flags & DEV_FLAGS_ANYUSE)) {
+			/* Got destination */
+			dtp->dev_flags |= DEV_FLAGS_INUSE;
+		}
+		else {
+			/* Can't get dest.  Release src.
+			*/
+			stp->dev_flags &= ~DEV_FLAGS_INUSE;
+			used++;
+		}
+	}
+	else {
+		used++;
+	}
+	spin_unlock_irqrestore(&au1xxx_dbdma_spin_lock, flags);
+
+	if (!used) {
+		/* Let's see if we can allocate a channel for it.
+		*/
+		ctp = NULL;
+		chan = 0;
+		spin_lock_irqsave(&au1xxx_dbdma_spin_lock, flags);
+		for (i=0; i<NUM_DBDMA_CHANS; i++) {
+			if (chan_tab_ptr[i] == NULL) {
+				/* If kmalloc fails, it is caught below same
+				 * as a channel not available.
+				 */
+				ctp = (chan_tab_t *)kmalloc(sizeof(chan_tab_t), GFP_KERNEL);
+				chan_tab_ptr[i] = ctp;
+				ctp->chan_index = chan = i;
+				break;
+			}
+		}
+		spin_unlock_irqrestore(&au1xxx_dbdma_spin_lock, flags);
+
+		if (ctp != NULL) {
+			memset(ctp, 0, sizeof(chan_tab_t));
+			dcp = DDMA_CHANNEL_BASE;
+			dcp += (0x0100 * chan);
+			ctp->chan_ptr = (au1x_dma_chan_t *)dcp;
+			cp = (volatile au1x_dma_chan_t *)dcp;
+			ctp->chan_src = stp;
+			ctp->chan_dest = dtp;
+			ctp->chan_callback = callback;
+			ctp->chan_callparam = callparam;
+
+			/* Initialize channel configuration.
+			*/
+			i = 0;
+			if (stp->dev_intlevel)
+				i |= DDMA_CFG_SED;
+			if (stp->dev_intpolarity)
+				i |= DDMA_CFG_SP;
+			if (dtp->dev_intlevel)
+				i |= DDMA_CFG_DED;
+			if (dtp->dev_intpolarity)
+				i |= DDMA_CFG_DP;
+			cp->ddma_cfg = i;
+			au_sync();
+
+			/* Return a non-zero value that can be used to
+			 * find the channel information in subsequent
+			 * operations.
+			 */
+			rv = (u32)(&chan_tab_ptr[chan]);
+		}
+		else {
+			/* Release devices.
+			*/
+			stp->dev_flags &= ~DEV_FLAGS_INUSE;
+			dtp->dev_flags &= ~DEV_FLAGS_INUSE;
+		}
+	}
+	return rv;
+}
+
+/* Set the device width if source or destination is a FIFO.
+ * Should be 8, 16, or 32 bits.
+ */
+u32
+au1xxx_dbdma_set_devwidth(u32 chanid, int bits)
+{
+	u32		rv;
+	chan_tab_t	*ctp;
+	dbdev_tab_t	*stp, *dtp;
+
+	ctp = *((chan_tab_t **)chanid);
+	stp = ctp->chan_src;
+	dtp = ctp->chan_dest;
+	rv = 0;
+
+	if (stp->dev_flags & DEV_FLAGS_IN) {	/* Source in fifo */
+		rv = stp->dev_devwidth;
+		stp->dev_devwidth = bits;
+	}
+	if (dtp->dev_flags & DEV_FLAGS_OUT) {	/* Destination out fifo */
+		rv = dtp->dev_devwidth;
+		dtp->dev_devwidth = bits;
+	}
+
+	return rv;
+}
+
+/* Allocate a descriptor ring, initializing as much as possible.
+*/
+u32
+au1xxx_dbdma_ring_alloc(u32 chanid, int entries)
+{
+	int			i;
+	u32			desc_base, srcid, destid;
+	u32			cmd0, cmd1, src1, dest1;
+	u32			src0, dest0;
+	chan_tab_t		*ctp;
+	dbdev_tab_t		*stp, *dtp;
+	au1x_ddma_desc_t	*dp;
+
+	/* I guess we could check this to be within the
+	 * range of the table......
+	 */
+	ctp = *((chan_tab_t **)chanid);
+	stp = ctp->chan_src;
+	dtp = ctp->chan_dest;
+
+	/* The descriptors must be 32-byte aligned.  There is a
+	 * possibility the allocation will give us such an address,
+	 * and if we try that first we are likely to not waste larger
+	 * slabs of memory.
+	 */
+	desc_base = (u32)kmalloc(entries * sizeof(au1x_ddma_desc_t), GFP_KERNEL);
+	if (desc_base == 0)
+		return 0;
+
+	if (desc_base & 0x1f) {
+		/* Lost....do it again, allocate extra, and round
+		 * the address base.
+		 */
+		kfree((const void *)desc_base);
+		i = entries * sizeof(au1x_ddma_desc_t);
+		i += (sizeof(au1x_ddma_desc_t) - 1);
+		if ((desc_base = (u32)kmalloc(i, GFP_KERNEL)) == 0)
+			return 0;
+
+		desc_base = ALIGN_ADDR(desc_base, sizeof(au1x_ddma_desc_t));
+	}
+	dp = (au1x_ddma_desc_t *)desc_base;
+
+	/* Keep track of the base descriptor.
+	*/
+	ctp->chan_desc_base = dp;
+
+	/* Initialize the rings with as much information as we know.
+	 */
+	srcid = stp - dbdev_tab;	/* Index is channel device ID */
+	destid = dtp - dbdev_tab;
+
+	cmd0 = cmd1 = src1 = dest1 = 0;
+	src0 = dest0 = 0;
+
+	cmd0 |= DSCR_CMD0_SID(srcid);
+	cmd0 |= DSCR_CMD0_DID(destid);
+	cmd0 |= DSCR_CMD0_IE | DSCR_CMD0_CV;
+	cmd0 |= DSCR_CMD0_ST(DSCR_CMD0_ST_CURRENT);
+
+	switch (stp->dev_devwidth) {
+	case 8:
+		cmd0 |= DSCR_CMD0_SW(DSCR_CMD0_BYTE);
+		break;
+	case 16:
+		cmd0 |= DSCR_CMD0_SW(DSCR_CMD0_HALFWORD);
+		break;
+	case 32:
+	default:
+		cmd0 |= DSCR_CMD0_SW(DSCR_CMD0_WORD);
+		break;
+	}
+
+	switch (dtp->dev_devwidth) {
+	case 8:
+		cmd0 |= DSCR_CMD0_DW(DSCR_CMD0_BYTE);
+		break;
+	case 16:
+		cmd0 |= DSCR_CMD0_DW(DSCR_CMD0_HALFWORD);
+		break;
+	case 32:
+	default:
+		cmd0 |= DSCR_CMD0_DW(DSCR_CMD0_WORD);
+		break;
+	}
+
+	/* If the device is marked as an in/out FIFO, ensure it is
+	 * set non-coherent.
+	 */
+	if (stp->dev_flags & DEV_FLAGS_IN)
+		cmd0 |= DSCR_CMD0_SN;		/* Source in fifo */
+	if (dtp->dev_flags & DEV_FLAGS_OUT)
+		cmd0 |= DSCR_CMD0_DN;		/* Destination out fifo */
+
+	/* Set up source1.  For now, assume no stride and increment.
+	 * A channel attribute update can change this later.
+	 */
+	switch (stp->dev_tsize) {
+	case 1:
+		src1 |= DSCR_SRC1_STS(DSCR_xTS_SIZE1);
+		break;
+	case 2:
+		src1 |= DSCR_SRC1_STS(DSCR_xTS_SIZE2);
+		break;
+	case 4:
+		src1 |= DSCR_SRC1_STS(DSCR_xTS_SIZE4);
+		break;
+	case 8:
+	default:
+		src1 |= DSCR_SRC1_STS(DSCR_xTS_SIZE8);
+		break;
+	}
+
+	/* If source input is fifo, set static address.
+	*/
+	if (stp->dev_flags & DEV_FLAGS_IN) {
+		src0 = stp->dev_physaddr;
+		src1 |= DSCR_SRC1_SAM(DSCR_xAM_STATIC);
+	}
+
+	/* Set up dest1.  For now, assume no stride and increment.
+	 * A channel attribute update can change this later.
+	 */
+	switch (dtp->dev_tsize) {
+	case 1:
+		dest1 |= DSCR_DEST1_DTS(DSCR_xTS_SIZE1);
+		break;
+	case 2:
+		dest1 |= DSCR_DEST1_DTS(DSCR_xTS_SIZE2);
+		break;
+	case 4:
+		dest1 |= DSCR_DEST1_DTS(DSCR_xTS_SIZE4);
+		break;
+	case 8:
+	default:
+		dest1 |= DSCR_DEST1_DTS(DSCR_xTS_SIZE8);
+		break;
+	}
+
+	/* If destination output is fifo, set static address.
+	*/
+	if (dtp->dev_flags & DEV_FLAGS_OUT) {
+		dest0 = dtp->dev_physaddr;
+		dest1 |= DSCR_DEST1_DAM(DSCR_xAM_STATIC);
+	}
+
+	for (i=0; i<entries; i++) {
+		dp->dscr_cmd0 = cmd0;
+		dp->dscr_cmd1 = cmd1;
+		dp->dscr_source0 = src0;
+		dp->dscr_source1 = src1;
+		dp->dscr_dest0 = dest0;
+		dp->dscr_dest1 = dest1;
+		dp->dscr_stat = 0;
+		dp->dscr_nxtptr = DSCR_NXTPTR(virt_to_phys(dp + 1));
+		dp++;
+	}
+
+	/* Make last descrptor point to the first.
+	*/
+	dp--;
+	dp->dscr_nxtptr = DSCR_NXTPTR(virt_to_phys(ctp->chan_desc_base));
+	ctp->get_ptr = ctp->put_ptr = ctp->cur_ptr = ctp->chan_desc_base;
+
+	return (u32)(ctp->chan_desc_base);
+}
+
+/* Put a source buffer into the DMA ring.
+ * This updates the source pointer and byte count.  Normally used
+ * for memory to fifo transfers.
+ */
+u32
+au1xxx_dbdma_put_source(u32 chanid, void *buf, int nbytes)
+{
+	chan_tab_t		*ctp;
+	au1x_ddma_desc_t	*dp;
+
+	/* I guess we could check this to be within the
+	 * range of the table......
+	 */
+	ctp = *((chan_tab_t **)chanid);
+
+	/* We should have multiple callers for a particular channel,
+	 * an interrupt doesn't affect this pointer nor the descriptor,
+	 * so no locking should be needed.
+	 */
+	dp = ctp->put_ptr;
+
+	/* If the descriptor is valid, we are way ahead of the DMA
+	 * engine, so just return an error condition.
+	 */
+	if (dp->dscr_cmd0 & DSCR_CMD0_V) {
+		return 0;
+	}
+
+	/* Load up buffer address and byte count.
+	*/
+	dp->dscr_source0 = virt_to_phys(buf);
+	dp->dscr_cmd1 = nbytes;
+	dp->dscr_cmd0 |= DSCR_CMD0_V;	/* Let it rip */
+	ctp->chan_ptr->ddma_dbell = 0xffffffff;	/* Make it go */
+
+	/* Get next descriptor pointer.
+	*/
+	ctp->put_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
+
+	/* return something not zero.
+	*/
+	return nbytes;
+}
+
+/* Put a destination buffer into the DMA ring.
+ * This updates the destination pointer and byte count.  Normally used
+ * to place an empty buffer into the ring for fifo to memory transfers.
+ */
+u32
+au1xxx_dbdma_put_dest(u32 chanid, void *buf, int nbytes)
+{
+	chan_tab_t		*ctp;
+	au1x_ddma_desc_t	*dp;
+
+	/* I guess we could check this to be within the
+	 * range of the table......
+	 */
+	ctp = *((chan_tab_t **)chanid);
+
+	/* We should have multiple callers for a particular channel,
+	 * an interrupt doesn't affect this pointer nor the descriptor,
+	 * so no locking should be needed.
+	 */
+	dp = ctp->put_ptr;
+
+	/* If the descriptor is valid, we are way ahead of the DMA
+	 * engine, so just return an error condition.
+	 */
+	if (dp->dscr_cmd0 & DSCR_CMD0_V)
+		return 0;
+
+	/* Load up buffer address and byte count.
+	*/
+	dp->dscr_dest0 = virt_to_phys(buf);
+	dp->dscr_cmd1 = nbytes;
+	dp->dscr_cmd0 |= DSCR_CMD0_V;	/* Let it rip */
+
+	/* Get next descriptor pointer.
+	*/
+	ctp->put_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
+
+	/* return something not zero.
+	*/
+	return nbytes;
+}
+
+/* Get a destination buffer into the DMA ring.
+ * Normally used to get a full buffer from the ring during fifo
+ * to memory transfers.  This does not set the valid bit, you will
+ * have to put another destination buffer to keep the DMA going.
+ */
+u32
+au1xxx_dbdma_get_dest(u32 chanid, void **buf, int *nbytes)
+{
+	chan_tab_t		*ctp;
+	au1x_ddma_desc_t	*dp;
+	u32			rv;
+
+	/* I guess we could check this to be within the
+	 * range of the table......
+	 */
+	ctp = *((chan_tab_t **)chanid);
+
+	/* We should have multiple callers for a particular channel,
+	 * an interrupt doesn't affect this pointer nor the descriptor,
+	 * so no locking should be needed.
+	 */
+	dp = ctp->get_ptr;
+
+	/* If the descriptor is valid, we are way ahead of the DMA
+	 * engine, so just return an error condition.
+	 */
+	if (dp->dscr_cmd0 & DSCR_CMD0_V)
+		return 0;
+
+	/* Return buffer address and byte count.
+	*/
+	*buf = (void *)(phys_to_virt(dp->dscr_dest0));
+	*nbytes = dp->dscr_cmd1;
+	rv = dp->dscr_stat;
+
+	/* Get next descriptor pointer.
+	*/
+	ctp->get_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
+
+	/* return something not zero.
+	*/
+	return rv;
+}
+
+void
+au1xxx_dbdma_stop(u32 chanid)
+{
+	chan_tab_t	*ctp;
+	volatile au1x_dma_chan_t *cp;
+	int halt_timeout = 0;
+
+	ctp = *((chan_tab_t **)chanid);
+
+	cp = ctp->chan_ptr;
+	cp->ddma_cfg &= ~DDMA_CFG_EN;	/* Disable channel */
+	au_sync();
+	while (!(cp->ddma_stat & DDMA_STAT_H)) {
+		udelay(1);
+		halt_timeout++;
+		if (halt_timeout > 100) {
+			printk("warning: DMA channel won't halt\n");
+			break;
+		}
+	}
+	/* clear current desc valid and doorbell */
+	cp->ddma_stat |= (DDMA_STAT_DB | DDMA_STAT_V);
+	au_sync();
+}
+
+/* Start using the current descriptor pointer.  If the dbdma encounters
+ * a not valid descriptor, it will stop.  In this case, we can just
+ * continue by adding a buffer to the list and starting again.
+ */
+void
+au1xxx_dbdma_start(u32 chanid)
+{
+	chan_tab_t	*ctp;
+	volatile au1x_dma_chan_t *cp;
+
+	ctp = *((chan_tab_t **)chanid);
+
+	cp = ctp->chan_ptr;
+	cp->ddma_desptr = virt_to_phys(ctp->cur_ptr);
+	cp->ddma_cfg |= DDMA_CFG_EN;	/* Enable channel */
+	au_sync();
+	cp->ddma_dbell = 0xffffffff;	/* Make it go */
+	au_sync();
+}
+
+void
+au1xxx_dbdma_reset(u32 chanid)
+{
+	chan_tab_t		*ctp;
+	au1x_ddma_desc_t	*dp;
+
+	au1xxx_dbdma_stop(chanid);
+
+	ctp = *((chan_tab_t **)chanid);
+	ctp->get_ptr = ctp->put_ptr = ctp->cur_ptr = ctp->chan_desc_base;
+
+	/* Run through the descriptors and reset the valid indicator.
+	*/
+	dp = ctp->chan_desc_base;
+
+	do {
+		dp->dscr_cmd0 &= ~DSCR_CMD0_V;
+		dp = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
+	} while (dp != ctp->chan_desc_base);
+}
+
+u32
+au1xxx_get_dma_residue(u32 chanid)
+{
+	chan_tab_t	*ctp;
+	volatile au1x_dma_chan_t *cp;
+	u32		rv;
+
+	ctp = *((chan_tab_t **)chanid);
+	cp = ctp->chan_ptr;
+
+	/* This is only valid if the channel is stopped.
+	*/
+	rv = cp->ddma_bytecnt;
+	au_sync();
+
+	return rv;
+}
+
+void
+au1xxx_dbdma_chan_free(u32 chanid)
+{
+	chan_tab_t	*ctp;
+	dbdev_tab_t	*stp, *dtp;
+
+	ctp = *((chan_tab_t **)chanid);
+	stp = ctp->chan_src;
+	dtp = ctp->chan_dest;
+
+	au1xxx_dbdma_stop(chanid);
+
+	if (ctp->chan_desc_base != NULL)
+		kfree(ctp->chan_desc_base);
+
+	stp->dev_flags &= ~DEV_FLAGS_INUSE;
+	dtp->dev_flags &= ~DEV_FLAGS_INUSE;
+	chan_tab_ptr[ctp->chan_index] = NULL;
+
+	kfree(ctp);
+}
+
+static void
+dbdma_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+	u32	intstat;
+	u32	chan_index;
+	chan_tab_t		*ctp;
+	au1x_ddma_desc_t	*dp;
+	volatile au1x_dma_chan_t *cp;
+
+	intstat = dbdma_gptr->ddma_intstat;
+	au_sync();
+	chan_index = au_ffs(intstat) - 1;
+
+	ctp = chan_tab_ptr[chan_index];
+	cp = ctp->chan_ptr;
+	dp = ctp->cur_ptr;
+
+	/* Reset interrupt.
+	*/
+	cp->ddma_irq = 0;
+	au_sync();
+
+	if (ctp->chan_callback)
+		(ctp->chan_callback)(irq, ctp->chan_callparam, regs);
+
+	ctp->cur_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
+
+}
+
+static void
+au1xxx_dbdma_init(void)
+{
+	dbdma_gptr->ddma_config = 0;
+	dbdma_gptr->ddma_throttle = 0;
+	dbdma_gptr->ddma_inten = 0xffff;
+	au_sync();
+
+	if (request_irq(AU1550_DDMA_INT, dbdma_interrupt, SA_INTERRUPT,
+			"Au1xxx dbdma", (void *)dbdma_gptr))
+		printk("Can't get 1550 dbdma irq");
+}
+
+void
+au1xxx_dbdma_dump(u32 chanid)
+{
+	chan_tab_t		*ctp;
+	au1x_ddma_desc_t	*dp;
+	dbdev_tab_t		*stp, *dtp;
+	volatile au1x_dma_chan_t *cp;
+
+	ctp = *((chan_tab_t **)chanid);
+	stp = ctp->chan_src;
+	dtp = ctp->chan_dest;
+	cp = ctp->chan_ptr;
+
+	printk("Chan %x, stp %x (dev %d)  dtp %x (dev %d) \n",
+		(u32)ctp, (u32)stp, stp - dbdev_tab, (u32)dtp, dtp - dbdev_tab);
+	printk("desc base %x, get %x, put %x, cur %x\n",
+		(u32)(ctp->chan_desc_base), (u32)(ctp->get_ptr),
+		(u32)(ctp->put_ptr), (u32)(ctp->cur_ptr));
+
+	printk("dbdma chan %x\n", (u32)cp);
+	printk("cfg %08x, desptr %08x, statptr %08x\n",
+		cp->ddma_cfg, cp->ddma_desptr, cp->ddma_statptr);
+	printk("dbell %08x, irq %08x, stat %08x, bytecnt %08x\n",
+		cp->ddma_dbell, cp->ddma_irq, cp->ddma_stat, cp->ddma_bytecnt);
+
+
+	/* Run through the descriptors
+	*/
+	dp = ctp->chan_desc_base;
+
+	do {
+		printk("dp %08x, cmd0 %08x, cmd1 %08x\n",
+			(u32)dp, dp->dscr_cmd0, dp->dscr_cmd1);
+		printk("src0 %08x, src1 %08x, dest0 %08x\n",
+			dp->dscr_source0, dp->dscr_source1, dp->dscr_dest0);
+		printk("dest1 %08x, stat %08x, nxtptr %08x\n",
+			dp->dscr_dest1, dp->dscr_stat, dp->dscr_nxtptr);
+		dp = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
+	} while (dp != ctp->chan_desc_base);
+}
--- diff/arch/mips/au1000/db1x00/mirage_ts.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/mips/au1000/db1x00/mirage_ts.c	2004-04-21 10:45:33.598595736 +0100
@@ -0,0 +1,263 @@
+/*
+ * linux/arch/mips/au1000/db1x00/mirage_ts.c
+ *
+ * BRIEF MODULE DESCRIPTION
+ *	Glue between Mirage board-specific touchscreen pieces
+ *	and generic Wolfson Codec touchscreen support.
+ *
+ *	Based on pb1100_ts.c used in Hydrogen II.
+ *
+ * Copyright (c) 2003 Embedded Edge, LLC
+ *		dan@embeddededge.com
+ *
+ *  This program is free software; you can redistribute	 it and/or modify it
+ *  under  the terms of	 the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the	License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED	  ``AS	IS'' AND   ANY	EXPRESS OR IMPLIED
+ *  WARRANTIES,	  INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO	EVENT  SHALL   THE AUTHOR  BE	 LIABLE FOR ANY	  DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED	  TO, PROCUREMENT OF  SUBSTITUTE GOODS	OR SERVICES; LOSS OF
+ *  USE, DATA,	OR PROFITS; OR	BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN	 CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/config.h>
+#include <linux/types.h>
+#include <linux/module.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/fs.h>
+#include <linux/poll.h>
+#include <linux/proc_fs.h>
+#include <linux/smp.h>
+#include <linux/smp_lock.h>
+
+#include <asm/segment.h>
+#include <asm/irq.h>
+#include <asm/uaccess.h>
+#include <asm/delay.h>
+#include <asm/au1000.h>
+
+/*
+ *  Imported interface to Wolfson Codec driver.
+ */
+extern void *wm97xx_ts_get_handle(int which);
+extern int wm97xx_ts_ready(void* ts_handle);
+extern void wm97xx_ts_set_cal(void* ts_handle, int xscale, int xtrans, int yscale, int ytrans);
+extern u16 wm97xx_ts_get_ac97(void* ts_handle, u8 reg);
+extern void wm97xx_ts_set_ac97(void* ts_handle, u8 reg, u16 val);
+extern int wm97xx_ts_read_data(void* ts_handle, long* x, long* y, long* pressure);
+extern void wm97xx_ts_send_data(void* ts_handle, long x, long y, long z);
+
+int wm97xx_comodule_present = 1;
+
+
+#define TS_NAME "mirage_ts"
+
+#define err(format, arg...) printk(KERN_ERR TS_NAME ": " format "\n" , ## arg)
+#define info(format, arg...) printk(KERN_INFO TS_NAME ": " format "\n" , ## arg)
+#define warn(format, arg...) printk(KERN_WARNING TS_NAME ": " format "\n" , ## arg)
+#define DPRINTK(format, arg...) printk(__FUNCTION__ ": " format "\n" , ## arg)
+
+
+#define PEN_DOWN_IRQ	AU1000_GPIO_7
+
+static struct task_struct *ts_task = 0;
+static DECLARE_COMPLETION(ts_complete);
+static DECLARE_WAIT_QUEUE_HEAD(pendown_wait);
+
+#ifdef CONFIG_WM97XX_FIVEWIRETS
+static int release_pressure = 1;
+#else
+static int release_pressure = 50;
+#endif
+
+typedef struct {
+   long x;
+   long y;
+} DOWN_EVENT;
+
+#define SAMPLE_RATE	50	/* samples per second */
+#define PEN_DEBOUNCE	5	/* samples for settling - fn of SAMPLE_RATE */
+#define PEN_UP_TIMEOUT	10	/* in seconds */
+#define PEN_UP_SETTLE	5	/* samples per second */
+
+static struct {
+	int xscale;
+	int xtrans;
+	int yscale;
+	int ytrans;
+} mirage_ts_cal =
+{
+#if 0
+	xscale:   84,
+	xtrans: -157,
+	yscale:   66,
+	ytrans: -150,
+#else
+	xscale:   84,
+	xtrans: -150,
+	yscale:   66,
+	ytrans: -146,
+#endif
+};
+
+
+static void pendown_irq(int irqnr, void *devid, struct pt_regs *regs)
+{
+//DPRINTK("got one 0x%x", au_readl(SYS_PINSTATERD));
+	wake_up(&pendown_wait);
+}
+
+static int ts_thread(void *id)
+{
+	static int pen_was_down = 0;
+	static DOWN_EVENT pen_xy;
+	long x, y, z;
+	void *ts;	/* handle */
+	struct task_struct *tsk = current;
+	int timeout = HZ / SAMPLE_RATE;
+
+	ts_task = tsk;
+
+	daemonize();
+	tsk->tty = NULL;
+	tsk->policy = SCHED_FIFO;
+	tsk->rt_priority = 1;
+	strcpy(tsk->comm, "touchscreen");
+
+	/* only want to receive SIGKILL */
+	spin_lock_irq(&tsk->sigmask_lock);
+	siginitsetinv(&tsk->blocked, sigmask(SIGKILL));
+	recalc_sigpending(tsk);
+	spin_unlock_irq(&tsk->sigmask_lock);
+
+	/* get handle for codec */
+	ts = wm97xx_ts_get_handle(0);
+
+	/* proceed only after everybody is ready */
+	while ( ! wm97xx_ts_ready(ts) ) {
+		/* give a little time for initializations to complete */
+		interruptible_sleep_on_timeout(&pendown_wait, HZ / 4);
+	}
+
+	/* board-specific calibration */
+	wm97xx_ts_set_cal(ts,
+			mirage_ts_cal.xscale,
+			mirage_ts_cal.xtrans,
+			mirage_ts_cal.yscale,
+			mirage_ts_cal.ytrans);
+
+	/* route Wolfson pendown interrupts to our GPIO */
+	au_sync();
+	wm97xx_ts_set_ac97(ts, 0x4c, wm97xx_ts_get_ac97(ts, 0x4c) & ~0x0008);
+	au_sync();
+	wm97xx_ts_set_ac97(ts, 0x56, wm97xx_ts_get_ac97(ts, 0x56) & ~0x0008);
+	au_sync();
+	wm97xx_ts_set_ac97(ts, 0x52, wm97xx_ts_get_ac97(ts, 0x52) | 0x2008);
+	au_sync();
+
+	for (;;) {
+		interruptible_sleep_on_timeout(&pendown_wait, timeout);
+		disable_irq(PEN_DOWN_IRQ);
+		if (signal_pending(tsk)) {
+			break;
+		}
+
+		/* read codec */
+		if (!wm97xx_ts_read_data(ts, &x, &y, &z))
+			z = 0;	/* treat no-data and pen-up the same */
+
+		if (signal_pending(tsk)) {
+			break;
+		}
+
+		if (z >= release_pressure) {
+			y = ~y;	/* top to bottom */
+			if (pen_was_down > 1 /*&& pen_was_down < PEN_DEBOUNCE*/) {//THXXX
+				/* bounce ? */
+				x = pen_xy.x;
+				y = pen_xy.y;
+				--pen_was_down;
+			} else if (pen_was_down <= 1) {
+				pen_xy.x = x;
+				pen_xy.y = y;
+				if (pen_was_down)
+					wm97xx_ts_send_data(ts, x, y, z);
+				pen_was_down = PEN_DEBOUNCE;
+			}
+			//wm97xx_ts_send_data(ts, x, y, z);
+			timeout = HZ / SAMPLE_RATE;
+		} else {
+			if (pen_was_down) {
+				if (--pen_was_down)
+					z = release_pressure;
+				else //THXXX
+				wm97xx_ts_send_data(ts, pen_xy.x, pen_xy.y, z);
+			}
+			/* The pendown signal takes some time to settle after
+			 * reading the pen pressure so wait a little
+			 * before enabling the pen.
+			 */
+			if (! pen_was_down) {
+//				interruptible_sleep_on_timeout(&pendown_wait, HZ / PEN_UP_SETTLE);
+				timeout = HZ * PEN_UP_TIMEOUT;
+			}
+		}
+		enable_irq(PEN_DOWN_IRQ);
+	}
+	enable_irq(PEN_DOWN_IRQ);
+	ts_task = NULL;
+	complete(&ts_complete);
+	return 0;
+}
+
+static int __init ts_mirage_init(void)
+{
+	int ret;
+
+	/* pen down signal is connected to GPIO 7 */
+
+	ret = request_irq(PEN_DOWN_IRQ, pendown_irq, 0, "ts-pendown", NULL);
+	if (ret) {
+		err("unable to get pendown irq%d: [%d]", PEN_DOWN_IRQ, ret);
+		return ret;
+	}
+
+	lock_kernel();
+	ret = kernel_thread(ts_thread, NULL, CLONE_FS | CLONE_FILES);
+	if (ret < 0) {
+		unlock_kernel();
+		return ret;
+	}
+	unlock_kernel();
+
+	info("Mirage touchscreen IRQ initialized.");
+
+	return 0;
+}
+
+static void __exit ts_mirage_exit(void)
+{
+	if (ts_task) {
+		send_sig(SIGKILL, ts_task, 1);
+		wait_for_completion(&ts_complete);
+	}
+
+	free_irq(PEN_DOWN_IRQ, NULL);
+}
+
+module_init(ts_mirage_init);
+module_exit(ts_mirage_exit);
+
--- diff/arch/mips/configs/ocelot_c_defconfig	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/mips/configs/ocelot_c_defconfig	2004-04-21 10:45:33.627591328 +0100
@@ -0,0 +1,554 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_MIPS=y
+CONFIG_MIPS64=y
+CONFIG_64BIT=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_CLEAN_COMPILE=y
+CONFIG_STANDALONE=y
+CONFIG_BROKEN_ON_SMP=y
+
+#
+# General setup
+#
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_HOTPLUG is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_EMBEDDED=y
+CONFIG_KALLSYMS=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+
+#
+# Loadable module support
+#
+# CONFIG_MODULES is not set
+
+#
+# Machine selection
+#
+# CONFIG_MACH_JAZZ is not set
+# CONFIG_MACH_VR41XX is not set
+# CONFIG_MIPS_COBALT is not set
+# CONFIG_MACH_DECSTATION is not set
+# CONFIG_MIPS_EV64120 is not set
+# CONFIG_MIPS_EV96100 is not set
+# CONFIG_MIPS_IVR is not set
+# CONFIG_LASAT is not set
+# CONFIG_MIPS_ITE8172 is not set
+# CONFIG_MIPS_ATLAS is not set
+# CONFIG_MIPS_MALTA is not set
+# CONFIG_MIPS_SEAD is not set
+# CONFIG_MOMENCO_OCELOT is not set
+# CONFIG_MOMENCO_OCELOT_G is not set
+CONFIG_MOMENCO_OCELOT_C=y
+# CONFIG_MOMENCO_JAGUAR_ATX is not set
+# CONFIG_PMC_YOSEMITE is not set
+# CONFIG_DDB5074 is not set
+# CONFIG_DDB5476 is not set
+# CONFIG_DDB5477 is not set
+# CONFIG_NEC_OSPREY is not set
+# CONFIG_SGI_IP22 is not set
+# CONFIG_SGI_IP27 is not set
+# CONFIG_SGI_IP32 is not set
+# CONFIG_SIBYTE_SB1xxx_SOC is not set
+# CONFIG_SNI_RM200_PCI is not set
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_HAVE_DEC_LOCK=y
+CONFIG_DMA_NONCOHERENT=y
+# CONFIG_CPU_LITTLE_ENDIAN is not set
+CONFIG_IRQ_CPU=y
+CONFIG_MIPS_MV64340=y
+CONFIG_SWAP_IO_SPACE=y
+CONFIG_MIPS_L1_CACHE_SHIFT=5
+# CONFIG_FB is not set
+
+#
+# CPU selection
+#
+# CONFIG_CPU_MIPS32 is not set
+# CONFIG_CPU_MIPS64 is not set
+# CONFIG_CPU_R3000 is not set
+# CONFIG_CPU_TX39XX is not set
+# CONFIG_CPU_VR41XX is not set
+# CONFIG_CPU_R4300 is not set
+# CONFIG_CPU_R4X00 is not set
+# CONFIG_CPU_TX49XX is not set
+# CONFIG_CPU_R5000 is not set
+# CONFIG_CPU_R5432 is not set
+# CONFIG_CPU_R6000 is not set
+# CONFIG_CPU_NEVADA is not set
+# CONFIG_CPU_R8000 is not set
+# CONFIG_CPU_R10000 is not set
+CONFIG_CPU_RM7000=y
+# CONFIG_CPU_RM9000 is not set
+# CONFIG_CPU_SB1 is not set
+CONFIG_PAGE_SIZE_4KB=y
+# CONFIG_PAGE_SIZE_16KB is not set
+# CONFIG_PAGE_SIZE_64KB is not set
+CONFIG_BOARD_SCACHE=y
+CONFIG_RM7000_CPU_SCACHE=y
+CONFIG_CPU_HAS_PREFETCH=y
+CONFIG_CPU_HAS_LLSC=y
+CONFIG_CPU_HAS_LLDSCD=y
+CONFIG_CPU_HAS_SYNC=y
+# CONFIG_PREEMPT is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+
+#
+# Bus options (PCI, PCMCIA, EISA, ISA, TC)
+#
+# CONFIG_PCI is not set
+CONFIG_MMU=y
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+CONFIG_MIPS32_COMPAT=y
+CONFIG_COMPAT=y
+CONFIG_MIPS32_O32=y
+CONFIG_MIPS32_N32=y
+CONFIG_BINFMT_ELF32=y
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_RAM is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_SCSI is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+
+#
+# Networking support
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_PACKET is not set
+CONFIG_NETLINK_DEV=y
+CONFIG_UNIX=y
+CONFIG_NET_KEY=y
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_IPV6 is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_NETFILTER is not set
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+# CONFIG_ATM is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_ETHERTAP is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+# CONFIG_MII is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+CONFIG_MV64340_ETH=y
+CONFIG_MV64340_ETH_0=y
+# CONFIG_MV64340_ETH_1 is not set
+# CONFIG_MV64340_ETH_2 is not set
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+# CONFIG_IRDA is not set
+
+#
+# Bluetooth support
+#
+# CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+CONFIG_SERIO=y
+# CONFIG_SERIO_I8042 is not set
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_CT82C710 is not set
+
+#
+# Input Device Drivers
+#
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+# CONFIG_QIC02_TAPE is not set
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_RTC is not set
+# CONFIG_GEN_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_JBD is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+# CONFIG_FAT_FS is not set
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+# CONFIG_DEVFS_FS is not set
+CONFIG_DEVPTS_FS_XATTR=y
+CONFIG_DEVPTS_FS_SECURITY=y
+# CONFIG_TMPFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+# CONFIG_NFS_V3 is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+CONFIG_NFSD=y
+# CONFIG_NFSD_V3 is not set
+# CONFIG_NFSD_TCP is not set
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_EXPORTFS=y
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_INTERMEZZO_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Kernel hacking
+#
+CONFIG_CROSSCOMPILE=y
+CONFIG_CMDLINE=""
+# CONFIG_DEBUG_KERNEL is not set
+
+#
+# Security options
+#
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+# CONFIG_CRC32 is not set
--- diff/arch/mips/configs/pb1550_defconfig	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/mips/configs/pb1550_defconfig	2004-04-21 10:45:33.632590568 +0100
@@ -0,0 +1,784 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_MIPS=y
+# CONFIG_MIPS64 is not set
+# CONFIG_64BIT is not set
+CONFIG_MIPS32=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_CLEAN_COMPILE=y
+CONFIG_STANDALONE=y
+CONFIG_BROKEN_ON_SMP=y
+
+#
+# General setup
+#
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_HOTPLUG=y
+# CONFIG_IKCONFIG is not set
+CONFIG_EMBEDDED=y
+CONFIG_KALLSYMS=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+CONFIG_OBSOLETE_MODPARM=y
+CONFIG_MODVERSIONS=y
+CONFIG_KMOD=y
+
+#
+# Machine selection
+#
+# CONFIG_MACH_JAZZ is not set
+# CONFIG_BAGET_MIPS is not set
+# CONFIG_MACH_VR41XX is not set
+# CONFIG_TOSHIBA_JMR3927 is not set
+# CONFIG_MIPS_COBALT is not set
+# CONFIG_MACH_DECSTATION is not set
+# CONFIG_MIPS_EV64120 is not set
+# CONFIG_MIPS_EV96100 is not set
+# CONFIG_MIPS_IVR is not set
+# CONFIG_LASAT is not set
+# CONFIG_MIPS_ITE8172 is not set
+# CONFIG_MIPS_ATLAS is not set
+# CONFIG_MIPS_MALTA is not set
+# CONFIG_MIPS_SEAD is not set
+# CONFIG_MOMENCO_OCELOT is not set
+# CONFIG_MOMENCO_OCELOT_G is not set
+# CONFIG_MOMENCO_OCELOT_C is not set
+# CONFIG_MOMENCO_JAGUAR_ATX is not set
+# CONFIG_PMC_YOSEMITE is not set
+# CONFIG_DDB5074 is not set
+# CONFIG_DDB5476 is not set
+# CONFIG_DDB5477 is not set
+# CONFIG_NEC_OSPREY is not set
+# CONFIG_SGI_IP22 is not set
+# CONFIG_SGI_IP32 is not set
+CONFIG_SOC_AU1X00=y
+# CONFIG_SOC_AU1000 is not set
+# CONFIG_SOC_AU1100 is not set
+# CONFIG_SOC_AU1500 is not set
+CONFIG_SOC_AU1550=y
+# CONFIG_MIPS_PB1000 is not set
+# CONFIG_MIPS_PB1100 is not set
+# CONFIG_MIPS_PB1500 is not set
+CONFIG_MIPS_PB1550=y
+# CONFIG_MIPS_DB1000 is not set
+# CONFIG_MIPS_DB1100 is not set
+# CONFIG_MIPS_DB1500 is not set
+# CONFIG_MIPS_DB1550 is not set
+# CONFIG_MIPS_BOSPORUS is not set
+# CONFIG_MIPS_MIRAGE is not set
+# CONFIG_MIPS_XXS1500 is not set
+# CONFIG_MIPS_MTX1 is not set
+# CONFIG_SIBYTE_SB1xxx_SOC is not set
+# CONFIG_SNI_RM200_PCI is not set
+# CONFIG_TOSHIBA_RBTX4927 is not set
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_HAVE_DEC_LOCK=y
+CONFIG_DMA_NONCOHERENT=y
+CONFIG_CPU_LITTLE_ENDIAN=y
+CONFIG_MIPS_L1_CACHE_SHIFT=5
+# CONFIG_FB is not set
+
+#
+# CPU selection
+#
+CONFIG_CPU_MIPS32=y
+# CONFIG_CPU_MIPS64 is not set
+# CONFIG_CPU_R3000 is not set
+# CONFIG_CPU_TX39XX is not set
+# CONFIG_CPU_VR41XX is not set
+# CONFIG_CPU_R4300 is not set
+# CONFIG_CPU_R4X00 is not set
+# CONFIG_CPU_TX49XX is not set
+# CONFIG_CPU_R5000 is not set
+# CONFIG_CPU_R5432 is not set
+# CONFIG_CPU_R6000 is not set
+# CONFIG_CPU_NEVADA is not set
+# CONFIG_CPU_R8000 is not set
+# CONFIG_CPU_R10000 is not set
+# CONFIG_CPU_RM7000 is not set
+# CONFIG_CPU_RM9000 is not set
+# CONFIG_CPU_SB1 is not set
+CONFIG_PAGE_SIZE_4KB=y
+# CONFIG_PAGE_SIZE_16KB is not set
+# CONFIG_PAGE_SIZE_64KB is not set
+CONFIG_CPU_HAS_PREFETCH=y
+# CONFIG_VTAG_ICACHE is not set
+CONFIG_64BIT_PHYS_ADDR=y
+# CONFIG_CPU_ADVANCED is not set
+CONFIG_CPU_HAS_LLSC=y
+CONFIG_CPU_HAS_SYNC=y
+# CONFIG_PREEMPT is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+
+#
+# Bus options (PCI, PCMCIA, EISA, ISA, TC)
+#
+CONFIG_PCI=y
+CONFIG_PCI_LEGACY_PROC=y
+CONFIG_PCI_NAMES=y
+CONFIG_MMU=y
+
+#
+# PCMCIA/CardBus support
+#
+CONFIG_PCMCIA=m
+# CONFIG_PCMCIA_DEBUG is not set
+# CONFIG_YENTA is not set
+# CONFIG_I82092 is not set
+# CONFIG_TCIC is not set
+CONFIG_PCMCIA_AU1X00=m
+
+#
+# PCI Hotplug Support
+#
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+CONFIG_TRAD_SIGNALS=y
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+# CONFIG_FW_LOADER is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_CARMEL is not set
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_LBD is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=y
+CONFIG_BLK_DEV_IDE=y
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+CONFIG_BLK_DEV_IDEDISK=y
+# CONFIG_IDEDISK_MULTI_MODE is not set
+# CONFIG_IDEDISK_STROKE is not set
+# CONFIG_BLK_DEV_IDECS is not set
+# CONFIG_BLK_DEV_IDECD is not set
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+# CONFIG_IDE_TASK_IOCTL is not set
+# CONFIG_IDE_TASKFILE_IO is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_IDE_GENERIC=y
+CONFIG_BLK_DEV_IDEPCI=y
+# CONFIG_IDEPCI_SHARE_IRQ is not set
+# CONFIG_BLK_DEV_OFFBOARD is not set
+CONFIG_BLK_DEV_GENERIC=y
+# CONFIG_BLK_DEV_OPTI621 is not set
+CONFIG_BLK_DEV_IDEDMA_PCI=y
+# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
+# CONFIG_IDEDMA_PCI_AUTO is not set
+CONFIG_BLK_DEV_ADMA=y
+# CONFIG_BLK_DEV_AEC62XX is not set
+# CONFIG_BLK_DEV_ALI15X3 is not set
+# CONFIG_BLK_DEV_AMD74XX is not set
+# CONFIG_BLK_DEV_CMD64X is not set
+# CONFIG_BLK_DEV_TRIFLEX is not set
+# CONFIG_BLK_DEV_CY82C693 is not set
+# CONFIG_BLK_DEV_CS5520 is not set
+# CONFIG_BLK_DEV_CS5530 is not set
+# CONFIG_BLK_DEV_HPT34X is not set
+CONFIG_BLK_DEV_HPT366=y
+# CONFIG_BLK_DEV_SC1200 is not set
+# CONFIG_BLK_DEV_PIIX is not set
+# CONFIG_BLK_DEV_NS87415 is not set
+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
+# CONFIG_BLK_DEV_SVWKS is not set
+# CONFIG_BLK_DEV_SIIMAGE is not set
+# CONFIG_BLK_DEV_SLC90E66 is not set
+# CONFIG_BLK_DEV_TRM290 is not set
+# CONFIG_BLK_DEV_VIA82CXXX is not set
+CONFIG_BLK_DEV_IDEDMA=y
+# CONFIG_IDEDMA_IVB is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI device support
+#
+# CONFIG_SCSI is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+
+#
+# Networking support
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_NETLINK_DEV=y
+CONFIG_UNIX=y
+CONFIG_NET_KEY=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+# CONFIG_IPV6 is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_CONNTRACK is not set
+# CONFIG_IP_NF_QUEUE is not set
+# CONFIG_IP_NF_IPTABLES is not set
+# CONFIG_IP_NF_ARPTABLES is not set
+# CONFIG_IP_NF_COMPAT_IPCHAINS is not set
+# CONFIG_IP_NF_COMPAT_IPFWADM is not set
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+# CONFIG_ATM is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+CONFIG_NETDEVICES=y
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_ETHERTAP is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+# CONFIG_MII is not set
+CONFIG_MIPS_AU1X00_ENET=y
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_NET_VENDOR_3COM is not set
+
+#
+# Tulip family network device support
+#
+# CONFIG_NET_TULIP is not set
+# CONFIG_HP100 is not set
+# CONFIG_NET_PCI is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+# CONFIG_E1000 is not set
+# CONFIG_NS83820 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_TIGON3 is not set
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_IXGB is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+CONFIG_PPP=m
+CONFIG_PPP_MULTILINK=y
+# CONFIG_PPP_FILTER is not set
+CONFIG_PPP_ASYNC=m
+# CONFIG_PPP_SYNC_TTY is not set
+CONFIG_PPP_DEFLATE=m
+# CONFIG_PPP_BSDCOMP is not set
+CONFIG_PPPOE=m
+# CONFIG_SLIP is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+# CONFIG_RCPCI is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_3C589=m
+# CONFIG_PCMCIA_3C574 is not set
+# CONFIG_PCMCIA_FMVJ18X is not set
+# CONFIG_PCMCIA_PCNET is not set
+# CONFIG_PCMCIA_NMCLAN is not set
+# CONFIG_PCMCIA_SMC91C92 is not set
+# CONFIG_PCMCIA_XIRC2PS is not set
+# CONFIG_PCMCIA_AXNET is not set
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# IrDA (infrared) support
+#
+# CONFIG_IRDA is not set
+
+#
+# Bluetooth support
+#
+# CONFIG_BT is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+CONFIG_SERIO=y
+# CONFIG_SERIO_I8042 is not set
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_CT82C710 is not set
+# CONFIG_SERIO_PCIPS2 is not set
+
+#
+# Input Device Drivers
+#
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Character devices
+#
+# CONFIG_VT is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+# CONFIG_AU1X00_GPIO is not set
+# CONFIG_TS_AU1X00_ADS7846 is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_AU1X00=y
+CONFIG_SERIAL_AU1X00_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+# CONFIG_QIC02_TAPE is not set
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_RTC is not set
+# CONFIG_GEN_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+
+#
+# PCMCIA character devices
+#
+# CONFIG_SYNCLINK_CS is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+# CONFIG_USB is not set
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+CONFIG_EXT2_FS_POSIX_ACL=y
+# CONFIG_EXT2_FS_SECURITY is not set
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_XATTR=y
+CONFIG_EXT3_FS_POSIX_ACL=y
+CONFIG_EXT3_FS_SECURITY=y
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+CONFIG_REISERFS_FS=m
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_REISERFS_PROC_INFO is not set
+# CONFIG_JFS_FS is not set
+CONFIG_FS_POSIX_ACL=y
+# CONFIG_XFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_QUOTA is not set
+CONFIG_AUTOFS_FS=m
+CONFIG_AUTOFS4_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+# CONFIG_FAT_FS is not set
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+# CONFIG_DEVFS_FS is not set
+CONFIG_DEVPTS_FS_XATTR=y
+CONFIG_DEVPTS_FS_SECURITY=y
+CONFIG_TMPFS=y
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_CRAMFS=m
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+# CONFIG_NFS_V3 is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+CONFIG_NFSD=m
+# CONFIG_NFSD_V3 is not set
+# CONFIG_NFSD_TCP is not set
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_EXPORTFS=m
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_INTERMEZZO_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=m
+CONFIG_NLS_DEFAULT="iso8859-1"
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Kernel hacking
+#
+CONFIG_CROSSCOMPILE=y
+CONFIG_CMDLINE=""
+# CONFIG_DEBUG_KERNEL is not set
+
+#
+# Security options
+#
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_NULL=y
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+# CONFIG_CRYPTO_SHA1 is not set
+# CONFIG_CRYPTO_SHA256 is not set
+CONFIG_CRYPTO_SHA512=y
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+CONFIG_CRYPTO_TWOFISH=y
+# CONFIG_CRYPTO_SERPENT is not set
+CONFIG_CRYPTO_AES=y
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_ARC4 is not set
+CONFIG_CRYPTO_DEFLATE=y
+CONFIG_CRYPTO_MICHAEL_MIC=y
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Library routines
+#
+CONFIG_CRC32=y
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
--- diff/arch/mips/kernel/irq-mv6434x.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/mips/kernel/irq-mv6434x.c	2004-04-21 10:45:33.644588744 +0100
@@ -0,0 +1,161 @@
+/*
+ * Copyright 2002 Momentum Computer
+ * Author: mdharm@momenco.com
+ * Copyright (C) 2004 Ralf Baechle <ralf@linux-mips.org>
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+#include <linux/module.h>
+#include <linux/interrupt.h>
+#include <linux/kernel.h>
+#include <asm/ptrace.h>
+#include <linux/sched.h>
+#include <linux/kernel_stat.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/mv64340.h>
+
+static unsigned int irq_base;
+
+static inline int ls1bit32(unsigned int x)
+{
+        int b = 31, s;
+
+        s = 16; if (x << 16 == 0) s = 0; b -= s; x <<= s;
+        s =  8; if (x <<  8 == 0) s = 0; b -= s; x <<= s;
+        s =  4; if (x <<  4 == 0) s = 0; b -= s; x <<= s;
+        s =  2; if (x <<  2 == 0) s = 0; b -= s; x <<= s;
+        s =  1; if (x <<  1 == 0) s = 0; b -= s;
+
+        return b;
+}
+
+/* mask off an interrupt -- 1 is enable, 0 is disable */
+static inline void mask_mv64340_irq(unsigned int irq)
+{
+	uint32_t value;
+
+	if (irq < (irq_base + 32)) {
+		value = MV_READ(MV64340_INTERRUPT0_MASK_0_LOW);
+		value &= ~(1 << (irq - irq_base));
+		MV_WRITE(MV64340_INTERRUPT0_MASK_0_LOW, value);
+	} else {
+		value = MV_READ(MV64340_INTERRUPT0_MASK_0_HIGH);
+		value &= ~(1 << (irq - (irq_base - 32)));
+		MV_WRITE(MV64340_INTERRUPT0_MASK_0_HIGH, value);
+	}
+}
+
+/* unmask an interrupt -- 1 is enable, 0 is disable */
+static inline void unmask_mv64340_irq(unsigned int irq)
+{
+	uint32_t value;
+
+	if (irq < (irq_base + 32)) {
+		value = MV_READ(MV64340_INTERRUPT0_MASK_0_LOW);
+		value |= 1 << (irq - irq_base);
+		MV_WRITE(MV64340_INTERRUPT0_MASK_0_LOW, value);
+	} else {
+		value = MV_READ(MV64340_INTERRUPT0_MASK_0_HIGH);
+		value |= 1 << (irq - (irq_base - 32));
+		MV_WRITE(MV64340_INTERRUPT0_MASK_0_HIGH, value);
+	}
+}
+
+/*
+ * Enables the IRQ on Marvell Chip
+ */
+static void enable_mv64340_irq(unsigned int irq)
+{
+	unmask_mv64340_irq(irq);
+}
+
+/*
+ * Initialize the IRQ on Marvell Chip
+ */
+static unsigned int startup_mv64340_irq(unsigned int irq)
+{
+	unmask_mv64340_irq(irq);
+	return 0;
+}
+
+/*
+ * Disables the IRQ on Marvell Chip
+ */
+static void disable_mv64340_irq(unsigned int irq)
+{
+	mask_mv64340_irq(irq);
+}
+
+/*
+ * Masks and ACKs an IRQ
+ */
+static void mask_and_ack_mv64340_irq(unsigned int irq)
+{
+	mask_mv64340_irq(irq);
+}
+
+/*
+ * End IRQ processing
+ */
+static void end_mv64340_irq(unsigned int irq)
+{
+	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
+		unmask_mv64340_irq(irq);
+}
+
+/*
+ * Interrupt handler for interrupts coming from the Marvell chip.
+ * It could be built in ethernet ports etc...
+ */
+void ll_mv64340_irq(struct pt_regs *regs)
+{
+	unsigned int irq_src_low, irq_src_high;
+ 	unsigned int irq_mask_low, irq_mask_high;
+
+	/* read the interrupt status registers */
+	irq_mask_low = MV_READ(MV64340_INTERRUPT0_MASK_0_LOW);
+	irq_mask_high = MV_READ(MV64340_INTERRUPT0_MASK_0_HIGH);
+	irq_src_low = MV_READ(MV64340_MAIN_INTERRUPT_CAUSE_LOW);
+	irq_src_high = MV_READ(MV64340_MAIN_INTERRUPT_CAUSE_HIGH);
+
+	/* mask for just the interrupts we want */
+	irq_src_low &= irq_mask_low;
+	irq_src_high &= irq_mask_high;
+
+	if (irq_src_low)
+		do_IRQ(ls1bit32(irq_src_low) + irq_base, regs);
+	else
+		do_IRQ(ls1bit32(irq_src_high) + irq_base + 32, regs);
+}
+
+#define shutdown_mv64340_irq	disable_mv64340_irq
+
+struct hw_interrupt_type mv64340_irq_type = {
+	"MV-64340",
+	startup_mv64340_irq,
+	shutdown_mv64340_irq,
+	enable_mv64340_irq,
+	disable_mv64340_irq,
+	mask_and_ack_mv64340_irq,
+	end_mv64340_irq,
+	NULL
+};
+
+void __init mv64340_irq_init(unsigned int base)
+{
+	int i;
+
+	/* Reset irq handlers pointers to NULL */
+	for (i = base; i < base + 64; i++) {
+		irq_desc[i].status = IRQ_DISABLED;
+		irq_desc[i].action = 0;
+		irq_desc[i].depth = 2;
+		irq_desc[i].handler = &mv64340_irq_type;
+	}
+
+	irq_base = base;
+}
--- diff/arch/mips/momentum/jaguar_atx/ja-console.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/mips/momentum/jaguar_atx/ja-console.c	2004-04-21 10:45:33.666585400 +0100
@@ -0,0 +1,106 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 2001, 2002, 2004 Ralf Baechle
+ */
+#include <linux/init.h>
+#include <linux/console.h>
+#include <linux/kdev_t.h>
+#include <linux/major.h>
+#include <linux/termios.h>
+#include <linux/sched.h>
+#include <linux/tty.h>
+
+#include <linux/serial.h>
+#include <linux/serial_core.h>
+#include <asm/serial.h>
+
+/* SUPERIO uart register map */
+struct ja_uartregs {
+	union {
+		volatile u8	pad0[3];
+		volatile u8	rbr;	/* read only, DLAB == 0 */
+		volatile u8	pad1[3];
+		volatile u8	thr;	/* write only, DLAB == 0 */
+		volatile u8	pad2[3];
+		volatile u8	dll;	/* DLAB == 1 */
+	} u1;
+	union {
+		volatile u8	pad0[3];
+		volatile u8	ier;	/* DLAB == 0 */
+		volatile u8	pad1[3];
+		volatile u8	dlm;	/* DLAB == 1 */
+	} u2;
+	union {
+		volatile u8	pad0[3];
+		volatile u8	iir;	/* read only */
+		volatile u8	pad1[3];
+		volatile u8	fcr;	/* write only */
+	} u3;
+	volatile u8	pad0[3];
+	volatile u8	iu_lcr;
+	volatile u8	pad1[3];
+	volatile u8	iu_mcr;
+	volatile u8	pad2[3];
+	volatile u8	iu_lsr;
+	volatile u8	pad3[3];
+	volatile u8	iu_msr;
+	volatile u8	pad4[3];
+	volatile u8	iu_scr;
+} ja_uregs_t;
+
+#define iu_rbr u1.rbr
+#define iu_thr u1.thr
+#define iu_dll u1.dll
+#define iu_ier u2.ier
+#define iu_dlm u2.dlm
+#define iu_iir u3.iir
+#define iu_fcr u3.fcr
+
+extern unsigned long uart_base;
+
+static inline struct ja_uartregs *console_uart(void)
+{
+	return (struct ja_uartregs *) (uart_base + 0x23UL);
+}
+
+void prom_putchar(char c)
+{
+	struct ja_uartregs *uart = console_uart();
+
+	while ((uart->iu_lsr & 0x20) == 0);
+	uart->iu_thr = c;
+}
+
+char __init prom_getchar(void)
+{
+	return 0;
+}
+
+static void inline ja_console_probe(void)
+{
+	struct uart_port up;
+
+	/*
+	 * Register to interrupt zero because we share the interrupt with
+	 * the serial driver which we don't properly support yet.
+	 */
+	memset(&up, 0, sizeof(up));
+	up.membase	= (unsigned char *) uart_base + 0x23UL;
+	up.irq		= JAGUAR_ATX_SERIAL1_IRQ;
+	up.uartclk	= JAGUAR_ATX_UART_CLK;
+	up.regshift	= 2;
+	up.iotype	= UPIO_MEM;
+	up.flags	= ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST;
+	up.line		= 0;
+
+	if (early_serial_setup(&up))
+		printk(KERN_ERR "Early serial init of port 0 failed\n");
+}
+
+__init void ja_setup_console(void)
+{
+	ja_console_probe();
+}
--- diff/arch/mips/pci/fixup-lasat.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/mips/pci/fixup-lasat.c	2004-04-21 10:45:33.672584488 +0100
@@ -0,0 +1,10 @@
+#include <linux/init.h>
+#include <linux/pci.h>
+
+void __init pcibios_fixup_irqs(void)
+{
+}
+
+struct pci_fixup pcibios_fixups[] __initdata = {
+    { 0 }
+};
--- diff/arch/mips/pci/fixup-mv64340.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/mips/pci/fixup-mv64340.c	2004-04-21 10:45:33.672584488 +0100
@@ -0,0 +1,42 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Marvell MV64340 interrupt fixup code.
+ *
+ * Marvell wants an NDA for their docs so this was written without
+ * documentation.  You've been warned.
+ *
+ * Copyright (C) 2004 Ralf Baechle
+ */
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/pci.h>
+
+#include <asm/mipsregs.h>
+#include <asm/pci_channel.h>
+
+/*
+ * WARNING: Example of how _NOT_ to do it.
+ */
+int __init pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
+{
+	int bus = dev->bus->number;
+
+	if (bus == 0 && slot == 1)
+		return 3;	/* PCI-X A */
+	if (bus == 0 && slot == 2)
+		return 4;	/* PCI-X B */
+	if (bus == 1 && slot == 1)
+		return 5;	/* PCI A */
+	if (bus == 1 && slot == 2)
+		return 6;	/* PCI B */
+
+return 0;
+	panic("Whooops in pcibios_map_irq");
+}
+
+struct pci_fixup pcibios_fixups[] = {
+	{0}
+};
--- diff/arch/mips/pci/pci-lasat.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/mips/pci/pci-lasat.c	2004-04-21 10:45:33.673584336 +0100
@@ -0,0 +1,89 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 2000, 2001 Keith M Wesolowski
+ */
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/pci.h>
+#include <linux/types.h>
+#include <linux/interrupt.h>
+#include <linux/pci.h>
+#include <asm/pci_channel.h>
+#include <linux/delay.h>
+#include <asm/bootinfo.h>
+
+extern struct pci_ops nile4_pci_ops;
+extern struct pci_ops gt64120_pci_ops;
+static struct resource lasat_pci_mem_resource = {
+	.name	= "LASAT PCI MEM",
+	.start	= 0x18000000,
+	.end	= 0x19FFFFFF,
+	.flags	= IORESOURCE_MEM,
+};
+
+static struct resource lasat_pci_io_resource = {
+	.name	= "LASAT PCI IO",
+	.start	= 0x1a000000,
+	.end	= 0x1bFFFFFF,
+	.flags	= IORESOURCE_IO,
+};
+
+static struct pci_controller lasat_pci_controller = {
+	.mem_resource	= &lasat_pci_mem_resource,
+	.io_resource	= &lasat_pci_io_resource,
+};
+
+static int __init lasat_pci_setup(void)
+{
+ 	printk("PCI: starting\n");
+
+        switch (mips_machtype) {
+            case MACH_LASAT_100:
+                lasat_pci_controller.pci_ops = &gt64120_pci_ops;
+                break;
+            case MACH_LASAT_200:
+                lasat_pci_controller.pci_ops = &nile4_pci_ops;
+                break;
+            default:
+                panic("pcibios_init: mips_machtype incorrect");
+        }
+
+	register_pci_controller(&lasat_pci_controller);
+        return 0;
+}
+early_initcall(lasat_pci_setup);
+
+#define LASATINT_ETH1   0
+#define LASATINT_ETH0   1
+#define LASATINT_HDC    2
+#define LASATINT_COMP   3
+#define LASATINT_HDLC   4
+#define LASATINT_PCIA   5
+#define LASATINT_PCIB   6
+#define LASATINT_PCIC   7
+#define LASATINT_PCID   8
+int __init pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
+{
+    switch (slot) {
+        case 1:
+            return LASATINT_PCIA;   /* Expansion Module 0 */
+        case 2:
+            return LASATINT_PCIB;   /* Expansion Module 1 */
+        case 3:
+            return LASATINT_PCIC;   /* Expansion Module 2 */
+        case 4:
+            return LASATINT_ETH1;   /* Ethernet 1 (LAN 2) */
+        case 5:
+            return LASATINT_ETH0;   /* Ethernet 0 (LAN 1) */
+        case 6:
+            return LASATINT_HDC;    /* IDE controller */
+        default:
+            return 0xff;            /* Illegal */
+    }
+
+    return -1;
+}
--- diff/arch/mips/sgi-ip27/ip27-hubio.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/mips/sgi-ip27/ip27-hubio.c	2004-04-21 10:45:33.678583576 +0100
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 1992-1997, 2000-2003 Silicon Graphics, Inc.
+ * Copyright (C) 2004 Christoph Hellwig.
+ *	Released under GPL v2.
+ *
+ * Support functions for the HUB ASIC - mostly PIO mapping related.
+ */
+
+#include <linux/bitops.h>
+#include <linux/string.h>
+#include <asm/sn/addrs.h>
+#include <asm/sn/arch.h>
+#include <asm/sn/hub.h>
+
+
+static int force_fire_and_forget = 1;
+
+/**
+ * hub_pio_map  -  establish a HUB PIO mapping
+ *
+ * @hub:	hub to perform PIO mapping on
+ * @widget:	widget ID to perform PIO mapping for
+ * @xtalk_addr:	xtalk_address that needs to be mapped
+ * @size:	size of the PIO mapping
+ *
+ **/
+unsigned long hub_pio_map(cnodeid_t cnode, xwidgetnum_t widget,
+			  unsigned long xtalk_addr, size_t size)
+{
+	nasid_t nasid = COMPACT_TO_NASID_NODEID(cnode);
+	volatile hubreg_t junk;
+	unsigned i;
+
+	/* use small-window mapping if possible */
+	if ((xtalk_addr % SWIN_SIZE) + size <= SWIN_SIZE)
+		return NODE_SWIN_BASE(nasid, widget) + (xtalk_addr % SWIN_SIZE);
+
+	if ((xtalk_addr % BWIN_SIZE) + size > BWIN_SIZE) {
+		printk(KERN_WARNING "PIO mapping at hub %d widget %d addr 0x%lx"
+				" too big (%ld)\n",
+				nasid, widget, xtalk_addr, size);
+		return 0;
+	}
+
+	xtalk_addr &= ~(BWIN_SIZE-1);
+	for (i = 0; i < HUB_NUM_BIG_WINDOW; i++) {
+		if (test_and_set_bit(i, HUB_DATA(cnode)->h_bigwin_used))
+			continue;
+
+		/*
+		 * The code below does a PIO write to setup an ITTE entry.
+		 *
+		 * We need to prevent other CPUs from seeing our updated
+		 * memory shadow of the ITTE (in the piomap) until the ITTE
+		 * entry is actually set up; otherwise, another CPU might
+		 * attempt a PIO prematurely.
+		 *
+		 * Also, the only way we can know that an entry has been
+		 * received  by the hub and can be used by future PIO reads/
+		 * writes is by reading back the ITTE entry after writing it.
+		 *
+		 * For these two reasons, we PIO read back the ITTE entry
+		 * after we write it.
+		 */
+		IIO_ITTE_PUT(nasid, i, HUB_PIO_MAP_TO_MEM, widget, xtalk_addr);
+		junk = HUB_L(IIO_ITTE_GET(nasid, i));
+
+		return NODE_BWIN_BASE(nasid, widget) + (xtalk_addr % BWIN_SIZE);
+	}
+
+	printk(KERN_WARNING "unable to establish PIO mapping for at"
+			" hub %d widget %d addr 0x%lx\n",
+			nasid, widget, xtalk_addr);
+	return 0;
+}
+
+
+/*
+ * hub_setup_prb(nasid, prbnum, credits, conveyor)
+ *
+ * 	Put a PRB into fire-and-forget mode if conveyor isn't set.  Otherwise,
+ * 	put it into conveyor belt mode with the specified number of credits.
+ */
+static void hub_setup_prb(nasid_t nasid, int prbnum, int credits)
+{
+	iprb_t prb;
+	int prb_offset;
+
+	/*
+	 * Get the current register value.
+	 */
+	prb_offset = IIO_IOPRB(prbnum);
+	prb.iprb_regval = REMOTE_HUB_L(nasid, prb_offset);
+
+	/*
+	 * Clear out some fields.
+	 */
+	prb.iprb_ovflow = 1;
+	prb.iprb_bnakctr = 0;
+	prb.iprb_anakctr = 0;
+
+	/*
+	 * Enable or disable fire-and-forget mode.
+	 */
+	prb.iprb_ff = force_fire_and_forget ? 1 : 0;
+
+	/*
+	 * Set the appropriate number of PIO cresits for the widget.
+	 */
+	prb.iprb_xtalkctr = credits;
+
+	/*
+	 * Store the new value to the register.
+	 */
+	REMOTE_HUB_S(nasid, prb_offset, prb.iprb_regval);
+}
+
+/**
+ * hub_set_piomode  -  set pio mode for a given hub
+ *
+ * @nasid:	physical node ID for the hub in question
+ *
+ * Put the hub into either "PIO conveyor belt" mode or "fire-and-forget" mode.
+ * To do this, we have to make absolutely sure that no PIOs are in progress
+ * so we turn off access to all widgets for the duration of the function.
+ *
+ * XXX - This code should really check what kind of widget we're talking
+ * to.  Bridges can only handle three requests, but XG will do more.
+ * How many can crossbow handle to widget 0?  We're assuming 1.
+ *
+ * XXX - There is a bug in the crossbow that link reset PIOs do not
+ * return write responses.  The easiest solution to this problem is to
+ * leave widget 0 (xbow) in fire-and-forget mode at all times.  This
+ * only affects pio's to xbow registers, which should be rare.
+ **/
+static void hub_set_piomode(nasid_t nasid)
+{
+	hubreg_t ii_iowa;
+	hubii_wcr_t ii_wcr;
+	unsigned i;
+
+	ii_iowa = REMOTE_HUB_L(nasid, IIO_OUTWIDGET_ACCESS);
+	REMOTE_HUB_S(nasid, IIO_OUTWIDGET_ACCESS, 0);
+
+	ii_wcr.wcr_reg_value = REMOTE_HUB_L(nasid, IIO_WCR);
+
+	if (ii_wcr.iwcr_dir_con) {
+		/*
+		 * Assume a bridge here.
+		 */
+		hub_setup_prb(nasid, 0, 3);
+	} else {
+		/*
+		 * Assume a crossbow here.
+		 */
+		hub_setup_prb(nasid, 0, 1);
+	}
+
+	/*
+	 * XXX - Here's where we should take the widget type into
+	 * when account assigning credits.
+	 */
+	for (i = HUB_WIDGET_ID_MIN; i <= HUB_WIDGET_ID_MAX; i++)
+		hub_setup_prb(nasid, i, 3);
+
+	REMOTE_HUB_S(nasid, IIO_OUTWIDGET_ACCESS, ii_iowa);
+}
+
+/**
+ * hub_pio_init  -  PIO-related hub initalization
+ *
+ * @hub:	hubinfo structure for our hub
+ **/
+void hub_pio_init(cnodeid_t cnode)
+{
+	nasid_t nasid = COMPACT_TO_NASID_NODEID(cnode);
+	unsigned i;
+
+	/* initialize big window piomaps for this hub */
+	CLEAR_BITMAP(HUB_DATA(cnode)->h_bigwin_used, HUB_NUM_BIG_WINDOW);
+	for (i = 0; i < HUB_NUM_BIG_WINDOW; i++)
+		IIO_ITTE_DISABLE(nasid, i);
+
+	hub_set_piomode(nasid);
+}
--- diff/arch/mips/sgi-ip27/ip27-xtalk.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/mips/sgi-ip27/ip27-xtalk.c	2004-04-21 10:45:33.682582968 +0100
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 1999, 2000 Ralf Baechle (ralf@gnu.org)
+ * Copyright (C) 1999, 2000 Silcon Graphics, Inc.
+ * Copyright (C) 2004 Christoph Hellwig.
+ *	Released under GPL v2.
+ *
+ * Generic XTALK initialization code
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <asm/sn/types.h>
+#include <asm/sn/klconfig.h>
+#include <asm/sn/hub.h>
+#include <asm/pci/bridge.h>
+#include <asm/xtalk/xtalk.h>
+
+
+#define XBOW_WIDGET_PART_NUM    0x0
+#define XXBOW_WIDGET_PART_NUM   0xd000  /* Xbow in Xbridge */
+#define BASE_XBOW_PORT  	8     /* Lowest external port */
+
+extern int bridge_probe(nasid_t nasid, int widget, int masterwid);
+
+static int __init probe_one_port(nasid_t nasid, int widget, int masterwid)
+{
+	widgetreg_t 		widget_id;
+	xwidget_part_num_t	partnum;
+
+	widget_id = *(volatile widgetreg_t *)
+		(RAW_NODE_SWIN_BASE(nasid, widget) + WIDGET_ID);
+	partnum = XWIDGET_PART_NUM(widget_id);
+
+	printk(KERN_INFO "Cpu %d, Nasid 0x%x, widget 0x%x (partnum 0x%x) is ",
+			smp_processor_id(), nasid, widget, partnum);
+
+	switch (partnum) {
+	case BRIDGE_WIDGET_PART_NUM:
+	case XBRIDGE_WIDGET_PART_NUM:
+		bridge_probe(nasid, widget, masterwid);
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
+static int __init xbow_probe(nasid_t nasid)
+{
+	lboard_t *brd;
+	klxbow_t *xbow_p;
+	unsigned masterwid, i;
+
+	printk("is xbow\n");
+
+	/*
+	 * found xbow, so may have multiple bridges
+	 * need to probe xbow
+	 */
+	brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_MIDPLANE8);
+	if (!brd)
+		return -ENODEV;
+
+	xbow_p = (klxbow_t *)find_component(brd, NULL, KLSTRUCT_XBOW);
+	if (!xbow_p)
+		return -ENODEV;
+
+	/*
+	 * Okay, here's a xbow. Lets arbitrate and find
+	 * out if we should initialize it. Set enabled
+	 * hub connected at highest or lowest widget as
+	 * master.
+	 */
+#ifdef WIDGET_A
+	i = HUB_WIDGET_ID_MAX + 1;
+	do {
+		i--;
+	} while ((!XBOW_PORT_TYPE_HUB(xbow_p, i)) ||
+		 (!XBOW_PORT_IS_ENABLED(xbow_p, i)));
+#else
+	i = HUB_WIDGET_ID_MIN - 1;
+	do {
+		i++;
+	} while ((!XBOW_PORT_TYPE_HUB(xbow_p, i)) ||
+		 (!XBOW_PORT_IS_ENABLED(xbow_p, i)));
+#endif
+
+	masterwid = i;
+	if (nasid != XBOW_PORT_NASID(xbow_p, i))
+		return 1;
+
+	for (i = HUB_WIDGET_ID_MIN; i <= HUB_WIDGET_ID_MAX; i++) {
+		if (XBOW_PORT_IS_ENABLED(xbow_p, i) &&
+		    XBOW_PORT_TYPE_IO(xbow_p, i))
+			probe_one_port(nasid, i, masterwid);
+	}
+
+	return 0;
+}
+
+void __init xtalk_probe_node(cnodeid_t nid)
+{
+	volatile u64 		hubreg;
+	nasid_t	 		nasid;
+	xwidget_part_num_t	partnum;
+	widgetreg_t 		widget_id;
+
+	nasid = COMPACT_TO_NASID_NODEID(nid);
+	hubreg = REMOTE_HUB_L(nasid, IIO_LLP_CSR);
+
+	/* check whether the link is up */
+	if (!(hubreg & IIO_LLP_CSR_IS_UP))
+		return;
+
+	widget_id = *(volatile widgetreg_t *)
+                       (RAW_NODE_SWIN_BASE(nasid, 0x0) + WIDGET_ID);
+	partnum = XWIDGET_PART_NUM(widget_id);
+
+	printk(KERN_INFO "Cpu %d, Nasid 0x%x: partnum 0x%x is ",
+			smp_processor_id(), nasid, partnum);
+
+	switch (partnum) {
+	case BRIDGE_WIDGET_PART_NUM:
+		bridge_probe(nasid, 0x8, 0xa);
+		break;
+	case XBOW_WIDGET_PART_NUM:
+	case XXBOW_WIDGET_PART_NUM:
+		xbow_probe(nasid);
+		break;
+	default:
+		printk(" unknown widget??\n");
+		break;
+	}
+}
--- diff/arch/mips/vr41xx/common/init.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/mips/vr41xx/common/init.c	2004-04-21 10:45:33.687582208 +0100
@@ -0,0 +1,58 @@
+/*
+ *  init.c, Common initialization routines for NEC VR4100 series.
+ *
+ *  Copyright (C) 2003-2004  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#include <linux/init.h>
+#include <linux/ioport.h>
+#include <linux/string.h>
+
+#include <asm/bootinfo.h>
+#include <asm/vr41xx/vr41xx.h>
+
+extern void vr41xx_bcu_init(void);
+extern void vr41xx_cmu_init(void);
+extern void vr41xx_pmu_init(void);
+extern void vr41xx_rtc_init(void);
+
+void __init prom_init(void)
+{
+	int argc, i;
+	char **argv;
+
+	argc = fw_arg0;
+	argv = (char **)fw_arg1;
+
+	for (i = 1; i < argc; i++) {
+		strcat(arcs_cmdline, argv[i]);
+		if (i < (argc - 1))
+			strcat(arcs_cmdline, " ");
+	}
+
+	iomem_resource.start = IO_MEM_RESOURCE_START;
+	iomem_resource.end = IO_MEM_RESOURCE_END;
+
+	vr41xx_bcu_init();
+	vr41xx_cmu_init();
+	vr41xx_pmu_init();
+	vr41xx_rtc_init();
+}
+
+unsigned long __init prom_free_prom_memory (void)
+{
+	return 0UL;
+}
--- diff/arch/ppc64/kernel/sysfs.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/ppc64/kernel/sysfs.c	2004-04-21 10:45:33.789566704 +0100
@@ -0,0 +1,331 @@
+#include <linux/config.h>
+#include <linux/sysdev.h>
+#include <linux/cpu.h>
+#include <linux/smp.h>
+#include <linux/percpu.h>
+#include <linux/init.h>
+#include <linux/sched.h>
+#include <asm/current.h>
+#include <asm/processor.h>
+#include <asm/cputable.h>
+#include <asm/hvcall.h>
+#include <asm/prom.h>
+
+
+/* SMT stuff */
+
+#ifndef CONFIG_PPC_ISERIES
+
+/* default to snooze disabled */
+DEFINE_PER_CPU(unsigned long, smt_snooze_delay);
+
+static ssize_t store_smt_snooze_delay(struct sys_device *dev, const char *buf,
+				      size_t count)
+{
+	struct cpu *cpu = container_of(dev, struct cpu, sysdev);
+	ssize_t ret;
+	unsigned long snooze;
+
+	ret = sscanf(buf, "%lu", &snooze);
+	if (ret != 1)
+		return -EINVAL;
+
+	per_cpu(smt_snooze_delay, cpu->sysdev.id) = snooze;
+
+	return count;
+}
+
+static ssize_t show_smt_snooze_delay(struct sys_device *dev, char *buf)
+{
+	struct cpu *cpu = container_of(dev, struct cpu, sysdev);
+
+	return sprintf(buf, "%lu\n", per_cpu(smt_snooze_delay, cpu->sysdev.id));
+}
+
+static SYSDEV_ATTR(smt_snooze_delay, 0644, show_smt_snooze_delay,
+		   store_smt_snooze_delay);
+
+/* Only parse OF options if the matching cmdline option was not specified */
+static int smt_snooze_cmdline;
+
+static int __init smt_setup(void)
+{
+	struct device_node *options;
+	unsigned int *val;
+	unsigned int cpu;
+
+	if (!cur_cpu_spec->cpu_features & CPU_FTR_SMT)
+		return 1;
+
+	options = find_path_device("/options");
+	if (!options)
+		return 1;
+
+	val = (unsigned int *)get_property(options, "ibm,smt-snooze-delay",
+					   NULL);
+	if (!smt_snooze_cmdline && val) {
+		for_each_cpu(cpu)
+			per_cpu(smt_snooze_delay, cpu) = *val;
+	}
+
+	return 1;
+}
+__initcall(smt_setup);
+
+static int __init setup_smt_snooze_delay(char *str)
+{
+	unsigned int cpu;
+	int snooze;
+
+	if (!cur_cpu_spec->cpu_features & CPU_FTR_SMT)
+		return 1;
+
+	smt_snooze_cmdline = 1;
+
+	if (get_option(&str, &snooze)) {
+		for_each_cpu(cpu)
+			per_cpu(smt_snooze_delay, cpu) = snooze;
+	}
+
+	return 1;
+}
+__setup("smt-snooze-delay=", setup_smt_snooze_delay);
+
+#endif
+
+
+/* PMC stuff */
+
+/*
+ * Enabling PMCs will slow partition context switch times so we only do
+ * it the first time we write to the PMCs.
+ */
+
+static DEFINE_PER_CPU(char, pmcs_enabled);
+
+#ifdef CONFIG_PPC_ISERIES
+void ppc64_enable_pmcs(void)
+{
+	/* XXX Implement for iseries */
+}
+#else
+void ppc64_enable_pmcs(void)
+{
+	unsigned long hid0;
+	unsigned long set, reset;
+	int ret;
+
+	/* Only need to enable them once */
+	if (__get_cpu_var(pmcs_enabled))
+		return;
+
+	__get_cpu_var(pmcs_enabled) = 1;
+
+	switch (systemcfg->platform) {
+		case PLATFORM_PSERIES:
+			hid0 = mfspr(HID0);
+			hid0 |= 1UL << (63 - 20);
+
+			/* POWER4 requires the following sequence */
+			asm volatile(
+				"sync\n"
+				"mtspr	%1, %0\n"
+				"mfspr	%0, %1\n"
+				"mfspr	%0, %1\n"
+				"mfspr	%0, %1\n"
+				"mfspr	%0, %1\n"
+				"mfspr	%0, %1\n"
+				"mfspr	%0, %1\n"
+				"isync" : "=&r" (hid0) : "i" (HID0), "0" (hid0):
+				"memory");
+			break;
+
+		case PLATFORM_PSERIES_LPAR:
+			set = 1UL << 63;
+			reset = 0;
+			ret = plpar_hcall_norets(H_PERFMON, set, reset);
+			if (ret)
+				printk(KERN_ERR "H_PERFMON call returned %d",
+				       ret);
+			break;
+
+		default:
+			break;
+	}
+
+	/* instruct hypervisor to maintain PMCs */
+	if (cur_cpu_spec->firmware_features & FW_FEATURE_SPLPAR) {
+		char *ptr = (char *)&paca[smp_processor_id()].xLpPaca;
+		ptr[0xBB] = 1;
+	}
+}
+#endif
+
+/* XXX convert to rusty's on_one_cpu */
+static unsigned long run_on_cpu(unsigned long cpu,
+			        unsigned long (*func)(unsigned long),
+				unsigned long arg)
+{
+	cpumask_t old_affinity = current->cpus_allowed;
+	unsigned long ret;
+
+	/* should return -EINVAL to userspace */
+	if (set_cpus_allowed(current, cpumask_of_cpu(cpu)))
+		return 0;
+
+	ret = func(arg);
+
+	set_cpus_allowed(current, old_affinity);
+
+	return ret;
+}
+
+#define SYSFS_PMCSETUP(NAME, ADDRESS) \
+static unsigned long read_##NAME(unsigned long junk) \
+{ \
+	return mfspr(ADDRESS); \
+} \
+static unsigned long write_##NAME(unsigned long val) \
+{ \
+	ppc64_enable_pmcs(); \
+	mtspr(ADDRESS, val); \
+	return 0; \
+} \
+static ssize_t show_##NAME(struct sys_device *dev, char *buf) \
+{ \
+	struct cpu *cpu = container_of(dev, struct cpu, sysdev); \
+	unsigned long val = run_on_cpu(cpu->sysdev.id, read_##NAME, 0); \
+	return sprintf(buf, "%lx\n", val); \
+} \
+static ssize_t store_##NAME(struct sys_device *dev, const char *buf, \
+			    size_t count) \
+{ \
+	struct cpu *cpu = container_of(dev, struct cpu, sysdev); \
+	unsigned long val; \
+	int ret = sscanf(buf, "%lx", &val); \
+	if (ret != 1) \
+		return -EINVAL; \
+	run_on_cpu(cpu->sysdev.id, write_##NAME, val); \
+	return count; \
+}
+
+SYSFS_PMCSETUP(mmcr0, SPRN_MMCR0);
+SYSFS_PMCSETUP(mmcr1, SPRN_MMCR1);
+SYSFS_PMCSETUP(mmcra, SPRN_MMCRA);
+SYSFS_PMCSETUP(pmc1, SPRN_PMC1);
+SYSFS_PMCSETUP(pmc2, SPRN_PMC2);
+SYSFS_PMCSETUP(pmc3, SPRN_PMC3);
+SYSFS_PMCSETUP(pmc4, SPRN_PMC4);
+SYSFS_PMCSETUP(pmc5, SPRN_PMC5);
+SYSFS_PMCSETUP(pmc6, SPRN_PMC6);
+SYSFS_PMCSETUP(pmc7, SPRN_PMC7);
+SYSFS_PMCSETUP(pmc8, SPRN_PMC8);
+SYSFS_PMCSETUP(purr, SPRN_PURR);
+
+static SYSDEV_ATTR(mmcr0, 0600, show_mmcr0, store_mmcr0);
+static SYSDEV_ATTR(mmcr1, 0600, show_mmcr1, store_mmcr1);
+static SYSDEV_ATTR(mmcra, 0600, show_mmcra, store_mmcra);
+static SYSDEV_ATTR(pmc1, 0600, show_pmc1, store_pmc1);
+static SYSDEV_ATTR(pmc2, 0600, show_pmc2, store_pmc2);
+static SYSDEV_ATTR(pmc3, 0600, show_pmc3, store_pmc3);
+static SYSDEV_ATTR(pmc4, 0600, show_pmc4, store_pmc4);
+static SYSDEV_ATTR(pmc5, 0600, show_pmc5, store_pmc5);
+static SYSDEV_ATTR(pmc6, 0600, show_pmc6, store_pmc6);
+static SYSDEV_ATTR(pmc7, 0600, show_pmc7, store_pmc7);
+static SYSDEV_ATTR(pmc8, 0600, show_pmc8, store_pmc8);
+static SYSDEV_ATTR(purr, 0600, show_purr, NULL);
+
+static void __init register_cpu_pmc(struct sys_device *s)
+{
+	sysdev_create_file(s, &attr_mmcr0);
+	sysdev_create_file(s, &attr_mmcr1);
+
+	if (cur_cpu_spec->cpu_features & CPU_FTR_MMCRA)
+		sysdev_create_file(s, &attr_mmcra);
+
+	sysdev_create_file(s, &attr_pmc1);
+	sysdev_create_file(s, &attr_pmc2);
+	sysdev_create_file(s, &attr_pmc3);
+	sysdev_create_file(s, &attr_pmc4);
+	sysdev_create_file(s, &attr_pmc5);
+	sysdev_create_file(s, &attr_pmc6);
+
+	if (cur_cpu_spec->cpu_features & CPU_FTR_PMC8) {
+		sysdev_create_file(s, &attr_pmc7);
+		sysdev_create_file(s, &attr_pmc8);
+	}
+
+	if (cur_cpu_spec->cpu_features & CPU_FTR_SMT)
+		sysdev_create_file(s, &attr_purr);
+}
+
+
+/* NUMA stuff */
+
+#ifdef CONFIG_NUMA
+static struct node node_devices[MAX_NUMNODES];
+
+static void register_nodes(void)
+{
+	int i;
+
+	for (i = 0; i < MAX_NUMNODES; i++) {
+		if (node_online(i)) {
+			int p_node = parent_node(i);
+			struct node *parent = NULL;
+
+			if (p_node != i)
+				parent = &node_devices[p_node];
+
+			register_node(&node_devices[i], i, parent);
+		}
+	}
+}
+#else
+static void register_nodes(void)
+{
+	return;
+}
+#endif
+
+
+/* Only valid if CPU is online. */
+static ssize_t show_physical_id(struct sys_device *dev, char *buf)
+{
+	struct cpu *cpu = container_of(dev, struct cpu, sysdev);
+
+	return sprintf(buf, "%u\n", get_hard_smp_processor_id(cpu->sysdev.id));
+}
+static SYSDEV_ATTR(physical_id, 0444, show_physical_id, NULL);
+
+
+static DEFINE_PER_CPU(struct cpu, cpu_devices);
+
+static int __init topology_init(void)
+{
+	int cpu;
+	struct node *parent = NULL;
+
+	register_nodes();
+
+	for_each_cpu(cpu) {
+		struct cpu *c = &per_cpu(cpu_devices, cpu);
+
+#ifdef CONFIG_NUMA
+		parent = &node_devices[cpu_to_node(cpu)];
+#endif
+		register_cpu(c, cpu, parent);
+
+		register_cpu_pmc(&c->sysdev);
+
+		sysdev_create_file(&c->sysdev, &attr_physical_id);
+
+#ifndef CONFIG_PPC_ISERIES
+		if (cur_cpu_spec->cpu_features & CPU_FTR_SMT)
+			sysdev_create_file(&c->sysdev, &attr_smt_snooze_delay);
+#endif
+	}
+
+	return 0;
+}
+__initcall(topology_init);
--- diff/arch/ppc64/oprofile/common.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/ppc64/oprofile/common.c	2004-04-21 10:45:33.795565792 +0100
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2004 Anton Blanchard <anton@au.ibm.com>, IBM
+ *
+ * Based on alpha version.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/oprofile.h>
+#include <linux/init.h>
+#include <linux/smp.h>
+#include <linux/errno.h>
+#include <asm/ptrace.h>
+#include <asm/system.h>
+
+#include "op_impl.h"
+
+extern struct op_ppc64_model op_model_rs64;
+extern struct op_ppc64_model op_model_power4;
+static struct op_ppc64_model *model;
+
+extern void (*perf_irq)(struct pt_regs *);
+static void (*save_perf_irq)(struct pt_regs *);
+
+static struct op_counter_config ctr[OP_MAX_COUNTER];
+static struct op_system_config sys;
+
+static void op_handle_interrupt(struct pt_regs *regs)
+{
+	model->handle_interrupt(regs, ctr);
+}
+
+static int op_ppc64_setup(void)
+{
+	/* Install our interrupt handler into the existing hook.  */
+	save_perf_irq = perf_irq;
+	perf_irq = op_handle_interrupt;
+
+	mb();
+
+	/* Pre-compute the values to stuff in the hardware registers.  */
+	model->reg_setup(ctr, &sys, model->num_counters);
+
+	/* Configure the registers on all cpus.  */
+	on_each_cpu(model->cpu_setup, NULL, 0, 1);
+
+	return 0;
+}
+
+static void op_ppc64_shutdown(void)
+{
+	/*
+	 * We need to be sure we have cleared all pending exceptions before
+	 * removing the interrupt handler. For the moment we play it safe and
+	 * leave it in
+	 */
+#if 0
+	mb();
+
+	/* Remove our interrupt handler. We may be removing this module. */
+	perf_irq = save_perf_irq;
+#endif
+}
+
+static void op_ppc64_cpu_start(void *dummy)
+{
+	model->start(ctr);
+}
+
+static int op_ppc64_start(void)
+{
+	on_each_cpu(op_ppc64_cpu_start, NULL, 0, 1);
+	return 0;
+}
+
+static inline void op_ppc64_cpu_stop(void *dummy)
+{
+	model->stop();
+}
+
+static void op_ppc64_stop(void)
+{
+	on_each_cpu(op_ppc64_cpu_stop, NULL, 0, 1);
+}
+
+static int op_ppc64_create_files(struct super_block *sb, struct dentry *root)
+{
+	int i;
+
+	for (i = 0; i < model->num_counters; ++i) {
+		struct dentry *dir;
+		char buf[3];
+
+		snprintf(buf, sizeof buf, "%d", i);
+		dir = oprofilefs_mkdir(sb, root, buf);
+
+		oprofilefs_create_ulong(sb, dir, "enabled", &ctr[i].enabled);
+		oprofilefs_create_ulong(sb, dir, "event", &ctr[i].event);
+		oprofilefs_create_ulong(sb, dir, "count", &ctr[i].count);
+		/*
+		 * We dont support per counter user/kernel selection, but
+		 * we leave the entries because userspace expects them
+		 */
+		oprofilefs_create_ulong(sb, dir, "kernel", &ctr[i].kernel);
+		oprofilefs_create_ulong(sb, dir, "user", &ctr[i].user);
+		oprofilefs_create_ulong(sb, dir, "unit_mask", &ctr[i].unit_mask);
+	}
+
+	oprofilefs_create_ulong(sb, root, "enable_kernel", &sys.enable_kernel);
+	oprofilefs_create_ulong(sb, root, "enable_user", &sys.enable_user);
+
+	return 0;
+}
+
+static struct oprofile_operations oprof_ppc64_ops = {
+	.create_files	= op_ppc64_create_files,
+	.setup		= op_ppc64_setup,
+	.shutdown	= op_ppc64_shutdown,
+	.start		= op_ppc64_start,
+	.stop		= op_ppc64_stop,
+	.cpu_type	= NULL		/* To be filled in below. */
+};
+
+int __init oprofile_arch_init(struct oprofile_operations **ops)
+{
+	unsigned int pvr;
+
+	pvr = _get_PVR();
+
+	switch (PVR_VER(pvr)) {
+		case PV_630:
+		case PV_630p:
+			model = &op_model_rs64;
+			model->num_counters = 8;
+			oprof_ppc64_ops.cpu_type = "ppc64/power3";
+			break;
+
+		case PV_NORTHSTAR:
+		case PV_PULSAR:
+		case PV_ICESTAR:
+		case PV_SSTAR:
+			model = &op_model_rs64;
+			model->num_counters = 8;
+			oprof_ppc64_ops.cpu_type = "ppc64/rs64";
+			break;
+
+		case PV_POWER4:
+		case PV_POWER4p:
+			model = &op_model_power4;
+			model->num_counters = 8;
+			oprof_ppc64_ops.cpu_type = "ppc64/power4";
+			break;
+
+		case PV_GPUL:
+			model = &op_model_power4;
+			model->num_counters = 8;
+			oprof_ppc64_ops.cpu_type = "ppc64/970";
+			break;
+
+		case PV_POWER5:
+			model = &op_model_power4;
+			model->num_counters = 6;
+			oprof_ppc64_ops.cpu_type = "ppc64/power5";
+			break;
+
+		default:
+			return -ENODEV;
+	}
+
+	*ops = &oprof_ppc64_ops;
+
+	printk(KERN_INFO "oprofile: using %s performance monitoring.\n",
+	       oprof_ppc64_ops.cpu_type);
+
+	return 0;
+}
+
+void oprofile_arch_exit(void)
+{
+}
--- diff/arch/ppc64/oprofile/op_impl.h	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/ppc64/oprofile/op_impl.h	2004-04-21 10:45:33.796565640 +0100
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2004 Anton Blanchard <anton@au.ibm.com>, IBM
+ *
+ * Based on alpha version.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#ifndef OP_IMPL_H
+#define OP_IMPL_H 1
+
+#define OP_MAX_COUNTER 8
+
+#define MSR_PMM		(1UL << (63 - 61))
+
+/* freeze counters. set to 1 on a perfmon exception */
+#define MMCR0_FC	(1UL << (31 - 0))
+
+/* freeze counters while MSR mark = 1 */
+#define MMCR0_FCM1	(1UL << (31 - 3))
+
+/* performance monitor exception enable */
+#define MMCR0_PMXE	(1UL << (31 - 5))
+
+/* freeze counters on enabled condition or event */
+#define MMCR0_FCECE	(1UL << (31 - 6))
+
+/* performance monitor alert has occurred, set to 0 after handling exception */
+#define MMCR0_PMAO	(1UL << (31 - 24))
+
+/* PMC1 count enable*/
+#define MMCR0_PMC1INTCONTROL	(1UL << (31 - 16))
+
+/* PMCn count enable*/
+#define MMCR0_PMCNINTCONTROL	(1UL << (31 - 17))
+
+/* state of MSR HV when SIAR set */
+#define MMCRA_SIHV	(1UL << (63 - 35))
+
+/* state of MSR PR when SIAR set */
+#define MMCRA_SIPR	(1UL << (63 - 36))
+
+/* enable sampling */
+#define MMCRA_SAMPLE_ENABLE	(1UL << (63 - 63))
+
+/* Per-counter configuration as set via oprofilefs.  */
+struct op_counter_config {
+	unsigned long valid;
+	unsigned long enabled;
+	unsigned long event;
+	unsigned long count;
+	unsigned long kernel;
+	/* We dont support per counter user/kernel selection */
+	unsigned long user;
+	unsigned long unit_mask;
+};
+
+/* System-wide configuration as set via oprofilefs.  */
+struct op_system_config {
+	unsigned long enable_kernel;
+	unsigned long enable_user;
+};
+
+/* Per-arch configuration */
+struct op_ppc64_model {
+	void (*reg_setup) (struct op_counter_config *,
+			   struct op_system_config *,
+			   int num_counters);
+	void (*cpu_setup) (void *);
+	void (*start) (struct op_counter_config *);
+	void (*stop) (void);
+	void (*handle_interrupt) (struct pt_regs *,
+				  struct op_counter_config *);
+	int num_counters;
+};
+
+static inline unsigned int ctr_read(unsigned int i)
+{
+	switch(i) {
+	case 0:
+		return mfspr(SPRN_PMC1);
+	case 1:
+		return mfspr(SPRN_PMC2);
+	case 2:
+		return mfspr(SPRN_PMC3);
+	case 3:
+		return mfspr(SPRN_PMC4);
+	case 4:
+		return mfspr(SPRN_PMC5);
+	case 5:
+		return mfspr(SPRN_PMC6);
+	case 6:
+		return mfspr(SPRN_PMC7);
+	case 7:
+		return mfspr(SPRN_PMC8);
+	default:
+		return 0;
+	}
+}
+
+static inline void ctr_write(unsigned int i, unsigned int val)
+{
+	switch(i) {
+	case 0:
+		mtspr(SPRN_PMC1, val);
+		break;
+	case 1:
+		mtspr(SPRN_PMC2, val);
+		break;
+	case 2:
+		mtspr(SPRN_PMC3, val);
+		break;
+	case 3:
+		mtspr(SPRN_PMC4, val);
+		break;
+	case 4:
+		mtspr(SPRN_PMC5, val);
+		break;
+	case 5:
+		mtspr(SPRN_PMC6, val);
+		break;
+	case 6:
+		mtspr(SPRN_PMC7, val);
+		break;
+	case 7:
+		mtspr(SPRN_PMC8, val);
+		break;
+	default:
+		break;
+	}
+}
+
+#endif
--- diff/arch/ppc64/oprofile/op_model_power4.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/ppc64/oprofile/op_model_power4.c	2004-04-21 10:45:33.797565488 +0100
@@ -0,0 +1,248 @@
+/*
+ * Copyright (C) 2004 Anton Blanchard <anton@au.ibm.com>, IBM
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/oprofile.h>
+#include <linux/init.h>
+#include <linux/smp.h>
+#include <asm/ptrace.h>
+#include <asm/system.h>
+#include <asm/processor.h>
+#include <asm/cputable.h>
+#include <asm/systemcfg.h>
+#include <asm/rtas.h>
+
+#define dbg(args...) printk(args)
+
+#include "op_impl.h"
+
+static unsigned long reset_value[OP_MAX_COUNTER];
+
+static int num_counters;
+
+static void power4_reg_setup(struct op_counter_config *ctr,
+			     struct op_system_config *sys,
+			     int num_ctrs)
+{
+	int i;
+
+	num_counters = num_ctrs;
+
+	for (i = 0; i < num_counters; ++i)
+		reset_value[i] = 0x80000000UL - ctr[i].count;
+
+	/* XXX setup user and kernel profiling */
+}
+
+extern void ppc64_enable_pmcs(void);
+
+static void power4_cpu_setup(void *unused)
+{
+	unsigned int mmcr0 = mfspr(SPRN_MMCR0);
+	unsigned long mmcra = mfspr(SPRN_MMCRA);
+
+	ppc64_enable_pmcs();
+
+	/* set the freeze bit */
+	mmcr0 |= MMCR0_FC;
+	mtspr(SPRN_MMCR0, mmcr0);
+
+	mmcr0 |= MMCR0_FCM1|MMCR0_PMXE|MMCR0_FCECE;
+	mmcr0 |= MMCR0_PMC1INTCONTROL|MMCR0_PMCNINTCONTROL;
+	mtspr(SPRN_MMCR0, mmcr0);
+
+	mmcra |= MMCRA_SAMPLE_ENABLE;
+	mtspr(SPRN_MMCRA, mmcra);
+
+	dbg("setup on cpu %d, mmcr0 %lx\n", smp_processor_id(),
+	    mfspr(SPRN_MMCR0));
+	dbg("setup on cpu %d, mmcr1 %lx\n", smp_processor_id(),
+	    mfspr(SPRN_MMCR1));
+	dbg("setup on cpu %d, mmcra %lx\n", smp_processor_id(),
+	    mfspr(SPRN_MMCRA));
+}
+
+static void power4_start(struct op_counter_config *ctr)
+{
+	int i;
+	unsigned int mmcr0;
+
+	/* set the PMM bit (see comment below) */
+	mtmsrd(mfmsr() | MSR_PMM);
+
+	for (i = 0; i < num_counters; ++i) {
+		if (ctr[i].enabled) {
+			ctr_write(i, reset_value[i]);
+		} else {
+			ctr_write(i, 0);
+		}
+	}
+
+	mmcr0 = mfspr(SPRN_MMCR0);
+
+	/*
+	 * We must clear the PMAO bit on some (GQ) chips. Just do it
+	 * all the time
+	 */
+	mmcr0 &= ~MMCR0_PMAO;
+
+	/*
+	 * now clear the freeze bit, counting will not start until we
+	 * rfid from this excetion, because only at that point will
+	 * the PMM bit be cleared
+	 */
+	mmcr0 &= ~MMCR0_FC;
+	mtspr(SPRN_MMCR0, mmcr0);
+
+	dbg("start on cpu %d, mmcr0 %x\n", smp_processor_id(), mmcr0);
+}
+
+static void power4_stop(void)
+{
+	unsigned int mmcr0;
+
+	/* freeze counters */
+	mmcr0 = mfspr(SPRN_MMCR0);
+	mmcr0 |= MMCR0_FC;
+	mtspr(SPRN_MMCR0, mmcr0);
+
+	dbg("stop on cpu %d, mmcr0 %x\n", smp_processor_id(), mmcr0);
+
+	mb();
+}
+
+/* Fake functions used by canonicalize_pc */
+static void __attribute_used__ hypervisor_bucket(void)
+{
+}
+
+static void __attribute_used__ rtas_bucket(void)
+{
+}
+
+static void __attribute_used__ kernel_unknown_bucket(void)
+{
+}
+
+/* XXX Not currently working */
+static int mmcra_has_sihv = 0;
+
+/*
+ * On GQ and newer the MMCRA stores the HV and PR bits at the time
+ * the SIAR was sampled. We use that to work out if the SIAR was sampled in
+ * the hypervisor, our exception vectors or RTAS.
+ */
+static unsigned long get_pc(void)
+{
+	unsigned long pc = mfspr(SPRN_SIAR);
+	unsigned long mmcra;
+
+	/* Cant do much about it */
+	if (!mmcra_has_sihv)
+		return pc;
+
+	mmcra = mfspr(SPRN_MMCRA);
+
+	/* Were we in the hypervisor? */
+	if ((systemcfg->platform == PLATFORM_PSERIES_LPAR) &&
+	    (mmcra & MMCRA_SIHV))
+		/* function descriptor madness */
+		return *((unsigned long *)hypervisor_bucket);
+
+	/* We were in userspace, nothing to do */
+	if (mmcra & MMCRA_SIPR)
+		return pc;
+
+	/* Were we in our exception vectors? */
+	if (pc < 0x4000UL)
+		return (unsigned long)__va(pc);
+
+#ifdef CONFIG_PPC_PSERIES
+	/* Were we in RTAS? */
+	if (pc >= rtas.base && pc < (rtas.base + rtas.size))
+		/* function descriptor madness */
+		return *((unsigned long *)rtas_bucket);
+#endif
+
+	/* Not sure where we were */
+	if (pc < KERNELBASE)
+		/* function descriptor madness */
+		return *((unsigned long *)kernel_unknown_bucket);
+
+	return pc;
+}
+
+static int get_kernel(unsigned long pc)
+{
+	int is_kernel;
+
+	if (!mmcra_has_sihv) {
+		is_kernel = (pc >= KERNELBASE);
+	} else {
+		unsigned long mmcra = mfspr(SPRN_MMCRA);
+		is_kernel = ((mmcra & MMCRA_SIPR) == 0);
+	}
+
+	return is_kernel;
+}
+
+static void power4_handle_interrupt(struct pt_regs *regs,
+				    struct op_counter_config *ctr)
+{
+	unsigned long pc;
+	int is_kernel;
+	int val;
+	int i;
+	unsigned int cpu = smp_processor_id();
+	unsigned int mmcr0;
+
+	pc = get_pc();
+	is_kernel = get_kernel(pc);
+
+	/* set the PMM bit (see comment below) */
+	mtmsrd(mfmsr() | MSR_PMM);
+
+	for (i = 0; i < num_counters; ++i) {
+		val = ctr_read(i);
+		if (val < 0) {
+			if (ctr[i].enabled) {
+				oprofile_add_sample(pc, is_kernel, i, cpu);
+				ctr_write(i, reset_value[i]);
+			} else {
+				ctr_write(i, 0);
+			}
+		}
+	}
+
+	mmcr0 = mfspr(SPRN_MMCR0);
+
+	/* reset the perfmon trigger */
+	mmcr0 |= MMCR0_PMXE;
+
+	/*
+	 * We must clear the PMAO bit on some (GQ) chips. Just do it
+	 * all the time
+	 */
+	mmcr0 &= ~MMCR0_PMAO;
+
+	/*
+	 * now clear the freeze bit, counting will not start until we
+	 * rfid from this exception, because only at that point will
+	 * the PMM bit be cleared
+	 */
+	mmcr0 &= ~MMCR0_FC;
+	mtspr(SPRN_MMCR0, mmcr0);
+}
+
+struct op_ppc64_model op_model_power4 = {
+	.reg_setup		= power4_reg_setup,
+	.cpu_setup		= power4_cpu_setup,
+	.start			= power4_start,
+	.stop			= power4_stop,
+	.handle_interrupt	= power4_handle_interrupt,
+};
--- diff/arch/ppc64/oprofile/op_model_rs64.c	1970-01-01 01:00:00.000000000 +0100
+++ source/arch/ppc64/oprofile/op_model_rs64.c	2004-04-21 10:45:33.797565488 +0100
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2004 Anton Blanchard <anton@au.ibm.com>, IBM
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/oprofile.h>
+#include <linux/init.h>
+#include <linux/smp.h>
+#include <asm/ptrace.h>
+#include <asm/system.h>
+#include <asm/processor.h>
+#include <asm/cputable.h>
+
+#define dbg(args...) printk(args)
+
+#include "op_impl.h"
+
+static void ctrl_write(unsigned int i, unsigned int val)
+{
+	unsigned int tmp;
+	unsigned long shift, mask;
+
+	dbg("ctrl_write %d %x\n", i, val);
+
+	switch(i) {
+	case 0:
+		tmp = mfspr(SPRN_MMCR0);
+		shift = 6;
+		mask = 0x7F;
+		break;
+	case 1:
+		tmp = mfspr(SPRN_MMCR0);
+		shift = 0;
+		mask = 0x3F;
+		break;
+	case 2:
+		tmp = mfspr(SPRN_MMCR1);
+		shift = 31 - 4;
+		mask = 0x1F;
+		break;
+	case 3:
+		tmp = mfspr(SPRN_MMCR1);
+		shift = 31 - 9;
+		mask = 0x1F;
+		break;
+	case 4:
+		tmp = mfspr(SPRN_MMCR1);
+		shift = 31 - 14;
+		mask = 0x1F;
+		break;
+	case 5:
+		tmp = mfspr(SPRN_MMCR1);
+		shift = 31 - 19;
+		mask = 0x1F;
+		break;
+	case 6:
+		tmp = mfspr(SPRN_MMCR1);
+		shift = 31 - 24;
+		mask = 0x1F;
+		break;
+	case 7:
+		tmp = mfspr(SPRN_MMCR1);
+		shift = 31 - 28;
+		mask = 0xF;
+		break;
+	}
+
+	tmp = tmp & ~(mask << shift);
+	tmp |= val << shift;
+
+	switch(i) {
+		case 0:
+		case 1:
+			mtspr(SPRN_MMCR0, tmp);
+			break;
+		default:
+			mtspr(SPRN_MMCR1, tmp);
+	}
+
+	dbg("ctrl_write mmcr0 %lx mmcr1 %lx\n", mfspr(SPRN_MMCR0),
+	       mfspr(SPRN_MMCR1));
+}
+
+static unsigned long reset_value[OP_MAX_COUNTER];
+
+static int num_counters;
+
+static void rs64_reg_setup(struct op_counter_config *ctr,
+			   struct op_system_config *sys,
+			   int num_ctrs)
+{
+	int i;
+
+	num_counters = num_ctrs;
+
+	for (i = 0; i < num_counters; ++i)
+		reset_value[i] = 0x80000000UL - ctr[i].count;
+
+	/* XXX setup user and kernel profiling */
+}
+
+static void rs64_cpu_setup(void *unused)
+{
+	unsigned int mmcr0;
+
+	/* reset MMCR0 and set the freeze bit */
+	mmcr0 = MMCR0_FC;
+	mtspr(SPRN_MMCR0, mmcr0);
+
+	/* reset MMCR1, MMCRA */
+	mtspr(SPRN_MMCR1, 0);
+
+	if (cur_cpu_spec->cpu_features & CPU_FTR_MMCRA)
+		mtspr(SPRN_MMCRA, 0);
+
+	mmcr0 |= MMCR0_FCM1|MMCR0_PMXE|MMCR0_FCECE;
+	/* Only applies to POWER3, but should be safe on RS64 */
+	mmcr0 |= MMCR0_PMC1INTCONTROL|MMCR0_PMCNINTCONTROL;
+	mtspr(SPRN_MMCR0, mmcr0);
+
+	dbg("setup on cpu %d, mmcr0 %lx\n", smp_processor_id(),
+	    mfspr(SPRN_MMCR0));
+	dbg("setup on cpu %d, mmcr1 %lx\n", smp_processor_id(),
+	    mfspr(SPRN_MMCR1));
+}
+
+static void rs64_start(struct op_counter_config *ctr)
+{
+	int i;
+	unsigned int mmcr0;
+
+	/* set the PMM bit (see comment below) */
+	mtmsrd(mfmsr() | MSR_PMM);
+
+	for (i = 0; i < num_counters; ++i) {
+		if (ctr[i].enabled) {
+			ctr_write(i, reset_value[i]);
+			ctrl_write(i, ctr[i].event);
+		} else {
+			ctr_write(i, 0);
+		}
+	}
+
+	mmcr0 = mfspr(SPRN_MMCR0);
+
+	/*
+	 * now clear the freeze bit, counting will not start until we
+	 * rfid from this excetion, because only at that point will
+	 * the PMM bit be cleared
+	 */
+	mmcr0 &= ~MMCR0_FC;
+	mtspr(SPRN_MMCR0, mmcr0);
+
+	dbg("start on cpu %d, mmcr0 %x\n", smp_processor_id(), mmcr0);
+}
+
+static void rs64_stop(void)
+{
+	unsigned int mmcr0;
+
+	/* freeze counters */
+	mmcr0 = mfspr(SPRN_MMCR0);
+	mmcr0 |= MMCR0_FC;
+	mtspr(SPRN_MMCR0, mmcr0);
+
+	dbg("stop on cpu %d, mmcr0 %x\n", smp_processor_id(), mmcr0);
+
+	mb();
+}
+
+static void rs64_handle_interrupt(struct pt_regs *regs,
+				  struct op_counter_config *ctr)
+{
+	unsigned int mmcr0;
+	int val;
+	int i;
+	unsigned long pc = mfspr(SPRN_SIAR);
+	int is_kernel = (pc >= KERNELBASE);
+	unsigned int cpu = smp_processor_id();
+
+	/* set the PMM bit (see comment below) */
+	mtmsrd(mfmsr() | MSR_PMM);
+
+	for (i = 0; i < num_counters; ++i) {
+		val = ctr_read(i);
+		if (val < 0) {
+			if (ctr[i].enabled) {
+				oprofile_add_sample(pc, is_kernel, i, cpu);
+				ctr_write(i, reset_value[i]);
+			} else {
+				ctr_write(i, 0);
+			}
+		}
+	}
+
+	mmcr0 = mfspr(SPRN_MMCR0);
+
+	/* reset the perfmon trigger */
+	mmcr0 |= MMCR0_PMXE;
+
+	/*
+	 * now clear the freeze bit, counting will not start until we
+	 * rfid from this exception, because only at that point will
+	 * the PMM bit be cleared
+	 */
+	mmcr0 &= ~MMCR0_FC;
+	mtspr(SPRN_MMCR0, mmcr0);
+}
+
+struct op_ppc64_model op_model_rs64 = {
+	.reg_setup		= rs64_reg_setup,
+	.cpu_setup		= rs64_cpu_setup,
+	.start			= rs64_start,
+	.stop			= rs64_stop,
+	.handle_interrupt	= rs64_handle_interrupt,
+};
--- diff/drivers/block/cfq-iosched.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/block/cfq-iosched.c	2004-04-21 10:45:33.977538128 +0100
@@ -0,0 +1,706 @@
+/*
+ *  linux/drivers/block/cfq-iosched.c
+ *
+ *  CFQ, or complete fairness queueing, disk scheduler.
+ *
+ *  Based on ideas from a previously unfinished io
+ *  scheduler (round robin per-process disk scheduling) and Andrea Arcangeli.
+ *
+ *  Copyright (C) 2003 Jens Axboe <axboe@suse.de>
+ */
+#include <linux/kernel.h>
+#include <linux/fs.h>
+#include <linux/blkdev.h>
+#include <linux/elevator.h>
+#include <linux/bio.h>
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/compiler.h>
+#include <linux/hash.h>
+#include <linux/rbtree.h>
+#include <linux/mempool.h>
+
+/*
+ * tunables
+ */
+static int cfq_quantum = 4;
+static int cfq_queued = 8;
+
+#define CFQ_QHASH_SHIFT		6
+#define CFQ_QHASH_ENTRIES	(1 << CFQ_QHASH_SHIFT)
+#define list_entry_qhash(entry)	list_entry((entry), struct cfq_queue, cfq_hash)
+
+#define CFQ_MHASH_SHIFT		8
+#define CFQ_MHASH_BLOCK(sec)	((sec) >> 3)
+#define CFQ_MHASH_ENTRIES	(1 << CFQ_MHASH_SHIFT)
+#define CFQ_MHASH_FN(sec)	(hash_long(CFQ_MHASH_BLOCK((sec)),CFQ_MHASH_SHIFT))
+#define ON_MHASH(crq)		!list_empty(&(crq)->hash)
+#define rq_hash_key(rq)		((rq)->sector + (rq)->nr_sectors)
+#define list_entry_hash(ptr)	list_entry((ptr), struct cfq_rq, hash)
+
+#define list_entry_cfqq(ptr)	list_entry((ptr), struct cfq_queue, cfq_list)
+
+#define RQ_DATA(rq)		((struct cfq_rq *) (rq)->elevator_private)
+
+static kmem_cache_t *crq_pool;
+static kmem_cache_t *cfq_pool;
+static mempool_t *cfq_mpool;
+
+struct cfq_data {
+	struct list_head rr_list;
+	struct list_head *dispatch;
+	struct list_head *cfq_hash;
+
+	struct list_head *crq_hash;
+
+	unsigned int busy_queues;
+	unsigned int max_queued;
+
+	mempool_t *crq_pool;
+};
+
+struct cfq_queue {
+	struct list_head cfq_hash;
+	struct list_head cfq_list;
+	struct rb_root sort_list;
+	int pid;
+	int queued[2];
+#if 0
+	/*
+	 * with a simple addition like this, we can do io priorities. almost.
+	 * does need a split request free list, too.
+	 */
+	int io_prio
+#endif
+};
+
+struct cfq_rq {
+	struct rb_node rb_node;
+	sector_t rb_key;
+
+	struct request *request;
+
+	struct cfq_queue *cfq_queue;
+
+	struct list_head hash;
+};
+
+static void cfq_put_queue(struct cfq_data *cfqd, struct cfq_queue *cfqq);
+static struct cfq_queue *cfq_find_cfq_hash(struct cfq_data *cfqd, int pid);
+static void cfq_dispatch_sort(struct list_head *head, struct cfq_rq *crq);
+
+/*
+ * lots of deadline iosched dupes, can be abstracted later...
+ */
+static inline void __cfq_del_crq_hash(struct cfq_rq *crq)
+{
+	list_del_init(&crq->hash);
+}
+
+static inline void cfq_del_crq_hash(struct cfq_rq *crq)
+{
+	if (ON_MHASH(crq))
+		__cfq_del_crq_hash(crq);
+}
+
+static void cfq_remove_merge_hints(request_queue_t *q, struct cfq_rq *crq)
+{
+	cfq_del_crq_hash(crq);
+
+	if (q->last_merge == crq->request)
+		q->last_merge = NULL;
+}
+
+static inline void cfq_add_crq_hash(struct cfq_data *cfqd, struct cfq_rq *crq)
+{
+	struct request *rq = crq->request;
+
+	BUG_ON(ON_MHASH(crq));
+
+	list_add(&crq->hash, &cfqd->crq_hash[CFQ_MHASH_FN(rq_hash_key(rq))]);
+}
+
+static struct request *cfq_find_rq_hash(struct cfq_data *cfqd, sector_t offset)
+{
+	struct list_head *hash_list = &cfqd->crq_hash[CFQ_MHASH_FN(offset)];
+	struct list_head *entry, *next = hash_list->next;
+
+	while ((entry = next) != hash_list) {
+		struct cfq_rq *crq = list_entry_hash(entry);
+		struct request *__rq = crq->request;
+
+		next = entry->next;
+
+		BUG_ON(!ON_MHASH(crq));
+
+		if (!rq_mergeable(__rq)) {
+			__cfq_del_crq_hash(crq);
+			continue;
+		}
+
+		if (rq_hash_key(__rq) == offset)
+			return __rq;
+	}
+
+	return NULL;
+}
+
+/*
+ * rb tree support functions
+ */
+#define RB_NONE		(2)
+#define RB_EMPTY(node)	((node)->rb_node == NULL)
+#define RB_CLEAR(node)	((node)->rb_color = RB_NONE)
+#define RB_CLEAR_ROOT(root)	((root)->rb_node = NULL)
+#define ON_RB(node)	((node)->rb_color != RB_NONE)
+#define rb_entry_crq(node)	rb_entry((node), struct cfq_rq, rb_node)
+#define rq_rb_key(rq)		(rq)->sector
+
+static inline void cfq_del_crq_rb(struct cfq_queue *cfqq, struct cfq_rq *crq)
+{
+	if (ON_RB(&crq->rb_node)) {
+		cfqq->queued[rq_data_dir(crq->request)]--;
+		rb_erase(&crq->rb_node, &cfqq->sort_list);
+		crq->cfq_queue = NULL;
+	}
+}
+
+static struct cfq_rq *
+__cfq_add_crq_rb(struct cfq_queue *cfqq, struct cfq_rq *crq)
+{
+	struct rb_node **p = &cfqq->sort_list.rb_node;
+	struct rb_node *parent = NULL;
+	struct cfq_rq *__crq;
+
+	while (*p) {
+		parent = *p;
+		__crq = rb_entry_crq(parent);
+
+		if (crq->rb_key < __crq->rb_key)
+			p = &(*p)->rb_left;
+		else if (crq->rb_key > __crq->rb_key)
+			p = &(*p)->rb_right;
+		else
+			return __crq;
+	}
+
+	rb_link_node(&crq->rb_node, parent, p);
+	return 0;
+}
+
+static void
+cfq_add_crq_rb(struct cfq_data *cfqd, struct cfq_queue *cfqq,struct cfq_rq *crq)
+{
+	struct request *rq = crq->request;
+	struct cfq_rq *__alias;
+
+	crq->rb_key = rq_rb_key(rq);
+	cfqq->queued[rq_data_dir(rq)]++;
+retry:
+	__alias = __cfq_add_crq_rb(cfqq, crq);
+	if (!__alias) {
+		rb_insert_color(&crq->rb_node, &cfqq->sort_list);
+		crq->cfq_queue = cfqq;
+		return;
+	}
+
+	cfq_del_crq_rb(cfqq, __alias);
+	cfq_dispatch_sort(cfqd->dispatch, __alias);
+	goto retry;
+}
+
+static struct request *
+cfq_find_rq_rb(struct cfq_data *cfqd, sector_t sector)
+{
+	struct cfq_queue *cfqq = cfq_find_cfq_hash(cfqd, current->tgid);
+	struct rb_node *n;
+
+	if (!cfqq)
+		goto out;
+
+	n = cfqq->sort_list.rb_node;
+	while (n) {
+		struct cfq_rq *crq = rb_entry_crq(n);
+
+		if (sector < crq->rb_key)
+			n = n->rb_left;
+		else if (sector > crq->rb_key)
+			n = n->rb_right;
+		else
+			return crq->request;
+	}
+
+out:
+	return NULL;
+}
+
+static void cfq_remove_request(request_queue_t *q, struct request *rq)
+{
+	struct cfq_data *cfqd = q->elevator.elevator_data;
+	struct cfq_rq *crq = RQ_DATA(rq);
+
+	if (crq) {
+		struct cfq_queue *cfqq = crq->cfq_queue;
+
+		cfq_remove_merge_hints(q, crq);
+		list_del_init(&rq->queuelist);
+
+		if (cfqq) {
+			cfq_del_crq_rb(cfqq, crq);
+
+			if (RB_EMPTY(&cfqq->sort_list))
+				cfq_put_queue(cfqd, cfqq);
+		}
+	}
+}
+
+static int
+cfq_merge(request_queue_t *q, struct request **req, struct bio *bio)
+{
+	struct cfq_data *cfqd = q->elevator.elevator_data;
+	struct request *__rq;
+	int ret;
+
+	ret = elv_try_last_merge(q, bio);
+	if (ret != ELEVATOR_NO_MERGE) {
+		__rq = q->last_merge;
+		goto out_insert;
+	}
+
+	__rq = cfq_find_rq_hash(cfqd, bio->bi_sector);
+	if (__rq) {
+		BUG_ON(__rq->sector + __rq->nr_sectors != bio->bi_sector);
+
+		if (elv_rq_merge_ok(__rq, bio)) {
+			ret = ELEVATOR_BACK_MERGE;
+			goto out;
+		}
+	}
+
+	__rq = cfq_find_rq_rb(cfqd, bio->bi_sector + bio_sectors(bio));
+	if (__rq) {
+		if (elv_rq_merge_ok(__rq, bio)) {
+			ret = ELEVATOR_FRONT_MERGE;
+			goto out;
+		}
+	}
+
+	return ELEVATOR_NO_MERGE;
+out:
+	q->last_merge = __rq;
+out_insert:
+	*req = __rq;
+	return ret;
+}
+
+static void cfq_merged_request(request_queue_t *q, struct request *req)
+{
+	struct cfq_data *cfqd = q->elevator.elevator_data;
+	struct cfq_rq *crq = RQ_DATA(req);
+
+	cfq_del_crq_hash(crq);
+	cfq_add_crq_hash(cfqd, crq);
+
+	if (ON_RB(&crq->rb_node) && (rq_rb_key(req) != crq->rb_key)) {
+		struct cfq_queue *cfqq = crq->cfq_queue;
+
+		cfq_del_crq_rb(cfqq, crq);
+		cfq_add_crq_rb(cfqd, cfqq, crq);
+	}
+
+	q->last_merge = req;
+}
+
+static void
+cfq_merged_requests(request_queue_t *q, struct request *req,
+		    struct request *next)
+{
+	cfq_merged_request(q, req);
+	cfq_remove_request(q, next);
+}
+
+static void cfq_dispatch_sort(struct list_head *head, struct cfq_rq *crq)
+{
+	struct list_head *entry = head;
+	struct request *__rq;
+
+	if (!list_empty(head)) {
+		__rq = list_entry_rq(head->next);
+
+		if (crq->request->sector < __rq->sector) {
+			entry = head->prev;
+			goto link;
+		}
+	}
+
+	while ((entry = entry->prev) != head) {
+		__rq = list_entry_rq(entry);
+
+		if (crq->request->sector <= __rq->sector)
+			break;
+	}
+
+link:
+	list_add_tail(&crq->request->queuelist, entry);
+}
+
+static inline void
+__cfq_dispatch_requests(request_queue_t *q, struct cfq_data *cfqd,
+			struct cfq_queue *cfqq)
+{
+	struct cfq_rq *crq = rb_entry_crq(rb_first(&cfqq->sort_list));
+
+	cfq_del_crq_rb(cfqq, crq);
+	cfq_remove_merge_hints(q, crq);
+	cfq_dispatch_sort(cfqd->dispatch, crq);
+}
+
+static int cfq_dispatch_requests(request_queue_t *q, struct cfq_data *cfqd)
+{
+	struct cfq_queue *cfqq;
+	struct list_head *entry, *tmp;
+	int ret, queued, good_queues;
+
+	if (list_empty(&cfqd->rr_list))
+		return 0;
+
+	queued = ret = 0;
+restart:
+	good_queues = 0;
+	list_for_each_safe(entry, tmp, &cfqd->rr_list) {
+		cfqq = list_entry_cfqq(cfqd->rr_list.next);
+
+		BUG_ON(RB_EMPTY(&cfqq->sort_list));
+
+		__cfq_dispatch_requests(q, cfqd, cfqq);
+
+		if (RB_EMPTY(&cfqq->sort_list))
+			cfq_put_queue(cfqd, cfqq);
+		else
+			good_queues++;
+
+		queued++;
+		ret = 1;
+	}
+
+	if ((queued < cfq_quantum) && good_queues)
+		goto restart;
+
+	return ret;
+}
+
+static struct request *cfq_next_request(request_queue_t *q)
+{
+	struct cfq_data *cfqd = q->elevator.elevator_data;
+	struct request *rq;
+
+	if (!list_empty(cfqd->dispatch)) {
+		struct cfq_rq *crq;
+dispatch:
+		rq = list_entry_rq(cfqd->dispatch->next);
+
+		crq = RQ_DATA(rq);
+		if (crq)
+			cfq_remove_merge_hints(q, crq);
+
+		return rq;
+	}
+
+	if (cfq_dispatch_requests(q, cfqd))
+		goto dispatch;
+
+	return NULL;
+}
+
+static inline struct cfq_queue *
+__cfq_find_cfq_hash(struct cfq_data *cfqd, int pid, const int hashval)
+{
+	struct list_head *hash_list = &cfqd->cfq_hash[hashval];
+	struct list_head *entry;
+
+	list_for_each(entry, hash_list) {
+		struct cfq_queue *__cfqq = list_entry_qhash(entry);
+
+		if (__cfqq->pid == pid)
+			return __cfqq;
+	}
+
+	return NULL;
+}
+
+static struct cfq_queue *cfq_find_cfq_hash(struct cfq_data *cfqd, int pid)
+{
+	const int hashval = hash_long(current->tgid, CFQ_QHASH_SHIFT);
+
+	return __cfq_find_cfq_hash(cfqd, pid, hashval);
+}
+
+static void cfq_put_queue(struct cfq_data *cfqd, struct cfq_queue *cfqq)
+{
+	cfqd->busy_queues--;
+	list_del(&cfqq->cfq_list);
+	list_del(&cfqq->cfq_hash);
+	mempool_free(cfqq, cfq_mpool);
+}
+
+static struct cfq_queue *cfq_get_queue(struct cfq_data *cfqd, int pid)
+{
+	const int hashval = hash_long(current->tgid, CFQ_QHASH_SHIFT);
+	struct cfq_queue *cfqq = __cfq_find_cfq_hash(cfqd, pid, hashval);
+
+	if (!cfqq) {
+		cfqq = mempool_alloc(cfq_mpool, GFP_NOIO);
+
+		INIT_LIST_HEAD(&cfqq->cfq_hash);
+		INIT_LIST_HEAD(&cfqq->cfq_list);
+		RB_CLEAR_ROOT(&cfqq->sort_list);
+
+		cfqq->pid = pid;
+		cfqq->queued[0] = cfqq->queued[1] = 0;
+		list_add(&cfqq->cfq_hash, &cfqd->cfq_hash[hashval]);
+	}
+
+	return cfqq;
+}
+
+static void cfq_enqueue(struct cfq_data *cfqd, struct cfq_rq *crq)
+{
+	struct cfq_queue *cfqq;
+
+	cfqq = cfq_get_queue(cfqd, current->tgid);
+
+	cfq_add_crq_rb(cfqd, cfqq, crq);
+
+	if (list_empty(&cfqq->cfq_list)) {
+		list_add(&cfqq->cfq_list, &cfqd->rr_list);
+		cfqd->busy_queues++;
+	}
+}
+
+static void
+cfq_insert_request(request_queue_t *q, struct request *rq, int where)
+{
+	struct cfq_data *cfqd = q->elevator.elevator_data;
+	struct cfq_rq *crq = RQ_DATA(rq);
+
+	switch (where) {
+		case ELEVATOR_INSERT_BACK:
+			while (cfq_dispatch_requests(q, cfqd))
+				;
+			list_add_tail(&rq->queuelist, cfqd->dispatch);
+			break;
+		case ELEVATOR_INSERT_FRONT:
+			list_add(&rq->queuelist, cfqd->dispatch);
+			break;
+		case ELEVATOR_INSERT_SORT:
+			BUG_ON(!blk_fs_request(rq));
+			cfq_enqueue(cfqd, crq);
+			break;
+		default:
+			printk("%s: bad insert point %d\n", __FUNCTION__,where);
+			return;
+	}
+
+	if (rq_mergeable(rq)) {
+		cfq_add_crq_hash(cfqd, crq);
+
+		if (!q->last_merge)
+			q->last_merge = rq;
+	}
+}
+
+static int cfq_queue_empty(request_queue_t *q)
+{
+	struct cfq_data *cfqd = q->elevator.elevator_data;
+
+	if (list_empty(cfqd->dispatch) && list_empty(&cfqd->rr_list))
+		return 1;
+
+	return 0;
+}
+
+static struct request *
+cfq_former_request(request_queue_t *q, struct request *rq)
+{
+	struct cfq_rq *crq = RQ_DATA(rq);
+	struct rb_node *rbprev = rb_prev(&crq->rb_node);
+
+	if (rbprev)
+		return rb_entry_crq(rbprev)->request;
+
+	return NULL;
+}
+
+static struct request *
+cfq_latter_request(request_queue_t *q, struct request *rq)
+{
+	struct cfq_rq *crq = RQ_DATA(rq);
+	struct rb_node *rbnext = rb_next(&crq->rb_node);
+
+	if (rbnext)
+		return rb_entry_crq(rbnext)->request;
+
+	return NULL;
+}
+
+static int cfq_may_queue(request_queue_t *q, int rw)
+{
+	struct cfq_data *cfqd = q->elevator.elevator_data;
+	struct cfq_queue *cfqq;
+	int ret = 1;
+
+	if (!cfqd->busy_queues)
+		goto out;
+
+	cfqq = cfq_find_cfq_hash(cfqd, current->tgid);
+	if (cfqq) {
+		int limit = (q->nr_requests - cfq_queued) / cfqd->busy_queues;
+
+		if (limit < 3)
+			limit = 3;
+		else if (limit > cfqd->max_queued)
+			limit = cfqd->max_queued;
+
+		if (cfqq->queued[rw] > limit)
+			ret = 0;
+	}
+out:
+	return ret;
+}
+
+static void cfq_put_request(request_queue_t *q, struct request *rq)
+{
+	struct cfq_data *cfqd = q->elevator.elevator_data;
+	struct cfq_rq *crq = RQ_DATA(rq);
+
+	if (crq) {
+		BUG_ON(q->last_merge == rq);
+		BUG_ON(ON_MHASH(crq));
+
+		mempool_free(crq, cfqd->crq_pool);
+		rq->elevator_private = NULL;
+	}
+}
+
+static int cfq_set_request(request_queue_t *q, struct request *rq, int gfp_mask)
+{
+	struct cfq_data *cfqd = q->elevator.elevator_data;
+	struct cfq_rq *crq = mempool_alloc(cfqd->crq_pool, gfp_mask);
+
+	if (crq) {
+		RB_CLEAR(&crq->rb_node);
+		crq->request = rq;
+		crq->cfq_queue = NULL;
+		INIT_LIST_HEAD(&crq->hash);
+		rq->elevator_private = crq;
+		return 0;
+	}
+
+	return 1;
+}
+
+static void cfq_exit(request_queue_t *q, elevator_t *e)
+{
+	struct cfq_data *cfqd = e->elevator_data;
+
+	e->elevator_data = NULL;
+	mempool_destroy(cfqd->crq_pool);
+	kfree(cfqd->crq_hash);
+	kfree(cfqd->cfq_hash);
+	kfree(cfqd);
+}
+
+static int cfq_init(request_queue_t *q, elevator_t *e)
+{
+	struct cfq_data *cfqd;
+	int i;
+
+	cfqd = kmalloc(sizeof(*cfqd), GFP_KERNEL);
+	if (!cfqd)
+		return -ENOMEM;
+
+	memset(cfqd, 0, sizeof(*cfqd));
+	INIT_LIST_HEAD(&cfqd->rr_list);
+
+	cfqd->crq_hash = kmalloc(sizeof(struct list_head) * CFQ_MHASH_ENTRIES, GFP_KERNEL);
+	if (!cfqd->crq_hash)
+		goto out_crqhash;
+
+	cfqd->cfq_hash = kmalloc(sizeof(struct list_head) * CFQ_QHASH_ENTRIES, GFP_KERNEL);
+	if (!cfqd->cfq_hash)
+		goto out_cfqhash;
+
+	cfqd->crq_pool = mempool_create(BLKDEV_MIN_RQ, mempool_alloc_slab, mempool_free_slab, crq_pool);
+	if (!cfqd->crq_pool)
+		goto out_crqpool;
+
+	for (i = 0; i < CFQ_MHASH_ENTRIES; i++)
+		INIT_LIST_HEAD(&cfqd->crq_hash[i]);
+	for (i = 0; i < CFQ_QHASH_ENTRIES; i++)
+		INIT_LIST_HEAD(&cfqd->cfq_hash[i]);
+
+	cfqd->dispatch = &q->queue_head;
+	e->elevator_data = cfqd;
+
+	/*
+	 * just set it to some high value, we want anyone to be able to queue
+	 * some requests. fairness is handled differently
+	 */
+	cfqd->max_queued = q->nr_requests;
+	q->nr_requests = 8192;
+
+	return 0;
+out_crqpool:
+	kfree(cfqd->cfq_hash);
+out_cfqhash:
+	kfree(cfqd->crq_hash);
+out_crqhash:
+	kfree(cfqd);
+	return -ENOMEM;
+}
+
+static int __init cfq_slab_setup(void)
+{
+	crq_pool = kmem_cache_create("crq_pool", sizeof(struct cfq_rq), 0, 0,
+					NULL, NULL);
+
+	if (!crq_pool)
+		panic("cfq_iosched: can't init crq pool\n");
+
+	cfq_pool = kmem_cache_create("cfq_pool", sizeof(struct cfq_queue), 0, 0,
+					NULL, NULL);
+
+	if (!cfq_pool)
+		panic("cfq_iosched: can't init cfq pool\n");
+
+	cfq_mpool = mempool_create(64, mempool_alloc_slab, mempool_free_slab, cfq_pool);
+
+	if (!cfq_mpool)
+		panic("cfq_iosched: can't init cfq mpool\n");
+
+	return 0;
+}
+
+subsys_initcall(cfq_slab_setup);
+
+elevator_t iosched_cfq = {
+	.elevator_name =		"cfq",
+	.elevator_merge_fn = 		cfq_merge,
+	.elevator_merged_fn =		cfq_merged_request,
+	.elevator_merge_req_fn =	cfq_merged_requests,
+	.elevator_next_req_fn =		cfq_next_request,
+	.elevator_add_req_fn =		cfq_insert_request,
+	.elevator_remove_req_fn =	cfq_remove_request,
+	.elevator_queue_empty_fn =	cfq_queue_empty,
+	.elevator_former_req_fn =	cfq_former_request,
+	.elevator_latter_req_fn =	cfq_latter_request,
+	.elevator_set_req_fn =		cfq_set_request,
+	.elevator_put_req_fn =		cfq_put_request,
+	.elevator_may_queue_fn =	cfq_may_queue,
+	.elevator_init_fn =		cfq_init,
+	.elevator_exit_fn =		cfq_exit,
+};
+
+EXPORT_SYMBOL(iosched_cfq);
--- diff/drivers/char/ipmi/ipmi_bt_sm.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/char/ipmi/ipmi_bt_sm.c	2004-04-21 10:45:34.072523688 +0100
@@ -0,0 +1,513 @@
+/*
+ *  ipmi_bt_sm.c
+ *
+ *  The state machine for an Open IPMI BT sub-driver under ipmi_si.c, part
+ *  of the driver architecture at http://sourceforge.net/project/openipmi
+ *
+ *  Author:	Rocky Craig <first.last@hp.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License as published by the
+ *  Free Software Foundation; either version 2 of the License, or (at your
+ *  option) any later version.
+ *
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#include <linux/kernel.h> /* For printk. */
+#include <linux/string.h>
+#include <linux/ipmi_msgdefs.h>		/* for completion codes */
+#include "ipmi_si_sm.h"
+
+#define IPMI_BT_VERSION "v31"
+
+static int bt_debug = 0x00;	/* Production value 0, see following flags */
+
+#define	BT_DEBUG_ENABLE	1
+#define BT_DEBUG_MSG	2
+#define BT_DEBUG_STATES	4
+
+/* Typical "Get BT Capabilities" values are 2-3 retries, 5-10 seconds,
+   and 64 byte buffers.  However, one HP implementation wants 255 bytes of
+   buffer (with a documented message of 160 bytes) so go for the max.
+   Since the Open IPMI architecture is single-message oriented at this
+   stage, the queue depth of BT is of no concern. */
+
+#define BT_NORMAL_TIMEOUT	2000000	/* seconds in microseconds */
+#define BT_RETRY_LIMIT		2
+#define BT_RESET_DELAY		6000000	/* 6 seconds after warm reset */
+
+enum bt_states {
+	BT_STATE_IDLE,
+	BT_STATE_XACTION_START,
+	BT_STATE_WRITE_BYTES,
+	BT_STATE_WRITE_END,
+	BT_STATE_WRITE_CONSUME,
+	BT_STATE_B2H_WAIT,
+	BT_STATE_READ_END,
+	BT_STATE_RESET1,		/* These must come last */
+	BT_STATE_RESET2,
+	BT_STATE_RESET3,
+	BT_STATE_RESTART,
+	BT_STATE_HOSED
+};
+
+struct si_sm_data {
+	enum bt_states	state;
+	enum bt_states	last_state;	/* assist printing and resets */
+	unsigned char	seq;		/* BT sequence number */
+	struct si_sm_io	*io;
+        unsigned char	write_data[IPMI_MAX_MSG_LENGTH];
+        int		write_count;
+        unsigned char	read_data[IPMI_MAX_MSG_LENGTH];
+        int		read_count;
+        int		truncated;
+        long		timeout;
+        unsigned int	error_retries;	/* end of "common" fields */
+	int		nonzero_status;	/* hung BMCs stay all 0 */
+};
+
+#define BT_CLR_WR_PTR	0x01	/* See IPMI 1.5 table 11.6.4 */
+#define BT_CLR_RD_PTR	0x02
+#define BT_H2B_ATN	0x04
+#define BT_B2H_ATN	0x08
+#define BT_SMS_ATN	0x10
+#define BT_OEM0		0x20
+#define BT_H_BUSY	0x40
+#define BT_B_BUSY	0x80
+
+/* Some bits are toggled on each write: write once to set it, once
+   more to clear it; writing a zero does nothing.  To absolutely
+   clear it, check its state and write if set.  This avoids the "get
+   current then use as mask" scheme to modify one bit.  Note that the
+   variable "bt" is hardcoded into these macros. */
+
+#define BT_STATUS	bt->io->inputb(bt->io, 0)
+#define BT_CONTROL(x)	bt->io->outputb(bt->io, 0, x)
+
+#define BMC2HOST	bt->io->inputb(bt->io, 1)
+#define HOST2BMC(x)	bt->io->outputb(bt->io, 1, x)
+
+#define BT_INTMASK_R	bt->io->inputb(bt->io, 2)
+#define BT_INTMASK_W(x)	bt->io->outputb(bt->io, 2, x)
+
+/* Convenience routines for debugging.  These are not multi-open safe!
+   Note the macros have hardcoded variables in them. */
+
+static char *state2txt(unsigned char state)
+{
+	switch (state) {
+		case BT_STATE_IDLE:		return("IDLE");
+		case BT_STATE_XACTION_START:	return("XACTION");
+		case BT_STATE_WRITE_BYTES:	return("WR_BYTES");
+		case BT_STATE_WRITE_END:	return("WR_END");
+		case BT_STATE_WRITE_CONSUME:	return("WR_CONSUME");
+		case BT_STATE_B2H_WAIT:		return("B2H_WAIT");
+		case BT_STATE_READ_END:		return("RD_END");
+		case BT_STATE_RESET1:		return("RESET1");
+		case BT_STATE_RESET2:		return("RESET2");
+		case BT_STATE_RESET3:		return("RESET3");
+		case BT_STATE_RESTART:		return("RESTART");
+		case BT_STATE_HOSED:		return("HOSED");
+	}
+	return("BAD STATE");
+}
+#define STATE2TXT state2txt(bt->state)
+
+static char *status2txt(unsigned char status, char *buf)
+{
+	strcpy(buf, "[ ");
+	if (status & BT_B_BUSY) strcat(buf, "B_BUSY ");
+	if (status & BT_H_BUSY) strcat(buf, "H_BUSY ");
+	if (status & BT_OEM0) strcat(buf, "OEM0 ");
+	if (status & BT_SMS_ATN) strcat(buf, "SMS ");
+	if (status & BT_B2H_ATN) strcat(buf, "B2H ");
+	if (status & BT_H2B_ATN) strcat(buf, "H2B ");
+	strcat(buf, "]");
+	return buf;
+}
+#define STATUS2TXT(buf) status2txt(status, buf)
+
+/* This will be called from within this module on a hosed condition */
+#define FIRST_SEQ	0
+static unsigned int bt_init_data(struct si_sm_data *bt, struct si_sm_io *io)
+{
+	bt->state = BT_STATE_IDLE;
+	bt->last_state = BT_STATE_IDLE;
+	bt->seq = FIRST_SEQ;
+	bt->io = io;
+	bt->write_count = 0;
+	bt->read_count = 0;
+	bt->error_retries = 0;
+	bt->nonzero_status = 0;
+	bt->truncated = 0;
+	bt->timeout = BT_NORMAL_TIMEOUT;
+	return 3; /* We claim 3 bytes of space; ought to check SPMI table */
+}
+
+static int bt_start_transaction(struct si_sm_data *bt,
+				unsigned char *data,
+				unsigned int size)
+{
+	unsigned int i;
+
+	if ((size < 2) || (size > IPMI_MAX_MSG_LENGTH)) return -1;
+
+	if ((bt->state != BT_STATE_IDLE) && (bt->state != BT_STATE_HOSED))
+		return -2;
+
+	if (bt_debug & BT_DEBUG_MSG) {
+    		printk(KERN_WARNING "+++++++++++++++++++++++++++++++++++++\n");
+		printk(KERN_WARNING "BT: write seq=0x%02X:", bt->seq);
+		for (i = 0; i < size; i ++) printk (" %02x", data[i]);
+		printk("\n");
+	}
+	bt->write_data[0] = size + 1;	/* all data plus seq byte */
+	bt->write_data[1] = *data;	/* NetFn/LUN */
+	bt->write_data[2] = bt->seq;
+	memcpy(bt->write_data + 3, data + 1, size - 1);
+	bt->write_count = size + 2;
+
+	bt->error_retries = 0;
+	bt->nonzero_status = 0;
+	bt->read_count = 0;
+	bt->truncated = 0;
+	bt->state = BT_STATE_XACTION_START;
+	bt->last_state = BT_STATE_IDLE;
+	bt->timeout = BT_NORMAL_TIMEOUT;
+	return 0;
+}
+
+/* After the upper state machine has been told SI_SM_TRANSACTION_COMPLETE
+   it calls this.  Strip out the length and seq bytes. */
+
+static int bt_get_result(struct si_sm_data *bt,
+			   unsigned char *data,
+			   unsigned int length)
+{
+	int i, msg_len;
+
+	msg_len = bt->read_count - 2;		/* account for length & seq */
+	/* Always NetFn, Cmd, cCode */
+	if (msg_len < 3 || msg_len > IPMI_MAX_MSG_LENGTH) {
+		printk(KERN_WARNING "BT results: bad msg_len = %d\n", msg_len);
+		data[0] = bt->write_data[1] | 0x4;	/* Kludge a response */
+		data[1] = bt->write_data[3];
+		data[2] = IPMI_ERR_UNSPECIFIED;
+		msg_len = 3;
+	} else {
+		data[0] = bt->read_data[1];
+		data[1] = bt->read_data[3];
+		if (length < msg_len) bt->truncated = 1;
+		if (bt->truncated) {	/* can be set in read_all_bytes() */
+			data[2] = IPMI_ERR_MSG_TRUNCATED;
+			msg_len = 3;
+		} else memcpy(data + 2, bt->read_data + 4, msg_len - 2);
+
+		if (bt_debug & BT_DEBUG_MSG) {
+			printk (KERN_WARNING "BT: res (raw)");
+			for (i = 0; i < msg_len; i++) printk(" %02x", data[i]);
+			printk ("\n");
+		}
+	}
+	bt->read_count = 0;	/* paranoia */
+	return msg_len;
+}
+
+/* This bit's functionality is optional */
+#define BT_BMC_HWRST	0x80
+
+static void reset_flags(struct si_sm_data *bt)
+{
+	if (BT_STATUS & BT_H_BUSY) BT_CONTROL(BT_H_BUSY);
+	if (BT_STATUS & BT_B_BUSY) BT_CONTROL(BT_B_BUSY);
+	BT_CONTROL(BT_CLR_WR_PTR);
+	BT_CONTROL(BT_SMS_ATN);
+	BT_INTMASK_W(BT_BMC_HWRST);
+#ifdef DEVELOPMENT_ONLY_NOT_FOR_PRODUCTION
+	if (BT_STATUS & BT_B2H_ATN) {
+		int i;
+		BT_CONTROL(BT_H_BUSY);
+		BT_CONTROL(BT_B2H_ATN);
+		BT_CONTROL(BT_CLR_RD_PTR);
+		for (i = 0; i < IPMI_MAX_MSG_LENGTH + 2; i++) BMC2HOST;
+		BT_CONTROL(BT_H_BUSY);
+	}
+#endif
+}
+
+static inline void write_all_bytes(struct si_sm_data *bt)
+{
+	int i;
+
+	if (bt_debug & BT_DEBUG_MSG) {
+    		printk(KERN_WARNING "BT: write %d bytes seq=0x%02X",
+			bt->write_count, bt->seq);
+		for (i = 0; i < bt->write_count; i++)
+			printk (" %02x", bt->write_data[i]);
+		printk ("\n");
+	}
+	for (i = 0; i < bt->write_count; i++) HOST2BMC(bt->write_data[i]);
+}
+
+static inline int read_all_bytes(struct si_sm_data *bt)
+{
+	unsigned char i;
+
+	bt->read_data[0] = BMC2HOST;
+	bt->read_count = bt->read_data[0];
+	if (bt_debug & BT_DEBUG_MSG)
+    		printk(KERN_WARNING "BT: read %d bytes:", bt->read_count);
+
+	/* minimum: length, NetFn, Seq, Cmd, cCode == 5 total, or 4 more
+	   following the length byte. */
+	if (bt->read_count < 4 || bt->read_count >= IPMI_MAX_MSG_LENGTH) {
+		if (bt_debug & BT_DEBUG_MSG)
+			printk("bad length %d\n", bt->read_count);
+		bt->truncated = 1;
+		return 1;	/* let next XACTION START clean it up */
+	}
+	for (i = 1; i <= bt->read_count; i++) bt->read_data[i] = BMC2HOST;
+	bt->read_count++;	/* account for the length byte */
+
+	if (bt_debug & BT_DEBUG_MSG) {
+	    	for (i = 0; i < bt->read_count; i++)
+			printk (" %02x", bt->read_data[i]);
+	    	printk ("\n");
+	}
+	if (bt->seq != bt->write_data[2])	/* idiot check */
+		printk(KERN_WARNING "BT: internal error: sequence mismatch\n");
+
+	/* per the spec, the (NetFn, Seq, Cmd) tuples should match */
+	if ((bt->read_data[3] == bt->write_data[3]) &&		/* Cmd */
+        	(bt->read_data[2] == bt->write_data[2]) &&	/* Sequence */
+        	((bt->read_data[1] & 0xF8) == (bt->write_data[1] & 0xF8)))
+			return 1;
+
+	if (bt_debug & BT_DEBUG_MSG) printk(KERN_WARNING "BT: bad packet: "
+		"want 0x(%02X, %02X, %02X) got (%02X, %02X, %02X)\n",
+		bt->write_data[1], bt->write_data[2], bt->write_data[3],
+		bt->read_data[1],  bt->read_data[2],  bt->read_data[3]);
+	return 0;
+}
+
+/* Modifies bt->state appropriately, need to get into the bt_event() switch */
+
+static void error_recovery(struct si_sm_data *bt, char *reason)
+{
+	unsigned char status;
+	char buf[40]; /* For getting status */
+
+	bt->timeout = BT_NORMAL_TIMEOUT; /* various places want to retry */
+
+	status = BT_STATUS;
+	printk(KERN_WARNING "BT: %s in %s %s ", reason, STATE2TXT,
+	       STATUS2TXT(buf));
+
+	(bt->error_retries)++;
+	if (bt->error_retries > BT_RETRY_LIMIT) {
+		printk("retry limit (%d) exceeded\n", BT_RETRY_LIMIT);
+		bt->state = BT_STATE_HOSED;
+		if (!bt->nonzero_status)
+			printk(KERN_ERR "IPMI: BT stuck, try power cycle\n");
+		else if (bt->seq == FIRST_SEQ + BT_RETRY_LIMIT) {
+			/* most likely during insmod */
+			printk(KERN_WARNING "IPMI: BT reset (takes 5 secs)\n");
+        		bt->state = BT_STATE_RESET1;
+		}
+	return;
+	}
+
+	/* Sometimes the BMC queues get in an "off-by-one" state...*/
+	if ((bt->state == BT_STATE_B2H_WAIT) && (status & BT_B2H_ATN)) {
+    		printk("retry B2H_WAIT\n");
+		return;
+	}
+
+	printk("restart command\n");
+	bt->state = BT_STATE_RESTART;
+}
+
+/* Check the status and (possibly) advance the BT state machine.  The
+   default return is SI_SM_CALL_WITH_DELAY. */
+
+static enum si_sm_result bt_event(struct si_sm_data *bt, long time)
+{
+	unsigned char status;
+	char buf[40]; /* For getting status */
+	int i;
+
+	status = BT_STATUS;
+	bt->nonzero_status |= status;
+
+	if ((bt_debug & BT_DEBUG_STATES) && (bt->state != bt->last_state))
+		printk(KERN_WARNING "BT: %s %s TO=%ld - %ld \n",
+			STATE2TXT,
+			STATUS2TXT(buf),
+			bt->timeout,
+			time);
+	bt->last_state = bt->state;
+
+	if (bt->state == BT_STATE_HOSED) return SI_SM_HOSED;
+
+	if (bt->state != BT_STATE_IDLE) {	/* do timeout test */
+
+		/* Certain states, on error conditions, can lock up a CPU
+		   because they are effectively in an infinite loop with
+		   CALL_WITHOUT_DELAY (right back here with time == 0).
+		   Prevent infinite lockup by ALWAYS decrementing timeout. */
+
+    	/* FIXME: bt_event is sometimes called with time > BT_NORMAL_TIMEOUT
+              (noticed in ipmi_smic_sm.c January 2004) */
+
+		if ((time <= 0) || (time >= BT_NORMAL_TIMEOUT)) time = 100;
+		bt->timeout -= time;
+		if ((bt->timeout < 0) && (bt->state < BT_STATE_RESET1)) {
+			error_recovery(bt, "timed out");
+			return SI_SM_CALL_WITHOUT_DELAY;
+		}
+	}
+
+	switch (bt->state) {
+
+    	case BT_STATE_IDLE:	/* check for asynchronous messages */
+		if (status & BT_SMS_ATN) {
+			BT_CONTROL(BT_SMS_ATN);	/* clear it */
+			return SI_SM_ATTN;
+		}
+		return SI_SM_IDLE;
+
+	case BT_STATE_XACTION_START:
+		if (status & BT_H_BUSY) {
+			BT_CONTROL(BT_H_BUSY);
+			break;
+		}
+    		if (status & BT_B2H_ATN) break;
+		bt->state = BT_STATE_WRITE_BYTES;
+		return SI_SM_CALL_WITHOUT_DELAY;	/* for logging */
+
+	case BT_STATE_WRITE_BYTES:
+		if (status & (BT_B_BUSY | BT_H2B_ATN)) break;
+		BT_CONTROL(BT_CLR_WR_PTR);
+		write_all_bytes(bt);
+		BT_CONTROL(BT_H2B_ATN);	/* clears too fast to catch? */
+		bt->state = BT_STATE_WRITE_CONSUME;
+		return SI_SM_CALL_WITHOUT_DELAY; /* it MIGHT sail through */
+
+	case BT_STATE_WRITE_CONSUME: /* BMCs usually blow right thru here */
+        	if (status & (BT_H2B_ATN | BT_B_BUSY)) break;
+		bt->state = BT_STATE_B2H_WAIT;
+		/* fall through with status */
+
+	/* Stay in BT_STATE_B2H_WAIT until a packet matches.  However, spinning
+	   hard here, constantly reading status, seems to hold off the
+	   generation of B2H_ATN so ALWAYS return CALL_WITH_DELAY. */
+
+	case BT_STATE_B2H_WAIT:
+    		if (!(status & BT_B2H_ATN)) break;
+
+		/* Assume ordered, uncached writes: no need to wait */
+		if (!(status & BT_H_BUSY)) BT_CONTROL(BT_H_BUSY); /* set */
+		BT_CONTROL(BT_B2H_ATN);		/* clear it, ACK to the BMC */
+		BT_CONTROL(BT_CLR_RD_PTR);	/* reset the queue */
+		i = read_all_bytes(bt);
+		BT_CONTROL(BT_H_BUSY);		/* clear */
+		if (!i) break;			/* Try this state again */
+		bt->state = BT_STATE_READ_END;
+		return SI_SM_CALL_WITHOUT_DELAY;	/* for logging */
+
+    	case BT_STATE_READ_END:
+
+		/* I could wait on BT_H_BUSY to go clear for a truly clean
+		   exit.  However, this is already done in XACTION_START
+		   and the (possible) extra loop/status/possible wait affects
+		   performance.  So, as long as it works, just ignore H_BUSY */
+
+#ifdef MAKE_THIS_TRUE_IF_NECESSARY
+
+		if (status & BT_H_BUSY) break;
+#endif
+		bt->seq++;
+		bt->state = BT_STATE_IDLE;
+		return SI_SM_TRANSACTION_COMPLETE;
+
+	case BT_STATE_RESET1:
+    		reset_flags(bt);
+    		bt->timeout = BT_RESET_DELAY;;
+		bt->state = BT_STATE_RESET2;
+		break;
+
+	case BT_STATE_RESET2:		/* Send a soft reset */
+		BT_CONTROL(BT_CLR_WR_PTR);
+		HOST2BMC(3);		/* number of bytes following */
+		HOST2BMC(0x18);		/* NetFn/LUN == Application, LUN 0 */
+		HOST2BMC(42);		/* Sequence number */
+		HOST2BMC(3);		/* Cmd == Soft reset */
+		BT_CONTROL(BT_H2B_ATN);
+		bt->state = BT_STATE_RESET3;
+		break;
+
+	case BT_STATE_RESET3:
+		if (bt->timeout > 0) return SI_SM_CALL_WITH_DELAY;
+		bt->state = BT_STATE_RESTART;	/* printk in debug modes */
+		break;
+
+	case BT_STATE_RESTART:		/* don't reset retries! */
+		bt->write_data[2] = ++bt->seq;
+		bt->read_count = 0;
+		bt->nonzero_status = 0;
+		bt->timeout = BT_NORMAL_TIMEOUT;
+		bt->state = BT_STATE_XACTION_START;
+		break;
+
+	default:	/* HOSED is supposed to be caught much earlier */
+		error_recovery(bt, "internal logic error");
+		break;
+  	}
+  	return SI_SM_CALL_WITH_DELAY;
+}
+
+static int bt_detect(struct si_sm_data *bt)
+{
+	/* It's impossible for the BT status and interrupt registers to be
+	   all 1's, (assuming a properly functioning, self-initialized BMC)
+	   but that's what you get from reading a bogus address, so we
+	   test that first.  The calling routine uses negative logic. */
+
+	if ((BT_STATUS == 0xFF) && (BT_INTMASK_R == 0xFF)) return 1;
+	reset_flags(bt);
+	return 0;
+}
+
+static void bt_cleanup(struct si_sm_data *bt)
+{
+}
+
+static int bt_size(void)
+{
+	return sizeof(struct si_sm_data);
+}
+
+struct si_sm_handlers bt_smi_handlers =
+{
+	.version           = IPMI_BT_VERSION,
+	.init_data         = bt_init_data,
+	.start_transaction = bt_start_transaction,
+	.get_result        = bt_get_result,
+	.event             = bt_event,
+	.detect            = bt_detect,
+	.cleanup           = bt_cleanup,
+	.size              = bt_size,
+};
--- diff/drivers/char/ipmi/ipmi_si_intf.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/char/ipmi/ipmi_si_intf.c	2004-04-21 10:45:34.092520648 +0100
@@ -0,0 +1,2053 @@
+/*
+ * ipmi_si.c
+ *
+ * The interface to the IPMI driver for the system interfaces (KCS, SMIC,
+ * BT).
+ *
+ * Author: MontaVista Software, Inc.
+ *         Corey Minyard <minyard@mvista.com>
+ *         source@mvista.com
+ *
+ * Copyright 2002 MontaVista Software Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License as published by the
+ *  Free Software Foundation; either version 2 of the License, or (at your
+ *  option) any later version.
+ *
+ *
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ * This file holds the "policy" for the interface to the SMI state
+ * machine.  It does the configuration, handles timers and interrupts,
+ * and drives the real SMI state machine.
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <asm/system.h>
+#include <linux/sched.h>
+#include <linux/timer.h>
+#include <linux/errno.h>
+#include <linux/spinlock.h>
+#include <linux/slab.h>
+#include <linux/delay.h>
+#include <linux/list.h>
+#include <linux/pci.h>
+#include <linux/ioport.h>
+#include <linux/irq.h>
+#ifdef CONFIG_HIGH_RES_TIMERS
+#include <linux/hrtime.h>
+# if defined(schedule_next_int)
+/* Old high-res timer code, do translations. */
+#  define get_arch_cycles(a) quick_update_jiffies_sub(a)
+#  define arch_cycles_per_jiffy cycles_per_jiffies
+# endif
+static inline void add_usec_to_timer(struct timer_list *t, long v)
+{
+	t->sub_expires += nsec_to_arch_cycle(v * 1000);
+	while (t->sub_expires >= arch_cycles_per_jiffy)
+	{
+		t->expires++;
+		t->sub_expires -= arch_cycles_per_jiffy;
+	}
+}
+#endif
+#include <linux/interrupt.h>
+#include <linux/rcupdate.h>
+#include <linux/ipmi_smi.h>
+#include <asm/io.h>
+#include "ipmi_si_sm.h"
+#include <linux/init.h>
+
+#define IPMI_SI_VERSION "v31"
+
+/* Measure times between events in the driver. */
+#undef DEBUG_TIMING
+
+/* Call every 10 ms. */
+#define SI_TIMEOUT_TIME_USEC	10000
+#define SI_USEC_PER_JIFFY	(1000000/HZ)
+#define SI_TIMEOUT_JIFFIES	(SI_TIMEOUT_TIME_USEC/SI_USEC_PER_JIFFY)
+#define SI_SHORT_TIMEOUT_USEC  250 /* .25ms when the SM request a
+                                       short timeout */
+
+enum si_intf_state {
+	SI_NORMAL,
+	SI_GETTING_FLAGS,
+	SI_GETTING_EVENTS,
+	SI_CLEARING_FLAGS,
+	SI_CLEARING_FLAGS_THEN_SET_IRQ,
+	SI_GETTING_MESSAGES,
+	SI_ENABLE_INTERRUPTS1,
+	SI_ENABLE_INTERRUPTS2
+	/* FIXME - add watchdog stuff. */
+};
+
+enum si_type {
+    SI_KCS, SI_SMIC, SI_BT
+};
+
+struct smi_info
+{
+	ipmi_smi_t             intf;
+	struct si_sm_data      *si_sm;
+	struct si_sm_handlers  *handlers;
+	enum si_type           si_type;
+	spinlock_t             si_lock;
+	spinlock_t             msg_lock;
+	struct list_head       xmit_msgs;
+	struct list_head       hp_xmit_msgs;
+	struct ipmi_smi_msg    *curr_msg;
+	enum si_intf_state     si_state;
+
+	/* Used to handle the various types of I/O that can occur with
+           IPMI */
+	struct si_sm_io io;
+	int (*io_setup)(struct smi_info *info);
+	void (*io_cleanup)(struct smi_info *info);
+	int (*irq_setup)(struct smi_info *info);
+	void (*irq_cleanup)(struct smi_info *info);
+	unsigned int io_size;
+
+	/* Flags from the last GET_MSG_FLAGS command, used when an ATTN
+	   is set to hold the flags until we are done handling everything
+	   from the flags. */
+#define RECEIVE_MSG_AVAIL	0x01
+#define EVENT_MSG_BUFFER_FULL	0x02
+#define WDT_PRE_TIMEOUT_INT	0x08
+	unsigned char       msg_flags;
+
+	/* If set to true, this will request events the next time the
+	   state machine is idle. */
+	atomic_t            req_events;
+
+	/* If true, run the state machine to completion on every send
+	   call.  Generally used after a panic to make sure stuff goes
+	   out. */
+	int                 run_to_completion;
+
+	/* The I/O port of an SI interface. */
+	int                 port;
+
+	/* zero if no irq; */
+	int                 irq;
+
+	/* The timer for this si. */
+	struct timer_list   si_timer;
+
+	/* The time (in jiffies) the last timeout occurred at. */
+	unsigned long       last_timeout_jiffies;
+
+	/* Used to gracefully stop the timer without race conditions. */
+	volatile int        stop_operation;
+	volatile int        timer_stopped;
+
+	/* The driver will disable interrupts when it gets into a
+	   situation where it cannot handle messages due to lack of
+	   memory.  Once that situation clears up, it will re-enable
+	   interrupts. */
+	int interrupt_disabled;
+
+	unsigned char ipmi_si_dev_rev;
+	unsigned char ipmi_si_fw_rev_major;
+	unsigned char ipmi_si_fw_rev_minor;
+	unsigned char ipmi_version_major;
+	unsigned char ipmi_version_minor;
+
+	/* Counters and things for the proc filesystem. */
+	spinlock_t count_lock;
+	unsigned long short_timeouts;
+	unsigned long long_timeouts;
+	unsigned long timeout_restarts;
+	unsigned long idles;
+	unsigned long interrupts;
+	unsigned long attentions;
+	unsigned long flag_fetches;
+	unsigned long hosed_count;
+	unsigned long complete_transactions;
+	unsigned long events;
+	unsigned long watchdog_pretimeouts;
+	unsigned long incoming_messages;
+};
+
+static void si_restart_short_timer(struct smi_info *smi_info);
+
+static void deliver_recv_msg(struct smi_info *smi_info,
+			     struct ipmi_smi_msg *msg)
+{
+	/* Deliver the message to the upper layer with the lock
+           released. */
+	spin_unlock(&(smi_info->si_lock));
+	ipmi_smi_msg_received(smi_info->intf, msg);
+	spin_lock(&(smi_info->si_lock));
+}
+
+static void return_hosed_msg(struct smi_info *smi_info)
+{
+	struct ipmi_smi_msg *msg = smi_info->curr_msg;
+
+	/* Make it a reponse */
+	msg->rsp[0] = msg->data[0] | 4;
+	msg->rsp[1] = msg->data[1];
+	msg->rsp[2] = 0xFF; /* Unknown error. */
+	msg->rsp_size = 3;
+
+	smi_info->curr_msg = NULL;
+	deliver_recv_msg(smi_info, msg);
+}
+
+static enum si_sm_result start_next_msg(struct smi_info *smi_info)
+{
+	int              rv;
+	struct list_head *entry = NULL;
+#ifdef DEBUG_TIMING
+	struct timeval t;
+#endif
+
+	/* No need to save flags, we aleady have interrupts off and we
+	   already hold the SMI lock. */
+	spin_lock(&(smi_info->msg_lock));
+
+	/* Pick the high priority queue first. */
+	if (! list_empty(&(smi_info->hp_xmit_msgs))) {
+		entry = smi_info->hp_xmit_msgs.next;
+	} else if (! list_empty(&(smi_info->xmit_msgs))) {
+		entry = smi_info->xmit_msgs.next;
+	}
+
+	if (!entry) {
+		smi_info->curr_msg = NULL;
+		rv = SI_SM_IDLE;
+	} else {
+		int err;
+
+		list_del(entry);
+		smi_info->curr_msg = list_entry(entry,
+						struct ipmi_smi_msg,
+						link);
+#ifdef DEBUG_TIMING
+		do_gettimeofday(&t);
+		printk("**Start2: %d.%9.9d\n", t.tv_sec, t.tv_usec);
+#endif
+		err = smi_info->handlers->start_transaction(
+			smi_info->si_sm,
+			smi_info->curr_msg->data,
+			smi_info->curr_msg->data_size);
+		if (err) {
+			return_hosed_msg(smi_info);
+		}
+
+		rv = SI_SM_CALL_WITHOUT_DELAY;
+	}
+	spin_unlock(&(smi_info->msg_lock));
+
+	return rv;
+}
+
+static void start_enable_irq(struct smi_info *smi_info)
+{
+	unsigned char msg[2];
+
+	/* If we are enabling interrupts, we have to tell the
+	   BMC to use them. */
+	msg[0] = (IPMI_NETFN_APP_REQUEST << 2);
+	msg[1] = IPMI_GET_BMC_GLOBAL_ENABLES_CMD;
+
+	smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2);
+	smi_info->si_state = SI_ENABLE_INTERRUPTS1;
+}
+
+static void start_clear_flags(struct smi_info *smi_info)
+{
+	unsigned char msg[3];
+
+	/* Make sure the watchdog pre-timeout flag is not set at startup. */
+	msg[0] = (IPMI_NETFN_APP_REQUEST << 2);
+	msg[1] = IPMI_CLEAR_MSG_FLAGS_CMD;
+	msg[2] = WDT_PRE_TIMEOUT_INT;
+
+	smi_info->handlers->start_transaction(smi_info->si_sm, msg, 3);
+	smi_info->si_state = SI_CLEARING_FLAGS;
+}
+
+/* When we have a situtaion where we run out of memory and cannot
+   allocate messages, we just leave them in the BMC and run the system
+   polled until we can allocate some memory.  Once we have some
+   memory, we will re-enable the interrupt. */
+static inline void disable_si_irq(struct smi_info *smi_info)
+{
+	if ((smi_info->irq) && (!smi_info->interrupt_disabled)) {
+		disable_irq_nosync(smi_info->irq);
+		smi_info->interrupt_disabled = 1;
+	}
+}
+
+static inline void enable_si_irq(struct smi_info *smi_info)
+{
+	if ((smi_info->irq) && (smi_info->interrupt_disabled)) {
+		enable_irq(smi_info->irq);
+		smi_info->interrupt_disabled = 0;
+	}
+}
+
+static void handle_flags(struct smi_info *smi_info)
+{
+	if (smi_info->msg_flags & WDT_PRE_TIMEOUT_INT) {
+		/* Watchdog pre-timeout */
+		spin_lock(&smi_info->count_lock);
+		smi_info->watchdog_pretimeouts++;
+		spin_unlock(&smi_info->count_lock);
+
+		start_clear_flags(smi_info);
+		smi_info->msg_flags &= ~WDT_PRE_TIMEOUT_INT;
+		spin_unlock(&(smi_info->si_lock));
+		ipmi_smi_watchdog_pretimeout(smi_info->intf);
+		spin_lock(&(smi_info->si_lock));
+	} else if (smi_info->msg_flags & RECEIVE_MSG_AVAIL) {
+		/* Messages available. */
+		smi_info->curr_msg = ipmi_alloc_smi_msg();
+		if (!smi_info->curr_msg) {
+			disable_si_irq(smi_info);
+			smi_info->si_state = SI_NORMAL;
+			return;
+		}
+		enable_si_irq(smi_info);
+
+		smi_info->curr_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2);
+		smi_info->curr_msg->data[1] = IPMI_GET_MSG_CMD;
+		smi_info->curr_msg->data_size = 2;
+
+		smi_info->handlers->start_transaction(
+			smi_info->si_sm,
+			smi_info->curr_msg->data,
+			smi_info->curr_msg->data_size);
+		smi_info->si_state = SI_GETTING_MESSAGES;
+	} else if (smi_info->msg_flags & EVENT_MSG_BUFFER_FULL) {
+		/* Events available. */
+		smi_info->curr_msg = ipmi_alloc_smi_msg();
+		if (!smi_info->curr_msg) {
+			disable_si_irq(smi_info);
+			smi_info->si_state = SI_NORMAL;
+			return;
+		}
+		enable_si_irq(smi_info);
+
+		smi_info->curr_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2);
+		smi_info->curr_msg->data[1] = IPMI_READ_EVENT_MSG_BUFFER_CMD;
+		smi_info->curr_msg->data_size = 2;
+
+		smi_info->handlers->start_transaction(
+			smi_info->si_sm,
+			smi_info->curr_msg->data,
+			smi_info->curr_msg->data_size);
+		smi_info->si_state = SI_GETTING_EVENTS;
+	} else {
+		smi_info->si_state = SI_NORMAL;
+	}
+}
+
+static void handle_transaction_done(struct smi_info *smi_info)
+{
+	struct ipmi_smi_msg *msg;
+#ifdef DEBUG_TIMING
+	struct timeval t;
+
+	do_gettimeofday(&t);
+	printk("**Done: %d.%9.9d\n", t.tv_sec, t.tv_usec);
+#endif
+	switch (smi_info->si_state) {
+	case SI_NORMAL:
+		if (!smi_info->curr_msg)
+			break;
+
+		smi_info->curr_msg->rsp_size
+			= smi_info->handlers->get_result(
+				smi_info->si_sm,
+				smi_info->curr_msg->rsp,
+				IPMI_MAX_MSG_LENGTH);
+
+		/* Do this here becase deliver_recv_msg() releases the
+		   lock, and a new message can be put in during the
+		   time the lock is released. */
+		msg = smi_info->curr_msg;
+		smi_info->curr_msg = NULL;
+		deliver_recv_msg(smi_info, msg);
+		break;
+
+	case SI_GETTING_FLAGS:
+	{
+		unsigned char msg[4];
+		unsigned int  len;
+
+		/* We got the flags from the SMI, now handle them. */
+		len = smi_info->handlers->get_result(smi_info->si_sm, msg, 4);
+		if (msg[2] != 0) {
+			/* Error fetching flags, just give up for
+			   now. */
+			smi_info->si_state = SI_NORMAL;
+		} else if (len < 3) {
+			/* Hmm, no flags.  That's technically illegal, but
+			   don't use uninitialized data. */
+			smi_info->si_state = SI_NORMAL;
+		} else {
+			smi_info->msg_flags = msg[3];
+			handle_flags(smi_info);
+		}
+		break;
+	}
+
+	case SI_CLEARING_FLAGS:
+	case SI_CLEARING_FLAGS_THEN_SET_IRQ:
+	{
+		unsigned char msg[3];
+
+		/* We cleared the flags. */
+		smi_info->handlers->get_result(smi_info->si_sm, msg, 3);
+		if (msg[2] != 0) {
+			/* Error clearing flags */
+			printk(KERN_WARNING
+			       "ipmi_si: Error clearing flags: %2.2x\n",
+			       msg[2]);
+		}
+		if (smi_info->si_state == SI_CLEARING_FLAGS_THEN_SET_IRQ)
+			start_enable_irq(smi_info);
+		else
+			smi_info->si_state = SI_NORMAL;
+		break;
+	}
+
+	case SI_GETTING_EVENTS:
+	{
+		smi_info->curr_msg->rsp_size
+			= smi_info->handlers->get_result(
+				smi_info->si_sm,
+				smi_info->curr_msg->rsp,
+				IPMI_MAX_MSG_LENGTH);
+
+		/* Do this here becase deliver_recv_msg() releases the
+		   lock, and a new message can be put in during the
+		   time the lock is released. */
+		msg = smi_info->curr_msg;
+		smi_info->curr_msg = NULL;
+		if (msg->rsp[2] != 0) {
+			/* Error getting event, probably done. */
+			msg->done(msg);
+
+			/* Take off the event flag. */
+			smi_info->msg_flags &= ~EVENT_MSG_BUFFER_FULL;
+		} else {
+			spin_lock(&smi_info->count_lock);
+			smi_info->events++;
+			spin_unlock(&smi_info->count_lock);
+
+			deliver_recv_msg(smi_info, msg);
+		}
+		handle_flags(smi_info);
+		break;
+	}
+
+	case SI_GETTING_MESSAGES:
+	{
+		smi_info->curr_msg->rsp_size
+			= smi_info->handlers->get_result(
+				smi_info->si_sm,
+				smi_info->curr_msg->rsp,
+				IPMI_MAX_MSG_LENGTH);
+
+		/* Do this here becase deliver_recv_msg() releases the
+		   lock, and a new message can be put in during the
+		   time the lock is released. */
+		msg = smi_info->curr_msg;
+		smi_info->curr_msg = NULL;
+		if (msg->rsp[2] != 0) {
+			/* Error getting event, probably done. */
+			msg->done(msg);
+
+			/* Take off the msg flag. */
+			smi_info->msg_flags &= ~RECEIVE_MSG_AVAIL;
+		} else {
+			spin_lock(&smi_info->count_lock);
+			smi_info->incoming_messages++;
+			spin_unlock(&smi_info->count_lock);
+
+			deliver_recv_msg(smi_info, msg);
+		}
+		handle_flags(smi_info);
+		break;
+	}
+
+	case SI_ENABLE_INTERRUPTS1:
+	{
+		unsigned char msg[4];
+
+		/* We got the flags from the SMI, now handle them. */
+		smi_info->handlers->get_result(smi_info->si_sm, msg, 4);
+		if (msg[2] != 0) {
+			printk(KERN_WARNING
+			       "ipmi_si: Could not enable interrupts"
+			       ", failed get, using polled mode.\n");
+			smi_info->si_state = SI_NORMAL;
+		} else {
+			msg[0] = (IPMI_NETFN_APP_REQUEST << 2);
+			msg[1] = IPMI_SET_BMC_GLOBAL_ENABLES_CMD;
+			msg[2] = msg[3] | 1; /* enable msg queue int */
+			smi_info->handlers->start_transaction(
+				smi_info->si_sm, msg, 3);
+			smi_info->si_state = SI_ENABLE_INTERRUPTS2;
+		}
+		break;
+	}
+
+	case SI_ENABLE_INTERRUPTS2:
+	{
+		unsigned char msg[4];
+
+		/* We got the flags from the SMI, now handle them. */
+		smi_info->handlers->get_result(smi_info->si_sm, msg, 4);
+		if (msg[2] != 0) {
+			printk(KERN_WARNING
+			       "ipmi_si: Could not enable interrupts"
+			       ", failed set, using polled mode.\n");
+		}
+		smi_info->si_state = SI_NORMAL;
+		break;
+	}
+	}
+}
+
+/* Called on timeouts and events.  Timeouts should pass the elapsed
+   time, interrupts should pass in zero. */
+static enum si_sm_result smi_event_handler(struct smi_info *smi_info,
+					   int time)
+{
+	enum si_sm_result si_sm_result;
+
+ restart:
+	/* There used to be a loop here that waited a little while
+	   (around 25us) before giving up.  That turned out to be
+	   pointless, the minimum delays I was seeing were in the 300us
+	   range, which is far too long to wait in an interrupt.  So
+	   we just run until the state machine tells us something
+	   happened or it needs a delay. */
+	si_sm_result = smi_info->handlers->event(smi_info->si_sm, time);
+	time = 0;
+	while (si_sm_result == SI_SM_CALL_WITHOUT_DELAY)
+	{
+		si_sm_result = smi_info->handlers->event(smi_info->si_sm, 0);
+	}
+
+	if (si_sm_result == SI_SM_TRANSACTION_COMPLETE)
+	{
+		spin_lock(&smi_info->count_lock);
+		smi_info->complete_transactions++;
+		spin_unlock(&smi_info->count_lock);
+
+		handle_transaction_done(smi_info);
+		si_sm_result = smi_info->handlers->event(smi_info->si_sm, 0);
+	}
+	else if (si_sm_result == SI_SM_HOSED)
+	{
+		spin_lock(&smi_info->count_lock);
+		smi_info->hosed_count++;
+		spin_unlock(&smi_info->count_lock);
+
+		if (smi_info->curr_msg != NULL) {
+			/* If we were handling a user message, format
+                           a response to send to the upper layer to
+                           tell it about the error. */
+			return_hosed_msg(smi_info);
+		}
+		si_sm_result = smi_info->handlers->event(smi_info->si_sm, 0);
+		smi_info->si_state = SI_NORMAL;
+	}
+
+	/* We prefer handling attn over new messages. */
+	if (si_sm_result == SI_SM_ATTN)
+	{
+		unsigned char msg[2];
+
+		spin_lock(&smi_info->count_lock);
+		smi_info->attentions++;
+		spin_unlock(&smi_info->count_lock);
+
+		/* Got a attn, send down a get message flags to see
+                   what's causing it.  It would be better to handle
+                   this in the upper layer, but due to the way
+                   interrupts work with the SMI, that's not really
+                   possible. */
+		msg[0] = (IPMI_NETFN_APP_REQUEST << 2);
+		msg[1] = IPMI_GET_MSG_FLAGS_CMD;
+
+		smi_info->handlers->start_transaction(
+			smi_info->si_sm, msg, 2);
+		smi_info->si_state = SI_GETTING_FLAGS;
+		goto restart;
+	}
+
+	/* If we are currently idle, try to start the next message. */
+	if (si_sm_result == SI_SM_IDLE) {
+		spin_lock(&smi_info->count_lock);
+		smi_info->idles++;
+		spin_unlock(&smi_info->count_lock);
+
+		si_sm_result = start_next_msg(smi_info);
+		if (si_sm_result != SI_SM_IDLE)
+			goto restart;
+        }
+
+	if ((si_sm_result == SI_SM_IDLE)
+	    && (atomic_read(&smi_info->req_events)))
+	{
+		/* We are idle and the upper layer requested that I fetch
+		   events, so do so. */
+		unsigned char msg[2];
+
+		spin_lock(&smi_info->count_lock);
+		smi_info->flag_fetches++;
+		spin_unlock(&smi_info->count_lock);
+
+		atomic_set(&smi_info->req_events, 0);
+		msg[0] = (IPMI_NETFN_APP_REQUEST << 2);
+		msg[1] = IPMI_GET_MSG_FLAGS_CMD;
+
+		smi_info->handlers->start_transaction(
+			smi_info->si_sm, msg, 2);
+		smi_info->si_state = SI_GETTING_FLAGS;
+		goto restart;
+	}
+
+	return si_sm_result;
+}
+
+static void sender(void                *send_info,
+		   struct ipmi_smi_msg *msg,
+		   int                 priority)
+{
+	struct smi_info   *smi_info = send_info;
+	enum si_sm_result result;
+	unsigned long     flags;
+#ifdef DEBUG_TIMING
+	struct timeval    t;
+#endif
+
+	spin_lock_irqsave(&(smi_info->msg_lock), flags);
+#ifdef DEBUG_TIMING
+	do_gettimeofday(&t);
+	printk("**Enqueue: %d.%9.9d\n", t.tv_sec, t.tv_usec);
+#endif
+
+	if (smi_info->run_to_completion) {
+		/* If we are running to completion, then throw it in
+		   the list and run transactions until everything is
+		   clear.  Priority doesn't matter here. */
+		list_add_tail(&(msg->link), &(smi_info->xmit_msgs));
+
+		/* We have to release the msg lock and claim the smi
+		   lock in this case, because of race conditions. */
+		spin_unlock_irqrestore(&(smi_info->msg_lock), flags);
+
+		spin_lock_irqsave(&(smi_info->si_lock), flags);
+		result = smi_event_handler(smi_info, 0);
+		while (result != SI_SM_IDLE) {
+			udelay(SI_SHORT_TIMEOUT_USEC);
+			result = smi_event_handler(smi_info,
+						   SI_SHORT_TIMEOUT_USEC);
+		}
+		spin_unlock_irqrestore(&(smi_info->si_lock), flags);
+		return;
+	} else {
+		if (priority > 0) {
+			list_add_tail(&(msg->link), &(smi_info->hp_xmit_msgs));
+		} else {
+			list_add_tail(&(msg->link), &(smi_info->xmit_msgs));
+		}
+	}
+	spin_unlock_irqrestore(&(smi_info->msg_lock), flags);
+
+	spin_lock_irqsave(&(smi_info->si_lock), flags);
+	if ((smi_info->si_state == SI_NORMAL)
+	    && (smi_info->curr_msg == NULL))
+	{
+		start_next_msg(smi_info);
+		si_restart_short_timer(smi_info);
+	}
+	spin_unlock_irqrestore(&(smi_info->si_lock), flags);
+}
+
+static void set_run_to_completion(void *send_info, int i_run_to_completion)
+{
+	struct smi_info   *smi_info = send_info;
+	enum si_sm_result result;
+	unsigned long     flags;
+
+	spin_lock_irqsave(&(smi_info->si_lock), flags);
+
+	smi_info->run_to_completion = i_run_to_completion;
+	if (i_run_to_completion) {
+		result = smi_event_handler(smi_info, 0);
+		while (result != SI_SM_IDLE) {
+			udelay(SI_SHORT_TIMEOUT_USEC);
+			result = smi_event_handler(smi_info,
+						   SI_SHORT_TIMEOUT_USEC);
+		}
+	}
+
+	spin_unlock_irqrestore(&(smi_info->si_lock), flags);
+}
+
+static void request_events(void *send_info)
+{
+	struct smi_info *smi_info = send_info;
+
+	atomic_set(&smi_info->req_events, 1);
+}
+
+static int initialized = 0;
+
+/* Must be called with interrupts off and with the si_lock held. */
+static void si_restart_short_timer(struct smi_info *smi_info)
+{
+#if defined(CONFIG_HIGH_RES_TIMERS)
+	unsigned long flags;
+	unsigned long jiffies_now;
+
+	if (del_timer(&(smi_info->si_timer))) {
+		/* If we don't delete the timer, then it will go off
+		   immediately, anyway.  So we only process if we
+		   actually delete the timer. */
+
+		/* We already have irqsave on, so no need for it
+                   here. */
+		read_lock(&xtime_lock);
+		jiffies_now = jiffies;
+		smi_info->si_timer.expires = jiffies_now;
+		smi_info->si_timer.sub_expires = get_arch_cycles(jiffies_now);
+
+		add_usec_to_timer(&smi_info->si_timer, SI_SHORT_TIMEOUT_USEC);
+
+		add_timer(&(smi_info->si_timer));
+		spin_lock_irqsave(&smi_info->count_lock, flags);
+		smi_info->timeout_restarts++;
+		spin_unlock_irqrestore(&smi_info->count_lock, flags);
+	}
+#endif
+}
+
+static void smi_timeout(unsigned long data)
+{
+	struct smi_info   *smi_info = (struct smi_info *) data;
+	enum si_sm_result smi_result;
+	unsigned long     flags;
+	unsigned long     jiffies_now;
+	unsigned long     time_diff;
+#ifdef DEBUG_TIMING
+	struct timeval    t;
+#endif
+
+	if (smi_info->stop_operation) {
+		smi_info->timer_stopped = 1;
+		return;
+	}
+
+	spin_lock_irqsave(&(smi_info->si_lock), flags);
+#ifdef DEBUG_TIMING
+	do_gettimeofday(&t);
+	printk("**Timer: %d.%9.9d\n", t.tv_sec, t.tv_usec);
+#endif
+	jiffies_now = jiffies;
+	time_diff = ((jiffies_now - smi_info->last_timeout_jiffies)
+		     * SI_USEC_PER_JIFFY);
+	smi_result = smi_event_handler(smi_info, time_diff);
+
+	spin_unlock_irqrestore(&(smi_info->si_lock), flags);
+
+	smi_info->last_timeout_jiffies = jiffies_now;
+
+	if ((smi_info->irq) && (! smi_info->interrupt_disabled)) {
+		/* Running with interrupts, only do long timeouts. */
+		smi_info->si_timer.expires = jiffies + SI_TIMEOUT_JIFFIES;
+		spin_lock_irqsave(&smi_info->count_lock, flags);
+		smi_info->long_timeouts++;
+		spin_unlock_irqrestore(&smi_info->count_lock, flags);
+		goto do_add_timer;
+	}
+
+	/* If the state machine asks for a short delay, then shorten
+           the timer timeout. */
+	if (smi_result == SI_SM_CALL_WITH_DELAY) {
+		spin_lock_irqsave(&smi_info->count_lock, flags);
+		smi_info->short_timeouts++;
+		spin_unlock_irqrestore(&smi_info->count_lock, flags);
+#if defined(CONFIG_HIGH_RES_TIMERS)
+		read_lock(&xtime_lock);
+                smi_info->si_timer.expires = jiffies;
+                smi_info->si_timer.sub_expires
+                        = get_arch_cycles(smi_info->si_timer.expires);
+                read_unlock(&xtime_lock);
+		add_usec_to_timer(&smi_info->si_timer, SI_SHORT_TIMEOUT_USEC);
+#else
+		smi_info->si_timer.expires = jiffies + 1;
+#endif
+	} else {
+		spin_lock_irqsave(&smi_info->count_lock, flags);
+		smi_info->long_timeouts++;
+		spin_unlock_irqrestore(&smi_info->count_lock, flags);
+		smi_info->si_timer.expires = jiffies + SI_TIMEOUT_JIFFIES;
+#if defined(CONFIG_HIGH_RES_TIMERS)
+		smi_info->si_timer.sub_expires = 0;
+#endif
+	}
+
+ do_add_timer:
+	add_timer(&(smi_info->si_timer));
+}
+
+static irqreturn_t si_irq_handler(int irq, void *data, struct pt_regs *regs)
+{
+	struct smi_info *smi_info = data;
+	unsigned long   flags;
+#ifdef DEBUG_TIMING
+	struct timeval  t;
+#endif
+
+	spin_lock_irqsave(&(smi_info->si_lock), flags);
+
+	spin_lock(&smi_info->count_lock);
+	smi_info->interrupts++;
+	spin_unlock(&smi_info->count_lock);
+
+	if (smi_info->stop_operation)
+		goto out;
+
+#ifdef DEBUG_TIMING
+	do_gettimeofday(&t);
+	printk("**Interrupt: %d.%9.9d\n", t.tv_sec, t.tv_usec);
+#endif
+	smi_event_handler(smi_info, 0);
+ out:
+	spin_unlock_irqrestore(&(smi_info->si_lock), flags);
+	return IRQ_HANDLED;
+}
+
+static struct ipmi_smi_handlers handlers =
+{
+	.owner                  = THIS_MODULE,
+	.sender			= sender,
+	.request_events		= request_events,
+	.set_run_to_completion  = set_run_to_completion
+};
+
+/* There can be 4 IO ports passed in (with or without IRQs), 4 addresses,
+   a default IO port, and 1 ACPI/SPMI address.  That sets SI_MAX_DRIVERS */
+
+#define SI_MAX_PARMS 4
+#define SI_MAX_DRIVERS ((SI_MAX_PARMS * 2) + 2)
+static struct smi_info *smi_infos[SI_MAX_DRIVERS] =
+{ NULL, NULL, NULL, NULL };
+
+#define DEVICE_NAME "ipmi_si"
+
+#define DEFAULT_KCS_IO_PORT 0xca2
+#define DEFAULT_SMIC_IO_PORT 0xca9
+#define DEFAULT_BT_IO_PORT   0xe4
+
+static int           si_trydefaults = 1;
+static char          *si_type[SI_MAX_PARMS] = { NULL, NULL, NULL, NULL };
+#define MAX_SI_TYPE_STR 30
+static char          si_type_str[MAX_SI_TYPE_STR];
+static unsigned long addrs[SI_MAX_PARMS] = { 0, 0, 0, 0 };
+static int num_addrs = 0;
+static unsigned int  ports[SI_MAX_PARMS] = { 0, 0, 0, 0 };
+static int num_ports = 0;
+static int           irqs[SI_MAX_PARMS] = { 0, 0, 0, 0 };
+static int num_irqs = 0;
+
+
+module_param_named(trydefaults, si_trydefaults, bool, 0);
+MODULE_PARM_DESC(trydefaults, "Setting this to 'false' will disable the"
+		 " default scan of the KCS and SMIC interface at the standard"
+		 " address");
+module_param_string(type, si_type_str, MAX_SI_TYPE_STR, 0);
+MODULE_PARM_DESC(type, "Defines the type of each interface, each"
+		 " interface separated by commas.  The types are 'kcs',"
+		 " 'smic', and 'bt'.  For example si_type=kcs,bt will set"
+		 " the first interface to kcs and the second to bt");
+module_param_array(addrs, long, num_addrs, 0);
+MODULE_PARM_DESC(addrs, "Sets the memory address of each interface, the"
+		 " addresses separated by commas.  Only use if an interface"
+		 " is in memory.  Otherwise, set it to zero or leave"
+		 " it blank.");
+module_param_array(ports, int, num_ports, 0);
+MODULE_PARM_DESC(ports, "Sets the port address of each interface, the"
+		 " addresses separated by commas.  Only use if an interface"
+		 " is a port.  Otherwise, set it to zero or leave"
+		 " it blank.");
+module_param_array(irqs, int, num_irqs, 0);
+MODULE_PARM_DESC(irqs, "Sets the interrupt of each interface, the"
+		 " addresses separated by commas.  Only use if an interface"
+		 " has an interrupt.  Otherwise, set it to zero or leave"
+		 " it blank.");
+
+
+#if defined(CONFIG_ACPI_INTERPETER) || defined(CONFIG_X86) || defined(CONFIG_PCI)
+#define IPMI_MEM_ADDR_SPACE 1
+#define IPMI_IO_ADDR_SPACE  2
+static int is_new_interface(int intf, u8 addr_space, unsigned long base_addr)
+{
+	int i;
+
+	for (i = 0; i < SI_MAX_PARMS; ++i) {
+		/* Don't check our address. */
+		if (i == intf)
+			continue;
+		if (si_type[i] != NULL) {
+			if ((addr_space == IPMI_MEM_ADDR_SPACE &&
+			     base_addr == addrs[i]) ||
+			    (addr_space == IPMI_IO_ADDR_SPACE &&
+			     base_addr == ports[i]))
+				return 0;
+		}
+		else
+			break;
+	}
+
+	return 1;
+}
+#endif
+
+static int std_irq_setup(struct smi_info *info)
+{
+	int rv;
+
+	if (!info->irq)
+		return 0;
+
+	rv = request_irq(info->irq,
+			 si_irq_handler,
+			 SA_INTERRUPT,
+			 DEVICE_NAME,
+			 info);
+	if (rv) {
+		printk(KERN_WARNING
+		       "ipmi_si: %s unable to claim interrupt %d,"
+		       " running polled\n",
+		       DEVICE_NAME, info->irq);
+		info->irq = 0;
+	} else {
+		printk("  Using irq %d\n", info->irq);
+	}
+
+	return rv;
+}
+
+static void std_irq_cleanup(struct smi_info *info)
+{
+	if (!info->irq)
+		return;
+
+	free_irq(info->irq, info);
+}
+
+static unsigned char port_inb(struct si_sm_io *io, unsigned int offset)
+{
+	unsigned int *addr = io->info;
+
+	return inb((*addr)+offset);
+}
+
+static void port_outb(struct si_sm_io *io, unsigned int offset,
+		      unsigned char b)
+{
+	unsigned int *addr = io->info;
+
+	outb(b, (*addr)+offset);
+}
+
+static int port_setup(struct smi_info *info)
+{
+	unsigned int *addr = info->io.info;
+
+	if (!addr || (!*addr))
+		return -ENODEV;
+
+	if (request_region(*addr, info->io_size, DEVICE_NAME) == NULL)
+		return -EIO;
+	return 0;
+}
+
+static void port_cleanup(struct smi_info *info)
+{
+	unsigned int *addr = info->io.info;
+
+	if (addr && (*addr))
+		release_region (*addr, info->io_size);
+	kfree(info);
+}
+
+static int try_init_port(int intf_num, struct smi_info **new_info)
+{
+	struct smi_info *info;
+
+	if (!ports[intf_num])
+		return -ENODEV;
+
+	if (!is_new_interface(intf_num, IPMI_IO_ADDR_SPACE,
+			      ports[intf_num]))
+		return -ENODEV;
+
+	info = kmalloc(sizeof(*info), GFP_KERNEL);
+	if (!info) {
+		printk(KERN_ERR "ipmi_si: Could not allocate SI data (1)\n");
+		return -ENOMEM;
+	}
+	memset(info, 0, sizeof(*info));
+
+	info->io_setup = port_setup;
+	info->io_cleanup = port_cleanup;
+	info->io.inputb = port_inb;
+	info->io.outputb = port_outb;
+	info->io.info = &(ports[intf_num]);
+	info->io.addr = NULL;
+	info->irq = 0;
+	info->irq_setup = NULL;
+	*new_info = info;
+
+	if (si_type[intf_num] == NULL)
+		si_type[intf_num] = "kcs";
+
+	printk("ipmi_si: Trying \"%s\" at I/O port 0x%x\n",
+	       si_type[intf_num], ports[intf_num]);
+	return 0;
+}
+
+static unsigned char mem_inb(struct si_sm_io *io, unsigned int offset)
+{
+	return readb((io->addr)+offset);
+}
+
+static void mem_outb(struct si_sm_io *io, unsigned int offset,
+		     unsigned char b)
+{
+	writeb(b, (io->addr)+offset);
+}
+
+static int mem_setup(struct smi_info *info)
+{
+	unsigned long *addr = info->io.info;
+
+	if (!addr || (!*addr))
+		return -ENODEV;
+
+	if (request_mem_region(*addr, info->io_size, DEVICE_NAME) == NULL)
+		return -EIO;
+
+	info->io.addr = ioremap(*addr, info->io_size);
+	if (info->io.addr == NULL) {
+		release_mem_region(*addr, info->io_size);
+		return -EIO;
+	}
+	return 0;
+}
+
+static void mem_cleanup(struct smi_info *info)
+{
+	unsigned long *addr = info->io.info;
+
+	if (info->io.addr) {
+		iounmap(info->io.addr);
+		release_mem_region(*addr, info->io_size);
+	}
+	kfree(info);
+}
+
+static int try_init_mem(int intf_num, struct smi_info **new_info)
+{
+	struct smi_info *info;
+
+	if (!addrs[intf_num])
+		return -ENODEV;
+
+	if (!is_new_interface(intf_num, IPMI_MEM_ADDR_SPACE,
+			      addrs[intf_num]))
+		return -ENODEV;
+
+	info = kmalloc(sizeof(*info), GFP_KERNEL);
+	if (!info) {
+		printk(KERN_ERR "ipmi_si: Could not allocate SI data (2)\n");
+		return -ENOMEM;
+	}
+	memset(info, 0, sizeof(*info));
+
+	info->io_setup = mem_setup;
+	info->io_cleanup = mem_cleanup;
+	info->io.inputb = mem_inb;
+	info->io.outputb = mem_outb;
+	info->io.info = (void *) addrs[intf_num];
+	info->io.addr = NULL;
+	info->irq = 0;
+	info->irq_setup = NULL;
+	*new_info = info;
+
+	if (si_type[intf_num] == NULL)
+		si_type[intf_num] = "kcs";
+
+	printk("ipmi_si: Trying \"%s\" at memory address 0x%lx\n",
+	       si_type[intf_num], addrs[intf_num]);
+	return 0;
+}
+
+
+#ifdef CONFIG_ACPI_INTERPRETER
+
+#include <linux/acpi.h>
+
+/* Once we get an ACPI failure, we don't try any more, because we go
+   through the tables sequentially.  Once we don't find a table, there
+   are no more. */
+static int acpi_failure = 0;
+
+/* For GPE-type interrupts. */
+void ipmi_acpi_gpe(void *context)
+{
+	struct smi_info *smi_info = context;
+	unsigned long   flags;
+#ifdef DEBUG_TIMING
+	struct timeval t;
+#endif
+
+	spin_lock_irqsave(&(smi_info->si_lock), flags);
+
+	spin_lock(&smi_info->count_lock);
+	smi_info->interrupts++;
+	spin_unlock(&smi_info->count_lock);
+
+	if (smi_info->stop_operation)
+		goto out;
+
+#ifdef DEBUG_TIMING
+	do_gettimeofday(&t);
+	printk("**ACPI_GPE: %d.%9.9d\n", t.tv_sec, t.tv_usec);
+#endif
+	smi_event_handler(smi_info, 0);
+ out:
+	spin_unlock_irqrestore(&(smi_info->si_lock), flags);
+}
+
+static int acpi_gpe_irq_setup(struct smi_info *info)
+{
+	acpi_status status;
+
+	if (!info->irq)
+		return 0;
+
+	/* FIXME - is level triggered right? */
+	status = acpi_install_gpe_handler(NULL,
+					  info->irq,
+					  ACPI_GPE_LEVEL_TRIGGERED,
+					  ipmi_acpi_gpe,
+					  info);
+	if (status != AE_OK) {
+		printk(KERN_WARNING
+		       "ipmi_si: %s unable to claim ACPI GPE %d,"
+		       " running polled\n",
+		       DEVICE_NAME, info->irq);
+		info->irq = 0;
+		return -EINVAL;
+	} else {
+		printk("  Using ACPI GPE %d\n", info->irq);
+		return 0;
+	}
+
+}
+
+static void acpi_gpe_irq_cleanup(struct smi_info *info)
+{
+	if (!info->irq)
+		return;
+
+	acpi_remove_gpe_handler(NULL, info->irq, ipmi_acpi_gpe);
+}
+
+/*
+ * Defined at
+ * http://h21007.www2.hp.com/dspp/files/unprotected/devresource/Docs/TechPapers/IA64/hpspmi.pdf
+ */
+struct SPMITable {
+	s8	Signature[4];
+	u32	Length;
+	u8	Revision;
+	u8	Checksum;
+	s8	OEMID[6];
+	s8	OEMTableID[8];
+	s8	OEMRevision[4];
+	s8	CreatorID[4];
+	s8	CreatorRevision[4];
+	u8	InterfaceType;
+	u8	IPMIlegacy;
+	s16	SpecificationRevision;
+
+	/*
+	 * Bit 0 - SCI interrupt supported
+	 * Bit 1 - I/O APIC/SAPIC
+	 */
+	u8	InterruptType;
+
+	/* If bit 0 of InterruptType is set, then this is the SCI
+           interrupt in the GPEx_STS register. */
+	u8	GPE;
+
+	s16	Reserved;
+
+	/* If bit 1 of InterruptType is set, then this is the I/O
+           APIC/SAPIC interrupt. */
+	u32	GlobalSystemInterrupt;
+
+	/* The actual register address. */
+	struct acpi_generic_address addr;
+
+	u8	UID[4];
+
+	s8      spmi_id[1]; /* A '\0' terminated array starts here. */
+};
+
+static int try_init_acpi(int intf_num, struct smi_info **new_info)
+{
+	struct smi_info  *info;
+	acpi_status      status;
+	struct SPMITable *spmi;
+	char             *io_type;
+	u8 		 addr_space;
+
+	if (acpi_failure)
+		return -ENODEV;
+
+	status = acpi_get_firmware_table("SPMI", intf_num+1,
+					 ACPI_LOGICAL_ADDRESSING,
+					 (struct acpi_table_header **) &spmi);
+	if (status != AE_OK) {
+		acpi_failure = 1;
+		return -ENODEV;
+	}
+
+	if (spmi->IPMIlegacy != 1) {
+	    printk(KERN_INFO "IPMI: Bad SPMI legacy %d\n", spmi->IPMIlegacy);
+  	    return -ENODEV;
+	}
+
+	if (spmi->addr.address_space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY)
+		addr_space = IPMI_MEM_ADDR_SPACE;
+	else
+		addr_space = IPMI_IO_ADDR_SPACE;
+	if (!is_new_interface(-1, addr_space, spmi->addr.address))
+		return -ENODEV;
+
+	/* Figure out the interface type. */
+	switch (spmi->InterfaceType)
+	{
+	case 1:	/* KCS */
+		si_type[intf_num] = "kcs";
+		break;
+
+	case 2:	/* SMIC */
+		si_type[intf_num] = "smic";
+		break;
+
+	case 3:	/* BT */
+		si_type[intf_num] = "bt";
+		break;
+
+	default:
+		printk(KERN_INFO "ipmi_si: Unknown ACPI/SPMI SI type %d\n",
+			spmi->InterfaceType);
+		return -EIO;
+	}
+
+	info = kmalloc(sizeof(*info), GFP_KERNEL);
+	if (!info) {
+		printk(KERN_ERR "ipmi_si: Could not allocate SI data (3)\n");
+		return -ENOMEM;
+	}
+	memset(info, 0, sizeof(*info));
+
+	if (spmi->InterruptType & 1) {
+		/* We've got a GPE interrupt. */
+		info->irq = spmi->GPE;
+		info->irq_setup = acpi_gpe_irq_setup;
+		info->irq_cleanup = acpi_gpe_irq_cleanup;
+	} else if (spmi->InterruptType & 2) {
+		/* We've got an APIC/SAPIC interrupt. */
+		info->irq = spmi->GlobalSystemInterrupt;
+		info->irq_setup = std_irq_setup;
+		info->irq_cleanup = std_irq_cleanup;
+	} else {
+		/* Use the default interrupt setting. */
+		info->irq = 0;
+		info->irq_setup = NULL;
+	}
+
+	if (spmi->addr.address_space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) {
+		io_type = "memory";
+		info->io_setup = mem_setup;
+		info->io_cleanup = mem_cleanup;
+		addrs[intf_num] = spmi->addr.address;
+		info->io.inputb = mem_inb;
+		info->io.outputb = mem_outb;
+		info->io.info = &(addrs[intf_num]);
+	} else if (spmi->addr.address_space_id == ACPI_ADR_SPACE_SYSTEM_IO) {
+		io_type = "I/O";
+		info->io_setup = port_setup;
+		info->io_cleanup = port_cleanup;
+		ports[intf_num] = spmi->addr.address;
+		info->io.inputb = port_inb;
+		info->io.outputb = port_outb;
+		info->io.info = &(ports[intf_num]);
+	} else {
+		kfree(info);
+		printk("ipmi_si: Unknown ACPI I/O Address type\n");
+		return -EIO;
+	}
+
+	*new_info = info;
+
+	printk("ipmi_si: ACPI/SPMI specifies \"%s\" %s SI @ 0x%lx\n",
+	       si_type[intf_num], io_type, (unsigned long) spmi->addr.address);
+	return 0;
+}
+#endif
+
+#ifdef CONFIG_X86
+
+typedef struct dmi_ipmi_data
+{
+	u8   		type;
+	u8   		addr_space;
+	unsigned long	base_addr;
+	u8   		irq;
+}dmi_ipmi_data_t;
+
+typedef struct dmi_header
+{
+	u8	type;
+	u8	length;
+	u16	handle;
+}dmi_header_t;
+
+static int decode_dmi(dmi_header_t *dm, dmi_ipmi_data_t *ipmi_data)
+{
+	u8		*data = (u8 *)dm;
+	unsigned long  	base_addr;
+
+	ipmi_data->type = data[0x04];
+
+	memcpy(&base_addr,&data[0x08],sizeof(unsigned long));
+	if (base_addr & 1) {
+		/* I/O */
+		base_addr &= 0xFFFE;
+		ipmi_data->addr_space = IPMI_IO_ADDR_SPACE;
+	}
+	else {
+		/* Memory */
+		ipmi_data->addr_space = IPMI_MEM_ADDR_SPACE;
+	}
+
+	ipmi_data->base_addr = base_addr;
+	ipmi_data->irq = data[0x11];
+
+	if (is_new_interface(-1, ipmi_data->addr_space,ipmi_data->base_addr))
+	    return 0;
+
+	memset(ipmi_data,0,sizeof(dmi_ipmi_data_t));
+
+	return -1;
+}
+
+static int dmi_table(u32 base, int len, int num,
+	dmi_ipmi_data_t *ipmi_data)
+{
+	u8 		  *buf;
+	struct dmi_header *dm;
+	u8 		  *data;
+	int 		  i=1;
+	int		  status=-1;
+
+	buf = ioremap(base, len);
+	if(buf==NULL)
+		return -1;
+
+	data = buf;
+
+	while(i<num && (data - buf) < len)
+	{
+		dm=(dmi_header_t *)data;
+
+		if((data-buf+dm->length) >= len)
+        		break;
+
+		if (dm->type == 38) {
+			if (decode_dmi(dm, ipmi_data) == 0) {
+				status = 0;
+				break;
+			}
+		}
+
+	        data+=dm->length;
+		while((data-buf) < len && (*data || data[1]))
+			data++;
+		data+=2;
+		i++;
+	}
+	iounmap(buf);
+
+	return status;
+}
+
+inline static int dmi_checksum(u8 *buf)
+{
+	u8   sum=0;
+	int  a;
+
+	for(a=0; a<15; a++)
+		sum+=buf[a];
+	return (sum==0);
+}
+
+static int dmi_iterator(dmi_ipmi_data_t *ipmi_data)
+{
+	u8   buf[15];
+	u32  fp=0xF0000;
+
+#ifdef CONFIG_SIMNOW
+	return -1;
+#endif
+
+	while(fp < 0xFFFFF)
+	{
+		isa_memcpy_fromio(buf, fp, 15);
+		if(memcmp(buf, "_DMI_", 5)==0 && dmi_checksum(buf))
+		{
+			u16 num=buf[13]<<8|buf[12];
+			u16 len=buf[7]<<8|buf[6];
+			u32 base=buf[11]<<24|buf[10]<<16|buf[9]<<8|buf[8];
+
+			if(dmi_table(base, len, num, ipmi_data) == 0)
+				return 0;
+		}
+		fp+=16;
+	}
+
+	return -1;
+}
+
+static int try_init_smbios(int intf_num, struct smi_info **new_info)
+{
+	struct smi_info   *info;
+	dmi_ipmi_data_t   ipmi_data;
+	char              *io_type;
+	int               status;
+
+	status = dmi_iterator(&ipmi_data);
+
+	if (status < 0)
+		return -ENODEV;
+
+	switch(ipmi_data.type) {
+		case 0x01: /* KCS */
+			si_type[intf_num] = "kcs";
+			break;
+		case 0x02: /* SMIC */
+			si_type[intf_num] = "smic";
+			break;
+		case 0x03: /* BT */
+			si_type[intf_num] = "bt";
+			break;
+		default:
+			printk("ipmi_si: Unknown SMBIOS SI type.\n");
+			return -EIO;
+	}
+
+	info = kmalloc(sizeof(*info), GFP_KERNEL);
+	if (!info) {
+		printk(KERN_ERR "ipmi_si: Could not allocate SI data (4)\n");
+		return -ENOMEM;
+	}
+	memset(info, 0, sizeof(*info));
+
+	if (ipmi_data.addr_space == 1) {
+		io_type = "memory";
+		info->io_setup = mem_setup;
+		info->io_cleanup = mem_cleanup;
+		addrs[intf_num] = ipmi_data.base_addr;
+		info->io.inputb = mem_inb;
+		info->io.outputb = mem_outb;
+		info->io.info = &(addrs[intf_num]);
+	} else if (ipmi_data.addr_space == 2) {
+		io_type = "I/O";
+		info->io_setup = port_setup;
+		info->io_cleanup = port_cleanup;
+		ports[intf_num] = ipmi_data.base_addr;
+		info->io.inputb = port_inb;
+		info->io.outputb = port_outb;
+		info->io.info = &(ports[intf_num]);
+	} else {
+		kfree(info);
+		printk("ipmi_si: Unknown SMBIOS I/O Address type.\n");
+		return -EIO;
+	}
+
+	irqs[intf_num] = ipmi_data.irq;
+
+	*new_info = info;
+
+	printk("ipmi_si: Found SMBIOS-specified state machine at %s"
+	       " address 0x%lx\n",
+	       io_type, (unsigned long)ipmi_data.base_addr);
+	return 0;
+}
+#endif /* CONFIG_X86 */
+
+#ifdef CONFIG_PCI
+
+#define PCI_ERMC_CLASSCODE  0x0C0700
+#define PCI_HP_VENDOR_ID    0x103C
+#define PCI_MMC_DEVICE_ID   0x121A
+#define PCI_MMC_ADDR_CW     0x10
+
+/* Avoid more than one attempt to probe pci smic. */
+static int pci_smic_checked = 0;
+
+static int find_pci_smic(int intf_num, struct smi_info **new_info)
+{
+	struct smi_info  *info;
+	int              error;
+	struct pci_dev   *pci_dev = NULL;
+	u16    		 base_addr;
+	int              fe_rmc = 0;
+
+	if (pci_smic_checked)
+		return -ENODEV;
+
+	pci_smic_checked = 1;
+
+	if ((pci_dev = pci_find_device(PCI_HP_VENDOR_ID, PCI_MMC_DEVICE_ID,
+				       NULL)))
+		;
+	else if ((pci_dev = pci_find_class(PCI_ERMC_CLASSCODE, NULL)) &&
+		 pci_dev->subsystem_vendor == PCI_HP_VENDOR_ID)
+		fe_rmc = 1;
+	else
+		return -ENODEV;
+
+	error = pci_read_config_word(pci_dev, PCI_MMC_ADDR_CW, &base_addr);
+	if (error)
+	{
+		printk(KERN_ERR
+		       "ipmi_si: pci_read_config_word() failed (%d).\n",
+		       error);
+		return -ENODEV;
+	}
+
+	/* Bit 0: 1 specifies programmed I/O, 0 specifies memory mapped I/O */
+	if (!(base_addr & 0x0001))
+	{
+		printk(KERN_ERR
+		       "ipmi_si: memory mapped I/O not supported for PCI"
+		       " smic.\n");
+		return -ENODEV;
+	}
+
+	base_addr &= 0xFFFE;
+	if (!fe_rmc)
+		/* Data register starts at base address + 1 in eRMC */
+		++base_addr;
+
+	if (!is_new_interface(-1, IPMI_IO_ADDR_SPACE, base_addr))
+	    return -ENODEV;
+
+	info = kmalloc(sizeof(*info), GFP_KERNEL);
+	if (!info) {
+		printk(KERN_ERR "ipmi_si: Could not allocate SI data (5)\n");
+		return -ENOMEM;
+	}
+	memset(info, 0, sizeof(*info));
+
+	info->io_setup = port_setup;
+	info->io_cleanup = port_cleanup;
+	ports[intf_num] = base_addr;
+	info->io.inputb = port_inb;
+	info->io.outputb = port_outb;
+	info->io.info = &(ports[intf_num]);
+
+	*new_info = info;
+
+	irqs[intf_num] = pci_dev->irq;
+	si_type[intf_num] = "smic";
+
+	printk("ipmi_si: Found PCI SMIC at I/O address 0x%lx\n",
+		(long unsigned int) base_addr);
+
+	return 0;
+}
+#endif /* CONFIG_PCI */
+
+static int try_init_plug_and_play(int intf_num, struct smi_info **new_info)
+{
+#ifdef CONFIG_PCI
+	if (find_pci_smic(intf_num, new_info)==0)
+		return 0;
+#endif
+	/* Include other methods here. */
+
+	return -ENODEV;
+}
+
+
+static int try_get_dev_id(struct smi_info *smi_info)
+{
+	unsigned char      msg[2];
+	unsigned char      *resp;
+	unsigned long      resp_len;
+	enum si_sm_result smi_result;
+	int               rv = 0;
+
+	resp = kmalloc(IPMI_MAX_MSG_LENGTH, GFP_KERNEL);
+	if (!resp)
+		return -ENOMEM;
+
+	/* Do a Get Device ID command, since it comes back with some
+	   useful info. */
+	msg[0] = IPMI_NETFN_APP_REQUEST << 2;
+	msg[1] = IPMI_GET_DEVICE_ID_CMD;
+	smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2);
+
+	smi_result = smi_info->handlers->event(smi_info->si_sm, 0);
+	for (;;)
+	{
+		if (smi_result == SI_SM_CALL_WITH_DELAY) {
+			set_current_state(TASK_UNINTERRUPTIBLE);
+			schedule_timeout(1);
+			smi_result = smi_info->handlers->event(
+				smi_info->si_sm, 100);
+		}
+		else if (smi_result == SI_SM_CALL_WITHOUT_DELAY)
+		{
+			smi_result = smi_info->handlers->event(
+				smi_info->si_sm, 0);
+		}
+		else
+			break;
+	}
+	if (smi_result == SI_SM_HOSED) {
+		/* We couldn't get the state machine to run, so whatever's at
+		   the port is probably not an IPMI SMI interface. */
+		rv = -ENODEV;
+		goto out;
+	}
+
+	/* Otherwise, we got some data. */
+	resp_len = smi_info->handlers->get_result(smi_info->si_sm,
+						  resp, IPMI_MAX_MSG_LENGTH);
+	if (resp_len < 6) {
+		/* That's odd, it should be longer. */
+		rv = -EINVAL;
+		goto out;
+	}
+
+	if ((resp[1] != IPMI_GET_DEVICE_ID_CMD) || (resp[2] != 0)) {
+		/* That's odd, it shouldn't be able to fail. */
+		rv = -EINVAL;
+		goto out;
+	}
+
+	/* Record info from the get device id, in case we need it. */
+	smi_info->ipmi_si_dev_rev = resp[4] & 0xf;
+	smi_info->ipmi_si_fw_rev_major = resp[5] & 0x7f;
+	smi_info->ipmi_si_fw_rev_minor = resp[6];
+	smi_info->ipmi_version_major = resp[7] & 0xf;
+	smi_info->ipmi_version_minor = resp[7] >> 4;
+
+ out:
+	kfree(resp);
+	return rv;
+}
+
+static int type_file_read_proc(char *page, char **start, off_t off,
+			       int count, int *eof, void *data)
+{
+	char            *out = (char *) page;
+	struct smi_info *smi = data;
+
+	switch (smi->si_type) {
+	    case SI_KCS:
+		return sprintf(out, "kcs\n");
+	    case SI_SMIC:
+		return sprintf(out, "smic\n");
+	    case SI_BT:
+		return sprintf(out, "bt\n");
+	    default:
+		return 0;
+	}
+}
+
+static int stat_file_read_proc(char *page, char **start, off_t off,
+			       int count, int *eof, void *data)
+{
+	char            *out = (char *) page;
+	struct smi_info *smi = data;
+
+	out += sprintf(out, "interrupts_enabled:    %d\n",
+		       smi->irq && !smi->interrupt_disabled);
+	out += sprintf(out, "short_timeouts:        %ld\n",
+		       smi->short_timeouts);
+	out += sprintf(out, "long_timeouts:         %ld\n",
+		       smi->long_timeouts);
+	out += sprintf(out, "timeout_restarts:      %ld\n",
+		       smi->timeout_restarts);
+	out += sprintf(out, "idles:                 %ld\n",
+		       smi->idles);
+	out += sprintf(out, "interrupts:            %ld\n",
+		       smi->interrupts);
+	out += sprintf(out, "attentions:            %ld\n",
+		       smi->attentions);
+	out += sprintf(out, "flag_fetches:          %ld\n",
+		       smi->flag_fetches);
+	out += sprintf(out, "hosed_count:           %ld\n",
+		       smi->hosed_count);
+	out += sprintf(out, "complete_transactions: %ld\n",
+		       smi->complete_transactions);
+	out += sprintf(out, "events:                %ld\n",
+		       smi->events);
+	out += sprintf(out, "watchdog_pretimeouts:  %ld\n",
+		       smi->watchdog_pretimeouts);
+	out += sprintf(out, "incoming_messages:     %ld\n",
+		       smi->incoming_messages);
+
+	return (out - ((char *) page));
+}
+
+/* Returns 0 if initialized, or negative on an error. */
+static int init_one_smi(int intf_num, struct smi_info **smi)
+{
+	int		rv;
+	struct smi_info *new_smi;
+
+
+	rv = try_init_mem(intf_num, &new_smi);
+	if (rv)
+		rv = try_init_port(intf_num, &new_smi);
+#ifdef CONFIG_ACPI_INTERPRETER
+	if ((rv) && (si_trydefaults)) {
+		rv = try_init_acpi(intf_num, &new_smi);
+	}
+#endif
+#ifdef CONFIG_X86
+	if ((rv) && (si_trydefaults)) {
+		rv = try_init_smbios(intf_num, &new_smi);
+        }
+#endif
+	if ((rv) && (si_trydefaults)) {
+		rv = try_init_plug_and_play(intf_num, &new_smi);
+	}
+
+
+	if (rv)
+		return rv;
+
+	/* So we know not to free it unless we have allocated one. */
+	new_smi->intf = NULL;
+	new_smi->si_sm = NULL;
+	new_smi->handlers = 0;
+
+	if (!new_smi->irq_setup) {
+		new_smi->irq = irqs[intf_num];
+		new_smi->irq_setup = std_irq_setup;
+		new_smi->irq_cleanup = std_irq_cleanup;
+	}
+
+	/* Default to KCS if no type is specified. */
+	if (si_type[intf_num] == NULL) {
+		if (si_trydefaults)
+			si_type[intf_num] = "kcs";
+		else {
+			rv = -EINVAL;
+			goto out_err;
+		}
+	}
+
+	/* Set up the state machine to use. */
+	if (strcmp(si_type[intf_num], "kcs") == 0) {
+		new_smi->handlers = &kcs_smi_handlers;
+		new_smi->si_type = SI_KCS;
+	} else if (strcmp(si_type[intf_num], "smic") == 0) {
+		new_smi->handlers = &smic_smi_handlers;
+		new_smi->si_type = SI_SMIC;
+	} else if (strcmp(si_type[intf_num], "bt") == 0) {
+		new_smi->handlers = &bt_smi_handlers;
+		new_smi->si_type = SI_BT;
+	} else {
+		/* No support for anything else yet. */
+		rv = -EIO;
+		goto out_err;
+	}
+
+	/* Allocate the state machine's data and initialize it. */
+	new_smi->si_sm = kmalloc(new_smi->handlers->size(), GFP_KERNEL);
+	if (!new_smi->si_sm) {
+		printk(" Could not allocate state machine memory\n");
+		rv = -ENOMEM;
+		goto out_err;
+	}
+	new_smi->io_size = new_smi->handlers->init_data(new_smi->si_sm,
+							&new_smi->io);
+
+	/* Now that we know the I/O size, we can set up the I/O. */
+	rv = new_smi->io_setup(new_smi);
+	if (rv) {
+		printk(" Could not set up I/O space\n");
+		goto out_err;
+	}
+
+	spin_lock_init(&(new_smi->si_lock));
+	spin_lock_init(&(new_smi->msg_lock));
+	spin_lock_init(&(new_smi->count_lock));
+
+	/* Do low-level detection first. */
+	if (new_smi->handlers->detect(new_smi->si_sm)) {
+		rv = -ENODEV;
+		goto out_err;
+	}
+
+	/* Attempt a get device id command.  If it fails, we probably
+           don't have a SMI here. */
+	rv = try_get_dev_id(new_smi);
+	if (rv)
+		goto out_err;
+
+	/* Try to claim any interrupts. */
+	new_smi->irq_setup(new_smi);
+
+	INIT_LIST_HEAD(&(new_smi->xmit_msgs));
+	INIT_LIST_HEAD(&(new_smi->hp_xmit_msgs));
+	new_smi->curr_msg = NULL;
+	atomic_set(&new_smi->req_events, 0);
+	new_smi->run_to_completion = 0;
+
+	rv = ipmi_register_smi(&handlers,
+			       new_smi,
+			       new_smi->ipmi_version_major,
+			       new_smi->ipmi_version_minor,
+			       &(new_smi->intf));
+	if (rv) {
+		printk(KERN_ERR
+		       "ipmi_si: Unable to register device: error %d\n",
+		       rv);
+		goto out_err;
+	}
+
+	rv = ipmi_smi_add_proc_entry(new_smi->intf, "type",
+				     type_file_read_proc, NULL,
+				     new_smi, THIS_MODULE);
+	if (rv) {
+		printk(KERN_ERR
+		       "ipmi_si: Unable to create proc entry: %d\n",
+		       rv);
+		goto out_err;
+	}
+
+	rv = ipmi_smi_add_proc_entry(new_smi->intf, "si_stats",
+				     stat_file_read_proc, NULL,
+				     new_smi, THIS_MODULE);
+	if (rv) {
+		printk(KERN_ERR
+		       "ipmi_si: Unable to create proc entry: %d\n",
+		       rv);
+		goto out_err;
+	}
+
+	start_clear_flags(new_smi);
+
+	/* IRQ is defined to be set when non-zero. */
+	if (new_smi->irq)
+		new_smi->si_state = SI_CLEARING_FLAGS_THEN_SET_IRQ;
+
+	new_smi->interrupt_disabled = 0;
+	new_smi->timer_stopped = 0;
+	new_smi->stop_operation = 0;
+
+	init_timer(&(new_smi->si_timer));
+	new_smi->si_timer.data = (long) new_smi;
+	new_smi->si_timer.function = smi_timeout;
+	new_smi->last_timeout_jiffies = jiffies;
+	new_smi->si_timer.expires = jiffies + SI_TIMEOUT_JIFFIES;
+	add_timer(&(new_smi->si_timer));
+
+	*smi = new_smi;
+
+	printk(" IPMI %s interface initialized\n", si_type[intf_num]);
+
+	return 0;
+
+ out_err:
+	if (new_smi->intf)
+		ipmi_unregister_smi(new_smi->intf);
+
+	new_smi->irq_cleanup(new_smi);
+	if (new_smi->si_sm) {
+		if (new_smi->handlers)
+			new_smi->handlers->cleanup(new_smi->si_sm);
+		kfree(new_smi->si_sm);
+	}
+	new_smi->io_cleanup(new_smi);
+	return rv;
+}
+
+static __init int init_ipmi_si(void)
+{
+	int  rv = 0;
+	int  pos = 0;
+	int  i;
+	char *str;
+
+	if (initialized)
+		return 0;
+	initialized = 1;
+
+	/* Parse out the si_type string into its components. */
+	str = si_type_str;
+	if (*str != '\0') {
+		for (i=0; (i<SI_MAX_PARMS) && (*str != '\0'); i++) {
+			si_type[i] = str;
+			str = strchr(str, ',');
+			if (str) {
+				*str = '\0';
+				str++;
+			} else {
+				break;
+			}
+		}
+	}
+
+	printk(KERN_INFO "IPMI System Interface driver version "
+	       IPMI_SI_VERSION);
+	if (kcs_smi_handlers.version)
+		printk(", KCS version %s", kcs_smi_handlers.version);
+	if (smic_smi_handlers.version)
+		printk(", SMIC version %s", smic_smi_handlers.version);
+	if (bt_smi_handlers.version)
+   	        printk(", BT version %s", bt_smi_handlers.version);
+	printk("\n");
+
+	rv = init_one_smi(0, &(smi_infos[pos]));
+	if (rv && !ports[0] && si_trydefaults) {
+		/* If we are trying defaults and the initial port is
+                   not set, then set it. */
+		si_type[0] = "kcs";
+		ports[0] = DEFAULT_KCS_IO_PORT;
+		rv = init_one_smi(0, &(smi_infos[pos]));
+		if (rv) {
+			/* No KCS - try SMIC */
+			si_type[0] = "smic";
+			ports[0] = DEFAULT_SMIC_IO_PORT;
+			rv = init_one_smi(0, &(smi_infos[pos]));
+		}
+		if (rv) {
+			/* No SMIC - try BT */
+			si_type[0] = "bt";
+			ports[0] = DEFAULT_BT_IO_PORT;
+			rv = init_one_smi(0, &(smi_infos[pos]));
+		}
+	}
+	if (rv == 0)
+		pos++;
+
+	for (i=1; i < SI_MAX_PARMS; i++) {
+		rv = init_one_smi(i, &(smi_infos[pos]));
+		if (rv == 0)
+			pos++;
+	}
+
+	if (smi_infos[0] == NULL) {
+		printk("ipmi_si: Unable to find any System Interface(s)\n");
+		return -ENODEV;
+	}
+
+	return 0;
+}
+module_init(init_ipmi_si);
+
+void __exit cleanup_one_si(struct smi_info *to_clean)
+{
+	int           rv;
+	unsigned long flags;
+
+	if (! to_clean)
+		return;
+
+	/* Tell the timer and interrupt handlers that we are shutting
+	   down. */
+	spin_lock_irqsave(&(to_clean->si_lock), flags);
+	spin_lock(&(to_clean->msg_lock));
+
+	to_clean->stop_operation = 1;
+
+	to_clean->irq_cleanup(to_clean);
+
+	spin_unlock(&(to_clean->msg_lock));
+	spin_unlock_irqrestore(&(to_clean->si_lock), flags);
+
+	/* Wait until we know that we are out of any interrupt
+	   handlers might have been running before we freed the
+	   interrupt. */
+	synchronize_kernel();
+
+	/* Wait for the timer to stop.  This avoids problems with race
+	   conditions removing the timer here. */
+	while (!to_clean->timer_stopped) {
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(1);
+	}
+
+	rv = ipmi_unregister_smi(to_clean->intf);
+	if (rv) {
+		printk(KERN_ERR
+		       "ipmi_si: Unable to unregister device: errno=%d\n",
+		       rv);
+	}
+
+	to_clean->handlers->cleanup(to_clean->si_sm);
+
+	kfree(to_clean->si_sm);
+
+	to_clean->io_cleanup(to_clean);
+}
+
+static __exit void cleanup_ipmi_si(void)
+{
+	int i;
+
+	if (!initialized)
+		return;
+
+	for (i=0; i<SI_MAX_DRIVERS; i++) {
+		cleanup_one_si(smi_infos[i]);
+	}
+}
+module_exit(cleanup_ipmi_si);
+
+MODULE_LICENSE("GPL");
--- diff/drivers/char/ipmi/ipmi_si_sm.h	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/char/ipmi/ipmi_si_sm.h	2004-04-21 10:45:34.093520496 +0100
@@ -0,0 +1,117 @@
+/*
+ * ipmi_si_sm.h
+ *
+ * State machine interface for low-level IPMI system management
+ * interface state machines.  This code is the interface between
+ * the ipmi_smi code (that handles the policy of a KCS, SMIC, or
+ * BT interface) and the actual low-level state machine.
+ *
+ * Author: MontaVista Software, Inc.
+ *         Corey Minyard <minyard@mvista.com>
+ *         source@mvista.com
+ *
+ * Copyright 2002 MontaVista Software Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License as published by the
+ *  Free Software Foundation; either version 2 of the License, or (at your
+ *  option) any later version.
+ *
+ *
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/* This is defined by the state machines themselves, it is an opaque
+   data type for them to use. */
+struct si_sm_data;
+
+/* The structure for doing I/O in the state machine.  The state
+   machine doesn't have the actual I/O routines, they are done through
+   this interface. */
+struct si_sm_io
+{
+	unsigned char (*inputb)(struct si_sm_io *io, unsigned int offset);
+	void (*outputb)(struct si_sm_io *io,
+			unsigned int  offset,
+			unsigned char b);
+
+	/* Generic info used by the actual handling routines, the
+           state machine shouldn't touch these. */
+	void *info;
+	void *addr;
+};
+
+/* Results of SMI events. */
+enum si_sm_result
+{
+	SI_SM_CALL_WITHOUT_DELAY, /* Call the driver again immediately */
+	SI_SM_CALL_WITH_DELAY,	/* Delay some before calling again. */
+	SI_SM_TRANSACTION_COMPLETE, /* A transaction is finished. */
+	SI_SM_IDLE,		/* The SM is in idle state. */
+	SI_SM_HOSED,		/* The hardware violated the state machine. */
+	SI_SM_ATTN		/* The hardware is asserting attn and the
+				   state machine is idle. */
+};
+
+/* Handlers for the SMI state machine. */
+struct si_sm_handlers
+{
+	/* Put the version number of the state machine here so the
+           upper layer can print it. */
+	char *version;
+
+	/* Initialize the data and return the amount of I/O space to
+           reserve for the space. */
+	unsigned int (*init_data)(struct si_sm_data *smi,
+				  struct si_sm_io   *io);
+
+	/* Start a new transaction in the state machine.  This will
+	   return -2 if the state machine is not idle, -1 if the size
+	   is invalid (to large or too small), or 0 if the transaction
+	   is successfully completed. */
+	int (*start_transaction)(struct si_sm_data *smi,
+				 unsigned char *data, unsigned int size);
+
+	/* Return the results after the transaction.  This will return
+	   -1 if the buffer is too small, zero if no transaction is
+	   present, or the actual length of the result data. */
+	int (*get_result)(struct si_sm_data *smi,
+			  unsigned char *data, unsigned int length);
+
+	/* Call this periodically (for a polled interface) or upon
+	   receiving an interrupt (for a interrupt-driven interface).
+	   If interrupt driven, you should probably poll this
+	   periodically when not in idle state.  This should be called
+	   with the time that passed since the last call, if it is
+	   significant.  Time is in microseconds. */
+	enum si_sm_result (*event)(struct si_sm_data *smi, long time);
+
+	/* Attempt to detect an SMI.  Returns 0 on success or nonzero
+           on failure. */
+	int (*detect)(struct si_sm_data *smi);
+
+	/* The interface is shutting down, so clean it up. */
+	void (*cleanup)(struct si_sm_data *smi);
+
+	/* Return the size of the SMI structure in bytes. */
+	int (*size)(void);
+};
+
+/* Current state machines that we can use. */
+extern struct si_sm_handlers kcs_smi_handlers;
+extern struct si_sm_handlers smic_smi_handlers;
+extern struct si_sm_handlers bt_smi_handlers;
+
--- diff/drivers/char/ipmi/ipmi_smic_sm.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/char/ipmi/ipmi_smic_sm.c	2004-04-21 10:45:34.094520344 +0100
@@ -0,0 +1,599 @@
+/*
+ * ipmi_smic_sm.c
+ *
+ * The state-machine driver for an IPMI SMIC driver
+ *
+ * It started as a copy of Corey Minyard's driver for the KSC interface
+ * and the kernel patch "mmcdev-patch-245" by HP
+ *
+ * modified by:	Hannes Schulz <schulz@schwaar.com>
+ *		ipmi@schwaar.com
+ *
+ *
+ * Corey Minyard's driver for the KSC interface has the following
+ * copyright notice:
+ *   Copyright 2002 MontaVista Software Inc.
+ *
+ * the kernel patch "mmcdev-patch-245" by HP has the following
+ * copyright notice:
+ * (c) Copyright 2001 Grant Grundler (c) Copyright
+ * 2001 Hewlett-Packard Company
+ *
+ *
+ *  This program is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License as published by the
+ *  Free Software Foundation; either version 2 of the License, or (at your
+ *  option) any later version.
+ *
+ *
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#include <linux/kernel.h> /* For printk. */
+#include <linux/string.h>
+#include <linux/ipmi_msgdefs.h>		/* for completion codes */
+#include "ipmi_si_sm.h"
+
+#define IPMI_SMIC_VERSION "v31"
+
+/* smic_debug is a bit-field
+ *	SMIC_DEBUG_ENABLE -	turned on for now
+ *	SMIC_DEBUG_MSG -	commands and their responses
+ *	SMIC_DEBUG_STATES -	state machine
+*/
+#define SMIC_DEBUG_STATES	4
+#define SMIC_DEBUG_MSG		2
+#define	SMIC_DEBUG_ENABLE	1
+
+static int smic_debug = 1;
+
+enum smic_states {
+	SMIC_IDLE,
+	SMIC_START_OP,
+	SMIC_OP_OK,
+	SMIC_WRITE_START,
+	SMIC_WRITE_NEXT,
+	SMIC_WRITE_END,
+	SMIC_WRITE2READ,
+	SMIC_READ_START,
+	SMIC_READ_NEXT,
+	SMIC_READ_END,
+	SMIC_HOSED
+};
+
+#define MAX_SMIC_READ_SIZE 80
+#define MAX_SMIC_WRITE_SIZE 80
+#define SMIC_MAX_ERROR_RETRIES 3
+
+/* Timeouts in microseconds. */
+#define SMIC_RETRY_TIMEOUT 100000
+
+/* SMIC Flags Register Bits */
+#define SMIC_RX_DATA_READY	0x80
+#define SMIC_TX_DATA_READY	0x40
+#define SMIC_SMI		0x10
+#define SMIC_EVM_DATA_AVAIL	0x08
+#define SMIC_SMS_DATA_AVAIL	0x04
+#define SMIC_FLAG_BSY		0x01
+
+/* SMIC Error Codes */
+#define	EC_NO_ERROR		0x00
+#define	EC_ABORTED		0x01
+#define	EC_ILLEGAL_CONTROL	0x02
+#define	EC_NO_RESPONSE		0x03
+#define	EC_ILLEGAL_COMMAND	0x04
+#define	EC_BUFFER_FULL		0x05
+
+struct si_sm_data
+{
+	enum smic_states state;
+	struct si_sm_io *io;
+        unsigned char	 write_data[MAX_SMIC_WRITE_SIZE];
+        int		 write_pos;
+        int		 write_count;
+        int		 orig_write_count;
+        unsigned char	 read_data[MAX_SMIC_READ_SIZE];
+        int		 read_pos;
+        int		 truncated;
+        unsigned int	 error_retries;
+        long		 smic_timeout;
+};
+
+static unsigned int init_smic_data (struct si_sm_data *smic,
+				    struct si_sm_io *io)
+{
+	smic->state = SMIC_IDLE;
+	smic->io = io;
+	smic->write_pos = 0;
+	smic->write_count = 0;
+	smic->orig_write_count = 0;
+	smic->read_pos = 0;
+	smic->error_retries = 0;
+	smic->truncated = 0;
+	smic->smic_timeout = SMIC_RETRY_TIMEOUT;
+
+	/* We use 3 bytes of I/O. */
+	return 3;
+}
+
+static int start_smic_transaction(struct si_sm_data *smic,
+				  unsigned char *data, unsigned int size)
+{
+	unsigned int i;
+
+	if ((size < 2) || (size > MAX_SMIC_WRITE_SIZE)) {
+		return -1;
+	}
+	if ((smic->state != SMIC_IDLE) && (smic->state != SMIC_HOSED)) {
+		return -2;
+	}
+	if (smic_debug & SMIC_DEBUG_MSG) {
+		printk(KERN_INFO "start_smic_transaction -");
+		for (i = 0; i < size; i ++) {
+			printk (" %02x", (unsigned char) (data [i]));
+		}
+		printk ("\n");
+	}
+	smic->error_retries = 0;
+	memcpy(smic->write_data, data, size);
+	smic->write_count = size;
+	smic->orig_write_count = size;
+	smic->write_pos = 0;
+	smic->read_pos = 0;
+	smic->state = SMIC_START_OP;
+	smic->smic_timeout = SMIC_RETRY_TIMEOUT;
+	return 0;
+}
+
+static int smic_get_result(struct si_sm_data *smic,
+			   unsigned char *data, unsigned int length)
+{
+	int i;
+
+	if (smic_debug & SMIC_DEBUG_MSG) {
+		printk (KERN_INFO "smic_get result -");
+		for (i = 0; i < smic->read_pos; i ++) {
+			printk (" %02x", (smic->read_data [i]));
+		}
+		printk ("\n");
+	}
+	if (length < smic->read_pos) {
+		smic->read_pos = length;
+		smic->truncated = 1;
+	}
+	memcpy(data, smic->read_data, smic->read_pos);
+
+	if ((length >= 3) && (smic->read_pos < 3)) {
+		data[2] = IPMI_ERR_UNSPECIFIED;
+		smic->read_pos = 3;
+	}
+	if (smic->truncated) {
+		data[2] = IPMI_ERR_MSG_TRUNCATED;
+		smic->truncated = 0;
+	}
+	return smic->read_pos;
+}
+
+static inline unsigned char read_smic_flags(struct si_sm_data *smic)
+{
+	return smic->io->inputb(smic->io, 2);
+}
+
+static inline unsigned char read_smic_status(struct si_sm_data *smic)
+{
+	return smic->io->inputb(smic->io, 1);
+}
+
+static inline unsigned char read_smic_data(struct si_sm_data *smic)
+{
+	return smic->io->inputb(smic->io, 0);
+}
+
+static inline void write_smic_flags(struct si_sm_data *smic,
+				    unsigned char   flags)
+{
+	smic->io->outputb(smic->io, 2, flags);
+}
+
+static inline void write_smic_control(struct si_sm_data *smic,
+				      unsigned char   control)
+{
+	smic->io->outputb(smic->io, 1, control);
+}
+
+static inline void write_si_sm_data (struct si_sm_data *smic,
+				   unsigned char   data)
+{
+	smic->io->outputb(smic->io, 0, data);
+}
+
+static inline void start_error_recovery(struct si_sm_data *smic, char *reason)
+{
+	(smic->error_retries)++;
+	if (smic->error_retries > SMIC_MAX_ERROR_RETRIES) {
+		if (smic_debug & SMIC_DEBUG_ENABLE) {
+			printk(KERN_WARNING
+			       "ipmi_smic_drv: smic hosed: %s\n", reason);
+		}
+		smic->state = SMIC_HOSED;
+	} else {
+		smic->write_count = smic->orig_write_count;
+		smic->write_pos = 0;
+		smic->read_pos = 0;
+		smic->state = SMIC_START_OP;
+		smic->smic_timeout = SMIC_RETRY_TIMEOUT;
+	}
+}
+
+static inline void write_next_byte(struct si_sm_data *smic)
+{
+	write_si_sm_data(smic, smic->write_data[smic->write_pos]);
+	(smic->write_pos)++;
+	(smic->write_count)--;
+}
+
+static inline void read_next_byte (struct si_sm_data *smic)
+{
+	if (smic->read_pos >= MAX_SMIC_READ_SIZE) {
+		read_smic_data (smic);
+		smic->truncated = 1;
+	} else {
+		smic->read_data[smic->read_pos] = read_smic_data(smic);
+		(smic->read_pos)++;
+	}
+}
+
+/*  SMIC Control/Status Code Components */
+#define	SMIC_GET_STATUS		0x00	/* Control form's name */
+#define	SMIC_READY		0x00	/* Status  form's name */
+#define	SMIC_WR_START		0x01	/* Unified Control/Status names... */
+#define	SMIC_WR_NEXT		0x02
+#define	SMIC_WR_END		0x03
+#define	SMIC_RD_START		0x04
+#define	SMIC_RD_NEXT		0x05
+#define	SMIC_RD_END		0x06
+#define	SMIC_CODE_MASK		0x0f
+
+#define	SMIC_CONTROL		0x00
+#define	SMIC_STATUS		0x80
+#define	SMIC_CS_MASK		0x80
+
+#define	SMIC_SMS		0x40
+#define	SMIC_SMM		0x60
+#define	SMIC_STREAM_MASK	0x60
+
+/*  SMIC Control Codes */
+#define	SMIC_CC_SMS_GET_STATUS	(SMIC_CONTROL|SMIC_SMS|SMIC_GET_STATUS)
+#define	SMIC_CC_SMS_WR_START	(SMIC_CONTROL|SMIC_SMS|SMIC_WR_START)
+#define	SMIC_CC_SMS_WR_NEXT	(SMIC_CONTROL|SMIC_SMS|SMIC_WR_NEXT)
+#define	SMIC_CC_SMS_WR_END	(SMIC_CONTROL|SMIC_SMS|SMIC_WR_END)
+#define	SMIC_CC_SMS_RD_START	(SMIC_CONTROL|SMIC_SMS|SMIC_RD_START)
+#define	SMIC_CC_SMS_RD_NEXT	(SMIC_CONTROL|SMIC_SMS|SMIC_RD_NEXT)
+#define	SMIC_CC_SMS_RD_END	(SMIC_CONTROL|SMIC_SMS|SMIC_RD_END)
+
+#define	SMIC_CC_SMM_GET_STATUS	(SMIC_CONTROL|SMIC_SMM|SMIC_GET_STATUS)
+#define	SMIC_CC_SMM_WR_START	(SMIC_CONTROL|SMIC_SMM|SMIC_WR_START)
+#define	SMIC_CC_SMM_WR_NEXT	(SMIC_CONTROL|SMIC_SMM|SMIC_WR_NEXT)
+#define	SMIC_CC_SMM_WR_END	(SMIC_CONTROL|SMIC_SMM|SMIC_WR_END)
+#define	SMIC_CC_SMM_RD_START	(SMIC_CONTROL|SMIC_SMM|SMIC_RD_START)
+#define	SMIC_CC_SMM_RD_NEXT	(SMIC_CONTROL|SMIC_SMM|SMIC_RD_NEXT)
+#define	SMIC_CC_SMM_RD_END	(SMIC_CONTROL|SMIC_SMM|SMIC_RD_END)
+
+/*  SMIC Status Codes */
+#define	SMIC_SC_SMS_READY	(SMIC_STATUS|SMIC_SMS|SMIC_READY)
+#define	SMIC_SC_SMS_WR_START	(SMIC_STATUS|SMIC_SMS|SMIC_WR_START)
+#define	SMIC_SC_SMS_WR_NEXT	(SMIC_STATUS|SMIC_SMS|SMIC_WR_NEXT)
+#define	SMIC_SC_SMS_WR_END	(SMIC_STATUS|SMIC_SMS|SMIC_WR_END)
+#define	SMIC_SC_SMS_RD_START	(SMIC_STATUS|SMIC_SMS|SMIC_RD_START)
+#define	SMIC_SC_SMS_RD_NEXT	(SMIC_STATUS|SMIC_SMS|SMIC_RD_NEXT)
+#define	SMIC_SC_SMS_RD_END	(SMIC_STATUS|SMIC_SMS|SMIC_RD_END)
+
+#define	SMIC_SC_SMM_READY	(SMIC_STATUS|SMIC_SMM|SMIC_READY)
+#define	SMIC_SC_SMM_WR_START	(SMIC_STATUS|SMIC_SMM|SMIC_WR_START)
+#define	SMIC_SC_SMM_WR_NEXT	(SMIC_STATUS|SMIC_SMM|SMIC_WR_NEXT)
+#define	SMIC_SC_SMM_WR_END	(SMIC_STATUS|SMIC_SMM|SMIC_WR_END)
+#define	SMIC_SC_SMM_RD_START	(SMIC_STATUS|SMIC_SMM|SMIC_RD_START)
+#define	SMIC_SC_SMM_RD_NEXT	(SMIC_STATUS|SMIC_SMM|SMIC_RD_NEXT)
+#define	SMIC_SC_SMM_RD_END	(SMIC_STATUS|SMIC_SMM|SMIC_RD_END)
+
+/* these are the control/status codes we actually use
+	SMIC_CC_SMS_GET_STATUS	0x40
+	SMIC_CC_SMS_WR_START	0x41
+	SMIC_CC_SMS_WR_NEXT	0x42
+	SMIC_CC_SMS_WR_END	0x43
+	SMIC_CC_SMS_RD_START	0x44
+	SMIC_CC_SMS_RD_NEXT	0x45
+	SMIC_CC_SMS_RD_END	0x46
+
+	SMIC_SC_SMS_READY	0xC0
+	SMIC_SC_SMS_WR_START	0xC1
+	SMIC_SC_SMS_WR_NEXT	0xC2
+	SMIC_SC_SMS_WR_END	0xC3
+	SMIC_SC_SMS_RD_START	0xC4
+	SMIC_SC_SMS_RD_NEXT	0xC5
+	SMIC_SC_SMS_RD_END	0xC6
+*/
+
+static enum si_sm_result smic_event (struct si_sm_data *smic, long time)
+{
+	unsigned char status;
+	unsigned char flags;
+	unsigned char data;
+
+	if (smic->state == SMIC_HOSED) {
+		init_smic_data(smic, smic->io);
+		return SI_SM_HOSED;
+	}
+	if (smic->state != SMIC_IDLE) {
+		if (smic_debug & SMIC_DEBUG_STATES) {
+			printk(KERN_INFO
+			       "smic_event - smic->smic_timeout = %ld,"
+			       " time = %ld\n",
+			       smic->smic_timeout, time);
+		}
+/* FIXME: smic_event is sometimes called with time > SMIC_RETRY_TIMEOUT */
+		if (time < SMIC_RETRY_TIMEOUT) {
+			smic->smic_timeout -= time;
+			if (smic->smic_timeout < 0) {
+				start_error_recovery(smic, "smic timed out.");
+				return SI_SM_CALL_WITH_DELAY;
+			}
+		}
+	}
+	flags = read_smic_flags(smic);
+	if (flags & SMIC_FLAG_BSY)
+		return SI_SM_CALL_WITH_DELAY;
+
+	status = read_smic_status (smic);
+	if (smic_debug & SMIC_DEBUG_STATES)
+		printk(KERN_INFO
+		       "smic_event - state = %d, flags = 0x%02x,"
+		       " status = 0x%02x\n",
+		       smic->state, flags, status);
+
+	switch (smic->state) {
+	case SMIC_IDLE:
+		/* in IDLE we check for available messages */
+		if (flags & (SMIC_SMI |
+			     SMIC_EVM_DATA_AVAIL | SMIC_SMS_DATA_AVAIL))
+		{
+			return SI_SM_ATTN;
+		}
+		return SI_SM_IDLE;
+
+	case SMIC_START_OP:
+		/* sanity check whether smic is really idle */
+		write_smic_control(smic, SMIC_CC_SMS_GET_STATUS);
+		write_smic_flags(smic, flags | SMIC_FLAG_BSY);
+		smic->state = SMIC_OP_OK;
+		break;
+
+	case SMIC_OP_OK:
+		if (status != SMIC_SC_SMS_READY) {
+				/* this should not happen */
+			start_error_recovery(smic,
+					     "state = SMIC_OP_OK,"
+					     " status != SMIC_SC_SMS_READY");
+			return SI_SM_CALL_WITH_DELAY;
+		}
+		/* OK so far; smic is idle let us start ... */
+		write_smic_control(smic, SMIC_CC_SMS_WR_START);
+		write_next_byte(smic);
+		write_smic_flags(smic, flags | SMIC_FLAG_BSY);
+		smic->state = SMIC_WRITE_START;
+		break;
+
+	case SMIC_WRITE_START:
+		if (status != SMIC_SC_SMS_WR_START) {
+			start_error_recovery(smic,
+					     "state = SMIC_WRITE_START, "
+					     "status != SMIC_SC_SMS_WR_START");
+			return SI_SM_CALL_WITH_DELAY;
+		}
+		/* we must not issue WR_(NEXT|END) unless
+                   TX_DATA_READY is set */
+		if (flags & SMIC_TX_DATA_READY) {
+			if (smic->write_count == 1) {
+				/* last byte */
+				write_smic_control(smic, SMIC_CC_SMS_WR_END);
+				smic->state = SMIC_WRITE_END;
+			} else {
+				write_smic_control(smic, SMIC_CC_SMS_WR_NEXT);
+				smic->state = SMIC_WRITE_NEXT;
+			}
+			write_next_byte(smic);
+			write_smic_flags(smic, flags | SMIC_FLAG_BSY);
+		}
+		else {
+			return SI_SM_CALL_WITH_DELAY;
+		}
+		break;
+
+	case SMIC_WRITE_NEXT:
+		if (status != SMIC_SC_SMS_WR_NEXT) {
+			start_error_recovery(smic,
+					     "state = SMIC_WRITE_NEXT, "
+					     "status != SMIC_SC_SMS_WR_NEXT");
+			return SI_SM_CALL_WITH_DELAY;
+		}
+		/* this is the same code as in SMIC_WRITE_START */
+		if (flags & SMIC_TX_DATA_READY) {
+			if (smic->write_count == 1) {
+				write_smic_control(smic, SMIC_CC_SMS_WR_END);
+				smic->state = SMIC_WRITE_END;
+			}
+			else {
+				write_smic_control(smic, SMIC_CC_SMS_WR_NEXT);
+				smic->state = SMIC_WRITE_NEXT;
+			}
+			write_next_byte(smic);
+			write_smic_flags(smic, flags | SMIC_FLAG_BSY);
+		}
+		else {
+			return SI_SM_CALL_WITH_DELAY;
+		}
+		break;
+
+	case SMIC_WRITE_END:
+		if (status != SMIC_SC_SMS_WR_END) {
+			start_error_recovery (smic,
+					      "state = SMIC_WRITE_END, "
+					      "status != SMIC_SC_SMS_WR_END");
+			return SI_SM_CALL_WITH_DELAY;
+		}
+		/* data register holds an error code */
+		data = read_smic_data(smic);
+		if (data != 0) {
+			if (smic_debug & SMIC_DEBUG_ENABLE) {
+				printk(KERN_INFO
+				       "SMIC_WRITE_END: data = %02x\n", data);
+			}
+			start_error_recovery(smic,
+					     "state = SMIC_WRITE_END, "
+					     "data != SUCCESS");
+			return SI_SM_CALL_WITH_DELAY;
+		} else {
+			smic->state = SMIC_WRITE2READ;
+		}
+		break;
+
+	case SMIC_WRITE2READ:
+		/* we must wait for RX_DATA_READY to be set before we
+                   can continue */
+		if (flags & SMIC_RX_DATA_READY) {
+			write_smic_control(smic, SMIC_CC_SMS_RD_START);
+			write_smic_flags(smic, flags | SMIC_FLAG_BSY);
+			smic->state = SMIC_READ_START;
+		} else {
+			return SI_SM_CALL_WITH_DELAY;
+		}
+		break;
+
+	case SMIC_READ_START:
+		if (status != SMIC_SC_SMS_RD_START) {
+			start_error_recovery(smic,
+					     "state = SMIC_READ_START, "
+					     "status != SMIC_SC_SMS_RD_START");
+			return SI_SM_CALL_WITH_DELAY;
+		}
+		if (flags & SMIC_RX_DATA_READY) {
+			read_next_byte(smic);
+			write_smic_control(smic, SMIC_CC_SMS_RD_NEXT);
+			write_smic_flags(smic, flags | SMIC_FLAG_BSY);
+			smic->state = SMIC_READ_NEXT;
+		} else {
+			return SI_SM_CALL_WITH_DELAY;
+		}
+		break;
+
+	case SMIC_READ_NEXT:
+		switch (status) {
+		/* smic tells us that this is the last byte to be read
+                   --> clean up */
+		case SMIC_SC_SMS_RD_END:
+			read_next_byte(smic);
+			write_smic_control(smic, SMIC_CC_SMS_RD_END);
+			write_smic_flags(smic, flags | SMIC_FLAG_BSY);
+			smic->state = SMIC_READ_END;
+			break;
+		case SMIC_SC_SMS_RD_NEXT:
+			if (flags & SMIC_RX_DATA_READY) {
+				read_next_byte(smic);
+				write_smic_control(smic, SMIC_CC_SMS_RD_NEXT);
+				write_smic_flags(smic, flags | SMIC_FLAG_BSY);
+				smic->state = SMIC_READ_NEXT;
+			} else {
+				return SI_SM_CALL_WITH_DELAY;
+			}
+			break;
+		default:
+			start_error_recovery(
+				smic,
+				"state = SMIC_READ_NEXT, "
+				"status != SMIC_SC_SMS_RD_(NEXT|END)");
+			return SI_SM_CALL_WITH_DELAY;
+		}
+		break;
+
+	case SMIC_READ_END:
+		if (status != SMIC_SC_SMS_READY) {
+			start_error_recovery(smic,
+					     "state = SMIC_READ_END, "
+					     "status != SMIC_SC_SMS_READY");
+			return SI_SM_CALL_WITH_DELAY;
+		}
+		data = read_smic_data(smic);
+		/* data register holds an error code */
+		if (data != 0) {
+			if (smic_debug & SMIC_DEBUG_ENABLE) {
+				printk(KERN_INFO
+				       "SMIC_READ_END: data = %02x\n", data);
+			}
+			start_error_recovery(smic,
+					     "state = SMIC_READ_END, "
+					     "data != SUCCESS");
+			return SI_SM_CALL_WITH_DELAY;
+		} else {
+			smic->state = SMIC_IDLE;
+			return SI_SM_TRANSACTION_COMPLETE;
+		}
+
+	case SMIC_HOSED:
+		init_smic_data(smic, smic->io);
+		return SI_SM_HOSED;
+
+	default:
+		if (smic_debug & SMIC_DEBUG_ENABLE) {
+			printk(KERN_WARNING "smic->state = %d\n", smic->state);
+			start_error_recovery(smic, "state = UNKNOWN");
+			return SI_SM_CALL_WITH_DELAY;
+		}
+	}
+	smic->smic_timeout = SMIC_RETRY_TIMEOUT;
+	return SI_SM_CALL_WITHOUT_DELAY;
+}
+
+static int smic_detect(struct si_sm_data *smic)
+{
+	/* It's impossible for the SMIC fnags register to be all 1's,
+	   (assuming a properly functioning, self-initialized BMC)
+	   but that's what you get from reading a bogus address, so we
+	   test that first. */
+	if (read_smic_flags(smic) == 0xff)
+		return 1;
+
+	return 0;
+}
+
+static void smic_cleanup(struct si_sm_data *kcs)
+{
+}
+
+static int smic_size(void)
+{
+	return sizeof(struct si_sm_data);
+}
+
+struct si_sm_handlers smic_smi_handlers =
+{
+	.version           = IPMI_SMIC_VERSION,
+	.init_data         = init_smic_data,
+	.start_transaction = start_smic_transaction,
+	.get_result        = smic_get_result,
+	.event             = smic_event,
+	.detect            = smic_detect,
+	.cleanup           = smic_cleanup,
+	.size              = smic_size,
+};
--- diff/drivers/i2c/busses/i2c-ali1563.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/i2c/busses/i2c-ali1563.c	2004-04-21 10:45:34.201504080 +0100
@@ -0,0 +1,417 @@
+/**
+ *	i2c-ali1563.c - i2c driver for the ALi 1563 Southbridge
+ *
+ *	Copyright (C) 2004 Patrick Mochel
+ *
+ *	The 1563 southbridge is deceptively similar to the 1533, with a
+ *	few notable exceptions. One of those happens to be the fact they
+ *	upgraded the i2c core to be 2.0 compliant, and happens to be almost
+ *	identical to the i2c controller found in the Intel 801 south
+ *	bridges.
+ *
+ *	This driver is based on a mix of the 15x3, 1535, and i801 drivers,
+ *	with a little help from the ALi 1563 spec.
+ *
+ *	This file is released under the GPLv2
+ */
+
+#include <linux/module.h>
+#include <linux/i2c.h>
+#include <linux/pci.h>
+#include <linux/init.h>
+
+#define ALI1563_MAX_TIMEOUT	500
+#define	ALI1563_SMBBA		0x80
+#define ALI1563_SMB_IOEN	1
+#define ALI1563_SMB_HOSTEN	2
+#define ALI1563_SMB_IOSIZE	16
+
+#define SMB_HST_STS	(ali1563_smba + 0)
+#define SMB_HST_CNTL1	(ali1563_smba + 1)
+#define SMB_HST_CNTL2	(ali1563_smba + 2)
+#define SMB_HST_CMD	(ali1563_smba + 3)
+#define SMB_HST_ADD	(ali1563_smba + 4)
+#define SMB_HST_DAT0	(ali1563_smba + 5)
+#define SMB_HST_DAT1	(ali1563_smba + 6)
+#define SMB_BLK_DAT	(ali1563_smba + 7)
+
+#define HST_STS_BUSY	0x01
+#define HST_STS_INTR	0x02
+#define HST_STS_DEVERR	0x04
+#define HST_STS_BUSERR	0x08
+#define HST_STS_FAIL	0x10
+#define HST_STS_DONE	0x80
+#define HST_STS_BAD	0x1c
+
+
+#define HST_CNTL1_TIMEOUT	0x80
+#define HST_CNTL1_LAST		0x40
+
+#define HST_CNTL2_KILL		0x04
+#define HST_CNTL2_START		0x40
+#define HST_CNTL2_QUICK		0x00
+#define HST_CNTL2_BYTE		0x01
+#define HST_CNTL2_BYTE_DATA	0x02
+#define HST_CNTL2_WORD_DATA	0x03
+#define HST_CNTL2_BLOCK		0x05
+
+
+
+static unsigned short ali1563_smba;
+
+static int ali1563_transaction(struct i2c_adapter * a)
+{
+	u32 data;
+	int timeout;
+
+	dev_dbg(&a->dev, "Transaction (pre): STS=%02x, CNTL1=%02x, "
+		"CNTL2=%02x, CMD=%02x, ADD=%02x, DAT0=%02x, DAT1=%02x\n",
+		inb_p(SMB_HST_STS), inb_p(SMB_HST_CNTL1), inb_p(SMB_HST_CNTL2),
+		inb_p(SMB_HST_CMD), inb_p(SMB_HST_ADD), inb_p(SMB_HST_DAT0),
+		inb_p(SMB_HST_DAT1));
+
+	data = inb_p(SMB_HST_STS);
+	if (data & HST_STS_BAD) {
+		dev_warn(&a->dev,"ali1563: Trying to reset busy device\n");
+		outb_p(data | HST_STS_BAD,SMB_HST_STS);
+		data = inb_p(SMB_HST_STS);
+		if (data & HST_STS_BAD)
+			return -EBUSY;
+	}
+	outb_p(inb_p(SMB_HST_CNTL2) | HST_CNTL2_START, SMB_HST_CNTL2);
+
+	timeout = ALI1563_MAX_TIMEOUT;
+	do
+		i2c_delay(1);
+	while (((data = inb_p(SMB_HST_STS)) & HST_STS_BUSY) && --timeout);
+
+	dev_dbg(&a->dev, "Transaction (post): STS=%02x, CNTL1=%02x, "
+		"CNTL2=%02x, CMD=%02x, ADD=%02x, DAT0=%02x, DAT1=%02x\n",
+		inb_p(SMB_HST_STS), inb_p(SMB_HST_CNTL1), inb_p(SMB_HST_CNTL2),
+		inb_p(SMB_HST_CMD), inb_p(SMB_HST_ADD), inb_p(SMB_HST_DAT0),
+		inb_p(SMB_HST_DAT1));
+
+	if (timeout && !(data & HST_STS_BAD))
+		return 0;
+	dev_warn(&a->dev, "SMBus Error: %s%s%s%s%s\n",
+		timeout ? "Timeout " : "",
+		data & HST_STS_FAIL ? "Transaction Failed " : "",
+		data & HST_STS_BUSERR ? "No response or Bus Collision " : "",
+		data & HST_STS_DEVERR ? "Device Error " : "",
+		!(data & HST_STS_DONE) ? "Transaction Never Finished " : "");
+
+	if (!(data & HST_STS_DONE))
+		/* Issue 'kill' to host controller */
+		outb_p(HST_CNTL2_KILL,SMB_HST_CNTL2);
+	else
+		/* Issue timeout to reset all devices on bus */
+		outb_p(HST_CNTL1_TIMEOUT,SMB_HST_CNTL1);
+	return -1;
+}
+
+static int ali1563_block_start(struct i2c_adapter * a)
+{
+	u32 data;
+	int timeout;
+
+	dev_dbg(&a->dev, "Block (pre): STS=%02x, CNTL1=%02x, "
+		"CNTL2=%02x, CMD=%02x, ADD=%02x, DAT0=%02x, DAT1=%02x\n",
+		inb_p(SMB_HST_STS), inb_p(SMB_HST_CNTL1), inb_p(SMB_HST_CNTL2),
+		inb_p(SMB_HST_CMD), inb_p(SMB_HST_ADD), inb_p(SMB_HST_DAT0),
+		inb_p(SMB_HST_DAT1));
+
+	data = inb_p(SMB_HST_STS);
+	if (data & HST_STS_BAD) {
+		dev_warn(&a->dev,"ali1563: Trying to reset busy device\n");
+		outb_p(data | HST_STS_BAD,SMB_HST_STS);
+		data = inb_p(SMB_HST_STS);
+		if (data & HST_STS_BAD)
+			return -EBUSY;
+	}
+
+	/* Clear byte-ready bit */
+	outb_p(data | HST_STS_DONE, SMB_HST_STS);
+
+	/* Start transaction and wait for byte-ready bit to be set */
+	outb_p(inb_p(SMB_HST_CNTL2) | HST_CNTL2_START, SMB_HST_CNTL2);
+
+	timeout = ALI1563_MAX_TIMEOUT;
+	do
+		i2c_delay(1);
+	while (!((data = inb_p(SMB_HST_STS)) & HST_STS_DONE) && --timeout);
+
+	dev_dbg(&a->dev, "Block (post): STS=%02x, CNTL1=%02x, "
+		"CNTL2=%02x, CMD=%02x, ADD=%02x, DAT0=%02x, DAT1=%02x\n",
+		inb_p(SMB_HST_STS), inb_p(SMB_HST_CNTL1), inb_p(SMB_HST_CNTL2),
+		inb_p(SMB_HST_CMD), inb_p(SMB_HST_ADD), inb_p(SMB_HST_DAT0),
+		inb_p(SMB_HST_DAT1));
+
+	if (timeout && !(data & HST_STS_BAD))
+		return 0;
+	dev_warn(&a->dev, "SMBus Error: %s%s%s%s%s\n",
+		timeout ? "Timeout " : "",
+		data & HST_STS_FAIL ? "Transaction Failed " : "",
+		data & HST_STS_BUSERR ? "No response or Bus Collision " : "",
+		data & HST_STS_DEVERR ? "Device Error " : "",
+		!(data & HST_STS_DONE) ? "Transaction Never Finished " : "");
+	return -1;
+}
+
+static int ali1563_block(struct i2c_adapter * a, union i2c_smbus_data * data, u8 rw)
+{
+	int i, len;
+	int error = 0;
+
+	/* Do we need this? */
+	outb_p(HST_CNTL1_LAST,SMB_HST_CNTL1);
+
+	if (rw == I2C_SMBUS_WRITE) {
+		len = data->block[0];
+		if (len < 1)
+			len = 1;
+		else if (len > 32)
+			len = 32;
+		outb_p(len,SMB_HST_DAT0);
+		outb_p(data->block[1],SMB_BLK_DAT);
+	} else
+		len = 32;
+
+	outb_p(inb_p(SMB_HST_CNTL2) | HST_CNTL2_BLOCK, SMB_HST_CNTL2);
+
+	for (i = 0; i < len; i++) {
+		if (rw == I2C_SMBUS_WRITE) {
+			outb_p(data->block[i + 1], SMB_BLK_DAT);
+			if ((error = ali1563_block_start(a)))
+				break;
+		} else {
+			if ((error = ali1563_block_start(a)))
+				break;
+			if (i == 0) {
+				len = inb_p(SMB_HST_DAT0);
+				if (len < 1)
+					len = 1;
+				else if (len > 32)
+					len = 32;
+			}
+			data->block[i+1] = inb_p(SMB_BLK_DAT);
+		}
+	}
+	/* Do we need this? */
+	outb_p(HST_CNTL1_LAST,SMB_HST_CNTL1);
+	return error;
+}
+
+static s32 ali1563_access(struct i2c_adapter * a, u16 addr,
+			  unsigned short flags, char rw, u8 cmd,
+			  int size, union i2c_smbus_data * data)
+{
+	int error = 0;
+	int timeout;
+	u32 reg;
+
+	for (timeout = ALI1563_MAX_TIMEOUT; timeout; timeout--) {
+		if (!(reg = inb_p(SMB_HST_STS) & HST_STS_BUSY))
+			break;
+	}
+	if (!timeout)
+		dev_warn(&a->dev,"SMBus not idle. HST_STS = %02x\n",reg);
+	outb_p(0xff,SMB_HST_STS);
+
+	/* Map the size to what the chip understands */
+	switch (size) {
+	case I2C_SMBUS_PROC_CALL:
+		dev_err(&a->dev, "I2C_SMBUS_PROC_CALL not supported!\n");
+		error = -EINVAL;
+		break;
+	case I2C_SMBUS_QUICK:
+		size = HST_CNTL2_QUICK;
+		break;
+	case I2C_SMBUS_BYTE:
+		size = HST_CNTL2_BYTE;
+		break;
+	case I2C_SMBUS_BYTE_DATA:
+		size = HST_CNTL2_BYTE_DATA;
+		break;
+	case I2C_SMBUS_WORD_DATA:
+		size = HST_CNTL2_WORD_DATA;
+		break;
+	case I2C_SMBUS_BLOCK_DATA:
+		size = HST_CNTL2_BLOCK;
+		break;
+	}
+
+	outb_p(((addr & 0x7f) << 1) | (rw & 0x01), SMB_HST_ADD);
+	outb_p(inb_p(SMB_HST_CNTL2) | (size << 3), SMB_HST_CNTL2);
+
+	/* Write the command register */
+	switch(size) {
+	case HST_CNTL2_BYTE:
+		if (rw== I2C_SMBUS_WRITE)
+			outb_p(cmd, SMB_HST_CMD);
+		break;
+	case HST_CNTL2_BYTE_DATA:
+		outb_p(cmd, SMB_HST_CMD);
+		if (rw == I2C_SMBUS_WRITE)
+			outb_p(data->byte, SMB_HST_DAT0);
+		break;
+	case HST_CNTL2_WORD_DATA:
+		outb_p(cmd, SMB_HST_CMD);
+		if (rw == I2C_SMBUS_WRITE) {
+			outb_p(data->word & 0xff, SMB_HST_DAT0);
+			outb_p((data->word & 0xff00) >> 8, SMB_HST_DAT1);
+		}
+		break;
+	case HST_CNTL2_BLOCK:
+		outb_p(cmd, SMB_HST_CMD);
+		error = ali1563_block(a,data,rw);
+		goto Done;
+	}
+
+	if ((error = ali1563_transaction(a)))
+		goto Done;
+
+	if ((rw == I2C_SMBUS_WRITE) || (size == HST_CNTL2_QUICK))
+		goto Done;
+
+	switch (size) {
+	case HST_CNTL2_BYTE:	/* Result put in SMBHSTDAT0 */
+		data->byte = inb_p(SMB_HST_DAT0);
+		break;
+	case HST_CNTL2_BYTE_DATA:
+		data->byte = inb_p(SMB_HST_DAT0);
+		break;
+	case HST_CNTL2_WORD_DATA:
+		data->word = inb_p(SMB_HST_DAT0) + (inb_p(SMB_HST_DAT1) << 8);
+		break;
+	}
+Done:
+	return error;
+}
+
+static u32 ali1563_func(struct i2c_adapter * a)
+{
+	return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
+	    I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
+	    I2C_FUNC_SMBUS_BLOCK_DATA;
+}
+
+
+static void ali1563_enable(struct pci_dev * dev)
+{
+	u16 ctrl;
+
+	pci_read_config_word(dev,ALI1563_SMBBA,&ctrl);
+	ctrl |= 0x7;
+	pci_write_config_word(dev,ALI1563_SMBBA,ctrl);
+}
+
+static int __init ali1563_setup(struct pci_dev * dev)
+{
+	u16 ctrl;
+
+	pci_read_config_word(dev,ALI1563_SMBBA,&ctrl);
+	printk("ali1563: SMBus control = %04x\n",ctrl);
+
+	/* Check if device is even enabled first */
+	if (!(ctrl & ALI1563_SMB_IOEN)) {
+		dev_warn(&dev->dev,"I/O space not enabled, trying manually\n");
+		ali1563_enable(dev);
+	}
+	if (!(ctrl & ALI1563_SMB_IOEN)) {
+		dev_warn(&dev->dev,"I/O space still not enabled, giving up\n");
+		goto Err;
+	}
+	if (!(ctrl & ALI1563_SMB_HOSTEN)) {
+		dev_warn(&dev->dev,"Host Controller not enabled\n");
+		goto Err;
+	}
+
+	/* SMB I/O Base in high 12 bits and must be aligned with the
+	 * size of the I/O space. */
+	ali1563_smba = ctrl & ~(ALI1563_SMB_IOSIZE - 1);
+	if (!ali1563_smba) {
+		dev_warn(&dev->dev,"ali1563_smba Uninitialized\n");
+		goto Err;
+	}
+	if (!request_region(ali1563_smba,ALI1563_SMB_IOSIZE,"i2c-ali1563")) {
+		dev_warn(&dev->dev,"Could not allocate I/O space");
+		goto Err;
+	}
+
+	return 0;
+Err:
+	return -ENODEV;
+}
+
+static void ali1563_shutdown(struct pci_dev *dev)
+{
+	release_region(ali1563_smba,ALI1563_SMB_IOSIZE);
+}
+
+static struct i2c_algorithm ali1563_algorithm = {
+	.name		= "Non-i2c SMBus adapter",
+	.id		= I2C_ALGO_SMBUS,
+	.smbus_xfer	= ali1563_access,
+	.functionality	= ali1563_func,
+};
+
+static struct i2c_adapter ali1563_adapter = {
+	.owner	= THIS_MODULE,
+	.class	= I2C_ADAP_CLASS_SMBUS,
+	.algo	= &ali1563_algorithm,
+};
+
+static int __init ali1563_probe(struct pci_dev * dev,
+				const struct pci_device_id * id_table)
+{
+	int error;
+
+	if ((error = ali1563_setup(dev)))
+		return error;
+	ali1563_adapter.dev.parent = &dev->dev;
+	sprintf(ali1563_adapter.name,"SMBus ALi 1563 Adapter @ %04x",
+		ali1563_smba);
+	if ((error = i2c_add_adapter(&ali1563_adapter)))
+		ali1563_shutdown(dev);
+	printk("%s: Returning %d\n",__FUNCTION__,error);
+	return error;
+}
+
+static void __exit ali1563_remove(struct pci_dev * dev)
+{
+	i2c_del_adapter(&ali1563_adapter);
+	ali1563_shutdown(dev);
+}
+
+static struct pci_device_id __devinitdata ali1563_id_table[] = {
+	{
+		.vendor		= PCI_VENDOR_ID_AL,
+		.device		= PCI_DEVICE_ID_AL_M1563,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+	},
+	{},
+};
+
+static struct pci_driver ali1563_pci_driver = {
+ 	.name		= "i2c-ali1563",
+	.id_table	= ali1563_id_table,
+ 	.probe		= ali1563_probe,
+	.remove		= ali1563_remove,
+};
+
+static int __init ali1563_init(void)
+{
+	return pci_module_init(&ali1563_pci_driver);
+}
+
+module_init(ali1563_init);
+
+static void __exit ali1563_exit(void)
+{
+	pci_unregister_driver(&ali1563_pci_driver);
+}
+
+module_exit(ali1563_exit);
+
+MODULE_LICENSE("GPL");
--- diff/drivers/i2c/chips/pcf8574.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/i2c/chips/pcf8574.c	2004-04-21 10:45:34.210502712 +0100
@@ -0,0 +1,242 @@
+/*
+    pcf8574.c - Part of lm_sensors, Linux kernel modules for hardware
+             monitoring
+    Copyright (c) 2000  Frodo Looijaard <frodol@dds.nl>, 
+                        Philip Edelbrock <phil@netroedge.com>,
+                        Dan Eaton <dan.eaton@rocketlogix.com>
+    Ported to Linux 2.6 by Aurelien Jarno <aurel32@debian.org> with 
+    the help of Jean Delvare <khali@linux-fr.org>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+    
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/* A few notes about the PCF8574:
+
+* The PCF8574 is an 8-bit I/O expander for the I2C bus produced by
+  Philips Semiconductors.  It is designed to provide a byte I2C
+  interface to up to 8 separate devices.
+  
+* The PCF8574 appears as a very simple SMBus device which can be
+  read from or written to with SMBUS byte read/write accesses.
+
+  --Dan
+
+*/
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/i2c.h>
+#include <linux/i2c-sensor.h>
+
+/* Addresses to scan */
+static unsigned short normal_i2c[] = { I2C_CLIENT_END };
+static unsigned short normal_i2c_range[] = { 0x20, 0x27, 0x38, 0x3f, I2C_CLIENT_END };
+static unsigned int normal_isa[] = { I2C_CLIENT_ISA_END };
+static unsigned int normal_isa_range[] = { I2C_CLIENT_ISA_END };
+
+/* Insmod parameters */
+SENSORS_INSMOD_2(pcf8574, pcf8574a);
+
+/* Initial values */
+#define PCF8574_INIT 255	/* All outputs on (input mode) */
+
+/* Each client has this additional data */
+struct pcf8574_data {
+	struct i2c_client client;
+	struct semaphore update_lock;
+
+	u8 read, write;			/* Register values */
+};
+
+static int pcf8574_attach_adapter(struct i2c_adapter *adapter);
+static int pcf8574_detect(struct i2c_adapter *adapter, int address, int kind);
+static int pcf8574_detach_client(struct i2c_client *client);
+static void pcf8574_init_client(struct i2c_client *client);
+static struct pcf8574_data *pcf8574_update_client(struct device *dev);
+
+/* This is the driver that will be inserted */
+static struct i2c_driver pcf8574_driver = {
+	.owner		= THIS_MODULE,
+	.name		= "pcf8574",
+	.id		= I2C_DRIVERID_PCF8574,
+	.flags		= I2C_DF_NOTIFY,
+	.attach_adapter	= pcf8574_attach_adapter,
+	.detach_client	= pcf8574_detach_client,
+};
+
+static int pcf8574_id = 0;
+
+/* following are the sysfs callback functions */
+static ssize_t show_read(struct device *dev, char *buf)
+{
+	struct pcf8574_data *data = pcf8574_update_client(dev);
+	return sprintf(buf, "%u\n", data->read);
+}
+
+static DEVICE_ATTR(read, S_IRUGO, show_read, NULL);
+
+static ssize_t show_write(struct device *dev, char *buf)
+{
+	struct pcf8574_data *data = i2c_get_clientdata(to_i2c_client(dev));
+	return sprintf(buf, "%u\n", data->write);
+}
+
+static ssize_t set_write(struct device *dev, const char *buf,
+			 size_t count)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct pcf8574_data *data = i2c_get_clientdata(client);
+	data->write = simple_strtoul(buf, NULL, 10);
+	i2c_smbus_write_byte(client, data->write);
+	return count;
+}
+
+static DEVICE_ATTR(write, S_IWUSR | S_IRUGO, show_write, set_write);
+
+/*
+ * Real code
+ */
+
+static int pcf8574_attach_adapter(struct i2c_adapter *adapter)
+{
+	return i2c_detect(adapter, &addr_data, pcf8574_detect);
+}
+
+/* This function is called by i2c_detect */
+int pcf8574_detect(struct i2c_adapter *adapter, int address, int kind)
+{
+	struct i2c_client *new_client;
+	struct pcf8574_data *data;
+	int err = 0;
+	const char *client_name = "";
+
+	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE))
+		goto exit;
+
+	/* OK. For now, we presume we have a valid client. We now create the
+	   client structure, even though we cannot fill it completely yet. */
+	if (!(data = kmalloc(sizeof(struct pcf8574_data), GFP_KERNEL))) {
+		err = -ENOMEM;
+		goto exit;
+	}
+	memset(data, 0, sizeof(struct pcf8574_data));
+
+	new_client = &data->client;
+	i2c_set_clientdata(new_client, data);
+	new_client->addr = address;
+	new_client->adapter = adapter;
+	new_client->driver = &pcf8574_driver;
+	new_client->flags = 0;
+
+	/* Now, we would do the remaining detection. But the PCF8574 is plainly
+	   impossible to detect! Stupid chip. */
+
+	/* Determine the chip type */
+	if (kind <= 0) {
+		if (address >= 0x38 && address <= 0x3f)
+			kind = pcf8574a;
+		else
+			kind = pcf8574;
+	}
+
+	if (kind == pcf8574a)
+		client_name = "pcf8574a";
+	else
+		client_name = "pcf8574";
+
+	/* Fill in the remaining client fields and put it into the global list */
+	strlcpy(new_client->name, client_name, I2C_NAME_SIZE);
+
+	new_client->id = pcf8574_id++;
+	init_MUTEX(&data->update_lock);
+
+	/* Tell the I2C layer a new client has arrived */
+	if ((err = i2c_attach_client(new_client)))
+		goto exit_free;
+	
+	/* Initialize the PCF8574 chip */
+	pcf8574_init_client(new_client);
+
+	/* Register sysfs hooks */
+	device_create_file(&new_client->dev, &dev_attr_read);
+	device_create_file(&new_client->dev, &dev_attr_write);
+	return 0;
+
+/* OK, this is not exactly good programming practice, usually. But it is
+   very code-efficient in this case. */
+
+      exit_free:
+	kfree(data);
+      exit:
+	return err;
+}
+
+static int pcf8574_detach_client(struct i2c_client *client)
+{
+	int err;
+
+	if ((err = i2c_detach_client(client))) {
+		dev_err(&client->dev,
+			"Client deregistration failed, client not detached.\n");
+		return err;
+	}
+
+	kfree(i2c_get_clientdata(client));
+	return 0;
+}
+
+/* Called when we have found a new PCF8574. */
+static void pcf8574_init_client(struct i2c_client *client)
+{
+	struct pcf8574_data *data = i2c_get_clientdata(client);
+	data->write = PCF8574_INIT;
+	i2c_smbus_write_byte(client, data->write);
+}
+
+static struct pcf8574_data *pcf8574_update_client(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct pcf8574_data *data = i2c_get_clientdata(client);
+
+	down(&data->update_lock);
+	dev_dbg(&client->dev, "Starting pcf8574 update\n");
+	data->read = i2c_smbus_read_byte(client); 
+	up(&data->update_lock);
+	
+	return data;
+}
+
+static int __init pcf8574_init(void)
+{
+	return i2c_add_driver(&pcf8574_driver);
+}
+
+static void __exit pcf8574_exit(void)
+{
+	i2c_del_driver(&pcf8574_driver);
+}
+
+
+MODULE_AUTHOR
+    ("Frodo Looijaard <frodol@dds.nl>, "
+     "Philip Edelbrock <phil@netroedge.com>, "
+     "Dan Eaton <dan.eaton@rocketlogix.com> "
+     "and Aurelien Jarno <aurelien@aurel32.net>");
+MODULE_DESCRIPTION("PCF8574 driver");
+MODULE_LICENSE("GPL");
+
+module_init(pcf8574_init);
+module_exit(pcf8574_exit);
--- diff/drivers/i2c/chips/pcf8591.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/i2c/chips/pcf8591.c	2004-04-21 10:45:34.211502560 +0100
@@ -0,0 +1,317 @@
+/*
+    pcf8591.c - Part of lm_sensors, Linux kernel modules for hardware
+                monitoring
+    Copyright (C) 2001-2004 Aurelien Jarno <aurelien@aurel32.net>
+    Ported to Linux 2.6 by Aurelien Jarno <aurelien@aurel32.net> with 
+    the help of Jean Delvare <khali@linux-fr.org>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/i2c.h>
+#include <linux/i2c-sensor.h>
+
+/* Addresses to scan */
+static unsigned short normal_i2c[] = { I2C_CLIENT_END };
+static unsigned short normal_i2c_range[] = { 0x48, 0x4f, I2C_CLIENT_END };
+static unsigned int normal_isa[] = { I2C_CLIENT_ISA_END };
+static unsigned int normal_isa_range[] = { I2C_CLIENT_ISA_END };
+
+/* Insmod parameters */
+SENSORS_INSMOD_1(pcf8591);
+
+static int input_mode;
+MODULE_PARM(input_mode, "i");
+MODULE_PARM_DESC(input_mode,
+	"Analog input mode:\n"
+	" 0 = four single ended inputs\n"
+	" 1 = three differential inputs\n"
+	" 2 = single ended and differential mixed\n"
+	" 3 = two differential inputs\n");
+
+/* The PCF8591 control byte
+      7    6    5    4    3    2    1    0  
+   |  0 |AOEF|   AIP   |  0 |AINC|  AICH   | */
+
+/* Analog Output Enable Flag (analog output active if 1) */
+#define PCF8591_CONTROL_AOEF		0x40
+					
+/* Analog Input Programming 
+   0x00 = four single ended inputs
+   0x10 = three differential inputs
+   0x20 = single ended and differential mixed
+   0x30 = two differential inputs */
+#define PCF8591_CONTROL_AIP_MASK	0x30
+
+/* Autoincrement Flag (switch on if 1) */
+#define PCF8591_CONTROL_AINC		0x04
+
+/* Channel selection
+   0x00 = channel 0 
+   0x01 = channel 1
+   0x02 = channel 2
+   0x03 = channel 3 */
+#define PCF8591_CONTROL_AICH_MASK	0x03
+
+/* Initial values */
+#define PCF8591_INIT_CONTROL	((input_mode << 4) | PCF8591_CONTROL_AOEF)
+#define PCF8591_INIT_AOUT	0	/* DAC out = 0 */
+
+/* Conversions */
+#define REG_TO_SIGNED(reg)	(((reg) & 0x80)?((reg) - 256):(reg))
+
+struct pcf8591_data {
+	struct i2c_client client;
+	struct semaphore update_lock;
+
+	u8 control;
+	u8 aout;
+};
+
+static int pcf8591_attach_adapter(struct i2c_adapter *adapter);
+static int pcf8591_detect(struct i2c_adapter *adapter, int address, int kind);
+static int pcf8591_detach_client(struct i2c_client *client);
+static void pcf8591_init_client(struct i2c_client *client);
+static int pcf8591_read_channel(struct device *dev, int channel);
+
+/* This is the driver that will be inserted */
+static struct i2c_driver pcf8591_driver = {
+	.owner		= THIS_MODULE,
+	.name		= "pcf8591",
+	.id		= I2C_DRIVERID_PCF8591,
+	.flags		= I2C_DF_NOTIFY,
+	.attach_adapter	= pcf8591_attach_adapter,
+	.detach_client	= pcf8591_detach_client,
+};
+
+static int pcf8591_id = 0;
+
+/* following are the sysfs callback functions */
+#define show_in_channel(channel)					\
+static ssize_t show_in##channel##_input(struct device *dev, char *buf)	\
+{									\
+	return sprintf(buf, "%d\n", pcf8591_read_channel(dev, channel));\
+}									\
+static DEVICE_ATTR(in##channel##_input, S_IRUGO,			\
+		   show_in##channel##_input, NULL);
+
+show_in_channel(0);
+show_in_channel(1);
+show_in_channel(2);
+show_in_channel(3);
+
+static ssize_t show_out0_ouput(struct device *dev, char *buf)
+{
+	struct pcf8591_data *data = i2c_get_clientdata(to_i2c_client(dev));
+	return sprintf(buf, "%d\n", data->aout * 10);
+}
+
+static ssize_t set_out0_output(struct device *dev, const char *buf, size_t count)
+{
+	unsigned int value;
+	struct i2c_client *client = to_i2c_client(dev);
+	struct pcf8591_data *data = i2c_get_clientdata(client);
+	if ((value = (simple_strtoul(buf, NULL, 10) + 5) / 10) <= 255) {
+		data->aout = value;
+		i2c_smbus_write_byte_data(client, data->control, data->aout);
+		return count;
+	}
+	return -EINVAL;
+}
+
+static DEVICE_ATTR(out0_output, S_IWUSR | S_IRUGO, 
+		   show_out0_ouput, set_out0_output);
+
+static ssize_t show_out0_enable(struct device *dev, char *buf)
+{
+	struct pcf8591_data *data = i2c_get_clientdata(to_i2c_client(dev));
+	return sprintf(buf, "%u\n", !(!(data->control & PCF8591_CONTROL_AOEF)));
+}
+
+static ssize_t set_out0_enable(struct device *dev, const char *buf, size_t count)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct pcf8591_data *data = i2c_get_clientdata(client);
+	if (simple_strtoul(buf, NULL, 10))
+		data->control |= PCF8591_CONTROL_AOEF;
+	else
+		data->control &= ~PCF8591_CONTROL_AOEF;
+	i2c_smbus_write_byte(client, data->control);
+	return count;
+}
+
+static DEVICE_ATTR(out0_enable, S_IWUSR | S_IRUGO, 
+		   show_out0_enable, set_out0_enable);
+
+/*
+ * Real code
+ */
+static int pcf8591_attach_adapter(struct i2c_adapter *adapter)
+{
+	return i2c_detect(adapter, &addr_data, pcf8591_detect);
+}
+
+/* This function is called by i2c_detect */
+int pcf8591_detect(struct i2c_adapter *adapter, int address, int kind)
+{
+	struct i2c_client *new_client;
+	struct pcf8591_data *data;
+	int err = 0;
+
+	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE
+				     | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
+		goto exit;
+
+	/* OK. For now, we presume we have a valid client. We now create the
+	   client structure, even though we cannot fill it completely yet. */
+	if (!(data = kmalloc(sizeof(struct pcf8591_data), GFP_KERNEL))) {
+		err = -ENOMEM;
+		goto exit;
+	}
+	memset(data, 0, sizeof(struct pcf8591_data));
+	
+	new_client = &data->client;
+	i2c_set_clientdata(new_client, data);
+	new_client->addr = address;
+	new_client->adapter = adapter;
+	new_client->driver = &pcf8591_driver;
+	new_client->flags = 0;
+
+	/* Now, we would do the remaining detection. But the PCF8591 is plainly
+	   impossible to detect! Stupid chip. */
+
+	/* Determine the chip type - only one kind supported! */
+	if (kind <= 0)
+		kind = pcf8591;
+
+	/* Fill in the remaining client fields and put it into the global 
+	   list */
+	strlcpy(new_client->name, "pcf8591", I2C_NAME_SIZE);
+
+	new_client->id = pcf8591_id++;
+	init_MUTEX(&data->update_lock);
+
+	/* Tell the I2C layer a new client has arrived */
+	if ((err = i2c_attach_client(new_client)))
+		goto exit_kfree;
+
+	/* Initialize the PCF8591 chip */
+	pcf8591_init_client(new_client);
+
+	/* Register sysfs hooks */
+	device_create_file(&new_client->dev, &dev_attr_out0_enable);
+	device_create_file(&new_client->dev, &dev_attr_out0_output);
+	device_create_file(&new_client->dev, &dev_attr_in0_input);
+	device_create_file(&new_client->dev, &dev_attr_in1_input);
+
+	/* Register input2 if not in "two differential inputs" mode */
+	if (input_mode != 3 )
+		device_create_file(&new_client->dev, &dev_attr_in2_input);
+		
+	/* Register input3 only in "four single ended inputs" mode */
+	if (input_mode == 0)
+		device_create_file(&new_client->dev, &dev_attr_in3_input);
+	
+	return 0;
+	
+	/* OK, this is not exactly good programming practice, usually. But it is
+	   very code-efficient in this case. */
+
+exit_kfree:
+	kfree(data);
+exit:
+	return err;
+}
+
+static int pcf8591_detach_client(struct i2c_client *client)
+{
+	int err;
+
+	if ((err = i2c_detach_client(client))) {
+		dev_err(&client->dev,
+			"Client deregistration failed, client not detached.\n");
+		return err;
+	}
+
+	kfree(i2c_get_clientdata(client));
+	return 0;
+}
+
+/* Called when we have found a new PCF8591. */
+static void pcf8591_init_client(struct i2c_client *client)
+{
+	struct pcf8591_data *data = i2c_get_clientdata(client);
+	data->control = PCF8591_INIT_CONTROL;
+	data->aout = PCF8591_INIT_AOUT;
+
+	i2c_smbus_write_byte_data(client, data->control, data->aout);
+	
+	/* The first byte transmitted contains the conversion code of the 
+	   previous read cycle. FLUSH IT! */
+	i2c_smbus_read_byte(client);
+}
+
+static int pcf8591_read_channel(struct device *dev, int channel)
+{
+	u8 value;
+	struct i2c_client *client = to_i2c_client(dev);
+	struct pcf8591_data *data = i2c_get_clientdata(client);
+
+	down(&data->update_lock);
+
+	if ((data->control & PCF8591_CONTROL_AICH_MASK) != channel) {
+		data->control = (data->control & ~PCF8591_CONTROL_AICH_MASK)
+			      | channel;
+		i2c_smbus_write_byte(client, data->control);
+	
+		/* The first byte transmitted contains the conversion code of 
+		   the previous read cycle. FLUSH IT! */
+		i2c_smbus_read_byte(client);
+	}
+	value = i2c_smbus_read_byte(client);
+
+	up(&data->update_lock);
+
+	if ((channel == 2 && input_mode == 2) ||
+	    (channel != 3 && (input_mode == 1 || input_mode == 3)))
+		return (10 * REG_TO_SIGNED(value));
+	else
+		return (10 * value);
+}
+
+static int __init pcf8591_init(void)
+{
+	if (input_mode < 0 || input_mode > 3) {
+		printk(KERN_WARNING "pcf8591: invalid input_mode (%d)\n",
+		       input_mode);
+		input_mode = 0;
+	}
+	return i2c_add_driver(&pcf8591_driver);
+}
+
+static void __exit pcf8591_exit(void)
+{
+	i2c_del_driver(&pcf8591_driver);
+}
+
+MODULE_AUTHOR("Aurelien Jarno <aurelien@aurel32.net>");
+MODULE_DESCRIPTION("PCF8591 driver");
+MODULE_LICENSE("GPL");
+
+module_init(pcf8591_init);
+module_exit(pcf8591_exit);
--- diff/drivers/media/video/cx88/cx88-vbi.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/media/video/cx88/cx88-vbi.c	2004-04-21 10:45:34.352481128 +0100
@@ -0,0 +1,228 @@
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+
+#include "cx88.h"
+
+static unsigned int vbibufs = 4;
+MODULE_PARM(vbibufs,"i");
+MODULE_PARM_DESC(vbibufs,"number of vbi buffers, range 2-32");
+
+static unsigned int vbi_debug = 0;
+MODULE_PARM(vbi_debug,"i");
+MODULE_PARM_DESC(vbi_debug,"enable debug messages [video]");
+
+#define dprintk(level,fmt, arg...)	if (vbi_debug >= level) \
+	printk(KERN_DEBUG "%s: " fmt, dev->name , ## arg)
+
+/* ------------------------------------------------------------------ */
+
+void cx8800_vbi_fmt(struct cx8800_dev *dev, struct v4l2_format *f)
+{
+	memset(&f->fmt.vbi,0,sizeof(f->fmt.vbi));
+
+	f->fmt.vbi.samples_per_line = VBI_LINE_LENGTH;
+	f->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
+	f->fmt.vbi.offset = 244;
+	f->fmt.vbi.count[0] = VBI_LINE_COUNT;
+	f->fmt.vbi.count[1] = VBI_LINE_COUNT;
+
+	switch (dev->tvnorm->id) {
+	case V4L2_STD_NTSC_M:
+	case V4L2_STD_NTSC_M_JP:
+		f->fmt.vbi.sampling_rate = 28636363;
+		f->fmt.vbi.start[0] = 10 -1;
+		f->fmt.vbi.start[1] = 273 -1;
+		break;
+	case V4L2_STD_PAL_BG:
+	case V4L2_STD_PAL_DK:
+	case V4L2_STD_PAL_I:
+	case V4L2_STD_SECAM:
+		f->fmt.vbi.sampling_rate = 35468950;
+		f->fmt.vbi.start[0] = 7 -1;
+		f->fmt.vbi.start[1] = 319 -1;
+	}
+}
+
+int cx8800_start_vbi_dma(struct cx8800_dev    *dev,
+			 struct cx88_dmaqueue *q,
+			 struct cx88_buffer   *buf)
+{
+	/* setup fifo + format */
+	cx88_sram_channel_setup(dev, &cx88_sram_channels[SRAM_CH24],
+				buf->vb.width, buf->risc.dma);
+
+	cx_write(MO_VBOS_CONTROL, ( (1 << 18) |  // comb filter delay fixup
+				    (1 << 15) |  // enable vbi capture
+				    (1 << 11) ));
+
+	/* reset counter */
+	cx_write(MO_VBI_GPCNTRL,0x3);
+	q->count = 1;
+
+	/* enable irqs */
+	cx_set(MO_PCI_INTMSK, 0x00fc01);
+	cx_set(MO_VID_INTMSK, 0x0f0088);
+
+	/* enable capture */
+	cx_set(VID_CAPTURE_CONTROL,0x18);
+
+	/* start dma */
+	cx_set(MO_DEV_CNTRL2, (1<<5));
+	cx_set(MO_VID_DMACNTRL, 0x88);
+
+	return 0;
+}
+
+int cx8800_restart_vbi_queue(struct cx8800_dev    *dev,
+			     struct cx88_dmaqueue *q)
+{
+	struct cx88_buffer *buf;
+	struct list_head *item;
+
+	if (list_empty(&q->active))
+		return 0;
+
+	buf = list_entry(q->active.next, struct cx88_buffer, vb.queue);
+	dprintk(2,"restart_queue [%p/%d]: restart dma\n",
+		buf, buf->vb.i);
+	cx8800_start_vbi_dma(dev, q, buf);
+	list_for_each(item,&q->active) {
+		buf = list_entry(item, struct cx88_buffer, vb.queue);
+		buf->count = q->count++;
+	}
+	mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
+	return 0;
+}
+
+void cx8800_vbi_timeout(unsigned long data)
+{
+	struct cx8800_dev *dev = (struct cx8800_dev*)data;
+	struct cx88_dmaqueue *q = &dev->vbiq;
+	struct cx88_buffer *buf;
+	unsigned long flags;
+
+	cx88_sram_channel_dump(dev, &cx88_sram_channels[SRAM_CH24]);
+
+	cx_clear(MO_VID_DMACNTRL, 0x88);
+	cx_clear(VID_CAPTURE_CONTROL, 0x18);
+
+	spin_lock_irqsave(&dev->slock,flags);
+	while (!list_empty(&q->active)) {
+		buf = list_entry(q->active.next, struct cx88_buffer, vb.queue);
+		list_del(&buf->vb.queue);
+		buf->vb.state = STATE_ERROR;
+		wake_up(&buf->vb.done);
+		printk("%s: [%p/%d] timeout - dma=0x%08lx\n", dev->name,
+		       buf, buf->vb.i, (unsigned long)buf->risc.dma);
+	}
+	cx8800_restart_vbi_queue(dev,q);
+	spin_unlock_irqrestore(&dev->slock,flags);
+}
+
+/* ------------------------------------------------------------------ */
+
+static int
+vbi_setup(struct file *file, unsigned int *count, unsigned int *size)
+{
+	*size = VBI_LINE_COUNT * VBI_LINE_LENGTH * 2;
+	if (0 == *count)
+		*count = vbibufs;
+	if (*count < 2)
+		*count = 2;
+	if (*count > 32)
+		*count = 32;
+	return 0;
+}
+
+static int
+vbi_prepare(struct file *file, struct videobuf_buffer *vb,
+	    enum v4l2_field field)
+{
+	struct cx8800_fh   *fh  = file->private_data;
+	struct cx8800_dev  *dev = fh->dev;
+	struct cx88_buffer *buf = (struct cx88_buffer*)vb;
+	unsigned int size;
+	int rc;
+
+	size = VBI_LINE_COUNT * VBI_LINE_LENGTH * 2;
+	if (0 != buf->vb.baddr  &&  buf->vb.bsize < size)
+		return -EINVAL;
+
+	if (STATE_NEEDS_INIT == buf->vb.state) {
+		buf->vb.width  = VBI_LINE_LENGTH;
+		buf->vb.height = VBI_LINE_COUNT;
+		buf->vb.size   = size;
+		buf->vb.field  = V4L2_FIELD_SEQ_TB;
+
+		if (0 != (rc = videobuf_iolock(dev->pci,&buf->vb,NULL)))
+			goto fail;
+		cx88_risc_buffer(dev->pci, &buf->risc,
+				 buf->vb.dma.sglist,
+				 0, buf->vb.width * buf->vb.height,
+				 buf->vb.width, 0,
+				 buf->vb.height);
+	}
+	buf->vb.state = STATE_PREPARED;
+	return 0;
+
+ fail:
+	cx88_free_buffer(dev->pci,buf);
+	return rc;
+}
+
+static void
+vbi_queue(struct file *file, struct videobuf_buffer *vb)
+{
+	struct cx88_buffer    *buf  = (struct cx88_buffer*)vb;
+	struct cx88_buffer    *prev;
+	struct cx8800_fh      *fh   = file->private_data;
+	struct cx8800_dev     *dev  = fh->dev;
+	struct cx88_dmaqueue  *q    = &dev->vbiq;
+
+	/* add jump to stopper */
+	buf->risc.jmp[0] = cpu_to_le32(RISC_JUMP | RISC_IRQ1 | 0x10000);
+	buf->risc.jmp[1] = cpu_to_le32(q->stopper.dma);
+
+	if (list_empty(&q->active)) {
+		list_add_tail(&buf->vb.queue,&q->active);
+		cx8800_start_vbi_dma(dev, q, buf);
+		buf->vb.state = STATE_ACTIVE;
+		buf->count    = q->count++;
+		mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
+		dprintk(2,"[%p/%d] vbi_queue - first active\n",
+			buf, buf->vb.i);
+
+	} else {
+		prev = list_entry(q->active.prev, struct cx88_buffer, vb.queue);
+		list_add_tail(&buf->vb.queue,&q->active);
+		buf->vb.state = STATE_ACTIVE;
+		buf->count    = q->count++;
+		prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
+		dprintk(2,"[%p/%d] buffer_queue - append to active\n",
+			buf, buf->vb.i);
+	}
+}
+
+static void vbi_release(struct file *file, struct videobuf_buffer *vb)
+{
+	struct cx88_buffer *buf = (struct cx88_buffer*)vb;
+	struct cx8800_fh   *fh  = file->private_data;
+
+	cx88_free_buffer(fh->dev->pci,buf);
+}
+
+struct videobuf_queue_ops cx8800_vbi_qops = {
+	.buf_setup    = vbi_setup,
+	.buf_prepare  = vbi_prepare,
+	.buf_queue    = vbi_queue,
+	.buf_release  = vbi_release,
+};
+
+/* ------------------------------------------------------------------ */
+/*
+ * Local variables:
+ * c-basic-offset: 8
+ * End:
+ */
--- diff/drivers/net/irda/ali-ircc.h	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/net/irda/ali-ircc.h	2004-04-21 10:45:34.411472160 +0100
@@ -0,0 +1,228 @@
+/*********************************************************************
+ *                
+ * Filename:      ali-ircc.h
+ * Version:       0.5
+ * Description:   Driver for the ALI M1535D and M1543C FIR Controller
+ * Status:        Experimental.
+ * Author:        Benjamin Kong <benjamin_kong@ali.com.tw>
+ * Created at:    2000/10/16 03:46PM
+ * Modified at:   2001/1/3 02:56PM
+ * Modified by:   Benjamin Kong <benjamin_kong@ali.com.tw>
+ * 
+ *     Copyright (c) 2000 Benjamin Kong <benjamin_kong@ali.com.tw>
+ *     All Rights Reserved
+ *      
+ *     This program is free software; you can redistribute it and/or 
+ *     modify it under the terms of the GNU General Public License as 
+ *     published by the Free Software Foundation; either version 2 of 
+ *     the License, or (at your option) any later version.
+ *  
+ ********************************************************************/
+
+#ifndef ALI_IRCC_H
+#define ALI_IRCC_H
+
+#include <linux/time.h>
+
+#include <linux/spinlock.h>
+#include <linux/pm.h>
+#include <asm/io.h>
+
+/* SIR Register */
+/* Usr definition of linux/serial_reg.h */
+
+/* FIR Register */
+#define BANK0		0x20
+#define BANK1		0x21
+#define BANK2		0x22
+#define BANK3		0x23
+
+#define FIR_MCR		0x07	/* Master Control Register */
+
+/* Bank 0 */
+#define FIR_DR		0x00	/* Alias 0, FIR Data Register (R/W) */ 
+#define FIR_IER		0x01	/* Alias 1, FIR Interrupt Enable Register (R/W) */
+#define FIR_IIR		0x02	/* Alias 2, FIR Interrupt Identification Register (Read only) */
+#define FIR_LCR_A	0x03	/* Alias 3, FIR Line Control Register A (R/W) */
+#define FIR_LCR_B	0x04	/* Alias 4, FIR Line Control Register B (R/W) */
+#define FIR_LSR		0x05	/* Alias 5, FIR Line Status Register (R/W) */
+#define FIR_BSR		0x06	/* Alias 6, FIR Bus Status Register (Read only) */
+
+
+	/* Alias 1 */
+	#define	IER_FIFO	0x10	/* FIR FIFO Interrupt Enable */	
+	#define	IER_TIMER	0x20 	/* Timer Interrupt Enable */ 
+	#define	IER_EOM		0x40	/* End of Message Interrupt Enable */
+	#define IER_ACT		0x80	/* Active Frame Interrupt Enable */
+	
+	/* Alias 2 */
+	#define IIR_FIFO	0x10	/* FIR FIFO Interrupt */
+	#define IIR_TIMER	0x20	/* Timer Interrupt */
+	#define IIR_EOM		0x40	/* End of Message Interrupt */
+	#define IIR_ACT		0x80	/* Active Frame Interrupt */	
+	
+	/* Alias 3 */
+	#define LCR_A_FIFO_RESET 0x80	/* FIFO Reset */
+
+	/* Alias 4 */
+	#define	LCR_B_BW	0x10	/* Brick Wall */
+	#define LCR_B_SIP	0x20	/* SIP Enable */
+	#define	LCR_B_TX_MODE 	0x40	/* Transmit Mode */
+	#define LCR_B_RX_MODE	0x80	/* Receive Mode */
+	
+	/* Alias 5 */	
+	#define LSR_FIR_LSA	0x00	/* FIR Line Status Address */
+	#define LSR_FRAME_ABORT	0x08	/* Frame Abort */
+	#define LSR_CRC_ERROR	0x10	/* CRC Error */
+	#define LSR_SIZE_ERROR	0x20	/* Size Error */
+	#define LSR_FRAME_ERROR	0x40	/* Frame Error */
+	#define LSR_FIFO_UR	0x80	/* FIFO Underrun */
+	#define LSR_FIFO_OR	0x80	/* FIFO Overrun */
+		
+	/* Alias 6 */
+	#define BSR_FIFO_NOT_EMPTY	0x80	/* FIFO Not Empty */
+	
+/* Bank 1 */
+#define	FIR_CR		0x00 	/* Alias 0, FIR Configuration Register (R/W) */
+#define FIR_FIFO_TR	0x01   	/* Alias 1, FIR FIFO Threshold Register (R/W) */
+#define FIR_DMA_TR	0x02	/* Alias 2, FIR DMA Threshold Register (R/W) */
+#define FIR_TIMER_IIR	0x03	/* Alias 3, FIR Timer interrupt interval register (W/O) */
+#define FIR_FIFO_FR	0x03	/* Alias 3, FIR FIFO Flag register (R/O) */
+#define FIR_FIFO_RAR	0x04 	/* Alias 4, FIR FIFO Read Address register (R/O) */
+#define FIR_FIFO_WAR	0x05	/* Alias 5, FIR FIFO Write Address register (R/O) */
+#define FIR_TR		0x06	/* Alias 6, Test REgister (W/O) */
+
+	/* Alias 0 */
+	#define CR_DMA_EN	0x01	/* DMA Enable */
+	#define CR_DMA_BURST	0x02	/* DMA Burst Mode */
+	#define CR_TIMER_EN 	0x08	/* Timer Enable */
+	
+	/* Alias 3 */
+	#define TIMER_IIR_500	0x00	/* 500 us */
+	#define TIMER_IIR_1ms	0x01	/* 1   ms */
+	#define TIMER_IIR_2ms	0x02	/* 2   ms */
+	#define TIMER_IIR_4ms	0x03	/* 4   ms */
+	
+/* Bank 2 */
+#define FIR_IRDA_CR	0x00	/* Alias 0, IrDA Control Register (R/W) */
+#define FIR_BOF_CR	0x01	/* Alias 1, BOF Count Register (R/W) */
+#define FIR_BW_CR	0x02	/* Alias 2, Brick Wall Count Register (R/W) */
+#define FIR_TX_DSR_HI	0x03	/* Alias 3, TX Data Size Register (high) (R/W) */
+#define FIR_TX_DSR_LO	0x04	/* Alias 4, TX Data Size Register (low) (R/W) */
+#define FIR_RX_DSR_HI	0x05	/* Alias 5, RX Data Size Register (high) (R/W) */
+#define FIR_RX_DSR_LO	0x06	/* Alias 6, RX Data Size Register (low) (R/W) */
+	
+	/* Alias 0 */
+	#define IRDA_CR_HDLC1152 0x80	/* 1.152Mbps HDLC Select */
+	#define IRDA_CR_CRC	0X40	/* CRC Select. */
+	#define IRDA_CR_HDLC	0x20	/* HDLC select. */
+	#define IRDA_CR_HP_MODE 0x10	/* HP mode (read only) */
+	#define IRDA_CR_SD_ST	0x08	/* SD/MODE State.  */
+	#define IRDA_CR_FIR_SIN 0x04	/* FIR SIN Select. */
+	#define IRDA_CR_ITTX_0	0x02	/* SOUT State. IRTX force to 0 */
+	#define IRDA_CR_ITTX_1	0x03	/* SOUT State. IRTX force to 1 */
+	
+/* Bank 3 */
+#define FIR_ID_VR	0x00	/* Alias 0, FIR ID Version Register (R/O) */
+#define FIR_MODULE_CR	0x01	/* Alias 1, FIR Module Control Register (R/W) */
+#define FIR_IO_BASE_HI	0x02	/* Alias 2, FIR Higher I/O Base Address Register (R/O) */
+#define FIR_IO_BASE_LO	0x03	/* Alias 3, FIR Lower I/O Base Address Register (R/O) */
+#define FIR_IRQ_CR	0x04	/* Alias 4, FIR IRQ Channel Register (R/O) */
+#define FIR_DMA_CR	0x05	/* Alias 5, FIR DMA Channel Register (R/O) */
+
+struct ali_chip {
+	char *name;
+	int cfg[2];
+	unsigned char entr1;
+	unsigned char entr2;
+	unsigned char cid_index;
+	unsigned char cid_value;
+	int (*probe)(struct ali_chip *chip, chipio_t *info);
+	int (*init)(struct ali_chip *chip, chipio_t *info); 
+};
+typedef struct ali_chip ali_chip_t;
+
+
+/* DMA modes needed */
+#define DMA_TX_MODE     0x08    /* Mem to I/O, ++, demand. */
+#define DMA_RX_MODE     0x04    /* I/O to mem, ++, demand. */
+
+#define MAX_TX_WINDOW 	7
+#define MAX_RX_WINDOW 	7
+
+#define TX_FIFO_Threshold	8
+#define RX_FIFO_Threshold	1
+#define TX_DMA_Threshold	1
+#define RX_DMA_Threshold	1
+
+/* For storing entries in the status FIFO */
+
+struct st_fifo_entry {
+	int status;
+	int len;
+};
+
+struct st_fifo {
+	struct st_fifo_entry entries[MAX_RX_WINDOW];
+	int pending_bytes;
+	int head;
+	int tail;
+	int len;
+};
+
+struct frame_cb {
+	void *start; /* Start of frame in DMA mem */
+	int len;     /* Lenght of frame in DMA mem */
+};
+
+struct tx_fifo {
+	struct frame_cb queue[MAX_TX_WINDOW]; /* Info about frames in queue */
+	int             ptr;                  /* Currently being sent */
+	int             len;                  /* Lenght of queue */
+	int             free;                 /* Next free slot */
+	void           *tail;                 /* Next free start in DMA mem */
+};
+
+/* Private data for each instance */
+struct ali_ircc_cb {
+
+	struct st_fifo st_fifo;    /* Info about received frames */
+	struct tx_fifo tx_fifo;    /* Info about frames to be transmitted */
+
+	struct net_device *netdev;     /* Yes! we are some kind of netdevice */
+	struct net_device_stats stats;
+	
+	struct irlap_cb *irlap;    /* The link layer we are binded to */
+	struct qos_info qos;       /* QoS capabilities for this device */
+	
+	chipio_t io;               /* IrDA controller information */
+	iobuff_t tx_buff;          /* Transmit buffer */
+	iobuff_t rx_buff;          /* Receive buffer */
+
+	__u8 ier;                  /* Interrupt enable register */
+	
+	__u8 InterruptID;	   /* Interrupt ID */	
+	__u8 BusStatus;		   /* Bus Status */	
+	__u8 LineStatus;	   /* Line Status */	
+	
+	unsigned char rcvFramesOverflow;
+		
+	struct timeval stamp;
+	struct timeval now;
+
+	spinlock_t lock;           /* For serializing operations */
+	
+	__u32 new_speed;
+	int index;                 /* Instance index */
+	
+	unsigned char fifo_opti_buf;
+
+        struct pm_dev *dev;
+};
+
+static inline void switch_bank(int iobase, int bank)
+{
+		outb(bank, iobase+FIR_MCR);
+}
+
+#endif /* ALI_IRCC_H */
--- diff/drivers/net/irda/au1000_ircc.h	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/net/irda/au1000_ircc.h	2004-04-21 10:45:34.411472160 +0100
@@ -0,0 +1,127 @@
+/*
+ *
+ * BRIEF MODULE DESCRIPTION
+ *	Au1000 IrDA driver.
+ *
+ * Copyright 2001 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc.
+ *         	ppopov@mvista.com or source@mvista.com
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef AU1000_IRCC_H
+#define AU1000_IRCC_H
+
+#include <linux/time.h>
+
+#include <linux/spinlock.h>
+#include <linux/pm.h>
+#include <asm/io.h>
+
+#define NUM_IR_IFF          1
+#define NUM_IR_DESC        64
+#define RING_SIZE_4       0x0
+#define RING_SIZE_16      0x3
+#define RING_SIZE_64      0xF
+#define MAX_NUM_IR_DESC    64
+#define MAX_BUF_SIZE     2048
+
+#define BPS_115200          0
+#define BPS_57600           1
+#define BPS_38400           2
+#define BPS_19200           5
+#define BPS_9600           11
+#define BPS_2400           47
+
+/* Ring descriptor flags */
+#define AU_OWN           (1<<7) /* tx,rx */
+
+#define IR_DIS_CRC       (1<<6) /* tx */
+#define IR_BAD_CRC       (1<<5) /* tx */
+#define IR_NEED_PULSE    (1<<4) /* tx */
+#define IR_FORCE_UNDER   (1<<3) /* tx */
+#define IR_DISABLE_TX    (1<<2) /* tx */
+#define IR_HW_UNDER      (1<<0) /* tx */
+#define IR_TX_ERROR      (IR_DIS_CRC|IR_BAD_CRC|IR_HW_UNDER)
+
+#define IR_PHY_ERROR     (1<<6) /* rx */
+#define IR_CRC_ERROR     (1<<5) /* rx */
+#define IR_MAX_LEN       (1<<4) /* rx */
+#define IR_FIFO_OVER     (1<<3) /* rx */
+#define IR_SIR_ERROR     (1<<2) /* rx */
+#define IR_RX_ERROR      (IR_PHY_ERROR|IR_CRC_ERROR| \
+		IR_MAX_LEN|IR_FIFO_OVER|IR_SIR_ERROR)
+
+typedef struct db_dest {
+	struct db_dest *pnext;
+	volatile u32 *vaddr;
+	dma_addr_t dma_addr;
+} db_dest_t;
+
+
+typedef struct ring_desc {
+	u8 count_0;               /* 7:0  */
+	u8 count_1;               /* 12:8 */
+	u8 reserved;
+	u8 flags;
+	u8 addr_0;                /* 7:0   */
+	u8 addr_1;                /* 15:8  */
+	u8 addr_2;                /* 23:16 */
+	u8 addr_3;                /* 31:24 */
+} ring_dest_t;
+
+
+/* Private data for each instance */
+struct au1k_private {
+
+	db_dest_t *pDBfree;
+	db_dest_t db[2*NUM_IR_DESC];
+	volatile ring_dest_t *rx_ring[NUM_IR_DESC];
+	volatile ring_dest_t *tx_ring[NUM_IR_DESC];
+	db_dest_t *rx_db_inuse[NUM_IR_DESC];
+	db_dest_t *tx_db_inuse[NUM_IR_DESC];
+	u32 rx_head;
+	u32 tx_head;
+	u32 tx_tail;
+	u32 tx_full;
+
+	iobuff_t rx_buff;
+
+	struct net_device *netdev;
+	struct net_device_stats stats;
+	
+	struct timeval stamp;
+	struct timeval now;
+	struct qos_info		qos;
+	struct irlap_cb		*irlap;
+	
+	u8 open;
+	u32 speed;
+	u32 newspeed;
+	
+	u32 intr_work_done; /* number of Rx and Tx pkts processed in the isr */
+	struct timer_list timer;
+
+	spinlock_t lock;           /* For serializing operations */
+        struct pm_dev *dev;
+};
+#endif /* AU1000_IRCC_H */
--- diff/drivers/net/irda/irda-usb.h	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/net/irda/irda-usb.h	2004-04-21 10:45:34.414471704 +0100
@@ -0,0 +1,163 @@
+/*****************************************************************************
+ *
+ * Filename:      irda-usb.h
+ * Version:       0.9b
+ * Description:   IrDA-USB Driver
+ * Status:        Experimental 
+ * Author:        Dag Brattli <dag@brattli.net>
+ *
+ *	Copyright (C) 2001, Roman Weissgaerber <weissg@vienna.at>
+ *      Copyright (C) 2000, Dag Brattli <dag@brattli.net>
+ *      Copyright (C) 2001, Jean Tourrilhes <jt@hpl.hp.com>
+ *          
+ *	This program is free software; you can redistribute it and/or modify
+ *	it under the terms of the GNU General Public License as published by
+ *	the Free Software Foundation; either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	This program is distributed in the hope that it will be useful,
+ *	but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *	GNU General Public License for more details.
+ *
+ *	You should have received a copy of the GNU General Public License
+ *	along with this program; if not, write to the Free Software
+ *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *****************************************************************************/
+
+#include <linux/time.h>
+
+#include <net/irda/irda.h>
+#include <net/irda/irda_device.h>      /* struct irlap_cb */
+
+#define RX_COPY_THRESHOLD 200
+#define IRDA_USB_MAX_MTU 2051
+#define IRDA_USB_SPEED_MTU 64		/* Weird, but work like this */
+
+/* Maximum number of active URB on the Rx path
+ * This is the amount of buffers the we keep between the USB harware and the
+ * IrDA stack.
+ *
+ * Note : the network layer does also queue the packets between us and the
+ * IrDA stack, and is actually pretty fast and efficient in doing that.
+ * Therefore, we don't need to have a large number of URBs, and we can
+ * perfectly live happy with only one. We certainly don't need to keep the
+ * full IrTTP window around here...
+ * I repeat for those who have trouble to understand : 1 URB is plenty
+ * good enough to handle back-to-back (brickwalled) frames. I tried it,
+ * it works (it's the hardware that has trouble doing it).
+ *
+ * Having 2 URBs would allow the USB stack to process one URB while we take
+ * care of the other and then swap the URBs...
+ * On the other hand, increasing the number of URB will have penalities
+ * in term of latency and will interact with the link management in IrLAP...
+ * Jean II */
+#define IU_MAX_ACTIVE_RX_URBS	1	/* Don't touch !!! */
+
+/* When a Rx URB is passed back to us, we can't reuse it immediately,
+ * because it may still be referenced by the USB layer. Therefore we
+ * need to keep one extra URB in the Rx path.
+ * Jean II */
+#define IU_MAX_RX_URBS	(IU_MAX_ACTIVE_RX_URBS + 1)
+
+/* Various ugly stuff to try to workaround generic problems */
+/* Send speed command in case of timeout, just for trying to get things sane */
+#define IU_BUG_KICK_TIMEOUT
+/* Show the USB class descriptor */
+#undef IU_DUMP_CLASS_DESC 
+/* Assume a minimum round trip latency for USB transfer (in us)...
+ * USB transfer are done in the next USB slot if there is no traffic
+ * (1/19 msec) and is done at 12 Mb/s :
+ * Waiting for slot + tx = (53us + 16us) * 2 = 137us minimum.
+ * Rx notification will only be done at the end of the USB frame period :
+ * OHCI : frame period = 1ms
+ * UHCI : frame period = 1ms, but notification can take 2 or 3 ms :-(
+ * EHCI : frame period = 125us */
+#define IU_USB_MIN_RTT		500	/* This should be safe in most cases */
+
+/* Inbound header */
+#define MEDIA_BUSY    0x80
+
+#define SPEED_2400    0x01
+#define SPEED_9600    0x02
+#define SPEED_19200   0x03
+#define SPEED_38400   0x04
+#define SPEED_57600   0x05
+#define SPEED_115200  0x06
+#define SPEED_576000  0x07
+#define SPEED_1152000 0x08
+#define SPEED_4000000 0x09
+
+/* Basic capabilities */
+#define IUC_DEFAULT	0x00	/* Basic device compliant with 1.0 spec */
+/* Main bugs */
+#define IUC_SPEED_BUG	0x01	/* Device doesn't set speed after the frame */
+#define IUC_NO_WINDOW	0x02	/* Device doesn't behave with big Rx window */
+#define IUC_NO_TURN	0x04	/* Device doesn't do turnaround by itself */
+/* Not currently used */
+#define IUC_SIR_ONLY	0x08	/* Device doesn't behave at FIR speeds */
+#define IUC_SMALL_PKT	0x10	/* Device doesn't behave with big Rx packets */
+#define IUC_MAX_WINDOW	0x20	/* Device underestimate the Rx window */
+#define IUC_MAX_XBOFS	0x40	/* Device need more xbofs than advertised */
+
+/* USB class definitions */
+#define USB_IRDA_HEADER   0x01
+#define USB_CLASS_IRDA    0x02 /* USB_CLASS_APP_SPEC subclass */ 
+#define USB_DT_IRDA       0x21
+
+struct irda_class_desc {
+	__u8  bLength;
+	__u8  bDescriptorType;
+	__u16 bcdSpecRevision;
+	__u8  bmDataSize;
+	__u8  bmWindowSize;
+	__u8  bmMinTurnaroundTime;
+	__u16 wBaudRate;
+	__u8  bmAdditionalBOFs;
+	__u8  bIrdaRateSniff;
+	__u8  bMaxUnicastList;
+} __attribute__ ((packed));
+
+/* class specific interface request to get the IrDA-USB class descriptor
+ * (6.2.5, USB-IrDA class spec 1.0) */
+
+#define IU_REQ_GET_CLASS_DESC	0x06
+
+struct irda_usb_cb {
+	struct irda_class_desc *irda_desc;
+	struct usb_device *usbdev;	/* init: probe_irda */
+	struct usb_interface *usbintf;	/* init: probe_irda */
+	int netopen;			/* Device is active for network */
+	int present;			/* Device is present on the bus */
+	__u32 capability;		/* Capability of the hardware */
+	__u8  bulk_in_ep;		/* Rx Endpoint assignments */
+	__u8  bulk_out_ep;		/* Tx Endpoint assignments */
+	__u16 bulk_out_mtu;		/* Max Tx packet size in bytes */
+	__u8  bulk_int_ep;		/* Interrupt Endpoint assignments */
+
+	wait_queue_head_t wait_q;	/* for timeouts */
+
+	struct urb *rx_urb[IU_MAX_RX_URBS];	/* URBs used to receive data frames */
+	struct urb *idle_rx_urb;	/* Pointer to idle URB in Rx path */
+	struct urb *tx_urb;		/* URB used to send data frames */
+	struct urb *speed_urb;		/* URB used to send speed commands */
+	
+	struct net_device *netdev;	/* Yes! we are some kind of netdev. */
+	struct net_device_stats stats;
+	struct irlap_cb   *irlap;	/* The link layer we are binded to */
+	struct qos_info qos;
+	hashbin_t *tx_list;		/* Queued transmit skb's */
+	char *speed_buff;		/* Buffer for speed changes */
+
+	struct timeval stamp;
+	struct timeval now;
+
+	spinlock_t lock;		/* For serializing operations */
+
+	__u16 xbofs;			/* Current xbofs setting */
+	__s16 new_xbofs;		/* xbofs we need to set */
+	__u32 speed;			/* Current speed */
+	__s32 new_speed;		/* speed we need to set */
+};
+
--- diff/drivers/net/irda/irport.h	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/net/irda/irport.h	2004-04-21 10:45:34.415471552 +0100
@@ -0,0 +1,90 @@
+/*********************************************************************
+ *                
+ * Filename:      irport.h
+ * Version:       0.1
+ * Description:   Serial driver for IrDA
+ * Status:        Experimental.
+ * Author:        Dag Brattli <dagb@cs.uit.no>
+ * Created at:    Sun Aug  3 13:49:59 1997
+ * Modified at:   Fri Jan 14 10:21:10 2000
+ * Modified by:   Dag Brattli <dagb@cs.uit.no>
+ * 
+ *     Copyright (c) 1997, 1998-2000 Dag Brattli <dagb@cs.uit.no>
+ *     All Rights Reserved.
+ *     
+ *     This program is free software; you can redistribute it and/or 
+ *     modify it under the terms of the GNU General Public License as 
+ *     published by the Free Software Foundation; either version 2 of 
+ *     the License, or (at your option) any later version.
+ *
+ *     Neither Dag Brattli nor University of Tromsø admit liability nor
+ *     provide warranty for any of this software. This material is 
+ *     provided "AS-IS" and at no charge.
+ *
+ ********************************************************************/
+
+#ifndef IRPORT_H
+#define IRPORT_H
+
+#include <linux/netdevice.h>
+#include <linux/skbuff.h>
+#include <linux/types.h>
+#include <linux/spinlock.h>
+
+#include <net/irda/irda_device.h>
+
+#define SPEED_DEFAULT 9600
+#define SPEED_MAX     115200
+
+/*
+ * These are the supported serial types.
+ */
+#define PORT_UNKNOWN    0
+#define PORT_8250       1
+#define PORT_16450      2
+#define PORT_16550      3
+#define PORT_16550A     4
+#define PORT_CIRRUS     5
+#define PORT_16650      6
+#define PORT_MAX        6  
+
+#define FRAME_MAX_SIZE 2048
+
+struct irport_cb {
+	struct net_device *netdev; /* Yes! we are some kind of netdevice */
+	struct net_device_stats stats;
+
+	struct irlap_cb *irlap;    /* The link layer we are attached to */
+
+	chipio_t io;               /* IrDA controller information */
+	iobuff_t tx_buff;          /* Transmit buffer */
+	iobuff_t rx_buff;          /* Receive buffer */
+
+	struct qos_info qos;       /* QoS capabilities for this device */
+	dongle_t *dongle;          /* Dongle driver */
+
+ 	__u32 flags;               /* Interface flags */
+	__u32 new_speed;
+	int mode;
+	int index;                 /* Instance index */
+	int transmitting;	   /* Are we transmitting ? */
+
+	spinlock_t lock;           /* For serializing operations */
+
+	/* For piggyback drivers */
+	void *priv;                
+	void (*change_speed)(void *priv, __u32 speed);
+	int (*interrupt)(int irq, void *dev_id, struct pt_regs *regs);
+};
+
+struct irport_cb *irport_open(int i, unsigned int iobase, unsigned int irq);
+int  irport_close(struct irport_cb *self);
+void irport_start(struct irport_cb *self);
+void irport_stop(struct irport_cb *self);
+void irport_change_speed(void *priv, __u32 speed);
+irqreturn_t irport_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+int  irport_hard_xmit(struct sk_buff *skb, struct net_device *dev);
+int  irport_net_open(struct net_device *dev);
+int  irport_net_close(struct net_device *dev);
+
+#endif /* IRPORT_H */
--- diff/drivers/net/irda/nsc-ircc.h	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/net/irda/nsc-ircc.h	2004-04-21 10:45:34.417471248 +0100
@@ -0,0 +1,277 @@
+/*********************************************************************
+ *                
+ * Filename:      nsc-ircc.h
+ * Version:       
+ * Description:   
+ * Status:        Experimental.
+ * Author:        Dag Brattli <dagb@cs.uit.no>
+ * Created at:    Fri Nov 13 14:37:40 1998
+ * Modified at:   Sun Jan 23 17:47:00 2000
+ * Modified by:   Dag Brattli <dagb@cs.uit.no>
+ * 
+ *     Copyright (c) 1998-2000 Dag Brattli <dagb@cs.uit.no>
+ *     Copyright (c) 1998 Lichen Wang, <lwang@actisys.com>
+ *     Copyright (c) 1998 Actisys Corp., www.actisys.com
+ *     All Rights Reserved
+ *      
+ *     This program is free software; you can redistribute it and/or 
+ *     modify it under the terms of the GNU General Public License as 
+ *     published by the Free Software Foundation; either version 2 of 
+ *     the License, or (at your option) any later version.
+ *  
+ *     Neither Dag Brattli nor University of Tromsø admit liability nor
+ *     provide warranty for any of this software. This material is 
+ *     provided "AS-IS" and at no charge.
+ *     
+ ********************************************************************/
+
+#ifndef NSC_IRCC_H
+#define NSC_IRCC_H
+
+#include <linux/time.h>
+
+#include <linux/spinlock.h>
+#include <linux/pm.h>
+#include <asm/io.h>
+
+/* DMA modes needed */
+#define DMA_TX_MODE     0x08    /* Mem to I/O, ++, demand. */
+#define DMA_RX_MODE     0x04    /* I/O to mem, ++, demand. */
+
+/* Config registers for the '108 */
+#define CFG_108_BAIC 0x00
+#define CFG_108_CSRT 0x01
+#define CFG_108_MCTL 0x02
+
+/* Config registers for the '338 */
+#define CFG_338_FER  0x00
+#define CFG_338_FAR  0x01
+#define CFG_338_PTR  0x02
+#define CFG_338_PNP0 0x1b
+#define CFG_338_PNP1 0x1c
+#define CFG_338_PNP3 0x4f
+
+/* Config registers for the '39x (in the logical device bank) */
+#define CFG_39X_LDN	0x07	/* Logical device number (Super I/O bank) */
+#define CFG_39X_SIOCF1	0x21	/* SuperI/O Config */
+#define CFG_39X_ACT	0x30	/* Device activation */
+#define CFG_39X_BASEH	0x60	/* Device base address (high bits) */
+#define CFG_39X_BASEL	0x61	/* Device base address (low bits) */
+#define CFG_39X_IRQNUM	0x70	/* Interrupt number & wake up enable */
+#define CFG_39X_IRQSEL	0x71	/* Interrupt select (edge/level + polarity) */
+#define CFG_39X_DMA0	0x74	/* DMA 0 configuration */
+#define CFG_39X_DMA1	0x75	/* DMA 1 configuration */
+#define CFG_39X_SPC	0xF0	/* Serial port configuration register */
+
+/* Flags for configuration register CRF0 */
+#define APEDCRC		0x02
+#define ENBNKSEL	0x01
+
+/* Set 0 */
+#define TXD             0x00 /* Transmit data port */
+#define RXD             0x00 /* Receive data port */
+
+/* Register 1 */
+#define IER		0x01 /* Interrupt Enable Register*/
+#define IER_RXHDL_IE    0x01 /* Receiver high data level interrupt */
+#define IER_TXLDL_IE    0x02 /* Transeiver low data level interrupt */
+#define IER_LS_IE	0x04//* Link Status Interrupt */
+#define IER_ETXURI      0x04 /* Tx underrun */
+#define IER_DMA_IE	0x10 /* DMA finished interrupt */
+#define IER_TXEMP_IE    0x20
+#define IER_SFIF_IE     0x40 /* Frame status FIFO intr */
+#define IER_TMR_IE      0x80 /* Timer event */
+
+#define FCR		0x02 /* (write only) */
+#define FCR_FIFO_EN     0x01 /* Enable FIFO's */
+#define FCR_RXSR        0x02 /* Rx FIFO soft reset */
+#define FCR_TXSR        0x04 /* Tx FIFO soft reset */
+#define FCR_RXTH	0x40 /* Rx FIFO threshold (set to 16) */
+#define FCR_TXTH	0x20 /* Tx FIFO threshold (set to 17) */
+
+#define EIR		0x02 /* (read only) */
+#define EIR_RXHDL_EV	0x01
+#define EIR_TXLDL_EV    0x02
+#define EIR_LS_EV	0x04
+#define EIR_DMA_EV	0x10
+#define EIR_TXEMP_EV	0x20
+#define EIR_SFIF_EV     0x40
+#define EIR_TMR_EV      0x80
+
+#define LCR             0x03 /* Link control register */
+#define LCR_WLS_8       0x03 /* 8 bits */
+
+#define BSR 	        0x03 /* Bank select register */
+#define BSR_BKSE        0x80
+#define BANK0 	        LCR_WLS_8 /* Must make sure that we set 8N1 */
+#define BANK1	        0x80
+#define BANK2	        0xe0
+#define BANK3	        0xe4
+#define BANK4	        0xe8
+#define BANK5	        0xec
+#define BANK6	        0xf0
+#define BANK7     	0xf4
+
+#define MCR		0x04 /* Mode Control Register */
+#define MCR_MODE_MASK	~(0xd0)
+#define MCR_UART        0x00
+#define MCR_RESERVED  	0x20	
+#define MCR_SHARP_IR    0x40
+#define MCR_SIR         0x60
+#define MCR_MIR  	0x80
+#define MCR_FIR		0xa0
+#define MCR_CEIR        0xb0
+#define MCR_IR_PLS      0x10
+#define MCR_DMA_EN	0x04
+#define MCR_EN_IRQ	0x08
+#define MCR_TX_DFR	0x08
+
+#define LSR             0x05 /* Link status register */
+#define LSR_RXDA        0x01 /* Receiver data available */
+#define LSR_TXRDY       0x20 /* Transmitter ready */
+#define LSR_TXEMP       0x40 /* Transmitter empty */
+
+#define ASCR            0x07 /* Auxillary Status and Control Register */
+#define ASCR_RXF_TOUT   0x01 /* Rx FIFO timeout */
+#define ASCR_FEND_INF   0x02 /* Frame end bytes in rx FIFO */
+#define ASCR_S_EOT      0x04 /* Set end of transmission */
+#define ASCT_RXBSY      0x20 /* Rx busy */
+#define ASCR_TXUR       0x40 /* Transeiver underrun */
+#define ASCR_CTE        0x80 /* Clear timer event */
+
+/* Bank 2 */
+#define BGDL            0x00 /* Baud Generator Divisor Port (Low Byte) */
+#define BGDH            0x01 /* Baud Generator Divisor Port (High Byte) */
+
+#define ECR1		0x02 /* Extended Control Register 1 */
+#define ECR1_EXT_SL	0x01 /* Extended Mode Select */
+#define ECR1_DMANF	0x02 /* DMA Fairness */
+#define ECR1_DMATH      0x04 /* DMA Threshold */
+#define ECR1_DMASWP	0x08 /* DMA Swap */
+
+#define EXCR2		0x04
+#define EXCR2_TFSIZ	0x01 /* Rx FIFO size = 32 */
+#define EXCR2_RFSIZ	0x04 /* Tx FIFO size = 32 */
+
+#define TXFLV           0x06 /* Tx FIFO level */
+#define RXFLV           0x07 /* Rx FIFO level */
+
+/* Bank 3 */
+#define MID		0x00
+
+/* Bank 4 */
+#define TMRL            0x00 /* Timer low byte */
+#define TMRH            0x01 /* Timer high byte */
+#define IRCR1           0x02 /* Infrared control register 1 */
+#define IRCR1_TMR_EN    0x01 /* Timer enable */
+
+#define TFRLL		0x04
+#define TFRLH		0x05
+#define RFRLL		0x06
+#define RFRLH		0x07
+
+/* Bank 5 */
+#define IRCR2           0x04 /* Infrared control register 2 */
+#define IRCR2_MDRS      0x04 /* MIR data rate select */
+#define IRCR2_FEND_MD   0x20 /* */
+
+#define FRM_ST          0x05 /* Frame status FIFO */
+#define FRM_ST_VLD      0x80 /* Frame status FIFO data valid */
+#define FRM_ST_ERR_MSK  0x5f
+#define FRM_ST_LOST_FR  0x40 /* Frame lost */
+#define FRM_ST_MAX_LEN  0x10 /* Max frame len exceeded */
+#define FRM_ST_PHY_ERR  0x08 /* Physical layer error */
+#define FRM_ST_BAD_CRC  0x04 
+#define FRM_ST_OVR1     0x02 /* Rx FIFO overrun */
+#define FRM_ST_OVR2     0x01 /* Frame status FIFO overrun */
+
+#define RFLFL           0x06
+#define RFLFH           0x07
+
+/* Bank 6 */
+#define IR_CFG2		0x00
+#define IR_CFG2_DIS_CRC	0x02
+
+/* Bank 7 */
+#define IRM_CR		0x07 /* Infrared module control register */
+#define IRM_CR_IRX_MSL	0x40
+#define IRM_CR_AF_MNT   0x80 /* Automatic format */
+
+/* NSC chip information */
+struct nsc_chip {
+	char *name;          /* Name of chipset */
+	int cfg[3];          /* Config registers */
+	u_int8_t cid_index;  /* Chip identification index reg */
+	u_int8_t cid_value;  /* Chip identification expected value */
+	u_int8_t cid_mask;   /* Chip identification revision mask */
+
+	/* Functions for probing and initializing the specific chip */
+	int (*probe)(struct nsc_chip *chip, chipio_t *info);
+	int (*init)(struct nsc_chip *chip, chipio_t *info);
+};
+typedef struct nsc_chip nsc_chip_t;
+
+/* For storing entries in the status FIFO */
+struct st_fifo_entry {
+	int status;
+	int len;
+};
+
+#define MAX_TX_WINDOW 7
+#define MAX_RX_WINDOW 7
+
+struct st_fifo {
+	struct st_fifo_entry entries[MAX_RX_WINDOW];
+	int pending_bytes;
+	int head;
+	int tail;
+	int len;
+};
+
+struct frame_cb {
+	void *start; /* Start of frame in DMA mem */
+	int len;     /* Lenght of frame in DMA mem */
+};
+
+struct tx_fifo {
+	struct frame_cb queue[MAX_TX_WINDOW]; /* Info about frames in queue */
+	int             ptr;                  /* Currently being sent */
+	int             len;                  /* Lenght of queue */
+	int             free;                 /* Next free slot */
+	void           *tail;                 /* Next free start in DMA mem */
+};
+
+/* Private data for each instance */
+struct nsc_ircc_cb {
+	struct st_fifo st_fifo;    /* Info about received frames */
+	struct tx_fifo tx_fifo;    /* Info about frames to be transmitted */
+
+	struct net_device *netdev;     /* Yes! we are some kind of netdevice */
+	struct net_device_stats stats;
+	
+	struct irlap_cb *irlap;    /* The link layer we are binded to */
+	struct qos_info qos;       /* QoS capabilities for this device */
+	
+	chipio_t io;               /* IrDA controller information */
+	iobuff_t tx_buff;          /* Transmit buffer */
+	iobuff_t rx_buff;          /* Receive buffer */
+
+	__u8 ier;                  /* Interrupt enable register */
+
+	struct timeval stamp;
+	struct timeval now;
+
+	spinlock_t lock;           /* For serializing operations */
+	
+	__u32 new_speed;
+	int index;                 /* Instance index */
+
+        struct pm_dev *dev;
+};
+
+static inline void switch_bank(int iobase, int bank)
+{
+		outb(bank, iobase+BSR);
+}
+
+#endif /* NSC_IRCC_H */
--- diff/drivers/net/irda/vlsi_ir.h	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/net/irda/vlsi_ir.h	2004-04-21 10:45:34.423470336 +0100
@@ -0,0 +1,799 @@
+
+/*********************************************************************
+ *
+ *	vlsi_ir.h:	VLSI82C147 PCI IrDA controller driver for Linux
+ *
+ *	Version:	0.5
+ *
+ *	Copyright (c) 2001-2003 Martin Diehl
+ *
+ *	This program is free software; you can redistribute it and/or 
+ *	modify it under the terms of the GNU General Public License as 
+ *	published by the Free Software Foundation; either version 2 of 
+ *	the License, or (at your option) any later version.
+ *
+ *	This program is distributed in the hope that it will be useful,
+ *	but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ *	GNU General Public License for more details.
+ *
+ *	You should have received a copy of the GNU General Public License 
+ *	along with this program; if not, write to the Free Software 
+ *	Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
+ *	MA 02111-1307 USA
+ *
+ ********************************************************************/
+
+#ifndef IRDA_VLSI_FIR_H
+#define IRDA_VLSI_FIR_H
+
+/* ================================================================
+ * compatibility stuff
+ */
+
+/* definitions not present in pci_ids.h */
+
+#ifndef PCI_CLASS_WIRELESS_IRDA
+#define PCI_CLASS_WIRELESS_IRDA		0x0d00
+#endif
+
+#ifndef PCI_CLASS_SUBCLASS_MASK
+#define PCI_CLASS_SUBCLASS_MASK		0xffff
+#endif
+
+/* in recent 2.5 interrupt handlers have non-void return value */
+#ifndef IRQ_RETVAL
+typedef void irqreturn_t;
+#define IRQ_NONE
+#define IRQ_HANDLED
+#define IRQ_RETVAL(x)
+#endif
+
+/* some stuff need to check kernelversion. Not all 2.5 stuff was present
+ * in early 2.5.x - the test is merely to separate 2.4 from 2.5
+ */
+#include <linux/version.h>
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+
+/* PDE() introduced in 2.5.4 */
+#ifdef CONFIG_PROC_FS
+#define PDE(inode) ((inode)->u.generic_ip)
+#endif
+
+/* irda crc16 calculation exported in 2.5.42 */
+#define irda_calc_crc16(fcs,buf,len)	(GOOD_FCS)
+
+/* we use this for unified pci device name access */
+#define PCIDEV_NAME(pdev)	((pdev)->name)
+
+#else /* 2.5 or later */
+
+/* recent 2.5/2.6 stores pci device names at varying places ;-) */
+#ifdef CONFIG_PCI_NAMES
+/* human readable name */
+#define PCIDEV_NAME(pdev)	((pdev)->pretty_name)
+#else
+/* whatever we get from the associated struct device - bus:slot:dev.fn id */
+#define PCIDEV_NAME(pdev)	(pci_name(pdev))
+#endif
+
+#endif
+
+/* ================================================================ */
+
+/* non-standard PCI registers */
+
+enum vlsi_pci_regs {
+	VLSI_PCI_CLKCTL		= 0x40,		/* chip clock input control */
+	VLSI_PCI_MSTRPAGE	= 0x41,		/* addr [31:24] for all busmaster cycles */
+	VLSI_PCI_IRMISC		= 0x42		/* mainly legacy UART related */
+};
+
+/* ------------------------------------------ */
+
+/* VLSI_PCI_CLKCTL: Clock Control Register (u8, rw) */
+
+/* Three possible clock sources: either on-chip 48MHz PLL or
+ * external clock applied to EXTCLK pin. External clock may
+ * be either 48MHz or 40MHz, which is indicated by XCKSEL.
+ * CLKSTP controls whether the selected clock source gets
+ * connected to the IrDA block.
+ *
+ * On my HP OB-800 the BIOS sets external 40MHz clock as source
+ * when IrDA enabled and I've never detected any PLL lock success.
+ * Apparently the 14.3...MHz OSC input required for the PLL to work
+ * is not connected and the 40MHz EXTCLK is provided externally.
+ * At least this is what makes the driver working for me.
+ */
+
+enum vlsi_pci_clkctl {
+
+	/* PLL control */
+
+	CLKCTL_PD_INV		= 0x04,		/* PD#: inverted power down signal,
+						 * i.e. PLL is powered, if PD_INV set */
+	CLKCTL_LOCK		= 0x40,		/* (ro) set, if PLL is locked */
+
+	/* clock source selection */
+
+	CLKCTL_EXTCLK		= 0x20,		/* set to select external clock input, not PLL */
+	CLKCTL_XCKSEL		= 0x10,		/* set to indicate EXTCLK is 40MHz, not 48MHz */
+
+	/* IrDA block control */
+
+	CLKCTL_CLKSTP		= 0x80,		/* set to disconnect from selected clock source */
+	CLKCTL_WAKE		= 0x08		/* set to enable wakeup feature: whenever IR activity
+						 * is detected, PD_INV gets set(?) and CLKSTP cleared */
+};
+
+/* ------------------------------------------ */
+
+/* VLSI_PCI_MSTRPAGE: Master Page Register (u8, rw) and busmastering stuff */
+
+#define DMA_MASK_USED_BY_HW	0xffffffff
+#define DMA_MASK_MSTRPAGE	0x00ffffff
+#define MSTRPAGE_VALUE		(DMA_MASK_MSTRPAGE >> 24)
+
+	/* PCI busmastering is somewhat special for this guy - in short:
+	 *
+	 * We select to operate using fixed MSTRPAGE=0, use ISA DMA
+	 * address restrictions to make the PCI BM api aware of this,
+	 * but ensure the hardware is dealing with real 32bit access.
+	 *
+	 * In detail:
+	 * The chip executes normal 32bit busmaster cycles, i.e.
+	 * drives all 32 address lines. These addresses however are
+	 * composed of [0:23] taken from various busaddr-pointers
+	 * and [24:31] taken from the MSTRPAGE register in the VLSI82C147
+	 * config space. Therefore _all_ busmastering must be
+	 * targeted to/from one single 16MB (busaddr-) superpage!
+	 * The point is to make sure all the allocations for memory
+	 * locations with busmaster access (ring descriptors, buffers)
+	 * are indeed bus-mappable to the same 16MB range (for x86 this
+	 * means they must reside in the same 16MB physical memory address
+	 * range). The only constraint we have which supports "several objects
+	 * mappable to common 16MB range" paradigma, is the old ISA DMA
+	 * restriction to the first 16MB of physical address range.
+	 * Hence the approach here is to enable PCI busmaster support using
+	 * the correct 32bit dma-mask used by the chip. Afterwards the device's
+	 * dma-mask gets restricted to 24bit, which must be honoured somehow by
+	 * all allocations for memory areas to be exposed to the chip ...
+	 *
+	 * Note:
+	 * Don't be surprised to get "Setting latency timer..." messages every
+	 * time when PCI busmastering is enabled for the chip.
+	 * The chip has its PCI latency timer RO fixed at 0 - which is not a
+	 * problem here, because it is never requesting _burst_ transactions.
+	 */
+
+/* ------------------------------------------ */
+
+/* VLSI_PCIIRMISC: IR Miscellaneous Register (u8, rw) */
+
+/* legacy UART emulation - not used by this driver - would require:
+ * (see below for some register-value definitions)
+ *
+ *	- IRMISC_UARTEN must be set to enable UART address decoding
+ *	- IRMISC_UARTSEL configured
+ *	- IRCFG_MASTER must be cleared
+ *	- IRCFG_SIR must be set
+ *	- IRENABLE_PHYANDCLOCK must be asserted 0->1 (and hence IRENABLE_SIR_ON)
+ */
+
+enum vlsi_pci_irmisc {
+
+	/* IR transceiver control */
+
+	IRMISC_IRRAIL		= 0x40,		/* (ro?) IR rail power indication (and control?)
+						 * 0=3.3V / 1=5V. Probably set during power-on?
+						 * unclear - not touched by driver */
+	IRMISC_IRPD		= 0x08,		/* transceiver power down, if set */
+
+	/* legacy UART control */
+
+	IRMISC_UARTTST		= 0x80,		/* UART test mode - "always write 0" */
+	IRMISC_UARTEN		= 0x04,		/* enable UART address decoding */
+
+	/* bits [1:0] IRMISC_UARTSEL to select legacy UART address */
+
+	IRMISC_UARTSEL_3f8	= 0x00,
+	IRMISC_UARTSEL_2f8	= 0x01,
+	IRMISC_UARTSEL_3e8	= 0x02,
+	IRMISC_UARTSEL_2e8	= 0x03
+};
+
+/* ================================================================ */
+
+/* registers mapped to 32 byte PCI IO space */
+
+/* note: better access all registers at the indicated u8/u16 size
+ *	 although some of them contain only 1 byte of information.
+ *	 some of them (particaluarly PROMPT and IRCFG) ignore
+ *	 access when using the wrong addressing mode!
+ */
+
+enum vlsi_pio_regs {
+	VLSI_PIO_IRINTR		= 0x00,		/* interrupt enable/request (u8, rw) */
+	VLSI_PIO_RINGPTR	= 0x02,		/* rx/tx ring pointer (u16, ro) */
+	VLSI_PIO_RINGBASE	= 0x04,		/* [23:10] of ring address (u16, rw) */
+	VLSI_PIO_RINGSIZE	= 0x06,		/* rx/tx ring size (u16, rw) */
+	VLSI_PIO_PROMPT		= 0x08, 	/* triggers ring processing (u16, wo) */
+	/* 0x0a-0x0f: reserved / duplicated UART regs */
+	VLSI_PIO_IRCFG		= 0x10,		/* configuration select (u16, rw) */
+	VLSI_PIO_SIRFLAG	= 0x12,		/* BOF/EOF for filtered SIR (u16, ro) */
+	VLSI_PIO_IRENABLE	= 0x14,		/* enable and status register (u16, rw/ro) */
+	VLSI_PIO_PHYCTL		= 0x16,		/* physical layer current status (u16, ro) */
+	VLSI_PIO_NPHYCTL	= 0x18,		/* next physical layer select (u16, rw) */
+	VLSI_PIO_MAXPKT		= 0x1a,		/* [11:0] max len for packet receive (u16, rw) */
+	VLSI_PIO_RCVBCNT	= 0x1c		/* current receive-FIFO byte count (u16, ro) */
+	/* 0x1e-0x1f: reserved / duplicated UART regs */
+};
+
+/* ------------------------------------------ */
+
+/* VLSI_PIO_IRINTR: Interrupt Register (u8, rw) */
+
+/* enable-bits:
+ *		1 = enable / 0 = disable
+ * interrupt condition bits:
+ * 		set according to corresponding interrupt source
+ *		(regardless of the state of the enable bits)
+ *		enable bit status indicates whether interrupt gets raised
+ *		write-to-clear
+ * note: RPKTINT and TPKTINT behave different in legacy UART mode (which we don't use :-)
+ */
+
+enum vlsi_pio_irintr {
+	IRINTR_ACTEN	= 0x80,	/* activity interrupt enable */
+	IRINTR_ACTIVITY	= 0x40,	/* activity monitor (traffic detected) */
+	IRINTR_RPKTEN	= 0x20,	/* receive packet interrupt enable*/
+	IRINTR_RPKTINT	= 0x10,	/* rx-packet transfered from fifo to memory finished */
+	IRINTR_TPKTEN	= 0x08,	/* transmit packet interrupt enable */
+	IRINTR_TPKTINT	= 0x04,	/* last bit of tx-packet+crc shifted to ir-pulser */
+	IRINTR_OE_EN	= 0x02,	/* UART rx fifo overrun error interrupt enable */
+	IRINTR_OE_INT	= 0x01	/* UART rx fifo overrun error (read LSR to clear) */
+};
+
+/* we use this mask to check whether the (shared PCI) interrupt is ours */
+
+#define IRINTR_INT_MASK		(IRINTR_ACTIVITY|IRINTR_RPKTINT|IRINTR_TPKTINT)
+
+/* ------------------------------------------ */
+
+/* VLSI_PIO_RINGPTR: Ring Pointer Read-Back Register (u16, ro) */
+
+/* _both_ ring pointers are indices relative to the _entire_ rx,tx-ring!
+ * i.e. the referenced descriptor is located
+ * at RINGBASE + PTR * sizeof(descr) for rx and tx
+ * therefore, the tx-pointer has offset MAX_RING_DESCR
+ */
+
+#define MAX_RING_DESCR		64	/* tx, rx rings may contain up to 64 descr each */
+
+#define RINGPTR_RX_MASK		(MAX_RING_DESCR-1)
+#define RINGPTR_TX_MASK		((MAX_RING_DESCR-1)<<8)
+
+#define RINGPTR_GET_RX(p)	((p)&RINGPTR_RX_MASK)
+#define RINGPTR_GET_TX(p)	(((p)&RINGPTR_TX_MASK)>>8)
+
+/* ------------------------------------------ */
+
+/* VLSI_PIO_RINGBASE: Ring Pointer Base Address Register (u16, ro) */
+
+/* Contains [23:10] part of the ring base (bus-) address
+ * which must be 1k-alinged. [31:24] is taken from
+ * VLSI_PCI_MSTRPAGE above.
+ * The controller initiates non-burst PCI BM cycles to
+ * fetch and update the descriptors in the ring.
+ * Once fetched, the descriptor remains cached onchip
+ * until it gets closed and updated due to the ring
+ * processing state machine.
+ * The entire ring area is split in rx and tx areas with each
+ * area consisting of 64 descriptors of 8 bytes each.
+ * The rx(tx) ring is located at ringbase+0 (ringbase+64*8).
+ */
+
+#define BUS_TO_RINGBASE(p)	(((p)>>10)&0x3fff)
+
+/* ------------------------------------------ */
+
+/* VLSI_PIO_RINGSIZE: Ring Size Register (u16, rw) */
+
+/* bit mask to indicate the ring size to be used for rx and tx.
+ * 	possible values		encoded bits
+ *		 4		   0000
+ *		 8		   0001
+ *		16		   0011
+ *		32		   0111
+ *		64		   1111
+ * located at [15:12] for tx and [11:8] for rx ([7:0] unused)
+ *
+ * note: probably a good idea to have IRCFG_MSTR cleared when writing
+ *	 this so the state machines are stopped and the RINGPTR is reset!
+ */
+
+#define SIZE_TO_BITS(num)		((((num)-1)>>2)&0x0f)
+#define TX_RX_TO_RINGSIZE(tx,rx)	((SIZE_TO_BITS(tx)<<12)|(SIZE_TO_BITS(rx)<<8))
+#define RINGSIZE_TO_RXSIZE(rs)		((((rs)&0x0f00)>>6)+4)
+#define RINGSIZE_TO_TXSIZE(rs)		((((rs)&0xf000)>>10)+4)
+
+
+/* ------------------------------------------ */
+
+/* VLSI_PIO_PROMPT: Ring Prompting Register (u16, write-to-start) */
+
+/* writing any value kicks the ring processing state machines
+ * for both tx, rx rings as follows:
+ * 	- active rings (currently owning an active descriptor)
+ *	  ignore the prompt and continue
+ *	- idle rings fetch the next descr from the ring and start
+ *	  their processing
+ */
+
+/* ------------------------------------------ */
+
+/* VLSI_PIO_IRCFG: IR Config Register (u16, rw) */
+
+/* notes:
+ *	- not more than one SIR/MIR/FIR bit must be set at any time
+ *	- SIR, MIR, FIR and CRC16 select the configuration which will
+ *	  be applied on next 0->1 transition of IRENABLE_PHYANDCLOCK (see below).
+ *	- besides allowing the PCI interface to execute busmaster cycles
+ *	  and therefore the ring SM to operate, the MSTR bit has side-effects:
+ *	  when MSTR is cleared, the RINGPTR's get reset and the legacy UART mode
+ *	  (in contrast to busmaster access mode) gets enabled.
+ *	- clearing ENRX or setting ENTX while data is received may stall the
+ *	  receive fifo until ENRX reenabled _and_ another packet arrives
+ *	- SIRFILT means the chip performs the required unwrapping of hardware
+ *	  headers (XBOF's, BOF/EOF) and un-escaping in the _receive_ direction.
+ *	  Only the resulting IrLAP payload is copied to the receive buffers -
+ *	  but with the 16bit FCS still encluded. Question remains, whether it
+ *	  was already checked or we should do it before passing the packet to IrLAP?
+ */
+
+enum vlsi_pio_ircfg {
+	IRCFG_LOOP	= 0x4000,	/* enable loopback test mode */
+	IRCFG_ENTX	= 0x1000,	/* transmit enable */
+	IRCFG_ENRX	= 0x0800,	/* receive enable */
+	IRCFG_MSTR	= 0x0400,	/* master enable */
+	IRCFG_RXANY	= 0x0200,	/* receive any packet */
+	IRCFG_CRC16	= 0x0080,	/* 16bit (not 32bit) CRC select for MIR/FIR */
+	IRCFG_FIR	= 0x0040,	/* FIR 4PPM encoding mode enable */
+	IRCFG_MIR	= 0x0020,	/* MIR HDLC encoding mode enable */
+	IRCFG_SIR	= 0x0010,	/* SIR encoding mode enable */
+	IRCFG_SIRFILT	= 0x0008,	/* enable SIR decode filter (receiver unwrapping) */
+	IRCFG_SIRTEST	= 0x0004,	/* allow SIR decode filter when not in SIR mode */
+	IRCFG_TXPOL	= 0x0002,	/* invert tx polarity when set */
+	IRCFG_RXPOL	= 0x0001	/* invert rx polarity when set */
+};
+
+/* ------------------------------------------ */
+
+/* VLSI_PIO_SIRFLAG: SIR Flag Register (u16, ro) */
+
+/* register contains hardcoded BOF=0xc0 at [7:0] and EOF=0xc1 at [15:8]
+ * which is used for unwrapping received frames in SIR decode-filter mode
+ */
+
+/* ------------------------------------------ */
+
+/* VLSI_PIO_IRENABLE: IR Enable Register (u16, rw/ro) */
+
+/* notes:
+ *	- IREN acts as gate for latching the configured IR mode information
+ *	  from IRCFG and IRPHYCTL when IREN=reset and applying them when
+ *	  IREN gets set afterwards.
+ *	- ENTXST reflects IRCFG_ENTX
+ *	- ENRXST = IRCFG_ENRX && (!IRCFG_ENTX || IRCFG_LOOP)
+ */
+
+enum vlsi_pio_irenable {
+	IRENABLE_PHYANDCLOCK	= 0x8000,  /* enable IR phy and gate the mode config (rw) */
+	IRENABLE_CFGER		= 0x4000,  /* mode configuration error (ro) */
+	IRENABLE_FIR_ON		= 0x2000,  /* FIR on status (ro) */
+	IRENABLE_MIR_ON		= 0x1000,  /* MIR on status (ro) */
+	IRENABLE_SIR_ON		= 0x0800,  /* SIR on status (ro) */
+	IRENABLE_ENTXST		= 0x0400,  /* transmit enable status (ro) */
+	IRENABLE_ENRXST		= 0x0200,  /* Receive enable status (ro) */
+	IRENABLE_CRC16_ON	= 0x0100   /* 16bit (not 32bit) CRC enabled status (ro) */
+};
+
+#define	  IRENABLE_MASK	    0xff00  /* Read mask */
+
+/* ------------------------------------------ */
+
+/* VLSI_PIO_PHYCTL: IR Physical Layer Current Control Register (u16, ro) */
+
+/* read-back of the currently applied physical layer status.
+ * applied from VLSI_PIO_NPHYCTL at rising edge of IRENABLE_PHYANDCLOCK
+ * contents identical to VLSI_PIO_NPHYCTL (see below)
+ */
+
+/* ------------------------------------------ */
+
+/* VLSI_PIO_NPHYCTL: IR Physical Layer Next Control Register (u16, rw) */
+
+/* latched during IRENABLE_PHYANDCLOCK=0 and applied at 0-1 transition
+ *
+ * consists of BAUD[15:10], PLSWID[9:5] and PREAMB[4:0] bits defined as follows:
+ *
+ * SIR-mode:	BAUD = (115.2kHz / baudrate) - 1
+ *		PLSWID = (pulsetime * freq / (BAUD+1)) - 1
+ *			where pulsetime is the requested IrPHY pulse width
+ *			and freq is 8(16)MHz for 40(48)MHz primary input clock
+ *		PREAMB: don't care for SIR
+ *
+ *		The nominal SIR pulse width is 3/16 bit time so we have PLSWID=12
+ *		fixed for all SIR speeds at 40MHz input clock (PLSWID=24 at 48MHz).
+ *		IrPHY also allows shorter pulses down to the nominal pulse duration
+ *		at 115.2kbaud (minus some tolerance) which is 1.41 usec.
+ *		Using the expression PLSWID = 12/(BAUD+1)-1 (multiplied by two for 48MHz)
+ *		we get the minimum acceptable PLSWID values according to the VLSI
+ *		specification, which provides 1.5 usec pulse width for all speeds (except
+ *		for 2.4kbaud getting 6usec). This is fine with IrPHY v1.3 specs and
+ *		reduces the transceiver power which drains the battery. At 9.6kbaud for
+ *		example this amounts to more than 90% battery power saving!
+ *
+ * MIR-mode:	BAUD = 0
+ *		PLSWID = 9(10) for 40(48) MHz input clock
+ *			to get nominal MIR pulse width
+ *		PREAMB = 1
+ *
+ * FIR-mode:	BAUD = 0
+ *		PLSWID: don't care
+ *		PREAMB = 15
+ */
+
+#define PHYCTL_BAUD_SHIFT	10
+#define PHYCTL_BAUD_MASK	0xfc00
+#define PHYCTL_PLSWID_SHIFT	5
+#define PHYCTL_PLSWID_MASK	0x03e0
+#define PHYCTL_PREAMB_SHIFT	0
+#define PHYCTL_PREAMB_MASK	0x001f
+
+#define PHYCTL_TO_BAUD(bwp)	(((bwp)&PHYCTL_BAUD_MASK)>>PHYCTL_BAUD_SHIFT)
+#define PHYCTL_TO_PLSWID(bwp)	(((bwp)&PHYCTL_PLSWID_MASK)>>PHYCTL_PLSWID_SHIFT)
+#define PHYCTL_TO_PREAMB(bwp)	(((bwp)&PHYCTL_PREAMB_MASK)>>PHYCTL_PREAMB_SHIFT)
+
+#define BWP_TO_PHYCTL(b,w,p)	((((b)<<PHYCTL_BAUD_SHIFT)&PHYCTL_BAUD_MASK) \
+				 | (((w)<<PHYCTL_PLSWID_SHIFT)&PHYCTL_PLSWID_MASK) \
+				 | (((p)<<PHYCTL_PREAMB_SHIFT)&PHYCTL_PREAMB_MASK))
+
+#define BAUD_BITS(br)		((115200/(br))-1)
+
+static inline unsigned
+calc_width_bits(unsigned baudrate, unsigned widthselect, unsigned clockselect)
+{
+	unsigned	tmp;
+
+	if (widthselect)	/* nominal 3/16 puls width */
+		return (clockselect) ? 12 : 24;
+
+	tmp = ((clockselect) ? 12 : 24) / (BAUD_BITS(baudrate)+1);
+
+	/* intermediate result of integer division needed here */
+
+	return (tmp>0) ? (tmp-1) : 0;
+}
+
+#define PHYCTL_SIR(br,ws,cs)	BWP_TO_PHYCTL(BAUD_BITS(br),calc_width_bits((br),(ws),(cs)),0)
+#define PHYCTL_MIR(cs)		BWP_TO_PHYCTL(0,((cs)?9:10),1)
+#define PHYCTL_FIR		BWP_TO_PHYCTL(0,0,15)
+
+/* quite ugly, I know. But implementing these calculations here avoids
+ * having magic numbers in the code and allows some playing with pulsewidths
+ * without risk to violate the standards.
+ * FWIW, here is the table for reference:
+ *
+ * baudrate	BAUD	min-PLSWID	nom-PLSWID	PREAMB
+ *     2400	  47	   0(0)		   12(24)	   0
+ *     9600	  11	   0(0)		   12(24)	   0
+ *    19200	   5	   1(2)		   12(24)	   0
+ *    38400	   2	   3(6)	           12(24)	   0
+ *    57600	   1	   5(10)	   12(24)	   0
+ *   115200	   0	  11(22)	   12(24)	   0
+ *	MIR	   0	    -		    9(10)	   1
+ *	FIR	   0        -               0		  15
+ *
+ * note: x(y) means x-value for 40MHz / y-value for 48MHz primary input clock
+ */
+
+/* ------------------------------------------ */
+
+
+/* VLSI_PIO_MAXPKT: Maximum Packet Length register (u16, rw) */
+
+/* maximum acceptable length for received packets */
+
+/* hw imposed limitation - register uses only [11:0] */
+#define MAX_PACKET_LENGTH	0x0fff
+
+/* IrLAP I-field (apparently not defined elsewhere) */
+#define IRDA_MTU		2048
+
+/* complete packet consists of A(1)+C(1)+I(<=IRDA_MTU) */
+#define IRLAP_SKB_ALLOCSIZE	(1+1+IRDA_MTU)
+
+/* the buffers we use to exchange frames with the hardware need to be
+ * larger than IRLAP_SKB_ALLOCSIZE because we may have up to 4 bytes FCS
+ * appended and, in SIR mode, a lot of frame wrapping bytes. The worst
+ * case appears to be a SIR packet with I-size==IRDA_MTU and all bytes
+ * requiring to be escaped to provide transparency. Furthermore, the peer
+ * might ask for quite a number of additional XBOFs:
+ *	up to 115+48 XBOFS		 163
+ *	regular BOF			   1
+ *	A-field				   1
+ *	C-field				   1
+ *	I-field, IRDA_MTU, all escaped	4096
+ *	FCS (16 bit at SIR, escaped)	   4
+ *	EOF				   1
+ * AFAICS nothing in IrLAP guarantees A/C field not to need escaping
+ * (f.e. 0xc0/0xc1 - i.e. BOF/EOF - are legal values there) so in the
+ * worst case we have 4269 bytes total frame size.
+ * However, the VLSI uses 12 bits only for all buffer length values,
+ * which limits the maximum useable buffer size <= 4095.
+ * Note this is not a limitation in the receive case because we use
+ * the SIR filtering mode where the hw unwraps the frame and only the
+ * bare packet+fcs is stored into the buffer - in contrast to the SIR
+ * tx case where we have to pass frame-wrapped packets to the hw.
+ * If this would ever become an issue in real life, the only workaround
+ * I see would be using the legacy UART emulation in SIR mode.
+ */
+
+#define XFER_BUF_SIZE		MAX_PACKET_LENGTH
+
+/* ------------------------------------------ */
+
+/* VLSI_PIO_RCVBCNT: Receive Byte Count Register (u16, ro) */
+
+/* receive packet counter gets incremented on every non-filtered
+ * byte which was put in the receive fifo and reset for each
+ * new packet. Used to decide whether we are just in the middle
+ * of receiving
+ */
+
+/* better apply the [11:0] mask when reading, as some docs say the
+ * reserved [15:12] would return 1 when reading - which is wrong AFAICS
+ */
+#define RCVBCNT_MASK	0x0fff
+
+/******************************************************************/
+
+/* descriptors for rx/tx ring
+ *
+ * accessed by hardware - don't change!
+ *
+ * the descriptor is owned by hardware, when the ACTIVE status bit
+ * is set and nothing (besides reading status to test the bit)
+ * shall be done. The bit gets cleared by hw, when the descriptor
+ * gets closed. Premature reaping of descriptors owned be the chip
+ * can be achieved by disabling IRCFG_MSTR
+ *
+ * Attention: Writing addr overwrites status!
+ *
+ * ### FIXME: depends on endianess (but there ain't no non-i586 ob800 ;-)
+ */
+
+struct ring_descr_hw {
+	volatile u16	rd_count;	/* tx/rx count [11:0] */
+	u16		reserved;
+	union {
+		u32	addr;		/* [23:0] of the buffer's busaddress */
+		struct {
+			u8		addr_res[3];
+			volatile u8	status;		/* descriptor status */
+		} rd_s __attribute__((packed));
+	} rd_u __attribute((packed));
+} __attribute__ ((packed));
+
+#define rd_addr		rd_u.addr
+#define rd_status	rd_u.rd_s.status
+
+/* ring descriptor status bits */
+
+#define RD_ACTIVE		0x80	/* descriptor owned by hw (both TX,RX) */
+
+/* TX ring descriptor status */
+
+#define	RD_TX_DISCRC		0x40	/* do not send CRC (for SIR) */
+#define	RD_TX_BADCRC		0x20	/* force a bad CRC */
+#define	RD_TX_PULSE		0x10	/* send indication pulse after this frame (MIR/FIR) */
+#define	RD_TX_FRCEUND		0x08	/* force underrun */
+#define	RD_TX_CLRENTX		0x04	/* clear ENTX after this frame */
+#define	RD_TX_UNDRN		0x01	/* TX fifo underrun (probably PCI problem) */
+
+/* RX ring descriptor status */
+
+#define RD_RX_PHYERR		0x40	/* physical encoding error */
+#define RD_RX_CRCERR		0x20	/* CRC error (MIR/FIR) */
+#define RD_RX_LENGTH		0x10	/* frame exceeds buffer length */
+#define RD_RX_OVER		0x08	/* RX fifo overrun (probably PCI problem) */
+#define RD_RX_SIRBAD		0x04	/* EOF missing: BOF follows BOF (SIR, filtered) */
+
+#define RD_RX_ERROR		0x7c	/* any error in received frame */
+
+/* the memory required to hold the 2 descriptor rings */
+#define HW_RING_AREA_SIZE	(2 * MAX_RING_DESCR * sizeof(struct ring_descr_hw))
+
+/******************************************************************/
+
+/* sw-ring descriptors consists of a bus-mapped transfer buffer with
+ * associated skb and a pointer to the hw entry descriptor
+ */
+
+struct ring_descr {
+	struct ring_descr_hw	*hw;
+	struct sk_buff		*skb;
+	void			*buf;
+};
+
+/* wrappers for operations on hw-exposed ring descriptors
+ * access to the hw-part of the descriptors must use these.
+ */
+
+static inline int rd_is_active(struct ring_descr *rd)
+{
+	return ((rd->hw->rd_status & RD_ACTIVE) != 0);
+}
+
+static inline void rd_activate(struct ring_descr *rd)
+{
+	rd->hw->rd_status |= RD_ACTIVE;
+}
+
+static inline void rd_set_status(struct ring_descr *rd, u8 s)
+{
+	rd->hw->rd_status = s;	 /* may pass ownership to the hardware */
+}
+
+static inline void rd_set_addr_status(struct ring_descr *rd, dma_addr_t a, u8 s)
+{
+	/* order is important for two reasons:
+	 *  - overlayed: writing addr overwrites status
+	 *  - we want to write status last so we have valid address in
+	 *    case status has RD_ACTIVE set
+	 */
+
+	if ((a & ~DMA_MASK_MSTRPAGE)>>24 != MSTRPAGE_VALUE) {
+		ERROR("%s: pci busaddr inconsistency!\n", __FUNCTION__);
+		dump_stack();
+		return;
+	}
+
+	a &= DMA_MASK_MSTRPAGE;  /* clear highbyte to make sure we won't write
+				  * to status - just in case MSTRPAGE_VALUE!=0
+				  */
+	rd->hw->rd_addr = cpu_to_le32(a);
+	wmb();
+	rd_set_status(rd, s);	 /* may pass ownership to the hardware */
+}
+
+static inline void rd_set_count(struct ring_descr *rd, u16 c)
+{
+	rd->hw->rd_count = cpu_to_le16(c);
+}
+
+static inline u8 rd_get_status(struct ring_descr *rd)
+{
+	return rd->hw->rd_status;
+}
+
+static inline dma_addr_t rd_get_addr(struct ring_descr *rd)
+{
+	dma_addr_t	a;
+
+	a = le32_to_cpu(rd->hw->rd_addr);
+	return (a & DMA_MASK_MSTRPAGE) | (MSTRPAGE_VALUE << 24);
+}
+
+static inline u16 rd_get_count(struct ring_descr *rd)
+{
+	return le16_to_cpu(rd->hw->rd_count);
+}
+
+/******************************************************************/
+
+/* sw descriptor rings for rx, tx:
+ *
+ * operations follow producer-consumer paradigm, with the hw
+ * in the middle doing the processing.
+ * ring size must be power of two.
+ *
+ * producer advances r->tail after inserting for processing
+ * consumer advances r->head after removing processed rd
+ * ring is empty if head==tail / full if (tail+1)==head
+ */
+
+struct vlsi_ring {
+	struct pci_dev		*pdev;
+	int			dir;
+	unsigned		len;
+	unsigned		size;
+	unsigned		mask;
+	atomic_t		head, tail;
+	struct ring_descr	*rd;
+};
+
+/* ring processing helpers */
+
+static inline struct ring_descr *ring_last(struct vlsi_ring *r)
+{
+	int t;
+
+	t = atomic_read(&r->tail) & r->mask;
+	return (((t+1) & r->mask) == (atomic_read(&r->head) & r->mask)) ? NULL : &r->rd[t];
+}
+
+static inline struct ring_descr *ring_put(struct vlsi_ring *r)
+{
+	atomic_inc(&r->tail);
+	return ring_last(r);
+}
+
+static inline struct ring_descr *ring_first(struct vlsi_ring *r)
+{
+	int h;
+
+	h = atomic_read(&r->head) & r->mask;
+	return (h == (atomic_read(&r->tail) & r->mask)) ? NULL : &r->rd[h];
+}
+
+static inline struct ring_descr *ring_get(struct vlsi_ring *r)
+{
+	atomic_inc(&r->head);
+	return ring_first(r);
+}
+
+/******************************************************************/
+
+/* our private compound VLSI-PCI-IRDA device information */
+
+typedef struct vlsi_irda_dev {
+	struct pci_dev		*pdev;
+	struct net_device_stats	stats;
+
+	struct irlap_cb		*irlap;
+
+	struct qos_info		qos;
+
+	unsigned		mode;
+	int			baud, new_baud;
+
+	dma_addr_t		busaddr;
+	void			*virtaddr;
+	struct vlsi_ring	*tx_ring, *rx_ring;
+
+	struct timeval		last_rx;
+
+	spinlock_t		lock;
+	struct semaphore	sem;
+
+	u32			cfg_space[64/sizeof(u32)];
+	u8			resume_ok;	
+	struct proc_dir_entry	*proc_entry;
+
+} vlsi_irda_dev_t;
+
+/********************************************************/
+
+/* the remapped error flags we use for returning from frame
+ * post-processing in vlsi_process_tx/rx() after it was completed
+ * by the hardware. These functions either return the >=0 number
+ * of transfered bytes in case of success or the negative (-)
+ * of the or'ed error flags.
+ */
+
+#define VLSI_TX_DROP		0x0001
+#define VLSI_TX_FIFO		0x0002
+
+#define VLSI_RX_DROP		0x0100
+#define VLSI_RX_OVER		0x0200
+#define VLSI_RX_LENGTH  	0x0400
+#define VLSI_RX_FRAME		0x0800
+#define VLSI_RX_CRC		0x1000
+
+/********************************************************/
+
+#endif /* IRDA_VLSI_FIR_H */
+
--- diff/drivers/net/irda/w83977af.h	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/net/irda/w83977af.h	2004-04-21 10:45:34.423470336 +0100
@@ -0,0 +1,53 @@
+#ifndef W83977AF_H
+#define W83977AF_H
+
+#define W977_EFIO_BASE 0x370
+#define W977_EFIO2_BASE 0x3f0
+#define W977_DEVICE_IR 0x06
+
+
+/*
+ * Enter extended function mode
+ */
+static inline void w977_efm_enter(unsigned int efio)
+{
+        outb(0x87, efio);
+        outb(0x87, efio);
+}
+
+/*
+ * Select a device to configure 
+ */
+
+static inline void w977_select_device(__u8 devnum, unsigned int efio)
+{
+	outb(0x07, efio);
+	outb(devnum, efio+1);
+} 
+
+/* 
+ * Write a byte to a register
+ */
+static inline void w977_write_reg(__u8 reg, __u8 value, unsigned int efio)
+{
+	outb(reg, efio);
+	outb(value, efio+1);
+}
+
+/*
+ * read a byte from a register
+ */
+static inline __u8 w977_read_reg(__u8 reg, unsigned int efio)
+{
+	outb(reg, efio);
+	return inb(efio+1);
+}
+
+/*
+ * Exit extended function mode
+ */
+static inline void w977_efm_exit(unsigned int efio)
+{
+	outb(0xAA, efio);
+}
+#endif
--- diff/drivers/net/irda/w83977af_ir.h	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/net/irda/w83977af_ir.h	2004-04-21 10:45:34.425470032 +0100
@@ -0,0 +1,196 @@
+/*********************************************************************
+ *                
+ * Filename:      w83977af_ir.h
+ * Version:       
+ * Description:   
+ * Status:        Experimental.
+ * Author:        Paul VanderSpek
+ * Created at:    Thu Nov 19 13:55:34 1998
+ * Modified at:   Tue Jan 11 13:08:19 2000
+ * Modified by:   Dag Brattli <dagb@cs.uit.no>
+ * 
+ *     Copyright (c) 1998-2000 Dag Brattli, All Rights Reserved.
+ *      
+ *     This program is free software; you can redistribute it and/or 
+ *     modify it under the terms of the GNU General Public License as 
+ *     published by the Free Software Foundation; either version 2 of 
+ *     the License, or (at your option) any later version.
+ *  
+ *     Neither Dag Brattli nor University of Tromsø admit liability nor
+ *     provide warranty for any of this software. This material is 
+ *     provided "AS-IS" and at no charge.
+ *     
+ ********************************************************************/
+
+#ifndef W83977AF_IR_H
+#define W83977AF_IR_H
+
+#include <asm/io.h>
+
+/* Flags for configuration register CRF0 */
+#define ENBNKSEL	0x01
+#define APEDCRC		0x02
+#define TXW4C           0x04
+#define RXW4C           0x08
+
+/* Bank 0 */
+#define RBR             0x00 /* Receiver buffer register */
+#define TBR             0x00 /* Transmitter buffer register */
+
+#define ICR		0x01 /* Interrupt configuration register */
+#define ICR_ERBRI       0x01 /* Receiver buffer register interrupt */
+#define ICR_ETBREI      0x02 /* Transeiver empty interrupt */
+#define ICR_EUSRI	0x04//* IR status interrupt */
+#define ICR_EHSRI       0x04
+#define ICR_ETXURI      0x04 /* Tx underrun */
+#define ICR_EDMAI	0x10 /* DMA interrupt */
+#define ICR_ETXTHI      0x20 /* Transmitter threshold interrupt */
+#define ICR_EFSFI       0x40 /* Frame status FIFO interrupt */
+#define ICR_ETMRI       0x80 /* Timer interrupt */
+
+#define UFR		0x02 /* FIFO control register */
+#define UFR_EN_FIFO     0x01 /* Enable FIFO's */
+#define UFR_RXF_RST     0x02 /* Reset Rx FIFO */
+#define UFR_TXF_RST     0x04 /* Reset Tx FIFO */
+#define UFR_RXTL	0x80 /* Rx FIFO threshold (set to 16) */
+#define UFR_TXTL	0x20 /* Tx FIFO threshold (set to 17) */
+
+#define ISR		0x02 /* Interrupt status register */
+#define ISR_RXTH_I	0x01 /* Receive threshold interrupt */
+#define ISR_TXEMP_I     0x02 /* Transmitter empty interrupt */
+#define ISR_FEND_I	0x04
+#define ISR_DMA_I	0x10
+#define ISR_TXTH_I	0x20 /* Transmitter threshold interrupt */
+#define ISR_FSF_I       0x40
+#define ISR_TMR_I       0x80 /* Timer interrupt */
+
+#define UCR             0x03 /* Uart control register */
+#define UCR_DLS8        0x03 /* 8N1 */
+
+#define SSR 	        0x03 /* Sets select register */
+#define SET0 	        UCR_DLS8        /* Make sure we keep 8N1 */
+#define SET1	        (0x80|UCR_DLS8) /* Make sure we keep 8N1 */
+#define SET2	        0xE0
+#define SET3	        0xE4
+#define SET4	        0xE8
+#define SET5	        0xEC
+#define SET6	        0xF0
+#define SET7	        0xF4
+
+#define HCR		0x04
+#define HCR_MODE_MASK	~(0xD0)
+#define HCR_SIR         0x60
+#define HCR_MIR_576  	0x20	
+#define HCR_MIR_1152	0x80
+#define HCR_FIR		0xA0
+#define HCR_EN_DMA	0x04
+#define HCR_EN_IRQ	0x08
+#define HCR_TX_WT	0x08
+
+#define USR             0x05 /* IR status register */
+#define USR_RDR         0x01 /* Receive data ready */
+#define USR_TSRE        0x40 /* Transmitter empty? */
+
+#define AUDR            0x07
+#define AUDR_SFEND      0x08 /* Set a frame end */
+#define AUDR_RXBSY      0x20 /* Rx busy */
+#define AUDR_UNDR       0x40 /* Transeiver underrun */
+
+/* Set 2 */
+#define ABLL            0x00 /* Advanced baud rate divisor latch (low byte) */
+#define ABHL            0x01 /* Advanced baud rate divisor latch (high byte) */
+
+#define ADCR1		0x02
+#define ADCR1_ADV_SL	0x01	
+#define ADCR1_D_CHSW	0x08	/* the specs are wrong. its bit 3, not 4 */
+#define ADCR1_DMA_F	0x02
+
+#define ADCR2		0x04
+#define ADCR2_TXFS32	0x01
+#define ADCR2_RXFS32	0x04
+
+#define RXFDTH          0x07
+
+/* Set 3 */
+#define AUID		0x00
+
+/* Set 4 */
+#define TMRL            0x00 /* Timer value register (low byte) */
+#define TMRH            0x01 /* Timer value register (high byte) */
+
+#define IR_MSL          0x02 /* Infrared mode select */
+#define IR_MSL_EN_TMR   0x01 /* Enable timer */
+
+#define TFRLL		0x04 /* Transmitter frame length (low byte) */
+#define TFRLH		0x05 /* Transmitter frame length (high byte) */
+#define RFRLL		0x06 /* Receiver frame length (low byte) */
+#define RFRLH		0x07 /* Receiver frame length (high byte) */
+
+/* Set 5 */
+
+#define FS_FO           0x05 /* Frame status FIFO */
+#define FS_FO_FSFDR     0x80 /* Frame status FIFO data ready */
+#define FS_FO_LST_FR    0x40 /* Frame lost */
+#define FS_FO_MX_LEX    0x10 /* Max frame len exceeded */
+#define FS_FO_PHY_ERR   0x08 /* Physical layer error */
+#define FS_FO_CRC_ERR   0x04 
+#define FS_FO_RX_OV     0x02 /* Receive overrun */
+#define FS_FO_FSF_OV    0x01 /* Frame status FIFO overrun */
+#define FS_FO_ERR_MSK   0x5f /* Error mask */
+
+#define RFLFL           0x06
+#define RFLFH           0x07
+
+/* Set 6 */
+#define IR_CFG2		0x00
+#define IR_CFG2_DIS_CRC	0x02
+
+/* Set 7 */
+#define IRM_CR		0x07 /* Infrared module control register */
+#define IRM_CR_IRX_MSL	0x40
+#define IRM_CR_AF_MNT   0x80 /* Automatic format */
+
+/* For storing entries in the status FIFO */
+struct st_fifo_entry {
+	int status;
+	int len;
+};
+
+struct st_fifo {
+	struct st_fifo_entry entries[10];
+	int head;
+	int tail;
+	int len;
+};
+
+/* Private data for each instance */
+struct w83977af_ir {
+	struct st_fifo st_fifo;
+
+	int tx_buff_offsets[10]; /* Offsets between frames in tx_buff */
+	int tx_len;          /* Number of frames in tx_buff */
+
+	struct net_device *netdev; /* Yes! we are some kind of netdevice */
+	struct net_device_stats stats;
+	
+	struct irlap_cb    *irlap; /* The link layer we are binded to */
+	struct qos_info     qos;   /* QoS capabilities for this device */
+	
+	chipio_t io;               /* IrDA controller information */
+	iobuff_t tx_buff;          /* Transmit buffer */
+	iobuff_t rx_buff;          /* Receive buffer */
+
+	/* Note : currently locking is *very* incomplete, but this
+	 * will get you started. Check in nsc-ircc.c for a proper
+	 * locking strategy. - Jean II */
+	spinlock_t lock;           /* For serializing operations */
+	
+	__u32 new_speed;
+};
+
+static inline void switch_bank( int iobase, int set)
+{
+	outb(set, iobase+SSR);
+}
+
+#endif
--- diff/drivers/net/iseries_veth.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/net/iseries_veth.c	2004-04-21 10:45:34.426469880 +0100
@@ -0,0 +1,1356 @@
+/* File veth.c created by Kyle A. Lucke on Mon Aug  7 2000. */
+/*
+ * IBM eServer iSeries Virtual Ethernet Device Driver
+ * Copyright (C) 2001 Kyle A. Lucke (klucke@us.ibm.com), IBM Corp.
+ * Substantially cleaned up by:
+ * Copyright (C) 2003 David Gibson <dwg@au1.ibm.com>, IBM Corporation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ *
+ *
+ * This module implements the virtual ethernet device for iSeries LPAR
+ * Linux.  It uses hypervisor message passing to implement an
+ * ethernet-like network device communicating between partitions on
+ * the iSeries.
+ *
+ * The iSeries LPAR hypervisor currently allows for up to 16 different
+ * virtual ethernets.  These are all dynamically configurable on
+ * OS/400 partitions, but dynamic configuration is not supported under
+ * Linux yet.  An ethXX network device will be created for each
+ * virtual ethernet this partition is connected to.
+ *
+ * - This driver is responsible for routing packets to and from other
+ *   partitions.  The MAC addresses used by the virtual ethernets
+ *   contains meaning and must not be modified.
+ *
+ * - Having 2 virtual ethernets to the same remote partition DOES NOT
+ *   double the available bandwidth.  The 2 devices will share the
+ *   available hypervisor bandwidth.
+ *
+ * - If you send a packet to your own mac address, it will just be
+ *   dropped, you won't get it on the receive side.
+ *
+ * - Multicast is implemented by sending the frame frame to every
+ *   other partition.  It is the responsibility of the receiving
+ *   partition to filter the addresses desired.
+ *
+ * Tunable parameters:
+ *
+ * VETH_NUMBUFFERS: This compile time option defaults to 120.  It
+ * controls how much memory Linux will allocate per remote partition
+ * it is communicating with.  It can be thought of as the maximum
+ * number of packets outstanding to a remote partition at a time.
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/version.h>
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <linux/ioport.h>
+#include <linux/pci.h>
+#include <linux/kernel.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/skbuff.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/mm.h>
+#include <linux/ethtool.h>
+#include <asm/iSeries/mf.h>
+#include <asm/iSeries/iSeries_pci.h>
+#include <asm/uaccess.h>
+
+#include <asm/iSeries/HvLpConfig.h>
+#include <asm/iSeries/HvTypes.h>
+#include <asm/iSeries/HvLpEvent.h>
+#include <asm/iommu.h>
+
+#include "iseries_veth.h"
+
+extern struct pci_dev *iSeries_veth_dev;
+
+MODULE_AUTHOR("Kyle Lucke <klucke@us.ibm.com>");
+MODULE_DESCRIPTION("iSeries Virtual ethernet driver");
+MODULE_LICENSE("GPL");
+
+#define VETH_NUMBUFFERS		(120)
+#define VETH_ACKTIMEOUT 	(1000000) /* microseconds */
+#define VETH_MAX_MCAST		(12)
+
+#define VETH_MAX_MTU		(9000)
+
+#if VETH_NUMBUFFERS < 10
+#define ACK_THRESHOLD 		(1)
+#elif VETH_NUMBUFFERS < 20
+#define ACK_THRESHOLD 		(4)
+#elif VETH_NUMBUFFERS < 40
+#define ACK_THRESHOLD 		(10)
+#else
+#define ACK_THRESHOLD 		(20)
+#endif
+
+#define	VETH_STATE_SHUTDOWN	(0x0001)
+#define VETH_STATE_OPEN		(0x0002)
+#define VETH_STATE_RESET	(0x0004)
+#define VETH_STATE_SENTMON	(0x0008)
+#define VETH_STATE_SENTCAPS	(0x0010)
+#define VETH_STATE_GOTCAPACK	(0x0020)
+#define VETH_STATE_GOTCAPS	(0x0040)
+#define VETH_STATE_SENTCAPACK	(0x0080)
+#define VETH_STATE_READY	(0x0100)
+
+struct veth_msg {
+	struct veth_msg *next;
+	struct VethFramesData data;
+	int token;
+	unsigned long in_use;
+	struct sk_buff *skb;
+};
+
+struct veth_lpar_connection {
+	HvLpIndex remote_lp;
+	struct work_struct statemachine_wq;
+	struct veth_msg *msgs;
+	int num_events;
+	struct VethCapData local_caps;
+
+	struct timer_list ack_timer;
+
+	spinlock_t lock;
+	unsigned long state;
+	HvLpInstanceId src_inst;
+	HvLpInstanceId dst_inst;
+	struct VethLpEvent cap_event, cap_ack_event;
+	u16 pending_acks[VETH_MAX_ACKS_PER_MSG];
+	u32 num_pending_acks;
+
+	int num_ack_events;
+	struct VethCapData remote_caps;
+	u32 ack_timeout;
+
+	spinlock_t msg_stack_lock;
+	struct veth_msg *msg_stack_head;
+};
+
+struct veth_port {
+	struct net_device_stats stats;
+	u64 mac_addr;
+	HvLpIndexMap lpar_map;
+
+	spinlock_t pending_gate;
+	struct sk_buff *pending_skb;
+	HvLpIndexMap pending_lpmask;
+
+	rwlock_t mcast_gate;
+	int promiscuous;
+	int all_mcast;
+	int num_mcast;
+	u64 mcast_addr[VETH_MAX_MCAST];
+};
+
+static HvLpIndex this_lp;
+static struct veth_lpar_connection *veth_cnx[HVMAXARCHITECTEDLPS]; /* = 0 */
+static struct net_device *veth_dev[HVMAXARCHITECTEDVIRTUALLANS]; /* = 0 */
+
+static int veth_start_xmit(struct sk_buff *skb, struct net_device *dev);
+static void veth_recycle_msg(struct veth_lpar_connection *, struct veth_msg *);
+static void veth_flush_pending(struct veth_lpar_connection *cnx);
+static void veth_receive(struct veth_lpar_connection *, struct VethLpEvent *);
+static void veth_timed_ack(unsigned long connectionPtr);
+
+/*
+ * Utility functions
+ */
+
+#define veth_printk(prio, fmt, args...) \
+	printk(prio "%s: " fmt, __FILE__, ## args)
+
+#define veth_error(fmt, args...) \
+	printk(KERN_ERR "(%s:%3.3d) ERROR: " fmt, __FILE__, __LINE__ , ## args)
+
+static inline void veth_stack_push(struct veth_lpar_connection *cnx,
+				   struct veth_msg *msg)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&cnx->msg_stack_lock, flags);
+	msg->next = cnx->msg_stack_head;
+	cnx->msg_stack_head = msg;
+	spin_unlock_irqrestore(&cnx->msg_stack_lock, flags);
+}
+
+static inline struct veth_msg *veth_stack_pop(struct veth_lpar_connection *cnx)
+{
+	unsigned long flags;
+	struct veth_msg *msg;
+
+	spin_lock_irqsave(&cnx->msg_stack_lock, flags);
+	msg = cnx->msg_stack_head;
+	if (msg)
+		cnx->msg_stack_head = cnx->msg_stack_head->next;
+	spin_unlock_irqrestore(&cnx->msg_stack_lock, flags);
+	return msg;
+}
+
+static inline HvLpEvent_Rc
+veth_signalevent(struct veth_lpar_connection *cnx, u16 subtype,
+		 HvLpEvent_AckInd ackind, HvLpEvent_AckType acktype,
+		 u64 token,
+		 u64 data1, u64 data2, u64 data3, u64 data4, u64 data5)
+{
+	return HvCallEvent_signalLpEventFast(cnx->remote_lp,
+					     HvLpEvent_Type_VirtualLan,
+					     subtype, ackind, acktype,
+					     cnx->src_inst,
+					     cnx->dst_inst,
+					     token, data1, data2, data3,
+					     data4, data5);
+}
+
+static inline HvLpEvent_Rc veth_signaldata(struct veth_lpar_connection *cnx,
+					   u16 subtype, u64 token, void *data)
+{
+	u64 *p = (u64 *) data;
+
+	return veth_signalevent(cnx, subtype, HvLpEvent_AckInd_NoAck,
+				HvLpEvent_AckType_ImmediateAck,
+				token, p[0], p[1], p[2], p[3], p[4]);
+}
+
+struct veth_allocation {
+	struct completion c;
+	int num;
+};
+
+static void veth_complete_allocation(void *parm, int number)
+{
+	struct veth_allocation *vc = (struct veth_allocation *)parm;
+
+	vc->num = number;
+	complete(&vc->c);
+}
+
+static int veth_allocate_events(HvLpIndex rlp, int number)
+{
+	struct veth_allocation vc = { COMPLETION_INITIALIZER(vc.c), 0 };
+
+	mf_allocateLpEvents(rlp, HvLpEvent_Type_VirtualLan,
+			    sizeof(struct VethLpEvent), number,
+			    &veth_complete_allocation, &vc);
+	wait_for_completion(&vc.c);
+
+	return vc.num;
+}
+
+/*
+ * LPAR connection code
+ */
+
+static inline void veth_kick_statemachine(struct veth_lpar_connection *cnx)
+{
+	schedule_work(&cnx->statemachine_wq);
+}
+
+static void veth_take_cap(struct veth_lpar_connection *cnx,
+			  struct VethLpEvent *event)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&cnx->lock, flags);
+	/* Receiving caps may mean the other end has just come up, so
+	 * we need to reload the instance ID of the far end */
+	cnx->dst_inst =
+		HvCallEvent_getTargetLpInstanceId(cnx->remote_lp,
+						  HvLpEvent_Type_VirtualLan);
+
+	if (cnx->state & VETH_STATE_GOTCAPS) {
+		veth_error("Received a second capabilities from lpar %d\n",
+			   cnx->remote_lp);
+		event->base_event.xRc = HvLpEvent_Rc_BufferNotAvailable;
+		HvCallEvent_ackLpEvent((struct HvLpEvent *) event);
+	} else {
+		memcpy(&cnx->cap_event, event, sizeof(cnx->cap_event));
+		cnx->state |= VETH_STATE_GOTCAPS;
+		veth_kick_statemachine(cnx);
+	}
+	spin_unlock_irqrestore(&cnx->lock, flags);
+}
+
+static void veth_take_cap_ack(struct veth_lpar_connection *cnx,
+			      struct VethLpEvent *event)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&cnx->lock, flags);
+	if (cnx->state & VETH_STATE_GOTCAPACK) {
+		veth_error("Received a second capabilities ack from lpar %d\n",
+			   cnx->remote_lp);
+	} else {
+		memcpy(&cnx->cap_ack_event, event,
+		       sizeof(&cnx->cap_ack_event));
+		cnx->state |= VETH_STATE_GOTCAPACK;
+		veth_kick_statemachine(cnx);
+	}
+	spin_unlock_irqrestore(&cnx->lock, flags);
+}
+
+static void veth_take_monitor_ack(struct veth_lpar_connection *cnx,
+				  struct VethLpEvent *event)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&cnx->lock, flags);
+	veth_printk(KERN_DEBUG, "Monitor ack returned for lpar %d\n",
+		    cnx->remote_lp);
+	cnx->state |= VETH_STATE_RESET;
+	veth_kick_statemachine(cnx);
+	spin_unlock_irqrestore(&cnx->lock, flags);
+}
+
+static void veth_handle_ack(struct VethLpEvent *event)
+{
+	HvLpIndex rlp = event->base_event.xTargetLp;
+	struct veth_lpar_connection *cnx = veth_cnx[rlp];
+
+	BUG_ON(! cnx);
+
+	switch (event->base_event.xSubtype) {
+	case VethEventTypeCap:
+		veth_take_cap_ack(cnx, event);
+		break;
+	case VethEventTypeMonitor:
+		veth_take_monitor_ack(cnx, event);
+		break;
+	default:
+		veth_error("Unknown ack type %d from lpar %d\n",
+			   event->base_event.xSubtype, rlp);
+	};
+}
+
+static void veth_handle_int(struct VethLpEvent *event)
+{
+	HvLpIndex rlp = event->base_event.xSourceLp;
+	struct veth_lpar_connection *cnx = veth_cnx[rlp];
+	unsigned long flags;
+	int i;
+
+	BUG_ON(! cnx);
+
+	switch (event->base_event.xSubtype) {
+	case VethEventTypeCap:
+		veth_take_cap(cnx, event);
+		break;
+	case VethEventTypeMonitor:
+		/* do nothing... this'll hang out here til we're dead,
+		 * and the hypervisor will return it for us. */
+		break;
+	case VethEventTypeFramesAck:
+		spin_lock_irqsave(&cnx->lock, flags);
+		for (i = 0; i < VETH_MAX_ACKS_PER_MSG; ++i) {
+			u16 msgnum = event->u.frames_ack_data.token[i];
+
+			if (msgnum < VETH_NUMBUFFERS)
+				veth_recycle_msg(cnx, cnx->msgs + msgnum);
+		}
+		spin_unlock_irqrestore(&cnx->lock, flags);
+		veth_flush_pending(cnx);
+		break;
+	case VethEventTypeFrames:
+		veth_receive(cnx, event);
+		break;
+	default:
+		veth_error("Unknown interrupt type %d from lpar %d\n",
+			   event->base_event.xSubtype, rlp);
+	};
+}
+
+static void veth_handle_event(struct HvLpEvent *event, struct pt_regs *regs)
+{
+	struct VethLpEvent *veth_event = (struct VethLpEvent *)event;
+
+	if (event->xFlags.xFunction == HvLpEvent_Function_Ack)
+		veth_handle_ack(veth_event);
+	else if (event->xFlags.xFunction == HvLpEvent_Function_Int)
+		veth_handle_int(veth_event);
+}
+
+static int veth_process_caps(struct veth_lpar_connection *cnx)
+{
+	struct VethCapData *remote_caps = &cnx->remote_caps;
+	int num_acks_needed;
+
+	/* Convert timer to jiffies */
+	cnx->ack_timeout = remote_caps->ack_timeout * HZ / 1000000;
+
+	if ( (remote_caps->num_buffers == 0)
+	     || (remote_caps->ack_threshold > VETH_MAX_ACKS_PER_MSG)
+	     || (remote_caps->ack_threshold == 0)
+	     || (cnx->ack_timeout == 0) ) {
+		veth_error("Received incompatible capabilities from lpar %d\n",
+			   cnx->remote_lp);
+		return HvLpEvent_Rc_InvalidSubtypeData;
+	}
+
+	num_acks_needed = (remote_caps->num_buffers
+			   / remote_caps->ack_threshold) + 1;
+
+	/* FIXME: locking on num_ack_events? */
+	if (cnx->num_ack_events < num_acks_needed) {
+		int num;
+
+		num = veth_allocate_events(cnx->remote_lp,
+					   num_acks_needed-cnx->num_ack_events);
+		if (num > 0)
+			cnx->num_ack_events += num;
+
+		if (cnx->num_ack_events < num_acks_needed) {
+			veth_error("Couldn't allocate enough ack events for lpar %d\n",
+				   cnx->remote_lp);
+
+			return HvLpEvent_Rc_BufferNotAvailable;
+		}
+	}
+
+
+	return HvLpEvent_Rc_Good;
+}
+
+/* FIXME: The gotos here are a bit dubious */
+static void veth_statemachine(void *p)
+{
+	struct veth_lpar_connection *cnx = (struct veth_lpar_connection *)p;
+	int rlp = cnx->remote_lp;
+	int rc;
+
+	spin_lock_irq(&cnx->lock);
+
+ restart:
+	if (cnx->state & VETH_STATE_RESET) {
+		int i;
+
+		del_timer(&cnx->ack_timer);
+
+		if (cnx->state & VETH_STATE_OPEN)
+			HvCallEvent_closeLpEventPath(cnx->remote_lp,
+						     HvLpEvent_Type_VirtualLan);
+
+		/* reset ack data */
+		memset(&cnx->pending_acks, 0xff, sizeof (cnx->pending_acks));
+		cnx->num_pending_acks = 0;
+
+		cnx->state &= ~(VETH_STATE_RESET | VETH_STATE_SENTMON
+				| VETH_STATE_OPEN | VETH_STATE_SENTCAPS
+				| VETH_STATE_GOTCAPACK | VETH_STATE_GOTCAPS
+				| VETH_STATE_SENTCAPACK | VETH_STATE_READY);
+
+		/* Clean up any leftover messages */
+		if (cnx->msgs)
+			for (i = 0; i < VETH_NUMBUFFERS; ++i)
+				veth_recycle_msg(cnx, cnx->msgs + i);
+	}
+
+	if (cnx->state & VETH_STATE_SHUTDOWN)
+		/* It's all over, do nothing */
+		goto out;
+
+	if ( !(cnx->state & VETH_STATE_OPEN) ) {
+		if (! cnx->msgs || (cnx->num_events < (2 + VETH_NUMBUFFERS)) )
+			goto cant_cope;
+
+		HvCallEvent_openLpEventPath(rlp, HvLpEvent_Type_VirtualLan);
+		cnx->src_inst =
+			HvCallEvent_getSourceLpInstanceId(rlp,
+							  HvLpEvent_Type_VirtualLan);
+		cnx->dst_inst =
+			HvCallEvent_getTargetLpInstanceId(rlp,
+							  HvLpEvent_Type_VirtualLan);
+		cnx->state |= VETH_STATE_OPEN;
+	}
+
+	if ( (cnx->state & VETH_STATE_OPEN)
+	     && !(cnx->state & VETH_STATE_SENTMON) ) {
+		rc = veth_signalevent(cnx, VethEventTypeMonitor,
+				      HvLpEvent_AckInd_DoAck,
+				      HvLpEvent_AckType_DeferredAck,
+				      0, 0, 0, 0, 0, 0);
+
+		if (rc == HvLpEvent_Rc_Good) {
+			cnx->state |= VETH_STATE_SENTMON;
+		} else {
+			if ( (rc != HvLpEvent_Rc_PartitionDead)
+			     && (rc != HvLpEvent_Rc_PathClosed) )
+				veth_error("Error sending monitor to "
+					   "lpar %d, rc=%x\n",
+					   rlp, (int) rc);
+
+			/* Oh well, hope we get a cap from the other
+			 * end and do better when that kicks us */
+			goto out;
+		}
+	}
+
+	if ( (cnx->state & VETH_STATE_OPEN)
+	     && !(cnx->state & VETH_STATE_SENTCAPS)) {
+		u64 *rawcap = (u64 *)&cnx->local_caps;
+
+		rc = veth_signalevent(cnx, VethEventTypeCap,
+				      HvLpEvent_AckInd_DoAck,
+				      HvLpEvent_AckType_ImmediateAck,
+				      0, rawcap[0], rawcap[1], rawcap[2],
+				      rawcap[3], rawcap[4]);
+
+		if (rc == HvLpEvent_Rc_Good) {
+			cnx->state |= VETH_STATE_SENTCAPS;
+		} else {
+			if ( (rc != HvLpEvent_Rc_PartitionDead)
+			     && (rc != HvLpEvent_Rc_PathClosed) )
+				veth_error("Error sending caps to "
+					   "lpar %d, rc=%x\n",
+					   rlp, (int) rc);
+			/* Oh well, hope we get a cap from the other
+			 * end and do better when that kicks us */
+			goto out;
+		}
+	}
+
+	if ((cnx->state & VETH_STATE_GOTCAPS)
+	    && !(cnx->state & VETH_STATE_SENTCAPACK)) {
+		struct VethCapData *remote_caps = &cnx->remote_caps;
+
+		memcpy(remote_caps, &cnx->cap_event.u.caps_data,
+		       sizeof(*remote_caps));
+
+		spin_unlock_irq(&cnx->lock);
+		rc = veth_process_caps(cnx);
+		spin_lock_irq(&cnx->lock);
+
+		/* We dropped the lock, so recheck for anything which
+		 * might mess us up */
+		if (cnx->state & (VETH_STATE_RESET|VETH_STATE_SHUTDOWN))
+			goto restart;
+
+		cnx->cap_event.base_event.xRc = rc;
+		HvCallEvent_ackLpEvent((struct HvLpEvent *)&cnx->cap_event);
+		if (rc == HvLpEvent_Rc_Good)
+			cnx->state |= VETH_STATE_SENTCAPACK;
+		else
+			goto cant_cope;
+	}
+
+	if ((cnx->state & VETH_STATE_GOTCAPACK)
+	    && (cnx->state & VETH_STATE_GOTCAPS)
+	    && !(cnx->state & VETH_STATE_READY)) {
+		if (cnx->cap_ack_event.base_event.xRc == HvLpEvent_Rc_Good) {
+			/* Start the ACK timer */
+			cnx->ack_timer.expires = jiffies + cnx->ack_timeout;
+			add_timer(&cnx->ack_timer);
+			cnx->state |= VETH_STATE_READY;
+		} else {
+			veth_printk(KERN_ERR, "Caps rejected (rc=%d) by "
+				    "lpar %d\n",
+				    cnx->cap_ack_event.base_event.xRc,
+				    rlp);
+			goto cant_cope;
+		}
+	}
+
+ out:
+	spin_unlock_irq(&cnx->lock);
+	return;
+
+ cant_cope:
+	/* FIXME: we get here if something happens we really can't
+	 * cope with.  The link will never work once we get here, and
+	 * all we can do is not lock the rest of the system up */
+	veth_error("Badness on connection to lpar %d (state=%04lx) "
+		   " - shutting down\n", rlp, cnx->state);
+	cnx->state |= VETH_STATE_SHUTDOWN;
+	spin_unlock_irq(&cnx->lock);
+}
+
+static int veth_init_connection(u8 rlp)
+{
+	struct veth_lpar_connection *cnx;
+	struct veth_msg *msgs;
+	int i;
+
+	if ( (rlp == this_lp)
+	     || ! HvLpConfig_doLpsCommunicateOnVirtualLan(this_lp, rlp) )
+		return 0;
+
+	cnx = kmalloc(sizeof(*cnx), GFP_KERNEL);
+	if (! cnx)
+		return -ENOMEM;
+	memset(cnx, 0, sizeof(*cnx));
+
+	cnx->remote_lp = rlp;
+	spin_lock_init(&cnx->lock);
+	INIT_WORK(&cnx->statemachine_wq, veth_statemachine, cnx);
+	init_timer(&cnx->ack_timer);
+	cnx->ack_timer.function = veth_timed_ack;
+	cnx->ack_timer.data = (unsigned long) cnx;
+	memset(&cnx->pending_acks, 0xff, sizeof (cnx->pending_acks));
+
+	veth_cnx[rlp] = cnx;
+
+	msgs = kmalloc(VETH_NUMBUFFERS * sizeof(struct veth_msg), GFP_KERNEL);
+	if (! msgs) {
+		veth_error("Can't allocate buffers for lpar %d\n", rlp);
+		return -ENOMEM;
+	}
+
+	cnx->msgs = msgs;
+	memset(msgs, 0, VETH_NUMBUFFERS * sizeof(struct veth_msg));
+	spin_lock_init(&cnx->msg_stack_lock);
+
+	for (i = 0; i < VETH_NUMBUFFERS; i++) {
+		msgs[i].token = i;
+		veth_stack_push(cnx, msgs + i);
+	}
+
+	cnx->num_events = veth_allocate_events(rlp, 2 + VETH_NUMBUFFERS);
+
+	if (cnx->num_events < (2 + VETH_NUMBUFFERS)) {
+		veth_error("Can't allocate events for lpar %d, only got %d\n",
+			   rlp, cnx->num_events);
+		return -ENOMEM;
+	}
+
+	cnx->local_caps.num_buffers = VETH_NUMBUFFERS;
+	cnx->local_caps.ack_threshold = ACK_THRESHOLD;
+	cnx->local_caps.ack_timeout = VETH_ACKTIMEOUT;
+
+	return 0;
+}
+
+static void veth_destroy_connection(u8 rlp)
+{
+	struct veth_lpar_connection *cnx = veth_cnx[rlp];
+
+	if (! cnx)
+		return;
+
+	spin_lock_irq(&cnx->lock);
+	cnx->state |= VETH_STATE_RESET | VETH_STATE_SHUTDOWN;
+	veth_kick_statemachine(cnx);
+	spin_unlock_irq(&cnx->lock);
+
+	flush_scheduled_work();
+
+	/* FIXME: not sure if this is necessary - will already have
+	 * been deleted by the state machine, just want to make sure
+	 * its not running any more */
+	del_timer_sync(&cnx->ack_timer);
+
+	if (cnx->num_events > 0)
+		mf_deallocateLpEvents(cnx->remote_lp,
+				      HvLpEvent_Type_VirtualLan,
+				      cnx->num_events,
+				      NULL, NULL);
+	if (cnx->num_ack_events > 0)
+		mf_deallocateLpEvents(cnx->remote_lp,
+				      HvLpEvent_Type_VirtualLan,
+				      cnx->num_ack_events,
+				      NULL, NULL);
+
+	if (cnx->msgs)
+		kfree(cnx->msgs);
+}
+
+/*
+ * net_device code
+ */
+
+static int veth_open(struct net_device *dev)
+{
+	struct veth_port *port = (struct veth_port *) dev->priv;
+
+	memset(&port->stats, 0, sizeof (port->stats));
+	netif_start_queue(dev);
+	return 0;
+}
+
+static int veth_close(struct net_device *dev)
+{
+	netif_stop_queue(dev);
+	return 0;
+}
+
+static struct net_device_stats *veth_get_stats(struct net_device *dev)
+{
+	struct veth_port *port = (struct veth_port *) dev->priv;
+
+	return &port->stats;
+}
+
+static int veth_change_mtu(struct net_device *dev, int new_mtu)
+{
+	if ((new_mtu < 68) || (new_mtu > VETH_MAX_MTU))
+		return -EINVAL;
+	dev->mtu = new_mtu;
+	return 0;
+}
+
+static void veth_set_multicast_list(struct net_device *dev)
+{
+	struct veth_port *port = (struct veth_port *) dev->priv;
+	unsigned long flags;
+
+	write_lock_irqsave(&port->mcast_gate, flags);
+
+	if (dev->flags & IFF_PROMISC) {	/* set promiscuous mode */
+		printk(KERN_INFO "%s: Promiscuous mode enabled.\n",
+		       dev->name);
+		port->promiscuous = 1;
+	} else if ( (dev->flags & IFF_ALLMULTI)
+		    || (dev->mc_count > VETH_MAX_MCAST) ) {
+		port->all_mcast = 1;
+	} else {
+		struct dev_mc_list *dmi = dev->mc_list;
+		int i;
+
+		/* Update table */
+		port->num_mcast = 0;
+
+		for (i = 0; i < dev->mc_count; i++) {
+			u8 *addr = dmi->dmi_addr;
+			u64 xaddr = 0;
+
+			if (addr[0] & 0x01) {/* multicast address? */
+				memcpy(&xaddr, addr, ETH_ALEN);
+				port->mcast_addr[port->num_mcast] = xaddr;
+				port->num_mcast++;
+			}
+			dmi = dmi->next;
+		}
+	}
+
+	write_unlock_irqrestore(&port->mcast_gate, flags);
+}
+
+static int veth_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+{
+#ifdef SIOCETHTOOL
+	struct ethtool_cmd ecmd;
+
+	if (cmd != SIOCETHTOOL)
+		return -EOPNOTSUPP;
+	if (copy_from_user(&ecmd, ifr->ifr_data, sizeof (ecmd)))
+		return -EFAULT;
+	switch (ecmd.cmd) {
+	case ETHTOOL_GSET:
+		ecmd.supported = (SUPPORTED_1000baseT_Full
+				  | SUPPORTED_Autoneg | SUPPORTED_FIBRE);
+		ecmd.advertising = (SUPPORTED_1000baseT_Full
+				    | SUPPORTED_Autoneg | SUPPORTED_FIBRE);
+
+		ecmd.port = PORT_FIBRE;
+		ecmd.transceiver = XCVR_INTERNAL;
+		ecmd.phy_address = 0;
+		ecmd.speed = SPEED_1000;
+		ecmd.duplex = DUPLEX_FULL;
+		ecmd.autoneg = AUTONEG_ENABLE;
+		ecmd.maxtxpkt = 120;
+		ecmd.maxrxpkt = 120;
+		if (copy_to_user(ifr->ifr_data, &ecmd, sizeof(ecmd)))
+			return -EFAULT;
+		return 0;
+
+	case ETHTOOL_GDRVINFO:{
+			struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO };
+			strncpy(info.driver, "veth", sizeof(info.driver) - 1);
+			info.driver[sizeof(info.driver) - 1] = '\0';
+			strncpy(info.version, "1.0", sizeof(info.version) - 1);
+			if (copy_to_user(ifr->ifr_data, &info, sizeof(info)))
+				return -EFAULT;
+			return 0;
+		}
+		/* get link status */
+	case ETHTOOL_GLINK:{
+			struct ethtool_value edata = { ETHTOOL_GLINK };
+			edata.data = 1;
+			if (copy_to_user(ifr->ifr_data, &edata, sizeof(edata)))
+				return -EFAULT;
+			return 0;
+		}
+
+	default:
+		break;
+	}
+
+#endif
+	return -EOPNOTSUPP;
+}
+
+struct net_device * __init veth_probe_one(int vlan)
+{
+	struct net_device *dev;
+	struct veth_port *port;
+	int i, rc;
+
+	dev = alloc_etherdev(sizeof (struct veth_port));
+	if (! dev) {
+		veth_error("Unable to allocate net_device structure!\n");
+		return NULL;
+	}
+
+	port = (struct veth_port *) dev->priv;
+
+	spin_lock_init(&port->pending_gate);
+	rwlock_init(&port->mcast_gate);
+
+	for (i = 0; i < HVMAXARCHITECTEDLPS; i++) {
+		HvLpVirtualLanIndexMap map;
+
+		if (i == this_lp)
+			continue;
+		map = HvLpConfig_getVirtualLanIndexMapForLp(i);
+		if (map & (0x8000 >> vlan))
+			port->lpar_map |= (1 << i);
+	}
+
+	dev->dev_addr[0] = 0x02;
+	dev->dev_addr[1] = 0x01;
+	dev->dev_addr[2] = 0xff;
+	dev->dev_addr[3] = vlan;
+	dev->dev_addr[4] = 0xff;
+	dev->dev_addr[5] = this_lp;
+
+	dev->mtu = VETH_MAX_MTU;
+
+	memcpy(&port->mac_addr, dev->dev_addr, 6);
+
+	dev->open = veth_open;
+	dev->hard_start_xmit = veth_start_xmit;
+	dev->stop = veth_close;
+	dev->get_stats = veth_get_stats;
+	dev->change_mtu = veth_change_mtu;
+	dev->set_mac_address = NULL;
+	dev->set_multicast_list = veth_set_multicast_list;
+	dev->do_ioctl = veth_ioctl;
+
+	rc = register_netdev(dev);
+	if (rc != 0) {
+		veth_printk(KERN_ERR,
+			    "Failed to register ethernet device for vlan %d\n",
+			    vlan);
+		free_netdev(dev);
+		return NULL;
+	}
+
+	veth_printk(KERN_DEBUG, "%s attached to iSeries vlan %d (lpar_map=0x%04x)\n",
+		    dev->name, vlan, port->lpar_map);
+
+	return dev;
+}
+
+/*
+ * Tx path
+ */
+
+static int veth_transmit_to_one(struct sk_buff *skb, HvLpIndex rlp,
+				struct net_device *dev)
+{
+	struct veth_lpar_connection *cnx = veth_cnx[rlp];
+	struct veth_port *port = (struct veth_port *) dev->priv;
+	HvLpEvent_Rc rc;
+	u32 dma_address, dma_length;
+	struct veth_msg *msg = NULL;
+	int err = 0;
+	unsigned long flags;
+
+	if (! cnx) {
+		port->stats.tx_errors++;
+		dev_kfree_skb(skb);
+		return 0;
+	}
+
+	spin_lock_irqsave(&cnx->lock, flags);
+
+	if (! cnx->state & VETH_STATE_READY)
+		goto drop;
+
+	if ((skb->len - 14) > VETH_MAX_MTU)
+		goto drop;
+
+	msg = veth_stack_pop(cnx);
+
+	if (! msg) {
+		err = 1;
+		goto drop;
+	}
+
+	dma_length = skb->len;
+	dma_address = pci_map_single(iSeries_veth_dev, skb->data,
+				     dma_length, PCI_DMA_TODEVICE);
+
+	if (pci_dma_mapping_error(dma_address))
+		goto recycle_and_drop;
+
+	/* Is it really necessary to check the length and address
+	 * fields of the first entry here? */
+	msg->skb = skb;
+	msg->data.addr[0] = dma_address;
+	msg->data.len[0] = dma_length;
+	msg->data.eofmask = 1 << VETH_EOF_SHIFT;
+	set_bit(0, &(msg->in_use));
+	rc = veth_signaldata(cnx, VethEventTypeFrames, msg->token, &msg->data);
+
+	if (rc != HvLpEvent_Rc_Good)
+		goto recycle_and_drop;
+
+	spin_unlock_irqrestore(&cnx->lock, flags);
+	return 0;
+
+ recycle_and_drop:
+	msg->skb = NULL;
+	/* need to set in use to make veth_recycle_msg in case this
+	 * was a mapping failure */
+	set_bit(0, &msg->in_use);
+	veth_recycle_msg(cnx, msg);
+ drop:
+	port->stats.tx_errors++;
+	dev_kfree_skb(skb);
+	spin_unlock_irqrestore(&cnx->lock, flags);
+	return err;
+}
+
+static HvLpIndexMap veth_transmit_to_many(struct sk_buff *skb,
+					  HvLpIndexMap lpmask,
+					  struct net_device *dev)
+{
+	struct veth_port *port = (struct veth_port *) dev->priv;
+	int i;
+	int rc;
+
+	for (i = 0; i < HVMAXARCHITECTEDLPS; i++) {
+		struct sk_buff *clone;
+
+		if (! lpmask & (1<<i))
+			continue;
+
+		clone = skb_clone(skb, GFP_ATOMIC);
+		if (! clone) {
+			veth_error("%s: skb_clone failed %p\n",
+				   dev->name, skb);
+			continue;
+		}
+
+		rc = veth_transmit_to_one(clone, i, dev);
+		if (! rc)
+			lpmask &= ~(1<<i);
+	}
+
+	if (! lpmask) {
+		port->stats.tx_packets++;
+		port->stats.tx_bytes += skb->len;
+	}
+
+	return lpmask;
+}
+
+static int veth_start_xmit(struct sk_buff *skb, struct net_device *dev)
+{
+	unsigned char *frame = skb->data;
+	struct veth_port *port = (struct veth_port *) dev->priv;
+	unsigned long flags;
+	HvLpIndexMap lpmask;
+
+	if (! (frame[0] & 0x01)) {
+		/* unicast packet */
+		HvLpIndex rlp = frame[5];
+
+		if ( ! ((1 << rlp) & port->lpar_map) ) {
+			dev_kfree_skb(skb);
+			return 0;
+		}
+
+		lpmask = 1 << rlp;
+	} else {
+		lpmask = port->lpar_map;
+	}
+
+	lpmask = veth_transmit_to_many(skb, lpmask, dev);
+
+	if (! lpmask) {
+		dev_kfree_skb(skb);
+	} else {
+		spin_lock_irqsave(&port->pending_gate, flags);
+		if (port->pending_skb) {
+			veth_error("%s: Tx while skb was pending!\n",
+				   dev->name);
+			dev_kfree_skb(skb);
+			return 1;
+		}
+
+		port->pending_skb = skb;
+		port->pending_lpmask = lpmask;
+		netif_stop_queue(dev);
+
+		spin_unlock_irqrestore(&port->pending_gate, flags);
+	}
+
+	return 0;
+}
+
+static void veth_recycle_msg(struct veth_lpar_connection *cnx,
+			     struct veth_msg *msg)
+{
+	u32 dma_address, dma_length;
+
+	if (test_and_clear_bit(0, &msg->in_use)) {
+		dma_address = msg->data.addr[0];
+		dma_length = msg->data.len[0];
+
+		pci_unmap_single(iSeries_veth_dev, dma_address, dma_length,
+				 PCI_DMA_TODEVICE);
+
+		if (msg->skb) {
+			dev_kfree_skb_any(msg->skb);
+			msg->skb = NULL;
+		}
+
+		memset(&msg->data, 0, sizeof(msg->data));
+		veth_stack_push(cnx, msg);
+	} else
+		if (cnx->state & VETH_STATE_OPEN)
+			veth_error("Bogus frames ack from lpar %d (#%d)\n",
+				   cnx->remote_lp, msg->token);
+}
+
+static void veth_flush_pending(struct veth_lpar_connection *cnx)
+{
+	int i;
+	for (i = 0; i < HVMAXARCHITECTEDVIRTUALLANS; i++) {
+		struct net_device *dev = veth_dev[i];
+		struct veth_port *port;
+		unsigned long flags;
+
+		if (! dev)
+			continue;
+
+		port = (struct veth_port *)dev->priv;
+
+		if (! (port->lpar_map & (1<<cnx->remote_lp)))
+			continue;
+
+		spin_lock_irqsave(&port->pending_gate, flags);
+		if (port->pending_skb) {
+			port->pending_lpmask =
+				veth_transmit_to_many(port->pending_skb,
+						      port->pending_lpmask,
+						      dev);
+			if (! port->pending_lpmask) {
+				dev_kfree_skb_any(port->pending_skb);
+				port->pending_skb = NULL;
+				netif_start_queue(dev);
+			}
+		}
+		spin_unlock_irqrestore(&port->pending_gate, flags);
+	}
+}
+
+/*
+ * Rx path
+ */
+
+static inline int veth_frame_wanted(struct veth_port *port, u64 mac_addr)
+{
+	int wanted = 0;
+	int i;
+	unsigned long flags;
+
+	if ( (mac_addr == port->mac_addr) || (mac_addr == 0xffffffffffff0000) )
+		return 1;
+
+	if (! (((char *) &mac_addr)[0] & 0x01))
+		return 0;
+
+	read_lock_irqsave(&port->mcast_gate, flags);
+
+	if (port->promiscuous || port->all_mcast) {
+		wanted = 1;
+		goto out;
+	}
+
+	for (i = 0; i < port->num_mcast; ++i) {
+		if (port->mcast_addr[i] == mac_addr) {
+			wanted = 1;
+			break;
+		}
+	}
+
+ out:
+	read_unlock_irqrestore(&port->mcast_gate, flags);
+
+	return wanted;
+}
+
+struct dma_chunk {
+	u64 addr;
+	u64 size;
+};
+
+#define VETH_MAX_PAGES_PER_FRAME ( (VETH_MAX_MTU+PAGE_SIZE-2)/PAGE_SIZE + 1 )
+
+static inline void veth_build_dma_list(struct dma_chunk *list,
+				       unsigned char *p, unsigned long length)
+{
+	unsigned long done;
+	int i = 1;
+
+	/* FIXME: skbs are continguous in real addresses.  Do we
+	 * really need to break it into PAGE_SIZE chunks, or can we do
+	 * it just at the granularity of iSeries real->absolute
+	 * mapping?  Indeed, given the way the allocator works, can we
+	 * count on them being absolutely contiguous? */
+	list[0].addr = ISERIES_HV_ADDR(p);
+	list[0].size = min(length,
+			   PAGE_SIZE - ((unsigned long)p & ~PAGE_MASK));
+
+	done = list[0].size;
+	while (done < length) {
+		list[i].addr = ISERIES_HV_ADDR(p + done);
+		list[i].size = min(length-done, PAGE_SIZE);
+		done += list[i].size;
+		i++;
+	}
+}
+
+static void veth_flush_acks(struct veth_lpar_connection *cnx)
+{
+	HvLpEvent_Rc rc;
+
+	rc = veth_signaldata(cnx, VethEventTypeFramesAck,
+			     0, &cnx->pending_acks);
+
+	if (rc != HvLpEvent_Rc_Good)
+		veth_error("Error 0x%x acking frames from lpar %d!\n",
+			   (unsigned)rc, cnx->remote_lp);
+
+	cnx->num_pending_acks = 0;
+	memset(&cnx->pending_acks, 0xff, sizeof(cnx->pending_acks));
+}
+
+static void veth_receive(struct veth_lpar_connection *cnx,
+			 struct VethLpEvent *event)
+{
+	struct VethFramesData *senddata = &event->u.frames_data;
+	int startchunk = 0;
+	int nchunks;
+	unsigned long flags;
+	HvLpDma_Rc rc;
+
+	do {
+		u16 length = 0;
+		struct sk_buff *skb;
+		struct dma_chunk local_list[VETH_MAX_PAGES_PER_FRAME];
+		struct dma_chunk remote_list[VETH_MAX_FRAMES_PER_MSG];
+		u64 dest;
+		HvLpVirtualLanIndex vlan;
+		struct net_device *dev;
+		struct veth_port *port;
+
+		/* FIXME: do we need this? */
+		memset(local_list, 0, sizeof(local_list));
+		memset(remote_list, 0, sizeof(VETH_MAX_FRAMES_PER_MSG));
+
+		/* a 0 address marks the end of the valid entries */
+		if (senddata->addr[startchunk] == 0)
+			break;
+
+		/* make sure that we have at least 1 EOF entry in the
+		 * remaining entries */
+		if (! (senddata->eofmask >> (startchunk + VETH_EOF_SHIFT))) {
+			veth_error("missing EOF frag in event "
+				   "eofmask=0x%x startchunk=%d\n",
+				   (unsigned) senddata->eofmask, startchunk);
+			break;
+		}
+
+		/* build list of chunks in this frame */
+		nchunks = 0;
+		do {
+			remote_list[nchunks].addr =
+				(u64) senddata->addr[startchunk+nchunks] << 32;
+			remote_list[nchunks].size =
+				senddata->len[startchunk+nchunks];
+			length += remote_list[nchunks].size;
+		} while (! (senddata->eofmask &
+			    (1 << (VETH_EOF_SHIFT + startchunk + nchunks++))));
+
+		/* length == total length of all chunks */
+		/* nchunks == # of chunks in this frame */
+
+		if ((length - ETH_HLEN) > VETH_MAX_MTU) {
+			veth_error("Received oversize frame from lpar %d "
+				   "(length=%d)\n", cnx->remote_lp, length);
+			continue;
+		}
+
+		skb = alloc_skb(length, GFP_ATOMIC);
+		if (!skb)
+			continue;
+
+		veth_build_dma_list(local_list, skb->data, length);
+
+		rc = HvCallEvent_dmaBufList(HvLpEvent_Type_VirtualLan,
+					    event->base_event.xSourceLp,
+					    HvLpDma_Direction_RemoteToLocal,
+					    cnx->src_inst,
+					    cnx->dst_inst,
+					    HvLpDma_AddressType_RealAddress,
+					    HvLpDma_AddressType_TceIndex,
+					    ISERIES_HV_ADDR(&local_list),
+					    ISERIES_HV_ADDR(&remote_list),
+					    length);
+		if (rc != HvLpDma_Rc_Good) {
+			dev_kfree_skb_irq(skb);
+			continue;
+		}
+
+		vlan = skb->data[9];
+		dev = veth_dev[vlan];
+		if (! dev)
+			/* Some earlier versions of the driver sent
+			   broadcasts down all connections, even to
+			   lpars that weren't on the relevant vlan.
+			   So ignore packets belonging to a vlan we're
+			   not on. */
+			continue;
+
+		port = (struct veth_port *)dev->priv;
+		dest = *((u64 *) skb->data) & 0xFFFFFFFFFFFF0000;
+
+		if ((vlan > HVMAXARCHITECTEDVIRTUALLANS) || !port) {
+			dev_kfree_skb_irq(skb);
+			continue;
+		}
+		if (! veth_frame_wanted(port, dest)) {
+			dev_kfree_skb_irq(skb);
+			continue;
+		}
+
+		skb_put(skb, length);
+		skb->dev = dev;
+		skb->protocol = eth_type_trans(skb, dev);
+		skb->ip_summed = CHECKSUM_NONE;
+		netif_rx(skb);	/* send it up */
+		port->stats.rx_packets++;
+		port->stats.rx_bytes += length;
+	} while (startchunk += nchunks, startchunk < VETH_MAX_FRAMES_PER_MSG);
+
+	/* Ack it */
+	spin_lock_irqsave(&cnx->lock, flags);
+	BUG_ON(cnx->num_pending_acks > VETH_MAX_ACKS_PER_MSG);
+
+	cnx->pending_acks[cnx->num_pending_acks++] =
+		event->base_event.xCorrelationToken;
+
+	if ( (cnx->num_pending_acks >= cnx->remote_caps.ack_threshold)
+	     || (cnx->num_pending_acks >= VETH_MAX_ACKS_PER_MSG) )
+		veth_flush_acks(cnx);
+
+	spin_unlock_irqrestore(&cnx->lock, flags);
+}
+
+static void veth_timed_ack(unsigned long ptr)
+{
+	struct veth_lpar_connection *cnx = (struct veth_lpar_connection *) ptr;
+	unsigned long flags;
+
+	/* Ack all the events */
+	spin_lock_irqsave(&cnx->lock, flags);
+	if (cnx->num_pending_acks > 0)
+		veth_flush_acks(cnx);
+
+	/* Reschedule the timer */
+	cnx->ack_timer.expires = jiffies + cnx->ack_timeout;
+	add_timer(&cnx->ack_timer);
+	spin_unlock_irqrestore(&cnx->lock, flags);
+}
+
+/*
+ * Module initialization/cleanup
+ */
+
+void __exit veth_module_cleanup(void)
+{
+	int i;
+
+	for (i = 0; i < HVMAXARCHITECTEDLPS; ++i)
+		veth_destroy_connection(i);
+
+	HvLpEvent_unregisterHandler(HvLpEvent_Type_VirtualLan);
+
+	for (i = 0; i < HVMAXARCHITECTEDVIRTUALLANS; ++i) {
+		struct net_device *dev = veth_dev[i];
+
+		if (! dev)
+			continue;
+
+		veth_dev[i] = NULL;
+		unregister_netdev(dev);
+		free_netdev(dev);
+	}
+}
+module_exit(veth_module_cleanup);
+
+int __init veth_module_init(void)
+{
+	HvLpIndexMap vlan_map = HvLpConfig_getVirtualLanIndexMap();
+	int i;
+	int rc;
+
+	this_lp = HvLpConfig_getLpIndex_outline();
+
+	for (i = 0; i < HVMAXARCHITECTEDLPS; ++i) {
+		rc = veth_init_connection(i);
+		if (rc != 0) {
+			veth_module_cleanup();
+			return rc;
+		}
+	}
+
+	for (i = 0; i < HVMAXARCHITECTEDVIRTUALLANS; ++i) {
+		struct net_device *dev;
+
+		if (! (vlan_map & (0x8000 >> i)))
+			continue;
+
+		dev = veth_probe_one(i);
+
+		if (! dev) {
+			veth_module_cleanup();
+			return rc;
+		}
+
+		veth_dev[i] = dev;
+	}
+
+	HvLpEvent_registerHandler(HvLpEvent_Type_VirtualLan,
+				  &veth_handle_event);
+
+	/* Start the state machine on each connection, to commence
+	 * link negotiation */
+	for (i = 0; i < HVMAXARCHITECTEDLPS; i++)
+		if (veth_cnx[i])
+			veth_kick_statemachine(veth_cnx[i]);
+
+	return 0;
+}
+module_init(veth_module_init);
--- diff/drivers/net/iseries_veth.h	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/net/iseries_veth.h	2004-04-21 10:45:34.427469728 +0100
@@ -0,0 +1,48 @@
+/* File veth.h created by Kyle A. Lucke on Mon Aug  7 2000. */
+
+#ifndef _ISERIES_VETH_H
+#define _ISERIES_VETH_H
+
+#define VethEventTypeCap	(0)
+#define VethEventTypeFrames	(1)
+#define VethEventTypeMonitor	(2)
+#define VethEventTypeFramesAck	(3)
+
+#define VETH_MAX_ACKS_PER_MSG	(20)
+#define VETH_MAX_FRAMES_PER_MSG	(6)
+
+struct VethFramesData {
+	u32 addr[VETH_MAX_FRAMES_PER_MSG];
+	u16 len[VETH_MAX_FRAMES_PER_MSG];
+	u32 eofmask;
+};
+#define VETH_EOF_SHIFT		(32-VETH_MAX_FRAMES_PER_MSG)
+
+struct VethFramesAckData {
+	u16 token[VETH_MAX_ACKS_PER_MSG];
+};
+
+struct VethCapData {
+	u8 caps_version;
+	u8 rsvd1;
+	u16 num_buffers;
+	u16 ack_threshold;
+	u16 rsvd2;
+	u32 ack_timeout;
+	u32 rsvd3;
+	u64 rsvd4[3];
+};
+
+struct VethLpEvent {
+	struct HvLpEvent base_event;
+	union {
+		struct VethCapData caps_data;
+		struct VethFramesData frames_data;
+		struct VethFramesAckData frames_ack_data;
+	} u;
+
+};
+
+#define HVMAXARCHITECTEDVIRTUALLANS (16)
+
+#endif	/* _ISERIES_VETH_H */
--- diff/drivers/net/s2io-regs.h	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/net/s2io-regs.h	2004-04-21 10:45:34.443467296 +0100
@@ -0,0 +1,775 @@
+/************************************************************************
+ * regs.h: A Linux PCI-X Ethernet driver for S2IO 10GbE Server NIC
+ * Copyright 2002 Raghavendra Koushik (raghavendra.koushik@s2io.com)
+
+ * This software may be used and distributed according to the terms of
+ * the GNU General Public License (GPL), incorporated herein by reference.
+ * Drivers based on or derived from this code fall under the GPL and must
+ * retain the authorship, copyright and license notice.  This file is not
+ * a complete program and may only be used when the entire operating
+ * system is licensed under the GPL.
+ * See the file COPYING in this distribution for more information.
+ ************************************************************************/
+#ifndef _REGS_H
+#define _REGS_H
+
+#define TBD 0
+
+typedef struct _XENA_dev_config {
+/* Convention: mHAL_XXX is mask, vHAL_XXX is value */
+
+/* General Control-Status Registers */
+	u64 general_int_status;
+#define GEN_INTR_TXPIC             BIT(0)
+#define GEN_INTR_TXDMA             BIT(1)
+#define GEN_INTR_TXMAC             BIT(2)
+#define GEN_INTR_TXXGXS            BIT(3)
+#define GEN_INTR_TXTRAFFIC         BIT(8)
+#define GEN_INTR_RXPIC             BIT(32)
+#define GEN_INTR_RXDMA             BIT(33)
+#define GEN_INTR_RXMAC             BIT(34)
+#define GEN_INTR_MC                BIT(35)
+#define GEN_INTR_RXXGXS            BIT(36)
+#define GEN_INTR_RXTRAFFIC         BIT(40)
+#define GEN_ERROR_INTR             GEN_INTR_TXPIC | GEN_INTR_RXPIC | \
+                                   GEN_INTR_TXDMA | GEN_INTR_RXDMA | \
+                                   GEN_INTR_TXMAC | GEN_INTR_RXMAC | \
+                                   GEN_INTR_TXXGXS| GEN_INTR_RXXGXS| \
+                                   GEN_INTR_MC
+
+	u64 general_int_mask;
+
+	u8 unused0[0x100 - 0x10];
+
+	u64 sw_reset;
+/* XGXS must be removed from reset only once. */
+#define SW_RESET_XENA              vBIT(0xA5,0,8)
+#define SW_RESET_FLASH             vBIT(0xA5,8,8)
+#define SW_RESET_EOI               vBIT(0xA5,16,8)
+#define SW_RESET_ALL               (SW_RESET_XENA     |   \
+                                    SW_RESET_FLASH    |   \
+                                    SW_RESET_EOI)
+/* The SW_RESET register must read this value after a successful reset. */
+#define	SW_RESET_RAW_VAL			0xA5000000
+
+
+	u64 adapter_status;
+#define ADAPTER_STATUS_TDMA_READY          BIT(0)
+#define ADAPTER_STATUS_RDMA_READY          BIT(1)
+#define ADAPTER_STATUS_PFC_READY           BIT(2)
+#define ADAPTER_STATUS_TMAC_BUF_EMPTY      BIT(3)
+#define ADAPTER_STATUS_PIC_QUIESCENT       BIT(5)
+#define ADAPTER_STATUS_RMAC_REMOTE_FAULT   BIT(6)
+#define ADAPTER_STATUS_RMAC_LOCAL_FAULT    BIT(7)
+#define ADAPTER_STATUS_RMAC_PCC_IDLE       vBIT(0xFF,8,8)
+#define ADAPTER_STATUS_RC_PRC_QUIESCENT    vBIT(0xFF,16,8)
+#define ADAPTER_STATUS_MC_DRAM_READY       BIT(24)
+#define ADAPTER_STATUS_MC_QUEUES_READY     BIT(25)
+#define ADAPTER_STATUS_M_PLL_LOCK          BIT(30)
+#define ADAPTER_STATUS_P_PLL_LOCK          BIT(31)
+
+	u64 adapter_control;
+#define ADAPTER_CNTL_EN                    BIT(7)
+#define ADAPTER_EOI_TX_ON                  BIT(15)
+#define ADAPTER_LED_ON                     BIT(23)
+#define ADAPTER_UDPI(val)                  vBIT(val,36,4)
+#define ADAPTER_WAIT_INT                   BIT(48)
+#define ADAPTER_ECC_EN                     BIT(55)
+
+	u64 serr_source;
+#define SERR_SOURCE_PIC					BIT(0)
+#define SERR_SOURCE_TXDMA				BIT(1)
+#define SERR_SOURCE_RXDMA				BIT(2)
+#define SERR_SOURCE_MAC                 BIT(3)
+#define SERR_SOURCE_MC                  BIT(4)
+#define SERR_SOURCE_XGXS                BIT(5)
+#define	SERR_SOURCE_ANY					(SERR_SOURCE_PIC		| \
+										SERR_SOURCE_TXDMA	| \
+										SERR_SOURCE_RXDMA	| \
+										SERR_SOURCE_MAC		| \
+										SERR_SOURCE_MC      | \
+										SERR_SOURCE_XGXS)
+
+
+	u8 unused_0[0x800 - 0x120];
+
+/* PCI-X Controller registers */
+	u64 pic_int_status;
+	u64 pic_int_mask;
+#define PIC_INT_TX                     BIT(0)
+#define PIC_INT_FLSH                   BIT(1)
+#define PIC_INT_MDIO                   BIT(2)
+#define PIC_INT_IIC                    BIT(3)
+#define PIC_INT_GPIO                   BIT(4)
+#define PIC_INT_RX                     BIT(32)
+
+	u64 txpic_int_reg;
+	u64 txpic_int_mask;
+#define PCIX_INT_REG_ECC_SG_ERR                BIT(0)
+#define PCIX_INT_REG_ECC_DB_ERR                BIT(1)
+#define PCIX_INT_REG_FLASHR_R_FSM_ERR          BIT(8)
+#define PCIX_INT_REG_FLASHR_W_FSM_ERR          BIT(9)
+#define PCIX_INT_REG_INI_TX_FSM_SERR           BIT(10)
+#define PCIX_INT_REG_INI_TXO_FSM_ERR           BIT(11)
+#define PCIX_INT_REG_TRT_FSM_SERR              BIT(13)
+#define PCIX_INT_REG_SRT_FSM_SERR              BIT(14)
+#define PCIX_INT_REG_PIFR_FSM_SERR             BIT(15)
+#define PCIX_INT_REG_WRC_TX_SEND_FSM_SERR      BIT(21)
+#define PCIX_INT_REG_RRC_TX_REQ_FSM_SERR       BIT(23)
+#define PCIX_INT_REG_INI_RX_FSM_SERR           BIT(48)
+#define PCIX_INT_REG_RA_RX_FSM_SERR            BIT(50)
+/*
+#define PCIX_INT_REG_WRC_RX_SEND_FSM_SERR      BIT(52)
+#define PCIX_INT_REG_RRC_RX_REQ_FSM_SERR       BIT(54)
+#define PCIX_INT_REG_RRC_RX_SPLIT_FSM_SERR     BIT(58)
+*/
+	u64 txpic_alarms;
+	u64 rxpic_int_reg;
+	u64 rxpic_int_mask;
+	u64 rxpic_alarms;
+
+	u64 flsh_int_reg;
+	u64 flsh_int_mask;
+#define PIC_FLSH_INT_REG_CYCLE_FSM_ERR         BIT(63)
+#define PIC_FLSH_INT_REG_ERR                   BIT(62)
+	u64 flash_alarms;
+
+	u64 mdio_int_reg;
+	u64 mdio_int_mask;
+#define MDIO_INT_REG_MDIO_BUS_ERR              BIT(0)
+#define MDIO_INT_REG_DTX_BUS_ERR               BIT(8)
+#define MDIO_INT_REG_LASI                      BIT(39)
+	u64 mdio_alarms;
+
+	u64 iic_int_reg;
+	u64 iic_int_mask;
+#define IIC_INT_REG_BUS_FSM_ERR                BIT(4)
+#define IIC_INT_REG_BIT_FSM_ERR                BIT(5)
+#define IIC_INT_REG_CYCLE_FSM_ERR              BIT(6)
+#define IIC_INT_REG_REQ_FSM_ERR                BIT(7)
+#define IIC_INT_REG_ACK_ERR                    BIT(8)
+	u64 iic_alarms;
+
+	u8 unused4[0x08];
+
+	u64 gpio_int_reg;
+	u64 gpio_int_mask;
+	u64 gpio_alarms;
+
+	u8 unused5[0x38];
+
+	u64 tx_traffic_int;
+#define TX_TRAFFIC_INT_n(n)                    BIT(n)
+	u64 tx_traffic_mask;
+
+	u64 rx_traffic_int;
+#define RX_TRAFFIC_INT_n(n)                    BIT(n)
+	u64 rx_traffic_mask;
+
+/* PIC Control registers */
+	u64 pic_control;
+#define PIC_CNTL_RX_ALARM_MAP_1                BIT(0)
+#define PIC_CNTL_SHARED_SPLITS(n)              vBIT(n,11,4)
+
+	u64 swapper_ctrl;
+#define SWAPPER_CTRL_PIF_R_FE                  BIT(0)
+#define SWAPPER_CTRL_PIF_R_SE                  BIT(1)
+#define SWAPPER_CTRL_PIF_W_FE                  BIT(8)
+#define SWAPPER_CTRL_PIF_W_SE                  BIT(9)
+#define SWAPPER_CTRL_TXP_FE                    BIT(16)
+#define SWAPPER_CTRL_TXP_SE                    BIT(17)
+#define SWAPPER_CTRL_TXD_R_FE                  BIT(18)
+#define SWAPPER_CTRL_TXD_R_SE                  BIT(19)
+#define SWAPPER_CTRL_TXD_W_FE                  BIT(20)
+#define SWAPPER_CTRL_TXD_W_SE                  BIT(21)
+#define SWAPPER_CTRL_TXF_R_FE                  BIT(22)
+#define SWAPPER_CTRL_TXF_R_SE                  BIT(23)
+#define SWAPPER_CTRL_RXD_R_FE                  BIT(32)
+#define SWAPPER_CTRL_RXD_R_SE                  BIT(33)
+#define SWAPPER_CTRL_RXD_W_FE                  BIT(34)
+#define SWAPPER_CTRL_RXD_W_SE                  BIT(35)
+#define SWAPPER_CTRL_RXF_W_FE                  BIT(36)
+#define SWAPPER_CTRL_RXF_W_SE                  BIT(37)
+#define SWAPPER_CTRL_XMSI_FE                   BIT(40)
+#define SWAPPER_CTRL_XMSI_SE                   BIT(41)
+#define SWAPPER_CTRL_STATS_FE                  BIT(48)
+#define SWAPPER_CTRL_STATS_SE                  BIT(49)
+
+	u64 pif_rd_swapper_fb;
+#define IF_RD_SWAPPER_FB                            0x0123456789ABCDEF
+
+	u64 scheduled_int_ctrl;
+#define SCHED_INT_CTRL_TIMER_EN                BIT(0)
+#define SCHED_INT_CTRL_ONE_SHOT                BIT(1)
+#define SCHED_INT_CTRL_INT2MSI                 TBD
+#define SCHED_INT_PERIOD                       TBD
+
+	u64 txreqtimeout;
+#define TXREQTO_VAL(val)						vBIT(val,0,32)
+#define TXREQTO_EN								BIT(63)
+
+	u64 statsreqtimeout;
+#define STATREQTO_VAL(n)                       TBD
+#define STATREQTO_EN                           BIT(63)
+
+	u64 read_retry_delay;
+	u64 read_retry_acceleration;
+	u64 write_retry_delay;
+	u64 write_retry_acceleration;
+
+	u64 xmsi_control;
+	u64 xmsi_access;
+	u64 xmsi_address;
+	u64 xmsi_data;
+
+	u64 rx_mat;
+
+	u8 unused6[0x8];
+
+	u64 tx_mat0_7;
+	u64 tx_mat8_15;
+	u64 tx_mat16_23;
+	u64 tx_mat24_31;
+	u64 tx_mat32_39;
+	u64 tx_mat40_47;
+	u64 tx_mat48_55;
+	u64 tx_mat56_63;
+
+	u8 unused_1[0x10];
+
+	/* Automated statistics collection */
+	u64 stat_cfg;
+#define STAT_CFG_STAT_EN           BIT(0)
+#define STAT_CFG_ONE_SHOT_EN       BIT(1)
+#define STAT_CFG_STAT_NS_EN        BIT(8)
+#define STAT_CFG_STAT_RO           BIT(9)
+#define STAT_TRSF_PER(n)           TBD
+#define	PER_SEC					   0x208d5
+#define	SET_UPDT_PERIOD(n)		   vBIT((PER_SEC*n),32,32)
+
+	u64 stat_addr;
+
+	/* General Configuration */
+	u64 mdio_control;
+
+	u64 dtx_control;
+
+	u64 i2c_control;
+#define	I2C_CONTROL_DEV_ID(id)		vBIT(id,1,3)
+#define	I2C_CONTROL_ADDR(addr)		vBIT(addr,5,11)
+#define	I2C_CONTROL_BYTE_CNT(cnt)	vBIT(cnt,22,2)
+#define	I2C_CONTROL_READ			BIT(24)
+#define	I2C_CONTROL_NACK			BIT(25)
+#define	I2C_CONTROL_CNTL_START		vBIT(0xE,28,4)
+#define	I2C_CONTROL_CNTL_END(val)	(val & vBIT(0x1,28,4))
+#define	I2C_CONTROL_GET_DATA(val)	(u32)(val & 0xFFFFFFFF)
+#define	I2C_CONTROL_SET_DATA(val)	vBIT(val,32,32)
+
+	u64 gpio_control;
+#define GPIO_CTRL_GPIO_0		BIT(8)
+
+	u8 unused7[0x600];
+
+/* TxDMA registers */
+	u64 txdma_int_status;
+	u64 txdma_int_mask;
+#define TXDMA_PFC_INT                  BIT(0)
+#define TXDMA_TDA_INT                  BIT(1)
+#define TXDMA_PCC_INT                  BIT(2)
+#define TXDMA_TTI_INT                  BIT(3)
+#define TXDMA_LSO_INT                  BIT(4)
+#define TXDMA_TPA_INT                  BIT(5)
+#define TXDMA_SM_INT                   BIT(6)
+	u64 pfc_err_reg;
+	u64 pfc_err_mask;
+	u64 pfc_err_alarm;
+
+	u64 tda_err_reg;
+	u64 tda_err_mask;
+	u64 tda_err_alarm;
+
+	u64 pcc_err_reg;
+	u64 pcc_err_mask;
+	u64 pcc_err_alarm;
+
+	u64 tti_err_reg;
+	u64 tti_err_mask;
+	u64 tti_err_alarm;
+
+	u64 lso_err_reg;
+	u64 lso_err_mask;
+	u64 lso_err_alarm;
+
+	u64 tpa_err_reg;
+	u64 tpa_err_mask;
+	u64 tpa_err_alarm;
+
+	u64 sm_err_reg;
+	u64 sm_err_mask;
+	u64 sm_err_alarm;
+
+	u8 unused8[0x100 - 0xB8];
+
+/* TxDMA arbiter */
+	u64 tx_dma_wrap_stat;
+
+/* Tx FIFO controller */
+#define X_MAX_FIFOS                        8
+#define X_FIFO_MAX_LEN                     0x1FFF	/*8191 */
+	u64 tx_fifo_partition_0;
+#define TX_FIFO_PARTITION_EN               BIT(0)
+#define TX_FIFO_PARTITION_0_PRI(val)       vBIT(val,5,3)
+#define TX_FIFO_PARTITION_0_LEN(val)       vBIT(val,19,13)
+#define TX_FIFO_PARTITION_1_PRI(val)       vBIT(val,37,3)
+#define TX_FIFO_PARTITION_1_LEN(val)       vBIT(val,51,13  )
+
+	u64 tx_fifo_partition_1;
+#define TX_FIFO_PARTITION_2_PRI(val)       vBIT(val,5,3)
+#define TX_FIFO_PARTITION_2_LEN(val)       vBIT(val,19,13)
+#define TX_FIFO_PARTITION_3_PRI(val)       vBIT(val,37,3)
+#define TX_FIFO_PARTITION_3_LEN(val)       vBIT(val,51,13)
+
+	u64 tx_fifo_partition_2;
+#define TX_FIFO_PARTITION_4_PRI(val)       vBIT(val,5,3)
+#define TX_FIFO_PARTITION_4_LEN(val)       vBIT(val,19,13)
+#define TX_FIFO_PARTITION_5_PRI(val)       vBIT(val,37,3)
+#define TX_FIFO_PARTITION_5_LEN(val)       vBIT(val,51,13)
+
+	u64 tx_fifo_partition_3;
+#define TX_FIFO_PARTITION_6_PRI(val)       vBIT(val,5,3)
+#define TX_FIFO_PARTITION_6_LEN(val)       vBIT(val,19,13)
+#define TX_FIFO_PARTITION_7_PRI(val)       vBIT(val,37,3)
+#define TX_FIFO_PARTITION_7_LEN(val)       vBIT(val,51,13)
+
+#define TX_FIFO_PARTITION_PRI_0                 0	/* highest */
+#define TX_FIFO_PARTITION_PRI_1                 1
+#define TX_FIFO_PARTITION_PRI_2                 2
+#define TX_FIFO_PARTITION_PRI_3                 3
+#define TX_FIFO_PARTITION_PRI_4                 4
+#define TX_FIFO_PARTITION_PRI_5                 5
+#define TX_FIFO_PARTITION_PRI_6                 6
+#define TX_FIFO_PARTITION_PRI_7                 7	/* lowest */
+
+	u64 tx_w_round_robin_0;
+	u64 tx_w_round_robin_1;
+	u64 tx_w_round_robin_2;
+	u64 tx_w_round_robin_3;
+	u64 tx_w_round_robin_4;
+
+	u64 tti_command_mem;
+#define TTI_CMD_MEM_WE                     BIT(7)
+#define TTI_CMD_MEM_STROBE_NEW_CMD         BIT(15)
+#define TTI_CMD_MEM_STROBE_BEING_EXECUTED  BIT(15)
+#define TTI_CMD_MEM_OFFSET(n)              vBIT(n,26,6)
+
+	u64 tti_data1_mem;
+#define TTI_DATA1_MEM_TX_TIMER_VAL(n)      vBIT(n,6,26)
+#define TTI_DATA1_MEM_TX_TIMER_AC_CI(n)    vBIT(n,38,2)
+#define TTI_DATA1_MEM_TX_TIMER_AC_EN       BIT(38)
+#define TTI_DATA1_MEM_TX_TIMER_CI_EN       BIT(39)
+#define TTI_DATA1_MEM_TX_URNG_A(n)         vBIT(n,41,7)
+#define TTI_DATA1_MEM_TX_URNG_B(n)         vBIT(n,49,7)
+#define TTI_DATA1_MEM_TX_URNG_C(n)         vBIT(n,57,7)
+
+	u64 tti_data2_mem;
+#define TTI_DATA2_MEM_TX_UFC_A(n)          vBIT(n,0,16)
+#define TTI_DATA2_MEM_TX_UFC_B(n)          vBIT(n,16,16)
+#define TTI_DATA2_MEM_TX_UFC_C(n)          vBIT(n,32,16)
+#define TTI_DATA2_MEM_TX_UFC_D(n)          vBIT(n,48,16)
+
+/* Tx Protocol assist */
+	u64 tx_pa_cfg;
+#define TX_PA_CFG_IGNORE_FRM_ERR           BIT(1)
+#define TX_PA_CFG_IGNORE_SNAP_OUI          BIT(2)
+#define TX_PA_CFG_IGNORE_LLC_CTRL          BIT(3)
+#define	TX_PA_CFG_IGNORE_L2_ERR			   BIT(6)
+
+/* Recent add, used only debug purposes. */
+	u64 pcc_enable;
+
+	u8 unused9[0x700 - 0x178];
+
+	u64 txdma_debug_ctrl;
+
+	u8 unused10[0x1800 - 0x1708];
+
+/* RxDMA Registers */
+	u64 rxdma_int_status;
+	u64 rxdma_int_mask;
+#define RXDMA_INT_RC_INT_M             BIT(0)
+#define RXDMA_INT_RPA_INT_M            BIT(1)
+#define RXDMA_INT_RDA_INT_M            BIT(2)
+#define RXDMA_INT_RTI_INT_M            BIT(3)
+
+	u64 rda_err_reg;
+	u64 rda_err_mask;
+	u64 rda_err_alarm;
+
+	u64 rc_err_reg;
+	u64 rc_err_mask;
+	u64 rc_err_alarm;
+
+	u64 prc_pcix_err_reg;
+	u64 prc_pcix_err_mask;
+	u64 prc_pcix_err_alarm;
+
+	u64 rpa_err_reg;
+	u64 rpa_err_mask;
+	u64 rpa_err_alarm;
+
+	u64 rti_err_reg;
+	u64 rti_err_mask;
+	u64 rti_err_alarm;
+
+	u8 unused11[0x100 - 0x88];
+
+/* DMA arbiter */
+	u64 rx_queue_priority;
+#define RX_QUEUE_0_PRIORITY(val)       vBIT(val,5,3)
+#define RX_QUEUE_1_PRIORITY(val)       vBIT(val,13,3)
+#define RX_QUEUE_2_PRIORITY(val)       vBIT(val,21,3)
+#define RX_QUEUE_3_PRIORITY(val)       vBIT(val,29,3)
+#define RX_QUEUE_4_PRIORITY(val)       vBIT(val,37,3)
+#define RX_QUEUE_5_PRIORITY(val)       vBIT(val,45,3)
+#define RX_QUEUE_6_PRIORITY(val)       vBIT(val,53,3)
+#define RX_QUEUE_7_PRIORITY(val)       vBIT(val,61,3)
+
+#define RX_QUEUE_PRI_0                 0	/* highest */
+#define RX_QUEUE_PRI_1                 1
+#define RX_QUEUE_PRI_2                 2
+#define RX_QUEUE_PRI_3                 3
+#define RX_QUEUE_PRI_4                 4
+#define RX_QUEUE_PRI_5                 5
+#define RX_QUEUE_PRI_6                 6
+#define RX_QUEUE_PRI_7                 7	/* lowest */
+
+	u64 rx_w_round_robin_0;
+	u64 rx_w_round_robin_1;
+	u64 rx_w_round_robin_2;
+	u64 rx_w_round_robin_3;
+	u64 rx_w_round_robin_4;
+
+	/* Per-ring controller regs */
+#define RX_MAX_RINGS                8
+#if 0
+#define RX_MAX_RINGS_SZ             0xFFFF	/* 65536 */
+#define RX_MIN_RINGS_SZ             0x3F	/* 63 */
+#endif
+	u64 prc_rxd0_n[RX_MAX_RINGS];
+	u64 prc_ctrl_n[RX_MAX_RINGS];
+#define PRC_CTRL_RC_ENABLED                    BIT(7)
+#define PRC_CTRL_RING_MODE                     (BIT(14)|BIT(15))
+#define PRC_CTRL_RING_MODE_1                   vBIT(0,14,2)
+#define PRC_CTRL_RING_MODE_3                   vBIT(1,14,2)
+#define PRC_CTRL_RING_MODE_5                   vBIT(2,14,2)
+#define PRC_CTRL_RING_MODE_x                   vBIT(3,14,2)
+#define PRC_CTRL_NO_SNOOP                      (BIT(22)|BIT(23))
+#define PRC_CTRL_NO_SNOOP_DESC                 BIT(22)
+#define PRC_CTRL_NO_SNOOP_BUFF                 BIT(23)
+#define PRC_CTRL_RXD_BACKOFF_INTERVAL(val)     vBIT(val,40,24)
+
+	u64 prc_alarm_action;
+#define PRC_ALARM_ACTION_RR_R0_STOP            BIT(3)
+#define PRC_ALARM_ACTION_RW_R0_STOP            BIT(7)
+#define PRC_ALARM_ACTION_RR_R1_STOP            BIT(11)
+#define PRC_ALARM_ACTION_RW_R1_STOP            BIT(15)
+#define PRC_ALARM_ACTION_RR_R2_STOP            BIT(19)
+#define PRC_ALARM_ACTION_RW_R2_STOP            BIT(23)
+#define PRC_ALARM_ACTION_RR_R3_STOP            BIT(27)
+#define PRC_ALARM_ACTION_RW_R3_STOP            BIT(31)
+#define PRC_ALARM_ACTION_RR_R4_STOP            BIT(35)
+#define PRC_ALARM_ACTION_RW_R4_STOP            BIT(39)
+#define PRC_ALARM_ACTION_RR_R5_STOP            BIT(43)
+#define PRC_ALARM_ACTION_RW_R5_STOP            BIT(47)
+#define PRC_ALARM_ACTION_RR_R6_STOP            BIT(51)
+#define PRC_ALARM_ACTION_RW_R6_STOP            BIT(55)
+#define PRC_ALARM_ACTION_RR_R7_STOP            BIT(59)
+#define PRC_ALARM_ACTION_RW_R7_STOP            BIT(63)
+
+/* Receive traffic interrupts */
+	u64 rti_command_mem;
+#define RTI_CMD_MEM_WE                          BIT(7)
+#define RTI_CMD_MEM_STROBE                      BIT(15)
+#define RTI_CMD_MEM_STROBE_NEW_CMD              BIT(15)
+#define RTI_CMD_MEM_STROBE_CMD_BEING_EXECUTED   BIT(15)
+#define RTI_CMD_MEM_OFFSET(n)                   vBIT(n,29,3)
+
+	u64 rti_data1_mem;
+#define RTI_DATA1_MEM_RX_TIMER_VAL(n)      vBIT(n,3,29)
+#define RTI_DATA1_MEM_RX_TIMER_AC_EN       BIT(38)
+#define RTI_DATA1_MEM_RX_TIMER_CI_EN       BIT(39)
+#define RTI_DATA1_MEM_RX_URNG_A(n)         vBIT(n,41,7)
+#define RTI_DATA1_MEM_RX_URNG_B(n)         vBIT(n,49,7)
+#define RTI_DATA1_MEM_RX_URNG_C(n)         vBIT(n,57,7)
+
+	u64 rti_data2_mem;
+#define RTI_DATA2_MEM_RX_UFC_A(n)          vBIT(n,0,16)
+#define RTI_DATA2_MEM_RX_UFC_B(n)          vBIT(n,16,16)
+#define RTI_DATA2_MEM_RX_UFC_C(n)          vBIT(n,32,16)
+#define RTI_DATA2_MEM_RX_UFC_D(n)          vBIT(n,48,16)
+
+	u64 rx_pa_cfg;
+#define RX_PA_CFG_IGNORE_FRM_ERR           BIT(1)
+#define RX_PA_CFG_IGNORE_SNAP_OUI          BIT(2)
+#define RX_PA_CFG_IGNORE_LLC_CTRL          BIT(3)
+
+	u8 unused12[0x700 - 0x1D8];
+
+	u64 rxdma_debug_ctrl;
+
+	u8 unused13[0x2000 - 0x1f08];
+
+/* Media Access Controller Register */
+	u64 mac_int_status;
+	u64 mac_int_mask;
+#define MAC_INT_STATUS_TMAC_INT            BIT(0)
+#define MAC_INT_STATUS_RMAC_INT            BIT(1)
+
+	u64 mac_tmac_err_reg;
+#define TMAC_ERR_REG_TMAC_ECC_DB_ERR       BIT(15)
+#define TMAC_ERR_REG_TMAC_TX_BUF_OVRN      BIT(23)
+#define TMAC_ERR_REG_TMAC_TX_CRI_ERR       BIT(31)
+	u64 mac_tmac_err_mask;
+	u64 mac_tmac_err_alarm;
+
+	u64 mac_rmac_err_reg;
+#define RMAC_ERR_REG_RX_BUFF_OVRN          BIT(0)
+#define RMAC_ERR_REG_RTS_ECC_DB_ERR        BIT(14)
+#define RMAC_ERR_REG_ECC_DB_ERR            BIT(15)
+#define RMAC_LINK_STATE_CHANGE_INT         BIT(31)
+	u64 mac_rmac_err_mask;
+	u64 mac_rmac_err_alarm;
+
+	u8 unused14[0x100 - 0x40];
+
+	u64 mac_cfg;
+#define MAC_CFG_TMAC_ENABLE             BIT(0)
+#define MAC_CFG_RMAC_ENABLE             BIT(1)
+#define MAC_CFG_LAN_NOT_WAN             BIT(2)
+#define MAC_CFG_TMAC_LOOPBACK           BIT(3)
+#define MAC_CFG_TMAC_APPEND_PAD         BIT(4)
+#define MAC_CFG_RMAC_STRIP_FCS          BIT(5)
+#define MAC_CFG_RMAC_STRIP_PAD          BIT(6)
+#define MAC_CFG_RMAC_PROM_ENABLE        BIT(7)
+#define MAC_RMAC_DISCARD_PFRM           BIT(8)
+#define MAC_RMAC_BCAST_ENABLE           BIT(9)
+#define MAC_RMAC_ALL_ADDR_ENABLE        BIT(10)
+#define MAC_RMAC_INVLD_IPG_THR(val)     vBIT(val,16,8)
+
+	u64 tmac_avg_ipg;
+#define TMAC_AVG_IPG(val)           vBIT(val,0,8)
+
+	u64 rmac_max_pyld_len;
+#define RMAC_MAX_PYLD_LEN(val)      vBIT(val,2,14)
+#define RMAC_MAX_PYLD_LEN_DEF       vBIT(1500,2,14)
+#define RMAC_MAX_PYLD_LEN_JUMBO_DEF vBIT(9600,2,14)
+
+	u64 rmac_err_cfg;
+#define RMAC_ERR_FCS                    BIT(0)
+#define RMAC_ERR_FCS_ACCEPT             BIT(1)
+#define RMAC_ERR_TOO_LONG               BIT(1)
+#define RMAC_ERR_TOO_LONG_ACCEPT        BIT(1)
+#define RMAC_ERR_RUNT                   BIT(2)
+#define RMAC_ERR_RUNT_ACCEPT            BIT(2)
+#define RMAC_ERR_LEN_MISMATCH           BIT(3)
+#define RMAC_ERR_LEN_MISMATCH_ACCEPT    BIT(3)
+
+	u64 rmac_cfg_key;
+#define RMAC_CFG_KEY(val)               vBIT(val,0,16)
+
+#define MAX_MAC_ADDRESSES           16
+#define MAX_MC_ADDRESSES            32	/* Multicast addresses */
+#define MAC_MAC_ADDR_START_OFFSET   0
+#define MAC_MC_ADDR_START_OFFSET    16
+#define MAC_MC_ALL_MC_ADDR_OFFSET   63	/* enables all multicast pkts */
+	u64 rmac_addr_cmd_mem;
+#define RMAC_ADDR_CMD_MEM_WE                    BIT(7)
+#define RMAC_ADDR_CMD_MEM_RD                    0
+#define RMAC_ADDR_CMD_MEM_STROBE_NEW_CMD        BIT(15)
+#define RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING  BIT(15)
+#define RMAC_ADDR_CMD_MEM_OFFSET(n)             vBIT(n,26,6)
+
+	u64 rmac_addr_data0_mem;
+#define RMAC_ADDR_DATA0_MEM_ADDR(n)    vBIT(n,0,48)
+#define RMAC_ADDR_DATA0_MEM_USER       BIT(48)
+
+	u64 rmac_addr_data1_mem;
+#define RMAC_ADDR_DATA1_MEM_MASK(n)    vBIT(n,0,48)
+
+	u8 unused15[0x8];
+
+/*
+        u64 rmac_addr_cfg;
+#define RMAC_ADDR_UCASTn_EN(n)     mBIT(0)_n(n)
+#define RMAC_ADDR_MCASTn_EN(n)     mBIT(0)_n(n)
+#define RMAC_ADDR_BCAST_EN         vBIT(0)_48 
+#define RMAC_ADDR_ALL_ADDR_EN      vBIT(0)_49 
+*/
+	u64 tmac_ipg_cfg;
+
+	u64 rmac_pause_cfg;
+#define RMAC_PAUSE_GEN             BIT(0)
+#define RMAC_PAUSE_GEN_ENABLE      BIT(0)
+#define RMAC_PAUSE_RX              BIT(1)
+#define RMAC_PAUSE_RX_ENABLE       BIT(1)
+#define RMAC_PAUSE_HG_PTIME_DEF    vBIT(0xFFFF,16,16)
+#define RMAC_PAUSE_HG_PTIME(val)    vBIT(val,16,16)
+
+	u64 rmac_red_cfg;
+
+	u64 rmac_red_rate_q0q3;
+	u64 rmac_red_rate_q4q7;
+
+	u64 mac_link_util;
+#define MAC_TX_LINK_UTIL           vBIT(0xFE,1,7)
+#define MAC_TX_LINK_UTIL_DISABLE   vBIT(0xF, 8,4)
+#define MAC_TX_LINK_UTIL_VAL( n )  vBIT(n,8,4)
+#define MAC_RX_LINK_UTIL           vBIT(0xFE,33,7)
+#define MAC_RX_LINK_UTIL_DISABLE   vBIT(0xF,40,4)
+#define MAC_RX_LINK_UTIL_VAL( n )  vBIT(n,40,4)
+
+#define MAC_LINK_UTIL_DISABLE      MAC_TX_LINK_UTIL_DISABLE | \
+                                   MAC_RX_LINK_UTIL_DISABLE
+
+	u64 rmac_invalid_ipg;
+
+/* rx traffic steering */
+#define	MAC_RTS_FRM_LEN_SET(len)	vBIT(len,2,14)
+	u64 rts_frm_len_n[8];
+
+	u64 rts_qos_steering;
+
+#define MAX_DIX_MAP                         4
+	u64 rts_dix_map_n[MAX_DIX_MAP];
+#define RTS_DIX_MAP_ETYPE(val)             vBIT(val,0,16)
+#define RTS_DIX_MAP_SCW(val)               BIT(val,21)
+
+	u64 rts_q_alternates;
+	u64 rts_default_q;
+
+	u64 rts_ctrl;
+#define RTS_CTRL_IGNORE_SNAP_OUI           BIT(2)
+#define RTS_CTRL_IGNORE_LLC_CTRL           BIT(3)
+
+	u64 rts_pn_cam_ctrl;
+#define RTS_PN_CAM_CTRL_WE                 BIT(7)
+#define RTS_PN_CAM_CTRL_STROBE_NEW_CMD     BIT(15)
+#define RTS_PN_CAM_CTRL_STROBE_BEING_EXECUTED   BIT(15)
+#define RTS_PN_CAM_CTRL_OFFSET(n)          vBIT(n,24,8)
+	u64 rts_pn_cam_data;
+#define RTS_PN_CAM_DATA_TCP_SELECT         BIT(7)
+#define RTS_PN_CAM_DATA_PORT(val)          vBIT(val,8,16)
+#define RTS_PN_CAM_DATA_SCW(val)           vBIT(val,24,8)
+
+	u64 rts_ds_mem_ctrl;
+#define RTS_DS_MEM_CTRL_WE                 BIT(7)
+#define RTS_DS_MEM_CTRL_STROBE_NEW_CMD     BIT(15)
+#define RTS_DS_MEM_CTRL_STROBE_CMD_BEING_EXECUTED   BIT(15)
+#define RTS_DS_MEM_CTRL_OFFSET(n)          vBIT(n,26,6)
+	u64 rts_ds_mem_data;
+#define RTS_DS_MEM_DATA(n)                 vBIT(n,0,8)
+
+	u8 unused16[0x700 - 0x220];
+
+	u64 mac_debug_ctrl;
+#define MAC_DBG_ACTIVITY_VALUE		   0x411040400000000ULL
+
+	u8 unused17[0x2800 - 0x2708];
+
+/* memory controller registers */
+	u64 mc_int_status;
+#define MC_INT_STATUS_MC_INT               BIT(0)
+	u64 mc_int_mask;
+#define MC_INT_MASK_MC_INT                 BIT(0)
+
+	u64 mc_err_reg;
+#define MC_ERR_REG_ECC_DB_ERR_L            BIT(14)
+#define MC_ERR_REG_ECC_DB_ERR_U            BIT(15)
+#define MC_ERR_REG_MIRI_CRI_ERR_0          BIT(22)
+#define MC_ERR_REG_MIRI_CRI_ERR_1          BIT(23)
+#define MC_ERR_REG_SM_ERR                  BIT(31)
+	u64 mc_err_mask;
+	u64 mc_err_alarm;
+
+	u8 unused18[0x100 - 0x28];
+
+/* MC configuration */
+	u64 rx_queue_cfg;
+#define RX_QUEUE_CFG_Q0_SZ(n)              vBIT(n,0,8)
+#define RX_QUEUE_CFG_Q1_SZ(n)              vBIT(n,8,8)
+#define RX_QUEUE_CFG_Q2_SZ(n)              vBIT(n,16,8)
+#define RX_QUEUE_CFG_Q3_SZ(n)              vBIT(n,24,8)
+#define RX_QUEUE_CFG_Q4_SZ(n)              vBIT(n,32,8)
+#define RX_QUEUE_CFG_Q5_SZ(n)              vBIT(n,40,8)
+#define RX_QUEUE_CFG_Q6_SZ(n)              vBIT(n,48,8)
+#define RX_QUEUE_CFG_Q7_SZ(n)              vBIT(n,56,8)
+
+	u64 mc_rldram_mrs;
+#define	MC_RLDRAM_QUEUE_SIZE_ENABLE			BIT(39)
+#define	MC_RLDRAM_MRS_ENABLE				BIT(47)
+
+	u64 mc_rldram_interleave;
+
+	u64 mc_pause_thresh_q0q3;
+	u64 mc_pause_thresh_q4q7;
+
+	u64 mc_red_thresh_q[8];
+
+	u8 unused19[0x200 - 0x168];
+	u64 mc_rldram_ref_per;
+	u8 unused20[0x220 - 0x208];
+	u64 mc_rldram_test_ctrl;
+#define MC_RLDRAM_TEST_MODE		BIT(47)
+#define MC_RLDRAM_TEST_WRITE	BIT(7)
+#define MC_RLDRAM_TEST_GO		BIT(15)
+#define MC_RLDRAM_TEST_DONE		BIT(23)
+#define MC_RLDRAM_TEST_PASS		BIT(31)
+
+	u8 unused21[0x240 - 0x228];
+	u64 mc_rldram_test_add;
+	u8 unused22[0x260 - 0x248];
+	u64 mc_rldram_test_d0;
+	u8 unused23[0x280 - 0x268];
+	u64 mc_rldram_test_d1;
+	u8 unused24[0x300 - 0x288];
+	u64 mc_rldram_test_d2;
+	u8 unused25[0x700 - 0x308];
+	u64 mc_debug_ctrl;
+
+	u8 unused26[0x3000 - 0x2f08];
+
+/* XGXG */
+	/* XGXS control registers */
+
+	u64 xgxs_int_status;
+#define XGXS_INT_STATUS_TXGXS              BIT(0)
+#define XGXS_INT_STATUS_RXGXS              BIT(1)
+	u64 xgxs_int_mask;
+#define XGXS_INT_MASK_TXGXS                BIT(0)
+#define XGXS_INT_MASK_RXGXS                BIT(1)
+
+	u64 xgxs_txgxs_err_reg;
+#define TXGXS_ECC_DB_ERR                   BIT(15)
+	u64 xgxs_txgxs_err_mask;
+	u64 xgxs_txgxs_err_alarm;
+
+	u64 xgxs_rxgxs_err_reg;
+	u64 xgxs_rxgxs_err_mask;
+	u64 xgxs_rxgxs_err_alarm;
+
+	u8 unused27[0x100 - 0x40];
+
+	u64 xgxs_cfg;
+	u64 xgxs_status;
+
+	u64 xgxs_cfg_key;
+	u64 xgxs_efifo_cfg;	/* CHANGED */
+	u64 rxgxs_ber_0;	/* CHANGED */
+	u64 rxgxs_ber_1;	/* CHANGED */
+
+} XENA_dev_config_t;
+
+#define XENA_REG_SPACE	sizeof(XENA_dev_config_t)
+#define	XENA_EEPROM_SPACE (0x01 << 11)
+
+#endif				/* _REGS_H */
--- diff/drivers/net/s2io.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/net/s2io.c	2004-04-21 10:45:34.449466384 +0100
@@ -0,0 +1,4396 @@
+/************************************************************************
+ * s2io.c: A Linux PCI-X Ethernet driver for S2IO 10GbE Server NIC
+ * Copyright(c) 2002-2005 S2IO Technologies
+
+ * This software may be used and distributed according to the terms of
+ * the GNU General Public License (GPL), incorporated herein by reference.
+ * Drivers based on or derived from this code fall under the GPL and must
+ * retain the authorship, copyright and license notice.  This file is not
+ * a complete program and may only be used when the entire operating
+ * system is licensed under the GPL.
+ * See the file COPYING in this distribution for more information.
+ *
+ * Credits:
+ * Jeff Garzik		: For pointing out the improper error condition 
+ *			  check in the s2io_xmit routine and also some 
+ * 			  issues in the Tx watch dog function. Also for
+ *			  patiently answering all those innumerable 
+ *			  questions regaring the 2.6 porting issues.
+ * Stephen Hemminger	: Providing proper 2.6 porting mechanism for some
+ *			  macros available only in 2.6 Kernel.
+ * Francois Romieu	: For pointing out all code part that were 
+ *			  deprecated and also styling related comments.
+ * Grant Grundler	: For helping me get rid of some Architecture 
+ *			  dependent code.
+ * Christopher Hellwig	: Some more 2.6 specific issues in the driver.
+ *			  	
+ * The module loadable parameters that are supported by the driver and a brief
+ * explaination of all the variables.
+ * ring_num : This can be used to program the number of receive rings used 
+ * in the driver.  					
+ * frame_len: This is an array of size 8. Using this we can set the maximum 
+ * size of the received frame that can be steered into the corrsponding 
+ * receive ring.
+ * ring_len: This defines the number of descriptors each ring can have. This 
+ * is also an array of size 8.
+ * fifo_num: This defines the number of Tx FIFOs thats used int the driver.
+ * fifo_len: This too is an array of 8. Each element defines the number of 
+ * Tx descriptors that can be associated with each corresponding FIFO.
+ * latency_timer: This input is programmed into the Latency timer register
+ * in PCI Configuration space.
+ ************************************************************************/
+
+#include<linux/config.h>
+#include<linux/module.h>
+#include<linux/types.h>
+#include<linux/errno.h>
+#include<linux/ioport.h>
+#include<linux/pci.h>
+#include<linux/kernel.h>
+#include<linux/netdevice.h>
+#include<linux/etherdevice.h>
+#include<linux/skbuff.h>
+#include<linux/init.h>
+#include<linux/delay.h>
+#include<linux/stddef.h>
+#include<linux/ioctl.h>
+#include<linux/timex.h>
+#include<linux/sched.h>
+#include<linux/ethtool.h>
+#include<asm/system.h>
+#include<asm/uaccess.h>
+#include<linux/version.h>
+#include<asm/io.h>
+#include<linux/workqueue.h>
+
+/* local include */
+#include "s2io.h"
+#include "s2io-regs.h"
+
+/* S2io Driver name & version. */
+static char s2io_driver_name[] = "s2io";
+static char s2io_driver_version[] = "Version 1.0";
+
+#define LINK_IS_UP(val64) (!(val64 & (ADAPTER_STATUS_RMAC_REMOTE_FAULT | \
+				      ADAPTER_STATUS_RMAC_LOCAL_FAULT)))
+#define TASKLET_IN_USE test_and_set_bit(0, \
+				(unsigned long *)(&sp->tasklet_status))
+#define PANIC	1
+#define LOW	2
+static inline int rx_buffer_level(nic_t * sp, int rxb_size, int ring)
+{
+	int level = 0;
+	if ((sp->pkt_cnt[ring] - rxb_size) > 128) {
+		level = LOW;
+		if (rxb_size < sp->pkt_cnt[ring] / 8)
+			level = PANIC;
+	}
+
+	return level;
+}
+
+/* Ethtool related variables and Macros. */
+static char s2io_gstrings[][ETH_GSTRING_LEN] = {
+	"Register test\t(offline)",
+	"Eeprom test\t(offline)",
+	"Link test\t(online)",
+	"RLDRAM test\t(offline)",
+	"BIST Test\t(offline)"
+};
+
+static char ethtool_stats_keys[][ETH_GSTRING_LEN] = {
+	{"tmac_frms"},
+	{"tmac_data_octets"},
+	{"tmac_drop_frms"},
+	{"tmac_mcst_frms"},
+	{"tmac_bcst_frms"},
+	{"tmac_pause_ctrl_frms"},
+	{"tmac_any_err_frms"},
+	{"tmac_vld_ip_octets"},
+	{"tmac_vld_ip"},
+	{"tmac_drop_ip"},
+	{"tmac_icmp"},
+	{"tmac_rst_tcp"},
+	{"tmac_tcp"},
+	{"tmac_udp"},
+	{"rmac_vld_frms"},
+	{"rmac_data_octets"},
+	{"rmac_fcs_err_frms"},
+	{"rmac_drop_frms"},
+	{"rmac_vld_mcst_frms"},
+	{"rmac_vld_bcst_frms"},
+	{"rmac_in_rng_len_err_frms"},
+	{"rmac_long_frms"},
+	{"rmac_pause_ctrl_frms"},
+	{"rmac_discarded_frms"},
+	{"rmac_usized_frms"},
+	{"rmac_osized_frms"},
+	{"rmac_frag_frms"},
+	{"rmac_jabber_frms"},
+	{"rmac_ip"},
+	{"rmac_ip_octets"},
+	{"rmac_hdr_err_ip"},
+	{"rmac_drop_ip"},
+	{"rmac_icmp"},
+	{"rmac_tcp"},
+	{"rmac_udp"},
+	{"rmac_err_drp_udp"},
+	{"rmac_pause_cnt"},
+	{"rmac_accepted_ip"},
+	{"rmac_err_tcp"},
+};
+
+#define S2IO_STAT_LEN sizeof(ethtool_stats_keys)/ ETH_GSTRING_LEN
+#define S2IO_STAT_STRINGS_LEN S2IO_STAT_LEN * ETH_GSTRING_LEN
+
+#define S2IO_TEST_LEN	sizeof(s2io_gstrings) / ETH_GSTRING_LEN
+#define S2IO_STRINGS_LEN	S2IO_TEST_LEN * ETH_GSTRING_LEN
+
+
+/* Constants to be programmed into the Xena's registers to configure
+ * the XAUI.
+ */
+
+#define SWITCH_SIGN	0xA5A5A5A5A5A5A5A5ULL
+#define	END_SIGN	0x0
+
+static u64 default_mdio_cfg[] = {
+	/* Reset PMA PLL */
+	0xC001010000000000ULL, 0xC0010100000000E0ULL,
+	0xC0010100008000E4ULL,
+	/* Remove Reset from PMA PLL */
+	0xC001010000000000ULL, 0xC0010100000000E0ULL,
+	0xC0010100000000E4ULL,
+	END_SIGN
+};
+
+static u64 default_dtx_cfg[] = {
+	0x8000051500000000ULL, 0x80000515000000E0ULL,
+	0x80000515D93500E4ULL, 0x8001051500000000ULL,
+	0x80010515000000E0ULL, 0x80010515001E00E4ULL,
+	0x8002051500000000ULL, 0x80020515000000E0ULL,
+	0x80020515F21000E4ULL,
+	/* Set PADLOOPBACKN */
+	0x8002051500000000ULL, 0x80020515000000E0ULL,
+	0x80020515B20000E4ULL, 0x8003051500000000ULL,
+	0x80030515000000E0ULL, 0x80030515B20000E4ULL,
+	0x8004051500000000ULL, 0x80040515000000E0ULL,
+	0x80040515B20000E4ULL, 0x8005051500000000ULL,
+	0x80050515000000E0ULL, 0x80050515B20000E4ULL,
+	SWITCH_SIGN,
+	/* Remove PADLOOPBACKN */
+	0x8002051500000000ULL, 0x80020515000000E0ULL,
+	0x80020515F20000E4ULL, 0x8003051500000000ULL,
+	0x80030515000000E0ULL, 0x80030515F20000E4ULL,
+	0x8004051500000000ULL, 0x80040515000000E0ULL,
+	0x80040515F20000E4ULL, 0x8005051500000000ULL,
+	0x80050515000000E0ULL, 0x80050515F20000E4ULL,
+	END_SIGN
+};
+
+/* Constants for Fixing the MacAddress problem seen mostly on
+ * Alpha machines.
+ */
+static u64 fix_mac[] = {
+	0x0060000000000000ULL, 0x0060600000000000ULL,
+	0x0040600000000000ULL, 0x0000600000000000ULL,
+	0x0020600000000000ULL, 0x0060600000000000ULL,
+	0x0020600000000000ULL, 0x0060600000000000ULL,
+	0x0020600000000000ULL, 0x0060600000000000ULL,
+	0x0020600000000000ULL, 0x0060600000000000ULL,
+	0x0020600000000000ULL, 0x0060600000000000ULL,
+	0x0020600000000000ULL, 0x0060600000000000ULL,
+	0x0020600000000000ULL, 0x0060600000000000ULL,
+	0x0020600000000000ULL, 0x0060600000000000ULL,
+	0x0020600000000000ULL, 0x0060600000000000ULL,
+	0x0020600000000000ULL, 0x0060600000000000ULL,
+	0x0020600000000000ULL, 0x0000600000000000ULL,
+	0x0040600000000000ULL, 0x0060600000000000ULL,
+	END_SIGN
+};
+
+
+/* Module Loadable parameters. */
+static u32 ring_num;
+static u32 frame_len[MAX_RX_RINGS];
+static u32 ring_len[MAX_RX_RINGS];
+static u32 fifo_num;
+static u32 fifo_len[MAX_TX_FIFOS];
+static u32 rx_prio;
+static u32 tx_prio;
+static u8 latency_timer = 0;
+
+/* 
+ * S2IO device table.
+ * This table lists all the devices that this driver supports. 
+ */
+static struct pci_device_id s2io_tbl[] __devinitdata = {
+	{PCI_VENDOR_ID_S2IO, PCI_DEVICE_ID_S2IO_WIN,
+	 PCI_ANY_ID, PCI_ANY_ID},
+	{PCI_VENDOR_ID_S2IO, PCI_DEVICE_ID_S2IO_UNI,
+	 PCI_ANY_ID, PCI_ANY_ID},
+	{0,}
+};
+
+MODULE_DEVICE_TABLE(pci, s2io_tbl);
+
+static struct pci_driver s2io_driver = {
+      name:"S2IO",
+      id_table:s2io_tbl,
+      probe:s2io_init_nic,
+      remove:s2io_rem_nic,
+};
+
+/*  
+ *  Input Arguments: 
+ *  Device private variable.
+ *  Return Value: 
+ *  SUCCESS on success and an appropriate -ve value on failure.
+ *  Description: 
+ *  The function allocates the all memory areas shared 
+ *  between the NIC and the driver. This includes Tx descriptors, 
+ *  Rx descriptors and the statistics block.
+ */
+static int initSharedMem(struct s2io_nic *nic)
+{
+	u32 size;
+	void *tmp_v_addr, *tmp_v_addr_next;
+	dma_addr_t tmp_p_addr, tmp_p_addr_next;
+	RxD_block_t *pre_rxd_blk = NULL;
+	int i, j, blk_cnt;
+	struct net_device *dev = nic->dev;
+
+	mac_info_t *mac_control;
+	struct config_param *config;
+
+	mac_control = &nic->mac_control;
+	config = &nic->config;
+
+
+	/* Allocation and initialization of TXDLs in FIOFs */
+	size = 0;
+	for (i = 0; i < config->TxFIFONum; i++) {
+		size += config->TxCfg[i].FifoLen;
+	}
+	if (size > MAX_AVAILABLE_TXDS) {
+		DBG_PRINT(ERR_DBG, "%s: Total number of Tx FIFOs ",
+			  dev->name);
+		DBG_PRINT(ERR_DBG, "exceeds the maximum value ");
+		DBG_PRINT(ERR_DBG, "that can be used\n");
+		return FAILURE;
+	}
+	size *= (sizeof(TxD_t) * config->MaxTxDs);
+
+	mac_control->txd_list_mem = pci_alloc_consistent
+	    (nic->pdev, size, &mac_control->txd_list_mem_phy);
+	if (!mac_control->txd_list_mem) {
+		return -ENOMEM;
+	}
+	mac_control->txd_list_mem_sz = size;
+
+	tmp_v_addr = mac_control->txd_list_mem;
+	tmp_p_addr = mac_control->txd_list_mem_phy;
+	memset(tmp_v_addr, 0, size);
+
+	DBG_PRINT(INIT_DBG, "%s:List Mem PHY: 0x%llx\n", dev->name,
+		  (unsigned long long) tmp_p_addr);
+
+	for (i = 0; i < config->TxFIFONum; i++) {
+		mac_control->txdl_start_phy[i] = tmp_p_addr;
+		mac_control->txdl_start[i] = (TxD_t *) tmp_v_addr;
+		mac_control->tx_curr_put_info[i].offset = 0;
+		mac_control->tx_curr_put_info[i].fifo_len =
+		    config->TxCfg[i].FifoLen - 1;
+		mac_control->tx_curr_get_info[i].offset = 0;
+		mac_control->tx_curr_get_info[i].fifo_len =
+		    config->TxCfg[i].FifoLen - 1;
+
+		tmp_p_addr +=
+		    (config->TxCfg[i].FifoLen * (sizeof(TxD_t)) *
+		     config->MaxTxDs);
+		tmp_v_addr +=
+		    (config->TxCfg[i].FifoLen * (sizeof(TxD_t)) *
+		     config->MaxTxDs);
+	}
+
+	/* Allocation and initialization of RXDs in Rings */
+	size = 0;
+	for (i = 0; i < config->RxRingNum; i++) {
+		if (config->RxCfg[i].NumRxd % (MAX_RXDS_PER_BLOCK + 1)) {
+			DBG_PRINT(ERR_DBG, "%s: RxD count of ", dev->name);
+			DBG_PRINT(ERR_DBG, "Ring%d is not a multiple of ",
+				  i);
+			DBG_PRINT(ERR_DBG, "RxDs per Block");
+			return FAILURE;
+		}
+		size += config->RxCfg[i].NumRxd;
+		nic->block_count[i] =
+		    config->RxCfg[i].NumRxd / (MAX_RXDS_PER_BLOCK + 1);
+		nic->pkt_cnt[i] =
+		    config->RxCfg[i].NumRxd - nic->block_count[i];
+	}
+	size = (size * (sizeof(RxD_t)));
+	mac_control->rxd_ring_mem_sz = size;
+
+	for (i = 0; i < config->RxRingNum; i++) {
+		mac_control->rx_curr_get_info[i].block_index = 0;
+		mac_control->rx_curr_get_info[i].offset = 0;
+		mac_control->rx_curr_get_info[i].ring_len =
+		    config->RxCfg[i].NumRxd - 1;
+		mac_control->rx_curr_put_info[i].block_index = 0;
+		mac_control->rx_curr_put_info[i].offset = 0;
+		mac_control->rx_curr_put_info[i].ring_len =
+		    config->RxCfg[i].NumRxd - 1;
+		blk_cnt =
+		    config->RxCfg[i].NumRxd / (MAX_RXDS_PER_BLOCK + 1);
+		/*  Allocating all the Rx blocks */
+		for (j = 0; j < blk_cnt; j++) {
+			size = (MAX_RXDS_PER_BLOCK + 1) * (sizeof(RxD_t));
+			tmp_v_addr = pci_alloc_consistent(nic->pdev, size,
+							  &tmp_p_addr);
+			if (tmp_v_addr == NULL) {
+				/* In case of failure, freeSharedMem() 
+				 * is called, which should free any 
+				 * memory that was alloced till the 
+				 * failure happened.
+				 */
+				nic->rx_blocks[i][j].block_virt_addr =
+				    tmp_v_addr;
+				return -ENOMEM;
+			}
+			memset(tmp_v_addr, 0, size);
+			nic->rx_blocks[i][j].block_virt_addr = tmp_v_addr;
+			nic->rx_blocks[i][j].block_dma_addr = tmp_p_addr;
+		}
+		/* Interlinking all Rx Blocks */
+		for (j = 0; j < blk_cnt; j++) {
+			tmp_v_addr = nic->rx_blocks[i][j].block_virt_addr;
+			tmp_v_addr_next =
+			    nic->rx_blocks[i][(j + 1) %
+					      blk_cnt].block_virt_addr;
+			tmp_p_addr = nic->rx_blocks[i][j].block_dma_addr;
+			tmp_p_addr_next =
+			    nic->rx_blocks[i][(j + 1) %
+					      blk_cnt].block_dma_addr;
+
+			pre_rxd_blk = (RxD_block_t *) tmp_v_addr;
+			pre_rxd_blk->reserved_1 = END_OF_BLOCK;	/* last RxD 
+								 * marker.
+								 */
+			pre_rxd_blk->reserved_2_pNext_RxD_block =
+			    (unsigned long) tmp_v_addr_next;
+			pre_rxd_blk->pNext_RxD_Blk_physical =
+			    (u64) tmp_p_addr_next;
+		}
+	}
+
+	/* Allocation and initialization of Statistics block */
+	size = sizeof(StatInfo_t);
+	mac_control->stats_mem = pci_alloc_consistent
+	    (nic->pdev, size, &mac_control->stats_mem_phy);
+
+	if (!mac_control->stats_mem) {
+		/* In case of failure, freeSharedMem() is called, which 
+		 * should free any memory that was alloced till the 
+		 * failure happened.
+		 */
+		return -ENOMEM;
+	}
+	mac_control->stats_mem_sz = size;
+
+	tmp_v_addr = mac_control->stats_mem;
+	mac_control->StatsInfo = (StatInfo_t *) tmp_v_addr;
+	memset(tmp_v_addr, 0, size);
+
+	DBG_PRINT(INIT_DBG, "%s:Ring Mem PHY: 0x%llx\n", dev->name,
+		  (unsigned long long) tmp_p_addr);
+
+	return SUCCESS;
+}
+
+/*  
+ *  Input Arguments: 
+ *  Device peivate variable.
+ *  Return Value: 
+ *  NONE
+ *  Description: 
+ *  This function is to free all memory locations allocated by
+ *  the initSharedMem() function and return it to the kernel.
+ */
+static void freeSharedMem(struct s2io_nic *nic)
+{
+	int i, j, blk_cnt, size;
+	void *tmp_v_addr;
+	dma_addr_t tmp_p_addr;
+	mac_info_t *mac_control;
+	struct config_param *config;
+
+
+	if (!nic)
+		return;
+
+	mac_control = &nic->mac_control;
+	config = &nic->config;
+
+	if (mac_control->txd_list_mem) {
+		pci_free_consistent(nic->pdev,
+				    mac_control->txd_list_mem_sz,
+				    mac_control->txd_list_mem,
+				    mac_control->txd_list_mem_phy);
+	}
+
+	size = (MAX_RXDS_PER_BLOCK + 1) * (sizeof(RxD_t));
+	for (i = 0; i < config->RxRingNum; i++) {
+		blk_cnt = nic->block_count[i];
+		for (j = 0; j < blk_cnt; j++) {
+			tmp_v_addr = nic->rx_blocks[i][j].block_virt_addr;
+			tmp_p_addr = nic->rx_blocks[i][j].block_dma_addr;
+			if (tmp_v_addr == NULL)
+				break;
+			pci_free_consistent(nic->pdev, size,
+					    tmp_v_addr, tmp_p_addr);
+		}
+	}
+
+	if (mac_control->stats_mem) {
+		pci_free_consistent(nic->pdev,
+				    mac_control->stats_mem_sz,
+				    mac_control->stats_mem,
+				    mac_control->stats_mem_phy);
+	}
+}
+
+/*  
+ *  Input Arguments: 
+ *  device peivate variable
+ *  Return Value: 
+ *  SUCCESS on success and '-1' on failure (endian settings incorrect).
+ *  Description: 
+ *  The function sequentially configures every block 
+ *  of the H/W from their reset values. 
+ */
+static int initNic(struct s2io_nic *nic)
+{
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0;
+	struct net_device *dev = nic->dev;
+	register u64 val64 = 0;
+	void *add;
+	u32 time;
+	int i, j;
+	mac_info_t *mac_control;
+	struct config_param *config;
+	int mdio_cnt = 0, dtx_cnt = 0;
+	unsigned long long print_var, mem_share;
+
+	mac_control = &nic->mac_control;
+	config = &nic->config;
+
+	/*  Set proper endian settings and verify the same by 
+	 *  reading the PIF Feed-back register.
+	 */
+#ifdef  __BIG_ENDIAN
+	/* The device by default set to a big endian format, so 
+	 * a big endian driver need not set anything.
+	 */
+	writeq(0xffffffffffffffffULL, &bar0->swapper_ctrl);
+	val64 = (SWAPPER_CTRL_PIF_R_FE |
+		 SWAPPER_CTRL_PIF_R_SE |
+		 SWAPPER_CTRL_PIF_W_FE |
+		 SWAPPER_CTRL_PIF_W_SE |
+		 SWAPPER_CTRL_TXP_FE |
+		 SWAPPER_CTRL_TXP_SE |
+		 SWAPPER_CTRL_TXD_R_FE |
+		 SWAPPER_CTRL_TXD_W_FE |
+		 SWAPPER_CTRL_TXF_R_FE |
+		 SWAPPER_CTRL_RXD_R_FE |
+		 SWAPPER_CTRL_RXD_W_FE |
+		 SWAPPER_CTRL_RXF_W_FE |
+		 SWAPPER_CTRL_XMSI_FE |
+		 SWAPPER_CTRL_XMSI_SE |
+		 SWAPPER_CTRL_STATS_FE | SWAPPER_CTRL_STATS_SE);
+	writeq(val64, &bar0->swapper_ctrl);
+#else
+	/* Initially we enable all bits to make it accessible by 
+	 * the driver, then we selectively enable only those bits 
+	 * that we want to set.
+	 */
+	writeq(0xffffffffffffffffULL, &bar0->swapper_ctrl);
+	val64 = (SWAPPER_CTRL_PIF_R_FE |
+		 SWAPPER_CTRL_PIF_R_SE |
+		 SWAPPER_CTRL_PIF_W_FE |
+		 SWAPPER_CTRL_PIF_W_SE |
+		 SWAPPER_CTRL_TXP_FE |
+		 SWAPPER_CTRL_TXP_SE |
+		 SWAPPER_CTRL_TXD_R_FE |
+		 SWAPPER_CTRL_TXD_R_SE |
+		 SWAPPER_CTRL_TXD_W_FE |
+		 SWAPPER_CTRL_TXD_W_SE |
+		 SWAPPER_CTRL_TXF_R_FE |
+		 SWAPPER_CTRL_RXD_R_FE |
+		 SWAPPER_CTRL_RXD_R_SE |
+		 SWAPPER_CTRL_RXD_W_FE |
+		 SWAPPER_CTRL_RXD_W_SE |
+		 SWAPPER_CTRL_RXF_W_FE |
+		 SWAPPER_CTRL_XMSI_FE |
+		 SWAPPER_CTRL_XMSI_SE |
+		 SWAPPER_CTRL_STATS_FE | SWAPPER_CTRL_STATS_SE);
+	writeq(val64, &bar0->swapper_ctrl);
+#endif
+
+	/* Verifying if endian settings are accurate by reading 
+	 * a feedback register.
+	 */
+	val64 = readq(&bar0->pif_rd_swapper_fb);
+	if (val64 != 0x0123456789ABCDEFULL) {
+		/* Endian settings are incorrect, calls for another dekko. */
+		print_var = (unsigned long long) val64;
+		DBG_PRINT(INIT_DBG, "%s: Endian settings are wrong",
+			  dev->name);
+		DBG_PRINT(ERR_DBG, ", feedback read %llx\n", print_var);
+
+		return FAILURE;
+	}
+
+	/* Remove XGXS from reset state */
+	val64 = 0;
+	writeq(val64, &bar0->sw_reset);
+	val64 = readq(&bar0->sw_reset);
+	set_current_state(TASK_UNINTERRUPTIBLE);
+	schedule_timeout(HZ / 2);
+
+	/*  Enable Receiving broadcasts */
+	val64 = readq(&bar0->mac_cfg);
+	val64 |= MAC_RMAC_BCAST_ENABLE;
+	writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key);
+	writeq(val64, &bar0->mac_cfg);
+
+	/* Read registers in all blocks */
+	val64 = readq(&bar0->mac_int_mask);
+	val64 = readq(&bar0->mc_int_mask);
+	val64 = readq(&bar0->xgxs_int_mask);
+
+	/*  Set MTU */
+	val64 = dev->mtu;
+	writeq(vBIT(val64, 2, 14), &bar0->rmac_max_pyld_len);
+
+	/* Configuring the XAUI Interface of Xena. 
+	 *****************************************
+	 * To Configure the Xena's XAUI, one has to write a series 
+	 * of 64 bit values into two registers in a particular 
+	 * sequence. Hence a macro 'SWITCH_SIGN' has been defined 
+	 * which will be defined in the array of configuration values 
+	 * (default_dtx_cfg & default_mdio_cfg) at appropriate places 
+	 * to switch writing from one regsiter to another. We continue 
+	 * writing these values until we encounter the 'END_SIGN' macro.
+	 * For example, After making a series of 21 writes into 
+	 * dtx_control register the 'SWITCH_SIGN' appears and hence we 
+	 * start writing into mdio_control until we encounter END_SIGN.
+	 */
+	while (1) {
+	      dtx_cfg:
+		while (default_dtx_cfg[dtx_cnt] != END_SIGN) {
+			if (default_dtx_cfg[dtx_cnt] == SWITCH_SIGN) {
+				dtx_cnt++;
+				goto mdio_cfg;
+			}
+			writeq(default_dtx_cfg[dtx_cnt],
+			       &bar0->dtx_control);
+			val64 = readq(&bar0->dtx_control);
+			dtx_cnt++;
+		}
+	      mdio_cfg:
+		while (default_mdio_cfg[mdio_cnt] != END_SIGN) {
+			if (default_mdio_cfg[mdio_cnt] == SWITCH_SIGN) {
+				mdio_cnt++;
+				goto dtx_cfg;
+			}
+			writeq(default_mdio_cfg[mdio_cnt],
+			       &bar0->mdio_control);
+			val64 = readq(&bar0->mdio_control);
+			mdio_cnt++;
+		}
+		if ((default_dtx_cfg[dtx_cnt] == END_SIGN) &&
+		    (default_mdio_cfg[mdio_cnt] == END_SIGN)) {
+			break;
+		} else {
+			goto dtx_cfg;
+		}
+	}
+
+	/*  Tx DMA Initialization */
+	val64 = 0;
+	writeq(val64, &bar0->tx_fifo_partition_0);
+	writeq(val64, &bar0->tx_fifo_partition_1);
+	writeq(val64, &bar0->tx_fifo_partition_2);
+	writeq(val64, &bar0->tx_fifo_partition_3);
+
+
+	for (i = 0, j = 0; i < config->TxFIFONum; i++) {
+		val64 |=
+		    vBIT(config->TxCfg[i].FifoLen - 1, ((i * 32) + 19),
+			 13) | vBIT(config->TxCfg[i].FifoPriority,
+				    ((i * 32) + 5), 3);
+
+		if (i == (config->TxFIFONum - 1)) {
+			if (i % 2 == 0)
+				i++;
+		}
+
+		switch (i) {
+		case 1:
+			writeq(val64, &bar0->tx_fifo_partition_0);
+			val64 = 0;
+			break;
+		case 3:
+			writeq(val64, &bar0->tx_fifo_partition_1);
+			val64 = 0;
+			break;
+		case 5:
+			writeq(val64, &bar0->tx_fifo_partition_2);
+			val64 = 0;
+			break;
+		case 7:
+			writeq(val64, &bar0->tx_fifo_partition_3);
+			break;
+		}
+	}
+
+	/* Enable Tx FIFO partition 0. */
+	val64 = readq(&bar0->tx_fifo_partition_0);
+	val64 |= BIT(0);	/* To enable the FIFO partition. */
+	writeq(val64, &bar0->tx_fifo_partition_0);
+
+	val64 = readq(&bar0->tx_fifo_partition_0);
+	DBG_PRINT(INIT_DBG, "Fifo partition at: 0x%p is: 0x%llx\n",
+		  &bar0->tx_fifo_partition_0, (unsigned long long) val64);
+
+	/* 
+	 * Initialization of Tx_PA_CONFIG register to ignore packet 
+	 * integrity checking.
+	 */
+	val64 = readq(&bar0->tx_pa_cfg);
+	val64 |= TX_PA_CFG_IGNORE_FRM_ERR | TX_PA_CFG_IGNORE_SNAP_OUI |
+	    TX_PA_CFG_IGNORE_LLC_CTRL | TX_PA_CFG_IGNORE_L2_ERR;
+	writeq(val64, &bar0->tx_pa_cfg);
+
+	/* Rx DMA intialization. */
+	val64 = 0;
+	for (i = 0; i < config->RxRingNum; i++) {
+		val64 |=
+		    vBIT(config->RxCfg[i].RingPriority, (5 + (i * 8)), 3);
+	}
+	writeq(val64, &bar0->rx_queue_priority);
+
+	/* Allocating equal share of memory to all the configured 
+	 * Rings.
+	 */
+	val64 = 0;
+	for (i = 0; i < config->RxRingNum; i++) {
+		switch (i) {
+		case 0:
+			mem_share = (64 / config->RxRingNum +
+				     64 % config->RxRingNum);
+			val64 |= RX_QUEUE_CFG_Q0_SZ(mem_share);
+			continue;
+		case 1:
+			mem_share = (64 / config->RxRingNum);
+			val64 |= RX_QUEUE_CFG_Q1_SZ(mem_share);
+			continue;
+		case 2:
+			mem_share = (64 / config->RxRingNum);
+			val64 |= RX_QUEUE_CFG_Q2_SZ(mem_share);
+			continue;
+		case 3:
+			mem_share = (64 / config->RxRingNum);
+			val64 |= RX_QUEUE_CFG_Q3_SZ(mem_share);
+			continue;
+		case 4:
+			mem_share = (64 / config->RxRingNum);
+			val64 |= RX_QUEUE_CFG_Q4_SZ(mem_share);
+			continue;
+		case 5:
+			mem_share = (64 / config->RxRingNum);
+			val64 |= RX_QUEUE_CFG_Q5_SZ(mem_share);
+			continue;
+		case 6:
+			mem_share = (64 / config->RxRingNum);
+			val64 |= RX_QUEUE_CFG_Q6_SZ(mem_share);
+			continue;
+		case 7:
+			mem_share = (64 / config->RxRingNum);
+			val64 |= RX_QUEUE_CFG_Q7_SZ(mem_share);
+			continue;
+		}
+	}
+	writeq(val64, &bar0->rx_queue_cfg);
+
+	/* Initializing the Tx round robin registers to 0.
+	 * Filling Tx and Rx round robin registers as per the 
+	 * number of FIFOs and Rings is still TODO.
+	 */
+	writeq(0, &bar0->tx_w_round_robin_0);
+	writeq(0, &bar0->tx_w_round_robin_1);
+	writeq(0, &bar0->tx_w_round_robin_2);
+	writeq(0, &bar0->tx_w_round_robin_3);
+	writeq(0, &bar0->tx_w_round_robin_4);
+
+	/* Disable Rx steering. Hard coding all packets be steered to
+	 * Queue 0 for now. 
+	 * TODO*/
+	if (rx_prio) {
+		u64 def = 0x8000000000000000ULL, tmp;
+		for (i = 0; i < MAX_RX_RINGS; i++) {
+			tmp = (u64) (def >> (i % config->RxRingNum));
+			val64 |= (u64) (tmp >> (i * 8));
+		}
+		writeq(val64, &bar0->rts_qos_steering);
+	} else {
+		val64 = 0x8080808080808080ULL;
+		writeq(val64, &bar0->rts_qos_steering);
+	}
+
+	/* UDP Fix */
+	val64 = 0;
+	for (i = 1; i < 8; i++)
+		writeq(val64, &bar0->rts_frm_len_n[i]);
+
+	/* Set rts_frm_len register for fifo 0 */
+	writeq(MAC_RTS_FRM_LEN_SET(dev->mtu + 22),
+	       &bar0->rts_frm_len_n[0]);
+
+	/* Enable statistics */
+	writeq(mac_control->stats_mem_phy, &bar0->stat_addr);
+	val64 = SET_UPDT_PERIOD(8) | STAT_CFG_STAT_RO | STAT_CFG_STAT_EN;
+	writeq(val64, &bar0->stat_cfg);
+
+	/* Initializing the sampling rate for the device to calculate the
+	 * bandwidth utilization.
+	 */
+	val64 = MAC_TX_LINK_UTIL_VAL(0x5) | MAC_RX_LINK_UTIL_VAL(0x5);
+	writeq(val64, &bar0->mac_link_util);
+
+
+	/* Initializing the Transmit and Receive Traffic Interrupt 
+	 * Scheme.
+	 */
+	/* TTI Initialization */
+	val64 = TTI_DATA1_MEM_TX_TIMER_VAL(0xFFF) |
+	    TTI_DATA1_MEM_TX_URNG_A(0xA) | TTI_DATA1_MEM_TX_URNG_B(0x10) |
+	    TTI_DATA1_MEM_TX_URNG_C(0x30) | TTI_DATA1_MEM_TX_TIMER_AC_EN;
+	writeq(val64, &bar0->tti_data1_mem);
+
+	val64 =
+	    TTI_DATA2_MEM_TX_UFC_A(0x10) | TTI_DATA2_MEM_TX_UFC_B(0x20) |
+	    TTI_DATA2_MEM_TX_UFC_C(0x40) | TTI_DATA2_MEM_TX_UFC_D(0x80);
+	writeq(val64, &bar0->tti_data2_mem);
+
+	val64 = TTI_CMD_MEM_WE | TTI_CMD_MEM_STROBE_NEW_CMD;
+	writeq(val64, &bar0->tti_command_mem);
+
+	/* Once the operation completes, the Strobe bit of the command
+	 * register will be reset. We poll for this particular condition
+	 * We wait for a maximum of 500ms for the operation to complete,
+	 * if it's not complete by then we return error.
+	 */
+	time = 0;
+	while (TRUE) {
+		val64 = readq(&bar0->tti_command_mem);
+		if (!(val64 & TTI_CMD_MEM_STROBE_NEW_CMD)) {
+			break;
+		}
+		if (time > 10) {
+			DBG_PRINT(ERR_DBG, "%s: TTI init Failed\n",
+				  dev->name);
+			return -1;
+		}
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(HZ / 20);
+		time++;
+	}
+
+	/* RTI Initialization */
+	val64 = RTI_DATA1_MEM_RX_TIMER_VAL(0xFFF) |
+	    RTI_DATA1_MEM_RX_URNG_A(0xA) | RTI_DATA1_MEM_RX_URNG_B(0x10) |
+	    RTI_DATA1_MEM_RX_URNG_C(0x30) | RTI_DATA1_MEM_RX_TIMER_AC_EN;
+	writeq(val64, &bar0->rti_data1_mem);
+
+	val64 = RTI_DATA2_MEM_RX_UFC_A(0x1) | RTI_DATA2_MEM_RX_UFC_B(0x2) |
+	    RTI_DATA2_MEM_RX_UFC_C(0x40) | RTI_DATA2_MEM_RX_UFC_D(0x80);
+	writeq(val64, &bar0->rti_data2_mem);
+
+	val64 = RTI_CMD_MEM_WE | RTI_CMD_MEM_STROBE_NEW_CMD;
+	writeq(val64, &bar0->rti_command_mem);
+
+	/* Once the operation completes, the Strobe bit of the command
+	 * register will be reset. We poll for this particular condition
+	 * We wait for a maximum of 500ms for the operation to complete,
+	 * if it's not complete by then we return error.
+	 */
+	time = 0;
+	while (TRUE) {
+		val64 = readq(&bar0->rti_command_mem);
+		if (!(val64 & TTI_CMD_MEM_STROBE_NEW_CMD)) {
+			break;
+		}
+		if (time > 10) {
+			DBG_PRINT(ERR_DBG, "%s: RTI init Failed\n",
+				  dev->name);
+			return -1;
+		}
+		time++;
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(HZ / 20);
+	}
+
+	/* Initializing proper values as Pause threshold into all 
+	 * the 8 Queues on Rx side.
+	 */
+	writeq(0xffbbffbbffbbffbbULL, &bar0->mc_pause_thresh_q0q3);
+	writeq(0xffbbffbbffbbffbbULL, &bar0->mc_pause_thresh_q4q7);
+
+	/* Disable RMAC PAD STRIPPING */
+	add = (void *) &bar0->mac_cfg;
+	val64 = readq(&bar0->mac_cfg);
+	val64 &= ~(MAC_CFG_RMAC_STRIP_PAD);
+	writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key);
+	writel((u32) (val64), add);
+	writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key);
+	writel((u32) (val64 >> 32), (add + 4));
+	val64 = readq(&bar0->mac_cfg);
+
+	return SUCCESS;
+}
+
+/*  
+ *  Input Arguments: 
+ *  device private variable,
+ *  A mask indicating which Intr block must be modified and,
+ *  A flag indicating whether to enable or disable the Intrs.
+ *  Return Value: 
+ *  NONE.
+ *  Description: 
+ *  This function will either disable or enable the interrupts 
+ *  depending on the flag argument. The mask argument can be used to 
+ *  enable/disable any Intr block. 
+ */
+static void en_dis_able_NicIntrs(struct s2io_nic *nic, u16 mask, int flag)
+{
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0;
+	register u64 val64 = 0, temp64 = 0;
+
+	/*  Top level interrupt classification */
+	/*  PIC Interrupts */
+	if ((mask & (TX_PIC_INTR | RX_PIC_INTR))) {
+		/*  Enable PIC Intrs in the general intr mask register */
+		val64 = TXPIC_INT_M | PIC_RX_INT_M;
+		if (flag == ENABLE_INTRS) {
+			temp64 = readq(&bar0->general_int_mask);
+			temp64 &= ~((u64) val64);
+			writeq(temp64, &bar0->general_int_mask);
+			/*  Disabled all PCIX, Flash, MDIO, IIC and GPIO
+			 *  interrupts for now. 
+			 * TODO */
+			writeq(DISABLE_ALL_INTRS, &bar0->pic_int_mask);
+			/*  No MSI Support is available presently, so TTI and
+			 * RTI interrupts are also disabled.
+			 */
+		} else if (flag == DISABLE_INTRS) {
+			/*  Disable PIC Intrs in the general intr mask register 
+			 */
+			writeq(DISABLE_ALL_INTRS, &bar0->pic_int_mask);
+			temp64 = readq(&bar0->general_int_mask);
+			val64 |= temp64;
+			writeq(val64, &bar0->general_int_mask);
+		}
+	}
+
+	/*  DMA Interrupts */
+	/*  Enabling/Disabling Tx DMA interrupts */
+	if (mask & TX_DMA_INTR) {
+		/*  Enable TxDMA Intrs in the general intr mask register */
+		val64 = TXDMA_INT_M;
+		if (flag == ENABLE_INTRS) {
+			temp64 = readq(&bar0->general_int_mask);
+			temp64 &= ~((u64) val64);
+			writeq(temp64, &bar0->general_int_mask);
+			/* Disable all interrupts other than PFC interrupt in 
+			 * DMA level.
+			 */
+			val64 = DISABLE_ALL_INTRS & (~TXDMA_PFC_INT_M);
+			writeq(val64, &bar0->txdma_int_mask);
+			/* Enable only the MISC error 1 interrupt in PFC block 
+			 */
+			val64 = DISABLE_ALL_INTRS & (~PFC_MISC_ERR_1);
+			writeq(val64, &bar0->pfc_err_mask);
+		} else if (flag == DISABLE_INTRS) {
+			/*  Disable TxDMA Intrs in the general intr mask 
+			 *  register */
+			writeq(DISABLE_ALL_INTRS, &bar0->txdma_int_mask);
+			writeq(DISABLE_ALL_INTRS, &bar0->pfc_err_mask);
+			temp64 = readq(&bar0->general_int_mask);
+			val64 |= temp64;
+			writeq(val64, &bar0->general_int_mask);
+		}
+	}
+
+	/*  Enabling/Disabling Rx DMA interrupts */
+	if (mask & RX_DMA_INTR) {
+		/*  Enable RxDMA Intrs in the general intr mask register */
+		val64 = RXDMA_INT_M;
+		if (flag == ENABLE_INTRS) {
+			temp64 = readq(&bar0->general_int_mask);
+			temp64 &= ~((u64) val64);
+			writeq(temp64, &bar0->general_int_mask);
+			/* All RxDMA block interrupts are disabled for now 
+			 * TODO */
+			writeq(DISABLE_ALL_INTRS, &bar0->rxdma_int_mask);
+		} else if (flag == DISABLE_INTRS) {
+			/*  Disable RxDMA Intrs in the general intr mask 
+			 *  register */
+			writeq(DISABLE_ALL_INTRS, &bar0->rxdma_int_mask);
+			temp64 = readq(&bar0->general_int_mask);
+			val64 |= temp64;
+			writeq(val64, &bar0->general_int_mask);
+		}
+	}
+
+	/*  MAC Interrupts */
+	/*  Enabling/Disabling MAC interrupts */
+	if (mask & (TX_MAC_INTR | RX_MAC_INTR)) {
+		val64 = TXMAC_INT_M | RXMAC_INT_M;
+		if (flag == ENABLE_INTRS) {
+			temp64 = readq(&bar0->general_int_mask);
+			temp64 &= ~((u64) val64);
+			writeq(temp64, &bar0->general_int_mask);
+			/* All MAC block error interrupts are disabled for now 
+			 * except the link status change interrupt.
+			 * TODO*/
+			val64 = MAC_INT_STATUS_RMAC_INT;
+			temp64 = readq(&bar0->mac_int_mask);
+			temp64 &= ~((u64) val64);
+			writeq(temp64, &bar0->mac_int_mask);
+
+			val64 = readq(&bar0->mac_rmac_err_mask);
+			val64 &= ~((u64) RMAC_LINK_STATE_CHANGE_INT);
+			writeq(val64, &bar0->mac_rmac_err_mask);
+		} else if (flag == DISABLE_INTRS) {
+			/*  Disable MAC Intrs in the general intr mask register 
+			 */
+			writeq(DISABLE_ALL_INTRS, &bar0->mac_int_mask);
+			writeq(DISABLE_ALL_INTRS,
+			       &bar0->mac_rmac_err_mask);
+
+			temp64 = readq(&bar0->general_int_mask);
+			val64 |= temp64;
+			writeq(val64, &bar0->general_int_mask);
+		}
+	}
+
+	/*  XGXS Interrupts */
+	if (mask & (TX_XGXS_INTR | RX_XGXS_INTR)) {
+		val64 = TXXGXS_INT_M | RXXGXS_INT_M;
+		if (flag == ENABLE_INTRS) {
+			temp64 = readq(&bar0->general_int_mask);
+			temp64 &= ~((u64) val64);
+			writeq(temp64, &bar0->general_int_mask);
+			/* All XGXS block error interrupts are disabled for now
+			 *  TODO */
+			writeq(DISABLE_ALL_INTRS, &bar0->xgxs_int_mask);
+		} else if (flag == DISABLE_INTRS) {
+			/*  Disable MC Intrs in the general intr mask register 
+			 */
+			writeq(DISABLE_ALL_INTRS, &bar0->xgxs_int_mask);
+			temp64 = readq(&bar0->general_int_mask);
+			val64 |= temp64;
+			writeq(val64, &bar0->general_int_mask);
+		}
+	}
+
+	/*  Memory Controller(MC) interrupts */
+	if (mask & MC_INTR) {
+		val64 = MC_INT_M;
+		if (flag == ENABLE_INTRS) {
+			temp64 = readq(&bar0->general_int_mask);
+			temp64 &= ~((u64) val64);
+			writeq(temp64, &bar0->general_int_mask);
+			/* All MC block error interrupts are disabled for now
+			 * TODO */
+			writeq(DISABLE_ALL_INTRS, &bar0->mc_int_mask);
+		} else if (flag == DISABLE_INTRS) {
+			/*  Disable MC Intrs in the general intr mask register
+			 */
+			writeq(DISABLE_ALL_INTRS, &bar0->mc_int_mask);
+			temp64 = readq(&bar0->general_int_mask);
+			val64 |= temp64;
+			writeq(val64, &bar0->general_int_mask);
+		}
+	}
+
+
+	/*  Tx traffic interrupts */
+	if (mask & TX_TRAFFIC_INTR) {
+		val64 = TXTRAFFIC_INT_M;
+		if (flag == ENABLE_INTRS) {
+			temp64 = readq(&bar0->general_int_mask);
+			temp64 &= ~((u64) val64);
+			writeq(temp64, &bar0->general_int_mask);
+			/* Enable all the Tx side interrupts */
+			writeq(0x0, &bar0->tx_traffic_mask);	/* '0' Enables 
+								 * all 64 TX 
+								 * interrupt 
+								 * levels.
+								 */
+		} else if (flag == DISABLE_INTRS) {
+			/*  Disable Tx Traffic Intrs in the general intr mask 
+			 *  register.
+			 */
+			writeq(DISABLE_ALL_INTRS, &bar0->tx_traffic_mask);
+			temp64 = readq(&bar0->general_int_mask);
+			val64 |= temp64;
+			writeq(val64, &bar0->general_int_mask);
+		}
+	}
+
+	/*  Rx traffic interrupts */
+	if (mask & RX_TRAFFIC_INTR) {
+		val64 = RXTRAFFIC_INT_M;
+		if (flag == ENABLE_INTRS) {
+			temp64 = readq(&bar0->general_int_mask);
+			temp64 &= ~((u64) val64);
+			writeq(temp64, &bar0->general_int_mask);
+			writeq(0x0, &bar0->rx_traffic_mask);	/* '0' Enables 
+								 * all 8 RX 
+								 * interrupt 
+								 * levels.
+								 */
+		} else if (flag == DISABLE_INTRS) {
+			/*  Disable Rx Traffic Intrs in the general intr mask 
+			 *  register.
+			 */
+			writeq(DISABLE_ALL_INTRS, &bar0->rx_traffic_mask);
+			temp64 = readq(&bar0->general_int_mask);
+			val64 |= temp64;
+			writeq(val64, &bar0->general_int_mask);
+		}
+	}
+}
+
+/*  
+ *  Input Arguments: 
+ *   val64 - Value read from adapter status register.
+ *   flag - indicates if the adapter enable bit was ever written once before.
+ *  Return Value: 
+ *   void.
+ *  Description: 
+ *   Returns whether the H/W is ready to go or not. Depending on whether 
+ *   adapter enable bit was written or not the comparison differs and the 
+ *   calling function passes the input argument flag to indicate this.
+ */
+static int verify_xena_quiescence(u64 val64, int flag)
+{
+	int ret = 0;
+	u64 tmp64 = ~((u64) val64);
+
+	if (!
+	    (tmp64 &
+	     (ADAPTER_STATUS_TDMA_READY | ADAPTER_STATUS_RDMA_READY |
+	      ADAPTER_STATUS_PFC_READY | ADAPTER_STATUS_TMAC_BUF_EMPTY |
+	      ADAPTER_STATUS_PIC_QUIESCENT | ADAPTER_STATUS_MC_DRAM_READY |
+	      ADAPTER_STATUS_MC_QUEUES_READY | ADAPTER_STATUS_M_PLL_LOCK |
+	      ADAPTER_STATUS_P_PLL_LOCK))) {
+		if (flag == FALSE) {
+			if (!(val64 & ADAPTER_STATUS_RMAC_PCC_IDLE) &&
+			    ((val64 & ADAPTER_STATUS_RC_PRC_QUIESCENT) ==
+			     ADAPTER_STATUS_RC_PRC_QUIESCENT)) {
+
+				ret = 1;
+
+			}
+		} else {
+			if (((val64 & ADAPTER_STATUS_RMAC_PCC_IDLE) ==
+			     ADAPTER_STATUS_RMAC_PCC_IDLE) &&
+			    (!(val64 & ADAPTER_STATUS_RC_PRC_QUIESCENT) ||
+			     ((val64 & ADAPTER_STATUS_RC_PRC_QUIESCENT) ==
+			      ADAPTER_STATUS_RC_PRC_QUIESCENT))) {
+
+				ret = 1;
+
+			}
+		}
+	}
+
+	return ret;
+}
+
+/* 
+ * New procedure to clear mac address reading  problems on Alpha platforms
+ *
+ */
+void FixMacAddress(nic_t * sp)
+{
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0;
+	u64 val64;
+	int i = 0;
+
+	while (fix_mac[i] != END_SIGN) {
+		writeq(fix_mac[i++], &bar0->gpio_control);
+		val64 = readq(&bar0->gpio_control);
+	}
+}
+
+/*  
+ *  Input Arguments: 
+ *  device private variable.
+ *  Return Value: 
+ *  SUCCESS on success and -1 on failure.
+ *  Description: 
+ *  This function actually turns the device on. Before this 
+ *  function is called, all Registers are configured from their reset states 
+ *  and shared memory is allocated but the NIC is still quiescent. On 
+ *  calling this function, the device interrupts are cleared and the NIC is
+ *  literally switched on by writing into the adapter control register.
+ */
+static int startNic(struct s2io_nic *nic)
+{
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0;
+	struct net_device *dev = nic->dev;
+	register u64 val64 = 0;
+	u16 interruptible, i;
+	u16 subid;
+	mac_info_t *mac_control;
+	struct config_param *config;
+
+	mac_control = &nic->mac_control;
+	config = &nic->config;
+
+	/*  PRC Initialization and configuration */
+	for (i = 0; i < config->RxRingNum; i++) {
+		writeq((u64) nic->rx_blocks[i][0].block_dma_addr,
+		       &bar0->prc_rxd0_n[i]);
+
+		val64 = readq(&bar0->prc_ctrl_n[i]);
+		val64 |= PRC_CTRL_RC_ENABLED;
+		writeq(val64, &bar0->prc_ctrl_n[i]);
+	}
+
+	/* Enabling MC-RLDRAM. After enabling the device, we timeout
+	 * for around 100ms, which is approximately the time required
+	 * for the device to be ready for operation.
+	 */
+	val64 = readq(&bar0->mc_rldram_mrs);
+	val64 |= MC_RLDRAM_QUEUE_SIZE_ENABLE | MC_RLDRAM_MRS_ENABLE;
+	writeq(val64, &bar0->mc_rldram_mrs);
+	val64 = readq(&bar0->mc_rldram_mrs);
+
+	set_current_state(TASK_UNINTERRUPTIBLE);
+	schedule_timeout(HZ / 10);	/* Delay by around 100 ms. */
+
+	/* Enabling ECC Protection. */
+	val64 = readq(&bar0->adapter_control);
+	val64 &= ~ADAPTER_ECC_EN;
+	writeq(val64, &bar0->adapter_control);
+
+	/* Clearing any possible Link state change interrupts that 
+	 * could have popped up just before Enabling the card.
+	 */
+	val64 = readq(&bar0->mac_rmac_err_reg);
+	if (val64)
+		writeq(val64, &bar0->mac_rmac_err_reg);
+
+	/* Verify if the device is ready to be enabled, if so enable 
+	 * it.
+	 */
+	val64 = readq(&bar0->adapter_status);
+	if (!verify_xena_quiescence(val64, nic->device_enabled_once)) {
+		DBG_PRINT(ERR_DBG, "%s: device is not ready, ", dev->name);
+		DBG_PRINT(ERR_DBG, "Adapter status reads: 0x%llx\n",
+			  (unsigned long long) val64);
+		return FAILURE;
+	}
+
+	/*  Enable select interrupts */
+	interruptible = TX_TRAFFIC_INTR | RX_TRAFFIC_INTR | TX_MAC_INTR |
+	    RX_MAC_INTR;
+	en_dis_able_NicIntrs(nic, interruptible, ENABLE_INTRS);
+
+	/* With some switches, link might be already up at this point.
+	 * Because of this weird behavior, when we enable laser, 
+	 * we may not get link. We need to handle this. We cannot 
+	 * figure out which switch is misbehaving. So we are forced to 
+	 * make a global change. 
+	 */
+
+	/* Enabling Laser. */
+	val64 = readq(&bar0->adapter_control);
+	val64 |= ADAPTER_EOI_TX_ON;
+	writeq(val64, &bar0->adapter_control);
+
+	/* SXE-002: Initialize link and activity LED */
+	subid = nic->pdev->subsystem_device;
+	if ((subid & 0xFF) >= 0x07) {
+		val64 = readq(&bar0->gpio_control);
+		val64 |= 0x0000800000000000ULL;
+		writeq(val64, &bar0->gpio_control);
+		val64 = 0x0411040400000000ULL;
+		writeq(val64, (void *) ((u8 *) bar0 + 0x2700));
+	}
+
+	/* 
+	 * Here we are performing soft reset on XGXS to 
+	 * force link down. Since link is already up, we will get
+	 * link state change interrupt after this reset
+	 */
+	writeq(0x8007051500000000ULL, &bar0->dtx_control);
+	val64 = readq(&bar0->dtx_control);
+	writeq(0x80070515000000E0ULL, &bar0->dtx_control);
+	val64 = readq(&bar0->dtx_control);
+	writeq(0x80070515001F00E4ULL, &bar0->dtx_control);
+	val64 = readq(&bar0->dtx_control);
+
+	return SUCCESS;
+}
+
+/*  
+ *  Input Arguments: 
+ *   nic - device private variable.
+ *  Return Value: 
+ *   void.
+ *  Description: 
+ *   Free all queued Tx buffers.
+ */
+void freeTxBuffers(struct s2io_nic *nic)
+{
+	struct net_device *dev = nic->dev;
+	struct sk_buff *skb;
+	TxD_t *txdp;
+	int i, j;
+#if DEBUG_ON
+	int cnt = 0;
+#endif
+	mac_info_t *mac_control;
+	struct config_param *config;
+
+	mac_control = &nic->mac_control;
+	config = &nic->config;
+
+	for (i = 0; i < config->TxFIFONum; i++) {
+		for (j = 0; j < config->TxCfg[i].FifoLen - 1; j++) {
+			txdp = mac_control->txdl_start[i] +
+			    (config->MaxTxDs * j);
+
+			if (!(txdp->Control_1 & TXD_LIST_OWN_XENA)) {
+				/* If owned by host, ignore */
+				continue;
+			}
+			skb =
+			    (struct sk_buff *) ((unsigned long) txdp->
+						Host_Control);
+			if (skb == NULL) {
+				DBG_PRINT(ERR_DBG, "%s: NULL skb ",
+					  dev->name);
+				DBG_PRINT(ERR_DBG, "in Tx Int\n");
+				return;
+			}
+#if DEBUG_ON
+			cnt++;
+#endif
+			dev_kfree_skb(skb);
+			memset(txdp, 0, sizeof(TxD_t));
+		}
+#if DEBUG_ON
+		DBG_PRINT(INTR_DBG,
+			  "%s:forcibly freeing %d skbs on FIFO%d\n",
+			  dev->name, cnt, i);
+#endif
+	}
+}
+
+/*  
+ *  Input Arguments: 
+ *   nic - device private variable.
+ *  Return Value: 
+ *   void.
+ *  Description: 
+ *   This function does exactly the opposite of what the startNic() 
+ *   function does. This function is called to stop 
+ *   the device.
+ */
+static void stopNic(struct s2io_nic *nic)
+{
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0;
+	register u64 val64 = 0;
+	u16 interruptible, i;
+	mac_info_t *mac_control;
+	struct config_param *config;
+
+	mac_control = &nic->mac_control;
+	config = &nic->config;
+
+/*  Disable all interrupts */
+	interruptible = TX_TRAFFIC_INTR | RX_TRAFFIC_INTR | TX_MAC_INTR |
+	    RX_MAC_INTR;
+	en_dis_able_NicIntrs(nic, interruptible, DISABLE_INTRS);
+
+/*  Disable PRCs */
+	for (i = 0; i < config->RxRingNum; i++) {
+		val64 = readq(&bar0->prc_ctrl_n[i]);
+		val64 &= ~((u64) PRC_CTRL_RC_ENABLED);
+		writeq(val64, &bar0->prc_ctrl_n[i]);
+	}
+}
+
+/*  
+ *  Input Arguments: 
+ *  device private variable
+ *  Return Value: 
+ *  SUCCESS on success or an appropriate -ve value on failure.
+ *  Description: 
+ *  The function allocates Rx side skbs and puts the physical
+ *  address of these buffers into the RxD buffer pointers, so that the NIC
+ *  can DMA the received frame into these locations.
+ *  The NIC supports 3 receive modes, viz
+ *  1. single buffer,
+ *  2. three buffer and
+ *  3. Five buffer modes.
+ *  Each mode defines how many fragments the received frame will be split 
+ *  up into by the NIC. The frame is split into L3 header, L4 Header, 
+ *  L4 payload in three buffer mode and in 5 buffer mode, L4 payload itself 
+ *  is split into 3 fragments. As of now only single buffer mode is supported.
+ */
+int fill_rx_buffers(struct s2io_nic *nic, int ring_no)
+{
+	struct net_device *dev = nic->dev;
+	struct sk_buff *skb;
+	RxD_t *rxdp;
+	int off, off1, size, block_no, block_no1;
+	int offset, offset1;
+	u32 alloc_tab = 0;
+	u32 alloc_cnt = nic->pkt_cnt[ring_no] -
+	    atomic_read(&nic->rx_bufs_left[ring_no]);
+	mac_info_t *mac_control;
+	struct config_param *config;
+
+	mac_control = &nic->mac_control;
+	config = &nic->config;
+
+	if (frame_len[ring_no]) {
+		if (frame_len[ring_no] > dev->mtu)
+			dev->mtu = frame_len[ring_no];
+		size = frame_len[ring_no] + HEADER_ETHERNET_II_802_3_SIZE +
+		    HEADER_802_2_SIZE + HEADER_SNAP_SIZE;
+	} else {
+		size = dev->mtu + HEADER_ETHERNET_II_802_3_SIZE +
+		    HEADER_802_2_SIZE + HEADER_SNAP_SIZE;
+	}
+
+	while (alloc_tab < alloc_cnt) {
+		block_no = mac_control->rx_curr_put_info[ring_no].
+		    block_index;
+		block_no1 = mac_control->rx_curr_get_info[ring_no].
+		    block_index;
+		off = mac_control->rx_curr_put_info[ring_no].offset;
+		off1 = mac_control->rx_curr_get_info[ring_no].offset;
+		offset = block_no * (MAX_RXDS_PER_BLOCK + 1) + off;
+		offset1 = block_no1 * (MAX_RXDS_PER_BLOCK + 1) + off1;
+
+		rxdp = nic->rx_blocks[ring_no][block_no].
+		    block_virt_addr + off;
+		if ((offset == offset1) && (rxdp->Host_Control)) {
+			DBG_PRINT(INTR_DBG, "%s: Get and Put", dev->name);
+			DBG_PRINT(INTR_DBG, " info equated\n");
+			goto end;
+		}
+
+		if (rxdp->Control_1 == END_OF_BLOCK) {
+			mac_control->rx_curr_put_info[ring_no].
+			    block_index++;
+			mac_control->rx_curr_put_info[ring_no].
+			    block_index %= nic->block_count[ring_no];
+			block_no = mac_control->rx_curr_put_info
+			    [ring_no].block_index;
+			off++;
+			off %= (MAX_RXDS_PER_BLOCK + 1);
+			mac_control->rx_curr_put_info[ring_no].offset =
+			    off;
+			/*rxdp = nic->rx_blocks[ring_no][block_no].
+			   block_virt_addr + off; */
+			rxdp = (RxD_t *) ((unsigned long) rxdp->Control_2);
+			DBG_PRINT(INTR_DBG, "%s: Next block at: %p\n",
+				  dev->name, rxdp);
+		}
+
+		if (rxdp->Control_1 & RXD_OWN_XENA) {
+			mac_control->rx_curr_put_info[ring_no].
+			    offset = off;
+			goto end;
+		}
+
+		skb = dev_alloc_skb(size + HEADER_ALIGN_LAYER_3);
+		if (!skb) {
+			DBG_PRINT(ERR_DBG, "%s: Out of ", dev->name);
+			DBG_PRINT(ERR_DBG, "memory to allocate SKBs\n");
+			return -ENOMEM;
+		}
+		skb_reserve(skb, HEADER_ALIGN_LAYER_3);
+		memset(rxdp, 0, sizeof(RxD_t));
+		rxdp->Buffer0_ptr = pci_map_single
+		    (nic->pdev, skb->data, size, PCI_DMA_FROMDEVICE);
+		rxdp->Control_2 &= (~MASK_BUFFER0_SIZE);
+		rxdp->Control_2 |= SET_BUFFER0_SIZE(size);
+		rxdp->Host_Control = (unsigned long) (skb);
+		rxdp->Control_1 |= RXD_OWN_XENA;
+		off++;
+		off %= (MAX_RXDS_PER_BLOCK + 1);
+		mac_control->rx_curr_put_info[ring_no].offset = off;
+		atomic_inc(&nic->rx_bufs_left[ring_no]);
+		alloc_tab++;
+	}
+
+      end:
+	return SUCCESS;
+}
+
+/*  
+ *  Input Arguments: 
+ *  device private variable.
+ *  Return Value: 
+ *  NONE.
+ *  Description: 
+ *  This function will free all Rx buffers allocated by host.
+ */
+static void freeRxBuffers(struct s2io_nic *sp)
+{
+	struct net_device *dev = sp->dev;
+	int i, j, blk = 0, off, buf_cnt = 0;
+	RxD_t *rxdp;
+	struct sk_buff *skb;
+	mac_info_t *mac_control;
+	struct config_param *config;
+
+	mac_control = &sp->mac_control;
+	config = &sp->config;
+
+	for (i = 0; i < config->RxRingNum; i++) {
+		for (j = 0, blk = 0; j < config->RxCfg[i].NumRxd; j++) {
+			off = j % (MAX_RXDS_PER_BLOCK + 1);
+			rxdp = sp->rx_blocks[i][blk].block_virt_addr + off;
+
+			if (rxdp->Control_1 == END_OF_BLOCK) {
+				rxdp =
+				    (RxD_t *) ((unsigned long) rxdp->
+					       Control_2);
+				j++;
+				blk++;
+			}
+
+			skb =
+			    (struct sk_buff *) ((unsigned long) rxdp->
+						Host_Control);
+			if (skb) {
+				pci_unmap_single(sp->pdev, (dma_addr_t)
+						 rxdp->Buffer0_ptr,
+						 dev->mtu +
+						 HEADER_ETHERNET_II_802_3_SIZE
+						 + HEADER_802_2_SIZE +
+						 HEADER_SNAP_SIZE,
+						 PCI_DMA_FROMDEVICE);
+				dev_kfree_skb(skb);
+				atomic_dec(&sp->rx_bufs_left[i]);
+				buf_cnt++;
+			}
+			memset(rxdp, 0, sizeof(RxD_t));
+		}
+		mac_control->rx_curr_put_info[i].block_index = 0;
+		mac_control->rx_curr_get_info[i].block_index = 0;
+		mac_control->rx_curr_put_info[i].offset = 0;
+		mac_control->rx_curr_get_info[i].offset = 0;
+		atomic_set(&sp->rx_bufs_left[i], 0);
+		DBG_PRINT(INIT_DBG, "%s:Freed 0x%x Rx Buffers on ring%d\n",
+			  dev->name, buf_cnt, i);
+	}
+}
+
+/*
+ *  Input Argument: 
+ *   dev - pointer to the device structure.
+ *   budget - The number of packets that were budgeted to be processed during
+ *   one pass through the 'Poll" function.
+ *  Return value:
+ *   0 on success and 1 if there are No Rx packets to be processed.
+ *  Description:
+ *   Comes into picture only if NAPI support has been incorporated. It does
+ *   the same thing that rxIntrHandler does, but not in a interrupt context
+ *   also It will process only a given number of packets.
+ */
+#ifdef CONFIG_S2IO_NAPI
+static int s2io_poll(struct net_device *dev, int *budget)
+{
+	nic_t *nic = dev->priv;
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0;
+	int pkts_to_process = *budget, pkt_cnt = 0;
+	register u64 val64 = 0;
+	rx_curr_get_info_t offset_info;
+	int i, block_no;
+	u16 val16, cksum;
+	struct sk_buff *skb;
+	RxD_t *rxdp;
+	mac_info_t *mac_control;
+	struct config_param *config;
+
+	mac_control = &nic->mac_control;
+	config = &nic->config;
+
+	if (pkts_to_process > dev->quota)
+		pkts_to_process = dev->quota;
+
+	val64 = readq(&bar0->rx_traffic_int);
+	writeq(val64, &bar0->rx_traffic_int);
+
+	for (i = 0; i < config->RxRingNum; i++) {
+		if (--pkts_to_process < 0) {
+			goto no_rx;
+		}
+		offset_info = mac_control->rx_curr_get_info[i];
+		block_no = offset_info.block_index;
+		rxdp = nic->rx_blocks[i][block_no].block_virt_addr +
+		    offset_info.offset;
+		while (!(rxdp->Control_1 & RXD_OWN_XENA)) {
+			if (rxdp->Control_1 == END_OF_BLOCK) {
+				rxdp =
+				    (RxD_t *) ((unsigned long) rxdp->
+					       Control_2);
+				offset_info.offset++;
+				offset_info.offset %=
+				    (MAX_RXDS_PER_BLOCK + 1);
+				block_no++;
+				block_no %= nic->block_count[i];
+				mac_control->rx_curr_get_info[i].
+				    offset = offset_info.offset;
+				mac_control->rx_curr_get_info[i].
+				    block_index = block_no;
+				continue;
+			}
+			skb =
+			    (struct sk_buff *) ((unsigned long) rxdp->
+						Host_Control);
+			if (skb == NULL) {
+				DBG_PRINT(ERR_DBG, "%s: The skb is ",
+					  dev->name);
+				DBG_PRINT(ERR_DBG, "Null in Rx Intr\n");
+				return 0;
+			}
+			val64 = RXD_GET_BUFFER0_SIZE(rxdp->Control_2);
+			val16 = (u16) (val64 >> 48);
+			cksum = RXD_GET_L4_CKSUM(rxdp->Control_1);
+			pci_unmap_single(nic->pdev, (dma_addr_t)
+					 rxdp->Buffer0_ptr,
+					 dev->mtu +
+					 HEADER_ETHERNET_II_802_3_SIZE +
+					 HEADER_802_2_SIZE +
+					 HEADER_SNAP_SIZE,
+					 PCI_DMA_FROMDEVICE);
+			rxOsmHandler(nic, val16, rxdp, i);
+			pkt_cnt++;
+			offset_info.offset++;
+			offset_info.offset %= (MAX_RXDS_PER_BLOCK + 1);
+			rxdp =
+			    nic->rx_blocks[i][block_no].block_virt_addr +
+			    offset_info.offset;
+			mac_control->rx_curr_get_info[i].offset =
+			    offset_info.offset;
+		}
+	}
+	if (!pkt_cnt)
+		pkt_cnt = 1;
+
+	for (i = 0; i < config->RxRingNum; i++)
+		fill_rx_buffers(nic, i);
+
+	dev->quota -= pkt_cnt;
+	*budget -= pkt_cnt;
+	netif_rx_complete(dev);
+
+/* Re enable the Rx interrupts. */
+	en_dis_able_NicIntrs(nic, RX_TRAFFIC_INTR, ENABLE_INTRS);
+	return 0;
+
+      no_rx:
+	for (i = 0; i < config->RxRingNum; i++)
+		fill_rx_buffers(nic, i);
+	dev->quota -= pkt_cnt;
+	*budget -= pkt_cnt;
+	return 1;
+}
+#else
+/*  
+ *  Input Arguments: 
+ *  device private variable.
+ *  Return Value: 
+ *  NONE.
+ *  Description: 
+ * If the interrupt is because of a received frame or if the 
+ *  receive ring contains fresh as yet un-processed frames, this function is
+ *  called. It picks out the RxD at which place the last Rx processing had 
+ *  stopped and sends the skb to the OSM's Rx handler and then increments 
+ *  the offset.
+ */
+static void rxIntrHandler(struct s2io_nic *nic)
+{
+	struct net_device *dev = (struct net_device *) nic->dev;
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0;
+	rx_curr_get_info_t offset_info;
+	RxD_t *rxdp;
+	struct sk_buff *skb;
+	u16 val16, cksum;
+	register u64 val64 = 0;
+	int i, block_no;
+	mac_info_t *mac_control;
+	struct config_param *config;
+
+	mac_control = &nic->mac_control;
+	config = &nic->config;
+
+#if DEBUG_ON
+	nic->rxint_cnt++;
+#endif
+
+/* rx_traffic_int reg is an R1 register, hence we read and write back 
+ * the samevalue in the register to clear it.
+ */
+	val64 = readq(&bar0->rx_traffic_int);
+	writeq(val64, &bar0->rx_traffic_int);
+
+	for (i = 0; i < config->RxRingNum; i++) {
+		offset_info = mac_control->rx_curr_get_info[i];
+		block_no = offset_info.block_index;
+		rxdp = nic->rx_blocks[i][block_no].block_virt_addr +
+		    offset_info.offset;
+		while (!(rxdp->Control_1 & RXD_OWN_XENA)) {
+			if (rxdp->Control_1 == END_OF_BLOCK) {
+				rxdp = (RxD_t *) ((unsigned long)
+						  rxdp->Control_2);
+				offset_info.offset++;
+				offset_info.offset %=
+				    (MAX_RXDS_PER_BLOCK + 1);
+				block_no++;
+				block_no %= nic->block_count[i];
+				mac_control->rx_curr_get_info[i].
+				    offset = offset_info.offset;
+				mac_control->rx_curr_get_info[i].
+				    block_index = block_no;
+				continue;
+			}
+			skb = (struct sk_buff *) ((unsigned long)
+						  rxdp->Host_Control);
+			if (skb == NULL) {
+				DBG_PRINT(ERR_DBG, "%s: The skb is ",
+					  dev->name);
+				DBG_PRINT(ERR_DBG, "Null in Rx Intr\n");
+				return;
+			}
+			val64 = RXD_GET_BUFFER0_SIZE(rxdp->Control_2);
+			val16 = (u16) (val64 >> 48);
+			cksum = RXD_GET_L4_CKSUM(rxdp->Control_1);
+			pci_unmap_single(nic->pdev, (dma_addr_t)
+					 rxdp->Buffer0_ptr,
+					 dev->mtu +
+					 HEADER_ETHERNET_II_802_3_SIZE +
+					 HEADER_802_2_SIZE +
+					 HEADER_SNAP_SIZE,
+					 PCI_DMA_FROMDEVICE);
+			rxOsmHandler(nic, val16, rxdp, i);
+			offset_info.offset++;
+			offset_info.offset %= (MAX_RXDS_PER_BLOCK + 1);
+			rxdp =
+			    nic->rx_blocks[i][block_no].block_virt_addr +
+			    offset_info.offset;
+			mac_control->rx_curr_get_info[i].offset =
+			    offset_info.offset;
+		}
+	}
+}
+#endif
+
+/*  
+ *  Input Arguments: 
+ *  device private variable
+ *  Return Value: 
+ *  NONE
+ *  Description: 
+ *  If an interrupt was raised to indicate DMA complete of the 
+ *  Tx packet, this function is called. It identifies the last TxD whose buffer
+ *  was freed and frees all skbs whose data have already DMA'ed into the NICs
+ *  internal memory.
+ */
+static void txIntrHandler(struct s2io_nic *nic)
+{
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0;
+	struct net_device *dev = (struct net_device *) nic->dev;
+	tx_curr_get_info_t offset_info, offset_info1;
+	struct sk_buff *skb;
+	TxD_t *txdlp;
+	register u64 val64 = 0;
+	int i;
+	u16 j, frg_cnt;
+	mac_info_t *mac_control;
+	struct config_param *config;
+#if DEBUG_ON
+	int cnt = 0;
+	nic->txint_cnt++;
+#endif
+
+	mac_control = &nic->mac_control;
+	config = &nic->config;
+
+	/* tx_traffic_int reg is an R1 register, hence we read and write 
+	 * back the samevalue in the register to clear it.
+	 */
+	val64 = readq(&bar0->tx_traffic_int);
+	writeq(val64, &bar0->tx_traffic_int);
+
+	for (i = 0; i < config->TxFIFONum; i++) {
+		offset_info = mac_control->tx_curr_get_info[i];
+		offset_info1 = mac_control->tx_curr_put_info[i];
+		txdlp = mac_control->txdl_start[i] +
+		    (config->MaxTxDs * offset_info.offset);
+		while ((!(txdlp->Control_1 & TXD_LIST_OWN_XENA)) &&
+		       (offset_info.offset != offset_info1.offset) &&
+		       (txdlp->Host_Control)) {
+			/* Check for TxD errors */
+			if (txdlp->Control_1 & TXD_T_CODE) {
+				unsigned long long err;
+				err = txdlp->Control_1 & TXD_T_CODE;
+				DBG_PRINT(ERR_DBG, "***TxD error %llx\n",
+					  err);
+			}
+
+			skb = (struct sk_buff *) ((unsigned long)
+						  txdlp->Host_Control);
+			if (skb == NULL) {
+				DBG_PRINT(ERR_DBG, "%s: Null skb ",
+					  dev->name);
+				DBG_PRINT(ERR_DBG, "in Tx Free Intr\n");
+				return;
+			}
+			nic->tx_pkt_count++;
+
+			frg_cnt = skb_shinfo(skb)->nr_frags;
+
+			/*  For unfragmented skb */
+			pci_unmap_single(nic->pdev, (dma_addr_t)
+					 txdlp->Buffer_Pointer,
+					 skb->len - skb->data_len,
+					 PCI_DMA_TODEVICE);
+			if (frg_cnt) {
+				TxD_t *temp = txdlp;
+				txdlp++;
+				for (j = 0; j < frg_cnt; j++, txdlp++) {
+					skb_frag_t *frag =
+					    &skb_shinfo(skb)->frags[j];
+					pci_unmap_page(nic->pdev,
+						       (dma_addr_t)
+						       txdlp->
+						       Buffer_Pointer,
+						       frag->size,
+						       PCI_DMA_TODEVICE);
+				}
+				txdlp = temp;
+			}
+			memset(txdlp, 0,
+			       (sizeof(TxD_t) * config->MaxTxDs));
+
+			/* Updating the statistics block */
+			nic->stats.tx_packets++;
+			nic->stats.tx_bytes += skb->len;
+#if DEBUG_ON
+			nic->txpkt_bytes += skb->len;
+			cnt++;
+#endif
+			dev_kfree_skb_irq(skb);
+
+			offset_info.offset++;
+			offset_info.offset %= offset_info.fifo_len + 1;
+			txdlp = mac_control->txdl_start[i] +
+			    (config->MaxTxDs * offset_info.offset);
+			mac_control->tx_curr_get_info[i].offset =
+			    offset_info.offset;
+		}
+#if DEBUG_ON
+		DBG_PRINT(INTR_DBG, "%s: freed %d Tx Pkts\n", dev->name,
+			  cnt);
+#endif
+	}
+
+	spin_lock(&nic->tx_lock);
+	if (netif_queue_stopped(dev))
+		netif_wake_queue(dev);
+	spin_unlock(&nic->tx_lock);
+}
+
+/*  
+ *  Input Arguments: 
+ *  device private variable
+ *  Return Value: 
+ *  NONE
+ *  Description: 
+ *  If the interrupt was neither because of Rx packet or Tx 
+ *  complete, this function is called. If the interrupt was to indicate a loss
+ *  of link, the OSM link status handler is invoked for any other alarm 
+ *  interrupt the block that raised the interrupt is displayed and a H/W reset 
+ *  is issued.
+ */
+static void alarmIntrHandler(struct s2io_nic *nic)
+{
+	struct net_device *dev = (struct net_device *) nic->dev;
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0;
+	register u64 val64 = 0, err_reg = 0;
+
+
+	/* Handling link status change error Intr */
+	err_reg = readq(&bar0->mac_rmac_err_reg);
+	if (err_reg & RMAC_LINK_STATE_CHANGE_INT) {
+		schedule_work(&nic->set_link_task);
+	}
+
+	/* Handling SERR errors by stopping device Xmit queue and forcing 
+	 * a H/W reset.
+	 */
+	val64 = readq(&bar0->serr_source);
+	if (val64 & SERR_SOURCE_ANY) {
+		DBG_PRINT(ERR_DBG, "%s: Device indicates ", dev->name);
+		DBG_PRINT(ERR_DBG, "serious error!!\n");
+		netif_stop_queue(dev);
+	}
+/* Other type of interrupts are not being handled now,  TODO*/
+}
+
+/*
+ *  Input Argument: 
+ *  sp - private member of the device structure, which is a pointer to the 
+ *   	s2io_nic structure.
+ *  Return value:
+ *   SUCCESS on success and FAILURE on failure.
+ *  Description:
+ *   Function that waits for a command to Write into RMAC ADDR DATA registers 
+ *   to be completed and returns either success or error depending on whether 
+ *   the command was complete or not. 
+ */
+int waitForCmdComplete(nic_t * sp)
+{
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0;
+	int ret = FAILURE, cnt = 0;
+	u64 val64;
+
+	while (TRUE) {
+		val64 =
+		    RMAC_ADDR_CMD_MEM_RD | RMAC_ADDR_CMD_MEM_STROBE_NEW_CMD
+		    | RMAC_ADDR_CMD_MEM_OFFSET(0);
+		writeq(val64, &bar0->rmac_addr_cmd_mem);
+		val64 = readq(&bar0->rmac_addr_cmd_mem);
+		if (!val64) {
+			ret = SUCCESS;
+			break;
+		}
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(HZ / 20);
+		if (cnt++ > 10)
+			break;
+	}
+
+	return ret;
+}
+
+/*
+ *  Input Argument: 
+ *  sp - private member of the device structure, which is a pointer to the 
+ *   	s2io_nic structure.
+ *  Return value:
+ *   void.
+ *  Description:
+ *   Function to Reset the card. This function then also restores the previously
+ *   saved PCI configuration space registers as the card reset also resets the
+ *   Configration space.
+ */
+void s2io_reset(nic_t * sp)
+{
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0;
+	u64 val64;
+	u16 subid;
+
+	val64 = SW_RESET_ALL;
+	writeq(val64, &bar0->sw_reset);
+
+	/* At this stage, if the PCI write is indeed completed, the 
+	 * card is reset and so is the PCI Config space of the device. 
+	 * So a read cannot be issued at this stage on any of the 
+	 * registers to ensure the write into "sw_reset" register
+	 * has gone through.
+	 * Question: Is there any system call that will explicitly force
+	 * all the write commands still pending on the bus to be pushed
+	 * through?
+	 * As of now I'am just giving a 250ms delay and hoping that the
+	 * PCI write to sw_reset register is done by this time.
+	 */
+	set_current_state(TASK_UNINTERRUPTIBLE);
+	schedule_timeout(HZ / 4);
+
+	/* Restore the PCI state saved during initializarion. */
+	pci_restore_state(sp->pdev, sp->config_space);
+	s2io_init_pci(sp);
+
+	set_current_state(TASK_UNINTERRUPTIBLE);
+	schedule_timeout(HZ / 4);
+
+	/* SXE-002: Configure link and activity LED to turn it off */
+	subid = sp->pdev->subsystem_device;
+	if ((subid & 0xFF) >= 0x07) {
+		val64 = readq(&bar0->gpio_control);
+		val64 |= 0x0000800000000000ULL;
+		writeq(val64, &bar0->gpio_control);
+		val64 = 0x0411040400000000ULL;
+		writeq(val64, (void *) ((u8 *) bar0 + 0x2700));
+	}
+
+	sp->device_enabled_once = FALSE;
+}
+
+/*
+ *  Input Argument: 
+ *  sp - private member of the device structure, which is a pointer to the 
+ *   	s2io_nic structure.
+ *  Return value:
+ *  SUCCESS on success and FAILURE on failure.
+ *  Description:
+ * Function to set the swapper control on the card correctly depending on the
+ * 'endianness' of the system.
+ */
+int s2io_set_swapper(nic_t * sp)
+{
+	struct net_device *dev = sp->dev;
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0;
+	u64 val64;
+
+/*  Set proper endian settings and verify the same by reading the PIF 
+ *  Feed-back register.
+ */
+#ifdef  __BIG_ENDIAN
+/* The device by default set to a big endian format, so a big endian 
+ * driver need not set anything.
+ */
+	writeq(0xffffffffffffffffULL, &bar0->swapper_ctrl);
+	val64 = (SWAPPER_CTRL_PIF_R_FE |
+		 SWAPPER_CTRL_PIF_R_SE |
+		 SWAPPER_CTRL_PIF_W_FE |
+		 SWAPPER_CTRL_PIF_W_SE |
+		 SWAPPER_CTRL_TXP_FE |
+		 SWAPPER_CTRL_TXP_SE |
+		 SWAPPER_CTRL_TXD_R_FE |
+		 SWAPPER_CTRL_TXD_W_FE |
+		 SWAPPER_CTRL_TXF_R_FE |
+		 SWAPPER_CTRL_RXD_R_FE |
+		 SWAPPER_CTRL_RXD_W_FE |
+		 SWAPPER_CTRL_RXF_W_FE |
+		 SWAPPER_CTRL_XMSI_FE |
+		 SWAPPER_CTRL_XMSI_SE |
+		 SWAPPER_CTRL_STATS_FE | SWAPPER_CTRL_STATS_SE);
+	writeq(val64, &bar0->swapper_ctrl);
+#else
+/* Initially we enable all bits to make it accessible by the driver,
+ * then we selectively enable only those bits that we want to set.
+ */
+	writeq(0xffffffffffffffffULL, &bar0->swapper_ctrl);
+	val64 = (SWAPPER_CTRL_PIF_R_FE |
+		 SWAPPER_CTRL_PIF_R_SE |
+		 SWAPPER_CTRL_PIF_W_FE |
+		 SWAPPER_CTRL_PIF_W_SE |
+		 SWAPPER_CTRL_TXP_FE |
+		 SWAPPER_CTRL_TXP_SE |
+		 SWAPPER_CTRL_TXD_R_FE |
+		 SWAPPER_CTRL_TXD_R_SE |
+		 SWAPPER_CTRL_TXD_W_FE |
+		 SWAPPER_CTRL_TXD_W_SE |
+		 SWAPPER_CTRL_TXF_R_FE |
+		 SWAPPER_CTRL_RXD_R_FE |
+		 SWAPPER_CTRL_RXD_R_SE |
+		 SWAPPER_CTRL_RXD_W_FE |
+		 SWAPPER_CTRL_RXD_W_SE |
+		 SWAPPER_CTRL_RXF_W_FE |
+		 SWAPPER_CTRL_XMSI_FE |
+		 SWAPPER_CTRL_XMSI_SE |
+		 SWAPPER_CTRL_STATS_FE | SWAPPER_CTRL_STATS_SE);
+	writeq(val64, &bar0->swapper_ctrl);
+#endif
+
+/*  Verifying if endian settings are accurate by reading a feedback
+ *  register.
+ */
+	val64 = readq(&bar0->pif_rd_swapper_fb);
+	if (val64 != 0x0123456789ABCDEFULL) {
+		/* Endian settings are incorrect, calls for another dekko. */
+		DBG_PRINT(ERR_DBG, "%s: Endian settings are wrong, ",
+			  dev->name);
+		DBG_PRINT(ERR_DBG, "feedback read %llx\n",
+			  (unsigned long long) val64);
+		return FAILURE;
+	}
+
+	return SUCCESS;
+}
+
+/* ********************************************************* *
+ * Functions defined below concern the OS part of the driver *
+ * ********************************************************* */
+
+/*
+ *  Input Argument: 
+ *  dev - pointer to the device structure.
+ *  Return value:
+ *  '0' on success and an appropriate (-)ve integer as defined in errno.h
+ *   file on failure.
+ *  Description:
+ *  This function is the open entry point of the driver. It mainly calls a
+ *  function to allocate Rx buffers and inserts them into the buffer
+ *  descriptors and then enables the Rx part of the NIC. 
+ */
+int s2io_open(struct net_device *dev)
+{
+	nic_t *sp = dev->priv;
+	int i, ret = 0, err = 0;
+	mac_info_t *mac_control;
+	struct config_param *config;
+
+
+/* Make sure you have link off by default every time Nic is initialized*/
+	netif_carrier_off(dev);
+	sp->last_link_state = LINK_DOWN;
+
+/*  Initialize the H/W I/O registers */
+	if (initNic(sp) != 0) {
+		DBG_PRINT(ERR_DBG, "%s: H/W initialization failed\n",
+			  dev->name);
+		return -ENODEV;
+	}
+
+/*  After proper initialization of H/W, register ISR */
+	err =
+	    request_irq((int) sp->irq, s2io_isr, SA_SHIRQ, sp->name, dev);
+	if (err) {
+		s2io_reset(sp);
+		DBG_PRINT(ERR_DBG, "%s: ISR registration failed\n",
+			  dev->name);
+		return err;
+	}
+	if (s2io_set_mac_addr(dev, dev->dev_addr) == FAILURE) {
+		DBG_PRINT(ERR_DBG, "Set Mac Address Failed\n");
+		s2io_reset(sp);
+		return -ENODEV;
+	}
+
+
+/*  Setting its receive mode */
+	s2io_set_multicast(dev);
+
+/*  Initializing the Rx buffers. For now we are considering only 1 Rx ring
+ * and initializing buffers into 1016 RxDs or 8 Rx blocks
+ */
+	mac_control = &sp->mac_control;
+	config = &sp->config;
+
+	for (i = 0; i < config->RxRingNum; i++) {
+		if ((ret = fill_rx_buffers(sp, i))) {
+			DBG_PRINT(ERR_DBG, "%s: Out of memory in Open\n",
+				  dev->name);
+			s2io_reset(sp);
+			free_irq(dev->irq, dev);
+			freeRxBuffers(sp);
+			return -ENOMEM;
+		}
+		DBG_PRINT(INFO_DBG, "Buf in ring:%d is %d:\n", i,
+			  atomic_read(&sp->rx_bufs_left[i]));
+	}
+
+/*  Enable tasklet for the device */
+	tasklet_init(&sp->task, s2io_tasklet, (unsigned long) dev);
+
+/*  Enable Rx Traffic and interrupts on the NIC */
+	if (startNic(sp)) {
+		DBG_PRINT(ERR_DBG, "%s: Starting NIC failed\n", dev->name);
+		tasklet_kill(&sp->task);
+		s2io_reset(sp);
+		free_irq(dev->irq, dev);
+		freeRxBuffers(sp);
+		return -ENODEV;
+	}
+
+	sp->device_close_flag = FALSE;	/* Device is up and running. */
+	netif_start_queue(dev);
+
+	return 0;
+}
+
+/*
+ *  Input Argument/s: 
+ *  dev - device pointer.
+ *  Return value:
+ *  '0' on success and an appropriate (-)ve integer as defined in errno.h
+ *  file on failure.
+ *  Description:
+ *  This is the stop entry point of the driver. It needs to undo exactly
+ *  whatever was done by the open entry point, thus it's usually referred to
+ *  as the close function. Among other things this function mainly stops the
+ *  Rx side of the NIC and frees all the Rx buffers in the Rx rings.
+ */
+int s2io_close(struct net_device *dev)
+{
+	nic_t *sp = dev->priv;
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0;
+	register u64 val64 = 0;
+	u16 cnt = 0;
+
+	spin_lock(&sp->isr_lock);
+	netif_stop_queue(dev);
+
+/* disable Tx and Rx traffic on the NIC */
+	stopNic(sp);
+
+	spin_unlock(&sp->isr_lock);
+
+/* If the device tasklet is running, wait till its done before killing it */
+	while (atomic_read(&(sp->tasklet_status))) {
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(HZ / 10);
+	}
+	tasklet_kill(&sp->task);
+
+/* Check if the device is Quiescent and then Reset the NIC */
+	do {
+		val64 = readq(&bar0->adapter_status);
+		if (verify_xena_quiescence(val64, sp->device_enabled_once)) {
+			break;
+		}
+
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(HZ / 20);
+		cnt++;
+		if (cnt == 10) {
+			DBG_PRINT(ERR_DBG,
+				  "s2io_close:Device not Quiescent ");
+			DBG_PRINT(ERR_DBG, "adaper status reads 0x%llx\n",
+				  (unsigned long long) val64);
+			break;
+		}
+	} while (1);
+	s2io_reset(sp);
+
+/*  Free the Registered IRQ */
+	free_irq(dev->irq, dev);
+
+/* Free all Tx Buffers waiting for transmission */
+	freeTxBuffers(sp);
+
+/*  Free all Rx buffers allocated by host */
+	freeRxBuffers(sp);
+
+	sp->device_close_flag = TRUE;	/* Device is shut down. */
+
+	return 0;
+}
+
+/*
+ *  Input Argument/s: 
+ *  skb - the socket buffer containing the Tx data.
+ *  dev - device pointer.
+ *  Return value:
+ *  '0' on success & 1 on failure. 
+ *  NOTE: when device cant queue the pkt, just the trans_start variable will
+ *  not be upadted.
+ *  Description:
+ *  This function is the Tx entry point of the driver. S2IO NIC supports
+ *  certain protocol assist features on Tx side, namely  CSO, S/G, LSO.
+ */
+int s2io_xmit(struct sk_buff *skb, struct net_device *dev)
+{
+	nic_t *sp = dev->priv;
+	u16 off, txd_len, frg_cnt, frg_len, i, queue, off1, queue_len;
+	register u64 val64;
+	TxD_t *txdp;
+	TxFIFO_element_t *tx_fifo;
+	unsigned long flags;
+#ifdef NETIF_F_TSO
+	int mss;
+#endif
+	mac_info_t *mac_control;
+	struct config_param *config;
+
+	mac_control = &sp->mac_control;
+	config = &sp->config;
+
+	DBG_PRINT(TX_DBG, "%s: In S2IO Tx routine\n", dev->name);
+
+	spin_lock_irqsave(&sp->tx_lock, flags);
+	queue = 0;
+	/* Multi FIFO Tx is disabled for now. */
+	if (!queue && tx_prio) {
+		u8 x = (skb->data)[5];
+		queue = x % config->TxFIFONum;
+	}
+
+
+	off = (u16) mac_control->tx_curr_put_info[queue].offset;
+	off1 = (u16) mac_control->tx_curr_get_info[queue].offset;
+	txd_len = mac_control->txdl_len;
+	txdp = mac_control->txdl_start[queue] + (config->MaxTxDs * off);
+
+	queue_len = mac_control->tx_curr_put_info[queue].fifo_len + 1;
+	/* Avoid "put" pointer going beyond "get" pointer */
+	if (txdp->Host_Control || (((off + 1) % queue_len) == off1)) {
+		DBG_PRINT(ERR_DBG, "Error in xmit, No free TXDs.\n");
+		netif_stop_queue(dev);
+		dev_kfree_skb(skb);
+		spin_unlock_irqrestore(&sp->tx_lock, flags);
+		return 0;
+	}
+
+#ifdef NETIF_F_TSO
+	mss = skb_shinfo(skb)->tso_size;
+	if (mss) {
+		txdp->Control_1 |= TXD_TCP_LSO_EN;
+		txdp->Control_1 |= TXD_TCP_LSO_MSS(mss);
+	}
+#endif
+
+	frg_cnt = skb_shinfo(skb)->nr_frags;
+	frg_len = skb->len - skb->data_len;
+
+	txdp->Host_Control = (unsigned long) skb;
+	txdp->Buffer_Pointer = pci_map_single
+	    (sp->pdev, skb->data, frg_len, PCI_DMA_TODEVICE);
+	if (skb->ip_summed == CHECKSUM_HW) {
+		txdp->Control_2 |=
+		    (TXD_TX_CKO_IPV4_EN | TXD_TX_CKO_TCP_EN |
+		     TXD_TX_CKO_UDP_EN);
+	}
+
+	txdp->Control_2 |= config->TxIntrType;
+
+	txdp->Control_1 |= (TXD_BUFFER0_SIZE(frg_len) |
+			    TXD_GATHER_CODE_FIRST);
+	txdp->Control_1 |= TXD_LIST_OWN_XENA;
+
+	/* For fragmented SKB. */
+	for (i = 0; i < frg_cnt; i++) {
+		skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
+		txdp++;
+		txdp->Buffer_Pointer = (u64) pci_map_page
+		    (sp->pdev, frag->page, frag->page_offset,
+		     frag->size, PCI_DMA_TODEVICE);
+		txdp->Control_1 |= TXD_BUFFER0_SIZE(frag->size);
+	}
+	txdp->Control_1 |= TXD_GATHER_CODE_LAST;
+
+	tx_fifo = mac_control->tx_FIFO_start[queue];
+	val64 = (mac_control->txdl_start_phy[queue] +
+		 (sizeof(TxD_t) * txd_len * off));
+	writeq(val64, &tx_fifo->TxDL_Pointer);
+
+	val64 = (TX_FIFO_LAST_TXD_NUM(frg_cnt) | TX_FIFO_FIRST_LIST |
+		 TX_FIFO_LAST_LIST);
+#ifdef NETIF_F_TSO
+	if (mss)
+		val64 |= TX_FIFO_SPECIAL_FUNC;
+#endif
+	writeq(val64, &tx_fifo->List_Control);
+
+	off++;
+	off %= mac_control->tx_curr_put_info[queue].fifo_len + 1;
+	mac_control->tx_curr_put_info[queue].offset = off;
+
+	/* Avoid "put" pointer going beyond "get" pointer */
+	if (((off + 1) % queue_len) == off1) {
+		DBG_PRINT(TX_DBG, 
+		  "No free TxDs for xmit, Put: 0x%x Get:0x%x\n",
+		  off, off1);
+		netif_stop_queue(dev);
+	}
+
+	dev->trans_start = jiffies;
+	spin_unlock_irqrestore(&sp->tx_lock, flags);
+
+	return 0;
+}
+
+/*
+ *  Input Argument/s: 
+ *  irq: the irq of the device.
+ *  dev_id: a void pointer to the dev structure of the NIC.
+ *  ptregs: pointer to the registers pushed on the stack.
+ *  Return value:
+ *  void.
+ *  Description:
+ *  This function is the ISR handler of the device. It identifies the reason 
+ *  for the interrupt and calls the relevant service routines.
+ *  As a contongency measure, this ISR allocates the recv buffers, if their 
+ *  numbers are below the panic value which is presently set to 25% of the
+ *  original number of rcv buffers allocated.
+ */
+
+static irqreturn_t s2io_isr(int irq, void *dev_id, struct pt_regs *regs)
+{
+	struct net_device *dev = (struct net_device *) dev_id;
+	nic_t *sp = dev->priv;
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0;
+#ifndef CONFIG_S2IO_NAPI
+	int i, ret;
+#endif
+	u64 reason = 0, general_mask = 0;
+	mac_info_t *mac_control;
+	struct config_param *config;
+
+	mac_control = &sp->mac_control;
+	config = &sp->config;
+
+	spin_lock(&sp->isr_lock);
+
+	/* Identify the cause for interrupt and call the appropriate
+	 * interrupt handler. Causes for the interrupt could be;
+	 * 1. Rx of packet.
+	 * 2. Tx complete.
+	 * 3. Link down.
+	 * 4. Error in any functional blocks of the NIC. 
+	 */
+	reason = readq(&bar0->general_int_status);
+
+	if (!reason) {
+		/* The interrupt was not raised by Xena. */
+		spin_unlock(&sp->isr_lock);
+		return IRQ_NONE;
+	}
+	/* Mask the interrupts on the NIC */
+	general_mask = readq(&bar0->general_int_mask);
+	writeq(0xFFFFFFFFFFFFFFFFULL, &bar0->general_int_mask);
+
+#if DEBUG_ON
+	sp->int_cnt++;
+#endif
+
+	/* If Intr is because of Tx Traffic */
+	if (reason & GEN_INTR_TXTRAFFIC) {
+		txIntrHandler(sp);
+	}
+
+	/* If Intr is because of an error */
+	if (reason & (GEN_ERROR_INTR))
+		alarmIntrHandler(sp);
+
+#ifdef CONFIG_S2IO_NAPI
+	if (reason & GEN_INTR_RXTRAFFIC) {
+		if (netif_rx_schedule_prep(dev)) {
+			en_dis_able_NicIntrs(sp, RX_TRAFFIC_INTR,
+					     DISABLE_INTRS);
+			/* We retake the snap shot of the general interrupt 
+			 * register.
+			 */
+			general_mask = readq(&bar0->general_int_mask);
+			__netif_rx_schedule(dev);
+		}
+	}
+#else
+	/* If Intr is because of Rx Traffic */
+	if (reason & GEN_INTR_RXTRAFFIC) {
+		rxIntrHandler(sp);
+	}
+#endif
+
+/* If the Rx buffer count is below the panic threshold then reallocate the
+ * buffers from the interrupt handler itself, else schedule a tasklet to 
+ * reallocate the buffers.
+ */
+#if 1
+	{
+	int i;
+
+	for (i = 0; i < config->RxRingNum; i++) {
+		int rxb_size = atomic_read(&sp->rx_bufs_left[i]);
+		int level = rx_buffer_level(sp, rxb_size, i);
+
+		if ((level == PANIC) && (!TASKLET_IN_USE)) {
+			int ret;
+
+			DBG_PRINT(ERR_DBG, "%s: Rx BD hit ", dev->name);
+			DBG_PRINT(ERR_DBG, "PANIC levels\n");
+			if ((ret = fill_rx_buffers(sp, i)) == -ENOMEM) {
+				DBG_PRINT(ERR_DBG, "%s:Out of memory",
+					  dev->name);
+				DBG_PRINT(ERR_DBG, " in ISR!!\n");
+				writeq(general_mask,
+				       &bar0->general_int_mask);
+				spin_unlock(&sp->isr_lock);
+				return IRQ_HANDLED;
+			}
+			clear_bit(0,
+				  (unsigned long *) (&sp->tasklet_status));
+		} else if ((level == LOW)
+			   && (!atomic_read(&sp->tasklet_status))) {
+			tasklet_schedule(&sp->task);
+		}
+
+	}
+
+	}
+#else
+	tasklet_schedule(&sp->task);
+#endif
+
+	/* Unmask all the previously enabled interrupts on the NIC */
+	writeq(general_mask, &bar0->general_int_mask);
+
+	spin_unlock(&sp->isr_lock);
+	return IRQ_HANDLED;
+}
+
+/*
+ *  Input Argument/s: 
+ *  dev - pointer to the device structure.
+ *  Return value:
+ *  pointer to the updated net_device_stats structure.
+ *  Description:
+ *  This function updates the device statistics structure in the s2io_nic 
+ *  structure and returns a pointer to the same.
+ */
+struct net_device_stats *s2io_get_stats(struct net_device *dev)
+{
+	nic_t *sp = dev->priv;
+	mac_info_t *mac_control;
+	struct config_param *config;
+
+	mac_control = &sp->mac_control;
+	config = &sp->config;
+
+	sp->stats.tx_errors = mac_control->StatsInfo->tmac_any_err_frms;
+	sp->stats.rx_errors = mac_control->StatsInfo->rmac_drop_frms;
+	sp->stats.multicast = mac_control->StatsInfo->rmac_vld_mcst_frms;
+	sp->stats.rx_length_errors =
+	    mac_control->StatsInfo->rmac_long_frms;
+
+	return (&sp->stats);
+}
+
+/*
+ *  Input Argument/s: 
+ *  dev - pointer to the device structure
+ *  Return value:
+ *  void.
+ *  Description:
+ *  This function is a driver entry point which gets called by the kernel 
+ *  whenever multicast addresses must be enabled/disabled. This also gets 
+ *  called to set/reset promiscuous mode. Depending on the deivce flag, we
+ *  determine, if multicast address must be enabled or if promiscuous mode
+ *  is to be disabled etc.
+ */
+static void s2io_set_multicast(struct net_device *dev)
+{
+	int i, j, prev_cnt;
+	struct dev_mc_list *mclist;
+	nic_t *sp = dev->priv;
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0;
+	u64 val64 = 0, multi_mac = 0x010203040506ULL, mask =
+	    0xfeffffffffffULL;
+	u64 dis_addr = 0xffffffffffffULL, mac_addr = 0;
+	void *add;
+
+	if ((dev->flags & IFF_ALLMULTI) && (!sp->m_cast_flg)) {
+		/*  Enable all Multicast addresses */
+		writeq(RMAC_ADDR_DATA0_MEM_ADDR(multi_mac),
+		       &bar0->rmac_addr_data0_mem);
+		writeq(RMAC_ADDR_DATA1_MEM_MASK(mask),
+		       &bar0->rmac_addr_data1_mem);
+		val64 = RMAC_ADDR_CMD_MEM_WE |
+		    RMAC_ADDR_CMD_MEM_STROBE_NEW_CMD |
+		    RMAC_ADDR_CMD_MEM_OFFSET(MAC_MC_ALL_MC_ADDR_OFFSET);
+		writeq(val64, &bar0->rmac_addr_cmd_mem);
+		/* Wait till command completes */
+		waitForCmdComplete(sp);
+
+		sp->m_cast_flg = 1;
+		sp->all_multi_pos = MAC_MC_ALL_MC_ADDR_OFFSET;
+	} else if ((dev->flags & IFF_ALLMULTI) && (sp->m_cast_flg)) {
+		/*  Disable all Multicast addresses */
+		writeq(RMAC_ADDR_DATA0_MEM_ADDR(dis_addr),
+		       &bar0->rmac_addr_data0_mem);
+		val64 = RMAC_ADDR_CMD_MEM_WE |
+		    RMAC_ADDR_CMD_MEM_STROBE_NEW_CMD |
+		    RMAC_ADDR_CMD_MEM_OFFSET(sp->all_multi_pos);
+		writeq(val64, &bar0->rmac_addr_cmd_mem);
+		/* Wait till command completes */
+		waitForCmdComplete(sp);
+
+		sp->m_cast_flg = 0;
+		sp->all_multi_pos = 0;
+	}
+
+	if ((dev->flags & IFF_PROMISC) && (!sp->promisc_flg)) {
+		/*  Put the NIC into promiscuous mode */
+		add = (void *) &bar0->mac_cfg;
+		val64 = readq(&bar0->mac_cfg);
+		val64 |= MAC_CFG_RMAC_PROM_ENABLE;
+
+		writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key);
+		writel((u32) val64, add);
+		writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key);
+		writel((u32) (val64 >> 32), (add + 4));
+
+		val64 = readq(&bar0->mac_cfg);
+		sp->promisc_flg = 1;
+		DBG_PRINT(ERR_DBG, "%s: entered promiscuous mode\n",
+			  dev->name);
+	} else if (!(dev->flags & IFF_PROMISC) && (sp->promisc_flg)) {
+		/*  Remove the NIC from promiscuous mode */
+		add = (void *) &bar0->mac_cfg;
+		val64 = readq(&bar0->mac_cfg);
+		val64 &= ~MAC_CFG_RMAC_PROM_ENABLE;
+
+		writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key);
+		writel((u32) val64, add);
+		writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key);
+		writel((u32) (val64 >> 32), (add + 4));
+
+		val64 = readq(&bar0->mac_cfg);
+		sp->promisc_flg = 0;
+		DBG_PRINT(ERR_DBG, "%s: left promiscuous mode\n",
+			  dev->name);
+	}
+
+	/*  Update individual M_CAST address list */
+	if ((!sp->m_cast_flg) && dev->mc_count) {
+		if (dev->mc_count >
+		    (MAX_ADDRS_SUPPORTED - MAC_MC_ADDR_START_OFFSET - 1)) {
+			DBG_PRINT(ERR_DBG, "%s: No more Rx filters ",
+				  dev->name);
+			DBG_PRINT(ERR_DBG, "can be added, please enable ");
+			DBG_PRINT(ERR_DBG, "ALL_MULTI instead\n");
+			return;
+		}
+
+		prev_cnt = sp->mc_addr_count;
+		sp->mc_addr_count = dev->mc_count;
+
+		/* Clear out the previous list of Mc in the H/W. */
+		for (i = 0; i < prev_cnt; i++) {
+			writeq(RMAC_ADDR_DATA0_MEM_ADDR(dis_addr),
+			       &bar0->rmac_addr_data0_mem);
+			val64 = RMAC_ADDR_CMD_MEM_WE |
+			    RMAC_ADDR_CMD_MEM_STROBE_NEW_CMD |
+			    RMAC_ADDR_CMD_MEM_OFFSET
+			    (MAC_MC_ADDR_START_OFFSET + i);
+			writeq(val64, &bar0->rmac_addr_cmd_mem);
+
+			/* Wait for command completes */
+			if (waitForCmdComplete(sp)) {
+				DBG_PRINT(ERR_DBG, "%s: Adding ",
+					  dev->name);
+				DBG_PRINT(ERR_DBG, "Multicasts failed\n");
+				return;
+			}
+		}
+
+		/* Create the new Rx filter list and update the same in H/W. */
+		for (i = 0, mclist = dev->mc_list; i < dev->mc_count;
+		     i++, mclist = mclist->next) {
+			memcpy(sp->usr_addrs[i].addr, mclist->dmi_addr,
+			       ETH_ALEN);
+			for (j = 0; j < ETH_ALEN; j++) {
+				mac_addr |= mclist->dmi_addr[j];
+				mac_addr <<= 8;
+			}
+			writeq(RMAC_ADDR_DATA0_MEM_ADDR(mac_addr),
+			       &bar0->rmac_addr_data0_mem);
+
+			val64 = RMAC_ADDR_CMD_MEM_WE |
+			    RMAC_ADDR_CMD_MEM_STROBE_NEW_CMD |
+			    RMAC_ADDR_CMD_MEM_OFFSET
+			    (i + MAC_MC_ADDR_START_OFFSET);
+			writeq(val64, &bar0->rmac_addr_cmd_mem);
+
+			/* Wait for command completes */
+			if (waitForCmdComplete(sp)) {
+				DBG_PRINT(ERR_DBG, "%s: Adding ",
+					  dev->name);
+				DBG_PRINT(ERR_DBG, "Multicasts failed\n");
+				return;
+			}
+		}
+	}
+}
+
+/*
+ *  Input Argument/s: 
+ *  dev - pointer to the device structure.
+ *  new_mac - a uchar pointer to the new mac address which is to be set.
+ *  Return value:
+ *  SUCCESS on success and an appropriate (-)ve integer as defined in errno.h
+ *  file on failure.
+ *  Description:
+ *  This procedure will program the Xframe to receive frames with new
+ *  Mac Address
+ */
+int s2io_set_mac_addr(struct net_device *dev, u8 * addr)
+{
+	nic_t *sp = dev->priv;
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0;
+	register u64 val64, mac_addr = 0;
+	int i;
+
+	/* 
+	 * Set the new MAC address as the new unicast filter and reflect this
+	 * change on the device address registered with the OS. It will be
+	 * at offset 0. 
+	 */
+	for (i = 0; i < ETH_ALEN; i++) {
+		mac_addr <<= 8;
+		mac_addr |= addr[i];
+	}
+
+	writeq(RMAC_ADDR_DATA0_MEM_ADDR(mac_addr),
+	       &bar0->rmac_addr_data0_mem);
+
+	val64 =
+	    RMAC_ADDR_CMD_MEM_WE | RMAC_ADDR_CMD_MEM_STROBE_NEW_CMD |
+	    RMAC_ADDR_CMD_MEM_OFFSET(0);
+	writeq(val64, &bar0->rmac_addr_cmd_mem);
+	/* Wait till command completes */
+	if (waitForCmdComplete(sp)) {
+		DBG_PRINT(ERR_DBG, "%s: set_mac_addr failed\n", dev->name);
+		return FAILURE;
+	}
+
+	return SUCCESS;
+}
+
+/*
+ * Input Argument/s: 
+ *  sp - private member of the device structure, which is a pointer to the 
+ *   	s2io_nic structure.
+ *  info - pointer to the structure with parameters given by ethtool to set
+ *  link information.
+ * Return value:
+ *  0 on success.
+ * Description:
+ *  The function sets different link parameters provided by the user onto 
+ *  the NIC.
+ */
+static int s2io_ethtool_sset(struct net_device *dev,
+			     struct ethtool_cmd *info)
+{
+	nic_t *sp = dev->priv;
+	if ((info->autoneg == AUTONEG_ENABLE) ||
+	    (info->speed != SPEED_10000) || (info->duplex != DUPLEX_FULL))
+		return -EINVAL;
+	else {
+		s2io_close(sp->dev);
+		s2io_open(sp->dev);
+	}
+
+	return 0;
+}
+
+/*
+ * Input Argument/s: 
+ *  sp - private member of the device structure, which is a pointer to the 
+ *   	s2io_nic structure.
+ *  info - pointer to the structure with parameters given by ethtool to return
+ *  link information.
+ * Return value:
+ *  void
+ * Description:
+ *  Returns link specefic information like speed, duplex etc.. to ethtool.
+ */
+int s2io_ethtool_gset(struct net_device *dev, struct ethtool_cmd *info)
+{
+	nic_t *sp = dev->priv;
+	info->supported = (SUPPORTED_10000baseT_Full | SUPPORTED_FIBRE);
+	info->advertising = (SUPPORTED_10000baseT_Full | SUPPORTED_FIBRE);
+	info->port = PORT_FIBRE;
+	/* info->transceiver?? TODO */
+
+	if (netif_carrier_ok(sp->dev)) {
+		info->speed = 10000;
+		info->duplex = DUPLEX_FULL;
+	} else {
+		info->speed = -1;
+		info->duplex = -1;
+	}
+
+	info->autoneg = AUTONEG_DISABLE;
+	return 0;
+}
+
+/*
+ * Input Argument/s: 
+ *  sp - private member of the device structure, which is a pointer to the 
+ *   	s2io_nic structure.
+ *  info - pointer to the structure with parameters given by ethtool to return
+ *  driver information.
+ * Return value:
+ *  void
+ * Description:
+ *  Returns driver specefic information like name, version etc.. to ethtool.
+ */
+static void s2io_ethtool_gdrvinfo(struct net_device *dev,
+				  struct ethtool_drvinfo *info)
+{
+	nic_t *sp = dev->priv;
+
+	strncpy(info->driver, s2io_driver_name, sizeof(s2io_driver_name));
+	strncpy(info->version, s2io_driver_version,
+		sizeof(s2io_driver_version));
+	strncpy(info->fw_version, "", 32);
+	strncpy(info->bus_info, sp->pdev->slot_name, 32);
+	info->regdump_len = XENA_REG_SPACE;
+	info->eedump_len = XENA_EEPROM_SPACE;
+	info->testinfo_len = S2IO_TEST_LEN;
+	info->n_stats = S2IO_STAT_LEN;
+}
+
+/*
+ * Input Argument/s: 
+ *  sp - private member of the device structure, which is a pointer to the 
+ *   	s2io_nic structure.
+ *  regs - pointer to the structure with parameters given by ethtool for 
+ *  dumping the registers.
+ *  reg_space - The input argumnet into which all the registers are dumped.
+ * Return value:
+ *  void
+ * Description:
+ *  Dumps the entire register space of xFrame NIC into the user given buffer 
+ *  area.
+ */
+static void s2io_ethtool_gregs(struct net_device *dev,
+			       struct ethtool_regs *regs, void *space)
+{
+	int i;
+	u64 reg;
+	u8 *reg_space = (u8 *) space;
+	nic_t *sp = dev->priv;
+
+	regs->len = XENA_REG_SPACE;
+	regs->version = sp->pdev->subsystem_device;
+
+	for (i = 0; i < regs->len; i += 8) {
+		reg = readq((void *) (sp->bar0 + i));
+		memcpy((reg_space + i), &reg, 8);
+	}
+}
+
+/*
+ * Input Argument/s: 
+ *  data - address of the private member of the device structure, which 
+ *  is a pointer to the s2io_nic structure, provided as an u32.
+ * Return value:
+ *  void
+ * Description:
+ *  This is actually the timer function that alternates the adapter LED bit
+ *  of the adapter control bit to set/reset every time on invocation.
+ *  The timer is set for 1/2 a second, hence tha NIC blinks once every second.
+ */
+static void s2io_phy_id(unsigned long data)
+{
+	nic_t *sp = (nic_t *) data;
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0;
+	u64 val64 = 0;
+	u16 subid;
+
+	subid = sp->pdev->subsystem_device;
+	if ((subid & 0xFF) >= 0x07) {
+		val64 = readq(&bar0->gpio_control);
+		val64 ^= GPIO_CTRL_GPIO_0;
+		writeq(val64, &bar0->gpio_control);
+	} else {
+		val64 = readq(&bar0->adapter_control);
+		val64 ^= ADAPTER_LED_ON;
+		writeq(val64, &bar0->adapter_control);
+	}
+
+	mod_timer(&sp->id_timer, jiffies + HZ / 2);
+}
+
+/*
+ * Input Argument/s: 
+ *  sp - private member of the device structure, which is a pointer to the 
+ *   	s2io_nic structure.
+ *  id - pointer to the structure with identification parameters given by 
+ *  ethtool.
+ * Return value:
+ *  int , returns '0' on success
+ * Description:
+ *  Used to physically identify the NIC on the system. The Link LED will blink
+ *  for a time specified by the user for identification.
+ *  NOTE: The Link has to be Up to be able to blink the LED. Hence 
+ *  identification is possible only if it's link is up.
+ */
+static int s2io_ethtool_idnic(struct net_device *dev, u32 data)
+{
+	u64 val64 = 0;
+	nic_t *sp = dev->priv;
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0;
+	u16 subid;
+
+	subid = sp->pdev->subsystem_device;
+	if ((subid & 0xFF) < 0x07) {
+		val64 = readq(&bar0->adapter_control);
+		if (!(val64 & ADAPTER_CNTL_EN)) {
+			printk(KERN_ERR
+			       "Adapter Link down, cannot blink LED\n");
+			return -EFAULT;
+		}
+	}
+	if (sp->id_timer.function == NULL) {
+		init_timer(&sp->id_timer);
+		sp->id_timer.function = s2io_phy_id;
+		sp->id_timer.data = (unsigned long) sp;
+	}
+	mod_timer(&sp->id_timer, jiffies);
+	set_current_state(TASK_INTERRUPTIBLE);
+	if (data)
+		schedule_timeout(data * HZ);
+	else
+		schedule_timeout(MAX_SCHEDULE_TIMEOUT);
+	del_timer_sync(&sp->id_timer);
+
+	return 0;
+}
+
+/*
+ * Input Argument/s: 
+ *  sp - private member of the device structure, which is a pointer to the 
+ *   	s2io_nic structure.
+ *  ep - pointer to the structure with pause parameters given by ethtool.
+ * Return value:
+ *  void
+ * Description:
+ *  Returns the Pause frame generation and reception capability of the NIC.
+ */
+static void s2io_ethtool_getpause_data(struct net_device *dev,
+				       struct ethtool_pauseparam *ep)
+{
+	u64 val64;
+	nic_t *sp = dev->priv;
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0;
+
+	val64 = readq(&bar0->rmac_pause_cfg);
+	if (val64 & RMAC_PAUSE_GEN_ENABLE)
+		ep->tx_pause = TRUE;
+	if (val64 & RMAC_PAUSE_RX_ENABLE)
+		ep->rx_pause = TRUE;
+	ep->autoneg = FALSE;
+}
+
+/*
+ * Input Argument/s: 
+ * sp - private member of the device structure, which is a pointer to the 
+ *   	s2io_nic structure.
+ * ep - pointer to the structure with pause parameters given by ethtool.
+ * Return value:
+ * int, returns '0' on Success
+ * Description:
+ * It can be used to set or reset Pause frame generation or reception support 
+ * of the NIC.
+ */
+int s2io_ethtool_setpause_data(struct net_device *dev,
+			       struct ethtool_pauseparam *ep)
+{
+	u64 val64;
+	nic_t *sp = dev->priv;
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0;
+
+	val64 = readq(&bar0->rmac_pause_cfg);
+	if (ep->tx_pause)
+		val64 |= RMAC_PAUSE_GEN_ENABLE;
+	else
+		val64 &= ~RMAC_PAUSE_GEN_ENABLE;
+	if (ep->rx_pause)
+		val64 |= RMAC_PAUSE_RX_ENABLE;
+	else
+		val64 &= ~RMAC_PAUSE_RX_ENABLE;
+	writeq(val64, &bar0->rmac_pause_cfg);
+	return 0;
+}
+
+/*
+ * Input Argument/s: 
+ *  sp - private member of the device structure, which is a pointer to the 
+ *   	s2io_nic structure.
+ *  off - offset at which the data must be written
+ * Return value:
+ *  -1 on failure and the value read from the Eeprom if successful.
+ * Description:
+ *  Will read 4 bytes of data from the user given offset and return the 
+ *  read data.
+ * NOTE: Will allow to read only part of the EEPROM visible through the
+ * 	 I2C bus.
+ */
+#define S2IO_DEV_ID		5
+static u32 readEeprom(nic_t * sp, int off)
+{
+	u32 data = -1, exit_cnt = 0;
+	u64 val64;
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0;
+
+	val64 = I2C_CONTROL_DEV_ID(S2IO_DEV_ID) | I2C_CONTROL_ADDR(off) |
+	    I2C_CONTROL_BYTE_CNT(0x3) | I2C_CONTROL_READ |
+	    I2C_CONTROL_CNTL_START;
+	writeq(val64, &bar0->i2c_control);
+
+	while (exit_cnt < 5) {
+		val64 = readq(&bar0->i2c_control);
+		if (I2C_CONTROL_CNTL_END(val64)) {
+			data = I2C_CONTROL_GET_DATA(val64);
+			break;
+		}
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(HZ / 20);
+		exit_cnt++;
+	}
+
+	return data;
+}
+
+/*
+ * Input Argument/s: 
+ *  sp - private member of the device structure, which is a pointer to the 
+ *   	s2io_nic structure.
+ *  off - offset at which the data must be written
+ *  data - The data that is to be written
+ *  cnt - Number of bytes of the data that are actually to be written into 
+ *  the Eeprom. (max of 3)
+ * Return value:
+ *  '0' on success, -1 on failure.
+ * Description:
+ *  Actually writes the relevant part of the data value into the Eeprom
+ *  through the I2C bus.
+ */
+static int writeEeprom(nic_t * sp, int off, u32 data, int cnt)
+{
+	int exit_cnt = 0, ret = -1;
+	u64 val64;
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0;
+
+	val64 = I2C_CONTROL_DEV_ID(S2IO_DEV_ID) | I2C_CONTROL_ADDR(off) |
+	    I2C_CONTROL_BYTE_CNT(cnt) | I2C_CONTROL_SET_DATA(data) |
+	    I2C_CONTROL_CNTL_START;
+	writeq(val64, &bar0->i2c_control);
+
+	while (exit_cnt < 5) {
+		val64 = readq(&bar0->i2c_control);
+		if (I2C_CONTROL_CNTL_END(val64)) {
+			if (!(val64 & I2C_CONTROL_NACK))
+				ret = 0;
+			break;
+		}
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(HZ / 20);
+		exit_cnt++;
+	}
+
+	return ret;
+}
+
+/* 
+ * A helper function used to invert the 4 byte u32 data field
+ * byte by byte. This will be used by the Read Eeprom function
+ * for display purposes.
+ */
+u32 inv(u32 data)
+{
+	static u32 ret = 0;
+
+	if (data) {
+		u8 c = data;
+		ret = ((ret << 8) + c);
+		data >>= 8;
+		inv(data);
+	}
+
+	return ret;
+}
+
+/*
+ * Input Argument/s: 
+ *  sp - private member of the device structure, which is a pointer to the 
+ *   	s2io_nic structure.
+ *  eeprom - pointer to the user level structure provided by ethtool, 
+ *   containing all relevant information.
+ *  data_buf - user defined value to be written into Eeprom.
+ * Return value:
+ *  int  '0' on success
+ * Description:
+ *  Reads the values stored in the Eeprom at given offset for a given length.
+ *  Stores these values int the input argument data buffer 'data_buf' and
+ *  returns these to the caller (ethtool.)
+ */
+int s2io_ethtool_geeprom(struct net_device *dev,
+			 struct ethtool_eeprom *eeprom, u8 * data_buf)
+{
+	u32 data, i, valid;
+	nic_t *sp = dev->priv;
+
+	eeprom->magic = sp->pdev->vendor | (sp->pdev->device << 16);
+
+	if ((eeprom->offset + eeprom->len) > (XENA_EEPROM_SPACE))
+		eeprom->len = XENA_EEPROM_SPACE - eeprom->offset;
+
+	for (i = 0; i < eeprom->len; i += 4) {
+		data = readEeprom(sp, eeprom->offset + i);
+		if (data < 0) {
+			DBG_PRINT(ERR_DBG, "Read of EEPROM failed\n");
+			return -EFAULT;
+		}
+		valid = inv(data);
+		memcpy((data_buf + i), &valid, 4);
+	}
+	return 0;
+}
+
+/*
+ * Input Argument/s: 
+ *  sp - private member of the device structure, which is a pointer to the 
+ *   	s2io_nic structure.
+ *  eeprom - pointer to the user level structure provided by ethtool, 
+ *   containing all relevant information.
+ *  data_buf - user defined value to be written into Eeprom.
+ * Return value:
+ *  '0' on success, -EFAULT on failure.
+ * Description:
+ *  Tries to write the user provided value in the Eeprom, at the offset
+ *  given by the user.
+ */
+static int s2io_ethtool_seeprom(struct net_device *dev,
+				struct ethtool_eeprom *eeprom,
+				u8 * data_buf)
+{
+	int len = eeprom->len, cnt = 0;
+	u32 valid = 0, data;
+	nic_t *sp = dev->priv;
+
+	if (eeprom->magic != (sp->pdev->vendor | (sp->pdev->device << 16))) {
+		DBG_PRINT(ERR_DBG,
+			  "ETHTOOL_WRITE_EEPROM Err: Magic value ");
+		DBG_PRINT(ERR_DBG, "is wrong, Its not 0x%x\n",
+			  eeprom->magic);
+		return -EFAULT;
+	}
+
+	while (len) {
+		data = (u32) data_buf[cnt] & 0x000000FF;
+		if (data) {
+			valid = (u32) (data << 24);
+		} else
+			valid = data;
+
+		if (writeEeprom(sp, (eeprom->offset + cnt), valid, 0)) {
+			DBG_PRINT(ERR_DBG,
+				  "ETHTOOL_WRITE_EEPROM Err: Cannot ");
+			DBG_PRINT(ERR_DBG,
+				  "write into the specified offset\n");
+			return -EFAULT;
+		}
+		cnt++;
+		len--;
+	}
+
+	return 0;
+}
+
+/*
+ * Input Argument/s: 
+ *  sp - private member of the device structure, which is a pointer to the 
+ *   	s2io_nic structure.
+ *  data - variable that returns the result of each of the test conducted by 
+ *  	the driver.
+ * Return value:
+ *  '0' on success.
+ * Description:
+ *  Read and write into all clock domains. The NIC has 3 clock domains,
+ *  see that registers in all the three regions are accessible.
+ */
+static int s2io_registerTest(nic_t * sp, uint64_t * data)
+{
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0;
+	u64 val64 = 0;
+	int fail = 0;
+
+	val64 = readq(&bar0->pcc_enable);
+	if (val64 != 0xff00000000000000ULL) {
+		fail = 1;
+		DBG_PRINT(INFO_DBG, "Read Test level 1 fails\n");
+	}
+
+	val64 = readq(&bar0->rmac_pause_cfg);
+	if (val64 != 0xc000ffff00000000ULL) {
+		fail = 1;
+		DBG_PRINT(INFO_DBG, "Read Test level 2 fails\n");
+	}
+
+	val64 = readq(&bar0->rx_queue_cfg);
+	if (val64 != 0x0808080808080808ULL) {
+		fail = 1;
+		DBG_PRINT(INFO_DBG, "Read Test level 3 fails\n");
+	}
+
+	val64 = readq(&bar0->xgxs_efifo_cfg);
+	if (val64 != 0x000000001923141EULL) {
+		fail = 1;
+		DBG_PRINT(INFO_DBG, "Read Test level 4 fails\n");
+	}
+
+	val64 = 0x5A5A5A5A5A5A5A5AULL;
+	writeq(val64, &bar0->xmsi_data);
+	val64 = readq(&bar0->xmsi_data);
+	if (val64 != 0x5A5A5A5A5A5A5A5AULL) {
+		fail = 1;
+		DBG_PRINT(ERR_DBG, "Write Test level 1 fails\n");
+	}
+
+	val64 = 0xA5A5A5A5A5A5A5A5ULL;
+	writeq(val64, &bar0->xmsi_data);
+	val64 = readq(&bar0->xmsi_data);
+	if (val64 != 0xA5A5A5A5A5A5A5A5ULL) {
+		fail = 1;
+		DBG_PRINT(ERR_DBG, "Write Test level 2 fails\n");
+	}
+
+	*data = fail;
+	return 0;
+}
+
+/*
+ * Input Argument/s: 
+ *  sp - private member of the device structure, which is a pointer to the 
+ *   	s2io_nic structure.
+ *  data - variable that returns the result of each of the test conducted by 
+ *  	the driver.
+ * Return value:
+ *  '0' on success.
+ * Description:
+ *  Verify that EEPROM in the xena can be programmed using I2C_CONTROL 
+ *  register.
+ */
+static int s2io_eepromTest(nic_t * sp, uint64_t * data)
+{
+	int fail = 0, ret_data;
+
+	/* Test Write Error at offset 0 */
+	if (!writeEeprom(sp, 0, 0, 3))
+		fail = 1;
+
+	/* Test Write at offset 4f0 */
+	if (writeEeprom(sp, 0x4F0, 0x01234567, 3))
+		fail = 1;
+	if ((ret_data = readEeprom(sp, 0x4f0)) < 0)
+		fail = 1;
+
+	if (ret_data != 0x01234567)
+		fail = 1;
+
+	/* Reset the EEPROM data go FFFF */
+	writeEeprom(sp, 0x4F0, 0xFFFFFFFF, 3);
+
+	/* Test Write Request Error at offset 0x7c */
+	if (!writeEeprom(sp, 0x07C, 0, 3))
+		fail = 1;
+
+	/* Test Write Request at offset 0x7fc */
+	if (writeEeprom(sp, 0x7FC, 0x01234567, 3))
+		fail = 1;
+	if ((ret_data = readEeprom(sp, 0x7FC)) < 0)
+		fail = 1;
+
+	if (ret_data != 0x01234567)
+		fail = 1;
+
+	/* Reset the EEPROM data go FFFF */
+	writeEeprom(sp, 0x7FC, 0xFFFFFFFF, 3);
+
+	/* Test Write Error at offset 0x80 */
+	if (!writeEeprom(sp, 0x080, 0, 3))
+		fail = 1;
+
+	/* Test Write Error at offset 0xfc */
+	if (!writeEeprom(sp, 0x0FC, 0, 3))
+		fail = 1;
+
+	/* Test Write Error at offset 0x100 */
+	if (!writeEeprom(sp, 0x100, 0, 3))
+		fail = 1;
+
+	/* Test Write Error at offset 4ec */
+	if (!writeEeprom(sp, 0x4EC, 0, 3))
+		fail = 1;
+
+	*data = fail;
+	return 0;
+}
+
+/*
+ * Input Argument/s: 
+ *  sp - private member of the device structure, which is a pointer to the 
+ *   	s2io_nic structure.
+ *  data - variable that returns the result of each of the test conducted by 
+ *  	the driver.
+ * Return value:
+ *  '0' on success and -1 on failure.
+ * Description:
+ *  This invokes the MemBist test of the card. We give around
+ *  2 secs time for the Test to complete. If it's still not complete
+ *  within this peiod, we consider that the test failed. 
+ */
+static int s2io_bistTest(nic_t * sp, uint64_t * data)
+{
+	u8 bist = 0;
+	int cnt = 0, ret = -1;
+
+	pci_read_config_byte(sp->pdev, PCI_BIST, &bist);
+	bist |= PCI_BIST_START;
+	pci_write_config_word(sp->pdev, PCI_BIST, bist);
+
+	while (cnt < 20) {
+		pci_read_config_byte(sp->pdev, PCI_BIST, &bist);
+		if (!(bist & PCI_BIST_START)) {
+			*data = (bist & PCI_BIST_CODE_MASK);
+			ret = 0;
+			break;
+		}
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(HZ / 10);
+		cnt++;
+	}
+
+	return ret;
+}
+
+/*
+ * Input Argument/s: 
+ *  sp - private member of the device structure, which is a pointer to the 
+ *   	s2io_nic structure.
+ *  data - variable that returns the result of each of the test conducted by 
+ *  	the driver.
+ * Return value:
+ *  '0' on success.
+ * Description:
+ *  The function verifies the link state of the NIC and updates the input 
+ *  argument 'data' appropriately.
+ */
+static int s2io_linkTest(nic_t * sp, uint64_t * data)
+{
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0;
+	u64 val64;
+
+	val64 = readq(&bar0->adapter_status);
+	if (val64 & ADAPTER_STATUS_RMAC_LOCAL_FAULT)
+		*data = 1;
+
+	return 0;
+}
+
+/*
+ * Input Argument/s: 
+ *  sp - private member of the device structure, which is a pointer to the 
+ *   	s2io_nic structure.
+ *  data - variable that returns the result of each of the test conducted by 
+ *  	the driver.
+ * Return value:
+ *  '0' on success.
+ * Description:
+ *  This is one of the offline test that tests the read and write 
+ *  access to the RldRam chip on the NIC.
+ */
+static int s2io_rldramTest(nic_t * sp, uint64_t * data)
+{
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0;
+	u64 val64;
+	int cnt, iteration = 0, test_pass = 0;
+
+	val64 = readq(&bar0->adapter_control);
+	val64 &= ~ADAPTER_ECC_EN;
+	writeq(val64, &bar0->adapter_control);
+
+	val64 = readq(&bar0->mc_rldram_test_ctrl);
+	val64 |= MC_RLDRAM_TEST_MODE;
+	writeq(val64, &bar0->mc_rldram_test_ctrl);
+
+	val64 = readq(&bar0->mc_rldram_mrs);
+	val64 |= MC_RLDRAM_QUEUE_SIZE_ENABLE;
+	writeq(val64, &bar0->mc_rldram_mrs);
+
+	val64 |= MC_RLDRAM_MRS_ENABLE;
+	writeq(val64, &bar0->mc_rldram_mrs);
+
+	while (iteration < 2) {
+		val64 = 0x55555555aaaa0000ULL;
+		if (iteration == 1) {
+			val64 ^= 0xFFFFFFFFFFFF0000ULL;
+		}
+		writeq(val64, &bar0->mc_rldram_test_d0);
+
+		val64 = 0xaaaa5a5555550000ULL;
+		if (iteration == 1) {
+			val64 ^= 0xFFFFFFFFFFFF0000ULL;
+		}
+		writeq(val64, &bar0->mc_rldram_test_d1);
+
+		val64 = 0x55aaaaaaaa5a0000ULL;
+		if (iteration == 1) {
+			val64 ^= 0xFFFFFFFFFFFF0000ULL;
+		}
+		writeq(val64, &bar0->mc_rldram_test_d2);
+
+		val64 = (u64) (0x0000003fffff0000ULL);
+		writeq(val64, &bar0->mc_rldram_test_add);
+
+
+		val64 = MC_RLDRAM_TEST_MODE;
+		writeq(val64, &bar0->mc_rldram_test_ctrl);
+
+		val64 |=
+		    MC_RLDRAM_TEST_MODE | MC_RLDRAM_TEST_WRITE |
+		    MC_RLDRAM_TEST_GO;
+		writeq(val64, &bar0->mc_rldram_test_ctrl);
+
+		for (cnt = 0; cnt < 5; cnt++) {
+			val64 = readq(&bar0->mc_rldram_test_ctrl);
+			if (val64 & MC_RLDRAM_TEST_DONE)
+				break;
+			set_current_state(TASK_UNINTERRUPTIBLE);
+			schedule_timeout(HZ / 5);
+		}
+
+		if (cnt == 5)
+			break;
+
+		val64 = MC_RLDRAM_TEST_MODE;
+		writeq(val64, &bar0->mc_rldram_test_ctrl);
+
+		val64 |= MC_RLDRAM_TEST_MODE | MC_RLDRAM_TEST_GO;
+		writeq(val64, &bar0->mc_rldram_test_ctrl);
+
+		for (cnt = 0; cnt < 5; cnt++) {
+			val64 = readq(&bar0->mc_rldram_test_ctrl);
+			if (val64 & MC_RLDRAM_TEST_DONE)
+				break;
+			set_current_state(TASK_UNINTERRUPTIBLE);
+			schedule_timeout(HZ / 2);
+		}
+
+		if (cnt == 5)
+			break;
+
+		val64 = readq(&bar0->mc_rldram_test_ctrl);
+		if (val64 & MC_RLDRAM_TEST_PASS)
+			test_pass = 1;
+
+		iteration++;
+	}
+
+	if (!test_pass)
+		*data = 1;
+	else
+		*data = 0;
+
+	return 0;
+}
+
+/*
+ * Input Argument/s: 
+ *  sp - private member of the device structure, which is a pointer to the 
+ *   	s2io_nic structure.
+ *  ethtest - pointer to a ethtool command specific structure that will be
+ *  	returned to the user.
+ *  data - variable that returns the result of each of the test conducted by 
+ *  	the driver.
+ * Return value:
+ *  SUCCESS on success and an appropriate -1 on failure.
+ * Description:
+ *  This function conducts 6 tests ( 4 offline and 2 online) to determine
+ *  	the health of the card.
+ */
+static void s2io_ethtool_test(struct net_device *dev,
+			      struct ethtool_test *ethtest,
+			      uint64_t * data)
+{
+	nic_t *sp = dev->priv;
+	int orig_state = netif_running(sp->dev);
+
+	if (ethtest->flags == ETH_TEST_FL_OFFLINE) {
+		/* Offline Tests. */
+		if (orig_state) {
+			s2io_close(sp->dev);
+			s2io_set_swapper(sp);
+		} else
+			s2io_set_swapper(sp);
+
+		if (s2io_registerTest(sp, &data[0]))
+			ethtest->flags |= ETH_TEST_FL_FAILED;
+
+		s2io_reset(sp);
+		s2io_set_swapper(sp);
+
+		if (s2io_rldramTest(sp, &data[3]))
+			ethtest->flags |= ETH_TEST_FL_FAILED;
+
+		s2io_reset(sp);
+		s2io_set_swapper(sp);
+
+		if (s2io_eepromTest(sp, &data[1]))
+			ethtest->flags |= ETH_TEST_FL_FAILED;
+
+		if (s2io_bistTest(sp, &data[4]))
+			ethtest->flags |= ETH_TEST_FL_FAILED;
+
+		if (orig_state)
+			s2io_open(sp->dev);
+
+		data[2] = 0;
+	} else {
+		/* Online Tests. */
+		if (!orig_state) {
+			DBG_PRINT(ERR_DBG,
+				  "%s: is not up, cannot run test\n",
+				  dev->name);
+			data[0] = -1;
+			data[1] = -1;
+			data[2] = -1;
+			data[3] = -1;
+			data[4] = -1;
+		}
+
+		if (s2io_linkTest(sp, &data[2]))
+			ethtest->flags |= ETH_TEST_FL_FAILED;
+
+		data[0] = 0;
+		data[1] = 0;
+		data[3] = 0;
+		data[4] = 0;
+	}
+}
+
+static void s2io_get_ethtool_stats(struct net_device *dev,
+				   struct ethtool_stats *estats,
+				   u64 * tmp_stats)
+{
+	int i = 0;
+	nic_t *sp = dev->priv;
+	StatInfo_t *stat_info = sp->mac_control.StatsInfo;
+
+	tmp_stats[i++] = stat_info->tmac_frms;
+	tmp_stats[i++] = stat_info->tmac_data_octets;
+	tmp_stats[i++] = stat_info->tmac_drop_frms;
+	tmp_stats[i++] = stat_info->tmac_mcst_frms;
+	tmp_stats[i++] = stat_info->tmac_bcst_frms;
+	tmp_stats[i++] = stat_info->tmac_pause_ctrl_frms;
+	tmp_stats[i++] = stat_info->tmac_any_err_frms;
+	tmp_stats[i++] = stat_info->tmac_vld_ip_octets;
+	tmp_stats[i++] = stat_info->tmac_vld_ip;
+	tmp_stats[i++] = stat_info->tmac_drop_ip;
+	tmp_stats[i++] = stat_info->tmac_icmp;
+	tmp_stats[i++] = stat_info->tmac_rst_tcp;
+	tmp_stats[i++] = stat_info->tmac_tcp;
+	tmp_stats[i++] = stat_info->tmac_udp;
+	tmp_stats[i++] = stat_info->rmac_vld_frms;
+	tmp_stats[i++] = stat_info->rmac_data_octets;
+	tmp_stats[i++] = stat_info->rmac_fcs_err_frms;
+	tmp_stats[i++] = stat_info->rmac_drop_frms;
+	tmp_stats[i++] = stat_info->rmac_vld_mcst_frms;
+	tmp_stats[i++] = stat_info->rmac_vld_bcst_frms;
+	tmp_stats[i++] = stat_info->rmac_in_rng_len_err_frms;
+	tmp_stats[i++] = stat_info->rmac_long_frms;
+	tmp_stats[i++] = stat_info->rmac_pause_ctrl_frms;
+	tmp_stats[i++] = stat_info->rmac_discarded_frms;
+	tmp_stats[i++] = stat_info->rmac_usized_frms;
+	tmp_stats[i++] = stat_info->rmac_osized_frms;
+	tmp_stats[i++] = stat_info->rmac_frag_frms;
+	tmp_stats[i++] = stat_info->rmac_jabber_frms;
+	tmp_stats[i++] = stat_info->rmac_ip;
+	tmp_stats[i++] = stat_info->rmac_ip_octets;
+	tmp_stats[i++] = stat_info->rmac_hdr_err_ip;
+	tmp_stats[i++] = stat_info->rmac_drop_ip;
+	tmp_stats[i++] = stat_info->rmac_icmp;
+	tmp_stats[i++] = stat_info->rmac_tcp;
+	tmp_stats[i++] = stat_info->rmac_udp;
+	tmp_stats[i++] = stat_info->rmac_err_drp_udp;
+	tmp_stats[i++] = stat_info->rmac_pause_cnt;
+	tmp_stats[i++] = stat_info->rmac_accepted_ip;
+	tmp_stats[i++] = stat_info->rmac_err_tcp;
+}
+
+int s2io_ethtool_get_regs_len(struct net_device *dev)
+{
+	return (XENA_REG_SPACE);
+}
+
+
+u32 s2io_ethtool_get_rx_csum(struct net_device * dev)
+{
+	nic_t *sp = dev->priv;
+
+	return (sp->rx_csum);
+}
+int s2io_ethtool_set_rx_csum(struct net_device *dev, u32 data)
+{
+	nic_t *sp = dev->priv;
+
+	if (data)
+		sp->rx_csum = 1;
+	else
+		sp->rx_csum = 0;
+
+	return 0;
+}
+int s2io_get_eeprom_len(struct net_device *dev)
+{
+	return (XENA_EEPROM_SPACE);
+}
+
+int s2io_ethtool_self_test_count(struct net_device *dev)
+{
+	return (S2IO_TEST_LEN);
+}
+void s2io_ethtool_get_strings(struct net_device *dev,
+			      u32 stringset, u8 * data)
+{
+	switch (stringset) {
+	case ETH_SS_TEST:
+		memcpy(data, s2io_gstrings, S2IO_STRINGS_LEN);
+		break;
+	case ETH_SS_STATS:
+		memcpy(data, &ethtool_stats_keys,
+		       sizeof(ethtool_stats_keys));
+	}
+}
+static int s2io_ethtool_get_stats_count(struct net_device *dev)
+{
+	return (S2IO_STAT_LEN);
+}
+
+static struct ethtool_ops netdev_ethtool_ops = {
+	.get_settings = s2io_ethtool_gset,
+	.set_settings = s2io_ethtool_sset,
+	.get_drvinfo = s2io_ethtool_gdrvinfo,
+	.get_regs_len = s2io_ethtool_get_regs_len,
+	.get_regs = s2io_ethtool_gregs,
+	.get_link = ethtool_op_get_link,
+	.get_eeprom_len = s2io_get_eeprom_len,
+	.get_eeprom = s2io_ethtool_geeprom,
+	.set_eeprom = s2io_ethtool_seeprom,
+	.get_pauseparam = s2io_ethtool_getpause_data,
+	.set_pauseparam = s2io_ethtool_setpause_data,
+	.get_rx_csum = s2io_ethtool_get_rx_csum,
+	.set_rx_csum = s2io_ethtool_set_rx_csum,
+	.get_tx_csum = ethtool_op_get_tx_csum,
+	.set_tx_csum = ethtool_op_set_tx_csum,
+	.get_sg = ethtool_op_get_sg,
+	.set_sg = ethtool_op_set_sg,
+#ifdef NETIF_F_TSO
+	.get_tso = ethtool_op_get_tso,
+	.set_tso = ethtool_op_set_tso,
+#endif
+	.self_test_count = s2io_ethtool_self_test_count,
+	.self_test = s2io_ethtool_test,
+	.get_strings = s2io_ethtool_get_strings,
+	.phys_id = s2io_ethtool_idnic,
+	.get_stats_count = s2io_ethtool_get_stats_count,
+	.get_ethtool_stats = s2io_get_ethtool_stats
+};
+
+/*
+ *  Input Argument/s: 
+ *  dev -   Device pointer.
+ *  ifr -   An IOCTL specefic structure, that can contain a pointer to
+ *      a proprietary structure used to pass information to the driver.
+ *  cmd -   This is used to distinguish between the different commands that
+ *      can be passed to the IOCTL functions.
+ *  Return value:
+ *  '0' on success and an appropriate (-)ve integer as defined in errno.h
+ *  file on failure.
+ *  Description:
+ *  This function has support for ethtool, adding multiple MAC addresses on 
+ *  the NIC and some DBG commands for the util tool.
+ */
+int s2io_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
+{
+	return -EOPNOTSUPP;
+}
+
+/*
+ *  Input Argument/s: 
+ *   dev - device pointer.
+ *   new_mtu - the new MTU size for the device.
+ *  Return value:
+ *   '0' on success and an appropriate (-)ve integer as defined in errno.h
+ *   file on failure.
+ *  Description:
+ *   A driver entry point to change MTU size for the device. Before changing
+ *   the MTU the device must be stopped.
+ */
+int s2io_change_mtu(struct net_device *dev, int new_mtu)
+{
+	nic_t *sp = dev->priv;
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) sp->bar0;
+	register u64 val64;
+
+	if (netif_running(dev)) {
+		DBG_PRINT(ERR_DBG, "%s: Must be stopped to ", dev->name);
+		DBG_PRINT(ERR_DBG, "change its MTU \n");
+		return -EBUSY;
+	}
+
+	if ((new_mtu < MIN_MTU) || (new_mtu > S2IO_JUMBO_SIZE)) {
+		DBG_PRINT(ERR_DBG, "%s: MTU size is invalid.\n",
+			  dev->name);
+		return -EPERM;
+	}
+
+/* Set the new MTU into the PYLD register of the NIC */
+	val64 = new_mtu;
+	writeq(vBIT(val64, 2, 14), &bar0->rmac_max_pyld_len);
+
+	dev->mtu = new_mtu;
+
+	return 0;
+}
+
+/*
+ *  Input Argument/s: 
+ *  dev_adr - address of the device structure in dma_addr_t format.
+ *  Return value:
+ *  void.
+ *  Description:
+ *  This is the tasklet or the bottom half of the ISR. This is
+ *  an extension of the ISR which is scheduled by the scheduler to be run 
+ *  when the load on the CPU is low. All low priority tasks of the ISR can
+ *  be pushed into the tasklet. For now the tasklet is used only to 
+ *  replenish the Rx buffers in the Rx buffer descriptors.
+ */
+static void s2io_tasklet(unsigned long dev_addr)
+{
+	struct net_device *dev = (struct net_device *) dev_addr;
+	nic_t *sp = dev->priv;
+	int i, ret;
+	mac_info_t *mac_control;
+	struct config_param *config;
+
+	mac_control = &sp->mac_control;
+	config = &sp->config;
+
+	if (!TASKLET_IN_USE) {
+		for (i = 0; i < config->RxRingNum; i++) {
+			ret = fill_rx_buffers(sp, i);
+			if (ret == -ENOMEM) {
+				DBG_PRINT(ERR_DBG, "%s: Out of ",
+					  dev->name);
+				DBG_PRINT(ERR_DBG, "memory in tasklet\n");
+				return;
+			} else if (ret == -EFILL) {
+				DBG_PRINT(ERR_DBG,
+					  "%s: Rx Ring %d is full\n",
+					  dev->name, i);
+				return;
+			}
+		}
+		clear_bit(0, (unsigned long *) (&sp->tasklet_status));
+	}
+}
+
+
+/*
+ * Description:
+ * 
+ */
+static void s2io_set_link(unsigned long data)
+{
+	nic_t *nic = (nic_t *) data;
+	struct net_device *dev = nic->dev;
+	XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0;
+	register u64 val64, err_reg;
+
+	/* Allow a small delay for the NICs self initiated 
+	 * cleanup to complete.
+	 */
+	set_current_state(TASK_UNINTERRUPTIBLE);
+	schedule_timeout(HZ / 10);
+
+	val64 = readq(&bar0->adapter_status);
+	if (verify_xena_quiescence(val64, nic->device_enabled_once)) {
+		/* Acknowledge interrupt and clear the R1 register */
+		err_reg = readq(&bar0->mac_rmac_err_reg);
+		writeq(err_reg, &bar0->mac_rmac_err_reg);
+
+		if (LINK_IS_UP(val64)) {
+			val64 = readq(&bar0->adapter_control);
+			val64 |= ADAPTER_CNTL_EN;
+			writeq(val64, &bar0->adapter_control);
+			val64 |= ADAPTER_LED_ON;
+			writeq(val64, &bar0->adapter_control);
+			val64 = readq(&bar0->adapter_status);
+			if (!LINK_IS_UP(val64)) {
+				DBG_PRINT(ERR_DBG, "%s:", dev->name);
+				DBG_PRINT(ERR_DBG, " Link down");
+				DBG_PRINT(ERR_DBG, "after ");
+				DBG_PRINT(ERR_DBG, "enabling ");
+				DBG_PRINT(ERR_DBG, "device \n");
+			}
+			if (nic->device_enabled_once == FALSE) {
+				nic->device_enabled_once = TRUE;
+			}
+			s2io_link(nic, LINK_UP);
+		} else {
+			s2io_link(nic, LINK_DOWN);
+		}
+	} else {		/* NIC is not Quiescent. */
+		DBG_PRINT(ERR_DBG, "%s: Error: ", dev->name);
+		DBG_PRINT(ERR_DBG, "device is not Quiescent\n");
+		netif_stop_queue(dev);
+	}
+}
+
+/*
+ * Description:
+ * This function is scheduled to be run by the s2io_tx_watchdog
+ * function after 0.5 secs to reset the NIC. The idea is to reduce 
+ * the run time of the watch dog routine which is run holding a
+ * spin lock.
+ */
+static void s2io_restart_nic(unsigned long data)
+{
+	struct net_device *dev = (struct net_device *) data;
+	nic_t *sp = dev->priv;
+
+	s2io_close(dev);
+	sp->device_close_flag = TRUE;
+	s2io_open(dev);
+	DBG_PRINT(ERR_DBG,
+		  "%s: was reset by Tx watchdog timer.\n", dev->name);
+}
+
+/*
+ *  Input Argument/s: 
+ *  dev - device pointer.
+ *  Return value:
+ *  void
+ *  Description:
+ *  This function is triggered if the Tx Queue is stopped
+ *  for a pre-defined amount of time when the Interface is still up.
+ *  If the Interface is jammed in such a situation, the hardware is
+ *  reset (by s2io_close) and restarted again (by s2io_open) to
+ *  overcome any problem that might have been caused in the hardware.
+ */
+static void s2io_tx_watchdog(struct net_device *dev)
+{
+	nic_t *sp = dev->priv;
+
+	if (netif_carrier_ok(dev)) {
+		schedule_work(&sp->rst_timer_task);
+	}
+}
+
+/*
+ *  Input Argument/s: 
+ *   sp - private member of the device structure, which is a pointer to the 
+ *   s2io_nic structure.
+ *   skb - the socket buffer pointer.
+ *   len - length of the packet
+ *   cksum - FCS checksum of the frame.
+ *  ring_no - the ring from which this RxD was extracted.
+ *  Return value:
+ *   SUCCESS on success and -1 on failure.
+ *  Description: 
+ *   This function is called by the Tx interrupt serivce routine to perform 
+ *   some OS related operations on the SKB before passing it to the upper
+ *   layers. It mainly checks if the checksum is OK, if so adds it to the
+ *   SKBs cksum variable, increments the Rx packet count and passes the SKB
+ *   to the upper layer. If the checksum is wrong, it increments the Rx
+ *   packet error count, frees the SKB and returns error.
+ */
+static int rxOsmHandler(nic_t * sp, u16 len, RxD_t * rxdp, int ring_no)
+{
+	struct net_device *dev = (struct net_device *) sp->dev;
+	struct sk_buff *skb =
+	    (struct sk_buff *) ((unsigned long) rxdp->Host_Control);
+	u16 l3_csum, l4_csum;
+
+	l3_csum = RXD_GET_L3_CKSUM(rxdp->Control_1);
+	if ((rxdp->Control_1 & TCP_OR_UDP_FRAME) && (sp->rx_csum)) {
+		l4_csum = RXD_GET_L4_CKSUM(rxdp->Control_1);
+		if ((l3_csum == L3_CKSUM_OK) && (l4_csum == L4_CKSUM_OK)) {
+			/* NIC verifies if the Checksum of the received
+			 * frame is Ok or not and accordingly returns
+			 * a flag in the RxD.
+			 */
+			skb->ip_summed = CHECKSUM_UNNECESSARY;
+		} else {
+			/* 
+			 * Packet with erroneous checksum, let the 
+			 * upper layers deal with it.
+			 */
+			skb->ip_summed = CHECKSUM_NONE;
+		}
+	} else {
+		skb->ip_summed = CHECKSUM_NONE;
+	}
+
+	skb->dev = dev;
+	skb_put(skb, len);
+	skb->protocol = eth_type_trans(skb, dev);
+
+#ifdef CONFIG_S2IO_NAPI
+	netif_receive_skb(skb);
+#else
+	netif_rx(skb);
+#endif
+
+	dev->last_rx = jiffies;
+#if DEBUG_ON
+	sp->rxpkt_cnt++;
+#endif
+	sp->rx_pkt_count++;
+	sp->stats.rx_packets++;
+	sp->stats.rx_bytes += len;
+	sp->rxpkt_bytes += len;
+
+	atomic_dec(&sp->rx_bufs_left[ring_no]);
+	rxdp->Host_Control = 0;
+	return SUCCESS;
+}
+
+int check_for_txSpace(nic_t * sp)
+{
+	u32 put_off, get_off, queue_len;
+	int ret = TRUE, i;
+
+	for (i = 0; i < sp->config.TxFIFONum; i++) {
+		queue_len = sp->mac_control.tx_curr_put_info[i].fifo_len
+		    + 1;
+		put_off = sp->mac_control.tx_curr_put_info[i].offset;
+		get_off = sp->mac_control.tx_curr_get_info[i].offset;
+		if (((put_off + 1) % queue_len) == get_off) {
+			ret = FALSE;
+			break;
+		}
+	}
+
+	return ret;
+}
+
+/*
+*  Input Argument/s: 
+*   sp - private member of the device structure, which is a pointer to the 
+*   s2io_nic structure.
+*   link - inidicates whether link is UP/DOWN.
+*  Return value:
+*   void.
+*  Description:
+*   This function stops/starts the Tx queue depending on whether the link
+*   status of the NIC is is down or up. This is called by the Alarm interrupt 
+*  handler whenever a link change interrupt comes up. 
+*/
+void s2io_link(nic_t * sp, int link)
+{
+	struct net_device *dev = (struct net_device *) sp->dev;
+
+	if (link != sp->last_link_state) {
+		if (link == LINK_DOWN) {
+			DBG_PRINT(ERR_DBG, "%s: Link down\n", dev->name);
+			netif_carrier_off(dev);
+			netif_stop_queue(dev);
+		} else {
+			DBG_PRINT(ERR_DBG, "%s: Link Up\n", dev->name);
+			netif_carrier_on(dev);
+			if (check_for_txSpace(sp) == TRUE) {
+				/* Don't wake the queue, if we know there
+				 * are no free TxDs available.
+				 */
+				netif_wake_queue(dev);
+			}
+		}
+	}
+	sp->last_link_state = link;
+}
+
+/*
+*  Input Argument/s: 
+*   pdev - structure containing the PCI related information of the device.
+*  Return value:
+*   returns the revision ID of the device.
+*  Description:
+*   Function to identify the Revision ID of xena.
+*/
+int get_xena_rev_id(struct pci_dev *pdev)
+{
+	u8 id = 0;
+	int ret;
+	ret = pci_read_config_byte(pdev, PCI_REVISION_ID, (u8 *) & id);
+	return id;
+}
+
+/*
+*  Input Argument/s: 
+*   sp - private member of the device structure, which is a pointer to the 
+*   s2io_nic structure.
+*  Return value:
+*   void
+*  Description:
+*   This function initializes a few of the PCI and PCI-X configuration registers
+*   with recommended values.
+*/
+static void s2io_init_pci(nic_t * sp)
+{
+	u16 pci_cmd = 0;
+
+/* Enable Data Parity Error Recovery in PCI-X command register. */
+	pci_read_config_word(sp->pdev, PCIX_COMMAND_REGISTER,
+			     &(sp->pcix_cmd));
+	pci_write_config_word(sp->pdev, PCIX_COMMAND_REGISTER,
+			      (sp->pcix_cmd | 1));
+	pci_read_config_word(sp->pdev, PCIX_COMMAND_REGISTER,
+			     &(sp->pcix_cmd));
+
+/* Set the PErr Response bit in PCI command register. */
+	pci_read_config_word(sp->pdev, PCI_COMMAND, &pci_cmd);
+	pci_write_config_word(sp->pdev, PCI_COMMAND,
+			      (pci_cmd | PCI_COMMAND_PARITY));
+	pci_read_config_word(sp->pdev, PCI_COMMAND, &pci_cmd);
+
+/* Set user specified value in Latency Timer */
+	if (latency_timer) {
+		pci_write_config_byte(sp->pdev, PCI_LATENCY_TIMER,
+				      latency_timer);
+		pci_read_config_byte(sp->pdev, PCI_LATENCY_TIMER,
+				     &latency_timer);
+	}
+
+/* Set MMRB count to 4096 in PCI-X Command register. */
+	pci_write_config_word(sp->pdev, PCIX_COMMAND_REGISTER,
+			      (sp->pcix_cmd | 0x0C));
+	pci_read_config_word(sp->pdev, PCIX_COMMAND_REGISTER,
+			     &(sp->pcix_cmd));
+
+/* Setting Maximum outstanding splits to two for now. */
+	sp->pcix_cmd &= 0xFF1F;
+
+	sp->pcix_cmd |=
+	    XENA_MAX_OUTSTANDING_SPLITS(XENA_TWO_SPLIT_TRANSACTION);
+	pci_write_config_word(sp->pdev, PCIX_COMMAND_REGISTER,
+			      sp->pcix_cmd);
+	pci_read_config_word(sp->pdev, PCIX_COMMAND_REGISTER,
+			     &(sp->pcix_cmd));
+
+}
+
+MODULE_AUTHOR("Raghavendra Koushik <raghavendra.koushik@s2io.com>");
+MODULE_LICENSE("GPL");
+MODULE_PARM(ring_num, "1-" __MODULE_STRING(1) "i");
+MODULE_PARM(frame_len, "1-" __MODULE_STRING(8) "i");
+MODULE_PARM(ring_len, "1-" __MODULE_STRING(8) "i");
+MODULE_PARM(fifo_num, "1-" __MODULE_STRING(1) "i");
+MODULE_PARM(fifo_len, "1-" __MODULE_STRING(8) "i");
+MODULE_PARM(rx_prio, "1-" __MODULE_STRING(1) "i");
+MODULE_PARM(tx_prio, "1-" __MODULE_STRING(1) "i");
+MODULE_PARM(latency_timer, "1-" __MODULE_STRING(1) "i");
+
+/*
+*  Input Argument/s: 
+*   pdev - structure containing the PCI related information of the device.
+*   pre -  the List of PCI devices supported by the driver listed in s2io_tbl.
+*  Return value:
+*   returns '0' on success and negative on failure.
+*  Description:
+*  The function initializes an adapter identified by the pci_dec structure.
+*  All OS related initialization including memory and device structure and 
+*  initlaization of the device private variable is done. Also the swapper 
+*  control register is initialized to enable read and write into the I/O 
+*  registers of the device.
+*  
+*/
+static int __devinit
+s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre)
+{
+	nic_t *sp;
+	struct net_device *dev;
+	char *dev_name = "S2IO 10GE NIC";
+	int i, j, ret;
+	int dma_flag = FALSE;
+	u32 mac_up, mac_down;
+	u64 val64 = 0, tmp64 = 0;
+	XENA_dev_config_t *bar0 = NULL;
+	u16 subid;
+	mac_info_t *mac_control;
+	struct config_param *config;
+
+
+	if ((ret = pci_enable_device(pdev))) {
+		DBG_PRINT(ERR_DBG,
+			  "s2io_init_nic: pci_enable_device failed\n");
+		return ret;
+	}
+
+	if (!pci_set_dma_mask(pdev, 0xffffffffffffffffULL)) {
+		DBG_PRINT(INIT_DBG, "s2io_init_nic: Using 64bit DMA\n");
+		dma_flag = TRUE;
+		if (pci_set_consistent_dma_mask
+		    (pdev, 0xffffffffffffffffULL)) {
+			DBG_PRINT(ERR_DBG,
+				  "Unable to obtain 64bit DMA for \
+					consistent allocations\n");
+			pci_disable_device(pdev);
+			return -ENOMEM;
+		}
+	} else if (!pci_set_dma_mask(pdev, 0xffffffffUL)) {
+		DBG_PRINT(INIT_DBG, "s2io_init_nic: Using 32bit DMA\n");
+	} else {
+		pci_disable_device(pdev);
+		return -ENOMEM;
+	}
+
+	if (pci_request_regions(pdev, s2io_driver_name)) {
+		DBG_PRINT(ERR_DBG, "Request Regions failed\n"),
+		    pci_disable_device(pdev);
+		return -ENODEV;
+	}
+
+	dev = alloc_etherdev(sizeof(nic_t));
+	if (dev == NULL) {
+		DBG_PRINT(ERR_DBG, "Device allocation failed\n");
+		pci_disable_device(pdev);
+		pci_release_regions(pdev);
+		return -ENODEV;
+	}
+
+	pci_set_master(pdev);
+	pci_set_drvdata(pdev, dev);
+	SET_MODULE_OWNER(dev);
+	SET_NETDEV_DEV(dev, &pdev->dev);
+
+	/*  Private member variable initialized to s2io NIC structure */
+	sp = dev->priv;
+	memset(sp, 0, sizeof(nic_t));
+	sp->dev = dev;
+	sp->pdev = pdev;
+	sp->vendor_id = pdev->vendor;
+	sp->device_id = pdev->device;
+	sp->high_dma_flag = dma_flag;
+	sp->irq = pdev->irq;
+	sp->device_enabled_once = FALSE;
+	strcpy(sp->name, dev_name);
+
+	/* Initialize some PCI/PCI-X fields of the NIC. */
+	s2io_init_pci(sp);
+
+	/* Setting the device configuration parameters.
+	 * Most of these parameters can be specified by the user during 
+	 * module insertion as they are module loadable parameters. If 
+	 * these parameters are not not specified during load time, they 
+	 * are initialized with default values.
+	 */
+	mac_control = &sp->mac_control;
+	config = &sp->config;
+
+	/* Tx side parameters. */
+	config->TxFIFONum = fifo_num ? fifo_num : 1;
+
+	if (!fifo_len[0] && (fifo_num > 1)) {
+		printk(KERN_ERR "Fifo Lens not specified for all FIFOs\n");
+		goto init_failed;
+	}
+
+	if (fifo_len[0]) {
+		int cnt;
+
+		for (cnt = 0; fifo_len[cnt]; cnt++);
+		if (fifo_num) {
+			if (cnt < fifo_num) {
+				printk(KERN_ERR
+				       "Fifo Lens not specified for ");
+				printk(KERN_ERR "all FIFOs\n");
+				goto init_failed;
+			}
+		}
+		for (cnt = 0; cnt < config->TxFIFONum; cnt++) {
+			config->TxCfg[cnt].FifoLen = fifo_len[cnt];
+			config->TxCfg[cnt].FifoPriority = cnt;
+		}
+	} else {
+		config->TxCfg[0].FifoLen = DEFAULT_FIFO_LEN;
+		config->TxCfg[0].FifoPriority = 0;
+	}
+
+	config->TxIntrType = TXD_INT_TYPE_UTILZ;
+	for (i = 0; i < config->TxFIFONum; i++) {
+		if (config->TxCfg[i].FifoLen < 65) {
+			config->TxIntrType = TXD_INT_TYPE_PER_LIST;
+			break;
+		}
+	}
+
+	config->TxCfg[0].fNoSnoop = (NO_SNOOP_TXD | NO_SNOOP_TXD_BUFFER);
+	config->MaxTxDs = MAX_SKB_FRAGS;
+	config->TxFlow = TRUE;
+
+	/* Rx side parameters. */
+	config->RxRingNum = ring_num ? ring_num : 1;
+
+	if (ring_len[0]) {
+		int cnt;
+		for (cnt = 0; cnt < config->RxRingNum; cnt++) {
+			config->RxCfg[cnt].NumRxd = ring_len[cnt];
+			config->RxCfg[cnt].RingPriority = cnt;
+		}
+	} else {
+		int id;
+		if ((id = get_xena_rev_id(pdev)) == 1) {
+			config->RxCfg[0].NumRxd = LARGE_RXD_CNT;
+
+		} else {
+			config->RxCfg[0].NumRxd = SMALL_RXD_CNT;
+		}
+		config->RxCfg[0].RingPriority = 0;
+	}
+	config->RxCfg[0].RingOrg = RING_ORG_BUFF1;
+	config->RxCfg[0].RxdThresh = DEFAULT_RXD_THRESHOLD;
+	config->RxCfg[0].fNoSnoop = (NO_SNOOP_RXD | NO_SNOOP_RXD_BUFFER);
+	config->RxCfg[0].RxD_BackOff_Interval = TBD;
+	config->RxFlow = TRUE;
+
+	/* Miscellaneous parameters. */
+	config->RxVLANEnable = TRUE;
+	config->MTU = MAX_MTU_VLAN;
+	config->JumboEnable = FALSE;
+
+	/*  Setting Mac Control parameters */
+	mac_control->txdl_len = MAX_SKB_FRAGS;
+	mac_control->rmac_pause_time = 0;
+
+	/* Initialize Ring buffer parameters. */
+	for (i = 0; i < config->RxRingNum; i++)
+		atomic_set(&sp->rx_bufs_left[i], 0);
+
+	/*  initialize the shared memory used by the NIC and the host */
+	if (initSharedMem(sp)) {
+		DBG_PRINT(ERR_DBG, "%s: Memory allocation failed\n",
+			  dev->name);
+		goto mem_alloc_failed;
+	}
+
+	sp->bar0 = (caddr_t) ioremap(pci_resource_start(pdev, 0),
+				     pci_resource_len(pdev, 0));
+	if (!sp->bar0) {
+		DBG_PRINT(ERR_DBG, "%s: S2IO: cannot remap io mem1\n",
+			  dev->name);
+		goto bar0_remap_failed;
+	}
+
+	sp->bar1 = (caddr_t) ioremap(pci_resource_start(pdev, 2),
+				     pci_resource_len(pdev, 2));
+	if (!sp->bar1) {
+		DBG_PRINT(ERR_DBG, "%s: S2IO: cannot remap io mem2\n",
+			  dev->name);
+		goto bar1_remap_failed;
+	}
+
+	dev->irq = pdev->irq;
+	dev->base_addr = (unsigned long) sp->bar0;
+
+	/* Initializing the BAR1 address as the start of the FIFO pointer. */
+	for (j = 0; j < MAX_TX_FIFOS; j++) {
+		mac_control->tx_FIFO_start[j] = (TxFIFO_element_t *)
+		    (sp->bar1 + (j * 0x00020000));
+	}
+
+	/*  Driver entry points */
+	dev->open = &s2io_open;
+	dev->stop = &s2io_close;
+	dev->hard_start_xmit = &s2io_xmit;
+	dev->get_stats = &s2io_get_stats;
+	dev->set_multicast_list = &s2io_set_multicast;
+	dev->do_ioctl = &s2io_ioctl;
+	dev->change_mtu = &s2io_change_mtu;
+	SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
+
+	/*
+	 * will use eth_mac_addr() for  dev->set_mac_address
+	 * mac address will be set every time dev->open() is called
+	 */
+#ifdef CONFIG_S2IO_NAPI
+	dev->poll = s2io_poll;
+	dev->weight = 128;	/* For now. */
+#endif
+
+	dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;
+	if (sp->high_dma_flag == TRUE)
+		dev->features |= NETIF_F_HIGHDMA;
+#ifdef NETIF_F_TSO
+	dev->features |= NETIF_F_TSO;
+#endif
+
+	dev->tx_timeout = &s2io_tx_watchdog;
+	dev->watchdog_timeo = WATCH_DOG_TIMEOUT;
+	INIT_WORK(&sp->rst_timer_task,
+		  (void (*)(void *)) s2io_restart_nic, dev);
+	INIT_WORK(&sp->set_link_task,
+		  (void (*)(void *)) s2io_set_link, sp);
+
+	if (register_netdev(dev)) {
+		DBG_PRINT(ERR_DBG, "Device registration failed\n");
+		goto register_failed;
+	}
+
+	pci_save_state(sp->pdev, sp->config_space);
+
+	/* Setting swapper control on the NIC, for proper reset operation */
+	if (s2io_set_swapper(sp)) {
+		DBG_PRINT(ERR_DBG, "%s:swapper settings are wrong\n",
+			  dev->name);
+		goto set_swap_failed;
+	}
+
+	/* Fix for all "FFs" MAC address problems observed on Alpha platforms */
+	FixMacAddress(sp);
+	s2io_reset(sp);
+
+	/* Setting swapper control on the NIC, so the MAC address can be read.
+	 */
+	if (s2io_set_swapper(sp)) {
+		DBG_PRINT(ERR_DBG,
+			  "%s: S2IO: swapper settings are wrong\n",
+			  dev->name);
+		goto set_swap_failed;
+	}
+
+	/*  MAC address initialization.
+	 *  For now only one mac address will be read and used.
+	 */
+	bar0 = (XENA_dev_config_t *) sp->bar0;
+	val64 = RMAC_ADDR_CMD_MEM_RD | RMAC_ADDR_CMD_MEM_STROBE_NEW_CMD |
+	    RMAC_ADDR_CMD_MEM_OFFSET(0 + MAC_MAC_ADDR_START_OFFSET);
+	writeq(val64, &bar0->rmac_addr_cmd_mem);
+	waitForCmdComplete(sp);
+
+	tmp64 = readq(&bar0->rmac_addr_data0_mem);
+	mac_down = (u32) tmp64;
+	mac_up = (u32) (tmp64 >> 32);
+
+	memset(sp->defMacAddr[0].mac_addr, 0, sizeof(ETH_ALEN));
+
+	sp->defMacAddr[0].mac_addr[3] = (u8) (mac_up);
+	sp->defMacAddr[0].mac_addr[2] = (u8) (mac_up >> 8);
+	sp->defMacAddr[0].mac_addr[1] = (u8) (mac_up >> 16);
+	sp->defMacAddr[0].mac_addr[0] = (u8) (mac_up >> 24);
+	sp->defMacAddr[0].mac_addr[5] = (u8) (mac_down >> 16);
+	sp->defMacAddr[0].mac_addr[4] = (u8) (mac_down >> 24);
+
+	DBG_PRINT(INIT_DBG,
+		  "DEFAULT MAC ADDR:0x%02x-%02x-%02x-%02x-%02x-%02x\n",
+		  sp->defMacAddr[0].mac_addr[0],
+		  sp->defMacAddr[0].mac_addr[1],
+		  sp->defMacAddr[0].mac_addr[2],
+		  sp->defMacAddr[0].mac_addr[3],
+		  sp->defMacAddr[0].mac_addr[4],
+		  sp->defMacAddr[0].mac_addr[5]);
+
+	/*  Set the factory defined MAC address initially   */
+	dev->addr_len = ETH_ALEN;
+	memcpy(dev->dev_addr, sp->defMacAddr, ETH_ALEN);
+
+	/*  Initialize the tasklet status flag */
+	atomic_set(&(sp->tasklet_status), 0);
+
+
+	/* Initialize spinlocks */
+	spin_lock_init(&sp->isr_lock);
+	spin_lock_init(&sp->tx_lock);
+
+	/* SXE-002: Configure link and activity LED to init state 
+	 * on driver load. 
+	 */
+	subid = sp->pdev->subsystem_device;
+	if ((subid & 0xFF) >= 0x07) {
+		val64 = readq(&bar0->gpio_control);
+		val64 |= 0x0000800000000000ULL;
+		writeq(val64, &bar0->gpio_control);
+		val64 = 0x0411040400000000ULL;
+		writeq(val64, (u64 *) ((u8 *) bar0 + 0x2700));
+		val64 = readq(&bar0->gpio_control);
+	}
+
+	/* Make Link state as off at this point, when the Link change 
+	 * interrupt comes the state will be automatically changed to 
+	 * the right state.
+	 */
+	netif_carrier_off(dev);
+	sp->last_link_state = LINK_DOWN;
+
+	sp->rx_csum = 1;	/* Rx chksum verify enabled by default */
+
+	return 0;
+
+      set_swap_failed:
+	unregister_netdev(dev);
+      register_failed:
+	iounmap(sp->bar1);
+      bar1_remap_failed:
+	iounmap(sp->bar0);
+      bar0_remap_failed:
+      mem_alloc_failed:
+	freeSharedMem(sp);
+      init_failed:
+	pci_disable_device(pdev);
+	pci_release_regions(pdev);
+	pci_set_drvdata(pdev, NULL);
+	free_netdev(dev);
+
+	return -ENODEV;
+}
+
+/*
+*  Input Argument/s: 
+*   pdev - structure containing the PCI related information of the device.
+*  Return value:
+*  void
+*  Description:
+*  This function is called by the Pci subsystem to release a PCI device 
+*  and free up all resource held up by the device. This could be in response 
+*  to a Hot plug event or when the driver is to be removed from memory.
+*/
+static void __exit s2io_rem_nic(struct pci_dev *pdev)
+{
+	struct net_device *dev =
+	    (struct net_device *) pci_get_drvdata(pdev);
+	nic_t *sp;
+
+	if (dev == NULL) {
+		DBG_PRINT(ERR_DBG, "Driver Data is NULL!!\n");
+		return;
+	}
+	sp = dev->priv;
+	freeSharedMem(sp);
+	iounmap(sp->bar0);
+	iounmap(sp->bar1);
+	pci_disable_device(pdev);
+	pci_release_regions(pdev);
+	pci_set_drvdata(pdev, NULL);
+
+	unregister_netdev(dev);
+
+	free_netdev(dev);
+}
+
+int __init s2io_starter(void)
+{
+	return pci_module_init(&s2io_driver);
+}
+
+void s2io_closer(void)
+{
+	pci_unregister_driver(&s2io_driver);
+	DBG_PRINT(INIT_DBG, "cleanup done\n");
+}
+
+module_init(s2io_starter);
+module_exit(s2io_closer);
--- diff/drivers/net/s2io.h	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/net/s2io.h	2004-04-21 10:45:34.450466232 +0100
@@ -0,0 +1,855 @@
+/************************************************************************
+ * s2io.h: A Linux PCI-X Ethernet driver for S2IO 10GbE Server NIC
+ * Copyright 2002 Raghavendra Koushik (raghavendra.koushik@s2io.com)
+
+ * This software may be used and distributed according to the terms of
+ * the GNU General Public License (GPL), incorporated herein by reference.
+ * Drivers based on or derived from this code fall under the GPL and must
+ * retain the authorship, copyright and license notice.  This file is not
+ * a complete program and may only be used when the entire operating
+ * system is licensed under the GPL.
+ * See the file COPYING in this distribution for more information.
+ ************************************************************************/
+#ifndef _S2IO_H
+#define _S2IO_H
+
+#define TBD 0
+#define BIT(loc)		(0x8000000000000000ULL >> (loc))
+#define vBIT(val, loc, sz)	(((u64)val) << (64-loc-sz))
+
+#ifndef BOOL
+#define BOOL    int
+#endif
+
+#ifndef TRUE
+#define TRUE    1
+#define FALSE   0
+#endif
+
+#undef SUCCESS
+#define SUCCESS 0
+#define FAILURE -1
+
+/* Maximum outstanding splits to be configured into xena. */
+typedef enum xena_max_outstanding_splits {
+	XENA_ONE_SPLIT_TRANSACTION = 0,
+	XENA_TWO_SPLIT_TRANSACTION = 1,
+	XENA_THREE_SPLIT_TRANSACTION = 2,
+	XENA_FOUR_SPLIT_TRANSACTION = 3,
+	XENA_EIGHT_SPLIT_TRANSACTION = 4,
+	XENA_TWELVE_SPLIT_TRANSACTION = 5,
+	XENA_SIXTEEN_SPLIT_TRANSACTION = 6,
+	XENA_THIRTYTWO_SPLIT_TRANSACTION = 7
+} xena_max_outstanding_splits;
+#define XENA_MAX_OUTSTANDING_SPLITS(n) (n << 4)
+
+/*  OS concerned variables and constants */
+#define WATCH_DOG_TIMEOUT   	5*HZ
+#define EFILL       			0x1234
+#define ALIGN_SIZE  			127
+#define	PCIX_COMMAND_REGISTER	0x62
+
+/*
+ * Debug related variables.
+ */
+#define DEBUG_ON TRUE
+
+/* different debug levels. */
+#define	ERR_DBG		0
+#define	INIT_DBG	1
+#define	INFO_DBG	2
+#define	TX_DBG		3
+#define	INTR_DBG	4
+
+/* Global variable that defines the present debug level of the driver. */
+int debug_level = ERR_DBG;	/* Default level. */
+
+/* DEBUG message print. */
+#define DBG_PRINT(dbg_level, args...)  if(!(debug_level<dbg_level)) printk(args)
+
+/* Protocol assist features of the NIC */
+#define L3_CKSUM_OK 0xFFFF
+#define L4_CKSUM_OK 0xFFFF
+#define S2IO_JUMBO_SIZE 9600
+
+/* The statistics block of Xena */
+typedef struct stat_block {
+#ifdef  __BIG_ENDIAN
+/* Tx MAC statistics counters. */
+	u32 tmac_frms;
+	u32 tmac_data_octets;
+	u64 tmac_drop_frms;
+	u32 tmac_mcst_frms;
+	u32 tmac_bcst_frms;
+	u64 tmac_pause_ctrl_frms;
+	u32 tmac_ttl_octets;
+	u32 tmac_ucst_frms;
+	u32 tmac_nucst_frms;
+	u32 tmac_any_err_frms;
+	u64 tmac_ttl_less_fb_octets;
+	u64 tmac_vld_ip_octets;
+	u32 tmac_vld_ip;
+	u32 tmac_drop_ip;
+	u32 tmac_icmp;
+	u32 tmac_rst_tcp;
+	u64 tmac_tcp;
+	u32 tmac_udp;
+	u32 reserved_0;
+
+/* Rx MAC Statistics counters. */
+	u32 rmac_vld_frms;
+	u32 rmac_data_octets;
+	u64 rmac_fcs_err_frms;
+	u64 rmac_drop_frms;
+	u32 rmac_vld_mcst_frms;
+	u32 rmac_vld_bcst_frms;
+	u32 rmac_in_rng_len_err_frms;
+	u32 rmac_out_rng_len_err_frms;
+	u64 rmac_long_frms;
+	u64 rmac_pause_ctrl_frms;
+	u64 rmac_unsup_ctrl_frms;
+	u32 rmac_ttl_octets;
+	u32 rmac_accepted_ucst_frms;
+	u32 rmac_accepted_nucst_frms;
+	u32 rmac_discarded_frms;
+	u32 rmac_drop_events;
+	u32 reserved_1;
+	u64 rmac_ttl_less_fb_octets;
+	u64 rmac_ttl_frms;
+	u64 reserved_2;
+	u32 reserved_3;
+	u32 rmac_usized_frms;
+	u32 rmac_osized_frms;
+	u32 rmac_frag_frms;
+	u32 rmac_jabber_frms;
+	u32 reserved_4;
+	u64 rmac_ttl_64_frms;
+	u64 rmac_ttl_65_127_frms;
+	u64 reserved_5;
+	u64 rmac_ttl_128_255_frms;
+	u64 rmac_ttl_256_511_frms;
+	u64 reserved_6;
+	u64 rmac_ttl_512_1023_frms;
+	u64 rmac_ttl_1024_1518_frms;
+	u32 reserved_7;
+	u32 rmac_ip;
+	u64 rmac_ip_octets;
+	u32 rmac_hdr_err_ip;
+	u32 rmac_drop_ip;
+	u32 rmac_icmp;
+	u32 reserved_8;
+	u64 rmac_tcp;
+	u32 rmac_udp;
+	u32 rmac_err_drp_udp;
+	u64 rmac_xgmii_err_sym;
+	u64 rmac_frms_q0;
+	u64 rmac_frms_q1;
+	u64 rmac_frms_q2;
+	u64 rmac_frms_q3;
+	u64 rmac_frms_q4;
+	u64 rmac_frms_q5;
+	u64 rmac_frms_q6;
+	u64 rmac_frms_q7;
+	u16 rmac_full_q0;
+	u16 rmac_full_q1;
+	u16 rmac_full_q2;
+	u16 rmac_full_q3;
+	u16 rmac_full_q4;
+	u16 rmac_full_q5;
+	u16 rmac_full_q6;
+	u16 rmac_full_q7;
+	u32 rmac_pause_cnt;
+	u32 reserved_9;
+	u64 rmac_xgmii_data_err_cnt;
+	u64 rmac_xgmii_ctrl_err_cnt;
+	u32 rmac_accepted_ip;
+	u32 rmac_err_tcp;
+
+/* PCI/PCI-X Read transaction statistics. */
+	u32 rd_req_cnt;
+	u32 new_rd_req_cnt;
+	u32 new_rd_req_rtry_cnt;
+	u32 rd_rtry_cnt;
+	u32 wr_rtry_rd_ack_cnt;
+
+/* PCI/PCI-X write transaction statistics. */
+	u32 wr_req_cnt;
+	u32 new_wr_req_cnt;
+	u32 new_wr_req_rtry_cnt;
+	u32 wr_rtry_cnt;
+	u32 wr_disc_cnt;
+	u32 rd_rtry_wr_ack_cnt;
+
+/*	DMA Transaction statistics. */
+	u32 txp_wr_cnt;
+	u32 txd_rd_cnt;
+	u32 txd_wr_cnt;
+	u32 rxd_rd_cnt;
+	u32 rxd_wr_cnt;
+	u32 txf_rd_cnt;
+	u32 rxf_wr_cnt;
+#else
+/* Tx MAC statistics counters. */
+	u32 tmac_data_octets;
+	u32 tmac_frms;
+	u64 tmac_drop_frms;
+	u32 tmac_bcst_frms;
+	u32 tmac_mcst_frms;
+	u64 tmac_pause_ctrl_frms;
+	u32 tmac_ucst_frms;
+	u32 tmac_ttl_octets;
+	u32 tmac_any_err_frms;
+	u32 tmac_nucst_frms;
+	u64 tmac_ttl_less_fb_octets;
+	u64 tmac_vld_ip_octets;
+	u32 tmac_drop_ip;
+	u32 tmac_vld_ip;
+	u32 tmac_rst_tcp;
+	u32 tmac_icmp;
+	u64 tmac_tcp;
+	u32 reserved_0;
+	u32 tmac_udp;
+
+/* Rx MAC Statistics counters. */
+	u32 rmac_data_octets;
+	u32 rmac_vld_frms;
+	u64 rmac_fcs_err_frms;
+	u64 rmac_drop_frms;
+	u32 rmac_vld_bcst_frms;
+	u32 rmac_vld_mcst_frms;
+	u32 rmac_out_rng_len_err_frms;
+	u32 rmac_in_rng_len_err_frms;
+	u64 rmac_long_frms;
+	u64 rmac_pause_ctrl_frms;
+	u64 rmac_unsup_ctrl_frms;
+	u32 rmac_accepted_ucst_frms;
+	u32 rmac_ttl_octets;
+	u32 rmac_discarded_frms;
+	u32 rmac_accepted_nucst_frms;
+	u32 reserved_1;
+	u32 rmac_drop_events;
+	u64 rmac_ttl_less_fb_octets;
+	u64 rmac_ttl_frms;
+	u64 reserved_2;
+	u32 rmac_usized_frms;
+	u32 reserved_3;
+	u32 rmac_frag_frms;
+	u32 rmac_osized_frms;
+	u32 reserved_4;
+	u32 rmac_jabber_frms;
+	u64 rmac_ttl_64_frms;
+	u64 rmac_ttl_65_127_frms;
+	u64 reserved_5;
+	u64 rmac_ttl_128_255_frms;
+	u64 rmac_ttl_256_511_frms;
+	u64 reserved_6;
+	u64 rmac_ttl_512_1023_frms;
+	u64 rmac_ttl_1024_1518_frms;
+	u32 rmac_ip;
+	u32 reserved_7;
+	u64 rmac_ip_octets;
+	u32 rmac_drop_ip;
+	u32 rmac_hdr_err_ip;
+	u32 reserved_8;
+	u32 rmac_icmp;
+	u64 rmac_tcp;
+	u32 rmac_err_drp_udp;
+	u32 rmac_udp;
+	u64 rmac_xgmii_err_sym;
+	u64 rmac_frms_q0;
+	u64 rmac_frms_q1;
+	u64 rmac_frms_q2;
+	u64 rmac_frms_q3;
+	u64 rmac_frms_q4;
+	u64 rmac_frms_q5;
+	u64 rmac_frms_q6;
+	u64 rmac_frms_q7;
+	u16 rmac_full_q3;
+	u16 rmac_full_q2;
+	u16 rmac_full_q1;
+	u16 rmac_full_q0;
+	u16 rmac_full_q7;
+	u16 rmac_full_q6;
+	u16 rmac_full_q5;
+	u16 rmac_full_q4;
+	u32 reserved_9;
+	u32 rmac_pause_cnt;
+	u64 rmac_xgmii_data_err_cnt;
+	u64 rmac_xgmii_ctrl_err_cnt;
+	u32 rmac_err_tcp;
+	u32 rmac_accepted_ip;
+
+/* PCI/PCI-X Read transaction statistics. */
+	u32 new_rd_req_cnt;
+	u32 rd_req_cnt;
+	u32 rd_rtry_cnt;
+	u32 new_rd_req_rtry_cnt;
+
+/* PCI/PCI-X Write/Read transaction statistics. */
+	u32 wr_req_cnt;
+	u32 wr_rtry_rd_ack_cnt;
+	u32 new_wr_req_rtry_cnt;
+	u32 new_wr_req_cnt;
+	u32 wr_disc_cnt;
+	u32 wr_rtry_cnt;
+
+/*	PCI/PCI-X Write / DMA Transaction statistics. */
+	u32 txp_wr_cnt;
+	u32 rd_rtry_wr_ack_cnt;
+	u32 txd_wr_cnt;
+	u32 txd_rd_cnt;
+	u32 rxd_wr_cnt;
+	u32 rxd_rd_cnt;
+	u32 rxf_wr_cnt;
+	u32 txf_rd_cnt;
+#endif
+} StatInfo_t;
+
+/* Structures representing different init time configuration
+ * parameters of the NIC.
+ */
+
+/* Maintains Per FIFO related information. */
+typedef struct tx_fifo_config {
+#define	MAX_AVAILABLE_TXDS	8192
+	u32 FifoLen;		/* specifies len of FIFO upto 8192, ie no of TxDLs */
+/* Priority definition */
+#define TX_FIFO_PRI_0               0	/*Highest */
+#define TX_FIFO_PRI_1               1
+#define TX_FIFO_PRI_2               2
+#define TX_FIFO_PRI_3               3
+#define TX_FIFO_PRI_4               4
+#define TX_FIFO_PRI_5               5
+#define TX_FIFO_PRI_6               6
+#define TX_FIFO_PRI_7               7	/*lowest */
+	u8 FifoPriority;	/* specifies pointer level for FIFO */
+	/* user should not set twos fifos with same pri */
+	u8 fNoSnoop;
+#define NO_SNOOP_TXD                0x01
+#define NO_SNOOP_TXD_BUFFER          0x02
+} tx_fifo_config_t;
+
+
+/* Maintains per Ring related information */
+typedef struct rx_ring_config {
+	u32 NumRxd;		/*No of RxDs per Rx Ring */
+#define RX_RING_PRI_0               0	/* highest */
+#define RX_RING_PRI_1               1
+#define RX_RING_PRI_2               2
+#define RX_RING_PRI_3               3
+#define RX_RING_PRI_4               4
+#define RX_RING_PRI_5               5
+#define RX_RING_PRI_6               6
+#define RX_RING_PRI_7               7	/* lowest */
+
+	u8 RingPriority;	/*Specifies service priority of ring */
+	/* OSM should not set any two rings with same priority */
+	u8 RingOrg;		/*Organization of ring */
+#define RING_ORG_BUFF1           0x01
+#define RX_RING_ORG_BUFF3           0x03
+#define RX_RING_ORG_BUFF5           0x05
+
+/* In case of 3 buffer recv. mode, size of three buffers is expected as.. */
+#define BUFF_SZ_1                   22	/* ethernet header */
+#define BUFF_SZ_2                   (64+64)	/* max. IP+TCP header size */
+#define BUFF_SZ_3                   (1500-20-20)	/* TCP payload */
+#define BUFF_SZ_3_JUMBO             (9600-20-20)	/* Jumbo TCP payload */
+
+	u32 RxdThresh;		/*No of used Rxds NIC can store before transfer to host */
+#define DEFAULT_RXD_THRESHOLD       0x1	/* TODO */
+	u8 fNoSnoop;
+#define NO_SNOOP_RXD                0x01
+#define NO_SNOOP_RXD_BUFFER         0x02
+	u32 RxD_BackOff_Interval;
+#define RXD_BACKOFF_INTERVAL_DEF        0x0
+#define RXD_BACKOFF_INTERVAL_MIN        0x0
+#define RXD_BACKOFF_INTERVAL_MAX        0x0
+} rx_ring_config_t;
+
+/* This structure provides contains values of the tunable parameters 
+ * of the H/W 
+ */
+struct config_param {
+
+/* Tx Side */
+	u32 TxFIFONum;		/*Number of Tx FIFOs */
+#define MAX_TX_FIFOS 8
+
+	tx_fifo_config_t TxCfg[MAX_TX_FIFOS];	/*Per-Tx FIFO config */
+	u32 MaxTxDs;		/*Max no. of Tx buffer descriptor per TxDL */
+	BOOL TxVLANEnable;	/*TRUE: Insert VLAN ID, FALSE: Don't insert */
+#define TX_REQ_TIMEOUT_DEFAULT          0x0
+#define TX_REQ_TIMEOUT_MIN              0x0
+#define TX_REQ_TIMEOUT_MAX              0x0
+	u32 TxReqTimeOut;
+	BOOL TxFlow;		/*Tx flow control enable */
+	BOOL RxFlow;
+	BOOL OverrideTxServiceState;	/* TRUE: Overide, FALSE: Do not override 
+					   Use the new priority information
+					   of service state. It is not recommended
+					   to change but OSM can opt to do so */
+#define MAX_SERVICE_STATES  36
+	u8 TxServiceState[MAX_SERVICE_STATES];
+	/* Array element represent 'priority' 
+	 * and array index represents
+	 *  'Service state' e.g. 
+	 *  TxServiceState[3]=7; it means 
+	 *  Service state 3 is associated 
+	 *  with priority 7 of a Tx FIFO */
+	u64 TxIntrType;		/* Specifies if Tx Intr is UTILZ or PER_LIST type. */
+
+/* Rx Side */
+	u32 RxRingNum;		/*Number of receive rings */
+#define MAX_RX_RINGS 8
+#define MAX_RX_BLOCKS_PER_RING  150
+
+	rx_ring_config_t RxCfg[MAX_RX_RINGS];	/*Per-Rx Ring config */
+	BOOL RxVLANEnable;	/*TRUE: Strip off VLAN tag from the frame,
+				   FALSE: Don't strip off VLAN tag */
+
+#define HEADER_ETHERNET_II_802_3_SIZE 14
+#define HEADER_802_2_SIZE              3
+#define HEADER_SNAP_SIZE               5
+#define HEADER_VLAN_SIZE               4
+#define HEADER_ALIGN_LAYER_3           2
+
+#define MIN_MTU                       46
+#define MAX_PYLD                    1500
+#define MAX_MTU                     (MAX_PYLD+18)
+#define MAX_MTU_VLAN                (MAX_PYLD+22)
+#define MAX_PYLD_JUMBO              9600
+#define MAX_MTU_JUMBO               (MAX_PYLD_JUMBO+18)
+#define MAX_MTU_JUMBO_VLAN          (MAX_PYLD_JUMBO+22)
+	u32 MTU;		/*Maximum Payload */
+	BOOL JumboEnable;	/*Enable Jumbo frames recv/send */
+	BOOL OverrideRxServiceState;	/* TRUE: Overide, FALSE: Do not override 
+					   Use the new priority information
+					   of service state. It is not recommended
+					   to change but OSM can opt to do so */
+#define MAX_SERVICE_STATES  36
+	u8 RxServiceState[MAX_SERVICE_STATES];
+	/* Array element represent 'priority' 
+	 * and array index represents 
+	 * 'Service state'e.g. 
+	 * RxServiceState[3]=7; it means 
+	 * Service state 3 is associated 
+	 * with priority 7 of a Rx FIFO */
+	BOOL StatAutoRefresh;	/* When true, StatRefreshTime have valid value */
+	u32 StatRefreshTime;	/*Time for refreshing statistics */
+#define     STAT_TRSF_PER_1_SECOND      0x208D5
+};
+
+/* Structure representing MAC Addrs */
+typedef struct mac_addr {
+	u8 mac_addr[ETH_ALEN];
+} macaddr_t;
+
+/* Structure that represent every FIFO element in the BAR1
+ * Address location. 
+ */
+typedef struct _TxFIFO_element {
+	u64 TxDL_Pointer;
+
+	u64 List_Control;
+#define TX_FIFO_LAST_TXD_NUM( val)     vBIT(val,0,8)
+#define TX_FIFO_FIRST_LIST             BIT(14)
+#define TX_FIFO_LAST_LIST              BIT(15)
+#define TX_FIFO_FIRSTNLAST_LIST        vBIT(3,14,2)
+#define TX_FIFO_SPECIAL_FUNC           BIT(23)
+#define TX_FIFO_DS_NO_SNOOP            BIT(31)
+#define TX_FIFO_BUFF_NO_SNOOP          BIT(30)
+} TxFIFO_element_t;
+
+/* Tx descriptor structure */
+typedef struct _TxD {
+	u64 Control_1;
+/* bit mask */
+#define TXD_LIST_OWN_XENA       BIT(7)
+#define TXD_T_CODE              (BIT(12)|BIT(13)|BIT(14)|BIT(15))
+#define TXD_T_CODE_OK(val)      (|(val & TXD_T_CODE))
+#define GET_TXD_T_CODE(val)     ((val & TXD_T_CODE)<<12)
+#define TXD_GATHER_CODE         (BIT(22) | BIT(23))
+#define TXD_GATHER_CODE_FIRST   BIT(22)
+#define TXD_GATHER_CODE_LAST    BIT(23)
+#define TXD_TCP_LSO_EN          BIT(30)
+#define TXD_UDP_COF_EN          BIT(31)
+#define TXD_TCP_LSO_MSS(val)    vBIT(val,34,14)
+#define TXD_BUFFER0_SIZE(val)   vBIT(val,48,16)
+
+	u64 Control_2;
+#define TXD_TX_CKO_CONTROL      (BIT(5)|BIT(6)|BIT(7))
+#define TXD_TX_CKO_IPV4_EN      BIT(5)
+#define TXD_TX_CKO_TCP_EN       BIT(6)
+#define TXD_TX_CKO_UDP_EN       BIT(7)
+#define TXD_VLAN_ENABLE         BIT(15)
+#define TXD_VLAN_TAG(val)       vBIT(val,16,16)
+#define TXD_INT_NUMBER(val)     vBIT(val,34,6)
+#define TXD_INT_TYPE_PER_LIST   BIT(47)
+#define TXD_INT_TYPE_UTILZ      BIT(46)
+#define TXD_SET_MARKER         vBIT(0x6,0,4)
+
+	u64 Buffer_Pointer;
+	u64 Host_Control;	/* reserved for host */
+} TxD_t;
+
+/* Rx descriptor structure */
+typedef struct _RxD_t {
+	u64 Host_Control;	/* reserved for host */
+	u64 Control_1;
+#define RXD_OWN_XENA            BIT(7)
+#define RXD_T_CODE              (BIT(12)|BIT(13)|BIT(14)|BIT(15))
+#define RXD_FRAME_PROTO         vBIT(0xFFFF,24,8)
+#define RXD_FRAME_PROTO_IPV4    BIT(27)
+#define RXD_FRAME_PROTO_IPV6    BIT(28)
+#define RXD_FRAME_PROTO_TCP     BIT(30)
+#define RXD_FRAME_PROTO_UDP     BIT(31)
+#define TCP_OR_UDP_FRAME        (RXD_FRAME_PROTO_TCP | RXD_FRAME_PROTO_UDP)
+#define RXD_GET_L3_CKSUM(val)   ((u16)(val>> 16) & 0xFFFF)
+#define RXD_GET_L4_CKSUM(val)   ((u16)(val) & 0xFFFF)
+
+	u64 Control_2;
+#define MASK_BUFFER0_SIZE       vBIT(0xFFFF,0,16)
+#define SET_BUFFER0_SIZE(val)   vBIT(val,0,16)
+#define MASK_VLAN_TAG           vBIT(0xFFFF,48,16)
+#define SET_VLAN_TAG(val)       vBIT(val,48,16)
+#define SET_NUM_TAG(val)       vBIT(val,16,32)
+
+#define RXD_GET_BUFFER0_SIZE(Control_2) (u64)((Control_2 & vBIT(0xFFFF,0,16)))
+/*    
+#define TXD_GET_BUFFER1_SIZE(Control_2) (u16)((Control_2 & MASK_BUFFER1_SIZE) >> (63-31))  
+#define TXD_GET_BUFFER2_SIZE(Control_2) (u16)((Control_2 & MASK_BUFFER2_SIZE) >> (63-47))  
+*/
+	u64 Buffer0_ptr;
+} RxD_t;
+
+
+/* Structure that represents the Rx descriptor block which contains 
+ * 128 Rx descriptors.
+ */
+typedef struct _RxD_block {
+#define MAX_RXDS_PER_BLOCK             127
+	RxD_t rxd[MAX_RXDS_PER_BLOCK];
+
+	u64 reserved_0;
+#define END_OF_BLOCK    0xFEFFFFFFFFFFFFFFULL
+	u64 reserved_1;		/* 0xFEFFFFFFFFFFFFFF to mark last Rxd in this blk */
+	u64 reserved_2_pNext_RxD_block;	/*@ Logical ptr to next */
+	u64 pNext_RxD_Blk_physical;	/* Buff0_ptr.
+					   In a 32 bit arch the upper 32 bits 
+					   should be 0 */
+} RxD_block_t;
+
+/* Structure which stores all the MAC control parameters */
+
+/* This structure stores the offset of the RxD in the ring 
+ * from which the Rx Interrupt processor can start picking 
+ * up the RxDs for processing.
+ */
+typedef struct _rx_curr_get_info_t {
+	u32 block_index;
+	u32 offset;
+	u32 ring_len;
+} rx_curr_get_info_t;
+
+typedef rx_curr_get_info_t rx_curr_put_info_t;
+
+/* This structure stores the offset of the TxDl in the FIFO
+ * from which the Tx Interrupt processor can start picking 
+ * up the TxDLs for send complete interrupt processing.
+ */
+typedef struct {
+	u32 offset;
+	u32 fifo_len;
+} tx_curr_get_info_t;
+
+typedef tx_curr_get_info_t tx_curr_put_info_t;
+
+/* Infomation related to the Tx and Rx FIFOs and Rings of Xena
+ * is maintained in this structure.
+ */
+typedef struct mac_info {
+/* rx side stuff */
+	u32 rxd_ring_mem_sz;
+	RxD_t *RxRing[MAX_RX_RINGS];	/* Logical Rx ring pointers */
+	dma_addr_t RxRing_Phy[MAX_RX_RINGS];
+
+	/* Put pointer info which indictes which RxD has to be replenished 
+	 * with a new buffer.
+	 */
+	rx_curr_put_info_t rx_curr_put_info[MAX_RX_RINGS];
+
+	/* Get pointer info which indictes which is the last RxD that was 
+	 * processed by the driver.
+	 */
+	rx_curr_get_info_t rx_curr_get_info[MAX_RX_RINGS];
+
+	u16 rmac_pause_time;
+
+	/* this will be used in receive function, this decides which ring would
+	   be processed first. eg: ring with priority value 0 (highest) should
+	   be processed first. 
+	   first 3 LSB bits represent ring number which should be processed 
+	   first, similarly next 3 bits represent next ring to be processed.
+	   eg: value of _rx_ring_pri_map = 0x0000 003A means 
+	   ring #2 would be processed first and #7 would be processed next
+	 */
+	u32 _rx_ring_pri_map;
+
+/* tx side stuff */
+	void *txd_list_mem;	/* orignal pointer to allocated mem */
+	dma_addr_t txd_list_mem_phy;
+	u32 txd_list_mem_sz;
+
+	/* logical pointer of start of each Tx FIFO */
+	TxFIFO_element_t *tx_FIFO_start[MAX_TX_FIFOS];
+
+	/* logical pointer of start of TxDL which corresponds to each Tx FIFO */
+	TxD_t *txdl_start[MAX_TX_FIFOS];
+
+	/* Same as txdl_start but phy addr */
+	dma_addr_t txdl_start_phy[MAX_TX_FIFOS];
+
+/* Current offset within tx_FIFO_start, where driver would write new Tx frame*/
+	tx_curr_put_info_t tx_curr_put_info[MAX_TX_FIFOS];
+	tx_curr_get_info_t tx_curr_get_info[MAX_TX_FIFOS];
+
+	u16 txdl_len;		/* length of a TxDL, same for all */
+
+	void *stats_mem;	/* orignal pointer to allocated mem */
+	dma_addr_t stats_mem_phy;	/* Physical address of the stat block */
+	u32 stats_mem_sz;
+	StatInfo_t *StatsInfo;	/* Logical address of the stat block */
+} mac_info_t;
+
+/* structure representing the user defined MAC addresses */
+typedef struct {
+	char addr[ETH_ALEN];
+	int usage_cnt;
+} usr_addr_t;
+
+/* Structure that holds the Phy and virt addresses of the Blocks */
+typedef struct rx_block_info {
+	RxD_t *block_virt_addr;
+	dma_addr_t block_dma_addr;
+} rx_block_info_t;
+
+/* Structure representing one instance of the NIC */
+typedef struct s2io_nic {
+#define MAX_MAC_SUPPORTED   16
+#define MAX_SUPPORTED_MULTICASTS MAX_MAC_SUPPORTED
+
+	macaddr_t defMacAddr[MAX_MAC_SUPPORTED];
+	macaddr_t preMacAddr[MAX_MAC_SUPPORTED];
+
+	struct net_device_stats stats;
+	caddr_t bar0;
+	caddr_t bar1;
+	struct config_param config;
+	mac_info_t mac_control;
+	int high_dma_flag;
+	int device_close_flag;
+	int device_enabled_once;
+
+	char name[32];
+	struct tasklet_struct task;
+	atomic_t tasklet_status;
+	struct timer_list timer;
+	struct net_device *dev;
+	struct pci_dev *pdev;
+
+	u16 vendor_id;
+	u16 device_id;
+	u16 ccmd;
+	u32 cbar0_1;
+	u32 cbar0_2;
+	u32 cbar1_1;
+	u32 cbar1_2;
+	u32 cirq;
+	u8 cache_line;
+	u32 rom_expansion;
+	u16 pcix_cmd;
+	u32 config_space[256 / sizeof(u32)];
+	u32 irq;
+	atomic_t rx_bufs_left[MAX_RX_RINGS];
+
+	spinlock_t isr_lock;
+	spinlock_t tx_lock;
+
+#define PROMISC     1
+#define ALL_MULTI   2
+
+#define MAX_ADDRS_SUPPORTED 64
+	u16 usr_addr_count;
+	u16 mc_addr_count;
+	usr_addr_t usr_addrs[MAX_ADDRS_SUPPORTED];
+
+	u16 m_cast_flg;
+	u16 all_multi_pos;
+	u16 promisc_flg;
+
+	u16 tx_pkt_count;
+	u16 rx_pkt_count;
+	u16 tx_err_count;
+	u16 rx_err_count;
+
+#if DEBUG_ON
+	u64 rxpkt_bytes;
+	u64 txpkt_bytes;
+	int int_cnt;
+	int rxint_cnt;
+	int txint_cnt;
+	u64 rxpkt_cnt;
+#endif
+
+	/*  Place holders for the virtual and physical addresses of 
+	 *  all the Rx Blocks
+	 */
+	struct rx_block_info
+	 rx_blocks[MAX_RX_RINGS][MAX_RX_BLOCKS_PER_RING];
+	int block_count[MAX_RX_RINGS];
+	int pkt_cnt[MAX_RX_RINGS];
+
+	/*  Id timer, used to blink NIC to physically identify NIC. */
+	struct timer_list id_timer;
+
+	/*  Restart timer, used to restart NIC if the device is stuck and
+	 *  a schedule task that will set the correct Link state once the 
+	 *  NIC's PHY has stabilized after a state change.
+	 */
+#ifdef INIT_TQUEUE
+	struct tq_struct rst_timer_task;
+	struct tq_struct set_link_task;
+#else
+	struct work_struct rst_timer_task;
+	struct work_struct set_link_task;
+#endif
+
+	/* Flag that can be used to turn on or turn off the Rx checksum 
+	 * offload feature.
+	 */
+	int rx_csum;
+
+	/*  after blink, the adapter must be restored with original 
+	 *  values.
+	 */
+	u64 adapt_ctrl_org;
+
+	/* Last known link state. */
+	u16 last_link_state;
+#define	LINK_DOWN	1
+#define	LINK_UP		2
+} nic_t;
+
+#define RESET_ERROR 1;
+#define CMD_ERROR   2;
+
+/* Default Tunable parameters of the NIC. */
+#define DEFAULT_FIFO_LEN 4096
+#define SMALL_RXD_CNT	40 * (MAX_RXDS_PER_BLOCK+1)
+#define LARGE_RXD_CNT	100 * (MAX_RXDS_PER_BLOCK+1)
+
+/*  OS related system calls */
+#ifndef readq
+static inline u64 readq(void *addr)
+{
+	u64 ret = 0;
+	ret = readl(addr + 4);
+	ret <<= 32;
+	ret |= readl(addr);
+
+	return ret;
+}
+#endif
+
+#ifndef writeq
+static inline void writeq(u64 val, void *addr)
+{
+	writel((u32) (val), addr);
+	writel((u32) (val >> 32), (addr + 4));
+}
+#endif
+
+/*  Interrupt related values of Xena */
+
+#define ENABLE_INTRS    1
+#define DISABLE_INTRS   2
+
+/*  Highest level interrupt blocks */
+#define TX_PIC_INTR     (0x0001<<0)
+#define TX_DMA_INTR     (0x0001<<1)
+#define TX_MAC_INTR     (0x0001<<2)
+#define TX_XGXS_INTR    (0x0001<<3)
+#define TX_TRAFFIC_INTR (0x0001<<4)
+#define RX_PIC_INTR     (0x0001<<5)
+#define RX_DMA_INTR     (0x0001<<6)
+#define RX_MAC_INTR     (0x0001<<7)
+#define RX_XGXS_INTR    (0x0001<<8)
+#define RX_TRAFFIC_INTR (0x0001<<9)
+#define MC_INTR         (0x0001<<10)
+#define ENA_ALL_INTRS    (   TX_PIC_INTR     | \
+                            TX_DMA_INTR     | \
+                            TX_MAC_INTR     | \
+                            TX_XGXS_INTR    | \
+                            TX_TRAFFIC_INTR | \
+                            RX_PIC_INTR     | \
+                            RX_DMA_INTR     | \
+                            RX_MAC_INTR     | \
+                            RX_XGXS_INTR    | \
+                            RX_TRAFFIC_INTR | \
+                            MC_INTR )
+
+/*  Interrupt masks for the general interrupt mask register */
+#define DISABLE_ALL_INTRS   0xFFFFFFFFFFFFFFFFULL
+
+#define TXPIC_INT_M         BIT(0)
+#define TXDMA_INT_M         BIT(1)
+#define TXMAC_INT_M         BIT(2)
+#define TXXGXS_INT_M        BIT(3)
+#define TXTRAFFIC_INT_M     BIT(8)
+#define PIC_RX_INT_M        BIT(32)
+#define RXDMA_INT_M         BIT(33)
+#define RXMAC_INT_M         BIT(34)
+#define MC_INT_M            BIT(35)
+#define RXXGXS_INT_M        BIT(36)
+#define RXTRAFFIC_INT_M     BIT(40)
+
+/*  PIC level Interrupts TODO*/
+
+/*  DMA level Inressupts */
+#define TXDMA_PFC_INT_M     BIT(0)
+    /*  PFC block interrupts */
+#define PFC_MISC_ERR_1      BIT(0)	/* Interrupt to indicate FIFO full */
+
+/*
+ * Prototype declaration.
+ */
+static int __devinit s2io_init_nic(struct pci_dev *pdev,
+				   const struct pci_device_id *pre);
+static void __exit s2io_rem_nic(struct pci_dev *pdev);
+static int initSharedMem(struct s2io_nic *sp);
+static void freeSharedMem(struct s2io_nic *sp);
+static int initNic(struct s2io_nic *nic);
+#ifndef CONFIG_S2IO_NAPI
+static void rxIntrHandler(struct s2io_nic *sp);
+#endif
+static void txIntrHandler(struct s2io_nic *sp);
+static void alarmIntrHandler(struct s2io_nic *sp);
+
+static int s2io_starter(void);
+void s2io_closer(void);
+static void s2io_tx_watchdog(struct net_device *dev);
+static void s2io_tasklet(unsigned long dev_addr);
+static void s2io_set_multicast(struct net_device *dev);
+static int rxOsmHandler(nic_t * sp, u16 len, RxD_t * rxdp, int ring_no);
+void s2io_link(nic_t * sp, int link);
+void s2io_reset(nic_t * sp);
+#ifdef CONFIG_S2IO_NAPI
+static int s2io_poll(struct net_device *dev, int *budget);
+#endif
+static void s2io_init_pci(nic_t * sp);
+int s2io_set_mac_addr(struct net_device *dev, u8 * addr);
+static irqreturn_t s2io_isr(int irq, void *dev_id, struct pt_regs *regs);
+static int verify_xena_quiescence(u64 val64, int flag);
+static struct ethtool_ops netdev_ethtool_ops;
+
+#endif				/* _S2IO_H */
--- diff/drivers/s390/crypto/Makefile	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/s390/crypto/Makefile	2004-04-21 10:45:34.573447536 +0100
@@ -0,0 +1,6 @@
+#
+# S/390 miscellaneous devices
+#
+
+z90crypt-objs := z90main.o z90hardware.o
+obj-$(CONFIG_Z90CRYPT) += z90crypt.o
--- diff/drivers/s390/crypto/z90common.h	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/s390/crypto/z90common.h	2004-04-21 10:45:34.573447536 +0100
@@ -0,0 +1,129 @@
+/*
+ *  linux/drivers/s390/misc/z90common.h
+ *
+ *  z90crypt 1.3.1
+ *
+ *  Copyright (C)  2001, 2004 IBM Corporation
+ *  Author(s): Robert Burroughs (burrough@us.ibm.com)
+ *	       Eric Rossman (edrossma@us.ibm.com)
+ *
+ *  Hotplug & misc device support: Jochen Roehrig (roehrig@de.ibm.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef _Z90COMMON_
+#define _Z90COMMON_
+
+#define VERSION_Z90COMMON_H "$Revision: 1.8 $"
+
+
+#define RESPBUFFSIZE 256
+#define PCI_FUNC_KEY_DECRYPT 0x5044
+#define PCI_FUNC_KEY_ENCRYPT 0x504B
+
+enum devstat {
+	DEV_GONE,
+	DEV_ONLINE,
+	DEV_QUEUE_FULL,
+	DEV_EMPTY,
+	DEV_NO_WORK,
+	DEV_BAD_MESSAGE,
+	DEV_TSQ_EXCEPTION,
+	DEV_RSQ_EXCEPTION,
+	DEV_SEN_EXCEPTION,
+	DEV_REC_EXCEPTION
+};
+
+enum hdstat {
+	HD_NOT_THERE,
+	HD_BUSY,
+	HD_DECONFIGURED,
+	HD_CHECKSTOPPED,
+	HD_ONLINE,
+	HD_TSQ_EXCEPTION
+};
+
+#define Z90C_AMBIGUOUS_DOMAIN	2
+#define Z90C_INCORRECT_DOMAIN	3
+#define ENOTINIT		4
+
+#define SEN_BUSY	 7
+#define SEN_USER_ERROR	 8
+#define SEN_QUEUE_FULL	11
+#define SEN_NOT_AVAIL	16
+#define SEN_PAD_ERROR	17
+#define SEN_RETRY	18
+#define SEN_RELEASED	24
+
+#define REC_EMPTY	 4
+#define REC_BUSY	 6
+#define REC_OPERAND_INV	 8
+#define REC_OPERAND_SIZE 9
+#define REC_EVEN_MOD	10
+#define REC_NO_WORK	11
+#define REC_HARDWAR_ERR 12
+#define REC_NO_RESPONSE 13
+#define REC_RETRY_DEV	14
+#define REC_USER_GONE	15
+#define REC_BAD_MESSAGE 16
+#define REC_INVALID_PAD 17
+#define REC_RELEASED	28
+
+#define WRONG_DEVICE_TYPE 20
+
+#define REC_FATAL_ERROR 32
+#define SEN_FATAL_ERROR 33
+#define TSQ_FATAL_ERROR 34
+#define RSQ_FATAL_ERROR 35
+
+#define PCICA	0
+#define PCICC	1
+#define PCIXCC	2
+#define NILDEV	-1
+#define ANYDEV	-1
+
+enum hdevice_type {
+	PCICC_HW  = 3,
+	PCICA_HW  = 4,
+	PCIXCC_HW = 5,
+	OTHER_HW  = 6,
+	OTHER2_HW = 7
+};
+
+#ifndef DEV_NAME
+#define DEV_NAME	"z90crypt"
+#endif
+#define PRINTK(fmt, args...) \
+	printk(KERN_DEBUG DEV_NAME ": %s -> " fmt, __FUNCTION__ , ## args)
+#define PRINTKN(fmt, args...) \
+	printk(KERN_DEBUG DEV_NAME ": " fmt, ## args)
+#define PRINTKW(fmt, args...) \
+	printk(KERN_WARNING DEV_NAME ": %s -> " fmt, __FUNCTION__ , ## args)
+#define PRINTKC(fmt, args...) \
+	printk(KERN_CRIT DEV_NAME ": %s -> " fmt, __FUNCTION__ , ## args)
+
+#ifdef Z90CRYPT_DEBUG
+#define PDEBUG(fmt, args...) \
+	printk(KERN_DEBUG DEV_NAME ": %s -> " fmt, __FUNCTION__ , ## args)
+#else
+#define PDEBUG(fmt, args...) do {} while (0)
+#endif
+
+#define UMIN(a,b) ((a) < (b) ? (a) : (b))
+#define IS_EVEN(x) ((x) == (2 * ((x) / 2)))
+
+
+#endif
--- diff/drivers/s390/crypto/z90crypt.h	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/s390/crypto/z90crypt.h	2004-04-21 10:45:34.574447384 +0100
@@ -0,0 +1,231 @@
+/*
+ *  linux/drivers/s390/misc/z90crypt.h
+ *
+ *  z90crypt 1.3.1
+ *
+ *  Copyright (C)  2001, 2004 IBM Corporation
+ *  Author(s): Robert Burroughs (burrough@us.ibm.com)
+ *	       Eric Rossman (edrossma@us.ibm.com)
+ *
+ *  Hotplug & misc device support: Jochen Roehrig (roehrig@de.ibm.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef _LINUX_Z90CRYPT_H_
+#define _LINUX_Z90CRYPT_H_
+
+#include <linux/ioctl.h>
+
+#define VERSION_Z90CRYPT_H "$Revision: 1.2 $"
+
+#define z90crypt_VERSION 1
+#define z90crypt_RELEASE 3	// 2 = PCIXCC, 3 = rewrite for coding standards
+#define z90crypt_VARIANT 1
+
+/**
+ * struct ica_rsa_modexpo
+ *
+ * Requirements:
+ * - outputdatalength is at least as large as inputdatalength.
+ * - All key parts are right justified in their fields, padded on
+ *   the left with zeroes.
+ * - length(b_key) = inputdatalength
+ * - length(n_modulus) = inputdatalength
+ */
+struct ica_rsa_modexpo {
+	char *		inputdata;
+	unsigned int	inputdatalength;
+	char *		outputdata;
+	unsigned int	outputdatalength;
+	char *		b_key;
+	char *		n_modulus;
+};
+
+/**
+ * struct ica_rsa_modexpo_crt
+ *
+ * Requirements:
+ * - inputdatalength is even.
+ * - outputdatalength is at least as large as inputdatalength.
+ * - All key parts are right justified in their fields, padded on
+ *   the left with zeroes.
+ * - length(bp_key)	= inputdatalength/2 + 8
+ * - length(bq_key)	= inputdatalength/2
+ * - length(np_key)	= inputdatalength/2 + 8
+ * - length(nq_key)	= inputdatalength/2
+ * - length(u_mult_inv) = inputdatalength/2 + 8
+ */
+struct ica_rsa_modexpo_crt {
+	char *		inputdata;
+	unsigned int	inputdatalength;
+	char *		outputdata;
+	unsigned int	outputdatalength;
+	char *		bp_key;
+	char *		bq_key;
+	char *		np_prime;
+	char *		nq_prime;
+	char *		u_mult_inv;
+};
+
+#define Z90_IOCTL_MAGIC 'z'  // NOTE:  Need to allocate from linux folks
+
+/**
+ * Interface notes:
+ *
+ * The ioctl()s which are implemented (along with relevant details)
+ * are:
+ *
+ *   ICARSAMODEXPO
+ *     Perform an RSA operation using a Modulus-Exponent pair
+ *     This takes an ica_rsa_modexpo struct as its arg.
+ *
+ *     NOTE: please refer to the comments preceding this structure
+ *	     for the implementation details for the contents of the
+ *	     block
+ *
+ *   ICARSACRT
+ *     Perform an RSA operation using a Chinese-Remainder Theorem key
+ *     This takes an ica_rsa_modexpo_crt struct as its arg.
+ *
+ *     NOTE: please refer to the comments preceding this structure
+ *	     for the implementation details for the contents of the
+ *	     block
+ *
+ *   Z90STAT_TOTALCOUNT
+ *     Return an integer count of all device types together.
+ *
+ *   Z90STAT_PCICACOUNT
+ *     Return an integer count of all PCICAs.
+ *
+ *   Z90STAT_PCICCCOUNT
+ *     Return an integer count of all PCICCs.
+ *
+ *   Z90STAT_PCIXCCCOUNT
+ *     Return an integer count of all PCIXCCs.
+ *
+ *   Z90STAT_REQUESTQ_COUNT
+ *     Return an integer count of the number of entries waiting to be
+ *     sent to a device.
+ *
+ *   Z90STAT_PENDINGQ_COUNT
+ *     Return an integer count of the number of entries sent to a
+ *     device awaiting the reply.
+ *
+ *   Z90STAT_TOTALOPEN_COUNT
+ *     Return an integer count of the number of open file handles.
+ *
+ *   Z90STAT_DOMAIN_INDEX
+ *     Return the integer value of the Cryptographic Domain.
+ *
+ *   Z90STAT_STATUS_MASK
+ *     Return an 64 element array of unsigned chars for the status of
+ *     all devices.
+ *	 0x01: PCICA
+ *	 0x02: PCICC
+ *	 0x03: PCIXCC
+ *	 0x0d: device is disabled via the proc filesystem
+ *
+ *   Z90STAT_QDEPTH_MASK
+ *     Return an 64 element array of unsigned chars for the queue
+ *     depth of all devices.
+ *
+ *   Z90STAT_PERDEV_REQCNT
+ *     Return an 64 element array of unsigned integers for the number
+ *     of successfully completed requests per device since the device
+ *     was detected and made available.
+ *
+ *   ICAZ90STATUS (deprecated)
+ *     Return some device driver status in a ica_z90_status struct
+ *     This takes an ica_z90_status struct as its arg.
+ *
+ *     NOTE: this ioctl() is deprecated, and has been replaced with
+ *	     single ioctl()s for each type of status being requested
+ *
+ *   Z90QUIESCE (not recommended)
+ *     Quiesce the driver.  This is intended to stop all new
+ *     requests from being processed.  Its use is not recommended,
+ *     except in circumstances where there is no other way to stop
+ *     callers from accessing the driver.  Its original use was to
+ *     allow the driver to be "drained" of work in preparation for
+ *     a system shutdown.
+ *
+ *     NOTE: once issued, this ban on new work cannot be undone
+ *	     except by unloading and reloading the driver.
+ */
+
+/**
+ * Supported ioctl calls
+ */
+#define ICARSAMODEXPO	_IOC(_IOC_READ|_IOC_WRITE, Z90_IOCTL_MAGIC, 0x05, 0)
+#define ICARSACRT	_IOC(_IOC_READ|_IOC_WRITE, Z90_IOCTL_MAGIC, 0x06, 0)
+
+/* DEPRECATED status call (bound for removal SOON) */
+#define ICAZ90STATUS	_IOR(Z90_IOCTL_MAGIC, 0x10, struct ica_z90_status)
+
+/* unrelated to ICA callers */
+#define Z90QUIESCE	_IO(Z90_IOCTL_MAGIC, 0x11)
+
+/* New status calls */
+#define Z90STAT_TOTALCOUNT	_IOR(Z90_IOCTL_MAGIC, 0x40, int)
+#define Z90STAT_PCICACOUNT	_IOR(Z90_IOCTL_MAGIC, 0x41, int)
+#define Z90STAT_PCICCCOUNT	_IOR(Z90_IOCTL_MAGIC, 0x42, int)
+#define Z90STAT_PCIXCCCOUNT	_IOR(Z90_IOCTL_MAGIC, 0x43, int)
+#define Z90STAT_REQUESTQ_COUNT	_IOR(Z90_IOCTL_MAGIC, 0x44, int)
+#define Z90STAT_PENDINGQ_COUNT	_IOR(Z90_IOCTL_MAGIC, 0x45, int)
+#define Z90STAT_TOTALOPEN_COUNT _IOR(Z90_IOCTL_MAGIC, 0x46, int)
+#define Z90STAT_DOMAIN_INDEX	_IOR(Z90_IOCTL_MAGIC, 0x47, int)
+#define Z90STAT_STATUS_MASK	_IOR(Z90_IOCTL_MAGIC, 0x48, char[64])
+#define Z90STAT_QDEPTH_MASK	_IOR(Z90_IOCTL_MAGIC, 0x49, char[64])
+#define Z90STAT_PERDEV_REQCNT	_IOR(Z90_IOCTL_MAGIC, 0x4a, int[64])
+
+/**
+ * local errno definitions
+ */
+#define ENOBUFF	  129	// filp->private_data->...>work_elem_p->buffer is NULL
+#define EWORKPEND 130	// user issues ioctl while another pending
+#define ERELEASED 131	// user released while ioctl pending
+#define EQUIESCE  132	// z90crypt quiescing (no more work allowed)
+#define ETIMEOUT  133	// request timed out
+#define EUNKNOWN  134	// some unrecognized error occured
+#define EGETBUFF  135	// Error getting buffer
+
+/**
+ * DEPRECATED STRUCTURES
+ */
+
+/**
+ * This structure is DEPRECATED and the corresponding ioctl() has been
+ * replaced with individual ioctl()s for each piece of data!
+ * This structure will NOT survive past version 1.3.1, so switch to the
+ * new ioctl()s.
+ */
+#define MASK_LENGTH 64 // mask length
+struct ica_z90_status {
+	int totalcount;
+	int leedslitecount; // PCICA
+	int leeds2count;    // PCICC
+	// int PCIXCCCount; is not in struct for backward compatibility
+	int requestqWaitCount;
+	int pendingqWaitCount;
+	int totalOpenCount;
+	int cryptoDomain;
+	// status: 0=not there. 1=PCICA. 2=PCICC. 3=PCIXCC
+	unsigned char status[MASK_LENGTH];
+	// qdepth: # work elements waiting for each device
+	unsigned char qdepth[MASK_LENGTH];
+};
+
+#endif /* _LINUX_Z90CRYPT_H_ */
--- diff/drivers/s390/crypto/z90hardware.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/s390/crypto/z90hardware.c	2004-04-21 10:45:34.576447080 +0100
@@ -0,0 +1,2184 @@
+/*
+ *  linux/drivers/s390/misc/z90hardware.c
+ *
+ *  z90crypt 1.3.1
+ *
+ *  Copyright (C)  2001, 2004 IBM Corporation
+ *  Author(s): Robert Burroughs (burrough@us.ibm.com)
+ *	       Eric Rossman (edrossma@us.ibm.com)
+ *
+ *  Hotplug & misc device support: Jochen Roehrig (roehrig@de.ibm.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <asm/uaccess.h>
+#include <linux/compiler.h>
+#include <linux/delay.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include "z90crypt.h"
+#include "z90common.h"
+
+#define VERSION_Z90HARDWARE_C "$Revision: 1.19 $"
+
+char z90chardware_version[] __initdata =
+	"z90hardware.o (" VERSION_Z90HARDWARE_C "/"
+	                  VERSION_Z90COMMON_H "/" VERSION_Z90CRYPT_H ")";
+
+struct cca_token_hdr {
+	unsigned char  token_identifier;
+	unsigned char  version;
+	unsigned short token_length;
+	unsigned char  reserved[4];
+};
+
+#define CCA_TKN_HDR_ID_EXT 0x1E
+
+struct cca_private_ext_ME_sec {
+	unsigned char  section_identifier;
+	unsigned char  version;
+	unsigned short section_length;
+	unsigned char  private_key_hash[20];
+	unsigned char  reserved1[4];
+	unsigned char  key_format;
+	unsigned char  reserved2;
+	unsigned char  key_name_hash[20];
+	unsigned char  key_use_flags[4];
+	unsigned char  reserved3[6];
+	unsigned char  reserved4[24];
+	unsigned char  confounder[24];
+	unsigned char  exponent[128];
+	unsigned char  modulus[128];
+};
+
+#define CCA_PVT_USAGE_ALL 0x80
+
+struct cca_public_sec {
+	unsigned char  section_identifier;
+	unsigned char  version;
+	unsigned short section_length;
+	unsigned char  reserved[2];
+	unsigned short exponent_len;
+	unsigned short modulus_bit_len;
+	unsigned short modulus_byte_len;
+	unsigned char  exponent[3];
+};
+
+struct cca_private_ext_ME {
+	struct cca_token_hdr	      pvtMEHdr;
+	struct cca_private_ext_ME_sec pvtMESec;
+	struct cca_public_sec	      pubMESec;
+};
+
+struct cca_public_key {
+	struct cca_token_hdr  pubHdr;
+	struct cca_public_sec pubSec;
+};
+
+struct cca_pvt_ext_CRT_sec {
+	unsigned char  section_identifier;
+	unsigned char  version;
+	unsigned short section_length;
+	unsigned char  private_key_hash[20];
+	unsigned char  reserved1[4];
+	unsigned char  key_format;
+	unsigned char  reserved2;
+	unsigned char  key_name_hash[20];
+	unsigned char  key_use_flags[4];
+	unsigned short p_len;
+	unsigned short q_len;
+	unsigned short dp_len;
+	unsigned short dq_len;
+	unsigned short u_len;
+	unsigned short mod_len;
+	unsigned char  reserved3[4];
+	unsigned short pad_len;
+	unsigned char  reserved4[52];
+	unsigned char  confounder[8];
+};
+
+#define CCA_PVT_EXT_CRT_SEC_ID_PVT 0x08
+#define CCA_PVT_EXT_CRT_SEC_FMT_CL 0x40
+
+struct cca_private_ext_CRT {
+	struct cca_token_hdr	   pvtCrtHdr;
+	struct cca_pvt_ext_CRT_sec pvtCrtSec;
+	struct cca_public_sec	   pubCrtSec;
+};
+
+struct ap_status_word {
+	unsigned char q_stat_flags;
+	unsigned char response_code;
+	unsigned char reserved[2];
+};
+
+#define AP_Q_STATUS_EMPTY		0x80
+#define AP_Q_STATUS_REPLIES_WAITING	0x40
+#define AP_Q_STATUS_ARRAY_FULL		0x20
+
+#define AP_RESPONSE_NORMAL		0x00
+#define AP_RESPONSE_Q_NOT_AVAIL		0x01
+#define AP_RESPONSE_RESET_IN_PROGRESS	0x02
+#define AP_RESPONSE_DECONFIGURED	0x03
+#define AP_RESPONSE_CHECKSTOPPED	0x04
+#define AP_RESPONSE_BUSY		0x05
+#define AP_RESPONSE_Q_FULL		0x10
+#define AP_RESPONSE_NO_PENDING_REPLY	0x10
+#define AP_RESPONSE_INDEX_TOO_BIG	0x11
+#define AP_RESPONSE_NO_FIRST_PART	0x13
+#define AP_RESPONSE_MESSAGE_TOO_BIG	0x15
+
+#define AP_MAX_CDX_BITL		4
+#define AP_RQID_RESERVED_BITL	4
+#define SKIP_BITL		(AP_MAX_CDX_BITL + AP_RQID_RESERVED_BITL)
+
+struct type4_hdr {
+	unsigned char  reserved1;
+	unsigned char  msg_type_code;
+	unsigned short msg_len;
+	unsigned char  request_code;
+	unsigned char  msg_fmt;
+	unsigned short reserved2;
+};
+
+#define TYPE4_TYPE_CODE 0x04
+#define TYPE4_REQU_CODE 0x40
+
+#define TYPE4_SME_LEN 0x0188
+#define TYPE4_LME_LEN 0x0308
+#define TYPE4_SCR_LEN 0x01E0
+#define TYPE4_LCR_LEN 0x03A0
+
+#define TYPE4_SME_FMT 0x00
+#define TYPE4_LME_FMT 0x10
+#define TYPE4_SCR_FMT 0x40
+#define TYPE4_LCR_FMT 0x50
+
+struct type4_sme {
+	struct type4_hdr header;
+	unsigned char	 message[128];
+	unsigned char	 exponent[128];
+	unsigned char	 modulus[128];
+};
+
+struct type4_lme {
+	struct type4_hdr header;
+	unsigned char	 message[256];
+	unsigned char	 exponent[256];
+	unsigned char	 modulus[256];
+};
+
+struct type4_scr {
+	struct type4_hdr header;
+	unsigned char	 message[128];
+	unsigned char	 dp[72];
+	unsigned char	 dq[64];
+	unsigned char	 p[72];
+	unsigned char	 q[64];
+	unsigned char	 u[72];
+};
+
+struct type4_lcr {
+	struct type4_hdr header;
+	unsigned char	 message[256];
+	unsigned char	 dp[136];
+	unsigned char	 dq[128];
+	unsigned char	 p[136];
+	unsigned char	 q[128];
+	unsigned char	 u[136];
+};
+
+union type4_msg {
+	struct type4_sme sme;
+	struct type4_lme lme;
+	struct type4_scr scr;
+	struct type4_lcr lcr;
+};
+
+struct type84_hdr {
+	unsigned char  reserved1;
+	unsigned char  code;
+	unsigned short len;
+	unsigned char  reserved2[4];
+};
+
+#define TYPE84_RSP_CODE 0x84
+
+struct type6_hdr {
+	unsigned char reserved1;
+	unsigned char type;
+	unsigned char reserved2[2];
+	unsigned char right[4];
+	unsigned char reserved3[2];
+	unsigned char reserved4[2];
+	unsigned char pfs[4];
+	unsigned int  offset1;
+	unsigned int  offset2;
+	unsigned int  offset3;
+	unsigned int  offset4;
+	unsigned char agent_id[16];
+	unsigned char rqid[2];
+	unsigned char reserved5[2];
+	unsigned char function_code[2];
+	unsigned char reserved6[2];
+	unsigned int  ToCardLen1;
+	unsigned int  ToCardLen2;
+	unsigned int  ToCardLen3;
+	unsigned int  ToCardLen4;
+	unsigned int  FromCardLen1;
+	unsigned int  FromCardLen2;
+	unsigned int  FromCardLen3;
+	unsigned int  FromCardLen4;
+};
+
+struct CPRB {
+	unsigned char cprb_len[2];
+	unsigned char cprb_ver_id;
+	unsigned char pad_000;
+	unsigned char srpi_rtcode[4];
+	unsigned char srpi_verb;
+	unsigned char flags;
+	unsigned char func_id[2];
+	unsigned char checkpoint_flag;
+	unsigned char resv2;
+	unsigned char req_parml[2];
+	unsigned char req_parmp[4];
+	unsigned char req_datal[4];
+	unsigned char req_datap[4];
+	unsigned char rpl_parml[2];
+	unsigned char pad_001[2];
+	unsigned char rpl_parmp[4];
+	unsigned char rpl_datal[4];
+	unsigned char rpl_datap[4];
+	unsigned char ccp_rscode[2];
+	unsigned char ccp_rtcode[2];
+	unsigned char repd_parml[2];
+	unsigned char mac_data_len[2];
+	unsigned char repd_datal[4];
+	unsigned char req_pc[2];
+	unsigned char res_origin[8];
+	unsigned char mac_value[8];
+	unsigned char logon_id[8];
+	unsigned char usage_domain[2];
+	unsigned char resv3[18];
+	unsigned char svr_namel[2];
+	unsigned char svr_name[8];
+};
+
+struct CPRBX {
+	unsigned short cprb_len;
+	unsigned char  cprb_ver_id;
+	unsigned char  pad_000[3];
+	unsigned char  func_id[2];
+	unsigned char  cprb_flags[4];
+	unsigned int   req_parml;
+	unsigned int   req_datal;
+	unsigned int   rpl_msgbl;
+	unsigned int   rpld_parml;
+	unsigned int   rpl_datal;
+	unsigned int   rpld_datal;
+	unsigned int   req_extbl;
+	unsigned char  pad_001[4];
+	unsigned int   rpld_extbl;
+	unsigned char  req_parmb[16];
+	unsigned char  req_datab[16];
+	unsigned char  rpl_parmb[16];
+	unsigned char  rpl_datab[16];
+	unsigned char  req_extb[16];
+	unsigned char  rpl_extb[16];
+	unsigned short ccp_rtcode;
+	unsigned short ccp_rscode;
+	unsigned int   mac_data_len;
+	unsigned char  logon_id[8];
+	unsigned char  mac_value[8];
+	unsigned char  mac_content_flgs;
+	unsigned char  pad_002;
+	unsigned short domain;
+	unsigned char  pad_003[12];
+	unsigned char  pad_004[36];
+};
+
+struct type6_msg {
+	struct type6_hdr header;
+	struct CPRB	 CPRB;
+};
+
+union request_msg {
+	union  type4_msg t4msg;
+	struct type6_msg t6msg;
+};
+
+struct request_msg_ext {
+	int		  q_nr;
+	unsigned char	  *psmid;
+	union request_msg reqMsg;
+};
+
+struct type82_hdr {
+	unsigned char reserved1;
+	unsigned char type;
+	unsigned char reserved2[2];
+	unsigned char reply_code;
+	unsigned char reserved3[3];
+};
+
+#define TYPE82_RSP_CODE 0x82
+
+#define REPLY_ERROR_MACHINE_FAILURE  0x10
+#define REPLY_ERROR_PREEMPT_FAILURE  0x12
+#define REPLY_ERROR_CHECKPT_FAILURE  0x14
+#define REPLY_ERROR_MESSAGE_TYPE     0x20
+#define REPLY_ERROR_INVALID_COMM_CD  0x21
+#define REPLY_ERROR_INVALID_MSG_LEN  0x23
+#define REPLY_ERROR_RESERVD_FIELD    0x24
+#define REPLY_ERROR_FORMAT_FIELD     0x29
+#define REPLY_ERROR_INVALID_COMMAND  0x30
+#define REPLY_ERROR_MALFORMED_MSG    0x40
+#define REPLY_ERROR_RESERVED_FIELD   0x50
+#define REPLY_ERROR_WORD_ALIGNMENT   0x60
+#define REPLY_ERROR_MESSAGE_LENGTH   0x80
+#define REPLY_ERROR_OPERAND_INVALID  0x82
+#define REPLY_ERROR_OPERAND_SIZE     0x84
+#define REPLY_ERROR_EVEN_MOD_IN_OPND 0x85
+#define REPLY_ERROR_TRANSPORT_FAIL   0x90
+#define REPLY_ERROR_PACKET_TRUNCATED 0xA0
+#define REPLY_ERROR_ZERO_BUFFER_LEN  0xB0
+
+struct type86_hdr {
+	unsigned char reserved1;
+	unsigned char type;
+	unsigned char format;
+	unsigned char reserved2;
+	unsigned char reply_code;
+	unsigned char reserved3[3];
+};
+
+#define TYPE86_RSP_CODE 0x86
+#define TYPE86_FMT2	0x02
+
+struct type86_fmt2_msg {
+	struct type86_hdr hdr;
+	unsigned char	  reserved[4];
+	unsigned char	  apfs[4];
+	unsigned int	  count1;
+	unsigned int	  offset1;
+	unsigned int	  count2;
+	unsigned int	  offset2;
+	unsigned int	  count3;
+	unsigned int	  offset3;
+	unsigned int	  ount4;
+	unsigned int	  offset4;
+};
+
+static struct type6_hdr static_type6_hdr = {
+	0x00,
+	0x06,
+	{0x00,0x00},
+	{0x00,0x00,0x00,0x00},
+	{0x00,0x00},
+	{0x00,0x00},
+	{0x00,0x00,0x00,0x00},
+	0x00000058,
+	0x00000000,
+	0x00000000,
+	0x00000000,
+	{0x01,0x00,0x43,0x43,0x41,0x2D,0x41,0x50,
+	 0x50,0x4C,0x20,0x20,0x20,0x01,0x01,0x01},
+	{0x00,0x00},
+	{0x00,0x00},
+	{0x50,0x44},
+	{0x00,0x00},
+	0x00000000,
+	0x00000000,
+	0x00000000,
+	0x00000000,
+	0x00000000,
+	0x00000000,
+	0x00000000,
+	0x00000000
+};
+
+static struct type6_hdr static_type6_hdrX = {
+	0x00,
+	0x06,
+	{0x00,0x00},
+	{0x00,0x00,0x00,0x00},
+	{0x00,0x00},
+	{0x00,0x00},
+	{0x00,0x00,0x00,0x00},
+	0x00000058,
+	0x00000000,
+	0x00000000,
+	0x00000000,
+	{0x43,0x41,0x00,0x00,0x00,0x00,0x00,0x00,
+	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+	{0x00,0x00},
+	{0x00,0x00},
+	{0x50,0x44},
+	{0x00,0x00},
+	0x00000000,
+	0x00000000,
+	0x00000000,
+	0x00000000,
+	0x00000000,
+	0x00000000,
+	0x00000000,
+	0x00000000
+};
+
+static struct CPRB static_cprb = {
+	{0x70,0x00},
+	0x41,
+	0x00,
+	{0x00,0x00,0x00,0x00},
+	0x00,
+	0x00,
+	{0x54,0x32},
+	0x01,
+	0x00,
+	{0x00,0x00},
+	{0x00,0x00,0x00,0x00},
+	{0x00,0x00,0x00,0x00},
+	{0x00,0x00,0x00,0x00},
+	{0x00,0x00},
+	{0x00,0x00},
+	{0x00,0x00,0x00,0x00},
+	{0x00,0x00,0x00,0x00},
+	{0x00,0x00,0x00,0x00},
+	{0x00,0x00},
+	{0x00,0x00},
+	{0x00,0x00},
+	{0x00,0x00},
+	{0x00,0x00,0x00,0x00},
+	{0x00,0x00},
+	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+	{0x00,0x00},
+	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	 0x00,0x00},
+	{0x08,0x00},
+	{0x49,0x43,0x53,0x46,0x20,0x20,0x20,0x20}
+};
+
+struct function_and_rules_block {
+	unsigned char function_code[2];
+	unsigned char ulen[2];
+	unsigned char only_rule[8];
+};
+
+static struct function_and_rules_block static_pkd_function_and_rules = {
+	{0x50,0x44},
+	{0x0A,0x00},
+	{'P','K','C','S','-','1','.','2'}
+};
+
+static struct function_and_rules_block static_pke_function_and_rules = {
+	{0x50,0x4B},
+	{0x0A,0x00},
+	{'P','K','C','S','-','1','.','2'}
+};
+
+struct T6_keyBlock_hdr {
+	unsigned char blen[2];
+	unsigned char ulen[2];
+	unsigned char flags[2];
+};
+
+static struct T6_keyBlock_hdr static_T6_keyBlock_hdr = {
+	{0x89,0x01},
+	{0x87,0x01},
+	{0x00}
+};
+
+static struct CPRBX static_cprbx = {
+	0x00DC,
+	0x02,
+	{0x00,0x00,0x00},
+	{0x54,0x32},
+	{0x00,0x00,0x00,0x00},
+	0x00000000,
+	0x00000000,
+	0x00000000,
+	0x00000000,
+	0x00000000,
+	0x00000000,
+	0x00000000,
+	{0x00,0x00,0x00,0x00},
+	0x00000000,
+	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+	0x0000,
+	0x0000,
+	0x00000000,
+	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+	0x00,
+	0x00,
+	0x0000,
+	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+	 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
+};
+
+static struct function_and_rules_block static_pkd_function_and_rulesX = {
+	{0x50,0x44},
+	{0x00,0x0A},
+	{'P','K','C','S','-','1','.','2'}
+};
+
+static struct function_and_rules_block static_pke_function_and_rulesX = {
+	{0x50,0x4B},
+	{0x00,0x0A},
+	{'Z','E','R','O','-','P','A','D'}
+};
+
+struct T6_keyBlock_hdrX {
+	unsigned short blen;
+	unsigned short ulen;
+	unsigned char flags[2];
+};
+
+static unsigned char static_pad[256] = {
+0x1B,0x7B,0x5D,0xB5,0x75,0x01,0x3D,0xFD,0x8D,0xD1,0xC7,0x03,0x2D,0x09,0x23,0x57,
+0x89,0x49,0xB9,0x3F,0xBB,0x99,0x41,0x5B,0x75,0x21,0x7B,0x9D,0x3B,0x6B,0x51,0x39,
+0xBB,0x0D,0x35,0xB9,0x89,0x0F,0x93,0xA5,0x0B,0x47,0xF1,0xD3,0xBB,0xCB,0xF1,0x9D,
+0x23,0x73,0x71,0xFF,0xF3,0xF5,0x45,0xFB,0x61,0x29,0x23,0xFD,0xF1,0x29,0x3F,0x7F,
+0x17,0xB7,0x1B,0xA9,0x19,0xBD,0x57,0xA9,0xD7,0x95,0xA3,0xCB,0xED,0x1D,0xDB,0x45,
+0x7D,0x11,0xD1,0x51,0x1B,0xED,0x71,0xE9,0xB1,0xD1,0xAB,0xAB,0x21,0x2B,0x1B,0x9F,
+0x3B,0x9F,0xF7,0xF7,0xBD,0x63,0xEB,0xAD,0xDF,0xB3,0x6F,0x5B,0xDB,0x8D,0xA9,0x5D,
+0xE3,0x7D,0x77,0x49,0x47,0xF5,0xA7,0xFD,0xAB,0x2F,0x27,0x35,0x77,0xD3,0x49,0xC9,
+0x09,0xEB,0xB1,0xF9,0xBF,0x4B,0xCB,0x2B,0xEB,0xEB,0x05,0xFF,0x7D,0xC7,0x91,0x8B,
+0x09,0x83,0xB9,0xB9,0x69,0x33,0x39,0x6B,0x79,0x75,0x19,0xBF,0xBB,0x07,0x1D,0xBD,
+0x29,0xBF,0x39,0x95,0x93,0x1D,0x35,0xC7,0xC9,0x4D,0xE5,0x97,0x0B,0x43,0x9B,0xF1,
+0x16,0x93,0x03,0x1F,0xA5,0xFB,0xDB,0xF3,0x27,0x4F,0x27,0x61,0x05,0x1F,0xB9,0x23,
+0x2F,0xC3,0x81,0xA9,0x23,0x71,0x55,0x55,0xEB,0xED,0x41,0xE5,0xF3,0x11,0xF1,0x43,
+0x69,0x03,0xBD,0x0B,0x37,0x0F,0x51,0x8F,0x0B,0xB5,0x89,0x5B,0x67,0xA9,0xD9,0x4F,
+0x01,0xF9,0x21,0x77,0x37,0x73,0x79,0xC5,0x7F,0x51,0xC1,0xCF,0x97,0xA1,0x75,0xAD,
+0x35,0x9D,0xD3,0xD3,0xA7,0x9D,0x5D,0x41,0x6F,0x65,0x1B,0xCF,0xA9,0x87,0x91,0x09
+};
+
+static struct cca_private_ext_ME static_pvt_me_key = {
+	{
+		0x1E,
+		0x00,
+		0x0183,
+		{0x00,0x00,0x00,0x00}
+	},
+
+	{
+		0x02,
+		0x00,
+		0x016C,
+		{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00},
+		{0x00,0x00,0x00,0x00},
+		0x00,
+		0x00,
+		{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00},
+		{0x80,0x00,0x00,0x00},
+		{0x00,0x00,0x00,0x00,0x00,0x00},
+		{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+		{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+		{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+		{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+		 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
+	},
+
+	{
+		0x04,
+		0x00,
+		0x000F,
+		{0x00,0x00},
+		0x0003,
+		0x0000,
+		0x0000,
+		{0x01,0x00,0x01}
+	}
+};
+
+static struct cca_public_key static_public_key = {
+	{
+		0x1E,
+		0x00,
+		0x0000,
+		{0x00,0x00,0x00,0x00}
+	},
+
+	{
+		0x04,
+		0x00,
+		0x0000,
+		{0x00,0x00},
+		0x0000,
+		0x0000,
+		0x0000,
+		{0x01,0x00,0x01}
+	}
+};
+
+#define FIXED_TYPE6_ME_LEN 0x0000025F
+
+#define FIXED_TYPE6_ME_EN_LEN 0x000000F0
+
+#define FIXED_TYPE6_ME_LENX 0x000002CB
+
+#define FIXED_TYPE6_ME_EN_LENX 0x0000015C
+
+static struct cca_public_sec static_cca_pub_sec = {
+	0x04,
+	0x00,
+	0x000f,
+	{0x00,0x00},
+	0x0003,
+	0x0000,
+	0x0000,
+	{0x01,0x00,0x01}
+};
+
+#define FIXED_TYPE6_CR_LEN 0x00000177
+
+#define FIXED_TYPE6_CR_LENX 0x000001E3
+
+#ifndef MAX_RESPONSE_SIZE
+#define MAX_RESPONSE_SIZE 0x00000710
+
+#define MAX_RESPONSEX_SIZE 0x0000077C
+#endif
+
+#define RESPONSE_CPRB_SIZE  0x000006B8
+#define RESPONSE_CPRBX_SIZE 0x00000724
+
+#define CALLER_HEADER 12
+
+static unsigned char static_PKE_function_code[2] = {0x50, 0x4B};
+
+static inline int
+testq(int q_nr, int *q_depth, int *dev_type, struct ap_status_word *stat)
+{
+	int ccode;
+
+	asm volatile
+#ifdef __s390x__
+	("	llgfr	0,%4		\n"
+	 "	slgr	1,1		\n"
+	 "	lgr	2,1		\n"
+	 "0:	.long	0xb2af0000	\n"
+	 "1:	ipm	%0		\n"
+	 "	srl	%0,28		\n"
+	 "	iihh	%0,0		\n"
+	 "	iihl	%0,0		\n"
+	 "	lgr	%1,1		\n"
+	 "	lgr	%3,2		\n"
+	 "	srl	%3,24		\n"
+	 "	sll	2,24		\n"
+	 "	srl	2,24		\n"
+	 "	lgr	%2,2		\n"
+	 "2:				\n"
+	 ".section .fixup,\"ax\"	\n"
+	 "3:				\n"
+	 "	lhi	%0,%h5		\n"
+	 "	jg	2b		\n"
+	 ".previous			\n"
+	 ".section __ex_table,\"a\"	\n"
+	 "	.align	8		\n"
+	 "	.quad	0b,3b		\n"
+	 "	.quad	1b,3b		\n"
+	 ".previous"
+	 :"=d" (ccode),"=d" (*stat),"=d" (*q_depth), "=d" (*dev_type)
+	 :"d" (q_nr), "K" (DEV_TSQ_EXCEPTION)
+	 :"cc","0","1","2","memory");
+#else
+	("	lr	0,%4		\n"
+	 "	slr	1,1		\n"
+	 "	lr	2,1		\n"
+	 "0:	.long	0xb2af0000	\n"
+	 "1:	ipm	%0		\n"
+	 "	srl	%0,28		\n"
+	 "	lr	%1,1		\n"
+	 "	lr	%3,2		\n"
+	 "	srl	%3,24		\n"
+	 "	sll	2,24		\n"
+	 "	srl	2,24		\n"
+	 "	lr	%2,2		\n"
+	 "2:				\n"
+	 ".section .fixup,\"ax\"	\n"
+	 "3:				\n"
+	 "	lhi	%0,%h5		\n"
+	 "	bras	1,4f		\n"
+	 "	.long	2b		\n"
+	 "4:				\n"
+	 "	l	1,0(1)		\n"
+	 "	br	1		\n"
+	 ".previous			\n"
+	 ".section __ex_table,\"a\"	\n"
+	 "	.align	4		\n"
+	 "	.long	0b,3b		\n"
+	 "	.long	1b,3b		\n"
+	 ".previous"
+	 :"=d" (ccode),"=d" (*stat),"=d" (*q_depth), "=d" (*dev_type)
+	 :"d" (q_nr), "K" (DEV_TSQ_EXCEPTION)
+	 :"cc","0","1","2","memory");
+#endif
+	return ccode;
+}
+
+static inline int
+resetq(int q_nr, struct ap_status_word *stat_p)
+{
+	int ccode;
+
+	asm volatile
+#ifdef __s390x__
+	("	llgfr	0,%2		\n"
+	 "	lghi	1,1		\n"
+	 "	sll	1,24		\n"
+	 "	or	0,1		\n"
+	 "	slgr	1,1		\n"
+	 "	lgr	2,1		\n"
+	 "0:	.long	0xb2af0000	\n"
+	 "1:	ipm	%0		\n"
+	 "	srl	%0,28		\n"
+	 "	iihh	%0,0		\n"
+	 "	iihl	%0,0		\n"
+	 "	lgr	%1,1		\n"
+	 "2:				\n"
+	 ".section .fixup,\"ax\"	\n"
+	 "3:				\n"
+	 "	lhi	%0,%h3		\n"
+	 "	jg	2b		\n"
+	 ".previous			\n"
+	 ".section __ex_table,\"a\"	\n"
+	 "	.align	8		\n"
+	 "	.quad	0b,3b		\n"
+	 "	.quad	1b,3b		\n"
+	 ".previous"
+	 :"=d" (ccode),"=d" (*stat_p)
+	 :"d" (q_nr), "K" (DEV_RSQ_EXCEPTION)
+	 :"cc","0","1","2","memory");
+#else
+	("	lr	0,%2		\n"
+	 "	lhi	1,1		\n"
+	 "	sll	1,24		\n"
+	 "	or	0,1		\n"
+	 "	slr	1,1		\n"
+	 "	lr	2,1		\n"
+	 "0:	.long	0xb2af0000	\n"
+	 "1:	ipm	%0		\n"
+	 "	srl	%0,28		\n"
+	 "	lr	%1,1		\n"
+	 "2:				\n"
+	 ".section .fixup,\"ax\"	\n"
+	 "3:				\n"
+	 "	lhi	%0,%h3		\n"
+	 "	bras	1,4f		\n"
+	 "	.long	2b		\n"
+	 "4:				\n"
+	 "	l	1,0(1)		\n"
+	 "	br	1		\n"
+	 ".previous			\n"
+	 ".section __ex_table,\"a\"	\n"
+	 "	.align	4		\n"
+	 "	.long	0b,3b		\n"
+	 "	.long	1b,3b		\n"
+	 ".previous"
+	 :"=d" (ccode),"=d" (*stat_p)
+	 :"d" (q_nr), "K" (DEV_RSQ_EXCEPTION)
+	 :"cc","0","1","2","memory");
+#endif
+	return ccode;
+}
+
+static inline int
+sen(int msg_len, unsigned char *msg_ext, struct ap_status_word *stat)
+{
+	int ccode;
+
+	asm volatile
+#ifdef __s390x__
+	("	lgr	6,%3		\n"
+	 "	llgfr	7,%2		\n"
+	 "	llgt	0,0(6)		\n"
+	 "	lghi	1,64		\n"
+	 "	sll	1,24		\n"
+	 "	or	0,1		\n"
+	 "	la	6,4(6)		\n"
+	 "	llgt	2,0(6)		\n"
+	 "	llgt	3,4(6)		\n"
+	 "	la	6,8(6)		\n"
+	 "	slr	1,1		\n"
+	 "0:	.long	0xb2ad0026	\n"
+	 "1:	brc	2,0b		\n"
+	 "	ipm	%0		\n"
+	 "	srl	%0,28		\n"
+	 "	iihh	%0,0		\n"
+	 "	iihl	%0,0		\n"
+	 "	lgr	%1,1		\n"
+	 "2:				\n"
+	 ".section .fixup,\"ax\"	\n"
+	 "3:				\n"
+	 "	lhi	%0,%h4		\n"
+	 "	jg	2b		\n"
+	 ".previous			\n"
+	 ".section __ex_table,\"a\"	\n"
+	 "	.align	8		\n"
+	 "	.quad	0b,3b		\n"
+	 "	.quad	1b,3b		\n"
+	 ".previous"
+	 :"=d" (ccode),"=d" (*stat)
+	 :"d" (msg_len),"a" (msg_ext), "K" (DEV_SEN_EXCEPTION)
+	 :"cc","0","1","2","3","6","7","memory");
+#else
+	("	lr	6,%3		\n"
+	 "	lr	7,%2		\n"
+	 "	l	0,0(6)		\n"
+	 "	lhi	1,64		\n"
+	 "	sll	1,24		\n"
+	 "	or	0,1		\n"
+	 "	la	6,4(6)		\n"
+	 "	l	2,0(6)		\n"
+	 "	l	3,4(6)		\n"
+	 "	la	6,8(6)		\n"
+	 "	slr	1,1		\n"
+	 "0:	.long	0xb2ad0026	\n"
+	 "1:	brc	2,0b		\n"
+	 "	ipm	%0		\n"
+	 "	srl	%0,28		\n"
+	 "	lr	%1,1		\n"
+	 "2:				\n"
+	 ".section .fixup,\"ax\"	\n"
+	 "3:				\n"
+	 "	lhi	%0,%h4		\n"
+	 "	bras	1,4f		\n"
+	 "	.long	2b		\n"
+	 "4:				\n"
+	 "	l	1,0(1)		\n"
+	 "	br	1		\n"
+	 ".previous			\n"
+	 ".section __ex_table,\"a\"	\n"
+	 "	.align	4		\n"
+	 "	.long	0b,3b		\n"
+	 "	.long	1b,3b		\n"
+	 ".previous"
+	 :"=d" (ccode),"=d" (*stat)
+	 :"d" (msg_len),"a" (msg_ext), "K" (DEV_SEN_EXCEPTION)
+	 :"cc","0","1","2","3","6","7","memory");
+#endif
+	return ccode;
+}
+
+static inline int
+rec(int q_nr, int buff_l, unsigned char *rsp, unsigned char *id,
+    struct ap_status_word *st)
+{
+	int ccode;
+
+	asm volatile
+#ifdef __s390x__
+	("	llgfr	0,%2		\n"
+	 "	lgr	3,%4		\n"
+	 "	lgr	6,%3		\n"
+	 "	llgfr	7,%5		\n"
+	 "	lghi	1,128		\n"
+	 "	sll	1,24		\n"
+	 "	or	0,1		\n"
+	 "	slgr	1,1		\n"
+	 "	lgr	2,1		\n"
+	 "	lgr	4,1		\n"
+	 "	lgr	5,1		\n"
+	 "0:	.long	0xb2ae0046	\n"
+	 "1:	brc	2,0b		\n"
+	 "	brc	4,0b		\n"
+	 "	ipm	%0		\n"
+	 "	srl	%0,28		\n"
+	 "	iihh	%0,0		\n"
+	 "	iihl	%0,0		\n"
+	 "	lgr	%1,1		\n"
+	 "	st	4,0(3)		\n"
+	 "	st	5,4(3)		\n"
+	 "2:				\n"
+	 ".section .fixup,\"ax\"	\n"
+	 "3:				\n"
+	 "	lhi   %0,%h6		\n"
+	 "	jg    2b		\n"
+	 ".previous			\n"
+	 ".section __ex_table,\"a\"	\n"
+	 "   .align	8		\n"
+	 "   .quad	0b,3b		\n"
+	 "   .quad	1b,3b		\n"
+	 ".previous"
+	 :"=d"(ccode),"=d"(*st)
+	 :"d" (q_nr), "d" (rsp), "d" (id), "d" (buff_l), "K" (DEV_REC_EXCEPTION)
+	 :"cc","0","1","2","3","4","5","6","7","memory");
+#else
+	("	lr	0,%2		\n"
+	 "	lr	3,%4		\n"
+	 "	lr	6,%3		\n"
+	 "	lr	7,%5		\n"
+	 "	lhi	1,128		\n"
+	 "	sll	1,24		\n"
+	 "	or	0,1		\n"
+	 "	slr	1,1		\n"
+	 "	lr	2,1		\n"
+	 "	lr	4,1		\n"
+	 "	lr	5,1		\n"
+	 "0:	.long	0xb2ae0046	\n"
+	 "1:	brc	2,0b		\n"
+	 "	brc	4,0b		\n"
+	 "	ipm	%0		\n"
+	 "	srl	%0,28		\n"
+	 "	lr	%1,1		\n"
+	 "	st	4,0(3)		\n"
+	 "	st	5,4(3)		\n"
+	 "2:				\n"
+	 ".section .fixup,\"ax\"	\n"
+	 "3:				\n"
+	 "	lhi   %0,%h6		\n"
+	 "	bras  1,4f		\n"
+	 "	.long 2b		\n"
+	 "4:				\n"
+	 "	l     1,0(1)		\n"
+	 "	br    1			\n"
+	 ".previous			\n"
+	 ".section __ex_table,\"a\"	\n"
+	 "   .align	4		\n"
+	 "   .long	0b,3b		\n"
+	 "   .long	1b,3b		\n"
+	 ".previous"
+	 :"=d"(ccode),"=d"(*st)
+	 :"d" (q_nr), "d" (rsp), "d" (id), "d" (buff_l), "K" (DEV_REC_EXCEPTION)
+	 :"cc","0","1","2","3","4","5","6","7","memory");
+#endif
+	return ccode;
+}
+
+static inline void
+itoLe2(int *i_p, unsigned char *lechars)
+{
+	*lechars       = *((unsigned char *) i_p + sizeof(int) - 1);
+	*(lechars + 1) = *((unsigned char *) i_p + sizeof(int) - 2);
+}
+
+static inline void
+le2toI(unsigned char *lechars, int *i_p)
+{
+	unsigned char *ic_p;
+	*i_p = 0;
+	ic_p = (unsigned char *) i_p;
+	*(ic_p + 2) = *(lechars + 1);
+	*(ic_p + 3) = *(lechars);
+}
+
+static inline int
+is_empty(unsigned char *ptr, int len)
+{
+	return !memcmp(ptr, (unsigned char *) &static_pvt_me_key+60, len);
+}
+
+enum hdstat
+query_online(int deviceNr, int cdx, int resetNr, int *q_depth, int *dev_type)
+{
+	int q_nr, i, t_depth, t_dev_type;
+	enum devstat ccode;
+	struct ap_status_word stat_word;
+	enum hdstat stat;
+	int break_out;
+
+	q_nr = (deviceNr << SKIP_BITL) + cdx;
+	stat = HD_BUSY;
+	ccode = testq(q_nr, &t_depth, &t_dev_type, &stat_word);
+	PDEBUG("ccode %d response_code %02X\n", ccode, stat_word.response_code);
+	break_out = 0;
+	for (i = 0; i < resetNr; i++) {
+		if (ccode > 3) {
+			PRINTKC("Exception testing device %d\n", i);
+			return HD_TSQ_EXCEPTION;
+		}
+		switch (ccode) {
+		case 0:
+			PDEBUG("t_dev_type %d\n", t_dev_type);
+			break_out = 1;
+			stat = HD_ONLINE;
+			*q_depth = t_depth + 1;
+			switch (t_dev_type) {
+			case OTHER_HW:
+			case OTHER2_HW:
+				stat = HD_NOT_THERE;
+				*dev_type = NILDEV;
+				break;
+			case PCICA_HW:
+				*dev_type = PCICA;
+				break;
+			case PCICC_HW:
+				*dev_type = PCICC;
+				break;
+			case PCIXCC_HW:
+				*dev_type = PCIXCC;
+				break;
+			default:
+				*dev_type = NILDEV;
+				break;
+			}
+			PDEBUG("available device %d: Q depth = %d, dev "
+			       "type = %d, stat = %02X%02X%02X%02X\n",
+			       deviceNr, *q_depth, *dev_type,
+			       stat_word.q_stat_flags,
+			       stat_word.response_code,
+			       stat_word.reserved[0],
+			       stat_word.reserved[1]);
+			break;
+		case 3:
+			switch (stat_word.response_code) {
+			case AP_RESPONSE_NORMAL:
+				stat = HD_ONLINE;
+				break_out = 1;
+				*q_depth = t_depth + 1;
+				*dev_type = t_dev_type;
+				PDEBUG("cc3, available device "
+				       "%d: Q depth = %d, dev "
+				       "type = %d, stat = "
+				       "%02X%02X%02X%02X\n",
+				       deviceNr, *q_depth,
+				       *dev_type,
+				       stat_word.q_stat_flags,
+				       stat_word.response_code,
+				       stat_word.reserved[0],
+				       stat_word.reserved[1]);
+				break;
+			case AP_RESPONSE_Q_NOT_AVAIL:
+				stat = HD_NOT_THERE;
+				break_out = 1;
+				break;
+			case AP_RESPONSE_RESET_IN_PROGRESS:
+				PDEBUG("device %d in reset\n",
+				       deviceNr);
+				break;
+			case AP_RESPONSE_DECONFIGURED:
+				stat = HD_DECONFIGURED;
+				break_out = 1;
+				break;
+			case AP_RESPONSE_CHECKSTOPPED:
+				stat = HD_CHECKSTOPPED;
+				break_out = 1;
+				break;
+			case AP_RESPONSE_BUSY:
+				PDEBUG("device %d busy\n",
+				       deviceNr);
+				break;
+			default:
+				break;
+			}
+			break;
+		default:
+			stat = HD_NOT_THERE;
+			break_out = 1;
+		}
+		if (break_out)
+			break;
+
+		udelay(5);
+
+		ccode = testq(q_nr, &t_depth, &t_dev_type, &stat_word);
+	}
+	return stat;
+}
+
+enum devstat
+reset_device(int deviceNr, int cdx, int resetNr)
+{
+	int q_nr, ccode = 0, dummy_qdepth, dummy_devType, i;
+	struct ap_status_word stat_word;
+	enum devstat stat;
+	int break_out;
+
+	q_nr = (deviceNr << SKIP_BITL) + cdx;
+	stat = DEV_GONE;
+	ccode = resetq(q_nr, &stat_word);
+	if (ccode > 3)
+		return DEV_RSQ_EXCEPTION;
+
+	break_out = 0;
+	for (i = 0; i < resetNr; i++) {
+		switch (ccode) {
+		case 0:
+			stat = DEV_ONLINE;
+			if (stat_word.q_stat_flags & AP_Q_STATUS_EMPTY)
+				break_out = 1;
+			break;
+		case 3:
+			switch (stat_word.response_code) {
+			case AP_RESPONSE_NORMAL:
+				stat = DEV_ONLINE;
+				if (stat_word.q_stat_flags &
+				    AP_Q_STATUS_EMPTY)
+					break_out = 1;
+				break;
+			case AP_RESPONSE_Q_NOT_AVAIL:
+				stat = DEV_GONE;
+				break_out = 1;
+				break;
+			case AP_RESPONSE_DECONFIGURED:
+				stat = DEV_GONE;
+				break_out = 1;
+				break;
+			case AP_RESPONSE_CHECKSTOPPED:
+				stat = DEV_GONE;
+				break_out = 1;
+				break;
+			case AP_RESPONSE_RESET_IN_PROGRESS:
+			case AP_RESPONSE_BUSY:
+			default:
+				break;
+			}
+			break;
+		default:
+			stat = DEV_GONE;
+			break_out = 1;
+		}
+		if (break_out == 1)
+			break;
+		udelay(5);
+
+		ccode = testq(q_nr, &dummy_qdepth, &dummy_devType, &stat_word);
+		if (ccode > 3) {
+			stat = DEV_TSQ_EXCEPTION;
+			break;
+		}
+	}
+	PDEBUG("Number of testq's needed for reset: %d\n", i);
+
+	if (i >= resetNr) {
+	  stat = DEV_GONE;
+	}
+
+	return stat;
+}
+
+#ifdef DEBUG_HYDRA_MSGS
+static inline void
+print_buffer(unsigned char *buffer, int bufflen)
+{
+	int i;
+	for (i = 0; i < bufflen; i += 16) {
+		PRINTK("%04X: %02X%02X%02X%02X %02X%02X%02X%02X "
+		       "%02X%02X%02X%02X %02X%02X%02X%02X\n", i,
+		       buffer[i+0], buffer[i+1], buffer[i+2], buffer[i+3],
+		       buffer[i+4], buffer[i+5], buffer[i+6], buffer[i+7],
+		       buffer[i+8], buffer[i+9], buffer[i+10], buffer[i+11],
+		       buffer[i+12], buffer[i+13], buffer[i+14], buffer[i+15]);
+	}
+}
+#endif
+
+enum devstat
+send_to_AP(int dev_nr, int cdx, int msg_len, unsigned char *msg_ext)
+{
+	struct ap_status_word stat_word;
+	enum devstat stat;
+	int ccode;
+
+	((struct request_msg_ext *) msg_ext)->q_nr =
+		(dev_nr << SKIP_BITL) + cdx;
+	PDEBUG("msg_len passed to sen: %d\n", msg_len);
+	PDEBUG("q number passed to sen: %02x%02x%02x%02x\n",
+	       msg_ext[0], msg_ext[1], msg_ext[2], msg_ext[3]);
+	stat = DEV_GONE;
+
+#ifdef DEBUG_HYDRA_MSGS
+	PRINTK("Request header: %02X%02X%02X%02X %02X%02X%02X%02X "
+	       "%02X%02X%02X%02X\n",
+	       msg_ext[0], msg_ext[1], msg_ext[2], msg_ext[3],
+	       msg_ext[4], msg_ext[5], msg_ext[6], msg_ext[7],
+	       msg_ext[8], msg_ext[9], msg_ext[10], msg_ext[11]);
+	print_buffer(msg_ext+12, msg_len);
+#endif
+
+	ccode = sen(msg_len, msg_ext, &stat_word);
+	if (ccode > 3)
+		return DEV_SEN_EXCEPTION;
+
+	PDEBUG("nq cc: %u, st: %02x%02x%02x%02x\n",
+	       ccode, stat_word.q_stat_flags, stat_word.response_code,
+	       stat_word.reserved[0], stat_word.reserved[1]);
+	switch (ccode) {
+	case 0:
+		stat = DEV_ONLINE;
+		break;
+	case 1:
+		stat = DEV_GONE;
+		break;
+	case 3:
+		switch (stat_word.response_code) {
+		case AP_RESPONSE_NORMAL:
+			stat = DEV_ONLINE;
+			break;
+		case AP_RESPONSE_Q_FULL:
+			stat = DEV_QUEUE_FULL;
+			break;
+		default:
+			stat = DEV_GONE;
+			break;
+		}
+		break;
+	default:
+		stat = DEV_GONE;
+	}
+
+	return stat;
+}
+
+enum devstat
+receive_from_AP(int dev_nr, int cdx, int resplen,
+		unsigned char *resp, unsigned char *psmid)
+{
+	int ccode;
+	struct ap_status_word stat_word;
+	enum devstat stat;
+
+	memset(resp, 0x00, 8);
+
+	ccode = rec((dev_nr << SKIP_BITL) + cdx, resplen, resp, psmid,
+		    &stat_word);
+	if (ccode > 3)
+		return DEV_REC_EXCEPTION;
+
+	PDEBUG("dq cc: %u, st: %02x%02x%02x%02x\n",
+	       ccode, stat_word.q_stat_flags, stat_word.response_code,
+	       stat_word.reserved[0], stat_word.reserved[1]);
+
+	stat = DEV_GONE;
+	switch (ccode) {
+	case 0:
+		stat = DEV_ONLINE;
+#ifdef DEBUG_HYDRA_MSGS
+		print_buffer(resp, resplen);
+#endif
+		break;
+	case 3:
+		switch (stat_word.response_code) {
+		case AP_RESPONSE_NORMAL:
+			stat = DEV_ONLINE;
+			break;
+		case AP_RESPONSE_NO_PENDING_REPLY:
+			if (stat_word.q_stat_flags & AP_Q_STATUS_EMPTY)
+				stat = DEV_EMPTY;
+			else
+				stat = DEV_NO_WORK;
+			break;
+		case AP_RESPONSE_INDEX_TOO_BIG:
+		case AP_RESPONSE_NO_FIRST_PART:
+		case AP_RESPONSE_MESSAGE_TOO_BIG:
+			stat = DEV_BAD_MESSAGE;
+			break;
+		default:
+			break;
+		}
+		break;
+	default:
+		break;
+	}
+
+	return stat;
+}
+
+static inline int
+pad_msg(unsigned char *buffer, int  totalLength, int msgLength)
+{
+	int pad_len;
+
+	for (pad_len = 0; pad_len < (totalLength - msgLength); pad_len++)
+		if (buffer[pad_len] != 0x00)
+			break;
+	pad_len -= 3;
+	if (pad_len < 8)
+		return SEN_PAD_ERROR;
+
+	buffer[0] = 0x00;
+	buffer[1] = 0x02;
+
+	memcpy(buffer+2, static_pad, pad_len);
+
+	buffer[pad_len + 2] = 0x00;
+
+	return 0;
+}
+
+static inline int
+is_common_public_key(unsigned char *key, int len)
+{
+	int i;
+
+	for (i = 0; i < len; i++)
+		if (key[i])
+			break;
+	key += i;
+	len -= i;
+	if (((len == 1) && (key[0] == 3)) ||
+	    ((len == 3) && (key[0] == 1) && (key[1] == 0) && (key[2] == 1)))
+		return 1;
+
+	return 0;
+}
+
+static int
+ICAMEX_msg_to_type4MEX_msg(struct ica_rsa_modexpo *icaMex_p, int *z90cMsg_l_p,
+			   union type4_msg *z90cMsg_p)
+{
+	int mod_len, msg_size, mod_tgt_len, exp_tgt_len, inp_tgt_len;
+	unsigned char *mod_tgt, *exp_tgt, *inp_tgt;
+	union type4_msg *tmp_type4_msg;
+
+	mod_len = icaMex_p->inputdatalength;
+
+	msg_size = ((mod_len <= 128) ? TYPE4_SME_LEN : TYPE4_LME_LEN) +
+		    CALLER_HEADER;
+
+	memset(z90cMsg_p, 0, msg_size);
+
+	tmp_type4_msg = (union type4_msg *)
+		((unsigned char *) z90cMsg_p + CALLER_HEADER);
+
+	tmp_type4_msg->sme.header.msg_type_code = TYPE4_TYPE_CODE;
+	tmp_type4_msg->sme.header.request_code = TYPE4_REQU_CODE;
+
+	if (mod_len <= 128) {
+		tmp_type4_msg->sme.header.msg_fmt = TYPE4_SME_FMT;
+		tmp_type4_msg->sme.header.msg_len = TYPE4_SME_LEN;
+		mod_tgt = tmp_type4_msg->sme.modulus;
+		mod_tgt_len = sizeof(tmp_type4_msg->sme.modulus);
+		exp_tgt = tmp_type4_msg->sme.exponent;
+		exp_tgt_len = sizeof(tmp_type4_msg->sme.exponent);
+		inp_tgt = tmp_type4_msg->sme.message;
+		inp_tgt_len = sizeof(tmp_type4_msg->sme.message);
+	} else {
+		tmp_type4_msg->lme.header.msg_fmt = TYPE4_LME_FMT;
+		tmp_type4_msg->lme.header.msg_len = TYPE4_LME_LEN;
+		mod_tgt = tmp_type4_msg->lme.modulus;
+		mod_tgt_len = sizeof(tmp_type4_msg->lme.modulus);
+		exp_tgt = tmp_type4_msg->lme.exponent;
+		exp_tgt_len = sizeof(tmp_type4_msg->lme.exponent);
+		inp_tgt = tmp_type4_msg->lme.message;
+		inp_tgt_len = sizeof(tmp_type4_msg->lme.message);
+	}
+
+	mod_tgt += (mod_tgt_len - mod_len);
+	if (copy_from_user(mod_tgt, icaMex_p->n_modulus, mod_len))
+		return SEN_RELEASED;
+	if (is_empty(mod_tgt, mod_len))
+		return SEN_USER_ERROR;
+	exp_tgt += (exp_tgt_len - mod_len);
+	if (copy_from_user(exp_tgt, icaMex_p->b_key, mod_len))
+		return SEN_RELEASED;
+	if (is_empty(exp_tgt, mod_len))
+		return SEN_USER_ERROR;
+	inp_tgt += (inp_tgt_len - mod_len);
+	if (copy_from_user(inp_tgt, icaMex_p->inputdata, mod_len))
+		return SEN_RELEASED;
+	if (is_empty(inp_tgt, mod_len))
+		return SEN_USER_ERROR;
+
+	*z90cMsg_l_p = msg_size - CALLER_HEADER;
+
+	return 0;
+}
+
+static int
+ICACRT_msg_to_type4CRT_msg(struct ica_rsa_modexpo_crt *icaMsg_p,
+			   int *z90cMsg_l_p, union type4_msg *z90cMsg_p)
+{
+	int mod_len, short_len, long_len, tmp_size, p_tgt_len, q_tgt_len,
+	    dp_tgt_len, dq_tgt_len, u_tgt_len, inp_tgt_len;
+	unsigned char *p_tgt, *q_tgt, *dp_tgt, *dq_tgt, *u_tgt, *inp_tgt;
+	union type4_msg *tmp_type4_msg;
+
+	mod_len = icaMsg_p->inputdatalength;
+	short_len = mod_len / 2;
+	long_len = mod_len / 2 + 8;
+
+	tmp_size = ((mod_len <= 128) ? TYPE4_SCR_LEN : TYPE4_LCR_LEN) +
+		    CALLER_HEADER;
+
+	memset(z90cMsg_p, 0, tmp_size);
+
+	tmp_type4_msg = (union type4_msg *)
+		((unsigned char *) z90cMsg_p + CALLER_HEADER);
+
+	tmp_type4_msg->scr.header.msg_type_code = TYPE4_TYPE_CODE;
+	tmp_type4_msg->scr.header.request_code = TYPE4_REQU_CODE;
+	if (mod_len <= 128) {
+		tmp_type4_msg->scr.header.msg_fmt = TYPE4_SCR_FMT;
+		tmp_type4_msg->scr.header.msg_len = TYPE4_SCR_LEN;
+		p_tgt = tmp_type4_msg->scr.p;
+		p_tgt_len = sizeof(tmp_type4_msg->scr.p);
+		q_tgt = tmp_type4_msg->scr.q;
+		q_tgt_len = sizeof(tmp_type4_msg->scr.q);
+		dp_tgt = tmp_type4_msg->scr.dp;
+		dp_tgt_len = sizeof(tmp_type4_msg->scr.dp);
+		dq_tgt = tmp_type4_msg->scr.dq;
+		dq_tgt_len = sizeof(tmp_type4_msg->scr.dq);
+		u_tgt = tmp_type4_msg->scr.u;
+		u_tgt_len = sizeof(tmp_type4_msg->scr.u);
+		inp_tgt = tmp_type4_msg->scr.message;
+		inp_tgt_len = sizeof(tmp_type4_msg->scr.message);
+	} else {
+		tmp_type4_msg->lcr.header.msg_fmt = TYPE4_LCR_FMT;
+		tmp_type4_msg->lcr.header.msg_len = TYPE4_LCR_LEN;
+		p_tgt = tmp_type4_msg->lcr.p;
+		p_tgt_len = sizeof(tmp_type4_msg->lcr.p);
+		q_tgt = tmp_type4_msg->lcr.q;
+		q_tgt_len = sizeof(tmp_type4_msg->lcr.q);
+		dp_tgt = tmp_type4_msg->lcr.dp;
+		dp_tgt_len = sizeof(tmp_type4_msg->lcr.dp);
+		dq_tgt = tmp_type4_msg->lcr.dq;
+		dq_tgt_len = sizeof(tmp_type4_msg->lcr.dq);
+		u_tgt = tmp_type4_msg->lcr.u;
+		u_tgt_len = sizeof(tmp_type4_msg->lcr.u);
+		inp_tgt = tmp_type4_msg->lcr.message;
+		inp_tgt_len = sizeof(tmp_type4_msg->lcr.message);
+	}
+
+	p_tgt += (p_tgt_len - long_len);
+	if (copy_from_user(p_tgt, icaMsg_p->np_prime, long_len))
+		return SEN_RELEASED;
+	if (is_empty(p_tgt, long_len))
+		return SEN_USER_ERROR;
+	q_tgt += (q_tgt_len - short_len);
+	if (copy_from_user(q_tgt, icaMsg_p->nq_prime, short_len))
+		return SEN_RELEASED;
+	if (is_empty(q_tgt, short_len))
+		return SEN_USER_ERROR;
+	dp_tgt += (dp_tgt_len - long_len);
+	if (copy_from_user(dp_tgt, icaMsg_p->bp_key, long_len))
+		return SEN_RELEASED;
+	if (is_empty(dp_tgt, long_len))
+		return SEN_USER_ERROR;
+	dq_tgt += (dq_tgt_len - short_len);
+	if (copy_from_user(dq_tgt, icaMsg_p->bq_key, short_len))
+		return SEN_RELEASED;
+	if (is_empty(dq_tgt, short_len))
+		return SEN_USER_ERROR;
+	u_tgt += (u_tgt_len - long_len);
+	if (copy_from_user(u_tgt, icaMsg_p->u_mult_inv, long_len))
+		return SEN_RELEASED;
+	if (is_empty(u_tgt, long_len))
+		return SEN_USER_ERROR;
+	inp_tgt += (inp_tgt_len - mod_len);
+	if (copy_from_user(inp_tgt, icaMsg_p->inputdata, mod_len))
+		return SEN_RELEASED;
+	if (is_empty(inp_tgt, mod_len))
+		return SEN_USER_ERROR;
+
+	*z90cMsg_l_p = tmp_size - CALLER_HEADER;
+
+	return 0;
+}
+
+static int
+ICAMEX_msg_to_type6MEX_de_msg(struct ica_rsa_modexpo *icaMsg_p, int cdx,
+			      int *z90cMsg_l_p, struct type6_msg *z90cMsg_p)
+{
+	int mod_len, vud_len, tmp_size, total_CPRB_len, parmBlock_l;
+	unsigned char *temp;
+	struct type6_hdr *tp6Hdr_p;
+	struct CPRB *cprb_p;
+	struct cca_private_ext_ME *key_p;
+
+	mod_len = icaMsg_p->inputdatalength;
+	tmp_size = FIXED_TYPE6_ME_LEN + mod_len;
+	total_CPRB_len = tmp_size - sizeof(struct type6_hdr);
+	parmBlock_l = total_CPRB_len - sizeof(struct CPRB);
+	tmp_size = 4*((tmp_size + 3)/4) + CALLER_HEADER;
+
+	memset(z90cMsg_p, 0, tmp_size);
+
+	temp = (unsigned char *)z90cMsg_p + CALLER_HEADER;
+	memcpy(temp, &static_type6_hdr, sizeof(struct type6_hdr));
+	tp6Hdr_p = (struct type6_hdr *)temp;
+	tp6Hdr_p->ToCardLen1 = 4*((total_CPRB_len+3)/4);
+	tp6Hdr_p->FromCardLen1 = RESPONSE_CPRB_SIZE;
+
+	temp += sizeof(struct type6_hdr);
+	memcpy(temp, &static_cprb, sizeof(struct CPRB));
+	cprb_p = (struct CPRB *) temp;
+	cprb_p->usage_domain[0]= (unsigned char)cdx;
+	itoLe2(&parmBlock_l, cprb_p->req_parml);
+	itoLe2((int *)&(tp6Hdr_p->FromCardLen1), cprb_p->rpl_parml);
+
+	temp += sizeof(struct CPRB);
+	memcpy(temp, &static_pkd_function_and_rules,
+	       sizeof(struct function_and_rules_block));
+
+	temp += sizeof(struct function_and_rules_block);
+	vud_len = 2 + icaMsg_p->inputdatalength;
+	itoLe2(&vud_len, temp);
+
+	temp += 2;
+	if (copy_from_user(temp, icaMsg_p->inputdata, mod_len))
+		return SEN_RELEASED;
+	if (is_empty(temp, mod_len))
+		return SEN_USER_ERROR;
+
+	temp += mod_len;
+	memcpy(temp, &static_T6_keyBlock_hdr, sizeof(struct T6_keyBlock_hdr));
+
+	temp += sizeof(struct T6_keyBlock_hdr);
+	memcpy(temp, &static_pvt_me_key, sizeof(struct cca_private_ext_ME));
+	key_p = (struct cca_private_ext_ME *)temp;
+	temp = key_p->pvtMESec.exponent + sizeof(key_p->pvtMESec.exponent)
+	       - mod_len;
+	if (copy_from_user(temp, icaMsg_p->b_key, mod_len))
+		return SEN_RELEASED;
+	if (is_empty(temp, mod_len))
+		return SEN_USER_ERROR;
+
+	if (is_common_public_key(temp, mod_len)) {
+		PRINTK("Common public key used for modex decrypt\n");
+		return SEN_NOT_AVAIL;
+	}
+
+	temp = key_p->pvtMESec.modulus + sizeof(key_p->pvtMESec.modulus)
+	       - mod_len;
+	if (copy_from_user(temp, icaMsg_p->n_modulus, mod_len) != 0)
+		return SEN_RELEASED;
+	if (is_empty(temp, mod_len))
+		return SEN_USER_ERROR;
+
+	key_p->pubMESec.modulus_bit_len = 8 * mod_len;
+
+	*z90cMsg_l_p = tmp_size - CALLER_HEADER;
+
+	return 0;
+}
+
+static int
+ICAMEX_msg_to_type6MEX_en_msg(struct ica_rsa_modexpo *icaMsg_p, int cdx,
+			      int *z90cMsg_l_p, struct type6_msg *z90cMsg_p)
+{
+	int mod_len, vud_len, exp_len, key_len;
+	int pad_len, tmp_size, total_CPRB_len, parmBlock_l, i;
+	unsigned char temp_exp[256], *exp_p, *temp;
+	struct type6_hdr *tp6Hdr_p;
+	struct CPRB *cprb_p;
+	struct cca_public_key *key_p;
+	struct T6_keyBlock_hdr *keyb_p;
+
+	mod_len = icaMsg_p->inputdatalength;
+	if (copy_from_user(temp_exp, icaMsg_p->b_key, mod_len))
+		return SEN_RELEASED;
+	if (is_empty(temp_exp, mod_len))
+		return SEN_USER_ERROR;
+
+	exp_p = temp_exp;
+	for (i = 0; i < mod_len; i++)
+		if (exp_p[i])
+			break;
+	if (i >= mod_len)
+		return SEN_USER_ERROR;
+
+	exp_len = mod_len - i;
+	exp_p += i;
+
+	PDEBUG("exp_len after computation: %08x\n", exp_len);
+	tmp_size = FIXED_TYPE6_ME_EN_LEN + 2 * mod_len + exp_len;
+	total_CPRB_len = tmp_size - sizeof(struct type6_hdr);
+	parmBlock_l = total_CPRB_len - sizeof(struct CPRB);
+	tmp_size = 4*((tmp_size + 3)/4) + CALLER_HEADER;
+
+	vud_len = 2 + mod_len;
+	memset(z90cMsg_p, 0, tmp_size);
+
+	temp = (unsigned char *)z90cMsg_p + CALLER_HEADER;
+	memcpy(temp, &static_type6_hdr, sizeof(struct type6_hdr));
+	tp6Hdr_p = (struct type6_hdr *)temp;
+	tp6Hdr_p->ToCardLen1 = 4*((total_CPRB_len+3)/4);
+	tp6Hdr_p->FromCardLen1 = RESPONSE_CPRB_SIZE;
+	memcpy(tp6Hdr_p->function_code, static_PKE_function_code,
+	       sizeof(static_PKE_function_code));
+	temp += sizeof(struct type6_hdr);
+	memcpy(temp, &static_cprb, sizeof(struct CPRB));
+	cprb_p = (struct CPRB *) temp;
+	cprb_p->usage_domain[0]= (unsigned char)cdx;
+	itoLe2((int *)&(tp6Hdr_p->FromCardLen1), cprb_p->rpl_parml);
+	temp += sizeof(struct CPRB);
+	memcpy(temp, &static_pke_function_and_rules,
+		 sizeof(struct function_and_rules_block));
+	temp += sizeof(struct function_and_rules_block);
+	temp += 2;
+	if (copy_from_user(temp, icaMsg_p->inputdata, mod_len))
+		return SEN_RELEASED;
+	if (is_empty(temp, mod_len))
+		return SEN_USER_ERROR;
+	if (temp[0] != 0x00 || temp[1] != 0x02)
+		return SEN_NOT_AVAIL;
+	for (i = 2; i < mod_len; i++)
+		if (temp[i] == 0x00)
+			break;
+	if ((i < 9) || (i > (mod_len - 2)))
+		return SEN_NOT_AVAIL;
+	pad_len = i + 1;
+	vud_len = mod_len - pad_len;
+	memmove(temp, temp+pad_len, vud_len);
+	temp -= 2;
+	vud_len += 2;
+	itoLe2(&vud_len, temp);
+	temp += (vud_len);
+	keyb_p = (struct T6_keyBlock_hdr *)temp;
+	temp += sizeof(struct T6_keyBlock_hdr);
+	memcpy(temp, &static_public_key, sizeof(static_public_key));
+	key_p = (struct cca_public_key *)temp;
+	temp = key_p->pubSec.exponent;
+	memcpy(temp, exp_p, exp_len);
+	temp += exp_len;
+	if (copy_from_user(temp, icaMsg_p->n_modulus, mod_len))
+		return SEN_RELEASED;
+	if (is_empty(temp, mod_len))
+		return SEN_USER_ERROR;
+	key_p->pubSec.modulus_bit_len = 8 * mod_len;
+	key_p->pubSec.modulus_byte_len = mod_len;
+	key_p->pubSec.exponent_len = exp_len;
+	key_p->pubSec.section_length = 12 + mod_len + exp_len;
+	key_len = key_p->pubSec.section_length + sizeof(struct cca_token_hdr);
+	key_p->pubHdr.token_length = key_len;
+	key_len += 4;
+	itoLe2(&key_len, keyb_p->ulen);
+	key_len += 2;
+	itoLe2(&key_len, keyb_p->blen);
+	parmBlock_l -= pad_len;
+	itoLe2(&parmBlock_l, cprb_p->req_parml);
+	*z90cMsg_l_p = tmp_size - CALLER_HEADER;
+
+	return 0;
+}
+
+static int
+ICACRT_msg_to_type6CRT_msg(struct ica_rsa_modexpo_crt *icaMsg_p, int cdx,
+			   int *z90cMsg_l_p, struct type6_msg *z90cMsg_p)
+{
+	int mod_len, vud_len, tmp_size, total_CPRB_len, parmBlock_l, short_len;
+	int long_len, pad_len, keyPartsLen, tmp_l;
+	unsigned char *tgt_p, *temp;
+	struct type6_hdr *tp6Hdr_p;
+	struct CPRB *cprb_p;
+	struct cca_token_hdr *keyHdr_p;
+	struct cca_pvt_ext_CRT_sec *pvtSec_p;
+	struct cca_public_sec *pubSec_p;
+
+	mod_len = icaMsg_p->inputdatalength;
+	short_len = mod_len / 2;
+	long_len = 8 + short_len;
+	keyPartsLen = 3 * long_len + 2 * short_len;
+	pad_len = (8 - (keyPartsLen % 8)) % 8;
+	keyPartsLen += pad_len + mod_len;
+	tmp_size = FIXED_TYPE6_CR_LEN + keyPartsLen + mod_len;
+	total_CPRB_len = tmp_size -  sizeof(struct type6_hdr);
+	parmBlock_l = total_CPRB_len - sizeof(struct CPRB);
+	vud_len = 2 + mod_len;
+	tmp_size = 4*((tmp_size + 3)/4) + CALLER_HEADER;
+
+	memset(z90cMsg_p, 0, tmp_size);
+	tgt_p = (unsigned char *)z90cMsg_p + CALLER_HEADER;
+	memcpy(tgt_p, &static_type6_hdr, sizeof(struct type6_hdr));
+	tp6Hdr_p = (struct type6_hdr *)tgt_p;
+	tp6Hdr_p->ToCardLen1 = 4*((total_CPRB_len+3)/4);
+	tp6Hdr_p->FromCardLen1 = RESPONSE_CPRB_SIZE;
+	tgt_p += sizeof(struct type6_hdr);
+	cprb_p = (struct CPRB *) tgt_p;
+	memcpy(tgt_p, &static_cprb, sizeof(struct CPRB));
+	cprb_p->usage_domain[0]= *((unsigned char *)(&(cdx))+3);
+	itoLe2(&parmBlock_l, cprb_p->req_parml);
+	memcpy(cprb_p->rpl_parml, cprb_p->req_parml,
+	       sizeof(cprb_p->req_parml));
+	tgt_p += sizeof(struct CPRB);
+	memcpy(tgt_p, &static_pkd_function_and_rules,
+	       sizeof(struct function_and_rules_block));
+	tgt_p += sizeof(struct function_and_rules_block);
+	itoLe2(&vud_len, tgt_p);
+	tgt_p += 2;
+	if (copy_from_user(tgt_p, icaMsg_p->inputdata, mod_len))
+		return SEN_RELEASED;
+	if (is_empty(tgt_p, mod_len))
+		return SEN_USER_ERROR;
+	tgt_p += mod_len;
+	tmp_l = sizeof(struct T6_keyBlock_hdr) + sizeof(struct cca_token_hdr) +
+		sizeof(struct cca_pvt_ext_CRT_sec) + 0x0F + keyPartsLen;
+	itoLe2(&tmp_l, tgt_p);
+	temp = tgt_p + 2;
+	tmp_l -= 2;
+	itoLe2(&tmp_l, temp);
+	tgt_p += sizeof(struct T6_keyBlock_hdr);
+	keyHdr_p = (struct cca_token_hdr *)tgt_p;
+	keyHdr_p->token_identifier = CCA_TKN_HDR_ID_EXT;
+	tmp_l -= 4;
+	keyHdr_p->token_length = tmp_l;
+	tgt_p += sizeof(struct cca_token_hdr);
+	pvtSec_p = (struct cca_pvt_ext_CRT_sec *)tgt_p;
+	pvtSec_p->section_identifier = CCA_PVT_EXT_CRT_SEC_ID_PVT;
+	pvtSec_p->section_length =
+		sizeof(struct cca_pvt_ext_CRT_sec) + keyPartsLen;
+	pvtSec_p->key_format = CCA_PVT_EXT_CRT_SEC_FMT_CL;
+	pvtSec_p->key_use_flags[0] = CCA_PVT_USAGE_ALL;
+	pvtSec_p->p_len = long_len;
+	pvtSec_p->q_len = short_len;
+	pvtSec_p->dp_len = long_len;
+	pvtSec_p->dq_len = short_len;
+	pvtSec_p->u_len = long_len;
+	pvtSec_p->mod_len = mod_len;
+	pvtSec_p->pad_len = pad_len;
+	tgt_p += sizeof(struct cca_pvt_ext_CRT_sec);
+	if (copy_from_user(tgt_p, icaMsg_p->np_prime, long_len))
+		return SEN_RELEASED;
+	if (is_empty(tgt_p, long_len))
+		return SEN_USER_ERROR;
+	tgt_p += long_len;
+	if (copy_from_user(tgt_p, icaMsg_p->nq_prime, short_len))
+		return SEN_RELEASED;
+	if (is_empty(tgt_p, short_len))
+		return SEN_USER_ERROR;
+	tgt_p += short_len;
+	if (copy_from_user(tgt_p, icaMsg_p->bp_key, long_len))
+		return SEN_RELEASED;
+	if (is_empty(tgt_p, long_len))
+		return SEN_USER_ERROR;
+	tgt_p += long_len;
+	if (copy_from_user(tgt_p, icaMsg_p->bq_key, short_len))
+		return SEN_RELEASED;
+	if (is_empty(tgt_p, short_len))
+		return SEN_USER_ERROR;
+	tgt_p += short_len;
+	if (copy_from_user(tgt_p, icaMsg_p->u_mult_inv, long_len))
+		return SEN_RELEASED;
+	if (is_empty(tgt_p, long_len))
+		return SEN_USER_ERROR;
+	tgt_p += long_len;
+	tgt_p += pad_len;
+	memset(tgt_p, 0xFF, mod_len);
+	tgt_p += mod_len;
+	memcpy(tgt_p, &static_cca_pub_sec, sizeof(struct cca_public_sec));
+	pubSec_p = (struct cca_public_sec *) tgt_p;
+	pubSec_p->modulus_bit_len = 8 * mod_len;
+	*z90cMsg_l_p = tmp_size - CALLER_HEADER;
+
+	return 0;
+}
+
+static int
+ICAMEX_msg_to_type6MEX_msgX(struct ica_rsa_modexpo *icaMsg_p, int cdx,
+			    int *z90cMsg_l_p, struct type6_msg *z90cMsg_p)
+{
+	int mod_len, exp_len, vud_len, tmp_size, total_CPRB_len, parmBlock_l;
+	int key_len, i;
+	unsigned char temp_exp[256], *tgt_p, *temp, *exp_p;
+	struct type6_hdr *tp6Hdr_p;
+	struct CPRBX *cprbx_p;
+	struct cca_public_key *key_p;
+	struct T6_keyBlock_hdrX *keyb_p;
+
+	mod_len = icaMsg_p->inputdatalength;
+	if (copy_from_user(temp_exp, icaMsg_p->b_key, mod_len))
+		return SEN_RELEASED;
+	if (is_empty(temp_exp, mod_len))
+		return SEN_USER_ERROR;
+	exp_p = temp_exp;
+	for (i = 0; i < mod_len; i++)
+		if (exp_p[i])
+			break;
+	if (i >= mod_len)
+		return SEN_USER_ERROR;
+	exp_len = mod_len - i;
+	exp_p += i;
+	PDEBUG("exp_len after computation: %08x\n", exp_len);
+	tmp_size = FIXED_TYPE6_ME_EN_LENX + 2 * mod_len + exp_len;
+	total_CPRB_len = tmp_size - sizeof(struct type6_hdr);
+	parmBlock_l = total_CPRB_len - sizeof(struct CPRBX);
+	tmp_size = tmp_size + CALLER_HEADER;
+	vud_len = 2 + mod_len;
+	memset(z90cMsg_p, 0, tmp_size);
+	tgt_p = (unsigned char *)z90cMsg_p + CALLER_HEADER;
+	memcpy(tgt_p, &static_type6_hdrX, sizeof(struct type6_hdr));
+	tp6Hdr_p = (struct type6_hdr *)tgt_p;
+	tp6Hdr_p->ToCardLen1 = total_CPRB_len;
+	tp6Hdr_p->FromCardLen1 = RESPONSE_CPRBX_SIZE;
+	memcpy(tp6Hdr_p->function_code, static_PKE_function_code,
+	       sizeof(static_PKE_function_code));
+	tgt_p += sizeof(struct type6_hdr);
+	memcpy(tgt_p, &static_cprbx, sizeof(struct CPRBX));
+	cprbx_p = (struct CPRBX *) tgt_p;
+	cprbx_p->domain = (unsigned short)cdx;
+	cprbx_p->rpl_msgbl = RESPONSE_CPRBX_SIZE;
+	tgt_p += sizeof(struct CPRBX);
+	memcpy(tgt_p, &static_pke_function_and_rulesX,
+	       sizeof(struct function_and_rules_block));
+	tgt_p += sizeof(struct function_and_rules_block);
+
+	tgt_p += 2;
+	if (copy_from_user(tgt_p, icaMsg_p->inputdata, mod_len))
+	      return SEN_RELEASED;
+	if (is_empty(tgt_p, mod_len))
+	      return SEN_USER_ERROR;
+	tgt_p -= 2;
+	*((short *)tgt_p) = (short) vud_len;
+	tgt_p += vud_len;
+	keyb_p = (struct T6_keyBlock_hdrX *)tgt_p;
+	tgt_p += sizeof(struct T6_keyBlock_hdrX);
+	memcpy(tgt_p, &static_public_key, sizeof(static_public_key));
+	key_p = (struct cca_public_key *)tgt_p;
+	temp = key_p->pubSec.exponent;
+	memcpy(temp, exp_p, exp_len);
+	temp += exp_len;
+	if (copy_from_user(temp, icaMsg_p->n_modulus, mod_len))
+	      return SEN_RELEASED;
+	if (is_empty(temp, mod_len))
+	      return SEN_USER_ERROR;
+	key_p->pubSec.modulus_bit_len = 8 * mod_len;
+	key_p->pubSec.modulus_byte_len = mod_len;
+	key_p->pubSec.exponent_len = exp_len;
+	key_p->pubSec.section_length = 12 + mod_len + exp_len;
+	key_len = key_p->pubSec.section_length + sizeof(struct cca_token_hdr);
+	key_p->pubHdr.token_length = key_len;
+	key_len += 4;
+	keyb_p->ulen = (unsigned short)key_len;
+	key_len += 2;
+	keyb_p->blen = (unsigned short)key_len;
+	cprbx_p->req_parml = parmBlock_l;
+	*z90cMsg_l_p = tmp_size - CALLER_HEADER;
+
+	return 0;
+}
+
+static int
+ICACRT_msg_to_type6CRT_msgX(struct ica_rsa_modexpo_crt *icaMsg_p, int cdx,
+			    int *z90cMsg_l_p, struct type6_msg *z90cMsg_p)
+{
+	int mod_len, vud_len, tmp_size, total_CPRB_len, parmBlock_l, short_len;
+	int long_len, pad_len, keyPartsLen, tmp_l;
+	unsigned char *tgt_p, *temp;
+	struct type6_hdr *tp6Hdr_p;
+	struct CPRBX *cprbx_p;
+	struct cca_token_hdr *keyHdr_p;
+	struct cca_pvt_ext_CRT_sec *pvtSec_p;
+	struct cca_public_sec *pubSec_p;
+
+	mod_len = icaMsg_p->inputdatalength;
+	short_len = mod_len / 2;
+	long_len = 8 + short_len;
+	keyPartsLen = 3 * long_len + 2 * short_len;
+	pad_len = (8 - (keyPartsLen % 8)) % 8;
+	keyPartsLen += pad_len + mod_len;
+	tmp_size = FIXED_TYPE6_CR_LENX + keyPartsLen + mod_len;
+	total_CPRB_len = tmp_size -  sizeof(struct type6_hdr);
+	parmBlock_l = total_CPRB_len - sizeof(struct CPRBX);
+	vud_len = 2 + mod_len;
+	tmp_size = tmp_size + CALLER_HEADER;
+	memset(z90cMsg_p, 0, tmp_size);
+	tgt_p = (unsigned char *)z90cMsg_p + CALLER_HEADER;
+	memcpy(tgt_p, &static_type6_hdrX, sizeof(struct type6_hdr));
+	tp6Hdr_p = (struct type6_hdr *)tgt_p;
+	tp6Hdr_p->ToCardLen1 = total_CPRB_len;
+	tp6Hdr_p->FromCardLen1 = RESPONSE_CPRBX_SIZE;
+	tgt_p += sizeof(struct type6_hdr);
+	cprbx_p = (struct CPRBX *) tgt_p;
+	memcpy(tgt_p, &static_cprbx, sizeof(struct CPRBX));
+	cprbx_p->domain = (unsigned short)cdx;
+	cprbx_p->req_parml = parmBlock_l;
+	cprbx_p->rpl_msgbl = parmBlock_l;
+	tgt_p += sizeof(struct CPRBX);
+	memcpy(tgt_p, &static_pkd_function_and_rulesX,
+	       sizeof(struct function_and_rules_block));
+	tgt_p += sizeof(struct function_and_rules_block);
+	*((short *)tgt_p) = (short) vud_len;
+	tgt_p += 2;
+	if (copy_from_user(tgt_p, icaMsg_p->inputdata, mod_len))
+		return SEN_RELEASED;
+	if (is_empty(tgt_p, mod_len))
+		return SEN_USER_ERROR;
+	tgt_p += mod_len;
+	tmp_l = sizeof(struct T6_keyBlock_hdr) + sizeof(struct cca_token_hdr) +
+		sizeof(struct cca_pvt_ext_CRT_sec) + 0x0F + keyPartsLen;
+	*((short *)tgt_p) = (short) tmp_l;
+	temp = tgt_p + 2;
+	tmp_l -= 2;
+	*((short *)temp) = (short) tmp_l;
+	tgt_p += sizeof(struct T6_keyBlock_hdr);
+	keyHdr_p = (struct cca_token_hdr *)tgt_p;
+	keyHdr_p->token_identifier = CCA_TKN_HDR_ID_EXT;
+	tmp_l -= 4;
+	keyHdr_p->token_length = tmp_l;
+	tgt_p += sizeof(struct cca_token_hdr);
+	pvtSec_p = (struct cca_pvt_ext_CRT_sec *)tgt_p;
+	pvtSec_p->section_identifier = CCA_PVT_EXT_CRT_SEC_ID_PVT;
+	pvtSec_p->section_length =
+		sizeof(struct cca_pvt_ext_CRT_sec) + keyPartsLen;
+	pvtSec_p->key_format = CCA_PVT_EXT_CRT_SEC_FMT_CL;
+	pvtSec_p->key_use_flags[0] = CCA_PVT_USAGE_ALL;
+	pvtSec_p->p_len = long_len;
+	pvtSec_p->q_len = short_len;
+	pvtSec_p->dp_len = long_len;
+	pvtSec_p->dq_len = short_len;
+	pvtSec_p->u_len = long_len;
+	pvtSec_p->mod_len = mod_len;
+	pvtSec_p->pad_len = pad_len;
+	tgt_p += sizeof(struct cca_pvt_ext_CRT_sec);
+	if (copy_from_user(tgt_p, icaMsg_p->np_prime, long_len))
+		return SEN_RELEASED;
+	if (is_empty(tgt_p, long_len))
+		return SEN_USER_ERROR;
+	tgt_p += long_len;
+	if (copy_from_user(tgt_p, icaMsg_p->nq_prime, short_len))
+		return SEN_RELEASED;
+	if (is_empty(tgt_p, short_len))
+		return SEN_USER_ERROR;
+	tgt_p += short_len;
+	if (copy_from_user(tgt_p, icaMsg_p->bp_key, long_len))
+		return SEN_RELEASED;
+	if (is_empty(tgt_p, long_len))
+		return SEN_USER_ERROR;
+	tgt_p += long_len;
+	if (copy_from_user(tgt_p, icaMsg_p->bq_key, short_len))
+		return SEN_RELEASED;
+	if (is_empty(tgt_p, short_len))
+		return SEN_USER_ERROR;
+	tgt_p += short_len;
+	if (copy_from_user(tgt_p, icaMsg_p->u_mult_inv, long_len))
+		return SEN_RELEASED;
+	if (is_empty(tgt_p, long_len))
+		return SEN_USER_ERROR;
+	tgt_p += long_len;
+	tgt_p += pad_len;
+	memset(tgt_p, 0xFF, mod_len);
+	tgt_p += mod_len;
+	memcpy(tgt_p, &static_cca_pub_sec, sizeof(struct cca_public_sec));
+	pubSec_p = (struct cca_public_sec *) tgt_p;
+	pubSec_p->modulus_bit_len = 8 * mod_len;
+	*z90cMsg_l_p = tmp_size - CALLER_HEADER;
+
+	return 0;
+}
+
+int
+convert_request(unsigned char *buffer, int func, unsigned short function,
+		int cdx, int dev_type, int *msg_l_p, unsigned char *msg_p)
+{
+	if (dev_type == PCICA) {
+		if (func == ICARSACRT)
+			return ICACRT_msg_to_type4CRT_msg(
+				(struct ica_rsa_modexpo_crt *) buffer,
+				msg_l_p, (union type4_msg *) msg_p);
+		else
+			return ICAMEX_msg_to_type4MEX_msg(
+				(struct ica_rsa_modexpo *) buffer,
+				msg_l_p, (union type4_msg *) msg_p);
+	}
+	if (dev_type == PCICC) {
+		if (func == ICARSACRT)
+			return ICACRT_msg_to_type6CRT_msg(
+				(struct ica_rsa_modexpo_crt *) buffer,
+				cdx, msg_l_p, (struct type6_msg *)msg_p);
+		if (function == PCI_FUNC_KEY_ENCRYPT)
+			return ICAMEX_msg_to_type6MEX_en_msg(
+				(struct ica_rsa_modexpo *) buffer,
+				cdx, msg_l_p, (struct type6_msg *) msg_p);
+		else
+			return ICAMEX_msg_to_type6MEX_de_msg(
+				(struct ica_rsa_modexpo *) buffer,
+				cdx, msg_l_p, (struct type6_msg *) msg_p);
+	}
+	if (dev_type == PCIXCC) {
+		if (func == ICARSACRT)
+			return ICACRT_msg_to_type6CRT_msgX(
+				(struct ica_rsa_modexpo_crt *) buffer,
+				cdx, msg_l_p, (struct type6_msg *) msg_p);
+		else
+			return ICAMEX_msg_to_type6MEX_msgX(
+				(struct ica_rsa_modexpo *) buffer,
+				cdx, msg_l_p, (struct type6_msg *) msg_p);
+	}
+
+	return 0;
+}
+
+int
+convert_response(unsigned char *response, unsigned char *buffer,
+		 int *respbufflen_p, unsigned char *resp_buff)
+{
+	struct ica_rsa_modexpo *icaMsg_p = (struct ica_rsa_modexpo *) buffer;
+	struct type82_hdr *t82h_p = (struct type82_hdr *) response;
+	struct type84_hdr *t84h_p = (struct type84_hdr *) response;
+	struct type86_hdr *t86h_p = (struct type86_hdr *) response;
+	int rv, reply_code, service_rc, service_rs, src_l;
+	unsigned char *src_p, *tgt_p;
+	struct CPRB *cprb_p;
+	struct CPRBX *cprbx_p;
+
+	src_p = 0;
+	reply_code = 0;
+	service_rc = 0;
+	service_rs = 0;
+	src_l = 0;
+	rv = 0;
+	switch (t82h_p->type) {
+	case TYPE82_RSP_CODE:
+		reply_code = t82h_p->reply_code;
+		rv = 4;
+		src_p = (unsigned char *)t82h_p;
+		PRINTK("Hardware error: Type 82 Message Header: "
+		       "%02x%02x%02x%02x%02x%02x%02x%02x\n",
+		       src_p[0], src_p[1], src_p[2], src_p[3],
+		       src_p[4], src_p[5], src_p[6], src_p[7]);
+		break;
+	case TYPE84_RSP_CODE:
+		src_l = icaMsg_p->outputdatalength;
+		src_p = response + (int)t84h_p->len - src_l;
+		break;
+	case TYPE86_RSP_CODE:
+		reply_code = t86h_p->reply_code;
+		if (t86h_p->format != TYPE86_FMT2) {
+			rv = 4;
+			break;
+		}
+		if (reply_code != 0) {
+			rv = 4;
+			break;
+		}
+		cprb_p = (struct CPRB *)
+			(response + sizeof(struct type86_fmt2_msg));
+		cprbx_p = (struct CPRBX *) cprb_p;
+		if (cprb_p->cprb_ver_id != 0x02) {
+			le2toI(cprb_p->ccp_rtcode, &service_rc);
+			if (service_rc != 0) {
+				le2toI(cprb_p->ccp_rscode, &service_rs);
+				if ((service_rc == 8) && (service_rs == 66))
+					PDEBUG("8/66 on PCICC\n");
+				else
+					PRINTK("service rc/rs: %d/%d\n",
+					       service_rc, service_rs);
+				rv = 8;
+			}
+			src_p = (unsigned char *)cprb_p + sizeof(struct CPRB);
+			src_p += 4;
+			le2toI(src_p, &src_l);
+			src_l -= 2;
+			src_p += 2;
+		} else {
+			service_rc = (int)cprbx_p->ccp_rtcode;
+			if (service_rc != 0) {
+				service_rs = (int) cprbx_p->ccp_rscode;
+				if ((service_rc == 8) && (service_rs == 66))
+					PDEBUG("8/66 on PCIXCC\n");
+				else
+					PRINTK("service rc/rs: %d/%d\n",
+					       service_rc, service_rs);
+				rv = 8;
+			}
+			src_p = (unsigned char *)
+				cprbx_p + sizeof(struct CPRBX);
+			src_p += 4;
+			src_l = (int)(*((short *) src_p));
+			src_l -= 2;
+			src_p += 2;
+		}
+		break;
+	default:
+		break;
+	}
+
+	if (rv == 8)
+		return 8;
+	if (rv == 4)
+		switch (reply_code) {
+		case REPLY_ERROR_OPERAND_INVALID:
+			return REC_OPERAND_INV;
+		case REPLY_ERROR_OPERAND_SIZE:
+			return REC_OPERAND_SIZE;
+		case REPLY_ERROR_EVEN_MOD_IN_OPND:
+			return REC_EVEN_MOD;
+		case REPLY_ERROR_MESSAGE_TYPE:
+			return WRONG_DEVICE_TYPE;
+		default:
+			return 12;
+		}
+
+	if (service_rc != 0)
+		return REC_OPERAND_INV;
+
+	if ((src_l > icaMsg_p->outputdatalength) ||
+	    (src_l > RESPBUFFSIZE) ||
+	    (src_l <= 0))
+		return REC_OPERAND_SIZE;
+
+	PDEBUG("Length returned = %d\n", src_l);
+	tgt_p = resp_buff + icaMsg_p->outputdatalength - src_l;
+	memcpy(tgt_p, src_p, src_l);
+	if ((t82h_p->type == TYPE86_RSP_CODE) && (resp_buff < tgt_p)) {
+		memset(resp_buff, 0, icaMsg_p->outputdatalength - src_l);
+		rv = pad_msg(resp_buff, icaMsg_p->outputdatalength, src_l);
+		if (rv != 0)
+			return rv;
+	}
+	*respbufflen_p = icaMsg_p->outputdatalength;
+	if (*respbufflen_p == 0)
+		PRINTK("Zero *respbufflen_p\n");
+
+	return rv;
+}
+
--- diff/drivers/s390/crypto/z90main.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/s390/crypto/z90main.c	2004-04-21 10:45:34.580446472 +0100
@@ -0,0 +1,3252 @@
+/*
+ *  linux/drivers/s390/misc/z90main.c
+ *
+ *  z90crypt 1.3.1
+ *
+ *  Copyright (C)  2001, 2004 IBM Corporation
+ *  Author(s): Robert Burroughs (burrough@us.ibm.com)
+ *	       Eric Rossman (edrossma@us.ibm.com)
+ *
+ *  Hotplug & misc device support: Jochen Roehrig (roehrig@de.ibm.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <asm/uaccess.h>       // copy_(from|to)_user
+#include <linux/compat.h>
+#include <linux/compiler.h>
+#include <linux/delay.h>       // mdelay
+#include <linux/init.h>
+#include <linux/interrupt.h>   // for tasklets
+#include <linux/ioctl32.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/proc_fs.h>
+#include <linux/syscalls.h>
+#include <linux/version.h>
+#include "z90crypt.h"
+#include "z90common.h"
+#ifndef Z90CRYPT_USE_HOTPLUG
+#include <linux/miscdevice.h>
+#endif
+
+#define VERSION_CODE(vers, rel, seq) (((vers)<<16) | ((rel)<<8) | (seq))
+#if LINUX_VERSION_CODE < VERSION_CODE(2,4,0) /* version < 2.4 */
+#  error "This kernel is too old: not supported"
+#endif
+#if LINUX_VERSION_CODE > VERSION_CODE(2,7,0) /* version > 2.6 */
+#  error "This kernel is too recent: not supported by this file"
+#endif
+
+#define VERSION_Z90MAIN_C "$Revision: 1.31 $"
+
+static char z90cmain_version[] __initdata =
+	"z90main.o (" VERSION_Z90MAIN_C "/"
+                      VERSION_Z90COMMON_H "/" VERSION_Z90CRYPT_H ")";
+
+extern char z90chardware_version[];
+
+/**
+ * Defaults that may be modified.
+ */
+
+#ifndef Z90CRYPT_USE_HOTPLUG
+/**
+ * You can specify a different minor at compile time.
+ */
+#ifndef Z90CRYPT_MINOR
+#define Z90CRYPT_MINOR	MISC_DYNAMIC_MINOR
+#endif
+#else
+/**
+ * You can specify a different major at compile time.
+ */
+#ifndef Z90CRYPT_MAJOR
+#define Z90CRYPT_MAJOR	0
+#endif
+#endif
+
+/**
+ * You can specify a different domain at compile time or on the insmod
+ * command line.
+ */
+#ifndef DOMAIN_INDEX
+#define DOMAIN_INDEX	-1
+#endif
+
+/**
+ * This is the name under which the device is registered in /proc/modules.
+ */
+#define REG_NAME	"z90crypt"
+
+/**
+ * Cleanup should run every CLEANUPTIME seconds and should clean up requests
+ * older than CLEANUPTIME seconds in the past.
+ */
+#ifndef CLEANUPTIME
+#define CLEANUPTIME 15
+#endif
+
+/**
+ * Config should run every CONFIGTIME seconds
+ */
+#ifndef CONFIGTIME
+#define CONFIGTIME 30
+#endif
+
+/**
+ * The first execution of the config task should take place
+ * immediately after initialization
+ */
+#ifndef INITIAL_CONFIGTIME
+#define INITIAL_CONFIGTIME 1
+#endif
+
+/**
+ * Reader should run every READERTIME milliseconds
+ */
+#ifndef READERTIME
+#define READERTIME 2
+#endif
+
+/**
+ * turn long device array index into device pointer
+ */
+#define LONG2DEVPTR(ndx) (z90crypt.device_p[(ndx)])
+
+/**
+ * turn short device array index into long device array index
+ */
+#define SHRT2LONG(ndx) (z90crypt.overall_device_x.device_index[(ndx)])
+
+/**
+ * turn short device array index into device pointer
+ */
+#define SHRT2DEVPTR(ndx) LONG2DEVPTR(SHRT2LONG(ndx))
+
+/**
+ * Status for a work-element
+ */
+#define STAT_DEFAULT	0x00 // request has not been processed
+
+#define STAT_ROUTED	0x80 // bit 7: requests get routed to specific device
+			     //	       else, device is determined each write
+#define STAT_FAILED	0x40 // bit 6: this bit is set if the request failed
+			     //	       before being sent to the hardware.
+#define STAT_WRITTEN	0x30 // bits 5-4: work to be done, not sent to device
+//			0x20 // UNUSED state
+#define STAT_READPEND	0x10 // bits 5-4: work done, we're returning data now
+#define STAT_NOWORK	0x00 // bits off: no work on any queue
+#define STAT_RDWRMASK	0x30 // mask for bits 5-4
+
+/**
+ * Macros to check the status RDWRMASK
+ */
+#define CHK_RDWRMASK(statbyte) ((statbyte) & STAT_RDWRMASK)
+#define SET_RDWRMASK(statbyte, newval) \
+	{(statbyte) &= ~STAT_RDWRMASK; (statbyte) |= newval;}
+
+/**
+ * Audit Trail.	 Progress of a Work element
+ * audit[0]: Unless noted otherwise, these bits are all set by the process
+ */
+#define FP_COPYFROM	0x80 // Caller's buffer has been copied to work element
+#define FP_BUFFREQ	0x40 // Low Level buffer requested
+#define FP_BUFFGOT	0x20 // Low Level buffer obtained
+#define FP_SENT		0x10 // Work element sent to a crypto device
+			     // (may be set by process or by reader task)
+#define FP_PENDING	0x08 // Work element placed on pending queue
+			     // (may be set by process or by reader task)
+#define FP_REQUEST	0x04 // Work element placed on request queue
+#define FP_ASLEEP	0x02 // Work element about to sleep
+#define FP_AWAKE	0x01 // Work element has been awakened
+
+/**
+ * audit[1]: These bits are set by the reader task and/or the cleanup task
+ */
+#define FP_NOTPENDING	  0x80 // Work element removed from pending queue
+#define FP_AWAKENING	  0x40 // Caller about to be awakened
+#define FP_TIMEDOUT	  0x20 // Caller timed out
+#define FP_RESPSIZESET	  0x10 // Response size copied to work element
+#define FP_RESPADDRCOPIED 0x08 // Response address copied to work element
+#define FP_RESPBUFFCOPIED 0x04 // Response buffer copied to work element
+#define FP_REMREQUEST	  0x02 // Work element removed from request queue
+#define FP_SIGNALED	  0x01 // Work element was awakened by a signal
+
+/**
+ * audit[2]: unused
+ */
+
+/**
+ * state of the file handle in private_data.status
+ */
+#define STAT_OPEN 0
+#define STAT_CLOSED 1
+
+/**
+ * PID() expands to the process ID of the current process
+ */
+#define PID() (current->pid)
+
+/**
+ * Selected Constants.	The number of APs and the number of devices
+ */
+#ifndef Z90CRYPT_NUM_APS
+#define Z90CRYPT_NUM_APS 64
+#endif
+#ifndef Z90CRYPT_NUM_DEVS
+#define Z90CRYPT_NUM_DEVS Z90CRYPT_NUM_APS
+#endif
+#ifndef Z90CRYPT_NUM_TYPES
+#define Z90CRYPT_NUM_TYPES 3
+#endif
+
+/**
+ * Buffer size for receiving responses. The maximum Response Size
+ * is actually the maximum request size, since in an error condition
+ * the request itself may be returned unchanged.
+ */
+#ifndef MAX_RESPONSE_SIZE
+#define MAX_RESPONSE_SIZE 0x0000077C
+#endif
+
+/**
+ * A count and status-byte mask
+ */
+struct status {
+	int	      st_count;		    // # of enabled devices
+	int	      disabled_count;	    // # of disabled devices
+	int	      user_disabled_count;  // # of devices disabled via proc fs
+	unsigned char st_mask[Z90CRYPT_NUM_APS]; // current status mask
+};
+
+/**
+ * The array of device indexes is a mechanism for fast indexing into
+ * a long (and sparse) array.  For instance, if APs 3, 9 and 47 are
+ * installed, z90CDeviceIndex[0] is 3, z90CDeviceIndex[1] is 9, and
+ * z90CDeviceIndex[2] is 47.
+ */
+struct device_x {
+	int device_index[Z90CRYPT_NUM_DEVS];
+};
+
+/**
+ * All devices are arranged in a single array: 64 APs
+ */
+struct device {
+	int		 dev_type;	    // PCICA, PCICC, or PCIXCC
+	enum devstat	 dev_stat;	    // current device status
+	int		 dev_self_x;	    // Index in array
+	int		 disabled;	    // Set when device is in error
+	int		 user_disabled;	    // Set when device is disabled by user
+	int		 dev_q_depth;	    // q depth
+	unsigned char *	 dev_resp_p;	    // Response buffer address
+	int		 dev_resp_l;	    // Response Buffer length
+	int		 dev_caller_count;  // Number of callers
+	int		 dev_total_req_cnt; // # requests for device since load
+	struct list_head dev_caller_list;   // List of callers
+};
+
+/**
+ * There's a struct status and a struct device_x for each device type.
+ */
+struct hdware_block {
+	struct status	hdware_mask;
+	struct status	type_mask[Z90CRYPT_NUM_TYPES];
+	struct device_x type_x_addr[Z90CRYPT_NUM_TYPES];
+	unsigned char	device_type_array[Z90CRYPT_NUM_APS];
+};
+
+/**
+ * z90crypt is the topmost data structure in the hierarchy.
+ */
+struct z90crypt {
+	int		     max_count;		// Nr of possible crypto devices
+	struct status	     mask;
+	int		     q_depth_array[Z90CRYPT_NUM_DEVS];
+	int		     dev_type_array[Z90CRYPT_NUM_DEVS];
+	struct device_x	     overall_device_x;	// array device indexes
+	struct device *	     device_p[Z90CRYPT_NUM_DEVS];
+	int		     terminating;
+	int		     domain_established;// TRUE:  domain has been found
+	int		     cdx;		// Crypto Domain Index
+	int		     len;		// Length of this data structure
+	struct hdware_block *hdware_info;
+};
+
+/**
+ * An array of these structures is pointed to from dev_caller
+ * The length of the array depends on the device type. For APs,
+ * there are 8.
+ *
+ * The caller buffer is allocated to the user at OPEN. At WRITE,
+ * it contains the request; at READ, the response. The function
+ * send_to_crypto_device converts the request to device-dependent
+ * form and use the caller's OPEN-allocated buffer for the response.
+ */
+struct caller {
+	int		 caller_buf_l;		 // length of original request
+	unsigned char *	 caller_buf_p;		 // Original request on WRITE
+	int		 caller_dev_dep_req_l;	 // len device dependent request
+	unsigned char *	 caller_dev_dep_req_p;	 // Device dependent form
+	unsigned char	 caller_id[8];		 // caller-supplied message id
+	struct list_head caller_liste;
+	unsigned char	 caller_dev_dep_req[MAX_RESPONSE_SIZE];
+};
+
+/**
+ * Function prototypes from z90hardware.c
+ */
+enum hdstat query_online(int, int, int, int *, int *);
+enum devstat reset_device(int, int, int);
+enum devstat send_to_AP(int, int, int, unsigned char *);
+enum devstat receive_from_AP(int, int, int, unsigned char *, unsigned char *);
+int convert_request(unsigned char *, int, short, int, int, int *,
+		    unsigned char *);
+int convert_response(unsigned char *, unsigned char *, int *, unsigned char *);
+
+/**
+ * Low level function prototypes
+ */
+static int create_z90crypt(int *);
+static int refresh_z90crypt(int *);
+static int find_crypto_devices(struct status *);
+static int create_crypto_device(int);
+static int destroy_crypto_device(int);
+static void destroy_z90crypt(void);
+static int refresh_index_array(struct status *, struct device_x *);
+static int probe_device_type(struct device *);
+
+/**
+ * proc fs definitions
+ */
+static struct proc_dir_entry *z90crypt_entry;
+
+/**
+ * data structures
+ */
+
+/**
+ * work_element.opener points back to this structure
+ */
+struct priv_data {
+	pid_t	opener_pid;
+	unsigned char	status;		// 0: open  1: closed
+};
+
+/**
+ * A work element is allocated for each request
+ */
+struct work_element {
+	struct priv_data *priv_data;
+	pid_t		  pid;
+	int		  devindex;	  // index of device processing this w_e
+					  // (If request did not specify device,
+					  // -1 until placed onto a queue)
+	int		  devtype;
+	struct list_head  liste;	  // used for requestq and pendingq
+	char		  buffer[128];	  // local copy of user request
+	int		  buff_size;	  // size of the buffer for the request
+	char		  resp_buff[RESPBUFFSIZE];
+	int		  resp_buff_size;
+	char *		  resp_addr;	  // address of response in user space
+	unsigned int	  funccode;	  // function code of request
+	wait_queue_head_t waitq;
+	unsigned long	  requestsent;	  // time at which the request was sent
+	atomic_t	  alarmrung;	  // wake-up signal
+	unsigned char	  caller_id[8];	  // pid + counter, for this w_e
+	unsigned char	  status[1];	  // bits to mark status of the request
+	unsigned char	  audit[3];	  // record of work element's progress
+	unsigned char *	  requestptr;	  // address of request buffer
+	int		  retcode;	  // return code of request
+};
+
+/**
+ * High level function prototypes
+ */
+static int z90crypt_open(struct inode *, struct file *);
+static int z90crypt_release(struct inode *, struct file *);
+static ssize_t z90crypt_read(struct file *, char *, size_t, loff_t *);
+static ssize_t z90crypt_write(struct file *, const char *, size_t, loff_t *);
+static int z90crypt_ioctl(struct inode *, struct file *,
+			  unsigned int, unsigned long);
+
+static void z90crypt_reader_task(unsigned long);
+static void z90crypt_schedule_reader_task(unsigned long);
+static void z90crypt_config_task(unsigned long);
+static void z90crypt_cleanup_task(unsigned long);
+
+static int z90crypt_status(char *, char **, off_t, int, int *, void *);
+static int z90crypt_status_write(struct file *, const char *,
+				 unsigned long, void *);
+
+/**
+ * Hotplug support
+ */
+
+#ifdef Z90CRYPT_USE_HOTPLUG
+#define Z90CRYPT_HOTPLUG_ADD	 1
+#define Z90CRYPT_HOTPLUG_REMOVE	 2
+
+static void z90crypt_hotplug_event(int, int, int);
+#endif
+
+/**
+ * Storage allocated at initialization and used throughout the life of
+ * this insmod
+ */
+#ifdef Z90CRYPT_USE_HOTPLUG
+static int z90crypt_major = Z90CRYPT_MAJOR;
+#endif
+
+static int domain = DOMAIN_INDEX;
+static struct z90crypt z90crypt;
+static int quiesce_z90crypt;
+static spinlock_t queuespinlock;
+static struct list_head request_list;
+static int requestq_count;
+static struct list_head pending_list;
+static int pendingq_count;
+
+static struct tasklet_struct reader_tasklet;
+static struct timer_list reader_timer;
+static struct timer_list config_timer;
+static struct timer_list cleanup_timer;
+static atomic_t total_open;
+static atomic_t z90crypt_step;
+
+static struct file_operations z90crypt_fops = {
+	.owner	 = THIS_MODULE,
+	.read	 = z90crypt_read,
+	.write	 = z90crypt_write,
+	.ioctl	 = z90crypt_ioctl,
+	.open	 = z90crypt_open,
+	.release = z90crypt_release
+};
+
+#ifndef Z90CRYPT_USE_HOTPLUG
+static struct miscdevice z90crypt_misc_device = {
+	.minor	    = Z90CRYPT_MINOR,
+	.name	    = DEV_NAME,
+	.fops	    = &z90crypt_fops,
+	.devfs_name = DEV_NAME
+};
+#endif
+
+/**
+ * Documentation values.
+ */
+MODULE_AUTHOR("zLinux Crypto Team: Robert H. Burroughs, Eric D. Rossman"
+	      "and Jochen Roehrig");
+MODULE_DESCRIPTION("zLinux Cryptographic Coprocessor device driver, "
+		   "Copyright 2001, 2004 IBM Corporation");
+MODULE_LICENSE("GPL");
+module_param(domain, int, 0);
+MODULE_PARM_DESC(domain, "domain index for device");
+
+#ifdef CONFIG_COMPAT
+/**
+ * ioctl32 conversion routines
+ */
+struct ica_rsa_modexpo_32 { // For 32-bit callers
+	compat_uptr_t	inputdata;
+	unsigned int	inputdatalength;
+	compat_uptr_t	outputdata;
+	unsigned int	outputdatalength;
+	compat_uptr_t	b_key;
+	compat_uptr_t	n_modulus;
+};
+
+static int
+trans_modexpo32(unsigned int fd, unsigned int cmd, unsigned long arg,
+		struct file *file)
+{
+	struct ica_rsa_modexpo_32 *mex32u = compat_ptr(arg);
+	struct ica_rsa_modexpo_32  mex32k;
+	struct ica_rsa_modexpo    *mex64;
+	int ret = 0;
+	unsigned int i;
+
+	if (!access_ok(VERIFY_WRITE, mex32u, sizeof(struct ica_rsa_modexpo_32)))
+		return -EFAULT;
+	mex64 = compat_alloc_user_space(sizeof(struct ica_rsa_modexpo));
+	if (!access_ok(VERIFY_WRITE, mex64, sizeof(struct ica_rsa_modexpo)))
+		return -EFAULT;
+	if (copy_from_user(&mex32k, mex32u, sizeof(struct ica_rsa_modexpo_32)))
+		return -EFAULT;
+	if (__put_user(compat_ptr(mex32k.inputdata), &mex64->inputdata)   ||
+	    __put_user(mex32k.inputdatalength, &mex64->inputdatalength)   ||
+	    __put_user(compat_ptr(mex32k.outputdata), &mex64->outputdata) ||
+	    __put_user(mex32k.outputdatalength, &mex64->outputdatalength) ||
+	    __put_user(compat_ptr(mex32k.b_key), &mex64->b_key)           ||
+	    __put_user(compat_ptr(mex32k.n_modulus), &mex64->n_modulus))
+		return -EFAULT;
+	ret = sys_ioctl(fd, cmd, (unsigned long)mex64);
+	if (!ret)
+		if (__get_user(i, &mex64->outputdatalength) ||
+		    __put_user(i, &mex32u->outputdatalength))
+			ret = -EFAULT;
+	return ret;
+}
+
+struct ica_rsa_modexpo_crt_32 { // For 32-bit callers
+	compat_uptr_t	inputdata;
+	unsigned int	inputdatalength;
+	compat_uptr_t	outputdata;
+	unsigned int	outputdatalength;
+	compat_uptr_t	bp_key;
+	compat_uptr_t	bq_key;
+	compat_uptr_t	np_prime;
+	compat_uptr_t	nq_prime;
+	compat_uptr_t	u_mult_inv;
+};
+
+static int
+trans_modexpo_crt32(unsigned int fd, unsigned int cmd, unsigned long arg,
+		    struct file *file)
+{
+	struct ica_rsa_modexpo_crt_32 *crt32u = compat_ptr(arg);
+	struct ica_rsa_modexpo_crt_32  crt32k;
+	struct ica_rsa_modexpo_crt    *crt64;
+	int ret = 0;
+	unsigned int i;
+
+	if (!access_ok(VERIFY_WRITE, crt32u,
+		       sizeof(struct ica_rsa_modexpo_crt_32)))
+		return -EFAULT;
+	crt64 = compat_alloc_user_space(sizeof(struct ica_rsa_modexpo_crt));
+	if (!access_ok(VERIFY_WRITE, crt64, sizeof(struct ica_rsa_modexpo_crt)))
+		return -EFAULT;
+	if (copy_from_user(&crt32k, crt32u,
+			   sizeof(struct ica_rsa_modexpo_crt_32)))
+		return -EFAULT;
+	if (__put_user(compat_ptr(crt32k.inputdata), &crt64->inputdata)   ||
+	    __put_user(crt32k.inputdatalength, &crt64->inputdatalength)   ||
+	    __put_user(compat_ptr(crt32k.outputdata), &crt64->outputdata) ||
+	    __put_user(crt32k.outputdatalength, &crt64->outputdatalength) ||
+	    __put_user(compat_ptr(crt32k.bp_key), &crt64->bp_key)         ||
+	    __put_user(compat_ptr(crt32k.bq_key), &crt64->bq_key)         ||
+	    __put_user(compat_ptr(crt32k.np_prime), &crt64->np_prime)     ||
+	    __put_user(compat_ptr(crt32k.nq_prime), &crt64->nq_prime)     ||
+	    __put_user(compat_ptr(crt32k.u_mult_inv), &crt64->u_mult_inv))
+		ret = -EFAULT;
+	if (!ret)
+		ret = sys_ioctl(fd, cmd, (unsigned long)crt64);
+	if (!ret)
+		if (__get_user(i, &crt64->outputdatalength) ||
+		    __put_user(i, &crt32u->outputdatalength))
+			ret = -EFAULT;
+	return ret;
+}
+
+static int compatible_ioctls[] = {
+	ICAZ90STATUS, Z90QUIESCE, Z90STAT_TOTALCOUNT, Z90STAT_PCICACOUNT,
+	Z90STAT_PCICCCOUNT, Z90STAT_PCIXCCCOUNT, Z90STAT_REQUESTQ_COUNT,
+	Z90STAT_PENDINGQ_COUNT, Z90STAT_TOTALOPEN_COUNT, Z90STAT_DOMAIN_INDEX,
+	Z90STAT_STATUS_MASK, Z90STAT_QDEPTH_MASK, Z90STAT_PERDEV_REQCNT,
+};
+
+static void z90_unregister_ioctl32s(void)
+{
+	int i;
+
+	unregister_ioctl32_conversion(ICARSAMODEXPO);
+	unregister_ioctl32_conversion(ICARSACRT);
+
+	for(i = 0; i < ARRAY_SIZE(compatible_ioctls); i++)
+		unregister_ioctl32_conversion(compatible_ioctls[i]);
+}
+
+static int z90_register_ioctl32s(void)
+{
+	int result, i;
+
+	result = register_ioctl32_conversion(ICARSAMODEXPO, trans_modexpo32);
+	if (result)
+		return result;
+	result = register_ioctl32_conversion(ICARSACRT, trans_modexpo_crt32);
+	if (result)
+		return result;
+
+	for(i = 0; i < ARRAY_SIZE(compatible_ioctls); i++) {
+		result = register_ioctl32_conversion(compatible_ioctls[i],NULL);
+		if (result) {
+			z90_unregister_ioctl32s();
+			return result;
+		}
+	}
+	return result;
+}
+#else // !CONFIG_COMPAT
+static inline void z90_unregister_ioctl32s(void)
+{
+}
+
+static inline int z90_register_ioctl32s(void)
+{
+	return 0;
+}
+#endif
+
+/**
+ * The module initialization code.
+ */
+static int __init
+z90crypt_init_module(void)
+{
+	int result, nresult;
+	struct proc_dir_entry *entry;
+
+	PDEBUG("PID %d\n", PID());
+
+#ifndef Z90CRYPT_USE_HOTPLUG
+	/* Register as misc device with given minor (or get a dynamic one). */
+	result = misc_register(&z90crypt_misc_device);
+	if (result <0) {
+		PRINTKW(KERN_ERR "misc_register (minor %d) failed with %d\n",
+			z90crypt_misc_device.minor, result);
+		return result;
+	}
+#else
+	/* Register the major (or get a dynamic one). */
+	result = register_chrdev(z90crypt_major, REG_NAME, &z90crypt_fops);
+	if (result < 0) {
+		PRINTKW("register_chrdev (major %d) failed with %d.\n",
+			z90crypt_major, result);
+		return result;
+	}
+
+	if (z90crypt_major == 0)
+		z90crypt_major = result;
+#endif
+
+	PDEBUG("Registered " DEV_NAME " with result %d\n", result);
+
+	result = create_z90crypt(&domain);
+	if (result != 0) {
+		PRINTKW("create_z90crypt (domain index %d) failed with %d.\n",
+			domain, result);
+		result = -ENOMEM;
+		goto init_module_cleanup;
+	}
+
+	if (result == 0) {
+		PRINTKN("Version %d.%d.%d loaded, built on %s %s\n",
+			z90crypt_VERSION, z90crypt_RELEASE, z90crypt_VARIANT,
+			__DATE__, __TIME__);
+		PRINTKN("%s\n", z90cmain_version);
+		PRINTKN("%s\n", z90chardware_version);
+		PDEBUG("create_z90crypt (domain index %d) successful.\n",
+		       domain);
+	} else
+		PRINTK("No devices at startup\n");
+
+#ifdef Z90CRYPT_USE_HOTPLUG
+	/* generate hotplug event for device node generation */
+	z90crypt_hotplug_event(z90crypt_major, 0, Z90CRYPT_HOTPLUG_ADD);
+#endif
+
+	/* Initialize globals. */
+	spin_lock_init(&queuespinlock);
+
+	INIT_LIST_HEAD(&pending_list);
+	pendingq_count = 0;
+
+	INIT_LIST_HEAD(&request_list);
+	requestq_count = 0;
+
+	quiesce_z90crypt = 0;
+
+	atomic_set(&total_open, 0);
+	atomic_set(&z90crypt_step, 0);
+
+	/* Set up the cleanup task. */
+	init_timer(&cleanup_timer);
+	cleanup_timer.function = z90crypt_cleanup_task;
+	cleanup_timer.data = 0;
+	cleanup_timer.expires = jiffies + (CLEANUPTIME * HZ);
+	add_timer(&cleanup_timer);
+
+	/* Set up the proc file system */
+	entry = create_proc_entry("driver/z90crypt", 0644, 0);
+	if (entry) {
+		entry->nlink = 1;
+		entry->data = 0;
+		entry->read_proc = z90crypt_status;
+		entry->write_proc = z90crypt_status_write;
+	}
+	else
+		PRINTK("Couldn't create z90crypt proc entry\n");
+	z90crypt_entry = entry;
+
+	/* Set up the configuration task. */
+	init_timer(&config_timer);
+	config_timer.function = z90crypt_config_task;
+	config_timer.data = 0;
+	config_timer.expires = jiffies + (INITIAL_CONFIGTIME * HZ);
+	add_timer(&config_timer);
+
+	/* Set up the reader task */
+	tasklet_init(&reader_tasklet, z90crypt_reader_task, 0);
+	init_timer(&reader_timer);
+	reader_timer.function = z90crypt_schedule_reader_task;
+	reader_timer.data = 0;
+	reader_timer.expires = jiffies + (READERTIME * HZ / 1000);
+	add_timer(&reader_timer);
+
+	if ((result = z90_register_ioctl32s()))
+		goto init_module_cleanup;
+
+	return 0; // success
+
+init_module_cleanup:
+	z90_unregister_ioctl32s();
+
+#ifndef Z90CRYPT_USE_HOTPLUG
+	if ((nresult = misc_deregister(&z90crypt_misc_device)))
+		PRINTK("misc_deregister failed with %d.\n", nresult);
+	else
+		PDEBUG("misc_deregister successful.\n");
+#else
+	if ((nresult = unregister_chrdev(z90crypt_major, REG_NAME)))
+		PRINTK("unregister_chrdev failed with %d.\n", nresult);
+	else
+		PDEBUG("unregister_chrdev successful.\n");
+#endif
+
+	return result; // failure
+}
+
+/**
+ * The module termination code
+ */
+static void __exit
+z90crypt_cleanup_module(void)
+{
+	int nresult;
+
+	PDEBUG("PID %d\n", PID());
+
+	z90_unregister_ioctl32s();
+
+	remove_proc_entry("driver/z90crypt", 0);
+
+#ifndef Z90CRYPT_USE_HOTPLUG
+	if ((nresult = misc_deregister(&z90crypt_misc_device)))
+		PRINTK("misc_deregister failed with %d.\n", nresult);
+	else
+		PDEBUG("misc_deregister successful.\n");
+#else
+	z90crypt_hotplug_event(z90crypt_major, 0, Z90CRYPT_HOTPLUG_REMOVE);
+
+	if ((nresult = unregister_chrdev(z90crypt_major, REG_NAME)))
+		PRINTK("unregister_chrdev failed with %d.\n", nresult);
+	else
+		PDEBUG("unregister_chrdev successful.\n");
+#endif
+
+	/* Remove the tasks */
+	tasklet_kill(&reader_tasklet);
+	del_timer(&reader_timer);
+	del_timer(&config_timer);
+	del_timer(&cleanup_timer);
+
+	destroy_z90crypt();
+
+	PRINTKN("Unloaded.\n");
+}
+
+/**
+ * Functions running under a process id
+ *
+ * The I/O functions:
+ *     z90crypt_open
+ *     z90crypt_release
+ *     z90crypt_read
+ *     z90crypt_write
+ *     z90crypt_ioctl
+ *     z90crypt_status
+ *     z90crypt_status_write
+ *	 disable_card
+ *	 enable_card
+ *	 scan_char
+ *	 scan_string
+ *
+ * Helper functions:
+ *     z90crypt_rsa
+ *	 z90crypt_prepare
+ *	 z90crypt_send
+ *	 z90crypt_process_results
+ *
+ */
+static int
+z90crypt_open(struct inode *inode, struct file *filp)
+{
+	struct priv_data *private_data_p;
+
+	if (quiesce_z90crypt)
+		return -EQUIESCE;
+
+	private_data_p = kmalloc(sizeof(struct priv_data), GFP_KERNEL);
+	if (!private_data_p) {
+		PRINTK("Memory allocate failed\n");
+		return -ENOMEM;
+	}
+
+	memset((void *)private_data_p, 0, sizeof(struct priv_data));
+	private_data_p->status = STAT_OPEN;
+	private_data_p->opener_pid = PID();
+	filp->private_data = private_data_p;
+	atomic_inc(&total_open);
+
+	return 0;
+}
+
+static int
+z90crypt_release(struct inode *inode, struct file *filp)
+{
+	struct priv_data *private_data_p = filp->private_data;
+
+	PDEBUG("PID %d (filp %p)\n", PID(), filp);
+
+	private_data_p->status = STAT_CLOSED;
+	memset(private_data_p, 0, sizeof(struct priv_data));
+	kfree(private_data_p);
+	atomic_dec(&total_open);
+
+	return 0;
+}
+
+/*
+ * there are two read functions, of which compile options will choose one
+ * without USE_GET_RANDOM_BYTES
+ *   => read() always returns -EPERM;
+ * otherwise
+ *   => read() uses get_random_bytes() kernel function
+ */
+#ifndef USE_GET_RANDOM_BYTES
+/**
+ * z90crypt_read will not be supported beyond z90crypt 1.3.1
+ */
+static ssize_t
+z90crypt_read(struct file *filp, char *buf, size_t count, loff_t *f_pos)
+{
+	PDEBUG("filp %p (PID %d)\n", filp, PID());
+	return -EPERM;
+}
+#else // we want to use get_random_bytes
+/**
+ * read() just returns a string of random bytes.  Since we have no way
+ * to generate these cryptographically, we just execute get_random_bytes
+ * for the length specified.
+ */
+#include <linux/random.h>
+static ssize_t
+z90crypt_read(struct file *filp, char *buf, size_t count, loff_t *f_pos)
+{
+	unsigned char *temp_buff;
+
+	PDEBUG("filp %p (PID %d)\n", filp, PID());
+
+	if (quiesce_z90crypt)
+		return -EQUIESCE;
+	if (count < 0) {
+		PRINTK("Requested random byte count negative: %ld\n", count);
+		return -EINVAL;
+	}
+	if (count > RESPBUFFSIZE) {
+		PDEBUG("count[%d] > RESPBUFFSIZE", count);
+		return -EINVAL;
+	}
+	if (count == 0)
+		return 0;
+	temp_buff = kmalloc(RESPBUFFSIZE, GFP_KERNEL);
+	if (!temp_buff) {
+		PRINTK("Memory allocate failed\n");
+		return -ENOMEM;
+	}
+	get_random_bytes(temp_buff, count);
+
+	if (copy_to_user(buf, temp_buff, count) != 0) {
+		kfree(temp_buff);
+		return -EFAULT;
+	}
+	kfree(temp_buff);
+	return count;
+}
+#endif
+
+/**
+ * Write is is not allowed
+ */
+static ssize_t
+z90crypt_write(struct file *filp, const char *buf, size_t count, loff_t *f_pos)
+{
+	PDEBUG("filp %p (PID %d)\n", filp, PID());
+	return -EPERM;
+}
+
+/**
+ * New status functions
+ */
+static inline int
+get_status_totalcount(void)
+{
+	return z90crypt.hdware_info->hdware_mask.st_count;
+}
+
+static inline int
+get_status_PCICAcount(void)
+{
+	return z90crypt.hdware_info->type_mask[PCICA].st_count;
+}
+
+static inline int
+get_status_PCICCcount(void)
+{
+	return z90crypt.hdware_info->type_mask[PCICC].st_count;
+}
+
+static inline int
+get_status_PCIXCCcount(void)
+{
+	return z90crypt.hdware_info->type_mask[PCIXCC].st_count;
+}
+
+static inline int
+get_status_requestq_count(void)
+{
+	return requestq_count;
+}
+
+static inline int
+get_status_pendingq_count(void)
+{
+	return pendingq_count;
+}
+
+static inline int
+get_status_totalopen_count(void)
+{
+	return atomic_read(&total_open);
+}
+
+static inline int
+get_status_domain_index(void)
+{
+	return z90crypt.cdx;
+}
+
+static inline unsigned char *
+get_status_status_mask(unsigned char status[Z90CRYPT_NUM_APS])
+{
+	int i, ix;
+
+	memcpy(status, z90crypt.hdware_info->device_type_array,
+	       Z90CRYPT_NUM_APS);
+
+	for (i = 0; i < get_status_totalcount(); i++) {
+		ix = SHRT2LONG(i);
+		if (LONG2DEVPTR(ix)->user_disabled)
+			status[ix] = 0x0d;
+	}
+
+	return status;
+}
+
+static inline unsigned char *
+get_status_qdepth_mask(unsigned char qdepth[Z90CRYPT_NUM_APS])
+{
+	int i, ix;
+
+	memset(qdepth, 0, Z90CRYPT_NUM_APS);
+
+	for (i = 0; i < get_status_totalcount(); i++) {
+		ix = SHRT2LONG(i);
+		qdepth[ix] = LONG2DEVPTR(ix)->dev_caller_count;
+	}
+
+	return qdepth;
+}
+
+static inline unsigned int *
+get_status_perdevice_reqcnt(unsigned int reqcnt[Z90CRYPT_NUM_APS])
+{
+	int i, ix;
+
+	memset(reqcnt, 0, Z90CRYPT_NUM_APS * sizeof(int));
+
+	for (i = 0; i < get_status_totalcount(); i++) {
+		ix = SHRT2LONG(i);
+		reqcnt[ix] = LONG2DEVPTR(ix)->dev_total_req_cnt;
+	}
+
+	return reqcnt;
+}
+
+static inline void
+init_work_element(struct work_element *we_p,
+		  struct priv_data *priv_data, pid_t pid)
+{
+	int step;
+
+	we_p->requestptr = (unsigned char *)we_p + sizeof(struct work_element);
+	/* Come up with a unique id for this caller. */
+	step = atomic_inc_return(&z90crypt_step);
+	memcpy(we_p->caller_id+0, (void *) &pid, sizeof(pid));
+	memcpy(we_p->caller_id+4, (void *) &step, sizeof(step));
+	we_p->pid = pid;
+	we_p->priv_data = priv_data;
+	we_p->status[0] = STAT_DEFAULT;
+	we_p->audit[0] = 0x00;
+	we_p->audit[1] = 0x00;
+	we_p->audit[2] = 0x00;
+	we_p->resp_buff_size = 0;
+	we_p->retcode = 0;
+	we_p->devindex = -1; // send_to_crypto selects the device
+	we_p->devtype = -1;  // getCryptoBuffer selects the type
+	atomic_set(&we_p->alarmrung, 0);
+	init_waitqueue_head(&we_p->waitq);
+	INIT_LIST_HEAD(&(we_p->liste));
+}
+
+static inline int
+allocate_work_element(struct work_element **we_pp,
+		      struct priv_data *priv_data_p, pid_t pid)
+{
+	struct work_element *we_p;
+
+	we_p = (struct work_element *) get_zeroed_page(GFP_KERNEL);
+	if (!we_p)
+		return -ENOMEM;
+	init_work_element(we_p, priv_data_p, pid);
+	*we_pp = we_p;
+	return 0;
+}
+
+static inline void
+remove_device(struct device *device_p)
+{
+	if (!device_p || device_p->disabled != 0)
+		return;
+	device_p->disabled = 1;
+	z90crypt.hdware_info->type_mask[device_p->dev_type].disabled_count++;
+	z90crypt.hdware_info->hdware_mask.disabled_count++;
+}
+
+static inline int
+select_device_type(int *dev_type_p)
+{
+	struct status *stat;
+	if ((*dev_type_p != PCICC) && (*dev_type_p != PCICA) &&
+	    (*dev_type_p != PCIXCC) && (*dev_type_p != ANYDEV))
+		return -1;
+	if (*dev_type_p != ANYDEV) {
+		stat = &z90crypt.hdware_info->type_mask[*dev_type_p];
+		if (stat->st_count >
+		    stat->disabled_count + stat->user_disabled_count)
+			return 0;
+		return -1;
+	}
+
+	stat = &z90crypt.hdware_info->type_mask[PCICA];
+	if (stat->st_count > stat->disabled_count + stat->user_disabled_count) {
+		*dev_type_p = PCICA;
+		return 0;
+	}
+
+	stat = &z90crypt.hdware_info->type_mask[PCIXCC];
+	if (stat->st_count > stat->disabled_count + stat->user_disabled_count) {
+		*dev_type_p = PCIXCC;
+		return 0;
+	}
+
+	stat = &z90crypt.hdware_info->type_mask[PCICC];
+	if (stat->st_count > stat->disabled_count + stat->user_disabled_count) {
+		*dev_type_p = PCICC;
+		return 0;
+	}
+
+	return -1;
+}
+
+/**
+ * Try the selected number, then the selected type (can be ANYDEV)
+ */
+static inline int
+select_device(int *dev_type_p, int *device_nr_p)
+{
+	int i, indx, devTp, low_count, low_indx;
+	struct device_x *index_p;
+	struct device *dev_ptr;
+
+	PDEBUG("device type = %d, index = %d\n", *dev_type_p, *device_nr_p);
+	if ((*device_nr_p >= 0) && (*device_nr_p < Z90CRYPT_NUM_DEVS)) {
+		PDEBUG("trying index = %d\n", *device_nr_p);
+		dev_ptr = z90crypt.device_p[*device_nr_p];
+
+		if (dev_ptr &&
+		    dev_ptr->dev_stat != DEV_GONE &&
+		    dev_ptr->disabled == 0 &&
+		    dev_ptr->user_disabled == 0) {
+			PDEBUG("selected by number, index = %d\n",
+			       *device_nr_p);
+			*dev_type_p = dev_ptr->dev_type;
+			return *device_nr_p;
+		}
+	}
+	*device_nr_p = -1;
+	PDEBUG("trying type = %d\n", *dev_type_p);
+	devTp = *dev_type_p;
+	if (select_device_type(&devTp) == -1) {
+		PDEBUG("failed to select by type\n");
+		return -1;
+	}
+	PDEBUG("selected type = %d\n", devTp);
+	index_p = &z90crypt.hdware_info->type_x_addr[devTp];
+	low_count = 0x0000FFFF;
+	low_indx = -1;
+	for (i = 0; i < z90crypt.hdware_info->type_mask[devTp].st_count; i++) {
+		indx = index_p->device_index[i];
+		dev_ptr = z90crypt.device_p[indx];
+		if (dev_ptr &&
+		    dev_ptr->dev_stat != DEV_GONE &&
+		    dev_ptr->disabled == 0 &&
+		    dev_ptr->user_disabled == 0 &&
+		    devTp == dev_ptr->dev_type &&
+		    low_count > dev_ptr->dev_caller_count) {
+			low_count = dev_ptr->dev_caller_count;
+			low_indx = indx;
+		}
+	}
+	*device_nr_p = low_indx;
+	return low_indx;
+}
+
+static inline int
+send_to_crypto_device(struct work_element *we_p)
+{
+	struct caller *caller_p;
+	struct device *device_p;
+	int dev_nr;
+
+	if (!we_p->requestptr)
+		return SEN_FATAL_ERROR;
+	caller_p = (struct caller *)we_p->requestptr;
+	dev_nr = we_p->devindex;
+	if (select_device(&we_p->devtype, &dev_nr) == -1) {
+		if (z90crypt.hdware_info->hdware_mask.st_count != 0)
+			return SEN_RETRY;
+		else
+			return SEN_NOT_AVAIL;
+	}
+	we_p->devindex = dev_nr;
+	device_p = z90crypt.device_p[dev_nr];
+	if (!device_p)
+		return SEN_NOT_AVAIL;
+	if (device_p->dev_type != we_p->devtype)
+		return SEN_RETRY;
+	if (device_p->dev_caller_count >= device_p->dev_q_depth)
+		return SEN_QUEUE_FULL;
+	PDEBUG("device number prior to send: %d\n", dev_nr);
+	switch (send_to_AP(dev_nr, z90crypt.cdx,
+			   caller_p->caller_dev_dep_req_l,
+			   caller_p->caller_dev_dep_req_p)) {
+	case DEV_SEN_EXCEPTION:
+		PRINTKC("Exception during send to device %d\n", dev_nr);
+		z90crypt.terminating = 1;
+		return SEN_FATAL_ERROR;
+	case DEV_GONE:
+		PRINTK("Device %d not available\n", dev_nr);
+		remove_device(device_p);
+		return SEN_NOT_AVAIL;
+	case DEV_EMPTY:
+		return SEN_NOT_AVAIL;
+	case DEV_NO_WORK:
+		return SEN_FATAL_ERROR;
+	case DEV_BAD_MESSAGE:
+		return SEN_USER_ERROR;
+	case DEV_QUEUE_FULL:
+		return SEN_QUEUE_FULL;
+	default:
+	case DEV_ONLINE:
+		break;
+	}
+	list_add_tail(&(caller_p->caller_liste), &(device_p->dev_caller_list));
+	device_p->dev_caller_count++;
+	return 0;
+}
+
+/**
+ * Send puts the user's work on one of two queues:
+ *   the pending queue if the send was successful
+ *   the request queue if the send failed because device full or busy
+ */
+static inline int
+z90crypt_send(struct work_element *we_p, const char *buf)
+{
+	int rv;
+
+	PDEBUG("PID %d\n", PID());
+
+	if (CHK_RDWRMASK(we_p->status[0]) != STAT_NOWORK) {
+		PDEBUG("PID %d tried to send more work but has outstanding "
+		       "work.\n", PID());
+		return -EWORKPEND;
+	}
+	we_p->devindex = -1; // Reset device number
+	spin_lock_irq(&queuespinlock);
+	rv = send_to_crypto_device(we_p);
+	switch (rv) {
+	case 0:
+		we_p->requestsent = jiffies;
+		we_p->audit[0] |= FP_SENT;
+		list_add_tail(&we_p->liste, &pending_list);
+		++pendingq_count;
+		we_p->audit[0] |= FP_PENDING;
+		break;
+	case SEN_BUSY:
+	case SEN_QUEUE_FULL:
+		rv = 0;
+		we_p->devindex = -1; // any device will do
+		we_p->requestsent = jiffies;
+		list_add_tail(&we_p->liste, &request_list);
+		++requestq_count;
+		we_p->audit[0] |= FP_REQUEST;
+		break;
+	case SEN_RETRY:
+		rv = -ERESTARTSYS;
+		break;
+	case SEN_NOT_AVAIL:
+		PRINTK("*** No devices available.\n");
+		rv = we_p->retcode = -ENODEV;
+		we_p->status[0] |= STAT_FAILED;
+		break;
+	case REC_OPERAND_INV:
+	case REC_OPERAND_SIZE:
+	case REC_EVEN_MOD:
+	case REC_INVALID_PAD:
+		rv = we_p->retcode = -EINVAL;
+		we_p->status[0] |= STAT_FAILED;
+		break;
+	default:
+		we_p->retcode = rv;
+		we_p->status[0] |= STAT_FAILED;
+		break;
+	}
+	if (rv != -ERESTARTSYS)
+		SET_RDWRMASK(we_p->status[0], STAT_WRITTEN);
+	spin_unlock_irq(&queuespinlock);
+	if (rv == 0)
+		tasklet_schedule(&reader_tasklet);
+	return rv;
+}
+
+/**
+ * process_results copies the user's work from kernel space.
+ */
+static inline int
+z90crypt_process_results(struct work_element *we_p, char *buf)
+{
+	int rv;
+
+	PDEBUG("we_p %p (PID %d)\n", we_p, PID());
+
+	LONG2DEVPTR(we_p->devindex)->dev_total_req_cnt++;
+	SET_RDWRMASK(we_p->status[0], STAT_READPEND);
+
+	rv = 0;
+	if (!we_p->buffer) {
+		PRINTK("we_p %p PID %d in STAT_READPEND: buffer NULL.\n",
+			we_p, PID());
+		rv = -ENOBUFF;
+	}
+
+	if (!rv)
+		if ((rv = copy_to_user(buf, we_p->buffer, we_p->buff_size))) {
+			PDEBUG("copy_to_user failed: rv = %d\n", rv);
+			rv = -EFAULT;
+		}
+
+	if (!rv)
+		rv = we_p->retcode;
+	if (!rv)
+		if (we_p->resp_buff_size
+		    &&	copy_to_user(we_p->resp_addr, we_p->resp_buff,
+				     we_p->resp_buff_size))
+			rv = -EFAULT;
+
+	SET_RDWRMASK(we_p->status[0], STAT_NOWORK);
+	return rv;
+}
+
+static unsigned char NULL_psmid[8] =
+{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+/**
+ * MIN_MOD_SIZE is a PCICC and PCIXCC limit.
+ * MAX_PCICC_MOD_SIZE is a hard limit for the PCICC.
+ * MAX_MOD_SIZE is a hard limit for the PCIXCC and PCICA.
+ */
+#define MIN_MOD_SIZE 64
+#define MAX_PCICC_MOD_SIZE 128
+#define MAX_MOD_SIZE 256
+
+/**
+ * Used in device configuration functions
+ */
+#define MAX_RESET 90
+
+/**
+ * This is used only for PCICC support
+ */
+static inline int
+is_PKCS11_padded(unsigned char *buffer, int length)
+{
+	int i;
+	if ((buffer[0] != 0x00) || (buffer[1] != 0x01))
+		return 0;
+	for (i = 2; i < length; i++)
+		if (buffer[i] != 0xFF)
+			break;
+	if ((i < 10) || (i == length))
+		return 0;
+	if (buffer[i] != 0x00)
+		return 0;
+	return 1;
+}
+
+/**
+ * This is used only for PCICC support
+ */
+static inline int
+is_PKCS12_padded(unsigned char *buffer, int length)
+{
+	int i;
+	if ((buffer[0] != 0x00) || (buffer[1] != 0x02))
+		return 0;
+	for (i = 2; i < length; i++)
+		if (buffer[i] == 0x00)
+			break;
+	if ((i < 10) || (i == length))
+		return 0;
+	if (buffer[i] != 0x00)
+		return 0;
+	return 1;
+}
+
+/**
+ * builds struct caller and converts message from generic format to
+ * device-dependent format
+ * func is ICARSAMODEXPO or ICARSACRT
+ * function is PCI_FUNC_KEY_ENCRYPT or PCI_FUNC_KEY_DECRYPT
+ */
+static inline int
+build_caller(struct work_element *we_p, short function)
+{
+	int rv;
+	struct caller *caller_p = (struct caller *)we_p->requestptr;
+
+	if ((we_p->devtype != PCICC) && (we_p->devtype != PCICA) &&
+	    (we_p->devtype != PCIXCC))
+		return SEN_NOT_AVAIL;
+
+	memcpy(caller_p->caller_id, we_p->caller_id,
+	       sizeof(caller_p->caller_id));
+	caller_p->caller_dev_dep_req_p = caller_p->caller_dev_dep_req;
+	caller_p->caller_dev_dep_req_l = MAX_RESPONSE_SIZE;
+	caller_p->caller_buf_p = we_p->buffer;
+	INIT_LIST_HEAD(&(caller_p->caller_liste));
+
+	rv = convert_request(we_p->buffer, we_p->funccode, function,
+			     z90crypt.cdx, we_p->devtype,
+			     &caller_p->caller_dev_dep_req_l,
+			     caller_p->caller_dev_dep_req_p);
+	if (rv) {
+		if (rv == SEN_NOT_AVAIL)
+			PDEBUG("request can't be processed on hdwr avail\n");
+		else
+			PRINTK("Error from convert_request: %d\n", rv);
+	}
+	else
+		memcpy(&(caller_p->caller_dev_dep_req_p[4]), we_p->caller_id,8);
+	return rv;
+}
+
+static inline void
+unbuild_caller(struct device *device_p, struct caller *caller_p)
+{
+	if (!caller_p)
+		return;
+	if (caller_p->caller_liste.next && caller_p->caller_liste.prev)
+		if (!list_empty(&caller_p->caller_liste)) {
+			list_del(&caller_p->caller_liste);
+			device_p->dev_caller_count--;
+			INIT_LIST_HEAD(&caller_p->caller_liste);
+		}
+	memset(caller_p->caller_id, 0, sizeof(caller_p->caller_id));
+}
+
+static inline int
+get_crypto_request_buffer(struct work_element *we_p)
+{
+	struct ica_rsa_modexpo *mex_p;
+	struct ica_rsa_modexpo_crt *crt_p;
+	unsigned char *temp_buffer;
+	short function;
+	int rv;
+
+	mex_p =	(struct ica_rsa_modexpo *) we_p->buffer;
+	crt_p = (struct ica_rsa_modexpo_crt *) we_p->buffer;
+
+	PDEBUG("device type input = %d\n", we_p->devtype);
+
+	if (z90crypt.terminating)
+		return REC_NO_RESPONSE;
+	if (memcmp(we_p->caller_id, NULL_psmid, 8) == 0) {
+		PRINTK("psmid zeroes\n");
+		return SEN_FATAL_ERROR;
+	}
+	if (!we_p->buffer) {
+		PRINTK("buffer pointer NULL\n");
+		return SEN_USER_ERROR;
+	}
+	if (!we_p->requestptr) {
+		PRINTK("caller pointer NULL\n");
+		return SEN_USER_ERROR;
+	}
+
+	if ((we_p->devtype != PCICA) && (we_p->devtype != PCICC) &&
+	    (we_p->devtype != PCIXCC) && (we_p->devtype != ANYDEV)) {
+		PRINTK("invalid device type\n");
+		return SEN_USER_ERROR;
+	}
+
+	if ((mex_p->inputdatalength < 1) ||
+	    (mex_p->inputdatalength > MAX_MOD_SIZE)) {
+		PRINTK("inputdatalength[%d] is not valid\n",
+		       mex_p->inputdatalength);
+		return SEN_USER_ERROR;
+	}
+
+	if (mex_p->outputdatalength < mex_p->inputdatalength) {
+		PRINTK("outputdatalength[%d] < inputdatalength[%d]\n",
+		       mex_p->outputdatalength, mex_p->inputdatalength);
+		return SEN_USER_ERROR;
+	}
+
+	if (!mex_p->inputdata || !mex_p->outputdata) {
+		PRINTK("inputdata[%p] or outputdata[%p] is NULL\n",
+		       mex_p->outputdata, mex_p->inputdata);
+		return SEN_USER_ERROR;
+	}
+
+	/**
+	 * As long as outputdatalength is big enough, we can set the
+	 * outputdatalength equal to the inputdatalength, since that is the
+	 * number of bytes we will copy in any case
+	 */
+	mex_p->outputdatalength = mex_p->inputdatalength;
+
+	rv = 0;
+	switch (we_p->funccode) {
+	case ICARSAMODEXPO:
+		if (!mex_p->b_key || !mex_p->n_modulus)
+			rv = SEN_USER_ERROR;
+		break;
+	case ICARSACRT:
+		if (!IS_EVEN(crt_p->inputdatalength)) {
+			PRINTK("inputdatalength[%d] is odd, CRT form\n",
+			       crt_p->inputdatalength);
+			rv = SEN_USER_ERROR;
+			break;
+		}
+		if (!crt_p->bp_key ||
+		    !crt_p->bq_key ||
+		    !crt_p->np_prime ||
+		    !crt_p->nq_prime ||
+		    !crt_p->u_mult_inv) {
+			PRINTK("CRT form, bad data: %p/%p/%p/%p/%p\n",
+			       crt_p->bp_key, crt_p->bq_key,
+			       crt_p->np_prime, crt_p->nq_prime,
+			       crt_p->u_mult_inv);
+			rv = SEN_USER_ERROR;
+		}
+		break;
+	default:
+		PRINTK("bad func = %d\n", we_p->funccode);
+		rv = SEN_USER_ERROR;
+		break;
+	}
+	if (rv != 0)
+		return rv;
+
+	if (select_device_type(&we_p->devtype) < 0)
+		return SEN_NOT_AVAIL;
+
+	temp_buffer = (unsigned char *)we_p + sizeof(struct work_element) +
+		      sizeof(struct caller);
+	if (copy_from_user(temp_buffer, mex_p->inputdata,
+			   mex_p->inputdatalength) != 0)
+		return SEN_RELEASED;
+
+	function = PCI_FUNC_KEY_ENCRYPT;
+	switch (we_p->devtype) {
+	/* PCICA does everything with a simple RSA mod-expo operation */
+	case PCICA:
+		function = PCI_FUNC_KEY_ENCRYPT;
+		break;
+	/**
+	 * PCIXCC does all Mod-Expo form with a simple RSA mod-expo
+	 * operation, and all CRT forms with a PKCS-1.2 format decrypt.
+	 */
+	case PCIXCC:
+		/* Anything less than MIN_MOD_SIZE MUST go to a PCICA */
+		if (mex_p->inputdatalength < MIN_MOD_SIZE)
+			return SEN_NOT_AVAIL;
+		if (we_p->funccode == ICARSAMODEXPO)
+			function = PCI_FUNC_KEY_ENCRYPT;
+		else
+			function = PCI_FUNC_KEY_DECRYPT;
+		break;
+	/**
+	 * PCICC does everything as a PKCS-1.2 format request
+	 */
+	case PCICC:
+		/* Anything less than MIN_MOD_SIZE MUST go to a PCICA */
+		if (mex_p->inputdatalength < MIN_MOD_SIZE) {
+			return SEN_NOT_AVAIL;
+		}
+		/* Anythings over MAX_PCICC_MOD_SIZE MUST go to a PCICA */
+		if (mex_p->inputdatalength > MAX_PCICC_MOD_SIZE) {
+			return SEN_NOT_AVAIL;
+		}
+		/* PCICC cannot handle input that is is PKCS#1.1 padded */
+		if (is_PKCS11_padded(temp_buffer, mex_p->inputdatalength)) {
+			return SEN_NOT_AVAIL;
+		}
+		if (we_p->funccode == ICARSAMODEXPO) {
+			if (is_PKCS12_padded(temp_buffer,
+					     mex_p->inputdatalength))
+				function = PCI_FUNC_KEY_ENCRYPT;
+			else
+				function = PCI_FUNC_KEY_DECRYPT;
+		} else
+			/* all CRT forms are decrypts */
+			function = PCI_FUNC_KEY_DECRYPT;
+		break;
+	}
+	PDEBUG("function: %04x\n", function);
+	rv = build_caller(we_p, function);
+	PDEBUG("rv from build_caller = %d\n", rv);
+	return rv;
+}
+
+static inline int
+z90crypt_prepare(struct work_element *we_p, unsigned int funccode,
+		 const char *buffer)
+{
+	int rv;
+
+	we_p->devindex = -1;
+	if (funccode == ICARSAMODEXPO)
+		we_p->buff_size = sizeof(struct ica_rsa_modexpo);
+	else
+		we_p->buff_size = sizeof(struct ica_rsa_modexpo_crt);
+
+	if (copy_from_user(we_p->buffer, buffer, we_p->buff_size))
+		return -EFAULT;
+
+	we_p->audit[0] |= FP_COPYFROM;
+	SET_RDWRMASK(we_p->status[0], STAT_WRITTEN);
+	we_p->funccode = funccode;
+	we_p->devtype = -1;
+	we_p->audit[0] |= FP_BUFFREQ;
+	rv = get_crypto_request_buffer(we_p);
+	switch (rv) {
+	case 0:
+		we_p->audit[0] |= FP_BUFFGOT;
+		break;
+	case SEN_USER_ERROR:
+		rv = -EINVAL;
+		break;
+	case SEN_QUEUE_FULL:
+		rv = 0;
+		break;
+	case SEN_RELEASED:
+		rv = -EFAULT;
+		break;
+	case REC_NO_RESPONSE:
+		rv = -ENODEV;
+		break;
+	case SEN_NOT_AVAIL:
+		rv = -EGETBUFF;
+		break;
+	default:
+		PRINTK("rv = %d\n", rv);
+		rv = -EGETBUFF;
+		break;
+	}
+	if (CHK_RDWRMASK(we_p->status[0]) == STAT_WRITTEN)
+		SET_RDWRMASK(we_p->status[0], STAT_DEFAULT);
+	return rv;
+}
+
+static inline void
+purge_work_element(struct work_element *we_p)
+{
+	struct list_head *lptr;
+
+	spin_lock_irq(&queuespinlock);
+	list_for_each(lptr, &request_list) {
+		if (lptr == &we_p->liste) {
+			list_del(lptr);
+			requestq_count--;
+			break;
+		}
+	}
+	list_for_each(lptr, &pending_list) {
+		if (lptr == &we_p->liste) {
+			list_del(lptr);
+			pendingq_count--;
+			break;
+		}
+	}
+	spin_unlock_irq(&queuespinlock);
+}
+
+/**
+ * Build the request and send it.
+ */
+static inline int
+z90crypt_rsa(struct priv_data *private_data_p, pid_t pid,
+	     unsigned int cmd, unsigned long arg)
+{
+	struct work_element *we_p;
+	int rv;
+
+	if ((rv = allocate_work_element(&we_p, private_data_p, pid))) {
+		PDEBUG("PID %d: allocate_work_element returned ENOMEM\n", pid);
+		return rv;
+	}
+	if ((rv = z90crypt_prepare(we_p, cmd, (const char *)arg)))
+		PDEBUG("PID %d: rv = %d from z90crypt_prepare\n", pid, rv);
+	if (!rv)
+		if ((rv = z90crypt_send(we_p, (const char *)arg)))
+			PDEBUG("PID %d: rv %d from z90crypt_send.\n", pid, rv);
+	if (!rv) {
+		we_p->audit[0] |= FP_ASLEEP;
+		wait_event(we_p->waitq, atomic_read(&we_p->alarmrung));
+		we_p->audit[0] |= FP_AWAKE;
+		rv = we_p->retcode;
+	}
+	if (!rv)
+		rv = z90crypt_process_results(we_p, (char *)arg);
+
+	if ((we_p->status[0] & STAT_FAILED)) {
+		switch (rv) {
+		/**
+		 * EINVAL *after* receive is almost always padding
+		 * error issued by a PCICC or PCIXCC. We convert this
+		 * return value to -EGETBUFF which should trigger a
+		 * fallback to software.
+		 */
+		case -EINVAL:
+			if ((we_p->devtype == PCICC) ||
+			    (we_p->devtype == PCIXCC))
+				rv = -EGETBUFF;
+			break;
+		case -ETIMEOUT:
+			if (z90crypt.mask.st_count > 0)
+				rv = -ERESTARTSYS; // retry with another
+			else
+				rv = -ENODEV; // no cards left
+		/* fall through to clean up request queue */
+		case -ERESTARTSYS:
+		case -ERELEASED:
+			switch (CHK_RDWRMASK(we_p->status[0])) {
+			case STAT_WRITTEN:
+				purge_work_element(we_p);
+				break;
+			case STAT_READPEND:
+			case STAT_NOWORK:
+			default:
+				break;
+			}
+			break;
+		default:
+			we_p->status[0] ^= STAT_FAILED;
+			break;
+		}
+	}
+	free_page((long)we_p);
+	return rv;
+}
+
+/**
+ * This function is a little long, but it's really just one large switch
+ * statement.
+ */
+static int
+z90crypt_ioctl(struct inode *inode, struct file *filp,
+	       unsigned int cmd, unsigned long arg)
+{
+	struct priv_data *private_data_p = filp->private_data;
+	unsigned char *status;
+	unsigned char *qdepth;
+	unsigned int *reqcnt;
+	struct ica_z90_status *pstat;
+	int ret, i, loopLim, tempstat;
+	static int deprecated_msg_count = 0;
+
+	PDEBUG("filp %p (PID %d), cmd 0x%08X\n", filp, PID(), cmd);
+	PDEBUG("cmd 0x%08X: dir %s, size 0x%04X, type 0x%02X, nr 0x%02X\n",
+		cmd,
+		!_IOC_DIR(cmd) ? "NO"
+		: ((_IOC_DIR(cmd) == (_IOC_READ|_IOC_WRITE)) ? "RW"
+		: ((_IOC_DIR(cmd) == _IOC_READ) ? "RD"
+		: "WR")),
+		_IOC_SIZE(cmd), _IOC_TYPE(cmd), _IOC_NR(cmd));
+
+	if (_IOC_TYPE(cmd) != Z90_IOCTL_MAGIC) {
+		PRINTK("cmd 0x%08X contains bad magic\n", cmd);
+		return -ENOTTY;
+	}
+
+	ret = 0;
+	switch (cmd) {
+	case ICARSAMODEXPO:
+	case ICARSACRT:
+		if (quiesce_z90crypt) {
+			ret = -EQUIESCE;
+			break;
+		}
+		ret = -ENODEV; // Default if no devices
+		loopLim = z90crypt.hdware_info->hdware_mask.st_count -
+			(z90crypt.hdware_info->hdware_mask.disabled_count +
+			 z90crypt.hdware_info->hdware_mask.user_disabled_count);
+		for (i = 0; i < loopLim; i++) {
+			ret = z90crypt_rsa(private_data_p, PID(), cmd, arg);
+			if (ret != -ERESTARTSYS)
+				break;
+		}
+		if (ret == -ERESTARTSYS)
+			ret = -ENODEV;
+		break;
+
+	case Z90STAT_TOTALCOUNT:
+		tempstat = get_status_totalcount();
+		if (copy_to_user((int *)arg, &tempstat,sizeof(int)) != 0)
+			ret = -EFAULT;
+		break;
+
+	case Z90STAT_PCICACOUNT:
+		tempstat = get_status_PCICAcount();
+		if (copy_to_user((int *)arg, &tempstat, sizeof(int)) != 0)
+			ret = -EFAULT;
+		break;
+
+	case Z90STAT_PCICCCOUNT:
+		tempstat = get_status_PCICCcount();
+		if (copy_to_user((int *)arg, &tempstat, sizeof(int)) != 0)
+			ret = -EFAULT;
+		break;
+
+	case Z90STAT_PCIXCCCOUNT:
+		tempstat = get_status_PCIXCCcount();
+		if (copy_to_user((int *)arg, &tempstat, sizeof(int)) != 0)
+			ret = -EFAULT;
+		break;
+
+	case Z90STAT_REQUESTQ_COUNT:
+		tempstat = get_status_requestq_count();
+		if (copy_to_user((int *)arg, &tempstat, sizeof(int)) != 0)
+			ret = -EFAULT;
+		break;
+
+	case Z90STAT_PENDINGQ_COUNT:
+		tempstat = get_status_pendingq_count();
+		if (copy_to_user((int *)arg, &tempstat, sizeof(int)) != 0)
+			ret = -EFAULT;
+		break;
+
+	case Z90STAT_TOTALOPEN_COUNT:
+		tempstat = get_status_totalopen_count();
+		if (copy_to_user((int *)arg, &tempstat, sizeof(int)) != 0)
+			ret = -EFAULT;
+		break;
+
+	case Z90STAT_DOMAIN_INDEX:
+		tempstat = get_status_domain_index();
+		if (copy_to_user((int *)arg, &tempstat, sizeof(int)) != 0)
+			ret = -EFAULT;
+		break;
+
+	case Z90STAT_STATUS_MASK:
+		status = kmalloc(Z90CRYPT_NUM_APS, GFP_KERNEL);
+		if (!status) {
+			PRINTK("kmalloc for status failed!\n");
+			ret = -ENOMEM;
+			break;
+		}
+		get_status_status_mask(status);
+		if (copy_to_user((char *) arg, status, Z90CRYPT_NUM_APS) != 0)
+			ret = -EFAULT;
+		kfree(status);
+		break;
+
+	case Z90STAT_QDEPTH_MASK:
+		qdepth = kmalloc(Z90CRYPT_NUM_APS, GFP_KERNEL);
+		if (!qdepth) {
+			PRINTK("kmalloc for qdepth failed!\n");
+			ret = -ENOMEM;
+			break;
+		}
+		get_status_qdepth_mask(qdepth);
+		if (copy_to_user((char *) arg, qdepth, Z90CRYPT_NUM_APS) != 0)
+			ret = -EFAULT;
+		kfree(qdepth);
+		break;
+
+	case Z90STAT_PERDEV_REQCNT:
+		reqcnt = kmalloc(sizeof(int) * Z90CRYPT_NUM_APS, GFP_KERNEL);
+		if (!reqcnt) {
+			PRINTK("kmalloc for reqcnt failed!\n");
+			ret = -ENOMEM;
+			break;
+		}
+		get_status_perdevice_reqcnt(reqcnt);
+		if (copy_to_user((char *) arg, reqcnt,
+				 Z90CRYPT_NUM_APS * sizeof(int)) != 0)
+			ret = -EFAULT;
+		kfree(reqcnt);
+		break;
+
+		/* THIS IS DEPRECATED.	USE THE NEW STATUS CALLS */
+	case ICAZ90STATUS:
+		if (deprecated_msg_count < 100) {
+			PRINTK("deprecated call to ioctl (ICAZ90STATUS)!\n");
+			deprecated_msg_count++;
+			if (deprecated_msg_count == 100)
+				PRINTK("No longer issuing messages related to "
+				       "deprecated call to ICAZ90STATUS.\n");
+		}
+
+		pstat = kmalloc(sizeof(struct ica_z90_status), GFP_KERNEL);
+		if (!pstat) {
+			PRINTK("kmalloc for pstat failed!\n");
+			ret = -ENOMEM;
+			break;
+		}
+
+		pstat->totalcount	 = get_status_totalcount();
+		pstat->leedslitecount	 = get_status_PCICAcount();
+		pstat->leeds2count	 = get_status_PCICCcount();
+		pstat->requestqWaitCount = get_status_requestq_count();
+		pstat->pendingqWaitCount = get_status_pendingq_count();
+		pstat->totalOpenCount	 = get_status_totalopen_count();
+		pstat->cryptoDomain	 = get_status_domain_index();
+		get_status_status_mask(pstat->status);
+		get_status_qdepth_mask(pstat->qdepth);
+
+		if (copy_to_user((struct ica_z90_status *) arg, pstat,
+				 sizeof(struct ica_z90_status)) != 0)
+			ret = -EFAULT;
+		kfree(pstat);
+		break;
+
+	case Z90QUIESCE:
+		if (current->euid != 0) {
+			PRINTK("QUIESCE fails: euid %d\n",
+			       current->euid);
+			ret = -EACCES;
+		} else {
+			PRINTK("QUIESCE device from PID %d\n", PID());
+			quiesce_z90crypt = 1;
+		}
+		break;
+
+	default:
+		/* user passed an invalid IOCTL number */
+		PDEBUG("cmd 0x%08X contains invalid ioctl code\n", cmd);
+		ret = -ENOTTY;
+		break;
+	}
+
+	return ret;
+}
+
+static inline int
+sprintcl(unsigned char *outaddr, unsigned char *addr, unsigned int len)
+{
+	int hl, i;
+
+	hl = 0;
+	for (i = 0; i < len; i++)
+		hl += sprintf(outaddr+hl, "%01x", (unsigned int) addr[i]);
+	hl += sprintf(outaddr+hl, " ");
+
+	return hl;
+}
+
+static inline int
+sprintrw(unsigned char *outaddr, unsigned char *addr, unsigned int len)
+{
+	int hl, inl, c, cx;
+
+	hl = sprintf(outaddr, "	   ");
+	inl = 0;
+	for (c = 0; c < (len / 16); c++) {
+		hl += sprintcl(outaddr+hl, addr+inl, 16);
+		inl += 16;
+	}
+
+	cx = len%16;
+	if (cx) {
+		hl += sprintcl(outaddr+hl, addr+inl, cx);
+		inl += cx;
+	}
+
+	hl += sprintf(outaddr+hl, "\n");
+
+	return hl;
+}
+
+static inline int
+sprinthx(unsigned char *title, unsigned char *outaddr,
+	 unsigned char *addr, unsigned int len)
+{
+	int hl, inl, r, rx;
+
+	hl = sprintf(outaddr, "\n%s\n", title);
+	inl = 0;
+	for (r = 0; r < (len / 64); r++) {
+		hl += sprintrw(outaddr+hl, addr+inl, 64);
+		inl += 64;
+	}
+	rx = len % 64;
+	if (rx) {
+		hl += sprintrw(outaddr+hl, addr+inl, rx);
+		inl += rx;
+	}
+
+	hl += sprintf(outaddr+hl, "\n");
+
+	return hl;
+}
+
+static inline int
+sprinthx4(unsigned char *title, unsigned char *outaddr,
+	  unsigned int *array, unsigned int len)
+{
+	int hl, r;
+
+	hl = sprintf(outaddr, "\n%s\n", title);
+
+	for (r = 0; r < len; r++) {
+		if ((r % 8) == 0)
+			hl += sprintf(outaddr+hl, "    ");
+		hl += sprintf(outaddr+hl, "%08X ", array[r]);
+		if ((r % 8) == 7)
+			hl += sprintf(outaddr+hl, "\n");
+	}
+
+	hl += sprintf(outaddr+hl, "\n");
+
+	return hl;
+}
+
+static int
+z90crypt_status(char *resp_buff, char **start, off_t offset,
+		int count, int *eof, void *data)
+{
+	unsigned char *workarea;
+	int len;
+
+	/* resp_buff is a page. Use the right half for a work area */
+	workarea = resp_buff+2000;
+	len = 0;
+	len += sprintf(resp_buff+len, "\nz90crypt version: %d.%d.%d\n",
+		z90crypt_VERSION, z90crypt_RELEASE, z90crypt_VARIANT);
+	len += sprintf(resp_buff+len, "Cryptographic domain: %d\n",
+		get_status_domain_index());
+	len += sprintf(resp_buff+len, "Total device count: %d\n",
+		get_status_totalcount());
+	len += sprintf(resp_buff+len, "PCICA count: %d\n",
+		get_status_PCICAcount());
+	len += sprintf(resp_buff+len, "PCICC count: %d\n",
+		get_status_PCICCcount());
+	len += sprintf(resp_buff+len, "PCIXCC count: %d\n",
+		get_status_PCIXCCcount());
+	len += sprintf(resp_buff+len, "requestq count: %d\n",
+		get_status_requestq_count());
+	len += sprintf(resp_buff+len, "pendingq count: %d\n",
+		get_status_pendingq_count());
+	len += sprintf(resp_buff+len, "Total open handles: %d\n\n",
+		get_status_totalopen_count());
+	len += sprinthx(
+		"Online devices: 1 means PCICA, 2 means PCICC, 3 means PCIXCC",
+		resp_buff+len,
+		get_status_status_mask(workarea),
+		Z90CRYPT_NUM_APS);
+	len += sprinthx("Waiting work element counts",
+		resp_buff+len,
+		get_status_qdepth_mask(workarea),
+		Z90CRYPT_NUM_APS);
+	len += sprinthx4(
+		"Per-device successfully completed request counts",
+		resp_buff+len,
+		get_status_perdevice_reqcnt((unsigned int *)workarea),
+		Z90CRYPT_NUM_APS);
+	*eof = 1;
+	memset(workarea, 0, Z90CRYPT_NUM_APS * sizeof(unsigned int));
+	return len;
+}
+
+static inline void
+disable_card(int card_index)
+{
+	struct device *devp;
+
+	devp = LONG2DEVPTR(card_index);
+	if (!devp || devp->user_disabled)
+		return;
+	devp->user_disabled = 1;
+	z90crypt.hdware_info->hdware_mask.user_disabled_count++;
+	if (devp->dev_type == -1)
+		return;
+	z90crypt.hdware_info->type_mask[devp->dev_type].user_disabled_count++;
+}
+
+static inline void
+enable_card(int card_index)
+{
+	struct device *devp;
+
+	devp = LONG2DEVPTR(card_index);
+	if (!devp || !devp->user_disabled)
+		return;
+	devp->user_disabled = 0;
+	z90crypt.hdware_info->hdware_mask.user_disabled_count--;
+	if (devp->dev_type == -1)
+		return;
+	z90crypt.hdware_info->type_mask[devp->dev_type].user_disabled_count--;
+}
+
+static inline int
+scan_char(unsigned char *bf, unsigned int len,
+	  unsigned int *offs, unsigned int *p_eof, unsigned char c)
+{
+	unsigned int i, found;
+
+	found = 0;
+	for (i = 0; i < len; i++) {
+		if (bf[i] == c) {
+			found = 1;
+			break;
+		}
+		if (bf[i] == '\0') {
+			*p_eof = 1;
+			break;
+		}
+		if (bf[i] == '\n') {
+			break;
+		}
+	}
+	*offs = i+1;
+	return found;
+}
+
+static inline int
+scan_string(unsigned char *bf, unsigned int len,
+	    unsigned int *offs, unsigned int *p_eof, unsigned char *s)
+{
+	unsigned int temp_len, temp_offs, found, eof;
+
+	temp_len = temp_offs = found = eof = 0;
+	while (!eof && !found) {
+		found = scan_char(bf+temp_len, len-temp_len,
+				  &temp_offs, &eof, *s);
+
+		temp_len += temp_offs;
+		if (eof) {
+			found = 0;
+			break;
+		}
+
+		if (found) {
+			if (len >= temp_offs+strlen(s)) {
+				found = !strncmp(bf+temp_len-1, s, strlen(s));
+				if (found) {
+					*offs = temp_len+strlen(s)-1;
+					break;
+				}
+			} else {
+				found = 0;
+				*p_eof = 1;
+				break;
+			}
+		}
+	}
+	return found;
+}
+
+static int
+z90crypt_status_write(struct file *file, const char *buffer,
+		      unsigned long count, void *data)
+{
+	int i, j, len, offs, found, eof;
+	unsigned char *lbuf;
+	unsigned int local_count;
+
+#define LBUFSIZE 600
+	lbuf = kmalloc(LBUFSIZE, GFP_KERNEL);
+	if (!lbuf) {
+		PRINTK("kmalloc failed!\n");
+		return 0;
+	}
+
+	if (count <= 0)
+		return 0;
+
+	local_count = UMIN((unsigned int)count, LBUFSIZE-1);
+
+	if (copy_from_user(lbuf, buffer, local_count) != 0) {
+		kfree(lbuf);
+		return -EFAULT;
+	}
+
+	lbuf[local_count-1] = '\0';
+
+	len = 0;
+	eof = 0;
+	found = 0;
+	while (!eof) {
+		found = scan_string(lbuf+len, local_count-len, &offs, &eof,
+				    "Online devices");
+		len += offs;
+		if (found == 1)
+			break;
+	}
+
+	if (eof) {
+		kfree(lbuf);
+		return count;
+	}
+
+	if (found)
+		found = scan_char(lbuf+len, local_count-len, &offs, &eof, '\n');
+
+	if (!found || eof) {
+		kfree(lbuf);
+		return count;
+	}
+
+	len += offs;
+	j = 0;
+	for (i = 0; i < 80; i++) {
+		switch (*(lbuf+len+i)) {
+		case '\t':
+		case ' ':
+			break;
+		case '\n':
+		default:
+			eof = 1;
+			break;
+		case '0':
+		case '1':
+		case '2':
+		case '3':
+			j++;
+			break;
+		case 'd':
+		case 'D':
+			disable_card(j);
+			j++;
+			break;
+		case 'e':
+		case 'E':
+			enable_card(j);
+			j++;
+			break;
+		}
+		if (eof)
+			break;
+	}
+
+	kfree(lbuf);
+	return count;
+}
+
+/**
+ * Functions that run under a timer, with no process id
+ *
+ * The task functions:
+ *     z90crypt_reader_task
+ *	 helper_send_work
+ *	 helper_handle_work_element
+ *	 helper_receive_rc
+ *     z90crypt_config_task
+ *     z90crypt_cleanup_task
+ *
+ * Helper functions:
+ *     z90crypt_schedule_reader_timer
+ *     z90crypt_schedule_reader_task
+ *     z90crypt_schedule_config_task
+ *     z90crypt_schedule_cleanup_task
+ */
+static inline int
+receive_from_crypto_device(int index, unsigned char *psmid, int *buff_len_p,
+			   unsigned char *buff, unsigned char **dest_p_p)
+{
+	int dv, rv;
+	struct device *dev_ptr;
+	struct caller *caller_p;
+	struct ica_rsa_modexpo *icaMsg_p;
+	struct list_head *ptr, *tptr;
+
+	memcpy(psmid, NULL_psmid, sizeof(NULL_psmid));
+
+	if (z90crypt.terminating)
+		return REC_FATAL_ERROR;
+
+	caller_p = 0;
+	dev_ptr = z90crypt.device_p[index];
+	rv = 0;
+	do {
+		PDEBUG("Dequeue called for device %d\n", index);
+		if (!dev_ptr || dev_ptr->disabled) {
+			rv = REC_NO_RESPONSE;
+			break;
+		}
+		if (dev_ptr->dev_self_x != index) {
+			PRINTK("Corrupt dev ptr in receive_from_AP\n");
+			z90crypt.terminating = 1;
+			rv = REC_FATAL_ERROR;
+			break;
+		}
+		if (!dev_ptr->dev_resp_l || !dev_ptr->dev_resp_p) {
+			dv = DEV_REC_EXCEPTION;
+			PRINTK("dev_resp_l = %d, dev_resp_p = %p\n",
+			       dev_ptr->dev_resp_l, dev_ptr->dev_resp_p);
+		} else {
+			dv = receive_from_AP(index, z90crypt.cdx,
+					     dev_ptr->dev_resp_l,
+					     dev_ptr->dev_resp_p, psmid);
+		}
+		switch (dv) {
+		case DEV_REC_EXCEPTION:
+			rv = REC_FATAL_ERROR;
+			z90crypt.terminating = 1;
+			PRINTKC("Exception in receive from device %d\n",
+				index);
+			break;
+		case DEV_ONLINE:
+			rv = 0;
+			break;
+		case DEV_EMPTY:
+			rv = REC_EMPTY;
+			break;
+		case DEV_NO_WORK:
+			rv = REC_NO_WORK;
+			break;
+		case DEV_BAD_MESSAGE:
+		case DEV_GONE:
+		case REC_HARDWAR_ERR:
+		default:
+			rv = REC_NO_RESPONSE;
+			break;
+		}
+		if (rv)
+			break;
+		if (dev_ptr->dev_caller_count <= 0) {
+			rv = REC_USER_GONE;
+			break;
+	        }
+
+		list_for_each_safe(ptr, tptr, &dev_ptr->dev_caller_list) {
+			caller_p = list_entry(ptr, struct caller, caller_liste);
+			if (!memcmp(caller_p->caller_id, psmid,
+				    sizeof(caller_p->caller_id))) {
+				if (!list_empty(&caller_p->caller_liste)) {
+					list_del(ptr);
+					dev_ptr->dev_caller_count--;
+					INIT_LIST_HEAD(&caller_p->caller_liste);
+					break;
+				}
+			}
+			caller_p = 0;
+		}
+		if (!caller_p) {
+			rv = REC_USER_GONE;
+			break;
+		}
+
+		PDEBUG("caller_p after successful receive: %p\n", caller_p);
+		rv = convert_response(dev_ptr->dev_resp_p,
+				      caller_p->caller_buf_p, buff_len_p, buff);
+		switch (rv) {
+		case REC_OPERAND_INV:
+			PDEBUG("dev %d: user error %d\n", index, rv);
+			break;
+		case WRONG_DEVICE_TYPE:
+		case REC_HARDWAR_ERR:
+		case REC_BAD_MESSAGE:
+			PRINTK("dev %d: hardware error %d\n",
+			       index, rv);
+			rv = REC_NO_RESPONSE;
+			break;
+		case REC_RELEASED:
+			PDEBUG("dev %d: REC_RELEASED = %d\n",
+			       index, rv);
+			break;
+		default:
+			PDEBUG("dev %d: rv = %d\n", index, rv);
+			break;
+		}
+	} while (0);
+
+	switch (rv) {
+	case 0:
+		PDEBUG("Successful receive from device %d\n", index);
+		icaMsg_p = (struct ica_rsa_modexpo *)caller_p->caller_buf_p;
+		*dest_p_p = icaMsg_p->outputdata;
+		if (*buff_len_p == 0)
+			PRINTK("Zero *buff_len_p\n");
+		break;
+	case REC_NO_RESPONSE:
+		remove_device(dev_ptr);
+		break;
+	}
+
+	if (caller_p)
+		unbuild_caller(dev_ptr, caller_p);
+
+	return rv;
+}
+
+static inline void
+helper_send_work(int index)
+{
+	struct work_element *rq_p;
+	int rv;
+
+	if (list_empty(&request_list))
+		return;
+	requestq_count--;
+	rq_p = list_entry(request_list.next, struct work_element, liste);
+	list_del(&rq_p->liste);
+	rq_p->audit[1] |= FP_REMREQUEST;
+	if (rq_p->devtype == SHRT2DEVPTR(index)->dev_type) {
+		rq_p->devindex = SHRT2LONG(index);
+		rv = send_to_crypto_device(rq_p);
+		if (rv == 0) {
+			rq_p->requestsent = jiffies;
+			rq_p->audit[0] |= FP_SENT;
+			list_add_tail(&rq_p->liste, &pending_list);
+			++pendingq_count;
+			rq_p->audit[0] |= FP_PENDING;
+		} else {
+			switch (rv) {
+			case REC_OPERAND_INV:
+			case REC_OPERAND_SIZE:
+			case REC_EVEN_MOD:
+			case REC_INVALID_PAD:
+				rq_p->retcode = -EINVAL;
+				break;
+			case SEN_NOT_AVAIL:
+			case SEN_RETRY:
+			case REC_NO_RESPONSE:
+			default:
+				if (z90crypt.mask.st_count > 1)
+					rq_p->retcode =
+						-ERESTARTSYS;
+				else
+					rq_p->retcode = -ENODEV;
+				break;
+			}
+			rq_p->status[0] |= STAT_FAILED;
+			rq_p->audit[1] |= FP_AWAKENING;
+			atomic_set(&rq_p->alarmrung, 1);
+			wake_up(&rq_p->waitq);
+		}
+	} else {
+		if (z90crypt.mask.st_count > 1)
+			rq_p->retcode = -ERESTARTSYS;
+		else
+			rq_p->retcode = -ENODEV;
+		rq_p->status[0] |= STAT_FAILED;
+		rq_p->audit[1] |= FP_AWAKENING;
+		atomic_set(&rq_p->alarmrung, 1);
+		wake_up(&rq_p->waitq);
+	}
+}
+
+static inline void
+helper_handle_work_element(int index, unsigned char psmid[8], int rc,
+			   int buff_len, unsigned char *buff,
+			   unsigned char *resp_addr)
+{
+	struct work_element *pq_p;
+	struct list_head *lptr, *tptr;
+
+	pq_p = 0;
+	list_for_each_safe(lptr, tptr, &pending_list) {
+		pq_p = list_entry(lptr, struct work_element, liste);
+		if (!memcmp(pq_p->caller_id, psmid, sizeof(pq_p->caller_id))) {
+			list_del(lptr);
+			pendingq_count--;
+			pq_p->audit[1] |= FP_NOTPENDING;
+			break;
+		}
+		pq_p = 0;
+	}
+
+	if (!pq_p) {
+		PRINTK("device %d has work but no caller exists on pending Q\n",
+		       SHRT2LONG(index));
+		return;
+	}
+
+	switch (rc) {
+		case 0:
+			pq_p->resp_buff_size = buff_len;
+			pq_p->audit[1] |= FP_RESPSIZESET;
+			if (buff_len) {
+				pq_p->resp_addr = resp_addr;
+				pq_p->audit[1] |= FP_RESPADDRCOPIED;
+				memcpy(pq_p->resp_buff, buff, buff_len);
+				pq_p->audit[1] |= FP_RESPBUFFCOPIED;
+			}
+			break;
+		case REC_OPERAND_INV:
+		case REC_OPERAND_SIZE:
+		case REC_EVEN_MOD:
+		case REC_INVALID_PAD:
+			PDEBUG("-EINVAL after application error %d\n", rc);
+			pq_p->retcode = -EINVAL;
+			pq_p->status[0] |= STAT_FAILED;
+			break;
+		case REC_NO_RESPONSE:
+		default:
+			if (z90crypt.mask.st_count > 1)
+				pq_p->retcode = -ERESTARTSYS;
+			else
+				pq_p->retcode = -ENODEV;
+			pq_p->status[0] |= STAT_FAILED;
+			break;
+	}
+	if ((pq_p->status[0] != STAT_FAILED) || (pq_p->retcode != -ERELEASED)) {
+		pq_p->audit[1] |= FP_AWAKENING;
+		atomic_set(&pq_p->alarmrung, 1);
+		wake_up(&pq_p->waitq);
+	}
+}
+
+/**
+ * return TRUE if the work element should be removed from the queue
+ */
+static inline int
+helper_receive_rc(int index, int *rc_p, int *workavail_p)
+{
+	switch (*rc_p) {
+	case 0:
+	case REC_OPERAND_INV:
+	case REC_OPERAND_SIZE:
+	case REC_EVEN_MOD:
+	case REC_INVALID_PAD:
+		return 1;
+
+	case REC_BUSY:
+	case REC_NO_WORK:
+	case REC_EMPTY:
+	case REC_RETRY_DEV:
+	case REC_FATAL_ERROR:
+		break;
+
+	case REC_NO_RESPONSE:
+		*workavail_p = 0;
+		break;
+
+	default:
+		PRINTK("rc %d, device %d\n", *rc_p, SHRT2LONG(index));
+		*rc_p = REC_NO_RESPONSE;
+		*workavail_p = 0;
+		break;
+	}
+	return 0;
+}
+
+static inline void
+z90crypt_schedule_reader_timer(void)
+{
+	if (timer_pending(&reader_timer))
+		return;
+	if (mod_timer(&reader_timer, jiffies+(READERTIME*HZ/1000)) != 0)
+		PRINTK("Timer pending while modifying reader timer\n");
+}
+
+static void
+z90crypt_reader_task(unsigned long ptr)
+{
+	int workavail, remaining, index, rc, buff_len;
+	unsigned char	psmid[8], *resp_addr;
+	static unsigned char buff[1024];
+
+	PDEBUG("jiffies %ld\n", jiffies);
+
+	/**
+	 * we use workavail = 2 to ensure 2 passes with nothing dequeued before
+	 * exiting the loop. If remaining == 0 after the loop, there is no work
+	 * remaining on the queues.
+	 */
+	resp_addr = 0;
+	workavail = 2;
+	remaining = 0;
+	buff_len = 0;
+	while (workavail) {
+		workavail--;
+		rc = 0;
+		spin_lock_irq(&queuespinlock);
+		memset(buff, 0x00, sizeof(buff));
+
+		/* Dequeue once from each device in round robin. */
+		for (index = 0; index < z90crypt.mask.st_count; index++) {
+			PDEBUG("About to receive.\n");
+			rc = receive_from_crypto_device(SHRT2LONG(index),
+							psmid,
+							&buff_len,
+							buff,
+							&resp_addr);
+			PDEBUG("Dequeued: rc = %d.\n", rc);
+
+			if (helper_receive_rc(index, &rc, &workavail)) {
+				if (rc != REC_NO_RESPONSE) {
+					helper_send_work(index);
+					workavail = 2;
+				}
+
+				helper_handle_work_element(index, psmid, rc,
+							   buff_len, buff,
+							   resp_addr);
+			}
+
+			if (rc == REC_FATAL_ERROR)
+				remaining = 0;
+			else if (rc != REC_NO_RESPONSE)
+				remaining +=
+					SHRT2DEVPTR(index)->dev_caller_count;
+		}
+		spin_unlock_irq(&queuespinlock);
+	}
+
+	if (remaining) {
+		spin_lock_irq(&queuespinlock);
+		z90crypt_schedule_reader_timer();
+		spin_unlock_irq(&queuespinlock);
+	}
+}
+
+static inline void
+z90crypt_schedule_config_task(unsigned int expiration)
+{
+	if (timer_pending(&config_timer))
+		return;
+	if (mod_timer(&config_timer, jiffies+(expiration*HZ)) != 0)
+		PRINTK("Timer pending while modifying config timer\n");
+}
+
+static void
+z90crypt_config_task(unsigned long ptr)
+{
+	int rc;
+
+	PDEBUG("jiffies %ld\n", jiffies);
+
+	if ((rc = refresh_z90crypt(&z90crypt.cdx)))
+		PRINTK("Error %d detected in refresh_z90crypt.\n", rc);
+	/* If return was fatal, don't bother reconfiguring */
+	if ((rc != TSQ_FATAL_ERROR) && (rc != RSQ_FATAL_ERROR))
+		z90crypt_schedule_config_task(CONFIGTIME);
+}
+
+static inline void
+z90crypt_schedule_cleanup_task(void)
+{
+	if (timer_pending(&cleanup_timer))
+		return;
+	if (mod_timer(&cleanup_timer, jiffies+(CLEANUPTIME*HZ)) != 0)
+		PRINTK("Timer pending while modifying cleanup timer\n");
+}
+
+static inline void
+helper_drain_queues(void)
+{
+	struct work_element *pq_p;
+	struct list_head *lptr, *tptr;
+
+	list_for_each_safe(lptr, tptr, &pending_list) {
+		pq_p = list_entry(lptr, struct work_element, liste);
+		pq_p->retcode = -ENODEV;
+		pq_p->status[0] |= STAT_FAILED;
+		unbuild_caller(LONG2DEVPTR(pq_p->devindex),
+			       (struct caller *)pq_p->requestptr);
+		list_del(lptr);
+		pendingq_count--;
+		pq_p->audit[1] |= FP_NOTPENDING;
+		pq_p->audit[1] |= FP_AWAKENING;
+		atomic_set(&pq_p->alarmrung, 1);
+		wake_up(&pq_p->waitq);
+	}
+
+	list_for_each_safe(lptr, tptr, &request_list) {
+		pq_p = list_entry(lptr, struct work_element, liste);
+		pq_p->retcode = -ENODEV;
+		pq_p->status[0] |= STAT_FAILED;
+		list_del(lptr);
+		requestq_count--;
+		pq_p->audit[1] |= FP_REMREQUEST;
+		pq_p->audit[1] |= FP_AWAKENING;
+		atomic_set(&pq_p->alarmrung, 1);
+		wake_up(&pq_p->waitq);
+	}
+}
+
+static inline void
+helper_timeout_requests(void)
+{
+	struct work_element *pq_p;
+	struct list_head *lptr, *tptr;
+	long timelimit;
+
+	timelimit = jiffies - (CLEANUPTIME * HZ);
+	/* The list is in strict chronological order */
+	list_for_each_safe(lptr, tptr, &pending_list) {
+		pq_p = list_entry(lptr, struct work_element, liste);
+		if (pq_p->requestsent >= timelimit)
+			break;
+		pq_p->retcode = -ETIMEOUT;
+		pq_p->status[0] |= STAT_FAILED;
+		/* get this off any caller queue it may be on */
+		unbuild_caller(LONG2DEVPTR(pq_p->devindex),
+			       (struct caller *) pq_p->requestptr);
+		list_del(lptr);
+		pendingq_count--;
+		pq_p->audit[1] |= FP_TIMEDOUT;
+		pq_p->audit[1] |= FP_NOTPENDING;
+		pq_p->audit[1] |= FP_AWAKENING;
+		atomic_set(&pq_p->alarmrung, 1);
+		wake_up(&pq_p->waitq);
+	}
+
+	/**
+	 * If pending count is zero, items left on the request queue may
+	 * never be processed.
+	 */
+	if (pendingq_count <= 0) {
+		list_for_each_safe(lptr, tptr, &request_list) {
+			pq_p = list_entry(lptr, struct work_element, liste);
+			if (pq_p->requestsent >= timelimit)
+				break;
+			pq_p->retcode = -ETIMEOUT;
+			pq_p->status[0] |= STAT_FAILED;
+			list_del(lptr);
+			requestq_count--;
+			pq_p->audit[1] |= FP_TIMEDOUT;
+			pq_p->audit[1] |= FP_REMREQUEST;
+			pq_p->audit[1] |= FP_AWAKENING;
+			atomic_set(&pq_p->alarmrung, 1);
+			wake_up(&pq_p->waitq);
+		}
+	}
+}
+
+static void
+z90crypt_cleanup_task(unsigned long ptr)
+{
+	PDEBUG("jiffies %ld\n", jiffies);
+	spin_lock_irq(&queuespinlock);
+	if (z90crypt.mask.st_count <= 0) // no devices!
+		helper_drain_queues();
+	else
+		helper_timeout_requests();
+	spin_unlock_irq(&queuespinlock);
+	z90crypt_schedule_cleanup_task();
+}
+
+static void
+z90crypt_schedule_reader_task(unsigned long ptr)
+{
+	tasklet_schedule(&reader_tasklet);
+}
+
+/**
+ * Lowlevel Functions:
+ *
+ *   create_z90crypt:  creates and initializes basic data structures
+ *   refresh_z90crypt:	re-initializes basic data structures
+ *   find_crypto_devices: returns a count and mask of hardware status
+ *   create_crypto_device:  builds the descriptor for a device
+ *   destroy_crypto_device:  unallocates the descriptor for a device
+ *   destroy_z90crypt:	drains all work, unallocates structs
+ */
+
+/**
+ * build the z90crypt root structure using the given domain index
+ */
+static int
+create_z90crypt(int *cdx_p)
+{
+	struct hdware_block *hdware_blk_p;
+
+	memset(&z90crypt, 0x00, sizeof(struct z90crypt));
+	z90crypt.domain_established = 0;
+	z90crypt.len = sizeof(struct z90crypt);
+	z90crypt.max_count = Z90CRYPT_NUM_DEVS;
+	z90crypt.cdx = *cdx_p;
+
+	hdware_blk_p = (struct hdware_block *)
+		kmalloc(sizeof(struct hdware_block), GFP_ATOMIC);
+	if (!hdware_blk_p) {
+		PDEBUG("kmalloc for hardware block failed\n");
+		return ENOMEM;
+	}
+	memset(hdware_blk_p, 0x00, sizeof(struct hdware_block));
+	z90crypt.hdware_info = hdware_blk_p;
+
+	return 0;
+}
+
+static inline int
+helper_scan_devices(int cdx_array[16], int *cdx_p, int *correct_cdx_found)
+{
+	enum hdstat hd_stat;
+	int q_depth, dev_type;
+	int i, j, k;
+
+	q_depth = dev_type = k = 0;
+	for (i = 0; i < z90crypt.max_count; i++) {
+		hd_stat = HD_NOT_THERE;
+		for (j = 0; j <= 15; cdx_array[j++] = -1);
+		k = 0;
+		for (j = 0; j <= 15; j++) {
+			hd_stat = query_online(i, j, MAX_RESET,
+					       &q_depth, &dev_type);
+			if (hd_stat == HD_TSQ_EXCEPTION) {
+				z90crypt.terminating = 1;
+				PRINTKC("exception taken!\n");
+				break;
+			}
+			if (hd_stat == HD_ONLINE) {
+				cdx_array[k++] = j;
+				if (*cdx_p == j) {
+					*correct_cdx_found  = 1;
+					break;
+				}
+			}
+		}
+		if ((*correct_cdx_found == 1) || (k != 0))
+			break;
+		if (z90crypt.terminating)
+			break;
+	}
+	return k;
+}
+
+static inline int
+probe_crypto_domain(int *cdx_p)
+{
+	int cdx_array[16];
+	int correct_cdx_found, k;
+
+	correct_cdx_found = 0;
+	k = helper_scan_devices(cdx_array, cdx_p, &correct_cdx_found);
+
+	if (z90crypt.terminating)
+		return TSQ_FATAL_ERROR;
+
+	if (correct_cdx_found)
+		return 0;
+
+	if (k == 0) {
+		*cdx_p = 0;
+		return 0;
+	}
+
+	if (k == 1) {
+		if ((*cdx_p == -1) || !z90crypt.domain_established) {
+			*cdx_p = cdx_array[0];
+			return 0;
+		}
+		if (*cdx_p != cdx_array[0]) {
+			PRINTK("incorrect domain: specified = %d, found = %d\n",
+			       *cdx_p, cdx_array[0]);
+			return Z90C_INCORRECT_DOMAIN;
+		}
+	}
+
+	return Z90C_AMBIGUOUS_DOMAIN;
+}
+
+static int
+refresh_z90crypt(int *cdx_p)
+{
+	int i, j, indx, rv;
+	struct status local_mask;
+	struct device *devPtr;
+	unsigned char oldStat, newStat;
+	int return_unchanged;
+
+	if (z90crypt.len != sizeof(z90crypt))
+		return ENOTINIT;
+	if (z90crypt.terminating)
+		return TSQ_FATAL_ERROR;
+	rv = 0;
+	if (!z90crypt.hdware_info->hdware_mask.st_count &&
+	    !z90crypt.domain_established)
+		rv = probe_crypto_domain(cdx_p);
+	if (z90crypt.terminating)
+		return TSQ_FATAL_ERROR;
+	if (rv) {
+		switch (rv) {
+		case Z90C_AMBIGUOUS_DOMAIN:
+			PRINTK("ambiguous domain detected\n");
+			break;
+		case Z90C_INCORRECT_DOMAIN:
+			PRINTK("incorrect domain specified\n");
+			break;
+		default:
+			PRINTK("probe domain returned %d\n", rv);
+			break;
+		}
+		return rv;
+	}
+	if (*cdx_p) {
+		z90crypt.cdx = *cdx_p;
+		z90crypt.domain_established = 1;
+	}
+	rv = find_crypto_devices(&local_mask);
+	if (rv) {
+		PRINTK("find crypto devices returned %d\n", rv);
+		return rv;
+	}
+	if (!memcmp(&local_mask, &z90crypt.hdware_info->hdware_mask,
+		    sizeof(struct status))) {
+		return_unchanged = 1;
+		for (i = 0; i < Z90CRYPT_NUM_TYPES; i++) {
+			/**
+			 * Check for disabled cards.  If any device is marked
+			 * disabled, destroy it.
+			 */
+			for (j = 0;
+			     j < z90crypt.hdware_info->type_mask[i].st_count;
+			     j++) {
+				indx = z90crypt.hdware_info->type_x_addr[i].
+								device_index[j];
+				devPtr = z90crypt.device_p[indx];
+				if (devPtr && devPtr->disabled) {
+					local_mask.st_mask[indx] = HD_NOT_THERE;
+					return_unchanged = 0;
+				}
+			}
+		}
+		if (return_unchanged == 1)
+			return 0;
+	}
+
+	spin_lock_irq(&queuespinlock);
+	for (i = 0; i < z90crypt.max_count; i++) {
+		oldStat = z90crypt.hdware_info->hdware_mask.st_mask[i];
+		newStat = local_mask.st_mask[i];
+		if ((oldStat == HD_ONLINE) && (newStat != HD_ONLINE))
+			destroy_crypto_device(i);
+		else if ((oldStat != HD_ONLINE) && (newStat == HD_ONLINE)) {
+			rv = create_crypto_device(i);
+			if (rv >= REC_FATAL_ERROR)
+				return rv;
+			if (rv != 0) {
+				local_mask.st_mask[i] = HD_NOT_THERE;
+				local_mask.st_count--;
+			}
+		}
+	}
+	memcpy(z90crypt.hdware_info->hdware_mask.st_mask, local_mask.st_mask,
+	       sizeof(local_mask.st_mask));
+	z90crypt.hdware_info->hdware_mask.st_count = local_mask.st_count;
+	z90crypt.hdware_info->hdware_mask.disabled_count =
+						      local_mask.disabled_count;
+	refresh_index_array(&z90crypt.mask, &z90crypt.overall_device_x);
+	for (i = 0; i < Z90CRYPT_NUM_TYPES; i++)
+		refresh_index_array(&(z90crypt.hdware_info->type_mask[i]),
+				    &(z90crypt.hdware_info->type_x_addr[i]));
+	spin_unlock_irq(&queuespinlock);
+
+	return rv;
+}
+
+static int
+find_crypto_devices(struct status *deviceMask)
+{
+	int i, q_depth, dev_type;
+	enum hdstat hd_stat;
+
+	deviceMask->st_count = 0;
+	deviceMask->disabled_count = 0;
+	deviceMask->user_disabled_count = 0;
+
+	for (i = 0; i < z90crypt.max_count; i++) {
+		hd_stat = query_online(i, z90crypt.cdx, MAX_RESET, &q_depth,
+				       &dev_type);
+		if (hd_stat == HD_TSQ_EXCEPTION) {
+			z90crypt.terminating = 1;
+			PRINTKC("Exception during probe for crypto devices\n");
+			return TSQ_FATAL_ERROR;
+		}
+		deviceMask->st_mask[i] = hd_stat;
+		if (hd_stat == HD_ONLINE) {
+			PDEBUG("Got an online crypto!: %d\n", i);
+			PDEBUG("Got a queue depth of %d\n", q_depth);
+			PDEBUG("Got a device type of %d\n", dev_type);
+			if (q_depth <= 0)
+				return TSQ_FATAL_ERROR;
+			deviceMask->st_count++;
+			z90crypt.q_depth_array[i] = q_depth;
+			z90crypt.dev_type_array[i] = dev_type;
+		}
+	}
+
+	return 0;
+}
+
+static int
+refresh_index_array(struct status *status_str, struct device_x *index_array)
+{
+	int i, count;
+	enum devstat stat;
+
+	i = -1;
+	count = 0;
+	do {
+		stat = status_str->st_mask[++i];
+		if (stat == DEV_ONLINE)
+			index_array->device_index[count++] = i;
+	} while ((i < Z90CRYPT_NUM_DEVS) && (count < status_str->st_count));
+
+	return count;
+}
+
+static int
+create_crypto_device(int index)
+{
+	int rv, devstat, total_size;
+	struct device *dev_ptr;
+	struct status *type_str_p;
+	int deviceType;
+
+	dev_ptr = z90crypt.device_p[index];
+	if (!dev_ptr) {
+		total_size = sizeof(struct device) +
+			     z90crypt.q_depth_array[index] * sizeof(int);
+
+		dev_ptr = (struct device *) kmalloc(total_size, GFP_ATOMIC);
+		if (!dev_ptr) {
+			PRINTK("kmalloc device %d failed\n", index);
+			return ENOMEM;
+		}
+		memset(dev_ptr, 0, total_size);
+		dev_ptr->dev_resp_p = kmalloc(MAX_RESPONSE_SIZE, GFP_ATOMIC);
+		if (!dev_ptr->dev_resp_p) {
+			kfree(dev_ptr);
+			PRINTK("kmalloc device %d rec buffer failed\n", index);
+			return ENOMEM;
+		}
+		dev_ptr->dev_resp_l = MAX_RESPONSE_SIZE;
+		INIT_LIST_HEAD(&(dev_ptr->dev_caller_list));
+	}
+
+	devstat = reset_device(index, z90crypt.cdx, MAX_RESET);
+	if (devstat == DEV_RSQ_EXCEPTION) {
+		PRINTK("exception during reset device %d\n", index);
+		kfree(dev_ptr->dev_resp_p);
+		kfree(dev_ptr);
+		return RSQ_FATAL_ERROR;
+	}
+	if (devstat == DEV_ONLINE) {
+		dev_ptr->dev_self_x = index;
+		dev_ptr->dev_type = z90crypt.dev_type_array[index];
+		if (dev_ptr->dev_type == NILDEV) {
+			rv = probe_device_type(dev_ptr);
+			if (rv) {
+				PRINTK("rv = %d from probe_device_type %d\n",
+				       rv, index);
+				kfree(dev_ptr->dev_resp_p);
+				kfree(dev_ptr);
+				return rv;
+			}
+		}
+		deviceType = dev_ptr->dev_type;
+		z90crypt.dev_type_array[index] = deviceType;
+		if (deviceType == PCICA)
+			z90crypt.hdware_info->device_type_array[index] = 1;
+		else if (deviceType == PCICC)
+			z90crypt.hdware_info->device_type_array[index] = 2;
+		else if (deviceType == PCIXCC)
+			z90crypt.hdware_info->device_type_array[index] = 3;
+		else
+			z90crypt.hdware_info->device_type_array[index] = -1;
+	}
+
+	/**
+	 * 'q_depth' returned by the hardware is one less than
+	 * the actual depth
+	 */
+	dev_ptr->dev_q_depth = z90crypt.q_depth_array[index];
+	dev_ptr->dev_type = z90crypt.dev_type_array[index];
+	dev_ptr->dev_stat = devstat;
+	dev_ptr->disabled = 0;
+	z90crypt.device_p[index] = dev_ptr;
+
+	if (devstat == DEV_ONLINE) {
+		if (z90crypt.mask.st_mask[index] != DEV_ONLINE) {
+			z90crypt.mask.st_mask[index] = DEV_ONLINE;
+			z90crypt.mask.st_count++;
+		}
+		deviceType = dev_ptr->dev_type;
+		type_str_p = &z90crypt.hdware_info->type_mask[deviceType];
+		if (type_str_p->st_mask[index] != DEV_ONLINE) {
+			type_str_p->st_mask[index] = DEV_ONLINE;
+			type_str_p->st_count++;
+		}
+	}
+
+	return 0;
+}
+
+static int
+destroy_crypto_device(int index)
+{
+	struct device *dev_ptr;
+	int t, disabledFlag;
+
+	dev_ptr = z90crypt.device_p[index];
+
+	/* remember device type; get rid of device struct */
+	if (dev_ptr) {
+		disabledFlag = dev_ptr->disabled;
+		t = dev_ptr->dev_type;
+		if (dev_ptr->dev_resp_p)
+			kfree(dev_ptr->dev_resp_p);
+		kfree(dev_ptr);
+	} else {
+		disabledFlag = 0;
+		t = -1;
+	}
+	z90crypt.device_p[index] = 0;
+
+	/* if the type is valid, remove the device from the type_mask */
+	if ((t != -1) && z90crypt.hdware_info->type_mask[t].st_mask[index]) {
+		  z90crypt.hdware_info->type_mask[t].st_mask[index] = 0x00;
+		  z90crypt.hdware_info->type_mask[t].st_count--;
+		  if (disabledFlag == 1)
+			z90crypt.hdware_info->type_mask[t].disabled_count--;
+	}
+	if (z90crypt.mask.st_mask[index] != DEV_GONE) {
+		z90crypt.mask.st_mask[index] = DEV_GONE;
+		z90crypt.mask.st_count--;
+	}
+	z90crypt.hdware_info->device_type_array[index] = 0;
+
+	return 0;
+}
+
+static void
+destroy_z90crypt(void)
+{
+	int i;
+	for (i = 0; i < z90crypt.max_count; i++)
+		if (z90crypt.device_p[i])
+			destroy_crypto_device(i);
+	if (z90crypt.hdware_info)
+		kfree((void *)z90crypt.hdware_info);
+	memset((void *)&z90crypt, 0, sizeof(z90crypt));
+}
+
+static unsigned char static_testmsg[] = {
+0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x00,0x06,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x43,0x43,
+0x41,0x2d,0x41,0x50,0x50,0x4c,0x20,0x20,0x20,0x01,0x01,0x01,0x00,0x00,0x00,0x00,
+0x50,0x4b,0x00,0x00,0x00,0x00,0x01,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x05,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x70,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x32,
+0x01,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0xb8,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x49,0x43,0x53,0x46,
+0x20,0x20,0x20,0x20,0x50,0x4b,0x0a,0x00,0x50,0x4b,0x43,0x53,0x2d,0x31,0x2e,0x32,
+0x37,0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0x00,0x11,0x22,0x33,0x44,
+0x55,0x66,0x77,0x88,0x99,0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0x00,
+0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0x00,0x11,0x22,0x33,0x44,0x55,0x66,
+0x77,0x88,0x99,0x00,0x11,0x22,0x33,0x5d,0x00,0x5b,0x00,0x77,0x88,0x1e,0x00,0x00,
+0x57,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x4f,0x00,0x00,0x00,0x03,0x02,0x00,0x00,
+0x40,0x01,0x00,0x01,0xce,0x02,0x68,0x2d,0x5f,0xa9,0xde,0x0c,0xf6,0xd2,0x7b,0x58,
+0x4b,0xf9,0x28,0x68,0x3d,0xb4,0xf4,0xef,0x78,0xd5,0xbe,0x66,0x63,0x42,0xef,0xf8,
+0xfd,0xa4,0xf8,0xb0,0x8e,0x29,0xc2,0xc9,0x2e,0xd8,0x45,0xb8,0x53,0x8c,0x6f,0x4e,
+0x72,0x8f,0x6c,0x04,0x9c,0x88,0xfc,0x1e,0xc5,0x83,0x55,0x57,0xf7,0xdd,0xfd,0x4f,
+0x11,0x36,0x95,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+};
+
+static int
+probe_device_type(struct device *devPtr)
+{
+	int rv, dv, i, index, length;
+	unsigned char psmid[8];
+	static unsigned char loc_testmsg[384];
+
+	index = devPtr->dev_self_x;
+	rv = 0;
+	do {
+		memcpy(loc_testmsg, static_testmsg, sizeof(static_testmsg));
+		length = sizeof(static_testmsg) - 24;
+		/* the -24 allows for the header */
+		dv = send_to_AP(index, z90crypt.cdx, length, loc_testmsg);
+		if (dv) {
+			PDEBUG("dv returned by send during probe: %d\n", dv);
+			if (dv == DEV_SEN_EXCEPTION) {
+				rv = SEN_FATAL_ERROR;
+				PRINTKC("exception in send to AP %d\n", index);
+				break;
+			}
+			PDEBUG("return value from send_to_AP: %d\n", rv);
+			switch (dv) {
+			case DEV_GONE:
+				PDEBUG("dev %d not available\n", index);
+				rv = SEN_NOT_AVAIL;
+				break;
+			case DEV_ONLINE:
+				rv = 0;
+				break;
+			case DEV_EMPTY:
+				rv = SEN_NOT_AVAIL;
+				break;
+			case DEV_NO_WORK:
+				rv = SEN_FATAL_ERROR;
+				break;
+			case DEV_BAD_MESSAGE:
+				rv = SEN_USER_ERROR;
+				break;
+			case DEV_QUEUE_FULL:
+				rv = SEN_QUEUE_FULL;
+				break;
+			default:
+				PRINTK("unknown dv=%d for dev %d\n", dv, index);
+				rv = SEN_NOT_AVAIL;
+				break;
+			}
+		}
+
+		if (rv)
+			break;
+
+		for (i = 0; i < 6; i++) {
+			mdelay(300);
+			dv = receive_from_AP(index, z90crypt.cdx,
+					     devPtr->dev_resp_l,
+					     devPtr->dev_resp_p, psmid);
+			PDEBUG("dv returned by DQ = %d\n", dv);
+			if (dv == DEV_REC_EXCEPTION) {
+				rv = REC_FATAL_ERROR;
+				PRINTKC("exception in dequeue %d\n",
+					index);
+				break;
+			}
+			switch (dv) {
+			case DEV_ONLINE:
+				rv = 0;
+				break;
+			case DEV_EMPTY:
+				rv = REC_EMPTY;
+				break;
+			case DEV_NO_WORK:
+				rv = REC_NO_WORK;
+				break;
+			case DEV_BAD_MESSAGE:
+			case DEV_GONE:
+			default:
+				rv = REC_NO_RESPONSE;
+				break;
+			}
+			if ((rv != 0) && (rv != REC_NO_WORK))
+				break;
+			if (rv == 0)
+				break;
+		}
+		if (rv)
+			break;
+		rv = (devPtr->dev_resp_p[0] == 0x00) &&
+		     (devPtr->dev_resp_p[1] == 0x86);
+		if (rv)
+			devPtr->dev_type = PCICC;
+		else
+			devPtr->dev_type = PCICA;
+		rv = 0;
+	} while (0);
+	/* In a general error case, the card is not marked online */
+	return rv;
+}
+
+#ifdef Z90CRYPT_USE_HOTPLUG
+void
+z90crypt_hotplug_event(int dev_major, int dev_minor, int action)
+{
+#ifdef CONFIG_HOTPLUG
+	char *argv[3];
+	char *envp[6];
+	char  major[20];
+	char  minor[20];
+
+	sprintf(major, "MAJOR=%d", dev_major);
+	sprintf(minor, "MINOR=%d", dev_minor);
+
+	argv[0] = hotplug_path;
+	argv[1] = "z90crypt";
+	argv[2] = 0;
+
+	envp[0] = "HOME=/";
+	envp[1] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
+
+	switch (action) {
+	case Z90CRYPT_HOTPLUG_ADD:
+		envp[2] = "ACTION=add";
+		break;
+	case Z90CRYPT_HOTPLUG_REMOVE:
+		envp[2] = "ACTION=remove";
+		break;
+	default:
+		BUG();
+	}
+	envp[3] = major;
+	envp[4] = minor;
+	envp[5] = 0;
+
+	call_usermodehelper(argv[0], argv, envp, 0);
+#endif
+}
+#endif
+
+module_init(z90crypt_init_module);
+module_exit(z90crypt_cleanup_module);
--- diff/drivers/s390/net/qeth_fs.h	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/s390/net/qeth_fs.h	2004-04-21 10:45:34.638437656 +0100
@@ -0,0 +1,156 @@
+/*
+ * linux/drivers/s390/net/qeth_fs.h
+ *
+ * Linux on zSeries OSA Express and HiperSockets support.
+ *
+ * This header file contains definitions related to sysfs and procfs.
+ *
+ * Copyright 2000,2003 IBM Corporation
+ * Author(s): Thomas Spatzier <tspat@de.ibm.com>
+ *
+ */
+#ifndef __QETH_FS_H__
+#define __QETH_FS_H__
+
+#ifdef CONFIG_PROC_FS
+extern int
+qeth_create_procfs_entries(void);
+
+extern void
+qeth_remove_procfs_entries(void);
+#else
+static inline int
+qeth_create_procfs_entries(void)
+{
+	return 0;
+}
+
+static inline void
+qeth_remove_procfs_entries(void)
+{
+}
+#endif /* CONFIG_PROC_FS */
+
+extern int
+qeth_create_device_attributes(struct device *dev);
+
+extern void
+qeth_remove_device_attributes(struct device *dev);
+
+extern int
+qeth_create_driver_attributes(void);
+
+extern void
+qeth_remove_driver_attributes(void);
+
+/*
+ * utility functions used in qeth_proc.c and qeth_sys.c
+ */
+
+static inline const char *
+qeth_get_checksum_str(struct qeth_card *card)
+{
+	if (card->options.checksum_type == SW_CHECKSUMMING)
+		return "sw";
+	else if (card->options.checksum_type == HW_CHECKSUMMING)
+		return "hw";
+	else
+		return "no";
+}
+
+static inline const char *
+qeth_get_prioq_str(struct qeth_card *card, char *buf)
+{
+	if (card->qdio.do_prio_queueing == QETH_NO_PRIO_QUEUEING)
+		sprintf(buf, "always_q_%i", card->qdio.default_out_queue);
+	else
+		strcpy(buf, (card->qdio.do_prio_queueing ==
+					QETH_PRIO_Q_ING_PREC)?
+				"by_prec." : "by_ToS");
+	return buf;
+}
+
+static inline const char *
+qeth_get_bufsize_str(struct qeth_card *card)
+{
+	if (card->qdio.in_buf_size == 16384)
+		return "16k";
+	else if (card->qdio.in_buf_size == 24576)
+		return "24k";
+	else if (card->qdio.in_buf_size == 32768)
+		return "32k";
+	else if (card->qdio.in_buf_size == 40960)
+		return "40k";
+	else
+		return "64k";
+}
+
+static inline const char *
+qeth_get_cardname(struct qeth_card *card)
+{
+ 	if (card->info.guestlan) {
+ 		switch (card->info.type) {
+ 		case QETH_CARD_TYPE_OSAE:
+			return " Guest LAN QDIO";
+ 		case QETH_CARD_TYPE_IQD:
+			return " Guest LAN Hiper";
+		default:
+			return " unknown";
+ 		}
+	} else {
+		switch (card->info.type) {
+		case QETH_CARD_TYPE_OSAE:
+			return " OSD Express";
+		case QETH_CARD_TYPE_IQD:
+			return " HiperSockets";
+		default:
+			return " unknown";
+		}
+	}
+	return " n/a";
+}
+
+/* max length to be returned: 14 */
+static inline const char *
+qeth_get_cardname_short(struct qeth_card *card)
+{
+	if (card->info.guestlan){
+		switch (card->info.type){
+		case QETH_CARD_TYPE_OSAE:
+			return "GuestLAN QDIO";
+		case QETH_CARD_TYPE_IQD:
+			return "GuestLAN Hiper";
+		default:
+			return "unknown";
+		}
+	} else {
+		switch (card->info.type) {
+		case QETH_CARD_TYPE_OSAE:
+			switch (card->info.link_type) {
+			case QETH_LINK_TYPE_FAST_ETH:
+				return "OSD_100";
+			case QETH_LINK_TYPE_HSTR:
+				return "HSTR";
+			case QETH_LINK_TYPE_GBIT_ETH:
+				return "OSD_1000";
+			case QETH_LINK_TYPE_LANE_ETH100:
+				return "OSD_FE_LANE";
+			case QETH_LINK_TYPE_LANE_TR:
+				return "OSD_TR_LANE";
+			case QETH_LINK_TYPE_LANE_ETH1000:
+				return "OSD_GbE_LANE";
+			case QETH_LINK_TYPE_LANE:
+				return "OSD_ATM_LANE";
+			default:
+				return "OSD_Express";
+			}
+		case QETH_CARD_TYPE_IQD:
+			return "HiperSockets";
+		default:
+			return "unknown";
+		}
+	}
+	return "n/a";
+}
+
+#endif /* __QETH_FS_H__ */
--- diff/drivers/s390/net/qeth_main.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/s390/net/qeth_main.c	2004-04-21 10:45:34.646436440 +0100
@@ -0,0 +1,6820 @@
+/*
+ *
+ * linux/drivers/s390/net/qeth_main.c ($Revision: 1.77 $)
+ *
+ * Linux on zSeries OSA Express and HiperSockets support
+ *
+ * Copyright 2000,2003 IBM Corporation
+ *
+ *    Author(s): Original Code written by
+ *			  Utz Bacher (utz.bacher@de.ibm.com)
+ *		 Rewritten by
+ *			  Frank Pavlic (pavlic@de.ibm.com) and
+ *		 	  Thomas Spatzier <tspat@de.ibm.com>
+ *
+ *    $Revision: 1.77 $	 $Date: 2004/04/06 14:38:19 $
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/***
+ * eye catcher; just for debugging purposes
+ */
+void volatile
+qeth_eyecatcher(void)
+{
+	return;
+}
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+
+#include <linux/string.h>
+#include <linux/errno.h>
+#include <linux/mm.h>
+
+#include <asm/io.h>
+#include <asm/ebcdic.h>
+#include <linux/ctype.h>
+#include <asm/semaphore.h>
+#include <asm/timex.h>
+#include <linux/ip.h>
+#include <linux/inetdevice.h>
+#include <linux/netdevice.h>
+#include <linux/sched.h>
+#include <linux/workqueue.h>
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/interrupt.h>
+#include <linux/tcp.h>
+#include <linux/icmp.h>
+#include <linux/skbuff.h>
+#include <net/route.h>
+#include <net/arp.h>
+#include <linux/in.h>
+#include <linux/igmp.h>
+#include <net/ip.h>
+#include <asm/uaccess.h>
+#include <linux/init.h>
+#include <linux/reboot.h>
+#include <asm/qeth.h>
+#include <linux/mii.h>
+
+#include "qeth.h"
+#include "qeth_mpc.h"
+#include "qeth_fs.h"
+
+#define VERSION_QETH_C "$Revision: 1.77 $"
+static const char *version = "qeth S/390 OSA-Express driver ("
+	VERSION_QETH_C "/" VERSION_QETH_H "/" VERSION_QETH_MPC_H
+	QETH_VERSION_IPV6 QETH_VERSION_VLAN ")";
+/**
+ * Debug Facility Stuff
+ */
+static debug_info_t *qeth_dbf_setup = NULL;
+static debug_info_t *qeth_dbf_data = NULL;
+static debug_info_t *qeth_dbf_misc = NULL;
+static debug_info_t *qeth_dbf_control = NULL;
+static debug_info_t *qeth_dbf_trace = NULL;
+static debug_info_t *qeth_dbf_sense = NULL;
+static debug_info_t *qeth_dbf_qerr = NULL;
+static char qeth_dbf_text_buf[255];
+
+/**
+ * some more definitions and declarations
+ */
+static unsigned int known_devices[][10] = QETH_MODELLIST_ARRAY;
+
+/* list of our cards */
+struct qeth_card_list_struct qeth_card_list;
+
+static void qeth_send_control_data_cb(struct qeth_channel *,
+				      struct qeth_cmd_buffer *);
+
+static atomic_t qeth_hsi_count;
+
+/**
+ * here we go with function implementation
+ */
+static void
+qeth_init_qdio_info(struct qeth_card *card);
+
+static int
+qeth_init_qdio_queues(struct qeth_card *card);
+
+static int
+qeth_alloc_qdio_buffers(struct qeth_card *card);
+
+static void
+qeth_free_qdio_buffers(struct qeth_card *);
+
+static void
+qeth_clear_qdio_buffers(struct qeth_card *);
+
+static void
+qeth_clear_ip_list(struct qeth_card *, int, int);
+
+static void
+qeth_clear_ipacmd_list(struct qeth_card *);
+
+static int
+qeth_qdio_clear_card(struct qeth_card *, int);
+
+static void
+qeth_clear_working_pool_list(struct qeth_card *);
+
+static void
+qeth_clear_cmd_buffers(struct qeth_channel *);
+
+static int
+qeth_stop(struct net_device *);
+
+static void
+qeth_clear_ipato_list(struct qeth_card *);
+
+static int
+qeth_is_addr_covered_by_ipato(struct qeth_card *, struct qeth_ipaddr *);
+
+static void
+qeth_irq_tasklet(unsigned long);
+
+static int
+qeth_set_online(struct ccwgroup_device *);
+/**
+ * free channel command buffers
+ */
+static void
+qeth_clean_channel(struct qeth_channel *channel)
+{
+	int cnt;
+
+	QETH_DBF_TEXT(setup, 2, "freech");
+	for (cnt = 0; cnt < QETH_CMD_BUFFER_NO; cnt++)
+		kfree(channel->iob[cnt].data);
+}
+
+/**
+ * free card
+ */
+static void
+qeth_free_card(struct qeth_card *card)
+{
+
+	QETH_DBF_TEXT(setup, 2, "freecrd");
+	QETH_DBF_HEX(setup, 2, &card, sizeof(void *));
+	qeth_clean_channel(&card->read);
+	qeth_clean_channel(&card->write);
+	if (card->dev)
+		free_netdev(card->dev);
+	qeth_clear_ip_list(card, 0, 0);
+	qeth_clear_ipato_list(card);
+	qeth_free_qdio_buffers(card);
+	kfree(card);
+}
+
+/**
+ * alloc memory for command buffer per channel
+ */
+static int
+qeth_setup_channel(struct qeth_channel *channel)
+{
+	int cnt;
+
+	QETH_DBF_TEXT(setup, 2, "setupch");
+	for (cnt=0; cnt < QETH_CMD_BUFFER_NO; cnt++) {
+		channel->iob[cnt].data = (char *)
+			kmalloc(QETH_BUFSIZE, GFP_DMA|GFP_KERNEL);
+		if (channel->iob[cnt].data == NULL)
+			break;
+		channel->iob[cnt].state = BUF_STATE_FREE;
+		channel->iob[cnt].channel = channel;
+		channel->iob[cnt].callback = qeth_send_control_data_cb;
+		channel->iob[cnt].rc = 0;
+	}
+	if (cnt < QETH_CMD_BUFFER_NO) {
+		while (cnt-- > 0)
+			kfree(channel->iob[cnt].data);
+		return -ENOMEM;
+	}
+	channel->buf_no = 0;
+	channel->io_buf_no = 0;
+	atomic_set(&channel->irq_pending, 0);
+	spin_lock_init(&channel->iob_lock);
+
+	init_waitqueue_head(&channel->wait_q);
+	channel->irq_tasklet.data = (unsigned long) channel;
+	channel->irq_tasklet.func = qeth_irq_tasklet;
+	return 0;
+}
+
+/**
+ * alloc memory for card structure
+ */
+static struct qeth_card *
+qeth_alloc_card(void)
+{
+	struct qeth_card *card;
+
+	QETH_DBF_TEXT(setup, 2, "alloccrd");
+	card = (struct qeth_card *) kmalloc(sizeof(struct qeth_card),
+					    GFP_DMA|GFP_KERNEL);
+	if (!card)
+		return NULL;
+	QETH_DBF_HEX(setup, 2, &card, sizeof(void *));
+	memset(card, 0, sizeof(struct qeth_card));
+	if (qeth_setup_channel(&card->read)) {
+		kfree(card);
+		return NULL;
+	}
+	if (qeth_setup_channel(&card->write)) {
+		qeth_clean_channel(&card->read);
+		kfree(card);
+		return NULL;
+	}
+	return card;
+}
+
+static long
+__qeth_check_irb_error(struct ccw_device *cdev, struct irb *irb)
+{
+	if (!IS_ERR(irb))
+		return 0;
+
+	switch (PTR_ERR(irb)) {
+	case -EIO:
+		PRINT_WARN("i/o-error on device %s\n", cdev->dev.bus_id);
+		QETH_DBF_TEXT(trace, 2, "ckirberr");
+		QETH_DBF_TEXT_(trace, 2, "  rc%d", -EIO);
+		break;
+	case -ETIMEDOUT:
+		PRINT_WARN("timeout on device %s\n", cdev->dev.bus_id);
+		QETH_DBF_TEXT(trace, 2, "ckirberr");
+		QETH_DBF_TEXT_(trace, 2, "  rc%d", -ETIMEDOUT);
+		break;
+	default:
+		PRINT_WARN("unknown error %ld on device %s\n", PTR_ERR(irb),
+			   cdev->dev.bus_id);
+		QETH_DBF_TEXT(trace, 2, "ckirberr");
+		QETH_DBF_TEXT(trace, 2, "  rc???");
+	}
+	return PTR_ERR(irb);
+}
+
+static int
+qeth_get_problem(struct ccw_device *cdev, struct irb *irb)
+{
+	int dstat,cstat;
+	char *sense;
+
+	sense = (char *) irb->ecw;
+	cstat = irb->scsw.cstat;
+	dstat = irb->scsw.dstat;
+
+	if (cstat & (SCHN_STAT_CHN_CTRL_CHK | SCHN_STAT_INTF_CTRL_CHK |
+		     SCHN_STAT_CHN_DATA_CHK | SCHN_STAT_CHAIN_CHECK |
+		     SCHN_STAT_PROT_CHECK | SCHN_STAT_PROG_CHECK)) {
+		QETH_DBF_TEXT(trace,2, "CGENCHK");
+		PRINT_WARN("check on device %s, dstat=x%x, cstat=x%x ",
+			   cdev->dev.bus_id, dstat, cstat);
+		HEXDUMP16(WARN, "irb: ", irb);
+		HEXDUMP16(WARN, "irb: ", ((char *) irb) + 32);
+		return 1;
+	}
+
+	if (dstat & DEV_STAT_UNIT_CHECK) {
+		if (sense[SENSE_RESETTING_EVENT_BYTE] &
+		    SENSE_RESETTING_EVENT_FLAG) {
+			QETH_DBF_TEXT(trace,2,"REVIND");
+			return 1;
+		}
+		if (sense[SENSE_COMMAND_REJECT_BYTE] &
+		    SENSE_COMMAND_REJECT_FLAG) {
+			QETH_DBF_TEXT(trace,2,"CMDREJi");
+			return 0;
+		}
+		if ((sense[2] == 0xaf) && (sense[3] == 0xfe)) {
+			QETH_DBF_TEXT(trace,2,"AFFE");
+			return 1;
+		}
+		if ((!sense[0]) && (!sense[1]) && (!sense[2]) && (!sense[3])) {
+			QETH_DBF_TEXT(trace,2,"ZEROSEN");
+			return 0;
+		}
+		QETH_DBF_TEXT(trace,2,"DGENCHK");
+			return 1;
+	}
+	return 0;
+}
+static int qeth_issue_next_read(struct qeth_card *);
+
+/**
+ * interrupt handler
+ */
+static void
+qeth_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
+{
+	int rc;
+	int cstat,dstat;
+	struct qeth_cmd_buffer *buffer;
+	struct qeth_channel *channel;
+	struct qeth_card *card;
+
+	QETH_DBF_TEXT(trace,5,"irq");
+
+	if (__qeth_check_irb_error(cdev, irb))
+		return;
+	cstat = irb->scsw.cstat;
+	dstat = irb->scsw.dstat;
+
+	card = CARD_FROM_CDEV(cdev);
+	if (!card)
+		return;
+
+	if (card->read.ccwdev == cdev){
+		channel = &card->read;
+		QETH_DBF_TEXT(trace,5,"read");
+	} else if (card->write.ccwdev == cdev) {
+		channel = &card->write;
+		QETH_DBF_TEXT(trace,5,"write");
+	} else {
+		channel = &card->data;
+		QETH_DBF_TEXT(trace,5,"data");
+	}
+	atomic_set(&channel->irq_pending, 0);
+
+	if (irb->scsw.fctl & (SCSW_FCTL_CLEAR_FUNC))
+		channel->state = CH_STATE_STOPPED;
+
+	if (irb->scsw.fctl & (SCSW_FCTL_HALT_FUNC))
+		channel->state = CH_STATE_HALTED;
+
+	/*let's wake up immediately on data channel*/
+	if ((channel == &card->data) && (intparm != 0))
+		goto out;
+
+	if (intparm == QETH_CLEAR_CHANNEL_PARM) {
+		QETH_DBF_TEXT(trace, 6, "clrchpar");
+		/* we don't have to handle this further */
+		intparm = 0;
+	}
+	if (intparm == QETH_HALT_CHANNEL_PARM) {
+		QETH_DBF_TEXT(trace, 6, "hltchpar");
+		/* we don't have to handle this further */
+		intparm = 0;
+	}
+	if ((dstat & DEV_STAT_UNIT_EXCEP) ||
+	    (dstat & DEV_STAT_UNIT_CHECK) ||
+	    (cstat)) {
+		if (irb->esw.esw0.erw.cons) {
+			/* TODO: we should make this s390dbf */
+			PRINT_WARN("sense data available on channel %s.\n",
+				   CHANNEL_ID(channel));
+			PRINT_WARN(" cstat 0x%X\n dstat 0x%X\n", cstat, dstat);
+			HEXDUMP16(WARN,"irb: ",irb);
+			HEXDUMP16(WARN,"sense data: ",irb->ecw);
+		}
+		rc = qeth_get_problem(cdev,irb);
+		if (rc) {
+			qeth_schedule_recovery(card);
+			goto out;
+		}
+	}
+
+	if (intparm) {
+		buffer = (struct qeth_cmd_buffer *) __va((addr_t)intparm);
+		buffer->state = BUF_STATE_PROCESSED;
+	}
+	if (channel == &card->data)
+		return;
+
+	if (channel == &card->read &&
+	    channel->state == CH_STATE_UP)
+		qeth_issue_next_read(card);
+
+	tasklet_schedule(&channel->irq_tasklet);
+	return;
+out:
+	wake_up(&card->wait_q);
+}
+
+/**
+ * tasklet function scheduled from irq handler
+ */
+static void
+qeth_irq_tasklet(unsigned long data)
+{
+	struct qeth_card *card;
+	struct qeth_channel *channel;
+	struct qeth_cmd_buffer *iob;
+	__u8 index;
+
+	QETH_DBF_TEXT(trace,5,"irqtlet");
+	channel = (struct qeth_channel *) data;
+	iob = channel->iob;
+	index = channel->buf_no;
+	card = CARD_FROM_CDEV(channel->ccwdev);
+	while (iob[index].state == BUF_STATE_PROCESSED) {
+		if (iob[index].callback !=NULL) {
+			iob[index].callback(channel,iob + index);
+		}
+		index = (index + 1) % QETH_CMD_BUFFER_NO;
+	}
+	channel->buf_no = index;
+	wake_up(&card->wait_q);
+}
+
+static int qeth_stop_card(struct qeth_card *);
+
+static int
+qeth_set_offline(struct ccwgroup_device *cgdev)
+{
+	struct qeth_card *card = (struct qeth_card *) cgdev->dev.driver_data;
+	enum qeth_card_states recover_flag;
+
+	QETH_DBF_TEXT(setup, 3, "setoffl");
+	QETH_DBF_HEX(setup, 3, &card, sizeof(void *));
+
+	recover_flag = card->state;
+	if (qeth_stop_card(card) == -ERESTARTSYS){
+		PRINT_WARN("Stopping card %s interrupted by user!\n",
+			   CARD_BUS_ID(card));
+		return -ERESTARTSYS;
+	}
+	ccw_device_set_offline(CARD_DDEV(card));
+	ccw_device_set_offline(CARD_WDEV(card));
+	ccw_device_set_offline(CARD_RDEV(card));
+	if ((recover_flag == CARD_STATE_UP_LAN_ONLINE) ||
+	    (recover_flag == CARD_STATE_UP_LAN_OFFLINE))
+		card->state = CARD_STATE_RECOVER;
+	return 0;
+}
+
+static void
+qeth_remove_device(struct ccwgroup_device *cgdev)
+{
+	struct qeth_card *card = (struct qeth_card *) cgdev->dev.driver_data;
+	unsigned long flags;
+
+	QETH_DBF_TEXT(setup, 3, "rmdev");
+	QETH_DBF_HEX(setup, 3, &card, sizeof(void *));
+
+	if (!card)
+		return;
+
+	if (cgdev->state == CCWGROUP_ONLINE){
+		card->use_hard_stop = 1;
+		qeth_set_offline(cgdev);
+	}
+	if (card->info.type == QETH_CARD_TYPE_IQD)
+		atomic_dec(&qeth_hsi_count);
+	/* remove form our internal list */
+	write_lock_irqsave(&qeth_card_list.rwlock, flags);
+	list_del(&card->list);
+	write_unlock_irqrestore(&qeth_card_list.rwlock, flags);
+	unregister_netdev(card->dev);
+	qeth_free_card(card);
+	cgdev->dev.driver_data = NULL;
+	put_device(&cgdev->dev);
+}
+
+static int
+qeth_register_addr_entry(struct qeth_card *, struct qeth_ipaddr *);
+static int
+qeth_deregister_addr_entry(struct qeth_card *, struct qeth_ipaddr *);
+
+/**
+ * Add/remove address to/from card's ip list, i.e. try to add or remove
+ * reference to/from an IP address that is already registered on the card.
+ * Returns:
+ * 	0  address was on card and its reference count has been adjusted,
+ * 	   but is still > 0, so nothing has to be done
+ * 	   also returns 0 if card was not on card and the todo was to delete
+ * 	   the address -> there is also nothing to be done
+ * 	1  address was not on card and the todo is to add it to the card's ip
+ * 	   list
+ * 	-1 address was on card and its reference count has been decremented
+ * 	   to <= 0 by the todo -> address must be removed from card
+ */
+static int
+__qeth_ref_ip_on_card(struct qeth_card *card, struct qeth_ipaddr *todo,
+		      struct qeth_ipaddr **__addr)
+{
+	struct qeth_ipaddr *addr;
+	int found = 0;
+
+	list_for_each_entry(addr, &card->ip_list, entry) {
+		if ((addr->proto     == QETH_PROT_IPV4)  &&
+		    (todo->proto     == QETH_PROT_IPV4)  &&
+		    (addr->type      == todo->type)      &&
+		    (addr->u.a4.addr == todo->u.a4.addr) &&
+		    (addr->u.a4.mask == todo->u.a4.mask)   ){
+			found = 1;
+			break;
+		}
+		if ((addr->proto       == QETH_PROT_IPV6)     &&
+		    (todo->proto       == QETH_PROT_IPV6)     &&
+		    (addr->type        == todo->type)         &&
+		    (addr->u.a6.pfxlen == todo->u.a6.pfxlen)  &&
+		    (memcmp(&addr->u.a6.addr, &todo->u.a6.addr,
+			    sizeof(struct in6_addr)) == 0))     {
+			found = 1;
+			break;
+		}
+	}
+	if (found){
+		addr->users += todo->users;
+		if (addr->users <= 0){
+			*__addr = addr;
+			return -1;
+		} else {
+			/* for VIPA and RXIP limit refcount to 1 */
+			if (addr->type != QETH_IP_TYPE_NORMAL)
+				addr->users = 1;
+			return 0;
+		}
+	}
+	if (todo->users > 0){
+		/* for VIPA and RXIP limit refcount to 1 */
+		if (todo->type != QETH_IP_TYPE_NORMAL)
+			addr->users = 1;
+		return 1;
+	} else
+		return 0;
+}
+
+static inline int
+__qeth_address_exists_in_list(struct list_head *list, struct qeth_ipaddr *addr,
+		              int same_type)
+{
+	struct qeth_ipaddr *tmp;
+
+	list_for_each_entry(tmp, list, entry) {
+		if ((tmp->proto     == QETH_PROT_IPV4)            &&
+		    (addr->proto    == QETH_PROT_IPV4)            &&
+		    ((same_type && (tmp->type == addr->type)) ||
+		     (!same_type && (tmp->type != addr->type))  ) &&
+		    (tmp->u.a4.addr == addr->u.a4.addr)             ){
+			return 1;
+		}
+		if ((tmp->proto  == QETH_PROT_IPV6)               &&
+		    (addr->proto == QETH_PROT_IPV6)               &&
+		    ((same_type && (tmp->type == addr->type)) ||
+		     (!same_type && (tmp->type != addr->type))  ) &&
+		    (memcmp(&tmp->u.a6.addr, &addr->u.a6.addr,
+			    sizeof(struct in6_addr)) == 0)          ) {
+			return 1;
+		}
+	}
+	return 0;
+}
+
+/*
+ * Add IP to be added to todo list. If there is already an "add todo"
+ * in this list we just incremenent the reference count.
+ * Returns 0 if we  just incremented reference count.
+ */
+static int
+__qeth_insert_ip_todo(struct qeth_card *card, struct qeth_ipaddr *addr, int add)
+{
+	struct qeth_ipaddr *tmp, *t;
+	int found = 0;
+
+	list_for_each_entry_safe(tmp, t, &card->ip_tbd_list, entry) {
+		if ((tmp->proto        == QETH_PROT_IPV4)     &&
+		    (addr->proto       == QETH_PROT_IPV4)     &&
+		    (tmp->type         == addr->type)         &&
+		    (tmp->is_multicast == addr->is_multicast) &&
+		    (tmp->u.a4.addr    == addr->u.a4.addr)    &&
+		    (tmp->u.a4.mask    == addr->u.a4.mask)      ){
+			found = 1;
+			break;
+		}
+		if ((tmp->proto        == QETH_PROT_IPV6)      &&
+		    (addr->proto       == QETH_PROT_IPV6)      &&
+		    (tmp->type         == addr->type)          &&
+		    (tmp->is_multicast == addr->is_multicast)  &&
+		    (tmp->u.a6.pfxlen  == addr->u.a6.pfxlen)   &&
+		    (memcmp(&tmp->u.a6.addr, &addr->u.a6.addr,
+			    sizeof(struct in6_addr)) == 0)        ){
+			found = 1;
+			break;
+		}
+	}
+	if (found){
+		if (addr->users != 0)
+			tmp->users += addr->users;
+		else
+			tmp->users += add? 1:-1;
+		if (tmp->users == 0){
+			list_del(&tmp->entry);
+			kfree(tmp);
+		}
+		return 0;
+	} else {
+		if (addr->users == 0)
+			addr->users += add? 1:-1;
+		if (add && (addr->type == QETH_IP_TYPE_NORMAL) &&
+		    qeth_is_addr_covered_by_ipato(card, addr)){
+			QETH_DBF_TEXT(trace, 2, "tkovaddr");
+			addr->set_flags |= QETH_IPA_SETIP_TAKEOVER_FLAG;
+		}
+		list_add_tail(&addr->entry, &card->ip_tbd_list);
+		return 1;
+	}
+}
+
+/**
+ * Remove IP address from list
+ */
+static int
+qeth_delete_ip(struct qeth_card *card, struct qeth_ipaddr *addr)
+{
+	unsigned long flags;
+	int rc = 0;
+
+	QETH_DBF_TEXT(trace,4,"delip");
+	if (addr->proto == QETH_PROT_IPV4)
+		QETH_DBF_HEX(trace,4,&addr->u.a4.addr,4);
+	else {
+		QETH_DBF_HEX(trace,4,&addr->u.a6.addr,4);
+		QETH_DBF_HEX(trace,4,((char *)&addr->u.a6.addr)+4,4);
+	}
+	spin_lock_irqsave(&card->ip_lock, flags);
+	rc = __qeth_insert_ip_todo(card, addr, 0);
+	spin_unlock_irqrestore(&card->ip_lock, flags);
+	return rc;
+}
+
+static int
+qeth_add_ip(struct qeth_card *card, struct qeth_ipaddr *addr)
+{
+	unsigned long flags;
+	int rc = 0;
+
+	QETH_DBF_TEXT(trace,4,"addip");
+	if (addr->proto == QETH_PROT_IPV4)
+		QETH_DBF_HEX(trace,4,&addr->u.a4.addr,4);
+	else {
+		QETH_DBF_HEX(trace,4,&addr->u.a6.addr,4);
+		QETH_DBF_HEX(trace,4,((char *)&addr->u.a6.addr)+4,4);
+	}
+	spin_lock_irqsave(&card->ip_lock, flags);
+	rc = __qeth_insert_ip_todo(card, addr, 1);
+	spin_unlock_irqrestore(&card->ip_lock, flags);
+	return rc;
+}
+
+static void
+qeth_reinsert_todos(struct qeth_card *card, struct list_head *todos)
+{
+	struct qeth_ipaddr *todo, *tmp;
+
+	list_for_each_entry_safe(todo, tmp, todos, entry){
+		list_del_init(&todo->entry);
+		if (todo->users < 0) {
+			if (!qeth_delete_ip(card, todo))
+				kfree(todo);
+		} else {
+			if (!qeth_add_ip(card, todo))
+				kfree(todo);
+		}
+	}
+}
+
+static void
+qeth_set_ip_addr_list(struct qeth_card *card)
+{
+	struct list_head failed_todos;
+	struct qeth_ipaddr *todo, *addr, *tmp;
+	unsigned long flags;
+	int rc;
+
+	QETH_DBF_TEXT(trace, 2, "sdiplist");
+	QETH_DBF_HEX(trace, 2, &card, sizeof(void *));
+
+	INIT_LIST_HEAD(&failed_todos);
+
+process_todos:
+	spin_lock_irqsave(&card->ip_lock, flags);
+	list_for_each_entry_safe(todo, tmp, &card->ip_tbd_list, entry) {
+		list_del_init(&todo->entry);
+		rc = __qeth_ref_ip_on_card(card, todo, &addr);
+		if (rc == 0) {
+			/* nothing to be done; only adjusted refcount */
+			kfree(todo);
+		} else if (rc == 1) {
+			/* new entry to be added to on-card list */
+			spin_unlock_irqrestore(&card->ip_lock, flags);
+			rc = qeth_register_addr_entry(card, todo);
+			if (!rc){
+				spin_lock_irqsave(&card->ip_lock, flags);
+				list_add_tail(&todo->entry, &card->ip_list);
+				spin_unlock_irqrestore(&card->ip_lock, flags);
+			} else
+				list_add_tail(&todo->entry, &failed_todos);
+			goto process_todos;
+		} else if (rc == -1) {
+			/* on-card entry to be removed */
+			list_del_init(&addr->entry);
+			spin_unlock_irqrestore(&card->ip_lock, flags);
+			rc = qeth_deregister_addr_entry(card, addr);
+			if (!rc) {
+				kfree(addr);
+				kfree(todo);
+			} else {
+				spin_lock_irqsave(&card->ip_lock, flags);
+				list_add_tail(&addr->entry, &card->ip_list);
+				list_add_tail(&todo->entry, &failed_todos);
+				spin_unlock_irqrestore(&card->ip_lock, flags);
+			}
+			goto process_todos;
+		}
+	}
+	spin_unlock_irqrestore(&card->ip_lock, flags);
+	qeth_reinsert_todos(card, &failed_todos);
+}
+
+static void qeth_delete_mc_addresses(struct qeth_card *);
+static void qeth_add_multicast_ipv4(struct qeth_card *);
+#ifdef CONFIG_QETH_IPV6
+static void qeth_add_multicast_ipv6(struct qeth_card *);
+#endif
+
+static void
+qeth_set_thread_start_bit(struct qeth_card *card, unsigned long thread)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&card->thread_mask_lock, flags);
+	card->thread_start_mask |= thread;
+	spin_unlock_irqrestore(&card->thread_mask_lock, flags);
+}
+
+static void
+qeth_clear_thread_start_bit(struct qeth_card *card, unsigned long thread)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&card->thread_mask_lock, flags);
+	card->thread_start_mask &= ~thread;
+	spin_unlock_irqrestore(&card->thread_mask_lock, flags);
+	wake_up(&card->wait_q);
+}
+
+static void
+qeth_clear_thread_running_bit(struct qeth_card *card, unsigned long thread)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&card->thread_mask_lock, flags);
+	card->thread_running_mask &= ~thread;
+	spin_unlock_irqrestore(&card->thread_mask_lock, flags);
+	wake_up(&card->wait_q);
+}
+
+static inline int
+__qeth_do_run_thread(struct qeth_card *card, unsigned long thread)
+{
+	unsigned long flags;
+	int rc = 0;
+
+	spin_lock_irqsave(&card->thread_mask_lock, flags);
+	if (card->thread_start_mask & thread){
+		if ((card->thread_allowed_mask & thread) &&
+		    !(card->thread_running_mask & thread)){
+			rc = 1;
+			card->thread_start_mask &= ~thread;
+			card->thread_running_mask |= thread;
+		} else
+			rc = -EPERM;
+	}
+	spin_unlock_irqrestore(&card->thread_mask_lock, flags);
+	return rc;
+}
+
+static int
+qeth_do_run_thread(struct qeth_card *card, unsigned long thread)
+{
+	int rc = 0;
+
+	wait_event(card->wait_q,
+		   (rc = __qeth_do_run_thread(card, thread)) >= 0);
+	return rc;
+}
+
+static int
+qeth_register_mc_addresses(void *ptr)
+{
+	struct qeth_card *card;
+
+	card = (struct qeth_card *) ptr;
+	daemonize("getmcaddr");
+	QETH_DBF_TEXT(trace,4,"regmcth1");
+	if (!qeth_do_run_thread(card, QETH_SET_MC_THREAD))
+		return 0;
+	QETH_DBF_TEXT(trace,4,"regmcth2");
+	qeth_delete_mc_addresses(card);
+	qeth_add_multicast_ipv4(card);
+#ifdef CONFIG_QETH_IPV6
+	qeth_add_multicast_ipv6(card);
+#endif
+	qeth_set_ip_addr_list(card);
+	qeth_clear_thread_running_bit(card, QETH_SET_MC_THREAD);
+	return 0;
+}
+
+static int
+qeth_register_ip_address(void *ptr)
+{
+	struct qeth_card *card;
+
+	card = (struct qeth_card *) ptr;
+	daemonize("regip");
+	QETH_DBF_TEXT(trace,4,"regipth1");
+	if (!qeth_do_run_thread(card, QETH_SET_IP_THREAD))
+		return 0;
+	QETH_DBF_TEXT(trace,4,"regipth2");
+	qeth_set_ip_addr_list(card);
+	qeth_clear_thread_running_bit(card, QETH_SET_IP_THREAD);
+	return 0;
+}
+
+static int
+qeth_recover(void *ptr)
+{
+	struct qeth_card *card;
+	int rc = 0;
+
+	card = (struct qeth_card *) ptr;
+	daemonize("recover");
+	QETH_DBF_TEXT(trace,2,"recover1");
+	QETH_DBF_HEX(trace, 2, &card, sizeof(void *));
+	if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD))
+		return 0;
+	QETH_DBF_TEXT(trace,2,"recover2");
+	PRINT_WARN("Recovery of device %s started ...\n",
+		   CARD_BUS_ID(card));
+	card->use_hard_stop = 1;
+	qeth_set_offline(card->gdev);
+	rc = qeth_set_online(card->gdev);
+	if (!rc)
+		PRINT_INFO("Device %s successfully recovered!\n",
+			   CARD_BUS_ID(card));
+	else
+		PRINT_INFO("Device %s could not be recovered!\n",
+			   CARD_BUS_ID(card));
+	/* don't run another scheduled recovery */
+	qeth_clear_thread_start_bit(card, QETH_RECOVER_THREAD);
+	qeth_clear_thread_running_bit(card, QETH_RECOVER_THREAD);
+	return 0;
+}
+
+void
+qeth_schedule_recovery(struct qeth_card *card)
+{
+	QETH_DBF_TEXT(trace,2,"startrec");
+
+	qeth_set_thread_start_bit(card, QETH_RECOVER_THREAD);
+	schedule_work(&card->kernel_thread_starter);
+}
+
+static int
+qeth_do_start_thread(struct qeth_card *card, unsigned long thread)
+{
+	unsigned long flags;
+	int rc = 0;
+
+	spin_lock_irqsave(&card->thread_mask_lock, flags);
+	QETH_DBF_TEXT_(trace, 4, "  %02x%02x%02x",
+			(u8) card->thread_start_mask,
+			(u8) card->thread_allowed_mask,
+			(u8) card->thread_running_mask);
+	rc = (card->thread_start_mask & thread);
+	spin_unlock_irqrestore(&card->thread_mask_lock, flags);
+	return rc;
+}
+
+static void
+qeth_start_kernel_thread(struct qeth_card *card)
+{
+	QETH_DBF_TEXT(trace , 2, "strthrd");
+
+	if (card->read.state != CH_STATE_UP &&
+	    card->write.state != CH_STATE_UP)
+		return;
+
+	if (qeth_do_start_thread(card, QETH_SET_IP_THREAD))
+		kernel_thread(qeth_register_ip_address, (void *) card, SIGCHLD);
+	if (qeth_do_start_thread(card, QETH_SET_MC_THREAD))
+		kernel_thread(qeth_register_mc_addresses, (void *)card,SIGCHLD);
+	if (qeth_do_start_thread(card, QETH_RECOVER_THREAD))
+		kernel_thread(qeth_recover, (void *) card, SIGCHLD);
+}
+
+
+static void
+qeth_set_intial_options(struct qeth_card *card)
+{
+	card->options.route4.type = NO_ROUTER;
+#ifdef CONFIG_QETH_IPV6
+	card->options.route6.type = NO_ROUTER;
+#endif /* QETH_IPV6 */
+	card->options.checksum_type = QETH_CHECKSUM_DEFAULT;
+	card->options.broadcast_mode = QETH_TR_BROADCAST_ALLRINGS;
+	card->options.macaddr_mode = QETH_TR_MACADDR_NONCANONICAL;
+	card->options.enable_takeover = 1;
+	card->options.fake_broadcast = 0;
+	card->options.add_hhlen = DEFAULT_ADD_HHLEN;
+	card->options.fake_ll = 0;
+}
+
+/**
+ * initialize channels ,card and all state machines
+ */
+static int
+qeth_setup_card(struct qeth_card *card)
+{
+
+	QETH_DBF_TEXT(setup, 2, "setupcrd");
+	QETH_DBF_HEX(setup, 2, &card, sizeof(void *));
+
+	card->read.state  = CH_STATE_DOWN;
+	card->write.state = CH_STATE_DOWN;
+	card->data.state  = CH_STATE_DOWN;
+	card->state = CARD_STATE_DOWN;
+	card->lan_online = 0;
+	card->use_hard_stop = 0;
+	card->dev = NULL;
+#ifdef CONFIG_QETH_VLAN
+	spin_lock_init(&card->vlanlock);
+	card->vlangrp = NULL;
+#endif
+	spin_lock_init(&card->ip_lock);
+	spin_lock_init(&card->thread_mask_lock);
+	card->thread_start_mask = 0;
+	card->thread_allowed_mask = 0;
+	card->thread_running_mask = 0;
+	INIT_WORK(&card->kernel_thread_starter,
+		  (void *)qeth_start_kernel_thread,card);
+	INIT_LIST_HEAD(&card->ip_list);
+	INIT_LIST_HEAD(&card->ip_tbd_list);
+	INIT_LIST_HEAD(&card->cmd_waiter_list);
+	init_waitqueue_head(&card->wait_q);
+	/* intial options */
+	qeth_set_intial_options(card);
+	/* IP address takeover */
+	INIT_LIST_HEAD(&card->ipato.entries);
+	card->ipato.enabled = 0;
+	card->ipato.invert4 = 0;
+	card->ipato.invert6 = 0;
+	/* init QDIO stuff */
+	qeth_init_qdio_info(card);
+	return 0;
+}
+
+static int
+qeth_determine_card_type(struct qeth_card *card)
+{
+	int i = 0;
+
+	QETH_DBF_TEXT(setup, 2, "detcdtyp");
+
+	while (known_devices[i][4]) {
+		if ((CARD_RDEV(card)->id.dev_type == known_devices[i][2]) &&
+		    (CARD_RDEV(card)->id.dev_model == known_devices[i][3])) {
+			card->info.type = known_devices[i][4];
+			if (card->options.enable_takeover)
+				card->info.func_level = known_devices[i][6];
+			else
+				card->info.func_level = known_devices[i][7];
+			card->qdio.no_out_queues = known_devices[i][8];
+			card->info.is_multicast_different = known_devices[i][9];
+			return 0;
+		}
+		i++;
+	}
+	card->info.type = QETH_CARD_TYPE_UNKNOWN;
+	PRINT_ERR("unknown card type on device %s\n", CARD_BUS_ID(card));
+	return -ENOENT;
+}
+
+static int
+qeth_probe_device(struct ccwgroup_device *gdev)
+{
+	struct qeth_card *card;
+	struct device *dev;
+	unsigned long flags;
+	int rc;
+
+	QETH_DBF_TEXT(setup, 2, "probedev");
+
+	dev = &gdev->dev;
+	if (!get_device(dev))
+		return -ENODEV;
+
+	card = qeth_alloc_card();
+	if (!card) {
+		put_device(dev);
+		QETH_DBF_TEXT_(setup, 2, "1err%d", -ENOMEM);
+		return -ENOMEM;
+	}
+	if ((rc = qeth_setup_card(card))){
+		QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
+		put_device(dev);
+		qeth_free_card(card);
+		return rc;
+	}
+	gdev->dev.driver_data = card;
+	card->gdev = gdev;
+	gdev->cdev[0]->handler = qeth_irq;
+	gdev->cdev[1]->handler = qeth_irq;
+	gdev->cdev[2]->handler = qeth_irq;
+
+	rc = qeth_create_device_attributes(dev);
+	if (rc) {
+		put_device(dev);
+		qeth_free_card(card);
+		return rc;
+	}
+	card->read.ccwdev  = gdev->cdev[0];
+	card->write.ccwdev = gdev->cdev[1];
+	card->data.ccwdev  = gdev->cdev[2];
+	if ((rc = qeth_determine_card_type(card))){
+		PRINT_WARN("%s: not a valid card type\n", __func__);
+		QETH_DBF_TEXT_(setup, 2, "3err%d", rc);
+		put_device(dev);
+		qeth_free_card(card);
+		return rc;
+	}
+	/* insert into our internal list */
+	write_lock_irqsave(&qeth_card_list.rwlock, flags);
+	list_add_tail(&card->list, &qeth_card_list.list);
+	write_unlock_irqrestore(&qeth_card_list.rwlock, flags);
+	return rc;
+}
+
+
+static int
+qeth_get_unitaddr(struct qeth_card *card)
+{
+ 	int length;
+	char *prcd;
+	int rc;
+
+	QETH_DBF_TEXT(setup, 2, "getunit");
+	rc = read_conf_data(CARD_DDEV(card), (void **) &prcd, &length);
+	if (rc) {
+		PRINT_ERR("read_conf_data for device %s returned %i\n",
+			  CARD_DDEV_ID(card), rc);
+		return rc;
+	}
+	card->info.chpid = prcd[30];
+	card->info.unit_addr2 = prcd[31];
+	card->info.cula = prcd[63];
+	card->info.guestlan = ((prcd[0x10] == _ascebc['V']) &&
+			       (prcd[0x11] == _ascebc['M']));
+	return 0;
+}
+
+static void
+qeth_init_tokens(struct qeth_card *card)
+{
+	card->token.issuer_rm_w = 0x00010103UL;
+	card->token.cm_filter_w = 0x00010108UL;
+	card->token.cm_connection_w = 0x0001010aUL;
+	card->token.ulp_filter_w = 0x0001010bUL;
+	card->token.ulp_connection_w = 0x0001010dUL;
+}
+
+static inline __u16
+raw_devno_from_bus_id(char *id)
+{
+        id += (strlen(id) - 4);
+        return (__u16) simple_strtoul(id, &id, 16);
+}
+/**
+ * setup channel
+ */
+static void
+qeth_setup_ccw(struct qeth_channel *channel,unsigned char *iob, __u32 len)
+{
+	struct qeth_card *card;
+
+	QETH_DBF_TEXT(trace, 4, "setupccw");
+	card = CARD_FROM_CDEV(channel->ccwdev);
+	if (channel == &card->read)
+		memcpy(&channel->ccw, READ_CCW, sizeof(struct ccw1));
+	else
+		memcpy(&channel->ccw, WRITE_CCW, sizeof(struct ccw1));
+	channel->ccw.count = len;
+	channel->ccw.cda = (__u32) __pa(iob);
+}
+
+/**
+ * get free buffer for ccws (IDX activation, lancmds,ipassists...)
+ */
+static struct qeth_cmd_buffer *
+__qeth_get_buffer(struct qeth_channel *channel)
+{
+	__u8 index;
+
+	QETH_DBF_TEXT(trace, 6, "getbuff");
+	index = channel->io_buf_no;
+	do {
+		if (channel->iob[index].state == BUF_STATE_FREE) {
+			channel->iob[index].state = BUF_STATE_LOCKED;
+			channel->io_buf_no = (channel->io_buf_no + 1) %
+				QETH_CMD_BUFFER_NO;
+			memset(channel->iob[index].data, 0, QETH_BUFSIZE);
+			return channel->iob + index;
+		}
+		index = (index + 1) % QETH_CMD_BUFFER_NO;
+	} while(index != channel->io_buf_no);
+
+	return NULL;
+}
+
+/**
+ * release command buffer
+ */
+static void
+qeth_release_buffer(struct qeth_channel *channel, struct qeth_cmd_buffer *iob)
+{
+	unsigned long flags;
+
+	QETH_DBF_TEXT(trace, 6, "relbuff");
+	spin_lock_irqsave(&channel->iob_lock, flags);
+	memset(iob->data, 0, QETH_BUFSIZE);
+	iob->state = BUF_STATE_FREE;
+	iob->callback = qeth_send_control_data_cb;
+	iob->rc = 0;
+	spin_unlock_irqrestore(&channel->iob_lock, flags);
+}
+
+static struct qeth_cmd_buffer *
+qeth_get_buffer(struct qeth_channel *channel)
+{
+	struct qeth_cmd_buffer *buffer = NULL;
+	unsigned long flags;
+
+	spin_lock_irqsave(&channel->iob_lock, flags);
+	buffer = __qeth_get_buffer(channel);
+	spin_unlock_irqrestore(&channel->iob_lock, flags);
+	return buffer;
+}
+
+static struct qeth_cmd_buffer *
+qeth_wait_for_buffer(struct qeth_channel *channel)
+{
+	struct qeth_cmd_buffer *buffer;
+	wait_event(channel->wait_q,
+		   ((buffer = qeth_get_buffer(channel)) != NULL));
+	return buffer;
+}
+
+static void
+qeth_clear_cmd_buffers(struct qeth_channel *channel)
+{
+	int cnt = 0;
+
+	for (cnt=0; cnt < QETH_CMD_BUFFER_NO; cnt++)
+		qeth_release_buffer(channel,&channel->iob[cnt]);
+	channel->buf_no = 0;
+	channel->io_buf_no = 0;
+}
+
+/**
+ * start IDX for read and write channel
+ */
+static int
+qeth_idx_activate_get_answer(struct qeth_channel *channel,
+			      void (*idx_reply_cb)(struct qeth_channel *,
+						   struct qeth_cmd_buffer *))
+{
+	struct qeth_cmd_buffer *iob;
+	unsigned long flags;
+	int rc;
+	struct qeth_card *card;
+
+	QETH_DBF_TEXT(setup, 2, "idxanswr");
+	card = CARD_FROM_CDEV(channel->ccwdev);
+	iob = qeth_get_buffer(channel);
+	iob->callback = idx_reply_cb;
+	memcpy(&channel->ccw, READ_CCW, sizeof(struct ccw1));
+	channel->ccw.count = QETH_BUFSIZE;
+	channel->ccw.cda = (__u32) __pa(iob->data);
+
+	wait_event(card->wait_q,
+		   atomic_compare_and_swap(0,1,&channel->irq_pending) == 0);
+	QETH_DBF_TEXT(setup, 6, "noirqpnd");
+	spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
+	rc = ccw_device_start(channel->ccwdev,
+			      &channel->ccw,(addr_t) iob, 0, 0);
+	spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
+
+	if (rc) {
+		PRINT_ERR("qeth: Error2 in activating channel rc=%d\n",rc);
+		QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
+		atomic_set(&channel->irq_pending, 0);
+		wake_up(&card->wait_q);
+		return rc;
+	}
+	rc = wait_event_interruptible_timeout(card->wait_q,
+			 channel->state == CH_STATE_UP, QETH_TIMEOUT);
+	if (rc == -ERESTARTSYS)
+		return rc;
+	if (channel->state != CH_STATE_UP){
+		rc = -ETIME;
+		QETH_DBF_TEXT_(setup, 2, "3err%d", rc);
+	} else
+		rc = 0;
+	return rc;
+}
+
+static int
+qeth_idx_activate_channel(struct qeth_channel *channel,
+			   void (*idx_reply_cb)(struct qeth_channel *,
+						struct qeth_cmd_buffer *))
+{
+	struct qeth_card *card;
+	struct qeth_cmd_buffer *iob;
+	unsigned long flags;
+	__u16 temp;
+	int rc;
+
+	card = CARD_FROM_CDEV(channel->ccwdev);
+
+	QETH_DBF_TEXT(setup, 2, "idxactch");
+
+	iob = qeth_get_buffer(channel);
+	iob->callback = idx_reply_cb;
+	memcpy(&channel->ccw, WRITE_CCW, sizeof(struct ccw1));
+	channel->ccw.count = IDX_ACTIVATE_SIZE;
+	channel->ccw.cda = (__u32) __pa(iob->data);
+	if (channel == &card->write) {
+		memcpy(iob->data, IDX_ACTIVATE_WRITE, IDX_ACTIVATE_SIZE);
+		memcpy(QETH_TRANSPORT_HEADER_SEQ_NO(iob->data),
+		       &card->seqno.trans_hdr, QETH_SEQ_NO_LENGTH);
+		card->seqno.trans_hdr++;
+	} else {
+		memcpy(iob->data, IDX_ACTIVATE_READ, IDX_ACTIVATE_SIZE);
+		memcpy(QETH_TRANSPORT_HEADER_SEQ_NO(iob->data),
+		       &card->seqno.trans_hdr, QETH_SEQ_NO_LENGTH);
+	}
+	memcpy(QETH_IDX_ACT_ISSUER_RM_TOKEN(iob->data),
+	       &card->token.issuer_rm_w,QETH_MPC_TOKEN_LENGTH);
+	memcpy(QETH_IDX_ACT_FUNC_LEVEL(iob->data),
+	       &card->info.func_level,sizeof(__u16));
+	temp = raw_devno_from_bus_id(CARD_DDEV_ID(card));
+	memcpy(QETH_IDX_ACT_QDIO_DEV_CUA(iob->data), &temp, 2);
+	temp = (card->info.cula << 8) + card->info.unit_addr2;
+	memcpy(QETH_IDX_ACT_QDIO_DEV_REALADDR(iob->data), &temp, 2);
+
+	wait_event(card->wait_q,
+		   atomic_compare_and_swap(0,1,&channel->irq_pending) == 0);
+	QETH_DBF_TEXT(setup, 6, "noirqpnd");
+	spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
+	rc = ccw_device_start(channel->ccwdev,
+			      &channel->ccw,(addr_t) iob, 0, 0);
+	spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
+
+	if (rc) {
+		PRINT_ERR("qeth: Error1 in activating channel. rc=%d\n",rc);
+		QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
+		atomic_set(&channel->irq_pending, 0);
+		wake_up(&card->wait_q);
+		return rc;
+	}
+	rc = wait_event_interruptible_timeout(card->wait_q,
+			channel->state == CH_STATE_ACTIVATING, QETH_TIMEOUT);
+	if (rc == -ERESTARTSYS)
+		return rc;
+	if (channel->state != CH_STATE_ACTIVATING) {
+		PRINT_WARN("qeth: IDX activate timed out!\n");
+		QETH_DBF_TEXT_(setup, 2, "2err%d", -ETIME);
+		return -ETIME;
+	}
+	return qeth_idx_activate_get_answer(channel,idx_reply_cb);
+}
+
+static int
+qeth_peer_func_level(int level)
+{
+	if ((level & 0xff) == 8)
+		return (level & 0xff) + 0x400;
+	if (((level >> 8) & 3) == 1)
+		return (level & 0xff) + 0x200;
+	return level;
+}
+
+static void
+qeth_idx_write_cb(struct qeth_channel *channel, struct qeth_cmd_buffer *iob)
+{
+	struct qeth_card *card;
+	__u16 temp;
+
+	QETH_DBF_TEXT(setup ,2, "idxwrcb");
+
+	if (channel->state == CH_STATE_DOWN) {
+		channel->state = CH_STATE_ACTIVATING;
+		goto out;
+	}
+	card = CARD_FROM_CDEV(channel->ccwdev);
+
+	if (!(QETH_IS_IDX_ACT_POS_REPLY(iob->data))) {
+		PRINT_ERR("IDX_ACTIVATE on write channel device %s: negative "
+			  "reply\n", CARD_WDEV_ID(card));
+		goto out;
+	}
+	memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2);
+	if ((temp & ~0x0100) != qeth_peer_func_level(card->info.func_level)) {
+		PRINT_WARN("IDX_ACTIVATE on write channel device %s: "
+			   "function level mismatch "
+			   "(sent: 0x%x, received: 0x%x)\n",
+			   CARD_WDEV_ID(card), card->info.func_level, temp);
+		goto out;
+	}
+	channel->state = CH_STATE_UP;
+out:
+	qeth_release_buffer(channel, iob);
+}
+
+static int
+qeth_check_idx_response(unsigned char *buffer)
+{
+	if (!buffer)
+		return 0;
+
+	QETH_DBF_HEX(control, 2, buffer, QETH_DBF_CONTROL_LEN);
+	if ((buffer[2] & 0xc0) == 0xc0) {
+		PRINT_WARN("received an IDX TERMINATE "
+			   "with cause code 0x%02x%s\n",
+			   buffer[4],
+			   ((buffer[4] == 0x22) ?
+			    " -- try another portname" : ""));
+		QETH_DBF_TEXT(trace, 2, "ckidxres");
+		QETH_DBF_TEXT(trace, 2, " idxterm");
+		QETH_DBF_TEXT_(trace, 2, "  rc%d", -EIO);
+		return -EIO;
+	}
+	return 0;
+}
+
+static void
+qeth_idx_read_cb(struct qeth_channel *channel, struct qeth_cmd_buffer *iob)
+{
+	struct qeth_card *card;
+	__u16 temp;
+
+	QETH_DBF_TEXT(setup , 2, "idxrdcb");
+	if (channel->state == CH_STATE_DOWN) {
+		channel->state = CH_STATE_ACTIVATING;
+		goto out;
+	}
+
+	card = CARD_FROM_CDEV(channel->ccwdev);
+	if (qeth_check_idx_response(iob->data)) {
+			goto out;
+	}
+	if (!(QETH_IS_IDX_ACT_POS_REPLY(iob->data))) {
+		PRINT_ERR("IDX_ACTIVATE on read channel device %s: negative "
+			  "reply\n", CARD_RDEV_ID(card));
+		goto out;
+	}
+
+/**
+ * temporary fix for microcode bug
+ * to revert it,replace OR by AND
+ */
+	if ( (!QETH_IDX_NO_PORTNAME_REQUIRED(iob->data)) ||
+	     (card->info.type == QETH_CARD_TYPE_OSAE) )
+		card->info.portname_required = 1;
+
+	memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2);
+	if (temp != qeth_peer_func_level(card->info.func_level)) {
+		PRINT_WARN("IDX_ACTIVATE on read channel device %s: function "
+			   "level mismatch (sent: 0x%x, received: 0x%x)\n",
+			   CARD_RDEV_ID(card), card->info.func_level, temp);
+		goto out;
+	}
+	memcpy(&card->token.issuer_rm_r,
+	       QETH_IDX_ACT_ISSUER_RM_TOKEN(iob->data),
+	       QETH_MPC_TOKEN_LENGTH);
+	memcpy(&card->info.mcl_level[0],
+	       QETH_IDX_REPLY_LEVEL(iob->data), QETH_MCL_LENGTH);
+	channel->state = CH_STATE_UP;
+out:
+	qeth_release_buffer(channel,iob);
+}
+
+static int
+qeth_issue_next_read(struct qeth_card *card)
+{
+	int rc;
+	struct qeth_cmd_buffer *iob;
+
+	QETH_DBF_TEXT(trace,5,"issnxrd");
+	if (card->read.state != CH_STATE_UP)
+		return -EIO;
+	iob = qeth_get_buffer(&card->read);
+	if (!iob) {
+		PRINT_WARN("issue_next_read failed: no iob available!\n");
+		return -ENOMEM;
+	}
+	qeth_setup_ccw(&card->read, iob->data, QETH_BUFSIZE);
+	wait_event(card->wait_q,
+		   atomic_compare_and_swap(0,1,&card->read.irq_pending) == 0);
+	QETH_DBF_TEXT(trace, 6, "noirqpnd");
+	rc = ccw_device_start(card->read.ccwdev, &card->read.ccw,
+			      (addr_t) iob, 0, 0);
+	if (rc) {
+		PRINT_ERR("Error in starting next read ccw! rc=%i\n", rc);
+		atomic_set(&card->read.irq_pending, 0);
+		qeth_schedule_recovery(card);
+		wake_up(&card->wait_q);
+	}
+	return rc;
+}
+
+static struct qeth_reply *
+qeth_alloc_reply(struct qeth_card *card)
+{
+	struct qeth_reply *reply;
+
+	reply = kmalloc(sizeof(struct qeth_reply), GFP_KERNEL|GFP_ATOMIC);
+	if (reply){
+		memset(reply, 0, sizeof(struct qeth_reply));
+		atomic_set(&reply->refcnt, 1);
+		reply->card = card;
+	};
+	return reply;
+}
+
+static void
+qeth_get_reply(struct qeth_reply *reply)
+{
+	WARN_ON(atomic_read(&reply->refcnt) <= 0);
+	atomic_inc(&reply->refcnt);
+}
+
+static void
+qeth_put_reply(struct qeth_reply *reply)
+{
+	WARN_ON(atomic_read(&reply->refcnt) <= 0);
+	if (atomic_dec_and_test(&reply->refcnt))
+		kfree(reply);
+}
+
+static void
+qeth_cmd_timeout(unsigned long data)
+{
+	struct qeth_reply *reply, *list_reply, *r;
+	unsigned long flags;
+
+	reply = (struct qeth_reply *) data;
+	spin_lock_irqsave(&reply->card->lock, flags);
+	list_for_each_entry_safe(list_reply, r,
+				 &reply->card->cmd_waiter_list, list) {
+		if (reply == list_reply){
+			qeth_get_reply(reply);
+			list_del_init(&reply->list);
+			spin_unlock_irqrestore(&reply->card->lock, flags);
+			reply->rc = -ETIME;
+			reply->received = 1;
+			wake_up(&reply->wait_q);
+			qeth_put_reply(reply);
+			return;
+		}
+	}
+	spin_unlock_irqrestore(&reply->card->lock, flags);
+}
+
+static struct qeth_ipa_cmd *
+qeth_check_ipa_data(struct qeth_card *card, struct qeth_cmd_buffer *iob)
+{
+	struct qeth_ipa_cmd *cmd = NULL;
+	enum qeth_card_states old_state;
+
+	QETH_DBF_TEXT(trace,5,"chkipad");
+	if (IS_IPA(iob->data)){
+		cmd = (struct qeth_ipa_cmd *) PDU_ENCAPSULATION(iob->data);
+		if (IS_IPA_REPLY(cmd))
+			return cmd;
+		else {
+			switch (cmd->hdr.command) {
+			case IPA_CMD_STOPLAN:
+				PRINT_WARN("Link failure on %s (CHPID 0x%X) - "
+					   "there is a network problem or "
+					   "someone pulled the cable or "
+					   "disabled the port. Setting state "
+					   "of interface to DOWN.\n",
+					   card->info.if_name,
+					   card->info.chpid);
+				card->lan_online = 0;
+				old_state = card->state;
+				rtnl_lock();
+				dev_close(card->dev);
+				rtnl_unlock();
+				if ((old_state == CARD_STATE_UP_LAN_ONLINE) ||
+				    (old_state == CARD_STATE_UP_LAN_OFFLINE))
+					card->state = CARD_STATE_UP_LAN_OFFLINE;
+				return NULL;
+			case IPA_CMD_STARTLAN:
+				PRINT_INFO("Link reestablished on %s "
+					   "(CHPID 0x%X)\n",
+					   card->info.if_name,
+					   card->info.chpid);
+				card->lan_online = 1;
+				if (card->state == CARD_STATE_UP_LAN_OFFLINE){
+					rtnl_lock();
+					dev_open(card->dev);
+					rtnl_unlock();
+				}
+				return NULL;
+			case IPA_CMD_REGISTER_LOCAL_ADDR:
+				QETH_DBF_TEXT(trace,3, "irla");
+				break;
+			case IPA_CMD_UNREGISTER_LOCAL_ADDR:
+				PRINT_WARN("probably problem on %s: "
+					   "received IPA command 0x%X\n",
+					   card->info.if_name,
+					   cmd->hdr.command);
+				break;
+			default:
+				PRINT_WARN("Received data is IPA "
+					   "but not a reply!\n");
+				break;
+			}
+		}
+	}
+	return cmd;
+}
+
+/**
+ * wake all waiting ipa commands
+ */
+static void
+qeth_clear_ipacmd_list(struct qeth_card *card)
+{
+	struct qeth_reply *reply, *r;
+	unsigned long flags;
+
+	QETH_DBF_TEXT(trace, 4, "clipalst");
+
+	spin_lock_irqsave(&card->lock, flags);
+	list_for_each_entry_safe(reply, r, &card->cmd_waiter_list, list) {
+		qeth_get_reply(reply);
+		reply->rc = -EIO;
+		reply->received = 1;
+		list_del_init(&reply->list);
+		wake_up(&reply->wait_q);
+		qeth_put_reply(reply);
+	}
+	spin_unlock_irqrestore(&card->lock, flags);
+}
+
+static void
+qeth_send_control_data_cb(struct qeth_channel *channel,
+			  struct qeth_cmd_buffer *iob)
+{
+	struct qeth_card *card;
+	struct qeth_reply *reply, *r;
+	struct qeth_ipa_cmd *cmd;
+	unsigned long flags;
+	int keep_reply;
+
+	QETH_DBF_TEXT(trace,4,"sndctlcb");
+
+	card = CARD_FROM_CDEV(channel->ccwdev);
+	if (qeth_check_idx_response(iob->data)) {
+		qeth_clear_ipacmd_list(card);
+		qeth_schedule_recovery(card);
+		goto out;
+	}
+
+	cmd = qeth_check_ipa_data(card, iob);
+	if ((cmd == NULL) && (card->state != CARD_STATE_DOWN))
+		goto out;
+
+	spin_lock_irqsave(&card->lock, flags);
+	list_for_each_entry_safe(reply, r, &card->cmd_waiter_list, list) {
+		if ((reply->seqno == QETH_IDX_COMMAND_SEQNO) ||
+		    ((cmd) && (reply->seqno == cmd->hdr.seqno))) {
+			qeth_get_reply(reply);
+			list_del_init(&reply->list);
+			spin_unlock_irqrestore(&card->lock, flags);
+			keep_reply = 0;
+			if (reply->callback != NULL) {
+				if (cmd)
+					keep_reply = reply->callback(card,
+							reply,
+							(unsigned long)cmd);
+				else
+					keep_reply = reply->callback(card,
+							reply,
+							(unsigned long)iob);
+			}
+			if (cmd)
+				reply->rc = cmd->hdr.return_code;
+			else if (iob->rc)
+				reply->rc = iob->rc;
+			if (keep_reply) {
+				spin_lock_irqsave(&card->lock, flags);
+				list_add_tail(&reply->list,
+					      &card->cmd_waiter_list);
+				spin_unlock_irqrestore(&card->lock, flags);
+			} else {
+				reply->received = 1;
+				wake_up(&reply->wait_q);
+			}
+			qeth_put_reply(reply);
+			goto out;
+		}
+	}
+	spin_unlock_irqrestore(&card->lock, flags);
+out:
+	memcpy(&card->seqno.pdu_hdr_ack,
+		QETH_PDU_HEADER_SEQ_NO(iob->data),
+		QETH_SEQ_NO_LENGTH);
+	qeth_release_buffer(channel,iob);
+}
+
+static int
+qeth_send_control_data(struct qeth_card *card, int len,
+		       struct qeth_cmd_buffer *iob,
+		       int (*reply_cb)
+		       (struct qeth_card *, struct qeth_reply*, unsigned long),
+		       void *reply_param)
+
+{
+	int rc;
+	unsigned long flags;
+	struct qeth_reply *reply;
+	struct timer_list timer;
+
+	QETH_DBF_TEXT(trace, 2, "sendctl");
+
+	qeth_setup_ccw(&card->write,iob->data,len);
+
+	memcpy(QETH_TRANSPORT_HEADER_SEQ_NO(iob->data),
+	       &card->seqno.trans_hdr, QETH_SEQ_NO_LENGTH);
+	card->seqno.trans_hdr++;
+
+	memcpy(QETH_PDU_HEADER_SEQ_NO(iob->data),
+	       &card->seqno.pdu_hdr, QETH_SEQ_NO_LENGTH);
+	card->seqno.pdu_hdr++;
+	memcpy(QETH_PDU_HEADER_ACK_SEQ_NO(iob->data),
+	       &card->seqno.pdu_hdr_ack, QETH_SEQ_NO_LENGTH);
+	iob->callback = qeth_release_buffer;
+
+	reply = qeth_alloc_reply(card);
+	if (!reply) {
+		PRINT_WARN("Could no alloc qeth_reply!\n");
+		return -ENOMEM;
+	}
+	reply->callback = reply_cb;
+	reply->param = reply_param;
+	if (card->state == CARD_STATE_DOWN)
+		reply->seqno = QETH_IDX_COMMAND_SEQNO;
+	else
+		reply->seqno = card->seqno.ipa++;
+	init_timer(&timer);
+	timer.function = qeth_cmd_timeout;
+	timer.data = (unsigned long) reply;
+	timer.expires = jiffies + QETH_TIMEOUT;
+	init_waitqueue_head(&reply->wait_q);
+	spin_lock_irqsave(&card->lock, flags);
+	list_add_tail(&reply->list, &card->cmd_waiter_list);
+	spin_unlock_irqrestore(&card->lock, flags);
+	QETH_DBF_HEX(control, 2, iob->data, QETH_DBF_CONTROL_LEN);
+	wait_event(card->wait_q,
+		   atomic_compare_and_swap(0,1,&card->write.irq_pending) == 0);
+	QETH_DBF_TEXT(trace, 6, "noirqpnd");
+	spin_lock_irqsave(get_ccwdev_lock(card->write.ccwdev), flags);
+	rc = ccw_device_start(card->write.ccwdev, &card->write.ccw,
+			      (addr_t) iob, 0, 0);
+	spin_unlock_irqrestore(get_ccwdev_lock(card->write.ccwdev), flags);
+	if (rc){
+		PRINT_WARN("qeth_send_control_data: "
+			   "ccw_device_start rc = %i\n", rc);
+		QETH_DBF_TEXT_(trace, 2, " err%d", rc);
+		spin_lock_irqsave(&card->lock, flags);
+		list_del_init(&reply->list);
+		qeth_put_reply(reply);
+		spin_unlock_irqrestore(&card->lock, flags);
+		qeth_release_buffer(iob->channel, iob);
+		atomic_set(&card->write.irq_pending, 0);
+		wake_up(&card->wait_q);
+		return rc;
+	}
+	add_timer(&timer);
+	wait_event(reply->wait_q, reply->received);
+	del_timer(&timer);
+	rc = reply->rc;
+	qeth_put_reply(reply);
+	return rc;
+}
+
+static int
+qeth_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
+		  int (*reply_cb)
+		  (struct qeth_card *,struct qeth_reply*, unsigned long),
+		  void *reply_param)
+{
+	struct qeth_ipa_cmd *cmd;
+	int rc;
+
+	QETH_DBF_TEXT(trace,4,"sendipa");
+
+	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+	memcpy(iob->data, IPA_PDU_HEADER, IPA_PDU_HEADER_SIZE);
+	memcpy(QETH_IPA_CMD_DEST_ADDR(iob->data),
+	       &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
+
+	rc = qeth_send_control_data(card, IPA_CMD_LENGTH, iob,
+				    reply_cb, reply_param);
+	return rc;
+}
+
+
+static int
+qeth_cm_enable_cb(struct qeth_card *card, struct qeth_reply *reply,
+		  unsigned long data)
+{
+	struct qeth_cmd_buffer *iob;
+
+	QETH_DBF_TEXT(setup, 2, "cmenblcb");
+
+	iob = (struct qeth_cmd_buffer *) data;
+	memcpy(&card->token.cm_filter_r,
+	       QETH_CM_ENABLE_RESP_FILTER_TOKEN(iob->data),
+	       QETH_MPC_TOKEN_LENGTH);
+	QETH_DBF_TEXT_(setup, 2, "  rc%d", iob->rc);
+	return 0;
+}
+
+static int
+qeth_cm_enable(struct qeth_card *card)
+{
+	int rc;
+	struct qeth_cmd_buffer *iob;
+
+	QETH_DBF_TEXT(setup,2,"cmenable");
+
+	iob = qeth_wait_for_buffer(&card->write);
+	memcpy(iob->data, CM_ENABLE, CM_ENABLE_SIZE);
+	memcpy(QETH_CM_ENABLE_ISSUER_RM_TOKEN(iob->data),
+	       &card->token.issuer_rm_r, QETH_MPC_TOKEN_LENGTH);
+	memcpy(QETH_CM_ENABLE_FILTER_TOKEN(iob->data),
+	       &card->token.cm_filter_w, QETH_MPC_TOKEN_LENGTH);
+
+	rc = qeth_send_control_data(card, CM_ENABLE_SIZE, iob,
+				    qeth_cm_enable_cb, NULL);
+	return rc;
+}
+
+static int
+qeth_cm_setup_cb(struct qeth_card *card, struct qeth_reply *reply,
+		 unsigned long data)
+{
+
+	struct qeth_cmd_buffer *iob;
+
+	QETH_DBF_TEXT(setup, 2, "cmsetpcb");
+
+	iob = (struct qeth_cmd_buffer *) data;
+	memcpy(&card->token.cm_connection_r,
+	       QETH_CM_SETUP_RESP_DEST_ADDR(iob->data),
+	       QETH_MPC_TOKEN_LENGTH);
+	QETH_DBF_TEXT_(setup, 2, "  rc%d", iob->rc);
+	return 0;
+}
+
+static int
+qeth_cm_setup(struct qeth_card *card)
+{
+	int rc;
+	struct qeth_cmd_buffer *iob;
+
+	QETH_DBF_TEXT(setup,2,"cmsetup");
+
+	iob = qeth_wait_for_buffer(&card->write);
+	memcpy(iob->data, CM_SETUP, CM_SETUP_SIZE);
+	memcpy(QETH_CM_SETUP_DEST_ADDR(iob->data),
+	       &card->token.issuer_rm_r, QETH_MPC_TOKEN_LENGTH);
+	memcpy(QETH_CM_SETUP_CONNECTION_TOKEN(iob->data),
+	       &card->token.cm_connection_w, QETH_MPC_TOKEN_LENGTH);
+	memcpy(QETH_CM_SETUP_FILTER_TOKEN(iob->data),
+	       &card->token.cm_filter_r, QETH_MPC_TOKEN_LENGTH);
+	rc = qeth_send_control_data(card, CM_SETUP_SIZE, iob,
+				    qeth_cm_setup_cb, NULL);
+	return rc;
+
+}
+
+static int
+qeth_ulp_enable_cb(struct qeth_card *card, struct qeth_reply *reply,
+		   unsigned long data)
+{
+
+	__u16 mtu, framesize;
+	__u16 len;
+	__u8 link_type;
+	struct qeth_cmd_buffer *iob;
+
+	QETH_DBF_TEXT(setup, 2, "ulpenacb");
+
+	iob = (struct qeth_cmd_buffer *) data;
+	memcpy(&card->token.ulp_filter_r,
+	       QETH_ULP_ENABLE_RESP_FILTER_TOKEN(iob->data),
+	       QETH_MPC_TOKEN_LENGTH);
+	if (qeth_get_mtu_out_of_mpc(card->info.type)) {
+		memcpy(&framesize, QETH_ULP_ENABLE_RESP_MAX_MTU(iob->data), 2);
+		mtu = qeth_get_mtu_outof_framesize(framesize);
+		if (!mtu) {
+			iob->rc = -EINVAL;
+			QETH_DBF_TEXT_(setup, 2, "  rc%d", iob->rc);
+			return 0;
+		}
+		card->info.max_mtu = mtu;
+		card->info.initial_mtu = mtu;
+		card->qdio.in_buf_size = mtu + 2 * PAGE_SIZE;
+	} else {
+		card->info.initial_mtu = qeth_get_initial_mtu_for_card(card);
+		card->info.max_mtu = qeth_get_max_mtu_for_card(card->info.type);
+		card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT;
+	}
+
+	memcpy(&len, QETH_ULP_ENABLE_RESP_DIFINFO_LEN(iob->data), 2);
+	if (len >= QETH_MPC_DIFINFO_LEN_INDICATES_LINK_TYPE) {
+		memcpy(&link_type,
+		       QETH_ULP_ENABLE_RESP_LINK_TYPE(iob->data), 1);
+		card->info.link_type = link_type;
+	} else
+		card->info.link_type = 0;
+	QETH_DBF_TEXT_(setup, 2, "  rc%d", iob->rc);
+	return 0;
+}
+
+static int
+qeth_ulp_enable(struct qeth_card *card)
+{
+	int rc;
+	struct qeth_cmd_buffer *iob;
+
+	/*FIXME: trace view callbacks*/
+	QETH_DBF_TEXT(setup,2,"ulpenabl");
+
+	iob = qeth_wait_for_buffer(&card->write);
+	memcpy(iob->data, ULP_ENABLE, ULP_ENABLE_SIZE);
+
+	*(QETH_ULP_ENABLE_LINKNUM(iob->data)) =
+		(__u8) card->info.portno;
+
+	memcpy(QETH_ULP_ENABLE_DEST_ADDR(iob->data),
+	       &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
+	memcpy(QETH_ULP_ENABLE_FILTER_TOKEN(iob->data),
+	       &card->token.ulp_filter_w, QETH_MPC_TOKEN_LENGTH);
+	memcpy(QETH_ULP_ENABLE_PORTNAME_AND_LL(iob->data),
+	       card->info.portname, 9);
+	rc = qeth_send_control_data(card, ULP_ENABLE_SIZE, iob,
+				    qeth_ulp_enable_cb, NULL);
+	return rc;
+
+}
+
+static inline __u16
+__raw_devno_from_bus_id(char *id)
+{
+	id += (strlen(id) - 4);
+	return (__u16) simple_strtoul(id, &id, 16);
+}
+
+static int
+qeth_ulp_setup_cb(struct qeth_card *card, struct qeth_reply *reply,
+		  unsigned long data)
+{
+	struct qeth_cmd_buffer *iob;
+
+	QETH_DBF_TEXT(setup, 2, "ulpstpcb");
+
+	iob = (struct qeth_cmd_buffer *) data;
+	memcpy(&card->token.ulp_connection_r,
+	       QETH_ULP_SETUP_RESP_CONNECTION_TOKEN(iob->data),
+	       QETH_MPC_TOKEN_LENGTH);
+	QETH_DBF_TEXT_(setup, 2, "  rc%d", iob->rc);
+	return 0;
+}
+
+static int
+qeth_ulp_setup(struct qeth_card *card)
+{
+	int rc;
+	__u16 temp;
+	struct qeth_cmd_buffer *iob;
+
+	QETH_DBF_TEXT(setup,2,"ulpsetup");
+
+	iob = qeth_wait_for_buffer(&card->write);
+	memcpy(iob->data, ULP_SETUP, ULP_SETUP_SIZE);
+
+	memcpy(QETH_ULP_SETUP_DEST_ADDR(iob->data),
+	       &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
+	memcpy(QETH_ULP_SETUP_CONNECTION_TOKEN(iob->data),
+	       &card->token.ulp_connection_w, QETH_MPC_TOKEN_LENGTH);
+	memcpy(QETH_ULP_SETUP_FILTER_TOKEN(iob->data),
+	       &card->token.ulp_filter_r, QETH_MPC_TOKEN_LENGTH);
+
+	temp = __raw_devno_from_bus_id(CARD_DDEV_ID(card));
+	memcpy(QETH_ULP_SETUP_CUA(iob->data), &temp, 2);
+	temp = (card->info.cula << 8) + card->info.unit_addr2;
+	memcpy(QETH_ULP_SETUP_REAL_DEVADDR(iob->data), &temp, 2);
+	rc = qeth_send_control_data(card, ULP_SETUP_SIZE, iob,
+				    qeth_ulp_setup_cb, NULL);
+	return rc;
+}
+
+static inline int
+qeth_check_for_inbound_error(struct qeth_qdio_buffer *buf,
+			     unsigned int qdio_error,
+			     unsigned int siga_error)
+{
+	int rc = 0;
+
+	if (qdio_error || siga_error) {
+		QETH_DBF_TEXT(trace, 2, "qdinerr");
+		QETH_DBF_TEXT(qerr, 2, "qdinerr");
+		QETH_DBF_TEXT_(qerr, 2, " F15=%02X",
+			       buf->buffer->element[15].flags & 0xff);
+		QETH_DBF_TEXT_(qerr, 2, " F14=%02X",
+			       buf->buffer->element[14].flags & 0xff);
+		QETH_DBF_TEXT_(qerr, 2, " qerr=%X", qdio_error);
+		QETH_DBF_TEXT_(qerr, 2, " serr=%X", siga_error);
+		rc = 1;
+	}
+	return rc;
+}
+
+static void
+qeth_qdio_input_handler(struct ccw_device * ccwdev, unsigned int status,
+		        unsigned int qdio_err, unsigned int siga_err,
+			unsigned int queue, int first_element, int count,
+			unsigned long card_ptr)
+{
+	struct net_device *net_dev;
+	struct qeth_card *card;
+	struct qeth_qdio_buffer *buffer;
+	int i;
+
+	QETH_DBF_TEXT(trace, 6, "qdinput");
+	card = (struct qeth_card *) card_ptr;
+	net_dev = card->dev;
+#ifdef CONFIG_QETH_PERF_STATS
+	card->perf_stats.inbound_start_time = qeth_get_micros();
+#endif
+	if (status & QDIO_STATUS_LOOK_FOR_ERROR) {
+		if (status & QDIO_STATUS_ACTIVATE_CHECK_CONDITION){
+			QETH_DBF_TEXT(trace, 1,"qdinchk");
+			QETH_DBF_TEXT_(trace,1,"%s",CARD_BUS_ID(card));
+			QETH_DBF_TEXT_(trace,1,"%04X%04X",first_element,count);
+			QETH_DBF_TEXT_(trace,1,"%04X%04X", queue, status);
+			qeth_schedule_recovery(card);
+			return;
+		}
+	}
+	for (i = first_element; i < (first_element + count); ++i) {
+		buffer = &card->qdio.in_q->bufs[i % QDIO_MAX_BUFFERS_PER_Q];
+		if ((status == QDIO_STATUS_LOOK_FOR_ERROR) &&
+		    qeth_check_for_inbound_error(buffer, qdio_err, siga_err))
+			buffer->state = QETH_QDIO_BUF_ERROR;
+		else
+			buffer->state = QETH_QDIO_BUF_PRIMED;
+	}
+
+	tasklet_schedule(&card->qdio.in_tasklet);
+}
+
+static inline struct sk_buff *
+qeth_get_skb(unsigned int length)
+{
+	struct sk_buff* skb;
+#ifdef CONFIG_QETH_VLAN
+	if ((skb = dev_alloc_skb(length + VLAN_HLEN)))
+		skb_reserve(skb, VLAN_HLEN);
+#else
+	skb = dev_alloc_skb(length);
+#endif
+	return skb;
+}
+
+static inline struct sk_buff *
+qeth_get_next_skb(struct qeth_card *card, struct qdio_buffer *buffer,
+		  struct qdio_buffer_element **__element, int *__offset,
+		  struct qeth_hdr **hdr)
+{
+	struct qdio_buffer_element *element = *__element;
+	int offset = *__offset;
+	struct sk_buff *skb = NULL;
+	int skb_len;
+	void *data_ptr;
+	int data_len;
+
+	QETH_DBF_TEXT(trace,6,"nextskb");
+	/* qeth_hdr must not cross element boundaries */
+	if (element->length < offset + sizeof(struct qeth_hdr)){
+		if (qeth_is_last_sbale(element))
+			return NULL;
+		element++;
+		offset = 0;
+		if (element->length < sizeof(struct qeth_hdr))
+			return NULL;
+	}
+	*hdr = element->addr + offset;
+
+	offset += sizeof(struct qeth_hdr);
+	skb_len = (*hdr)->length;
+	if (!skb_len)
+		return NULL;
+	if (card->options.fake_ll){
+		if (!(skb = qeth_get_skb(skb_len + QETH_FAKE_LL_LEN)))
+			goto no_mem;
+		skb_pull(skb, QETH_FAKE_LL_LEN);
+	} else if (!(skb = qeth_get_skb(skb_len)))
+		goto no_mem;
+	data_ptr = element->addr + offset;
+	while (skb_len) {
+		data_len = min(skb_len, (int)(element->length - offset));
+		if (data_len)
+			memcpy(skb_put(skb, data_len), data_ptr, data_len);
+		skb_len -= data_len;
+		if (skb_len){
+			if (qeth_is_last_sbale(element)){
+				QETH_DBF_TEXT(trace,4,"unexeob");
+				QETH_DBF_TEXT_(trace,4,"%s",CARD_BUS_ID(card));
+				QETH_DBF_TEXT(qerr,2,"unexeob");
+				QETH_DBF_TEXT_(qerr,2,"%s",CARD_BUS_ID(card));
+				QETH_DBF_HEX(misc,4,buffer,sizeof(*buffer));
+				dev_kfree_skb_irq(skb);
+				card->stats.rx_errors++;
+				return NULL;
+			}
+			element++;
+			offset = 0;
+			data_ptr = element->addr;
+		} else {
+			offset += data_len;
+		}
+	}
+	*__element = element;
+	*__offset = offset;
+	return skb;
+no_mem:
+	if (net_ratelimit()){
+		PRINT_WARN("No memory for packet received on %s.\n",
+			   card->info.if_name);
+		QETH_DBF_TEXT(trace,2,"noskbmem");
+		QETH_DBF_TEXT_(trace,2,"%s",CARD_BUS_ID(card));
+	}
+	card->stats.rx_dropped++;
+	return NULL;
+}
+
+static inline unsigned short
+qeth_type_trans(struct sk_buff *skb, struct net_device *dev)
+{
+	struct ethhdr *eth;
+	struct qeth_card *card;
+
+	QETH_DBF_TEXT(trace,5,"typtrans");
+
+	card = (struct qeth_card *)dev->priv;
+#ifdef CONFIG_TR
+	if ((card->info.link_type == QETH_LINK_TYPE_HSTR) ||
+	    (card->info.link_type == QETH_LINK_TYPE_LANE_TR))
+	 	return tr_type_trans(skb,dev);
+#endif /* CONFIG_TR */
+
+	skb->mac.raw = skb->data;
+	skb_pull(skb, ETH_ALEN * 2 + sizeof (short));
+	eth = skb->mac.ethernet;
+
+	if (*eth->h_dest & 1) {
+		if (memcmp(eth->h_dest, dev->broadcast, ETH_ALEN) == 0)
+			skb->pkt_type = PACKET_BROADCAST;
+		else
+			skb->pkt_type = PACKET_MULTICAST;
+	} else {
+		skb->pkt_type = PACKET_OTHERHOST;
+	}
+	if (ntohs(eth->h_proto) >= 1536)
+		return eth->h_proto;
+	if (*(unsigned short *) (skb->data) == 0xFFFF)
+		return htons(ETH_P_802_3);
+	return htons(ETH_P_802_2);
+}
+
+
+static inline void
+qeth_rebuild_skb_fake_ll(struct qeth_card *card, struct sk_buff *skb,
+			 struct qeth_hdr *hdr)
+{
+	struct ethhdr *fake_hdr;
+	struct iphdr *ip_hdr;
+
+	QETH_DBF_TEXT(trace,5,"skbfake");
+	skb->mac.raw = skb->data - QETH_FAKE_LL_LEN;
+	/* this is a fake ethernet header */
+	fake_hdr = (struct ethhdr *) skb->mac.raw;
+
+	/* the destination MAC address */
+	switch (skb->pkt_type){
+	case PACKET_MULTICAST:
+		switch (skb->protocol){
+#ifdef CONFIG_QETH_IPV6
+		case __constant_htons(ETH_P_IPV6):
+			ndisc_mc_map((struct in6_addr *)
+				     skb->data + QETH_FAKE_LL_V6_ADDR_POS,
+				     fake_hdr->h_dest, card->dev, 0);
+			break;
+#endif /* CONFIG_QETH_IPV6 */
+		case __constant_htons(ETH_P_IP):
+			ip_hdr = (struct iphdr *)skb->data;
+			if (card->dev->type == ARPHRD_IEEE802_TR)
+				ip_tr_mc_map(ip_hdr->daddr, fake_hdr->h_dest);
+			else
+				ip_eth_mc_map(ip_hdr->daddr, fake_hdr->h_dest);
+			break;
+		default:
+			memcpy(fake_hdr->h_dest, card->dev->dev_addr, ETH_ALEN);
+		}
+		break;
+	case PACKET_BROADCAST:
+		memset(fake_hdr->h_dest, 0xff, ETH_ALEN);
+		break;
+	default:
+		memcpy(fake_hdr->h_dest, card->dev->dev_addr, ETH_ALEN);
+	}
+	/* the source MAC address */
+	if (hdr->ext_flags & QETH_HDR_EXT_SRC_MAC_ADDR)
+		memcpy(fake_hdr->h_source, &hdr->dest_addr[2], ETH_ALEN);
+	else
+		memset(fake_hdr->h_source, 0, ETH_ALEN);
+	/* the protocol */
+	fake_hdr->h_proto = skb->protocol;
+}
+
+static inline void
+qeth_rebuild_skb_vlan(struct qeth_card *card, struct sk_buff *skb,
+		      struct qeth_hdr *hdr)
+{
+#ifdef CONFIG_QETH_VLAN
+	u16 *vlan_tag;
+
+	if (hdr->ext_flags & QETH_HDR_EXT_VLAN_FRAME) {
+		vlan_tag = (u16 *) skb_push(skb, VLAN_HLEN);
+		*vlan_tag = hdr->vlan_id;
+		*(vlan_tag + 1) = skb->protocol;
+		skb->protocol = __constant_htons(ETH_P_8021Q);
+	}
+#endif /* CONFIG_QETH_VLAN */
+}
+
+
+static inline void
+qeth_rebuild_skb(struct qeth_card *card, struct sk_buff *skb,
+		 struct qeth_hdr *hdr)
+{
+#ifdef CONFIG_QETH_IPV6
+	if (hdr->flags & QETH_HDR_PASSTHRU){
+		skb->protocol = qeth_type_trans(skb, card->dev);
+		return;
+	}
+#endif /* CONFIG_QETH_IPV6 */
+	skb->protocol = htons((hdr->flags & QETH_HDR_IPV6)? ETH_P_IPV6 :
+			      ETH_P_IP);
+	switch (hdr->flags & QETH_HDR_CAST_MASK){
+	case QETH_CAST_UNICAST:
+		skb->pkt_type = PACKET_HOST;
+		break;
+	case QETH_CAST_MULTICAST:
+		skb->pkt_type = PACKET_MULTICAST;
+		card->stats.multicast++;
+		break;
+	case QETH_CAST_BROADCAST:
+		skb->pkt_type = PACKET_BROADCAST;
+		card->stats.multicast++;
+		break;
+	case QETH_CAST_ANYCAST:
+	case QETH_CAST_NOCAST:
+	default:
+		skb->pkt_type = PACKET_HOST;
+	}
+	if (card->options.fake_ll)
+		qeth_rebuild_skb_fake_ll(card, skb, hdr);
+	else
+		skb->mac.raw = skb->data;
+	skb->ip_summed = card->options.checksum_type;
+	if (card->options.checksum_type == HW_CHECKSUMMING){
+		if ( (hdr->ext_flags &
+		      (QETH_HDR_EXT_CSUM_HDR_REQ |
+		       QETH_HDR_EXT_CSUM_TRANSP_REQ)) ==
+		     (QETH_HDR_EXT_CSUM_HDR_REQ |
+		      QETH_HDR_EXT_CSUM_TRANSP_REQ) )
+			skb->ip_summed = CHECKSUM_UNNECESSARY;
+		else
+			skb->ip_summed = SW_CHECKSUMMING;
+	}
+	qeth_rebuild_skb_vlan(card, skb, hdr);
+}
+
+
+static inline struct qeth_buffer_pool_entry *
+qeth_get_buffer_pool_entry(struct qeth_card *card)
+{
+	struct qeth_buffer_pool_entry *entry, *tmp;
+
+	QETH_DBF_TEXT(trace, 6, "gtbfplen");
+	entry = NULL;
+	list_for_each_entry_safe(entry, tmp,
+				 &card->qdio.in_buf_pool.entry_list, list){
+		list_del_init(&entry->list);
+		break;
+	}
+	return entry;
+}
+
+static inline void
+qeth_init_input_buffer(struct qeth_card *card, struct qeth_qdio_buffer *buf)
+{
+	struct qeth_buffer_pool_entry *pool_entry;
+	int i;
+
+	pool_entry = qeth_get_buffer_pool_entry(card);
+	/*
+	 * since the buffer is accessed only from the input_tasklet
+	 * there shouldn't be a need to synchronize; also, since we use
+	 * the QETH_IN_BUF_REQUEUE_THRESHOLD we should never run  out off
+	 * buffers
+	 */
+	BUG_ON(!pool_entry);
+
+	buf->pool_entry = pool_entry;
+	for(i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i){
+		buf->buffer->element[i].length = PAGE_SIZE;
+		buf->buffer->element[i].addr =  pool_entry->elements[i];
+		if (i == QETH_MAX_BUFFER_ELEMENTS(card) - 1)
+			buf->buffer->element[i].flags = SBAL_FLAGS_LAST_ENTRY;
+		else
+			buf->buffer->element[i].flags = 0;
+	}
+	buf->state = QETH_QDIO_BUF_EMPTY;
+}
+
+static void
+qeth_clear_output_buffer(struct qeth_card *card,
+			 struct qeth_qdio_out_buffer *buf)
+{
+	int i;
+	struct sk_buff *skb;
+
+	for(i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i){
+		buf->buffer->element[i].length = 0;
+		buf->buffer->element[i].addr = NULL;
+		buf->buffer->element[i].flags = 0;
+		while ((skb = skb_dequeue(&buf->skb_list))){
+			atomic_dec(&skb->users);
+			dev_kfree_skb_irq(skb);
+		}
+	}
+	buf->next_element_to_fill = 0;
+	buf->state = QETH_QDIO_BUF_EMPTY;
+}
+
+static inline void
+qeth_queue_input_buffer(struct qeth_card *card, int index)
+{
+	struct qeth_qdio_q *queue = card->qdio.in_q;
+	int count;
+	int i;
+	int rc;
+
+	QETH_DBF_TEXT(trace,6,"queinbuf");
+	count = (index < queue->next_buf_to_init)?
+		card->qdio.in_buf_pool.buf_count -
+		(queue->next_buf_to_init - index) :
+		card->qdio.in_buf_pool.buf_count -
+		(queue->next_buf_to_init + QDIO_MAX_BUFFERS_PER_Q - index);
+	/* only requeue at a certain threshold to avoid SIGAs */
+	if (count >= QETH_IN_BUF_REQUEUE_THRESHOLD(card)){
+		for (i = queue->next_buf_to_init;
+		     i < queue->next_buf_to_init + count; ++i)
+			qeth_init_input_buffer(card,
+				&queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q]);
+		/*
+		 * according to old code it should be avoided to requeue all
+		 * 128 buffers in order to benefit from PCI avoidance.
+		 * this function keeps at least one buffer (the buffer at
+		 * 'index') un-requeued -> this buffer is the first buffer that
+		 * will be requeued the next time
+		 */
+		rc = do_QDIO(CARD_DDEV(card),
+			     QDIO_FLAG_SYNC_INPUT,
+			     0, queue->next_buf_to_init, count, NULL);
+		if (rc){
+			PRINT_WARN("qeth_queue_input_buffer's do_QDIO "
+				   "return %i (device %s).\n",
+				   rc, CARD_DDEV_ID(card));
+			QETH_DBF_TEXT(trace,2,"qinberr");
+			QETH_DBF_TEXT_(trace,2,"%s",CARD_BUS_ID(card));
+		}
+		queue->next_buf_to_init = (queue->next_buf_to_init + count) %
+					  QDIO_MAX_BUFFERS_PER_Q;
+	}
+}
+
+static inline void
+qeth_put_buffer_pool_entry(struct qeth_card *card,
+			   struct qeth_buffer_pool_entry *entry)
+{
+	QETH_DBF_TEXT(trace, 6, "ptbfplen");
+	list_add_tail(&entry->list, &card->qdio.in_buf_pool.entry_list);
+}
+
+static void
+qeth_qdio_input_tasklet(unsigned long data)
+{
+	struct qeth_card *card = (struct qeth_card *) data;
+	int current_buf = card->qdio.in_q->next_buf_to_process;
+	struct qeth_qdio_buffer *buf;
+	struct qdio_buffer_element *element;
+	int offset;
+	struct sk_buff *skb;
+	struct qeth_hdr *hdr;
+	int rxrc;
+
+	QETH_DBF_TEXT(trace,6,"qdintlet");
+	buf = &card->qdio.in_q->bufs[current_buf];
+	while((buf->state == QETH_QDIO_BUF_PRIMED) ||
+	      (buf->state == QETH_QDIO_BUF_ERROR)){
+		if (buf->state == QETH_QDIO_BUF_ERROR)
+			goto clear_buffer;
+		if (netif_queue_stopped(card->dev))
+			goto clear_buffer;
+		/* get first element of current buffer */
+		element = (struct qdio_buffer_element *)
+			&buf->buffer->element[0];
+		offset = 0;
+#ifdef CONFIG_QETH_PERF_STATS
+		card->perf_stats.bufs_rec++;
+#endif
+		while((skb = qeth_get_next_skb(card, buf->buffer, &element,
+					       &offset, &hdr))){
+
+			qeth_rebuild_skb(card, skb, hdr);
+#ifdef CONFIG_QETH_PERF_STATS
+			card->perf_stats.inbound_time += qeth_get_micros() -
+				card->perf_stats.inbound_start_time;
+			card->perf_stats.inbound_cnt++;
+#endif
+			skb->dev = card->dev;
+			if (netif_queue_stopped(card->dev)) {
+				dev_kfree_skb_irq(skb);
+				card->stats.rx_dropped++;
+			} else {
+				rxrc = netif_rx(skb);
+				card->dev->last_rx = jiffies;
+				card->stats.rx_packets++;
+				card->stats.rx_bytes += skb->len;
+			}
+		}
+clear_buffer:
+		qeth_put_buffer_pool_entry(card, buf->pool_entry);
+		/* give buffer back to hardware */
+		qeth_queue_input_buffer(card, current_buf);
+		current_buf = (current_buf + 1) % QDIO_MAX_BUFFERS_PER_Q;
+		buf = &card->qdio.in_q->bufs[current_buf];
+	}
+	/* set index for next time the tasklet is scheduled */
+	card->qdio.in_q->next_buf_to_process = current_buf;
+}
+
+static inline int
+qeth_handle_send_error(struct qeth_card *card,
+		       struct qeth_qdio_out_buffer *buffer,
+		       int qdio_err, int siga_err)
+{
+	int sbalf15 = buffer->buffer->element[15].flags & 0xff;
+	int cc = siga_err & 3;
+
+	QETH_DBF_TEXT(trace, 6, "hdsnderr");
+	switch (cc) {
+	case 0:
+		if (qdio_err){
+			QETH_DBF_TEXT(trace, 1,"lnkfail");
+			QETH_DBF_TEXT_(trace,1,"%s",CARD_BUS_ID(card));
+			QETH_DBF_TEXT_(trace,1,"%04x %02x",
+				       (u16)qdio_err, (u8)sbalf15);
+			return QETH_SEND_ERROR_LINK_FAILURE;
+		}
+		return QETH_SEND_ERROR_NONE;
+	case 2:
+		if (siga_err & QDIO_SIGA_ERROR_B_BIT_SET) {
+			QETH_DBF_TEXT(trace, 1, "SIGAcc2B");
+			QETH_DBF_TEXT_(trace,1,"%s",CARD_BUS_ID(card));
+			return QETH_SEND_ERROR_KICK_IT;
+		}
+		if ((sbalf15 >= 15) && (sbalf15 <= 31))
+			return QETH_SEND_ERROR_RETRY;
+		return QETH_SEND_ERROR_LINK_FAILURE;
+		/* look at qdio_error and sbalf 15 */
+	case 1:
+		QETH_DBF_TEXT(trace, 1, "SIGAcc1");
+		QETH_DBF_TEXT_(trace,1,"%s",CARD_BUS_ID(card));
+		return QETH_SEND_ERROR_LINK_FAILURE;
+	case 3:
+		QETH_DBF_TEXT(trace, 1, "SIGAcc3");
+		QETH_DBF_TEXT_(trace,1,"%s",CARD_BUS_ID(card));
+		return QETH_SEND_ERROR_KICK_IT;
+	}
+	return QETH_SEND_ERROR_LINK_FAILURE;
+}
+
+static inline void
+qeth_flush_buffers(struct qeth_qdio_out_q *queue, int under_int,
+		   int index, int count)
+{
+	struct qeth_qdio_out_buffer *buf;
+	int rc;
+	int i;
+
+	QETH_DBF_TEXT(trace, 6, "flushbuf");
+
+	for (i = index; i < index + count; ++i) {
+		buf = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q];
+		buf->buffer->element[buf->next_element_to_fill - 1].flags |=
+				SBAL_FLAGS_LAST_ENTRY;
+
+		if (!queue->do_pack){
+			if ((atomic_read(&queue->used_buffers) >=
+		    		(QETH_HIGH_WATERMARK_PACK -
+				 QETH_WATERMARK_PACK_FUZZ)) &&
+		    	    !atomic_read(&queue->set_pci_flags_count)){
+				/* it's likely that we'll go to packing
+				 * mode soon */
+				atomic_inc(&queue->set_pci_flags_count);
+				buf->buffer->element[0].flags |= 0x40;
+			}
+		} else {
+			if (!atomic_read(&queue->set_pci_flags_count)){
+				/*
+				 * there's no outstanding PCI any more, so we
+				 * have to request a PCI to be sure the the PCI
+				 * will wake at some time in the future then we
+				 * can flush packed buffers that might still be
+				 * hanging around, which can happen if no
+				 * further send was requested by the stack
+				 */
+				atomic_inc(&queue->set_pci_flags_count);
+				buf->buffer->element[0].flags |= 0x40;
+			}
+#ifdef CONFIG_QETH_PERF_STATS
+			queue->card->perf_stats.bufs_sent_pack++;
+#endif
+		}
+	}
+
+	queue->card->dev->trans_start = jiffies;
+	if (under_int)
+		rc = do_QDIO(CARD_DDEV(queue->card),
+			     QDIO_FLAG_SYNC_OUTPUT | QDIO_FLAG_UNDER_INTERRUPT,
+			     queue->queue_no, index, count, NULL);
+	else
+		rc = do_QDIO(CARD_DDEV(queue->card), QDIO_FLAG_SYNC_OUTPUT,
+			     queue->queue_no, index, count, NULL);
+	if (rc){
+		QETH_DBF_SPRINTF(trace, 0, "qeth_flush_buffers: do_QDIO "
+				 "returned error (%i) on device %s.",
+				 rc, CARD_DDEV_ID(queue->card));
+		QETH_DBF_TEXT(trace, 2, "flushbuf");
+		QETH_DBF_TEXT_(trace, 2, " err%d", rc);
+		queue->card->stats.tx_errors += count;
+		return;
+	}
+#ifdef CONFIG_QETH_PERF_STATS
+	queue->card->perf_stats.bufs_sent += count;
+	queue->card->perf_stats.outbound_cnt++;
+#endif
+}
+
+/*
+ * switches between PACKING and non-PACKING state if needed.
+ * has to be called holding queue->lock
+ */
+static inline void
+qeth_switch_packing_state(struct qeth_qdio_out_q *queue)
+{
+	struct qeth_qdio_out_buffer *buffer;
+
+	QETH_DBF_TEXT(trace, 6, "swipack");
+	if (!queue->do_pack) {
+		if (atomic_read(&queue->used_buffers)
+		    >= QETH_HIGH_WATERMARK_PACK){
+			/* switch non-PACKING -> PACKING */
+			QETH_DBF_TEXT(trace, 6, "np->pack");
+#ifdef CONFIG_QETH_PERF_STATS
+			queue->card->perf_stats.sc_dp_p++;
+#endif
+			queue->do_pack = 1;
+		}
+	} else {
+		if (atomic_read(&queue->used_buffers)
+		    <= QETH_LOW_WATERMARK_PACK) {
+			/* switch PACKING -> non-PACKING */
+			QETH_DBF_TEXT(trace, 6, "pack->np");
+#ifdef CONFIG_QETH_PERF_STATS
+			queue->card->perf_stats.sc_p_dp++;
+#endif
+			queue->do_pack = 0;
+			/* flush packing buffers */
+			buffer = &queue->bufs[queue->next_buf_to_fill];
+			BUG_ON(buffer->state == QETH_QDIO_BUF_PRIMED);
+			if (buffer->next_element_to_fill > 0) {
+				buffer->state = QETH_QDIO_BUF_PRIMED;
+				atomic_inc(&queue->used_buffers);
+				queue->next_buf_to_fill =
+					(queue->next_buf_to_fill + 1) %
+					QDIO_MAX_BUFFERS_PER_Q;
+		 	}
+		}
+	}
+}
+
+static void
+qeth_qdio_output_handler(struct ccw_device * ccwdev, unsigned int status,
+		        unsigned int qdio_error, unsigned int siga_error,
+			unsigned int __queue, int first_element, int count,
+			unsigned long card_ptr)
+{
+	struct qeth_card *card        = (struct qeth_card *) card_ptr;
+	struct qeth_qdio_out_q *queue = card->qdio.out_qs[__queue];
+	struct qeth_qdio_out_buffer *buffer;
+	int i;
+
+	QETH_DBF_TEXT(trace, 6, "qdouhdl");
+	if (status & QDIO_STATUS_LOOK_FOR_ERROR) {
+		if (status & QDIO_STATUS_ACTIVATE_CHECK_CONDITION){
+			QETH_DBF_SPRINTF(trace, 2, "On device %s: "
+					 "received active check "
+				         "condition (0x%08x).",
+					 CARD_BUS_ID(card), status);
+			QETH_DBF_TEXT(trace, 2, "chkcond");
+			QETH_DBF_TEXT_(trace, 2, "%08x", status);
+			netif_stop_queue(card->dev);
+			qeth_schedule_recovery(card);
+			return;
+		}
+	}
+
+	for(i = first_element; i < (first_element + count); ++i){
+		buffer = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q];
+		/*we only handle the KICK_IT error by doing a recovery */
+		if (qeth_handle_send_error(card, buffer, qdio_error, siga_error)
+				== QETH_SEND_ERROR_KICK_IT){
+			netif_stop_queue(card->dev);
+			qeth_schedule_recovery(card);
+			return;
+		}
+		/* is PCI flag set on buffer? */
+		if (buffer->buffer->element[0].flags & 0x40)
+			atomic_dec(&queue->set_pci_flags_count);
+
+		qeth_clear_output_buffer(card, buffer);
+	}
+	atomic_sub(count, &queue->used_buffers);
+
+	//if (!atomic_read(&queue->set_pci_flags_count))
+		tasklet_schedule(&queue->tasklet);
+
+	netif_wake_queue(card->dev);
+}
+
+static void
+qeth_qdio_output_tasklet(unsigned long data)
+{
+	struct qeth_qdio_out_q *queue = (struct qeth_qdio_out_q *) data;
+	struct qeth_qdio_out_buffer *buffer;
+	int index;
+	int count;
+
+	QETH_DBF_TEXT(trace, 6, "outtlet");
+
+	/* flush all PRIMED buffers */
+	index = queue->next_buf_to_flush;
+	count = 0;
+	while (queue->bufs[index].state == QETH_QDIO_BUF_PRIMED) {
+		count++;
+		index = (index + 1) % QDIO_MAX_BUFFERS_PER_Q;
+	}
+	qeth_flush_buffers(queue, 0, queue->next_buf_to_flush, count);
+	queue->next_buf_to_flush = index;
+
+	/* flush a buffer with data, if no more PCIs are
+	 * outstanding */
+	if (!atomic_read(&queue->set_pci_flags_count)){
+		spin_lock(&queue->lock);
+		buffer = &queue->bufs[index];
+		if (buffer->state == QETH_QDIO_BUF_PRIMED){
+			qeth_flush_buffers(queue, 0, index, 1);
+			index = (index + 1) % QDIO_MAX_BUFFERS_PER_Q;
+			queue->next_buf_to_flush = index;
+		} else if (buffer->next_element_to_fill > 0){
+			/* it's a packing buffer */
+			BUG_ON(index != queue->next_buf_to_fill);
+			buffer->state = QETH_QDIO_BUF_PRIMED;
+			atomic_inc(&queue->used_buffers);
+			qeth_flush_buffers(queue, 0, index, 1);
+			index = (index + 1) % QDIO_MAX_BUFFERS_PER_Q;
+			queue->next_buf_to_flush = index;
+			queue->next_buf_to_fill = index;
+		}
+		spin_unlock(&queue->lock);
+	}
+}
+
+static char*
+qeth_create_qib_param_field(struct qeth_card *card)
+{
+	char *param_field;
+
+	param_field = kmalloc(QDIO_MAX_BUFFERS_PER_Q * sizeof(char),
+			      GFP_KERNEL);
+ 	if (!param_field)
+		return NULL;
+
+ 	memset(param_field, 0, QDIO_MAX_BUFFERS_PER_Q * sizeof(char));
+
+	param_field[0] = _ascebc['P'];
+	param_field[1] = _ascebc['C'];
+	param_field[2] = _ascebc['I'];
+	param_field[3] = _ascebc['T'];
+	*((unsigned int *) (&param_field[4])) = QETH_PCI_THRESHOLD_A(card);
+	*((unsigned int *) (&param_field[8])) = QETH_PCI_THRESHOLD_B(card);
+	*((unsigned int *) (&param_field[12])) = QETH_PCI_TIMER_VALUE(card);
+
+	return param_field;
+}
+
+static void
+qeth_initialize_working_pool_list(struct qeth_card *card)
+{
+	struct qeth_buffer_pool_entry *entry;
+
+	QETH_DBF_TEXT(trace,5,"inwrklst");
+
+	list_for_each_entry(entry,
+			    &card->qdio.init_pool.entry_list, init_list) {
+		qeth_put_buffer_pool_entry(card,entry);
+	}
+}
+
+static void
+qeth_clear_working_pool_list(struct qeth_card *card)
+{
+	struct qeth_buffer_pool_entry *pool_entry, *tmp;
+
+	QETH_DBF_TEXT(trace,5,"clwrklst");
+	list_for_each_entry_safe(pool_entry, tmp,
+			    &card->qdio.in_buf_pool.entry_list, list){
+			list_del(&pool_entry->list);
+	}
+}
+
+static void
+qeth_free_buffer_pool(struct qeth_card *card)
+{
+	struct qeth_buffer_pool_entry *pool_entry, *tmp;
+	int i=0;
+	QETH_DBF_TEXT(trace,5,"freepool");
+	list_for_each_entry_safe(pool_entry, tmp,
+				 &card->qdio.init_pool.entry_list, init_list){
+		for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(card); ++i)
+			free_page((unsigned long)pool_entry->elements[i]);
+		list_del(&pool_entry->init_list);
+		kfree(pool_entry);
+	}
+}
+
+static int
+qeth_alloc_buffer_pool(struct qeth_card *card)
+{
+	struct qeth_buffer_pool_entry *pool_entry;
+	void *ptr;
+	int i, j;
+
+	for (i = 0; i < card->qdio.init_pool.buf_count; ++i){
+	 	pool_entry = kmalloc(sizeof(*pool_entry), GFP_KERNEL);
+		if (!pool_entry){
+			qeth_free_buffer_pool(card);
+			return -ENOMEM;
+		}
+		for(j = 0; j < QETH_MAX_BUFFER_ELEMENTS(card); ++j){
+			ptr = (void *) __get_free_page(GFP_KERNEL);
+			if (!ptr) {
+				while (j > 0)
+					free_page((unsigned long)
+						  pool_entry->elements[--j]);
+				kfree(pool_entry);
+				qeth_free_buffer_pool(card);
+				return -ENOMEM;
+			}
+			pool_entry->elements[j] = ptr;
+		}
+		list_add(&pool_entry->init_list,
+			 &card->qdio.init_pool.entry_list);
+		list_add(&pool_entry->list,
+			 &card->qdio.in_buf_pool.entry_list);
+	}
+	return 0;
+}
+
+static int
+qeth_alloc_qdio_buffers(struct qeth_card *card)
+{
+	int i, j;
+
+	QETH_DBF_TEXT(setup, 2, "allcqdbf");
+
+	if (card->qdio.state == QETH_QDIO_ALLOCATED) {
+		qeth_initialize_working_pool_list(card);
+		return 0;
+	}
+	card->qdio.in_q = kmalloc(sizeof(struct qeth_qdio_q), GFP_KERNEL);
+	if (!card->qdio.in_q)
+		return - ENOMEM;
+	QETH_DBF_TEXT(setup, 2, "inq");
+	QETH_DBF_HEX(setup, 2, &card->qdio.in_q, sizeof(void *));
+	memset(card->qdio.in_q, 0, sizeof(struct qeth_qdio_q));
+	/* give inbound qeth_qdio_buffers their qdio_buffers */
+	for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i)
+		card->qdio.in_q->bufs[i].buffer =
+			&card->qdio.in_q->qdio_bufs[i];
+	/* inbound buffer pool */
+	if (qeth_alloc_buffer_pool(card)){
+		kfree(card->qdio.in_q);
+		return -ENOMEM;
+	}
+	/* outbound */
+	card->qdio.out_qs =
+		kmalloc(card->qdio.no_out_queues *
+			sizeof(struct qeth_qdio_out_q *), GFP_KERNEL);
+	if (!card->qdio.out_qs){
+		qeth_free_buffer_pool(card);
+		return -ENOMEM;
+	}
+	for (i = 0; i < card->qdio.no_out_queues; ++i){
+		card->qdio.out_qs[i] = kmalloc(sizeof(struct qeth_qdio_out_q),
+					       GFP_KERNEL);
+		if (!card->qdio.out_qs[i]){
+			while (i > 0)
+				kfree(card->qdio.out_qs[--i]);
+			kfree(card->qdio.out_qs);
+			return -ENOMEM;
+		}
+		QETH_DBF_TEXT_(setup, 2, "outq %i", i);
+		QETH_DBF_HEX(setup, 2, &card->qdio.out_qs[i], sizeof(void *));
+		memset(card->qdio.out_qs[i], 0, sizeof(struct qeth_qdio_out_q));
+		card->qdio.out_qs[i]->queue_no = i;
+		/* give inbound qeth_qdio_buffers their qdio_buffers */
+		for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j){
+			card->qdio.out_qs[i]->bufs[j].buffer =
+				&card->qdio.out_qs[i]->qdio_bufs[j];
+			skb_queue_head_init(&card->qdio.out_qs[i]->bufs[j].
+					    skb_list);
+		}
+	}
+	card->qdio.state = QETH_QDIO_ALLOCATED;
+	return 0;
+}
+
+static void
+qeth_free_qdio_buffers(struct qeth_card *card)
+{
+	int i, j;
+
+	QETH_DBF_TEXT(trace, 2, "freeqdbf");
+	if (card->qdio.state == QETH_QDIO_UNINITIALIZED)
+		return;
+	kfree(card->qdio.in_q);
+	/* inbound buffer pool */
+	qeth_free_buffer_pool(card);
+	/* free outbound qdio_qs */
+	for (i = 0; i < card->qdio.no_out_queues; ++i){
+		for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j)
+			qeth_clear_output_buffer(card, &card->qdio.
+						out_qs[i]->bufs[j]);
+		kfree(card->qdio.out_qs[i]);
+	}
+	kfree(card->qdio.out_qs);
+	card->qdio.state = QETH_QDIO_UNINITIALIZED;
+}
+
+static void
+qeth_clear_qdio_buffers(struct qeth_card *card)
+{
+	int i, j;
+
+	QETH_DBF_TEXT(trace, 2, "clearqdbf");
+	/* clear outbound buffers to free skbs */
+	for (i = 0; i < card->qdio.no_out_queues; ++i)
+		if (card->qdio.out_qs[i]){
+			for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j)
+				qeth_clear_output_buffer(card, &card->qdio.
+						out_qs[i]->bufs[j]);
+		}
+}
+
+static void
+qeth_init_qdio_info(struct qeth_card *card)
+{
+	QETH_DBF_TEXT(setup, 4, "intqdinf");
+	card->qdio.state = QETH_QDIO_UNINITIALIZED;
+	/* inbound */
+	card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT;
+	card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_DEFAULT;
+	card->qdio.in_buf_pool.buf_count = card->qdio.init_pool.buf_count;
+	INIT_LIST_HEAD(&card->qdio.in_buf_pool.entry_list);
+	INIT_LIST_HEAD(&card->qdio.init_pool.entry_list);
+	card->qdio.in_tasklet.data = (unsigned long) card;
+	card->qdio.in_tasklet.func = qeth_qdio_input_tasklet;
+	/* outbound */
+	card->qdio.do_prio_queueing = QETH_PRIOQ_DEFAULT;
+	card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
+}
+
+static int
+qeth_init_qdio_queues(struct qeth_card *card)
+{
+	int i, j;
+	int rc;
+
+	QETH_DBF_TEXT(setup, 2, "initqdqs");
+
+	/* inbound queue */
+	memset(card->qdio.in_q->qdio_bufs, 0,
+	       QDIO_MAX_BUFFERS_PER_Q * sizeof(struct qdio_buffer));
+	card->qdio.in_q->next_buf_to_process = 0;
+	card->qdio.in_q->next_buf_to_init = 0;
+	/*give only as many buffers to hardware as we have buffer pool entries*/
+	for (i = 0; i < card->qdio.in_buf_pool.buf_count; ++i)
+		qeth_init_input_buffer(card, &card->qdio.in_q->bufs[i]);
+	card->qdio.in_q->next_buf_to_init = card->qdio.in_buf_pool.buf_count;
+	rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0, 0,
+		     card->qdio.in_buf_pool.buf_count, NULL);
+	if (rc) {
+		QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
+		return rc;
+	}
+	rc = qdio_synchronize(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0);
+	if (rc) {
+		QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
+		return rc;
+	}
+	/* outbound queue */
+	for (i = 0; i < card->qdio.no_out_queues; ++i){
+		memset(card->qdio.out_qs[i]->qdio_bufs, 0,
+		       QDIO_MAX_BUFFERS_PER_Q * sizeof(struct qdio_buffer));
+		for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j){
+			qeth_clear_output_buffer(card, &card->qdio.
+						 out_qs[i]->bufs[j]);
+		}
+		card->qdio.out_qs[i]->card = card;
+		card->qdio.out_qs[i]->next_buf_to_fill = 0;
+		card->qdio.out_qs[i]->next_buf_to_flush = 0;
+		card->qdio.out_qs[i]->do_pack = 0;
+		atomic_set(&card->qdio.out_qs[i]->used_buffers,0);
+		atomic_set(&card->qdio.out_qs[i]->set_pci_flags_count, 0);
+		card->qdio.out_qs[i]->tasklet.data =
+			(unsigned long) card->qdio.out_qs[i];
+		card->qdio.out_qs[i]->tasklet.func = qeth_qdio_output_tasklet;
+		spin_lock_init(&card->qdio.out_qs[i]->lock);
+	}
+	return 0;
+}
+
+static int
+qeth_qdio_establish(struct qeth_card *card)
+{
+	struct qdio_initialize init_data;
+	char *qib_param_field;
+	struct qdio_buffer **in_sbal_ptrs;
+	struct qdio_buffer **out_sbal_ptrs;
+	int i, j, k;
+	int rc;
+
+	QETH_DBF_TEXT(setup, 2, "qdioest");
+	qib_param_field = qeth_create_qib_param_field(card);
+	if (!qib_param_field)
+		return -ENOMEM;
+
+	in_sbal_ptrs = kmalloc(QDIO_MAX_BUFFERS_PER_Q * sizeof(void *),
+			       GFP_KERNEL);
+	if (!in_sbal_ptrs) {
+		kfree(qib_param_field);
+		return -ENOMEM;
+	}
+	for(i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i)
+		in_sbal_ptrs[i] = (struct qdio_buffer *)
+			virt_to_phys(card->qdio.in_q->bufs[i].buffer);
+
+	out_sbal_ptrs =
+		kmalloc(card->qdio.no_out_queues * QDIO_MAX_BUFFERS_PER_Q *
+			sizeof(void *), GFP_KERNEL);
+	if (!out_sbal_ptrs) {
+		kfree(in_sbal_ptrs);
+		kfree(qib_param_field);
+		return -ENOMEM;
+	}
+	for(i = 0, k = 0; i < card->qdio.no_out_queues; ++i)
+		for(j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j, ++k){
+			out_sbal_ptrs[k] = (struct qdio_buffer *)
+				virt_to_phys(card->qdio.out_qs[i]->
+					     bufs[j].buffer);
+		}
+
+	memset(&init_data, 0, sizeof(struct qdio_initialize));
+	init_data.cdev                   = CARD_DDEV(card);
+	init_data.q_format               = qeth_get_qdio_q_format(card);
+	init_data.qib_param_field_format = 0;
+	init_data.qib_param_field        = qib_param_field;
+	init_data.min_input_threshold    = QETH_MIN_INPUT_THRESHOLD;
+	init_data.max_input_threshold    = QETH_MAX_INPUT_THRESHOLD;
+	init_data.min_output_threshold   = QETH_MIN_OUTPUT_THRESHOLD;
+	init_data.max_output_threshold   = QETH_MAX_OUTPUT_THRESHOLD;
+	init_data.no_input_qs            = 1;
+	init_data.no_output_qs           = card->qdio.no_out_queues;
+	init_data.input_handler          = (qdio_handler_t *)
+					   qeth_qdio_input_handler;
+	init_data.output_handler         = (qdio_handler_t *)
+					   qeth_qdio_output_handler;
+	init_data.int_parm               = (unsigned long) card;
+	init_data.flags                  = QDIO_INBOUND_0COPY_SBALS |
+					   QDIO_OUTBOUND_0COPY_SBALS |
+					   QDIO_USE_OUTBOUND_PCIS;
+	init_data.input_sbal_addr_array  = (void **) in_sbal_ptrs;
+	init_data.output_sbal_addr_array = (void **) out_sbal_ptrs;
+
+	if (!(rc = qdio_initialize(&init_data)))
+		card->qdio.state = QETH_QDIO_ESTABLISHED;
+
+	kfree(out_sbal_ptrs);
+	kfree(in_sbal_ptrs);
+	kfree(qib_param_field);
+	return rc;
+}
+
+static int
+qeth_qdio_activate(struct qeth_card *card)
+{
+	QETH_DBF_TEXT(setup,3,"qdioact");
+	return qdio_activate(CARD_DDEV(card), 0);
+}
+
+static int
+qeth_clear_channel(struct qeth_channel *channel)
+{
+	unsigned long flags;
+	struct qeth_card *card;
+	int rc;
+
+	QETH_DBF_TEXT(trace,3,"clearch");
+	card = CARD_FROM_CDEV(channel->ccwdev);
+	spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
+	rc = ccw_device_clear(channel->ccwdev, QETH_CLEAR_CHANNEL_PARM);
+	spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
+
+	if (rc)
+		return rc;
+	rc = wait_event_interruptible_timeout(card->wait_q,
+			channel->state==CH_STATE_STOPPED, QETH_TIMEOUT);
+	if (rc == -ERESTARTSYS)
+		return rc;
+	if (channel->state != CH_STATE_STOPPED)
+		return -ETIME;
+	channel->state = CH_STATE_DOWN;
+	return 0;
+}
+
+static int
+qeth_halt_channel(struct qeth_channel *channel)
+{
+	unsigned long flags;
+	struct qeth_card *card;
+	int rc;
+
+	QETH_DBF_TEXT(trace,3,"haltch");
+	card = CARD_FROM_CDEV(channel->ccwdev);
+	spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
+	rc = ccw_device_halt(channel->ccwdev, QETH_HALT_CHANNEL_PARM);
+	spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
+
+	if (rc)
+		return rc;
+	rc = wait_event_interruptible_timeout(card->wait_q,
+			channel->state==CH_STATE_HALTED, QETH_TIMEOUT);
+	if (rc == -ERESTARTSYS)
+		return rc;
+	if (channel->state != CH_STATE_HALTED)
+		return -ETIME;
+	return 0;
+}
+
+static int
+qeth_halt_channels(struct qeth_card *card)
+{
+	int rc = 0;
+
+	QETH_DBF_TEXT(trace,3,"haltchs");
+	if ((rc = qeth_halt_channel(&card->read)))
+		return rc;
+	if ((rc = qeth_halt_channel(&card->write)))
+		return rc;
+	return  qeth_halt_channel(&card->data);
+}
+static int
+qeth_clear_channels(struct qeth_card *card)
+{
+	int rc = 0;
+
+	QETH_DBF_TEXT(trace,3,"clearchs");
+	if ((rc = qeth_clear_channel(&card->read)))
+		return rc;
+	if ((rc = qeth_clear_channel(&card->write)))
+		return rc;
+	return  qeth_clear_channel(&card->data);
+}
+
+static int
+qeth_clear_halt_card(struct qeth_card *card, int halt)
+{
+	int rc = 0;
+
+	QETH_DBF_TEXT(trace,3,"clhacrd");
+	QETH_DBF_HEX(trace, 3, &card, sizeof(void *));
+
+	if (halt)
+		rc = qeth_halt_channels(card);
+	if (rc)
+		return rc;
+	return qeth_clear_channels(card);
+}
+
+static int
+qeth_qdio_clear_card(struct qeth_card *card, int use_halt)
+{
+	int rc = 0;
+
+	QETH_DBF_TEXT(trace,3,"qdioclr");
+	if (card->qdio.state == QETH_QDIO_ESTABLISHED){
+		qdio_cleanup(CARD_DDEV(card),
+			     (card->info.type == QETH_CARD_TYPE_IQD) ?
+			     QDIO_FLAG_CLEANUP_USING_HALT :
+			     QDIO_FLAG_CLEANUP_USING_CLEAR);
+		card->qdio.state = QETH_QDIO_ALLOCATED;
+	}
+	rc = qeth_clear_halt_card(card, use_halt);
+	card->state = CARD_STATE_DOWN;
+	return rc;
+}
+
+static int
+qeth_dm_act(struct qeth_card *card)
+{
+	int rc;
+	struct qeth_cmd_buffer *iob;
+
+	QETH_DBF_TEXT(setup,2,"dmact");
+
+	iob = qeth_wait_for_buffer(&card->write);
+	memcpy(iob->data, DM_ACT, DM_ACT_SIZE);
+
+	memcpy(QETH_DM_ACT_DEST_ADDR(iob->data),
+	       &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
+	memcpy(QETH_DM_ACT_CONNECTION_TOKEN(iob->data),
+	       &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
+	rc = qeth_send_control_data(card, DM_ACT_SIZE, iob, NULL, NULL);
+	return rc;
+}
+
+static int
+qeth_mpc_initialize(struct qeth_card *card)
+{
+	int rc;
+
+	QETH_DBF_TEXT(setup,2,"mpcinit");
+
+	if ((rc = qeth_issue_next_read(card))){
+		QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
+		return rc;
+	}
+	if ((rc = qeth_cm_enable(card))){
+		QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
+		return rc;
+	}
+	if ((rc = qeth_cm_setup(card))){
+		QETH_DBF_TEXT_(setup, 2, "3err%d", rc);
+		return rc;
+	}
+	if ((rc = qeth_ulp_enable(card))){
+		QETH_DBF_TEXT_(setup, 2, "4err%d", rc);
+		return rc;
+	}
+	if ((rc = qeth_ulp_setup(card))){
+		QETH_DBF_TEXT_(setup, 2, "5err%d", rc);
+		return rc;
+	}
+	if ((rc = qeth_alloc_qdio_buffers(card))){
+		QETH_DBF_TEXT_(setup, 2, "5err%d", rc);
+		return rc;
+	}
+	if ((rc = qeth_qdio_establish(card))){
+		QETH_DBF_TEXT_(setup, 2, "6err%d", rc);
+		qeth_free_qdio_buffers(card);
+		goto out_qdio;
+	}
+ 	if ((rc = qeth_qdio_activate(card))){
+		QETH_DBF_TEXT_(setup, 2, "7err%d", rc);
+		goto out_qdio;
+	}
+	if ((rc = qeth_dm_act(card))){
+		QETH_DBF_TEXT_(setup, 2, "8err%d", rc);
+		goto out_qdio;
+	}
+
+	return 0;
+out_qdio:
+	qeth_qdio_clear_card(card, card->info.type==QETH_CARD_TYPE_OSAE);
+	return rc;
+}
+
+static void
+qeth_set_device_name(struct qeth_card *card)
+{
+	char buf[IF_NAME_LEN];
+
+	memset(buf, 0, IF_NAME_LEN);
+	if (card->info.type == QETH_CARD_TYPE_IQD) {
+		sprintf(buf,"hsi%d", atomic_read(&qeth_hsi_count));
+		atomic_inc(&qeth_hsi_count);
+		memcpy(card->dev->name,buf,IF_NAME_LEN);
+	}
+
+}
+
+static struct net_device *
+qeth_get_netdevice(enum qeth_card_types type, enum qeth_link_types linktype)
+{
+	struct net_device *dev = NULL;
+
+	switch (type) {
+	case QETH_CARD_TYPE_OSAE:
+		switch (linktype) {
+		case QETH_LINK_TYPE_LANE_TR:
+		case QETH_LINK_TYPE_HSTR:
+#ifdef CONFIG_TR
+			dev = alloc_trdev(0);
+#endif /* CONFIG_TR */
+			break;
+		default:
+			dev = alloc_etherdev(0);
+		}
+		break;
+	case QETH_CARD_TYPE_IQD:
+	default:
+		dev = alloc_etherdev(0);
+	}
+	return dev;
+}
+
+static inline int
+qeth_send_packet(struct qeth_card *, struct sk_buff *);
+
+static int
+qeth_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
+{
+	int rc;
+	struct qeth_card *card;
+
+	QETH_DBF_TEXT(trace, 6, "hrdstxmi");
+	card = (struct qeth_card *)dev->priv;
+	if (skb==NULL) {
+		card->stats.tx_dropped++;
+		card->stats.tx_errors++;
+		return -EIO;
+	}
+	if (card->state != CARD_STATE_UP_LAN_ONLINE) {
+		card->stats.tx_dropped++;
+		card->stats.tx_errors++;
+		card->stats.tx_carrier_errors++;
+		return -EIO;
+	}
+	if (netif_queue_stopped(dev) ) {
+		card->stats.tx_dropped++;
+		return -EBUSY;
+	}
+#ifdef CONFIG_QETH_PERF_STATS
+	card->perf_stats.outbound_start_time = qeth_get_micros();
+#endif
+	/*
+	 * dev_queue_xmit should ensure that we are called packet
+	 * after packet
+	 */
+	netif_stop_queue(dev);
+	if (!(rc = qeth_send_packet(card, skb)))
+		netif_wake_queue(dev);
+
+	return rc;
+}
+
+static int
+qeth_verify_vlan_dev(struct net_device *dev, struct qeth_card *card)
+{
+	int rc = 0;
+#ifdef CONFIG_QETH_VLAN
+	struct vlan_group *vg;
+	int i;
+
+	if (!(vg = card->vlangrp))
+		return rc;
+
+	for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++){
+		if (vg->vlan_devices[i] == dev){
+			rc = QETH_VLAN_CARD;
+			break;
+		}
+	}
+#endif
+	return rc;
+}
+
+static int
+qeth_verify_dev(struct net_device *dev)
+{
+	struct qeth_card *card;
+	unsigned long flags;
+	int rc = 0;
+
+	read_lock_irqsave(&qeth_card_list.rwlock, flags);
+	list_for_each_entry(card, &qeth_card_list.list, list){
+		if (card->dev == dev){
+			rc = QETH_REAL_CARD;
+			break;
+		}
+		rc = qeth_verify_vlan_dev(dev, card);
+		if (rc)
+			break;
+	}
+	read_unlock_irqrestore(&qeth_card_list.rwlock, flags);
+
+	return rc;
+}
+
+static struct qeth_card *
+qeth_get_card_from_dev(struct net_device *dev)
+{
+	struct qeth_card *card = NULL;
+	int rc;
+
+	rc = qeth_verify_dev(dev);
+	if (rc == QETH_REAL_CARD)
+		card = (struct qeth_card *)dev->priv;
+	else if (rc == QETH_VLAN_CARD)
+		card = (struct qeth_card *)
+			VLAN_DEV_INFO(dev)->real_dev->priv;
+
+	QETH_DBF_TEXT_(trace, 4, "%d", rc);
+	return card ;
+}
+
+static void
+qeth_tx_timeout(struct net_device *dev)
+{
+	struct qeth_card *card;
+
+	card = (struct qeth_card *) dev->priv;
+	card->stats.tx_errors++;
+	qeth_schedule_recovery(card);
+}
+
+static int
+qeth_open(struct net_device *dev)
+{
+	struct qeth_card *card;
+
+	QETH_DBF_TEXT(trace, 4, "qethopen");
+
+	card = (struct qeth_card *) dev->priv;
+
+	if ((card->state != CARD_STATE_SOFTSETUP) &&
+	    (card->state != CARD_STATE_UP_LAN_OFFLINE))
+		return -ENODEV;
+	if (!card->lan_online){
+		card->state = CARD_STATE_UP_LAN_OFFLINE;
+		return -EIO;
+	}
+
+	card->dev->flags |= IFF_UP;
+	netif_start_queue(dev);
+	card->data.state = CH_STATE_UP;
+	card->state = CARD_STATE_UP_LAN_ONLINE;
+	return 0;
+}
+
+static int
+qeth_stop(struct net_device *dev)
+{
+	struct qeth_card *card;
+
+	QETH_DBF_TEXT(trace, 4, "qethstop");
+
+	card = (struct qeth_card *) dev->priv;
+
+	netif_stop_queue(dev);
+	card->dev->flags &= ~IFF_UP;
+	if ((card->state == CARD_STATE_UP_LAN_ONLINE) ||
+	    (card->state == CARD_STATE_UP_LAN_OFFLINE))
+		card->state = CARD_STATE_SOFTSETUP;
+	return 0;
+}
+
+static inline int
+qeth_get_cast_type(struct qeth_card *card, struct sk_buff *skb)
+{
+	int cast_type = RTN_UNSPEC;
+
+	if (skb->dst && skb->dst->neighbour){
+		cast_type = skb->dst->neighbour->type;
+		if ((cast_type == RTN_BROADCAST) ||
+		    (cast_type == RTN_MULTICAST) ||
+		    (cast_type == RTN_ANYCAST))
+			return cast_type;
+		else
+			return RTN_UNSPEC;
+	}
+	/* try something else */
+	if (skb->protocol == ETH_P_IPV6)
+		return (skb->nh.raw[24] == 0xff) ? RTN_MULTICAST : 0;
+	else if (skb->protocol == ETH_P_IP)
+		return ((skb->nh.raw[16] & 0xf0) == 0xe0) ? RTN_MULTICAST : 0;
+	/* ... */
+	if (!memcmp(skb->nh.raw, skb->dev->broadcast, 6))
+		return RTN_BROADCAST;
+	else {
+		u16 hdr_mac;
+
+	        hdr_mac = *((u16 *)skb->nh.raw);
+	        /* tr multicast? */
+	        switch (card->info.link_type) {
+	        case QETH_LINK_TYPE_HSTR:
+	        case QETH_LINK_TYPE_LANE_TR:
+	        	if ((hdr_mac == QETH_TR_MAC_NC) ||
+			    (hdr_mac == QETH_TR_MAC_C))
+				return RTN_MULTICAST;
+	        /* eth or so multicast? */
+                default:
+                      	if ((hdr_mac == QETH_ETH_MAC_V4) ||
+			    (hdr_mac == QETH_ETH_MAC_V6))
+			        return RTN_MULTICAST;
+	        }
+        }
+	return cast_type;
+}
+
+static inline int
+qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb,
+		        int ipv, int cast_type)
+{
+	if (!ipv && (card->info.type == QETH_CARD_TYPE_OSAE))
+		return card->qdio.default_out_queue;
+	switch (card->qdio.no_out_queues) {
+	case 4:
+		if (cast_type && card->info.is_multicast_different)
+			return card->info.is_multicast_different &
+				(card->qdio.no_out_queues - 1);
+		if (card->qdio.do_prio_queueing && (ipv == 4)) {
+			if (card->qdio.do_prio_queueing==QETH_PRIO_Q_ING_TOS){
+				if (skb->nh.iph->tos & IP_TOS_NOTIMPORTANT)
+					return 3;
+				if (skb->nh.iph->tos & IP_TOS_HIGHRELIABILITY)
+					return 2;
+				if (skb->nh.iph->tos & IP_TOS_HIGHTHROUGHPUT)
+					return 1;
+				if (skb->nh.iph->tos & IP_TOS_LOWDELAY)
+					return 0;
+			}
+			if (card->qdio.do_prio_queueing==QETH_PRIO_Q_ING_PREC)
+				return 3 - (skb->nh.iph->tos >> 6);
+		} else if (card->qdio.do_prio_queueing && (ipv == 6)) {
+			/* TODO: IPv6!!! */
+		}
+		return card->qdio.default_out_queue;
+	default:
+		return 0;
+	}
+}
+
+static inline int
+qeth_get_ip_version(struct sk_buff *skb)
+{
+	switch (skb->protocol) {
+	case ETH_P_IPV6:
+		return 6;
+	case ETH_P_IP:
+		return 4;
+	default:
+		return 0;
+	}
+}
+
+static inline int
+qeth_prepare_skb(struct qeth_card *card, struct sk_buff **skb,
+		 struct qeth_hdr **hdr, int ipv)
+{
+	struct sk_buff *new_skb;
+#ifdef CONFIG_QETH_VLAN
+	u16 *tag;
+#endif
+
+	QETH_DBF_TEXT(trace, 6, "prepskb");
+	if (skb_headroom(*skb) < sizeof(struct qeth_hdr)){
+		new_skb = skb_realloc_headroom(*skb, sizeof(struct qeth_hdr));
+		if (!new_skb) {
+			PRINT_ERR("qeth_prepare_skb: could "
+				  "not realloc headroom for qeth_hdr "
+				  "on interface %s", card->info.if_name);
+			return -ENOMEM;
+		}
+		*skb = new_skb;
+	}
+#ifdef CONFIG_QETH_VLAN
+	if (card->vlangrp && vlan_tx_tag_present(*skb) && (ipv == 6)){
+		/*
+		 * Move the mac addresses (6 bytes src, 6 bytes dest)
+		 * to the beginning of the new header.  We are using three
+		 * memcpys instead of one memmove to save cycles.
+		 */
+		skb_push(*skb, VLAN_HLEN);
+		memcpy((*skb)->data, (*skb)->data + 4, 4);
+		memcpy((*skb)->data + 4, (*skb)->data + 8, 4);
+		memcpy((*skb)->data + 8, (*skb)->data + 12, 4);
+		tag = (u16 *) (*skb)->data + 12;
+		/*
+		 * first two bytes  = ETH_P_8021Q (0x8100)
+		 * second two bytes = VLANID
+		 */
+		*tag = __constant_htons(ETH_P_8021Q);
+		*(tag + 1) = vlan_tx_tag_get(*skb);
+		*(tag + 1) = htons(*(tag + 1));
+	}
+#endif
+	*hdr = (struct qeth_hdr *) skb_push(*skb, sizeof(struct qeth_hdr));
+	/*
+	 * sanity check, the Linux memory allocation scheme should
+	 * never present us cases like this one (the 32bytes header plus
+	 * the first 40 bytes of the paket cross a 4k boundary)
+	 */
+	if ((((unsigned long) *hdr) & (~(PAGE_SIZE - 1))) !=
+	    (((unsigned long) *hdr + sizeof(struct qeth_hdr) +
+	      QETH_IP_HEADER_SIZE) & (~(PAGE_SIZE - 1)))) {
+		PRINT_ERR("qeth_prepare_skb: misaligned "
+			  "packet on interface %s. Discarded.",
+			  card->info.if_name);
+		return -EINVAL;
+	}
+	return 0;
+}
+
+static inline u8
+qeth_get_qeth_hdr_flags4(int cast_type)
+{
+	if (cast_type == RTN_MULTICAST)
+		return QETH_CAST_MULTICAST;
+	if (cast_type == RTN_BROADCAST)
+		return QETH_CAST_BROADCAST;
+	return QETH_CAST_UNICAST;
+}
+
+static inline u8
+qeth_get_qeth_hdr_flags6(int cast_type)
+{
+	u8 ct = QETH_HDR_PASSTHRU | QETH_HDR_IPV6;
+	if (cast_type == RTN_MULTICAST)
+		return ct | QETH_CAST_MULTICAST;
+	if (cast_type == RTN_ANYCAST)
+		return ct | QETH_CAST_ANYCAST;
+	if (cast_type == RTN_BROADCAST)
+		return ct | QETH_CAST_BROADCAST;
+	return ct | QETH_CAST_UNICAST;
+}
+
+static inline void
+qeth_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
+		struct sk_buff *skb, int ipv, int cast_type)
+{
+	hdr->id = 1;
+	hdr->ext_flags = 0;
+
+	QETH_DBF_TEXT(trace, 6, "fillhdr");
+#ifdef CONFIG_QETH_VLAN
+	/*
+	 * before we're going to overwrite this location with next hop ip.
+	 * v6 uses passthrough, v4 sets the tag in the QDIO header.
+	 */
+	if (card->vlangrp && vlan_tx_tag_present(skb)) {
+		hdr->ext_flags = (ipv == 4)? QETH_EXT_HDR_VLAN_FRAME :
+					     QETH_EXT_HDR_INCLUDE_VLAN_TAG;
+		hdr->vlan_id = vlan_tx_tag_get(skb);
+	}
+#endif /* CONFIG_QETH_VLAN */
+	hdr->length = skb->len - sizeof(struct qeth_hdr);
+	if (ipv == 4) {	 /* IPv4 */
+		hdr->flags = qeth_get_qeth_hdr_flags4(cast_type);
+		memset(hdr->dest_addr, 0, 12);
+		if ((skb->dst) && (skb->dst->neighbour)) {
+			*((u32 *) (&hdr->dest_addr[12])) =
+			    *((u32 *) skb->dst->neighbour->primary_key);
+		} else {
+			/* fill in destination address used in ip header */
+			*((u32 *) (&hdr->dest_addr[12])) = skb->nh.iph->daddr;
+		}
+	} else if (ipv == 6) { /* IPv6 or passthru */
+		hdr->flags = qeth_get_qeth_hdr_flags6(cast_type);
+		if ((skb->dst) && (skb->dst->neighbour)) {
+			memcpy(hdr->dest_addr,
+			       skb->dst->neighbour->primary_key, 16);
+		} else {
+			/* fill in destination address used in ip header */
+			memcpy(hdr->dest_addr, &skb->nh.ipv6h->daddr, 16);
+		}
+	} else { /* passthrough */
+		if (!memcmp(skb->data + sizeof(struct qeth_hdr),
+			    skb->dev->broadcast, 6)) {   /* broadcast? */
+			hdr->flags = QETH_CAST_BROADCAST | QETH_HDR_PASSTHRU;
+		} else {
+ 			hdr->flags = (cast_type == RTN_MULTICAST) ?
+ 				QETH_CAST_MULTICAST | QETH_HDR_PASSTHRU :
+ 				QETH_CAST_UNICAST | QETH_HDR_PASSTHRU;
+		}
+	}
+}
+
+static inline int
+qeth_fill_buffer(struct qeth_qdio_out_q *queue, struct qeth_qdio_out_buffer *buf,
+		 char *data, struct sk_buff *skb)
+{
+	struct qdio_buffer *buffer;
+	int length = skb->len;
+	int length_here;
+	int element;
+	int first_lap = 1;
+
+	QETH_DBF_TEXT(trace, 6, "qdfillbf");
+
+	buffer = buf->buffer;
+	atomic_inc(&skb->users);
+	skb_queue_tail(&buf->skb_list, skb);
+	element = buf->next_element_to_fill;
+	while (length > 0) {
+		/* length_here is the remaining amount of data in this page */
+		length_here = PAGE_SIZE - ((unsigned long) data % PAGE_SIZE);
+		if (length < length_here)
+			length_here = length;
+		buffer->element[element].addr = data;
+		buffer->element[element].length = length_here;
+		length -= length_here;
+		if (!length){
+			if (first_lap)
+				buffer->element[element].flags = 0;
+			else
+				buffer->element[element].flags =
+				    SBAL_FLAGS_LAST_FRAG;
+		} else {
+			if (first_lap)
+				buffer->element[element].flags =
+				    SBAL_FLAGS_FIRST_FRAG;
+			else
+				buffer->element[element].flags =
+				    SBAL_FLAGS_MIDDLE_FRAG;
+		}
+		data += length_here;
+		element++;
+		first_lap = 0;
+	}
+	buf->next_element_to_fill = element;
+	if (!queue->do_pack) {
+		QETH_DBF_TEXT(trace, 6, "fillbfnp");
+		/* set state to PRIMED -> will be flushed */
+		buf->state = QETH_QDIO_BUF_PRIMED;
+	} else {
+		QETH_DBF_TEXT(trace, 6, "fillbfpa");
+#ifdef CONFIG_QETH_PERF_STATS
+		queue->card->perf_stats.skbs_sent_pack++;
+#endif
+		if (buf->next_element_to_fill >=
+				QETH_MAX_BUFFER_ELEMENTS(queue->card)) {
+			/*
+			 * packed buffer if full -> set state PRIMED
+			 * -> will be flushed
+			 */
+			buf->state = QETH_QDIO_BUF_PRIMED;
+		}
+	}
+	return 0;
+}
+
+static inline int
+qeth_do_send_packet(struct qeth_card *card, struct sk_buff *skb,
+		    struct qeth_qdio_out_q *queue, int ipv,
+		    int cast_type)
+{
+	struct qeth_hdr *hdr;
+	struct qeth_qdio_out_buffer *buffer;
+	int elements_needed;
+	int rc;
+
+	QETH_DBF_TEXT(trace, 6, "dosndpkt");
+
+	if ((rc = qeth_prepare_skb(card, &skb, &hdr, ipv))){
+		QETH_DBF_TEXT_(trace, 4, "1err%d", rc);
+		return rc;
+	}
+	qeth_fill_header(card, hdr, skb, ipv, cast_type);
+	elements_needed = 1 + (((((unsigned long) hdr) % PAGE_SIZE) + skb->len)
+				>> PAGE_SHIFT);
+	if (elements_needed > QETH_MAX_BUFFER_ELEMENTS(card)){
+		PRINT_ERR("qeth_do_send_packet: invalid size of "
+				 "IP packet. Discarded.");
+		return -EINVAL;
+	}
+
+	spin_lock(&queue->lock);
+	/* check if we need to switch packing state of this queue */
+	if (card->info.type != QETH_CARD_TYPE_IQD)
+		qeth_switch_packing_state(queue);
+	buffer = &queue->bufs[queue->next_buf_to_fill];
+	BUG_ON(buffer->state == QETH_QDIO_BUF_PRIMED);
+	if (queue->do_pack){
+		/* does packet fit in current buffer? */
+		if((QETH_MAX_BUFFER_ELEMENTS(card) - buffer->next_element_to_fill)
+				< elements_needed){
+			/* ... no -> set state PRIMED */
+			buffer->state = QETH_QDIO_BUF_PRIMED;
+			atomic_inc(&queue->used_buffers);
+			queue->next_buf_to_fill =
+				(queue->next_buf_to_fill + 1) %
+				QDIO_MAX_BUFFERS_PER_Q;
+			buffer = &queue->bufs[queue->next_buf_to_fill];
+		}
+	}
+
+	rc = qeth_fill_buffer(queue, buffer, (char *)hdr, skb);
+	if (rc) {
+		PRINT_WARN("qeth_do_send_packet: error during "
+			      "qeth_fill_buffer.");
+		card->stats.tx_dropped++;
+		spin_unlock(&queue->lock);
+		return rc;
+	}
+	if (buffer->state == QETH_QDIO_BUF_PRIMED){
+		/* next time fill the next buffer */
+		atomic_inc(&queue->used_buffers);
+		queue->next_buf_to_fill = (queue->next_buf_to_fill + 1) %
+			QDIO_MAX_BUFFERS_PER_Q;
+	}
+	spin_unlock(&queue->lock);
+
+	tasklet_schedule(&queue->tasklet);
+
+	return rc;
+}
+
+static inline int
+qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
+{
+	int ipv;
+	int cast_type;
+	struct qeth_qdio_out_q *queue;
+	int rc;
+
+	QETH_DBF_TEXT(trace, 6, "sendpkt");
+
+	ipv = qeth_get_ip_version(skb);
+	cast_type = qeth_get_cast_type(card, skb);
+	queue = card->qdio.out_qs
+		[qeth_get_priority_queue(card, skb, ipv, cast_type)];
+	/* do we have empty buffers? */
+	rc = (atomic_read(&queue->used_buffers) >=
+	      QDIO_MAX_BUFFERS_PER_Q - 1) ? -EBUSY : 0;
+	if (rc) {
+		card->stats.tx_dropped++;
+		QETH_DBF_TEXT_(trace, 4, "1err%d", rc);
+		return rc;
+	}
+
+	rc = qeth_do_send_packet(card, skb, queue, ipv, cast_type);
+
+	if (!rc){
+		card->stats.tx_packets++;
+		card->stats.tx_bytes += skb->len;
+#ifdef CONFIG_QETH_PERF_STATS
+		card->perf_stats.outbound_time += qeth_get_micros() -
+			card->perf_stats.outbound_start_time;
+#endif
+	}
+	return rc;
+}
+
+static int
+qeth_mdio_read(struct net_device *dev, int phy_id, int regnum)
+{
+	struct qeth_card *card = (struct qeth_card *) dev->priv;
+	int rc = 0;
+
+	switch(regnum){
+	case MII_BMCR: /* Basic mode control register */
+		rc = BMCR_FULLDPLX;
+		if(card->info.link_type != QETH_LINK_TYPE_GBIT_ETH)
+			rc |= BMCR_SPEED100;
+		break;
+	case MII_BMSR: /* Basic mode status register */
+		rc = BMSR_ERCAP | BMSR_ANEGCOMPLETE | BMSR_LSTATUS |
+		     BMSR_10HALF | BMSR_10FULL | BMSR_100HALF | BMSR_100FULL |
+		     BMSR_100BASE4;
+		break;
+	case MII_PHYSID1: /* PHYS ID 1 */
+		rc = (dev->dev_addr[0] << 16) | (dev->dev_addr[1] << 8) |
+		     dev->dev_addr[2];
+		rc = (rc >> 5) & 0xFFFF;
+		break;
+	case MII_PHYSID2: /* PHYS ID 2 */
+		rc = (dev->dev_addr[2] << 10) & 0xFFFF;
+		break;
+	case MII_ADVERTISE: /* Advertisement control reg */
+		rc = ADVERTISE_ALL;
+		break;
+	case MII_LPA: /* Link partner ability reg */
+		rc = LPA_10HALF | LPA_10FULL | LPA_100HALF | LPA_100FULL |
+		     LPA_100BASE4 | LPA_LPACK;
+		break;
+	case MII_EXPANSION: /* Expansion register */
+		break;
+	case MII_DCOUNTER: /* disconnect counter */
+		break;
+	case MII_FCSCOUNTER: /* false carrier counter */
+		break;
+	case MII_NWAYTEST: /* N-way auto-neg test register */
+		break;
+	case MII_RERRCOUNTER: /* rx error counter */
+		rc = card->stats.rx_errors;
+		break;
+	case MII_SREVISION: /* silicon revision */
+		break;
+	case MII_RESV1: /* reserved 1 */
+		break;
+	case MII_LBRERROR: /* loopback, rx, bypass error */
+		break;
+	case MII_PHYADDR: /* physical address */
+		break;
+	case MII_RESV2: /* reserved 2 */
+		break;
+	case MII_TPISTATUS: /* TPI status for 10mbps */
+		break;
+	case MII_NCONFIG: /* network interface config */
+		break;
+	default:
+		rc = 0;
+		break;
+	}
+	return rc;
+}
+
+static void
+qeth_mdio_write(struct net_device *dev, int phy_id, int regnum, int value)
+{
+	switch(regnum){
+	case MII_BMCR: /* Basic mode control register */
+	case MII_BMSR: /* Basic mode status register */
+	case MII_PHYSID1: /* PHYS ID 1 */
+	case MII_PHYSID2: /* PHYS ID 2 */
+	case MII_ADVERTISE: /* Advertisement control reg */
+	case MII_LPA: /* Link partner ability reg */
+	case MII_EXPANSION: /* Expansion register */
+	case MII_DCOUNTER: /* disconnect counter */
+	case MII_FCSCOUNTER: /* false carrier counter */
+	case MII_NWAYTEST: /* N-way auto-neg test register */
+	case MII_RERRCOUNTER: /* rx error counter */
+	case MII_SREVISION: /* silicon revision */
+	case MII_RESV1: /* reserved 1 */
+	case MII_LBRERROR: /* loopback, rx, bypass error */
+	case MII_PHYADDR: /* physical address */
+	case MII_RESV2: /* reserved 2 */
+	case MII_TPISTATUS: /* TPI status for 10mbps */
+	case MII_NCONFIG: /* network interface config */
+	default:
+		break;
+	}
+}
+
+static inline const char *
+qeth_arp_get_error_cause(int *rc)
+{
+	switch (*rc) {
+	case QETH_IPA_ARP_RC_FAILED:
+		*rc = -EIO;
+		return "operation failed";
+	case QETH_IPA_ARP_RC_NOTSUPP:
+		*rc = -EOPNOTSUPP;
+		return "operation not supported";
+	case QETH_IPA_ARP_RC_OUT_OF_RANGE:
+		*rc = -EINVAL;
+		return "argument out of range";
+	case QETH_IPA_ARP_RC_Q_NOTSUPP:
+		*rc = -EOPNOTSUPP;
+		return "query operation not supported";
+	case QETH_IPA_ARP_RC_Q_NO_DATA:
+		*rc = -ENOENT;
+		return "no query data available";
+	default:
+		return "unknown error";
+	}
+}
+
+static int
+qeth_send_simple_setassparms(struct qeth_card *, enum qeth_ipa_funcs,
+			     __u16, long);
+
+static int
+qeth_arp_set_no_entries(struct qeth_card *card, int no_entries)
+{
+	int tmp;
+	int rc;
+
+	QETH_DBF_TEXT(trace,3,"arpstnoe");
+
+	/* TODO: really not supported by GuestLAN? */
+	if (card->info.guestlan)
+		return -EOPNOTSUPP;
+	if (!qeth_is_supported(card,IPA_ARP_PROCESSING)) {
+		PRINT_WARN("ARP processing not supported "
+			   "on %s!\n", card->info.if_name);
+		return -EOPNOTSUPP;
+	}
+	rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING,
+					  IPA_CMD_ASS_ARP_SET_NO_ENTRIES,
+					  no_entries);
+	if (rc) {
+		tmp = rc;
+		PRINT_WARN("Could not set number of ARP entries on %s: "
+			   "%s (0x%x)\n",
+			   card->info.if_name, qeth_arp_get_error_cause(&rc),
+			   tmp);
+	}
+	return rc;
+}
+
+static int
+qeth_arp_query_cb(struct qeth_card *card, struct qeth_reply *reply,
+		  unsigned long data)
+{
+	struct qeth_ipa_arp_cmd *cmd;
+	struct qeth_arp_query_data *qdata;
+	struct qeth_arp_query_info *qinfo;
+	int entry_size;
+	int i;
+
+	QETH_DBF_TEXT(trace,4,"arpquecb");
+
+	qinfo = (struct qeth_arp_query_info *) reply->param;
+	cmd = (struct qeth_ipa_arp_cmd *) data;
+	if (cmd->ihdr.return_code) {
+		QETH_DBF_TEXT_(trace,4,"qaer1%i", cmd->ihdr.return_code);
+		return 0;
+	}
+	if (cmd->shdr.return_code) {
+		cmd->ihdr.return_code = cmd->shdr.return_code;
+		QETH_DBF_TEXT_(trace,4,"qaer2%i", cmd->ihdr.return_code);
+		return 0;
+	}
+	qdata = &cmd->data.query_arp;
+	switch(qdata->reply_bits){
+	case 5:
+		entry_size = sizeof(struct qeth_arp_qi_entry5);
+		break;
+	case 7:
+		entry_size = sizeof(struct qeth_arp_qi_entry7);
+		break;
+	default:
+		/* tr is the same as eth -> entry7 */
+		entry_size = sizeof(struct qeth_arp_qi_entry7);
+		break;
+	}
+	/* check if there is enough room in userspace */
+	if ((qinfo->udata_len - qinfo->udata_offset) <
+			qdata->no_entries * entry_size){
+		QETH_DBF_TEXT_(trace, 4, "qaer3%i", -ENOMEM);
+		cmd->ihdr.return_code = -ENOMEM;
+		goto out_error;
+	}
+	QETH_DBF_TEXT_(trace, 4, "anore%i", cmd->shdr.number_of_replies);
+	QETH_DBF_TEXT_(trace, 4, "aseqn%i", cmd->shdr.seq_no);
+	QETH_DBF_TEXT_(trace, 4, "anoen%i", qdata->no_entries);
+	for (i = 0; i < qdata->no_entries; ++i){
+		memcpy(qinfo->udata + qinfo->udata_offset,
+		       qdata->data + i*entry_size, entry_size);
+		qinfo->no_entries++;
+		qinfo->udata_offset += entry_size;
+	}
+	/* check if all replies received ... */
+	if (cmd->shdr.seq_no < cmd->shdr.number_of_replies)
+		return 1;
+	memcpy(qinfo->udata, &qinfo->no_entries, 4);
+	memcpy(qinfo->udata + QETH_QARP_MASK_OFFSET,&qdata->reply_bits,2);
+	return 0;
+out_error:
+	i = 0;
+	memcpy(qinfo->udata, &i, 4);
+	return 0;
+}
+
+static struct qeth_cmd_buffer *
+qeth_get_ipacmd_buffer(struct qeth_card *, enum qeth_ipa_cmds,
+		       enum qeth_prot_versions);
+
+struct qeth_cmd_buffer *
+qeth_get_ipa_arp_cmd_buffer(struct qeth_card *card, u16 cmd_code,
+			    u32 data_len, enum qeth_prot_versions proto)
+{
+	struct qeth_cmd_buffer *iob;
+	struct qeth_ipa_arp_cmd *cmd;
+	u16 s1, s2;
+
+	QETH_DBF_TEXT(trace,4,"getarpcm");
+	iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETASSPARMS, proto);
+
+	memcpy(iob->data, IPA_PDU_HEADER, IPA_PDU_HEADER_SIZE);
+	/* adjust sizes in IPA_PDU_HEADER */
+	s1 = (u32) IPA_PDU_HEADER_SIZE + QETH_ARP_CMD_BASE_LEN + data_len;
+	s2 = (u32) QETH_ARP_CMD_BASE_LEN + data_len;
+	memcpy(QETH_IPA_PDU_LEN_TOTAL(iob->data), &s1, 2);
+	memcpy(QETH_IPA_PDU_LEN_PDU1(iob->data), &s2, 2);
+	memcpy(QETH_IPA_PDU_LEN_PDU2(iob->data), &s2, 2);
+	memcpy(QETH_IPA_PDU_LEN_PDU3(iob->data), &s2, 2);
+
+	cmd = (struct qeth_ipa_arp_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+	cmd->shdr.assist_no = IPA_ARP_PROCESSING;
+	cmd->shdr.length = 8 + data_len;
+	cmd->shdr.command_code = cmd_code;
+	cmd->shdr.return_code = 0;
+	cmd->shdr.seq_no = 0;
+
+	return iob;
+}
+
+static int
+qeth_send_ipa_arp_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
+		      char *data, int data_len,
+		      int (*reply_cb)
+		      (struct qeth_card *,struct qeth_reply*, unsigned long),
+		      void *reply_param)
+{
+	int rc;
+
+	QETH_DBF_TEXT(trace,4,"sendarp");
+
+	memcpy(QETH_IPA_ARP_DATA_POS(iob->data), data, data_len);
+	memcpy(QETH_IPA_CMD_DEST_ADDR(iob->data),
+	       &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
+
+	rc = qeth_send_control_data(card, IPA_PDU_HEADER_SIZE +
+				    QETH_ARP_CMD_BASE_LEN + data_len, iob,
+				    reply_cb, reply_param);
+	return rc;
+}
+
+static int
+qeth_arp_query(struct qeth_card *card, char *udata)
+{
+	struct qeth_cmd_buffer *iob;
+	struct qeth_arp_query_data *qdata;
+	struct qeth_arp_query_info qinfo = {0, };
+	int tmp;
+	int rc;
+
+	QETH_DBF_TEXT(trace,3,"arpquery");
+
+	/* TODO: really not supported by GuestLAN? */
+	if (card->info.guestlan)
+		return -EOPNOTSUPP;
+	if (!qeth_is_supported(card,IPA_ARP_PROCESSING)) {
+		PRINT_WARN("ARP processing not supported "
+			   "on %s!\n", card->info.if_name);
+		return -EOPNOTSUPP;
+	}
+	/* get size of userspace mem area */
+	if (copy_from_user(&qinfo.udata_len, udata, 4))
+		return -EFAULT;
+	if (!(qinfo.udata = kmalloc(qinfo.udata_len, GFP_KERNEL)))
+		return -ENOMEM;
+	memset(qinfo.udata, 0, qinfo.udata_len);
+	qinfo.udata_offset = QETH_QARP_ENTRIES_OFFSET;
+	/* alloc mem area for the actual query */
+	if (!(qdata = kmalloc(sizeof(struct qeth_arp_query_data),
+			      GFP_KERNEL))){
+		kfree(qinfo.udata);
+		return -ENOMEM;
+	}
+	memset(qdata, 0, sizeof(struct qeth_arp_query_data));
+	iob = qeth_get_ipa_arp_cmd_buffer(card, IPA_CMD_ASS_ARP_QUERY_INFO,
+					  sizeof(struct qeth_arp_query_data),
+					  QETH_PROT_IPV4);
+	rc = qeth_send_ipa_arp_cmd(card, iob,
+				   (char *) qdata,
+				   sizeof(struct qeth_arp_query_data),
+				   qeth_arp_query_cb,
+				   (void *)&qinfo);
+	if (rc) {
+		tmp = rc;
+		PRINT_WARN("Error while querying ARP cache on %s: %s (0x%x)\n",
+			   card->info.if_name, qeth_arp_get_error_cause(&rc),
+			   tmp);
+		copy_to_user(udata, qinfo.udata, 4);
+	} else {
+		copy_to_user(udata, qinfo.udata, qinfo.udata_len);
+	}
+	kfree(qinfo.udata);
+	return rc;
+}
+
+static int
+qeth_default_setassparms_cb(struct qeth_card *, struct qeth_reply *,
+			    unsigned long);
+
+static struct qeth_cmd_buffer *
+qeth_get_setassparms_cmd(struct qeth_card *, enum qeth_ipa_funcs,
+			 __u16, __u16, enum qeth_prot_versions);
+
+static int
+qeth_send_setassparms(struct qeth_card *, struct qeth_cmd_buffer *,
+		      __u16, long,
+		      int (*reply_cb)
+		      (struct qeth_card *, struct qeth_reply *, unsigned long),
+		      void *reply_param);
+
+static int
+qeth_arp_add_entry(struct qeth_card *card, struct qeth_arp_cache_entry *entry)
+{
+	struct qeth_cmd_buffer *iob;
+	char buf[16];
+	int tmp;
+	int rc;
+
+	QETH_DBF_TEXT(trace,3,"arpadent");
+
+	/* TODO: really not supported by GuestLAN? */
+	if (card->info.guestlan)
+		return -EOPNOTSUPP;
+	if (!qeth_is_supported(card,IPA_ARP_PROCESSING)) {
+		PRINT_WARN("ARP processing not supported "
+			   "on %s!\n", card->info.if_name);
+		return -EOPNOTSUPP;
+	}
+
+	iob = qeth_get_setassparms_cmd(card, IPA_ARP_PROCESSING,
+				       IPA_CMD_ASS_ARP_ADD_ENTRY,
+				       sizeof(struct qeth_arp_cache_entry),
+				       QETH_PROT_IPV4);
+	rc = qeth_send_setassparms(card, iob,
+				   sizeof(struct qeth_arp_cache_entry),
+				   (unsigned long) entry,
+				   qeth_default_setassparms_cb, NULL);
+	if (rc) {
+		tmp = rc;
+		qeth_ipaddr4_to_string((u8 *)entry->ipaddr, buf);
+		PRINT_WARN("Could not add ARP entry for address %s on %s: "
+			   "%s (0x%x)\n",
+			   buf, card->info.if_name,
+			   qeth_arp_get_error_cause(&rc), tmp);
+	}
+	return rc;
+}
+
+static int
+qeth_arp_remove_entry(struct qeth_card *card, struct qeth_arp_cache_entry *entry)
+{
+	struct qeth_cmd_buffer *iob;
+	char buf[16] = {0, };
+	int tmp;
+	int rc;
+
+	QETH_DBF_TEXT(trace,3,"arprment");
+
+	/* TODO: really not supported by GuestLAN? */
+	if (card->info.guestlan)
+		return -EOPNOTSUPP;
+	if (!qeth_is_supported(card,IPA_ARP_PROCESSING)) {
+		PRINT_WARN("ARP processing not supported "
+			   "on %s!\n", card->info.if_name);
+		return -EOPNOTSUPP;
+	}
+	memcpy(buf, entry, 12);
+	iob = qeth_get_setassparms_cmd(card, IPA_ARP_PROCESSING,
+				       IPA_CMD_ASS_ARP_REMOVE_ENTRY,
+				       12,
+				       QETH_PROT_IPV4);
+	rc = qeth_send_setassparms(card, iob,
+				   12, (unsigned long)buf,
+				   qeth_default_setassparms_cb, NULL);
+	if (rc) {
+		tmp = rc;
+		memset(buf, 0, 16);
+		qeth_ipaddr4_to_string((u8 *)entry->ipaddr, buf);
+		PRINT_WARN("Could not delete ARP entry for address %s on %s: "
+			   "%s (0x%x)\n",
+			   buf, card->info.if_name,
+			   qeth_arp_get_error_cause(&rc), tmp);
+	}
+	return rc;
+}
+
+static int
+qeth_arp_flush_cache(struct qeth_card *card)
+{
+	int rc;
+	int tmp;
+
+	QETH_DBF_TEXT(trace,3,"arpflush");
+
+	/* TODO: really not supported by GuestLAN? */
+	if (card->info.guestlan)
+		return -EOPNOTSUPP;
+	if (!qeth_is_supported(card,IPA_ARP_PROCESSING)) {
+		PRINT_WARN("ARP processing not supported "
+			   "on %s!\n", card->info.if_name);
+		return -EOPNOTSUPP;
+	}
+	rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING,
+					  IPA_CMD_ASS_ARP_FLUSH_CACHE, 0);
+	if (rc){
+		tmp = rc;
+		PRINT_WARN("Could not flush ARP cache on %s: %s (0x%x)\n",
+			   card->info.if_name, qeth_arp_get_error_cause(&rc),
+			   tmp);
+	}
+	return rc;
+}
+
+static int
+qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
+{
+	struct qeth_card *card = (struct qeth_card *)dev->priv;
+	struct qeth_arp_cache_entry arp_entry;
+	struct mii_ioctl_data *mii_data;
+	int rc = 0;
+
+	if (!card)
+		return -ENODEV;
+
+	if ((card->state != CARD_STATE_UP_LAN_ONLINE) &&
+	    (card->state != CARD_STATE_UP_LAN_OFFLINE))
+		return -ENODEV;
+
+	switch (cmd){
+	case SIOCDEVPRIVATE:
+	case SIOC_QETH_ARP_SET_NO_ENTRIES:
+		if (!capable(CAP_NET_ADMIN)){
+			rc = -EPERM;
+			break;
+		}
+		rc = qeth_arp_set_no_entries(card, rq->ifr_ifru.ifru_ivalue);
+		break;
+	case SIOCDEVPRIVATE+1:
+	case SIOC_QETH_ARP_QUERY_INFO:
+		if (!capable(CAP_NET_ADMIN)){
+			rc = -EPERM;
+			break;
+		}
+		rc = qeth_arp_query(card, rq->ifr_ifru.ifru_data);
+		break;
+	case SIOCDEVPRIVATE+2:
+	case SIOC_QETH_ARP_ADD_ENTRY:
+		if (!capable(CAP_NET_ADMIN)){
+			rc = -EPERM;
+			break;
+		}
+		if (copy_from_user(&arp_entry, rq->ifr_ifru.ifru_data,
+				   sizeof(struct qeth_arp_cache_entry)))
+			rc = -EFAULT;
+		else
+			rc = qeth_arp_add_entry(card, &arp_entry);
+		break;
+	case SIOCDEVPRIVATE+3:
+	case SIOC_QETH_ARP_REMOVE_ENTRY:
+		if (!capable(CAP_NET_ADMIN)){
+			rc = -EPERM;
+			break;
+		}
+		if (copy_from_user(&arp_entry, rq->ifr_ifru.ifru_data,
+				   sizeof(struct qeth_arp_cache_entry)))
+			rc = -EFAULT;
+		else
+			rc = qeth_arp_remove_entry(card, &arp_entry);
+		break;
+	case SIOCDEVPRIVATE+4:
+	case SIOC_QETH_ARP_FLUSH_CACHE:
+		if (!capable(CAP_NET_ADMIN)){
+			rc = -EPERM;
+			break;
+		}
+		rc = qeth_arp_flush_cache(card);
+		break;
+	case SIOCDEVPRIVATE+5:
+	case SIOC_QETH_ADP_SET_SNMP_CONTROL:
+		break;
+	case SIOCDEVPRIVATE+6:
+	case SIOC_QETH_GET_CARD_TYPE:
+		break;
+	case SIOCGMIIPHY:
+		mii_data = (struct mii_ioctl_data *) &rq->ifr_ifru.ifru_data;
+		mii_data->phy_id = 0;
+		break;
+	case SIOCGMIIREG:
+		mii_data = (struct mii_ioctl_data *) &rq->ifr_ifru.ifru_data;
+		if (mii_data->phy_id != 0)
+			rc = -EINVAL;
+		else
+			mii_data->val_out = qeth_mdio_read(dev,mii_data->phy_id,
+							   mii_data->reg_num);
+		break;
+	case SIOCSMIIREG:
+		rc = -EOPNOTSUPP;
+		break;
+		/* TODO: remove return if qeth_mdio_write does something */
+		if (!capable(CAP_NET_ADMIN)){
+			rc = -EPERM;
+			break;
+		}
+		mii_data = (struct mii_ioctl_data *) &rq->ifr_ifru.ifru_data;
+		if (mii_data->phy_id != 0)
+			rc = -EINVAL;
+		else
+			qeth_mdio_write(dev, mii_data->phy_id, mii_data->reg_num,
+					mii_data->val_in);
+		break;
+	default:
+		rc = -EOPNOTSUPP;
+	}
+	return rc;
+}
+
+static struct net_device_stats *
+qeth_get_stats(struct net_device *dev)
+{
+	struct qeth_card *card;
+
+	card = (struct qeth_card *) (dev->priv);
+
+	QETH_DBF_TEXT(trace,5,"getstat");
+
+	return &card->stats;
+}
+
+static int
+qeth_change_mtu(struct net_device *dev, int new_mtu)
+{
+	struct qeth_card *card;
+	char dbf_text[15];
+
+	card = (struct qeth_card *) (dev->priv);
+
+	QETH_DBF_TEXT(trace,4,"chgmtu");
+	sprintf(dbf_text, "%8x", new_mtu);
+	QETH_DBF_TEXT(trace,4,dbf_text);
+
+	if (new_mtu < 64)
+		return -EINVAL;
+	if (new_mtu > 65535)
+		return -EINVAL;
+	if ((!qeth_is_supported(card,IPA_IP_FRAGMENTATION)) &&
+	    (!qeth_mtu_is_valid(card, new_mtu)))
+		return -EINVAL;
+	dev->mtu = new_mtu;
+	return 0;
+}
+
+#ifdef CONFIG_QETH_VLAN
+static void
+qeth_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
+{
+	struct qeth_card *card;
+
+	QETH_DBF_TEXT(trace,4,"vlanreg");
+
+	card = (struct qeth_card *) dev->priv;
+	spin_lock_irq(&card->vlanlock);
+	card->vlangrp = grp;
+	spin_unlock_irq(&card->vlanlock);
+}
+
+static void
+qeth_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
+{
+	struct qeth_card *card;
+
+	QETH_DBF_TEXT(trace,4,"vlkilvid");
+
+	card = (struct qeth_card *) dev->priv;
+	spin_lock_irq(&card->vlanlock);
+	if (card->vlangrp)
+		card->vlangrp->vlan_devices[vid] = NULL;
+	spin_unlock_irq(&card->vlanlock);
+	/* delete mc addresses for this vlan dev */
+	qeth_set_thread_start_bit(card, QETH_SET_MC_THREAD);
+	schedule_work(&card->kernel_thread_starter);
+}
+#endif
+
+static int
+qeth_neigh_setup(struct net_device *dev, struct neigh_parms *np)
+{
+	return 0;
+}
+
+#ifdef CONFIG_QETH_IPV6
+int
+qeth_ipv6_generate_eui64(u8 * eui, struct net_device *dev)
+{
+	switch (dev->type) {
+	case ARPHRD_ETHER:
+	case ARPHRD_FDDI:
+	case ARPHRD_IEEE802_TR:
+		if (dev->addr_len != ETH_ALEN)
+			return -1;
+		memcpy(eui, dev->dev_addr, 3);
+		memcpy(eui + 5, dev->dev_addr + 3, 3);
+		eui[3] = (dev->dev_id >> 8) & 0xff;
+		eui[4] = dev->dev_id & 0xff;
+		return 0;
+	}
+	return -1;
+
+}
+#endif
+
+static void
+qeth_get_mac_for_ipm(__u32 ipm, char *mac, struct net_device *dev)
+{
+	if (dev->type == ARPHRD_IEEE802_TR)
+		ip_tr_mc_map(ipm, mac);
+	else
+		ip_eth_mc_map(ipm, mac);
+}
+
+static struct qeth_ipaddr *
+qeth_get_addr_buffer(enum qeth_prot_versions prot)
+{
+	struct qeth_ipaddr *addr;
+
+	addr = kmalloc(sizeof(struct qeth_ipaddr), GFP_ATOMIC);
+	if (addr == NULL) {
+		PRINT_WARN("Not enough memory to add address\n");
+		return NULL;
+	}
+	memset(addr,0,sizeof(struct qeth_ipaddr));
+	addr->type = QETH_IP_TYPE_NORMAL;
+	addr->proto = prot;
+	addr->is_multicast = 0;
+	addr->users = 0;
+	addr->set_flags = 0;
+	addr->del_flags = 0;
+	return addr;
+}
+
+static void
+qeth_delete_mc_addresses(struct qeth_card *card)
+{
+	struct qeth_ipaddr *ipm, *iptodo;
+	unsigned long flags;
+
+	QETH_DBF_TEXT(trace,4,"delmc");
+	spin_lock_irqsave(&card->ip_lock, flags);
+	list_for_each_entry(ipm, &card->ip_list, entry){
+		if (!ipm->is_multicast)
+			continue;
+		iptodo = qeth_get_addr_buffer(ipm->proto);
+		memcpy(iptodo, ipm, sizeof(struct qeth_ipaddr));
+		iptodo->users = iptodo->users * -1;
+		if (!__qeth_insert_ip_todo(card, iptodo, 0))
+			kfree(iptodo);
+	}
+	spin_unlock_irqrestore(&card->ip_lock, flags);
+}
+
+static inline void
+qeth_add_mc(struct qeth_card *card, struct in_device *in4_dev)
+{
+	struct qeth_ipaddr *ipm;
+	struct ip_mc_list *im4;
+	char buf[MAX_ADDR_LEN];
+
+	QETH_DBF_TEXT(trace,4,"addmc");
+	for (im4 = in4_dev->mc_list; im4; im4 = im4->next) {
+		qeth_get_mac_for_ipm(im4->multiaddr, buf, in4_dev->dev);
+		ipm = qeth_get_addr_buffer(QETH_PROT_IPV4);
+		if (!ipm)
+			continue;
+		ipm->u.a4.addr = im4->multiaddr;
+		memcpy(ipm->mac,buf,OSA_ADDR_LEN);
+		ipm->is_multicast = 1;
+		if (!qeth_add_ip(card,ipm))
+			kfree(ipm);
+	}
+}
+
+static inline void
+qeth_add_vlan_mc(struct qeth_card *card)
+{
+#ifdef CONFIG_QETH_VLAN
+	struct in_device *in_dev;
+	struct vlan_group *vg;
+	int i;
+
+	QETH_DBF_TEXT(trace,4,"addmcvl");
+	if (!qeth_is_supported(card,IPA_FULL_VLAN) ||
+	    (card->vlangrp == NULL))
+		return ;
+
+	vg = card->vlangrp;
+	for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
+		if (vg->vlan_devices[i] == NULL ||
+		    !(vg->vlan_devices[i]->flags & IFF_UP))
+			continue;
+		in_dev = in_dev_get(vg->vlan_devices[i]);
+		if (!in_dev)
+			continue;
+		read_lock(&in_dev->lock);
+		qeth_add_mc(card,in_dev);
+		read_unlock(&in_dev->lock);
+		in_dev_put(in_dev);
+	}
+#endif
+}
+
+static void
+qeth_add_multicast_ipv4(struct qeth_card *card)
+{
+	struct in_device *in4_dev;
+
+	QETH_DBF_TEXT(trace,4,"chkmcv4");
+	in4_dev = in_dev_get(card->dev);
+	if (in4_dev == NULL)
+		return;
+	read_lock(&in4_dev->lock);
+	qeth_add_mc(card, in4_dev);
+	qeth_add_vlan_mc(card);
+	read_unlock(&in4_dev->lock);
+	in_dev_put(in4_dev);
+}
+
+#ifdef CONFIG_QETH_IPV6
+static inline void
+qeth_add_mc6(struct qeth_card *card, struct inet6_dev *in6_dev)
+{
+	struct qeth_ipaddr *ipm;
+	struct ifmcaddr6 *im6;
+	char buf[MAX_ADDR_LEN];
+
+	QETH_DBF_TEXT(trace,4,"addmc6");
+	for (im6 = in6_dev->mc_list; im6 != NULL; im6 = im6->next) {
+		ndisc_mc_map(&im6->mca_addr, buf, in6_dev->dev, 0);
+		ipm = qeth_get_addr_buffer(QETH_PROT_IPV6);
+		if (!ipm)
+			continue;
+		ipm->is_multicast = 1;
+		memcpy(ipm->mac,buf,OSA_ADDR_LEN);
+		memcpy(&ipm->u.a6.addr,&im6->mca_addr.s6_addr,
+		       sizeof(struct in6_addr));
+		if (!qeth_add_ip(card,ipm))
+			kfree(ipm);
+	}
+}
+
+static inline void
+qeth_add_vlan_mc6(struct qeth_card *card)
+{
+#ifdef CONFIG_QETH_VLAN
+	struct inet6_dev *in_dev;
+	struct vlan_group *vg;
+	int i;
+
+	QETH_DBF_TEXT(trace,4,"admc6vl");
+	if (!qeth_is_supported(card,IPA_FULL_VLAN) ||
+	    (card->vlangrp == NULL))
+		return ;
+
+	vg = card->vlangrp;
+	for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
+		if (vg->vlan_devices[i] == NULL ||
+		    !(vg->vlan_devices[i]->flags & IFF_UP))
+			continue;
+		in_dev = in6_dev_get(vg->vlan_devices[i]);
+		if (!in_dev)
+			continue;
+		read_lock(&in_dev->lock);
+		qeth_add_mc6(card,in_dev);
+		read_unlock(&in_dev->lock);
+		in6_dev_put(in_dev);
+	}
+#endif /* CONFIG_QETH_VLAN */
+}
+
+static void
+qeth_add_multicast_ipv6(struct qeth_card *card)
+{
+	struct inet6_dev *in6_dev;
+
+	QETH_DBF_TEXT(trace,4,"chkmcv6");
+	if (!qeth_is_supported(card, IPA_IPV6))
+		return ;
+
+	in6_dev = in6_dev_get(card->dev);
+	if (in6_dev == NULL)
+		return;
+	read_lock(&in6_dev->lock);
+	qeth_add_mc6(card, in6_dev);
+	qeth_add_vlan_mc6(card);
+	read_unlock(&in6_dev->lock);
+	in6_dev_put(in6_dev);
+}
+#endif /* CONFIG_QETH_IPV6 */
+
+/**
+ * set multicast address on card
+ */
+static void
+qeth_set_multicast_list(struct net_device *dev)
+{
+	struct qeth_card *card;
+
+	QETH_DBF_TEXT(trace,3,"setmulti");
+	card = (struct qeth_card *) dev->priv;
+
+	qeth_set_thread_start_bit(card, QETH_SET_MC_THREAD);
+	schedule_work(&card->kernel_thread_starter);
+}
+
+static void
+qeth_fill_ipacmd_header(struct qeth_card *card, struct qeth_ipa_cmd *cmd,
+			__u8 command, enum qeth_prot_versions prot)
+{
+	memset(cmd, 0, sizeof (struct qeth_ipa_cmd));
+	cmd->hdr.command = command;
+	cmd->hdr.initiator = IPA_CMD_INITIATOR_HOST;
+	cmd->hdr.seqno = card->seqno.ipa;
+	cmd->hdr.adapter_type = qeth_get_ipa_adp_type(card->info.link_type);
+	cmd->hdr.rel_adapter_no = (__u8) card->info.portno;
+	cmd->hdr.prim_version_no = 1;
+	cmd->hdr.param_count = 1;
+	cmd->hdr.prot_version = prot;
+	cmd->hdr.ipa_supported = 0;
+	cmd->hdr.ipa_enabled = 0;
+}
+
+static struct qeth_cmd_buffer *
+qeth_get_ipacmd_buffer(struct qeth_card *card, enum qeth_ipa_cmds ipacmd,
+		       enum qeth_prot_versions prot)
+{
+	struct qeth_cmd_buffer *iob;
+	struct qeth_ipa_cmd *cmd;
+
+	iob = qeth_wait_for_buffer(&card->write);
+	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+	qeth_fill_ipacmd_header(card, cmd, ipacmd, prot);
+
+	return iob;
+}
+
+static int
+qeth_send_setdelmc(struct qeth_card *card, struct qeth_ipaddr *addr, int ipacmd)
+{
+	int rc;
+	struct qeth_cmd_buffer *iob;
+	struct qeth_ipa_cmd *cmd;
+
+	QETH_DBF_TEXT(trace,4,"setdelmc");
+
+	iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto);
+	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+	memcpy(&cmd->data.setdelipm.mac,addr->mac, OSA_ADDR_LEN);
+	if (addr->proto == QETH_PROT_IPV6)
+		memcpy(cmd->data.setdelipm.ip6, &addr->u.a6.addr,
+		       sizeof(struct in6_addr));
+	else
+		memcpy(&cmd->data.setdelipm.ip4, &addr->u.a4.addr,4);
+
+	rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
+
+	return rc;
+}
+static inline void
+qeth_fill_netmask(u8 *netmask, unsigned int len)
+{
+	int i,j;
+	for (i=0;i<16;i++) {
+		j=(len)-(i*8);
+		if (j >= 8)
+			netmask[i] = 0xff;
+		else if (j > 0)
+			netmask[i] = (u8)(0xFF00>>j);
+		else
+			netmask[i] = 0;
+	}
+}
+
+static int
+qeth_send_setdelip(struct qeth_card *card, struct qeth_ipaddr *addr,
+		   int ipacmd, unsigned int flags)
+{
+	int rc;
+	struct qeth_cmd_buffer *iob;
+	struct qeth_ipa_cmd *cmd;
+	__u8 netmask[16];
+
+	QETH_DBF_TEXT(trace,4,"setdelip");
+	QETH_DBF_TEXT_(trace,4,"flags%02X", flags);
+
+	iob = qeth_get_ipacmd_buffer(card, ipacmd, addr->proto);
+	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+	if (addr->proto == QETH_PROT_IPV6) {
+		memcpy(cmd->data.setdelip6.ip_addr, &addr->u.a6.addr,
+		       sizeof(struct in6_addr));
+		qeth_fill_netmask(netmask,addr->u.a6.pfxlen);
+		memcpy(cmd->data.setdelip6.mask, netmask,
+		       sizeof(struct in6_addr));
+		cmd->data.setdelip6.flags = flags;
+	} else {
+		memcpy(cmd->data.setdelip4.ip_addr, &addr->u.a4.addr, 4);
+		memcpy(cmd->data.setdelip4.mask, &addr->u.a4.mask, 4);
+		cmd->data.setdelip4.flags = flags;
+	}
+
+	rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
+
+	return rc;
+}
+
+static int
+qeth_register_addr_entry(struct qeth_card *card, struct qeth_ipaddr *addr)
+{
+	//char buf[50];
+	int rc;
+	int cnt = 3;
+
+	if (addr->proto == QETH_PROT_IPV4) {
+		QETH_DBF_TEXT(trace, 2,"setaddr4");
+		QETH_DBF_HEX(trace, 4, &addr->u.a4.addr, sizeof(int));
+	} else if (addr->proto == QETH_PROT_IPV6) {
+		QETH_DBF_TEXT(trace, 2, "setaddr6");
+		QETH_DBF_HEX(trace,4,&addr->u.a6.addr,4);
+		QETH_DBF_HEX(trace,4,((char *)&addr->u.a6.addr)+4,4);
+	} else {
+		QETH_DBF_TEXT(trace, 2, "setaddr?");
+		QETH_DBF_HEX(trace, 4, addr, sizeof(struct qeth_ipaddr));
+	}
+	do {
+		if (addr->is_multicast)
+			rc =  qeth_send_setdelmc(card, addr, IPA_CMD_SETIPM);
+		else
+			rc = qeth_send_setdelip(card, addr, IPA_CMD_SETIP,
+					addr->set_flags);
+		if (rc)
+			QETH_DBF_TEXT(trace, 2, "failed");
+	} while ((--cnt > 0) && rc);
+	if (rc){
+		QETH_DBF_TEXT(trace, 2, "FAILED");
+		/* TODO: re-activate this warning as soon as we have a
+		 * clean mirco code
+		qeth_ipaddr_to_string(addr->proto, (u8 *)&addr->u, buf);
+		PRINT_WARN("Could not register IP address %s (rc=%x)\n",
+			   buf, rc);
+		*/
+	}
+	return rc;
+}
+
+static int
+qeth_deregister_addr_entry(struct qeth_card *card, struct qeth_ipaddr *addr)
+{
+	//char buf[50];
+	int rc;
+
+	if (addr->proto == QETH_PROT_IPV4) {
+		QETH_DBF_TEXT(trace, 2,"deladdr4");
+		QETH_DBF_HEX(trace, 2, &addr->u.a4.addr, sizeof(int));
+	} else if (addr->proto == QETH_PROT_IPV6) {
+		QETH_DBF_TEXT(trace, 2, "deladdr6");
+		QETH_DBF_HEX(trace, 2, &addr->u.a6.addr,
+			     sizeof(struct in6_addr));
+	} else {
+		QETH_DBF_TEXT(trace, 2, "deladdr?");
+		QETH_DBF_HEX(trace, 2, addr, sizeof(struct qeth_ipaddr));
+	}
+	if (addr->is_multicast)
+		rc = qeth_send_setdelmc(card, addr, IPA_CMD_DELIPM);
+	else
+		rc = qeth_send_setdelip(card, addr, IPA_CMD_DELIP,
+					addr->del_flags);
+	if (rc) {
+		QETH_DBF_TEXT(trace, 2, "failed");
+		/* TODO: re-activate this warning as soon as we have a
+		 * clean mirco code
+		qeth_ipaddr_to_string(addr->proto, (u8 *)&addr->u, buf);
+		PRINT_WARN("Could not deregister IP address %s (rc=%x)\n",
+			   buf, rc);
+		*/
+	}
+	return rc;
+}
+
+static int
+qeth_netdev_init(struct net_device *dev)
+{
+	struct qeth_card *card;
+
+	card = (struct qeth_card *) dev->priv;
+
+	QETH_DBF_TEXT(trace,3,"initdev");
+
+	dev->tx_timeout = &qeth_tx_timeout;
+	dev->watchdog_timeo = QETH_TX_TIMEOUT;
+	dev->open = qeth_open;
+	dev->stop = qeth_stop;
+	dev->hard_start_xmit = qeth_hard_start_xmit;
+	dev->do_ioctl = qeth_do_ioctl;
+	dev->get_stats = qeth_get_stats;
+	dev->change_mtu = qeth_change_mtu;
+	dev->neigh_setup = qeth_neigh_setup;
+	dev->set_multicast_list = qeth_set_multicast_list;
+#ifdef CONFIG_QETH_VLAN
+	dev->vlan_rx_register = qeth_vlan_rx_register;
+	dev->vlan_rx_kill_vid = qeth_vlan_rx_kill_vid;
+#endif
+	if (qeth_get_netdev_flags(card->info.type) & IFF_NOARP) {
+		dev->rebuild_header = NULL;
+		dev->hard_header = NULL;
+		dev->header_cache_update = NULL;
+		dev->hard_header_cache = NULL;
+	}
+#ifdef CONFIG_QETH_IPV6
+	/*IPv6 address autoconfiguration stuff*/
+	card->dev->dev_id = card->info.unique_id & 0xffff;
+	if (!(card->info.unique_id & UNIQUE_ID_NOT_BY_CARD))
+		card->dev->generate_eui64 = qeth_ipv6_generate_eui64;
+
+
+#endif
+	dev->hard_header_parse = NULL;
+	dev->set_mac_address = NULL;
+	dev->flags |= qeth_get_netdev_flags(card->info.type);
+	if ((card->options.fake_broadcast) ||
+	    (card->info.broadcast_capable))
+		dev->flags |= IFF_BROADCAST;
+
+	dev->hard_header_len =
+		qeth_get_hlen(card->info.link_type) + card->options.add_hhlen;
+	dev->addr_len = OSA_ADDR_LEN;
+	dev->mtu = card->info.initial_mtu;
+
+	SET_MODULE_OWNER(dev);
+	return 0;
+}
+
+/**
+ * hardsetup card, initialize MPC and QDIO stuff
+ */
+static int
+qeth_hardsetup_card(struct qeth_card *card)
+{
+	int retries = 3;
+	int rc;
+
+	QETH_DBF_TEXT(setup, 2, "hrdsetup");
+
+retry:
+	if (retries < 3){
+		PRINT_WARN("Retrying to do IDX activates.\n");
+		ccw_device_set_offline(CARD_DDEV(card));
+		ccw_device_set_offline(CARD_WDEV(card));
+		ccw_device_set_offline(CARD_RDEV(card));
+		ccw_device_set_online(CARD_RDEV(card));
+		ccw_device_set_online(CARD_WDEV(card));
+		ccw_device_set_online(CARD_DDEV(card));
+	}
+	rc = qeth_qdio_clear_card(card,card->info.type==QETH_CARD_TYPE_OSAE);
+	if (rc == -ERESTARTSYS) {
+		QETH_DBF_TEXT(setup, 2, "break1");
+		return rc;
+	} else if (rc) {
+		QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
+		if (--retries < 0)
+			goto out;
+		else
+			goto retry;
+	}
+	if ((rc = qeth_get_unitaddr(card))){
+		QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
+		return rc;
+	}
+	qeth_init_tokens(card);
+	rc = qeth_idx_activate_channel(&card->read, qeth_idx_read_cb);
+	if (rc == -ERESTARTSYS) {
+		QETH_DBF_TEXT(setup, 2, "break2");
+		return rc;
+	} else if (rc) {
+		QETH_DBF_TEXT_(setup, 2, "3err%d", rc);
+		if (--retries < 0)
+			goto out;
+		else
+			goto retry;
+	}
+	rc = qeth_idx_activate_channel(&card->write, qeth_idx_write_cb);
+	if (rc == -ERESTARTSYS) {
+		QETH_DBF_TEXT(setup, 2, "break3");
+		return rc;
+	} else if (rc) {
+		QETH_DBF_TEXT_(setup, 2, "4err%d", rc);
+		if (--retries < 0)
+			goto out;
+		else
+			goto retry;
+	}
+	if ((rc = qeth_mpc_initialize(card))){
+		QETH_DBF_TEXT_(setup, 2, "5err%d", rc);
+		goto out;
+	}
+	/* at first set_online allocate netdev */
+	if (!card->dev){
+		card->dev = qeth_get_netdevice(card->info.type,
+					       card->info.link_type);
+		if (!card->dev){
+			qeth_qdio_clear_card(card, card->info.type ==
+					     QETH_CARD_TYPE_OSAE);
+			rc = -ENODEV;
+			QETH_DBF_TEXT_(setup, 2, "6err%d", rc);
+			goto out;
+		}
+		qeth_set_device_name(card);
+		card->dev->priv = card;
+		card->dev->type = qeth_get_arphdr_type(card->info.type,
+						       card->info.link_type);
+		card->dev->init = qeth_netdev_init;
+	}
+	return 0;
+out:
+	PRINT_ERR("Initialization in hardsetup failed! rc=%d\n", rc);
+	return rc;
+}
+
+static struct qeth_cmd_buffer *
+qeth_get_adapter_cmd(struct qeth_card *card, __u32 command)
+{
+	struct qeth_cmd_buffer *iob;
+	struct qeth_ipa_cmd *cmd;
+
+	iob = qeth_get_ipacmd_buffer(card,IPA_CMD_SETADAPTERPARMS,
+				     QETH_PROT_IPV4);
+	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+	cmd->data.setadapterparms.cmdlength =
+				sizeof(struct qeth_ipacmd_setadpparms);
+	cmd->data.setadapterparms.command_code = command;
+	cmd->data.setadapterparms.frames_used_total = 1;
+	cmd->data.setadapterparms.frame_seq_no = 1;
+
+	return iob;
+}
+
+static int
+qeth_default_setassparms_cb(struct qeth_card *card, struct qeth_reply *reply,
+			    unsigned long data)
+{
+	struct qeth_ipa_cmd *cmd;
+
+	QETH_DBF_TEXT(trace,4,"defadpcb");
+
+	cmd = (struct qeth_ipa_cmd *) data;
+	if (cmd->hdr.return_code == 0){
+		cmd->hdr.return_code = cmd->data.setassparms.hdr.return_code;
+		if (cmd->hdr.prot_version == QETH_PROT_IPV4)
+			card->options.ipa4.enabled_funcs = cmd->hdr.ipa_enabled;
+#ifdef CONFIG_QETH_IPV6
+		if (cmd->hdr.prot_version == QETH_PROT_IPV6)
+			card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled;
+#endif
+	}
+	if (cmd->data.setassparms.hdr.assist_no == IPA_INBOUND_CHECKSUM &&
+	    cmd->data.setassparms.hdr.command_code == IPA_CMD_ASS_START) {
+		card->info.csum_mask = cmd->data.setassparms.data.flags_32bit;
+		QETH_DBF_TEXT_(trace, 3, "csum:%d", card->info.csum_mask);
+	}
+	return 0;
+}
+
+static int
+qeth_default_setadapterparms_cb(struct qeth_card *card,
+				struct qeth_reply *reply,
+				unsigned long data)
+{
+	struct qeth_ipa_cmd *cmd;
+
+	QETH_DBF_TEXT(trace,4,"defadpcb");
+
+	cmd = (struct qeth_ipa_cmd *) data;
+	if (cmd->hdr.return_code == 0)
+		cmd->hdr.return_code = cmd->data.setadapterparms.return_code;
+	return 0;
+}
+
+static int
+qeth_query_setadapterparms_cb(struct qeth_card *card, struct qeth_reply *reply,
+			      unsigned long data)
+{
+	struct qeth_ipa_cmd *cmd;
+
+	QETH_DBF_TEXT(trace,3,"quyadpcb");
+
+	cmd = (struct qeth_ipa_cmd *) data;
+	if (cmd->data.setadapterparms.data.query_cmds_supp.lan_type & 0x7f)
+		card->info.link_type =
+		      cmd->data.setadapterparms.data.query_cmds_supp.lan_type;
+	card->options.adp.supported_funcs =
+		cmd->data.setadapterparms.data.query_cmds_supp.supported_cmds;
+	return qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
+}
+
+static int
+qeth_query_setadapterparms(struct qeth_card *card)
+{
+	int rc;
+	struct qeth_cmd_buffer *iob;
+
+	QETH_DBF_TEXT(trace,3,"queryadp");
+	iob = qeth_get_adapter_cmd(card,IPA_SETADP_QUERY_COMMANDS_SUPPORTED);
+	rc = qeth_send_ipa_cmd(card, iob, qeth_query_setadapterparms_cb, NULL);
+	return rc;
+}
+
+static int
+qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,
+				   struct qeth_reply *reply,
+				   unsigned long data)
+{
+	struct qeth_ipa_cmd *cmd;
+
+	QETH_DBF_TEXT(trace,4,"chgmaccb");
+
+	cmd = (struct qeth_ipa_cmd *) data;
+	memcpy(card->dev->dev_addr,
+	       &cmd->data.setadapterparms.data.change_addr.addr,OSA_ADDR_LEN);
+	qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
+	return 0;
+}
+
+static int
+qeth_setadpparms_change_macaddr(struct qeth_card *card)
+{
+	int rc;
+	struct qeth_cmd_buffer *iob;
+	struct qeth_ipa_cmd *cmd;
+
+	QETH_DBF_TEXT(trace,4,"chgmac");
+
+	iob = qeth_get_adapter_cmd(card,IPA_SETADP_ALTER_MAC_ADDRESS);
+	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+	cmd->data.setadapterparms.data.change_addr.cmd = CHANGE_ADDR_READ_MAC;
+	cmd->data.setadapterparms.data.change_addr.addr_size = OSA_ADDR_LEN;
+	memcpy(&cmd->data.setadapterparms.data.change_addr.addr,
+	       card->dev->dev_addr, OSA_ADDR_LEN);
+	rc = qeth_send_ipa_cmd(card, iob, qeth_setadpparms_change_macaddr_cb,
+			       NULL);
+	return rc;
+}
+
+static int
+qeth_send_setadp_mode(struct qeth_card *card, __u32 command, __u32 mode)
+{
+	int rc;
+	struct qeth_cmd_buffer *iob;
+	struct qeth_ipa_cmd *cmd;
+
+	QETH_DBF_TEXT(trace,4,"adpmode");
+
+	iob = qeth_get_adapter_cmd(card, command);
+	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+	cmd->data.setadapterparms.data.mode = mode;
+	rc = qeth_send_ipa_cmd(card, iob, qeth_default_setadapterparms_cb,
+			       NULL);
+	return rc;
+}
+
+static inline int
+qeth_setadapter_hstr(struct qeth_card *card)
+{
+	int rc;
+
+	QETH_DBF_TEXT(trace,4,"adphstr");
+
+	if (qeth_adp_supported(card,IPA_SETADP_SET_BROADCAST_MODE)) {
+		rc = qeth_send_setadp_mode(card, IPA_SETADP_SET_BROADCAST_MODE,
+					   card->options.broadcast_mode);
+		if (rc)
+			PRINT_WARN("couldn't set broadcast mode on "
+				   "device %s: x%x\n",
+				   CARD_BUS_ID(card), rc);
+		rc = qeth_send_setadp_mode(card, IPA_SETADP_ALTER_MAC_ADDRESS,
+					   card->options.macaddr_mode);
+		if (rc)
+			PRINT_WARN("couldn't set macaddr mode on "
+				   "device %s: x%x\n", CARD_BUS_ID(card), rc);
+		return rc;
+	}
+	if (card->options.broadcast_mode == QETH_TR_BROADCAST_LOCAL)
+		PRINT_WARN("set adapter parameters not available "
+			   "to set broadcast mode, using ALLRINGS "
+			   "on device %s:\n", CARD_BUS_ID(card));
+	if (card->options.macaddr_mode == QETH_TR_MACADDR_CANONICAL)
+		PRINT_WARN("set adapter parameters not available "
+			   "to set macaddr mode, using NONCANONICAL "
+			   "on device %s:\n", CARD_BUS_ID(card));
+	return 0;
+}
+
+static int
+qeth_setadapter_parms(struct qeth_card *card)
+{
+	int rc;
+
+	QETH_DBF_TEXT(setup, 2, "setadprm");
+
+	if (!qeth_is_supported(card, IPA_SETADAPTERPARMS)){
+		PRINT_WARN("set adapter parameters not supported "
+			   "on device %s.\n",
+			   CARD_BUS_ID(card));
+		QETH_DBF_TEXT(setup, 2, " notsupp");
+		return 0;
+	}
+	rc = qeth_query_setadapterparms(card);
+	if (rc) {
+		PRINT_WARN("couldn't set adapter parameters on device %s: "
+			   "x%x\n", CARD_BUS_ID(card), rc);
+		return rc;
+	}
+	if (qeth_adp_supported(card,IPA_SETADP_ALTER_MAC_ADDRESS)) {
+		rc = qeth_setadpparms_change_macaddr(card);
+		if (rc)
+			PRINT_WARN("couldn't get MAC address on "
+				   "device %s: x%x\n",
+				   CARD_BUS_ID(card), rc);
+	}
+
+	if ((card->info.link_type == QETH_LINK_TYPE_HSTR) ||
+	    (card->info.link_type == QETH_LINK_TYPE_LANE_TR))
+		rc = qeth_setadapter_hstr(card);
+
+	return rc;
+}
+
+
+static int
+qeth_send_startstoplan(struct qeth_card *card, enum qeth_ipa_cmds ipacmd,
+		       enum qeth_prot_versions prot)
+{
+	int rc;
+	struct qeth_cmd_buffer *iob;
+
+	iob = qeth_get_ipacmd_buffer(card,ipacmd,prot);
+	rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
+
+	return rc;
+}
+
+static int
+qeth_send_startlan(struct qeth_card *card, enum qeth_prot_versions prot)
+{
+	int rc;
+
+	QETH_DBF_TEXT_(setup, 2, "strtlan%i", prot);
+
+	rc = qeth_send_startstoplan(card, IPA_CMD_STARTLAN, prot);
+	return rc;
+}
+
+static int
+qeth_send_stoplan(struct qeth_card *card)
+{
+	int rc = 0;
+
+	/*
+	 * TODO: according to the IPA format document page 14,
+	 * TCP/IP (we!) never issue a STOPLAN
+	 * is this right ?!?
+	 */
+	QETH_DBF_TEXT(trace, 2, "stoplan");
+
+	rc = qeth_send_startstoplan(card, IPA_CMD_STOPLAN, QETH_PROT_IPV4);
+	return rc;
+}
+
+static int
+qeth_query_ipassists_cb(struct qeth_card *card, struct qeth_reply *reply,
+			unsigned long data)
+{
+	struct qeth_ipa_cmd *cmd;
+
+	QETH_DBF_TEXT(setup, 2, "qipasscb");
+
+	cmd = (struct qeth_ipa_cmd *) data;
+	if (cmd->hdr.prot_version == QETH_PROT_IPV4) {
+		card->options.ipa4.supported_funcs = cmd->hdr.ipa_supported;
+		card->options.ipa4.enabled_funcs = cmd->hdr.ipa_enabled;
+	} else {
+#ifdef CONFIG_QETH_IPV6
+		card->options.ipa6.supported_funcs = cmd->hdr.ipa_supported;
+		card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled;
+#endif
+	}
+	return 0;
+}
+
+static int
+qeth_query_ipassists(struct qeth_card *card, enum qeth_prot_versions prot)
+{
+	int rc;
+	struct qeth_cmd_buffer *iob;
+
+	QETH_DBF_TEXT_(setup, 2, "qipassi%i", prot);
+
+	iob = qeth_get_ipacmd_buffer(card,IPA_CMD_QIPASSIST,prot);
+	rc = qeth_send_ipa_cmd(card, iob, qeth_query_ipassists_cb, NULL);
+	return rc;
+}
+
+static struct qeth_cmd_buffer *
+qeth_get_setassparms_cmd(struct qeth_card *card, enum qeth_ipa_funcs ipa_func,
+			 __u16 cmd_code, __u16 len,
+			 enum qeth_prot_versions prot)
+{
+	struct qeth_cmd_buffer *iob;
+	struct qeth_ipa_cmd *cmd;
+
+	QETH_DBF_TEXT(trace,4,"getasscm");
+	iob = qeth_get_ipacmd_buffer(card,IPA_CMD_SETASSPARMS,prot);
+
+	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+	cmd->data.setassparms.hdr.assist_no = ipa_func;
+	cmd->data.setassparms.hdr.length = 8 + len;
+	cmd->data.setassparms.hdr.command_code = cmd_code;
+	cmd->data.setassparms.hdr.return_code = 0;
+	cmd->data.setassparms.hdr.seq_no = 0;
+
+	return iob;
+}
+
+static int
+qeth_send_setassparms(struct qeth_card *card, struct qeth_cmd_buffer *iob,
+		      __u16 len, long data,
+		      int (*reply_cb)
+		      (struct qeth_card *,struct qeth_reply *,unsigned long),
+		      void *reply_param)
+{
+	int rc;
+	struct qeth_ipa_cmd *cmd;
+
+	QETH_DBF_TEXT(trace,4,"sendassp");
+
+	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+	if (len <= sizeof(__u32))
+		cmd->data.setassparms.data.flags_32bit = (__u32) data;
+	else if (len > sizeof(__u32))
+		memcpy(&cmd->data.setassparms.data, (void *) data, len);
+
+	rc = qeth_send_ipa_cmd(card, iob, reply_cb, reply_param);
+	return rc;
+}
+
+#ifdef CONFIG_QETH_IPV6
+static int
+qeth_send_simple_setassparms_ipv6(struct qeth_card *card,
+				  enum qeth_ipa_funcs ipa_func, __u16 cmd_code)
+
+{
+	int rc;
+	struct qeth_cmd_buffer *iob;
+
+	QETH_DBF_TEXT(trace,4,"simassp6");
+	iob = qeth_get_setassparms_cmd(card, ipa_func, cmd_code,
+				       0, QETH_PROT_IPV6);
+	rc = qeth_send_setassparms(card, iob, 0, 0,
+				   qeth_default_setassparms_cb, NULL);
+	return rc;
+}
+#endif
+
+static int
+qeth_send_simple_setassparms(struct qeth_card *card,
+			     enum qeth_ipa_funcs ipa_func,
+			     __u16 cmd_code, long data)
+{
+	int rc;
+	int length = 0;
+	struct qeth_cmd_buffer *iob;
+
+	QETH_DBF_TEXT(trace,4,"simassp4");
+	if (data)
+		length = sizeof(__u32);
+	iob = qeth_get_setassparms_cmd(card, ipa_func, cmd_code,
+				       length, QETH_PROT_IPV4);
+	rc = qeth_send_setassparms(card, iob, length, data,
+				   qeth_default_setassparms_cb, NULL);
+	return rc;
+}
+
+static inline int
+qeth_start_ipa_arp_processing(struct qeth_card *card)
+{
+	int rc;
+
+	QETH_DBF_TEXT(trace,3,"ipaarp");
+
+	if (!qeth_is_supported(card,IPA_ARP_PROCESSING)) {
+		PRINT_WARN("ARP processing not supported "
+			   "on %s!\n", card->info.if_name);
+		return 0;
+	}
+	rc = qeth_send_simple_setassparms(card,IPA_ARP_PROCESSING,
+					  IPA_CMD_ASS_START, 0);
+	if (rc) {
+		PRINT_WARN("Could not start ARP processing "
+			   "assist on %s: 0x%x\n",
+			   card->info.if_name, rc);
+	}
+	return rc;
+}
+
+static int
+qeth_start_ipa_ip_fragmentation(struct qeth_card *card)
+{
+	int rc;
+
+	QETH_DBF_TEXT(trace,3,"ipaipfrg");
+
+	if (!qeth_is_supported(card, IPA_IP_FRAGMENTATION)) {
+		PRINT_INFO("IP fragmentation not supported on %s\n",
+			   card->info.if_name);
+		return  -EOPNOTSUPP;
+	}
+
+	rc = qeth_send_simple_setassparms(card, IPA_IP_FRAGMENTATION,
+					  IPA_CMD_ASS_START, 0);
+	if (rc) {
+		PRINT_WARN("Could not start IP fragmentation "
+			   "assist on %s: 0x%x\n",
+			   card->info.if_name, rc);
+	} else
+		PRINT_INFO("IP fragmentation enabled \n");
+	return rc;
+}
+
+static int
+qeth_start_ipa_source_mac(struct qeth_card *card)
+{
+	int rc;
+
+	QETH_DBF_TEXT(trace,3,"stsrcmac");
+
+	if (!card->options.fake_ll)
+		return -EOPNOTSUPP;
+
+	if (!qeth_is_supported(card, IPA_SOURCE_MAC)) {
+		PRINT_INFO("Inbound source address not "
+			   "supported on %s\n", card->info.if_name);
+		return -EOPNOTSUPP;
+	}
+
+	rc = qeth_send_simple_setassparms(card, IPA_SOURCE_MAC,
+					  IPA_CMD_ASS_START, 0);
+	if (rc)
+		PRINT_WARN("Could not start inbound source "
+			   "assist on %s: 0x%x\n",
+			   card->info.if_name, rc);
+	return rc;
+}
+
+static int
+qeth_start_ipa_vlan(struct qeth_card *card)
+{
+	int rc = 0;
+
+	QETH_DBF_TEXT(trace,3,"strtvlan");
+
+#ifdef CONFIG_QETH_VLAN
+	if (!qeth_is_supported(card, IPA_FULL_VLAN)) {
+		PRINT_WARN("VLAN not supported on %s\n", card->info.if_name);
+		return -EOPNOTSUPP;
+	}
+
+	rc = qeth_send_simple_setassparms(card, IPA_VLAN_PRIO,
+					  IPA_CMD_ASS_START,0);
+	if (rc) {
+		PRINT_WARN("Could not start vlan "
+			   "assist on %s: 0x%x\n",
+			   card->info.if_name, rc);
+	} else {
+		PRINT_INFO("VLAN enabled \n");
+		card->dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
+	}
+#endif /* QETH_VLAN */
+	return rc;
+}
+
+static int
+qeth_start_ipa_multicast(struct qeth_card *card)
+{
+	int rc;
+
+	QETH_DBF_TEXT(trace,3,"stmcast");
+
+	if (!qeth_is_supported(card, IPA_MULTICASTING)) {
+		PRINT_WARN("Multicast not supported on %s\n",
+			   card->info.if_name);
+		return -EOPNOTSUPP;
+	}
+
+	rc = qeth_send_simple_setassparms(card, IPA_MULTICASTING,
+					  IPA_CMD_ASS_START,0);
+	if (rc) {
+		PRINT_WARN("Could not start multicast "
+			   "assist on %s: rc=%i\n",
+			   card->info.if_name, rc);
+	} else {
+		PRINT_INFO("Multicast enabled\n");
+		card->dev->flags |= IFF_MULTICAST;
+	}
+	return rc;
+}
+
+#ifdef CONFIG_QETH_IPV6
+static int
+qeth_softsetup_ipv6(struct qeth_card *card)
+{
+	int rc;
+
+	QETH_DBF_TEXT(trace,3,"softipv6");
+
+	netif_stop_queue(card->dev);
+	rc = qeth_send_startlan(card, QETH_PROT_IPV6);
+	if (rc) {
+		PRINT_ERR("IPv6 startlan failed on %s\n",
+			  card->info.if_name);
+		return rc;
+	}
+	netif_wake_queue(card->dev);
+	rc = qeth_query_ipassists(card,QETH_PROT_IPV6);
+	if (rc) {
+		PRINT_ERR("IPv6 query ipassist failed on %s\n",
+			  card->info.if_name);
+		return rc;
+	}
+	rc = qeth_send_simple_setassparms(card, IPA_IPV6,
+					  IPA_CMD_ASS_START, 3);
+	if (rc) {
+		PRINT_WARN("IPv6 start assist (version 4) failed "
+			   "on %s: 0x%x\n",
+			   card->info.if_name, rc);
+		return rc;
+	}
+	rc = qeth_send_simple_setassparms_ipv6(card, IPA_IPV6,
+					       IPA_CMD_ASS_START);
+	if (rc) {
+		PRINT_WARN("IPV6 start assist (version 6) failed  "
+			   "on %s: 0x%x\n",
+			   card->info.if_name, rc);
+		return rc;
+	}
+	rc = qeth_send_simple_setassparms_ipv6(card, IPA_PASSTHRU,
+					       IPA_CMD_ASS_START);
+	if (rc) {
+		PRINT_WARN("Could not enable passthrough "
+			   "on %s: 0x%x\n",
+			   card->info.if_name, rc);
+		return rc;
+	}
+	PRINT_INFO("IPV6 enabled \n");
+	return 0;
+}
+
+#endif
+
+static int
+qeth_start_ipa_ipv6(struct qeth_card *card)
+{
+	int rc = 0;
+#ifdef CONFIG_QETH_IPV6
+	QETH_DBF_TEXT(trace,3,"strtipv6");
+
+	if (!qeth_is_supported(card, IPA_IPV6)) {
+		PRINT_WARN("IPv6 not supported on %s\n",
+			   card->info.if_name);
+		return 0;
+	}
+	rc = qeth_softsetup_ipv6(card);
+#endif
+	return rc ;
+}
+
+static int
+qeth_start_ipa_broadcast(struct qeth_card *card)
+{
+	int rc;
+
+	QETH_DBF_TEXT(trace,3,"stbrdcst");
+	if (!qeth_is_supported(card, IPA_FILTERING)) {
+		PRINT_WARN("Broadcast not supported on %s\n",
+			   card->info.if_name);
+		return -EOPNOTSUPP;
+	}
+	rc = qeth_send_simple_setassparms(card, IPA_FILTERING,
+					  IPA_CMD_ASS_START, 0);
+	if (rc) {
+		PRINT_WARN("Could not enable broadcasting "
+			   "on %s: 0x%x\n",
+			   card->info.if_name, rc);
+		return rc;
+	}
+
+	rc = qeth_send_simple_setassparms(card, IPA_FILTERING,
+					  IPA_CMD_ASS_CONFIGURE, 1);
+	if (rc) {
+		PRINT_WARN("Could not set up broadcast filtering on %s: 0x%x\n",
+			   card->info.if_name, rc);
+		return rc;
+	}
+	PRINT_INFO("Broadcast enabled \n");
+	card->dev->flags |= IFF_BROADCAST;
+	card->info.broadcast_capable = 1;
+	return 0;
+}
+
+static int
+qeth_send_checksum_command(struct qeth_card *card)
+{
+	int rc;
+
+	rc = qeth_send_simple_setassparms(card, IPA_INBOUND_CHECKSUM,
+					  IPA_CMD_ASS_START, 0);
+	if (rc) {
+		PRINT_WARN("Starting Inbound HW Checksumming failed on %s: "
+			   "0x%x,\ncontinuing using Inbound SW Checksumming\n",
+			   card->info.if_name, rc);
+		return rc;
+	}
+	rc = qeth_send_simple_setassparms(card, IPA_INBOUND_CHECKSUM,
+					  IPA_CMD_ASS_ENABLE,
+					  card->info.csum_mask);
+	if (rc) {
+		PRINT_WARN("Enabling Inbound HW Checksumming failed on %s: "
+			   "0x%x,\ncontinuing using Inbound SW Checksumming\n",
+			   card->info.if_name, rc);
+		return rc;
+	}
+	return 0;
+}
+
+static int
+qeth_start_ipa_checksum(struct qeth_card *card)
+{
+	int rc = 0;
+
+	QETH_DBF_TEXT(trace,3,"strtcsum");
+
+	if (card->options.checksum_type == NO_CHECKSUMMING) {
+		PRINT_WARN("Using no checksumming on %s.\n",
+			   card->info.if_name);
+		return 0;
+	}
+	if (card->options.checksum_type == SW_CHECKSUMMING) {
+		PRINT_WARN("Using SW checksumming on %s.\n",
+			   card->info.if_name);
+		return 0;
+	}
+	if (!qeth_is_supported(card, IPA_INBOUND_CHECKSUM)) {
+		PRINT_WARN("Inbound HW Checksumming not "
+			   "supported on %s,\ncontinuing "
+			   "using Inbound SW Checksumming\n",
+			   card->info.if_name);
+		card->options.checksum_type = SW_CHECKSUMMING;
+		return 0;
+	}
+	rc = qeth_send_checksum_command(card);
+	if (!rc) {
+		PRINT_INFO("HW Checksumming (inbound) enabled \n");
+	}
+	return rc;
+}
+
+/*
+static inline void
+qeth_print_ipassist_status(struct qeth_card *card)
+{
+	char buf[255];
+	int offset = 0;
+
+	offset += sprintf(buf, "IPAssist options of %s: ", card->info.if_name);
+	if (qeth_is_enabled(card, IPA_ARP_PROCESSING))
+		offset += sprintf(buf+offset, "ARP ");
+	if (qeth_is_enabled(card, IPA_IP_FRAGMENTATION))
+		offset += sprintf(buf+offset, "IP_FRAG");
+	if (qeth_is_enabled(card, IPA_SOURCE_MAC))
+		offset += sprintf(buf+offset, "SRC_MAC");
+	if (qeth_is_enabled(card, IPA_FULL_VLAN))
+		offset += sprintf(buf+offset, "VLAN");
+	if (qeth_is_enabled(card, IPA_VLAN_PRIO))
+		offset += sprintf(buf+offset, "VLAN_PRIO");
+}
+*/
+
+static int
+qeth_start_ipassists(struct qeth_card *card)
+{
+	QETH_DBF_TEXT(trace,3,"strtipas");
+	qeth_start_ipa_arp_processing(card);	/* go on*/
+	qeth_start_ipa_ip_fragmentation(card); 	/* go on*/
+	qeth_start_ipa_source_mac(card);	/* go on*/
+	qeth_start_ipa_vlan(card);		/* go on*/
+	qeth_start_ipa_multicast(card);		/* go on*/
+	qeth_start_ipa_ipv6(card);		/* go on*/
+	qeth_start_ipa_broadcast(card);		/* go on*/
+	qeth_start_ipa_checksum(card);		/* go on*/
+	return 0;
+}
+
+static int
+qeth_send_setrouting(struct qeth_card *card, enum qeth_routing_types type,
+		     enum qeth_prot_versions prot)
+{
+	int rc;
+	struct qeth_ipa_cmd *cmd;
+	struct qeth_cmd_buffer *iob;
+
+	QETH_DBF_TEXT(trace,4,"setroutg");
+	iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETRTG, prot);
+	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+	cmd->data.setrtg.type = (type);
+	rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
+
+	return rc;
+
+}
+
+int
+qeth_setrouting_v4(struct qeth_card *card)
+{
+	int rc;
+
+	QETH_DBF_TEXT(trace,3,"setrtg4");
+
+	if (card->options.route4.type == NO_ROUTER)
+		return 0;
+
+	rc = qeth_send_setrouting(card, card->options.route4.type,
+				  QETH_PROT_IPV4);
+	if (rc) {
+ 		card->options.route4.type = NO_ROUTER;
+		PRINT_WARN("Error (0x%04x) while setting routing type on %s. "
+			   "Type set to 'no router'.\n",
+			   rc, card->info.if_name);
+	}
+	return rc;
+}
+
+int
+qeth_setrouting_v6(struct qeth_card *card)
+{
+	int rc = 0;
+
+	QETH_DBF_TEXT(trace,3,"setrtg6");
+#ifdef CONFIG_QETH_IPV6
+
+	if ((card->options.route6.type == NO_ROUTER) ||
+	    ((card->info.type == QETH_CARD_TYPE_OSAE) &&
+	     (card->options.route6.type == MULTICAST_ROUTER) &&
+	     !qeth_is_supported6(card,IPA_OSA_MC_ROUTER)))
+		return 0;
+	rc = qeth_send_setrouting(card, card->options.route6.type,
+				  QETH_PROT_IPV6);
+	if (rc) {
+	 	card->options.route6.type = NO_ROUTER;
+		PRINT_WARN("Error (0x%04x) while setting routing type on %s. "
+			   "Type set to 'no router'.\n",
+			   rc, card->info.if_name);
+	}
+#endif
+	return rc;
+}
+
+/*
+ * softsetup card: init IPA stuff
+ */
+static int
+qeth_softsetup_card(struct qeth_card *card)
+{
+	int rc;
+
+	QETH_DBF_TEXT(setup, 2, "softsetp");
+
+	if ((rc = qeth_send_startlan(card, QETH_PROT_IPV4))){
+		QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
+		if (rc == 0xe080){
+			PRINT_WARN("LAN on card %s if offline! "
+				   "Continuing softsetup.\n",
+				   CARD_BUS_ID(card));
+			card->lan_online = 0;
+		} else
+			return rc;
+	} else
+		card->lan_online = 1;
+	if ((rc = qeth_setadapter_parms(card)))
+		QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
+	if ((rc = qeth_start_ipassists(card)))
+		QETH_DBF_TEXT_(setup, 2, "3err%d", rc);
+	if ((rc = qeth_setrouting_v4(card)))
+		QETH_DBF_TEXT_(setup, 2, "4err%d", rc);
+	if ((rc = qeth_setrouting_v6(card)))
+		QETH_DBF_TEXT_(setup, 2, "5err%d", rc);
+	netif_stop_queue(card->dev);
+	return 0;
+}
+
+#ifdef CONFIG_QETH_IPV6
+static int
+qeth_get_unique_id_cb(struct qeth_card *card, struct qeth_reply *reply,
+		      unsigned long data)
+{
+	struct qeth_ipa_cmd *cmd;
+
+	cmd = (struct qeth_ipa_cmd *) data;
+	if (cmd->hdr.return_code == 0)
+		card->info.unique_id = *((__u16 *)
+				&cmd->data.create_destroy_addr.unique_id[6]);
+	else {
+		card->info.unique_id =  UNIQUE_ID_IF_CREATE_ADDR_FAILED |
+					UNIQUE_ID_NOT_BY_CARD;
+		PRINT_WARN("couldn't get a unique id from the card on device "
+			   "%s (result=x%x), using default id. ipv6 "
+			   "autoconfig on other lpars may lead to duplicate "
+			   "ip addresses. please use manually "
+			   "configured ones.\n",
+			   CARD_BUS_ID(card), cmd->hdr.return_code);
+	}
+	return 0;
+}
+#endif
+
+static int
+qeth_put_unique_id(struct qeth_card *card)
+{
+
+	int rc = 0;
+#ifdef CONFIG_QETH_IPV6
+	struct qeth_cmd_buffer *iob;
+	struct qeth_ipa_cmd *cmd;
+
+	QETH_DBF_TEXT(trace,2,"puniqeid");
+
+	if ((card->info.unique_id & UNIQUE_ID_NOT_BY_CARD) ==
+	    	UNIQUE_ID_NOT_BY_CARD)
+		return -1;
+	iob = qeth_get_ipacmd_buffer(card, IPA_CMD_DESTROY_ADDR,
+				     QETH_PROT_IPV6);
+	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+	*((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) =
+		            card->info.unique_id;
+	memcpy(&cmd->data.create_destroy_addr.unique_id[0],
+	       card->dev->dev_addr, OSA_ADDR_LEN);
+	rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
+#else
+	card->info.unique_id =  UNIQUE_ID_IF_CREATE_ADDR_FAILED |
+				UNIQUE_ID_NOT_BY_CARD;
+#endif
+	return rc;
+}
+
+/**
+ * Clear IP List
+ */
+static void
+qeth_clear_ip_list(struct qeth_card *card, int clean, int recover)
+{
+	struct qeth_ipaddr *addr, *tmp;
+	int first_run = 1;
+	unsigned long flags;
+
+	QETH_DBF_TEXT(trace,4,"clearip");
+	spin_lock_irqsave(&card->ip_lock, flags);
+	/* clear todo list */
+	list_for_each_entry_safe(addr, tmp, &card->ip_tbd_list, entry){
+		list_del(&addr->entry);
+		kfree(addr);
+	}
+again:
+	if (first_run)
+		first_run = 0;
+	else
+		spin_lock_irqsave(&card->ip_lock, flags);
+
+	list_for_each_entry_safe(addr, tmp, &card->ip_list, entry) {
+		list_del_init(&addr->entry);
+		if (clean){
+			spin_unlock_irqrestore(&card->ip_lock, flags);
+			qeth_deregister_addr_entry(card, addr);
+		}
+		if (!recover || addr->is_multicast)
+			kfree(addr);
+		else {
+			if (clean)
+				spin_lock_irqsave(&card->ip_lock, flags);
+			list_add_tail(&addr->entry, &card->ip_tbd_list);
+			if (clean) {
+				spin_unlock_irqrestore(&card->ip_lock, flags);
+				goto again;
+			}
+		}
+	}
+	spin_unlock_irqrestore(&card->ip_lock, flags);
+}
+
+static void
+qeth_set_allowed_threads(struct qeth_card *card, unsigned long threads,
+			 int clear_start_mask)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&card->thread_mask_lock, flags);
+	card->thread_allowed_mask = threads;
+	if (clear_start_mask)
+		card->thread_start_mask &= threads;
+	spin_unlock_irqrestore(&card->thread_mask_lock, flags);
+	wake_up(&card->wait_q);
+}
+
+static inline int
+qeth_threads_running(struct qeth_card *card, unsigned long threads)
+{
+	unsigned long flags;
+	int rc = 0;
+
+	spin_lock_irqsave(&card->thread_mask_lock, flags);
+	rc = (card->thread_running_mask & threads);
+	spin_unlock_irqrestore(&card->thread_mask_lock, flags);
+	return rc;
+}
+
+static int
+qeth_wait_for_threads(struct qeth_card *card, unsigned long threads)
+{
+	return wait_event_interruptible(card->wait_q,
+			qeth_threads_running(card, threads) == 0);
+}
+
+static int
+qeth_stop_card(struct qeth_card *card)
+{
+	int recover_flag = 0;
+	int rc = 0;
+
+	QETH_DBF_TEXT(setup ,2,"stopcard");
+	QETH_DBF_HEX(setup, 2, &card, sizeof(void *));
+
+	qeth_set_allowed_threads(card, 0, 1);
+	if (qeth_wait_for_threads(card, ~QETH_RECOVER_THREAD))
+		return -ERESTARTSYS;
+	if (card->read.state == CH_STATE_UP &&
+	    card->write.state == CH_STATE_UP &&
+	    ((card->state == CARD_STATE_UP_LAN_ONLINE) ||
+	     (card->state == CARD_STATE_UP_LAN_OFFLINE))) {
+		recover_flag = 1;
+		rtnl_lock();
+		dev_close(card->dev);
+		rtnl_unlock();
+		if (!card->use_hard_stop)
+			if ((rc = qeth_send_stoplan(card)))
+				QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
+		card->state = CARD_STATE_SOFTSETUP;
+	}
+	if (card->state == CARD_STATE_SOFTSETUP) {
+		qeth_clear_ip_list(card, !card->use_hard_stop, recover_flag);
+		qeth_clear_ipacmd_list(card);
+		card->state = CARD_STATE_HARDSETUP;
+	}
+	if (card->state == CARD_STATE_HARDSETUP) {
+		if (!card->use_hard_stop)
+			if ((rc = qeth_put_unique_id(card)))
+				QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
+		qeth_qdio_clear_card(card, 0);
+		qeth_clear_qdio_buffers(card);
+		qeth_clear_working_pool_list(card);
+		card->state = CARD_STATE_DOWN;
+	}
+	if (card->state == CARD_STATE_DOWN) {
+		qeth_clear_cmd_buffers(&card->read);
+		qeth_clear_cmd_buffers(&card->write);
+	}
+	card->use_hard_stop = 0;
+	return rc;
+}
+
+
+static int
+qeth_get_unique_id(struct qeth_card *card)
+{
+	int rc = 0;
+#ifdef CONFIG_QETH_IPV6
+	struct qeth_cmd_buffer *iob;
+	struct qeth_ipa_cmd *cmd;
+
+	QETH_DBF_TEXT(setup, 2, "guniqeid");
+
+	if (!qeth_is_supported(card,IPA_IPV6)) {
+		card->info.unique_id =  UNIQUE_ID_IF_CREATE_ADDR_FAILED |
+					UNIQUE_ID_NOT_BY_CARD;
+		return 0;
+	}
+
+	iob = qeth_get_ipacmd_buffer(card, IPA_CMD_CREATE_ADDR,
+				     QETH_PROT_IPV6);
+	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+	*((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) =
+		            card->info.unique_id;
+
+	rc = qeth_send_ipa_cmd(card, iob, qeth_get_unique_id_cb, NULL);
+#else
+	card->info.unique_id =  UNIQUE_ID_IF_CREATE_ADDR_FAILED |
+				UNIQUE_ID_NOT_BY_CARD;
+#endif
+	return rc;
+}
+static void
+qeth_print_status_with_portname(struct qeth_card *card)
+{
+	char dbf_text[15];
+	int i;
+
+	sprintf(dbf_text, "%s", card->info.portname + 1);
+	for (i = 0; i < 8; i++)
+		dbf_text[i] =
+			(char) _ebcasc[(__u8) dbf_text[i]];
+	dbf_text[8] = 0;
+	printk("qeth: Device %s/%s/%s is a%s card%s%s%s\n"
+	       "with link type %s (portname: %s)\n",
+	       CARD_RDEV_ID(card),
+	       CARD_WDEV_ID(card),
+	       CARD_DDEV_ID(card),
+	       qeth_get_cardname(card),
+	       (card->info.mcl_level[0]) ? " (level: " : "",
+	       (card->info.mcl_level[0]) ? card->info.mcl_level : "",
+	       (card->info.mcl_level[0]) ? ")" : "",
+	       qeth_get_cardname_short(card),
+	       dbf_text);
+
+}
+
+static void
+qeth_print_status_no_portname(struct qeth_card *card)
+{
+	if (card->info.portname[0])
+		printk("qeth: Device %s/%s/%s is a%s "
+		       "card%s%s%s\nwith link type %s "
+		       "(no portname needed by interface).\n",
+		       CARD_RDEV_ID(card),
+		       CARD_WDEV_ID(card),
+		       CARD_DDEV_ID(card),
+		       qeth_get_cardname(card),
+		       (card->info.mcl_level[0]) ? " (level: " : "",
+		       (card->info.mcl_level[0]) ? card->info.mcl_level : "",
+		       (card->info.mcl_level[0]) ? ")" : "",
+		       qeth_get_cardname_short(card));
+	else
+		printk("qeth: Device %s/%s/%s is a%s "
+		       "card%s%s%s\nwith link type %s.\n",
+		       CARD_RDEV_ID(card),
+		       CARD_WDEV_ID(card),
+		       CARD_DDEV_ID(card),
+		       qeth_get_cardname(card),
+		       (card->info.mcl_level[0]) ? " (level: " : "",
+		       (card->info.mcl_level[0]) ? card->info.mcl_level : "",
+		       (card->info.mcl_level[0]) ? ")" : "",
+		       qeth_get_cardname_short(card));
+}
+
+static void
+qeth_print_status_message(struct qeth_card *card)
+{
+	switch (card->info.type) {
+	case QETH_CARD_TYPE_OSAE:
+		/* VM will use a non-zero first character
+		 * to indicate a HiperSockets like reporting
+		 * of the level OSA sets the first character to zero
+		 * */
+		if (!card->info.mcl_level[0]) {
+			sprintf(card->info.mcl_level,"%02x%02x",
+				card->info.mcl_level[2],
+				card->info.mcl_level[3]);
+
+			card->info.mcl_level[QETH_MCL_LENGTH] = 0;
+			break;
+		}
+		/* fallthrough */
+	case QETH_CARD_TYPE_IQD:
+		card->info.mcl_level[0] = (char) _ebcasc[(__u8)
+			card->info.mcl_level[0]];
+		card->info.mcl_level[1] = (char) _ebcasc[(__u8)
+			card->info.mcl_level[1]];
+		card->info.mcl_level[2] = (char) _ebcasc[(__u8)
+			card->info.mcl_level[2]];
+		card->info.mcl_level[3] = (char) _ebcasc[(__u8)
+			card->info.mcl_level[3]];
+		card->info.mcl_level[QETH_MCL_LENGTH] = 0;
+		break;
+	default:
+		memset(&card->info.mcl_level[0], 0, QETH_MCL_LENGTH + 1);
+	}
+	if (card->info.portname_required)
+		qeth_print_status_with_portname(card);
+	else
+		qeth_print_status_no_portname(card);
+}
+
+static int
+qeth_register_netdev(struct qeth_card *card)
+{
+	int rc;
+
+	QETH_DBF_TEXT(setup, 3, "regnetd");
+	if (card->dev->reg_state != NETREG_UNINITIALIZED)
+		return 0;
+	/* sysfs magic */
+	SET_NETDEV_DEV(card->dev, &card->gdev->dev);
+	rc = register_netdev(card->dev);
+	if (!rc)
+		strcpy(card->info.if_name, card->dev->name);
+
+	return rc;
+}
+
+static void
+qeth_start_again(struct qeth_card *card)
+{
+	QETH_DBF_TEXT(setup ,2, "startag");
+
+	rtnl_lock();
+	dev_open(card->dev);
+	rtnl_unlock();
+	qeth_set_thread_start_bit(card, QETH_SET_MC_THREAD);
+	schedule_work(&card->kernel_thread_starter);
+}
+
+static int
+qeth_set_online(struct ccwgroup_device *gdev)
+{
+	struct qeth_card *card = gdev->dev.driver_data;
+	int rc = 0;
+	enum qeth_card_states recover_flag;
+
+	BUG_ON(!card);
+	QETH_DBF_TEXT(setup ,2, "setonlin");
+	QETH_DBF_HEX(setup, 2, &card, sizeof(void *));
+
+	qeth_set_allowed_threads(card, QETH_RECOVER_THREAD, 1);
+	if (qeth_wait_for_threads(card, ~QETH_RECOVER_THREAD)){
+		PRINT_WARN("set_online of card %s interrupted by user!\n",
+			   CARD_BUS_ID(card));
+		return -ERESTARTSYS;
+	}
+
+	recover_flag = card->state;
+	if (ccw_device_set_online(CARD_RDEV(card)) ||
+	    ccw_device_set_online(CARD_WDEV(card)) ||
+	    ccw_device_set_online(CARD_DDEV(card))){
+		QETH_DBF_TEXT_(setup, 2, "1err%d", rc);
+		return -EIO;
+	}
+
+	if ((rc = qeth_hardsetup_card(card))){
+		QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
+		goto out_remove;
+	}
+	card->state = CARD_STATE_HARDSETUP;
+
+	if ((rc = qeth_query_ipassists(card,QETH_PROT_IPV4))){
+		QETH_DBF_TEXT_(setup, 2, "3err%d", rc);
+		/*TODO: rc !=0*/
+	} else
+		rc = qeth_get_unique_id(card);
+
+	if (rc) {
+		QETH_DBF_TEXT_(setup, 2, "4err%d", rc);
+		goto out_remove;
+	}
+	qeth_print_status_message(card);
+	if ((rc = qeth_register_netdev(card))){
+		QETH_DBF_TEXT_(setup, 2, "5err%d", rc);
+		goto out_remove;
+	}
+	if ((rc = qeth_softsetup_card(card))){
+		QETH_DBF_TEXT_(setup, 2, "6err%d", rc);
+		goto out_remove;
+	}
+	card->state = CARD_STATE_SOFTSETUP;
+
+	if ((rc = qeth_init_qdio_queues(card))){
+		QETH_DBF_TEXT_(setup, 2, "7err%d", rc);
+		goto out_remove;
+	}
+/*maybe it was set offline without ifconfig down
+ * we can also use this state for recovery purposes*/
+	qeth_set_allowed_threads(card, 0xffffffff, 0);
+	if (recover_flag == CARD_STATE_RECOVER)
+		qeth_start_again(card);
+
+	return 0;
+out_remove:
+	card->use_hard_stop = 1;
+	qeth_stop_card(card);
+	ccw_device_set_offline(CARD_DDEV(card));
+	ccw_device_set_offline(CARD_WDEV(card));
+	ccw_device_set_offline(CARD_RDEV(card));
+	if (recover_flag == CARD_STATE_RECOVER)
+		card->state = CARD_STATE_RECOVER;
+	else
+		card->state = CARD_STATE_DOWN;
+	return -ENODEV;
+}
+
+static struct ccw_device_id qeth_ids[] = {
+	{CCW_DEVICE(0x1731, 0x01), driver_info:QETH_CARD_TYPE_OSAE},
+	{CCW_DEVICE(0x1731, 0x05), driver_info:QETH_CARD_TYPE_IQD},
+	{},
+};
+MODULE_DEVICE_TABLE(ccw, qeth_ids);
+
+struct device *qeth_root_dev = NULL;
+
+struct ccwgroup_driver qeth_ccwgroup_driver = {
+	.owner = THIS_MODULE,
+	.name = "qeth",
+	.driver_id = 0xD8C5E3C8,
+	.probe = qeth_probe_device,
+	.remove = qeth_remove_device,
+	.set_online = qeth_set_online,
+	.set_offline = qeth_set_offline,
+};
+
+struct ccw_driver qeth_ccw_driver = {
+	.name = "qeth",
+	.ids = qeth_ids,
+	.probe = ccwgroup_probe_ccwdev,
+	.remove = ccwgroup_remove_ccwdev,
+};
+
+
+static void
+qeth_unregister_dbf_views(void)
+{
+	if (qeth_dbf_setup)
+		debug_unregister(qeth_dbf_setup);
+	if (qeth_dbf_qerr)
+		debug_unregister(qeth_dbf_qerr);
+	if (qeth_dbf_sense)
+		debug_unregister(qeth_dbf_sense);
+	if (qeth_dbf_misc)
+		debug_unregister(qeth_dbf_misc);
+	if (qeth_dbf_data)
+		debug_unregister(qeth_dbf_data);
+	if (qeth_dbf_control)
+		debug_unregister(qeth_dbf_control);
+	if (qeth_dbf_trace)
+		debug_unregister(qeth_dbf_trace);
+}
+static int
+qeth_register_dbf_views(void)
+{
+	qeth_dbf_setup = debug_register(QETH_DBF_SETUP_NAME,
+					QETH_DBF_SETUP_INDEX,
+					QETH_DBF_SETUP_NR_AREAS,
+					QETH_DBF_SETUP_LEN);
+	qeth_dbf_misc = debug_register(QETH_DBF_MISC_NAME,
+				       QETH_DBF_MISC_INDEX,
+				       QETH_DBF_MISC_NR_AREAS,
+				       QETH_DBF_MISC_LEN);
+	qeth_dbf_data = debug_register(QETH_DBF_DATA_NAME,
+				       QETH_DBF_DATA_INDEX,
+				       QETH_DBF_DATA_NR_AREAS,
+				       QETH_DBF_DATA_LEN);
+	qeth_dbf_control = debug_register(QETH_DBF_CONTROL_NAME,
+					  QETH_DBF_CONTROL_INDEX,
+					  QETH_DBF_CONTROL_NR_AREAS,
+					  QETH_DBF_CONTROL_LEN);
+	qeth_dbf_sense = debug_register(QETH_DBF_SENSE_NAME,
+					QETH_DBF_SENSE_INDEX,
+					QETH_DBF_SENSE_NR_AREAS,
+					QETH_DBF_SENSE_LEN);
+	qeth_dbf_qerr = debug_register(QETH_DBF_QERR_NAME,
+				       QETH_DBF_QERR_INDEX,
+				       QETH_DBF_QERR_NR_AREAS,
+				       QETH_DBF_QERR_LEN);
+	qeth_dbf_trace = debug_register(QETH_DBF_TRACE_NAME,
+					QETH_DBF_TRACE_INDEX,
+					QETH_DBF_TRACE_NR_AREAS,
+					QETH_DBF_TRACE_LEN);
+
+	if ((qeth_dbf_setup == NULL) || (qeth_dbf_misc == NULL)    ||
+	    (qeth_dbf_data == NULL)  || (qeth_dbf_control == NULL) ||
+	    (qeth_dbf_sense == NULL) || (qeth_dbf_qerr == NULL)    ||
+	    (qeth_dbf_trace == NULL)) {
+		qeth_unregister_dbf_views();
+		return -ENOMEM;
+	}
+	debug_register_view(qeth_dbf_setup, &debug_hex_ascii_view);
+	debug_set_level(qeth_dbf_setup, QETH_DBF_SETUP_LEVEL);
+
+	debug_register_view(qeth_dbf_misc, &debug_hex_ascii_view);
+	debug_set_level(qeth_dbf_misc, QETH_DBF_MISC_LEVEL);
+
+	debug_register_view(qeth_dbf_data, &debug_hex_ascii_view);
+	debug_set_level(qeth_dbf_data, QETH_DBF_DATA_LEVEL);
+
+	debug_register_view(qeth_dbf_control, &debug_hex_ascii_view);
+	debug_set_level(qeth_dbf_control, QETH_DBF_CONTROL_LEVEL);
+
+	debug_register_view(qeth_dbf_sense, &debug_hex_ascii_view);
+	debug_set_level(qeth_dbf_sense, QETH_DBF_SENSE_LEVEL);
+
+	debug_register_view(qeth_dbf_qerr, &debug_hex_ascii_view);
+	debug_set_level(qeth_dbf_qerr, QETH_DBF_QERR_LEVEL);
+
+	debug_register_view(qeth_dbf_trace, &debug_hex_ascii_view);
+	debug_set_level(qeth_dbf_trace, QETH_DBF_TRACE_LEVEL);
+
+	return 0;
+}
+
+#ifdef CONFIG_QETH_IPV6
+extern struct neigh_table arp_tbl;
+static struct neigh_ops *arp_direct_ops;
+static int (*qeth_old_arp_constructor) (struct neighbour *);
+
+static struct neigh_ops arp_direct_ops_template = {
+	.family = AF_INET,
+	.destructor = NULL,
+	.solicit = NULL,
+	.error_report = NULL,
+	.output = dev_queue_xmit,
+	.connected_output = dev_queue_xmit,
+	.hh_output = dev_queue_xmit,
+	.queue_xmit = dev_queue_xmit
+};
+
+static int
+qeth_arp_constructor(struct neighbour *neigh)
+{
+	struct net_device *dev = neigh->dev;
+	struct in_device *in_dev = in_dev_get(dev);
+
+	if (in_dev == NULL)
+		return -EINVAL;
+	if (!qeth_verify_dev(dev)) {
+		in_dev_put(in_dev);
+		return qeth_old_arp_constructor(neigh);
+	}
+
+	neigh->type = inet_addr_type(*(u32 *) neigh->primary_key);
+	if (in_dev->arp_parms)
+		neigh->parms = in_dev->arp_parms;
+	in_dev_put(in_dev);
+	neigh->nud_state = NUD_NOARP;
+	neigh->ops = arp_direct_ops;
+	neigh->output = neigh->ops->queue_xmit;
+	return 0;
+}
+#endif  /*CONFIG_QETH_IPV6*/
+
+/*
+ * IP address takeover related functions
+ */
+static void
+qeth_clear_ipato_list(struct qeth_card *card)
+{
+	struct qeth_ipato_entry *ipatoe, *tmp;
+	unsigned long flags;
+
+	spin_lock_irqsave(&card->ip_lock, flags);
+	list_for_each_entry_safe(ipatoe, tmp, &card->ipato.entries, entry) {
+		list_del(&ipatoe->entry);
+		kfree(ipatoe);
+	}
+	spin_unlock_irqrestore(&card->ip_lock, flags);
+}
+
+int
+qeth_add_ipato_entry(struct qeth_card *card, struct qeth_ipato_entry *new)
+{
+	struct qeth_ipato_entry *ipatoe;
+	unsigned long flags;
+	int rc = 0;
+
+	QETH_DBF_TEXT(trace, 2, "addipato");
+	spin_lock_irqsave(&card->ip_lock, flags);
+	list_for_each_entry(ipatoe, &card->ipato.entries, entry){
+		if (ipatoe->proto != new->proto)
+			continue;
+		if (!memcmp(ipatoe->addr, new->addr,
+			    (ipatoe->proto == QETH_PROT_IPV4)? 4:16) &&
+		    (ipatoe->mask_bits == new->mask_bits)){
+			PRINT_WARN("ipato entry already exists!\n");
+			rc = -EEXIST;
+			break;
+		}
+	}
+	if (!rc) {
+		list_add_tail(&new->entry, &card->ipato.entries);
+	}
+	spin_unlock_irqrestore(&card->ip_lock, flags);
+	return rc;
+}
+
+void
+qeth_del_ipato_entry(struct qeth_card *card, enum qeth_prot_versions proto,
+		     u8 *addr, int mask_bits)
+{
+	struct qeth_ipato_entry *ipatoe, *tmp;
+	unsigned long flags;
+
+	QETH_DBF_TEXT(trace, 2, "delipato");
+	spin_lock_irqsave(&card->ip_lock, flags);
+	list_for_each_entry_safe(ipatoe, tmp, &card->ipato.entries, entry){
+		if (ipatoe->proto != proto)
+			continue;
+		if (!memcmp(ipatoe->addr, addr,
+			    (proto == QETH_PROT_IPV4)? 4:16) &&
+		    (ipatoe->mask_bits == mask_bits)){
+			list_del(&ipatoe->entry);
+			kfree(ipatoe);
+		}
+	}
+	spin_unlock_irqrestore(&card->ip_lock, flags);
+}
+
+static inline void
+qeth_convert_addr_to_bits(u8 *addr, u8 *bits, int len)
+{
+	int i, j;
+	u8 octet;
+
+	for (i = 0; i < len; ++i){
+		octet = addr[i];
+		for (j = 7; j >= 0; --j){
+			bits[i*8 + j] = octet & 1;
+			octet >>= 1;
+		}
+	}
+}
+
+static int
+qeth_is_addr_covered_by_ipato(struct qeth_card *card, struct qeth_ipaddr *addr)
+{
+	struct qeth_ipato_entry *ipatoe;
+	u8 addr_bits[128] = {0, };
+	u8 ipatoe_bits[128] = {0, };
+	int rc = 0;
+
+	if (!card->ipato.enabled)
+		return 0;
+
+	qeth_convert_addr_to_bits((u8 *) &addr->u, addr_bits,
+				  (addr->proto == QETH_PROT_IPV4)? 4:16);
+	list_for_each_entry(ipatoe, &card->ipato.entries, entry){
+		if (addr->proto != ipatoe->proto)
+			continue;
+		qeth_convert_addr_to_bits(ipatoe->addr, ipatoe_bits,
+					  (ipatoe->proto==QETH_PROT_IPV4) ?
+					  4:16);
+		if (addr->proto == QETH_PROT_IPV4)
+			rc = !memcmp(addr_bits, ipatoe_bits,
+				     min(32, ipatoe->mask_bits));
+		else
+			rc = !memcmp(addr_bits, ipatoe_bits,
+				     min(128, ipatoe->mask_bits));
+		if (rc)
+			break;
+	}
+	/* invert? */
+	if ((addr->proto == QETH_PROT_IPV4) && card->ipato.invert4)
+		rc = !rc;
+	else if ((addr->proto == QETH_PROT_IPV6) && card->ipato.invert6)
+		rc = !rc;
+
+	return rc;
+}
+
+/*
+ * VIPA related functions
+ */
+int
+qeth_add_vipa(struct qeth_card *card, enum qeth_prot_versions proto,
+	      const u8 *addr)
+{
+	struct qeth_ipaddr *ipaddr;
+	unsigned long flags;
+	int rc = 0;
+
+	ipaddr = qeth_get_addr_buffer(proto);
+	if (ipaddr){
+		if (proto == QETH_PROT_IPV4){
+			QETH_DBF_TEXT(trace, 2, "addvipa4");
+			memcpy(&ipaddr->u.a4.addr, addr, 4);
+			ipaddr->u.a4.mask = 0;
+#ifdef CONFIG_QETH_IPV6
+		} else if (proto == QETH_PROT_IPV6){
+			QETH_DBF_TEXT(trace, 2, "addvipa6");
+			memcpy(&ipaddr->u.a6.addr, addr, 16);
+			ipaddr->u.a6.pfxlen = 0;
+#endif
+		}
+		ipaddr->type = QETH_IP_TYPE_VIPA;
+		ipaddr->set_flags = QETH_IPA_SETIP_VIPA_FLAG;
+		ipaddr->del_flags = QETH_IPA_DELIP_VIPA_FLAG;
+	} else
+		return -ENOMEM;
+	spin_lock_irqsave(&card->ip_lock, flags);
+	if (__qeth_address_exists_in_list(&card->ip_list, ipaddr, 0) ||
+	    __qeth_address_exists_in_list(&card->ip_tbd_list, ipaddr, 0))
+		rc = -EEXIST;
+	spin_unlock_irqrestore(&card->ip_lock, flags);
+	if (rc){
+		PRINT_WARN("Cannot add VIPA. Address already exists!\n");
+		return rc;
+	}
+	if (!qeth_add_ip(card, ipaddr))
+		kfree(ipaddr);
+	qeth_set_thread_start_bit(card, QETH_SET_IP_THREAD);
+	schedule_work(&card->kernel_thread_starter);
+	return rc;
+}
+
+void
+qeth_del_vipa(struct qeth_card *card, enum qeth_prot_versions proto,
+	      const u8 *addr)
+{
+	struct qeth_ipaddr *ipaddr;
+
+	ipaddr = qeth_get_addr_buffer(proto);
+	if (ipaddr){
+		if (proto == QETH_PROT_IPV4){
+			QETH_DBF_TEXT(trace, 2, "delvipa4");
+			memcpy(&ipaddr->u.a4.addr, addr, 4);
+			ipaddr->u.a4.mask = 0;
+#ifdef CONFIG_QETH_IPV6
+		} else if (proto == QETH_PROT_IPV6){
+			QETH_DBF_TEXT(trace, 2, "delvipa6");
+			memcpy(&ipaddr->u.a6.addr, addr, 16);
+			ipaddr->u.a6.pfxlen = 0;
+#endif
+		}
+		ipaddr->type = QETH_IP_TYPE_VIPA;
+	} else
+		return;
+	if (!qeth_delete_ip(card, ipaddr))
+		kfree(ipaddr);
+	qeth_set_thread_start_bit(card, QETH_SET_IP_THREAD);
+	schedule_work(&card->kernel_thread_starter);
+}
+
+/*
+ * proxy ARP related functions
+ */
+int
+qeth_add_rxip(struct qeth_card *card, enum qeth_prot_versions proto,
+	      const u8 *addr)
+{
+	struct qeth_ipaddr *ipaddr;
+	unsigned long flags;
+	int rc = 0;
+
+	ipaddr = qeth_get_addr_buffer(proto);
+	if (ipaddr){
+		if (proto == QETH_PROT_IPV4){
+			QETH_DBF_TEXT(trace, 2, "addrxip4");
+			memcpy(&ipaddr->u.a4.addr, addr, 4);
+			ipaddr->u.a4.mask = 0;
+#ifdef CONFIG_QETH_IPV6
+		} else if (proto == QETH_PROT_IPV6){
+			QETH_DBF_TEXT(trace, 2, "addrxip6");
+			memcpy(&ipaddr->u.a6.addr, addr, 16);
+			ipaddr->u.a6.pfxlen = 0;
+#endif
+		}
+		ipaddr->type = QETH_IP_TYPE_RXIP;
+		ipaddr->set_flags = QETH_IPA_SETIP_TAKEOVER_FLAG;
+		ipaddr->del_flags = 0;
+	} else
+		return -ENOMEM;
+	spin_lock_irqsave(&card->ip_lock, flags);
+	if (__qeth_address_exists_in_list(&card->ip_list, ipaddr, 0) ||
+	    __qeth_address_exists_in_list(&card->ip_tbd_list, ipaddr, 0))
+		rc = -EEXIST;
+	spin_unlock_irqrestore(&card->ip_lock, flags);
+	if (rc){
+		PRINT_WARN("Cannot add RXIP. Address already exists!\n");
+		return rc;
+	}
+	if (!qeth_add_ip(card, ipaddr))
+		kfree(ipaddr);
+	qeth_set_thread_start_bit(card, QETH_SET_IP_THREAD);
+	schedule_work(&card->kernel_thread_starter);
+	return 0;
+}
+
+void
+qeth_del_rxip(struct qeth_card *card, enum qeth_prot_versions proto,
+	      const u8 *addr)
+{
+	struct qeth_ipaddr *ipaddr;
+
+	ipaddr = qeth_get_addr_buffer(proto);
+	if (ipaddr){
+		if (proto == QETH_PROT_IPV4){
+			QETH_DBF_TEXT(trace, 2, "addrxip4");
+			memcpy(&ipaddr->u.a4.addr, addr, 4);
+			ipaddr->u.a4.mask = 0;
+#ifdef CONFIG_QETH_IPV6
+		} else if (proto == QETH_PROT_IPV6){
+			QETH_DBF_TEXT(trace, 2, "addrxip6");
+			memcpy(&ipaddr->u.a6.addr, addr, 16);
+			ipaddr->u.a6.pfxlen = 0;
+#endif
+		}
+		ipaddr->type = QETH_IP_TYPE_RXIP;
+	} else
+		return;
+	if (!qeth_delete_ip(card, ipaddr))
+		kfree(ipaddr);
+	qeth_set_thread_start_bit(card, QETH_SET_IP_THREAD);
+	schedule_work(&card->kernel_thread_starter);
+}
+
+/**
+ * IP event handler
+ */
+static int
+qeth_ip_event(struct notifier_block *this,
+	      unsigned long event,void *ptr)
+{
+	struct in_ifaddr *ifa = (struct in_ifaddr *)ptr;
+	struct net_device *dev =(struct net_device *) ifa->ifa_dev->dev;
+	struct qeth_ipaddr *addr;
+	struct qeth_card *card;
+
+	QETH_DBF_TEXT(trace,3,"ipevent");
+	card = qeth_get_card_from_dev(dev);
+	if (!card)
+		return NOTIFY_DONE;
+
+	addr = qeth_get_addr_buffer(QETH_PROT_IPV4);
+	if (addr != NULL) {
+		addr->u.a4.addr = ifa->ifa_address;
+		addr->u.a4.mask = ifa->ifa_mask;
+		addr->type = QETH_IP_TYPE_NORMAL;
+	}
+	switch(event) {
+	case NETDEV_UP:
+		if (addr) {
+			if (!qeth_add_ip(card, addr))
+				kfree(addr);
+		}
+		break;
+	case NETDEV_DOWN:
+		if (addr) {
+			if (!qeth_delete_ip(card, addr))
+				kfree(addr);
+		}
+		break;
+	default:
+		break;
+	}
+	qeth_set_thread_start_bit(card, QETH_SET_IP_THREAD);
+	schedule_work(&card->kernel_thread_starter);
+
+	return NOTIFY_DONE;
+}
+
+static struct notifier_block qeth_ip_notifier = {
+	qeth_ip_event,
+	0
+};
+
+#ifdef CONFIG_QETH_IPV6
+/**
+ * IPv6 event handler
+ */
+static int
+qeth_ip6_event(struct notifier_block *this,
+	      unsigned long event,void *ptr)
+{
+
+	struct inet6_ifaddr *ifa = (struct inet6_ifaddr *)ptr;
+	struct net_device *dev = (struct net_device *)ifa->idev->dev;
+	struct qeth_ipaddr *addr;
+	struct qeth_card *card;
+
+	QETH_DBF_TEXT(trace,3,"ip6event");
+
+	card = qeth_get_card_from_dev(dev);
+	if (!card)
+		return NOTIFY_DONE;
+	if (!qeth_is_supported(card, IPA_IPV6))
+		return NOTIFY_DONE;
+
+	addr = qeth_get_addr_buffer(QETH_PROT_IPV6);
+	if (addr != NULL) {
+		memcpy(&addr->u.a6.addr, &ifa->addr, sizeof(struct in6_addr));
+		addr->u.a6.pfxlen = ifa->prefix_len;
+		addr->type = QETH_IP_TYPE_NORMAL;
+	}
+	switch(event) {
+	case NETDEV_UP:
+		if (addr){
+			if (!qeth_add_ip(card, addr))
+				kfree(addr);
+		}
+		break;
+	case NETDEV_DOWN:
+		if (addr){
+			if (!qeth_delete_ip(card, addr))
+				kfree(addr);
+		}
+		break;
+	default:
+		break;
+	}
+	qeth_set_thread_start_bit(card, QETH_SET_IP_THREAD);
+	schedule_work(&card->kernel_thread_starter);
+
+	return NOTIFY_DONE;
+}
+
+static struct notifier_block qeth_ip6_notifier = {
+	qeth_ip6_event,
+	0
+};
+#endif
+
+static int
+qeth_reboot_event(struct notifier_block *this, unsigned long event, void *ptr)
+{
+
+	struct device *entry;
+	struct qeth_card *card;
+
+	down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
+	       list_for_each_entry(entry, &qeth_ccwgroup_driver.driver.devices,
+			           driver_list) {
+	               card = (struct qeth_card *) entry->driver_data;
+		       qeth_clear_ip_list(card, 0, 0);
+		       qeth_qdio_clear_card(card, 0);
+	       }
+	up_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
+	return NOTIFY_DONE;
+}
+
+
+static struct notifier_block qeth_reboot_notifier = {
+	qeth_reboot_event,
+	0
+};
+
+static int
+qeth_register_notifiers(void)
+{
+        int r;
+
+	QETH_DBF_TEXT(trace,5,"regnotif");
+	if ((r = register_reboot_notifier(&qeth_reboot_notifier)))
+		return r;
+	if ((r = register_inetaddr_notifier(&qeth_ip_notifier)))
+		goto out_reboot;
+#ifdef CONFIG_QETH_IPV6
+	if ((r = register_inet6addr_notifier(&qeth_ip6_notifier)))
+		goto out_ipv4;
+#endif
+	return 0;
+
+#ifdef CONFIG_QETH_IPV6
+out_ipv4:
+	unregister_inetaddr_notifier(&qeth_ip_notifier);
+#endif
+out_reboot:
+	unregister_reboot_notifier(&qeth_reboot_notifier);
+	return r;
+}
+
+/**
+ * unregister all event notifiers
+ */
+static void
+qeth_unregister_notifiers(void)
+{
+
+	QETH_DBF_TEXT(trace,5,"unregnot");
+	BUG_ON(unregister_reboot_notifier(&qeth_reboot_notifier));
+	BUG_ON(unregister_inetaddr_notifier(&qeth_ip_notifier));
+#ifdef CONFIG_QETH_IPV6
+	BUG_ON(unregister_inet6addr_notifier(&qeth_ip6_notifier));
+#endif /* QETH_IPV6 */
+
+}
+
+#ifdef CONFIG_QETH_IPV6
+static int
+qeth_ipv6_init(void)
+{
+	qeth_old_arp_constructor = arp_tbl.constructor;
+	write_lock(&arp_tbl.lock);
+	arp_tbl.constructor = qeth_arp_constructor;
+	write_unlock(&arp_tbl.lock);
+
+	arp_direct_ops = (struct neigh_ops*)
+		kmalloc(sizeof(struct neigh_ops), GFP_KERNEL);
+	if (!arp_direct_ops)
+		return -ENOMEM;
+
+	memcpy(arp_direct_ops, &arp_direct_ops_template,
+	       sizeof(struct neigh_ops));
+
+	return 0;
+}
+
+static void
+qeth_ipv6_uninit(void)
+{
+	write_lock(&arp_tbl.lock);
+	arp_tbl.constructor = qeth_old_arp_constructor;
+	write_unlock(&arp_tbl.lock);
+	kfree(arp_direct_ops);
+}
+#endif /* CONFIG_QETH_IPV6 */
+
+static void
+qeth_sysfs_unregister(void)
+{
+	qeth_remove_driver_attributes();
+	ccw_driver_unregister(&qeth_ccw_driver);
+	ccwgroup_driver_unregister(&qeth_ccwgroup_driver);
+	s390_root_dev_unregister(qeth_root_dev);
+}
+/**
+ * register qeth at sysfs
+ */
+static int
+qeth_sysfs_register(void)
+{
+	int rc=0;
+
+	rc = ccwgroup_driver_register(&qeth_ccwgroup_driver);
+	if (rc)
+		return rc;
+	rc = ccw_driver_register(&qeth_ccw_driver);
+	if (rc)
+	 	return rc;
+	rc = qeth_create_driver_attributes();
+	if (rc)
+		return rc;
+	qeth_root_dev = s390_root_dev_register("qeth");
+	if (IS_ERR(qeth_root_dev)) {
+		rc = PTR_ERR(qeth_root_dev);
+		return rc;
+	}
+	return 0;
+}
+
+/***
+ * init function
+ */
+static int __init
+qeth_init(void)
+{
+	int rc=0;
+
+	qeth_eyecatcher();
+	printk(KERN_INFO "qeth: loading %s\n",version);
+
+	INIT_LIST_HEAD(&qeth_card_list.list);
+	rwlock_init(&qeth_card_list.rwlock);
+
+	atomic_set(&qeth_hsi_count, 0);
+	if (qeth_register_dbf_views())
+		goto out_err;
+	if (qeth_sysfs_register())
+		goto out_sysfs;
+
+#ifdef CONFIG_QETH_IPV6
+	if (qeth_ipv6_init()) {
+		PRINT_ERR("Out of memory during ipv6 init.\n");
+		goto out_sysfs;
+	}
+#endif /* QETH_IPV6 */
+	if (qeth_register_notifiers())
+		goto out_ipv6;
+	if (qeth_create_procfs_entries())
+		goto out_notifiers;
+
+	return rc;
+
+out_notifiers:
+	qeth_unregister_notifiers();
+out_ipv6:
+#ifdef CONFIG_QETH_IPV6
+	qeth_ipv6_uninit();
+#endif /* QETH_IPV6 */
+out_sysfs:
+	qeth_sysfs_unregister();
+	qeth_unregister_dbf_views();
+out_err:
+	PRINT_ERR("Initialization failed");
+	return rc;
+}
+
+static void
+__exit qeth_exit(void)
+{
+	struct qeth_card *card, *tmp;
+	unsigned long flags;
+
+	QETH_DBF_TEXT(trace,1, "cleanup.");
+
+	/*
+	 * Weed would not need to clean up our devices here, because the
+	 * common device layer calls qeth_remove_device for each device
+	 * as soon as we unregister our driver (done in qeth_sysfs_unregister).
+	 * But we do cleanup here so we can do a "soft" shutdown of our cards.
+	 * qeth_remove_device called by the common device layer would otherwise
+	 * do a "hard" shutdown (card->use_hard_stop is set to one in
+	 * qeth_remove_device).
+	 */
+again:
+	read_lock_irqsave(&qeth_card_list.rwlock, flags);
+	list_for_each_entry_safe(card, tmp, &qeth_card_list.list, list){
+		read_unlock_irqrestore(&qeth_card_list.rwlock, flags);
+		qeth_set_offline(card->gdev);
+		qeth_remove_device(card->gdev);
+		goto again;
+	}
+	read_unlock_irqrestore(&qeth_card_list.rwlock, flags);
+#ifdef CONFIG_QETH_IPV6
+	qeth_ipv6_uninit();
+#endif
+	qeth_unregister_notifiers();
+	qeth_remove_procfs_entries();
+	qeth_sysfs_unregister();
+	qeth_unregister_dbf_views();
+	printk("qeth: removed\n");
+}
+
+EXPORT_SYMBOL(qeth_eyecatcher);
+module_init(qeth_init);
+module_exit(qeth_exit);
+MODULE_AUTHOR("Frank Pavlic <pavlic@de.ibm.com>");
+MODULE_DESCRIPTION("Linux on zSeries OSA Express and HiperSockets support\n" \
+		                      "Copyright 2000,2003 IBM Corporation\n");
+
+MODULE_LICENSE("GPL");
--- diff/drivers/s390/net/qeth_proc.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/s390/net/qeth_proc.c	2004-04-21 10:45:34.665433552 +0100
@@ -0,0 +1,468 @@
+/*
+ *
+ * linux/drivers/s390/net/qeth_fs.c ($Revision: 1.5 $)
+ *
+ * Linux on zSeries OSA Express and HiperSockets support
+ * This file contains code related to procfs.
+ *
+ * Copyright 2000,2003 IBM Corporation
+ *
+ * Author(s): Thomas Spatzier <tspat@de.ibm.com>
+ *
+ */
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/proc_fs.h>
+#include <linux/seq_file.h>
+#include <linux/list.h>
+#include <linux/rwsem.h>
+
+#include "qeth.h"
+#include "qeth_mpc.h"
+#include "qeth_fs.h"
+
+/***** /proc/qeth *****/
+#define QETH_PROCFILE_NAME "qeth"
+static struct proc_dir_entry *qeth_procfile;
+
+static void *
+qeth_procfile_seq_start(struct seq_file *s, loff_t *offset)
+{
+	struct list_head *next_card = NULL;
+	int i = 0;
+
+	down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
+
+	if (*offset == 0)
+		return SEQ_START_TOKEN;
+
+	/* get card at pos *offset */
+	list_for_each(next_card, &qeth_ccwgroup_driver.driver.devices)
+		if (++i == *offset)
+			return next_card;
+
+	return NULL;
+}
+
+static void
+qeth_procfile_seq_stop(struct seq_file *s, void* it)
+{
+	up_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
+}
+
+static void *
+qeth_procfile_seq_next(struct seq_file *s, void *it, loff_t *offset)
+{
+	struct list_head *next_card = NULL;
+	struct list_head *current_card;
+
+	if (it == SEQ_START_TOKEN) {
+		next_card = qeth_ccwgroup_driver.driver.devices.next;
+		if (next_card->next == next_card) /* list empty */
+			return NULL;
+		(*offset)++;
+	} else {
+		current_card = (struct list_head *)it;
+		if (current_card->next == &qeth_ccwgroup_driver.driver.devices)
+			return NULL; /* end of list reached */
+		next_card = current_card->next;
+		(*offset)++;
+	}
+
+	return next_card;
+}
+
+static inline const char *
+qeth_get_router_str(struct qeth_card *card, int ipv)
+{
+	int routing_type = 0;
+
+	if (ipv == 4){
+		routing_type = card->options.route4.type;
+	} else {
+#ifdef CONFIG_QETH_IPV6
+		routing_type = card->options.route6.type;
+#else
+		return "n/a";
+#endif /* CONFIG_QETH_IPV6 */
+	}
+
+	if (routing_type == PRIMARY_ROUTER)
+		return "pri";
+	else if (routing_type == SECONDARY_ROUTER)
+		return "sec";
+	else if (routing_type == MULTICAST_ROUTER)
+		return "mc";
+	else if (routing_type == PRIMARY_CONNECTOR)
+		return "p.c";
+	else if (routing_type == SECONDARY_CONNECTOR)
+		return "s.c";
+	else if (routing_type == NO_ROUTER)
+		return "no";
+	else
+		return "unk";
+}
+
+static int
+qeth_procfile_seq_show(struct seq_file *s, void *it)
+{
+	struct device *device;
+	struct qeth_card *card;
+	char tmp[12]; /* for qeth_get_prioq_str */
+
+	if (it == SEQ_START_TOKEN){
+		seq_printf(s, "devices                    CHPID interface  "
+		              "cardtype       port chksum prio-q'ing rtr4 "
+			      "rtr6 fsz   cnt\n");
+		seq_printf(s, "-------------------------- ----- ---------- "
+			      "-------------- ---- ------ ---------- ---- "
+			      "---- ----- -----\n");
+	} else {
+		device = list_entry(it, struct device, driver_list);
+		card = device->driver_data;
+		seq_printf(s, "%s/%s/%s x%02X   %-10s %-14s %-4i ",
+				CARD_RDEV_ID(card),
+				CARD_WDEV_ID(card),
+				CARD_DDEV_ID(card),
+				card->info.chpid,
+				card->info.if_name,
+				qeth_get_cardname_short(card),
+				card->info.portno);
+		if (card->lan_online)
+			seq_printf(s, "%-6s %-10s %-4s %-4s %-5s %-5i\n",
+					qeth_get_checksum_str(card),
+					qeth_get_prioq_str(card, tmp),
+					qeth_get_router_str(card, 4),
+					qeth_get_router_str(card, 6),
+					qeth_get_bufsize_str(card),
+					card->qdio.in_buf_pool.buf_count);
+		else
+			seq_printf(s, "  +++ LAN OFFLINE +++\n");
+	}
+	return 0;
+}
+
+static struct seq_operations qeth_procfile_seq_ops = {
+	.start = qeth_procfile_seq_start,
+	.stop  = qeth_procfile_seq_stop,
+	.next  = qeth_procfile_seq_next,
+	.show  = qeth_procfile_seq_show,
+};
+
+static int
+qeth_procfile_open(struct inode *inode, struct file *file)
+{
+	return seq_open(file, &qeth_procfile_seq_ops);
+}
+
+static struct file_operations qeth_procfile_fops = {
+	.owner   = THIS_MODULE,
+	.open    = qeth_procfile_open,
+	.read    = seq_read,
+	.llseek  = seq_lseek,
+	.release = seq_release,
+};
+
+/***** /proc/qeth_perf *****/
+#define QETH_PERF_PROCFILE_NAME "qeth_perf"
+static struct proc_dir_entry *qeth_perf_procfile;
+
+#ifdef CONFIG_QETH_PERF_STATS
+
+static void *
+qeth_perf_procfile_seq_start(struct seq_file *s, loff_t *offset)
+{
+	struct list_head *next_card = NULL;
+	int i = 0;
+
+	down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
+	/* get card at pos *offset */
+	list_for_each(next_card, &qeth_ccwgroup_driver.driver.devices){
+		if (i == *offset)
+			return next_card;
+		i++;
+	}
+	return NULL;
+}
+
+static void
+qeth_perf_procfile_seq_stop(struct seq_file *s, void* it)
+{
+	up_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
+}
+
+static void *
+qeth_perf_procfile_seq_next(struct seq_file *s, void *it, loff_t *offset)
+{
+	struct list_head *current_card = (struct list_head *)it;
+
+	if (current_card->next == &qeth_ccwgroup_driver.driver.devices)
+		return NULL; /* end of list reached */
+	(*offset)++;
+	return current_card->next;
+}
+
+static int
+qeth_perf_procfile_seq_show(struct seq_file *s, void *it)
+{
+	struct device *device;
+	struct qeth_card *card;
+
+	device = list_entry(it, struct device, driver_list);
+	card = device->driver_data;
+	seq_printf(s, "For card with devnos %s/%s/%s (%s):\n",
+			CARD_RDEV_ID(card),
+			CARD_WDEV_ID(card),
+			CARD_DDEV_ID(card),
+			card->info.if_name
+		  );
+	seq_printf(s, "  Skb's/buffers received                 : %li/%i\n"
+		      "  Skb's/buffers sent                     : %li/%i\n\n",
+		        card->stats.rx_packets, card->perf_stats.bufs_rec,
+		        card->stats.tx_packets, card->perf_stats.bufs_sent
+		  );
+	seq_printf(s, "  Skb's/buffers sent without packing     : %li/%i\n"
+		      "  Skb's/buffers sent with packing        : %i/%i\n\n",
+		   card->stats.tx_packets - card->perf_stats.skbs_sent_pack,
+		   card->perf_stats.bufs_sent - card->perf_stats.bufs_sent_pack,
+		   card->perf_stats.skbs_sent_pack,
+		   card->perf_stats.bufs_sent_pack
+		  );
+	seq_printf(s, "  Packing state changes no pkg.->packing : %i/%i\n"
+		      "  Current buffer usage (outbound q's)    : "
+		      "%i/%i/%i/%i\n\n",
+		        card->perf_stats.sc_dp_p, card->perf_stats.sc_p_dp,
+			atomic_read(&card->qdio.out_qs[0]->used_buffers),
+			(card->qdio.no_out_queues > 1)?
+				atomic_read(&card->qdio.out_qs[1]->used_buffers)
+				: 0,
+			(card->qdio.no_out_queues > 2)?
+				atomic_read(&card->qdio.out_qs[2]->used_buffers)
+				: 0,
+			(card->qdio.no_out_queues > 3)?
+				atomic_read(&card->qdio.out_qs[3]->used_buffers)
+				: 0
+		  );
+	seq_printf(s, "  Inbound time (in us)                   : %i\n"
+		      "  Inbound cnt                            : %i\n"
+		      "  Outbound time (in us, incl QDIO)       : %i\n"
+		      "  Outbound cnt                           : %i\n"
+		      "  Watermarks L/H                         : %i/%i\n\n",
+		        card->perf_stats.inbound_time,
+			card->perf_stats.inbound_cnt,
+			card->perf_stats.outbound_time,
+			card->perf_stats.outbound_cnt,
+			QETH_LOW_WATERMARK_PACK, QETH_HIGH_WATERMARK_PACK
+		  );
+
+	return 0;
+}
+
+static struct seq_operations qeth_perf_procfile_seq_ops = {
+	.start = qeth_perf_procfile_seq_start,
+	.stop  = qeth_perf_procfile_seq_stop,
+	.next  = qeth_perf_procfile_seq_next,
+	.show  = qeth_perf_procfile_seq_show,
+};
+
+static int
+qeth_perf_procfile_open(struct inode *inode, struct file *file)
+{
+	return seq_open(file, &qeth_perf_procfile_seq_ops);
+}
+
+static struct file_operations qeth_perf_procfile_fops = {
+	.owner   = THIS_MODULE,
+	.open    = qeth_perf_procfile_open,
+	.read    = seq_read,
+	.llseek  = seq_lseek,
+	.release = seq_release,
+};
+
+#define qeth_perf_procfile_created qeth_perf_procfile
+#else
+#define qeth_perf_procfile_created 1
+#endif /* CONFIG_QETH_PERF_STATS */
+
+/***** /proc/qeth_ipa_takeover *****/
+#define QETH_IPATO_PROCFILE_NAME "qeth_ipa_takeover"
+static struct proc_dir_entry *qeth_ipato_procfile;
+
+static void *
+qeth_ipato_procfile_seq_start(struct seq_file *s, loff_t *offset)
+{
+	struct list_head *next_card = NULL;
+	int i = 0;
+
+	down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
+	/* TODO: finish this */
+	/*
+	 * maybe SEQ_SATRT_TOKEN can be returned for offset 0
+	 * output driver settings then;
+	 * else output setting for respective card
+	 */
+	/* get card at pos *offset */
+	list_for_each(next_card, &qeth_ccwgroup_driver.driver.devices){
+		if (i == *offset)
+			return next_card;
+		i++;
+	}
+	return NULL;
+}
+
+static void
+qeth_ipato_procfile_seq_stop(struct seq_file *s, void* it)
+{
+	up_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
+}
+
+static void *
+qeth_ipato_procfile_seq_next(struct seq_file *s, void *it, loff_t *offset)
+{
+	struct list_head *current_card = (struct list_head *)it;
+
+	/* TODO: finish this */
+	/*
+	 * maybe SEQ_SATRT_TOKEN can be returned for offset 0
+	 * output driver settings then;
+	 * else output setting for respective card
+	 */
+	if (current_card->next == &qeth_ccwgroup_driver.driver.devices)
+		return NULL; /* end of list reached */
+	(*offset)++;
+	return current_card->next;
+}
+
+static int
+qeth_ipato_procfile_seq_show(struct seq_file *s, void *it)
+{
+	struct device *device;
+	struct qeth_card *card;
+
+	/* TODO: finish this */
+	/*
+	 * maybe SEQ_SATRT_TOKEN can be returned for offset 0
+	 * output driver settings then;
+	 * else output setting for respective card
+	 */
+	device = list_entry(it, struct device, driver_list);
+	card = device->driver_data;
+
+	return 0;
+}
+
+static struct seq_operations qeth_ipato_procfile_seq_ops = {
+	.start = qeth_ipato_procfile_seq_start,
+	.stop  = qeth_ipato_procfile_seq_stop,
+	.next  = qeth_ipato_procfile_seq_next,
+	.show  = qeth_ipato_procfile_seq_show,
+};
+
+static int
+qeth_ipato_procfile_open(struct inode *inode, struct file *file)
+{
+	return seq_open(file, &qeth_ipato_procfile_seq_ops);
+}
+
+static struct file_operations qeth_ipato_procfile_fops = {
+	.owner   = THIS_MODULE,
+	.open    = qeth_ipato_procfile_open,
+	.read    = seq_read,
+	.llseek  = seq_lseek,
+	.release = seq_release,
+};
+
+int __init
+qeth_create_procfs_entries(void)
+{
+	qeth_procfile = create_proc_entry(QETH_PROCFILE_NAME,
+					   S_IFREG | 0444, NULL);
+	if (qeth_procfile)
+		qeth_procfile->proc_fops = &qeth_procfile_fops;
+
+#ifdef CONFIG_QETH_PERF_STATS
+	qeth_perf_procfile = create_proc_entry(QETH_PERF_PROCFILE_NAME,
+					   S_IFREG | 0444, NULL);
+	if (qeth_perf_procfile)
+		qeth_perf_procfile->proc_fops = &qeth_perf_procfile_fops;
+#endif /* CONFIG_QETH_PERF_STATS */
+
+	qeth_ipato_procfile = create_proc_entry(QETH_IPATO_PROCFILE_NAME,
+					   S_IFREG | 0444, NULL);
+	if (qeth_ipato_procfile)
+		qeth_ipato_procfile->proc_fops = &qeth_ipato_procfile_fops;
+
+	if (qeth_procfile &&
+	    qeth_ipato_procfile &&
+	    qeth_perf_procfile_created)
+		return 0;
+	else
+		return -ENOMEM;
+}
+
+void __exit
+qeth_remove_procfs_entries(void)
+{
+	if (qeth_procfile)
+		remove_proc_entry(QETH_PROCFILE_NAME, NULL);
+	if (qeth_perf_procfile)
+		remove_proc_entry(QETH_PERF_PROCFILE_NAME, NULL);
+	if (qeth_ipato_procfile)
+		remove_proc_entry(QETH_IPATO_PROCFILE_NAME, NULL);
+}
+
+
+/* ONLY FOR DEVELOPMENT! -> make it as module */
+/*
+static void
+qeth_create_sysfs_entries(void)
+{
+	struct device *dev;
+
+	down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
+
+	list_for_each_entry(dev, &qeth_ccwgroup_driver.driver.devices,
+			driver_list)
+		qeth_create_device_attributes(dev);
+
+	up_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
+}
+
+static void
+qeth_remove_sysfs_entries(void)
+{
+	struct device *dev;
+
+	down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
+
+	list_for_each_entry(dev, &qeth_ccwgroup_driver.driver.devices,
+			driver_list)
+		qeth_remove_device_attributes(dev);
+
+	up_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
+}
+
+static int __init
+qeth_fs_init(void)
+{
+	printk(KERN_INFO "qeth_fs_init\n");
+	qeth_create_procfs_entries();
+	qeth_create_sysfs_entries();
+
+	return 0;
+}
+
+static void __exit
+qeth_fs_exit(void)
+{
+	printk(KERN_INFO "qeth_fs_exit\n");
+	qeth_remove_procfs_entries();
+	qeth_remove_sysfs_entries();
+}
+
+
+module_init(qeth_fs_init);
+module_exit(qeth_fs_exit);
+
+MODULE_LICENSE("GPL");
+*/
--- diff/drivers/s390/net/qeth_sys.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/s390/net/qeth_sys.c	2004-04-21 10:45:34.667433248 +0100
@@ -0,0 +1,1479 @@
+/*
+ *
+ * linux/drivers/s390/net/qeth_sys.c ($Revision: 1.19 $)
+ *
+ * Linux on zSeries OSA Express and HiperSockets support
+ * This file contains code related to sysfs.
+ *
+ * Copyright 2000,2003 IBM Corporation
+ *
+ * Author(s): Thomas Spatzier <tspat@de.ibm.com>
+ * 	      Frank Pavlic <pavlic@de.ibm.com>
+ *
+ */
+#include <linux/list.h>
+#include <linux/rwsem.h>
+
+#include <asm/ebcdic.h>
+
+#include "qeth.h"
+#include "qeth_mpc.h"
+#include "qeth_fs.h"
+
+/*****************************************************************************/
+/*                                                                           */
+/*          /sys-fs stuff UNDER DEVELOPMENT !!!                              */
+/*                                                                           */
+/*****************************************************************************/
+//low/high watermark
+
+static ssize_t
+qeth_dev_state_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+	if (!card)
+		return -EINVAL;
+
+	switch (card->state) {
+	case CARD_STATE_DOWN:
+		return sprintf(buf, "DOWN\n");
+	case CARD_STATE_HARDSETUP:
+		return sprintf(buf, "HARDSETUP\n");
+	case CARD_STATE_SOFTSETUP:
+		return sprintf(buf, "SOFTSETUP\n");
+	case CARD_STATE_UP_LAN_OFFLINE:
+		return sprintf(buf, "UP (LAN OFFLINE)\n");
+	case CARD_STATE_UP_LAN_ONLINE:
+		return sprintf(buf, "UP (LAN ONLINE)\n");
+	case CARD_STATE_RECOVER:
+		return sprintf(buf, "RECOVER\n");
+	default:
+		return sprintf(buf, "UNKNOWN\n");
+	}
+}
+
+static DEVICE_ATTR(state, 0444, qeth_dev_state_show, NULL);
+
+static ssize_t
+qeth_dev_chpid_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+	if (!card)
+		return -EINVAL;
+
+	return sprintf(buf, "%02X\n", card->info.chpid);
+}
+
+static DEVICE_ATTR(chpid, 0444, qeth_dev_chpid_show, NULL);
+
+static ssize_t
+qeth_dev_if_name_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+	if (!card)
+		return -EINVAL;
+
+	return sprintf(buf, "%s\n", card->info.if_name);
+}
+
+static DEVICE_ATTR(if_name, 0444, qeth_dev_if_name_show, NULL);
+
+static ssize_t
+qeth_dev_card_type_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+	if (!card)
+		return -EINVAL;
+
+	return sprintf(buf, "%s\n", qeth_get_cardname_short(card));
+}
+
+static DEVICE_ATTR(card_type, 0444, qeth_dev_card_type_show, NULL);
+
+static ssize_t
+qeth_dev_portno_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+	if (!card)
+		return -EINVAL;
+
+	return sprintf(buf, "%i\n", card->info.portno);
+}
+
+static ssize_t
+qeth_dev_portno_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+	char *tmp;
+	unsigned int portno;
+
+	if (!card)
+		return -EINVAL;
+
+	if ((card->state != CARD_STATE_DOWN) &&
+	    (card->state != CARD_STATE_RECOVER))
+		return -EPERM;
+
+	portno = simple_strtoul(buf, &tmp, 16);
+	if ((portno < 0) || (portno > MAX_PORTNO)){
+		PRINT_WARN("portno 0x%X is out of range\n", portno);
+		return -EINVAL;
+	}
+
+	card->info.portno = portno;
+	return count;
+}
+
+static DEVICE_ATTR(portno, 0644, qeth_dev_portno_show, qeth_dev_portno_store);
+
+static ssize_t
+qeth_dev_portname_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+	char portname[9] = {0, };
+
+	if (!card)
+		return -EINVAL;
+
+	if (card->info.portname_required) {
+		memcpy(portname, card->info.portname + 1, 8);
+		EBCASC(portname, 8);
+		return sprintf(buf, "%s\n", portname);
+	} else
+		return sprintf(buf, "no portname required\n");
+}
+
+static ssize_t
+qeth_dev_portname_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+	char *tmp;
+	int i;
+
+	if (!card)
+		return -EINVAL;
+
+	if ((card->state != CARD_STATE_DOWN) &&
+	    (card->state != CARD_STATE_RECOVER))
+		return -EPERM;
+
+	tmp = strsep((char **) &buf, "\n");
+	if ((strlen(tmp) > 8) || (strlen(tmp) < 2))
+		return -EINVAL;
+
+	card->info.portname[0] = strlen(tmp);
+	/* for beauty reasons */
+	for (i = 1; i < 9; i++)
+		card->info.portname[i] = ' ';
+	strcpy(card->info.portname + 1, tmp);
+	ASCEBC(card->info.portname + 1, 8);
+
+	return count;
+}
+
+static DEVICE_ATTR(portname, 0644, qeth_dev_portname_show,
+		qeth_dev_portname_store);
+
+static ssize_t
+qeth_dev_checksum_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return sprintf(buf, "%s checksumming\n", qeth_get_checksum_str(card));
+}
+
+static ssize_t
+qeth_dev_checksum_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+	char *tmp;
+
+	if (!card)
+		return -EINVAL;
+
+	if ((card->state != CARD_STATE_DOWN) &&
+	    (card->state != CARD_STATE_RECOVER))
+		return -EPERM;
+
+	tmp = strsep((char **) &buf, "\n");
+	if (!strcmp(tmp, "sw_checksumming"))
+		card->options.checksum_type = SW_CHECKSUMMING;
+	else if (!strcmp(tmp, "hw_checksumming"))
+		card->options.checksum_type = HW_CHECKSUMMING;
+	else if (!strcmp(tmp, "no_checksumming"))
+		card->options.checksum_type = NO_CHECKSUMMING;
+	else {
+		PRINT_WARN("Unknown checksumming type '%s'\n", tmp);
+		return -EINVAL;
+	}
+	return count;
+}
+
+static DEVICE_ATTR(checksumming, 0644, qeth_dev_checksum_show,
+		qeth_dev_checksum_store);
+
+static ssize_t
+qeth_dev_prioqing_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	switch (card->qdio.do_prio_queueing) {
+	case QETH_PRIO_Q_ING_PREC:
+		return sprintf(buf, "%s\n", "by precedence");
+	case QETH_PRIO_Q_ING_TOS:
+		return sprintf(buf, "%s\n", "by type of service");
+	default:
+		return sprintf(buf, "always queue %i\n",
+			       card->qdio.default_out_queue);
+	}
+}
+
+static ssize_t
+qeth_dev_prioqing_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+	char *tmp;
+
+	if (!card)
+		return -EINVAL;
+
+	if ((card->state != CARD_STATE_DOWN) &&
+	    (card->state != CARD_STATE_RECOVER))
+		return -EPERM;
+
+	tmp = strsep((char **) &buf, "\n");
+	if (!strcmp(tmp, "prio_queueing_prec"))
+		card->qdio.do_prio_queueing = QETH_PRIO_Q_ING_PREC;
+	else if (!strcmp(tmp, "prio_queueing_tos"))
+		card->qdio.do_prio_queueing = QETH_PRIO_Q_ING_TOS;
+	else if (!strcmp(tmp, "no_prio_queueing:0")) {
+		card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
+		card->qdio.default_out_queue = 0;
+	} else if (!strcmp(tmp, "no_prio_queueing:1")) {
+		card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
+		card->qdio.default_out_queue = 1;
+	} else if (!strcmp(tmp, "no_prio_queueing:2")) {
+		card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
+		card->qdio.default_out_queue = 2;
+	} else if (!strcmp(tmp, "no_prio_queueing:3")) {
+		card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
+		card->qdio.default_out_queue = 3;
+	} else if (!strcmp(tmp, "no_prio_queueing")) {
+		card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING;
+		card->qdio.default_out_queue = QETH_DEFAULT_QUEUE;
+	} else {
+		PRINT_WARN("Unknown queueing type '%s'\n", tmp);
+		return -EINVAL;
+	}
+	return count;
+}
+
+static DEVICE_ATTR(priority_queueing, 0644, qeth_dev_prioqing_show,
+		qeth_dev_prioqing_store);
+
+static ssize_t
+qeth_dev_bufcnt_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return sprintf(buf, "%i\n", card->qdio.in_buf_pool.buf_count);
+}
+
+static ssize_t
+qeth_dev_bufcnt_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+	char *tmp;
+	unsigned int cnt;
+
+	if (!card)
+		return -EINVAL;
+
+	if ((card->state != CARD_STATE_DOWN) &&
+	    (card->state != CARD_STATE_RECOVER))
+		return -EPERM;
+
+	cnt = simple_strtoul(buf, &tmp, 16);
+	cnt = (cnt < QETH_IN_BUF_COUNT_MIN) ? QETH_IN_BUF_COUNT_MIN :
+		((cnt > QETH_IN_BUF_COUNT_MAX) ? QETH_IN_BUF_COUNT_MAX : cnt);
+	card->qdio.in_buf_pool.buf_count = cnt;
+	/* TODO: steel/add buffers from/to a running card's buffer pool (?) */
+
+	return count;
+}
+
+static DEVICE_ATTR(buffer_count, 0644, qeth_dev_bufcnt_show,
+		qeth_dev_bufcnt_store);
+
+static inline ssize_t
+qeth_dev_route_show(struct qeth_routing_info *route, char *buf)
+{
+	switch (route->type) {
+	case PRIMARY_ROUTER:
+		return sprintf(buf, "%s\n", "primary router");
+	case SECONDARY_ROUTER:
+		return sprintf(buf, "%s\n", "secondary router");
+	case MULTICAST_ROUTER:
+		return sprintf(buf, "%s\n", "multicast router");
+	case PRIMARY_CONNECTOR:
+		return sprintf(buf, "%s\n", "primary connector");
+	case SECONDARY_CONNECTOR:
+		return sprintf(buf, "%s\n", "secondary connector");
+	default:
+		return sprintf(buf, "%s\n", "no");
+	}
+}
+
+static ssize_t
+qeth_dev_route4_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return qeth_dev_route_show(&card->options.route4, buf);
+}
+
+static inline ssize_t
+qeth_dev_route_store(struct qeth_card *card, struct qeth_routing_info *route,
+		enum qeth_prot_versions prot, const char *buf, size_t count)
+{
+	enum qeth_routing_types old_route_type = route->type;
+	char *tmp;
+	int rc;
+
+	tmp = strsep((char **) &buf, "\n");
+
+	if (!strcmp(tmp, "no_router")){
+		route->type = NO_ROUTER;
+		goto check_reset;
+	}
+
+	if (card->info.type == QETH_CARD_TYPE_IQD) {
+		if (!strcmp(tmp, "primary_connector")) {
+			route->type = PRIMARY_CONNECTOR;
+		} else if (!strcmp(tmp, "secondary_connector")) {
+			route->type = SECONDARY_CONNECTOR;
+		} else if (!strcmp(tmp, "multicast_router")) {
+			route->type = MULTICAST_ROUTER;
+		} else
+			goto out_inval;
+	} else {
+		if (!strcmp(tmp, "primary_router")) {
+			route->type = PRIMARY_ROUTER;
+		} else if (!strcmp(tmp, "secondary_router")) {
+			route->type = SECONDARY_ROUTER;
+		} else if (!strcmp(tmp, "multicast_router")) {
+			if (qeth_is_ipafunc_supported(card, prot,
+						      IPA_OSA_MC_ROUTER))
+				route->type = MULTICAST_ROUTER;
+			else
+				goto out_inval;
+		} else
+			goto out_inval;
+	}
+check_reset:
+	if (old_route_type != route->type){
+		if (prot == QETH_PROT_IPV4)
+			rc = qeth_setrouting_v4(card);
+		else if (prot == QETH_PROT_IPV6)
+			rc = qeth_setrouting_v6(card);
+	}
+	return count;
+out_inval:
+	PRINT_WARN("Routing type '%s' not supported for interface %s.\n"
+		   "Router status not changed.\n",
+		   tmp, card->info.if_name);
+	return -EINVAL;
+}
+
+static ssize_t
+qeth_dev_route4_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return qeth_dev_route_store(card, &card->options.route4,
+			            QETH_PROT_IPV4, buf, count);
+}
+
+static DEVICE_ATTR(route4, 0644, qeth_dev_route4_show, qeth_dev_route4_store);
+
+#ifdef CONFIG_QETH_IPV6
+static ssize_t
+qeth_dev_route6_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	if (!qeth_is_supported(card, IPA_IPV6))
+		return sprintf(buf, "%s\n", "n/a");
+
+	return qeth_dev_route_show(&card->options.route6, buf);
+}
+
+static ssize_t
+qeth_dev_route6_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	if (!qeth_is_supported(card, IPA_IPV6)){
+		PRINT_WARN("IPv6 not supported for interface %s.\n"
+			   "Routing status no changed.\n",
+			   card->info.if_name);
+		return -ENOTSUPP;
+	}
+
+	return qeth_dev_route_store(card, &card->options.route6,
+			            QETH_PROT_IPV6, buf, count);
+}
+
+static DEVICE_ATTR(route6, 0644, qeth_dev_route6_show, qeth_dev_route6_store);
+#endif
+
+static ssize_t
+qeth_dev_add_hhlen_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return sprintf(buf, "%i\n", card->options.add_hhlen);
+}
+
+static ssize_t
+qeth_dev_add_hhlen_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+	char *tmp;
+	int i;
+
+	if (!card)
+		return -EINVAL;
+
+	if ((card->state != CARD_STATE_DOWN) &&
+	    (card->state != CARD_STATE_RECOVER))
+		return -EPERM;
+
+	i = simple_strtoul(buf, &tmp, 16);
+	if ((i < 0) || (i > MAX_ADD_HHLEN)) {
+		PRINT_WARN("add_hhlen out of range\n");
+		return -EINVAL;
+	}
+	card->options.add_hhlen = i;
+
+	return count;
+}
+
+static DEVICE_ATTR(add_hhlen, 0644, qeth_dev_add_hhlen_show,
+		   qeth_dev_add_hhlen_store);
+
+static ssize_t
+qeth_dev_fake_ll_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return sprintf(buf, "%i\n", card->options.fake_ll? 1:0);
+}
+
+static ssize_t
+qeth_dev_fake_ll_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+	char *tmp;
+	int i;
+
+	if (!card)
+		return -EINVAL;
+
+	if ((card->state != CARD_STATE_DOWN) &&
+	    (card->state != CARD_STATE_RECOVER))
+		return -EPERM;
+
+	i = simple_strtoul(buf, &tmp, 16);
+	if ((i == 0) || (i == 1))
+		card->options.fake_ll = i;
+	else {
+		PRINT_WARN("fake_ll: write 0 or 1 to this file!\n");
+		return -EINVAL;
+	}
+	return count;
+}
+
+static DEVICE_ATTR(fake_ll, 0644, qeth_dev_fake_ll_show,
+		   qeth_dev_fake_ll_store);
+
+static ssize_t
+qeth_dev_fake_broadcast_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return sprintf(buf, "%i\n", card->options.fake_broadcast? 1:0);
+}
+
+static ssize_t
+qeth_dev_fake_broadcast_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+	char *tmp;
+	int i;
+
+	if (!card)
+		return -EINVAL;
+
+	if ((card->state != CARD_STATE_DOWN) &&
+	    (card->state != CARD_STATE_RECOVER))
+		return -EPERM;
+
+	i = simple_strtoul(buf, &tmp, 16);
+	if ((i == 0) || (i == 1))
+		card->options.fake_broadcast = i;
+	else {
+		PRINT_WARN("fake_broadcast: write 0 or 1 to this file!\n");
+		return -EINVAL;
+	}
+	return count;
+}
+
+static DEVICE_ATTR(fake_broadcast, 0644, qeth_dev_fake_broadcast_show,
+		   qeth_dev_fake_broadcast_store);
+
+static ssize_t
+qeth_dev_recover_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+	char *tmp;
+	int i;
+
+	if (!card)
+		return -EINVAL;
+
+	if ((card->state != CARD_STATE_UP_LAN_ONLINE) &&
+	    (card->state != CARD_STATE_UP_LAN_OFFLINE))
+		return -EPERM;
+
+	i = simple_strtoul(buf, &tmp, 16);
+	if (i == 1)
+		qeth_schedule_recovery(card);
+
+	return count;
+}
+
+static DEVICE_ATTR(recover, 0200, NULL, qeth_dev_recover_store);
+
+/* TODO */
+static ssize_t
+qeth_dev_broadcast_mode_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	if (!((card->info.link_type == QETH_LINK_TYPE_HSTR) ||
+	      (card->info.link_type == QETH_LINK_TYPE_LANE_TR)))
+		return sprintf(buf, "n/a\n");
+
+	return sprintf(buf, "%s\n", (card->options.broadcast_mode ==
+				     QETH_TR_BROADCAST_ALLRINGS)?
+		       "all rings":"local");
+}
+
+/* TODO */
+static ssize_t
+qeth_dev_broadcast_mode_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+	char *tmp;
+
+	if (!card)
+		return -EINVAL;
+
+	if ((card->state != CARD_STATE_DOWN) &&
+	    (card->state != CARD_STATE_RECOVER))
+		return -EPERM;
+
+	if (!((card->info.link_type == QETH_LINK_TYPE_HSTR) ||
+	      (card->info.link_type == QETH_LINK_TYPE_LANE_TR))){
+		PRINT_WARN("Device is not a tokenring device!\n");
+		return -EINVAL;
+	}
+
+	tmp = strsep((char **) &buf, "\n");
+
+	if (!strcmp(tmp, "local")){
+		card->options.broadcast_mode = QETH_TR_BROADCAST_LOCAL;
+		return count;
+	} else if (!strcmp(tmp, "all_rings")) {
+		card->options.broadcast_mode = QETH_TR_BROADCAST_ALLRINGS;
+		return count;
+	} else {
+		PRINT_WARN("broadcast_mode: invalid mode %s!\n",
+			   tmp);
+		return -EINVAL;
+	}
+	return count;
+}
+
+static DEVICE_ATTR(broadcast_mode, 0644, qeth_dev_broadcast_mode_show,
+		   qeth_dev_broadcast_mode_store);
+
+/* TODO */
+static ssize_t
+qeth_dev_canonical_macaddr_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	if (!((card->info.link_type == QETH_LINK_TYPE_HSTR) ||
+	      (card->info.link_type == QETH_LINK_TYPE_LANE_TR)))
+		return sprintf(buf, "n/a\n");
+
+	return sprintf(buf, "%i\n", (card->options.macaddr_mode ==
+				     QETH_TR_MACADDR_CANONICAL)? 1:0);
+}
+
+/* TODO */
+static ssize_t
+qeth_dev_canonical_macaddr_store(struct device *dev, const char *buf,
+				  size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+	char *tmp;
+	int i;
+
+	if (!card)
+		return -EINVAL;
+
+	if ((card->state != CARD_STATE_DOWN) &&
+	    (card->state != CARD_STATE_RECOVER))
+		return -EPERM;
+
+	if (!((card->info.link_type == QETH_LINK_TYPE_HSTR) ||
+	      (card->info.link_type == QETH_LINK_TYPE_LANE_TR))){
+		PRINT_WARN("Device is not a tokenring device!\n");
+		return -EINVAL;
+	}
+
+	i = simple_strtoul(buf, &tmp, 16);
+	if ((i == 0) || (i == 1))
+		card->options.macaddr_mode = i?
+			QETH_TR_MACADDR_CANONICAL :
+			QETH_TR_MACADDR_NONCANONICAL;
+	else {
+		PRINT_WARN("canonical_macaddr: write 0 or 1 to this file!\n");
+		return -EINVAL;
+	}
+	return count;
+}
+
+static DEVICE_ATTR(canonical_macaddr, 0644, qeth_dev_canonical_macaddr_show,
+		   qeth_dev_canonical_macaddr_store);
+
+static struct device_attribute * qeth_device_attrs[] = {
+	&dev_attr_state,
+	&dev_attr_chpid,
+	&dev_attr_if_name,
+	&dev_attr_card_type,
+	&dev_attr_portno,
+	&dev_attr_portname,
+	&dev_attr_checksumming,
+	&dev_attr_priority_queueing,
+	&dev_attr_buffer_count,
+	&dev_attr_route4,
+#ifdef CONFIG_QETH_IPV6
+	&dev_attr_route6,
+#endif
+	&dev_attr_add_hhlen,
+	&dev_attr_fake_ll,
+	&dev_attr_fake_broadcast,
+	&dev_attr_recover,
+	&dev_attr_broadcast_mode,
+	&dev_attr_canonical_macaddr,
+	NULL,
+};
+
+static struct attribute_group qeth_device_attr_group = {
+	.attrs = (struct attribute **)qeth_device_attrs,
+};
+
+
+#define QETH_DEVICE_ATTR(_id,_name,_mode,_show,_store)			     \
+struct device_attribute dev_attr_##_id = {				     \
+	.attr = {.name=__stringify(_name), .mode=_mode, .owner=THIS_MODULE },\
+	.show	= _show,						     \
+	.store	= _store,						     \
+};
+
+static ssize_t
+qeth_dev_ipato_enable_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return sprintf(buf, "%i\n", card->ipato.enabled? 1:0);
+}
+
+static ssize_t
+qeth_dev_ipato_enable_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+	char *tmp;
+
+	if (!card)
+		return -EINVAL;
+
+	tmp = strsep((char **) &buf, "\n");
+	if (!strcmp(tmp, "toggle")){
+		card->ipato.enabled = (card->ipato.enabled)? 0 : 1;
+	} else if (!strcmp(tmp, "1")){
+		card->ipato.enabled = 1;
+	} else if (!strcmp(tmp, "0")){
+		card->ipato.enabled = 0;
+	} else {
+		PRINT_WARN("ipato_enable: write 0, 1 or 'toggle' to "
+			   "this file\n");
+		return -EINVAL;
+	}
+	return count;
+}
+
+static QETH_DEVICE_ATTR(ipato_enable, enable, 0644,
+			qeth_dev_ipato_enable_show,
+			qeth_dev_ipato_enable_store);
+
+static ssize_t
+qeth_dev_ipato_invert4_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return sprintf(buf, "%i\n", card->ipato.invert4? 1:0);
+}
+
+static ssize_t
+qeth_dev_ipato_invert4_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+	char *tmp;
+
+	if (!card)
+		return -EINVAL;
+
+	tmp = strsep((char **) &buf, "\n");
+	if (!strcmp(tmp, "toggle")){
+		card->ipato.invert4 = (card->ipato.invert4)? 0 : 1;
+	} else if (!strcmp(tmp, "1")){
+		card->ipato.invert4 = 1;
+	} else if (!strcmp(tmp, "0")){
+		card->ipato.invert4 = 0;
+	} else {
+		PRINT_WARN("ipato_invert4: write 0, 1 or 'toggle' to "
+			   "this file\n");
+		return -EINVAL;
+	}
+	return count;
+}
+
+static QETH_DEVICE_ATTR(ipato_invert4, invert4, 0644,
+			qeth_dev_ipato_invert4_show,
+			qeth_dev_ipato_invert4_store);
+
+static inline ssize_t
+qeth_dev_ipato_add_show(char *buf, struct qeth_card *card,
+			enum qeth_prot_versions proto)
+{
+	struct qeth_ipato_entry *ipatoe;
+	unsigned long flags;
+	char addr_str[49];
+	int i = 0;
+
+	spin_lock_irqsave(&card->ip_lock, flags);
+	list_for_each_entry(ipatoe, &card->ipato.entries, entry){
+		if (ipatoe->proto != proto)
+			continue;
+		qeth_ipaddr_to_string(proto, ipatoe->addr, addr_str);
+		i += sprintf(buf + i, "%s/%i\n", addr_str, ipatoe->mask_bits);
+	}
+	spin_unlock_irqrestore(&card->ip_lock, flags);
+	i += sprintf(buf + i, "\n");
+
+	return i;
+}
+
+static ssize_t
+qeth_dev_ipato_add4_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return qeth_dev_ipato_add_show(buf, card, QETH_PROT_IPV4);
+}
+
+static inline int
+qeth_parse_ipatoe(const char* buf, enum qeth_prot_versions proto,
+		  u8 *addr, int *mask_bits)
+{
+	const char *start, *end;
+	char *tmp;
+	char buffer[49] = {0, };
+
+	start = buf;
+	/* get address string */
+	end = strchr(start, '/');
+	if (!end){
+		PRINT_WARN("Invalid format for ipato_addx/delx. "
+			   "Use <ip addr>/<mask bits>\n");
+		return -EINVAL;
+	}
+	strncpy(buffer, start, end - start);
+	if (qeth_string_to_ipaddr(buffer, proto, addr)){
+		PRINT_WARN("Invalid IP address format!\n");
+		return -EINVAL;
+	}
+	start = end + 1;
+	*mask_bits = simple_strtoul(start, &tmp, 10);
+
+	return 0;
+}
+
+static inline ssize_t
+qeth_dev_ipato_add_store(const char *buf, size_t count,
+			 struct qeth_card *card, enum qeth_prot_versions proto)
+{
+	struct qeth_ipato_entry *ipatoe;
+	u8 addr[16];
+	int mask_bits;
+	int rc;
+
+	if ((rc = qeth_parse_ipatoe(buf, proto, addr, &mask_bits)))
+		return rc;
+
+	if (!(ipatoe = kmalloc(sizeof(struct qeth_ipato_entry), GFP_KERNEL))){
+		PRINT_WARN("No memory to allocate ipato entry\n");
+		return -ENOMEM;
+	}
+	memset(ipatoe, 0, sizeof(struct qeth_ipato_entry));
+	ipatoe->proto = proto;
+	memcpy(ipatoe->addr, addr, (proto == QETH_PROT_IPV4)? 4:16);
+	ipatoe->mask_bits = mask_bits;
+
+	if ((rc = qeth_add_ipato_entry(card, ipatoe))){
+		kfree(ipatoe);
+		return rc;
+	}
+
+	return count;
+}
+
+static ssize_t
+qeth_dev_ipato_add4_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return qeth_dev_ipato_add_store(buf, count, card, QETH_PROT_IPV4);
+}
+
+static QETH_DEVICE_ATTR(ipato_add4, add4, 0644,
+			qeth_dev_ipato_add4_show,
+			qeth_dev_ipato_add4_store);
+
+static inline ssize_t
+qeth_dev_ipato_del_store(const char *buf, size_t count,
+			 struct qeth_card *card, enum qeth_prot_versions proto)
+{
+	u8 addr[16];
+	int mask_bits;
+	int rc;
+
+	if ((rc = qeth_parse_ipatoe(buf, proto, addr, &mask_bits)))
+		return rc;
+
+	qeth_del_ipato_entry(card, proto, addr, mask_bits);
+
+	return count;
+}
+
+static ssize_t
+qeth_dev_ipato_del4_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return qeth_dev_ipato_del_store(buf, count, card, QETH_PROT_IPV4);
+}
+
+static QETH_DEVICE_ATTR(ipato_del4, del4, 0200, NULL,
+			qeth_dev_ipato_del4_store);
+
+#ifdef CONFIG_QETH_IPV6
+static ssize_t
+qeth_dev_ipato_invert6_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return sprintf(buf, "%i\n", card->ipato.invert6? 1:0);
+}
+
+static ssize_t
+qeth_dev_ipato_invert6_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+	char *tmp;
+
+	if (!card)
+		return -EINVAL;
+
+	tmp = strsep((char **) &buf, "\n");
+	if (!strcmp(tmp, "toggle")){
+		card->ipato.invert6 = (card->ipato.invert6)? 0 : 1;
+	} else if (!strcmp(tmp, "1")){
+		card->ipato.invert6 = 1;
+	} else if (!strcmp(tmp, "0")){
+		card->ipato.invert6 = 0;
+	} else {
+		PRINT_WARN("ipato_invert6: write 0, 1 or 'toggle' to "
+			   "this file\n");
+		return -EINVAL;
+	}
+	return count;
+}
+
+static QETH_DEVICE_ATTR(ipato_invert6, invert6, 0644,
+			qeth_dev_ipato_invert6_show,
+			qeth_dev_ipato_invert6_store);
+
+
+static ssize_t
+qeth_dev_ipato_add6_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return qeth_dev_ipato_add_show(buf, card, QETH_PROT_IPV6);
+}
+
+static ssize_t
+qeth_dev_ipato_add6_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return qeth_dev_ipato_add_store(buf, count, card, QETH_PROT_IPV6);
+}
+
+static QETH_DEVICE_ATTR(ipato_add6, add6, 0644,
+			qeth_dev_ipato_add6_show,
+			qeth_dev_ipato_add6_store);
+
+static ssize_t
+qeth_dev_ipato_del6_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return qeth_dev_ipato_del_store(buf, count, card, QETH_PROT_IPV6);
+}
+
+static QETH_DEVICE_ATTR(ipato_del6, del6, 0200, NULL,
+			qeth_dev_ipato_del6_store);
+#endif /* CONFIG_QETH_IPV6 */
+
+static struct device_attribute * qeth_ipato_device_attrs[] = {
+	&dev_attr_ipato_enable,
+	&dev_attr_ipato_invert4,
+	&dev_attr_ipato_add4,
+	&dev_attr_ipato_del4,
+#ifdef CONFIG_QETH_IPV6
+	&dev_attr_ipato_invert6,
+	&dev_attr_ipato_add6,
+	&dev_attr_ipato_del6,
+#endif
+	NULL,
+};
+
+static struct attribute_group qeth_device_ipato_group = {
+	.name = "ipa_takeover",
+	.attrs = (struct attribute **)qeth_ipato_device_attrs,
+};
+
+static inline ssize_t
+qeth_dev_vipa_add_show(char *buf, struct qeth_card *card,
+			enum qeth_prot_versions proto)
+{
+	struct qeth_ipaddr *ipaddr;
+	char addr_str[49];
+	unsigned long flags;
+	int i = 0;
+
+	spin_lock_irqsave(&card->ip_lock, flags);
+	list_for_each_entry(ipaddr, &card->ip_list, entry){
+		if (ipaddr->proto != proto)
+			continue;
+		if (ipaddr->type != QETH_IP_TYPE_VIPA)
+			continue;
+		qeth_ipaddr_to_string(proto, (const u8 *)&ipaddr->u, addr_str);
+		i += sprintf(buf + i, "%s\n", addr_str);
+	}
+	spin_unlock_irqrestore(&card->ip_lock, flags);
+	i += sprintf(buf + i, "\n");
+
+	return i;
+}
+
+static ssize_t
+qeth_dev_vipa_add4_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return qeth_dev_vipa_add_show(buf, card, QETH_PROT_IPV4);
+}
+
+static inline int
+qeth_parse_vipae(const char* buf, enum qeth_prot_versions proto,
+		 u8 *addr)
+{
+	if (qeth_string_to_ipaddr(buf, proto, addr)){
+		PRINT_WARN("Invalid IP address format!\n");
+		return -EINVAL;
+	}
+	return 0;
+}
+
+static inline ssize_t
+qeth_dev_vipa_add_store(const char *buf, size_t count,
+			 struct qeth_card *card, enum qeth_prot_versions proto)
+{
+	u8 addr[16] = {0, };
+	int rc;
+
+	if ((rc = qeth_parse_vipae(buf, proto, addr)))
+		return rc;
+
+	if ((rc = qeth_add_vipa(card, proto, addr)))
+		return rc;
+
+	return count;
+}
+
+static ssize_t
+qeth_dev_vipa_add4_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return qeth_dev_vipa_add_store(buf, count, card, QETH_PROT_IPV4);
+}
+
+static QETH_DEVICE_ATTR(vipa_add4, add4, 0644,
+			qeth_dev_vipa_add4_show,
+			qeth_dev_vipa_add4_store);
+
+static inline ssize_t
+qeth_dev_vipa_del_store(const char *buf, size_t count,
+			 struct qeth_card *card, enum qeth_prot_versions proto)
+{
+	u8 addr[16];
+	int rc;
+
+	if ((rc = qeth_parse_vipae(buf, proto, addr)))
+		return rc;
+
+	qeth_del_vipa(card, proto, addr);
+
+	return count;
+}
+
+static ssize_t
+qeth_dev_vipa_del4_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return qeth_dev_vipa_del_store(buf, count, card, QETH_PROT_IPV4);
+}
+
+static QETH_DEVICE_ATTR(vipa_del4, del4, 0200, NULL,
+			qeth_dev_vipa_del4_store);
+
+#ifdef CONFIG_QETH_IPV6
+static ssize_t
+qeth_dev_vipa_add6_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return qeth_dev_vipa_add_show(buf, card, QETH_PROT_IPV6);
+}
+
+static ssize_t
+qeth_dev_vipa_add6_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return qeth_dev_vipa_add_store(buf, count, card, QETH_PROT_IPV6);
+}
+
+static QETH_DEVICE_ATTR(vipa_add6, add6, 0644,
+			qeth_dev_vipa_add6_show,
+			qeth_dev_vipa_add6_store);
+
+static ssize_t
+qeth_dev_vipa_del6_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return qeth_dev_vipa_del_store(buf, count, card, QETH_PROT_IPV6);
+}
+
+static QETH_DEVICE_ATTR(vipa_del6, del6, 0200, NULL,
+			qeth_dev_vipa_del6_store);
+#endif /* CONFIG_QETH_IPV6 */
+
+static struct device_attribute * qeth_vipa_device_attrs[] = {
+	&dev_attr_vipa_add4,
+	&dev_attr_vipa_del4,
+#ifdef CONFIG_QETH_IPV6
+	&dev_attr_vipa_add6,
+	&dev_attr_vipa_del6,
+#endif
+	NULL,
+};
+
+static struct attribute_group qeth_device_vipa_group = {
+	.name = "vipa",
+	.attrs = (struct attribute **)qeth_vipa_device_attrs,
+};
+
+static inline ssize_t
+qeth_dev_rxip_add_show(char *buf, struct qeth_card *card,
+		       enum qeth_prot_versions proto)
+{
+	struct qeth_ipaddr *ipaddr;
+	char addr_str[49];
+	unsigned long flags;
+	int i = 0;
+
+	spin_lock_irqsave(&card->ip_lock, flags);
+	list_for_each_entry(ipaddr, &card->ip_list, entry){
+		if (ipaddr->proto != proto)
+			continue;
+		if (ipaddr->type != QETH_IP_TYPE_RXIP)
+			continue;
+		qeth_ipaddr_to_string(proto, (const u8 *)&ipaddr->u, addr_str);
+		i += sprintf(buf + i, "%s\n", addr_str);
+	}
+	spin_unlock_irqrestore(&card->ip_lock, flags);
+	i += sprintf(buf + i, "\n");
+
+	return i;
+}
+
+static ssize_t
+qeth_dev_rxip_add4_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return qeth_dev_rxip_add_show(buf, card, QETH_PROT_IPV4);
+}
+
+static inline int
+qeth_parse_rxipe(const char* buf, enum qeth_prot_versions proto,
+		 u8 *addr)
+{
+	if (qeth_string_to_ipaddr(buf, proto, addr)){
+		PRINT_WARN("Invalid IP address format!\n");
+		return -EINVAL;
+	}
+	return 0;
+}
+
+static inline ssize_t
+qeth_dev_rxip_add_store(const char *buf, size_t count,
+			struct qeth_card *card, enum qeth_prot_versions proto)
+{
+	u8 addr[16] = {0, };
+	int rc;
+
+	if ((rc = qeth_parse_rxipe(buf, proto, addr)))
+		return rc;
+
+	if ((rc = qeth_add_rxip(card, proto, addr)))
+		return rc;
+
+	return count;
+}
+
+static ssize_t
+qeth_dev_rxip_add4_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return qeth_dev_rxip_add_store(buf, count, card, QETH_PROT_IPV4);
+}
+
+static QETH_DEVICE_ATTR(rxip_add4, add4, 0644,
+			qeth_dev_rxip_add4_show,
+			qeth_dev_rxip_add4_store);
+
+static inline ssize_t
+qeth_dev_rxip_del_store(const char *buf, size_t count,
+			struct qeth_card *card, enum qeth_prot_versions proto)
+{
+	u8 addr[16];
+	int rc;
+
+	if ((rc = qeth_parse_rxipe(buf, proto, addr)))
+		return rc;
+
+	qeth_del_rxip(card, proto, addr);
+
+	return count;
+}
+
+static ssize_t
+qeth_dev_rxip_del4_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return qeth_dev_rxip_del_store(buf, count, card, QETH_PROT_IPV4);
+}
+
+static QETH_DEVICE_ATTR(rxip_del4, del4, 0200, NULL,
+			qeth_dev_rxip_del4_store);
+
+#ifdef CONFIG_QETH_IPV6
+static ssize_t
+qeth_dev_rxip_add6_show(struct device *dev, char *buf)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return qeth_dev_rxip_add_show(buf, card, QETH_PROT_IPV6);
+}
+
+static ssize_t
+qeth_dev_rxip_add6_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return qeth_dev_rxip_add_store(buf, count, card, QETH_PROT_IPV6);
+}
+
+static QETH_DEVICE_ATTR(rxip_add6, add6, 0644,
+			qeth_dev_rxip_add6_show,
+			qeth_dev_rxip_add6_store);
+
+static ssize_t
+qeth_dev_rxip_del6_store(struct device *dev, const char *buf, size_t count)
+{
+	struct qeth_card *card = dev->driver_data;
+
+	if (!card)
+		return -EINVAL;
+
+	return qeth_dev_rxip_del_store(buf, count, card, QETH_PROT_IPV6);
+}
+
+static QETH_DEVICE_ATTR(rxip_del6, del6, 0200, NULL,
+			qeth_dev_rxip_del6_store);
+#endif /* CONFIG_QETH_IPV6 */
+
+static struct device_attribute * qeth_rxip_device_attrs[] = {
+	&dev_attr_rxip_add4,
+	&dev_attr_rxip_del4,
+#ifdef CONFIG_QETH_IPV6
+	&dev_attr_rxip_add6,
+	&dev_attr_rxip_del6,
+#endif
+	NULL,
+};
+
+static struct attribute_group qeth_device_rxip_group = {
+	.name = "rxip",
+	.attrs = (struct attribute **)qeth_rxip_device_attrs,
+};
+
+int
+qeth_create_device_attributes(struct device *dev)
+{
+	int ret;
+
+	if ((ret = sysfs_create_group(&dev->kobj, &qeth_device_attr_group)))
+		return ret;
+	if ((ret = sysfs_create_group(&dev->kobj, &qeth_device_ipato_group))){
+		sysfs_remove_group(&dev->kobj, &qeth_device_attr_group);
+		return ret;
+	}
+	if ((ret = sysfs_create_group(&dev->kobj, &qeth_device_vipa_group))){
+		sysfs_remove_group(&dev->kobj, &qeth_device_attr_group);
+		sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group);
+		return ret;
+	}
+	if ((ret = sysfs_create_group(&dev->kobj, &qeth_device_rxip_group))){
+		sysfs_remove_group(&dev->kobj, &qeth_device_attr_group);
+		sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group);
+		sysfs_remove_group(&dev->kobj, &qeth_device_vipa_group);
+	}
+
+	return ret;
+}
+
+void
+qeth_remove_device_attributes(struct device *dev)
+{
+	sysfs_remove_group(&dev->kobj, &qeth_device_attr_group);
+	sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group);
+	sysfs_remove_group(&dev->kobj, &qeth_device_vipa_group);
+	sysfs_remove_group(&dev->kobj, &qeth_device_rxip_group);
+}
+
+/**********************/
+/* DRIVER ATTRIBUTES  */
+/**********************/
+static ssize_t
+qeth_driver_group_store(struct device_driver *ddrv, const char *buf,
+			size_t count)
+{
+	const char *start, *end;
+	char bus_ids[3][BUS_ID_SIZE], *argv[3];
+	int i;
+	int err;
+
+	start = buf;
+	for (i = 0; i < 3; i++) {
+		static const char delim[] = { ',', ',', '\n' };
+		int len;
+
+		if (!(end = strchr(start, delim[i])))
+			return -EINVAL;
+		len = min_t(ptrdiff_t, BUS_ID_SIZE, end - start);
+		strncpy(bus_ids[i], start, len);
+		bus_ids[i][len] = '\0';
+		start = end + 1;
+		argv[i] = bus_ids[i];
+	}
+	err = ccwgroup_create(qeth_root_dev, qeth_ccwgroup_driver.driver_id,
+			&qeth_ccw_driver, 3, argv);
+	if (err)
+		return err;
+	else
+		return count;
+}
+
+
+static DRIVER_ATTR(group, 0200, 0, qeth_driver_group_store);
+
+static ssize_t
+qeth_driver_snmp_register_show(struct device_driver *ddrv, char *buf)
+{
+	/* TODO */
+	return 0;
+}
+
+static ssize_t
+qeth_driver_snmp_register_store(struct device_driver *ddrv, const char *buf,
+				size_t count)
+{
+	/* TODO */
+	return count;
+}
+
+static DRIVER_ATTR(snmp_register, 0644, qeth_driver_snmp_register_show,
+		   qeth_driver_snmp_register_store);
+
+int
+qeth_create_driver_attributes(void)
+{
+	int rc;
+
+	if ((rc = driver_create_file(&qeth_ccwgroup_driver.driver,
+				     &driver_attr_group)))
+		return rc;
+	return driver_create_file(&qeth_ccwgroup_driver.driver,
+				  &driver_attr_snmp_register);
+}
+
+void
+qeth_remove_driver_attributes(void)
+{
+	driver_remove_file(&qeth_ccwgroup_driver.driver,
+			&driver_attr_group);
+	driver_remove_file(&qeth_ccwgroup_driver.driver,
+			&driver_attr_snmp_register);
+}
--- diff/drivers/scsi/sata_sis.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/scsi/sata_sis.c	2004-04-21 10:45:34.911396160 +0100
@@ -0,0 +1,214 @@
+/*
+ *  sata_sis.c - Silicon Integrated Systems SATA
+ *
+ *  Copyright 2004 Uwe Koziolek
+ *
+ *  The contents of this file are subject to the Open
+ *  Software License version 1.1 that can be found at
+ *  http://www.opensource.org/licenses/osl-1.1.txt and is included herein
+ *  by reference.
+ *
+ *  Alternatively, the contents of this file may be used under the terms
+ *  of the GNU General Public License version 2 (the "GPL") as distributed
+ *  in the kernel source COPYING file, in which case the provisions of
+ *  the GPL are applicable instead of the above.  If you wish to allow
+ *  the use of your version of this file only under the terms of the
+ *  GPL and not to allow others to use your version of this file under
+ *  the OSL, indicate your decision by deleting the provisions above and
+ *  replace them with the notice and other provisions required by the GPL.
+ *  If you do not delete the provisions above, a recipient may use your
+ *  version of this file under either the OSL or the GPL.
+ *
+ */
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/pci.h>
+#include <linux/init.h>
+#include <linux/blkdev.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include "scsi.h"
+#include "hosts.h"
+#include <linux/libata.h>
+
+#define DRV_NAME	"sata_sis"
+#define DRV_VERSION	"0.04"
+
+enum {
+	sis_180			= 0,
+};
+
+static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
+static u32 sis_scr_read (struct ata_port *ap, unsigned int sc_reg);
+static void sis_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
+
+static struct pci_device_id sis_pci_tbl[] = {
+	{ PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_180, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sis_180 },
+	{ }	/* terminate list */
+};
+
+
+static struct pci_driver sis_pci_driver = {
+	.name			= DRV_NAME,
+	.id_table		= sis_pci_tbl,
+	.probe			= sis_init_one,
+	.remove			= ata_pci_remove_one,
+};
+
+static Scsi_Host_Template sis_sht = {
+	.module			= THIS_MODULE,
+	.name			= DRV_NAME,
+	.queuecommand		= ata_scsi_queuecmd,
+	.eh_strategy_handler	= ata_scsi_error,
+	.can_queue		= ATA_DEF_QUEUE,
+	.this_id		= ATA_SHT_THIS_ID,
+	.sg_tablesize		= ATA_MAX_PRD,
+	.max_sectors		= ATA_MAX_SECTORS,
+	.cmd_per_lun		= ATA_SHT_CMD_PER_LUN,
+	.emulated		= ATA_SHT_EMULATED,
+	.use_clustering		= ATA_SHT_USE_CLUSTERING,
+	.proc_name		= DRV_NAME,
+	.dma_boundary		= ATA_DMA_BOUNDARY,
+	.slave_configure	= ata_scsi_slave_config,
+	.bios_param		= ata_std_bios_param,
+};
+
+static struct ata_port_operations sis_ops = {
+	.port_disable		= ata_port_disable,
+	.tf_load		= ata_tf_load_pio,
+	.tf_read		= ata_tf_read_pio,
+	.check_status		= ata_check_status_pio,
+	.exec_command		= ata_exec_command_pio,
+	.phy_reset		= sata_phy_reset,
+	.bmdma_start            = ata_bmdma_start_pio,
+	.fill_sg		= ata_fill_sg,
+	.eng_timeout		= ata_eng_timeout,
+	.irq_handler		= ata_interrupt,
+	.scr_read		= sis_scr_read,
+	.scr_write		= sis_scr_write,
+	.port_start		= ata_port_start,
+	.port_stop		= ata_port_stop,
+};
+
+
+MODULE_AUTHOR("Uwe Koziolek");
+MODULE_DESCRIPTION("low-level driver for Silicon Integratad Systems SATA controller");
+MODULE_LICENSE("GPL");
+MODULE_DEVICE_TABLE(pci, sis_pci_tbl);
+
+
+static u32 sis_scr_read (struct ata_port *ap, unsigned int sc_reg)
+{
+	if (sc_reg >= 16)
+		return 0xffffffffU;
+
+	return inl(ap->ioaddr.scr_addr + (sc_reg * 4));
+}
+
+static void sis_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
+{
+	if (sc_reg >= 16)
+		return;
+	outl(val, ap->ioaddr.scr_addr + (sc_reg * 4));
+}
+
+/* move to PCI layer, integrate w/ MSI stuff */
+static void pci_enable_intx(struct pci_dev *pdev)
+{
+	u16 pci_command;
+
+	pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
+	if (pci_command & PCI_COMMAND_INTX_DISABLE) {
+		pci_command &= ~PCI_COMMAND_INTX_DISABLE;
+		pci_write_config_word(pdev, PCI_COMMAND, pci_command);
+	}
+}
+
+static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
+{
+	struct ata_probe_ent *probe_ent = NULL;
+	int rc;
+
+	rc = pci_enable_device(pdev);
+	if (rc)
+		return rc;
+
+	rc = pci_request_regions(pdev, DRV_NAME);
+	if (rc)
+		goto err_out;
+
+	rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
+	if (rc)
+		goto err_out_regions;
+	rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
+	if (rc)
+		goto err_out_regions;
+
+	probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
+	if (!probe_ent) {
+		rc = -ENOMEM;
+		goto err_out_regions;
+	}
+
+	memset(probe_ent, 0, sizeof(*probe_ent));
+	probe_ent->pdev = pdev;
+	INIT_LIST_HEAD(&probe_ent->node);
+
+	probe_ent->sht = &sis_sht;
+	probe_ent->host_flags = ATA_FLAG_SATA | ATA_FLAG_SATA_RESET |
+				ATA_FLAG_NO_LEGACY;
+	probe_ent->pio_mask = 0x03;
+	probe_ent->udma_mask = 0x7f;
+	probe_ent->port_ops = &sis_ops;
+
+	probe_ent->port[0].cmd_addr = pci_resource_start(pdev, 0);
+	ata_std_ports(&probe_ent->port[0]);
+	probe_ent->port[0].ctl_addr =
+		pci_resource_start(pdev, 1) | ATA_PCI_CTL_OFS;
+	probe_ent->port[0].bmdma_addr = pci_resource_start(pdev, 4);
+	probe_ent->port[0].scr_addr = pci_resource_start(pdev, 5);
+
+	probe_ent->port[1].cmd_addr = pci_resource_start(pdev, 2);
+	ata_std_ports(&probe_ent->port[1]);
+	probe_ent->port[1].ctl_addr =
+		pci_resource_start(pdev, 3) | ATA_PCI_CTL_OFS;
+	probe_ent->port[1].bmdma_addr = pci_resource_start(pdev, 4) + 8;
+	probe_ent->port[1].scr_addr = pci_resource_start(pdev, 5) + 64;
+
+	probe_ent->n_ports = 2;
+	probe_ent->irq = pdev->irq;
+	probe_ent->irq_flags = SA_SHIRQ;
+
+	pci_set_master(pdev);
+	pci_enable_intx(pdev);
+
+	/* FIXME: check ata_device_add return value */
+	ata_device_add(probe_ent);
+	kfree(probe_ent);
+
+	return 0;
+
+err_out_regions:
+	pci_release_regions(pdev);
+
+err_out:
+	pci_disable_device(pdev);
+	return rc;
+
+}
+
+static int __init sis_init(void)
+{
+	return pci_module_init(&sis_pci_driver);
+}
+
+static void __exit sis_exit(void)
+{
+	pci_unregister_driver(&sis_pci_driver);
+}
+
+
+module_init(sis_init);
+module_exit(sis_exit);
--- diff/drivers/serial/amba-pl010.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/serial/amba-pl010.c	2004-04-21 10:45:34.980385672 +0100
@@ -0,0 +1,826 @@
+/*
+ *  linux/drivers/char/amba.c
+ *
+ *  Driver for AMBA serial ports
+ *
+ *  Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
+ *
+ *  Copyright 1999 ARM Limited
+ *  Copyright (C) 2000 Deep Blue Solutions Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ *  $Id: amba.c,v 1.41 2002/07/28 10:03:27 rmk Exp $
+ *
+ * This is a generic driver for ARM AMBA-type serial ports.  They
+ * have a lot of 16550-like features, but are not register compatible.
+ * Note that although they do have CTS, DCD and DSR inputs, they do
+ * not have an RI input, nor do they have DTR or RTS outputs.  If
+ * required, these have to be supplied via some other means (eg, GPIO)
+ * and hooked into this driver.
+ */
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/tty.h>
+#include <linux/ioport.h>
+#include <linux/init.h>
+#include <linux/serial.h>
+#include <linux/console.h>
+#include <linux/sysrq.h>
+#include <linux/device.h>
+
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/hardware/amba.h>
+
+#if defined(CONFIG_SERIAL_AMBA_PL010_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
+#define SUPPORT_SYSRQ
+#endif
+
+#include <linux/serial_core.h>
+
+#include <asm/hardware/amba_serial.h>
+
+#define UART_NR		2
+
+#define SERIAL_AMBA_MAJOR	204
+#define SERIAL_AMBA_MINOR	16
+#define SERIAL_AMBA_NR		UART_NR
+
+#define AMBA_ISR_PASS_LIMIT	256
+
+/*
+ * Access macros for the AMBA UARTs
+ */
+#define UART_GET_INT_STATUS(p)	readb((p)->membase + UART010_IIR)
+#define UART_PUT_ICR(p, c)	writel((c), (p)->membase + UART010_ICR)
+#define UART_GET_FR(p)		readb((p)->membase + UART01x_FR)
+#define UART_GET_CHAR(p)	readb((p)->membase + UART01x_DR)
+#define UART_PUT_CHAR(p, c)	writel((c), (p)->membase + UART01x_DR)
+#define UART_GET_RSR(p)		readb((p)->membase + UART01x_RSR)
+#define UART_GET_CR(p)		readb((p)->membase + UART010_CR)
+#define UART_PUT_CR(p,c)	writel((c), (p)->membase + UART010_CR)
+#define UART_GET_LCRL(p)	readb((p)->membase + UART010_LCRL)
+#define UART_PUT_LCRL(p,c)	writel((c), (p)->membase + UART010_LCRL)
+#define UART_GET_LCRM(p)	readb((p)->membase + UART010_LCRM)
+#define UART_PUT_LCRM(p,c)	writel((c), (p)->membase + UART010_LCRM)
+#define UART_GET_LCRH(p)	readb((p)->membase + UART010_LCRH)
+#define UART_PUT_LCRH(p,c)	writel((c), (p)->membase + UART010_LCRH)
+#define UART_RX_DATA(s)		(((s) & UART01x_FR_RXFE) == 0)
+#define UART_TX_READY(s)	(((s) & UART01x_FR_TXFF) == 0)
+#define UART_TX_EMPTY(p)	((UART_GET_FR(p) & UART01x_FR_TMSK) == 0)
+
+#define UART_DUMMY_RSR_RX	/*256*/0
+#define UART_PORT_SIZE		64
+
+/*
+ * On the Integrator platform, the port RTS and DTR are provided by
+ * bits in the following SC_CTRLS register bits:
+ *        RTS  DTR
+ *  UART0  7    6
+ *  UART1  5    4
+ */
+#define SC_CTRLC	(IO_ADDRESS(INTEGRATOR_SC_BASE) + INTEGRATOR_SC_CTRLC_OFFSET)
+#define SC_CTRLS	(IO_ADDRESS(INTEGRATOR_SC_BASE) + INTEGRATOR_SC_CTRLS_OFFSET)
+
+/*
+ * We wrap our port structure around the generic uart_port.
+ */
+struct uart_amba_port {
+	struct uart_port	port;
+	unsigned int		dtr_mask;
+	unsigned int		rts_mask;
+	unsigned int		old_status;
+};
+
+static void pl010_stop_tx(struct uart_port *port, unsigned int tty_stop)
+{
+	unsigned int cr;
+
+	cr = UART_GET_CR(port);
+	cr &= ~UART010_CR_TIE;
+	UART_PUT_CR(port, cr);
+}
+
+static void pl010_start_tx(struct uart_port *port, unsigned int tty_start)
+{
+	unsigned int cr;
+
+	cr = UART_GET_CR(port);
+	cr |= UART010_CR_TIE;
+	UART_PUT_CR(port, cr);
+}
+
+static void pl010_stop_rx(struct uart_port *port)
+{
+	unsigned int cr;
+
+	cr = UART_GET_CR(port);
+	cr &= ~(UART010_CR_RIE | UART010_CR_RTIE);
+	UART_PUT_CR(port, cr);
+}
+
+static void pl010_enable_ms(struct uart_port *port)
+{
+	unsigned int cr;
+
+	cr = UART_GET_CR(port);
+	cr |= UART010_CR_MSIE;
+	UART_PUT_CR(port, cr);
+}
+
+static void
+#ifdef SUPPORT_SYSRQ
+pl010_rx_chars(struct uart_port *port, struct pt_regs *regs)
+#else
+pl010_rx_chars(struct uart_port *port)
+#endif
+{
+	struct tty_struct *tty = port->info->tty;
+	unsigned int status, ch, rsr, max_count = 256;
+
+	status = UART_GET_FR(port);
+	while (UART_RX_DATA(status) && max_count--) {
+		if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
+			tty->flip.work.func((void *)tty);
+			if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
+				printk(KERN_WARNING "TTY_DONT_FLIP set\n");
+				return;
+			}
+		}
+
+		ch = UART_GET_CHAR(port);
+
+		*tty->flip.char_buf_ptr = ch;
+		*tty->flip.flag_buf_ptr = TTY_NORMAL;
+		port->icount.rx++;
+
+		/*
+		 * Note that the error handling code is
+		 * out of the main execution path
+		 */
+		rsr = UART_GET_RSR(port) | UART_DUMMY_RSR_RX;
+		if (rsr & UART01x_RSR_ANY) {
+			if (rsr & UART01x_RSR_BE) {
+				rsr &= ~(UART01x_RSR_FE | UART01x_RSR_PE);
+				port->icount.brk++;
+				if (uart_handle_break(port))
+					goto ignore_char;
+			} else if (rsr & UART01x_RSR_PE)
+				port->icount.parity++;
+			else if (rsr & UART01x_RSR_FE)
+				port->icount.frame++;
+			if (rsr & UART01x_RSR_OE)
+				port->icount.overrun++;
+
+			rsr &= port->read_status_mask;
+
+			if (rsr & UART01x_RSR_BE)
+				*tty->flip.flag_buf_ptr = TTY_BREAK;
+			else if (rsr & UART01x_RSR_PE)
+				*tty->flip.flag_buf_ptr = TTY_PARITY;
+			else if (rsr & UART01x_RSR_FE)
+				*tty->flip.flag_buf_ptr = TTY_FRAME;
+		}
+
+		if (uart_handle_sysrq_char(port, ch, regs))
+			goto ignore_char;
+
+		if ((rsr & port->ignore_status_mask) == 0) {
+			tty->flip.flag_buf_ptr++;
+			tty->flip.char_buf_ptr++;
+			tty->flip.count++;
+		}
+		if ((rsr & UART01x_RSR_OE) &&
+		    tty->flip.count < TTY_FLIPBUF_SIZE) {
+			/*
+			 * Overrun is special, since it's reported
+			 * immediately, and doesn't affect the current
+			 * character
+			 */
+			*tty->flip.char_buf_ptr++ = 0;
+			*tty->flip.flag_buf_ptr++ = TTY_OVERRUN;
+			tty->flip.count++;
+		}
+	ignore_char:
+		status = UART_GET_FR(port);
+	}
+	tty_flip_buffer_push(tty);
+	return;
+}
+
+static void pl010_tx_chars(struct uart_port *port)
+{
+	struct circ_buf *xmit = &port->info->xmit;
+	int count;
+
+	if (port->x_char) {
+		UART_PUT_CHAR(port, port->x_char);
+		port->icount.tx++;
+		port->x_char = 0;
+		return;
+	}
+	if (uart_circ_empty(xmit) || uart_tx_stopped(port)) {
+		pl010_stop_tx(port, 0);
+		return;
+	}
+
+	count = port->fifosize >> 1;
+	do {
+		UART_PUT_CHAR(port, xmit->buf[xmit->tail]);
+		xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
+		port->icount.tx++;
+		if (uart_circ_empty(xmit))
+			break;
+	} while (--count > 0);
+
+	if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
+		uart_write_wakeup(port);
+
+	if (uart_circ_empty(xmit))
+		pl010_stop_tx(port, 0);
+}
+
+static void pl010_modem_status(struct uart_port *port)
+{
+	struct uart_amba_port *uap = (struct uart_amba_port *)port;
+	unsigned int status, delta;
+
+	UART_PUT_ICR(&uap->port, 0);
+
+	status = UART_GET_FR(&uap->port) & UART01x_FR_MODEM_ANY;
+
+	delta = status ^ uap->old_status;
+	uap->old_status = status;
+
+	if (!delta)
+		return;
+
+	if (delta & UART01x_FR_DCD)
+		uart_handle_dcd_change(&uap->port, status & UART01x_FR_DCD);
+
+	if (delta & UART01x_FR_DSR)
+		uap->port.icount.dsr++;
+
+	if (delta & UART01x_FR_CTS)
+		uart_handle_cts_change(&uap->port, status & UART01x_FR_CTS);
+
+	wake_up_interruptible(&uap->port.info->delta_msr_wait);
+}
+
+static irqreturn_t pl010_int(int irq, void *dev_id, struct pt_regs *regs)
+{
+	struct uart_port *port = dev_id;
+	unsigned int status, pass_counter = AMBA_ISR_PASS_LIMIT;
+	int handled = 0;
+
+	spin_lock(&port->lock);
+
+	status = UART_GET_INT_STATUS(port);
+	if (status) {
+		do {
+			if (status & (UART010_IIR_RTIS | UART010_IIR_RIS))
+#ifdef SUPPORT_SYSRQ
+				pl010_rx_chars(port, regs);
+#else
+				pl010_rx_chars(port);
+#endif
+			if (status & UART010_IIR_MIS)
+				pl010_modem_status(port);
+			if (status & UART010_IIR_TIS)
+				pl010_tx_chars(port);
+
+			if (pass_counter-- == 0)
+				break;
+
+			status = UART_GET_INT_STATUS(port);
+		} while (status & (UART010_IIR_RTIS | UART010_IIR_RIS |
+				   UART010_IIR_TIS));
+		handled = 1;
+	}
+
+	spin_unlock(&port->lock);
+
+	return IRQ_RETVAL(handled);
+}
+
+static unsigned int pl010_tx_empty(struct uart_port *port)
+{
+	return UART_GET_FR(port) & UART01x_FR_BUSY ? 0 : TIOCSER_TEMT;
+}
+
+static unsigned int pl010_get_mctrl(struct uart_port *port)
+{
+	unsigned int result = 0;
+	unsigned int status;
+
+	status = UART_GET_FR(port);
+	if (status & UART01x_FR_DCD)
+		result |= TIOCM_CAR;
+	if (status & UART01x_FR_DSR)
+		result |= TIOCM_DSR;
+	if (status & UART01x_FR_CTS)
+		result |= TIOCM_CTS;
+
+	return result;
+}
+
+static void pl010_set_mctrl(struct uart_port *port, unsigned int mctrl)
+{
+	struct uart_amba_port *uap = (struct uart_amba_port *)port;
+	unsigned int ctrls = 0, ctrlc = 0;
+
+	if (mctrl & TIOCM_RTS)
+		ctrlc |= uap->rts_mask;
+	else
+		ctrls |= uap->rts_mask;
+
+	if (mctrl & TIOCM_DTR)
+		ctrlc |= uap->dtr_mask;
+	else
+		ctrls |= uap->dtr_mask;
+
+	__raw_writel(ctrls, SC_CTRLS);
+	__raw_writel(ctrlc, SC_CTRLC);
+}
+
+static void pl010_break_ctl(struct uart_port *port, int break_state)
+{
+	unsigned long flags;
+	unsigned int lcr_h;
+
+	spin_lock_irqsave(&port->lock, flags);
+	lcr_h = UART_GET_LCRH(port);
+	if (break_state == -1)
+		lcr_h |= UART01x_LCRH_BRK;
+	else
+		lcr_h &= ~UART01x_LCRH_BRK;
+	UART_PUT_LCRH(port, lcr_h);
+	spin_unlock_irqrestore(&port->lock, flags);
+}
+
+static int pl010_startup(struct uart_port *port)
+{
+	struct uart_amba_port *uap = (struct uart_amba_port *)port;
+	int retval;
+
+	/*
+	 * Allocate the IRQ
+	 */
+	retval = request_irq(port->irq, pl010_int, 0, "uart-pl010", port);
+	if (retval)
+		return retval;
+
+	/*
+	 * initialise the old status of the modem signals
+	 */
+	uap->old_status = UART_GET_FR(port) & UART01x_FR_MODEM_ANY;
+
+	/*
+	 * Finally, enable interrupts
+	 */
+	UART_PUT_CR(port, UART01x_CR_UARTEN | UART010_CR_RIE |
+			  UART010_CR_RTIE);
+
+	return 0;
+}
+
+static void pl010_shutdown(struct uart_port *port)
+{
+	/*
+	 * Free the interrupt
+	 */
+	free_irq(port->irq, port);
+
+	/*
+	 * disable all interrupts, disable the port
+	 */
+	UART_PUT_CR(port, 0);
+
+	/* disable break condition and fifos */
+	UART_PUT_LCRH(port, UART_GET_LCRH(port) &
+		~(UART01x_LCRH_BRK | UART01x_LCRH_FEN));
+}
+
+static void
+pl010_set_termios(struct uart_port *port, struct termios *termios,
+		     struct termios *old)
+{
+	unsigned int lcr_h, old_cr;
+	unsigned long flags;
+	unsigned int baud, quot;
+
+	/*
+	 * Ask the core to calculate the divisor for us.
+	 */
+	baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16); 
+	quot = uart_get_divisor(port, baud);
+
+	switch (termios->c_cflag & CSIZE) {
+	case CS5:
+		lcr_h = UART01x_LCRH_WLEN_5;
+		break;
+	case CS6:
+		lcr_h = UART01x_LCRH_WLEN_6;
+		break;
+	case CS7:
+		lcr_h = UART01x_LCRH_WLEN_7;
+		break;
+	default: // CS8
+		lcr_h = UART01x_LCRH_WLEN_8;
+		break;
+	}
+	if (termios->c_cflag & CSTOPB)
+		lcr_h |= UART01x_LCRH_STP2;
+	if (termios->c_cflag & PARENB) {
+		lcr_h |= UART01x_LCRH_PEN;
+		if (!(termios->c_cflag & PARODD))
+			lcr_h |= UART01x_LCRH_EPS;
+	}
+	if (port->fifosize > 1)
+		lcr_h |= UART01x_LCRH_FEN;
+
+	spin_lock_irqsave(&port->lock, flags);
+
+	/*
+	 * Update the per-port timeout.
+	 */
+	uart_update_timeout(port, termios->c_cflag, baud);
+
+	port->read_status_mask = UART01x_RSR_OE;
+	if (termios->c_iflag & INPCK)
+		port->read_status_mask |= UART01x_RSR_FE | UART01x_RSR_PE;
+	if (termios->c_iflag & (BRKINT | PARMRK))
+		port->read_status_mask |= UART01x_RSR_BE;
+
+	/*
+	 * Characters to ignore
+	 */
+	port->ignore_status_mask = 0;
+	if (termios->c_iflag & IGNPAR)
+		port->ignore_status_mask |= UART01x_RSR_FE | UART01x_RSR_PE;
+	if (termios->c_iflag & IGNBRK) {
+		port->ignore_status_mask |= UART01x_RSR_BE;
+		/*
+		 * If we're ignoring parity and break indicators,
+		 * ignore overruns too (for real raw support).
+		 */
+		if (termios->c_iflag & IGNPAR)
+			port->ignore_status_mask |= UART01x_RSR_OE;
+	}
+
+	/*
+	 * Ignore all characters if CREAD is not set.
+	 */
+	if ((termios->c_cflag & CREAD) == 0)
+		port->ignore_status_mask |= UART_DUMMY_RSR_RX;
+
+	/* first, disable everything */
+	old_cr = UART_GET_CR(port) & ~UART010_CR_MSIE;
+
+	if (UART_ENABLE_MS(port, termios->c_cflag))
+		old_cr |= UART010_CR_MSIE;
+
+	UART_PUT_CR(port, 0);
+
+	/* Set baud rate */
+	quot -= 1;
+	UART_PUT_LCRM(port, ((quot & 0xf00) >> 8));
+	UART_PUT_LCRL(port, (quot & 0xff));
+
+	/*
+	 * ----------v----------v----------v----------v-----
+	 * NOTE: MUST BE WRITTEN AFTER UARTLCR_M & UARTLCR_L
+	 * ----------^----------^----------^----------^-----
+	 */
+	UART_PUT_LCRH(port, lcr_h);
+	UART_PUT_CR(port, old_cr);
+
+	spin_unlock_irqrestore(&port->lock, flags);
+}
+
+static const char *pl010_type(struct uart_port *port)
+{
+	return port->type == PORT_AMBA ? "AMBA" : NULL;
+}
+
+/*
+ * Release the memory region(s) being used by 'port'
+ */
+static void pl010_release_port(struct uart_port *port)
+{
+	release_mem_region(port->mapbase, UART_PORT_SIZE);
+}
+
+/*
+ * Request the memory region(s) being used by 'port'
+ */
+static int pl010_request_port(struct uart_port *port)
+{
+	return request_mem_region(port->mapbase, UART_PORT_SIZE, "uart-pl010")
+			!= NULL ? 0 : -EBUSY;
+}
+
+/*
+ * Configure/autoconfigure the port.
+ */
+static void pl010_config_port(struct uart_port *port, int flags)
+{
+	if (flags & UART_CONFIG_TYPE) {
+		port->type = PORT_AMBA;
+		pl010_request_port(port);
+	}
+}
+
+/*
+ * verify the new serial_struct (for TIOCSSERIAL).
+ */
+static int pl010_verify_port(struct uart_port *port, struct serial_struct *ser)
+{
+	int ret = 0;
+	if (ser->type != PORT_UNKNOWN && ser->type != PORT_AMBA)
+		ret = -EINVAL;
+	if (ser->irq < 0 || ser->irq >= NR_IRQS)
+		ret = -EINVAL;
+	if (ser->baud_base < 9600)
+		ret = -EINVAL;
+	return ret;
+}
+
+static struct uart_ops amba_pl010_pops = {
+	.tx_empty	= pl010_tx_empty,
+	.set_mctrl	= pl010_set_mctrl,
+	.get_mctrl	= pl010_get_mctrl,
+	.stop_tx	= pl010_stop_tx,
+	.start_tx	= pl010_start_tx,
+	.stop_rx	= pl010_stop_rx,
+	.enable_ms	= pl010_enable_ms,
+	.break_ctl	= pl010_break_ctl,
+	.startup	= pl010_startup,
+	.shutdown	= pl010_shutdown,
+	.set_termios	= pl010_set_termios,
+	.type		= pl010_type,
+	.release_port	= pl010_release_port,
+	.request_port	= pl010_request_port,
+	.config_port	= pl010_config_port,
+	.verify_port	= pl010_verify_port,
+};
+
+static struct uart_amba_port amba_ports[UART_NR] = {
+	{
+		.port	= {
+			.membase	= (void *)IO_ADDRESS(INTEGRATOR_UART0_BASE),
+			.mapbase	= INTEGRATOR_UART0_BASE,
+			.iotype		= SERIAL_IO_MEM,
+			.irq		= IRQ_UARTINT0,
+			.uartclk	= 14745600,
+			.fifosize	= 16,
+			.ops		= &amba_pl010_pops,
+			.flags		= ASYNC_BOOT_AUTOCONF,
+			.line		= 0,
+		},
+		.dtr_mask	= 1 << 5,
+		.rts_mask	= 1 << 4,
+	},
+	{
+		.port	= {
+			.membase	= (void *)IO_ADDRESS(INTEGRATOR_UART1_BASE),
+			.mapbase	= INTEGRATOR_UART1_BASE,
+			.iotype		= SERIAL_IO_MEM,
+			.irq		= IRQ_UARTINT1,
+			.uartclk	= 14745600,
+			.fifosize	= 16,
+			.ops		= &amba_pl010_pops,
+			.flags		= ASYNC_BOOT_AUTOCONF,
+			.line		= 1,
+		},
+		.dtr_mask	= 1 << 7,
+		.rts_mask	= 1 << 6,
+	}
+};
+
+#ifdef CONFIG_SERIAL_AMBA_PL010_CONSOLE
+
+static void
+pl010_console_write(struct console *co, const char *s, unsigned int count)
+{
+	struct uart_port *port = &amba_ports[co->index].port;
+	unsigned int status, old_cr;
+	int i;
+
+	/*
+	 *	First save the CR then disable the interrupts
+	 */
+	old_cr = UART_GET_CR(port);
+	UART_PUT_CR(port, UART01x_CR_UARTEN);
+
+	/*
+	 *	Now, do each character
+	 */
+	for (i = 0; i < count; i++) {
+		do {
+			status = UART_GET_FR(port);
+		} while (!UART_TX_READY(status));
+		UART_PUT_CHAR(port, s[i]);
+		if (s[i] == '\n') {
+			do {
+				status = UART_GET_FR(port);
+			} while (!UART_TX_READY(status));
+			UART_PUT_CHAR(port, '\r');
+		}
+	}
+
+	/*
+	 *	Finally, wait for transmitter to become empty
+	 *	and restore the TCR
+	 */
+	do {
+		status = UART_GET_FR(port);
+	} while (status & UART01x_FR_BUSY);
+	UART_PUT_CR(port, old_cr);
+}
+
+static void __init
+pl010_console_get_options(struct uart_port *port, int *baud,
+			     int *parity, int *bits)
+{
+	if (UART_GET_CR(port) & UART01x_CR_UARTEN) {
+		unsigned int lcr_h, quot;
+		lcr_h = UART_GET_LCRH(port);
+
+		*parity = 'n';
+		if (lcr_h & UART01x_LCRH_PEN) {
+			if (lcr_h & UART01x_LCRH_EPS)
+				*parity = 'e';
+			else
+				*parity = 'o';
+		}
+
+		if ((lcr_h & 0x60) == UART01x_LCRH_WLEN_7)
+			*bits = 7;
+		else
+			*bits = 8;
+
+		quot = UART_GET_LCRL(port) | UART_GET_LCRM(port) << 8;
+		*baud = port->uartclk / (16 * (quot + 1));
+	}
+}
+
+static int __init pl010_console_setup(struct console *co, char *options)
+{
+	struct uart_port *port;
+	int baud = 38400;
+	int bits = 8;
+	int parity = 'n';
+	int flow = 'n';
+
+	/*
+	 * Check whether an invalid uart number has been specified, and
+	 * if so, search for the first available port that does have
+	 * console support.
+	 */
+	if (co->index >= UART_NR)
+		co->index = 0;
+	port = &amba_ports[co->index].port;
+
+	if (options)
+		uart_parse_options(options, &baud, &parity, &bits, &flow);
+	else
+		pl010_console_get_options(port, &baud, &parity, &bits);
+
+	return uart_set_options(port, co, baud, parity, bits, flow);
+}
+
+extern struct uart_driver amba_reg;
+static struct console amba_console = {
+	.name		= "ttyAM",
+	.write		= pl010_console_write,
+	.device		= uart_console_device,
+	.setup		= pl010_console_setup,
+	.flags		= CON_PRINTBUFFER,
+	.index		= -1,
+	.data		= &amba_reg,
+};
+
+#define AMBA_CONSOLE	&amba_console
+#else
+#define AMBA_CONSOLE	NULL
+#endif
+
+static struct uart_driver amba_reg = {
+	.owner			= THIS_MODULE,
+	.driver_name		= "ttyAM",
+	.dev_name		= "ttyAM",
+	.major			= SERIAL_AMBA_MAJOR,
+	.minor			= SERIAL_AMBA_MINOR,
+	.nr			= UART_NR,
+	.cons			= AMBA_CONSOLE,
+};
+
+static int pl010_probe(struct amba_device *dev, void *id)
+{
+	int i;
+
+	for (i = 0; i < UART_NR; i++) {
+		if (amba_ports[i].port.mapbase != dev->res.start)
+			continue;
+
+		amba_ports[i].port.dev = &dev->dev;
+		uart_add_one_port(&amba_reg, &amba_ports[i].port);
+		amba_set_drvdata(dev, &amba_ports[i]);
+		break;
+	}
+
+	return 0;
+}
+
+static int pl010_remove(struct amba_device *dev)
+{
+	struct uart_amba_port *uap = amba_get_drvdata(dev);
+
+	if (uap)
+		uart_remove_one_port(&amba_reg, &uap->port);
+
+	amba_set_drvdata(dev, NULL);
+
+	return 0;
+}
+
+static int pl010_suspend(struct amba_device *dev, u32 state)
+{
+	struct uart_amba_port *uap = amba_get_drvdata(dev);
+
+	if (uap)
+		uart_suspend_port(&amba_reg, &uap->port);
+
+	return 0;
+}
+
+static int pl010_resume(struct amba_device *dev)
+{
+	struct uart_amba_port *uap = amba_get_drvdata(dev);
+
+	if (uap)
+		uart_resume_port(&amba_reg, &uap->port);
+
+	return 0;
+}
+
+static struct amba_id pl010_ids[] __initdata = {
+	{
+		.id	= 0x00041010,
+		.mask	= 0x000fffff,
+	},
+	{ 0, 0 },
+};
+
+static struct amba_driver pl010_driver = {
+	.drv = {
+		.name	= "uart-pl010",
+	},
+	.id_table	= pl010_ids,
+	.probe		= pl010_probe,
+	.remove		= pl010_remove,
+	.suspend	= pl010_suspend,
+	.resume		= pl010_resume,
+};
+
+static int __init pl010_init(void)
+{
+	int ret;
+
+	printk(KERN_INFO "Serial: AMBA driver $Revision: 1.41 $\n");
+
+	ret = uart_register_driver(&amba_reg);
+	if (ret == 0) {
+		ret = amba_driver_register(&pl010_driver);
+		if (ret)
+			uart_unregister_driver(&amba_reg);
+	}
+	return ret;
+}
+
+static void __exit pl010_exit(void)
+{
+	amba_driver_unregister(&pl010_driver);
+	uart_unregister_driver(&amba_reg);
+}
+
+module_init(pl010_init);
+module_exit(pl010_exit);
+
+MODULE_AUTHOR("ARM Ltd/Deep Blue Solutions Ltd");
+MODULE_DESCRIPTION("ARM AMBA serial port driver $Revision: 1.41 $");
+MODULE_LICENSE("GPL");
--- diff/drivers/serial/amba-pl011.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/serial/amba-pl011.c	2004-04-21 10:45:34.981385520 +0100
@@ -0,0 +1,865 @@
+/*
+ *  linux/drivers/char/amba.c
+ *
+ *  Driver for AMBA serial ports
+ *
+ *  Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
+ *
+ *  Copyright 1999 ARM Limited
+ *  Copyright (C) 2000 Deep Blue Solutions Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ *  $Id: amba.c,v 1.41 2002/07/28 10:03:27 rmk Exp $
+ *
+ * This is a generic driver for ARM AMBA-type serial ports.  They
+ * have a lot of 16550-like features, but are not register compatible.
+ * Note that although they do have CTS, DCD and DSR inputs, they do
+ * not have an RI input, nor do they have DTR or RTS outputs.  If
+ * required, these have to be supplied via some other means (eg, GPIO)
+ * and hooked into this driver.
+ */
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/tty.h>
+#include <linux/ioport.h>
+#include <linux/init.h>
+#include <linux/serial.h>
+#include <linux/console.h>
+#include <linux/sysrq.h>
+#include <linux/device.h>
+
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/hardware/amba.h>
+#include <asm/hardware/clock.h>
+
+#if defined(CONFIG_SERIAL_AMBA_PL011_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
+#define SUPPORT_SYSRQ
+#endif
+
+#include <linux/serial_core.h>
+
+#include <asm/hardware/amba_serial.h>
+
+#define UART_NR			14
+
+#define SERIAL_AMBA_MAJOR	204
+#define SERIAL_AMBA_MINOR	64
+#define SERIAL_AMBA_NR		UART_NR
+
+#define AMBA_ISR_PASS_LIMIT	256
+
+#define UART_DUMMY_RSR_RX	256
+
+/*
+ * We wrap our port structure around the generic uart_port.
+ */
+struct uart_amba_port {
+	struct uart_port	port;
+	struct clk		*clk;
+	unsigned int		im;	/* interrupt mask */
+	unsigned int		old_status;
+};
+
+static void pl011_stop_tx(struct uart_port *port, unsigned int tty_stop)
+{
+	struct uart_amba_port *uap = (struct uart_amba_port *)port;
+
+	uap->im &= ~UART011_TXIM;
+	writew(uap->im, uap->port.membase + UART011_IMSC);
+}
+
+static void pl011_start_tx(struct uart_port *port, unsigned int tty_start)
+{
+	struct uart_amba_port *uap = (struct uart_amba_port *)port;
+
+	uap->im |= UART011_TXIM;
+	writew(uap->im, uap->port.membase + UART011_IMSC);
+}
+
+static void pl011_stop_rx(struct uart_port *port)
+{
+	struct uart_amba_port *uap = (struct uart_amba_port *)port;
+
+	uap->im &= ~(UART011_RXIM|UART011_RTIM|UART011_FEIM|
+		     UART011_PEIM|UART011_BEIM|UART011_OEIM);
+	writew(uap->im, uap->port.membase + UART011_IMSC);
+}
+
+static void pl011_enable_ms(struct uart_port *port)
+{
+	struct uart_amba_port *uap = (struct uart_amba_port *)port;
+
+	uap->im |= UART011_RIMIM|UART011_CTSMIM|UART011_DCDMIM|UART011_DSRMIM;
+	writew(uap->im, uap->port.membase + UART011_IMSC);
+}
+
+static void
+#ifdef SUPPORT_SYSRQ
+pl011_rx_chars(struct uart_amba_port *uap, struct pt_regs *regs)
+#else
+pl011_rx_chars(struct uart_amba_port *uap)
+#endif
+{
+	struct tty_struct *tty = uap->port.info->tty;
+	unsigned int status, ch, rsr, max_count = 256;
+
+	status = readw(uap->port.membase + UART01x_FR);
+	while ((status & UART01x_FR_RXFE) == 0 && max_count--) {
+		if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
+			tty->flip.work.func((void *)tty);
+			if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
+				printk(KERN_WARNING "TTY_DONT_FLIP set\n");
+				return;
+			}
+		}
+
+		ch = readw(uap->port.membase + UART01x_DR);
+
+		*tty->flip.char_buf_ptr = ch;
+		*tty->flip.flag_buf_ptr = TTY_NORMAL;
+		uap->port.icount.rx++;
+
+		/*
+		 * Note that the error handling code is
+		 * out of the main execution path
+		 */
+		rsr = readw(uap->port.membase + UART01x_RSR) | UART_DUMMY_RSR_RX;
+		if (rsr & UART01x_RSR_ANY) {
+			if (rsr & UART01x_RSR_BE) {
+				rsr &= ~(UART01x_RSR_FE | UART01x_RSR_PE);
+				uap->port.icount.brk++;
+				if (uart_handle_break(&uap->port))
+					goto ignore_char;
+			} else if (rsr & UART01x_RSR_PE)
+				uap->port.icount.parity++;
+			else if (rsr & UART01x_RSR_FE)
+				uap->port.icount.frame++;
+			if (rsr & UART01x_RSR_OE)
+				uap->port.icount.overrun++;
+
+			rsr &= uap->port.read_status_mask;
+
+			if (rsr & UART01x_RSR_BE)
+				*tty->flip.flag_buf_ptr = TTY_BREAK;
+			else if (rsr & UART01x_RSR_PE)
+				*tty->flip.flag_buf_ptr = TTY_PARITY;
+			else if (rsr & UART01x_RSR_FE)
+				*tty->flip.flag_buf_ptr = TTY_FRAME;
+		}
+
+		if (uart_handle_sysrq_char(&uap->port, ch, regs))
+			goto ignore_char;
+
+		if ((rsr & uap->port.ignore_status_mask) == 0) {
+			tty->flip.flag_buf_ptr++;
+			tty->flip.char_buf_ptr++;
+			tty->flip.count++;
+		}
+		if ((rsr & UART01x_RSR_OE) &&
+		    tty->flip.count < TTY_FLIPBUF_SIZE) {
+			/*
+			 * Overrun is special, since it's reported
+			 * immediately, and doesn't affect the current
+			 * character
+			 */
+			*tty->flip.char_buf_ptr++ = 0;
+			*tty->flip.flag_buf_ptr++ = TTY_OVERRUN;
+			tty->flip.count++;
+		}
+	ignore_char:
+		status = readw(uap->port.membase + UART01x_FR);
+	}
+	tty_flip_buffer_push(tty);
+	return;
+}
+
+static void pl011_tx_chars(struct uart_amba_port *uap)
+{
+	struct circ_buf *xmit = &uap->port.info->xmit;
+	int count;
+
+	if (uap->port.x_char) {
+		writew(uap->port.x_char, uap->port.membase + UART01x_DR);
+		uap->port.icount.tx++;
+		uap->port.x_char = 0;
+		return;
+	}
+	if (uart_circ_empty(xmit) || uart_tx_stopped(&uap->port)) {
+		pl011_stop_tx(&uap->port, 0);
+		return;
+	}
+
+	count = uap->port.fifosize >> 1;
+	do {
+		writew(xmit->buf[xmit->tail], uap->port.membase + UART01x_DR);
+		xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
+		uap->port.icount.tx++;
+		if (uart_circ_empty(xmit))
+			break;
+	} while (--count > 0);
+
+	if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
+		uart_write_wakeup(&uap->port);
+
+	if (uart_circ_empty(xmit))
+		pl011_stop_tx(&uap->port, 0);
+}
+
+static void pl011_modem_status(struct uart_amba_port *uap)
+{
+	unsigned int status, delta;
+
+	status = readw(uap->port.membase + UART01x_FR) & UART01x_FR_MODEM_ANY;
+
+	delta = status ^ uap->old_status;
+	uap->old_status = status;
+
+	if (!delta)
+		return;
+
+	if (delta & UART01x_FR_DCD)
+		uart_handle_dcd_change(&uap->port, status & UART01x_FR_DCD);
+
+	if (delta & UART01x_FR_DSR)
+		uap->port.icount.dsr++;
+
+	if (delta & UART01x_FR_CTS)
+		uart_handle_cts_change(&uap->port, status & UART01x_FR_CTS);
+
+	wake_up_interruptible(&uap->port.info->delta_msr_wait);
+}
+
+static irqreturn_t pl011_int(int irq, void *dev_id, struct pt_regs *regs)
+{
+	struct uart_amba_port *uap = dev_id;
+	unsigned int status, pass_counter = AMBA_ISR_PASS_LIMIT;
+	int handled = 0;
+
+	spin_lock(&uap->port.lock);
+
+	status = readw(uap->port.membase + UART011_MIS);
+	if (status) {
+		do {
+			writew(status & ~(UART011_TXIS|UART011_RTIS|
+					  UART011_RXIS),
+			       uap->port.membase + UART011_ICR);
+
+			if (status & (UART011_RTIS|UART011_RXIS))
+#ifdef SUPPORT_SYSRQ
+				pl011_rx_chars(uap, regs);
+#else
+				pl011_rx_chars(uap);
+#endif
+			if (status & (UART011_DSRMIS|UART011_DCDMIS|
+				      UART011_CTSMIS|UART011_RIMIS))
+				pl011_modem_status(uap);
+			if (status & UART011_TXIS)
+				pl011_tx_chars(uap);
+
+			if (pass_counter-- == 0)
+				break;
+
+			status = readw(uap->port.membase + UART011_MIS);
+		} while (status != 0);
+		handled = 1;
+	}
+
+	spin_unlock(&uap->port.lock);
+
+	return IRQ_RETVAL(handled);
+}
+
+static unsigned int pl01x_tx_empty(struct uart_port *port)
+{
+	struct uart_amba_port *uap = (struct uart_amba_port *)port;
+	unsigned int status = readw(uap->port.membase + UART01x_FR);
+	return status & (UART01x_FR_BUSY|UART01x_FR_TXFF) ? 0 : TIOCSER_TEMT;
+}
+
+static unsigned int pl01x_get_mctrl(struct uart_port *port)
+{
+	struct uart_amba_port *uap = (struct uart_amba_port *)port;
+	unsigned int result = 0;
+	unsigned int status = readw(uap->port.membase + UART01x_FR);
+
+#define BIT(uartbit, tiocmbit)		\
+	if (status & uartbit)		\
+		result |= tiocmbit
+
+	BIT(UART01x_FR_DCD, TIOCM_CAR);
+	BIT(UART01x_FR_DSR, TIOCM_DSR);
+	BIT(UART01x_FR_CTS, TIOCM_CTS);
+	BIT(UART011_FR_RI, TIOCM_RNG);
+#undef BIT
+	return result;
+}
+
+static void pl011_set_mctrl(struct uart_port *port, unsigned int mctrl)
+{
+	struct uart_amba_port *uap = (struct uart_amba_port *)port;
+	unsigned int cr;
+
+	cr = readw(uap->port.membase + UART011_CR);
+
+#define	BIT(tiocmbit, uartbit)		\
+	if (mctrl & tiocmbit)		\
+		cr |= uartbit;		\
+	else				\
+		cr &= ~uartbit
+
+	BIT(TIOCM_RTS, UART011_CR_RTS);
+	BIT(TIOCM_DTR, UART011_CR_DTR);
+	BIT(TIOCM_OUT1, UART011_CR_OUT1);
+	BIT(TIOCM_OUT2, UART011_CR_OUT2);
+	BIT(TIOCM_LOOP, UART011_CR_LBE);
+#undef BIT
+
+	writew(cr, uap->port.membase + UART011_CR);
+}
+
+static void pl011_break_ctl(struct uart_port *port, int break_state)
+{
+	struct uart_amba_port *uap = (struct uart_amba_port *)port;
+	unsigned long flags;
+	unsigned int lcr_h;
+
+	spin_lock_irqsave(&uap->port.lock, flags);
+	lcr_h = readw(uap->port.membase + UART011_LCRH);
+	if (break_state == -1)
+		lcr_h |= UART01x_LCRH_BRK;
+	else
+		lcr_h &= ~UART01x_LCRH_BRK;
+	writew(lcr_h, uap->port.membase + UART011_LCRH);
+	spin_unlock_irqrestore(&uap->port.lock, flags);
+}
+
+static int pl011_startup(struct uart_port *port)
+{
+	struct uart_amba_port *uap = (struct uart_amba_port *)port;
+	unsigned int cr;
+	int retval;
+
+	/*
+	 * Try to enable the clock producer.
+	 */
+	retval = clk_enable(uap->clk);
+	if (retval)
+		goto out;
+
+	/*
+	 * Allocate the IRQ
+	 */
+	retval = request_irq(uap->port.irq, pl011_int, 0, "uart-pl011", uap);
+	if (retval)
+		goto clk_dis;
+
+	writew(UART011_IFLS_RX4_8|UART011_IFLS_TX4_8,
+	       uap->port.membase + UART011_IFLS);
+
+	/*
+	 * Provoke TX FIFO interrupt into asserting.
+	 */
+	cr = UART01x_CR_UARTEN | UART011_CR_TXE | UART011_CR_LBE;
+	writew(cr, uap->port.membase + UART011_CR);
+	writew(0, uap->port.membase + UART011_FBRD);
+	writew(1, uap->port.membase + UART011_IBRD);
+	writew(0, uap->port.membase + UART011_LCRH);
+	writew(0, uap->port.membase + UART01x_DR);
+	while (readw(uap->port.membase + UART01x_FR) & UART01x_FR_BUSY)
+		barrier();
+
+	cr = UART01x_CR_UARTEN | UART011_CR_RXE | UART011_CR_TXE;
+	writew(cr, uap->port.membase + UART011_CR);
+
+	/*
+	 * initialise the old status of the modem signals
+	 */
+	uap->old_status = readw(uap->port.membase + UART01x_FR) & UART01x_FR_MODEM_ANY;
+
+	/*
+	 * Finally, enable interrupts
+	 */
+	spin_lock_irq(&uap->port.lock);
+	uap->im = UART011_RXIM | UART011_RTIM;
+	writew(uap->im, uap->port.membase + UART011_IMSC);
+	spin_unlock_irq(&uap->port.lock);
+
+	return 0;
+
+ clk_dis:
+	clk_disable(uap->clk);
+ out:
+	return retval;
+}
+
+static void pl011_shutdown(struct uart_port *port)
+{
+	struct uart_amba_port *uap = (struct uart_amba_port *)port;
+	unsigned long val;
+
+	/*
+	 * disable all interrupts
+	 */
+	spin_lock_irq(&uap->port.lock);
+	uap->im = 0;
+	writew(uap->im, uap->port.membase + UART011_IMSC);
+	writew(0xffff, uap->port.membase + UART011_ICR);
+	spin_unlock_irq(&uap->port.lock);
+
+	/*
+	 * Free the interrupt
+	 */
+	free_irq(uap->port.irq, uap);
+
+	/*
+	 * disable the port
+	 */
+	writew(UART01x_CR_UARTEN | UART011_CR_TXE, uap->port.membase + UART011_CR);
+
+	/*
+	 * disable break condition and fifos
+	 */
+	val = readw(uap->port.membase + UART011_LCRH);
+	val &= ~(UART01x_LCRH_BRK | UART01x_LCRH_FEN);
+	writew(val, uap->port.membase + UART011_LCRH);
+
+	/*
+	 * Shut down the clock producer
+	 */
+	clk_disable(uap->clk);
+}
+
+static void
+pl011_set_termios(struct uart_port *port, struct termios *termios,
+		     struct termios *old)
+{
+	unsigned int lcr_h, old_cr;
+	unsigned long flags;
+	unsigned int baud, quot;
+
+	/*
+	 * Ask the core to calculate the divisor for us.
+	 */
+	baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16);
+	quot = port->uartclk * 4 / baud;
+
+	switch (termios->c_cflag & CSIZE) {
+	case CS5:
+		lcr_h = UART01x_LCRH_WLEN_5;
+		break;
+	case CS6:
+		lcr_h = UART01x_LCRH_WLEN_6;
+		break;
+	case CS7:
+		lcr_h = UART01x_LCRH_WLEN_7;
+		break;
+	default: // CS8
+		lcr_h = UART01x_LCRH_WLEN_8;
+		break;
+	}
+	if (termios->c_cflag & CSTOPB)
+		lcr_h |= UART01x_LCRH_STP2;
+	if (termios->c_cflag & PARENB) {
+		lcr_h |= UART01x_LCRH_PEN;
+		if (!(termios->c_cflag & PARODD))
+			lcr_h |= UART01x_LCRH_EPS;
+	}
+	if (port->fifosize > 1)
+		lcr_h |= UART01x_LCRH_FEN;
+
+	spin_lock_irqsave(&port->lock, flags);
+
+	/*
+	 * Update the per-port timeout.
+	 */
+	uart_update_timeout(port, termios->c_cflag, baud);
+
+	port->read_status_mask = UART01x_RSR_OE;
+	if (termios->c_iflag & INPCK)
+		port->read_status_mask |= UART01x_RSR_FE | UART01x_RSR_PE;
+	if (termios->c_iflag & (BRKINT | PARMRK))
+		port->read_status_mask |= UART01x_RSR_BE;
+
+	/*
+	 * Characters to ignore
+	 */
+	port->ignore_status_mask = 0;
+	if (termios->c_iflag & IGNPAR)
+		port->ignore_status_mask |= UART01x_RSR_FE | UART01x_RSR_PE;
+	if (termios->c_iflag & IGNBRK) {
+		port->ignore_status_mask |= UART01x_RSR_BE;
+		/*
+		 * If we're ignoring parity and break indicators,
+		 * ignore overruns too (for real raw support).
+		 */
+		if (termios->c_iflag & IGNPAR)
+			port->ignore_status_mask |= UART01x_RSR_OE;
+	}
+
+	/*
+	 * Ignore all characters if CREAD is not set.
+	 */
+	if ((termios->c_cflag & CREAD) == 0)
+		port->ignore_status_mask |= UART_DUMMY_RSR_RX;
+
+	if (UART_ENABLE_MS(port, termios->c_cflag))
+		pl011_enable_ms(port);
+
+	/* first, disable everything */
+	old_cr = readw(port->membase + UART011_CR);
+	writew(0, port->membase + UART011_CR);
+
+	/* Set baud rate */
+	writew(quot & 0x3f, port->membase + UART011_FBRD);
+	writew(quot >> 6, port->membase + UART011_IBRD);
+
+	/*
+	 * ----------v----------v----------v----------v-----
+	 * NOTE: MUST BE WRITTEN AFTER UARTLCR_M & UARTLCR_L
+	 * ----------^----------^----------^----------^-----
+	 */
+	writew(lcr_h, port->membase + UART011_LCRH);
+	writew(old_cr, port->membase + UART011_CR);
+
+	spin_unlock_irqrestore(&port->lock, flags);
+}
+
+static const char *pl011_type(struct uart_port *port)
+{
+	return port->type == PORT_AMBA ? "AMBA/PL011" : NULL;
+}
+
+/*
+ * Release the memory region(s) being used by 'port'
+ */
+static void pl010_release_port(struct uart_port *port)
+{
+	release_mem_region(port->mapbase, SZ_4K);
+}
+
+/*
+ * Request the memory region(s) being used by 'port'
+ */
+static int pl010_request_port(struct uart_port *port)
+{
+	return request_mem_region(port->mapbase, SZ_4K, "uart-pl011")
+			!= NULL ? 0 : -EBUSY;
+}
+
+/*
+ * Configure/autoconfigure the port.
+ */
+static void pl010_config_port(struct uart_port *port, int flags)
+{
+	if (flags & UART_CONFIG_TYPE) {
+		port->type = PORT_AMBA;
+		pl010_request_port(port);
+	}
+}
+
+/*
+ * verify the new serial_struct (for TIOCSSERIAL).
+ */
+static int pl010_verify_port(struct uart_port *port, struct serial_struct *ser)
+{
+	int ret = 0;
+	if (ser->type != PORT_UNKNOWN && ser->type != PORT_AMBA)
+		ret = -EINVAL;
+	if (ser->irq < 0 || ser->irq >= NR_IRQS)
+		ret = -EINVAL;
+	if (ser->baud_base < 9600)
+		ret = -EINVAL;
+	return ret;
+}
+
+static struct uart_ops amba_pl011_pops = {
+	.tx_empty	= pl01x_tx_empty,
+	.set_mctrl	= pl011_set_mctrl,
+	.get_mctrl	= pl01x_get_mctrl,
+	.stop_tx	= pl011_stop_tx,
+	.start_tx	= pl011_start_tx,
+	.stop_rx	= pl011_stop_rx,
+	.enable_ms	= pl011_enable_ms,
+	.break_ctl	= pl011_break_ctl,
+	.startup	= pl011_startup,
+	.shutdown	= pl011_shutdown,
+	.set_termios	= pl011_set_termios,
+	.type		= pl011_type,
+	.release_port	= pl010_release_port,
+	.request_port	= pl010_request_port,
+	.config_port	= pl010_config_port,
+	.verify_port	= pl010_verify_port,
+};
+
+static struct uart_amba_port *amba_ports[UART_NR];
+
+#ifdef CONFIG_SERIAL_AMBA_PL011_CONSOLE
+
+static inline void
+pl011_console_write_char(struct uart_port *port, char ch)
+{
+	unsigned int status;
+
+	do {
+		status = readw(port->membase + UART01x_FR);
+	} while (status & UART01x_FR_TXFF);
+	writew(ch, port->membase + UART01x_DR);
+}
+
+static void
+pl011_console_write(struct console *co, const char *s, unsigned int count)
+{
+	struct uart_port *port = &amba_ports[co->index]->port;
+	unsigned int status, old_cr, new_cr;
+	int i;
+
+	/*
+	 *	First save the CR then disable the interrupts
+	 */
+	old_cr = readw(port->membase + UART011_CR);
+	new_cr = old_cr & ~UART011_CR_CTSEN;
+	new_cr |= UART01x_CR_UARTEN | UART011_CR_TXE;
+	writew(new_cr, port->membase + UART011_CR);
+
+	/*
+	 *	Now, do each character
+	 */
+	for (i = 0; i < count; i++) {
+		pl011_console_write_char(port, s[i]);
+		if (s[i] == '\n')
+			pl011_console_write_char(port, '\r');
+	}
+
+	/*
+	 *	Finally, wait for transmitter to become empty
+	 *	and restore the TCR
+	 */
+	do {
+		status = readw(port->membase + UART01x_FR);
+	} while (status & UART01x_FR_BUSY);
+	writew(old_cr, port->membase + UART011_CR);
+}
+
+static void __init
+pl011_console_get_options(struct uart_port *port, int *baud,
+			     int *parity, int *bits)
+{
+	if (readw(port->membase + UART011_CR) & UART01x_CR_UARTEN) {
+		unsigned int lcr_h, ibrd, fbrd;
+
+		lcr_h = readw(port->membase + UART011_LCRH);
+
+		*parity = 'n';
+		if (lcr_h & UART01x_LCRH_PEN) {
+			if (lcr_h & UART01x_LCRH_EPS)
+				*parity = 'e';
+			else
+				*parity = 'o';
+		}
+
+		if ((lcr_h & 0x60) == UART01x_LCRH_WLEN_7)
+			*bits = 7;
+		else
+			*bits = 8;
+
+		ibrd = readw(port->membase + UART011_IBRD);
+		fbrd = readw(port->membase + UART011_FBRD);
+
+		*baud = port->uartclk * 4 / (64 * ibrd + fbrd);
+	}
+}
+
+static int __init pl011_console_setup(struct console *co, char *options)
+{
+	struct uart_amba_port *uap;
+	int baud = 38400;
+	int bits = 8;
+	int parity = 'n';
+	int flow = 'n';
+	int ret;
+
+	/*
+	 * Check whether an invalid uart number has been specified, and
+	 * if so, search for the first available port that does have
+	 * console support.
+	 */
+	if (co->index >= UART_NR)
+		co->index = 0;
+	uap = amba_ports[co->index];
+
+	ret = clk_enable(uap->clk);
+	if (ret)
+		return ret;
+
+	if (options)
+		uart_parse_options(options, &baud, &parity, &bits, &flow);
+	else
+		pl011_console_get_options(&uap->port, &baud, &parity, &bits);
+
+	return uart_set_options(&uap->port, co, baud, parity, bits, flow);
+}
+
+extern struct uart_driver amba_reg;
+static struct console amba_console = {
+	.name		= "ttyAMA",
+	.write		= pl011_console_write,
+	.device		= uart_console_device,
+	.setup		= pl011_console_setup,
+	.flags		= CON_PRINTBUFFER,
+	.index		= -1,
+	.data		= &amba_reg,
+};
+
+#define AMBA_CONSOLE	(&amba_console)
+#else
+#define AMBA_CONSOLE	NULL
+#endif
+
+static struct uart_driver amba_reg = {
+	.owner			= THIS_MODULE,
+	.driver_name		= "ttyAMA",
+	.dev_name		= "ttyAMA",
+	.major			= SERIAL_AMBA_MAJOR,
+	.minor			= SERIAL_AMBA_MINOR,
+	.nr			= UART_NR,
+	.cons			= AMBA_CONSOLE,
+};
+
+static int pl011_probe(struct amba_device *dev, void *id)
+{
+	struct uart_amba_port *uap;
+	void *base;
+	int i, ret;
+
+	for (i = 0; i < ARRAY_SIZE(amba_ports); i++)
+		if (amba_ports[i] == NULL)
+			break;
+
+	if (i == ARRAY_SIZE(amba_ports)) {
+		ret = -EBUSY;
+		goto out;
+	}
+
+	uap = kmalloc(sizeof(struct uart_amba_port), GFP_KERNEL);
+	if (uap == NULL) {
+		ret = -ENOMEM;
+		goto out;
+	}
+
+	base = ioremap(dev->res.start, PAGE_SIZE);
+	if (!base) {
+		ret = -ENOMEM;
+		goto free;
+	}
+
+	memset(uap, 0, sizeof(struct uart_amba_port));
+	uap->clk = clk_get(&dev->dev, "UARTCLK");
+	if (IS_ERR(uap->clk)) {
+		ret = PTR_ERR(uap->clk);
+		goto unmap;
+	}
+
+	uap->port.dev = &dev->dev;
+	uap->port.mapbase = dev->res.start;
+	uap->port.membase = base;
+	uap->port.iotype = UPIO_MEM;
+	uap->port.irq = dev->irq[0];
+	uap->port.uartclk = clk_get_rate(uap->clk);
+	uap->port.fifosize = 16;
+	uap->port.ops = &amba_pl011_pops;
+	uap->port.flags = UPF_BOOT_AUTOCONF;
+	uap->port.line = i;
+
+	amba_ports[i] = uap;
+
+	amba_set_drvdata(dev, uap);
+	ret = uart_add_one_port(&amba_reg, &uap->port);
+	if (ret) {
+		amba_set_drvdata(dev, NULL);
+		amba_ports[i] = NULL;
+		clk_put(uap->clk);
+ unmap:
+		iounmap(base);
+ free:
+		kfree(uap);
+	}
+ out:
+	return ret;
+}
+
+static int pl011_remove(struct amba_device *dev)
+{
+	struct uart_amba_port *uap = amba_get_drvdata(dev);
+	int i;
+
+	amba_set_drvdata(dev, NULL);
+
+	uart_remove_one_port(&amba_reg, &uap->port);
+
+	for (i = 0; i < ARRAY_SIZE(amba_ports); i++)
+		if (amba_ports[i] == uap)
+			amba_ports[i] = NULL;
+
+	iounmap(uap->port.membase);
+	clk_put(uap->clk);
+	kfree(uap);
+	return 0;
+}
+
+static struct amba_id pl011_ids[] __initdata = {
+	{
+		.id	= 0x00041011,
+		.mask	= 0x000fffff,
+	},
+	{ 0, 0 },
+};
+
+static struct amba_driver pl011_driver = {
+	.drv = {
+		.name	= "uart-pl011",
+	},
+	.id_table	= pl011_ids,
+	.probe		= pl011_probe,
+	.remove		= pl011_remove,
+};
+
+static int __init pl011_init(void)
+{
+	int ret;
+	printk(KERN_INFO "Serial: AMBA PL011 UART driver\n");
+
+	ret = uart_register_driver(&amba_reg);
+	if (ret == 0) {
+		ret = amba_driver_register(&pl011_driver);
+		if (ret)
+			uart_unregister_driver(&amba_reg);
+	}
+	return ret;
+}
+
+static void __exit pl011_exit(void)
+{
+	amba_driver_unregister(&pl011_driver);
+	uart_unregister_driver(&amba_reg);
+}
+
+module_init(pl011_init);
+module_exit(pl011_exit);
+
+MODULE_AUTHOR("ARM Ltd/Deep Blue Solutions Ltd");
+MODULE_DESCRIPTION("ARM AMBA serial port driver");
+MODULE_LICENSE("GPL");
--- diff/drivers/serial/bast_sio.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/serial/bast_sio.c	2004-04-21 10:45:34.983385216 +0100
@@ -0,0 +1,63 @@
+#include <linux/module.h>
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/tty.h>
+#include <linux/serial.h>
+#include <linux/serial_core.h>
+#include <linux/types.h>
+
+#include <asm/io.h>
+#include <asm/serial.h>
+#include <asm/mach-types.h>
+
+#include <asm/arch/map.h>
+#include <asm/arch/irqs.h>
+#include <asm/arch/bast-map.h>
+#include <asm/arch/bast-irq.h>
+
+static int __init serial_bast_register(unsigned long port, unsigned int irq)
+{
+	struct serial_struct serial_req;
+
+#if 0
+	printk("BAST: SuperIO serial (%08lx,%d)\n", port, irq);
+#endif
+
+	serial_req.flags      = UPF_AUTOPROBE | UPF_RESOURCES | UPF_SHARE_IRQ;
+	serial_req.baud_base  = BASE_BAUD;
+	serial_req.irq        = irq;
+	serial_req.io_type    = UPIO_MEM;
+	serial_req.iomap_base = port;
+	serial_req.iomem_base = ioremap(port, 0x10);
+	serial_req.iomem_reg_shift = 0;
+
+	return register_serial(&serial_req);
+}
+
+#define SERIAL_BASE (S3C2410_CS2 + BAST_PA_SUPERIO)
+
+static int __init serial_bast_init(void)
+{
+	if (machine_is_bast()) {
+		serial_bast_register(SERIAL_BASE + 0x2f8, IRQ_PCSERIAL1);
+		serial_bast_register(SERIAL_BASE + 0x3f8, IRQ_PCSERIAL2);
+	}
+
+	return 0;
+}
+
+static void __exit serial_bast_exit(void)
+{
+	/* todo -> remove both our ports */
+}
+
+
+module_init(serial_bast_init);
+module_exit(serial_bast_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Ben Dooks, ben@simtec.co.uk");
+MODULE_DESCRIPTION("BAST Onboard Serial setup");
+
+
--- diff/drivers/serial/s3c2410.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/serial/s3c2410.c	2004-04-21 10:45:34.999382784 +0100
@@ -0,0 +1,860 @@
+/*
+ * linux/drivers/char/s3c2410.c
+ *
+ * Driver for onboard UARTs on the Samsung S3C2410
+ *
+ * Based on drivers/char/serial.c and drivers/char/21285.c
+ *
+ * Ben Dooks, (c) 2003 Simtec Electronics
+ *
+ * Changelog:
+ *
+ */
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/tty.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+#include <linux/init.h>
+#include <linux/console.h>
+#include <linux/serial_core.h>
+#include <linux/serial.h>
+
+#include <asm/io.h>
+#include <asm/irq.h>
+
+#include <asm/hardware.h>
+#include <asm/arch/regs-serial.h>
+
+#include <asm/mach-types.h>
+
+#if 0
+#include <asm/debug-ll.h>
+#define dbg(x...) llprintk(x)
+#else
+#define dbg(x...)
+#endif
+
+#define SERIAL_S3C2410_NAME	"ttySAC"
+#define SERIAL_S3C2410_MAJOR	204
+#define SERIAL_S3C2410_MINOR	4
+
+/* we can support 3 uarts, but not always use them */
+
+#define NR_PORTS (3)
+
+static const char serial_s3c2410_name[] = "Samsung S3C2410 UART";
+
+/* port irq numbers */
+
+#define TX_IRQ(port) ((port)->irq + 1)
+#define RX_IRQ(port) ((port)->irq)
+
+#define tx_enabled(port) ((port)->unused[0])
+#define rx_enabled(port) ((port)->unused[1])
+
+/* flag to ignore all characters comming in */
+#define RXSTAT_DUMMY_READ (0x10000000)
+
+/* access functions */
+
+#define portaddr(port, reg) ((void *)((port)->membase + (reg)))
+
+#define rd_regb(port, reg) (__raw_readb(portaddr(port, reg)))
+#define rd_regl(port, reg) (__raw_readl(portaddr(port, reg)))
+
+#define wr_regb(port, reg, val) \
+  do { __raw_writeb(val, portaddr(port, reg)); } while(0)
+
+#define wr_regl(port, reg, val) \
+  do { __raw_writel(val, portaddr(port, reg)); } while(0)
+
+
+
+
+/* code */
+
+static void
+serial_s3c2410_stop_tx(struct uart_port *port, unsigned int tty_stop)
+{
+	if (tx_enabled(port)) {
+		disable_irq(TX_IRQ(port));
+		tx_enabled(port) = 0;
+	}
+}
+
+static void
+serial_s3c2410_start_tx(struct uart_port *port, unsigned int tty_start)
+{
+	if (!tx_enabled(port)) {
+		enable_irq(TX_IRQ(port));
+		tx_enabled(port) = 1;
+	}
+}
+
+static void serial_s3c2410_stop_rx(struct uart_port *port)
+{
+	if (rx_enabled(port)) {
+		dbg("serial_s3c2410_stop_rx: port=%p\n", port);
+		disable_irq(RX_IRQ(port));
+		rx_enabled(port) = 0;
+	}
+}
+
+static void serial_s3c2410_enable_ms(struct uart_port *port)
+{
+}
+
+/* ? - where has parity gone?? */
+#define S3C2410_UERSTAT_PARITY (0x1000)
+
+static irqreturn_t
+serial_s3c2410_rx_chars(int irq, void *dev_id, struct pt_regs *regs)
+{
+	struct uart_port *port = dev_id;
+	struct tty_struct *tty = port->info->tty;
+	unsigned int ufcon, ch, rxs, ufstat;
+	int max_count = 256;
+
+	while (max_count-- > 0) {
+		ufcon = rd_regl(port, S3C2410_UFCON);
+		ufstat = rd_regl(port, S3C2410_UFSTAT);
+
+		if (S3C2410_UFCON_RXC(ufstat) == 0)
+			break;
+
+		if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
+			tty->flip.work.func((void *)tty);
+			if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
+				printk(KERN_WARNING "TTY_DONT_FLIP set\n");
+				goto out;
+			}
+		}
+
+		ch = rd_regb(port, S3C2410_URXH);
+
+		*tty->flip.char_buf_ptr = ch;
+		*tty->flip.flag_buf_ptr = TTY_NORMAL;
+		port->icount.rx++;
+
+		rxs = rd_regb(port, S3C2410_UERSTAT) | RXSTAT_DUMMY_READ;
+
+		if (rxs & S3C2410_UERSTAT_ANY) {
+			if (rxs & S3C2410_UERSTAT_FRAME)
+				port->icount.frame++;
+			if (rxs & S3C2410_UERSTAT_OVERRUN)
+				port->icount.overrun++;
+
+			rxs &= port->read_status_mask;
+
+			if (rxs & S3C2410_UERSTAT_PARITY)
+				*tty->flip.flag_buf_ptr = TTY_PARITY;
+			else if (rxs & ( S3C2410_UERSTAT_FRAME | S3C2410_UERSTAT_OVERRUN))
+				*tty->flip.flag_buf_ptr = TTY_FRAME;
+		}
+
+		if ((rxs & port->ignore_status_mask) == 0) {
+			tty->flip.flag_buf_ptr++;
+			tty->flip.char_buf_ptr++;
+			tty->flip.count++;
+		}
+
+		if ((rxs & S3C2410_UERSTAT_OVERRUN) &&
+		    tty->flip.count < TTY_FLIPBUF_SIZE) {
+			/*
+			 * Overrun is special, since it's reported
+			 * immediately, and doesn't affect the current
+			 * character.
+			 */
+			*tty->flip.char_buf_ptr++ = 0;
+			*tty->flip.flag_buf_ptr++ = TTY_OVERRUN;
+			tty->flip.count++;
+		}
+	}
+	tty_flip_buffer_push(tty);
+
+ out:
+	return IRQ_HANDLED;
+}
+
+static irqreturn_t
+serial_s3c2410_tx_chars(int irq, void *dev_id, struct pt_regs *regs)
+{
+	struct uart_port *port = (struct uart_port *)dev_id;
+	struct circ_buf *xmit = &port->info->xmit;
+	int count = 256;
+
+	if (port->x_char) {
+		wr_regb(port, S3C2410_UTXH, port->x_char);
+		port->icount.tx++;
+		port->x_char = 0;
+		goto out;
+	}
+
+	/* if there isnt anything more to transmit, or the uart is now
+	 * stopped, disable the uart and exit
+	*/
+
+	if (uart_circ_empty(xmit) || uart_tx_stopped(port)) {
+		serial_s3c2410_stop_tx(port, 0);
+		goto out;
+	}
+
+	/* try and drain the buffer... */
+
+	while (!uart_circ_empty(xmit) && count-- > 0) {
+		if (rd_regl(port, S3C2410_UFSTAT) & S3C2410_UFSTAT_TXFULL)
+			break;
+
+		wr_regb(port, S3C2410_UTXH, xmit->buf[xmit->tail]);
+		xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
+		port->icount.tx++;
+	}
+
+	if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
+		uart_write_wakeup(port);
+
+	if (uart_circ_empty(xmit))
+		serial_s3c2410_stop_tx(port, 0);
+
+ out:
+	return IRQ_HANDLED;
+}
+
+static unsigned int
+serial_s3c2410_tx_empty(struct uart_port *port)
+{
+	unsigned int ufcon = rd_regl(port, S3C2410_UFCON);
+	return (S3C2410_UFCON_TXC(ufcon) != 0) ? 0 : TIOCSER_TEMT;
+}
+
+/* no modem control lines */
+static unsigned int
+serial_s3c2410_get_mctrl(struct uart_port *port)
+{
+	unsigned int umstat = rd_regb(port,S3C2410_UMSTAT);
+
+	if (umstat & S3C2410_UMSTAT_CTS)
+		return TIOCM_CAR | TIOCM_DSR | TIOCM_CTS;
+	else
+		return TIOCM_CAR | TIOCM_DSR;
+}
+
+static void
+serial_s3c2410_set_mctrl(struct uart_port *port, unsigned int mctrl)
+{
+	/* todo - possibly remove AFC and do manual CTS */
+}
+
+static void serial_s3c2410_break_ctl(struct uart_port *port, int break_state)
+{
+	unsigned long flags;
+	unsigned int ucon;
+
+	spin_lock_irqsave(&port->lock, flags);
+
+	ucon = rd_regl(port, S3C2410_UCON);
+
+	if (break_state)
+		ucon |= S3C2410_UCON_SBREAK;
+	else
+		ucon &= ~S3C2410_UCON_SBREAK;
+
+	wr_regl(port, S3C2410_UCON, ucon);
+
+	spin_unlock_irqrestore(&port->lock, flags);
+}
+
+static int serial_s3c2410_startup(struct uart_port *port)
+{
+	int ret;
+
+	tx_enabled(port) = 1;
+	rx_enabled(port) = 1;
+
+	dbg("serial_s3c2410_startup: port=%p (%p)\n",
+	    port, port->mapbase);
+
+	ret = request_irq(RX_IRQ(port), serial_s3c2410_rx_chars, 0,
+			  serial_s3c2410_name, port);
+
+	if (ret != 0)
+		return ret;
+
+	ret = request_irq(TX_IRQ(port), serial_s3c2410_tx_chars, 0,
+			  serial_s3c2410_name, port);
+
+	if (ret) {
+		free_irq(RX_IRQ(port), port);
+		return ret;
+	}
+
+	/* the port reset code should have done the correct
+	 * register setup for the port controls */
+
+	return ret;
+}
+
+static void serial_s3c2410_shutdown(struct uart_port *port)
+{
+	free_irq(TX_IRQ(port), port);
+	free_irq(RX_IRQ(port), port);
+}
+
+static void
+serial_s3c2410_set_termios(struct uart_port *port, struct termios *termios,
+			   struct termios *old)
+{
+	unsigned long flags;
+	unsigned int baud, quot;
+	unsigned int ulcon;
+
+	/*
+	 * We don't support modem control lines.
+	 */
+	termios->c_cflag &= ~(HUPCL | CRTSCTS | CMSPAR);
+	termios->c_cflag |= CLOCAL;
+
+	/*
+	 * We don't support BREAK character recognition.
+	 */
+	termios->c_iflag &= ~(IGNBRK | BRKINT);
+
+	/*
+	 * Ask the core to calculate the divisor for us.
+	 */
+	baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16);
+	quot = uart_get_divisor(port, baud);
+
+	switch (termios->c_cflag & CSIZE) {
+	case CS5:
+		dbg("config: 5bits/char\n");
+		ulcon = S3C2410_LCON_CS5;
+		break;
+	case CS6:
+		dbg("config: 6bits/char\n");
+		ulcon = S3C2410_LCON_CS6;
+		break;
+	case CS7:
+		dbg("config: 7bits/char\n");
+		ulcon = S3C2410_LCON_CS7;
+		break;
+	case CS8:
+	default:
+		dbg("config: 8bits/char\n");
+		ulcon = S3C2410_LCON_CS8;
+		break;
+	}
+
+	if (termios->c_cflag & CSTOPB)
+		ulcon |= S3C2410_LCON_STOPB;
+
+	if (termios->c_cflag & PARENB) {
+		if (!(termios->c_cflag & PARODD))
+			ulcon |= S3C2410_LCON_PODD;
+		else
+			ulcon |= S3C2410_LCON_PEVEN;
+	} else {
+		ulcon |= S3C2410_LCON_PNONE;
+	}
+
+	/*
+	if (port->fifosize)
+	enable_fifo()
+	*/
+
+	spin_lock_irqsave(&port->lock, flags);
+
+	dbg("setting ulcon to %08x\n", ulcon);
+	//dbg("<flushing output from serial>\n");
+
+	/* set the ulcon register */
+	wr_regl(port, S3C2410_ULCON, ulcon);
+
+	dbg("uart: ulcon = 0x%08x, ucon = 0x%08x, ufcon = 0x%08x\n",
+	    rd_regl(port, S3C2410_ULCON),
+	    rd_regl(port, S3C2410_UCON),
+	    rd_regl(port, S3C2410_UFCON));
+
+	/*
+	 * Update the per-port timeout.
+	 */
+	uart_update_timeout(port, termios->c_cflag, baud);
+
+	/*
+	 * Which character status flags are we interested in?
+	 */
+	port->read_status_mask = S3C2410_UERSTAT_OVERRUN;
+	if (termios->c_iflag & INPCK)
+		port->read_status_mask |= S3C2410_UERSTAT_FRAME | S3C2410_UERSTAT_PARITY;
+
+	/*
+	 * Which character status flags should we ignore?
+	 */
+	port->ignore_status_mask = 0;
+	if (termios->c_iflag & IGNPAR)
+		port->ignore_status_mask |= S3C2410_UERSTAT_OVERRUN;
+	if (termios->c_iflag & IGNBRK && termios->c_iflag & IGNPAR)
+		port->ignore_status_mask |= S3C2410_UERSTAT_FRAME;
+
+	/*
+	 * Ignore all characters if CREAD is not set.
+	 */
+	if ((termios->c_cflag & CREAD) == 0)
+		port->ignore_status_mask |= RXSTAT_DUMMY_READ;
+
+	spin_unlock_irqrestore(&port->lock, flags);
+}
+
+static const char *serial_s3c2410_type(struct uart_port *port)
+{
+	return port->type == PORT_S3C2410 ? "S3C2410" : NULL;
+}
+
+#define MAP_SIZE (0x100)
+
+static void
+serial_s3c2410_release_port(struct uart_port *port)
+{
+	release_mem_region(port->mapbase, MAP_SIZE);
+}
+
+static int
+serial_s3c2410_request_port(struct uart_port *port)
+{
+	return request_mem_region(port->mapbase, MAP_SIZE, serial_s3c2410_name)
+		!= NULL ? 0 : -EBUSY;
+}
+
+static void
+serial_s3c2410_config_port(struct uart_port *port, int flags)
+{
+	if (flags & UART_CONFIG_TYPE &&
+	    serial_s3c2410_request_port(port) == 0)
+		port->type = PORT_S3C2410;
+}
+
+/*
+ * verify the new serial_struct (for TIOCSSERIAL).
+ */
+static int
+serial_s3c2410_verify_port(struct uart_port *port, struct serial_struct *ser)
+{
+	int ret = 0;
+
+	if (ser->type != PORT_UNKNOWN && ser->type != PORT_S3C2410)
+		ret = -EINVAL;
+
+	return ret;
+}
+
+static struct uart_ops serial_s3c2410_ops = {
+	.tx_empty	= serial_s3c2410_tx_empty,
+	.get_mctrl	= serial_s3c2410_get_mctrl,
+	.set_mctrl	= serial_s3c2410_set_mctrl,
+	.stop_tx	= serial_s3c2410_stop_tx,
+	.start_tx	= serial_s3c2410_start_tx,
+	.stop_rx	= serial_s3c2410_stop_rx,
+	.enable_ms	= serial_s3c2410_enable_ms,
+	.break_ctl	= serial_s3c2410_break_ctl,
+	.startup	= serial_s3c2410_startup,
+	.shutdown	= serial_s3c2410_shutdown,
+	.set_termios	= serial_s3c2410_set_termios,
+	.type		= serial_s3c2410_type,
+	.release_port	= serial_s3c2410_release_port,
+	.request_port	= serial_s3c2410_request_port,
+	.config_port	= serial_s3c2410_config_port,
+	.verify_port	= serial_s3c2410_verify_port,
+};
+
+static struct uart_port serial_s3c2410_ports[NR_PORTS] = {
+	{
+		.membase	= 0,
+		.mapbase	= 0,
+		.iotype		= UPIO_MEM,
+		.irq		= IRQ_S3CUART_RX0,
+		.uartclk	= 0,
+		.fifosize	= 16,
+		.ops		= &serial_s3c2410_ops,
+		.flags		= UPF_BOOT_AUTOCONF,
+		.line		= 0,
+	},
+	{
+		.membase	= 0,
+		.mapbase	= 0,
+		.iotype		= UPIO_MEM,
+		.irq		= IRQ_S3CUART_RX1,
+		.uartclk	= 0,
+		.fifosize	= 16,
+		.ops		= &serial_s3c2410_ops,
+		.flags		= UPF_BOOT_AUTOCONF,
+		.line		= 1,
+	}
+#if NR_PORTS > 2
+	,
+	{
+		.membase	= 0,
+		.mapbase	= 0,
+		.iotype		= UPIO_MEM,
+		.irq		= IRQ_S3CUART_RX2,
+		.uartclk	= 0,
+		.fifosize	= 16,
+		.ops		= &serial_s3c2410_ops,
+		.flags		= UPF_BOOT_AUTOCONF,
+		.line		= 2,
+	}
+#endif
+};
+
+static int
+serial_s3c2410_resetport(struct uart_port *port,
+			 struct s3c2410_uartcfg *cfg)
+{
+	/* ensure registers are setup */
+
+	dbg("serial_s3c2410_resetport: port=%p (%08x), cfg=%p\n",
+	    port, port->mapbase, cfg);
+
+	wr_regl(port, S3C2410_UCON,  cfg->ucon);
+	wr_regl(port, S3C2410_ULCON, cfg->ulcon);
+
+	/* reset both fifos */
+
+	wr_regl(port, S3C2410_UFCON, cfg->ufcon | S3C2410_UFCON_RESETBOTH);
+	wr_regl(port, S3C2410_UFCON, cfg->ufcon);
+
+	return 0;
+}
+
+/* serial_s3c2410_init_ports
+ *
+ * initialise the serial ports from the machine provided initialisation
+ * data.
+*/
+
+static int serial_s3c2410_init_ports(void)
+{
+	struct uart_port *ptr = serial_s3c2410_ports;
+	struct s3c2410_uartcfg *cfg = s3c2410_uartcfgs;
+	static int inited = 0;
+	int i;
+
+	if (inited)
+		return 0;
+	inited = 1;
+
+	dbg("serial_s3c2410_init_ports: initialising ports...\n");
+
+	for (i = 0; i < NR_PORTS; i++, ptr++, cfg++) {
+
+		if (cfg->hwport > 3)
+			continue;
+
+		dbg("serial_s3c2410_init_ports: port %d (hw %d)...\n",
+		    i, cfg->hwport);
+
+		if (cfg->clock != NULL)
+			ptr->uartclk = *cfg->clock;
+
+		switch (cfg->hwport) {
+		case 0:
+			ptr->mapbase = S3C2410_PA_UART0;
+			ptr->membase = (char *)S3C2410_VA_UART0;
+			ptr->irq     = IRQ_S3CUART_RX0;
+			break;
+
+		case 1:
+			ptr->mapbase = S3C2410_PA_UART1;
+			ptr->membase = (char *)S3C2410_VA_UART1;
+			ptr->irq     = IRQ_S3CUART_RX1;
+			break;
+
+		case 2:
+			ptr->mapbase = S3C2410_PA_UART2;
+			ptr->membase = (char *)S3C2410_VA_UART2;
+			ptr->irq     = IRQ_S3CUART_RX2;
+			break;
+		}
+
+		if (ptr->mapbase == 0)
+			continue;
+
+		/* reset the fifos (and setup the uart */
+		serial_s3c2410_resetport(ptr, cfg);
+	}
+
+	return 0;
+}
+
+#ifdef CONFIG_SERIAL_S3C2410_CONSOLE
+
+static struct uart_port *cons_uart;
+
+static int
+serial_s3c2410_console_txrdy(struct uart_port *port, unsigned int ufcon)
+{
+	unsigned long ufstat, utrstat;
+
+	if (ufcon & S3C2410_UFCON_FIFOMODE) {
+		/* fifo mode - check ammount of data in fifo registers... */
+
+		ufstat = rd_regl(port, S3C2410_UFSTAT);
+
+		return S3C2410_UFCON_TXC(ufstat) < 12;
+	}
+
+	/* in non-fifo mode, we go and use the tx buffer empty */
+
+	utrstat = rd_regl(port, S3C2410_UTRSTAT);
+
+	return (utrstat & S3C2410_UTRSTAT_TXFE) ? 1 : 0;
+}
+
+static void
+serial_s3c2410_console_write(struct console *co, const char *s,
+			     unsigned int count)
+{
+	int i;
+	unsigned int ufcon = rd_regl(cons_uart, S3C2410_UFCON);
+
+	for (i = 0; i < count; i++) {
+		while (!serial_s3c2410_console_txrdy(cons_uart, ufcon))
+			barrier();
+
+		wr_regb(cons_uart, S3C2410_UTXH, s[i]);
+
+		if (s[i] == '\n') {
+			while (!serial_s3c2410_console_txrdy(cons_uart, ufcon))
+				barrier();
+
+			wr_regb(cons_uart, S3C2410_UTXH, '\r');
+		}
+	}
+}
+
+static void __init
+serial_s3c2410_get_options(struct uart_port *port, int *baud,
+			   int *parity, int *bits)
+{
+
+	unsigned int ulcon, ucon, ubrdiv;
+
+	ulcon  = rd_regl(port, S3C2410_ULCON);
+	ucon   = rd_regl(port, S3C2410_UCON);
+	ubrdiv = rd_regl(port, S3C2410_UBRDIV);
+
+	dbg("serial_s3c2410_get_options: port=%p\n"
+	    "registers: ulcon=%08x, ucon=%08x, ubdriv=%08x\n",
+	    port, ulcon, ucon, ubrdiv);
+
+	if ((ucon & 0xf) != 0) {
+		/* consider the serial port configured if the tx/rx mode set */
+
+		switch (ulcon & S3C2410_LCON_CSMASK) {
+		case S3C2410_LCON_CS5:
+			*bits = 5;
+			break;
+		case S3C2410_LCON_CS6:
+			*bits = 6;
+			break;
+		case S3C2410_LCON_CS7:
+			*bits = 7;
+			break;
+		default:
+		case S3C2410_LCON_CS8:
+			*bits = 8;
+			break;
+		}
+
+		switch (ulcon & S3C2410_LCON_PMASK) {
+		case S3C2410_LCON_PEVEN:
+			*parity = 'e';
+			break;
+
+		case S3C2410_LCON_PODD:
+			*parity = 'o';
+			break;
+
+		default:
+		case S3C2410_LCON_PNONE:
+			/* nothing */
+		}
+
+		/* now calculate the baud rate */
+
+		*baud = port->uartclk / ( 16 * (ubrdiv + 1));
+		dbg("calculated baud %d\n", *baud);
+	}
+
+}
+
+static int __init
+serial_s3c2410_console_setup(struct console *co, char *options)
+{
+	struct uart_port *port;
+	int baud = 9600;
+	int bits = 8;
+	int parity = 'n';
+	int flow = 'n';
+
+	/* is this a valid port */
+
+	if (co->index == -1 || co->index >= NR_PORTS)
+		co->index = 0;
+
+	port = &serial_s3c2410_ports[co->index];
+
+	/* is the port configured? */
+
+	if (port->mapbase == 0x0) {
+		co->index = 0;
+		port = &serial_s3c2410_ports[co->index];
+	}
+
+	cons_uart = port;
+
+	dbg("serial_s3c2410_console_setup: port=%p (%d)\n", port, co->index);
+
+	/*
+	 * Check whether an invalid uart number has been specified, and
+	 * if so, search for the first available port that does have
+	 * console support.
+	 */
+	if (options)
+		uart_parse_options(options, &baud, &parity, &bits, &flow);
+	else
+		serial_s3c2410_get_options(port, &baud, &parity, &bits);
+
+	return uart_set_options(port, co, baud, parity, bits, flow);
+}
+
+static struct uart_driver s3c2410_uart_drv;
+
+static struct console serial_s3c2410_console =
+{
+	.name		= SERIAL_S3C2410_NAME,
+	.write		= serial_s3c2410_console_write,
+	.device		= uart_console_device,
+	.setup		= serial_s3c2410_console_setup,
+	.flags		= CON_PRINTBUFFER,
+	.index		= -1,
+	.data		= &s3c2410_uart_drv,
+};
+
+static int __init s3c2410_console_init(void)
+{
+	dbg("s3c2410_console_init:\n");
+
+	serial_s3c2410_init_ports();
+	register_console(&serial_s3c2410_console);
+	return 0;
+}
+console_initcall(s3c2410_console_init);
+
+#define SERIAL_S3C2410_CONSOLE	&serial_s3c2410_console
+#else
+#define SERIAL_S3C2410_CONSOLE	NULL
+#endif
+
+static struct uart_driver s3c2410_uart_drv = {
+	.owner			= THIS_MODULE,
+	.driver_name		= SERIAL_S3C2410_NAME,
+	.dev_name		= SERIAL_S3C2410_NAME,
+	.major			= SERIAL_S3C2410_MAJOR,
+	.minor			= SERIAL_S3C2410_MINOR,
+	.nr			= 3,
+	.cons			= SERIAL_S3C2410_CONSOLE,
+};
+
+/* device driver */
+
+static int s3c2410_serial_probe(struct device *_dev);
+static int s3c2410_serial_remove(struct device *_dev);
+
+static struct device_driver s3c2410_serial_drv = {
+	.name		= "s3c2410-uart",
+	.bus		= &platform_bus_type,
+	.probe		= s3c2410_serial_probe,
+	.remove		= s3c2410_serial_remove,
+	.suspend	= NULL,
+	.resume		= NULL,
+};
+
+#define s3c2410_dev_to_port(__dev) (struct uart_port *)dev_get_drvdata(__dev)
+
+static int s3c2410_serial_probe(struct device *_dev)
+{
+	struct platform_device *dev = to_platform_device(_dev);
+	struct resource *res = dev->resource;
+	int i;
+
+	dbg("s3c2410_serial_probe: dev=%p, _dev=%p, res=%p\n", _dev, dev, res);
+
+	for (i = 0; i < dev->num_resources; i++, res++)
+		if (res->flags & IORESOURCE_MEM)
+			break;
+
+	if (i < dev->num_resources) {
+		struct uart_port *ptr = serial_s3c2410_ports;
+
+		for (i = 0; i < NR_PORTS; i++, ptr++) {
+			dbg("s3c2410_serial_probe: ptr=%p (%08x, %08x)\n",
+			    ptr, ptr->mapbase, ptr->membase);
+
+			if (ptr->mapbase != res->start)
+				continue;
+
+			dbg("s3c2410_serial_probe: got device %p: port=%p\n",
+			    _dev, ptr);
+
+			uart_add_one_port(&s3c2410_uart_drv, ptr);
+			dev_set_drvdata(_dev, ptr);
+			break;
+		}
+	}
+
+	return 0;
+}
+
+static int s3c2410_serial_remove(struct device *_dev)
+{
+	struct uart_port *port = s3c2410_dev_to_port(_dev);
+
+	if (port)
+		uart_remove_one_port(&s3c2410_uart_drv, port);
+
+	return 0;
+}
+
+
+
+static int __init serial_s3c2410_init(void)
+{
+	int ret;
+
+	printk(KERN_INFO "S3C2410X Serial, (c) 2003 Simtec Electronics\n");
+
+	ret = uart_register_driver(&s3c2410_uart_drv);
+	if (ret != 0)
+		return ret;
+
+	ret = driver_register(&s3c2410_serial_drv);
+	if (ret) {
+		uart_unregister_driver(&s3c2410_uart_drv);
+	}
+
+	return ret;
+}
+
+static void __exit serial_s3c2410_exit(void)
+{
+	driver_unregister(&s3c2410_serial_drv);
+	uart_unregister_driver(&s3c2410_uart_drv);
+}
+
+module_init(serial_s3c2410_init);
+module_exit(serial_s3c2410_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>");
+MODULE_DESCRIPTION("Samsung S3C2410X (S3C2410) Serial driver");
--- diff/drivers/usb/gadget/dummy_hcd.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/usb/gadget/dummy_hcd.c	2004-04-21 10:45:35.040376552 +0100
@@ -0,0 +1,1679 @@
+/*
+ * dummy_hcd.c -- Dummy/Loopback USB host and device emulator driver.
+ *
+ * Maintainer: Alan Stern <stern@rowland.harvard.edu>
+ *
+ * Copyright (C) 2003 David Brownell
+ * Copyright (C) 2003, 2004 Alan Stern
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+
+/*
+ * This exposes a device side "USB gadget" API, driven by requests to a
+ * Linux-USB host controller driver.  USB traffic is simulated; there's
+ * no need for USB hardware.  Use this with two other drivers:
+ *
+ *  - Gadget driver, responding to requests (slave);
+ *  - Host-side device driver, as already familiar in Linux.
+ *
+ * Having this all in one kernel can help some stages of development,
+ * bypassing some hardware (and driver) issues.  UML could help too.
+ */
+
+#define DEBUG
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/ioport.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/smp_lock.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/timer.h>
+#include <linux/list.h>
+#include <linux/interrupt.h>
+#include <linux/version.h>
+
+#include <linux/usb.h>
+#include <linux/usb_gadget.h>
+
+#include <asm/byteorder.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/system.h>
+#include <asm/unaligned.h>
+
+
+#include "../core/hcd.h"
+
+
+#define DRIVER_DESC	"USB Host+Gadget Emulator"
+#define DRIVER_VERSION	"14 Mar 2004"
+
+static const char	driver_name [] = "dummy_hcd";
+static const char	driver_desc [] = "USB Host+Gadget Emulator";
+
+static const char	gadget_name [] = "dummy_udc";
+
+MODULE_DESCRIPTION (DRIVER_DESC);
+MODULE_AUTHOR ("David Brownell");
+MODULE_LICENSE ("GPL");
+
+/*-------------------------------------------------------------------------*/
+
+/* gadget side driver data structres */
+struct dummy_ep {
+	struct list_head		queue;
+	unsigned long			last_io;	/* jiffies timestamp */
+	struct usb_gadget		*gadget;
+	const struct usb_endpoint_descriptor *desc;
+	struct usb_ep			ep;
+	unsigned			halted : 1;
+	unsigned			already_seen : 1;
+	unsigned			setup_stage : 1;
+};
+
+struct dummy_request {
+	struct list_head		queue;		/* ep's requests */
+	struct usb_request		req;
+};
+
+/*-------------------------------------------------------------------------*/
+
+/*
+ * Every device has ep0 for control requests, plus up to 30 more endpoints,
+ * in one of two types:
+ *
+ *   - Configurable:  direction (in/out), type (bulk, iso, etc), and endpoint
+ *     number can be changed.  Names like "ep-a" are used for this type.
+ *
+ *   - Fixed Function:  in other cases.  some characteristics may be mutable;
+ *     that'd be hardware-specific.  Names like "ep12out-bulk" are used.
+ *
+ * Gadget drivers are responsible for not setting up conflicting endpoint
+ * configurations, illegal or unsupported packet lengths, and so on.
+ */
+
+static const char ep0name [] = "ep0";
+
+static const char *const ep_name [] = {
+	ep0name,				/* everyone has ep0 */
+
+	/* act like a net2280: high speed, six configurable endpoints */
+	"ep-a", "ep-b", "ep-c", "ep-d", "ep-e", "ep-f",
+
+	/* or like pxa250: fifteen fixed function endpoints */
+	"ep1in-bulk", "ep2out-bulk", "ep3in-iso", "ep4out-iso", "ep5in-int",
+	"ep6in-bulk", "ep7out-bulk", "ep8in-iso", "ep9out-iso", "ep10in-int",
+	"ep11in-bulk", "ep12out-bulk", "ep13in-iso", "ep14out-iso",
+		"ep15in-int",
+
+	/* or like sa1100: two fixed function endpoints */
+	"ep1out-bulk", "ep2in-bulk",
+};
+#define DUMMY_ENDPOINTS	(sizeof(ep_name)/sizeof(char *))
+
+#define FIFO_SIZE		64
+
+struct dummy {
+	spinlock_t			lock;
+
+	/*
+	 * SLAVE/GADGET side support
+	 */
+	struct dummy_ep			ep [DUMMY_ENDPOINTS];
+	int				address;
+	struct usb_gadget		gadget;
+	struct usb_gadget_driver	*driver;
+	struct dummy_request		fifo_req;
+	u8				fifo_buf [FIFO_SIZE];
+
+	struct hcd_dev			*hdev;
+
+	/*
+	 * MASTER/HOST side support
+	 */
+	struct usb_hcd			hcd;
+	struct platform_device		pdev;
+	struct timer_list		timer;
+	u32				port_status;
+	int				started;
+	struct completion		released;
+};
+
+static struct dummy	*the_controller;
+
+static inline struct dummy *ep_to_dummy (struct dummy_ep *ep)
+{
+	return container_of (ep->gadget, struct dummy, gadget);
+}
+
+static inline struct dummy *gadget_dev_to_dummy (struct device *dev)
+{
+	return container_of (dev, struct dummy, gadget.dev);
+}
+
+/*
+ * This "hardware" may look a bit odd in diagnostics since it's got both
+ * host and device sides; and it binds different drivers to each side.
+ */
+#define hardware	(&the_controller->pdev.dev)
+
+/*-------------------------------------------------------------------------*/
+
+static struct device_driver dummy_driver = {
+	.name		= (char *) driver_name,
+	.bus		= &platform_bus_type,
+};
+
+/*-------------------------------------------------------------------------*/
+
+/* SLAVE/GADGET SIDE DRIVER
+ *
+ * This only tracks gadget state.  All the work is done when the host
+ * side tries some (emulated) i/o operation.  Real device controller
+ * drivers would do real i/o using dma, fifos, irqs, timers, etc.
+ */
+
+#define is_enabled() \
+	(the_controller->port_status & USB_PORT_STAT_ENABLE)
+
+static int
+dummy_enable (struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc)
+{
+	struct dummy		*dum;
+	struct dummy_ep		*ep;
+	unsigned		max;
+	int			retval;
+
+	ep = container_of (_ep, struct dummy_ep, ep);
+	if (!_ep || !desc || ep->desc || _ep->name == ep0name
+			|| desc->bDescriptorType != USB_DT_ENDPOINT)
+	if (!the_controller->driver || !is_enabled ())
+		return -ESHUTDOWN;
+	max = desc->wMaxPacketSize & 0x3ff;
+
+	/* drivers must not request bad settings, since lower levels
+	 * (hardware or its drivers) may not check.  some endpoints
+	 * can't do iso, many have maxpacket limitations, etc.
+	 *
+	 * since this "hardware" driver is here to help debugging, we
+	 * have some extra sanity checks.  (there could be more though,
+	 * especially for "ep9out" style fixed function ones.)
+	 */
+	dum = container_of (ep->gadget, struct dummy, gadget);
+	retval = -EINVAL;
+	switch (desc->bmAttributes & 0x03) {
+	case USB_ENDPOINT_XFER_BULK:
+		if (strstr (ep->ep.name, "-iso")
+				|| strstr (ep->ep.name, "-int")) {
+			goto done;
+		}
+		switch (dum->gadget.speed) {
+		case USB_SPEED_HIGH:
+			if (max == 512)
+				break;
+			/* conserve return statements */
+		default:
+			switch (max) {
+			case 8: case 16: case 32: case 64:
+				/* we'll fake any legal size */
+				break;
+			default:
+		case USB_SPEED_LOW:
+				goto done;
+			}
+		}
+		break;
+	case USB_ENDPOINT_XFER_INT:
+		if (strstr (ep->ep.name, "-iso")) /* bulk is ok */
+			goto done;
+		/* real hardware might not handle all packet sizes */
+		switch (dum->gadget.speed) {
+		case USB_SPEED_HIGH:
+			if (max <= 1024)
+				break;
+			/* save a return statement */
+		case USB_SPEED_FULL:
+			if (max <= 64)
+				break;
+			/* save a return statement */
+		default:
+			if (max <= 8)
+				break;
+			goto done;
+		}
+		break;
+	case USB_ENDPOINT_XFER_ISOC:
+		if (strstr (ep->ep.name, "-bulk")
+				|| strstr (ep->ep.name, "-int"))
+			goto done;
+		/* real hardware might not handle all packet sizes */
+		switch (dum->gadget.speed) {
+		case USB_SPEED_HIGH:
+			if (max <= 1024)
+				break;
+			/* save a return statement */
+		case USB_SPEED_FULL:
+			if (max <= 1023)
+				break;
+			/* save a return statement */
+		default:
+			goto done;
+		}
+		break;
+	default:
+		/* few chips support control except on ep0 */
+		goto done;
+	}
+
+	_ep->maxpacket = max;
+	ep->desc = desc;
+
+	dev_dbg (hardware, "enabled %s (ep%d%s-%s) maxpacket %d\n",
+		_ep->name,
+		desc->bEndpointAddress & 0x0f,
+		(desc->bEndpointAddress & USB_DIR_IN) ? "in" : "out",
+		({ char *val;
+		 switch (desc->bmAttributes & 0x03) {
+		 case USB_ENDPOINT_XFER_BULK: val = "bulk"; break;
+		 case USB_ENDPOINT_XFER_ISOC: val = "iso"; break;
+		 case USB_ENDPOINT_XFER_INT: val = "intr"; break;
+		 default: val = "ctrl"; break;
+		 }; val; }),
+		max);
+
+	/* at this point real hardware should be NAKing transfers
+	 * to that endpoint, until a buffer is queued to it.
+	 */
+	retval = 0;
+done:
+	return retval;
+}
+
+/* called with spinlock held */
+static void nuke (struct dummy *dum, struct dummy_ep *ep)
+{
+	while (!list_empty (&ep->queue)) {
+		struct dummy_request	*req;
+
+		req = list_entry (ep->queue.next, struct dummy_request, queue);
+		list_del_init (&req->queue);
+		req->req.status = -ESHUTDOWN;
+
+		spin_unlock (&dum->lock);
+		req->req.complete (&ep->ep, &req->req);
+		spin_lock (&dum->lock);
+	}
+}
+
+static int dummy_disable (struct usb_ep *_ep)
+{
+	struct dummy_ep		*ep;
+	struct dummy		*dum;
+	unsigned long		flags;
+	int			retval;
+
+	ep = container_of (_ep, struct dummy_ep, ep);
+	if (!_ep || !ep->desc || _ep->name == ep0name)
+		return -EINVAL;
+	dum = ep_to_dummy (ep);
+
+	spin_lock_irqsave (&dum->lock, flags);
+	ep->desc = 0;
+	retval = 0;
+	nuke (dum, ep);
+	spin_unlock_irqrestore (&dum->lock, flags);
+
+	dev_dbg (hardware, "disabled %s\n", _ep->name);
+	return retval;
+}
+
+static struct usb_request *
+dummy_alloc_request (struct usb_ep *_ep, int mem_flags)
+{
+	struct dummy_ep		*ep;
+	struct dummy_request	*req;
+
+	ep = container_of (_ep, struct dummy_ep, ep);
+	if (!_ep)
+		return 0;
+
+	req = kmalloc (sizeof *req, mem_flags);
+	if (!req)
+		return 0;
+	memset (req, 0, sizeof *req);
+	INIT_LIST_HEAD (&req->queue);
+	return &req->req;
+}
+
+static void
+dummy_free_request (struct usb_ep *_ep, struct usb_request *_req)
+{
+	struct dummy_ep		*ep;
+	struct dummy_request	*req;
+
+	ep = container_of (_ep, struct dummy_ep, ep);
+	if (!ep || !_req || (!ep->desc && _ep->name != ep0name))
+		return;
+
+	req = container_of (_req, struct dummy_request, req);
+	WARN_ON (!list_empty (&req->queue));
+	kfree (req);
+}
+
+static void *
+dummy_alloc_buffer (
+	struct usb_ep *_ep,
+	unsigned bytes,
+	dma_addr_t *dma,
+	int mem_flags
+) {
+	char *retval;
+
+	if (!the_controller->driver)
+		return 0;
+	retval = kmalloc (bytes, mem_flags);
+	*dma = (dma_addr_t) retval;
+	return retval;
+}
+
+static void
+dummy_free_buffer (
+	struct usb_ep *_ep,
+	void *buf,
+	dma_addr_t dma,
+	unsigned bytes
+) {
+	if (bytes)
+		kfree (buf);
+}
+
+static void
+fifo_complete (struct usb_ep *ep, struct usb_request *req)
+{
+#if 0
+	dev_dbg (hardware, "fifo_complete: %d\n", req->status);
+#endif
+}
+
+static int
+dummy_queue (struct usb_ep *_ep, struct usb_request *_req, int mem_flags)
+{
+	struct dummy_ep		*ep;
+	struct dummy_request	*req;
+	struct dummy		*dum;
+	unsigned long		flags;
+
+	req = container_of (_req, struct dummy_request, req);
+	if (!_req || !list_empty (&req->queue) || !_req->complete)
+		return -EINVAL;
+
+	ep = container_of (_ep, struct dummy_ep, ep);
+	if (!_ep || (!ep->desc && _ep->name != ep0name))
+		return -EINVAL;
+
+	if (!the_controller->driver || !is_enabled ())
+		return -ESHUTDOWN;
+
+	dum = container_of (ep->gadget, struct dummy, gadget);
+
+#if 0
+	dev_dbg (hardware, "ep %p queue req %p to %s, len %d buf %p\n",
+			ep, _req, _ep->name, _req->length, _req->buf);
+#endif
+
+	_req->status = -EINPROGRESS;
+	_req->actual = 0;
+	spin_lock_irqsave (&dum->lock, flags);
+
+	/* implement an emulated single-request FIFO */
+	if (ep->desc && (ep->desc->bEndpointAddress & USB_DIR_IN) &&
+			list_empty (&dum->fifo_req.queue) &&
+			list_empty (&ep->queue) &&
+			_req->length <= FIFO_SIZE) {
+		req = &dum->fifo_req;
+		req->req = *_req;
+		req->req.buf = dum->fifo_buf;
+		memcpy (dum->fifo_buf, _req->buf, _req->length);
+		req->req.context = dum;
+		req->req.complete = fifo_complete;
+
+		spin_unlock (&dum->lock);
+		_req->actual = _req->length;
+		_req->status = 0;
+		_req->complete (_ep, _req);
+		spin_lock (&dum->lock);
+	}
+	list_add_tail (&req->queue, &ep->queue);
+	spin_unlock_irqrestore (&dum->lock, flags);
+
+	/* real hardware would likely enable transfers here, in case
+	 * it'd been left NAKing.
+	 */
+	return 0;
+}
+
+static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req)
+{
+	struct dummy_ep		*ep;
+	struct dummy		*dum;
+	int			retval = -EINVAL;
+	unsigned long		flags;
+	struct dummy_request	*req = 0;
+
+	if (!the_controller->driver)
+		return -ESHUTDOWN;
+
+	if (!_ep || !_req)
+		return retval;
+	ep = container_of (_ep, struct dummy_ep, ep);
+	dum = container_of (ep->gadget, struct dummy, gadget);
+
+	spin_lock_irqsave (&dum->lock, flags);
+	list_for_each_entry (req, &ep->queue, queue) {
+		if (&req->req == _req) {
+			list_del_init (&req->queue);
+			_req->status = -ECONNRESET;
+			retval = 0;
+			break;
+		}
+	}
+	spin_unlock_irqrestore (&dum->lock, flags);
+
+	if (retval == 0) {
+		dev_dbg (hardware, "dequeued req %p from %s, len %d buf %p\n",
+				req, _ep->name, _req->length, _req->buf);
+
+		_req->complete (_ep, _req);
+	}
+	return retval;
+}
+
+static int
+dummy_set_halt (struct usb_ep *_ep, int value)
+{
+	struct dummy_ep		*ep;
+
+	if (!_ep)
+		return -EINVAL;
+	if (!the_controller->driver)
+		return -ESHUTDOWN;
+	ep = container_of (_ep, struct dummy_ep, ep);
+	if (!value)
+		ep->halted = 0;
+	else if (ep->desc && (ep->desc->bEndpointAddress & USB_DIR_IN) &&
+			!list_empty (&ep->queue))
+		return -EAGAIN;
+	else
+		ep->halted = 1;
+	/* FIXME clear emulated data toggle too */
+	return 0;
+}
+
+static const struct usb_ep_ops dummy_ep_ops = {
+	.enable		= dummy_enable,
+	.disable	= dummy_disable,
+
+	.alloc_request	= dummy_alloc_request,
+	.free_request	= dummy_free_request,
+
+	.alloc_buffer	= dummy_alloc_buffer,
+	.free_buffer	= dummy_free_buffer,
+	/* map, unmap, ... eventually hook the "generic" dma calls */
+
+	.queue		= dummy_queue,
+	.dequeue	= dummy_dequeue,
+
+	.set_halt	= dummy_set_halt,
+};
+
+/*-------------------------------------------------------------------------*/
+
+/* there are both host and device side versions of this call ... */
+static int dummy_g_get_frame (struct usb_gadget *_gadget)
+{
+	struct timeval	tv;
+
+	do_gettimeofday (&tv);
+	return tv.tv_usec / 1000;
+}
+
+static const struct usb_gadget_ops dummy_ops = {
+	.get_frame	= dummy_g_get_frame,
+};
+
+/*-------------------------------------------------------------------------*/
+
+/* "function" sysfs attribute */
+static ssize_t
+show_function (struct device *_dev, char *buf)
+{
+	struct dummy	*dum = the_controller;
+
+	if (!dum->driver->function
+			|| strlen (dum->driver->function) > PAGE_SIZE)
+		return 0;
+	return snprintf (buf, PAGE_SIZE, "%s\n", dum->driver->function);
+}
+DEVICE_ATTR (function, S_IRUGO, show_function, NULL);
+
+/*-------------------------------------------------------------------------*/
+
+/*
+ * Driver registration/unregistration.
+ *
+ * This is basically hardware-specific; there's usually only one real USB
+ * device (not host) controller since that's how USB devices are intended
+ * to work.  So most implementations of these api calls will rely on the
+ * fact that only one driver will ever bind to the hardware.  But curious
+ * hardware can be built with discrete components, so the gadget API doesn't
+ * require that assumption.
+ *
+ * For this emulator, it might be convenient to create a usb slave device
+ * for each driver that registers:  just add to a big root hub.
+ */
+
+static void
+dummy_udc_release (struct device *dev)
+{
+	struct dummy	*dum = gadget_dev_to_dummy (dev);
+
+	complete (&dum->released);
+}
+
+static void
+dummy_hc_release (struct device *dev)
+{
+	struct dummy	*dum = dev_get_drvdata (dev);
+
+	complete (&dum->released);
+}
+
+static int
+dummy_register_udc (struct dummy *dum)
+{
+	int		rc;
+
+	strcpy (dum->gadget.dev.bus_id, "udc");
+	dum->gadget.dev.parent = &dum->pdev.dev;
+	dum->gadget.dev.release = dummy_udc_release;
+
+	rc = device_register (&dum->gadget.dev);
+	if (rc == 0)
+		device_create_file (&dum->gadget.dev, &dev_attr_function);
+	return rc;
+}
+
+static void
+dummy_unregister_udc (struct dummy *dum)
+{
+	device_remove_file (&dum->gadget.dev, &dev_attr_function);
+	init_completion (&dum->released);
+	device_unregister (&dum->gadget.dev);
+	wait_for_completion (&dum->released);
+}
+
+int
+usb_gadget_register_driver (struct usb_gadget_driver *driver)
+{
+	struct dummy	*dum = the_controller;
+	int		retval, i;
+
+	if (!dum)
+		return -EINVAL;
+	if (dum->driver)
+		return -EBUSY;
+	if (!driver->bind || !driver->unbind || !driver->setup
+			|| driver->speed == USB_SPEED_UNKNOWN)
+		return -EINVAL;
+
+	/*
+	 * SLAVE side init ... the layer above hardware, which
+	 * can't enumerate without help from the driver we're binding.
+	 */
+	dum->gadget.name = gadget_name;
+	dum->gadget.ops = &dummy_ops;
+	dum->gadget.is_dualspeed = 1;
+
+	INIT_LIST_HEAD (&dum->gadget.ep_list);
+	for (i = 0; i < DUMMY_ENDPOINTS; i++) {
+		struct dummy_ep	*ep = &dum->ep [i];
+
+		if (!ep_name [i])
+			break;
+		ep->ep.name = ep_name [i];
+		ep->ep.ops = &dummy_ep_ops;
+		list_add_tail (&ep->ep.ep_list, &dum->gadget.ep_list);
+		ep->halted = ep->already_seen = ep->setup_stage = 0;
+		ep->ep.maxpacket = ~0;
+		ep->last_io = jiffies;
+		ep->gadget = &dum->gadget;
+		ep->desc = 0;
+		INIT_LIST_HEAD (&ep->queue);
+	}
+
+	dum->gadget.ep0 = &dum->ep [0].ep;
+	dum->ep [0].ep.maxpacket = 64;
+	list_del_init (&dum->ep [0].ep.ep_list);
+	INIT_LIST_HEAD(&dum->fifo_req.queue);
+
+	dum->driver = driver;
+	dum->gadget.dev.driver = &driver->driver;
+	dev_dbg (hardware, "binding gadget driver '%s'\n", driver->driver.name);
+	if ((retval = driver->bind (&dum->gadget)) != 0) {
+		dum->driver = 0;
+		dum->gadget.dev.driver = 0;
+		return retval;
+	}
+
+	// FIXME: Check these calls for errors and re-order
+	driver->driver.bus = dum->pdev.dev.bus;
+	driver_register (&driver->driver);
+
+	device_bind_driver (&dum->gadget.dev);
+
+	/* khubd will enumerate this in a while */
+	dum->port_status |= USB_PORT_STAT_CONNECTION
+		| (1 << USB_PORT_FEAT_C_CONNECTION);
+	return 0;
+}
+EXPORT_SYMBOL (usb_gadget_register_driver);
+
+/* caller must hold lock */
+static void
+stop_activity (struct dummy *dum, struct usb_gadget_driver *driver)
+{
+	struct dummy_ep	*ep;
+
+	/* prevent any more requests */
+	dum->hdev = 0;
+	dum->address = 0;
+
+	/* this might not succeed ... */
+	del_timer (&dum->timer);
+
+	/* nuke any pending requests first, so driver i/o is quiesced */
+	list_for_each_entry (ep, &dum->gadget.ep_list, ep.ep_list)
+		nuke (dum, ep);
+
+	/* driver now does any non-usb quiescing necessary */
+	if (driver) {
+		spin_unlock (&dum->lock);
+		driver->disconnect (&dum->gadget);
+		spin_lock (&dum->lock);
+	}
+}
+
+int
+usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
+{
+	struct dummy	*dum = the_controller;
+	unsigned long	flags;
+
+	if (!dum)
+		return -ENODEV;
+	if (!driver || driver != dum->driver)
+		return -EINVAL;
+
+	dev_dbg (hardware, "unregister gadget driver '%s'\n",
+			driver->driver.name);
+
+	spin_lock_irqsave (&dum->lock, flags);
+	stop_activity (dum, driver);
+	dum->port_status &= ~USB_PORT_STAT_CONNECTION;
+	dum->port_status |= (1 << USB_PORT_FEAT_C_CONNECTION);
+	spin_unlock_irqrestore (&dum->lock, flags);
+
+	driver->unbind (&dum->gadget);
+	dum->driver = 0;
+
+	device_release_driver (&dum->gadget.dev);
+
+	driver_unregister (&driver->driver);
+
+	del_timer_sync (&dum->timer);
+	return 0;
+}
+EXPORT_SYMBOL (usb_gadget_unregister_driver);
+
+#undef is_enabled
+
+int net2280_set_fifo_mode (struct usb_gadget *gadget, int mode)
+{
+	return -ENOSYS;
+}
+EXPORT_SYMBOL (net2280_set_fifo_mode);
+
+/*-------------------------------------------------------------------------*/
+
+/* MASTER/HOST SIDE DRIVER
+ *
+ * this uses the hcd framework to hook up to host side drivers.
+ * its root hub will only have one device, otherwise it acts like
+ * a normal host controller.
+ *
+ * when urbs are queued, they're just stuck on a list that we
+ * scan in a timer callback.  that callback connects writes from
+ * the host with reads from the device, and so on, based on the
+ * usb 2.0 rules.
+ */
+
+static int dummy_urb_enqueue (
+	struct usb_hcd	*hcd,
+	struct urb	*urb,
+	int		mem_flags
+) {
+	struct dummy	*dum;
+	unsigned long	flags;
+
+	/* patch to usb_sg_init() is in 2.5.60 */
+	BUG_ON (!urb->transfer_buffer && urb->transfer_buffer_length);
+
+	dum = container_of (hcd, struct dummy, hcd);
+	spin_lock_irqsave (&dum->lock, flags);
+
+	if (!dum->hdev)
+		dum->hdev = urb->dev->hcpriv;
+	urb->hcpriv = dum;
+	if (usb_pipetype (urb->pipe) == PIPE_CONTROL)
+		urb->error_count = 1;		/* mark as a new urb */
+
+	/* kick the scheduler, it'll do the rest */
+	if (!timer_pending (&dum->timer))
+		mod_timer (&dum->timer, jiffies + 1);
+
+	spin_unlock_irqrestore (&dum->lock, flags);
+	return 0;
+}
+
+static int dummy_urb_dequeue (struct usb_hcd *hcd, struct urb *urb)
+{
+	/* giveback happens automatically in timer callback */
+	return 0;
+}
+
+static void maybe_set_status (struct urb *urb, int status)
+{
+	spin_lock (&urb->lock);
+	if (urb->status == -EINPROGRESS)
+		urb->status = status;
+	spin_unlock (&urb->lock);
+}
+
+/* transfer up to a frame's worth; caller must own lock */
+static int
+transfer (struct dummy *dum, struct urb *urb, struct dummy_ep *ep, int limit)
+{
+	struct dummy_request	*req;
+
+top:
+	/* if there's no request queued, the device is NAKing; return */
+	list_for_each_entry (req, &ep->queue, queue) {
+		unsigned	host_len, dev_len, len;
+		int		is_short, to_host;
+		int		rescan = 0;
+
+		/* 1..N packets of ep->ep.maxpacket each ... the last one
+		 * may be short (including zero length).
+		 *
+		 * writer can send a zlp explicitly (length 0) or implicitly
+		 * (length mod maxpacket zero, and 'zero' flag); they always
+		 * terminate reads.
+		 */
+		host_len = urb->transfer_buffer_length - urb->actual_length;
+		dev_len = req->req.length - req->req.actual;
+		len = min (host_len, dev_len);
+
+		/* FIXME update emulated data toggle too */
+
+		to_host = usb_pipein (urb->pipe);
+		if (unlikely (len == 0))
+			is_short = 1;
+		else {
+			char		*ubuf, *rbuf;
+
+			/* not enough bandwidth left? */
+			if (limit < ep->ep.maxpacket && limit < len)
+				break;
+			len = min (len, (unsigned) limit);
+			if (len == 0)
+				break;
+
+			/* use an extra pass for the final short packet */
+			if (len > ep->ep.maxpacket) {
+				rescan = 1;
+				len -= (len % ep->ep.maxpacket);
+			}
+			is_short = (len % ep->ep.maxpacket) != 0;
+
+			/* else transfer packet(s) */
+			ubuf = urb->transfer_buffer + urb->actual_length;
+			rbuf = req->req.buf + req->req.actual;
+			if (to_host)
+				memcpy (ubuf, rbuf, len);
+			else
+				memcpy (rbuf, ubuf, len);
+			ep->last_io = jiffies;
+
+			limit -= len;
+			urb->actual_length += len;
+			req->req.actual += len;
+		}
+
+		/* short packets terminate, maybe with overflow/underflow.
+		 * it's only really an error to write too much.
+		 *
+		 * partially filling a buffer optionally blocks queue advances
+		 * (so completion handlers can clean up the queue) but we don't
+		 * need to emulate such data-in-flight.  so we only show part
+		 * of the URB_SHORT_NOT_OK effect: completion status.
+		 */
+		if (is_short) {
+			if (host_len == dev_len) {
+				req->req.status = 0;
+				maybe_set_status (urb, 0);
+			} else if (to_host) {
+				req->req.status = 0;
+				if (dev_len > host_len)
+					maybe_set_status (urb, -EOVERFLOW);
+				else
+					maybe_set_status (urb,
+						(urb->transfer_flags
+							& URB_SHORT_NOT_OK)
+						? -EREMOTEIO : 0);
+			} else if (!to_host) {
+				maybe_set_status (urb, 0);
+				if (host_len > dev_len)
+					req->req.status = -EOVERFLOW;
+				else
+					req->req.status = 0;
+			}
+
+		/* many requests terminate without a short packet */
+		} else {
+			if (req->req.length == req->req.actual
+					&& !req->req.zero)
+				req->req.status = 0;
+			if (urb->transfer_buffer_length == urb->actual_length
+					&& !(urb->transfer_flags
+						& URB_ZERO_PACKET)) {
+				maybe_set_status (urb, 0);
+			}
+		}
+
+		/* device side completion --> continuable */
+		if (req->req.status != -EINPROGRESS) {
+			list_del_init (&req->queue);
+
+			spin_unlock (&dum->lock);
+			req->req.complete (&ep->ep, &req->req);
+			spin_lock (&dum->lock);
+
+			/* requests might have been unlinked... */
+			rescan = 1;
+		}
+
+		/* host side completion --> terminate */
+		if (urb->status != -EINPROGRESS)
+			break;
+
+		/* rescan to continue with any other queued i/o */
+		if (rescan)
+			goto top;
+	}
+	return limit;
+}
+
+static int periodic_bytes (struct dummy *dum, struct dummy_ep *ep)
+{
+	int	limit = ep->ep.maxpacket;
+
+	if (dum->gadget.speed == USB_SPEED_HIGH) {
+		int	tmp;
+
+		/* high bandwidth mode */
+		tmp = ep->desc->wMaxPacketSize;
+		tmp = le16_to_cpu (tmp);
+		tmp = (tmp >> 11) & 0x03;
+		tmp *= 8 /* applies to entire frame */;
+		limit += limit * tmp;
+	}
+	return limit;
+}
+
+static struct dummy_ep *find_endpoint (struct dummy *dum, u8 address)
+{
+	int		i;
+
+	if ((address & ~USB_DIR_IN) == 0)
+		return &dum->ep [0];
+	for (i = 1; i < DUMMY_ENDPOINTS; i++) {
+		struct dummy_ep	*ep = &dum->ep [i];
+
+		if (!ep->desc)
+			continue;
+		if (ep->desc->bEndpointAddress == address)
+			return ep;
+	}
+	return NULL;
+}
+
+#define Dev_Request	(USB_TYPE_STANDARD | USB_RECIP_DEVICE)
+#define Dev_InRequest	(Dev_Request | USB_DIR_IN)
+#define Intf_Request	(USB_TYPE_STANDARD | USB_RECIP_INTERFACE)
+#define Intf_InRequest	(Intf_Request | USB_DIR_IN)
+#define Ep_Request	(USB_TYPE_STANDARD | USB_RECIP_ENDPOINT)
+#define Ep_InRequest	(Ep_Request | USB_DIR_IN)
+
+/* drive both sides of the transfers; looks like irq handlers to
+ * both drivers except the callbacks aren't in_irq().
+ */
+static void dummy_timer (unsigned long _dum)
+{
+	struct dummy		*dum = (struct dummy *) _dum;
+	struct hcd_dev		*hdev = dum->hdev;
+	struct list_head	*entry, *tmp;
+	unsigned long		flags;
+	int			limit, total;
+	int			i;
+
+	if (!hdev) {
+		dev_err (hardware, "timer fired with device gone?\n");
+		return;
+	}
+
+	/* simplistic model for one frame's bandwidth */
+	switch (dum->gadget.speed) {
+	case USB_SPEED_LOW:
+		total = 8/*bytes*/ * 12/*packets*/;
+		break;
+	case USB_SPEED_FULL:
+		total = 64/*bytes*/ * 19/*packets*/;
+		break;
+	case USB_SPEED_HIGH:
+		total = 512/*bytes*/ * 13/*packets*/ * 8/*uframes*/;
+		break;
+	default:
+		dev_err (hardware, "bogus device speed\n");
+		return;
+	}
+
+	/* FIXME if HZ != 1000 this will probably misbehave ... */
+
+	/* look at each urb queued by the host side driver */
+	spin_lock_irqsave (&dum->lock, flags);
+	for (i = 0; i < DUMMY_ENDPOINTS; i++) {
+		if (!ep_name [i])
+			break;
+		dum->ep [i].already_seen = 0;
+	}
+
+restart:
+	list_for_each_safe (entry, tmp, &hdev->urb_list) {
+		struct urb		*urb;
+		struct dummy_request	*req;
+		u8			address;
+		struct dummy_ep		*ep = 0;
+		int			type;
+
+		urb = list_entry (entry, struct urb, urb_list);
+		if (urb->status != -EINPROGRESS) {
+			/* likely it was just unlinked */
+			goto return_urb;
+		}
+		type = usb_pipetype (urb->pipe);
+
+		/* used up this frame's non-periodic bandwidth?
+		 * FIXME there's infinite bandwidth for control and
+		 * periodic transfers ... unrealistic.
+		 */
+		if (total <= 0 && type == PIPE_BULK)
+			continue;
+
+		/* find the gadget's ep for this request (if configured) */
+		address = usb_pipeendpoint (urb->pipe);
+		if (usb_pipein (urb->pipe))
+			address |= USB_DIR_IN;
+		ep = find_endpoint(dum, address);
+		if (!ep) {
+			/* set_configuration() disagreement */
+			dev_err (hardware,
+				"no ep configured for urb %p\n",
+				urb);
+			maybe_set_status (urb, -ETIMEDOUT);
+			goto return_urb;
+		}
+
+		if (ep->already_seen)
+			continue;
+		ep->already_seen = 1;
+		if (ep == &dum->ep [0] && urb->error_count) {
+			ep->setup_stage = 1;	/* a new urb */
+			urb->error_count = 0;
+		}
+		if (ep->halted && !ep->setup_stage) {
+			/* NOTE: must not be iso! */
+			dev_dbg (hardware, "ep %s halted, urb %p\n",
+					ep->ep.name, urb);
+			maybe_set_status (urb, -EPIPE);
+			goto return_urb;
+		}
+		/* FIXME make sure both ends agree on maxpacket */
+
+		/* handle control requests */
+		if (ep == &dum->ep [0] && ep->setup_stage) {
+			struct usb_ctrlrequest		setup;
+			int				value = 1;
+			struct dummy_ep			*ep2;
+
+			setup = *(struct usb_ctrlrequest*) urb->setup_packet;
+			le16_to_cpus (&setup.wIndex);
+			le16_to_cpus (&setup.wValue);
+			le16_to_cpus (&setup.wLength);
+			if (setup.wLength != urb->transfer_buffer_length) {
+				maybe_set_status (urb, -EOVERFLOW);
+				goto return_urb;
+			}
+
+			/* paranoia, in case of stale queued data */
+			list_for_each_entry (req, &ep->queue, queue) {
+				list_del_init (&req->queue);
+				req->req.status = -EOVERFLOW;
+				dev_dbg (hardware, "stale req = %p\n", req);
+
+				spin_unlock (&dum->lock);
+				req->req.complete (&ep->ep, &req->req);
+				spin_lock (&dum->lock);
+				ep->already_seen = 0;
+				goto restart;
+			}
+
+			/* gadget driver never sees set_address or operations
+			 * on standard feature flags.  some hardware doesn't
+			 * even expose them.
+			 */
+			ep->last_io = jiffies;
+			ep->setup_stage = 0;
+			ep->halted = 0;
+			switch (setup.bRequest) {
+			case USB_REQ_SET_ADDRESS:
+				if (setup.bRequestType != Dev_Request)
+					break;
+				if (dum->address != 0) {
+					maybe_set_status (urb, -ETIMEDOUT);
+					urb->actual_length = 0;
+					goto return_urb;
+				}
+				dum->address = setup.wValue;
+				maybe_set_status (urb, 0);
+				dev_dbg (hardware, "set_address = %d\n",
+						setup.wValue);
+				value = 0;
+				break;
+			case USB_REQ_SET_FEATURE:
+				if (setup.bRequestType == Dev_Request) {
+					// remote wakeup, and (hs) test mode
+					value = -EOPNOTSUPP;
+				} else if (setup.bRequestType == Ep_Request) {
+					// endpoint halt
+					ep2 = find_endpoint (dum,
+							setup.wIndex);
+					if (!ep2) {
+						value = -EOPNOTSUPP;
+						break;
+					}
+					ep2->halted = 1;
+					value = 0;
+					maybe_set_status (urb, 0);
+				}
+				break;
+			case USB_REQ_CLEAR_FEATURE:
+				if (setup.bRequestType == Dev_Request) {
+					// remote wakeup
+					value = 0;
+					maybe_set_status (urb, 0);
+				} else if (setup.bRequestType == Ep_Request) {
+					// endpoint halt
+					ep2 = find_endpoint (dum,
+							setup.wIndex);
+					if (!ep2) {
+						value = -EOPNOTSUPP;
+						break;
+					}
+					ep2->halted = 0;
+					value = 0;
+					maybe_set_status (urb, 0);
+				}
+				break;
+			case USB_REQ_GET_STATUS:
+				if (setup.bRequestType == Dev_InRequest
+						|| setup.bRequestType
+							== Intf_InRequest
+						|| setup.bRequestType
+							== Ep_InRequest
+						) {
+					char *buf;
+
+					// device: remote wakeup, selfpowered
+					// interface: nothing
+					// endpoint: halt
+					buf = (char *)urb->transfer_buffer;
+					if (urb->transfer_buffer_length > 0) {
+						if (setup.bRequestType ==
+								Ep_InRequest) {
+	ep2 = find_endpoint (dum, setup.wIndex);
+	if (!ep2) {
+		value = -EOPNOTSUPP;
+		break;
+	}
+	buf [0] = ep2->halted;
+						} else
+							buf [0] = 0;
+					}
+					if (urb->transfer_buffer_length > 1)
+						buf [1] = 0;
+					urb->actual_length = min (2,
+						urb->transfer_buffer_length);
+					value = 0;
+					maybe_set_status (urb, 0);
+				}
+				break;
+			}
+
+			/* gadget driver handles all other requests.  block
+			 * until setup() returns; no reentrancy issues etc.
+			 */
+			if (value > 0) {
+				spin_unlock (&dum->lock);
+				value = dum->driver->setup (&dum->gadget,
+						&setup);
+				spin_lock (&dum->lock);
+
+				if (value >= 0) {
+					/* no delays (max 64KB data stage) */
+					limit = 64*1024;
+					goto treat_control_like_bulk;
+				}
+				/* error, see below */
+			}
+
+			if (value < 0) {
+				if (value != -EOPNOTSUPP)
+					dev_dbg (hardware,
+						"setup --> %d\n",
+						value);
+				maybe_set_status (urb, -EPIPE);
+				urb->actual_length = 0;
+			}
+
+			goto return_urb;
+		}
+
+		/* non-control requests */
+		limit = total;
+		switch (usb_pipetype (urb->pipe)) {
+		case PIPE_ISOCHRONOUS:
+			/* FIXME is it urb->interval since the last xfer?
+			 * use urb->iso_frame_desc[i].
+			 * complete whether or not ep has requests queued.
+			 * report random errors, to debug drivers.
+			 */
+			limit = max (limit, periodic_bytes (dum, ep));
+			maybe_set_status (urb, -ENOSYS);
+			break;
+
+		case PIPE_INTERRUPT:
+			/* FIXME is it urb->interval since the last xfer?
+			 * this almost certainly polls too fast.
+			 */
+			limit = max (limit, periodic_bytes (dum, ep));
+			/* FALLTHROUGH */
+
+		// case PIPE_BULK:  case PIPE_CONTROL:
+		default:
+		treat_control_like_bulk:
+			ep->last_io = jiffies;
+			total = transfer (dum, urb, ep, limit);
+			break;
+		}
+
+		/* incomplete transfer? */
+		if (urb->status == -EINPROGRESS)
+			continue;
+
+return_urb:
+		urb->hcpriv = 0;
+		if (ep)
+			ep->already_seen = ep->setup_stage = 0;
+
+		spin_unlock (&dum->lock);
+		usb_hcd_giveback_urb (&dum->hcd, urb, 0);
+		spin_lock (&dum->lock);
+
+		goto restart;
+	}
+
+	/* want a 1 msec delay here */
+	if (!list_empty (&hdev->urb_list))
+		mod_timer (&dum->timer, jiffies + 1);
+
+	spin_unlock_irqrestore (&dum->lock, flags);
+}
+
+/*-------------------------------------------------------------------------*/
+
+#define PORT_C_MASK \
+	 ((1 << USB_PORT_FEAT_C_CONNECTION) \
+	| (1 << USB_PORT_FEAT_C_ENABLE) \
+	| (1 << USB_PORT_FEAT_C_SUSPEND) \
+	| (1 << USB_PORT_FEAT_C_OVER_CURRENT) \
+	| (1 << USB_PORT_FEAT_C_RESET))
+
+static int dummy_hub_status (struct usb_hcd *hcd, char *buf)
+{
+	struct dummy		*dum;
+	unsigned long		flags;
+	int			retval;
+
+	dum = container_of (hcd, struct dummy, hcd);
+
+	spin_lock_irqsave (&dum->lock, flags);
+	if (!(dum->port_status & PORT_C_MASK))
+		retval = 0;
+	else {
+		*buf = (1 << 1);
+		dev_dbg (hardware, "port status 0x%08x has changes\n",
+			dum->port_status);
+		retval = 1;
+	}
+	spin_unlock_irqrestore (&dum->lock, flags);
+	return retval;
+}
+
+static inline void
+hub_descriptor (struct usb_hub_descriptor *desc)
+{
+	memset (desc, 0, sizeof *desc);
+	desc->bDescriptorType = 0x29;
+	desc->bDescLength = 9;
+	desc->wHubCharacteristics = __constant_cpu_to_le16 (0x0001);
+	desc->bNbrPorts = 1;
+	desc->bitmap [0] = 0xff;
+	desc->bitmap [1] = 0xff;
+}
+
+static int dummy_hub_control (
+	struct usb_hcd	*hcd,
+	u16		typeReq,
+	u16		wValue,
+	u16		wIndex,
+	char		*buf,
+	u16		wLength
+) {
+	struct dummy	*dum;
+	int		retval = 0;
+	unsigned long	flags;
+
+	dum = container_of (hcd, struct dummy, hcd);
+	spin_lock_irqsave (&dum->lock, flags);
+	switch (typeReq) {
+	case ClearHubFeature:
+		break;
+	case ClearPortFeature:
+		// FIXME won't some of these need special handling?
+		dum->port_status &= ~(1 << wValue);
+		break;
+	case GetHubDescriptor:
+		hub_descriptor ((struct usb_hub_descriptor *) buf);
+		break;
+	case GetHubStatus:
+		*(u32 *) buf = __constant_cpu_to_le32 (0);
+		break;
+	case GetPortStatus:
+		if (wIndex != 1)
+			retval = -EPIPE;
+		((u16 *) buf)[0] = cpu_to_le16 (dum->port_status);
+		((u16 *) buf)[1] = cpu_to_le16 (dum->port_status >> 16);
+		break;
+	case SetHubFeature:
+		retval = -EPIPE;
+		break;
+	case SetPortFeature:
+		if (wValue == USB_PORT_FEAT_RESET) {
+			/* if it's already running, disconnect first */
+			if (dum->port_status & USB_PORT_STAT_ENABLE) {
+				dum->port_status &= ~(USB_PORT_STAT_ENABLE
+						| USB_PORT_STAT_LOW_SPEED
+						| USB_PORT_STAT_HIGH_SPEED);
+				if (dum->driver) {
+					dev_dbg (hardware, "disconnect\n");
+					stop_activity (dum, dum->driver);
+				}
+
+				/* FIXME test that code path! */
+			} else
+				dum->port_status |=
+					(1 << USB_PORT_FEAT_C_ENABLE);
+
+			dum->port_status |= USB_PORT_STAT_ENABLE |
+				  (1 << USB_PORT_FEAT_C_RESET);
+			if (dum->driver) {
+
+				/* give it the best speed we agree on */
+				dum->gadget.speed = dum->driver->speed;
+				dum->gadget.ep0->maxpacket = 64;
+				switch (dum->gadget.speed) {
+				case USB_SPEED_HIGH:
+					dum->port_status |=
+						USB_PORT_STAT_HIGH_SPEED;
+					break;
+				case USB_SPEED_LOW:
+					dum->gadget.ep0->maxpacket = 8;
+					dum->port_status |=
+						USB_PORT_STAT_LOW_SPEED;
+					break;
+				default:
+					dum->gadget.speed = USB_SPEED_FULL;
+					break;
+				}
+			}
+		} else
+			dum->port_status |= (1 << wValue);
+		break;
+
+	default:
+		dev_dbg (hardware,
+			"hub control req%04x v%04x i%04x l%d\n",
+			typeReq, wValue, wIndex, wLength);
+
+		/* "protocol stall" on error */
+		retval = -EPIPE;
+	}
+	spin_unlock_irqrestore (&dum->lock, flags);
+	return retval;
+}
+
+
+/*-------------------------------------------------------------------------*/
+
+static struct usb_hcd *dummy_alloc (void)
+{
+	struct dummy		*dum;
+
+	dum = kmalloc (sizeof *dum, SLAB_KERNEL);
+	if (dum == NULL)
+		return 0;
+	memset (dum, 0, sizeof *dum);
+	return &dum->hcd;
+}
+
+static void dummy_free (struct usb_hcd *hcd)
+{
+	struct dummy		*dum;
+
+	dum = container_of (hcd, struct dummy, hcd);
+	WARN_ON (dum->driver != 0);
+	kfree (dum);
+}
+
+/*-------------------------------------------------------------------------*/
+
+static inline ssize_t
+show_urb (char *buf, size_t size, struct urb *urb)
+{
+	int ep = usb_pipeendpoint (urb->pipe);
+
+	return snprintf (buf, size,
+		"urb/%p %s ep%d%s%s len %d/%d\n",
+		urb,
+		({ char *s;
+		 switch (urb->dev->speed) {
+		 case USB_SPEED_LOW:	s = "ls"; break;
+		 case USB_SPEED_FULL:	s = "fs"; break;
+		 case USB_SPEED_HIGH:	s = "hs"; break;
+		 default:		s = "?"; break;
+		 }; s; }),
+		ep, ep ? (usb_pipein (urb->pipe) ? "in" : "out") : "",
+		({ char *s; \
+		 switch (usb_pipetype (urb->pipe)) { \
+		 case PIPE_CONTROL:	s = ""; break; \
+		 case PIPE_BULK:	s = "-bulk"; break; \
+		 case PIPE_INTERRUPT:	s = "-int"; break; \
+		 default: 		s = "-iso"; break; \
+		}; s;}),
+		urb->actual_length, urb->transfer_buffer_length);
+}
+
+static ssize_t
+show_urbs (struct device *dev, char *buf)
+{
+	struct dummy		*dum = dev_get_drvdata(dev);
+	struct urb		*urb;
+	size_t			size = 0;
+	unsigned long		flags;
+
+	spin_lock_irqsave (&dum->lock, flags);
+	if (dum->hdev) {
+		list_for_each_entry (urb, &dum->hdev->urb_list, urb_list) {
+			size_t		temp;
+
+			temp = show_urb (buf, PAGE_SIZE - size, urb);
+			buf += temp;
+			size += temp;
+		}
+	}
+	spin_unlock_irqrestore (&dum->lock, flags);
+
+	return size;
+}
+static DEVICE_ATTR (urbs, S_IRUGO, show_urbs, NULL);
+
+
+static const struct hc_driver dummy_hcd;
+
+static int dummy_start (struct usb_hcd *hcd)
+{
+	struct dummy		*dum;
+	struct usb_bus		*bus;
+	struct usb_device	*root;
+	int			retval;
+
+	dum = container_of (hcd, struct dummy, hcd);
+
+	/*
+	 * MASTER side init ... we emulate a root hub that'll only ever
+	 * talk to one device (the slave side).  Also appears in sysfs,
+	 * just like more familiar pci-based HCDs.
+	 */
+	spin_lock_init (&dum->lock);
+
+	retval = driver_register (&dummy_driver);
+	if (retval < 0)
+		return retval;
+
+	dum->pdev.name = "hc";
+	dum->pdev.dev.driver = &dummy_driver;
+	dev_set_drvdata(&dum->pdev.dev, dum);
+	dum->pdev.dev.release = dummy_hc_release;
+	retval = platform_device_register (&dum->pdev);
+	if (retval < 0) {
+		driver_unregister (&dummy_driver);
+		return retval;
+	}
+	dev_info (&dum->pdev.dev, "%s, driver " DRIVER_VERSION "\n",
+			driver_desc);
+
+	hcd->self.controller = &dum->pdev.dev;
+
+	/* FIXME 'urbs' should be a per-device thing, maybe in usbcore */
+	device_create_file (hcd->self.controller, &dev_attr_urbs);
+
+	init_timer (&dum->timer);
+	dum->timer.function = dummy_timer;
+	dum->timer.data = (unsigned long) dum;
+
+	/* root hub will appear as another device */
+	dum->hcd.driver = (struct hc_driver *) &dummy_hcd;
+	dum->hcd.description = dummy_hcd.description;
+	dum->hcd.product_desc = "Dummy host controller";
+
+	bus = hcd_to_bus (&dum->hcd);
+	bus->bus_name = dum->pdev.dev.bus_id;
+	usb_bus_init (bus);
+	bus->op = &usb_hcd_operations;
+	bus->hcpriv = &dum->hcd;
+
+	/* FIXME don't require the pci-based buffer/alloc impls;
+	 * the "generic dma" implementation still requires them,
+	 * it's not very generic yet.
+	 */
+	if ((retval = hcd_buffer_create (&dum->hcd)) != 0) {
+clean0:
+		init_completion (&dum->released);
+		platform_device_unregister (&dum->pdev);
+		wait_for_completion (&dum->released);
+		driver_unregister (&dummy_driver);
+		return retval;
+	}
+
+	INIT_LIST_HEAD (&hcd->dev_list);
+	usb_register_bus (bus);
+
+	bus->root_hub = root = usb_alloc_dev (0, bus, 0);
+	if (!root) {
+		retval = -ENOMEM;
+clean1:
+		hcd_buffer_destroy (&dum->hcd);
+		usb_deregister_bus (bus);
+		goto clean0;
+	}
+
+	/* root hub enters addressed state... */
+	dum->hcd.state = USB_STATE_RUNNING;
+	root->speed = USB_SPEED_HIGH;
+
+	/* ...then configured, so khubd sees us. */
+	if ((retval = hcd_register_root (&dum->hcd)) != 0) {
+		bus->root_hub = 0;
+		usb_put_dev (root);
+clean2:
+		dum->hcd.state = USB_STATE_QUIESCING;
+		goto clean1;
+	}
+
+	dum->started = 1;
+
+	if ((retval = dummy_register_udc (dum)) != 0) {
+		dum->started = 0;
+		usb_disconnect (&bus->root_hub);
+		goto clean2;
+	}
+	return 0;
+}
+
+static void dummy_stop (struct usb_hcd *hcd)
+{
+	struct dummy		*dum;
+	struct usb_bus		*bus;
+
+	dum = container_of (hcd, struct dummy, hcd);
+	if (!dum->started)
+		return;
+	dum->started = 0;
+
+	usb_gadget_unregister_driver (dum->driver);
+	dummy_unregister_udc (dum);
+
+	bus = hcd_to_bus (&dum->hcd);
+	hcd->state = USB_STATE_QUIESCING;
+	dev_dbg (hardware, "remove root hub\n");
+	usb_disconnect (&bus->root_hub);
+
+	hcd_buffer_destroy (&dum->hcd);
+	usb_deregister_bus (bus);
+
+	dev_info (hardware, "stopped\n");
+
+	device_remove_file (hcd->self.controller, &dev_attr_urbs);
+	init_completion (&dum->released);
+	platform_device_unregister (&dum->pdev);
+	wait_for_completion (&dum->released);
+
+	driver_unregister (&dummy_driver);
+}
+
+/*-------------------------------------------------------------------------*/
+
+static int dummy_h_get_frame (struct usb_hcd *hcd)
+{
+	return dummy_g_get_frame (0);
+}
+
+static const struct hc_driver dummy_hcd = {
+	.description =		(char *) driver_name,
+	.flags =		HCD_USB2,
+
+	.start =		dummy_start,
+	.stop =			dummy_stop,
+
+	.hcd_alloc = 		dummy_alloc,
+	.hcd_free = 		dummy_free,
+
+	.urb_enqueue = 		dummy_urb_enqueue,
+	.urb_dequeue = 		dummy_urb_dequeue,
+
+	.get_frame_number = 	dummy_h_get_frame,
+
+	.hub_status_data = 	dummy_hub_status,
+	.hub_control = 		dummy_hub_control,
+};
+
+/*-------------------------------------------------------------------------*/
+
+static int __init init (void)
+{
+	struct usb_hcd		*hcd;
+	int			value;
+
+	if (usb_disabled ())
+		return -ENODEV;
+	if ((hcd = dummy_alloc ()) == 0)
+		return -ENOMEM;
+
+	the_controller = container_of (hcd, struct dummy, hcd);
+	value = dummy_start (hcd);
+
+	if (value != 0) {
+		dummy_free (hcd);
+		the_controller = 0;
+	}
+	return value;
+}
+module_init (init);
+
+static void __exit cleanup (void)
+{
+	dummy_stop (&the_controller->hcd);
+	dummy_free (&the_controller->hcd);
+	the_controller = 0;
+}
+module_exit (cleanup);
+
--- diff/drivers/usb/gadget/epautoconf.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/usb/gadget/epautoconf.c	2004-04-21 10:45:35.040376552 +0100
@@ -0,0 +1,306 @@
+/*
+ * epautoconf.c -- endpoint autoconfiguration for usb gadget drivers
+ *
+ * Copyright (C) 2004 David Brownell
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/device.h>
+
+#include <linux/ctype.h>
+#include <linux/string.h>
+
+#include <linux/usb_ch9.h>
+#include <linux/usb_gadget.h>
+
+#include "gadget_chips.h"
+
+
+/* we must assign addresses for configurable endpoints (like net2280) */
+static __initdata unsigned epnum;
+
+// #define MANY_ENDPOINTS
+#ifdef MANY_ENDPOINTS
+/* more than 15 configurable endpoints */
+static __initdata unsigned in_epnum;
+#endif
+
+
+/*
+ * This should work with endpoints from controller drivers sharing the
+ * same endpoint naming convention.  By example:
+ *
+ *	- ep1, ep2, ... address is fixed, not direction or type
+ *	- ep1in, ep2out, ... address and direction are fixed, not type
+ *	- ep1-bulk, ep2-bulk, ... address and type are fixed, not direction
+ *	- ep1in-bulk, ep2out-iso, ... all three are fixed
+ *	- ep-* ... no functionality restrictions
+ *
+ * Type suffixes are "-bulk", "-iso", or "-int".  Numbers are decimal.
+ * Less common restrictions are implied by gadget_is_*().
+ */
+static int __init
+ep_matches (
+	struct usb_gadget		*gadget,
+	struct usb_ep			*ep,
+	struct usb_endpoint_descriptor	*desc
+)
+{
+	u8		type;
+	const char	*tmp;
+	u16		max;
+
+	/* endpoint already claimed? */
+	if (0 != ep->driver_data)
+		return 0;
+		
+	/* only support ep0 for portable CONTROL traffic */
+	type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
+	if (USB_ENDPOINT_XFER_CONTROL == type)
+		return 0;
+
+	/* some other naming convention */
+	if ('e' != ep->name[0])
+		return 0;
+
+	/* type-restriction:  "-iso", "-bulk", or "-int".
+	 * direction-restriction:  "in", "out".
+	 */
+	if ('-' != ep->name[2]) {
+		tmp = strrchr (ep->name, '-');
+		if (tmp) {
+			switch (type) {
+			case USB_ENDPOINT_XFER_INT:
+				/* bulk endpoints handle interrupt transfers,
+				 * except the toggle-quirky iso-synch kind
+				 */
+				if ('s' == tmp[2])	// == "-iso"
+					return 0;
+				/* for now, avoid PXA "interrupt-in";
+				 * it's documented as never using DATA1.
+				 */
+				if (gadget_is_pxa (gadget))
+					return 0;
+				break;
+			case USB_ENDPOINT_XFER_BULK:
+				if ('b' != tmp[1])	// != "-bulk"
+					return 0;
+				break;
+			case USB_ENDPOINT_XFER_ISOC:
+				if ('s' != tmp[2])	// != "-iso"
+					return 0;
+			}
+		} else {
+			tmp = ep->name + strlen (ep->name);
+		}
+
+		/* direction-restriction:  "..in-..", "out-.." */
+		tmp--;
+		if (!isdigit (*tmp)) {
+			if (desc->bEndpointAddress & USB_DIR_IN) {
+				if ('n' != *tmp)
+					return 0;
+			} else {
+				if ('t' != *tmp)
+					return 0;
+			}
+		}
+	}
+
+	/* endpoint maxpacket size is an input parameter, except for bulk
+	 * where it's an output parameter representing the full speed limit.
+	 * the usb spec fixes high speed bulk maxpacket at 512 bytes.
+	 */
+	max = 0x7ff & le16_to_cpup (&desc->wMaxPacketSize);
+	switch (type) {
+	case USB_ENDPOINT_XFER_INT:
+		/* INT:  limit 64 bytes full speed, 1024 high speed */
+		if (!gadget->is_dualspeed && max > 64)
+			return 0;
+		/* FALLTHROUGH */
+
+	case USB_ENDPOINT_XFER_ISOC:
+		/* ISO:  limit 1023 bytes full speed, 1024 high speed */
+		if (ep->maxpacket < max)
+			return 0;
+		if (!gadget->is_dualspeed && max > 1023)
+			return 0;
+
+		/* BOTH:  "high bandwidth" works only at high speed */
+		if ((desc->wMaxPacketSize & __constant_cpu_to_le16(3<<11))) {
+			if (!gadget->is_dualspeed)
+				return 0;
+			/* configure your hardware with enough buffering!! */
+		}
+		break;
+	}
+
+	/* MATCH!! */
+
+	/* report address */
+	if (isdigit (ep->name [2])) {
+		u8	num = simple_strtol (&ep->name [2], NULL, 10);
+		desc->bEndpointAddress |= num;
+#ifdef	MANY_ENDPOINTS
+	} else if (desc->bEndpointAddress & USB_DIR_IN) {
+		if (++in_epnum > 15)
+			return 0;
+		desc->bEndpointAddress = USB_DIR_IN | in_epnum;
+#endif
+	} else {
+		if (++epnum > 15)
+			return 0;
+		desc->bEndpointAddress |= epnum;
+	}
+
+	/* report (variable) full speed bulk maxpacket */
+	if (USB_ENDPOINT_XFER_BULK == type) {
+		int size = ep->maxpacket;
+
+		/* min() doesn't work on bitfields with gcc-3.5 */
+		if (size > 64)
+			size = 64;
+		desc->wMaxPacketSize = cpu_to_le16(size);
+	}
+	return 1;
+}
+
+static struct usb_ep * __init
+find_ep (struct usb_gadget *gadget, const char *name)
+{
+	struct usb_ep	*ep;
+
+	list_for_each_entry (ep, &gadget->ep_list, ep_list) {
+		if (0 == strcmp (ep->name, name))
+			return ep;
+	}
+	return 0;
+}
+
+/**
+ * usb_ep_autoconfig - choose an endpoint matching the descriptor
+ * @gadget: The device to which the endpoint must belong.
+ * @desc: Endpoint descriptor, with endpoint direction and transfer mode
+ *	initialized.  For periodic transfers, the maximum packet
+ *	size must also be initialized.  This is modified on success.
+ *
+ * By choosing an endpoint to use with the specified descriptor, this
+ * routine simplifies writing gadget drivers that work with multiple
+ * USB device controllers.  The endpoint would be passed later to
+ * usb_ep_enable(), along with some descriptor.
+ *
+ * That second descriptor won't always be the same as the first one.
+ * For example, isochronous endpoints can be autoconfigured for high
+ * bandwidth, and then used in several lower bandwidth altsettings.
+ * Also, high and full speed descriptors will be different.
+ *
+ * Be sure to examine and test the results of autoconfiguration on your
+ * hardware.  This code may not make the best choices about how to use the
+ * USB controller, and it can't know all the restrictions that may apply.
+ * Some combinations of driver and hardware won't be able to autoconfigure.
+ *
+ * On success, this returns an un-claimed usb_ep, and modifies the endpoint
+ * descriptor bEndpointAddress.  For bulk endpoints, the wMaxPacket value
+ * is initialized as if the endpoint were used at full speed.  To prevent
+ * the endpoint from being returned by a later autoconfig call, claim it
+ * by assigning ep->driver_data to some non-null value.
+ *
+ * On failure, this returns a null endpoint descriptor.
+ */
+struct usb_ep * __init usb_ep_autoconfig (
+	struct usb_gadget		*gadget,
+	struct usb_endpoint_descriptor	*desc
+)
+{
+	struct usb_ep	*ep;
+	u8		type;
+
+	type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
+
+	/* First, apply chip-specific "best usage" knowledge.
+	 * This might make a good usb_gadget_ops hook ...
+	 */
+	if (gadget_is_net2280 (gadget) && type == USB_ENDPOINT_XFER_INT) {
+		/* ep-e, ep-f are PIO with only 64 byte fifos */
+		ep = find_ep (gadget, "ep-e");
+		if (ep && ep_matches (gadget, ep, desc))
+			return ep;
+		ep = find_ep (gadget, "ep-f");
+		if (ep && ep_matches (gadget, ep, desc))
+			return ep;
+
+	} else if (gadget_is_goku (gadget)) {
+		if (USB_ENDPOINT_XFER_INT == type) {
+			/* single buffering is enough */
+			ep = find_ep (gadget, "ep3-bulk");
+			if (ep && ep_matches (gadget, ep, desc))
+				return ep;
+		} else if (USB_ENDPOINT_XFER_BULK == type
+				&& (USB_DIR_IN & desc->bEndpointAddress)) {
+			/* DMA may be available */
+			ep = find_ep (gadget, "ep2-bulk");
+			if (ep && ep_matches (gadget, ep, desc))
+				return ep;
+		}
+
+	} else if (gadget_is_sh (gadget) && USB_ENDPOINT_XFER_INT == type) {
+		/* single buffering is enough; maybe 8 byte fifo is too */
+		ep = find_ep (gadget, "ep3in-bulk");
+		if (ep && ep_matches (gadget, ep, desc))
+			return ep;
+
+	} else if (gadget_is_mq11xx (gadget) && USB_ENDPOINT_XFER_INT == type) {
+		ep = find_ep (gadget, "ep1-bulk");
+		if (ep && ep_matches (gadget, ep, desc))
+			return ep;
+	}
+
+	/* Second, look at endpoints until an unclaimed one looks usable */ 
+	list_for_each_entry (ep, &gadget->ep_list, ep_list) {
+		if (ep_matches (gadget, ep, desc))
+			return ep;
+	}
+
+	/* Fail */
+	return 0;
+}
+
+/**
+ * usb_ep_autoconfig_reset - reset endpoint autoconfig state
+ * @gadget: device for which autoconfig state will be reset
+ *
+ * Use this for devices where one configuration may need to assign
+ * endpoint resources very differently from the next one.  It clears
+ * state such as ep->driver_data and the record of assigned endpoints
+ * used by usb_ep_autoconfig().
+ */
+void __init usb_ep_autoconfig_reset (struct usb_gadget *gadget)
+{
+	struct usb_ep	*ep;
+
+	list_for_each_entry (ep, &gadget->ep_list, ep_list) {
+		ep->driver_data = 0;
+	}
+#ifdef	MANY_ENDPOINTS
+	in_epnum = 0;
+#endif
+	epnum = 0;
+}
+
--- diff/drivers/usb/gadget/ndis.h	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/usb/gadget/ndis.h	2004-04-21 10:45:35.048375336 +0100
@@ -0,0 +1,187 @@
+/*
+ * ndis.h 
+ * 
+ * ntddndis.h modified by Benedikt Spranger <b.spranger@pengutronix.de>
+ * 
+ * Thanks to the cygwin development team, 
+ * espacially to Casper S. Hornstrup <chorns@users.sourceforge.net>
+ * 
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
+#ifndef _LINUX_NDIS_H
+#define _LINUX_NDIS_H
+
+
+#define NDIS_STATUS_MULTICAST_FULL	  0xC0010009
+#define NDIS_STATUS_MULTICAST_EXISTS      0xC001000A
+#define NDIS_STATUS_MULTICAST_NOT_FOUND   0xC001000B
+
+/* NDIS_PNP_CAPABILITIES.Flags constants */
+#define NDIS_DEVICE_WAKE_UP_ENABLE                0x00000001
+#define NDIS_DEVICE_WAKE_ON_PATTERN_MATCH_ENABLE  0x00000002
+#define NDIS_DEVICE_WAKE_ON_MAGIC_PACKET_ENABLE   0x00000004
+
+/* Required Object IDs (OIDs) */
+#define OID_GEN_SUPPORTED_LIST            0x00010101
+#define OID_GEN_HARDWARE_STATUS           0x00010102
+#define OID_GEN_MEDIA_SUPPORTED           0x00010103
+#define OID_GEN_MEDIA_IN_USE              0x00010104
+#define OID_GEN_MAXIMUM_LOOKAHEAD         0x00010105
+#define OID_GEN_MAXIMUM_FRAME_SIZE        0x00010106
+#define OID_GEN_LINK_SPEED                0x00010107
+#define OID_GEN_TRANSMIT_BUFFER_SPACE     0x00010108
+#define OID_GEN_RECEIVE_BUFFER_SPACE      0x00010109
+#define OID_GEN_TRANSMIT_BLOCK_SIZE       0x0001010A
+#define OID_GEN_RECEIVE_BLOCK_SIZE        0x0001010B
+#define OID_GEN_VENDOR_ID                 0x0001010C
+#define OID_GEN_VENDOR_DESCRIPTION        0x0001010D
+#define OID_GEN_CURRENT_PACKET_FILTER     0x0001010E
+#define OID_GEN_CURRENT_LOOKAHEAD         0x0001010F
+#define OID_GEN_DRIVER_VERSION            0x00010110
+#define OID_GEN_MAXIMUM_TOTAL_SIZE        0x00010111
+#define OID_GEN_PROTOCOL_OPTIONS          0x00010112
+#define OID_GEN_MAC_OPTIONS               0x00010113
+#define OID_GEN_MEDIA_CONNECT_STATUS      0x00010114
+#define OID_GEN_MAXIMUM_SEND_PACKETS      0x00010115
+#define OID_GEN_VENDOR_DRIVER_VERSION     0x00010116
+#define OID_GEN_SUPPORTED_GUIDS           0x00010117
+#define OID_GEN_NETWORK_LAYER_ADDRESSES   0x00010118
+#define OID_GEN_TRANSPORT_HEADER_OFFSET   0x00010119
+#define OID_GEN_MACHINE_NAME              0x0001021A
+#define OID_GEN_RNDIS_CONFIG_PARAMETER    0x0001021B
+#define OID_GEN_VLAN_ID                   0x0001021C
+
+/* Optional OIDs */
+#define OID_GEN_MEDIA_CAPABILITIES        0x00010201
+#define OID_GEN_PHYSICAL_MEDIUM           0x00010202
+
+/* Required statistics OIDs */
+#define OID_GEN_XMIT_OK                   0x00020101
+#define OID_GEN_RCV_OK                    0x00020102
+#define OID_GEN_XMIT_ERROR                0x00020103
+#define OID_GEN_RCV_ERROR                 0x00020104
+#define OID_GEN_RCV_NO_BUFFER             0x00020105
+
+/* Optional statistics OIDs */
+#define OID_GEN_DIRECTED_BYTES_XMIT       0x00020201
+#define OID_GEN_DIRECTED_FRAMES_XMIT      0x00020202
+#define OID_GEN_MULTICAST_BYTES_XMIT      0x00020203
+#define OID_GEN_MULTICAST_FRAMES_XMIT     0x00020204
+#define OID_GEN_BROADCAST_BYTES_XMIT      0x00020205
+#define OID_GEN_BROADCAST_FRAMES_XMIT     0x00020206
+#define OID_GEN_DIRECTED_BYTES_RCV        0x00020207
+#define OID_GEN_DIRECTED_FRAMES_RCV       0x00020208
+#define OID_GEN_MULTICAST_BYTES_RCV       0x00020209
+#define OID_GEN_MULTICAST_FRAMES_RCV      0x0002020A
+#define OID_GEN_BROADCAST_BYTES_RCV       0x0002020B
+#define OID_GEN_BROADCAST_FRAMES_RCV      0x0002020C
+#define OID_GEN_RCV_CRC_ERROR             0x0002020D
+#define OID_GEN_TRANSMIT_QUEUE_LENGTH     0x0002020E
+#define OID_GEN_GET_TIME_CAPS             0x0002020F
+#define OID_GEN_GET_NETCARD_TIME          0x00020210
+#define OID_GEN_NETCARD_LOAD              0x00020211
+#define OID_GEN_DEVICE_PROFILE            0x00020212
+#define OID_GEN_INIT_TIME_MS              0x00020213
+#define OID_GEN_RESET_COUNTS              0x00020214
+#define OID_GEN_MEDIA_SENSE_COUNTS        0x00020215
+#define OID_GEN_FRIENDLY_NAME             0x00020216
+#define OID_GEN_MINIPORT_INFO             0x00020217
+#define OID_GEN_RESET_VERIFY_PARAMETERS   0x00020218
+
+/* IEEE 802.3 (Ethernet) OIDs */
+#define NDIS_802_3_MAC_OPTION_PRIORITY    0x00000001
+
+#define OID_802_3_PERMANENT_ADDRESS       0x01010101
+#define OID_802_3_CURRENT_ADDRESS         0x01010102
+#define OID_802_3_MULTICAST_LIST          0x01010103
+#define OID_802_3_MAXIMUM_LIST_SIZE       0x01010104
+#define OID_802_3_MAC_OPTIONS             0x01010105
+#define OID_802_3_RCV_ERROR_ALIGNMENT     0x01020101
+#define OID_802_3_XMIT_ONE_COLLISION      0x01020102
+#define OID_802_3_XMIT_MORE_COLLISIONS    0x01020103
+#define OID_802_3_XMIT_DEFERRED           0x01020201
+#define OID_802_3_XMIT_MAX_COLLISIONS     0x01020202
+#define OID_802_3_RCV_OVERRUN             0x01020203
+#define OID_802_3_XMIT_UNDERRUN           0x01020204
+#define OID_802_3_XMIT_HEARTBEAT_FAILURE  0x01020205
+#define OID_802_3_XMIT_TIMES_CRS_LOST     0x01020206
+#define OID_802_3_XMIT_LATE_COLLISIONS    0x01020207
+
+/* OID_GEN_MINIPORT_INFO constants */
+#define NDIS_MINIPORT_BUS_MASTER                      0x00000001
+#define NDIS_MINIPORT_WDM_DRIVER                      0x00000002
+#define NDIS_MINIPORT_SG_LIST                         0x00000004
+#define NDIS_MINIPORT_SUPPORTS_MEDIA_QUERY            0x00000008
+#define NDIS_MINIPORT_INDICATES_PACKETS               0x00000010
+#define NDIS_MINIPORT_IGNORE_PACKET_QUEUE             0x00000020
+#define NDIS_MINIPORT_IGNORE_REQUEST_QUEUE            0x00000040
+#define NDIS_MINIPORT_IGNORE_TOKEN_RING_ERRORS        0x00000080
+#define NDIS_MINIPORT_INTERMEDIATE_DRIVER             0x00000100
+#define NDIS_MINIPORT_IS_NDIS_5                       0x00000200
+#define NDIS_MINIPORT_IS_CO                           0x00000400
+#define NDIS_MINIPORT_DESERIALIZE                     0x00000800
+#define NDIS_MINIPORT_REQUIRES_MEDIA_POLLING          0x00001000
+#define NDIS_MINIPORT_SUPPORTS_MEDIA_SENSE            0x00002000
+#define NDIS_MINIPORT_NETBOOT_CARD                    0x00004000
+#define NDIS_MINIPORT_PM_SUPPORTED                    0x00008000
+#define NDIS_MINIPORT_SUPPORTS_MAC_ADDRESS_OVERWRITE  0x00010000
+#define NDIS_MINIPORT_USES_SAFE_BUFFER_APIS           0x00020000
+#define NDIS_MINIPORT_HIDDEN                          0x00040000
+#define NDIS_MINIPORT_SWENUM                          0x00080000
+#define NDIS_MINIPORT_SURPRISE_REMOVE_OK              0x00100000
+#define NDIS_MINIPORT_NO_HALT_ON_SUSPEND              0x00200000
+#define NDIS_MINIPORT_HARDWARE_DEVICE                 0x00400000
+#define NDIS_MINIPORT_SUPPORTS_CANCEL_SEND_PACKETS    0x00800000
+#define NDIS_MINIPORT_64BITS_DMA                      0x01000000
+
+#define NDIS_MEDIUM_802_3		0x00000000
+#define NDIS_MEDIUM_802_5		0x00000001
+#define NDIS_MEDIUM_FDDI		0x00000002
+#define NDIS_MEDIUM_WAN			0x00000003
+#define NDIS_MEDIUM_LOCAL_TALK		0x00000004
+#define NDIS_MEDIUM_DIX			0x00000005
+#define NDIS_MEDIUM_ARCENT_RAW		0x00000006
+#define NDIS_MEDIUM_ARCENT_878_2	0x00000007
+#define NDIS_MEDIUM_ATM			0x00000008
+#define NDIS_MEDIUM_WIRELESS_LAN	0x00000009
+#define NDIS_MEDIUM_IRDA		0x0000000A
+#define NDIS_MEDIUM_BPC			0x0000000B
+#define NDIS_MEDIUM_CO_WAN		0x0000000C
+#define NDIS_MEDIUM_1394		0x0000000D
+
+#define NDIS_PACKET_TYPE_DIRECTED	0x00000001
+#define NDIS_PACKET_TYPE_MULTICAST	0x00000002
+#define NDIS_PACKET_TYPE_ALL_MULTICAST	0x00000004
+#define NDIS_PACKET_TYPE_BROADCAST	0x00000008
+#define NDIS_PACKET_TYPE_SOURCE_ROUTING	0x00000010
+#define NDIS_PACKET_TYPE_PROMISCUOUS	0x00000020
+#define NDIS_PACKET_TYPE_SMT		0x00000040
+#define NDIS_PACKET_TYPE_ALL_LOCAL	0x00000080
+#define NDIS_PACKET_TYPE_GROUP		0x00000100
+#define NDIS_PACKET_TYPE_ALL_FUNCTIONAL	0x00000200
+#define NDIS_PACKET_TYPE_FUNCTIONAL	0x00000400
+#define NDIS_PACKET_TYPE_MAC_FRAME	0x00000800
+
+#define NDIS_MEDIA_STATE_CONNECTED	0x00000000
+#define NDIS_MEDIA_STATE_DISCONNECTED	0x00000001
+
+#define NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA     0x00000001
+#define NDIS_MAC_OPTION_RECEIVE_SERIALIZED      0x00000002
+#define NDIS_MAC_OPTION_TRANSFERS_NOT_PEND      0x00000004
+#define NDIS_MAC_OPTION_NO_LOOPBACK             0x00000008
+#define NDIS_MAC_OPTION_FULL_DUPLEX             0x00000010
+#define NDIS_MAC_OPTION_EOTX_INDICATION         0x00000020
+#define NDIS_MAC_OPTION_8021P_PRIORITY          0x00000040
+#define NDIS_MAC_OPTION_RESERVED                0x80000000
+
+#endif /* _LINUX_NDIS_H */
--- diff/drivers/usb/gadget/rndis.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/usb/gadget/rndis.c	2004-04-21 10:45:35.052374728 +0100
@@ -0,0 +1,1368 @@
+/* 
+ * RNDIS MSG parser
+ * 
+ * Version:     $Id: rndis.c,v 1.19 2004/03/25 21:33:46 robert Exp $
+ * 
+ * Authors:	Benedikt Spranger, Pengutronix
+ * 		Robert Schwebel, Pengutronix
+ * 
+ *              This program is free software; you can redistribute it and/or
+ *              modify it under the terms of the GNU General Public License
+ *              version 2, as published by the Free Software Foundation. 
+ * 
+ *		This software was originally developed in conformance with
+ *		Microsoft's Remote NDIS Specification License Agreement.
+ *              
+ * 03/12/2004 Kai-Uwe Bloem <linux-development@auerswald.de>
+ *		Fixed message length bug in init_response
+ * 
+ * 03/25/2004 Kai-Uwe Bloem <linux-development@auerswald.de>
+ * 		Fixed rndis_rm_hdr length bug.
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/version.h>
+#include <linux/init.h>
+#include <linux/list.h>
+#include <linux/proc_fs.h>
+#include <linux/netdevice.h>
+
+#include <asm/io.h>
+#include <asm/byteorder.h>
+#include <asm/system.h>
+
+#include "rndis.h"
+
+
+#if 0
+#define DEBUG if (rndis_debug) printk 
+static int rndis_debug = 0;
+
+MODULE_PARM (rndis_debug, "i");
+MODULE_PARM_DESC (rndis_debug, "enable debugging");
+
+#else
+#define DEBUG(str,args...) do{}while(0)
+#endif
+
+#define RNDIS_MAX_CONFIGS	1
+
+static struct proc_dir_entry *rndis_connect_dir;
+static struct proc_dir_entry *rndis_connect_state [RNDIS_MAX_CONFIGS];
+
+static rndis_params rndis_per_dev_params [RNDIS_MAX_CONFIGS];
+
+/* Driver Version */
+static const u32 rndis_driver_version = __constant_cpu_to_le32 (1);
+
+/* Function Prototypes */
+static int rndis_init_response (int configNr, rndis_init_msg_type *buf);
+static int rndis_query_response (int configNr, rndis_query_msg_type *buf);
+static int rndis_set_response (int configNr, rndis_set_msg_type *buf);
+static int rndis_reset_response (int configNr, rndis_reset_msg_type *buf);
+static int rndis_keepalive_response (int configNr, 
+				     rndis_keepalive_msg_type *buf);
+
+static rndis_resp_t *rndis_add_response (int configNr, u32 length);
+
+/* helper functions */
+static u32 devFlags2currentFilter (struct net_device *dev)
+{
+	u32 filter = 0;
+	
+	if (!dev) return 0;
+	
+	if (dev->flags & IFF_MULTICAST) 
+	    filter |= NDIS_PACKET_TYPE_MULTICAST;
+	if (dev->flags & IFF_BROADCAST)
+	    filter |= NDIS_PACKET_TYPE_BROADCAST;
+	if (dev->flags & IFF_ALLMULTI)
+	    filter |= NDIS_PACKET_TYPE_ALL_MULTICAST;
+	if (dev->flags & IFF_PROMISC)
+	    filter |= NDIS_PACKET_TYPE_PROMISCUOUS;
+	
+	return filter;
+}
+
+static void currentFilter2devFlags (u32 currentFilter, struct net_device *dev)
+{
+	if (!dev) return;
+	
+	if (currentFilter & NDIS_PACKET_TYPE_MULTICAST)
+	    dev->flags |= IFF_MULTICAST;
+	if (currentFilter & NDIS_PACKET_TYPE_BROADCAST)
+	    dev->flags |= IFF_BROADCAST;
+	if (currentFilter & NDIS_PACKET_TYPE_ALL_MULTICAST)
+	    dev->flags |= IFF_ALLMULTI;
+	if (currentFilter & NDIS_PACKET_TYPE_PROMISCUOUS)
+	    dev->flags |= IFF_PROMISC;
+}
+
+
+/* NDIS Functions */
+static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
+{
+	int 			retval = -ENOTSUPP;
+	u32 			length = 0;
+	rndis_query_cmplt_type	*resp;
+
+	if (!r) return -ENOMEM;
+	resp = (rndis_query_cmplt_type *) r->buf;
+
+	if (!resp) return -ENOMEM;
+	
+	if (!resp) return -ENOMEM;
+	
+	switch (OID) {
+	/* mandatory */
+	case OID_GEN_SUPPORTED_LIST:
+		DEBUG ("%s: OID_GEN_SUPPORTED_LIST\n", __FUNCTION__);
+		length = sizeof (oid_supported_list);
+		memcpy ((u8 *) resp + 24, oid_supported_list, length); 
+		retval = 0;
+		break;
+		
+	/* mandatory */
+	case OID_GEN_HARDWARE_STATUS:
+		DEBUG("%s: OID_GEN_HARDWARE_STATUS\n", __FUNCTION__);
+		length = 4;
+		/* Bogus question! 
+		 * Hardware must be ready to recieve high level protocols.
+		 * BTW: 
+		 * reddite ergo quae sunt Caesaris Caesari
+		 * et quae sunt Dei Deo!
+		 */
+		*((u32 *) resp + 6) = 0;
+		retval = 0;
+		break;
+		
+	/* mandatory */
+	case OID_GEN_MEDIA_SUPPORTED:
+		DEBUG("%s: OID_GEN_MEDIA_SUPPORTED\n", __FUNCTION__);
+		length = 4;
+		*((u32 *) resp + 6) = rndis_per_dev_params [configNr].medium;
+		retval = 0;
+		break;
+		
+	/* mandatory */
+	case OID_GEN_MEDIA_IN_USE:
+		DEBUG("%s: OID_GEN_MEDIA_IN_USE\n", __FUNCTION__);
+		length = 4;
+		/* one medium, one transport... (maybe you do it better) */
+		*((u32 *) resp + 6) = rndis_per_dev_params [configNr].medium;
+		retval = 0;
+		break;
+		
+	case OID_GEN_MAXIMUM_LOOKAHEAD:
+		DEBUG("%s: OID_GEN_MAXIMUM_LOOKAHEAD\n", __FUNCTION__);
+		break;
+		
+	/* mandatory */
+	case OID_GEN_MAXIMUM_FRAME_SIZE:
+		DEBUG("%s: OID_GEN_MAXIMUM_FRAME_SIZE\n", __FUNCTION__);
+		if (rndis_per_dev_params [configNr].dev) {
+			length = 4;
+			*((u32 *) resp + 6) = rndis_per_dev_params [configNr]
+						.dev->mtu;
+			retval = 0;
+		} else {
+			*((u32 *) resp + 6) = 0;
+			retval = 0;
+		}
+		break;
+		
+	/* mandatory */
+	case OID_GEN_LINK_SPEED:
+		DEBUG("%s: OID_GEN_LINK_SPEED\n", __FUNCTION__);
+		length = 4;
+		if (rndis_per_dev_params [configNr].media_state)
+		    *((u32 *) resp + 6) = 0;
+		else
+		    *((u32 *) resp + 6) = rndis_per_dev_params [configNr].speed;
+		retval = 0;
+		break;
+		
+	case OID_GEN_TRANSMIT_BUFFER_SPACE:
+		DEBUG("%s: OID_GEN_TRANSMIT_BUFFER_SPACE\n", __FUNCTION__);
+		length = 4;
+		*((u32 *) resp + 6) = 0;
+		retval = 0;
+		break;
+		
+	case OID_GEN_RECEIVE_BUFFER_SPACE:
+		DEBUG("%s: OID_GEN_RECEIVE_BUFFER_SPACE\n", __FUNCTION__);
+		break;
+		
+	/* mandatory */
+	case OID_GEN_TRANSMIT_BLOCK_SIZE:
+		DEBUG("%s: OID_GEN_TRANSMIT_BLOCK_SIZE\n", __FUNCTION__);
+		if (rndis_per_dev_params [configNr].dev) {
+			length = 4;
+			*((u32 *) resp + 6) = rndis_per_dev_params [configNr]
+						.dev->mtu;
+			retval = 0;
+		}
+		break;
+		
+	/* mandatory */
+	case OID_GEN_RECEIVE_BLOCK_SIZE:
+		DEBUG("%s: OID_GEN_RECEIVE_BLOCK_SIZE\n", __FUNCTION__);
+		if (rndis_per_dev_params [configNr].dev) {
+			length = 4;
+			*((u32 *) resp + 6) = rndis_per_dev_params [configNr]
+						.dev->mtu;
+			retval = 0;
+		}
+		break;
+		
+	/* mandatory */
+	case OID_GEN_VENDOR_ID:
+		DEBUG("%s: OID_GEN_VENDOR_ID\n", __FUNCTION__);
+		length = 4;
+		*((u32 *) resp + 6) = rndis_per_dev_params [configNr].vendorID;
+		retval = 0;
+		break;
+		
+	/* mandatory */
+	case OID_GEN_VENDOR_DESCRIPTION:
+		DEBUG("%s: OID_GEN_VENDOR_DESCRIPTION\n", __FUNCTION__);
+		length = strlen (rndis_per_dev_params [configNr].vendorDescr);
+		memcpy ((u8 *) resp + 24, 
+			rndis_per_dev_params [configNr].vendorDescr, length);
+		retval = 0;
+		break;
+		
+	/* mandatory */
+	case OID_GEN_CURRENT_PACKET_FILTER:
+		DEBUG("%s: OID_GEN_CURRENT_PACKET_FILTER\n", __FUNCTION__);
+		length = 4;
+		*((u32 *) resp + 6) = devFlags2currentFilter (
+					rndis_per_dev_params [configNr].dev);
+		retval = 0;
+		break;
+		
+	case OID_GEN_CURRENT_LOOKAHEAD:
+		DEBUG("%s: OID_GEN_CURRENT_LOOKAHEAD\n", __FUNCTION__);
+		break;
+		
+	case OID_GEN_DRIVER_VERSION:
+		DEBUG("%s: OID_GEN_DRIVER_VERSION\n", __FUNCTION__);
+		break;
+		
+	/* mandatory */
+	case OID_GEN_MAXIMUM_TOTAL_SIZE:
+		DEBUG("%s: OID_GEN_MAXIMUM_TOTAL_SIZE\n", __FUNCTION__);
+		length = 4;
+		*((u32 *) resp + 6) = RNDIS_MAX_TOTAL_SIZE;
+		retval = 0;
+		break;
+		
+	case OID_GEN_PROTOCOL_OPTIONS:
+		DEBUG("%s: OID_GEN_PROTOCOL_OPTIONS\n", __FUNCTION__);
+		break;
+		
+	case OID_GEN_MAC_OPTIONS:
+		DEBUG("%s: OID_GEN_MAC_OPTIONS\n", __FUNCTION__);
+		length = 4;
+		*((u32 *) resp + 6) = NDIS_MAC_OPTION_RECEIVE_SERIALIZED | 
+		    NDIS_MAC_OPTION_FULL_DUPLEX;
+		retval = 0;
+		break;
+		
+	/* mandatory */
+	case OID_GEN_MEDIA_CONNECT_STATUS:
+		DEBUG("%s: OID_GEN_MEDIA_CONNECT_STATUS\n", __FUNCTION__);
+		length = 4;
+		*((u32 *) resp + 6) = rndis_per_dev_params [configNr]
+						.media_state;
+		retval = 0;
+		break;
+		
+	case OID_GEN_MAXIMUM_SEND_PACKETS:
+		DEBUG("%s: OID_GEN_MAXIMUM_SEND_PACKETS\n", __FUNCTION__);
+		break;
+		
+	/* mandatory */
+	case OID_GEN_VENDOR_DRIVER_VERSION:
+		DEBUG("%s: OID_GEN_VENDOR_DRIVER_VERSION\n", __FUNCTION__);
+		length = 4;
+		*((u32 *) resp + 6) = rndis_driver_version;
+		retval = 0;
+		break;
+		
+	case OID_GEN_SUPPORTED_GUIDS:
+		DEBUG("%s: OID_GEN_SUPPORTED_GUIDS\n", __FUNCTION__);
+		break;
+		
+	case OID_GEN_NETWORK_LAYER_ADDRESSES:
+		DEBUG("%s: OID_GEN_NETWORK_LAYER_ADDRESSES\n", __FUNCTION__);
+		break;
+		
+	case OID_GEN_TRANSPORT_HEADER_OFFSET:
+		DEBUG("%s: OID_GEN_TRANSPORT_HEADER_OFFSET\n", __FUNCTION__);
+		break;
+		
+	case OID_GEN_MACHINE_NAME:
+		DEBUG("%s: OID_GEN_MACHINE_NAME\n", __FUNCTION__);
+		break;
+		
+	case OID_GEN_RNDIS_CONFIG_PARAMETER:
+		DEBUG("%s: OID_GEN_RNDIS_CONFIG_PARAMETER\n", __FUNCTION__);
+		length = 4;
+		*((u32 *) resp + 6) = 0;
+		retval = 0;
+		break;
+		
+	case OID_GEN_VLAN_ID:
+		DEBUG("%s: OID_GEN_VLAN_ID\n", __FUNCTION__);
+		break;
+		
+	case OID_GEN_MEDIA_CAPABILITIES:
+		DEBUG("%s: OID_GEN_MEDIA_CAPABILITIES\n", __FUNCTION__);
+		break;
+		
+	case OID_GEN_PHYSICAL_MEDIUM:
+		DEBUG("%s: OID_GEN_PHYSICAL_MEDIUM\n", __FUNCTION__);
+		length = 4;
+		*((u32 *) resp + 6) = 0;
+		retval = 0;
+		break;
+		
+	/* mandatory */
+	case OID_GEN_XMIT_OK:
+		DEBUG("%s: OID_GEN_XMIT_OK\n", __FUNCTION__);
+		if (rndis_per_dev_params [configNr].stats) {
+			length = 4;
+			*((u32 *) resp + 6) = rndis_per_dev_params [configNr]
+					.stats->tx_packets - 
+			    rndis_per_dev_params [configNr].stats->tx_errors -
+			    rndis_per_dev_params [configNr].stats->tx_dropped;
+			retval = 0;
+		} else {
+			*((u32 *) resp + 6) = 0;
+			retval = 0;
+		}
+		break;
+		
+	/* mandatory */
+	case OID_GEN_RCV_OK:
+		DEBUG("%s: OID_GEN_RCV_OK\n", __FUNCTION__);
+		if (rndis_per_dev_params [configNr].stats) {
+			length = 4;
+			*((u32 *) resp + 6) = rndis_per_dev_params [configNr].
+					stats->rx_packets - 
+			    rndis_per_dev_params [configNr].stats->rx_errors -
+			    rndis_per_dev_params [configNr].stats->rx_dropped;
+			retval = 0;
+		} else {
+			*((u32 *) resp + 6) = 0;
+			retval = 0;
+		}
+		break;
+		
+	/* mandatory */
+	case OID_GEN_XMIT_ERROR:
+		DEBUG("%s: OID_GEN_XMIT_ERROR\n", __FUNCTION__);
+		if (rndis_per_dev_params [configNr].stats) {
+			length = 4;
+			*((u32 *) resp + 6) = rndis_per_dev_params [configNr].
+					stats->tx_errors;
+			retval = 0;
+		} else {
+			*((u32 *) resp + 6) = 0;
+			retval = 0;
+		}
+		break;
+		
+	/* mandatory */
+	case OID_GEN_RCV_ERROR:
+		DEBUG("%s: OID_GEN_RCV_ERROR\n", __FUNCTION__);
+		if (rndis_per_dev_params [configNr].stats) {
+			*((u32 *) resp + 6) = rndis_per_dev_params [configNr].
+					stats->rx_errors;
+			retval = 0;
+		} else {
+			*((u32 *) resp + 6) = 0;
+			retval = 0;
+		}
+		break;
+		
+	/* mandatory */
+	case OID_GEN_RCV_NO_BUFFER:
+		DEBUG("%s: OID_GEN_RCV_NO_BUFFER\n", __FUNCTION__);
+		if (rndis_per_dev_params [configNr].stats) {
+			*((u32 *) resp + 6) = rndis_per_dev_params [configNr].
+					stats->rx_dropped;
+			retval = 0;
+		} else {
+			*((u32 *) resp + 6) = 0;
+			retval = 0;
+		}
+		break;
+		
+	case OID_GEN_DIRECTED_BYTES_XMIT:
+		DEBUG("%s: OID_GEN_DIRECTED_BYTES_XMIT\n", __FUNCTION__);
+		/* 
+		 * Aunt Tilly's size of shoes
+		 * minus antarctica count of penguins
+		 * divided by weight of Alpha Centauri
+		 */
+		if (rndis_per_dev_params [configNr].stats) {
+			length = 4;
+			*((u32 *) resp + 6) = (rndis_per_dev_params [configNr].
+					stats->tx_packets - 
+			    rndis_per_dev_params [configNr].stats->tx_errors -
+			    rndis_per_dev_params [configNr].stats->tx_dropped)
+					*123;
+			retval = 0;
+		} else {
+			*((u32 *) resp + 6) = 0;
+			retval = 0;
+		}
+		break;
+		
+	case OID_GEN_DIRECTED_FRAMES_XMIT:
+		DEBUG("%s: OID_GEN_DIRECTED_FRAMES_XMIT\n", __FUNCTION__);
+		/* dito */
+		if (rndis_per_dev_params [configNr].stats) {
+			length = 4;
+			*((u32 *) resp + 6) = (rndis_per_dev_params [configNr].
+					stats->tx_packets - 
+			    rndis_per_dev_params [configNr].stats->tx_errors -
+			    rndis_per_dev_params [configNr].stats->tx_dropped)
+			    		/123;
+			retval = 0;
+		} else {
+			*((u32 *) resp + 6) = 0;
+			retval = 0;
+		}
+		break;
+		
+	case OID_GEN_MULTICAST_BYTES_XMIT:
+		DEBUG("%s: OID_GEN_MULTICAST_BYTES_XMIT\n", __FUNCTION__);
+		if (rndis_per_dev_params [configNr].stats) {
+			*((u32 *) resp + 6) = rndis_per_dev_params [configNr].
+					stats->multicast*1234;
+			retval = 0;
+		} else {
+			*((u32 *) resp + 6) = 0;
+			retval = 0;
+		}
+		break;
+		
+	case OID_GEN_MULTICAST_FRAMES_XMIT:
+		DEBUG("%s: OID_GEN_MULTICAST_FRAMES_XMIT\n", __FUNCTION__);
+		if (rndis_per_dev_params [configNr].stats) {
+			*((u32 *) resp + 6) = rndis_per_dev_params [configNr].
+					stats->multicast;
+			retval = 0;
+		} else {
+			*((u32 *) resp + 6) = 0;
+			retval = 0;
+		}
+		break;
+		
+	case OID_GEN_BROADCAST_BYTES_XMIT:
+		DEBUG("%s: OID_GEN_BROADCAST_BYTES_XMIT\n", __FUNCTION__);
+		if (rndis_per_dev_params [configNr].stats) {
+			*((u32 *) resp + 6) = rndis_per_dev_params [configNr].
+					stats->tx_packets/42*255;
+			retval = 0;
+		} else {
+			*((u32 *) resp + 6) = 0;
+			retval = 0;
+		}
+		break;
+		
+	case OID_GEN_BROADCAST_FRAMES_XMIT:
+		DEBUG("%s: OID_GEN_BROADCAST_FRAMES_XMIT\n", __FUNCTION__);
+		if (rndis_per_dev_params [configNr].stats) {
+			*((u32 *) resp + 6) = rndis_per_dev_params [configNr].
+					stats->tx_packets/42;
+			retval = 0;
+		} else {
+			*((u32 *) resp + 6) = 0;
+			retval = 0;
+		}
+		break;
+		
+	case OID_GEN_DIRECTED_BYTES_RCV:
+		DEBUG("%s: OID_GEN_DIRECTED_BYTES_RCV\n", __FUNCTION__);
+		*((u32 *) resp + 6) = 0;
+		retval = 0;
+		break;
+		
+	case OID_GEN_DIRECTED_FRAMES_RCV:
+		DEBUG("%s: OID_GEN_DIRECTED_FRAMES_RCV\n", __FUNCTION__);
+		*((u32 *) resp + 6) = 0;
+		retval = 0;
+		break;
+		
+	case OID_GEN_MULTICAST_BYTES_RCV:
+		DEBUG("%s: OID_GEN_MULTICAST_BYTES_RCV\n", __FUNCTION__);
+		if (rndis_per_dev_params [configNr].stats) {
+			*((u32 *) resp + 6) = rndis_per_dev_params [configNr].
+					stats->multicast*1111;
+			retval = 0;
+		} else {
+			*((u32 *) resp + 6) = 0;
+			retval = 0;
+		}
+		break;
+		
+	case OID_GEN_MULTICAST_FRAMES_RCV:
+		DEBUG("%s: OID_GEN_MULTICAST_FRAMES_RCV\n", __FUNCTION__);
+		if (rndis_per_dev_params [configNr].stats) {
+			*((u32 *) resp + 6) = rndis_per_dev_params [configNr].
+					stats->multicast;
+			retval = 0;
+		} else {
+			*((u32 *) resp + 6) = 0;
+			retval = 0;
+		}
+		break;
+		
+	case OID_GEN_BROADCAST_BYTES_RCV:
+		DEBUG("%s: OID_GEN_BROADCAST_BYTES_RCV\n", __FUNCTION__);
+		if (rndis_per_dev_params [configNr].stats) {
+			*((u32 *) resp + 6) = rndis_per_dev_params [configNr].
+					stats->rx_packets/42*255;
+			retval = 0;
+		} else {
+			*((u32 *) resp + 6) = 0;
+			retval = 0;
+		}
+		break;
+		
+	case OID_GEN_BROADCAST_FRAMES_RCV:
+		DEBUG("%s: OID_GEN_BROADCAST_FRAMES_RCV\n", __FUNCTION__);
+		if (rndis_per_dev_params [configNr].stats) {
+			*((u32 *) resp + 6) = rndis_per_dev_params [configNr].
+					stats->rx_packets/42;
+			retval = 0;
+		} else {
+			*((u32 *) resp + 6) = 0;
+			retval = 0;
+		}
+		break;
+		
+	case OID_GEN_RCV_CRC_ERROR:
+		DEBUG("%s: OID_GEN_RCV_CRC_ERROR\n", __FUNCTION__);
+		if (rndis_per_dev_params [configNr].stats) {
+			*((u32 *) resp + 6) = rndis_per_dev_params [configNr].
+					stats->rx_crc_errors;
+			retval = 0;
+		} else {
+			*((u32 *) resp + 6) = 0;
+			retval = 0;
+		}
+		break;
+		
+	case OID_GEN_TRANSMIT_QUEUE_LENGTH:
+		DEBUG("%s: OID_GEN_TRANSMIT_QUEUE_LENGTH\n", __FUNCTION__);
+		*((u32 *) resp + 6) = 0;
+		retval = 0;
+		break;
+		
+	case OID_GEN_GET_TIME_CAPS:
+		DEBUG("%s: OID_GEN_GET_TIME_CAPS\n", __FUNCTION__);
+		break;
+		
+	case OID_GEN_GET_NETCARD_TIME:
+		DEBUG("%s: OID_GEN_GET_NETCARD_TIME\n", __FUNCTION__);
+		break;
+		
+	case OID_GEN_NETCARD_LOAD:
+		DEBUG("%s: OID_GEN_NETCARD_LOAD\n", __FUNCTION__);
+		break;
+		
+	case OID_GEN_DEVICE_PROFILE:
+		DEBUG("%s: OID_GEN_DEVICE_PROFILE\n", __FUNCTION__);
+		break;
+		
+	case OID_GEN_INIT_TIME_MS:
+		DEBUG("%s: OID_GEN_INIT_TIME_MS\n", __FUNCTION__);
+		break;
+		
+	case OID_GEN_RESET_COUNTS:
+		DEBUG("%s: OID_GEN_RESET_COUNTS\n", __FUNCTION__);
+		break;
+		
+	case OID_GEN_MEDIA_SENSE_COUNTS:
+		DEBUG("%s: OID_GEN_MEDIA_SENSE_COUNTS\n", __FUNCTION__);
+		break;
+		
+	case OID_GEN_FRIENDLY_NAME:
+		DEBUG("%s: OID_GEN_FRIENDLY_NAME\n", __FUNCTION__);
+		break;
+		
+	case OID_GEN_MINIPORT_INFO:
+		DEBUG("%s: OID_GEN_MINIPORT_INFO\n", __FUNCTION__);
+		break;
+		
+	case OID_GEN_RESET_VERIFY_PARAMETERS:
+		DEBUG("%s: OID_GEN_RESET_VERIFY_PARAMETERS\n", __FUNCTION__);
+		break;
+		
+	/* mandatory */
+	case OID_802_3_PERMANENT_ADDRESS:
+		DEBUG("%s: OID_802_3_PERMANENT_ADDRESS\n", __FUNCTION__);
+		if (rndis_per_dev_params [configNr].dev) {
+			length = 6;
+			memcpy ((u8 *) resp + 24,
+				rndis_per_dev_params [configNr].dev->dev_addr,
+				length);
+			/* 
+			 * we need a MAC address and hope that 
+			 * (our MAC + 1) is not in use
+			 */
+			*((u8 *) resp + 29) += 1;
+			retval = 0;
+		} else {
+			*((u32 *) resp + 6) = 0;
+			retval = 0;
+		}
+		break;
+		
+	/* mandatory */
+	case OID_802_3_CURRENT_ADDRESS:
+		DEBUG("%s: OID_802_3_CURRENT_ADDRESS\n", __FUNCTION__);
+		if (rndis_per_dev_params [configNr].dev) {
+			length = 6;
+			memcpy ((u8 *) resp + 24,
+				rndis_per_dev_params [configNr].dev->dev_addr,
+				length);
+			/* 
+			 * we need a MAC address and hope that 
+			 * (our MAC + 1) is not in use
+			 */
+			*((u8 *) resp + 29) += 1;
+			retval = 0;
+		}
+		break;
+		
+	/* mandatory */
+	case OID_802_3_MULTICAST_LIST:
+		DEBUG("%s: OID_802_3_MULTICAST_LIST\n", __FUNCTION__);
+		length = 4;
+		/* Multicast base address only */
+		*((u32 *) resp + 6) = 0xE0000000;
+		retval = 0;
+		break;
+		
+	/* mandatory */
+	case OID_802_3_MAXIMUM_LIST_SIZE:
+		DEBUG("%s: OID_802_3_MAXIMUM_LIST_SIZE\n", __FUNCTION__);
+		 length = 4;
+		/* Multicast base address only */
+		*((u32 *) resp + 6) = 1;
+		retval = 0;
+		break;
+		
+	case OID_802_3_MAC_OPTIONS:
+		DEBUG("%s: OID_802_3_MAC_OPTIONS\n", __FUNCTION__);
+		break;
+		
+	/* mandatory */
+	case OID_802_3_RCV_ERROR_ALIGNMENT:
+		DEBUG("%s: OID_802_3_RCV_ERROR_ALIGNMENT\n", __FUNCTION__);
+		if (rndis_per_dev_params [configNr].stats)
+		{
+			length = 4;
+			*((u32 *) resp + 6) = rndis_per_dev_params [configNr]
+					.stats->rx_frame_errors;
+			retval = 0;
+		}
+		break;
+		
+	/* mandatory */
+	case OID_802_3_XMIT_ONE_COLLISION:
+		DEBUG("%s: OID_802_3_XMIT_ONE_COLLISION\n", __FUNCTION__);
+		length = 4;
+		*((u32 *) resp + 6) = 0;
+		retval = 0;
+		break;
+		
+	/* mandatory */
+	case OID_802_3_XMIT_MORE_COLLISIONS:
+		DEBUG("%s: OID_802_3_XMIT_MORE_COLLISIONS\n", __FUNCTION__);
+		length = 4;
+		*((u32 *) resp + 6) = 0;
+		retval = 0;
+		break;
+		
+	case OID_802_3_XMIT_DEFERRED:
+		DEBUG("%s: OID_802_3_XMIT_DEFERRED\n", __FUNCTION__);
+		/* TODO */
+		break;
+		
+	case OID_802_3_XMIT_MAX_COLLISIONS:
+		DEBUG("%s: OID_802_3_XMIT_MAX_COLLISIONS\n", __FUNCTION__);
+		/* TODO */
+		break;
+		
+	case OID_802_3_RCV_OVERRUN:
+		DEBUG("%s: OID_802_3_RCV_OVERRUN\n", __FUNCTION__);
+		/* TODO */
+		break;
+		
+	case OID_802_3_XMIT_UNDERRUN:
+		DEBUG("%s: OID_802_3_XMIT_UNDERRUN\n", __FUNCTION__);
+		/* TODO */
+		break;
+		
+	case OID_802_3_XMIT_HEARTBEAT_FAILURE:
+		DEBUG("%s: OID_802_3_XMIT_HEARTBEAT_FAILURE\n", __FUNCTION__);
+		/* TODO */
+		break;
+		
+	case OID_802_3_XMIT_TIMES_CRS_LOST:
+		DEBUG("%s: OID_802_3_XMIT_TIMES_CRS_LOST\n", __FUNCTION__);
+		/* TODO */
+		break;
+		
+	case OID_802_3_XMIT_LATE_COLLISIONS:
+		DEBUG("%s: OID_802_3_XMIT_LATE_COLLISIONS\n", __FUNCTION__);
+		/* TODO */
+		break;		
+		
+	default: printk (KERN_ERR "%s: unknown OID 0x%08X\n", 
+			 __FUNCTION__, OID);
+	}
+	
+	resp->InformationBufferOffset = 16;
+	resp->InformationBufferLength = length;
+	resp->MessageLength = 24 + length;
+	r->length = 24 + length;
+	return retval;
+}
+
+static int gen_ndis_set_resp (u8 configNr, u32 OID, u8 *buf, u32 buf_len, 
+			      rndis_resp_t *r)
+{
+	rndis_set_cmplt_type		*resp;
+	int 				i, retval = -ENOTSUPP;
+	struct rndis_config_parameter	*param;
+	
+	if (!r) return -ENOMEM;
+	resp = (rndis_set_cmplt_type *) r->buf;
+	
+	if (!resp) return -ENOMEM;
+	
+	switch (OID) {
+	case OID_GEN_CURRENT_PACKET_FILTER:
+		DEBUG("%s: OID_GEN_CURRENT_PACKET_FILTER\n", __FUNCTION__);
+		currentFilter2devFlags ((u32) ((u8 *) resp + 28), 
+					rndis_per_dev_params [configNr].dev);
+		retval = 0;
+		if ((u32) ((u8 *) resp + 28))
+		    rndis_per_dev_params [configNr].state = RNDIS_INITIALIZED;
+		else
+		    rndis_per_dev_params [configNr].state = RNDIS_UNINITIALIZED;
+		break;
+		
+	case OID_802_3_MULTICAST_LIST:
+		/* I think we can ignore this */		
+		DEBUG("%s: OID_802_3_MULTICAST_LIST\n", __FUNCTION__);
+		retval = 0;
+		break;
+		
+	case OID_GEN_RNDIS_CONFIG_PARAMETER:
+		DEBUG("%s: OID_GEN_RNDIS_CONFIG_PARAMETER\n", __FUNCTION__);
+		param = (struct rndis_config_parameter *) buf;
+		if (param) {
+			for (i = 0; i < param->ParameterNameLength; i++) {
+				DEBUG ("%c", 
+				       *(buf + param->ParameterNameOffset + i));
+			}
+			DEBUG ("\n");
+		}
+		
+		retval = 0;
+		break;
+		
+	default: printk (KERN_ERR "%s: unknown OID 0x%08X\n", 
+			 __FUNCTION__, OID);
+	}
+	
+	return retval;
+}
+
+/* 
+ * Response Functions 
+ */
+
+static int rndis_init_response (int configNr, rndis_init_msg_type *buf)
+{
+	rndis_init_cmplt_type	*resp; 
+	rndis_resp_t            *r;
+	
+	if (!rndis_per_dev_params [configNr].dev) return -ENOTSUPP;
+	
+	r = rndis_add_response (configNr, sizeof (rndis_init_cmplt_type));
+	
+	if (!r) return -ENOMEM;
+	
+	resp = (rndis_init_cmplt_type *) r->buf;
+	
+	if (!resp) return -ENOMEM;
+	
+	resp->MessageType = REMOTE_NDIS_INITIALIZE_CMPLT;
+	resp->MessageLength = 52;
+	resp->RequestID = buf->RequestID;
+	resp->Status = RNDIS_STATUS_SUCCESS;
+	resp->MajorVersion = RNDIS_MAJOR_VERSION;
+	resp->MinorVersion = RNDIS_MINOR_VERSION;
+	resp->DeviceFlags = RNDIS_DF_CONNECTIONLESS;
+	resp->Medium = RNDIS_MEDIUM_802_3;
+	resp->MaxPacketsPerTransfer = 1;
+	resp->MaxTransferSize = rndis_per_dev_params [configNr].dev->mtu
+		+ sizeof (struct ethhdr)
+		+ sizeof (struct rndis_packet_msg_type)
+		+ 22;
+	resp->PacketAlignmentFactor = 0;
+	resp->AFListOffset = 0;
+	resp->AFListSize = 0;
+	
+	if (rndis_per_dev_params [configNr].ack)
+	    rndis_per_dev_params [configNr].ack (
+	    		rndis_per_dev_params [configNr].dev);
+	
+	return 0;
+}
+
+static int rndis_query_response (int configNr, rndis_query_msg_type *buf)
+{
+	rndis_query_cmplt_type *resp;
+	rndis_resp_t            *r;
+	
+	DEBUG("%s: OID = %08X\n", __FUNCTION__, buf->OID);
+	if (!rndis_per_dev_params [configNr].dev) return -ENOTSUPP;
+	
+	/* 
+	 * we need more memory: 
+	 * oid_supported_list is the largest answer 
+	 */
+	r = rndis_add_response (configNr, sizeof (oid_supported_list));
+	
+	if (!r) return -ENOMEM;
+	resp = (rndis_query_cmplt_type *) r->buf;
+	
+	if (!resp) return -ENOMEM;
+	
+	resp->MessageType = REMOTE_NDIS_QUERY_CMPLT;
+	resp->MessageLength = 24;
+	resp->RequestID = buf->RequestID;
+	
+	if (gen_ndis_query_resp (configNr, buf->OID, r)) {
+		/* OID not supported */
+		resp->Status = RNDIS_STATUS_NOT_SUPPORTED;
+		resp->InformationBufferLength = 0;
+		resp->InformationBufferOffset = 0;
+	} else
+		resp->Status = RNDIS_STATUS_SUCCESS;
+	
+	if (rndis_per_dev_params [configNr].ack)
+	    rndis_per_dev_params [configNr].ack (
+	    		rndis_per_dev_params [configNr].dev);
+	return 0;
+}
+
+static int rndis_set_response (int configNr, rndis_set_msg_type *buf)
+{
+	rndis_set_cmplt_type	*resp;
+	rndis_resp_t		*r;
+	int			i;
+	
+	r = rndis_add_response (configNr, sizeof (rndis_set_cmplt_type));
+	
+	if (!r) return -ENOMEM;
+	resp = (rndis_set_cmplt_type *) r->buf;
+	if (!resp) return -ENOMEM;
+	
+	DEBUG("%s: Length: %d\n", __FUNCTION__, buf->InformationBufferLength);
+	DEBUG("%s: Offset: %d\n", __FUNCTION__, buf->InformationBufferOffset);
+	DEBUG("%s: InfoBuffer: ", __FUNCTION__);
+	
+	for (i = 0; i < buf->InformationBufferLength; i++) {
+		DEBUG ("%02x ", *(((u8 *) buf) + i + 12 +
+		       buf->InformationBufferOffset));
+	}
+	
+	DEBUG ("\n");
+	
+	resp->MessageType = REMOTE_NDIS_SET_CMPLT;
+	resp->MessageLength = 16;
+	resp->RequestID = buf->RequestID;
+	if (gen_ndis_set_resp (configNr, buf->OID, 
+			       ((u8 *) buf) + 28, 
+			       buf->InformationBufferLength, r))
+	    resp->Status = RNDIS_STATUS_NOT_SUPPORTED;
+	else resp->Status = RNDIS_STATUS_SUCCESS;
+	
+	if (rndis_per_dev_params [configNr].ack)
+	    rndis_per_dev_params [configNr].ack (rndis_per_dev_params [configNr].dev);
+	
+	return 0;
+}
+
+static int rndis_reset_response (int configNr, rndis_reset_msg_type *buf)
+{
+	rndis_reset_cmplt_type	*resp;
+	rndis_resp_t		*r;
+	
+	r = rndis_add_response (configNr, sizeof (rndis_reset_cmplt_type));
+	
+	if (!r) return -ENOMEM;
+	resp = (rndis_reset_cmplt_type *) r->buf;
+	if (!resp) return -ENOMEM;
+	
+	resp->MessageType = REMOTE_NDIS_RESET_CMPLT;
+	resp->MessageLength = 16;
+	resp->Status = RNDIS_STATUS_SUCCESS;
+	resp->AddressingReset = 1; /* resent information */
+	
+	if (rndis_per_dev_params [configNr].ack)
+	    rndis_per_dev_params [configNr].ack (
+	    		rndis_per_dev_params [configNr].dev);
+
+	return 0;
+}
+
+static int rndis_keepalive_response (int configNr,
+				     rndis_keepalive_msg_type *buf)
+{
+	rndis_keepalive_cmplt_type	*resp;
+	rndis_resp_t			*r;
+	
+	/* respond only in RNDIS_INITIALIZED state */
+	if (rndis_per_dev_params [configNr].state != RNDIS_INITIALIZED) 
+	    return 0;
+	r = rndis_add_response (configNr, sizeof (rndis_keepalive_cmplt_type));
+	resp = (rndis_keepalive_cmplt_type *) r->buf;
+	if (!resp) return -ENOMEM;
+		
+	resp->MessageType = REMOTE_NDIS_KEEPALIVE_CMPLT;
+	resp->MessageLength = 16;
+	resp->RequestID = buf->RequestID;
+	resp->Status = RNDIS_STATUS_SUCCESS;
+	
+	if (rndis_per_dev_params [configNr].ack)
+	    rndis_per_dev_params [configNr].ack (
+	    		rndis_per_dev_params [configNr].dev);
+	
+	return 0;
+}
+
+
+/* 
+ * Device to Host Comunication 
+ */
+static int rndis_indicate_status_msg (int configNr, u32 status)
+{
+	rndis_indicate_status_msg_type	*resp;	
+	rndis_resp_t			*r;
+	
+	if (rndis_per_dev_params [configNr].state == RNDIS_UNINITIALIZED)
+	    return -ENOTSUPP;
+	
+	r = rndis_add_response (configNr, 
+				sizeof (rndis_indicate_status_msg_type));
+	if (!r) return -ENOMEM;
+	
+	resp = (rndis_indicate_status_msg_type *) r->buf;
+	if (!resp) return -ENOMEM;
+	
+	resp->MessageType = REMOTE_NDIS_INDICATE_STATUS_MSG;
+	resp->MessageLength = 20;
+	resp->Status = status;
+	resp->StatusBufferLength = 0;
+	resp->StatusBufferOffset = 0;
+	
+	if (rndis_per_dev_params [configNr].ack) 
+	    rndis_per_dev_params [configNr].ack (
+	    		rndis_per_dev_params [configNr].dev);
+	return 0;
+}
+
+int rndis_signal_connect (int configNr)
+{
+	rndis_per_dev_params [configNr].media_state
+			= NDIS_MEDIA_STATE_CONNECTED;
+	return rndis_indicate_status_msg (configNr, 
+					  RNDIS_STATUS_MEDIA_CONNECT);
+}
+
+int rndis_signal_disconnect (int configNr)
+{
+	rndis_per_dev_params [configNr].media_state
+			= NDIS_MEDIA_STATE_DISCONNECTED;
+	return rndis_indicate_status_msg (configNr,
+					  RNDIS_STATUS_MEDIA_DISCONNECT);
+}
+
+/* 
+ * Message Parser 
+ */
+int rndis_msg_parser (u8 configNr, u8 *buf)
+{
+	u32 MsgType, MsgLength, *tmp;
+	
+	if (!buf) return -ENOMEM;
+	
+	tmp = (u32 *) buf; 
+	MsgType = *tmp;
+	MsgLength = *(tmp + 1);
+	
+	if (configNr >= RNDIS_MAX_CONFIGS) return -ENOTSUPP;
+	
+	switch (MsgType)
+	{
+	case REMOTE_NDIS_INIZIALIZE_MSG:
+		DEBUG(KERN_INFO "%s: REMOTE_NDIS_INIZIALIZE_MSG\n", 
+			__FUNCTION__ );
+		rndis_per_dev_params [configNr].state = RNDIS_INITIALIZED;
+		return  rndis_init_response (configNr,
+					     (rndis_init_msg_type *) buf);
+		break;
+		
+	case REMOTE_NDIS_HALT_MSG:
+		DEBUG(KERN_INFO "%s: REMOTE_NDIS_HALT_MSG\n",
+			__FUNCTION__ );
+		rndis_per_dev_params [configNr].state = RNDIS_UNINITIALIZED;
+		return 0;
+		
+	case REMOTE_NDIS_QUERY_MSG:
+		DEBUG(KERN_INFO "%s: REMOTE_NDIS_QUERY_MSG\n", 
+			__FUNCTION__ );
+		return rndis_query_response (configNr, 
+					     (rndis_query_msg_type *) buf);
+		break;
+		
+	case REMOTE_NDIS_SET_MSG:
+		DEBUG(KERN_INFO "%s: REMOTE_NDIS_SET_MSG\n", 
+			__FUNCTION__ );
+		return rndis_set_response (configNr, 
+					   (rndis_set_msg_type *) buf);
+		break;
+		
+	case REMOTE_NDIS_RESET_MSG:
+		DEBUG(KERN_INFO "%s: REMOTE_NDIS_RESET_MSG\n", 
+			__FUNCTION__ );
+		return rndis_reset_response (configNr,
+					     (rndis_reset_msg_type *) buf);
+		break;
+
+	case REMOTE_NDIS_KEEPALIVE_MSG:
+		DEBUG(KERN_INFO "%s: REMOTE_NDIS_KEEPALIVE_MSG\n", 
+			__FUNCTION__ );
+		return rndis_keepalive_response (configNr,
+						 (rndis_keepalive_msg_type *) 
+						 buf);
+		break;
+		
+	default: 
+		printk (KERN_ERR "%s: unknown RNDIS Message Type 0x%08X\n", 
+			__FUNCTION__ , MsgType);
+		break;
+	}
+	
+	return -ENOTSUPP;
+}
+
+int rndis_register (int (* rndis_control_ack) (struct net_device *))
+{
+	u8 i;
+	DEBUG("%s: ", __FUNCTION__ );
+	
+	for (i = 0; i < RNDIS_MAX_CONFIGS; i++) {
+		if (!rndis_per_dev_params [i].used) {
+			rndis_per_dev_params [i].used = 1;
+			rndis_per_dev_params [i].ack = rndis_control_ack;
+			DEBUG("configNr = %d\n", i);
+			return i;
+		}
+	}
+	DEBUG("failed\n");
+	
+	return -1;
+}
+
+void rndis_deregister (int configNr)
+{
+	DEBUG("%s: \n", __FUNCTION__ );
+	
+	if (configNr >= RNDIS_MAX_CONFIGS) return;
+	rndis_per_dev_params [configNr].used = 0;
+	
+	return;
+}
+
+int rndis_set_param_dev (u8 configNr, struct net_device *dev, 
+			 struct net_device_stats *stats)
+{
+	DEBUG("%s:\n", __FUNCTION__ );
+	if (!dev || !stats) return -1;
+	if (configNr >= RNDIS_MAX_CONFIGS) return -1;
+	
+	rndis_per_dev_params [configNr].dev = dev;
+	rndis_per_dev_params [configNr].stats = stats;
+	
+	return 0;
+}
+
+int rndis_set_param_vendor (u8 configNr, u32 vendorID, const char *vendorDescr)
+{
+	DEBUG("%s:\n", __FUNCTION__ );
+	if (!vendorDescr) return -1;
+	if (configNr >= RNDIS_MAX_CONFIGS) return -1;
+	
+	rndis_per_dev_params [configNr].vendorID = vendorID;
+	rndis_per_dev_params [configNr].vendorDescr = vendorDescr;
+	
+	return 0;
+}
+
+int rndis_set_param_medium (u8 configNr, u32 medium, u32 speed)
+{
+	DEBUG("%s:\n", __FUNCTION__ );
+	if (configNr >= RNDIS_MAX_CONFIGS) return -1;
+	
+	rndis_per_dev_params [configNr].medium = medium;
+	rndis_per_dev_params [configNr].speed = speed;
+	
+	return 0;
+}
+
+void rndis_add_hdr (struct sk_buff *skb)
+{
+	if (!skb) return;
+	skb_push (skb, sizeof (struct rndis_packet_msg_type));
+	memset (skb->data, 0, sizeof (struct rndis_packet_msg_type));
+	*((u32 *) skb->data) = 1;
+	*((u32 *) skb->data + 1) = skb->len;
+	*((u32 *) skb->data + 2) = 36;
+	*((u32 *) skb->data + 3) = skb->len - 44;
+	
+	return;
+}
+
+void rndis_free_response (int configNr, u8 *buf)
+{
+	rndis_resp_t		*r;
+	struct list_head	*act, *tmp;
+	
+	list_for_each_safe (act, tmp, 
+			    &(rndis_per_dev_params [configNr].resp_queue))
+	{
+		r = list_entry (act, rndis_resp_t, list);
+		if (r && r->buf == buf) {
+			list_del (&r->list);
+			kfree (r);
+		}
+	}
+}
+
+u8 *rndis_get_next_response (int configNr, u32 *length)
+{
+	rndis_resp_t		*r;
+	struct list_head 	*act, *tmp;
+	
+	if (!length) return NULL;
+	
+	list_for_each_safe (act, tmp, 
+			    &(rndis_per_dev_params [configNr].resp_queue))
+	{
+		r = list_entry (act, rndis_resp_t, list);
+		if (!r->send) {
+			r->send = 1;
+			*length = r->length;
+			return r->buf;
+		}
+	}
+	
+	return NULL;
+}
+
+static rndis_resp_t *rndis_add_response (int configNr, u32 length)
+{
+	rndis_resp_t	*r;
+	
+	r = kmalloc (sizeof (rndis_resp_t) + length, GFP_ATOMIC);
+	if (!r) return NULL;
+	
+	r->buf = (u8 *) (r + 1);
+	r->length = length;
+	r->send = 0;
+	
+	list_add_tail (&r->list, 
+		       &(rndis_per_dev_params [configNr].resp_queue));
+	return r;
+}
+
+int rndis_rm_hdr (u8 *buf, u32 *length)
+{
+	u32 i, messageLen, dataOffset;
+	
+	if (!buf || !length) return -1;
+	if (*((u32 *) buf) != 1) return -1;
+	
+	messageLen = *((u32 *) buf + 1);
+	
+	dataOffset = *((u32 *) buf + 2) + 8;
+	if (messageLen < dataOffset || messageLen > *length) return -1;
+	
+	for (i = dataOffset; i < messageLen; i++)
+		buf [i - dataOffset] = buf [i];
+		
+	*length = messageLen - dataOffset;
+	
+	return 0;
+}
+
+int rndis_proc_read (char *page, char **start, off_t off, int count, int *eof, 
+		     void *data)
+{
+	char *out = page;
+	int len;
+	rndis_params *param = (rndis_params *) data;
+	
+	out += snprintf (out, count, 
+			 "Config Nr. %d\n"
+			 "used      : %s\n"
+			 "state     : %s\n"
+			 "medium    : 0x%08X\n"
+			 "speed     : %d\n"
+			 "cable     : %s\n"
+			 "vendor ID : 0x%08X\n"
+			 "vendor    : %s\n", 
+			 param->confignr, (param->used) ? "y" : "n", 
+			 (param->state)
+				? "RNDIS_INITIALIZED"
+				: "RNDIS_UNINITIALIZED",
+			 param->medium, 
+			 (param->media_state) ? 0 : param->speed*100, 
+			 (param->media_state) ? "disconnected" : "connected",
+			 param->vendorID, param->vendorDescr);      
+	
+	len = out - page;
+	len -= off;
+	
+	if (len < count) {
+		*eof = 1;
+		if (len <= 0)
+			return 0;
+	} else
+		len = count;
+	
+	*start = page + off;
+	return len;
+}
+
+int rndis_proc_write (struct file *file, const char *buffer, 
+		      unsigned long count, void *data)
+{
+	u32 speed = 0;
+	int i, fl_speed = 0;
+	
+	for (i = 0; i < count; i++) {
+		switch (*buffer) {
+		case '0':
+		case '1':
+		case '2':
+		case '3':
+		case '4':
+		case '5':
+		case '6':
+		case '7':
+		case '8':
+		case '9':
+			fl_speed = 1;
+			speed = speed*10 + *buffer - '0';
+			break;
+		case 'C':
+		case 'c':
+			rndis_signal_connect (((rndis_params *) data)
+				->confignr);
+			break;
+		case 'D':
+		case 'd':
+			rndis_signal_disconnect (((rndis_params *) data)
+				->confignr);
+			break;
+		default: 
+			if (fl_speed) ((rndis_params *) data)->speed = speed;
+			else DEBUG ("%c is not valid\n", *buffer);
+			break;
+		}
+		
+		buffer++;
+	}
+	
+	return count;
+}
+
+int __init rndis_init (void)
+{
+	u8 i;
+	char name [4];
+
+	/* FIXME this should probably be /proc/driver/rndis,
+	 * and only if debugging is enabled
+	 */
+	
+	if (!(rndis_connect_dir =  proc_mkdir ("rndis", NULL))) {
+		printk (KERN_ERR "%s: couldn't create /proc/rndis entry", 
+			__FUNCTION__);
+		return -EIO;
+	}
+	
+	for (i = 0; i < RNDIS_MAX_CONFIGS; i++) {
+		sprintf (name, "%03d", i);
+		if (!(rndis_connect_state [i]
+				= create_proc_entry (name, 0660,
+						rndis_connect_dir))) 
+		{
+			DEBUG ("%s :remove entries", __FUNCTION__);
+			for (i--; i > 0; i--) {
+				sprintf (name, "%03d", i);
+				remove_proc_entry (name, rndis_connect_dir);
+			}
+			DEBUG ("\n");
+			
+			remove_proc_entry ("000", rndis_connect_dir);
+			remove_proc_entry ("rndis", NULL);
+			return -EIO;
+		}
+		rndis_connect_state [i]->nlink = 1;
+		rndis_connect_state [i]->write_proc = rndis_proc_write;
+		rndis_connect_state [i]->read_proc = rndis_proc_read;
+		rndis_connect_state [i]->data = (void *)
+				(rndis_per_dev_params + i);
+		rndis_per_dev_params [i].confignr = i;
+		rndis_per_dev_params [i].used = 0;
+		rndis_per_dev_params [i].state = RNDIS_UNINITIALIZED;
+		rndis_per_dev_params [i].media_state
+				= NDIS_MEDIA_STATE_DISCONNECTED;
+		INIT_LIST_HEAD (&(rndis_per_dev_params [i].resp_queue));
+	}
+	
+	return 0;
+}
+
+void __exit rndis_exit (void)
+{
+	u8 i;
+	char name [4];
+	
+	for (i = 0; i < RNDIS_MAX_CONFIGS; i++) {
+		sprintf (name, "%03d", i);
+		remove_proc_entry (name, rndis_connect_dir);
+	}
+	remove_proc_entry ("rndis", NULL);
+	return;
+}
+
--- diff/drivers/usb/gadget/rndis.h	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/usb/gadget/rndis.h	2004-04-21 10:45:35.053374576 +0100
@@ -0,0 +1,311 @@
+/* 
+ * RNDIS	Definitions for Remote NDIS
+ * 
+ * Version:	$Id: rndis.h,v 1.15 2004/03/25 21:33:46 robert Exp $
+ * 
+ * Authors:	Benedikt Spranger, Pengutronix
+ * 		Robert Schwebel, Pengutronix
+ * 
+ * 		This program is free software; you can redistribute it and/or
+ *		modify it under the terms of the GNU General Public License
+ *		version 2, as published by the Free Software Foundation. 
+ * 
+ *		This software was originally developed in conformance with
+ *		Microsoft's Remote NDIS Specification License Agreement.
+ */
+
+#ifndef _LINUX_RNDIS_H
+#define _LINUX_RNDIS_H
+
+#include "ndis.h"
+
+#define RNDIS_MAXIMUM_FRAME_SIZE	1518
+#define RNDIS_MAX_TOTAL_SIZE		1558
+
+/* Remote NDIS Versions */
+#define RNDIS_MAJOR_VERSION		1
+#define RNDIS_MINOR_VERSION		0
+
+/* Status Values */
+#define RNDIS_STATUS_SUCCESS		0x00000000U	/* Success           */
+#define RNDIS_STATUS_FAILURE		0xC0000001U	/* Unspecified error */
+#define RNDIS_STATUS_INVALID_DATA	0xC0010015U	/* Invalid data      */
+#define RNDIS_STATUS_NOT_SUPPORTED	0xC00000BBU	/* Unsupported request */
+#define RNDIS_STATUS_MEDIA_CONNECT	0x4001000BU	/* Device connected  */
+#define RNDIS_STATUS_MEDIA_DISCONNECT	0x4001000CU	/* Device disconnected */
+/* For all not specified status messages:
+ * RNDIS_STATUS_Xxx -> NDIS_STATUS_Xxx 
+ */
+
+/* Message Set for Connectionless (802.3) Devices */
+#define REMOTE_NDIS_INIZIALIZE_MSG	0x00000002U	/* Initialize device */
+#define REMOTE_NDIS_HALT_MSG		0x00000003U
+#define REMOTE_NDIS_QUERY_MSG		0x00000004U
+#define REMOTE_NDIS_SET_MSG		0x00000005U
+#define REMOTE_NDIS_RESET_MSG		0x00000006U
+#define REMOTE_NDIS_INDICATE_STATUS_MSG	0x00000007U
+#define REMOTE_NDIS_KEEPALIVE_MSG	0x00000008U
+
+/* Message completion */
+#define REMOTE_NDIS_INITIALIZE_CMPLT	0x80000002U
+#define REMOTE_NDIS_QUERY_CMPLT		0x80000004U
+#define REMOTE_NDIS_SET_CMPLT		0x80000005U
+#define REMOTE_NDIS_RESET_CMPLT		0x80000006U
+#define REMOTE_NDIS_KEEPALIVE_CMPLT	0x80000008U
+
+/* Device Flags */
+#define RNDIS_DF_CONNECTIONLESS		0x00000001U
+#define RNDIS_DF_CONNECTION_ORIENTED	0x00000002U
+
+#define RNDIS_MEDIUM_802_3		0x00000000U
+
+/* supported OIDs */
+static const u32 oid_supported_list [] = 
+{
+	/* mandatory general */
+	/* the general stuff */
+	OID_GEN_SUPPORTED_LIST,
+	OID_GEN_HARDWARE_STATUS,
+	OID_GEN_MEDIA_SUPPORTED,
+	OID_GEN_MEDIA_IN_USE,
+	OID_GEN_MAXIMUM_FRAME_SIZE,
+	OID_GEN_LINK_SPEED,
+	OID_GEN_TRANSMIT_BUFFER_SPACE,
+	OID_GEN_TRANSMIT_BLOCK_SIZE,
+	OID_GEN_RECEIVE_BLOCK_SIZE,
+	OID_GEN_VENDOR_ID,
+	OID_GEN_VENDOR_DESCRIPTION,
+	OID_GEN_VENDOR_DRIVER_VERSION,
+	OID_GEN_CURRENT_PACKET_FILTER,
+	OID_GEN_MAXIMUM_TOTAL_SIZE,
+	OID_GEN_MAC_OPTIONS,
+	OID_GEN_MEDIA_CONNECT_STATUS,
+	OID_GEN_PHYSICAL_MEDIUM,
+	OID_GEN_RNDIS_CONFIG_PARAMETER,
+	
+	/* the statistical stuff */
+	OID_GEN_XMIT_OK,
+	OID_GEN_RCV_OK,
+	OID_GEN_XMIT_ERROR,
+	OID_GEN_RCV_ERROR,
+	OID_GEN_RCV_NO_BUFFER,
+	OID_GEN_DIRECTED_BYTES_XMIT,
+	OID_GEN_DIRECTED_FRAMES_XMIT,
+	OID_GEN_MULTICAST_BYTES_XMIT,
+	OID_GEN_MULTICAST_FRAMES_XMIT,
+	OID_GEN_BROADCAST_BYTES_XMIT,
+	OID_GEN_BROADCAST_FRAMES_XMIT,
+	OID_GEN_DIRECTED_BYTES_RCV,
+	OID_GEN_DIRECTED_FRAMES_RCV,
+	OID_GEN_MULTICAST_BYTES_RCV,
+	OID_GEN_MULTICAST_FRAMES_RCV,
+	OID_GEN_BROADCAST_BYTES_RCV,
+	OID_GEN_BROADCAST_FRAMES_RCV,
+	OID_GEN_RCV_CRC_ERROR,
+	OID_GEN_TRANSMIT_QUEUE_LENGTH,
+
+    	/* mandatory 802.3 */
+	/* the general stuff */
+	OID_802_3_PERMANENT_ADDRESS,
+	OID_802_3_CURRENT_ADDRESS,
+	OID_802_3_MULTICAST_LIST,
+	OID_802_3_MAC_OPTIONS,
+	OID_802_3_MAXIMUM_LIST_SIZE,
+	
+	/* the statistical stuff */
+	OID_802_3_RCV_ERROR_ALIGNMENT,
+	OID_802_3_XMIT_ONE_COLLISION,
+	OID_802_3_XMIT_MORE_COLLISIONS
+};
+
+
+typedef struct rndis_init_msg_type 
+{
+	u32	MessageType;
+	u32	MessageLength;
+	u32	RequestID;
+	u32	MajorVersion;
+	u32	MinorVersion;
+	u32	MaxTransferSize;
+} rndis_init_msg_type;
+
+typedef struct rndis_init_cmplt_type
+{
+	u32	MessageType;
+	u32	MessageLength;
+	u32	RequestID;
+	u32	Status;
+	u32	MajorVersion;
+	u32	MinorVersion;
+	u32	DeviceFlags;
+	u32	Medium;
+	u32	MaxPacketsPerTransfer;
+	u32	MaxTransferSize;
+	u32	PacketAlignmentFactor;
+	u32	AFListOffset;
+	u32	AFListSize;
+} rndis_init_cmplt_type;
+
+typedef struct rndis_halt_msg_type
+{
+	u32	MessageType;
+	u32	MessageLength;
+	u32	RequestID;
+} rndis_halt_msg_type;
+
+typedef struct rndis_query_msg_type
+{
+	u32	MessageType;
+	u32	MessageLength;
+	u32	RequestID;
+	u32	OID;
+	u32	InformationBufferLength;
+	u32	InformationBufferOffset;
+	u32	DeviceVcHandle;
+} rndis_query_msg_type;
+
+typedef struct rndis_query_cmplt_type
+{
+	u32	MessageType;
+	u32	MessageLength;
+	u32	RequestID;
+	u32	Status;
+	u32	InformationBufferLength;
+	u32	InformationBufferOffset;
+} rndis_query_cmplt_type;
+
+typedef struct rndis_set_msg_type
+{
+	u32	MessageType;
+	u32	MessageLength;
+	u32	RequestID;
+	u32	OID;
+	u32	InformationBufferLength;
+	u32	InformationBufferOffset;
+	u32	DeviceVcHandle;
+} rndis_set_msg_type;
+
+typedef struct rndis_set_cmplt_type
+{
+	u32	MessageType;
+	u32	MessageLength;
+	u32	RequestID;
+	u32	Status;
+} rndis_set_cmplt_type;
+
+typedef struct rndis_reset_msg_type
+{
+	u32	MessageType;
+	u32	MessageLength;
+	u32	Reserved;
+} rndis_reset_msg_type;
+
+typedef struct rndis_reset_cmplt_type
+{
+	u32	MessageType;
+	u32	MessageLength;
+	u32	Status;
+	u32	AddressingReset;
+} rndis_reset_cmplt_type;
+
+typedef struct rndis_indicate_status_msg_type
+{
+	u32	MessageType;
+	u32	MessageLength;
+	u32	Status;
+	u32	StatusBufferLength;
+	u32	StatusBufferOffset;
+} rndis_indicate_status_msg_type;
+
+typedef struct rndis_keepalive_msg_type
+{
+	u32	MessageType;
+	u32	MessageLength;
+	u32	RequestID;
+} rndis_keepalive_msg_type;
+
+typedef struct rndis_keepalive_cmplt_type
+{
+	u32	MessageType;
+	u32	MessageLength;
+	u32	RequestID;
+	u32	Status;
+} rndis_keepalive_cmplt_type;
+
+struct rndis_packet_msg_type
+{
+	u32	MessageType;
+	u32	MessageLength;
+	u32	DataOffset;
+	u32	DataLength;
+	u32	OOBDataOffset;
+	u32	OOBDataLength;
+	u32	NumOOBDataElements;
+	u32	PerPacketInfoOffset;
+	u32	PerPacketInfoLength;
+	u32	VcHandle;
+	u32	Reserved;
+};
+
+struct rndis_config_parameter
+{
+	u32	ParameterNameOffset;
+	u32	ParameterNameLength;
+	u32	ParameterType;
+	u32	ParameterValueOffset;
+	u32	ParameterValueLength;
+};
+
+/* implementation specific */
+enum rndis_state
+{
+	RNDIS_UNINITIALIZED,
+	RNDIS_INITIALIZED,
+	RNDIS_DATA_INITIALIZED,
+};
+
+typedef struct rndis_resp_t
+{
+	struct list_head	list;
+	u8			*buf;
+	u32			length;
+	int			send;
+} rndis_resp_t;
+
+typedef struct rndis_params
+{
+	u8			confignr;
+	int			used;
+	enum rndis_state	state;
+	u32			medium;
+	u32			speed;
+	u32			media_state;
+	struct net_device 	*dev;
+	struct net_device_stats *stats;
+	u32			vendorID;
+	const char		*vendorDescr;
+	int 			(*ack) (struct net_device *);
+	struct list_head	resp_queue;
+} rndis_params;
+
+/* RNDIS Message parser and other useless functions */
+int  rndis_msg_parser (u8 configNr, u8 *buf);
+int  rndis_register (int (*rndis_control_ack) (struct net_device *));
+void rndis_deregister (int configNr);
+int  rndis_set_param_dev (u8 configNr, struct net_device *dev,
+			 struct net_device_stats *stats);
+int  rndis_set_param_vendor (u8 configNr, u32 vendorID, 
+			    const char *vendorDescr);
+int  rndis_set_param_medium (u8 configNr, u32 medium, u32 speed);
+void rndis_add_hdr (struct sk_buff *skb);
+int  rndis_rm_hdr (u8 *buf, u32 *length);
+u8   *rndis_get_next_response (int configNr, u32 *length);
+void rndis_free_response (int configNr, u8 *buf);
+int  rndis_signal_connect (int configNr);
+int  rndis_signal_disconnect (int configNr);
+int  rndis_state (int configNr);
+
+int __init rndis_init (void);
+void __exit rndis_exit (void);
+
+#endif  /* _LINUX_RNDIS_H */
--- diff/drivers/usb/misc/cytherm.c	1970-01-01 01:00:00.000000000 +0100
+++ source/drivers/usb/misc/cytherm.c	2004-04-21 10:45:35.072371688 +0100
@@ -0,0 +1,433 @@
+/* -*- linux-c -*-
+ * Cypress USB Thermometer driver 
+ * 
+ * Copyright (c) 2004 Erik Rigtorp <erkki@linux.nu> <erik@rigtorp.com>
+ * 
+ * This driver works with Elektor magazine USB Interface as published in 
+ * issue #291. It should also work with the original starter kit/demo board
+ * from Cypress.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2.
+ *
+ */
+
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/usb.h>
+
+#define DRIVER_VERSION "v1.0"
+#define DRIVER_AUTHOR "Erik Rigtorp"
+#define DRIVER_DESC "Cypress USB Thermometer driver"
+
+#define USB_SKEL_VENDOR_ID	0x04b4
+#define USB_SKEL_PRODUCT_ID	0x0002
+
+static struct usb_device_id id_table [] = {
+	{ USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID) },
+	{ }
+};
+MODULE_DEVICE_TABLE (usb, id_table);
+
+/* Structure to hold all of our device specific stuff */
+struct usb_cytherm {
+	struct usb_device    *udev;	 /* save off the usb device pointer */
+	struct usb_interface *interface; /* the interface for this device */
+	int brightness;
+};
+
+
+/* local function prototypes */
+static int cytherm_probe(struct usb_interface *interface, 
+			 const struct usb_device_id *id);
+static void cytherm_disconnect(struct usb_interface *interface);
+int vendor_command(struct usb_device *dev, unsigned char request, 
+		   unsigned char value, unsigned char index,
+		   void *buf, int size);
+
+
+/* usb specific object needed to register this driver with the usb subsystem */
+static struct usb_driver cytherm_driver = {
+	.owner =	THIS_MODULE,
+	.name =		"cytherm",
+	.probe =	cytherm_probe,
+	.disconnect =	cytherm_disconnect,
+	.id_table =	id_table,
+};
+
+/* Vendor requests */
+/* They all operate on one byte at a time */
+#define PING       0x00
+#define READ_ROM   0x01 /* Reads form ROM, value = address */
+#define READ_RAM   0x02 /* Reads form RAM, value = address */
+#define WRITE_RAM  0x03 /* Write to RAM, value = address, index = data */
+#define READ_PORT  0x04 /* Reads from port, value = address */
+#define WRITE_PORT 0x05 /* Write to port, value = address, index = data */ 
+
+
+/* Send a vendor command to device */
+int vendor_command(struct usb_device *dev, unsigned char request, 
+		   unsigned char value, unsigned char index,
+		   void *buf, int size)
+{
+	return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
+			       request, 
+			       USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_OTHER,
+			       value, 
+			       index, buf, size,
+			       HZ * USB_CTRL_GET_TIMEOUT);
+}
+
+
+
+#define BRIGHTNESS 0x2c     /* RAM location for brightness value */
+#define BRIGHTNESS_SEM 0x2b /* RAM location for brightness semaphore */
+
+static ssize_t show_brightness(struct device *dev, char *buf)
+{
+	struct usb_interface *intf = to_usb_interface(dev);    
+	struct usb_cytherm *cytherm = usb_get_intfdata(intf);     
+
+	return sprintf(buf, "%i", cytherm->brightness);
+}
+
+static ssize_t set_brightness(struct device *dev, const char *buf, 
+			      size_t count)
+{
+	struct usb_interface *intf = to_usb_interface(dev);
+	struct usb_cytherm *cytherm = usb_get_intfdata(intf);
+
+	unsigned char *buffer;
+	int retval;
+   
+	buffer = kmalloc(8, GFP_KERNEL);
+	if (!buffer) {
+		dev_err(&cytherm->udev->dev, "out of memory\n");
+		return 0;
+	}
+
+	cytherm->brightness = simple_strtoul(buf, NULL, 10);
+   
+	if (cytherm->brightness > 0xFF)
+		cytherm->brightness = 0xFF;
+	else if (cytherm->brightness < 0)
+		cytherm->brightness = 0;
+   
+	/* Set brightness */
+	retval = vendor_command(cytherm->udev, WRITE_RAM, BRIGHTNESS, 
+				cytherm->brightness, buffer, 8);
+	if (retval)
+		dev_dbg(&led->udev->dev, "retval = %d\n", retval);
+	/* Inform µC that we have changed the brightness setting */
+	retval = vendor_command(cytherm->udev, WRITE_RAM, BRIGHTNESS_SEM,
+				0x01, buffer, 8);
+	if (retval)
+		dev_dbg(&led->udev->dev, "retval = %d\n", retval);
+   
+	kfree(buffer);
+   
+	return count;
+}
+
+static DEVICE_ATTR(brightness, S_IRUGO | S_IWUSR | S_IWGRP, 
+		   show_brightness, set_brightness);
+
+
+#define TEMP 0x33 /* RAM location for temperature */
+#define SIGN 0x34 /* RAM location for temperature sign */
+
+static ssize_t show_temp(struct device *dev, char *buf)
+{
+
+	struct usb_interface *intf = to_usb_interface(dev);
+	struct usb_cytherm *cytherm = usb_get_intfdata(intf);
+
+	int retval;
+	unsigned char *buffer;
+
+	int temp, sign;
+   
+	buffer = kmalloc(8, GFP_KERNEL);
+	if (!buffer) {
+		dev_err(&cytherm->udev->dev, "out of memory\n");
+		return 0;
+	}
+
+	/* read temperature */
+	retval = vendor_command(cytherm->udev, READ_RAM, TEMP, 0, buffer, 8);
+	if (retval)
+		dev_dbg(&led->udev->dev, "retval = %d\n", retval);
+	temp = buffer[1];
+   
+	/* read sign */
+	retval = vendor_command(cytherm->udev, READ_RAM, SIGN, 0, buffer, 8);
+	if (retval)
+		dev_dbg(&led->udev->dev, "retval = %d\n", retval);
+	sign = buffer[1];
+
+	kfree(buffer);
+   
+	return sprintf(buf, "%c%i.%i", sign ? '-' : '+', temp >> 1,
+		       5*(temp - ((temp >> 1) << 1)));
+}
+
+
+static ssize_t set_temp(struct device *dev, const char *buf, size_t count)
+{
+	return count;
+}
+
+static DEVICE_ATTR(temp, S_IRUGO, show_temp, set_temp);
+
+
+#define BUTTON 0x7a
+
+static ssize_t show_button(struct device *dev, char *buf)
+{
+
+	struct usb_interface *intf = to_usb_interface(dev);
+	struct usb_cytherm *cytherm = usb_get_intfdata(intf);
+
+	int retval;
+	unsigned char *buffer;
+
+	buffer = kmalloc(8, GFP_KERNEL);
+	if (!buffer) {
+		dev_err(&cytherm->udev->dev, "out of memory\n");
+		return 0;
+	}
+
+	/* check button */
+	retval = vendor_command(cytherm->udev, READ_RAM, BUTTON, 0, buffer, 8);
+	if (retval)
+		dev_dbg(&led->udev->dev, "retval = %d\n", retval);
+   
+	retval = buffer[1];
+
+	kfree(buffer);
+
+	if (retval)
+		return sprintf(buf, "1");
+	else
+		return sprintf(buf, "0");
+}
+
+
+static ssize_t set_button(struct device *dev, const char *buf, size_t count)
+{
+	return count;
+}
+
+static DEVICE_ATTR(button, S_IRUGO, show_button, set_button);
+
+
+static ssize_t show_port0(struct device *dev, char *buf)
+{
+	struct usb_interface *intf = to_usb_interface(dev);
+	struct usb_cytherm *cytherm = usb_get_intfdata(intf);
+
+	int retval;
+	unsigned char *buffer;
+
+	buffer = kmalloc(8, GFP_KERNEL);
+	if (!buffer) {
+		dev_err(&cytherm->udev->dev, "out of memory\n");
+		return 0;
+	}
+
+	retval = vendor_command(cytherm->udev, READ_PORT, 0, 0, buffer, 8);
+	if (retval)
+		dev_dbg(&led->udev->dev, "retval = %d\n", retval);
+
+	retval = buffer[1];
+
+	kfree(buffer);
+
+	return sprintf(buf, "%d", retval);
+}
+
+
+static ssize_t set_port0(struct device *dev, const char *buf, size_t count)
+{
+	struct usb_interface *intf = to_usb_interface(dev);
+	struct usb_cytherm *cytherm = usb_get_intfdata(intf);
+
+	unsigned char *buffer;
+	int retval;
+	int tmp;
+   
+	buffer = kmalloc(8, GFP_KERNEL);
+	if (!buffer) {
+		dev_err(&cytherm->udev->dev, "out of memory\n");
+		return 0;
+	}
+
+	tmp = simple_strtoul(buf, NULL, 10);
+   
+	if (tmp > 0xFF)
+		tmp = 0xFF;
+	else if (tmp < 0)
+		tmp = 0;
+   
+	retval = vendor_command(cytherm->udev, WRITE_PORT, 0,
+				tmp, buffer, 8);
+	if (retval)
+		dev_dbg(&led->udev->dev, "retval = %d\n", retval);
+
+	kfree(buffer);
+
+	return count;
+}
+
+static DEVICE_ATTR(port0, S_IRUGO | S_IWUSR | S_IWGRP, show_port0, set_port0);
+
+static ssize_t show_port1(struct device *dev, char *buf)
+{
+	struct usb_interface *intf = to_usb_interface(dev);
+	struct usb_cytherm *cytherm = usb_get_intfdata(intf);
+
+	int retval;
+	unsigned char *buffer;
+
+	buffer = kmalloc(8, GFP_KERNEL);
+	if (!buffer) {
+		dev_err(&cytherm->udev->dev, "out of memory\n");
+		return 0;
+	}
+
+	retval = vendor_command(cytherm->udev, READ_PORT, 1, 0, buffer, 8);
+	if (retval)
+		dev_dbg(&led->udev->dev, "retval = %d\n", retval);
+   
+	retval = buffer[1];
+
+	kfree(buffer);
+
+	return sprintf(buf, "%d", retval);
+}
+
+
+static ssize_t set_port1(struct device *dev, const char *buf, size_t count)
+{
+	struct usb_interface *intf = to_usb_interface(dev);
+	struct usb_cytherm *cytherm = usb_get_intfdata(intf);
+
+	unsigned char *buffer;
+	int retval;
+	int tmp;
+   
+	buffer = kmalloc(8, GFP_KERNEL);
+	if (!buffer) {
+		dev_err(&cytherm->udev->dev, "out of memory\n");
+		return 0;
+	}
+
+	tmp = simple_strtoul(buf, NULL, 10);
+   
+	if (tmp > 0xFF)
+		tmp = 0xFF;
+	else if (tmp < 0)
+		tmp = 0;
+   
+	retval = vendor_command(cytherm->udev, WRITE_PORT, 1,
+				tmp, buffer, 8);
+	if (retval)
+		dev_dbg(&led->udev->dev, "retval = %d\n", retval);
+
+	kfree(buffer);
+
+	return count;
+}
+
+static DEVICE_ATTR(port1, S_IRUGO | S_IWUSR | S_IWGRP, show_port1, set_port1);
+
+
+
+static int cytherm_probe(struct usb_interface *interface, 
+			 const struct usb_device_id *id)
+{
+	struct usb_device *udev = interface_to_usbdev(interface);
+	struct usb_cytherm *dev = NULL;
+	int retval = -ENOMEM;
+
+	dev = kmalloc (sizeof(struct usb_cytherm), GFP_KERNEL);
+	if (dev == NULL) {
+		dev_err (&interface->dev, "Out of memory\n");
+		goto error;
+	}
+	memset (dev, 0x00, sizeof (*dev));
+
+	dev->udev = usb_get_dev(udev);
+
+	usb_set_intfdata (interface, dev);
+
+	dev->brightness = 0xFF;
+
+	device_create_file(&interface->dev, &dev_attr_brightness);   
+	device_create_file(&interface->dev, &dev_attr_temp);
+	device_create_file(&interface->dev, &dev_attr_button);
+	device_create_file(&interface->dev, &dev_attr_port0);
+	device_create_file(&interface->dev, &dev_attr_port1);
+
+	dev_info (&interface->dev, 
+		  "Cypress thermometer device now attached\n");
+	return 0;
+
+ error:
+	kfree(dev);
+	return retval;
+}
+
+static void cytherm_disconnect(struct usb_interface *interface)
+{
+	struct usb_cytherm *dev;
+
+	dev = usb_get_intfdata (interface);
+	usb_set_intfdata (interface, NULL);
+
+	device_remove_file(&interface->dev, &dev_attr_brightness);
+	device_remove_file(&interface->dev, &dev_attr_temp);
+	device_remove_file(&interface->dev, &dev_attr_button);
+	device_remove_file(&interface->dev, &dev_attr_port0);
+	device_remove_file(&interface->dev, &dev_attr_port1);
+
+	usb_put_dev(dev->udev);
+
+	kfree(dev);
+
+	dev_info(&interface->dev, "Cypress thermometer now disconnected\n");
+}
+
+
+static int __init usb_cytherm_init(void)
+{
+	int result;
+
+	result = usb_register(&cytherm_driver);
+	if (result) 
+	{	
+		err("usb_register failed. Error number %d", result);
+		return result;
+	}
+
+	info(DRIVER_VERSION ":" DRIVER_DESC);
+	return 0;
+}
+
+static void __exit usb_cytherm_exit(void)
+{
+	usb_deregister(&cytherm_driver);
+}
+
+
+module_init (usb_cytherm_init);
+module_exit (usb_cytherm_exit);
+
+MODULE_AUTHOR(DRIVER_AUTHOR);
+MODULE_DESCRIPTION(DRIVER_DESC);
+MODULE_LICENSE("GPL");
--- diff/include/asm-arm/arch-omap/bus.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/bus.h	2004-04-21 10:45:35.809259664 +0100
@@ -0,0 +1,97 @@
+/*
+ * linux/include/asm-arm/arch-omap/bus.h
+ *
+ * Virtual bus for OMAP. Allows better power management, such as managing
+ * shared clocks, and mapping of bus addresses to Local Bus addresses.
+ *
+ * See drivers/usb/host/ohci-omap.c or drivers/video/omap/omapfb.c for
+ * examples on how to register drivers to this bus.
+ *
+ * Copyright (C) 2003 - 2004 Nokia Corporation
+ * Written by Tony Lindgren <tony@atomide.com>
+ * Portions of code based on sa1111.c.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef __ASM_ARM_ARCH_OMAP_BUS_H
+#define __ASM_ARM_ARCH_OMAP_BUS_H
+
+extern struct bus_type omap_bus_types[];
+
+/*
+ * Description for physical device
+ */
+struct omap_dev {
+	struct device	dev;		/* Standard device description */
+	char		*name;
+	unsigned int	devid;		/* OMAP device id */
+	unsigned int	busid;		/* OMAP virtual busid */
+	struct resource res;		/* Standard resource description */
+	void		*mapbase;	/* OMAP physical address */
+	unsigned int	irq[6];		/* OMAP interrupts */
+	u64		*dma_mask;	/* Used by USB OHCI only */
+};
+
+#define OMAP_DEV(_d)	container_of((_d), struct omap_dev, dev)
+
+#define omap_get_drvdata(d)	dev_get_drvdata(&(d)->dev)
+#define omap_set_drvdata(d,p)	dev_set_drvdata(&(d)->dev, p)
+
+/*
+ * Description for device driver
+ */
+struct omap_driver {
+	struct device_driver	drv;	/* Standard driver description */
+	unsigned int		devid;	/* OMAP device id for bus */
+	unsigned int		busid;	/* OMAP virtual busid */
+	unsigned int		clocks; /* OMAP shared clocks */
+	int (*probe)(struct omap_dev *);
+	int (*remove)(struct omap_dev *);
+	int (*suspend)(struct omap_dev *, u32);
+	int (*resume)(struct omap_dev *);
+};
+
+#define OMAP_DRV(_d)	container_of((_d), struct omap_driver, drv)
+#define OMAP_DRIVER_NAME(_omapdev) ((_omapdev)->dev.driver->name)
+
+/*
+ * Device ID numbers for bus types
+ */
+#define OMAP_OCP_DEVID_USB	0
+#define OMAP_TIPB_DEVID_LCD	1
+#define OMAP_TIPB_DEVID_MMC	2
+
+/*
+ * Virtual bus definitions for OMAP
+ */
+#define OMAP_NR_BUSES	2
+
+#define OMAP_BUS_NAME_TIPB	"tipb"
+#define OMAP_BUS_NAME_LBUS	"lbus"
+
+enum {
+	OMAP_BUS_TIPB = 0,
+	OMAP_BUS_LBUS,
+};
+
+/* See arch/arm/mach-omap/bus.c for the rest of the bus definitions. */
+
+extern int omap_driver_register(struct omap_driver *driver);
+extern void omap_driver_unregister(struct omap_driver *driver);
+extern int omap_device_register(struct omap_dev *odev);
+extern void omap_device_unregister(struct omap_dev *odev);
+
+#endif
--- diff/include/asm-arm/arch-omap/clocks.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/clocks.h	2004-04-21 10:45:35.810259512 +0100
@@ -0,0 +1,216 @@
+/*
+ * OMAP clock interface
+ *
+ * Copyright (C) 2001 RidgeRun, Inc
+ * Written by Gordon McNutt <gmcnutt@ridgerun.com>
+ * Updated 2004 for Linux 2.6 by Tony Lindgren <tony@atomide.com>
+ *
+ * This program is free software; you can redistribute	it and/or modify it
+ * under  the terms of	the GNU General	 Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the  GNU General Public License along
+ * with this program; if not, write  to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __ASM_ARM_CLOCKS_H
+#define __ASM_ARM_CLOCKS_H
+
+#include <linux/config.h>
+
+/* ARM_CKCTL bit shifts */
+#define PERDIV			0
+#define LCDDIV			2
+#define ARMDIV			4
+#define DSPDIV			6
+#define TCDIV			8
+#define DSPMMUDIV		10
+#define ARM_TIMXO		12
+#define EN_DSPCK		13
+#define ARM_INTHCK_SEL		14 /* REVISIT: Where is this used? */
+
+/* ARM_IDLECT1 bit shifts */
+#define IDLWDT_ARM	0
+#define IDLXORP_ARM	1
+#define IDLPER_ARM	2
+#define IDLLCD_ARM	3
+#define IDLLB_ARM	4
+#define IDLHSAB_ARM	5
+#define IDLIF_ARM	6
+#define IDLDPLL_ARM	7
+#define IDLAPI_ARM	8
+#define IDLTIM_ARM	9
+#define SETARM_IDLE	11
+
+/* ARM_IDLECT2 bit shifts */
+#define EN_WDTCK	0
+#define EN_XORPCK	1
+#define EN_PERCK	2
+#define EN_LCDCK	3
+#define EN_LBCK		4
+#define EN_HSABCK	5
+#define EN_APICK	6
+#define EN_TIMCK	7
+#define DMACK_REQ	8
+#define EN_GPIOCK	9
+#define EN_LBFREECK	10
+
+/*
+ * OMAP clocks
+ */
+typedef enum {
+	/* Fixed system clock */
+	OMAP_CLKIN = 0,
+
+	/* DPLL1 */
+	OMAP_CK_GEN1, OMAP_CK_GEN2, OMAP_CK_GEN3,
+
+	/* TC usually needs to be checked before anything else */
+	OMAP_TC_CK,
+
+	/* CLKM1 */
+	OMAP_ARM_CK, OMAP_MPUPER_CK, OMAP_ARM_GPIO_CK, OMAP_MPUXOR_CK,
+	OMAP_MPUTIM_CK, OMAP_MPUWD_CK,
+
+	/* CLKM2 */
+	OMAP_DSP_CK, OMAP_DSPMMU_CK,
+#if 0
+	/* Accessible only from the dsp */
+	OMAP_DSPPER_CK, OMAP_GPIO_CK, OMAP_DSPXOR_CK, OMAP_DSPTIM_CK,
+	OMAP_DSPWD_CK, OMAP_UART_CK,
+#endif
+	/* CLKM3 */
+	OMAP_DMA_CK, OMAP_API_CK, OMAP_HSAB_CK, OMAP_LBFREE_CK,
+	OMAP_LB_CK, OMAP_LCD_CK
+} ck_t;
+
+typedef enum {
+	/* Reset the MPU */
+	OMAP_ARM_RST,
+
+	/* Reset the DSP */
+	OMAP_DSP_RST,
+
+	/* Reset priority registers, EMIF config, and MPUI control logic */
+	OMAP_API_RST,
+
+	/* Reset DSP, MPU, and Peripherals */
+	OMAP_SW_RST,
+} reset_t;
+
+#define OMAP_CK_MIN			OMAP_CLKIN
+#define OMAP_CK_MAX			OMAP_LCD_CK
+
+#if defined(CONFIG_OMAP_ARM_30MHZ)
+#define OMAP_CK_MAX_RATE		30
+#elif defined(CONFIG_OMAP_ARM_60MHZ)
+#define OMAP_CK_MAX_RATE		60
+#elif defined(CONFIG_OMAP_ARM_96MHZ)
+#define OMAP_CK_MAX_RATE		96
+#elif defined(CONFIG_OMAP_ARM_120MHZ)
+#define OMAP_CK_MAX_RATE		120
+#elif defined(CONFIG_OMAP_ARM_168MHZ)
+#define OMAP_CK_MAX_RATE		168
+#elif defined(CONFIG_OMAP_ARM_182MHZ)
+#define OMAP_CK_MAX_RATE		182
+#elif defined(CONFIG_OMAP_ARM_192MHZ)
+#define OMAP_CK_MAX_RATE		192
+#elif defined(CONFIG_OMAP_ARM_195MHZ)
+#define OMAP_CK_MAX_RATE		195
+#endif
+
+#define CK_DPLL_MASK			0x0fe0
+
+/* Shared by CK and DSPC */
+#define MPUI_STROBE_MAX_1509		24
+#define MPUI_STROBE_MAX_1510		30
+
+/*
+ * ----------------------------------------------------------------------------
+ * Clock interface functions
+ * ----------------------------------------------------------------------------
+ */
+
+/*  Clock initialization.  */
+int init_ck(void);
+
+/*
+ * For some clocks you have a choice of which "parent" clocks they are derived
+ * from. Use this to select a "parent". See the platform documentation for
+ * valid combinations.
+ */
+int ck_can_set_input(ck_t);
+int ck_set_input(ck_t ck, ck_t input);
+int ck_get_input(ck_t ck, ck_t *input);
+
+/*
+ * Use this to set a clock rate. If other clocks are derived from this one,
+ * their rates will all change too. If this is a derived clock and I can't
+ * change it to match your request unless I also change the parent clock, then
+ * tough luck -- I won't change the parent automatically. I'll return an error
+ * if I can't get the clock within 10% of what you want. Otherwise I'll return
+ * the value I actually set it to. If I have to switch parents to get the rate
+ * then I will do this automatically (since it only affects this clock and its
+ * descendants).
+ */
+int ck_can_set_rate(ck_t);
+int ck_set_rate(ck_t ck, int val_in_mhz);
+int ck_get_rate(ck_t ck);
+
+/*
+ * Use this to get a bitmap of available rates for the clock. Caller allocates
+ *  the buffer and passes in the length. Clock module fills up to len bytes of
+ *  the buffer & passes back actual bytes used.
+ */
+int ck_get_rates(ck_t ck, void *buf, int len);
+int ck_valid_rate(int rate);
+
+/*
+ * Idle a clock. What happens next depends on the clock ;). For example, if
+ * you idle the ARM_CK you might well end up in sleep mode on some platforms.
+ * If you try to idle a clock that doesn't support it I'll return an error.
+ * Note that idling a clock does not always take affect until certain h/w
+ * conditions are met. Consult the platform specs to learn more.
+ */
+int ck_can_idle(ck_t);
+int ck_idle(ck_t);
+int ck_activate(ck_t);
+int ck_is_idle(ck_t);
+
+/*
+ * Enable/disable a clock. I'll return an error if the h/w doesn't support it.
+ * If you disable a clock being used by an active device then you probably
+ * just screwed it. YOU are responsible for making sure this doesn't happen.
+ */
+int ck_can_disable(ck_t);
+int ck_enable(ck_t);
+int ck_disable(ck_t);
+int ck_is_enabled(ck_t);
+
+/* Enable/reset ARM peripherals (remove/set reset signal) */
+void ck_enable_peripherals(void);
+void ck_reset_peripherals(void);
+
+/* Generate/clear a MPU or DSP reset */
+void ck_generate_reset(reset_t reset);
+void ck_release_from_reset(reset_t reset);
+
+/* This gets a string representation of the clock's name. Useful for proc. */
+char *ck_get_name(ck_t);
+
+extern void start_mputimer1(unsigned long);
+
+#endif
--- diff/include/asm-arm/arch-omap/dma.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/dma.h	2004-04-21 10:45:35.811259360 +0100
@@ -0,0 +1,224 @@
+/*
+ *  linux/include/asm-arm/arch-omap/dma.h
+ *
+ *  Copyright (C) 2003 Nokia Corporation
+ *  Author: Juha Yrjölä <juha.yrjola@nokia.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef __ASM_ARCH_DMA_H
+#define __ASM_ARCH_DMA_H
+
+#define MAX_DMA_ADDRESS			0xffffffff
+
+#define OMAP_LOGICAL_DMA_CH_COUNT	17
+
+#define OMAP_DMA_NO_DEVICE		0
+#define OMAP_DMA_MCSI1_TX		1
+#define OMAP_DMA_MCSI1_RX		2
+#define OMAP_DMA_I2C_RX			3
+#define OMAP_DMA_I2C_TX			4
+#define OMAP_DMA_EXT_NDMA_REQ		5
+#define OMAP_DMA_EXT_NDMA_REQ2		6
+#define OMAP_DMA_UWIRE_TX		7
+#define OMAP_DMA_MCBSP1_DMA_TX		8
+#define OMAP_DMA_MCBSP1_DMA_RX		9
+#define OMAP_DMA_MCBSP3_DMA_TX		10
+#define OMAP_DMA_MCBSP3_DMA_RX		11
+#define OMAP_DMA_UART1_TX		12
+#define OMAP_DMA_UART1_RX		13
+#define OMAP_DMA_UART2_TX		14
+#define OMAP_DMA_UART2_RX		15
+#define OMAP_DMA_MCBSP2_TX		16
+#define OMAP_DMA_MCBSP2_RX		17
+#define OMAP_DMA_UART3_TX		18
+#define OMAP_DMA_UART3_RX		19
+#define OMAP_DMA_CAMERA_IF_RX		20
+#define OMAP_DMA_MMC_TX			21
+#define OMAP_DMA_MMC_RX			22
+#define OMAP_DMA_NAND			23
+#define OMAP_DMA_IRQ_LCD_LINE		24
+#define OMAP_DMA_MEMORY_STICK		25
+#define OMAP_DMA_USB_W2FC_RX0		26
+#define OMAP_DMA_USB_W2FC_RX1		27
+#define OMAP_DMA_USB_W2FC_RX2		28
+#define OMAP_DMA_USB_W2FC_TX0		29
+#define OMAP_DMA_USB_W2FC_TX1		30
+#define OMAP_DMA_USB_W2FC_TX2		31
+
+/* These are only for 1610 */
+#define OMAP_DMA_CRYPTO_DES_IN		32
+#define OMAP_DMA_SPI_TX			33
+#define OMAP_DMA_SPI_RX			34
+#define OMAP_DMA_CRYPTO_HASH		35
+#define OMAP_DMA_CCP_ATTN		36
+#define OMAP_DMA_CCP_FIFO_NOT_EMPTY	37
+#define OMAP_DMA_CMT_APE_TX_CHAN_0	38
+#define OMAP_DMA_CMT_APE_RV_CHAN_0	39
+#define OMAP_DMA_CMT_APE_TX_CHAN_1	40
+#define OMAP_DMA_CMT_APE_RV_CHAN_1	41
+#define OMAP_DMA_CMT_APE_TX_CHAN_2	42
+#define OMAP_DMA_CMT_APE_RV_CHAN_2	43
+#define OMAP_DMA_CMT_APE_TX_CHAN_3	44
+#define OMAP_DMA_CMT_APE_RV_CHAN_3	45
+#define OMAP_DMA_CMT_APE_TX_CHAN_4	46
+#define OMAP_DMA_CMT_APE_RV_CHAN_4	47
+#define OMAP_DMA_CMT_APE_TX_CHAN_5	48
+#define OMAP_DMA_CMT_APE_RV_CHAN_5	49
+#define OMAP_DMA_CMT_APE_TX_CHAN_6	50
+#define OMAP_DMA_CMT_APE_RV_CHAN_6	51
+#define OMAP_DMA_CMT_APE_TX_CHAN_7	52
+#define OMAP_DMA_CMT_APE_RV_CHAN_7	53
+#define OMAP_DMA_MMC2_TX		54
+#define OMAP_DMA_MMC2_RX		55
+#define OMAP_DMA_CRYPTO_DES_OUT		56
+
+
+#define OMAP_DMA_BASE			0xfffed800
+#define OMAP_DMA_GCR_REG		(OMAP_DMA_BASE + 0x400)
+#define OMAP_DMA_GSCR_REG		(OMAP_DMA_BASE + 0x404)
+#define OMAP_DMA_GRST_REG		(OMAP_DMA_BASE + 0x408)
+#define OMAP_DMA_HW_ID_REG		(OMAP_DMA_BASE + 0x442)
+#define OMAP_DMA_PCH2_ID_REG		(OMAP_DMA_BASE + 0x444)
+#define OMAP_DMA_PCH0_ID		(OMAP_DMA_BASE + 0x446)
+#define OMAP_DMA_PCH1_ID		(OMAP_DMA_BASE + 0x448)
+#define OMAP_DMA_PCHG_ID		(OMAP_DMA_BASE + 0x44a)
+#define OMAP_DMA_PCHD_ID		(OMAP_DMA_BASE + 0x44c)
+#define OMAP_DMA_CAPS_0_U_REG		(OMAP_DMA_BASE + 0x44e)
+#define OMAP_DMA_CAPS_0_L_REG		(OMAP_DMA_BASE + 0x450)
+#define OMAP_DMA_CAPS_1_U_REG		(OMAP_DMA_BASE + 0x452)
+#define OMAP_DMA_CAPS_1_L_REG		(OMAP_DMA_BASE + 0x454)
+#define OMAP_DMA_CAPS_2_REG		(OMAP_DMA_BASE + 0x456)
+#define OMAP_DMA_CAPS_3_REG		(OMAP_DMA_BASE + 0x458)
+#define OMAP_DMA_CAPS_4_REG		(OMAP_DMA_BASE + 0x45a)
+#define OMAP_DMA_PCH2_SR_REG		(OMAP_DMA_BASE + 0x460)
+#define OMAP_DMA_PCH0_SR_REG		(OMAP_DMA_BASE + 0x480)
+#define OMAP_DMA_PCH1_SR_REG		(OMAP_DMA_BASE + 0x482)
+#define OMAP_DMA_PCHD_SR_REG		(OMAP_DMA_BASE + 0x4c0)
+
+#define OMAP1510_DMA_LCD_CTRL		0xfffedb00
+#define OMAP1510_DMA_LCD_TOP_F1_L	0xfffedb02
+#define OMAP1510_DMA_LCD_TOP_F1_U	0xfffedb04
+#define OMAP1510_DMA_LCD_BOT_F1_L	0xfffedb06
+#define OMAP1510_DMA_LCD_BOT_F1_U	0xfffedb08
+
+#define OMAP1610_DMA_LCD_CSDP		0xfffee3c0
+#define OMAP1610_DMA_LCD_CCR		0xfffee3c2
+#define OMAP1610_DMA_LCD_CTRL		0xfffee3c4
+#define OMAP1610_DMA_LCD_TOP_B1_L	0xfffee3c8
+#define OMAP1610_DMA_LCD_TOP_B1_U	0xfffee3ca
+#define OMAP1610_DMA_LCD_BOT_B1_L	0xfffee3cc
+#define OMAP1610_DMA_LCD_BOT_B1_U	0xfffee3ce
+#define OMAP1610_DMA_LCD_TOP_B2_L	0xfffee3d0
+#define OMAP1610_DMA_LCD_TOP_B2_U	0xfffee3d2
+#define OMAP1610_DMA_LCD_BOT_B2_L	0xfffee3d4
+#define OMAP1610_DMA_LCD_BOT_B2_U	0xfffee3d6
+#define OMAP1610_DMA_LCD_SRC_EI_B1	0xfffee3d8
+#define OMAP1610_DMA_LCD_SRC_FI_B1_L	0xfffee3da
+#define OMAP1610_DMA_LCD_SRC_EN_B1	0xfffee3e0
+#define OMAP1610_DMA_LCD_SRC_FN_B1	0xfffee3e4
+#define OMAP1610_DMA_LCD_LCH_CTRL	0xfffee3ea
+#define OMAP1610_DMA_LCD_SRC_FI_B1_U	0xfffee3f4
+
+
+/* Every LCh has its own set of the registers below */
+#define OMAP_DMA_CSDP_REG(n)		(OMAP_DMA_BASE + 0x40 * (n) + 0x00)
+#define OMAP_DMA_CCR_REG(n)		(OMAP_DMA_BASE + 0x40 * (n) + 0x02)
+#define OMAP_DMA_CICR_REG(n)		(OMAP_DMA_BASE + 0x40 * (n) + 0x04)
+#define OMAP_DMA_CSR_REG(n)		(OMAP_DMA_BASE + 0x40 * (n) + 0x06)
+#define OMAP_DMA_CSSA_L_REG(n)		(OMAP_DMA_BASE + 0x40 * (n) + 0x08)
+#define OMAP_DMA_CSSA_U_REG(n)		(OMAP_DMA_BASE + 0x40 * (n) + 0x0a)
+#define OMAP_DMA_CDSA_L_REG(n)		(OMAP_DMA_BASE + 0x40 * (n) + 0x0c)
+#define OMAP_DMA_CDSA_U_REG(n)		(OMAP_DMA_BASE + 0x40 * (n) + 0x0e)
+#define OMAP_DMA_CEN_REG(n)		(OMAP_DMA_BASE + 0x40 * (n) + 0x10)
+#define OMAP_DMA_CFN_REG(n)		(OMAP_DMA_BASE + 0x40 * (n) + 0x12)
+#define OMAP_DMA_CSFI_REG(n)		(OMAP_DMA_BASE + 0x40 * (n) + 0x14)
+#define OMAP_DMA_CSEI_REG(n)		(OMAP_DMA_BASE + 0x40 * (n) + 0x16)
+#define OMAP_DMA_CSAC_REG(n)		(OMAP_DMA_BASE + 0x40 * (n) + 0x18)
+#define OMAP_DMA_CDAC_REG(n)		(OMAP_DMA_BASE + 0x40 * (n) + 0x1a)
+#define OMAP_DMA_CDEI_REG(n)		(OMAP_DMA_BASE + 0x40 * (n) + 0x1c)
+#define OMAP_DMA_CDFI_REG(n)		(OMAP_DMA_BASE + 0x40 * (n) + 0x1e)
+#define OMAP_DMA_COLOR_L_REG(n)		(OMAP_DMA_BASE + 0x40 * (n) + 0x20)
+#define OMAP_DMA_COLOR_U_REG(n)		(OMAP_DMA_BASE + 0x40 * (n) + 0x22)
+#define OMAP_DMA_CCR2_REG(n)		(OMAP_DMA_BASE + 0x40 * (n) + 0x24)
+#define OMAP_DMA_CLNK_CTRL_REG(n)	(OMAP_DMA_BASE + 0x40 * (n) + 0x28)
+#define OMAP_DMA_LCH_CTRL_REG(n)	(OMAP_DMA_BASE + 0x40 * (n) + 0x2a)
+
+#define OMAP_DMA_TOUT_IRQ		(1 << 0)
+#define OMAP_DMA_DROP_IRQ		(1 << 1)
+#define OMAP_DMA_HALF_IRQ		(1 << 2)
+#define OMAP_DMA_FRAME_IRQ		(1 << 3)
+#define OMAP_DMA_LAST_IRQ		(1 << 4)
+#define OMAP_DMA_BLOCK_IRQ		(1 << 5)
+#define OMAP_DMA_SYNC_IRQ		(1 << 6)
+
+#define OMAP_DMA_DATA_TYPE_S8		0x00
+#define OMAP_DMA_DATA_TYPE_S16		0x01
+#define OMAP_DMA_DATA_TYPE_S32		0x02
+
+#define OMAP_DMA_SYNC_ELEMENT		0x00
+#define OMAP_DMA_SYNC_FRAME		0x01
+#define OMAP_DMA_SYNC_BLOCK		0x02
+
+#define OMAP_DMA_PORT_EMIFF		0x00
+#define OMAP_DMA_PORT_EMIFS		0x01
+#define OMAP_DMA_PORT_OCP_T1		0x02
+#define OMAP_DMA_PORT_TIPB		0x03
+#define OMAP_DMA_PORT_OCP_T2		0x04
+#define OMAP_DMA_PORT_MPUI		0x05
+
+#define OMAP_DMA_AMODE_CONSTANT		0x00
+#define OMAP_DMA_AMODE_POST_INC		0x01
+#define OMAP_DMA_AMODE_SINGLE_IDX	0x02
+#define OMAP_DMA_AMODE_DOUBLE_IDX	0x03
+
+/* LCD DMA block numbers */
+enum {
+	OMAP_LCD_DMA_B1_TOP,
+	OMAP_LCD_DMA_B1_BOTTOM,
+	OMAP_LCD_DMA_B2_TOP,
+	OMAP_LCD_DMA_B2_BOTTOM
+};
+
+extern int omap_request_dma(int dev_id, const char *dev_name,
+			    void (* callback)(int lch, u16 ch_status, void *data),
+			    void *data, int *dma_ch);
+extern void omap_enable_dma_irq(int ch, u16 irq_bits);
+extern void omap_disable_dma_irq(int ch, u16 irq_bits);
+extern void omap_free_dma(int ch);
+extern void omap_start_dma(int lch);
+extern void omap_stop_dma(int lch);
+extern void omap_set_dma_transfer_params(int lch, int data_type,
+					 int elem_count, int frame_count,
+					 int sync_mode);
+extern void omap_set_dma_src_params(int lch, int src_port, int src_amode,
+				    unsigned long src_start);
+extern void omap_set_dma_dest_params(int lch, int dest_port, int dest_amode,
+				     unsigned long dest_start);
+
+/* Returns 1 if the DMA module is in OMAP1510-compatible mode, 0 otherwise */
+extern int omap_dma_in_1510_mode(void);
+
+/* LCD DMA functions */
+extern int omap_request_lcd_dma(void (* callback)(u16 status, void *data),
+				void *data);
+extern void omap_free_lcd_dma(void);
+extern void omap_start_lcd_dma(void);
+extern void omap_stop_lcd_dma(void);
+extern void omap_set_lcd_dma_b1(unsigned long addr, u16 fb_xres, u16 fb_yres,
+				int data_type);
+extern void omap_set_lcd_dma_b1_rotation(int rotate);
+
+#endif /* __ASM_ARCH_DMA_H */
--- diff/include/asm-arm/arch-omap/fpga.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/fpga.h	2004-04-21 10:45:35.811259360 +0100
@@ -0,0 +1,26 @@
+/*
+ * linux/include/asm-arm/arch-omap/fpga.h
+ *
+ * Interrupt handler for OMAP-1510 FPGA
+ *
+ * Copyright (C) 2001 RidgeRun, Inc.
+ * Author: Greg Lonnon <glonnon@ridgerun.com>
+ *
+ * Copyright (C) 2002 MontaVista Software, Inc.
+ *
+ * Separated FPGA interrupts from innovator1510.c and cleaned up for 2.6
+ * Copyright (C) 2004 Nokia Corporation by Tony Lindrgen <tony@atomide.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __ASM_ARCH_OMAP_FPGA_H
+#define __ASM_ARCH_OMAP_FPGA_H
+
+extern void fpga_init_irq(void);
+extern unsigned char fpga_read(int reg);
+extern void fpga_write(unsigned char val, int reg);
+
+#endif
--- diff/include/asm-arm/arch-omap/gpio.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/gpio.h	2004-04-21 10:45:35.811259360 +0100
@@ -0,0 +1,68 @@
+/*
+ * linux/include/asm-arm/arch-omap/gpio.h
+ *
+ * OMAP GPIO handling defines and functions
+ *
+ * Copyright (C) 2003 Nokia Corporation
+ *
+ * Written by Juha Yrjölä <juha.yrjola@nokia.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#ifndef __ASM_ARCH_OMAP_GPIO_H
+#define __ASM_ARCH_OMAP_GPIO_H
+
+#include <asm/arch/hardware.h>
+#include <asm/arch/irqs.h>
+#include <asm/io.h>
+
+#define OMAP_MPUIO_BASE			0xfffb5000
+#define OMAP_MPUIO_INPUT_LATCH		0x00
+#define OMAP_MPUIO_OUTPUT_REG		0x04
+#define OMAP_MPUIO_IO_CNTL		0x08
+#define OMAP_MPUIO_KBR_LATCH		0x10
+#define OMAP_MPUIO_KBC_REG		0x14
+#define OMAP_MPUIO_GPIO_EVENT_MODE_REG	0x18
+#define OMAP_MPUIO_GPIO_INT_EDGE_REG	0x1c
+#define OMAP_MPUIO_KBD_INT		0x20
+#define OMAP_MPUIO_GPIO_INT		0x24
+#define OMAP_MPUIO_KBD_MASKIT		0x28
+#define OMAP_MPUIO_GPIO_MASKIT		0x2c
+#define OMAP_MPUIO_GPIO_DEBOUNCING_REG	0x30
+#define OMAP_MPUIO_LATCH_REG		0x34
+
+#define OMAP_MPUIO(nr)		(OMAP_MAX_GPIO_LINES + (nr))
+#define OMAP_GPIO_IS_MPUIO(nr)	((nr) >= OMAP_MAX_GPIO_LINES)
+
+#define OMAP_GPIO_IRQ(nr)	(OMAP_GPIO_IS_MPUIO(nr) ? \
+				 IH_MPUIO_BASE + ((nr) & 0x0f) : \
+				 IH_GPIO_BASE + ((nr) & 0x3f))
+
+/* For EDGECTRL */
+#define OMAP_GPIO_NO_EDGE	  0x00
+#define OMAP_GPIO_FALLING_EDGE	  0x01
+#define OMAP_GPIO_RISING_EDGE	  0x02
+#define OMAP_GPIO_BOTH_EDGES	  0x03
+
+extern int omap_request_gpio(int gpio);
+extern void omap_free_gpio(int gpio);
+extern void omap_set_gpio_direction(int gpio, int is_input);
+extern void omap_set_gpio_dataout(int gpio, int enable);
+extern int omap_get_gpio_datain(int gpio);
+extern void omap_set_gpio_edge_ctrl(int gpio, int edge);
+
+#endif
--- diff/include/asm-arm/arch-omap/hardware.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/hardware.h	2004-04-21 10:45:35.812259208 +0100
@@ -0,0 +1,327 @@
+/*
+ * linux/include/asm-arm/arch-omap/hardware.h
+ *
+ * Hardware definitions for TI OMAP processors and boards
+ *
+ * NOTE: Please put device driver specific defines into a separate header
+ *	 file for each driver.
+ *
+ * Copyright (C) 2001 RidgeRun, Inc.
+ * Author: RidgeRun, Inc. Greg Lonnon <glonnon@ridgerun.com>
+ *
+ * Reorganized for Linux-2.6 by Tony Lindgren <tony@atomide.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __ASM_ARCH_OMAP_HARDWARE_H
+#define __ASM_ARCH_OMAP_HARDWARE_H
+
+#include <asm/sizes.h>
+#include <linux/config.h>
+#ifndef __ASSEMBLER__
+#include <asm/types.h>
+#endif
+#include <asm/mach-types.h>
+
+/*
+ * ----------------------------------------------------------------------------
+ * I/O mapping
+ * ----------------------------------------------------------------------------
+ */
+#define IO_BASE			0xFFFB0000	/* Virtual */
+#define IO_SIZE			0x40000
+#define IO_START		0xFFFB0000	/* Physical */
+
+#define PCIO_BASE		0
+
+#define IO_ADDRESS(x)		((x))
+
+/*
+ * ---------------------------------------------------------------------------
+ * Processor differentiation
+ * ---------------------------------------------------------------------------
+ */
+
+#ifdef CONFIG_ARCH_OMAP730
+#include "omap730.h"
+#define cpu_is_omap730()	(1)
+#else
+#define cpu_is_omap730()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_OMAP1510
+#include "omap1510.h"
+#define cpu_is_omap1510()	(1)
+#else
+#define cpu_is_omap1510()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_OMAP1610
+#include "omap1610.h"
+#define cpu_is_omap1610()	(1)
+#else
+#define cpu_is_omap1610()	(0)
+#endif
+
+/*
+ * ---------------------------------------------------------------------------
+ * Board differentiation
+ * ---------------------------------------------------------------------------
+ */
+
+#ifdef CONFIG_OMAP_INNOVATOR
+#include "omap-innovator.h"
+#define omap_is_innovator()	(1)
+#else
+#define omap_is_innovator()	(0)
+#endif
+
+#ifdef CONFIG_MACH_OMAP_H2
+#include "omap-h2.h"
+#define omap_is_h2()		(1)
+#else
+#define omap_is_h2()		(0)
+#endif
+
+#ifdef CONFIG_MACH_OMAP_PERSEUS2
+#include "omap-perseus2.h"
+#define omap_is_perseus2()	(1)
+#else
+#define omap_is_perseus2()	(0)
+#endif
+
+/*
+ * ---------------------------------------------------------------------------
+ * Common definitions for all OMAP processors
+ * NOTE: Put all processor or board specific parts to the special header
+ *	 files.
+ * ---------------------------------------------------------------------------
+ */
+
+/*
+ * ----------------------------------------------------------------------------
+ * Base addresses
+ * ----------------------------------------------------------------------------
+ */
+
+/* Syntax: XX_BASE = Virtual base address, XX_START = Physical base address */
+
+#define OMAP_DSP_BASE		0xE0000000
+#define OMAP_DSP_SIZE		0x50000
+#define OMAP_DSP_START		0xE0000000
+
+#define OMAP_DSPREG_BASE	0xE1000000
+#define OMAP_DSPREG_SIZE	SZ_128K
+#define OMAP_DSPREG_START	0xE1000000
+
+/*
+ * ----------------------------------------------------------------------------
+ * Clocks
+ * ----------------------------------------------------------------------------
+ */
+#define CLKGEN_RESET_BASE	(0xfffece00)
+#define ARM_CKCTL		(volatile __u16 *)(CLKGEN_RESET_BASE + 0x0)
+#define ARM_IDLECT1		(volatile __u16 *)(CLKGEN_RESET_BASE + 0x4)
+#define ARM_IDLECT2		(volatile __u16 *)(CLKGEN_RESET_BASE + 0x8)
+#define ARM_EWUPCT		(volatile __u16 *)(CLKGEN_RESET_BASE + 0xC)
+#define ARM_RSTCT1		(volatile __u16 *)(CLKGEN_RESET_BASE + 0x10)
+#define ARM_RSTCT2		(volatile __u16 *)(CLKGEN_RESET_BASE + 0x14)
+#define ARM_SYSST		(volatile __u16 *)(CLKGEN_RESET_BASE + 0x18)
+
+#define CK_RATEF		1
+#define CK_IDLEF		2
+#define CK_ENABLEF		4
+#define CK_SELECTF		8
+#define SETARM_IDLE_SHIFT
+
+/* DPLL control registers */
+#define DPLL_CTL_REG		(volatile __u16 *)(0xfffecf00)
+#define CK_DPLL1		(volatile __u16 *)(0xfffecf00)
+
+/* ULPD */
+#define ULPD_REG_BASE		(0xfffe0800)
+#define ULPD_IT_STATUS_REG	(volatile __u16 *)(ULPD_REG_BASE + 0x14)
+#define ULPD_CLOCK_CTRL_REG	(volatile __u16 *)(ULPD_REG_BASE + 0x30)
+#define ULPD_SOFT_REQ_REG	(volatile __u16 *)(ULPD_REG_BASE + 0x34)
+#define ULPD_DPLL_CTRL_REG	(volatile __u16 *)(ULPD_REG_BASE + 0x3c)
+#define ULPD_STATUS_REQ_REG	(volatile __u16 *)(ULPD_REG_BASE + 0x40)
+#define ULPD_APLL_CTRL_REG	(volatile __u16 *)(ULPD_REG_BASE + 0x4c)
+#define ULPD_POWER_CTRL_REG	(volatile __u16 *)(ULPD_REG_BASE + 0x50)
+#define ULPD_CAM_CLK_CTRL_REG	(volatile __u16 *)(ULPD_REG_BASE + 0x7c)
+
+/*
+ * ---------------------------------------------------------------------------
+ * Timers
+ * ---------------------------------------------------------------------------
+ */
+#define OMAP_32kHz_TIMER_BASE 0xfffb9000
+
+/* 32k Timer Registers */
+#define TIMER32k_CR		0x08
+#define TIMER32k_TVR		0x00
+#define TIMER32k_TCR		0x04
+
+/* 32k Timer Control Register definition */
+#define TIMER32k_TSS		(1<<0)
+#define TIMER32k_TRB		(1<<1)
+#define TIMER32k_INT		(1<<2)
+#define TIMER32k_ARL		(1<<3)
+
+/* MPU Timer base addresses */
+#define OMAP_MPUTIMER_BASE	0xfffec500
+#define OMAP_MPUTIMER_OFF	0x00000100
+
+#define OMAP_TIMER1_BASE	0xfffec500
+#define OMAP_TIMER2_BASE	0xfffec600
+#define OMAP_TIMER3_BASE	0xfffec700
+#define OMAP_WATCHDOG_BASE	0xfffec800
+
+/* MPU Timer Registers */
+#define CNTL_TIMER		0
+#define LOAD_TIM		4
+#define READ_TIM		8
+
+/* CNTL_TIMER register bits */
+#define MPUTIM_FREE		(1<<6)
+#define MPUTIM_CLOCK_ENABLE	(1<<5)
+#define MPUTIM_PTV_MASK		(0x7<<PTV_BIT)
+#define MPUTIM_PTV_BIT		2
+#define MPUTIM_AR		(1<<1)
+#define MPUTIM_ST		(1<<0)
+
+/*
+ * ---------------------------------------------------------------------------
+ * Interrupts
+ * ---------------------------------------------------------------------------
+ */
+#define OMAP_IH1_BASE		0xfffecb00
+#define OMAP_IH2_BASE		0xfffe0000
+#define OMAP_ITR		0x0
+#define OMAP_MASK		0x4
+
+#define IRQ_ITR			0x00
+#define IRQ_MIR			0x04
+#define IRQ_SIR_IRQ		0x10
+#define IRQ_SIR_FIQ		0x14
+#define IRQ_CONTROL_REG		0x18
+#define IRQ_ISR			0x9c
+#define IRQ_ILR0		0x1c
+
+/* OMAP-1610 specific interrupt handler registers */
+#define OMAP_IH2_SECT1		(OMAP_IH2_BASE)
+#define OMAP_IH2_SECT2		(OMAP_IH2_BASE + 0x100)
+#define OMAP_IH2_SECT3		(OMAP_IH2_BASE + 0x200)
+#define OMAP_IH2_SECT4		(OMAP_IH2_BASE + 0x300)
+
+/*
+ * ---------------------------------------------------------------------------
+ * Traffic controller memory interface
+ * ---------------------------------------------------------------------------
+ */
+#define TCMIF_BASE		0xfffecc00
+#define IMIF_PRIO		(TCMIF_BASE + 0x00)
+#define EMIFS_PRIO_REG		(TCMIF_BASE + 0x04)
+#define EMIFF_PRIO_REG		(TCMIF_BASE + 0x08)
+#define EMIFS_CONFIG_REG	(TCMIF_BASE + 0x0c)
+#define EMIFS_CS0_CONFIG	(TCMIF_BASE + 0x10)
+#define EMIFS_CS1_CONFIG	(TCMIF_BASE + 0x14)
+#define EMIFS_CS2_CONFIG	(TCMIF_BASE + 0x18)
+#define EMIFS_CS3_CONFIG	(TCMIF_BASE + 0x1c)
+#define EMIFF_SDRAM_CONFIG	(TCMIF_BASE + 0x20)
+#define EMIFF_MRS		(TCMIF_BASE + 0x24)
+#define TC_TIMEOUT1		(TCMIF_BASE + 0x28)
+#define TC_TIMEOUT2		(TCMIF_BASE + 0x2c)
+#define TC_TIMEOUT3		(TCMIF_BASE + 0x30)
+#define TC_ENDIANISM		(TCMIF_BASE + 0x34)
+#define EMIFF_SDRAM_CONFIG_2	(TCMIF_BASE + 0x3c)
+#define EMIF_CFG_DYNAMIC_WS	(TCMIF_BASE + 0x40)
+
+/*
+ * ----------------------------------------------------------------------------
+ * System control registers
+ * ----------------------------------------------------------------------------
+ */
+#define MOD_CONF_CTRL_0		0xfffe1080
+
+/*
+ * ----------------------------------------------------------------------------
+ * Pin multiplexing registers
+ * ----------------------------------------------------------------------------
+ */
+#define FUNC_MUX_CTRL_0		0xfffe1000
+#define FUNC_MUX_CTRL_1		0xfffe1004
+#define FUNC_MUX_CTRL_2		0xfffe1008
+#define COMP_MODE_CTRL_0	0xfffe100c
+#define FUNC_MUX_CTRL_3		0xfffe1010
+#define FUNC_MUX_CTRL_4		0xfffe1014
+#define FUNC_MUX_CTRL_5		0xfffe1018
+#define FUNC_MUX_CTRL_6		0xfffe101C
+#define FUNC_MUX_CTRL_7		0xfffe1020
+#define FUNC_MUX_CTRL_8		0xfffe1024
+#define FUNC_MUX_CTRL_9		0xfffe1028
+#define FUNC_MUX_CTRL_A		0xfffe102C
+#define FUNC_MUX_CTRL_B		0xfffe1030
+#define FUNC_MUX_CTRL_C		0xfffe1034
+#define FUNC_MUX_CTRL_D		0xfffe1038
+#define PULL_DWN_CTRL_0		0xfffe1040
+#define PULL_DWN_CTRL_1		0xfffe1044
+#define PULL_DWN_CTRL_2		0xfffe1048
+#define PULL_DWN_CTRL_3		0xfffe104c
+
+/* OMAP-1610 specific multiplexing registers */
+#define FUNC_MUX_CTRL_E		0xfffe1090
+#define FUNC_MUX_CTRL_F		0xfffe1094
+#define FUNC_MUX_CTRL_10	0xfffe1098
+#define FUNC_MUX_CTRL_11	0xfffe109c
+#define FUNC_MUX_CTRL_12	0xfffe10a0
+#define PU_PD_SEL_0		0xfffe10b4
+#define PU_PD_SEL_1		0xfffe10b8
+#define PU_PD_SEL_2		0xfffe10bc
+#define PU_PD_SEL_3		0xfffe10c0
+#define PU_PD_SEL_4		0xfffe10c4
+
+/*
+ * ---------------------------------------------------------------------------
+ * TIPB bus interface
+ * ---------------------------------------------------------------------------
+ */
+#define TIPB_PUBLIC_CNTL_BASE		0xfffed300
+#define MPU_PUBLIC_TIPB_CNTL_REG	(TIPB_PUBLIC_CNTL_BASE + 0x8)
+#define TIPB_PRIVATE_CNTL_BASE		0xfffeca00
+#define MPU_PRIVATE_TIPB_CNTL_REG	(TIPB_PRIVATE_CNTL_BASE + 0x8)
+
+/*
+ * ----------------------------------------------------------------------------
+ * DSP control registers
+ * ----------------------------------------------------------------------------
+ */
+/*  MPUI Interface Registers */
+#define MPUI_CTRL_REG		(volatile __u32 *)(0xfffec900)
+#define MPUI_DEBUG_ADDR		(volatile __u32 *)(0xfffec904)
+#define MPUI_DEBUG_DATA		(volatile __u32 *)(0xfffec908)
+#define MPUI_DEBUG_FLAG		(volatile __u16 *)(0xfffec90c)
+#define MPUI_STATUS_REG		(volatile __u16 *)(0xfffec910)
+#define MPUI_DSP_STATUS_REG	(volatile __u16 *)(0xfffec914)
+#define MPUI_DSP_BOOT_CONFIG	(volatile __u16 *)(0xfffec918)
+#define MPUI_DSP_API_CONFIG	(volatile __u16 *)(0xfffec91c)
+
+#endif	/* __ASM_ARCH_OMAP_HARDWARE_H */
--- diff/include/asm-arm/arch-omap/io.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/io.h	2004-04-21 10:45:35.812259208 +0100
@@ -0,0 +1,24 @@
+/*
+ * linux/include/asm-arm/arch-omap/io.h
+ *
+ * Copied from linux/include/asm-arm/arch-sa1100/io.h
+ * Copyright (C) 1997-1999 Russell King
+ *
+ * Modifications:
+ *  06-12-1997	RMK	Created.
+ *  07-04-1999	RMK	Major cleanup
+ */
+#ifndef __ASM_ARM_ARCH_IO_H
+#define __ASM_ARM_ARCH_IO_H
+
+#define IO_SPACE_LIMIT 0xffffffff
+
+/*
+ * We don't actually have real ISA nor PCI buses, but there is so many
+ * drivers out there that might just work if we fake them...
+ */
+#define __io(a)			(PCIO_BASE + (a))
+#define __mem_pci(a)		((unsigned long)(a))
+#define __mem_isa(a)		((unsigned long)(a))
+
+#endif
--- diff/include/asm-arm/arch-omap/irqs.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/irqs.h	2004-04-21 10:45:35.813259056 +0100
@@ -0,0 +1,262 @@
+/*
+ *  linux/include/asm-arm/arch-omap/irqs.h
+ *
+ *  Copyright (C) Greg Lonnon 2001
+ *  Updated for OMAP-1610 by Tony Lindgren <tony@atomide.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * NOTE: The interrupt vectors for the OMAP-1509, OMAP-1510, and OMAP-1610
+ *	 are different.
+ */
+
+#ifndef __ASM_ARCH_OMAP1510_IRQS_H
+#define __ASM_ARCH_OMAP1510_IRQS_H
+
+/*
+ * IRQ numbers for interrupt handler 1
+ *
+ * NOTE: See also the OMAP-1510 and 1610 specific IRQ numbers below
+ *
+ */
+#define INT_IH2_IRQ		0
+#define INT_CAMERA		1
+#define INT_FIQ			3
+#define INT_RTDX		6
+#define INT_DSP_MMU_ABORT	7
+#define INT_HOST		8
+#define INT_ABORT		9
+#define INT_DSP_MAILBOX1	10
+#define INT_DSP_MAILBOX2	11
+#define INT_BRIDGE_PRIV		13
+#define INT_GPIO_BANK1		14
+#define INT_UART3		15
+#define INT_TIMER3		16
+#define INT_DMA_CH0_6		19
+#define INT_DMA_CH1_7		20
+#define INT_DMA_CH2_8		21
+#define INT_DMA_CH3		22
+#define INT_DMA_CH4		23
+#define INT_DMA_CH5		24
+#define INT_DMA_LCD		25
+#define INT_TIMER1		26
+#define INT_WD_TIMER		27
+#define INT_BRIDGE_PUB		28
+#define INT_TIMER2		30
+#define INT_LCD_CTRL		31
+
+/*
+ * OMAP-1510 specific IRQ numbers for interrupt handler 1
+ */
+#define INT_1510_RES2		2
+#define INT_1510_SPI_TX		4
+#define INT_1510_SPI_RX		5
+#define INT_1510_RES12		12
+#define INT_1510_LB_MMU		17
+#define INT_1510_RES18		18
+#define INT_1510_LOCAL_BUS	29
+
+/*
+ * OMAP-1610 specific IRQ numbers for interrupt handler 1
+ */
+#define INT_1610_IH2_FIQ	2
+#define INT_1610_McBSP2_TX	4
+#define INT_1610_McBSP2_RX	5
+#define INT_1610_LCD_LINE	12
+#define INT_1610_GPTIMER1	17
+#define INT_1610_GPTIMER2	18
+#define INT_1610_SSR_FIFO_0	29
+
+/*
+ * OMAP-730 specific IRQ numbers for interrupt handler 1
+ */
+#define INT_730_IH2_FIQ		0
+#define INT_730_IH2_IRQ		1
+#define INT_730_USB_NON_ISO	2
+#define INT_730_USB_ISO		3
+#define INT_730_ICR		4
+#define INT_730_EAC		5
+#define INT_730_GPIO_BANK1	6
+#define INT_730_GPIO_BANK2	7
+#define INT_730_GPIO_BANK3	8
+#define INT_730_McBSP2TX	10
+#define INT_730_McBSP2RX	11
+#define INT_730_McBSP2RX_OVF	12
+#define INT_730_LCD_LINE	14
+#define INT_730_GSM_PROTECT	15
+#define INT_730_TIMER3		16
+#define INT_730_GPIO_BANK5	17
+#define INT_730_GPIO_BANK6	18
+#define INT_730_SPGIO_WR	29
+
+/*
+ * IRQ numbers for interrupt handler 2
+ *
+ * NOTE: See also the OMAP-1510 and 1610 specific IRQ numbers below
+ */
+#define IH2_BASE		32
+
+#define INT_KEYBOARD		(1 + IH2_BASE)
+#define INT_uWireTX		(2 + IH2_BASE)
+#define INT_uWireRX		(3 + IH2_BASE)
+#define INT_I2C			(4 + IH2_BASE)
+#define INT_MPUIO		(5 + IH2_BASE)
+#define INT_USB_HHC_1		(6 + IH2_BASE)
+#define INT_McBSP3TX		(10 + IH2_BASE)
+#define INT_McBSP3RX		(11 + IH2_BASE)
+#define INT_McBSP1TX		(12 + IH2_BASE)
+#define INT_McBSP1RX		(13 + IH2_BASE)
+#define INT_UART1		(14 + IH2_BASE)
+#define INT_UART2		(15 + IH2_BASE)
+#define INT_BT_MCSI1TX		(16 + IH2_BASE)
+#define INT_BT_MCSI1RX		(17 + IH2_BASE)
+#define INT_USB_W2FC		(20 + IH2_BASE)
+#define INT_1WIRE		(21 + IH2_BASE)
+#define INT_OS_TIMER		(22 + IH2_BASE)
+#define INT_MMC			(23 + IH2_BASE)
+#define INT_GAUGE_32K		(24 + IH2_BASE)
+#define INT_RTC_TIMER		(25 + IH2_BASE)
+#define INT_RTC_ALARM		(26 + IH2_BASE)
+#define INT_MEM_STICK		(27 + IH2_BASE)
+#define INT_DSP_MMU		(28 + IH2_BASE)
+
+/*
+ * OMAP-1510 specific IRQ numbers for interrupt handler 2
+ */
+#define INT_1510_OS_32kHz_TIMER (22 + IH2_BASE)
+#define INT_1510_COM_SPI_RO	(31 + IH2_BASE)
+
+/*
+ * OMAP-1610 specific IRQ numbers for interrupt handler 2
+ */
+#define INT_1610_FAC		(0 + IH2_BASE)
+#define INT_1610_USB_HHC_2	(7 + IH2_BASE)
+#define INT_1610_USB_OTG	(8 + IH2_BASE)
+#define INT_1610_SoSSI		(9 + IH2_BASE)
+#define INT_1610_SoSSI_MATCH	(19 + IH2_BASE)
+#define INT_1610_McBSP2RX_OF	(31 + IH2_BASE)
+#define INT_1610_GPIO_BANK2	(40 + IH2_BASE)
+#define INT_1610_GPIO_BANK3	(41 + IH2_BASE)
+#define INT_1610_MMC2		(42 + IH2_BASE)
+#define INT_1610_GPIO_BANK4	(48 + IH2_BASE)
+#define INT_1610_SPI		(49 + IH2_BASE)
+#define INT_1610_DMA_CH6	(53 + IH2_BASE)
+#define INT_1610_DMA_CH7	(54 + IH2_BASE)
+#define INT_1610_DMA_CH8	(55 + IH2_BASE)
+#define INT_1610_DMA_CH9	(56 + IH2_BASE)
+#define INT_1610_DMA_CH10	(57 + IH2_BASE)
+#define INT_1610_DMA_CH11	(58 + IH2_BASE)
+#define INT_1610_DMA_CH12	(59 + IH2_BASE)
+#define INT_1610_DMA_CH13	(60 + IH2_BASE)
+#define INT_1610_DMA_CH14	(61 + IH2_BASE)
+#define INT_1610_DMA_CH15	(62 + IH2_BASE)
+#define INT_1610_NAND		(63 + IH2_BASE)
+
+/*
+ * OMAP-730 specific IRQ numbers for interrupt handler 2
+ */
+#define INT_730_HW_ERRORS	(0 + IH2_BASE)
+#define INT_730_NFIQ_PWR_FAIL	(1 + IH2_BASE)
+#define INT_730_CFCD		(2 + IH2_BASE)
+#define INT_730_CFIREQ		(3 + IH2_BASE)
+#define INT_730_I2C		(4 + IH2_BASE)
+#define INT_730_PCC		(5 + IH2_BASE)
+#define INT_730_MPU_EXT_NIRQ	(6 + IH2_BASE)
+#define INT_730_SPI_100K_1	(7 + IH2_BASE)
+#define INT_730_SYREN_SPI	(8 + IH2_BASE)
+#define INT_730_VLYNQ		(9 + IH2_BASE)
+#define INT_730_GPIO_BANK4	(10 + IH2_BASE)
+#define INT_730_McBSP1TX	(11 + IH2_BASE)
+#define INT_730_McBSP1RX	(12 + IH2_BASE)
+#define INT_730_McBSP1RX_OF	(13 + IH2_BASE)
+#define INT_730_UART_MODEM_IRDA_2 (14 + IH2_BASE)
+#define INT_730_UART_MODEM_1	(15 + IH2_BASE)
+#define INT_730_MCSI		(16 + IH2_BASE)
+#define INT_730_uWireTX		(17 + IH2_BASE)
+#define INT_730_uWireRX		(18 + IH2_BASE)
+#define INT_730_SMC_CD		(19 + IH2_BASE)
+#define INT_730_SMC_IREQ	(20 + IH2_BASE)
+#define INT_730_HDQ_1WIRE	(21 + IH2_BASE)
+#define INT_730_TIMER32K	(22 + IH2_BASE)
+#define INT_730_MMC_SDIO	(23 + IH2_BASE)
+#define INT_730_UPLD		(24 + IH2_BASE)
+#define INT_730_RTC_TIMER	(25 + IH2_BASE)
+#define INT_730_RTC_ALARM	(26 + IH2_BASE)
+#define INT_730_USB_HHC_1	(27 + IH2_BASE)
+#define INT_730_USB_HHC_2	(28 + IH2_BASE)
+#define INT_730_USB_GENI	(29 + IH2_BASE)
+#define INT_730_USB_OTG		(30 + IH2_BASE)
+#define INT_730_CAMERA_IF	(31 + IH2_BASE)
+#define INT_730_RNG		(32 + IH2_BASE)
+#define INT_730_DUAL_MODE_TIMER (33 + IH2_BASE)
+#define INT_730_DBB_RF_EN	(34 + IH2_BASE)
+#define INT_730_MPUIO_KEYPAD	(35 + IH2_BASE)
+#define INT_730_SHA1_MD5	(36 + IH2_BASE)
+#define INT_730_SPI_100K_2	(37 + IH2_BASE)
+#define INT_730_RNG_IDLE	(38 + IH2_BASE)
+#define INT_730_MPUIO		(39 + IH2_BASE)
+#define INT_730_LLPC_LCD_CTRL_CAN_BE_OFF	(40 + IH2_BASE)
+#define INT_730_LLPC_OE_FALLING (41 + IH2_BASE)
+#define INT_730_LLPC_OE_RISING	(42 + IH2_BASE)
+#define INT_730_LLPC_VSYNC	(43 + IH2_BASE)
+#define INT_730_WAKE_UP_REQ	(46 + IH2_BASE)
+#define INT_730_DMA_CH6		(53 + IH2_BASE)
+#define INT_730_DMA_CH7		(54 + IH2_BASE)
+#define INT_730_DMA_CH8		(55 + IH2_BASE)
+#define INT_730_DMA_CH9		(56 + IH2_BASE)
+#define INT_730_DMA_CH10	(57 + IH2_BASE)
+#define INT_730_DMA_CH11	(58 + IH2_BASE)
+#define INT_730_DMA_CH12	(59 + IH2_BASE)
+#define INT_730_DMA_CH13	(60 + IH2_BASE)
+#define INT_730_DMA_CH14	(61 + IH2_BASE)
+#define INT_730_DMA_CH15	(62 + IH2_BASE)
+#define INT_730_NAND		(63 + IH2_BASE)
+
+/* OMAP-730 differences */
+#ifdef CONFIG_ARCH_OMAP730
+#undef	INT_IH2_IRQ
+#define INT_IH2_IRQ		INT_730_IH2_IRQ
+#undef	INT_KEYBOARD
+#define INT_KEYBOARD		INT_730_MPUIO_KEYPAD
+#undef	INT_UART1
+#define INT_UART1		INT_730_UART_MODEM_1
+#undef	INT_UART2
+#define INT_UART2		INT_730_UART_MODEM_IRDA_2
+#undef	INT_MPUIO
+#define INT_MPUIO		INT_730_MPUIO
+#undef	INT_RTC_TIMER
+#define INT_RTC_TIMER		INT_730_RTC_TIMER
+#undef	INT_RTC_ALARM
+#define INT_RTC_ALARM		INT_730_RTC_ALARM
+#endif
+
+/* Max. 128 level 2 IRQs (OMAP1610), 192 GPIOs (OMAP730) and
+ * 16 MPUIO lines */
+#define OMAP_MAX_GPIO_LINES	192
+#define IH_GPIO_BASE		(128 + IH2_BASE)
+#define IH_MPUIO_BASE		(OMAP_MAX_GPIO_LINES + IH_GPIO_BASE)
+#define IH_BOARD_BASE		(16 + IH_MPUIO_BASE)
+
+#ifndef __ASSEMBLY__
+extern void omap_init_irq(void);
+#endif
+
+/*
+ * The definition of NR_IRQS is in board-specific header file, which is
+ * included via hardware.h
+ */
+#include <asm/arch/hardware.h>
+
+#endif
--- diff/include/asm-arm/arch-omap/memory.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/memory.h	2004-04-21 10:45:35.813259056 +0100
@@ -0,0 +1,92 @@
+/*
+ * linux/include/asm-arm/arch-omap/memory.h
+ *
+ * Memory map for OMAP-1510 and 1610
+ *
+ * Copyright (C) 2000 RidgeRun, Inc.
+ * Author: Greg Lonnon <glonnon@ridgerun.com>
+ *
+ * This file was derived from linux/include/asm-arm/arch-intergrator/memory.h
+ * Copyright (C) 1999 ARM Limited
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the  GNU General Public License along
+ * with this program; if not, write  to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __ASM_ARCH_MMU_H
+#define __ASM_ARCH_MMU_H
+
+/*
+ * Task size: 3GB
+ */
+#define TASK_SIZE		(0xbf000000UL)
+#define TASK_SIZE_26		(0x04000000UL)
+
+/*
+ * This decides where the kernel will search for a free chunk of vm
+ * space during mmap's.
+ */
+#define TASK_UNMAPPED_BASE	(0x40000000)
+
+/*
+ * Page offset: 3GB
+ */
+#define PAGE_OFFSET		(0xC0000000UL)
+#define PHYS_OFFSET		(0x10000000UL)
+
+/*
+ * OMAP-1510 Local Bus address offset
+ */
+#define OMAP1510_LB_OFFSET	(0x30000000UL)
+
+/*
+ * The DRAM is contiguous.
+ */
+#define __virt_to_phys__is_a_macro
+#define __virt_to_phys(vpage) ((vpage) - PAGE_OFFSET + PHYS_OFFSET)
+#define __phys_to_virt__is_a_macro
+#define __phys_to_virt(ppage) ((ppage) + PAGE_OFFSET - PHYS_OFFSET)
+
+/*
+ * Conversion between SDRAM and fake PCI bus, used by USB
+ * NOTE: Physical address must be converted to Local Bus address
+ *	 on OMAP-1510 only
+ */
+#define __virt_to_bus__is_a_macro
+#define __bus_to_virt__is_a_macro
+
+/*
+ * Bus address is physical address, except for OMAP-1510 Local Bus.
+ */
+#define __virt_to_bus(x)	__virt_to_phys(x)
+#define __bus_to_virt(x)	__phys_to_virt(x)
+
+/*
+ * OMAP-1510 bus address is translated into a Local Bus address if the
+ * OMAP bus type is lbus. See dmadev_uses_omap_lbus().
+ */
+#ifdef CONFIG_ARCH_OMAP1510
+#define bus_to_lbus(x)	((x) + (OMAP1510_LB_OFFSET - PHYS_OFFSET))
+#define lbus_to_bus(x)	((x) - (OMAP1510_LB_OFFSET - PHYS_OFFSET))
+#endif
+
+#define PHYS_TO_NID(addr) (0)
+#endif
+
--- diff/include/asm-arm/arch-omap/mux.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/mux.h	2004-04-21 10:45:35.814258904 +0100
@@ -0,0 +1,462 @@
+/*
+ * linux/include/asm-arm/arch-omap/mux.h
+ *
+ * Table of the Omap register configurations for the FUNC_MUX and
+ * PULL_DWN combinations.
+ *
+ * Copyright (C) 2003 Nokia Corporation
+ *
+ * Written by Tony Lindgren <tony.lindgren@nokia.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * NOTE: Please use the following naming style for new pin entries.
+ *	 For example, W8_1610_MMC2_DAT0, where:
+ *	 - W8	     = ball
+ *	 - 1610	     = 1510 or 1610, none if common for both 1510 and 1610
+ *	 - MMC2_DAT0 = function
+ *
+ * Change log:
+ *   Added entry for the I2C interface. (02Feb 2004)
+ *   Copyright (C) 2004 Texas Instruments
+ *
+ *   Added entry for the keypad and uwire CS1. (09Mar 2004)
+ *   Copyright (C) 2004 Texas Instruments
+ *
+ */
+
+#ifndef __ASM_ARCH_MUX_H
+#define __ASM_ARCH_MUX_H
+
+#define PU_PD_SEL_NA	0	/* No pu_pd reg availabe */
+
+#define DEBUG_MUX
+
+#ifdef DEBUG_MUX
+#define MUX_REG(reg, mode_offset, mode) .mux_reg_name = "FUNC_MUX_CTRL_"#reg, \
+					.mux_reg = FUNC_MUX_CTRL_##reg, \
+					.mask_offset = mode_offset, \
+					.mask = mode,
+
+#define PULL_REG(reg, bit, status)	.pull_name = "PULL_DWN_CTRL_"#reg, \
+					.pull_reg = PULL_DWN_CTRL_##reg, \
+					.pull_bit = bit, \
+					.pull_val = status,
+
+#define PU_PD_REG(reg, status)		.pu_pd_name = "PU_PD_SEL_"#reg, \
+					.pu_pd_reg = PU_PD_SEL_##reg, \
+					.pu_pd_val = status,
+
+#else
+
+#define MUX_REG(reg, mode_offset, mode) .mux_reg = FUNC_MUX_CTRL_##reg, \
+					.mask_offset = mode_offset, \
+					.mask = mode,
+
+#define PULL_REG(reg, bit, status)	.pull_reg = PULL_DWN_CTRL_##reg, \
+					.pull_bit = bit, \
+					.pull_val = status,
+
+#define PU_PD_REG(reg, status)		.pu_pd_reg = PU_PD_SEL_##reg, \
+					.pu_pd_val = status,
+
+#endif // DEBUG_MUX
+
+#define MUX_CFG(desc, mux_reg, mode_offset, mode,	\
+		pull_reg, pull_bit, pull_status,	\
+		pu_pd_reg, pu_pd_status, debug_status)	\
+{							\
+	.name =	 desc,					\
+	.debug = debug_status,				\
+	MUX_REG(mux_reg, mode_offset, mode)		\
+	PULL_REG(pull_reg, pull_bit, pull_status)	\
+	PU_PD_REG(pu_pd_reg, pu_pd_status)		\
+},
+
+#define PULL_DISABLED	0
+#define PULL_ENABLED	1
+
+#define PULL_DOWN	0
+#define PULL_UP		1
+
+typedef struct {
+	char *name;
+	unsigned char busy;
+	unsigned char debug;
+
+	const char *mux_reg_name;
+	const unsigned int mux_reg;
+	const unsigned char mask_offset;
+	const unsigned char mask;
+
+	const char *pull_name;
+	const unsigned int pull_reg;
+	const unsigned char pull_val;
+	const unsigned char pull_bit;
+
+	const char *pu_pd_name;
+	const unsigned int pu_pd_reg;
+	const unsigned char pu_pd_val;
+} reg_cfg_set;
+
+/*
+ * Lookup table for FUNC_MUX and PULL_DWN register combinations for each
+ * device. See also reg_cfg_table below for the register values.
+ */
+typedef enum {
+	/* UART1 (BT_UART_GATING)*/
+	UART1_TX = 0,
+	UART1_RTS,
+
+	/* UART2 (COM_UART_GATING)*/
+	UART2_TX,
+	UART2_RX,
+	UART2_CTS,
+	UART2_RTS,
+
+	/* UART3 (GIGA_UART_GATING) */
+	UART3_TX,
+	UART3_RX,
+	UART3_CTS,
+	UART3_RTS,
+	UART3_CLKREQ,
+	UART3_BCLK,	/* 12MHz clock out */
+
+	/* USB master generic */
+	R18_USB_VBUS,
+	R18_1510_USB_GPIO0,
+	W4_USB_PUEN,
+	W4_USB_CLKO,
+
+	/* USB1 master */
+	USB1_SUSP,
+	USB1_SEO,
+	USB1_TXEN,
+	USB1_TXD,
+	USB1_VP,
+	USB1_VM,
+	USB1_RCV,
+	USB1_SPEED,
+
+	/* USB2 master */
+	USB2_SUSP,
+	USB2_VP,
+	USB2_TXEN,
+	USB2_VM,
+	USB2_RCV,
+	USB2_SEO,
+	USB2_TXD,
+
+	/* OMAP-1510 GPIO */
+	R18_1510_GPIO0,
+	R19_1510_GPIO1,
+	M14_1510_GPIO2,
+
+	/* MPUIO */
+	MPUIO2,
+	MPUIO4,
+	MPUIO5,
+	T20_1610_MPUIO5,
+	W11_1610_MPUIO6,
+	V10_1610_MPUIO7,
+	W11_1610_MPUIO9,
+	V10_1610_MPUIO10,
+	W10_1610_MPUIO11,
+	E20_1610_MPUIO13,
+	U20_1610_MPUIO14,
+	E19_1610_MPUIO15,
+
+	/* MCBSP2 */
+	MCBSP2_CLKR,
+	MCBSP2_CLKX,
+	MCBSP2_DR,
+	MCBSP2_DX,
+	MCBSP2_FSR,
+	MCBSP2_FSX,
+
+	/* MCBSP3 */
+	MCBSP3_CLKX,
+
+	/* Misc ballouts */
+	BALLOUT_V8_ARMIO3,
+
+	/* OMAP-1610 MMC2 */
+	W8_1610_MMC2_DAT0,
+	V8_1610_MMC2_DAT1,
+	W15_1610_MMC2_DAT2,
+	R10_1610_MMC2_DAT3,
+	Y10_1610_MMC2_CLK,
+	Y8_1610_MMC2_CMD,
+	V9_1610_MMC2_CMDDIR,
+	V5_1610_MMC2_DATDIR0,
+	W19_1610_MMC2_DATDIR1,
+	R18_1610_MMC2_CLKIN,
+
+	/* OMAP-1610 External Trace Interface */
+	M19_1610_ETM_PSTAT0,
+	L15_1610_ETM_PSTAT1,
+	L18_1610_ETM_PSTAT2,
+	L19_1610_ETM_D0,
+	J19_1610_ETM_D6,
+	J18_1610_ETM_D7,
+
+	/* OMAP-1610 GPIO */
+	P20_1610_GPIO4,
+	V9_1610_GPIO7,
+	N19_1610_GPIO13,
+	P10_1610_GPIO22,
+	V5_1610_GPIO24,
+	AA20_1610_GPIO_41,
+
+	/* OMAP-1610 uWire */
+	V19_1610_UWIRE_SCLK,
+	U18_1610_UWIRE_SDI,
+	W21_1610_UWIRE_SDO,
+	N14_1610_UWIRE_CS0,
+	P15_1610_UWIRE_CS0,
+	N15_1610_UWIRE_CS1,
+
+	/* First MMC */
+	MMC_CMD,
+	MMC_DAT1,
+	MMC_DAT2,
+	MMC_DAT0,
+	MMC_CLK,
+	MMC_DAT3,
+
+	/* OMAP-1610 USB0 alternate pin configuration */
+	W9_USB0_TXEN,
+	AA9_USB0_VP,
+	Y5_USB0_RCV,
+	R9_USB0_VM,
+	V6_USB0_TXD,
+	W5_USB0_SE0,
+	V9_USB0_SPEED,
+	V9_USB0_SUSP,
+
+	/* USB2 */
+	W9_USB2_TXEN,
+	AA9_USB2_VP,
+	Y5_USB2_RCV,
+	R9_USB2_VM,
+	V6_USB2_TXD,
+	W5_USB2_SE0,
+
+	/* UART1 1610 */
+
+	R13_1610_UART1_TX,
+	V14_1610_UART1_RX,
+	R14_1610_UART1_CTS,
+	AA15_1610_UART1_RTS,
+
+	/* I2C OMAP-1610 */
+	I2C_SCL,
+	I2C_SDA,
+
+	/* Keypad */
+	F18_1610_KBC0,
+	D20_1610_KBC1,
+	D19_1610_KBC2,
+	E18_1610_KBC3,
+	C21_1610_KBC4,
+	G18_1610_KBR0,
+	F19_1610_KBR1,
+	H14_1610_KBR2,
+	E20_1610_KBR3,
+	E19_1610_KBR4,
+	N19_1610_KBR5,
+
+} reg_cfg_t;
+
+#ifdef __MUX_C__
+
+/*
+ * Table of various FUNC_MUX and PULL_DWN combinations for each device.
+ * See also reg_cfg_t above for the lookup table.
+ */
+static reg_cfg_set reg_cfg_table[] = {
+/*
+ *	 description		mux  mode   mux	 pull pull  pull  pu_pd	 pu  dbg
+ *				reg  offset mode reg  bit   ena	  reg
+ */
+MUX_CFG("UART1_TX",		 9,   21,    1,	  2,   3,   0,	 NA,	 0,  0)
+MUX_CFG("UART1_RTS",		 9,   12,    1,	  2,   0,   0,	 NA,	 0,  0)
+
+/* UART2 (COM_UART_GATING), conflicts with USB2 */
+MUX_CFG("UART2_TX",		 C,   27,    1,	  3,   3,   0,	 NA,	 0,  0)
+MUX_CFG("UART2_RX",		 C,   18,    0,	  3,   1,   1,	 NA,	 0,  0)
+MUX_CFG("UART2_CTS",		 C,   21,    0,	  3,   1,   1,	 NA,	 0,  0)
+MUX_CFG("UART2_RTS",		 C,   24,    1,	  3,   2,   0,	 NA,	 0,  0)
+
+/* UART3 (GIGA_UART_GATING) */
+MUX_CFG("UART3_TX",		 6,    0,    1,	  0,  30,   0,	 NA,	 0,  0)
+MUX_CFG("UART3_RX",		 6,    3,    0,	  0,  31,   1,	 NA,	 0,  0)
+MUX_CFG("UART3_CTS",		 5,   12,    2,	  0,  24,   0,	 NA,	 0,  0)
+MUX_CFG("UART3_RTS",		 5,   15,    2,	  0,  25,   0,	 NA,	 0,  0)
+MUX_CFG("UART3_CLKREQ",		 9,   27,    0,	  2,   5,   0,	 NA,	 0,  0)
+MUX_CFG("UART3_BCLK",		 A,    0,    0,	  2,   6,   0,	 NA,	 0,  0)
+
+/* USB internal master generic */
+MUX_CFG("R18_USB_VBUS",		 7,    9,    2,	  1,  11,   0,	 NA,	 0,  1)
+MUX_CFG("R18_1510_USB_GPIO0",	 7,    9,    0,	  1,  11,   1,	 NA,	 0,  1)
+MUX_CFG("W4_USB_PUEN",		 D,    3,    0,	  3,   5,   1,	 NA,	 0,  1)
+MUX_CFG("W4_USB_CLKO",		 D,    3,    1,	  3,   5,   0,	 NA,	 0,  1)
+
+/* USB1 master */
+MUX_CFG("USB1_SUSP",		 8,   27,    2,	  1,  27,   0,	 NA,	 0,  1)
+MUX_CFG("USB1_SE0",		 9,    0,    2,	  1,  28,   0,	 NA,	 0,  1)
+MUX_CFG("USB1_TXEN",		 9,    3,    2,	  1,  29,   0,	 NA,	 0,  1)
+MUX_CFG("USB1_TXD",		 9,   24,    1,	  2,   4,   0,	 NA,	 0,  1)
+MUX_CFG("USB1_VP",		 A,    3,    1,	  2,   7,   0,	 NA,	 0,  1)
+MUX_CFG("USB1_VM",		 A,    6,    1,	  2,   8,   0,	 NA,	 0,  1)
+MUX_CFG("USB1_RCV",		 A,    9,    1,	  2,   9,   0,	 NA,	 0,  1)
+MUX_CFG("USB1_SPEED",		 A,   12,    2,	  2,  10,   0,	 NA,	 0,  1)
+
+/* USB2 master */
+MUX_CFG("USB2_SUSP",		 B,    3,    1,	  2,  17,   0,	 NA,	 0,  1)
+MUX_CFG("USB2_VP",		 B,    6,    1,	  2,  18,   0,	 NA,	 0,  1)
+MUX_CFG("USB2_TXEN",		 B,    9,    1,	  2,  19,   0,	 NA,	 0,  1)
+MUX_CFG("USB2_VM",		 C,   18,    1,	  3,   0,   0,	 NA,	 0,  1)
+MUX_CFG("USB2_RCV",		 C,   21,    1,	  3,   1,   0,	 NA,	 0,  1)
+MUX_CFG("USB2_SE0",		 C,   24,    2,	  3,   2,   0,	 NA,	 0,  1)
+MUX_CFG("USB2_TXD",		 C,   27,    2,	  3,   3,   0,	 NA,	 0,  1)
+
+/* OMAP-1510 GPIO */
+MUX_CFG("R18_1510_GPIO0",	 7,    9,   0,	  1,  11,   1,	  0,	 0,  1)
+MUX_CFG("R19_1510_GPIO1",	 7,    6,   0,	  1,  10,   1,	  0,	 0,  1)
+MUX_CFG("M14_1510_GPIO2",	 7,    3,   0,	  1,   9,   1,	  0,	 0,  1)
+
+/* MPUIO */
+MUX_CFG("MPUIO2",		 7,   18,    0,	  1,   1,   1,	 NA,	 0,  1)
+MUX_CFG("MPUIO4",		 7,   15,    0,	  1,  13,   1,	 NA,	 0,  1)
+MUX_CFG("MPUIO5",		 7,   12,    0,	  1,  12,   1,	 NA,	 0,  1)
+
+MUX_CFG("T20_1610_MPUIO5",	 7,   12,    0,	  1,  12,   0,	  3,	 0,  1)
+MUX_CFG("W11_1610_MPUIO6",	10,   15,    2,	  3,   8,   0,	  3,	 0,  1)
+MUX_CFG("V10_1610_MPUIO7",	 A,   24,    2,	  2,  14,   0,	  2,	 0,  1)
+MUX_CFG("W11_1610_MPUIO9",	10,   15,    1,	  3,   8,   0,	  3,	 0,  1)
+MUX_CFG("V10_1610_MPUIO10",	 A,   24,    1,	  2,  14,   0,	  2,	 0,  1)
+MUX_CFG("W10_1610_MPUIO11",	 A,   18,    2,	  2,  11,   0,	  2,	 0,  1)
+MUX_CFG("E20_1610_MPUIO13",	 3,   21,    1,	  0,   7,   0,	  0,	 0,  1)
+MUX_CFG("U20_1610_MPUIO14",	 9,    6,    6,	  0,  30,   0,	  0,	 0,  1)
+MUX_CFG("E19_1610_MPUIO15",	 3,   18,    1,	  0,   6,   0,	  0,	 0,  1)
+
+/* MCBSP2 */
+MUX_CFG("MCBSP2_CLKR",		 C,    6,    0,	  2,  27,   1,	 NA,	 0,  1)
+MUX_CFG("MCBSP2_CLKX",		 C,    9,    0,	  2,  29,   1,	 NA,	 0,  1)
+MUX_CFG("MCBSP2_DR",		 C,    0,    0,	  2,  26,   1,	 NA,	 0,  1)
+MUX_CFG("MCBSP2_DX",		 C,   15,    0,	  2,  31,   1,	 NA,	 0,  1)
+MUX_CFG("MCBSP2_FSR",		 C,   12,    0,	  2,  30,   1,	 NA,	 0,  1)
+MUX_CFG("MCBSP2_FSX",		 C,    3,    0,	  2,  27,   1,	 NA,	 0,  1)
+
+/* MCBSP3 NOTE: Mode must 1 for clock */
+MUX_CFG("MCBSP3_CLKX",		 9,    3,    1,	  1,  29,   0,	 NA,	 0,  1)
+
+/* Misc ballouts */
+MUX_CFG("BALLOUT_V8_ARMIO3",	 B,   18,    0,	  2,  25,   1,	 NA,	 0,  1)
+
+/* OMAP-1610 MMC2 */
+MUX_CFG("W8_1610_MMC2_DAT0",	 B,   21,    6,	  2,  23,   1,	  2,	 1,  1)
+MUX_CFG("V8_1610_MMC2_DAT1",	 B,   27,    6,	  2,  25,   1,	  2,	 1,  1)
+MUX_CFG("W15_1610_MMC2_DAT2",	 9,   12,    6,	  2,   5,   1,	  2,	 1,  1)
+MUX_CFG("R10_1610_MMC2_DAT3",	 B,   18,    6,	  2,  22,   1,	  2,	 1,  1)
+MUX_CFG("Y10_1610_MMC2_CLK",	 B,    3,    6,	  2,  17,   0,	  2,	 0,  1)
+MUX_CFG("Y8_1610_MMC2_CMD",	 B,   24,    6,	  2,  24,   1,	  2,	 1,  1)
+MUX_CFG("V9_1610_MMC2_CMDDIR",	 B,   12,    6,	  2,  20,   0,	  2,	 1,  1)
+MUX_CFG("V5_1610_MMC2_DATDIR0",	 B,   15,    6,	  2,  21,   0,	  2,	 1,  1)
+MUX_CFG("W19_1610_MMC2_DATDIR1", 8,   15,    6,	  1,  23,   0,	  1,	 1,  1)
+MUX_CFG("R18_1610_MMC2_CLKIN",	 7,    9,    6,	  1,  11,   0,	  1,	11,  1)
+
+/* OMAP-1610 External Trace Interface */
+MUX_CFG("M19_1610_ETM_PSTAT0",	 5,   27,    1,	  0,  29,   0,	  0,	 0,  1)
+MUX_CFG("L15_1610_ETM_PSTAT1",	 5,   24,    1,	  0,  28,   0,	  0,	 0,  1)
+MUX_CFG("L18_1610_ETM_PSTAT2",	 5,   21,    1,	  0,  27,   0,	  0,	 0,  1)
+MUX_CFG("L19_1610_ETM_D0",	 5,   18,    1,	  0,  26,   0,	  0,	 0,  1)
+MUX_CFG("J19_1610_ETM_D6",	 5,    0,    1,	  0,  20,   0,	  0,	 0,  1)
+MUX_CFG("J18_1610_ETM_D7",	 5,   27,    1,	  0,  19,   0,	  0,	 0,  1)
+
+/* OMAP-1610 GPIO */
+MUX_CFG("P20_1610_GPIO4",	 6,   27,    0,	  1,   7,   0,	  1,	 1,  1)
+MUX_CFG("V9_1610_GPIO7",	 B,   12,    1,	  2,  20,   0,	  2,	 1,  1)
+MUX_CFG("N19_1610_GPIO13",	 6,   12,    0,	  1,   2,   0,	  1,	 1,  1)
+MUX_CFG("P10_1610_GPIO22",	 C,    0,    7,	  2,  26,   0,	  2,	 1,  1)
+MUX_CFG("V5_1610_GPIO24",	 B,   15,    7,	  2,  21,   0,	  2,	 1,  1)
+MUX_CFG("AA20_1610_GPIO_41",	 9,    9,    7,	  1,  31,   0,	  1,	 1,  1)
+
+/* OMAP-1610 uWire */
+MUX_CFG("V19_1610_UWIRE_SCLK",	 8,    6,    0,	  1,  20,   0,	  1,	 1,  1)
+MUX_CFG("U18_1610_UWIRE_SDI",	 8,    0,    0,	  1,  18,   0,	  1,	 1,  1)
+MUX_CFG("W21_1610_UWIRE_SDO",	 8,    3,    0,	  1,  19,   0,	  1,	 1,  1)
+MUX_CFG("N14_1610_UWIRE_CS0",	 8,    9,    1,	  1,  21,   0,	  1,	 1,  1)
+MUX_CFG("P15_1610_UWIRE_CS3",	 8,   12,    1,	  1,  22,   0,	  1,	 1,  1)
+MUX_CFG("N15_1610_UWIRE_CS1",	 7,   18,    2,	  0,   0,   0,	  0,	 0,  0)
+
+/* First MMC interface, same on 1510 and 1610 */
+MUX_CFG("MMC_CMD",		 A,   27,    0,	  2,  15,   1,	  2,	 1,  1)
+MUX_CFG("MMC_DAT1",		 A,   24,    0,	  2,  14,   1,	  2,	 1,  1)
+MUX_CFG("MMC_DAT2",		 A,   18,    0,	  2,  12,   1,	  2,	 1,  1)
+MUX_CFG("MMC_DAT0",		 B,    0,    0,	  2,  16,   1,	  2,	 1,  1)
+MUX_CFG("MMC_CLK",		 A,   21,    0,	  0,   0,   0,	  0,	 0,  1)
+MUX_CFG("MMC_DAT3",		10,   15,    0,	  3,   8,   1,	  3,	 1,  1)
+
+/* OMAP-1610 USB0 alternate configuration */
+MUX_CFG("W9_USB0_TXEN",		 B,   9,     5,	  2,  19,   0,	  2,	 0,  1)
+MUX_CFG("AA9_USB0_VP",		 B,   6,     5,	  2,  18,   0,	  2,	 0,  1)
+MUX_CFG("Y5_USB0_RCV",		 C,  21,     5,	  3,   1,   0,	  1,	 0,  1)
+MUX_CFG("R9_USB0_VM",		 C,  18,     5,	  3,   0,   0,	  3,	 0,  1)
+MUX_CFG("V6_USB0_TXD",		 C,  27,     5,	  3,   3,   0,	  3,	 0,  1)
+MUX_CFG("W5_USB0_SE0",		 C,  24,     5,	  3,   2,   0,	  3,	 0,  1)
+MUX_CFG("V9_USB0_SPEED",	 B,  12,     5,	  2,  20,   0,	  2,	 0,  1)
+MUX_CFG("Y10_USB0_SUSP",	 B,   3,     5,	  2,  17,   0,	  2,	 0,  1)
+
+/* USB2 interface */
+MUX_CFG("W9_USB2_TXEN",		 B,   9,     1,	  0,   0,   0,	 NA,	 0,  1)
+MUX_CFG("AA9_USB2_VP",		 B,   6,     1,	  0,   0,   0,	 NA,	 0,  1)
+MUX_CFG("Y5_USB2_RCV",		 C,  21,     1,	  0,   0,   0,	 NA,	 0,  1)
+MUX_CFG("R8_USB2_VM",		 C,  18,     1,	  0,   0,   0,	 NA,	 0,  1)
+MUX_CFG("V6_USB2_TXD",		 C,  27,     2,	  0,   0,   0,	 NA,	 0,  1)
+MUX_CFG("W5_USB2_SE0",		 C,  24,     2,	  0,   0,   0,	 NA,	 0,  1)
+
+
+/* UART1 */
+MUX_CFG("R13_1610_UART1_TX",	 A,  12,     6,	  2,  10,   0,	  2,	10,  1)
+MUX_CFG("V14_1610_UART1_RX",	 9,  18,     0,	  2,   2,   0,	  2,	 2,  1)
+MUX_CFG("R14_1610_UART1_CTS",	 9,  15,     0,	  2,   1,   0,	  2,	 1,  1)
+MUX_CFG("AA15_1610_UART1_RTS",	 9,  12,     1,	  2,   0,   0,	  2,	 0,  1)
+
+/* I2C interface */
+MUX_CFG("I2C_SCL",		 7,  24,     0,	  0,   0,   0,	  0,	 0,  0)
+MUX_CFG("I2C_SDA",		 7,  27,     0,	  0,   0,   0,	  0,	 0,  0)
+
+/* Keypad */
+MUX_CFG("F18_1610_KBC0",	 3,  15,     0,	  0,   5,   1,	  0,	 0,  0)
+MUX_CFG("D20_1610_KBC1",	 3,  12,     0,	  0,   4,   1,	  0,	 0,  0)
+MUX_CFG("D19_1610_KBC2",	 3,   9,     0,	  0,   3,   1,	  0,	 0,  0)
+MUX_CFG("E18_1610_KBC3",	 3,   6,     0,	  0,   2,   1,	  0,	 0,  0)
+MUX_CFG("C21_1610_KBC4",	 3,   3,     0,	  0,   1,   1,	  0,	 0,  0)
+MUX_CFG("G18_1610_KBR0",	 4,   0,     0,	  0,   10,  1,	  0,	 1,  0)
+MUX_CFG("F19_1610_KBR1",	 3,   27,    0,	  0,   9,   1,	  0,	 1,  0)
+MUX_CFG("H14_1610_KBR2",	 3,   24,    0,	  0,   8,   1,	  0,	 1,  0)
+MUX_CFG("E20_1610_KBR3",	 3,   21,    0,	  0,   7,   1,	  0,	 1,  0)
+MUX_CFG("E19_1610_KBR4",	 3,   18,    0,	  0,   6,   1,	  0,	 1,  0)
+MUX_CFG("N19_1610_KBR5",	 6,  12,     1,	  1,   2,   1,	  1,	 1,  0)
+
+};
+
+#endif	/* __MUX_C__ */
+
+extern int omap_cfg_reg(reg_cfg_t reg_cfg);
+
+#endif
--- diff/include/asm-arm/arch-omap/omap-h2.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/omap-h2.h	2004-04-21 10:45:35.814258904 +0100
@@ -0,0 +1,35 @@
+/*
+ * linux/include/asm-arm/arch-omap/omap-h2.h
+ *
+ * Hardware definitions for TI OMAP1610 H2 board.
+ *
+ * Cleanup for Linux-2.6 by Dirk Behme <dirk.behme@de.bosch.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the  GNU General Public License along
+ * with this program; if not, write  to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __ASM_ARCH_OMAP_H2_H
+#define __ASM_ARCH_OMAP_H2_H
+
+/* Placeholder for H2 specific defines */
+
+#endif /*  __ASM_ARCH_OMAP_H2_H */
+
--- diff/include/asm-arm/arch-omap/omap-innovator.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/omap-innovator.h	2004-04-21 10:45:35.815258752 +0100
@@ -0,0 +1,214 @@
+/*
+ * linux/include/asm-arm/arch-omap/omap-innovator.h
+ *
+ * Copyright (C) 2001 RidgeRun, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the  GNU General Public License along
+ * with this program; if not, write  to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#ifndef __ASM_ARCH_OMAP_INNOVATOR_H
+#define __ASM_ARCH_OMAP_INNOVATOR_H
+
+#if defined (CONFIG_ARCH_OMAP1510)
+
+/*
+ * ---------------------------------------------------------------------------
+ *  OMAP-1510 FPGA
+ * ---------------------------------------------------------------------------
+ */
+#define OMAP1510P1_FPGA_BASE			0xE8000000	/* Virtual */
+#define OMAP1510P1_FPGA_SIZE			SZ_4K
+#define OMAP1510P1_FPGA_START			0x08000000	/* Physical */
+
+/* Revision */
+#define OMAP1510P1_FPGA_REV_LOW			(OMAP1510P1_FPGA_BASE + 0x0)
+#define OMAP1510P1_FPGA_REV_HIGH		(OMAP1510P1_FPGA_BASE + 0x1)
+
+#define OMAP1510P1_FPGA_LCD_PANEL_CONTROL	(OMAP1510P1_FPGA_BASE + 0x2)
+#define OMAP1510P1_FPGA_LED_DIGIT		(OMAP1510P1_FPGA_BASE + 0x3)
+#define INNOVATOR_FPGA_HID_SPI			(OMAP1510P1_FPGA_BASE + 0x4)
+#define OMAP1510P1_FPGA_POWER			(OMAP1510P1_FPGA_BASE + 0x5)
+
+/* Interrupt status */
+#define OMAP1510P1_FPGA_ISR_LO			(OMAP1510P1_FPGA_BASE + 0x6)
+#define OMAP1510P1_FPGA_ISR_HI			(OMAP1510P1_FPGA_BASE + 0x7)
+
+/* Interrupt mask */
+#define OMAP1510P1_FPGA_IMR_LO			(OMAP1510P1_FPGA_BASE + 0x8)
+#define OMAP1510P1_FPGA_IMR_HI			(OMAP1510P1_FPGA_BASE + 0x9)
+
+/* Reset registers */
+#define OMAP1510P1_FPGA_HOST_RESET		(OMAP1510P1_FPGA_BASE + 0xa)
+#define OMAP1510P1_FPGA_RST			(OMAP1510P1_FPGA_BASE + 0xb)
+
+#define OMAP1510P1_FPGA_AUDIO			(OMAP1510P1_FPGA_BASE + 0xc)
+#define OMAP1510P1_FPGA_DIP			(OMAP1510P1_FPGA_BASE + 0xe)
+#define OMAP1510P1_FPGA_FPGA_IO			(OMAP1510P1_FPGA_BASE + 0xf)
+#define OMAP1510P1_FPGA_UART1			(OMAP1510P1_FPGA_BASE + 0x14)
+#define OMAP1510P1_FPGA_UART2			(OMAP1510P1_FPGA_BASE + 0x15)
+#define OMAP1510P1_FPGA_OMAP1510_STATUS		(OMAP1510P1_FPGA_BASE + 0x16)
+#define OMAP1510P1_FPGA_BOARD_REV		(OMAP1510P1_FPGA_BASE + 0x18)
+#define OMAP1510P1_PPT_DATA			(OMAP1510P1_FPGA_BASE + 0x100)
+#define OMAP1510P1_PPT_STATUS			(OMAP1510P1_FPGA_BASE + 0x101)
+#define OMAP1510P1_PPT_CONTROL			(OMAP1510P1_FPGA_BASE + 0x102)
+
+#define OMAP1510P1_FPGA_TOUCHSCREEN		(OMAP1510P1_FPGA_BASE + 0x204)
+
+#define INNOVATOR_FPGA_INFO			(OMAP1510P1_FPGA_BASE + 0x205)
+#define INNOVATOR_FPGA_LCD_BRIGHT_LO		(OMAP1510P1_FPGA_BASE + 0x206)
+#define INNOVATOR_FPGA_LCD_BRIGHT_HI		(OMAP1510P1_FPGA_BASE + 0x207)
+#define INNOVATOR_FPGA_LED_GRN_LO		(OMAP1510P1_FPGA_BASE + 0x208)
+#define INNOVATOR_FPGA_LED_GRN_HI		(OMAP1510P1_FPGA_BASE + 0x209)
+#define INNOVATOR_FPGA_LED_RED_LO		(OMAP1510P1_FPGA_BASE + 0x20a)
+#define INNOVATOR_FPGA_LED_RED_HI		(OMAP1510P1_FPGA_BASE + 0x20b)
+#define INNOVATOR_FPGA_CAM_USB_CONTROL		(OMAP1510P1_FPGA_BASE + 0x20c)
+#define INNOVATOR_FPGA_EXP_CONTROL		(OMAP1510P1_FPGA_BASE + 0x20d)
+#define INNOVATOR_FPGA_ISR2			(OMAP1510P1_FPGA_BASE + 0x20e)
+#define INNOVATOR_FPGA_IMR2			(OMAP1510P1_FPGA_BASE + 0x210)
+
+#define OMAP1510P1_FPGA_ETHR_START		(OMAP1510P1_FPGA_START + 0x300)
+#define OMAP1510P1_FPGA_ETHR_BASE		(OMAP1510P1_FPGA_BASE + 0x300)
+
+/*
+ * Power up Giga UART driver, turn on HID clock.
+ * Turn off BT power, since we're not using it and it
+ * draws power.
+ */
+#define OMAP1510P1_FPGA_RESET_VALUE		0x42
+
+#define OMAP1510P1_FPGA_PCR_IF_PD0		(1 << 7)
+#define OMAP1510P1_FPGA_PCR_COM2_EN		(1 << 6)
+#define OMAP1510P1_FPGA_PCR_COM1_EN		(1 << 5)
+#define OMAP1510P1_FPGA_PCR_EXP_PD0		(1 << 4)
+#define OMAP1510P1_FPGA_PCR_EXP_PD1		(1 << 3)
+#define OMAP1510P1_FPGA_PCR_48MHZ_CLK		(1 << 2)
+#define OMAP1510P1_FPGA_PCR_4MHZ_CLK		(1 << 1)
+#define OMAP1510P1_FPGA_PCR_RSRVD_BIT0		(1 << 0)
+
+/*
+ * Innovator/OMAP1510 FPGA HID register bit definitions
+ */
+#define FPGA_HID_SCLK	(1<<0)	/* output */
+#define FPGA_HID_MOSI	(1<<1)	/* output */
+#define FPGA_HID_nSS	(1<<2)	/* output 0/1 chip idle/select */
+#define FPGA_HID_nHSUS	(1<<3)	/* output 0/1 host active/suspended */
+#define FPGA_HID_MISO	(1<<4)	/* input */
+#define FPGA_HID_ATN	(1<<5)	/* input  0/1 chip idle/ATN */
+#define FPGA_HID_rsrvd	(1<<6)
+#define FPGA_HID_RESETn (1<<7)	/* output - 0/1 USAR reset/run */
+
+#ifndef OMAP_SDRAM_DEVICE
+#define OMAP_SDRAM_DEVICE			D256M_1X16_4B
+#endif
+
+#define OMAP1510P1_IMIF_PRI_VALUE		0x00
+#define OMAP1510P1_EMIFS_PRI_VALUE		0x00
+#define OMAP1510P1_EMIFF_PRI_VALUE		0x00
+
+/*
+ * These definitions define an area of FLASH set aside
+ * for the use of MTD/JFFS2. This is the area of flash
+ * that a JFFS2 filesystem will reside which is mounted
+ * at boot with the "root=/dev/mtdblock/0 rw"
+ * command line option. The flash address used here must
+ * fall within the legal range defined by rrload for storing
+ * the filesystem component. This address will be sufficiently
+ * deep into the overall flash range to avoid the other
+ * components also stored in flash such as the bootloader,
+ * the bootloader params, and the kernel.
+ * The SW2 settings for the map below are:
+ * 1 off, 2 off, 3 on, 4 off.
+ */
+
+/* Intel flash_0, partitioned as expected by rrload */
+#define OMAP_FLASH_0_BASE	0xD8000000
+#define OMAP_FLASH_0_START	0x00000000
+#define OMAP_FLASH_0_SIZE	SZ_16M
+
+/* Intel flash_1, used for cramfs or other flash file systems */
+#define OMAP_FLASH_1_BASE	0xD9000000
+#define OMAP_FLASH_1_START	0x01000000
+#define OMAP_FLASH_1_SIZE	SZ_16M
+
+/* The FPGA IRQ is cascaded through GPIO_13 */
+#define INT_FPGA		(IH_GPIO_BASE + 13)
+
+/* IRQ Numbers for interrupts muxed through the FPGA */
+#define IH_FPGA_BASE		IH_BOARD_BASE
+#define INT_FPGA_ATN		(IH_FPGA_BASE + 0)
+#define INT_FPGA_ACK		(IH_FPGA_BASE + 1)
+#define INT_FPGA2		(IH_FPGA_BASE + 2)
+#define INT_FPGA3		(IH_FPGA_BASE + 3)
+#define INT_FPGA4		(IH_FPGA_BASE + 4)
+#define INT_FPGA5		(IH_FPGA_BASE + 5)
+#define INT_FPGA6		(IH_FPGA_BASE + 6)
+#define INT_FPGA7		(IH_FPGA_BASE + 7)
+#define INT_FPGA8		(IH_FPGA_BASE + 8)
+#define INT_FPGA9		(IH_FPGA_BASE + 9)
+#define INT_FPGA10		(IH_FPGA_BASE + 10)
+#define INT_FPGA11		(IH_FPGA_BASE + 11)
+#define INT_FPGA12		(IH_FPGA_BASE + 12)
+#define INT_ETHER		(IH_FPGA_BASE + 13)
+#define INT_FPGAUART1		(IH_FPGA_BASE + 14)
+#define INT_FPGAUART2		(IH_FPGA_BASE + 15)
+#define INT_FPGA_TS		(IH_FPGA_BASE + 16)
+#define INT_FPGA17		(IH_FPGA_BASE + 17)
+#define INT_FPGA_CAM		(IH_FPGA_BASE + 18)
+#define INT_FPGA_RTC_A		(IH_FPGA_BASE + 19)
+#define INT_FPGA_RTC_B		(IH_FPGA_BASE + 20)
+#define INT_FPGA_CD		(IH_FPGA_BASE + 21)
+#define INT_FPGA22		(IH_FPGA_BASE + 22)
+#define INT_FPGA23		(IH_FPGA_BASE + 23)
+
+#define NR_FPGA_IRQS		 24
+
+#define MAXIRQNUM		(IH_FPGA_BASE + NR_FPGA_IRQS - 1)
+#define MAXFIQNUM		MAXIRQNUM
+#define MAXSWINUM		MAXIRQNUM
+
+#define NR_IRQS			256
+
+#ifndef __ASSEMBLY__
+void fpga_write(unsigned char val, int reg);
+unsigned char fpga_read(int reg);
+#endif
+
+#elif defined (CONFIG_ARCH_OMAP1610)
+
+/* At OMAP1610 Innovator the Ethernet is directly connected to CS1 */
+#define OMAP1610_ETHR_BASE		0xE8000000
+#define OMAP1610_ETHR_SIZE		SZ_4K
+#define OMAP1610_ETHR_START		0x04000000
+
+/* Intel STRATA NOR flash at CS3 */
+#define OMAP1610_NOR_FLASH_BASE		0xD8000000
+#define OMAP1610_NOR_FLASH_SIZE		SZ_32M
+#define OMAP1610_NOR_FLASH_START	0x0C000000
+
+#define MAXIRQNUM			(IH_BOARD_BASE)
+#define MAXFIQNUM			MAXIRQNUM
+#define MAXSWINUM			MAXIRQNUM
+
+#define NR_IRQS				(MAXIRQNUM + 1)
+
+#else
+#error "Only OMAP1510 and OMAP1610 Innovator supported!"
+#endif
+#endif
--- diff/include/asm-arm/arch-omap/omap-perseus2.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/omap-perseus2.h	2004-04-21 10:45:35.815258752 +0100
@@ -0,0 +1,152 @@
+/*
+ *  linux/include/asm-arm/arch-omap/omap-perseus2.h
+ *
+ *  Copyright 2003 by Texas Instruments Incorporated
+ *    OMAP730 / P2-sample additions
+ *    Author: Jean Pihet
+ *
+ * Copyright (C) 2001 RidgeRun, Inc. (http://www.ridgerun.com)
+ * Author: RidgeRun, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#ifndef __ASM_ARCH_OMAP_P2SAMPLE_H
+#define __ASM_ARCH_OMAP_P2SAMPLE_H
+
+#if defined(CONFIG_ARCH_OMAP730) && defined (CONFIG_MACH_OMAP_PERSEUS2)
+
+/*
+ * NOTE:  ALL DEFINITIONS IN THIS FILE NEED TO BE PREFIXED BY IDENTIFIER
+ *	  P2SAMPLE_ since they are specific to the EVM and not the chip.
+ */
+
+/* ---------------------------------------------------------------------------
+ *  OMAP730 Debug Board FPGA
+ * ---------------------------------------------------------------------------
+ *
+ */
+
+/* maps in the FPGA registers and the ETHR registers */
+#define OMAP730_FPGA_BASE		0xE8000000	/* VA */
+#define OMAP730_FPGA_SIZE		SZ_4K		/* SIZE */
+#define OMAP730_FPGA_START		0x04000000	/* PA */
+
+#define OMAP730_FPGA_ETHR_START		OMAP730_FPGA_START
+#define OMAP730_FPGA_ETHR_BASE		OMAP730_FPGA_BASE
+#define OMAP730_FPGA_FPGA_REV		(OMAP730_FPGA_BASE + 0x10)	/* FPGA Revision */
+#define OMAP730_FPGA_BOARD_REV		(OMAP730_FPGA_BASE + 0x12)	/* Board Revision */
+#define OMAP730_FPGA_GPIO		(OMAP730_FPGA_BASE + 0x14)	/* GPIO outputs */
+#define OMAP730_FPGA_LEDS		(OMAP730_FPGA_BASE + 0x16)	/* LEDs outputs */
+#define OMAP730_FPGA_MISC_INPUTS	(OMAP730_FPGA_BASE + 0x18)	/* Misc inputs */
+#define OMAP730_FPGA_LAN_STATUS		(OMAP730_FPGA_BASE + 0x1A)	/* LAN Status line */
+#define OMAP730_FPGA_LAN_RESET		(OMAP730_FPGA_BASE + 0x1C)	/* LAN Reset line */
+
+// LEDs definition on debug board (16 LEDs)
+#define OMAP730_FPGA_LED_CLAIMRELEASE	(1 << 15)
+#define OMAP730_FPGA_LED_STARTSTOP	(1 << 14)
+#define OMAP730_FPGA_LED_HALTED		(1 << 13)
+#define OMAP730_FPGA_LED_IDLE		(1 << 12)
+#define OMAP730_FPGA_LED_TIMER		(1 << 11)
+// cpu0 load-meter LEDs
+#define OMAP730_FPGA_LOAD_METER		(1 << 0)	// A bit of fun on our board ...
+#define OMAP730_FPGA_LOAD_METER_SIZE	11
+#define OMAP730_FPGA_LOAD_METER_MASK	((1 << OMAP730_FPGA_LOAD_METER_SIZE) - 1)
+
+#ifndef OMAP_SDRAM_DEVICE
+#define OMAP_SDRAM_DEVICE		D256M_1X16_4B
+#endif
+
+
+/*
+ * These definitions define an area of FLASH set aside
+ * for the use of MTD/JFFS2. This is the area of flash
+ * that a JFFS2 filesystem will reside which is mounted
+ * at boot with the "root=/dev/mtdblock/0 rw"
+ * command line option.
+ */
+
+/* Intel flash_0, partitioned as expected by rrload */
+#define OMAP_FLASH_0_BASE	0xD8000000	/* VA */
+#define OMAP_FLASH_0_START	0x00000000	/* PA */
+#define OMAP_FLASH_0_SIZE	SZ_32M
+
+/* 2.9.6 Traffic Controller Memory Interface Registers */
+#define OMAP_FLASH_CFG_0		0xfffecc10
+#define OMAP_FLASH_ACFG_0		0xfffecc50
+
+#define OMAP_FLASH_CFG_1		0xfffecc14
+#define OMAP_FLASH_ACFG_1		0xfffecc54
+
+/*
+ * Configuration Registers
+ */
+#define PERSEUS2_CONFIG_BASE	   0xfffe1000
+#define PERSEUS2_IO_CONF_0	   0xfffe1070
+#define PERSEUS2_IO_CONF_1	   0xfffe1074
+#define PERSEUS2_IO_CONF_2	   0xfffe1078
+#define PERSEUS2_IO_CONF_3	   0xfffe107c
+#define PERSEUS2_IO_CONF_4	   0xfffe1080
+#define PERSEUS2_IO_CONF_5	   0xfffe1084
+#define PERSEUS2_IO_CONF_6	   0xfffe1088
+#define PERSEUS2_IO_CONF_7	   0xfffe108c
+#define PERSEUS2_IO_CONF_8	   0xfffe1090
+#define PERSEUS2_IO_CONF_9	   0xfffe1094
+#define PERSEUS2_IO_CONF_10	   0xfffe1098
+#define PERSEUS2_IO_CONF_11	   0xfffe109c
+#define PERSEUS2_IO_CONF_12	   0xfffe10a0
+#define PERSEUS2_IO_CONF_13	   0xfffe10a4
+
+#define PERSEUS2_MODE_1		   0xfffe1010
+#define PERSEUS2_MODE_2		   0xfffe1014
+
+/* CSMI specials: in terms of base + offset */
+#define PERSEUS2_MODE2_OFFSET	   0x14
+
+/* DSP control: ICR registers */
+#define ICR_BASE		0xfffbb800
+/* M_CTL */
+#define DSP_M_CTL		((volatile __u16 *)0xfffbb804)
+/* DSP control: MMU registers */
+#define DSP_MMU_BASE		((volatile __u16 *)0xfffed200)
+
+/* The Ethernet Controller IRQ is cascaded to MPU_EXT_nIRQ througb the FPGA */
+#define INT_ETHER		INT_730_MPU_EXT_NIRQ
+
+#define MAXIRQNUM		IH_BOARD_BASE
+#define MAXFIQNUM		MAXIRQNUM
+#define MAXSWINUM		MAXIRQNUM
+
+#define NR_IRQS			(MAXIRQNUM + 1)
+
+#ifndef __ASSEMBLY__
+void fpga_write(unsigned char val, int reg);
+unsigned char fpga_read(int reg);
+#endif
+
+/* PCC_UPLD control register: OMAP730 */
+#define PCC_UPLD_CTRL_REG_BASE	(0xfffe0900)
+#define PCC_UPLD_CTRL_REG	(volatile __u16 *)(PCC_UPLD_CTRL_REG_BASE + 0x00)
+
+#else
+#error "Only OMAP730 Perseus2 supported!"
+#endif
+
+#endif
--- diff/include/asm-arm/arch-omap/omap1510.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/omap1510.h	2004-04-21 10:45:35.816258600 +0100
@@ -0,0 +1,54 @@
+/* linux/include/asm-arm/arch-omap/omap1510.h
+ *
+ * Hardware definitions for TI OMAP1510 processor.
+ *
+ * Cleanup for Linux-2.6 by Dirk Behme <dirk.behme@de.bosch.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the  GNU General Public License along
+ * with this program; if not, write  to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __ASM_ARCH_OMAP1510_H
+#define __ASM_ARCH_OMAP1510_H
+
+/*
+ * ----------------------------------------------------------------------------
+ * Base addresses
+ * ----------------------------------------------------------------------------
+ */
+
+/* Syntax: XX_BASE = Virtual base address, XX_START = Physical base address */
+
+#define OMAP_SRAM_BASE		0xD0000000
+#define OMAP_SRAM_SIZE		(SZ_128K + SZ_64K)
+#define OMAP_SRAM_START		0x20000000
+
+#define OMAP_MCBSP1_BASE	0xE1011000
+#define OMAP_MCBSP1_SIZE	SZ_4K
+#define OMAP_MCBSP1_START	0xE1011000
+
+#define OMAP_MCBSP2_BASE	0xFFFB1000
+
+#define OMAP_MCBSP3_BASE	0xE1017000
+#define OMAP_MCBSP3_SIZE	SZ_4K
+#define OMAP_MCBSP3_START	0xE1017000
+
+#endif /*  __ASM_ARCH_OMAP1510_H */
+
--- diff/include/asm-arm/arch-omap/omap1610.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/omap1610.h	2004-04-21 10:45:35.816258600 +0100
@@ -0,0 +1,73 @@
+/* linux/include/asm-arm/arch-omap/omap1610.h
+ *
+ * Hardware definitions for TI OMAP1610 processor.
+ *
+ * Cleanup for Linux-2.6 by Dirk Behme <dirk.behme@de.bosch.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the  GNU General Public License along
+ * with this program; if not, write  to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __ASM_ARCH_OMAP1610_H
+#define __ASM_ARCH_OMAP1610_H
+
+/*
+ * ----------------------------------------------------------------------------
+ * Base addresses
+ * ----------------------------------------------------------------------------
+ */
+
+/* Syntax: XX_BASE = Virtual base address, XX_START = Physical base address */
+
+#define OMAP_SRAM_BASE		0xD0000000
+#define OMAP_SRAM_SIZE		(SZ_16K)
+#define OMAP_SRAM_START		0x20000000
+
+/*
+ * ----------------------------------------------------------------------------
+ * System control registers
+ * ----------------------------------------------------------------------------
+ */
+
+#define OMAP_RESET_CONTROL	0xfffe1140
+#define ARM_IDLECT3		(CLKGEN_RESET_BASE + 0x24)
+#define CONF_VOLTAGE_CTRL_0	0xfffe1060
+#define CONF_VOLTAGE_VDDSHV6	(1 << 8)
+#define CONF_VOLTAGE_VDDSHV7	(1 << 9)
+#define CONF_VOLTAGE_VDDSHV8	(1 << 10)
+#define CONF_VOLTAGE_VDDSHV9	(1 << 11)
+#define SUBLVDS_CONF_VALID	(1 << 13)
+
+/*
+ * ---------------------------------------------------------------------------
+ * TIPB bus interface
+ * ---------------------------------------------------------------------------
+ */
+
+#define OMAP_TIPB_SWITCH	0xfffbc800
+#define TIPB_BRIDGE_INT		0xfffeca00	/* Private TIPB_CNTL */
+#define PRIVATE_MPU_TIPB_CNTL	0xfffeca08
+#define TIPB_BRIDGE_EXT		0xfffed300	/* Public (Shared) TIPB_CNTL */
+#define PUBLIC_MPU_TIPB_CNTL	0xfffed308
+#define TIPB_SWITCH_CFG		OMAP_TIPB_SWITCH
+#define MMCSD2_SSW_MPU_CONF	(TIPB_SWITCH_CFG + 0x160)
+
+#endif /*  __ASM_ARCH_OMAP1610_H */
+
--- diff/include/asm-arm/arch-omap/omap730.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/omap730.h	2004-04-21 10:45:35.816258600 +0100
@@ -0,0 +1,50 @@
+/* linux/include/asm-arm/arch-omap/omap730.h
+ *
+ * Hardware definitions for TI OMAP730 processor.
+ *
+ * Cleanup for Linux-2.6 by Dirk Behme <dirk.behme@de.bosch.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the  GNU General Public License along
+ * with this program; if not, write  to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __ASM_ARCH_OMAP730_H
+#define __ASM_ARCH_OMAP730_H
+
+/*
+ * ----------------------------------------------------------------------------
+ * Base addresses
+ * ----------------------------------------------------------------------------
+ */
+
+/* Syntax: XX_BASE = Virtual base address, XX_START = Physical base address */
+
+#define OMAP_SRAM_BASE		0xD0000000
+#define OMAP_SRAM_SIZE		(SZ_128K + SZ_64K + SZ_8K)
+#define OMAP_SRAM_START		0x20000000
+
+#define OMAP_MCBSP1_BASE	0xfffb1000
+#define OMAP_MCBSP1_SIZE	(SZ_1K * 2)
+#define OMAP_MCBSP1_START	0xfffb1000
+
+#define OMAP_MCBSP2_BASE	0xfffb1800
+
+#endif /*  __ASM_ARCH_OMAP730_H */
+
--- diff/include/asm-arm/arch-omap/param.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/param.h	2004-04-21 10:45:35.817258448 +0100
@@ -0,0 +1,24 @@
+/*
+ *  linux/include/asm-arm/arch-omap/param.h
+ *
+ *  Initially based on linux/include/asm-arm/arch-integrator/param.h
+ *  Copyright (C) 1999 ARM Limited
+ *
+ *  BRIEF MODULE DESCRIPTION
+ *   a place holder
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
--- diff/include/asm-arm/arch-omap/pm.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/pm.h	2004-04-21 10:45:35.817258448 +0100
@@ -0,0 +1,150 @@
+/*
+ * FILE NAME include/asm/arch-omap/pm.h
+ *
+ * BRIEF MODULE DESCRIPTION
+ *
+ * Author: MontaVista Software, Inc.
+ *	   support@mvista.com
+ *
+ * Copyright 2002 MontaVista Software Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ * List of global OMAP registers to preserve.  All registers are 16 bits
+ * and must be accessed with 16 read/writes.
+ * More ones like CP and general purpose register values are preserved
+ * with the stack pointer in sleep.S.
+ */
+#ifndef __ASM_ARCH_OMAP1510_PM_H
+#define __ASM_ARCH_OMAP1510_PM_H
+
+#define ARM_REG_BASE		(0xfffece00)
+#define ARM_ASM_IDLECT1		(ARM_REG_BASE + 0x4)
+#define ARM_ASM_IDLECT2		(ARM_REG_BASE + 0x8)
+#define ARM_ASM_RSTCT1		(ARM_REG_BASE + 0x10)
+#define ARM_ASM_RSTCT2		(ARM_REG_BASE + 0x14)
+#define ARM_ASM_SYSST		(ARM_REG_BASE + 0x18)
+/*
+ * Traffic Controller Memory Interface Registers
+ */
+#define TCMIF_BASE		0xfffecc00
+#define EMIFS_ASM_CONFIG_REG	(TCMIF_BASE + 0x0c)
+#define EMIFF_ASM_SDRAM_CONFIG	(TCMIF_BASE + 0x20)
+#define IRQ_MIR1	(volatile unsigned int *)(OMAP_IH1_BASE + IRQ_MIR)
+#define IRQ_MIR2	(volatile unsigned int *)(OMAP_IH2_BASE + IRQ_MIR)
+
+#define IDLE_WAIT_CYCLES		0x000000ff
+#define PERIPHERAL_ENABLE		0x2
+#define BIG_SLEEP_REQUEST		0x0cc5
+#define IDLE_LOOP_REQUEST		0x0c00
+#define SELF_REFRESH_MODE		0x0c000001
+#define IDLE_EMIFS_REQUEST		0xc
+#define IDLE_CLOCK_DOMAINS		0x2
+#define MODEM_32K_EN			0x1
+
+#ifndef __ASSEMBLER__
+extern void omap1510_pm_idle(void);
+extern void omap_pm_suspend(void);
+extern int omap1510_cpu_suspend(void);
+extern int omap1510_idle_loop_suspend(void);
+extern struct async_struct *omap_pm_sercons;
+extern unsigned int serial_in(struct async_struct *, int);
+extern unsigned int serial_out(struct async_struct *, int, int);
+
+#define OMAP1510_SRAM_IDLE_SUSPEND	0xd002F000
+#define OMAP1510_SRAM_API_SUSPEND	0xd002F200
+#define CPU_SUSPEND_SIZE	200
+#define ARM_REG_BASE		(0xfffece00)
+#define ARM_ASM_IDLECT1		(ARM_REG_BASE + 0x4)
+#define ARM_ASM_IDLECT2		(ARM_REG_BASE + 0x8)
+#define ARM_ASM_RSTCT1		(ARM_REG_BASE + 0x10)
+#define ARM_ASM_RSTCT2		(ARM_REG_BASE + 0x14)
+#define ARM_ASM_SYSST		(ARM_REG_BASE + 0x18)
+
+#define TCMIF_BASE		0xfffecc00
+#define PM_EMIFS_CONFIG_REG	   (volatile unsigned int *)(TCMIF_BASE + 0x0c)
+#define PM_EMIFF_SDRAM_CONFIG	   (volatile unsigned int *)(TCMIF_BASE + 0x20)
+
+#define ULPD_LOW_POWER_REQ		0x3
+
+#define DSP_IDLE_DELAY			10
+#define DSP_IDLE			0x0040
+#define DSP_ENABLE			0x0002
+#define SUFFICIENT_DSP_RESET_TIME	1000
+#define DEFAULT_MPUI_CONFIG		0x05cf
+#define ENABLE_XORCLK			0x2
+#define DSP_RESET			0x2000
+#define TC_IDLE_REQUEST			(0x0000000c)
+#define EMIFF_CONFIG_REG		EMIFF_SDRAM_CONFIG
+
+
+#define ARM_SAVE(x) arm_sleep_save[ARM_SLEEP_SAVE_##x] = (unsigned short)*x
+#define ARM_RESTORE(x) *x = (unsigned short)arm_sleep_save[ARM_SLEEP_SAVE_##x]
+#define ARM_SHOW(x) arm_sleep_save[ARM_SLEEP_SAVE_##x]
+
+#define ULPD_SAVE(x) ulpd_sleep_save[ULPD_SLEEP_SAVE_##x] = (unsigned short)*x
+#define ULPD_RESTORE(x) *x = (unsigned short)ulpd_sleep_save[ULPD_SLEEP_SAVE_##x]
+#define ULPD_SHOW(x) ulpd_sleep_save[ULPD_SLEEP_SAVE_##x]
+
+#define MPUI_SAVE(x) mpui_sleep_save[MPUI_SLEEP_SAVE_##x] = (unsigned int)*x
+#define MPUI_RESTORE(x) *x = (unsigned int)mpui_sleep_save[MPUI_SLEEP_SAVE_##x]
+#define MPUI_SHOW(x) (unsigned int)mpui_sleep_save[MPUI_SLEEP_SAVE_##x]
+
+enum arm_save_state {
+	ARM_SLEEP_SAVE_START = 0,
+	/*
+	 * 9 MPU control registers, all 16 bits
+	 */
+	ARM_SLEEP_SAVE_ARM_CKCTL, ARM_SLEEP_SAVE_ARM_IDLECT1,
+	ARM_SLEEP_SAVE_ARM_IDLECT2, ARM_SLEEP_SAVE_ARM_EWUPCT,
+	ARM_SLEEP_SAVE_ARM_RSTCT1, ARM_SLEEP_SAVE_ARM_RSTCT2,
+	ARM_SLEEP_SAVE_ARM_SYSST,
+
+	ARM_SLEEP_SAVE_SIZE
+};
+
+enum ulpd_save_state {
+	ULDP_SLEEP_SAVE_START = 0,
+	ULPD_SLEEP_SAVE_ULPD_IT_STATUS_REG, ULPD_SLEEP_SAVE_ULPD_CLOCK_CTRL_REG,
+	ULPD_SLEEP_SAVE_ULPD_SOFT_REQ_REG, ULPD_SLEEP_SAVE_ULPD_STATUS_REQ_REG,
+	ULPD_SLEEP_SAVE_ULPD_DPLL_CTRL_REG, ULPD_SLEEP_SAVE_ULPD_POWER_CTRL_REG,
+	ULPD_SLEEP_SAVE_SIZE
+};
+
+enum mpui_save_state {
+	/*
+	 * MPUI registers 32 bits
+	 */
+	MPUI_SLEEP_SAVE_MPUI_CTRL_REG, MPUI_SLEEP_SAVE_MPUI_DSP_BOOT_CONFIG,
+	MPUI_SLEEP_SAVE_MPUI_DSP_API_CONFIG,
+	MPUI_SLEEP_SAVE_MPUI_DSP_STATUS_REG,
+	MPUI_SLEEP_SAVE_PM_EMIFF_SDRAM_CONFIG,
+	MPUI_SLEEP_SAVE_PM_EMIFS_CONFIG_REG,
+	MPUI_SLEEP_SAVE_IRQ_MIR1, MPUI_SLEEP_SAVE_IRQ_MIR2,
+
+	MPUI_SLEEP_SAVE_SIZE
+};
+
+
+#endif	/* ASSEMBLER */
+#endif
--- diff/include/asm-arm/arch-omap/serial.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/serial.h	2004-04-21 10:45:35.818258296 +0100
@@ -0,0 +1,167 @@
+/*
+ * linux/include/asm-arm/arch-omap/serial.h
+ *
+ * BRIEF MODULE DESCRIPTION
+ * serial definitions
+ *
+ */
+
+#ifndef __ASM_ARCH_SERIAL_H
+#define __ASM_ARCH_SERIAL_H
+
+
+#define OMAP1510_UART1_BASE	(unsigned char *)0xfffb0000
+#define OMAP1510_UART2_BASE	(unsigned char *)0xfffb0800
+#define OMAP1510_UART3_BASE	(unsigned char *)0xfffb9800
+
+#define OMAP730_UART1_BASE	(unsigned char *)0xfffb0000
+#define OMAP730_UART2_BASE	(unsigned char *)0xfffb0800
+
+#if defined(CONFIG_ARCH_OMAP1510) || defined(CONFIG_ARCH_OMAP1610)
+#define OMAP_SERIAL_REG_SHIFT 2
+#else
+#define OMAP_SERIAL_REG_SHIFT 0
+#endif
+
+
+#ifndef __ASSEMBLY__
+
+#include <asm/arch/hardware.h>
+#include <asm/irq.h>
+
+
+/* UART3 Registers Maping through MPU bus */
+#define OMAP_MPU_UART3_BASE	0xFFFB9800	/* UART3 through MPU bus */
+#define UART3_RHR		(OMAP_MPU_UART3_BASE + 0)
+#define UART3_THR		(OMAP_MPU_UART3_BASE + 0)
+#define UART3_DLL		(OMAP_MPU_UART3_BASE + 0)
+#define UART3_IER		(OMAP_MPU_UART3_BASE + 4)
+#define UART3_DLH		(OMAP_MPU_UART3_BASE + 4)
+#define UART3_IIR		(OMAP_MPU_UART3_BASE + 8)
+#define UART3_FCR		(OMAP_MPU_UART3_BASE + 8)
+#define UART3_EFR		(OMAP_MPU_UART3_BASE + 8)
+#define UART3_LCR		(OMAP_MPU_UART3_BASE + 0x0C)
+#define UART3_MCR		(OMAP_MPU_UART3_BASE + 0x10)
+#define UART3_XON1_ADDR1	(OMAP_MPU_UART3_BASE + 0x10)
+#define UART3_XON2_ADDR2	(OMAP_MPU_UART3_BASE + 0x14)
+#define UART3_LSR		(OMAP_MPU_UART3_BASE + 0x14)
+#define UART3_TCR		(OMAP_MPU_UART3_BASE + 0x18)
+#define UART3_MSR		(OMAP_MPU_UART3_BASE + 0x18)
+#define UART3_XOFF1		(OMAP_MPU_UART3_BASE + 0x18)
+#define UART3_XOFF2		(OMAP_MPU_UART3_BASE + 0x1C)
+#define UART3_SPR		(OMAP_MPU_UART3_BASE + 0x1C)
+#define UART3_TLR		(OMAP_MPU_UART3_BASE + 0x1C)
+#define UART3_MDR1		(OMAP_MPU_UART3_BASE + 0x20)
+#define UART3_MDR2		(OMAP_MPU_UART3_BASE + 0x24)
+#define UART3_SFLSR		(OMAP_MPU_UART3_BASE + 0x28)
+#define UART3_TXFLL		(OMAP_MPU_UART3_BASE + 0x28)
+#define UART3_RESUME		(OMAP_MPU_UART3_BASE + 0x2C)
+#define UART3_TXFLH		(OMAP_MPU_UART3_BASE + 0x2C)
+#define UART3_SFREGL		(OMAP_MPU_UART3_BASE + 0x30)
+#define UART3_RXFLL		(OMAP_MPU_UART3_BASE + 0x30)
+#define UART3_SFREGH		(OMAP_MPU_UART3_BASE + 0x34)
+#define UART3_RXFLH		(OMAP_MPU_UART3_BASE + 0x34)
+#define UART3_BLR		(OMAP_MPU_UART3_BASE + 0x38)
+#define UART3_ACREG		(OMAP_MPU_UART3_BASE + 0x3C)
+#define UART3_DIV16		(OMAP_MPU_UART3_BASE + 0x3C)
+#define UART3_SCR		(OMAP_MPU_UART3_BASE + 0x40)
+#define UART3_SSR		(OMAP_MPU_UART3_BASE + 0x44)
+#define UART3_EBLR		(OMAP_MPU_UART3_BASE + 0x48)
+#define UART3_OSC_12M_SEL	(OMAP_MPU_UART3_BASE + 0x4C)
+#define UART3_MVR		(OMAP_MPU_UART3_BASE + 0x50)
+
+#ifdef CONFIG_ARCH_OMAP1510
+#define BASE_BAUD (12000000/16)
+#endif
+
+#ifdef CONFIG_ARCH_OMAP1610
+#define BASE_BAUD (48000000/16)
+#endif
+
+#ifdef CONFIG_ARCH_OMAP730
+#define BASE_BAUD (48000000/16)
+
+#define RS_TABLE_SIZE		2
+
+#define STD_COM_FLAGS	(ASYNC_SKIP_TEST)
+
+#define STD_SERIAL_PORT_DEFNS	\
+	{	\
+		.uart =			PORT_OMAP,		\
+		.baud_base =		BASE_BAUD,		\
+		.iomem_base =		OMAP730_UART1_BASE,	\
+		.iomem_reg_shift =	0,			\
+		.io_type =		SERIAL_IO_MEM,		\
+		.irq =			INT_UART1,		\
+		.flags =			STD_COM_FLAGS,		\
+	}, {	\
+		.uart =			PORT_OMAP,		\
+		.baud_base =		BASE_BAUD,		\
+		.iomem_base =		OMAP730_UART2_BASE,	\
+		.iomem_reg_shift =	0,			\
+		.io_type =		SERIAL_IO_MEM,		\
+		.irq =			INT_UART2,		\
+		.flags =			STD_COM_FLAGS,		\
+	}
+
+#else
+
+#define RS_TABLE_SIZE	3
+
+#define STD_COM_FLAGS	(ASYNC_SKIP_TEST)
+
+#define STD_SERIAL_PORT_DEFNS	\
+	{	\
+		.uart =			PORT_OMAP,		\
+		.baud_base =		BASE_BAUD,		\
+		.iomem_base =		OMAP1510_UART1_BASE,	\
+		.iomem_reg_shift =	2,			\
+		.io_type =		SERIAL_IO_MEM,		\
+		.irq =			INT_UART1,		\
+		.flags =		STD_COM_FLAGS,		\
+	}, {	\
+		.uart =			PORT_OMAP,		\
+		.baud_base =		BASE_BAUD,		\
+		.iomem_base =		OMAP1510_UART2_BASE,	\
+		.iomem_reg_shift =	2,			\
+		.io_type =		SERIAL_IO_MEM,		\
+		.irq =			INT_UART2,		\
+		.flags =		STD_COM_FLAGS,		\
+	}, {	\
+		.uart =			PORT_OMAP,		\
+		.baud_base =		BASE_BAUD,		\
+		.iomem_base =		OMAP1510_UART3_BASE,	\
+		.iomem_reg_shift =	2,			\
+		.io_type =		SERIAL_IO_MEM,		\
+		.irq =			INT_UART3,		\
+		.flags =		STD_COM_FLAGS,		\
+	}
+#endif				/* CONFIG_ARCH_OMAP730 */
+
+#define EXTRA_SERIAL_PORT_DEFNS
+
+/* OMAP FCR trigger  redefinitions */
+#define UART_FCR_R_TRIGGER_8	0x00	/* Mask for receive trigger set at 8 */
+#define UART_FCR_R_TRIGGER_16	0x40	/* Mask for receive trigger set at 16 */
+#define UART_FCR_R_TRIGGER_56	0x80	/* Mask for receive trigger set at 56 */
+#define UART_FCR_R_TRIGGER_60	0xC0	/* Mask for receive trigger set at 60 */
+
+/* There is an error in the description of the transmit trigger levels of
+   OMAP5910 TRM from January 2003. The transmit trigger level 56 is not
+   56 but 32, the transmit trigger level 60 is not 60 but 56!
+   Additionally, the descritption of these trigger levels is
+   a little bit unclear. The trigger level define the number of EMPTY
+   entries in the FIFO. Thus, if TRIGGER_8 is used, an interrupt is requested
+   if 8 FIFO entries are empty (and 56 entries are still filled [the FIFO
+   size is 64]). Or: If TRIGGER_56 is selected, everytime there are less than
+   8 characters in the FIFO, an interrrupt is spawned. In other words: The
+   trigger number is equal the number of characters which can be
+   written without FIFO overrun */
+
+#define UART_FCR_T_TRIGGER_8	0x00	/* Mask for transmit trigger set at 8 */
+#define UART_FCR_T_TRIGGER_16	0x10	/* Mask for transmit trigger set at 16 */
+#define UART_FCR_T_TRIGGER_32	0x20	/* Mask for transmit trigger set at 32 */
+#define UART_FCR_T_TRIGGER_56	0x30	/* Mask for transmit trigger set at 56 */
+
+#endif	/* __ASSEMBLY__ */
+#endif	/* __ASM_ARCH_SERIAL_H */
--- diff/include/asm-arm/arch-omap/system.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/system.h	2004-04-21 10:45:35.818258296 +0100
@@ -0,0 +1,20 @@
+/*
+ * Copied from linux/include/asm-arm/arch-sa1100/system.h
+ * Copyright (c) 1999 Nicolas Pitre <nico@cam.org>
+ */
+#ifndef __ASM_ARCH_SYSTEM_H
+#define __ASM_ARCH_SYSTEM_H
+#include <linux/config.h>
+#include <asm/arch/hardware.h>
+
+static inline void arch_idle(void)
+{
+	cpu_do_idle();
+}
+
+static inline void arch_reset(char mode)
+{
+	*(volatile u16 *)(ARM_RSTCT1) = 1;
+}
+
+#endif
--- diff/include/asm-arm/arch-omap/time.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/time.h	2004-04-21 10:45:35.820257992 +0100
@@ -0,0 +1,212 @@
+/*
+ * linux/include/asm-arm/arch-omap/time.h
+ *
+ * 32kHz timer definition
+ *
+ * Copyright (C) 2000 RidgeRun, Inc.
+ * Author: Greg Lonnon <glonnon@ridgerun.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the  GNU General Public License along
+ * with this program; if not, write  to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#if !defined(__ASM_ARCH_OMAP_TIME_H)
+#define __ASM_ARCH_OMAP_TIME_H
+
+#include <linux/config.h>
+#include <linux/delay.h>
+#include <asm/system.h>
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/leds.h>
+#include <asm/irq.h>
+#include <asm/mach/irq.h>
+#include <asm/arch/clocks.h>
+
+#ifndef __instrument
+#define __instrument
+#define __noinstrument __attribute__ ((no_instrument_function))
+#endif
+
+typedef struct {
+	u32 cntl;     /* CNTL_TIMER, R/W */
+	u32 load_tim; /* LOAD_TIM,   W */
+	u32 read_tim; /* READ_TIM,   R */
+} mputimer_regs_t;
+
+#define mputimer_base(n) \
+    ((volatile mputimer_regs_t*)(OMAP_MPUTIMER_BASE + \
+				 (n)*OMAP_MPUTIMER_OFF))
+
+static inline unsigned long timer32k_read(int reg) {
+	unsigned long val;
+	val = (inw(IO_ADDRESS((reg) + OMAP_32kHz_TIMER_BASE)));
+	return val;
+}
+static inline void timer32k_write(int reg,int val) {
+	outw( (val), (IO_ADDRESS( (reg) + OMAP_32kHz_TIMER_BASE)));
+}
+
+/*
+ * How long is the timer interval? 100 HZ, right...
+ * IRQ rate = (TVR + 1) / 32768 seconds
+ * TVR = 32768 * IRQ_RATE -1
+ * IRQ_RATE =  1/100
+ * TVR = 326
+ */
+#define TIMER32k_PERIOD 326
+//#define TIMER32k_PERIOD 0x7ff
+
+static inline void start_timer32k(void) {
+	timer32k_write(TIMER32k_CR,
+		       TIMER32k_TSS | TIMER32k_TRB |
+		       TIMER32k_INT | TIMER32k_ARL);
+}
+
+#ifdef CONFIG_MACH_OMAP_PERSEUS2
+/*
+ * After programming PTV with 0 and setting the MPUTIM_CLOCK_ENABLE
+ * (external clock enable)  bit, the timer count rate is 6.5 MHz (13
+ * MHZ input/2). !! The divider by 2 is undocumented !!
+ */
+#define MPUTICKS_PER_SEC (13000000/2)
+#else
+/*
+ * After programming PTV with 0, the timer count rate is 6 MHz.
+ * WARNING! this must be an even number, or machinecycles_to_usecs
+ * below will break.
+ */
+#define MPUTICKS_PER_SEC  (12000000/2)
+#endif
+
+static int mputimer_started[3] = {0,0,0};
+
+static inline void __noinstrument start_mputimer(int n,
+						 unsigned long load_val)
+{
+	volatile mputimer_regs_t* timer = mputimer_base(n);
+
+	mputimer_started[n] = 0;
+	timer->cntl = MPUTIM_CLOCK_ENABLE;
+	udelay(1);
+
+	timer->load_tim = load_val;
+        udelay(1);
+	timer->cntl = (MPUTIM_CLOCK_ENABLE | MPUTIM_AR | MPUTIM_ST);
+	mputimer_started[n] = 1;
+}
+
+static inline unsigned long __noinstrument
+read_mputimer(int n)
+{
+	volatile mputimer_regs_t* timer = mputimer_base(n);
+	return (mputimer_started[n] ? timer->read_tim : 0);
+}
+
+void __noinstrument start_mputimer1(unsigned long load_val)
+{
+	start_mputimer(0, load_val);
+}
+void __noinstrument start_mputimer2(unsigned long load_val)
+{
+	start_mputimer(1, load_val);
+}
+void __noinstrument start_mputimer3(unsigned long load_val)
+{
+	start_mputimer(2, load_val);
+}
+
+unsigned long __noinstrument read_mputimer1(void)
+{
+	return read_mputimer(0);
+}
+unsigned long __noinstrument read_mputimer2(void)
+{
+	return read_mputimer(1);
+}
+unsigned long __noinstrument read_mputimer3(void)
+{
+	return read_mputimer(2);
+}
+
+unsigned long __noinstrument do_getmachinecycles(void)
+{
+	return 0 - read_mputimer(0);
+}
+
+unsigned long __noinstrument machinecycles_to_usecs(unsigned long mputicks)
+{
+	/* Round up to nearest usec */
+	return ((mputicks * 1000) / (MPUTICKS_PER_SEC / 2 / 1000) + 1) >> 1;
+}
+
+/*
+ * This marks the time of the last system timer interrupt
+ * that was *processed by the ISR* (timer 2).
+ */
+static unsigned long systimer_mark;
+
+static unsigned long omap1510_gettimeoffset(void)
+{
+	/* Return elapsed usecs since last system timer ISR */
+	return machinecycles_to_usecs(do_getmachinecycles() - systimer_mark);
+}
+
+static irqreturn_t
+omap1510_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+	unsigned long now, ilatency;
+
+	/*
+	 * Mark the time at which the timer interrupt ocurred using
+	 * timer1. We need to remove interrupt latency, which we can
+	 * retrieve from the current system timer2 counter. Both the
+	 * offset timer1 and the system timer2 are counting at 6MHz,
+	 * so we're ok.
+	 */
+	now = 0 - read_mputimer1();
+	ilatency = MPUTICKS_PER_SEC / 100 - read_mputimer2();
+	systimer_mark = now - ilatency;
+
+	do_leds();
+	do_timer(regs);
+	do_profile(regs);
+
+	return IRQ_HANDLED;
+}
+
+void __init time_init(void)
+{
+	/* Since we don't call request_irq, we must init the structure */
+	gettimeoffset = omap1510_gettimeoffset;
+
+	timer_irq.handler = omap1510_timer_interrupt;
+	timer_irq.flags = SA_INTERRUPT;
+#ifdef OMAP1510_USE_32KHZ_TIMER
+	timer32k_write(TIMER32k_CR, 0x0);
+	timer32k_write(TIMER32k_TVR,TIMER32k_PERIOD);
+	setup_irq(INT_OS_32kHz_TIMER, &timer_irq);
+	start_timer32k();
+#else
+	setup_irq(INT_TIMER2, &timer_irq);
+	start_mputimer2(MPUTICKS_PER_SEC / 100 - 1);
+#endif
+}
+
+#endif
--- diff/include/asm-arm/arch-omap/timex.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/timex.h	2004-04-21 10:45:35.820257992 +0100
@@ -0,0 +1,35 @@
+/*
+ * linux/include/asm-arm/arch-omap/timex.h
+ *
+ * Copyright (C) 2000 RidgeRun, Inc.
+ * Author:  Greg Lonnon <glonnon@ridgerun.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * You should have received a copy of the  GNU General Public License along
+ * with this program; if not, write  to the Free Software Foundation, Inc.,
+ * 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#if !defined(__ASM_ARCH_OMAP_TIMEX_H)
+#define __ASM_ARCH_OMAP_TIMEX_H
+
+#include <asm/arch/clocks.h>
+/* TC clock */
+#define CLOCK_TICK_RATE		((OMAP_CK_MAX_RATE*1000000)/2)
+
+#endif /* __ASM_ARCH_OMAP_TIMEX_H */
--- diff/include/asm-arm/arch-omap/uncompress.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/uncompress.h	2004-04-21 10:45:35.821257840 +0100
@@ -0,0 +1,76 @@
+/*
+ * linux/include/asm-arm/arch-omap/uncompress.h
+ *
+ * Serial port stubs for kernel decompress status messages
+ *
+ * Initially based on:
+ * linux-2.4.15-rmk1-dsplinux1.6/include/asm-arm/arch-omap1510/uncompress.h
+ * Copyright (C) 2000 RidgeRun, Inc.
+ * Author: Greg Lonnon <glonnon@ridgerun.com>
+ *
+ * Rewritten by:
+ * Author: <source@mvista.com>
+ * 2004 (c) MontaVista Software, Inc.
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#include <linux/config.h>
+#include <linux/types.h>
+#include <linux/serial_reg.h>
+#include <asm/mach-types.h>
+#include <asm/hardware.h>
+#include <asm/arch/serial.h>
+
+
+#define check_port(base, shift) ((base[UART_OMAP_MDR1 << shift] & 7) == 0)
+
+static void
+puts(const char *s)
+{
+	volatile u8 * uart = 0;
+	int shift = 0;
+
+	/* Determine which serial port to use */
+	do {
+		if (machine_is_innovator()) {
+			shift = 2;
+			uart = (volatile u8 *)(OMAP1510_UART1_BASE);
+		} else {
+			/* Assume nothing for unknown machines.
+			 * Add an entry for your machine to select
+			 * the default serial console here. If the
+			 * serial port is enabled, we'll use it to
+			 * display status messages. Else we'll be
+			 * quiet.
+			 */
+			return;
+		}
+		if (check_port(uart, shift))
+			break;
+		/* Silent boot if no serial ports are enabled. */
+		return;
+	} while (0);
+
+	/*
+	 * Now, xmit each character
+	 */
+	while (*s) {
+		while (!(uart[UART_LSR << shift] & UART_LSR_THRE))
+			barrier();
+		uart[UART_TX << shift] = *s;
+		if (*s++ == '\n') {
+			while (!(uart[UART_LSR << shift] & UART_LSR_THRE))
+				barrier();
+			uart[UART_TX << shift] = '\r';
+		}
+	}
+}
+
+/*
+ * nothing to do
+ */
+#define arch_decomp_setup()
+#define arch_decomp_wdog()
--- diff/include/asm-arm/arch-omap/vmalloc.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-omap/vmalloc.h	2004-04-21 10:45:35.821257840 +0100
@@ -0,0 +1,32 @@
+/*
+ *  linux/include/asm-arm/arch-omap/vmalloc.h
+ *
+ *  Copyright (C) 2000 Russell King.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/*
+ * Just any arbitrary offset to the start of the vmalloc VM area: the
+ * current 8MB value just means that there will be a 8MB "hole" after the
+ * physical memory until the kernel virtual memory starts.  That means that
+ * any out-of-bounds memory accesses will hopefully be caught.
+ * The vmalloc() routines leaves a hole of 4kB between each vmalloced
+ * area for the same reason. ;)
+ */
+#define VMALLOC_OFFSET	  (8*1024*1024)
+#define VMALLOC_START	  (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
+#define VMALLOC_VMADDR(x) ((unsigned long)(x))
+#define VMALLOC_END	  (PAGE_OFFSET + 0x10000000)
--- diff/include/asm-arm/arch-s3c2410/bast-cpld.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/bast-cpld.h	2004-04-21 10:45:35.824257384 +0100
@@ -0,0 +1,25 @@
+/* linux/include/asm-arm/arch-s3c2410/bast-cpld.h
+ *
+ * (c) 2003 Simtec Electronics
+ *  Ben Dooks <ben@simtec.co.uk>
+ *
+ * BAST - CPLD control constants
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Changelog:
+ *  25-May-2003 BJD  Created file, added CTRL1 registers
+*/
+
+#ifndef __ASM_ARCH_BASTCPLD_H
+#define __ASM_ARCH_BASTCPLD_H
+
+#define BAST_CPLD_CTRL1_LRCOFF	    (0x00)
+#define BAST_CPLD_CTRL1_LRCADC	    (0x01)
+#define BAST_CPLD_CTRL1_LRCDAC	    (0x02)
+#define BAST_CPLD_CTRL1_LRCARM	    (0x03)
+#define BAST_CPLD_CTRL1_LRMASK	    (0x03)
+
+#endif /* __ASM_ARCH_BASTCPLD_H */
--- diff/include/asm-arm/arch-s3c2410/bast-irq.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/bast-irq.h	2004-04-21 10:45:35.824257384 +0100
@@ -0,0 +1,32 @@
+/* linux/include/asm-arm/arch-s3c2410/bast-irq.h
+ *
+ * (c) 2003,2004 Simtec Electronics
+ *  Ben Dooks <ben@simtec.co.uk>
+ *
+ * Machine BAST - IRQ Number definitions
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Changelog:
+ *  06-Jan-2003 BJD  Linux 2.6.0 version
+ */
+
+#ifndef __ASM_ARCH_BASTIRQ_H
+#define __ASM_ARCH_BASTIRQ_H
+
+/* irq numbers to onboard peripherals */
+
+#define IRQ_USBOC      IRQ_EINT19
+#define IRQ_IDE0       IRQ_EINT16
+#define IRQ_IDE1       IRQ_EINT17
+#define IRQ_PCSERIAL1  IRQ_EINT15
+#define IRQ_PCSERIAL2  IRQ_EINT14
+#define IRQ_PCPARALLEL IRQ_EINT13
+#define IRQ_ASIX       IRQ_EINT11
+#define IRQ_DM9000     IRQ_EINT10
+#define IRQ_ISA	       IRQ_EINT9
+#define IRQ_SMALERT    IRQ_EINT8
+
+#endif /* __ASM_ARCH_BASTIRQ_H */
--- diff/include/asm-arm/arch-s3c2410/bast-map.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/bast-map.h	2004-04-21 10:45:35.825257232 +0100
@@ -0,0 +1,150 @@
+/* linux/include/asm-arm/arch-s3c2410/bast-map.h
+ *
+ * (c) 2003,2004 Simtec Electronics
+ *  Ben Dooks <ben@simtec.co.uk>
+ *
+ * Machine BAST - Memory map definitions
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Changelog:
+ *  06-Jan-2003 BJD  Linux 2.6.0 version, moved bast specifics from arch/map.h
+ *  12-Mar-2004 BJD  Fixed header include protection
+*/
+
+/* needs arch/map.h including with this */
+
+/* ok, we've used up to 0x13000000, now we need to find space for the
+ * peripherals that live in the nGCS[x] areas, which are quite numerous
+ * in their space. We also have the board's CPLD to find register space
+ * for.
+ */
+
+#ifndef __ASM_ARCH_BASTMAP_H
+#define __ASM_ARCH_BASTMAP_H
+
+#define BAST_IOADDR(x)	   (S3C2410_ADDR((x) + 0x01300000))
+
+/* we put the CPLD registers next, to get them out of the way */
+
+#define BAST_VA_CTRL1	    BAST_IOADDR(0x00000000)	 /* 0x01300000 */
+#define BAST_PA_CTRL1	    (S3C2410_CS5 | 0x7800000)
+
+#define BAST_VA_CTRL2	    BAST_IOADDR(0x00100000)	 /* 0x01400000 */
+#define BAST_PA_CTRL2	    (S3C2410_CS1 | 0x6000000)
+
+#define BAST_VA_CTRL3	    BAST_IOADDR(0x00200000)	 /* 0x01500000 */
+#define BAST_PA_CTRL3	    (S3C2410_CS1 | 0x6800000)
+
+#define BAST_VA_CTRL4	    BAST_IOADDR(0x00300000)	 /* 0x01600000 */
+#define BAST_PA_CTRL4	    (S3C2410_CS1 | 0x7000000)
+
+/* next, we have the PC104 ISA interrupt registers */
+
+#define BAST_PA_PC104_IRQREQ  (S3C2410_CS5 | 0x6000000) /* 0x01700000 */
+#define BAST_VA_PC104_IRQREQ  BAST_IOADDR(0x00400000)
+
+#define BAST_PA_PC104_IRQRAW  (S3C2410_CS5 | 0x6800000) /* 0x01800000 */
+#define BAST_VA_PC104_IRQRAW  BAST_IOADDR(0x00500000)
+
+#define BAST_PA_PC104_IRQMASK (S3C2410_CS5 | 0x7000000) /* 0x01900000 */
+#define BAST_VA_PC104_IRQMASK BAST_IOADDR(0x00600000)
+
+#define BAST_PA_LCD_RCMD1     (0x8800000)
+#define BAST_VA_LCD_RCMD1     BAST_IOADDR(0x00700000)
+
+#define BAST_PA_LCD_WCMD1     (0x8000000)
+#define BAST_VA_LCD_WCMD1     BAST_IOADDR(0x00800000)
+
+#define BAST_PA_LCD_RDATA1    (0x9800000)
+#define BAST_VA_LCD_RDATA1    BAST_IOADDR(0x00900000)
+
+#define BAST_PA_LCD_WDATA1    (0x9000000)
+#define BAST_VA_LCD_WDATA1    BAST_IOADDR(0x00A00000)
+
+#define BAST_PA_LCD_RCMD2     (0xA800000)
+#define BAST_VA_LCD_RCMD2     BAST_IOADDR(0x00B00000)
+
+#define BAST_PA_LCD_WCMD2     (0xA000000)
+#define BAST_VA_LCD_WCMD2     BAST_IOADDR(0x00C00000)
+
+#define BAST_PA_LCD_RDATA2    (0xB800000)
+#define BAST_VA_LCD_RDATA2    BAST_IOADDR(0x00D00000)
+
+#define BAST_PA_LCD_WDATA2    (0xB000000)
+#define BAST_VA_LCD_WDATA2    BAST_IOADDR(0x00E00000)
+
+
+/* 0xE0000000 contains the IO space that is split by speed and
+ * wether the access is for 8 or 16bit IO... this ensures that
+ * the correct access is made
+ *
+ * 0x10000000 of space, partitioned as so:
+ *
+ * 0x00000000 to 0x04000000  8bit,  slow
+ * 0x04000000 to 0x08000000  16bit, slow
+ * 0x08000000 to 0x0C000000  16bit, net
+ * 0x0C000000 to 0x10000000  16bit, fast
+ *
+ * each of these spaces has the following in:
+ *
+ * 0x00000000 to 0x01000000 16MB ISA IO space
+ * 0x01000000 to 0x02000000 16MB ISA memory space
+ * 0x02000000 to 0x02100000 1MB  IDE primary channel
+ * 0x02100000 to 0x02200000 1MB  IDE primary channel aux
+ * 0x02200000 to 0x02400000 1MB  IDE secondary channel
+ * 0x02300000 to 0x02400000 1MB  IDE secondary channel aux
+ * 0x02400000 to 0x02500000 1MB  ASIX ethernet controller
+ * 0x02500000 to 0x02600000 1MB  Davicom DM9000 ethernet controller
+ * 0x02600000 to 0x02700000 1MB  PC SuperIO controller
+ *
+ * the phyiscal layout of the zones are:
+ *  nGCS2 - 8bit, slow
+ *  nGCS3 - 16bit, slow
+ *  nGCS4 - 16bit, net
+ *  nGCS5 - 16bit, fast
+ */
+
+#define BAST_VA_MULTISPACE (0xE0000000)
+
+#define BAST_VA_ISAIO	   (BAST_VA_MULTISPACE + 0x00000000)
+#define BAST_VA_ISAMEM	   (BAST_VA_MULTISPACE + 0x01000000)
+#define BAST_VA_IDEPRI	   (BAST_VA_MULTISPACE + 0x02000000)
+#define BAST_VA_IDEPRIAUX  (BAST_VA_MULTISPACE + 0x02100000)
+#define BAST_VA_IDESEC	   (BAST_VA_MULTISPACE + 0x02200000)
+#define BAST_VA_IDESECAUX  (BAST_VA_MULTISPACE + 0x02300000)
+#define BAST_VA_ASIXNET	   (BAST_VA_MULTISPACE + 0x02400000)
+#define BAST_VA_DM9000	   (BAST_VA_MULTISPACE + 0x02500000)
+#define BAST_VA_SUPERIO	   (BAST_VA_MULTISPACE + 0x02600000)
+
+#define BAST_VA_MULTISPACE (0xE0000000)
+
+#define BAST_VAM_CS2 (0x00000000)
+#define BAST_VAM_CS3 (0x04000000)
+#define BAST_VAM_CS4 (0x08000000)
+#define BAST_VAM_CS5 (0x0C000000)
+
+/* physical offset addresses for the peripherals */
+
+#define BAST_PA_ISAIO	  (0x00000000)
+#define BAST_PA_ASIXNET	  (0x01000000)
+#define BAST_PA_SUPERIO	  (0x01800000)
+#define BAST_PA_IDEPRI	  (0x02000000)
+#define BAST_PA_IDEPRIAUX (0x02800000)
+#define BAST_PA_IDESEC	  (0x03000000)
+#define BAST_PA_IDESECAUX (0x03800000)
+#define BAST_PA_ISAMEM	  (0x04000000)
+#define BAST_PA_DM9000	  (0x05000000)
+
+/* some configurations for the peripherals */
+
+#define BAST_PCSIO (BAST_VA_SUPERIO + BAST_VAM_CS2)
+/*  */
+
+#define BAST_ASIXNET_CS  BAST_VAM_CS5
+#define BAST_IDE_CS	 BAST_VAM_CS5
+#define BAST_DM9000_CS	 BAST_VAM_CS4
+
+#endif /* __ASM_ARCH_BASTMAP_H */
--- diff/include/asm-arm/arch-s3c2410/dma.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/dma.h	2004-04-21 10:45:35.825257232 +0100
@@ -0,0 +1,169 @@
+/* linux/include/asm-arm/arch-bast/dma.h
+ *
+ * Copyright (C) 2003 Simtec Electronics
+ *  Ben Dooks <ben@simtec.co.uk>
+ *
+ * Samsung S3C2410X DMA support
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Changelog:
+ *  ??-May-2003 BJD   Created file
+ *  ??-Jun-2003 BJD   Added more dma functionality to go with arch
+*/
+
+
+#ifndef __ASM_ARCH_DMA_H
+#define __ASM_ARCH_DMA_H
+
+#include <linux/config.h>
+#include "hardware.h"
+
+
+/*
+ * This is the maximum DMA address(physical address) that can be DMAd to.
+ *
+ */
+#define MAX_DMA_ADDRESS		0x20000000
+#define MAX_DMA_TRANSFER_SIZE	0x100000 /* Data Unit is half word  */
+
+
+/* according to the samsung port, we cannot use the regular
+ * dma channels... we must therefore provide our own interface
+ * for DMA, and allow our drivers to use that.
+ */
+
+#define MAX_DMA_CHANNELS	0
+
+
+/* we have 4 dma channels */
+#define S3C2410_DMA_CHANNELS	    (4)
+
+
+/* dma buffer */
+
+typedef struct s3c2410_dma_buf_s s3c2410_dma_buf_t;
+
+struct s3c2410_dma_buf_s {
+	s3c2410_dma_buf_t   *next;
+	int		     magic;	   /* magic */
+	int		     size;	   /* buffer size in bytes */
+	dma_addr_t	     data;	   /* start of DMA data */
+	dma_addr_t	     ptr;	   /* where the DMA got to [1] */
+	int		     ref;
+	void		     *id;	   /* client's id */
+	unsigned char	     no_callback;  /* disable callback for buffer */
+};
+
+/* [1] is this updated for both recv/send modes? */
+
+typedef struct s3c2410_dma_chan_s s3c2410_dma_chan_t;
+
+typedef void (*s3c2410_dma_cbfn_t)(s3c2410_dma_chan_t *, void *buf, int size);
+typedef void (*s3c2410_dma_enfn_t)(s3c2410_dma_chan_t *, int on);
+typedef void (*s3c2410_dma_pausefn_t)(s3c2410_dma_chan_t *, int on);
+
+struct s3c2410_dma_chan_s {
+	/* channel state flags */
+	unsigned char	       number;	      /* number of this dma channel */
+	unsigned char	       in_use;	      /* channel allocated */
+	unsigned char	       started;	      /* channel has been started */
+	unsigned char	       stopped;	      /* channel stopped */
+	unsigned char	       sleeping;
+	unsigned char	       xfer_unit;     /* size of an transfer */
+	unsigned char	       irq_claimed;
+
+	/* channel's hardware position and configuration */
+	unsigned long	       regs;	      /* channels registers */
+	unsigned int	       irq;	      /* channel irq */
+	unsigned long	       addr_reg;      /* data address register for buffs */
+	unsigned long	       dcon;	      /* default value of DCON */
+
+	/* driver handlers for channel */
+	s3c2410_dma_cbfn_t     callback_fn;   /* callback function for buf-done */
+	s3c2410_dma_enfn_t     enable_fn;     /* channel enable function */
+	s3c2410_dma_pausefn_t  pause_fn;      /* channel pause function */
+
+	/* buffer list and information */
+	s3c2410_dma_buf_t      *curr;	      /* current dma buffer */
+	s3c2410_dma_buf_t      *next;	      /* next buffer to load */
+	s3c2410_dma_buf_t      *end;	      /* end of queue */
+
+	int		       queue_count;   /* number of items in queue */
+	int		       loaded_count;  /* number of loaded buffers */
+};
+
+/* note, we don't really use dma_deivce_t at the moment */
+typedef unsigned long dma_device_t;
+
+typedef enum s3c2410_dmasrc_e s3c2410_dmasrc_t;
+
+/* these two defines control the source for the dma channel,
+ * wether it is from memory or an device
+*/
+
+enum s3c2410_dmasrc_e {
+  S3C2410_DMASRC_HW,	  /* source is memory */
+  S3C2410_DMASRC_MEM	  /* source is hardware */
+};
+
+/* dma control routines */
+
+extern int s3c2410_request_dma(dmach_t channel, const char *devid, void *dev);
+extern int s3c2410_free_dma(dmach_t channel);
+extern int s3c2410_dma_flush_all(dmach_t channel);
+
+extern int s3c2410_dma_stop(dmach_t channel);
+extern int s3c2410_dma_resume(dmach_t channel);
+
+extern int s3c2410_dma_queue(dmach_t channel, void *id,
+			     dma_addr_t data, int size);
+
+#define s3c2410_dma_queue_buffer s3c2410_dma_queue
+
+/* channel configuration */
+
+extern int s3c2410_dma_config(dmach_t channel, int xferunit, int dcon);
+
+extern int s3c2410_dma_devconfig(int channel, s3c2410_dmasrc_t source,
+				 int hwcfg, unsigned long devaddr);
+
+extern int s3c2410_dma_set_enablefn(dmach_t, s3c2410_dma_enfn_t rtn);
+extern int s3c2410_dma_set_pausefn(dmach_t, s3c2410_dma_pausefn_t rtn);
+extern int s3c2410_dma_set_callbackfn(dmach_t, s3c2410_dma_cbfn_t rtn);
+
+#define s3c2410_dma_set_callback s3c2410_dma_set_callbackfn
+
+#define S3C2410_DMA_DISRC	(0x00)
+#define S3C2410_DMA_DISRCC	(0x04)
+#define S3C2410_DMA_DIDST	(0x08)
+#define S3C2410_DMA_DIDSTC	(0x0C)
+#define S3C2410_DMA_DCON	(0x10)
+#define S3C2410_DMA_DSTAT	(0x14)
+#define S3C2410_DMA_DCSRC	(0x18)
+#define S3C2410_DMA_DCDST	(0x1C)
+#define S3C2410_DMA_DMASKTRIG	(0x20)
+
+#define S3C2410_DMASKTRIG_STOP	 (1<<2)
+#define S3C2410_DMASKTRIG_ON	 (1<<1)
+#define S3C2410_DMASKTRIG_SWTRIG (1<<0)
+
+#define S3C2410_DCOM_DEMAND	(0<<31)
+#define S3C2410_DCON_HANDSHAKE  (1<<31)
+#define S3C2410_DCON_SYNC_PCLK  (0<<30)
+#define S3C2410_DCON_SYNC_HCLK  (1<<30)
+
+#define S3C2410_DCON_INTREQ	(1<<29)
+
+#define S3C2410_DCON_SRCSHIFT	(24)
+
+#define S3C2410_DCON_BYTE	(0<<20)
+#define S3C2410_DCON_HALFWORD	(1<<20)
+#define S3C2410_DCON_WORD	(2<<20)
+
+#define S3C2410_DCON_AUTORELOAD (0<<22)
+#define S3C2410_DCON_HWTRIG	(1<<23)
+
+#endif /* __ASM_ARCH_DMA_H */
--- diff/include/asm-arm/arch-s3c2410/hardware.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/hardware.h	2004-04-21 10:45:35.826257080 +0100
@@ -0,0 +1,43 @@
+/* linux/include/asm-arm/arch-s3c2410/hardware.h
+ *
+ * (c) 2003 Simtec Electronics
+ *  Ben Dooks <ben@simtec.co.uk>
+ *
+ * S3C2410 - hardware
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Changelog:
+ *  21-May-2003 BJD  Created file
+ *  06-Jun-2003 BJD  Added CPU frequency settings
+ *  03-Sep-2003 BJD  Linux v2.6 support
+ *  12-Mar-2004 BJD  Fixed include protection, fixed type of clock vars
+*/
+
+#ifndef __ASM_ARCH_HARDWARE_H
+#define __ASM_ARCH_HARDWARE_H
+
+#ifndef __ASSEMBLY__
+
+/* processor clock settings, in Hz */
+extern unsigned long s3c2410_pclk;
+extern unsigned long s3c2410_hclk;
+extern unsigned long s3c2410_fclk;
+
+#endif /* __ASSEMBLY__ */
+
+#include <asm/sizes.h>
+#include <asm/arch/map.h>
+
+/* machine specific includes, such as the BAST */
+
+#if defined(CONFIG_ARCH_BAST)
+#include <asm/arch/bast-cpld.h>
+#endif
+
+/* currently here until moved into config (todo) */
+#define CONFIG_NO_MULTIWORD_IO
+
+#endif /* __ASM_ARCH_HARDWARE_H */
--- diff/include/asm-arm/arch-s3c2410/ide.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/ide.h	2004-04-21 10:45:35.826257080 +0100
@@ -0,0 +1,49 @@
+/* linux/include/asm-arm/arch-s3c2410/ide.h
+ *
+ *  Copyright (C) 1997 Russell King
+ *  Copyright (C) 2003 Simtec Electronics
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Modifications:
+ *   29-07-1998	RMK	Major re-work of IDE architecture specific code
+ *   16-05-2003 BJD	Changed to work with BAST IDE ports
+ *   04-09-2003 BJD	Modifications for V2.6
+ */
+
+#ifndef __ASM_ARCH_IDE_H
+#define __ASM_ARCH_IDE_H
+
+#include <asm/irq.h>
+
+/*
+ * Set up a hw structure for a specified data port, control port and IRQ.
+ * This should follow whatever the default interface uses.
+ */
+
+static inline void ide_init_hwif_ports(hw_regs_t *hw, unsigned long data_port,
+				       unsigned long ctrl_port, int *irq)
+{
+	unsigned long reg = data_port;
+	int i;
+
+	memset(hw, 0, sizeof(*hw));
+
+	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
+		hw->io_ports[i] = reg;
+		reg += 1;
+	}
+	hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
+	if (irq)
+		*irq = 0;
+}
+
+/* we initialise our ide devices from the main ide core, due to problems
+ * with doing it in this function
+*/
+
+#define ide_init_default_hwifs() do { } while(0)
+
+#endif /* __ASM_ARCH_IDE_H */
--- diff/include/asm-arm/arch-s3c2410/io.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/io.h	2004-04-21 10:45:35.826257080 +0100
@@ -0,0 +1,198 @@
+/*
+ * linux/include/asm-arm/arch-s3c2410/io.h
+ *  from linux/include/asm-arm/arch-rpc/io.h
+ *
+ * Copyright (C) 1997 Russell King
+ *	     (C) 2003 Simtec Electronics
+ *
+ * Modifications:
+ *  06-Dec-1997	RMK	Created.
+ *  02-Sep-2003 BJD	Modified for S3C2410
+ *
+ */
+
+#ifndef __ASM_ARM_ARCH_IO_H
+#define __ASM_ARM_ARCH_IO_H
+
+#define IO_SPACE_LIMIT 0xffffffff
+
+/*
+ * We use two different types of addressing - PC style addresses, and ARM
+ * addresses.  PC style accesses the PC hardware with the normal PC IO
+ * addresses, eg 0x3f8 for serial#1.  ARM addresses are above A28
+ * and are translated to the start of IO.  Note that all addresses are
+ * not shifted left!
+ */
+
+#define __PORT_PCIO(x)	((x) < (1<<28))
+
+#define PCIO_BASE	 (S3C2410_VA_ISA_WORD)
+#define PCIO_BASE_b	 (S3C2410_VA_ISA_BYTE)
+#define PCIO_BASE_w	 (S3C2410_VA_ISA_WORD)
+#define PCIO_BASE_l	 (S3C2410_VA_ISA_WORD)
+/*
+ * Dynamic IO functions - let the compiler
+ * optimize the expressions
+ */
+
+#define DECLARE_DYN_OUT(sz,fnsuffix,instr) \
+static inline void __out##fnsuffix (unsigned int val, unsigned int port) \
+{ \
+	unsigned long temp;				      \
+	__asm__ __volatile__(				      \
+	"cmp	%2, #(1<<28)\n\t"			      \
+	"mov	%0, %2\n\t"				      \
+	"addcc	%0, %0, %3\n\t"				      \
+	"str" instr " %1, [%0, #0 ]	@ out" #fnsuffix      \
+	: "=&r" (temp)					      \
+	: "r" (val), "r" (port), "Ir" (PCIO_BASE_##fnsuffix)  \
+	: "cc");					      \
+}
+
+
+#define DECLARE_DYN_IN(sz,fnsuffix,instr)				\
+static inline unsigned sz __in##fnsuffix (unsigned int port)		\
+{									\
+	unsigned long temp, value;					\
+	__asm__ __volatile__(						\
+	"cmp	%2, #(1<<28)\n\t"					\
+	"mov	%0, %2\n\t"						\
+	"addcc	%0, %0, %3\n\t"						\
+	"ldr" instr "	%1, [%0, #0 ]	@ in" #fnsuffix		\
+	: "=&r" (temp), "=r" (value)					\
+	: "r" (port), "Ir" (PCIO_BASE_##fnsuffix)	\
+	: "cc");							\
+	return (unsigned sz)value;					\
+}
+
+static inline unsigned int __ioaddr (unsigned int port)
+{
+	if (__PORT_PCIO(port))
+		return (unsigned int)(PCIO_BASE + (port));
+	else
+		return (unsigned int)(0 + (port));
+}
+
+#define DECLARE_IO(sz,fnsuffix,instr)	\
+	DECLARE_DYN_IN(sz,fnsuffix,instr) \
+	DECLARE_DYN_OUT(sz,fnsuffix,instr)
+
+DECLARE_IO(char,b,"b")
+DECLARE_IO(short,w,"h")
+DECLARE_IO(int,l,"")
+
+#undef DECLARE_IO
+#undef DECLARE_DYN_IN
+
+/*
+ * Constant address IO functions
+ *
+ * These have to be macros for the 'J' constraint to work -
+ * +/-4096 immediate operand.
+ */
+#define __outbc(value,port)						\
+({									\
+	if (__PORT_PCIO((port)))					\
+		__asm__ __volatile__(					\
+		"strb	%0, [%1, %2]	@ outbc"			\
+		: : "r" (value), "r" (PCIO_BASE), "Jr" ((port)));	\
+	else								\
+		__asm__ __volatile__(					\
+		"strb	%0, [%1, #0]	@ outbc"			\
+		: : "r" (value), "r" ((port)));		\
+})
+
+#define __inbc(port)							\
+({									\
+	unsigned char result;						\
+	if (__PORT_PCIO((port)))					\
+		__asm__ __volatile__(					\
+		"ldrb	%0, [%1, %2]	@ inbc"				\
+		: "=r" (result) : "r" (PCIO_BASE), "Jr" ((port)));	\
+	else								\
+		__asm__ __volatile__(					\
+		"ldrb	%0, [%1, #0]	@ inbc"				\
+		: "=r" (result) : "r" ((port)));	\
+	result;								\
+})
+
+#define __outwc(value,port)						\
+({									\
+	unsigned long v = value;					\
+	if (__PORT_PCIO((port)))					\
+		__asm__ __volatile__(					\
+		"strh	%0, [%1, %2]	@ outwc"			\
+		: : "r" (v), "r" (PCIO_BASE), "Jr" ((port)));	\
+	else								\
+		__asm__ __volatile__(					\
+		"strh	%0, [%1, #0]	@ outwc"			\
+		: : "r" (v), "r" ((port)));	\
+})
+
+#define __inwc(port)							\
+({									\
+	unsigned short result;						\
+	if (__PORT_PCIO((port)))					\
+		__asm__ __volatile__(					\
+		"ldrh	%0, [%1, %2]	@ inwc"				\
+		: "=r" (result) : "r" (PCIO_BASE), "Jr" ((port)));	\
+	else								\
+		__asm__ __volatile__(					\
+		"ldrh	%0, [%1, #0]	@ inwc"				\
+		: "=r" (result) : "r" ((port)));		\
+	result;						\
+})
+
+#define __outlc(value,port)						\
+({									\
+	unsigned long v = value;					\
+	if (__PORT_PCIO((port)))					\
+		__asm__ __volatile__(					\
+		"str	%0, [%1, %2]	@ outlc"			\
+		: : "r" (v), "r" (PCIO_BASE), "Jr" ((port)));	\
+	else								\
+		__asm__ __volatile__(					\
+		"str	%0, [%1, #0]	@ outlc"			\
+		: : "r" (v), "r" ((port)));		\
+})
+
+#define __inlc(port)							\
+({									\
+	unsigned long result;						\
+	if (__PORT_PCIO((port)))					\
+		__asm__ __volatile__(					\
+		"ldr	%0, [%1, %2]	@ inlc"				\
+		: "=r" (result) : "r" (PCIO_BASE), "Jr" ((port)));	\
+	else								\
+		__asm__ __volatile__(					\
+		"ldr	%0, [%1, #0]	@ inlc"				\
+		: "=r" (result) : "r" ((port)));		\
+	result;								\
+})
+
+#define __ioaddrc(port)	(__PORT_PCIO((port)) ? PCIO_BASE + ((port)) : ((port)))
+
+#define inb(p)		(__builtin_constant_p((p)) ? __inbc(p)	   : __inb(p))
+#define inw(p)		(__builtin_constant_p((p)) ? __inwc(p)	   : __inw(p))
+#define inl(p)		(__builtin_constant_p((p)) ? __inlc(p)	   : __inl(p))
+#define outb(v,p)	(__builtin_constant_p((p)) ? __outbc(v,p) : __outb(v,p))
+#define outw(v,p)	(__builtin_constant_p((p)) ? __outwc(v,p) : __outw(v,p))
+#define outl(v,p)	(__builtin_constant_p((p)) ? __outlc(v,p) : __outl(v,p))
+#define __ioaddr(p)	(__builtin_constant_p((p)) ? __ioaddr(p)  : __ioaddrc(p))
+/* the following macro is deprecated */
+#define ioaddr(port)			__ioaddr((port))
+
+#define insb(p,d,l)	__raw_readsb(__ioaddr(p),d,l)
+#define insw(p,d,l)	__raw_readsw(__ioaddr(p),d,l)
+#define insl(p,d,l)	__raw_readsl(__ioaddr(p),d,l)
+
+#define outsb(p,d,l)	__raw_writesb(__ioaddr(p),d,l)
+#define outsw(p,d,l)	__raw_writesw(__ioaddr(p),d,l)
+#define outsl(p,d,l)	__raw_writesl(__ioaddr(p),d,l)
+
+/*
+ * 1:1 mapping for ioremapped regions.
+ */
+#define __mem_pci(x)	(x)
+
+#endif
--- diff/include/asm-arm/arch-s3c2410/irqs.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/irqs.h	2004-04-21 10:45:35.827256928 +0100
@@ -0,0 +1,115 @@
+/* linux/include/asm-arm/arch-s3c2410/irqs.h
+ *
+ * Copyright (c) 2003 Simtec Electronics
+ *   Ben Dooks <ben@simtec.co.uk>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Changelog:
+ *  12-May-2003 BJD  Created file
+ *  08-Jan-2003 BJD  Linux 2.6.0 version, moved BAST bits out
+ *  12-Mar-2004 BJD  Fixed bug in header protection
+ */
+
+
+#ifndef __ASM_ARCH_IRQS_H
+#define __ASM_ARCH_IRQS_H __FILE__
+
+
+/* we keep the first set of CPU IRQs out of the range of
+ * the ISA space, so that the PC104 has them to itself
+ * and we don't end up having to do horrible things to the
+ * standard ISA drivers....
+ */
+
+#define S3C2410_CPUIRQ_OFFSET	 (16)
+
+#define S3C2410_IRQ(x) ((x) + S3C2410_CPUIRQ_OFFSET)
+
+/* main cpu interrupts */
+#define IRQ_EINT0      S3C2410_IRQ(0)	    /* 16 */
+#define IRQ_EINT1      S3C2410_IRQ(1)
+#define IRQ_EINT2      S3C2410_IRQ(2)
+#define IRQ_EINT3      S3C2410_IRQ(3)
+#define IRQ_EINT4t7    S3C2410_IRQ(4)	    /* 20 */
+#define IRQ_EINT8t23   S3C2410_IRQ(5)
+#define IRQ_RESERVED6  S3C2410_IRQ(6)
+#define IRQ_BATT_FLT   S3C2410_IRQ(7)
+#define IRQ_TICK       S3C2410_IRQ(8)	    /* 24 */
+#define IRQ_WDT	       S3C2410_IRQ(9)
+#define IRQ_TIMER0     S3C2410_IRQ(10)
+#define IRQ_TIMER1     S3C2410_IRQ(11)
+#define IRQ_TIMER2     S3C2410_IRQ(12)
+#define IRQ_TIMER3     S3C2410_IRQ(13)
+#define IRQ_TIMER4     S3C2410_IRQ(14)
+#define IRQ_UART2      S3C2410_IRQ(15)
+#define IRQ_LCD	       S3C2410_IRQ(16)	    /* 32 */
+#define IRQ_DMA0       S3C2410_IRQ(17)
+#define IRQ_DMA1       S3C2410_IRQ(18)
+#define IRQ_DMA2       S3C2410_IRQ(19)
+#define IRQ_DMA3       S3C2410_IRQ(20)
+#define IRQ_SDI	       S3C2410_IRQ(21)
+#define IRQ_SPI0       S3C2410_IRQ(22)
+#define IRQ_UART1      S3C2410_IRQ(23)
+#define IRQ_RESERVED24 S3C2410_IRQ(24)	    /* 40 */
+#define IRQ_USBD       S3C2410_IRQ(25)
+#define IRQ_USBH       S3C2410_IRQ(26)
+#define IRQ_IIC	       S3C2410_IRQ(27)
+#define IRQ_UART0      S3C2410_IRQ(28)	    /* 44 */
+#define IRQ_SPI1       S3C2410_IRQ(29)
+#define IRQ_RTC	       S3C2410_IRQ(30)
+#define IRQ_ADCPARENT  S3C2410_IRQ(31)
+
+/* interrupts generated from the external interrupts sources */
+#define IRQ_EINT4      S3C2410_IRQ(32)	   /* 48 */
+#define IRQ_EINT5      S3C2410_IRQ(33)
+#define IRQ_EINT6      S3C2410_IRQ(34)
+#define IRQ_EINT7      S3C2410_IRQ(35)
+#define IRQ_EINT8      S3C2410_IRQ(36)
+#define IRQ_EINT9      S3C2410_IRQ(37)
+#define IRQ_EINT10     S3C2410_IRQ(38)
+#define IRQ_EINT11     S3C2410_IRQ(39)
+#define IRQ_EINT12     S3C2410_IRQ(40)
+#define IRQ_EINT13     S3C2410_IRQ(41)
+#define IRQ_EINT14     S3C2410_IRQ(42)
+#define IRQ_EINT15     S3C2410_IRQ(43)
+#define IRQ_EINT16     S3C2410_IRQ(44)
+#define IRQ_EINT17     S3C2410_IRQ(45)
+#define IRQ_EINT18     S3C2410_IRQ(46)
+#define IRQ_EINT19     S3C2410_IRQ(47)
+#define IRQ_EINT20     S3C2410_IRQ(48)	   /* 64 */
+#define IRQ_EINT21     S3C2410_IRQ(49)
+#define IRQ_EINT22     S3C2410_IRQ(50)
+#define IRQ_EINT23     S3C2410_IRQ(51)
+
+
+#define IRQ_EINT(x)    S3C2410_IRQ((x >= 4) ? (IRQ_EINT4 + (x) - 4) : (S3C2410_IRQ(0) + (x)))
+
+#define IRQ_LCD_FIFO   S3C2410_IRQ(52)
+#define IRQ_LCD_FRAME  S3C2410_IRQ(53)
+
+/* IRQs for the interal UARTs, and ADC
+ * these need to be ordered in number of appearance in the
+ * SUBSRC mask register
+*/
+#define IRQ_S3CUART_RX0  S3C2410_IRQ(54)   /* 70 */
+#define IRQ_S3CUART_TX0  S3C2410_IRQ(55)   /* 71 */
+#define IRQ_S3CUART_ERR0 S3C2410_IRQ(56)
+
+#define IRQ_S3CUART_RX1  S3C2410_IRQ(57)
+#define IRQ_S3CUART_TX1  S3C2410_IRQ(58)
+#define IRQ_S3CUART_ERR1 S3C2410_IRQ(59)
+
+#define IRQ_S3CUART_RX2  S3C2410_IRQ(60)
+#define IRQ_S3CUART_TX2  S3C2410_IRQ(61)
+#define IRQ_S3CUART_ERR2 S3C2410_IRQ(62)
+
+#define IRQ_TC		 S3C2410_IRQ(63)
+#define IRQ_ADC		 S3C2410_IRQ(64)
+
+#define NR_IRQS (IRQ_ADC+1)
+
+
+#endif /* __ASM_ARCH_IRQ_H */
--- diff/include/asm-arm/arch-s3c2410/map.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/map.h	2004-04-21 10:45:35.827256928 +0100
@@ -0,0 +1,148 @@
+/* linux/include/asm-arm/arch-s3c2410/map.h
+ *
+ * (c) 2003 Simtec Electronics
+ *  Ben Dooks <ben@simtec.co.uk>
+ *
+ * S3C2410 - Memory map definitions
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Changelog:
+ *  12-May-2003 BJD  Created file
+ *  06-Jan-2003 BJD  Linux 2.6.0 version, moved bast specifics out
+*/
+
+#ifndef __ASM_ARCH_MAP_H
+#define __ASM_ARCH_MAP_H
+
+/* we have a bit of a tight squeeze to fit all our registers from
+ * 0xF00000000 upwards, since we use all of the nGCS space in some
+ * capacity, and also need to fit the S3C2410 registers in as well...
+ *
+ * we try to ensure stuff like the IRQ registers are available for
+ * an single MOVS instruction (ie, only 8 bits of set data)
+ *
+ * Note, we are trying to remove some of these from the implementation
+ * as they are only useful to certain drivers...
+ */
+
+#define S3C2410_ADDR(x)	  (0xF0000000 + (x))
+
+/* interrupt controller is the first thing we put in, to make
+ * the assembly code for the irq detection easier
+ */
+#define S3C2410_VA_IRQ	   S3C2410_ADDR(0x00000000)
+#define S3C2410_PA_IRQ	   (0x4A000000)
+#define S3C2410_SZ_IRQ	   SZ_1M
+
+/* memory controller registers */
+#define S3C2410_VA_MEMCTRL S3C2410_ADDR(0x00100000)
+#define S3C2410_PA_MEMCTRL (0x48000000)
+#define S3C2410_SZ_MEMCTRL SZ_1M
+
+/* USB host controller */
+#define S3C2410_VA_USBHOST S3C2410_ADDR(0x00200000)
+#define S3C2410_PA_USBHOST (0x49000000)
+#define S3C2410_SZ_USBHOST SZ_1M
+
+/* DMA controller */
+#define S3C2410_VA_DMA	   S3C2410_ADDR(0x00300000)
+#define S3C2410_PA_DMA	   (0x4B000000)
+#define S3C2410_SZ_DMA	   SZ_1M
+
+/* Clock and Power management */
+#define S3C2410_VA_CLKPWR  S3C2410_ADDR(0x00400000)
+#define S3C2410_PA_CLKPWR  (0x4C000000)
+#define S3C2410_SZ_CLKPWR  SZ_1M
+
+/* LCD controller */
+#define S3C2410_VA_LCD	   S3C2410_ADDR(0x00600000)
+#define S3C2410_PA_LCD	   (0x4D000000)
+#define S3C2410_SZ_LCD	   SZ_1M
+
+/* NAND flash controller */
+#define S3C2410_VA_NAND	   S3C2410_ADDR(0x00700000)
+#define S3C2410_PA_NAND	   (0x4E000000)
+#define S3C2410_SZ_NAND	   SZ_1M
+
+/* UARTs */
+#define S3C2410_VA_UART	   S3C2410_ADDR(0x00800000)
+#define S3C2410_PA_UART	   (0x50000000)
+#define S3C2410_SZ_UART	   SZ_1M
+
+/* Timers */
+#define S3C2410_VA_TIMER   S3C2410_ADDR(0x00900000)
+#define S3C2410_PA_TIMER   (0x51000000)
+#define S3C2410_SZ_TIMER   SZ_1M
+
+/* USB Device port */
+#define S3C2410_VA_USBDEV  S3C2410_ADDR(0x00A00000)
+#define S3C2410_PA_USBDEV  (0x52000000)
+#define S3C2410_SZ_USBDEV  SZ_1M
+
+/* Watchdog */
+#define S3C2410_VA_WATCHDOG S3C2410_ADDR(0x00B00000)
+#define S3C2410_PA_WATCHDOG (0x53000000)
+#define S3C2410_SZ_WATCHDOG SZ_1M
+
+/* IIC hardware controller */
+#define S3C2410_VA_IIC	   S3C2410_ADDR(0x00C00000)
+#define S3C2410_PA_IIC	   (0x54000000)
+#define S3C2410_SZ_IIC	   SZ_1M
+
+#define VA_IIC_BASE	   (S3C2410_VA_IIC)
+
+/* IIS controller */
+#define S3C2410_VA_IIS	   S3C2410_ADDR(0x00D00000)
+#define S3C2410_PA_IIS	   (0x55000000)
+#define S3C2410_SZ_IIS	   SZ_1M
+
+/* GPIO ports */
+#define S3C2410_VA_GPIO	   S3C2410_ADDR(0x00E00000)
+#define S3C2410_PA_GPIO	   (0x56000000)
+#define S3C2410_SZ_GPIO	   SZ_1M
+
+/* RTC */
+#define S3C2410_VA_RTC	   S3C2410_ADDR(0x00F00000)
+#define S3C2410_PA_RTC	   (0x57000000)
+#define S3C2410_SZ_RTC	   SZ_1M
+
+/* ADC */
+#define S3C2410_VA_ADC	   S3C2410_ADDR(0x01000000)
+#define S3C2410_PA_ADC	   (0x58000000)
+#define S3C2410_SZ_ADC	   SZ_1M
+
+/* SPI */
+#define S3C2410_VA_SPI	   S3C2410_ADDR(0x01100000)
+#define S3C2410_PA_SPI	   (0x59000000)
+#define S3C2410_SZ_SPI	   SZ_1M
+
+/* SDI */
+#define S3C2410_VA_SDI	   S3C2410_ADDR(0x01200000)
+#define S3C2410_PA_SDI	   (0x5A000000)
+#define S3C2410_SZ_SDI	   SZ_1M
+
+/* ISA style IO, for each machine to sort out mappings for, if it
+ * implements it. We reserve two 16M regions for ISA.
+ */
+
+#define S3C2410_VA_ISA_WORD  S3C2410_ADDR(0x02000000)
+#define S3C2410_VA_ISA_BYTE  S3C2410_ADDR(0x03000000)
+
+/* physical addresses of all the chip-select areas */
+
+#define S3C2410_CS0 (0x00000000)
+#define S3C2410_CS1 (0x08000000)
+#define S3C2410_CS2 (0x10000000)
+#define S3C2410_CS3 (0x18000000)
+#define S3C2410_CS4 (0x20000000)
+#define S3C2410_CS5 (0x28000000)
+#define S3C2410_CS6 (0x30000000)
+#define S3C2410_CS7 (0x38000000)
+
+#define S3C2410_SDRAM_PA    (S3C2410_CS6)
+
+
+#endif /* __ASM_ARCH_MAP_H */
--- diff/include/asm-arm/arch-s3c2410/memory.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/memory.h	2004-04-21 10:45:35.827256928 +0100
@@ -0,0 +1,61 @@
+/*
+ *  linux/include/asm-arm/arch-s3c2410/memory.h
+ *
+ *  from linux/include/asm-arm/arch-rpc/memory.h
+ *
+ *  Copyright (C) 1996,1997,1998 Russell King.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Changelog:
+ *   20-Oct-1996 RMK	Created
+ *   31-Dec-1997 RMK	Fixed definitions to reduce warnings
+ *   11-Jan-1998 RMK	Uninlined to reduce hits on cache
+ *   08-Feb-1998 RMK	Added __virt_to_bus and __bus_to_virt
+ *   21-Mar-1999 RMK	Renamed to memory.h
+ *		 RMK	Added TASK_SIZE and PAGE_OFFSET
+ *   05-Apr-2004 BJD    Copied and altered for arch-s3c2410
+*/
+
+#ifndef __ASM_ARCH_MEMORY_H
+#define __ASM_ARCH_MEMORY_H
+
+/*
+ * Task size: 3GB
+ */
+#define TASK_SIZE	(0xbf000000UL)
+#define TASK_SIZE_26	(0x04000000UL)
+
+/*
+ * This decides where the kernel will search for a free chunk of vm
+ * space during mmap's.
+ */
+#define TASK_UNMAPPED_BASE (0x40000000)
+
+/*
+ * Page offset: 3GB
+ *
+ * DRAM starts at 0x30000000
+*/
+
+#define PAGE_OFFSET	(0xc0000000UL)
+#define PHYS_OFFSET	(0x30000000UL)
+
+#define __virt_to_phys__is_a_macro
+#define __virt_to_phys(vpage) ((vpage) - PAGE_OFFSET + PHYS_OFFSET)
+#define __phys_to_virt__is_a_macro
+#define __phys_to_virt(ppage) ((ppage) + PAGE_OFFSET - PHYS_OFFSET)
+
+/*
+ * These are exactly the same on the S3C2410 as the
+ * physical memory view.
+*/
+
+#define __virt_to_bus__is_a_macro
+#define __virt_to_bus(x) __virt_to_phys(x)
+#define __bus_to_virt__is_a_macro
+#define __bus_to_virt(x) __phys_to_virt(x)
+
+#endif
--- diff/include/asm-arm/arch-s3c2410/param.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/param.h	2004-04-21 10:45:35.828256776 +0100
@@ -0,0 +1,27 @@
+/* linux/include/asm-arm/arch-s3c2410/param.h
+ *
+ * (c) 2003 Simtec Electronics
+ *  Ben Dooks <ben@simtec.co.uk>
+ *
+ * S3C2410 - Machine parameters
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Changelog:
+ *  02-Sep-2003 BJD  Created file
+ *  12-Mar-2004 BJD  Added include protection
+*/
+
+#ifndef __ASM_ARCH_PARAM_H
+#define __ASM_ARCH_PARAM_H
+
+/* we cannot get our timer down to 100Hz with the setup as is, but we can
+ * manage 200 clock ticks per second... if this is a problem, we can always
+ * add a software pre-scaler to the evil timer systems.
+*/
+
+#define __KERNEL_HZ   200
+
+#endif /* __ASM_ARCH_PARAM_H */
--- diff/include/asm-arm/arch-s3c2410/regs-clock.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/regs-clock.h	2004-04-21 10:45:35.828256776 +0100
@@ -0,0 +1,72 @@
+/* linux/include/asm/arch-s3c2410/regs-clock.h
+ *
+ * Copyright (c) 2003 Simtec Electronics <linux@simtec.co.uk>
+ *		      http://www.simtec.co.uk/products/SWLINUX/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * S3C2410 clock register definitions
+ *
+ *  Changelog:
+ *    19-06-2003     BJD     Created file
+ *    12-03-2004     BJD     Updated include protection
+ */
+
+
+
+#ifndef __ASM_ARM_REGS_CLOCK
+#define __ASM_ARM_REGS_CLOCK "$Id: clock.h,v 1.4 2003/04/30 14:50:51 ben Exp $"
+
+#define S3C2410_CLKREG(x) ((x) + S3C2410_VA_CLKPWR)
+
+#define S3C2410_PLLVAL(_m,_p,_s) ((_m) << 12 | ((_p) << 4) | ((_s)))
+
+#define S3C2410_LOCKTIME    S3C2410_CLKREG(0x00)
+#define S3C2410_MPLLCON	    S3C2410_CLKREG(0x04)
+#define S3C2410_UPLLCON	    S3C2410_CLKREG(0x08)
+#define S3C2410_CLKCON	    S3C2410_CLKREG(0x0C)
+#define S3C2410_CLKSLOW	    S3C2410_CLKREG(0x10)
+#define S3C2410_CLKDIVN	    S3C2410_CLKREG(0x14)
+
+#define S3C2410_PLLCON_MDIVSHIFT     12
+#define S3C2410_PLLCON_PDIVSHIFT     4
+#define S3C2410_PLLCON_SDIVSHIFT     0
+#define S3C2410_PLLCON_MDIVMASK	     ((1<<(1+(19-12)))-1)
+#define S3C2410_PLLCON_PDIVMASK	     ((1<<5)-1)
+#define S3C2410_PLLCON_SDIVMASK	     3
+
+/* DCLKCON register addresses in gpio.h */
+
+#define S3C2410_DCLKCON_DCLK0EN	     (1<<0)
+#define S3C2410_DCLKCON_DCLK0_PCLK   (0<<1)
+#define S3C2410_DCLKCON_DCLK0_UCLK   (1<<1)
+#define S3C2410_DCLKCON_DCLK0_DIV(x) (((x) - 1 )<<4)
+#define S3C2410_DCLKCON_DCLK0_CMP(x) (((x) - 1 )<<8)
+
+#define S3C2410_DCLKCON_DCLK1EN	     (1<<16)
+#define S3C2410_DCLKCON_DCLK1_PCLK   (0<<17)
+#define S3C2410_DCLKCON_DCLK1_UCLK   (1<<17)
+#define S3C2410_DCLKCON_DCLK1_DIV(x) (((x) - 1) <<20)
+
+#define S3C2410_CLKDIVN_PDIVN	     (1<<0)
+#define S3C2410_CLKDIVN_HDIVN	     (1<<1)
+
+static inline unsigned int
+s3c2410_get_pll(int pllval, int baseclk)
+{
+  int mdiv, pdiv, sdiv;
+
+  mdiv = pllval >> S3C2410_PLLCON_MDIVSHIFT;
+  pdiv = pllval >> S3C2410_PLLCON_PDIVSHIFT;
+  sdiv = pllval >> S3C2410_PLLCON_SDIVSHIFT;
+
+  mdiv &= S3C2410_PLLCON_MDIVMASK;
+  pdiv &= S3C2410_PLLCON_PDIVMASK;
+  sdiv &= S3C2410_PLLCON_SDIVMASK;
+
+  return (baseclk * (mdiv + 8)) / ((pdiv + 2) << sdiv);
+}
+
+#endif /* __ASM_ARM_REGS_CLOCK */
--- diff/include/asm-arm/arch-s3c2410/regs-gpio.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/regs-gpio.h	2004-04-21 10:45:35.829256624 +0100
@@ -0,0 +1,604 @@
+/* linux/include/asm/hardware/s3c2410/
+ *
+ * Copyright (c) 2003 Simtec Electronics <linux@simtec.co.uk>
+ *		      http://www.simtec.co.uk/products/SWLINUX/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * S3C2410 GPIO register definitions
+ *
+ *  Changelog:
+ *    19-06-2003     BJD     Created file
+ *    23-06-2003     BJD     Updated GSTATUS registers
+ *    12-03-2004     BJD     Updated include protection
+ */
+
+
+#ifndef __ASM_ARCH_REGS_GPIO_H
+#define __ASM_ARCH_REGS_GPIO_H "$Id: gpio.h,v 1.5 2003/05/19 12:51:08 ben Exp $"
+
+/* configure GPIO ports A..G */
+
+#define S3C2410_GPIOREG(x) ((x) + S3C2410_VA_GPIO)
+
+/* port A - 22bits, zero in bit X makes pin X output
+ * 1 makes port special function, this is default
+*/
+#define S3C2410_GPACON	   S3C2410_GPIOREG(0x00)
+#define S3C2410_GPADAT	   S3C2410_GPIOREG(0x04)
+
+/* 0x08 and 0x0c are reserved */
+
+/* GPB is 10 IO pins, each configured by 2 bits each in GPBCON.
+ *   00 = input, 01 = output, 10=special function, 11=reserved
+ * bit 0,1 = pin 0, 2,3= pin 1...
+ *
+ * CPBUP = pull up resistor control, 1=disabled, 0=enabled
+*/
+
+#define S3C2410_GPBCON	   S3C2410_GPIOREG(0x10)
+#define S3C2410_GPBDAT	   S3C2410_GPIOREG(0x14)
+#define S3C2410_GPBUP	   S3C2410_GPIOREG(0x18)
+
+/* no i/o pin in port b can have value 3! */
+
+#define S3C2410_GPB0_INP     (0x00 << 0)
+#define S3C2410_GPB0_OUTP    (0x01 << 0)
+#define S3C2410_GPB0_TOUT0   (0x02 << 0)
+
+#define S3C2410_GPB1_INP     (0x00 << 2)
+#define S3C2410_GPB1_OUTP    (0x01 << 2)
+#define S3C2410_GPB1_TOUT1   (0x02 << 2)
+
+#define S3C2410_GPB2_INP     (0x00 << 4)
+#define S3C2410_GPB2_OUTP    (0x01 << 4)
+#define S3C2410_GPB2_TOUT2   (0x02 << 4)
+
+#define S3C2410_GPB3_INP     (0x00 << 6)
+#define S3C2410_GPB3_OUTP    (0x01 << 6)
+#define S3C2410_GPB3_TOUT3   (0x02 << 6)
+
+#define S3C2410_GPB4_INP     (0x00 << 8)
+#define S3C2410_GPB4_OUTP    (0x01 << 8)
+#define S3C2410_GPB4_TCLK0   (0x02 << 8)
+#define S3C2410_GPB4_MASK    (0x03 << 8)
+
+#define S3C2410_GPB5_INP     (0x00 << 10)
+#define S3C2410_GPB5_OUTP    (0x01 << 10)
+#define S3C2410_GPB5_nXBACK  (0x02 << 10)
+
+#define S3C2410_GPB6_INP     (0x00 << 12)
+#define S3C2410_GPB6_OUTP    (0x01 << 12)
+#define S3C2410_GPB6_nXBREQ  (0x02 << 12)
+
+#define S3C2410_GPB7_INP     (0x00 << 14)
+#define S3C2410_GPB7_OUTP    (0x01 << 14)
+#define S3C2410_GPB7_nXDACK1 (0x02 << 14)
+
+#define S3C2410_GPB8_INP     (0x00 << 16)
+#define S3C2410_GPB8_OUTP    (0x01 << 16)
+#define S3C2410_GPB8_nXDREQ1 (0x02 << 16)
+
+#define S3C2410_GPB9_INP     (0x00 << 18)
+#define S3C2410_GPB9_OUTP    (0x01 << 18)
+#define S3C2410_GPB9_nXDACK0 (0x02 << 18)
+
+#define S3C2410_GPB10_INP     (0x00 << 18)
+#define S3C2410_GPB10_OUTP    (0x01 << 18)
+#define S3C2410_GPB10_nXDRE0 (0x02 << 18)
+
+/* Port C consits of 16 GPIO/Special function
+ *
+ * almost identical setup to port b, but the special functions are mostly
+ * to do with the video system's sync/etc.
+*/
+
+#define S3C2410_GPCCON	   S3C2410_GPIOREG(0x20)
+#define S3C2410_GPCDAT	   S3C2410_GPIOREG(0x24)
+#define S3C2410_GPCUP	   S3C2410_GPIOREG(0x28)
+
+#define S3C2410_GPC0_INP	(0x00 << 0)
+#define S3C2410_GPC0_OUTP	(0x01 << 0)
+#define S3C2410_GPC0_LEND	(0x02 << 0)
+
+#define S3C2410_GPC1_INP	(0x00 << 2)
+#define S3C2410_GPC1_OUTP	(0x01 << 2)
+#define S3C2410_GPC1_VCLK	(0x02 << 2)
+
+#define S3C2410_GPC2_INP	(0x00 << 4)
+#define S3C2410_GPC2_OUTP	(0x01 << 4)
+#define S3C2410_GPC2_VLINE	(0x02 << 4)
+
+#define S3C2410_GPC3_INP	(0x00 << 6)
+#define S3C2410_GPC3_OUTP	(0x01 << 6)
+#define S3C2410_GPC3_VFRAME	(0x02 << 6)
+
+#define S3C2410_GPC4_INP	(0x00 << 8)
+#define S3C2410_GPC4_OUTP	(0x01 << 8)
+#define S3C2410_GPC4_VM		(0x02 << 8)
+
+#define S3C2410_GPC5_INP	(0x00 << 10)
+#define S3C2410_GPC5_OUTP	(0x01 << 10)
+#define S3C2410_GPC5_LCDVF0	(0x02 << 10)
+
+#define S3C2410_GPC6_INP	(0x00 << 12)
+#define S3C2410_GPC6_OUTP	(0x01 << 12)
+#define S3C2410_GPC6_LCDVF1	(0x02 << 12)
+
+#define S3C2410_GPC7_INP	(0x00 << 14)
+#define S3C2410_GPC7_OUTP	(0x01 << 14)
+#define S3C2410_GPC7_LCDVF2	(0x02 << 14)
+
+#define S3C2410_GPC8_INP	(0x00 << 16)
+#define S3C2410_GPC8_OUTP	(0x01 << 16)
+#define S3C2410_GPC8_VD0	(0x02 << 16)
+
+#define S3C2410_GPC9_INP	(0x00 << 18)
+#define S3C2410_GPC9_OUTP	(0x01 << 18)
+#define S3C2410_GPC9_VD1	(0x02 << 18)
+
+#define S3C2410_GPC10_INP	(0x00 << 20)
+#define S3C2410_GPC10_OUTP	(0x01 << 20)
+#define S3C2410_GPC10_VD2	(0x02 << 20)
+
+#define S3C2410_GPC11_INP	(0x00 << 22)
+#define S3C2410_GPC11_OUTP	(0x01 << 22)
+#define S3C2410_GPC11_VD3	(0x02 << 22)
+
+#define S3C2410_GPC12_INP	(0x00 << 24)
+#define S3C2410_GPC12_OUTP	(0x01 << 24)
+#define S3C2410_GPC12_VD4	(0x02 << 24)
+
+#define S3C2410_GPC13_INP	(0x00 << 26)
+#define S3C2410_GPC13_OUTP	(0x01 << 26)
+#define S3C2410_GPC13_VD5	(0x02 << 26)
+
+#define S3C2410_GPC14_INP	(0x00 << 28)
+#define S3C2410_GPC14_OUTP	(0x01 << 28)
+#define S3C2410_GPC14_VD6	(0x02 << 28)
+
+#define S3C2410_GPC15_INP	(0x00 << 30)
+#define S3C2410_GPC15_OUTP	(0x01 << 30)
+#define S3C2410_GPC15_VD7	(0x02 << 30)
+
+/* Port D consists of 16 GPIO/Special function
+ *
+ * almost identical setup to port b, but the special functions are mostly
+ * to do with the video system's data.
+*/
+
+#define S3C2410_GPDCON	   S3C2410_GPIOREG(0x30)
+#define S3C2410_GPDDAT	   S3C2410_GPIOREG(0x34)
+#define S3C2410_GPDUP	   S3C2410_GPIOREG(0x38)
+
+#define S3C2410_GPD0_INP	(0x00 << 0)
+#define S3C2410_GPD0_OUTP	(0x01 << 0)
+#define S3C2410_GPD0_VD8	(0x02 << 0)
+
+#define S3C2410_GPD1_INP	(0x00 << 2)
+#define S3C2410_GPD1_OUTP	(0x01 << 2)
+#define S3C2410_GPD1_VD9	(0x02 << 2)
+
+#define S3C2410_GPD2_INP	(0x00 << 4)
+#define S3C2410_GPD2_OUTP	(0x01 << 4)
+#define S3C2410_GPD2_VD10	(0x02 << 4)
+
+#define S3C2410_GPD3_INP	(0x00 << 6)
+#define S3C2410_GPD3_OUTP	(0x01 << 6)
+#define S3C2410_GPD3_VD11	(0x02 << 6)
+
+#define S3C2410_GPD4_INP	(0x00 << 8)
+#define S3C2410_GPD4_OUTP	(0x01 << 8)
+#define S3C2410_GPD4_VD12	(0x02 << 8)
+
+#define S3C2410_GPD5_INP	(0x00 << 10)
+#define S3C2410_GPD5_OUTP	(0x01 << 10)
+#define S3C2410_GPD5_VD13	(0x02 << 10)
+
+#define S3C2410_GPD6_INP	(0x00 << 12)
+#define S3C2410_GPD6_OUTP	(0x01 << 12)
+#define S3C2410_GPD6_VD14	(0x02 << 12)
+
+#define S3C2410_GPD7_INP	(0x00 << 14)
+#define S3C2410_GPD7_OUTP	(0x01 << 14)
+#define S3C2410_GPD7_VD15	(0x02 << 14)
+
+#define S3C2410_GPD8_INP	(0x00 << 16)
+#define S3C2410_GPD8_OUTP	(0x01 << 16)
+#define S3C2410_GPD8_VD16	(0x02 << 16)
+
+#define S3C2410_GPD9_INP	(0x00 << 18)
+#define S3C2410_GPD9_OUTP	(0x01 << 18)
+#define S3C2410_GPD9_VD17	(0x02 << 18)
+
+#define S3C2410_GPD10_INP	(0x00 << 20)
+#define S3C2410_GPD10_OUTP	(0x01 << 20)
+#define S3C2410_GPD10_VD18	(0x02 << 20)
+
+#define S3C2410_GPD11_INP	(0x00 << 22)
+#define S3C2410_GPD11_OUTP	(0x01 << 22)
+#define S3C2410_GPD11_VD19	(0x02 << 22)
+
+#define S3C2410_GPD12_INP	(0x00 << 24)
+#define S3C2410_GPD12_OUTP	(0x01 << 24)
+#define S3C2410_GPD12_VD20	(0x02 << 24)
+
+#define S3C2410_GPD13_INP	(0x00 << 26)
+#define S3C2410_GPD13_OUTP	(0x01 << 26)
+#define S3C2410_GPD13_VD21	(0x02 << 26)
+
+#define S3C2410_GPD14_INP	(0x00 << 28)
+#define S3C2410_GPD14_OUTP	(0x01 << 28)
+#define S3C2410_GPD14_VD22	(0x02 << 28)
+
+#define S3C2410_GPD15_INP	(0x00 << 30)
+#define S3C2410_GPD15_OUTP	(0x01 << 30)
+#define S3C2410_GPD15_VD23	(0x02 << 30)
+
+/* Port E consists of 16 GPIO/Special function
+ *
+ * again, the same as port B, but dealing with I2S, SDI, and
+ * more miscellaneous functions
+*/
+
+#define S3C2410_GPECON	   S3C2410_GPIOREG(0x40)
+#define S3C2410_GPEDAT	   S3C2410_GPIOREG(0x44)
+#define S3C2410_GPEUP	   S3C2410_GPIOREG(0x48)
+
+#define S3C2410_GPE0_INP       (0x00 << 0)
+#define S3C2410_GPE0_OUTP      (0x01 << 0)
+#define S3C2410_GPE0_I2SLRCK   (0x02 << 0)
+#define S3C2410_GPE0_MASK      (0x03 << 0)
+
+#define S3C2410_GPE1_INP       (0x00 << 2)
+#define S3C2410_GPE1_OUTP      (0x01 << 2)
+#define S3C2410_GPE1_I2SSCLK   (0x02 << 2)
+#define S3C2410_GPE1_MASK      (0x03 << 2)
+
+#define S3C2410_GPE2_INP       (0x00 << 4)
+#define S3C2410_GPE2_OUTP      (0x01 << 4)
+#define S3C2410_GPE2_CDCLK     (0x02 << 4)
+
+#define S3C2410_GPE3_INP       (0x00 << 6)
+#define S3C2410_GPE3_OUTP      (0x01 << 6)
+#define S3C2410_GPE3_I2SSDI    (0x02 << 6)
+#define S3C2410_GPE3_MASK      (0x03 << 6)
+
+#define S3C2410_GPE4_INP       (0x00 << 8)
+#define S3C2410_GPE4_OUTP      (0x01 << 8)
+#define S3C2410_GPE4_I2SSDO    (0x02 << 8)
+#define S3C2410_GPE4_MASK      (0x03 << 8)
+
+#define S3C2410_GPE5_INP       (0x00 << 10)
+#define S3C2410_GPE5_OUTP      (0x01 << 10)
+#define S3C2410_GPE5_SDCLK     (0x02 << 10)
+
+#define S3C2410_GPE6_INP       (0x00 << 12)
+#define S3C2410_GPE6_OUTP      (0x01 << 12)
+#define S3C2410_GPE6_SDCLK     (0x02 << 12)
+
+#define S3C2410_GPE7_INP       (0x00 << 14)
+#define S3C2410_GPE7_OUTP      (0x01 << 14)
+#define S3C2410_GPE7_SDCMD     (0x02 << 14)
+
+#define S3C2410_GPE8_INP       (0x00 << 16)
+#define S3C2410_GPE8_OUTP      (0x01 << 16)
+#define S3C2410_GPE8_SDDAT1    (0x02 << 16)
+
+#define S3C2410_GPE9_INP       (0x00 << 18)
+#define S3C2410_GPE9_OUTP      (0x01 << 18)
+#define S3C2410_GPE9_SDDAT2    (0x02 << 18)
+
+#define S3C2410_GPE10_INP      (0x00 << 20)
+#define S3C2410_GPE10_OUTP     (0x01 << 20)
+#define S3C2410_GPE10_SDDAT3   (0x02 << 20)
+
+#define S3C2410_GPE11_INP      (0x00 << 22)
+#define S3C2410_GPE11_OUTP     (0x01 << 22)
+#define S3C2410_GPE11_SPIMISO0 (0x02 << 22)
+
+#define S3C2410_GPE12_INP      (0x00 << 24)
+#define S3C2410_GPE12_OUTP     (0x01 << 24)
+#define S3C2410_GPE12_SPIMOSI0 (0x02 << 24)
+
+#define S3C2410_GPE13_INP      (0x00 << 26)
+#define S3C2410_GPE13_OUTP     (0x01 << 26)
+#define S3C2410_GPE13_SPICLK0  (0x02 << 26)
+
+#define S3C2410_GPE14_INP      (0x00 << 28)
+#define S3C2410_GPE14_OUTP     (0x01 << 28)
+#define S3C2410_GPE14_IICSCL   (0x02 << 28)
+#define S3C2410_GPE14_MASK     (0x03 << 28)
+
+#define S3C2410_GPE15_INP      (0x00 << 30)
+#define S3C2410_GPE15_OUTP     (0x01 << 30)
+#define S3C2410_GPE15_IICSDA   (0x02 << 30)
+#define S3C2410_GPE15_MASK     (0x03 << 30)
+
+#define S3C2410_GPE_PUPDIS(x)  (1<<(x))
+
+/* Port F consists of 8 GPIO/Special function
+ *
+ * GPIO / interrupt inputs
+ *
+ * GPFCON has 2 bits for each of the input pins on port F
+ *   00 = 0 input, 1 output, 2 interrupt (EINT0..7), 3 undefined
+ *
+ * pull up works like all other ports.
+*/
+
+#define S3C2410_GPFCON	   S3C2410_GPIOREG(0x50)
+#define S3C2410_GPFDAT	   S3C2410_GPIOREG(0x54)
+#define S3C2410_GPFUP	   S3C2410_GPIOREG(0x58)
+
+
+#define S3C2410_GPF0_INP    (0x00 << 0)
+#define S3C2410_GPF0_OUTP   (0x01 << 0)
+#define S3C2410_GPF0_EINT0  (0x02 << 0)
+
+#define S3C2410_GPF1_INP    (0x00 << 2)
+#define S3C2410_GPF1_OUTP   (0x01 << 2)
+#define S3C2410_GPF1_EINT1  (0x02 << 2)
+
+#define S3C2410_GPF2_INP    (0x00 << 4)
+#define S3C2410_GPF2_OUTP   (0x01 << 4)
+#define S3C2410_GPF2_EINT2  (0x02 << 4)
+
+#define S3C2410_GPF3_INP    (0x00 << 6)
+#define S3C2410_GPF3_OUTP   (0x01 << 6)
+#define S3C2410_GPF3_EINT3  (0x02 << 6)
+
+#define S3C2410_GPF4_INP    (0x00 << 8)
+#define S3C2410_GPF4_OUTP   (0x01 << 8)
+#define S3C2410_GPF4_EINT4  (0x02 << 8)
+
+#define S3C2410_GPF5_INP    (0x00 << 10)
+#define S3C2410_GPF5_OUTP   (0x01 << 10)
+#define S3C2410_GPF5_EINT5  (0x02 << 10)
+
+#define S3C2410_GPF6_INP    (0x00 << 12)
+#define S3C2410_GPF6_OUTP   (0x01 << 12)
+#define S3C2410_GPF6_EINT6  (0x02 << 12)
+
+#define S3C2410_GPF7_INP    (0x00 << 14)
+#define S3C2410_GPF7_OUTP   (0x01 << 14)
+#define S3C2410_GPF7_EINT7  (0x02 << 14)
+
+/* Port G consists of 8 GPIO/IRQ/Special function
+ *
+ * GPGCON has 2 bits for each of the input pins on port F
+ *   00 = 0 input, 1 output, 2 interrupt (EINT0..7), 3 special func
+ *
+ * pull up works like all other ports.
+*/
+
+#define S3C2410_GPGCON	   S3C2410_GPIOREG(0x60)
+#define S3C2410_GPGDAT	   S3C2410_GPIOREG(0x64)
+#define S3C2410_GPGUP	   S3C2410_GPIOREG(0x68)
+
+#define S3C2410_GPG0_INP      (0x00 << 0)
+#define S3C2410_GPG0_OUTP     (0x01 << 0)
+#define S3C2410_GPG0_EINT8    (0x02 << 0)
+
+#define S3C2410_GPG1_INP      (0x00 << 2)
+#define S3C2410_GPG1_OUTP     (0x01 << 2)
+#define S3C2410_GPG1_EINT9    (0x02 << 2)
+
+#define S3C2410_GPG2_INP      (0x00 << 4)
+#define S3C2410_GPG2_OUTP     (0x01 << 4)
+#define S3C2410_GPG2_EINT10   (0x02 << 4)
+
+#define S3C2410_GPG3_INP      (0x00 << 6)
+#define S3C2410_GPG3_OUTP     (0x01 << 6)
+#define S3C2410_GPG3_EINT11   (0x02 << 6)
+
+#define S3C2410_GPG4_INP      (0x00 << 8)
+#define S3C2410_GPG4_OUTP     (0x01 << 8)
+#define S3C2410_GPG4_EINT12   (0x02 << 8)
+#define S3C2410_GPG4_LCDPWREN (0x03 << 8)
+
+#define S3C2410_GPG5_INP      (0x00 << 10)
+#define S3C2410_GPG5_OUTP     (0x01 << 10)
+#define S3C2410_GPG5_EINT13   (0x02 << 10)
+#define S3C2410_GPG5_SPIMISO1 (0x03 << 10)
+
+#define S3C2410_GPG6_INP      (0x00 << 12)
+#define S3C2410_GPG6_OUTP     (0x01 << 12)
+#define S3C2410_GPG6_EINT14   (0x02 << 12)
+#define S3C2410_GPG6_SPIMOSI1 (0x03 << 12)
+
+#define S3C2410_GPG7_INP      (0x00 << 14)
+#define S3C2410_GPG7_OUTP     (0x01 << 14)
+#define S3C2410_GPG7_EINT15   (0x02 << 14)
+#define S3C2410_GPG7_SPICLK1  (0x03 << 14)
+
+#define S3C2410_GPG8_INP      (0x00 << 16)
+#define S3C2410_GPG8_OUTP     (0x01 << 16)
+#define S3C2410_GPG8_EINT16   (0x02 << 16)
+
+#define S3C2410_GPG9_INP      (0x00 << 18)
+#define S3C2410_GPG9_OUTP     (0x01 << 18)
+#define S3C2410_GPG9_EINT17   (0x02 << 18)
+
+#define S3C2410_GPG10_INP     (0x00 << 20)
+#define S3C2410_GPG10_OUTP    (0x01 << 20)
+#define S3C2410_GPG10_EINT18  (0x02 << 20)
+
+#define S3C2410_GPG11_INP     (0x00 << 22)
+#define S3C2410_GPG11_OUTP    (0x01 << 22)
+#define S3C2410_GPG11_EINT19  (0x02 << 22)
+#define S3C2410_GPG11_TCLK1   (0x03 << 22)
+
+#define S3C2410_GPG12_INP     (0x00 << 24)
+#define S3C2410_GPG12_OUTP    (0x01 << 24)
+#define S3C2410_GPG12_EINT18  (0x02 << 24)
+#define S3C2410_GPG12_XMON    (0x03 << 24)
+
+#define S3C2410_GPG13_INP     (0x00 << 26)
+#define S3C2410_GPG13_OUTP    (0x01 << 26)
+#define S3C2410_GPG13_EINT18  (0x02 << 26)
+#define S3C2410_GPG13_nXPON   (0x03 << 26)
+
+#define S3C2410_GPG14_INP     (0x00 << 28)
+#define S3C2410_GPG14_OUTP    (0x01 << 28)
+#define S3C2410_GPG14_EINT18  (0x02 << 28)
+#define S3C2410_GPG14_YMON    (0x03 << 28)
+
+#define S3C2410_GPG15_INP     (0x00 << 30)
+#define S3C2410_GPG15_OUTP    (0x01 << 30)
+#define S3C2410_GPG15_EINT18  (0x02 << 30)
+#define S3C2410_GPG15_nYPON   (0x03 << 30)
+
+
+#define S3C2410_GPG_PUPDIS(x)  (1<<(x))
+
+/* Port H consists of11 GPIO/serial/Misc pins
+ *
+ * GPGCON has 2 bits for each of the input pins on port F
+ *   00 = 0 input, 1 output, 2 interrupt (EINT0..7), 3 special func
+ *
+ * pull up works like all other ports.
+*/
+
+#define S3C2410_GPHCON	   S3C2410_GPIOREG(0x70)
+#define S3C2410_GPHDAT	   S3C2410_GPIOREG(0x74)
+#define S3C2410_GPHUP	   S3C2410_GPIOREG(0x78)
+
+#define S3C2410_GPH0_INP    (0x00 << 0)
+#define S3C2410_GPH0_OUTP   (0x01 << 0)
+#define S3C2410_GPH0_nCTS0  (0x02 << 0)
+
+#define S3C2410_GPH1_INP    (0x00 << 2)
+#define S3C2410_GPH1_OUTP   (0x01 << 2)
+#define S3C2410_GPH1_nRTS0  (0x02 << 2)
+
+#define S3C2410_GPH2_INP    (0x00 << 4)
+#define S3C2410_GPH2_OUTP   (0x01 << 4)
+#define S3C2410_GPH2_TXD0   (0x02 << 4)
+
+#define S3C2410_GPH3_INP    (0x00 << 6)
+#define S3C2410_GPH3_OUTP   (0x01 << 6)
+#define S3C2410_GPH3_RXD0   (0x02 << 6)
+
+#define S3C2410_GPH4_INP    (0x00 << 8)
+#define S3C2410_GPH4_OUTP   (0x01 << 8)
+#define S3C2410_GPH4_TXD1   (0x02 << 8)
+
+#define S3C2410_GPH5_INP    (0x00 << 10)
+#define S3C2410_GPH5_OUTP   (0x01 << 10)
+#define S3C2410_GPH5_RXD1   (0x02 << 10)
+
+#define S3C2410_GPH6_INP    (0x00 << 12)
+#define S3C2410_GPH6_OUTP   (0x01 << 12)
+#define S3C2410_GPH6_TXD2   (0x02 << 12)
+#define S3C2410_GPH6_nRTS1  (0x03 << 12)
+
+#define S3C2410_GPH7_INP    (0x00 << 14)
+#define S3C2410_GPH7_OUTP   (0x01 << 14)
+#define S3C2410_GPH7_RXD2   (0x02 << 14)
+#define S3C2410_GPH7_nCTS1  (0x03 << 14)
+
+#define S3C2410_GPH8_INP    (0x00 << 16)
+#define S3C2410_GPH8_OUTP   (0x01 << 16)
+#define S3C2410_GPH8_UCLK   (0x02 << 16)
+
+#define S3C2410_GPH9_INP     (0x00 << 18)
+#define S3C2410_GPH9_OUTP    (0x01 << 18)
+#define S3C2410_GPH9_CLKOUT0 (0x02 << 18)
+
+#define S3C2410_GPH10_INP   (0x00 << 20)
+#define S3C2410_GPH10_OUTP  (0x01 << 20)
+#define S3C2410_GPH10_CLKOUT1  (0x02 << 20)
+
+/* miscellaneous control */
+
+#define S3C2410_MISCCR	   S3C2410_GPIOREG(0x80)
+#define S3C2410_DCLKCON	   S3C2410_GPIOREG(0x84)
+
+/* see clock.h for dclk definitions */
+
+/* pullup control on databus */
+#define S3C2410_MISCCR_SPUCR_HEN    (0)
+#define S3C2410_MISCCR_SPUCR_HDIS   (1<<0)
+#define S3C2410_MISCCR_SPUCR_LEN    (0)
+#define S3C2410_MISCCR_SPUCR_LDIS   (1<<1)
+
+#define S3C2410_MISCCR_USBDEV	    (0)
+#define S3C2410_MISCCR_USBHOST	    (1<<3)
+
+#define S3C2410_MISCCR_CLK0_MPLL    (0<<4)
+#define S3C2410_MISCCR_CLK0_UPLL    (1<<4)
+#define S3C2410_MISCCR_CLK0_FCLK    (2<<4)
+#define S3C2410_MISCCR_CLK0_HCLK    (3<<4)
+#define S3C2410_MISCCR_CLK0_PCLK    (4<<4)
+#define S3C2410_MISCCR_CLK0_DCLK0   (5<<4)
+
+#define S3C2410_MISCCR_CLK1_MPLL    (0<<8)
+#define S3C2410_MISCCR_CLK1_UPLL    (1<<8)
+#define S3C2410_MISCCR_CLK1_FCLK    (2<<8)
+#define S3C2410_MISCCR_CLK1_HCLK    (3<<8)
+#define S3C2410_MISCCR_CLK1_PCLK    (4<<8)
+#define S3C2410_MISCCR_CLK1_DCLK1   (5<<8)
+
+#define S3C2410_MISCCR_USBSUSPND0   (1<<12)
+#define S3C2410_MISCCR_USBSUSPND1   (1<<13)
+
+#define S3C2410_MISCCR_nRSTCON	    (1<<16)
+
+/* external interrupt control... */
+/* S3C2410_EXTINT0 -> irq sense control for EINT0..EINT7
+ * S3C2410_EXTINT1 -> irq sense control for EINT8..EINT15
+ * S3C2410_EXTINT2 -> irq sense control for EINT16..EINT23
+ *
+ * note S3C2410_EXTINT2 has filtering options for EINT16..EINT23
+ *
+ * Samsung datasheet p9-25
+*/
+
+#define S3C2410_EXTINT0	   S3C2410_GPIOREG(0x88)
+#define S3C2410_EXTINT1	   S3C2410_GPIOREG(0x8C)
+#define S3C2410_EXTINT2	   S3C2410_GPIOREG(0x90)
+
+/* values for S3C2410_EXTINT0/1/2 */
+#define S3C2410_EXTINT_LOWLEV	 (0x00)
+#define S3C2410_EXTINT_HILEV	 (0x01)
+#define S3C2410_EXTINT_FALLEDGE	 (0x02)
+#define S3C2410_EXTINT_RISEEDGE	 (0x04)
+#define S3C2410_EXTINT_BOTHEDGE	 (0x06)
+
+/* interrupt filtering conrrol for EINT16..EINT23 */
+#define S3C2410_EINFLT0	   S3C2410_GPIOREG(0x94)
+#define S3C2410_EINFLT1	   S3C2410_GPIOREG(0x98)
+#define S3C2410_EINFLT2	   S3C2410_GPIOREG(0x9C)
+#define S3C2410_EINFLT3	   S3C2410_GPIOREG(0xA0)
+
+/* mask: 0=enable, 1=disable
+ * 1 bit EINT, 4=EINT4, 23=EINT23
+ * EINT0,1,2,3 are not handled here.
+*/
+#define S3C2410_EINTMASK   S3C2410_GPIOREG(0xA4)
+#define S3C2410_EINTPEND   S3C2410_GPIOREG(0xA8)
+
+/* GSTATUS have miscellaneous information in them
+ *
+ */
+
+#define S3C2410_GSTATUS0   S3C2410_GPIOREG(0x0AC)
+#define S3C2410_GSTATUS1   S3C2410_GPIOREG(0x0B0)
+#define S3C2410_GSTATUS2   S3C2410_GPIOREG(0x0B4)
+#define S3C2410_GSTATUS3   S3C2410_GPIOREG(0x0B8)
+#define S3C2410_GSTATUS4   S3C2410_GPIOREG(0x0BC)
+
+#define S3C2410_GSTATUS0_nWAIT	   (1<<3)
+#define S3C2410_GSTATUS0_NCON	   (1<<2)
+#define S3C2410_GSTATUS0_RnB	   (1<<1)
+#define S3C2410_GSTATUS0_nBATTFLT  (1<<0)
+
+#define S3C2410_GSTATUS2_WTRESET   (1<<2)
+#define S3C2410_GSTATUs2_OFFRESET  (1<<1)
+#define S3C2410_GSTATUS2_PONRESET  (1<<0)
+
+#endif	/* __ASM_ARCH_REGS_GPIO_H */
+
--- diff/include/asm-arm/arch-s3c2410/regs-iis.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/regs-iis.h	2004-04-21 10:45:35.829256624 +0100
@@ -0,0 +1,63 @@
+/* linux/include/asm/arch-s3c2410/regs-iis.h
+ *
+ * Copyright (c) 2003 Simtec Electronics <linux@simtec.co.uk>
+ *		      http://www.simtec.co.uk/products/SWLINUX/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * S3C2410 IIS register definition
+ *
+ *  Changelog:
+ *    19-06-2003     BJD     Created file
+ *    26-06-2003     BJD     Finished off definitions for register addresses
+ *    12-03-2004     BJD     Updated include protection
+ */
+
+#ifndef __ASM_ARCH_REGS_IIS_H
+#define __ASM_ARCH_REGS_IIS_H
+
+#define S3C2410_IISCON	 (S3C2410_VA_IIS + 0x00)
+
+#define S3C2410_IISCON_LRINDEX	  (1<<8)
+#define S3C2410_IISCON_TXFIFORDY  (1<<7)
+#define S3C2410_IISCON_RXFIFORDY  (1<<6)
+#define S3C2410_IISCON_TXDMAEN	  (1<<5)
+#define S3C2410_IISCON_RXDMAEN	  (1<<4)
+#define S3C2410_IISCON_TXIDLE	  (1<<3)
+#define S3C2410_IISCON_RXIDLE	  (1<<2)
+#define S3C2410_IISCON_IISEN	  (1<<0)
+
+#define S3C2410_IISMOD	 (S3C2410_VA_IIS + 0x04)
+
+#define S3C2410_IISMOD_SLAVE	  (1<<8)
+#define S3C2410_IISMOD_NOXFER	  (0<<6)
+#define S3C2410_IISMOD_RXMODE	  (1<<6)
+#define S3C2410_IISMOD_TXMODE	  (2<<6)
+#define S3C2410_IISMOD_TXRXMODE	  (3<<6)
+#define S3C2410_IISMOD_LR_LLOW	  (0<<5)
+#define S3C2410_IISMOD_LR_RLOW	  (1<<5)
+#define S3C2410_IISMOD_IIS	  (0<<4)
+#define S3C2410_IISMOD_MSB	  (1<<4)
+#define S3C2410_IISMOD_8BIT	  (0<<3)
+#define S3C2410_IISMOD_16BIT	  (1<<3)
+#define S3C2410_IISMOD_256FS	  (0<<1)
+#define S3C2410_IISMOD_384FS	  (1<<1)
+#define S3C2410_IISMOD_16FS	  (0<<0)
+#define S3C2410_IISMOD_32FS	  (1<<0)
+#define S3C2410_IISMOD_48FS	  (2<<0)
+
+#define S3C2410_IISPSR	 (S3C2410_VA_IIS + 0x08)
+
+#define S3C2410_IISFCON  (S3C2410_VA_IIS + 0x0c)
+
+#define S3C2410_IISFCON_TXDMA	  (1<<15)
+#define S3C2410_IISFCON_RXDMA	  (1<<14)
+#define S3C2410_IISFCON_TXENABLE  (1<<13)
+#define S3C2410_IISFCON_RXENABLE  (1<<12)
+
+#define S3C2410_IISFIFO  (S3C2410_VA_IIS + 0x10)
+
+#endif /* __ASM_ARCH_REGS_IIS_H */
+
--- diff/include/asm-arm/arch-s3c2410/regs-irq.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/regs-irq.h	2004-04-21 10:45:35.830256472 +0100
@@ -0,0 +1,38 @@
+/* linux/include/asm/arch-s3c2410/regs-irq.h
+ *
+ * Copyright (c) 2003 Simtec Electronics <linux@simtec.co.uk>
+ *		      http://www.simtec.co.uk/products/SWLINUX/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *
+ *
+ *  Changelog:
+ *    19-06-2003     BJD     Created file
+ *    12-03-2004     BJD     Updated include protection
+ */
+
+
+#ifndef ___ASM_ARCH_REGS_IRQ_H
+#define ___ASM_ARCH_REGS_IRQ_H "$Id: irq.h,v 1.3 2003/03/25 21:29:06 ben Exp $"
+
+/* interrupt controller */
+
+#define S3C2410_IRQREG(x)   ((x) + S3C2410_VA_IRQ)
+#define S3C2410_EINTREG(x)  ((x) + S3C2410_VA_GPIO)
+
+#define S3C2410_SRCPND	       S3C2410_IRQREG(0x000)
+#define S3C2410_INTMOD	       S3C2410_IRQREG(0x004)
+#define S3C2410_INTMSK	       S3C2410_IRQREG(0x008)
+#define S3C2410_PRIORITY       S3C2410_IRQREG(0x00C)
+#define S3C2410_INTPND	       S3C2410_IRQREG(0x010)
+#define S3C2410_INTOFFSET      S3C2410_IRQREG(0x014)
+#define S3C2410_SUBSRCPND      S3C2410_IRQREG(0x018)
+#define S3C2410_INTSUBMSK      S3C2410_IRQREG(0x01C)
+
+#define S3C2410_EINTMASK       S3C2410_EINTREG(0x0A4)
+#define S3C2410_EINTPEND       S3C2410_EINTREG(0X0A8)
+
+#endif /* ___ASM_ARCH_REGS_IRQ_H */
--- diff/include/asm-arm/arch-s3c2410/regs-lcd.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/regs-lcd.h	2004-04-21 10:45:35.830256472 +0100
@@ -0,0 +1,107 @@
+/* linux/include/asm/arch-s3c2410/regs-lcd.h
+ *
+ * Copyright (c) 2003 Simtec Electronics <linux@simtec.co.uk>
+ *		      http://www.simtec.co.uk/products/SWLINUX/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *
+ *
+ *  Changelog:
+ *    12-06-2003     BJD     Created file
+ *    26-06-2003     BJD     Updated LCDCON register definitions
+ *    12-03-2004     BJD     Updated include protection
+*/
+
+
+#ifndef ___ASM_ARCH_REGS_LCD_H
+#define ___ASM_ARCH_REGS_LCD_H "$Id: lcd.h,v 1.3 2003/06/26 13:25:06 ben Exp $"
+
+#define S3C2410_LCDREG(x) ((x) + S3C2410_VA_LCD)
+
+/* LCD control registers */
+#define S3C2410_LCDCON1	    S3C2410_LCDREG(0x00)
+#define S3C2410_LCDCON2	    S3C2410_LCDREG(0x04)
+#define S3C2410_LCDCON3	    S3C2410_LCDREG(0x08)
+#define S3C2410_LCDCON4	    S3C2410_LCDREG(0x0C)
+#define S3C2410_LCDCON5	    S3C2410_LCDREG(0x10)
+
+#define S3C2410_LCDCON1_CLKVAL(x)  ((x) << 8)
+#define S3C2410_LCDCON1_MMODE	   (1<<6)
+#define S3C2410_LCDCON1_DSCAN4	   (0<<5)
+#define S3C2410_LCDCON1_STN4	   (1<<5)
+#define S3C2410_LCDCON1_STN8	   (2<<5)
+#define S3C2410_LCDCON1_TFT	   (3<<5)
+
+#define S3C2410_LCDCON1_STN1BPP	   (0<<1)
+#define S3C2410_LCDCON1_STN2GREY   (1<<1)
+#define S3C2410_LCDCON1_STN4GREY   (2<<1)
+#define S3C2410_LCDCON1_STN8BPP	   (3<<1)
+#define S3C2410_LCDCON1_STN12BPP   (4<<1)
+
+#define S3C2410_LCDCON1_TFT1BPP	   (8<<1)
+#define S3C2410_LCDCON1_TFT2BPP	   (9<<1)
+#define S3C2410_LCDCON1_TFT4BPP	   (10<<1)
+#define S3C2410_LCDCON1_TFT8BPP	   (11<<1)
+#define S3C2410_LCDCON1_TFT16BPP   (12<<1)
+#define S3C2410_LCDCON1_TFT24BPP   (13<<1)
+
+#define S3C2410_LCDCON1_ENVDI	   (1)
+
+#define S3C2410_LCDCON2_VBPD(x)	    ((x) << 24)
+#define S3C2410_LCDCON2_LINEVAL(x)  ((x) << 14)
+#define S3C2410_LCDCON2_VFPD(x)	    ((x) << 6)
+#define S3C2410_LCDCON2_VSPW(x)	    ((x) << 0)
+
+#define S3C2410_LCDCON3_HBPD(x)	    ((x) << 25)
+#define S3C2410_LCDCON3_WDLY(x)	    ((x) << 25)
+#define S3C2410_LCDCON3_HOZVAL(x)   ((x) << 8)
+#define S3C2410_LCDCON3_HFPD(x)	    ((x) << 0)
+#define S3C2410_LCDCON3_LINEBLANK(x)((x) << 0)
+
+#define S3C2410_LCDCON4_MVAL(x)	    ((x) << 8)
+#define S3C2410_LCDCON4_HSPW(x)	    ((x) << 0)
+#define S3C2410_LCDCON4_WLH(x)	    ((x) << 0)
+
+#define S3C2410_LCDCON5_BPP24BL	    (1<<12)
+#define S3C2410_LCDCON5_FRM565	    (1<<11)
+#define S3C2410_LCDCON5_INVVCLK	    (1<<10)
+#define S3C2410_LCDCON5_INVVLINE    (1<<9)
+#define S3C2410_LCDCON5_INVVFRAME   (1<<8)
+#define S3C2410_LCDCON5_INVVD	    (1<<7)
+#define S3C2410_LCDCON5_INVVDEN	    (1<<6)
+#define S3C2410_LCDCON5_INVPWREN    (1<<5)
+#define S3C2410_LCDCON5_INVLEND	    (1<<4)
+#define S3C2410_LCDCON5_PWREN	    (1<<3)
+#define S3C2410_LCDCON5_ENLEND	    (1<<2)
+#define S3C2410_LCDCON5_BSWP	    (1<<1)
+#define S3C2410_LCDCON5_HWSWP	    (1<<0)
+
+/* framebuffer start addressed */
+#define S3C2410_LCDSADDR1   S3C2410_LCDREG(0x14)
+#define S3C2410_LCDSADDR2   S3C2410_LCDREG(0x18)
+#define S3C2410_LCDSADDR3   S3C2410_LCDREG(0x1C)
+
+/* colour lookup and miscellaneous controls */
+
+#define S3C2410_REDLUT	   S3C2410_LCDREG(0x20)
+#define S3C2410_GREENLUT   S3C2410_LCDREG(0x24)
+#define S3C2410_BLUELUT	   S3C2410_LCDREG(0x28)
+
+#define S3C2410_DITHMODE   S3C2410_LCDREG(0x4C)
+#define S3C2410_TPAL	   S3C2410_LCDREG(0x50)
+
+/* interrupt info */
+#define S3C2410_LCDINTPND  S3C2410_LCDREG(0x54)
+#define S3C2410_LCDSRCPND  S3C2410_LCDREG(0x58)
+#define S3C2410_LCDINTMSK  S3C2410_LCDREG(0x5C)
+#define S3C2410_LPCSEL	   S3C2410_LCDREG(0x60)
+
+#define S3C2410_TFTPAL(x)  S3C2410_LCDREG((0x400 + (x)*4))
+
+#endif /* ___ASM_ARCH_REGS_LCD_H */
+
+
+
--- diff/include/asm-arm/arch-s3c2410/regs-rtc.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/regs-rtc.h	2004-04-21 10:45:35.831256320 +0100
@@ -0,0 +1,63 @@
+/* linux/include/asm/arch-s3c2410/regs-rtc.h
+ *
+ * Copyright (c) 2003 Simtec Electronics <linux@simtec.co.uk>
+ *		      http://www.simtec.co.uk/products/SWLINUX/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * S3C2410 Internal RTC register definition
+ *
+ *  Changelog:
+ *    19-06-2003     BJD     Created file
+ *    12-03-2004     BJD     Updated include protection
+*/
+
+#ifndef __ASM_ARCH_REGS_RTC_H
+#define __ASM_ARCH_REGS_RTC_H __FILE__
+
+#define S3C2410_RTCREG(x) ((x) + S3C2410_VA_RTC)
+
+#define S3C2410_RTCCON	      S3C2410_RTCREG(0x40)
+#define S3C2410_RTCCON_RTCEN  (1<<0)
+#define S3C2410_RTCCON_CLKRST (1<<3)
+
+#define S3C2410_TICNT	      S3C2410_RTCREG(0x44)
+#define S3C2410_TICNT_ENABLE  (1<<7)
+
+#define S3C2410_RTCALM	      S3C2410_RTCREG(0x50)
+#define S3C2410_RTCALM_ALMEN  (1<<6)
+#define S3C2410_RTCALM_YEAREN (1<<5)
+#define S3C2410_RTCALM_MONEN  (1<<4)
+#define S3C2410_RTCALM_DAYEN  (1<<3)
+#define S3C2410_RTCALM_HOUREN (1<<2)
+#define S3C2410_RTCALM_MINEN  (1<<1)
+#define S3C2410_RTCALM_SECEN  (1<<0)
+
+#define S3C2410_RTCALM_ALL \
+  S3C2410_RTCALM_ALMEN | S3C2410_RTCALM_YEAREN | S3C2410_RTCALM_MONEN |\
+  S3C2410_RTCALM_DAYEN | S3C2410_RTCALM_HOUREN | S3C2410_RTCALM_MINEN |\
+  S3C2410_RTCALM_SECEN
+
+
+#define S3C2410_ALMSEC	      S3C2410_RTCREG(0x54)
+#define S3C2410_ALMMIN	      S3C2410_RTCREG(0x58)
+#define S3C2410_ALMHOUR	      S3C2410_RTCREG(0x5c)
+
+#define S3C2410_ALMDATE	      S3C2410_RTCREG(0x60)
+#define S3C2410_ALMMON	      S3C2410_RTCREG(0x64)
+#define S3C2410_ALMYEAR	      S3C2410_RTCREG(0x68)
+
+#define S3C2410_RTCRST	      S3C2410_RTCREG(0x6c)
+
+#define S3C2410_RTCSEC	      S3C2410_RTCREG(0x70)
+#define S3C2410_RTCMIN	      S3C2410_RTCREG(0x74)
+#define S3C2410_RTCHOUR	      S3C2410_RTCREG(0x78)
+#define S3C2410_RTCDATE	      S3C2410_RTCREG(0x7c)
+#define S3C2410_RTCDAY	      S3C2410_RTCREG(0x80)
+#define S3C2410_RTCMON	      S3C2410_RTCREG(0x84)
+#define S3C2410_RTCYEAR	      S3C2410_RTCREG(0x88)
+
+
+#endif /* __ASM_ARCH_REGS_RTC_H */
--- diff/include/asm-arm/arch-s3c2410/regs-serial.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/regs-serial.h	2004-04-21 10:45:35.831256320 +0100
@@ -0,0 +1,140 @@
+/* linux/include/asm-arm/arch-s3c2410/regs-serial.h
+ *
+ *  From linux/include/asm-arm/hardware/serial_s3c2410.h
+ *
+ *  Internal header file for Samsung S3C2410 serial ports (UART0-2)
+ *
+ *  Copyright (C) 2002 Shane Nay (shane@minirl.com)
+ *
+ *  Additional defines, (c) 2003 Simtec Electronics (linux@simtec.co.uk)
+ *
+ *  Adapted from:
+ *
+ *  Internal header file for MX1ADS serial ports (UART1 & 2)
+ *
+ *  Copyright (C) 2002 Shane Nay (shane@minirl.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef __ASM_ARM_REGS_SERIAL_H
+#define __ASM_ARM_REGS_SERIAL_H
+
+#define S3C2410_VA_UART0      (S3C2410_VA_UART)
+#define S3C2410_VA_UART1      (S3C2410_VA_UART + 0x4000 )
+#define S3C2410_VA_UART2      (S3C2410_VA_UART + 0x8000 )
+
+#define S3C2410_PA_UART0      (S3C2410_PA_UART)
+#define S3C2410_PA_UART1      (S3C2410_PA_UART + 0x4000 )
+#define S3C2410_PA_UART2      (S3C2410_PA_UART + 0x8000 )
+
+#define S3C2410_URXH	  (0x24)
+#define S3C2410_UTXH	  (0x20)
+#define S3C2410_ULCON	  (0x00)
+#define S3C2410_UCON	  (0x04)
+#define S3C2410_UFCON	  (0x08)
+#define S3C2410_UMCON	  (0x0C)
+#define S3C2410_UBRDIV	  (0x28)
+#define S3C2410_UTRSTAT	  (0x10)
+#define S3C2410_UERSTAT	  (0x14)
+#define S3C2410_UFSTAT	  (0x18)
+#define S3C2410_UMSTAT	  (0x1C)
+
+#define S3C2410_LCON_CFGMASK	  ((0xF<<3)|(0x3))
+
+#define S3C2410_LCON_CS5	  (0x0)
+#define S3C2410_LCON_CS6	  (0x1)
+#define S3C2410_LCON_CS7	  (0x2)
+#define S3C2410_LCON_CS8	  (0x3)
+#define S3C2410_LCON_CSMASK	  (0x3)
+
+#define S3C2410_LCON_PNONE	  (0x0)
+#define S3C2410_LCON_PEVEN	  (0x5 << 3)
+#define S3C2410_LCON_PODD	  (0x4 << 3)
+#define S3C2410_LCON_PMASK	  (0x7 << 3)
+
+#define S3C2410_LCON_STOPB	  (1<<2)
+
+#define S3C2410_UCON_UCLK	  (1<<10)
+#define S3C2410_UCON_SBREAK	  (1<<4)
+
+#define S3C2410_UCON_TXILEVEL	  (1<<9)
+#define S3C2410_UCON_RXILEVEL	  (1<<8)
+#define S3C2410_UCON_TXIRQMODE	  (1<<2)
+#define S3C2410_UCON_RXIRQMODE	  (1<<0)
+#define S3C2410_UCON_RXFIFO_TOI	  (1<<7)
+
+#define S3C2410_UCON_DEFAULT	  (S3C2410_UCON_TXILEVEL | S3C2410_UCON_RXILEVEL \
+				   | S3C2410_UCON_TXIRQMODE | S3C2410_UCON_RXIRQMODE \
+				   | S3C2410_UCON_RXFIFO_TOI)
+
+#define S3C2410_UFCON_FIFOMODE	  (1<<0)
+#define S3C2410_UFCON_TXTRIG0	  (0<<6)
+#define S3C2410_UFCON_RXTRIG8	  (1<<4)
+#define S3C2410_UFCON_RXTRIG12	  (2<<4)
+
+#define S3C2410_UFCON_RESETBOTH	  (3<<1)
+
+#define S3C2410_UFCON_DEFAULT	  (S3C2410_UFCON_FIFOMODE | S3C2410_UFCON_TXTRIG0 \
+				  | S3C2410_UFCON_RXTRIG8 )
+
+#define S3C2410_UFSTAT_TXFULL	  (1<<9)
+#define S3C2410_UFSTAT_RXFULL	  (1<<8)
+#define S3C2410_UFSTAT_TXMASK	  (15<<4)
+#define S3C2410_UFSTAT_TXSHIFT	  (4)
+#define S3C2410_UFSTAT_RXMASK	  (15<<0)
+#define S3C2410_UFSTAT_RXSHIFT	  (0)
+
+#define S3C2410_UTRSTAT_TXFE	  (1<<1)
+#define S3C2410_UTRSTAT_RXDR	  (1<<0)
+
+#define S3C2410_UERSTAT_OVERRUN	  (1<<0)
+#define S3C2410_UERSTAT_FRAME	  (1<<2)
+#define S3C2410_UERSTAT_ANY	  (S3C2410_UERSTAT_OVERRUN | S3C2410_UERSTAT_FRAME)
+
+/* fifo size information */
+
+#define S3C2410_UFCON_RXC(fcon)	  (((fcon) & S3C2410_UFSTAT_RXMASK) >> S3C2410_UFSTAT_RXSHIFT)
+#define S3C2410_UFCON_TXC(fcon)	  (((fcon) & S3C2410_UFSTAT_TXMASK) >> S3C2410_UFSTAT_TXSHIFT)
+
+#define S3C2410_UMSTAT_CTS	  (1<<0)
+#define S3C2410_UMSTAT_DeltaCTS	  (1<<2)
+
+#ifndef __ASSEMBLY__
+/* configuration structure for per-machine configurations for the
+ * serial port
+ *
+ * the pointer is setup by the machine specific initialisation from the
+ * arch/arm/mach-s3c2410/ directory.
+*/
+
+struct s3c2410_uartcfg {
+	unsigned char	   hwport;	 /* hardware port number */
+	unsigned char	   unused;
+	unsigned short	   flags;
+
+	unsigned long	  *clock;	 /* pointer to clock rate */
+
+	unsigned long	   ucon;	 /* value of ucon for port */
+	unsigned long	   ulcon;	 /* value of ulcon for port */
+	unsigned long	   ufcon;	 /* value of ufcon for port */
+};
+
+extern struct s3c2410_uartcfg *s3c2410_uartcfgs;
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* __ASM_ARM_REGS_SERIAL_H */
+
--- diff/include/asm-arm/arch-s3c2410/regs-timer.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/regs-timer.h	2004-04-21 10:45:35.831256320 +0100
@@ -0,0 +1,108 @@
+/* linux/include/asm/arch-s3c2410/regs-timer.h
+ *
+ * Copyright (c) 2003 Simtec Electronics <linux@simtec.co.uk>
+ *		      http://www.simtec.co.uk/products/SWLINUX/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * S3C2410 Timer configuration
+ *
+ *  Changelog:
+ *    05-06-2003     BJD     Created file
+ *    26-06-2003     BJD     Added more timer definitions to mux / control
+ *    12-03-2004     BJD     Updated include protection
+*/
+
+
+#ifndef __ASM_ARCH_REGS_TIMER_H
+#define __ASM_ARCH_REGS_TIMER_H "$Id: timer.h,v 1.4 2003/05/06 19:30:50 ben Exp $"
+
+#define S3C2410_TIMERREG(x) (S3C2410_VA_TIMER + (x))
+#define S3C2410_TIMERREG2(tmr,reg) S3C2410_TIMERREG((reg)+0x0c+((tmr)*0x0c))
+
+#define S3C2410_TCFG0	      S3C2410_TIMERREG(0x00)
+#define S3C2410_TCFG1	      S3C2410_TIMERREG(0x04)
+#define S3C2410_TCON	      S3C2410_TIMERREG(0x08)
+
+#define S3C2410_TCFG_PRESCALER0_MASK (255<<0)
+#define S3C2410_TCFG_PRESCALER1_MASK (255<<8)
+#define S3C2410_TCFG_PRESCALER1_SHIFT (8)
+
+#define S3C2410_TCFG1_MUX4_DIV2	  (0<<16)
+#define S3C2410_TCFG1_MUX4_DIV4	  (1<<16)
+#define S3C2410_TCFG1_MUX4_DIV8	  (2<<16)
+#define S3C2410_TCFG1_MUX4_DIV16  (3<<16)
+#define S3C2410_TCFG1_MUX4_TCLK1  (4<<16)
+#define S3C2410_TCFG1_MUX4_MASK	  (15<<16)
+
+#define S3C2410_TCFG1_MUX3_DIV2	  (0<<12)
+#define S3C2410_TCFG1_MUX3_DIV4	  (1<<12)
+#define S3C2410_TCFG1_MUX3_DIV8	  (2<<12)
+#define S3C2410_TCFG1_MUX3_DIV16  (3<<12)
+#define S3C2410_TCFG1_MUX3_TCLK1  (4<<12)
+#define S3C2410_TCFG1_MUX3_MASK	  (15<<12)
+
+
+#define S3C2410_TCFG1_MUX2_DIV2	  (0<<8)
+#define S3C2410_TCFG1_MUX2_DIV4	  (1<<8)
+#define S3C2410_TCFG1_MUX2_DIV8	  (2<<8)
+#define S3C2410_TCFG1_MUX2_DIV16  (3<<8)
+#define S3C2410_TCFG1_MUX2_TCLK1  (4<<8)
+#define S3C2410_TCFG1_MUX2_MASK	  (15<<8)
+
+
+#define S3C2410_TCFG1_MUX1_DIV2	  (0<<4)
+#define S3C2410_TCFG1_MUX1_DIV4	  (1<<4)
+#define S3C2410_TCFG1_MUX1_DIV8	  (2<<4)
+#define S3C2410_TCFG1_MUX1_DIV16  (3<<4)
+#define S3C2410_TCFG1_MUX1_TCLK0  (4<<4)
+#define S3C2410_TCFG1_MUX1_MASK	  (15<<4)
+
+#define S3C2410_TCFG1_MUX0_DIV2	  (0<<0)
+#define S3C2410_TCFG1_MUX0_DIV4	  (1<<0)
+#define S3C2410_TCFG1_MUX0_DIV8	  (2<<0)
+#define S3C2410_TCFG1_MUX0_DIV16  (3<<0)
+#define S3C2410_TCFG1_MUX0_TCLK0  (4<<0)
+#define S3C2410_TCFG1_MUX0_MASK	  (15<<0)
+
+/* for each timer, we have an count buffer, an compare buffer and
+ * an observation buffer
+*/
+
+/* WARNING - timer 4 has no buffer reg, and it's observation is at +4 */
+
+#define S3C2410_TCNTB(tmr)    S3C2410_TIMERREG2(tmr, 0x00)
+#define S3C2410_TCMPB(tmr)    S3C2410_TIMERREG2(tmr, 0x04)
+#define S3C2410_TCNTO(tmr)    S3C2410_TIMERREG2(tmr, (((tmr) == 4) ? 0x04 : 0x08))
+
+#define S3C2410_TCON_T4RELOAD	  (1<<22)
+#define S3C2410_TCON_T4MANUALUPD  (1<<21)
+#define S3C2410_TCON_T4START	  (1<<20)
+
+#define S3C2410_TCON_T3RELOAD	  (1<<19)
+#define S3C2410_TCON_T3INVERT	  (1<<18)
+#define S3C2410_TCON_T3MANUALUPD  (1<<17)
+#define S3C2410_TCON_T3START	  (1<<16)
+
+#define S3C2410_TCON_T2RELOAD	  (1<<15)
+#define S3C2410_TCON_T2INVERT	  (1<<14)
+#define S3C2410_TCON_T2MANUALUPD  (1<<13)
+#define S3C2410_TCON_T2START	  (1<<12)
+
+#define S3C2410_TCON_T1RELOAD	  (1<<11)
+#define S3C2410_TCON_T1INVERT	  (1<<10)
+#define S3C2410_TCON_T1MANUALUPD  (1<<9)
+#define S3C2410_TCON_T1START	  (1<<8)
+
+#define S3C2410_TCON_T0DEADZONE	  (1<<4)
+#define S3C2410_TCON_T0RELOAD	  (1<<3)
+#define S3C2410_TCON_T0INVERT	  (1<<2)
+#define S3C2410_TCON_T0MANUALUPD  (1<<1)
+#define S3C2410_TCON_T0START	  (1<<0)
+
+#endif /*  __ASM_ARCH_REGS_TIMER_H */
+
+
+
--- diff/include/asm-arm/arch-s3c2410/regs-watchdog.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/regs-watchdog.h	2004-04-21 10:45:35.832256168 +0100
@@ -0,0 +1,44 @@
+/* linux/include/asm/arch-s3c2410/regs0watchdog.h
+ *
+ * Copyright (c) 2003 Simtec Electronics <linux@simtec.co.uk>
+ *		      http://www.simtec.co.uk/products/SWLINUX/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * S3C2410 Watchdog timer control
+ *
+ *  Changelog:
+ *    21-06-2003     BJD     Created file
+ *    12-03-2004     BJD     Updated include protection
+*/
+
+
+#ifndef __ASM_ARCH_REGS_WATCHDOG_H
+#define __ASM_ARCH_REGS_WATCHDOG_H "$Id: watchdog.h,v 1.2 2003/04/29 13:31:09 ben Exp $"
+
+#define S3C2410_WDOGREG(x) ((x) + S3C2410_VA_WATCHDOG)
+
+#define S3C2410_WTCON	   S3C2410_WDOGREG(0x00)
+#define S3C2410_WTDAT	   S3C2410_WDOGREG(0x04)
+#define S3C2410_WTCNT	   S3C2410_WDOGREG(0x08)
+
+/* the watchdog can either generate a reset pulse, or an
+ * interrupt.
+ */
+
+#define S3C2410_WTCON_RSTEN   (0x01)
+#define S3C2410_WTCON_INTEN   (1<<2)
+#define S3C2410_WTCON_ENABLE  (1<<5)
+
+#define S3C2410_WTCON_DIV16   (0<<3)
+#define S3C2410_WTCON_DIV32   (1<<3)
+#define S3C2410_WTCON_DIV64   (2<<3)
+#define S3C2410_WTCON_DIV128  (3<<3)
+
+#define S3C2410_WTCON_PRESCALE(x) ((x) << 8)
+
+#endif /* __ASM_ARCH_REGS_WATCHDOG_H */
+
+
--- diff/include/asm-arm/arch-s3c2410/serial.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/serial.h	2004-04-21 10:45:35.832256168 +0100
@@ -0,0 +1,28 @@
+/* linux/include/asm-arm/arch-s3c2410/serial.h
+ *
+ * (c) 2003 Simtec Electronics
+ *  Ben Dooks <ben@simtec.co.uk>
+ *
+ * S3C2410 - serial port definitions
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Changelog:
+ *  03-Sep-2003 BJD  Created file
+ *  19-Mar-2004 BJD  Removed serial port definitions, inserted elsewhere
+*/
+
+#ifndef __ASM_ARCH_SERIAL_H
+#define __ASM_ARCH_SERIAL_H
+
+/* Standard COM flags */
+#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST)
+
+#define BASE_BAUD ( 1843200 / 16 )
+
+#define STD_SERIAL_PORT_DEFNS
+#define EXTRA_SERIAL_PORT_DEFNS
+
+#endif /* __ASM_ARCH_SERIAL_H */
--- diff/include/asm-arm/arch-s3c2410/system.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/system.h	2004-04-21 10:45:35.832256168 +0100
@@ -0,0 +1,84 @@
+/* linux/include/asm-arm/arch-s3c2410/system.h
+ *
+ * (c) 2003 Simtec Electronics
+ *  Ben Dooks <ben@simtec.co.uk>
+ *
+ * S3C2410 - System function defines and includes
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Changelog:
+ *  12-May-2003 BJD  Created file
+ *  14-May-2003 BJD  Removed idle to aid debugging
+ *  12-Jun-2003 BJD  Added reset via watchdog
+ *  04-Sep-2003 BJD  Moved to v2.6
+ */
+
+#include <asm/hardware.h>
+#include <asm/io.h>
+
+#include <asm/arch/map.h>
+
+#include <asm/arch/regs-watchdog.h>
+#include <asm/arch/regs-clock.h>
+
+extern void printascii(const char *);
+
+void
+arch_idle(void)
+{
+	//unsigned long reg = S3C2410_CLKCON;
+
+	//printascii("arch_idle:\n");
+
+	/* idle the system by using the idle mode which will wait for an
+	 * interrupt to happen before restarting the system.
+	 */
+
+	/* going into idle state upsets the jtag, so don't do it
+	 * at the moment */
+
+#if 0
+	__raw_writel(__raw_readl(reg) | (1<<2), reg);
+
+	/* the samsung port seems to do a loop and then unset idle.. */
+	for (i = 0; i < 50; i++) {
+		tmp = __raw_readl(reg); /* ensure loop not optimised out */
+	}
+
+	//printascii("arch_idle: done\n");
+
+	__raw_writel(__raw_readl(reg) & ~(1<<2), reg);
+#endif
+}
+
+
+static void
+arch_reset(char mode)
+{
+	if (mode == 's') {
+		cpu_reset(0);
+	}
+
+	printk("arch_reset: attempting watchdog reset\n");
+
+	__raw_writel(0, S3C2410_WTCON);	  /* disable watchdog, to be safe  */
+
+	/* put initial values into count and data */
+	__raw_writel(0x100, S3C2410_WTCNT);
+	__raw_writel(0x100, S3C2410_WTDAT);
+
+	/* set the watchdog to go and reset... */
+	__raw_writel(S3C2410_WTCON_ENABLE|S3C2410_WTCON_DIV16|S3C2410_WTCON_RSTEN |
+		     S3C2410_WTCON_PRESCALE(0x80), S3C2410_WTCON);
+
+	/* wait for reset to assert... */
+	mdelay(5000);
+
+	panic("Watchdog reset failed to assert reset\n");
+
+	/* we'll take a jump through zero as a poor second */
+	cpu_reset(0);
+}
--- diff/include/asm-arm/arch-s3c2410/time.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/time.h	2004-04-21 10:45:35.833256016 +0100
@@ -0,0 +1,173 @@
+/* linux/include/asm-arm/arch-s3c2410/time.h
+ *
+ *  Copyright (C) 2003 Simtec Electronics <linux@simtec.co.uk>
+ *    Ben Dooks, <ben@simtec.co.uk>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <asm/system.h>
+#include <asm/leds.h>
+#include <asm/mach-types.h>
+
+#include <asm/io.h>
+#include <asm/arch/map.h>
+#include <asm/arch/regs-timer.h>
+
+extern unsigned long (*gettimeoffset)(void);
+
+static unsigned long timer_startval;
+static unsigned long timer_ticks_usec;
+
+#ifdef CONFIG_S3C2410_RTC
+extern void s3c2410_rtc_check();
+#endif
+
+/* with an 12MHz clock, we get 12 ticks per-usec
+ */
+
+
+/***
+ * Returns microsecond  since last clock interrupt.  Note that interrupts
+ * will have been disabled by do_gettimeoffset()
+ * IRQs are disabled before entering here from do_gettimeofday()
+ */
+static unsigned long s3c2410_gettimeoffset (void)
+{
+	unsigned long tdone;
+	unsigned long usec;
+
+	/* work out how many ticks have gone since last timer interrupt */
+
+	tdone = timer_startval - __raw_readl(S3C2410_TCNTO(4));
+
+	/* currently, tcnt is in 12MHz units, but this may change
+	 * for non-bast machines...
+	 */
+
+	usec = tdone / timer_ticks_usec;
+
+	return usec;
+}
+
+
+/*
+ * IRQ handler for the timer
+ */
+static irqreturn_t
+s3c2410_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+	do_leds();
+	do_timer(regs);
+
+	do_set_rtc();
+	//s3c2410_rtc_check();
+	do_profile(regs);
+
+	return IRQ_HANDLED;
+}
+
+/*
+ * Set up timer interrupt, and return the current time in seconds.
+ */
+
+/* currently we only use timer4, as it is the only timer which has no
+ * other function that can be exploited externally
+*/
+
+void __init time_init (void)
+{
+	unsigned long tcon;
+	unsigned long tcnt;
+	unsigned long tcfg1;
+	unsigned long tcfg0;
+
+	gettimeoffset = s3c2410_gettimeoffset;
+	timer_irq.handler = s3c2410_timer_interrupt;
+
+	tcnt = 0xffff;  /* default value for tcnt */
+
+	/* read the current timer configuration bits */
+
+	tcon = __raw_readl(S3C2410_TCON);
+	tcfg1 = __raw_readl(S3C2410_TCFG1);
+	tcfg0 = __raw_readl(S3C2410_TCFG0);
+
+	/* configure the system for whichever machine is in use */
+
+	if (machine_is_bast() || machine_is_vr1000()) {
+		timer_ticks_usec = 12;	      /* timer is at 12MHz */
+		tcnt = (timer_ticks_usec * (1000*1000)) / HZ;
+	}
+
+	/* for the h1940, we use the pclk from the core to generate
+	 * the timer values. since 67.5MHz is not a value we can directly
+	 * generate the timer value from, we need to pre-scale and
+	 * divied before using it.
+	 *
+	 * overall divsior to get 200Hz is 337500
+	 *   we can fit tcnt if we pre-scale by 6, producing a tick rate
+	 *   of 11.25MHz, and a tcnt of 56250.
+	 */
+
+	if (machine_is_h1940()) {
+		timer_ticks_usec = s3c2410_pclk / (1000*1000);
+		timer_ticks_usec /= 6;
+
+		tcfg1 &= ~S3C2410_TCFG1_MUX4_MASK;
+		tcfg1 |= S3C2410_TCFG1_MUX4_DIV2;
+
+		tcfg0 &= ~S3C2410_TCFG_PRESCALER1_MASK;
+		tcfg0 |= ((6 - 1) / 2) << S3C2410_TCFG_PRESCALER1_SHIFT;
+
+		tcnt = (s3c2410_pclk / 6) / HZ;
+	}
+
+
+	printk("setup_timer tcon=%08lx, tcnt %04lx, tcfg %08lx,%08lx\n",
+	       tcon, tcnt, tcfg0, tcfg1);
+
+	/* check to see if timer is within 16bit range... */
+	if (tcnt > 0xffff) {
+		panic("setup_timer: HZ is too small, cannot configure timer!");
+		return;
+	}
+
+	__raw_writel(tcfg1, S3C2410_TCFG1);
+	__raw_writel(tcfg0, S3C2410_TCFG0);
+
+	timer_startval = tcnt;
+	__raw_writel(tcnt, S3C2410_TCNTB(4));
+
+	/* ensure timer is stopped... */
+
+	tcon &= ~(7<<20);
+	tcon |= S3C2410_TCON_T4RELOAD;
+	tcon |= S3C2410_TCON_T4MANUALUPD;
+
+	__raw_writel(tcon, S3C2410_TCON);
+	__raw_writel(tcnt, S3C2410_TCNTB(4));
+	__raw_writel(tcnt, S3C2410_TCMPB(4));
+
+	setup_irq(IRQ_TIMER4, &timer_irq);
+
+	/* start the timer running */
+	tcon |= S3C2410_TCON_T4START;
+	tcon &= ~S3C2410_TCON_T4MANUALUPD;
+	__raw_writel(tcon, S3C2410_TCON);
+}
+
+
+
--- diff/include/asm-arm/arch-s3c2410/timex.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/timex.h	2004-04-21 10:45:35.833256016 +0100
@@ -0,0 +1,33 @@
+/* linux/include/asm-arm/arch-s3c2410/timex.h
+ *
+ * (c) 2003 Simtec Electronics
+ *  Ben Dooks <ben@simtec.co.uk>
+ *
+ * S3C2410 - time parameters
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Changelog:
+ *  02-Sep-2003 BJD  Created file
+ *  05-Jan-2004 BJD  Updated for Linux 2.6.0
+*/
+
+#ifndef __ASM_ARCH_TIMEX_H
+#define __ASM_ARCH_TIMEX_H
+
+#if 0
+/* todo - this does not seem to work with 2.6.0 -> division by zero
+ * in header files
+ */
+extern int s3c2410_clock_tick_rate;
+
+#define CLOCK_TICK_RATE (s3c2410_clock_tick_rate)
+#endif
+
+/* currently, the BAST uses 24MHz as a base clock rate */
+#define CLOCK_TICK_RATE 24000000
+
+
+#endif /* __ASM_ARCH_TIMEX_H */
--- diff/include/asm-arm/arch-s3c2410/uncompress.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/uncompress.h	2004-04-21 10:45:35.833256016 +0100
@@ -0,0 +1,110 @@
+/* linux/include/asm-arm/arch-s3c2410/uncompress.h
+ *
+ * (c) 2003 Simtec Electronics
+ *    Ben Dooks <ben@simtec.co.uk>
+ *
+ * S3C2410 - uncompress code
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Changelog:
+ *  22-May-2003 BJD  Created
+ *  08-Sep-2003 BJD  Moved to linux v2.6
+ *  12-Mar-2004 BJD  Updated header protection
+*/
+
+#ifndef __ASM_ARCH_UNCOMPRESS_H
+#define __ASM_ARCH_UNCOMPRESS_H
+
+/* defines for UART registers */
+#include "asm/arch/regs-serial.h"
+
+#include <asm/arch/map.h>
+
+/* how many bytes we allow into the FIFO at a time in FIFO mode */
+#define FIFO_MAX	 (14)
+
+#if 1
+#define uart_base S3C2410_PA_UART
+#else
+static unsigned int uart_base = S3C2410_PA_UART;
+#endif
+
+static __inline__ void
+uart_wr(unsigned int reg, unsigned int val)
+{
+	volatile unsigned int *ptr;
+
+	ptr = (volatile unsigned int *)(reg + uart_base);
+	*ptr = val;
+}
+
+static __inline__ unsigned int
+uart_rd(unsigned int reg)
+{
+	volatile unsigned int *ptr;
+
+	ptr = (volatile unsigned int *)(reg + uart_base);
+	return *ptr;
+}
+
+
+/* currently we do not need the watchdog... */
+#define arch_decomp_wdog()
+
+
+static void error(char *err);
+
+static void
+arch_decomp_setup(void)
+{
+	/* we may need to setup the uart(s) here if we are not running
+	 * on an BAST... the BAST will have left the uarts configured
+	 * after calling linux.
+	 */
+}
+
+/* we can deal with the case the UARTs are being run
+ * in FIFO mode, so that we don't hold up our execution
+ * waiting for tx to happen...
+*/
+
+static void
+putc(char ch)
+{
+	if (ch == '\n')
+		putc('\r');    /* expand newline to \r\n */
+
+	if (uart_rd(S3C2410_UFCON) & S3C2410_UFCON_FIFOMODE) {
+		int level;
+
+		while (1) {
+			level = uart_rd(S3C2410_UFSTAT);
+			level &= S3C2410_UFSTAT_TXMASK;
+			level >>= S3C2410_UFSTAT_TXSHIFT;
+
+			if (level < FIFO_MAX)
+				break;
+		}
+
+	} else {
+		/* not using fifos */
+
+		while ((uart_rd(S3C2410_UTRSTAT) & S3C2410_UTRSTAT_TXFE) != S3C2410_UTRSTAT_TXFE);
+	}
+
+	/* write byte to transmission register */
+	uart_wr(S3C2410_UTXH, ch);
+}
+
+static void
+puts(const char *ptr)
+{
+	for (; *ptr != '\0'; ptr++) {
+		putc(*ptr);
+	}
+}
+
+#endif /* __ASM_ARCH_UNCOMPRESS_H */
--- diff/include/asm-arm/arch-s3c2410/vmalloc.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/vmalloc.h	2004-04-21 10:45:35.834255864 +0100
@@ -0,0 +1,36 @@
+/* linux/include/asm-arm/arch-s3c2410/vmalloc.h
+ *
+ * from linux/include/asm-arm/arch-iop3xx/vmalloc.h
+ *
+ * Copyright (c) 2003 Simtec Electronics <linux@simtec.co.uk>
+ *		      http://www.simtec.co.uk/products/SWLINUX/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * S3C2410 vmalloc definition
+ *
+ *  Changelog:
+ *    12-Mar-2004 BJD	Fixed header, added include protection
+ *    12=Mar-2004 BJD	Fixed VMALLOC_END definitions
+ */
+
+#ifndef __ASM_ARCH_VMALLOC_H
+#define __ASM_ARCH_VMALLOC_H
+
+/*
+ * Just any arbitrary offset to the start of the vmalloc VM area: the
+ * current 8MB value just means that there will be a 8MB "hole" after the
+ * physical memory until the kernel virtual memory starts.  That means that
+ * any out-of-bounds memory accesses will hopefully be caught.
+ * The vmalloc() routines leaves a hole of 4kB between each vmalloced
+ * area for the same reason. ;)
+ */
+
+#define VMALLOC_OFFSET	  (8*1024*1024)
+#define VMALLOC_START	  (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
+#define VMALLOC_VMADDR(x) ((unsigned long)(x))
+#define VMALLOC_END	  (0xE0000000)
+
+#endif /* __ASM_ARCH_VMALLOC_H */
--- diff/include/asm-arm/arch-s3c2410/vr1000-cpld.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/vr1000-cpld.h	2004-04-21 10:45:35.834255864 +0100
@@ -0,0 +1,22 @@
+/* linux/include/asm-arm/arch-s3c2410/vr1000-cpld.h
+ *
+ * (c) 2003 Simtec Electronics
+ *  Ben Dooks <ben@simtec.co.uk>
+ *
+ * VR1000 - CPLD control constants
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Changelog:
+ *  25-May-2003 BJD  Created file, added CTRL1 registers
+ *  19-Mar-2004 BJD  Added VR1000 CPLD definitions
+*/
+
+#ifndef __ASM_ARCH_VR1000CPLD_H
+#define __ASM_ARCH_VR1000CPLD_H
+
+#define VR1000_CPLD_CTRL2_RAMWEN     (0x04)   /* SRAM Write Enable */
+
+#endif /* __ASM_ARCH_VR1000CPLD_H */
--- diff/include/asm-arm/arch-s3c2410/vr1000-irq.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/vr1000-irq.h	2004-04-21 10:45:35.834255864 +0100
@@ -0,0 +1,30 @@
+/* linux/include/asm-arm/arch-s3c2410/vr1000-irq.h
+ *
+ * (c) 2003,2004 Simtec Electronics
+ *  Ben Dooks <ben@simtec.co.uk>
+ *
+ * Machine VR1000 - IRQ Number definitions
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Changelog:
+ *  06-Jan-2003 BJD  Linux 2.6.0 version
+ *  19-Mar-2004 BJD  Updates for VR1000
+ */
+
+#ifndef __ASM_ARCH_VR1000IRQ_H
+#define __ASM_ARCH_VR1000IRQ_H
+
+/* irq numbers to onboard peripherals */
+
+#define IRQ_USBOC	     IRQ_EINT19
+#define IRQ_IDE0	     IRQ_EINT16
+#define IRQ_IDE1	     IRQ_EINT17
+#define IRQ_VR1000_SERIAL    IRQ_EINT12
+#define IRQ_VR1000_DM9000A   IRQ_EINT10
+#define IRQ_VR1000_DM9000N   IRQ_EINT9
+#define IRQ_SMALERT	     IRQ_EINT8
+
+#endif /* __ASM_ARCH_VR1000IRQ_H */
--- diff/include/asm-arm/arch-s3c2410/vr1000-map.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/arch-s3c2410/vr1000-map.h	2004-04-21 10:45:35.835255712 +0100
@@ -0,0 +1,112 @@
+/* linux/include/asm-arm/arch-s3c2410/vr1000-map.h
+ *
+ * (c) 2003,2004 Simtec Electronics
+ *  Ben Dooks <ben@simtec.co.uk>
+ *
+ * Machine VR1000 - Memory map definitions
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Changelog:
+ *  06-Jan-2003 BJD  Linux 2.6.0 version, split specifics from arch/map.h
+ *  12-Mar-2004 BJD  Fixed header include protection
+ *  19-Mar-2004 BJD  Copied to VR1000 machine headers.
+*/
+
+/* needs arch/map.h including with this */
+
+/* ok, we've used up to 0x13000000, now we need to find space for the
+ * peripherals that live in the nGCS[x] areas, which are quite numerous
+ * in their space. We also have the board's CPLD to find register space
+ * for.
+ */
+
+#ifndef __ASM_ARCH_VR1000MAP_H
+#define __ASM_ARCH_VR1000MAP_H
+
+#include <asm/arch/bast-map.h>
+
+#define VR1000_IOADDR(x) BAST_IOADDR(x)
+
+/* we put the CPLD registers next, to get them out of the way */
+
+#define VR1000_VA_CTRL1	    VR1000_IOADDR(0x00000000)	 /* 0x01300000 */
+#define VR1000_PA_CTRL1	    (S3C2410_CS5 | 0x7800000)
+
+#define VR1000_VA_CTRL2	    VR1000_IOADDR(0x00100000)	 /* 0x01400000 */
+#define VR1000_PA_CTRL2	    (S3C2410_CS1 | 0x6000000)
+
+#define VR1000_VA_CTRL3	    VR1000_IOADDR(0x00200000)	 /* 0x01500000 */
+#define VR1000_PA_CTRL3	    (S3C2410_CS1 | 0x6800000)
+
+#define VR1000_VA_CTRL4	    VR1000_IOADDR(0x00300000)	 /* 0x01600000 */
+#define VR1000_PA_CTRL4	    (S3C2410_CS1 | 0x7000000)
+
+/* next, we have the PC104 ISA interrupt registers */
+
+#define VR1000_PA_PC104_IRQREQ  (S3C2410_CS5 | 0x6000000) /* 0x01700000 */
+#define VR1000_VA_PC104_IRQREQ  VR1000_IOADDR(0x00400000)
+
+#define VR1000_PA_PC104_IRQRAW  (S3C2410_CS5 | 0x6800000) /* 0x01800000 */
+#define VR1000_VA_PC104_IRQRAW  VR1000_IOADDR(0x00500000)
+
+#define VR1000_PA_PC104_IRQMASK (S3C2410_CS5 | 0x7000000) /* 0x01900000 */
+#define VR1000_VA_PC104_IRQMASK VR1000_IOADDR(0x00600000)
+
+/* 0xE0000000 contains the IO space that is split by speed and
+ * wether the access is for 8 or 16bit IO... this ensures that
+ * the correct access is made
+ *
+ * 0x10000000 of space, partitioned as so:
+ *
+ * 0x00000000 to 0x04000000  8bit,  slow
+ * 0x04000000 to 0x08000000  16bit, slow
+ * 0x08000000 to 0x0C000000  16bit, net
+ * 0x0C000000 to 0x10000000  16bit, fast
+ *
+ * each of these spaces has the following in:
+ *
+ * 0x02000000 to 0x02100000 1MB  IDE primary channel
+ * 0x02100000 to 0x02200000 1MB  IDE primary channel aux
+ * 0x02200000 to 0x02400000 1MB  IDE secondary channel
+ * 0x02300000 to 0x02400000 1MB  IDE secondary channel aux
+ * 0x02500000 to 0x02600000 1MB  Davicom DM9000 ethernet controllers
+ * 0x02600000 to 0x02700000 1MB
+ *
+ * the phyiscal layout of the zones are:
+ *  nGCS2 - 8bit, slow
+ *  nGCS3 - 16bit, slow
+ *  nGCS4 - 16bit, net
+ *  nGCS5 - 16bit, fast
+ */
+
+#define VR1000_VA_MULTISPACE (0xE0000000)
+
+#define VR1000_VA_ISAIO		   (VR1000_VA_MULTISPACE + 0x00000000)
+#define VR1000_VA_ISAMEM	   (VR1000_VA_MULTISPACE + 0x01000000)
+#define VR1000_VA_IDEPRI	   (VR1000_VA_MULTISPACE + 0x02000000)
+#define VR1000_VA_IDEPRIAUX	   (VR1000_VA_MULTISPACE + 0x02100000)
+#define VR1000_VA_IDESEC	   (VR1000_VA_MULTISPACE + 0x02200000)
+#define VR1000_VA_IDESECAUX	   (VR1000_VA_MULTISPACE + 0x02300000)
+#define VR1000_VA_ASIXNET	   (VR1000_VA_MULTISPACE + 0x02400000)
+#define VR1000_VA_DM9000	   (VR1000_VA_MULTISPACE + 0x02500000)
+#define VR1000_VA_SUPERIO	   (VR1000_VA_MULTISPACE + 0x02600000)
+
+
+/* physical offset addresses for the peripherals */
+
+#define VR1000_PA_IDEPRI	   (0x02000000)
+#define VR1000_PA_IDEPRIAUX	   (0x02800000)
+#define VR1000_PA_IDESEC	   (0x03000000)
+#define VR1000_PA_IDESECAUX	   (0x03800000)
+#define VR1000_PA_DM9000	   (0x05000000)
+
+#define VR1000_PA_SERIAL	   (0x11800000)
+
+/* some configurations for the peripherals */
+
+#define VR1000_DM9000_CS	 VR1000_VAM_CS4
+
+#endif /* __ASM_ARCH_VR1000MAP_H */
--- diff/include/asm-arm/hardware/amba_serial.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-arm/hardware/amba_serial.h	2004-04-21 10:45:35.838255256 +0100
@@ -0,0 +1,156 @@
+/*
+ *  linux/include/asm-arm/hardware/serial_amba.h
+ *
+ *  Internal header file for AMBA serial ports
+ *
+ *  Copyright (C) ARM Limited
+ *  Copyright (C) 2000 Deep Blue Solutions Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#ifndef ASM_ARM_HARDWARE_SERIAL_AMBA_H
+#define ASM_ARM_HARDWARE_SERIAL_AMBA_H
+
+/* -------------------------------------------------------------------------------
+ *  From AMBA UART (PL010) Block Specification
+ * -------------------------------------------------------------------------------
+ *  UART Register Offsets.
+ */
+#define UART01x_DR		0x00	/* Data read or written from the interface. */
+#define UART01x_RSR		0x04	/* Receive status register (Read). */
+#define UART01x_ECR		0x04	/* Error clear register (Write). */
+#define UART010_LCRH		0x08	/* Line control register, high byte. */
+#define UART010_LCRM		0x0C	/* Line control register, middle byte. */
+#define UART010_LCRL		0x10	/* Line control register, low byte. */
+#define UART010_CR		0x14	/* Control register. */
+#define UART01x_FR		0x18	/* Flag register (Read only). */
+#define UART010_IIR		0x1C	/* Interrupt indentification register (Read). */
+#define UART010_ICR		0x1C	/* Interrupt clear register (Write). */
+#define UART01x_ILPR		0x20	/* IrDA low power counter register. */
+#define UART011_IBRD		0x24	/* Integer baud rate divisor register. */
+#define UART011_FBRD		0x28	/* Fractional baud rate divisor register. */
+#define UART011_LCRH		0x2c	/* Line control register. */
+#define UART011_CR		0x30	/* Control register. */
+#define UART011_IFLS		0x34	/* Interrupt fifo level select. */
+#define UART011_IMSC		0x38	/* Interrupt mask. */
+#define UART011_RIS		0x3c	/* Raw interrupt status. */
+#define UART011_MIS		0x40	/* Masked interrupt status. */
+#define UART011_ICR		0x44	/* Interrupt clear register. */
+#define UART011_DMACR		0x48	/* DMA control register. */
+
+#define UART01x_RSR_OE 		0x08
+#define UART01x_RSR_BE 		0x04
+#define UART01x_RSR_PE 		0x02
+#define UART01x_RSR_FE 		0x01
+
+#define UART011_FR_RI		0x100
+#define UART011_FR_TXFE		0x080
+#define UART011_FR_RXFF		0x040
+#define UART01x_FR_TXFF		0x020
+#define UART01x_FR_RXFE		0x010
+#define UART01x_FR_BUSY		0x008
+#define UART01x_FR_DCD 		0x004
+#define UART01x_FR_DSR 		0x002
+#define UART01x_FR_CTS 		0x001
+#define UART01x_FR_TMSK		(UART01x_FR_TXFF + UART01x_FR_BUSY)
+
+#define UART011_CR_CTSEN	0x8000	/* CTS hardware flow control */
+#define UART011_CR_RTSEN	0x4000	/* RTS hardware flow control */
+#define UART011_CR_OUT2		0x2000	/* OUT2 */
+#define UART011_CR_OUT1		0x1000	/* OUT1 */
+#define UART011_CR_RTS		0x0800	/* RTS */
+#define UART011_CR_DTR		0x0400	/* DTR */
+#define UART011_CR_RXE		0x0200	/* receive enable */
+#define UART011_CR_TXE		0x0100	/* transmit enable */
+#define UART011_CR_LBE		0x0080	/* loopback enable */
+#define UART010_CR_RTIE		0x0040
+#define UART010_CR_TIE 		0x0020
+#define UART010_CR_RIE 		0x0010
+#define UART010_CR_MSIE		0x0008
+#define UART01x_CR_IIRLP	0x0004	/* SIR low power mode */
+#define UART01x_CR_SIREN	0x0002	/* SIR enable */
+#define UART01x_CR_UARTEN	0x0001	/* UART enable */
+ 
+#define UART011_LCRH_SPS	0x80
+#define UART01x_LCRH_WLEN_8	0x60
+#define UART01x_LCRH_WLEN_7	0x40
+#define UART01x_LCRH_WLEN_6	0x20
+#define UART01x_LCRH_WLEN_5	0x00
+#define UART01x_LCRH_FEN	0x10
+#define UART01x_LCRH_STP2	0x08
+#define UART01x_LCRH_EPS	0x04
+#define UART01x_LCRH_PEN	0x02
+#define UART01x_LCRH_BRK	0x01
+
+#define UART010_IIR_RTIS	0x08
+#define UART010_IIR_TIS		0x04
+#define UART010_IIR_RIS		0x02
+#define UART010_IIR_MIS		0x01
+
+#define UART011_IFLS_RX1_8	(0 << 3)
+#define UART011_IFLS_RX2_8	(1 << 3)
+#define UART011_IFLS_RX4_8	(2 << 3)
+#define UART011_IFLS_RX6_8	(3 << 3)
+#define UART011_IFLS_RX7_8	(4 << 3)
+#define UART011_IFLS_TX1_8	(0 << 0)
+#define UART011_IFLS_TX2_8	(1 << 0)
+#define UART011_IFLS_TX4_8	(2 << 0)
+#define UART011_IFLS_TX6_8	(3 << 0)
+#define UART011_IFLS_TX7_8	(4 << 0)
+
+#define UART011_OEIM		(1 << 10)	/* overrun error interrupt mask */
+#define UART011_BEIM		(1 << 9)	/* break error interrupt mask */
+#define UART011_PEIM		(1 << 8)	/* parity error interrupt mask */
+#define UART011_FEIM		(1 << 7)	/* framing error interrupt mask */
+#define UART011_RTIM		(1 << 6)	/* receive timeout interrupt mask */
+#define UART011_TXIM		(1 << 5)	/* transmit interrupt mask */
+#define UART011_RXIM		(1 << 4)	/* receive interrupt mask */
+#define UART011_DSRMIM		(1 << 3)	/* DSR interrupt mask */
+#define UART011_DCDMIM		(1 << 2)	/* DCD interrupt mask */
+#define UART011_CTSMIM		(1 << 1)	/* CTS interrupt mask */
+#define UART011_RIMIM		(1 << 0)	/* RI interrupt mask */
+
+#define UART011_OEIS		(1 << 10)	/* overrun error interrupt status */
+#define UART011_BEIS		(1 << 9)	/* break error interrupt status */
+#define UART011_PEIS		(1 << 8)	/* parity error interrupt status */
+#define UART011_FEIS		(1 << 7)	/* framing error interrupt status */
+#define UART011_RTIS		(1 << 6)	/* receive timeout interrupt status */
+#define UART011_TXIS		(1 << 5)	/* transmit interrupt status */
+#define UART011_RXIS		(1 << 4)	/* receive interrupt status */
+#define UART011_DSRMIS		(1 << 3)	/* DSR interrupt status */
+#define UART011_DCDMIS		(1 << 2)	/* DCD interrupt status */
+#define UART011_CTSMIS		(1 << 1)	/* CTS interrupt status */
+#define UART011_RIMIS		(1 << 0)	/* RI interrupt status */
+
+#define UART011_OEIC		(1 << 10)	/* overrun error interrupt clear */
+#define UART011_BEIC		(1 << 9)	/* break error interrupt clear */
+#define UART011_PEIC		(1 << 8)	/* parity error interrupt clear */
+#define UART011_FEIC		(1 << 7)	/* framing error interrupt clear */
+#define UART011_RTIC		(1 << 6)	/* receive timeout interrupt clear */
+#define UART011_TXIC		(1 << 5)	/* transmit interrupt clear */
+#define UART011_RXIC		(1 << 4)	/* receive interrupt clear */
+#define UART011_DSRMIC		(1 << 3)	/* DSR interrupt clear */
+#define UART011_DCDMIC		(1 << 2)	/* DCD interrupt clear */
+#define UART011_CTSMIC		(1 << 1)	/* CTS interrupt clear */
+#define UART011_RIMIC		(1 << 0)	/* RI interrupt clear */
+
+#define UART011_DMAONERR	(1 << 2)	/* disable dma on error */
+#define UART011_TXDMAE		(1 << 1)	/* enable transmit dma */
+#define UART011_RXDMAE		(1 << 0)	/* enable receive dma */
+
+#define UART01x_RSR_ANY		(UART01x_RSR_OE|UART01x_RSR_BE|UART01x_RSR_PE|UART01x_RSR_FE)
+#define UART01x_FR_MODEM_ANY	(UART01x_FR_DCD|UART01x_FR_DSR|UART01x_FR_CTS)
+
+#endif
--- diff/include/asm-generic/hdreg.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-generic/hdreg.h	2004-04-21 10:45:35.849253584 +0100
@@ -0,0 +1,8 @@
+#warning <asm/hdreg.h> is obsolete, please do not use it
+
+#ifndef __ASM_GENERIC_HDREG_H
+#define __ASM_GENERIC_HDREG_H
+
+typedef unsigned long ide_ioreg_t;
+
+#endif /* __ASM_GENERIC_HDREG_H */
--- diff/include/asm-i386/mach-default/irq_vectors_limits.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-i386/mach-default/irq_vectors_limits.h	2004-04-21 10:45:35.855252672 +0100
@@ -0,0 +1,21 @@
+#ifndef _ASM_IRQ_VECTORS_LIMITS_H
+#define _ASM_IRQ_VECTORS_LIMITS_H
+
+#ifdef CONFIG_PCI_USE_VECTOR
+#define NR_IRQS FIRST_SYSTEM_VECTOR
+#define NR_IRQ_VECTORS NR_IRQS
+#else
+#ifdef CONFIG_X86_IO_APIC
+#define NR_IRQS 224
+# if (224 >= 32 * NR_CPUS)
+# define NR_IRQ_VECTORS NR_IRQS
+# else
+# define NR_IRQ_VECTORS (32 * NR_CPUS)
+# endif
+#else
+#define NR_IRQS 16
+#define NR_IRQ_VECTORS NR_IRQS
+#endif
+#endif
+
+#endif /* _ASM_IRQ_VECTORS_LIMITS_H */
--- diff/include/asm-i386/mach-generic/irq_vectors_limits.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-i386/mach-generic/irq_vectors_limits.h	2004-04-21 10:45:35.856252520 +0100
@@ -0,0 +1,14 @@
+#ifndef _ASM_IRQ_VECTORS_LIMITS_H
+#define _ASM_IRQ_VECTORS_LIMITS_H
+
+/*
+ * For Summit or generic (i.e. installer) kernels, we have lots of I/O APICs,
+ * even with uni-proc kernels, so use a big array.
+ *
+ * This value should be the same in both the generic and summit subarches.
+ * Change one, change 'em both.
+ */
+#define NR_IRQS	224
+#define NR_IRQ_VECTORS	1024
+
+#endif /* _ASM_IRQ_VECTORS_LIMITS_H */
--- diff/include/asm-i386/mach-summit/irq_vectors_limits.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-i386/mach-summit/irq_vectors_limits.h	2004-04-21 10:45:35.857252368 +0100
@@ -0,0 +1,14 @@
+#ifndef _ASM_IRQ_VECTORS_LIMITS_H
+#define _ASM_IRQ_VECTORS_LIMITS_H
+
+/*
+ * For Summit or generic (i.e. installer) kernels, we have lots of I/O APICs,
+ * even with uni-proc kernels, so use a big array.
+ *
+ * This value should be the same in both the generic and summit subarches.
+ * Change one, change 'em both.
+ */
+#define NR_IRQS	224
+#define NR_IRQ_VECTORS	1024
+
+#endif /* _ASM_IRQ_VECTORS_LIMITS_H */
--- diff/include/asm-i386/msi.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-i386/msi.h	2004-04-21 10:45:35.858252216 +0100
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2003-2004 Intel
+ * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
+ */
+
+#ifndef ASM_MSI_H
+#define ASM_MSI_H
+
+#include <asm/desc.h>
+#include <mach_apic.h>
+
+#define LAST_DEVICE_VECTOR		232
+#define MSI_DEST_MODE			MSI_LOGICAL_MODE
+#define MSI_TARGET_CPU_SHIFT		12
+
+#ifdef CONFIG_SMP
+#define MSI_TARGET_CPU		logical_smp_processor_id()
+#else
+#define MSI_TARGET_CPU		TARGET_CPUS
+#endif
+
+#endif /* ASM_MSI_H */
--- diff/include/asm-i386/std_resources.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-i386/std_resources.h	2004-04-21 10:45:35.859252064 +0100
@@ -0,0 +1,14 @@
+/*
+ * include/asm-i386/std_resources.h
+ */
+
+#ifndef __ASM_I386_STD_RESOURCES_H
+#define __ASM_I386_STD_RESOURCES_H
+
+#include <linux/init.h>
+
+void probe_roms(void) __init;
+void request_graphics_resource(void) __init;
+void request_standard_io_resources(void) __init;
+
+#endif
--- diff/include/asm-ia64/msi.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-ia64/msi.h	2004-04-21 10:45:35.863251456 +0100
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2003-2004 Intel
+ * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
+ */
+
+#ifndef ASM_MSI_H
+#define ASM_MSI_H
+
+#define NR_VECTORS		NR_IRQS
+#define FIRST_DEVICE_VECTOR 	IA64_FIRST_DEVICE_VECTOR
+#define LAST_DEVICE_VECTOR	IA64_LAST_DEVICE_VECTOR
+static inline void set_intr_gate (int nr, void *func) {}
+#define IO_APIC_VECTOR(irq)	(irq)
+#define ack_APIC_irq		ia64_eoi
+#define irq_desc		_irq_desc
+#define cpu_mask_to_apicid(mask) cpu_physical_id(first_cpu(mask))
+#define MSI_DEST_MODE		MSI_PHYSICAL_MODE
+#define MSI_TARGET_CPU	((ia64_getreg(_IA64_REG_CR_LID) >> 16) & 0xffff)
+#define MSI_TARGET_CPU_SHIFT	4
+
+#endif /* ASM_MSI_H */
--- diff/include/asm-mips/mach-au1x00/au1100_mmc.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-mips/mach-au1x00/au1100_mmc.h	2004-04-21 10:45:35.876249480 +0100
@@ -0,0 +1,205 @@
+/*
+ * BRIEF MODULE DESCRIPTION
+ *	Defines for using the MMC/SD controllers on the
+ *      Alchemy Au1100 mips processor.
+ *
+ * Copyright (c) 2003 Embedded Edge, LLC.
+ * Author: Embedded Edge, LLC.
+ *         	dan@embeddededge.com or tim@embeddededge.com
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+/*
+ * AU1100 MMC/SD definitions.
+ *
+ * From "AMD Alchemy Solutions Au1100 Processor Data Book - Preliminary"
+ *    June, 2003
+ */
+
+#ifndef __ASM_AU1100_MMC_H
+#define __ASM_AU1100_MMC_H
+
+
+#define NUM_AU1100_MMC_CONTROLLERS	2
+
+
+#define AU1100_SD_IRQ	2
+
+
+#define SD0_BASE	0xB0600000
+#define SD1_BASE	0xB0680000
+
+
+/*
+ *  Register offsets.
+ */
+#define SD_TXPORT	(0x0000)
+#define SD_RXPORT	(0x0004)
+#define SD_CONFIG	(0x0008)
+#define SD_ENABLE	(0x000C)
+#define SD_CONFIG2	(0x0010)
+#define SD_BLKSIZE	(0x0014)
+#define SD_STATUS	(0x0018)
+#define SD_DEBUG	(0x001C)
+#define SD_CMD		(0x0020)
+#define SD_CMDARG	(0x0024)
+#define SD_RESP3	(0x0028)
+#define SD_RESP2	(0x002C)
+#define SD_RESP1	(0x0030)
+#define SD_RESP0	(0x0034)
+#define SD_TIMEOUT	(0x0038)
+
+
+/*
+ *  SD_TXPORT bit definitions.
+ */
+#define SD_TXPORT_TXD	(0x000000ff)
+
+
+/*
+ *  SD_RXPORT bit definitions.
+ */
+#define SD_RXPORT_RXD	(0x000000ff)
+
+
+/*
+ *  SD_CONFIG bit definitions.
+ */
+#define SD_CONFIG_DIV	(0x000001ff)
+#define SD_CONFIG_DE	(0x00000200)
+#define SD_CONFIG_NE	(0x00000400)
+#define SD_CONFIG_TU	(0x00000800)
+#define SD_CONFIG_TO	(0x00001000)
+#define SD_CONFIG_RU	(0x00002000)
+#define SD_CONFIG_RO	(0x00004000)
+#define SD_CONFIG_I	(0x00008000)
+#define SD_CONFIG_CR	(0x00010000)
+#define SD_CONFIG_RAT	(0x00020000)
+#define SD_CONFIG_DD	(0x00040000)
+#define SD_CONFIG_DT	(0x00080000)
+#define SD_CONFIG_SC	(0x00100000)
+#define SD_CONFIG_RC	(0x00200000)
+#define SD_CONFIG_WC	(0x00400000)
+#define SD_CONFIG_xxx	(0x00800000)
+#define SD_CONFIG_TH	(0x01000000)
+#define SD_CONFIG_TE	(0x02000000)
+#define SD_CONFIG_TA	(0x04000000)
+#define SD_CONFIG_RH	(0x08000000)
+#define SD_CONFIG_RA	(0x10000000)
+#define SD_CONFIG_RF	(0x20000000)
+#define SD_CONFIG_CD	(0x40000000)
+#define SD_CONFIG_SI	(0x80000000)
+
+
+/*
+ *  SD_ENABLE bit definitions.
+ */
+#define SD_ENABLE_CE	(0x00000001)
+#define SD_ENABLE_R	(0x00000002)
+
+
+/*
+ *  SD_CONFIG2 bit definitions.
+ */
+#define SD_CONFIG2_EN	(0x00000001)
+#define SD_CONFIG2_FF	(0x00000002)
+#define SD_CONFIG2_xx1	(0x00000004)
+#define SD_CONFIG2_DF	(0x00000008)
+#define SD_CONFIG2_DC	(0x00000010)
+#define SD_CONFIG2_xx2	(0x000000e0)
+#define SD_CONFIG2_WB	(0x00000100)
+#define SD_CONFIG2_RW	(0x00000200)
+
+
+/*
+ *  SD_BLKSIZE bit definitions.
+ */
+#define SD_BLKSIZE_BS	(0x000007ff)
+#define SD_BLKSIZE_BS_SHIFT	 (0)
+#define SD_BLKSIZE_BC	(0x01ff0000)
+#define SD_BLKSIZE_BC_SHIFT	(16)
+
+
+/*
+ *  SD_STATUS bit definitions.
+ */
+#define SD_STATUS_DCRCW	(0x00000007)
+#define SD_STATUS_xx1	(0x00000008)
+#define SD_STATUS_CB	(0x00000010)
+#define SD_STATUS_DB	(0x00000020)
+#define SD_STATUS_CF	(0x00000040)
+#define SD_STATUS_D3	(0x00000080)
+#define SD_STATUS_xx2	(0x00000300)
+#define SD_STATUS_NE	(0x00000400)
+#define SD_STATUS_TU	(0x00000800)
+#define SD_STATUS_TO	(0x00001000)
+#define SD_STATUS_RU	(0x00002000)
+#define SD_STATUS_RO	(0x00004000)
+#define SD_STATUS_I	(0x00008000)
+#define SD_STATUS_CR	(0x00010000)
+#define SD_STATUS_RAT	(0x00020000)
+#define SD_STATUS_DD	(0x00040000)
+#define SD_STATUS_DT	(0x00080000)
+#define SD_STATUS_SC	(0x00100000)
+#define SD_STATUS_RC	(0x00200000)
+#define SD_STATUS_WC	(0x00400000)
+#define SD_STATUS_xx3	(0x00800000)
+#define SD_STATUS_TH	(0x01000000)
+#define SD_STATUS_TE	(0x02000000)
+#define SD_STATUS_TA	(0x04000000)
+#define SD_STATUS_RH	(0x08000000)
+#define SD_STATUS_RA	(0x10000000)
+#define SD_STATUS_RF	(0x20000000)
+#define SD_STATUS_CD	(0x40000000)
+#define SD_STATUS_SI	(0x80000000)
+
+
+/*
+ *  SD_CMD bit definitions.
+ */
+#define SD_CMD_GO	(0x00000001)
+#define SD_CMD_RY	(0x00000002)
+#define SD_CMD_xx1	(0x0000000c)
+#define SD_CMD_CT_MASK	(0x000000f0)
+#define SD_CMD_CT_0	(0x00000000)
+#define SD_CMD_CT_1	(0x00000010)
+#define SD_CMD_CT_2	(0x00000020)
+#define SD_CMD_CT_3	(0x00000030)
+#define SD_CMD_CT_4	(0x00000040)
+#define SD_CMD_CT_5	(0x00000050)
+#define SD_CMD_CT_6	(0x00000060)
+#define SD_CMD_CT_7	(0x00000070)
+#define SD_CMD_CI	(0x0000ff00)
+#define SD_CMD_CI_SHIFT		(8)
+#define SD_CMD_RT_MASK	(0x00ff0000)
+#define SD_CMD_RT_0	(0x00000000)
+#define SD_CMD_RT_1	(0x00010000)
+#define SD_CMD_RT_2	(0x00020000)
+#define SD_CMD_RT_3	(0x00030000)
+#define SD_CMD_RT_4	(0x00040000)
+#define SD_CMD_RT_5	(0x00050000)
+#define SD_CMD_RT_6	(0x00060000)
+#define SD_CMD_RT_1B	(0x00810000)
+
+
+#endif /* __ASM_AU1100_MMC_H */
+
--- diff/include/asm-mips/mach-au1x00/au1xxx_dbdma.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-mips/mach-au1x00/au1xxx_dbdma.h	2004-04-21 10:45:35.877249328 +0100
@@ -0,0 +1,297 @@
+/*
+ *
+ * BRIEF MODULE DESCRIPTION
+ *	Include file for Alchemy Semiconductor's Au1550 Descriptor
+ *	Based DMA Controller.
+ *
+ * Copyright 2004 Embedded Edge, LLC
+ *	dan@embeddededge.com
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/* Specifics for the Au1xxx Descriptor-Based DMA Controllers, first
+ * seen in the AU1550 part.
+ */
+#ifndef _AU1000_DBDMA_H_
+#define _AU1000_DBDMA_H_
+
+#ifndef _LANGUAGE_ASSEMBLY
+
+/* The DMA base addresses.
+ * The Channels are every 256 bytes (0x0100) from the channel 0 base.
+ * Interrupt status/enable is bits 15:0 for channels 15 to zero.
+ */
+#define DDMA_GLOBAL_BASE	0xb4003000
+#define DDMA_CHANNEL_BASE	0xb4002000
+
+typedef struct dbdma_global {
+	u32	ddma_config;
+	u32	ddma_intstat;
+	u32	ddma_throttle;
+	u32	ddma_inten;
+} dbdma_global_t;
+
+/* General Configuration.
+*/
+#define DDMA_CONFIG_AF		(1 << 2)
+#define DDMA_CONFIG_AH		(1 << 1)
+#define DDMA_CONFIG_AL		(1 << 0)
+
+#define DDMA_THROTTLE_EN	(1 << 31)
+
+/* The structure of a DMA Channel.
+*/
+typedef struct au1xxx_dma_channel {
+	u32	ddma_cfg;	/* See below */
+	u32	ddma_desptr;	/* 32-byte aligned pointer to descriptor */
+	u32	ddma_statptr;	/* word aligned pointer to status word */
+	u32	ddma_dbell;	/* A write activates channel operation */
+	u32	ddma_irq;	/* If bit 0 set, interrupt pending */
+	u32	ddma_stat;	/* See below */
+	u32	ddma_bytecnt;	/* Byte count, valid only when chan idle */
+	/* Remainder, up to the 256 byte boundary, is reserved.
+	*/
+} au1x_dma_chan_t;
+
+#define DDMA_CFG_SED	(1 << 9)	/* source DMA level/edge detect */
+#define DDMA_CFG_SP	(1 << 8)	/* source DMA polarity */
+#define DDMA_CFG_DED	(1 << 7)	/* destination DMA level/edge detect */
+#define DDMA_CFG_DP	(1 << 6)	/* destination DMA polarity */
+#define DDMA_CFG_SYNC	(1 << 5)	/* Sync static bus controller */
+#define DDMA_CFG_PPR	(1 << 4)	/* PCI posted read/write control */
+#define DDMA_CFG_DFN	(1 << 3)	/* Descriptor fetch non-coherent */
+#define DDMA_CFG_SBE	(1 << 2)	/* Source big endian */
+#define DDMA_CFG_DBE	(1 << 1)	/* Destination big endian */
+#define DDMA_CFG_EN	(1 << 0)	/* Channel enable */
+
+/* Always set when descriptor processing done, regardless of
+ * interrupt enable state.  Reflected in global intstat, don't
+ * clear this until global intstat is read/used.
+ */
+#define DDMA_IRQ_IN	(1 << 0)
+
+#define DDMA_STAT_DB	(1 << 2)	/* Doorbell pushed */
+#define DDMA_STAT_V	(1 << 1)	/* Descriptor valid */
+#define DDMA_STAT_H	(1 << 0)	/* Channel Halted */
+
+/* "Standard" DDMA Descriptor.
+ * Must be 32-byte aligned.
+ */
+typedef struct au1xxx_ddma_desc {
+	u32	dscr_cmd0;		/* See below */
+	u32	dscr_cmd1;		/* See below */
+	u32	dscr_source0;		/* source phys address */
+	u32	dscr_source1;		/* See below */
+	u32	dscr_dest0;		/* Destination address */
+	u32	dscr_dest1;		/* See below */
+	u32	dscr_stat;		/* completion status */
+	u32	dscr_nxtptr;		/* Next descriptor pointer (mostly) */
+} au1x_ddma_desc_t;
+
+#define DSCR_CMD0_V		(1 << 31)	/* Descriptor valid */
+#define DSCR_CMD0_MEM		(1 << 30)	/* mem-mem transfer */
+#define DSCR_CMD0_SID_MASK	(0x1f << 25)	/* Source ID */
+#define DSCR_CMD0_DID_MASK	(0x1f << 20)	/* Destination ID */
+#define DSCR_CMD0_SW_MASK	(0x3 << 18)	/* Source Width */
+#define DSCR_CMD0_DW_MASK	(0x3 << 16)	/* Destination Width */
+#define DSCR_CMD0_ARB		(0x1 << 15)	/* Set for Hi Pri */
+#define DSCR_CMD0_DT_MASK	(0x3 << 13)	/* Descriptor Type */
+#define DSCR_CMD0_SN		(0x1 << 12)	/* Source non-coherent */
+#define DSCR_CMD0_DN		(0x1 << 11)	/* Destination non-coherent */
+#define DSCR_CMD0_SM		(0x1 << 10)	/* Stride mode */
+#define DSCR_CMD0_IE		(0x1 << 8)	/* Interrupt Enable */
+#define DSCR_CMD0_SP		(0x1 << 4)	/* Status pointer select */
+#define DSCR_CMD0_CV		(0x1 << 2)	/* Clear Valid when done */
+#define DSCR_CMD0_ST_MASK	(0x3 << 0)	/* Status instruction */
+
+/* Command 0 device IDs.
+*/
+#define DSCR_CMD0_UART0_TX	0
+#define DSCR_CMD0_UART0_RX	1
+#define DSCR_CMD0_UART3_TX	2
+#define DSCR_CMD0_UART3_RX	3
+#define DSCR_CMD0_DMA_REQ0	4
+#define DSCR_CMD0_DMA_REQ1	5
+#define DSCR_CMD0_DMA_REQ2	6
+#define DSCR_CMD0_DMA_REQ3	7
+#define DSCR_CMD0_USBDEV_RX0	8
+#define DSCR_CMD0_USBDEV_TX0	9
+#define DSCR_CMD0_USBDEV_TX1	10
+#define DSCR_CMD0_USBDEV_TX2	11
+#define DSCR_CMD0_USBDEV_RX3	12
+#define DSCR_CMD0_USBDEV_RX4	13
+#define DSCR_CMD0_PSC0_TX	14
+#define DSCR_CMD0_PSC0_RX	15
+#define DSCR_CMD0_PSC1_TX	16
+#define DSCR_CMD0_PSC1_RX	17
+#define DSCR_CMD0_PSC2_TX	18
+#define DSCR_CMD0_PSC2_RX	19
+#define DSCR_CMD0_PSC3_TX	20
+#define DSCR_CMD0_PSC3_RX	21
+#define DSCR_CMD0_PCI_WRITE	22
+#define DSCR_CMD0_NAND_FLASH	23
+#define DSCR_CMD0_MAC0_RX	24
+#define DSCR_CMD0_MAC0_TX	25
+#define DSCR_CMD0_MAC1_RX	26
+#define DSCR_CMD0_MAC1_TX	27
+#define DSCR_CMD0_THROTTLE	30
+#define DSCR_CMD0_ALWAYS	31
+#define DSCR_NDEV_IDS		32
+
+#define DSCR_CMD0_SID(x)	(((x) & 0x1f) << 25)
+#define DSCR_CMD0_DID(x)	(((x) & 0x1f) << 20)
+
+/* Source/Destination transfer width.
+*/
+#define DSCR_CMD0_BYTE		0
+#define DSCR_CMD0_HALFWORD	1
+#define DSCR_CMD0_WORD		2
+
+#define DSCR_CMD0_SW(x)		(((x) & 0x3) << 18)
+#define DSCR_CMD0_DW(x)		(((x) & 0x3) << 16)
+
+/* DDMA Descriptor Type.
+*/
+#define DSCR_CMD0_STANDARD	0
+#define DSCR_CMD0_LITERAL	1
+#define DSCR_CMD0_CMP_BRANCH	2
+
+#define DSCR_CMD0_DT(x)		(((x) & 0x3) << 13)
+
+/* Status Instruction.
+*/
+#define DSCR_CMD0_ST_NOCHANGE	0	/* Don't change */
+#define DSCR_CMD0_ST_CURRENT	1	/* Write current status */
+#define DSCR_CMD0_ST_CMD0	2	/* Write cmd0 with V cleared */
+#define DSCR_CMD0_ST_BYTECNT	3	/* Write remaining byte count */
+
+#define DSCR_CMD0_ST(x)		(((x) & 0x3) << 0)
+
+/* Descriptor Command 1
+*/
+#define DSCR_CMD1_SUPTR_MASK	(0xf << 28)	/* upper 4 bits of src addr */
+#define DSCR_CMD1_DUPTR_MASK	(0xf << 24)	/* upper 4 bits of dest addr */
+#define DSCR_CMD1_FL_MASK	(0x3 << 22)	/* Flag bits */
+#define DSCR_CMD1_BC_MASK	(0x3fffff)	/* Byte count */
+
+/* Flag description.
+*/
+#define DSCR_CMD1_FL_MEM_STRIDE0	0
+#define DSCR_CMD1_FL_MEM_STRIDE1	1
+#define DSCR_CMD1_FL_MEM_STRIDE2	2
+
+#define DSCR_CMD1_FL(x)		(((x) & 0x3) << 22)
+
+/* Source1, 1-dimensional stride.
+*/
+#define DSCR_SRC1_STS_MASK	(3 << 30)	/* Src xfer size */
+#define DSCR_SRC1_SAM_MASK	(3 << 28)	/* Src xfer movement */
+#define DSCR_SRC1_SB_MASK	(0x3fff << 14)	/* Block size */
+#define DSCR_SRC1_SB(x)		(((x) & 0x3fff) << 14)
+#define DSCR_SRC1_SS_MASK	(0x3fff << 0)	/* Stride */
+#define DSCR_SRC1_SS(x)		(((x) & 0x3fff) << 0)
+
+/* Dest1, 1-dimensional stride.
+*/
+#define DSCR_DEST1_DTS_MASK	(3 << 30)	/* Dest xfer size */
+#define DSCR_DEST1_DAM_MASK	(3 << 28)	/* Dest xfer movement */
+#define DSCR_DEST1_DB_MASK	(0x3fff << 14)	/* Block size */
+#define DSCR_DEST1_DB(x)	(((x) & 0x3fff) << 14)
+#define DSCR_DEST1_DS_MASK	(0x3fff << 0)	/* Stride */
+#define DSCR_DEST1_DS(x)	(((x) & 0x3fff) << 0)
+
+#define DSCR_xTS_SIZE1		0
+#define DSCR_xTS_SIZE2		1
+#define DSCR_xTS_SIZE4		2
+#define DSCR_xTS_SIZE8		3
+#define DSCR_SRC1_STS(x)	(((x) & 3) << 30)
+#define DSCR_DEST1_DTS(x)	(((x) & 3) << 30)
+
+#define DSCR_xAM_INCREMENT	0
+#define DSCR_xAM_DECREMENT	1
+#define DSCR_xAM_STATIC		2
+#define DSCR_xAM_BURST		3
+#define DSCR_SRC1_SAM(x)	(((x) & 3) << 28)
+#define DSCR_DEST1_DAM(x)	(((x) & 3) << 28)
+
+/* The next descriptor pointer.
+*/
+#define DSCR_NXTPTR_MASK	(0x07ffffff)
+#define DSCR_NXTPTR(x)		((x) >> 5)
+#define DSCR_GET_NXTPTR(x)	((x) << 5)
+#define DSCR_NXTPTR_MS		(1 << 27)
+
+/* The number of DBDMA channels.
+*/
+#define NUM_DBDMA_CHANS	16
+
+/* External functions for drivers to use.
+*/
+/* Use this to allocate a dbdma channel.  The device ids are one of the
+ * DSCR_CMD0 devices IDs, which is usually redefined to a more
+ * meaningful name.  The 'callback' is called during dma completion
+ * interrupt.
+ */
+u32 au1xxx_dbdma_chan_alloc(u32 srcid, u32 destid,
+       void (*callback)(int, void *, struct pt_regs *), void *callparam);
+
+#define DBDMA_MEM_CHAN	DSCR_CMD0_ALWAYS
+
+/* ACK!  These should be in a board specific description file.
+*/
+#ifdef CONFIG_MIPS_PB1550
+#define DBDMA_AC97_TX_CHAN DSCR_CMD0_PSC1_TX
+#define DBDMA_AC97_RX_CHAN DSCR_CMD0_PSC1_RX
+#endif
+#ifdef CONFIG_MIPS_DB1550
+#define DBDMA_AC97_TX_CHAN DSCR_CMD0_PSC1_TX
+#define DBDMA_AC97_RX_CHAN DSCR_CMD0_PSC1_RX
+#endif
+
+
+/* Set the device width of a in/out fifo.
+*/
+u32 au1xxx_dbdma_set_devwidth(u32 chanid, int bits);
+
+/* Allocate a ring of descriptors for dbdma.
+*/
+u32 au1xxx_dbdma_ring_alloc(u32 chanid, int entries);
+
+/* Put buffers on source/destination descriptors.
+*/
+u32 au1xxx_dbdma_put_source(u32 chanid, void *buf, int nbytes);
+u32 au1xxx_dbdma_put_dest(u32 chanid, void *buf, int nbytes);
+
+/* Get a buffer from the destination descriptor.
+*/
+u32 au1xxx_dbdma_get_dest(u32 chanid, void **buf, int *nbytes);
+
+void au1xxx_dbdma_stop(u32 chanid);
+void au1xxx_dbdma_start(u32 chanid);
+void au1xxx_dbdma_reset(u32 chanid);
+u32 au1xxx_get_dma_residue(u32 chanid);
+
+void au1xxx_dbdma_chan_free(u32 chanid);
+void au1xxx_dbdma_dump(u32 chanid);
+
+#endif /* _LANGUAGE_ASSEMBLY */
+#endif /* _AU1000_DBDMA_H_ */
--- diff/include/asm-mips/mach-au1x00/au1xxx_psc.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-mips/mach-au1x00/au1xxx_psc.h	2004-04-21 10:45:35.877249328 +0100
@@ -0,0 +1,211 @@
+/*
+ *
+ * BRIEF MODULE DESCRIPTION
+ *	Include file for Alchemy Semiconductor's Au1k CPU.
+ *
+ * Copyright 2004 Embedded Edge, LLC
+ *	dan@embeddededge.com
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/* Specifics for the Au1xxx Programmable Serial Controllers, first
+ * seen in the AU1550 part.
+ */
+#ifndef _AU1000_PSC_H_
+#define _AU1000_PSC_H_
+
+/* The PSC base addresses.
+*/
+#define PSC_BASE0		0xb1a00000
+#define PSC_BASE1		0xb1b00000
+#define PSC_BASE2		0xb0a00000
+#define PSC_BASE3		0xb0d00000
+
+/* These should be defined in a board specific file!
+*/
+#ifdef CONFIG_MIPS_PB1550
+#define SPI_PSC_BASE		PSC_BASE0
+#define AC97_PSC_BASE		PSC_BASE1
+#define SMBUS_PSC_BASE		PSC_BASE2
+#endif
+#ifdef CONFIG_MIPS_DB1550
+#define SPI_PSC_BASE		PSC_BASE0
+#define AC97_PSC_BASE		PSC_BASE1
+#define SMBUS_PSC_BASE		PSC_BASE2
+#endif
+
+
+/* The PSC select and control registers are common to
+ * all protocols.
+ */
+#define PSC_SEL_OFFSET		0x00000000
+#define PSC_CTRL_OFFSET		0x00000004
+
+#define PSC_SEL_CLK_MASK	(3 << 4)
+#define PSC_SEL_CLK_INTCLK	(0 << 4)
+#define PSC_SEL_CLK_EXTCLK	(1 << 4)
+#define PSC_SEL_CLK_SERCLK	(2 << 4)
+
+#define PSC_SEL_PS_MASK		0x00000007
+#define PSC_SEL_PS_DISABLED	(0)
+#define PSC_SEL_PS_SPIMODE	(2)
+#define PSC_SEL_PS_I2SMODE	(3)
+#define PSC_SEL_PS_AC97MODE	(4)
+#define PSC_SEL_PS_SMBUSMODE	(5)
+
+#define PSC_CTRL_DISABLE	(0)
+#define PSC_CTRL_SUSPEND	(2)
+#define PSC_CTRL_ENABLE		(3)
+
+/* AC97 Registers.
+*/
+#define PSC_AC97CFG_OFFSET	0x00000008
+#define PSC_AC97MSK_OFFSET	0x0000000c
+#define PSC_AC97PCR_OFFSET	0x00000010
+#define PSC_AC97STAT_OFFSET	0x00000014
+#define PSC_AC97EVNT_OFFSET	0x00000018
+#define PSC_AC97TXRX_OFFSET	0x0000001c
+#define PSC_AC97CDC_OFFSET	0x00000020
+#define PSC_AC97RST_OFFSET	0x00000024
+#define PSC_AC97GPO_OFFSET	0x00000028
+#define PSC_AC97GPI_OFFSET	0x0000002c
+
+#define AC97_PSC_SEL		(AC97_PSC_BASE + PSC_SEL_OFFSET)
+#define AC97_PSC_CTRL		(AC97_PSC_BASE + PSC_CTRL_OFFSET)
+#define PSC_AC97CFG		(AC97_PSC_BASE + PSC_AC97CFG_OFFSET)
+#define PSC_AC97MSK		(AC97_PSC_BASE + PSC_AC97MSK_OFFSET)
+#define PSC_AC97PCR		(AC97_PSC_BASE + PSC_AC97PCR_OFFSET)
+#define PSC_AC97STAT		(AC97_PSC_BASE + PSC_AC97STAT_OFFSET)
+#define PSC_AC97EVNT		(AC97_PSC_BASE + PSC_AC97EVNT_OFFSET)
+#define PSC_AC97TXRX		(AC97_PSC_BASE + PSC_AC97TXRX_OFFSET)
+#define PSC_AC97CDC		(AC97_PSC_BASE + PSC_AC97CDC_OFFSET)
+#define PSC_AC97RST		(AC97_PSC_BASE + PSC_AC97RST_OFFSET)
+#define PSC_AC97GPO		(AC97_PSC_BASE + PSC_AC97GPO_OFFSET)
+#define PSC_AC97GPI		(AC97_PSC_BASE + PSC_AC97GPI_OFFSET)
+
+/* AC97 Config Register.
+*/
+#define PSC_AC97CFG_RT_MASK	(3 << 30)
+#define PSC_AC97CFG_RT_FIFO1	(0 << 30)
+#define PSC_AC97CFG_RT_FIFO2	(1 << 30)
+#define PSC_AC97CFG_RT_FIFO4	(2 << 30)
+#define PSC_AC97CFG_RT_FIFO8	(3 << 30)
+
+#define PSC_AC97CFG_TT_MASK	(3 << 28)
+#define PSC_AC97CFG_TT_FIFO1	(0 << 28)
+#define PSC_AC97CFG_TT_FIFO2	(1 << 28)
+#define PSC_AC97CFG_TT_FIFO4	(2 << 28)
+#define PSC_AC97CFG_TT_FIFO8	(3 << 28)
+
+#define PSC_AC97CFG_DD_DISABLE	(1 << 27)
+#define PSC_AC97CFG_DE_ENABLE	(1 << 26)
+#define PSC_AC97CFG_SE_ENABLE	(1 << 25)
+
+#define PSC_AC97CFG_LEN_MASK	(0xf << 21)
+#define PSC_AC97CFG_TXSLOT_MASK	(0x3ff << 11)
+#define PSC_AC97CFG_RXSLOT_MASK	(0x3ff << 1)
+#define PSC_AC97CFG_GE_ENABLE	(1)
+
+/* Enable slots 3-12.
+*/
+#define PSC_AC97CFG_TXSLOT_ENA(x)	(1 << (((x) - 3) + 11))
+#define PSC_AC97CFG_RXSLOT_ENA(x)	(1 << (((x) - 3) + 1))
+
+/* The word length equation is ((x) * 2) + 2, so choose 'x' appropriately.
+ * The only sensible numbers are 7, 9, or possibly 11.  Nah, just do the
+ * arithmetic in the macro.
+ */
+#define PSC_AC97CFG_SET_LEN(x)	(((((x)-2)/2) & 0xf) << 21)
+#define PSC_AC97CFG_GET_LEN(x)	(((((x) >> 21) & 0xf) * 2) + 2)
+
+/* AC97 Mask Register.
+*/
+#define PSC_AC97MSK_GR		(1 << 25)
+#define PSC_AC97MSK_CD		(1 << 24)
+#define PSC_AC97MSK_RR		(1 << 13)
+#define PSC_AC97MSK_RO		(1 << 12)
+#define PSC_AC97MSK_RU		(1 << 11)
+#define PSC_AC97MSK_TR		(1 << 10)
+#define PSC_AC97MSK_TO		(1 << 9)
+#define PSC_AC97MSK_TU		(1 << 8)
+#define PSC_AC97MSK_RD		(1 << 5)
+#define PSC_AC97MSK_TD		(1 << 4)
+#define PSC_AC97MSK_ALLMASK	(PSC_AC97MSK_GR | PSC_AC97MSK_CD | \
+				 PSC_AC97MSK_RR | PSC_AC97MSK_RO | \
+				 PSC_AC97MSK_RU | PSC_AC97MSK_TR | \
+				 PSC_AC97MSK_TO | PSC_AC97MSK_TU | \
+				 PSC_AC97MSK_RD | PSC_AC97MSK_TD)
+
+/* AC97 Protocol Control Register.
+*/
+#define PSC_AC97PCR_RC		(1 << 6)
+#define PSC_AC97PCR_RP		(1 << 5)
+#define PSC_AC97PCR_RS		(1 << 4)
+#define PSC_AC97PCR_TC		(1 << 2)
+#define PSC_AC97PCR_TP		(1 << 1)
+#define PSC_AC97PCR_TS		(1 << 0)
+
+/* AC97 Status register (read only).
+*/
+#define PSC_AC97STAT_CB		(1 << 26)
+#define PSC_AC97STAT_CP		(1 << 25)
+#define PSC_AC97STAT_CR		(1 << 24)
+#define PSC_AC97STAT_RF		(1 << 13)
+#define PSC_AC97STAT_RE		(1 << 12)
+#define PSC_AC97STAT_RR		(1 << 11)
+#define PSC_AC97STAT_TF		(1 << 10)
+#define PSC_AC97STAT_TE		(1 << 9)
+#define PSC_AC97STAT_TR		(1 << 8)
+#define PSC_AC97STAT_RB		(1 << 5)
+#define PSC_AC97STAT_TB		(1 << 4)
+#define PSC_AC97STAT_DI		(1 << 2)
+#define PSC_AC97STAT_DR		(1 << 1)
+#define PSC_AC97STAT_SR		(1 << 0)
+
+/* AC97 Event Register.
+*/
+#define PSC_AC97EVNT_GR		(1 << 25)
+#define PSC_AC97EVNT_CD		(1 << 24)
+#define PSC_AC97EVNT_RR		(1 << 13)
+#define PSC_AC97EVNT_RO		(1 << 12)
+#define PSC_AC97EVNT_RU		(1 << 11)
+#define PSC_AC97EVNT_TR		(1 << 10)
+#define PSC_AC97EVNT_TO		(1 << 9)
+#define PSC_AC97EVNT_TU		(1 << 8)
+#define PSC_AC97EVNT_RD		(1 << 5)
+#define PSC_AC97EVNT_TD		(1 << 4)
+
+/* CODEC Command Register.
+*/
+#define PSC_AC97CDC_RD		(1 << 25)
+#define PSC_AC97CDC_ID_MASK	(3 << 23)
+#define PSC_AC97CDC_INDX_MASK	(0x7f << 16)
+#define PSC_AC97CDC_ID(x)	(((x) & 0x3) << 23)
+#define PSC_AC97CDC_INDX(x)	(((x) & 0x7f) << 16)
+
+/* AC97 Reset Control Register.
+*/
+#define PSC_AC97RST_RST		(1 << 1)
+#define PSC_AC97RST_SNC		(1 << 0)
+
+
+#endif /* _AU1000_PSC_H_ */
--- diff/include/asm-mips/mach-generic/topology.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-mips/mach-generic/topology.h	2004-04-21 10:45:35.879249024 +0100
@@ -0,0 +1 @@
+#include <asm-generic/topology.h>
--- diff/include/asm-mips/mach-ip27/topology.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-mips/mach-ip27/topology.h	2004-04-21 10:45:35.880248872 +0100
@@ -0,0 +1,18 @@
+#ifndef _ASM_MACH_TOPOLOGY_H
+#define _ASM_MACH_TOPOLOGY_H	1
+
+#include <asm/sn/hub.h>
+
+#define cpu_to_node(cpu)	(cpu_data[(cpu)].p_nodeid)
+#define parent_node(node)	(node)
+#define node_to_cpumask(node)	(HUB_DATA(node)->h_cpus)
+#define node_to_first_cpu(node)	(first_cpu(node_to_cpumask(node)))
+#define pcibus_to_cpumask(bus)	(cpu_online_map)
+
+extern int node_distance(nasid_t nasid_a, nasid_t nasid_b);
+#define node_distance(from, to)	node_distance(from, to)
+
+/* Cross-node load balancing interval. */
+#define NODE_BALANCE_RATE	10
+
+#endif /* _ASM_MACH_TOPOLOGY_H */
--- diff/include/asm-mips/mach-ja/cpu-feature-overrides.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-mips/mach-ja/cpu-feature-overrides.h	2004-04-21 10:45:35.880248872 +0100
@@ -0,0 +1,38 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 2003, 2004 Ralf Baechle
+ */
+#ifndef __ASM_MACH_JA_CPU_FEATURE_OVERRIDES_H
+#define __ASM_MACH_JA_CPU_FEATURE_OVERRIDES_H
+
+/*
+ * Momentum Jaguar ATX always has the RM9000 processor.
+ */
+#define cpu_has_watch		1
+#define cpu_has_mips16		0
+#define cpu_has_divec		0
+#define cpu_has_vce		0
+#define cpu_has_cache_cdex_p	0
+#define cpu_has_cache_cdex_s	0
+#define cpu_has_prefetch	1
+#define cpu_has_mcheck		0
+#define cpu_has_ejtag		0
+
+#define cpu_has_llsc		1
+#define cpu_has_vtag_icache	0
+#define cpu_has_dc_aliases	0
+#define cpu_has_ic_fills_f_dc	0
+
+#define cpu_has_nofpuex		0
+#define cpu_has_64bits		1
+
+#define cpu_has_subset_pcaches	0
+
+#define cpu_dcache_line_size()	32
+#define cpu_icache_line_size()	32
+#define cpu_scache_line_size()	32
+
+#endif /* __ASM_MACH_JA_CPU_FEATURE_OVERRIDES_H */
--- diff/include/asm-mips/mach-ja/spaces.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-mips/mach-ja/spaces.h	2004-04-21 10:45:35.881248720 +0100
@@ -0,0 +1,20 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 1994 - 1999, 2000, 03, 04 Ralf Baechle
+ * Copyright (C) 2000, 2002  Maciej W. Rozycki
+ * Copyright (C) 1990, 1999, 2000 Silicon Graphics, Inc.
+ */
+#ifndef __ASM_MACH_JA_SPACES_H
+#define __ASM_MACH_JA_SPACES_H
+
+/*
+ * Memory above this physical address will be considered highmem.
+ */
+#define HIGHMEM_START		0x08000000UL
+
+#include_next <spaces.h>
+
+#endif /* __ASM_MACH_JA_SPACES_H */
--- diff/include/asm-mips/mach-pb1x00/pb1550.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-mips/mach-pb1x00/pb1550.h	2004-04-21 10:45:35.882248568 +0100
@@ -0,0 +1,157 @@
+/*
+ * AMD Alchemy Semi PB1550 Referrence Board
+ * Board Registers defines.
+ *
+ * Copyright 2004 Embedded Edge LLC.
+ *
+ * ########################################################################
+ *
+ *  This program is free software; you can distribute it and/or modify it
+ *  under the terms of the GNU General Public License (Version 2) as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope it will be useful, but WITHOUT
+ *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ *  for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ *
+ * ########################################################################
+ *
+ *
+ */
+#ifndef __ASM_PB1550_H
+#define __ASM_PB1550_H
+
+#include <linux/types.h>
+
+#define BCSR_PHYS_ADDR 0xAF000000
+
+typedef volatile struct
+{
+	/*00*/	u16 whoami;
+		u16 reserved0;
+	/*04*/	u16 status;
+		u16 reserved1;
+	/*08*/	u16 switches;
+		u16 reserved2;
+	/*0C*/	u16 resets;
+		u16 reserved3;
+	/*10*/	u16 pcmcia;
+		u16 reserved4;
+	/*14*/	u16 pci;
+		u16 reserved5;
+	/*18*/	u16 leds;
+		u16 reserved6;
+	/*1C*/	u16 system;
+		u16 reserved7;
+
+} BCSR;
+
+static BCSR * const bcsr = (BCSR *)BCSR_PHYS_ADDR;
+
+/*
+ * Register bit definitions for the BCSRs
+ */
+#define BCSR_WHOAMI_DCID	0x000F
+#define BCSR_WHOAMI_CPLD	0x00F0
+#define BCSR_WHOAMI_BOARD	0x0F00
+
+#define BCSR_STATUS_PCMCIA0VS	0x0003
+#define BCSR_STATUS_PCMCIA1VS	0x000C
+#define BCSR_STATUS_PCMCIA0FI	0x0010
+#define BCSR_STATUS_PCMCIA1FI	0x0020
+#define BCSR_STATUS_SWAPBOOT	0x0040
+#define BCSR_STATUS_SRAMWIDTH	0x0080
+#define BCSR_STATUS_FLASHBUSY	0x0100
+#define BCSR_STATUS_ROMBUSY	0x0200
+#define BCSR_STATUS_USBOTGID	0x0800
+#define BCSR_STATUS_U0RXD	0x1000
+#define BCSR_STATUS_U1RXD	0x2000
+#define BCSR_STATUS_U3RXD	0x8000
+
+#define BCSR_SWITCHES_OCTAL	0x00FF
+#define BCSR_SWITCHES_DIP_1	0x0080
+#define BCSR_SWITCHES_DIP_2	0x0040
+#define BCSR_SWITCHES_DIP_3	0x0020
+#define BCSR_SWITCHES_DIP_4	0x0010
+#define BCSR_SWITCHES_DIP_5	0x0008
+#define BCSR_SWITCHES_DIP_6	0x0004
+#define BCSR_SWITCHES_DIP_7	0x0002
+#define BCSR_SWITCHES_DIP_8	0x0001
+#define BCSR_SWITCHES_ROTARY	0x0F00
+
+#define BCSR_RESETS_PHY0	0x0001
+#define BCSR_RESETS_PHY1	0x0002
+#define BCSR_RESETS_DC		0x0004
+#define BCSR_RESETS_WSC		0x2000
+#define BCSR_RESETS_SPISEL	0x4000
+#define BCSR_RESETS_DMAREQ	0x8000
+
+#define BCSR_PCMCIA_PC0VPP	0x0003
+#define BCSR_PCMCIA_PC0VCC	0x000C
+#define BCSR_PCMCIA_PC0DRVEN	0x0010
+#define BCSR_PCMCIA_PC0RST	0x0080
+#define BCSR_PCMCIA_PC1VPP	0x0300
+#define BCSR_PCMCIA_PC1VCC	0x0C00
+#define BCSR_PCMCIA_PC1DRVEN	0x1000
+#define BCSR_PCMCIA_PC1RST	0x8000
+
+#define BCSR_PCI_M66EN		0x0001
+#define BCSR_PCI_M33		0x0100
+#define BCSR_PCI_EXTERNARB	0x0200
+#define BCSR_PCI_GPIO200RST	0x0400
+#define BCSR_PCI_CLKOUT		0x0800
+#define BCSR_PCI_CFGHOST	0x1000
+
+#define BCSR_LEDS_DECIMALS	0x00FF
+#define BCSR_LEDS_LED0		0x0100
+#define BCSR_LEDS_LED1		0x0200
+#define BCSR_LEDS_LED2		0x0400
+#define BCSR_LEDS_LED3		0x0800
+
+#define BCSR_SYSTEM_VDDI	0x001F
+#define BCSR_SYSTEM_POWEROFF	0x4000
+#define BCSR_SYSTEM_RESET	0x8000
+
+#define PCMCIA_MAX_SOCK 1
+#define PCMCIA_NUM_SOCKS (PCMCIA_MAX_SOCK+1)
+
+/* VPP/VCC */
+#define SET_VCC_VPP(VCC, VPP, SLOT)\
+	((((VCC)<<2) | ((VPP)<<0)) << ((SLOT)*8))
+
+#if defined(CONFIG_MTD_PB1550_BOOT) && defined(CONFIG_MTD_PB1550_USER)
+#define PB1550_BOTH_BANKS
+#elif defined(CONFIG_MTD_PB1550_BOOT) && !defined(CONFIG_MTD_PB1550_USER)
+#define PB1550_BOOT_ONLY
+#elif !defined(CONFIG_MTD_PB1550_BOOT) && defined(CONFIG_MTD_PB1550_USER)
+#define PB1550_USER_ONLY
+#endif
+
+/* Timing values as described in databook, * ns value stripped of
+ * lower 2 bits.
+ * These defines are here rather than an SOC1550 generic file because
+ * the parts chosen on another board may be different and may require
+ * different timings.
+ */
+#define NAND_T_H			(18 >> 2)
+#define NAND_T_PUL			(30 >> 2)
+#define NAND_T_SU			(30 >> 2)
+#define NAND_T_WH			(30 >> 2)
+
+/* Bitfield shift amounts */
+#define NAND_T_H_SHIFT		0
+#define NAND_T_PUL_SHIFT	4
+#define NAND_T_SU_SHIFT		8
+#define NAND_T_WH_SHIFT		12
+
+#define NAND_TIMING	((NAND_T_H   & 0xF)	<< NAND_T_H_SHIFT)   | \
+			((NAND_T_PUL & 0xF)	<< NAND_T_PUL_SHIFT) | \
+			((NAND_T_SU  & 0xF)	<< NAND_T_SU_SHIFT)  | \
+			((NAND_T_WH  & 0xF)	<< NAND_T_WH_SHIFT)
+
+#endif /* __ASM_PB1550_H */
--- diff/include/asm-s390/qeth.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-s390/qeth.h	2004-04-21 10:45:35.910244312 +0100
@@ -0,0 +1,60 @@
+/*
+ * include/asm-s390/qeth.h
+ *
+ * ioctl definitions for qeth driver
+ *
+ * Copyright (C) 2004 IBM Corporation
+ *
+ * Author(s):	Thomas Spatzier <tspat@de.ibm.com>
+ *
+ */
+#ifndef __ASM_S390_IOCTL_H__
+#define __ASM_S390_IOCTL_H__
+#include <linux/ioctl.h>
+
+#define QETH_IOCTL_LETTER 'Q'
+
+#define SIOC_QETH_ARP_SET_NO_ENTRIES	_IOWR(QETH_IOCTL_LETTER, 1, int)
+#define SIOC_QETH_ARP_QUERY_INFO	_IOWR(QETH_IOCTL_LETTER, 2, int)
+#define SIOC_QETH_ARP_ADD_ENTRY		_IOWR(QETH_IOCTL_LETTER, 3, int)
+#define SIOC_QETH_ARP_REMOVE_ENTRY	_IOWR(QETH_IOCTL_LETTER, 4, int)
+#define SIOC_QETH_ARP_FLUSH_CACHE	_IOWR(QETH_IOCTL_LETTER, 5, int)
+#define SIOC_QETH_ADP_SET_SNMP_CONTROL	_IOWR(QETH_IOCTL_LETTER, 6, int)
+#define SIOC_QETH_GET_CARD_TYPE		_IOWR(QETH_IOCTL_LETTER, 7, int)
+
+struct qeth_arp_cache_entry {
+	__u8  macaddr[6];
+	__u8  reserved1[2];
+	__u8  ipaddr[16]; /* for both  IPv4 and IPv6 */
+	__u8  reserved2[32];
+} __attribute__ ((packed));
+
+struct qeth_arp_qi_entry7 {
+	__u8 media_specific[32];
+	__u8 macaddr_type;
+	__u8 ipaddr_type;
+	__u8 macaddr[6];
+	__u8 ipaddr[4];
+} __attribute__((packed));
+
+struct qeth_arp_qi_entry5 {
+	__u8 media_specific[32];
+	__u8 macaddr_type;
+	__u8 ipaddr_type;
+	__u8 ipaddr[4];
+} __attribute__((packed));
+
+/* data sent to user space as result of query arp ioctl */
+#define QETH_QARP_USER_DATA_SIZE 20000
+#define QETH_QARP_MASK_OFFSET    4
+#define QETH_QARP_ENTRIES_OFFSET 6
+struct qeth_arp_query_user_data {
+	union {
+		__u32 data_len;		/* set by user space program */
+		__u32 no_entries;	/* set by kernel */
+	} u;
+	__u16 mask_bits;
+	char *entries;
+} __attribute__((packed));
+
+#endif /* __ASM_S390_IOCTL_H__ */
--- diff/include/asm-x86_64/msi.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/asm-x86_64/msi.h	2004-04-21 10:45:35.921242640 +0100
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2003-2004 Intel
+ * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
+ */
+
+#ifndef ASM_MSI_H
+#define ASM_MSI_H
+
+#include <asm/desc.h>
+
+#define LAST_DEVICE_VECTOR		232
+#define MSI_DEST_MODE			MSI_LOGICAL_MODE
+#define MSI_TARGET_CPU_SHIFT		12
+
+#ifdef CONFIG_SMP
+#define MSI_TARGET_CPU		logical_smp_processor_id()
+#else
+#define MSI_TARGET_CPU		TARGET_CPUS
+#endif
+
+#endif /* ASM_MSI_H */
--- diff/include/linux/audit.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/linux/audit.h	2004-04-21 10:45:35.926241880 +0100
@@ -0,0 +1,211 @@
+/* audit.h -- Auditing support -*- linux-c -*-
+ *
+ * Copyright 2003-2004 Red Hat Inc., Durham, North Carolina.
+ * All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Written by Rickard E. (Rik) Faith <faith@redhat.com>
+ *
+ */
+
+#ifndef _LINUX_AUDIT_H_
+#define _LINUX_AUDIT_H_
+
+/* Request and reply types */
+#define AUDIT_GET      1000	/* Get status */
+#define AUDIT_SET      1001	/* Set status (enable/disable/auditd) */
+#define AUDIT_LIST     1002	/* List filtering rules */
+#define AUDIT_ADD      1003	/* Add filtering rule */
+#define AUDIT_DEL      1004	/* Delete filtering rule */
+#define AUDIT_USER     1005	/* Send a message from user-space */
+#define AUDIT_LOGIN    1006     /* Define the login id and informaiton */
+#define AUDIT_KERNEL   2000	/* Asynchronous audit record. NOT A REQUEST. */
+
+/* Rule flags */
+#define AUDIT_PER_TASK 0x01	/* Apply rule at task creation (not syscall) */
+#define AUDIT_AT_ENTRY 0x02	/* Apply rule at syscall entry */
+#define AUDIT_AT_EXIT  0x04	/* Apply rule at syscall exit */
+#define AUDIT_PREPEND  0x10	/* Prepend to front of list */
+
+/* Rule actions */
+#define AUDIT_NEVER    0	/* Do not build context if rule matches */
+#define AUDIT_POSSIBLE 1	/* Build context if rule matches  */
+#define AUDIT_ALWAYS   2	/* Generate audit record if rule matches */
+
+/* Rule structure sizes -- if these change, different AUDIT_ADD and
+ * AUDIT_LIST commands must be implemented. */
+#define AUDIT_MAX_FIELDS   64
+#define AUDIT_BITMASK_SIZE 64
+#define AUDIT_WORD(nr) ((__u32)((nr)/32))
+#define AUDIT_BIT(nr)  (1 << ((nr) - AUDIT_WORD(nr)*32))
+
+/* Rule fields */
+				/* These are useful when checking the
+				 * task structure at task creation time
+				 * (AUDIT_PER_TASK).  */
+#define AUDIT_PID	0
+#define AUDIT_UID	1
+#define AUDIT_EUID	2
+#define AUDIT_SUID	3
+#define AUDIT_FSUID	4
+#define AUDIT_GID	5
+#define AUDIT_EGID	6
+#define AUDIT_SGID	7
+#define AUDIT_FSGID	8
+#define AUDIT_LOGINUID	9
+#define AUDIT_PERS	10
+
+				/* These are ONLY useful when checking
+				 * at syscall exit time (AUDIT_AT_EXIT). */
+#define AUDIT_DEVMAJOR	100
+#define AUDIT_DEVMINOR	101
+#define AUDIT_INODE	102
+#define AUDIT_EXIT	103
+#define AUDIT_SUCCESS   104	/* exit >= 0; value ignored */
+
+#define AUDIT_ARG0      200
+#define AUDIT_ARG1      (AUDIT_ARG0+1)
+#define AUDIT_ARG2      (AUDIT_ARG0+2)
+#define AUDIT_ARG3      (AUDIT_ARG0+3)
+
+#define AUDIT_NEGATE    0x80000000
+
+
+/* Status symbols */
+				/* Mask values */
+#define AUDIT_STATUS_ENABLED		0x0001
+#define AUDIT_STATUS_FAILURE		0x0002
+#define AUDIT_STATUS_PID		0x0004
+#define AUDIT_STATUS_RATE_LIMIT		0x0008
+#define AUDIT_STATUS_BACKLOG_LIMIT	0x0010
+				/* Failure-to-log actions */
+#define AUDIT_FAIL_SILENT	0
+#define AUDIT_FAIL_PRINTK	1
+#define AUDIT_FAIL_PANIC	2
+
+#ifndef __KERNEL__
+struct audit_message {
+	struct nlmsghdr nlh;
+	char		data[1200];
+};
+#endif
+
+struct audit_status {
+	__u32		mask;		/* Bit mask for valid entries */
+	__u32		enabled;	/* 1 = enabled, 0 = disbaled */
+	__u32		failure;	/* Failure-to-log action */
+	__u32		pid;		/* pid of auditd process */
+	__u32		rate_limit;	/* messages rate limit (per second) */
+	__u32		backlog_limit;	/* waiting messages limit */
+	__u32		lost;		/* messages lost */
+	__u32		backlog;	/* messages waiting in queue */
+};
+
+struct audit_login {
+	__u32		loginuid;
+	int		msglen;
+	char		msg[1024];
+};
+
+struct audit_rule {		/* for AUDIT_LIST, AUDIT_ADD, and AUDIT_DEL */
+	__u32		flags;	/* AUDIT_PER_{TASK,CALL}, AUDIT_PREPEND */
+	__u32		action;	/* AUDIT_NEVER, AUDIT_POSSIBLE, AUDIT_ALWAYS */
+	__u32		field_count;
+	__u32		mask[AUDIT_BITMASK_SIZE];
+	__u32		fields[AUDIT_MAX_FIELDS];
+	__u32		values[AUDIT_MAX_FIELDS];
+};
+
+#ifdef __KERNEL__
+
+#ifdef CONFIG_AUDIT
+struct audit_buffer;
+struct audit_context;
+#endif
+
+#ifdef CONFIG_AUDITSYSCALL
+/* These are defined in auditsc.c */
+				/* Public API */
+extern int  audit_alloc(struct task_struct *task);
+extern void audit_free(struct task_struct *task);
+extern void audit_syscall_entry(struct task_struct *task,
+				int major, unsigned long a0, unsigned long a1,
+				unsigned long a2, unsigned long a3);
+extern void audit_syscall_exit(struct task_struct *task, int return_code);
+extern void audit_getname(const char *name);
+extern void audit_putname(const char *name);
+extern void audit_inode(const char *name, unsigned long ino, dev_t rdev);
+
+				/* Private API (for audit.c only) */
+extern int  audit_receive_filter(int type, int pid, int uid, int seq,
+				 void *data);
+extern void audit_get_stamp(struct audit_context *ctx,
+			    struct timespec *t, int *serial);
+extern int  audit_set_loginuid(struct audit_context *ctx, uid_t loginuid);
+#else
+#define audit_alloc(t) ({ 0; })
+#define audit_free(t) do { ; } while (0)
+#define audit_syscall_entry(t,a,b,c,d,e) do { ; } while (0)
+#define audit_syscall_exit(t,r) do { ; } while (0)
+#define audit_getname(n) do { ; } while (0)
+#define audit_putname(n) do { ; } while (0)
+#define audit_inode(n,i,d) do { ; } while (0)
+#endif
+
+#ifdef CONFIG_AUDIT
+/* These are defined in audit.c */
+				/* Public API */
+extern void		    audit_log(struct audit_context *ctx,
+				      const char *fmt, ...)
+			    __attribute__((format(printf,2,3)));
+
+extern struct audit_buffer *audit_log_start(struct audit_context *ctx);
+extern void		    audit_log_format(struct audit_buffer *ab,
+					     const char *fmt, ...)
+			    __attribute__((format(printf,2,3)));
+extern void		    audit_log_end(struct audit_buffer *ab);
+extern void		    audit_log_end_fast(struct audit_buffer *ab);
+extern void		    audit_log_end_irq(struct audit_buffer *ab);
+extern void		    audit_log_d_path(struct audit_buffer *ab,
+					     const char *prefix,
+					     struct dentry *dentry,
+					     struct vfsmount *vfsmnt);
+extern int		    audit_set_rate_limit(int limit);
+extern int		    audit_set_backlog_limit(int limit);
+extern int		    audit_set_enabled(int state);
+extern int		    audit_set_failure(int state);
+
+				/* Private API (for auditsc.c only) */
+extern void		    audit_send_reply(int pid, int seq, int type,
+					     int done, int multi,
+					     void *payload, int size);
+extern void		    audit_log_lost(const char *message);
+#else
+#define audit_log(t,f,...) do { ; } while (0)
+#define audit_log_start(t) ({ NULL; })
+#define audit_log_vformat(b,f,a) do { ; } while (0)
+#define audit_log_format(b,f,...) do { ; } while (0)
+#define audit_log_end(b) do { ; } while (0)
+#define audit_log_end_fast(b) do { ; } while (0)
+#define audit_log_end_irq(b) do { ; } while (0)
+#define audit_log_d_path(b,p,d,v) do { ; } while (0)
+#define audit_set_rate_limit(l) do { ; } while (0)
+#define audit_set_backlog_limit(l) do { ; } while (0)
+#define audit_set_enabled(s) do { ; } while (0)
+#define audit_set_failure(s) do { ; } while (0)
+#endif
+#endif
+#endif
--- diff/include/linux/mqueue.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/linux/mqueue.h	2004-04-21 10:45:35.947238688 +0100
@@ -0,0 +1,53 @@
+/* Copyright (C) 2003 Krzysztof Benedyczak & Michal Wronski
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   It is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this software; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef _LINUX_MQUEUE_H
+#define _LINUX_MQUEUE_H
+
+#include <linux/types.h>
+
+#define MQ_PRIO_MAX 	32768
+
+struct mq_attr {
+	long	mq_flags;	/* message queue flags			*/
+	long	mq_maxmsg;	/* maximum number of messages		*/
+	long	mq_msgsize;	/* maximum message size			*/
+	long	mq_curmsgs;	/* number of messages currently queued	*/
+	long	__reserved[4];	/* ignored for input, zeroed for output */
+};
+
+/*
+ * SIGEV_THREAD implementation:
+ * SIGEV_THREAD must be implemented in user space. If SIGEV_THREAD is passed
+ * to mq_notify, then
+ * - sigev_signo must be the file descriptor of an AF_NETLINK socket. It's not
+ *   necessary that the socket is bound.
+ * - sigev_value.sival_ptr must point to a cookie that is NOTIFY_COOKIE_LEN
+ *   bytes long.
+ * If the notification is triggered, then the cookie is sent to the netlink
+ * socket. The last byte of the cookie is replaced with the NOTIFY_?? codes:
+ * NOTIFY_WOKENUP if the notification got triggered, NOTIFY_REMOVED if it was
+ * removed, either due to a close() on the message queue fd or due to a
+ * mq_notify() that removed the notification.
+ */
+#define NOTIFY_NONE	0
+#define NOTIFY_WOKENUP	1
+#define NOTIFY_REMOVED	2
+
+#define NOTIFY_COOKIE_LEN	32
+
+#endif
--- diff/include/linux/netfilter_ipv4/ip_logging.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/linux/netfilter_ipv4/ip_logging.h	2004-04-21 10:45:35.949238384 +0100
@@ -0,0 +1,20 @@
+/* IPv4 macros for the internal logging interface. */
+#ifndef __IP_LOGGING_H
+#define __IP_LOGGING_H
+
+#ifdef __KERNEL__
+#include <linux/socket.h>
+#include <linux/netfilter_logging.h>
+
+#define nf_log_ip_packet(pskb,hooknum,in,out,fmt,args...) \
+	nf_log_packet(AF_INET,pskb,hooknum,in,out,fmt,##args)
+
+#define nf_log_ip(pfh,len,fmt,args...) \
+	nf_log(AF_INET,pfh,len,fmt,##args)
+
+#define nf_ip_log_register(logging) nf_log_register(AF_INET,logging)
+#define nf_ip_log_unregister(logging) nf_log_unregister(AF_INET,logging)
+	
+#endif /*__KERNEL__*/
+
+#endif /*__IP_LOGGING_H*/
--- diff/include/linux/netfilter_ipv6/ip6_logging.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/linux/netfilter_ipv6/ip6_logging.h	2004-04-21 10:45:35.951238080 +0100
@@ -0,0 +1,20 @@
+/* IPv6 macros for the nternal logging interface. */
+#ifndef __IP6_LOGGING_H
+#define __IP6_LOGGING_H
+
+#ifdef __KERNEL__
+#include <linux/socket.h>
+#include <linux/netfilter_logging.h>
+
+#define nf_log_ip6_packet(pskb,hooknum,in,out,fmt,args...) \
+	nf_log_packet(AF_INET6,pskb,hooknum,in,out,fmt,##args)
+
+#define nf_log_ip6(pfh,len,fmt,args...) \
+	nf_log(AF_INET6,pfh,len,fmt,##args)
+
+#define nf_ip6_log_register(logging) nf_log_register(AF_INET6,logging)
+#define nf_ip6_log_unregister(logging) nf_log_unregister(AF_INET6,logging)
+	
+#endif /*__KERNEL__*/
+
+#endif /*__IP6_LOGGING_H*/
--- diff/include/linux/netfilter_logging.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/linux/netfilter_logging.h	2004-04-21 10:45:35.951238080 +0100
@@ -0,0 +1,33 @@
+/* Internal logging interface, which relies on the real 
+   LOG target modules */
+#ifndef __LINUX_NETFILTER_LOGGING_H
+#define __LINUX_NETFILTER_LOGGING_H
+
+#ifdef __KERNEL__
+#include <asm/atomic.h>
+
+struct nf_logging_t {
+	void (*nf_log_packet)(struct sk_buff **pskb,
+			      unsigned int hooknum,
+			      const struct net_device *in,
+			      const struct net_device *out,
+			      const char *prefix);
+	void (*nf_log)(char *pfh, size_t len,
+		       const char *prefix);
+};
+
+extern void nf_log_register(int pf, const struct nf_logging_t *logging);
+extern void nf_log_unregister(int pf, const struct nf_logging_t *logging);
+
+extern void nf_log_packet(int pf,
+			  struct sk_buff **pskb,
+			  unsigned int hooknum,
+			  const struct net_device *in,
+			  const struct net_device *out,
+			  const char *fmt, ...);
+extern void nf_log(int pf,
+		   char *pfh, size_t len,
+		   const char *fmt, ...);
+#endif /*__KERNEL__*/
+
+#endif /*__LINUX_NETFILTER_LOGGING_H*/
--- diff/include/linux/rmap.h	1970-01-01 01:00:00.000000000 +0100
+++ source/include/linux/rmap.h	2004-04-21 10:45:35.966235800 +0100
@@ -0,0 +1,52 @@
+#ifndef _LINUX_RMAP_H
+#define _LINUX_RMAP_H
+/*
+ * Declarations for Reverse Mapping functions in mm/rmap.c
+ * Its structures are declared within that file.
+ */
+
+#include <linux/config.h>
+#include <linux/linkage.h>
+
+#define rmap_lock(page) \
+	bit_spin_lock(PG_maplock, (unsigned long *)&(page)->flags)
+#define rmap_unlock(page) \
+	bit_spin_unlock(PG_maplock, (unsigned long *)&(page)->flags)
+
+#ifdef CONFIG_MMU
+
+struct pte_chain;
+struct pte_chain *pte_chain_alloc(int gfp_flags);
+void __pte_chain_free(struct pte_chain *pte_chain);
+
+static inline void pte_chain_free(struct pte_chain *pte_chain)
+{
+	if (pte_chain)
+		__pte_chain_free(pte_chain);
+}
+
+struct pte_chain * fastcall
+	page_add_rmap(struct page *, pte_t *, struct pte_chain *);
+void fastcall page_remove_rmap(struct page *, pte_t *);
+
+/*
+ * Called from mm/vmscan.c to handle paging out
+ */
+int fastcall page_referenced(struct page *);
+int fastcall try_to_unmap(struct page *);
+
+#else	/* !CONFIG_MMU */
+
+#define page_referenced(page)	TestClearPageReferenced(page)
+#define try_to_unmap(page)	SWAP_FAIL
+
+#endif	/* CONFIG_MMU */
+
+/*
+ * Return values of try_to_unmap
+ */
+#define SWAP_SUCCESS	0
+#define SWAP_AGAIN	1
+#define SWAP_FAIL	2
+
+#endif	/* _LINUX_RMAP_H */
--- diff/ipc/compat_mq.c	1970-01-01 01:00:00.000000000 +0100
+++ source/ipc/compat_mq.c	2004-04-21 10:45:35.993231696 +0100
@@ -0,0 +1,196 @@
+/*
+ *  ipc/compat_mq.c
+ *    32 bit emulation for POSIX message queue system calls
+ *
+ *    Copyright (C) 2004 IBM Deutschland Entwicklung GmbH, IBM Corporation
+ *    Author: Arnd Bergmann <arnd@arndb.de>
+ */
+
+#include <linux/compat.h>
+#include <linux/fs.h>
+#include <linux/kernel.h>
+#include <linux/mqueue.h>
+#include <linux/syscalls.h>
+
+#include <asm/uaccess.h>
+
+struct compat_mq_attr {
+	compat_long_t mq_flags;      /* message queue flags		     */
+	compat_long_t mq_maxmsg;     /* maximum number of messages	     */
+	compat_long_t mq_msgsize;    /* maximum message size		     */
+	compat_long_t mq_curmsgs;    /* number of messages currently queued  */
+	compat_long_t __reserved[4]; /* ignored for input, zeroed for output */
+};
+
+static inline int get_compat_mq_attr(struct mq_attr *attr,
+			const struct compat_mq_attr __user *uattr)
+{
+	if (verify_area(VERIFY_READ, uattr, sizeof *uattr))
+		return -EFAULT;
+
+	return __get_user(attr->mq_flags, &uattr->mq_flags)
+		| __get_user(attr->mq_maxmsg, &uattr->mq_maxmsg)
+		| __get_user(attr->mq_msgsize, &uattr->mq_msgsize)
+		| __get_user(attr->mq_curmsgs, &uattr->mq_curmsgs);
+}
+
+static inline int put_compat_mq_attr(const struct mq_attr *attr,
+			struct compat_mq_attr __user *uattr)
+{
+	if (clear_user(uattr, sizeof *uattr))
+		return -EFAULT;
+
+	return __put_user(attr->mq_flags, &uattr->mq_flags)
+		| __put_user(attr->mq_maxmsg, &uattr->mq_maxmsg)
+		| __put_user(attr->mq_msgsize, &uattr->mq_msgsize)
+		| __put_user(attr->mq_curmsgs, &uattr->mq_curmsgs);
+}
+
+asmlinkage long compat_sys_mq_open(const char __user *u_name,
+			int oflag, compat_mode_t mode,
+			struct compat_mq_attr __user *u_attr)
+{
+	struct mq_attr attr;
+	mm_segment_t oldfs;
+	char *name;
+	long ret;
+
+	if ((oflag & O_CREAT) == 0 || !u_attr)
+		return sys_mq_open(u_name, oflag, mode, 0);
+
+	if (get_compat_mq_attr(&attr, u_attr))
+		return -EFAULT;
+
+	name = getname(u_name);
+	if (IS_ERR(name))
+		return PTR_ERR(name);
+
+	oldfs = get_fs();
+	set_fs(KERNEL_DS);
+	ret = sys_mq_open(name, oflag, mode, &attr);
+	set_fs(oldfs);
+
+	putname(name);
+	return ret;
+}
+
+static struct timespec __user *compat_prepare_timeout(
+			const struct compat_timespec __user *u_abs_timeout)
+{
+	struct timespec ts, __user *u_ts;
+
+	if (!u_abs_timeout)
+		return 0;
+
+	u_ts = compat_alloc_user_space(sizeof(*u_ts));
+	if (get_compat_timespec(&ts, u_abs_timeout)
+		|| copy_to_user(u_ts, &ts, sizeof(*u_ts)))
+		return ERR_PTR(-EFAULT);
+
+	return u_ts;
+}
+
+asmlinkage long compat_sys_mq_timedsend(mqd_t mqdes,
+			const char __user *u_msg_ptr,
+			size_t msg_len, unsigned int msg_prio,
+			const struct compat_timespec __user *u_abs_timeout)
+{
+	struct timespec __user *u_ts;
+
+	u_ts = compat_prepare_timeout(u_abs_timeout);
+	if (IS_ERR(u_ts))
+		return -EFAULT;
+
+	return sys_mq_timedsend(mqdes, u_msg_ptr, msg_len,
+			msg_prio, u_ts);
+}
+
+asmlinkage ssize_t compat_sys_mq_timedreceive(mqd_t mqdes,
+			char __user *u_msg_ptr,
+			size_t msg_len, unsigned int __user *u_msg_prio,
+			const struct compat_timespec __user *u_abs_timeout)
+{
+	struct timespec *u_ts;
+
+	u_ts = compat_prepare_timeout(u_abs_timeout);
+	if (IS_ERR(u_ts))
+		return -EFAULT;
+
+	return sys_mq_timedreceive(mqdes, u_msg_ptr, msg_len,
+			u_msg_prio, u_ts);
+}
+
+static int get_compat_sigevent(struct sigevent *event,
+		const struct compat_sigevent __user *u_event)
+{
+	if (verify_area(VERIFY_READ, u_event, sizeof(*u_event)))
+		return -EFAULT;
+
+	return __get_user(event->sigev_value.sival_int,
+			  &u_event->sigev_value.sival_int)
+	     | __get_user(event->sigev_signo, &u_event->sigev_signo)
+	     | __get_user(event->sigev_notify, &u_event->sigev_notify)
+	     | __get_user(event->sigev_notify_thread_id,
+			  &u_event->sigev_notify_thread_id);
+}
+
+asmlinkage long compat_sys_mq_notify(mqd_t mqdes,
+			const struct compat_sigevent __user *u_notification)
+{
+	mm_segment_t oldfs;
+	struct sigevent notification;
+	char cookie[NOTIFY_COOKIE_LEN];
+	compat_uptr_t u_cookie;
+	long ret;
+
+	if (!u_notification)
+		return sys_mq_notify(mqdes, 0);
+
+	if (get_compat_sigevent(&notification, u_notification))
+		return -EFAULT;
+
+	if (notification.sigev_notify == SIGEV_THREAD) {
+		u_cookie = (compat_uptr_t)notification.sigev_value.sival_int;
+		if (copy_from_user(cookie, compat_ptr(u_cookie),
+						NOTIFY_COOKIE_LEN)) {
+			return -EFAULT;
+		}
+		notification.sigev_value.sival_ptr = cookie;
+	}
+
+	oldfs = get_fs();
+	set_fs(KERNEL_DS);
+	ret = sys_mq_notify(mqdes, &notification);
+	set_fs(oldfs);
+
+	return ret;
+}
+
+asmlinkage long compat_sys_mq_getsetattr(mqd_t mqdes,
+			const struct compat_mq_attr __user *u_mqstat,
+			struct compat_mq_attr __user *u_omqstat)
+{
+	struct mq_attr mqstat, omqstat;
+	struct mq_attr *p_mqstat = 0, *p_omqstat = 0;
+	mm_segment_t oldfs;
+	long ret;
+
+	if (u_mqstat) {
+		p_mqstat = &mqstat;
+		if (get_compat_mq_attr(p_mqstat, u_mqstat))
+			return -EFAULT;
+	}
+
+	if (u_omqstat)
+		p_omqstat = &omqstat;
+
+	oldfs = get_fs();
+	set_fs(KERNEL_DS);
+	ret = sys_mq_getsetattr(mqdes, p_mqstat, p_omqstat);
+	set_fs(oldfs);
+
+	if (ret)
+		return ret;
+
+	return (u_omqstat) ? put_compat_mq_attr(&omqstat, u_omqstat) : 0;
+}
--- diff/ipc/mqueue.c	1970-01-01 01:00:00.000000000 +0100
+++ source/ipc/mqueue.c	2004-04-21 10:45:35.995231392 +0100
@@ -0,0 +1,1216 @@
+/*
+ * POSIX message queues filesystem for Linux.
+ *
+ * Copyright (C) 2003,2004  Krzysztof Benedyczak    (golbi@mat.uni.torun.pl)
+ *                          Michal Wronski          (wrona@mat.uni.torun.pl)
+ *
+ * Spinlocks:               Mohamed Abbas           (abbas.mohamed@intel.com)
+ * Lockless receive & send, fd based notify:
+ * 			    Manfred Spraul	    (manfred@colorfullife.com)
+ *
+ * This file is released under the GPL.
+ */
+
+#include <linux/init.h>
+#include <linux/pagemap.h>
+#include <linux/file.h>
+#include <linux/mount.h>
+#include <linux/namei.h>
+#include <linux/sysctl.h>
+#include <linux/poll.h>
+#include <linux/mqueue.h>
+#include <linux/msg.h>
+#include <linux/skbuff.h>
+#include <linux/netlink.h>
+#include <net/sock.h>
+#include "util.h"
+
+#define MQUEUE_MAGIC	0x19800202
+#define DIRENT_SIZE	20
+#define FILENT_SIZE	80
+
+#define SEND		0
+#define RECV		1
+
+#define STATE_NONE	0
+#define STATE_PENDING	1
+#define STATE_READY	2
+
+/* used by sysctl */
+#define FS_MQUEUE 	1
+#define CTL_QUEUESMAX 	2
+#define CTL_MSGMAX 	3
+#define CTL_MSGSIZEMAX 	4
+
+/* default values */
+#define DFLT_QUEUESMAX	64	/* max number of message queues */
+#define DFLT_MSGMAX 	40	/* max number of messages in each queue */
+#define HARD_MSGMAX 	(131072/sizeof(void*))
+#define DFLT_MSGSIZEMAX 16384	/* max message size */
+
+#define NOTIFY_COOKIE_LEN	32
+
+struct ext_wait_queue {		/* queue of sleeping tasks */
+	struct task_struct *task;
+	struct list_head list;
+	struct msg_msg *msg;	/* ptr of loaded message */
+	int state;		/* one of STATE_* values */
+};
+
+struct mqueue_inode_info {
+	spinlock_t lock;
+	struct inode vfs_inode;
+	wait_queue_head_t wait_q;
+
+	struct msg_msg **messages;
+	struct mq_attr attr;
+
+	struct sigevent notify;
+	pid_t notify_owner;
+	struct sock *notify_sock;
+	struct sk_buff *notify_cookie;
+
+	/* for tasks waiting for free space and messages, respectively */
+	struct ext_wait_queue e_wait_q[2];
+
+	unsigned long qsize; /* size of queue in memory (sum of all msgs) */
+};
+
+static struct inode_operations mqueue_dir_inode_operations;
+static struct file_operations mqueue_file_operations;
+static struct super_operations mqueue_super_ops;
+static void remove_notification(struct mqueue_inode_info *info);
+
+static spinlock_t mq_lock;
+static kmem_cache_t *mqueue_inode_cachep;
+static struct vfsmount *mqueue_mnt;
+
+static unsigned int queues_count;
+static unsigned int queues_max 	= DFLT_QUEUESMAX;
+static unsigned int msg_max 	= DFLT_MSGMAX;
+static unsigned int msgsize_max = DFLT_MSGSIZEMAX;
+
+static struct ctl_table_header * mq_sysctl_table;
+
+static inline struct mqueue_inode_info *MQUEUE_I(struct inode *inode)
+{
+	return container_of(inode, struct mqueue_inode_info, vfs_inode);
+}
+
+static struct inode *mqueue_get_inode(struct super_block *sb, int mode)
+{
+	struct inode *inode;
+
+	inode = new_inode(sb);
+	if (inode) {
+		inode->i_mode = mode;
+		inode->i_uid = current->fsuid;
+		inode->i_gid = current->fsgid;
+		inode->i_blksize = PAGE_CACHE_SIZE;
+		inode->i_blocks = 0;
+		inode->i_mtime = inode->i_ctime = inode->i_atime =
+				CURRENT_TIME;
+
+		if (S_ISREG(mode)) {
+			struct mqueue_inode_info *info;
+
+			inode->i_fop = &mqueue_file_operations;
+			inode->i_size = FILENT_SIZE;
+			/* mqueue specific info */
+			info = MQUEUE_I(inode);
+			spin_lock_init(&info->lock);
+			init_waitqueue_head(&info->wait_q);
+			INIT_LIST_HEAD(&info->e_wait_q[0].list);
+			INIT_LIST_HEAD(&info->e_wait_q[1].list);
+			info->notify_owner = 0;
+			info->qsize = 0;
+			memset(&info->attr, 0, sizeof(info->attr));
+			info->attr.mq_maxmsg = DFLT_MSGMAX;
+			info->attr.mq_msgsize = DFLT_MSGSIZEMAX;
+			info->messages = kmalloc(DFLT_MSGMAX * sizeof(struct msg_msg *), GFP_KERNEL);
+			if (!info->messages) {
+				make_bad_inode(inode);
+				iput(inode);
+				inode = NULL;
+			}
+		} else if (S_ISDIR(mode)) {
+			inode->i_nlink++;
+			/* Some things misbehave if size == 0 on a directory */
+			inode->i_size = 2 * DIRENT_SIZE;
+			inode->i_op = &mqueue_dir_inode_operations;
+			inode->i_fop = &simple_dir_operations;
+		}
+	}
+	return inode;
+}
+
+static int mqueue_fill_super(struct super_block *sb, void *data, int silent)
+{
+	struct inode *inode;
+
+	sb->s_blocksize = PAGE_CACHE_SIZE;
+	sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
+	sb->s_magic = MQUEUE_MAGIC;
+	sb->s_op = &mqueue_super_ops;
+
+	inode = mqueue_get_inode(sb, S_IFDIR | S_ISVTX | S_IRWXUGO);
+	if (!inode)
+		return -ENOMEM;
+
+	sb->s_root = d_alloc_root(inode);
+	if (!sb->s_root) {
+		iput(inode);
+		return -ENOMEM;
+	}
+
+	return 0;
+}
+
+static struct super_block *mqueue_get_sb(struct file_system_type *fs_type,
+					 int flags, const char *dev_name,
+					 void *data)
+{
+	return get_sb_single(fs_type, flags, data, mqueue_fill_super);
+}
+
+static void init_once(void *foo, kmem_cache_t * cachep, unsigned long flags)
+{
+	struct mqueue_inode_info *p = (struct mqueue_inode_info *) foo;
+
+	if ((flags & (SLAB_CTOR_VERIFY | SLAB_CTOR_CONSTRUCTOR)) ==
+		SLAB_CTOR_CONSTRUCTOR)
+		inode_init_once(&p->vfs_inode);
+}
+
+static struct inode *mqueue_alloc_inode(struct super_block *sb)
+{
+	struct mqueue_inode_info *ei;
+
+	ei = kmem_cache_alloc(mqueue_inode_cachep, SLAB_KERNEL);
+	if (!ei)
+		return NULL;
+	return &ei->vfs_inode;
+}
+
+static void mqueue_destroy_inode(struct inode *inode)
+{
+	kmem_cache_free(mqueue_inode_cachep, MQUEUE_I(inode));
+}
+
+static void mqueue_delete_inode(struct inode *inode)
+{
+	struct mqueue_inode_info *info;
+	int i;
+
+	if (S_ISDIR(inode->i_mode)) {
+		clear_inode(inode);
+		return;
+	}
+	info = MQUEUE_I(inode);
+	spin_lock(&info->lock);
+	for (i = 0; i < info->attr.mq_curmsgs; i++)
+		free_msg(info->messages[i]);
+	kfree(info->messages);
+	spin_unlock(&info->lock);
+
+	clear_inode(inode);
+
+	spin_lock(&mq_lock);
+	queues_count--;
+	spin_unlock(&mq_lock);
+}
+
+static int mqueue_create(struct inode *dir, struct dentry *dentry,
+				int mode, struct nameidata *nd)
+{
+	struct inode *inode;
+	int error;
+
+	spin_lock(&mq_lock);
+	if (queues_count >= queues_max && !capable(CAP_SYS_RESOURCE)) {
+		error = -ENOSPC;
+		goto out_lock;
+	}
+	queues_count++;
+	spin_unlock(&mq_lock);
+
+	inode = mqueue_get_inode(dir->i_sb, mode);
+	if (!inode) {
+		error = -ENOMEM;
+		spin_lock(&mq_lock);
+		queues_count--;
+		goto out_lock;
+	}
+
+	dir->i_size += DIRENT_SIZE;
+	dir->i_ctime = dir->i_mtime = dir->i_atime = CURRENT_TIME;
+
+	d_instantiate(dentry, inode);
+	dget(dentry);
+	return 0;
+out_lock:
+	spin_unlock(&mq_lock);
+	return error;
+}
+
+static int mqueue_unlink(struct inode *dir, struct dentry *dentry)
+{
+  	struct inode *inode = dentry->d_inode;
+
+	dir->i_ctime = dir->i_mtime = dir->i_atime = CURRENT_TIME;
+	dir->i_size -= DIRENT_SIZE;
+  	inode->i_nlink--;
+  	dput(dentry);
+  	return 0;
+}
+
+/*
+*	This is routine for system read from queue file.
+*	To avoid mess with doing here some sort of mq_receive we allow
+*	to read only queue size & notification info (the only values
+*	that are interesting from user point of view and aren't accessible
+*	through std routines)
+*/
+static ssize_t mqueue_read_file(struct file *filp, char __user *u_data,
+				size_t count, loff_t * off)
+{
+	struct mqueue_inode_info *info = MQUEUE_I(filp->f_dentry->d_inode);
+	char buffer[FILENT_SIZE];
+	size_t slen;
+	loff_t o;
+
+	if (!count)
+		return 0;
+
+	spin_lock(&info->lock);
+	snprintf(buffer, sizeof(buffer),
+			"QSIZE:%-10lu NOTIFY:%-5d SIGNO:%-5d NOTIFY_PID:%-6d\n",
+			info->qsize,
+			info->notify_owner ? info->notify.sigev_notify : 0,
+			(info->notify_owner &&
+			 info->notify.sigev_notify == SIGEV_SIGNAL) ?
+				info->notify.sigev_signo : 0,
+			info->notify_owner);
+	spin_unlock(&info->lock);
+	buffer[sizeof(buffer)-1] = '\0';
+	slen = strlen(buffer)+1;
+
+	o = *off;
+	if (o > slen)
+		return 0;
+
+	if (o + count > slen)
+		count = slen - o;
+
+	if (copy_to_user(u_data, buffer + o, count))
+		return -EFAULT;
+
+	*off = o + count;
+	filp->f_dentry->d_inode->i_atime = filp->f_dentry->d_inode->i_ctime = CURRENT_TIME;
+	return count;
+}
+
+static int mqueue_flush_file(struct file *filp)
+{
+	struct mqueue_inode_info *info = MQUEUE_I(filp->f_dentry->d_inode);
+
+	spin_lock(&info->lock);
+	if (current->tgid == info->notify_owner)
+		remove_notification(info);
+
+	spin_unlock(&info->lock);
+	return 0;
+}
+
+static unsigned int mqueue_poll_file(struct file *filp, struct poll_table_struct *poll_tab)
+{
+	struct mqueue_inode_info *info = MQUEUE_I(filp->f_dentry->d_inode);
+	int retval = 0;
+
+	poll_wait(filp, &info->wait_q, poll_tab);
+
+	spin_lock(&info->lock);
+	if (info->attr.mq_curmsgs)
+		retval = POLLIN | POLLRDNORM;
+
+	if (info->attr.mq_curmsgs < info->attr.mq_maxmsg)
+		retval |= POLLOUT | POLLWRNORM;
+	spin_unlock(&info->lock);
+
+	return retval;
+}
+
+/* Adds current to info->e_wait_q[sr] before element with smaller prio */
+static void wq_add(struct mqueue_inode_info *info, int sr,
+			struct ext_wait_queue *ewp)
+{
+	struct ext_wait_queue *walk;
+
+	ewp->task = current;
+
+	list_for_each_entry(walk, &info->e_wait_q[sr].list, list) {
+		if (walk->task->static_prio <= current->static_prio) {
+			list_add_tail(&ewp->list, &walk->list);
+			return;
+		}
+	}
+	list_add_tail(&ewp->list, &info->e_wait_q[sr].list);
+}
+
+/*
+ * Puts current task to sleep. Caller must hold queue lock. After return
+ * lock isn't held.
+ * sr: SEND or RECV
+ */
+static int wq_sleep(struct mqueue_inode_info *info, int sr,
+			long timeout, struct ext_wait_queue *ewp)
+{
+	int retval;
+	signed long time;
+
+	wq_add(info, sr, ewp);
+
+	for (;;) {
+		set_current_state(TASK_INTERRUPTIBLE);
+
+		spin_unlock(&info->lock);
+		time = schedule_timeout(timeout);
+
+		while (ewp->state == STATE_PENDING)
+			cpu_relax();
+
+		if (ewp->state == STATE_READY) {
+			retval = 0;
+			goto out;
+		}
+		spin_lock(&info->lock);
+		if (ewp->state == STATE_READY) {
+			retval = 0;
+			goto out_unlock;
+		}
+		if (signal_pending(current)) {
+			retval = -ERESTARTSYS;
+			break;
+		}
+		if (time == 0) {
+			retval = -ETIMEDOUT;
+			break;
+		}
+	}
+	list_del(&ewp->list);
+out_unlock:
+	spin_unlock(&info->lock);
+out:
+	return retval;
+}
+
+/*
+ * Returns waiting task that should be serviced first or NULL if none exists
+ */
+static struct ext_wait_queue *wq_get_first_waiter(
+		struct mqueue_inode_info *info, int sr)
+{
+	struct list_head *ptr;
+
+	ptr = info->e_wait_q[sr].list.prev;
+	if (ptr == &info->e_wait_q[sr].list)
+		return NULL;
+	return list_entry(ptr, struct ext_wait_queue, list);
+}
+
+/* Auxiliary functions to manipulate messages' list */
+static void msg_insert(struct msg_msg *ptr, struct mqueue_inode_info *info)
+{
+	int k;
+
+	k = info->attr.mq_curmsgs - 1;
+	while (k >= 0 && info->messages[k]->m_type >= ptr->m_type) {
+		info->messages[k + 1] = info->messages[k];
+		k--;
+	}
+	info->attr.mq_curmsgs++;
+	info->qsize += ptr->m_ts;
+	info->messages[k + 1] = ptr;
+}
+
+static inline struct msg_msg *msg_get(struct mqueue_inode_info *info)
+{
+	info->qsize -= info->messages[--info->attr.mq_curmsgs]->m_ts;
+	return info->messages[info->attr.mq_curmsgs];
+}
+
+static inline void set_cookie(struct sk_buff *skb, char code)
+{
+	((char*)skb->data)[NOTIFY_COOKIE_LEN-1] = code;
+}
+
+/*
+ * The next function is only to split too long sys_mq_timedsend
+ */
+static void __do_notify(struct mqueue_inode_info *info)
+{
+	/* notification
+	 * invoked when there is registered process and there isn't process
+	 * waiting synchronously for message AND state of queue changed from
+	 * empty to not empty. Here we are sure that no one is waiting
+	 * synchronously. */
+	if (info->notify_owner &&
+	    info->attr.mq_curmsgs == 1) {
+		struct siginfo sig_i;
+		switch (info->notify.sigev_notify) {
+		case SIGEV_NONE:
+			break;
+		case SIGEV_SIGNAL:
+			/* sends signal */
+
+			sig_i.si_signo = info->notify.sigev_signo;
+			sig_i.si_errno = 0;
+			sig_i.si_code = SI_MESGQ;
+			sig_i.si_value = info->notify.sigev_value;
+			sig_i.si_pid = current->tgid;
+			sig_i.si_uid = current->uid;
+
+			kill_proc_info(info->notify.sigev_signo,
+				       &sig_i, info->notify_owner);
+			break;
+		case SIGEV_THREAD:
+			set_cookie(info->notify_cookie, NOTIFY_WOKENUP);
+			netlink_sendskb(info->notify_sock,
+					info->notify_cookie, 0);
+			break;
+		}
+		/* after notification unregisters process */
+		info->notify_owner = 0;
+	}
+	wake_up(&info->wait_q);
+}
+
+static long prepare_timeout(const struct timespec __user *u_arg)
+{
+	struct timespec ts, nowts;
+	long timeout;
+
+	if (u_arg) {
+		if (unlikely(copy_from_user(&ts, u_arg,
+					sizeof(struct timespec))))
+			return -EFAULT;
+
+		if (unlikely(ts.tv_nsec < 0 || ts.tv_sec < 0
+			|| ts.tv_nsec >= NSEC_PER_SEC))
+			return -EINVAL;
+		nowts = CURRENT_TIME;
+		/* first subtract as jiffies can't be too big */
+		ts.tv_sec -= nowts.tv_sec;
+		if (ts.tv_nsec < nowts.tv_nsec) {
+			ts.tv_nsec += NSEC_PER_SEC;
+			ts.tv_sec--;
+		}
+		ts.tv_nsec -= nowts.tv_nsec;
+		if (ts.tv_sec < 0)
+			return 0;
+
+		timeout = timespec_to_jiffies(&ts) + 1;
+	} else
+		return MAX_SCHEDULE_TIMEOUT;
+
+	return timeout;
+}
+
+static void remove_notification(struct mqueue_inode_info *info)
+{
+	if (info->notify_owner != 0 &&
+	    info->notify.sigev_notify == SIGEV_THREAD) {
+		set_cookie(info->notify_cookie, NOTIFY_REMOVED);
+		netlink_sendskb(info->notify_sock, info->notify_cookie, 0);
+	}
+	info->notify_owner = 0;
+}
+
+/*
+ * Invoked when creating a new queue via sys_mq_open
+ */
+static struct file *do_create(struct dentry *dir, struct dentry *dentry,
+			int oflag, mode_t mode, struct mq_attr __user *u_attr)
+{
+	struct file *filp;
+	struct inode *inode;
+	struct mqueue_inode_info *info;
+	struct msg_msg **msgs = NULL;
+	struct mq_attr attr;
+	int ret;
+
+	if (u_attr != NULL) {
+		if (copy_from_user(&attr, u_attr, sizeof(attr)))
+			return ERR_PTR(-EFAULT);
+
+		if (attr.mq_maxmsg <= 0 || attr.mq_msgsize <= 0)
+			return ERR_PTR(-EINVAL);
+		if (capable(CAP_SYS_RESOURCE)) {
+			if (attr.mq_maxmsg > HARD_MSGMAX)
+				return ERR_PTR(-EINVAL);
+		} else {
+			if (attr.mq_maxmsg > msg_max ||
+					attr.mq_msgsize > msgsize_max)
+				return ERR_PTR(-EINVAL);
+		}
+		msgs = kmalloc(attr.mq_maxmsg * sizeof(*msgs), GFP_KERNEL);
+		if (!msgs)
+			return ERR_PTR(-ENOMEM);
+	} else {
+		msgs = NULL;
+	}
+
+	ret = vfs_create(dir->d_inode, dentry, mode, NULL);
+	if (ret) {
+		kfree(msgs);
+		return ERR_PTR(ret);
+	}
+
+	inode = dentry->d_inode;
+	info = MQUEUE_I(inode);
+
+	if (msgs) {
+		info->attr.mq_maxmsg = attr.mq_maxmsg;
+		info->attr.mq_msgsize = attr.mq_msgsize;
+		kfree(info->messages);
+		info->messages = msgs;
+	}
+
+	filp = dentry_open(dentry, mqueue_mnt, oflag);
+	if (!IS_ERR(filp))
+		dget(dentry);
+
+	return filp;
+}
+
+/* Opens existing queue */
+static struct file *do_open(struct dentry *dentry, int oflag)
+{
+static int oflag2acc[O_ACCMODE] = { MAY_READ, MAY_WRITE,
+					MAY_READ | MAY_WRITE };
+	struct file *filp;
+
+	if ((oflag & O_ACCMODE) == (O_RDWR | O_WRONLY))
+		return ERR_PTR(-EINVAL);
+
+	if (permission(dentry->d_inode, oflag2acc[oflag & O_ACCMODE], NULL))
+		return ERR_PTR(-EACCES);
+
+	filp = dentry_open(dentry, mqueue_mnt, oflag);
+
+	if (!IS_ERR(filp))
+		dget(dentry);
+
+	return filp;
+}
+
+asmlinkage long sys_mq_open(const char __user *u_name, int oflag, mode_t mode,
+				struct mq_attr __user *u_attr)
+{
+	struct dentry *dentry;
+	struct file *filp;
+	char *name;
+	int fd, error;
+
+	if (IS_ERR(name = getname(u_name)))
+		return PTR_ERR(name);
+
+	fd = get_unused_fd();
+	if (fd < 0)
+		goto out_putname;
+
+	down(&mqueue_mnt->mnt_root->d_inode->i_sem);
+	dentry = lookup_one_len(name, mqueue_mnt->mnt_root, strlen(name));
+	if (IS_ERR(dentry)) {
+		error = PTR_ERR(dentry);
+		goto out_err;
+	}
+	mntget(mqueue_mnt);
+
+	if (oflag & O_CREAT) {
+		if (dentry->d_inode) {	/* entry already exists */
+			filp = (oflag & O_EXCL) ? ERR_PTR(-EEXIST) :
+					do_open(dentry, oflag);
+		} else {
+			filp = do_create(mqueue_mnt->mnt_root, dentry,
+						oflag, mode, u_attr);
+		}
+	} else
+		filp = (dentry->d_inode) ? do_open(dentry, oflag) :
+					ERR_PTR(-ENOENT);
+
+	dput(dentry);
+
+	if (IS_ERR(filp)) {
+		error = PTR_ERR(filp);
+		goto out_putfd;
+	}
+
+	set_close_on_exec(fd, 1);
+	fd_install(fd, filp);
+	goto out_upsem;
+
+out_putfd:
+	mntput(mqueue_mnt);
+	put_unused_fd(fd);
+out_err:
+	fd = error;
+out_upsem:
+	up(&mqueue_mnt->mnt_root->d_inode->i_sem);
+out_putname:
+	putname(name);
+	return fd;
+}
+
+asmlinkage long sys_mq_unlink(const char __user *u_name)
+{
+	int err;
+	char *name;
+	struct dentry *dentry;
+	struct inode *inode = NULL;
+
+	name = getname(u_name);
+	if (IS_ERR(name))
+		return PTR_ERR(name);
+
+	down(&mqueue_mnt->mnt_root->d_inode->i_sem);
+	dentry = lookup_one_len(name, mqueue_mnt->mnt_root, strlen(name));
+	if (IS_ERR(dentry)) {
+		err = PTR_ERR(dentry);
+		goto out_unlock;
+	}
+
+	if (!dentry->d_inode) {
+		err = -ENOENT;
+		goto out_err;
+	}
+
+	inode = dentry->d_inode;
+	if (inode)
+		atomic_inc(&inode->i_count);
+
+	err = vfs_unlink(dentry->d_parent->d_inode, dentry);
+out_err:
+	dput(dentry);
+
+out_unlock:
+	up(&mqueue_mnt->mnt_root->d_inode->i_sem);
+	putname(name);
+	if (inode)
+		iput(inode);
+
+	return err;
+}
+
+/* Pipelined send and receive functions.
+ *
+ * If a receiver finds no waiting message, then it registers itself in the
+ * list of waiting receivers. A sender checks that list before adding the new
+ * message into the message array. If there is a waiting receiver, then it
+ * bypasses the message array and directly hands the message over to the
+ * receiver.
+ * The receiver accepts the message and returns without grabbing the queue
+ * spinlock. Therefore an intermediate STATE_PENDING state and memory barriers
+ * are necessary. The same algorithm is used for sysv semaphores, see
+ * ipc/sem.c fore more details.
+ *
+ * The same algorithm is used for senders.
+ */
+
+/* pipelined_send() - send a message directly to the task waiting in
+ * sys_mq_timedreceive() (without inserting message into a queue).
+ */
+static inline void pipelined_send(struct mqueue_inode_info *info,
+				  struct msg_msg *message,
+				  struct ext_wait_queue *receiver)
+{
+	receiver->msg = message;
+	list_del(&receiver->list);
+	receiver->state = STATE_PENDING;
+	wake_up_process(receiver->task);
+	wmb();
+	receiver->state = STATE_READY;
+}
+
+/* pipelined_receive() - if there is task waiting in sys_mq_timedsend()
+ * gets its message and put to the queue (we have one free place for sure). */
+static inline void pipelined_receive(struct mqueue_inode_info *info)
+{
+	struct ext_wait_queue *sender = wq_get_first_waiter(info, SEND);
+
+	if (!sender) {
+		/* for poll */
+		wake_up_interruptible(&info->wait_q);
+		return;
+	}
+	msg_insert(sender->msg, info);
+	list_del(&sender->list);
+	sender->state = STATE_PENDING;
+	wake_up_process(sender->task);
+	wmb();
+	sender->state = STATE_READY;
+}
+
+asmlinkage long sys_mq_timedsend(mqd_t mqdes, const char __user *u_msg_ptr,
+	size_t msg_len, unsigned int msg_prio,
+	const struct timespec __user *u_abs_timeout)
+{
+	struct file *filp;
+	struct inode *inode;
+	struct ext_wait_queue wait;
+	struct ext_wait_queue *receiver;
+	struct msg_msg *msg_ptr;
+	struct mqueue_inode_info *info;
+	long timeout;
+	int ret;
+
+	if (unlikely(msg_prio >= (unsigned long) MQ_PRIO_MAX))
+		return -EINVAL;
+
+	timeout = prepare_timeout(u_abs_timeout);
+
+	ret = -EBADF;
+	filp = fget(mqdes);
+	if (unlikely(!filp))
+		goto out;
+
+	inode = filp->f_dentry->d_inode;
+	if (unlikely(filp->f_op != &mqueue_file_operations))
+		goto out_fput;
+	info = MQUEUE_I(inode);
+
+	if (unlikely(!(filp->f_mode & FMODE_WRITE)))
+		goto out_fput;
+
+	if (unlikely(msg_len > info->attr.mq_msgsize)) {
+		ret = -EMSGSIZE;
+		goto out_fput;
+	}
+
+	/* First try to allocate memory, before doing anything with
+	 * existing queues. */
+	msg_ptr = load_msg((void *)u_msg_ptr, msg_len);
+	if (unlikely(IS_ERR(msg_ptr))) {
+		ret = PTR_ERR(msg_ptr);
+		goto out_fput;
+	}
+	msg_ptr->m_ts = msg_len;
+	msg_ptr->m_type = msg_prio;
+
+	spin_lock(&info->lock);
+
+	if (info->attr.mq_curmsgs == info->attr.mq_maxmsg) {
+		if (filp->f_flags & O_NONBLOCK) {
+			spin_unlock(&info->lock);
+			ret = -EAGAIN;
+		} else if (unlikely(timeout < 0)) {
+			spin_unlock(&info->lock);
+			ret = timeout;
+		} else {
+			wait.task = current;
+			wait.msg = (void *) msg_ptr;
+			wait.state = STATE_NONE;
+			ret = wq_sleep(info, SEND, timeout, &wait);
+			if (ret < 0)
+				free_msg(msg_ptr);
+		}
+	} else {
+		receiver = wq_get_first_waiter(info, RECV);
+		if (receiver) {
+			pipelined_send(info, msg_ptr, receiver);
+		} else {
+			/* adds message to the queue */
+			msg_insert(msg_ptr, info);
+			__do_notify(info);
+		}
+		inode->i_atime = inode->i_mtime = inode->i_ctime =
+				CURRENT_TIME;
+		spin_unlock(&info->lock);
+		ret = 0;
+	}
+out_fput:
+	fput(filp);
+out:
+	return ret;
+}
+
+asmlinkage ssize_t sys_mq_timedreceive(mqd_t mqdes, char __user *u_msg_ptr,
+	size_t msg_len, unsigned int __user *u_msg_prio,
+	const struct timespec __user *u_abs_timeout)
+{
+	long timeout;
+	ssize_t ret;
+	struct msg_msg *msg_ptr;
+	struct file *filp;
+	struct inode *inode;
+	struct mqueue_inode_info *info;
+	struct ext_wait_queue wait;
+
+	timeout = prepare_timeout(u_abs_timeout);
+
+	ret = -EBADF;
+	filp = fget(mqdes);
+	if (unlikely(!filp))
+		goto out;
+
+	inode = filp->f_dentry->d_inode;
+	if (unlikely(filp->f_op != &mqueue_file_operations))
+		goto out_fput;
+	info = MQUEUE_I(inode);
+
+	if (unlikely(!(filp->f_mode & FMODE_READ)))
+		goto out_fput;
+
+	/* checks if buffer is big enough */
+	if (unlikely(msg_len < info->attr.mq_msgsize)) {
+		ret = -EMSGSIZE;
+		goto out_fput;
+	}
+
+	spin_lock(&info->lock);
+	if (info->attr.mq_curmsgs == 0) {
+		if (filp->f_flags & O_NONBLOCK) {
+			spin_unlock(&info->lock);
+			ret = -EAGAIN;
+			msg_ptr = NULL;
+		} else if (unlikely(timeout < 0)) {
+			spin_unlock(&info->lock);
+			ret = timeout;
+			msg_ptr = NULL;
+		} else {
+			wait.task = current;
+			wait.state = STATE_NONE;
+			ret = wq_sleep(info, RECV, timeout, &wait);
+			msg_ptr = wait.msg;
+		}
+	} else {
+		msg_ptr = msg_get(info);
+
+		inode->i_atime = inode->i_mtime = inode->i_ctime =
+				CURRENT_TIME;
+
+		/* There is now free space in queue. */
+		pipelined_receive(info);
+		spin_unlock(&info->lock);
+		ret = 0;
+	}
+	if (ret == 0) {
+		ret = msg_ptr->m_ts;
+
+		if ((u_msg_prio && put_user(msg_ptr->m_type, u_msg_prio)) ||
+			store_msg(u_msg_ptr, msg_ptr, msg_ptr->m_ts)) {
+			ret = -EFAULT;
+		}
+		free_msg(msg_ptr);
+	}
+out_fput:
+	fput(filp);
+out:
+	return ret;
+}
+
+/*
+ * Notes: the case when user wants us to deregister (with NULL as pointer)
+ * and he isn't currently owner of notification, will be silently discarded.
+ * It isn't explicitly defined in the POSIX.
+ */
+asmlinkage long sys_mq_notify(mqd_t mqdes,
+				const struct sigevent __user *u_notification)
+{
+	int ret;
+	struct file *filp;
+	struct sock *sock;
+	struct inode *inode;
+	struct sigevent notification;
+	struct mqueue_inode_info *info;
+	struct sk_buff *nc;
+
+	nc = NULL;
+	sock = NULL;
+	if (u_notification != NULL) {
+		if (copy_from_user(&notification, u_notification,
+					sizeof(struct sigevent)))
+			return -EFAULT;
+
+		if (unlikely(notification.sigev_notify != SIGEV_NONE &&
+			     notification.sigev_notify != SIGEV_SIGNAL &&
+			     notification.sigev_notify != SIGEV_THREAD))
+			return -EINVAL;
+		if (notification.sigev_notify == SIGEV_SIGNAL &&
+			(notification.sigev_signo < 0 ||
+			 notification.sigev_signo > _NSIG)) {
+			return -EINVAL;
+		}
+		if (notification.sigev_notify == SIGEV_THREAD) {
+			/* create the notify skb */
+			nc = alloc_skb(NOTIFY_COOKIE_LEN, GFP_KERNEL);
+			ret = -ENOMEM;
+			if (!nc)
+				goto out;
+			ret = -EFAULT;
+			if (copy_from_user(nc->data,
+					notification.sigev_value.sival_ptr,
+					NOTIFY_COOKIE_LEN)) {
+				goto out;
+			}
+
+			/* TODO: add a header? */
+			skb_put(nc, NOTIFY_COOKIE_LEN);
+			/* and attach it to the socket */
+retry:
+			filp = fget(notification.sigev_signo);
+			ret = -EBADF;
+			if (!filp)
+				goto out;
+			sock = netlink_getsockbyfilp(filp);
+			fput(filp);
+			if (IS_ERR(sock)) {
+				ret = PTR_ERR(sock);
+				sock = NULL;
+				goto out;
+			}
+
+			ret = netlink_attachskb(sock, nc, 0, MAX_SCHEDULE_TIMEOUT);
+			if (ret == 1)
+		       		goto retry;
+			if (ret) {
+				sock = NULL;
+				nc = NULL;
+				goto out;
+			}
+		}
+	}
+
+	ret = -EBADF;
+	filp = fget(mqdes);
+	if (!filp)
+		goto out;
+
+	inode = filp->f_dentry->d_inode;
+	if (unlikely(filp->f_op != &mqueue_file_operations))
+		goto out_fput;
+	info = MQUEUE_I(inode);
+
+	ret = 0;
+	spin_lock(&info->lock);
+	if (u_notification == NULL) {
+		if (info->notify_owner == current->tgid) {
+			remove_notification(info);
+			inode->i_atime = inode->i_ctime = CURRENT_TIME;
+		}
+	} else if (info->notify_owner != 0) {
+		ret = -EBUSY;
+	} else {
+		switch (notification.sigev_notify) {
+		case SIGEV_NONE:
+			info->notify.sigev_notify = SIGEV_NONE;
+			break;
+		case SIGEV_THREAD:
+			info->notify_sock = sock;
+			info->notify_cookie = nc;
+			sock = NULL;
+			nc = NULL;
+			info->notify.sigev_notify = SIGEV_THREAD;
+			break;
+		case SIGEV_SIGNAL:
+			info->notify.sigev_signo = notification.sigev_signo;
+			info->notify.sigev_value = notification.sigev_value;
+			info->notify.sigev_notify = SIGEV_SIGNAL;
+			break;
+		}
+		info->notify_owner = current->tgid;
+		inode->i_atime = inode->i_ctime = CURRENT_TIME;
+	}
+	spin_unlock(&info->lock);
+out_fput:
+	fput(filp);
+out:
+	if (sock) {
+		netlink_detachskb(sock, nc);
+	} else if (nc) {
+		dev_kfree_skb(nc);
+	}
+	return ret;
+}
+
+asmlinkage long sys_mq_getsetattr(mqd_t mqdes,
+			const struct mq_attr __user *u_mqstat,
+			struct mq_attr __user *u_omqstat)
+{
+	int ret;
+	struct mq_attr mqstat, omqstat;
+	struct file *filp;
+	struct inode *inode;
+	struct mqueue_inode_info *info;
+
+	if (u_mqstat != NULL) {
+		if (copy_from_user(&mqstat, u_mqstat, sizeof(struct mq_attr)))
+			return -EFAULT;
+		if (mqstat.mq_flags & (~O_NONBLOCK))
+			return -EINVAL;
+	}
+
+	ret = -EBADF;
+	filp = fget(mqdes);
+	if (!filp)
+		goto out;
+
+	inode = filp->f_dentry->d_inode;
+	if (unlikely(filp->f_op != &mqueue_file_operations))
+		goto out_fput;
+	info = MQUEUE_I(inode);
+
+	spin_lock(&info->lock);
+
+	omqstat = info->attr;
+	omqstat.mq_flags = filp->f_flags & O_NONBLOCK;
+	if (u_mqstat) {
+		if (mqstat.mq_flags & O_NONBLOCK)
+			filp->f_flags |= O_NONBLOCK;
+		else
+			filp->f_flags &= ~O_NONBLOCK;
+
+		inode->i_atime = inode->i_ctime = CURRENT_TIME;
+	}
+
+	spin_unlock(&info->lock);
+
+	ret = 0;
+	if (u_omqstat != NULL && copy_to_user(u_omqstat, &omqstat,
+						sizeof(struct mq_attr)))
+		ret = -EFAULT;
+
+out_fput:
+	fput(filp);
+out:
+	return ret;
+}
+
+static struct inode_operations mqueue_dir_inode_operations = {
+	.lookup = simple_lookup,
+	.create = mqueue_create,
+	.unlink = mqueue_unlink,
+};
+
+static struct file_operations mqueue_file_operations = {
+	.flush = mqueue_flush_file,
+	.poll = mqueue_poll_file,
+	.read = mqueue_read_file,
+};
+
+static struct super_operations mqueue_super_ops = {
+	.alloc_inode = mqueue_alloc_inode,
+	.destroy_inode = mqueue_destroy_inode,
+	.statfs = simple_statfs,
+	.delete_inode = mqueue_delete_inode,
+	.drop_inode = generic_delete_inode,
+};
+
+static struct file_system_type mqueue_fs_type = {
+	.name = "mqueue",
+	.get_sb = mqueue_get_sb,
+	.kill_sb = kill_litter_super,
+};
+
+static int msg_max_limit_min = DFLT_MSGMAX;
+static int msg_max_limit_max = HARD_MSGMAX;
+
+static int msg_maxsize_limit_min = DFLT_MSGSIZEMAX;
+static int msg_maxsize_limit_max = INT_MAX;
+
+static ctl_table mq_sysctls[] = {
+	{
+		.ctl_name	= CTL_QUEUESMAX,
+		.procname	= "queues_max",
+		.data		= &queues_max,
+		.maxlen		= sizeof(int),
+		.mode		= 0644,
+		.proc_handler	= &proc_dointvec,
+	},
+	{
+		.ctl_name	= CTL_MSGMAX,
+		.procname	= "msg_max",
+		.data		= &msg_max,
+		.maxlen		= sizeof(int),
+		.mode		= 0644,
+		.proc_handler	= &proc_dointvec_minmax,
+		.extra1		= &msg_max_limit_min,
+		.extra2		= &msg_max_limit_max,
+	},
+	{
+		.ctl_name	= CTL_MSGSIZEMAX,
+		.procname	= "msgsize_max",
+		.data		= &msgsize_max,
+		.maxlen		= sizeof(int),
+		.mode		= 0644,
+		.proc_handler	= &proc_dointvec_minmax,
+		.extra1		= &msg_maxsize_limit_min,
+		.extra2		= &msg_maxsize_limit_max,
+	},
+	{ .ctl_name = 0 }
+};
+
+static ctl_table mq_sysctl_dir[] = {
+	{
+		.ctl_name	= FS_MQUEUE,
+		.procname	= "mqueue",
+		.mode		= 0555,
+		.child		= mq_sysctls,
+	},
+	{ .ctl_name = 0 }
+};
+
+static ctl_table mq_sysctl_root[] = {
+	{
+		.ctl_name	= CTL_FS,
+		.procname	= "fs",
+		.mode		= 0555,
+		.child		= mq_sysctl_dir,
+	},
+	{ .ctl_name = 0 }
+};
+
+static int __init init_mqueue_fs(void)
+{
+	int error;
+
+	mqueue_inode_cachep = kmem_cache_create("mqueue_inode_cache",
+				sizeof(struct mqueue_inode_info), 0,
+				SLAB_HWCACHE_ALIGN, init_once, NULL);
+	if (mqueue_inode_cachep == NULL)
+		return -ENOMEM;
+
+	mq_sysctl_table = register_sysctl_table(mq_sysctl_root, 0);
+	if (!mq_sysctl_table) {
+		error = -ENOMEM;
+		goto out_cache;
+	}
+
+	error = register_filesystem(&mqueue_fs_type);
+	if (error)
+		goto out_sysctl;
+
+	if (IS_ERR(mqueue_mnt = kern_mount(&mqueue_fs_type))) {
+		error = PTR_ERR(mqueue_mnt);
+		goto out_filesystem;
+	}
+
+	/* internal initialization - not common for vfs */
+	queues_count = 0;
+	spin_lock_init(&mq_lock);
+
+	return 0;
+
+out_filesystem:
+	unregister_filesystem(&mqueue_fs_type);
+out_sysctl:
+	unregister_sysctl_table(mq_sysctl_table);
+out_cache:
+	if (kmem_cache_destroy(mqueue_inode_cachep)) {
+		printk(KERN_INFO
+			"mqueue_inode_cache: not all structures were freed\n");
+	}
+	return error;
+}
+
+__initcall(init_mqueue_fs);
--- diff/ipc/msgutil.c	1970-01-01 01:00:00.000000000 +0100
+++ source/ipc/msgutil.c	2004-04-21 10:45:35.996231240 +0100
@@ -0,0 +1,127 @@
+/*
+ * linux/ipc/util.c
+ * Copyright (C) 1999, 2004 Manfred Spraul
+ *
+ * This file is released under GNU General Public Licence version 2 or
+ * (at your option) any later version.
+ *
+ * See the file COPYING for more details.
+ */
+
+#include <linux/spinlock.h>
+#include <linux/init.h>
+#include <linux/security.h>
+#include <linux/slab.h>
+#include <linux/ipc.h>
+#include <asm/uaccess.h>
+
+#include "util.h"
+
+struct msg_msgseg {
+	struct msg_msgseg* next;
+	/* the next part of the message follows immediately */
+};
+
+#define DATALEN_MSG	(PAGE_SIZE-sizeof(struct msg_msg))
+#define DATALEN_SEG	(PAGE_SIZE-sizeof(struct msg_msgseg))
+
+struct msg_msg *load_msg(void __user *src, int len)
+{
+	struct msg_msg *msg;
+	struct msg_msgseg **pseg;
+	int err;
+	int alen;
+
+	alen = len;
+	if (alen > DATALEN_MSG)
+		alen = DATALEN_MSG;
+
+	msg = (struct msg_msg *)kmalloc(sizeof(*msg) + alen, GFP_KERNEL);
+	if (msg == NULL)
+		return ERR_PTR(-ENOMEM);
+
+	msg->next = NULL;
+	msg->security = NULL;
+
+	if (copy_from_user(msg + 1, src, alen)) {
+		err = -EFAULT;
+		goto out_err;
+	}
+
+	len -= alen;
+	src = ((char *)src) + alen;
+	pseg = &msg->next;
+	while (len > 0) {
+		struct msg_msgseg *seg;
+		alen = len;
+		if (alen > DATALEN_SEG)
+			alen = DATALEN_SEG;
+		seg = (struct msg_msgseg *)kmalloc(sizeof(*seg) + alen,
+						 GFP_KERNEL);
+		if (seg == NULL) {
+			err = -ENOMEM;
+			goto out_err;
+		}
+		*pseg = seg;
+		seg->next = NULL;
+		if (copy_from_user(seg + 1, src, alen)) {
+			err = -EFAULT;
+			goto out_err;
+		}
+		pseg = &seg->next;
+		len -= alen;
+		src = ((char *)src) + alen;
+	}
+
+	err = security_msg_msg_alloc(msg);
+	if (err)
+		goto out_err;
+
+	return msg;
+
+out_err:
+	free_msg(msg);
+	return ERR_PTR(err);
+}
+
+int store_msg(void __user *dest, struct msg_msg *msg, int len)
+{
+	int alen;
+	struct msg_msgseg *seg;
+
+	alen = len;
+	if (alen > DATALEN_MSG)
+		alen = DATALEN_MSG;
+	if (copy_to_user(dest, msg + 1, alen))
+		return -1;
+
+	len -= alen;
+	dest = ((char *)dest) + alen;
+	seg = msg->next;
+	while (len > 0) {
+		alen = len;
+		if (alen > DATALEN_SEG)
+			alen = DATALEN_SEG;
+		if (copy_to_user(dest, seg + 1, alen))
+			return -1;
+		len -= alen;
+		dest = ((char *)dest) + alen;
+		seg = seg->next;
+	}
+	return 0;
+}
+
+void free_msg(struct msg_msg *msg)
+{
+	struct msg_msgseg *seg;
+
+	security_msg_msg_free(msg);
+
+	seg = msg->next;
+	kfree(msg);
+	while (seg != NULL) {
+		struct msg_msgseg *tmp = seg->next;
+		kfree(seg);
+		seg = tmp;
+	}
+}
--- diff/kernel/audit.c	1970-01-01 01:00:00.000000000 +0100
+++ source/kernel/audit.c	2004-04-21 10:45:35.999230784 +0100
@@ -0,0 +1,825 @@
+/* audit.c -- Auditing support -*- linux-c -*-
+ * Gateway between the kernel (e.g., selinux) and the user-space audit daemon.
+ * System-call specific features have moved to auditsc.c
+ *
+ * Copyright 2003-2004 Red Hat Inc., Durham, North Carolina.
+ * All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Written by Rickard E. (Rik) Faith <faith@redhat.com>
+ *
+ * Goals: 1) Integrate fully with SELinux.
+ *	  2) Minimal run-time overhead:
+ *	     a) Minimal when syscall auditing is disabled (audit_enable=0).
+ *	     b) Small when syscall auditing is enabled and no audit record
+ *		is generated (defer as much work as possible to record
+ *		generation time):
+ *		i) context is allocated,
+ *		ii) names from getname are stored without a copy, and
+ *		iii) inode information stored from path_lookup.
+ *	  3) Ability to disable syscall auditing at boot time (audit=0).
+ *	  4) Usable by other parts of the kernel (if audit_log* is called,
+ *	     then a syscall record will be generated automatically for the
+ *	     current syscall).
+ *	  5) Netlink interface to user-space.
+ *	  6) Support low-overhead kernel-based filtering to minimize the
+ *	     information that must be passed to user-space.
+ *
+ * Example user-space utilities: http://people.redhat.com/faith/audit/
+ */
+
+#include <linux/init.h>
+#include <asm/atomic.h>
+#include <asm/types.h>
+#include <linux/mm.h>
+#include <linux/module.h>
+
+#include <linux/audit.h>
+
+#include <net/sock.h>
+#include <linux/skbuff.h>
+#include <linux/netlink.h>
+
+/* No auditing will take place until audit_initialized != 0.
+ * (Initialization happens after skb_init is called.) */
+static int	audit_initialized;
+
+/* No syscall auditing will take place unless audit_enabled != 0. */
+int		audit_enabled;
+
+/* Default state when kernel boots without any parameters. */
+static int	audit_default;
+
+/* If auditing cannot proceed, audit_failure selects what happens. */
+static int	audit_failure = AUDIT_FAIL_PRINTK;
+
+/* If audit records are to be written to the netlink socket, audit_pid
+ * contains the (non-zero) pid. */
+static int	audit_pid;
+
+/* If audit_limit is non-zero, limit the rate of sending audit records
+ * to that number per second.  This prevents DoS attacks, but results in
+ * audit records being dropped. */
+static int	audit_rate_limit;
+
+/* Number of outstanding audit_buffers allowed. */
+static int	audit_backlog_limit = 64;
+static atomic_t	audit_backlog	    = ATOMIC_INIT(0);
+
+/* Records can be lost in several ways:
+   0) [suppressed in audit_alloc]
+   1) out of memory in audit_log_start [kmalloc of struct audit_buffer]
+   2) out of memory in audit_log_move [alloc_skb]
+   3) suppressed due to audit_rate_limit
+   4) suppressed due to audit_backlog_limit
+*/
+static atomic_t    audit_lost = ATOMIC_INIT(0);
+
+/* The netlink socket. */
+static struct sock *audit_sock;
+
+/* There are two lists of audit buffers.  The txlist contains audit
+ * buffers that cannot be sent immediately to the netlink device because
+ * we are in an irq context (these are sent later in a tasklet).
+ *
+ * The second list is a list of pre-allocated audit buffers (if more
+ * than AUDIT_MAXFREE are in use, the audit buffer is freed instead of
+ * being placed on the freelist). */
+static spinlock_t  audit_txlist_lock = SPIN_LOCK_UNLOCKED;
+static spinlock_t  audit_freelist_lock = SPIN_LOCK_UNLOCKED;
+static int	   audit_freelist_count = 0;
+static LIST_HEAD(audit_txlist);
+static LIST_HEAD(audit_freelist);
+
+/* There are three lists of rules -- one to search at task creation
+ * time, one to search at syscall entry time, and another to search at
+ * syscall exit time. */
+static LIST_HEAD(audit_tsklist);
+static LIST_HEAD(audit_entlist);
+static LIST_HEAD(audit_extlist);
+
+/* The netlink socket is only to be read by 1 CPU, which lets us assume
+ * that list additions and deletions never happen simultaneiously in
+ * auditsc.c */
+static DECLARE_MUTEX(audit_netlink_sem);
+
+/* AUDIT_BUFSIZ is the size of the temporary buffer used for formatting
+ * audit records.  Since printk uses a 1024 byte buffer, this buffer
+ * should be at least that large. */
+#define AUDIT_BUFSIZ 1024
+
+/* AUDIT_MAXFREE is the number of empty audit_buffers we keep on the
+ * audit_freelist.  Doing so eliminates many kmalloc/kfree calls. */
+#define AUDIT_MAXFREE  (2*NR_CPUS)
+
+/* The audit_buffer is used when formatting an audit record.  The caller
+ * locks briefly to get the record off the freelist or to allocate the
+ * buffer, and locks briefly to send the buffer to the netlink layer or
+ * to place it on a transmit queue.  Multiple audit_buffers can be in
+ * use simultaneously. */
+struct audit_buffer {
+	struct list_head     list;
+	struct sk_buff_head  sklist;	/* formatted skbs ready to send */
+	struct audit_context *ctx;	/* NULL or associated context */
+	int		     len;	/* used area of tmp */
+	char		     tmp[AUDIT_BUFSIZ];
+
+				/* Pointer to header and contents */
+	struct nlmsghdr      *nlh;
+	int		     total;
+	int		     type;
+	int		     pid;
+	int		     count; /* Times requeued */
+};
+
+struct audit_entry {
+	struct list_head  list;
+	struct audit_rule rule;
+};
+
+static void audit_panic(const char *message)
+{
+	switch (audit_failure)
+	{
+	case AUDIT_FAIL_SILENT:
+		break;
+	case AUDIT_FAIL_PRINTK:
+		printk(KERN_ERR "audit: %s\n", message);
+		break;
+	case AUDIT_FAIL_PANIC:
+		panic(message);
+		break;
+	}
+}
+
+static inline int audit_rate_check(void)
+{
+	static unsigned long	last_check = 0;
+	static int		messages   = 0;
+	static spinlock_t	lock	   = SPIN_LOCK_UNLOCKED;
+	unsigned long		flags;
+	unsigned long		now;
+	unsigned long		elapsed;
+	int			retval	   = 0;
+
+	if (!audit_rate_limit) return 1;
+
+	spin_lock_irqsave(&lock, flags);
+	if (++messages < audit_rate_limit) {
+		retval = 1;
+	} else {
+		now     = jiffies;
+		elapsed = now - last_check;
+		if (elapsed > HZ) {
+			last_check = now;
+			messages   = 0;
+			retval     = 1;
+		}
+	}
+	spin_unlock_irqrestore(&lock, flags);
+
+	return retval;
+}
+
+/* Emit at least 1 message per second, even if audit_rate_check is
+ * throttling. */
+void audit_log_lost(const char *message)
+{
+	static unsigned long	last_msg = 0;
+	static spinlock_t	lock     = SPIN_LOCK_UNLOCKED;
+	unsigned long		flags;
+	unsigned long		now;
+	int			print;
+
+	atomic_inc(&audit_lost);
+
+	print = (audit_failure == AUDIT_FAIL_PANIC || !audit_rate_limit);
+
+	if (!print) {
+		spin_lock_irqsave(&lock, flags);
+		now = jiffies;
+		if (now - last_msg > HZ) {
+			print = 1;
+			last_msg = now;
+		}
+		spin_unlock_irqrestore(&lock, flags);
+	}
+
+	if (print) {
+		printk(KERN_WARNING
+		       "audit: audit_lost=%d audit_backlog=%d"
+		       " audit_rate_limit=%d audit_backlog_limit=%d\n",
+		       atomic_read(&audit_lost),
+		       atomic_read(&audit_backlog),
+		       audit_rate_limit,
+		       audit_backlog_limit);
+		audit_panic(message);
+	}
+
+}
+
+int audit_set_rate_limit(int limit)
+{
+	int old		 = audit_rate_limit;
+	audit_rate_limit = limit;
+	audit_log(current->audit_context, "audit_rate_limit=%d old=%d",
+		  audit_rate_limit, old);
+	return old;
+}
+
+int audit_set_backlog_limit(int limit)
+{
+	int old		 = audit_backlog_limit;
+	audit_backlog_limit = limit;
+	audit_log(current->audit_context, "audit_backlog_limit=%d old=%d",
+		  audit_backlog_limit, old);
+	return old;
+}
+
+int audit_set_enabled(int state)
+{
+	int old		 = audit_enabled;
+	if (state != 0 && state != 1)
+		return -EINVAL;
+	audit_enabled = state;
+	audit_log(current->audit_context, "audit_enabled=%d old=%d",
+		  audit_enabled, old);
+	return old;
+}
+
+int audit_set_failure(int state)
+{
+	int old		 = audit_failure;
+	if (state != AUDIT_FAIL_SILENT
+	    && state != AUDIT_FAIL_PRINTK
+	    && state != AUDIT_FAIL_PANIC)
+		return -EINVAL;
+	audit_failure = state;
+	audit_log(current->audit_context, "audit_failure=%d old=%d",
+		  audit_failure, old);
+	return old;
+}
+
+#ifdef CONFIG_NET
+void audit_send_reply(int pid, int seq, int type, int done, int multi,
+		      void *payload, int size)
+{
+	struct sk_buff	*skb;
+	struct nlmsghdr	*nlh;
+	int		len = NLMSG_SPACE(size);
+	void		*data;
+	int		flags = multi ? NLM_F_MULTI : 0;
+	int		t     = done  ? NLMSG_DONE  : type;
+
+	skb = alloc_skb(len, GFP_KERNEL);
+	if (!skb)
+		goto nlmsg_failure;
+
+	nlh		 = NLMSG_PUT(skb, pid, seq, t, len - sizeof(*nlh));
+	nlh->nlmsg_flags = flags;
+	data		 = NLMSG_DATA(nlh);
+	memcpy(data, payload, size);
+	netlink_unicast(audit_sock, skb, pid, MSG_DONTWAIT);
+	return;
+
+nlmsg_failure:			/* Used by NLMSG_PUT */
+	if (skb)
+		kfree_skb(skb);
+}
+
+static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
+{
+	u32			uid, pid, seq;
+	void			*data;
+	struct audit_status	*status_get, status_set;
+	struct audit_login	*login;
+	int			err = 0;
+	struct audit_buffer	*ab;
+
+	pid  = NETLINK_CREDS(skb)->pid;
+	uid  = NETLINK_CREDS(skb)->uid;
+	seq  = nlh->nlmsg_seq;
+	data = NLMSG_DATA(nlh);
+
+	switch (nlh->nlmsg_type) {
+	case AUDIT_GET:
+		status_set.enabled	 = audit_enabled;
+		status_set.failure	 = audit_failure;
+		status_set.pid		 = audit_pid;
+		status_set.rate_limit	 = audit_rate_limit;
+		status_set.backlog_limit = audit_backlog_limit;
+		status_set.lost		 = atomic_read(&audit_lost);
+		status_set.backlog	 = atomic_read(&audit_backlog);
+		audit_send_reply(pid, seq, AUDIT_GET, 0, 0,
+				 &status_set, sizeof(status_set));
+		break;
+	case AUDIT_SET:
+		if (!capable(CAP_SYS_ADMIN))
+			return -EPERM;
+		status_get   = (struct audit_status *)data;
+		if (status_get->mask & AUDIT_STATUS_ENABLED) {
+			err = audit_set_enabled(status_get->enabled);
+			if (err < 0) return err;
+		}
+		if (status_get->mask & AUDIT_STATUS_FAILURE) {
+			err = audit_set_failure(status_get->failure);
+			if (err < 0) return err;
+		}
+		if (status_get->mask & AUDIT_STATUS_PID) {
+			int old   = audit_pid;
+			audit_pid = status_get->pid;
+			audit_log(current->audit_context,
+				  "audit_pid=%d old=%d", audit_pid, old);
+		}
+		if (status_get->mask & AUDIT_STATUS_RATE_LIMIT)
+			audit_set_rate_limit(status_get->rate_limit);
+		if (status_get->mask & AUDIT_STATUS_BACKLOG_LIMIT)
+			audit_set_backlog_limit(status_get->backlog_limit);
+		break;
+	case AUDIT_USER:
+		ab = audit_log_start(NULL);
+		if (!ab)
+			break;	/* audit_panic has been called */
+		audit_log_format(ab,
+				 "user pid=%d uid=%d length=%d msg='%.1024s'",
+				 pid, uid,
+				 (int)(nlh->nlmsg_len
+				       - ((char *)data - (char *)nlh)),
+				 (char *)data);
+		ab->type = AUDIT_USER;
+		ab->pid  = pid;
+		audit_log_end(ab);
+		break;
+	case AUDIT_LOGIN:
+		if (!capable(CAP_SYS_ADMIN))
+			return -EPERM;
+		login = (struct audit_login *)data;
+		ab = audit_log_start(NULL);
+		if (ab) {
+			audit_log_format(ab, "login pid=%d uid=%d loginuid=%d"
+					 " length=%d msg='%.1024s'",
+					 pid, uid,
+					 login->loginuid,
+					 login->msglen,
+					 login->msg);
+			ab->type = AUDIT_LOGIN;
+			ab->pid  = pid;
+			audit_log_end(ab);
+		}
+#ifdef CONFIG_AUDITSYSCALL
+		err = audit_set_loginuid(current->audit_context,
+					 login->loginuid);
+#endif
+		break;
+	case AUDIT_LIST:
+	case AUDIT_ADD:
+	case AUDIT_DEL:
+#ifdef CONFIG_AUDITSYSCALL
+		err = audit_receive_filter(nlh->nlmsg_type, pid, uid, seq,
+					   data);
+#else
+		err = -EOPNOTSUPP;
+#endif
+		break;
+	default:
+		err = -EINVAL;
+		break;
+	}
+
+	return err < 0 ? err : 0;
+}
+
+/* Get message from skb (based on rtnetlink_rcv_skb).  Each message is
+ * processed by audit_receive_msg.  Malformed skbs with wrong length are
+ * discarded silently.  */
+static int audit_receive_skb(struct sk_buff *skb)
+{
+	int		err;
+	struct nlmsghdr	*nlh;
+	u32		rlen;
+
+	while (skb->len >= NLMSG_SPACE(0)) {
+		nlh = (struct nlmsghdr *)skb->data;
+		if (nlh->nlmsg_len < sizeof(*nlh) || skb->len < nlh->nlmsg_len)
+			return 0;
+		rlen = NLMSG_ALIGN(nlh->nlmsg_len);
+		if (rlen > skb->len)
+			rlen = skb->len;
+		if ((err = audit_receive_msg(skb, nlh))) {
+			netlink_ack(skb, nlh, -err);
+		} else if (nlh->nlmsg_flags & NLM_F_ACK)
+			netlink_ack(skb, nlh, 0);
+		skb_pull(skb, rlen);
+	}
+	return 0;
+}
+
+/* Receive messages from netlink socket. */
+static void audit_receive(struct sock *sk, int length)
+{
+	struct sk_buff  *skb;
+
+	if (down_trylock(&audit_netlink_sem))
+		return;
+
+				/* FIXME: this must not cause starvation */
+	while ((skb = skb_dequeue(&sk->sk_receive_queue))) {
+		if (audit_receive_skb(skb) && skb->len)
+			skb_queue_head(&sk->sk_receive_queue, skb);
+		else
+			kfree_skb(skb);
+	}
+	up(&audit_netlink_sem);
+}
+
+/* Move data from tmp buffer into an skb.  This is an extra copy, and
+ * that is unfortunate.  However, the copy will only occur when a record
+ * is being written to user space, which is already a high-overhead
+ * operation.  (Elimination of the copy is possible, for example, by
+ * writing directly into a pre-allocated skb, at the cost of wasting
+ * memory. */
+static void audit_log_move(struct audit_buffer *ab)
+{
+	struct sk_buff	*skb;
+	char		*start;
+	int		extra = ab->nlh ? 0 : NLMSG_SPACE(0);
+
+	skb = skb_peek(&ab->sklist);
+	if (!skb || skb_tailroom(skb) <= ab->len + extra) {
+		skb = alloc_skb(2 * ab->len + extra, GFP_ATOMIC);
+		if (!skb) {
+			ab->len = 0; /* Lose information in ab->tmp */
+			audit_log_lost("out of memory in audit_log_move");
+			return;
+		}
+		__skb_queue_tail(&ab->sklist, skb);
+		if (!ab->nlh)
+			ab->nlh = (struct nlmsghdr *)skb_put(skb,
+							     NLMSG_SPACE(0));
+	}
+	start = skb_put(skb, ab->len);
+	memcpy(start, ab->tmp, ab->len);
+	ab->len = 0;
+}
+
+/* Iterate over the skbuff in the audit_buffer, sending their contents
+ * to user space. */
+static inline int audit_log_drain(struct audit_buffer *ab)
+{
+	struct sk_buff *skb;
+
+	while ((skb = skb_dequeue(&ab->sklist))) {
+		int retval = 0;
+
+		if (audit_pid) {
+			if (ab->nlh) {
+				ab->nlh->nlmsg_len   = ab->total;
+				ab->nlh->nlmsg_type  = ab->type;
+				ab->nlh->nlmsg_flags = 0;
+				ab->nlh->nlmsg_seq   = 0;
+				ab->nlh->nlmsg_pid   = ab->pid;
+			}
+			skb_get(skb); /* because netlink_* frees */
+			retval = netlink_unicast(audit_sock, skb, audit_pid,
+						 MSG_DONTWAIT);
+		}
+		if (retval == -EAGAIN && ab->count < 5) {
+			++ab->count;
+			audit_log_end_irq(ab);
+			return 1;
+		}
+		if (retval < 0) {
+			if (retval == -ECONNREFUSED) {
+				printk(KERN_ERR
+				       "audit: *NO* daemon at audit_pid=%d\n",
+				       audit_pid);
+				audit_pid = 0;
+			} else
+				audit_log_lost("netlink socket too busy");
+		}
+		if (!audit_pid) { /* No daemon */
+			int offset = ab->nlh ? NLMSG_SPACE(0) : 0;
+			int len    = skb->len - offset;
+			printk(KERN_ERR "%*.*s\n",
+			       len, len, skb->data + offset);
+		}
+		kfree_skb(skb);
+		ab->nlh = NULL;
+	}
+	return 0;
+}
+
+/* Initialize audit support at boot time. */
+int __init audit_init(void)
+{
+	printk(KERN_INFO "audit: initializing netlink socket (%s)\n",
+	       audit_default ? "enabled" : "disabled");
+	audit_sock = netlink_kernel_create(NETLINK_AUDIT, audit_receive);
+	if (!audit_sock)
+		audit_panic("cannot initialize netlink socket");
+
+	audit_initialized = 1;
+	audit_enabled = audit_default;
+	audit_log(NULL, "initialized");
+	return 0;
+}
+
+#else
+/* Without CONFIG_NET, we have no skbuffs.  For now, print what we have
+ * in the buffer. */
+static void audit_log_move(struct audit_buffer *ab)
+{
+	printk(KERN_ERR "%*.*s\n", ab->len, ab->len, ab->tmp);
+	ab->len = 0;
+}
+
+static inline int audit_log_drain(struct audit_buffer *ab)
+{
+	return 0;
+}
+
+/* Initialize audit support at boot time. */
+int __init audit_init(void)
+{
+	printk(KERN_INFO "audit: initializing WITHOUT netlink support\n");
+	audit_sock = NULL;
+	audit_pid  = 0;
+
+	audit_initialized = 1;
+	audit_enabled = audit_default;
+	audit_log(NULL, "initialized");
+	return 0;
+}
+#endif
+
+__initcall(audit_init);
+
+/* Process kernel command-line parameter at boot time.  audit=0 or audit=1. */
+static int __init audit_enable(char *str)
+{
+	audit_default = !!simple_strtol(str, NULL, 0);
+	printk(KERN_INFO "audit: %s%s\n",
+	       audit_default ? "enabled" : "disabled",
+	       audit_initialized ? "" : " (after initialization)");
+	if (audit_initialized)
+		audit_enabled = audit_default;
+	return 0;
+}
+
+__setup("audit=", audit_enable);
+
+
+/* Obtain an audit buffer.  This routine does locking to obtain the
+ * audit buffer, but then no locking is required for calls to
+ * audit_log_*format.  If the tsk is a task that is currently in a
+ * syscall, then the syscall is marked as auditable and an audit record
+ * will be written at syscall exit.  If there is no associated task, tsk
+ * should be NULL. */
+struct audit_buffer *audit_log_start(struct audit_context *ctx)
+{
+	struct audit_buffer	*ab	= NULL;
+	unsigned long		flags;
+	struct timespec		t;
+	int			serial	= 0;
+
+	if (!audit_initialized)
+		return NULL;
+
+	if (audit_backlog_limit
+	    && atomic_read(&audit_backlog) > audit_backlog_limit) {
+		if (audit_rate_check())
+			printk(KERN_WARNING
+			       "audit: audit_backlog=%d > "
+			       "audit_backlog_limit=%d\n",
+			       atomic_read(&audit_backlog),
+			       audit_backlog_limit);
+		audit_log_lost("backlog limit exceeded");
+		return NULL;
+	}
+
+	spin_lock_irqsave(&audit_freelist_lock, flags);
+	if (!list_empty(&audit_freelist)) {
+		ab = list_entry(audit_freelist.next,
+				struct audit_buffer, list);
+		list_del(&ab->list);
+		--audit_freelist_count;
+	}
+	spin_unlock_irqrestore(&audit_freelist_lock, flags);
+
+	if (!ab)
+		ab = kmalloc(sizeof(*ab), GFP_ATOMIC);
+	if (!ab)
+		audit_log_lost("audit: out of memory in audit_log_start");
+	if (!ab)
+		return NULL;
+
+	atomic_inc(&audit_backlog);
+	skb_queue_head_init(&ab->sklist);
+
+	ab->ctx   = ctx;
+	ab->len   = 0;
+	ab->nlh   = NULL;
+	ab->total = 0;
+	ab->type  = AUDIT_KERNEL;
+	ab->pid   = 0;
+	ab->count = 0;
+
+#ifdef CONFIG_AUDITSYSCALL
+	if (ab->ctx)
+		audit_get_stamp(ab->ctx, &t, &serial);
+	else
+#endif
+		t = CURRENT_TIME;
+
+	audit_log_format(ab, "audit(%lu.%03lu:%u): ",
+			 t.tv_sec, t.tv_nsec/1000000, serial);
+	return ab;
+}
+
+
+/* Format an audit message into the audit buffer.  If there isn't enough
+ * room in the audit buffer, more room will be allocated and vsnprint
+ * will be called a second time.  Currently, we assume that a printk
+ * can't format message larger than 1024 bytes, so we don't either. */
+static void audit_log_vformat(struct audit_buffer *ab, const char *fmt,
+			      va_list args)
+{
+	int len, avail;
+
+	if (!ab)
+		return;
+
+	avail = sizeof(ab->tmp) - ab->len;
+	if (avail <= 0) {
+		audit_log_move(ab);
+		avail = sizeof(ab->tmp) - ab->len;
+	}
+	len   = vsnprintf(ab->tmp + ab->len, avail, fmt, args);
+	if (len >= avail) {
+		/* The printk buffer is 1024 bytes long, so if we get
+		 * here and AUDIT_BUFSIZ is at least 1024, then we can
+		 * log everything that printk could have logged. */
+		audit_log_move(ab);
+		avail = sizeof(ab->tmp) - ab->len;
+		len   = vsnprintf(ab->tmp + ab->len, avail, fmt, args);
+	}
+	ab->len   += (len < avail) ? len : avail;
+	ab->total += (len < avail) ? len : avail;
+}
+
+/* Format a message into the audit buffer.  All the work is done in
+ * audit_log_vformat. */
+void audit_log_format(struct audit_buffer *ab, const char *fmt, ...)
+{
+	va_list args;
+
+	if (!ab)
+		return;
+	va_start(args, fmt);
+	audit_log_vformat(ab, fmt, args);
+	va_end(args);
+}
+
+/* This is a helper-function to print the d_path without using a static
+ * buffer or allocating another buffer in addition to the one in
+ * audit_buffer. */
+void audit_log_d_path(struct audit_buffer *ab, const char *prefix,
+		      struct dentry *dentry, struct vfsmount *vfsmnt)
+{
+	char *p;
+	int  len, avail;
+
+	if (prefix) audit_log_format(ab, " %s", prefix);
+
+	if (ab->len > 128)
+		audit_log_move(ab);
+	avail = sizeof(ab->tmp) - ab->len;
+	p = d_path(dentry, vfsmnt, ab->tmp + ab->len, avail);
+	if (p == ERR_PTR(-ENAMETOOLONG)) {
+		/* FIXME: can we save some information here? */
+		audit_log_format(ab, "<toolong>");
+	} else {
+				/* path isn't at start of buffer */
+		len	   = (ab->tmp + sizeof(ab->tmp) - 1) - p;
+		memmove(ab->tmp + ab->len, p, len);
+		ab->len   += len;
+		ab->total += len;
+	}
+}
+
+/* Remove queued messages from the audit_txlist and send them to userspace. */
+static void audit_tasklet_handler(unsigned long arg)
+{
+	LIST_HEAD(list);
+	struct audit_buffer *ab;
+	unsigned long	    flags;
+
+	spin_lock_irqsave(&audit_txlist_lock, flags);
+	list_splice_init(&audit_txlist, &list);
+	spin_unlock_irqrestore(&audit_txlist_lock, flags);
+
+	while (!list_empty(&list)) {
+		ab = list_entry(list.next, struct audit_buffer, list);
+		list_del(&ab->list);
+		audit_log_end_fast(ab);
+	}
+}
+
+static DECLARE_TASKLET(audit_tasklet, audit_tasklet_handler, 0);
+
+/* The netlink_* functions cannot be called inside an irq context, so
+ * the audit buffer is places on a queue and a tasklet is scheduled to
+ * remove them from the queue outside the irq context.  May be called in
+ * any context. */
+void audit_log_end_irq(struct audit_buffer *ab)
+{
+	unsigned long flags;
+
+	if (!ab)
+		return;
+	spin_lock_irqsave(&audit_txlist_lock, flags);
+	list_add_tail(&ab->list, &audit_txlist);
+	spin_unlock_irqrestore(&audit_txlist_lock, flags);
+
+	tasklet_schedule(&audit_tasklet);
+}
+
+/* Send the message in the audit buffer directly to user space.  May not
+ * be called in an irq context. */
+void audit_log_end_fast(struct audit_buffer *ab)
+{
+	unsigned long flags;
+
+	BUG_ON(in_irq());
+	if (!ab)
+		return;
+	if (!audit_rate_check()) {
+		audit_log_lost("rate limit exceeded");
+	} else {
+		audit_log_move(ab);
+		if (audit_log_drain(ab))
+			return;
+	}
+
+	atomic_dec(&audit_backlog);
+	spin_lock_irqsave(&audit_freelist_lock, flags);
+	if (++audit_freelist_count > AUDIT_MAXFREE)
+		kfree(ab);
+	else
+		list_add(&ab->list, &audit_freelist);
+	spin_unlock_irqrestore(&audit_freelist_lock, flags);
+}
+
+/* Send or queue the message in the audit buffer, depending on the
+ * current context.  (A convenience function that may be called in any
+ * context.) */
+void audit_log_end(struct audit_buffer *ab)
+{
+	if (in_irq())
+		audit_log_end_irq(ab);
+	else
+		audit_log_end_fast(ab);
+}
+
+/* Log an audit record.  This is a convenience function that calls
+ * audit_log_start, audit_log_vformat, and audit_log_end.  It may be
+ * called in any context. */
+void audit_log(struct audit_context *ctx, const char *fmt, ...)
+{
+	struct audit_buffer *ab;
+	va_list args;
+
+	ab = audit_log_start(ctx);
+	if (ab) {
+		va_start(args, fmt);
+		audit_log_vformat(ab, fmt, args);
+		va_end(args);
+		audit_log_end(ab);
+	}
+}
+
+EXPORT_SYMBOL_GPL(audit_set_rate_limit);
+EXPORT_SYMBOL_GPL(audit_set_backlog_limit);
+EXPORT_SYMBOL_GPL(audit_set_enabled);
+EXPORT_SYMBOL_GPL(audit_set_failure);
+
+EXPORT_SYMBOL_GPL(audit_log_start);
+EXPORT_SYMBOL_GPL(audit_log_format);
+EXPORT_SYMBOL_GPL(audit_log_end_irq);
+EXPORT_SYMBOL_GPL(audit_log_end_fast);
+EXPORT_SYMBOL_GPL(audit_log_end);
+EXPORT_SYMBOL_GPL(audit_log);
+EXPORT_SYMBOL_GPL(audit_log_d_path);
--- diff/kernel/auditsc.c	1970-01-01 01:00:00.000000000 +0100
+++ source/kernel/auditsc.c	2004-04-21 10:45:36.000230632 +0100
@@ -0,0 +1,922 @@
+/* auditsc.c -- System-call auditing support -*- linux-c -*-
+ * Handles all system-call specific auditing features.
+ *
+ * Copyright 2003-2004 Red Hat Inc., Durham, North Carolina.
+ * All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Written by Rickard E. (Rik) Faith <faith@redhat.com>
+ *
+ * Many of the ideas implemented here are from Stephen C. Tweedie,
+ * especially the idea of avoiding a copy by using getname.
+ *
+ * The method for actual interception of syscall entry and exit (not in
+ * this file -- see entry.S) is based on a GPL'd patch written by
+ * okir@suse.de and Copyright 2003 SuSE Linux AG.
+ *
+ */
+
+#include <linux/init.h>
+#include <asm/atomic.h>
+#include <asm/types.h>
+#include <linux/mm.h>
+#include <linux/module.h>
+
+#include <linux/audit.h>
+#include <linux/personality.h>
+#include <linux/time.h>
+#include <asm/unistd.h>
+
+/* 0 = no checking
+   1 = put_count checking
+   2 = verbose put_count checking
+*/
+#define AUDIT_DEBUG 0
+
+/* No syscall auditing will take place unless audit_enabled != 0. */
+extern int audit_enabled;
+
+/* AUDIT_NAMES is the number of slots we reserve in the audit_context
+ * for saving names from getname(). */
+#define AUDIT_NAMES    20
+
+/* AUDIT_NAMES_RESERVED is the number of slots we reserve in the
+ * audit_context from being used for nameless inodes from
+ * path_lookup. */
+#define AUDIT_NAMES_RESERVED 7
+
+/* At task start time, the audit_state is set in the audit_context using
+   a per-task filter.  At syscall entry, the audit_state is augmented by
+   the syscall filter. */
+enum audit_state {
+	AUDIT_DISABLED,		/* Do not create per-task audit_context.
+				 * No syscall-specific audit records can
+				 * be generated. */
+	AUDIT_SETUP_CONTEXT,	/* Create the per-task audit_context,
+				 * but don't necessarily fill it in at
+				 * syscall entry time (i.e., filter
+				 * instead). */
+	AUDIT_BUILD_CONTEXT,	/* Create the per-task audit_context,
+				 * and always fill it in at syscall
+				 * entry time.  This makes a full
+				 * syscall record available if some
+				 * other part of the kernel decides it
+				 * should be recorded. */
+	AUDIT_RECORD_CONTEXT	/* Create the per-task audit_context,
+				 * always fill it in at syscall entry
+				 * time, and always write out the audit
+				 * record at syscall exit time.  */
+};
+
+/* When fs/namei.c:getname() is called, we store the pointer in name and
+ * we don't let putname() free it (instead we free all of the saved
+ * pointers at syscall exit time).
+ *
+ * Further, in fs/namei.c:path_lookup() we store the inode and device. */
+struct audit_names {
+	const char	*name;
+	unsigned long	ino;
+	dev_t		rdev;
+};
+
+/* The per-task audit context. */
+struct audit_context {
+	int		    in_syscall;	/* 1 if task is in a syscall */
+	enum audit_state    state;
+	unsigned int	    serial;     /* serial number for record */
+	struct timespec	    ctime;      /* time of syscall entry */
+	uid_t		    loginuid;   /* login uid (identity) */
+	int		    major;      /* syscall number */
+	unsigned long	    argv[4];    /* syscall arguments */
+	int		    return_valid; /* return code is valid */
+	int		    return_code;/* syscall return code */
+	int		    auditable;  /* 1 if record should be written */
+	int		    name_count;
+	struct audit_names  names[AUDIT_NAMES];
+	struct audit_context *previous; /* For nested syscalls */
+
+				/* Save things to print about task_struct */
+	pid_t		    pid;
+	uid_t		    uid, euid, suid, fsuid;
+	gid_t		    gid, egid, sgid, fsgid;
+	unsigned long	    personality;
+
+#if AUDIT_DEBUG
+	int		    put_count;
+	int		    ino_count;
+#endif
+};
+
+				/* Public API */
+/* There are three lists of rules -- one to search at task creation
+ * time, one to search at syscall entry time, and another to search at
+ * syscall exit time. */
+static LIST_HEAD(audit_tsklist);
+static LIST_HEAD(audit_entlist);
+static LIST_HEAD(audit_extlist);
+
+struct audit_entry {
+	struct list_head  list;
+	struct rcu_head   rcu;
+	struct audit_rule rule;
+};
+
+/* Check to see if two rules are identical.  It is called from
+ * audit_del_rule during AUDIT_DEL. */
+static int audit_compare_rule(struct audit_rule *a, struct audit_rule *b)
+{
+	int i;
+
+	if (a->flags != b->flags)
+		return 1;
+
+	if (a->action != b->action)
+		return 1;
+
+	if (a->field_count != b->field_count)
+		return 1;
+
+	for (i = 0; i < a->field_count; i++) {
+		if (a->fields[i] != b->fields[i]
+		    || a->values[i] != b->values[i])
+			return 1;
+	}
+
+	for (i = 0; i < AUDIT_BITMASK_SIZE; i++)
+		if (a->mask[i] != b->mask[i])
+			return 1;
+
+	return 0;
+}
+
+/* Note that audit_add_rule and audit_del_rule are called via
+ * audit_receive() in audit.c, and are protected by
+ * audit_netlink_sem. */
+static inline int audit_add_rule(struct audit_entry *entry,
+				 struct list_head *list)
+{
+	if (entry->rule.flags & AUDIT_PREPEND) {
+		entry->rule.flags &= ~AUDIT_PREPEND;
+		list_add_rcu(&entry->list, list);
+	} else {
+		list_add_tail_rcu(&entry->list, list);
+	}
+	return 0;
+}
+
+static void audit_free_rule(void *arg)
+{
+	kfree(arg);
+}
+
+/* Note that audit_add_rule and audit_del_rule are called via
+ * audit_receive() in audit.c, and are protected by
+ * audit_netlink_sem. */
+static inline int audit_del_rule(struct audit_rule *rule,
+				 struct list_head *list)
+{
+	struct audit_entry  *e;
+
+	/* Do not use the _rcu iterator here, since this is the only
+	 * deletion routine. */
+	list_for_each_entry(e, list, list) {
+		if (!audit_compare_rule(rule, &e->rule)) {
+			list_del_rcu(&e->list);
+			call_rcu(&e->rcu, audit_free_rule, e);
+			return 0;
+		}
+	}
+	return -EFAULT;		/* No matching rule */
+}
+
+#ifdef CONFIG_NET
+/* Copy rule from user-space to kernel-space.  Called during
+ * AUDIT_ADD. */
+static int audit_copy_rule(struct audit_rule *d, struct audit_rule *s)
+{
+	int i;
+
+	if (s->action != AUDIT_NEVER
+	    && s->action != AUDIT_POSSIBLE
+	    && s->action != AUDIT_ALWAYS)
+		return -1;
+	if (s->field_count < 0 || s->field_count > AUDIT_MAX_FIELDS)
+		return -1;
+
+	d->flags	= s->flags;
+	d->action	= s->action;
+	d->field_count	= s->field_count;
+	for (i = 0; i < d->field_count; i++) {
+		d->fields[i] = s->fields[i];
+		d->values[i] = s->values[i];
+	}
+	for (i = 0; i < AUDIT_BITMASK_SIZE; i++) d->mask[i] = s->mask[i];
+	return 0;
+}
+
+int audit_receive_filter(int type, int pid, int uid, int seq, void *data)
+{
+	u32		   flags;
+	struct audit_entry *entry;
+	int		   err = 0;
+
+	switch (type) {
+	case AUDIT_LIST:
+		/* The *_rcu iterators not needed here because we are
+		   always called with audit_netlink_sem held. */
+		list_for_each_entry(entry, &audit_tsklist, list)
+			audit_send_reply(pid, seq, AUDIT_LIST, 0, 1,
+					 &entry->rule, sizeof(entry->rule));
+		list_for_each_entry(entry, &audit_entlist, list)
+			audit_send_reply(pid, seq, AUDIT_LIST, 0, 1,
+					 &entry->rule, sizeof(entry->rule));
+		list_for_each_entry(entry, &audit_extlist, list)
+			audit_send_reply(pid, seq, AUDIT_LIST, 0, 1,
+					 &entry->rule, sizeof(entry->rule));
+		audit_send_reply(pid, seq, AUDIT_LIST, 1, 1, NULL, 0);
+		break;
+	case AUDIT_ADD:
+		if (!capable(CAP_SYS_ADMIN))
+			return -EPERM;
+		if (!(entry = kmalloc(sizeof(*entry), GFP_KERNEL)))
+			return -ENOMEM;
+		if (audit_copy_rule(&entry->rule, data)) {
+			kfree(entry);
+			return -EINVAL;
+		}
+		flags = entry->rule.flags;
+		if (!err && (flags & AUDIT_PER_TASK))
+			err = audit_add_rule(entry, &audit_tsklist);
+		if (!err && (flags & AUDIT_AT_ENTRY))
+			err = audit_add_rule(entry, &audit_entlist);
+		if (!err && (flags & AUDIT_AT_EXIT))
+			err = audit_add_rule(entry, &audit_extlist);
+		break;
+	case AUDIT_DEL:
+		flags =((struct audit_rule *)data)->flags;
+		if (!err && (flags & AUDIT_PER_TASK))
+			err = audit_del_rule(data, &audit_tsklist);
+		if (!err && (flags & AUDIT_AT_ENTRY))
+			err = audit_del_rule(data, &audit_entlist);
+		if (!err && (flags & AUDIT_AT_EXIT))
+			err = audit_del_rule(data, &audit_extlist);
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	return err;
+}
+#endif
+
+/* Compare a task_struct with an audit_rule.  Return 1 on match, 0
+ * otherwise. */
+static int audit_filter_rules(struct task_struct *tsk,
+			      struct audit_rule *rule,
+			      struct audit_context *ctx,
+			      enum audit_state *state)
+{
+	int i, j;
+
+	for (i = 0; i < rule->field_count; i++) {
+		u32 field  = rule->fields[i] & ~AUDIT_NEGATE;
+		u32 value  = rule->values[i];
+		int result = 0;
+
+		switch (field) {
+		case AUDIT_PID:
+			result = (tsk->pid == value);
+			break;
+		case AUDIT_UID:
+			result = (tsk->uid == value);
+			break;
+		case AUDIT_EUID:
+			result = (tsk->euid == value);
+			break;
+		case AUDIT_SUID:
+			result = (tsk->suid == value);
+			break;
+		case AUDIT_FSUID:
+			result = (tsk->fsuid == value);
+			break;
+		case AUDIT_GID:
+			result = (tsk->gid == value);
+			break;
+		case AUDIT_EGID:
+			result = (tsk->egid == value);
+			break;
+		case AUDIT_SGID:
+			result = (tsk->sgid == value);
+			break;
+		case AUDIT_FSGID:
+			result = (tsk->fsgid == value);
+			break;
+		case AUDIT_PERS:
+			result = (tsk->personality == value);
+			break;
+
+		case AUDIT_EXIT:
+			if (ctx && ctx->return_valid)
+				result = (ctx->return_code == value);
+			break;
+		case AUDIT_SUCCESS:
+			if (ctx && ctx->return_valid)
+				result = (ctx->return_code >= 0);
+			break;
+		case AUDIT_DEVMAJOR:
+			if (ctx) {
+				for (j = 0; j < ctx->name_count; j++) {
+					if (MAJOR(ctx->names[j].rdev)==value) {
+						++result;
+						break;
+					}
+				}
+			}
+			break;
+		case AUDIT_DEVMINOR:
+			if (ctx) {
+				for (j = 0; j < ctx->name_count; j++) {
+					if (MINOR(ctx->names[j].rdev)==value) {
+						++result;
+						break;
+					}
+				}
+			}
+			break;
+		case AUDIT_INODE:
+			if (ctx) {
+				for (j = 0; j < ctx->name_count; j++) {
+					if (MINOR(ctx->names[j].ino)==value) {
+						++result;
+						break;
+					}
+				}
+			}
+			break;
+		case AUDIT_LOGINUID:
+			result = 0;
+			if (ctx)
+				result = (ctx->loginuid == value);
+			break;
+		case AUDIT_ARG0:
+		case AUDIT_ARG1:
+		case AUDIT_ARG2:
+		case AUDIT_ARG3:
+			if (ctx)
+				result = (ctx->argv[field-AUDIT_ARG0]==value);
+			break;
+		}
+
+		if (rule->fields[i] & AUDIT_NEGATE)
+			result = !result;
+		if (!result)
+			return 0;
+	}
+	switch (rule->action) {
+	case AUDIT_NEVER:    *state = AUDIT_DISABLED;	    break;
+	case AUDIT_POSSIBLE: *state = AUDIT_BUILD_CONTEXT;  break;
+	case AUDIT_ALWAYS:   *state = AUDIT_RECORD_CONTEXT; break;
+	}
+	return 1;
+}
+
+/* At process creation time, we can determine if system-call auditing is
+ * completely disabled for this task.  Since we only have the task
+ * structure at this point, we can only check uid and gid.
+ */
+static enum audit_state audit_filter_task(struct task_struct *tsk)
+{
+	struct audit_entry *e;
+	enum audit_state   state;
+
+	rcu_read_lock();
+	list_for_each_entry_rcu(e, &audit_tsklist, list) {
+		if (audit_filter_rules(tsk, &e->rule, NULL, &state)) {
+			rcu_read_unlock();
+			return state;
+		}
+	}
+	rcu_read_unlock();
+	return AUDIT_BUILD_CONTEXT;
+}
+
+/* At syscall entry and exit time, this filter is called if the
+ * audit_state is not low enough that auditing cannot take place, but is
+ * also not high enough that we already know we have to write and audit
+ * record (i.e., the state is AUDIT_SETUP_CONTEXT or  AUDIT_BUILD_CONTEXT).
+ */
+static enum audit_state audit_filter_syscall(struct task_struct *tsk,
+					     struct audit_context *ctx,
+					     struct list_head *list)
+{
+	struct audit_entry *e;
+	enum audit_state   state;
+	int		   word = AUDIT_WORD(ctx->major);
+	int		   bit  = AUDIT_BIT(ctx->major);
+
+	rcu_read_lock();
+	list_for_each_entry_rcu(e, list, list) {
+		if ((e->rule.mask[word] & bit) == bit
+ 		    && audit_filter_rules(tsk, &e->rule, ctx, &state)) {
+			rcu_read_unlock();
+			return state;
+		}
+	}
+	rcu_read_unlock();
+	return AUDIT_BUILD_CONTEXT;
+}
+
+/* This should be called with task_lock() held. */
+static inline struct audit_context *audit_get_context(struct task_struct *tsk,
+						      int return_valid,
+						      int return_code)
+{
+	struct audit_context *context = tsk->audit_context;
+
+	if (likely(!context))
+		return NULL;
+	context->return_valid = return_valid;
+	context->return_code  = return_code;
+
+	if (context->in_syscall && !context->auditable) {
+		enum audit_state state;
+		state = audit_filter_syscall(tsk, context, &audit_extlist);
+		if (state == AUDIT_RECORD_CONTEXT)
+			context->auditable = 1;
+	}
+
+	context->pid = tsk->pid;
+	context->uid = tsk->uid;
+	context->gid = tsk->gid;
+	context->euid = tsk->euid;
+	context->suid = tsk->suid;
+	context->fsuid = tsk->fsuid;
+	context->egid = tsk->egid;
+	context->sgid = tsk->sgid;
+	context->fsgid = tsk->fsgid;
+	context->personality = tsk->personality;
+	tsk->audit_context = NULL;
+	return context;
+}
+
+static inline void audit_free_names(struct audit_context *context)
+{
+	int i;
+
+#if AUDIT_DEBUG == 2
+	if (context->auditable
+	    ||context->put_count + context->ino_count != context->name_count) {
+		printk(KERN_ERR "audit.c:%d(:%d): major=%d in_syscall=%d"
+		       " name_count=%d put_count=%d"
+		       " ino_count=%d [NOT freeing]\n",
+		       __LINE__,
+		       context->serial, context->major, context->in_syscall,
+		       context->name_count, context->put_count,
+		       context->ino_count);
+		for (i = 0; i < context->name_count; i++)
+			printk(KERN_ERR "names[%d] = %p = %s\n", i,
+			       context->names[i].name,
+			       context->names[i].name);
+		dump_stack();
+		return;
+	}
+#endif
+#if AUDIT_DEBUG
+	context->put_count  = 0;
+	context->ino_count  = 0;
+#endif
+
+	for (i = 0; i < context->name_count; i++)
+		if (context->names[i].name)
+			__putname(context->names[i].name);
+	context->name_count = 0;
+}
+
+static inline void audit_zero_context(struct audit_context *context,
+				      enum audit_state state)
+{
+	uid_t loginuid = context->loginuid;
+
+	memset(context, 0, sizeof(*context));
+	context->state      = state;
+	context->loginuid   = loginuid;
+}
+
+static inline struct audit_context *audit_alloc_context(enum audit_state state)
+{
+	struct audit_context *context;
+
+	if (!(context = kmalloc(sizeof(*context), GFP_KERNEL)))
+		return NULL;
+	audit_zero_context(context, state);
+	return context;
+}
+
+/* Filter on the task information and allocate a per-task audit context
+ * if necessary.  Doing so turns on system call auditing for the
+ * specified task.  This is called from copy_process, so no lock is
+ * needed. */
+int audit_alloc(struct task_struct *tsk)
+{
+	struct audit_context *context;
+	enum audit_state     state;
+
+	if (likely(!audit_enabled))
+		return 0; /* Return if not auditing. */
+
+	state = audit_filter_task(tsk);
+	if (likely(state == AUDIT_DISABLED))
+		return 0;
+
+	if (!(context = audit_alloc_context(state))) {
+		audit_log_lost("out of memory in audit_alloc");
+		return -ENOMEM;
+	}
+
+				/* Preserve login uid */
+	context->loginuid = -1;
+	if (tsk->audit_context)
+		context->loginuid = tsk->audit_context->loginuid;
+
+	tsk->audit_context  = context;
+	set_tsk_thread_flag(tsk, TIF_SYSCALL_AUDIT);
+	return 0;
+}
+
+static inline void audit_free_context(struct audit_context *context)
+{
+	struct audit_context *previous;
+	int		     count = 0;
+
+	do {
+		previous = context->previous;
+		if (previous || (count &&  count < 10)) {
+			++count;
+			printk(KERN_ERR "audit(:%d): major=%d name_count=%d:"
+			       " freeing multiple contexts (%d)\n",
+			       context->serial, context->major,
+			       context->name_count, count);
+		}
+		audit_free_names(context);
+		kfree(context);
+		context  = previous;
+	} while (context);
+	if (count >= 10)
+		printk(KERN_ERR "audit: freed %d contexts\n", count);
+}
+
+static void audit_log_exit(struct audit_context *context)
+{
+	int i;
+	struct audit_buffer *ab;
+
+	ab = audit_log_start(context);
+	if (!ab)
+		return;		/* audit_panic has been called */
+	audit_log_format(ab, "syscall=%d", context->major);
+	if (context->personality != PER_LINUX)
+		audit_log_format(ab, " per=%lx", context->personality);
+	if (context->return_valid)
+		audit_log_format(ab, " exit=%u", context->return_code);
+	audit_log_format(ab,
+		  " a0=%lx a1=%lx a2=%lx a3=%lx items=%d"
+		  " pid=%d loginuid=%d uid=%d gid=%d"
+		  " euid=%d suid=%d fsuid=%d"
+		  " egid=%d sgid=%d fsgid=%d",
+		  context->argv[0],
+		  context->argv[1],
+		  context->argv[2],
+		  context->argv[3],
+		  context->name_count,
+		  context->pid,
+		  context->loginuid,
+		  context->uid,
+		  context->gid,
+		  context->euid, context->suid, context->fsuid,
+		  context->egid, context->sgid, context->fsgid);
+	audit_log_end(ab);
+	for (i = 0; i < context->name_count; i++) {
+		ab = audit_log_start(context);
+		if (!ab)
+			continue; /* audit_panic has been called */
+		audit_log_format(ab, "item=%d", i);
+		if (context->names[i].name)
+			audit_log_format(ab, " name=%s",
+					 context->names[i].name);
+		if (context->names[i].ino != (unsigned long)-1)
+			audit_log_format(ab, " inode=%lu",
+					 context->names[i].ino);
+		/* FIXME: should use format_dev_t, but ab structure is
+		 * opaque. */
+		if (context->names[i].rdev != -1)
+			audit_log_format(ab, " dev=%02x:%02x",
+					 MAJOR(context->names[i].rdev),
+					 MINOR(context->names[i].rdev));
+		audit_log_end(ab);
+	}
+}
+
+/* Free a per-task audit context.  Called from copy_process and
+ * __put_task_struct. */
+void audit_free(struct task_struct *tsk)
+{
+	struct audit_context *context;
+
+	task_lock(tsk);
+	context = audit_get_context(tsk, 0, 0);
+	task_unlock(tsk);
+
+	if (likely(!context))
+		return;
+
+	/* Check for system calls that do not go through the exit
+	 * function (e.g., exit_group), then free context block. */
+	if (context->in_syscall && context->auditable)
+		audit_log_exit(context);
+
+	audit_free_context(context);
+}
+
+/* Compute a serial number for the audit record.  Audit records are
+ * written to user-space as soon as they are generated, so a complete
+ * audit record may be written in several pieces.  The timestamp of the
+ * record and this serial number are used by the user-space daemon to
+ * determine which pieces belong to the same audit record.  The
+ * (timestamp,serial) tuple is unique for each syscall and is live from
+ * syscall entry to syscall exit.
+ *
+ * Atomic values are only guaranteed to be 24-bit, so we count down.
+ *
+ * NOTE: Another possibility is to store the formatted records off the
+ * audit context (for those records that have a context), and emit them
+ * all at syscall exit.  However, this could delay the reporting of
+ * significant errors until syscall exit (or never, if the system
+ * halts). */
+static inline unsigned int audit_serial(void)
+{
+	static atomic_t serial = ATOMIC_INIT(0xffffff);
+	unsigned int a, b;
+
+	do {
+		a = atomic_read(&serial);
+		if (atomic_dec_and_test(&serial))
+			atomic_set(&serial, 0xffffff);
+		b = atomic_read(&serial);
+	} while (b != a - 1);
+
+	return 0xffffff - b;
+}
+
+/* Fill in audit context at syscall entry.  This only happens if the
+ * audit context was created when the task was created and the state or
+ * filters demand the audit context be built.  If the state from the
+ * per-task filter or from the per-syscall filter is AUDIT_RECORD_CONTEXT,
+ * then the record will be written at syscall exit time (otherwise, it
+ * will only be written if another part of the kernel requests that it
+ * be written). */
+void audit_syscall_entry(struct task_struct *tsk, int major,
+			 unsigned long a1, unsigned long a2,
+			 unsigned long a3, unsigned long a4)
+{
+	struct audit_context *context = tsk->audit_context;
+	enum audit_state     state;
+
+	BUG_ON(!context);
+
+	/* This happens only on certain architectures that make system
+	 * calls in kernel_thread via the entry.S interface, instead of
+	 * with direct calls.  (If you are porting to a new
+	 * architecture, hitting this condition can indicate that you
+	 * got the _exit/_leave calls backward in entry.S.)
+	 *
+	 * i386     no
+	 * x86_64   no
+	 * ppc64    yes (see arch/ppc64/kernel/misc.S)
+	 *
+	 * This also happens with vm86 emulation in a non-nested manner
+	 * (entries without exits), so this case must be caught.
+	 */
+	if (context->in_syscall) {
+		struct audit_context *newctx;
+
+#if defined(__NR_vm86) && defined(__NR_vm86old)
+		/* vm86 mode should only be entered once */
+		if (major == __NR_vm86 || major == __NR_vm86old)
+			return;
+#endif
+#if AUDIT_DEBUG
+		printk(KERN_ERR
+		       "audit(:%d) pid=%d in syscall=%d;"
+		       " entering syscall=%d\n",
+		       context->serial, tsk->pid, context->major, major);
+#endif
+		newctx = audit_alloc_context(context->state);
+		if (newctx) {
+			newctx->previous   = context;
+			context		   = newctx;
+			tsk->audit_context = newctx;
+		} else	{
+			/* If we can't alloc a new context, the best we
+			 * can do is to leak memory (any pending putname
+			 * will be lost).  The only other alternative is
+			 * to abandon auditing. */
+			audit_zero_context(context, context->state);
+		}
+	}
+	BUG_ON(context->in_syscall || context->name_count);
+
+	if (!audit_enabled)
+		return;
+
+	context->major      = major;
+	context->argv[0]    = a1;
+	context->argv[1]    = a2;
+	context->argv[2]    = a3;
+	context->argv[3]    = a4;
+
+	state = context->state;
+	if (state == AUDIT_SETUP_CONTEXT || state == AUDIT_BUILD_CONTEXT)
+		state = audit_filter_syscall(tsk, context, &audit_entlist);
+	if (likely(state == AUDIT_DISABLED))
+		return;
+
+	context->serial     = audit_serial();
+	context->ctime      = CURRENT_TIME;
+	context->in_syscall = 1;
+	context->auditable  = !!(state == AUDIT_RECORD_CONTEXT);
+}
+
+/* Tear down after system call.  If the audit context has been marked as
+ * auditable (either because of the AUDIT_RECORD_CONTEXT state from
+ * filtering, or because some other part of the kernel write an audit
+ * message), then write out the syscall information.  In call cases,
+ * free the names stored from getname(). */
+void audit_syscall_exit(struct task_struct *tsk, int return_code)
+{
+	struct audit_context *context;
+
+	get_task_struct(tsk);
+	task_lock(tsk);
+	context = audit_get_context(tsk, 1, return_code);
+	task_unlock(tsk);
+
+	/* Not having a context here is ok, since the parent may have
+	 * called __put_task_struct. */
+	if (likely(!context))
+		return;
+
+	if (context->in_syscall && context->auditable)
+		audit_log_exit(context);
+
+	context->in_syscall = 0;
+	context->auditable  = 0;
+	if (context->previous) {
+		struct audit_context *new_context = context->previous;
+		context->previous  = NULL;
+		audit_free_context(context);
+		tsk->audit_context = new_context;
+	} else {
+		audit_free_names(context);
+		audit_zero_context(context, context->state);
+		tsk->audit_context = context;
+	}
+	put_task_struct(tsk);
+}
+
+/* Add a name to the list.  Called from fs/namei.c:getname(). */
+void audit_getname(const char *name)
+{
+	struct audit_context *context = current->audit_context;
+
+	BUG_ON(!context);
+	if (!context->in_syscall) {
+#if AUDIT_DEBUG == 2
+		printk(KERN_ERR "%s:%d(:%d): ignoring getname(%p)\n",
+		       __FILE__, __LINE__, context->serial, name);
+		dump_stack();
+#endif
+		return;
+	}
+	BUG_ON(context->name_count >= AUDIT_NAMES);
+	context->names[context->name_count].name = name;
+	context->names[context->name_count].ino  = (unsigned long)-1;
+	context->names[context->name_count].rdev = -1;
+	++context->name_count;
+}
+
+/* Intercept a putname request.  Called from
+ * include/linux/fs.h:putname().  If we have stored the name from
+ * getname in the audit context, then we delay the putname until syscall
+ * exit. */
+void audit_putname(const char *name)
+{
+	struct audit_context *context = current->audit_context;
+
+	BUG_ON(!context);
+	if (!context->in_syscall) {
+#if AUDIT_DEBUG == 2
+		printk(KERN_ERR "%s:%d(:%d): __putname(%p)\n",
+		       __FILE__, __LINE__, context->serial, name);
+		if (context->name_count) {
+			int i;
+			for (i = 0; i < context->name_count; i++)
+				printk(KERN_ERR "name[%d] = %p = %s\n", i,
+				       context->names[i].name,
+				       context->names[i].name);
+		}
+#endif
+		__putname(name);
+	}
+#if AUDIT_DEBUG
+	else {
+		++context->put_count;
+		if (context->put_count > context->name_count) {
+			printk(KERN_ERR "%s:%d(:%d): major=%d"
+			       " in_syscall=%d putname(%p) name_count=%d"
+			       " put_count=%d\n",
+			       __FILE__, __LINE__,
+			       context->serial, context->major,
+			       context->in_syscall, name, context->name_count,
+			       context->put_count);
+			dump_stack();
+		}
+	}
+#endif
+}
+
+/* Store the inode and device from a lookup.  Called from
+ * fs/namei.c:path_lookup(). */
+void audit_inode(const char *name, unsigned long ino, dev_t rdev)
+{
+	int idx;
+	struct audit_context *context = current->audit_context;
+
+	if (!context->in_syscall)
+		return;
+	if (context->name_count
+	    && context->names[context->name_count-1].name
+	    && context->names[context->name_count-1].name == name)
+		idx = context->name_count - 1;
+	else if (context->name_count > 1
+		 && context->names[context->name_count-2].name
+		 && context->names[context->name_count-2].name == name)
+		idx = context->name_count - 2;
+	else {
+		/* FIXME: how much do we care about inodes that have no
+		 * associated name? */
+		if (context->name_count >= AUDIT_NAMES - AUDIT_NAMES_RESERVED)
+			return;
+		idx = context->name_count++;
+		context->names[idx].name = NULL;
+#if AUDIT_DEBUG
+		++context->ino_count;
+#endif
+	}
+	context->names[idx].ino  = ino;
+	context->names[idx].rdev = rdev;
+}
+
+void audit_get_stamp(struct audit_context *ctx,
+		     struct timespec *t, int *serial)
+{
+	if (ctx) {
+		t->tv_sec  = ctx->ctime.tv_sec;
+		t->tv_nsec = ctx->ctime.tv_nsec;
+		*serial    = ctx->serial;
+		ctx->auditable = 1;
+	} else {
+		*t      = CURRENT_TIME;
+		*serial = 0;
+	}
+}
+
+int audit_set_loginuid(struct audit_context *ctx, uid_t loginuid)
+{
+	if (ctx) {
+		if (loginuid < 0)
+			return -EINVAL;
+		ctx->loginuid = loginuid;
+	}
+	return 0;
+}
+
+EXPORT_SYMBOL_GPL(audit_alloc);
+EXPORT_SYMBOL_GPL(audit_free);
+EXPORT_SYMBOL_GPL(audit_syscall_entry);
+EXPORT_SYMBOL_GPL(audit_syscall_exit);
+EXPORT_SYMBOL_GPL(audit_getname);
+EXPORT_SYMBOL_GPL(audit_putname);
+EXPORT_SYMBOL_GPL(audit_inode);
--- diff/mm/hugetlb.c	1970-01-01 01:00:00.000000000 +0100
+++ source/mm/hugetlb.c	2004-04-21 10:45:36.022227288 +0100
@@ -0,0 +1,248 @@
+/*
+ * Generic hugetlb support.
+ * (C) William Irwin, April 2004
+ */
+#include <linux/gfp.h>
+#include <linux/list.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/mm.h>
+#include <linux/hugetlb.h>
+#include <linux/sysctl.h>
+#include <linux/highmem.h>
+
+const unsigned long hugetlb_zero = 0, hugetlb_infinity = ~0UL;
+static unsigned long nr_huge_pages, free_huge_pages;
+unsigned long max_huge_pages;
+static struct list_head hugepage_freelists[MAX_NUMNODES];
+static spinlock_t hugetlb_lock = SPIN_LOCK_UNLOCKED;
+
+static void enqueue_huge_page(struct page *page)
+{
+	list_add(&page->lru,
+		 &hugepage_freelists[page_zone(page)->zone_pgdat->node_id]);
+}
+
+static struct page *dequeue_huge_page(void)
+{
+	int nid = numa_node_id();
+	struct page *page = NULL;
+
+	if (list_empty(&hugepage_freelists[nid])) {
+		for (nid = 0; nid < MAX_NUMNODES; ++nid)
+			if (!list_empty(&hugepage_freelists[nid]))
+				break;
+	}
+	if (nid >= 0 && nid < MAX_NUMNODES &&
+	    !list_empty(&hugepage_freelists[nid])) {
+		page = list_entry(hugepage_freelists[nid].next,
+				  struct page, lru);
+		list_del(&page->lru);
+	}
+	return page;
+}
+
+static struct page *alloc_fresh_huge_page(void)
+{
+	static int nid = 0;
+	struct page *page;
+	page = alloc_pages_node(nid, GFP_HIGHUSER|__GFP_COMP,
+					HUGETLB_PAGE_ORDER);
+	nid = (nid + 1) % numnodes;
+	return page;
+}
+
+void free_huge_page(struct page *page)
+{
+	BUG_ON(page_count(page));
+
+	INIT_LIST_HEAD(&page->lru);
+
+	spin_lock(&hugetlb_lock);
+	enqueue_huge_page(page);
+	free_huge_pages++;
+	spin_unlock(&hugetlb_lock);
+}
+
+struct page *alloc_huge_page(void)
+{
+	struct page *page;
+	int i;
+
+	spin_lock(&hugetlb_lock);
+	page = dequeue_huge_page();
+	if (!page) {
+		spin_unlock(&hugetlb_lock);
+		return NULL;
+	}
+	free_huge_pages--;
+	spin_unlock(&hugetlb_lock);
+	set_page_count(page, 1);
+	page->lru.prev = (void *)free_huge_page;
+	for (i = 0; i < (HPAGE_SIZE/PAGE_SIZE); ++i)
+		clear_highpage(&page[i]);
+	return page;
+}
+
+void huge_page_release(struct page *page)
+{
+	if (!put_page_testzero(page))
+		return;
+
+	free_huge_page(page);
+}
+
+static int __init hugetlb_init(void)
+{
+	unsigned long i;
+	struct page *page;
+
+	for (i = 0; i < MAX_NUMNODES; ++i)
+		INIT_LIST_HEAD(&hugepage_freelists[i]);
+
+	for (i = 0; i < max_huge_pages; ++i) {
+		page = alloc_fresh_huge_page();
+		if (!page)
+			break;
+		spin_lock(&hugetlb_lock);
+		enqueue_huge_page(page);
+		spin_unlock(&hugetlb_lock);
+	}
+	max_huge_pages = free_huge_pages = nr_huge_pages = i;
+	printk("Total HugeTLB memory allocated, %ld\n", free_huge_pages);
+	return 0;
+}
+module_init(hugetlb_init);
+
+static int __init hugetlb_setup(char *s)
+{
+	if (sscanf(s, "%lu", &max_huge_pages) <= 0)
+		max_huge_pages = 0;
+	return 1;
+}
+__setup("hugepages=", hugetlb_setup);
+
+static void update_and_free_page(struct page *page)
+{
+	int i;
+	nr_huge_pages--;
+	for (i = 0; i < (HPAGE_SIZE / PAGE_SIZE); i++) {
+		page[i].flags &= ~(1 << PG_locked | 1 << PG_error | 1 << PG_referenced |
+				1 << PG_dirty | 1 << PG_active | 1 << PG_reserved |
+				1 << PG_private | 1<< PG_writeback);
+		set_page_count(&page[i], 0);
+	}
+	set_page_count(page, 1);
+	__free_pages(page, HUGETLB_PAGE_ORDER);
+}
+
+#ifdef CONFIG_HIGHMEM
+static int try_to_free_low(unsigned long count)
+{
+	int i;
+	for (i = 0; i < MAX_NUMNODES; ++i) {
+		struct page *page;
+		list_for_each_entry(page, &hugepage_freelists[i], lru) {
+			if (PageHighMem(page))
+				continue;
+			list_del(&page->lru);
+			update_and_free_page(page);
+			--free_huge_pages;
+			if (!--count)
+				return 0;
+		}
+	}
+	return count;
+}
+#else
+static inline int try_to_free_low(unsigned long count)
+{
+	return count;
+}
+#endif
+
+static unsigned long set_max_huge_pages(unsigned long count)
+{
+	while (count > nr_huge_pages) {
+		struct page *page = alloc_fresh_huge_page();
+		if (!page)
+			return nr_huge_pages;
+		spin_lock(&hugetlb_lock);
+		enqueue_huge_page(page);
+		free_huge_pages++;
+		nr_huge_pages++;
+		spin_unlock(&hugetlb_lock);
+	}
+	if (count >= nr_huge_pages)
+		return nr_huge_pages;
+
+	spin_lock(&hugetlb_lock);
+	for (count = try_to_free_low(count); count < nr_huge_pages; --free_huge_pages) {
+		struct page *page = dequeue_huge_page();
+		if (!page)
+			break;
+		update_and_free_page(page);
+	}
+	spin_unlock(&hugetlb_lock);
+	return nr_huge_pages;
+}
+
+#ifdef CONFIG_SYSCTL
+int hugetlb_sysctl_handler(struct ctl_table *table, int write,
+			   struct file *file, void *buffer, size_t *length)
+{
+	proc_doulongvec_minmax(table, write, file, buffer, length);
+	max_huge_pages = set_max_huge_pages(max_huge_pages);
+	return 0;
+}
+#endif /* CONFIG_SYSCTL */
+
+int hugetlb_report_meminfo(char *buf)
+{
+	return sprintf(buf,
+			"HugePages_Total: %5lu\n"
+			"HugePages_Free:  %5lu\n"
+			"Hugepagesize:    %5lu kB\n",
+			nr_huge_pages,
+			free_huge_pages,
+			HPAGE_SIZE/1024);
+}
+
+int is_hugepage_mem_enough(size_t size)
+{
+	return (size + ~HPAGE_MASK)/HPAGE_SIZE <= free_huge_pages;
+}
+
+/* Return the number pages of memory we physically have, in PAGE_SIZE units. */
+unsigned long hugetlb_total_pages(void)
+{
+	return nr_huge_pages * (HPAGE_SIZE / PAGE_SIZE);
+}
+EXPORT_SYMBOL(hugetlb_total_pages);
+
+/*
+ * We cannot handle pagefaults against hugetlb pages at all.  They cause
+ * handle_mm_fault() to try to instantiate regular-sized pages in the
+ * hugegpage VMA.  do_page_fault() is supposed to trap this, so BUG is we get
+ * this far.
+ */
+static struct page *hugetlb_nopage(struct vm_area_struct *vma,
+				unsigned long address, int *unused)
+{
+	BUG();
+	return NULL;
+}
+
+struct vm_operations_struct hugetlb_vm_ops = {
+	.nopage = hugetlb_nopage,
+};
+
+void zap_hugepage_range(struct vm_area_struct *vma,
+			unsigned long start, unsigned long length)
+{
+	struct mm_struct *mm = vma->vm_mm;
+
+	spin_lock(&mm->page_table_lock);
+	unmap_hugepage_range(vma, start, start + length);
+	spin_unlock(&mm->page_table_lock);
+}
--- diff/net/ipv4/netfilter/ipt_NOTRACK.c	1970-01-01 01:00:00.000000000 +0100
+++ source/net/ipv4/netfilter/ipt_NOTRACK.c	2004-04-21 10:45:36.068220296 +0100
@@ -0,0 +1,75 @@
+/* This is a module which is used for setting up fake conntracks
+ * on packets so that they are not seen by the conntrack/NAT code.
+ */
+#include <linux/module.h>
+#include <linux/skbuff.h>
+
+#include <linux/netfilter_ipv4/ip_tables.h>
+#include <linux/netfilter_ipv4/ip_conntrack.h>
+
+static unsigned int
+target(struct sk_buff **pskb,
+       const struct net_device *in,
+       const struct net_device *out,
+       unsigned int hooknum,
+       const void *targinfo,
+       void *userinfo)
+{
+	/* Previously seen (loopback)? Ignore. */
+	if ((*pskb)->nfct != NULL)
+		return IPT_CONTINUE;
+
+	/* Attach fake conntrack entry. 
+	   If there is a real ct entry correspondig to this packet, 
+	   it'll hang aroun till timing out. We don't deal with it
+	   for performance reasons. JK */
+	(*pskb)->nfct = &ip_conntrack_untracked.infos[IP_CT_NEW];
+	nf_conntrack_get((*pskb)->nfct);
+
+	return IPT_CONTINUE;
+}
+
+static int
+checkentry(const char *tablename,
+	   const struct ipt_entry *e,
+           void *targinfo,
+           unsigned int targinfosize,
+           unsigned int hook_mask)
+{
+	if (targinfosize != 0) {
+		printk(KERN_WARNING "NOTRACK: targinfosize %u != 0\n",
+		       targinfosize);
+		return 0;
+	}
+
+	if (strcmp(tablename, "raw") != 0) {
+		printk(KERN_WARNING "NOTRACK: can only be called from \"raw\" table, not \"%s\"\n", tablename);
+		return 0;
+	}
+
+	return 1;
+}
+
+static struct ipt_target ipt_notrack_reg = { 
+	.name = "NOTRACK", 
+	.target = target, 
+	.checkentry = checkentry,
+	.me = THIS_MODULE 
+};
+
+static int __init init(void)
+{
+	if (ipt_register_target(&ipt_notrack_reg))
+		return -EINVAL;
+
+	return 0;
+}
+
+static void __exit fini(void)
+{
+	ipt_unregister_target(&ipt_notrack_reg);
+}
+
+module_init(init);
+module_exit(fini);
+MODULE_LICENSE("GPL");
--- diff/net/ipv4/netfilter/iptable_raw.c	1970-01-01 01:00:00.000000000 +0100
+++ source/net/ipv4/netfilter/iptable_raw.c	2004-04-21 10:45:36.070219992 +0100
@@ -0,0 +1,149 @@
+/* 
+ * 'raw' table, which is the very first hooked in at PRE_ROUTING and LOCAL_OUT .
+ *
+ * Copyright (C) 2003 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
+ */
+#include <linux/module.h>
+#include <linux/netfilter_ipv4/ip_tables.h>
+
+#define RAW_VALID_HOOKS ((1 << NF_IP_PRE_ROUTING) | (1 << NF_IP_LOCAL_OUT))
+
+/* Standard entry. */
+struct ipt_standard
+{
+	struct ipt_entry entry;
+	struct ipt_standard_target target;
+};
+
+struct ipt_error_target
+{
+	struct ipt_entry_target target;
+	char errorname[IPT_FUNCTION_MAXNAMELEN];
+};
+
+struct ipt_error
+{
+	struct ipt_entry entry;
+	struct ipt_error_target target;
+};
+
+static struct
+{
+	struct ipt_replace repl;
+	struct ipt_standard entries[2];
+	struct ipt_error term;
+} initial_table __initdata
+= { { "raw", RAW_VALID_HOOKS, 3,
+      sizeof(struct ipt_standard) * 2 + sizeof(struct ipt_error),
+      { [NF_IP_PRE_ROUTING] 0,
+	[NF_IP_LOCAL_OUT] sizeof(struct ipt_standard) },
+      { [NF_IP_PRE_ROUTING] 0,
+	[NF_IP_LOCAL_OUT] sizeof(struct ipt_standard) },
+      0, NULL, { } },
+    {
+	    /* PRE_ROUTING */
+	    { { { { 0 }, { 0 }, { 0 }, { 0 }, "", "", { 0 }, { 0 }, 0, 0, 0 },
+		0,
+		sizeof(struct ipt_entry),
+		sizeof(struct ipt_standard),
+		0, { 0, 0 }, { } },
+	      { { { { IPT_ALIGN(sizeof(struct ipt_standard_target)), "" } }, { } },
+		-NF_ACCEPT - 1 } },
+	    /* LOCAL_OUT */
+	    { { { { 0 }, { 0 }, { 0 }, { 0 }, "", "", { 0 }, { 0 }, 0, 0, 0 },
+		0,
+		sizeof(struct ipt_entry),
+		sizeof(struct ipt_standard),
+		0, { 0, 0 }, { } },
+	      { { { { IPT_ALIGN(sizeof(struct ipt_standard_target)), "" } }, { } },
+		-NF_ACCEPT - 1 } }
+    },
+    /* ERROR */
+    { { { { 0 }, { 0 }, { 0 }, { 0 }, "", "", { 0 }, { 0 }, 0, 0, 0 },
+	0,
+	sizeof(struct ipt_entry),
+	sizeof(struct ipt_error),
+	0, { 0, 0 }, { } },
+      { { { { IPT_ALIGN(sizeof(struct ipt_error_target)), IPT_ERROR_TARGET } },
+	  { } },
+	"ERROR"
+      }
+    }
+};
+
+static struct ipt_table packet_raw = { 
+	.name = "raw", 
+	.table = &initial_table.repl,
+	.valid_hooks =  RAW_VALID_HOOKS, 
+	.lock = RW_LOCK_UNLOCKED, 
+	.me = THIS_MODULE
+};
+
+/* The work comes in here from netfilter.c. */
+static unsigned int
+ipt_hook(unsigned int hook,
+	 struct sk_buff **pskb,
+	 const struct net_device *in,
+	 const struct net_device *out,
+	 int (*okfn)(struct sk_buff *))
+{
+	return ipt_do_table(pskb, hook, in, out, &packet_raw, NULL);
+}
+
+/* 'raw' is the very first table. */
+static struct nf_hook_ops ipt_ops[] = {
+	{
+	  .hook = ipt_hook, 
+	  .pf = PF_INET, 
+	  .hooknum = NF_IP_PRE_ROUTING, 
+	  .priority = NF_IP_PRI_RAW
+	},
+	{
+	  .hook = ipt_hook, 
+	  .pf = PF_INET, 
+	  .hooknum = NF_IP_LOCAL_OUT, 
+	  .priority = NF_IP_PRI_RAW
+	},
+};
+
+static int __init init(void)
+{
+	int ret;
+
+	/* Register table */
+	ret = ipt_register_table(&packet_raw);
+	if (ret < 0)
+		return ret;
+
+	/* Register hooks */
+	ret = nf_register_hook(&ipt_ops[0]);
+	if (ret < 0)
+		goto cleanup_table;
+
+	ret = nf_register_hook(&ipt_ops[1]);
+	if (ret < 0)
+		goto cleanup_hook0;
+
+	return ret;
+
+ cleanup_hook0:
+	nf_unregister_hook(&ipt_ops[0]);
+ cleanup_table:
+	ipt_unregister_table(&packet_raw);
+
+	return ret;
+}
+
+static void __exit fini(void)
+{
+	unsigned int i;
+
+	for (i = 0; i < sizeof(ipt_ops)/sizeof(struct nf_hook_ops); i++)
+		nf_unregister_hook(&ipt_ops[i]);
+
+	ipt_unregister_table(&packet_raw);
+}
+
+module_init(init);
+module_exit(fini);
+MODULE_LICENSE("GPL");
--- diff/net/ipv6/netfilter/ip6table_raw.c	1970-01-01 01:00:00.000000000 +0100
+++ source/net/ipv6/netfilter/ip6table_raw.c	2004-04-21 10:45:36.081218320 +0100
@@ -0,0 +1,154 @@
+/*
+ * IPv6 raw table, a port of the IPv4 raw table to IPv6
+ *
+ * Copyright (C) 2003 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
+ */
+#include <linux/module.h>
+#include <linux/netfilter_ipv6/ip6_tables.h>
+
+#define RAW_VALID_HOOKS ((1 << NF_IP6_PRE_ROUTING) | (1 << NF_IP6_LOCAL_OUT))
+
+#if 0
+#define DEBUGP(x, args...)	printk(KERN_DEBUG x, ## args)
+#else
+#define DEBUGP(x, args...)
+#endif
+
+/* Standard entry. */
+struct ip6t_standard
+{
+	struct ip6t_entry entry;
+	struct ip6t_standard_target target;
+};
+
+struct ip6t_error_target
+{
+	struct ip6t_entry_target target;
+	char errorname[IP6T_FUNCTION_MAXNAMELEN];
+};
+
+struct ip6t_error
+{
+	struct ip6t_entry entry;
+	struct ip6t_error_target target;
+};
+
+static struct
+{
+	struct ip6t_replace repl;
+	struct ip6t_standard entries[2];
+	struct ip6t_error term;
+} initial_table __initdata 
+= { { "raw", RAW_VALID_HOOKS, 3,
+      sizeof(struct ip6t_standard) * 2 + sizeof(struct ip6t_error),
+      { [NF_IP6_PRE_ROUTING] 	0,
+	[NF_IP6_LOCAL_OUT]	sizeof(struct ip6t_standard) },
+      { [NF_IP6_PRE_ROUTING] 	0,
+	[NF_IP6_LOCAL_OUT]	sizeof(struct ip6t_standard) },
+      0, NULL, { } },
+    {
+	    /* PRE_ROUTING */
+            { { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 },
+		0,
+		sizeof(struct ip6t_entry),
+		sizeof(struct ip6t_standard),
+		0, { 0, 0 }, { } },
+	      { { { { IP6T_ALIGN(sizeof(struct ip6t_standard_target)), "" } }, { } },
+		-NF_ACCEPT - 1 } },
+	    /* LOCAL_OUT */
+            { { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 },
+		0,
+		sizeof(struct ip6t_entry),
+		sizeof(struct ip6t_standard),
+		0, { 0, 0 }, { } },
+	      { { { { IP6T_ALIGN(sizeof(struct ip6t_standard_target)), "" } }, { } },
+		-NF_ACCEPT - 1 } },
+    },
+    /* ERROR */
+    { { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 },
+	0,
+	sizeof(struct ip6t_entry),
+	sizeof(struct ip6t_error),
+	0, { 0, 0 }, { } },
+      { { { { IP6T_ALIGN(sizeof(struct ip6t_error_target)), IP6T_ERROR_TARGET } },
+	  { } },
+	"ERROR"
+      }
+    }
+};
+
+static struct ip6t_table packet_raw = { 
+	.name = "raw", 
+	.table = &initial_table.repl,
+	.valid_hooks = RAW_VALID_HOOKS, 
+	.lock = RW_LOCK_UNLOCKED, 
+	.me = THIS_MODULE
+};
+
+/* The work comes in here from netfilter.c. */
+static unsigned int
+ip6t_hook(unsigned int hook,
+	 struct sk_buff **pskb,
+	 const struct net_device *in,
+	 const struct net_device *out,
+	 int (*okfn)(struct sk_buff *))
+{
+	return ip6t_do_table(pskb, hook, in, out, &packet_raw, NULL);
+}
+
+static struct nf_hook_ops ip6t_ops[] = { 
+	{
+	  .hook = ip6t_hook, 
+	  .pf = PF_INET6,
+	  .hooknum = NF_IP6_PRE_ROUTING,
+	  .priority = NF_IP6_PRI_FIRST
+	},
+	{
+	  .hook = ip6t_hook, 
+	  .pf = PF_INET6, 
+	  .hooknum = NF_IP6_LOCAL_OUT,
+	  .priority = NF_IP6_PRI_FIRST
+	},
+};
+
+static int __init init(void)
+{
+	int ret;
+
+	/* Register table */
+	ret = ip6t_register_table(&packet_raw);
+	if (ret < 0)
+		return ret;
+
+	/* Register hooks */
+	ret = nf_register_hook(&ip6t_ops[0]);
+	if (ret < 0)
+		goto cleanup_table;
+
+	ret = nf_register_hook(&ip6t_ops[1]);
+	if (ret < 0)
+		goto cleanup_hook0;
+
+	return ret;
+
+ cleanup_hook0:
+	nf_unregister_hook(&ip6t_ops[0]);
+ cleanup_table:
+	ip6t_unregister_table(&packet_raw);
+
+	return ret;
+}
+
+static void __exit fini(void)
+{
+	unsigned int i;
+
+	for (i = 0; i < sizeof(ip6t_ops)/sizeof(struct nf_hook_ops); i++)
+		nf_unregister_hook(&ip6t_ops[i]);
+
+	ip6t_unregister_table(&packet_raw);
+}
+
+module_init(init);
+module_exit(fini);
+MODULE_LICENSE("GPL");
--- diff/arch/mips/configs/hp-lj_defconfig	2004-04-05 12:57:06.000000000 +0100
+++ source/arch/mips/configs/hp-lj_defconfig	1970-01-01 01:00:00.000000000 +0100
@@ -1,649 +0,0 @@
-#
-# Automatically generated make config: don't edit
-#
-CONFIG_MIPS=y
-# CONFIG_MIPS64 is not set
-# CONFIG_64BIT is not set
-CONFIG_MIPS32=y
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-CONFIG_CLEAN_COMPILE=y
-CONFIG_STANDALONE=y
-CONFIG_BROKEN_ON_SMP=y
-
-#
-# General setup
-#
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-# CONFIG_BSD_PROCESS_ACCT is not set
-CONFIG_SYSCTL=y
-CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_IKCONFIG is not set
-CONFIG_EMBEDDED=y
-CONFIG_KALLSYMS=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-CONFIG_OBSOLETE_MODPARM=y
-CONFIG_MODVERSIONS=y
-CONFIG_KMOD=y
-
-#
-# Machine selection
-#
-# CONFIG_MACH_JAZZ is not set
-# CONFIG_BAGET_MIPS is not set
-# CONFIG_MACH_VR41XX is not set
-# CONFIG_TOSHIBA_JMR3927 is not set
-# CONFIG_MIPS_COBALT is not set
-# CONFIG_MACH_DECSTATION is not set
-# CONFIG_MIPS_EV64120 is not set
-# CONFIG_MIPS_EV96100 is not set
-# CONFIG_MIPS_IVR is not set
-# CONFIG_LASAT is not set
-CONFIG_HP_LASERJET=y
-# CONFIG_MIPS_ITE8172 is not set
-# CONFIG_MIPS_ATLAS is not set
-# CONFIG_MIPS_MALTA is not set
-# CONFIG_MIPS_SEAD is not set
-# CONFIG_MOMENCO_OCELOT is not set
-# CONFIG_MOMENCO_OCELOT_G is not set
-# CONFIG_MOMENCO_OCELOT_C is not set
-# CONFIG_MOMENCO_JAGUAR_ATX is not set
-# CONFIG_PMC_YOSEMITE is not set
-# CONFIG_DDB5074 is not set
-# CONFIG_DDB5476 is not set
-# CONFIG_DDB5477 is not set
-# CONFIG_NEC_OSPREY is not set
-# CONFIG_SGI_IP22 is not set
-# CONFIG_SGI_IP32 is not set
-# CONFIG_SOC_AU1X00 is not set
-# CONFIG_SIBYTE_SB1xxx_SOC is not set
-# CONFIG_SNI_RM200_PCI is not set
-# CONFIG_TOSHIBA_RBTX4927 is not set
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_HAVE_DEC_LOCK=y
-CONFIG_DMA_NONCOHERENT=y
-CONFIG_CPU_LITTLE_ENDIAN=y
-CONFIG_IRQ_CPU=y
-CONFIG_MIPS_L1_CACHE_SHIFT=5
-# CONFIG_FB is not set
-
-#
-# CPU selection
-#
-# CONFIG_CPU_MIPS32 is not set
-# CONFIG_CPU_MIPS64 is not set
-# CONFIG_CPU_R3000 is not set
-# CONFIG_CPU_TX39XX is not set
-# CONFIG_CPU_VR41XX is not set
-# CONFIG_CPU_R4300 is not set
-# CONFIG_CPU_R4X00 is not set
-# CONFIG_CPU_TX49XX is not set
-CONFIG_CPU_R5000=y
-# CONFIG_CPU_R5432 is not set
-# CONFIG_CPU_R6000 is not set
-# CONFIG_CPU_NEVADA is not set
-# CONFIG_CPU_R8000 is not set
-# CONFIG_CPU_R10000 is not set
-# CONFIG_CPU_RM7000 is not set
-# CONFIG_CPU_RM9000 is not set
-# CONFIG_CPU_SB1 is not set
-CONFIG_PAGE_SIZE_4KB=y
-# CONFIG_PAGE_SIZE_16KB is not set
-# CONFIG_PAGE_SIZE_64KB is not set
-# CONFIG_64BIT_PHYS_ADDR is not set
-# CONFIG_CPU_ADVANCED is not set
-CONFIG_CPU_HAS_LLSC=y
-CONFIG_CPU_HAS_LLDSCD=y
-CONFIG_CPU_HAS_SYNC=y
-# CONFIG_PREEMPT is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-
-#
-# Bus options (PCI, PCMCIA, EISA, ISA, TC)
-#
-# CONFIG_PCI is not set
-CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
-
-#
-# Executable file formats
-#
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_MISC is not set
-CONFIG_TRAD_SIGNALS=y
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-CONFIG_MTD_DEBUG=y
-CONFIG_MTD_DEBUG_VERBOSE=3
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_CONCAT is not set
-# CONFIG_MTD_REDBOOT_PARTS is not set
-# CONFIG_MTD_CMDLINE_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-# CONFIG_FTL is not set
-# CONFIG_NFTL is not set
-# CONFIG_INFTL is not set
-
-#
-# RAM/ROM/Flash chip drivers
-#
-CONFIG_MTD_CFI=y
-CONFIG_MTD_JEDECPROBE=y
-CONFIG_MTD_GEN_PROBE=y
-# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-CONFIG_MTD_CFI_INTELEXT=y
-CONFIG_MTD_CFI_AMDSTD=y
-# CONFIG_MTD_CFI_STAA is not set
-# CONFIG_MTD_RAM is not set
-# CONFIG_MTD_ROM is not set
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-CONFIG_MTD_PHYSMAP=y
-CONFIG_MTD_PHYSMAP_START=0x10040000
-CONFIG_MTD_PHYSMAP_LEN=0x00fc0000
-CONFIG_MTD_PHYSMAP_BUSWIDTH=4
-# CONFIG_MTD_CSTM_MIPS_IXX is not set
-
-#
-# Self-contained MTD device drivers
-#
-# CONFIG_MTD_SLRAM is not set
-# CONFIG_MTD_MTDRAM is not set
-# CONFIG_MTD_BLKMTD is not set
-
-#
-# Disk-On-Chip Device Drivers
-#
-# CONFIG_MTD_DOC2000 is not set
-# CONFIG_MTD_DOC2001 is not set
-# CONFIG_MTD_DOC2001PLUS is not set
-
-#
-# NAND Flash Device Drivers
-#
-CONFIG_MTD_NAND=y
-# CONFIG_MTD_NAND_VERIFY_WRITE is not set
-CONFIG_MTD_NAND_IDS=y
-
-#
-# Parallel port support
-#
-# CONFIG_PARPORT is not set
-
-#
-# Plug and Play support
-#
-
-#
-# Block devices
-#
-# CONFIG_BLK_DEV_FD is not set
-# CONFIG_BLK_DEV_LOOP is not set
-# CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
-# CONFIG_LBD is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
-CONFIG_IDE=y
-CONFIG_BLK_DEV_IDE=y
-
-#
-# Please see Documentation/ide.txt for help/info on IDE drives
-#
-CONFIG_BLK_DEV_IDEDISK=y
-# CONFIG_IDEDISK_MULTI_MODE is not set
-# CONFIG_IDEDISK_STROKE is not set
-# CONFIG_BLK_DEV_IDECD is not set
-# CONFIG_BLK_DEV_IDETAPE is not set
-# CONFIG_BLK_DEV_IDEFLOPPY is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-CONFIG_IDE_TASKFILE_IO=y
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_BLK_DEV_IDEDMA is not set
-# CONFIG_IDEDMA_AUTO is not set
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# SCSI device support
-#
-# CONFIG_SCSI is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-# CONFIG_MD is not set
-
-#
-# Fusion MPT device support
-#
-
-#
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
-#
-# CONFIG_IEEE1394 is not set
-
-#
-# I2O device support
-#
-
-#
-# Macintosh device drivers
-#
-
-#
-# Networking support
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-CONFIG_PACKET=y
-# CONFIG_PACKET_MMAP is not set
-CONFIG_NETLINK_DEV=y
-CONFIG_UNIX=y
-CONFIG_NET_KEY=y
-CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
-# CONFIG_IP_ADVANCED_ROUTER is not set
-CONFIG_IP_PNP=y
-CONFIG_IP_PNP_DHCP=y
-# CONFIG_IP_PNP_BOOTP is not set
-# CONFIG_IP_PNP_RARP is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE is not set
-# CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
-# CONFIG_SYN_COOKIES is not set
-# CONFIG_INET_AH is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_IPV6 is not set
-# CONFIG_DECNET is not set
-# CONFIG_BRIDGE is not set
-# CONFIG_NETFILTER is not set
-CONFIG_XFRM=y
-# CONFIG_XFRM_USER is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-CONFIG_IPV6_SCTP__=y
-# CONFIG_IP_SCTP is not set
-# CONFIG_ATM is not set
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_LLC2 is not set
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_NET_DIVERT is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-# CONFIG_NET_FASTROUTE is not set
-# CONFIG_NET_HW_FLOWCONTROL is not set
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-CONFIG_NETDEVICES=y
-# CONFIG_DUMMY is not set
-# CONFIG_BONDING is not set
-# CONFIG_EQUALIZER is not set
-# CONFIG_TUN is not set
-# CONFIG_ETHERTAP is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-# CONFIG_MII is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-
-#
-# Ethernet (10000 Mbit)
-#
-# CONFIG_PPP is not set
-# CONFIG_SLIP is not set
-
-#
-# Wireless LAN (non-hamradio)
-#
-CONFIG_NET_RADIO=y
-
-#
-# Obsolete Wireless cards support (pre-802.11)
-#
-# CONFIG_STRIP is not set
-# CONFIG_ATMEL is not set
-
-#
-# Token Ring devices
-#
-# CONFIG_SHAPER is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-
-#
-# Amateur Radio support
-#
-# CONFIG_HAMRADIO is not set
-
-#
-# IrDA (infrared) support
-#
-# CONFIG_IRDA is not set
-
-#
-# Bluetooth support
-#
-# CONFIG_BT is not set
-
-#
-# ISDN subsystem
-#
-# CONFIG_ISDN_BOOL is not set
-
-#
-# Telephony Support
-#
-# CONFIG_PHONE is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=y
-CONFIG_INPUT_MOUSEDEV_PSAUX=y
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-# CONFIG_INPUT_EVDEV is not set
-# CONFIG_INPUT_EVBUG is not set
-
-#
-# Input I/O drivers
-#
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
-CONFIG_SERIO=y
-# CONFIG_SERIO_I8042 is not set
-CONFIG_SERIO_SERPORT=y
-# CONFIG_SERIO_CT82C710 is not set
-
-#
-# Input Device Drivers
-#
-# CONFIG_INPUT_KEYBOARD is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_MISC is not set
-
-#
-# Character devices
-#
-CONFIG_VT=y
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_8250_CONSOLE=y
-CONFIG_SERIAL_8250_NR_UARTS=4
-# CONFIG_SERIAL_8250_EXTENDED is not set
-
-#
-# Non-8250 serial port support
-#
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-# CONFIG_UNIX98_PTYS is not set
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
-# CONFIG_QIC02_TAPE is not set
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
-# CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
-# CONFIG_RTC is not set
-# CONFIG_GEN_RTC is not set
-# CONFIG_DTLK is not set
-# CONFIG_R3964 is not set
-# CONFIG_APPLICOM is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-# CONFIG_FTAPE is not set
-# CONFIG_AGP is not set
-# CONFIG_DRM is not set
-# CONFIG_RAW_DRIVER is not set
-
-#
-# I2C support
-#
-# CONFIG_I2C is not set
-
-#
-# Multimedia devices
-#
-# CONFIG_VIDEO_DEV is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-
-#
-# Graphics support
-#
-
-#
-# Console display driver support
-#
-# CONFIG_VGA_CONSOLE is not set
-# CONFIG_MDA_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# USB support
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-# CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT3_FS is not set
-# CONFIG_JBD is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_JFS_FS is not set
-# CONFIG_XFS_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_ROMFS_FS is not set
-# CONFIG_QUOTA is not set
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_AUTOFS4_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-# CONFIG_ISO9660_FS is not set
-# CONFIG_UDF_FS is not set
-
-#
-# DOS/FAT/NT Filesystems
-#
-# CONFIG_FAT_FS is not set
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-# CONFIG_DEVFS_FS is not set
-# CONFIG_TMPFS is not set
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
-CONFIG_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=3
-# CONFIG_JFFS2_FS_NAND is not set
-# CONFIG_CRAMFS is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-# CONFIG_NFS_V4 is not set
-# CONFIG_NFS_DIRECTIO is not set
-# CONFIG_NFSD is not set
-CONFIG_ROOT_NFS=y
-CONFIG_LOCKD=y
-CONFIG_LOCKD_V4=y
-# CONFIG_EXPORTFS is not set
-CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
-# CONFIG_SMB_FS is not set
-# CONFIG_CIFS is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_CODA_FS is not set
-# CONFIG_INTERMEZZO_FS is not set
-# CONFIG_AFS_FS is not set
-
-#
-# Partition Types
-#
-# CONFIG_PARTITION_ADVANCED is not set
-CONFIG_MSDOS_PARTITION=y
-
-#
-# Native Language Support
-#
-# CONFIG_NLS is not set
-
-#
-# Kernel hacking
-#
-CONFIG_CROSSCOMPILE=y
-CONFIG_CMDLINE=""
-# CONFIG_DEBUG_KERNEL is not set
-
-#
-# Security options
-#
-# CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
-# CONFIG_CRYPTO is not set
-
-#
-# Library routines
-#
-CONFIG_CRC32=y
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
--- diff/arch/mips/jaguar-atx_defconfig	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/jaguar-atx_defconfig	1970-01-01 01:00:00.000000000 +0100
@@ -1,537 +0,0 @@
-#
-# Automatically generated make config: don't edit
-#
-CONFIG_MIPS=y
-# CONFIG_MIPS64 is not set
-# CONFIG_64BIT is not set
-CONFIG_MIPS32=y
-
-#
-# Code maturity level options
-#
-# CONFIG_EXPERIMENTAL is not set
-CONFIG_CLEAN_COMPILE=y
-CONFIG_STANDALONE=y
-CONFIG_BROKEN_ON_SMP=y
-
-#
-# General setup
-#
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-# CONFIG_BSD_PROCESS_ACCT is not set
-CONFIG_SYSCTL=y
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_IKCONFIG=y
-CONFIG_IKCONFIG_PROC=y
-CONFIG_EMBEDDED=y
-CONFIG_KALLSYMS=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-
-#
-# Loadable module support
-#
-# CONFIG_MODULES is not set
-
-#
-# Machine selection
-#
-# CONFIG_MACH_JAZZ is not set
-# CONFIG_MACH_VR41XX is not set
-# CONFIG_TOSHIBA_JMR3927 is not set
-# CONFIG_MACH_DECSTATION is not set
-# CONFIG_MIPS_IVR is not set
-# CONFIG_LASAT is not set
-# CONFIG_HP_LASERJET is not set
-# CONFIG_MIPS_ITE8172 is not set
-# CONFIG_MIPS_ATLAS is not set
-# CONFIG_MIPS_MALTA is not set
-# CONFIG_MOMENCO_OCELOT is not set
-# CONFIG_MOMENCO_OCELOT_G is not set
-# CONFIG_MOMENCO_OCELOT_C is not set
-CONFIG_MOMENCO_JAGUAR_ATX=y
-# CONFIG_PMC_YOSEMITE is not set
-# CONFIG_DDB5476 is not set
-# CONFIG_DDB5477 is not set
-# CONFIG_NEC_OSPREY is not set
-# CONFIG_SGI_IP22 is not set
-# CONFIG_SOC_AU1X00 is not set
-# CONFIG_SNI_RM200_PCI is not set
-# CONFIG_TOSHIBA_RBTX4927 is not set
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_HAVE_DEC_LOCK=y
-CONFIG_DMA_NONCOHERENT=y
-# CONFIG_CPU_LITTLE_ENDIAN is not set
-CONFIG_IRQ_CPU=y
-CONFIG_IRQ_CPU_RM7K=y
-CONFIG_MIPS_MV64340=y
-CONFIG_SWAP_IO_SPACE=y
-CONFIG_BOOT_ELF32=y
-CONFIG_MIPS_L1_CACHE_SHIFT=5
-# CONFIG_FB is not set
-CONFIG_BOARD_SCACHE=y
-
-#
-# CPU selection
-#
-# CONFIG_CPU_MIPS32 is not set
-# CONFIG_CPU_MIPS64 is not set
-# CONFIG_CPU_R3000 is not set
-# CONFIG_CPU_TX39XX is not set
-# CONFIG_CPU_VR41XX is not set
-# CONFIG_CPU_R4300 is not set
-# CONFIG_CPU_R4X00 is not set
-# CONFIG_CPU_TX49XX is not set
-# CONFIG_CPU_R5000 is not set
-# CONFIG_CPU_R5432 is not set
-# CONFIG_CPU_R6000 is not set
-# CONFIG_CPU_NEVADA is not set
-# CONFIG_CPU_R8000 is not set
-# CONFIG_CPU_R10000 is not set
-# CONFIG_CPU_RM7000 is not set
-CONFIG_CPU_RM9000=y
-# CONFIG_CPU_SB1 is not set
-CONFIG_PAGE_SIZE_4KB=y
-# CONFIG_PAGE_SIZE_16KB is not set
-# CONFIG_PAGE_SIZE_64KB is not set
-CONFIG_CPU_HAS_PREFETCH=y
-# CONFIG_64BIT_PHYS_ADDR is not set
-# CONFIG_CPU_ADVANCED is not set
-CONFIG_CPU_HAS_LLSC=y
-CONFIG_CPU_HAS_LLDSCD=y
-CONFIG_CPU_HAS_SYNC=y
-# CONFIG_SMP is not set
-# CONFIG_PREEMPT is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-
-#
-# Bus options (PCI, PCMCIA, EISA, ISA, TC)
-#
-CONFIG_PCI=y
-CONFIG_PCI_LEGACY_PROC=y
-CONFIG_PCI_NAMES=y
-CONFIG_MMU=y
-# CONFIG_HOTPLUG is not set
-
-#
-# Executable file formats
-#
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_MISC is not set
-CONFIG_TRAD_SIGNALS=y
-# CONFIG_BINFMT_IRIX is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-
-#
-# Memory Technology Devices (MTD)
-#
-# CONFIG_MTD is not set
-
-#
-# Parallel port support
-#
-# CONFIG_PARPORT is not set
-
-#
-# Plug and Play support
-#
-
-#
-# Block devices
-#
-# CONFIG_BLK_DEV_FD is not set
-# CONFIG_BLK_CPQ_DA is not set
-# CONFIG_BLK_CPQ_CISS_DA is not set
-# CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_LOOP is not set
-# CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
-# CONFIG_LBD is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
-# CONFIG_IDE is not set
-
-#
-# SCSI device support
-#
-# CONFIG_SCSI is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-# CONFIG_MD is not set
-
-#
-# Fusion MPT device support
-#
-
-#
-# I2O device support
-#
-# CONFIG_I2O is not set
-
-#
-# Networking support
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_PACKET is not set
-# CONFIG_NETLINK_DEV is not set
-CONFIG_UNIX=y
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
-# CONFIG_IP_ADVANCED_ROUTER is not set
-CONFIG_IP_PNP=y
-# CONFIG_IP_PNP_DHCP is not set
-CONFIG_IP_PNP_BOOTP=y
-# CONFIG_IP_PNP_RARP is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE is not set
-# CONFIG_INET_ECN is not set
-# CONFIG_SYN_COOKIES is not set
-# CONFIG_INET_AH is not set
-# CONFIG_INET_ESP is not set
-# CONFIG_INET_IPCOMP is not set
-# CONFIG_DECNET is not set
-# CONFIG_BRIDGE is not set
-# CONFIG_NETFILTER is not set
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_LLC2 is not set
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-CONFIG_NETDEVICES=y
-
-#
-# ARCnet devices
-#
-# CONFIG_ARCNET is not set
-# CONFIG_DUMMY is not set
-# CONFIG_BONDING is not set
-# CONFIG_EQUALIZER is not set
-# CONFIG_TUN is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=y
-# CONFIG_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_NET_VENDOR_3COM is not set
-
-#
-# Tulip family network device support
-#
-# CONFIG_NET_TULIP is not set
-# CONFIG_HP100 is not set
-CONFIG_NET_PCI=y
-# CONFIG_PCNET32 is not set
-# CONFIG_AMD8111_ETH is not set
-# CONFIG_ADAPTEC_STARFIRE is not set
-# CONFIG_DGRS is not set
-CONFIG_EEPRO100=y
-# CONFIG_EEPRO100_PIO is not set
-# CONFIG_E100 is not set
-# CONFIG_FEALNX is not set
-# CONFIG_NATSEMI is not set
-# CONFIG_NE2K_PCI is not set
-# CONFIG_8139TOO is not set
-# CONFIG_SIS900 is not set
-# CONFIG_EPIC100 is not set
-# CONFIG_SUNDANCE is not set
-# CONFIG_TLAN is not set
-# CONFIG_VIA_RHINE is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-# CONFIG_ACENIC is not set
-# CONFIG_DL2K is not set
-# CONFIG_E1000 is not set
-# CONFIG_NS83820 is not set
-# CONFIG_HAMACHI is not set
-# CONFIG_R8169 is not set
-# CONFIG_SK98LIN is not set
-# CONFIG_TIGON3 is not set
-CONFIG_MV64340_ETH=y
-CONFIG_MV64340_ETH_0=y
-# CONFIG_MV64340_ETH_1 is not set
-# CONFIG_MV64340_ETH_2 is not set
-
-#
-# Ethernet (10000 Mbit)
-#
-# CONFIG_IXGB is not set
-# CONFIG_FDDI is not set
-# CONFIG_PPP is not set
-# CONFIG_SLIP is not set
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Token Ring devices
-#
-# CONFIG_TR is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-
-#
-# Amateur Radio support
-#
-# CONFIG_HAMRADIO is not set
-
-#
-# IrDA (infrared) support
-#
-# CONFIG_IRDA is not set
-
-#
-# Bluetooth support
-#
-# CONFIG_BT is not set
-
-#
-# ISDN subsystem
-#
-# CONFIG_ISDN_BOOL is not set
-
-#
-# Telephony Support
-#
-# CONFIG_PHONE is not set
-
-#
-# Input device support
-#
-# CONFIG_INPUT is not set
-
-#
-# Userland interfaces
-#
-
-#
-# Input I/O drivers
-#
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
-CONFIG_SERIO=y
-CONFIG_SERIO_I8042=y
-CONFIG_SERIO_SERPORT=y
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_PCIPS2 is not set
-
-#
-# Input Device Drivers
-#
-
-#
-# Character devices
-#
-# CONFIG_VT is not set
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
-# CONFIG_SERIAL_8250 is not set
-
-#
-# Non-8250 serial port support
-#
-CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
-# CONFIG_QIC02_TAPE is not set
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
-# CONFIG_WATCHDOG is not set
-# CONFIG_NVRAM is not set
-# CONFIG_RTC is not set
-# CONFIG_GEN_RTC is not set
-# CONFIG_DTLK is not set
-# CONFIG_R3964 is not set
-# CONFIG_APPLICOM is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-# CONFIG_FTAPE is not set
-# CONFIG_AGP is not set
-# CONFIG_DRM is not set
-# CONFIG_RAW_DRIVER is not set
-
-#
-# I2C support
-#
-# CONFIG_I2C is not set
-
-#
-# Multimedia devices
-#
-# CONFIG_VIDEO_DEV is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-
-#
-# Graphics support
-#
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# USB support
-#
-# CONFIG_USB is not set
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# File systems
-#
-# CONFIG_EXT2_FS is not set
-# CONFIG_EXT3_FS is not set
-# CONFIG_JBD is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_JFS_FS is not set
-# CONFIG_XFS_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_ROMFS_FS is not set
-# CONFIG_QUOTA is not set
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_AUTOFS4_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-# CONFIG_ISO9660_FS is not set
-# CONFIG_UDF_FS is not set
-
-#
-# DOS/FAT/NT Filesystems
-#
-# CONFIG_FAT_FS is not set
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_KCORE=y
-CONFIG_DEVPTS_FS=y
-# CONFIG_DEVPTS_FS_XATTR is not set
-# CONFIG_TMPFS is not set
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_CRAMFS is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=y
-# CONFIG_NFS_V3 is not set
-# CONFIG_NFSD is not set
-CONFIG_ROOT_NFS=y
-CONFIG_LOCKD=y
-# CONFIG_EXPORTFS is not set
-CONFIG_SUNRPC=y
-# CONFIG_SMB_FS is not set
-# CONFIG_CIFS is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_CODA_FS is not set
-
-#
-# Partition Types
-#
-# CONFIG_PARTITION_ADVANCED is not set
-CONFIG_MSDOS_PARTITION=y
-
-#
-# Native Language Support
-#
-# CONFIG_NLS is not set
-
-#
-# Kernel hacking
-#
-CONFIG_CROSSCOMPILE=y
-CONFIG_CMDLINE=""
-# CONFIG_DEBUG_KERNEL is not set
-
-#
-# Security options
-#
-# CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
-# CONFIG_CRYPTO is not set
-
-#
-# Library routines
-#
-# CONFIG_CRC32 is not set
--- diff/arch/mips/lasat/pci.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/lasat/pci.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,25 +0,0 @@
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/pci.h>
-#include <asm/bootinfo.h>
-
-extern struct pci_ops nile4_pci_ops;
-extern struct pci_ops gt64120_pci_ops;
-
-void __init pcibios_init(void)
-{
-	struct pci_ops *pci_ops;
-
-	switch (mips_machtype) {
-	case MACH_LASAT_100:
-		pci_ops = &gt64120_pci_ops;
-		break;
-	case MACH_LASAT_200:
-		pci_ops = &nile4_pci_ops;
-		break;
-	default:
-		panic("pcibios_init: mips_machtype incorrect");
-	}
-
-	pci_scan_bus(0, pci_ops, NULL);
-}
--- diff/arch/mips/momentum/jaguar_atx/mv-irq.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/momentum/jaguar_atx/mv-irq.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,162 +0,0 @@
-/*
- * Copyright 2002 Momentum Computer
- * Author: mdharm@momenco.com
- *
- * arch/mips/momentum/jaguar_atx/mv-irq.c
- *     Interrupt routines for mv64340.  Interrupt numbers are assigned from
- *     MV64340_IRQ_BASE to MV64340_IRQ_BASE + 63.
- *
- * This program is free software; you can redistribute  it and/or modify it
- * under  the terms of  the GNU General  Public License as published by the
- * Free Software Foundation;  either version 2 of the  License, or (at your
- * option) any later version.
- */
-#include <linux/module.h>
-#include <linux/interrupt.h>
-#include <linux/kernel.h>
-#include <asm/ptrace.h>
-#include <linux/sched.h>
-#include <linux/kernel_stat.h>
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <asm/mv64340.h>
-
-#define MV64340_IRQ_BASE	16
-
-static inline int ls1bit32(unsigned int x)
-{
-        int b = 31, s;
-
-        s = 16; if (x << 16 == 0) s = 0; b -= s; x <<= s;
-        s =  8; if (x <<  8 == 0) s = 0; b -= s; x <<= s;
-        s =  4; if (x <<  4 == 0) s = 0; b -= s; x <<= s;
-        s =  2; if (x <<  2 == 0) s = 0; b -= s; x <<= s;
-        s =  1; if (x <<  1 == 0) s = 0; b -= s;
-
-        return b;
-}
-
-/* mask off an interrupt -- 1 is enable, 0 is disable */
-static inline void mask_mv64340_irq(unsigned int irq)
-{
-	uint32_t value;
-
-	if (irq < (MV64340_IRQ_BASE + 32)) {
-		MV_READ(MV64340_INTERRUPT0_MASK_0_LOW, &value);
-		value &= ~(1 << (irq - MV64340_IRQ_BASE));
-		MV_WRITE(MV64340_INTERRUPT0_MASK_0_LOW, value);
-	} else {
-		MV_READ(MV64340_INTERRUPT0_MASK_0_HIGH, &value);
-		value &= ~(1 << (irq - (MV64340_IRQ_BASE - 32)));
-		MV_WRITE(MV64340_INTERRUPT0_MASK_0_HIGH, value);
-	}
-}
-
-/* unmask an interrupt -- 1 is enable, 0 is disable */
-static inline void unmask_mv64340_irq(unsigned int irq)
-{
-	uint32_t value;
-
-	if (irq < (MV64340_IRQ_BASE + 32)) {
-		MV_READ(MV64340_INTERRUPT0_MASK_0_LOW, &value);
-		value |= 1 << (irq - MV64340_IRQ_BASE);
-		MV_WRITE(MV64340_INTERRUPT0_MASK_0_LOW, value);
-	} else {
-		MV_READ(MV64340_INTERRUPT0_MASK_0_HIGH, &value);
-		value |= 1 << (irq - (MV64340_IRQ_BASE - 32));
-		MV_WRITE(MV64340_INTERRUPT0_MASK_0_HIGH, value);
-	}
-}
-
-/*
- * Enables the IRQ on Marvell Chip
- */
-static void enable_mv64340_irq(unsigned int irq)
-{
-	unmask_mv64340_irq(irq);
-}
-
-/*
- * Initialize the IRQ on Marvell Chip
- */
-static unsigned int startup_mv64340_irq(unsigned int irq)
-{
-	unmask_mv64340_irq(irq);
-	return 0;
-}
-
-/*
- * Disables the IRQ on Marvell Chip
- */
-static void disable_mv64340_irq(unsigned int irq)
-{
-	mask_mv64340_irq(irq);
-}
-
-/*
- * Masks and ACKs an IRQ
- */
-static void mask_and_ack_mv64340_irq(unsigned int irq)
-{
-	mask_mv64340_irq(irq);
-}
-
-/*
- * End IRQ processing
- */
-static void end_mv64340_irq(unsigned int irq)
-{
-	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
-		unmask_mv64340_irq(irq);
-}
-
-/*
- * Interrupt handler for interrupts coming from the Marvell chip.
- * It could be built in ethernet ports etc...
- */
-void ll_mv64340_irq(struct pt_regs *regs)
-{
-	unsigned int irq_src_low, irq_src_high;
- 	unsigned int irq_mask_low, irq_mask_high;
-
-	/* read the interrupt status registers */
-	MV_READ(MV64340_INTERRUPT0_MASK_0_LOW, &irq_mask_low);
-	MV_READ(MV64340_INTERRUPT0_MASK_0_HIGH, &irq_mask_high);
-	MV_READ(MV64340_MAIN_INTERRUPT_CAUSE_LOW, &irq_src_low);
-	MV_READ(MV64340_MAIN_INTERRUPT_CAUSE_HIGH, &irq_src_high);
-
-	/* mask for just the interrupts we want */
-	irq_src_low &= irq_mask_low;
-	irq_src_high &= irq_mask_high;
-
-	if (irq_src_low) 
-		do_IRQ(ls1bit32(irq_src_low) + MV64340_IRQ_BASE, regs);
-	else
-		do_IRQ(ls1bit32(irq_src_high) + MV64340_IRQ_BASE + 32, regs);
-}
-
-#define shutdown_mv64340_irq	disable_mv64340_irq
-
-struct hw_interrupt_type mv64340_irq_type = {
-	"MV-64340",
-	startup_mv64340_irq,
-	shutdown_mv64340_irq,
-	enable_mv64340_irq,
-	disable_mv64340_irq,
-	mask_and_ack_mv64340_irq,
-	end_mv64340_irq,
-	NULL
-};
-
-void mv64340_irq_init(void)
-{
-	int i;
-
-	/* Reset irq handlers pointers to NULL */
-	for (i = MV64340_IRQ_BASE; i < (MV64340_IRQ_BASE + 64); i++) {
-		irq_desc[i].status = IRQ_DISABLED;
-		irq_desc[i].action = 0;
-		irq_desc[i].depth = 2;
-		irq_desc[i].handler = &mv64340_irq_type;
-	}
-}
--- diff/arch/mips/momentum/jaguar_atx/pci-irq.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/momentum/jaguar_atx/pci-irq.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,70 +0,0 @@
-/*
- * Copyright 2002 Momentum Computer Inc.
- * Author: Matthew Dharm <mdharm@momenco.com> 
- *
- * Based on work for the Linux port to the Ocelot board, which is
- * Copyright 2001 MontaVista Software Inc.
- * Author: Jun Sun, jsun@mvista.com or jsun@junsun.net
- *
- * arch/mips/momentum/jaguar/pci.c
- *     Board-specific PCI routines for mv64340 controller.
- *
- * This program is free software; you can redistribute  it and/or modify it
- * under  the terms of  the GNU General  Public License as published by the
- * Free Software Foundation;  either version 2 of the  License, or (at your
- * option) any later version.
- */
-#include <linux/types.h>
-#include <linux/pci.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <asm/pci.h>
-
-
-void __init mv64340_board_pcibios_fixup_bus(struct pci_bus *bus)
-{
-	struct pci_bus *current_bus = bus;
-	struct pci_dev *devices;
-	struct list_head *devices_link;
-	u16 cmd;
-
-	/* loop over all known devices on this bus */
-	list_for_each(devices_link, &(current_bus->devices)) {
-
-		devices = pci_dev_b(devices_link);
-		if (devices == NULL)
-			continue;
-
-		if ((current_bus->number == 0) &&
-			(PCI_SLOT(devices->devfn) == 1)) {
-			/* PCI-X A */
-			devices->irq = 3;
-		} else if ((current_bus->number == 0) &&
-			(PCI_SLOT(devices->devfn) == 2)) {
-			/* PCI-X B */
-			devices->irq = 4;
-		} else if ((current_bus->number == 1) &&
-			(PCI_SLOT(devices->devfn) == 1)) {
-			/* PCI A */
-			devices->irq = 5;
-		} else if ((current_bus->number == 1) &&
-			(PCI_SLOT(devices->devfn) == 2)) {
-			/* PCI B */
-			devices->irq = 6;
-		} else {
-			/* We don't have assign interrupts for other devices. */
-			devices->irq = 0xff;
-		}
-
-		/* Assign an interrupt number for the device */
-		bus->ops->write_byte(devices, PCI_INTERRUPT_LINE, devices->irq);
-
-		/* enable master for everything but the MV-64340 */
-		if (((current_bus->number != 0) && (current_bus->number != 1))
-				|| (PCI_SLOT(devices->devfn) != 0)) {
-			bus->ops->read_word(devices, PCI_COMMAND, &cmd);
-			cmd |= PCI_COMMAND_MASTER;
-			bus->ops->write_word(devices, PCI_COMMAND, cmd);
-		}
-	}
-}
--- diff/arch/mips/momentum/jaguar_atx/pci.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/momentum/jaguar_atx/pci.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,55 +0,0 @@
-/*
- * Copyright 2002 Momentum Computer
- * Author: Matthew Dharm <mdharm@momenco.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-#include <linux/init.h>
-#include <linux/types.h>
-#include <linux/pci.h>
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <asm/pci.h>
-#include <asm/io.h>
-#include <asm/mv64340.h>
-
-void mv64340_board_pcibios_fixup_bus(struct pci_bus* c);
-
-struct pci_fixup pcibios_fixups[] = {
-	{0}
-};
-
-void __init pcibios_fixup_bus(struct pci_bus *c)
-{
-	mv64340_board_pcibios_fixup_bus(c);
-}
-
-void __init pcibios_init(void)
-{
-	/* Reset PCI I/O and PCI MEM values */
-	ioport_resource.start = 0xe0000000;
-	ioport_resource.end   = 0xe0000000 + 0x20000000 - 1;
-	iomem_resource.start  = 0xc0000000;
-	iomem_resource.end    = 0xc0000000 + 0x20000000 - 1;
-
-	pci_scan_bus(0, &mv64340_bus0_pci_ops, NULL);
-	pci_scan_bus(1, &mv64340_bus1_pci_ops, NULL);
-}
--- diff/arch/mips/momentum/ocelot_c/mv-irq.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/momentum/ocelot_c/mv-irq.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,163 +0,0 @@
-/*
- * Copyright 2002 Momentum Computer
- * Author: mdharm@momenco.com
- *
- * arch/mips/momentum/ocelot_c/mv-irq.c
- *     Interrupt routines for mv64340.  Interrupt numbers are assigned from
- *     MV64340_IRQ_BASE to MV64340_IRQ_BASE+63.
- *
- * This program is free software; you can redistribute  it and/or modify it
- * under  the terms of  the GNU General  Public License as published by the
- * Free Software Foundation;  either version 2 of the  License, or (at your
- * option) any later version.
- */
-
-#include <linux/module.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/kernel.h>
-#include <asm/ptrace.h>
-#include <linux/sched.h>
-#include <linux/kernel_stat.h>
-#include <asm/io.h>
-#include <asm/mv64340.h>
-
-#define MV64340_IRQ_BASE	16
-
-static inline int ls1bit32(unsigned int x)
-{
-        int b = 31, s;
-
-        s = 16; if (x << 16 == 0) s = 0; b -= s; x <<= s;
-        s =  8; if (x <<  8 == 0) s = 0; b -= s; x <<= s;
-        s =  4; if (x <<  4 == 0) s = 0; b -= s; x <<= s;
-        s =  2; if (x <<  2 == 0) s = 0; b -= s; x <<= s;
-        s =  1; if (x <<  1 == 0) s = 0; b -= s;
-
-        return b;
-}
-
-/* mask off an interrupt -- 1 is enable, 0 is disable */
-static inline void mask_mv64340_irq(unsigned int irq)
-{
-	uint32_t value;
-
-	if (irq < (MV64340_IRQ_BASE + 32)) {
-		MV_READ(MV64340_INTERRUPT0_MASK_0_LOW, &value);
-		value &= ~(1 << (irq - MV64340_IRQ_BASE));
-		MV_WRITE(MV64340_INTERRUPT0_MASK_0_LOW, value);
-	} else {
-		MV_READ(MV64340_INTERRUPT0_MASK_0_HIGH, &value);
-		value &= ~(1 << (irq - (MV64340_IRQ_BASE - 32)));
-		MV_WRITE(MV64340_INTERRUPT0_MASK_0_HIGH, value);
-	}
-}
-
-/* unmask an interrupt -- 1 is enable, 0 is disable */
-static inline void unmask_mv64340_irq(unsigned int irq)
-{
-	uint32_t value;
-
-	if (irq < (MV64340_IRQ_BASE + 32)) {
-		MV_READ(MV64340_INTERRUPT0_MASK_0_LOW, &value);
-		value |= 1 << (irq - MV64340_IRQ_BASE);
-		MV_WRITE(MV64340_INTERRUPT0_MASK_0_LOW, value);
-	} else {
-		MV_READ(MV64340_INTERRUPT0_MASK_0_HIGH, &value);
-		value |= 1 << (irq - (MV64340_IRQ_BASE - 32));
-		MV_WRITE(MV64340_INTERRUPT0_MASK_0_HIGH, value);
-	}
-}
-
-/*
- * Enables the IRQ on Marvell Chip
- */
-static void enable_mv64340_irq(unsigned int irq)
-{
-	unmask_mv64340_irq(irq);
-}
-
-/*
- * Initialize the IRQ on Marvell Chip
- */
-static unsigned int startup_mv64340_irq(unsigned int irq)
-{
-	unmask_mv64340_irq(irq);
-	return 0;
-}
-
-/*
- * Disables the IRQ on Marvell Chip
- */
-static void disable_mv64340_irq(unsigned int irq)
-{
-	mask_mv64340_irq(irq);
-}
-
-/*
- * Masks and ACKs an IRQ
- */
-static void mask_and_ack_mv64340_irq(unsigned int irq)
-{
-	mask_mv64340_irq(irq);
-}
-
-/*
- * End IRQ processing
- */
-static void end_mv64340_irq(unsigned int irq)
-{
-	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
-		unmask_mv64340_irq(irq);
-}
-
-/*
- * Interrupt handler for interrupts coming from the Marvell chip.
- * It could be built in ethernet ports etc...
- */
-void ll_mv64340_irq(struct pt_regs *regs)
-{
-	unsigned int irq_src_low, irq_src_high;
- 	unsigned int irq_mask_low, irq_mask_high;
-
-	/* read the interrupt status registers */
-	MV_READ(MV64340_INTERRUPT0_MASK_0_LOW, &irq_mask_low);
-	MV_READ(MV64340_INTERRUPT0_MASK_0_HIGH, &irq_mask_high);
-	MV_READ(MV64340_MAIN_INTERRUPT_CAUSE_LOW, &irq_src_low);
-	MV_READ(MV64340_MAIN_INTERRUPT_CAUSE_HIGH, &irq_src_high);
-
-	/* mask for just the interrupts we want */
-	irq_src_low &= irq_mask_low;
-	irq_src_high &= irq_mask_high;
-
-	if (irq_src_low) 
-		do_IRQ(ls1bit32(irq_src_low) + MV64340_IRQ_BASE, regs);
-	else
-		do_IRQ(ls1bit32(irq_src_high) + MV64340_IRQ_BASE + 32, regs);
-}
-
-#define shutdown_mv64340_irq	disable_mv64340_irq
-
-struct hw_interrupt_type mv64340_irq_type = {
-	"MV-64340",
-	startup_mv64340_irq,
-	shutdown_mv64340_irq,
-	enable_mv64340_irq,
-	disable_mv64340_irq,
-	mask_and_ack_mv64340_irq,
-	end_mv64340_irq,
-	NULL
-};
-
-void mv64340_irq_init(void)
-{
-	int i;
-
-	/* Reset irq handlers pointers to NULL */
-	for (i = MV64340_IRQ_BASE; i < (MV64340_IRQ_BASE + 64); i++) {
-		irq_desc[i].status = IRQ_DISABLED;
-		irq_desc[i].action = 0;
-		irq_desc[i].depth = 2;
-		irq_desc[i].handler = &mv64340_irq_type;
-	}
-}
--- diff/arch/mips/pmc-sierra/yosemite/i2c-yosemite.c	2004-03-11 10:20:21.000000000 +0000
+++ source/arch/mips/pmc-sierra/yosemite/i2c-yosemite.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,186 +0,0 @@
-/*
- *  arch/mips/pmc-sierra/yosemite/i2c-yosemite.c
- *
- *  Copyright (C) 2003 PMC-Sierra Inc.
- *  Author: Manish Lachwani (lachwani@pmc-sierra.com)
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-/*
- * Detailed Description:
- *
- * This block implements the I2C interface to the slave devices like the Atmel 24C32
- * EEPROM and the MAX 1619 Sensors device. The I2C Master interface can be controlled
- * by the SCMB block. And the SCMB block kicks in only when using the Ethernet Mode of
- * operation and __not__ the SysAD mode
- *
- * The SCMB controls the two modes: MDIO and the I2C. The MDIO mode is used to communicate
- * with the Quad-PHY from Marvel. The I2C is used to communicate with the I2C slave devices.
- * It seems that the driver does not explicitly deal with the control of SDA and SCL serial
- * lines. So, the driver will set the slave address, drive the command and then the data. 
- * The SCMB will then control the two serial lines as required. 
- *
- * It seems the documents are very unclear abt this. Hence, I took some time out to write
- * the desciption to have an idea of how the I2C can actually work. Currently, this Linux 
- * driver wont be integrated into the generic Linux I2C framework. And finally, the I2C 
- * interface is also known as the 2BI interface. 2BI means 2-bit interface referring to
- * SDA and SCL serial lines respectively.
- *
- * - Manish Lachwani (12/09/2003)
- */
-
-#include "i2c-yosemite.h"
-
-/*
- * Poll the I2C interface for the BUSY bit. 
- */
-static int titan_i2c_poll(void)
-{
-	int		i = 0;
-	unsigned long	val = 0;
-
-	for (i = 0; i < TITAN_I2C_MAX_POLL; i++) {
-		val = TITAN_I2C_READ(TITAN_I2C_COMMAND);
-
-		if ( !(val & 0x8000))
-			return 0;
-	}
-
-	return TITAN_I2C_ERR_TIMEOUT;
-}
-
-/*
- * Execute the I2C command
- */
-int titan_i2c_xfer(unsigned int slave_addr, titan_i2c_command *cmd, 
-						int size, unsigned int *addr)
-{
-	int		loop = 0, bytes, i;
-	unsigned int	*write_data, data, *read_data;
-	unsigned long	reg_val, val;
-
-	write_data = cmd->data;
-	read_data = addr;
-
-	TITAN_I2C_WRITE(TITAN_I2C_SLAVE_ADDRESS, slave_addr);
-
-	if (cmd->type == TITAN_I2C_CMD_WRITE) 
-		loop = cmd->write_size;
-	else
-		loop = size;
-
-	while (loop > 0) {
-		if ( (cmd->type == TITAN_I2C_CMD_WRITE)  || 
-			(cmd->type == TITAN_I2C_CMD_READ_WRITE) ) {
-			
-			reg_val = TITAN_I2C_DATA;
-			for (i = 0; i < TITAN_I2C_MAX_WORDS_PER_RW; ++i,write_data += 2,
-								reg_val += 4) {
-				if (bytes < cmd->write_size) {
-					data = write_data[0];
-					++data;
-				}
-
-				if (bytes < cmd->write_size) {
-					data = write_data[1];
-					++data;
-				}
-
-				TITAN_I2C_WRITE(reg_val, data);
-			}
-		}
-
-		TITAN_I2C_WRITE(TITAN_I2C_COMMAND, (unsigned int)(cmd->type << 13));
-		if (titan_i2c_poll() != TITAN_I2C_ERR_OK)
-			return TITAN_I2C_ERR_TIMEOUT;
-
-		if ( (cmd->type == TITAN_I2C_CMD_READ)  ||
-			(cmd->type == TITAN_I2C_CMD_READ_WRITE) ) {
-			
-			reg_val = TITAN_I2C_DATA;
-			for (i = 0; i < TITAN_I2C_MAX_WORDS_PER_RW; ++i,read_data += 2,
-								reg_val += 4) {
-				data = TITAN_I2C_READ(reg_val);
-				
-				if (bytes < size) {
-					read_data[0] = data & 0xff;
-					++bytes;
-				}
-
-				if (bytes < size) {
-					read_data[1] = ((data >> 8) & 0xff);
-					++bytes;
-				}
-			}
-		}
-
-		loop -= (TITAN_I2C_MAX_WORDS_PER_RW * 2);
-	}
-						
-	/*
-	 * Read the Interrupt status and then return the appropriate error code 
-	 */
-
-	val = TITAN_I2C_READ(TITAN_I2C_INTERRUPTS);
-	if (val & 0x0020)
-		return TITAN_I2C_ERR_ARB_LOST;
-
-	if (val & 0x0040)
-		return TITAN_I2C_ERR_NO_RESP;
-
-	if (val & 0x0080)
-		return TITAN_I2C_ERR_DATA_COLLISION;
-
-	return TITAN_I2C_ERR_OK;
-}
-
-/*
- * Init the I2C subsystem of the PMC-Sierra Yosemite board
- */
-int titan_i2c_init(titan_i2c_config *config)
-{
-	unsigned int	val;
-
-	/*
-	 * Reset the SCMB and program into the I2C mode
-	 */
-	TITAN_I2C_WRITE(TITAN_I2C_SCMB_CONTROL, 0xA000);
-	TITAN_I2C_WRITE(TITAN_I2C_SCMB_CONTROL, 0x2000);
-
-	/*
-	 * Configure the filtera and clka values
-	 */
-	val = TITAN_I2C_READ(TITAN_I2C_SCMB_CLOCK_A);
-	val |= ( (val & ~(0xF000)) | ( (config->filtera << 12) & 0xF000));
-	val |= ( (val & ~(0x03FF)) | ( config->clka & 0x03FF));
-	TITAN_I2C_WRITE(TITAN_I2C_SCMB_CLOCK_A, val);
-
-	/*
-	 * Configure the filterb and clkb values
-	 */
-	val = TITAN_I2C_READ(TITAN_I2C_SCMB_CLOCK_B);
-	val |= ( (val & ~(0xF000)) | ( (config->filterb << 12) & 0xF000));
-	val |= ( (val & ~(0x03FF)) | ( config->clkb & 0x03FF));
-	TITAN_I2C_WRITE(TITAN_I2C_SCMB_CLOCK_B, val);
-
-	return TITAN_I2C_ERR_OK;
-}
--- diff/arch/mips/sgi-ip27/ip27-setup.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/sgi-ip27/ip27-setup.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,303 +0,0 @@
-/*
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * SGI IP27 specific setup.
- *
- * Copyright (C) 1999, 2000 Ralf Baechle (ralf@gnu.org)
- * Copyright (C) 1999, 2000 Silcon Graphics, Inc.
- */
-#include <linux/config.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/spinlock.h>
-#include <linux/sched.h>
-#include <linux/smp.h>
-
-#include <asm/io.h>
-#include <asm/sn/types.h>
-#include <asm/sn/sn0/addrs.h>
-#include <asm/sn/sn0/hubni.h>
-#include <asm/sn/sn0/hubio.h>
-#include <asm/sn/klconfig.h>
-#include <asm/sn/ioc3.h>
-#include <asm/time.h>
-#include <asm/mipsregs.h>
-#include <asm/sn/arch.h>
-#include <asm/sn/sn_private.h>
-#include <asm/pci/bridge.h>
-#include <asm/paccess.h>
-#include <asm/sn/sn0/ip27.h>
-#include <asm/traps.h>
-
-/* Check against user dumbness.  */
-#ifdef CONFIG_VT
-#error CONFIG_VT not allowed for IP27.
-#endif
-
-#undef DEBUG_SETUP
-#ifdef DEBUG_SETUP
-#define DBG(x...) printk(x)
-#else
-#define DBG(x...)
-#endif
-
-extern void ip27_be_init(void) __init;
-
-/*
- * get_nasid() returns the physical node id number of the caller.
- */
-nasid_t
-get_nasid(void)
-{
-	return (nasid_t)((LOCAL_HUB_L(NI_STATUS_REV_ID) & NSRI_NODEID_MASK)
-	                 >> NSRI_NODEID_SHFT);
-}
-
-/* Extracted from the IOC3 meta driver.  FIXME.  */
-static inline void ioc3_sio_init(void)
-{
-	struct ioc3 *ioc3;
-	nasid_t nid;
-        long loops;
-
-	nid = get_nasid();
-	ioc3 = (struct ioc3 *) KL_CONFIG_CH_CONS_INFO(nid)->memory_base;
-
-	ioc3->sscr_a = 0;			/* PIO mode for uarta.  */
-	ioc3->sscr_b = 0;			/* PIO mode for uartb.  */
-	ioc3->sio_iec = ~0;
-	ioc3->sio_ies = (SIO_IR_SA_INT | SIO_IR_SB_INT);
-
-	loops=1000000; while(loops--);
-	ioc3->sregs.uarta.iu_fcr = 0;
-	ioc3->sregs.uartb.iu_fcr = 0;
-	loops=1000000; while(loops--);
-}
-
-static inline void ioc3_eth_init(void)
-{
-	struct ioc3 *ioc3;
-	nasid_t nid;
-
-	nid = get_nasid();
-	ioc3 = (struct ioc3 *) KL_CONFIG_CH_CONS_INFO(nid)->memory_base;
-
-	ioc3->eier = 0;
-}
-
-/* Try to catch kernel missconfigurations and give user an indication what
-   option to select.  */
-static void __init verify_mode(void)
-{
-	int n_mode;
-
-	n_mode = LOCAL_HUB_L(NI_STATUS_REV_ID) & NSRI_MORENODES_MASK;
-	printk("Machine is in %c mode.\n", n_mode ? 'N' : 'M');
-#ifdef CONFIG_SGI_SN0_N_MODE
-	if (!n_mode)
-		panic("Kernel compiled for M mode.");
-#else
-	if (n_mode)
-		panic("Kernel compiled for N mode.");
-#endif
-}
-
-#define XBOW_WIDGET_PART_NUM    0x0
-#define XXBOW_WIDGET_PART_NUM   0xd000  /* Xbow in Xbridge */
-#define BASE_XBOW_PORT  	8     /* Lowest external port */
-
-extern int bridge_probe(nasid_t nasid, int widget, int masterwid);
-
-static int __init probe_one_port(nasid_t nasid, int widget, int masterwid)
-{
-	widgetreg_t 		widget_id;
-	xwidget_part_num_t	partnum;
-
-	widget_id = *(volatile widgetreg_t *)
-		(RAW_NODE_SWIN_BASE(nasid, widget) + WIDGET_ID);
-	partnum = XWIDGET_PART_NUM(widget_id);
-
-	printk(KERN_INFO "Cpu %d, Nasid 0x%x, widget 0x%x (partnum 0x%x) is ",
-			smp_processor_id(), nasid, widget, partnum);
-
-	switch (partnum) {
-	case BRIDGE_WIDGET_PART_NUM:
-	case XBRIDGE_WIDGET_PART_NUM:
-		bridge_probe(nasid, widget, masterwid);
-		break;
-	default:
-		break;
-	}
-
-	return 0;
-}
-
-static int __init xbow_probe(nasid_t nasid)
-{
-	lboard_t *brd;
-	klxbow_t *xbow_p;
-	unsigned masterwid, i;
-
-	printk("is xbow\n");
-
-	/*
-	 * found xbow, so may have multiple bridges
-	 * need to probe xbow
-	 */
-	brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_MIDPLANE8);
-	if (!brd)
-		return -ENODEV;
-	
-	xbow_p = (klxbow_t *)find_component(brd, NULL, KLSTRUCT_XBOW);
-	if (!xbow_p)
-		return -ENODEV;
-
-	/*
-	 * Okay, here's a xbow. Lets arbitrate and find
-	 * out if we should initialize it. Set enabled
-	 * hub connected at highest or lowest widget as
-	 * master.
-	 */
-#ifdef WIDGET_A
-	i = HUB_WIDGET_ID_MAX + 1;
-	do {
-		i--;
-	} while ((!XBOW_PORT_TYPE_HUB(xbow_p, i)) ||
-		 (!XBOW_PORT_IS_ENABLED(xbow_p, i)));
-#else
-	i = HUB_WIDGET_ID_MIN - 1;
-	do {
-		i++;
-	} while ((!XBOW_PORT_TYPE_HUB(xbow_p, i)) ||
-		 (!XBOW_PORT_IS_ENABLED(xbow_p, i)));
-#endif
-
-	masterwid = i;
-	if (nasid != XBOW_PORT_NASID(xbow_p, i))
-		return 1;
-
-	for (i = HUB_WIDGET_ID_MIN; i <= HUB_WIDGET_ID_MAX; i++) {
-		if (XBOW_PORT_IS_ENABLED(xbow_p, i) &&
-		    XBOW_PORT_TYPE_IO(xbow_p, i))
-			probe_one_port(nasid, i, masterwid);
-	}
-
-	return 0;
-}
-
-static spinlock_t pcibr_setup_lock = SPIN_LOCK_UNLOCKED;
-
-void __init pcibr_setup(cnodeid_t nid)
-{
-	volatile u64 		hubreg;
-	nasid_t	 		nasid;
-	xwidget_part_num_t	partnum;
-	widgetreg_t 		widget_id;
-
-
-	spin_lock(&pcibr_setup_lock);
-
-	/*
-	 * If the master is doing this for headless node, nothing to do.
-	 * This is because currently we require at least one of the hubs
-	 * (master hub) connected to the xbow to have at least one enabled
-	 * cpu to receive intrs. Else we need an array bus_to_intrnasid[]
-	 * that bridge_startup() needs to use to target intrs. All dma is
-	 * routed thru the widget of the master hub. The master hub wid
-	 * is selectable by WIDGET_A below.
-	 */
-	if (nid != get_compact_nodeid())
-		goto out;
-
-	/* find what's on our local node */
-	nasid = COMPACT_TO_NASID_NODEID(nid);
-	hubreg = REMOTE_HUB_L(nasid, IIO_LLP_CSR);
-
-	/* check whether the link is up */
-	if (!(hubreg & IIO_LLP_CSR_IS_UP))
-		goto out;
-
-	widget_id = *(volatile widgetreg_t *)
-                       (RAW_NODE_SWIN_BASE(nasid, 0x0) + WIDGET_ID);
-	partnum = XWIDGET_PART_NUM(widget_id);
-
-	printk(KERN_INFO "Cpu %d, Nasid 0x%x: partnum 0x%x is ",
-			smp_processor_id(), nasid, partnum);
-
-	switch (partnum) {
-	case BRIDGE_WIDGET_PART_NUM:
-		bridge_probe(nasid, 0x8, 0xa);
-		break;
-	case XBOW_WIDGET_PART_NUM:
-	case XXBOW_WIDGET_PART_NUM:
-		xbow_probe(nasid);
-		break;
-	default:
-		printk(" unknown widget??\n");
-		break;
-	}
-
- out:
-	spin_unlock(&pcibr_setup_lock);
-}
-
-extern void ip27_setup_console(void);
-extern void ip27_time_init(void);
-extern void ip27_reboot_setup(void);
-
-void __init per_cpu_init(void)
-{
-	cnodeid_t cnode = get_compact_nodeid();
-	int cpu = smp_processor_id();
-
-	clear_c0_status(ST0_IM);
-	per_hub_init(cnode);
-	cpu_time_init();
-	install_ipi();
-	/* Install our NMI handler if symmon hasn't installed one. */
-	install_cpu_nmi_handler(cputoslice(cpu));
-	set_c0_status(SRB_DEV0 | SRB_DEV1);
-}
-
-static int __init ip27_setup(void)
-{
-	hubreg_t p, e;
-	nasid_t nid;
-
-	ip27_setup_console();
-	ip27_reboot_setup();
-
-	/*
-	 * hub_rtc init and cpu clock intr enabled for later calibrate_delay.
-	 */
-	DBG("ip27_setup(): Entered.\n");
-	nid = get_nasid();
-	printk("IP27: Running on node %d.\n", nid);
-
-	p = LOCAL_HUB_L(PI_CPU_PRESENT_A) & 1;
-	e = LOCAL_HUB_L(PI_CPU_ENABLE_A) & 1;
-	printk("Node %d has %s primary CPU%s.\n", nid,
-	       p ? "a" : "no",
-	       e ? ", CPU is running" : "");
-
-	p = LOCAL_HUB_L(PI_CPU_PRESENT_B) & 1;
-	e = LOCAL_HUB_L(PI_CPU_ENABLE_B) & 1;
-	printk("Node %d has %s secondary CPU%s.\n", nid,
-	       p ? "a" : "no",
-	       e ? ", CPU is running" : "");
-
-	verify_mode();
-	ioc3_sio_init();
-	ioc3_eth_init();
-	per_cpu_init();
-
-	set_io_port_base(IO_BASE);
-
-	board_time_init = ip27_time_init;
-
-	return 0;
-}
-
-early_initcall(ip27_setup);
--- diff/arch/mips/sgi-ip32/ip32-timer.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/sgi-ip32/ip32-timer.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,163 +0,0 @@
-/*
- * IP32 timer calibration
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 2001 Keith M Wesolowski
- */
-#include <linux/bcd.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/param.h>
-#include <linux/string.h>
-#include <linux/interrupt.h>
-#include <linux/kernel_stat.h>
-#include <linux/timex.h>
-
-#include <asm/mipsregs.h>
-#include <asm/param.h>
-#include <asm/bootinfo.h>
-#include <asm/cpu.h>
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <asm/ip32/crime.h>
-#include <asm/ip32/ip32_ints.h>
-
-#include <linux/mc146818rtc.h>
-
-extern volatile unsigned long wall_jiffies;
-
-u32 cc_interval;
-
-/* Cycle counter value at the previous timer interrupt.. */
-static unsigned int timerhi, timerlo;
-
-/* An arbitrary time; this can be decreased if reliability looks good */
-#define WAIT_MS 10
-#define PER_MHZ (1000000 / 2 / HZ)
-/*
- * Change this if you have some constant time drift
- */
-#define USECS_PER_JIFFY (1000000/HZ)
-
-
-static irqreturn_t cc_timer_interrupt(int irq, void *dev_id, struct pt_regs * regs);
-
-static inline uint64_t crime_time(void)
-{
-	return crime_read(CRIME_TIMER) & CRIME_TIMER_MASK;
-}
-
-void __init ip32_timer_setup (struct irqaction *irq)
-{
-	uint64_t time;
-	unsigned int cc_tick;
-
-	write_c0_count(0);
-	irq->handler = cc_timer_interrupt;
-
-	printk("Calibrating system timer... ");
-
-	time = crime_time();
-	cc_tick = read_c0_count();
-
-	while (crime_time() - time < WAIT_MS * 1000000 / CRIME_NS_PER_TICK) ;
-	cc_tick = read_c0_count() - cc_tick;
-	cc_interval = cc_tick / HZ * (1000 / WAIT_MS);
-	/*
-	 * The round-off seems unnecessary; in testing, the error of the
-	 * above procedure is < 100 ticks, which means it gets filtered
-	 * out by the HZ adjustment.
-	 */
-	cc_interval = (cc_interval / PER_MHZ) * PER_MHZ;
-
-	printk("%d MHz CPU detected\n", (int) (cc_interval / PER_MHZ));
-
-	setup_irq(CLOCK_IRQ, irq);
-#define ALLINTS (IE_IRQ0 | IE_IRQ1 | IE_IRQ2 | IE_IRQ3 | IE_IRQ4 | IE_IRQ5)
-	/* Set ourselves up for future interrupts */
-	write_c0_compare(read_c0_count() + cc_interval);
-        change_c0_status(ST0_IM, ALLINTS);
-	local_irq_enable();
-}
-
-static irqreturn_t cc_timer_interrupt(int irq, void *dev_id, struct pt_regs * regs)
-{
-	unsigned int count;
-
-	/*
-	 * The cycle counter is only 32 bit which is good for about
-	 * a minute at current count rates of upto 150MHz or so.
-	 */
-	count = read_c0_count();
-	timerhi += (count < timerlo);	/* Wrap around */
-	timerlo = count;
-
-	write_c0_compare((u32) (count + cc_interval));
-	kstat_this_cpu.irqs[irq]++;
-	do_timer(regs);
-
-	if (!jiffies) {
-		/*
-		 * If jiffies has overflowed in this timer_interrupt we must
-		 * update the timer[hi]/[lo] to make do_fast_gettimeoffset()
-		 * quotient calc still valid. -arca
-		 */
-		timerhi = timerlo = 0;
-	}
-	return IRQ_HANDLED;
-}
-
-void __init ip32_time_init(void)
-{
-	unsigned int epoch = 0, year, mon, day, hour, min, sec;
-	int i;
-
-	/* The Linux interpretation of the CMOS clock register contents:
-	 * When the Update-In-Progress (UIP) flag goes from 1 to 0, the
-	 * RTC registers show the second which has precisely just started.
-	 * Let's hope other operating systems interpret the RTC the same way.
-	 */
-	/* read RTC exactly on falling edge of update flag */
-	for (i = 0 ; i < 1000000 ; i++)	/* may take up to 1 second... */
-		if (CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP)
-			break;
-	for (i = 0 ; i < 1000000 ; i++)	/* must try at least 2.228 ms */
-		if (!(CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP))
-			break;
-	do { /* Isn't this overkill ? UIP above should guarantee consistency */
-		sec = CMOS_READ(RTC_SECONDS);
-		min = CMOS_READ(RTC_MINUTES);
-		hour = CMOS_READ(RTC_HOURS);
-		day = CMOS_READ(RTC_DAY_OF_MONTH);
-		mon = CMOS_READ(RTC_MONTH);
-		year = CMOS_READ(RTC_YEAR);
-	} while (sec != CMOS_READ(RTC_SECONDS));
-	if (!(CMOS_READ(RTC_CONTROL) & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
-		sec = BCD2BIN(sec);
-		min = BCD2BIN(min);
-		hour = BCD2BIN(hour);
-		day = BCD2BIN(day);
-		mon = BCD2BIN(mon);
-		year = BCD2BIN(year);
-	}
-
-	/* Attempt to guess the epoch.  This is the same heuristic as in
-	 * rtc.c so no stupid things will happen to timekeeping.  Who knows,
-	 * maybe Ultrix also uses 1952 as epoch ...
-	 */
-	if (year > 10 && year < 44)
-		epoch = 1980;
-	else if (year < 96)
-		epoch = 1952;
-	year += epoch;
-
-	write_seqlock_irq(&xtime_lock);
-	xtime.tv_sec = mktime(year, mon, day, hour, min, sec);
-	xtime.tv_nsec = 0;
-	write_sequnlock_irq(&xtime_lock);
-}
--- diff/arch/mips/vr41xx/casio-e55/init.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/casio-e55/init.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,49 +0,0 @@
-/*
- * FILE NAME
- *	arch/mips/vr41xx/casio-e55/init.c
- *
- * BRIEF MODULE DESCRIPTION
- *	Initialisation code for the CASIO CASSIOPEIA E-55/65.
- *
- * Copyright 2002 Yoichi Yuasa
- *                yuasa@hh.iij4u.or.jp
- *
- *  This program is free software; you can redistribute it and/or modify it
- *  under the terms of the GNU General Public License as published by the
- *  Free Software Foundation; either version 2 of the License, or (at your
- *  option) any later version.
- */
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-
-#include <asm/bootinfo.h>
-
-const char *get_system_type(void)
-{
-	return "CASIO CASSIOPEIA E-11/15/55/65";
-}
-
-void __init prom_init(void)
-{
-	int argc = fw_arg0;
-	char **argv = (char **) fw_arg1;
-	int i;
-
-	/*
-	 * collect args and prepare cmd_line
-	 */
-	for (i = 1; i < argc; i++) {
-		strcat(arcs_cmdline, argv[i]);
-		if (i < (argc - 1))
-			strcat(arcs_cmdline, " ");
-	}
-
-	mips_machgroup = MACH_GROUP_NEC_VR41XX;
-	mips_machtype = MACH_CASIO_E55;
-}
-
-unsigned long __init prom_free_prom_memory(void)
-{
-	return 0;
-}
--- diff/arch/mips/vr41xx/ibm-workpad/init.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/ibm-workpad/init.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,49 +0,0 @@
-/*
- * FILE NAME
- *	arch/mips/vr41xx/ibm-workpad/init.c
- *
- * BRIEF MODULE DESCRIPTION
- *	Initialisation code for the IBM WorkPad z50.
- *
- * Copyright 2002 Yoichi Yuasa
- *                yuasa@hh.iij4u.or.jp
- *
- *  This program is free software; you can redistribute it and/or modify it
- *  under the terms of the GNU General Public License as published by the
- *  Free Software Foundation; either version 2 of the License, or (at your
- *  option) any later version.
- */
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-
-#include <asm/bootinfo.h>
-
-const char *get_system_type(void)
-{
-	return "IBM WorkPad z50";
-}
-
-void __init prom_init(void)
-{
-	int argc = fw_arg0;
-	char **argv = (char **) fw_arg1;
-	int i;
-
-	/*
-	 * collect args and prepare cmd_line
-	 */
-	for (i = 1; i < argc; i++) {
-		strcat(arcs_cmdline, argv[i]);
-		if (i < (argc - 1))
-			strcat(arcs_cmdline, " ");
-	}
-
-	mips_machgroup = MACH_GROUP_NEC_VR41XX;
-	mips_machtype = MACH_IBM_WORKPAD;
-}
-
-unsigned long __init prom_free_prom_memory(void)
-{
-	return 0;
-}
--- diff/arch/mips/vr41xx/nec-eagle/init.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/nec-eagle/init.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,74 +0,0 @@
-/*
- * FILE NAME
- *	arch/mips/vr41xx/nec-eagle/init.c
- *
- * BRIEF MODULE DESCRIPTION
- *	Initialisation code for the NEC Eagle/Hawk board.
- *
- * Author: Yoichi Yuasa
- *         yyuasa@mvista.com or source@mvista.com
- *
- * Copyright 2001,2002 MontaVista Software Inc.
- *
- *  This program is free software; you can redistribute it and/or modify it
- *  under the terms of the GNU General Public License as published by the
- *  Free Software Foundation; either version 2 of the License, or (at your
- *  option) any later version.
- *
- *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
- *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
- *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-/*
- * Changes:
- *  MontaVista Software Inc. <yyuasa@mvista.com> or <source@mvista.com>
- *  - Added support for NEC Hawk.
- *
- *  MontaVista Software Inc. <yyuasa@mvista.com> or <source@mvista.com>
- *  - New creation, NEC Eagle is supported.
- */
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-
-#include <asm/bootinfo.h>
-
-const char *get_system_type(void)
-{
-	return "NEC Eagle/Hawk";
-}
-
-void __init prom_init(void)
-{
-	int argc = fw_arg0;
-	char **argv = (char **) fw_arg1;
-	int i;
-
-	/*
-	 * collect args and prepare cmd_line
-	 */
-	for (i = 1; i < argc; i++) {
-		strcat(arcs_cmdline, argv[i]);
-		if (i < (argc - 1))
-			strcat(arcs_cmdline, " ");
-	}
-
-	mips_machgroup = MACH_GROUP_NEC_VR41XX;
-	mips_machtype = MACH_NEC_EAGLE;
-}
-
-unsigned long __init prom_free_prom_memory(void)
-{
-	return 0;
-}
--- diff/arch/mips/vr41xx/tanbac-tb0226/init.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/tanbac-tb0226/init.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,53 +0,0 @@
-/*
- * FILE NAME
- *	arch/mips/vr41xx/tanbac-tb0226/init.c
- *
- * BRIEF MODULE DESCRIPTION
- *	Initialisation code for the TANBAC TB0226.
- *
- * Copyright 2002,2003 Yoichi Yuasa
- *                yuasa@hh.iij4u.or.jp
- *
- *  This program is free software; you can redistribute it and/or modify it
- *  under the terms of the GNU General Public License as published by the
- *  Free Software Foundation; either version 2 of the License, or (at your
- *  option) any later version.
- */
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/smp.h>
-#include <linux/string.h>
-
-#include <asm/bootinfo.h>
-#include <asm/cpu.h>
-#include <asm/mipsregs.h>
-#include <asm/vr41xx/vr41xx.h>
-
-const char *get_system_type(void)
-{
-	return "TANBAC TB0226";
-}
-
-void __init prom_init(void)
-{
-	int argc = fw_arg0;
-	char **argv = (char **) fw_arg1;
-	int i;
-
-	/*
-	 * collect args and prepare cmd_line
-	 */
-	for (i = 1; i < argc; i++) {
-		strcat(arcs_cmdline, argv[i]);
-		if (i < (argc - 1))
-			strcat(arcs_cmdline, " ");
-	}
-
-	mips_machgroup = MACH_GROUP_NEC_VR41XX;
-	mips_machtype = MACH_TANBAC_TB0226;
-}
-
-unsigned long __init prom_free_prom_memory(void)
-{
-	return 0;
-}
--- diff/arch/mips/vr41xx/tanbac-tb0229/init.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/tanbac-tb0229/init.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,58 +0,0 @@
-/*
- * FILE NAME
- *	arch/mips/vr41xx/tanbac-tb0229/init.c
- *
- * BRIEF MODULE DESCRIPTION
- *	Initialisation code for the TANBAC TB0229(VR4131DIMM)
- *
- * Copyright 2002,2003 Yoichi Yuasa
- *                yuasa@hh.iij4u.or.jp
- *
- * Modified for TANBAC TB0229:
- * Copyright 2003 Megasolution Inc.
- *                matsu@megasolution.jp
- *
- *  This program is free software; you can redistribute it and/or modify it
- *  under the terms of the GNU General Public License as published by the
- *  Free Software Foundation; either version 2 of the License, or (at your
- *  option) any later version.
- */
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/smp.h>
-#include <linux/string.h>
-
-#include <asm/bootinfo.h>
-#include <asm/cpu.h>
-#include <asm/mipsregs.h>
-#include <asm/vr41xx/vr41xx.h>
-
-const char *get_system_type(void)
-{
-	return "TANBAC TB0229";
-}
-
-void __init prom_init(void)
-{
-	int argc = fw_arg0;
-	char **argv = (char **) fw_arg1;
-	int i;
-
-	/*
-	 * collect args and prepare cmd_line
-	 */
-	for (i = 1; i < argc; i++) {
-		strcat(arcs_cmdline, argv[i]);
-		if (i < (argc - 1))
-			strcat(arcs_cmdline, " ");
-	}
-
-	mips_machgroup = MACH_GROUP_NEC_VR41XX;
-	mips_machtype = MACH_TANBAC_TB0229;
-}
-
-unsigned long __init prom_free_prom_memory(void)
-{
-	return 0;
-}
--- diff/arch/mips/vr41xx/victor-mpc30x/init.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/victor-mpc30x/init.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,54 +0,0 @@
-/*
- * FILE NAME
- *	arch/mips/vr41xx/victor-mpc30x/init.c
- *
- * BRIEF MODULE DESCRIPTION
- *	Initialisation code for the Victor MP-C303/304.
- *
- * Copyright 2002 Yoichi Yuasa
- *                yuasa@hh.iij4u.or.jp
- *
- *  This program is free software; you can redistribute it and/or modify it
- *  under the terms of the GNU General Public License as published by the
- *  Free Software Foundation; either version 2 of the License, or (at your
- *  option) any later version.
- */
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-
-#include <asm/bootinfo.h>
-#include <asm/cpu.h>
-#include <asm/mipsregs.h>
-#include <asm/vr41xx/vr41xx.h>
-
-const char *get_system_type(void)
-{
-	return "Victor MP-C303/304";
-}
-
-void __init prom_init(void)
-{
-	int argc = fw_arg0;
-	char **argv = (char **) fw_arg1;
-	int i;
-
-	/*
-	 * collect args and prepare cmd_line
-	 */
-	for (i = 1; i < argc; i++) {
-		strcat(arcs_cmdline, argv[i]);
-		if (i < (argc - 1))
-			strcat(arcs_cmdline, " ");
-	}
-
-	mips_machgroup = MACH_GROUP_NEC_VR41XX;
-	mips_machtype = MACH_VICTOR_MPC30X;
-
-	add_memory_region(0, 32 << 20, BOOT_MEM_RAM);
-}
-
-unsigned long __init prom_free_prom_memory(void)
-{
-	return 0;
-}
--- diff/arch/mips/vr41xx/zao-capcella/init.c	2004-03-11 10:20:22.000000000 +0000
+++ source/arch/mips/vr41xx/zao-capcella/init.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,53 +0,0 @@
-/*
- * FILE NAME
- *	arch/mips/vr41xx/zao-capcella/init.c
- *
- * BRIEF MODULE DESCRIPTION
- *	Initialisation code for the ZAO Networks Capcella.
- *
- * Copyright 2002 Yoichi Yuasa
- *                yuasa@hh.iij4u.or.jp
- *
- *  This program is free software; you can redistribute it and/or modify it
- *  under the terms of the GNU General Public License as published by the
- *  Free Software Foundation; either version 2 of the License, or (at your
- *  option) any later version.
- */
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/smp.h>
-#include <linux/string.h>
-
-#include <asm/bootinfo.h>
-#include <asm/cpu.h>
-#include <asm/mipsregs.h>
-#include <asm/vr41xx/vr41xx.h>
-
-const char *get_system_type(void)
-{
-	return "ZAO Networks Capcella";
-}
-
-void __init prom_init(int argc, char **argv, unsigned long magic, int *prom_vec)
-{
-	int argc = fw_arg0;
-	char **argv = (char **) fw_arg1;
-	int i;
-
-	/*
-	 * collect args and prepare cmd_line
-	 */
-	for (i = 1; i < argc; i++) {
-		strcat(arcs_cmdline, argv[i]);
-		if (i < (argc - 1))
-			strcat(arcs_cmdline, " ");
-	}
-
-	mips_machgroup = MACH_GROUP_NEC_VR41XX;
-	mips_machtype = MACH_ZAO_CAPCELLA;
-}
-
-unsigned long __init prom_free_prom_memory(void)
-{
-	return 0;
-}
--- diff/arch/ppc64/oprofile/init.c	2003-07-11 09:39:50.000000000 +0100
+++ source/arch/ppc64/oprofile/init.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,24 +0,0 @@
-/**
- * @file init.c
- *
- * @remark Copyright 2002 OProfile authors
- * @remark Read the file COPYING
- *
- * @author John Levon <levon@movementarian.org>
- */
-
-#include <linux/kernel.h>
-#include <linux/oprofile.h>
-#include <linux/init.h>
- 
-extern void timer_init(struct oprofile_operations ** ops);
-
-int __init oprofile_arch_init(struct oprofile_operations ** ops)
-{
-	return -ENODEV;
-}
-
-
-void oprofile_arch_exit(void)
-{
-}
--- diff/arch/x86_64/kernel/mtrr/Makefile	2003-02-13 11:46:50.000000000 +0000
+++ source/arch/x86_64/kernel/mtrr/Makefile	1970-01-01 01:00:00.000000000 +0100
@@ -1,28 +0,0 @@
-#
-# Reuse the i386 MTRR driver.
-#
-
-obj-y		:= main.o if.o generic.o state.o
-obj-y		+= amd.o
-obj-y		+= cyrix.o
-obj-y		+= centaur.o
-
-$(obj)/main.c: $(obj)/mtrr.h
-	@ln -sf ../../../i386/kernel/cpu/mtrr/main.c $(obj)/main.c
-$(obj)/if.c: $(obj)/mtrr.h
-	@ln -sf ../../../i386/kernel/cpu/mtrr/if.c $(obj)/if.c
-$(obj)/generic.c: $(obj)/mtrr.h
-	@ln -sf ../../../i386/kernel/cpu/mtrr/generic.c $(obj)/generic.c
-$(obj)/state.c: $(obj)/mtrr.h
-	@ln -sf ../../../i386/kernel/cpu/mtrr/state.c $(obj)/state.c
-$(obj)/amd.c: $(obj)/mtrr.h
-	@ln -sf ../../../i386/kernel/cpu/mtrr/amd.c $(obj)/amd.c
-$(obj)/cyrix.c: $(obj)/mtrr.h
-	@ln -sf ../../../i386/kernel/cpu/mtrr/cyrix.c $(obj)/cyrix.c
-$(obj)/centaur.c: $(obj)/mtrr.h
-	@ln -sf ../../../i386/kernel/cpu/mtrr/centaur.c $(obj)/centaur.c
-$(obj)/mtrr.h:
-	@ln -sf ../../../i386/kernel/cpu/mtrr/mtrr.h $(obj)/mtrr.h
-
-clean-files += main.c if.c generic.c state.c amd.c cyrix.c centaur.c mtrr.h
-
--- diff/drivers/char/ipmi/ipmi_kcs_intf.c	2004-03-11 10:20:23.000000000 +0000
+++ source/drivers/char/ipmi/ipmi_kcs_intf.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,1305 +0,0 @@
-/*
- * ipmi_kcs_intf.c
- *
- * The interface to the IPMI driver for the KCS.
- *
- * Author: MontaVista Software, Inc.
- *         Corey Minyard <minyard@mvista.com>
- *         source@mvista.com
- *
- * Copyright 2002 MontaVista Software Inc.
- *
- *  This program is free software; you can redistribute it and/or modify it
- *  under the terms of the GNU General Public License as published by the
- *  Free Software Foundation; either version 2 of the License, or (at your
- *  option) any later version.
- *
- *
- *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
- *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
- *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-/*
- * This file holds the "policy" for the interface to the KCS state
- * machine.  It does the configuration, handles timers and interrupts,
- * and drives the real KCS state machine.
- */
-
-#include <linux/config.h>
-#include <linux/module.h>
-#include <asm/system.h>
-#include <linux/sched.h>
-#include <linux/timer.h>
-#include <linux/errno.h>
-#include <linux/spinlock.h>
-#include <linux/slab.h>
-#include <linux/delay.h>
-#include <linux/list.h>
-#include <linux/ioport.h>
-#ifdef CONFIG_HIGH_RES_TIMERS
-#include <linux/hrtime.h>
-#endif
-#include <linux/interrupt.h>
-#include <linux/rcupdate.h>
-#include <linux/ipmi_smi.h>
-#include <asm/io.h>
-#include <asm/irq.h>
-#include "ipmi_kcs_sm.h"
-#include <linux/init.h>
-
-/* Measure times between events in the driver. */
-#undef DEBUG_TIMING
-
-/* Timing parameters.  Call every 10 ms when not doing anything,
-   otherwise call every KCS_SHORT_TIMEOUT_USEC microseconds. */
-#define KCS_TIMEOUT_TIME_USEC	10000
-#define KCS_USEC_PER_JIFFY	(1000000/HZ)
-#define KCS_TIMEOUT_JIFFIES	(KCS_TIMEOUT_TIME_USEC/KCS_USEC_PER_JIFFY)
-#define KCS_SHORT_TIMEOUT_USEC  250 /* .25ms when the SM request a
-                                       short timeout */
-
-#ifdef CONFIG_IPMI_KCS
-/* This forces a dependency to the config file for this option. */
-#endif
-
-enum kcs_intf_state {
-	KCS_NORMAL,
-	KCS_GETTING_FLAGS,
-	KCS_GETTING_EVENTS,
-	KCS_CLEARING_FLAGS,
-	KCS_CLEARING_FLAGS_THEN_SET_IRQ,
-	KCS_GETTING_MESSAGES,
-	KCS_ENABLE_INTERRUPTS1,
-	KCS_ENABLE_INTERRUPTS2
-	/* FIXME - add watchdog stuff. */
-};
-
-struct kcs_info
-{
-	ipmi_smi_t          intf;
-	struct kcs_data     *kcs_sm;
-	spinlock_t          kcs_lock;
-	spinlock_t          msg_lock;
-	struct list_head    xmit_msgs;
-	struct list_head    hp_xmit_msgs;
-	struct ipmi_smi_msg *curr_msg;
-	enum kcs_intf_state kcs_state;
-
-	/* Flags from the last GET_MSG_FLAGS command, used when an ATTN
-	   is set to hold the flags until we are done handling everything
-	   from the flags. */
-#define RECEIVE_MSG_AVAIL	0x01
-#define EVENT_MSG_BUFFER_FULL	0x02
-#define WDT_PRE_TIMEOUT_INT	0x08
-	unsigned char       msg_flags;
-
-	/* If set to true, this will request events the next time the
-	   state machine is idle. */
-	atomic_t            req_events;
-
-	/* If true, run the state machine to completion on every send
-	   call.  Generally used after a panic to make sure stuff goes
-	   out. */
-	int                 run_to_completion;
-
-	/* The I/O port of a KCS interface. */
-	int                 port;
-
-	/* zero if no irq; */
-	int                 irq;
-
-	/* The physical and remapped memory addresses of a KCS interface. */
-	unsigned long	    physaddr;
-	unsigned char	    *addr;
-
-	/* The timer for this kcs. */
-	struct timer_list   kcs_timer;
-
-	/* The time (in jiffies) the last timeout occurred at. */
-	unsigned long       last_timeout_jiffies;
-
-	/* Used to gracefully stop the timer without race conditions. */
-	volatile int        stop_operation;
-	volatile int        timer_stopped;
-
-	/* The driver will disable interrupts when it gets into a
-	   situation where it cannot handle messages due to lack of
-	   memory.  Once that situation clears up, it will re-enable
-	   interrupts. */
-	int                 interrupt_disabled;
-};
-
-static void kcs_restart_short_timer(struct kcs_info *kcs_info);
-
-static void deliver_recv_msg(struct kcs_info *kcs_info, struct ipmi_smi_msg *msg)
-{
-	/* Deliver the message to the upper layer with the lock
-           released. */
-	spin_unlock(&(kcs_info->kcs_lock));
-	ipmi_smi_msg_received(kcs_info->intf, msg);
-	spin_lock(&(kcs_info->kcs_lock));
-}
-
-static void return_hosed_msg(struct kcs_info *kcs_info)
-{
-	struct ipmi_smi_msg *msg = kcs_info->curr_msg;
-
-	/* Make it a reponse */
-	msg->rsp[0] = msg->data[0] | 4;
-	msg->rsp[1] = msg->data[1];
-	msg->rsp[2] = 0xFF; /* Unknown error. */
-	msg->rsp_size = 3;
-			
-	kcs_info->curr_msg = NULL;
-	deliver_recv_msg(kcs_info, msg);
-}
-
-static enum kcs_result start_next_msg(struct kcs_info *kcs_info)
-{
-	int              rv;
-	struct list_head *entry = NULL;
-#ifdef DEBUG_TIMING
-	struct timeval t;
-#endif
-
-	/* No need to save flags, we aleady have interrupts off and we
-	   already hold the KCS lock. */
-	spin_lock(&(kcs_info->msg_lock));
-	
-	/* Pick the high priority queue first. */
-	if (! list_empty(&(kcs_info->hp_xmit_msgs))) {
-		entry = kcs_info->hp_xmit_msgs.next;
-	} else if (! list_empty(&(kcs_info->xmit_msgs))) {
-		entry = kcs_info->xmit_msgs.next;
-	}
-
-	if (!entry) {
-		kcs_info->curr_msg = NULL;
-		rv = KCS_SM_IDLE;
-	} else {
-		int err;
-
-		list_del(entry);
-		kcs_info->curr_msg = list_entry(entry,
-						struct ipmi_smi_msg,
-						link);
-#ifdef DEBUG_TIMING
-		do_gettimeofday(&t);
-		printk("**Start2: %d.%9.9d\n", t.tv_sec, t.tv_usec);
-#endif
-		err = start_kcs_transaction(kcs_info->kcs_sm,
-					   kcs_info->curr_msg->data,
-					   kcs_info->curr_msg->data_size);
-		if (err) {
-			return_hosed_msg(kcs_info);
-		}
-
-		rv = KCS_CALL_WITHOUT_DELAY;
-	}
-	spin_unlock(&(kcs_info->msg_lock));
-
-	return rv;
-}
-
-static void start_enable_irq(struct kcs_info *kcs_info)
-{
-	unsigned char msg[2];
-
-	/* If we are enabling interrupts, we have to tell the
-	   BMC to use them. */
-	msg[0] = (IPMI_NETFN_APP_REQUEST << 2);
-	msg[1] = IPMI_GET_BMC_GLOBAL_ENABLES_CMD;
-
-	start_kcs_transaction(kcs_info->kcs_sm, msg, 2);
-	kcs_info->kcs_state = KCS_ENABLE_INTERRUPTS1;
-}
-
-static void start_clear_flags(struct kcs_info *kcs_info)
-{
-	unsigned char msg[3];
-
-	/* Make sure the watchdog pre-timeout flag is not set at startup. */
-	msg[0] = (IPMI_NETFN_APP_REQUEST << 2);
-	msg[1] = IPMI_CLEAR_MSG_FLAGS_CMD;
-	msg[2] = WDT_PRE_TIMEOUT_INT;
-
-	start_kcs_transaction(kcs_info->kcs_sm, msg, 3);
-	kcs_info->kcs_state = KCS_CLEARING_FLAGS;
-}
-
-/* When we have a situtaion where we run out of memory and cannot
-   allocate messages, we just leave them in the BMC and run the system
-   polled until we can allocate some memory.  Once we have some
-   memory, we will re-enable the interrupt. */
-static inline void disable_kcs_irq(struct kcs_info *kcs_info)
-{
-	if ((kcs_info->irq) && (!kcs_info->interrupt_disabled)) {
-		disable_irq_nosync(kcs_info->irq);
-		kcs_info->interrupt_disabled = 1;
-	}
-}
-
-static inline void enable_kcs_irq(struct kcs_info *kcs_info)
-{
-	if ((kcs_info->irq) && (kcs_info->interrupt_disabled)) {
-		enable_irq(kcs_info->irq);
-		kcs_info->interrupt_disabled = 0;
-	}
-}
-
-static void handle_flags(struct kcs_info *kcs_info)
-{
-	if (kcs_info->msg_flags & WDT_PRE_TIMEOUT_INT) {
-		/* Watchdog pre-timeout */
-		start_clear_flags(kcs_info);
-		kcs_info->msg_flags &= ~WDT_PRE_TIMEOUT_INT;
-		spin_unlock(&(kcs_info->kcs_lock));
-		ipmi_smi_watchdog_pretimeout(kcs_info->intf);
-		spin_lock(&(kcs_info->kcs_lock));
-	} else if (kcs_info->msg_flags & RECEIVE_MSG_AVAIL) {
-		/* Messages available. */
-		kcs_info->curr_msg = ipmi_alloc_smi_msg();
-		if (!kcs_info->curr_msg) {
-			disable_kcs_irq(kcs_info);
-			kcs_info->kcs_state = KCS_NORMAL;
-			return;
-		}
-		enable_kcs_irq(kcs_info);
-
-		kcs_info->curr_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2);
-		kcs_info->curr_msg->data[1] = IPMI_GET_MSG_CMD;
-		kcs_info->curr_msg->data_size = 2;
-
-		start_kcs_transaction(kcs_info->kcs_sm,
-				      kcs_info->curr_msg->data,
-				      kcs_info->curr_msg->data_size);
-		kcs_info->kcs_state = KCS_GETTING_MESSAGES;
-	} else if (kcs_info->msg_flags & EVENT_MSG_BUFFER_FULL) {
-		/* Events available. */
-		kcs_info->curr_msg = ipmi_alloc_smi_msg();
-		if (!kcs_info->curr_msg) {
-			disable_kcs_irq(kcs_info);
-			kcs_info->kcs_state = KCS_NORMAL;
-			return;
-		}
-		enable_kcs_irq(kcs_info);
-
-		kcs_info->curr_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2);
-		kcs_info->curr_msg->data[1] = IPMI_READ_EVENT_MSG_BUFFER_CMD;
-		kcs_info->curr_msg->data_size = 2;
-
-		start_kcs_transaction(kcs_info->kcs_sm,
-				      kcs_info->curr_msg->data,
-				      kcs_info->curr_msg->data_size);
-		kcs_info->kcs_state = KCS_GETTING_EVENTS;
-	} else {
-		kcs_info->kcs_state = KCS_NORMAL;
-	}
-}
-
-static void handle_transaction_done(struct kcs_info *kcs_info)
-{
-	struct ipmi_smi_msg *msg;
-#ifdef DEBUG_TIMING
-	struct timeval t;
-
-	do_gettimeofday(&t);
-	printk("**Done: %d.%9.9d\n", t.tv_sec, t.tv_usec);
-#endif
-	switch (kcs_info->kcs_state) {
-	case KCS_NORMAL:
-		if (!kcs_info->curr_msg)
-			break;
-			
-		kcs_info->curr_msg->rsp_size
-			= kcs_get_result(kcs_info->kcs_sm,
-					 kcs_info->curr_msg->rsp,
-					 IPMI_MAX_MSG_LENGTH);
-		
-		/* Do this here becase deliver_recv_msg() releases the
-		   lock, and a new message can be put in during the
-		   time the lock is released. */
-		msg = kcs_info->curr_msg;
-		kcs_info->curr_msg = NULL;
-		deliver_recv_msg(kcs_info, msg);
-		break;
-		
-	case KCS_GETTING_FLAGS:
-	{
-		unsigned char msg[4];
-		unsigned int  len;
-
-		/* We got the flags from the KCS, now handle them. */
-		len = kcs_get_result(kcs_info->kcs_sm, msg, 4);
-		if (msg[2] != 0) {
-			/* Error fetching flags, just give up for
-			   now. */
-			kcs_info->kcs_state = KCS_NORMAL;
-		} else if (len < 3) {
-			/* Hmm, no flags.  That's technically illegal, but
-			   don't use uninitialized data. */
-			kcs_info->kcs_state = KCS_NORMAL;
-		} else {
-			kcs_info->msg_flags = msg[3];
-			handle_flags(kcs_info);
-		}
-		break;
-	}
-
-	case KCS_CLEARING_FLAGS:
-	case KCS_CLEARING_FLAGS_THEN_SET_IRQ:
-	{
-		unsigned char msg[3];
-
-		/* We cleared the flags. */
-		kcs_get_result(kcs_info->kcs_sm, msg, 3);
-		if (msg[2] != 0) {
-			/* Error clearing flags */
-			printk(KERN_WARNING
-			       "ipmi_kcs: Error clearing flags: %2.2x\n",
-			       msg[2]);
-		}
-		if (kcs_info->kcs_state == KCS_CLEARING_FLAGS_THEN_SET_IRQ)
-			start_enable_irq(kcs_info);
-		else
-			kcs_info->kcs_state = KCS_NORMAL;
-		break;
-	}
-
-	case KCS_GETTING_EVENTS:
-	{
-		kcs_info->curr_msg->rsp_size
-			= kcs_get_result(kcs_info->kcs_sm,
-					 kcs_info->curr_msg->rsp,
-					 IPMI_MAX_MSG_LENGTH);
-
-		/* Do this here becase deliver_recv_msg() releases the
-		   lock, and a new message can be put in during the
-		   time the lock is released. */
-		msg = kcs_info->curr_msg;
-		kcs_info->curr_msg = NULL;
-		if (msg->rsp[2] != 0) {
-			/* Error getting event, probably done. */
-			msg->done(msg);
-
-			/* Take off the event flag. */
-			kcs_info->msg_flags &= ~EVENT_MSG_BUFFER_FULL;
-		} else {
-			deliver_recv_msg(kcs_info, msg);
-		}
-		handle_flags(kcs_info);
-		break;
-	}
-
-	case KCS_GETTING_MESSAGES:
-	{
-		kcs_info->curr_msg->rsp_size
-			= kcs_get_result(kcs_info->kcs_sm,
-					 kcs_info->curr_msg->rsp,
-					 IPMI_MAX_MSG_LENGTH);
-
-		/* Do this here becase deliver_recv_msg() releases the
-		   lock, and a new message can be put in during the
-		   time the lock is released. */
-		msg = kcs_info->curr_msg;
-		kcs_info->curr_msg = NULL;
-		if (msg->rsp[2] != 0) {
-			/* Error getting event, probably done. */
-			msg->done(msg);
-
-			/* Take off the msg flag. */
-			kcs_info->msg_flags &= ~RECEIVE_MSG_AVAIL;
-		} else {
-			deliver_recv_msg(kcs_info, msg);
-		}
-		handle_flags(kcs_info);
-		break;
-	}
-
-	case KCS_ENABLE_INTERRUPTS1:
-	{
-		unsigned char msg[4];
-
-		/* We got the flags from the KCS, now handle them. */
-		kcs_get_result(kcs_info->kcs_sm, msg, 4);
-		if (msg[2] != 0) {
-			printk(KERN_WARNING
-			       "ipmi_kcs: Could not enable interrupts"
-			       ", failed get, using polled mode.\n");
-			kcs_info->kcs_state = KCS_NORMAL;
-		} else {
-			msg[0] = (IPMI_NETFN_APP_REQUEST << 2);
-			msg[1] = IPMI_SET_BMC_GLOBAL_ENABLES_CMD;
-			msg[2] = msg[3] | 1; /* enable msg queue int */
-			start_kcs_transaction(kcs_info->kcs_sm, msg,3);
-			kcs_info->kcs_state = KCS_ENABLE_INTERRUPTS2;
-		}
-		break;
-	}
-
-	case KCS_ENABLE_INTERRUPTS2:
-	{
-		unsigned char msg[4];
-
-		/* We got the flags from the KCS, now handle them. */
-		kcs_get_result(kcs_info->kcs_sm, msg, 4);
-		if (msg[2] != 0) {
-			printk(KERN_WARNING
-			       "ipmi_kcs: Could not enable interrupts"
-			       ", failed set, using polled mode.\n");
-		}
-		kcs_info->kcs_state = KCS_NORMAL;
-		break;
-	}
-	}
-}
-
-/* Called on timeouts and events.  Timeouts should pass the elapsed
-   time, interrupts should pass in zero. */
-static enum kcs_result kcs_event_handler(struct kcs_info *kcs_info, int time)
-{
-	enum kcs_result kcs_result;
-
- restart:
-	/* There used to be a loop here that waited a little while
-	   (around 25us) before giving up.  That turned out to be
-	   pointless, the minimum delays I was seeing were in the 300us
-	   range, which is far too long to wait in an interrupt.  So
-	   we just run until the state machine tells us something
-	   happened or it needs a delay. */
-	kcs_result = kcs_event(kcs_info->kcs_sm, time);
-	time = 0;
-	while (kcs_result == KCS_CALL_WITHOUT_DELAY)
-	{
-		kcs_result = kcs_event(kcs_info->kcs_sm, 0);
-	}
-
-	if (kcs_result == KCS_TRANSACTION_COMPLETE)
-	{
-		handle_transaction_done(kcs_info);
-		kcs_result = kcs_event(kcs_info->kcs_sm, 0);
-	}
-	else if (kcs_result == KCS_SM_HOSED)
-	{
-		if (kcs_info->curr_msg != NULL) {
-			/* If we were handling a user message, format
-                           a response to send to the upper layer to
-                           tell it about the error. */
-			return_hosed_msg(kcs_info);
-		}
-		kcs_result = kcs_event(kcs_info->kcs_sm, 0);
-		kcs_info->kcs_state = KCS_NORMAL;
-	}
-
-	/* We prefer handling attn over new messages. */
-	if (kcs_result == KCS_ATTN)
-	{
-		unsigned char msg[2];
-
-		/* Got a attn, send down a get message flags to see
-                   what's causing it.  It would be better to handle
-                   this in the upper layer, but due to the way
-                   interrupts work with the KCS, that's not really
-                   possible. */
-		msg[0] = (IPMI_NETFN_APP_REQUEST << 2);
-		msg[1] = IPMI_GET_MSG_FLAGS_CMD;
-
-		start_kcs_transaction(kcs_info->kcs_sm, msg, 2);
-		kcs_info->kcs_state = KCS_GETTING_FLAGS;
-		goto restart;
-	}
-
-	/* If we are currently idle, try to start the next message. */
-	if (kcs_result == KCS_SM_IDLE) {
-		kcs_result = start_next_msg(kcs_info);
-		if (kcs_result != KCS_SM_IDLE)
-			goto restart;
-        }
-
-	if ((kcs_result == KCS_SM_IDLE)
-	    && (atomic_read(&kcs_info->req_events)))
-	{
-		/* We are idle and the upper layer requested that I fetch
-		   events, so do so. */
-		unsigned char msg[2];
-
-		atomic_set(&kcs_info->req_events, 0);
-		msg[0] = (IPMI_NETFN_APP_REQUEST << 2);
-		msg[1] = IPMI_GET_MSG_FLAGS_CMD;
-
-		start_kcs_transaction(kcs_info->kcs_sm, msg, 2);
-		kcs_info->kcs_state = KCS_GETTING_FLAGS;
-		goto restart;
-	}
-
-	return kcs_result;
-}
-
-static void sender(void                *send_info,
-		   struct ipmi_smi_msg *msg,
-		   int                 priority)
-{
-	struct kcs_info *kcs_info = (struct kcs_info *) send_info;
-	enum kcs_result result;
-	unsigned long   flags;
-#ifdef DEBUG_TIMING
-	struct timeval t;
-#endif
-
-	spin_lock_irqsave(&(kcs_info->msg_lock), flags);
-#ifdef DEBUG_TIMING
-	do_gettimeofday(&t);
-	printk("**Enqueue: %d.%9.9d\n", t.tv_sec, t.tv_usec);
-#endif
-
-	if (kcs_info->run_to_completion) {
-		/* If we are running to completion, then throw it in
-		   the list and run transactions until everything is
-		   clear.  Priority doesn't matter here. */
-		list_add_tail(&(msg->link), &(kcs_info->xmit_msgs));
-
-		/* We have to release the msg lock and claim the kcs
-		   lock in this case, because of race conditions. */
-		spin_unlock_irqrestore(&(kcs_info->msg_lock), flags);
-
-		spin_lock_irqsave(&(kcs_info->kcs_lock), flags);
-		result = kcs_event_handler(kcs_info, 0);
-		while (result != KCS_SM_IDLE) {
-			udelay(KCS_SHORT_TIMEOUT_USEC);
-			result = kcs_event_handler(kcs_info,
-						   KCS_SHORT_TIMEOUT_USEC);
-		}
-		spin_unlock_irqrestore(&(kcs_info->kcs_lock), flags);
-		return;
-	} else {
-		if (priority > 0) {
-			list_add_tail(&(msg->link), &(kcs_info->hp_xmit_msgs));
-		} else {
-			list_add_tail(&(msg->link), &(kcs_info->xmit_msgs));
-		}
-	}
-	spin_unlock_irqrestore(&(kcs_info->msg_lock), flags);
-
-	spin_lock_irqsave(&(kcs_info->kcs_lock), flags);
-	if ((kcs_info->kcs_state == KCS_NORMAL)
-	    && (kcs_info->curr_msg == NULL))
-	{
-		start_next_msg(kcs_info);
-		kcs_restart_short_timer(kcs_info);
-	}
-	spin_unlock_irqrestore(&(kcs_info->kcs_lock), flags);
-}
-
-static void set_run_to_completion(void *send_info, int i_run_to_completion)
-{
-	struct kcs_info *kcs_info = (struct kcs_info *) send_info;
-	enum kcs_result result;
-	unsigned long   flags;
-
-	spin_lock_irqsave(&(kcs_info->kcs_lock), flags);
-
-	kcs_info->run_to_completion = i_run_to_completion;
-	if (i_run_to_completion) {
-		result = kcs_event_handler(kcs_info, 0);
-		while (result != KCS_SM_IDLE) {
-			udelay(KCS_SHORT_TIMEOUT_USEC);
-			result = kcs_event_handler(kcs_info,
-						   KCS_SHORT_TIMEOUT_USEC);
-		}
-	}
-
-	spin_unlock_irqrestore(&(kcs_info->kcs_lock), flags);
-}
-
-static void request_events(void *send_info)
-{
-	struct kcs_info *kcs_info = (struct kcs_info *) send_info;
-
-	atomic_set(&kcs_info->req_events, 1);
-}
-
-static int initialized = 0;
-
-/* Must be called with interrupts off and with the kcs_lock held. */
-static void kcs_restart_short_timer(struct kcs_info *kcs_info)
-{
-	if (del_timer(&(kcs_info->kcs_timer))) {
-#ifdef CONFIG_HIGH_RES_TIMERS
-		unsigned long jiffies_now;
-
-		/* If we don't delete the timer, then it will go off
-		   immediately, anyway.  So we only process if we
-		   actually delete the timer. */
-
-		/* We already have irqsave on, so no need for it
-                   here. */
-		read_lock(&xtime_lock);
-		jiffies_now = jiffies;
-		kcs_info->kcs_timer.expires = jiffies_now;
-
-		kcs_info->kcs_timer.sub_expires
-			= quick_update_jiffies_sub(jiffies_now);
-		read_unlock(&xtime_lock);
-
-		kcs_info->kcs_timer.sub_expires
-			+= usec_to_arch_cycles(KCS_SHORT_TIMEOUT_USEC);
-		while (kcs_info->kcs_timer.sub_expires >= cycles_per_jiffies) {
-			kcs_info->kcs_timer.expires++;
-			kcs_info->kcs_timer.sub_expires -= cycles_per_jiffies;
-		}
-#else
-		kcs_info->kcs_timer.expires = jiffies + 1;
-#endif
-		add_timer(&(kcs_info->kcs_timer));
-	}
-}
-
-static void kcs_timeout(unsigned long data)
-{
-	struct kcs_info *kcs_info = (struct kcs_info *) data;
-	enum kcs_result kcs_result;
-	unsigned long   flags;
-	unsigned long   jiffies_now;
-	unsigned long   time_diff;
-#ifdef DEBUG_TIMING
-	struct timeval t;
-#endif
-
-	if (kcs_info->stop_operation) {
-		kcs_info->timer_stopped = 1;
-		return;
-	}
-
-	spin_lock_irqsave(&(kcs_info->kcs_lock), flags);
-#ifdef DEBUG_TIMING
-	do_gettimeofday(&t);
-	printk("**Timer: %d.%9.9d\n", t.tv_sec, t.tv_usec);
-#endif
-	jiffies_now = jiffies;
-
-	time_diff = ((jiffies_now - kcs_info->last_timeout_jiffies)
-		     * KCS_USEC_PER_JIFFY);
-	kcs_result = kcs_event_handler(kcs_info, time_diff);
-
-	kcs_info->last_timeout_jiffies = jiffies_now;
-
-	if ((kcs_info->irq) && (! kcs_info->interrupt_disabled)) {
-		/* Running with interrupts, only do long timeouts. */
-		kcs_info->kcs_timer.expires = jiffies + KCS_TIMEOUT_JIFFIES;
-		goto do_add_timer;
-	}
-
-	/* If the state machine asks for a short delay, then shorten
-           the timer timeout. */
-#ifdef CONFIG_HIGH_RES_TIMERS
-	if (kcs_result == KCS_CALL_WITH_DELAY) {
-		kcs_info->kcs_timer.sub_expires
-			+= usec_to_arch_cycles(KCS_SHORT_TIMEOUT_USEC);
-		while (kcs_info->kcs_timer.sub_expires >= cycles_per_jiffies) {
-			kcs_info->kcs_timer.expires++;
-			kcs_info->kcs_timer.sub_expires -= cycles_per_jiffies;
-		}
-	} else {
-		kcs_info->kcs_timer.expires = jiffies + KCS_TIMEOUT_JIFFIES;
-		kcs_info->kcs_timer.sub_expires = 0;
-	}
-#else
-	/* If requested, take the shortest delay possible */
-	if (kcs_result == KCS_CALL_WITH_DELAY) {
-		kcs_info->kcs_timer.expires = jiffies + 1;
-	} else {
-		kcs_info->kcs_timer.expires = jiffies + KCS_TIMEOUT_JIFFIES;
-	}
-#endif
-
- do_add_timer:
-	add_timer(&(kcs_info->kcs_timer));
-	spin_unlock_irqrestore(&(kcs_info->kcs_lock), flags);
-}
-
-static irqreturn_t kcs_irq_handler(int irq, void *data, struct pt_regs *regs)
-{
-	struct kcs_info *kcs_info = (struct kcs_info *) data;
-	unsigned long   flags;
-#ifdef DEBUG_TIMING
-	struct timeval t;
-#endif
-
-	spin_lock_irqsave(&(kcs_info->kcs_lock), flags);
-	if (kcs_info->stop_operation)
-		goto out;
-
-#ifdef DEBUG_TIMING
-	do_gettimeofday(&t);
-	printk("**Interrupt: %d.%9.9d\n", t.tv_sec, t.tv_usec);
-#endif
-	kcs_event_handler(kcs_info, 0);
- out:
-	spin_unlock_irqrestore(&(kcs_info->kcs_lock), flags);
-	return IRQ_HANDLED;
-}
-
-static struct ipmi_smi_handlers handlers =
-{
-	.owner			= THIS_MODULE,
-	.sender			= sender,
-	.request_events		= request_events,
-	.set_run_to_completion	= set_run_to_completion,
-};
-
-static unsigned char ipmi_kcs_dev_rev;
-static unsigned char ipmi_kcs_fw_rev_major;
-static unsigned char ipmi_kcs_fw_rev_minor;
-static unsigned char ipmi_version_major;
-static unsigned char ipmi_version_minor;
-
-extern int kcs_dbg;
-static int ipmi_kcs_detect_hardware(unsigned int port,
-				    unsigned char *addr,
-				    struct kcs_data *data)
-{
-	unsigned char   msg[2];
-	unsigned char   resp[IPMI_MAX_MSG_LENGTH];
-	unsigned long   resp_len;
-	enum kcs_result kcs_result;
-
-	/* It's impossible for the KCS status register to be all 1's,
-	   (assuming a properly functioning, self-initialized BMC)
-	   but that's what you get from reading a bogus address, so we
-	   test that first. */
-
-	if (port) {
-		if (inb(port+1) == 0xff) return -ENODEV; 
-	} else { 
-		if (readb(addr+1) == 0xff) return -ENODEV; 
-	}
-
-	/* Do a Get Device ID command, since it comes back with some
-	   useful info. */
-	msg[0] = IPMI_NETFN_APP_REQUEST << 2;
-	msg[1] = IPMI_GET_DEVICE_ID_CMD;
-	start_kcs_transaction(data, msg, 2);
-	
-	kcs_result = kcs_event(data, 0);
-	for (;;)
-	{
-		if (kcs_result == KCS_CALL_WITH_DELAY) {
-			udelay(100);
-			kcs_result = kcs_event(data, 100);
-		}
-		else if (kcs_result == KCS_CALL_WITHOUT_DELAY)
-		{
-			kcs_result = kcs_event(data, 0);
-		}
-		else
-			break;
-	}
-	if (kcs_result == KCS_SM_HOSED) {
-		/* We couldn't get the state machine to run, so whatever's at
-		   the port is probably not an IPMI KCS interface. */
-		return -ENODEV;
-	}
-	/* Otherwise, we got some data. */
-	resp_len = kcs_get_result(data, resp, IPMI_MAX_MSG_LENGTH);
-	if (resp_len < 6)
-		/* That's odd, it should be longer. */
-		return -EINVAL;
-	
-	if ((resp[1] != IPMI_GET_DEVICE_ID_CMD) || (resp[2] != 0))
-		/* That's odd, it shouldn't be able to fail. */
-		return -EINVAL;
-	
-	ipmi_kcs_dev_rev = resp[4] & 0xf;
-	ipmi_kcs_fw_rev_major = resp[5] & 0x7f;
-	ipmi_kcs_fw_rev_minor = resp[6];
-	ipmi_version_major = resp[7] & 0xf;
-	ipmi_version_minor = resp[7] >> 4;
-
-	return 0;
-}
-
-/* There can be 4 IO ports passed in (with or without IRQs), 4 addresses,
-   a default IO port, and 1 ACPI/SPMI address.  That sets KCS_MAX_DRIVERS */
-
-#define KCS_MAX_PARMS 4
-#define KCS_MAX_DRIVERS ((KCS_MAX_PARMS * 2) + 2)
-static struct kcs_info *kcs_infos[KCS_MAX_DRIVERS] =
-{ NULL, NULL, NULL, NULL };
-
-#define DEVICE_NAME "ipmi_kcs"
-
-#define DEFAULT_IO_PORT 0xca2
-
-static int kcs_trydefaults = 1;
-static unsigned long kcs_addrs[KCS_MAX_PARMS] = { 0, 0, 0, 0 };
-static int kcs_ports[KCS_MAX_PARMS] = { 0, 0, 0, 0 };
-static int kcs_irqs[KCS_MAX_PARMS] = { 0, 0, 0, 0 };
-
-MODULE_PARM(kcs_trydefaults, "i");
-MODULE_PARM(kcs_addrs, "1-4l");
-MODULE_PARM(kcs_irqs, "1-4i");
-MODULE_PARM(kcs_ports, "1-4i");
-
-/* Returns 0 if initialized, or negative on an error. */
-static int init_one_kcs(int kcs_port, 
-			int irq, 
-			unsigned long kcs_physaddr,
-			struct kcs_info **kcs)
-{
-	int		rv;
-	struct kcs_info *new_kcs;
-
-	/* Did anything get passed in at all?  Both == zero disables the
-	   driver. */
-
-	if (!(kcs_port || kcs_physaddr)) 
-		return -ENODEV;
-	
-	/* Only initialize a port OR a physical address on this call.
-	   Also, IRQs can go with either ports or addresses. */
-
-	if (kcs_port && kcs_physaddr)
-		return -EINVAL;
-
-	new_kcs = kmalloc(sizeof(*new_kcs), GFP_KERNEL);
-	if (!new_kcs) {
-		printk(KERN_ERR "ipmi_kcs: out of memory\n");
-		return -ENOMEM;
-	}
-
-	/* So we know not to free it unless we have allocated one. */
-	new_kcs->kcs_sm = NULL;
-
-	new_kcs->addr = NULL;
-	new_kcs->physaddr = kcs_physaddr;
-	new_kcs->port = kcs_port;
-
-	if (kcs_port) {
-		if (request_region(kcs_port, 2, DEVICE_NAME) == NULL) {
-			kfree(new_kcs);
-			printk(KERN_ERR 
-			       "ipmi_kcs: can't reserve port @ 0x%4.4x\n",
-		       	       kcs_port);
-			return -EIO;
-		}
-	} else {
-		if (request_mem_region(kcs_physaddr, 2, DEVICE_NAME) == NULL) {
-			kfree(new_kcs);
-			printk(KERN_ERR 
-			       "ipmi_kcs: can't reserve memory @ 0x%lx\n",
-		       	       kcs_physaddr);
-			return -EIO;
-		}
-		if ((new_kcs->addr = ioremap(kcs_physaddr, 2)) == NULL) {
-			kfree(new_kcs);
-			printk(KERN_ERR 
-			       "ipmi_kcs: can't remap memory at 0x%lx\n",
-		       	       kcs_physaddr);
-			return -EIO;
-		}
-	}
-
-	new_kcs->kcs_sm = kmalloc(kcs_size(), GFP_KERNEL);
-	if (!new_kcs->kcs_sm) {
-		printk(KERN_ERR "ipmi_kcs: out of memory\n");
-		rv = -ENOMEM;
-		goto out_err;
-	}
-	init_kcs_data(new_kcs->kcs_sm, kcs_port, new_kcs->addr);
-	spin_lock_init(&(new_kcs->kcs_lock));
-	spin_lock_init(&(new_kcs->msg_lock));
-
-	rv = ipmi_kcs_detect_hardware(kcs_port, new_kcs->addr, new_kcs->kcs_sm);
-	if (rv) {
-		if (kcs_port) 
-			printk(KERN_ERR 
-			       "ipmi_kcs: No KCS @ port 0x%4.4x\n", 
-			       kcs_port);
-		else
-			printk(KERN_ERR 
-			       "ipmi_kcs: No KCS @ addr 0x%lx\n", 
-			       kcs_physaddr);
-		goto out_err;
-	}
-
-	if (irq != 0) {
-		rv = request_irq(irq,
-				 kcs_irq_handler,
-				 SA_INTERRUPT,
-				 DEVICE_NAME,
-				 new_kcs);
-		if (rv) {
-			printk(KERN_WARNING
-			       "ipmi_kcs: %s unable to claim interrupt %d,"
-			       " running polled\n",
-			       DEVICE_NAME, irq);
-			irq = 0;
-		}
-	}
-	new_kcs->irq = irq;
-
-	INIT_LIST_HEAD(&(new_kcs->xmit_msgs));
-	INIT_LIST_HEAD(&(new_kcs->hp_xmit_msgs));
-	new_kcs->curr_msg = NULL;
-	atomic_set(&new_kcs->req_events, 0);
-	new_kcs->run_to_completion = 0;
-
-	start_clear_flags(new_kcs);
-
-	if (irq) {
-		new_kcs->kcs_state = KCS_CLEARING_FLAGS_THEN_SET_IRQ;
-
-		printk(KERN_INFO 
-		       "ipmi_kcs: Acquiring BMC @ port=0x%x irq=%d\n",
-		       kcs_port, irq);
-
-	} else {
-		if (kcs_port)
-			printk(KERN_INFO 
-			       "ipmi_kcs: Acquiring BMC @ port=0x%x\n",
-		       	       kcs_port);
-		else
-			printk(KERN_INFO 
-			       "ipmi_kcs: Acquiring BMC @ addr=0x%lx\n",
-		       	       kcs_physaddr);
-	}
-
-	rv = ipmi_register_smi(&handlers,
-			       new_kcs,
-			       ipmi_version_major,
-			       ipmi_version_minor,
-			       &(new_kcs->intf));
-	if (rv) {
-		free_irq(irq, new_kcs);
-		printk(KERN_ERR 
-		       "ipmi_kcs: Unable to register device: error %d\n",
-		       rv);
-		goto out_err;
-	}
-
-	new_kcs->interrupt_disabled = 0;
-	new_kcs->timer_stopped = 0;
-	new_kcs->stop_operation = 0;
-
-	init_timer(&(new_kcs->kcs_timer));
-	new_kcs->kcs_timer.data = (long) new_kcs;
-	new_kcs->kcs_timer.function = kcs_timeout;
-	new_kcs->last_timeout_jiffies = jiffies;
-	new_kcs->kcs_timer.expires = jiffies + KCS_TIMEOUT_JIFFIES;
-	add_timer(&(new_kcs->kcs_timer));
-
-	*kcs = new_kcs;
-
-	return 0;
-
- out_err:
-	if (kcs_port) 
-		release_region (kcs_port, 2);
-	if (new_kcs->addr) 
-		iounmap(new_kcs->addr);
-	if (kcs_physaddr) 
-		release_mem_region(kcs_physaddr, 2);
-	if (new_kcs->kcs_sm)
-		kfree(new_kcs->kcs_sm);
-	kfree(new_kcs);
-	return rv;
-}
-
-#ifdef CONFIG_ACPI_INTERPRETER
-
-#include <linux/acpi.h>
-
-struct SPMITable {
-	s8      Signature[4];
-	u32     Length;
-	u8      Revision;
-	u8      Checksum;
-	s8      OEMID[6];
-	s8      OEMTableID[8];
-	s8      OEMRevision[4];
-	s8      CreatorID[4];
-	s8      CreatorRevision[4];
-	u8      InterfaceType[2];
-	s16     SpecificationRevision;
-
-	/*
-	 * Bit 0 - SCI interrupt supported
-	 * Bit 1 - I/O APIC/SAPIC
-	 */
-	u8      InterruptType;
-
-	/* If bit 0 of InterruptType is set, then this is the SCI
-	   interrupt in the GPEx_STS register. */
-	u8      GPE;
-
-	s16     Reserved;
-
-	/* If bit 1 of InterruptType is set, then this is the I/O
-	   APIC/SAPIC interrupt. */
-	u32     GlobalSystemInterrupt;
-
-	/* The actual register address. */
-	struct acpi_generic_address addr;
-
-	u8      UID[4];
-
-	s8      spmi_id[1]; /* A '\0' terminated array starts here. */
-};
-
-static int acpi_find_bmc(unsigned long *physaddr, int *port)
-{
-	acpi_status          status;
-	struct SPMITable     *spmi;
-	
-	status = acpi_get_firmware_table("SPMI", 1,
-					 ACPI_LOGICAL_ADDRESSING,
-					 (struct acpi_table_header **) &spmi);
-	if (status != AE_OK)
-		goto not_found;
-
-	if (spmi->InterfaceType[0] != 1)
-		/* Not IPMI. */
-		goto not_found;
-
-	if (spmi->InterfaceType[1] != 1)
-		/* Not KCS. */
-		goto not_found;
-
-	if (spmi->addr.address_space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) {
-		*physaddr = spmi->addr.address;
-		printk("ipmi_kcs_intf: Found ACPI-specified state machine"
-		       " at memory address 0x%lx\n",
-		       (unsigned long) spmi->addr.address);
-	} else if (spmi->addr.address_space_id == ACPI_ADR_SPACE_SYSTEM_IO) {
-		*port = spmi->addr.address;
-		printk("ipmi_kcs_intf: Found ACPI-specified state machine"
-		       " at I/O address 0x%lx\n",
-		       (unsigned long) spmi->addr.address);
-	} else
-		goto not_found; /* Not an address type we recognise. */
-
-	return 0;
-
- not_found:
-	return -ENODEV;
-}
-#endif
-
-static __init int init_ipmi_kcs(void)
-{
-	int		rv = 0;
-	int		pos = 0;
-	int		i = 0;
-#ifdef CONFIG_ACPI_INTERPRETER
-	unsigned long	physaddr = 0;
-	int             port = 0;
-#endif
-
-	if (initialized)
-		return 0;
-	initialized = 1;
-
-	/* First do the "command-line" parameters */
-
-	for (i=0; i < KCS_MAX_PARMS; i++) {
-		rv = init_one_kcs(kcs_ports[i], 
-				  kcs_irqs[i], 
-				  0, 
-				  &(kcs_infos[pos]));
-		if (rv == 0)
-			pos++;
-
-		rv = init_one_kcs(0, 
-				  kcs_irqs[i], 
-				  kcs_addrs[i], 
-				  &(kcs_infos[pos]));
-		if (rv == 0)
-			pos++;
-	}
-
-	/* Only try the defaults if enabled and resources are available
-	   (because they weren't already specified above). */
-
-	if (kcs_trydefaults && (pos == 0)) {
-		rv = -EINVAL;
-#ifdef CONFIG_ACPI_INTERPRETER
-		if (rv && (physaddr = acpi_find_bmc(&physaddr, &port) == 0)) {
-			rv = init_one_kcs(port, 
-					  0, 
-					  physaddr, 
-					  &(kcs_infos[pos]));
-			if (rv == 0)
-				pos++;
-		}
-#endif
-		if (rv) {
-			rv = init_one_kcs(DEFAULT_IO_PORT, 
-					  0, 
-					  0, 
-					  &(kcs_infos[pos]));
-			if (rv == 0)
-				pos++;
-		}
-	}
-
-	if (kcs_infos[0] == NULL) {
-		printk("ipmi_kcs: Unable to find any KCS interfaces\n");
-		return -ENODEV;
-	} 
-
-	return 0;
-}
-module_init(init_ipmi_kcs);
-
-#ifdef MODULE
-void __exit cleanup_one_kcs(struct kcs_info *to_clean)
-{
-	int           rv;
-	unsigned long flags;
-
-	if (! to_clean)
-		return;
-
-	/* Tell the timer and interrupt handlers that we are shutting
-	   down. */
-	spin_lock_irqsave(&(to_clean->kcs_lock), flags);
-	spin_lock(&(to_clean->msg_lock));
-
-	to_clean->stop_operation = 1;
-
-	if (to_clean->irq != 0)
-		free_irq(to_clean->irq, to_clean);
-	if (to_clean->port) {
-		printk(KERN_INFO 
-		       "ipmi_kcs: Releasing BMC @ port=0x%x\n",
-		       to_clean->port);
-		release_region (to_clean->port, 2);
-	}
-	if (to_clean->addr) {
-		printk(KERN_INFO 
-		       "ipmi_kcs: Releasing BMC @ addr=0x%lx\n",
-		       to_clean->physaddr);
-		iounmap(to_clean->addr);
-		release_mem_region(to_clean->physaddr, 2);
-	}
-
-	spin_unlock(&(to_clean->msg_lock));
-	spin_unlock_irqrestore(&(to_clean->kcs_lock), flags);
-
-	/* Wait until we know that we are out of any interrupt
-	   handlers might have been running before we freed the
-	   interrupt. */
-	synchronize_kernel();
-
-	/* Wait for the timer to stop.  This avoids problems with race
-	   conditions removing the timer here. */
-	while (!to_clean->timer_stopped) {
-		schedule_timeout(1);
-	}
-
-	rv = ipmi_unregister_smi(to_clean->intf);
-	if (rv) {
-		printk(KERN_ERR 
-		       "ipmi_kcs: Unable to unregister device: errno=%d\n",
-		       rv);
-	}
-
-	initialized = 0;
-
-	kfree(to_clean->kcs_sm);
-	kfree(to_clean);
-}
-
-static __exit void cleanup_ipmi_kcs(void)
-{
-	int i;
-
-	if (!initialized)
-		return;
-
-	for (i=0; i<KCS_MAX_DRIVERS; i++) {
-		cleanup_one_kcs(kcs_infos[i]);
-	}
-}
-module_exit(cleanup_ipmi_kcs);
-#else
-
-/* Unfortunately, cmdline::get_options() only returns integers, not
-   longs.  Since we need ulongs (64-bit physical addresses) parse the 
-   comma-separated list manually.  Arguments can be one of these forms:
-   m0xaabbccddeeff	A physical memory address without an IRQ
-   m0xaabbccddeeff:cc	A physical memory address with an IRQ
-   p0xaabb		An IO port without an IRQ
-   p0xaabb:cc		An IO port with an IRQ
-   nodefaults		Suppress trying the default IO port or ACPI address 
-
-   For example, to pass one IO port with an IRQ, one address, and 
-   suppress the use of the default IO port and ACPI address,
-   use this option string: ipmi_kcs=p0xCA2:5,m0xFF5B0022,nodefaults
-
-   Remember, ipmi_kcs_setup() is passed the string after the equal sign. */
-
-static int __init ipmi_kcs_setup(char *str)
-{
-	unsigned long val;
-	char *cur, *colon;
-	int pos;
-
-	pos = 0;
-	
-	cur = strsep(&str, ",");
-	while ((cur) && (*cur) && (pos < KCS_MAX_PARMS)) {
-		switch (*cur) {
-		case 'n':
-			if (strcmp(cur, "nodefaults") == 0)
-				kcs_trydefaults = 0;
-			else
-				printk(KERN_INFO 
-				       "ipmi_kcs: bad parameter value %s\n",
-				       cur);
-			break;
-		
-		case 'm':
-		case 'p':
-			val = simple_strtoul(cur + 1,
-					     &colon,
-					     0);
-			if (*cur == 'p')
-				kcs_ports[pos] = val;
-			else
-				kcs_addrs[pos] = val;
-			if (*colon == ':') {
-				val = simple_strtoul(colon + 1,
-						     &colon,
-						     0);
-				kcs_irqs[pos] = val;
-			}
-			pos++;
-			break;
-
-		default:
-			printk(KERN_INFO 
-			       "ipmi_kcs: bad parameter value %s\n",
-			       cur);
-		}
-		cur = strsep(&str, ",");
-	}
-
-	return 1;
-}
-__setup("ipmi_kcs=", ipmi_kcs_setup);
-#endif
-
-MODULE_LICENSE("GPL");
--- diff/drivers/char/ipmi/ipmi_kcs_sm.h	2003-01-16 11:30:40.000000000 +0000
+++ source/drivers/char/ipmi/ipmi_kcs_sm.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,70 +0,0 @@
-/*
- * ipmi_kcs_sm.h
- *
- * State machine for handling IPMI KCS interfaces.
- *
- * Author: MontaVista Software, Inc.
- *         Corey Minyard <minyard@mvista.com>
- *         source@mvista.com
- *
- * Copyright 2002 MontaVista Software Inc.
- *
- *  This program is free software; you can redistribute it and/or modify it
- *  under the terms of the GNU General Public License as published by the
- *  Free Software Foundation; either version 2 of the License, or (at your
- *  option) any later version.
- *
- *
- *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
- *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
- *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-struct kcs_data;
-
-void init_kcs_data(struct kcs_data *kcs,
-		   unsigned int    port,
-		   unsigned char   *addr);
-
-/* Start a new transaction in the state machine.  This will return -2
-   if the state machine is not idle, -1 if the size is invalid (to
-   large or too small), or 0 if the transaction is successfully
-   completed. */
-int start_kcs_transaction(struct kcs_data *kcs, char *data, unsigned int size);
-
-/* Return the results after the transaction.  This will return -1 if
-   the buffer is too small, zero if no transaction is present, or the
-   actual length of the result data. */
-int kcs_get_result(struct kcs_data *kcs, unsigned char *data, int length);
-
-enum kcs_result
-{
-	KCS_CALL_WITHOUT_DELAY, /* Call the driver again immediately */
-	KCS_CALL_WITH_DELAY,	/* Delay some before calling again. */
-	KCS_TRANSACTION_COMPLETE, /* A transaction is finished. */
-	KCS_SM_IDLE,		/* The SM is in idle state. */
-	KCS_SM_HOSED,		/* The hardware violated the state machine. */
-	KCS_ATTN		/* The hardware is asserting attn and the
-				   state machine is idle. */
-};
-
-/* Call this periodically (for a polled interface) or upon receiving
-   an interrupt (for a interrupt-driven interface).  If interrupt
-   driven, you should probably poll this periodically when not in idle
-   state.  This should be called with the time that passed since the
-   last call, if it is significant.  Time is in microseconds. */
-enum kcs_result kcs_event(struct kcs_data *kcs, long time);
-
-/* Return the size of the KCS structure in bytes. */
-int kcs_size(void);
--- diff/drivers/net/sis190.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/net/sis190.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,1229 +0,0 @@
-/* SiS190.c: A Linux PCI Ethernet driver for the SiS190 chips. */
-/*
-=========================================================================
- SiS190.c: A SiS190 Gigabit Ethernet driver for Linux kernel 2.6.x.
- --------------------------------------------------------------------
-
-	drivers/net/SiS190.c
-
-	Maintained by K.M. Liu <kmliu@sis.com>
-
-        Modified from the driver which is originally written by Donald Becker.
-
-	This software may be used and distributed according to the terms of
-	the GNU General Public License (GPL), incorporated herein by reference.
-	Drivers based on or derived from this code fall under the GPL and must
-	retain the authorship, copyright and license notice.  This file is not
-	a complete program and may only be used when the entire operating
-	system is licensed under the GPL.
-
- History:
-=========================================================================
- VERSION 1.0	<2003/8/7> K.M. Liu, Test 100bps Full in 2.6.0 O.K.
-         1.1    <2003/8/8> K.M. Liu, Add mode detection.
-
-*/
-
-#include <linux/module.h>
-#include <linux/pci.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/delay.h>
-#include <linux/crc32.h>
-#include <linux/init.h>
-
-#include <asm/io.h>
-
-#define SiS190_VERSION "1.1"
-#define MODULENAME "SiS190"
-#define SiS190_DRIVER_NAME   MODULENAME " Gigabit Ethernet driver " SiS190_VERSION
-#define PFX MODULENAME ": "
-
-#ifdef SiS190_DEBUG
-#define assert(expr) \
-        if(unlikely(!(expr))) {					\
-	        printk( "Assertion failed! %s,%s,%s,line=%d\n",	\
-        	#expr,__FILE__,__FUNCTION__,__LINE__);		\
-        }
-#else
-#define assert(expr) do {} while (0)
-#endif
-
-/* media options */
-#define MAX_UNITS 8
-
-/* Maximum events (Rx packets, etc.) to handle at each interrupt. */
-static int max_interrupt_work = 20;
-
-/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
-   The chips use a 64 element hash table based on the Ethernet CRC.  */
-static int multicast_filter_limit = 32;
-
-/* MAC address length*/
-#define MAC_ADDR_LEN	6
-
-/* max supported gigabit ethernet frame size -- must be at least (dev->mtu+14+4).*/
-#define MAX_ETH_FRAME_SIZE	1536
-
-#define TX_FIFO_THRESH 256	/* In bytes */
-
-#define RX_FIFO_THRESH	7	/* 7 means NO threshold, Rx buffer level before first PCI xfer.  */
-#define RX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
-#define TX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
-#define EarlyTxThld 	0x3F	/* 0x3F means NO early transmit */
-#define RxPacketMaxSize	0x0800	/* Maximum size supported is 16K-1 */
-#define InterFrameGap	0x03	/* 3 means InterFrameGap = the shortest one */
-
-#define NUM_TX_DESC	64	/* Number of Tx descriptor registers */
-#define NUM_RX_DESC	64	/* Number of Rx descriptor registers */
-#define TX_DESC_TOTAL_SIZE	(NUM_TX_DESC * sizeof (struct TxDesc))
-#define RX_DESC_TOTAL_SIZE	(NUM_RX_DESC * sizeof (struct RxDesc))
-#define RX_BUF_SIZE	1536	/* Rx Buffer size */
-
-#define SiS190_MIN_IO_SIZE 0x80
-#define TX_TIMEOUT  (6*HZ)
-
-/* enhanced PHY access register bit definitions */
-#define EhnMIIread      0x0000
-#define EhnMIIwrite     0x0020
-#define EhnMIIdataShift 16
-#define EhnMIIpmdShift  6	/* 7016 only */
-#define EhnMIIregShift  11
-#define EhnMIIreq       0x0010
-#define EhnMIInotDone   0x0010
-
-//-------------------------------------------------------------------------
-// Bit Mask definitions
-//-------------------------------------------------------------------------
-#define BIT_0	0x0001
-#define BIT_1	0x0002
-#define BIT_2	0x0004
-#define BIT_3	0x0008
-#define BIT_4	0x0010
-#define BIT_5	0x0020
-#define BIT_6	0x0040
-#define BIT_7	0x0080
-#define BIT_8	0x0100
-#define BIT_9	0x0200
-#define BIT_10	0x0400
-#define BIT_11	0x0800
-#define BIT_12	0x1000
-#define BIT_13	0x2000
-#define BIT_14	0x4000
-#define BIT_15	0x8000
-#define BIT_16	0x10000
-#define BIT_17	0x20000
-#define BIT_18	0x40000
-#define BIT_19	0x80000
-#define BIT_20	0x100000
-#define BIT_21	0x200000
-#define BIT_22	0x400000
-#define BIT_23	0x800000
-#define BIT_24	0x1000000
-#define BIT_25	0x2000000
-#define BIT_26	0x04000000
-#define BIT_27	0x08000000
-#define BIT_28	0x10000000
-#define BIT_29	0x20000000
-#define BIT_30	0x40000000
-#define BIT_31	0x80000000
-
-/* write/read MMIO register */
-#define SiS_W8(reg, val8)	writeb ((val8), ioaddr + (reg))
-#define SiS_W16(reg, val16)	writew ((val16), ioaddr + (reg))
-#define SiS_W32(reg, val32)	writel ((val32), ioaddr + (reg))
-#define SiS_R8(reg)		readb (ioaddr + (reg))
-#define SiS_R16(reg)		readw (ioaddr + (reg))
-#define SiS_R32(reg)		((unsigned long) readl (ioaddr + (reg)))
-
-static struct {
-	const char *name;
-} board_info[] __devinitdata = {
-	{ "SiS190 Gigabit Ethernet" },
-};
-
-static struct pci_device_id sis190_pci_tbl[] __devinitdata = {
-	{ 0x1039, 0x0190, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
-	{ 0,},
-};
-
-MODULE_DEVICE_TABLE(pci, sis190_pci_tbl);
-
-enum SiS190_registers {
-	TxControl		= 0x0,
-	TxDescStartAddr		= 0x4,
-	TxNextDescAddr		= 0x0c,
-	RxControl		= 0x10,
-	RxDescStartAddr		= 0x14,
-	RxNextDescAddr		= 0x1c,
-	IntrStatus		= 0x20,
-	IntrMask		= 0x24,
-	IntrControl		= 0x28,
-	IntrTimer		= 0x2c,
-	PMControl		= 0x30,
-	ROMControl		= 0x38,
-	ROMInterface		= 0x3c,
-	StationControl		= 0x40,
-	GMIIControl		= 0x44,
-	TxMacControl		= 0x50,
-	RxMacControl		= 0x60,
-	RxMacAddr		= 0x62,
-	RxHashTable		= 0x68,
-	RxWakeOnLan		= 0x70,
-	RxMPSControl		= 0x78,
-};
-
-enum sis190_register_content {
-	/*InterruptStatusBits */
-
-	SoftInt			= 0x40000000,
-	Timeup			= 0x20000000,
-	PauseFrame		= 0x80000,
-	MagicPacket		= 0x40000,
-	WakeupFrame		= 0x20000,
-	LinkChange		= 0x10000,
-	RxQEmpty		= 0x80,
-	RxQInt			= 0x40,
-	TxQ1Empty		= 0x20,
-	TxQ1Int			= 0x10,
-	TxQ0Empty		= 0x08,
-	TxQ0Int			= 0x04,
-	RxHalt			= 0x02,
-	TxHalt			= 0x01,
-
-	/*RxStatusDesc */
-	RxRES			= 0x00200000,
-	RxCRC			= 0x00080000,
-	RxRUNT			= 0x00100000,
-	RxRWT			= 0x00400000,
-
-	/*ChipCmdBits */
-	CmdReset		= 0x10,
-	CmdRxEnb		= 0x08,
-	CmdTxEnb		= 0x01,
-	RxBufEmpty		= 0x01,
-
-	/*Cfg9346Bits */
-	Cfg9346_Lock		= 0x00,
-	Cfg9346_Unlock		= 0xC0,
-
-	/*rx_mode_bits */
-	AcceptErr		= 0x20,
-	AcceptRunt		= 0x10,
-	AcceptBroadcast		= 0x0800,
-	AcceptMulticast		= 0x0400,
-	AcceptMyPhys		= 0x0200,
-	AcceptAllPhys		= 0x0100,
-
-	/*RxConfigBits */
-	RxCfgFIFOShift		= 13,
-	RxCfgDMAShift		= 8,
-
-	/*TxConfigBits */
-	TxInterFrameGapShift	= 24,
-	TxDMAShift		= 8, /* DMA burst value (0-7) is shift this many bits */
-
-	/*_PHYstatus */
-	TBI_Enable		= 0x80,
-	TxFlowCtrl		= 0x40,
-	RxFlowCtrl		= 0x20,
-
-	_1000bpsF		= 0x1c,
-	_1000bpsH		= 0x0c,
-	_100bpsF		= 0x18,
-	_100bpsH		= 0x08,
-	_10bpsF			= 0x14,
-	_10bpsH			= 0x04,
-
-	LinkStatus		= 0x02,
-	FullDup			= 0x01,
-
-	/*GIGABIT_PHY_registers */
-	PHY_CTRL_REG		= 0,
-	PHY_STAT_REG		= 1,
-	PHY_AUTO_NEGO_REG	= 4,
-	PHY_1000_CTRL_REG	= 9,
-
-	/*GIGABIT_PHY_REG_BIT */
-	PHY_Restart_Auto_Nego	= 0x0200,
-	PHY_Enable_Auto_Nego	= 0x1000,
-
-	//PHY_STAT_REG = 1;
-	PHY_Auto_Neco_Comp	= 0x0020,
-
-	//PHY_AUTO_NEGO_REG = 4;
-	PHY_Cap_10_Half		= 0x0020,
-	PHY_Cap_10_Full		= 0x0040,
-	PHY_Cap_100_Half	= 0x0080,
-	PHY_Cap_100_Full	= 0x0100,
-
-	//PHY_1000_CTRL_REG = 9;
-	PHY_Cap_1000_Full	= 0x0200,
-
-	PHY_Cap_Null		= 0x0,
-
-	/*_MediaType*/
-	_10_Half		= 0x01,
-	_10_Full		= 0x02,
-	_100_Half		= 0x04,
-	_100_Full		= 0x08,
-	_1000_Full		= 0x10,
-
-	/*_TBICSRBit*/
-	TBILinkOK		= 0x02000000,
-};
-
-const static struct {
-	const char *name;
-	u8 version;		/* depend on docs */
-	u32 RxConfigMask;	/* should clear the bits supported by this chip */
-} sis_chip_info[] = {
-	{ "SiS-0190", 0x00, 0xff7e1880,},
-};
-
-enum _DescStatusBit {
-	OWNbit			= 0x80000000,
-	INTbit			= 0x40000000,
-	DEFbit			= 0x200000,
-	CRCbit			= 0x20000,
-	PADbit			= 0x10000,
-	ENDbit			= 0x80000000,
-};
-
-struct TxDesc {
-	u32 PSize;
-	u32 status;
-	u32 buf_addr;
-	u32 buf_Len;
-};
-
-struct RxDesc {
-	u32 PSize;
-	u32 status;
-	u32 buf_addr;
-	u32 buf_Len;
-};
-
-struct sis190_private {
-	void *mmio_addr;	/* memory map physical address */
-	struct pci_dev *pci_dev;	/* Index of PCI device  */
-	struct net_device_stats stats;	/* statistics of net device */
-	spinlock_t lock;	/* spin lock flag */
-	int chipset;
-	unsigned long cur_rx;	/* Index into the Rx descriptor buffer of next Rx pkt. */
-	unsigned long cur_tx;	/* Index into the Tx descriptor buffer of next Rx pkt. */
-	unsigned long dirty_tx;
-	dma_addr_t tx_dma;
-	dma_addr_t rx_dma;
-	struct TxDesc *TxDescArray;	/* Index of 256-alignment Tx Descriptor buffer */
-	struct RxDesc *RxDescArray;	/* Index of 256-alignment Rx Descriptor buffer */
-	unsigned char *RxBufferRings;	/* Index of Rx Buffer  */
-	unsigned char *RxBufferRing[NUM_RX_DESC];	/* Index of Rx Buffer array */
-	struct sk_buff *Tx_skbuff[NUM_TX_DESC];	/* Index of Transmit data buffer */
-};
-
-MODULE_AUTHOR("K.M. Liu <kmliu@sis.com>");
-MODULE_DESCRIPTION("SiS SiS190 Gigabit Ethernet driver");
-MODULE_LICENSE("GPL");
-MODULE_PARM(media, "1-" __MODULE_STRING(MAX_UNITS) "i");
-
-static int SiS190_open(struct net_device *dev);
-static int SiS190_start_xmit(struct sk_buff *skb, struct net_device *dev);
-static irqreturn_t SiS190_interrupt(int irq, void *dev_instance,
-				    struct pt_regs *regs);
-static void SiS190_init_ring(struct net_device *dev);
-static void SiS190_hw_start(struct net_device *dev);
-static int SiS190_close(struct net_device *dev);
-static void SiS190_set_rx_mode(struct net_device *dev);
-static void SiS190_tx_timeout(struct net_device *dev);
-static struct net_device_stats *SiS190_get_stats(struct net_device *netdev);
-
-static const u32 sis190_intr_mask =
-    RxQEmpty | RxQInt | TxQ1Empty | TxQ1Int | TxQ0Empty | TxQ0Int | RxHalt |
-    TxHalt;
-
-void
-smdio_write(void *ioaddr, int RegAddr, int value)
-{
-
-	u32 l;
-	u16 i;
-	u32 pmd;
-
-	pmd = 1;
-
-	l = 0;
-	l = EhnMIIwrite | (((u32) RegAddr) << EhnMIIregShift) | EhnMIIreq |
-	    (((u32) value) << EhnMIIdataShift) | (((u32) pmd) <<
-						  EhnMIIpmdShift);
-
-	SiS_W32(GMIIControl, l);
-
-	udelay(1000);
-
-	for (i = 0; i < 1000; i++) {
-		if (SiS_R32(GMIIControl) & EhnMIInotDone) {
-			udelay(100);
-		} else {
-			break;
-		}
-	}
-
-	if (i > 999)
-		printk(KERN_ERR PFX "Phy write Error!!!\n");
-
-}
-
-int
-smdio_read(void *ioaddr, int RegAddr)
-{
-
-	u32 l;
-	u16 i;
-	u32 pmd;
-
-	pmd = 1;
-	l = 0;
-	l = EhnMIIread | EhnMIIreq | (((u32) RegAddr) << EhnMIIregShift) |
-	    (((u32) pmd) << EhnMIIpmdShift);
-
-	SiS_W32(GMIIControl, l);
-
-	udelay(1000);
-
-	for (i = 0; i < 1000; i++) {
-		if ((l == SiS_R32(GMIIControl)) & EhnMIInotDone) {
-			udelay(100);
-		} else {
-			break;
-		}
-
-		if (i > 999)
-			printk(KERN_ERR PFX "Phy Read Error!!!\n");
-	}
-	l = SiS_R32(GMIIControl);
-
-	return ((u16) (l >> EhnMIIdataShift));
-
-}
-
-int
-ReadEEprom(void *ioaddr, u32 RegAddr)
-{
-	u16 data;
-	u32 i;
-	u32 ulValue;
-
-	if (!(SiS_R32(ROMControl) & BIT_1)) {
-		return 0;
-	}
-
-	ulValue = (BIT_7 | (0x2 << 8) | (RegAddr << 10));
-
-	SiS_W32(ROMInterface, ulValue);
-
-	for (i = 0; i < 200; i++) {
-
-		if (!(SiS_R32(ROMInterface) & BIT_7))
-			break;
-
-		udelay(1000);
-	}
-
-	data = (u16) ((SiS_R32(ROMInterface) & 0xffff0000) >> 16);
-
-	return data;
-}
-
-static int __devinit
-SiS190_init_board(struct pci_dev *pdev, struct net_device **dev_out,
-		  void **ioaddr_out)
-{
-	void *ioaddr = NULL;
-	struct net_device *dev;
-	struct sis190_private *tp;
-	u16 rc;
-	unsigned long mmio_start, mmio_end, mmio_flags, mmio_len;
-
-	assert(pdev != NULL);
-	assert(ioaddr_out != NULL);
-
-	*ioaddr_out = NULL;
-	*dev_out = NULL;
-
-	dev = alloc_etherdev(sizeof (*tp));
-	if (dev == NULL) {
-		printk(KERN_ERR PFX "unable to alloc new ethernet\n");
-		return -ENOMEM;
-	}
-
-	SET_MODULE_OWNER(dev);
-	SET_NETDEV_DEV(dev, &pdev->dev);
-	tp = dev->priv;
-
-	// enable device (incl. PCI PM wakeup and hotplug setup)
-	rc = pci_enable_device(pdev);
-	if (rc)
-		goto err_out;
-
-	rc = pci_set_dma_mask(pdev, 0xffffffffULL);
-	if (rc)
-		goto err_out_disable;
-
-	mmio_start = pci_resource_start(pdev, 0);
-	mmio_end = pci_resource_end(pdev, 0);
-	mmio_flags = pci_resource_flags(pdev, 0);
-	mmio_len = pci_resource_len(pdev, 0);
-
-	// make sure PCI base addr 0 is MMIO
-	if (!(mmio_flags & IORESOURCE_MEM)) {
-		printk(KERN_ERR PFX
-		       "region #0 not an MMIO resource, aborting\n");
-		rc = -ENODEV;
-		goto err_out_disable;
-	}
-	// check for weird/broken PCI region reporting
-	if (mmio_len < SiS190_MIN_IO_SIZE) {
-		printk(KERN_ERR PFX "Invalid PCI region size(s), aborting\n");
-		rc = -ENODEV;
-		goto err_out_disable;
-	}
-
-	rc = pci_request_regions(pdev, dev->name);
-	if (rc)
-		goto err_out_disable;
-
-	// enable PCI bus-mastering
-	pci_set_master(pdev);
-
-	// ioremap MMIO region 
-	ioaddr = ioremap(mmio_start, mmio_len);
-	if (ioaddr == NULL) {
-		printk(KERN_ERR PFX "cannot remap MMIO, aborting\n");
-		rc = -EIO;
-		goto err_out_free_res;
-	}
-	// Soft reset the chip. 
-	SiS_W32(IntrControl, 0x8000);
-	udelay(1000);
-	SiS_W32(IntrControl, 0x0);
-
-	SiS_W32(TxControl, 0x1a00);
-	SiS_W32(RxControl, 0x1a00);
-	udelay(1000);
-
-	*ioaddr_out = ioaddr;
-	*dev_out = dev;
-	return 0;
-
-err_out_free_res:
-	pci_release_regions(pdev);
-
-err_out_disable:
-	pci_disable_device(pdev);
-err_out:
-	free_netdev(dev);
-	return rc;
-}
-
-static int __devinit
-SiS190_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
-{
-	struct net_device *dev = NULL;
-	struct sis190_private *tp = NULL;
-	void *ioaddr = NULL;
-	static int board_idx = -1;
-	static int printed_version = 0;
-	int i, rc;
-	u16 reg31;
-	int val;
-
-	assert(pdev != NULL);
-	assert(ent != NULL);
-
-	board_idx++;
-
-	if (!printed_version) {
-		printk(KERN_INFO SiS190_DRIVER_NAME " loaded\n");
-		printed_version = 1;
-	}
-
-	i = SiS190_init_board(pdev, &dev, &ioaddr);
-	if (i < 0) {
-		return i;
-	}
-
-	tp = dev->priv;
-	assert(ioaddr != NULL);
-	assert(dev != NULL);
-	assert(tp != NULL);
-
-	// Get MAC address //
-	// Read node address from the EEPROM
-
-	if (SiS_R32(ROMControl) & 0x2) {
-
-		for (i = 0; i < 6; i += 2) {
-			SiS_W16(RxMacAddr + i, ReadEEprom(ioaddr, 3 + (i / 2)));
-		}
-
-	} else {
-
-		SiS_W32(RxMacAddr, 0x11111100);	//If 9346 does not exist
-		SiS_W32(RxMacAddr + 2, 0x00111111);
-	}
-
-	for (i = 0; i < MAC_ADDR_LEN; i++) {
-		dev->dev_addr[i] = SiS_R8(RxMacAddr + i);
-		printk("SiS_R8(RxMacAddr+%x)= %x ", i, SiS_R8(RxMacAddr + i));
-	}
-
-	dev->open = SiS190_open;
-	dev->hard_start_xmit = SiS190_start_xmit;
-	dev->get_stats = SiS190_get_stats;
-	dev->stop = SiS190_close;
-	dev->tx_timeout = SiS190_tx_timeout;
-	dev->set_multicast_list = SiS190_set_rx_mode;
-	dev->watchdog_timeo = TX_TIMEOUT;
-	dev->irq = pdev->irq;
-	dev->base_addr = (unsigned long) ioaddr;
-//      dev->do_ioctl           = mii_ioctl;
-
-	tp = dev->priv;		// private data //
-	tp->pci_dev = pdev;
-	tp->mmio_addr = ioaddr;
-
-	printk(KERN_DEBUG "%s: Identified chip type is '%s'.\n", dev->name,
-	       sis_chip_info[tp->chipset].name);
-
-	spin_lock_init(&tp->lock);
-	rc = register_netdev(dev);
-	if (rc) {
-		iounmap(ioaddr);
-		pci_release_regions(pdev);
-		pci_disable_device(pdev);
-		free_netdev(dev);
-		return rc;
-	}
-
-	printk(KERN_DEBUG "%s: Identified chip type is '%s'.\n", dev->name,
-	       sis_chip_info[tp->chipset].name);
-
-	pci_set_drvdata(pdev, dev);
-
-	printk(KERN_INFO "%s: %s at 0x%lx, "
-	       "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x, "
-	       "IRQ %d\n",
-	       dev->name,
-	       board_info[ent->driver_data].name,
-	       dev->base_addr,
-	       dev->dev_addr[0], dev->dev_addr[1],
-	       dev->dev_addr[2], dev->dev_addr[3],
-	       dev->dev_addr[4], dev->dev_addr[5], dev->irq);
-
-	val = smdio_read(ioaddr, PHY_AUTO_NEGO_REG);
-
-	printk(KERN_INFO "%s: Auto-negotiation Enabled.\n", dev->name);
-
-	// enable 10/100 Full/Half Mode, leave PHY_AUTO_NEGO_REG bit4:0 unchanged
-	smdio_write(ioaddr, PHY_AUTO_NEGO_REG,
-		    PHY_Cap_10_Half | PHY_Cap_10_Full |
-		    PHY_Cap_100_Half | PHY_Cap_100_Full | (val & 0x1F));
-
-	// enable 1000 Full Mode
-	smdio_write(ioaddr, PHY_1000_CTRL_REG, PHY_Cap_1000_Full);
-
-	// Enable auto-negotiation and restart auto-nigotiation
-	smdio_write(ioaddr, PHY_CTRL_REG,
-		    PHY_Enable_Auto_Nego | PHY_Restart_Auto_Nego);
-	udelay(100);
-
-	// wait for auto-negotiation process
-	for (i = 10000; i > 0; i--) {
-		//check if auto-negotiation complete
-		if (smdio_read(ioaddr, PHY_STAT_REG) & PHY_Auto_Neco_Comp) {
-			udelay(100);
-			reg31 = smdio_read(ioaddr, 31);
-			reg31 &= 0x1c;	//bit 4:2
-			switch (reg31) {
-			case _1000bpsF:
-				SiS_W16(0x40, 0x1c01);
-				printk
-				    ("SiS190 Link on 1000 bps Full Duplex mode. \n");
-				break;
-			case _1000bpsH:
-				SiS_W16(0x40, 0x0c01);
-				printk
-				    ("SiS190 Link on 1000 bps Half Duplex mode. \n");
-				break;
-			case _100bpsF:
-				SiS_W16(0x40, 0x1801);
-				printk
-				    ("SiS190 Link on 100 bps Full Duplex mode. \n");
-				break;
-			case _100bpsH:
-				SiS_W16(0x40, 0x0801);
-				printk
-				    ("SiS190 Link on 100 bps Half Duplex mode. \n");
-				break;
-			case _10bpsF:
-				SiS_W16(0x40, 0x1401);
-				printk
-				    ("SiS190 Link on 10 bps Full Duplex mode. \n");
-				break;
-			case _10bpsH:
-				SiS_W16(0x40, 0x0401);
-				printk
-				    ("SiS190 Link on 10 bps Half Duplex mode. \n");
-				break;
-			default:
-				printk(KERN_ERR PFX
-				       "Error! SiS190 Can not detect mode !!! \n");
-				break;
-			}
-
-			break;
-		} else {
-			udelay(100);
-		}
-	}			// end for-loop to wait for auto-negotiation process
-	return 0;
-}
-
-static void __devexit
-SiS190_remove_one(struct pci_dev *pdev)
-{
-	struct net_device *dev = pci_get_drvdata(pdev);
-	struct sis190_private *tp = (struct sis190_private *) (dev->priv);
-
-	assert(dev != NULL);
-	assert(tp != NULL);
-
-	unregister_netdev(dev);
-	iounmap(tp->mmio_addr);
-	pci_release_regions(pdev);
-
-	free_netdev(dev);
-	pci_set_drvdata(pdev, NULL);
-}
-
-static int
-SiS190_open(struct net_device *dev)
-{
-	struct sis190_private *tp = dev->priv;
-	int rc;
-
-	rc = request_irq(dev->irq, SiS190_interrupt, SA_SHIRQ, dev->name, dev);
-	if (rc)
-		goto out;
-
-	/*
-	 * Rx and Tx descriptors need 256 bytes alignment.
-	 * pci_alloc_consistent() guarantees a stronger alignment.
-	 */
-	tp->TxDescArray = pci_alloc_consistent(tp->pci_dev, TX_DESC_TOTAL_SIZE,
-		&tp->tx_dma);
-	if (!tp->TxDescArray) {
-		rc = -ENOMEM;
-		goto err_out;
-	}
-
-	tp->RxDescArray = pci_alloc_consistent(tp->pci_dev, RX_DESC_TOTAL_SIZE,
-		&tp->rx_dma);
-	if (!tp->RxDescArray) {
-		rc = -ENOMEM;
-		goto err_out_free_tx;
-	}
-
-	tp->RxBufferRings = kmalloc(RX_BUF_SIZE * NUM_RX_DESC, GFP_KERNEL);
-	if (tp->RxBufferRings == NULL) {
-		printk(KERN_INFO "%s: allocate RxBufferRing failed\n",
-			dev->name);
-		rc = -ENOMEM;
-		goto err_out_free_rx;
-	}
-
-	SiS190_init_ring(dev);
-	SiS190_hw_start(dev);
-
-out:
-	return rc;
-
-err_out_free_rx:
-	pci_free_consistent(tp->pci_dev, RX_DESC_TOTAL_SIZE, tp->RxDescArray,
-		tp->rx_dma);
-err_out_free_tx:
-	pci_free_consistent(tp->pci_dev, TX_DESC_TOTAL_SIZE, tp->TxDescArray,
-		tp->tx_dma);
-err_out:
-	free_irq(dev->irq, dev);
-	return rc;
-}
-
-static void
-SiS190_hw_start(struct net_device *dev)
-{
-	struct sis190_private *tp = dev->priv;
-	void *ioaddr = tp->mmio_addr;
-
-	/* Soft reset the chip. */
-
-	SiS_W32(IntrControl, 0x8000);
-	udelay(1000);
-	SiS_W32(IntrControl, 0x0);
-
-	SiS_W32(0x0, 0x01a00);
-	SiS_W32(0x4, tp->tx_dma);
-
-	SiS_W32(0x10, 0x1a00);
-	SiS_W32(0x14, tp->rx_dma);
-
-	SiS_W32(0x20, 0xffffffff);
-	SiS_W32(0x24, 0x0);
-	SiS_W16(0x40, 0x1901);	//default is 100Mbps
-	SiS_W32(0x44, 0x0);
-	SiS_W32(0x50, 0x60);
-	SiS_W16(0x60, 0x02);
-	SiS_W32(0x68, 0x0);
-	SiS_W32(0x6c, 0x0);
-	SiS_W32(0x70, 0x0);
-	SiS_W32(0x74, 0x0);
-
-	// Set Rx Config register
-
-	tp->cur_rx = 0;
-
-	udelay(10);
-
-	SiS190_set_rx_mode(dev);
-
-	/* Enable all known interrupts by setting the interrupt mask. */
-	SiS_W32(IntrMask, sis190_intr_mask);
-
-	SiS_W32(0x0, 0x1a01);
-	SiS_W32(0x10, 0x1a1d);
-
-	netif_start_queue(dev);
-
-}
-
-static void
-SiS190_init_ring(struct net_device *dev)
-{
-	struct sis190_private *tp = dev->priv;
-	int i;
-
-	tp->cur_rx = 0;
-	tp->cur_tx = 0;
-	tp->dirty_tx = 0;
-	memset(tp->TxDescArray, 0x0, NUM_TX_DESC * sizeof (struct TxDesc));
-	memset(tp->RxDescArray, 0x0, NUM_RX_DESC * sizeof (struct RxDesc));
-
-	for (i = 0; i < NUM_TX_DESC; i++) {
-		tp->Tx_skbuff[i] = NULL;
-	}
-	for (i = 0; i < NUM_RX_DESC; i++) {
-		struct RxDesc *desc = tp->RxDescArray + i;
-
-		desc->PSize = 0x0;
-
-		if (i == (NUM_RX_DESC - 1))
-			desc->buf_Len = BIT_31 + RX_BUF_SIZE;	//bit 31 is End bit
-		else
-			desc->buf_Len = RX_BUF_SIZE;
-
-		tp->RxBufferRing[i] = tp->RxBufferRings + i * RX_BUF_SIZE;
-		desc->buf_addr = pci_map_single(tp->pci_dev,
-			tp->RxBufferRing[i], RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
-		desc->status = OWNbit | INTbit;
-	}
-
-}
-
-static void
-SiS190_tx_clear(struct sis190_private *tp)
-{
-	int i;
-
-	tp->cur_tx = 0;
-	for (i = 0; i < NUM_TX_DESC; i++) {
-		if (tp->Tx_skbuff[i] != NULL) {
-			struct sk_buff *skb;
-
-			skb = tp->Tx_skbuff[i];
-			pci_unmap_single(tp->pci_dev,
-				le32_to_cpu(tp->TxDescArray[i].buf_addr),
-				skb->len < ETH_ZLEN ? ETH_ZLEN : skb->len,
-				PCI_DMA_TODEVICE);
-			dev_kfree_skb(skb);
-			tp->Tx_skbuff[i] = NULL;
-			tp->stats.tx_dropped++;
-		}
-	}
-}
-
-static void
-SiS190_tx_timeout(struct net_device *dev)
-{
-	struct sis190_private *tp = dev->priv;
-	void *ioaddr = tp->mmio_addr;
-	u8 tmp8;
-
-	/* disable Tx, if not already */
-	tmp8 = SiS_R8(TxControl);
-	if (tmp8 & CmdTxEnb)
-		SiS_W8(TxControl, tmp8 & ~CmdTxEnb);
-
-	/* Disable interrupts by clearing the interrupt mask. */
-	SiS_W32(IntrMask, 0x0000);
-
-	/* Stop a shared interrupt from scavenging while we are. */
-	spin_lock_irq(&tp->lock);
-	SiS190_tx_clear(tp);
-	spin_unlock_irq(&tp->lock);
-
-	/* ...and finally, reset everything */
-	SiS190_hw_start(dev);
-
-	netif_wake_queue(dev);
-}
-
-static int
-SiS190_start_xmit(struct sk_buff *skb, struct net_device *dev)
-{
-	struct sis190_private *tp = dev->priv;
-	void *ioaddr = tp->mmio_addr;
-	int entry = tp->cur_tx % NUM_TX_DESC;
-	u32 len;
-
-	if (unlikely(skb->len < ETH_ZLEN)) {
-		skb = skb_padto(skb, ETH_ZLEN);
-		if (skb == NULL)
-			goto drop_tx;
-		len = ETH_ZLEN;
-	} else {
-		len = skb->len;
-	}
-
-	spin_lock_irq(&tp->lock);
-
-	if ((le32_to_cpu(tp->TxDescArray[entry].status) & OWNbit) == 0) {
-		dma_addr_t mapping;
-
-		mapping = pci_map_single(tp->pci_dev, skb->data, len,
-					 PCI_DMA_TODEVICE);
-
-		tp->Tx_skbuff[entry] = skb;
-		tp->TxDescArray[entry].buf_addr = cpu_to_le32(mapping);
-		tp->TxDescArray[entry].PSize = cpu_to_le32(len);
-
-		if (entry != (NUM_TX_DESC - 1))
-			tp->TxDescArray[entry].buf_Len = cpu_to_le32(len);
-		else
-			tp->TxDescArray[entry].buf_Len =
-				cpu_to_le32(len | ENDbit);
-
-		tp->TxDescArray[entry].status |=
-		    cpu_to_le32(OWNbit | INTbit | DEFbit | CRCbit | PADbit);
-
-		SiS_W32(TxControl, 0x1a11);	//Start Send
-
-		dev->trans_start = jiffies;
-
-		tp->cur_tx++;
-	} else {
-		spin_unlock_irq(&tp->lock);
-		goto drop_tx;
-	}
-
-	if ((tp->cur_tx - NUM_TX_DESC) == tp->dirty_tx)
-		netif_stop_queue(dev);
-
-	spin_unlock_irq(&tp->lock);
-
-	return 0;
-
-drop_tx:
-	tp->stats.tx_dropped++;
-	if (skb)
-		dev_kfree_skb(skb);
-	return 0;
-}
-
-static void
-SiS190_tx_interrupt(struct net_device *dev, struct sis190_private *tp,
-		    void *ioaddr)
-{
-	unsigned long dirty_tx, tx_left;
-
-	assert(dev != NULL);
-	assert(tp != NULL);
-	assert(ioaddr != NULL);
-
-	dirty_tx = tp->dirty_tx;
-	tx_left = tp->cur_tx - dirty_tx;
-
-	while (tx_left > 0) {
-		int entry = dirty_tx % NUM_TX_DESC;
-
-		if ((le32_to_cpu(tp->TxDescArray[entry].status) & OWNbit) == 0) {
-			struct sk_buff *skb;
-
-			skb = tp->Tx_skbuff[entry];
-
-			pci_unmap_single(tp->pci_dev,
-				le32_to_cpu(tp->TxDescArray[entry].buf_addr),
-				skb->len < ETH_ZLEN ? ETH_ZLEN : skb->len,
-				PCI_DMA_TODEVICE);
-
-			dev_kfree_skb_irq(skb);
-			tp->Tx_skbuff[entry] = NULL;
-			tp->stats.tx_packets++;
-			dirty_tx++;
-			tx_left--;
-		}
-	}
-
-	if (tp->dirty_tx != dirty_tx) {
-		tp->dirty_tx = dirty_tx;
-		netif_wake_queue(dev);
-	}
-}
-
-static void
-SiS190_rx_interrupt(struct net_device *dev, struct sis190_private *tp,
-		    void *ioaddr)
-{
-	int cur_rx = tp->cur_rx;
-	struct RxDesc *desc = tp->RxDescArray + cur_rx;
-
-	assert(dev != NULL);
-	assert(tp != NULL);
-	assert(ioaddr != NULL);
-
-	while ((desc->status & OWNbit) == 0) {
-
-		if (desc->PSize & 0x0080000) {
-			printk(KERN_INFO "%s: Rx ERROR!!!\n", dev->name);
-			tp->stats.rx_errors++;
-			tp->stats.rx_length_errors++;
-		} else if (!(desc->PSize & 0x0010000)) {
-			printk(KERN_INFO "%s: Rx ERROR!!!\n", dev->name);
-			tp->stats.rx_errors++;
-			tp->stats.rx_crc_errors++;
-		} else {
-			struct sk_buff *skb;
-			int pkt_size;
-
-			pkt_size = (int) (desc->PSize & 0x0000FFFF) - 4;
-			skb = dev_alloc_skb(pkt_size + 2);
-			if (skb != NULL) {
-				skb->dev = dev;
-				skb_reserve(skb, 2);	// 16 byte align the IP fields. //
-				pci_dma_sync_single_for_cpu(tp->pci_dev,
-							    desc->buf_addr,
-							    RX_BUF_SIZE,
-							    PCI_DMA_FROMDEVICE);
-				eth_copy_and_sum(skb, tp->RxBufferRing[cur_rx],
-						 pkt_size, 0);
-				pci_dma_sync_single_for_device(tp->pci_dev,
-							    desc->buf_addr,
-							    RX_BUF_SIZE,
-							    PCI_DMA_FROMDEVICE);
-				skb_put(skb, pkt_size);
-				skb->protocol = eth_type_trans(skb, dev);
-				netif_rx(skb);
-
-				desc->PSize = 0x0;
-
-				if (cur_rx == (NUM_RX_DESC - 1))
-					desc->buf_Len = ENDbit + RX_BUF_SIZE;
-				else
-					desc->buf_Len = RX_BUF_SIZE;
-
-				dev->last_rx = jiffies;
-				tp->stats.rx_bytes += pkt_size;
-				tp->stats.rx_packets++;
-
-				desc->status = OWNbit | INTbit;
-			} else {
-				printk(KERN_WARNING
-				       "%s: Memory squeeze, deferring packet.\n",
-				       dev->name);
-				/* We should check that some rx space is free.
-				   If not, free one and mark stats->rx_dropped++. */
-				tp->stats.rx_dropped++;
-			}
-		}
-
-		cur_rx = (cur_rx + 1) % NUM_RX_DESC;
-		desc = tp->RxDescArray + cur_rx;
-	}
-
-	tp->cur_rx = cur_rx;
-}
-
-/* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */
-static irqreturn_t
-SiS190_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
-{
-	struct net_device *dev = (struct net_device *) dev_instance;
-	struct sis190_private *tp = dev->priv;
-	int boguscnt = max_interrupt_work;
-	void *ioaddr = tp->mmio_addr;
-	unsigned long status = 0;
-	int handled = 0;
-
-	do {
-		status = SiS_R32(IntrStatus);
-
-		/* h/w no longer present (hotplug?) or major error, bail */
-
-		SiS_W32(IntrStatus, status);
-
-		if ((status & (TxQ0Int | RxQInt)) == 0)
-			break;
-
-		// Rx interrupt 
-		if (status & (RxQInt)) {
-			SiS190_rx_interrupt(dev, tp, ioaddr);
-		}
-		// Tx interrupt
-		if (status & (TxQ0Int)) {
-			spin_lock(&tp->lock);
-			SiS190_tx_interrupt(dev, tp, ioaddr);
-			spin_unlock(&tp->lock);
-		}
-
-		boguscnt--;
-	} while (boguscnt > 0);
-
-	if (boguscnt <= 0) {
-		printk(KERN_WARNING "%s: Too much work at interrupt!\n",
-		       dev->name);
-		/* Clear all interrupt sources. */
-		SiS_W32(IntrStatus, 0xffffffff);
-	}
-
-	return IRQ_RETVAL(handled);
-}
-
-static int
-SiS190_close(struct net_device *dev)
-{
-	struct sis190_private *tp = dev->priv;
-	void *ioaddr = tp->mmio_addr;
-	int i;
-
-	netif_stop_queue(dev);
-
-	spin_lock_irq(&tp->lock);
-
-	/* Stop the chip's Tx and Rx DMA processes. */
-
-	SiS_W32(TxControl, 0x1a00);
-	SiS_W32(RxControl, 0x1a00);
-
-	/* Disable interrupts by clearing the interrupt mask. */
-	SiS_W32(IntrMask, 0x0000);
-
-	/* Update the error counts. */
-	//tp->stats.rx_missed_errors += _R32(RxMissed);
-
-	spin_unlock_irq(&tp->lock);
-
-	synchronize_irq(dev->irq);
-	free_irq(dev->irq, dev);
-
-	SiS190_tx_clear(tp);
-	pci_free_consistent(tp->pci_dev, TX_DESC_TOTAL_SIZE, tp->TxDescArray,
-		tp->tx_dma);
-	pci_free_consistent(tp->pci_dev, RX_DESC_TOTAL_SIZE, tp->RxDescArray,
-		tp->rx_dma);
-	tp->TxDescArray = NULL;
-	for (i = 0; i < NUM_RX_DESC; i++) {
-		pci_unmap_single(tp->pci_dev, tp->RxDescArray[i].buf_addr,
-			RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
-		tp->RxBufferRing[i] = NULL;
-	}
-	tp->RxDescArray = NULL;
-	kfree(tp->RxBufferRings);
-
-	return 0;
-}
-
-static void
-SiS190_set_rx_mode(struct net_device *dev)
-{
-	struct sis190_private *tp = dev->priv;
-	void *ioaddr = tp->mmio_addr;
-	unsigned long flags;
-	u32 mc_filter[2];	/* Multicast hash filter */
-	int i, rx_mode;
-	u32 tmp = 0;
-
-	if (dev->flags & IFF_PROMISC) {
-		/* Unconditionally log net taps. */
-		printk(KERN_NOTICE "%s: Promiscuous mode enabled.\n",
-		       dev->name);
-		rx_mode =
-		    AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
-		    AcceptAllPhys;
-		mc_filter[1] = mc_filter[0] = 0xffffffff;
-	} else if ((dev->mc_count > multicast_filter_limit)
-		   || (dev->flags & IFF_ALLMULTI)) {
-		/* Too many to filter perfectly -- accept all multicasts. */
-		rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
-		mc_filter[1] = mc_filter[0] = 0xffffffff;
-	} else {
-		struct dev_mc_list *mclist;
-		rx_mode = AcceptBroadcast | AcceptMyPhys;
-		mc_filter[1] = mc_filter[0] = 0;
-		for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
-		     i++, mclist = mclist->next) {
-			int bit_nr =
-			    ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26;
-			mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
-			rx_mode |= AcceptMulticast;
-		}
-	}
-
-	spin_lock_irqsave(&tp->lock, flags);
-
-	tmp = rx_mode | 0x2;
-
-	SiS_W16(RxMacControl, tmp);
-	SiS_W32(RxHashTable, mc_filter[0]);
-	SiS_W32(RxHashTable + 4, mc_filter[1]);
-
-	spin_unlock_irqrestore(&tp->lock, flags);
-}
-
-struct net_device_stats *
-SiS190_get_stats(struct net_device *dev)
-{
-	struct sis190_private *tp = dev->priv;
-	return &tp->stats;
-}
-
-static struct pci_driver sis190_pci_driver = {
-	.name		= MODULENAME,
-	.id_table	= sis190_pci_tbl,
-	.probe		= SiS190_init_one,
-	.remove		= SiS190_remove_one,
-};
-
-static int __init
-SiS190_init_module(void)
-{
-	return pci_module_init(&sis190_pci_driver);
-}
-
-static void __exit
-SiS190_cleanup_module(void)
-{
-	pci_unregister_driver(&sis190_pci_driver);
-}
-
-module_init(SiS190_init_module);
-module_exit(SiS190_cleanup_module);
--- diff/drivers/net/tulip/ChangeLog	2002-11-11 11:09:37.000000000 +0000
+++ source/drivers/net/tulip/ChangeLog	1970-01-01 01:00:00.000000000 +0100
@@ -1,580 +0,0 @@
-2002-09-18  Ryan Bradetich  <rbradetich@uswest.net>
-
-	tulip hppa support:
-	* eeprom.c (tulip_build_fake_mediatable): new function
-	(tulip_parse_eeprom): call it, when no media table
-	* interrupt.c (phy_interrupt): new function
-	(tulip_interrupt): call it, before checking for no-irq-work
-	* tulip.c: add HAS_PHY_IRQ chip feature flag.
-	add csr12_shadow to tulip_private struct, only for hppa currently.
-	* tulip_core (tulip_init_one): support hppa wonky eeproms
-
-2002-05-11  Juan Quintela  <quintela@mandrakesoft.com>
-
-	* 21142.c (t21142_lnk_change): Revert earlier patch
-	to always reset phy; only conditionally do so now.
-
-2002-05-03  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core (tulip_pci_tbl): Add new "comet"
-	pci id.  Contributed by Ohta Kyuma.
-
-2002-03-07  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core (tulip_mwi_config): Use new PCI API functions
-	for enabling and disabled Memory-Write-Invalidate
-	PCI transaction.
-	Fix bugs in tulip MWI config also.
-
-2002-01-28  Stefan Rompf  <srompf@isg.de>,
-            Jeff Garzik  <jgarzik@pobox.com>
-
-        * 21142.c (t21142_timer):  Use return value of
-        tulip_check_duplex() to indicate to system whether or not
-        carrier is present.  Use carrier presence/absence to determine
-        when next the 21142 media timer should check for link beat.
-
-        * timer (tulip_timer):  Un-comment-out calls to
-        netif_carrier_{on,off}, as there is now value in
-        reporting link beta information to userspace.
-
-2002-01-28  Pavel Roskin  <proski@gnu.org>
-
-	* tulip_core.c (tulip_init_one): Use tp->eeprom instead of
-	allocating a buffer for EEPROM copy on the stack.
-
-	* tulip_core.c: Add support for Conexant RS7112 (a.k.a. CN7112)
-	chip.
-	* tulip.h: Likewise.  Increase EEPROM_SIZE to 512 bytes to
-	accomodate EEPROM on Conexant RS7112.
-
-2002-02-07  Uwe Bonnes  <bon@elektron.ikp.physik.tu-darmstadt.de>
-
-        * tulip_core (tulip_pci_tbl[]):
-        Add PCI id for comet tulip clone.
-
-2001-12-11  Jeff Garzik  <jgarzik@pobox.com>
-
-	* eeprom.c, timer.c, media.c, tulip_core.c:
-	Remove 21040 and 21041 chip support.
-
-2001-11-13  David S. Miller  <davem@redhat.com>
-
-	* tulip_core.c (tulip_mwi_config): Kill unused label early_out.
-
-2001-11-06  Richard Mortimer  <richm@oldelvet.netscapeonline.co.uk>
-
-	* tulip_core.c:  Correct set of values to mask out of csr0,
-	for DM9102A chips.  Limit burst/alignment of DM9102A chips
-	on Sparcs.
-
-2001-11-06  Jun Sun  <jsun@mvista.com>
-
-	* tulip_core.c:  Support finding MAC address on
-	two MIPS boards, DDB5476 and DDB5477.
-
-2001-11-06  Kevin B. Hendricks  <khendricks@ivey.uwo.ca>
-
-	* Makefile, tulip.h, tulip_core.c, pnic2.c, 21142.c:
-	Fixes for PNIC II support.
-
-2001-11-06  David S. Miller  <davem@redhat.com>
-
-	* tulip_core.c: Support reading MAC address from
-	Sparc OBP property local-mac-address.
-
-2001-07-17  Erik A. Hendriks  <hendriks@lanl.gov>
-
-	* 21142.c: Merge fix from tulip.c 0.92w which prevents the
-	overwriting of csr6 bits we want to preserve.
-
-2001-07-10  Jeff Golds  <jgolds@resilience.com>
-
-	* tulip_core.c: Fix two comments
-
-2001-07-06  Stephen Degler  <sdegler@degler.net>
-
-	* media.c:
-	The media selection process at the end of NWAY is busted
-	because for the case of MII/SYM it needs to be:
-
-        csr13 <- 0
-        csr14 <- 0
-        csr6 <-  the value calculated is okay.
-
-	In the other media cases csr14 is computed by
-	t21142_csr14val[dev->if_port], which seems ok.  The value of
-	zero as opposed to 3FFFFF comes straight from appendix D of the
-	21143 data book, and it makes logical sense because you're
-	bypassing all the SIA interface when you usa MII or SYM (see
-	figure 1-1 in the data book if your're visually oriented)
-
-2001-07-03  Jeff Golds  <jgolds@resilience.com>
-
-	* tulip_core.c (tulip_clean_tx_ring):
-	Clear status for in-progress Tx's, and count
-	Tx errors for all packets being released.
-
-2001-06-16  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip.h, tulip_core.c:
-	Integrate MMIO support from devel branch, but default
-	it to off for stable kernel and driver series.
-
-2001-06-16  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c (tulip_init_one):
-	Free descriptor rings on error.
-
-2001-06-16  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c (tulip_mwi_config, tulip_init_one):
-	Large update to csr0 bus configuration code.  This is not stable
-	yet, so it is only conditionally enabled, via CONFIG_TULIP_MWI.
-
-2001-06-16  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c:
-	Initialize timer in tulip_init_one and tulip_down,
-	not in tulip_up.
-
-2001-06-14  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c:
-	- Update tulip_suspend, tulip_resume for new PCI PM API.
-	- Surround suspend/resume code with CONFIG_PM.
-
-2001-06-12  Jeff Golds  <jgolds@resilience.com>
-
-	* tulip_core.c:
-	- Reset sw ring ptrs in tulip_up.  Fixes PM resume case.
-	- Clean rx and tx rings on device down.
-
-2001-06-05  David Miller  <davem@redhat.com>
-
-	* tulip_core (set_rx_mode):  Do not use set_bit
-	on an integer variable.  Also fix endianness issue.
-
-2001-06-04  Jeff Garzik  <jgarzik@pobox.com>
-
-	* interrupt.c:
-	Simplify rx processing when CONFIG_NET_HW_FLOWCONTROL is
-	active, and in the process fix a bug where flow control
-	and low load caused rx not to be acknowledged properly.
-
-2001-06-01  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip.h:
-	- Remove tulip_outl_csr helper, redundant.
-	- Add tulip_start_rxtx inline helper.
-	- tulip_stop_rxtx helper: Add synchronization. Always use current
-	  csr6 value, instead of tp->csr6 value or value passed as arg.
-	- tulip_restart_rxtx helper: Add synchronization. Always
-	  use tp->csr6 for desired mode, not value passed as arg.
-	- New RxOn, TxOn, RxTx constants for csr6 modes.
-	- Remove now-redundant constants csr6_st, csr6_sr.
-
-	* 21142.c, interrupt.c, media.c, pnic.c, tulip_core.c:
-	Update for above rxtx helper changes.
-
-	* interrupt.c:
-	- whitespace cleanup around #ifdef CONFIG_NET_HW_FLOWCONTROL,
-	  convert tabs to spaces.
-	- Move tp->stats.rx_missed_errors update outside the ifdef.
-
-2001-05-18  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c: Added ethtool support.
-	  ETHTOOL_GDRVINFO ioctl only, for now.
-
-2001-05-14  Robert Olsson <Robert.Olsson@data.slu.se>
-
-	* Restored HW_FLOWCONTROL from Linux 2.1 series tulip (ANK)
-	  plus Jamal's NETIF_RX_* feedback control.
-
-2001-05-14  Robert Olsson <Robert.Olsson@data.slu.se>
-
-	* Added support for 21143's Interrupt Mitigation.
-	  Jamal original instigator.
-
-2001-05-14  Robert Olsson <Robert.Olsson@data.slu.se>
-
-	* tulip_refill_rx prototype added to tulip.h
-
-2001-05-13  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c: Remove HAS_PCI_MWI flag from Comet, untested.
-
-2001-05-12  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c, tulip.h: Remove Conexant PCI id, no chip
-	docs are available to fix problems with support.
-
-2001-05-12  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c (tulip_init_one): Do not call
-	unregister_netdev in error cleanup.  Remnant of old
-	usage of init_etherdev.
-
-2001-05-12  Jeff Garzik  <jgarzik@pobox.com>
-
-	* media.c (tulip_find_mii): Simple write the updated BMCR
-	twice, as it seems the best thing to do for both broken and
-	sane chips.
-	If the mii_advert value, as read from MII_ADVERTISE, is zero,
-	then generate a value we should advertise from the capability
-	bits in BMSR.
-	Fill in tp->advertising for all cases.
-	Just to be safe, clear all unwanted bits.
-
-2001-05-12  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c (private_ioctl):  Fill in tp->advertising
-	when advertising value is changed by the user.
-
-2001-05-12  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c: Mark Comet chips as needed the updated MWI
-	csr0 configuration.
-
-2001-05-12  Jeff Garzik  <jgarzik@pobox.com>
-
-	* media.c, tulip_core.c:  Move MII scan into
-	from inlined inside tulip_init_one to new function
-	tulip_find_mii in media.c.
-
-2001-05-12  Jeff Garzik  <jgarzik@pobox.com>
-
-	* media.c (tulip_check_duplex):
-	Only restart Rx/Tx engines if they are active
-	(and csr6 changes)
-
-2001-05-12  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c (tulip_mwi_config):
-	Clamp values read from PCI cache line size register to
-	values acceptable to tulip chip.  Done for safety and
-	-almost- certainly unneeded.
-
-2001-05-11  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c (tulip_init_one):
-	Instead of unconditionally enabling autonegotiation, disable
-	autonegotiation if not using the default port.  Further,
-	flip the nway bit immediately, and then update the
-	speed/duplex in a separate MII transaction.  We do this
-	because some boards require that nway be disabled separately,
-	before media selection is forced.
-
-	TODO: Investigate if we can simply write the same value
-	to BMCR twice, to avoid setting unnecessarily changing
-	phy settings.
-
-2001-05-11  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip.h, tulip_core.c:  If HAS_PCI_MWI is set for a
-	given chip, adjust the csr0 values not according to
-	provided values but according to system cache line size.
-	Currently cache alignment is matched as closely to cache
-	line size as possible.  Currently programmable burst limit
-	is set (ie. never unlimited), and always equal to cache
-	alignment and system cache size.  Currently MWI bit is set
-	only if the MWI bit is present in the PCI command register.
-
-2001-05-11  Jeff Garzik  <jgarzik@pobox.com>
-
-	* media.c (tulip_select_media):
-	For media types 1 and 3, only use the provided eeprom
-	advertising value if it is non-zero.
-	(tulip_check_duplex):
-	Do not exit ASAP if full_duplex_lock is set.  This
-	ensures that the csr6 value is written if an update
-	is needed.
-
-2001-05-10  Jeff Garzik  <jgarzik@pobox.com>
-
-	Merge PNIC-II-specific stuff from Becker's tulip.c:
-
-	* tulip.h, 21142.c (pnic2_lnk_change): new function
-	* tulip_core.c (tulip_init_one): use it
-
-	* tulip_core.c (tulip_tx_timeout): Add specific
-	debugging for PNIC2.
-
-2001-05-10  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c (tulip_init_one): Print out
-	tulip%d instead of PCI device number, for
-	consistency.
-
-2001-05-10  Jeff Garzik  <jgarzik@pobox.com>
-
-	* Merge changes from Becker's tulip.c:
-	Fix bugs in ioctl.
-	Fix several bugs by distinguishing between MII
-	and SYM advertising values.
-	Set CSR14 autonegotiation bit for media types 2 and 4,
-	where the SIA CSR setup values are not provided.
-
-2001-05-10  Jeff Garzik  <jgarzik@pobox.com>
-
-	* media.c (tulip_select_media): Only update MII
-	advertising value if startup arg < 2.
-
-	* tulip.h: Do not enable CSR13/14/15 autoconfiguration
-	for 21041.
-
-	* tulip_core.c:
-	21041: add specific code for reset, and do not set CAC bit
-	When resetting media, for media table type 11 media, pass
-	value 2 as 'startup' arg to select_media, to avoid updating
-	MII advertising value.
-
-2001-05-10  Jeff Garzik  <jgarzik@pobox.com>
-
-	* pnic.c (pnic_check_duplex): remove
-	pnic.c (pnic_lnk_change, pnic_timer): use
-	tulip_check_duplex not pnic_check_duplex.
-
-	* media.c (tulip_check_duplex):
-	Clean up to use symbolic names instead of numeric constants.
-	Set TxThreshold mode as necessary as well as clearing it.
-	Update csr6 if csr6 changes, not simply if duplex changes.
-
-	(found by Manfred Spraul)
-
-2001-05-10  Jeff Garzik  <jgarzik@pobox.com>
-
-	* 21142.c, eeprom.c, tulip.h, tulip_core.c:
-	Remove DPRINTK as another, better method of
-	debug message printing is available.
-
-2001-05-09  Jeff Garzik  <jgarzik@pobox.com>
-
-	* 21142.c (t21142_lnk_change): Pass arg startup==1
-	to tulip_select_media, in order to force csr13 to be
-	zeroed out prior to going to full duplex mode.  Fixes
-	autonegotiation on a quad-port Znyx card.
-	(from Stephen Dengler)
-
-2001-05-09  Russell King  <rmk@arm.linux.org.uk>
-
-	* interrupt.c: Better PCI bus error reporting.
-
-2001-04-03  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c: Now that dev->name is only available late
-	  in the probe, insert a hack to replace a not-evaluated
-	  "eth%d" string with an evaluated "tulip%d" string.
-	  Also, remove obvious comment and an indentation cleanup.
-
-2001-04-03  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c: If we are a module, always print out the
-	  version string.  If we are built into the kernel, only print
-	  the version string if at least one tulip is detected.
-
-2001-04-03  Jeff Garzik  <jgarzik@pobox.com>
-
-	Merged from Becker's tulip.c 0.92t:
-
-	* tulip_core.c: Add support for Conexant LANfinity.
-
-2001-04-03  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c: Only suspend/resume if the interface
-	  is up and running.  Use alloc_etherdev and pci_request_regions.
-	  Spelling fix.
-
-2001-04-03  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c: Remove code that existed when one or more of
-	  the following defines existed.  These defines were never used
-	  by normal users in practice: TULIP_FULL_DUPLEX,
-	  TULIP_DEFAULT_MEDIA, and TULIP_NO_MEDIA_SWITCH.
-
-	* tulip.h, eeprom.c: Move EE_* constants from tulip.h to eeprom.c.
-	* tulip.h, media.c: Move MDIO_* constants from tulip.h to media.c.
-
-	* media.c: Add barrier() to mdio_read/write's PNIC status check
-	  loops.
-
-2001-04-03  Jeff Garzik  <jgarzik@pobox.com>
-
-	Merged from Becker's tulip.c 0.92t:
-
-	* tulip.h: Add MEDIA_MASK constant for bounding medianame[]
-	  array lookups.
-	* eeprom.c, media.c, timer.c, tulip_core.c: Use it.
-
-	* media.c, tulip_core.c: mdio_{read,write} cleanup.  Since this
-	  is called [pretty much] directly from ioctl, we mask
-	  read/write arguments to limit the values passed.
-	  Added mii_lock.  Added comet_miireg2offset and better
-	  Comet-specific mdio_read/write code.	Pay closer attention
-	  to the bits we set in ioctl.	Remove spinlocks from ioctl,
-	  they are in mdio_read/write now.  Use mask to limit
-	  phy number in tulip_init_one's MII scan.
-
-2001-04-03  Jeff Garzik  <jgarzik@pobox.com>
-
-	Merged from Becker's tulip.c 0.92t:
-
-	* 21142.c, tulip_core.c: PNIC2 MAC address and NWay fixes.
-	* tulip.h: Add FullDuplex constant, used in above change.
-
-2001-04-03  Jeff Garzik  <jgarzik@pobox.com>
-
-	* timer.c: Do not call netif_carrier_{on,off}, it is not used in
-	  the main tree.  Leave code in, disabled, as markers for future
-	  carrier notification.
-
-2001-04-03  Jeff Garzik  <jgarzik@pobox.com>
-
-	Merged from Becker's tulip.c 0.92t, except for the tulip.h
-	whitespace cleanup:
-
-	* interrupt.c: If Rx stops, make sure to update the
-	  multicast filter before restarting.
-	* tulip.h: Add COMET_MAC_ADDR feature flag, clean up flags.
-	  Add Accept* Rx mode bit constants.
-	  Add mc_filter[] to driver private struct.
-	* tulip_core.c: Add new Comet PCI id 0x1113:0x9511.
-	  Add COMET_MAC_ADDR feature flag to comet entry in board info array.
-	  Prefer to test COMET_MAC_ADDR flag to testing chip_id for COMET,
-	  when dealing with the Comet's MAC address.
-	  Enable Tx underrun recovery for Comet chips.
-	  Use new Accept* constants in set_rx_mode.
-	  Prefer COMET_MAC_ADDR flag test to chip_id test in set_rx_mode.
-	  Store built mc_filter for later use in intr handler by Comets.
-
-2001-04-03  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c: Use tp->cur_tx when building the
-	  setup frame, instead of assuming that the setup
-	  frame is always built in slot zero.  This case is
-	  hit during PM resume.
-
-2001-04-03  Jeff Garzik  <jgarzik@pobox.com>
-
-	* *.c: Update file headers (copyright, urls, etc.)
-	* Makefile: re-order to that chip-specific modules on own line
-	* eeprom.c: BSS/zero-init cleanup (Andrey Panin)
-	* tulip_core.c: merge medianame[] update from tulip.c.
-	  Additional arch-specific rx_copybreak, csr0 values. (various)
-
-2001-02-20  Jeff Garzik  <jgarzik@pobox.com>
-
-	* media.c (tulip_select_media): No need to initialize
-	new_csr6, all cases initialize it properly.
-
-2001-02-18  Manfred Spraul  <manfred@colorfullife.com>
-
-	* interrupt.c (tulip_refill_rx): Make public.
-	If PNIC chip stops due to lack of Rx buffers, restart it.
-	(tulip_interrupt): PNIC doesn't have a h/w timer, emulate
-	with software timers.
-	* pnic.c (pnic_check_duplex): New function, PNIC-specific
-	version of tulip_check_duplex.
-	(pnic_lnk_change): Call pnic_check_duplex.  If we use an
-	external MII, then we mustn't use the internal negotiation.
-	(pnic_timer): Support Rx refilling on work overflow in
-	interrupt handler, as PNIC doesn't support a h/w timer.
-	* tulip_core.c (tulip_tbl[]): Modify default csr6
-
-2001-02-11  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c (tulip_init_one): Call pci_enable_device
-	to ensure wakeup/resource assignment before checking those
-	values.
-	(tulip_init_one): Replace PCI ids with constants from pci_id.h.
-	(tulip_suspend, tulip_resume, tulip_remove_one): Call
-	pci_power_on/off (commented out for now).
-
-2001-02-10  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip.h: Add CFDD_xxx bits for Tulip power management
-	* tulip_core.c (tulip_set_power_state): New function,
-	manipulating Tulip chip power state where supported.
-	(tulip_up, tulip_down, tulip_init_one): Use it.
-
-2001-02-10  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c (tulip_tx_timeout): Call netif_wake_queue
-	to ensure the next Tx is always sent to us.
-
-2001-01-27  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c (tulip_remove_one): Fix mem leak by freeing
-	tp->media_tbl.  Add check for !dev, reformat code appropriately.
-
-2001-01-27  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_tbl[]: Comment all entries to make order and chip_id
-	relationship more clear.
-	* tulip_pci_tbl[]: Add new Accton PCI id (COMET chipset).
-
-2001-01-16  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c: static vars no longer explicitly
-	initialized to zero.
-	* eeprom.c (tulip_read_eeprom): Make sure to delay between
-	EE_ENB and EE_ENB|EE_SHIFT_CLK.  Merged from becker tulip.c.
-
-2001-01-05  Peter De Schrijver  <p2@mind.be>
-
-	* eeprom.c (tulip_parse_eeprom): Interpret a bit more of 21142
-	extended format type 3 info blocks in a tulip SROM.
-
-2001-01-03  Matti Aarnio  <matti.aarnio@zmailer.org>
-
-	* media.c (tulip_select_media): Support media types 5 and 6
-
-2001-??-??  ??
-
-	* tulip_core.c: Add comment about LanMedia needing
-	a different driver.
-	Enable workarounds for early PCI chipsets.
-	Add IA64 csr0 support, update HPPA csr0 support.
-
-2000-12-17  Alan Cox  <alan@redhat.com>
-
-        * eeprom.c, timer.c, tulip.h, tulip_core.c: Merge support
-	for the Davicom's quirks into the main tulip.
-	Patch by Tobias Ringstrom
-
-2000-11-08  Jim Studt  <jim@federated.com>
-
-	* eeprom.c (tulip_parse_eeprom):  Check array bounds for
-	medianame[] and block_name[] arrays to avoid oops due
-	to bad values returned from hardware.
-
-2000-11-02  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c (set_rx_mode): This is synchronized via
-	dev->xmit_lock, so only the queueing of the setup frame needs to
-	be locked, against tulip_interrupt.
-
-2000-11-02  Alexey Kuznetov  <kuznet@ms2.inr.ac.ru>
-
-	* timer.c (tulip_timer): Call netif_carrier_{on,off} to report
-	link state to the rest of the kernel, and userspace.
-	* interrupt.c (tulip_interrupt): Remove tx_full.
-	* tulip.h: Likewise.
-	* tulip_core.c (tulip_init_ring, tulip_start_xmit, set_rx_mode):
-	Likewise.
-
-2000-10-18  Jeff Garzik  <jgarzik@pobox.com>
-
-	* tulip_core.c: (tulip_init_one) Print out ethernet interface
-	on error.  Print out a message when pci_enable_device fails.
-	Handle DMA alloc failure.
-
-2000-10-18  Jeff Garzik  <jgarzik@pobox.com>
-
-	* Makefile: New file.
-	* tulip_core.c (tulip_init_one): Correct error messages
-	on PIO/MMIO region reserve failure.
-	(tulip_init_one) Add new check to ensure that PIO region is
-	sufficient for our needs.
-
--- diff/drivers/net/wan/lmc/lmc_proto_raw.h	2002-10-16 04:27:56.000000000 +0100
+++ source/drivers/net/wan/lmc/lmc_proto_raw.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,4 +0,0 @@
-#ifndef _LMC_PROTO_RAW_H_
-#define _LMC_PROTO_RAW_H_
-
-#endif
--- diff/drivers/net/wan/lmc/lmc_ver.h	2003-09-30 15:46:16.000000000 +0100
+++ source/drivers/net/wan/lmc/lmc_ver.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,123 +0,0 @@
-#include <linux/version.h>
-
-#ifndef _IF_LMC_LINUXVER_
-#define _IF_LMC_LINUXVER_
-
- /*
-  * Copyright (c) 1997-2000 LAN Media Corporation (LMC)
-  * All rights reserved.  www.lanmedia.com
-  *
-  * This code is written by:
-  * Andrew Stanley-Jones (asj@cban.com)
-  * Rob Braun (bbraun@vix.com),
-  * Michael Graff (explorer@vix.com) and
-  * Matt Thomas (matt@3am-software.com).
-  *
-  * This software may be used and distributed according to the terms
-  * of the GNU General Public License version 2, incorporated herein by reference.
-  */
-
- /*
-  * This file defines and controls all linux version
-  * differences.
-  *
-  * This is being done to keep 1 central location where all linux
-  * version differences can be kept and maintained.  as this code was
-  * found version issues where pepered throughout the source code and
-  * made the souce code not only hard to read but version problems hard
-  * to track down.  If I'm overiding a function/etc with something in
-  * this file it will be prefixed by "LMC_" which will mean look
-  * here for the version dependent change that's been done.
-  *
-  */
-
-#if LINUX_VERSION_CODE < 0x20363
-#define net_device device
-#endif
-
-#if LINUX_VERSION_CODE < 0x20363
-#define LMC_XMITTER_BUSY(x) (x)->tbusy = 1
-#define LMC_XMITTER_FREE(x) (x)->tbusy = 0
-#define LMC_XMITTER_INIT(x) (x)->tbusy = 0
-#else
-#define LMC_XMITTER_BUSY(x) netif_stop_queue(x)
-#define LMC_XMITTER_FREE(x) netif_wake_queue(x)
-#define LMC_XMITTER_INIT(x) netif_start_queue(x)
-
-#endif
-
-
-#if LINUX_VERSION_CODE < 0x20100
-//typedef unsigned int u_int32_t;
-
-#define  LMC_SETUP_20_DEV {\
-                             int indx; \
-                             for (indx = 0; indx < DEV_NUMBUFFS; indx++) \
-                                skb_queue_head_init (&dev->buffs[indx]); \
-                          } \
-                          dev->family = AF_INET; \
-                          dev->pa_addr = 0; \
-                          dev->pa_brdaddr = 0; \
-                          dev->pa_mask = 0xFCFFFFFF; \
-                          dev->pa_alen = 4;		/* IP addr.  sizeof(u32) */
-
-#else
-
-#define LMC_SETUP_20_DEV
-
-#endif
-
-
-#if LINUX_VERSION_CODE < 0x20155 /* basically 2.2 plus */
-
-#define LMC_DEV_KFREE_SKB(skb) dev_kfree_skb((skb), FREE_WRITE)
-
-#else /* Mostly 2.0 kernels */
-
-#define LMC_DEV_KFREE_SKB(skb) dev_kfree_skb(skb)
-
-#endif
-
-#if LINUX_VERSION_CODE < 0x20200
-#else
-
-#endif
-
-#if LINUX_VERSION_CODE < 0x20100
-#define LMC_SKB_FREE(skb, val) (skb->free = val)
-#else
-#define LMC_SKB_FREE(skb, val)
-#endif
-
-
-#if (LINUX_VERSION_CODE >= 0x20200)
-
-#define LMC_SPIN_FLAGS                unsigned long flags;
-#define LMC_SPIN_LOCK_INIT(x)         spin_lock_init(&(x)->lmc_lock);
-#define LMC_SPIN_UNLOCK(x)            ((x)->lmc_lock = SPIN_LOCK_UNLOCKED)
-#define LMC_SPIN_LOCK_IRQSAVE(x)      spin_lock_irqsave (&(x)->lmc_lock, flags);
-#define LMC_SPIN_UNLOCK_IRQRESTORE(x) spin_unlock_irqrestore (&(x)->lmc_lock, flags);
-#else
-#define LMC_SPIN_FLAGS
-#define LMC_SPIN_LOCK_INIT(x)
-#define LMC_SPIN_UNLOCK(x)
-#define LMC_SPIN_LOCK_IRQSAVE(x)
-#define LMC_SPIN_UNLOCK_IRQRESTORE(x)
-#endif
-
-
-#if LINUX_VERSION_CODE >= 0x20100
-#define LMC_COPY_FROM_USER(x, y, z) if(copy_from_user ((x), (y), (z))) return -EFAULT
-#define LMC_COPY_TO_USER(x, y, z) if(copy_to_user ((x), (y), (z))) return -EFAULT
-#else
-#define LMC_COPY_FROM_USER(x, y, z) if(verify_area(VERIFY_READ, (y), (z))) \
-			               return -EFAULT; \
-                                    memcpy_fromfs ((x), (y), (z))
-
-#define LMC_COPY_TO_USER(x, y, z)   if(verify_area(VERIFY_WRITE, (x), (z))) \
-	                               return -EFAULT; \
-                                    memcpy_tofs ((x), (y), (z))
-#endif
-
-
-#endif
--- diff/drivers/s390/net/qeth.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/s390/net/qeth.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,10872 +0,0 @@
-/*
- *
- * linux/drivers/s390/net/qeth.c ($Revision: 1.177 $)
- *
- * Linux on zSeries OSA Express and HiperSockets support
- *
- * Copyright 2000,2003 IBM Corporation
- *
- * Author(s): Utz Bacher <utz.bacher@de.ibm.com>
- *            Cornelia Huck <cohuck@de.ibm.com> (2.5 integration,
- *                                               numerous bugfixes)
- *            Frank Pavlic <pavlic@de.ibm.com>  (query/purge ARP, SNMP, fixes)
- *            Andreas Herrmann <aherrman@de.ibm.com> (bugfixes)
- *            Thomas Spatzier <tspat@de.ibm.com> (bugfixes)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-/*
- * The driver supports in general all QDIO driven network devices on the
- * Hydra card.
- *
- * For all devices, three channels must be available to the driver. One
- * channel is the read channel, one is the write channel and the third
- * one is the channel used to control QDIO.
- *
- * There are several stages from the channel recognition to the running
- * network device:
- * - The channels are scanned and ordered due to the parameters (see
- *   MODULE_PARM_DESC)
- * - The card is hardsetup: this means, that the communication channels
- *   are prepared
- * - The card is softsetup: this means, that commands are issued
- *   to activate the network parameters
- * - After that, data can flow through the card (transported by QDIO)
- *
- *IPA Takeover:
- * /proc/qeth_ipa_takeover provides the possibility to add and remove
- * certain ranges of IP addresses to the driver. As soon as these
- * addresses have to be set by the driver, the driver uses the OSA
- * Address Takeover mechanism.
- * reading out of the proc-file displays the registered addresses;
- * writing into it changes the information. Only one command at one
- * time must be written into the file. Subsequent commands are ignored.
- * The following commands are available:
- * inv4
- * inv6
- * add4 <ADDR>/<mask bits>[:<interface>]
- * add6 <ADDR>/<mask bits>[:<interface>]
- * del4 <ADDR>/<mask bits>[:<interface>]
- * del6 <ADDR>/<mask bits>[:<interface>]
- * inv4 and inv6 toggle the IPA takeover behaviour for all interfaces:
- * when inv4 was input once, all addresses specified with add4 are not
- * set using the takeover mechanism, but all other IPv4 addresses are set so.
- *
- * add# adds an address range, del# deletes an address range. # corresponds
- * to the IP version (4 or 6).
- * <ADDR> is a 8 or 32byte hexadecimal view of the IP address.
- * <mask bits> specifies the number of bits which are set in the network mask.
- * <interface> is optional and specifies the interface name to which the
- * address range is bound.
- * E. g.
- *   add4 C0a80100/24
- * activates all addresses in the 192.168.10 subnet for address takeover.
- * Note, that the address is not taken over before an according ifconfig
- * is executed.
- *
- *VIPA:
- * add_vipa4 <ADDR>:<interface>
- * add_vipa6 <ADDR>:<interface>
- * del_vipa4 <ADDR>:<interface>
- * del_vipa6 <ADDR>:<interface>
- *
- * the specified address is set/unset as VIPA on the specified interface.
- * use the src_vipa package to exploit this out of arbitrary applications.
- *
- *Proxy ARP:
- *
- * add_rxip4 <ADDR>:<interface>
- * add_rxip6 <ADDR>:<interface>
- * del_rxip4 <ADDR>:<interface>
- * del_rxip6 <ADDR>:<interface>
- *
- * the specified address is set/unset as "do not fail a gratuitous ARP"
- * on the specified interface. this can be used to act as a proxy ARP.
- */
-
-static void volatile
-qeth_eyecatcher(void)
-{
-	return;
-}
-
-#undef DEBUG
-
-#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/moduleparam.h>
-
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/mm.h>
-
-#include <asm/io.h>
-#include <asm/ebcdic.h>
-#include <linux/ctype.h>
-#include <asm/semaphore.h>
-#include <asm/timex.h>
-#include <linux/if.h>
-#include <linux/if_arp.h>
-#include <linux/ip.h>
-#include <linux/inetdevice.h>
-#include <linux/netdevice.h>
-#include <linux/sched.h>
-#include <linux/workqueue.h>
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/interrupt.h>
-#include <linux/tcp.h>
-#include <linux/icmp.h>
-#include <linux/skbuff.h>
-#ifdef CONFIG_PROC_FS
-#include <linux/proc_fs.h>
-#endif /* CONFIG_PROC_FS */
-#include <net/route.h>
-#include <net/arp.h>
-#include <linux/in.h>
-#include <linux/igmp.h>
-#include <net/ip.h>
-#include <asm/uaccess.h>
-#include <linux/init.h>
-#include <net/ipv6.h>
-#include <linux/in6.h>
-#include <net/if_inet6.h>
-#include <net/addrconf.h>
-#include <linux/if_tr.h>
-#include <linux/trdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/reboot.h>
-
-#include <linux/if_vlan.h>
-
-#include <asm/ccwdev.h>
-#include <asm/ccwgroup.h>
-#include <asm/debug.h>
-
-#include "qeth_mpc.h"
-#include "qeth.h"
-
-/****************** MODULE PARAMETER VARIABLES ********************/
-static int qeth_sparebufs = 0;
-module_param(qeth_sparebufs, int, 0);
-MODULE_PARM_DESC(qeth_sparebufs, "the number of pre-allocated spare buffers "
-		 "reserved for low memory situations");
-
-/****************** MODULE STUFF **********************************/
-#define VERSION_QETH_C "$Revision: 1.177 $"
-static const char *version = "qeth S/390 OSA-Express driver ("
-    VERSION_QETH_C "/" VERSION_QETH_H "/" VERSION_QETH_MPC_H
-    QETH_VERSION_IPV6 QETH_VERSION_VLAN ")";
-
-MODULE_AUTHOR("Utz Bacher <utz.bacher@de.ibm.com>");
-MODULE_DESCRIPTION("Linux on zSeries OSA Express and HiperSockets support\n" \
-		   "Copyright 2000,2003 IBM Corporation\n");
-MODULE_LICENSE("GPL");
-
-/******************** HERE WE GO ***********************************/
-
-#define PROCFILE_SLEEP_SEM_MAX_VALUE 0
-#define PROCFILE_IOCTL_SEM_MAX_VALUE 3
-static struct semaphore qeth_procfile_ioctl_lock;
-static struct semaphore qeth_procfile_ioctl_sem;
-static struct qeth_card *firstcard = NULL;
-
-static struct sparebufs sparebufs[MAX_SPARE_BUFFERS];
-static int sparebuffer_count;
-
-static unsigned int known_devices[][10] = QETH_MODELLIST_ARRAY;
-
-static spinlock_t setup_lock = SPIN_LOCK_UNLOCKED;
-static rwlock_t list_lock = RW_LOCK_UNLOCKED;
-
-static debug_info_t *qeth_dbf_setup = NULL;
-static debug_info_t *qeth_dbf_data = NULL;
-static debug_info_t *qeth_dbf_misc = NULL;
-static debug_info_t *qeth_dbf_control = NULL;
-static debug_info_t *qeth_dbf_trace = NULL;
-static debug_info_t *qeth_dbf_sense = NULL;
-static debug_info_t *qeth_dbf_qerr = NULL;
-
-static int proc_file_registration;
-#ifdef QETH_PERFORMANCE_STATS
-static int proc_perf_file_registration;
-#define NOW qeth_get_micros()
-#endif /* QETH_PERFORMANCE_STATS */
-static int proc_ipato_file_registration;
-
-static int ipato_inv4 = 0, ipato_inv6 = 0;
-static struct ipato_entry *ipato_entries = NULL;
-static spinlock_t ipato_list_lock = SPIN_LOCK_UNLOCKED;
-
-struct tempinfo{
-	char *data;
-	int len;
-};
-
-/* thought I could get along without forward declarations...
- * just lazyness here */
-static int qeth_reinit_thread(void *);
-static inline void qeth_schedule_recovery(struct qeth_card *card);
-
-static inline int
-QETH_IP_VERSION(struct sk_buff *skb)
-{
-	switch (skb->protocol) {
-	case ETH_P_IPV6:
-		return 6;
-	case ETH_P_IP:
-		return 4;
-	default:
-		return 0;
-	}
-}
-
-/* not a macro, as one of the arguments is atomic_read */
-static inline int
-qeth_min(int a, int b)
-{
-	if (a < b)
-		return a;
-	else
-		return b;
-}
-
-static inline unsigned int
-qeth_get_millis(void)
-{
-	return (int) (get_clock() >> 22);   /* time>>12 is microseconds, we
-					       divide it by 1024 */
-}
-
-#ifdef QETH_PERFORMANCE_STATS
-static inline unsigned int
-qeth_get_micros(void)
-{
-	return (int) (get_clock() >> 12);
-}
-#endif /* QETH_PERFORMANCE_STATS */
-
-static void
-qeth_delay_millis(unsigned long msecs)
-{
-	unsigned int start;
-
-	start = qeth_get_millis();
-	while (qeth_get_millis() - start < msecs) ;
-}
-
-static void
-qeth_wait_nonbusy(unsigned int timeout)
-{
-	unsigned int start;
-	char dbf_text[15];
-
-	sprintf(dbf_text, "wtnb%4x", timeout);
-	QETH_DBF_TEXT3(0, trace, dbf_text);
-
-	start = qeth_get_millis();
-	for (;;) {
-		set_task_state(current, TASK_INTERRUPTIBLE);
-		if (qeth_get_millis() - start > timeout) {
-			goto out;
-		}
-		schedule_timeout(((start + timeout -
-				   qeth_get_millis()) >> 10) * HZ);
-	}
-out:
-	set_task_state(current, TASK_RUNNING);
-}
-
-static void
-qeth_get_mac_for_ipm(__u32 ipm, char *mac, struct net_device *dev)
-{
-	if (dev->type == ARPHRD_IEEE802_TR)
-		ip_tr_mc_map(ipm, mac);
-	else
-		ip_eth_mc_map(ipm, mac);
-}
-
-#define atomic_swap(a,b) xchg((int*)a.counter,b)
-
-static int inline
-my_spin_lock_nonbusy(struct qeth_card *card, spinlock_t * lock)
-{
-	for (;;) {
-		if (card) {
-			if (atomic_read(&card->shutdown_phase))
-				return -1;
-		}
-		if (spin_trylock(lock))
-			return 0;
-		qeth_wait_nonbusy(QETH_IDLE_WAIT_TIME);
-	}
-}
-
-static int inline
-my_down_trylock_nonbusy(struct qeth_card *card, struct semaphore  *sema)
-{
-	for (;;) {
-		if (card) {
-			if (atomic_read(&card->shutdown_phase))
-				return -1;
-		}
-		if (down_trylock(sema))
-			return 0;
-		qeth_wait_nonbusy(QETH_IDLE_WAIT_TIME);
-	}
-}
-
-
-#ifdef CONFIG_ARCH_S390X
-#define QETH_GET_ADDR(x) ((__u32)(unsigned long)x)
-#else /* CONFIG_ARCH_S390X */
-#define QETH_GET_ADDR(x) ((__u32)x)
-#endif /* CONFIG_ARCH_S390X */
-
-static int
-qeth_does_card_exist(struct qeth_card *card)
-{
-	struct qeth_card *c = firstcard;
-	int rc = 0;
-
-	read_lock(&list_lock);
-	while (c) {
-		if (c == card) {
-			rc = 1;
-			break;
-		}
-		c = c->next;
-	}
-	read_unlock(&list_lock);
-	return rc;
-}
-
-static int
-qeth_getxdigit(char c)
-{
-	if ((c >= '0') && (c <= '9'))
-		return c - '0';
-	if ((c >= 'a') && (c <= 'f'))
-		return c + 10 - 'a';
-	if ((c >= 'A') && (c <= 'F'))
-		return c + 10 - 'A';
-	return -1;
-}
-
-static struct qeth_card *
-qeth_get_card_by_name(char *name)
-{
-	struct qeth_card *card;
-
-	read_lock(&list_lock);
-	card = firstcard;
-	while (card) {
-		if (!strncmp(name, card->dev_name, DEV_NAME_LEN))
-			break;
-		card = card->next;
-	}
-	read_unlock(&list_lock);
-
-	return card;
-}
-
-static void
-qeth_convert_addr_to_text(int version, __u8 * addr, char *text)
-{
-	if (version == 4) {
-		sprintf(text, "%02x%02x%02x%02x",
-			addr[0], addr[1], addr[2], addr[3]);
-	} else {
-		sprintf(text, "%02x%02x%02x%02x%02x%02x%02x%02x"
-			"%02x%02x%02x%02x%02x%02x%02x%02x",
-			addr[0], addr[1], addr[2], addr[3],
-			addr[4], addr[5], addr[6], addr[7],
-			addr[8], addr[9], addr[10], addr[11],
-			addr[12], addr[13], addr[14], addr[15]);
-	}
-}
-
-static int
-qeth_convert_text_to_addr(int version, char *text, __u8 * addr)
-{
-	int olen = (version == 4) ? 4 : 16;
-
-	while (olen--) {
-		if ((!isxdigit(*text)) || (!isxdigit(*(text + 1))))
-			return -EINVAL;
-		*addr =
-		    (qeth_getxdigit(*text) << 4) + qeth_getxdigit(*(text + 1));
-		addr++;
-		text += 2;
-	}
-	return 0;
-}
-
-static void
-qeth_add_ipato_entry(int version, __u8 * addr, int mask_bits, char *dev_name)
-{
-	struct ipato_entry *entry, *e;
-	int len = (version == 4) ? 4 : 16;
-
-	entry =
-	    (struct ipato_entry *) kmalloc(sizeof (struct ipato_entry),
-					   GFP_KERNEL);
-	if (!entry) {
-		PRINT_ERR("not enough memory for ipato allocation\n");
-		return;
-	}
-	entry->version = version;
-	memcpy(entry->addr, addr, len);
-	if (dev_name) {
-		strncpy(entry->dev_name, dev_name, DEV_NAME_LEN);
-		if (qeth_get_card_by_name(dev_name)->options.ena_ipat !=
-		    ENABLE_TAKEOVER)
-			PRINT_WARN("IP takeover is not enabled on %s! "
-				   "Ignoring line\n", dev_name);
-	} else
-		memset(entry->dev_name, 0, DEV_NAME_LEN);
-	entry->mask_bits = mask_bits;
-	entry->next = NULL;
-
-	spin_lock(&ipato_list_lock);
-	if (ipato_entries) {
-		e = ipato_entries;
-		while (e) {
-			if ((e->version == version) &&
-			    (e->mask_bits == mask_bits) &&
-			    (((dev_name) && !strncmp(e->dev_name, dev_name,
-						     DEV_NAME_LEN)) ||
-			     (!dev_name)) && (!memcmp(e->addr, addr, len))) {
-				PRINT_INFO("ipato to be added does already "
-					   "exist\n");
-				kfree(entry);
-				goto out;
-			}
-			if (e->next)
-				e = e->next;
-			else
-				break;
-		}
-		e->next = entry;
-	} else
-		ipato_entries = entry;
-      out:
-	spin_unlock(&ipato_list_lock);
-}
-
-static void
-qeth_del_ipato_entry(int version, __u8 * addr, int mask_bits, char *dev_name)
-{
-	struct ipato_entry *e, *e_before;
-	int len = (version == 4) ? 4 : 16;
-	int found = 0;
-
-	spin_lock(&ipato_list_lock);
-	e = ipato_entries;
-	if ((e->version == version) &&
-	    (e->mask_bits == mask_bits) && (!memcmp(e->addr, addr, len))) {
-		ipato_entries = e->next;
-		kfree(e);
-	} else
-		while (e) {
-			e_before = e;
-			e = e->next;
-			if (!e)
-				break;
-			if ((e->version == version) &&
-			    (e->mask_bits == mask_bits) &&
-			    (((dev_name) && !strncmp(e->dev_name, dev_name,
-						     DEV_NAME_LEN)) ||
-			     (!dev_name)) && (!memcmp(e->addr, addr, len))) {
-				e_before->next = e->next;
-				kfree(e);
-				found = 1;
-				break;
-			}
-		}
-	if (!found)
-		PRINT_INFO("ipato to be deleted does not exist\n");
-	spin_unlock(&ipato_list_lock);
-}
-
-static void
-qeth_convert_addr_to_bits(__u8 * addr, char *bits, int len)
-{
-	int i, j;
-	__u8 octet;
-
-	for (i = 0; i < len; i++) {
-		octet = addr[i];
-		for (j = 7; j >= 0; j--) {
-			bits[i * 8 + j] = (octet & 1) ? 1 : 0;
-			octet >>= 1;
-		}
-	}
-}
-
-static int
-qeth_is_ipa_covered_by_ipato_entries(int version, __u8 * addr,
-				     struct qeth_card *card)
-{
-	char *memarea, *addr_bits, *entry_bits;
-	int len = (version == 4) ? 4 : 16;
-	int invert = (version == 4) ? ipato_inv4 : ipato_inv6;
-	int result = 0;
-	struct ipato_entry *e;
-
-	if (card->options.ena_ipat != ENABLE_TAKEOVER) {
-		return 0;
-	}
-
-	memarea = kmalloc(256, GFP_KERNEL);
-	if (!memarea) {
-		PRINT_ERR("not enough memory to check out whether to "
-			  "use ipato\n");
-		return 0;
-	}
-	addr_bits = memarea;
-	entry_bits = memarea + 128;
-	qeth_convert_addr_to_bits(addr, addr_bits, len);
-	e = ipato_entries;
-	while (e) {
-		qeth_convert_addr_to_bits(e->addr, entry_bits, len);
-		if ((!memcmp(addr_bits, entry_bits,
-			     __min(len * 8, e->mask_bits))) &&
-		    ((e->dev_name[0] &&
-		      (!strncmp(e->dev_name, card->dev_name, DEV_NAME_LEN))) ||
-		     (!e->dev_name[0]))) {
-			result = 1;
-			break;
-		}
-		e = e->next;
-	}
-
-	kfree(memarea);
-	if (invert)
-		return !result;
-	else
-		return result;
-}
-
-static void
-qeth_set_dev_flag_running(struct qeth_card *card)
-{
-	if (card) {
-		card->dev->flags |= IFF_RUNNING;
-	}
-}
-
-static void
-qeth_set_dev_flag_norunning(struct qeth_card *card)
-{
-	if (card) {
-		card->dev->flags &= ~IFF_RUNNING;
-	}
-}
-
-static void
-qeth_restore_dev_flag_state(struct qeth_card *card)
-{
-	if (card) {
-		if (card->saved_dev_flags & IFF_RUNNING)
-			card->dev->flags |= IFF_RUNNING;
-		else
-			card->dev->flags &= ~IFF_RUNNING;
-	}
-}
-
-static void
-qeth_save_dev_flag_state(struct qeth_card *card)
-{
-	if (card) {
-		card->saved_dev_flags = card->dev->flags & IFF_RUNNING;
-	}
-}
-
-static int
-qeth_open(struct net_device *dev)
-{
-	struct qeth_card *card;
-
-	card = (struct qeth_card *) dev->priv;
-	QETH_DBF_CARD2(0, trace, "open", card);
-	QETH_DBF_CARD2(0, setup, "open", card);
-
-	qeth_save_dev_flag_state(card);
-
-	netif_start_queue(dev);
-	atomic_set(&((struct qeth_card *) dev->priv)->is_open, 1);
-
-	return 0;
-}
-
-static int
-qeth_set_config(struct net_device *dev, struct ifmap *map)
-{
-	struct qeth_card *card;
-
-	card = (struct qeth_card *)dev->priv;
-	QETH_DBF_CARD3(0, trace, "nscf", card);
-
-	return -EOPNOTSUPP;
-}
-
-static int
-qeth_is_multicast_skb_at_all(struct sk_buff *skb, int version)
-{
-	int i;
-	struct qeth_card *card;
-
-	i = RTN_UNSPEC;
-	card = (struct qeth_card *)skb->dev->priv;
-	if (skb->dst && skb->dst->neighbour) {
-		i = skb->dst->neighbour->type;
-		return ((i == RTN_BROADCAST) ||
-			(i == RTN_MULTICAST) || (i == RTN_ANYCAST)) ? i : 0;
-	}
-	/* ok, we've to try it somehow else */
-	if (version == 4) {
-		return ((skb->nh.raw[16] & 0xf0) == 0xe0) ? RTN_MULTICAST : 0;
-	} else if (version == 6) {
-		return (skb->nh.raw[24] == 0xff) ? RTN_MULTICAST : 0;
-	}
-	if (!memcmp(skb->nh.raw, skb->dev->broadcast, 6)) {
-		i = RTN_BROADCAST;
-	} else {
-		__u16 hdr_mac;
-
-	        hdr_mac = *((__u16*)skb->nh.raw);
-	        /* tr multicast? */
-	        switch (card->link_type) {
-	        case QETH_MPC_LINK_TYPE_HSTR:
-	        case QETH_MPC_LINK_TYPE_LANE_TR:
-	        	if ((hdr_mac == QETH_TR_MAC_NC) ||
-			    (hdr_mac == QETH_TR_MAC_C))
-				i = RTN_MULTICAST;
-			break;
-	        /* eth or so multicast? */
-                default:
-                      	if ((hdr_mac == QETH_ETH_MAC_V4) ||
-			    (hdr_mac == QETH_ETH_MAC_V6))
-			        i = RTN_MULTICAST;
-	        }
-        }
-	return ((i == RTN_BROADCAST)||
-	        (i == RTN_MULTICAST)||
-	        (i == RTN_ANYCAST)) ? i : 0;
-}
-
-static int
-qeth_get_prioqueue(struct qeth_card *card, struct sk_buff *skb,
-		   int multicast, int version)
-{
-	if (!version && (card->type == QETH_CARD_TYPE_OSAE))
-		return QETH_DEFAULT_QUEUE;
-	switch (card->no_queues) {
-	case 1:
-		return 0;
-	case 4:
-		if (card->is_multicast_different) {
-			if (multicast) {
-				return card->is_multicast_different &
-				    (card->no_queues - 1);
-			} else {
-				return 0;
-			}
-		}
-		if (card->options.do_prio_queueing) {
-			if (version == 4) {
-				if (card->options.do_prio_queueing ==
-				    PRIO_QUEUEING_TOS) {
-					if (skb->nh.iph->tos &
-					    IP_TOS_NOTIMPORTANT) {
-						return 3;
-					}
-					if (skb->nh.iph->tos & IP_TOS_LOWDELAY) {
-						return 0;
-					}
-					if (skb->nh.iph->tos &
-					    IP_TOS_HIGHTHROUGHPUT) {
-						return 1;
-					}
-					if (skb->nh.iph->tos &
-					    IP_TOS_HIGHRELIABILITY) {
-						return 2;
-					}
-					return QETH_DEFAULT_QUEUE;
-				}
-				if (card->options.do_prio_queueing ==
-				    PRIO_QUEUEING_PREC) {
-					return 3 - (skb->nh.iph->tos >> 6);
-				}
-			} else if (version == 6) {
-				/********************
-				 ********************
-				 *TODO: IPv6!!!
-				 ********************/
-			}
-			return card->options.default_queue;
-		} else
-			return card->options.default_queue;
-	default:
-		return 0;
-	}
-}
-
-static void
-qeth_wakeup(struct qeth_card *card)
-{
-	QETH_DBF_CARD5(0, trace, "wkup", card);
-
-	atomic_set(&card->data_has_arrived, 1);
-	wake_up(&card->wait_q);
-}
-
-static int
-qeth_check_idx_response(unsigned char *buffer)
-{
-	if (!buffer)
-		return 0;
-	if ((buffer[2] & 0xc0) == 0xc0) {
-		return -EIO;
-	}
-	return 0;
-}
-
-static int
-qeth_get_cards_problem(struct ccw_device *cdev, unsigned char *buffer,
-		       int dstat, int cstat, int rqparam,
-		       char *irb, char *sense)
-{
-	char dbf_text[15];
-	int problem = 0;
-	struct qeth_card *card;
-
-	card = CARD_FROM_CDEV(cdev);
-
-	if (atomic_read(&card->shutdown_phase))
-		return 0;
-	if (dstat & DEV_STAT_UNIT_CHECK) {
-		if (sense[SENSE_RESETTING_EVENT_BYTE] &
-		    SENSE_RESETTING_EVENT_FLAG) {
-			QETH_DBF_CARD1(0, trace, "REVN", card);
-			problem = PROBLEM_RESETTING_EVENT_INDICATOR;
-			goto out;
-		}
-		if (sense[SENSE_COMMAND_REJECT_BYTE] &
-		    SENSE_COMMAND_REJECT_FLAG) {
-			QETH_DBF_CARD1(0, trace, "CREJ", card);
-			problem = PROBLEM_COMMAND_REJECT;
-			goto out;
-		}
-		if ((sense[2] == 0xaf) && (sense[3] == 0xfe)) {
-			QETH_DBF_CARD1(0, trace, "AFFE", card);
-			problem = PROBLEM_AFFE;
-			goto out;
-		}
-		if ((!sense[0]) && (!sense[1]) && (!sense[2]) && (!sense[3])) {
-			QETH_DBF_CARD1(0, trace, "ZSNS", card);
-			problem = PROBLEM_ZERO_SENSE_DATA;
-			goto out;
-		}
-		QETH_DBF_CARD1(0, trace, "GCHK", card);
-		problem = PROBLEM_GENERAL_CHECK;
-		goto out;
-	}
-	if (cstat & (SCHN_STAT_CHN_CTRL_CHK | SCHN_STAT_INTF_CTRL_CHK |
-		     SCHN_STAT_CHN_DATA_CHK | SCHN_STAT_CHAIN_CHECK |
-		     SCHN_STAT_PROT_CHECK | SCHN_STAT_PROG_CHECK)) {
-		QETH_DBF_TEXT1(0, trace, "GCHK");
-		QETH_DBF_TEXT1(0, trace, cdev->dev.bus_id);
-		QETH_DBF_HEX1(0, misc, irb, __max(QETH_DBF_MISC_LEN, 64));
-		PRINT_WARN("check on device %s, dstat=x%x, cstat=x%x, "
-			   "rqparam=x%x\n",
-			   cdev->dev.bus_id, dstat, cstat, rqparam);
-		HEXDUMP16(WARN, "irb: ", irb);
-		HEXDUMP16(WARN, "irb: ", ((char *) irb) + 32);
-		problem = PROBLEM_GENERAL_CHECK;
-		goto out;
-	}
-	if (qeth_check_idx_response(buffer)) {
-		PRINT_WARN("received an IDX TERMINATE on device %s "
-			   "with cause code 0x%02x%s\n",
-			   CARD_BUS_ID(card), buffer[4],
-			   (buffer[4] ==
-			    0x22) ? " -- try another portname" : "");
-		QETH_DBF_CARD1(0, trace, "RTRM", card);
-		problem = PROBLEM_RECEIVED_IDX_TERMINATE;
-		goto out;
-	}
-	if (IS_IPA(buffer) && !IS_IPA_REPLY(buffer)) {
-		if (*(PDU_ENCAPSULATION(buffer)) == IPA_CMD_STOPLAN) {
-			atomic_set(&card->is_startlaned, 0);
-			/* we don't do a  netif_stop_queue(card->dev);
-			   we better discard all packets --
-			   the outage could take longer */
-			PRINT_WARN("Link failure on %s (CHPID 0x%X) -- "
-				   "there is a network problem or someone "
-				   "pulled the cable or disabled the port."
-				   "Discarding outgoing packets.\n",
-				   card->dev_name, card->chpid);
-			QETH_DBF_CARD1(0, trace, "CBOT", card);
-			qeth_set_dev_flag_norunning(card);
-			problem = 0;
-			goto out;
-		}
-		if (*(PDU_ENCAPSULATION(buffer)) == IPA_CMD_STARTLAN) {
-			if (!atomic_read(&card->is_startlaned)) {
-				atomic_set(&card->is_startlaned, 1);
-				problem = PROBLEM_CARD_HAS_STARTLANED;
-			}
-			goto out;
-		}
-		if (*(PDU_ENCAPSULATION(buffer)) == IPA_CMD_REGISTER_LOCAL_ADDR)
-			QETH_DBF_CARD3(0, trace, "irla", card);
-		if (*(PDU_ENCAPSULATION(buffer)) == 
-		    IPA_CMD_UNREGISTER_LOCAL_ADDR)
-			QETH_DBF_CARD3(0, trace, "irla", card);
-		PRINT_WARN("probably a problem on %s: received data is IPA, "
-			   "but not a reply: command=0x%x\n", card->dev_name,
-			   *(PDU_ENCAPSULATION(buffer) + 1));
-		QETH_DBF_CARD1(0, trace, "INRP", card);
-		goto out;
-	}
-	/* no probs */
-out:
-	if (problem) {
-		QETH_DBF_CARD3(0, trace, "gcpr", card);
-		sprintf(dbf_text, "%2x%2x%4x", dstat, cstat, problem);
-		QETH_DBF_TEXT3(0, trace, dbf_text);
-		sprintf(dbf_text, "%8x", rqparam);
-		QETH_DBF_TEXT3(0, trace, dbf_text);
-		if (buffer)
-			QETH_DBF_HEX3(0, trace, &buffer, sizeof (void *));
-		QETH_DBF_HEX3(0, trace, &irb, sizeof (void *));
-		QETH_DBF_HEX3(0, trace, &sense, sizeof (void *));
-	}
-	atomic_set(&card->problem, problem);
-	return problem;
-}
-
-static void
-qeth_issue_next_read(struct qeth_card *card)
-{
-	int result, result2;
-	char dbf_text[15];
-
-	QETH_DBF_CARD5(0, trace, "isnr", card);
-
-	/* set up next read ccw */
-	memcpy(&card->dma_stuff->read_ccw, READ_CCW, sizeof (struct ccw1));
-	card->dma_stuff->read_ccw.count = QETH_BUFSIZE;
-	/* recbuf is not yet used by read channel program */
-	card->dma_stuff->read_ccw.cda = QETH_GET_ADDR(card->dma_stuff->recbuf);
-
-	/* 
-	 * we don't spin_lock_irqsave(get_ccwdev_lock(CARD_RDEV(card)),flags), as
-	 * we are only called in the interrupt handler
-	 */
-	result = ccw_device_start(CARD_RDEV(card), &card->dma_stuff->read_ccw,
-				  MPC_SETUP_STATE, 0, 0);
-	if (result) {
-		qeth_delay_millis(QETH_WAIT_BEFORE_2ND_DOIO);
-		result2 =
-		    ccw_device_start(CARD_RDEV(card), &card->dma_stuff->read_ccw,
-				     MPC_SETUP_STATE, 0, 0);
-		PRINT_WARN("read handler on device %s, read: ccw_device_start "
-			   "returned %i, next try returns %i\n",
-			   CARD_BUS_ID(card), result, result2);
-		QETH_DBF_CARD1(0, trace, "IsNR", card);
-		sprintf(dbf_text, "%04x%04x", (__s16) result, (__s16) result2);
-		QETH_DBF_TEXT1(0, trace, dbf_text);
-	}
-}
-
-static int
-qeth_is_to_recover(struct qeth_card *card, int problem)
-{
-	switch (problem) {
-	case PROBLEM_CARD_HAS_STARTLANED:
-		return 1;
-	case PROBLEM_RECEIVED_IDX_TERMINATE:
-		if (atomic_read(&card->in_recovery)) {
-			return 1;
-		} else {
-			qeth_set_dev_flag_norunning(card);
-			return 0;
-		}
-	case PROBLEM_ACTIVATE_CHECK_CONDITION:
-		return 1;
-	case PROBLEM_RESETTING_EVENT_INDICATOR:
-		return 1;
-	case PROBLEM_COMMAND_REJECT:
-		return 0;
-	case PROBLEM_ZERO_SENSE_DATA:
-		return 0;
-	case PROBLEM_GENERAL_CHECK:
-		return 1;
-	case PROBLEM_BAD_SIGA_RESULT:
-		return 1;
-	case PROBLEM_USER_TRIGGERED_RECOVERY:
-		return 1;
-	case PROBLEM_AFFE:
-		return 1;
-	case PROBLEM_MACHINE_CHECK:
-		return 1;
-	case PROBLEM_TX_TIMEOUT:
-		return 1;
-	}
-	return 0;
-}
-
-static int
-qeth_get_spare_buf(void)
-{
-	int i = 0;
-	char dbf_text[15];
-
-	while (i < sparebuffer_count) {
-		if (!atomic_compare_and_swap(SPAREBUF_FREE, SPAREBUF_USED,
-					     &sparebufs[i].status)) {
-			sprintf(dbf_text, "gtspb%3x", i);
-			QETH_DBF_TEXT4(0, trace, dbf_text);
-			return i;
-		}
-		i++;
-	}
-	QETH_DBF_TEXT3(0, trace, "nospbuf");
-
-	return -1;
-}
-
-static void
-qeth_put_spare_buf(int no)
-{
-	char dbf_text[15];
-
-	sprintf(dbf_text, "ptspb%3x", no);
-	QETH_DBF_TEXT4(0, trace, dbf_text);
-	atomic_set(&sparebufs[no].status, SPAREBUF_FREE);
-}
-
-static inline void
-qeth_put_buffer_pool_entry(struct qeth_card *card, int entry_no)
-{
-	if (entry_no & SPAREBUF_MASK)
-		qeth_put_spare_buf(entry_no & (~SPAREBUF_MASK));
-	else
-		card->inbound_buffer_pool_entry_used[entry_no] = BUFFER_UNUSED;
-}
-
-static inline int
-qeth_get_empty_buffer_pool_entry(struct qeth_card *card)
-{
-	int i;
-	int max_buffers = card->options.inbound_buffer_count;
-
-	for (i = 0; i < max_buffers; i++) {
-		if (xchg((int *) &card->inbound_buffer_pool_entry_used[i],
-			 BUFFER_USED) == BUFFER_UNUSED)
-			return i;
-	}
-	return -1;
-}
-
-static inline void
-qeth_clear_input_buffer(struct qeth_card *card, int bufno)
-{
-	struct qdio_buffer *buffer;
-	int i;
-	int elements, el_m_1;
-	char dbf_text[15];
-
-	QETH_DBF_CARD6(0, trace, "clib", card);
-	sprintf(dbf_text, "bufno%3x", bufno);
-	QETH_DBF_TEXT6(0, trace, dbf_text);
-
-	buffer = &card->inbound_qdio_buffers[bufno];
-	elements = BUFFER_MAX_ELEMENTS;
-	el_m_1 = elements - 1;
-
-	for (i = 0; i < elements; i++) {
-		if (i == el_m_1)
-			buffer->element[i].flags = SBAL_FLAGS_LAST_ENTRY;
-		else
-			buffer->element[i].flags = 0;
-
-		buffer->element[i].length = PAGE_SIZE;
-		buffer->element[i].addr = INBOUND_BUFFER_POS(card, bufno, i);
-	}
-}
-
-static void
-qeth_queue_input_buffer(struct qeth_card *card, int bufno,
-			unsigned int under_int)
-{
-	int count = 0, start = 0, stop = 0, pos;
-	int result;
-	int cnt1, cnt2 = 0;
-	int wrapped = 0;
-	int i;
-	int requeue_counter;
-	char dbf_text[15];
-	int no;
-
-	QETH_DBF_CARD5(0, trace, "qibf", card);
-	sprintf(dbf_text, "%4x%4x", under_int, bufno);
-	QETH_DBF_TEXT5(0, trace, dbf_text);
-	atomic_inc(&card->requeue_counter);
-	if (atomic_read(&card->requeue_counter) <= QETH_REQUEUE_THRESHOLD)
-		return;
-
-	if (!spin_trylock(&card->requeue_input_lock)) {
-		QETH_DBF_CARD5(0, trace, "qibl", card);
-		return;
-	}
-	requeue_counter = atomic_read(&card->requeue_counter);
-	pos = atomic_read(&card->requeue_position);
-	
-	start = pos;
-	/* 
-	 * omit the situation with 128 simultaneously
-	 * enqueued buffers, as then we can't benefit from PCI
-	 * avoidance anymore -- therefore we let count not grow as
-	 * big as requeue_counter
-	 */
-	while ((!atomic_read(&card->inbound_buffer_refcnt[pos])) &&
-	       (count < requeue_counter - 1)) {
-		no = qeth_get_empty_buffer_pool_entry(card);
-		if (no == -1) {
-			if (count)
-				break;
-			no = qeth_get_spare_buf();
-			if (no == -1) {
-				PRINT_ERR("%s: no more input buffers "
-					  "available! Inbound traffic could "
-					  "be lost! Try increasing the bufcnt "
-					  "parameter\n",
-					  card->dev_name);
-				QETH_DBF_CARD2(1, trace, "QINB", card);
-				goto out;
-			}
-			card->inbound_buffer_entry_no[pos] =
-				no | SPAREBUF_MASK;
-		}
-		card->inbound_buffer_entry_no[pos] = no;
-		atomic_set(&card->inbound_buffer_refcnt[pos], 1);
-		count++;
-		if (pos >= QDIO_MAX_BUFFERS_PER_Q - 1) {
-			pos = 0;
-			wrapped = 1;
-		} else
-			pos++;
-	}
-	/* stop points to the position after the last element */
-	stop = pos;
-
-	QETH_DBF_CARD3(0, trace, "qibi", card);
-	sprintf(dbf_text, "%4x", requeue_counter);
-	QETH_DBF_TEXT3(0, trace, dbf_text);
-	sprintf(dbf_text, "%4x%4x", start, stop);
-	QETH_DBF_TEXT3(0, trace, dbf_text);
-	
-	if (wrapped) {
-		cnt1 = QDIO_MAX_BUFFERS_PER_Q - start;
-		cnt2 = stop;
-	} else {
-		cnt1 = count;
-		/* cnt2 is already set to 0 */
-	}
-	
-	atomic_sub(count, &card->requeue_counter);
-	/* 
-	 * this is the only place where card->requeue_position is
-	 * written to, so that's ok (as it is in a lock)
-	 */
-	atomic_set(&card->requeue_position,
-		   (atomic_read(&card->requeue_position) + count)
-		   & (QDIO_MAX_BUFFERS_PER_Q - 1));
-	
-	if (cnt1) {
-		for (i = start; i < start + cnt1; i++) {
-			qeth_clear_input_buffer(card, i);
-		}
-		result = do_QDIO(CARD_DDEV(card),
-				 QDIO_FLAG_SYNC_INPUT | under_int,
-				 0, start, cnt1, NULL);
-		if (result) {
-			PRINT_WARN("qeth_queue_input_buffer's "
-				   "do_QDIO returnd %i (device %s)\n",
-				   result, CARD_DDEV_ID(card));
-			QETH_DBF_CARD1(0, trace, "QIDQ", card);
-			sprintf(dbf_text, "%4x%4x", result, requeue_counter);
-			QETH_DBF_TEXT1(0, trace, dbf_text);
-			sprintf(dbf_text, "%4x%4x", start, cnt1);
-			QETH_DBF_TEXT1(1, trace, dbf_text);
-		}
-	}
-	if (cnt2) {
-		for (i = 0; i < cnt2; i++) {
-			qeth_clear_input_buffer(card, i);
-		}
-		result = do_QDIO(CARD_DDEV(card),
-				 QDIO_FLAG_SYNC_INPUT | under_int, 0,
-				 0, cnt2, NULL);
-		if (result) {
-			PRINT_WARN("qeth_queue_input_buffer's "
-				   "do_QDIO returnd %i (device %s)\n",
-				   result, CARD_DDEV_ID(card));
-			QETH_DBF_CARD1(0, trace, "QIDQ", card);
-			sprintf(dbf_text, "%4x%4x", result, requeue_counter);
-			QETH_DBF_TEXT1(0, trace, dbf_text);
-			sprintf(dbf_text, "%4x%4x", 0, cnt2);
-			QETH_DBF_TEXT1(1, trace, dbf_text);
-		}
-	}
-out:
-	spin_unlock(&card->requeue_input_lock);
-
-}
-
-static inline struct sk_buff *
-qeth_get_skb(unsigned int len)
-{
-	struct sk_buff *skb;
-
-#ifdef QETH_VLAN
-	skb = dev_alloc_skb(len + VLAN_HLEN);
-	if (skb)
-		skb_reserve(skb, VLAN_HLEN);
-#else /* QETH_VLAN */
-	skb = dev_alloc_skb(len);
-#endif /* QETH_VLAN */
-	return skb;
-}
-
-static inline struct sk_buff *
-qeth_get_next_skb(struct qeth_card *card,
-		  int *element_ptr, int *pos_in_el_ptr,
-		  void **hdr_ptr, struct qdio_buffer *buffer)
-{
-	int length;
-	char *data_ptr;
-	int step, len_togo, element, pos_in_el;
-	int curr_len;
-	int max_elements;
-	struct sk_buff *skb;
-	char dbf_text[15];
-
-	max_elements = BUFFER_MAX_ELEMENTS;
-
-#define SBALE_LEN(x) ((x>=max_elements)?0:(buffer->element[x].length))
-#define SBALE_ADDR(x) (buffer->element[x].addr)
-
-	element = *element_ptr;
-
-	if (element >= max_elements) {
-		PRINT_WARN("device %s: error in interpreting buffer (data "
-			   "too long), %i elements.\n",
-			   CARD_BUS_ID(card), element);
-		QETH_DBF_CARD0(0, trace, "IEDL", card);
-		sprintf(dbf_text, "%4x%4x", *element_ptr, *pos_in_el_ptr);
-		QETH_DBF_TEXT0(1, trace, dbf_text);
-		QETH_DBF_HEX0(0, misc, buffer, QETH_DBF_MISC_LEN);
-		QETH_DBF_HEX0(0, misc, buffer + QETH_DBF_MISC_LEN,
-			      QETH_DBF_MISC_LEN);
-		return NULL;
-	}
-
-	pos_in_el = *pos_in_el_ptr;
-
-	curr_len = SBALE_LEN(element);
-	if (curr_len > PAGE_SIZE) {
-		PRINT_WARN("device %s: bad element length in element %i: "
-			   "0x%x\n", CARD_BUS_ID(card), element, curr_len);
-		QETH_DBF_CARD0(0, trace, "BELN", card);
-		sprintf(dbf_text, "%4x", curr_len);
-		QETH_DBF_TEXT0(0, trace, dbf_text);
-		sprintf(dbf_text, "%4x%4x", *element_ptr, *pos_in_el_ptr);
-		QETH_DBF_TEXT0(1, trace, dbf_text);
-		QETH_DBF_HEX0(0, misc, buffer, QETH_DBF_MISC_LEN);
-		QETH_DBF_HEX0(0, misc, buffer + QETH_DBF_MISC_LEN,
-			      QETH_DBF_MISC_LEN);
-		return NULL;
-	}
-	/* header fits in current element? */
-	if (curr_len < pos_in_el + QETH_HEADER_SIZE) {
-		if (!pos_in_el) {
-			QETH_DBF_CARD6(0, trace, "gnmh", card);
-			return NULL;	/* no more data in buffer */
-		}
-		/* set hdr to next element */
-		element++;
-		pos_in_el = 0;
-		curr_len = SBALE_LEN(element);
-		/* does it fit in there? */
-		if (curr_len < QETH_HEADER_SIZE) {
-			QETH_DBF_CARD6(0, trace, "gdnf", card);
-			return NULL;
-		}
-	}
-
-	*hdr_ptr = SBALE_ADDR(element) + pos_in_el;
-
-	length = *(__u16 *) ((char *) (*hdr_ptr) + QETH_HEADER_LEN_POS);
-
-	QETH_DBF_CARD6(0, trace, "gdHd", card);
-	QETH_DBF_HEX6(0, trace, hdr_ptr, sizeof (void *));
-
-	pos_in_el += QETH_HEADER_SIZE;
-	if (curr_len <= pos_in_el) {
-		/* switch to next element for data */
-		pos_in_el = 0;
-		element++;
-		curr_len = SBALE_LEN(element);
-		if (!curr_len) {
-			PRINT_WARN("device %s: inb. buffer with more headers "
-				   "than data areas (%i elements).\n",
-				   CARD_BUS_ID(card), element);
-			QETH_DBF_CARD0(0, trace, "IEMH", card);
-			sprintf(dbf_text, "%2x%2x%4x", element, *element_ptr,
-				*pos_in_el_ptr);
-			QETH_DBF_TEXT0(1, trace, dbf_text);
-			QETH_DBF_HEX0(0, misc, buffer, QETH_DBF_MISC_LEN);
-			QETH_DBF_HEX0(0, misc, buffer + QETH_DBF_MISC_LEN,
-				      QETH_DBF_MISC_LEN);
-			return NULL;
-		}
-	}
-
-	data_ptr = SBALE_ADDR(element) + pos_in_el;
-
-	if (card->options.fake_ll == FAKE_LL) {
-		skb = qeth_get_skb(length + QETH_FAKE_LL_LEN);
-		if (!skb)
-			goto nomem;
-		skb_pull(skb, QETH_FAKE_LL_LEN);
-	} else {
-		skb = qeth_get_skb(length);
-		if (!skb)
-			goto nomem;
-	}
-
-	QETH_DBF_HEX6(0, trace, &data_ptr, sizeof (void *));
-	QETH_DBF_HEX6(0, trace, &skb, sizeof (void *));
-
-	len_togo = length;
-	while (1) {
-		step = qeth_min(len_togo, curr_len - pos_in_el);
-		if (!step) {
-			PRINT_WARN("device %s: unexpected end of buffer, "
-				   "length of element %i is 0. Discarding "
-				   "packet.\n",
-				   CARD_BUS_ID(card), element);
-			QETH_DBF_CARD0(0, trace, "IEUE", card);
-			sprintf(dbf_text, "%2x%2x%4x", element, *element_ptr,
-				*pos_in_el_ptr);
-			QETH_DBF_TEXT0(0, trace, dbf_text);
-			sprintf(dbf_text, "%4x%4x", len_togo, step);
-			QETH_DBF_TEXT0(0, trace, dbf_text);
-			sprintf(dbf_text, "%4x%4x", curr_len, pos_in_el);
-			QETH_DBF_TEXT0(1, trace, dbf_text);
-			QETH_DBF_HEX0(0, misc, buffer, QETH_DBF_MISC_LEN);
-			QETH_DBF_HEX0(0, misc, buffer + QETH_DBF_MISC_LEN,
-				      QETH_DBF_MISC_LEN);
-			dev_kfree_skb_irq(skb);
-			return NULL;
-		}
-		memcpy(skb_put(skb, step), data_ptr, step);
-		len_togo -= step;
-		if (len_togo) {
-			pos_in_el = 0;
-			element++;
-			curr_len = SBALE_LEN(element);
-			data_ptr = SBALE_ADDR(element);
-		} else {
-#ifdef QETH_INBOUND_PACKING_1_PACKET_PER_SBALE
-			element++;
-			/* we don't need to calculate curr_len */
-			pos_in_el = 0;
-#else /* QETH_INBOUND_PACKING_1_PACKET_PER_SBALE */
-			pos_in_el += step;
-#endif /* QETH_INBOUND_PACKING_1_PACKET_PER_SBALE */
-			break;
-		}
-	}
-
-	sprintf(dbf_text, "%4x%4x", element, pos_in_el);
-	QETH_DBF_TEXT6(0, trace, dbf_text);
-
-	*element_ptr = element;
-	*pos_in_el_ptr = pos_in_el;
-
-	return skb;
-
-nomem:
-	if (net_ratelimit()) {
-		PRINT_WARN("no memory for packet from %s\n", card->dev_name);
-	}
-	QETH_DBF_CARD0(0, trace, "NOMM", card);
-	return NULL;
-}
-
-static inline void
-__qeth_rebuild_skb_fake_ll(struct qeth_card *card, struct sk_buff *skb,
-			   void *hdr_ptr)
-{
-	skb->mac.raw = skb->data - QETH_FAKE_LL_LEN;
-	switch (skb->pkt_type) {
-	case PACKET_MULTICAST:
-		switch (skb->protocol) {
-#ifdef QETH_IPV6
-		case __constant_htons(ETH_P_IPV6):
-			ndisc_mc_map((struct in6_addr *)
-				     skb->data + QETH_FAKE_LL_V6_ADDR_POS,
-				     skb->mac.raw + QETH_FAKE_LL_DEST_MAC_POS,
-				     card->dev, 0);
-				break;
-#endif /* QETH_IPV6 */
-		case __constant_htons(ETH_P_IP):
-			qeth_get_mac_for_ipm(*(__u32*)
-					     skb->data + QETH_FAKE_LL_V4_ADDR_POS,
-					     skb->mac.raw + QETH_FAKE_LL_DEST_MAC_POS,
-					     card->dev);
-			break;
-		default:
-			memcpy(skb->mac.raw + QETH_FAKE_LL_DEST_MAC_POS,
-			       card->dev->dev_addr, QETH_FAKE_LL_ADDR_LEN);
-		}
-		break;
-	case PACKET_BROADCAST:
-		memset(skb->mac.raw + QETH_FAKE_LL_DEST_MAC_POS,
-		       0xff, QETH_FAKE_LL_ADDR_LEN);
-		break;
-	default:
-		memcpy(skb->mac.raw + QETH_FAKE_LL_DEST_MAC_POS,
-		       card->dev->dev_addr, QETH_FAKE_LL_ADDR_LEN);
-	}
-
-	if (*(__u8 *) (hdr_ptr + 11) & QETH_EXT_HEADER_SRC_MAC_ADDRESS) {
-		memcpy(skb->mac.raw + QETH_FAKE_LL_SRC_MAC_POS,
-		       hdr_ptr + QETH_FAKE_LL_SRC_MAC_POS_IN_QDIO_HDR,
-		       QETH_FAKE_LL_ADDR_LEN);
-	} else {
-		/* clear source MAC for security reasons */
-		memset(skb->mac.raw + QETH_FAKE_LL_SRC_MAC_POS,
-		       0, QETH_FAKE_LL_ADDR_LEN);
-	}
-	memcpy(skb->mac.raw + QETH_FAKE_LL_PROT_POS,
-	       &skb->protocol, QETH_FAKE_LL_PROT_LEN);
-
-}
-
-static inline void
-__qeth_rebuild_skb_vlan(struct qeth_card *card, struct sk_buff *skb,
-			void *hdr_ptr)
-{
-#ifdef QETH_VLAN
-	__u16 *vlan_tag;
-
-	if (*(__u8 *) (hdr_ptr + 11) & QETH_EXT_HEADER_VLAN_FRAME) {
-
-		vlan_tag = (__u16 *) skb_push(skb, VLAN_HLEN);
-		/*
-		  if (*(__u8*)(hdr_ptr+11) & 
-		  QETH_EXT_HEADER_INCLUDE_VLAN_TAG) {
-		  *vlan_tag = *(__u16*)(hdr_ptr+28);
-		  *(vlan_tag+1)= *(__u16*)(hdr_ptr+30);
-		  } else {
-		*/
-		*vlan_tag = *(__u16 *) (hdr_ptr + 12);
-		*(vlan_tag + 1) = skb->protocol;
-		/*
-		  }
-		*/
-		skb->protocol = __constant_htons(ETH_P_8021Q);
-	}
-#endif
-}
-
-static inline void
-__qeth_rebuild_skb(struct qeth_card *card, struct sk_buff *skb, void *hdr_ptr)
-{
-	char dbf_text[15];
-	int version;
-	unsigned short cast_type;
-	
-	version = ((*(__u16 *) (hdr_ptr)) & (QETH_HEADER_IPV6)) ? 6 : 4;
-	skb->protocol = htons((version == 4) ? ETH_P_IP : 
-			      (version == 6) ? ETH_P_IPV6 : ETH_P_ALL);
-	cast_type = (*(__u16 *) (hdr_ptr)) & (QETH_CAST_FLAGS);
-	switch (cast_type) {
-	case QETH_CAST_UNICAST:
-		skb->pkt_type = PACKET_HOST;
-		break;
-	case QETH_CAST_MULTICAST:
-		skb->pkt_type = PACKET_MULTICAST;
-		break;
-	case QETH_CAST_BROADCAST:
-		skb->pkt_type = PACKET_BROADCAST;
-		break;
-	case QETH_CAST_ANYCAST:
-	case QETH_CAST_NOCAST:
-		QETH_DBF_CARD2(0, trace, "ribf", card);
-		sprintf(dbf_text, "castan%2x", cast_type);
-		QETH_DBF_TEXT2(1, trace, dbf_text);
-		skb->pkt_type = PACKET_HOST;
-		break;
-	default:
-		PRINT_WARN("adapter is using an unknown casting value "
-			   "of 0x%x. Using unicasting instead.\n",
-			   cast_type);
-		skb->pkt_type = PACKET_HOST;
-		QETH_DBF_CARD2(0, trace, "ribf", card);
-		sprintf(dbf_text, "castun%2x", cast_type);
-		QETH_DBF_TEXT2(1, trace, dbf_text);
-	}
-
-	if (card->options.fake_ll == FAKE_LL)
-		__qeth_rebuild_skb_fake_ll(card, skb, hdr_ptr);
-	else
-		skb->mac.raw = skb->data;
-
-	skb->ip_summed = card->options.checksum_type;
-	if (card->options.checksum_type == HW_CHECKSUMMING) {
-		/* do we have a checksummed packet? */
-
-		/* 
-		 * we only check for TCP/UDP checksums when the pseudo
-		 * header was also checked successfully -- for the
-		 * rest of the packets, it's not clear, whether the
-		 * upper layer csum is alright. And they shouldn't
-		 * occur too often anyway in real life 
-		 */
-
-		if ((*(__u8*)(hdr_ptr+11) & (QETH_EXT_HEADER_CSUM_HDR_REQ |
-					     QETH_EXT_HEADER_CSUM_TRANSP_REQ)) ==
-		    (QETH_EXT_HEADER_CSUM_HDR_REQ |
-		     QETH_EXT_HEADER_CSUM_TRANSP_REQ)) {
-#if 0
-			/* csum does not need to be set inbound anyway */
-			
-			/* 
-			 * vlan is not an issue here, it's still in
-			 * the QDIO header, not pushed in the skb yet
-			 */
-			int ip_len = (skb->data[0] & 0x0f) << 2;
-
-			if (*(__u8 *) (hdr_ptr + 11) &
-			    QETH_EXT_HEADER_CSUM_TRANSP_FRAME_TYPE) {
-				/* get the UDP checksum */
-				skb->csum = *(__u16 *)
-					(&skb->data[ip_len + 
-						    QETH_UDP_CSUM_OFFSET]);
-			} else {
-				/* get the TCP checksum */
-				skb->csum = *(__u16 *)
-					(&skb->data[ip_len +
-						    QETH_TCP_CSUM_OFFSET]);
-			}
-#endif /* 0 */
-			skb->ip_summed=CHECKSUM_UNNECESSARY;
-		} else {
-			/* make the stack check it */
-			skb->ip_summed = SW_CHECKSUMMING;
-		}
-	} else
-		skb->ip_summed=card->options.checksum_type;
-
-	__qeth_rebuild_skb_vlan(card, skb, hdr_ptr);
-}
-
-static void
-qeth_read_in_buffer(struct qeth_card *card, int buffer_no)
-{
-	struct sk_buff *skb;
-	void *hdr_ptr;
-	int element = 0, pos_in_el = 0;
-	struct qdio_buffer *buffer;
-	int i;
-	int max_elements;
-	char dbf_text[15];
-	struct net_device *dev;
-
-	dev = card->dev;
-	max_elements = BUFFER_MAX_ELEMENTS;
-
-	buffer = &card->inbound_qdio_buffers[buffer_no];
-
-	/* inform about errors */
-	if (buffer->element[15].flags & 0xff) {
-		PRINT_WARN("on device %s: incoming SBALF 15 on buffer "
-			   "0x%x are 0x%x\n",
-			   CARD_BUS_ID(card), buffer_no,
-			   buffer->element[15].flags & 0xff);
-		sprintf(dbf_text, "SF%s%2x%2x",
-			CARD_BUS_ID(card), buffer_no,
-			buffer->element[15].flags & 0xff);
-		QETH_DBF_HEX1(1, trace, dbf_text, QETH_DBF_TRACE_LEN);
-	}
-
-	for (i = 0; i < max_elements - 1; i++) {
-		if (buffer->element[i].flags & SBAL_FLAGS_LAST_ENTRY) {
-			buffer->element[i + 1].length = 0;
-			break;
-		}
-	}
-#ifdef QETH_PERFORMANCE_STATS
-	card->perf_stats.bufs_rec++;
-#endif /* QETH_PERFORMANCE_STATS */
-
-	sprintf(dbf_text, "ribX%s", CARD_BUS_ID(card));
-	dbf_text[3] = buffer_no;
-	QETH_DBF_HEX6(0, trace, dbf_text, QETH_DBF_TRACE_LEN);
-
-	while ((skb = qeth_get_next_skb(card, &element, &pos_in_el,
-					&hdr_ptr, buffer))) {
-
-#ifdef QETH_PERFORMANCE_STATS
-		card->perf_stats.skbs_rec++;
-#endif /* QETH_PERFORMANCE_STATS */
-
-		if (skb) {
-			skb->dev = dev;
-
-#ifdef QETH_IPV6
-			if ((*(__u16 *) (hdr_ptr)) & (QETH_HEADER_PASSTHRU))
-				skb->protocol = card->type_trans(skb, dev);
-			else
-#endif /* QETH_IPV6 */
-				__qeth_rebuild_skb(card, skb, hdr_ptr);
-
-#ifdef QETH_PERFORMANCE_STATS
-			card->perf_stats.inbound_time +=
-			    NOW - card->perf_stats.inbound_start_time;
-			card->perf_stats.inbound_cnt++;
-#endif /* QETH_PERFORMANCE_STATS */
-
-			QETH_DBF_CARD6(0, trace, "rxpk", card);
-
-			netif_rx(skb);
-			dev->last_rx = jiffies;
-			card->stats->rx_packets++;
-			card->stats->rx_bytes += skb->len;
-		} else {
-			PRINT_WARN("%s: dropped packet, no buffers "
-				   "available.\n", card->dev_name);
-			QETH_DBF_CARD2(1, trace, "DROP", card);
-			card->stats->rx_dropped++;
-		}
-	}
-	atomic_set(&card->inbound_buffer_refcnt[buffer_no], 0);
-	qeth_put_buffer_pool_entry(card,
-				   card->inbound_buffer_entry_no[buffer_no]);
-}
-
-static inline void
-__qeth_fill_header_add_vlan(struct qeth_hdr *hdr, struct sk_buff *skb,
-			    int version)
-{
-#ifdef QETH_VLAN
-	struct qeth_card *card;
-
-	/* 
-	 * before we're going to overwrite this location with next hop ip.
-	 * v6 uses passthrough, v4 sets the tag in the QDIO header.
-	 */
-	card = (struct qeth_card *) skb->dev->priv;
-	if ((card->vlangrp != NULL) && vlan_tx_tag_present(skb)) {
-		hdr->ext_flags = (version == 4) ? QETH_EXT_HEADER_VLAN_FRAME :
-			QETH_EXT_HEADER_INCLUDE_VLAN_TAG;
-		hdr->vlan_id = vlan_tx_tag_get(skb);
-	}
-#endif
-}
-
-static inline __u8
-__qeth_get_flags_v4(int multicast)
-{
-	if (multicast == RTN_MULTICAST)
-		return QETH_CAST_MULTICAST;
-	if (multicast == RTN_BROADCAST)
-		return QETH_CAST_BROADCAST;
-	return QETH_CAST_UNICAST;
-}
-
-static inline __u8
-__qeth_get_flags_v6(int multicast)
-{
-	if (multicast == RTN_MULTICAST)
-		return QETH_CAST_MULTICAST |
-			QETH_HEADER_PASSTHRU | QETH_HEADER_IPV6;
-	if (multicast == RTN_ANYCAST)
-		return QETH_CAST_ANYCAST |
-			QETH_HEADER_PASSTHRU | QETH_HEADER_IPV6;
-	if (multicast == RTN_BROADCAST)
-		return QETH_CAST_BROADCAST |
-			QETH_HEADER_PASSTHRU | QETH_HEADER_IPV6;
-	return QETH_CAST_UNICAST |
-#ifdef QETH_IPV6
-		QETH_HEADER_PASSTHRU |
-#endif /* QETH_IPV6 */
-		QETH_HEADER_IPV6;
-}
-
-static inline void
-qeth_fill_header(struct qeth_hdr *hdr, struct sk_buff *skb,
-		 int version, int multicast)
-{
-	char dbf_text[15];
-
-	hdr->id = 1;
-	hdr->ext_flags = 0;
-
-	__qeth_fill_header_add_vlan(hdr, skb, version);
-
-	hdr->length = skb->len - QETH_HEADER_SIZE;	/* as skb->len includes
-							   the header now */
-
-	/* yes, I know this is doubled code, but a small little bit
-	   faster maybe */
-	if (version == 4) {	/* IPv4 */
-		hdr->flags = __qeth_get_flags_v4(multicast);
-		*((__u32 *) (&hdr->dest_addr[0])) = 0;
-		*((__u32 *) (&hdr->dest_addr[4])) = 0;
-		*((__u32 *) (&hdr->dest_addr[8])) = 0;
-		if ((skb->dst) && (skb->dst->neighbour)) {
-			*((__u32 *) (&hdr->dest_addr[12])) =
-			    *((__u32 *) skb->dst->neighbour->primary_key);
-		} else {
-			/* fill in destination address used in ip header */
-			*((__u32 *) (&hdr->dest_addr[12])) = skb->nh.iph->daddr;
-		}
-	} else if (version == 6) {	/* IPv6 or passthru */
-		hdr->flags = __qeth_get_flags_v6(multicast);
-		if ((skb->dst) && (skb->dst->neighbour)) {
-			memcpy(hdr->dest_addr,
-			       skb->dst->neighbour->primary_key, 16);
-		} else {
-			/* fill in destination address used in ip header */
-			memcpy(hdr->dest_addr, &skb->nh.ipv6h->daddr, 16);
-		}
-	} else {		/* passthrough */
-		if (!memcmp(skb->data + QETH_HEADER_SIZE,
-			    skb->dev->broadcast, 6)) {   /* broadcast? */
-			hdr->flags = QETH_CAST_BROADCAST | QETH_HEADER_PASSTHRU;
-		} else {
- 			hdr->flags = (multicast == RTN_MULTICAST) ?
- 				QETH_CAST_MULTICAST | QETH_HEADER_PASSTHRU :
- 				QETH_CAST_UNICAST | QETH_HEADER_PASSTHRU;
-		}
-	}
-	sprintf(dbf_text, "filhdr%2x", version);
-	QETH_DBF_TEXT6(0, trace, dbf_text);
-	sprintf(dbf_text, "%2x", multicast);
-	QETH_DBF_TEXT6(0, trace, dbf_text);
-	QETH_DBF_HEX6(0, trace, &skb, sizeof (void *));
-	QETH_DBF_HEX6(0, trace, &skb->data, sizeof (void *));
-	QETH_DBF_HEX6(0, misc, hdr, __max(QETH_HEADER_SIZE, QETH_DBF_MISC_LEN));
-	QETH_DBF_HEX6(0, data, skb->data,
-		      __max(QETH_DBF_DATA_LEN, QETH_DBF_DATA_LEN));
-}
-
-static inline int
-qeth_fill_buffer(struct qdio_buffer *buffer, char *dataptr,
-		 int length, int element)
-{
-	int length_here;
-	int first_lap = 1;
-	char dbf_text[15];
-	int first_element = element;
-
-	while (length > 0) {
-		/* length_here is the remaining amount of data in this page */
-		length_here =
-		    PAGE_SIZE - ((unsigned long) dataptr & (PAGE_SIZE - 1));
-		if (length < length_here)
-			length_here = length;
-
-		buffer->element[element].addr = dataptr;
-		buffer->element[element].length = length_here;
-		length -= length_here;
-		if (!length) {
-			if (first_lap) {
-				buffer->element[element].flags = 0;
-			} else {
-				buffer->element[element].flags =
-				    SBAL_FLAGS_LAST_FRAG;
-			}
-		} else {
-			if (first_lap) {
-				buffer->element[element].flags =
-				    SBAL_FLAGS_FIRST_FRAG;
-			} else {
-				buffer->element[element].flags =
-				    SBAL_FLAGS_MIDDLE_FRAG;
-			}
-		}
-		dataptr = dataptr + length_here;
-		element++;
-		if (element > QDIO_MAX_ELEMENTS_PER_BUFFER) {
-			PRINT_ERR("qeth_fill_buffer: IP packet too big!\n");
-			QETH_DBF_TEXT1(0, trace, "IPpktobg");
-			QETH_DBF_HEX1(1, trace, &dataptr, sizeof (void *));
-			buffer->element[first_element].length = 0;
-			break;
-		}
-		first_lap = 0;
-	}
-	sprintf(dbf_text, "filbuf%2x", element);
-	QETH_DBF_TEXT6(0, trace, dbf_text);
-	QETH_DBF_HEX3(0, misc, buffer, QETH_DBF_MISC_LEN);
-	QETH_DBF_HEX3(0, misc, buffer + QETH_DBF_MISC_LEN, QETH_DBF_MISC_LEN);
-
-	return element;
-}
-
-static inline void
-qeth_flush_packed_packets(struct qeth_card *card, int queue, int under_int)
-{
-	struct qdio_buffer *buffer;
-	int result;
-	int position;
-	int position_for_do_qdio;
-	char dbf_text[15];
-	int last_pci;
-
-	position = card->outbound_first_free_buffer[queue];
-	/* can happen, when in the time between deciding to pack and sending
-	   the next packet the lower mark was reached: */
-	if (!card->outbound_ringbuffer[queue]->ringbuf_element[position].
-	    next_element_to_fill)
-		return;
-
-	buffer = &card->outbound_ringbuffer[queue]->buffer[position];
-	buffer->element[card->outbound_ringbuffer[queue]->
-			ringbuf_element[position].
-			next_element_to_fill - 1].flags |=
-	    SBAL_FLAGS_LAST_ENTRY;
-
-	card->dev->trans_start = jiffies;
-
-#ifdef QETH_PERFORMANCE_STATS
-	if (card->outbound_buffer_send_state[queue][position] ==
-	    SEND_STATE_DONT_PACK) {
-		card->perf_stats.bufs_sent_dont_pack++;
-	} else if (card->outbound_buffer_send_state[queue][position] ==
-		   SEND_STATE_PACK) {
-		card->perf_stats.bufs_sent_pack++;
-	}
-	card->perf_stats.bufs_sent++;
-#endif /* QETH_PERFORMANCE_STATS */
-
-	position_for_do_qdio = position;
-
-	position = (position + 1) & (QDIO_MAX_BUFFERS_PER_Q - 1);
-	card->outbound_first_free_buffer[queue] = position;
-
-	card->outbound_bytes_in_buffer[queue] = 0;
-	/* we can override that, as we have at most 127 buffers enqueued */
-	card->outbound_ringbuffer[queue]->ringbuf_element[position].
-	    next_element_to_fill = 0;
-
-	atomic_inc(&card->outbound_used_buffers[queue]);
-
-	QETH_DBF_CARD5(0, trace, "flsp", card);
-	sprintf(dbf_text, "%4x%2x%2x", position_for_do_qdio, under_int, queue);
-	QETH_DBF_TEXT5(0, trace, dbf_text);
-	QETH_DBF_HEX5(0, misc, buffer, QETH_DBF_MISC_LEN);
-	QETH_DBF_HEX5(0, misc, buffer + QETH_DBF_MISC_LEN, QETH_DBF_MISC_LEN);
-
-	/* 
-	 * we always set the outbound pci flag, don't care, whether the
-	 * adapter honors it or not
-	 */
-	switch (card->send_state[queue]) {
-	case SEND_STATE_DONT_PACK:
-		if (atomic_read(&card->outbound_used_buffers[queue])
-		    < HIGH_WATERMARK_PACK - WATERMARK_FUZZ)
-			break;
-		/* set the PCI bit */
-		card->outbound_ringbuffer[queue]->
-		    buffer[position_for_do_qdio].element[0].flags |= 0x40;
-		atomic_set(&card->last_pci_pos[queue], position_for_do_qdio);
-		break;
-	case SEND_STATE_PACK:
-		last_pci = atomic_read(&card->last_pci_pos[queue]);
-		if (position_for_do_qdio < last_pci)
-			last_pci -= QDIO_MAX_BUFFERS_PER_Q;
-		/* so:
-		 * last_pci is the position of the last pci we've set
-		 * position_for_do_qdio is the position we will send out now
-		 * outbound_used_buffers is the number of buffers used (means
-		 *   all buffers hydra has, inclusive position_for_do_qdio)
-		 *
-		 * we have to request a pci, if we have got the buffer of the
-		 * last_pci position back.
-		 *
-		 * position_for_do_qdio-outbound_used_buffers is the newest
-		 *   buffer that we got back from hydra
-		 *
-		 * if this is greater or equal than the last_pci position,
-		 * we should request a pci, as no pci request is
-		 * outstanding anymore
-		 */
-		if (position_for_do_qdio -
-		    atomic_read(&card->outbound_used_buffers[queue]) >=
-		    last_pci) {
-			/* set the PCI bit */
-			card->outbound_ringbuffer[queue]->
-			    buffer[position_for_do_qdio].
-			    element[0].flags |= 0x40;
-			atomic_set(&card->last_pci_pos[queue],
-				   position_for_do_qdio);
-		}
-	}
-
-	/* 
-	 * this has to be at the end, otherwise a buffer could be flushed
-	 * twice (see comment in qeth_do_send_packet)
-	 */
-	result = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_OUTPUT | under_int, queue,
-			 position_for_do_qdio, 1, NULL);
-
-	if (result) {
-		PRINT_WARN("Outbound do_QDIO returned %i "
-			   "(device %s)\n", result, CARD_DDEV_ID(card));
-		QETH_DBF_CARD5(0, trace, "FLSP", card);
-		sprintf(dbf_text, "odoQ%4x", result);
-		QETH_DBF_TEXT5(0, trace, dbf_text);
-		sprintf(dbf_text, "%4x%2x%2x", position_for_do_qdio,
-			under_int, queue);
-		QETH_DBF_TEXT5(0, trace, dbf_text);
-		QETH_DBF_HEX5(0, misc, buffer, QETH_DBF_MISC_LEN);
-		QETH_DBF_HEX5(0, misc, buffer + QETH_DBF_MISC_LEN,
-			      QETH_DBF_MISC_LEN);
-	}
-}
-
-#define ERROR_NONE 0
-#define ERROR_RETRY 1
-#define ERROR_LINK_FAILURE 2
-#define ERROR_KICK_THAT_PUPPY 3
-static inline int
-qeth_determine_send_error(int cc, int qdio_error, int sbalf15)
-{
-	char dbf_text[15];
-
-	switch (cc & 3) {
-	case 0:
-		if (qdio_error)
-			return ERROR_LINK_FAILURE;
-		return ERROR_NONE;
-	case 2:
-		if (cc & QDIO_SIGA_ERROR_B_BIT_SET) {
-			QETH_DBF_TEXT3(0, trace, "sigacc2b");
-			return ERROR_KICK_THAT_PUPPY;
-		}
-		if (qeth_sbalf15_in_retrieable_range(sbalf15))
-			return ERROR_RETRY;
-		return ERROR_LINK_FAILURE;
-		/* look at qdio_error and sbalf 15 */
-	case 1:
-		PRINT_WARN("siga returned cc 1! cc=0x%x, "
-			   "qdio_error=0x%x, sbalf15=0x%x\n",
-			   cc, qdio_error, sbalf15);
-
-		QETH_DBF_TEXT3(0, trace, "siga-cc1");
-		QETH_DBF_TEXT2(0, qerr, "siga-cc1");
-		sprintf(dbf_text, "%1x%2x%2x", cc, qdio_error, sbalf15);
-		QETH_DBF_TEXT3(0, trace, dbf_text);
-		QETH_DBF_TEXT2(0, qerr, dbf_text);
-		return ERROR_LINK_FAILURE;
-	case 3:
-		QETH_DBF_TEXT3(0, trace, "siga-cc3");
-		return ERROR_KICK_THAT_PUPPY;
-	}
-	return ERROR_LINK_FAILURE;	/* should never happen */
-}
-
-static inline void
-qeth_free_buffer(struct qeth_card *card, int queue, int bufno,
-		 int qdio_error, int siga_error)
-{
-	struct sk_buff *skb;
-	int error;
-	int retries;
-	int sbalf15;
-	char dbf_text[15];
-	struct qdio_buffer *buffer;
-
-	switch (card->outbound_buffer_send_state[queue][bufno]) {
-	case SEND_STATE_DONT_PACK:	/* fallthrough */
-	case SEND_STATE_PACK:
-		QETH_DBF_CARD5(0, trace, "frbf", card);
-		sprintf(dbf_text, "%2x%2x%4x", queue, bufno,
-			card->outbound_buffer_send_state[queue][bufno]);
-		QETH_DBF_TEXT5(0, trace, dbf_text);
-
-		buffer = &card->outbound_ringbuffer[queue]->buffer[bufno];
-		sbalf15 = buffer->element[15].flags & 0xff;
-		error =
-		    qeth_determine_send_error(siga_error, qdio_error, sbalf15);
-		if (error == ERROR_KICK_THAT_PUPPY) {
-			sprintf(dbf_text, "KP%s%2x",
-				CARD_BUS_ID(card), queue);
-			QETH_DBF_TEXT2(0, trace, dbf_text);
-			QETH_DBF_TEXT2(0, qerr, dbf_text);
-			QETH_DBF_TEXT2(1, setup, dbf_text);
-			sprintf(dbf_text, "%2x%2x%2x%2x", bufno,
-				siga_error, qdio_error, sbalf15);
-			QETH_DBF_TEXT2(1, trace, dbf_text);
-			QETH_DBF_TEXT2(1, qerr, dbf_text);
-			PRINT_ERR("Outbound queue x%x on device %s (%s); "
-				  "errs: siga: x%x, qdio: x%x, flags15: "
-				  "x%x. The device will be taken down.\n",
-				  queue, CARD_BUS_ID(card), card->dev_name,
-				  siga_error, qdio_error, sbalf15);
-			netif_stop_queue(card->dev);
-			qeth_set_dev_flag_norunning(card);
-			atomic_set(&card->problem, PROBLEM_BAD_SIGA_RESULT);
-			qeth_schedule_recovery(card);
-		} else if (error == ERROR_RETRY) {
-			/* analyze, how many retries we did so far */
-			retries = card->send_retries[queue][bufno];
-
-			sprintf(dbf_text, "Rt%s%2x",
-				CARD_BUS_ID(card), queue);
-			QETH_DBF_TEXT4(0, trace, dbf_text);
-			sprintf(dbf_text, "b%2x:%2x%2x", bufno,
-				sbalf15, retries);
-			QETH_DBF_TEXT4(0, trace, dbf_text);
-
-			if (++retries > SEND_RETRIES_ALLOWED) {
-				error = ERROR_LINK_FAILURE;
-				QETH_DBF_TEXT4(1, trace, "ndegelnd");
-			}
-			/* else error stays RETRY for the switch statemnet */
-		} else if (error == ERROR_LINK_FAILURE) {
-			/* we don't want to log failures resulting from
-			 * too many retries */
-			QETH_DBF_CARD3(1, trace, "Fail", card);
-			QETH_DBF_HEX3(0, misc, buffer, QETH_DBF_MISC_LEN);
-			QETH_DBF_HEX3(0, misc, buffer + QETH_DBF_MISC_LEN,
-				      QETH_DBF_MISC_LEN);
-		}
-
-		while ((skb = skb_dequeue(&card->outbound_ringbuffer[queue]->
-					  ringbuf_element[bufno].skb_list))) {
-			switch (error) {
-			case ERROR_NONE:
-				atomic_dec(&skb->users);
-				dev_kfree_skb_irq(skb);
-				break;
-			case ERROR_RETRY:
-				QETH_DBF_TEXT3(0, qerr, "RETRY!!!");
-				QETH_DBF_TEXT4(0, trace, "RETRY!!!");
-				atomic_dec(&skb->users);
-				/* retry packet async (quickly) ... */
-				atomic_dec(&skb->users);
-				dev_kfree_skb_irq(skb);
-				break;
-			case ERROR_LINK_FAILURE:
-			case ERROR_KICK_THAT_PUPPY:
-				QETH_DBF_TEXT4(0, trace, "endeglnd");
-				atomic_dec(&skb->users);
-				dev_kfree_skb_irq(skb);
-				break;
-			}
-		}
-		break;
-	default:
-		PRINT_WARN("oops... wrong send_state on %s. "
-			   "shouldn't happen "
-			   "(line %i). q=%i, bufno=x%x, state=%i\n",
-			   card->dev_name, __LINE__, queue, bufno,
-			   card->outbound_buffer_send_state[queue][bufno]);
-		QETH_DBF_CARD0(1, trace, "UPSf", card);
-		QETH_DBF_CARD0(1, qerr, "UPSf", card);
-		sprintf(dbf_text, "%2x%2x%4x", queue, bufno,
-			card->outbound_buffer_send_state[queue][bufno]);
-		QETH_DBF_TEXT0(1, trace, dbf_text);
-		QETH_DBF_TEXT0(1, qerr, dbf_text);
-	}
-	card->outbound_buffer_send_state[queue][bufno] = SEND_STATE_INACTIVE;
-	card->send_retries[queue][bufno] = 0;
-}
-
-static inline void
-qeth_free_all_skbs(struct qeth_card *card)
-{
-	int q, b;
-
-	for (q = 0; q < card->no_queues; q++)
-		for (b = 0; b < QDIO_MAX_BUFFERS_PER_Q; b++)
-			if (card->outbound_buffer_send_state[q][b] !=
-			    SEND_STATE_INACTIVE)
-				qeth_free_buffer(card, q, b, 0, 0);
-}
-
-static inline void
-qeth_flush_buffer(struct qeth_card *card, int queue, int under_int)
-{
-	char dbf_text[15];
-	QETH_DBF_CARD5(0, trace, "flsb", card);
-	sprintf(dbf_text, "%2x%2x%2x", queue, under_int,
-		card->outbound_buffer_send_state[queue]
-		[card->outbound_first_free_buffer[queue]]);
-	QETH_DBF_TEXT5(0, trace, dbf_text);
-
-	switch (card->outbound_buffer_send_state[queue]
-		[card->outbound_first_free_buffer[queue]]) {
-	case SEND_STATE_DONT_PACK:
-		break;
-	case SEND_STATE_PACK:
-		qeth_flush_packed_packets(card, queue, under_int);
-		break;
-	default:
-		break;
-	}
-}
-
-#ifdef QETH_VLAN
-static inline void
-qeth_insert_ipv6_vlan_tag(struct sk_buff *__skb)
-{
-
-	/* Move the mac addresses to the beginning of the new header.
-	 * We are using three memcpys instead of one memmove to save cycles.
-	 */
-#define TMP_CPYSIZE 4
-	__u16 *tag;
-	tag = (__u16 *) skb_push(__skb, VLAN_HLEN);
-	memcpy(__skb->data, __skb->data + TMP_CPYSIZE, TMP_CPYSIZE);
-	memcpy(__skb->data + TMP_CPYSIZE,
-	       __skb->data + (2 * TMP_CPYSIZE), TMP_CPYSIZE);
-	memcpy(__skb->data + (2 * TMP_CPYSIZE),
-	       __skb->data + (3 * TMP_CPYSIZE), TMP_CPYSIZE);
-	tag = (__u16 *) (__skb->data + (3 * TMP_CPYSIZE));
-
-	/*first two bytes  = ETH_P_8021Q (0x8100)
-	 *second two bytes = VLANID
-	 */
-
-	*tag = __constant_htons(ETH_P_8021Q);
-	*(tag + 1) = vlan_tx_tag_get(__skb);
-	*(tag + 1) = htons(*(tag + 1));
-#undef TMP_CPYSIZE
-}
-#endif
-
-static inline void
-__qeth_add_vlan_tag(struct qeth_card *card, struct sk_buff *skb, int version)
-{
-#ifdef QETH_VLAN
-	if ((card->vlangrp != NULL) &&
-	    vlan_tx_tag_present(skb) && (version == 6)) {
-		qeth_insert_ipv6_vlan_tag(skb);
-	}
-#endif
-}
-
-static inline void
-qeth_send_packet_fast(struct qeth_card *card, struct sk_buff *skb,
-		      struct net_device *dev,
-		      int queue, int version, int multicast)
-{
-	struct qeth_ringbuffer_element *mybuffer;
-	int position;
-	struct qeth_hdr *hdr;
-	char *dataptr;
-	char dbf_text[15];
-	struct sk_buff *nskb;
-
-	position = card->outbound_first_free_buffer[queue];
-
-	card->outbound_buffer_send_state[queue][position] =
-	    SEND_STATE_DONT_PACK;
-
-	mybuffer = &card->outbound_ringbuffer[queue]->ringbuf_element[position];
-	if (skb_headroom(skb) < QETH_HEADER_SIZE) {
-		if ((version) && (!card->realloc_message)) {
-			card->realloc_message = 1;
-			PRINT_WARN("%s: not enough headroom in skb. "
- 				   "Increasing the "
- 				   "add_hhlen parameter by %i may help.\n",
-				   card->dev_name,
-				   QETH_HEADER_SIZE - skb_headroom(skb));
-		}
-		PRINT_STUPID("%s: not enough headroom in skb (missing: %i)\n",
-			     card->dev_name,
-			     QETH_HEADER_SIZE - skb_headroom(skb));
-		QETH_DBF_CARD3(0, trace, "NHRf", card);
-		sprintf(dbf_text, "%2x%2x%2x%2x", skb_headroom(skb),
-			version, multicast, queue);
-		QETH_DBF_TEXT3(0, trace, dbf_text);
-		QETH_DBF_HEX3(0, trace, &skb->head, sizeof (void *));
-		QETH_DBF_HEX3(0, trace, &skb->data, sizeof (void *));
-		nskb = skb_realloc_headroom(skb, QETH_HEADER_SIZE);
-		if (!nskb) {
-			PRINT_WARN("%s: could not realloc headroom\n",
-				   card->dev_name);
-			QETH_DBF_CARD2(0, trace, "CNRf", card);
-			dev_kfree_skb_irq(skb);
-			return;
-		}
-		dev_kfree_skb_irq(skb);
-		skb = nskb;
-	}
-	__qeth_add_vlan_tag(card, skb, version);
-	hdr = (struct qeth_hdr *) (skb_push(skb, QETH_HEADER_SIZE));
-	/* 
-	 * sanity check, the Linux memory allocation scheme should
-	 * never present us cases like this one (the 32bytes header plus
-	 * the first 40 bytes of the paket cross a 4k boundary)
-	 */
-	dataptr = (char *) hdr;
-	if ((((unsigned long) dataptr) & (~(PAGE_SIZE - 1))) !=
-	    (((unsigned long) dataptr + QETH_HEADER_SIZE +
-	      QETH_IP_HEADER_SIZE) & (~(PAGE_SIZE - 1)))) {
-		PRINT_ERR("%s: packet misaligned -- the first %i bytes "
-			  "are not in the same page. Discarding packet!\n",
-			  card->dev_name,
-			  QETH_HEADER_SIZE + QETH_IP_HEADER_SIZE);
-		PRINT_ERR("head=%p, data=%p\n", skb->head, skb->data);
-		QETH_DBF_CARD1(0, trace, "PMAf", card);
-		sprintf(dbf_text, "%2x%2x%2x%2x", skb_headroom(skb),
-			version, multicast, queue);
-		QETH_DBF_TEXT1(0, trace, dbf_text);
-		QETH_DBF_HEX1(0, trace, &skb->head, sizeof (void *));
-		QETH_DBF_HEX1(1, trace, &skb->data, sizeof (void *));
-		dev_kfree_skb_irq(skb);
-		return;
-	}
-
-	atomic_inc(&skb->users);
-	skb_queue_tail(&mybuffer->skb_list, skb);
-	qeth_fill_header(hdr, skb, version, multicast);
-	/* we need to write to next_element_to_fill as
-	   qeth_flush_packed_packets checks it */
-	card->outbound_ringbuffer[queue]->ringbuf_element[position].
-	    next_element_to_fill =
-	    qeth_fill_buffer(&card->outbound_ringbuffer[queue]->
-			     buffer[position], (char *) hdr, skb->len, 0);
-
-#ifdef QETH_PERFORMANCE_STATS
-	card->perf_stats.skbs_sent_dont_pack++;
-#endif /* QETH_PERFORMANCE_STATS */
-
-	qeth_flush_packed_packets(card, queue, 0);
-}
-
-/* no checks, if all elements are used, as then we would not be here (at most
-   127 buffers are enqueued) */
-static inline void
-qeth_send_packet_packed(struct qeth_card *card, struct sk_buff *skb,
-			struct net_device *dev,
-			int queue, int version, int multicast)
-{
-	struct qeth_ringbuffer_element *mybuffer;
-	int elements_needed;
-	int element_to_fill;
-	int buffer_no;
-	int length;
-	char *dataptr;
-	struct qeth_hdr *hdr;
-	char dbf_text[15];
-	struct sk_buff *nskb;
-
-	/* sanity check, dev->hard_header_len should prevent this */
-	if (skb_headroom(skb) < QETH_HEADER_SIZE) {
-		if ((version) && (!card->realloc_message)) {
-			card->realloc_message = 1;
-			PRINT_WARN("%s: not enough headroom in skb. "
-				   "Try increasing the "
-				   "add_hhlen parameter by %i.\n",
-				   card->dev_name,
-				   QETH_HEADER_SIZE - skb_headroom(skb));
-		}
-		PRINT_STUPID("%s: not enough headroom in skb (missing: %i)\n",
-			     card->dev_name,
-			     QETH_HEADER_SIZE - skb_headroom(skb));
-		QETH_DBF_CARD3(0, trace, "NHRp", card);
-		sprintf(dbf_text, "%2x%2x%2x%2x", skb_headroom(skb),
-			version, multicast, queue);
-		QETH_DBF_TEXT3(0, trace, dbf_text);
-		QETH_DBF_HEX3(0, trace, &skb->head, sizeof (void *));
-		QETH_DBF_HEX3(0, trace, &skb->data, sizeof (void *));
-		nskb = skb_realloc_headroom(skb, QETH_HEADER_SIZE);
-		if (!nskb) {
-			PRINT_WARN("%s: could not realloc headroom\n",
-				   card->dev_name);
-			QETH_DBF_CARD2(0, trace, "CNRp", card);
-			dev_kfree_skb_irq(skb);
-			return;
-		}
-		dev_kfree_skb_irq(skb);
-		skb = nskb;
-	}
-	__qeth_add_vlan_tag(card, skb, version);
-	hdr = (struct qeth_hdr *) (skb_push(skb, QETH_HEADER_SIZE));
-
-	length = skb->len;
-
-	/* 
-	 * sanity check, the Linux memory allocation scheme should
-	 * never present us cases like this one (the 32bytes header plus
-	 * the first 40 bytes of the paket cross a 4k boundary)
-	 */
-	dataptr = (char *) hdr;
-	if ((((unsigned long) dataptr) & (~(PAGE_SIZE - 1))) !=
-	    (((unsigned long) dataptr + QETH_HEADER_SIZE +
-	      QETH_IP_HEADER_SIZE) & (~(PAGE_SIZE - 1)))) {
-		PRINT_ERR("%s: packet misaligned -- the first %i bytes "
-			  "are not in the same page. Discarding packet!\n",
-			  card->dev_name,
-			  QETH_HEADER_SIZE + QETH_IP_HEADER_SIZE);
-		QETH_DBF_CARD1(0, trace, "PMAp", card);
-		sprintf(dbf_text, "%2x%2x%2x%2x", skb_headroom(skb),
-			version, multicast, queue);
-		QETH_DBF_TEXT1(0, trace, dbf_text);
-		QETH_DBF_HEX1(0, trace, &skb->head, sizeof (void *));
-		QETH_DBF_HEX1(1, trace, &skb->data, sizeof (void *));
-		dev_kfree_skb_irq(skb);
-		return;
-	}
-
-	buffer_no = card->outbound_first_free_buffer[queue];
-
-	element_to_fill = card->outbound_ringbuffer[queue]->
-	    ringbuf_element[buffer_no].next_element_to_fill;
-
-	elements_needed = 1 + (((((unsigned long) dataptr) & (PAGE_SIZE - 1)) +
-				length) >> PAGE_SHIFT);
-	if ((elements_needed > (QDIO_MAX_ELEMENTS_PER_BUFFER - element_to_fill))
-	    ||
-	    ((elements_needed ==
-	      (QDIO_MAX_ELEMENTS_PER_BUFFER - element_to_fill))
-	     && ((element_to_fill >> PAGE_SHIFT) ==
-		 card->outbound_bytes_in_buffer[queue]))) {
-		qeth_flush_packed_packets(card, queue, 0);
-		element_to_fill = 0;
-		card->outbound_bytes_in_buffer[queue] = 0;
-		buffer_no = (buffer_no + 1) & (QDIO_MAX_BUFFERS_PER_Q - 1);
-	}
-
-	if (!element_to_fill)
-		card->outbound_buffer_send_state[queue][buffer_no]
-		    = SEND_STATE_PACK;
-
-#ifdef QETH_PERFORMANCE_STATS
-	card->perf_stats.skbs_sent_pack++;
-#endif /* QETH_PERFORMANCE_STATS */
-
-	mybuffer =
-	    &card->outbound_ringbuffer[queue]->ringbuf_element[buffer_no];
-	atomic_inc(&skb->users);
-	skb_queue_tail(&mybuffer->skb_list, skb);
-	qeth_fill_header(hdr, skb, version, multicast);
-	card->outbound_bytes_in_buffer[queue] += length + QETH_HEADER_SIZE;
-	card->outbound_ringbuffer[queue]->ringbuf_element[buffer_no].
-	    next_element_to_fill =
-	    qeth_fill_buffer(&card->outbound_ringbuffer[queue]->
-			     buffer[buffer_no],
-			     dataptr, length, element_to_fill);
-}
-
-static void
-qeth_alloc_spare_bufs(void)
-{
-	int i;
-	int dont_alloc_more = 0;
-	char dbf_text[15];
-
-	sparebuffer_count = 0;
-	for (i = 0; i < qeth_sparebufs; i++) {
-		if (!dont_alloc_more) {
-			sparebufs[i].buf = (char *)
-			    kmalloc(DEFAULT_BUFFER_SIZE, GFP_KERNEL);
-			if (sparebufs[i].buf)
-				sparebuffer_count++;
-			else
-				dont_alloc_more = 1;
-		}
-		atomic_set(&sparebufs[i].status, (dont_alloc_more) ?
-			   SPAREBUF_UNAVAIL : SPAREBUF_FREE);
-	}
-	sprintf(dbf_text, "alspb%3x", sparebuffer_count);
-	QETH_DBF_TEXT2(0, trace, dbf_text);
-
-	PRINT_INFO("allocated %i spare buffers\n", sparebuffer_count);
-}
-
-static void
-qeth_free_all_spare_bufs(void)
-{
-	int i;
-
-	QETH_DBF_TEXT2(0, trace, "frealspb");
-
-	for (i = 0; i < qeth_sparebufs; i++)
-		if (atomic_read(&sparebufs[i].status) != SPAREBUF_UNAVAIL) {
-			kfree(sparebufs[i].buf);
-			atomic_set(&sparebufs[i].status, SPAREBUF_UNAVAIL);
-		}
-}
-
-static inline void
-__qeth_dump_packet_info(struct qeth_card *card, int version, int multicast,
-			int queue)
-{
-	char dbf_text[15];
-
-	QETH_DBF_CARD6(0, trace, "dsp:", card);
-	sprintf(dbf_text, "%c %c%4x",
-		(version == 4) ? '4' : ((version == 6) ? '6' : '0'),
-		(multicast) ? 'm' : '_', queue);
-	QETH_DBF_TEXT6(0, trace, dbf_text);
-	sprintf(dbf_text, "%4x%4x",
-		card->outbound_first_free_buffer[queue],
-		atomic_read(&card->outbound_used_buffers[queue]));
-	QETH_DBF_TEXT6(0, trace, dbf_text);
-	if (qeth_sbal_packing_on_card(card->type)) {
-		switch (card->send_state[queue]) {
-		case SEND_STATE_DONT_PACK:
-			QETH_DBF_TEXT6(0, trace, "usngfast");
-			break;
-		case SEND_STATE_PACK:
-			QETH_DBF_TEXT6(0, trace, "usngpack");
-			break;
-		}
-	} else {
-		QETH_DBF_TEXT6(0, trace, "usngfast");
-	}
-}
-
-static inline void
-__qeth_switch_state_if_needed(struct qeth_card *card, int queue)
-{
-	if (atomic_read(&card->outbound_used_buffers[queue])
-	    >= HIGH_WATERMARK_PACK) {
-		card->send_state[queue] = SEND_STATE_PACK;
-		QETH_DBF_CARD3(0, trace, "stchup", card);
-#ifdef QETH_PERFORMANCE_STATS
-		card->perf_stats.sc_dp_p++;
-#endif /* QETH_PERFORMANCE_STATS */
-	}
-}
-
-static inline int
-qeth_do_send_packet(struct qeth_card *card, struct sk_buff *skb,
-		    struct net_device *dev)
-{
-	int queue, result = 0;
-	int multicast, version;
-
-	version = QETH_IP_VERSION(skb);
-	multicast = qeth_is_multicast_skb_at_all(skb, version);
-	queue = qeth_get_prioqueue(card, skb, multicast, version);
-
-	__qeth_dump_packet_info(card, version, multicast, queue);
-
-	if (atomic_read(&card->outbound_used_buffers[queue])
-	    >= QDIO_MAX_BUFFERS_PER_Q - 1) {
-		QETH_DBF_CARD2(1, trace, "cdbs", card);
-		netif_stop_queue(dev);
-		return -EBUSY;
-	}
-
-	/* 
-	 * we are not called under int, so we just spin
-	 * happens around once a second under heavy traffic. takes a little
-	 * bit less than 10usec in avg. on a z900
-	 */
-	if (atomic_compare_and_swap(QETH_LOCK_UNLOCKED, QETH_LOCK_NORMAL,
-				    &card->outbound_ringbuffer_lock[queue])) {
-		QETH_DBF_CARD2(0, trace, "SPIN", card);
-		while (atomic_compare_and_swap
-		       (QETH_LOCK_UNLOCKED, QETH_LOCK_NORMAL,
-			&card->outbound_ringbuffer_lock[queue])) ;
-		QETH_DBF_CARD2(0, trace, "spin", card);
-	}
-#ifdef QETH_PERFORMANCE_STATS
-	card->perf_stats.skbs_sent++;
-#endif /* QETH_PERFORMANCE_STATS */
-
-	if (qeth_sbal_packing_on_card(card->type)) {
-		switch (card->send_state[queue]) {
-		case SEND_STATE_DONT_PACK:
-			qeth_send_packet_fast(card, skb, dev, queue,
-					      version, multicast);
-			__qeth_switch_state_if_needed(card, queue);
-			break;
-		case SEND_STATE_PACK:
-			qeth_send_packet_packed(card, skb, dev, queue,
-						version, multicast);
-			break;
-		default:
-			result = -EBUSY;
-			QETH_DBF_CARD0(1, trace, "UPSs", card);
-			PRINT_ALL("oops... shouldn't happen (line %i:%i).\n",
-				  __LINE__, card->send_state[queue]);
-		}
-	} else {
-		qeth_send_packet_fast(card, skb, dev, queue,
-				      version, multicast);
-	}
-
-	/* ATOMIC: (NORMAL->UNLOCKED, FLUSH->NORMAL) */
-	while (atomic_dec_return(&card->outbound_ringbuffer_lock[queue])) {
-		qeth_flush_buffer(card, queue, 0);
-		card->send_state[queue] = SEND_STATE_DONT_PACK;
-	}
-#ifdef QETH_PERFORMANCE_STATS
-	card->perf_stats.outbound_time +=
-	    NOW - card->perf_stats.outbound_start_time;
-	card->perf_stats.outbound_cnt++;
-#endif /* QETH_PERFORMANCE_STATS */
-
-	card->stats->tx_packets++;
-	card->stats->tx_bytes += skb->len;
-
-	return result;
-}
-
-static int
-qeth_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
-{
-	struct qeth_card *card;
-	int result;
-
-	card = (struct qeth_card *) (dev->priv);
-
-	if (skb == NULL)
-		return 0;
-
-	QETH_DBF_HEX4(0, data, skb->data, __max(QETH_DBF_DATA_LEN, skb->len));
-
-	netif_stop_queue(dev);
-
-	if (!card) {
-		QETH_DBF_TEXT2(0, trace, "XMNSNOCD");
-		dev_kfree_skb_irq(skb);
-		return 0;
-	}
-#ifdef QETH_PERFORMANCE_STATS
-	card->perf_stats.outbound_start_time = NOW;
-#endif /* QETH_PERFORMANCE_STATS */
-
-	if (!atomic_read(&card->is_startlaned)) {
-		card->stats->tx_carrier_errors++;
-		QETH_DBF_CARD2(0, trace, "XMNS", card);
-		dev_kfree_skb_irq(skb);
-		return 0;
-	}
-
-	result = qeth_do_send_packet(card, skb, dev);
-
-	if (!result)
-		netif_wake_queue(card->dev);
-
-	return result;
-}
-
-static struct net_device_stats *
-qeth_get_stats(struct net_device *dev)
-{
-	struct qeth_card *card;
-
-	card = (struct qeth_card *) (dev->priv);
-
-	QETH_DBF_CARD3(0, trace, "gtst", card);
-
-	return card->stats;
-}
-
-static int
-qeth_change_mtu(struct net_device *dev, int new_mtu)
-{
-	struct qeth_card *card;
-	char dbf_text[15];
-
-	card = (struct qeth_card *) (dev->priv);
-
-	QETH_DBF_CARD2(0, trace, "mtu", card);
-	sprintf(dbf_text, "%8x", new_mtu);
-	QETH_DBF_TEXT2(0, trace, dbf_text);
-
-	if (new_mtu < 64)
-		return -EINVAL;
-	if (new_mtu > 65535)
-		return -EINVAL;
-	if ((!qeth_is_supported(IPA_IP_FRAGMENTATION)) &&
-	    (!qeth_mtu_is_valid(card, new_mtu)))
-		return -EINVAL;
-	dev->mtu = new_mtu;
-	return 0;
-}
-
-static void
-qeth_start_softsetup_thread(struct qeth_card *card)
-{
-	if (!atomic_read(&card->shutdown_phase)) {
-		QETH_DBF_CARD2(0, trace, "stss", card);
-		up(&card->softsetup_thread_sem);
-	}
-}
-
-static int
-qeth_sleepon(struct qeth_card *card, int timeout)
-{
-	char dbf_text[15];
-
-	QETH_DBF_CARD5(0, trace, "slpn", card);
-	sprintf(dbf_text, "%08x", timeout);
-	QETH_DBF_TEXT5(0, trace, dbf_text);
-
-	wait_event_interruptible_timeout(card->wait_q,
-					 atomic_read(&card->data_has_arrived),
-					 timeout * HZ);
-	if (atomic_read(&card->data_has_arrived)) {
-		atomic_set(&card->data_has_arrived, 0);
-		return 0;
-	}
-	return -ETIME;
-}
-
-static void
-qeth_wakeup_ioctl(struct qeth_card *card)
-{
-
-	QETH_DBF_CARD5(0, trace, "wkup", card);
-
-	atomic_set(&card->ioctl_data_has_arrived, 1);
-	wake_up(&card->ioctl_wait_q);
-}
-
-static int
-qeth_sleepon_ioctl(struct qeth_card *card, int timeout)
-{
-	char dbf_text[15];
-
-	QETH_DBF_CARD5(0, trace, "ioctlslpn", card);
-	sprintf(dbf_text, "%08x", timeout);
-	QETH_DBF_TEXT5(0, trace, dbf_text);
-
-	wait_event_interruptible_timeout(card->ioctl_wait_q,
-					 atomic_read(&card->
-						     ioctl_data_has_arrived),
-					 timeout * HZ);
-	if (atomic_read(&card->ioctl_data_has_arrived)) {
-		atomic_set(&card->ioctl_data_has_arrived, 0);
-		return 0;
-	}
-	return -ETIME;
-}
-
-/*SNMP IOCTL on Procfile */
-
-static void
-qeth_wakeup_procfile(void)
-{
-	QETH_DBF_TEXT5(0, trace, "procwkup");
-	/* is this if statement correct? */
-	if (atomic_read(&qeth_procfile_ioctl_sem.count) <=
-	    PROCFILE_SLEEP_SEM_MAX_VALUE)
-		up(&qeth_procfile_ioctl_sem);
-}
-
-static int
-qeth_sleepon_procfile(void)
-{
-	QETH_DBF_TEXT5(0, trace, "procslp");
-	if (down_interruptible(&qeth_procfile_ioctl_sem)) {
-		return -ERESTARTSYS;
-	}
-	return 0;
-}
-
-/* SNMP END */
-
-static char *
-qeth_send_control_data(struct qeth_card *card, unsigned char *buffer,
-		       int len, unsigned long intparam)
-{
-	unsigned long flags;
-	int result, result2;
-	char dbf_text[15];
-	unsigned char *rec_buf;
-	int setip = (intparam & IPA_SETIP_FLAG) ? 1 : 0;
-
-again:
-	if (atomic_read(&card->shutdown_phase) == QETH_REMOVE_CARD_QUICK)
-		return NULL;
-	if (atomic_read(&card->escape_softsetup))
-		return NULL;
-
-	/* we lock very early to synchronize access to seqnos */
-	if (atomic_swap(&card->write_busy, 1)) {
-		qeth_wait_nonbusy(QETH_IDLE_WAIT_TIME);
-		QETH_DBF_CARD2(0, trace, "LSCD", card);
-		goto again;
-	}
-	memcpy(card->dma_stuff->sendbuf, card->send_buf, QETH_BUFSIZE);
-
-	memcpy(QETH_TRANSPORT_HEADER_SEQ_NO(buffer),
-	       &card->seqno.trans_hdr, QETH_SEQ_NO_LENGTH);
-	card->seqno.trans_hdr++;
-
-	memcpy(QETH_PDU_HEADER_SEQ_NO(buffer),
-	       &card->seqno.pdu_hdr, QETH_SEQ_NO_LENGTH);
-	card->seqno.pdu_hdr++;
-	memcpy(QETH_PDU_HEADER_ACK_SEQ_NO(buffer),
-	       &card->seqno.pdu_hdr_ack, QETH_SEQ_NO_LENGTH);
-
-	/* there is noone doing this except sleep and this function */
-	atomic_set(&card->data_has_arrived, 0);
-
-	memcpy(&card->dma_stuff->write_ccw, WRITE_CCW, sizeof (struct ccw1));
-	card->dma_stuff->write_ccw.count = len;
-	card->dma_stuff->write_ccw.cda =
-	    QETH_GET_ADDR(card->dma_stuff->sendbuf);
-
-	QETH_DBF_CARD2(0, trace, "scdw", card);
-	sprintf(dbf_text, "%8x", len);
-	QETH_DBF_TEXT4(0, trace, dbf_text);
-	QETH_DBF_HEX4(0, trace, &intparam, QETH_DBF_TRACE_LEN);
-	QETH_DBF_HEX2(0, control, buffer, QETH_DBF_CONTROL_LEN);
-
-	spin_lock_irqsave(get_ccwdev_lock(CARD_WDEV(card)), flags);
-	result = ccw_device_start(CARD_WDEV(card), &card->dma_stuff->write_ccw,
-				  intparam, 0, 0);
-	if (result) {
-		qeth_delay_millis(QETH_WAIT_BEFORE_2ND_DOIO);
-		result2 = ccw_device_start(CARD_WDEV(card),
-					   &card->dma_stuff->write_ccw,
-					   intparam, 0, 0);
-		if (result2 != -ENODEV)
-			PRINT_WARN("qeth_send_control_data: do_IO "
-				   "returned %i, next try returns %i\n",
-				   result, result2);
-		result = result2;
-	}
-	spin_unlock_irqrestore(get_ccwdev_lock(CARD_WDEV(card)), flags);
-
-	if (result) {
-		QETH_DBF_TEXT2(0, trace, "scd:doio");
-		sprintf(dbf_text, "%4x", (__s16) result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		/* re-enable qeth_send_control_data again */
-		atomic_set(&card->write_busy,0);
-		return NULL;
-	}
-
-	if (intparam == IPA_IOCTL_STATE) {
-		if (qeth_sleepon_ioctl(card, QETH_IPA_TIMEOUT)) {
-			QETH_DBF_TEXT2(0, trace, "scd:ioctime");
-			/* re-enable qeth_send_control_data again */
-			atomic_set(&card->write_busy, 0);
-			return NULL;
-		}
-		rec_buf = card->dma_stuff->recbuf;
-		QETH_DBF_CARD2(0, trace, "scro", card);
-	} else {
-		if (qeth_sleepon(card, (setip) ? QETH_IPA_TIMEOUT :
-				 QETH_MPC_TIMEOUT)) {
-			QETH_DBF_TEXT2(0, trace, "scd:time");
-			/* re-enable qeth_send_control_data again */
-			atomic_set(&card->write_busy, 0);
-			return NULL;
-		}
-		rec_buf = card->ipa_buf;
-		QETH_DBF_CARD2(0, trace, "scri", card);
-	}
-	QETH_DBF_HEX2(0, control, rec_buf, QETH_DBF_CONTROL_LEN);
-
-	memcpy(&card->seqno.pdu_hdr_ack,
-	       QETH_PDU_HEADER_SEQ_NO(rec_buf), QETH_SEQ_NO_LENGTH);
-
-	return rec_buf;
-}
-
-static int
-qeth_send_ipa_cmd(struct qeth_card *card, struct ipa_cmd *cmd, int update_cmd,
-		  int ipatype)
-{
-	unsigned char *buffer;
-	struct ipa_cmd *reply;
-	int ipa_cmd;
-	int result;
-
-	/* don't muck around with ipv6 if there's no use to do so */
-	if ((cmd->prot_version == 6) && (!qeth_is_supported(IPA_IPv6)))
-		return 0;
-
-	ipa_cmd = cmd->command;
-
-	memcpy(card->send_buf, IPA_PDU_HEADER, IPA_PDU_HEADER_SIZE);
-
-	memcpy(QETH_IPA_CMD_DEST_ADDR(card->send_buf),
-	       &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
-
-	memcpy(card->send_buf + IPA_PDU_HEADER_SIZE,
-	       cmd, sizeof (struct ipa_cmd));
-
-	buffer = qeth_send_control_data(card, card->send_buf,
-					IPA_PDU_HEADER_SIZE +
-					sizeof (struct ipa_cmd), ipatype);
-
-	if (!buffer) {
-		if (atomic_read(&card->escape_softsetup))
-			return 0;
-		else
-			return -1;
-	}
-	reply = (struct ipa_cmd *) PDU_ENCAPSULATION(buffer);
-	if ((update_cmd) && (reply))
-		memcpy(cmd, reply, sizeof (struct ipa_cmd));
-	result = reply->return_code;
-
-	/* some special sausages: */
-	if ((ipa_cmd == IPA_CMD_SETASSPARMS) && (result == 0)) {
-		result = reply->data.setassparms.return_code;
-		if ((reply->data.setassparms.assist_no==IPA_INBOUND_CHECKSUM) &&
-		    (reply->data.setassparms.command_code == IPA_CMD_ASS_START))
-			card->csum_enable_mask =
-				reply->data.setassparms.data.flags_32bit;
-	}
-	if ((ipa_cmd == IPA_CMD_SETADAPTERPARMS) && (result == 0)) {
-		result = reply->data.setadapterparms.return_code;
-	}
-
-	return result;
-}
-
-static void
-qeth_fill_ipa_cmd(struct qeth_card *card, struct ipa_cmd *cmd,
-		  __u8 command, int ip_vers)
-{
-	memset(cmd, 0, sizeof (struct ipa_cmd));
-	cmd->command = command;
-	cmd->initiator = INITIATOR_HOST;
-	cmd->seq_no = card->seqno.ipa++;
-	cmd->adapter_type = qeth_get_adapter_type_for_ipa(card->link_type);
-	cmd->rel_adapter_no = (__u8) card->options.portno;
-	cmd->prim_version_no = 1;
-	cmd->param_count = 1;
-	cmd->prot_version = ip_vers;
-	cmd->ipa_supported = 0;
-	cmd->ipa_enabled = 0;
-}
-
-static int
-qeth_send_startstoplan(struct qeth_card *card, __u8 ipacmd, __u16 ip_vers)
-{
-	struct ipa_cmd cmd;
-	int result;
-
-	qeth_fill_ipa_cmd(card, &cmd, ipacmd, 0);
-	cmd.param_count = 0;
-	cmd.prot_version = ip_vers;
-	cmd.ipa_supported = 0;
-	cmd.ipa_enabled = 0;
-
-	result = qeth_send_ipa_cmd(card, &cmd, 0, IPA_CMD_STATE);
-	return result;
-}
-
-static int
-qeth_send_startlan(struct qeth_card *card, __u16 ip_vers)
-{
-	int result;
-	char dbf_text[15];
-
-	QETH_DBF_CARD4(0, trace, "stln", card);
-
-	result = qeth_send_startstoplan(card, IPA_CMD_STARTLAN, ip_vers);
-	if (!result)
-		atomic_set(&card->is_startlaned, 1);
-
-	if (result) {
-		QETH_DBF_CARD2(0, trace, "STRTLNFL", card);
-		sprintf(dbf_text, "%4x", result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-	}
-
-	return result;
-}
-
-static int
-qeth_send_stoplan(struct qeth_card *card)
-{
-#ifdef QETH_SEND_STOPLAN_ON_SHUTDOWN
-	int result;
-	char dbf_text[15];
-
-	atomic_set(&card->is_startlaned, 0);
-
-	QETH_DBF_CARD4(0, trace, "spln", card);
-
-	result = qeth_send_startstoplan(card, IPA_CMD_STOPLAN, 4);
-
-	if (result) {
-		QETH_DBF_CARD2(0, trace, "STPLNFLD", card);
-		sprintf(dbf_text, "%4x", result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-	}
-
-	return result;
-#else /* QETH_SEND_STOPLAN_ON_SHUTDOWN */
-	return 0;
-#endif /* QETH_SEND_STOPLAN_ON_SHUTDOWN */
-}
-
-static int
-qeth_send_qipassist(struct qeth_card *card, short ip_vers)
-{
-	struct ipa_cmd cmd;
-	int result;
-
-	qeth_fill_ipa_cmd(card, &cmd, IPA_CMD_QIPASSIST, ip_vers);
-
-	result = qeth_send_ipa_cmd(card, &cmd, 1, IPA_CMD_STATE);
-
-	if (!result) {
-		if (ip_vers == 4) {
-			card->ipa_supported = cmd.ipa_supported;
-			card->ipa_enabled = cmd.ipa_enabled;
-		} else {
-			card->ipa6_supported = cmd.ipa_supported;
-			card->ipa6_enabled = cmd.ipa_enabled;
-		}
-	}
-
-	return result;
-}
-
-/* QUERY ARP FUNCTIONS */
-
-static int
-qeth_send_ipa_arpcmd(struct qeth_card *card, struct arp_cmd *cmd,
-		     int update_cmd, int ipatype, __u32 req_size)
-{
-	unsigned char *buffer;
-	int ipa_cmd;
-	int result;
-	__u16 s1, s2;
-
-	/* don't muck around with ipv6 if there's no use to do so */
-	if ((cmd->prot_version == 6) && (!qeth_is_supported(IPA_IPv6)))
-		return 0;
-	result = 0;
-	ipa_cmd = cmd->command;
-
-	memcpy(card->send_buf, IPA_PDU_HEADER, IPA_PDU_HEADER_SIZE);
-	memcpy(QETH_IPA_CMD_DEST_ADDR(card->send_buf),
-	       &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
-	memcpy(card->send_buf + IPA_PDU_HEADER_SIZE,
-	       cmd, sizeof (struct arp_cmd));
-
-	if (req_size) {
-		/* adjust sizes for big requests */
-		s1 = (__u32) IPA_PDU_HEADER_SIZE + SNMP_BASE_CMDLENGTH +
-		    req_size;
-		s2 = (__u32) SNMP_BASE_CMDLENGTH + req_size;
-		memcpy(QETH_IPA_PDU_LEN_TOTAL(card->send_buf), &s1, 2);
-		memcpy(QETH_IPA_PDU_LEN_PDU1(card->send_buf), &s2, 2);
-		memcpy(QETH_IPA_PDU_LEN_PDU2(card->send_buf), &s2, 2);
-		memcpy(QETH_IPA_PDU_LEN_PDU3(card->send_buf), &s2, 2);
-	}
-
-	buffer = qeth_send_control_data(card, card->send_buf,
-					IPA_PDU_HEADER_SIZE +
-					sizeof (struct arp_cmd), ipatype);
-	if (!buffer)
-		result = -ENODATA;
-	else
-		result = card->ioctl_returncode;
-	return result;
-}
-
-static int
-qeth_ioctl_handle_snmp_data(struct qeth_card *card, struct arp_cmd *reply)
-{
-	__u16 data_len;
-
-#define SNMP_HEADER_SIZE_WITH_TOKEN 36
-
- 	data_len = *((__u16*)QETH_IPA_PDU_LEN_PDU1(card->dma_stuff->recbuf));
-	if (reply->data.setadapterparms.frame_seq_no == 1)
-		data_len = data_len - 
-			(__u16)((char*)reply->data.setadapterparms.data.
-				snmp_subcommand.snmp_data - (char*)reply); 
-	else
- 		data_len = data_len - 
- 		 	(__u16)((char*)&reply->data.setadapterparms.data.
-				snmp_subcommand.snmp_request - (char*)reply);
-
-	if (reply->data.setadapterparms.frame_seq_no == 1) {
-
-		if (card->ioctl_buffersize <= (SNMP_HEADER_SIZE_WITH_TOKEN +
-					       reply->data.setadapterparms.
-					       frames_used_total *
-					       ARP_DATA_SIZE)) {
-
-			card->ioctl_returncode = ARP_RETURNCODE_ERROR;
-			reply->data.setadapterparms.data.snmp_subcommand.
-			    snmp_returncode = -ENOMEM;
-		} else {
-			card->ioctl_returncode = ARP_RETURNCODE_SUCCESS;
-			card->number_of_entries = 0;
- 			memcpy(((char *)card->ioctl_data_buffer),
-			       reply->data.setadapterparms.snmp_token,
-			       SNMP_HEADER_SIZE_WITH_TOKEN);
- 			card->ioctl_buffer_pointer = card->ioctl_data_buffer+
-				SNMP_HEADER_SIZE_WITH_TOKEN;
-		}
-	}
-
-	if (card->ioctl_returncode != ARP_RETURNCODE_ERROR &&
-	    reply->data.setadapterparms.frame_seq_no <=
-	    reply->data.setadapterparms.frames_used_total) {
-
-		if (reply->data.setadapterparms.return_code ==
-		    IPA_REPLY_SUCCESS) {
-
- 			if (reply->data.setadapterparms.frame_seq_no == 1)
- 				memcpy(card->ioctl_buffer_pointer,
-				       reply->data.setadapterparms.data.
-				       snmp_subcommand.snmp_data, data_len);
-			else
- 				memcpy(card->ioctl_buffer_pointer,
-				       (char*)&reply->data.setadapterparms.
-				       data.snmp_subcommand.snmp_request,
-				       data_len);
-
-			card->ioctl_buffer_pointer =
-			    card->ioctl_buffer_pointer + data_len;
-			card->ioctl_returncode = ARP_RETURNCODE_SUCCESS;
-
-			if (reply->data.setadapterparms.frame_seq_no ==
-			    reply->data.setadapterparms.frames_used_total) {
-				card->ioctl_returncode =
-				    ARP_RETURNCODE_LASTREPLY;
-			}
-		} else {
-			card->ioctl_returncode = ARP_RETURNCODE_ERROR;
-			memset(card->ioctl_data_buffer, 0,
-			       card->ioctl_buffersize);
-			reply->data.setadapterparms.data.snmp_subcommand.
-			    snmp_returncode =
-			    reply->data.setadapterparms.return_code;
-		}
-	}
-#undef  SNMP_HEADER_SIZE_WITH_TOKEN
-
-	return card->ioctl_returncode;
-}
-
-static int
-qeth_ioctl_handle_arp_data(struct qeth_card *card, struct arp_cmd *reply)
-{
-
-	if (reply->data.setassparms.seq_no == 1) {
-		if (card->ioctl_buffersize <=
-		    (sizeof (__u16) + sizeof (int) +
-		     reply->data.setassparms.number_of_replies *
-		     ARP_DATA_SIZE)) {
-
-			card->ioctl_returncode = ARP_RETURNCODE_ERROR;
-
-		} else {
-			card->ioctl_returncode = ARP_RETURNCODE_SUCCESS;
-			card->number_of_entries = 0;
-			card->ioctl_buffer_pointer =
-			    card->ioctl_data_buffer + sizeof (__u16) +
-			    sizeof (int);
-		}
-	}
-
-	if (card->ioctl_returncode != ARP_RETURNCODE_ERROR &&
-	    reply->data.setassparms.seq_no <=
-	    reply->data.setassparms.number_of_replies) {
-
-		if (reply->data.setassparms.return_code == IPA_REPLY_SUCCESS) {
-
-			card->number_of_entries = card->number_of_entries +
-			    reply->data.setassparms.
-			    data.queryarp_data.number_of_entries;
-			memcpy(card->ioctl_buffer_pointer,
-			       reply->data.setassparms.data.queryarp_data.
-			       arp_data, ARP_DATA_SIZE);
-			card->ioctl_buffer_pointer = card->
-			    ioctl_buffer_pointer + ARP_DATA_SIZE;
-			card->ioctl_returncode = ARP_RETURNCODE_SUCCESS;
-			if (reply->data.setassparms.seq_no ==
-			    reply->data.setassparms.number_of_replies) {
-				memcpy(card->ioctl_data_buffer,
-				       &reply->data.setassparms.data.
-				       queryarp_data.osa_setbitmask,
-				       sizeof (__u16));
-				card->ioctl_returncode =
-				    ARP_RETURNCODE_LASTREPLY;
-			}
-		} else {
-
-			card->ioctl_returncode = ARP_RETURNCODE_ERROR;
-			memset(card->ioctl_data_buffer, 0,
-			       card->ioctl_buffersize);
-		}
-	}
-	return card->ioctl_returncode;
-}
-
-static int
-qeth_look_for_arp_data(struct qeth_card *card)
-{
-	struct arp_cmd *reply;
-	int result;
-
-	reply = (struct arp_cmd *) PDU_ENCAPSULATION(card->dma_stuff->recbuf);
-
-	if ((reply->command == IPA_CMD_SETASSPARMS) &&
-	    (reply->data.setassparms.assist_no == IPA_ARP_PROCESSING) &&
-	    (reply->data.setassparms.command_code ==
-	     IPA_CMD_ASS_ARP_FLUSH_CACHE)) {
-		result = ARP_FLUSH;
-	} else if ((reply->command == IPA_CMD_SETASSPARMS) &&
-		   (reply->data.setassparms.assist_no == IPA_ARP_PROCESSING) &&
-		   (reply->data.setassparms.command_code ==
-		    IPA_CMD_ASS_ARP_QUERY_INFO) &&
-		   (card->ioctl_returncode == ARP_RETURNCODE_SUCCESS)) {
-
-		result = qeth_ioctl_handle_arp_data(card, reply);
-
-	} else if ((reply->command == IPA_CMD_SETADAPTERPARMS) &&
-		   (reply->data.setadapterparms.command_code ==
-		    IPA_SETADP_SET_SNMP_CONTROL) &&
-		   (card->ioctl_returncode == ARP_RETURNCODE_SUCCESS)) {
-
-		result = qeth_ioctl_handle_snmp_data(card, reply);
-	} else
-		result = ARP_RETURNCODE_NOARPDATA;
-
-	return result;
-}
-
-static int
-qeth_queryarp(struct qeth_card *card, struct ifreq *req, int version,
-	      __u32 assist_no, __u16 command_code, char *c_data, __u16 len)
-{
-	int data_size;
-	struct arp_cmd *cmd;
-	int result;
-
-	cmd = (struct arp_cmd *) kmalloc(sizeof (struct arp_cmd), GFP_KERNEL);
-	if (!cmd) {
-		return IPA_REPLY_FAILED;
-	}
-
-	memcpy(&data_size, c_data, sizeof (int));
-
-	qeth_fill_ipa_cmd(card, (struct ipa_cmd *) cmd, IPA_CMD_SETASSPARMS,
-			  version);
-
-	cmd->data.setassparms.assist_no = assist_no;
-	cmd->data.setassparms.length = 8 + len;
-	cmd->data.setassparms.command_code = command_code;
-	cmd->data.setassparms.return_code = 0;
-	cmd->data.setassparms.seq_no = 0;
-
-	card->ioctl_buffersize = data_size;
-	card->ioctl_data_buffer = (char *) vmalloc(data_size);
-	if (!card->ioctl_data_buffer) {
-		kfree(cmd);
-		return IPA_REPLY_FAILED;
-	}
-
-	card->ioctl_returncode = ARP_RETURNCODE_SUCCESS;
-
-	result = qeth_send_ipa_arpcmd(card, cmd, 1, IPA_IOCTL_STATE, 0);
-
-	if ((result == ARP_RETURNCODE_ERROR) || (result == -ENODATA)) {
-		result = IPA_REPLY_FAILED;
-	} else {
-		result = IPA_REPLY_SUCCESS;
-		memcpy(((char *) (card->ioctl_data_buffer)) + sizeof (__u16),
-		       &(card->number_of_entries), sizeof (int));
-		if (copy_to_user(req->ifr_ifru.ifru_data,
-			     	card->ioctl_data_buffer, data_size))
-				result = -EFAULT;
-	}
-	card->ioctl_buffer_pointer = NULL;
-	vfree(card->ioctl_data_buffer);
-	kfree(cmd);
-	card->number_of_entries = 0;
-	card->ioctl_buffersize = 0;
-
-	return result;
-}
-
-static int
-snmp_set_setadapterparms_command(struct qeth_card *card,
-				 struct arp_cmd *cmd, struct ifreq *req,
-				 char *data, __u16 len,
-				 __u16 command_code, int req_size)
-{
-	__u32 data_size;
-
-	memcpy(&data_size, data, sizeof (__u32));
-
-	card->ioctl_buffersize = data_size;
-	card->ioctl_data_buffer = (char *) vmalloc(data_size);
-	if (!card->ioctl_data_buffer) {
-		return -ENOMEM;
-	}
-	card->ioctl_returncode = ARP_RETURNCODE_SUCCESS;
-
-	memcpy(cmd->data.setadapterparms.snmp_token,
-	       data + SNMP_REQUEST_DATA_OFFSET, req_size);
-
-	cmd->data.setadapterparms.cmdlength = SNMP_SETADP_CMDLENGTH + req_size;
-	cmd->data.setadapterparms.command_code = command_code;
-	cmd->data.setadapterparms.frames_used_total = 1;
-	cmd->data.setadapterparms.frame_seq_no = 1;
-
-	return 0;
-}
-static int
-qeth_send_snmp_control(struct qeth_card *card, struct ifreq *req,
-		       __u32 command, __u16 command_code,
-		       char *c_data, __u16 len)
-{
-	struct arp_cmd *cmd;
-	__u32 result, req_size;
-
-	cmd = (struct arp_cmd *) kmalloc(sizeof (struct arp_cmd), GFP_KERNEL);
-	if (!cmd) {
-		return IPA_REPLY_FAILED;
-	}
-
-	qeth_fill_ipa_cmd(card, (struct ipa_cmd *) cmd, command, 4);
-
-	memcpy(&req_size, ((char *) c_data) + sizeof (__u32), sizeof (__u32));
-
-	if (snmp_set_setadapterparms_command(card, cmd, req, c_data,
-					     len, command_code, req_size)) {
-		kfree(cmd);
-		return IPA_REPLY_FAILED;
-	}
-
-	result = qeth_send_ipa_arpcmd(card, cmd, 1, IPA_IOCTL_STATE, req_size);
-
-	if (result == -ENODATA) {
-		result = IPA_REPLY_FAILED;
-		goto snmp_out;
-	}
-	if (result == ARP_RETURNCODE_ERROR) {
-		result = IPA_REPLY_FAILED;
-		if (copy_to_user(req->ifr_ifru.ifru_data + 
-			     SNMP_REQUEST_DATA_OFFSET, card->ioctl_data_buffer,
-			     card->ioctl_buffersize))
-			result = -EFAULT;
-	} else {
-		result = IPA_REPLY_SUCCESS;
-		if (copy_to_user(req->ifr_ifru.ifru_data +
-				 SNMP_REQUEST_DATA_OFFSET, card->ioctl_data_buffer,
-				 card->ioctl_buffersize))
-			result = -EFAULT;
-	}
-snmp_out:
-	card->number_of_entries = 0;
-	card->ioctl_buffersize = 0;
-	card->ioctl_buffer_pointer = NULL;
-	vfree(card->ioctl_data_buffer);
-	kfree(cmd);
-
-	return result;
-}
-
-static int
-qeth_send_setassparms(struct qeth_card *card, int version, __u32 assist_no,
-		      __u16 command_code, long data, __u16 len)
-{
-	struct ipa_cmd cmd;
-	int result;
-
-	qeth_fill_ipa_cmd(card, &cmd, IPA_CMD_SETASSPARMS, version);
-
-	cmd.data.setassparms.assist_no = assist_no;
-	cmd.data.setassparms.length = 8 + len;
-	cmd.data.setassparms.command_code = command_code;
-	cmd.data.setassparms.return_code = 0;
-	cmd.data.setassparms.seq_no = 0;
-
-	if (len <= sizeof (__u32))
-		cmd.data.setassparms.data.flags_32bit = (__u32) data;
-	else if (len > sizeof (__u32))
-		memcpy(&cmd.data.setassparms.data, (void *) data,
-		       qeth_min(len, PAGE_SIZE));
-	if (command_code != IPA_CMD_ASS_START) {
-		result = qeth_send_ipa_cmd(card, &cmd, 0,
-					   ((assist_no == IPA_ARP_PROCESSING) &&
-					    (command_code !=
-					     IPA_CMD_ASS_ARP_FLUSH_CACHE)) ?
-					   IPA_IOCTL_STATE : IPA_CMD_STATE);
-
-	} else
-		result = qeth_send_ipa_cmd(card, &cmd, 0, IPA_CMD_STATE);
-
-	return result;
-}
-
-static int
-qeth_send_setadapterparms_query(struct qeth_card *card)
-{
-	struct ipa_cmd cmd;
-	int result;
-
-	qeth_fill_ipa_cmd(card, &cmd, IPA_CMD_SETADAPTERPARMS,
-			  IPA_SETADAPTERPARMS_IP_VERSION);
-	cmd.data.setadapterparms.cmdlength = sizeof (struct ipa_setadp_cmd);
-	cmd.data.setadapterparms.command_code =
-	    IPA_SETADP_QUERY_COMMANDS_SUPPORTED;
-	cmd.data.setadapterparms.frames_used_total = 1;
-	cmd.data.setadapterparms.frame_seq_no = 1;
-	result = qeth_send_ipa_cmd(card, &cmd, 1, IPA_CMD_STATE);
-
-	if (cmd.data.setadapterparms.data.query_cmds_supp.lan_type & 0x7f)
-		card->link_type = cmd.data.setadapterparms.data.
-		    query_cmds_supp.lan_type;
-
-	card->adp_supported =
-	    cmd.data.setadapterparms.data.query_cmds_supp.supported_cmds;
-
-	return result;
-}
-
-static int
-qeth_send_setadapterparms_mode(struct qeth_card *card, __u32 command,
-			       __u32 mode)
-{
-
-	struct ipa_cmd cmd;
-	int result;
-
-	qeth_fill_ipa_cmd(card, &cmd, IPA_CMD_SETADAPTERPARMS,
-			  IPA_SETADAPTERPARMS_IP_VERSION);
-	cmd.data.setadapterparms.cmdlength = sizeof (struct ipa_setadp_cmd);
-	cmd.data.setadapterparms.command_code = command;
-	cmd.data.setadapterparms.frames_used_total = 1;
-	cmd.data.setadapterparms.frame_seq_no = 1;
-	cmd.data.setadapterparms.data.mode = mode;
-	result = qeth_send_ipa_cmd(card, &cmd, 0, IPA_CMD_STATE);
-
-	return result;
-}
-
-static int
-qeth_send_setadapterparms_change_addr(struct qeth_card *card,
-				      __u32 command,
-				      __u32 subcmd, __u8 * mac_addr,
-				      int addr_len)
-{
-	struct ipa_cmd cmd;
-	int result;
-
-	qeth_fill_ipa_cmd(card, &cmd, IPA_CMD_SETADAPTERPARMS,
-			  IPA_SETADAPTERPARMS_IP_VERSION);
-	cmd.data.setadapterparms.cmdlength = sizeof (struct ipa_setadp_cmd);
-	cmd.data.setadapterparms.command_code = command;
-	cmd.data.setadapterparms.frames_used_total = 1;
-	cmd.data.setadapterparms.frame_seq_no = 1;
-	cmd.data.setadapterparms.data.change_addr.cmd = subcmd;
-	cmd.data.setadapterparms.data.change_addr.addr_size = addr_len;
-	memcpy(&cmd.data.setadapterparms.data.change_addr.addr,
-	       mac_addr, addr_len);
-
-	result = qeth_send_ipa_cmd(card, &cmd, 1, IPA_CMD_STATE);
-
-	memcpy(mac_addr, &cmd.data.setadapterparms.data.change_addr.addr,
-	       addr_len);
-
-	return result;
-}
-
-static int
-qeth_send_setassparms_simple_with_data(struct qeth_card *card,
-				       __u32 assist_no,
-				       __u16 command_code, long data)
-{
-	return qeth_send_setassparms(card, 4, assist_no, command_code, data, 4);
-}
-
-static int
-qeth_send_setassparms_simple_without_data(struct qeth_card *card,
-					  __u32 assist_no, __u16 command_code)
-{
-	return qeth_send_setassparms(card, 4, assist_no, command_code, 0, 0);
-}
-
-static int
-qeth_send_setassparms_simple_without_data6(struct qeth_card *card,
-					   __u32 assist_no, __u16 command_code)
-{
-	return qeth_send_setassparms(card, 6, assist_no, command_code, 0, 0);
-}
-
-static int
-qeth_send_setdelip(struct qeth_card *card, __u8 * ip, __u8 * netmask,
-		   int ipacmd, short ip_vers, unsigned int flags)
-{
-	struct ipa_cmd cmd;
-	int ip_len = (ip_vers == 6) ? 16 : 4;
-
-	qeth_fill_ipa_cmd(card, &cmd, ipacmd, ip_vers);
-
-	if (ip_vers == 6) {
-		memcpy(&cmd.data.setdelip6.ip, ip, ip_len);
-		memcpy(&cmd.data.setdelip6.netmask, netmask, ip_len);
-		cmd.data.setdelip6.flags = flags;
-	} else {
-		memcpy(&cmd.data.setdelip4.ip, ip, ip_len);
-		memcpy(&cmd.data.setdelip4.netmask, netmask, ip_len);
-		cmd.data.setdelip4.flags = flags;
-	}
-
-	return qeth_send_ipa_cmd(card, &cmd, 0, IPA_CMD_STATE |
-				 ((ipacmd ==
-				   IPA_CMD_SETIP) ? IPA_SETIP_FLAG : 0));
-}
-
-static int
-qeth_send_setdelipm(struct qeth_card *card, __u8 * ip, __u8 * mac,
-		    int ipacmd, short ip_vers)
-{
-	struct ipa_cmd cmd;
-	int ip_len = (ip_vers == 6) ? 16 : 4;
-
-	qeth_fill_ipa_cmd(card, &cmd, ipacmd, ip_vers);
-	memcpy(&cmd.data.setdelipm.mac, mac, 6);
-	if (ip_vers == 6) {
-		memcpy(&cmd.data.setdelipm.ip6, ip, ip_len);
-	} else {
-		memcpy(&cmd.data.setdelipm.ip4_6, ip, ip_len);
-	}
-
-	return qeth_send_ipa_cmd(card, &cmd, 0, IPA_CMD_STATE |
-				 ((ipacmd ==
-				   IPA_CMD_SETIPM) ? IPA_SETIP_FLAG : 0));
-}
-
-#define PRINT_SETIP_ERROR(x) \
-	if (result) \
-		PRINT_ERR("setip%c: return code 0x%x (%s)\n",x,result, \
-			  (result==0xe002)?"invalid mtu size": \
-	       		  (result==0xe005)?"duplicate ip address": \
-	       		  (result==0xe0a5)?"duplicate ip address": \
-       			  (result==0xe006)?"ip table full": \
-			  (result==0xe008)?"startlan not received": \
-			  (result==0xe009)?"setip already received": \
-			  (result==0xe00a)?"dup network ip address": \
-			  (result==0xe00b)?"mblk no free main task entry": \
-			  (result==0xe00d)?"invalid ip version": \
-			  (result==0xe00e)?"unsupported arp assist cmd": \
-			  (result==0xe00f)?"arp assist not enabled": \
-			  (result==0xe080)?"startlan disabled": \
-			  (result==0xf012)?"unicast IP address invalid": \
-			  (result==0xf013)?"multicast router limit reached": \
-			  (result==0xf014)?"stop assist not supported": \
-			  (result==0xf015)?"multicast assist not set": \
-			  (result==0xf080)?"VM: startlan disabled": \
-			  (result==-1)?"IPA communication timeout": \
-			  "unknown return code")
-
-static inline int
-qeth_send_setip(struct qeth_card *card, __u8 * ip,
-		__u8 * netmask, short ip_vers, int use_retries)
-{
-	int result;
-	int retries;
-	char dbf_text[15];
-	int takeover = 0;
-
-	retries = (use_retries) ? QETH_SETIP_RETRIES : 1;
-	if (qeth_is_ipa_covered_by_ipato_entries(ip_vers, ip, card)) {
-		QETH_DBF_CARD2(0, trace, "ipto", card);
-		if (ip_vers == 4) {
-			*((__u32 *) (&dbf_text[0])) = *((__u32 *) ip);
-			*((__u32 *) (&dbf_text[4])) = *((__u32 *) netmask);
-			QETH_DBF_HEX2(0, trace, dbf_text, QETH_DBF_TRACE_LEN);
-		} else {
-			QETH_DBF_HEX2(0, trace, ip, QETH_DBF_TRACE_LEN);
-			QETH_DBF_HEX2(0, trace, ip + QETH_DBF_TRACE_LEN,
-				      QETH_DBF_TRACE_LEN);
-			QETH_DBF_HEX2(0, trace, netmask, QETH_DBF_TRACE_LEN);
-			QETH_DBF_HEX2(0, trace, netmask + QETH_DBF_TRACE_LEN,
-				      QETH_DBF_TRACE_LEN);
-		}
-		takeover = 1;
-	} else {
-	}
-retry:
-	result = qeth_send_setdelip(card, ip, netmask, IPA_CMD_SETIP, ip_vers,
-				    (takeover) ? IPA_SETIP_TAKEOVER_FLAGS :
-				    IPA_SETIP_FLAGS);
-	PRINT_SETIP_ERROR(' ');
-
-	if (result) {
-		QETH_DBF_CARD2(0, trace, "SETIPFLD", card);
-		sprintf(dbf_text, "%4x", result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-	}
-
-	if (((result == -1) || (result == 0xe080) ||(result==0xf080)) &&
-	    (retries--)) {
-		QETH_DBF_CARD2(0, trace, "sipr", card);
-		if (ip_vers == 4) {
-			*((__u32 *) (&dbf_text[0])) = *((__u32 *) ip);
-			*((__u32 *) (&dbf_text[4])) = *((__u32 *) netmask);
-			QETH_DBF_HEX2(0, trace, dbf_text, QETH_DBF_TRACE_LEN);
-		} else {
-			QETH_DBF_HEX2(0, trace, ip, QETH_DBF_TRACE_LEN);
-			QETH_DBF_HEX2(0, trace, ip + QETH_DBF_TRACE_LEN,
-				      QETH_DBF_TRACE_LEN);
-			QETH_DBF_HEX2(0, trace, netmask, QETH_DBF_TRACE_LEN);
-			QETH_DBF_HEX2(0, trace, netmask + QETH_DBF_TRACE_LEN,
-				      QETH_DBF_TRACE_LEN);
-		}
-		PRINT_WARN("trying again...\n");
-		goto retry;
-	}
-
-	return result;
-}
-
-static inline int
-qeth_send_delip(struct qeth_card *card, __u8 * ip,
-		__u8 * netmask, short ip_vers)
-{
-	return qeth_send_setdelip(card, ip, netmask, IPA_CMD_DELIP, ip_vers,
-				  IPA_DELIP_FLAGS);
-}
-
-static inline int
-qeth_send_setipm(struct qeth_card *card, __u8 * ip,
-		 __u8 * mac, short ip_vers, int use_retries)
-{
-	int result;
-	int retries;
-	char dbf_text[15];
-
-	retries = (use_retries) ? QETH_SETIP_RETRIES : 1;
-	if (qeth_is_ipa_covered_by_ipato_entries(ip_vers, ip, card)) {
-		QETH_DBF_CARD2(0, trace, "imto", card);
-		if (ip_vers == 4) {
-			*((__u32 *) (&dbf_text[0])) = *((__u32 *) ip);
-			QETH_DBF_HEX2(0, trace, dbf_text, QETH_DBF_TRACE_LEN);
-		} else {
-			QETH_DBF_HEX2(0, trace, ip, QETH_DBF_TRACE_LEN);
-			QETH_DBF_HEX2(0, trace, ip + QETH_DBF_TRACE_LEN,
-				      QETH_DBF_TRACE_LEN);
-		}
-	}
-
-retry:
-	result = qeth_send_setdelipm(card, ip, mac, IPA_CMD_SETIPM, ip_vers);
-	PRINT_SETIP_ERROR('m');
-
-	if (result) {
-		QETH_DBF_CARD2(0, trace, "SETIMFLD", card);
-		sprintf(dbf_text, "%4x", result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-	}
-
-	if ((result == -1) && (retries--)) {
-		QETH_DBF_CARD2(0, trace, "simr", card);
-		if (ip_vers == 4) {
-			sprintf(dbf_text, "%08x", *((__u32 *) ip));
-			QETH_DBF_TEXT2(0, trace, dbf_text);
-		} else {
-			QETH_DBF_HEX2(0, trace, ip, QETH_DBF_TRACE_LEN);
-			QETH_DBF_HEX2(0, trace, ip + QETH_DBF_TRACE_LEN,
-				      QETH_DBF_TRACE_LEN);
-		}
-		QETH_DBF_HEX2(0, trace, mac, OSA_ADDR_LEN);
-		PRINT_WARN("trying again...\n");
-		goto retry;
-	}
-
-	return result;
-}
-
-static inline int
-qeth_send_delipm(struct qeth_card *card, __u8 * ip, __u8 * mac, short ip_vers)
-{
-	return qeth_send_setdelipm(card, ip, mac, IPA_CMD_DELIPM, ip_vers);
-}
-
-static int
-qeth_add_vipa_entry(struct qeth_card *card, int version, __u8 * addr, int flag)
-{
-	struct qeth_vipa_entry *entry, *e;
-	int result = 0;
-
-	entry =
-	    (struct qeth_vipa_entry *) kmalloc(sizeof (struct qeth_vipa_entry),
-					       GFP_KERNEL);
-	if (!entry) {
-		PRINT_ERR("not enough memory for vipa handling\n");
-		return -ENOMEM;
-	}
-	entry->version = version;
-	entry->flag = flag;
-	memcpy(entry->ip, addr, 16);
-	entry->state = VIPA_2_B_ADDED;
-
-	write_lock(&card->vipa_list_lock);
-	e = card->vipa_list;
-	while (e) {
-		if (e->version != version)
-			goto next;
-		if (memcmp(e->ip, addr, (version == 4) ? 4 : 16))
-			goto next;
-		if (flag == IPA_SETIP_VIPA_FLAGS) {
-			PRINT_ERR("vipa already set\n");
-		} else {
-			PRINT_ERR("rxip already set\n");
-		}
-		kfree(entry);
-		result = -EALREADY;
-		goto out;
-	next:
-		e = e->next;
-	}
-	entry->next = card->vipa_list;
-	card->vipa_list = entry;
-out:
-	write_unlock(&card->vipa_list_lock);
-	return result;
-}
-
-static int
-qeth_del_vipa_entry(struct qeth_card *card, int version, __u8 * addr, int flag)
-{
-	struct qeth_vipa_entry *e;
-	int result = 0;
-
-	write_lock(&card->vipa_list_lock);
-	e = card->vipa_list;
-	while (e) {
-		if (e->version != version)
-			goto next;
-		if (e->flag != flag)
-			goto next;
-		if (memcmp(e->ip, addr, (version == 4) ? 4 : 16))
-			goto next;
-		e->state = VIPA_2_B_REMOVED;
-		goto out;
-	next:
-		e = e->next;
-	}
-	if (flag == IPA_SETIP_VIPA_FLAGS) {
-		PRINT_ERR("vipa not found\n");
-	} else {
-		PRINT_ERR("rxip not found\n");
-	}
-	result = -ENOENT;
-out:
-	write_unlock(&card->vipa_list_lock);
-	return result;
-}
-
-static void
-qeth_set_vipas(struct qeth_card *card, int set_only)
-{
-	struct qeth_vipa_entry *e, *le = NULL, *ne;	/* ne stands for new entry,
-							   le is last entry */
-	char dbf_text[15];
-	int result;
-	__u8 netmask[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-	};
-	struct qeth_vipa_entry *priv_add_list = NULL;
-	struct qeth_vipa_entry *priv_del_list = NULL;
-
-	write_lock(&card->vipa_list_lock);
-	e = card->vipa_list;
-	while (e) {
-		switch (e->state) {
-		case VIPA_2_B_ADDED:
-			if (!set_only)
-				break;
-			if (!atomic_read(&card->is_open))
-				break;
-			/* we don't want to hold the lock for a long time...
-			 * so we clone the entry */
-			ne = (struct qeth_vipa_entry *)
-			    kmalloc(sizeof (struct qeth_vipa_entry),
-				    GFP_ATOMIC);
-			if (ne) {
-				ne->version = e->version;
-				ne->flag = e->flag;
-				memcpy(ne->ip, e->ip, 16);
-				ne->next = priv_add_list;
-				priv_add_list = ne;
-
-				e->state = VIPA_ESTABLISHED;
-			} else {
-				PRINT_ERR("not enough for internal vipa "
-					  "handling... trying to set "
-					  "vipa next time.\n");
-				qeth_start_softsetup_thread(card);
-			}
-			break;
-		case VIPA_2_B_REMOVED:
-			if (set_only)
-				break;
-			if (le)
-				le->next = e->next;
-			else
-				card->vipa_list = e->next;
-			ne = e->next;
-			e->next = priv_del_list;
-			priv_del_list = e;
-			e = ne;
-			continue;
-		case VIPA_ESTABLISHED:
-			if (atomic_read(&card->is_open))
-				break;
-			/* we don't want to hold the lock for a long time...
-			 * so we clone the entry */
-			ne = (struct qeth_vipa_entry *)
-			    kmalloc(sizeof (struct qeth_vipa_entry),
-				    GFP_KERNEL);
-			if (ne) {
-				ne->version = e->version;
-				ne->flag = e->flag;
-				memcpy(ne->ip, e->ip, 16);
-				ne->next = priv_del_list;
-				priv_del_list = ne;
-
-				e->state = VIPA_2_B_ADDED;
-			} else {
-				PRINT_ERR("not enough for internal vipa "
-					  "handling... VIPA/RXIP remains set "
-					  "although device is stopped.\n");
-				qeth_start_softsetup_thread(card);
-			}
-			break;
-		default:
-			break;
-		}
-		le = e;
-		e = e->next;
-	}
-	write_unlock(&card->vipa_list_lock);
-
-	while (priv_add_list) {
-		result = qeth_send_setdelip(card, priv_add_list->ip, netmask,
-					    IPA_CMD_SETIP,
-					    priv_add_list->version,
-					    priv_add_list->flag);
-		PRINT_SETIP_ERROR('s');
-
-		if (result) {
-			QETH_DBF_CARD2(0, trace, "SETSVFLD", card);
-			sprintf(dbf_text, "%4x", result);
-			QETH_DBF_TEXT2(0, trace, dbf_text);
-			if (priv_add_list->version == 4) {
-				PRINT_ERR("going to leave vipa/rxip x%08x"
-					  "unset...\n",
-					  *((__u32 *) & priv_add_list->ip[0]));
-				sprintf(dbf_text, "%08x",
-					*((__u32 *) & priv_add_list->ip[0]));
-				QETH_DBF_TEXT2(0, trace, dbf_text);
-			} else {
-				PRINT_ERR("going to leave vipa/rxip "
-					  "%08x%08x%08x%08x unset...\n",
-					  *((__u32 *) & priv_add_list->ip[0]),
-					  *((__u32 *) & priv_add_list->ip[4]),
-					  *((__u32 *) & priv_add_list->ip[8]),
-					  *((__u32 *) & priv_add_list->ip[12]));
-				QETH_DBF_HEX2(0, trace, &priv_add_list->ip[0],
-					      QETH_DBF_TRACE_LEN);
-				QETH_DBF_HEX2(0, trace, &priv_add_list->ip[8],
-					      QETH_DBF_TRACE_LEN);
-			}
-		}
-		e = priv_add_list;
-		priv_add_list = priv_add_list->next;
-		kfree(e);
-	}
-
-	while (priv_del_list) {
-		result = qeth_send_setdelip(card, priv_del_list->ip, netmask,
-					    IPA_CMD_DELIP,
-					    priv_del_list->version,
-					    priv_del_list->flag);
-		if (result) {
-			QETH_DBF_CARD2(0, trace, "DELSVFLD", card);
-			sprintf(dbf_text, "%4x", result);
-			QETH_DBF_TEXT2(0, trace, dbf_text);
-			if (priv_del_list->version == 4) {
-				PRINT_ERR("could not delete vipa/rxip "
-					  "%08x...\n",
-					  *((__u32 *) & priv_del_list->ip[0]));
-				sprintf(dbf_text, "%08x",
-					*((__u32 *) & priv_del_list->ip[0]));
-				QETH_DBF_TEXT2(0, trace, dbf_text);
-			} else {
-				PRINT_ERR("could not delete vipa/rxip "
-					  "%08x%08x%08x%08x...\n",
-					  *((__u32 *) & priv_del_list->ip[0]),
-					  *((__u32 *) & priv_del_list->ip[4]),
-					  *((__u32 *) & priv_del_list->ip[8]),
-					  *((__u32 *) & priv_del_list->ip[12]));
-				QETH_DBF_HEX2(0, trace, &priv_del_list->ip[0],
-					      QETH_DBF_TRACE_LEN);
-				QETH_DBF_HEX2(0, trace, &priv_del_list->ip[8],
-					      QETH_DBF_TRACE_LEN);
-			}
-/* in case of problems, it's better if we just display a message and
- * don't requeue the entry back...
-			write_lock(&card->vipa_list_lock);
-			e=card->vipa_list;
-			card->vipa_list=priv_del_list;
-			priv_del_list=priv_del_list->next;
-			card->vipa_list->next=e;
-			card->vipa_list->state=VIPA_ESTABLISHED;
-			write_unlock(&card->vipa_list_lock);
-			continue;
-*/
-		}
-		e = priv_del_list;
-		priv_del_list = priv_del_list->next;
-		kfree(e);
-	}
-}
-
-static void
-qeth_refresh_vipa_states(struct qeth_card *card)
-{
-	struct qeth_vipa_entry *e;
-
-	write_lock(&card->vipa_list_lock);
-	e = card->vipa_list;
-	while (e) {
-		if (e->state == VIPA_ESTABLISHED)
-			e->state = VIPA_2_B_ADDED;
-		e = e->next;
-	}
-	write_unlock(&card->vipa_list_lock);
-}
-
-static inline int
-qeth_send_setrtg(struct qeth_card *card, int routing_type, short ip_vers)
-{
-	struct ipa_cmd cmd;
-
-	qeth_fill_ipa_cmd(card, &cmd, IPA_CMD_SETRTG, ip_vers);
-	/* strip off RESET_ROUTING_FLAG */
-	cmd.data.setrtg.type = (routing_type) & (ROUTER_MASK);
-
-	return qeth_send_ipa_cmd(card, &cmd, 0, IPA_CMD_STATE);
-}
-
-static int
-qeth_is_ipa_in_list(struct in_ifaddr *ip, struct in_ifaddr *list)
-{
-	while (list) {
-		if (ip->ifa_address == list->ifa_address)
-			return 1;
-		list = list->ifa_next;
-	}
-	return 0;
-}
-
-#ifdef QETH_IPV6
-static int
-qeth_is_ipa_in_list6(struct inet6_ifaddr *ip, struct inet6_ifaddr *list)
-{
-	while (list) {
-		if (!memcmp(&ip->addr.s6_addr, &list->addr.s6_addr, 16))
-			return 1;
-		list = list->if_next;
-	}
-	return 0;
-}
-
-static int
-qeth_add_ifa6_to_list(struct inet6_ifaddr **list, struct inet6_ifaddr *ifa)
-{
-	struct inet6_ifaddr *i;
-
-	if (*list == NULL) {
-		*list = ifa;
-	} else {
-		if (qeth_is_ipa_in_list6(ifa, *list))
-			return -EALREADY;
-		i = *list;
-		while (i->if_next) {
-			i = i->if_next;
-		}
-		i->if_next = ifa;
-	}
-	ifa->if_next = NULL;
-	return 0;
-}
-#endif /* QETH_IPV6 */
-
-static int
-qeth_add_ifa_to_list(struct in_ifaddr **list, struct in_ifaddr *ifa)
-{
-	struct in_ifaddr *i;
-
-	if (*list == NULL) {
-		*list = ifa;
-	} else {
-		if (qeth_is_ipa_in_list(ifa, *list))
-			return -EALREADY;
-		i = *list;
-		while (i->ifa_next) {
-			i = i->ifa_next;
-		}
-		i->ifa_next = ifa;
-	}
-	ifa->ifa_next = NULL;
-	return 0;
-}
-
-static void
-__qeth_setips_ipv6(struct qeth_card *card, int use_setip_retries)
-{
-#ifdef QETH_IPV6
-	int result;
-	char dbf_text[15];
-	struct inet6_ifaddr *addr6;
-	__u8 netmask[16];
-
-#define FILL_NETMASK(len) { \
-	int i,j; \
-	for (i=0;i<16;i++) { \
-		j=(len)-(i*8); \
-		netmask[i]=(__u8)(0xFF00>>j); \
-	} \
-}
-	/* here we go with IPv6 */
-	addr6 = card->ip_current_state.ip6_ifa;
-	while (addr6) {
-		if (qeth_is_ipa_in_list6(addr6, card->ip_new_state.ip6_ifa)) {
-			addr6 = addr6->if_next;
-			continue;
-		}
-		QETH_DBF_TEXT3(0, trace, "setipdl6");
-		QETH_DBF_HEX3(0, trace, &addr6->addr.s6_addr,
-			      QETH_DBF_TRACE_LEN);
-		QETH_DBF_HEX3(0, trace,
-			      ((char *) (&addr6->addr.s6_addr)) +
-			      QETH_DBF_TRACE_LEN, QETH_DBF_TRACE_LEN);
-		sprintf(dbf_text, "nmsk%4u", addr6->prefix_len);
-		QETH_DBF_TEXT3(0, trace, dbf_text);
-		FILL_NETMASK(addr6->prefix_len);
-		result = qeth_send_delip(card,
-					 (__u8 *) & addr6->addr.s6_addr,
-					 (__u8 *) & netmask, 6);
-		if (result) {
-			PRINT_ERR("was not able to delete ip "
-				  "%04x:%04x:%04x:%04x:%04x:%04x:"
-				  "%04x:%04x/%u on device %s "
-				  "(result: 0x%x), "
-				  "trying to continue\n",
-				  addr6->addr.s6_addr16[0],
-				  addr6->addr.s6_addr16[1],
-				  addr6->addr.s6_addr16[2],
-				  addr6->addr.s6_addr16[3],
-				  addr6->addr.s6_addr16[4],
-				  addr6->addr.s6_addr16[5],
-				  addr6->addr.s6_addr16[6],
-				  addr6->addr.s6_addr16[7],
-				  addr6->prefix_len,
-				  CARD_BUS_ID(card), result);
- 			sprintf(dbf_text, "std6%4x", result);
- 			QETH_DBF_TEXT3(0, trace, dbf_text);
-		}
-		addr6 = addr6->if_next;
-	}
-
-	addr6 = card->ip_new_state.ip6_ifa;
-	while (addr6) {
-		if (qeth_is_ipa_in_list6(addr6,
-					  card->ip_current_state.ip6_ifa)) {
-			addr6 = addr6->if_next;
-			continue;
-		}
-		QETH_DBF_TEXT3(0, trace, "setipst6");
-		QETH_DBF_HEX3(0, trace, &addr6->addr.s6_addr,
-			      QETH_DBF_TRACE_LEN);
-		QETH_DBF_HEX3(0, trace,
-			      ((char *) (&addr6->addr.s6_addr)) +
-			      QETH_DBF_TRACE_LEN, QETH_DBF_TRACE_LEN);
-		sprintf(dbf_text, "nmsk%4u", addr6->prefix_len);
-		QETH_DBF_TEXT3(0, trace, dbf_text);
-		FILL_NETMASK(addr6->prefix_len);
-		result = qeth_send_setip(card,
-					 (__u8 *) & addr6->addr.s6_addr,
-					 (__u8 *) & netmask, 6,
-					 use_setip_retries);
-		if (!result) {
-			addr6 = addr6->if_next;
-			continue;
-		}
-		PRINT_ERR("was not able to set ip "
-			  "%04x:%04x:%04x:%04x:%04x:%04x:"
-			  "%04x:%04x/%u on device %s "
-			  "(result: 0x%x), trying to continue\n",
-			  addr6->addr.s6_addr16[0],
-			  addr6->addr.s6_addr16[1],
-			  addr6->addr.s6_addr16[2],
-			  addr6->addr.s6_addr16[3],
-			  addr6->addr.s6_addr16[4],
-			  addr6->addr.s6_addr16[5],
-			  addr6->addr.s6_addr16[6],
-			  addr6->addr.s6_addr16[7],
-			  addr6->prefix_len,
-			  CARD_BUS_ID(card), result);
- 		sprintf(dbf_text, "sts6%4x", result);
- 		QETH_DBF_TEXT3(0, trace, dbf_text);
-		addr6 = addr6->if_next;
-	}
-#endif /* QETH_IPV6 */
-}
-
-static int
-qeth_setips(struct qeth_card *card, int use_setip_retries)
-{
-	struct in_ifaddr *addr;
-	int result;
-	char dbf_text[15];
-
-	QETH_DBF_CARD3(0, trace, "stip", card);
-
-	addr = card->ip_current_state.ip_ifa;
-	while (addr) {
-		if (!qeth_is_ipa_in_list(addr, card->ip_new_state.ip_ifa)) {
-			QETH_DBF_TEXT3(0, trace, "setipdel");
-			*((__u32 *) (&dbf_text[0])) =
-			    *((__u32 *) & addr->ifa_address);
-			*((__u32 *) (&dbf_text[4])) =
-			    *((__u32 *) & addr->ifa_mask);
-			QETH_DBF_HEX3(0, trace, dbf_text, QETH_DBF_TRACE_LEN);
-			result =
-			    qeth_send_delip(card, (__u8 *) & addr->ifa_address,
-					    (__u8 *) & addr->ifa_mask, 4);
-			if (result) {
-				PRINT_ERR("was not able to delete ip "
-					  "%08x/%08x on device %s "
-					  "(result: 0x%x), "
-					  "trying to continue\n",
-					  addr->ifa_address, addr->ifa_mask,
-					  CARD_BUS_ID(card), result);
- 				sprintf(dbf_text, "stdl%4x", result);
- 				QETH_DBF_TEXT3(0, trace, dbf_text);
-			}
-		}
-		addr = addr->ifa_next;
-	}
-
-	addr = card->ip_new_state.ip_ifa;
-	while (addr) {
-		if (qeth_is_ipa_in_list(addr, card->ip_current_state.ip_ifa)) {
-			addr = addr->ifa_next;
-			continue;
-		}
-		QETH_DBF_TEXT3(0, trace, "setipset");
-		*((__u32 *) (&dbf_text[0])) = *((__u32 *) & addr->ifa_address);
-		*((__u32 *) (&dbf_text[4])) = *((__u32 *) & addr->ifa_mask);
-		QETH_DBF_HEX3(0, trace, dbf_text, QETH_DBF_TRACE_LEN);
-		result = qeth_send_setip(card, (__u8 *) & addr->ifa_address,
-					 (__u8 *) & addr->ifa_mask, 4,
-					 use_setip_retries);
-		if (!result) {
-			addr = addr->ifa_next;
-			continue;
-		}
-		PRINT_ERR("was not able to set ip "
-			  "%08x/%08x on device %s, trying to continue\n",
-			  addr->ifa_address, addr->ifa_mask,
-			  CARD_BUS_ID(card));
- 		sprintf(dbf_text, "stst%4x", result);
- 		QETH_DBF_TEXT3(0, trace, dbf_text);
-		addr = addr->ifa_next;
-	}
-
-	__qeth_setips_ipv6(card, use_setip_retries);
-
-	return 0;
-}
-
-static int
-qeth_is_ipma_in_list(struct qeth_ipm_mac *ipma, struct qeth_ipm_mac *list)
-{
-	while (list) {
-		if ((!memcmp(ipma->ip, list->ip, 16)) &&
-		    (!memcmp(ipma->mac, list->mac, 6)))
-			return 1;
-		list = list->next;
-	}
-	return 0;
-}
-
-static void
-qeth_remove_mc_ifa_from_list(struct qeth_ipm_mac **list,
-			     struct qeth_ipm_mac *ipma)
-{
-	struct qeth_ipm_mac *i, *li = NULL;
-
-	if ((!(*list)) || (!ipma))
-		return;
-
-	if (*list == ipma) {
-		*list = ipma->next;
-	} else {
-		i = *list;
-		while (i) {
-			if (i == ipma) {
-				li->next = i->next;
-			} else {
-				li = i;
-			}
-			i = i->next;
-		}
-	}
-}
-
-static int
-qeth_add_mc_ifa_to_list(struct qeth_ipm_mac **list, struct qeth_ipm_mac *ipma)
-{
-	struct qeth_ipm_mac *i;
-
-	if (qeth_is_ipma_in_list(ipma, *list))
-		return -EALREADY;
-
-	if (*list == NULL) {
-		*list = ipma;
-	} else {
-		i = *list;
-		while (i->next) {
-			i = i->next;
-		}
-		i->next = ipma;
-	}
-	ipma->next = NULL;
-	return 0;
-}
-
-static void
-__qeth_setipms_ipv6(struct qeth_card *card, int use_setipm_retries)
-{
-#ifdef QETH_IPV6
-	struct qeth_ipm_mac *addr;
-	int result;
-	char dbf_text[15];
-
-	/* here we go with IPv6 */
-	addr = card->ip_mc_current_state.ipm6_ifa;
-	while (addr) {
-		if (!qeth_is_ipma_in_list(addr,
-					  card->ip_mc_new_state.ipm6_ifa)) {
-			QETH_DBF_TEXT3(0, trace, "setimdl6");
-			QETH_DBF_HEX3(0, trace, &addr->ip[0],
-				      QETH_DBF_TRACE_LEN);
-			QETH_DBF_HEX3(0, trace,
-				      (&addr->ip[0]) + QETH_DBF_TRACE_LEN,
-				      QETH_DBF_TRACE_LEN);
-			QETH_DBF_HEX3(0, trace, &addr->mac,
-				      QETH_DBF_TRACE_LEN);
-			result = qeth_send_delipm(card,
-						  (__u8 *) & addr->ip[0],
-						  (__u8 *) addr->mac, 6);
-			if (result) {
-				PRINT_ERR("was not able to delete "
-					  "multicast ip %04x:%04x:"
-					  "%04x:%04x:%04x:%04x:%04x:%04x/"
-					  "%02x%02x%02x%02x%02x%02x "
-					  "on device %s (result: 0x%x), "
-					  "trying to continue\n",
-					  *((__u16 *) & addr->ip[0]),
-					  *((__u16 *) & addr->ip[2]),
-					  *((__u16 *) & addr->ip[4]),
-					  *((__u16 *) & addr->ip[6]),
-					  *((__u16 *) & addr->ip[8]),
-					  *((__u16 *) & addr->ip[10]),
-					  *((__u16 *) & addr->ip[12]),
-					  *((__u16 *) & addr->ip[14]),
-					  addr->mac[0], addr->mac[1],
-					  addr->mac[2], addr->mac[3],
-					  addr->mac[4], addr->mac[5],
-					  CARD_BUS_ID(card), result);
- 				sprintf(dbf_text, "smd6%4x", result);
- 				QETH_DBF_TEXT3(0, trace, dbf_text);
-			}
-		}
-		addr = addr->next;
-	}
-
-	addr = card->ip_mc_new_state.ipm6_ifa;
-	while (addr) {
-		if (qeth_is_ipma_in_list(addr,
-					 card->ip_mc_current_state.ipm6_ifa)) {
-			qeth_remove_mc_ifa_from_list(
-					&card->ip_mc_new_state.ipm6_ifa,
-					addr);
-			addr = addr->next;
-			continue;
-		}
-		QETH_DBF_TEXT3(0, trace, "setimst6");
-		QETH_DBF_HEX3(0, trace, &addr->ip[0], QETH_DBF_TRACE_LEN);
-		QETH_DBF_HEX3(0, trace, (&addr->ip[0]) + QETH_DBF_TRACE_LEN,
-			      QETH_DBF_TRACE_LEN);
-		QETH_DBF_HEX3(0, trace, &addr->mac, QETH_DBF_TRACE_LEN);
-		result = qeth_send_setipm(card,
-					  (__u8 *) & addr->ip[0],
-					  (__u8 *) addr->mac, 6,
-					  use_setipm_retries);
-		if (result) {
-			PRINT_ERR("was not able to set "
-				  "multicast ip %04x:%04x:"
-				  "%04x:%04x:%04x:%04x:%04x:%04x/"
-				  "%02x%02x%02x%02x%02x%02x "
-				  "on device %s (result: 0x%x), "
-				  "trying to continue\n",
-				  *((__u16 *) & addr->ip[0]),
-				  *((__u16 *) & addr->ip[2]),
-				  *((__u16 *) & addr->ip[4]),
-				  *((__u16 *) & addr->ip[6]),
-				  *((__u16 *) & addr->ip[8]),
-				  *((__u16 *) & addr->ip[10]),
-				  *((__u16 *) & addr->ip[12]),
-				  *((__u16 *) & addr->ip[14]),
-				  addr->mac[0], addr->mac[1],
-				  addr->mac[2], addr->mac[3],
-				  addr->mac[4], addr->mac[5],
-				  CARD_BUS_ID(card), result);
- 			sprintf(dbf_text, "sms6%4x", result);
- 			QETH_DBF_TEXT3(0, trace, dbf_text);
-		} else {
-			qeth_remove_mc_ifa_from_list(
-					&card->ip_mc_new_state.ipm6_ifa,
-					addr);
-			qeth_add_mc_ifa_to_list(
-					&card->ip_mc_current_state.ipm6_ifa,
-					addr);
-		}
-		addr = addr->next;
-	}
-#endif /* QETH_IPV6 */
-}
-
-static int
-qeth_setipms(struct qeth_card *card, int use_setipm_retries)
-{
-	struct qeth_ipm_mac *addr;
-	int result;
-	char dbf_text[15];
-
-	QETH_DBF_CARD3(0, trace, "stim", card);
-
-	if (!qeth_is_supported(IPA_MULTICASTING))
-		return 0;
-	addr = card->ip_mc_current_state.ipm_ifa;
-	while (addr) {
-		if (!qeth_is_ipma_in_list(addr,
-					  card->ip_mc_new_state.ipm_ifa)) {
-			QETH_DBF_TEXT3(0, trace, "setimdel");
-			sprintf(dbf_text, "%08x", *((__u32 *) & addr->ip[0]));
-			QETH_DBF_TEXT3(0, trace, dbf_text);
-			*((__u32 *) (&dbf_text[0])) = *((__u32 *) & addr->mac);
-			*((__u32 *) (&dbf_text[4])) = 
-				*(((__u32 *) & addr->mac) + 1);
-			QETH_DBF_HEX3(0, trace, dbf_text,
-				      QETH_DBF_TRACE_LEN);
-			result = qeth_send_delipm(card,
-						  (__u8 *) & addr->ip[0],
-						  (__u8 *) addr->mac, 4);
-			if (result) {
-				PRINT_ERR("was not able to delete "
-					  "multicast ip %08x/"
-					  "%02x%02x%02x%02x%02x%02x "
-					  "on device %s "
-					  "(result: 0x%x), "
-					  "trying to continue\n",
-					  *((__u32 *) & addr->ip[0]),
-					  addr->mac[0], addr->mac[1],
-					  addr->mac[2], addr->mac[3],
-					  addr->mac[4], addr->mac[5],
-					  CARD_BUS_ID(card), result);
-				sprintf(dbf_text, "smdl%4x", result);
-				QETH_DBF_TEXT3(0, trace, dbf_text);
-			}
-		}
-		addr = addr->next;
-	}
-
-	addr = card->ip_mc_new_state.ipm_ifa;
-	while (addr) {
-		if (qeth_is_ipma_in_list(addr,
-					 card->ip_mc_current_state.ipm_ifa)) {
-			addr = addr->next;
-			continue;
-		}
-		QETH_DBF_TEXT3(0, trace, "setimset");
-		sprintf(dbf_text, "%08x", *((__u32 *) & addr->ip[0]));
-		QETH_DBF_TEXT3(0, trace, dbf_text);
-		*((__u32 *) (&dbf_text[0])) = *((__u32 *) & addr->mac);
-		*((__u32 *) (&dbf_text[4])) = *(((__u32 *) & addr->mac) + 1);
-		QETH_DBF_HEX3(0, trace, dbf_text, QETH_DBF_TRACE_LEN);
-		result = qeth_send_setipm(card, (__u8 *) & addr->ip[0],
-					  (__u8 *) addr->mac, 4,
-					  use_setipm_retries);
-		if (result) {
-			PRINT_ERR("was not able to set multicast ip %08x/"
-				  "%02x%02x%02x%02x%02x%02x "
-				  "on device %s (result: 0x%x), "
-				  "trying to continue\n",
-				  *((__u32 *) & addr->ip[0]),
-				  addr->mac[0], addr->mac[1],
-				  addr->mac[2], addr->mac[3],
-				  addr->mac[4], addr->mac[5],
-				  CARD_BUS_ID(card), result);
-			sprintf(dbf_text, "smst%4x", result);
-			QETH_DBF_TEXT3(0, trace, dbf_text);
-			qeth_remove_mc_ifa_from_list
-				(&card->ip_mc_current_state.ipm_ifa, addr);
-		}
-		addr = addr->next;
-	}
-	__qeth_setipms_ipv6(card, use_setipm_retries);
-	return 0;
-}
-
-static void
-qeth_clone_ifa(struct in_ifaddr *src, struct in_ifaddr *dest)
-{
-	memcpy(dest, src, sizeof (struct in_ifaddr));
-	dest->ifa_next = NULL;
-}
-
-#ifdef QETH_IPV6
-static void
-qeth_clone_ifa6(struct inet6_ifaddr *src, struct inet6_ifaddr *dest)
-{
-	memcpy(dest, src, sizeof (struct inet6_ifaddr));
-	dest->if_next = NULL;
-}
-#endif /* QETH_IPV6 */
-
-#define QETH_STANDARD_RETVALS \
-		ret_val=-EIO; \
-		if (result == -EFAULT) ret_val = -EFAULT; \
-                if (result==IPA_REPLY_SUCCESS) ret_val=0; \
-		if (result==IPA_REPLY_FAILED) ret_val=-EIO; \
-		if (result==IPA_REPLY_OPNOTSUPP) ret_val=-EOPNOTSUPP
-
-static int
-qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
-{
-	char *data;
-	int result, i, ret_val;
-	int version = 4;
-	struct qeth_card *card;
-	char dbf_text[15];
-	char buff[100];
-
-	card = (struct qeth_card *) dev->priv;
-
-	PRINT_STUPID("CALL: qeth_do_ioctl called with cmd %i (=0x%x).\n", cmd,
-		     cmd);
-	QETH_DBF_CARD2(0, trace, "ioct", card);
-	sprintf(dbf_text, "cmd=%4x", cmd);
-	QETH_DBF_TEXT2(0, trace, dbf_text);
-	QETH_DBF_HEX2(0, trace, &rq, sizeof (void *));
-
-	if ((cmd < SIOCDEVPRIVATE) || (cmd > SIOCDEVPRIVATE + 5))
-		return -EOPNOTSUPP;
-	if (copy_from_user(buff, rq->ifr_ifru.ifru_data, sizeof (buff)))
-		return -EFAULT;
-	data = buff;
-
-	if ((!atomic_read(&card->is_registered)) ||
-	    (!atomic_read(&card->is_hardsetup)))
-		return -ENODEV;
-
-	if (atomic_read(&card->shutdown_phase))
-		return -ENODEV;
-
-	spin_lock(&card->ioctl_lock);
-
-	if (atomic_read(&card->shutdown_phase)) {
-		ret_val = -ENODEV;
-		goto out;
-	}
-	if ((!atomic_read(&card->is_registered)) ||
-	    (!atomic_read(&card->is_hardsetup))) {
-		ret_val = -ENODEV;
-		goto out;
-	}
-
-	switch (cmd) {
-	case SIOCDEVPRIVATE + 0:
-		if (!capable(CAP_NET_ADMIN)) {
-			ret_val = -EPERM;
-			break;
-		}
-		result =
-		    qeth_send_setassparms(card, version, IPA_ARP_PROCESSING,
-					  IPA_CMD_ASS_ARP_SET_NO_ENTRIES,
-					  rq->ifr_ifru.ifru_ivalue, 4);
-		QETH_STANDARD_RETVALS;
-		if (result == 3)
-			ret_val = -EINVAL;
-		break;
-	case SIOCDEVPRIVATE + 1:
-		if (!capable(CAP_NET_ADMIN)) {
-			ret_val = -EPERM;
-			break;
-		}
-		result = qeth_queryarp(card, rq, version, IPA_ARP_PROCESSING,
-				       IPA_CMD_ASS_ARP_QUERY_INFO, data, 4);
-
-		QETH_STANDARD_RETVALS;
-		break;
-	case SIOCDEVPRIVATE + 2:
-		if (!capable(CAP_NET_ADMIN)) {
-			ret_val = -EPERM;
-			break;
-		}
-		for (i = 12; i < 24; i++)
-			if (data[i])
-				version = 6;
-		result =
-		    qeth_send_setassparms(card, version, IPA_ARP_PROCESSING,
-					  IPA_CMD_ASS_ARP_ADD_ENTRY,
-					  (long) data, 56);
-		QETH_STANDARD_RETVALS;
-		break;
-	case SIOCDEVPRIVATE + 3:
-		if (!capable(CAP_NET_ADMIN)) {
-			ret_val = -EPERM;
-			break;
-		}
-		for (i = 4; i < 12; i++)
-			if (data[i])
-				version = 6;
-		result =
-		    qeth_send_setassparms(card, version, IPA_ARP_PROCESSING,
-					  IPA_CMD_ASS_ARP_REMOVE_ENTRY,
-					  (long) data, 16);
-		QETH_STANDARD_RETVALS;
-		break;
-	case SIOCDEVPRIVATE + 4:
-		if (!capable(CAP_NET_ADMIN)) {
-			ret_val = -EPERM;
-			break;
-		}
-		result =
-		    qeth_send_setassparms(card, version, IPA_ARP_PROCESSING,
-					  IPA_CMD_ASS_ARP_FLUSH_CACHE, 0, 0);
-		QETH_STANDARD_RETVALS;
-		break;
-	case SIOCDEVPRIVATE + 5:
-
-		result =
-		    qeth_send_snmp_control(card, rq, IPA_CMD_SETADAPTERPARMS,
-					   IPA_SETADP_SET_SNMP_CONTROL, data,
-					   4);
-		QETH_STANDARD_RETVALS;
-		break;
-
-	default:
-		ret_val = -EOPNOTSUPP;
-		goto out;
-	}
-out:
-	spin_unlock(&card->ioctl_lock);
-
-	sprintf(dbf_text, "ret=%4x", ret_val);
-	QETH_DBF_TEXT2(0, trace, dbf_text);
-
-	return ret_val;
-}
-
-static void
-qeth_clear_ifamc_list(struct qeth_ipm_mac **ifa_list)
-{
-	struct qeth_ipm_mac *ifa;
-	while (*ifa_list) {
-		ifa = *ifa_list;
-		*ifa_list = ifa->next;
-		kfree(ifa);
-	}
-}
-
-#ifdef QETH_IPV6
-static void
-qeth_clear_ifa6_list(struct inet6_ifaddr **ifa_list)
-{
-	struct inet6_ifaddr *ifa;
-	while (*ifa_list) {
-		ifa = *ifa_list;
-		*ifa_list = ifa->if_next;
-		kfree(ifa);
-	}
-}
-
-static inline void
-__qeth_append_vlan_ipas_v6(struct qeth_card *card)
-{
-#ifdef QETH_VLAN
-	char dbf_text[15];
-	struct vlan_group *card_group;
-	int i;
-	int remove;
-	struct inet6_ifaddr *ifa, *ifanew;
-
-	/*
-	 * append all known VLAN IP Addresses corresponding to the real device
-	 * card->dev->ifindex
-	 */
-	QETH_DBF_TEXT4(0, trace, "to-vip6s");
-	if ((!qeth_is_supported(IPA_FULL_VLAN)) || (!atomic_read(&card->is_open)))
-		return;
-
-	card_group = (struct vlan_group *) card->vlangrp;
-	
-	if (!card_group)
-		return;
-	for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
-		if (!card_group->vlan_devices[i] ||
-		    !(card_group->vlan_devices[i]->flags & IFF_UP) ||
-		    !(struct inet6_dev *) card_group->vlan_devices[i]->ip6_ptr)
-			continue;
-		ifa = ((struct inet6_dev *)
-		       card_group->vlan_devices[i]->ip6_ptr)->addr_list;
-		
-		while (ifa) {
-			ifanew = kmalloc(sizeof(struct inet6_ifaddr),
-					 GFP_KERNEL);
-			if (!ifanew) {
-				PRINT_WARN("No memory for IP address "
-					   "handling. Some of the IPs "
-					   "will not be set on %s.\n",
-					   card->dev_name);
-				QETH_DBF_TEXT2(0, trace, "TOIPNMEM");
-			} else {
-				qeth_clone_ifa6(ifa, ifanew);
-				remove = qeth_add_ifa6_to_list
-					(&card->ip_new_state.ip6_ifa, ifanew);
-				QETH_DBF_HEX4(0, trace,
-					      &ifanew->addr.s6_addr,
-					      QETH_DBF_TRACE_LEN);
-				QETH_DBF_HEX4(0, trace,
-					      &ifanew->addr.s6_addr +
-					      QETH_DBF_TRACE_LEN,
-					      QETH_DBF_TRACE_LEN);
-				sprintf(dbf_text, "pref%4u", ifanew->prefix_len);
-				QETH_DBF_TEXT4(0, trace, dbf_text);
-				if (remove) {
-					kfree(ifanew);
-					QETH_DBF_TEXT4(0, trace, "alrdv6rm");
-				}
-			}
-			ifa = ifa->if_next;
-		}
-	}
-#endif
-}
-
-static inline void
-__qeth_append_vlan_ipas_v6_mc(struct qeth_card *card)
-{
-#ifdef QETH_VLAN
-	struct vlan_group *card_group;
-	int i;
-	int remove;
-	struct inet6_dev *in6_vdev;
-	char buf[MAX_ADDR_LEN];
-	struct qeth_ipm_mac *ipmanew;
-	struct ifmcaddr6 *im6;
-	
-	QETH_DBF_TEXT4(0, trace, "tovipm6s");
-	if (!qeth_is_supported(IPA_FULL_VLAN) || !atomic_read(&card->is_open))
-		return;
-
-	card_group = (struct vlan_group *) card->vlangrp;
-	if (!card_group)
-		return;
-
-	for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
-		if (!card_group->vlan_devices[i] ||
-		    !(card_group->vlan_devices[i]->flags & IFF_UP))
-			continue;
-		
-		in6_vdev = in6_dev_get(card_group->vlan_devices[i]);
-		if (!in6_vdev) {
-			QETH_DBF_CARD2(0, trace, "id26", card);
-			continue;
-		}
-
-		read_lock(&in6_vdev->lock);
-		for (im6 = in6_vdev->mc_list; im6; im6 = im6->next) {
-			ndisc_mc_map(&im6->mca_addr, buf,
-				     card_group->vlan_devices[i], 0);
-			ipmanew = (struct qeth_ipm_mac *)
-				kmalloc(sizeof(struct qeth_ipm_mac), GFP_KERNEL);
-			if (!ipmanew) {
-				PRINT_WARN("No memory for IPM address "
-					   "handling. Multicast IP "
-					   "%04x:%04x:%04x:%04x:%04x:"
-					   "%04x:%04x:%04x"
-					   "will not be set on %s.\n",
-					   im6->mca_addr.s6_addr16[0],
-					   im6->mca_addr.s6_addr16[1],
-					   im6->mca_addr.s6_addr16[2],
-					   im6->mca_addr.s6_addr16[3],
-					   im6->mca_addr.s6_addr16[4],
-					   im6->mca_addr.s6_addr16[5],
-					   im6->mca_addr.s6_addr16[6],
-					   im6->mca_addr.s6_addr16[7],
-					   card->dev_name);
-				QETH_DBF_TEXT2(0, trace, "TOIPMNMM");
-			} else {
-				memset(ipmanew, 0, sizeof(struct qeth_ipm_mac));
-				memcpy(ipmanew->mac, buf,OSA_ADDR_LEN);
-				memcpy(ipmanew->ip, im6->mca_addr.s6_addr, 16);
-				ipmanew->next = NULL;
-				remove = qeth_add_mc_ifa_to_list
-					(&card->ip_mc_new_state.ipm6_ifa,
-						 ipmanew);
-				QETH_DBF_HEX4(0, trace, &ipmanew->ip,
-					      QETH_DBF_TRACE_LEN);
-				QETH_DBF_HEX4(0, trace, &ipmanew->ip +
-					      QETH_DBF_TRACE_LEN,
-					      QETH_DBF_TRACE_LEN);
-				QETH_DBF_HEX4(0, trace, &ipmanew->mac,
-					      QETH_DBF_TRACE_LEN);
-				
-				if (remove) {
-					QETH_DBF_TEXT4(0, trace, "mlrdv6rm");
-					kfree(ipmanew);
-				}
-			}
-		}
-		read_unlock(&in6_vdev->lock);
-		in6_dev_put(in6_vdev);
-	}
-#endif
-}
-
-static struct inet6_dev *
-__qeth_get_mc_lock_v6(struct qeth_card *card)
-{
-	struct inet6_dev *in6_dev;
-
-	in6_dev = in6_dev_get(card->dev);
-
-	if (!in6_dev) {
-		QETH_DBF_CARD2(0, trace, "id16", card);
-		return ERR_PTR(-ENODEV);
-	}
-	read_lock(&in6_dev->lock);
-	return in6_dev;
-}
-
-static void
-__qeth_takeover_ip_ipms6_mc(struct qeth_card *card, struct inet6_dev *in6_dev)
-{
-	int remove;
-	struct qeth_ipm_mac *ipmanew;
-	struct ifmcaddr6 *im6;
-	char buf[MAX_ADDR_LEN];
-
-	QETH_DBF_TEXT4(0, trace, "to-ipm6s");
-	if (atomic_read(&card->is_open))
-		for (im6 = in6_dev->mc_list; im6; im6 = im6->next) {
-			ndisc_mc_map(&im6->mca_addr, buf, card->dev, 0);
-			ipmanew =
-			    (struct qeth_ipm_mac *)
-			    kmalloc(sizeof (struct qeth_ipm_mac), GFP_ATOMIC);
-			if (!ipmanew) {
-				PRINT_WARN("No memory for IPM address "
-					   "handling. Multicast IP "
-					   "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x"
-					   "will not be set on %s.\n",
-					   im6->mca_addr.s6_addr16[0],
-					   im6->mca_addr.s6_addr16[1],
-					   im6->mca_addr.s6_addr16[2],
-					   im6->mca_addr.s6_addr16[3],
-					   im6->mca_addr.s6_addr16[4],
-					   im6->mca_addr.s6_addr16[5],
-					   im6->mca_addr.s6_addr16[6],
-					   im6->mca_addr.s6_addr16[7],
-					   card->dev_name);
-				QETH_DBF_TEXT2(0, trace, "TOIPMNMM");
-			} else {
-				memset(ipmanew, 0,
-				       sizeof (struct qeth_ipm_mac));
-				memcpy(ipmanew->mac, buf, OSA_ADDR_LEN);
-				memcpy(ipmanew->ip, im6->mca_addr.s6_addr, 16);
-				ipmanew->next = NULL;
-				remove =
-				    qeth_add_mc_ifa_to_list(&card->
-							    ip_mc_new_state.
-							    ipm6_ifa, ipmanew);
-				QETH_DBF_HEX4(0, trace, &ipmanew->ip,
-					      QETH_DBF_TRACE_LEN);
-				QETH_DBF_HEX4(0, trace,
-					      &ipmanew->ip + QETH_DBF_TRACE_LEN,
-					      QETH_DBF_TRACE_LEN);
-				QETH_DBF_HEX4(0, trace, &ipmanew->mac,
-					      QETH_DBF_TRACE_LEN);
-				if (remove) {
-					QETH_DBF_TEXT4(0, trace, "mlrdy6rm");
-					kfree(ipmanew);
-				}
-			}
-		}
-	__qeth_append_vlan_ipas_v6_mc(card);
-
-	read_unlock(&in6_dev->lock);
-	in6_dev_put(in6_dev);
-}
-#endif /* QETH_IPV6 */
-
-static void
-qeth_takeover_ip_ipms6(struct qeth_card *card)
-{
-#ifdef QETH_IPV6
-	struct inet6_ifaddr *ifa, *ifanew;
-	char dbf_text[15];
-	int remove;
-	struct inet6_dev *in6_dev;
-
-	QETH_DBF_CARD3(0, trace, "tip6", card);
-	/* unicast */
-	/* clear ip_current_state */
-	qeth_clear_ifa6_list(&card->ip_current_state.ip6_ifa);
-	/* take it over */
-	card->ip_current_state.ip6_ifa = card->ip_new_state.ip6_ifa;
-	card->ip_new_state.ip6_ifa = NULL;
-
-	in6_dev = __qeth_get_mc_lock_v6(card);
-	if (PTR_ERR(in6_dev) == -ENODEV)
-		return;
-	/* get new one, we try to have the same order as ifa_list in device
-	   structure, for what reason ever */
-	QETH_DBF_TEXT4(0, trace, "to-ip6s");
-	if ((atomic_read(&card->is_open)) && (card->dev->ip6_ptr) &&
-	    (((struct inet6_dev *) card->dev->ip6_ptr)->addr_list)) {
-		ifa = ((struct inet6_dev *) card->dev->ip6_ptr)->addr_list;
-
-		while (ifa) {
-			ifanew =
-			    kmalloc(sizeof (struct inet6_ifaddr), GFP_ATOMIC);
-			if (!ifanew) {
-				PRINT_WARN("No memory for IP address "
-					   "handling. Some of the IPs "
-					   "will not be set on %s.\n",
-					   card->dev_name);
-				QETH_DBF_TEXT2(0, trace, "TOIPNMEM");
-			} else {
-				qeth_clone_ifa6(ifa, ifanew);
-				remove =
-				    qeth_add_ifa6_to_list(&card->ip_new_state.
-							  ip6_ifa, ifanew);
-				QETH_DBF_HEX4(0, trace, &ifanew->addr.s6_addr,
-					      QETH_DBF_TRACE_LEN);
-				QETH_DBF_HEX4(0, trace,
-					      &ifanew->addr.s6_addr +
-					      QETH_DBF_TRACE_LEN,
-					      QETH_DBF_TRACE_LEN);
-				sprintf(dbf_text, "pref%4u",
-					ifanew->prefix_len);
-				QETH_DBF_TEXT4(0, trace, dbf_text);
-				if (remove) {
-					kfree(ifanew);
-					QETH_DBF_TEXT4(0, trace, "alrdy6rm");
-				}
-			}
-			ifa = ifa->if_next;
-		}
-	}
-
-	__qeth_append_vlan_ipas_v6(card);
-	
-	__qeth_takeover_ip_ipms6_mc(card, in6_dev);
-#endif /* QETH_IPV6 */
-}
-
-static void
-qeth_clear_ifa4_list(struct in_ifaddr **ifa_list)
-{
-	struct in_ifaddr *ifa;
-	while (*ifa_list) {
-		ifa = *ifa_list;
-		*ifa_list = ifa->ifa_next;
-		kfree(ifa);
-	}
-}
-
-static inline void
-__qeth_append_vlan_ipas_v4(struct qeth_card *card)
-{
-#ifdef QETH_VLAN
-	struct in_ifaddr *ifa, *ifanew;
-	char dbf_text[15];
-	struct vlan_group *card_group;
-	int i;
-	int remove;
-	struct in_device *vin4_dev;
-
-	/*
-	 * append all known VLAN IP Addresses corresponding to the real device
-	 * card->dev->ifindex
-	 */
-	QETH_DBF_TEXT4(0, trace, "to-vips");
-	if (!qeth_is_supported(IPA_FULL_VLAN) || !atomic_read(&card->is_open))
-		return;
-
-	card_group = (struct vlan_group *) card->vlangrp;
-	if (!card_group)
-		return;
-
-	for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
-		vin4_dev = in_dev_get(card->dev);
-		if (!vin4_dev) {
-			QETH_DBF_TEXT2(0, trace, "nodvhol2");
-			QETH_DBF_TEXT2(0, trace, card->dev_name);
-			continue;
-		}
-		read_lock(&vin4_dev->lock);
-
-		if ((card_group->vlan_devices[i]) &&
-		    (card_group->vlan_devices[i]->flags & IFF_UP)) {
-			ifa = ((struct in_device *)
-			       card_group->vlan_devices[i]->ip_ptr)->ifa_list;
-			while (ifa) {
-				ifanew = kmalloc(sizeof(struct in_ifaddr),
-						 GFP_KERNEL);
-				if (!ifanew) {
-					PRINT_WARN("No memory for IP address "
-						   "handling. Some of the IPs "
-						   "will not be set on %s.\n",
-						   card->dev_name);
-					QETH_DBF_TEXT2(0, trace, "TOIPNMEM");
-				} else {
-					qeth_clone_ifa(ifa, ifanew);
-					remove = qeth_add_ifa_to_list
-						(&card->ip_new_state.ip_ifa,
-						 ifanew);
-					*((__u32*) (&dbf_text[0])) =
-						*((__u32*) &ifanew->ifa_address);
-					*((__u32*) (&dbf_text[4])) =
-						*((__u32*) &ifanew->ifa_mask);
-					QETH_DBF_TEXT4(0, trace, dbf_text);
-					if (remove) {
-						kfree(ifanew);
-						QETH_DBF_TEXT4(0, trace,
-							       "alrdv4rm");
-					}
-				}
-				ifa = ifa->ifa_next;
-			}
-		}		
-
-		read_unlock(&vin4_dev->lock);
-		in_dev_put(vin4_dev);
-	}
-#endif /* QETH_VLAN */
-
-}
-
-static inline void
-__qeth_append_vlan_ipas_v4_mc(struct qeth_card *card)
-{
-#ifdef QETH_VLAN
-	char dbf_text[15];
-	int i;
-	int remove;
-	struct vlan_group *card_group;
-	struct in_device *vin4_dev;
-	struct qeth_ipm_mac *ipmanew;
-	struct ip_mc_list *im4;
-	char buf[MAX_ADDR_LEN];
-	__u32 maddr;
-	
-	QETH_DBF_TEXT4(0, trace, "to-vipms");
-	if (!qeth_is_supported(IPA_FULL_VLAN) || !atomic_read(&card->is_open))
-		return;
-
-	card_group = (struct vlan_group *) card->vlangrp;
-	if (!card_group)
-		return;
-
-	for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
-		if (!card_group->vlan_devices[i] ||
-		    !(card_group->vlan_devices[i]->flags & IFF_UP))
-			continue;
-
-		vin4_dev = in_dev_get(card_group->vlan_devices[i]);
-		if (!vin4_dev) {
-			QETH_DBF_TEXT2(0, trace, "novdhol3");
-			QETH_DBF_TEXT2(0, trace, card->dev_name);
-			QETH_DBF_TEXT2(0, trace,
-				       card_group->vlan_devices[i]->name);
-			continue;
-		}
-		read_lock(&vin4_dev->lock);
-		for (im4 = vin4_dev->mc_list; im4; im4 = im4->next) {
-			qeth_get_mac_for_ipm(im4->multiaddr, buf, vin4_dev->dev);
-			ipmanew = (struct qeth_ipm_mac *)
-				kmalloc(sizeof(struct qeth_ipm_mac), GFP_KERNEL);
-			if (!ipmanew) {
-				PRINT_WARN("No memory for IPM address "
-					   "handling. Multicast VLAN IP %08x"
-					   "will not be set on %s.\n",
-					   (__u32) im4->multiaddr,
-					   card->dev_name);
-				QETH_DBF_TEXT2(0, trace, "TOIPMNMM");
-			} else {
-				memset(ipmanew, 0, sizeof(struct qeth_ipm_mac));
-				memcpy(ipmanew->mac, buf, OSA_ADDR_LEN);
-				maddr = im4->multiaddr;
-				memcpy(&(ipmanew->ip[0]), &maddr, 4);
-				memset(&(ipmanew->ip[4]), 0xff, 12);
-				ipmanew->next = NULL;
-				remove = qeth_add_mc_ifa_to_list
-					(&card->ip_mc_new_state.ipm_ifa,
-					 ipmanew);
-				sprintf(dbf_text, "%08x",
-					*((__u32 *) &ipmanew->ip));
-				QETH_DBF_TEXT4(0, trace, dbf_text);
-				QETH_DBF_HEX4(0, trace, &ipmanew->mac,
-					      QETH_DBF_TRACE_LEN);
-				if (remove) {
-					QETH_DBF_TEXT4(0, trace, "mlrdv4rm");
-					kfree(ipmanew);
-				}
-			}
-		}
-		read_unlock(&vin4_dev->lock);
-		in_dev_put(vin4_dev);
-	}
-#endif /* QETH_VLAN */
-
-}
-
-static struct in_device *
-__qeth_get_mc_lock(struct qeth_card *card)
-{
-	struct in_device *in4_dev;
-
-	/* multicast */
-	/* clear ip_mc_current_state */
-	qeth_clear_ifamc_list(&card->ip_mc_current_state.ipm_ifa);
-	/* take it over */
-	card->ip_mc_current_state.ipm_ifa = card->ip_mc_new_state.ipm_ifa;
-	/* get new one, we try to have the same order as ifa_list in device
-	   structure, for what reason ever */
-	card->ip_mc_new_state.ipm_ifa = NULL;
-
-	in4_dev = in_dev_get(card->dev);
-	if (!in4_dev) {
-		QETH_DBF_TEXT2(0, trace, "nodvhol1");
-		QETH_DBF_TEXT2(0, trace, card->dev_name);
-		return ERR_PTR(-ENODEV);
-	}
-	read_lock(&in4_dev->lock);
-	return in4_dev;
-}
-
-static void
-__qeth_takeover_ip_ipms_mc(struct qeth_card *card, struct in_device *in4_dev)
-{
-	char dbf_text[15];
-	int remove;
-	struct qeth_ipm_mac *ipmanew;
-	struct ip_mc_list *im4;
-	char buf[MAX_ADDR_LEN];
-	__u32 maddr;
-
-	QETH_DBF_TEXT4(0, trace, "to-ipms");
-	if (atomic_read(&card->is_open))
-		for (im4 = in4_dev->mc_list; im4; im4 = im4->next) {
-			qeth_get_mac_for_ipm(im4->multiaddr, buf, in4_dev->dev);
-			ipmanew =
-			    (struct qeth_ipm_mac *)
-			    kmalloc(sizeof (struct qeth_ipm_mac), GFP_ATOMIC);
-			if (!ipmanew) {
-				PRINT_WARN("No memory for IPM address "
-					   "handling. Multicast IP %08x"
-					   "will not be set on %s.\n",
-					   (__u32) im4->multiaddr,
-					   card->dev_name);
-				QETH_DBF_TEXT2(0, trace, "TOIPMNMM");
-			} else {
-				memset(ipmanew, 0,
-				       sizeof (struct qeth_ipm_mac));
-				memcpy(ipmanew->mac, buf, OSA_ADDR_LEN);
-				maddr = im4->multiaddr;
-				memcpy(&(ipmanew->ip[0]), &maddr, 4);
-				memset(&(ipmanew->ip[4]), 0xff, 12);
-				ipmanew->next = NULL;
-				remove =
-				    qeth_add_mc_ifa_to_list(&card->
-							    ip_mc_new_state.
-							    ipm_ifa, ipmanew);
-				sprintf(dbf_text, "%08x",
-					*((__u32 *) & ipmanew->ip));
-				QETH_DBF_TEXT4(0, trace, dbf_text);
-				QETH_DBF_HEX4(0, trace, &ipmanew->mac,
-					      QETH_DBF_TRACE_LEN);
-				if (remove) {
-					QETH_DBF_TEXT4(0, trace, "mlrdy4rm");
-					kfree(ipmanew);
-				}
-			}
-		}
-	__qeth_append_vlan_ipas_v4(card);
-
-	read_unlock(&in4_dev->lock);
-	in_dev_put(in4_dev);
-
-}
-
-static void
-qeth_takeover_ip_ipms(struct qeth_card *card)
-{
-	struct in_ifaddr *ifa, *ifanew;
-	char dbf_text[15];
-	int remove;
-	struct in_device *in4_dev;
-
-	QETH_DBF_CARD3(0, trace, "tips", card);
-	/* unicast */
-	/* clear ip_current_state */
-	qeth_clear_ifa4_list(&card->ip_current_state.ip_ifa);
-	/* take it over */
-	card->ip_current_state.ip_ifa = card->ip_new_state.ip_ifa;
-	card->ip_new_state.ip_ifa = NULL;
-
-	in4_dev = __qeth_get_mc_lock(card);
-	if (PTR_ERR(in4_dev) == -ENODEV)
-		return;
-
-	/* get new one, we try to have the same order as ifa_list in device
-	   structure, for what reason ever */
-	QETH_DBF_TEXT4(0, trace, "to-ips");
-	if ((atomic_read(&card->is_open)) && (card->dev->ip_ptr) &&
-	    (((struct in_device *) card->dev->ip_ptr)->ifa_list)) {
-		ifa = ((struct in_device *) card->dev->ip_ptr)->ifa_list;
-
-		while (ifa) {
-			ifanew = kmalloc(sizeof (struct in_ifaddr), GFP_ATOMIC);
-			if (!ifanew) {
-				PRINT_WARN("No memory for IP address "
-					   "handling. Some of the IPs "
-					   "will not be set on %s.\n",
-					   card->dev_name);
-				QETH_DBF_TEXT2(0, trace, "TOIPNMEM");
-			} else {
-				qeth_clone_ifa(ifa, ifanew);
-				remove =
-				    qeth_add_ifa_to_list(&card->ip_new_state.
-							 ip_ifa, ifanew);
-				*((__u32 *) (&dbf_text[0])) =
-				    *((__u32 *) & ifanew->ifa_address);
-				*((__u32 *) (&dbf_text[4])) =
-				    *((__u32 *) & ifanew->ifa_mask);
-				QETH_DBF_TEXT4(0, trace, dbf_text);
-				if (remove) {
-					kfree(ifanew);
-					QETH_DBF_TEXT4(0, trace, "alrdy4rm");
-				}
-			}
-
-			ifa = ifa->ifa_next;
-		}
-	}
-	__qeth_append_vlan_ipas_v4(card);
-
-	__qeth_takeover_ip_ipms_mc(card, in4_dev);
-}
-
-static void
-qeth_get_unique_id(struct qeth_card *card)
-{
-#ifdef QETH_IPV6
-	struct ipa_cmd cmd;
-	int result;
-	char dbf_text[15];
-
-	if (!qeth_is_supported(IPA_IPv6)) {
-		card->unique_id = UNIQUE_ID_IF_CREATE_ADDR_FAILED |
-		    UNIQUE_ID_NOT_BY_CARD;
-		return;
-	}
-	qeth_fill_ipa_cmd(card, &cmd, IPA_CMD_CREATE_ADDR, 6);
-
-	*((__u16 *) & cmd.data.create_destroy_addr.unique_id[6]) =
-	    card->unique_id;
-
-	result = qeth_send_ipa_cmd(card, &cmd, 1, IPA_CMD_STATE);
-
-	if (result) {
-		card->unique_id = UNIQUE_ID_IF_CREATE_ADDR_FAILED |
-		    UNIQUE_ID_NOT_BY_CARD;
-		PRINT_WARN("couldn't get a unique id from the card on device "
-			   "%s (result=x%x), using default id. ipv6 "
-			   "autoconfig on other lpars may lead to duplicate "
-			   "ip addresses. please use manually "
-			   "configured ones.\n",
-			   CARD_BUS_ID(card), result);
-		QETH_DBF_CARD2(0, trace, "unid fld", card);
-		sprintf(dbf_text, "%4x", result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-	} else {
-		card->unique_id =
-		    *((__u16 *) & cmd.data.create_destroy_addr.unique_id[6]);
-		QETH_DBF_CARD2(0, setup, "uniqueid", card);
-		sprintf(dbf_text, "%4x", card->unique_id);
-		QETH_DBF_TEXT2(0, setup, dbf_text);
-	}
-#else /* QETH_IPV6 */
-	card->unique_id =
-	    UNIQUE_ID_IF_CREATE_ADDR_FAILED | UNIQUE_ID_NOT_BY_CARD;
-#endif /* QETH_IPV6 */
-}
-
-static void
-qeth_put_unique_id(struct qeth_card *card)
-{
-#ifdef QETH_IPV6
-	struct ipa_cmd cmd;
-	int result;
-	char dbf_text[15];
-
-	/* is also true, if ipv6 is not supported on the card */
-	if ((card->unique_id & UNIQUE_ID_NOT_BY_CARD) == UNIQUE_ID_NOT_BY_CARD)
-		return;
-
-	qeth_fill_ipa_cmd(card, &cmd, IPA_CMD_DESTROY_ADDR, 6);
-	*((__u16 *) & cmd.data.create_destroy_addr.unique_id[6]) =
-	    card->unique_id;
-	memcpy(&cmd.data.create_destroy_addr.unique_id[0], card->dev->dev_addr,
-	       OSA_ADDR_LEN);
-
-	result = qeth_send_ipa_cmd(card, &cmd, 1, IPA_CMD_STATE);
-
-	if (result) {
-		QETH_DBF_CARD2(0, trace, "unibkfld", card);
-		sprintf(dbf_text, "%4x", result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-	}
-#else /* QETH_IPV6 */
-	card->unique_id =
-	    UNIQUE_ID_IF_CREATE_ADDR_FAILED | UNIQUE_ID_NOT_BY_CARD;
-#endif /* QETH_IPV6 */
-}
-
-static inline void
-__qeth_setparms_hstr(struct qeth_card *card)
-{
-	char dbf_text[15];
-	int result;
-
-	if ((card->link_type != QETH_MPC_LINK_TYPE_HSTR) &&
-	    (card->link_type != QETH_MPC_LINK_TYPE_LANE_TR))
-		return;
-
-	QETH_DBF_CARD3(0, trace, "hstr", card);
-	
-	if (qeth_is_adp_supported(IPA_SETADP_SET_BROADCAST_MODE)) {
-		result = qeth_send_setadapterparms_mode
-			(card, IPA_SETADP_SET_BROADCAST_MODE,
-			 card->options.broadcast_mode);
-		if (result) {
-			PRINT_WARN("couldn't set broadcast mode on "
-				   "device %s: x%x\n",
-				   CARD_BUS_ID(card), result);
-			QETH_DBF_CARD1(0, trace, "STBRDCST", card);
-			sprintf(dbf_text, "%4x", result);
-			QETH_DBF_TEXT1(1, trace, dbf_text);
-		}
-	} else if (card->options.broadcast_mode) {
-		PRINT_WARN("set adapter parameters not available "
-			   "to set broadcast mode, using ALLRINGS "
-			   "on device %s:\n", CARD_BUS_ID(card));
-		QETH_DBF_CARD1(0, trace, "NOBC", card);
-	}
-	
-	if (qeth_is_adp_supported(IPA_SETADP_SET_BROADCAST_MODE)) {
-		result = qeth_send_setadapterparms_mode
-			(card, IPA_SETADP_ALTER_MAC_ADDRESS,
-			 card->options.macaddr_mode);
-		if (result) {
-			PRINT_WARN("couldn't set macaddr mode on "
-				   "device %s: x%x\n", CARD_BUS_ID(card),
-				   result);
-			QETH_DBF_CARD1(0, trace, "STMACMOD", card);
-			sprintf(dbf_text, "%4x", result);
-			QETH_DBF_TEXT1(1, trace, dbf_text);
-		}
-	} else if (card->options.macaddr_mode) {
-		PRINT_WARN("set adapter parameters not available "
-			   "to set macaddr mode, using NONCANONICAL "
-			   "on device %s:\n", CARD_BUS_ID(card));
-		QETH_DBF_CARD1(0, trace, "NOMA", card);
-	}
-}
-
-static void
-qeth_do_setadapterparms_stuff(struct qeth_card *card)
-{
-	int result;
-	char dbf_text[15];
-
-	if (!qeth_is_supported(IPA_SETADAPTERPARMS)) {
-		return;
-	}
-
-	QETH_DBF_CARD4(0, trace, "stap", card);
-
-	result = qeth_send_setadapterparms_query(card);
-
-	if (result) {
-		PRINT_WARN("couldn't set adapter parameters on device %s: "
-			   "x%x\n", CARD_BUS_ID(card), result);
-		QETH_DBF_CARD1(0, trace, "SETADPFL", card);
-		sprintf(dbf_text, "%4x", result);
-		QETH_DBF_TEXT1(1, trace, dbf_text);
-		return;
-	}
-
-	sprintf(dbf_text, "spap%4x", card->adp_supported);
-	QETH_DBF_TEXT2(0, trace, dbf_text);
-
-	if (qeth_is_adp_supported(IPA_SETADP_ALTER_MAC_ADDRESS)) {
-		QETH_DBF_CARD3(0, trace, "rdmc", card);
-		QETH_DBF_CARD2(0, setup, "rdmc", card);
-
-		result = qeth_send_setadapterparms_change_addr(card,
-							       IPA_SETADP_ALTER_MAC_ADDRESS,
-							       CHANGE_ADDR_READ_MAC,
-							       card->dev->
-							       dev_addr,
-							       OSA_ADDR_LEN);
-		if (result) {
-			PRINT_WARN("couldn't get MAC address on "
-				   "device %s: x%x\n",
-				   CARD_BUS_ID(card), result);
-			QETH_DBF_CARD1(0, trace, "NOMACADD", card);
-			sprintf(dbf_text, "%4x", result);
-			QETH_DBF_TEXT1(1, trace, dbf_text);
-		} else {
-			QETH_DBF_HEX2(0, setup, card->dev->dev_addr,
-				      __max(OSA_ADDR_LEN, QETH_DBF_SETUP_LEN));
-			QETH_DBF_HEX3(0, trace, card->dev->dev_addr,
-				      __max(OSA_ADDR_LEN, QETH_DBF_TRACE_LEN));
-		}
-	}
-	__qeth_setparms_hstr(card);
-}
-
-static inline void
-__qeth_start_vlan_assist(struct qeth_card *card)
-{
-#ifdef QETH_VLAN
-	char dbf_text[15];
-	int result;
-
-	if (!qeth_is_supported(IPA_FULL_VLAN)) {
-		PRINT_WARN("VLAN not supported on %s\n",
-			   card->dev_name);
-		QETH_DBF_TEXT2(0, trace, "vlnotsup");
-		return;
-	}
-	result = qeth_send_setassparms_simple_without_data(card,
-							   IPA_VLAN_PRIO,
-							   IPA_CMD_ASS_START);
-	QETH_DBF_TEXT2(0, trace, "enavlan");
-	if (result) {
-		PRINT_WARN("Could not start vlan "
-			   "assist on %s: 0x%x, continuing\n",
-			   card->dev_name, result);
-		sprintf(dbf_text, "VLAN%4x", result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		return;
-	}
-	card->dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
-#endif /* QETH_VLAN */
-}
-
-static inline void
-__qeth_start_mc_assist(struct qeth_card *card)
-{
-	char dbf_text[15];
-	int result;
-
-	if (!qeth_is_supported(IPA_MULTICASTING)) {
-		PRINT_WARN("multicasting not supported on %s\n",
-			   card->dev_name);
-		QETH_DBF_TEXT2(0, trace, "mcnotsup");
-		return;
-	}
-	result = qeth_send_setassparms_simple_without_data(card,
-							   IPA_MULTICASTING,
-							   IPA_CMD_ASS_START);
-	QETH_DBF_TEXT2(0, trace, "enamcass");
-	if (result) {
-		PRINT_WARN("Could not start multicast "
-			   "assist on %s: 0x%x, continuing\n",
-			   card->dev_name, result);
-		sprintf(dbf_text, "MCAS%4x", result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		return;
-	}
-	card->dev->flags |= IFF_MULTICAST;
-}
-
-static int
-__qeth_softsetup_enable_ipv6(struct qeth_card *card, int do_a_startlan6)
-{
-	int result;
-	char dbf_text[15];
-
-	if (do_a_startlan6) {
-		QETH_DBF_TEXT2(0, trace, "startln6");
-		netif_stop_queue(card->dev);
-		result = qeth_send_startlan(card, 6);
-		if (result) {
-			sprintf(dbf_text, "stl6%4x", result);
-			QETH_DBF_TEXT2(0, trace, dbf_text);
-			atomic_set(&card->is_softsetup, 0);
-			/* do not return an error */
-			if ((result == 0xe080) || (result == 0xf080))
-				result = 0;
-			return result;
-		}
-	}
-	netif_wake_queue(card->dev);
-
-	QETH_DBF_TEXT2(0, trace, "qipassi6");
-	result = qeth_send_qipassist(card, 6);
-	if (result) {
-		PRINT_WARN("couldn't send QIPASSIST6 on %s: 0x%x\n",
-			   card->dev_name, result);
-		sprintf(dbf_text, "QIP6%4x", result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		atomic_set(&card->is_softsetup, 0);
-		return result;
-	}
-		
-	sprintf(dbf_text, "%4x%4x", card->ipa6_supported, card->ipa6_enabled);
-	QETH_DBF_TEXT2(0, trace, dbf_text);
-
-	QETH_DBF_TEXT2(0, trace, "enaipv46");
-	result = qeth_send_setassparms_simple_with_data(card, IPA_IPv6,
-							IPA_CMD_ASS_START, 3);
-	if (result) {
-		PRINT_WARN("Could not enable IPv4&6 assist "
-			   "on %s: 0x%x, continuing\n",
-			   card->dev_name, result);
-		sprintf(dbf_text, "I46A%4x", result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		/* go on */
-	}
-
-	QETH_DBF_TEXT2(0, trace, "enaipv6");
-	result = qeth_send_setassparms_simple_without_data6(card, IPA_IPv6,
-							    IPA_CMD_ASS_START);
-	if (result) {
-		PRINT_WARN("Could not start IPv6 assist "
-			   "on %s: 0x%x, continuing\n",
-			   card->dev_name, result);
-		sprintf(dbf_text, "I6AS%4x", result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		/* go on */
-	}
-
-	QETH_DBF_TEXT2(0, trace, "enapstr6");
-	result = qeth_send_setassparms_simple_without_data6(card, IPA_PASSTHRU,
-							    IPA_CMD_ASS_START);
-	if (result) {
-		PRINT_WARN("Could not enable passthrough "
-			   "on %s: 0x%x, continuing\n",
-			   card->dev_name, result);
-		sprintf(dbf_text, "PSTR%4x", result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		/* go on */
-	}
-	return 0;
-}
-
-static int
-__qeth_softsetup_start_assists(struct qeth_card *card)
-{
-	int result;
-	char dbf_text[15];
-	int do_a_startlan6 = 0;
-
-	if (atomic_read(&card->is_softsetup))
-		return 0;
-
-	atomic_set(&card->enable_routing_attempts4, QETH_ROUTING_ATTEMPTS);
-#ifdef QETH_IPV6
-	atomic_set(&card->enable_routing_attempts6, QETH_ROUTING_ATTEMPTS);
-#endif /* QETH_IPV6 */
-	if ((!atomic_read(&card->is_startlaned)) &&
-	    (atomic_read(&card->startlan_attempts))) {
-		atomic_dec(&card->startlan_attempts);
-		QETH_DBF_TEXT2(0, trace, "startlan");
-		netif_stop_queue(card->dev);
-		result = qeth_send_startlan(card, 4);
-		if (result) {
-			PRINT_WARN("couldn't send STARTLAN on %s "
-				   "(CHPID 0x%X): 0x%x (%s)\n",
-				   card->dev_name, card->chpid, result,
-				   (result == 0xe080) ?
-				   "startlan disabled (link "
-				   "failure -- please check the "
-				   "network, plug in the cable or "
-				   "enable the OSA port" :
-				   (result==0xf080) ?
-				   "startlan disabled (VM: LAN " \
-				   "is offline for functions " \
-				   "requiring LAN access.":
-				   "unknown return code");
-			sprintf(dbf_text, "stln%4x", result);
-			QETH_DBF_TEXT2(0, trace, dbf_text);
-			atomic_set(&card->is_softsetup, 0);
-			atomic_set(&card->is_startlaned, 0);
-			/* do not return an error */
-			if ((result == 0xe080) || (result == 0xf080)) {
-				result = 0;
-			}
-			return result;
-		}
-		do_a_startlan6 = 1;
-	}
-	netif_wake_queue(card->dev);
-	
-	qeth_do_setadapterparms_stuff(card);
-	
-	if (!qeth_is_supported(IPA_ARP_PROCESSING)) {
-		PRINT_WARN("oops... ARP processing not supported "
-			   "on %s!\n", card->dev_name);
-		QETH_DBF_TEXT1(0, trace, "NOarpPRC");
-	} else {
-		QETH_DBF_TEXT2(0, trace, "enaARPpr");
-		result = qeth_send_setassparms_simple_without_data
-			(card, IPA_ARP_PROCESSING, IPA_CMD_ASS_START);
-		if (result) {
-			PRINT_WARN("Could not start ARP processing "
-				   "assist on %s: 0x%x\n",
-				   card->dev_name, result);
-			sprintf(dbf_text, "ARPp%4x", result);
-			QETH_DBF_TEXT2(0, trace, dbf_text);
-			atomic_set(&card->is_softsetup, 0);
-			return result;
-		}
-	}
-	
-	if (qeth_is_supported(IPA_IP_FRAGMENTATION)) {
-		PRINT_INFO("IP fragmentation supported on "
-			   "%s... :-)\n", card->dev_name);
-		/* start it */
-		QETH_DBF_TEXT2(0, trace, "enaipfrg");
-		result = qeth_send_setassparms_simple_without_data
-			(card, IPA_IP_FRAGMENTATION, IPA_CMD_ASS_START);
-		if (result) {
-			PRINT_WARN("Could not start IP fragmenting "
-				   "assist on %s: 0x%x, continuing\n",
-				   card->dev_name, result);
-			sprintf(dbf_text, "IFRG%4x", result);
-			QETH_DBF_TEXT2(0, trace, dbf_text);
-			/* go on */
-		}
-	}
-	if (card->options.fake_ll == FAKE_LL) {
-		if (qeth_is_supported(IPA_SOURCE_MAC_AVAIL)) {
-			/* start it */
-			QETH_DBF_TEXT2(0, trace, "enainsrc");
-			result = qeth_send_setassparms_simple_without_data
-				(card, IPA_SOURCE_MAC_AVAIL, IPA_CMD_ASS_START);
-			if (result) {
-				PRINT_WARN
-					("Could not start inbound source "
-					 "assist on %s: 0x%x, continuing\n",
-					 card->dev_name, result);
-				sprintf(dbf_text, "INSR%4x", result);
-				QETH_DBF_TEXT2(0, trace, dbf_text);
-				/* go on */
-			}
-		} else {
-			PRINT_INFO("Inbound source addresses not "
-				   "supported on %s\n", card->dev_name);
-		}
-	}
-	__qeth_start_vlan_assist(card);
-	__qeth_start_mc_assist(card);
-	
-	if (!qeth_is_supported(IPA_IPv6)) {
-		QETH_DBF_TEXT2(0, trace, "ipv6ntsp");
-		PRINT_WARN("IPv6 not supported on %s\n", card->dev_name);
-	} else {
-		result = __qeth_softsetup_enable_ipv6(card, do_a_startlan6);
-		if (result != 0)
-			return result;
-	}
-	
-	card->broadcast_capable = 0;
-	if (!qeth_is_supported(IPA_FILTERING)) {
-		QETH_DBF_TEXT2(0, trace, "filtntsp");
-		PRINT_WARN("Broadcasting not supported on %s\n",
-			   card->dev_name);
-	} else {
-		QETH_DBF_TEXT2(0, trace, "enafiltr");
-		result = qeth_send_setassparms_simple_without_data
-			(card, IPA_FILTERING, IPA_CMD_ASS_START);
-		if (result) {
-			PRINT_WARN("Could not enable broadcast "
-				   "filtering on %s: "
-				   "0x%x, continuing\n",
-				   card->dev_name, result);
-			sprintf(dbf_text, "FLT1%4x", result);
-			QETH_DBF_TEXT2(0, trace, dbf_text);
-			goto go_on_filt;
-		}
-		result = qeth_send_setassparms_simple_with_data
-			(card, IPA_FILTERING, IPA_CMD_ASS_CONFIGURE, 1);
-		if (result) {
-			PRINT_WARN("Could not set up broadcast "
-				   "filtering on %s: "
-				   "0x%x, continuing\n",
-				   card->dev_name, result);
-			sprintf(dbf_text, "FLT2%4x", result);
-			QETH_DBF_TEXT2(0, trace, dbf_text);
-			goto go_on_filt;
-		}
-		card->dev->flags |= IFF_BROADCAST;
-		card->broadcast_capable = 1;
-	}
-go_on_filt:
-	if (card->options.checksum_type == HW_CHECKSUMMING) {
-		if (!qeth_is_supported(IPA_INBOUND_CHECKSUM)) {
-			PRINT_WARN("Inbound HW checksumming not "
-				   "supported on %s, continuing "
-				   "using inbound sw checksumming\n",
-				   card->dev_name);
-			QETH_DBF_TEXT2(0, trace, "ibckntsp");
-			card->options.checksum_type = SW_CHECKSUMMING;
-		} else {
-			QETH_DBF_TEXT2(0, trace, "ibcksupp");
-			result = qeth_send_setassparms_simple_without_data
-				(card, IPA_INBOUND_CHECKSUM,
-				 IPA_CMD_ASS_START);
-			if (result) {
-				PRINT_WARN("Could not start inbound "
-					   "checksumming on %s: 0x%x, "
-					   "continuing using "
-					   "inbound sw checksumming\n",
-					   card->dev_name, result);
-				sprintf(dbf_text, "SIBC%4x", result);
-				QETH_DBF_TEXT2(0, trace, dbf_text);
-				card->options.checksum_type = SW_CHECKSUMMING;
-				goto go_on_checksum;
-			}
-			result=qeth_send_setassparms_simple_with_data
-				(card,IPA_INBOUND_CHECKSUM,
-				 IPA_CMD_ASS_ENABLE, card->csum_enable_mask);
-			if (result) {
-				PRINT_WARN("Could not enable inbound " \
-					   "checksumming on %s: 0x%x, " \
-					   "continuing using " \
-					   "inbound sw checksumming\n",
-					   card->dev_name,result);
-				sprintf(dbf_text,"EIBC%4x",result);
-				QETH_DBF_TEXT2(0,trace,dbf_text);
-				card->options.checksum_type = SW_CHECKSUMMING;
-				goto go_on_checksum;
-
-			}
-		}
-	}
-go_on_checksum:	
-	atomic_set(&card->is_softsetup, 1);
-	return 0;
-}
-
-static inline void
-__qeth_softsetup_routingv4(struct qeth_card *card)
-{
-	int result;
-	char dbf_text[15];
-
-	if (!atomic_read(&card->enable_routing_attempts4))
-		return;
-
-	if (!card->options.routing_type4) {
-		atomic_set(&card->enable_routing_attempts4, 0);
-		atomic_set(&card->rt4fld, 0);
-		return;
-	}
-
-	sprintf(dbf_text, "strtg4%2x", card->options.routing_type4);
-	QETH_DBF_TEXT2(0, trace, dbf_text);
-	result = qeth_send_setrtg(card, card->options.routing_type4, 4);
-	if (!result) {	/* routing set correctly */
-		atomic_set(&card->enable_routing_attempts4, 0);
-		atomic_set(&card->rt4fld, 0);
-		return;
-	}
-	if (atomic_dec_return(&card->enable_routing_attempts4)) {
-		PRINT_WARN("couldn't set up v4 routing type "
-			   "on %s: 0x%x (%s).\nWill try "
-			   "next time again.\n",
-			   card->dev_name, result,
-			   ((result == 0xe010) || (result == 0xe008)) ?
-			   "primary already defined"
-			   : ((result == 0xe011) || (result == 0xe009)) ?
-			   "secondary already defined"
-			   : (result == 0xe012) ? "invalid indicator" :
-			   "unknown return code");
-		sprintf(dbf_text, "sRT4%4x", result);
-		atomic_set(&card->rt4fld, 1);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-	} else {
-		PRINT_WARN("couldn't set up v4 routing type "
-			   "on %s: 0x%x (%s).\nTrying to "
-			   "continue without routing.\n",
-			   card->dev_name, result,
-			   ((result == 0xe010) || (result == 0xe008)) ?
-			   "primary already defined"
-			   : ((result == 0xe011) || (result == 0xe009)) ?
-			   "secondary already defined"
-			   : (result == 0xe012) ? "invalid indicator" :
-			   "unknown return code");
-		sprintf(dbf_text, "SRT4%4x", result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		atomic_set(&card->rt4fld, 1);
-	}
-}
-
-static void
-__qeth_softsetup_routingv6(struct qeth_card *card)
-{
-#ifdef QETH_IPV6
-	int result;
-	char dbf_text[15];
-
-	if (!atomic_read(&card->enable_routing_attempts6))
-		return;
-
-	if (!card->options.routing_type6 ||
-	    ((card->type == QETH_CARD_TYPE_OSAE) &&
-	    ((card->options.routing_type6&ROUTER_MASK) == MULTICAST_ROUTER) &&
-	    !qeth_is_supported6(IPA_OSA_MC_ROUTER_AVAIL))) {
-		atomic_set(&card->enable_routing_attempts6, 0);
-		atomic_set(&card->rt6fld, 0);
-		return;
-	}
-	sprintf(dbf_text, "strtg6%2x", card->options.routing_type6);
-	QETH_DBF_TEXT2(0, trace, dbf_text);
-	result = qeth_send_setrtg(card, card->options.routing_type6, 6);
-	if (!result) {	/* routing set correctly */
-		atomic_set(&card->enable_routing_attempts6, 0);
-		atomic_set(&card->rt6fld, 0);
-		return;
-	}
-	if (atomic_dec_return(&card->enable_routing_attempts6)) {
-		PRINT_WARN("couldn't set up v6 routing type "
-			   "on %s: 0x%x (%s).\nWill try "
-			   "next time again.\n",
-			   card->dev_name, result,
-			   ((result == 0xe010) || (result == 0xe008)) ?
-			   "primary already defined"
-			   : ((result == 0xe011) || (result == 0xe009)) ?
-			   "secondary already defined"
-			   : (result == 0xe012) ? "invalid indicator" :
-			   "unknown return code");
-		sprintf(dbf_text, "sRT6%4x", result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		atomic_set(&card->rt6fld, 1);
-	} else {
-		PRINT_WARN("couldn't set up v6 routing type "
-			   "on %s: 0x%x (%s).\nTrying to "
-			   "continue without routing.\n",
-			   card->dev_name, result,
-			   ((result == 0xe010) || (result == 0xe008)) ?
-			   "primary already defined"
-			   : ((result == 0xe011) || (result == 0xe009)) ?
-			   "secondary already defined"
-			   : (result == 0xe012) ? "invalid indicator" :
-			   "unknown return code");
-		sprintf(dbf_text, "SRT6%4x", result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		atomic_set(&card->rt6fld, 1);
-	}
-#endif /* QETH_IPV6 */
-}
-
-static int
-qeth_softsetup_card(struct qeth_card *card, int wait_for_lock)
-{
-	int result;
-	char dbf_text[15];
-	int use_setip_retries = 1;
-
-	if (wait_for_lock == QETH_WAIT_FOR_LOCK) {
-		down(&card->softsetup_sema);
-	} else if (wait_for_lock == QETH_DONT_WAIT_FOR_LOCK) {
-		if (!down_trylock(&card->softsetup_sema)) {
-			return -EAGAIN;
-		}
-	} else if (wait_for_lock == QETH_LOCK_ALREADY_HELD) {
-		use_setip_retries = 0;	/* we are in recovery and don't want
-					   to repeat setting ips on and on */
-	} else {
-		return -EINVAL;
-	}
-
-	qeth_save_dev_flag_state(card);
-
-	QETH_DBF_CARD1(0, trace, wait_for_lock?"sscw":"sscn", card);
-
-	result = __qeth_softsetup_start_assists(card);
-	if (result)
-		goto out;
-
-	__qeth_softsetup_routingv4(card);
-	__qeth_softsetup_routingv6(card);
-
-	QETH_DBF_TEXT2(0, trace, "delvipa");
-	qeth_set_vipas(card, 0);
-	QETH_DBF_TEXT2(0, trace, "toip/ms");
-	qeth_takeover_ip_ipms(card);
-	qeth_takeover_ip_ipms6(card);
-	QETH_DBF_TEXT2(0, trace, "setvipa");
-	qeth_set_vipas(card, 1);
-
-	result = qeth_setips(card, use_setip_retries);
-	if (result) {		/* by now, qeth_setips does not return errors */
-		PRINT_WARN("couldn't set up IPs on %s: 0x%x\n",
-			   card->dev_name, result);
-		sprintf(dbf_text, "SSIP%4x", result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		atomic_set(&card->is_softsetup, 0);
-		goto out;
-	}
-	result = qeth_setipms(card, use_setip_retries);
-	if (result) {		/* by now, qeth_setipms does not return errors */
-		PRINT_WARN("couldn't set up multicast IPs on %s: 0x%x\n",
-			   card->dev_name, result);
-		sprintf(dbf_text, "ssim%4x", result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		atomic_set(&card->is_softsetup, 0);
-		goto out;
-	}
-out:
-	if (!result) {
-		netif_wake_queue(card->dev);
-	}
-	if (wait_for_lock != QETH_LOCK_ALREADY_HELD)
-		up(&card->softsetup_sema);
-	return result;
-}
-
-static int
-qeth_softsetup_thread(void *param)
-{
-	char name[15];
-	struct qeth_card *card = (struct qeth_card *) param;
-
-	/* set a nice name ... */
-	sprintf(name, "qethsoftd%s", CARD_BUS_ID(card));
-	daemonize(name);
-
-	QETH_DBF_CARD2(0, trace, "ssth", card);
-
-	atomic_set(&card->softsetup_thread_is_running, 1);
-	for (;;) {
-		if (atomic_read(&card->shutdown_phase))
-			goto out;
-		down_interruptible(&card->softsetup_thread_sem);
-		QETH_DBF_CARD2(0, trace, "ssst", card);
-		if (atomic_read(&card->shutdown_phase))
-			goto out;
-		while (qeth_softsetup_card(card, QETH_DONT_WAIT_FOR_LOCK)
-		       == -EAGAIN) {
-			if (atomic_read(&card->shutdown_phase))
-				goto out;
-			qeth_wait_nonbusy(QETH_IDLE_WAIT_TIME);
-		}
-		QETH_DBF_CARD2(0, trace, "sssd", card);
-		netif_wake_queue(card->dev);
-	}
-out:
-	atomic_set(&card->softsetup_thread_is_running, 0);
-
-	QETH_DBF_CARD2(0, trace, "lsst", card);
-
-	return 0;
-}
-
-static void
-qeth_softsetup_thread_starter(void *data)
-{
-	struct qeth_card *card = (struct qeth_card *) data;
-
-	QETH_DBF_CARD4(0, trace, "ssts", card);
-	sema_init(&card->softsetup_thread_sem, 0);
-	kernel_thread(qeth_softsetup_thread, card, SIGCHLD);
-}
-
-static void
-qeth_start_reinit_thread(struct qeth_card *card)
-{
-	/* we allow max 2 reinit threads, one could be just about to
-	 * finish and the next would be waiting. another waiting
-	 * reinit_thread is not necessary. */
-	if (atomic_read(&card->reinit_counter) < 2) {
-		atomic_inc(&card->reinit_counter);
-		if (atomic_read(&card->shutdown_phase)) {
-			atomic_dec(&card->reinit_counter);
-			return;
-		}
-		QETH_DBF_CARD2(0, trace, "stri", card);
-		PRINT_STUPID("starting reinit-thread\n");
-		kernel_thread(qeth_reinit_thread, card, SIGCHLD);
-	}
-}
-
-static void
-qeth_recover(void *data)
-{
-	struct qeth_card *card;
-	int i;
-	char dbf_text[15];
-
-	card = (struct qeth_card *) data;
-
-	QETH_DBF_CARD2(0, trace, "recv", card);
-
-	if (atomic_compare_and_swap(0, 1, &card->in_recovery))
-		return;
-
-	i = atomic_read(&card->problem);
-
-	sprintf(dbf_text, "PROB%4x", i);
-	QETH_DBF_TEXT2(0, trace, dbf_text);
-
-	if (i != PROBLEM_TX_TIMEOUT)
-		PRINT_WARN("recovery was scheduled on device %s (%s) with "
-			   "problem 0x%x\n",
-			   CARD_BUS_ID(card), card->dev_name, i);
-	switch (i) {
-	case PROBLEM_RECEIVED_IDX_TERMINATE:
-		if (atomic_read(&card->in_recovery))
-			atomic_set(&card->break_out, QETH_BREAKOUT_AGAIN);
-		break;
-	case PROBLEM_CARD_HAS_STARTLANED:
-		PRINT_WARN("You are lucky! Somebody either fixed the "
-			   "network problem, plugged the cable back in "
-			   "or enabled the OSA port on %s (CHPID 0x%X). "
-			   "The link has come up.\n",
-			   card->dev_name, card->chpid);
-		sprintf(dbf_text, "CBIN%4x", i);
-		QETH_DBF_TEXT1(0, trace, dbf_text);
-		atomic_set(&card->is_softsetup, 0);
-		qeth_set_dev_flag_running(card);
-		atomic_set(&card->enable_routing_attempts4,
-			   QETH_ROUTING_ATTEMPTS);
-		qeth_clear_ifa4_list(&card->ip_new_state.ip_ifa);
-#ifdef QETH_IPV6
-		atomic_set(&card->enable_routing_attempts6,
-			   QETH_ROUTING_ATTEMPTS);
-		qeth_clear_ifa6_list(&card->ip_new_state.ip6_ifa);
-#endif /* QETH_IPV6 */
-		qeth_clear_ifamc_list(&card->ip_mc_new_state.ipm_ifa);
-#ifdef QETH_IPV6
-		qeth_clear_ifamc_list(&card->ip_mc_new_state.ipm6_ifa);
-#endif /* QETH_IPV6 */
-		qeth_refresh_vipa_states(card);
-		qeth_start_softsetup_thread(card);
-		atomic_set(&card->in_recovery, 0);
-		break;
-	case PROBLEM_RESETTING_EVENT_INDICATOR:
-		/* we do nothing here */
-		break;
-	case PROBLEM_ACTIVATE_CHECK_CONDITION:
-	case PROBLEM_GENERAL_CHECK:
-	case PROBLEM_USER_TRIGGERED_RECOVERY:
-	case PROBLEM_AFFE:
-	case PROBLEM_MACHINE_CHECK:
-	case PROBLEM_BAD_SIGA_RESULT:
-	case PROBLEM_TX_TIMEOUT:
-		qeth_start_reinit_thread(card);
-		break;
-	}
-}
-
-static inline void
-qeth_schedule_recovery(struct qeth_card *card)
-{
-	if (card) {
-		INIT_WORK(&card->tqueue, qeth_recover, card);
-		schedule_work(&card->tqueue);
-	} else {
-		QETH_DBF_TEXT2(1, trace, "scdnocrd");
-		PRINT_WARN("recovery requested to be scheduled "
-			   "with no card!\n");
-	}
-}
-
-static void
-qeth_qdio_input_handler(struct ccw_device *cdev, unsigned int status,
-			unsigned int qdio_error, unsigned int siga_error,
-			unsigned int queue,
-			int first_element, int count, unsigned long card_ptr)
-{
-	struct net_device *dev;
-	struct qeth_card *card;
-	int problem;
-	int sbalf15;
-	char dbf_text[15];
-
-	sprintf(dbf_text, "qibhn%s", cdev->dev.bus_id);
-	QETH_DBF_HEX6(0, trace, dbf_text, QETH_DBF_TRACE_LEN);
-
-	card = (struct qeth_card *) card_ptr;
-
-#ifdef QETH_PERFORMANCE_STATS
-	card->perf_stats.inbound_start_time = NOW;
-#endif /* QETH_PERFORMANCE_STATS */
-	dev = card->dev;
-
-	if (status & QDIO_STATUS_LOOK_FOR_ERROR) {
-		if (status & QDIO_STATUS_ACTIVATE_CHECK_CONDITION) {
-			problem = PROBLEM_ACTIVATE_CHECK_CONDITION;
-			atomic_set(&card->problem, problem);
-			QETH_DBF_TEXT1(0, trace, "IHACTQCK");
-			sprintf(dbf_text, "%4x%4x", first_element, count);
-			QETH_DBF_TEXT1(0, trace, dbf_text);
-			sprintf(dbf_text, "%4x%4x", queue, status);
-			QETH_DBF_TEXT1(0, trace, dbf_text);
-			QETH_DBF_CARD1(1, trace, "qscd", card);
-			qeth_schedule_recovery(card);
-			return;
-		}
-		sbalf15 = (card->inbound_qdio_buffers[(first_element + count - 1)
-						      & QDIO_MAX_BUFFERS_PER_Q].
-			   element[15].flags) && 0xff;
-		PRINT_STUPID("inbound qdio transfer error on device %s. "
-			     "qdio_error=0x%x (more than one: %c), "
-			     "siga_error=0x%x (more than one: %c), "
-			     "sbalf15=x%x, bufno=x%x\n", cdev->dev.bus_id,
-			     qdio_error,
-			     (status & QDIO_STATUS_MORE_THAN_ONE_QDIO_ERROR) ?
-			     'y' : 'n', siga_error,
-			     (status & QDIO_STATUS_MORE_THAN_ONE_SIGA_ERROR) ?
-			     'y' : 'n', sbalf15, first_element);
-		QETH_DBF_CARD1(0, trace, "IQTI", card);
-		QETH_DBF_CARD1(0, qerr, "IQTI", card);
-		sprintf(dbf_text, "%4x%4x", first_element, count);
-		QETH_DBF_TEXT1(0, trace, dbf_text);
-		QETH_DBF_TEXT1(0, qerr, dbf_text);
-		sprintf(dbf_text, "%2x%4x%2x", queue, status, sbalf15);
-		QETH_DBF_TEXT1(0, trace, dbf_text);
-		QETH_DBF_TEXT1(0, qerr, dbf_text);
-		sprintf(dbf_text, "%4x%4x", qdio_error, siga_error);
-		QETH_DBF_TEXT1(0, trace, dbf_text);
-		QETH_DBF_TEXT1(0, qerr, dbf_text);
-		/* we inform about error more detailed in
-		 * qeth_read_in_buffer() */
-	}
-
-	for (;;) {
-		qeth_read_in_buffer(card, first_element);
-		qeth_queue_input_buffer(card, first_element,
-					QDIO_FLAG_UNDER_INTERRUPT);
-		count--;
-		if (count)
-			first_element = (first_element + 1) &
-			    (QDIO_MAX_BUFFERS_PER_Q - 1);
-		else
-			break;
-	}
-}
-
-static void
-__qeth_try_to_flush_packets(struct qeth_card *card, int last_pci_hit,
-			    unsigned int queue)
-{
-	int switch_state;
-
-	switch_state = (atomic_read(&card->outbound_used_buffers[queue]) <=
-			LOW_WATERMARK_PACK);
-	/* first_element is the last buffer that we got back from hydra */
-	if (!switch_state && !last_pci_hit)
-		return;
-	QETH_DBF_CARD3(0, trace, "stchcw", card);
-	if (atomic_swap(&card->outbound_ringbuffer_lock[queue], QETH_LOCK_FLUSH)
-	    == QETH_LOCK_UNLOCKED) {
-		/* 
-		 * we stop the queue as we try to not run onto the 
-		 * outbound_ringbuffer_lock -- this will not prevent it totally,
-		 * but reduce it. in high traffic situations, it saves around
-		 * 20us per second, hopefully this is amortized by calling 
-		 * netif_...
-		 */
-		netif_stop_queue(card->dev);
-		qeth_flush_packed_packets(card, queue,
-					  QDIO_FLAG_UNDER_INTERRUPT);
-		/* 
-		 * only switch state to non-packing, if the amount of used
-		 * buffers decreased
-		 */
-		if (switch_state)
-			card->send_state[queue] = SEND_STATE_DONT_PACK;
-		netif_wake_queue(card->dev);
-		atomic_set(&card->outbound_ringbuffer_lock[queue],
-			   QETH_LOCK_UNLOCKED);
-	}
-	/* 
-	 * if the lock was UNLOCKED, we flush ourselves, otherwise this is done
-	 * in do_send_packet when the lock is released
-	 */
-#ifdef QETH_PERFORMANCE_STATS
-	card->perf_stats.sc_p_dp++;
-#endif /* QETH_PERFORMANCE_STATS */
-}
-
-static void
-qeth_qdio_output_handler(struct ccw_device *cdev,
-			 unsigned int status,
-			 unsigned int qdio_error,
-			 unsigned int siga_error,
-			 unsigned int queue,
-			 int first_element, int count, unsigned long card_ptr)
-{
-	struct qeth_card *card;
-	int mycnt, problem, buffers_used;
-	int sbalf15;
-	char dbf_text[15];
-	int last_pci_hit = 0;
-	int last_pci;
-
-	sprintf(dbf_text, "qouthn%s", cdev->dev.bus_id);
-	QETH_DBF_HEX6(0, trace, dbf_text, QETH_DBF_TRACE_LEN);
-
-	mycnt = count;
-	card = (struct qeth_card *) card_ptr;
-
-	if (status & QDIO_STATUS_LOOK_FOR_ERROR) {
-		if (status & QDIO_STATUS_ACTIVATE_CHECK_CONDITION) {
-			problem = PROBLEM_ACTIVATE_CHECK_CONDITION;
-			atomic_set(&card->problem, problem);
-			QETH_DBF_TEXT1(0, trace, "OHACTQCK");
-			sprintf(dbf_text, "%4x%4x", first_element, count);
-			QETH_DBF_TEXT1(0, trace, dbf_text);
-			sprintf(dbf_text, "%4x%4x", queue, status);
-			QETH_DBF_TEXT1(0, trace, dbf_text);
-			QETH_DBF_CARD1(1, trace, "qscd", card);
-			qeth_schedule_recovery(card);
-			goto out;
-		}
-		sbalf15 = (card->outbound_ringbuffer[queue]->
-			   buffer[(first_element + count - 1) & QDIO_MAX_BUFFERS_PER_Q].
-			   element[15].flags) & 0xff;
-		PRINT_STUPID("outbound qdio transfer error on device %s, "
-			     "queue=%i. qdio_error=0x%x (more than one: %c),"
-			     " siga_error=0x%x (more than one: %c), "
-			     "sbalf15=x%x, bufno=x%x\n",
-			     cdev->dev.bus_id, queue, qdio_error, status &
-			     QDIO_STATUS_MORE_THAN_ONE_QDIO_ERROR ? 'y' : 'n',
-			     siga_error, status &
-			     QDIO_STATUS_MORE_THAN_ONE_SIGA_ERROR ? 'y' : 'n',
-			     sbalf15, first_element);
-		QETH_DBF_CARD1(0, trace, "IQTO", card);
-		QETH_DBF_CARD1(0, qerr, "IQTO", card);
-		sprintf(dbf_text, "%4x%4x", first_element, count);
-		QETH_DBF_TEXT1(0, trace, dbf_text);
-		QETH_DBF_TEXT1(0, qerr, dbf_text);
-		sprintf(dbf_text, "%2x%4x%2x", queue, status, sbalf15);
-		QETH_DBF_TEXT1(0, trace, dbf_text);
-		QETH_DBF_TEXT1(0, qerr, dbf_text);
-		sprintf(dbf_text, "%4x%4x", qdio_error, siga_error);
-		QETH_DBF_TEXT1(0, trace, dbf_text);
-		QETH_DBF_TEXT1(0, qerr, dbf_text);
-		/* we maybe do recovery or dst_link_failures
-		 * in qeth_free_buffer */
-	}
-
-	if (mycnt) {
-		last_pci = atomic_read(&card->last_pci_pos[queue]);
-		for (;;) {
-			qeth_free_buffer(card, queue, first_element,
-					 qdio_error, siga_error);
-			if (first_element == last_pci)
-				last_pci_hit = 1;
-			mycnt--;
-			if (mycnt > 0)
-				first_element = (first_element + 1) &
-				    (QDIO_MAX_BUFFERS_PER_Q - 1);
-			else
-				break;
-		}
-	}
-
-	buffers_used = atomic_add_return(-count,
-					 &card->outbound_used_buffers[queue])
-		       + count;
-
-	switch (card->send_state[queue]) {
-	case SEND_STATE_PACK:
-		__qeth_try_to_flush_packets(card, last_pci_hit, queue);
-		break;
-	default:
-		break;
-	}
-
-	/* we don't have to start the queue, if it was started already */
-	if (buffers_used < QDIO_MAX_BUFFERS_PER_Q - 1)
-		return;
-
-out:
-	netif_wake_queue(card->dev);
-}
-
-static long
-__qeth_check_irb_error(struct ccw_device *cdev, struct irb *irb)
-{
-	if (!IS_ERR(irb))
-		return 0;
-
-	switch (PTR_ERR(irb)) {
-	case -EIO:
-		PRINT_WARN("i/o-error on device %s\n", cdev->dev.bus_id);
-		break;
-	case -ETIMEDOUT:
-		PRINT_WARN("timeout on device %s\n", cdev->dev.bus_id);
-		break;
-	default:
-		PRINT_WARN("unknown error %ld on device %s\n", PTR_ERR(irb),
-			   cdev->dev.bus_id);
-	}
-	return PTR_ERR(irb);
-}
-
-static void
-qeth_interrupt_handler_read(struct ccw_device *cdev, unsigned long intparm,
-			    struct irb *irb)
-{
-	int cstat, dstat;
-	int problem;
-	struct qeth_card *card;
-	int rqparam;
-	char dbf_text[15];
-	int result;
-
-	if (__qeth_check_irb_error(cdev, irb))
-		return;
-
-	cstat = irb->scsw.cstat;
-	dstat = irb->scsw.dstat;
-	rqparam = intparm;
-
-	sprintf(dbf_text, "rint%s", cdev->dev.bus_id);
-	QETH_DBF_TEXT4(0, trace, dbf_text);
-	sprintf(dbf_text, "%4x%4x", cstat, dstat);
-	QETH_DBF_TEXT4(0, trace, dbf_text);
-	sprintf(dbf_text, "%4x", rqparam);
-	QETH_DBF_TEXT4(0, trace, dbf_text);
-
-	card = CARD_FROM_CDEV(cdev);
-	if (!card)
-		return;
-
-	if (irb->scsw.fctl & (SCSW_FCTL_CLEAR_FUNC | SCSW_FCTL_HALT_FUNC)) {
-		atomic_set(&card->clear_succeeded0, 1);
-		wake_up(&card->wait_q);
-		return;
-	}
-
-	if (!rqparam) {
-		PRINT_STUPID("got unsolicited interrupt in read handler "
-			     "for %s\n", cdev->dev.bus_id);
-		return;
-	}
-
-	if ((dstat == 0) && (cstat == 0))
-		return;
-
-	if (irb->esw.esw0.erw.cons) {
-		PRINT_WARN("sense data available on read channel.\n");
-		HEXDUMP16(WARN, "irb: ", irb);
-		HEXDUMP16(WARN, "sense data: ", irb->ecw);
-		sprintf(dbf_text, "RSNS%s", cdev->dev.bus_id);
-		QETH_DBF_TEXT1(0, trace, dbf_text);
-		QETH_DBF_HEX0(0, sense, irb, QETH_DBF_SENSE_LEN);
-	}
-
-	if (cstat != 0) {
-		PRINT_WARN("got nonzero-nonpci channel status in read_"
-			   "handler (device %s, devstat 0x%02x, schstat "
-			   "0x%02x, rqparam 0x%x)\n", cdev->dev.bus_id,
-			   dstat, cstat, rqparam);
-	}
-
-	problem = qeth_get_cards_problem(cdev, card->dma_stuff->recbuf,
-					 dstat, cstat, rqparam,
-					 (char *) irb, (char *) irb->ecw);
-
-	/* detect errors in dstat here */
-	if ((dstat & DEV_STAT_UNIT_EXCEP) || (dstat & DEV_STAT_UNIT_CHECK)) {
-		PRINT_WARN("unit check/exception in read_handler "
-			   "(device %s, devstat 0x%02x, schstat 0x%02x, "
-			   "rqparam 0x%x)\n",
-			   cdev->dev.bus_id, dstat, cstat, rqparam);
-
-		if (!atomic_read(&card->is_hardsetup)) {
-			if ((problem) && (qeth_is_to_recover(card, problem)))
-				atomic_set(&card->break_out,
-					   QETH_BREAKOUT_AGAIN);
-			else
-				atomic_set(&card->break_out,
-					   QETH_BREAKOUT_LEAVE);
-			goto wakeup_out;
-		} else
-			goto recover;
-	}
-
-	if (!(dstat & DEV_STAT_CHN_END)) {
-		PRINT_WARN("didn't get device end in read_handler "
-			   "(device %s, devstat 0x%02x, schstat 0x%02x, "
-			   "rqparam 0x%x)\n",
-			   cdev->dev.bus_id, dstat, cstat, rqparam);
-		goto wakeup_out;
-	}
-
-	if ((rqparam == IDX_ACTIVATE_WRITE_STATE) || (rqparam == NOP_STATE)) {
-		goto wakeup_out;
-	}
-
-	/* at this point, (maybe channel end and) device end has appeared */
-
-	/* we don't start the next read until we have examined the buffer. */
-	if ((rqparam != IDX_ACTIVATE_READ_STATE) &&
-	    (rqparam != IDX_ACTIVATE_WRITE_STATE))
-		qeth_issue_next_read(card);
-
-recover:
-	if (qeth_is_to_recover(card, problem)) {
-		QETH_DBF_CARD2(1, trace, "rscd", card);
-		qeth_schedule_recovery(card);
-		goto wakeup_out;
-	}
-
-	if (!IS_IPA(card->dma_stuff->recbuf) ||
-	    IS_IPA_REPLY(card->dma_stuff->recbuf)) {
-		/* setup or unknown data */
-		result = qeth_look_for_arp_data(card);
-		switch (result) {
-		case ARP_RETURNCODE_ERROR:
-		case ARP_RETURNCODE_LASTREPLY:
-			qeth_wakeup_ioctl(card);
-			return;
-		default:
-			break;
-		}
-	}
-
-wakeup_out:
-	memcpy(card->ipa_buf, card->dma_stuff->recbuf, QETH_BUFSIZE);
-	qeth_wakeup(card);
-}
-
-static void
-qeth_interrupt_handler_write(struct ccw_device *cdev, unsigned long intparm,
-			     struct irb *irb)
-{
-	int cstat, dstat, rqparam;
-	struct qeth_card *card;
-	int problem;
-	char dbf_text[15];
-
-	if (__qeth_check_irb_error(cdev, irb))
-		return;
-
-	cstat = irb->scsw.cstat;
-	dstat = irb->scsw.dstat;
-	rqparam = intparm;
-
-	sprintf(dbf_text, "wint%s", cdev->dev.bus_id);
-	QETH_DBF_TEXT4(0, trace, dbf_text);
-	sprintf(dbf_text, "%4x%4x", cstat, dstat);
-	QETH_DBF_TEXT4(0, trace, dbf_text);
-	sprintf(dbf_text, "%4x", rqparam);
-	QETH_DBF_TEXT4(0, trace, dbf_text);
-
-	card = CARD_FROM_CDEV(cdev);
-	if (!card)
-		return;
-
-	if (irb->scsw.fctl & (SCSW_FCTL_CLEAR_FUNC | SCSW_FCTL_HALT_FUNC)) {
-		atomic_set(&card->clear_succeeded1, 1);
-		wake_up(&card->wait_q);
-		goto out;
-	}
-
-	if (!rqparam) {
-		PRINT_STUPID("got unsolicited interrupt in write handler "
-			     "for %s\n", cdev->dev.bus_id);
-		return;
-	}
-
-	if ((dstat == 0) && (cstat == 0))
-		goto out;
-
-	if (irb->esw.esw0.erw.cons) {
-		PRINT_WARN("sense data available on write channel.\n");
-		HEXDUMP16(WARN, "irb: ", irb);
-		HEXDUMP16(WARN, "sense data: ", irb->ecw);
-		sprintf(dbf_text, "WSNS%s", cdev->dev.bus_id);
-		QETH_DBF_TEXT1(0, trace, dbf_text);
-		QETH_DBF_HEX0(0, sense, irb, QETH_DBF_SENSE_LEN);
-	}
-
-	if (cstat != 0) {
-		PRINT_WARN("got nonzero channel status in write_handler "
-			   "(device %s, devstat 0x%02x, schstat 0x%02x, "
-			   "rqparam 0x%x)\n",
-			   cdev->dev.bus_id, dstat, cstat, rqparam);
-	}
-
-	problem = qeth_get_cards_problem(cdev, NULL,
-					 dstat, cstat, rqparam,
-					 (char *) irb, (char *) irb->ecw);
-
-	/* detect errors in dstat here */
-	if ((dstat & DEV_STAT_UNIT_EXCEP) || (dstat & DEV_STAT_UNIT_CHECK)) {
-		PRINT_WARN("unit check/exception in write_handler "
-			   "(device %s, devstat 0x%02x, schstat 0x%02x, "
-			   "rqparam 0x%x)\n",
-			   cdev->dev.bus_id, dstat, cstat, rqparam);
-		if (!atomic_read(&card->is_hardsetup)) {
-			if (problem == PROBLEM_RESETTING_EVENT_INDICATOR) {
-				atomic_set(&card->break_out,
-					   QETH_BREAKOUT_AGAIN);
-				qeth_wakeup(card);
-				goto out;
-			}
-			atomic_set(&card->break_out, QETH_BREAKOUT_LEAVE);
-			goto out;
-		} else
-			goto recover;
-	}
-
-	if (dstat == DEV_STAT_DEV_END)
-		goto out;
-
-	if (!(dstat & DEV_STAT_CHN_END)) {
-		PRINT_WARN("didn't get device end in write_handler "
-			   "(device %s, devstat 0x%02x, schstat 0x%02x, "
-			   "rqparam 0x%x)\n",
-			   cdev->dev.bus_id, dstat, cstat, rqparam);
-		goto out;
-	}
-
-recover:
-	if (qeth_is_to_recover(card, problem)) {
-		QETH_DBF_CARD2(1, trace, "wscd", card);
-		qeth_schedule_recovery(card);
-		goto out;
-	}
-
-	/* at this point, (maybe channel end and) device end has appeared */
-	if ((rqparam == IDX_ACTIVATE_READ_STATE) ||
-	    (rqparam == IDX_ACTIVATE_WRITE_STATE) || (rqparam == NOP_STATE)) {
-		qeth_wakeup(card);
-		goto out;
-	}
-
-	/* well, a write has been done successfully. */
-
-out:
-	/* all statuses are final statuses on the write channel */
-	atomic_set(&card->write_busy, 0);
-}
-
-static void
-qeth_interrupt_handler_qdio(struct ccw_device *cdev, unsigned long intparm,
-			    struct irb *irb)
-{
-	int cstat, dstat, rqparam;
-	char dbf_text[15];
-	struct qeth_card *card;
-
-	if (__qeth_check_irb_error(cdev, irb))
-		return;
-
-	cstat = irb->scsw.cstat;
-	dstat = irb->scsw.dstat;
-	rqparam = intparm;
-
-	sprintf(dbf_text, "qint%s", cdev->dev.bus_id);
-	QETH_DBF_TEXT4(0, trace, dbf_text);
-	sprintf(dbf_text, "%4x%4x", cstat, dstat);
-	QETH_DBF_TEXT4(0, trace, dbf_text);
-	sprintf(dbf_text, "%4x", rqparam);
-	QETH_DBF_TEXT4(0, trace, dbf_text);
-
-	card = CARD_FROM_CDEV(cdev);
-	if (!card)
-		return;
-
-	if (irb->scsw.fctl & (SCSW_FCTL_CLEAR_FUNC | SCSW_FCTL_HALT_FUNC)) {
-		atomic_set(&card->clear_succeeded2, 1);
-		wake_up(&card->wait_q);
-		return;
-	}
-
-	if (!rqparam) {
-		PRINT_STUPID("got unsolicited interrupt in qdio handler, "
-			     "device%s\n", cdev->dev.bus_id);
-		return;
-	}
-
-	if ((dstat == 0) && (cstat == 0))
-		return;
-
-	if (irb->esw.esw0.erw.cons) {
-		PRINT_WARN("sense data available on qdio channel.\n");
-		HEXDUMP16(WARN, "irb: ", irb);
-		HEXDUMP16(WARN, "sense data: ", irb->ecw);
-		sprintf(dbf_text, "QSNS%s", cdev->dev.bus_id);
-		QETH_DBF_TEXT1(0, trace, dbf_text);
-		QETH_DBF_HEX0(0, sense, irb, QETH_DBF_SENSE_LEN);
-	}
-
-	if (rqparam == NOP_STATE) {
-		qeth_wakeup(card);
-		return;
-	}
-
-	if (cstat != 0) {
-		sprintf(dbf_text, "qchk%s", cdev->dev.bus_id);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		sprintf(dbf_text, "%4x%4x", cstat, dstat);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		sprintf(dbf_text, "%4x", rqparam);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		PRINT_WARN("got nonzero channel status in qdio_handler "
-			   "(device %s, devstat 0x%02x, schstat 0x%02x)\n",
-			   cdev->dev.bus_id, dstat, cstat);
-	}
-
-	if (dstat & ~(DEV_STAT_CHN_END | DEV_STAT_DEV_END)) {
-		PRINT_WARN("got the following dstat on the qdio channel: "
-			   "device %s, dstat 0x%02x, cstat 0x%02x, "
-			   "rqparam=%i\n",
-			   cdev->dev.bus_id, dstat, cstat, rqparam);
-	}
-
-}
-
-static int
-qeth_register_netdev(struct qeth_card *card)
-{
-	int result;
-
-	QETH_DBF_CARD3(0, trace, "rgnd", card);
-
-	/* sysfs magic */
-	SET_NETDEV_DEV(card->dev, &card->gdev->dev);
-	result = register_netdev(card->dev);
-
-	return result;
-}
-
-static void
-qeth_unregister_netdev(struct qeth_card *card)
-{
-	QETH_DBF_CARD3(0, trace, "nrgn", card);
-
-	unregister_netdev(card->dev);
-}
-
-static int
-qeth_stop(struct net_device *dev)
-{
-	struct qeth_card *card;
-
-	card = (struct qeth_card *) dev->priv;
-	QETH_DBF_CARD2(0, trace, "stop", card);
-	QETH_DBF_CARD2(0, setup, "stop", card);
-
-	qeth_save_dev_flag_state(card);
-
-	netif_stop_queue(dev);
-	atomic_set(&card->is_open, 0);
-
-	return 0;
-}
-
-static void
-qeth_softshutdown(struct qeth_card *card)
-{
-	QETH_DBF_CARD3(0, trace, "ssht", card);
-
-	qeth_send_stoplan(card);
-}
-
-static void
-__qeth_clear_card_halt_clear(struct qeth_card *card, int halt)
-{
-	unsigned long flags0, flags1, flags2;
-	int ret0, ret1, ret2;
-
-	atomic_set(&card->clear_succeeded0, 0);
-	atomic_set(&card->clear_succeeded1, 0);
-	atomic_set(&card->clear_succeeded2, 0);
-	
-	spin_lock_irqsave(get_ccwdev_lock(CARD_RDEV(card)), flags0);
-	if (halt)
-		ret0 = ccw_device_halt(CARD_RDEV(card), CLEAR_STATE);
-	else
-		ret0 = ccw_device_clear(CARD_RDEV(card), CLEAR_STATE);
-	spin_unlock_irqrestore(get_ccwdev_lock(CARD_RDEV(card)), flags0);
-	
-	spin_lock_irqsave(get_ccwdev_lock(CARD_WDEV(card)), flags1);
-	if (halt)
-		ret1 = ccw_device_halt(CARD_WDEV(card), CLEAR_STATE);
-	else
-		ret1 = ccw_device_clear(CARD_WDEV(card), CLEAR_STATE);
-	spin_unlock_irqrestore(get_ccwdev_lock(CARD_WDEV(card)), flags1);
-	
-	spin_lock_irqsave(get_ccwdev_lock(CARD_DDEV(card)), flags2);
-	if (halt)
-		ret2 = ccw_device_halt(CARD_DDEV(card), CLEAR_STATE);
-	else
-		ret2 = ccw_device_clear(CARD_DDEV(card), CLEAR_STATE);
-	spin_unlock_irqrestore(get_ccwdev_lock(CARD_DDEV(card)), flags2);
-
-	/* The device owns us an interrupt. */
-	if ((ret0 == 0) && (atomic_read(&card->clear_succeeded0) == 0))
-		wait_event(card->wait_q,
-			   atomic_read(&card->clear_succeeded0) == 1);
-	if ((ret1 == 0) && (atomic_read(&card->clear_succeeded1) == 0))
-		wait_event(card->wait_q,
-			   atomic_read(&card->clear_succeeded1) == 1);
-	if ((ret2 == 0) && (atomic_read(&card->clear_succeeded2) == 0))
-		wait_event(card->wait_q,
-			   atomic_read(&card->clear_succeeded2) == 1);
-}
-
-static void
-qeth_clear_card(struct qeth_card *card, int qdio_clean, int use_halt)
-{
-	QETH_DBF_CARD3(0, trace, qdio_clean?"clrq":"clr", card);
-	QETH_DBF_CARD1(0, setup, qdio_clean?"clrq":"clr", card);
-
-	atomic_set(&card->write_busy, 0);
-	if (qdio_clean)
-		qdio_cleanup(CARD_DDEV(card),
-			     (card->type == QETH_CARD_TYPE_IQD) ?
-			     QDIO_FLAG_CLEANUP_USING_HALT :
-			     QDIO_FLAG_CLEANUP_USING_CLEAR);
-
-	if (use_halt)
-		__qeth_clear_card_halt_clear(card, 1);
-
-	__qeth_clear_card_halt_clear(card, 0);
-}
-
-static void
-qeth_free_card_stuff(struct qeth_card *card)
-{
-	int i, j;
-	struct qeth_vipa_entry *e, *e2;
-
-	if (!card)
-		return;
-
-	QETH_DBF_CARD3(0, trace, "freest", card);
-	QETH_DBF_CARD1(0, setup, "freest", card);
-
-	write_lock(&card->vipa_list_lock);
-	e = card->vipa_list;
-	while (e) {
-		e2 = e->next;
-		kfree(e);
-		e = e2;
-	}
-	write_unlock(&card->vipa_list_lock);
-
-	for (i = 0; i < card->options.inbound_buffer_count; i++) {
-		for (j = 0; j < BUFFER_MAX_ELEMENTS; j++) {
-			if (card->inbound_buffer_pool_entry[i][j]) {
-				kfree(card->inbound_buffer_pool_entry[i][j]);
-				card->inbound_buffer_pool_entry[i][j] = NULL;
-			}
-		}
-	}
-	for (i = 0; i < card->no_queues; i++)
-		if (card->outbound_ringbuffer[i])
-			vfree(card->outbound_ringbuffer[i]);
-
-	if (card->stats)
-		kfree(card->stats);
-	if (card->dma_stuff)
-		kfree(card->dma_stuff);
-	if (card->dev)
-		free_netdev(card->dev);
-
-}
-
-static void
-qeth_free_card(struct qeth_card *card)
-{
-
-	if (!card)
-		return;
-
-	QETH_DBF_CARD3(0, trace, "free", card);
-	QETH_DBF_CARD1(0, setup, "free", card);
-
-	vfree(card);		/* we checked against NULL already */
-}
-
-/* also locked from outside (setup_lock) */
-static void
-qeth_remove_card_from_list(struct qeth_card *card)
-{
-	struct qeth_card *cn;
-	unsigned long flags0, flags1, flags2;
-
-	write_lock(&list_lock);
-	if (!card) {
-		QETH_DBF_TEXT2(0, trace, "RMCWNOCD");
-		PRINT_WARN("qeth_remove_card_from_list call with no card!\n");
-		write_unlock(&list_lock);
-		return;
-	}
-
-	QETH_DBF_CARD3(0, trace, "rmcl", card);
-
-	/* check first, if card is in list */
-	if (!firstcard) {
-		QETH_DBF_TEXT2(0, trace, "NOCRDINL");
-		PRINT_WARN
-		    ("qeth_remove_card_from_list called on empty card list!!\n");
-		write_unlock(&list_lock);
-		return;
-	}
-
-	spin_lock_irqsave(get_ccwdev_lock(CARD_RDEV(card)), flags0);
-	spin_lock_irqsave(get_ccwdev_lock(CARD_WDEV(card)), flags1);
-	spin_lock_irqsave(get_ccwdev_lock(CARD_DDEV(card)), flags2);
-
-	if (firstcard == card)
-		firstcard = card->next;
-	else {
-		cn = firstcard;
-		while (cn->next) {
-			if (cn->next == card) {
-				cn->next = card->next;
-				card->next = NULL;
-				break;
-			}
-			cn = cn->next;
-		}
-	}
-
-	spin_unlock_irqrestore(get_ccwdev_lock(CARD_DDEV(card)), flags2);
-	spin_unlock_irqrestore(get_ccwdev_lock(CARD_WDEV(card)), flags1);
-	spin_unlock_irqrestore(get_ccwdev_lock(CARD_RDEV(card)), flags0);
-
-	write_unlock(&list_lock);
-
-}
-
-static void
-qeth_delete_all_ips(struct qeth_card *card)
-{
-	struct qeth_vipa_entry *e;
-
-	if (atomic_read(&card->is_softsetup)) {
-		qeth_clear_ifa4_list(&card->ip_new_state.ip_ifa);
-		qeth_clear_ifamc_list(&card->ip_mc_new_state.ipm_ifa);
-
-#ifdef QETH_IPV6
-		qeth_clear_ifa6_list(&card->ip_new_state.ip6_ifa);
-		qeth_clear_ifamc_list(&card->ip_mc_new_state.ipm6_ifa);
-#endif /* QETH_IPV6 */
-
-		write_lock(&card->vipa_list_lock);
-		e = card->vipa_list;
-		while (e) {
-			e->state = VIPA_2_B_REMOVED;
-			e = e->next;
-		}
-		write_unlock(&card->vipa_list_lock);
-		qeth_start_softsetup_thread(card);
-	}
-}
-
-static void
-qeth_remove_card(struct qeth_card *card, int method)
-{
-	if (!card)
-		return;
-
-	QETH_DBF_CARD2(0, trace, "rmcd", card);
-	QETH_DBF_CARD1(0, setup, "rmcd", card);
-
-	if (method == QETH_REMOVE_CARD_PROPER) {
-		atomic_set(&card->shutdown_phase, QETH_REMOVE_CARD_PROPER);
-		if (atomic_read(&card->is_open)) {
-			qeth_stop(card->dev);
-			qeth_wait_nonbusy(QETH_REMOVE_WAIT_TIME);
-		}
-		qeth_delete_all_ips(card);
-	} else {
-		atomic_set(&card->shutdown_phase, QETH_REMOVE_CARD_QUICK);
-	}
-	atomic_set(&card->write_busy, 0);
-
-	QETH_DBF_TEXT4(0, trace, "freeskbs");
-	qeth_free_all_skbs(card);
-
-	QETH_DBF_TEXT2(0, trace, "upthrsem");
-
-	up(&card->softsetup_thread_sem);
-	up(&card->reinit_thread_sem);
-	while ((atomic_read(&card->softsetup_thread_is_running)) ||
-	       (atomic_read(&card->reinit_counter))) {
-		qeth_wait_nonbusy(QETH_WAIT_FOR_THREAD_TIME);
-	}
-
-	if (method == QETH_REMOVE_CARD_PROPER) {
-		QETH_DBF_TEXT4(0, trace, "softshut");
-		qeth_softshutdown(card);
-		qeth_wait_nonbusy(QETH_REMOVE_WAIT_TIME);
-	}
-
-	atomic_set(&card->is_startlaned, 0);	/* paranoia, qeth_stop
-						   should prevent
-						   further calls of
-						   hard_start_xmit */
-
-	if (atomic_read(&card->is_registered)) {
-		QETH_DBF_TEXT2(0, trace, "unregdev");
-		qeth_unregister_netdev(card);
-		qeth_wait_nonbusy(QETH_REMOVE_WAIT_TIME);
-		atomic_set(&card->is_registered, 0);
-	}
-
-	qeth_put_unique_id(card);
-
-	QETH_DBF_TEXT2(0, trace, "clrcard");
-	if (atomic_read(&card->is_hardsetup)) {
-		PRINT_STUPID("clearing card %s\n", card->dev_name);
-		qeth_clear_card(card, 1, 0);
-	}
-
-	atomic_set(&card->is_hardsetup, 0);
-	atomic_set(&card->is_softsetup, 0);
-
-	QETH_DBF_TEXT2(0, trace, "cardrmvd");
-
-}
-
-static void
-qeth_set_multicast_list(struct net_device *dev)
-{
-	struct qeth_card *card = dev->priv;
-
-	QETH_DBF_CARD2(0, trace, "smcl", card);
-
-	qeth_start_softsetup_thread(card);
-}
-
-static int
-qeth_set_mac_address(struct net_device *dev, void *addr)
-{
-	struct qeth_card *card;
-
-	card = (struct qeth_card *) dev->priv;
-	QETH_DBF_CARD2(0, trace, "stmc", card);
-
-	return -EOPNOTSUPP;
-}
-
-static int
-qeth_neigh_setup(struct net_device *dev, struct neigh_parms *np)
-{
-	struct qeth_card *card;
-
-	card = (struct qeth_card *) dev->priv;
-	QETH_DBF_CARD2(0, trace, "ngst", card);
-
-	return 0;
-}
-
-static void
-qeth_generate_tokens(struct qeth_card *card)
-{
-	card->token.issuer_rm_w = 0x00010103UL;
-	card->token.cm_filter_w = 0x00010108UL;
-	card->token.cm_connection_w = 0x0001010aUL;
-	card->token.ulp_filter_w = 0x0001010bUL;
-	card->token.ulp_connection_w = 0x0001010dUL;
-}
-
-static int
-qeth_peer_func_level(int level)
-{
-	if ((level & 0xff) == 8)
-		return (level & 0xff) + 0x400;
-	if (((level >> 8) & 3) == 1)
-		return (level & 0xff) + 0x200;
-	return level;		/* hmmm... don't know what to do with that level. */
-}
-
-/* returns last four digits of bus_id */
-/* FIXME: device driver shouldn't be aware of bus_id format - but don't know
-   what else to use... (CH) */
-static inline __u16
-__raw_devno_from_bus_id(char *id)
-{
-	id += (strlen(id) - 4); 
-	return (__u16) simple_strtoul(id, &id, 16);
-}
-
-static int
-qeth_idx_activate_read(struct qeth_card *card)
-{
-	int result, result2;
-	__u16 temp;
-	unsigned long flags;
-	char dbf_text[15];
-
-	result = result2 = 0;
-
-	memcpy(&card->dma_stuff->write_ccw, WRITE_CCW, sizeof (struct ccw1));
-	card->dma_stuff->write_ccw.count = IDX_ACTIVATE_SIZE;
-	card->dma_stuff->write_ccw.cda =
-	    QETH_GET_ADDR(card->dma_stuff->sendbuf);
-
-	memcpy(card->dma_stuff->sendbuf, IDX_ACTIVATE_READ, IDX_ACTIVATE_SIZE);
-	memcpy(QETH_TRANSPORT_HEADER_SEQ_NO(card->dma_stuff->sendbuf),
-	       &card->seqno.trans_hdr, QETH_SEQ_NO_LENGTH);
-
-	memcpy(QETH_IDX_ACT_ISSUER_RM_TOKEN(card->dma_stuff->sendbuf),
-	       &card->token.issuer_rm_w, QETH_MPC_TOKEN_LENGTH);
-	memcpy(QETH_IDX_ACT_FUNC_LEVEL(card->dma_stuff->sendbuf),
-	       &card->func_level, 2);
-
-	temp = __raw_devno_from_bus_id(CARD_DDEV_ID(card));
-	memcpy(QETH_IDX_ACT_QDIO_DEV_CUA(card->dma_stuff->sendbuf), &temp, 2);
-	temp = (card->cula << 8) + card->unit_addr2;
-	memcpy(QETH_IDX_ACT_QDIO_DEV_REALADDR(card->dma_stuff->sendbuf),
-	       &temp, 2);
-
-	QETH_DBF_TEXT2(0, trace, "iarw");
-	QETH_DBF_TEXT2(0, trace, CARD_RDEV_ID(card));
-	QETH_DBF_HEX2(0, control, card->dma_stuff->sendbuf,
-		      QETH_DBF_CONTROL_LEN);
-
-	spin_lock_irqsave(get_ccwdev_lock(CARD_RDEV(card)), flags);
-	result = ccw_device_start(CARD_RDEV(card), &card->dma_stuff->write_ccw,
-				  IDX_ACTIVATE_WRITE_STATE, 0, 0);
-	if (result) {
-		qeth_delay_millis(QETH_WAIT_BEFORE_2ND_DOIO);
-		result2 = ccw_device_start(CARD_RDEV(card),
-					   &card->dma_stuff->write_ccw,
-					   IDX_ACTIVATE_WRITE_STATE, 0, 0);
-		sprintf(dbf_text, "IRW1%4x", result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		sprintf(dbf_text, "IRW2%4x", result2);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		PRINT_WARN("qeth_idx_activate_read (write): do_IO returned "
-			   "%i, next try returns %i\n", result, result2);
-	}
-	spin_unlock_irqrestore(get_ccwdev_lock(CARD_RDEV(card)), flags);
-
-	if (atomic_read(&card->break_out)) {
-		QETH_DBF_TEXT3(0, trace, "IARWBRKO");
-		return -EIO;
-	}
-
-	if (qeth_sleepon(card, QETH_MPC_TIMEOUT)) {
-		QETH_DBF_TEXT1(0, trace, "IRWT");
-		QETH_DBF_TEXT1(0, trace, CARD_RDEV_ID(card));
-		PRINT_ERR("IDX_ACTIVATE(wr) on read channel device %s: "
-			  "timeout\n", CARD_RDEV_ID(card));
-		return -EIO;
-	}
-
-/* start reading on read channel, card->read_ccw is not yet used */
-	memcpy(&card->dma_stuff->read_ccw, READ_CCW, sizeof (struct ccw1));
-	card->dma_stuff->read_ccw.count = QETH_BUFSIZE;
-	card->dma_stuff->read_ccw.cda = QETH_GET_ADDR(card->dma_stuff->recbuf);
-
-	spin_lock_irqsave(get_ccwdev_lock(CARD_RDEV(card)), flags);
-	result2 = 0;
-	result = ccw_device_start(CARD_RDEV(card), &card->dma_stuff->read_ccw,
-				  IDX_ACTIVATE_READ_STATE, 0, 0);
-	if (result) {
-		qeth_delay_millis(QETH_WAIT_BEFORE_2ND_DOIO);
-		result2 = ccw_device_start(CARD_RDEV(card),
-					   &card->dma_stuff->read_ccw,
-					   IDX_ACTIVATE_READ_STATE, 0, 0);
-		sprintf(dbf_text, "IRR1%4x", result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		sprintf(dbf_text, "IRR2%4x", result2);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		PRINT_WARN("qeth_idx_activate_read (read): do_IO "
-			   "returned %i, next try returns %i\n",
-			   result, result2);
-	}
-	spin_unlock_irqrestore(get_ccwdev_lock(CARD_RDEV(card)), flags);
-
-	if (result2) {
-		result = result2;
-		if (result)
-			return result;
-	}
-
-	if (qeth_sleepon(card, QETH_MPC_TIMEOUT)) {
-		QETH_DBF_TEXT1(0, trace, "IRRT");
-		QETH_DBF_TEXT1(0, trace, CARD_RDEV_ID(card));
-		PRINT_ERR("IDX_ACTIVATE(rd) on read channel device %s: "
-			  "timeout\n", CARD_RDEV_ID(card));
-		return -EIO;
-	}
-	QETH_DBF_TEXT2(0, trace, "iarr");
-	QETH_DBF_TEXT2(0, trace, CARD_RDEV_ID(card));
-	QETH_DBF_HEX2(0, control, card->dma_stuff->recbuf,
-		      QETH_DBF_CONTROL_LEN);
-
-	if (!(QETH_IS_IDX_ACT_POS_REPLY(card->dma_stuff->recbuf))) {
-		QETH_DBF_TEXT1(0, trace, "IRNR");
-		QETH_DBF_TEXT1(0, trace, CARD_RDEV_ID(card));
-		PRINT_ERR("IDX_ACTIVATE on read channel device %s: negative "
-			  "reply\n", CARD_RDEV_ID(card));
-		return -EIO;
-	}
-
-	card->portname_required =
-	    ((!QETH_IDX_NO_PORTNAME_REQUIRED(card->dma_stuff->recbuf)) &&
-	     (card->type == QETH_CARD_TYPE_OSAE));
-
-	/*
-	 * however, as the portname indication of OSA is wrong, we have to
-	 * do this:
-	 */
-	card->portname_required = (card->type == QETH_CARD_TYPE_OSAE);
-
-	memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(card->dma_stuff->recbuf), 2);
-	if (temp != qeth_peer_func_level(card->func_level)) {
-		QETH_DBF_TEXT1(0, trace, "IRFL");
-		QETH_DBF_TEXT1(0, trace, CARD_RDEV_ID(card));
-		sprintf(dbf_text, "%4x%4x", card->func_level, temp);
-		QETH_DBF_TEXT1(0, trace, dbf_text);
-		PRINT_WARN("IDX_ACTIVATE on read channel device %s: function "
-			   "level mismatch (sent: 0x%x, received: 0x%x)\n",
-			   CARD_RDEV_ID(card), card->func_level, temp);
-		result = -EIO;
-	}
-
-	memcpy(&card->token.issuer_rm_r,
-	       QETH_IDX_ACT_ISSUER_RM_TOKEN(card->dma_stuff->recbuf),
-	       QETH_MPC_TOKEN_LENGTH);
-
-	memcpy(&card->level[0],
-	       QETH_IDX_REPLY_LEVEL(card->dma_stuff->recbuf), QETH_MCL_LENGTH);
-
-	return result;
-}
-
-static int
-qeth_idx_activate_write(struct qeth_card *card)
-{
-	int result, result2;
-	__u16 temp;
-	unsigned long flags;
-	char dbf_text[15];
-
-	result = result2 = 0;
-
-	memcpy(&card->dma_stuff->write_ccw, WRITE_CCW, sizeof (struct ccw1));
-	card->dma_stuff->write_ccw.count = IDX_ACTIVATE_SIZE;
-	card->dma_stuff->write_ccw.cda =
-	    QETH_GET_ADDR(card->dma_stuff->sendbuf);
-
-	memcpy(card->dma_stuff->sendbuf, IDX_ACTIVATE_WRITE, IDX_ACTIVATE_SIZE);
-	memcpy(QETH_TRANSPORT_HEADER_SEQ_NO(card->dma_stuff->sendbuf),
-	       &card->seqno.trans_hdr, QETH_SEQ_NO_LENGTH);
-	card->seqno.trans_hdr++;
-
-	memcpy(QETH_IDX_ACT_ISSUER_RM_TOKEN(card->dma_stuff->sendbuf),
-	       &card->token.issuer_rm_w, QETH_MPC_TOKEN_LENGTH);
-	memcpy(QETH_IDX_ACT_FUNC_LEVEL(card->dma_stuff->sendbuf),
-	       &card->func_level, 2);
-
-	temp = __raw_devno_from_bus_id(CARD_DDEV_ID(card));
-	memcpy(QETH_IDX_ACT_QDIO_DEV_CUA(card->dma_stuff->sendbuf), &temp, 2);
-	temp = (card->cula << 8) + card->unit_addr2;
-	memcpy(QETH_IDX_ACT_QDIO_DEV_REALADDR(card->dma_stuff->sendbuf),
-	       &temp, 2);
-
-	QETH_DBF_TEXT2(0, trace, "iaww");
-	QETH_DBF_TEXT2(0, trace, CARD_WDEV_ID(card));
-	QETH_DBF_HEX2(0, control, card->dma_stuff->sendbuf,
-		      QETH_DBF_CONTROL_LEN);
-
-	spin_lock_irqsave(get_ccwdev_lock(CARD_WDEV(card)), flags);
-	result = ccw_device_start(CARD_WDEV(card), &card->dma_stuff->write_ccw,
-				  IDX_ACTIVATE_WRITE_STATE, 0, 0);
-	if (result) {
-		qeth_delay_millis(QETH_WAIT_BEFORE_2ND_DOIO);
-		result2 = ccw_device_start(CARD_WDEV(card),
-					   &card->dma_stuff->write_ccw,
-					   IDX_ACTIVATE_WRITE_STATE, 0, 0);
-		sprintf(dbf_text, "IWW1%4x", result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		sprintf(dbf_text, "IWW2%4x", result2);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		PRINT_WARN("qeth_idx_activate_write (write): do_IO "
-			   "returned %i, next try returns %i\n",
-			   result, result2);
-	}
-	spin_unlock_irqrestore(get_ccwdev_lock(CARD_WDEV(card)), flags);
-
-	if (atomic_read(&card->break_out)) {
-		QETH_DBF_TEXT3(0, trace, "IAWWBRKO");
-		return -EIO;
-	}
-
-	if (qeth_sleepon(card, QETH_MPC_TIMEOUT)) {
-		QETH_DBF_TEXT1(0, trace, "IWWT");
-		QETH_DBF_TEXT1(0, trace, CARD_WDEV_ID(card));
-		PRINT_ERR("IDX_ACTIVATE(wr) on write channel device %s: "
-			  "timeout\n", CARD_WDEV_ID(card));
-		return -EIO;
-	}
-
-	QETH_DBF_TEXT3(0, trace, "idxawrrd");
-	/* start one read on write channel */
-	memcpy(&card->dma_stuff->read_ccw, READ_CCW, sizeof (struct ccw1));
-	card->dma_stuff->read_ccw.count = QETH_BUFSIZE;
-	/* recbuf and card->read_ccw is not yet used by any other
-	   read channel program */
-	card->dma_stuff->read_ccw.cda = QETH_GET_ADDR(card->dma_stuff->recbuf);
-
-	spin_lock_irqsave(get_ccwdev_lock(CARD_WDEV(card)), flags);
-	result2 = 0;
-	result = ccw_device_start(CARD_WDEV(card), &card->dma_stuff->read_ccw,
-				  IDX_ACTIVATE_READ_STATE, 0, 0);
-	if (result) {
-		qeth_delay_millis(QETH_WAIT_BEFORE_2ND_DOIO);
-		result2 = ccw_device_start(CARD_WDEV(card),
-					   &card->dma_stuff->read_ccw,
-					   IDX_ACTIVATE_READ_STATE, 0, 0);
-		sprintf(dbf_text, "IWR1%4x", result);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		sprintf(dbf_text, "IWR2%4x", result2);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-		PRINT_WARN("qeth_idx_activate_write (read): do_IO returned "
-			   "%i, next try returns %i\n", result, result2);
-	}
-
-	spin_unlock_irqrestore(get_ccwdev_lock(CARD_WDEV(card)), flags);
-
-	if (result2) {
-		result = result2;
-		if (result)
-			return result;
-	}
-
-	if (qeth_sleepon(card, QETH_MPC_TIMEOUT)) {
-		QETH_DBF_TEXT1(0, trace, "IWRT");
-		QETH_DBF_TEXT1(0, trace, CARD_WDEV_ID(card));
-		PRINT_ERR("IDX_ACTIVATE(rd) on write channel device %s: "
-			  "timeout\n", CARD_WDEV_ID(card));
-		return -EIO;
-	}
-	QETH_DBF_TEXT2(0, trace, "iawr");
-	QETH_DBF_TEXT2(0, trace, CARD_WDEV_ID(card));
-	QETH_DBF_HEX2(0, control, card->dma_stuff->recbuf,
-		      QETH_DBF_CONTROL_LEN);
-
-	if (!(QETH_IS_IDX_ACT_POS_REPLY(card->dma_stuff->recbuf))) {
-		QETH_DBF_TEXT1(0, trace, "IWNR");
-		QETH_DBF_TEXT1(0, trace, CARD_WDEV_ID(card));
-		PRINT_ERR("IDX_ACTIVATE on write channel device %s: negative "
-			  "reply\n", CARD_WDEV_ID(card));
-		return -EIO;
-	}
-
-	memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(card->dma_stuff->recbuf), 2);
-	if ((temp & ~0x0100) != qeth_peer_func_level(card->func_level)) {
-		QETH_DBF_TEXT1(0, trace, "IWFM");
-		QETH_DBF_TEXT1(0, trace, CARD_WDEV_ID(card));
-		sprintf(dbf_text, "%4x%4x", card->func_level, temp);
-		QETH_DBF_TEXT1(0, trace, dbf_text);
-		PRINT_WARN("IDX_ACTIVATE on write channel device %s: function "
-			   "level mismatch (sent: 0x%x, received: 0x%x)\n",
-			   CARD_WDEV_ID(card), card->func_level, temp);
-		result = -EIO;
-	}
-
-	return result;
-}
-
-static int
-qeth_cm_enable(struct qeth_card *card)
-{
-	unsigned char *buffer;
-	int result;
-	char dbf_text[15];
-
-	memcpy(card->send_buf, CM_ENABLE, CM_ENABLE_SIZE);
-
-	memcpy(QETH_CM_ENABLE_ISSUER_RM_TOKEN(card->send_buf),
-	       &card->token.issuer_rm_r, QETH_MPC_TOKEN_LENGTH);
-	memcpy(QETH_CM_ENABLE_FILTER_TOKEN(card->send_buf),
-	       &card->token.cm_filter_w, QETH_MPC_TOKEN_LENGTH);
-
-	buffer = qeth_send_control_data(card, card->send_buf,
-					CM_ENABLE_SIZE, MPC_SETUP_STATE);
-
-	if (!buffer) {
-		QETH_DBF_TEXT2(0, trace, "CME:NOBF");
-		return -EIO;
-	}
-
-	memcpy(&card->token.cm_filter_r,
-	       QETH_CM_ENABLE_RESP_FILTER_TOKEN(buffer), QETH_MPC_TOKEN_LENGTH);
-
-	result = qeth_check_idx_response(buffer);
-
-	sprintf(dbf_text, "cme=%4x", result);
-	QETH_DBF_TEXT3(0, trace, dbf_text);
-
-	return result;
-}
-
-static int
-qeth_cm_setup(struct qeth_card *card)
-{
-	unsigned char *buffer;
-	int result;
-	char dbf_text[15];
-
-	memcpy(card->send_buf, CM_SETUP, CM_SETUP_SIZE);
-
-	memcpy(QETH_CM_SETUP_DEST_ADDR(card->send_buf),
-	       &card->token.issuer_rm_r, QETH_MPC_TOKEN_LENGTH);
-	memcpy(QETH_CM_SETUP_CONNECTION_TOKEN(card->send_buf),
-	       &card->token.cm_connection_w, QETH_MPC_TOKEN_LENGTH);
-	memcpy(QETH_CM_SETUP_FILTER_TOKEN(card->send_buf),
-	       &card->token.cm_filter_r, QETH_MPC_TOKEN_LENGTH);
-
-	buffer = qeth_send_control_data(card, card->send_buf,
-					CM_SETUP_SIZE, MPC_SETUP_STATE);
-
-	if (!buffer) {
-		QETH_DBF_TEXT2(0, trace, "CMS:NOBF");
-		return -EIO;
-	}
-
-	memcpy(&card->token.cm_connection_r,
-	       QETH_CM_SETUP_RESP_DEST_ADDR(buffer), QETH_MPC_TOKEN_LENGTH);
-
-	result = qeth_check_idx_response(buffer);
-
-	sprintf(dbf_text, "cms=%4x", result);
-	QETH_DBF_TEXT3(0, trace, dbf_text);
-
-	return result;
-}
-
-static int
-qeth_ulp_enable(struct qeth_card *card)
-{
-	unsigned char *buffer;
-	__u16 mtu, framesize;
-	__u16 len;
-	__u8 link_type;
-	int result;
-	char dbf_text[15];
-
-	memcpy(card->send_buf, ULP_ENABLE, ULP_ENABLE_SIZE);
-
-	*(QETH_ULP_ENABLE_LINKNUM(card->send_buf)) =
-	    (__u8) card->options.portno;
-
-	memcpy(QETH_ULP_ENABLE_DEST_ADDR(card->send_buf),
-	       &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
-	memcpy(QETH_ULP_ENABLE_FILTER_TOKEN(card->send_buf),
-	       &card->token.ulp_filter_w, QETH_MPC_TOKEN_LENGTH);
-
-	memcpy(QETH_ULP_ENABLE_PORTNAME_AND_LL(card->send_buf),
-	       card->options.portname, 9);
-
-	buffer = qeth_send_control_data(card, card->send_buf,
-					ULP_ENABLE_SIZE, MPC_SETUP_STATE);
-
-	if (!buffer) {
-		QETH_DBF_TEXT2(0, trace, "ULE:NOBF");
-		return -EIO;
-	}
-
-	memcpy(&card->token.ulp_filter_r,
-	       QETH_ULP_ENABLE_RESP_FILTER_TOKEN(buffer),
-	       QETH_MPC_TOKEN_LENGTH);
-
-	/* to be done before qeth_init_ringbuffers and qeth_init_dev */
-	if (qeth_get_mtu_out_of_mpc(card->type)) {
-		memcpy(&framesize, QETH_ULP_ENABLE_RESP_MAX_MTU(buffer), 2);
-		mtu = qeth_get_mtu_outof_framesize(framesize);
-
-		QETH_DBF_CARD2(0, trace, "ule", card);
-		sprintf(dbf_text, "mtu=%4x", mtu);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-
-		if (!mtu)
-			return -EINVAL;
-
-		card->max_mtu = mtu;
-		card->initial_mtu = mtu;
-		card->inbound_buffer_size = mtu + 2 * PAGE_SIZE;
-	} else {
-		card->initial_mtu = qeth_get_initial_mtu_for_card(card);
-		card->max_mtu = qeth_get_max_mtu_for_card(card->type);
-		card->inbound_buffer_size = DEFAULT_BUFFER_SIZE;
-	}
-
-	memcpy(&len, QETH_ULP_ENABLE_RESP_DIFINFO_LEN(buffer), 2);
-	if (len >= QETH_MPC_DIFINFO_LEN_INDICATES_LINK_TYPE) {
-		memcpy(&link_type, QETH_ULP_ENABLE_RESP_LINK_TYPE(buffer), 1);
-		card->link_type = link_type;
-		sprintf(dbf_text, "link=%2x", link_type);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-	} else
-		card->link_type = 0;
-
-	result = qeth_check_idx_response(buffer);
-
-	sprintf(dbf_text, "ule=%4x", result);
-	QETH_DBF_TEXT3(0, trace, dbf_text);
-
-	return result;
-}
-
-static int
-qeth_ulp_setup(struct qeth_card *card)
-{
-	unsigned char *buffer;
-	__u16 temp;
-	int result;
-	char dbf_text[15];
-
-	memcpy(card->send_buf, ULP_SETUP, ULP_SETUP_SIZE);
-
-	memcpy(QETH_ULP_SETUP_DEST_ADDR(card->send_buf),
-	       &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
-	memcpy(QETH_ULP_SETUP_CONNECTION_TOKEN(card->send_buf),
-	       &card->token.ulp_connection_w, QETH_MPC_TOKEN_LENGTH);
-	memcpy(QETH_ULP_SETUP_FILTER_TOKEN(card->send_buf),
-	       &card->token.ulp_filter_r, QETH_MPC_TOKEN_LENGTH);
-
-	temp = __raw_devno_from_bus_id(CARD_DDEV_ID(card));
-	memcpy(QETH_ULP_SETUP_CUA(card->send_buf), &temp, 2);
-	temp = (card->cula << 8) + card->unit_addr2;
-	memcpy(QETH_ULP_SETUP_REAL_DEVADDR(card->send_buf), &temp, 2);
-
-	buffer = qeth_send_control_data(card, card->send_buf,
-					ULP_SETUP_SIZE, MPC_SETUP_STATE);
-
-	if (!buffer) {
-		QETH_DBF_TEXT2(0, trace, "ULS:NOBF");
-		return -EIO;
-	}
-
-	memcpy(&card->token.ulp_connection_r,
-	       QETH_ULP_SETUP_RESP_CONNECTION_TOKEN(buffer),
-	       QETH_MPC_TOKEN_LENGTH);
-
-	result = qeth_check_idx_response(buffer);
-
-	sprintf(dbf_text, "uls=%4x", result);
-	QETH_DBF_TEXT3(0, trace, dbf_text);
-
-	return result;
-}
-
-static int
-qeth_qdio_establish(struct qeth_card *card)
-{
-	int result;
-	char *adapter_area;
-	char dbf_text[15];
-	void **input_array, **output_array, **ptr;
-	int i, j;
-	struct qdio_initialize init_data;
-
- 	adapter_area = vmalloc(QDIO_MAX_BUFFERS_PER_Q * sizeof(char));
- 	if (!adapter_area)
-		return -ENOMEM;
- 
- 	memset(adapter_area, 0, QDIO_MAX_BUFFERS_PER_Q * sizeof(char));
-
-	adapter_area[0] = _ascebc['P'];
-	adapter_area[1] = _ascebc['C'];
-	adapter_area[2] = _ascebc['I'];
-	adapter_area[3] = _ascebc['T'];
-	*((unsigned int *) (&adapter_area[4])) = PCI_THRESHOLD_A;
-	*((unsigned int *) (&adapter_area[8])) = PCI_THRESHOLD_B;
-	*((unsigned int *) (&adapter_area[12])) = PCI_TIMER_VALUE;
-
-	input_array = vmalloc(QDIO_MAX_BUFFERS_PER_Q * sizeof (void *));
-	if (!input_array) {
-		vfree(adapter_area);
-		return -ENOMEM;
-	}
-	ptr = input_array;
-	for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; j++) {
-		*ptr = (void *) virt_to_phys(&card->inbound_qdio_buffers[j]);
-		ptr++;
-	}
-
-	output_array = vmalloc(QDIO_MAX_BUFFERS_PER_Q * sizeof (void *) *
-			       card->no_queues);
-	if (!output_array) {
-		vfree(input_array);
-		vfree(adapter_area);
-		return -ENOMEM;
-	}
-	ptr = output_array;
-	for (i = 0; i < card->no_queues; i++)
-		for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; j++) {
-			*ptr = (void *) virt_to_phys
-			    (&card->outbound_ringbuffer[i]->buffer[j]);
-			ptr++;
-		}
-
-	init_data.cdev = CARD_DDEV(card);
-	init_data.q_format = qeth_get_q_format(card->type);
-	init_data.qib_param_field_format = 0;
-	init_data.qib_param_field = adapter_area;
-	init_data.input_slib_elements = NULL;
-	init_data.output_slib_elements = NULL;
-	init_data.min_input_threshold = card->options.polltime;
-	init_data.max_input_threshold = card->options.polltime;
-	init_data.min_output_threshold = QETH_MIN_OUTPUT_THRESHOLD;
-	init_data.max_output_threshold = QETH_MAX_OUTPUT_THRESHOLD;
-	init_data.no_input_qs = 1;
-	init_data.no_output_qs = card->no_queues;
-	init_data.input_handler = qeth_qdio_input_handler;
-	init_data.output_handler = qeth_qdio_output_handler;
-	init_data.int_parm = (unsigned long) card;
-	init_data.flags = QDIO_INBOUND_0COPY_SBALS |
-	    QDIO_OUTBOUND_0COPY_SBALS | QDIO_USE_OUTBOUND_PCIS;
-	init_data.input_sbal_addr_array = input_array;
-	init_data.output_sbal_addr_array = output_array;
-
-	result = qdio_initialize(&init_data);
-
-	vfree(input_array);
-	vfree(output_array);
-	vfree(adapter_area);
-
-	sprintf(dbf_text, "qde=%4i", result);
-	QETH_DBF_TEXT3(0, trace, dbf_text);
-
-	return result;
-}
-
-static int
-qeth_qdio_activate(struct qeth_card *card)
-{
-	int result;
-	char dbf_text[15];
-
-	result = qdio_activate(CARD_DDEV(card), 0);
-
-	sprintf(dbf_text, "qda=%4x", result);
-	QETH_DBF_TEXT3(0, trace, dbf_text);
-
-	return result;
-}
-
-static int
-qeth_dm_act(struct qeth_card *card)
-{
-	unsigned char *buffer;
-	int result;
-	char dbf_text[15];
-
-	memcpy(card->send_buf, DM_ACT, DM_ACT_SIZE);
-
-	memcpy(QETH_DM_ACT_DEST_ADDR(card->send_buf),
-	       &card->token.cm_connection_r, QETH_MPC_TOKEN_LENGTH);
-	memcpy(QETH_DM_ACT_CONNECTION_TOKEN(card->send_buf),
-	       &card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
-
-	buffer = qeth_send_control_data(card, card->send_buf,
-					DM_ACT_SIZE, MPC_SETUP_STATE);
-
-	if (!buffer) {
-		QETH_DBF_TEXT2(0, trace, "DMA:NOBF");
-		return -EIO;
-	}
-
-	result = qeth_check_idx_response(buffer);
-
-	sprintf(dbf_text, "dma=%4x", result);
-	QETH_DBF_TEXT3(0, trace, dbf_text);
-
-	return result;
-}
-
-static inline int
-__qeth_verify_dev_vlan(struct net_device *dev,struct qeth_card *card)
-{
-#ifdef QETH_VLAN
-	struct vlan_group *vlan_grp;
-	int i;
-	int result = 0;
-
-	/* check all vlan devices */
-	vlan_grp = (struct vlan_group *) card->vlangrp;
-	if (vlan_grp) {
-		for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
-			if (vlan_grp->vlan_devices[i] == dev) {
-				result = QETH_VERIFY_IS_VLAN_DEV;
-			}
-		}
-	}
-	return result;
-#endif
-	return 0;
-}
-
-#if defined(QETH_VLAN)||defined(QETH_IPV6)
-static int
-qeth_verify_dev(struct net_device *dev)
-{
-	struct qeth_card *tmp;
-	int result = 0;
-
-	read_lock(&list_lock);
-	tmp = firstcard;
-	for (; tmp && (!result); tmp = tmp->next) {
-		if (atomic_read(&tmp->shutdown_phase))
-			continue;
-		result = (dev == tmp->dev)?
-			QETH_VERIFY_IS_REAL_DEV:__qeth_verify_dev_vlan(dev, tmp);
-	}
-	read_unlock(&list_lock);
-	return result;
-}
-#endif /* defined(QETH_VLAN)||defined(QETH_IPV6) */
-
-static int
-qeth_verify_card(struct qeth_card *card)
-{
-	struct qeth_card *tmp;
-	int result = 0;
-
-	read_lock(&list_lock);
-	tmp = firstcard;
-	while (tmp) {
-		if ((card == tmp) && (!atomic_read(&card->shutdown_phase))) {
-			result = 1;
-			break;
-		}
-		tmp = tmp->next;
-	}
-	read_unlock(&list_lock);
-	return result;
-}
-
-static inline struct qeth_card *
-__qeth_get_card_from_dev(struct net_device *dev)
-{
-#ifdef QETH_VLAN
-	if (qeth_verify_dev(dev) == QETH_VERIFY_IS_VLAN_DEV)
-		return (struct qeth_card *) VLAN_DEV_INFO(dev)->real_dev->priv;
-	else
-#endif
-		return (struct qeth_card *) dev->priv;
-}
-
-#ifdef QETH_IPV6
-/* FIXME: don't put extern declarations in a c file, use a header that's
- * shared with the definition for this! */
-extern struct neigh_table arp_tbl;
-static int (*qeth_old_arp_constructor) (struct neighbour *);
-static struct neigh_ops arp_direct_ops_template = {
-	.family = AF_INET,
-	.destructor = NULL,
-	.solicit = NULL,
-	.error_report = NULL,
-	.output = dev_queue_xmit,
-	.connected_output = dev_queue_xmit,
-	.hh_output = dev_queue_xmit,
-	.queue_xmit = dev_queue_xmit
-};
-
-/*
- * FIXME:
- * as we have neighbour structures point to this structure, even
- * after our life time, this will stay in memory as a leak 
- */
-static struct neigh_ops *arp_direct_ops;
-
-
-static int
-qeth_arp_constructor(struct neighbour *neigh)
-{
-	char dbf_text[15];
-	struct net_device *dev = neigh->dev;
-	struct in_device *in_dev = in_dev_get(dev);
-
-	if (in_dev == NULL)
-		return -EINVAL;
-
-	QETH_DBF_TEXT4(0, trace, "arpconst");
-	if (!qeth_verify_dev(dev)) {
-
-		in_dev_put(in_dev);
-		return qeth_old_arp_constructor(neigh);
-	}
-
-	neigh->type = inet_addr_type(*(u32 *) neigh->primary_key);
-	if (in_dev->arp_parms)
-		neigh->parms = in_dev->arp_parms;
-
-	in_dev_put(in_dev);
-
-	sprintf(dbf_text, "%08x", ntohl(*((__u32 *) (neigh->primary_key))));
-	QETH_DBF_TEXT4(0, trace, dbf_text);
-	QETH_DBF_HEX4(0, trace, &neigh, sizeof (void *));
-
-	neigh->nud_state = NUD_NOARP;
-	neigh->ops = arp_direct_ops;
-	neigh->output = neigh->ops->queue_xmit;
-	return 0;
-}
-
-static int
-qeth_hard_header(struct sk_buff *skb, struct net_device *dev,
-		 unsigned short type, void *daddr, void *saddr, unsigned len)
-{
-	struct qeth_card *card;
-
-	QETH_DBF_TEXT5(0, trace, "hardhdr");
-
-	card = __qeth_get_card_from_dev(dev);
-	return card->hard_header(skb, dev, type, daddr, saddr, len);
-}
-
-static void
-qeth_header_cache_update(struct hh_cache *hh,
-			 struct net_device *dev, unsigned char *haddr)
-{
-	struct qeth_card *card;
-
-	card = (struct qeth_card *) dev->priv;
-	QETH_DBF_TEXT5(0, trace, "hdrcheup");
-	return card->header_cache_update(hh, dev, haddr);
-}
-
-static int
-qeth_rebuild_header(struct sk_buff *skb)
-{
-	struct qeth_card *card;
-	QETH_DBF_TEXT5(0, trace, "rebldhdr");
-	if (skb->protocol == __constant_htons(ETH_P_IP))
-		return 0;
-
-	card = __qeth_get_card_from_dev(skb->dev);
-
-	return card->rebuild_header(skb);
-}
-
-int
-qeth_ipv6_generate_eui64(u8 * eui, struct net_device *dev)
-{
-	switch (dev->type) {
-	case ARPHRD_ETHER:
-	case ARPHRD_FDDI:
-	case ARPHRD_IEEE802_TR:
-		if (dev->addr_len != ETH_ALEN)
-			return -1;
-		memcpy(eui, dev->dev_addr, 3);
-		memcpy(eui + 5, dev->dev_addr + 3, 3);
-		eui[3] = (dev->dev_id >> 8) & 0xff;
-		eui[4] = dev->dev_id & 0xff;
-		return 0;
-	}
-	return -1;
-
-}
-#endif /* QETH_IPV6 */
-
-static void
-qeth_ipv6_init_card(struct qeth_card *card)
-{
-#ifdef QETH_IPV6
-	card->hard_header = qeth_get_hard_header(card->link_type);
-	card->rebuild_header = qeth_get_rebuild_header(card->link_type);
-	card->hard_header_cache = qeth_get_hard_header_cache(card->link_type);
-	card->header_cache_update =
-	    qeth_get_header_cache_update(card->link_type);
-	card->type_trans = qeth_get_type_trans(card->link_type);
-	card->dev->dev_id = card->unique_id & 0xffff;
-	if (!(card->unique_id & UNIQUE_ID_NOT_BY_CARD))
-		card->dev->generate_eui64 = qeth_ipv6_generate_eui64;
-#endif /* QETH_IPV6 */
-}
-
-#ifdef QETH_VLAN
-static void
-qeth_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
-{
-	struct qeth_card *card;
-	card = (struct qeth_card *) dev->priv;
-	spin_lock_irq(&card->vlan_lock);
-	card->vlangrp = grp;
-	spin_unlock_irq(&card->vlan_lock);
-}
-static void
-qeth_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
-{
-	struct qeth_card *card;
-	card = (struct qeth_card *) dev->priv;
-	spin_lock_irq(&card->vlan_lock);
-	if (card->vlangrp)
-		card->vlangrp->vlan_devices[vid] = NULL;
-	spin_unlock_irq(&card->vlan_lock);
-}
-#endif
-
-static void
-qeth_tx_timeout(struct net_device *dev)
-{
-	struct qeth_card *card;
-
-	card = (struct qeth_card *) dev->priv;
-	QETH_DBF_CARD2(1, trace, "XMTO", card);
-	card->stats->tx_errors++;
-	atomic_set(&card->problem, PROBLEM_TX_TIMEOUT);
-	qeth_schedule_recovery(card);
-}
-
-static void*
-__qeth_rebuild_header_func(struct qeth_card *card)
-{
-#ifdef QETH_IPV6
-	return (!(qeth_get_additional_dev_flags(card->type) & IFF_NOARP)) ?
-		(qeth_get_rebuild_header(card->link_type) ?
-		 qeth_rebuild_header : NULL) : NULL;
-#endif /* QETH_IPV6 */
-	return NULL;
-}
-
-static void*
-__qeth_hard_header_func(struct qeth_card *card)
-{
-#ifdef QETH_IPV6
-	return (!(qeth_get_additional_dev_flags(card->type) & IFF_NOARP)) ?
-		(qeth_get_hard_header(card->link_type) ?
-		 qeth_hard_header : NULL) : NULL;
-#endif /* QETH_IPV6 */
-	return NULL;
-}
-
-static void*
-__qeth_header_cache_update_func(struct qeth_card *card)
-{
-#ifdef QETH_IPV6
-	return (!(qeth_get_additional_dev_flags(card->type) & IFF_NOARP)) ?
-		(qeth_get_header_cache_update(card->link_type) ?
-		 qeth_header_cache_update : NULL) : NULL;
-#endif /* QETH_IPV6 */
-	return NULL;
-}
-
-static void*
-__qeth_hard_header_cache_func(struct qeth_card *card)
-{
-#ifdef QETH_IPV6
-	return (!(qeth_get_additional_dev_flags(card->type) & IFF_NOARP)) ?
-		qeth_get_hard_header_cache(card->link_type) : NULL;
-#endif /* QETH_IPV6 */
-	return NULL;
-}
-
-static int
-qeth_init_dev(struct net_device *dev)
-{
-	struct qeth_card *card;
-
-	card = (struct qeth_card *) dev->priv;
-
-	QETH_DBF_CARD3(0, trace, "inid", card);
-
-	dev->rebuild_header = __qeth_rebuild_header_func(card);
-	dev->hard_header = __qeth_hard_header_func(card);
-	dev->header_cache_update = __qeth_header_cache_update_func(card);
-	dev->hard_header_cache = __qeth_hard_header_cache_func(card);
-	dev->hard_header_parse = NULL;
-
-	dev->flags |= qeth_get_additional_dev_flags(card->type);
-
-	dev->flags |= ((card->options.fake_broadcast == FAKE_BROADCAST) ||
-		       (card->broadcast_capable)) ? IFF_BROADCAST : 0;
-
-	 /* is done in hardsetup_card... see comment below
-	 qeth_send_qipassist(card,4);*/
-
-	/* that was the old place. one id. we need to make sure, that
-	 * hydra knows about us going to use the same id again, so we
-	 * do that in hardsetup_card every time
-	 qeth_get_unique_id(card);*/
-
-	dev->tx_queue_len = qeth_get_device_tx_q_len(card->type);
-	dev->hard_header_len =
-		qeth_get_hlen(card->link_type) + card->options.add_hhlen;
-	netif_start_queue(dev);
-
-	dev->mtu = card->initial_mtu;
-
-	qeth_ipv6_init_card(card);
-
-	return 0;
-}
-
-static int
-qeth_get_unitaddr(struct qeth_card *card)
-{
-	char *prcd;
-	int result = 0;
-	char dbf_text[15];
-	int length;
-
-	QETH_DBF_CARD3(0, trace, "gtua", card);
-
-	result = read_conf_data(CARD_DDEV(card), (void **) &prcd, &length);
-	if (result) {
-		sprintf(dbf_text, "rcd%4x", result);
-		QETH_DBF_TEXT3(0, trace, dbf_text);
-		PRINT_ERR("read_conf_data for device %s returned %i\n",
-			  CARD_DDEV_ID(card), result);
-		return result;
-	}
-
-	card->chpid = prcd[30];
-	card->unit_addr2 = prcd[31];
-	card->cula = prcd[63];
-	card->is_guest_lan= ((prcd[0x10] == _ascebc['V']) &&
-			     (prcd[0x11] == _ascebc['M']));
-
-	sprintf(dbf_text, "chpid:%02x", card->chpid);
-	QETH_DBF_TEXT2(0, trace, dbf_text);
-	sprintf(dbf_text, "unad2:%02x", card->unit_addr2);
-	QETH_DBF_TEXT2(0, trace, dbf_text);
-	sprintf(dbf_text, "cula:%02x", card->cula);
-	QETH_DBF_TEXT2(0, trace, dbf_text);
-
-	return 0;
-}
-
-static int
-qeth_send_nops(struct qeth_card *card)
-{
-	int result, result2;
-	unsigned long saveflags;
-
-	card->dma_stuff->write_ccw.cmd_code = CCW_NOP_CMD;
-	card->dma_stuff->write_ccw.flags = CCW_FLAG_SLI;
-	card->dma_stuff->write_ccw.count = CCW_NOP_COUNT;
-	card->dma_stuff->write_ccw.cda = (unsigned long) NULL;
-
-#define DO_SEND_NOP(cdev) \
-do { \
-	QETH_DBF_TEXT3(0, trace, "snnp"); \
-	QETH_DBF_TEXT3(0, trace, cdev->dev.bus_id); \
-\
-	spin_lock_irqsave(get_ccwdev_lock(cdev),saveflags); \
-	ccw_device_set_options(cdev, 0); \
-        result=ccw_device_start(cdev,&card->dma_stuff->write_ccw, \
-				NOP_STATE,0,0); \
-        if (result) { \
-		qeth_delay_millis(QETH_WAIT_BEFORE_2ND_DOIO); \
-                result2=ccw_device_start(cdev,&card->dma_stuff->write_ccw, \
-					 NOP_STATE,0,0); \
-                PRINT_WARN("qeth_send_nops on device %s: do_IO returned %i, " \
-                           "next try returns %i\n", \
-                           cdev->dev.bus_id,result,result2); \
-		result=result2; \
-        } \
-        spin_unlock_irqrestore(get_ccwdev_lock(cdev),saveflags); \
-\
-	if (result) goto exit; \
-\
-        if (qeth_sleepon(card,QETH_NOP_TIMEOUT)) { \
-		QETH_DBF_TEXT2(0,trace,"snnp:tme"); \
-		result=-EIO; \
-		goto exit; \
-        } \
-} while (0)
-
-	DO_SEND_NOP(CARD_RDEV(card));
-	DO_SEND_NOP(CARD_WDEV(card));
-	DO_SEND_NOP(CARD_DDEV(card));
-
-exit:
-	return result;
-}
-
-static void
-qeth_clear_card_structures(struct qeth_card *card)
-{
-	int i, j;
-
-	if (!card) {
-		QETH_DBF_TEXT2(0, trace, "clrCRDnc");
-		return;
-	}
-
-	QETH_DBF_CARD3(0, trace, "clcs", card);
-
-	atomic_set(&card->is_startlaned, 0);
-
-	for (i = 0; i < QETH_MAX_QUEUES; i++) {
-		card->send_state[i] = SEND_STATE_DONT_PACK;
-		card->outbound_first_free_buffer[i] = 0;
-		atomic_set(&card->outbound_used_buffers[i], 0);
-		atomic_set(&card->outbound_ringbuffer_lock[i], 0);
-
-		for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; j++) {
-			card->outbound_buffer_send_state[i][j] =
-			    SEND_STATE_DONT_PACK;
-			card->send_retries[i][j] = 0;
-
-			if (i < card->no_queues) {
-				card->outbound_ringbuffer[i]->
-				    ringbuf_element[j].next_element_to_fill = 0;
-				card->outbound_bytes_in_buffer[i] = 0;
-				skb_queue_head_init(&card->
-						    outbound_ringbuffer[i]->
-						    ringbuf_element[j].
-						    skb_list);
-			}
-		}
-	}
-
-	for (i = 0; i < card->options.inbound_buffer_count; i++) {
-		xchg((int *) &card->inbound_buffer_pool_entry_used[i],
-		     BUFFER_UNUSED);
-	}
-
-	spin_lock_init(&card->requeue_input_lock);
-	atomic_set(&card->requeue_position, 0);
-	atomic_set(&card->requeue_counter, 0);
-
-	card->seqno.trans_hdr = 0;
-	card->seqno.pdu_hdr = 0;
-	card->seqno.pdu_hdr_ack = 0;
-	card->seqno.ipa = 0;
-
-	qeth_clear_ifa4_list(&card->ip_current_state.ip_ifa);
-	qeth_clear_ifa4_list(&card->ip_new_state.ip_ifa);
-	qeth_clear_ifamc_list(&card->ip_mc_current_state.ipm_ifa);
-	qeth_clear_ifamc_list(&card->ip_mc_new_state.ipm_ifa);
-
-#ifdef QETH_IPV6
-	qeth_clear_ifa6_list(&card->ip_current_state.ip6_ifa);
-	qeth_clear_ifa6_list(&card->ip_new_state.ip6_ifa);
-	qeth_clear_ifamc_list(&card->ip_mc_current_state.ipm6_ifa);
-	qeth_clear_ifamc_list(&card->ip_mc_new_state.ipm6_ifa);
-#endif /* QETH_IPV6 */
-}
-
-static void
-qeth_init_input_buffers(struct qeth_card *card)
-{
-	int i;
-
-	/* slowly, slowly (we don't want to enqueue all buffers
-	 * at one time) */
-	for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; i++) {
-		atomic_set(&card->inbound_buffer_refcnt[i], 1);
-	}
-	for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; i++) {
-		atomic_set(&card->inbound_buffer_refcnt[i], 0);
- 		/* only try to queue as many buffers as we have at all */
- 		if (i < card->options.inbound_buffer_count)
- 			qeth_queue_input_buffer(card,i,0);
-	}
-	qdio_synchronize(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0);
-}
-
-/* initializes all the structures for a card */
-static int
-qeth_hardsetup_card(struct qeth_card *card, int in_recovery)
-{
-	int result, q, breakout;
-	unsigned long flags;
-	int laps = QETH_HARDSETUP_LAPS;
-	int clear_laps;
-	int cleanup_qdio;
-	char dbf_text[15];
-	int i, r;
-
-	/* setup name and so on */
-	atomic_set(&card->shutdown_phase, 0);
-
-	if (atomic_read(&card->is_hardsetup)) {
-		QETH_DBF_CARD2(1, trace, "hscd", card);
-		PRINT_ALL("card is already hardsetup.\n");
-		return 0;
-	}
-
-	cleanup_qdio = in_recovery;	/* if we are in recovery, we clean
-					   the qdio stuff up */
-
-	down(&card->hardsetup_sema);
-	atomic_set(&card->write_busy, 0);
-
-	do {
-		if (in_recovery) {
-			PRINT_STUPID("qeth: recovery: quiescing %s...\n",
-				     card->dev_name);
-			QETH_DBF_CARD2(0, trace, "Rqsc", card);
-			qeth_wait_nonbusy(QETH_QUIESCE_WAIT_BEFORE_CLEAR);
-		}
-		clear_laps = QETH_HARDSETUP_CLEAR_LAPS;
-		do {
-			if (in_recovery)
-				PRINT_STUPID("clearing card %s\n",
-					     card->dev_name);
-			qeth_clear_card(card, cleanup_qdio,
-					(card->type == QETH_CARD_TYPE_OSAE));
-			result = qeth_send_nops(card);
-			breakout = atomic_read(&card->break_out);
-		} while ((--clear_laps) && (result));
-		if (result) {
-			goto exit;
-		}
-
-		if (in_recovery) {
-			PRINT_STUPID("qeth: recovery: still quiescing %s...\n",
-				     card->dev_name);
-			QETH_DBF_CARD2(0, trace, "RQsc", card);
-			qeth_wait_nonbusy(QETH_QUIESCE_WAIT_AFTER_CLEAR);
-		} else {
-			atomic_set(&card->shutdown_phase, 0);
-		}
-
-		cleanup_qdio = 0;	/* qdio was cleaned now, if necessary */
-
-		result = qeth_get_unitaddr(card);
-		if (result)
-			goto exit;
-
-		qeth_generate_tokens(card);
-
-#define PRINT_TOKENS do { \
-		sprintf(dbf_text,"stra    "); \
-		memcpy(&dbf_text[4],&card->seqno.trans_hdr,4); \
-		QETH_DBF_HEX3(0,trace,dbf_text,QETH_DBF_TRACE_LEN); \
-		sprintf(dbf_text,"spdu    "); \
-		memcpy(&dbf_text[4],&card->seqno.pdu_hdr,4); \
-		QETH_DBF_HEX3(0,trace,dbf_text,QETH_DBF_TRACE_LEN); \
-		sprintf(dbf_text,"spda    "); \
-		memcpy(&dbf_text[4],&card->seqno.pdu_hdr_ack,4); \
-		QETH_DBF_HEX3(0,trace,dbf_text,QETH_DBF_TRACE_LEN); \
-		sprintf(dbf_text,"sipa    "); \
-		memcpy(&dbf_text[4],&card->seqno.ipa,4); \
-		QETH_DBF_HEX3(0,trace,dbf_text,QETH_DBF_TRACE_LEN); \
-		sprintf(dbf_text,"tisw    "); \
-		memcpy(&dbf_text[4],&card->token.issuer_rm_w,4); \
-		QETH_DBF_HEX3(0,trace,dbf_text,QETH_DBF_TRACE_LEN); \
-		sprintf(dbf_text,"tisr    "); \
-		memcpy(&dbf_text[4],&card->token.issuer_rm_r,4); \
-		QETH_DBF_HEX3(0,trace,dbf_text,QETH_DBF_TRACE_LEN); \
-		sprintf(dbf_text,"tcfw    "); \
-		memcpy(&dbf_text[4],&card->token.cm_filter_w,4); \
-		QETH_DBF_HEX3(0,trace,dbf_text,QETH_DBF_TRACE_LEN); \
-		sprintf(dbf_text,"tcfr    "); \
-		memcpy(&dbf_text[4],&card->token.cm_filter_r,4); \
-		QETH_DBF_HEX3(0,trace,dbf_text,QETH_DBF_TRACE_LEN); \
-		sprintf(dbf_text,"tccw    "); \
-		memcpy(&dbf_text[4],&card->token.cm_connection_w,4); \
-		QETH_DBF_HEX3(0,trace,dbf_text,QETH_DBF_TRACE_LEN); \
-		sprintf(dbf_text,"tccr    "); \
-		memcpy(&dbf_text[4],&card->token.cm_connection_r,4); \
-		QETH_DBF_HEX3(0,trace,dbf_text,QETH_DBF_TRACE_LEN); \
-		sprintf(dbf_text,"tufw    "); \
-		memcpy(&dbf_text[4],&card->token.ulp_filter_w,4); \
-		QETH_DBF_HEX3(0,trace,dbf_text,QETH_DBF_TRACE_LEN); \
-		sprintf(dbf_text,"tufr    "); \
-		memcpy(&dbf_text[4],&card->token.ulp_filter_r,4); \
-		QETH_DBF_HEX3(0,trace,dbf_text,QETH_DBF_TRACE_LEN); \
-		sprintf(dbf_text,"tucw    "); \
-		memcpy(&dbf_text[4],&card->token.ulp_connection_w,4); \
-		QETH_DBF_HEX3(0,trace,dbf_text,QETH_DBF_TRACE_LEN); \
-		sprintf(dbf_text,"tucr    "); \
-		memcpy(&dbf_text[4],&card->token.ulp_connection_r,4); \
-		QETH_DBF_HEX3(0,trace,dbf_text,QETH_DBF_TRACE_LEN); \
-	} while (0)
-
-		PRINT_TOKENS;
-
-		/* card->break_out and problem will be set here to 0
-		 * (in each lap) (there can't be a problem at this
-		 * early time) */
-		atomic_set(&card->problem, 0);
-		atomic_set(&card->break_out, 0);
-
-#define CHECK_ERRORS \
-		breakout=atomic_read(&card->break_out); \
-		if (breakout==QETH_BREAKOUT_AGAIN) \
-			continue; \
-		else if (breakout==QETH_BREAKOUT_LEAVE) { \
-			result=-EIO; \
-			goto exit; \
-		} \
-		if (result) goto exit
-
-		QETH_DBF_TEXT2(0, trace, "hsidxard");
-		result = qeth_idx_activate_read(card);
-		CHECK_ERRORS;
-
-		PRINT_TOKENS;
-		QETH_DBF_TEXT2(0, trace, "hsidxawr");
-		result = qeth_idx_activate_write(card);
-		CHECK_ERRORS;
-
-		QETH_DBF_TEXT2(0, trace, "hsissurd");
-		/* from here, there will always be an outstanding read */
-		spin_lock_irqsave(get_ccwdev_lock(CARD_RDEV(card)), flags);
-		qeth_issue_next_read(card);
-		spin_unlock_irqrestore(get_ccwdev_lock(CARD_RDEV(card)), flags);
-
-		PRINT_TOKENS;
-		QETH_DBF_TEXT2(0, trace, "hscmenab");
-		result = qeth_cm_enable(card);
-		CHECK_ERRORS;
-
-		PRINT_TOKENS;
-		QETH_DBF_TEXT2(0, trace, "hscmsetu");
-		result = qeth_cm_setup(card);
-		CHECK_ERRORS;
-
-		PRINT_TOKENS;
-		QETH_DBF_TEXT2(0, trace, "hsulpena");
-		result = qeth_ulp_enable(card);
-		CHECK_ERRORS;
-
-		PRINT_TOKENS;
-		QETH_DBF_TEXT2(0, trace, "hsulpset");
-		result = qeth_ulp_setup(card);
-		CHECK_ERRORS;
-
-		cleanup_qdio = 1;
-
-		QETH_DBF_TEXT2(0, trace, "hsqdioes");
-		result = qeth_qdio_establish(card);
-		CHECK_ERRORS;
-
-		PRINT_TOKENS;
-		QETH_DBF_TEXT2(0, trace, "hsqdioac");
-		result = qeth_qdio_activate(card);
-		CHECK_ERRORS;
-
-		PRINT_TOKENS;
-		QETH_DBF_TEXT2(0, trace, "hsdmact");
-		result = qeth_dm_act(card);
-		CHECK_ERRORS;
-	} while ((laps--) && (breakout == QETH_BREAKOUT_AGAIN));
-	if (breakout == QETH_BREAKOUT_AGAIN) {
-		QETH_DBF_CARD2(0, trace, "hsnr", card);
-		PRINT_ERR("qeth: recovery not successful on device "
-			  "%s/%s/%s; giving up.\n",
-			  CARD_RDEV_ID(card),
-			  CARD_WDEV_ID(card), CARD_DDEV_ID(card));
-		result = -EIO;
-		goto exit;
-	}
-
-	qeth_clear_ifa4_list(&card->ip_current_state.ip_ifa);
-	qeth_clear_ifa4_list(&card->ip_new_state.ip_ifa);
-	qeth_clear_ifamc_list(&card->ip_mc_current_state.ipm_ifa);
-	qeth_clear_ifamc_list(&card->ip_mc_new_state.ipm_ifa);
-
-#ifdef QETH_IPV6
-	qeth_clear_ifa6_list(&card->ip_current_state.ip6_ifa);
-	qeth_clear_ifa6_list(&card->ip_new_state.ip6_ifa);
-	qeth_clear_ifamc_list(&card->ip_mc_current_state.ipm6_ifa);
-	qeth_clear_ifamc_list(&card->ip_mc_new_state.ipm6_ifa);
-#endif /* QETH_IPV6 */
-
-	if (!atomic_read(&card->is_registered)) {
-		card->dev->dev_addr[0] = 0;	/* we don't know the mac addr yet */
-		card->dev->dev_addr[1] = 0;
-		card->dev->dev_addr[2] = 0;
-		card->dev->dev_addr[3] = 0;
-		card->dev->dev_addr[4] = 0;
-		card->dev->dev_addr[5] = 0;
-		card->dev->broadcast[0] = card->dev->broadcast[1] = 0xff;
-		card->dev->broadcast[2] = card->dev->broadcast[3] = 0xff;
-		card->dev->broadcast[4] = card->dev->broadcast[5] = 0xff;
-
-		card->dev->type = qeth_get_arphrd_type(card->type,
-						       card->link_type);
-
-		card->dev->init = qeth_init_dev;
-
-		card->ipa_timeout = qeth_get_ipa_timeout(card->type);
-	}
-
-	atomic_set(&card->is_hardsetup, 1);
-	atomic_set(&card->is_softsetup, 0);
-	atomic_set(&card->startlan_attempts, 1);
-
-	for (q = 0; q < card->no_queues; q++)
-		card->send_state[q] = SEND_STATE_DONT_PACK;
-
-	/* we need to know first, whether we should include a value
-	 * into eui-64 address generation */
-	QETH_DBF_TEXT2(0, trace, "qipassi4");
-	r = qeth_send_qipassist(card, 4);
-	if (r) {
-		PRINT_WARN("couldn't send QIPASSIST4 on %s: "
-			   "0x%x\n", card->dev_name, r);
-		sprintf(dbf_text, "QIP4%4x", r);
-		QETH_DBF_TEXT2(0, trace, dbf_text);
-	}
-
-	sprintf(dbf_text, "%4x%4x", card->ipa_supported, card->ipa_enabled);
-	QETH_DBF_TEXT2(0, trace, dbf_text);
-
-	qeth_get_unique_id(card);
-
-	/* print out status */
-	if (in_recovery) {
-		qeth_clear_card_structures(card);
-		qeth_init_input_buffers(card);
-		QETH_DBF_TEXT1(0, trace, "RECOVSUC");
-		PRINT_INFO("qeth: recovered device %s/%s/%s (%s) "
-			   "successfully.\n",
-			   CARD_RDEV_ID(card),
-			   CARD_WDEV_ID(card),
-			   CARD_DDEV_ID(card), card->dev_name);
-	} else {
-		QETH_DBF_TEXT2(0, trace, "hrdsetok");
-
-		switch (card->type) {
-		case QETH_CARD_TYPE_OSAE:
-			/* 
-			 * VM will use a non-zero first character to indicate
-			 * a HiperSockets like reporting of the level
-			 * OSA sets the first character to zero
-			 */
-			if (!card->level[0]) {
-				sprintf(card->level, "%02x%02x", card->level[2],
-					card->level[3]);
-				card->level[QETH_MCL_LENGTH] = 0;
-				break;
-			}
-			/* fallthrough */
-		case QETH_CARD_TYPE_IQD:
-			card->level[0] = (char) _ebcasc[(__u8) card->level[0]];
-			card->level[1] = (char) _ebcasc[(__u8) card->level[1]];
-			card->level[2] = (char) _ebcasc[(__u8) card->level[2]];
-			card->level[3] = (char) _ebcasc[(__u8) card->level[3]];
-			card->level[QETH_MCL_LENGTH] = 0;
-			break;
-		default:
-			memset(&card->level[0], 0, QETH_MCL_LENGTH + 1);
-		}
-
-		sprintf(dbf_text, "lvl:%s", card->level);
-		QETH_DBF_TEXT2(0, setup, dbf_text);
-
-		if (card->portname_required) {
-			sprintf(dbf_text, "%s", card->options.portname + 1);
-			for (i = 0; i < 8; i++)
-				dbf_text[i] =
-				    (char) _ebcasc[(__u8) dbf_text[i]];
-			dbf_text[8] = 0;
-			printk("qeth: Device %s/%s/%s is a%s card%s%s%s\n"
-			       "with link type %s (portname: %s)\n",
-			       CARD_RDEV_ID(card),
-			       CARD_WDEV_ID(card),
-			       CARD_DDEV_ID(card),
-			       qeth_get_cardname(card->type,
-						 card->is_guest_lan),
-			       (card->level[0]) ? " (level: " : "",
-			       (card->level[0]) ? card->level : "",
-			       (card->level[0]) ? ")" : "",
-			       qeth_get_link_type_name(card->type,
-						       card->link_type),
-			       dbf_text);
-		} else {
-			if (card->options.portname[0])
-				printk("qeth: Device %s/%s/%s is a%s "
-				       "card%s%s%s\nwith link type %s "
-				       "(no portname needed by interface).\n",
-				       CARD_RDEV_ID(card),
-				       CARD_WDEV_ID(card),
-				       CARD_DDEV_ID(card),
-				       qeth_get_cardname(card->type,
-							 card->is_guest_lan),
-				       (card->level[0]) ? " (level: " : "",
-				       (card->level[0]) ? card->level : "",
-				       (card->level[0]) ? ")" : "",
-				       qeth_get_link_type_name(card->type,
-							       card->link_type));
-			else
-				printk("qeth: Device %s/%s/%s is a%s "
-				       "card%s%s%s\nwith link type %s.\n",
-				       CARD_RDEV_ID(card),
-				       CARD_WDEV_ID(card),
-				       CARD_DDEV_ID(card),
-				       qeth_get_cardname(card->type,
-							 card->is_guest_lan),
-				       (card->level[0]) ? " (level: " : "",
-				       (card->level[0]) ? card->level : "",
-				       (card->level[0]) ? ")" : "",
-				       qeth_get_link_type_name(card->type,
-							       card->link_type));
-		}
-	}
-
-exit:
-	up(&card->hardsetup_sema);
-	return result;
-}
-
-static int
-qeth_reinit_thread(void *param)
-{
-	struct qeth_card *card = (struct qeth_card *) param;
-	int already_registered;
-	int already_hardsetup;
-	int retry = QETH_RECOVERY_HARDSETUP_RETRY;
-	int result;
-	char name[15];
-
-	QETH_DBF_CARD1(0, trace, "RINI", card);
-
-	/* set a nice name ... */
-	sprintf(name, "qethrinid%s", CARD_BUS_ID(card));
-	daemonize(name);
-
-	if (atomic_read(&card->shutdown_phase))
-		goto out_wakeup;
-	down_interruptible(&card->reinit_thread_sem);
-	if (atomic_read(&card->shutdown_phase))
-		goto out_wakeup;
-
-	QETH_DBF_TEXT1(0, trace, "ri-gotin");
-	PRINT_STUPID("entering recovery (reinit) thread for device %s\n",
-		     card->dev_name);
-
-	atomic_set(&card->is_startlaned, 0);
-	atomic_set(&card->is_softsetup, 0);
-
-	read_lock(&list_lock);
-	if (!qeth_verify_card(card))
-		goto out;
-	QETH_DBF_TEXT1(0, trace, "ri-vrfd");
-
-	atomic_set(&card->write_busy, 0);
-	qeth_set_dev_flag_norunning(card);
-	already_hardsetup = atomic_read(&card->is_hardsetup);
-	already_registered = atomic_read(&card->is_registered);
-	if (already_hardsetup) {
-		atomic_set(&card->is_hardsetup, 0);
-
-		if (-1 == my_spin_lock_nonbusy(card, &setup_lock))
-			goto out;
-		if (atomic_read(&card->shutdown_phase))
-			goto out_wakeup;
-
-		atomic_set(&card->escape_softsetup, 1);
-
-		if (-1 == my_down_trylock_nonbusy(card, &card->softsetup_sema)) {
-			atomic_set(&card->escape_softsetup, 0);
-			goto out;
-		}
-		atomic_set(&card->escape_softsetup, 0);
-		if (atomic_read(&card->shutdown_phase)) {
-			up(&card->softsetup_sema);
-			goto out_wakeup;
-		}
-		if (!qeth_verify_card(card))
-			goto out;
-
-		if (already_registered)
-			netif_stop_queue(card->dev);
-
-		qeth_wait_nonbusy(QETH_QUIESCE_NETDEV_TIME);
-
-		atomic_set(&card->is_startlaned, 0);
-
-		QETH_DBF_TEXT1(0, trace, "ri-frskb");
-		qeth_free_all_skbs(card);
-		do {
-			QETH_DBF_TEXT1(0, trace, "ri-hrdst");
-			result = qeth_hardsetup_card(card, 1);
-		} while (result && (retry--));
-
-		/* tries to remove old ips, that's paranoid, but ok */
-		qeth_clear_ifa4_list(&card->ip_new_state.ip_ifa);
-		qeth_clear_ifamc_list(&card->ip_mc_new_state.ipm_ifa);
-
-#ifdef QETH_IPV6
-		qeth_clear_ifa6_list(&card->ip_new_state.ip6_ifa);
-		qeth_clear_ifamc_list(&card->ip_mc_new_state.ipm6_ifa);
-#endif /* QETH_IPV6 */
-
-		if (result) {
-			QETH_DBF_TEXT1(0, trace, "ri-nosuc");
-			PRINT_ERR("qeth: RECOVERY WAS NOT SUCCESSFUL ON %s "
-				  "(%s/%s/%s), GIVING UP, "
-				  "OUTGOING PACKETS WILL BE DISCARDED!\n",
-				  card->dev_name,
-				  CARD_RDEV_ID(card),
-				  CARD_WDEV_ID(card),
-				  CARD_DDEV_ID(card));
-			/* early leave hard_start_xmit! */
-			atomic_set(&card->is_startlaned, 0);
-			qeth_wakeup_procfile();
-		} else {
-			QETH_DBF_TEXT1(0, trace, "ri-sftst");
-			qeth_softsetup_card(card, QETH_LOCK_ALREADY_HELD);
-			up(&card->softsetup_sema);
-
-			if (!already_registered) {
-				QETH_DBF_TEXT1(0, trace, "ri-regcd");
-				qeth_register_netdev(card);
-			}
-			qeth_restore_dev_flag_state(card);
-			netif_wake_queue(card->dev);
-			qeth_wakeup_procfile();
-		}
-		spin_unlock(&setup_lock);
-	}
-out:
-	atomic_set(&card->in_recovery, 0);
-	read_unlock(&list_lock);
-	QETH_DBF_TEXT1(0, trace, "ri-leave");
-out_wakeup:
-	up(&card->reinit_thread_sem);
-	atomic_dec(&card->reinit_counter);
-
-	return 0;
-}
-
-static void
-qeth_fill_qeth_card_options(struct qeth_card *card)
-{
-	int i;
-
-	card->options.portname[0] = 0;
-	for (i = 1; i < 9; i++)
-		card->options.portname[i] = _ascebc[' '];
-	strcpy(card->options.devname, " ");
-	card->options.routing_type4 = NO_ROUTER;
-#ifdef QETH_IPV6
-	card->options.routing_type6 = NO_ROUTER;
-#endif /* QETH_IPV6 */
-	card->options.portno = 0;
-	card->options.checksum_type = QETH_CHECKSUM_DEFAULT;
-	card->options.do_prio_queueing = QETH_PRIOQ_DEFAULT;
-	card->options.default_queue = QETH_DEFAULT_QUEUE;
-	card->options.inbound_buffer_count = DEFAULT_BUFFER_COUNT;
-	card->options.polltime = QETH_MAX_INPUT_THRESHOLD;
-	card->options.macaddr_mode = MACADDR_NONCANONICAL;
-	card->options.broadcast_mode = BROADCAST_ALLRINGS;
-	card->options.fake_broadcast = DONT_FAKE_BROADCAST;
-	card->options.ena_ipat = ENABLE_TAKEOVER;
-	card->options.add_hhlen = DEFAULT_ADD_HHLEN;
-	card->options.fake_ll = DONT_FAKE_LL;
-}
-
-static void qeth_setup(struct net_device *dev)
-{
-	dev->tx_timeout = &qeth_tx_timeout;
-	dev->watchdog_timeo = QETH_TX_TIMEOUT;
-	dev->open = qeth_open;
-	dev->stop = qeth_stop;
-	dev->set_config = qeth_set_config;
-	dev->hard_start_xmit = qeth_hard_start_xmit;
-	dev->do_ioctl = qeth_do_ioctl;
-	dev->get_stats = qeth_get_stats;
-	dev->change_mtu = qeth_change_mtu;
-#ifdef QETH_VLAN
-	dev->vlan_rx_register = qeth_vlan_rx_register;
-	dev->vlan_rx_kill_vid = qeth_vlan_rx_kill_vid;
-#endif
-	dev->set_multicast_list = qeth_set_multicast_list;
-	dev->set_mac_address = qeth_set_mac_address;
-	dev->neigh_setup = qeth_neigh_setup;
-	dev->addr_len = OSA_ADDR_LEN;	/* is ok for eth, tr, atm lane */
-	SET_MODULE_OWNER(dev);
-}
-
-static int
-qeth_alloc_card_stuff(struct qeth_card *card)
-{
-	if (!card)
-		return -EINVAL;
-
-	QETH_DBF_TEXT3(0, trace, "alccrdst");
-
-	card->dma_stuff =
-	    (struct qeth_dma_stuff *) kmalloc(sizeof (struct qeth_dma_stuff),
-					      GFP_KERNEL | GFP_DMA);
-	if (!card->dma_stuff)
-		goto exit_dma;
-	memset(card->dma_stuff, 0, sizeof (struct qeth_dma_stuff));
-
-	card->dma_stuff->recbuf = (char *) kmalloc(QETH_BUFSIZE,
-						   GFP_KERNEL | GFP_DMA);
-	if (!card->dma_stuff->recbuf)
-		goto exit_dma1;
-	memset(card->dma_stuff->recbuf, 0, QETH_BUFSIZE);
-
-	card->dma_stuff->sendbuf = (char *) kmalloc(QETH_BUFSIZE,
-						    GFP_KERNEL | GFP_DMA);
-	if (!card->dma_stuff->sendbuf)
-		goto exit_dma2;
-	memset(card->dma_stuff->sendbuf, 0, QETH_BUFSIZE);
-
-	card->dev = alloc_netdev(0, "", qeth_setup);
-	if (!card->dev)
-		goto exit_dev;
-
-	card->stats =
-	    (struct net_device_stats *)
-	    kmalloc(sizeof (struct net_device_stats), GFP_KERNEL);
-	if (!card->stats)
-		goto exit_stats;
-	memset(card->stats, 0, sizeof (struct net_device_stats));
-
-	/* setup net_device stuff */
-	card->dev->priv = card;
-
-	/* setup net_device_stats stuff */
-	/* =nothing yet */
-
-	return 0;
-
-	/* these are quick exits in case of failures of the kmallocs */
-exit_stats:
-	free_netdev(card->dev);
-exit_dev:
-	kfree(card->dma_stuff->sendbuf);
-exit_dma2:
-	kfree(card->dma_stuff->recbuf);
-exit_dma1:
-	kfree(card->dma_stuff);
-exit_dma:
-	return -ENOMEM;
-}
-
-static struct qeth_card *
-qeth_alloc_card(void)
-{
-	struct qeth_card *card;
-
-	QETH_DBF_TEXT3(0, trace, "alloccrd");
-	card = (struct qeth_card *) vmalloc(sizeof (struct qeth_card));
-	if (!card)
-		return NULL;
-	memset(card, 0, sizeof (struct qeth_card));
-	init_waitqueue_head(&card->wait_q);
-	init_waitqueue_head(&card->ioctl_wait_q);
-
-	qeth_fill_qeth_card_options(card);
-
-	init_MUTEX(&card->softsetup_sema);
-	init_MUTEX(&card->hardsetup_sema);
-	spin_lock_init(&card->ioctl_lock);
-#ifdef QETH_VLAN
-	spin_lock_init(&card->vlan_lock);
-	card->vlangrp = NULL;
-#endif
-	card->unique_id = 0;
-	sema_init(&card->reinit_thread_sem, 0);
-	up(&card->reinit_thread_sem);
-
-	/* setup card stuff */
-	card->ip_current_state.ip_ifa = NULL;
-	card->ip_new_state.ip_ifa = NULL;
-	card->ip_mc_current_state.ipm_ifa = NULL;
-	card->ip_mc_new_state.ipm_ifa = NULL;
-
-#ifdef QETH_IPV6
-	card->ip_current_state.ip6_ifa = NULL;
-	card->ip_new_state.ip6_ifa = NULL;
-	card->ip_mc_current_state.ipm6_ifa = NULL;
-	card->ip_mc_new_state.ipm6_ifa = NULL;
-#endif /* QETH_IPV6 */
-
-	card->csum_enable_mask = IPA_CHECKSUM_DEFAULT_ENABLE_MASK;
-
-	/* and return to the sender */
-	return card;
-
-}
-
-static int
-qeth_init_ringbuffers1(struct qeth_card *card)
-{
-	int i, j;
-
-	QETH_DBF_CARD3(0, trace, "irb1", card);
-
-	for (i = 0; i < card->no_queues; i++) {
-		card->outbound_ringbuffer[i] =
-		    vmalloc(sizeof (struct qeth_ringbuffer));
-		if (!card->outbound_ringbuffer[i]) {
-			for (j = i - 1; j >= 0; j--) {
-				vfree(card->outbound_ringbuffer[j]);
-				card->outbound_ringbuffer[j] = NULL;
-			}
-			return -ENOMEM;
-		}
-		memset(card->outbound_ringbuffer[i], 0,
-		       sizeof (struct qeth_ringbuffer));
-		for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; j++)
-			skb_queue_head_init(&card->outbound_ringbuffer[i]->
-					    ringbuf_element[j].skb_list);
-	}
-
-	return 0;
-}
-
-static int
-qeth_init_ringbuffers2(struct qeth_card *card)
-{
-	int i, j;
-
-	QETH_DBF_CARD3(0, trace, "irb2", card);
-
-	for (i = 0; i < card->options.inbound_buffer_count; i++) {
-		for (j = 0; j < BUFFER_MAX_ELEMENTS; j++) {
-			card->inbound_buffer_pool_entry[i][j] =
-				kmalloc(PAGE_SIZE, GFP_KERNEL);
-			if (!card->inbound_buffer_pool_entry[i][j]) {
-				goto out;
-			}
-		}
-		card->inbound_buffer_pool_entry_used[i] = BUFFER_UNUSED;
-	}
-
-	spin_lock_init(&card->requeue_input_lock);
-
-	return 0;
-out:
-	for (i = 0; i < card->options.inbound_buffer_count; i++) {
-		for (j = 0; j < QDIO_MAX_ELEMENTS_PER_BUFFER; j++) {
-			if (card->inbound_buffer_pool_entry[i][j]) {
-				if (j < BUFFER_MAX_ELEMENTS)
-					kfree(card->
-					      inbound_buffer_pool_entry[i][j]);
-				card->inbound_buffer_pool_entry[i][j] = NULL;
-			}
-		}
-	}
-	for (i = 0; i < card->no_queues; i++) {
-		vfree(card->outbound_ringbuffer[i]);
-		card->outbound_ringbuffer[i] = NULL;
-	}
-	return -ENOMEM;
-
-}
-
-/* also locked from outside (setup_lock) */
-static void
-qeth_insert_card_into_list(struct qeth_card *card)
-{
-	QETH_DBF_CARD3(0, trace, "icil", card);
-
-	write_lock(&list_lock);
-	card->next = firstcard;
-	firstcard = card;
-	write_unlock(&list_lock);
-}
-
-static int
-qeth_determine_card_type(struct qeth_card *card)
-{
-	int i = 0;
-	char dbf_text[15];
-
-	while (known_devices[i][4]) {
-		if ((CARD_RDEV(card)->id.dev_type == known_devices[i][2]) &&
-		    (CARD_RDEV(card)->id.dev_model == known_devices[i][3])) {
-			card->type = known_devices[i][4];
-			if (card->options.ena_ipat == ENABLE_TAKEOVER)
-				card->func_level = known_devices[i][6];
-			else
-				card->func_level = known_devices[i][7];
-			card->no_queues = known_devices[i][8];
-			card->is_multicast_different = known_devices[i][9];
-			QETH_DBF_TEXT2(0, setup, CARD_BUS_ID(card));
-			sprintf(dbf_text, "ctyp%4x", card->type);
-			QETH_DBF_TEXT2(0, setup, dbf_text);
-			return 0;
-		}
-		i++;
-	}
-	card->type = QETH_CARD_TYPE_UNKNOWN;
-	QETH_DBF_TEXT2(0, setup, CARD_BUS_ID(card));
-	sprintf(dbf_text, "ctypUNKN");
-	QETH_DBF_TEXT2(0, setup, dbf_text);
-	PRINT_ERR("unknown card type on device %s\n", CARD_BUS_ID(card));
-	return -ENOENT;
-}
-
-static int
-qeth_getint(char *s, int longint)
-{
-	int cnt;
-	int hex;
-	int result;
-	char c;
-
-	if (!s)
-		return -1;
-	hex = ((s[0] == '0') && ((s[1] == 'x') || (s[1] == 'X'))) ? 1 : 0;
-	cnt = (hex) ? 2 : 0;	/* start from the first real digit */
-	if (!(s[cnt]))
-		return -1;
-	result = 0;
-	while ((c = s[cnt++])) {
-		if (hex) {
-			if (isxdigit(c))
-				result = result * 16 + qeth_getxdigit(c);
-			else
-				return -1;
-		} else {
-			if (isdigit(c))
-				result = result * 10 + c - '0';
-			else
-				return -1;
-		}
-		/* prevent overflow, 0xffff is enough for us */
-		if (longint) {
-			if (result > 0xfffffff)
-				return -1;
-		} else {
-			if (result > 0xffff)
-				return -1;
-		}
-	}
-	return result;
-}
-
-static void
-__qeth_correct_routing_status_v4(struct qeth_card *card)
-{
-	if (card->options.routing_type4 == NO_ROUTER)
-		return;
-
-	if (card->type == QETH_CARD_TYPE_IQD) {
-		/* if it's not a mc router, it's no router */
-		if ((card->options.routing_type4 == PRIMARY_ROUTER) ||
-		    (card->options.routing_type4 == SECONDARY_ROUTER)) {
-			PRINT_WARN("routing not applicable, reset "
-				   "routing status for ipv4. \n");
-			card->options.routing_type4 = NO_ROUTER;
-		}
-		card->options.do_prio_queueing = NO_PRIO_QUEUEING;
-	} else {
-		/* if it's a mc router, it's no router */
-		if ((!qeth_is_supported(IPA_OSA_MC_ROUTER_AVAIL) &&
-		     (card->options.routing_type4 == MULTICAST_ROUTER)) ||
-		    (card->options.routing_type4 == PRIMARY_CONNECTOR) ||
-		    (card->options.routing_type4 == SECONDARY_CONNECTOR)) {
-			PRINT_WARN("routing not applicable, reset "
-				   "routing status for ipv4. (Did you mean "
-				   "primary_router or secondary_router?)\n");
-			card->options.routing_type4 = NO_ROUTER;
-		}
-	}
-}
-
-static void
-__qeth_correct_routing_status_v6(struct qeth_card *card)
-{
-#ifdef QETH_IPV6
-	if (card->options.routing_type6 == NO_ROUTER)
-		return;
-	if (card->type == QETH_CARD_TYPE_IQD) {
-		/* if it's not a mc router, it's no router */
-		if ((card->options.routing_type6 == PRIMARY_ROUTER) ||
-		    (card->options.routing_type6 == SECONDARY_ROUTER)) {
-			PRINT_WARN("routing not applicable, reset "
-				   "routing status for ipv6. \n");
-			card->options.routing_type6 = NO_ROUTER;
-		}
-		card->options.do_prio_queueing = NO_PRIO_QUEUEING;
-	} else {
-		/* if it's a mc router, it's no router */
-		if ((!qeth_is_supported(IPA_OSA_MC_ROUTER_AVAIL) &&
-		     (card->options.routing_type6 == MULTICAST_ROUTER)) ||
-		    (card->options.routing_type6 == PRIMARY_CONNECTOR) ||
-		    (card->options.routing_type6 == SECONDARY_CONNECTOR)) {
-			PRINT_WARN("routing not applicable, reset "
-				   "routing status for ipv6. (Did you mean "
-				   "primary_router or secondary_router?)\n");
-			card->options.routing_type6 = NO_ROUTER;
-		}
-	}
-#endif /* QETH_IPV6 */
-}
-
-static void
-qeth_correct_routing_status(struct qeth_card *card)
-{
-	__qeth_correct_routing_status_v4(card);
-	__qeth_correct_routing_status_v6(card);
-}
-
-static int
-qeth_init_netdev(struct qeth_card *card)
-{
-
-	int result;
-	char dbf_text[15];
-
-	result = qeth_register_netdev(card);
-	if (result) {
-		PRINT_ALL("         register_netdev %s -- rc=%i\n",
-			  card->dev_name, result);
-		sprintf(dbf_text, "rgnd%4x", (__u16) result);
-		QETH_DBF_TEXT2(1, trace, dbf_text);
-		atomic_set(&card->is_registered, 0);
-		goto out;
-	}
-	strcpy(card->dev_name, card->dev->name);
-	atomic_set(&card->write_busy, 0);
-	atomic_set(&card->is_registered, 1);
-
-	result = qeth_softsetup_card(card, QETH_WAIT_FOR_LOCK);
-
-	if (!result) {
-		qeth_init_input_buffers(card);
-	} else {
-		QETH_DBF_TEXT2(0, trace, "SSFAILED");
-		PRINT_WARN("soft-setup of card failed!\n");
-	}
-
-	INIT_WORK(&card->tqueue, qeth_softsetup_thread_starter, card);
-	schedule_work(&card->tqueue);
-out:
-	qeth_wakeup_procfile();
-	return result;
-
-}
-
-static int
-qeth_dev_event(struct notifier_block *this, unsigned long event, void *ptr)
-{
-	struct qeth_card *card;
-	struct net_device *dev = (struct net_device *) ptr;
-
-	QETH_DBF_TEXT3(0, trace, "devevent");
-	QETH_DBF_HEX3(0, trace, &event, sizeof (unsigned long));
-	QETH_DBF_HEX3(0, trace, &dev, sizeof (void *));
-
-	card = __qeth_get_card_from_dev(dev);
-	if (qeth_does_card_exist(card)) {
-		qeth_save_dev_flag_state(card);
-		switch (event) {
-		default:
-			qeth_start_softsetup_thread(card);
-			break;
-		}
-	}
-
-	return NOTIFY_DONE;
-}
-
-static int
-qeth_ip_event(struct notifier_block *this, unsigned long event, void *ptr)
-{
-	struct qeth_card *card;
-	struct in_ifaddr *ifa = (struct in_ifaddr *) ptr;
-	struct net_device *dev = ifa->ifa_dev->dev;
-	char dbf_text[15];
-
-	QETH_DBF_TEXT3(0, trace, "ipevent");
-	QETH_DBF_HEX3(0, trace, &event, sizeof (unsigned long));
-	QETH_DBF_HEX3(0, trace, &dev, sizeof (void *));
-	sprintf(dbf_text, "%08x", ifa->ifa_address);
-	QETH_DBF_TEXT3(0, trace, dbf_text);
-	sprintf(dbf_text, "%08x", ifa->ifa_mask);
-	QETH_DBF_TEXT3(0, trace, dbf_text);
-
-	card = __qeth_get_card_from_dev(dev);
-	if (qeth_does_card_exist(card)) {
-		QETH_DBF_HEX3(0, trace, &card, sizeof (void *));
-		qeth_save_dev_flag_state(card);
-		qeth_start_softsetup_thread(card);
-	}
-
-	return NOTIFY_DONE;
-}
-
-#ifdef QETH_IPV6
-static int
-qeth_ip6_event(struct notifier_block *this, unsigned long event, void *ptr)
-{
-	struct qeth_card *card;
-	struct inet6_ifaddr *ifa = (struct inet6_ifaddr *) ptr;
-	struct net_device *dev = ifa->idev->dev;
-
-	QETH_DBF_TEXT3(0, trace, "ip6event");
-	QETH_DBF_HEX3(0, trace, &event, sizeof (unsigned long));
-	QETH_DBF_HEX3(0, trace, &dev, sizeof (void *));
-	QETH_DBF_HEX3(0, trace, ifa->addr.s6_addr, QETH_DBF_TRACE_LEN);
-	QETH_DBF_HEX3(0, trace, ifa->addr.s6_addr + QETH_DBF_TRACE_LEN,
-		      QETH_DBF_TRACE_LEN);
-
-	card = __qeth_get_card_from_dev(dev);
-	if (qeth_does_card_exist(card)) {
-		QETH_DBF_HEX3(0, trace, &card, sizeof (void *));
-		qeth_save_dev_flag_state(card);
-		qeth_start_softsetup_thread(card);
-	}
-
-	return NOTIFY_DONE;
-}
-#endif /* QETH_IPV6 */
-
-static int
-qeth_reboot_event(struct notifier_block *this, unsigned long event, void *ptr)
-{
-	struct qeth_card *card;
-
-	read_lock(&list_lock);
-	if (firstcard) {
-		card = firstcard;
-	clear_another_one:
-		if (card->type == QETH_CARD_TYPE_IQD) {
-			ccw_device_halt(CARD_DDEV(card), 0);
-			ccw_device_clear(CARD_RDEV(card), 0);
-			ccw_device_clear(CARD_WDEV(card), 0);
-			ccw_device_clear(CARD_DDEV(card), 0);
-		} else {
-			ccw_device_clear(CARD_DDEV(card), 0);
-			ccw_device_clear(CARD_RDEV(card), 0);
-			ccw_device_clear(CARD_WDEV(card), 0);
-		}
-		if (card->next) {
-			card = card->next;
-			goto clear_another_one;
-		}
-	}
-	read_unlock(&list_lock);
-
-	return 0;
-}
-
-static struct notifier_block qeth_dev_notifier = {
-	qeth_dev_event,
-	0
-};
-
-static struct notifier_block qeth_ip_notifier = {
-	qeth_ip_event,
-	0
-};
-
-#ifdef QETH_IPV6
-static struct notifier_block qeth_ip6_notifier = {
-	qeth_ip6_event,
-	0
-};
-#endif /* QETH_IPV6 */
-
-static struct notifier_block qeth_reboot_notifier = {
-	qeth_reboot_event,
-	0
-};
-
-static void
-qeth_register_notifiers(void)
-{
-	int r;
-
-	QETH_DBF_TEXT5(0, trace, "regnotif");
-	/* register to be notified on events */
-	r = register_netdevice_notifier(&qeth_dev_notifier);
-
-	r = register_inetaddr_notifier(&qeth_ip_notifier);
-#ifdef QETH_IPV6
-	r = register_inet6addr_notifier(&qeth_ip6_notifier);
-#endif /* QETH_IPV6 */
-	r = register_reboot_notifier(&qeth_reboot_notifier);
-}
-
-static void __exit
-qeth_unregister_notifiers(void)
-{
-	int r;
-
-	QETH_DBF_TEXT5(0, trace, "unregnot");
-	r = unregister_netdevice_notifier(&qeth_dev_notifier);
-	r = unregister_inetaddr_notifier(&qeth_ip_notifier);
-#ifdef QETH_IPV6
-	r = unregister_inet6addr_notifier(&qeth_ip6_notifier);
-#endif /* QETH_IPV6 */
-	r = unregister_reboot_notifier(&qeth_reboot_notifier);
-
-}
-
-static int
-qeth_procfile_open(struct inode *inode, struct file *file)
-{
-	int length = 0;
-	struct qeth_card *card;
-	char checksum_str[5], queueing_str[14], router_str[8], bufsize_str[4];
-	char *buffer;
-	int rc = 0;
-	int size;
-	struct tempinfo *info;
-
-	info = (struct tempinfo *) vmalloc(sizeof (struct tempinfo));
-	if (info == NULL) {
-		PRINT_WARN("No memory available for data\n");
-		return -ENOMEM;
-	} else {
-		file->private_data = (void *) info;
-	}
-
-	/* lock all the stuff */
-	read_lock(&list_lock);
-	card = firstcard;
-	size = 200;		/* 2 lines plus some sanity space */
-	while (card) {
-		size += 90;	/* if device name is > 10 chars, (should never
-				   happen...), we'll need that */
-		card = card->next;
-	}
-
-	buffer = info->data = (char *) vmalloc(size);
-	if (info->data == NULL) {
-		PRINT_WARN("No memory available for data\n");
-		vfree(info);
-		rc = -ENOMEM;
-		goto out;
-	}
-
-	QETH_DBF_TEXT2(0, trace, "procread");
-	length += sprintf(buffer + length,
-			  "devices                  CHPID     "
-			  "device     cardtype port chksum prio-q'ing "
-			  "rtr fsz cnt\n");
-	length += sprintf(buffer + length,
-			  "-------------------------- --- ----"
-			  "------ -------------- --     -- ---------- "
-			  "--- --- ---\n");
-	card = firstcard;
-	while (card) {
-		strcpy(checksum_str,
-		       (card->options.checksum_type == SW_CHECKSUMMING) ? "SW" :
-		       (card->options.checksum_type == HW_CHECKSUMMING) ? "HW" :
-		       "no");
-		if (card->options.do_prio_queueing == NO_PRIO_QUEUEING) {
-			sprintf(queueing_str, "always_q_%i",
-				card->options.default_queue);
-		} else {
-			strcpy(queueing_str, (card->options.do_prio_queueing
-					      ==
-					      PRIO_QUEUEING_PREC) ? "by_prec." :
-			       "by_ToS");
-		}
-
-		/* FIXME: this is really a mess... */
-
-#ifdef QETH_IPV6
-		if (atomic_read(&card->rt4fld) || atomic_read(&card->rt6fld))
-			strcpy(router_str, "FLD");
-#else/* QETH_IPV6 */
-		if (atomic_read(&card->rt4fld))
-			strcpy(router_str, "FLD");
-#endif /* QETH_IPV6 */
-		else if (((card->options.routing_type4 & ROUTER_MASK) ==
-			  PRIMARY_ROUTER)
-#ifdef QETH_IPV6
-			 &&
-			 (((card->options.routing_type6 & ROUTER_MASK) ==
-			  PRIMARY_ROUTER) ||
-			  (!qeth_is_supported(IPA_IPv6)))
-#endif /* QETH_IPV6 */
-		    ) {
-			strcpy(router_str, "pri");
-		} else
-		    if (((card->options.routing_type4 & ROUTER_MASK) ==
-			 SECONDARY_ROUTER)
-#ifdef QETH_IPV6
-			&&
-			(((card->options.routing_type6 & ROUTER_MASK) ==
-			 SECONDARY_ROUTER) ||
-			 (!qeth_is_supported(IPA_IPv6)))
-#endif /* QETH_IPV6 */
-		    ) {
-			strcpy(router_str, "sec");
-		} else
-		    if (((card->options.routing_type4 & ROUTER_MASK) ==
-			 MULTICAST_ROUTER)
-#ifdef QETH_IPV6
-			&&
-			(((card->options.routing_type6 & ROUTER_MASK) ==
-			 MULTICAST_ROUTER) ||
-			 (!qeth_is_supported(IPA_IPv6)))
-#endif /* QETH_IPV6 */
-		    ) {
-			strcpy(router_str, "mc");
-		} else
-		    if (((card->options.routing_type4 & ROUTER_MASK) ==
-			 PRIMARY_CONNECTOR)
-#ifdef QETH_IPV6
-			&&
-			(((card->options.routing_type6 & ROUTER_MASK) ==
-			 PRIMARY_CONNECTOR) ||
-			 (!qeth_is_supported(IPA_IPv6)))
-#endif /* QETH_IPV6 */
-		    ) {
-			strcpy(router_str, "p.c");
-		} else
-		    if (((card->options.routing_type4 & ROUTER_MASK) ==
-			 SECONDARY_CONNECTOR)
-#ifdef QETH_IPV6
-			&&
-			(((card->options.routing_type6 & ROUTER_MASK) ==
-			 SECONDARY_CONNECTOR) ||
-			 (!qeth_is_supported(IPA_IPv6)))
-#endif /* QETH_IPV6 */
-		    ) {
-			strcpy(router_str, "s.c");
-		} else
-		    if (((card->options.routing_type4 & ROUTER_MASK) ==
-			 NO_ROUTER)
-#ifdef QETH_IPV6
-			&&
-			(((card->options.routing_type6 & ROUTER_MASK) ==
-			 NO_ROUTER) ||
-			 (!qeth_is_supported(IPA_IPv6)))
-#endif /* QETH_IPV6 */
-		    ) {
-			strcpy(router_str, "no");
-		} else {
-			strcpy(router_str, "mix");
-		}
-		strcpy(bufsize_str,
-		       (BUFFER_SIZE == 16384) ? "16k" :
-		       (BUFFER_SIZE == 24576) ? "24k" :
-		       (BUFFER_SIZE == 32768) ? "32k" :
-		       (BUFFER_SIZE == 40960) ? "40k" : "64k");
-
-		if (!atomic_read(&card->is_startlaned)) {
-			length += sprintf(buffer + length,
-					  "%s/%s/%s x%02X %10s %14s %2i"
-					  "  +++ CABLE PULLED +++\n",
-					  CARD_RDEV_ID(card),
-					  CARD_WDEV_ID(card),
-					  CARD_DDEV_ID(card),
-					  card->chpid,
-					  card->dev_name,
-					  qeth_get_cardname_short
-					  (card->type, card->link_type,
-					   card->is_guest_lan),
-					  card->options.portno);
-		} else {
-			length += sprintf(buffer + length,
-					  "%s/%s/%s x%02X %10s %14s %2i"
-					  "     %2s %10s %3s %3s %3i\n",
-					  CARD_RDEV_ID(card),
-					  CARD_WDEV_ID(card),
-					  CARD_DDEV_ID(card),
-					  card->chpid, card->dev_name,
-					  qeth_get_cardname_short
-					  (card->type, card->link_type,
-					   card->is_guest_lan),
-					  card->options.portno, checksum_str,
-					  queueing_str, router_str, bufsize_str,
-					  card->options.inbound_buffer_count);
-		}
-		card = card->next;
-	}
-
-out:
-	info->len = length;
-	/* unlock all the stuff */
-	read_unlock(&list_lock);
-	return rc;
-}
-
-#define _OUTP_IT(x...) c+=sprintf(buffer+c,x)
-
-#ifdef QETH_PERFORMANCE_STATS
-static int
-qeth_perf_procfile_read(char *buffer, char **buffer_location,
-			off_t offset, int buffer_length, int *eof, void *data)
-{
-	int c = 0;
-	struct qeth_card *card;
-	/* we are always called with buffer_length=4k, so we all
-	   deliver on the first read */
-	if (offset > 0)
-		return 0;
-
-	QETH_DBF_TEXT2(0, trace, "perfpfrd");
-
-	card = firstcard;
-
-	while (card) {
-		_OUTP_IT("For card with devnos %s/%s/%s (%s):\n",
-			 CARD_RDEV_ID(card),
-			 CARD_WDEV_ID(card),
-			 CARD_DDEV_ID(card), card->dev_name);
-		_OUTP_IT("  Skb's/buffers received                 : %i/%i\n",
-			 card->perf_stats.skbs_rec, card->perf_stats.bufs_rec);
-		_OUTP_IT("  Skb's/buffers sent                     : %i/%i\n",
-			 card->perf_stats.skbs_sent,
-			 card->perf_stats.bufs_sent);
-		_OUTP_IT("\n");
-		_OUTP_IT("  Skb's/buffers sent without packing     : %i/%i\n",
-			 card->perf_stats.skbs_sent_dont_pack,
-			 card->perf_stats.bufs_sent_dont_pack);
-		_OUTP_IT("  Skb's/buffers sent with packing        : %i/%i\n",
-			 card->perf_stats.skbs_sent_pack,
-			 card->perf_stats.bufs_sent_pack);
-		_OUTP_IT("\n");
-		_OUTP_IT("  Packing state changes no pkg.->packing : %i/%i\n",
-			 card->perf_stats.sc_dp_p, card->perf_stats.sc_p_dp);
-		_OUTP_IT("  Current buffer usage (outbound q's)    : "
-			 "%i/%i/%i/%i\n",
-			 atomic_read(&card->outbound_used_buffers[0]),
-			 atomic_read(&card->outbound_used_buffers[1]),
-			 atomic_read(&card->outbound_used_buffers[2]),
-			 atomic_read(&card->outbound_used_buffers[3]));
-		_OUTP_IT("\n");
-		_OUTP_IT("  Inbound time (in us)                   : %i\n",
-			 card->perf_stats.inbound_time);
-		_OUTP_IT("  Inbound cnt                            : %i\n",
-			 card->perf_stats.inbound_cnt);
-		_OUTP_IT("  Outbound time (in us, incl QDIO)       : %i\n",
-			 card->perf_stats.outbound_time);
-		_OUTP_IT("  Outbound cnt                           : %i\n",
-			 card->perf_stats.outbound_cnt);
-		_OUTP_IT("  Watermarks: L/H=%i/%i\n",
-			 LOW_WATERMARK_PACK, HIGH_WATERMARK_PACK);
-		_OUTP_IT("\n");
-
-		card = card->next;
-	}
-
-	return c;
-}
-
-static struct proc_dir_entry *qeth_perf_proc_file;
-
-#endif /* QETH_PERFORMANCE_STATS */
-
-static int
-qeth_ipato_procfile_open(struct inode *inode, struct file *file)
-{
-	char text[33];
-	struct ipato_entry *ipato_entry;
-	struct qeth_card *card;
-	struct qeth_vipa_entry *vipa_entry;
-	int rc = 0;
-	struct tempinfo *info;
-	int size;
-	char entry_type[5];
-
-	info = (struct tempinfo *) vmalloc(sizeof (struct tempinfo));
-	if (info == NULL) {
-		PRINT_WARN("No memory available for data\n");
-		return -ENOMEM;
-	} else {
-		file->private_data = (void *) info;
-	}
-	info->len = 0;
-
-	QETH_DBF_TEXT2(0, trace, "ipatorea");
-	/* lock all the stuff */
-	spin_lock(&ipato_list_lock);
-	read_lock(&list_lock);
-
-	size = 64;		/* for inv4/6 etc. */
-
-	ipato_entry = ipato_entries;
-	while (ipato_entry) {
-		ipato_entry = ipato_entry->next;
-		size += 64;
-	}
-	card = firstcard;
-	while (card) {
-		read_lock(&card->vipa_list_lock);
-		vipa_entry = card->vipa_list;
-		while (vipa_entry) {
-			vipa_entry = vipa_entry->next;
-			size += 64;
-		}
-		/*read_unlock(&card->vipa_list_lock); don't unlock it here */
-		card = card->next;
-	}
-	info->data = (char *) vmalloc(size);
-	if (info->data == NULL) {
-		PRINT_WARN("No memory available for data\n");
-		vfree(info);
-		rc = -ENOMEM;
-		goto out;
-	}
-#define _IOUTP_IT(x...) info->len+=sprintf(info->data+info->len,x)
-	if (ipato_inv4)
-		_IOUTP_IT("inv4\n");
-	ipato_entry = ipato_entries;
-	text[8] = 0;
-	while (ipato_entry) {
-		if (ipato_entry->version == 4) {
-			qeth_convert_addr_to_text(4, ipato_entry->addr, text);
-			_IOUTP_IT("add4 %s/%i%s%s\n", text,
-				  ipato_entry->mask_bits,
-				  ipato_entry->dev_name[0] ? ":" : "",
-				  ipato_entry->dev_name[0] ?
-				  ipato_entry->dev_name : "");
-		}
-		ipato_entry = ipato_entry->next;
-	}
-
-	if (ipato_inv6)
-		_IOUTP_IT("inv6\n");
-	ipato_entry = ipato_entries;
-	text[32] = 0;
-	while (ipato_entry) {
-		if (ipato_entry->version == 6) {
-			qeth_convert_addr_to_text(6, ipato_entry->addr, text);
-			_IOUTP_IT("add6 %s/%i%s%s\n", text,
-				  ipato_entry->mask_bits,
-				  ipato_entry->dev_name[0] ? ":" : "",
-				  ipato_entry->dev_name[0] ?
-				  ipato_entry->dev_name : "");
-		}
-		ipato_entry = ipato_entry->next;
-	}
-	card = firstcard;
-	while (card) {
-		vipa_entry = card->vipa_list;
-		while (vipa_entry) {
-			strcpy(entry_type, (vipa_entry->flag ==
-					    IPA_SETIP_VIPA_FLAGS) ?
-			       "vipa" : "rxip");
-			if (vipa_entry->version == 4) {
-				_IOUTP_IT("add_%s4 %02x%02x%02x%02x:%s\n",
-					  entry_type,
-					  vipa_entry->ip[0],
-					  vipa_entry->ip[1],
-					  vipa_entry->ip[2],
-					  vipa_entry->ip[3], card->dev_name);
-			} else {
-				_IOUTP_IT("add_%s6 %02x%02x%02x%02x"
-					  "%02x%02x%02x%02x"
-					  "%02x%02x%02x%02x"
-					  "%02x%02x%02x%02x:%s\n",
-					  entry_type,
-					  vipa_entry->ip[0],
-					  vipa_entry->ip[1],
-					  vipa_entry->ip[2],
-					  vipa_entry->ip[3],
-					  vipa_entry->ip[4],
-					  vipa_entry->ip[5],
-					  vipa_entry->ip[6],
-					  vipa_entry->ip[7],
-					  vipa_entry->ip[8],
-					  vipa_entry->ip[9],
-					  vipa_entry->ip[10],
-					  vipa_entry->ip[11],
-					  vipa_entry->ip[12],
-					  vipa_entry->ip[13],
-					  vipa_entry->ip[14],
-					  vipa_entry->ip[15], card->dev_name);
-			}
-			vipa_entry = vipa_entry->next;
-		}
-		card = card->next;
-	}
-out:
-	/* unlock all the stuff */
-	card = firstcard;
-	while (card) {
-		/*read_lock(&card->vipa_list_lock); don't lock it here */
-		read_unlock(&card->vipa_list_lock);
-		card = card->next;
-	}
-	read_unlock(&list_lock);
-	spin_unlock(&ipato_list_lock);
-
-	return rc;
-}
-
-static ssize_t
-qeth_procfile_read(struct file *file, char *user_buf,
-		   size_t user_len, loff_t * offset)
-{
-	loff_t len;
-	struct tempinfo *p_info = (struct tempinfo *) file->private_data;
-
-	if (*offset >= p_info->len) {
-		return 0;
-	} else {
-		len = __min(user_len, (p_info->len - *offset));
-		if (copy_to_user(user_buf, &(p_info->data[*offset]), len))
-			return -EFAULT;
-		(*offset) += len;
-		return len;
-	}
-}
-
-/* ATT: this is also the procfile release function for the ipato
- * procfs entry */
-static int
-qeth_procfile_release(struct inode *inode, struct file *file)
-{
-	struct tempinfo *p_info = (struct tempinfo *) file->private_data;
-
-	if (p_info) {
-		if (p_info->data)
-			vfree(p_info->data);
-		vfree(p_info);
-	}
-
-	return 0;
-}
-
-static ssize_t
-qeth_ipato_procfile_write(struct file *file,
-			  const char *user_buffer,
-			  size_t user_len, loff_t * offset)
-{
-	int add, version;
-	char text[33];
-	__u8 addr[16];
-	int len, i, flag;
-	int mask_bits;
-	char *buffer;
-	int dev_name_there;
-	char *dev_name_ptr;
-	struct qeth_card *card;
-#define BUFFER_LEN (10+32+1+5+1+DEV_NAME_LEN+1)
-
-	if (*offset > 0)
-		return user_len;
-	buffer =
-	    vmalloc(__max(__max(user_len + 1, BUFFER_LEN), QETH_DBF_MISC_LEN));
-
-	if (buffer == NULL)
-		return -ENOMEM;
-	/* BUFFER_LEN=command incl. blank+addr+slash+mask_bits+
-	 * colon+DEV_NAME_LEN+zero */
-	memset(buffer, 0, BUFFER_LEN);
-
-	if (copy_from_user(buffer, user_buffer, user_len)) {
-		vfree(buffer);
-		return -EFAULT;
-	}
-
-	QETH_DBF_TEXT2(0, trace, "ipatowri");
-	QETH_DBF_TEXT2(0, misc, buffer);
-	if (!strncmp(buffer, "inv4", 4)) {
-		ipato_inv4 = 1 - ipato_inv4;
-		goto out;
-	}
-	if (!strncmp(buffer, "inv6", 4)) {
-		ipato_inv6 = 1 - ipato_inv6;
-		goto out;
-	}
-	if ((!strncmp(buffer, "add4 ", 5)) ||
-	    (!strncmp(buffer, "add6 ", 5)) ||
-	    (!strncmp(buffer, "del4 ", 5)) || (!strncmp(buffer, "del6 ", 5))) {
-		text[8] = 0;
-		text[32] = 0;
-		add = !strncmp(buffer, "add", 3);
-		version = (buffer[3] == '4') ? 4 : 6;
-		len = (version == 4) ? 8 : 32;
-		strncpy(text, buffer + 5, len);
-		if (qeth_convert_text_to_addr(version, text, addr)) {
-			PRINT_ERR("error in parsing ipato information "
-				  "(addr)\n");
-			goto out;
-		}
-		strncpy(text, buffer + 5 + len + 1, 10);
-		/* we prepare mask_bits for qeth_getints */
-		dev_name_there = 0;
-		for (i = 5 + len + 1; i < BUFFER_LEN; i++) {
-			if (*(buffer + i) == '\n') {
-				*(buffer + i) = 0;
-				break;
-			}
-			if (*(buffer + i) == ':') {
-				*(buffer + i) = 0;	/* so that qeth_getint works */
-				dev_name_there = i;
-				break;
-			}
-			if (*(buffer + i) == 0)
-				break;
-		}
-		mask_bits = qeth_getint(buffer + 5 + len + 1, 0);
-		if ((mask_bits < 0)
-		    || (mask_bits > ((version == 4) ? 32 : 128))) {
-			PRINT_ERR("error in parsing ipato information "
-				  "(mask bits)\n");
-			goto out;
-		}
-		if (dev_name_there) {
-			dev_name_ptr = buffer + dev_name_there + 1;
-			/* wipe out the linefeed */
-			for (i = dev_name_there + 1;
-			     i < dev_name_there + 1 + DEV_NAME_LEN + 1; i++)
-				if (*(buffer + i) == '\n')
-					*(buffer + i) = 0;
-		} else
-			dev_name_ptr = NULL;
-
-		if (add)
-			qeth_add_ipato_entry(version, addr, mask_bits,
-					     dev_name_ptr);
-		else
-			qeth_del_ipato_entry(version, addr, mask_bits,
-					     dev_name_ptr);
-		goto out;
-	}
-	if ((!strncmp(buffer, "add_vipa4 ", 10)) ||
-	    (!strncmp(buffer, "add_rxip4 ", 10)) ||
-	    (!strncmp(buffer, "add_vipa6 ", 10)) ||
-	    (!strncmp(buffer, "add_rxip6 ", 10)) ||
-	    (!strncmp(buffer, "del_vipa4 ", 10)) ||
-	    (!strncmp(buffer, "del_rxip4 ", 10)) ||
-	    (!strncmp(buffer, "del_vipa6 ", 10)) ||
-	    (!strncmp(buffer, "del_rxip6 ", 10))) {
-		text[8] = 0;
-		text[32] = 0;
-		add = !strncmp(buffer, "add", 3);
-		flag =
-		    (!strncmp(buffer + 4, "vipa", 4)) ? IPA_SETIP_VIPA_FLAGS :
-		    IPA_SETIP_TAKEOVER_FLAGS;
-		version = (buffer[8] == '4') ? 4 : 6;
-		len = (version == 4) ? 8 : 32;
-		strncpy(text, buffer + 10, len);
-		if (qeth_convert_text_to_addr(version, text, addr)) {
-			PRINT_ERR("error in parsing vipa/rxip information "
-				  "(addr)\n");
-			goto out;
-		}
-		if (*(buffer + 10 + len) != ':') {
-			PRINT_ERR("error in parsing vipa/rxip information "
-				  "(no interface)\n");
-			goto out;
-		}
-		/* interface name is at buffer+10+len+1 */
-		/* wipe out the \n */
-		for (i = 10 + len + 1; i < 10 + len + 1 + DEV_NAME_LEN + 1; i++)
-			if (*(buffer + i) == '\n')
-				*(buffer + i) = 0;
-		card = qeth_get_card_by_name(buffer + 10 + len + 1);
-		if (!card) {
-			PRINT_ERR("error in parsing vipa/rxip information "
-				  "(unknown interface)\n");
-			goto out;
-		}
-		if (add)
-			i = qeth_add_vipa_entry(card, version, addr, flag);
-		else
-			i = qeth_del_vipa_entry(card, version, addr, flag);
-		if (!i)
-			qeth_start_softsetup_thread(card);
-		goto out;
-	}
-	PRINT_ERR("unknown ipato information command\n");
-out:
-	vfree(buffer);
-	*offset = *offset + user_len;
-#undef BUFFER_LEN
-	return user_len;
-}
-
-static int
-qeth_procfile_getinterfaces(unsigned long arg)
-{
-	struct qeth_card *card;
-
-	char parms[16];
-	char *buffer;
-	char *buffer_pointer;
-	__u32 version, valid_fields, qeth_version, number_of_devices, if_index;
-	__u32 data_size, data_len;
-	unsigned long ioctl_flags;
-	int result = 0;
-
-	/* the struct of version 0 is:
-	   typedef struct dev_list
-	   {
-	   char device_name[IFNAME_MAXLEN]; // OSA-Exp device name (e.g. eth0)
-	   __u32 if_index;                  // interface index from kernel
-	   __u32 flags;                    // device charateristics
-	   } __attribute__((packed)) DEV_LIST;
-
-	   typedef struct osaexp_dev_ver0
-	   {
-	   __u32 version;                // structure version
-	   __u32 valid_fields;           // bitmask of fields that are really filled
-	   __u32 qeth_version;           // qeth driver version
-	   __u32 number_of_devices;      // number of OSA Express devices
-	   struct dev_list devices[0]; // list of OSA Express devices
-	   } __attribute__((packed)) OSAEXP_DEV_VER0;
-	 */
-
-	version = 0;
-	valid_fields = 0;
-	qeth_version = 0;
-	number_of_devices = 0;
-
-	if (copy_from_user((void *) parms, (void *) arg, sizeof (parms)))
-		return -EFAULT;
-	memcpy(&data_size, parms, sizeof (__u32));
-
-	if (!(data_size > 0))
-		return -EFAULT;
-	if (data_size > IOCTL_MAX_TRANSFER_SIZE)
-		return -EFAULT;
-	if (!access_ok(VERIFY_WRITE, (void *) arg, data_size))
-		return -EFAULT;
-
-	read_lock(&list_lock);
-	card = firstcard;
-#define IOCTL_USER_STRUCT_SIZE (DEV_NAME_LEN*sizeof(char)) + \
-	sizeof(__u32) + sizeof(__u32)
-	while (card) {
-		if (card->type == QETH_CARD_TYPE_OSAE)
-			number_of_devices =
-			    number_of_devices + IOCTL_USER_STRUCT_SIZE;
-		card = card->next;
-	}
-#undef IOCTL_USER_STRUCT_SIZE
-	if ((number_of_devices + 4 * sizeof (__u32)) >= data_size) {
-		result = -ENOMEM;
-		goto out;
-	}
-
-	number_of_devices = 0;
-	card = firstcard;
-	buffer = (char *) vmalloc(data_size);
-	if (!buffer) {
-		result = -EFAULT;
-		goto out;
-	}
-	buffer_pointer = ((char *) (buffer)) + (4 * sizeof (__u32));
-	while (card) {
-		if ((card->type == QETH_CARD_TYPE_OSAE) &&
-		    (atomic_read(&card->is_hardsetup)) &&
-		    (atomic_read(&card->is_registered))) {
-
-			memcpy(buffer_pointer, card->dev_name, DEV_NAME_LEN);
-			buffer_pointer = buffer_pointer + DEV_NAME_LEN;
-			if_index = card->dev->ifindex;
-			memcpy(buffer_pointer, &if_index, sizeof (__u32));
-			buffer_pointer = buffer_pointer + sizeof (__u32);
-			memcpy(buffer_pointer, &ioctl_flags, sizeof (__u32));
-			buffer_pointer = buffer_pointer + sizeof (__u32);
-			number_of_devices = number_of_devices + 1;
-		}
-		card = card->next;
-	}
-
-	/* we copy the real size */
-	data_len = buffer_pointer - buffer;
-
-	buffer_pointer = buffer; 
-	/* copy the header information at the beginning of the buffer */
-	memcpy(buffer_pointer, &version, sizeof (__u32));
-	memcpy(((char *) buffer_pointer) + sizeof (__u32), &valid_fields,
-	       sizeof (__u32));
-	memcpy(((char *) buffer_pointer) + (2 * sizeof (__u32)), &qeth_version,
-	       sizeof (__u32));
-	memcpy(((char *) buffer_pointer) + (3 * sizeof (__u32)),
-	       &number_of_devices, sizeof (__u32));
-	if (copy_to_user((char *) arg, buffer, data_len))
-		result = -EFAULT;
-	vfree(buffer);
-out:
-	read_unlock(&list_lock);
-	return result;
-
-#undef PARMS_BUFFERLENGTH
-
-};
-
-static int
-qeth_procfile_interfacechanges(unsigned long arg)
-{
-	return qeth_sleepon_procfile();
-
-}
-
-static int
-qeth_procfile_ioctl(struct inode *inode, struct file *file,
-		    unsigned int cmd, unsigned long arg)
-{
-
-	int result;
-	if (!down_interruptible(&qeth_procfile_ioctl_lock)) {
-		switch (cmd) {
-			case QETH_IOCPROC_OSAEINTERFACES:
-				result = qeth_procfile_getinterfaces(arg);
-				break;
-			case QETH_IOCPROC_INTERFACECHANGES:
-				result = qeth_procfile_interfacechanges(arg);
-				break;
-			default:
-				result = -EOPNOTSUPP;
-		}
-		up(&qeth_procfile_ioctl_lock);
-	} else
-		result = -ERESTARTSYS;
-	return result;
-};
-
-static struct file_operations qeth_procfile_fops = {
-	.owner = THIS_MODULE,
-	.ioctl = qeth_procfile_ioctl,
-	.read = qeth_procfile_read,
-	.open = qeth_procfile_open,
-	.release = qeth_procfile_release,
-};
-
-static struct proc_dir_entry *qeth_proc_file;
-
-static struct file_operations qeth_ipato_procfile_fops = {
-	.owner = THIS_MODULE,
-	.read = qeth_procfile_read,	/* same as above! */
-	.write = qeth_ipato_procfile_write,
-	.open = qeth_ipato_procfile_open,
-	.release = qeth_procfile_release	/* same as above! */
-};
-
-static struct proc_dir_entry *qeth_ipato_proc_file;
-
-static inline void
-__qeth_add_procfs_perf(void)
-{
-#ifdef QETH_PERFORMANCE_STATS
-	proc_perf_file_registration = 0;
-	qeth_perf_proc_file = create_proc_entry(QETH_PERF_PROCFILE_NAME,
-						S_IFREG | 0444, &proc_root);
-	if (qeth_perf_proc_file) {
-		qeth_perf_proc_file->read_proc = &qeth_perf_procfile_read;
-	} else
-		proc_perf_file_registration = -1;
-
-	if (proc_perf_file_registration)
-		PRINT_WARN("was not able to register perf. proc-file (%i).\n",
-			   proc_perf_file_registration);
-#endif /* QETH_PERFORMANCE_STATS */
-}
-
-static void
-qeth_add_procfs_entries(void)
-{
-	proc_file_registration = 0;
-	qeth_proc_file = create_proc_entry(QETH_PROCFILE_NAME,
-					   S_IFREG | 0444, &proc_root);
-	if (qeth_proc_file) {
-		qeth_proc_file->proc_fops = &qeth_procfile_fops;
-		sema_init(&qeth_procfile_ioctl_sem,
-			  PROCFILE_SLEEP_SEM_MAX_VALUE);
-		sema_init(&qeth_procfile_ioctl_lock,
-			  PROCFILE_IOCTL_SEM_MAX_VALUE);
-	} else
-		proc_file_registration = -1;
-
-	if (proc_file_registration)
-		PRINT_WARN("was not able to register proc-file (%i).\n",
-			   proc_file_registration);
-	proc_ipato_file_registration = 0;
-	qeth_ipato_proc_file = create_proc_entry(QETH_IPA_PROCFILE_NAME,
-						 S_IFREG | 0644, &proc_root);
-	if (qeth_ipato_proc_file) {
-		qeth_ipato_proc_file->proc_fops = &qeth_ipato_procfile_fops;
-	} else
-		proc_ipato_file_registration = -1;
-
-	if (proc_ipato_file_registration)
-		PRINT_WARN("was not able to register ipato-proc-file (%i).\n",
-			   proc_ipato_file_registration);
-	__qeth_add_procfs_perf();
-}
-
-static void __exit
-qeth_remove_procfs_entries(void)
-{
-	if (!proc_file_registration)	/* means if it went ok earlier */
-		remove_proc_entry(QETH_PROCFILE_NAME, &proc_root);
-
-	if (!proc_ipato_file_registration)	/* means if it went ok earlier */
-		remove_proc_entry(QETH_IPA_PROCFILE_NAME, &proc_root);
-
-#ifdef QETH_PERFORMANCE_STATS
-	if (!proc_perf_file_registration)	/* means if it went ok earlier */
-		remove_proc_entry(QETH_PERF_PROCFILE_NAME, &proc_root);
-#endif /* QETH_PERFORMANCE_STATS */
-}
-
-static int
-qeth_register_dbf_views(void)
-{
-	qeth_dbf_setup = debug_register(QETH_DBF_SETUP_NAME,
-					QETH_DBF_SETUP_INDEX,
-					QETH_DBF_SETUP_NR_AREAS,
-					QETH_DBF_SETUP_LEN);
-	if (!qeth_dbf_setup)
-		return -ENOMEM;
-
-	debug_register_view(qeth_dbf_setup, &debug_hex_ascii_view);
-	debug_set_level(qeth_dbf_setup, QETH_DBF_SETUP_LEVEL);
-
-	qeth_dbf_misc = debug_register(QETH_DBF_MISC_NAME,
-				       QETH_DBF_MISC_INDEX,
-				       QETH_DBF_MISC_NR_AREAS,
-				       QETH_DBF_MISC_LEN);
-	if (!qeth_dbf_misc)
-		return -ENOMEM;
-
-	debug_register_view(qeth_dbf_misc, &debug_hex_ascii_view);
-	debug_set_level(qeth_dbf_misc, QETH_DBF_MISC_LEVEL);
-
-	qeth_dbf_data = debug_register(QETH_DBF_DATA_NAME,
-				       QETH_DBF_DATA_INDEX,
-				       QETH_DBF_DATA_NR_AREAS,
-				       QETH_DBF_DATA_LEN);
-	if (!qeth_dbf_data)
-		return -ENOMEM;
-
-	debug_register_view(qeth_dbf_data, &debug_hex_ascii_view);
-	debug_set_level(qeth_dbf_data, QETH_DBF_DATA_LEVEL);
-
-	qeth_dbf_control = debug_register(QETH_DBF_CONTROL_NAME,
-					  QETH_DBF_CONTROL_INDEX,
-					  QETH_DBF_CONTROL_NR_AREAS,
-					  QETH_DBF_CONTROL_LEN);
-	if (!qeth_dbf_control)
-		return -ENOMEM;
-
-	debug_register_view(qeth_dbf_control, &debug_hex_ascii_view);
-	debug_set_level(qeth_dbf_control, QETH_DBF_CONTROL_LEVEL);
-
-	qeth_dbf_sense = debug_register(QETH_DBF_SENSE_NAME,
-					QETH_DBF_SENSE_INDEX,
-					QETH_DBF_SENSE_NR_AREAS,
-					QETH_DBF_SENSE_LEN);
-	if (!qeth_dbf_sense)
-		return -ENOMEM;
-
-	debug_register_view(qeth_dbf_sense, &debug_hex_ascii_view);
-	debug_set_level(qeth_dbf_sense, QETH_DBF_SENSE_LEVEL);
-
-	qeth_dbf_qerr = debug_register(QETH_DBF_QERR_NAME,
-				       QETH_DBF_QERR_INDEX,
-				       QETH_DBF_QERR_NR_AREAS,
-				       QETH_DBF_QERR_LEN);
-	if (!qeth_dbf_qerr)
-		return -ENOMEM;
-
-	debug_register_view(qeth_dbf_qerr, &debug_hex_ascii_view);
-	debug_set_level(qeth_dbf_qerr, QETH_DBF_QERR_LEVEL);
-
-	qeth_dbf_trace = debug_register(QETH_DBF_TRACE_NAME,
-					QETH_DBF_TRACE_INDEX,
-					QETH_DBF_TRACE_NR_AREAS,
-					QETH_DBF_TRACE_LEN);
-	if (!qeth_dbf_trace)
-		return -ENOMEM;
-
-	debug_register_view(qeth_dbf_trace, &debug_hex_ascii_view);
-	debug_set_level(qeth_dbf_trace, QETH_DBF_TRACE_LEVEL);
-
-	return 0;
-}
-
-static void
-qeth_unregister_dbf_views(void)
-{
-	if (qeth_dbf_setup)
-		debug_unregister(qeth_dbf_setup);
-	if (qeth_dbf_qerr)
-		debug_unregister(qeth_dbf_qerr);
-	if (qeth_dbf_sense)
-		debug_unregister(qeth_dbf_sense);
-	if (qeth_dbf_misc)
-		debug_unregister(qeth_dbf_misc);
-	if (qeth_dbf_data)
-		debug_unregister(qeth_dbf_data);
-	if (qeth_dbf_control)
-		debug_unregister(qeth_dbf_control);
-	if (qeth_dbf_trace)
-		debug_unregister(qeth_dbf_trace);
-}
-
-#ifdef QETH_IPV6
-static int
-qeth_ipv6_init(void)
-{
-	qeth_old_arp_constructor = arp_tbl.constructor;
-	write_lock(&arp_tbl.lock);
-	arp_tbl.constructor = qeth_arp_constructor;
-	write_unlock(&arp_tbl.lock);
-
- 	/* generate the memory leak here - FIXME*/
- 	arp_direct_ops = (struct neigh_ops*)
- 		kmalloc(sizeof(struct neigh_ops), GFP_KERNEL);
- 	if (!arp_direct_ops)
- 		return -ENOMEM;
-
- 	memcpy(arp_direct_ops, &arp_direct_ops_template,
- 	       sizeof(struct neigh_ops));
- 	return 0;
-
-}
-
-static void
-qeth_ipv6_uninit(void)
-{
-	write_lock(&arp_tbl.lock);
-	arp_tbl.constructor = qeth_old_arp_constructor;
-	write_unlock(&arp_tbl.lock);
-}
-#endif /* QETH_IPV6 */
-
-static int
-qeth_get_internal_functions(void)
-{
-	struct net_device *dev;
-#ifdef CONFIG_NET_ETHERNET
-	dev = alloc_etherdev(0);
-	if (!dev) {
-		PRINT_ERR("Not enough memory for internal functions.\n");
-		return -ENOMEM;
-	}
-	qeth_my_eth_header = dev->hard_header;
-	qeth_my_eth_rebuild_header = dev->rebuild_header;
-	qeth_my_eth_header_cache = dev->hard_header_cache;
-	qeth_my_eth_header_cache_update = dev->header_cache_update;
-	free_netdev(dev);
-#endif
-#ifdef CONFIG_TR
-	dev = alloc_trdev(0);
-	if (!dev) {
-		PRINT_ERR("Not enough memory for internal functions.\n");
-		return -ENOMEM;
-	}
-	qeth_my_tr_header = dev->hard_header;
-	qeth_my_tr_rebuild_header = dev->rebuild_header;
-	free_netdev(dev);
-#endif
-	return 0;
-}
-
-static struct ccw_device_id qeth_ids[] = {
-      {CCW_DEVICE(0x1731, 0x01), driver_info:QETH_CARD_TYPE_OSAE},
-      {CCW_DEVICE(0x1731, 0x05), driver_info:QETH_CARD_TYPE_IQD},
-	{},
-};
-
-MODULE_DEVICE_TABLE(ccw, qeth_ids);
-
-static struct ccw_driver qeth_ccw_driver = {
-	.name = "qeth",
-	.ids = qeth_ids,
-	.probe = ccwgroup_probe_ccwdev,
-	.remove = ccwgroup_remove_ccwdev,
-};
-
-static struct device *qeth_root_dev;
-
-static struct ccwgroup_driver qeth_ccwgroup_driver;
-static ssize_t
-qeth_group_store(struct device_driver *drv, const char *buf, size_t count)
-{
-	const char *start, *end;
-	char bus_ids[3][BUS_ID_SIZE], *argv[3];
-	int i;
-
-	pr_debug("group_store %s\n", buf);
-	start = buf;
-	for (i = 0; i < 3; i++) {
-		static const char delim[] = { ',', ',', '\n' };
-		int len;
-
-		if (!(end = strchr(start, delim[i])))
-			return count;
-		len = min_t(ptrdiff_t, BUS_ID_SIZE, end - start);
-		strncpy(bus_ids[i], start, len);
-		bus_ids[i][len] = '\0';
-		start = end + 1;
-		argv[i] = bus_ids[i];
-	}
-	pr_debug("creating qeth group device from '%s', '%s' and '%s'\n",
-		 bus_ids[0], bus_ids[1], bus_ids[2]);
-	ccwgroup_create(qeth_root_dev, qeth_ccwgroup_driver.driver_id,
-			&qeth_ccw_driver, 3, argv);
-	return count;
-}
-
-static DRIVER_ATTR(group, 0200, 0, qeth_group_store);
-
-static ssize_t
-qeth_bufcnt_show(struct device *dev, char *buf)
-{
-	struct qeth_card *card = dev->driver_data;
-
-	if (!card)
-		return -EINVAL;
-
-	return sprintf(buf, "%i\n", card->options.inbound_buffer_count);
-}
-
-static ssize_t
-qeth_bufcnt_store(struct device *dev, const char *buf, size_t count)
-{
-	struct qeth_card *card = dev->driver_data;
-	unsigned long cnt;
-	char *tmp;
-
-	if (!card)
-		return count;
-
-	if (atomic_read(&card->is_softsetup))
-		return -EPERM;
-
-	cnt = simple_strtoul(buf, &tmp, 16);
-	cnt = (cnt < BUFCNT_MIN) ? BUFCNT_MIN :
-		((cnt > BUFCNT_MAX) ? BUFCNT_MAX : cnt);
-	card->options.inbound_buffer_count = cnt;
-
-	return count;
-}
-
-static DEVICE_ATTR(bufcnt, 0644, qeth_bufcnt_show, qeth_bufcnt_store);
-
-static ssize_t
-qeth_portname_show(struct device *dev, char *buf)
-{
-	struct qeth_card *card = dev->driver_data;
-	char tmp[9];
-	int i;
-
-	if (!card)
-		return -EINVAL;
-
-	if (card->portname_required) {
-		sprintf(tmp, "%s", card->options.portname + 1);
-		for (i = 0; i < 8; i++)
-			tmp[i] = (char) _ebcasc[(__u8) tmp[i]];
-		tmp[8] = 0;
-		return sprintf(buf, "%s\n", tmp);
-	} else
-		return sprintf(buf, "%s\n", "no portname required");
-}
-
-static ssize_t
-qeth_portname_store(struct device *dev, const char *buf, size_t count)
-{
-	struct qeth_card *card = dev->driver_data;
-	char *tmp;
-	int i;
-
-	if (!card)
-		return count;
-
-	if (atomic_read(&card->is_hardsetup))
-		return -EPERM;
-
-	/* Remove trailing '\n'. */
-	tmp = strsep((char **) &buf, "\n");
-	if ((strlen(tmp) > 8) || (strlen(tmp) < 2))
-		return -EINVAL;
-
-	card->options.portname[0] = strlen(tmp);
-	/* for beauty reasons: */
-	for (i = 1; i < 9; i++)
-		card->options.portname[i] = ' ';
-	strcpy(card->options.portname + 1, tmp);
-	for (i = 1; i < 9; i++)
-		card->options.portname[i] =
-			_ascebc[(unsigned char)card->options.portname[i]];
-
-	return count;
-}
-
-static DEVICE_ATTR(portname, 0644, qeth_portname_show, qeth_portname_store);
-
-static ssize_t
-qeth_route4_show(struct device *dev, char *buf)
-{
-	struct qeth_card *card = dev->driver_data;
-
-	if (!card)
-		return -EINVAL;
-
-	if (atomic_read(&card->rt4fld))
-		return sprintf(buf, "%s\n", "FLD");
-
-	switch (card->options.routing_type4 & ROUTER_MASK) {
-	case PRIMARY_ROUTER:
-		return sprintf(buf, "%s\n", "primary router");
-	case SECONDARY_ROUTER:
-		return sprintf(buf, "%s\n", "secondary router");
-	case MULTICAST_ROUTER:
-		return sprintf(buf, "%s\n", "multicast router");
-	case PRIMARY_CONNECTOR:
-		return sprintf(buf, "%s\n", "primary connector");
-	case SECONDARY_CONNECTOR:
-		return sprintf(buf, "%s\n", "secondary connector");
-	default:
-		return sprintf(buf, "%s\n", "no");
-	}
-}
-
-static ssize_t
-qeth_route4_store(struct device *dev, const char *buf, size_t count)
-{
-	struct qeth_card *card = dev->driver_data;
-	int cnt;
-	char *tmp;
-
-	if (!card)
-		return count;
-
-	/* Remove trailing '\n'. */
-	tmp = strsep((char **) &buf, "\n");
-	cnt = strlen(tmp);
-	if (!strncmp(tmp, "primary_router", cnt)) {
-		QETH_DBF_CARD2(0, trace, "pri4", card);
-		card->options.routing_type4 =
-			PRIMARY_ROUTER | RESET_ROUTING_FLAG;
-	} else if (!strncmp(tmp, "secondary_router", cnt)) {
-		QETH_DBF_CARD2(0, trace, "sec4", card);
-		card->options.routing_type4 =
-			SECONDARY_ROUTER | RESET_ROUTING_FLAG;
-	}  else if (!strncmp(tmp, "multicast_router", cnt)) {
-		QETH_DBF_CARD2(0, trace, "mcr4", card);
-		card->options.routing_type4 =
-			MULTICAST_ROUTER | RESET_ROUTING_FLAG;
-	} else if (!strncmp(tmp, "primary_connector", cnt)) {
-		QETH_DBF_CARD2(0, trace, "prc4", card);
-		card->options.routing_type4 =
-			PRIMARY_CONNECTOR | RESET_ROUTING_FLAG;
-	} else if (!strncmp(tmp, "secondary_connector", cnt)) {
-		QETH_DBF_CARD2(0, trace, "scc4", card);
-		card->options.routing_type4 =
-			SECONDARY_CONNECTOR | RESET_ROUTING_FLAG;
-	} else if (!strncmp(tmp, "no_router", cnt)) {
-		QETH_DBF_CARD2(0, trace, "nor4", card);
-		card->options.routing_type4 = NO_ROUTER | RESET_ROUTING_FLAG;
-	} else {
-		PRINT_WARN("unknown command input in route4 attribute\n");
-		return -EINVAL;
-	}
-	__qeth_correct_routing_status_v4(card);
-	atomic_set(&card->enable_routing_attempts4, QETH_ROUTING_ATTEMPTS);
-	if (atomic_read(&card->is_softsetup))
-		qeth_start_softsetup_thread(card);
-	return count;
-}
-
-static DEVICE_ATTR(route4, 0644, qeth_route4_show, qeth_route4_store);
-
-static ssize_t
-qeth_route6_show(struct device *dev, char *buf)
-{
-#ifdef QETH_IPV6
-	struct qeth_card *card = dev->driver_data;
-
-	if (!card)
-		return -EINVAL;
-
-	if (atomic_read(&card->rt6fld))
-		return sprintf(buf, "%s\n", "FLD");
-
-	if (!qeth_is_supported(IPA_IPv6))
-		return sprintf(buf, "%s\n", "n/a");
-
-	switch (card->options.routing_type6 & ROUTER_MASK) {
-	case PRIMARY_ROUTER:
-		return sprintf(buf, "%s\n", "primary router");
-	case SECONDARY_ROUTER:
-		return sprintf(buf, "%s\n", "secondary router");
-	case MULTICAST_ROUTER:
-		return sprintf(buf, "%s\n", "multicast router");
-	case PRIMARY_CONNECTOR:
-		return sprintf(buf, "%s\n", "primary connector");
-	case SECONDARY_CONNECTOR:
-		return sprintf(buf, "%s\n", "secondary connector");
-	default:
-		return sprintf(buf, "%s\n", "no");
-	}
-#endif /* QETH_IPV6 */
-	return sprintf(buf, "%s\n", "n/a");
-}
-
-static ssize_t
-qeth_route6_store(struct device *dev, const char *buf, size_t count)
-{
-#ifdef QETH_IPV6
-	struct qeth_card *card = dev->driver_data;
-	int cnt;
-	char *tmp;
-
-	if (!card)
-		return count;
-
-	/* Remove trailing '\n'. */
-	tmp = strsep((char **) &buf, "\n");
-	cnt = strlen(tmp);
-	if (!strncmp(tmp, "primary_router", cnt)) {
-		QETH_DBF_CARD2(0, trace, "pri6", card);
-		card->options.routing_type6 =
-			PRIMARY_ROUTER | RESET_ROUTING_FLAG;
-	} else if (!strncmp(tmp, "secondary_router", cnt)) {
-				QETH_DBF_TEXT2(0, trace, "sec6");
-		QETH_DBF_CARD2(0, trace, "sec6", card);
-		card->options.routing_type6 =
-			SECONDARY_ROUTER | RESET_ROUTING_FLAG;
-	}  else if (!strncmp(tmp, "multicast_router", cnt)) {
-		QETH_DBF_CARD2(0, trace, "mcr6", card);
-		card->options.routing_type6 =
-			MULTICAST_ROUTER | RESET_ROUTING_FLAG;
-	} else if (!strncmp(tmp, "primary_connector", cnt)) {
-		QETH_DBF_CARD2(0, trace, "prc6", card);
-		card->options.routing_type6 =
-			PRIMARY_CONNECTOR | RESET_ROUTING_FLAG;
-	} else if (!strncmp(tmp, "secondary_connector", cnt)) {
-		QETH_DBF_CARD2(0, trace, "scc6", card);
-		card->options.routing_type6 =
-			SECONDARY_CONNECTOR | RESET_ROUTING_FLAG;
-	} else if (!strncmp(tmp, "no_router", cnt)) {
-		QETH_DBF_CARD2(0, trace, "nor6", card);
-		card->options.routing_type6 = NO_ROUTER | RESET_ROUTING_FLAG;
-	} else {
-		PRINT_WARN("unknown command input in route6 attribute\n");
-		return -EINVAL;
-	}
-	__qeth_correct_routing_status_v6(card);
-	atomic_set(&card->enable_routing_attempts6, QETH_ROUTING_ATTEMPTS);
-	if (atomic_read(&card->is_softsetup))
-		qeth_start_softsetup_thread(card);
-	return count;
-#endif /* QETH_IPV6 */
-	return -EINVAL;
-}
-
-static DEVICE_ATTR(route6, 0644, qeth_route6_show, qeth_route6_store);
-
-
-static ssize_t
-qeth_checksum_show(struct device *dev, char *buf)
-{
-	struct qeth_card *card = dev->driver_data;
-
-	if (!card)
-		return -EINVAL;
-
-	switch (card->options.checksum_type) {
-	case SW_CHECKSUMMING:
-		return sprintf(buf, "%s\n", "sw");
-	case HW_CHECKSUMMING:
-		return sprintf(buf, "%s\n", "hw");
-	default:
-		return sprintf(buf, "%s\n", "no");
-	}
-}
-
-static ssize_t
-qeth_checksum_store(struct device *dev, const char *buf, size_t count)
-{
-	struct qeth_card *card = dev->driver_data;
-	char *tmp;
-	int cnt;
-
-	if (!card)
-		return count;
-
-	if (atomic_read(&card->is_hardsetup))
-		return -EPERM;
-
-	/* Remove trailing '\n'. */
-	tmp = strsep((char **) &buf, "\n");
-	cnt = strlen(tmp);
-	if (!strncmp(tmp, "sw_checksumming", cnt))
-		card->options.checksum_type = SW_CHECKSUMMING;
-	else if (!strncmp(tmp, "hw_checksumming", cnt))
-		card->options.checksum_type = HW_CHECKSUMMING;
-	else if (!strncmp(tmp, "no_checksumming", cnt))
-		card->options.checksum_type = NO_CHECKSUMMING;
-	else
-		PRINT_WARN("unknown checksumming type '%s'\n", tmp);
-
-	return count;
-}
-
-static DEVICE_ATTR(checksumming, 0644, qeth_checksum_show, qeth_checksum_store);
-
-static ssize_t
-qeth_prioq_show(struct device *dev, char *buf)
-{
-	struct qeth_card *card = dev->driver_data;
-
-	if (!card)
-		return -EINVAL;
-
-	switch (card->options.do_prio_queueing) {
-	case PRIO_QUEUEING_PREC:
-		return sprintf(buf, "%s\n", "by precedence");
-	case PRIO_QUEUEING_TOS:
-		return sprintf(buf, "%s\n", "by type of service");
-	default:
-		return sprintf(buf, "always queue %i\n",
-			       card->options.default_queue);
-	}
-}
-
-static ssize_t
-qeth_prioq_store(struct device *dev, const char *buf, size_t count)
-{
-	struct qeth_card *card = dev->driver_data;
-	char *tmp;
-	int cnt;
-
-	if (!card)
-		return count;
-
-	if (atomic_read(&card->is_hardsetup))
-		return -EPERM;
-
-	/* Remove trailing '\n'. */
-	tmp = strsep((char **) &buf, "\n");
-	cnt = strlen(tmp);
-	if (!strncmp(tmp, "prio_queueing_prec", cnt))
-		card->options.do_prio_queueing = PRIO_QUEUEING_PREC;
-	else if (!strncmp(tmp, "prio_queueing_tos", cnt))
-		card->options.do_prio_queueing = PRIO_QUEUEING_TOS;
-	else if (!strncmp(tmp, "no_prio_queueing:0", cnt)) {
-		card->options.do_prio_queueing = NO_PRIO_QUEUEING;
-		card->options.default_queue = 0;
-	} else if (!strncmp(tmp, "no_prio_queueing:1", cnt)) {
-		card->options.do_prio_queueing = NO_PRIO_QUEUEING;
-		card->options.default_queue = 1;
-	} else if (!strncmp(tmp, "no_prio_queueing:2", cnt)) {
-		card->options.do_prio_queueing = NO_PRIO_QUEUEING;
-		card->options.default_queue = 2;
-	} else if (!strncmp(tmp, "no_prio_queueing:3", cnt)) {
-		card->options.do_prio_queueing = NO_PRIO_QUEUEING;
-		card->options.default_queue = 3;
-	} else if (!strncmp(tmp, "no_prio_queueing", cnt)) {
-		card->options.do_prio_queueing = NO_PRIO_QUEUEING;
-		card->options.default_queue = QETH_DEFAULT_QUEUE;
-	} else
-		PRINT_WARN("unknown queueing type '%s'\n", tmp);
-
-	return count;
-}
-
-static DEVICE_ATTR(priority_queueing, 0644, qeth_prioq_show, qeth_prioq_store);
-
-static ssize_t
-qeth_portno_show(struct device *dev, char *buf)
-{
-	struct qeth_card *card = dev->driver_data;
-
-	if (!card)
-		return -EINVAL;
-
-	return sprintf(buf, "%i\n", card->options.portno);
-}
-
-static ssize_t
-qeth_portno_store(struct device *dev, const char *buf, size_t count)
-{
-	struct qeth_card *card = dev->driver_data;
-	char *tmp;
-	int i;
-
-	if (!card)
-		return count;
-
-	if (atomic_read(&card->is_hardsetup))
-		return -EPERM;
-
-	i = simple_strtoul(buf, &tmp, 16);
-	if ((i < 0) || (i > MAX_PORTNO)) {
-		PRINT_ERR("portno %i out of range\n", i);
-		return -EINVAL;
-	}
-	card->options.portno = i;
-
-	return count;
-}
-
-static DEVICE_ATTR(portno, 0644, qeth_portno_show, qeth_portno_store);
-
-static ssize_t
-qeth_polltime_show(struct device *dev, char *buf)
-{
-	struct qeth_card *card = dev->driver_data;
-
-	if (!card)
-		return -EINVAL;
-
-	return sprintf(buf, "%i\n", card->options.polltime);
-}
-
-static ssize_t
-qeth_polltime_store(struct device *dev, const char *buf, size_t count)
-{
-	struct qeth_card *card = dev->driver_data;
-	char *tmp;
-	int i;
-
-	if (!card)
-		return count;
-
-	if (atomic_read(&card->is_hardsetup))
-		return -EPERM;
-
-	i = simple_strtoul(buf, &tmp, 16);
-	if (i < 0) {
-		PRINT_ERR("polltime %i invalid\n", i);
-		return -EINVAL;
-	}
-	card->options.polltime = i;
-
-	return count;
-}
-
-static DEVICE_ATTR(polltime, 0644, qeth_polltime_show, qeth_polltime_store);
-
-static ssize_t
-qeth_hhlen_show(struct device *dev, char *buf)
-{
-	struct qeth_card *card = dev->driver_data;
-
-	if (!card)
-		return -EINVAL;
-
-	return sprintf(buf, "%i\n", card->options.add_hhlen);
-}
-
-static ssize_t
-qeth_hhlen_store(struct device *dev, const char *buf, size_t count)
-{
-	struct qeth_card *card = dev->driver_data;
-	char *tmp;
-	int i;
-
-	if (!card)
-		return count;
-
-	if (atomic_read(&card->is_hardsetup))
-		return -EPERM;
-
-	i = simple_strtoul(buf, &tmp, 16);
-	if ((i < 0) || (i > MAX_ADD_HHLEN)) {
-		PRINT_ERR("add_hhlen out of range\n");
-		return -EINVAL;
-	}
-	card->options.add_hhlen = i;
-
-	return count;
-}
-
-static DEVICE_ATTR(add_hhlen, 0644, qeth_hhlen_show, qeth_hhlen_store);
-
-static ssize_t
-qeth_takeover_show(struct device *dev, char *buf)
-{
-	struct qeth_card *card = dev->driver_data;
-
-	if (!card)
-		return -EINVAL;
-
-	return sprintf(buf, "%s\n",
-		       (card->options.ena_ipat == ENABLE_TAKEOVER)?"1":"0");
-}
-
-static ssize_t
-qeth_takeover_store(struct device *dev, const char *buf, size_t count)
-{
-	struct qeth_card *card = dev->driver_data;
-	int i;
-	char *tmp;
-
-	if (!card)
-		return count;
-
-	if (atomic_read(&card->is_hardsetup))
-		return -EPERM;
-
-	i = simple_strtoul(buf, &tmp, 16);
-	if (i == 1)
-		card->options.ena_ipat = ENABLE_TAKEOVER;
-	else if (i == 0)
-		card->options.ena_ipat = DISABLE_TAKEOVER;
-	else
-		return -EINVAL;
-
-	return count;
-}
-
-static DEVICE_ATTR(enable_takeover, 0644, qeth_takeover_show, qeth_takeover_store);
-
-static ssize_t
-qeth_macaddr_show(struct device *dev, char *buf)
-{
-	struct qeth_card *card = dev->driver_data;
-
-	if (!card)
-		return -EINVAL;
-
-	return sprintf(buf, "%s\n",
-		       (card->options.macaddr_mode == MACADDR_CANONICAL)?"1":"0");
-}
-
-static ssize_t
-qeth_macaddr_store(struct device *dev, const char *buf, size_t count)
-{
-	struct qeth_card *card = dev->driver_data;
-	int i;
-	char *tmp;
-
-	if (!card)
-		return count;
-
-	if (atomic_read(&card->is_hardsetup))
-		return -EPERM;
-
-	i = simple_strtoul(buf, &tmp, 16);
-	if (i == 0)
-		card->options.macaddr_mode = MACADDR_NONCANONICAL;
-	else if (i == 1)
-		card->options.macaddr_mode = MACADDR_CANONICAL;
-	else
-		return -EINVAL;
-
-	return count;
-}
-
-static DEVICE_ATTR(canonical_macaddr, 0644, qeth_macaddr_show, qeth_macaddr_store);
-
-static ssize_t
-qeth_fakebr_show(struct device *dev, char *buf)
-{
-	struct qeth_card *card = dev->driver_data;
-
-	if (!card)
-		return -EINVAL;
-
-	return sprintf(buf, "%s\n",
-		       (card->options.fake_broadcast == FAKE_BROADCAST)?"1":"0");
-}
-
-static ssize_t
-qeth_fakebr_store(struct device *dev, const char *buf, size_t count)
-{
-	struct qeth_card *card = dev->driver_data;
-	int i;
-	char *tmp;
-
-	if (!card)
-		return count;
-
-	if (atomic_read(&card->is_hardsetup))
-		return -EPERM;
-
-	i = simple_strtoul(buf, &tmp, 16);
-	if (i == 0)
-		card->options.fake_broadcast = DONT_FAKE_BROADCAST;
-	else if (i == 1)
-		card->options.fake_broadcast = FAKE_BROADCAST;
-	else
-		return -EINVAL;
-
-	return count;
-}
-
-static DEVICE_ATTR(fake_broadcast, 0644, qeth_fakebr_show, qeth_fakebr_store);
-
-static ssize_t
-qeth_fakell_show(struct device *dev, char *buf)
-{
-	struct qeth_card *card = dev->driver_data;
-
-	if (!card)
-		return -EINVAL;
-
-	return sprintf(buf, "%s\n",
-		       (card->options.fake_ll == FAKE_LL)?"1":"0");
-}
-
-static ssize_t
-qeth_fakell_store(struct device *dev, const char *buf, size_t count)
-{
-	struct qeth_card *card = dev->driver_data;
-	int i;
-	char *tmp;
-
-	if (!card)
-		return count;
-
-	if (atomic_read(&card->is_hardsetup))
-		return -EPERM;
-
-	i = simple_strtoul(buf, &tmp, 16);
-	if (i == 0)
-		card->options.fake_ll = DONT_FAKE_LL;
-	else if (i == 1)
-		card->options.fake_ll = FAKE_LL;
-	else
-		return -EINVAL;
-
-	return count;
-}
-
-static DEVICE_ATTR(fake_ll, 0644, qeth_fakell_show, qeth_fakell_store);
-
-static ssize_t
-qeth_broadcast_show(struct device *dev, char *buf)
-{
-	struct qeth_card *card = dev->driver_data;
-
-	if (!card)
-		return -EINVAL;
-
-	return sprintf(buf, "%s\n",
-		       (card->options.broadcast_mode == BROADCAST_ALLRINGS)
-		       ?"allrings":"local");
-}
-
-static ssize_t
-qeth_broadcast_store(struct device *dev, const char *buf, size_t count)
-{
-	struct qeth_card *card = dev->driver_data;
-	char *tmp;
-	int cnt;
-
-	if (!card)
-		return count;
-
-	if (atomic_read(&card->is_hardsetup))
-		return -EPERM;
-
-	/* Remove trailing '\n'. */
-	tmp = strsep((char **) &buf, "\n");
-	cnt = strlen(tmp);
-	if (!strncmp(tmp, "broadcast_allrings", cnt))
-		card->options.broadcast_mode = BROADCAST_ALLRINGS;
-	else if (!strncmp(tmp, "broadcast_local", cnt))
-		card->options.broadcast_mode = BROADCAST_LOCAL;
-	else
-		PRINT_WARN("unknown broadcast type '%s'\n", tmp);
-
-	return count;
-}
-
-static DEVICE_ATTR(broadcast_mode, 0644, qeth_broadcast_show, qeth_broadcast_store);
-
-static ssize_t
-qeth_recover_store(struct device *dev, const char *buf, size_t count)
-{
-	struct qeth_card *card = dev->driver_data;
-	int i;
-	char *tmp;
-
-	if (!card)
-		return count;
-
-	i = simple_strtoul(buf, &tmp, 16);
-	if (i == 1) {
-		QETH_DBF_CARD2(0, trace, "UTRC", card);
-		atomic_set(&card->problem, PROBLEM_USER_TRIGGERED_RECOVERY);
-		qeth_schedule_recovery(card);
-		return count;
-	} else
-		return -EINVAL;
-}
-
-static DEVICE_ATTR(recover, 0200, 0, qeth_recover_store);
-
-static ssize_t
-qeth_card_type_show(struct device *dev, char *buf)
-{
-	struct qeth_card *card = dev->driver_data;
-
-	if (!card)
-		return -EINVAL;
-
-	if (!atomic_read(&card->is_softsetup))
-		return sprintf(buf, "n/a\n");
-
-	return sprintf(buf, "%s\n",
-		       qeth_get_cardname_short(card->type, card->link_type,
-					       card->is_guest_lan));
-}
-
-static DEVICE_ATTR(card_type, 0444, qeth_card_type_show, NULL);
-
-static struct attribute * qeth_attrs[] = {
-	&dev_attr_bufcnt.attr,
-	&dev_attr_portname.attr,
-	&dev_attr_route4.attr,
-	&dev_attr_route6.attr,
-	&dev_attr_checksumming.attr,
-	&dev_attr_priority_queueing.attr,
-	&dev_attr_portno.attr,
-	&dev_attr_polltime.attr,
-	&dev_attr_add_hhlen.attr,
-	&dev_attr_enable_takeover.attr,
-	&dev_attr_canonical_macaddr.attr,
-	&dev_attr_fake_broadcast.attr,
-	&dev_attr_fake_ll.attr,
-	&dev_attr_broadcast_mode.attr,
-	&dev_attr_recover.attr,
-	&dev_attr_card_type.attr,
-	NULL,
-};
-
-static struct attribute_group qeth_attr_group = {
-	.attrs = qeth_attrs,
-};
-
-static inline int
-__qeth_create_attributes(struct device *dev)
-{
-	return sysfs_create_group(&dev->kobj, &qeth_attr_group);
-}
-
-static inline void
-__qeth_remove_attributes(struct device *dev)
-{
-	sysfs_remove_group(&dev->kobj, &qeth_attr_group);
-}
-
-static int
-qeth_probe_device(struct ccwgroup_device *gdev)
-{
-	struct qeth_card *card;
-	int ret;
-
-	if (!get_device(&gdev->dev))
-		return -ENODEV;
-
-	card = qeth_alloc_card();
-	if (!card) {
-		put_device(&gdev->dev);
-		return -ENOMEM;
-	}
-
-	gdev->dev.driver_data = card;
-	card->gdev = gdev;
-
-	gdev->cdev[0]->handler = qeth_interrupt_handler_read;
-
-	gdev->cdev[1]->handler = qeth_interrupt_handler_write;
-
-	gdev->cdev[2]->handler = qeth_interrupt_handler_qdio;
-
-	ret = __qeth_create_attributes(&gdev->dev);
-	if (ret != 0)
-		goto out;
-
-	return 0;
-out:
-	put_device(&gdev->dev);
-	qeth_free_card(card);
-	return ret;
-}
-
-/* 
- * Replaces qeth_probe and qeth_attach_handler. 
- * This is called after piping to the 'online' attribute,
- * when all parameters are ready.
- */
-static int
-qeth_activate(struct qeth_card *card)
-{
-	int result;
-
-	ccw_device_set_online(CARD_RDEV(card));
-	ccw_device_set_online(CARD_WDEV(card));
-	ccw_device_set_online(CARD_DDEV(card));
-
-	QETH_DBF_CARD1(0, setup, "activ", card);
-	QETH_DBF_HEX1(0, setup, &card, sizeof (void *));
-	QETH_DBF_HEX1(0, setup, &card->dev, sizeof (void *));
-	QETH_DBF_HEX1(0, setup, &card->stats, sizeof (void *));
-
-	QETH_DBF_HEX2(0, misc, &card->options, QETH_DBF_MISC_LEN);
-
-	if (qeth_determine_card_type(card)) {
-		PRINT_WARN("%s: not a valid card type\n", __func__);
-		goto out;
-	}
-
-	qeth_insert_card_into_list(card);
-
-	qeth_correct_routing_status(card);
-
-	result = qeth_init_ringbuffers1(card);
-	if (result) {
-		PRINT_WARN("%s: could not init ringbuffers1\n", __func__);
-		goto out_remove;
-	}
-
-	result = qeth_hardsetup_card(card, 0);
-	if (result) {
-		goto out_remove;
-	}
-
-	result = qeth_init_ringbuffers2(card);
-	if (result) {
-		PRINT_WARN("%s: could not init ringbuffers2\n", __func__);
-		goto out_remove;
-	}
-
-	/* this was previously done in chandev_initnetdevice */
-	snprintf(card->dev->name, 8, "%s%%d",
-		 qeth_get_dev_basename(card->type, card->link_type));
-	if (qeth_init_netdev(card))
-		goto out_remove;
-
-	return 0;		/* success */
-
-out_remove:
-	qeth_remove_card(card, QETH_REMOVE_CARD_QUICK);
-	qeth_remove_card_from_list(card);
-
-out:
-	QETH_DBF_TEXT4(0, trace, "freecard");
-
-	ccw_device_set_offline(CARD_DDEV(card));
-	ccw_device_set_offline(CARD_WDEV(card));
-	ccw_device_set_offline(CARD_RDEV(card));
-
-	return -ENODEV;
-}
-
-static int
-qeth_set_online(struct ccwgroup_device *gdev)
-{
-	int rc;
-	struct qeth_card *card = gdev->dev.driver_data;
-
-	BUG_ON(!card);
-
-	rc = qeth_alloc_card_stuff(card);
-
-	return rc ? rc : qeth_activate(card);
-
-}
-
-static int
-qeth_set_offline(struct ccwgroup_device *gdev)
-{
-	struct qeth_card *card = gdev->dev.driver_data;
-
-	if (!card)
-		return -ENODEV;
-
-	qeth_remove_card(card, QETH_REMOVE_CARD_PROPER);
-	qeth_remove_card_from_list(card);
-
-	QETH_DBF_TEXT4(0, trace, "freecard");
-
-	ccw_device_set_offline(CARD_DDEV(card));
-	ccw_device_set_offline(CARD_WDEV(card));
-	ccw_device_set_offline(CARD_RDEV(card));
-
-	qeth_free_card_stuff(card);
-
-	return 0;
-}
-
-static void
-qeth_remove_device(struct ccwgroup_device *gdev)
-{
-	struct qeth_card *card = gdev->dev.driver_data;
-
-	if (card && qeth_does_card_exist(card))
-		/* Means that card is already in list. */
-		qeth_set_offline(gdev);
-	__qeth_remove_attributes(&gdev->dev);
-	gdev->dev.driver_data = NULL;
-	if (card)
-		qeth_free_card(card);
-	put_device(&gdev->dev);
-}
-
-static struct ccwgroup_driver qeth_ccwgroup_driver = {
-	.owner = THIS_MODULE,
-	.name = "qeth",
-	.driver_id = 0xD8C5E3C8,
-	.probe = qeth_probe_device,
-	.remove = qeth_remove_device,
-	.set_online = qeth_set_online,
-	.set_offline = qeth_set_offline,
-};
-
-static int __init
-qeth_init(void)
-{
-	int result;
-
-	qeth_eyecatcher();
-
-	printk(KERN_INFO "qeth: loading %s\n", version);
-
-	result = qeth_get_internal_functions();
-	if (result)
-		goto out;
-
-	qeth_alloc_spare_bufs();
-
-#ifdef QETH_IPV6
-	if (qeth_ipv6_init()) {
-		PRINT_ERR("Out of memory during ipv6 init.\n");
-		goto out_sparebufs;
-	}
-#endif /* QETH_IPV6 */
-
-	result = qeth_register_dbf_views();
-	if (result) {
-		PRINT_ERR("not enough memory for dbf. Will not load module.\n");
-		goto out_ipv6;
-	}
-
-	result = ccwgroup_driver_register(&qeth_ccwgroup_driver);
-	if (result)
-		goto out_dbf;
-
-	result = ccw_driver_register(&qeth_ccw_driver);
-	if (result)
-		goto out_gdrv;
-
-	result = driver_create_file(&qeth_ccwgroup_driver.driver,
-				    &driver_attr_group);
-	if (result)
-		goto out_cdrv;
-
-	qeth_root_dev = s390_root_dev_register("qeth");
-	if (IS_ERR(qeth_root_dev)) {
-		result = PTR_ERR(qeth_root_dev);
-		goto out_file;
-	}
-	qeth_register_notifiers();
-	qeth_add_procfs_entries();
-
-	return 0;
-
-out_file:
-	driver_remove_file(&qeth_ccwgroup_driver.driver, &driver_attr_group);
-out_cdrv:
-	ccw_driver_unregister(&qeth_ccw_driver);
-out_gdrv:
-	ccwgroup_driver_unregister(&qeth_ccwgroup_driver);
-out_dbf:
-	qeth_unregister_dbf_views();
-out_ipv6:
-#ifdef QETH_IPV6
-	qeth_ipv6_uninit();
-out_sparebufs:
-#endif /* QETH_IPV6 */
-	qeth_free_all_spare_bufs();
-out:
-	return result;
-}
-
-static void __exit
-qeth_exit(void)
-{
-#ifdef QETH_IPV6
-	qeth_ipv6_uninit();
-#endif /* QETH_IPV6 */
-	qeth_unregister_notifiers();
-
-	qeth_remove_procfs_entries();
-
-	QETH_DBF_TEXT1(0, trace, "cleanup.");
-
-	driver_remove_file(&qeth_ccwgroup_driver.driver, &driver_attr_group);
-	ccw_driver_unregister(&qeth_ccw_driver);
-	ccwgroup_driver_unregister(&qeth_ccwgroup_driver);
-	s390_root_dev_unregister(qeth_root_dev);
-
-	while (firstcard) {
-		struct qeth_card *card = firstcard;
-		qeth_remove_card(card, QETH_REMOVE_CARD_QUICK);
-		qeth_remove_card_from_list(card);
-		qeth_free_card(card);
-	}
-
-	qeth_free_all_spare_bufs();
-
-	qeth_unregister_dbf_views();
-
-	printk("qeth: %s: module removed\n", version);
-}
-
-EXPORT_SYMBOL(qeth_eyecatcher);
-
-module_init(qeth_init);
-module_exit(qeth_exit);
--- diff/drivers/serial/amba.c	2004-04-05 12:57:08.000000000 +0100
+++ source/drivers/serial/amba.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,762 +0,0 @@
-/*
- *  linux/drivers/char/amba.c
- *
- *  Driver for AMBA serial ports
- *
- *  Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
- *
- *  Copyright 1999 ARM Limited
- *  Copyright (C) 2000 Deep Blue Solutions Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- *  $Id: amba.c,v 1.41 2002/07/28 10:03:27 rmk Exp $
- *
- * This is a generic driver for ARM AMBA-type serial ports.  They
- * have a lot of 16550-like features, but are not register compatible.
- * Note that although they do have CTS, DCD and DSR inputs, they do
- * not have an RI input, nor do they have DTR or RTS outputs.  If
- * required, these have to be supplied via some other means (eg, GPIO)
- * and hooked into this driver.
- */
-#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/tty.h>
-#include <linux/ioport.h>
-#include <linux/init.h>
-#include <linux/serial.h>
-#include <linux/console.h>
-#include <linux/sysrq.h>
-#include <linux/device.h>
-
-#include <asm/io.h>
-#include <asm/irq.h>
-
-#if defined(CONFIG_SERIAL_AMBA_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
-#define SUPPORT_SYSRQ
-#endif
-
-#include <linux/serial_core.h>
-
-#include <asm/hardware/serial_amba.h>
-
-#define UART_NR		2
-
-#define SERIAL_AMBA_MAJOR	204
-#define SERIAL_AMBA_MINOR	16
-#define SERIAL_AMBA_NR		UART_NR
-
-#define AMBA_ISR_PASS_LIMIT	256
-
-/*
- * Access macros for the AMBA UARTs
- */
-#define UART_GET_INT_STATUS(p)	readb((p)->membase + AMBA_UARTIIR)
-#define UART_PUT_ICR(p, c)	writel((c), (p)->membase + AMBA_UARTICR)
-#define UART_GET_FR(p)		readb((p)->membase + AMBA_UARTFR)
-#define UART_GET_CHAR(p)	readb((p)->membase + AMBA_UARTDR)
-#define UART_PUT_CHAR(p, c)	writel((c), (p)->membase + AMBA_UARTDR)
-#define UART_GET_RSR(p)		readb((p)->membase + AMBA_UARTRSR)
-#define UART_GET_CR(p)		readb((p)->membase + AMBA_UARTCR)
-#define UART_PUT_CR(p,c)	writel((c), (p)->membase + AMBA_UARTCR)
-#define UART_GET_LCRL(p)	readb((p)->membase + AMBA_UARTLCR_L)
-#define UART_PUT_LCRL(p,c)	writel((c), (p)->membase + AMBA_UARTLCR_L)
-#define UART_GET_LCRM(p)	readb((p)->membase + AMBA_UARTLCR_M)
-#define UART_PUT_LCRM(p,c)	writel((c), (p)->membase + AMBA_UARTLCR_M)
-#define UART_GET_LCRH(p)	readb((p)->membase + AMBA_UARTLCR_H)
-#define UART_PUT_LCRH(p,c)	writel((c), (p)->membase + AMBA_UARTLCR_H)
-#define UART_RX_DATA(s)		(((s) & AMBA_UARTFR_RXFE) == 0)
-#define UART_TX_READY(s)	(((s) & AMBA_UARTFR_TXFF) == 0)
-#define UART_TX_EMPTY(p)	((UART_GET_FR(p) & AMBA_UARTFR_TMSK) == 0)
-
-#define UART_DUMMY_RSR_RX	256
-#define UART_PORT_SIZE		64
-
-/*
- * On the Integrator platform, the port RTS and DTR are provided by
- * bits in the following SC_CTRLS register bits:
- *        RTS  DTR
- *  UART0  7    6
- *  UART1  5    4
- */
-#define SC_CTRLC	(IO_ADDRESS(INTEGRATOR_SC_BASE) + INTEGRATOR_SC_CTRLC_OFFSET)
-#define SC_CTRLS	(IO_ADDRESS(INTEGRATOR_SC_BASE) + INTEGRATOR_SC_CTRLS_OFFSET)
-
-/*
- * We wrap our port structure around the generic uart_port.
- */
-struct uart_amba_port {
-	struct uart_port	port;
-	unsigned int		dtr_mask;
-	unsigned int		rts_mask;
-	unsigned int		old_status;
-};
-
-static void ambauart_stop_tx(struct uart_port *port, unsigned int tty_stop)
-{
-	unsigned int cr;
-
-	cr = UART_GET_CR(port);
-	cr &= ~AMBA_UARTCR_TIE;
-	UART_PUT_CR(port, cr);
-}
-
-static void ambauart_start_tx(struct uart_port *port, unsigned int tty_start)
-{
-	unsigned int cr;
-
-	cr = UART_GET_CR(port);
-	cr |= AMBA_UARTCR_TIE;
-	UART_PUT_CR(port, cr);
-}
-
-static void ambauart_stop_rx(struct uart_port *port)
-{
-	unsigned int cr;
-
-	cr = UART_GET_CR(port);
-	cr &= ~(AMBA_UARTCR_RIE | AMBA_UARTCR_RTIE);
-	UART_PUT_CR(port, cr);
-}
-
-static void ambauart_enable_ms(struct uart_port *port)
-{
-	unsigned int cr;
-
-	cr = UART_GET_CR(port);
-	cr |= AMBA_UARTCR_MSIE;
-	UART_PUT_CR(port, cr);
-}
-
-static void
-#ifdef SUPPORT_SYSRQ
-ambauart_rx_chars(struct uart_port *port, struct pt_regs *regs)
-#else
-ambauart_rx_chars(struct uart_port *port)
-#endif
-{
-	struct tty_struct *tty = port->info->tty;
-	unsigned int status, ch, rsr, max_count = 256;
-
-	status = UART_GET_FR(port);
-	while (UART_RX_DATA(status) && max_count--) {
-		if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
-			tty->flip.work.func((void *)tty);
-			if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
-				printk(KERN_WARNING "TTY_DONT_FLIP set\n");
-				return;
-			}
-		}
-
-		ch = UART_GET_CHAR(port);
-
-		*tty->flip.char_buf_ptr = ch;
-		*tty->flip.flag_buf_ptr = TTY_NORMAL;
-		port->icount.rx++;
-
-		/*
-		 * Note that the error handling code is
-		 * out of the main execution path
-		 */
-		rsr = UART_GET_RSR(port) | UART_DUMMY_RSR_RX;
-		if (rsr & AMBA_UARTRSR_ANY) {
-			if (rsr & AMBA_UARTRSR_BE) {
-				rsr &= ~(AMBA_UARTRSR_FE | AMBA_UARTRSR_PE);
-				port->icount.brk++;
-				if (uart_handle_break(port))
-					goto ignore_char;
-			} else if (rsr & AMBA_UARTRSR_PE)
-				port->icount.parity++;
-			else if (rsr & AMBA_UARTRSR_FE)
-				port->icount.frame++;
-			if (rsr & AMBA_UARTRSR_OE)
-				port->icount.overrun++;
-
-			rsr &= port->read_status_mask;
-
-			if (rsr & AMBA_UARTRSR_BE)
-				*tty->flip.flag_buf_ptr = TTY_BREAK;
-			else if (rsr & AMBA_UARTRSR_PE)
-				*tty->flip.flag_buf_ptr = TTY_PARITY;
-			else if (rsr & AMBA_UARTRSR_FE)
-				*tty->flip.flag_buf_ptr = TTY_FRAME;
-		}
-
-		if (uart_handle_sysrq_char(port, ch, regs))
-			goto ignore_char;
-
-		if ((rsr & port->ignore_status_mask) == 0) {
-			tty->flip.flag_buf_ptr++;
-			tty->flip.char_buf_ptr++;
-			tty->flip.count++;
-		}
-		if ((rsr & AMBA_UARTRSR_OE) &&
-		    tty->flip.count < TTY_FLIPBUF_SIZE) {
-			/*
-			 * Overrun is special, since it's reported
-			 * immediately, and doesn't affect the current
-			 * character
-			 */
-			*tty->flip.char_buf_ptr++ = 0;
-			*tty->flip.flag_buf_ptr++ = TTY_OVERRUN;
-			tty->flip.count++;
-		}
-	ignore_char:
-		status = UART_GET_FR(port);
-	}
-	tty_flip_buffer_push(tty);
-	return;
-}
-
-static void ambauart_tx_chars(struct uart_port *port)
-{
-	struct circ_buf *xmit = &port->info->xmit;
-	int count;
-
-	if (port->x_char) {
-		UART_PUT_CHAR(port, port->x_char);
-		port->icount.tx++;
-		port->x_char = 0;
-		return;
-	}
-	if (uart_circ_empty(xmit) || uart_tx_stopped(port)) {
-		ambauart_stop_tx(port, 0);
-		return;
-	}
-
-	count = port->fifosize >> 1;
-	do {
-		UART_PUT_CHAR(port, xmit->buf[xmit->tail]);
-		xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
-		port->icount.tx++;
-		if (uart_circ_empty(xmit))
-			break;
-	} while (--count > 0);
-
-	if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
-		uart_write_wakeup(port);
-
-	if (uart_circ_empty(xmit))
-		ambauart_stop_tx(port, 0);
-}
-
-static void ambauart_modem_status(struct uart_port *port)
-{
-	struct uart_amba_port *uap = (struct uart_amba_port *)port;
-	unsigned int status, delta;
-
-	UART_PUT_ICR(&uap->port, 0);
-
-	status = UART_GET_FR(&uap->port) & AMBA_UARTFR_MODEM_ANY;
-
-	delta = status ^ uap->old_status;
-	uap->old_status = status;
-
-	if (!delta)
-		return;
-
-	if (delta & AMBA_UARTFR_DCD)
-		uart_handle_dcd_change(&uap->port, status & AMBA_UARTFR_DCD);
-
-	if (delta & AMBA_UARTFR_DSR)
-		uap->port.icount.dsr++;
-
-	if (delta & AMBA_UARTFR_CTS)
-		uart_handle_cts_change(&uap->port, status & AMBA_UARTFR_CTS);
-
-	wake_up_interruptible(&uap->port.info->delta_msr_wait);
-}
-
-static irqreturn_t ambauart_int(int irq, void *dev_id, struct pt_regs *regs)
-{
-	struct uart_port *port = dev_id;
-	unsigned int status, pass_counter = AMBA_ISR_PASS_LIMIT;
-
-	status = UART_GET_INT_STATUS(port);
-	do {
-		if (status & (AMBA_UARTIIR_RTIS | AMBA_UARTIIR_RIS))
-#ifdef SUPPORT_SYSRQ
-			ambauart_rx_chars(port, regs);
-#else
-			ambauart_rx_chars(port);
-#endif
-		if (status & AMBA_UARTIIR_MIS)
-			ambauart_modem_status(port);
-		if (status & AMBA_UARTIIR_TIS)
-			ambauart_tx_chars(port);
-
-		if (pass_counter-- == 0)
-			break;
-
-		status = UART_GET_INT_STATUS(port);
-	} while (status & (AMBA_UARTIIR_RTIS | AMBA_UARTIIR_RIS |
-			   AMBA_UARTIIR_TIS));
-
-	return IRQ_HANDLED;
-}
-
-static unsigned int ambauart_tx_empty(struct uart_port *port)
-{
-	return UART_GET_FR(port) & AMBA_UARTFR_BUSY ? 0 : TIOCSER_TEMT;
-}
-
-static unsigned int ambauart_get_mctrl(struct uart_port *port)
-{
-	unsigned int result = 0;
-	unsigned int status;
-
-	status = UART_GET_FR(port);
-	if (status & AMBA_UARTFR_DCD)
-		result |= TIOCM_CAR;
-	if (status & AMBA_UARTFR_DSR)
-		result |= TIOCM_DSR;
-	if (status & AMBA_UARTFR_CTS)
-		result |= TIOCM_CTS;
-
-	return result;
-}
-
-static void ambauart_set_mctrl(struct uart_port *port, unsigned int mctrl)
-{
-	struct uart_amba_port *uap = (struct uart_amba_port *)port;
-	unsigned int ctrls = 0, ctrlc = 0;
-
-	if (mctrl & TIOCM_RTS)
-		ctrlc |= uap->rts_mask;
-	else
-		ctrls |= uap->rts_mask;
-
-	if (mctrl & TIOCM_DTR)
-		ctrlc |= uap->dtr_mask;
-	else
-		ctrls |= uap->dtr_mask;
-
-	__raw_writel(ctrls, SC_CTRLS);
-	__raw_writel(ctrlc, SC_CTRLC);
-}
-
-static void ambauart_break_ctl(struct uart_port *port, int break_state)
-{
-	unsigned long flags;
-	unsigned int lcr_h;
-
-	spin_lock_irqsave(&port->lock, flags);
-	lcr_h = UART_GET_LCRH(port);
-	if (break_state == -1)
-		lcr_h |= AMBA_UARTLCR_H_BRK;
-	else
-		lcr_h &= ~AMBA_UARTLCR_H_BRK;
-	UART_PUT_LCRH(port, lcr_h);
-	spin_unlock_irqrestore(&port->lock, flags);
-}
-
-static int ambauart_startup(struct uart_port *port)
-{
-	struct uart_amba_port *uap = (struct uart_amba_port *)port;
-	int retval;
-
-	/*
-	 * Allocate the IRQ
-	 */
-	retval = request_irq(port->irq, ambauart_int, 0, "amba", port);
-	if (retval)
-		return retval;
-
-	/*
-	 * initialise the old status of the modem signals
-	 */
-	uap->old_status = UART_GET_FR(port) & AMBA_UARTFR_MODEM_ANY;
-
-	/*
-	 * Finally, enable interrupts
-	 */
-	UART_PUT_CR(port, AMBA_UARTCR_UARTEN | AMBA_UARTCR_RIE |
-			  AMBA_UARTCR_RTIE);
-
-	return 0;
-}
-
-static void ambauart_shutdown(struct uart_port *port)
-{
-	/*
-	 * Free the interrupt
-	 */
-	free_irq(port->irq, port);
-
-	/*
-	 * disable all interrupts, disable the port
-	 */
-	UART_PUT_CR(port, 0);
-
-	/* disable break condition and fifos */
-	UART_PUT_LCRH(port, UART_GET_LCRH(port) &
-		~(AMBA_UARTLCR_H_BRK | AMBA_UARTLCR_H_FEN));
-}
-
-static void
-ambauart_set_termios(struct uart_port *port, struct termios *termios,
-		     struct termios *old)
-{
-	unsigned int lcr_h, old_cr;
-	unsigned long flags;
-	unsigned int baud, quot;
-
-	/*
-	 * Ask the core to calculate the divisor for us.
-	 */
-	baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16); 
-	quot = uart_get_divisor(port, baud);
-
-	switch (termios->c_cflag & CSIZE) {
-	case CS5:
-		lcr_h = AMBA_UARTLCR_H_WLEN_5;
-		break;
-	case CS6:
-		lcr_h = AMBA_UARTLCR_H_WLEN_6;
-		break;
-	case CS7:
-		lcr_h = AMBA_UARTLCR_H_WLEN_7;
-		break;
-	default: // CS8
-		lcr_h = AMBA_UARTLCR_H_WLEN_8;
-		break;
-	}
-	if (termios->c_cflag & CSTOPB)
-		lcr_h |= AMBA_UARTLCR_H_STP2;
-	if (termios->c_cflag & PARENB) {
-		lcr_h |= AMBA_UARTLCR_H_PEN;
-		if (!(termios->c_cflag & PARODD))
-			lcr_h |= AMBA_UARTLCR_H_EPS;
-	}
-	if (port->fifosize > 1)
-		lcr_h |= AMBA_UARTLCR_H_FEN;
-
-	spin_lock_irqsave(&port->lock, flags);
-
-	/*
-	 * Update the per-port timeout.
-	 */
-	uart_update_timeout(port, termios->c_cflag, baud);
-
-	port->read_status_mask = AMBA_UARTRSR_OE;
-	if (termios->c_iflag & INPCK)
-		port->read_status_mask |= AMBA_UARTRSR_FE | AMBA_UARTRSR_PE;
-	if (termios->c_iflag & (BRKINT | PARMRK))
-		port->read_status_mask |= AMBA_UARTRSR_BE;
-
-	/*
-	 * Characters to ignore
-	 */
-	port->ignore_status_mask = 0;
-	if (termios->c_iflag & IGNPAR)
-		port->ignore_status_mask |= AMBA_UARTRSR_FE | AMBA_UARTRSR_PE;
-	if (termios->c_iflag & IGNBRK) {
-		port->ignore_status_mask |= AMBA_UARTRSR_BE;
-		/*
-		 * If we're ignoring parity and break indicators,
-		 * ignore overruns too (for real raw support).
-		 */
-		if (termios->c_iflag & IGNPAR)
-			port->ignore_status_mask |= AMBA_UARTRSR_OE;
-	}
-
-	/*
-	 * Ignore all characters if CREAD is not set.
-	 */
-	if ((termios->c_cflag & CREAD) == 0)
-		port->ignore_status_mask |= UART_DUMMY_RSR_RX;
-
-	/* first, disable everything */
-	old_cr = UART_GET_CR(port) & ~AMBA_UARTCR_MSIE;
-
-	if (UART_ENABLE_MS(port, termios->c_cflag))
-		old_cr |= AMBA_UARTCR_MSIE;
-
-	UART_PUT_CR(port, 0);
-
-	/* Set baud rate */
-	quot -= 1;
-	UART_PUT_LCRM(port, ((quot & 0xf00) >> 8));
-	UART_PUT_LCRL(port, (quot & 0xff));
-
-	/*
-	 * ----------v----------v----------v----------v-----
-	 * NOTE: MUST BE WRITTEN AFTER UARTLCR_M & UARTLCR_L
-	 * ----------^----------^----------^----------^-----
-	 */
-	UART_PUT_LCRH(port, lcr_h);
-	UART_PUT_CR(port, old_cr);
-
-	spin_unlock_irqrestore(&port->lock, flags);
-}
-
-static const char *ambauart_type(struct uart_port *port)
-{
-	return port->type == PORT_AMBA ? "AMBA" : NULL;
-}
-
-/*
- * Release the memory region(s) being used by 'port'
- */
-static void ambauart_release_port(struct uart_port *port)
-{
-	release_mem_region(port->mapbase, UART_PORT_SIZE);
-}
-
-/*
- * Request the memory region(s) being used by 'port'
- */
-static int ambauart_request_port(struct uart_port *port)
-{
-	return request_mem_region(port->mapbase, UART_PORT_SIZE, "serial_amba")
-			!= NULL ? 0 : -EBUSY;
-}
-
-/*
- * Configure/autoconfigure the port.
- */
-static void ambauart_config_port(struct uart_port *port, int flags)
-{
-	if (flags & UART_CONFIG_TYPE) {
-		port->type = PORT_AMBA;
-		ambauart_request_port(port);
-	}
-}
-
-/*
- * verify the new serial_struct (for TIOCSSERIAL).
- */
-static int ambauart_verify_port(struct uart_port *port, struct serial_struct *ser)
-{
-	int ret = 0;
-	if (ser->type != PORT_UNKNOWN && ser->type != PORT_AMBA)
-		ret = -EINVAL;
-	if (ser->irq < 0 || ser->irq >= NR_IRQS)
-		ret = -EINVAL;
-	if (ser->baud_base < 9600)
-		ret = -EINVAL;
-	return ret;
-}
-
-static struct uart_ops amba_pops = {
-	.tx_empty	= ambauart_tx_empty,
-	.set_mctrl	= ambauart_set_mctrl,
-	.get_mctrl	= ambauart_get_mctrl,
-	.stop_tx	= ambauart_stop_tx,
-	.start_tx	= ambauart_start_tx,
-	.stop_rx	= ambauart_stop_rx,
-	.enable_ms	= ambauart_enable_ms,
-	.break_ctl	= ambauart_break_ctl,
-	.startup	= ambauart_startup,
-	.shutdown	= ambauart_shutdown,
-	.set_termios	= ambauart_set_termios,
-	.type		= ambauart_type,
-	.release_port	= ambauart_release_port,
-	.request_port	= ambauart_request_port,
-	.config_port	= ambauart_config_port,
-	.verify_port	= ambauart_verify_port,
-};
-
-static struct uart_amba_port amba_ports[UART_NR] = {
-	{
-		.port	= {
-			.membase	= (void *)IO_ADDRESS(INTEGRATOR_UART0_BASE),
-			.mapbase	= INTEGRATOR_UART0_BASE,
-			.iotype		= SERIAL_IO_MEM,
-			.irq		= IRQ_UARTINT0,
-			.uartclk	= 14745600,
-			.fifosize	= 16,
-			.ops		= &amba_pops,
-			.flags		= ASYNC_BOOT_AUTOCONF,
-			.line		= 0,
-		},
-		.dtr_mask	= 1 << 5,
-		.rts_mask	= 1 << 4,
-	},
-	{
-		.port	= {
-			.membase	= (void *)IO_ADDRESS(INTEGRATOR_UART1_BASE),
-			.mapbase	= INTEGRATOR_UART1_BASE,
-			.iotype		= SERIAL_IO_MEM,
-			.irq		= IRQ_UARTINT1,
-			.uartclk	= 14745600,
-			.fifosize	= 16,
-			.ops		= &amba_pops,
-			.flags		= ASYNC_BOOT_AUTOCONF,
-			.line		= 1,
-		},
-		.dtr_mask	= 1 << 7,
-		.rts_mask	= 1 << 6,
-	}
-};
-
-#ifdef CONFIG_SERIAL_AMBA_CONSOLE
-
-static void
-ambauart_console_write(struct console *co, const char *s, unsigned int count)
-{
-	struct uart_port *port = &amba_ports[co->index].port;
-	unsigned int status, old_cr;
-	int i;
-
-	/*
-	 *	First save the CR then disable the interrupts
-	 */
-	old_cr = UART_GET_CR(port);
-	UART_PUT_CR(port, AMBA_UARTCR_UARTEN);
-
-	/*
-	 *	Now, do each character
-	 */
-	for (i = 0; i < count; i++) {
-		do {
-			status = UART_GET_FR(port);
-		} while (!UART_TX_READY(status));
-		UART_PUT_CHAR(port, s[i]);
-		if (s[i] == '\n') {
-			do {
-				status = UART_GET_FR(port);
-			} while (!UART_TX_READY(status));
-			UART_PUT_CHAR(port, '\r');
-		}
-	}
-
-	/*
-	 *	Finally, wait for transmitter to become empty
-	 *	and restore the TCR
-	 */
-	do {
-		status = UART_GET_FR(port);
-	} while (status & AMBA_UARTFR_BUSY);
-	UART_PUT_CR(port, old_cr);
-}
-
-static void __init
-ambauart_console_get_options(struct uart_port *port, int *baud,
-			     int *parity, int *bits)
-{
-	if (UART_GET_CR(port) & AMBA_UARTCR_UARTEN) {
-		unsigned int lcr_h, quot;
-		lcr_h = UART_GET_LCRH(port);
-
-		*parity = 'n';
-		if (lcr_h & AMBA_UARTLCR_H_PEN) {
-			if (lcr_h & AMBA_UARTLCR_H_EPS)
-				*parity = 'e';
-			else
-				*parity = 'o';
-		}
-
-		if ((lcr_h & 0x60) == AMBA_UARTLCR_H_WLEN_7)
-			*bits = 7;
-		else
-			*bits = 8;
-
-		quot = UART_GET_LCRL(port) | UART_GET_LCRM(port) << 8;
-		*baud = port->uartclk / (16 * (quot + 1));
-	}
-}
-
-static int __init ambauart_console_setup(struct console *co, char *options)
-{
-	struct uart_port *port;
-	int baud = 38400;
-	int bits = 8;
-	int parity = 'n';
-	int flow = 'n';
-
-	/*
-	 * Check whether an invalid uart number has been specified, and
-	 * if so, search for the first available port that does have
-	 * console support.
-	 */
-	if (co->index >= UART_NR)
-		co->index = 0;
-	port = &amba_ports[co->index].port;
-
-	if (options)
-		uart_parse_options(options, &baud, &parity, &bits, &flow);
-	else
-		ambauart_console_get_options(port, &baud, &parity, &bits);
-
-	return uart_set_options(port, co, baud, parity, bits, flow);
-}
-
-extern struct uart_driver amba_reg;
-static struct console amba_console = {
-	.name		= "ttyAM",
-	.write		= ambauart_console_write,
-	.device		= uart_console_device,
-	.setup		= ambauart_console_setup,
-	.flags		= CON_PRINTBUFFER,
-	.index		= -1,
-	.data		= &amba_reg,
-};
-
-static int __init ambauart_console_init(void)
-{
-	register_console(&amba_console);
-	return 0;
-}
-console_initcall(ambauart_console_init);
-
-#define AMBA_CONSOLE	&amba_console
-#else
-#define AMBA_CONSOLE	NULL
-#endif
-
-static struct uart_driver amba_reg = {
-	.owner			= THIS_MODULE,
-	.driver_name		= "ttyAM",
-	.dev_name		= "ttyAM",
-	.major			= SERIAL_AMBA_MAJOR,
-	.minor			= SERIAL_AMBA_MINOR,
-	.nr			= UART_NR,
-	.cons			= AMBA_CONSOLE,
-};
-
-static int __init ambauart_init(void)
-{
-	int ret;
-
-	printk(KERN_INFO "Serial: AMBA driver $Revision: 1.41 $\n");
-
-	ret = uart_register_driver(&amba_reg);
-	if (ret == 0) {
-		int i;
-
-		for (i = 0; i < UART_NR; i++)
-			uart_add_one_port(&amba_reg, &amba_ports[i].port);
-	}
-	return ret;
-}
-
-static void __exit ambauart_exit(void)
-{
-	int i;
-
-	for (i = 0; i < UART_NR; i++)
-		uart_remove_one_port(&amba_reg, &amba_ports[i].port);
-
-	uart_unregister_driver(&amba_reg);
-}
-
-module_init(ambauart_init);
-module_exit(ambauart_exit);
-
-MODULE_AUTHOR("ARM Ltd/Deep Blue Solutions Ltd");
-MODULE_DESCRIPTION("ARM AMBA serial port driver $Revision: 1.41 $");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS_CHARDEV(SERIAL_AMBA_MAJOR, SERIAL_AMBA_MINOR);
--- diff/fs/hfs/COPYING	2002-10-16 04:27:48.000000000 +0100
+++ source/fs/hfs/COPYING	1970-01-01 01:00:00.000000000 +0100
@@ -1,339 +0,0 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                          675 Mass Ave, Cambridge, MA 02139, USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-
-	    How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) 19yy  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) 19yy name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
--- diff/include/asm-arm/hardware/serial_amba.h	2002-10-16 04:27:23.000000000 +0100
+++ source/include/asm-arm/hardware/serial_amba.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,94 +0,0 @@
-/*
- *  linux/include/asm-arm/hardware/serial_amba.h
- *
- *  Internal header file for AMBA serial ports
- *
- *  Copyright (C) ARM Limited
- *  Copyright (C) 2000 Deep Blue Solutions Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-#ifndef ASM_ARM_HARDWARE_SERIAL_AMBA_H
-#define ASM_ARM_HARDWARE_SERIAL_AMBA_H
-
-/* -------------------------------------------------------------------------------
- *  From AMBA UART (PL010) Block Specification (ARM-0001-CUST-DSPC-A03)
- * -------------------------------------------------------------------------------
- *  UART Register Offsets.
- */
-#define AMBA_UARTDR                     0x00	 /*  Data read or written from the interface. */
-#define AMBA_UARTRSR                    0x04	 /*  Receive status register (Read). */
-#define AMBA_UARTECR                    0x04	 /*  Error clear register (Write). */
-#define AMBA_UARTLCR_H                  0x08	 /*  Line control register, high byte. */
-#define AMBA_UARTLCR_M                  0x0C	 /*  Line control register, middle byte. */
-#define AMBA_UARTLCR_L                  0x10	 /*  Line control register, low byte. */
-#define AMBA_UARTCR                     0x14	 /*  Control register. */
-#define AMBA_UARTFR                     0x18	 /*  Flag register (Read only). */
-#define AMBA_UARTIIR                    0x1C	 /*  Interrupt indentification register (Read). */
-#define AMBA_UARTICR                    0x1C	 /*  Interrupt clear register (Write). */
-#define AMBA_UARTILPR                   0x20	 /*  IrDA low power counter register. */
-
-#define AMBA_UARTRSR_OE                 0x08
-#define AMBA_UARTRSR_BE                 0x04
-#define AMBA_UARTRSR_PE                 0x02
-#define AMBA_UARTRSR_FE                 0x01
-
-#define AMBA_UARTFR_TXFF                0x20
-#define AMBA_UARTFR_RXFE                0x10
-#define AMBA_UARTFR_BUSY                0x08
-#define AMBA_UARTFR_DCD			0x04
-#define AMBA_UARTFR_DSR			0x02
-#define AMBA_UARTFR_CTS			0x01
-#define AMBA_UARTFR_TMSK                (AMBA_UARTFR_TXFF + AMBA_UARTFR_BUSY)
- 
-#define AMBA_UARTCR_RTIE                0x40
-#define AMBA_UARTCR_TIE                 0x20
-#define AMBA_UARTCR_RIE                 0x10
-#define AMBA_UARTCR_MSIE                0x08
-#define AMBA_UARTCR_IIRLP               0x04
-#define AMBA_UARTCR_SIREN               0x02
-#define AMBA_UARTCR_UARTEN              0x01
- 
-#define AMBA_UARTLCR_H_WLEN_8           0x60
-#define AMBA_UARTLCR_H_WLEN_7           0x40
-#define AMBA_UARTLCR_H_WLEN_6           0x20
-#define AMBA_UARTLCR_H_WLEN_5           0x00
-#define AMBA_UARTLCR_H_FEN              0x10
-#define AMBA_UARTLCR_H_STP2             0x08
-#define AMBA_UARTLCR_H_EPS              0x04
-#define AMBA_UARTLCR_H_PEN              0x02
-#define AMBA_UARTLCR_H_BRK              0x01
-
-#define AMBA_UARTIIR_RTIS               0x08
-#define AMBA_UARTIIR_TIS                0x04
-#define AMBA_UARTIIR_RIS                0x02
-#define AMBA_UARTIIR_MIS                0x01
-
-#define ARM_BAUD_460800                 1
-#define ARM_BAUD_230400                 3
-#define ARM_BAUD_115200                 7
-#define ARM_BAUD_57600                  15
-#define ARM_BAUD_38400                  23
-#define ARM_BAUD_19200                  47
-#define ARM_BAUD_14400                  63
-#define ARM_BAUD_9600                   95
-#define ARM_BAUD_4800                   191
-#define ARM_BAUD_2400                   383
-#define ARM_BAUD_1200                   767
-
-#define AMBA_UARTRSR_ANY	(AMBA_UARTRSR_OE|AMBA_UARTRSR_BE|AMBA_UARTRSR_PE|AMBA_UARTRSR_FE)
-#define AMBA_UARTFR_MODEM_ANY	(AMBA_UARTFR_DCD|AMBA_UARTFR_DSR|AMBA_UARTFR_CTS)
-
-#endif
--- diff/include/asm-i386/mach-default/mach_resources.h	2003-06-30 10:07:34.000000000 +0100
+++ source/include/asm-i386/mach-default/mach_resources.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,106 +0,0 @@
-/*
- *  include/asm-i386/mach-default/mach_resources.h
- *
- *  Machine specific resource allocation for generic.
- *  Split out from setup.c by Osamu Tomita <tomita@cinet.co.jp>
- */
-#ifndef _MACH_RESOURCES_H
-#define _MACH_RESOURCES_H
-
-struct resource standard_io_resources[] = {
-	{ "dma1", 0x00, 0x1f, IORESOURCE_BUSY },
-	{ "pic1", 0x20, 0x21, IORESOURCE_BUSY },
-	{ "timer", 0x40, 0x5f, IORESOURCE_BUSY },
-	{ "keyboard", 0x60, 0x6f, IORESOURCE_BUSY },
-	{ "dma page reg", 0x80, 0x8f, IORESOURCE_BUSY },
-	{ "pic2", 0xa0, 0xa1, IORESOURCE_BUSY },
-	{ "dma2", 0xc0, 0xdf, IORESOURCE_BUSY },
-	{ "fpu", 0xf0, 0xff, IORESOURCE_BUSY }
-};
-
-#define STANDARD_IO_RESOURCES (sizeof(standard_io_resources)/sizeof(struct resource))
-
-static struct resource vram_resource = { "Video RAM area", 0xa0000, 0xbffff, IORESOURCE_BUSY };
-
-/* System ROM resources */
-#define MAXROMS 6
-static struct resource rom_resources[MAXROMS] = {
-	{ "System ROM", 0xF0000, 0xFFFFF, IORESOURCE_BUSY },
-	{ "Video ROM", 0xc0000, 0xc7fff, IORESOURCE_BUSY }
-};
-
-#define romsignature(x) (*(unsigned short *)(x) == 0xaa55)
-
-static inline void probe_video_rom(int roms)
-{
-	unsigned long base;
-	unsigned char *romstart;
-
-
-	/* Video ROM is standard at C000:0000 - C7FF:0000, check signature */
-	for (base = 0xC0000; base < 0xE0000; base += 2048) {
-		romstart = isa_bus_to_virt(base);
-		if (!romsignature(romstart))
-			continue;
-		request_resource(&iomem_resource, rom_resources + roms);
-		roms++;
-		break;
-	}
-}
-
-static inline void probe_extension_roms(int roms)
-{
-	unsigned long base;
-	unsigned char *romstart;
-
-	/* Extension roms at C800:0000 - DFFF:0000 */
-	for (base = 0xC8000; base < 0xE0000; base += 2048) {
-		unsigned long length;
-
-		romstart = isa_bus_to_virt(base);
-		if (!romsignature(romstart))
-			continue;
-		length = romstart[2] * 512;
-		if (length) {
-			unsigned int i;
-			unsigned char chksum;
-
-			chksum = 0;
-			for (i = 0; i < length; i++)
-				chksum += romstart[i];
-
-			/* Good checksum? */
-			if (!chksum) {
-				rom_resources[roms].start = base;
-				rom_resources[roms].end = base + length - 1;
-				rom_resources[roms].name = "Extension ROM";
-				rom_resources[roms].flags = IORESOURCE_BUSY;
-
-				request_resource(&iomem_resource, rom_resources + roms);
-				roms++;
-				if (roms >= MAXROMS)
-					return;
-			}
-		}
-	}
-
-	/* Final check for motherboard extension rom at E000:0000 */
-	base = 0xE0000;
-	romstart = isa_bus_to_virt(base);
-
-	if (romsignature(romstart)) {
-		rom_resources[roms].start = base;
-		rom_resources[roms].end = base + 65535;
-		rom_resources[roms].name = "Extension ROM";
-		rom_resources[roms].flags = IORESOURCE_BUSY;
-
-		request_resource(&iomem_resource, rom_resources + roms);
-	}
-}
-
-static inline void request_graphics_resource(void)
-{
-	request_resource(&iomem_resource, &vram_resource);
-}
-
-#endif /* !_MACH_RESOURCES_H */
--- diff/include/asm-i386/mach-pc9800/mach_resources.h	2003-05-21 11:50:10.000000000 +0100
+++ source/include/asm-i386/mach-pc9800/mach_resources.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,191 +0,0 @@
-/*
- *  include/asm-i386/mach-pc9800/mach_resources.h
- *
- *  Machine specific resource allocation for PC-9800.
- *  Written by Osamu Tomita <tomita@cinet.co.jp>
- */
-#ifndef _MACH_RESOURCES_H
-#define _MACH_RESOURCES_H
-
-static char str_pic1[] = "pic1";
-static char str_dma[] = "dma";
-static char str_pic2[] = "pic2";
-static char str_calender_clock[] = "calender clock";
-static char str_system[] = "system";
-static char str_nmi_control[] = "nmi control";
-static char str_kanji_rom[] = "kanji rom";
-static char str_keyboard[] = "keyboard";
-static char str_text_gdc[] = "text gdc";
-static char str_crtc[] = "crtc";
-static char str_timer[] = "timer";
-static char str_graphic_gdc[] = "graphic gdc";
-static char str_dma_ex_bank[] = "dma ex. bank";
-static char str_beep_freq[] = "beep freq.";
-static char str_mouse_pio[] = "mouse pio";
-struct resource standard_io_resources[] = {
-	{ str_pic1, 0x00, 0x00, IORESOURCE_BUSY },
-	{ str_dma, 0x01, 0x01, IORESOURCE_BUSY },
-	{ str_pic1, 0x02, 0x02, IORESOURCE_BUSY },
-	{ str_dma, 0x03, 0x03, IORESOURCE_BUSY },
-	{ str_dma, 0x05, 0x05, IORESOURCE_BUSY },
-	{ str_dma, 0x07, 0x07, IORESOURCE_BUSY },
-	{ str_pic2, 0x08, 0x08, IORESOURCE_BUSY },
-	{ str_dma, 0x09, 0x09, IORESOURCE_BUSY },
-	{ str_pic2, 0x0a, 0x0a, IORESOURCE_BUSY },
-	{ str_dma, 0x0b, 0x0b, IORESOURCE_BUSY },
-	{ str_dma, 0x0d, 0x0d, IORESOURCE_BUSY },
-	{ str_dma, 0x0f, 0x0f, IORESOURCE_BUSY },
-	{ str_dma, 0x11, 0x11, IORESOURCE_BUSY },
-	{ str_dma, 0x13, 0x13, IORESOURCE_BUSY },
-	{ str_dma, 0x15, 0x15, IORESOURCE_BUSY },
-	{ str_dma, 0x17, 0x17, IORESOURCE_BUSY },
-	{ str_dma, 0x19, 0x19, IORESOURCE_BUSY },
-	{ str_dma, 0x1b, 0x1b, IORESOURCE_BUSY },
-	{ str_dma, 0x1d, 0x1d, IORESOURCE_BUSY },
-	{ str_dma, 0x1f, 0x1f, IORESOURCE_BUSY },
-	{ str_calender_clock, 0x20, 0x20, 0 },
-	{ str_dma, 0x21, 0x21, IORESOURCE_BUSY },
-	{ str_calender_clock, 0x22, 0x22, 0 },
-	{ str_dma, 0x23, 0x23, IORESOURCE_BUSY },
-	{ str_dma, 0x25, 0x25, IORESOURCE_BUSY },
-	{ str_dma, 0x27, 0x27, IORESOURCE_BUSY },
-	{ str_dma, 0x29, 0x29, IORESOURCE_BUSY },
-	{ str_dma, 0x2b, 0x2b, IORESOURCE_BUSY },
-	{ str_dma, 0x2d, 0x2d, IORESOURCE_BUSY },
-	{ str_system, 0x31, 0x31, IORESOURCE_BUSY },
-	{ str_system, 0x33, 0x33, IORESOURCE_BUSY },
-	{ str_system, 0x35, 0x35, IORESOURCE_BUSY },
-	{ str_system, 0x37, 0x37, IORESOURCE_BUSY },
-	{ str_nmi_control, 0x50, 0x50, IORESOURCE_BUSY },
-	{ str_nmi_control, 0x52, 0x52, IORESOURCE_BUSY },
-	{ "time stamp", 0x5c, 0x5f, IORESOURCE_BUSY },
-	{ str_kanji_rom, 0xa1, 0xa1, IORESOURCE_BUSY },
-	{ str_kanji_rom, 0xa3, 0xa3, IORESOURCE_BUSY },
-	{ str_kanji_rom, 0xa5, 0xa5, IORESOURCE_BUSY },
-	{ str_kanji_rom, 0xa7, 0xa7, IORESOURCE_BUSY },
-	{ str_kanji_rom, 0xa9, 0xa9, IORESOURCE_BUSY },
-	{ str_keyboard, 0x41, 0x41, IORESOURCE_BUSY },
-	{ str_keyboard, 0x43, 0x43, IORESOURCE_BUSY },
-	{ str_text_gdc, 0x60, 0x60, IORESOURCE_BUSY },
-	{ str_text_gdc, 0x62, 0x62, IORESOURCE_BUSY },
-	{ str_text_gdc, 0x64, 0x64, IORESOURCE_BUSY },
-	{ str_text_gdc, 0x66, 0x66, IORESOURCE_BUSY },
-	{ str_text_gdc, 0x68, 0x68, IORESOURCE_BUSY },
-	{ str_text_gdc, 0x6a, 0x6a, IORESOURCE_BUSY },
-	{ str_text_gdc, 0x6c, 0x6c, IORESOURCE_BUSY },
-	{ str_text_gdc, 0x6e, 0x6e, IORESOURCE_BUSY },
-	{ str_crtc, 0x70, 0x70, IORESOURCE_BUSY },
-	{ str_crtc, 0x72, 0x72, IORESOURCE_BUSY },
-	{ str_crtc, 0x74, 0x74, IORESOURCE_BUSY },
-	{ str_crtc, 0x74, 0x74, IORESOURCE_BUSY },
-	{ str_crtc, 0x76, 0x76, IORESOURCE_BUSY },
-	{ str_crtc, 0x78, 0x78, IORESOURCE_BUSY },
-	{ str_crtc, 0x7a, 0x7a, IORESOURCE_BUSY },
-	{ str_timer, 0x71, 0x71, IORESOURCE_BUSY },
-	{ str_timer, 0x73, 0x73, IORESOURCE_BUSY },
-	{ str_timer, 0x75, 0x75, IORESOURCE_BUSY },
-	{ str_timer, 0x77, 0x77, IORESOURCE_BUSY },
-	{ str_graphic_gdc, 0xa0, 0xa0, IORESOURCE_BUSY },
-	{ str_graphic_gdc, 0xa2, 0xa2, IORESOURCE_BUSY },
-	{ str_graphic_gdc, 0xa4, 0xa4, IORESOURCE_BUSY },
-	{ str_graphic_gdc, 0xa6, 0xa6, IORESOURCE_BUSY },
-	{ "cpu", 0xf0, 0xf7, IORESOURCE_BUSY },
-	{ "fpu", 0xf8, 0xff, IORESOURCE_BUSY },
-	{ str_dma_ex_bank, 0x0e05, 0x0e05, 0 },
-	{ str_dma_ex_bank, 0x0e07, 0x0e07, 0 },
-	{ str_dma_ex_bank, 0x0e09, 0x0e09, 0 },
-	{ str_dma_ex_bank, 0x0e0b, 0x0e0b, 0 },
-	{ str_beep_freq, 0x3fd9, 0x3fd9, IORESOURCE_BUSY },
-	{ str_beep_freq, 0x3fdb, 0x3fdb, IORESOURCE_BUSY },
-	{ str_beep_freq, 0x3fdd, 0x3fdd, IORESOURCE_BUSY },
-	{ str_beep_freq, 0x3fdf, 0x3fdf, IORESOURCE_BUSY },
-	/* All PC-9800 have (exactly) one mouse interface.  */
-	{ str_mouse_pio, 0x7fd9, 0x7fd9, 0 },
-	{ str_mouse_pio, 0x7fdb, 0x7fdb, 0 },
-	{ str_mouse_pio, 0x7fdd, 0x7fdd, 0 },
-	{ str_mouse_pio, 0x7fdf, 0x7fdf, 0 },
-	{ "mouse timer", 0xbfdb, 0xbfdb, 0 },
-	{ "mouse irq", 0x98d7, 0x98d7, 0 },
-};
-
-#define STANDARD_IO_RESOURCES (sizeof(standard_io_resources)/sizeof(struct resource))
-
-static struct resource tvram_resource = { "Text VRAM/CG window", 0xa0000, 0xa4fff, IORESOURCE_BUSY };
-static struct resource gvram_brg_resource = { "Graphic VRAM (B/R/G)", 0xa8000, 0xbffff, IORESOURCE_BUSY };
-static struct resource gvram_e_resource = { "Graphic VRAM (E)", 0xe0000, 0xe7fff, IORESOURCE_BUSY };
-
-/* System ROM resources */
-#define MAXROMS 6
-static struct resource rom_resources[MAXROMS] = {
-	{ "System ROM", 0xe8000, 0xfffff, IORESOURCE_BUSY }
-};
-
-static inline void probe_video_rom(int roms)
-{
-	/* PC-9800 has no video ROM */
-}
-
-static inline void probe_extension_roms(int roms)
-{
-	int i;
-	__u8 *xrom_id;
-
-	xrom_id = (__u8 *) isa_bus_to_virt(PC9800SCA_XROM_ID + 0x10);
-
-	for (i = 0; i < 16; i++) {
-		if (xrom_id[i] & 0x80) {
-			int j;
-
-			for (j = i + 1; j < 16 && (xrom_id[j] & 0x80); j++)
-				;
-			rom_resources[roms].start = 0x0d0000 + i * 0x001000;
-			rom_resources[roms].end = 0x0d0000 + j * 0x001000 - 1;
-			rom_resources[roms].name = "Extension ROM";
-			rom_resources[roms].flags = IORESOURCE_BUSY;
-
-			request_resource(&iomem_resource,
-					  rom_resources + roms);
-			if (++roms >= MAXROMS)
-				return;
-		}
-	}
-}
-
-static inline void request_graphics_resource(void)
-{
-	int i;
-
-	if (PC9800_HIGHRESO_P()) {
-		tvram_resource.start = 0xe0000;
-		tvram_resource.end   = 0xe4fff;
-		gvram_brg_resource.name  = "Graphic VRAM";
-		gvram_brg_resource.start = 0xc0000;
-		gvram_brg_resource.end   = 0xdffff;
-	}
-
-	request_resource(&iomem_resource, &tvram_resource);
-	request_resource(&iomem_resource, &gvram_brg_resource);
-	if (!PC9800_HIGHRESO_P())
-		request_resource(&iomem_resource, &gvram_e_resource);
-
-	if (PC9800_HIGHRESO_P() || PC9800_9821_P()) {
-		static char graphics[] = "graphics";
-		static struct resource graphics_resources[] = {
-			{ graphics, 0x9a0, 0x9a0, 0 },
-			{ graphics, 0x9a2, 0x9a2, 0 },
-			{ graphics, 0x9a4, 0x9a4, 0 },
-			{ graphics, 0x9a6, 0x9a6, 0 },
-			{ graphics, 0x9a8, 0x9a8, 0 },
-			{ graphics, 0x9aa, 0x9aa, 0 },
-			{ graphics, 0x9ac, 0x9ac, 0 },
-			{ graphics, 0x9ae, 0x9ae, 0 },
-		};
-
-#define GRAPHICS_RESOURCES (sizeof(graphics_resources)/sizeof(struct resource))
-
-		for (i = 0; i < GRAPHICS_RESOURCES; i++)
-			request_resource(&ioport_resource, graphics_resources + i);
-	}
-}
-
-#endif /* !_MACH_RESOURCES_H */
--- diff/include/asm-mips/mach-au1x00/au1000_pcmcia.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/mach-au1x00/au1000_pcmcia.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,107 +0,0 @@
-/*
- * Alchemy Semi Au1000 pcmcia driver include file
- *
- * Copyright 2001 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *         	ppopov@mvista.com or source@mvista.com
- *
- *  This program is free software; you can distribute it and/or modify it
- *  under the terms of the GNU General Public License (Version 2) as
- *  published by the Free Software Foundation.
- *
- *  This program is distributed in the hope it will be useful, but WITHOUT
- *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- *  for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- */
-#ifndef __ASM_AU1000_PCMCIA_H
-#define __ASM_AU1000_PCMCIA_H
-
-#include <linux/config.h>
-
-#define AU1000_PCMCIA_POLL_PERIOD    (2*HZ)
-#define AU1000_PCMCIA_IO_SPEED       (255)
-#define AU1000_PCMCIA_MEM_SPEED      (300)
-
-#define AU1X_SOCK0_IO        0xF00000000
-#define AU1X_SOCK0_PHYS_ATTR 0xF40000000
-#define AU1X_SOCK0_PHYS_MEM  0xF80000000
-
-/* pcmcia socket 1 needs external glue logic so the memory map
- * differs from board to board.
- */
-#if defined(CONFIG_MIPS_PB1000) || defined(CONFIG_MIPS_PB1100) || defined(CONFIG_MIPS_PB1500)
-#define AU1X_SOCK1_IO        0xF08000000
-#define AU1X_SOCK1_PHYS_ATTR 0xF48000000
-#define AU1X_SOCK1_PHYS_MEM  0xF88000000
-#elif defined(CONFIG_MIPS_DB1000) || defined(CONFIG_MIPS_DB1100) || defined(CONFIG_MIPS_DB1500)
-#define AU1X_SOCK1_IO        0xF04000000
-#define AU1X_SOCK1_PHYS_ATTR 0xF44000000
-#define AU1X_SOCK1_PHYS_MEM  0xF84000000
-#endif
-
-struct pcmcia_state {
-  unsigned detect: 1,
-            ready: 1,
-           wrprot: 1,
-	     bvd1: 1,
-	     bvd2: 1,
-            vs_3v: 1,
-            vs_Xv: 1;
-};
-
-struct pcmcia_configure {
-  unsigned sock: 8,
-            vcc: 8,
-            vpp: 8,
-         output: 1,
-        speaker: 1,
-          reset: 1;
-};
-
-struct pcmcia_irq_info {
-	unsigned int sock;
-	unsigned int irq;
-};
-
-
-struct au1000_pcmcia_socket {
-	socket_state_t        cs_state;
-	struct pcmcia_state   k_state;
-	unsigned int          irq;
-	void                  (*handler)(void *, unsigned int);
-	void                  *handler_info;
-	pccard_io_map         io_map[MAX_IO_WIN];
-	pccard_mem_map        mem_map[MAX_WIN];
-	u32                   virt_io;
-	ioaddr_t              phys_attr, phys_mem;
-	unsigned short        speed_io, speed_attr, speed_mem;
-};
-
-struct pcmcia_init {
-	void (*handler)(int irq, void *dev, struct pt_regs *regs);
-};
-
-struct pcmcia_low_level {
-	int (*init)(struct pcmcia_init *);
-	int (*shutdown)(void);
-	int (*socket_state)(unsigned sock, struct pcmcia_state *);
-	int (*get_irq_info)(struct pcmcia_irq_info *);
-	int (*configure_socket)(const struct pcmcia_configure *);
-};
-
-#if defined(CONFIG_MIPS_PB1000) || defined(CONFIG_MIPS_PB1100) || defined(CONFIG_MIPS_PB1500)
-extern struct pcmcia_low_level pb1x00_pcmcia_ops;
-#elif defined(CONFIG_MIPS_DB1000) || defined(CONFIG_MIPS_DB1100) || defined(CONFIG_MIPS_DB1500)
-extern struct pcmcia_low_level db1x00_pcmcia_ops;
-#elif defined(CONFIG_MIPS_XXS1500)
-extern struct pcmcia_low_level xxs1500_pcmcia_ops;
-#else
-error unknown Au1000 board
-#endif
-
-#endif /* __ASM_AU1000_PCMCIA_H */
--- diff/include/asm-mips/mv64340_dep.h	2003-07-08 09:55:19.000000000 +0100
+++ source/include/asm-mips/mv64340_dep.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,51 +0,0 @@
-/*
- * Copyright 2002 Momentum Computer Inc.
- * Author: Matthew Dharm <mdharm@momenco.com>
- *
- * include/asm-mips/mv64340-dep.h
- *     Board-dependent definitions for MV-64340 chip.
- *
- * This program is free software; you can redistribute  it and/or modify it
- * under  the terms of  the GNU General  Public License as published by the
- * Free Software Foundation;  either version 2 of the  License, or (at your
- * option) any later version.
- */
-
-#ifndef __MV64340_DEP_H__
-#define __MV64340_DEP_H__
-
-#include <asm/addrspace.h>		/* for KSEG1ADDR() */
-#include <asm/byteorder.h>		/* for cpu_to_le32() */
-
-extern unsigned long mv64340_base;
-
-#define MV64340_BASE       (mv64340_base)
-
-/*
- * Because of an error/peculiarity in the Galileo chip, we need to swap the
- * bytes when running bigendian.
- */
-
-#define MV_WRITE(ofs, data)  \
-        *(volatile u32 *)(MV64340_BASE+(ofs)) = cpu_to_le32(data)
-#define MV_READ(ofs, data)   \
-        *(data) = le32_to_cpu(*(volatile u32 *)(MV64340_BASE+(ofs)))
-#define MV_READ_DATA(ofs)    \
-        le32_to_cpu(*(volatile u32 *)(MV64340_BASE+(ofs)))
-
-#define MV_WRITE_16(ofs, data)  \
-        *(volatile u16 *)(MV64340_BASE+(ofs)) = cpu_to_le16(data)
-#define MV_READ_16(ofs, data)   \
-        *(data) = le16_to_cpu(*(volatile u16 *)(MV64340_BASE+(ofs)))
-
-#define MV_WRITE_8(ofs, data)  \
-        *(volatile u8 *)(MV64340_BASE+(ofs)) = data
-#define MV_READ_8(ofs, data)   \
-        *(data) = *(volatile u8 *)(MV64340_BASE+(ofs))
-
-#define MV_SET_REG_BITS(ofs,bits) \
-	(*((volatile u32 *)(MV64340_BASE+(ofs)))) |= ((u32)cpu_to_le32(bits))
-#define MV_RESET_REG_BITS(ofs,bits) \
-	(*((volatile u32 *)(MV64340_BASE+(ofs)))) &= ~((u32)cpu_to_le32(bits))
-
-#endif
--- diff/include/asm-mips/page-32.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/page-32.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,23 +0,0 @@
-/*
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 1994 - 1999, 2000, 03 Ralf Baechle
- * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
- */
-#ifndef _ASM_PAGE_32_H
-#define _ASM_PAGE_32_H
-
-/*
- * This handles the memory map.
- * We handle pages at KSEG0 for kernels with 32 bit address space.
- */
-#define PAGE_OFFSET		0x80000000UL
-
-/*
- * Memory above this physical address will be considered highmem.
- */
-#define HIGHMEM_START		0x20000000UL
-
-#endif /* _ASM_PAGE_32_H */
--- diff/include/asm-mips/page-64.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/page-64.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,30 +0,0 @@
-/*
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 1994 - 1999, 2000, 03 Ralf Baechle
- * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
- */
-#ifndef _ASM_PAGE_64_H
-#define _ASM_PAGE_64_H
-
-#include <linux/config.h>
-
-/*
- * This handles the memory map.
- */
-#ifdef CONFIG_DMA_NONCOHERENT
-#define PAGE_OFFSET	0x9800000000000000UL
-#else
-#define PAGE_OFFSET	0xa800000000000000UL
-#endif
-
-/*
- * Memory above this physical address will be considered highmem.
- * Fixme: 59 bits is a fictive number and makes assumptions about processors
- * in the distant future.  Nobody will care for a few years :-)
- */
-#define HIGHMEM_START		(1UL << 59UL)
-
-#endif /* _ASM_PAGE_64_H */
--- diff/include/asm-mips/sn/intr_public.h	2004-03-11 10:20:28.000000000 +0000
+++ source/include/asm-mips/sn/intr_public.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,31 +0,0 @@
-/*
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 1992 - 1997 Silicon Graphics, Inc.
- */
-#ifndef __ASM_SN_INTR_PUBLIC_H
-#define __ASM_SN_INTR_PUBLIC_H
-
-#include <asm/sn/arch.h>
-
-/*
- * The following are necessary to create the illusion of a CEL on the SN0 hub.
- * We'll add more priority levels soon, but for now, any interrupt in a
- * particular band effectively does an spl.  These must be in the PDA since
- * they're different for each processor.  Users of this structure must hold the
- * vector_lock in the appropriate vector block before modifying the mask arrays.
- * There's only one vector block for each Hub so a lock in the PDA wouldn't be
- * adequate.
- */
-struct hub_intmasks_s {
-	/*
-	 * The masks are stored with the lowest-priority (most inclusive)
-	 * in the lowest-numbered masks (i.e., 0, 1, 2...).
-	 */
-	hubreg_t	intpend0_masks;		/* INT_PEND0 */
-	hubreg_t	intpend1_masks;		/* INT_PEND1 */
-};
-
-#endif /* __ASM_SN_INTR_PUBLIC_H */
--- diff/include/linux/rmap-locking.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/linux/rmap-locking.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,23 +0,0 @@
-/*
- * include/linux/rmap-locking.h
- *
- * Locking primitives for exclusive access to a page's reverse-mapping
- * pte chain.
- */
-
-#include <linux/slab.h>
-
-struct pte_chain;
-extern kmem_cache_t *pte_chain_cache;
-
-#define pte_chain_lock(page)	bit_spin_lock(PG_chainlock, (unsigned long *)&page->flags)
-#define pte_chain_unlock(page)	bit_spin_unlock(PG_chainlock, (unsigned long *)&page->flags)
-
-struct pte_chain *pte_chain_alloc(int gfp_flags);
-void __pte_chain_free(struct pte_chain *pte_chain);
-
-static inline void pte_chain_free(struct pte_chain *pte_chain)
-{
-	if (pte_chain)
-		__pte_chain_free(pte_chain);
-}
--- diff/include/linux/sunrpc/name_lookup.h	2002-10-16 04:27:08.000000000 +0100
+++ source/include/linux/sunrpc/name_lookup.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,38 +0,0 @@
-
-/*
- * map between user/group name and id for a given 'client' 
- */
-
-struct name_ent {
-	char name[20];
-};
-static inline int name_get_user(int uid, struct name_ent **namep)
-{
-	struct name_ent *n = kmalloc(sizeof(*n),GFP_KERNEL);
-	if (n) sprintf(n->name, "%d",uid);
-	*namep = n;
-	return n ? 0 : -ENOMEM;
-}
-static inline int name_get_group(int uid, struct name_ent **namep)
-{
-	struct name_ent *n = kmalloc(sizeof(*n),GFP_KERNEL);
-	if (n) sprintf(n->name, "%d",uid);
-	*namep = n;
-	return n ? 0 : -ENOMEM;
-}
-static inline int name_get_uid(char *name, int name_len, int *uidp)
-{
-	*uidp = simple_strtoul(name, NULL, 0);
-	return 0;
-}
-
-static inline int name_get_gid(char *name, int name_len, int *gidp)
-{
-	*gidp = simple_strtoul(name, NULL, 0);
-	return 0;
-}
-
-static inline void name_put(struct name_ent *ent) 
-{
-	kfree(ent);
-}
--- diff/include/net/irda/ali-ircc.h	2004-03-11 10:20:29.000000000 +0000
+++ source/include/net/irda/ali-ircc.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,228 +0,0 @@
-/*********************************************************************
- *                
- * Filename:      ali-ircc.h
- * Version:       0.5
- * Description:   Driver for the ALI M1535D and M1543C FIR Controller
- * Status:        Experimental.
- * Author:        Benjamin Kong <benjamin_kong@ali.com.tw>
- * Created at:    2000/10/16 03:46PM
- * Modified at:   2001/1/3 02:56PM
- * Modified by:   Benjamin Kong <benjamin_kong@ali.com.tw>
- * 
- *     Copyright (c) 2000 Benjamin Kong <benjamin_kong@ali.com.tw>
- *     All Rights Reserved
- *      
- *     This program is free software; you can redistribute it and/or 
- *     modify it under the terms of the GNU General Public License as 
- *     published by the Free Software Foundation; either version 2 of 
- *     the License, or (at your option) any later version.
- *  
- ********************************************************************/
-
-#ifndef ALI_IRCC_H
-#define ALI_IRCC_H
-
-#include <linux/time.h>
-
-#include <linux/spinlock.h>
-#include <linux/pm.h>
-#include <asm/io.h>
-
-/* SIR Register */
-/* Usr definition of linux/serial_reg.h */
-
-/* FIR Register */
-#define BANK0		0x20
-#define BANK1		0x21
-#define BANK2		0x22
-#define BANK3		0x23
-
-#define FIR_MCR		0x07	/* Master Control Register */
-
-/* Bank 0 */
-#define FIR_DR		0x00	/* Alias 0, FIR Data Register (R/W) */ 
-#define FIR_IER		0x01	/* Alias 1, FIR Interrupt Enable Register (R/W) */
-#define FIR_IIR		0x02	/* Alias 2, FIR Interrupt Identification Register (Read only) */
-#define FIR_LCR_A	0x03	/* Alias 3, FIR Line Control Register A (R/W) */
-#define FIR_LCR_B	0x04	/* Alias 4, FIR Line Control Register B (R/W) */
-#define FIR_LSR		0x05	/* Alias 5, FIR Line Status Register (R/W) */
-#define FIR_BSR		0x06	/* Alias 6, FIR Bus Status Register (Read only) */
-
-
-	/* Alias 1 */
-	#define	IER_FIFO	0x10	/* FIR FIFO Interrupt Enable */	
-	#define	IER_TIMER	0x20 	/* Timer Interrupt Enable */ 
-	#define	IER_EOM		0x40	/* End of Message Interrupt Enable */
-	#define IER_ACT		0x80	/* Active Frame Interrupt Enable */
-	
-	/* Alias 2 */
-	#define IIR_FIFO	0x10	/* FIR FIFO Interrupt */
-	#define IIR_TIMER	0x20	/* Timer Interrupt */
-	#define IIR_EOM		0x40	/* End of Message Interrupt */
-	#define IIR_ACT		0x80	/* Active Frame Interrupt */	
-	
-	/* Alias 3 */
-	#define LCR_A_FIFO_RESET 0x80	/* FIFO Reset */
-
-	/* Alias 4 */
-	#define	LCR_B_BW	0x10	/* Brick Wall */
-	#define LCR_B_SIP	0x20	/* SIP Enable */
-	#define	LCR_B_TX_MODE 	0x40	/* Transmit Mode */
-	#define LCR_B_RX_MODE	0x80	/* Receive Mode */
-	
-	/* Alias 5 */	
-	#define LSR_FIR_LSA	0x00	/* FIR Line Status Address */
-	#define LSR_FRAME_ABORT	0x08	/* Frame Abort */
-	#define LSR_CRC_ERROR	0x10	/* CRC Error */
-	#define LSR_SIZE_ERROR	0x20	/* Size Error */
-	#define LSR_FRAME_ERROR	0x40	/* Frame Error */
-	#define LSR_FIFO_UR	0x80	/* FIFO Underrun */
-	#define LSR_FIFO_OR	0x80	/* FIFO Overrun */
-		
-	/* Alias 6 */
-	#define BSR_FIFO_NOT_EMPTY	0x80	/* FIFO Not Empty */
-	
-/* Bank 1 */
-#define	FIR_CR		0x00 	/* Alias 0, FIR Configuration Register (R/W) */
-#define FIR_FIFO_TR	0x01   	/* Alias 1, FIR FIFO Threshold Register (R/W) */
-#define FIR_DMA_TR	0x02	/* Alias 2, FIR DMA Threshold Register (R/W) */
-#define FIR_TIMER_IIR	0x03	/* Alias 3, FIR Timer interrupt interval register (W/O) */
-#define FIR_FIFO_FR	0x03	/* Alias 3, FIR FIFO Flag register (R/O) */
-#define FIR_FIFO_RAR	0x04 	/* Alias 4, FIR FIFO Read Address register (R/O) */
-#define FIR_FIFO_WAR	0x05	/* Alias 5, FIR FIFO Write Address register (R/O) */
-#define FIR_TR		0x06	/* Alias 6, Test REgister (W/O) */
-
-	/* Alias 0 */
-	#define CR_DMA_EN	0x01	/* DMA Enable */
-	#define CR_DMA_BURST	0x02	/* DMA Burst Mode */
-	#define CR_TIMER_EN 	0x08	/* Timer Enable */
-	
-	/* Alias 3 */
-	#define TIMER_IIR_500	0x00	/* 500 us */
-	#define TIMER_IIR_1ms	0x01	/* 1   ms */
-	#define TIMER_IIR_2ms	0x02	/* 2   ms */
-	#define TIMER_IIR_4ms	0x03	/* 4   ms */
-	
-/* Bank 2 */
-#define FIR_IRDA_CR	0x00	/* Alias 0, IrDA Control Register (R/W) */
-#define FIR_BOF_CR	0x01	/* Alias 1, BOF Count Register (R/W) */
-#define FIR_BW_CR	0x02	/* Alias 2, Brick Wall Count Register (R/W) */
-#define FIR_TX_DSR_HI	0x03	/* Alias 3, TX Data Size Register (high) (R/W) */
-#define FIR_TX_DSR_LO	0x04	/* Alias 4, TX Data Size Register (low) (R/W) */
-#define FIR_RX_DSR_HI	0x05	/* Alias 5, RX Data Size Register (high) (R/W) */
-#define FIR_RX_DSR_LO	0x06	/* Alias 6, RX Data Size Register (low) (R/W) */
-	
-	/* Alias 0 */
-	#define IRDA_CR_HDLC1152 0x80	/* 1.152Mbps HDLC Select */
-	#define IRDA_CR_CRC	0X40	/* CRC Select. */
-	#define IRDA_CR_HDLC	0x20	/* HDLC select. */
-	#define IRDA_CR_HP_MODE 0x10	/* HP mode (read only) */
-	#define IRDA_CR_SD_ST	0x08	/* SD/MODE State.  */
-	#define IRDA_CR_FIR_SIN 0x04	/* FIR SIN Select. */
-	#define IRDA_CR_ITTX_0	0x02	/* SOUT State. IRTX force to 0 */
-	#define IRDA_CR_ITTX_1	0x03	/* SOUT State. IRTX force to 1 */
-	
-/* Bank 3 */
-#define FIR_ID_VR	0x00	/* Alias 0, FIR ID Version Register (R/O) */
-#define FIR_MODULE_CR	0x01	/* Alias 1, FIR Module Control Register (R/W) */
-#define FIR_IO_BASE_HI	0x02	/* Alias 2, FIR Higher I/O Base Address Register (R/O) */
-#define FIR_IO_BASE_LO	0x03	/* Alias 3, FIR Lower I/O Base Address Register (R/O) */
-#define FIR_IRQ_CR	0x04	/* Alias 4, FIR IRQ Channel Register (R/O) */
-#define FIR_DMA_CR	0x05	/* Alias 5, FIR DMA Channel Register (R/O) */
-
-struct ali_chip {
-	char *name;
-	int cfg[2];
-	unsigned char entr1;
-	unsigned char entr2;
-	unsigned char cid_index;
-	unsigned char cid_value;
-	int (*probe)(struct ali_chip *chip, chipio_t *info);
-	int (*init)(struct ali_chip *chip, chipio_t *info); 
-};
-typedef struct ali_chip ali_chip_t;
-
-
-/* DMA modes needed */
-#define DMA_TX_MODE     0x08    /* Mem to I/O, ++, demand. */
-#define DMA_RX_MODE     0x04    /* I/O to mem, ++, demand. */
-
-#define MAX_TX_WINDOW 	7
-#define MAX_RX_WINDOW 	7
-
-#define TX_FIFO_Threshold	8
-#define RX_FIFO_Threshold	1
-#define TX_DMA_Threshold	1
-#define RX_DMA_Threshold	1
-
-/* For storing entries in the status FIFO */
-
-struct st_fifo_entry {
-	int status;
-	int len;
-};
-
-struct st_fifo {
-	struct st_fifo_entry entries[MAX_RX_WINDOW];
-	int pending_bytes;
-	int head;
-	int tail;
-	int len;
-};
-
-struct frame_cb {
-	void *start; /* Start of frame in DMA mem */
-	int len;     /* Lenght of frame in DMA mem */
-};
-
-struct tx_fifo {
-	struct frame_cb queue[MAX_TX_WINDOW]; /* Info about frames in queue */
-	int             ptr;                  /* Currently being sent */
-	int             len;                  /* Lenght of queue */
-	int             free;                 /* Next free slot */
-	void           *tail;                 /* Next free start in DMA mem */
-};
-
-/* Private data for each instance */
-struct ali_ircc_cb {
-
-	struct st_fifo st_fifo;    /* Info about received frames */
-	struct tx_fifo tx_fifo;    /* Info about frames to be transmitted */
-
-	struct net_device *netdev;     /* Yes! we are some kind of netdevice */
-	struct net_device_stats stats;
-	
-	struct irlap_cb *irlap;    /* The link layer we are binded to */
-	struct qos_info qos;       /* QoS capabilities for this device */
-	
-	chipio_t io;               /* IrDA controller information */
-	iobuff_t tx_buff;          /* Transmit buffer */
-	iobuff_t rx_buff;          /* Receive buffer */
-
-	__u8 ier;                  /* Interrupt enable register */
-	
-	__u8 InterruptID;	   /* Interrupt ID */	
-	__u8 BusStatus;		   /* Bus Status */	
-	__u8 LineStatus;	   /* Line Status */	
-	
-	unsigned char rcvFramesOverflow;
-		
-	struct timeval stamp;
-	struct timeval now;
-
-	spinlock_t lock;           /* For serializing operations */
-	
-	__u32 new_speed;
-	int index;                 /* Instance index */
-	
-	unsigned char fifo_opti_buf;
-
-        struct pm_dev *dev;
-};
-
-static inline void switch_bank(int iobase, int bank)
-{
-		outb(bank, iobase+FIR_MCR);
-}
-
-#endif /* ALI_IRCC_H */
--- diff/include/net/irda/au1000_ircc.h	2004-03-11 10:20:29.000000000 +0000
+++ source/include/net/irda/au1000_ircc.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,127 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *	Au1000 IrDA driver.
- *
- * Copyright 2001 MontaVista Software Inc.
- * Author: MontaVista Software, Inc.
- *         	ppopov@mvista.com or source@mvista.com
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#ifndef AU1000_IRCC_H
-#define AU1000_IRCC_H
-
-#include <linux/time.h>
-
-#include <linux/spinlock.h>
-#include <linux/pm.h>
-#include <asm/io.h>
-
-#define NUM_IR_IFF          1
-#define NUM_IR_DESC        64
-#define RING_SIZE_4       0x0
-#define RING_SIZE_16      0x3
-#define RING_SIZE_64      0xF
-#define MAX_NUM_IR_DESC    64
-#define MAX_BUF_SIZE     2048
-
-#define BPS_115200          0
-#define BPS_57600           1
-#define BPS_38400           2
-#define BPS_19200           5
-#define BPS_9600           11
-#define BPS_2400           47
-
-/* Ring descriptor flags */
-#define AU_OWN           (1<<7) /* tx,rx */
-
-#define IR_DIS_CRC       (1<<6) /* tx */
-#define IR_BAD_CRC       (1<<5) /* tx */
-#define IR_NEED_PULSE    (1<<4) /* tx */
-#define IR_FORCE_UNDER   (1<<3) /* tx */
-#define IR_DISABLE_TX    (1<<2) /* tx */
-#define IR_HW_UNDER      (1<<0) /* tx */
-#define IR_TX_ERROR      (IR_DIS_CRC|IR_BAD_CRC|IR_HW_UNDER)
-
-#define IR_PHY_ERROR     (1<<6) /* rx */
-#define IR_CRC_ERROR     (1<<5) /* rx */
-#define IR_MAX_LEN       (1<<4) /* rx */
-#define IR_FIFO_OVER     (1<<3) /* rx */
-#define IR_SIR_ERROR     (1<<2) /* rx */
-#define IR_RX_ERROR      (IR_PHY_ERROR|IR_CRC_ERROR| \
-		IR_MAX_LEN|IR_FIFO_OVER|IR_SIR_ERROR)
-
-typedef struct db_dest {
-	struct db_dest *pnext;
-	volatile u32 *vaddr;
-	dma_addr_t dma_addr;
-} db_dest_t;
-
-
-typedef struct ring_desc {
-	u8 count_0;               /* 7:0  */
-	u8 count_1;               /* 12:8 */
-	u8 reserved;
-	u8 flags;
-	u8 addr_0;                /* 7:0   */
-	u8 addr_1;                /* 15:8  */
-	u8 addr_2;                /* 23:16 */
-	u8 addr_3;                /* 31:24 */
-} ring_dest_t;
-
-
-/* Private data for each instance */
-struct au1k_private {
-
-	db_dest_t *pDBfree;
-	db_dest_t db[2*NUM_IR_DESC];
-	volatile ring_dest_t *rx_ring[NUM_IR_DESC];
-	volatile ring_dest_t *tx_ring[NUM_IR_DESC];
-	db_dest_t *rx_db_inuse[NUM_IR_DESC];
-	db_dest_t *tx_db_inuse[NUM_IR_DESC];
-	u32 rx_head;
-	u32 tx_head;
-	u32 tx_tail;
-	u32 tx_full;
-
-	iobuff_t rx_buff;
-
-	struct net_device *netdev;
-	struct net_device_stats stats;
-	
-	struct timeval stamp;
-	struct timeval now;
-	struct qos_info		qos;
-	struct irlap_cb		*irlap;
-	
-	u8 open;
-	u32 speed;
-	u32 newspeed;
-	
-	u32 intr_work_done; /* number of Rx and Tx pkts processed in the isr */
-	struct timer_list timer;
-
-	spinlock_t lock;           /* For serializing operations */
-        struct pm_dev *dev;
-};
-#endif /* AU1000_IRCC_H */
--- diff/include/net/irda/irda-usb.h	2004-03-11 10:20:29.000000000 +0000
+++ source/include/net/irda/irda-usb.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,163 +0,0 @@
-/*****************************************************************************
- *
- * Filename:      irda-usb.h
- * Version:       0.9b
- * Description:   IrDA-USB Driver
- * Status:        Experimental 
- * Author:        Dag Brattli <dag@brattli.net>
- *
- *	Copyright (C) 2001, Roman Weissgaerber <weissg@vienna.at>
- *      Copyright (C) 2000, Dag Brattli <dag@brattli.net>
- *      Copyright (C) 2001, Jean Tourrilhes <jt@hpl.hp.com>
- *          
- *	This program is free software; you can redistribute it and/or modify
- *	it under the terms of the GNU General Public License as published by
- *	the Free Software Foundation; either version 2 of the License, or
- *	(at your option) any later version.
- *
- *	This program is distributed in the hope that it will be useful,
- *	but WITHOUT ANY WARRANTY; without even the implied warranty of
- *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *	GNU General Public License for more details.
- *
- *	You should have received a copy of the GNU General Public License
- *	along with this program; if not, write to the Free Software
- *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *****************************************************************************/
-
-#include <linux/time.h>
-
-#include <net/irda/irda.h>
-#include <net/irda/irda_device.h>      /* struct irlap_cb */
-
-#define RX_COPY_THRESHOLD 200
-#define IRDA_USB_MAX_MTU 2051
-#define IRDA_USB_SPEED_MTU 64		/* Weird, but work like this */
-
-/* Maximum number of active URB on the Rx path
- * This is the amount of buffers the we keep between the USB harware and the
- * IrDA stack.
- *
- * Note : the network layer does also queue the packets between us and the
- * IrDA stack, and is actually pretty fast and efficient in doing that.
- * Therefore, we don't need to have a large number of URBs, and we can
- * perfectly live happy with only one. We certainly don't need to keep the
- * full IrTTP window around here...
- * I repeat for those who have trouble to understand : 1 URB is plenty
- * good enough to handle back-to-back (brickwalled) frames. I tried it,
- * it works (it's the hardware that has trouble doing it).
- *
- * Having 2 URBs would allow the USB stack to process one URB while we take
- * care of the other and then swap the URBs...
- * On the other hand, increasing the number of URB will have penalities
- * in term of latency and will interact with the link management in IrLAP...
- * Jean II */
-#define IU_MAX_ACTIVE_RX_URBS	1	/* Don't touch !!! */
-
-/* When a Rx URB is passed back to us, we can't reuse it immediately,
- * because it may still be referenced by the USB layer. Therefore we
- * need to keep one extra URB in the Rx path.
- * Jean II */
-#define IU_MAX_RX_URBS	(IU_MAX_ACTIVE_RX_URBS + 1)
-
-/* Various ugly stuff to try to workaround generic problems */
-/* Send speed command in case of timeout, just for trying to get things sane */
-#define IU_BUG_KICK_TIMEOUT
-/* Show the USB class descriptor */
-#undef IU_DUMP_CLASS_DESC 
-/* Assume a minimum round trip latency for USB transfer (in us)...
- * USB transfer are done in the next USB slot if there is no traffic
- * (1/19 msec) and is done at 12 Mb/s :
- * Waiting for slot + tx = (53us + 16us) * 2 = 137us minimum.
- * Rx notification will only be done at the end of the USB frame period :
- * OHCI : frame period = 1ms
- * UHCI : frame period = 1ms, but notification can take 2 or 3 ms :-(
- * EHCI : frame period = 125us */
-#define IU_USB_MIN_RTT		500	/* This should be safe in most cases */
-
-/* Inbound header */
-#define MEDIA_BUSY    0x80
-
-#define SPEED_2400    0x01
-#define SPEED_9600    0x02
-#define SPEED_19200   0x03
-#define SPEED_38400   0x04
-#define SPEED_57600   0x05
-#define SPEED_115200  0x06
-#define SPEED_576000  0x07
-#define SPEED_1152000 0x08
-#define SPEED_4000000 0x09
-
-/* Basic capabilities */
-#define IUC_DEFAULT	0x00	/* Basic device compliant with 1.0 spec */
-/* Main bugs */
-#define IUC_SPEED_BUG	0x01	/* Device doesn't set speed after the frame */
-#define IUC_NO_WINDOW	0x02	/* Device doesn't behave with big Rx window */
-#define IUC_NO_TURN	0x04	/* Device doesn't do turnaround by itself */
-/* Not currently used */
-#define IUC_SIR_ONLY	0x08	/* Device doesn't behave at FIR speeds */
-#define IUC_SMALL_PKT	0x10	/* Device doesn't behave with big Rx packets */
-#define IUC_MAX_WINDOW	0x20	/* Device underestimate the Rx window */
-#define IUC_MAX_XBOFS	0x40	/* Device need more xbofs than advertised */
-
-/* USB class definitions */
-#define USB_IRDA_HEADER   0x01
-#define USB_CLASS_IRDA    0x02 /* USB_CLASS_APP_SPEC subclass */ 
-#define USB_DT_IRDA       0x21
-
-struct irda_class_desc {
-	__u8  bLength;
-	__u8  bDescriptorType;
-	__u16 bcdSpecRevision;
-	__u8  bmDataSize;
-	__u8  bmWindowSize;
-	__u8  bmMinTurnaroundTime;
-	__u16 wBaudRate;
-	__u8  bmAdditionalBOFs;
-	__u8  bIrdaRateSniff;
-	__u8  bMaxUnicastList;
-} __attribute__ ((packed));
-
-/* class specific interface request to get the IrDA-USB class descriptor
- * (6.2.5, USB-IrDA class spec 1.0) */
-
-#define IU_REQ_GET_CLASS_DESC	0x06
-
-struct irda_usb_cb {
-	struct irda_class_desc *irda_desc;
-	struct usb_device *usbdev;	/* init: probe_irda */
-	struct usb_interface *usbintf;	/* init: probe_irda */
-	int netopen;			/* Device is active for network */
-	int present;			/* Device is present on the bus */
-	__u32 capability;		/* Capability of the hardware */
-	__u8  bulk_in_ep;		/* Rx Endpoint assignments */
-	__u8  bulk_out_ep;		/* Tx Endpoint assignments */
-	__u16 bulk_out_mtu;		/* Max Tx packet size in bytes */
-	__u8  bulk_int_ep;		/* Interrupt Endpoint assignments */
-
-	wait_queue_head_t wait_q;	/* for timeouts */
-
-	struct urb *rx_urb[IU_MAX_RX_URBS];	/* URBs used to receive data frames */
-	struct urb *idle_rx_urb;	/* Pointer to idle URB in Rx path */
-	struct urb *tx_urb;		/* URB used to send data frames */
-	struct urb *speed_urb;		/* URB used to send speed commands */
-	
-	struct net_device *netdev;	/* Yes! we are some kind of netdev. */
-	struct net_device_stats stats;
-	struct irlap_cb   *irlap;	/* The link layer we are binded to */
-	struct qos_info qos;
-	hashbin_t *tx_list;		/* Queued transmit skb's */
-	char *speed_buff;		/* Buffer for speed changes */
-
-	struct timeval stamp;
-	struct timeval now;
-
-	spinlock_t lock;		/* For serializing operations */
-
-	__u16 xbofs;			/* Current xbofs setting */
-	__s16 new_xbofs;		/* xbofs we need to set */
-	__u32 speed;			/* Current speed */
-	__s32 new_speed;		/* speed we need to set */
-};
-
--- diff/include/net/irda/irport.h	2003-06-09 14:18:20.000000000 +0100
+++ source/include/net/irda/irport.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,90 +0,0 @@
-/*********************************************************************
- *                
- * Filename:      irport.h
- * Version:       0.1
- * Description:   Serial driver for IrDA
- * Status:        Experimental.
- * Author:        Dag Brattli <dagb@cs.uit.no>
- * Created at:    Sun Aug  3 13:49:59 1997
- * Modified at:   Fri Jan 14 10:21:10 2000
- * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
- *     Copyright (c) 1997, 1998-2000 Dag Brattli <dagb@cs.uit.no>
- *     All Rights Reserved.
- *     
- *     This program is free software; you can redistribute it and/or 
- *     modify it under the terms of the GNU General Public License as 
- *     published by the Free Software Foundation; either version 2 of 
- *     the License, or (at your option) any later version.
- *
- *     Neither Dag Brattli nor University of Tromsø admit liability nor
- *     provide warranty for any of this software. This material is 
- *     provided "AS-IS" and at no charge.
- *
- ********************************************************************/
-
-#ifndef IRPORT_H
-#define IRPORT_H
-
-#include <linux/netdevice.h>
-#include <linux/skbuff.h>
-#include <linux/types.h>
-#include <linux/spinlock.h>
-
-#include <net/irda/irda_device.h>
-
-#define SPEED_DEFAULT 9600
-#define SPEED_MAX     115200
-
-/*
- * These are the supported serial types.
- */
-#define PORT_UNKNOWN    0
-#define PORT_8250       1
-#define PORT_16450      2
-#define PORT_16550      3
-#define PORT_16550A     4
-#define PORT_CIRRUS     5
-#define PORT_16650      6
-#define PORT_MAX        6  
-
-#define FRAME_MAX_SIZE 2048
-
-struct irport_cb {
-	struct net_device *netdev; /* Yes! we are some kind of netdevice */
-	struct net_device_stats stats;
-
-	struct irlap_cb *irlap;    /* The link layer we are attached to */
-
-	chipio_t io;               /* IrDA controller information */
-	iobuff_t tx_buff;          /* Transmit buffer */
-	iobuff_t rx_buff;          /* Receive buffer */
-
-	struct qos_info qos;       /* QoS capabilities for this device */
-	dongle_t *dongle;          /* Dongle driver */
-
- 	__u32 flags;               /* Interface flags */
-	__u32 new_speed;
-	int mode;
-	int index;                 /* Instance index */
-	int transmitting;	   /* Are we transmitting ? */
-
-	spinlock_t lock;           /* For serializing operations */
-
-	/* For piggyback drivers */
-	void *priv;                
-	void (*change_speed)(void *priv, __u32 speed);
-	int (*interrupt)(int irq, void *dev_id, struct pt_regs *regs);
-};
-
-struct irport_cb *irport_open(int i, unsigned int iobase, unsigned int irq);
-int  irport_close(struct irport_cb *self);
-void irport_start(struct irport_cb *self);
-void irport_stop(struct irport_cb *self);
-void irport_change_speed(void *priv, __u32 speed);
-irqreturn_t irport_interrupt(int irq, void *dev_id, struct pt_regs *regs);
-int  irport_hard_xmit(struct sk_buff *skb, struct net_device *dev);
-int  irport_net_open(struct net_device *dev);
-int  irport_net_close(struct net_device *dev);
-
-#endif /* IRPORT_H */
--- diff/include/net/irda/nsc-ircc.h	2004-03-11 10:20:29.000000000 +0000
+++ source/include/net/irda/nsc-ircc.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,277 +0,0 @@
-/*********************************************************************
- *                
- * Filename:      nsc-ircc.h
- * Version:       
- * Description:   
- * Status:        Experimental.
- * Author:        Dag Brattli <dagb@cs.uit.no>
- * Created at:    Fri Nov 13 14:37:40 1998
- * Modified at:   Sun Jan 23 17:47:00 2000
- * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
- *     Copyright (c) 1998-2000 Dag Brattli <dagb@cs.uit.no>
- *     Copyright (c) 1998 Lichen Wang, <lwang@actisys.com>
- *     Copyright (c) 1998 Actisys Corp., www.actisys.com
- *     All Rights Reserved
- *      
- *     This program is free software; you can redistribute it and/or 
- *     modify it under the terms of the GNU General Public License as 
- *     published by the Free Software Foundation; either version 2 of 
- *     the License, or (at your option) any later version.
- *  
- *     Neither Dag Brattli nor University of Tromsø admit liability nor
- *     provide warranty for any of this software. This material is 
- *     provided "AS-IS" and at no charge.
- *     
- ********************************************************************/
-
-#ifndef NSC_IRCC_H
-#define NSC_IRCC_H
-
-#include <linux/time.h>
-
-#include <linux/spinlock.h>
-#include <linux/pm.h>
-#include <asm/io.h>
-
-/* DMA modes needed */
-#define DMA_TX_MODE     0x08    /* Mem to I/O, ++, demand. */
-#define DMA_RX_MODE     0x04    /* I/O to mem, ++, demand. */
-
-/* Config registers for the '108 */
-#define CFG_108_BAIC 0x00
-#define CFG_108_CSRT 0x01
-#define CFG_108_MCTL 0x02
-
-/* Config registers for the '338 */
-#define CFG_338_FER  0x00
-#define CFG_338_FAR  0x01
-#define CFG_338_PTR  0x02
-#define CFG_338_PNP0 0x1b
-#define CFG_338_PNP1 0x1c
-#define CFG_338_PNP3 0x4f
-
-/* Config registers for the '39x (in the logical device bank) */
-#define CFG_39X_LDN	0x07	/* Logical device number (Super I/O bank) */
-#define CFG_39X_SIOCF1	0x21	/* SuperI/O Config */
-#define CFG_39X_ACT	0x30	/* Device activation */
-#define CFG_39X_BASEH	0x60	/* Device base address (high bits) */
-#define CFG_39X_BASEL	0x61	/* Device base address (low bits) */
-#define CFG_39X_IRQNUM	0x70	/* Interrupt number & wake up enable */
-#define CFG_39X_IRQSEL	0x71	/* Interrupt select (edge/level + polarity) */
-#define CFG_39X_DMA0	0x74	/* DMA 0 configuration */
-#define CFG_39X_DMA1	0x75	/* DMA 1 configuration */
-#define CFG_39X_SPC	0xF0	/* Serial port configuration register */
-
-/* Flags for configuration register CRF0 */
-#define APEDCRC		0x02
-#define ENBNKSEL	0x01
-
-/* Set 0 */
-#define TXD             0x00 /* Transmit data port */
-#define RXD             0x00 /* Receive data port */
-
-/* Register 1 */
-#define IER		0x01 /* Interrupt Enable Register*/
-#define IER_RXHDL_IE    0x01 /* Receiver high data level interrupt */
-#define IER_TXLDL_IE    0x02 /* Transeiver low data level interrupt */
-#define IER_LS_IE	0x04//* Link Status Interrupt */
-#define IER_ETXURI      0x04 /* Tx underrun */
-#define IER_DMA_IE	0x10 /* DMA finished interrupt */
-#define IER_TXEMP_IE    0x20
-#define IER_SFIF_IE     0x40 /* Frame status FIFO intr */
-#define IER_TMR_IE      0x80 /* Timer event */
-
-#define FCR		0x02 /* (write only) */
-#define FCR_FIFO_EN     0x01 /* Enable FIFO's */
-#define FCR_RXSR        0x02 /* Rx FIFO soft reset */
-#define FCR_TXSR        0x04 /* Tx FIFO soft reset */
-#define FCR_RXTH	0x40 /* Rx FIFO threshold (set to 16) */
-#define FCR_TXTH	0x20 /* Tx FIFO threshold (set to 17) */
-
-#define EIR		0x02 /* (read only) */
-#define EIR_RXHDL_EV	0x01
-#define EIR_TXLDL_EV    0x02
-#define EIR_LS_EV	0x04
-#define EIR_DMA_EV	0x10
-#define EIR_TXEMP_EV	0x20
-#define EIR_SFIF_EV     0x40
-#define EIR_TMR_EV      0x80
-
-#define LCR             0x03 /* Link control register */
-#define LCR_WLS_8       0x03 /* 8 bits */
-
-#define BSR 	        0x03 /* Bank select register */
-#define BSR_BKSE        0x80
-#define BANK0 	        LCR_WLS_8 /* Must make sure that we set 8N1 */
-#define BANK1	        0x80
-#define BANK2	        0xe0
-#define BANK3	        0xe4
-#define BANK4	        0xe8
-#define BANK5	        0xec
-#define BANK6	        0xf0
-#define BANK7     	0xf4
-
-#define MCR		0x04 /* Mode Control Register */
-#define MCR_MODE_MASK	~(0xd0)
-#define MCR_UART        0x00
-#define MCR_RESERVED  	0x20	
-#define MCR_SHARP_IR    0x40
-#define MCR_SIR         0x60
-#define MCR_MIR  	0x80
-#define MCR_FIR		0xa0
-#define MCR_CEIR        0xb0
-#define MCR_IR_PLS      0x10
-#define MCR_DMA_EN	0x04
-#define MCR_EN_IRQ	0x08
-#define MCR_TX_DFR	0x08
-
-#define LSR             0x05 /* Link status register */
-#define LSR_RXDA        0x01 /* Receiver data available */
-#define LSR_TXRDY       0x20 /* Transmitter ready */
-#define LSR_TXEMP       0x40 /* Transmitter empty */
-
-#define ASCR            0x07 /* Auxillary Status and Control Register */
-#define ASCR_RXF_TOUT   0x01 /* Rx FIFO timeout */
-#define ASCR_FEND_INF   0x02 /* Frame end bytes in rx FIFO */
-#define ASCR_S_EOT      0x04 /* Set end of transmission */
-#define ASCT_RXBSY      0x20 /* Rx busy */
-#define ASCR_TXUR       0x40 /* Transeiver underrun */
-#define ASCR_CTE        0x80 /* Clear timer event */
-
-/* Bank 2 */
-#define BGDL            0x00 /* Baud Generator Divisor Port (Low Byte) */
-#define BGDH            0x01 /* Baud Generator Divisor Port (High Byte) */
-
-#define ECR1		0x02 /* Extended Control Register 1 */
-#define ECR1_EXT_SL	0x01 /* Extended Mode Select */
-#define ECR1_DMANF	0x02 /* DMA Fairness */
-#define ECR1_DMATH      0x04 /* DMA Threshold */
-#define ECR1_DMASWP	0x08 /* DMA Swap */
-
-#define EXCR2		0x04
-#define EXCR2_TFSIZ	0x01 /* Rx FIFO size = 32 */
-#define EXCR2_RFSIZ	0x04 /* Tx FIFO size = 32 */
-
-#define TXFLV           0x06 /* Tx FIFO level */
-#define RXFLV           0x07 /* Rx FIFO level */
-
-/* Bank 3 */
-#define MID		0x00
-
-/* Bank 4 */
-#define TMRL            0x00 /* Timer low byte */
-#define TMRH            0x01 /* Timer high byte */
-#define IRCR1           0x02 /* Infrared control register 1 */
-#define IRCR1_TMR_EN    0x01 /* Timer enable */
-
-#define TFRLL		0x04
-#define TFRLH		0x05
-#define RFRLL		0x06
-#define RFRLH		0x07
-
-/* Bank 5 */
-#define IRCR2           0x04 /* Infrared control register 2 */
-#define IRCR2_MDRS      0x04 /* MIR data rate select */
-#define IRCR2_FEND_MD   0x20 /* */
-
-#define FRM_ST          0x05 /* Frame status FIFO */
-#define FRM_ST_VLD      0x80 /* Frame status FIFO data valid */
-#define FRM_ST_ERR_MSK  0x5f
-#define FRM_ST_LOST_FR  0x40 /* Frame lost */
-#define FRM_ST_MAX_LEN  0x10 /* Max frame len exceeded */
-#define FRM_ST_PHY_ERR  0x08 /* Physical layer error */
-#define FRM_ST_BAD_CRC  0x04 
-#define FRM_ST_OVR1     0x02 /* Rx FIFO overrun */
-#define FRM_ST_OVR2     0x01 /* Frame status FIFO overrun */
-
-#define RFLFL           0x06
-#define RFLFH           0x07
-
-/* Bank 6 */
-#define IR_CFG2		0x00
-#define IR_CFG2_DIS_CRC	0x02
-
-/* Bank 7 */
-#define IRM_CR		0x07 /* Infrared module control register */
-#define IRM_CR_IRX_MSL	0x40
-#define IRM_CR_AF_MNT   0x80 /* Automatic format */
-
-/* NSC chip information */
-struct nsc_chip {
-	char *name;          /* Name of chipset */
-	int cfg[3];          /* Config registers */
-	u_int8_t cid_index;  /* Chip identification index reg */
-	u_int8_t cid_value;  /* Chip identification expected value */
-	u_int8_t cid_mask;   /* Chip identification revision mask */
-
-	/* Functions for probing and initializing the specific chip */
-	int (*probe)(struct nsc_chip *chip, chipio_t *info);
-	int (*init)(struct nsc_chip *chip, chipio_t *info);
-};
-typedef struct nsc_chip nsc_chip_t;
-
-/* For storing entries in the status FIFO */
-struct st_fifo_entry {
-	int status;
-	int len;
-};
-
-#define MAX_TX_WINDOW 7
-#define MAX_RX_WINDOW 7
-
-struct st_fifo {
-	struct st_fifo_entry entries[MAX_RX_WINDOW];
-	int pending_bytes;
-	int head;
-	int tail;
-	int len;
-};
-
-struct frame_cb {
-	void *start; /* Start of frame in DMA mem */
-	int len;     /* Lenght of frame in DMA mem */
-};
-
-struct tx_fifo {
-	struct frame_cb queue[MAX_TX_WINDOW]; /* Info about frames in queue */
-	int             ptr;                  /* Currently being sent */
-	int             len;                  /* Lenght of queue */
-	int             free;                 /* Next free slot */
-	void           *tail;                 /* Next free start in DMA mem */
-};
-
-/* Private data for each instance */
-struct nsc_ircc_cb {
-	struct st_fifo st_fifo;    /* Info about received frames */
-	struct tx_fifo tx_fifo;    /* Info about frames to be transmitted */
-
-	struct net_device *netdev;     /* Yes! we are some kind of netdevice */
-	struct net_device_stats stats;
-	
-	struct irlap_cb *irlap;    /* The link layer we are binded to */
-	struct qos_info qos;       /* QoS capabilities for this device */
-	
-	chipio_t io;               /* IrDA controller information */
-	iobuff_t tx_buff;          /* Transmit buffer */
-	iobuff_t rx_buff;          /* Receive buffer */
-
-	__u8 ier;                  /* Interrupt enable register */
-
-	struct timeval stamp;
-	struct timeval now;
-
-	spinlock_t lock;           /* For serializing operations */
-	
-	__u32 new_speed;
-	int index;                 /* Instance index */
-
-        struct pm_dev *dev;
-};
-
-static inline void switch_bank(int iobase, int bank)
-{
-		outb(bank, iobase+BSR);
-}
-
-#endif /* NSC_IRCC_H */
--- diff/include/net/irda/smc-ircc.h	2004-03-11 10:20:29.000000000 +0000
+++ source/include/net/irda/smc-ircc.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,180 +0,0 @@
-/*********************************************************************
- *                
- * Filename:      smc-ircc.h
- * Version:       0.3
- * Description:   Definitions for the SMC IrCC chipset
- * Status:        Experimental.
- * Author:        Thomas Davis (tadavis@jps.net)
- *
- *     Copyright (c) 1999-2000, Dag Brattli <dagb@cs.uit.no>
- *     Copyright (c) 1998-1999, Thomas Davis (tadavis@jps.net>
- *     All Rights Reserved
- *      
- *     This program is free software; you can redistribute it and/or 
- *     modify it under the terms of the GNU General Public License as 
- *     published by the Free Software Foundation; either version 2 of 
- *     the License, or (at your option) any later version.
- * 
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- *     GNU General Public License for more details.
- * 
- *     You should have received a copy of the GNU General Public License 
- *     along with this program; if not, write to the Free Software 
- *     Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
- *     MA 02111-1307 USA
- *
- ********************************************************************/
-
-#ifndef SMC_IRCC_H
-#define SMC_IRCC_H
-
-#include <linux/spinlock.h>
-#include <linux/pm.h>
-
-#include <net/irda/irport.h>
-
-/* DMA modes needed */
-#define DMA_TX_MODE                0x08    /* Mem to I/O, ++, demand. */
-#define DMA_RX_MODE                0x04    /* I/O to mem, ++, demand. */
-
-/* Master Control Register */
-#define IRCC_MASTER                0x07
-#define   IRCC_MASTER_POWERDOWN	   0x80
-#define   IRCC_MASTER_RESET        0x40
-#define   IRCC_MASTER_INT_EN       0x20
-#define   IRCC_MASTER_ERROR_RESET  0x10
-
-/* Register block 0 */
-
-/* Interrupt Identification */
-#define IRCC_IIR                   0x01
-#define   IRCC_IIR_ACTIVE_FRAME    0x80
-#define   IRCC_IIR_EOM             0x40
-#define   IRCC_IIR_RAW_MODE        0x20
-#define   IRCC_IIR_FIFO		   0x10
-
-/* Interrupt Enable */
-#define IRCC_IER                   0x02
-#define   IRCC_IER_ACTIVE_FRAME	   0x80
-#define   IRCC_IER_EOM 		   0x40
-#define   IRCC_IER_RAW_MODE        0x20
-#define   IRCC_IER_FIFO		   0x10
-
-/* Line Status Register */
-#define IRCC_LSR                   0x03
-#define   IRCC_LSR_UNDERRUN        0x80
-#define   IRCC_LSR_OVERRUN         0x40
-#define   IRCC_LSR_FRAME_ERROR     0x20
-#define   IRCC_LSR_SIZE_ERROR      0x10
-#define   IRCC_LSR_CRC_ERROR       0x80
-#define   IRCC_LSR_FRAME_ABORT 	   0x40
-
-/* Line Control Register A */
-#define IRCC_LCR_A                 0x04
-#define   IRCC_LCR_A_FIFO_RESET    0x80
-#define   IRCC_LCR_A_FAST          0x40
-#define   IRCC_LCR_A_GP_DATA       0x20
-#define   IRCC_LCR_A_RAW_TX        0x10
-#define   IRCC_LCR_A_RAW_RX        0x08
-#define   IRCC_LCR_A_ABORT         0x04
-#define   IRCC_LCR_A_DATA_DONE     0x02
-
-/* Line Control Register B */
-#define IRCC_LCR_B                 0x05
-#define   IRCC_LCR_B_SCE_DISABLED  0x00
-#define   IRCC_LCR_B_SCE_TRANSMIT  0x40
-#define   IRCC_LCR_B_SCE_RECEIVE   0x80
-#define   IRCC_LCR_B_SCE_UNDEFINED 0xc0
-#define   IRCC_LCR_B_SIP_ENABLE	   0x20
-#define   IRCC_LCR_B_BRICK_WALL    0x10
-
-/* Bus Status Register */
-#define IRCC_BSR                   0x06
-#define   IRCC_BSR_NOT_EMPTY	   0x80
-#define   IRCC_BSR_FIFO_FULL	   0x40
-#define   IRCC_BSR_TIMEOUT	   0x20
-
-/* Register block 1 */
-
-#define IRCC_FIFO_THRESHOLD	   0x02
-
-#define IRCC_SCE_CFGA	           0x00
-#define   IRCC_CFGA_AUX_IR	   0x80
-#define   IRCC_CFGA_HALF_DUPLEX	   0x04
-#define   IRCC_CFGA_TX_POLARITY	   0x02
-#define   IRCC_CFGA_RX_POLARITY	   0x01
-
-#define   IRCC_CFGA_COM		   0x00
-#define   IRCC_CFGA_IRDA_SIR_A	   0x08
-#define   IRCC_CFGA_ASK_SIR	   0x10
-#define   IRCC_CFGA_IRDA_SIR_B	   0x18
-#define   IRCC_CFGA_IRDA_HDLC 	   0x20
-#define   IRCC_CFGA_IRDA_4PPM 	   0x28
-#define   IRCC_CFGA_CONSUMER	   0x30
-#define   IRCC_CFGA_RAW_IR	   0x38
-#define   IRCC_CFGA_OTHER          0x40
-
-#define IRCC_IR_HDLC               0x04
-#define IRCC_IR_4PPM               0x01
-#define IRCC_IR_CONSUMER           0x02
-
-#define IRCC_SCE_CFGB	           0x01
-#define IRCC_CFGB_LOOPBACK         0x20
-#define IRCC_CFGB_LPBCK_TX_CRC	   0x10
-#define IRCC_CFGB_NOWAIT	   0x08
-#define IRCC_CFGB_STRING_MOVE	   0x04
-#define IRCC_CFGB_DMA_BURST 	   0x02
-#define IRCC_CFGB_DMA_ENABLE	   0x01
-
-#define IRCC_CFGB_MUX_COM          0x00
-#define IRCC_CFGB_MUX_IR           0x40
-#define IRCC_CFGB_MUX_AUX          0x80
-#define IRCC_CFGB_MUX_INACTIVE	   0xc0
-
-/* Register block 3 - Identification Registers! */
-#define IRCC_ID_HIGH	           0x00   /* 0x10 */
-#define IRCC_ID_LOW	           0x01   /* 0xB8 */
-#define IRCC_CHIP_ID 	           0x02   /* 0xF1 */
-#define IRCC_VERSION	           0x03   /* 0x01 */
-#define IRCC_INTERFACE	           0x04   /* low 4 = DMA, high 4 = IRQ */
-
-/* Register block 4 - IrDA */
-#define IRCC_CONTROL               0x00
-#define IRCC_BOF_COUNT_LO          0x01 /* Low byte */
-#define IRCC_BOF_COUNT_HI          0x00 /* High nibble (bit 0-3) */
-#define IRCC_BRICKWALL_CNT_LO      0x02 /* Low byte */
-#define IRCC_BRICKWALL_CNT_HI      0x03 /* High nibble (bit 4-7) */
-#define IRCC_TX_SIZE_LO            0x04 /* Low byte */
-#define IRCC_TX_SIZE_HI            0x03 /* High nibble (bit 0-3) */
-#define IRCC_RX_SIZE_HI            0x05 /* High nibble (bit 0-3) */
-#define IRCC_RX_SIZE_LO            0x06 /* Low byte */
-
-#define IRCC_1152                  0x80
-#define IRCC_CRC                   0x40
-
-/* Private data for each instance */
-struct ircc_cb {
-	struct net_device *netdev;     /* Yes! we are some kind of netdevice */
-	struct irlap_cb    *irlap; /* The link layer we are binded to */
-	
-	chipio_t *io;               /* IrDA controller information */
-	iobuff_t tx_buff;          /* Transmit buffer */
-	iobuff_t rx_buff;          /* Receive buffer */
-
-	struct irport_cb *irport;
-
-	/* Locking : half of our operations are done with irport, so we
-	 * use the irport spinlock to make sure *everything* is properly
-	 * synchronised - Jean II */
-	
-	__u32 new_speed;
-
-	int tx_buff_offsets[10];   /* Offsets between frames in tx_buff */
-	int tx_len;                /* Number of frames in tx_buff */
-
-	struct pm_dev *pmdev;
-};
-
-#endif /* SMC_IRCC_H */
--- diff/include/net/irda/toshoboe.h	2004-03-11 10:20:29.000000000 +0000
+++ source/include/net/irda/toshoboe.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,166 +0,0 @@
-/*********************************************************************
- *                
- * Filename:      toshoboe.h
- * Version:       0.1
- * Description:   Driver for the Toshiba OBOE (or type-O)
- *                FIR Chipset. 
- * Status:        Experimental.
- * Author:        James McKenzie <james@fishsoup.dhs.org>
- * Created at:    Sat May 8  12:35:27 1999
- * 
- *     Copyright (c) 1999-2000 James McKenzie, All Rights Reserved.
- *      
- *     This program is free software; you can redistribute it and/or 
- *     modify it under the terms of the GNU General Public License as 
- *     published by the Free Software Foundation; either version 2 of 
- *     the License, or (at your option) any later version.
- *  
- *     Neither James McKenzie nor Cambridge University admit liability nor
- *     provide warranty for any of this software. This material is 
- *     provided "AS-IS" and at no charge.
- *
- *     Applicable Models : Libretto 100CT. and many more
- *
- ********************************************************************/
-
-#ifndef TOSHOBOE_H
-#define TOSHOBOE_H
-
-/* Registers */
-/*Receive and transmit task registers (read only) */
-#define OBOE_RCVT	(0x00+(self->base))
-#define OBOE_XMTT	(0x01+(self->base))
-#define OBOE_XMTT_OFFSET	0x40
-
-/*Page pointers to the TaskFile structure */
-#define OBOE_TFP2	(0x02+(self->base))
-#define OBOE_TFP0	(0x04+(self->base))
-#define OBOE_TFP1	(0x05+(self->base))
-
-/*Dunno */
-#define OBOE_REG_3	(0x03+(self->base))
-
-/*Number of tasks to use in Xmit and Recv queues */
-#define OBOE_NTR	(0x07+(self->base))
-#define OBOE_NTR_XMIT4	0x00
-#define OBOE_NTR_XMIT8	0x10
-#define OBOE_NTR_XMIT16	0x30
-#define OBOE_NTR_XMIT32	0x70
-#define OBOE_NTR_XMIT64	0xf0
-#define OBOE_NTR_RECV4	0x00
-#define OBOE_NTR_RECV8	0x01
-#define OBOE_NTR_RECV6	0x03
-#define OBOE_NTR_RECV32	0x07
-#define OBOE_NTR_RECV64	0x0f
-
-/* Dunno */
-#define OBOE_REG_9	(0x09+(self->base))
-
-/* Interrupt Status Register */
-#define OBOE_ISR	(0x0c+(self->base))
-#define OBOE_ISR_TXDONE	0x80
-#define OBOE_ISR_RXDONE	0x40
-#define OBOE_ISR_20	0x20
-#define OBOE_ISR_10	0x10
-#define OBOE_ISR_8	0x08         /*This is collision or parity or something */
-#define OBOE_ISR_4	0x08
-#define OBOE_ISR_2	0x08
-#define OBOE_ISR_1	0x08
-
-/*Dunno */
-#define OBOE_REG_D	(0x0d+(self->base))
-
-/*Register Lock Register */
-#define OBOE_LOCK	((self->base)+0x0e)
-
-
-
-/*Speed control registers */
-#define OBOE_PMDL	(0x10+(self->base))
-#define OBOE_PMDL_SIR	0x18
-#define OBOE_PMDL_MIR	0xa0
-#define OBOE_PMDL_FIR	0x40
-
-#define OBOE_SMDL	(0x18+(self->base))
-#define OBOE_SMDL_SIR	0x20
-#define OBOE_SMDL_MIR	0x01
-#define OBOE_SMDL_FIR	0x0f
-
-#define OBOE_UDIV	(0x19+(self->base))
-
-/*Dunno */
-#define OBOE_REG_11	(0x11+(self->base))
-
-/*Chip Reset Register */
-#define OBOE_RST	(0x15+(self->base))
-#define OBOE_RST_WRAP	0x8
-
-/*Dunno */
-#define OBOE_REG_1A	(0x1a+(self->base))
-#define OBOE_REG_1B	(0x1b+(self->base))
-
-/* The PCI ID of the OBOE chip */
-#ifndef PCI_DEVICE_ID_FIR701
-#define PCI_DEVICE_ID_FIR701 	0x0701
-#endif
-
-typedef unsigned int dword;
-typedef unsigned short int word;
-typedef unsigned char byte;
-typedef dword Paddr;
-
-struct OboeTask
-  {
-    __u16 len;
-    __u8 unused;
-    __u8 control;
-    __u32 buffer;
-  };
-
-#define OBOE_NTASKS 64
-
-struct OboeTaskFile
-  {
-    struct OboeTask recv[OBOE_NTASKS];
-    struct OboeTask xmit[OBOE_NTASKS];
-  };
-
-#define OBOE_TASK_BUF_LEN (sizeof(struct OboeTaskFile) << 1)
-
-/*These set the number of slots in use */
-#define TX_SLOTS	4
-#define RX_SLOTS	4
-
-/* You need also to change this, toshiba uses 4,8 and 4,4 */
-/* It makes no difference if you are only going to use ONETASK mode */
-/* remember each buffer use XX_BUF_SZ more _PHYSICAL_ memory */
-#define OBOE_NTR_VAL 	(OBOE_NTR_XMIT4 | OBOE_NTR_RECV4)
-
-struct toshoboe_cb
-  {
-    struct net_device *netdev;      /* Yes! we are some kind of netdevice */
-    struct net_device_stats stats;
-
-    struct irlap_cb    *irlap;  /* The link layer we are binded to */
-    struct qos_info     qos;    /* QoS capabilities for this device */
-
-    chipio_t io;                /* IrDA controller information */
-
-    __u32 new_speed;
-
-    struct pci_dev *pdev;       /*PCI device */
-    int base;                   /*IO base */
-    int txpending;              /*how many tx's are pending */
-    int txs, rxs;               /*Which slots are we at  */
-    void *taskfilebuf;          /*The unaligned taskfile buffer */
-    struct OboeTaskFile *taskfile;  /*The taskfile   */
-    void *xmit_bufs[TX_SLOTS];  /*The buffers   */
-    void *recv_bufs[RX_SLOTS];
-    int open;
-    int stopped;		/*Stopped by some or other APM stuff*/
-  };
-
-
-#endif
-
-
--- diff/include/net/irda/vlsi_ir.h	2004-04-05 12:57:08.000000000 +0100
+++ source/include/net/irda/vlsi_ir.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,799 +0,0 @@
-
-/*********************************************************************
- *
- *	vlsi_ir.h:	VLSI82C147 PCI IrDA controller driver for Linux
- *
- *	Version:	0.5
- *
- *	Copyright (c) 2001-2003 Martin Diehl
- *
- *	This program is free software; you can redistribute it and/or 
- *	modify it under the terms of the GNU General Public License as 
- *	published by the Free Software Foundation; either version 2 of 
- *	the License, or (at your option) any later version.
- *
- *	This program is distributed in the hope that it will be useful,
- *	but WITHOUT ANY WARRANTY; without even the implied warranty of
- *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- *	GNU General Public License for more details.
- *
- *	You should have received a copy of the GNU General Public License 
- *	along with this program; if not, write to the Free Software 
- *	Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
- *	MA 02111-1307 USA
- *
- ********************************************************************/
-
-#ifndef IRDA_VLSI_FIR_H
-#define IRDA_VLSI_FIR_H
-
-/* ================================================================
- * compatibility stuff
- */
-
-/* definitions not present in pci_ids.h */
-
-#ifndef PCI_CLASS_WIRELESS_IRDA
-#define PCI_CLASS_WIRELESS_IRDA		0x0d00
-#endif
-
-#ifndef PCI_CLASS_SUBCLASS_MASK
-#define PCI_CLASS_SUBCLASS_MASK		0xffff
-#endif
-
-/* in recent 2.5 interrupt handlers have non-void return value */
-#ifndef IRQ_RETVAL
-typedef void irqreturn_t;
-#define IRQ_NONE
-#define IRQ_HANDLED
-#define IRQ_RETVAL(x)
-#endif
-
-/* some stuff need to check kernelversion. Not all 2.5 stuff was present
- * in early 2.5.x - the test is merely to separate 2.4 from 2.5
- */
-#include <linux/version.h>
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-
-/* PDE() introduced in 2.5.4 */
-#ifdef CONFIG_PROC_FS
-#define PDE(inode) ((inode)->u.generic_ip)
-#endif
-
-/* irda crc16 calculation exported in 2.5.42 */
-#define irda_calc_crc16(fcs,buf,len)	(GOOD_FCS)
-
-/* we use this for unified pci device name access */
-#define PCIDEV_NAME(pdev)	((pdev)->name)
-
-#else /* 2.5 or later */
-
-/* recent 2.5/2.6 stores pci device names at varying places ;-) */
-#ifdef CONFIG_PCI_NAMES
-/* human readable name */
-#define PCIDEV_NAME(pdev)	((pdev)->pretty_name)
-#else
-/* whatever we get from the associated struct device - bus:slot:dev.fn id */
-#define PCIDEV_NAME(pdev)	(pci_name(pdev))
-#endif
-
-#endif
-
-/* ================================================================ */
-
-/* non-standard PCI registers */
-
-enum vlsi_pci_regs {
-	VLSI_PCI_CLKCTL		= 0x40,		/* chip clock input control */
-	VLSI_PCI_MSTRPAGE	= 0x41,		/* addr [31:24] for all busmaster cycles */
-	VLSI_PCI_IRMISC		= 0x42		/* mainly legacy UART related */
-};
-
-/* ------------------------------------------ */
-
-/* VLSI_PCI_CLKCTL: Clock Control Register (u8, rw) */
-
-/* Three possible clock sources: either on-chip 48MHz PLL or
- * external clock applied to EXTCLK pin. External clock may
- * be either 48MHz or 40MHz, which is indicated by XCKSEL.
- * CLKSTP controls whether the selected clock source gets
- * connected to the IrDA block.
- *
- * On my HP OB-800 the BIOS sets external 40MHz clock as source
- * when IrDA enabled and I've never detected any PLL lock success.
- * Apparently the 14.3...MHz OSC input required for the PLL to work
- * is not connected and the 40MHz EXTCLK is provided externally.
- * At least this is what makes the driver working for me.
- */
-
-enum vlsi_pci_clkctl {
-
-	/* PLL control */
-
-	CLKCTL_PD_INV		= 0x04,		/* PD#: inverted power down signal,
-						 * i.e. PLL is powered, if PD_INV set */
-	CLKCTL_LOCK		= 0x40,		/* (ro) set, if PLL is locked */
-
-	/* clock source selection */
-
-	CLKCTL_EXTCLK		= 0x20,		/* set to select external clock input, not PLL */
-	CLKCTL_XCKSEL		= 0x10,		/* set to indicate EXTCLK is 40MHz, not 48MHz */
-
-	/* IrDA block control */
-
-	CLKCTL_CLKSTP		= 0x80,		/* set to disconnect from selected clock source */
-	CLKCTL_WAKE		= 0x08		/* set to enable wakeup feature: whenever IR activity
-						 * is detected, PD_INV gets set(?) and CLKSTP cleared */
-};
-
-/* ------------------------------------------ */
-
-/* VLSI_PCI_MSTRPAGE: Master Page Register (u8, rw) and busmastering stuff */
-
-#define DMA_MASK_USED_BY_HW	0xffffffff
-#define DMA_MASK_MSTRPAGE	0x00ffffff
-#define MSTRPAGE_VALUE		(DMA_MASK_MSTRPAGE >> 24)
-
-	/* PCI busmastering is somewhat special for this guy - in short:
-	 *
-	 * We select to operate using fixed MSTRPAGE=0, use ISA DMA
-	 * address restrictions to make the PCI BM api aware of this,
-	 * but ensure the hardware is dealing with real 32bit access.
-	 *
-	 * In detail:
-	 * The chip executes normal 32bit busmaster cycles, i.e.
-	 * drives all 32 address lines. These addresses however are
-	 * composed of [0:23] taken from various busaddr-pointers
-	 * and [24:31] taken from the MSTRPAGE register in the VLSI82C147
-	 * config space. Therefore _all_ busmastering must be
-	 * targeted to/from one single 16MB (busaddr-) superpage!
-	 * The point is to make sure all the allocations for memory
-	 * locations with busmaster access (ring descriptors, buffers)
-	 * are indeed bus-mappable to the same 16MB range (for x86 this
-	 * means they must reside in the same 16MB physical memory address
-	 * range). The only constraint we have which supports "several objects
-	 * mappable to common 16MB range" paradigma, is the old ISA DMA
-	 * restriction to the first 16MB of physical address range.
-	 * Hence the approach here is to enable PCI busmaster support using
-	 * the correct 32bit dma-mask used by the chip. Afterwards the device's
-	 * dma-mask gets restricted to 24bit, which must be honoured somehow by
-	 * all allocations for memory areas to be exposed to the chip ...
-	 *
-	 * Note:
-	 * Don't be surprised to get "Setting latency timer..." messages every
-	 * time when PCI busmastering is enabled for the chip.
-	 * The chip has its PCI latency timer RO fixed at 0 - which is not a
-	 * problem here, because it is never requesting _burst_ transactions.
-	 */
-
-/* ------------------------------------------ */
-
-/* VLSI_PCIIRMISC: IR Miscellaneous Register (u8, rw) */
-
-/* legacy UART emulation - not used by this driver - would require:
- * (see below for some register-value definitions)
- *
- *	- IRMISC_UARTEN must be set to enable UART address decoding
- *	- IRMISC_UARTSEL configured
- *	- IRCFG_MASTER must be cleared
- *	- IRCFG_SIR must be set
- *	- IRENABLE_PHYANDCLOCK must be asserted 0->1 (and hence IRENABLE_SIR_ON)
- */
-
-enum vlsi_pci_irmisc {
-
-	/* IR transceiver control */
-
-	IRMISC_IRRAIL		= 0x40,		/* (ro?) IR rail power indication (and control?)
-						 * 0=3.3V / 1=5V. Probably set during power-on?
-						 * unclear - not touched by driver */
-	IRMISC_IRPD		= 0x08,		/* transceiver power down, if set */
-
-	/* legacy UART control */
-
-	IRMISC_UARTTST		= 0x80,		/* UART test mode - "always write 0" */
-	IRMISC_UARTEN		= 0x04,		/* enable UART address decoding */
-
-	/* bits [1:0] IRMISC_UARTSEL to select legacy UART address */
-
-	IRMISC_UARTSEL_3f8	= 0x00,
-	IRMISC_UARTSEL_2f8	= 0x01,
-	IRMISC_UARTSEL_3e8	= 0x02,
-	IRMISC_UARTSEL_2e8	= 0x03
-};
-
-/* ================================================================ */
-
-/* registers mapped to 32 byte PCI IO space */
-
-/* note: better access all registers at the indicated u8/u16 size
- *	 although some of them contain only 1 byte of information.
- *	 some of them (particaluarly PROMPT and IRCFG) ignore
- *	 access when using the wrong addressing mode!
- */
-
-enum vlsi_pio_regs {
-	VLSI_PIO_IRINTR		= 0x00,		/* interrupt enable/request (u8, rw) */
-	VLSI_PIO_RINGPTR	= 0x02,		/* rx/tx ring pointer (u16, ro) */
-	VLSI_PIO_RINGBASE	= 0x04,		/* [23:10] of ring address (u16, rw) */
-	VLSI_PIO_RINGSIZE	= 0x06,		/* rx/tx ring size (u16, rw) */
-	VLSI_PIO_PROMPT		= 0x08, 	/* triggers ring processing (u16, wo) */
-	/* 0x0a-0x0f: reserved / duplicated UART regs */
-	VLSI_PIO_IRCFG		= 0x10,		/* configuration select (u16, rw) */
-	VLSI_PIO_SIRFLAG	= 0x12,		/* BOF/EOF for filtered SIR (u16, ro) */
-	VLSI_PIO_IRENABLE	= 0x14,		/* enable and status register (u16, rw/ro) */
-	VLSI_PIO_PHYCTL		= 0x16,		/* physical layer current status (u16, ro) */
-	VLSI_PIO_NPHYCTL	= 0x18,		/* next physical layer select (u16, rw) */
-	VLSI_PIO_MAXPKT		= 0x1a,		/* [11:0] max len for packet receive (u16, rw) */
-	VLSI_PIO_RCVBCNT	= 0x1c		/* current receive-FIFO byte count (u16, ro) */
-	/* 0x1e-0x1f: reserved / duplicated UART regs */
-};
-
-/* ------------------------------------------ */
-
-/* VLSI_PIO_IRINTR: Interrupt Register (u8, rw) */
-
-/* enable-bits:
- *		1 = enable / 0 = disable
- * interrupt condition bits:
- * 		set according to corresponding interrupt source
- *		(regardless of the state of the enable bits)
- *		enable bit status indicates whether interrupt gets raised
- *		write-to-clear
- * note: RPKTINT and TPKTINT behave different in legacy UART mode (which we don't use :-)
- */
-
-enum vlsi_pio_irintr {
-	IRINTR_ACTEN	= 0x80,	/* activity interrupt enable */
-	IRINTR_ACTIVITY	= 0x40,	/* activity monitor (traffic detected) */
-	IRINTR_RPKTEN	= 0x20,	/* receive packet interrupt enable*/
-	IRINTR_RPKTINT	= 0x10,	/* rx-packet transfered from fifo to memory finished */
-	IRINTR_TPKTEN	= 0x08,	/* transmit packet interrupt enable */
-	IRINTR_TPKTINT	= 0x04,	/* last bit of tx-packet+crc shifted to ir-pulser */
-	IRINTR_OE_EN	= 0x02,	/* UART rx fifo overrun error interrupt enable */
-	IRINTR_OE_INT	= 0x01	/* UART rx fifo overrun error (read LSR to clear) */
-};
-
-/* we use this mask to check whether the (shared PCI) interrupt is ours */
-
-#define IRINTR_INT_MASK		(IRINTR_ACTIVITY|IRINTR_RPKTINT|IRINTR_TPKTINT)
-
-/* ------------------------------------------ */
-
-/* VLSI_PIO_RINGPTR: Ring Pointer Read-Back Register (u16, ro) */
-
-/* _both_ ring pointers are indices relative to the _entire_ rx,tx-ring!
- * i.e. the referenced descriptor is located
- * at RINGBASE + PTR * sizeof(descr) for rx and tx
- * therefore, the tx-pointer has offset MAX_RING_DESCR
- */
-
-#define MAX_RING_DESCR		64	/* tx, rx rings may contain up to 64 descr each */
-
-#define RINGPTR_RX_MASK		(MAX_RING_DESCR-1)
-#define RINGPTR_TX_MASK		((MAX_RING_DESCR-1)<<8)
-
-#define RINGPTR_GET_RX(p)	((p)&RINGPTR_RX_MASK)
-#define RINGPTR_GET_TX(p)	(((p)&RINGPTR_TX_MASK)>>8)
-
-/* ------------------------------------------ */
-
-/* VLSI_PIO_RINGBASE: Ring Pointer Base Address Register (u16, ro) */
-
-/* Contains [23:10] part of the ring base (bus-) address
- * which must be 1k-alinged. [31:24] is taken from
- * VLSI_PCI_MSTRPAGE above.
- * The controller initiates non-burst PCI BM cycles to
- * fetch and update the descriptors in the ring.
- * Once fetched, the descriptor remains cached onchip
- * until it gets closed and updated due to the ring
- * processing state machine.
- * The entire ring area is split in rx and tx areas with each
- * area consisting of 64 descriptors of 8 bytes each.
- * The rx(tx) ring is located at ringbase+0 (ringbase+64*8).
- */
-
-#define BUS_TO_RINGBASE(p)	(((p)>>10)&0x3fff)
-
-/* ------------------------------------------ */
-
-/* VLSI_PIO_RINGSIZE: Ring Size Register (u16, rw) */
-
-/* bit mask to indicate the ring size to be used for rx and tx.
- * 	possible values		encoded bits
- *		 4		   0000
- *		 8		   0001
- *		16		   0011
- *		32		   0111
- *		64		   1111
- * located at [15:12] for tx and [11:8] for rx ([7:0] unused)
- *
- * note: probably a good idea to have IRCFG_MSTR cleared when writing
- *	 this so the state machines are stopped and the RINGPTR is reset!
- */
-
-#define SIZE_TO_BITS(num)		((((num)-1)>>2)&0x0f)
-#define TX_RX_TO_RINGSIZE(tx,rx)	((SIZE_TO_BITS(tx)<<12)|(SIZE_TO_BITS(rx)<<8))
-#define RINGSIZE_TO_RXSIZE(rs)		((((rs)&0x0f00)>>6)+4)
-#define RINGSIZE_TO_TXSIZE(rs)		((((rs)&0xf000)>>10)+4)
-
-
-/* ------------------------------------------ */
-
-/* VLSI_PIO_PROMPT: Ring Prompting Register (u16, write-to-start) */
-
-/* writing any value kicks the ring processing state machines
- * for both tx, rx rings as follows:
- * 	- active rings (currently owning an active descriptor)
- *	  ignore the prompt and continue
- *	- idle rings fetch the next descr from the ring and start
- *	  their processing
- */
-
-/* ------------------------------------------ */
-
-/* VLSI_PIO_IRCFG: IR Config Register (u16, rw) */
-
-/* notes:
- *	- not more than one SIR/MIR/FIR bit must be set at any time
- *	- SIR, MIR, FIR and CRC16 select the configuration which will
- *	  be applied on next 0->1 transition of IRENABLE_PHYANDCLOCK (see below).
- *	- besides allowing the PCI interface to execute busmaster cycles
- *	  and therefore the ring SM to operate, the MSTR bit has side-effects:
- *	  when MSTR is cleared, the RINGPTR's get reset and the legacy UART mode
- *	  (in contrast to busmaster access mode) gets enabled.
- *	- clearing ENRX or setting ENTX while data is received may stall the
- *	  receive fifo until ENRX reenabled _and_ another packet arrives
- *	- SIRFILT means the chip performs the required unwrapping of hardware
- *	  headers (XBOF's, BOF/EOF) and un-escaping in the _receive_ direction.
- *	  Only the resulting IrLAP payload is copied to the receive buffers -
- *	  but with the 16bit FCS still encluded. Question remains, whether it
- *	  was already checked or we should do it before passing the packet to IrLAP?
- */
-
-enum vlsi_pio_ircfg {
-	IRCFG_LOOP	= 0x4000,	/* enable loopback test mode */
-	IRCFG_ENTX	= 0x1000,	/* transmit enable */
-	IRCFG_ENRX	= 0x0800,	/* receive enable */
-	IRCFG_MSTR	= 0x0400,	/* master enable */
-	IRCFG_RXANY	= 0x0200,	/* receive any packet */
-	IRCFG_CRC16	= 0x0080,	/* 16bit (not 32bit) CRC select for MIR/FIR */
-	IRCFG_FIR	= 0x0040,	/* FIR 4PPM encoding mode enable */
-	IRCFG_MIR	= 0x0020,	/* MIR HDLC encoding mode enable */
-	IRCFG_SIR	= 0x0010,	/* SIR encoding mode enable */
-	IRCFG_SIRFILT	= 0x0008,	/* enable SIR decode filter (receiver unwrapping) */
-	IRCFG_SIRTEST	= 0x0004,	/* allow SIR decode filter when not in SIR mode */
-	IRCFG_TXPOL	= 0x0002,	/* invert tx polarity when set */
-	IRCFG_RXPOL	= 0x0001	/* invert rx polarity when set */
-};
-
-/* ------------------------------------------ */
-
-/* VLSI_PIO_SIRFLAG: SIR Flag Register (u16, ro) */
-
-/* register contains hardcoded BOF=0xc0 at [7:0] and EOF=0xc1 at [15:8]
- * which is used for unwrapping received frames in SIR decode-filter mode
- */
-
-/* ------------------------------------------ */
-
-/* VLSI_PIO_IRENABLE: IR Enable Register (u16, rw/ro) */
-
-/* notes:
- *	- IREN acts as gate for latching the configured IR mode information
- *	  from IRCFG and IRPHYCTL when IREN=reset and applying them when
- *	  IREN gets set afterwards.
- *	- ENTXST reflects IRCFG_ENTX
- *	- ENRXST = IRCFG_ENRX && (!IRCFG_ENTX || IRCFG_LOOP)
- */
-
-enum vlsi_pio_irenable {
-	IRENABLE_PHYANDCLOCK	= 0x8000,  /* enable IR phy and gate the mode config (rw) */
-	IRENABLE_CFGER		= 0x4000,  /* mode configuration error (ro) */
-	IRENABLE_FIR_ON		= 0x2000,  /* FIR on status (ro) */
-	IRENABLE_MIR_ON		= 0x1000,  /* MIR on status (ro) */
-	IRENABLE_SIR_ON		= 0x0800,  /* SIR on status (ro) */
-	IRENABLE_ENTXST		= 0x0400,  /* transmit enable status (ro) */
-	IRENABLE_ENRXST		= 0x0200,  /* Receive enable status (ro) */
-	IRENABLE_CRC16_ON	= 0x0100   /* 16bit (not 32bit) CRC enabled status (ro) */
-};
-
-#define	  IRENABLE_MASK	    0xff00  /* Read mask */
-
-/* ------------------------------------------ */
-
-/* VLSI_PIO_PHYCTL: IR Physical Layer Current Control Register (u16, ro) */
-
-/* read-back of the currently applied physical layer status.
- * applied from VLSI_PIO_NPHYCTL at rising edge of IRENABLE_PHYANDCLOCK
- * contents identical to VLSI_PIO_NPHYCTL (see below)
- */
-
-/* ------------------------------------------ */
-
-/* VLSI_PIO_NPHYCTL: IR Physical Layer Next Control Register (u16, rw) */
-
-/* latched during IRENABLE_PHYANDCLOCK=0 and applied at 0-1 transition
- *
- * consists of BAUD[15:10], PLSWID[9:5] and PREAMB[4:0] bits defined as follows:
- *
- * SIR-mode:	BAUD = (115.2kHz / baudrate) - 1
- *		PLSWID = (pulsetime * freq / (BAUD+1)) - 1
- *			where pulsetime is the requested IrPHY pulse width
- *			and freq is 8(16)MHz for 40(48)MHz primary input clock
- *		PREAMB: don't care for SIR
- *
- *		The nominal SIR pulse width is 3/16 bit time so we have PLSWID=12
- *		fixed for all SIR speeds at 40MHz input clock (PLSWID=24 at 48MHz).
- *		IrPHY also allows shorter pulses down to the nominal pulse duration
- *		at 115.2kbaud (minus some tolerance) which is 1.41 usec.
- *		Using the expression PLSWID = 12/(BAUD+1)-1 (multiplied by two for 48MHz)
- *		we get the minimum acceptable PLSWID values according to the VLSI
- *		specification, which provides 1.5 usec pulse width for all speeds (except
- *		for 2.4kbaud getting 6usec). This is fine with IrPHY v1.3 specs and
- *		reduces the transceiver power which drains the battery. At 9.6kbaud for
- *		example this amounts to more than 90% battery power saving!
- *
- * MIR-mode:	BAUD = 0
- *		PLSWID = 9(10) for 40(48) MHz input clock
- *			to get nominal MIR pulse width
- *		PREAMB = 1
- *
- * FIR-mode:	BAUD = 0
- *		PLSWID: don't care
- *		PREAMB = 15
- */
-
-#define PHYCTL_BAUD_SHIFT	10
-#define PHYCTL_BAUD_MASK	0xfc00
-#define PHYCTL_PLSWID_SHIFT	5
-#define PHYCTL_PLSWID_MASK	0x03e0
-#define PHYCTL_PREAMB_SHIFT	0
-#define PHYCTL_PREAMB_MASK	0x001f
-
-#define PHYCTL_TO_BAUD(bwp)	(((bwp)&PHYCTL_BAUD_MASK)>>PHYCTL_BAUD_SHIFT)
-#define PHYCTL_TO_PLSWID(bwp)	(((bwp)&PHYCTL_PLSWID_MASK)>>PHYCTL_PLSWID_SHIFT)
-#define PHYCTL_TO_PREAMB(bwp)	(((bwp)&PHYCTL_PREAMB_MASK)>>PHYCTL_PREAMB_SHIFT)
-
-#define BWP_TO_PHYCTL(b,w,p)	((((b)<<PHYCTL_BAUD_SHIFT)&PHYCTL_BAUD_MASK) \
-				 | (((w)<<PHYCTL_PLSWID_SHIFT)&PHYCTL_PLSWID_MASK) \
-				 | (((p)<<PHYCTL_PREAMB_SHIFT)&PHYCTL_PREAMB_MASK))
-
-#define BAUD_BITS(br)		((115200/(br))-1)
-
-static inline unsigned
-calc_width_bits(unsigned baudrate, unsigned widthselect, unsigned clockselect)
-{
-	unsigned	tmp;
-
-	if (widthselect)	/* nominal 3/16 puls width */
-		return (clockselect) ? 12 : 24;
-
-	tmp = ((clockselect) ? 12 : 24) / (BAUD_BITS(baudrate)+1);
-
-	/* intermediate result of integer division needed here */
-
-	return (tmp>0) ? (tmp-1) : 0;
-}
-
-#define PHYCTL_SIR(br,ws,cs)	BWP_TO_PHYCTL(BAUD_BITS(br),calc_width_bits((br),(ws),(cs)),0)
-#define PHYCTL_MIR(cs)		BWP_TO_PHYCTL(0,((cs)?9:10),1)
-#define PHYCTL_FIR		BWP_TO_PHYCTL(0,0,15)
-
-/* quite ugly, I know. But implementing these calculations here avoids
- * having magic numbers in the code and allows some playing with pulsewidths
- * without risk to violate the standards.
- * FWIW, here is the table for reference:
- *
- * baudrate	BAUD	min-PLSWID	nom-PLSWID	PREAMB
- *     2400	  47	   0(0)		   12(24)	   0
- *     9600	  11	   0(0)		   12(24)	   0
- *    19200	   5	   1(2)		   12(24)	   0
- *    38400	   2	   3(6)	           12(24)	   0
- *    57600	   1	   5(10)	   12(24)	   0
- *   115200	   0	  11(22)	   12(24)	   0
- *	MIR	   0	    -		    9(10)	   1
- *	FIR	   0        -               0		  15
- *
- * note: x(y) means x-value for 40MHz / y-value for 48MHz primary input clock
- */
-
-/* ------------------------------------------ */
-
-
-/* VLSI_PIO_MAXPKT: Maximum Packet Length register (u16, rw) */
-
-/* maximum acceptable length for received packets */
-
-/* hw imposed limitation - register uses only [11:0] */
-#define MAX_PACKET_LENGTH	0x0fff
-
-/* IrLAP I-field (apparently not defined elsewhere) */
-#define IRDA_MTU		2048
-
-/* complete packet consists of A(1)+C(1)+I(<=IRDA_MTU) */
-#define IRLAP_SKB_ALLOCSIZE	(1+1+IRDA_MTU)
-
-/* the buffers we use to exchange frames with the hardware need to be
- * larger than IRLAP_SKB_ALLOCSIZE because we may have up to 4 bytes FCS
- * appended and, in SIR mode, a lot of frame wrapping bytes. The worst
- * case appears to be a SIR packet with I-size==IRDA_MTU and all bytes
- * requiring to be escaped to provide transparency. Furthermore, the peer
- * might ask for quite a number of additional XBOFs:
- *	up to 115+48 XBOFS		 163
- *	regular BOF			   1
- *	A-field				   1
- *	C-field				   1
- *	I-field, IRDA_MTU, all escaped	4096
- *	FCS (16 bit at SIR, escaped)	   4
- *	EOF				   1
- * AFAICS nothing in IrLAP guarantees A/C field not to need escaping
- * (f.e. 0xc0/0xc1 - i.e. BOF/EOF - are legal values there) so in the
- * worst case we have 4269 bytes total frame size.
- * However, the VLSI uses 12 bits only for all buffer length values,
- * which limits the maximum useable buffer size <= 4095.
- * Note this is not a limitation in the receive case because we use
- * the SIR filtering mode where the hw unwraps the frame and only the
- * bare packet+fcs is stored into the buffer - in contrast to the SIR
- * tx case where we have to pass frame-wrapped packets to the hw.
- * If this would ever become an issue in real life, the only workaround
- * I see would be using the legacy UART emulation in SIR mode.
- */
-
-#define XFER_BUF_SIZE		MAX_PACKET_LENGTH
-
-/* ------------------------------------------ */
-
-/* VLSI_PIO_RCVBCNT: Receive Byte Count Register (u16, ro) */
-
-/* receive packet counter gets incremented on every non-filtered
- * byte which was put in the receive fifo and reset for each
- * new packet. Used to decide whether we are just in the middle
- * of receiving
- */
-
-/* better apply the [11:0] mask when reading, as some docs say the
- * reserved [15:12] would return 1 when reading - which is wrong AFAICS
- */
-#define RCVBCNT_MASK	0x0fff
-
-/******************************************************************/
-
-/* descriptors for rx/tx ring
- *
- * accessed by hardware - don't change!
- *
- * the descriptor is owned by hardware, when the ACTIVE status bit
- * is set and nothing (besides reading status to test the bit)
- * shall be done. The bit gets cleared by hw, when the descriptor
- * gets closed. Premature reaping of descriptors owned be the chip
- * can be achieved by disabling IRCFG_MSTR
- *
- * Attention: Writing addr overwrites status!
- *
- * ### FIXME: depends on endianess (but there ain't no non-i586 ob800 ;-)
- */
-
-struct ring_descr_hw {
-	volatile u16	rd_count;	/* tx/rx count [11:0] */
-	u16		reserved;
-	union {
-		u32	addr;		/* [23:0] of the buffer's busaddress */
-		struct {
-			u8		addr_res[3];
-			volatile u8	status;		/* descriptor status */
-		} rd_s __attribute__((packed));
-	} rd_u __attribute((packed));
-} __attribute__ ((packed));
-
-#define rd_addr		rd_u.addr
-#define rd_status	rd_u.rd_s.status
-
-/* ring descriptor status bits */
-
-#define RD_ACTIVE		0x80	/* descriptor owned by hw (both TX,RX) */
-
-/* TX ring descriptor status */
-
-#define	RD_TX_DISCRC		0x40	/* do not send CRC (for SIR) */
-#define	RD_TX_BADCRC		0x20	/* force a bad CRC */
-#define	RD_TX_PULSE		0x10	/* send indication pulse after this frame (MIR/FIR) */
-#define	RD_TX_FRCEUND		0x08	/* force underrun */
-#define	RD_TX_CLRENTX		0x04	/* clear ENTX after this frame */
-#define	RD_TX_UNDRN		0x01	/* TX fifo underrun (probably PCI problem) */
-
-/* RX ring descriptor status */
-
-#define RD_RX_PHYERR		0x40	/* physical encoding error */
-#define RD_RX_CRCERR		0x20	/* CRC error (MIR/FIR) */
-#define RD_RX_LENGTH		0x10	/* frame exceeds buffer length */
-#define RD_RX_OVER		0x08	/* RX fifo overrun (probably PCI problem) */
-#define RD_RX_SIRBAD		0x04	/* EOF missing: BOF follows BOF (SIR, filtered) */
-
-#define RD_RX_ERROR		0x7c	/* any error in received frame */
-
-/* the memory required to hold the 2 descriptor rings */
-#define HW_RING_AREA_SIZE	(2 * MAX_RING_DESCR * sizeof(struct ring_descr_hw))
-
-/******************************************************************/
-
-/* sw-ring descriptors consists of a bus-mapped transfer buffer with
- * associated skb and a pointer to the hw entry descriptor
- */
-
-struct ring_descr {
-	struct ring_descr_hw	*hw;
-	struct sk_buff		*skb;
-	void			*buf;
-};
-
-/* wrappers for operations on hw-exposed ring descriptors
- * access to the hw-part of the descriptors must use these.
- */
-
-static inline int rd_is_active(struct ring_descr *rd)
-{
-	return ((rd->hw->rd_status & RD_ACTIVE) != 0);
-}
-
-static inline void rd_activate(struct ring_descr *rd)
-{
-	rd->hw->rd_status |= RD_ACTIVE;
-}
-
-static inline void rd_set_status(struct ring_descr *rd, u8 s)
-{
-	rd->hw->rd_status = s;	 /* may pass ownership to the hardware */
-}
-
-static inline void rd_set_addr_status(struct ring_descr *rd, dma_addr_t a, u8 s)
-{
-	/* order is important for two reasons:
-	 *  - overlayed: writing addr overwrites status
-	 *  - we want to write status last so we have valid address in
-	 *    case status has RD_ACTIVE set
-	 */
-
-	if ((a & ~DMA_MASK_MSTRPAGE)>>24 != MSTRPAGE_VALUE) {
-		ERROR("%s: pci busaddr inconsistency!\n", __FUNCTION__);
-		dump_stack();
-		return;
-	}
-
-	a &= DMA_MASK_MSTRPAGE;  /* clear highbyte to make sure we won't write
-				  * to status - just in case MSTRPAGE_VALUE!=0
-				  */
-	rd->hw->rd_addr = cpu_to_le32(a);
-	wmb();
-	rd_set_status(rd, s);	 /* may pass ownership to the hardware */
-}
-
-static inline void rd_set_count(struct ring_descr *rd, u16 c)
-{
-	rd->hw->rd_count = cpu_to_le16(c);
-}
-
-static inline u8 rd_get_status(struct ring_descr *rd)
-{
-	return rd->hw->rd_status;
-}
-
-static inline dma_addr_t rd_get_addr(struct ring_descr *rd)
-{
-	dma_addr_t	a;
-
-	a = le32_to_cpu(rd->hw->rd_addr);
-	return (a & DMA_MASK_MSTRPAGE) | (MSTRPAGE_VALUE << 24);
-}
-
-static inline u16 rd_get_count(struct ring_descr *rd)
-{
-	return le16_to_cpu(rd->hw->rd_count);
-}
-
-/******************************************************************/
-
-/* sw descriptor rings for rx, tx:
- *
- * operations follow producer-consumer paradigm, with the hw
- * in the middle doing the processing.
- * ring size must be power of two.
- *
- * producer advances r->tail after inserting for processing
- * consumer advances r->head after removing processed rd
- * ring is empty if head==tail / full if (tail+1)==head
- */
-
-struct vlsi_ring {
-	struct pci_dev		*pdev;
-	int			dir;
-	unsigned		len;
-	unsigned		size;
-	unsigned		mask;
-	atomic_t		head, tail;
-	struct ring_descr	*rd;
-};
-
-/* ring processing helpers */
-
-static inline struct ring_descr *ring_last(struct vlsi_ring *r)
-{
-	int t;
-
-	t = atomic_read(&r->tail) & r->mask;
-	return (((t+1) & r->mask) == (atomic_read(&r->head) & r->mask)) ? NULL : &r->rd[t];
-}
-
-static inline struct ring_descr *ring_put(struct vlsi_ring *r)
-{
-	atomic_inc(&r->tail);
-	return ring_last(r);
-}
-
-static inline struct ring_descr *ring_first(struct vlsi_ring *r)
-{
-	int h;
-
-	h = atomic_read(&r->head) & r->mask;
-	return (h == (atomic_read(&r->tail) & r->mask)) ? NULL : &r->rd[h];
-}
-
-static inline struct ring_descr *ring_get(struct vlsi_ring *r)
-{
-	atomic_inc(&r->head);
-	return ring_first(r);
-}
-
-/******************************************************************/
-
-/* our private compound VLSI-PCI-IRDA device information */
-
-typedef struct vlsi_irda_dev {
-	struct pci_dev		*pdev;
-	struct net_device_stats	stats;
-
-	struct irlap_cb		*irlap;
-
-	struct qos_info		qos;
-
-	unsigned		mode;
-	int			baud, new_baud;
-
-	dma_addr_t		busaddr;
-	void			*virtaddr;
-	struct vlsi_ring	*tx_ring, *rx_ring;
-
-	struct timeval		last_rx;
-
-	spinlock_t		lock;
-	struct semaphore	sem;
-
-	u32			cfg_space[64/sizeof(u32)];
-	u8			resume_ok;	
-	struct proc_dir_entry	*proc_entry;
-
-} vlsi_irda_dev_t;
-
-/********************************************************/
-
-/* the remapped error flags we use for returning from frame
- * post-processing in vlsi_process_tx/rx() after it was completed
- * by the hardware. These functions either return the >=0 number
- * of transfered bytes in case of success or the negative (-)
- * of the or'ed error flags.
- */
-
-#define VLSI_TX_DROP		0x0001
-#define VLSI_TX_FIFO		0x0002
-
-#define VLSI_RX_DROP		0x0100
-#define VLSI_RX_OVER		0x0200
-#define VLSI_RX_LENGTH  	0x0400
-#define VLSI_RX_FRAME		0x0800
-#define VLSI_RX_CRC		0x1000
-
-/********************************************************/
-
-#endif /* IRDA_VLSI_FIR_H */
-
--- diff/include/net/irda/w83977af.h	2002-10-16 04:29:05.000000000 +0100
+++ source/include/net/irda/w83977af.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,53 +0,0 @@
-#ifndef W83977AF_H
-#define W83977AF_H
-
-#define W977_EFIO_BASE 0x370
-#define W977_EFIO2_BASE 0x3f0
-#define W977_DEVICE_IR 0x06
-
-
-/*
- * Enter extended function mode
- */
-static inline void w977_efm_enter(unsigned int efio)
-{
-        outb(0x87, efio);
-        outb(0x87, efio);
-}
-
-/*
- * Select a device to configure 
- */
-
-static inline void w977_select_device(__u8 devnum, unsigned int efio)
-{
-	outb(0x07, efio);
-	outb(devnum, efio+1);
-} 
-
-/* 
- * Write a byte to a register
- */
-static inline void w977_write_reg(__u8 reg, __u8 value, unsigned int efio)
-{
-	outb(reg, efio);
-	outb(value, efio+1);
-}
-
-/*
- * read a byte from a register
- */
-static inline __u8 w977_read_reg(__u8 reg, unsigned int efio)
-{
-	outb(reg, efio);
-	return inb(efio+1);
-}
-
-/*
- * Exit extended function mode
- */
-static inline void w977_efm_exit(unsigned int efio)
-{
-	outb(0xAA, efio);
-}
-#endif
--- diff/include/net/irda/w83977af_ir.h	2004-03-11 10:20:29.000000000 +0000
+++ source/include/net/irda/w83977af_ir.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,196 +0,0 @@
-/*********************************************************************
- *                
- * Filename:      w83977af_ir.h
- * Version:       
- * Description:   
- * Status:        Experimental.
- * Author:        Paul VanderSpek
- * Created at:    Thu Nov 19 13:55:34 1998
- * Modified at:   Tue Jan 11 13:08:19 2000
- * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
- *     Copyright (c) 1998-2000 Dag Brattli, All Rights Reserved.
- *      
- *     This program is free software; you can redistribute it and/or 
- *     modify it under the terms of the GNU General Public License as 
- *     published by the Free Software Foundation; either version 2 of 
- *     the License, or (at your option) any later version.
- *  
- *     Neither Dag Brattli nor University of Tromsø admit liability nor
- *     provide warranty for any of this software. This material is 
- *     provided "AS-IS" and at no charge.
- *     
- ********************************************************************/
-
-#ifndef W83977AF_IR_H
-#define W83977AF_IR_H
-
-#include <asm/io.h>
-
-/* Flags for configuration register CRF0 */
-#define ENBNKSEL	0x01
-#define APEDCRC		0x02
-#define TXW4C           0x04
-#define RXW4C           0x08
-
-/* Bank 0 */
-#define RBR             0x00 /* Receiver buffer register */
-#define TBR             0x00 /* Transmitter buffer register */
-
-#define ICR		0x01 /* Interrupt configuration register */
-#define ICR_ERBRI       0x01 /* Receiver buffer register interrupt */
-#define ICR_ETBREI      0x02 /* Transeiver empty interrupt */
-#define ICR_EUSRI	0x04//* IR status interrupt */
-#define ICR_EHSRI       0x04
-#define ICR_ETXURI      0x04 /* Tx underrun */
-#define ICR_EDMAI	0x10 /* DMA interrupt */
-#define ICR_ETXTHI      0x20 /* Transmitter threshold interrupt */
-#define ICR_EFSFI       0x40 /* Frame status FIFO interrupt */
-#define ICR_ETMRI       0x80 /* Timer interrupt */
-
-#define UFR		0x02 /* FIFO control register */
-#define UFR_EN_FIFO     0x01 /* Enable FIFO's */
-#define UFR_RXF_RST     0x02 /* Reset Rx FIFO */
-#define UFR_TXF_RST     0x04 /* Reset Tx FIFO */
-#define UFR_RXTL	0x80 /* Rx FIFO threshold (set to 16) */
-#define UFR_TXTL	0x20 /* Tx FIFO threshold (set to 17) */
-
-#define ISR		0x02 /* Interrupt status register */
-#define ISR_RXTH_I	0x01 /* Receive threshold interrupt */
-#define ISR_TXEMP_I     0x02 /* Transmitter empty interrupt */
-#define ISR_FEND_I	0x04
-#define ISR_DMA_I	0x10
-#define ISR_TXTH_I	0x20 /* Transmitter threshold interrupt */
-#define ISR_FSF_I       0x40
-#define ISR_TMR_I       0x80 /* Timer interrupt */
-
-#define UCR             0x03 /* Uart control register */
-#define UCR_DLS8        0x03 /* 8N1 */
-
-#define SSR 	        0x03 /* Sets select register */
-#define SET0 	        UCR_DLS8        /* Make sure we keep 8N1 */
-#define SET1	        (0x80|UCR_DLS8) /* Make sure we keep 8N1 */
-#define SET2	        0xE0
-#define SET3	        0xE4
-#define SET4	        0xE8
-#define SET5	        0xEC
-#define SET6	        0xF0
-#define SET7	        0xF4
-
-#define HCR		0x04
-#define HCR_MODE_MASK	~(0xD0)
-#define HCR_SIR         0x60
-#define HCR_MIR_576  	0x20	
-#define HCR_MIR_1152	0x80
-#define HCR_FIR		0xA0
-#define HCR_EN_DMA	0x04
-#define HCR_EN_IRQ	0x08
-#define HCR_TX_WT	0x08
-
-#define USR             0x05 /* IR status register */
-#define USR_RDR         0x01 /* Receive data ready */
-#define USR_TSRE        0x40 /* Transmitter empty? */
-
-#define AUDR            0x07
-#define AUDR_SFEND      0x08 /* Set a frame end */
-#define AUDR_RXBSY      0x20 /* Rx busy */
-#define AUDR_UNDR       0x40 /* Transeiver underrun */
-
-/* Set 2 */
-#define ABLL            0x00 /* Advanced baud rate divisor latch (low byte) */
-#define ABHL            0x01 /* Advanced baud rate divisor latch (high byte) */
-
-#define ADCR1		0x02
-#define ADCR1_ADV_SL	0x01	
-#define ADCR1_D_CHSW	0x08	/* the specs are wrong. its bit 3, not 4 */
-#define ADCR1_DMA_F	0x02
-
-#define ADCR2		0x04
-#define ADCR2_TXFS32	0x01
-#define ADCR2_RXFS32	0x04
-
-#define RXFDTH          0x07
-
-/* Set 3 */
-#define AUID		0x00
-
-/* Set 4 */
-#define TMRL            0x00 /* Timer value register (low byte) */
-#define TMRH            0x01 /* Timer value register (high byte) */
-
-#define IR_MSL          0x02 /* Infrared mode select */
-#define IR_MSL_EN_TMR   0x01 /* Enable timer */
-
-#define TFRLL		0x04 /* Transmitter frame length (low byte) */
-#define TFRLH		0x05 /* Transmitter frame length (high byte) */
-#define RFRLL		0x06 /* Receiver frame length (low byte) */
-#define RFRLH		0x07 /* Receiver frame length (high byte) */
-
-/* Set 5 */
-
-#define FS_FO           0x05 /* Frame status FIFO */
-#define FS_FO_FSFDR     0x80 /* Frame status FIFO data ready */
-#define FS_FO_LST_FR    0x40 /* Frame lost */
-#define FS_FO_MX_LEX    0x10 /* Max frame len exceeded */
-#define FS_FO_PHY_ERR   0x08 /* Physical layer error */
-#define FS_FO_CRC_ERR   0x04 
-#define FS_FO_RX_OV     0x02 /* Receive overrun */
-#define FS_FO_FSF_OV    0x01 /* Frame status FIFO overrun */
-#define FS_FO_ERR_MSK   0x5f /* Error mask */
-
-#define RFLFL           0x06
-#define RFLFH           0x07
-
-/* Set 6 */
-#define IR_CFG2		0x00
-#define IR_CFG2_DIS_CRC	0x02
-
-/* Set 7 */
-#define IRM_CR		0x07 /* Infrared module control register */
-#define IRM_CR_IRX_MSL	0x40
-#define IRM_CR_AF_MNT   0x80 /* Automatic format */
-
-/* For storing entries in the status FIFO */
-struct st_fifo_entry {
-	int status;
-	int len;
-};
-
-struct st_fifo {
-	struct st_fifo_entry entries[10];
-	int head;
-	int tail;
-	int len;
-};
-
-/* Private data for each instance */
-struct w83977af_ir {
-	struct st_fifo st_fifo;
-
-	int tx_buff_offsets[10]; /* Offsets between frames in tx_buff */
-	int tx_len;          /* Number of frames in tx_buff */
-
-	struct net_device *netdev; /* Yes! we are some kind of netdevice */
-	struct net_device_stats stats;
-	
-	struct irlap_cb    *irlap; /* The link layer we are binded to */
-	struct qos_info     qos;   /* QoS capabilities for this device */
-	
-	chipio_t io;               /* IrDA controller information */
-	iobuff_t tx_buff;          /* Transmit buffer */
-	iobuff_t rx_buff;          /* Receive buffer */
-
-	/* Note : currently locking is *very* incomplete, but this
-	 * will get you started. Check in nsc-ircc.c for a proper
-	 * locking strategy. - Jean II */
-	spinlock_t lock;           /* For serializing operations */
-	
-	__u32 new_speed;
-};
-
-static inline void switch_bank( int iobase, int set)
-{
-	outb(set, iobase+SSR);
-}
-
-#endif
--- diff/scripts/MAKEDEV.ide	2002-10-16 04:29:07.000000000 +0100
+++ source/scripts/MAKEDEV.ide	1970-01-01 01:00:00.000000000 +0100
@@ -1,49 +0,0 @@
-#!/bin/sh
-#
-# This script creates the proper /dev/ entries for IDE devices
-# on the primary, secondary, tertiary, and quaternary interfaces.
-# See ../Documentation/ide.txt for more information.
-#
-makedev () {
-	rm -f /dev/$1
-	echo mknod /dev/$1 $2 $3 $4
-	     mknod /dev/$1 $2 $3 $4
-	chown root:disk /dev/$1
-	chmod 660 /dev/$1
-}
-
-makedevs () {
-	rm -f /dev/$1*
-	makedev $1 b $2 $3
-	for part in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
-	do
-		makedev $1$part b $2 `expr $3 + $part`
-	done
-}
-
-makedevs hda  3 0
-makedevs hdb  3 64
-makedevs hdc 22 0
-makedevs hdd 22 64
-makedevs hde 33 0
-makedevs hdf 33 64
-makedevs hdg 34 0
-makedevs hdh 34 64
-makedevs hdi 56 0
-makedevs hdj 56 64
-makedevs hdk 57 0
-makedevs hdl 57 64
-makedevs hdm 88 0
-makedevs hdn 88 64
-makedevs hdo 89 0
-makedevs hdp 89 64
-makedevs hdq 90 0
-makedevs hdr 90 64
-makedevs hds 91 0
-makedevs hdt 91 64
-
-for tape in 0 1 2 3 4 5 6 7
-do
-	makedev ht$tape c 37 $tape
-	makedev nht$tape c 37 `expr $tape + 128`
-done
--- diff/scripts/MAKEDEV.snd	2003-08-20 14:16:36.000000000 +0100
+++ source/scripts/MAKEDEV.snd	1970-01-01 01:00:00.000000000 +0100
@@ -1,161 +0,0 @@
-#!/bin/bash
-#
-# This script creates the proper /dev/ entries for ALSA devices.
-# See ../Documentation/sound/alsa/ALSA-Configuration.txt for more
-# information.
-
-MAJOR=116
-OSSMAJOR=14
-MAX_CARDS=4
-PERM=666
-OWNER=root.root
-
-if [ "`grep -w -E "^audio" /etc/group`x" != x ]; then
-  PERM=660
-  OWNER=root.audio
-fi
-
-function create_odevice () {
-  rm -f $1
-  echo -n "Creating $1..."
-  mknod -m $PERM $1 c $OSSMAJOR $2
-  chown $OWNER $1
-  echo " done"
-}
-
-function create_odevices () {
-  tmp=0
-  tmp1=0
-  rm -f $1 $1?
-  echo -n "Creating $1?..."
-  while [ $tmp1 -lt $MAX_CARDS ]; do
-    minor=$[ $2 + $tmp ]
-    mknod -m $PERM $1$tmp1 c $OSSMAJOR $minor
-    chown $OWNER $1$tmp1
-    tmp=$[ $tmp + 16 ]
-    tmp1=$[ $tmp1 + 1 ]
-  done
-  echo " done"
-}
-
-function create_device1 () {
-  rm -f $1
-  minor=$2
-  echo -n "Creating $1..."
-  mknod -m $PERM $1 c $MAJOR $minor
-  chown $OWNER $1
-  echo " done"
-}
-
-function create_devices () {
-  tmp=0
-  rm -f $1 $1?
-  echo -n "Creating $1?..."
-  while [ $tmp -lt $MAX_CARDS ]; do
-    minor=$[ $tmp * 32 ]
-    minor=$[ $2 + $minor ]
-    mknod -m $PERM "${1}C${tmp}" c $MAJOR $minor
-    chown $OWNER "${1}C${tmp}"
-    tmp=$[ $tmp + 1 ]
-  done
-  echo " done"
-}
-
-function create_devices2 () {
-  tmp=0
-  rm -f $1 $1?
-  echo -n "Creating $1??..."
-  while [ $tmp -lt $MAX_CARDS ]; do
-    tmp1=0
-    while [ $tmp1 -lt $3 ]; do
-      minor=$[ $tmp * 32 ]
-      minor=$[ $2 + $minor + $tmp1 ]
-      mknod -m $PERM "${1}C${tmp}D${tmp1}" c $MAJOR $minor
-      chown $OWNER "${1}C${tmp}D${tmp1}"
-      tmp1=$[ $tmp1 + 1 ]
-    done
-    tmp=$[ $tmp + 1 ]
-  done
-  echo " done"
-}
-
-function create_devices3 () {
-  tmp=0
-  rm -f $1 $1?
-  echo -n "Creating $1??$4..."
-  while [ $tmp -lt $MAX_CARDS ]; do
-    tmp1=0
-    while [ $tmp1 -lt $3 ]; do
-      minor=$[ $tmp * 32 ]
-      minor=$[ $2 + $minor + $tmp1 ]
-      mknod -m $PERM "${1}C${tmp}D${tmp1}${4}" c $MAJOR $minor
-      chown $OWNER "${1}C${tmp}D${tmp1}${4}"
-      tmp1=$[ $tmp1 + 1 ]
-    done
-    tmp=$[ $tmp + 1 ]
-  done
-  echo " done"
-}
-
-if test "$1" = "-?" || test "$1" = "-h" || test "$1" = "--help"; then
-  echo "Usage: snddevices [max]"
-  exit
-fi
-
-if test "$1" = "max"; then
-  DSP_MINOR=19
-fi
-
-# OSS (Lite) compatible devices...
-
-if test $OSSMAJOR -eq 14; then
-  create_odevices /dev/mixer		0
-  create_odevice /dev/sequencer		1
-  create_odevices /dev/midi		2
-  create_odevices /dev/dsp		3
-  create_odevices /dev/audio		4
-  create_odevice /dev/sndstat		6
-  create_odevice /dev/music		8
-  create_odevices /dev/dmmidi		9
-  create_odevices /dev/dmfm		10
-  create_odevices /dev/amixer		11	# alternate mixer
-  create_odevices /dev/adsp		12	# alternate dsp
-  create_odevices /dev/amidi		13	# alternate midi
-  create_odevices /dev/admmidi		14	# alternate direct midi
-  # create symlinks
-  ln -svf /dev/mixer0 /dev/mixer
-  ln -svf /dev/midi0 /dev/midi
-  ln -svf /dev/dsp0 /dev/dsp
-  ln -svf /dev/audio0 /dev/audio
-  ln -svf /dev/music /dev/sequencer2
-  ln -svf /dev/adsp0 /dev/adsp
-  ln -svf /dev/amidi0 /dev/amidi
-fi
-
-# Remove old devices
-
-mv -f /dev/sndstat /dev/1sndstat
-rm -f /dev/snd*
-mv -f /dev/1sndstat /dev/sndstat
-if [ -d /dev/snd ]; then
-  rm -f /dev/snd/*
-  rmdir /dev/snd
-fi
-
-# Create new ones
-
-mkdir -p /dev/snd
-create_devices  /dev/snd/control	0
-create_device1  /dev/snd/seq		1
-create_device1  /dev/snd/timer		33
-create_devices2 /dev/snd/hw		4	4
-create_devices2 /dev/snd/midi		8	8
-create_devices3 /dev/snd/pcm		16	8	p
-create_devices3 /dev/snd/pcm		24	8	c
-
-# Loader devices
-
-echo "ALSA loader devices"
-rm -f /dev/aload*
-create_devices  /dev/aload		0
-create_device1  /dev/aloadSEQ		1
--- diff/sound/oss/724hwmcode.h	2002-10-16 04:27:56.000000000 +0100
+++ source/sound/oss/724hwmcode.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,1575 +0,0 @@
-//=============================================================================
-// Copyright (c) 1997-1999	Yamaha Corporation.	All Rights Reserved.
-//
-//	Title:
-//		hwmcode.c
-//	Desc:
-//		micro-code for CTRL & DSP
-//=============================================================================
-#ifndef _HWMCODE_
-#define _HWMCODE_
-
-static unsigned long int	DspInst[] __initdata = {
-	0x00000081, 0x000001a4, 0x0000000a, 0x0000002f,
-	0x00080253, 0x01800317, 0x0000407b, 0x0000843f,
-	0x0001483c, 0x0001943c, 0x0005d83c, 0x00001c3c,
-	0x0000c07b, 0x00050c3f, 0x0121503c, 0x00000000,
-	0x00000000, 0x00000000, 0x00000000, 0x00000000,
-	0x00000000, 0x00000000, 0x00000000, 0x00000000,
-	0x00000000, 0x00000000, 0x00000000, 0x00000000,
-	0x00000000, 0x00000000, 0x00000000, 0x00000000
-};
-
-static unsigned long int	CntrlInst[] __initdata = {
-	0x000007, 0x240007, 0x0C0007, 0x1C0007,
-	0x060007, 0x700002, 0x000020, 0x030040,
-	0x007104, 0x004286, 0x030040, 0x000F0D,
-	0x000810, 0x20043A, 0x000282, 0x00020D,
-	0x000810, 0x20043A, 0x001282, 0x200E82,
-	0x001A82, 0x032D0D, 0x000810, 0x10043A,
-	0x02D38D, 0x000810, 0x18043A, 0x00010D,
-	0x020015, 0x0000FD, 0x000020, 0x038860,
-	0x039060, 0x038060, 0x038040, 0x038040,
-	0x038040, 0x018040, 0x000A7D, 0x038040,
-	0x038040, 0x018040, 0x200402, 0x000882,
-	0x08001A, 0x000904, 0x015986, 0x000007,
-	0x260007, 0x000007, 0x000007, 0x018A06,
-	0x000007, 0x030C8D, 0x000810, 0x18043A,
-	0x260007, 0x00087D, 0x018042, 0x00160A,
-	0x04A206, 0x000007, 0x00218D, 0x000810,
-	0x08043A, 0x21C206, 0x000007, 0x0007FD,
-	0x018042, 0x08000A, 0x000904, 0x029386,
-	0x000195, 0x090D04, 0x000007, 0x000820,
-	0x0000F5, 0x000B7D, 0x01F060, 0x0000FD,
-	0x032206, 0x018040, 0x000A7D, 0x038042,
-	0x13804A, 0x18000A, 0x001820, 0x059060,
-	0x058860, 0x018040, 0x0000FD, 0x018042,
-	0x70000A, 0x000115, 0x071144, 0x032386,
-	0x030000, 0x007020, 0x034A06, 0x018040,
-	0x00348D, 0x000810, 0x08043A, 0x21EA06,
-	0x000007, 0x02D38D, 0x000810, 0x18043A,
-	0x018206, 0x000007, 0x240007, 0x000F8D,
-	0x000810, 0x00163A, 0x002402, 0x005C02,
-	0x0028FD, 0x000020, 0x018040, 0x08000D,
-	0x000815, 0x510984, 0x000007, 0x00004D,
-	0x000E5D, 0x000E02, 0x00418D, 0x000810,
-	0x08043A, 0x2C8A06, 0x000007, 0x00008D,
-	0x000924, 0x000F02, 0x00458D, 0x000810,
-	0x08043A, 0x2C8A06, 0x000007, 0x00387D,
-	0x018042, 0x08000A, 0x001015, 0x010984,
-	0x018386, 0x000007, 0x01AA06, 0x000007,
-	0x0008FD, 0x018042, 0x18000A, 0x001904,
-	0x218086, 0x280007, 0x001810, 0x28043A,
-	0x280C02, 0x00000D, 0x000810, 0x28143A,
-	0x08808D, 0x000820, 0x0002FD, 0x018040,
-	0x200007, 0x00020D, 0x189904, 0x000007,
-	0x00402D, 0x0000BD, 0x0002FD, 0x018042,
-	0x08000A, 0x000904, 0x055A86, 0x000007,
-	0x000100, 0x000A20, 0x00047D, 0x018040,
-	0x018042, 0x20000A, 0x003015, 0x012144,
-	0x034986, 0x000007, 0x002104, 0x034986,
-	0x000007, 0x000F8D, 0x000810, 0x280C3A,
-	0x023944, 0x06C986, 0x000007, 0x001810,
-	0x28043A, 0x08810D, 0x000820, 0x0002FD,
-	0x018040, 0x200007, 0x002810, 0x78003A,
-	0x00688D, 0x000810, 0x08043A, 0x288A06,
-	0x000007, 0x00400D, 0x001015, 0x189904,
-	0x292904, 0x393904, 0x000007, 0x060206,
-	0x000007, 0x0004F5, 0x00007D, 0x000020,
-	0x00008D, 0x010860, 0x018040, 0x00047D,
-	0x038042, 0x21804A, 0x18000A, 0x021944,
-	0x215886, 0x000007, 0x004075, 0x71F104,
-	0x000007, 0x010042, 0x28000A, 0x002904,
-	0x212086, 0x000007, 0x003C0D, 0x30A904,
-	0x000007, 0x00077D, 0x018042, 0x08000A,
-	0x000904, 0x07DA86, 0x00057D, 0x002820,
-	0x03B060, 0x07F206, 0x018040, 0x003020,
-	0x03A860, 0x018040, 0x0002FD, 0x018042,
-	0x08000A, 0x000904, 0x07FA86, 0x000007,
-	0x00057D, 0x018042, 0x28040A, 0x000E8D,
-	0x000810, 0x280C3A, 0x00000D, 0x000810,
-	0x28143A, 0x09000D, 0x000820, 0x0002FD,
-	0x018040, 0x200007, 0x003DFD, 0x000020,
-	0x018040, 0x00107D, 0x008D8D, 0x000810,
-	0x08043A, 0x288A06, 0x000007, 0x000815,
-	0x08001A, 0x010984, 0x095186, 0x00137D,
-	0x200500, 0x280F20, 0x338F60, 0x3B8F60,
-	0x438F60, 0x4B8F60, 0x538F60, 0x5B8F60,
-	0x038A60, 0x018040, 0x007FBD, 0x383DC4,
-	0x000007, 0x001A7D, 0x001375, 0x018042,
-	0x09004A, 0x10000A, 0x0B8D04, 0x139504,
-	0x000007, 0x000820, 0x019060, 0x001104,
-	0x212086, 0x010040, 0x0017FD, 0x018042,
-	0x08000A, 0x000904, 0x212286, 0x000007,
-	0x00197D, 0x038042, 0x09804A, 0x10000A,
-	0x000924, 0x001664, 0x0011FD, 0x038042,
-	0x2B804A, 0x19804A, 0x00008D, 0x218944,
-	0x000007, 0x002244, 0x0AE186, 0x000007,
-	0x001A64, 0x002A24, 0x00197D, 0x080102,
-	0x100122, 0x000820, 0x039060, 0x018040,
-	0x003DFD, 0x00008D, 0x000820, 0x018040,
-	0x001375, 0x001A7D, 0x010042, 0x09804A,
-	0x10000A, 0x00021D, 0x0189E4, 0x2992E4,
-	0x309144, 0x000007, 0x00060D, 0x000A15,
-	0x000C1D, 0x001025, 0x00A9E4, 0x012BE4,
-	0x000464, 0x01B3E4, 0x0232E4, 0x000464,
-	0x000464, 0x000464, 0x000464, 0x00040D,
-	0x08B1C4, 0x000007, 0x000820, 0x000BF5,
-	0x030040, 0x00197D, 0x038042, 0x09804A,
-	0x000A24, 0x08000A, 0x080E64, 0x000007,
-	0x100122, 0x000820, 0x031060, 0x010040,
-	0x0064AC, 0x00027D, 0x000020, 0x018040,
-	0x00107D, 0x018042, 0x0011FD, 0x3B804A,
-	0x09804A, 0x20000A, 0x000095, 0x1A1144,
-	0x00A144, 0x0D2086, 0x00040D, 0x00B984,
-	0x0D2186, 0x0018FD, 0x018042, 0x0010FD,
-	0x09804A, 0x28000A, 0x000095, 0x010924,
-	0x002A64, 0x0D1186, 0x000007, 0x002904,
-	0x0D2286, 0x000007, 0x0D2A06, 0x080002,
-	0x00008D, 0x00387D, 0x000820, 0x018040,
-	0x00127D, 0x018042, 0x10000A, 0x003904,
-	0x0DD186, 0x00080D, 0x7FFFB5, 0x00B984,
-	0x0DA186, 0x000025, 0x0E7A06, 0x00002D,
-	0x000015, 0x00082D, 0x02C78D, 0x000820,
-	0x0EC206, 0x00000D, 0x7F8035, 0x00B984,
-	0x0E7186, 0x400025, 0x00008D, 0x110944,
-	0x000007, 0x00018D, 0x109504, 0x000007,
-	0x009164, 0x000424, 0x000424, 0x000424,
-	0x100102, 0x280002, 0x02C68D, 0x000820,
-	0x0EC206, 0x00018D, 0x00042D, 0x00008D,
-	0x109504, 0x000007, 0x00020D, 0x109184,
-	0x000007, 0x02C70D, 0x000820, 0x00008D,
-	0x0038FD, 0x018040, 0x003BFD, 0x001020,
-	0x03A860, 0x000815, 0x313184, 0x212184,
-	0x000007, 0x03B060, 0x03A060, 0x018040,
-	0x0022FD, 0x000095, 0x010924, 0x000424,
-	0x000424, 0x001264, 0x100102, 0x000820,
-	0x039060, 0x018040, 0x001924, 0x00FB8D,
-	0x00397D, 0x000820, 0x058040, 0x038042,
-	0x09844A, 0x000606, 0x08040A, 0x000424,
-	0x000424, 0x00117D, 0x018042, 0x08000A,
-	0x000A24, 0x280502, 0x280C02, 0x09800D,
-	0x000820, 0x0002FD, 0x018040, 0x200007,
-	0x0022FD, 0x018042, 0x08000A, 0x000095,
-	0x280DC4, 0x011924, 0x00197D, 0x018042,
-	0x0011FD, 0x09804A, 0x10000A, 0x0000B5,
-	0x113144, 0x0A8D04, 0x000007, 0x080A44,
-	0x129504, 0x000007, 0x0023FD, 0x001020,
-	0x038040, 0x101244, 0x000007, 0x000820,
-	0x039060, 0x018040, 0x0002FD, 0x018042,
-	0x08000A, 0x000904, 0x10FA86, 0x000007,
-	0x003BFD, 0x000100, 0x000A10, 0x0B807A,
-	0x13804A, 0x090984, 0x000007, 0x000095,
-	0x013D04, 0x118086, 0x10000A, 0x100002,
-	0x090984, 0x000007, 0x038042, 0x11804A,
-	0x090D04, 0x000007, 0x10000A, 0x090D84,
-	0x000007, 0x00257D, 0x000820, 0x018040,
-	0x00010D, 0x000810, 0x28143A, 0x00127D,
-	0x018042, 0x20000A, 0x00197D, 0x018042,
-	0x00117D, 0x31804A, 0x10000A, 0x003124,
-	0x01280D, 0x00397D, 0x000820, 0x058040,
-	0x038042, 0x09844A, 0x000606, 0x08040A,
-	0x300102, 0x003124, 0x000424, 0x000424,
-	0x001224, 0x280502, 0x001A4C, 0x130186,
-	0x700002, 0x00002D, 0x030000, 0x00387D,
-	0x018042, 0x10000A, 0x132A06, 0x002124,
-	0x0000AD, 0x100002, 0x00010D, 0x000924,
-	0x006B24, 0x01368D, 0x00397D, 0x000820,
-	0x058040, 0x038042, 0x09844A, 0x000606,
-	0x08040A, 0x003264, 0x00008D, 0x000A24,
-	0x001020, 0x00227D, 0x018040, 0x013C0D,
-	0x000810, 0x08043A, 0x29D206, 0x000007,
-	0x002820, 0x00207D, 0x018040, 0x00117D,
-	0x038042, 0x13804A, 0x33800A, 0x00387D,
-	0x018042, 0x08000A, 0x000904, 0x163A86,
-	0x000007, 0x00008D, 0x030964, 0x01478D,
-	0x00397D, 0x000820, 0x058040, 0x038042,
-	0x09844A, 0x000606, 0x08040A, 0x380102,
-	0x000424, 0x000424, 0x001224, 0x0002FD,
-	0x018042, 0x08000A, 0x000904, 0x14A286,
-	0x000007, 0x280502, 0x001A4C, 0x163986,
-	0x000007, 0x032164, 0x00632C, 0x003DFD,
-	0x018042, 0x08000A, 0x000095, 0x090904,
-	0x000007, 0x000820, 0x001A4C, 0x156186,
-	0x018040, 0x030000, 0x157A06, 0x002124,
-	0x00010D, 0x000924, 0x006B24, 0x015B8D,
-	0x00397D, 0x000820, 0x058040, 0x038042,
-	0x09844A, 0x000606, 0x08040A, 0x003A64,
-	0x000095, 0x001224, 0x0002FD, 0x018042,
-	0x08000A, 0x000904, 0x15DA86, 0x000007,
-	0x01628D, 0x000810, 0x08043A, 0x29D206,
-	0x000007, 0x14D206, 0x000007, 0x007020,
-	0x08010A, 0x10012A, 0x0020FD, 0x038860,
-	0x039060, 0x018040, 0x00227D, 0x018042,
-	0x003DFD, 0x08000A, 0x31844A, 0x000904,
-	0x16D886, 0x18008B, 0x00008D, 0x189904,
-	0x00312C, 0x17AA06, 0x000007, 0x00324C,
-	0x173386, 0x000007, 0x001904, 0x173086,
-	0x000007, 0x000095, 0x199144, 0x00222C,
-	0x003124, 0x00636C, 0x000E3D, 0x001375,
-	0x000BFD, 0x010042, 0x09804A, 0x10000A,
-	0x038AEC, 0x0393EC, 0x00224C, 0x17A986,
-	0x000007, 0x00008D, 0x189904, 0x00226C,
-	0x00322C, 0x30050A, 0x301DAB, 0x002083,
-	0x0018FD, 0x018042, 0x08000A, 0x018924,
-	0x300502, 0x001083, 0x001875, 0x010042,
-	0x10000A, 0x00008D, 0x010924, 0x001375,
-	0x330542, 0x330CCB, 0x332CCB, 0x3334CB,
-	0x333CCB, 0x3344CB, 0x334CCB, 0x3354CB,
-	0x305C8B, 0x006083, 0x0002F5, 0x010042,
-	0x08000A, 0x000904, 0x187A86, 0x000007,
-	0x001E2D, 0x0005FD, 0x018042, 0x08000A,
-	0x028924, 0x280502, 0x00060D, 0x000810,
-	0x280C3A, 0x00008D, 0x000810, 0x28143A,
-	0x0A808D, 0x000820, 0x0002F5, 0x010040,
-	0x220007, 0x001275, 0x030042, 0x21004A,
-	0x00008D, 0x1A0944, 0x000007, 0x01980D,
-	0x000810, 0x08043A, 0x2B2206, 0x000007,
-	0x0001F5, 0x030042, 0x0D004A, 0x10000A,
-	0x089144, 0x000007, 0x000820, 0x010040,
-	0x0025F5, 0x0A3144, 0x000007, 0x000820,
-	0x032860, 0x030040, 0x00217D, 0x038042,
-	0x0B804A, 0x10000A, 0x000820, 0x031060,
-	0x030040, 0x00008D, 0x000124, 0x00012C,
-	0x000E64, 0x001A64, 0x00636C, 0x08010A,
-	0x10012A, 0x000820, 0x031060, 0x030040,
-	0x0020FD, 0x018042, 0x08000A, 0x00227D,
-	0x018042, 0x10000A, 0x000820, 0x031060,
-	0x030040, 0x00197D, 0x018042, 0x08000A,
-	0x0022FD, 0x038042, 0x10000A, 0x000820,
-	0x031060, 0x030040, 0x090D04, 0x000007,
-	0x000820, 0x030040, 0x038042, 0x0B804A,
-	0x10000A, 0x000820, 0x031060, 0x030040,
-	0x038042, 0x13804A, 0x19804A, 0x110D04,
-	0x198D04, 0x000007, 0x08000A, 0x001020,
-	0x031860, 0x030860, 0x030040, 0x00008D,
-	0x0B0944, 0x000007, 0x000820, 0x010040,
-	0x0005F5, 0x030042, 0x08000A, 0x000820,
-	0x010040, 0x0000F5, 0x010042, 0x08000A,
-	0x000904, 0x1C6086, 0x001E75, 0x030042,
-	0x01044A, 0x000C0A, 0x1C7206, 0x000007,
-	0x000402, 0x000C02, 0x00177D, 0x001AF5,
-	0x018042, 0x03144A, 0x031C4A, 0x03244A,
-	0x032C4A, 0x03344A, 0x033C4A, 0x03444A,
-	0x004C0A, 0x00043D, 0x0013F5, 0x001AFD,
-	0x030042, 0x0B004A, 0x1B804A, 0x13804A,
-	0x20000A, 0x089144, 0x19A144, 0x0389E4,
-	0x0399EC, 0x005502, 0x005D0A, 0x030042,
-	0x0B004A, 0x1B804A, 0x13804A, 0x20000A,
-	0x089144, 0x19A144, 0x0389E4, 0x0399EC,
-	0x006502, 0x006D0A, 0x030042, 0x0B004A,
-	0x19004A, 0x2B804A, 0x13804A, 0x21804A,
-	0x30000A, 0x089144, 0x19A144, 0x2AB144,
-	0x0389E4, 0x0399EC, 0x007502, 0x007D0A,
-	0x03A9E4, 0x000702, 0x00107D, 0x000415,
-	0x018042, 0x08000A, 0x0109E4, 0x000F02,
-	0x002AF5, 0x0019FD, 0x010042, 0x09804A,
-	0x10000A, 0x000934, 0x001674, 0x0029F5,
-	0x010042, 0x10000A, 0x00917C, 0x002075,
-	0x010042, 0x08000A, 0x000904, 0x1ED286,
-	0x0026F5, 0x0027F5, 0x030042, 0x09004A,
-	0x10000A, 0x000A3C, 0x00167C, 0x001A75,
-	0x000BFD, 0x010042, 0x51804A, 0x48000A,
-	0x160007, 0x001075, 0x010042, 0x282C0A,
-	0x281D12, 0x282512, 0x001F32, 0x1E0007,
-	0x0E0007, 0x001975, 0x010042, 0x002DF5,
-	0x0D004A, 0x10000A, 0x009144, 0x1FB286,
-	0x010042, 0x28340A, 0x000E5D, 0x00008D,
-	0x000375, 0x000820, 0x010040, 0x05D2F4,
-	0x54D104, 0x00735C, 0x205386, 0x000007,
-	0x0C0007, 0x080007, 0x0A0007, 0x02040D,
-	0x000810, 0x08043A, 0x332206, 0x000007,
-	0x205A06, 0x000007, 0x080007, 0x002275,
-	0x010042, 0x20000A, 0x002104, 0x212086,
-	0x001E2D, 0x0002F5, 0x010042, 0x08000A,
-	0x000904, 0x209286, 0x000007, 0x002010,
-	0x30043A, 0x00057D, 0x0180C3, 0x08000A,
-	0x028924, 0x280502, 0x280C02, 0x0A810D,
-	0x000820, 0x0002F5, 0x010040, 0x220007,
-	0x0004FD, 0x018042, 0x70000A, 0x030000,
-	0x007020, 0x06FA06, 0x018040, 0x02180D,
-	0x000810, 0x08043A, 0x2B2206, 0x000007,
-	0x0002FD, 0x018042, 0x08000A, 0x000904,
-	0x218A86, 0x000007, 0x01F206, 0x000007,
-	0x000875, 0x0009FD, 0x00010D, 0x220A06,
-	0x000295, 0x000B75, 0x00097D, 0x00000D,
-	0x000515, 0x010042, 0x18000A, 0x001904,
-	0x287886, 0x0006F5, 0x001020, 0x010040,
-	0x0004F5, 0x000820, 0x010040, 0x000775,
-	0x010042, 0x09804A, 0x10000A, 0x001124,
-	0x000904, 0x22BA86, 0x000815, 0x080102,
-	0x101204, 0x22DA06, 0x000575, 0x081204,
-	0x000007, 0x100102, 0x000575, 0x000425,
-	0x021124, 0x100102, 0x000820, 0x031060,
-	0x010040, 0x001924, 0x287886, 0x00008D,
-	0x000464, 0x009D04, 0x278886, 0x180102,
-	0x000575, 0x010042, 0x28040A, 0x00018D,
-	0x000924, 0x280D02, 0x00000D, 0x000924,
-	0x281502, 0x10000D, 0x000820, 0x0002F5,
-	0x010040, 0x200007, 0x001175, 0x0002FD,
-	0x018042, 0x08000A, 0x000904, 0x23C286,
-	0x000007, 0x000100, 0x080B20, 0x130B60,
-	0x1B0B60, 0x030A60, 0x010040, 0x050042,
-	0x3D004A, 0x35004A, 0x2D004A, 0x20000A,
-	0x0006F5, 0x010042, 0x28140A, 0x0004F5,
-	0x010042, 0x08000A, 0x000315, 0x010D04,
-	0x24CA86, 0x004015, 0x000095, 0x010D04,
-	0x24B886, 0x100022, 0x10002A, 0x24E206,
-	0x000007, 0x333104, 0x2AA904, 0x000007,
-	0x032124, 0x280502, 0x001124, 0x000424,
-	0x000424, 0x003224, 0x00292C, 0x00636C,
-	0x25F386, 0x000007, 0x02B164, 0x000464,
-	0x000464, 0x00008D, 0x000A64, 0x280D02,
-	0x10008D, 0x000820, 0x0002F5, 0x010040,
-	0x220007, 0x00008D, 0x38B904, 0x000007,
-	0x03296C, 0x30010A, 0x0002F5, 0x010042,
-	0x08000A, 0x000904, 0x25BA86, 0x000007,
-	0x02312C, 0x28050A, 0x00008D, 0x01096C,
-	0x280D0A, 0x10010D, 0x000820, 0x0002F5,
-	0x010040, 0x220007, 0x001124, 0x000424,
-	0x000424, 0x003224, 0x300102, 0x032944,
-	0x267A86, 0x000007, 0x300002, 0x0004F5,
-	0x010042, 0x08000A, 0x000315, 0x010D04,
-	0x26C086, 0x003124, 0x000464, 0x300102,
-	0x0002F5, 0x010042, 0x08000A, 0x000904,
-	0x26CA86, 0x000007, 0x003124, 0x300502,
-	0x003924, 0x300583, 0x000883, 0x0005F5,
-	0x010042, 0x28040A, 0x00008D, 0x008124,
-	0x280D02, 0x00008D, 0x008124, 0x281502,
-	0x10018D, 0x000820, 0x0002F5, 0x010040,
-	0x220007, 0x001025, 0x000575, 0x030042,
-	0x09004A, 0x10000A, 0x0A0904, 0x121104,
-	0x000007, 0x001020, 0x050860, 0x050040,
-	0x0006FD, 0x018042, 0x09004A, 0x10000A,
-	0x0000A5, 0x0A0904, 0x121104, 0x000007,
-	0x000820, 0x019060, 0x010040, 0x0002F5,
-	0x010042, 0x08000A, 0x000904, 0x284286,
-	0x000007, 0x230A06, 0x000007, 0x000606,
-	0x000007, 0x0002F5, 0x010042, 0x08000A,
-	0x000904, 0x289286, 0x000007, 0x000100,
-	0x080B20, 0x138B60, 0x1B8B60, 0x238B60,
-	0x2B8B60, 0x338B60, 0x3B8B60, 0x438B60,
-	0x4B8B60, 0x538B60, 0x5B8B60, 0x638B60,
-	0x6B8B60, 0x738B60, 0x7B8B60, 0x038F60,
-	0x0B8F60, 0x138F60, 0x1B8F60, 0x238F60,
-	0x2B8F60, 0x338F60, 0x3B8F60, 0x438F60,
-	0x4B8F60, 0x538F60, 0x5B8F60, 0x638F60,
-	0x6B8F60, 0x738F60, 0x7B8F60, 0x038A60,
-	0x000606, 0x018040, 0x00008D, 0x000A64,
-	0x280D02, 0x000A24, 0x00027D, 0x018042,
-	0x10000A, 0x001224, 0x0003FD, 0x018042,
-	0x08000A, 0x000904, 0x2A8286, 0x000007,
-	0x00018D, 0x000A24, 0x000464, 0x000464,
-	0x080102, 0x000924, 0x000424, 0x000424,
-	0x100102, 0x02000D, 0x009144, 0x2AD986,
-	0x000007, 0x0001FD, 0x018042, 0x08000A,
-	0x000A44, 0x2ABB86, 0x018042, 0x0A000D,
-	0x000820, 0x0002FD, 0x018040, 0x200007,
-	0x00027D, 0x001020, 0x000606, 0x018040,
-	0x0002F5, 0x010042, 0x08000A, 0x000904,
-	0x2B2A86, 0x000007, 0x00037D, 0x018042,
-	0x08000A, 0x000904, 0x2B5A86, 0x000007,
-	0x000075, 0x002E7D, 0x010042, 0x0B804A,
-	0x000020, 0x000904, 0x000686, 0x010040,
-	0x31844A, 0x30048B, 0x000883, 0x00008D,
-	0x000810, 0x28143A, 0x00008D, 0x000810,
-	0x280C3A, 0x000675, 0x010042, 0x08000A,
-	0x003815, 0x010924, 0x280502, 0x0B000D,
-	0x000820, 0x0002F5, 0x010040, 0x000606,
-	0x220007, 0x000464, 0x000464, 0x000606,
-	0x000007, 0x000134, 0x007F8D, 0x00093C,
-	0x281D12, 0x282512, 0x001F32, 0x0E0007,
-	0x00010D, 0x00037D, 0x000820, 0x018040,
-	0x05D2F4, 0x000007, 0x080007, 0x00037D,
-	0x018042, 0x08000A, 0x000904, 0x2D0286,
-	0x000007, 0x000606, 0x000007, 0x000007,
-	0x000012, 0x100007, 0x320007, 0x600007,
-	0x100080, 0x48001A, 0x004904, 0x2D6186,
-	0x000007, 0x001210, 0x58003A, 0x000145,
-	0x5C5D04, 0x000007, 0x000080, 0x48001A,
-	0x004904, 0x2DB186, 0x000007, 0x001210,
-	0x50003A, 0x005904, 0x2E0886, 0x000045,
-	0x0000C5, 0x7FFFF5, 0x7FFF7D, 0x07D524,
-	0x004224, 0x500102, 0x200502, 0x000082,
-	0x40001A, 0x004104, 0x2E3986, 0x000007,
-	0x003865, 0x40001A, 0x004020, 0x00104D,
-	0x04C184, 0x301B86, 0x000040, 0x040007,
-	0x000165, 0x000145, 0x004020, 0x000040,
-	0x000765, 0x080080, 0x40001A, 0x004104,
-	0x2EC986, 0x000007, 0x001210, 0x40003A,
-	0x004104, 0x2F2286, 0x00004D, 0x0000CD,
-	0x004810, 0x20043A, 0x000882, 0x40001A,
-	0x004104, 0x2F3186, 0x000007, 0x004820,
-	0x005904, 0x300886, 0x000040, 0x0007E5,
-	0x200480, 0x2816A0, 0x3216E0, 0x3A16E0,
-	0x4216E0, 0x021260, 0x000040, 0x000032,
-	0x400075, 0x00007D, 0x07D574, 0x200512,
-	0x000082, 0x40001A, 0x004104, 0x2FE186,
-	0x000007, 0x037206, 0x640007, 0x060007,
-	0x0000E5, 0x000020, 0x000040, 0x000A65,
-	0x000020, 0x020040, 0x020040, 0x000040,
-	0x000165, 0x000042, 0x70000A, 0x007104,
-	0x30A286, 0x000007, 0x018206, 0x640007,
-	0x050000, 0x007020, 0x000040, 0x037206,
-	0x640007, 0x000007, 0x00306D, 0x028860,
-	0x029060, 0x08000A, 0x028860, 0x008040,
-	0x100012, 0x00100D, 0x009184, 0x314186,
-	0x000E0D, 0x009184, 0x325186, 0x000007,
-	0x300007, 0x001020, 0x003B6D, 0x008040,
-	0x000080, 0x08001A, 0x000904, 0x316186,
-	0x000007, 0x001220, 0x000DED, 0x008040,
-	0x008042, 0x10000A, 0x40000D, 0x109544,
-	0x000007, 0x001020, 0x000DED, 0x008040,
-	0x008042, 0x20040A, 0x000082, 0x08001A,
-	0x000904, 0x31F186, 0x000007, 0x003B6D,
-	0x008042, 0x08000A, 0x000E15, 0x010984,
-	0x329B86, 0x600007, 0x08001A, 0x000C15,
-	0x010984, 0x328386, 0x000020, 0x1A0007,
-	0x0002ED, 0x008040, 0x620007, 0x00306D,
-	0x028042, 0x0A804A, 0x000820, 0x0A804A,
-	0x000606, 0x10804A, 0x000007, 0x282512,
-	0x001F32, 0x05D2F4, 0x54D104, 0x00735C,
-	0x000786, 0x000007, 0x0C0007, 0x0A0007,
-	0x1C0007, 0x003465, 0x020040, 0x004820,
-	0x025060, 0x40000A, 0x024060, 0x000040,
-	0x454944, 0x000007, 0x004020, 0x003AE5,
-	0x000040, 0x0028E5, 0x000042, 0x48000A,
-	0x004904, 0x386886, 0x002C65, 0x000042,
-	0x40000A, 0x0000D5, 0x454104, 0x000007,
-	0x000655, 0x054504, 0x34F286, 0x0001D5,
-	0x054504, 0x34F086, 0x002B65, 0x000042,
-	0x003AE5, 0x50004A, 0x40000A, 0x45C3D4,
-	0x000007, 0x454504, 0x000007, 0x0000CD,
-	0x444944, 0x000007, 0x454504, 0x000007,
-	0x00014D, 0x554944, 0x000007, 0x045144,
-	0x34E986, 0x002C65, 0x000042, 0x48000A,
-	0x4CD104, 0x000007, 0x04C144, 0x34F386,
-	0x000007, 0x160007, 0x002CE5, 0x040042,
-	0x40000A, 0x004020, 0x000040, 0x002965,
-	0x000042, 0x40000A, 0x004104, 0x356086,
-	0x000007, 0x002402, 0x36A206, 0x005C02,
-	0x0025E5, 0x000042, 0x40000A, 0x004274,
-	0x002AE5, 0x000042, 0x40000A, 0x004274,
-	0x500112, 0x0029E5, 0x000042, 0x40000A,
-	0x004234, 0x454104, 0x000007, 0x004020,
-	0x000040, 0x003EE5, 0x000020, 0x000040,
-	0x002DE5, 0x400152, 0x50000A, 0x045144,
-	0x364A86, 0x0000C5, 0x003EE5, 0x004020,
-	0x000040, 0x002BE5, 0x000042, 0x40000A,
-	0x404254, 0x000007, 0x002AE5, 0x004020,
-	0x000040, 0x500132, 0x040134, 0x005674,
-	0x0029E5, 0x020042, 0x42000A, 0x000042,
-	0x50000A, 0x05417C, 0x0028E5, 0x000042,
-	0x48000A, 0x0000C5, 0x4CC144, 0x371086,
-	0x0026E5, 0x0027E5, 0x020042, 0x40004A,
-	0x50000A, 0x00423C, 0x00567C, 0x0028E5,
-	0x004820, 0x000040, 0x281D12, 0x282512,
-	0x001F72, 0x002965, 0x000042, 0x40000A,
-	0x004104, 0x37AA86, 0x0E0007, 0x160007,
-	0x1E0007, 0x003EE5, 0x000042, 0x40000A,
-	0x004104, 0x37E886, 0x002D65, 0x000042,
-	0x28340A, 0x003465, 0x020042, 0x42004A,
-	0x004020, 0x4A004A, 0x50004A, 0x05D2F4,
-	0x54D104, 0x00735C, 0x385186, 0x000007,
-	0x000606, 0x080007, 0x0C0007, 0x080007,
-	0x0A0007, 0x0001E5, 0x020045, 0x004020,
-	0x000060, 0x000365, 0x000040, 0x002E65,
-	0x001A20, 0x0A1A60, 0x000040, 0x003465,
-	0x020042, 0x42004A, 0x004020, 0x4A004A,
-	0x000606, 0x50004A, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000
-};
-
-// --------------------------------------------
-//  DS-1E Controller InstructionRAM Code
-//	1999/06/21
-//	Buf441 slot is Enabled.
-// --------------------------------------------
-// 04/09?@creat
-// 04/12  stop nise fix
-// 06/21?@WorkingOff timming
-static unsigned long int	CntrlInst1E[] __initdata = {
-	0x000007, 0x240007, 0x0C0007, 0x1C0007,
-	0x060007, 0x700002, 0x000020, 0x030040,
-	0x007104, 0x004286, 0x030040, 0x000F0D,
-	0x000810, 0x20043A, 0x000282, 0x00020D,
-	0x000810, 0x20043A, 0x001282, 0x200E82,
-	0x00800D, 0x000810, 0x20043A, 0x001A82,
-	0x03460D, 0x000810, 0x10043A, 0x02EC0D,
-	0x000810, 0x18043A, 0x00010D, 0x020015,
-	0x0000FD, 0x000020, 0x038860, 0x039060,
-	0x038060, 0x038040, 0x038040, 0x038040,
-	0x018040, 0x000A7D, 0x038040, 0x038040,
-	0x018040, 0x200402, 0x000882, 0x08001A,
-	0x000904, 0x017186, 0x000007, 0x260007,
-	0x400007, 0x000007, 0x03258D, 0x000810,
-	0x18043A, 0x260007, 0x284402, 0x00087D,
-	0x018042, 0x00160A, 0x05A206, 0x000007,
-	0x440007, 0x00230D, 0x000810, 0x08043A,
-	0x22FA06, 0x000007, 0x0007FD, 0x018042,
-	0x08000A, 0x000904, 0x02AB86, 0x000195,
-	0x090D04, 0x000007, 0x000820, 0x0000F5,
-	0x000B7D, 0x01F060, 0x0000FD, 0x033A06,
-	0x018040, 0x000A7D, 0x038042, 0x13804A,
-	0x18000A, 0x001820, 0x059060, 0x058860,
-	0x018040, 0x0000FD, 0x018042, 0x70000A,
-	0x000115, 0x071144, 0x033B86, 0x030000,
-	0x007020, 0x036206, 0x018040, 0x00360D,
-	0x000810, 0x08043A, 0x232206, 0x000007,
-	0x02EC0D, 0x000810, 0x18043A, 0x019A06,
-	0x000007, 0x240007, 0x000F8D, 0x000810,
-	0x00163A, 0x002402, 0x005C02, 0x0028FD,
-	0x000020, 0x018040, 0x08000D, 0x000815,
-	0x510984, 0x000007, 0x00004D, 0x000E5D,
-	0x000E02, 0x00430D, 0x000810, 0x08043A,
-	0x2E1206, 0x000007, 0x00008D, 0x000924,
-	0x000F02, 0x00470D, 0x000810, 0x08043A,
-	0x2E1206, 0x000007, 0x480480, 0x001210,
-	0x28043A, 0x00778D, 0x000810, 0x280C3A,
-	0x00068D, 0x000810, 0x28143A, 0x284402,
-	0x03258D, 0x000810, 0x18043A, 0x07FF8D,
-	0x000820, 0x0002FD, 0x018040, 0x260007,
-	0x200007, 0x0002FD, 0x018042, 0x08000A,
-	0x000904, 0x051286, 0x000007, 0x240007,
-	0x02EC0D, 0x000810, 0x18043A, 0x00387D,
-	0x018042, 0x08000A, 0x001015, 0x010984,
-	0x019B86, 0x000007, 0x01B206, 0x000007,
-	0x0008FD, 0x018042, 0x18000A, 0x001904,
-	0x22B886, 0x280007, 0x001810, 0x28043A,
-	0x280C02, 0x00000D, 0x000810, 0x28143A,
-	0x08808D, 0x000820, 0x0002FD, 0x018040,
-	0x200007, 0x00020D, 0x189904, 0x000007,
-	0x00402D, 0x0000BD, 0x0002FD, 0x018042,
-	0x08000A, 0x000904, 0x065A86, 0x000007,
-	0x000100, 0x000A20, 0x00047D, 0x018040,
-	0x018042, 0x20000A, 0x003015, 0x012144,
-	0x036186, 0x000007, 0x002104, 0x036186,
-	0x000007, 0x000F8D, 0x000810, 0x280C3A,
-	0x023944, 0x07C986, 0x000007, 0x001810,
-	0x28043A, 0x08810D, 0x000820, 0x0002FD,
-	0x018040, 0x200007, 0x002810, 0x78003A,
-	0x00788D, 0x000810, 0x08043A, 0x2A1206,
-	0x000007, 0x00400D, 0x001015, 0x189904,
-	0x292904, 0x393904, 0x000007, 0x070206,
-	0x000007, 0x0004F5, 0x00007D, 0x000020,
-	0x00008D, 0x010860, 0x018040, 0x00047D,
-	0x038042, 0x21804A, 0x18000A, 0x021944,
-	0x229086, 0x000007, 0x004075, 0x71F104,
-	0x000007, 0x010042, 0x28000A, 0x002904,
-	0x225886, 0x000007, 0x003C0D, 0x30A904,
-	0x000007, 0x00077D, 0x018042, 0x08000A,
-	0x000904, 0x08DA86, 0x00057D, 0x002820,
-	0x03B060, 0x08F206, 0x018040, 0x003020,
-	0x03A860, 0x018040, 0x0002FD, 0x018042,
-	0x08000A, 0x000904, 0x08FA86, 0x000007,
-	0x00057D, 0x018042, 0x28040A, 0x000E8D,
-	0x000810, 0x280C3A, 0x00000D, 0x000810,
-	0x28143A, 0x09000D, 0x000820, 0x0002FD,
-	0x018040, 0x200007, 0x003DFD, 0x000020,
-	0x018040, 0x00107D, 0x009D8D, 0x000810,
-	0x08043A, 0x2A1206, 0x000007, 0x000815,
-	0x08001A, 0x010984, 0x0A5186, 0x00137D,
-	0x200500, 0x280F20, 0x338F60, 0x3B8F60,
-	0x438F60, 0x4B8F60, 0x538F60, 0x5B8F60,
-	0x038A60, 0x018040, 0x00107D, 0x018042,
-	0x08000A, 0x000215, 0x010984, 0x3A8186,
-	0x000007, 0x007FBD, 0x383DC4, 0x000007,
-	0x001A7D, 0x001375, 0x018042, 0x09004A,
-	0x10000A, 0x0B8D04, 0x139504, 0x000007,
-	0x000820, 0x019060, 0x001104, 0x225886,
-	0x010040, 0x0017FD, 0x018042, 0x08000A,
-	0x000904, 0x225A86, 0x000007, 0x00197D,
-	0x038042, 0x09804A, 0x10000A, 0x000924,
-	0x001664, 0x0011FD, 0x038042, 0x2B804A,
-	0x19804A, 0x00008D, 0x218944, 0x000007,
-	0x002244, 0x0C1986, 0x000007, 0x001A64,
-	0x002A24, 0x00197D, 0x080102, 0x100122,
-	0x000820, 0x039060, 0x018040, 0x003DFD,
-	0x00008D, 0x000820, 0x018040, 0x001375,
-	0x001A7D, 0x010042, 0x09804A, 0x10000A,
-	0x00021D, 0x0189E4, 0x2992E4, 0x309144,
-	0x000007, 0x00060D, 0x000A15, 0x000C1D,
-	0x001025, 0x00A9E4, 0x012BE4, 0x000464,
-	0x01B3E4, 0x0232E4, 0x000464, 0x000464,
-	0x000464, 0x000464, 0x00040D, 0x08B1C4,
-	0x000007, 0x000820, 0x000BF5, 0x030040,
-	0x00197D, 0x038042, 0x09804A, 0x000A24,
-	0x08000A, 0x080E64, 0x000007, 0x100122,
-	0x000820, 0x031060, 0x010040, 0x0064AC,
-	0x00027D, 0x000020, 0x018040, 0x00107D,
-	0x018042, 0x0011FD, 0x3B804A, 0x09804A,
-	0x20000A, 0x000095, 0x1A1144, 0x00A144,
-	0x0E5886, 0x00040D, 0x00B984, 0x0E5986,
-	0x0018FD, 0x018042, 0x0010FD, 0x09804A,
-	0x28000A, 0x000095, 0x010924, 0x002A64,
-	0x0E4986, 0x000007, 0x002904, 0x0E5A86,
-	0x000007, 0x0E6206, 0x080002, 0x00008D,
-	0x00387D, 0x000820, 0x018040, 0x00127D,
-	0x018042, 0x10000A, 0x003904, 0x0F0986,
-	0x00080D, 0x7FFFB5, 0x00B984, 0x0ED986,
-	0x000025, 0x0FB206, 0x00002D, 0x000015,
-	0x00082D, 0x02E00D, 0x000820, 0x0FFA06,
-	0x00000D, 0x7F8035, 0x00B984, 0x0FA986,
-	0x400025, 0x00008D, 0x110944, 0x000007,
-	0x00018D, 0x109504, 0x000007, 0x009164,
-	0x000424, 0x000424, 0x000424, 0x100102,
-	0x280002, 0x02DF0D, 0x000820, 0x0FFA06,
-	0x00018D, 0x00042D, 0x00008D, 0x109504,
-	0x000007, 0x00020D, 0x109184, 0x000007,
-	0x02DF8D, 0x000820, 0x00008D, 0x0038FD,
-	0x018040, 0x003BFD, 0x001020, 0x03A860,
-	0x000815, 0x313184, 0x212184, 0x000007,
-	0x03B060, 0x03A060, 0x018040, 0x0022FD,
-	0x000095, 0x010924, 0x000424, 0x000424,
-	0x001264, 0x100102, 0x000820, 0x039060,
-	0x018040, 0x001924, 0x010F0D, 0x00397D,
-	0x000820, 0x058040, 0x038042, 0x09844A,
-	0x000606, 0x08040A, 0x000424, 0x000424,
-	0x00117D, 0x018042, 0x08000A, 0x000A24,
-	0x280502, 0x280C02, 0x09800D, 0x000820,
-	0x0002FD, 0x018040, 0x200007, 0x0022FD,
-	0x018042, 0x08000A, 0x000095, 0x280DC4,
-	0x011924, 0x00197D, 0x018042, 0x0011FD,
-	0x09804A, 0x10000A, 0x0000B5, 0x113144,
-	0x0A8D04, 0x000007, 0x080A44, 0x129504,
-	0x000007, 0x0023FD, 0x001020, 0x038040,
-	0x101244, 0x000007, 0x000820, 0x039060,
-	0x018040, 0x0002FD, 0x018042, 0x08000A,
-	0x000904, 0x123286, 0x000007, 0x003BFD,
-	0x000100, 0x000A10, 0x0B807A, 0x13804A,
-	0x090984, 0x000007, 0x000095, 0x013D04,
-	0x12B886, 0x10000A, 0x100002, 0x090984,
-	0x000007, 0x038042, 0x11804A, 0x090D04,
-	0x000007, 0x10000A, 0x090D84, 0x000007,
-	0x00257D, 0x000820, 0x018040, 0x00010D,
-	0x000810, 0x28143A, 0x00127D, 0x018042,
-	0x20000A, 0x00197D, 0x018042, 0x00117D,
-	0x31804A, 0x10000A, 0x003124, 0x013B8D,
-	0x00397D, 0x000820, 0x058040, 0x038042,
-	0x09844A, 0x000606, 0x08040A, 0x300102,
-	0x003124, 0x000424, 0x000424, 0x001224,
-	0x280502, 0x001A4C, 0x143986, 0x700002,
-	0x00002D, 0x030000, 0x00387D, 0x018042,
-	0x10000A, 0x146206, 0x002124, 0x0000AD,
-	0x100002, 0x00010D, 0x000924, 0x006B24,
-	0x014A0D, 0x00397D, 0x000820, 0x058040,
-	0x038042, 0x09844A, 0x000606, 0x08040A,
-	0x003264, 0x00008D, 0x000A24, 0x001020,
-	0x00227D, 0x018040, 0x014F8D, 0x000810,
-	0x08043A, 0x2B5A06, 0x000007, 0x002820,
-	0x00207D, 0x018040, 0x00117D, 0x038042,
-	0x13804A, 0x33800A, 0x00387D, 0x018042,
-	0x08000A, 0x000904, 0x177286, 0x000007,
-	0x00008D, 0x030964, 0x015B0D, 0x00397D,
-	0x000820, 0x058040, 0x038042, 0x09844A,
-	0x000606, 0x08040A, 0x380102, 0x000424,
-	0x000424, 0x001224, 0x0002FD, 0x018042,
-	0x08000A, 0x000904, 0x15DA86, 0x000007,
-	0x280502, 0x001A4C, 0x177186, 0x000007,
-	0x032164, 0x00632C, 0x003DFD, 0x018042,
-	0x08000A, 0x000095, 0x090904, 0x000007,
-	0x000820, 0x001A4C, 0x169986, 0x018040,
-	0x030000, 0x16B206, 0x002124, 0x00010D,
-	0x000924, 0x006B24, 0x016F0D, 0x00397D,
-	0x000820, 0x058040, 0x038042, 0x09844A,
-	0x000606, 0x08040A, 0x003A64, 0x000095,
-	0x001224, 0x0002FD, 0x018042, 0x08000A,
-	0x000904, 0x171286, 0x000007, 0x01760D,
-	0x000810, 0x08043A, 0x2B5A06, 0x000007,
-	0x160A06, 0x000007, 0x007020, 0x08010A,
-	0x10012A, 0x0020FD, 0x038860, 0x039060,
-	0x018040, 0x00227D, 0x018042, 0x003DFD,
-	0x08000A, 0x31844A, 0x000904, 0x181086,
-	0x18008B, 0x00008D, 0x189904, 0x00312C,
-	0x18E206, 0x000007, 0x00324C, 0x186B86,
-	0x000007, 0x001904, 0x186886, 0x000007,
-	0x000095, 0x199144, 0x00222C, 0x003124,
-	0x00636C, 0x000E3D, 0x001375, 0x000BFD,
-	0x010042, 0x09804A, 0x10000A, 0x038AEC,
-	0x0393EC, 0x00224C, 0x18E186, 0x000007,
-	0x00008D, 0x189904, 0x00226C, 0x00322C,
-	0x30050A, 0x301DAB, 0x002083, 0x0018FD,
-	0x018042, 0x08000A, 0x018924, 0x300502,
-	0x001083, 0x001875, 0x010042, 0x10000A,
-	0x00008D, 0x010924, 0x001375, 0x330542,
-	0x330CCB, 0x332CCB, 0x3334CB, 0x333CCB,
-	0x3344CB, 0x334CCB, 0x3354CB, 0x305C8B,
-	0x006083, 0x0002F5, 0x010042, 0x08000A,
-	0x000904, 0x19B286, 0x000007, 0x001E2D,
-	0x0005FD, 0x018042, 0x08000A, 0x028924,
-	0x280502, 0x00060D, 0x000810, 0x280C3A,
-	0x00008D, 0x000810, 0x28143A, 0x0A808D,
-	0x000820, 0x0002F5, 0x010040, 0x220007,
-	0x001275, 0x030042, 0x21004A, 0x00008D,
-	0x1A0944, 0x000007, 0x01AB8D, 0x000810,
-	0x08043A, 0x2CAA06, 0x000007, 0x0001F5,
-	0x030042, 0x0D004A, 0x10000A, 0x089144,
-	0x000007, 0x000820, 0x010040, 0x0025F5,
-	0x0A3144, 0x000007, 0x000820, 0x032860,
-	0x030040, 0x00217D, 0x038042, 0x0B804A,
-	0x10000A, 0x000820, 0x031060, 0x030040,
-	0x00008D, 0x000124, 0x00012C, 0x000E64,
-	0x001A64, 0x00636C, 0x08010A, 0x10012A,
-	0x000820, 0x031060, 0x030040, 0x0020FD,
-	0x018042, 0x08000A, 0x00227D, 0x018042,
-	0x10000A, 0x000820, 0x031060, 0x030040,
-	0x00197D, 0x018042, 0x08000A, 0x0022FD,
-	0x038042, 0x10000A, 0x000820, 0x031060,
-	0x030040, 0x090D04, 0x000007, 0x000820,
-	0x030040, 0x038042, 0x0B804A, 0x10000A,
-	0x000820, 0x031060, 0x030040, 0x038042,
-	0x13804A, 0x19804A, 0x110D04, 0x198D04,
-	0x000007, 0x08000A, 0x001020, 0x031860,
-	0x030860, 0x030040, 0x00008D, 0x0B0944,
-	0x000007, 0x000820, 0x010040, 0x0005F5,
-	0x030042, 0x08000A, 0x000820, 0x010040,
-	0x0000F5, 0x010042, 0x08000A, 0x000904,
-	0x1D9886, 0x001E75, 0x030042, 0x01044A,
-	0x000C0A, 0x1DAA06, 0x000007, 0x000402,
-	0x000C02, 0x00177D, 0x001AF5, 0x018042,
-	0x03144A, 0x031C4A, 0x03244A, 0x032C4A,
-	0x03344A, 0x033C4A, 0x03444A, 0x004C0A,
-	0x00043D, 0x0013F5, 0x001AFD, 0x030042,
-	0x0B004A, 0x1B804A, 0x13804A, 0x20000A,
-	0x089144, 0x19A144, 0x0389E4, 0x0399EC,
-	0x005502, 0x005D0A, 0x030042, 0x0B004A,
-	0x1B804A, 0x13804A, 0x20000A, 0x089144,
-	0x19A144, 0x0389E4, 0x0399EC, 0x006502,
-	0x006D0A, 0x030042, 0x0B004A, 0x19004A,
-	0x2B804A, 0x13804A, 0x21804A, 0x30000A,
-	0x089144, 0x19A144, 0x2AB144, 0x0389E4,
-	0x0399EC, 0x007502, 0x007D0A, 0x03A9E4,
-	0x000702, 0x00107D, 0x000415, 0x018042,
-	0x08000A, 0x0109E4, 0x000F02, 0x002AF5,
-	0x0019FD, 0x010042, 0x09804A, 0x10000A,
-	0x000934, 0x001674, 0x0029F5, 0x010042,
-	0x10000A, 0x00917C, 0x002075, 0x010042,
-	0x08000A, 0x000904, 0x200A86, 0x0026F5,
-	0x0027F5, 0x030042, 0x09004A, 0x10000A,
-	0x000A3C, 0x00167C, 0x001A75, 0x000BFD,
-	0x010042, 0x51804A, 0x48000A, 0x160007,
-	0x001075, 0x010042, 0x282C0A, 0x281D12,
-	0x282512, 0x001F32, 0x1E0007, 0x0E0007,
-	0x001975, 0x010042, 0x002DF5, 0x0D004A,
-	0x10000A, 0x009144, 0x20EA86, 0x010042,
-	0x28340A, 0x000E5D, 0x00008D, 0x000375,
-	0x000820, 0x010040, 0x05D2F4, 0x54D104,
-	0x00735C, 0x218B86, 0x000007, 0x0C0007,
-	0x080007, 0x0A0007, 0x02178D, 0x000810,
-	0x08043A, 0x34B206, 0x000007, 0x219206,
-	0x000007, 0x080007, 0x002275, 0x010042,
-	0x20000A, 0x002104, 0x225886, 0x001E2D,
-	0x0002F5, 0x010042, 0x08000A, 0x000904,
-	0x21CA86, 0x000007, 0x002010, 0x30043A,
-	0x00057D, 0x0180C3, 0x08000A, 0x028924,
-	0x280502, 0x280C02, 0x0A810D, 0x000820,
-	0x0002F5, 0x010040, 0x220007, 0x0004FD,
-	0x018042, 0x70000A, 0x030000, 0x007020,
-	0x07FA06, 0x018040, 0x022B8D, 0x000810,
-	0x08043A, 0x2CAA06, 0x000007, 0x0002FD,
-	0x018042, 0x08000A, 0x000904, 0x22C286,
-	0x000007, 0x020206, 0x000007, 0x000875,
-	0x0009FD, 0x00010D, 0x234206, 0x000295,
-	0x000B75, 0x00097D, 0x00000D, 0x000515,
-	0x010042, 0x18000A, 0x001904, 0x2A0086,
-	0x0006F5, 0x001020, 0x010040, 0x0004F5,
-	0x000820, 0x010040, 0x000775, 0x010042,
-	0x09804A, 0x10000A, 0x001124, 0x000904,
-	0x23F286, 0x000815, 0x080102, 0x101204,
-	0x241206, 0x000575, 0x081204, 0x000007,
-	0x100102, 0x000575, 0x000425, 0x021124,
-	0x100102, 0x000820, 0x031060, 0x010040,
-	0x001924, 0x2A0086, 0x00008D, 0x000464,
-	0x009D04, 0x291086, 0x180102, 0x000575,
-	0x010042, 0x28040A, 0x00018D, 0x000924,
-	0x280D02, 0x00000D, 0x000924, 0x281502,
-	0x10000D, 0x000820, 0x0002F5, 0x010040,
-	0x200007, 0x001175, 0x0002FD, 0x018042,
-	0x08000A, 0x000904, 0x24FA86, 0x000007,
-	0x000100, 0x080B20, 0x130B60, 0x1B0B60,
-	0x030A60, 0x010040, 0x050042, 0x3D004A,
-	0x35004A, 0x2D004A, 0x20000A, 0x0006F5,
-	0x010042, 0x28140A, 0x0004F5, 0x010042,
-	0x08000A, 0x000315, 0x010D04, 0x260286,
-	0x004015, 0x000095, 0x010D04, 0x25F086,
-	0x100022, 0x10002A, 0x261A06, 0x000007,
-	0x333104, 0x2AA904, 0x000007, 0x032124,
-	0x280502, 0x284402, 0x001124, 0x400102,
-	0x000424, 0x000424, 0x003224, 0x00292C,
-	0x00636C, 0x277386, 0x000007, 0x02B164,
-	0x000464, 0x000464, 0x00008D, 0x000A64,
-	0x280D02, 0x10008D, 0x000820, 0x0002F5,
-	0x010040, 0x220007, 0x00008D, 0x38B904,
-	0x000007, 0x03296C, 0x30010A, 0x0002F5,
-	0x010042, 0x08000A, 0x000904, 0x270286,
-	0x000007, 0x00212C, 0x28050A, 0x00316C,
-	0x00046C, 0x00046C, 0x28450A, 0x001124,
-	0x006B64, 0x100102, 0x00008D, 0x01096C,
-	0x280D0A, 0x10010D, 0x000820, 0x0002F5,
-	0x010040, 0x220007, 0x004124, 0x000424,
-	0x000424, 0x003224, 0x300102, 0x032944,
-	0x27FA86, 0x000007, 0x300002, 0x0004F5,
-	0x010042, 0x08000A, 0x000315, 0x010D04,
-	0x284086, 0x003124, 0x000464, 0x300102,
-	0x0002F5, 0x010042, 0x08000A, 0x000904,
-	0x284A86, 0x000007, 0x284402, 0x003124,
-	0x300502, 0x003924, 0x300583, 0x000883,
-	0x0005F5, 0x010042, 0x28040A, 0x00008D,
-	0x008124, 0x280D02, 0x00008D, 0x008124,
-	0x281502, 0x10018D, 0x000820, 0x0002F5,
-	0x010040, 0x220007, 0x001025, 0x000575,
-	0x030042, 0x09004A, 0x10000A, 0x0A0904,
-	0x121104, 0x000007, 0x001020, 0x050860,
-	0x050040, 0x0006FD, 0x018042, 0x09004A,
-	0x10000A, 0x0000A5, 0x0A0904, 0x121104,
-	0x000007, 0x000820, 0x019060, 0x010040,
-	0x0002F5, 0x010042, 0x08000A, 0x000904,
-	0x29CA86, 0x000007, 0x244206, 0x000007,
-	0x000606, 0x000007, 0x0002F5, 0x010042,
-	0x08000A, 0x000904, 0x2A1A86, 0x000007,
-	0x000100, 0x080B20, 0x138B60, 0x1B8B60,
-	0x238B60, 0x2B8B60, 0x338B60, 0x3B8B60,
-	0x438B60, 0x4B8B60, 0x538B60, 0x5B8B60,
-	0x638B60, 0x6B8B60, 0x738B60, 0x7B8B60,
-	0x038F60, 0x0B8F60, 0x138F60, 0x1B8F60,
-	0x238F60, 0x2B8F60, 0x338F60, 0x3B8F60,
-	0x438F60, 0x4B8F60, 0x538F60, 0x5B8F60,
-	0x638F60, 0x6B8F60, 0x738F60, 0x7B8F60,
-	0x038A60, 0x000606, 0x018040, 0x00008D,
-	0x000A64, 0x280D02, 0x000A24, 0x00027D,
-	0x018042, 0x10000A, 0x001224, 0x0003FD,
-	0x018042, 0x08000A, 0x000904, 0x2C0A86,
-	0x000007, 0x00018D, 0x000A24, 0x000464,
-	0x000464, 0x080102, 0x000924, 0x000424,
-	0x000424, 0x100102, 0x02000D, 0x009144,
-	0x2C6186, 0x000007, 0x0001FD, 0x018042,
-	0x08000A, 0x000A44, 0x2C4386, 0x018042,
-	0x0A000D, 0x000820, 0x0002FD, 0x018040,
-	0x200007, 0x00027D, 0x001020, 0x000606,
-	0x018040, 0x0002F5, 0x010042, 0x08000A,
-	0x000904, 0x2CB286, 0x000007, 0x00037D,
-	0x018042, 0x08000A, 0x000904, 0x2CE286,
-	0x000007, 0x000075, 0x002E7D, 0x010042,
-	0x0B804A, 0x000020, 0x000904, 0x000686,
-	0x010040, 0x31844A, 0x30048B, 0x000883,
-	0x00008D, 0x000810, 0x28143A, 0x00008D,
-	0x000810, 0x280C3A, 0x000675, 0x010042,
-	0x08000A, 0x003815, 0x010924, 0x280502,
-	0x0B000D, 0x000820, 0x0002F5, 0x010040,
-	0x000606, 0x220007, 0x000464, 0x000464,
-	0x000606, 0x000007, 0x000134, 0x007F8D,
-	0x00093C, 0x281D12, 0x282512, 0x001F32,
-	0x0E0007, 0x00010D, 0x00037D, 0x000820,
-	0x018040, 0x05D2F4, 0x000007, 0x080007,
-	0x00037D, 0x018042, 0x08000A, 0x000904,
-	0x2E8A86, 0x000007, 0x000606, 0x000007,
-	0x000007, 0x000012, 0x100007, 0x320007,
-	0x600007, 0x460007, 0x100080, 0x48001A,
-	0x004904, 0x2EF186, 0x000007, 0x001210,
-	0x58003A, 0x000145, 0x5C5D04, 0x000007,
-	0x000080, 0x48001A, 0x004904, 0x2F4186,
-	0x000007, 0x001210, 0x50003A, 0x005904,
-	0x2F9886, 0x000045, 0x0000C5, 0x7FFFF5,
-	0x7FFF7D, 0x07D524, 0x004224, 0x500102,
-	0x200502, 0x000082, 0x40001A, 0x004104,
-	0x2FC986, 0x000007, 0x003865, 0x40001A,
-	0x004020, 0x00104D, 0x04C184, 0x31AB86,
-	0x000040, 0x040007, 0x000165, 0x000145,
-	0x004020, 0x000040, 0x000765, 0x080080,
-	0x40001A, 0x004104, 0x305986, 0x000007,
-	0x001210, 0x40003A, 0x004104, 0x30B286,
-	0x00004D, 0x0000CD, 0x004810, 0x20043A,
-	0x000882, 0x40001A, 0x004104, 0x30C186,
-	0x000007, 0x004820, 0x005904, 0x319886,
-	0x000040, 0x0007E5, 0x200480, 0x2816A0,
-	0x3216E0, 0x3A16E0, 0x4216E0, 0x021260,
-	0x000040, 0x000032, 0x400075, 0x00007D,
-	0x07D574, 0x200512, 0x000082, 0x40001A,
-	0x004104, 0x317186, 0x000007, 0x038A06,
-	0x640007, 0x0000E5, 0x000020, 0x000040,
-	0x000A65, 0x000020, 0x020040, 0x020040,
-	0x000040, 0x000165, 0x000042, 0x70000A,
-	0x007104, 0x323286, 0x000007, 0x060007,
-	0x019A06, 0x640007, 0x050000, 0x007020,
-	0x000040, 0x038A06, 0x640007, 0x000007,
-	0x00306D, 0x028860, 0x029060, 0x08000A,
-	0x028860, 0x008040, 0x100012, 0x00100D,
-	0x009184, 0x32D186, 0x000E0D, 0x009184,
-	0x33E186, 0x000007, 0x300007, 0x001020,
-	0x003B6D, 0x008040, 0x000080, 0x08001A,
-	0x000904, 0x32F186, 0x000007, 0x001220,
-	0x000DED, 0x008040, 0x008042, 0x10000A,
-	0x40000D, 0x109544, 0x000007, 0x001020,
-	0x000DED, 0x008040, 0x008042, 0x20040A,
-	0x000082, 0x08001A, 0x000904, 0x338186,
-	0x000007, 0x003B6D, 0x008042, 0x08000A,
-	0x000E15, 0x010984, 0x342B86, 0x600007,
-	0x08001A, 0x000C15, 0x010984, 0x341386,
-	0x000020, 0x1A0007, 0x0002ED, 0x008040,
-	0x620007, 0x00306D, 0x028042, 0x0A804A,
-	0x000820, 0x0A804A, 0x000606, 0x10804A,
-	0x000007, 0x282512, 0x001F32, 0x05D2F4,
-	0x54D104, 0x00735C, 0x000786, 0x000007,
-	0x0C0007, 0x0A0007, 0x1C0007, 0x003465,
-	0x020040, 0x004820, 0x025060, 0x40000A,
-	0x024060, 0x000040, 0x454944, 0x000007,
-	0x004020, 0x003AE5, 0x000040, 0x0028E5,
-	0x000042, 0x48000A, 0x004904, 0x39F886,
-	0x002C65, 0x000042, 0x40000A, 0x0000D5,
-	0x454104, 0x000007, 0x000655, 0x054504,
-	0x368286, 0x0001D5, 0x054504, 0x368086,
-	0x002B65, 0x000042, 0x003AE5, 0x50004A,
-	0x40000A, 0x45C3D4, 0x000007, 0x454504,
-	0x000007, 0x0000CD, 0x444944, 0x000007,
-	0x454504, 0x000007, 0x00014D, 0x554944,
-	0x000007, 0x045144, 0x367986, 0x002C65,
-	0x000042, 0x48000A, 0x4CD104, 0x000007,
-	0x04C144, 0x368386, 0x000007, 0x160007,
-	0x002CE5, 0x040042, 0x40000A, 0x004020,
-	0x000040, 0x002965, 0x000042, 0x40000A,
-	0x004104, 0x36F086, 0x000007, 0x002402,
-	0x383206, 0x005C02, 0x0025E5, 0x000042,
-	0x40000A, 0x004274, 0x002AE5, 0x000042,
-	0x40000A, 0x004274, 0x500112, 0x0029E5,
-	0x000042, 0x40000A, 0x004234, 0x454104,
-	0x000007, 0x004020, 0x000040, 0x003EE5,
-	0x000020, 0x000040, 0x002DE5, 0x400152,
-	0x50000A, 0x045144, 0x37DA86, 0x0000C5,
-	0x003EE5, 0x004020, 0x000040, 0x002BE5,
-	0x000042, 0x40000A, 0x404254, 0x000007,
-	0x002AE5, 0x004020, 0x000040, 0x500132,
-	0x040134, 0x005674, 0x0029E5, 0x020042,
-	0x42000A, 0x000042, 0x50000A, 0x05417C,
-	0x0028E5, 0x000042, 0x48000A, 0x0000C5,
-	0x4CC144, 0x38A086, 0x0026E5, 0x0027E5,
-	0x020042, 0x40004A, 0x50000A, 0x00423C,
-	0x00567C, 0x0028E5, 0x004820, 0x000040,
-	0x281D12, 0x282512, 0x001F72, 0x002965,
-	0x000042, 0x40000A, 0x004104, 0x393A86,
-	0x0E0007, 0x160007, 0x1E0007, 0x003EE5,
-	0x000042, 0x40000A, 0x004104, 0x397886,
-	0x002D65, 0x000042, 0x28340A, 0x003465,
-	0x020042, 0x42004A, 0x004020, 0x4A004A,
-	0x50004A, 0x05D2F4, 0x54D104, 0x00735C,
-	0x39E186, 0x000007, 0x000606, 0x080007,
-	0x0C0007, 0x080007, 0x0A0007, 0x0001E5,
-	0x020045, 0x004020, 0x000060, 0x000365,
-	0x000040, 0x002E65, 0x001A20, 0x0A1A60,
-	0x000040, 0x003465, 0x020042, 0x42004A,
-	0x004020, 0x4A004A, 0x000606, 0x50004A,
-	0x0017FD, 0x018042, 0x08000A, 0x000904,
-	0x225A86, 0x000007, 0x00107D, 0x018042,
-	0x0011FD, 0x33804A, 0x19804A, 0x20000A,
-	0x000095, 0x2A1144, 0x01A144, 0x3B9086,
-	0x00040D, 0x00B184, 0x3B9186, 0x0018FD,
-	0x018042, 0x0010FD, 0x09804A, 0x38000A,
-	0x000095, 0x010924, 0x003A64, 0x3B8186,
-	0x000007, 0x003904, 0x3B9286, 0x000007,
-	0x3B9A06, 0x00000D, 0x00008D, 0x000820,
-	0x00387D, 0x018040, 0x700002, 0x00117D,
-	0x018042, 0x00197D, 0x29804A, 0x30000A,
-	0x380002, 0x003124, 0x000424, 0x000424,
-	0x002A24, 0x280502, 0x00068D, 0x000810,
-	0x28143A, 0x00750D, 0x00B124, 0x002264,
-	0x3D0386, 0x284402, 0x000810, 0x280C3A,
-	0x0B800D, 0x000820, 0x0002FD, 0x018040,
-	0x200007, 0x00758D, 0x00B124, 0x100102,
-	0x012144, 0x3E4986, 0x001810, 0x10003A,
-	0x00387D, 0x018042, 0x08000A, 0x000904,
-	0x3E4886, 0x030000, 0x3E4A06, 0x0000BD,
-	0x00008D, 0x023164, 0x000A64, 0x280D02,
-	0x0B808D, 0x000820, 0x0002FD, 0x018040,
-	0x200007, 0x00387D, 0x018042, 0x08000A,
-	0x000904, 0x3E3286, 0x030000, 0x0002FD,
-	0x018042, 0x08000A, 0x000904, 0x3D8286,
-	0x000007, 0x002810, 0x28043A, 0x00750D,
-	0x030924, 0x002264, 0x280D02, 0x02316C,
-	0x28450A, 0x0B810D, 0x000820, 0x0002FD,
-	0x018040, 0x200007, 0x00008D, 0x000A24,
-	0x3E4A06, 0x100102, 0x001810, 0x10003A,
-	0x0000BD, 0x003810, 0x30043A, 0x00187D,
-	0x018042, 0x0018FD, 0x09804A, 0x20000A,
-	0x0000AD, 0x028924, 0x07212C, 0x001010,
-	0x300583, 0x300D8B, 0x3014BB, 0x301C83,
-	0x002083, 0x00137D, 0x038042, 0x33844A,
-	0x33ACCB, 0x33B4CB, 0x33BCCB, 0x33C4CB,
-	0x33CCCB, 0x33D4CB, 0x305C8B, 0x006083,
-	0x001E0D, 0x0005FD, 0x018042, 0x20000A,
-	0x020924, 0x00068D, 0x00A96C, 0x00009D,
-	0x0002FD, 0x018042, 0x08000A, 0x000904,
-	0x3F6A86, 0x000007, 0x280502, 0x280D0A,
-	0x284402, 0x001810, 0x28143A, 0x0C008D,
-	0x000820, 0x0002FD, 0x018040, 0x220007,
-	0x003904, 0x225886, 0x001E0D, 0x00057D,
-	0x018042, 0x20000A, 0x020924, 0x0000A5,
-	0x0002FD, 0x018042, 0x08000A, 0x000904,
-	0x402A86, 0x000007, 0x280502, 0x280C02,
-	0x002010, 0x28143A, 0x0C010D, 0x000820,
-	0x0002FD, 0x018040, 0x225A06, 0x220007,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000
-};
-
-#endif	//_HWMCODE_
-
-
--- diff/sound/oss/Hwmcode.h	2002-10-16 04:28:25.000000000 +0100
+++ source/sound/oss/Hwmcode.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,804 +0,0 @@
-//=============================================================================
-// Copyright (c) 1997	Yamaha Corporation.	All Rights Reserved.
-//
-//	Title:
-//		hwmcode.c
-//	Desc:
-//		micro-code for CTRL & DSP
-//	HISTORY:
-//		April 03, 1997:		1st try by M. Mukojima
-//=============================================================================
-#define	YDSXG_DSPLENGTH				0x0080
-#define	YDSXG_CTRLLENGTH			0x3000
-
-
-static unsigned long int	gdwDSPCode[YDSXG_DSPLENGTH >> 2] = {
-	0x00000081, 0x000001a4, 0x0000000a, 0x0000002f,
-	0x00080253, 0x01800317, 0x0000407b, 0x0000843f,
-	0x0001483c, 0x0001943c, 0x0005d83c, 0x00001c3c,
-	0x0000c07b, 0x00050c3f, 0x0121503c, 0x00000000,
-	0x00000000, 0x00000000, 0x00000000, 0x00000000,
-	0x00000000, 0x00000000, 0x00000000, 0x00000000,
-	0x00000000, 0x00000000, 0x00000000, 0x00000000,
-	0x00000000, 0x00000000, 0x00000000, 0x00000000
-};
-
-
-// --------------------------------------------
-//  DS-1E Controller InstructionRAM Code
-//	1999/06/21
-//	Buf441 slot is Enabled.
-// --------------------------------------------
-// 04/09?@creat
-// 04/12  stop nise fix
-// 06/21?@WorkingOff timming
-static unsigned long	gdwCtrl1eCode[YDSXG_CTRLLENGTH >> 2] = {
-	0x000007, 0x240007, 0x0C0007, 0x1C0007,
-	0x060007, 0x700002, 0x000020, 0x030040,
-	0x007104, 0x004286, 0x030040, 0x000F0D,
-	0x000810, 0x20043A, 0x000282, 0x00020D,
-	0x000810, 0x20043A, 0x001282, 0x200E82,
-	0x00800D, 0x000810, 0x20043A, 0x001A82,
-	0x03460D, 0x000810, 0x10043A, 0x02EC0D,
-	0x000810, 0x18043A, 0x00010D, 0x020015,
-	0x0000FD, 0x000020, 0x038860, 0x039060,
-	0x038060, 0x038040, 0x038040, 0x038040,
-	0x018040, 0x000A7D, 0x038040, 0x038040,
-	0x018040, 0x200402, 0x000882, 0x08001A,
-	0x000904, 0x017186, 0x000007, 0x260007,
-	0x400007, 0x000007, 0x03258D, 0x000810,
-	0x18043A, 0x260007, 0x284402, 0x00087D,
-	0x018042, 0x00160A, 0x05A206, 0x000007,
-	0x440007, 0x00230D, 0x000810, 0x08043A,
-	0x22FA06, 0x000007, 0x0007FD, 0x018042,
-	0x08000A, 0x000904, 0x02AB86, 0x000195,
-	0x090D04, 0x000007, 0x000820, 0x0000F5,
-	0x000B7D, 0x01F060, 0x0000FD, 0x033A06,
-	0x018040, 0x000A7D, 0x038042, 0x13804A,
-	0x18000A, 0x001820, 0x059060, 0x058860,
-	0x018040, 0x0000FD, 0x018042, 0x70000A,
-	0x000115, 0x071144, 0x033B86, 0x030000,
-	0x007020, 0x036206, 0x018040, 0x00360D,
-	0x000810, 0x08043A, 0x232206, 0x000007,
-	0x02EC0D, 0x000810, 0x18043A, 0x019A06,
-	0x000007, 0x240007, 0x000F8D, 0x000810,
-	0x00163A, 0x002402, 0x005C02, 0x0028FD,
-	0x000020, 0x018040, 0x08000D, 0x000815,
-	0x510984, 0x000007, 0x00004D, 0x000E5D,
-	0x000E02, 0x00430D, 0x000810, 0x08043A,
-	0x2E1206, 0x000007, 0x00008D, 0x000924,
-	0x000F02, 0x00470D, 0x000810, 0x08043A,
-	0x2E1206, 0x000007, 0x480480, 0x001210,
-	0x28043A, 0x00778D, 0x000810, 0x280C3A,
-	0x00068D, 0x000810, 0x28143A, 0x284402,
-	0x03258D, 0x000810, 0x18043A, 0x07FF8D,
-	0x000820, 0x0002FD, 0x018040, 0x260007,
-	0x200007, 0x0002FD, 0x018042, 0x08000A,
-	0x000904, 0x051286, 0x000007, 0x240007,
-	0x02EC0D, 0x000810, 0x18043A, 0x00387D,
-	0x018042, 0x08000A, 0x001015, 0x010984,
-	0x019B86, 0x000007, 0x01B206, 0x000007,
-	0x0008FD, 0x018042, 0x18000A, 0x001904,
-	0x22B886, 0x280007, 0x001810, 0x28043A,
-	0x280C02, 0x00000D, 0x000810, 0x28143A,
-	0x08808D, 0x000820, 0x0002FD, 0x018040,
-	0x200007, 0x00020D, 0x189904, 0x000007,
-	0x00402D, 0x0000BD, 0x0002FD, 0x018042,
-	0x08000A, 0x000904, 0x065A86, 0x000007,
-	0x000100, 0x000A20, 0x00047D, 0x018040,
-	0x018042, 0x20000A, 0x003015, 0x012144,
-	0x036186, 0x000007, 0x002104, 0x036186,
-	0x000007, 0x000F8D, 0x000810, 0x280C3A,
-	0x023944, 0x07C986, 0x000007, 0x001810,
-	0x28043A, 0x08810D, 0x000820, 0x0002FD,
-	0x018040, 0x200007, 0x002810, 0x78003A,
-	0x00788D, 0x000810, 0x08043A, 0x2A1206,
-	0x000007, 0x00400D, 0x001015, 0x189904,
-	0x292904, 0x393904, 0x000007, 0x070206,
-	0x000007, 0x0004F5, 0x00007D, 0x000020,
-	0x00008D, 0x010860, 0x018040, 0x00047D,
-	0x038042, 0x21804A, 0x18000A, 0x021944,
-	0x229086, 0x000007, 0x004075, 0x71F104,
-	0x000007, 0x010042, 0x28000A, 0x002904,
-	0x225886, 0x000007, 0x003C0D, 0x30A904,
-	0x000007, 0x00077D, 0x018042, 0x08000A,
-	0x000904, 0x08DA86, 0x00057D, 0x002820,
-	0x03B060, 0x08F206, 0x018040, 0x003020,
-	0x03A860, 0x018040, 0x0002FD, 0x018042,
-	0x08000A, 0x000904, 0x08FA86, 0x000007,
-	0x00057D, 0x018042, 0x28040A, 0x000E8D,
-	0x000810, 0x280C3A, 0x00000D, 0x000810,
-	0x28143A, 0x09000D, 0x000820, 0x0002FD,
-	0x018040, 0x200007, 0x003DFD, 0x000020,
-	0x018040, 0x00107D, 0x009D8D, 0x000810,
-	0x08043A, 0x2A1206, 0x000007, 0x000815,
-	0x08001A, 0x010984, 0x0A5186, 0x00137D,
-	0x200500, 0x280F20, 0x338F60, 0x3B8F60,
-	0x438F60, 0x4B8F60, 0x538F60, 0x5B8F60,
-	0x038A60, 0x018040, 0x00107D, 0x018042,
-	0x08000A, 0x000215, 0x010984, 0x3A8186,
-	0x000007, 0x007FBD, 0x383DC4, 0x000007,
-	0x001A7D, 0x001375, 0x018042, 0x09004A,
-	0x10000A, 0x0B8D04, 0x139504, 0x000007,
-	0x000820, 0x019060, 0x001104, 0x225886,
-	0x010040, 0x0017FD, 0x018042, 0x08000A,
-	0x000904, 0x225A86, 0x000007, 0x00197D,
-	0x038042, 0x09804A, 0x10000A, 0x000924,
-	0x001664, 0x0011FD, 0x038042, 0x2B804A,
-	0x19804A, 0x00008D, 0x218944, 0x000007,
-	0x002244, 0x0C1986, 0x000007, 0x001A64,
-	0x002A24, 0x00197D, 0x080102, 0x100122,
-	0x000820, 0x039060, 0x018040, 0x003DFD,
-	0x00008D, 0x000820, 0x018040, 0x001375,
-	0x001A7D, 0x010042, 0x09804A, 0x10000A,
-	0x00021D, 0x0189E4, 0x2992E4, 0x309144,
-	0x000007, 0x00060D, 0x000A15, 0x000C1D,
-	0x001025, 0x00A9E4, 0x012BE4, 0x000464,
-	0x01B3E4, 0x0232E4, 0x000464, 0x000464,
-	0x000464, 0x000464, 0x00040D, 0x08B1C4,
-	0x000007, 0x000820, 0x000BF5, 0x030040,
-	0x00197D, 0x038042, 0x09804A, 0x000A24,
-	0x08000A, 0x080E64, 0x000007, 0x100122,
-	0x000820, 0x031060, 0x010040, 0x0064AC,
-	0x00027D, 0x000020, 0x018040, 0x00107D,
-	0x018042, 0x0011FD, 0x3B804A, 0x09804A,
-	0x20000A, 0x000095, 0x1A1144, 0x00A144,
-	0x0E5886, 0x00040D, 0x00B984, 0x0E5986,
-	0x0018FD, 0x018042, 0x0010FD, 0x09804A,
-	0x28000A, 0x000095, 0x010924, 0x002A64,
-	0x0E4986, 0x000007, 0x002904, 0x0E5A86,
-	0x000007, 0x0E6206, 0x080002, 0x00008D,
-	0x00387D, 0x000820, 0x018040, 0x00127D,
-	0x018042, 0x10000A, 0x003904, 0x0F0986,
-	0x00080D, 0x7FFFB5, 0x00B984, 0x0ED986,
-	0x000025, 0x0FB206, 0x00002D, 0x000015,
-	0x00082D, 0x02E00D, 0x000820, 0x0FFA06,
-	0x00000D, 0x7F8035, 0x00B984, 0x0FA986,
-	0x400025, 0x00008D, 0x110944, 0x000007,
-	0x00018D, 0x109504, 0x000007, 0x009164,
-	0x000424, 0x000424, 0x000424, 0x100102,
-	0x280002, 0x02DF0D, 0x000820, 0x0FFA06,
-	0x00018D, 0x00042D, 0x00008D, 0x109504,
-	0x000007, 0x00020D, 0x109184, 0x000007,
-	0x02DF8D, 0x000820, 0x00008D, 0x0038FD,
-	0x018040, 0x003BFD, 0x001020, 0x03A860,
-	0x000815, 0x313184, 0x212184, 0x000007,
-	0x03B060, 0x03A060, 0x018040, 0x0022FD,
-	0x000095, 0x010924, 0x000424, 0x000424,
-	0x001264, 0x100102, 0x000820, 0x039060,
-	0x018040, 0x001924, 0x010F0D, 0x00397D,
-	0x000820, 0x058040, 0x038042, 0x09844A,
-	0x000606, 0x08040A, 0x000424, 0x000424,
-	0x00117D, 0x018042, 0x08000A, 0x000A24,
-	0x280502, 0x280C02, 0x09800D, 0x000820,
-	0x0002FD, 0x018040, 0x200007, 0x0022FD,
-	0x018042, 0x08000A, 0x000095, 0x280DC4,
-	0x011924, 0x00197D, 0x018042, 0x0011FD,
-	0x09804A, 0x10000A, 0x0000B5, 0x113144,
-	0x0A8D04, 0x000007, 0x080A44, 0x129504,
-	0x000007, 0x0023FD, 0x001020, 0x038040,
-	0x101244, 0x000007, 0x000820, 0x039060,
-	0x018040, 0x0002FD, 0x018042, 0x08000A,
-	0x000904, 0x123286, 0x000007, 0x003BFD,
-	0x000100, 0x000A10, 0x0B807A, 0x13804A,
-	0x090984, 0x000007, 0x000095, 0x013D04,
-	0x12B886, 0x10000A, 0x100002, 0x090984,
-	0x000007, 0x038042, 0x11804A, 0x090D04,
-	0x000007, 0x10000A, 0x090D84, 0x000007,
-	0x00257D, 0x000820, 0x018040, 0x00010D,
-	0x000810, 0x28143A, 0x00127D, 0x018042,
-	0x20000A, 0x00197D, 0x018042, 0x00117D,
-	0x31804A, 0x10000A, 0x003124, 0x013B8D,
-	0x00397D, 0x000820, 0x058040, 0x038042,
-	0x09844A, 0x000606, 0x08040A, 0x300102,
-	0x003124, 0x000424, 0x000424, 0x001224,
-	0x280502, 0x001A4C, 0x143986, 0x700002,
-	0x00002D, 0x030000, 0x00387D, 0x018042,
-	0x10000A, 0x146206, 0x002124, 0x0000AD,
-	0x100002, 0x00010D, 0x000924, 0x006B24,
-	0x014A0D, 0x00397D, 0x000820, 0x058040,
-	0x038042, 0x09844A, 0x000606, 0x08040A,
-	0x003264, 0x00008D, 0x000A24, 0x001020,
-	0x00227D, 0x018040, 0x014F8D, 0x000810,
-	0x08043A, 0x2B5A06, 0x000007, 0x002820,
-	0x00207D, 0x018040, 0x00117D, 0x038042,
-	0x13804A, 0x33800A, 0x00387D, 0x018042,
-	0x08000A, 0x000904, 0x177286, 0x000007,
-	0x00008D, 0x030964, 0x015B0D, 0x00397D,
-	0x000820, 0x058040, 0x038042, 0x09844A,
-	0x000606, 0x08040A, 0x380102, 0x000424,
-	0x000424, 0x001224, 0x0002FD, 0x018042,
-	0x08000A, 0x000904, 0x15DA86, 0x000007,
-	0x280502, 0x001A4C, 0x177186, 0x000007,
-	0x032164, 0x00632C, 0x003DFD, 0x018042,
-	0x08000A, 0x000095, 0x090904, 0x000007,
-	0x000820, 0x001A4C, 0x169986, 0x018040,
-	0x030000, 0x16B206, 0x002124, 0x00010D,
-	0x000924, 0x006B24, 0x016F0D, 0x00397D,
-	0x000820, 0x058040, 0x038042, 0x09844A,
-	0x000606, 0x08040A, 0x003A64, 0x000095,
-	0x001224, 0x0002FD, 0x018042, 0x08000A,
-	0x000904, 0x171286, 0x000007, 0x01760D,
-	0x000810, 0x08043A, 0x2B5A06, 0x000007,
-	0x160A06, 0x000007, 0x007020, 0x08010A,
-	0x10012A, 0x0020FD, 0x038860, 0x039060,
-	0x018040, 0x00227D, 0x018042, 0x003DFD,
-	0x08000A, 0x31844A, 0x000904, 0x181086,
-	0x18008B, 0x00008D, 0x189904, 0x00312C,
-	0x18E206, 0x000007, 0x00324C, 0x186B86,
-	0x000007, 0x001904, 0x186886, 0x000007,
-	0x000095, 0x199144, 0x00222C, 0x003124,
-	0x00636C, 0x000E3D, 0x001375, 0x000BFD,
-	0x010042, 0x09804A, 0x10000A, 0x038AEC,
-	0x0393EC, 0x00224C, 0x18E186, 0x000007,
-	0x00008D, 0x189904, 0x00226C, 0x00322C,
-	0x30050A, 0x301DAB, 0x002083, 0x0018FD,
-	0x018042, 0x08000A, 0x018924, 0x300502,
-	0x001083, 0x001875, 0x010042, 0x10000A,
-	0x00008D, 0x010924, 0x001375, 0x330542,
-	0x330CCB, 0x332CCB, 0x3334CB, 0x333CCB,
-	0x3344CB, 0x334CCB, 0x3354CB, 0x305C8B,
-	0x006083, 0x0002F5, 0x010042, 0x08000A,
-	0x000904, 0x19B286, 0x000007, 0x001E2D,
-	0x0005FD, 0x018042, 0x08000A, 0x028924,
-	0x280502, 0x00060D, 0x000810, 0x280C3A,
-	0x00008D, 0x000810, 0x28143A, 0x0A808D,
-	0x000820, 0x0002F5, 0x010040, 0x220007,
-	0x001275, 0x030042, 0x21004A, 0x00008D,
-	0x1A0944, 0x000007, 0x01AB8D, 0x000810,
-	0x08043A, 0x2CAA06, 0x000007, 0x0001F5,
-	0x030042, 0x0D004A, 0x10000A, 0x089144,
-	0x000007, 0x000820, 0x010040, 0x0025F5,
-	0x0A3144, 0x000007, 0x000820, 0x032860,
-	0x030040, 0x00217D, 0x038042, 0x0B804A,
-	0x10000A, 0x000820, 0x031060, 0x030040,
-	0x00008D, 0x000124, 0x00012C, 0x000E64,
-	0x001A64, 0x00636C, 0x08010A, 0x10012A,
-	0x000820, 0x031060, 0x030040, 0x0020FD,
-	0x018042, 0x08000A, 0x00227D, 0x018042,
-	0x10000A, 0x000820, 0x031060, 0x030040,
-	0x00197D, 0x018042, 0x08000A, 0x0022FD,
-	0x038042, 0x10000A, 0x000820, 0x031060,
-	0x030040, 0x090D04, 0x000007, 0x000820,
-	0x030040, 0x038042, 0x0B804A, 0x10000A,
-	0x000820, 0x031060, 0x030040, 0x038042,
-	0x13804A, 0x19804A, 0x110D04, 0x198D04,
-	0x000007, 0x08000A, 0x001020, 0x031860,
-	0x030860, 0x030040, 0x00008D, 0x0B0944,
-	0x000007, 0x000820, 0x010040, 0x0005F5,
-	0x030042, 0x08000A, 0x000820, 0x010040,
-	0x0000F5, 0x010042, 0x08000A, 0x000904,
-	0x1D9886, 0x001E75, 0x030042, 0x01044A,
-	0x000C0A, 0x1DAA06, 0x000007, 0x000402,
-	0x000C02, 0x00177D, 0x001AF5, 0x018042,
-	0x03144A, 0x031C4A, 0x03244A, 0x032C4A,
-	0x03344A, 0x033C4A, 0x03444A, 0x004C0A,
-	0x00043D, 0x0013F5, 0x001AFD, 0x030042,
-	0x0B004A, 0x1B804A, 0x13804A, 0x20000A,
-	0x089144, 0x19A144, 0x0389E4, 0x0399EC,
-	0x005502, 0x005D0A, 0x030042, 0x0B004A,
-	0x1B804A, 0x13804A, 0x20000A, 0x089144,
-	0x19A144, 0x0389E4, 0x0399EC, 0x006502,
-	0x006D0A, 0x030042, 0x0B004A, 0x19004A,
-	0x2B804A, 0x13804A, 0x21804A, 0x30000A,
-	0x089144, 0x19A144, 0x2AB144, 0x0389E4,
-	0x0399EC, 0x007502, 0x007D0A, 0x03A9E4,
-	0x000702, 0x00107D, 0x000415, 0x018042,
-	0x08000A, 0x0109E4, 0x000F02, 0x002AF5,
-	0x0019FD, 0x010042, 0x09804A, 0x10000A,
-	0x000934, 0x001674, 0x0029F5, 0x010042,
-	0x10000A, 0x00917C, 0x002075, 0x010042,
-	0x08000A, 0x000904, 0x200A86, 0x0026F5,
-	0x0027F5, 0x030042, 0x09004A, 0x10000A,
-	0x000A3C, 0x00167C, 0x001A75, 0x000BFD,
-	0x010042, 0x51804A, 0x48000A, 0x160007,
-	0x001075, 0x010042, 0x282C0A, 0x281D12,
-	0x282512, 0x001F32, 0x1E0007, 0x0E0007,
-	0x001975, 0x010042, 0x002DF5, 0x0D004A,
-	0x10000A, 0x009144, 0x20EA86, 0x010042,
-	0x28340A, 0x000E5D, 0x00008D, 0x000375,
-	0x000820, 0x010040, 0x05D2F4, 0x54D104,
-	0x00735C, 0x218B86, 0x000007, 0x0C0007,
-	0x080007, 0x0A0007, 0x02178D, 0x000810,
-	0x08043A, 0x34B206, 0x000007, 0x219206,
-	0x000007, 0x080007, 0x002275, 0x010042,
-	0x20000A, 0x002104, 0x225886, 0x001E2D,
-	0x0002F5, 0x010042, 0x08000A, 0x000904,
-	0x21CA86, 0x000007, 0x002010, 0x30043A,
-	0x00057D, 0x0180C3, 0x08000A, 0x028924,
-	0x280502, 0x280C02, 0x0A810D, 0x000820,
-	0x0002F5, 0x010040, 0x220007, 0x0004FD,
-	0x018042, 0x70000A, 0x030000, 0x007020,
-	0x07FA06, 0x018040, 0x022B8D, 0x000810,
-	0x08043A, 0x2CAA06, 0x000007, 0x0002FD,
-	0x018042, 0x08000A, 0x000904, 0x22C286,
-	0x000007, 0x020206, 0x000007, 0x000875,
-	0x0009FD, 0x00010D, 0x234206, 0x000295,
-	0x000B75, 0x00097D, 0x00000D, 0x000515,
-	0x010042, 0x18000A, 0x001904, 0x2A0086,
-	0x0006F5, 0x001020, 0x010040, 0x0004F5,
-	0x000820, 0x010040, 0x000775, 0x010042,
-	0x09804A, 0x10000A, 0x001124, 0x000904,
-	0x23F286, 0x000815, 0x080102, 0x101204,
-	0x241206, 0x000575, 0x081204, 0x000007,
-	0x100102, 0x000575, 0x000425, 0x021124,
-	0x100102, 0x000820, 0x031060, 0x010040,
-	0x001924, 0x2A0086, 0x00008D, 0x000464,
-	0x009D04, 0x291086, 0x180102, 0x000575,
-	0x010042, 0x28040A, 0x00018D, 0x000924,
-	0x280D02, 0x00000D, 0x000924, 0x281502,
-	0x10000D, 0x000820, 0x0002F5, 0x010040,
-	0x200007, 0x001175, 0x0002FD, 0x018042,
-	0x08000A, 0x000904, 0x24FA86, 0x000007,
-	0x000100, 0x080B20, 0x130B60, 0x1B0B60,
-	0x030A60, 0x010040, 0x050042, 0x3D004A,
-	0x35004A, 0x2D004A, 0x20000A, 0x0006F5,
-	0x010042, 0x28140A, 0x0004F5, 0x010042,
-	0x08000A, 0x000315, 0x010D04, 0x260286,
-	0x004015, 0x000095, 0x010D04, 0x25F086,
-	0x100022, 0x10002A, 0x261A06, 0x000007,
-	0x333104, 0x2AA904, 0x000007, 0x032124,
-	0x280502, 0x284402, 0x001124, 0x400102,
-	0x000424, 0x000424, 0x003224, 0x00292C,
-	0x00636C, 0x277386, 0x000007, 0x02B164,
-	0x000464, 0x000464, 0x00008D, 0x000A64,
-	0x280D02, 0x10008D, 0x000820, 0x0002F5,
-	0x010040, 0x220007, 0x00008D, 0x38B904,
-	0x000007, 0x03296C, 0x30010A, 0x0002F5,
-	0x010042, 0x08000A, 0x000904, 0x270286,
-	0x000007, 0x00212C, 0x28050A, 0x00316C,
-	0x00046C, 0x00046C, 0x28450A, 0x001124,
-	0x006B64, 0x100102, 0x00008D, 0x01096C,
-	0x280D0A, 0x10010D, 0x000820, 0x0002F5,
-	0x010040, 0x220007, 0x004124, 0x000424,
-	0x000424, 0x003224, 0x300102, 0x032944,
-	0x27FA86, 0x000007, 0x300002, 0x0004F5,
-	0x010042, 0x08000A, 0x000315, 0x010D04,
-	0x284086, 0x003124, 0x000464, 0x300102,
-	0x0002F5, 0x010042, 0x08000A, 0x000904,
-	0x284A86, 0x000007, 0x284402, 0x003124,
-	0x300502, 0x003924, 0x300583, 0x000883,
-	0x0005F5, 0x010042, 0x28040A, 0x00008D,
-	0x008124, 0x280D02, 0x00008D, 0x008124,
-	0x281502, 0x10018D, 0x000820, 0x0002F5,
-	0x010040, 0x220007, 0x001025, 0x000575,
-	0x030042, 0x09004A, 0x10000A, 0x0A0904,
-	0x121104, 0x000007, 0x001020, 0x050860,
-	0x050040, 0x0006FD, 0x018042, 0x09004A,
-	0x10000A, 0x0000A5, 0x0A0904, 0x121104,
-	0x000007, 0x000820, 0x019060, 0x010040,
-	0x0002F5, 0x010042, 0x08000A, 0x000904,
-	0x29CA86, 0x000007, 0x244206, 0x000007,
-	0x000606, 0x000007, 0x0002F5, 0x010042,
-	0x08000A, 0x000904, 0x2A1A86, 0x000007,
-	0x000100, 0x080B20, 0x138B60, 0x1B8B60,
-	0x238B60, 0x2B8B60, 0x338B60, 0x3B8B60,
-	0x438B60, 0x4B8B60, 0x538B60, 0x5B8B60,
-	0x638B60, 0x6B8B60, 0x738B60, 0x7B8B60,
-	0x038F60, 0x0B8F60, 0x138F60, 0x1B8F60,
-	0x238F60, 0x2B8F60, 0x338F60, 0x3B8F60,
-	0x438F60, 0x4B8F60, 0x538F60, 0x5B8F60,
-	0x638F60, 0x6B8F60, 0x738F60, 0x7B8F60,
-	0x038A60, 0x000606, 0x018040, 0x00008D,
-	0x000A64, 0x280D02, 0x000A24, 0x00027D,
-	0x018042, 0x10000A, 0x001224, 0x0003FD,
-	0x018042, 0x08000A, 0x000904, 0x2C0A86,
-	0x000007, 0x00018D, 0x000A24, 0x000464,
-	0x000464, 0x080102, 0x000924, 0x000424,
-	0x000424, 0x100102, 0x02000D, 0x009144,
-	0x2C6186, 0x000007, 0x0001FD, 0x018042,
-	0x08000A, 0x000A44, 0x2C4386, 0x018042,
-	0x0A000D, 0x000820, 0x0002FD, 0x018040,
-	0x200007, 0x00027D, 0x001020, 0x000606,
-	0x018040, 0x0002F5, 0x010042, 0x08000A,
-	0x000904, 0x2CB286, 0x000007, 0x00037D,
-	0x018042, 0x08000A, 0x000904, 0x2CE286,
-	0x000007, 0x000075, 0x002E7D, 0x010042,
-	0x0B804A, 0x000020, 0x000904, 0x000686,
-	0x010040, 0x31844A, 0x30048B, 0x000883,
-	0x00008D, 0x000810, 0x28143A, 0x00008D,
-	0x000810, 0x280C3A, 0x000675, 0x010042,
-	0x08000A, 0x003815, 0x010924, 0x280502,
-	0x0B000D, 0x000820, 0x0002F5, 0x010040,
-	0x000606, 0x220007, 0x000464, 0x000464,
-	0x000606, 0x000007, 0x000134, 0x007F8D,
-	0x00093C, 0x281D12, 0x282512, 0x001F32,
-	0x0E0007, 0x00010D, 0x00037D, 0x000820,
-	0x018040, 0x05D2F4, 0x000007, 0x080007,
-	0x00037D, 0x018042, 0x08000A, 0x000904,
-	0x2E8A86, 0x000007, 0x000606, 0x000007,
-	0x000007, 0x000012, 0x100007, 0x320007,
-	0x600007, 0x460007, 0x100080, 0x48001A,
-	0x004904, 0x2EF186, 0x000007, 0x001210,
-	0x58003A, 0x000145, 0x5C5D04, 0x000007,
-	0x000080, 0x48001A, 0x004904, 0x2F4186,
-	0x000007, 0x001210, 0x50003A, 0x005904,
-	0x2F9886, 0x000045, 0x0000C5, 0x7FFFF5,
-	0x7FFF7D, 0x07D524, 0x004224, 0x500102,
-	0x200502, 0x000082, 0x40001A, 0x004104,
-	0x2FC986, 0x000007, 0x003865, 0x40001A,
-	0x004020, 0x00104D, 0x04C184, 0x31AB86,
-	0x000040, 0x040007, 0x000165, 0x000145,
-	0x004020, 0x000040, 0x000765, 0x080080,
-	0x40001A, 0x004104, 0x305986, 0x000007,
-	0x001210, 0x40003A, 0x004104, 0x30B286,
-	0x00004D, 0x0000CD, 0x004810, 0x20043A,
-	0x000882, 0x40001A, 0x004104, 0x30C186,
-	0x000007, 0x004820, 0x005904, 0x319886,
-	0x000040, 0x0007E5, 0x200480, 0x2816A0,
-	0x3216E0, 0x3A16E0, 0x4216E0, 0x021260,
-	0x000040, 0x000032, 0x400075, 0x00007D,
-	0x07D574, 0x200512, 0x000082, 0x40001A,
-	0x004104, 0x317186, 0x000007, 0x038A06,
-	0x640007, 0x0000E5, 0x000020, 0x000040,
-	0x000A65, 0x000020, 0x020040, 0x020040,
-	0x000040, 0x000165, 0x000042, 0x70000A,
-	0x007104, 0x323286, 0x000007, 0x060007,
-	0x019A06, 0x640007, 0x050000, 0x007020,
-	0x000040, 0x038A06, 0x640007, 0x000007,
-	0x00306D, 0x028860, 0x029060, 0x08000A,
-	0x028860, 0x008040, 0x100012, 0x00100D,
-	0x009184, 0x32D186, 0x000E0D, 0x009184,
-	0x33E186, 0x000007, 0x300007, 0x001020,
-	0x003B6D, 0x008040, 0x000080, 0x08001A,
-	0x000904, 0x32F186, 0x000007, 0x001220,
-	0x000DED, 0x008040, 0x008042, 0x10000A,
-	0x40000D, 0x109544, 0x000007, 0x001020,
-	0x000DED, 0x008040, 0x008042, 0x20040A,
-	0x000082, 0x08001A, 0x000904, 0x338186,
-	0x000007, 0x003B6D, 0x008042, 0x08000A,
-	0x000E15, 0x010984, 0x342B86, 0x600007,
-	0x08001A, 0x000C15, 0x010984, 0x341386,
-	0x000020, 0x1A0007, 0x0002ED, 0x008040,
-	0x620007, 0x00306D, 0x028042, 0x0A804A,
-	0x000820, 0x0A804A, 0x000606, 0x10804A,
-	0x000007, 0x282512, 0x001F32, 0x05D2F4,
-	0x54D104, 0x00735C, 0x000786, 0x000007,
-	0x0C0007, 0x0A0007, 0x1C0007, 0x003465,
-	0x020040, 0x004820, 0x025060, 0x40000A,
-	0x024060, 0x000040, 0x454944, 0x000007,
-	0x004020, 0x003AE5, 0x000040, 0x0028E5,
-	0x000042, 0x48000A, 0x004904, 0x39F886,
-	0x002C65, 0x000042, 0x40000A, 0x0000D5,
-	0x454104, 0x000007, 0x000655, 0x054504,
-	0x368286, 0x0001D5, 0x054504, 0x368086,
-	0x002B65, 0x000042, 0x003AE5, 0x50004A,
-	0x40000A, 0x45C3D4, 0x000007, 0x454504,
-	0x000007, 0x0000CD, 0x444944, 0x000007,
-	0x454504, 0x000007, 0x00014D, 0x554944,
-	0x000007, 0x045144, 0x367986, 0x002C65,
-	0x000042, 0x48000A, 0x4CD104, 0x000007,
-	0x04C144, 0x368386, 0x000007, 0x160007,
-	0x002CE5, 0x040042, 0x40000A, 0x004020,
-	0x000040, 0x002965, 0x000042, 0x40000A,
-	0x004104, 0x36F086, 0x000007, 0x002402,
-	0x383206, 0x005C02, 0x0025E5, 0x000042,
-	0x40000A, 0x004274, 0x002AE5, 0x000042,
-	0x40000A, 0x004274, 0x500112, 0x0029E5,
-	0x000042, 0x40000A, 0x004234, 0x454104,
-	0x000007, 0x004020, 0x000040, 0x003EE5,
-	0x000020, 0x000040, 0x002DE5, 0x400152,
-	0x50000A, 0x045144, 0x37DA86, 0x0000C5,
-	0x003EE5, 0x004020, 0x000040, 0x002BE5,
-	0x000042, 0x40000A, 0x404254, 0x000007,
-	0x002AE5, 0x004020, 0x000040, 0x500132,
-	0x040134, 0x005674, 0x0029E5, 0x020042,
-	0x42000A, 0x000042, 0x50000A, 0x05417C,
-	0x0028E5, 0x000042, 0x48000A, 0x0000C5,
-	0x4CC144, 0x38A086, 0x0026E5, 0x0027E5,
-	0x020042, 0x40004A, 0x50000A, 0x00423C,
-	0x00567C, 0x0028E5, 0x004820, 0x000040,
-	0x281D12, 0x282512, 0x001F72, 0x002965,
-	0x000042, 0x40000A, 0x004104, 0x393A86,
-	0x0E0007, 0x160007, 0x1E0007, 0x003EE5,
-	0x000042, 0x40000A, 0x004104, 0x397886,
-	0x002D65, 0x000042, 0x28340A, 0x003465,
-	0x020042, 0x42004A, 0x004020, 0x4A004A,
-	0x50004A, 0x05D2F4, 0x54D104, 0x00735C,
-	0x39E186, 0x000007, 0x000606, 0x080007,
-	0x0C0007, 0x080007, 0x0A0007, 0x0001E5,
-	0x020045, 0x004020, 0x000060, 0x000365,
-	0x000040, 0x002E65, 0x001A20, 0x0A1A60,
-	0x000040, 0x003465, 0x020042, 0x42004A,
-	0x004020, 0x4A004A, 0x000606, 0x50004A,
-	0x0017FD, 0x018042, 0x08000A, 0x000904,
-	0x225A86, 0x000007, 0x00107D, 0x018042,
-	0x0011FD, 0x33804A, 0x19804A, 0x20000A,
-	0x000095, 0x2A1144, 0x01A144, 0x3B9086,
-	0x00040D, 0x00B184, 0x3B9186, 0x0018FD,
-	0x018042, 0x0010FD, 0x09804A, 0x38000A,
-	0x000095, 0x010924, 0x003A64, 0x3B8186,
-	0x000007, 0x003904, 0x3B9286, 0x000007,
-	0x3B9A06, 0x00000D, 0x00008D, 0x000820,
-	0x00387D, 0x018040, 0x700002, 0x00117D,
-	0x018042, 0x00197D, 0x29804A, 0x30000A,
-	0x380002, 0x003124, 0x000424, 0x000424,
-	0x002A24, 0x280502, 0x00068D, 0x000810,
-	0x28143A, 0x00750D, 0x00B124, 0x002264,
-	0x3D0386, 0x284402, 0x000810, 0x280C3A,
-	0x0B800D, 0x000820, 0x0002FD, 0x018040,
-	0x200007, 0x00758D, 0x00B124, 0x100102,
-	0x012144, 0x3E4986, 0x001810, 0x10003A,
-	0x00387D, 0x018042, 0x08000A, 0x000904,
-	0x3E4886, 0x030000, 0x3E4A06, 0x0000BD,
-	0x00008D, 0x023164, 0x000A64, 0x280D02,
-	0x0B808D, 0x000820, 0x0002FD, 0x018040,
-	0x200007, 0x00387D, 0x018042, 0x08000A,
-	0x000904, 0x3E3286, 0x030000, 0x0002FD,
-	0x018042, 0x08000A, 0x000904, 0x3D8286,
-	0x000007, 0x002810, 0x28043A, 0x00750D,
-	0x030924, 0x002264, 0x280D02, 0x02316C,
-	0x28450A, 0x0B810D, 0x000820, 0x0002FD,
-	0x018040, 0x200007, 0x00008D, 0x000A24,
-	0x3E4A06, 0x100102, 0x001810, 0x10003A,
-	0x0000BD, 0x003810, 0x30043A, 0x00187D,
-	0x018042, 0x0018FD, 0x09804A, 0x20000A,
-	0x0000AD, 0x028924, 0x07212C, 0x001010,
-	0x300583, 0x300D8B, 0x3014BB, 0x301C83,
-	0x002083, 0x00137D, 0x038042, 0x33844A,
-	0x33ACCB, 0x33B4CB, 0x33BCCB, 0x33C4CB,
-	0x33CCCB, 0x33D4CB, 0x305C8B, 0x006083,
-	0x001E0D, 0x0005FD, 0x018042, 0x20000A,
-	0x020924, 0x00068D, 0x00A96C, 0x00009D,
-	0x0002FD, 0x018042, 0x08000A, 0x000904,
-	0x3F6A86, 0x000007, 0x280502, 0x280D0A,
-	0x284402, 0x001810, 0x28143A, 0x0C008D,
-	0x000820, 0x0002FD, 0x018040, 0x220007,
-	0x003904, 0x225886, 0x001E0D, 0x00057D,
-	0x018042, 0x20000A, 0x020924, 0x0000A5,
-	0x0002FD, 0x018042, 0x08000A, 0x000904,
-	0x402A86, 0x000007, 0x280502, 0x280C02,
-	0x002010, 0x28143A, 0x0C010D, 0x000820,
-	0x0002FD, 0x018040, 0x225A06, 0x220007,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000,
-	0x000000, 0x000000, 0x000000, 0x000000
-};
